@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
package/dist/process-worker.js
CHANGED
|
@@ -254,7 +254,7 @@ var init_cpu_clock = __esm({
|
|
|
254
254
|
});
|
|
255
255
|
|
|
256
256
|
// src/kernel/protocol.ts
|
|
257
|
-
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;
|
|
257
|
+
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;
|
|
258
258
|
var init_protocol = __esm({
|
|
259
259
|
"src/kernel/protocol.ts"() {
|
|
260
260
|
"use strict";
|
|
@@ -267,6 +267,11 @@ var init_protocol = __esm({
|
|
|
267
267
|
WASM_THREAD_EXIT = "wasm-thread-exit";
|
|
268
268
|
WASM_MAX_THREADS = 256;
|
|
269
269
|
WASM_DEFAULT_THREADS = 64;
|
|
270
|
+
JS_THREAD_SPAWN = "js-thread-spawn";
|
|
271
|
+
JS_THREAD_INIT = "js-thread-init";
|
|
272
|
+
JS_THREAD_EXIT = "js-thread-exit";
|
|
273
|
+
JS_THREAD_NO_MEMORY = 256;
|
|
274
|
+
JS_THREAD_CRASHED = 257;
|
|
270
275
|
}
|
|
271
276
|
});
|
|
272
277
|
|
|
@@ -2659,7 +2664,7 @@ var KERNEL_VERSION, OS_RELEASE;
|
|
|
2659
2664
|
var init_version = __esm({
|
|
2660
2665
|
"src/version.ts"() {
|
|
2661
2666
|
"use strict";
|
|
2662
|
-
KERNEL_VERSION = true ? "1.
|
|
2667
|
+
KERNEL_VERSION = true ? "1.130.0" : "0.0.0-dev";
|
|
2663
2668
|
OS_RELEASE = "6.0.0-slicc";
|
|
2664
2669
|
}
|
|
2665
2670
|
});
|
|
@@ -11600,6 +11605,7 @@ var init_wasix_process = __esm({
|
|
|
11600
11605
|
const spawn = {
|
|
11601
11606
|
op: "proc-spawn",
|
|
11602
11607
|
file: this.locate(req.name, req.search, req.path),
|
|
11608
|
+
...req.search ? {} : { search: false },
|
|
11603
11609
|
argv: req.argv.length > 0 ? req.argv : [req.name],
|
|
11604
11610
|
env: req.env ?? this.environment(),
|
|
11605
11611
|
cwd,
|
|
@@ -17279,9 +17285,7 @@ function createContext(o) {
|
|
|
17279
17285
|
argv: o.argv,
|
|
17280
17286
|
env: o.env,
|
|
17281
17287
|
pid: o.pid,
|
|
17282
|
-
async
|
|
17283
|
-
return identityOf(await kernel.json({ op: "proc-identity" }), o).ppid;
|
|
17284
|
-
},
|
|
17288
|
+
ppid: async () => identityOf(await kernel.json({ op: "proc-identity" }), o).ppid,
|
|
17285
17289
|
cwd: o.cwd,
|
|
17286
17290
|
stdin: readable2(read2),
|
|
17287
17291
|
stdout: writable2(1),
|
|
@@ -17326,6 +17330,7 @@ function createContext(o) {
|
|
|
17326
17330
|
websocket: websocketOp(kernel),
|
|
17327
17331
|
tty: terminal.tty,
|
|
17328
17332
|
exit,
|
|
17333
|
+
thread: o.thread,
|
|
17329
17334
|
onUncaught: (listener) => listen(strays.exception, listener),
|
|
17330
17335
|
onUnhandledRejection: (listener) => listen(strays.rejection, listener)
|
|
17331
17336
|
};
|
|
@@ -17557,11 +17562,100 @@ var init_js_context = __esm({
|
|
|
17557
17562
|
}
|
|
17558
17563
|
});
|
|
17559
17564
|
|
|
17565
|
+
// src/process/js/js-thread.ts
|
|
17566
|
+
function outOfMemory(err) {
|
|
17567
|
+
return err instanceof RangeError && OOM.test(err.message);
|
|
17568
|
+
}
|
|
17569
|
+
function optionsOf(options) {
|
|
17570
|
+
if (options === void 0) return {};
|
|
17571
|
+
if (typeof options !== "object" || options === null || Array.isArray(options)) {
|
|
17572
|
+
throw new JsCallError("EINVAL", "thread.spawn");
|
|
17573
|
+
}
|
|
17574
|
+
const { transfer } = options;
|
|
17575
|
+
if (transfer !== void 0 && !Array.isArray(transfer)) {
|
|
17576
|
+
throw new JsCallError("EINVAL", "thread.spawn");
|
|
17577
|
+
}
|
|
17578
|
+
return options;
|
|
17579
|
+
}
|
|
17580
|
+
function started(port2, control) {
|
|
17581
|
+
const exited = Promise.withResolvers();
|
|
17582
|
+
return new Promise((resolve, reject) => {
|
|
17583
|
+
const thread = (tid) => Object.freeze({
|
|
17584
|
+
tid,
|
|
17585
|
+
port: port2,
|
|
17586
|
+
exited: exited.promise,
|
|
17587
|
+
async terminate() {
|
|
17588
|
+
control.postMessage({ terminate: true });
|
|
17589
|
+
await exited.promise;
|
|
17590
|
+
}
|
|
17591
|
+
});
|
|
17592
|
+
control.onmessage = (event) => {
|
|
17593
|
+
const said = event.data;
|
|
17594
|
+
if ("tid" in said) resolve(thread(said.tid));
|
|
17595
|
+
else if ("errno" in said) {
|
|
17596
|
+
control.close();
|
|
17597
|
+
port2.close();
|
|
17598
|
+
reject(new JsCallError(said.errno, "thread.spawn", said.message));
|
|
17599
|
+
} else if ("exited" in said) {
|
|
17600
|
+
control.close();
|
|
17601
|
+
exited.resolve(said.exited);
|
|
17602
|
+
}
|
|
17603
|
+
};
|
|
17604
|
+
});
|
|
17605
|
+
}
|
|
17606
|
+
function threadContext(post2, start2) {
|
|
17607
|
+
const spawn = (options) => {
|
|
17608
|
+
let asked;
|
|
17609
|
+
try {
|
|
17610
|
+
asked = optionsOf(options);
|
|
17611
|
+
} catch (err) {
|
|
17612
|
+
return Promise.reject(err);
|
|
17613
|
+
}
|
|
17614
|
+
const channel = new NativeChannel();
|
|
17615
|
+
const control = new NativeChannel();
|
|
17616
|
+
const transfer = [...asked.transfer ?? []];
|
|
17617
|
+
const msg = {
|
|
17618
|
+
type: JS_THREAD_SPAWN,
|
|
17619
|
+
data: asked.data,
|
|
17620
|
+
port: channel.port2,
|
|
17621
|
+
control: control.port2,
|
|
17622
|
+
transfer
|
|
17623
|
+
};
|
|
17624
|
+
try {
|
|
17625
|
+
post2.postMessage(msg, [channel.port2, control.port2, ...transfer]);
|
|
17626
|
+
} catch (err) {
|
|
17627
|
+
channel.port1.close();
|
|
17628
|
+
control.port1.close();
|
|
17629
|
+
return Promise.reject(err);
|
|
17630
|
+
}
|
|
17631
|
+
return started(channel.port1, control.port1);
|
|
17632
|
+
};
|
|
17633
|
+
return Object.freeze({
|
|
17634
|
+
tid: start2?.tid ?? 0,
|
|
17635
|
+
port: start2?.port,
|
|
17636
|
+
data: start2?.data,
|
|
17637
|
+
NO_MEMORY: JS_THREAD_NO_MEMORY,
|
|
17638
|
+
CRASHED: JS_THREAD_CRASHED,
|
|
17639
|
+
spawn
|
|
17640
|
+
});
|
|
17641
|
+
}
|
|
17642
|
+
var NativeChannel, OOM;
|
|
17643
|
+
var init_js_thread = __esm({
|
|
17644
|
+
"src/process/js/js-thread.ts"() {
|
|
17645
|
+
"use strict";
|
|
17646
|
+
init_protocol();
|
|
17647
|
+
init_js_kernel();
|
|
17648
|
+
NativeChannel = globalThis.MessageChannel;
|
|
17649
|
+
OOM = /out of memory|Array buffer allocation failed|Cannot allocate Wasm memory/i;
|
|
17650
|
+
}
|
|
17651
|
+
});
|
|
17652
|
+
|
|
17560
17653
|
// src/process/js/js-runtime.ts
|
|
17561
17654
|
var js_runtime_exports = {};
|
|
17562
17655
|
__export(js_runtime_exports, {
|
|
17563
17656
|
mainOf: () => mainOf,
|
|
17564
17657
|
runJsProcess: () => runJsProcess,
|
|
17658
|
+
runJsThread: () => runJsThread,
|
|
17565
17659
|
trapStrays: () => trapStrays
|
|
17566
17660
|
});
|
|
17567
17661
|
function trapStrays(scope2, stray) {
|
|
@@ -17592,7 +17686,15 @@ function mainOf(module) {
|
|
|
17592
17686
|
const main = typeof module.default === "function" ? module.default : module.main;
|
|
17593
17687
|
return typeof main === "function" ? main : void 0;
|
|
17594
17688
|
}
|
|
17595
|
-
|
|
17689
|
+
function runJsProcess(init, port2, deps = {}) {
|
|
17690
|
+
return runJs(init, port2, deps, void 0);
|
|
17691
|
+
}
|
|
17692
|
+
function runJsThread(init, port2, deps = {}) {
|
|
17693
|
+
const { thread, ...rest2 } = init;
|
|
17694
|
+
return runJs(rest2, port2, deps, thread);
|
|
17695
|
+
}
|
|
17696
|
+
async function runJs(init, port2, deps, thread) {
|
|
17697
|
+
const failed5 = (err) => thread && outOfMemory(err) ? JS_THREAD_NO_MEMORY : 1;
|
|
17596
17698
|
const transport = createAsyncSabTransport(init.sab, port2, deps.waitAsync);
|
|
17597
17699
|
let resolveExit;
|
|
17598
17700
|
const exit = new Promise((resolve) => resolveExit = resolve);
|
|
@@ -17604,7 +17706,7 @@ async function runJsProcess(init, port2, deps = {}) {
|
|
|
17604
17706
|
let failing;
|
|
17605
17707
|
const fail = (err) => {
|
|
17606
17708
|
if (err instanceof JsExit) return;
|
|
17607
|
-
failing ??= say(message(err)).then(() => exited(
|
|
17709
|
+
failing ??= (thread ? Promise.resolve() : say(message(err))).then(() => exited(failed5(err)));
|
|
17608
17710
|
};
|
|
17609
17711
|
const kernel = new JsKernel({
|
|
17610
17712
|
sab: init.sab,
|
|
@@ -17625,7 +17727,8 @@ async function runJsProcess(init, port2, deps = {}) {
|
|
|
17625
17727
|
cwd: init.cwd,
|
|
17626
17728
|
exit: (status3) => exited(statusOf(status3)),
|
|
17627
17729
|
lane: laneOf(init.lane),
|
|
17628
|
-
strays
|
|
17730
|
+
strays,
|
|
17731
|
+
thread: threadContext(port2, thread)
|
|
17629
17732
|
});
|
|
17630
17733
|
const say = (text) => ctx.write(2, `${init.argv0}: ${text}
|
|
17631
17734
|
`).catch(() => void 0);
|
|
@@ -17656,8 +17759,8 @@ async function runJsProcess(init, port2, deps = {}) {
|
|
|
17656
17759
|
const program = main;
|
|
17657
17760
|
const ran = Promise.resolve().then(() => program(ctx)).then(statusOf, async (err) => {
|
|
17658
17761
|
if (err instanceof JsExit) return err.status;
|
|
17659
|
-
await say(message(err));
|
|
17660
|
-
return
|
|
17762
|
+
if (!thread) await say(message(err));
|
|
17763
|
+
return failed5(err);
|
|
17661
17764
|
});
|
|
17662
17765
|
const status2 = await Promise.race([ran, exit]);
|
|
17663
17766
|
await drain2();
|
|
@@ -17670,11 +17773,13 @@ var NOT_RUNNABLE;
|
|
|
17670
17773
|
var init_js_runtime = __esm({
|
|
17671
17774
|
"src/process/js/js-runtime.ts"() {
|
|
17672
17775
|
"use strict";
|
|
17776
|
+
init_protocol();
|
|
17673
17777
|
init_wasi_imports();
|
|
17674
17778
|
init_async_sab();
|
|
17675
17779
|
init_js_context();
|
|
17676
17780
|
init_js_kernel();
|
|
17677
17781
|
init_js_sync();
|
|
17782
|
+
init_js_thread();
|
|
17678
17783
|
init_lockdown();
|
|
17679
17784
|
NOT_RUNNABLE = 126;
|
|
17680
17785
|
}
|
|
@@ -17690,7 +17795,7 @@ init_process_runtime();
|
|
|
17690
17795
|
var loadWasi = () => Promise.resolve().then(() => (init_wasi_runtime(), wasi_runtime_exports));
|
|
17691
17796
|
var loadJs = () => Promise.resolve().then(() => (init_js_runtime(), js_runtime_exports));
|
|
17692
17797
|
var NOT_RUNNABLE2 = 126;
|
|
17693
|
-
function
|
|
17798
|
+
function started2(init, port2, run, wasi, js) {
|
|
17694
17799
|
if (init.program?.abi === "js") {
|
|
17695
17800
|
const jsInit = init;
|
|
17696
17801
|
return js().then((m) => m.runJsProcess(jsInit, port2));
|
|
@@ -17720,8 +17825,19 @@ function processEntry(port2, run = runWasmProcess, wasi = loadWasi, js = loadJs,
|
|
|
17720
17825
|
};
|
|
17721
17826
|
return (data) => {
|
|
17722
17827
|
const type = data?.type;
|
|
17723
|
-
if (type !== WASM_THREAD_INIT && type !== WASM_PROCESS_INIT) return;
|
|
17828
|
+
if (type !== WASM_THREAD_INIT && type !== WASM_PROCESS_INIT && type !== JS_THREAD_INIT) return;
|
|
17724
17829
|
const refusal2 = sealOnce();
|
|
17830
|
+
if (type === JS_THREAD_INIT) {
|
|
17831
|
+
if (refusal2) return failed5(refusal2.error);
|
|
17832
|
+
js().then((m) => {
|
|
17833
|
+
if (!m.runJsThread) throw new Error("this process worker runs no JS threads");
|
|
17834
|
+
return m.runJsThread(data, port2);
|
|
17835
|
+
}).then(
|
|
17836
|
+
(code2) => port2.postMessage({ type: JS_THREAD_EXIT, code: code2 }),
|
|
17837
|
+
failed5
|
|
17838
|
+
);
|
|
17839
|
+
return;
|
|
17840
|
+
}
|
|
17725
17841
|
const init = data;
|
|
17726
17842
|
if (type === WASM_THREAD_INIT || init?.program?.abi !== "js") useLocalClock(init?.sab);
|
|
17727
17843
|
if (type === WASM_THREAD_INIT) {
|
|
@@ -17730,7 +17846,7 @@ function processEntry(port2, run = runWasmProcess, wasi = loadWasi, js = loadJs,
|
|
|
17730
17846
|
return;
|
|
17731
17847
|
}
|
|
17732
17848
|
if (refusal2) return failed5(refusal2.error, NOT_RUNNABLE2);
|
|
17733
|
-
|
|
17849
|
+
started2(data, port2, run, wasi, js).then(
|
|
17734
17850
|
(code2) => port2.postMessage({ type: WASM_PROCESS_EXIT, code: code2 }),
|
|
17735
17851
|
failed5
|
|
17736
17852
|
);
|
|
@@ -17742,7 +17858,7 @@ init_process_fds();
|
|
|
17742
17858
|
var scope = globalThis;
|
|
17743
17859
|
var post = scope.postMessage.bind(scope);
|
|
17744
17860
|
var onMessage = processEntry(
|
|
17745
|
-
{ postMessage: (message2) => post(message2) },
|
|
17861
|
+
{ postMessage: (message2, transfer) => post(message2, transfer ?? []) },
|
|
17746
17862
|
void 0,
|
|
17747
17863
|
void 0,
|
|
17748
17864
|
void 0,
|