Example #1
0
        public static async Task Invoke(BrewOrder brewOrder, IBaristaRuntimeFactory baristaRuntimeFactory, IBaristaModuleLoader moduleLoader, Func <BaristaContext, JsValue, Task> processBrewResult)
        {
            //Brew:
            using (var rt = baristaRuntimeFactory.CreateRuntime())
                using (var ctx = rt.CreateContext())
                    using (var scope = ctx.Scope())
                    {
                        JsValue result = null;
                        switch (brewOrder.Language)
                        {
                        case ResourceKind.Tsx:
                        case ResourceKind.Jsx:
                            result = ctx.EvaluateTypeScriptModule(brewOrder.Code, moduleLoader, true);
                            break;

                        case ResourceKind.TypeScript:
                            result = ctx.EvaluateTypeScriptModule(brewOrder.Code, moduleLoader);
                            break;

                        case ResourceKind.Json:
                            result = ctx.JSON.Parse(ctx.CreateString(brewOrder.Code));
                            break;

                        case ResourceKind.JavaScript:
                            result = ctx.EvaluateModule(brewOrder.Code, moduleLoader);
                            break;
                        }

                        await processBrewResult?.Invoke(ctx, result);
                    }
        }
Example #2
0
        public static IBaristaModuleLoader Invoke(BrewOrder brewOrder, HttpRequest req)
        {
            //Set up the module loader for the request.
            var moduleLoader = new PrioritizedAggregateModuleLoader();

            //Register all the modules within the BaristaLabs.BaristaCore.Extensions assembly.
            moduleLoader.RegisterModuleLoader(new AssemblyModuleLoader(typeof(TypeScriptTranspiler).Assembly), 1);

            //Register modules needing context.
            var currentContextModule = new BaristaContextModule(req);

            var contextModuleLoader = new InMemoryModuleLoader();

            contextModuleLoader.RegisterModule(currentContextModule);

            moduleLoader.RegisterModuleLoader(contextModuleLoader, 2);

            //Register the web resource module loader rooted at the target path.
            if (Uri.TryCreate(new Uri(brewOrder.BaseUrl, UriKind.Absolute), brewOrder.Path, out Uri targetUri))
            {
                var targetPath = targetUri.GetLeftPart(UriPartial.Authority) + String.Join("", targetUri.Segments.Take(targetUri.Segments.Length - 1));
                var webResourceModuleLoader = new WebResourceModuleLoader(targetPath);
                moduleLoader.RegisterModuleLoader(webResourceModuleLoader, 100);
            }

            return(moduleLoader);
        }
        public static async Task <BrewOrder> Invoke(string path, HttpRequest req)
        {
            //Init a standard order.
            var brewOrder = new BrewOrder()
            {
                BaseUrl  = GetBrewBaseUrl(req),
                Path     = path,
                Code     = "export default 6 * 7;",
                Language = GetResourceKindOverride(req),
            };

            //Attempt to use the path as the path to the resource.
            if (await TryGetResource(brewOrder, new Uri(new Uri(brewOrder.BaseUrl, UriKind.Absolute), brewOrder.Path)))
            {
                brewOrder.IsCodeSet = true;
            }

            //Failing that, determine if there's a query string value for Barista-Code-Url
            else if (req.QueryString.HasValue && !String.IsNullOrWhiteSpace(req.Query[Code_Url_QueryName].FirstOrDefault()))
            {
                var queryCodeUrl = req.Query[Code_Url_QueryName].FirstOrDefault();
                if (await TryGetResourceContentByRelativeOrAbsoluteUrl(brewOrder, queryCodeUrl))
                {
                    brewOrder.IsCodeSet = true;
                }
            }
            //Failing that, if it's a form and there's a Barista-Code-Url value
            else if (req.HasFormContentType && req.Form.ContainsKey(Code_Url_FormName))
            {
                var formCodeUrl = req.Form[Code_Url_FormName].FirstOrDefault();
                if (await TryGetResourceContentByRelativeOrAbsoluteUrl(brewOrder, formCodeUrl))
                {
                    brewOrder.IsCodeSet = true;
                }
            }
            //Failing that, determine if there's a value for a header named X-Barista-Code
            else if (req.Headers.ContainsKey(Code_Url_HeaderName))
            {
                var headerCodeValue = req.Headers[Code_Url_HeaderName].FirstOrDefault();
                if (await TryGetResourceContentByRelativeOrAbsoluteUrl(brewOrder, headerCodeValue))
                {
                    brewOrder.IsCodeSet = true;
                }
            }

            //If there is a language override header, use the language header instead.
            if (req.Headers.ContainsKey(Language_Override_HeaderName))
            {
                brewOrder.Language = GetResourceKindOverride(req);
            }

            return(brewOrder);
        }
        /// <summary>
        /// Attempts to retrieve the resource using a GET request.
        /// </summary>
        /// <param name="baseUrl"></param>
        /// <param name="resource"></param>
        /// <param name="content"></param>
        /// <param name="language"></param>
        /// <returns></returns>
        private static async Task <bool> TryGetResource(BrewOrder brewOrder, Uri requestUri)
        {
            using (var response = await s_httpClient.GetAsync(requestUri))
            {
                if (response.IsSuccessStatusCode)
                {
                    brewOrder.Code = await response.Content.ReadAsStringAsync();

                    brewOrder.Language = WebResourceModuleLoader.GetCanonicalResourceKind(brewOrder.Path, response.Content.Headers.ContentType.ToString());
                    return(true);
                }
            }

            brewOrder.Code     = null;
            brewOrder.Language = ResourceKind.Binary;
            return(false);
        }
        private static async Task <bool> TryGetResourceContentByRelativeOrAbsoluteUrl(BrewOrder brewOrder, string absOrRelUrl)
        {
            if (Uri.TryCreate(absOrRelUrl, UriKind.Absolute, out Uri absoluteResourceUri) &&
                await TryGetResource(brewOrder, absoluteResourceUri))
            {
                return(true);
            }
            else if (Uri.TryCreate(brewOrder.BaseUrl + absOrRelUrl, UriKind.Absolute, out Uri basePlusRelativeResourceUri) &&
                     await TryGetResource(brewOrder, basePlusRelativeResourceUri))
            {
                return(true);
            }

            return(false);
        }