@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.
- package/README.md +5 -0
- package/dist/index.js.map +2 -2
- package/dist/kernel-worker.js +232 -49
- package/dist/kernel-worker.js.map +3 -3
- package/dist/node-process-worker.js +96 -18
- package/dist/node-process-worker.js.map +3 -3
- package/dist/node.js +232 -49
- package/dist/node.js.map +3 -3
- package/dist/process-worker.js +96 -18
- package/dist/process-worker.js.map +3 -3
- package/dist/types/index.d.ts +1 -1
- package/dist/types/kernel/net/tls-client.d.ts +13 -2
- package/dist/types/kernel/net/tls-engine.d.ts +9 -2
- package/dist/types/kernel/net/tls-server.d.ts +17 -2
- package/dist/types/kernel/socket-syscalls.d.ts +10 -0
- package/dist/types/kernel/socket.d.ts +1 -0
- package/dist/types/process/js/js-net.d.ts +21 -0
- package/package.json +3 -3
|
@@ -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.
|
|
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 (
|
|
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
|
-
|
|
8129
|
-
|
|
8130
|
-
|
|
8131
|
-
|
|
8132
|
-
|
|
8133
|
-
|
|
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(
|
|
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 = (
|
|
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
|
});
|