@enfyra/kernel 1.1.52 → 1.1.54
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +16 -9
- package/dist/execution/worker.js +19 -19
- package/dist/index.js +5 -5
- package/dist/package-metadata.json +1 -1
- package/package.json +2 -1
package/README.md
CHANGED
|
@@ -30,15 +30,22 @@ container.register({
|
|
|
30
30
|
|
|
31
31
|
## Executor lane tuning
|
|
32
32
|
|
|
33
|
-
The executor selects up to two runner processes and sizes isolate lanes
|
|
34
|
-
effective CPU and memory limits. CPU establishes a baseline of two
|
|
35
|
-
effective CPU and a flexible ceiling of four lanes per effective CPU.
|
|
36
|
-
RAM can raise the target from the baseline toward that ceiling
|
|
37
|
-
|
|
33
|
+
The executor selects up to two runner processes and sizes physical isolate lanes
|
|
34
|
+
from the effective CPU and memory limits. CPU establishes a baseline of two
|
|
35
|
+
lanes per effective CPU and a flexible ceiling of four lanes per effective CPU.
|
|
36
|
+
Available RAM can raise the target from the baseline toward that ceiling. The
|
|
37
|
+
memory bound uses its raw safe lane count, reserving at most 25% of effective
|
|
38
38
|
memory for isolate limits, with an absolute ceiling of 128 lanes per runner.
|
|
39
39
|
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
40
|
+
Each physical isolate admits up to six concurrent task contexts. This bounded
|
|
41
|
+
multiplexing raises I/O throughput without recreating the old all-or-nothing
|
|
42
|
+
worker failure domain: cancellation, native execution timeout, or isolate OOM
|
|
43
|
+
disposes the affected isolate and fails only its sibling tasks with
|
|
44
|
+
`ERR_EXECUTOR_ISOLATE_LOST`. The runner stays available for new work. This is a
|
|
45
|
+
kernel policy, not a deployment environment setting.
|
|
46
|
+
|
|
47
|
+
Run `yarn bench:executor-lanes --tasks-per-isolate 1,2,4,8` on the target
|
|
48
|
+
hardware to sweep physical lane counts and task fan-in using I/O-bound and
|
|
49
|
+
CPU-bound scripts. Use the smallest fan-in whose I/O queue wait has materially
|
|
50
|
+
improved while CPU p95, runner RSS, and the isolate failure blast radius remain
|
|
44
51
|
within the deployment budget.
|
package/dist/execution/worker.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";var
|
|
1
|
+
"use strict";var ne=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var ae=ne((et,re)=>{"use strict";var{fork:Pe}=require("child_process"),xe=require("path");function Se({workerDir:e,activeTaskContexts:t}){let a=new Map,n=new Map,r=new Map,o=new Map,i=null,h=0,_=1e3;function m(l){return Math.max(1,Math.trunc(Number(l)||3e4))}function v(l,s,c){let f=new Error(l);return f.code=s,f.details=c,f}function R(l,s){for(let[c,f]of n)f.child===l&&(clearTimeout(f.timer),n.delete(c),r.delete(c),f.reject(s))}function d(l){for(let[s,c]of o)c.child===l&&(clearTimeout(c.timer),o.delete(s))}function u(l,s){if(!l.connected)return;let c=`cancel_${++h}`,f=setTimeout(()=>{o.delete(c);try{l.kill()}catch{}},_);f.unref?.(),o.set(c,{child:l,timer:f});try{l.send({op:"cancelTask",taskId:s,id:c})}catch{clearTimeout(f),o.delete(c);try{l.kill()}catch{}}}function k(l){let s=typeof l=="string"?JSON.parse(l):l;if(s?.error)throw new Error(s.error);return s?.value}async function b(l){let s=t.get(l.taskId);if(!s)throw new Error(`Package callback context not found: ${l.taskId}`);let c=JSON.stringify(l.callbackId),f=JSON.stringify(l.argsJson||"[]"),y=await s.evalClosure(`return __invokeRuntimeCallback(${c}, ${f});`,[],{arguments:{copy:!0},result:{promise:!0,copy:!0}});return k(y)}function w(){if(i&&i.connected)return i;let l=xe.join(e,"package-runtime.child.js"),s=Pe(l,[],{stdio:["ignore","ignore","ignore","ipc"],env:{PATH:process.env.PATH||"",HOME:process.env.HOME||"",NODE_ENV:process.env.NODE_ENV||"production",TMPDIR:process.env.TMPDIR||"",LANG:process.env.LANG||""}});return i=s,s.on("message",c=>{if(!c||!c.id)return;if(c.type==="pkgStreamChunk"){let y=r.get(c.id);if(!y)return;y.onChunk(Buffer.from(c.chunk||"","base64")).then(()=>{try{s.send({type:"pkgStreamAck",ackId:c.ackId})}catch{}}).catch(T=>{try{s.send({type:"pkgStreamError",ackId:c.ackId,error:{message:T.message,stack:T.stack}})}catch{}});return}if(c.type==="taskCancelled"){let y=o.get(c.id);if(!y||y.child!==s)return;clearTimeout(y.timer),o.delete(c.id);return}if(c.type==="pkgCallbackCall"){b(c).then(y=>{try{s.send({type:"pkgCallbackResult",id:c.id,value:y})}catch{}}).catch(y=>{try{s.send({type:"pkgCallbackError",id:c.id,error:{message:y.message,stack:y.stack}})}catch{}});return}let f=n.get(c.id);if(f)if(clearTimeout(f.timer),n.delete(c.id),r.delete(c.id),c.ok)f.resolve(c.value);else{c.error?.code==="ERR_PACKAGE_RUNTIME_TIMEOUT"&&u(s,f.taskId);let y=v(c.error?.message||"Package runtime call failed",c.error?.code,c.error?.details);y.stack=c.error?.stack||y.stack,f.reject(y)}}),s.on("exit",(c,f)=>{i===s&&(i=null),d(s),R(s,v(`Package runtime exited${f?` with signal ${f}`:` with code ${c}`}`,"ERR_PACKAGE_RUNTIME_LOST",{outcome:"unknown_outcome",retryable:!1}))}),s.on("error",c=>{i===s&&(i=null),d(s),R(s,v(c.message,"ERR_PACKAGE_RUNTIME_LOST",{outcome:"unknown_outcome",retryable:!1}))}),s}function x(l){return new Promise((s,c)=>{let f=w(),y=`pkg_${++h}`,T=m(l.timeoutMs),E=setTimeout(()=>{n.delete(y),r.delete(y),u(f,l.taskId),c(v(`Package runtime call timed out after ${T}ms`,"ERR_PACKAGE_RUNTIME_TIMEOUT",{outcome:"unknown_outcome",retryable:!1}))},T);n.set(y,{child:f,taskId:l.taskId,resolve:s,reject:c,timer:E});try{f.send({...l,id:y},O=>{O&&(clearTimeout(E),n.delete(y),c(O))})}catch(O){clearTimeout(E),n.delete(y),c(O)}})}function S(l,s,c,f=[],y=3e4){return new Promise((T,E)=>{let O=w(),A=`pkg_${++h}`,Q=m(y),ee=setTimeout(()=>{n.delete(A),r.delete(A),u(O,l),E(v(`Package runtime stream timed out after ${Q}ms`,"ERR_PACKAGE_RUNTIME_TIMEOUT",{outcome:"unknown_outcome",retryable:!1}))},Q);n.set(A,{child:O,taskId:l,resolve:T,reject:E,timer:ee}),r.set(A,{onChunk:c});try{O.send({op:"streamHandle",taskId:l,handleId:s,path:f,id:A,timeoutMs:Q},W=>{W&&(clearTimeout(ee),n.delete(A),r.delete(A),E(W))})}catch(W){clearTimeout(ee),n.delete(A),r.delete(A),E(W)}})}function D(l){try{if(!i||!i.connected)return;i.send({...l,id:`pkg_${++h}`,fire:!0})}catch{}}function p(l){try{if(!i||!i.connected)return;u(i,l)}catch{}}async function H(l,s){let c=a.get(l);if(!c)throw new Error("Package context is not available");if(s.handleId)return x({op:s.kind==="get"?"handleGet":"handleCall",taskId:l,handleId:s.handleId,path:s.path||[],argsJson:s.argsJson||"[]",timeoutMs:s.timeoutMs});let f=c.get(s.packageName);if(!f)throw new Error(`Package "${s.packageName}" is not available`);return x({op:s.kind==="construct"?"construct":"call",taskId:l,packageName:s.packageName,package:{name:f.name,fileUrl:f.fileUrl},path:s.path||[],argsJson:s.argsJson||"[]",timeoutMs:s.timeoutMs})}function g(l,s){a.set(l,s)}function P(l){a.delete(l),D({op:"releaseTask",taskId:l})}function $(){if(i){try{i.kill()}catch{}i=null}}return{cleanupTaskPackages:P,cancelTask:p,executePackageRuntimeCall:H,setTaskPackages:g,streamPackageHandle:S,shutdownPackageRuntime:$}}re.exports={createPackageRuntimeBridge:Se}});var oe=ne((tt,se)=>{"use strict";var Ce=`
|
|
2
2
|
"use strict";
|
|
3
3
|
let $ctx = {};
|
|
4
4
|
let $pkgs = {};
|
|
@@ -949,48 +949,48 @@ function __cleanupTask() {
|
|
|
949
949
|
__pendingRuntimeTasks = [];
|
|
950
950
|
return true;
|
|
951
951
|
}
|
|
952
|
-
`;function
|
|
953
|
-
`),
|
|
954
|
-
`);for(let a of t){let
|
|
955
|
-
`)}function
|
|
952
|
+
`;function Re(e){return Ce.replace("%%PKG_SETUP%%",e)}se.exports={buildSetupCode:Re}});var{parentPort:$e}=require("worker_threads"),C=$e||{on(e,t){e==="message"&&process.on("message",t)},postMessage(e){process.send?.(e)}},ie=require("fs"),{fileURLToPath:Me}=require("url"),{createPackageRuntimeBridge:Te}=ae(),{buildSetupCode:Ae}=oe(),V;try{V=require("isolated-vm")}catch(e){C.postMessage({type:"error",message:"isolated-vm not available: "+e.message}),process.exit(1)}var q=new Map,_e=0,U=new Map,J=new Map,I=new Map,j=Te({workerDir:__dirname,activeTaskContexts:U}),Ne=500,Ee=5e3,Oe=1,ce=new WeakMap,pe=new WeakMap,ge=new WeakMap,K={created:0,reused:0,released:0,evicted:0,scrubFailed:0};function B(e){let t=I.get(e);return Math.max(1,Math.ceil((t??Date.now()+3e4)-Date.now()))}var M=null,le=0,ue=0,de=0;async function Je(){let e=Date.now();if(e-ue<Ee)return de;if(ue=e,!M)return 0;let t=0;for(let a of M){let n=a?.isolate;if(!(!n||n.isDisposed))try{let r=await n.getHeapStatistics(),o=r.heap_size_limit||1,i=r.used_heap_size/o;i>t&&(t=i)}catch{}}return de=t,t}async function F(e){e.heapRatio=await Je(),e.runnerRssBytes=process.memoryUsage().rss,e.contextStats=Ie(),C.postMessage(e)}function Ie(){let e=0;if(M)for(let t of M)e+=t?.idleContexts?.length||0;return{...K,idle:e}}function ye(e,t,a){if(!M){let n=Math.max(1,Math.trunc(Number(t)||8));M=new Array(n).fill(null)}for(let n=0;n<M.length;n++){let r=(le+n)%M.length,o=M[r];if((!o||!o.isolate||o.isolate.isDisposed)&&(o={isolate:new V.Isolate({memoryLimit:e}),idleContexts:[],taskIds:new Set,contextCapacity:a},M[r]=o),o.taskIds.size<a)return le=(r+1)%M.length,o}throw new Error("No isolate lane is available")}function z(e,t,a){for(let n of[...e.taskIds])n!==t&&(e.taskIds.delete(n),J.delete(n),U.delete(n),I.delete(n),j.cancelTask(n),G(n),C.postMessage({type:"result",id:n,success:!1,error:{message:"Isolate was disposed because a sibling task could not continue",code:"ERR_EXECUTOR_ISOLATE_LOST",details:{outcome:"unknown_outcome",retryable:!1,reason:a}}}),C.postMessage({type:"taskReleased",id:n}));e.idleContexts.length=0;try{e.isolate.dispose()}catch{}}function je(e){let t=J.get(e);if(!t){C.postMessage({type:"taskCancelled",id:e});return}z(t,e,"sibling_cancelled"),j.cancelTask(e),J.delete(e),U.delete(e),I.delete(e),t.taskIds.delete(e),G(e),C.postMessage({type:"taskCancelled",id:e})}function he(e,t){t.taskIds.delete(e)&&(U.delete(e),J.delete(e),I.delete(e),G(e),C.postMessage({type:"taskReleased",id:e}))}async function N(e,t,a){let n=ce.get(e);n||(n=new Map,ce.set(e,n));let r=n.get(t);if(r)return r;let o;try{o=await e.compileScript(t,{filename:a})}catch(i){throw i&&typeof i=="object"&&(i.executionStage="compile"),i}if(n.set(t,o),n.size>Ne){let i=n.keys().next().value;n.delete(i)}return o}C.on("message",async e=>{if(e.type==="execute")Xe(e).catch(async t=>{await F({type:"result",id:e.id,success:!1,error:{message:t.message,stack:t.stack}})});else if(e.type==="executeBatch")Ye(e).catch(async t=>{await F({type:"result",id:e.id,success:!1,error:{message:t.message,stack:t.stack}})});else if(e.type==="invokeRuntimeCallback")Ue(e).catch(t=>{C.postMessage({type:"runtimeCallbackResult",callId:e.callId,error:t?.message||String(t)})});else if(e.type==="callResult"){let t=q.get(e.callId);t&&(q.delete(e.callId),t.resolve(e.result))}else if(e.type==="callError"){let t=q.get(e.callId);t&&(q.delete(e.callId),t.reject(new Error(e.error)))}else e.type==="cancelTask"&&je(e.id)});async function Ue(e){let t=U.get(e.id);if(!t){C.postMessage({type:"runtimeCallbackResult",callId:e.callId,error:`Runtime callback context not found: ${e.id}`});return}let a=await t.evalClosure(`return __invokeRuntimeCallback(${JSON.stringify(e.callbackId)}, ${JSON.stringify(e.argsJson||"[]")});`,[],{arguments:{copy:!0},result:{promise:!0,copy:!0}}),n=JSON.parse(a);C.postMessage({type:"runtimeCallbackResult",callId:e.callId,...n})}function L(e,t,a){return new Promise((n,r)=>{let o=`cb_${++_e}`;q.set(o,{resolve:n,reject:r}),C.postMessage({type:t,id:e,callId:o,...a})})}function He(e,t,a){C.postMessage({type:t,id:e,callId:`f_${++_e}`,...a})}async function Le(e,t){if(t?.method!=="stream")return L(e,"resCall",t);let a=JSON.parse(t.argsJson||"[]"),n=a[0],r=a[1]||{},o=n?.__pkgHandleArg;if(!o)return L(e,"resCall",t);let i=r.observer&&typeof r.observer=="object"?r.observer.__fnRef:null,h=r.transform&&typeof r.transform=="object"?r.transform.__fnRef:null,_=i||h?new TextDecoder("utf-8"):null;delete r.observer,delete r.transform;let m={...r};await L(e,"resCall",{method:"streamStart",argsJson:JSON.stringify([null,m])});let v=async(u,k,b)=>{if(!u)return;let w=U.get(e);if(!w)return;let x=await w.evalClosure(`return __invokeRuntimeCallback(${JSON.stringify(u)}, ${JSON.stringify(JSON.stringify([k,b]))});`,[],{arguments:{copy:!0},result:{promise:!0,copy:!0}}),S=JSON.parse(x);if(S?.error)throw new Error(S.error);if(S?.value?.__e!=="u")return S?.value},R=async(u,k)=>{if(i)try{await v(i,u,k)}catch{}},d=async(u,k,b)=>{let w=u;if(h){let S=await v(h,b,k);if(S===null)return;S!==void 0&&(w=Buffer.from(String(S)))}let x=Buffer.from(w);x.length!==0&&await L(e,"resCall",{method:"streamChunk",chunk:x.toString("base64")})};try{await j.streamPackageHandle(e,o,async k=>{let b="";try{b=_?_.decode(Buffer.from(k),{stream:!0}):""}catch{}await R(b,"chunk"),await d(k,"chunk",b)},[],B(e));let u="";try{u=_?_.decode():""}catch{}await R(u,"end"),await d("","end",u),await L(e,"resCall",{method:"streamEnd"})}catch(u){try{await L(e,"resCall",{method:"streamError",error:{message:u.message,stack:u.stack}})}catch{}throw await R("","error"),u}return JSON.stringify({__e:"u"})}function Fe(e){if(typeof e.sourceCode=="string"&&e.sourceCode.length>0)return e.sourceCode;let t=e.filePath;return!t&&typeof e.fileUrl=="string"&&e.fileUrl.startsWith("file://")&&(t=Me(e.fileUrl)),!t||!ie.existsSync(t)?null:ie.readFileSync(t,"utf8")}async function De(e,t,a){try{let n=Fe(a);if(!n)return null;let r=await e.compileModule(n,{filename:`pkg:${a.safeName}`});await r.instantiate(t,i=>{throw new Error(`Unresolved import in package ${a.safeName}: ${i}`)}),await r.evaluate({timeout:1e4});let o=await r.namespace.get("default");return o!==void 0&&o.typeof!=="undefined"?o.derefInto({release:!1}):r.namespace.derefInto({release:!1})}catch{return null}}function me(e,t){let a=r=>{let o=2166136261;for(let i=0;i<r.length;i++)o^=r.charCodeAt(i),o=Math.imul(o,16777619);return(o>>>0).toString(36)},n=new Set(t||[]);return e.map(r=>{let o=r.cacheKey||`${r.filePath||""}:${r.fileUrl||""}:${r.mtimeMs||""}:${r.size||""}:${a(r.sourceCode||"")}`,i=n.has(r.name)?"isolate":"proxy";return`${r.name}:${r.version||""}:${o}:${i}`}).join("|")}function ke(e,t){let a=new Set(t.map(_=>_.name)),n=new Set,r=String(e||""),o=/\b(?:\$ctx\.)?\$pkgs\s*\[\s*(['"`])([^'"`]+)\1\s*\]/g,i=/\brequire\s*\(\s*(['"`])([^'"`]+)\1\s*\)/g,h=/\b(?:\$ctx\.)?\$pkgs\.([A-Za-z_$][\w$]*)/g;for(let _ of[o,i])for(let m of r.matchAll(_)){let v=m[2];a.has(v)&&n.add(v)}for(let _ of r.matchAll(h)){let m=_[1];a.has(m)&&n.add(m)}return n}async function Ke(e,t,a,n){let r=await e.createContext(),o=r.global;await o.set("global",o.derefInto());let i=[],h=[],_=new Map;for(let d of a){_.set(d.name,d);let u=n.has(d.name)?await De(e,r,d):null;u!==null?(await o.set(`__pkg_${d.safeName}`,u),i.push(d)):h.push(d)}j.setTaskPackages(t,_),await o.set("__callRef",new V.Reference(async(d,u,k)=>{let b=JSON.parse(k);if(u==="pkgCall")try{return JSON.stringify(await j.executePackageRuntimeCall(d,b))}catch(w){throw new Error(JSON.stringify({__userThrow:!0,message:w.message,code:w.code,details:w.details}))}return u==="resCall"?Le(d,b):L(d,u,b)})),await o.set("__fireRef",new V.Reference((d,u,k)=>{let b=JSON.parse(k);He(d,u,b)}));let m=i.map(d=>`$pkgs[${JSON.stringify(d.name)}] = __pkg_${d.safeName};`).concat(h.map(d=>`$pkgs[${JSON.stringify(d.name)}] = __createPkgProxy(${JSON.stringify(d.name)}, []);`)).join(`
|
|
953
|
+
`),v=Ae(m);return await(await N(e,v,"setup.js")).run(r,{timeout:B(t)}),pe.set(r,me(a,n)),ge.set(r,_),r}async function we(e,t,a,n,r,o,i){let h=e.isolate,_=me(a,r),m=null;for(let d=e.idleContexts.length-1;d>=0;d--){let u=e.idleContexts[d];if(e.idleContexts.splice(d,1),pe.get(u)===_){m=u,K.reused++;break}try{u.release()}catch{}}m||(m=await Ke(h,t,a,r),K.created++),j.setTaskPackages(t,ge.get(m)||new Map);let v=m.global;return await v.set("__snapshot",new V.ExternalCopy(n).copyInto()),await v.set("__nextTaskId",t),await v.set("__nextTaskTimeoutMs",o),await v.set("__nextTaskDeadlineMs",i),await(await N(h,"__resetTask(__snapshot, __nextTaskId, __nextTaskTimeoutMs, __nextTaskDeadlineMs);","reset-task.js")).run(m,{timeout:B(t)}),m}async function ve(e,t){if(!t||e.isolate.isDisposed)return;try{await(await N(e.isolate,"__cleanupTask();","cleanup-task.js")).run(t,{timeout:5e3})}catch{K.scrubFailed++;try{t.release()}catch{}return}let a=Math.max(1,Math.trunc(Number(e.contextCapacity)||Oe));if(e.idleContexts.length>=a){try{t.release()}catch{}K.evicted++;return}e.idleContexts.push(t),K.released++}function Be(e){try{let t=JSON.parse(e.message);if(t&&t.__userThrow)return{...t,message:t.message??e.message}}catch{}return null}var qe=3,Ve=["setup.js","extract.js","extract-error-ctx.js","set-status.js","populate-error.js"];function Ge(e){if(!e)return null;let t=e.split(`
|
|
954
|
+
`);for(let a of t){let n=a.match(/at\s+(.+\.js):(\d+):(\d+)/);if(!n)continue;let r=n[1].trim();if(Ve.includes(r)||r!=="handler.js"&&!r.startsWith("preHook #")&&!r.startsWith("postHook #"))continue;let i=parseInt(n[2])-qe;if(!(i<=0))return{line:i,column:parseInt(n[3]),phase:r.replace(".js","")}}return null}function We(e,t,a){if(!e||!t)return;let n=String(e).split(/\r?\n/),r=Math.max(1,t-1),o=Math.min(n.length,t+1),i=String(o).length,h=[];for(let _=r;_<=o;_++){let m=_===t?">":" ";h.push(`${m} ${String(_).padStart(i," ")}. ${n[_-1]??""}`),_===t&&a&&a>0&&h.push(` ${" ".repeat(i)} ${" ".repeat(Math.max(0,a-1))}^`)}return h.join(`
|
|
955
|
+
`)}function ze(e,t){if(!(!e||!t)){if(t[e.phase])return t[e.phase];if(e.phase?.startsWith("preHook"))return t.preHook;if(e.phase?.startsWith("postHook"))return t.postHook}}function te(e,t){let a=Be(e);if(a)return{message:a.message,statusCode:a.statusCode,errorPath:a.errorPath,code:a.code,details:a.details};let n=Ge(e.stack),r=e.message||"Unknown error",o=n?`${r} (${n.phase}, line ${n.line})`:r,i=ze(n,t),h=n?We(i,n.line,n.column):void 0;return{message:o,statusCode:e.statusCode||null,details:{errorName:e.name||null,executionStage:e.executionStage||"runtime",...n?{...n,codeFrame:h}:{}}}}function X(e){return e?.message==="Script execution timed out."}function Y(e){return e?.message==="Isolate was disposed during execution due to memory limit"}function be(e){X(e)&&e?.code==null&&(e.code="ERR_SCRIPT_EXECUTION_TIMEOUT"),Y(e)&&e?.code==null&&(e.code="ERR_ISOLATE_MEMORY_LIMIT",e.details={outcome:"unknown_outcome",retryable:!1})}async function Z(e,t,a){be(t);let n=te(t,a);t.details&&(n.details={...n.details,...t.details}),await F({type:"result",id:e,success:!1,error:{...n,stack:t.stack,code:n.code??t.code}})}async function Xe(e){let{id:t,code:a,pkgSources:n,snapshot:r,memoryLimitMb:o,isolatePoolSize:i,tasksPerIsolate:h}=e,_={handler:e.sourceCode||a||""},m=n||[],v=Math.max(1,Math.trunc(Number(e.timeoutMs)||3e4)),R=Date.now()+v;I.set(t,R);let d=ke(a,m),u=ye(o,i,Math.max(1,Math.trunc(Number(h)||1)));u.taskIds.add(t),J.set(t,u);let k=u.isolate,b;try{b=await we(u,t,m,r,d,v,R)}catch(w){I.delete(t),J.delete(t),u.taskIds.delete(t),G(t),await Z(t,w,_),C.postMessage({type:"taskReleased",id:t});return}U.set(t,b);try{let w=`
|
|
956
956
|
(async () => {
|
|
957
957
|
"use strict";
|
|
958
958
|
${a}
|
|
959
959
|
})().then((__result) => __extractResult(__result, __result === undefined));
|
|
960
|
-
`,
|
|
961
|
-
`),
|
|
960
|
+
`,S=await(await N(k,w,"handler.js")).run(b,{timeout:B(t),promise:!0}),D=JSON.parse(S);await F({type:"result",id:t,success:!0,...D})}catch(w){u.taskIds.has(t)&&(await Z(t,w,_),(X(w)||Y(w))&&z(u,t,"sibling_execution_failure"))}finally{await ve(u,b),he(t,u)}}async function Ye(e){let{id:t,codeBlocks:a,pkgSources:n,snapshot:r,memoryLimitMb:o,isolatePoolSize:i,tasksPerIsolate:h}=e,_=n||[],m=Math.max(1,Math.trunc(Number(e.timeoutMs)||3e4)),v=Date.now()+m;I.set(t,v);let R=ke((a||[]).map(p=>p.code||"").join(`
|
|
961
|
+
`),_),d=ye(o,i,Math.max(1,Math.trunc(Number(h)||1)));d.taskIds.add(t),J.set(t,d);let u=d.isolate,k;try{k=await we(d,t,_,r,R,m,v)}catch(p){I.delete(t),J.delete(t),d.taskIds.delete(t),G(t),await Z(t,p),C.postMessage({type:"taskReleased",id:t});return}U.set(t,k);let b=[],w=[],x={},S=0,D=0;for(let p of a){let H=p.type||"handler",g=p.sourceCode||p.code||"";H==="postHook"?(D++,x[`postHook #${D}`]=g,x.postHook=g,w.push(p)):(H==="handler"?x.handler=g:(S++,x[`${H} #${S}`]=g,x.preHook=g),b.push(p))}try{let p=null;for(let g=0;g<b.length;g++){let P=b[g],$=P.type||"handler",l=$==="handler"?"handler":`${$} #${g+1}`,s;$==="preHook"?s=`
|
|
962
962
|
(async () => {
|
|
963
963
|
"use strict";
|
|
964
|
-
${
|
|
964
|
+
${P.code}
|
|
965
965
|
})().then((__r) => {
|
|
966
966
|
if (__r !== undefined) return JSON.stringify({ __shortCircuit: true, value: __r });
|
|
967
967
|
return JSON.stringify({ __shortCircuit: false });
|
|
968
|
-
});`:
|
|
968
|
+
});`:s=`
|
|
969
969
|
(async () => {
|
|
970
970
|
"use strict";
|
|
971
|
-
${
|
|
971
|
+
${P.code}
|
|
972
972
|
})().then((__r) => {
|
|
973
973
|
$ctx.$data = __r;
|
|
974
974
|
return "__handler_done__";
|
|
975
|
-
});`;try{let
|
|
976
|
-
$ctx.$error = ${JSON.stringify(
|
|
975
|
+
});`;try{let f=await(await N(u,s,`${l}.js`)).run(k,{timeout:B(t),promise:!0});if($==="preHook"&&typeof f=="string"){let y=JSON.parse(f);if(y.__shortCircuit){let T=await fe(u,k,y.value);await F({type:"result",id:t,success:!0,...T,shortCircuit:!0});return}}}catch(c){p=c;break}}if(!p&&w.length>0&&await(await N(u,'$ctx.$statusCode = 200; "__status_set__";',"set-status.js")).run(k,{timeout:5e3}),p&&w.length>0){let g=te(p,x),P={message:g.message||"Unknown error",name:p.constructor?.name||"Error",stack:p.stack||"",statusCode:g.statusCode||500,details:g.details||{},timestamp:new Date().toISOString()},$=`
|
|
976
|
+
$ctx.$error = ${JSON.stringify(P)};
|
|
977
977
|
$ctx.$data = null;
|
|
978
|
-
$ctx.$statusCode = ${
|
|
978
|
+
$ctx.$statusCode = ${P.statusCode};
|
|
979
979
|
if ($ctx.$api) {
|
|
980
|
-
$ctx.$api.error = ${JSON.stringify(
|
|
980
|
+
$ctx.$api.error = ${JSON.stringify(P)};
|
|
981
981
|
$ctx.$api.response = {
|
|
982
|
-
statusCode: ${
|
|
982
|
+
statusCode: ${P.statusCode},
|
|
983
983
|
responseTime: $ctx.$api.request && $ctx.$api.request.timestamp
|
|
984
984
|
? Date.now() - new Date($ctx.$api.request.timestamp).getTime()
|
|
985
985
|
: 0,
|
|
986
|
-
timestamp: ${JSON.stringify(
|
|
986
|
+
timestamp: ${JSON.stringify(P.timestamp)},
|
|
987
987
|
};
|
|
988
988
|
}
|
|
989
|
-
"__error_populated__";`;await(await u.compileScript($,{filename:"populate-error.js"})).run(
|
|
989
|
+
"__error_populated__";`;await(await u.compileScript($,{filename:"populate-error.js"})).run(k,{timeout:5e3})}for(let g=0;g<w.length;g++){let P=w[g],$=`postHook #${g+1}`,l=`
|
|
990
990
|
(async () => {
|
|
991
991
|
"use strict";
|
|
992
|
-
${
|
|
992
|
+
${P.code}
|
|
993
993
|
})().then((__r) => {
|
|
994
994
|
if (__r !== undefined) $ctx.$data = __r;
|
|
995
995
|
return "__posthook_done__";
|
|
996
|
-
});`;try{await(await
|
|
996
|
+
});`;try{await(await N(u,l,`${$}.js`)).run(k,{timeout:B(t),promise:!0})}catch{}}if(p){be(p);let g=te(p,x);p.details&&(g.details={...g.details,...p.details});let P;try{let s=await(await N(u,"(async () => JSON.stringify(await __extractCtxChanges()))()","extract-error-ctx.js")).run(k,{timeout:5e3,promise:!0});P=JSON.parse(s)}catch{}await F({type:"result",id:t,success:!1,error:{message:g.message,statusCode:g.statusCode,errorPath:g.errorPath,stack:p.stack,code:g.code??p.code,details:g.details},ctxChanges:P}),(X(p)||Y(p))&&z(d,t,"sibling_execution_failure");return}let H=await fe(u,k);await F({type:"result",id:t,success:!0,...H})}catch(p){d.taskIds.has(t)&&(await Z(t,p),(X(p)||Y(p))&&z(d,t,"sibling_execution_failure"))}finally{await ve(d,k),he(t,d)}}function G(e){j.cleanupTaskPackages(e)}function Ze(){j.shutdownPackageRuntime()}process.on("exit",Ze);async function fe(e,t,a){if(a!==void 0){let i=`__extractResult(${JSON.stringify(a)}, false)`,_=await(await e.compileScript(i,{filename:"extract.js"})).run(t,{timeout:5e3,promise:!0});return JSON.parse(_)}let o=await(await N(e,"__extractResult($ctx.$data, $ctx.$data === undefined)","extract.js")).run(t,{timeout:5e3,promise:!0});return JSON.parse(o)}
|