public TemplateRenderer(string baseServerPath) { JsEngine = new V8JsEngine(); var contentToRun = new StringBuilder(); FileStream fileStream = null; try { foreach (var fileAddress in scriptFileAddresses) { var fullAddress = Path.Combine(baseServerPath, fileAddress); fileStream = File.OpenRead(fullAddress); using (var reader = new StreamReader(fileStream)) { contentToRun.Append(reader.ReadToEnd()); contentToRun.Append(" "); } } JsEngine.Execute(contentToRun.ToString()); } catch (Exception e) { throw e; } finally { fileStream?.Dispose(); } }
public void MappingRuntimeErrorDuringOutOfMemoryIsCorrect() { // Arrange const string input = @"var arr = []; for (var i = 0; i < 10000; i++) { arr.push('Current date: ' + new Date()); }"; JsRuntimeException exception = null; // Act using (IJsEngine jsEngine = new V8JsEngine( new V8Settings { MaxHeapSize = new UIntPtr(640 * 1024) } )) { try { jsEngine.Execute(input); } catch (JsRuntimeException e) { exception = e; } } // Assert Assert.NotNull(exception); Assert.Equal("Runtime error", exception.Category); Assert.Equal("The V8 runtime has exceeded its memory limit", exception.Description); }
public static IHtmlString Markdown <T>(this HtmlHelpers <T> helpers, string text, bool sanitize = true) { using (var jsEngine = new V8JsEngine()) using (var markdown = new Markdown(jsEngine)) { return(new NonEncodedHtmlString(markdown.Transform(text, sanitize))); } }
/* * 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[]
private static void V8Method() { IJsEngine engine = new V8JsEngine( new V8Settings { MaxNewSpaceSize = 4, MaxOldSpaceSize = 8 } ); engine.Execute(" function A(){ console.log('a');return 'abcd'}"); engine.ExecuteFile(@"c:/myfile/test/lc.line.web.login_1548918449.js"); var obj = engine.CallFunction("A"); Console.WriteLine(obj); }
private static IJsEngine ScriptEngine() { //ScriptEngine engine = new ScriptEngine(); IJsEngine engine = new V8JsEngine(); //The global object 'exports', is needed for the zxcvbn.js lib. Used for scoping. engine.Execute("exports = {};"); var assembly = Assembly.GetAssembly(typeof(ZxcvbnInstance)); using (Stream resourceStream = assembly.GetManifestResourceStream(assembly.GetName().Name + ".js.zxcvbn.js")) using (StreamReader streamReader = new StreamReader(resourceStream)) { string jsString = streamReader.ReadToEnd(); engine.Execute(jsString); return(engine); } }
/// <summary> /// If the user is explicitly referencing this assembly, they probably want to use it. /// Attempt to use the engine and throw an exception if it doesn't work. /// </summary> public static void EnsureEngineFunctional() { int result = 0; try { using (var engine = new V8JsEngine()) { result = engine.Evaluate <int>("1 + 1"); } } catch (Exception ex) { throw new ClearScriptV8InitialisationException(ex.Message); } if (result != 2) { throw new ReactException("Mathematics is broken. 1 + 1 = " + result); } }
public MarkdownModule() { Post["/markdown"] = _ => { MarkdownModel model; try { model = this.Bind<MarkdownModel>(); } catch { return HttpStatusCode.BadRequest; } if (model.Text == null) return HttpStatusCode.BadRequest; using (var jsEngine = new V8JsEngine()) using (var markdown = new Markdown(jsEngine)) { var html = markdown.Transform(model.Text, model.Sanitize); return Response.AsText(html,"text/html"); } }; }
public static void RegisterBundles(BundleCollection bundles) { // bundles.IgnoreList.Clear(); // AddDefaultIgnorePatterns(bundles.IgnoreList); //NOTE: it's bundles.DirectoryFilter in Microsoft.AspNet.Web.Optimization.1.1.3 and not bundles.IgnoreList var engine = new V8JsEngine(); var uglySettings = new UglifySettings(); uglySettings.Js.CodeGeneration.Beautify = true; bundles.UseCdn = false; var uglifyJsMinifier = new UglifyJsMinifier(() => engine, uglySettings) { CompressionOptions = { Angular = true }, ParsingOptions = new ParsingOptions { Strict = true }, CodeGenerationOptions = new CodeGenerationOptions() }; var lessTranslator = new LessTranslator(); var cssTransformer = new CssTransformer(new CleanCssMinifier(), new ITranslator[] { lessTranslator }); var tsTranslater = new TypeScriptTranslator(); var jsTransformer = new JsTransformer(uglifyJsMinifier, new List<ITranslator> { tsTranslater }); var jsBundle = new CustomScriptBundle("~/bundles/js"); jsBundle.IncludeDirectory("~/scripts", "*.js", true); jsBundle.IncludeDirectory("~/scripts", "*.map", true); bundles.IgnoreList.Ignore("angular-mocks.js"); bundles.IgnoreList.Ignore("angular-scenario.js"); // jsBundle.IncludeDirectory("~/scripts/angular-dialog-service-5.1.2", "*.js", true); jsBundle.Builder = new DefaultBundleBuilder(); jsBundle.Orderer = new JsBundlerOrderer(); jsBundle.Transforms.Add(jsTransformer); bundles.Add(jsBundle); var typeScriptBundle = new CustomScriptBundle("~/bundles/ts"); //// Typescript generatred locally via visual studio and checked in - not done on the fly typeScriptBundle.IncludeDirectory("~/app", "*.js", true); typeScriptBundle.Transforms.Add(jsTransformer); typeScriptBundle.Builder = new DefaultBundleBuilder(); typeScriptBundle.Orderer = new JsBundlerOrderer(); bundles.Add(typeScriptBundle); var lessCssBundle = new Bundle("~/bundles/less"); lessCssBundle.Include("~/Content/bootstrap/bootstrap.less"); lessCssBundle.Builder = new DefaultBundleBuilder(); lessCssBundle.Transforms.Add(cssTransformer); lessCssBundle.Orderer = new DefaultBundleOrderer(); bundles.Add(lessCssBundle); var cssBundle = new StyleBundle("~/bundles/css"); cssBundle.IncludeDirectory("~/Content/Bootstrap", "*.css", false); cssBundle.IncludeDirectory("~/Content/", "*.css", false); cssBundle.IncludeDirectory("~/Content/css", "*.css", false); cssBundle.Builder = new DefaultBundleBuilder(); cssBundle.Transforms.Add(cssTransformer); cssBundle.Orderer = new PushToTopOrderer("bootstrap"); bundles.Add(cssBundle); var publicCssBundle = new StyleBundle("~/bundles/public/css"); publicCssBundle.IncludeDirectory("~/Content/public", "*.css", true); publicCssBundle.Builder = new DefaultBundleBuilder(); publicCssBundle.Transforms.Add(cssTransformer); publicCssBundle.Orderer = new PushToTopOrderer("bootstrap"); bundles.Add(publicCssBundle); }
public static void RegisterBundles(BundleCollection bundles) { // bundles.IgnoreList.Clear(); // AddDefaultIgnorePatterns(bundles.IgnoreList); //NOTE: it's bundles.DirectoryFilter in Microsoft.AspNet.Web.Optimization.1.1.3 and not bundles.IgnoreList var engine = new V8JsEngine(); var uglySettings = new UglifySettings(); uglySettings.Js.CodeGeneration.Beautify = true; bundles.UseCdn = false; var uglifyJsMinifier = new UglifyJsMinifier(() => engine, uglySettings) { CompressionOptions = { Angular = true }, ParsingOptions = new ParsingOptions { Strict = true }, CodeGenerationOptions = new CodeGenerationOptions() }; var lessTranslator = new LessTranslator(); var cssTransformer = new CssTransformer(new CleanCssMinifier(), new ITranslator[] { lessTranslator }); var tsTranslater = new TypeScriptTranslator(); var jsTransformer = new JsTransformer(uglifyJsMinifier, new List <ITranslator> { tsTranslater }); var jsBundle = new CustomScriptBundle("~/bundles/js"); jsBundle.IncludeDirectory("~/scripts", "*.js", true); jsBundle.IncludeDirectory("~/scripts", "*.map", true); bundles.IgnoreList.Ignore("angular-mocks.js"); bundles.IgnoreList.Ignore("angular-scenario.js"); // jsBundle.IncludeDirectory("~/scripts/angular-dialog-service-5.1.2", "*.js", true); jsBundle.Builder = new DefaultBundleBuilder(); jsBundle.Orderer = new JsBundlerOrderer(); jsBundle.Transforms.Add(jsTransformer); bundles.Add(jsBundle); var typeScriptBundle = new CustomScriptBundle("~/bundles/ts"); //// Typescript generatred locally via visual studio and checked in - not done on the fly typeScriptBundle.IncludeDirectory("~/app", "*.js", true); typeScriptBundle.Transforms.Add(jsTransformer); typeScriptBundle.Builder = new DefaultBundleBuilder(); typeScriptBundle.Orderer = new JsBundlerOrderer(); bundles.Add(typeScriptBundle); var lessCssBundle = new Bundle("~/bundles/less"); lessCssBundle.Include("~/Content/bootstrap/bootstrap.less"); lessCssBundle.Builder = new DefaultBundleBuilder(); lessCssBundle.Transforms.Add(cssTransformer); lessCssBundle.Orderer = new DefaultBundleOrderer(); bundles.Add(lessCssBundle); var cssBundle = new StyleBundle("~/bundles/css"); cssBundle.IncludeDirectory("~/Content/Bootstrap", "*.css", false); cssBundle.IncludeDirectory("~/Content/", "*.css", false); cssBundle.IncludeDirectory("~/Content/css", "*.css", false); cssBundle.Builder = new DefaultBundleBuilder(); cssBundle.Transforms.Add(cssTransformer); cssBundle.Orderer = new PushToTopOrderer("bootstrap"); bundles.Add(cssBundle); var publicCssBundle = new StyleBundle("~/bundles/public/css"); publicCssBundle.IncludeDirectory("~/Content/public", "*.css", true); publicCssBundle.Builder = new DefaultBundleBuilder(); publicCssBundle.Transforms.Add(cssTransformer); publicCssBundle.Orderer = new PushToTopOrderer("bootstrap"); bundles.Add(publicCssBundle); }
Run(FileInfo mainScriptFile, string[] argv, bool inspect, bool pauseDebuggerOnStart, IImmutableSet <string> inspectLoadSet, Func <CancellationToken, Task <string> > f, Process parentProcess, bool verbose) { var rootDir = mainScriptFile.Directory; Debug.Assert(rootDir != null); var settings = new V8Settings { EnableDebugging = inspect || pauseDebuggerOnStart || inspectLoadSet.Any(), AwaitDebuggerAndPauseOnStart = pauseDebuggerOnStart || inspectLoadSet.Any(), }; using (var engine = new V8JsEngine(settings)) { var scheduler = new ConcurrentExclusiveSchedulerPair().ExclusiveScheduler; var console = ConsoleService.Default; void Load(string module) { var path = Path.Combine(rootDir.FullName, module); var source = File.ReadAllText(path); if (inspectLoadSet.Contains(source)) { source = "debugger;" + source; } engine.Execute(source, module); } using (var host = new Host(Load, console, scheduler)) { string FormatMessage(object sender, string message) { var senderName = sender is string s ? s : sender.GetType().Name; var formatted = $"{senderName}[{Thread.CurrentThread.ManagedThreadId}]: {message}"; return(formatted.FormatFoldedLines().TrimNewLineAtTail()); } void OnUnobservedTaskException(object sender, UnobservedTaskExceptionEventArgs args) => console.Error(FormatMessage(sender, args.Exception.ToString())); TaskScheduler.UnobservedTaskException += OnUnobservedTaskException; var infoLog = !verbose ? null : new LogEventHandler((sender, message) => host.Console.Info(FormatMessage(sender, message))); var warnLog = !verbose ? null : new ErrorLogEventHandler((sender, e, message) => host.Console.Warn(FormatMessage(sender, e == null ? message : string.IsNullOrEmpty(message) ? e.ToString() : message + Environment.NewLine + e))); var errorLog = !verbose ? null : new ErrorLogEventHandler((sender, e, message) => host.Console.Error(FormatMessage(sender, string.IsNullOrEmpty(message) ? e.ToString() : message + Environment.NewLine + e))); foreach (var service in new ILogSource[] { host, host.Timer, host.Xhr }) { service.InfoLog = infoLog; service.WarnLog = warnLog; service.ErrorLog = errorLog; } var tasks = new List <NamedTask>(); void AddTask(NamedTask task) { lock (tasks) tasks.Add(task); } void RemoveTask(NamedTask task) { lock (tasks) tasks.Remove(task); } host.TaskStarting += (_, task) => AddTask(task); host.TaskFinishing += (_, task) => RemoveTask(task); if (verbose) { host.ServiceCreated += (_, service) => { service.InfoLog = infoLog; service.WarnLog = warnLog; service.ErrorLog = errorLog; }; } engine.EmbedHostObject("host", host); var initScript = GetManifestResourceStream("init.js", typeof(Program)).ReadAsText(); dynamic init = engine.Evaluate(initScript, "__init.js"); init(host, engine.Evaluate("this"), argv); if (settings.AwaitDebuggerAndPauseOnStart) { console.Warn(FormatMessage(nameof(Program), "Will wait for debugger to attach.")); } Load(mainScriptFile.Name); void Schedule(string name, Action <AsyncTaskControl> action) { var task = AsyncTask.Create(name, thisTask => { Exception error = null; try { action(thisTask); } catch (Exception e) { error = e; } RemoveTask(thisTask); switch (error) { case null: thisTask.FlagSuccess(); break; case OperationCanceledException e: thisTask.FlagCanceled(e.CancellationToken); break; default: errorLog?.Invoke(nameof(Program), error, null); thisTask.FlagError(error); break; } }); AddTask(task); task.Start(scheduler); } var parentProcessTask = parentProcess.AsTask(dispose: true, p => p.ExitCode, _ => null, exit => exit); while (true) { var readCommandTask = f(CancellationToken.None); if (parentProcessTask != null) { if (parentProcessTask == await Task.WhenAny(readCommandTask, parentProcessTask)) { break; } } else { await readCommandTask; } var command = (await readCommandTask)?.Trim(); if (command == null) { break; } if (command.Length == 0) { continue; } const string ondata = "ondata"; Schedule(ondata, delegate { infoLog?.Invoke(nameof(Program), "STDIN: " + command); engine.CallFunction(ondata, command); }); } const string onclose = "onclose"; Schedule(onclose, delegate { engine.Execute(@"if (typeof onclose === 'function') onclose();"); }); host.Timer.CancelAll(); host.Xhr.AbortAll(); infoLog?.Invoke(typeof(Program), "Shutting down..."); ImmutableArray <Task> tasksSnapshot; lock (tasks) tasksSnapshot = ImmutableArray.CreateRange(from t in tasks select t.Task); if (await tasksSnapshot.WhenAll(TimeSpan.FromSeconds(30))) { Debug.Assert(tasks.Count == 0); } else { warnLog?.Invoke(typeof(Program), null, "Timed-out waiting for all tasks to end for a graceful shutdown!"); } infoLog?.Invoke(typeof(Program), "Shutdown completed."); TaskScheduler.UnobservedTaskException -= OnUnobservedTaskException; } } }