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