@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.
- package/README.md +1 -0
- package/dist/index.js.map +2 -2
- package/dist/kernel-worker.js +193 -62
- package/dist/kernel-worker.js.map +4 -4
- package/dist/node-process-worker.js +168 -16
- package/dist/node-process-worker.js.map +4 -4
- package/dist/node.js +223 -92
- package/dist/node.js.map +4 -4
- package/dist/process-worker.js +168 -16
- package/dist/process-worker.js.map +4 -4
- package/package.json +2 -2
|
@@ -1465,7 +1465,7 @@ var init_sync_sab_wire = __esm({
|
|
|
1465
1465
|
function createSyncSabTransport(sab, port3, deps = {}) {
|
|
1466
1466
|
const views = sabViews(sab);
|
|
1467
1467
|
const { header, window } = views;
|
|
1468
|
-
const
|
|
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, port3, deps = {}) {
|
|
|
1476
1476
|
}
|
|
1477
1477
|
const remaining = deadline - now();
|
|
1478
1478
|
if (remaining <= 0) throw syncError("ETIMEDOUT", label);
|
|
1479
|
-
|
|
1479
|
+
wait2(header, SAB_I_PUB, published, remaining);
|
|
1480
1480
|
}
|
|
1481
1481
|
}
|
|
1482
1482
|
return {
|
|
@@ -4033,12 +4033,12 @@ async function runWasmProcess(init, port3, deps = {}) {
|
|
|
4033
4033
|
const say = (fd) => (text) => sys.write(fd, encoder4.encode(`${text}
|
|
4034
4034
|
`));
|
|
4035
4035
|
let ready;
|
|
4036
|
-
let
|
|
4036
|
+
let failed3;
|
|
4037
4037
|
let memory;
|
|
4038
4038
|
let exports;
|
|
4039
4039
|
const initialized = new Promise((resolve, reject) => {
|
|
4040
4040
|
ready = resolve;
|
|
4041
|
-
|
|
4041
|
+
failed3 = reject;
|
|
4042
4042
|
});
|
|
4043
4043
|
const id = identify(transport, init);
|
|
4044
4044
|
const module = {
|
|
@@ -4091,7 +4091,7 @@ async function runWasmProcess(init, port3, deps = {}) {
|
|
|
4091
4091
|
exports = instance.exports;
|
|
4092
4092
|
publishMemory(init.sab, memory?.buffer.byteLength ?? 0);
|
|
4093
4093
|
done(instance, init.program.module);
|
|
4094
|
-
},
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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: () =>
|
|
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
|
|
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 (
|
|
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) {
|
|
@@ -9718,20 +9870,20 @@ function started(init, port3, run, wasi, js) {
|
|
|
9718
9870
|
return run(wasmInit, port3);
|
|
9719
9871
|
}
|
|
9720
9872
|
function processEntry(port3, run = runWasmProcess, wasi = loadWasi, js = loadJs) {
|
|
9721
|
-
const
|
|
9873
|
+
const failed3 = (err) => port3.postMessage({
|
|
9722
9874
|
type: WASM_PROCESS_ERROR,
|
|
9723
9875
|
message: err instanceof Error ? err.stack ?? err.message : String(err)
|
|
9724
9876
|
});
|
|
9725
9877
|
return (data) => {
|
|
9726
9878
|
const type = data?.type;
|
|
9727
9879
|
if (type === WASM_THREAD_INIT) {
|
|
9728
|
-
wasi().then((m) => m.runWasiThread(data, port3)).catch(
|
|
9880
|
+
wasi().then((m) => m.runWasiThread(data, port3)).catch(failed3);
|
|
9729
9881
|
return;
|
|
9730
9882
|
}
|
|
9731
9883
|
if (type !== WASM_PROCESS_INIT) return;
|
|
9732
9884
|
started(data, port3, run, wasi, js).then(
|
|
9733
9885
|
(code2) => port3.postMessage({ type: WASM_PROCESS_EXIT, code: code2 }),
|
|
9734
|
-
|
|
9886
|
+
failed3
|
|
9735
9887
|
);
|
|
9736
9888
|
};
|
|
9737
9889
|
}
|