@ai-ecoverse/slicc-kernel 1.129.0 → 1.130.0
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 +19 -1
- package/dist/index.js.map +2 -2
- package/dist/kernel-worker.js +230 -54
- package/dist/kernel-worker.js.map +4 -4
- package/dist/node-process-worker.js +149 -31
- package/dist/node-process-worker.js.map +4 -4
- package/dist/node.js +230 -54
- package/dist/node.js.map +4 -4
- package/dist/process-worker.js +129 -14
- package/dist/process-worker.js.map +4 -4
- package/dist/types/index.d.ts +1 -0
- package/dist/types/kernel/js-threads.d.ts +38 -0
- package/dist/types/kernel/protocol.d.ts +35 -0
- package/dist/types/process/js/js-context.d.ts +3 -0
- package/dist/types/process/js/js-thread.d.ts +22 -0
- package/package.json +2 -2
|
@@ -103,6 +103,28 @@ var init_lockdown = __esm({
|
|
|
103
103
|
}
|
|
104
104
|
});
|
|
105
105
|
|
|
106
|
+
// src/kernel/protocol.ts
|
|
107
|
+
var WASM_PROCESS_INIT, WASM_PROCESS_EXIT, WASM_PROCESS_ERROR, WASM_PROCESS_READY, WASM_THREAD_SPAWN, WASM_THREAD_INIT, WASM_THREAD_EXIT, WASM_MAX_THREADS, WASM_DEFAULT_THREADS, JS_THREAD_SPAWN, JS_THREAD_INIT, JS_THREAD_EXIT, JS_THREAD_NO_MEMORY, JS_THREAD_CRASHED;
|
|
108
|
+
var init_protocol = __esm({
|
|
109
|
+
"src/kernel/protocol.ts"() {
|
|
110
|
+
"use strict";
|
|
111
|
+
WASM_PROCESS_INIT = "wasm-process-init";
|
|
112
|
+
WASM_PROCESS_EXIT = "wasm-process-exit";
|
|
113
|
+
WASM_PROCESS_ERROR = "wasm-process-error";
|
|
114
|
+
WASM_PROCESS_READY = "wasm-process-ready";
|
|
115
|
+
WASM_THREAD_SPAWN = "wasm-thread-spawn";
|
|
116
|
+
WASM_THREAD_INIT = "wasm-thread-init";
|
|
117
|
+
WASM_THREAD_EXIT = "wasm-thread-exit";
|
|
118
|
+
WASM_MAX_THREADS = 256;
|
|
119
|
+
WASM_DEFAULT_THREADS = 64;
|
|
120
|
+
JS_THREAD_SPAWN = "js-thread-spawn";
|
|
121
|
+
JS_THREAD_INIT = "js-thread-init";
|
|
122
|
+
JS_THREAD_EXIT = "js-thread-exit";
|
|
123
|
+
JS_THREAD_NO_MEMORY = 256;
|
|
124
|
+
JS_THREAD_CRASHED = 257;
|
|
125
|
+
}
|
|
126
|
+
});
|
|
127
|
+
|
|
106
128
|
// src/process/wasi/wasi-abi.ts
|
|
107
129
|
function wasiErrnoOf(code2) {
|
|
108
130
|
if (!code2) return E.IO;
|
|
@@ -1342,23 +1364,6 @@ var init_wasi_files = __esm({
|
|
|
1342
1364
|
}
|
|
1343
1365
|
});
|
|
1344
1366
|
|
|
1345
|
-
// src/kernel/protocol.ts
|
|
1346
|
-
var WASM_PROCESS_INIT, WASM_PROCESS_EXIT, WASM_PROCESS_ERROR, WASM_PROCESS_READY, WASM_THREAD_SPAWN, WASM_THREAD_INIT, WASM_THREAD_EXIT, WASM_MAX_THREADS, WASM_DEFAULT_THREADS;
|
|
1347
|
-
var init_protocol = __esm({
|
|
1348
|
-
"src/kernel/protocol.ts"() {
|
|
1349
|
-
"use strict";
|
|
1350
|
-
WASM_PROCESS_INIT = "wasm-process-init";
|
|
1351
|
-
WASM_PROCESS_EXIT = "wasm-process-exit";
|
|
1352
|
-
WASM_PROCESS_ERROR = "wasm-process-error";
|
|
1353
|
-
WASM_PROCESS_READY = "wasm-process-ready";
|
|
1354
|
-
WASM_THREAD_SPAWN = "wasm-thread-spawn";
|
|
1355
|
-
WASM_THREAD_INIT = "wasm-thread-init";
|
|
1356
|
-
WASM_THREAD_EXIT = "wasm-thread-exit";
|
|
1357
|
-
WASM_MAX_THREADS = 256;
|
|
1358
|
-
WASM_DEFAULT_THREADS = 64;
|
|
1359
|
-
}
|
|
1360
|
-
});
|
|
1361
|
-
|
|
1362
1367
|
// src/realm/sync-sab-wire.ts
|
|
1363
1368
|
function loadBlocked(header) {
|
|
1364
1369
|
return [Atomics.load(header, SAB_I_BLOCKED), Atomics.load(header, SAB_I_BLOCKED_HI)];
|
|
@@ -6435,7 +6440,7 @@ var KERNEL_VERSION, OS_RELEASE;
|
|
|
6435
6440
|
var init_version = __esm({
|
|
6436
6441
|
"src/version.ts"() {
|
|
6437
6442
|
"use strict";
|
|
6438
|
-
KERNEL_VERSION = true ? "1.
|
|
6443
|
+
KERNEL_VERSION = true ? "1.130.0" : "0.0.0-dev";
|
|
6439
6444
|
OS_RELEASE = "6.0.0-slicc";
|
|
6440
6445
|
}
|
|
6441
6446
|
});
|
|
@@ -12255,9 +12260,7 @@ function createContext(o) {
|
|
|
12255
12260
|
argv: o.argv,
|
|
12256
12261
|
env: o.env,
|
|
12257
12262
|
pid: o.pid,
|
|
12258
|
-
async
|
|
12259
|
-
return identityOf(await kernel.json({ op: "proc-identity" }), o).ppid;
|
|
12260
|
-
},
|
|
12263
|
+
ppid: async () => identityOf(await kernel.json({ op: "proc-identity" }), o).ppid,
|
|
12261
12264
|
cwd: o.cwd,
|
|
12262
12265
|
stdin: readable2(read2),
|
|
12263
12266
|
stdout: writable2(1),
|
|
@@ -12302,6 +12305,7 @@ function createContext(o) {
|
|
|
12302
12305
|
websocket: websocketOp(kernel),
|
|
12303
12306
|
tty: terminal.tty,
|
|
12304
12307
|
exit,
|
|
12308
|
+
thread: o.thread,
|
|
12305
12309
|
onUncaught: (listener) => listen(strays.exception, listener),
|
|
12306
12310
|
onUnhandledRejection: (listener) => listen(strays.rejection, listener)
|
|
12307
12311
|
};
|
|
@@ -12533,11 +12537,100 @@ var init_js_context = __esm({
|
|
|
12533
12537
|
}
|
|
12534
12538
|
});
|
|
12535
12539
|
|
|
12540
|
+
// src/process/js/js-thread.ts
|
|
12541
|
+
function outOfMemory(err) {
|
|
12542
|
+
return err instanceof RangeError && OOM.test(err.message);
|
|
12543
|
+
}
|
|
12544
|
+
function optionsOf(options) {
|
|
12545
|
+
if (options === void 0) return {};
|
|
12546
|
+
if (typeof options !== "object" || options === null || Array.isArray(options)) {
|
|
12547
|
+
throw new JsCallError("EINVAL", "thread.spawn");
|
|
12548
|
+
}
|
|
12549
|
+
const { transfer } = options;
|
|
12550
|
+
if (transfer !== void 0 && !Array.isArray(transfer)) {
|
|
12551
|
+
throw new JsCallError("EINVAL", "thread.spawn");
|
|
12552
|
+
}
|
|
12553
|
+
return options;
|
|
12554
|
+
}
|
|
12555
|
+
function started(port3, control) {
|
|
12556
|
+
const exited = Promise.withResolvers();
|
|
12557
|
+
return new Promise((resolve, reject) => {
|
|
12558
|
+
const thread = (tid) => Object.freeze({
|
|
12559
|
+
tid,
|
|
12560
|
+
port: port3,
|
|
12561
|
+
exited: exited.promise,
|
|
12562
|
+
async terminate() {
|
|
12563
|
+
control.postMessage({ terminate: true });
|
|
12564
|
+
await exited.promise;
|
|
12565
|
+
}
|
|
12566
|
+
});
|
|
12567
|
+
control.onmessage = (event) => {
|
|
12568
|
+
const said = event.data;
|
|
12569
|
+
if ("tid" in said) resolve(thread(said.tid));
|
|
12570
|
+
else if ("errno" in said) {
|
|
12571
|
+
control.close();
|
|
12572
|
+
port3.close();
|
|
12573
|
+
reject(new JsCallError(said.errno, "thread.spawn", said.message));
|
|
12574
|
+
} else if ("exited" in said) {
|
|
12575
|
+
control.close();
|
|
12576
|
+
exited.resolve(said.exited);
|
|
12577
|
+
}
|
|
12578
|
+
};
|
|
12579
|
+
});
|
|
12580
|
+
}
|
|
12581
|
+
function threadContext(post2, start2) {
|
|
12582
|
+
const spawn = (options) => {
|
|
12583
|
+
let asked;
|
|
12584
|
+
try {
|
|
12585
|
+
asked = optionsOf(options);
|
|
12586
|
+
} catch (err) {
|
|
12587
|
+
return Promise.reject(err);
|
|
12588
|
+
}
|
|
12589
|
+
const channel = new NativeChannel();
|
|
12590
|
+
const control = new NativeChannel();
|
|
12591
|
+
const transfer = [...asked.transfer ?? []];
|
|
12592
|
+
const msg = {
|
|
12593
|
+
type: JS_THREAD_SPAWN,
|
|
12594
|
+
data: asked.data,
|
|
12595
|
+
port: channel.port2,
|
|
12596
|
+
control: control.port2,
|
|
12597
|
+
transfer
|
|
12598
|
+
};
|
|
12599
|
+
try {
|
|
12600
|
+
post2.postMessage(msg, [channel.port2, control.port2, ...transfer]);
|
|
12601
|
+
} catch (err) {
|
|
12602
|
+
channel.port1.close();
|
|
12603
|
+
control.port1.close();
|
|
12604
|
+
return Promise.reject(err);
|
|
12605
|
+
}
|
|
12606
|
+
return started(channel.port1, control.port1);
|
|
12607
|
+
};
|
|
12608
|
+
return Object.freeze({
|
|
12609
|
+
tid: start2?.tid ?? 0,
|
|
12610
|
+
port: start2?.port,
|
|
12611
|
+
data: start2?.data,
|
|
12612
|
+
NO_MEMORY: JS_THREAD_NO_MEMORY,
|
|
12613
|
+
CRASHED: JS_THREAD_CRASHED,
|
|
12614
|
+
spawn
|
|
12615
|
+
});
|
|
12616
|
+
}
|
|
12617
|
+
var NativeChannel, OOM;
|
|
12618
|
+
var init_js_thread = __esm({
|
|
12619
|
+
"src/process/js/js-thread.ts"() {
|
|
12620
|
+
"use strict";
|
|
12621
|
+
init_protocol();
|
|
12622
|
+
init_js_kernel();
|
|
12623
|
+
NativeChannel = globalThis.MessageChannel;
|
|
12624
|
+
OOM = /out of memory|Array buffer allocation failed|Cannot allocate Wasm memory/i;
|
|
12625
|
+
}
|
|
12626
|
+
});
|
|
12627
|
+
|
|
12536
12628
|
// src/process/js/js-runtime.ts
|
|
12537
12629
|
var js_runtime_exports = {};
|
|
12538
12630
|
__export(js_runtime_exports, {
|
|
12539
12631
|
mainOf: () => mainOf,
|
|
12540
12632
|
runJsProcess: () => runJsProcess,
|
|
12633
|
+
runJsThread: () => runJsThread,
|
|
12541
12634
|
trapStrays: () => trapStrays
|
|
12542
12635
|
});
|
|
12543
12636
|
function trapStrays(scope2, stray) {
|
|
@@ -12568,7 +12661,15 @@ function mainOf(module) {
|
|
|
12568
12661
|
const main = typeof module.default === "function" ? module.default : module.main;
|
|
12569
12662
|
return typeof main === "function" ? main : void 0;
|
|
12570
12663
|
}
|
|
12571
|
-
|
|
12664
|
+
function runJsProcess(init, port3, deps = {}) {
|
|
12665
|
+
return runJs(init, port3, deps, void 0);
|
|
12666
|
+
}
|
|
12667
|
+
function runJsThread(init, port3, deps = {}) {
|
|
12668
|
+
const { thread, ...rest2 } = init;
|
|
12669
|
+
return runJs(rest2, port3, deps, thread);
|
|
12670
|
+
}
|
|
12671
|
+
async function runJs(init, port3, deps, thread) {
|
|
12672
|
+
const failed5 = (err) => thread && outOfMemory(err) ? JS_THREAD_NO_MEMORY : 1;
|
|
12572
12673
|
const transport = createAsyncSabTransport(init.sab, port3, deps.waitAsync);
|
|
12573
12674
|
let resolveExit;
|
|
12574
12675
|
const exit = new Promise((resolve) => resolveExit = resolve);
|
|
@@ -12580,7 +12681,7 @@ async function runJsProcess(init, port3, deps = {}) {
|
|
|
12580
12681
|
let failing;
|
|
12581
12682
|
const fail = (err) => {
|
|
12582
12683
|
if (err instanceof JsExit) return;
|
|
12583
|
-
failing ??= say(message(err)).then(() => exited(
|
|
12684
|
+
failing ??= (thread ? Promise.resolve() : say(message(err))).then(() => exited(failed5(err)));
|
|
12584
12685
|
};
|
|
12585
12686
|
const kernel = new JsKernel({
|
|
12586
12687
|
sab: init.sab,
|
|
@@ -12601,7 +12702,8 @@ async function runJsProcess(init, port3, deps = {}) {
|
|
|
12601
12702
|
cwd: init.cwd,
|
|
12602
12703
|
exit: (status3) => exited(statusOf(status3)),
|
|
12603
12704
|
lane: laneOf(init.lane),
|
|
12604
|
-
strays
|
|
12705
|
+
strays,
|
|
12706
|
+
thread: threadContext(port3, thread)
|
|
12605
12707
|
});
|
|
12606
12708
|
const say = (text) => ctx.write(2, `${init.argv0}: ${text}
|
|
12607
12709
|
`).catch(() => void 0);
|
|
@@ -12632,8 +12734,8 @@ async function runJsProcess(init, port3, deps = {}) {
|
|
|
12632
12734
|
const program = main;
|
|
12633
12735
|
const ran = Promise.resolve().then(() => program(ctx)).then(statusOf, async (err) => {
|
|
12634
12736
|
if (err instanceof JsExit) return err.status;
|
|
12635
|
-
await say(message(err));
|
|
12636
|
-
return
|
|
12737
|
+
if (!thread) await say(message(err));
|
|
12738
|
+
return failed5(err);
|
|
12637
12739
|
});
|
|
12638
12740
|
const status2 = await Promise.race([ran, exit]);
|
|
12639
12741
|
await drain2();
|
|
@@ -12646,11 +12748,13 @@ var NOT_RUNNABLE;
|
|
|
12646
12748
|
var init_js_runtime = __esm({
|
|
12647
12749
|
"src/process/js/js-runtime.ts"() {
|
|
12648
12750
|
"use strict";
|
|
12751
|
+
init_protocol();
|
|
12649
12752
|
init_wasi_imports();
|
|
12650
12753
|
init_async_sab();
|
|
12651
12754
|
init_js_context();
|
|
12652
12755
|
init_js_kernel();
|
|
12653
12756
|
init_js_sync();
|
|
12757
|
+
init_js_thread();
|
|
12654
12758
|
init_lockdown();
|
|
12655
12759
|
NOT_RUNNABLE = 126;
|
|
12656
12760
|
}
|
|
@@ -17746,7 +17850,7 @@ init_process_runtime();
|
|
|
17746
17850
|
var loadWasi = () => Promise.resolve().then(() => (init_wasi_runtime(), wasi_runtime_exports));
|
|
17747
17851
|
var loadJs = () => Promise.resolve().then(() => (init_js_runtime(), js_runtime_exports));
|
|
17748
17852
|
var NOT_RUNNABLE2 = 126;
|
|
17749
|
-
function
|
|
17853
|
+
function started2(init, port3, run, wasi, js) {
|
|
17750
17854
|
if (init.program?.abi === "js") {
|
|
17751
17855
|
const jsInit = init;
|
|
17752
17856
|
return js().then((m) => m.runJsProcess(jsInit, port3));
|
|
@@ -17776,8 +17880,19 @@ function processEntry(port3, run = runWasmProcess, wasi = loadWasi, js = loadJs,
|
|
|
17776
17880
|
};
|
|
17777
17881
|
return (data) => {
|
|
17778
17882
|
const type = data?.type;
|
|
17779
|
-
if (type !== WASM_THREAD_INIT && type !== WASM_PROCESS_INIT) return;
|
|
17883
|
+
if (type !== WASM_THREAD_INIT && type !== WASM_PROCESS_INIT && type !== JS_THREAD_INIT) return;
|
|
17780
17884
|
const refusal2 = sealOnce();
|
|
17885
|
+
if (type === JS_THREAD_INIT) {
|
|
17886
|
+
if (refusal2) return failed5(refusal2.error);
|
|
17887
|
+
js().then((m) => {
|
|
17888
|
+
if (!m.runJsThread) throw new Error("this process worker runs no JS threads");
|
|
17889
|
+
return m.runJsThread(data, port3);
|
|
17890
|
+
}).then(
|
|
17891
|
+
(code2) => port3.postMessage({ type: JS_THREAD_EXIT, code: code2 }),
|
|
17892
|
+
failed5
|
|
17893
|
+
);
|
|
17894
|
+
return;
|
|
17895
|
+
}
|
|
17781
17896
|
const init = data;
|
|
17782
17897
|
if (type === WASM_THREAD_INIT || init?.program?.abi !== "js") useLocalClock(init?.sab);
|
|
17783
17898
|
if (type === WASM_THREAD_INIT) {
|
|
@@ -17786,7 +17901,7 @@ function processEntry(port3, run = runWasmProcess, wasi = loadWasi, js = loadJs,
|
|
|
17786
17901
|
return;
|
|
17787
17902
|
}
|
|
17788
17903
|
if (refusal2) return failed5(refusal2.error, NOT_RUNNABLE2);
|
|
17789
|
-
|
|
17904
|
+
started2(data, port3, run, wasi, js).then(
|
|
17790
17905
|
(code2) => port3.postMessage({ type: WASM_PROCESS_EXIT, code: code2 }),
|
|
17791
17906
|
failed5
|
|
17792
17907
|
);
|
|
@@ -17800,14 +17915,17 @@ scope.require ??= createRequire(import.meta.url);
|
|
|
17800
17915
|
scope.__filename ??= new URL(import.meta.url).pathname;
|
|
17801
17916
|
scope.__dirname ??= new URL(".", import.meta.url).pathname;
|
|
17802
17917
|
var port2 = parentPort;
|
|
17803
|
-
var post = {
|
|
17918
|
+
var post = {
|
|
17919
|
+
postMessage: (message2, transfer) => port2.postMessage(message2, transfer)
|
|
17920
|
+
};
|
|
17804
17921
|
var strayScope = nodeProcess ? { process: nodeProcess } : {};
|
|
17805
17922
|
var onMessage = processEntry(
|
|
17806
17923
|
post,
|
|
17807
17924
|
void 0,
|
|
17808
17925
|
async () => wasi_runtime_exports,
|
|
17809
17926
|
async () => ({
|
|
17810
|
-
runJsProcess: (init, at) => runJsProcess(init, at, { lockdown: () => nodeLockdown(), scope: strayScope })
|
|
17927
|
+
runJsProcess: (init, at) => runJsProcess(init, at, { lockdown: () => nodeLockdown(), scope: strayScope }),
|
|
17928
|
+
runJsThread: (init, at) => runJsThread(init, at, { lockdown: () => nodeLockdown(), scope: strayScope })
|
|
17811
17929
|
}),
|
|
17812
17930
|
() => nodeLockdown()
|
|
17813
17931
|
);
|