private async Task <IJavaScriptCompilation> CompileAndTraceAsync(LogTargets logTargets, bool throwOnCompilationError = true, bool suppressCompilationSummary = true)
        {
            try
            {
                IJavaScriptCompilation compilation = await _compilationService.GetFunctionCompilationAsync(Metadata);

                if (compilation.SupportsDiagnostics)
                {
                    ImmutableArray <Diagnostic> diagnostics = compilation.GetDiagnostics();
                    TraceCompilationDiagnostics(diagnostics, logTargets);

                    if (!suppressCompilationSummary)
                    {
                        bool compilationSucceeded = !diagnostics.Any(d => d.Severity == DiagnosticSeverity.Error);

                        TraceOnPrimaryHost(string.Format(CultureInfo.InvariantCulture, "Compilation {0}.", compilationSucceeded ? "succeeded" : "failed"), TraceLevel.Info);
                    }
                }

                return(compilation);
            }
            catch (CompilationErrorException ex)
            {
                TraceOnPrimaryHost("Function compilation error", TraceLevel.Error);
                TraceCompilationDiagnostics(ex.Diagnostics, logTargets);

                if (throwOnCompilationError)
                {
                    throw;
                }
            }

            return(null);
        }
Example #2
0
        public async Task GetCompilationResultAsync_WithPositivePredicate_ExecutesServiceCompilation()
        {
            var settingsManager             = new ScriptSettingsManager();
            var innerCompilationServiceMock = new Mock <ICompilationService <IJavaScriptCompilation> >();

            innerCompilationServiceMock.Setup(m => m.GetFunctionCompilationAsync(It.IsAny <FunctionMetadata>()))
            .ReturnsAsync(new TestJavaScriptCompilation("test", ImmutableArray <Diagnostic> .Empty));

            var compilationService = new ConditionalJavaScriptCompilationService(settingsManager, innerCompilationServiceMock.Object, () => true);
            var functionMetadata   = new FunctionMetadata
            {
                Name       = "testfunction",
                ScriptFile = "test.ts"
            };

            IJavaScriptCompilation compilation = await compilationService.GetFunctionCompilationAsync(functionMetadata);

            Assert.NotNull(compilation);

            string result = await compilation.EmitAsync(CancellationToken.None);

            Assert.Equal("test", result);

            innerCompilationServiceMock.Verify();
        }
        private async Task <ScriptFunc> CreateFunctionTarget(CancellationToken cancellationToken)
        {
            string eventName = string.Format(MetricEventNames.FunctionCompileLatencyByLanguageFormat, _compilationService.Language);

            using (_metricsLogger.LatencyEvent(eventName))
            {
                IJavaScriptCompilation compilation = await CompileAndTraceAsync(LogTargets.System, suppressCompilationSummary : true);

                string functionScriptPath = compilation.Emit(cancellationToken);
                string script             = string.Format(CultureInfo.InvariantCulture, _functionTemplate, functionScriptPath.Replace('\\', '/'));

                return(Edge.Func(script));
            }
        }
        private async Task ReloadScriptAsync()
        {
            // one of the script files for this function changed
            // force a reload on next execution
            _functionLoader.Reset();
            _scriptFunc = null;

            TraceOnPrimaryHost(string.Format(CultureInfo.InvariantCulture, "Script for function '{0}' changed. Reloading.", Metadata.Name), TraceLevel.Info);

            IJavaScriptCompilation compilation = await CompileAndTraceAsync(LogTargets.User, throwOnCompilationError : false);

            if (compilation.SupportsDiagnostics)
            {
                bool compilationSucceeded = !compilation.GetDiagnostics().Any(d => d.Severity == DiagnosticSeverity.Error);
                TraceOnPrimaryHost(string.Format(CultureInfo.InvariantCulture, "Compilation {0}.", compilationSucceeded ? "succeeded" : "failed"), TraceLevel.Info);
            }
        }