@ai-ecoverse/slicc-kernel 1.128.2 → 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 +27 -3
- package/dist/index.js.map +2 -2
- package/dist/kernel-worker.js +485 -132
- package/dist/kernel-worker.js.map +4 -4
- package/dist/node-process-worker.js +150 -31
- package/dist/node-process-worker.js.map +4 -4
- package/dist/node.js +493 -140
- package/dist/node.js.map +4 -4
- package/dist/process-worker.js +130 -14
- package/dist/process-worker.js.map +4 -4
- package/dist/testing.js +10 -1
- package/dist/testing.js.map +3 -3
- package/dist/types/index.d.ts +1 -0
- package/dist/types/kernel/children.d.ts +1 -0
- package/dist/types/kernel/js-threads.d.ts +38 -0
- package/dist/types/kernel/net/sealed-http1.d.ts +4 -0
- package/dist/types/kernel/net/sealed-smtp.d.ts +15 -0
- package/dist/types/kernel/process.d.ts +1 -0
- package/dist/types/kernel/protocol.d.ts +35 -0
- package/dist/types/kernel/test-hooks.d.ts +7 -0
- package/dist/types/launcher.d.ts +3 -0
- package/dist/types/process/js/js-context.d.ts +3 -0
- package/dist/types/process/js/js-thread.d.ts +22 -0
- package/dist/types/testing.d.ts +1 -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)];
|
|
@@ -6072,6 +6077,7 @@ var init_wasix_process = __esm({
|
|
|
6072
6077
|
const spawn = {
|
|
6073
6078
|
op: "proc-spawn",
|
|
6074
6079
|
file: this.locate(req.name, req.search, req.path),
|
|
6080
|
+
...req.search ? {} : { search: false },
|
|
6075
6081
|
argv: req.argv.length > 0 ? req.argv : [req.name],
|
|
6076
6082
|
env: req.env ?? this.environment(),
|
|
6077
6083
|
cwd,
|
|
@@ -6434,7 +6440,7 @@ var KERNEL_VERSION, OS_RELEASE;
|
|
|
6434
6440
|
var init_version = __esm({
|
|
6435
6441
|
"src/version.ts"() {
|
|
6436
6442
|
"use strict";
|
|
6437
|
-
KERNEL_VERSION = true ? "1.
|
|
6443
|
+
KERNEL_VERSION = true ? "1.130.0" : "0.0.0-dev";
|
|
6438
6444
|
OS_RELEASE = "6.0.0-slicc";
|
|
6439
6445
|
}
|
|
6440
6446
|
});
|
|
@@ -12254,9 +12260,7 @@ function createContext(o) {
|
|
|
12254
12260
|
argv: o.argv,
|
|
12255
12261
|
env: o.env,
|
|
12256
12262
|
pid: o.pid,
|
|
12257
|
-
async
|
|
12258
|
-
return identityOf(await kernel.json({ op: "proc-identity" }), o).ppid;
|
|
12259
|
-
},
|
|
12263
|
+
ppid: async () => identityOf(await kernel.json({ op: "proc-identity" }), o).ppid,
|
|
12260
12264
|
cwd: o.cwd,
|
|
12261
12265
|
stdin: readable2(read2),
|
|
12262
12266
|
stdout: writable2(1),
|
|
@@ -12301,6 +12305,7 @@ function createContext(o) {
|
|
|
12301
12305
|
websocket: websocketOp(kernel),
|
|
12302
12306
|
tty: terminal.tty,
|
|
12303
12307
|
exit,
|
|
12308
|
+
thread: o.thread,
|
|
12304
12309
|
onUncaught: (listener) => listen(strays.exception, listener),
|
|
12305
12310
|
onUnhandledRejection: (listener) => listen(strays.rejection, listener)
|
|
12306
12311
|
};
|
|
@@ -12532,11 +12537,100 @@ var init_js_context = __esm({
|
|
|
12532
12537
|
}
|
|
12533
12538
|
});
|
|
12534
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
|
+
|
|
12535
12628
|
// src/process/js/js-runtime.ts
|
|
12536
12629
|
var js_runtime_exports = {};
|
|
12537
12630
|
__export(js_runtime_exports, {
|
|
12538
12631
|
mainOf: () => mainOf,
|
|
12539
12632
|
runJsProcess: () => runJsProcess,
|
|
12633
|
+
runJsThread: () => runJsThread,
|
|
12540
12634
|
trapStrays: () => trapStrays
|
|
12541
12635
|
});
|
|
12542
12636
|
function trapStrays(scope2, stray) {
|
|
@@ -12567,7 +12661,15 @@ function mainOf(module) {
|
|
|
12567
12661
|
const main = typeof module.default === "function" ? module.default : module.main;
|
|
12568
12662
|
return typeof main === "function" ? main : void 0;
|
|
12569
12663
|
}
|
|
12570
|
-
|
|
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;
|
|
12571
12673
|
const transport = createAsyncSabTransport(init.sab, port3, deps.waitAsync);
|
|
12572
12674
|
let resolveExit;
|
|
12573
12675
|
const exit = new Promise((resolve) => resolveExit = resolve);
|
|
@@ -12579,7 +12681,7 @@ async function runJsProcess(init, port3, deps = {}) {
|
|
|
12579
12681
|
let failing;
|
|
12580
12682
|
const fail = (err) => {
|
|
12581
12683
|
if (err instanceof JsExit) return;
|
|
12582
|
-
failing ??= say(message(err)).then(() => exited(
|
|
12684
|
+
failing ??= (thread ? Promise.resolve() : say(message(err))).then(() => exited(failed5(err)));
|
|
12583
12685
|
};
|
|
12584
12686
|
const kernel = new JsKernel({
|
|
12585
12687
|
sab: init.sab,
|
|
@@ -12600,7 +12702,8 @@ async function runJsProcess(init, port3, deps = {}) {
|
|
|
12600
12702
|
cwd: init.cwd,
|
|
12601
12703
|
exit: (status3) => exited(statusOf(status3)),
|
|
12602
12704
|
lane: laneOf(init.lane),
|
|
12603
|
-
strays
|
|
12705
|
+
strays,
|
|
12706
|
+
thread: threadContext(port3, thread)
|
|
12604
12707
|
});
|
|
12605
12708
|
const say = (text) => ctx.write(2, `${init.argv0}: ${text}
|
|
12606
12709
|
`).catch(() => void 0);
|
|
@@ -12631,8 +12734,8 @@ async function runJsProcess(init, port3, deps = {}) {
|
|
|
12631
12734
|
const program = main;
|
|
12632
12735
|
const ran = Promise.resolve().then(() => program(ctx)).then(statusOf, async (err) => {
|
|
12633
12736
|
if (err instanceof JsExit) return err.status;
|
|
12634
|
-
await say(message(err));
|
|
12635
|
-
return
|
|
12737
|
+
if (!thread) await say(message(err));
|
|
12738
|
+
return failed5(err);
|
|
12636
12739
|
});
|
|
12637
12740
|
const status2 = await Promise.race([ran, exit]);
|
|
12638
12741
|
await drain2();
|
|
@@ -12645,11 +12748,13 @@ var NOT_RUNNABLE;
|
|
|
12645
12748
|
var init_js_runtime = __esm({
|
|
12646
12749
|
"src/process/js/js-runtime.ts"() {
|
|
12647
12750
|
"use strict";
|
|
12751
|
+
init_protocol();
|
|
12648
12752
|
init_wasi_imports();
|
|
12649
12753
|
init_async_sab();
|
|
12650
12754
|
init_js_context();
|
|
12651
12755
|
init_js_kernel();
|
|
12652
12756
|
init_js_sync();
|
|
12757
|
+
init_js_thread();
|
|
12653
12758
|
init_lockdown();
|
|
12654
12759
|
NOT_RUNNABLE = 126;
|
|
12655
12760
|
}
|
|
@@ -17745,7 +17850,7 @@ init_process_runtime();
|
|
|
17745
17850
|
var loadWasi = () => Promise.resolve().then(() => (init_wasi_runtime(), wasi_runtime_exports));
|
|
17746
17851
|
var loadJs = () => Promise.resolve().then(() => (init_js_runtime(), js_runtime_exports));
|
|
17747
17852
|
var NOT_RUNNABLE2 = 126;
|
|
17748
|
-
function
|
|
17853
|
+
function started2(init, port3, run, wasi, js) {
|
|
17749
17854
|
if (init.program?.abi === "js") {
|
|
17750
17855
|
const jsInit = init;
|
|
17751
17856
|
return js().then((m) => m.runJsProcess(jsInit, port3));
|
|
@@ -17775,8 +17880,19 @@ function processEntry(port3, run = runWasmProcess, wasi = loadWasi, js = loadJs,
|
|
|
17775
17880
|
};
|
|
17776
17881
|
return (data) => {
|
|
17777
17882
|
const type = data?.type;
|
|
17778
|
-
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;
|
|
17779
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
|
+
}
|
|
17780
17896
|
const init = data;
|
|
17781
17897
|
if (type === WASM_THREAD_INIT || init?.program?.abi !== "js") useLocalClock(init?.sab);
|
|
17782
17898
|
if (type === WASM_THREAD_INIT) {
|
|
@@ -17785,7 +17901,7 @@ function processEntry(port3, run = runWasmProcess, wasi = loadWasi, js = loadJs,
|
|
|
17785
17901
|
return;
|
|
17786
17902
|
}
|
|
17787
17903
|
if (refusal2) return failed5(refusal2.error, NOT_RUNNABLE2);
|
|
17788
|
-
|
|
17904
|
+
started2(data, port3, run, wasi, js).then(
|
|
17789
17905
|
(code2) => port3.postMessage({ type: WASM_PROCESS_EXIT, code: code2 }),
|
|
17790
17906
|
failed5
|
|
17791
17907
|
);
|
|
@@ -17799,14 +17915,17 @@ scope.require ??= createRequire(import.meta.url);
|
|
|
17799
17915
|
scope.__filename ??= new URL(import.meta.url).pathname;
|
|
17800
17916
|
scope.__dirname ??= new URL(".", import.meta.url).pathname;
|
|
17801
17917
|
var port2 = parentPort;
|
|
17802
|
-
var post = {
|
|
17918
|
+
var post = {
|
|
17919
|
+
postMessage: (message2, transfer) => port2.postMessage(message2, transfer)
|
|
17920
|
+
};
|
|
17803
17921
|
var strayScope = nodeProcess ? { process: nodeProcess } : {};
|
|
17804
17922
|
var onMessage = processEntry(
|
|
17805
17923
|
post,
|
|
17806
17924
|
void 0,
|
|
17807
17925
|
async () => wasi_runtime_exports,
|
|
17808
17926
|
async () => ({
|
|
17809
|
-
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 })
|
|
17810
17929
|
}),
|
|
17811
17930
|
() => nodeLockdown()
|
|
17812
17931
|
);
|