@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.
@@ -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.129.0" : "0.0.0-dev";
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 ppid() {
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
- async function runJsProcess(init, port3, deps = {}) {
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(1));
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 1;
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 started(init, port3, run, wasi, js) {
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
- started(data, port3, run, wasi, js).then(
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 = { postMessage: (message2) => port2.postMessage(message2) };
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
  );