@ai-ecoverse/slicc-kernel 1.151.1 → 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.
@@ -2414,7 +2414,9 @@ var init_js_kernel = __esm({
2414
2414
  "sock-tls",
2415
2415
  "sock-tls-upgrade",
2416
2416
  "sock-tls-serve",
2417
- "sock-tls-listen"
2417
+ "sock-tls-listen",
2418
+ "sock-tls-context",
2419
+ "sock-tls-select"
2418
2420
  ]);
2419
2421
  JsKernel = class {
2420
2422
  header;
@@ -7187,7 +7189,7 @@ var KERNEL_VERSION, OS_RELEASE;
7187
7189
  var init_version = __esm({
7188
7190
  "src/version.ts"() {
7189
7191
  "use strict";
7190
- KERNEL_VERSION = true ? "1.151.1" : "0.0.0-dev";
7192
+ KERNEL_VERSION = true ? "1.152.0" : "0.0.0-dev";
7191
7193
  OS_RELEASE = "6.0.0-slicc";
7192
7194
  }
7193
7195
  });
@@ -8019,10 +8021,13 @@ function keyText(key, what) {
8019
8021
  }
8020
8022
  function serveRequest(tls) {
8021
8023
  const own = clientCert(tls, "listen").clientCert;
8022
- if (!own)
8024
+ if (tls.select !== void 0 && typeof tls.select !== "function")
8025
+ throw new JsCallError("EINVAL", "listen", "ERR_INVALID_ARG_TYPE: select must be a function");
8026
+ if (!own && !tls.select)
8023
8027
  throw new JsCallError("EINVAL", "listen", "ERR_INVALID_ARG_VALUE: a server needs cert and key");
8024
8028
  return {
8025
- cert: own,
8029
+ ...own ? { cert: own } : {},
8030
+ ...tls.select ? { select: true } : {},
8026
8031
  ...tls.ca !== void 0 ? { ca: caList(tls.ca) } : {},
8027
8032
  ...tls.requestCert ? { requestCert: true } : {},
8028
8033
  ...tls.rejectUnauthorized === false ? { rejectUnauthorized: false } : {},
@@ -8125,12 +8130,50 @@ function port(n) {
8125
8130
  if (!Number.isInteger(n) || n < 0 || n > 65535) throw new JsCallError("EINVAL", `port ${n}`);
8126
8131
  return n;
8127
8132
  }
8128
- async function serveOn(kernel, conn, req, signal = NEVER) {
8129
- const r = await secureCall(
8130
- () => kernel.blocking({ op: "sock-tls-serve", fd: conn.fd, ...req }, signal),
8131
- "accept"
8132
- );
8133
- const wire = r.ok && r.kind === "json" ? r.json : {};
8133
+ function choiceWire(choice) {
8134
+ if (!choice) return {};
8135
+ const { context, alpn, refuse: refuse2 } = choice;
8136
+ return {
8137
+ ...context === void 0 ? {} : { context: typeof context === "number" ? context : context.fd },
8138
+ ...alpn === void 0 ? {} : { alpn: String(alpn) },
8139
+ ...refuse2 === void 0 ? {} : { refuse: ALERTS[String(refuse2)] ?? Number(refuse2) }
8140
+ };
8141
+ }
8142
+ function expiry(ms) {
8143
+ let timer;
8144
+ const late = new Promise((_, reject) => {
8145
+ timer = setTimeout(
8146
+ () => reject(new JsCallError("ERR_TLS_HANDSHAKE_TIMEOUT", "accept", "ERR_TLS_HANDSHAKE_TIMEOUT")),
8147
+ ms
8148
+ );
8149
+ });
8150
+ late.catch(() => void 0);
8151
+ return { late, clear: () => clearTimeout(timer) };
8152
+ }
8153
+ async function selected(pick, offer, ms) {
8154
+ const limit2 = expiry(ms);
8155
+ try {
8156
+ if (!pick) return { wire: {} };
8157
+ const choice = await Promise.race([pick(Object.freeze({ ...offer })), limit2.late]);
8158
+ return { wire: choiceWire(choice) };
8159
+ } catch (thrown) {
8160
+ return { wire: { refuse: ALERTS.handshake_failure }, thrown };
8161
+ } finally {
8162
+ limit2.clear();
8163
+ }
8164
+ }
8165
+ async function serveOn(kernel, conn, req, signal = NEVER, pick, ms = HANDSHAKE_TIMEOUT_MS) {
8166
+ const call2 = (body) => secureCall(async () => {
8167
+ const r = await kernel.blocking(body, signal);
8168
+ return r.ok && r.kind === "json" ? r.json : {};
8169
+ }, "accept");
8170
+ let wire = await call2({ op: "sock-tls-serve", fd: conn.fd, ...req });
8171
+ while (wire.select) {
8172
+ const { wire: choice, thrown } = await selected(pick, wire.select, ms);
8173
+ wire = await call2({ op: "sock-tls-select", fd: conn.fd, ...choice }).catch((err) => {
8174
+ throw thrown ?? err;
8175
+ });
8176
+ }
8134
8177
  return Object.assign(Object.create(conn), { tls: servedOf(wire) });
8135
8178
  }
8136
8179
  function changeOf(waiters, signal) {
@@ -8200,7 +8243,7 @@ function securedAccepts(plain2, serve, stop, cap) {
8200
8243
  }
8201
8244
  };
8202
8245
  }
8203
- function listenerOf(ops, fd, at, handshakes) {
8246
+ function listenerOf(ops, fd, at, handshakes, tls) {
8204
8247
  const { kernel, io, connection, serve } = ops;
8205
8248
  const stop = new AbortController();
8206
8249
  const acceptPlain = async (signal) => {
@@ -8212,7 +8255,12 @@ function listenerOf(ops, fd, at, handshakes) {
8212
8255
  await kernel.blocking({ op: "fd-select", read: [fd], write: [], timeoutMs: -1 }, signal);
8213
8256
  }
8214
8257
  };
8215
- const next2 = handshakes > 0 ? securedAccepts(acceptPlain, (c, s) => serve(c, { from: fd }, s), stop.signal, handshakes) : acceptPlain;
8258
+ const next2 = handshakes > 0 ? securedAccepts(
8259
+ acceptPlain,
8260
+ (c, s) => serve(c, { from: fd }, s, tls?.select, tls?.handshakeTimeout),
8261
+ stop.signal,
8262
+ handshakes
8263
+ ) : acceptPlain;
8216
8264
  const accept = (options = {}) => next2(AbortSignal.any([options.signal ?? NEVER, stop.signal]));
8217
8265
  return {
8218
8266
  fd,
@@ -8234,6 +8282,27 @@ function listenerOf(ops, fd, at, handshakes) {
8234
8282
  }
8235
8283
  };
8236
8284
  }
8285
+ async function contextOf(kernel, io, options) {
8286
+ const own = clientCert(options ?? {}, "tlsContext").clientCert;
8287
+ if (!own)
8288
+ throw new JsCallError(
8289
+ "EINVAL",
8290
+ "tlsContext",
8291
+ "ERR_INVALID_ARG_VALUE: a context needs cert and key"
8292
+ );
8293
+ const fd = await secureCall(
8294
+ () => kernel.json({ op: "sock-tls-context", cert: own }),
8295
+ "tlsContext"
8296
+ );
8297
+ let closed;
8298
+ return Object.freeze({
8299
+ fd,
8300
+ close: () => {
8301
+ closed ??= io.close(fd);
8302
+ return closed;
8303
+ }
8304
+ });
8305
+ }
8237
8306
  function capOf(options, tls) {
8238
8307
  return tls ? Math.max(1, Math.min(options.backlog ?? 128, HANDSHAKES_MAX)) : 0;
8239
8308
  }
@@ -8284,9 +8353,9 @@ function netOps(kernel, io, sync) {
8284
8353
  throw err;
8285
8354
  }
8286
8355
  };
8287
- const serve = (conn, req, signal) => serveOn(kernel, conn, req, signal);
8356
+ const serve = (...args) => serveOn(kernel, ...args);
8288
8357
  const ops = { kernel, io, connection, serve };
8289
- const listener = (fd, at, handshakes = 0) => listenerOf(ops, fd, at, handshakes);
8358
+ const listener = (fd, at, handshakes = 0, tls) => listenerOf(ops, fd, at, handshakes, tls);
8290
8359
  const connect = async (options) => {
8291
8360
  const signal = options.signal ?? NEVER;
8292
8361
  const host = options.host ?? "127.0.0.1";
@@ -8372,7 +8441,7 @@ function netOps(kernel, io, sync) {
8372
8441
  lane.call({ op: "sock-listen", fd, backlog: options.backlog ?? 128 });
8373
8442
  if (tls) lane.call({ op: "sock-tls-listen", fd, ...tls });
8374
8443
  const at = addressOf(lane.json({ op: "sock-name", fd, peer: false }));
8375
- return listener(fd, at, capOf(options, tls));
8444
+ return listener(fd, at, capOf(options, tls), options.tls);
8376
8445
  } catch (err) {
8377
8446
  lane.raw({ op: "fd-close", fd });
8378
8447
  throw err;
@@ -8389,20 +8458,21 @@ function netOps(kernel, io, sync) {
8389
8458
  await kernel.call({ op: "sock-listen", fd, backlog: options.backlog ?? 128 });
8390
8459
  if (tls)
8391
8460
  await secureCall(() => kernel.call({ op: "sock-tls-listen", fd, ...tls }), "listen");
8392
- return listener(fd, await name2(fd, false), capOf(options, tls));
8461
+ return listener(fd, await name2(fd, false), capOf(options, tls), options.tls);
8393
8462
  });
8394
8463
  },
8395
8464
  secure: async (conn, tls) => {
8396
8465
  if (tls.server !== true) return tlsConnect({ socket: conn }, tls);
8397
- return serve(conn, serveRequest(tls));
8466
+ return serve(conn, serveRequest(tls), void 0, tls.select, tls.handshakeTimeout);
8398
8467
  },
8468
+ tlsContext: (options) => contextOf(kernel, io, options),
8399
8469
  connect: (options) => {
8400
8470
  (options.signal ?? NEVER).throwIfAborted();
8401
8471
  return options.tls ? tlsConnect(options, options.tls) : connect(options);
8402
8472
  }
8403
8473
  };
8404
8474
  }
8405
- var PEM, TLS_CODE, ALERT, SHUT_RD, SHUT_WR, LOOPBACK3, IPV4, NEVER, SOL_SOCKET2, SO_ERROR2, HANDSHAKES_MAX;
8475
+ var PEM, TLS_CODE, ALERT, SHUT_RD, SHUT_WR, LOOPBACK3, IPV4, NEVER, SOL_SOCKET2, SO_ERROR2, ALERTS, HANDSHAKE_TIMEOUT_MS, HANDSHAKES_MAX;
8406
8476
  var init_js_net = __esm({
8407
8477
  "src/process/js/js-net.ts"() {
8408
8478
  "use strict";
@@ -8418,6 +8488,14 @@ var init_js_net = __esm({
8418
8488
  NEVER = new AbortController().signal;
8419
8489
  SOL_SOCKET2 = 1;
8420
8490
  SO_ERROR2 = 4;
8491
+ ALERTS = {
8492
+ unrecognized_name: 112,
8493
+ no_application_protocol: 120,
8494
+ handshake_failure: 40,
8495
+ access_denied: 49,
8496
+ internal_error: 80
8497
+ };
8498
+ HANDSHAKE_TIMEOUT_MS = 12e4;
8421
8499
  HANDSHAKES_MAX = 64;
8422
8500
  }
8423
8501
  });