@ai-ecoverse/slicc-kernel 1.151.0 → 1.152.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.
@@ -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.0" : "0.0.0-dev";
2967
+ KERNEL_VERSION = true ? "1.152.0" : "0.0.0-dev";
2968
2968
  OS_RELEASE = "6.0.0-slicc";
2969
2969
  }
2970
2970
  });
@@ -7914,7 +7914,9 @@ var init_js_kernel = __esm({
7914
7914
  "sock-tls",
7915
7915
  "sock-tls-upgrade",
7916
7916
  "sock-tls-serve",
7917
- "sock-tls-listen"
7917
+ "sock-tls-listen",
7918
+ "sock-tls-context",
7919
+ "sock-tls-select"
7918
7920
  ]);
7919
7921
  JsKernel = class {
7920
7922
  header;
@@ -16607,10 +16609,13 @@ function keyText(key, what) {
16607
16609
  }
16608
16610
  function serveRequest(tls) {
16609
16611
  const own = clientCert(tls, "listen").clientCert;
16610
- if (!own)
16612
+ if (tls.select !== void 0 && typeof tls.select !== "function")
16613
+ throw new JsCallError("EINVAL", "listen", "ERR_INVALID_ARG_TYPE: select must be a function");
16614
+ if (!own && !tls.select)
16611
16615
  throw new JsCallError("EINVAL", "listen", "ERR_INVALID_ARG_VALUE: a server needs cert and key");
16612
16616
  return {
16613
- cert: own,
16617
+ ...own ? { cert: own } : {},
16618
+ ...tls.select ? { select: true } : {},
16614
16619
  ...tls.ca !== void 0 ? { ca: caList(tls.ca) } : {},
16615
16620
  ...tls.requestCert ? { requestCert: true } : {},
16616
16621
  ...tls.rejectUnauthorized === false ? { rejectUnauthorized: false } : {},
@@ -16713,12 +16718,50 @@ function port(n) {
16713
16718
  if (!Number.isInteger(n) || n < 0 || n > 65535) throw new JsCallError("EINVAL", `port ${n}`);
16714
16719
  return n;
16715
16720
  }
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 : {};
16721
+ function choiceWire(choice) {
16722
+ if (!choice) return {};
16723
+ const { context, alpn, refuse: refuse2 } = choice;
16724
+ return {
16725
+ ...context === void 0 ? {} : { context: typeof context === "number" ? context : context.fd },
16726
+ ...alpn === void 0 ? {} : { alpn: String(alpn) },
16727
+ ...refuse2 === void 0 ? {} : { refuse: ALERTS[String(refuse2)] ?? Number(refuse2) }
16728
+ };
16729
+ }
16730
+ function expiry(ms) {
16731
+ let timer;
16732
+ const late = new Promise((_, reject) => {
16733
+ timer = setTimeout(
16734
+ () => reject(new JsCallError("ERR_TLS_HANDSHAKE_TIMEOUT", "accept", "ERR_TLS_HANDSHAKE_TIMEOUT")),
16735
+ ms
16736
+ );
16737
+ });
16738
+ late.catch(() => void 0);
16739
+ return { late, clear: () => clearTimeout(timer) };
16740
+ }
16741
+ async function selected(pick, offer, ms) {
16742
+ const limit2 = expiry(ms);
16743
+ try {
16744
+ if (!pick) return { wire: {} };
16745
+ const choice = await Promise.race([pick(Object.freeze({ ...offer })), limit2.late]);
16746
+ return { wire: choiceWire(choice) };
16747
+ } catch (thrown) {
16748
+ return { wire: { refuse: ALERTS.handshake_failure }, thrown };
16749
+ } finally {
16750
+ limit2.clear();
16751
+ }
16752
+ }
16753
+ async function serveOn(kernel, conn, req, signal = NEVER, pick, ms = HANDSHAKE_TIMEOUT_MS) {
16754
+ const call2 = (body) => secureCall(async () => {
16755
+ const r = await kernel.blocking(body, signal);
16756
+ return r.ok && r.kind === "json" ? r.json : {};
16757
+ }, "accept");
16758
+ let wire = await call2({ op: "sock-tls-serve", fd: conn.fd, ...req });
16759
+ while (wire.select) {
16760
+ const { wire: choice, thrown } = await selected(pick, wire.select, ms);
16761
+ wire = await call2({ op: "sock-tls-select", fd: conn.fd, ...choice }).catch((err) => {
16762
+ throw thrown ?? err;
16763
+ });
16764
+ }
16722
16765
  return Object.assign(Object.create(conn), { tls: servedOf(wire) });
16723
16766
  }
16724
16767
  function changeOf(waiters, signal) {
@@ -16788,7 +16831,7 @@ function securedAccepts(plain2, serve, stop, cap) {
16788
16831
  }
16789
16832
  };
16790
16833
  }
16791
- function listenerOf(ops, fd, at, handshakes) {
16834
+ function listenerOf(ops, fd, at, handshakes, tls) {
16792
16835
  const { kernel, io, connection, serve } = ops;
16793
16836
  const stop = new AbortController();
16794
16837
  const acceptPlain = async (signal) => {
@@ -16800,7 +16843,12 @@ function listenerOf(ops, fd, at, handshakes) {
16800
16843
  await kernel.blocking({ op: "fd-select", read: [fd], write: [], timeoutMs: -1 }, signal);
16801
16844
  }
16802
16845
  };
16803
- const next2 = handshakes > 0 ? securedAccepts(acceptPlain, (c, s) => serve(c, { from: fd }, s), stop.signal, handshakes) : acceptPlain;
16846
+ const next2 = handshakes > 0 ? securedAccepts(
16847
+ acceptPlain,
16848
+ (c, s) => serve(c, { from: fd }, s, tls?.select, tls?.handshakeTimeout),
16849
+ stop.signal,
16850
+ handshakes
16851
+ ) : acceptPlain;
16804
16852
  const accept = (options = {}) => next2(AbortSignal.any([options.signal ?? NEVER, stop.signal]));
16805
16853
  return {
16806
16854
  fd,
@@ -16822,6 +16870,27 @@ function listenerOf(ops, fd, at, handshakes) {
16822
16870
  }
16823
16871
  };
16824
16872
  }
16873
+ async function contextOf(kernel, io, options) {
16874
+ const own = clientCert(options ?? {}, "tlsContext").clientCert;
16875
+ if (!own)
16876
+ throw new JsCallError(
16877
+ "EINVAL",
16878
+ "tlsContext",
16879
+ "ERR_INVALID_ARG_VALUE: a context needs cert and key"
16880
+ );
16881
+ const fd = await secureCall(
16882
+ () => kernel.json({ op: "sock-tls-context", cert: own }),
16883
+ "tlsContext"
16884
+ );
16885
+ let closed;
16886
+ return Object.freeze({
16887
+ fd,
16888
+ close: () => {
16889
+ closed ??= io.close(fd);
16890
+ return closed;
16891
+ }
16892
+ });
16893
+ }
16825
16894
  function capOf(options, tls) {
16826
16895
  return tls ? Math.max(1, Math.min(options.backlog ?? 128, HANDSHAKES_MAX)) : 0;
16827
16896
  }
@@ -16872,9 +16941,9 @@ function netOps(kernel, io, sync) {
16872
16941
  throw err;
16873
16942
  }
16874
16943
  };
16875
- const serve = (conn, req, signal) => serveOn(kernel, conn, req, signal);
16944
+ const serve = (...args) => serveOn(kernel, ...args);
16876
16945
  const ops = { kernel, io, connection, serve };
16877
- const listener = (fd, at, handshakes = 0) => listenerOf(ops, fd, at, handshakes);
16946
+ const listener = (fd, at, handshakes = 0, tls) => listenerOf(ops, fd, at, handshakes, tls);
16878
16947
  const connect = async (options) => {
16879
16948
  const signal = options.signal ?? NEVER;
16880
16949
  const host = options.host ?? "127.0.0.1";
@@ -16960,7 +17029,7 @@ function netOps(kernel, io, sync) {
16960
17029
  lane.call({ op: "sock-listen", fd, backlog: options.backlog ?? 128 });
16961
17030
  if (tls) lane.call({ op: "sock-tls-listen", fd, ...tls });
16962
17031
  const at = addressOf(lane.json({ op: "sock-name", fd, peer: false }));
16963
- return listener(fd, at, capOf(options, tls));
17032
+ return listener(fd, at, capOf(options, tls), options.tls);
16964
17033
  } catch (err) {
16965
17034
  lane.raw({ op: "fd-close", fd });
16966
17035
  throw err;
@@ -16977,20 +17046,21 @@ function netOps(kernel, io, sync) {
16977
17046
  await kernel.call({ op: "sock-listen", fd, backlog: options.backlog ?? 128 });
16978
17047
  if (tls)
16979
17048
  await secureCall(() => kernel.call({ op: "sock-tls-listen", fd, ...tls }), "listen");
16980
- return listener(fd, await name2(fd, false), capOf(options, tls));
17049
+ return listener(fd, await name2(fd, false), capOf(options, tls), options.tls);
16981
17050
  });
16982
17051
  },
16983
17052
  secure: async (conn, tls) => {
16984
17053
  if (tls.server !== true) return tlsConnect({ socket: conn }, tls);
16985
- return serve(conn, serveRequest(tls));
17054
+ return serve(conn, serveRequest(tls), void 0, tls.select, tls.handshakeTimeout);
16986
17055
  },
17056
+ tlsContext: (options) => contextOf(kernel, io, options),
16987
17057
  connect: (options) => {
16988
17058
  (options.signal ?? NEVER).throwIfAborted();
16989
17059
  return options.tls ? tlsConnect(options, options.tls) : connect(options);
16990
17060
  }
16991
17061
  };
16992
17062
  }
