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