@ai-ecoverse/slicc-kernel 1.44.0 → 1.45.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.
@@ -1465,7 +1465,7 @@ var init_sync_sab_wire = __esm({
1465
1465
  function createSyncSabTransport(sab, port2, deps = {}) {
1466
1466
  const views = sabViews(sab);
1467
1467
  const { header, window } = views;
1468
- const wait = deps.wait ?? ((a, i, v, t) => Atomics.wait(a, i, v, t));
1468
+ const wait2 = deps.wait ?? ((a, i, v, t) => Atomics.wait(a, i, v, t));
1469
1469
  const now = deps.now ?? (() => performance.now());
1470
1470
  let seq = 0;
1471
1471
  function awaitReady(id, deadline, label) {
@@ -1476,7 +1476,7 @@ function createSyncSabTransport(sab, port2, deps = {}) {
1476
1476
  }
1477
1477
  const remaining = deadline - now();
1478
1478
  if (remaining <= 0) throw syncError("ETIMEDOUT", label);
1479
- wait(header, SAB_I_PUB, published, remaining);
1479
+ wait2(header, SAB_I_PUB, published, remaining);
1480
1480
  }
1481
1481
  }
1482
1482
  return {
@@ -4033,12 +4033,12 @@ async function runWasmProcess(init, port2, deps = {}) {
4033
4033
  const say = (fd) => (text) => sys.write(fd, encoder4.encode(`${text}
4034
4034
  `));
4035
4035
  let ready;
4036
- let failed2;
4036
+ let failed3;
4037
4037
  let memory;
4038
4038
  let exports;
4039
4039
  const initialized = new Promise((resolve, reject) => {
4040
4040
  ready = resolve;
4041
- failed2 = reject;
4041
+ failed3 = reject;
4042
4042
  });
4043
4043
  const id = identify(transport, init);
4044
4044
  const module = {
@@ -4091,7 +4091,7 @@ async function runWasmProcess(init, port2, deps = {}) {
4091
4091
  exports = instance.exports;
4092
4092
  publishMemory(init.sab, memory?.buffer.byteLength ?? 0);
4093
4093
  done(instance, init.program.module);
4094
- }, failed2);
4094
+ }, failed3);
4095
4095
  return {};
4096
4096
  },
4097
4097
  preRun: [
@@ -7748,7 +7748,7 @@ var init_wasix_host = __esm({
7748
7748
  }
7749
7749
  dlImports() {
7750
7750
  const { mem, host } = this;
7751
- const failed2 = (message2, buf, len) => {
7751
+ const failed3 = (message2, buf, len) => {
7752
7752
  if (len > 0) {
7753
7753
  const bytes = new TextEncoder().encode(message2).subarray(0, len - 1);
7754
7754
  mem.bytes(buf, bytes.length).set(bytes);
@@ -7757,12 +7757,12 @@ var init_wasix_host = __esm({
7757
7757
  return E.NOEXEC;
7758
7758
  };
7759
7759
  const linked = (buf, len, op, out) => {
7760
- if (!this.linker) return failed2("not a dynamically-linked program", buf, len);
7760
+ if (!this.linker) return failed3("not a dynamically-linked program", buf, len);
7761
7761
  try {
7762
7762
  out(op(this.linker));
7763
7763
  return E.SUCCESS;
7764
7764
  } catch (e) {
7765
- if (e instanceof DlError) return failed2(e.message, buf, len);
7765
+ if (e instanceof DlError) return failed3(e.message, buf, len);
7766
7766
  throw e;
7767
7767
  }
7768
7768
  };
@@ -8680,7 +8680,7 @@ function writable(io, fd) {
8680
8680
  });
8681
8681
  }
8682
8682
  function childOps(kernel, io, defaults) {
8683
- const wait = async (pid) => {
8683
+ const wait2 = async (pid) => {
8684
8684
  const r = await kernel.blocking({ op: "proc-wait", pid, nohang: false });
8685
8685
  const [, status2] = r.ok && r.kind === "json" ? r.json : [0, 0];
8686
8686
  return exitedOf(status2);
@@ -8695,7 +8695,7 @@ function childOps(kernel, io, defaults) {
8695
8695
  ...stdin !== void 0 ? { stdin: writable(io, stdin) } : {},
8696
8696
  ...stdout !== void 0 ? { stdout: readable(io, stdout) } : {},
8697
8697
  ...stderr !== void 0 ? { stderr: readable(io, stderr) } : {},
8698
- wait: () => wait(pid),
8698
+ wait: () => wait2(pid),
8699
8699
  kill: (signal) => kill(pid, signal)
8700
8700
  };
8701
8701
  };
@@ -8722,7 +8722,7 @@ function childOps(kernel, io, defaults) {
8722
8722
  await closeAll(io, theirs);
8723
8723
  }
8724
8724
  };
8725
- return { spawn, wait, kill };
8725
+ return { spawn, wait: wait2, kill };
8726
8726
  }
8727
8727
  async function closeAll(io, fds) {
8728
8728
  for (const fd of fds) if (fd !== void 0) await io.close(fd).catch(() => void 0);
@@ -8966,13 +8966,13 @@ function netOps(kernel, io) {
8966
8966
  const r = await kernel.raw({ op: "sock-connect", fd, addr, nonblock: true });
8967
8967
  if (!r.ok && r.errno !== "EINPROGRESS") throw new JsCallError(r.errno, "connect");
8968
8968
  await kernel.blocking({ op: "fd-select", read: [], write: [fd], timeoutMs: -1 }, signal);
8969
- const failed2 = await kernel.json({
8969
+ const failed3 = await kernel.json({
8970
8970
  op: "sock-getopt",
8971
8971
  fd,
8972
8972
  level: SOL_SOCKET,
8973
8973
  name: SO_ERROR
8974
8974
  });
8975
- if (failed2 !== 0) throw new JsCallError(errnoName(failed2), "connect");
8975
+ if (failed3 !== 0) throw new JsCallError(errnoName(failed3), "connect");
8976
8976
  return connection(fd);
8977
8977
  });
8978
8978
  }
@@ -9216,6 +9216,156 @@ var init_js_sync = __esm({
9216
9216
  }
9217
9217
  });
9218
9218
 
9219
+ // src/process/js/js-websocket.ts
9220
+ function failed2(err) {
9221
+ return new TypeError("websocket failed", { cause: err });
9222
+ }
9223
+ function socketUrl(input) {
9224
+ const url = new URL(input);
9225
+ if (url.protocol === "http:") url.protocol = "ws:";
9226
+ else if (url.protocol === "https:") url.protocol = "wss:";
9227
+ if (url.protocol !== "ws:" && url.protocol !== "wss:") {
9228
+ throw new SyntaxError(`not a WebSocket URL: ${url.href}`);
9229
+ }
9230
+ url.hash = "";
9231
+ return url.href;
9232
+ }
9233
+ function closeCode(code2) {
9234
+ if (code2 === void 0) return 1e3;
9235
+ if (code2 === 1e3 || code2 >= 3e3 && code2 <= 4999) return code2;
9236
+ throw new JsCallError("EINVAL", `close code ${code2}`);
9237
+ }
9238
+ function closeReason(reason) {
9239
+ if (reason === void 0) return "";
9240
+ if (new TextEncoder().encode(reason).length > MAX_REASON) {
9241
+ throw new JsCallError("EINVAL", `close reason over ${MAX_REASON} bytes`);
9242
+ }
9243
+ return reason;
9244
+ }
9245
+ function websocketOp(kernel) {
9246
+ return async (input, options = {}) => {
9247
+ const url = socketUrl(input);
9248
+ const signal = options.signal ?? NEVER2;
9249
+ signal.throwIfAborted();
9250
+ const protocols = typeof options.protocols === "string" ? [options.protocols] : options.protocols ?? [];
9251
+ const handle = await kernel.json({
9252
+ op: "net-ws-open",
9253
+ url,
9254
+ protocols,
9255
+ headers: [...new Headers(options.headers)]
9256
+ });
9257
+ const free = () => kernel.raw({ op: "net-close", handle });
9258
+ let protocol;
9259
+ try {
9260
+ const r = await kernel.blocking({ op: "net-ws-ready", handle }, signal);
9261
+ protocol = (r.ok && r.kind === "json" ? r.json : {}).protocol;
9262
+ } catch (err) {
9263
+ await free();
9264
+ throw signal.aborted ? signal.reason : failed2(err);
9265
+ }
9266
+ let settle;
9267
+ let lose;
9268
+ const closed = new Promise((resolve, reject) => {
9269
+ settle = resolve;
9270
+ lose = reject;
9271
+ });
9272
+ closed.catch(() => void 0);
9273
+ const stop = new AbortController();
9274
+ let freed = false;
9275
+ const onAbort = () => hardStop(signal.reason);
9276
+ const finish = () => {
9277
+ freed = true;
9278
+ signal.removeEventListener("abort", onAbort);
9279
+ void free();
9280
+ };
9281
+ const hardStop = (reason) => {
9282
+ if (stop.signal.aborted) return;
9283
+ stop.abort(reason);
9284
+ lose(reason);
9285
+ finish();
9286
+ };
9287
+ signal.addEventListener("abort", onAbort, { once: true });
9288
+ let settled = false;
9289
+ let readDone = false;
9290
+ const release = () => {
9291
+ if (!settled || !readDone || freed) return;
9292
+ finish();
9293
+ };
9294
+ kernel.blocking({ op: "net-ws-wait", handle }, stop.signal).then((r) => {
9295
+ settled = true;
9296
+ settle(r.json);
9297
+ release();
9298
+ }).catch(lose);
9299
+ const close = (how = {}) => {
9300
+ void kernel.raw({
9301
+ op: "net-ws-close",
9302
+ handle,
9303
+ code: closeCode(how.code),
9304
+ reason: closeReason(how.reason)
9305
+ });
9306
+ };
9307
+ const readable2 = new ReadableStream(
9308
+ {
9309
+ async pull(controller) {
9310
+ let r;
9311
+ try {
9312
+ r = await kernel.blocking({ op: "net-ws-recv", handle }, stop.signal);
9313
+ } catch (err) {
9314
+ hardStop(stop.signal.aborted ? stop.signal.reason : failed2(err));
9315
+ throw stop.signal.reason;
9316
+ }
9317
+ stop.signal.throwIfAborted();
9318
+ if (r.ok && r.kind === "bytes") {
9319
+ controller.enqueue(r.bytes);
9320
+ return;
9321
+ }
9322
+ const text = (r.ok && r.kind === "json" ? r.json : {}).text;
9323
+ if (text !== void 0) {
9324
+ controller.enqueue(text);
9325
+ return;
9326
+ }
9327
+ controller.close();
9328
+ readDone = true;
9329
+ release();
9330
+ },
9331
+ cancel: () => {
9332
+ close();
9333
+ readDone = true;
9334
+ release();
9335
+ }
9336
+ },
9337
+ { highWaterMark: 0 }
9338
+ );
9339
+ const writable2 = new WritableStream({
9340
+ async write(chunk, controller) {
9341
+ stop.signal.throwIfAborted();
9342
+ const body = typeof chunk === "string" ? { text: chunk } : { body: chunk };
9343
+ let buffered = await kernel.json({ op: "net-ws-send", handle, ...body });
9344
+ while (buffered > SEND_BUFFER) {
9345
+ await wait(10);
9346
+ stop.signal.throwIfAborted();
9347
+ controller.signal.throwIfAborted();
9348
+ buffered = await kernel.json({ op: "net-ws-send", handle });
9349
+ }
9350
+ },
9351
+ close: () => close(),
9352
+ abort: () => close({ code: 1e3, reason: "" })
9353
+ });
9354
+ return { url, protocol, readable: readable2, writable: writable2, closed, close };
9355
+ };
9356
+ }
9357
+ var SEND_BUFFER, MAX_REASON, NEVER2, wait;
9358
+ var init_js_websocket = __esm({
9359
+ "src/process/js/js-websocket.ts"() {
9360
+ "use strict";
9361
+ init_js_kernel();
9362
+ SEND_BUFFER = 1024 * 1024;
9363
+ MAX_REASON = 123;
9364
+ NEVER2 = new AbortController().signal;
9365
+ wait = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
9366
+ }
9367
+ });
9368
+
9219
9369
  // src/process/js/js-context.ts
9220
9370
  function identityOf(answer2, fallback) {
9221
9371
  const id = answer2;
@@ -9381,6 +9531,7 @@ function createContext(o) {
9381
9531
  sync,
9382
9532
  ...children,
9383
9533
  net: netOps(kernel, io),
9534
+ websocket: websocketOp(kernel),
9384
9535
  exit
9385
9536
  };
9386
9537
  const drain2 = async () => {
@@ -9518,6 +9669,7 @@ var init_js_context = __esm({
9518
9669
  init_js_kernel();
9519
9670
  init_js_net();
9520
9671
  init_js_sync();
9672
+ init_js_websocket();
9521
9673
  JsExit = class extends Error {
9522
9674
  status;
9523
9675
  constructor(status2) {
@@ -9714,20 +9866,20 @@ function started(init, port2, run, wasi, js) {
9714
9866
  return run(wasmInit, port2);
9715
9867
  }
9716
9868
  function processEntry(port2, run = runWasmProcess, wasi = loadWasi, js = loadJs) {
9717
- const failed2 = (err) => port2.postMessage({
9869
+ const failed3 = (err) => port2.postMessage({
9718
9870
  type: WASM_PROCESS_ERROR,
9719
9871
  message: err instanceof Error ? err.stack ?? err.message : String(err)
9720
9872
  });
9721
9873
  return (data) => {
9722
9874
  const type = data?.type;
9723
9875
  if (type === WASM_THREAD_INIT) {
9724
- wasi().then((m) => m.runWasiThread(data, port2)).catch(failed2);
9876
+ wasi().then((m) => m.runWasiThread(data, port2)).catch(failed3);
9725
9877
  return;
9726
9878
  }
9727
9879
  if (type !== WASM_PROCESS_INIT) return;
9728
9880
  started(data, port2, run, wasi, js).then(
9729
9881
  (code2) => port2.postMessage({ type: WASM_PROCESS_EXIT, code: code2 }),
9730
- failed2
9882
+ failed3
9731
9883
  );
9732
9884
  };
9733
9885
  }