16993
- var PEM, TLS_CODE, ALERT, SHUT_RD, SHUT_WR, LOOPBACK3, IPV4, NEVER, SOL_SOCKET2, SO_ERROR2, HANDSHAKES_MAX;
17063
+ var PEM, TLS_CODE, ALERT, SHUT_RD, SHUT_WR, LOOPBACK3, IPV4, NEVER, SOL_SOCKET2, SO_ERROR2, ALERTS, HANDSHAKE_TIMEOUT_MS, HANDSHAKES_MAX;
16994
17064
  var init_js_net = __esm({
16995
17065
  "src/process/js/js-net.ts"() {
16996
17066
  "use strict";
@@ -17006,6 +17076,14 @@ var init_js_net = __esm({
17006
17076
  NEVER = new AbortController().signal;
17007
17077
  SOL_SOCKET2 = 1;
17008
17078
  SO_ERROR2 = 4;
17079
+ ALERTS = {
17080
+ unrecognized_name: 112,
17081
+ no_application_protocol: 120,
17082
+ handshake_failure: 40,
17083
+ access_denied: 49,
17084
+ internal_error: 80
17085
+ };
17086
+ HANDSHAKE_TIMEOUT_MS = 12e4;
17009
17087
  HANDSHAKES_MAX = 64;
17010
17088
  }
17011
17089
  });