private async Task PersistCompilationResult(FunctionMetadata metadata, string emitResult, ImmutableArray <Diagnostic> immutableArray) { var state = (emitResult != null && !immutableArray.Any(d => d.Severity == DiagnosticSeverity.Error)) ? JavaScriptCompilation.CompilationState.Succeeded : JavaScriptCompilation.CompilationState.Failed; var compilationResult = new JavaScriptCompilation() { State = state, EmitResult = emitResult, Diagnostics = new List <Diagnostic>(immutableArray) }; string sentinelFilePath = GetSentinelFilePath(metadata.Name); FileUtility.EnsureDirectoryExists(Path.GetDirectoryName(sentinelFilePath)); await FileUtility.WriteAsync(sentinelFilePath, JsonConvert.SerializeObject(compilationResult)); }
private async Task <IJavaScriptCompilation> GetCompilationResultAsync(FunctionMetadata functionMetadata) { DateTime compilationStarted = DateTime.UtcNow; string sentinelFilePath = GetSentinelFilePath(functionMetadata.Name); int iterationInterval = 500; int maxDuration = 30000; int iterationCount = maxDuration / iterationInterval; for (int i = 0; i < iterationCount; i++) { if (File.Exists(sentinelFilePath) && File.GetLastWriteTimeUtc(sentinelFilePath) > compilationStarted) { string json = await FileUtility.ReadAsync(sentinelFilePath); try { JavaScriptCompilation result = JsonConvert.DeserializeObject <JavaScriptCompilation>(json); if (result.State == JavaScriptCompilation.CompilationState.Failed) { throw new CompilationErrorException("Compilation failed", result.Diagnostics.ToImmutableArray()); } else if (result.State == JavaScriptCompilation.CompilationState.Succeeded) { return(result); } } catch (JsonSerializationException) { // Continue and wait on timeout } } await Task.Delay(500); } throw new CompilationErrorException("Compilation timed out.", ImmutableArray <Diagnostic> .Empty); }