Esempio n. 1
0
        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);
        }
Esempio n. 3
0
 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)));
         }
 }
Esempio n. 4
0
    /*
     * 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);
        }
Esempio n. 6
0
        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);
                }
        }
Esempio n. 7
0
        /// <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);
            }
        }
Esempio n. 8
0
        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");
                }
            };
        }
Esempio n. 9
0
        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);
        }
Esempio n. 10
0
        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);
        }
Esempio n. 11
0
        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;
                }
            }
        }