diff --git a/Directory.Packages.props b/Directory.Packages.props index 63ec6e8..ca65be1 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -4,10 +4,10 @@ - - - - + + + + @@ -32,4 +32,4 @@ - + \ No newline at end of file diff --git a/Trell.Engine/ClearScriptWrappers/EngineWrapper.cs b/Trell.Engine/ClearScriptWrappers/EngineWrapper.cs index 260e4d8..452daf2 100644 --- a/Trell.Engine/ClearScriptWrappers/EngineWrapper.cs +++ b/Trell.Engine/ClearScriptWrappers/EngineWrapper.cs @@ -193,7 +193,7 @@ internal IScriptObject CreateJsStringArray(IList? list) { return arr; } - public IArrayBuffer CreateJsBuffer(byte[] contents) { + public IArrayBuffer CreateJsBuffer(ReadOnlySpan contents) { var buf = (IArrayBuffer)((ScriptObject)this.engine.Evaluate("ArrayBuffer")).Invoke(true, [contents.Length]); if (contents.Length > 0) { buf.WriteBytes(contents, 0, (ulong)contents.Length, 0); @@ -201,7 +201,7 @@ public IArrayBuffer CreateJsBuffer(byte[] contents) { return buf; } - public ScriptObject CreateJsFile(string filename, string type, byte[] contents) { + public ScriptObject CreateJsFile(string filename, string type, ReadOnlySpan contents) { return (ScriptObject)((ScriptObject)this.engine.Evaluate("File")).Invoke( true, [ @@ -220,19 +220,20 @@ public ScriptObject CreateJsFile(string filename, string type, byte[] contents) EnableSourceLoading(work.SourceDirectory); var limits = this.limits.RestrictBy(work.Limits); - var docInfo = new DocumentInfo { - Category = ModuleCategory.Standard - }; object module; using (var t = Cancel(this.engine, linked, this.currentContext).After(limits.MaxStartupDuration)) { - var loadWorkerJs = $"import * as hooks from '{work.WorkerJs}'; hooks;"; - module = this.engine.Evaluate(docInfo, loadWorkerJs); + var workerFileName = work.WorkerJs.ToString(); + var loadWorkerJs = $"import('{workerFileName}')"; + var loadEvaluation = this.engine.Evaluate(workerFileName, false, loadWorkerJs); + + module = loadEvaluation is Task loadTask ? await loadTask : loadEvaluation; + Log.Information("Evaluated `{Js}` to {M}", loadWorkerJs, module); if (module is Task moduleResultTask) { throw new TrellUserException( - new TrellError(TrellErrorCode.TIMEOUT, $"worker.js took longer than {limits.MaxStartupDuration} to load")); + new TrellError(TrellErrorCode.TIMEOUT, $"{workerFileName} took longer than {limits.MaxStartupDuration} to load")); } } diff --git a/Trell/Rpc/ToEngine.cs b/Trell/Rpc/ToEngine.cs index 5917f77..9eeab30 100644 --- a/Trell/Rpc/ToEngine.cs +++ b/Trell/Rpc/ToEngine.cs @@ -80,12 +80,10 @@ public static EngineWrapper.Work.RawArg ToFunctionArg(this Function fn, EngineWr ["url"] = fn.OnRequest.Url, ["method"] = fn.OnRequest.Method, ["headers"] = engine.CreateScriptObject(fn.OnRequest.Headers.ToDictionary(x => x.Key, y => (object)y.Value)), - // TODO: Replace this with Span<> equivalent once ClearScript is updated to support it: - // https://github.com/xledger/trell/issues/28 - ["body"] = engine.CreateJsBuffer(fn.OnRequest.Body.ToByteArray()), + ["body"] = engine.CreateJsBuffer(fn.OnRequest.Body.Span), })), Function.ValueOneofCase.OnUpload => new EngineWrapper.Work.RawArg("file", - engine.CreateJsFile(fn.OnUpload.Filename, fn.OnUpload.Type, fn.OnUpload.Content.ToByteArray()) + engine.CreateJsFile(fn.OnUpload.Filename, fn.OnUpload.Type, fn.OnUpload.Content.Span) ), Function.ValueOneofCase.Dynamic => new EngineWrapper.Work.RawArg("argv", engine.CreateJsStringArray(fn.Dynamic.Arguments)),