BuildConfigurationZipArchive( string frontendWebElmMakeCommandAppendix) { var currentDirectory = Environment.CurrentDirectory; Console.WriteLine("The currentDirectory is '" + currentDirectory + "'."); var elmAppFilesBeforeLowering = ElmApp.ToFlatDictionaryWithPathComparer( ElmApp.FilesFilteredForElmApp( Filesystem.GetAllFilesFromDirectory(Path.Combine(currentDirectory, ElmAppSubdirectoryName))) .Select(filePathAndContent => ((IImmutableList <string>)filePathAndContent.filePath.Split(new[] { '/', '\\' }).ToImmutableList(), filePathAndContent.fileContent))); Console.WriteLine("I found " + elmAppFilesBeforeLowering.Count + " files to build the Elm app."); var elmAppContainsFrontend = elmAppFilesBeforeLowering.ContainsKey(FrontendElmAppRootFilePath); Console.WriteLine("This Elm app contains " + (elmAppContainsFrontend ? "a" : "no") + " frontend at '" + string.Join("/", FrontendElmAppRootFilePath) + "'."); var loweredElmAppFiles = ElmApp.AsCompletelyLoweredElmApp( elmAppFilesBeforeLowering, ElmAppInterfaceConfig.Default); byte[] frontendWebFile = null; if (elmAppContainsFrontend) { var frontendWebHtml = ProcessFromElm019Code.CompileElmToHtml( loweredElmAppFiles, FrontendElmAppRootFilePath, frontendWebElmMakeCommandAppendix); frontendWebFile = Encoding.UTF8.GetBytes(frontendWebHtml); } WebAppConfigurationJsonStructure jsonStructure = null; var jsonFileSearchPath = Path.Combine(currentDirectory, "elm-fullstack.json"); if (File.Exists(jsonFileSearchPath)) { Console.WriteLine("I found a file at '" + jsonFileSearchPath + "'. I use this to build the configuration."); var jsonFile = File.ReadAllBytes(jsonFileSearchPath); jsonStructure = JsonConvert.DeserializeObject <WebAppConfigurationJsonStructure>(Encoding.UTF8.GetString(jsonFile)); } else { Console.WriteLine("I did not find a file at '" + jsonFileSearchPath + "'. I build the configuration without the 'elm-fullstack.json'."); } var staticFiles = frontendWebFile == null? Array.Empty <(IImmutableList <string> name, IImmutableList <byte> content)>() : new[] { (name : (IImmutableList <string>)ImmutableList.Create(FrontendWebStaticFileName), (IImmutableList <byte>)frontendWebFile.ToImmutableList()) };
static public JavaScriptEngineSwitcher.Core.IJsEngine PrepareJsEngineToEvaluateElm() { var parseElmAppCodeFiles = ParseElmSyntaxAppCodeFiles(); var javascriptFromElmMake = ProcessFromElm019Code.CompileElmToJavascript( parseElmAppCodeFiles, ImmutableList.Create("src", "Main.elm")); var javascriptMinusCrashes = ProcessFromElm019Code.JavascriptMinusCrashes(javascriptFromElmMake); var listFunctionToPublish = new[]
/* * Get the value from `tests` in the Elm module `Main`. */ static string?GetTestsValueFromModuleMain( IImmutableDictionary <IImmutableList <string>, IReadOnlyList <byte> > elmAppFiles) { var javascriptFromElmMake = ProcessFromElm019Code.CompileElmToJavascript( elmAppFiles, ImmutableList.Create("src", "Main.elm")); var javascriptEngine = new V8JsEngine( new V8Settings { } ); var javascriptPreparedToRun = ProcessFromElm019Code.PublishFunctionsFromJavascriptFromElmMake( ProcessFromElm019Code.JavascriptMinusCrashes(javascriptFromElmMake), new[]
public PersistentProcessWithHistoryOnFileFromElm019Code( IProcessStoreReader storeReader, IImmutableDictionary <IImmutableList <string>, IImmutableList <byte> > elmAppFiles, Action <string> logger, ElmAppInterfaceConfig?overrideElmAppInterfaceConfig = null) { (process, (JavascriptFromElmMake, JavascriptPreparedToRun)) = ProcessFromElm019Code.ProcessFromElmCodeFiles(elmAppFiles, overrideElmAppInterfaceConfig); var restoreStopwatch = System.Diagnostics.Stopwatch.StartNew(); logger?.Invoke("Begin to restore the process state using the storeReader."); var emptyInitHash = CompositionRecordInFile.HashFromSerialRepresentation(new byte[0]); string dictKeyForHash(byte[] hash) => Convert.ToBase64String(hash); var compositionRecords = new Dictionary <string, (byte[] compositionRecordHash, CompositionRecord compositionRecord)>(); var compositionChain = new Stack <(byte[] hash, CompositionRecord composition)>(); foreach (var serializedCompositionRecord in storeReader.EnumerateSerializedCompositionsRecordsReverse()) { { var compositionRecordFromFile = JsonConvert.DeserializeObject <CompositionRecordInFile>( System.Text.Encoding.UTF8.GetString(serializedCompositionRecord)); var compositionRecordHash = CompositionRecordInFile.HashFromSerialRepresentation(serializedCompositionRecord); var compositionRecord = new CompositionRecord { ParentHash = CommonConversion.ByteArrayFromStringBase16(compositionRecordFromFile.ParentHashBase16), SetStateLiteralString = compositionRecordFromFile.SetState?.LiteralString, AppendedEventsLiteralString = compositionRecordFromFile.AppendedEvents?.Select(@event => @event.LiteralString)?.ToImmutableList(), }; var compositionChainElement = (compositionRecordHash, compositionRecord); if (!compositionChain.Any()) { compositionChain.Push(compositionChainElement); } else { compositionRecords[dictKeyForHash(compositionRecordHash)] = compositionChainElement; } } while (true) { var(compositionRecordHash, compositionRecord) = compositionChain.Peek(); var reduction = storeReader.GetReduction(compositionRecordHash); if (reduction != null || emptyInitHash.SequenceEqual(compositionRecord.ParentHash)) { if (reduction != null) { compositionChain.Pop(); process.SetSerializedState(reduction.ReducedValueLiteralString); lastStateHash = reduction.ReducedCompositionHash; } foreach (var followingComposition in compositionChain) { if (followingComposition.composition.SetStateLiteralString != null) { process.SetSerializedState(followingComposition.composition.SetStateLiteralString); } foreach (var appendedEvent in followingComposition.composition.AppendedEventsLiteralString.EmptyIfNull()) { process.ProcessEvent(appendedEvent); } lastStateHash = followingComposition.hash; } logger?.Invoke("Restored the process state in " + ((int)restoreStopwatch.Elapsed.TotalSeconds) + " seconds."); return; } var parentKey = dictKeyForHash(compositionRecord.ParentHash); if (!compositionRecords.TryGetValue(parentKey, out var compositionChainElementFromPool)) { break; } compositionChain.Push(compositionChainElementFromPool); compositionRecords.Remove(parentKey); } } if (compositionChain.Any()) { throw new NotImplementedException( "I did not find a reduction for any composition on the chain to the last composition (" + CommonConversion.StringBase16FromByteArray(compositionChain.Last().hash) + ")."); } logger?.Invoke("Found no composition record, default to initial state."); lastStateHash = emptyInitHash; }