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);
        }