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