@ai-ecoverse/slicc-kernel 1.151.1 → 1.152.1

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.
@@ -2964,7 +2964,7 @@ var KERNEL_VERSION, OS_RELEASE;
2964
2964
  var init_version = __esm({
2965
2965
  "src/version.ts"() {
2966
2966
  "use strict";
2967
- KERNEL_VERSION = true ? "1.151.1" : "0.0.0-dev";
2967
+ KERNEL_VERSION = true ? "1.152.1" : "0.0.0-dev";
2968
2968
  OS_RELEASE = "6.0.0-slicc";
2969
2969
  }
2970
2970
  });
@@ -6114,6 +6114,8 @@ var init_procfs = __esm({
6114
6114
  slicc_rename_ack_busy: (listing2) => `${listing2.renameAcks?.busy ?? 0}
6115
6115
  `,
6116
6116
  slicc_stale_fds: (listing2) => `${listing2.staleFds ?? 0}
6117
+ `,
6118
+ slicc_file_ids: (listing2) => `${listing2.fileIds ?? 0}
6117
6119
  `,
6118
6120
  slicc_rename_acks: (listing2) => {
6119
6121
  const samples = [...listing2.renameAcks?.ackMs ?? []].sort((a, b) => a - b);
@@ -7431,12 +7433,22 @@ var init_wasi_files = __esm({
7431
7433
  }
7432
7434
  return this.data;
7433
7435
  }
7436
+ spoiled = false;
7437
+ spoil() {
7438
+ this.spoiled = true;
7439
+ this.dirty = false;
7440
+ }
7441
+ live() {
7442
+ if (this.spoiled) throw new WasiError("ESTALE");
7443
+ }
7434
7444
  size() {
7445
+ this.live();
7435
7446
  if (this.ranged) return this.ranged.size();
7436
7447
  this.load();
7437
7448
  return this.length;
7438
7449
  }
7439
7450
  pread(max, at) {
7451
+ this.live();
7440
7452
  if (this.ranged) return this.ranged.read(at, max);
7441
7453
  const bytes = this.load();
7442
7454
  const n = Math.max(0, Math.min(max, this.length - at));
@@ -7446,6 +7458,7 @@ var init_wasi_files = __esm({
7446
7458
  if (this.maxFile !== void 0 && end > this.maxFile) throw new WasiError("EFBIG");
7447
7459
  }
7448
7460
  pwrite(bytes, at) {
7461
+ this.live();
7449
7462
  if (bytes.length === 0) return 0;
7450
7463
  const end = at + bytes.length;
7451
7464
  this.fits(end);
@@ -7465,6 +7478,7 @@ var init_wasi_files = __esm({
7465
7478
  return bytes.length;
7466
7479
  }
7467
7480
  append(bytes) {
7481
+ this.live();
7468
7482
  const { append } = this.fs;
7469
7483
  if (!append || this.orphaned) return void 0;
7470
7484
  this.moved?.(false);
@@ -7477,6 +7491,7 @@ var init_wasi_files = __esm({
7477
7491
  return end;
7478
7492
  }
7479
7493
  truncate(size) {
7494
+ this.live();
7480
7495
  this.fits(size);
7481
7496
  this.dirty = true;
7482
7497
  if (this.ranged) {
@@ -7512,6 +7527,7 @@ var init_wasi_files = __esm({
7512
7527
  return this.dirty;
7513
7528
  }
7514
7529
  contents() {
7530
+ this.live();
7515
7531
  if (this.ranged) return this.ranged.read(0, this.ranged.size());
7516
7532
  return this.load().slice(0, this.length);
7517
7533
  }
@@ -7914,7 +7930,9 @@ var init_js_kernel = __esm({
7914
7930
  "sock-tls",
7915
7931
  "sock-tls-upgrade",
7916
7932
  "sock-tls-serve",
7917
- "sock-tls-listen"
7933
+ "sock-tls-listen",
7934
+ "sock-tls-context",
7935
+ "sock-tls-select"
7918
7936
  ]);
7919
7937
  JsKernel = class {
7920
7938
  header;
@@ -9443,6 +9461,15 @@ var init_wasi_fds = __esm({
9443
9461
  }
9444
9462
  }
9445
9463
  }
9464
+ synced(file) {
9465
+ try {
9466
+ file.flush();
9467
+ this.reported.delete(file.buffer);
9468
+ } catch (err) {
9469
+ this.reported.add(file.buffer);
9470
+ throw err;
9471
+ }
9472
+ }
9446
9473
  flushEarly() {
9447
9474
  for (const buffer of this.buffers.values()) {
9448
9475
  try {
@@ -9469,6 +9496,7 @@ var init_wasi_fds = __esm({
9469
9496
  try {
9470
9497
  buffer.prefetch();
9471
9498
  } catch {
9499
+ buffer.spoil();
9472
9500
  }
9473
9501
  }
9474
9502
  }
@@ -11744,7 +11772,7 @@ var init_wasi_host = __esm({
11744
11772
  }
11745
11773
  sync(fd) {
11746
11774
  const e = this.fds.get(fd);
11747
- if (e.type === "file") e.file.flush();
11775
+ if (e.type === "file") this.fds.synced(e.file);
11748
11776
  else if (e.type === "device") this.interrupted?.();
11749
11777
  else if (e.type === "kernel") {
11750
11778
  const kind = this.fds.kind(fd, e);
@@ -16607,10 +16635,13 @@ function keyText(key, what) {
16607
16635
  }
16608
16636
  function serveRequest(tls) {
16609
16637
  const own = clientCert(tls, "listen").clientCert;
16610
- if (!own)
16638
+ if (tls.select !== void 0 && typeof tls.select !== "function")
16639
+ throw new JsCallError("EINVAL", "listen", "ERR_INVALID_ARG_TYPE: select must be a function");
16640
+ if (!own && !tls.select)
16611
16641
  throw new JsCallError("EINVAL", "listen", "ERR_INVALID_ARG_VALUE: a server needs cert and key");
16612
16642
  return {
16613
- cert: own,
16643
+ ...own ? { cert: own } : {},
16644
+ ...tls.select ? { select: true } : {},
16614
16645
  ...tls.ca !== void 0 ? { ca: caList(tls.ca) } : {},
16615
16646
  ...tls.requestCert ? { requestCert: true } : {},
16616
16647
  ...tls.rejectUnauthorized === false ? { rejectUnauthorized: false } : {},
@@ -16713,12 +16744,50 @@ function port(n) {
16713
16744
  if (!Number.isInteger(n) || n < 0 || n > 65535) throw new JsCallError("EINVAL", `port ${n}`);
16714
16745
  return n;
16715
16746
  }
16716
- async function serveOn(kernel, conn, req, signal = NEVER) {
16717
- const r = await secureCall(
16718
- () => kernel.blocking({ op: "sock-tls-serve", fd: conn.fd, ...req }, signal),
16719
- "accept"
16720
- );
16721
- const wire = r.ok && r.kind === "json" ? r.json : {};
16747
+ function choiceWire(choice) {
16748
+ if (!choice) return {};
16749
+ const { context, alpn, refuse: refuse2 } = choice;
16750
+ return {
16751
+ ...context === void 0 ? {} : { context: typeof context === "number" ? context : context.fd },
16752
+ ...alpn === void 0 ? {} : { alpn: String(alpn) },
16753
+ ...refuse2 === void 0 ? {} : { refuse: ALERTS[String(refuse2)] ?? Number(refuse2) }
16754
+ };
16755
+ }
16756
+ function expiry(ms) {
16757
+ let timer;
16758
+ const late = new Promise((_, reject) => {
16759
+ timer = setTimeout(
16760
+ () => reject(new JsCallError("ERR_TLS_HANDSHAKE_TIMEOUT", "accept", "ERR_TLS_HANDSHAKE_TIMEOUT")),
16761
+ ms
16762
+ );
16763
+ });
16764
+ late.catch(() => void 0);
16765
+ return { late, clear: () => clearTimeout(timer) };
16766
+ }
16767
+ async function selected(pick, offer, ms) {
16768
+ const limit2 = expiry(ms);
16769
+ try {
16770
+ if (!pick) return { wire: {} };
16771
+ const choice = await Promise.race([pick(Object.freeze({ ...offer })), limit2.late]);
16772
+ return { wire: choiceWire(choice) };
16773
+ } catch (thrown) {
16774
+ return { wire: { refuse: ALERTS.handshake_failure }, thrown };
16775
+ } finally {
16776
+ limit2.clear();
16777
+ }
16778
+ }
16779
+ async function serveOn(kernel, conn, req, signal = NEVER, pick, ms = HANDSHAKE_TIMEOUT_MS) {
16780
+ const call2 = (body) => secureCall(async () => {
16781
+ const r = await kernel.blocking(body, signal);
16782
+ return r.ok && r.kind === "json" ? r.json : {};
16783
+ }, "accept");
16784
+ let wire = await call2({ op: "sock-tls-serve", fd: conn.fd, ...req });
16785
+ while (wire.select) {
16786
+ const { wire: choice, thrown } = await selected(pick, wire.select, ms);
16787
+ wire = await call2({ op: "sock-tls-select", fd: conn.fd, ...choice }).catch((err) => {
16788
+ throw thrown ?? err;
16789
+ });
16790
+ }
16722
16791
  return Object.assign(Object.create(conn), { tls: servedOf(wire) });
16723
16792
  }
16724
16793
  function changeOf(waiters, signal) {
@@ -16788,7 +16857,7 @@ function securedAccepts(plain2, serve, stop, cap) {
16788
16857
  }
16789
16858
  };
16790
16859
  }
16791
- function listenerOf(ops, fd, at, handshakes) {
16860
+ function listenerOf(ops, fd, at, handshakes, tls) {
16792
16861
  const { kernel, io, connection, serve } = ops;
16793
16862
  const stop = new AbortController();
16794
16863
  const acceptPlain = async (signal) => {
@@ -16800,7 +16869,12 @@ function listenerOf(ops, fd, at, handshakes) {
16800
16869
  await kernel.blocking({ op: "fd-select", read: [fd], write: [], timeoutMs: -1 }, signal);
16801
16870
  }
16802
16871
  };
16803
- const next2 = handshakes > 0 ? securedAccepts(acceptPlain, (c, s) => serve(c, { from: fd }, s), stop.signal, handshakes) : acceptPlain;
16872
+ const next2 = handshakes > 0 ? securedAccepts(
16873
+ acceptPlain,
16874
+ (c, s) => serve(c, { from: fd }, s, tls?.select, tls?.handshakeTimeout),
16875
+ stop.signal,
16876
+ handshakes
16877
+ ) : acceptPlain;
16804
16878
  const accept = (options = {}) => next2(AbortSignal.any([options.signal ?? NEVER, stop.signal]));
16805
16879
  return {
16806
16880
  fd,
@@ -16822,6 +16896,27 @@ function listenerOf(ops, fd, at, handshakes) {
16822
16896
  }
16823
16897
  };
16824
16898
  }
16899
+ async function contextOf(kernel, io, options) {
16900
+ const own = clientCert(options ?? {}, "tlsContext").clientCert;
16901
+ if (!own)
16902
+ throw new JsCallError(
16903
+ "EINVAL",
16904
+ "tlsContext",
16905
+ "ERR_INVALID_ARG_VALUE: a context needs cert and key"
16906
+ );
16907
+ const fd = await secureCall(
16908
+ () => kernel.json({ op: "sock-tls-context", cert: own }),
16909
+ "tlsContext"
16910
+ );
16911
+ let closed;
16912
+ return Object.freeze({
16913
+ fd,
16914
+ close: () => {
16915
+ closed ??= io.close(fd);
16916
+ return closed;
16917
+ }
16918
+ });
16919
+ }
16825
16920
  function capOf(options, tls) {
16826
16921
  return tls ? Math.max(1, Math.min(options.backlog ?? 128, HANDSHAKES_MAX)) : 0;
16827
16922
  }
@@ -16872,9 +16967,9 @@ function netOps(kernel, io, sync) {
16872
16967
  throw err;
16873
16968
  }
16874
16969
  };
16875
- const serve = (conn, req, signal) => serveOn(kernel, conn, req, signal);
16970
+ const serve = (...args) => serveOn(kernel, ...args);
16876
16971
  const ops = { kernel, io, connection, serve };
16877
- const listener = (fd, at, handshakes = 0) => listenerOf(ops, fd, at, handshakes);
16972
+ const listener = (fd, at, handshakes = 0, tls) => listenerOf(ops, fd, at, handshakes, tls);
16878
16973
  const connect = async (options) => {
16879
16974
  const signal = options.signal ?? NEVER;
16880
16975
  const host = options.host ?? "127.0.0.1";
@@ -16960,7 +17055,7 @@ function netOps(kernel, io, sync) {
16960
17055
  lane.call({ op: "sock-listen", fd, backlog: options.backlog ?? 128 });
16961
17056
  if (tls) lane.call({ op: "sock-tls-listen", fd, ...tls });
16962
17057
  const at = addressOf(lane.json({ op: "sock-name", fd, peer: false }));
16963
- return listener(fd, at, capOf(options, tls));
17058
+ return listener(fd, at, capOf(options, tls), options.tls);
16964
17059
  } catch (err) {
16965
17060
  lane.raw({ op: "fd-close", fd });
16966
17061
  throw err;
@@ -16977,20 +17072,21 @@ function netOps(kernel, io, sync) {
16977
17072
  await kernel.call({ op: "sock-listen", fd, backlog: options.backlog ?? 128 });
16978
17073
  if (tls)
16979
17074
  await secureCall(() => kernel.call({ op: "sock-tls-listen", fd, ...tls }), "listen");
16980
- return listener(fd, await name2(fd, false), capOf(options, tls));
17075
+ return listener(fd, await name2(fd, false), capOf(options, tls), options.tls);
16981
17076
  });
16982
17077
  },
16983
17078
  secure: async (conn, tls) => {
16984
17079
  if (tls.server !== true) return tlsConnect({ socket: conn }, tls);
16985
- return serve(conn, serveRequest(tls));
17080
+ return serve(conn, serveRequest(tls), void 0, tls.select, tls.handshakeTimeout);
16986
17081
  },
17082
+ tlsContext: (options) => contextOf(kernel, io, options),
16987
17083
  connect: (options) => {
16988
17084
  (options.signal ?? NEVER).throwIfAborted();
16989
17085
  return options.tls ? tlsConnect(options, options.tls) : connect(options);
16990
17086
  }
16991
17087
  };
16992
17088
  }
16993
- var PEM, TLS_CODE, ALERT, SHUT_RD, SHUT_WR, LOOPBACK3, IPV4, NEVER, SOL_SOCKET2, SO_ERROR2, HANDSHAKES_MAX;
17089
+ var PEM, TLS_CODE, ALERT, SHUT_RD, SHUT_WR, LOOPBACK3, IPV4, NEVER, SOL_SOCKET2, SO_ERROR2, ALERTS, HANDSHAKE_TIMEOUT_MS, HANDSHAKES_MAX;
16994
17090
  var init_js_net = __esm({
16995
17091
  "src/process/js/js-net.ts"() {
16996
17092
  "use strict";
@@ -17006,6 +17102,14 @@ var init_js_net = __esm({
17006
17102
  NEVER = new AbortController().signal;
17007
17103
  SOL_SOCKET2 = 1;
17008
17104
  SO_ERROR2 = 4;
17105
+ ALERTS = {
17106
+ unrecognized_name: 112,
17107
+ no_application_protocol: 120,
17108
+ handshake_failure: 40,
17109
+ access_denied: 49,
17110
+ internal_error: 80
17111
+ };
17112
+ HANDSHAKE_TIMEOUT_MS = 12e4;
17009
17113
  HANDSHAKES_MAX = 64;
17010
17114
  }
17011
17115
  });