@ai-ecoverse/slicc-kernel 1.39.2 → 1.40.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.
- package/README.md +5 -3
- package/dist/index.js.map +2 -2
- package/dist/kernel-worker.js +45 -16
- package/dist/kernel-worker.js.map +3 -3
- package/dist/node-process-worker.js +221 -36
- package/dist/node-process-worker.js.map +4 -4
- package/dist/node.js +45 -16
- package/dist/node.js.map +3 -3
- package/dist/process-worker.js +221 -36
- package/dist/process-worker.js.map +4 -4
- package/package.json +1 -1
package/dist/process-worker.js
CHANGED
|
@@ -2730,13 +2730,13 @@ function describeInherited(Fs, sys, streams, livePath, actions = []) {
|
|
|
2730
2730
|
if (from) table.set(target, { stream: from.stream, cloexec: false });
|
|
2731
2731
|
else table.delete(target);
|
|
2732
2732
|
}
|
|
2733
|
-
const
|
|
2733
|
+
const slots2 = /* @__PURE__ */ new Map();
|
|
2734
2734
|
for (const [fd, { stream, cloexec }] of table) {
|
|
2735
|
-
if (fd > 2 && !cloexec)
|
|
2735
|
+
if (fd > 2 && !cloexec) slots2.set(fd, stream);
|
|
2736
2736
|
}
|
|
2737
2737
|
const promote = vfsPromoter(Fs, sys, streams, livePath);
|
|
2738
2738
|
const out = [];
|
|
2739
|
-
for (const [fd, stream] of
|
|
2739
|
+
for (const [fd, stream] of slots2) {
|
|
2740
2740
|
promote(stream);
|
|
2741
2741
|
const slot = inheritedSlot(fd, stream);
|
|
2742
2742
|
if (slot) out.push(slot);
|
|
@@ -2928,6 +2928,7 @@ function createProcessKernel(deps) {
|
|
|
2928
2928
|
if (!stream) return { none: true };
|
|
2929
2929
|
promote?.(stream);
|
|
2930
2930
|
if (stream.sliccKernelFd !== void 0) return { fd: stream.sliccKernelFd };
|
|
2931
|
+
if (((stream.node?.mode ?? 0) & S_IFMT) === S_IFDIR2 && stream.path) return { dir: stream.path };
|
|
2931
2932
|
const device2 = deviceOfStream(stream);
|
|
2932
2933
|
if (device2) return device2;
|
|
2933
2934
|
return n === 0 ? { input: drain(Fs, stream) } : { capture: true };
|
|
@@ -3071,12 +3072,14 @@ function createProcessKernel(deps) {
|
|
|
3071
3072
|
}
|
|
3072
3073
|
};
|
|
3073
3074
|
}
|
|
3074
|
-
var POLLIN2, POLLOUT2, POLLERR2, POLLHUP2, POLLNVAL, SELECT_SLICE_MS, WUNTRACED, WCONTINUED;
|
|
3075
|
+
var S_IFMT, S_IFDIR2, POLLIN2, POLLOUT2, POLLERR2, POLLHUP2, POLLNVAL, SELECT_SLICE_MS, WUNTRACED, WCONTINUED;
|
|
3075
3076
|
var init_process_children = __esm({
|
|
3076
3077
|
"src/process/process-children.ts"() {
|
|
3077
3078
|
"use strict";
|
|
3078
3079
|
init_process_fork();
|
|
3079
3080
|
init_wasi_errno();
|
|
3081
|
+
S_IFMT = 61440;
|
|
3082
|
+
S_IFDIR2 = 16384;
|
|
3080
3083
|
POLLIN2 = 1;
|
|
3081
3084
|
POLLOUT2 = 4;
|
|
3082
3085
|
POLLERR2 = 8;
|
|
@@ -3785,7 +3788,7 @@ function kernelSys(transport) {
|
|
|
3785
3788
|
kind(fd) {
|
|
3786
3789
|
return json(call2({ op: "fd-info", fd }, `fd-info ${fd}`))?.kind;
|
|
3787
3790
|
},
|
|
3788
|
-
|
|
3791
|
+
heldMeta(fd) {
|
|
3789
3792
|
return json(call2({ op: "fd-info", fd }, `fd-info ${fd}`)).meta;
|
|
3790
3793
|
},
|
|
3791
3794
|
size(fd) {
|
|
@@ -3849,9 +3852,15 @@ function wireKernelFd(Fs, streams, entry) {
|
|
|
3849
3852
|
}
|
|
3850
3853
|
function openDevice(Fs, fd, meta) {
|
|
3851
3854
|
const flags = meta.access === "read" ? O_RDONLY : meta.access === "write" ? O_WRONLY3 : O_RDWR3;
|
|
3855
|
+
return openAt(Fs, fd, `/dev/${meta.device}`, flags);
|
|
3856
|
+
}
|
|
3857
|
+
function openHeld(Fs, fd, meta) {
|
|
3858
|
+
return "dir" in meta ? openAt(Fs, fd, meta.dir, O_RDONLY | O_DIRECTORY) : openDevice(Fs, fd, meta);
|
|
3859
|
+
}
|
|
3860
|
+
function openAt(Fs, fd, path, flags) {
|
|
3852
3861
|
let stream;
|
|
3853
3862
|
try {
|
|
3854
|
-
stream = Fs.open(
|
|
3863
|
+
stream = Fs.open(path, flags);
|
|
3855
3864
|
} catch {
|
|
3856
3865
|
return false;
|
|
3857
3866
|
}
|
|
@@ -3866,8 +3875,8 @@ function wireKernelStdio(Fs, streams, sys) {
|
|
|
3866
3875
|
const stream = Fs.getStream(fd);
|
|
3867
3876
|
if (!stream) continue;
|
|
3868
3877
|
const kind = sys?.kind?.(fd);
|
|
3869
|
-
const
|
|
3870
|
-
if (
|
|
3878
|
+
const meta = kind === "device" || kind === "held" ? sys?.heldMeta?.(fd) : void 0;
|
|
3879
|
+
if (meta && openHeld(Fs, fd, meta)) continue;
|
|
3871
3880
|
if (kind && PLACED.has(kind)) {
|
|
3872
3881
|
const { flags } = stream;
|
|
3873
3882
|
Fs.closeStream(fd);
|
|
@@ -4119,7 +4128,7 @@ function runMain(running, init) {
|
|
|
4119
4128
|
return status2;
|
|
4120
4129
|
}
|
|
4121
4130
|
}
|
|
4122
|
-
var FS_OPS, O_RDONLY, O_WRONLY3, O_RDWR3, PLACED, GLUE_TRAILER, evaluateGlue, EVAL_BLOCKED;
|
|
4131
|
+
var FS_OPS, O_RDONLY, O_WRONLY3, O_RDWR3, O_DIRECTORY, PLACED, GLUE_TRAILER, evaluateGlue, EVAL_BLOCKED;
|
|
4123
4132
|
var init_process_runtime = __esm({
|
|
4124
4133
|
"src/process/process-runtime.ts"() {
|
|
4125
4134
|
"use strict";
|
|
@@ -4144,6 +4153,7 @@ var init_process_runtime = __esm({
|
|
|
4144
4153
|
O_RDONLY = 0;
|
|
4145
4154
|
O_WRONLY3 = 1;
|
|
4146
4155
|
O_RDWR3 = 2;
|
|
4156
|
+
O_DIRECTORY = 65536;
|
|
4147
4157
|
PLACED = /* @__PURE__ */ new Set(["stream", "file", "socket"]);
|
|
4148
4158
|
GLUE_TRAILER = [
|
|
4149
4159
|
"if (typeof ENV !== 'undefined') Object.assign(ENV, Module.sliccEnv);",
|
|
@@ -4507,10 +4517,10 @@ var init_wasi_files = __esm({
|
|
|
4507
4517
|
readable;
|
|
4508
4518
|
writable;
|
|
4509
4519
|
append;
|
|
4510
|
-
constructor(buffer,
|
|
4520
|
+
constructor(buffer, readable2, writable2, append) {
|
|
4511
4521
|
this.buffer = buffer;
|
|
4512
|
-
this.readable =
|
|
4513
|
-
this.writable =
|
|
4522
|
+
this.readable = readable2;
|
|
4523
|
+
this.writable = writable2;
|
|
4514
4524
|
this.append = append;
|
|
4515
4525
|
}
|
|
4516
4526
|
get path() {
|
|
@@ -4592,9 +4602,9 @@ function entryOf(info) {
|
|
|
4592
4602
|
function openAccess(existing, oflags, rights) {
|
|
4593
4603
|
const readonly = existing?.readonly === true;
|
|
4594
4604
|
const mutating = readonly ? OFLAGS.TRUNC : OFLAGS.CREAT | OFLAGS.TRUNC;
|
|
4595
|
-
const
|
|
4596
|
-
if (
|
|
4597
|
-
return { readable: (rights & RIGHTS.FD_READ) !== 0n || !
|
|
4605
|
+
const writable2 = (rights & RIGHTS.FD_WRITE) !== 0n || (oflags & mutating) !== 0;
|
|
4606
|
+
if (writable2 && readonly) throw new WasiError("EROFS");
|
|
4607
|
+
return { readable: (rights & RIGHTS.FD_READ) !== 0n || !writable2, writable: writable2 };
|
|
4598
4608
|
}
|
|
4599
4609
|
function promoteRequest(fd, f, handed) {
|
|
4600
4610
|
const orphan = f.buffer.isOrphan();
|
|
@@ -4640,7 +4650,7 @@ var init_wasi_fds = __esm({
|
|
|
4640
4650
|
this.fs = fs;
|
|
4641
4651
|
}
|
|
4642
4652
|
setup(cwd, inherited, root = false) {
|
|
4643
|
-
for (const fd of [0, 1, 2]) this.table.set(fd,
|
|
4653
|
+
for (const fd of [0, 1, 2]) this.table.set(fd, this.stdioEntry(fd));
|
|
4644
4654
|
const preopens = this.preopens(cwd, root);
|
|
4645
4655
|
const top = 3 + preopens.length;
|
|
4646
4656
|
for (const { fd, kind, flags, device: device2 } of inherited) {
|
|
@@ -4727,6 +4737,15 @@ var init_wasi_fds = __esm({
|
|
|
4727
4737
|
const gen = Atomics.add(this.shared, GEN, 1) + 1;
|
|
4728
4738
|
if (gen - 1 === this.seen) this.seen = gen;
|
|
4729
4739
|
}
|
|
4740
|
+
stdioEntry(fd) {
|
|
4741
|
+
let info;
|
|
4742
|
+
try {
|
|
4743
|
+
info = this.kernel.call({ op: "fd-info", fd });
|
|
4744
|
+
} catch {
|
|
4745
|
+
return kernelEntry2();
|
|
4746
|
+
}
|
|
4747
|
+
return info?.meta && "dir" in info.meta ? { type: "dir", path: info.meta.dir } : kernelEntry2();
|
|
4748
|
+
}
|
|
4730
4749
|
fetch(fd) {
|
|
4731
4750
|
let info;
|
|
4732
4751
|
try {
|
|
@@ -5016,13 +5035,17 @@ var init_wasi_fds = __esm({
|
|
|
5016
5035
|
if (oflags & OFLAGS.DIRECTORY && !s?.isDirectory) {
|
|
5017
5036
|
throw new WasiError(s ? "ENOTDIR" : "ENOENT");
|
|
5018
5037
|
}
|
|
5019
|
-
if (s?.isDirectory)
|
|
5038
|
+
if (s?.isDirectory) {
|
|
5039
|
+
const asked = (oflags & OFLAGS.DIRECTORY) === 0 && (rights & RIGHTS.FD_WRITE) !== 0n;
|
|
5040
|
+
if (asked || (oflags & (OFLAGS.CREAT | OFLAGS.TRUNC)) !== 0) throw new WasiError("EISDIR");
|
|
5041
|
+
return this.install({ type: "dir", path });
|
|
5042
|
+
}
|
|
5020
5043
|
if (!s && !(oflags & OFLAGS.CREAT)) throw new WasiError("ENOENT");
|
|
5021
5044
|
if (this.shared) return this.kernelFile(path, s, oflags, rights, fdflags);
|
|
5022
5045
|
return this.install({ type: "file", file: this.file(path, s, oflags, rights, fdflags) });
|
|
5023
5046
|
}
|
|
5024
5047
|
file(path, existing, oflags, rights, fdflags) {
|
|
5025
|
-
const { readable, writable } = openAccess(existing, oflags, rights);
|
|
5048
|
+
const { readable: readable2, writable: writable2 } = openAccess(existing, oflags, rights);
|
|
5026
5049
|
let buffer = this.buffers.get(path);
|
|
5027
5050
|
if (buffer) {
|
|
5028
5051
|
if (oflags & OFLAGS.TRUNC) buffer.truncate(0);
|
|
@@ -5037,12 +5060,12 @@ var init_wasi_fds = __esm({
|
|
|
5037
5060
|
this.fs.hold?.(path, true, true);
|
|
5038
5061
|
}
|
|
5039
5062
|
buffer.opens++;
|
|
5040
|
-
return new LocalFile(buffer,
|
|
5063
|
+
return new LocalFile(buffer, readable2, writable2, (fdflags & FDFLAGS.APPEND) !== 0);
|
|
5041
5064
|
}
|
|
5042
5065
|
kernelFile(path, existing, oflags, rights, fdflags) {
|
|
5043
|
-
const { readable, writable } = openAccess(existing, oflags, rights);
|
|
5066
|
+
const { readable: readable2, writable: writable2 } = openAccess(existing, oflags, rights);
|
|
5044
5067
|
const append = (fdflags & FDFLAGS.APPEND) !== 0;
|
|
5045
|
-
const flags = (
|
|
5068
|
+
const flags = (writable2 ? readable2 ? O_RDWR4 : O_WRONLY4 : 0) | (append ? O_APPEND : 0);
|
|
5046
5069
|
const made = !existing && this.createNew(path, oflags);
|
|
5047
5070
|
const truncate = made || (oflags & OFLAGS.TRUNC) !== 0;
|
|
5048
5071
|
const fd = this.kernel.sys.openVfs(path, flags, 0, truncate ? { truncate } : {});
|
|
@@ -6824,8 +6847,8 @@ var init_wasix_process = __esm({
|
|
|
6824
6847
|
];
|
|
6825
6848
|
return { stdio, inherit, cwd, opened };
|
|
6826
6849
|
}
|
|
6827
|
-
applyFdOp(op,
|
|
6828
|
-
const { map, nulls, opened } =
|
|
6850
|
+
applyFdOp(op, slots2, cwd) {
|
|
6851
|
+
const { map, nulls, opened } = slots2;
|
|
6829
6852
|
const { fds } = this.host;
|
|
6830
6853
|
const point = (fd, kfd) => {
|
|
6831
6854
|
if (kfd === void 0) {
|
|
@@ -8188,6 +8211,17 @@ var init_async_sab = __esm({
|
|
|
8188
8211
|
});
|
|
8189
8212
|
|
|
8190
8213
|
// src/process/js/js-kernel.ts
|
|
8214
|
+
function untilAborted(work, signal) {
|
|
8215
|
+
if (!signal) return work;
|
|
8216
|
+
return new Promise((resolve) => {
|
|
8217
|
+
const done = () => {
|
|
8218
|
+
signal.removeEventListener("abort", done);
|
|
8219
|
+
resolve();
|
|
8220
|
+
};
|
|
8221
|
+
signal.addEventListener("abort", done, { once: true });
|
|
8222
|
+
work.then(done, done);
|
|
8223
|
+
});
|
|
8224
|
+
}
|
|
8191
8225
|
var JsCallError, JsKernel;
|
|
8192
8226
|
var init_js_kernel = __esm({
|
|
8193
8227
|
"src/process/js/js-kernel.ts"() {
|
|
@@ -8239,20 +8273,24 @@ var init_js_kernel = __esm({
|
|
|
8239
8273
|
const result = await this.call(req);
|
|
8240
8274
|
return result.ok && result.kind === "bytes" ? result.bytes : new Uint8Array(0);
|
|
8241
8275
|
}
|
|
8242
|
-
async blocking(req) {
|
|
8276
|
+
async blocking(req, signal) {
|
|
8243
8277
|
for (; ; ) {
|
|
8244
8278
|
const id = await this.json({ op: "async-submit", req });
|
|
8245
|
-
const result = await this.settled(id);
|
|
8279
|
+
const result = await this.settled(id, signal);
|
|
8246
8280
|
if (result.ok) return result;
|
|
8247
8281
|
if (result.errno !== "EINTR") throw new JsCallError(result.errno, req.op);
|
|
8248
8282
|
}
|
|
8249
8283
|
}
|
|
8250
|
-
async settled(id) {
|
|
8284
|
+
async settled(id, signal) {
|
|
8251
8285
|
for (; ; ) {
|
|
8252
8286
|
const seen = Atomics.load(this.header, SAB_I_ASYNC);
|
|
8253
8287
|
const taken = await this.raw({ op: "async-take", id });
|
|
8254
8288
|
if (taken.ok || taken.errno !== "EAGAIN") return taken;
|
|
8255
|
-
|
|
8289
|
+
if (signal?.aborted) {
|
|
8290
|
+
await this.raw({ op: "async-cancel", id });
|
|
8291
|
+
throw signal.reason;
|
|
8292
|
+
}
|
|
8293
|
+
await untilAborted(changed(this.header, SAB_I_ASYNC, seen, this.waitAsync), signal);
|
|
8256
8294
|
}
|
|
8257
8295
|
}
|
|
8258
8296
|
deliver() {
|
|
@@ -8325,6 +8363,125 @@ var init_js_kernel = __esm({
|
|
|
8325
8363
|
}
|
|
8326
8364
|
});
|
|
8327
8365
|
|
|
8366
|
+
// src/process/js/js-children.ts
|
|
8367
|
+
function exitedOf(status2) {
|
|
8368
|
+
const signal = status2 & 127;
|
|
8369
|
+
return signal ? { status: 128 + signal, signal } : { status: status2 >> 8 & 255 };
|
|
8370
|
+
}
|
|
8371
|
+
function readable(io, fd) {
|
|
8372
|
+
const cancelled = new AbortController();
|
|
8373
|
+
return new ReadableStream(
|
|
8374
|
+
{
|
|
8375
|
+
async pull(controller) {
|
|
8376
|
+
const chunk = await io.read(fd, void 0, cancelled.signal).catch((err) => {
|
|
8377
|
+
if (cancelled.signal.aborted) return void 0;
|
|
8378
|
+
throw err;
|
|
8379
|
+
});
|
|
8380
|
+
if (chunk === void 0) return;
|
|
8381
|
+
if (chunk.length > 0) {
|
|
8382
|
+
controller.enqueue(chunk);
|
|
8383
|
+
return;
|
|
8384
|
+
}
|
|
8385
|
+
controller.close();
|
|
8386
|
+
await io.close(fd);
|
|
8387
|
+
},
|
|
8388
|
+
cancel: () => {
|
|
8389
|
+
cancelled.abort();
|
|
8390
|
+
return io.close(fd);
|
|
8391
|
+
}
|
|
8392
|
+
},
|
|
8393
|
+
{ highWaterMark: 0 }
|
|
8394
|
+
);
|
|
8395
|
+
}
|
|
8396
|
+
function writable(io, fd) {
|
|
8397
|
+
return new WritableStream({
|
|
8398
|
+
write: (chunk, controller) => io.send(fd, chunk, controller.signal),
|
|
8399
|
+
close: () => io.close(fd),
|
|
8400
|
+
abort: () => io.close(fd)
|
|
8401
|
+
});
|
|
8402
|
+
}
|
|
8403
|
+
function childOps(kernel, io, defaults) {
|
|
8404
|
+
const wait = async (pid) => {
|
|
8405
|
+
const r = await kernel.blocking({ op: "proc-wait", pid, nohang: false });
|
|
8406
|
+
const [, status2] = r.ok && r.kind === "json" ? r.json : [0, 0];
|
|
8407
|
+
return exitedOf(status2);
|
|
8408
|
+
};
|
|
8409
|
+
const kill = async (pid, signal = SIGTERM) => {
|
|
8410
|
+
await kernel.call({ op: "proc-kill", pid, sig: signal === 0 ? 0 : defaults.signal(signal) });
|
|
8411
|
+
};
|
|
8412
|
+
const childOf = (pid, mine) => {
|
|
8413
|
+
const [stdin, stdout, stderr] = mine;
|
|
8414
|
+
return {
|
|
8415
|
+
pid,
|
|
8416
|
+
...stdin !== void 0 ? { stdin: writable(io, stdin) } : {},
|
|
8417
|
+
...stdout !== void 0 ? { stdout: readable(io, stdout) } : {},
|
|
8418
|
+
...stderr !== void 0 ? { stderr: readable(io, stderr) } : {},
|
|
8419
|
+
wait: () => wait(pid),
|
|
8420
|
+
kill: (signal) => kill(pid, signal)
|
|
8421
|
+
};
|
|
8422
|
+
};
|
|
8423
|
+
const spawn = async (o) => {
|
|
8424
|
+
const [file] = o.argv;
|
|
8425
|
+
if (file === void 0) throw new JsCallError("EINVAL", "spawn");
|
|
8426
|
+
const mine = [];
|
|
8427
|
+
const theirs = [];
|
|
8428
|
+
try {
|
|
8429
|
+
const stdio = await slots(kernel, o, mine, theirs);
|
|
8430
|
+
const pid = await kernel.json({
|
|
8431
|
+
op: "proc-spawn",
|
|
8432
|
+
file,
|
|
8433
|
+
argv: [...o.argv],
|
|
8434
|
+
env: { ...o.env ?? defaults.env },
|
|
8435
|
+
cwd: o.cwd ?? defaults.cwd,
|
|
8436
|
+
stdio
|
|
8437
|
+
});
|
|
8438
|
+
return childOf(pid, mine);
|
|
8439
|
+
} catch (err) {
|
|
8440
|
+
await closeAll(io, mine);
|
|
8441
|
+
throw err;
|
|
8442
|
+
} finally {
|
|
8443
|
+
await closeAll(io, theirs);
|
|
8444
|
+
}
|
|
8445
|
+
};
|
|
8446
|
+
return { spawn, wait, kill };
|
|
8447
|
+
}
|
|
8448
|
+
async function closeAll(io, fds) {
|
|
8449
|
+
for (const fd of fds) if (fd !== void 0) await io.close(fd).catch(() => void 0);
|
|
8450
|
+
}
|
|
8451
|
+
async function preflight(kernel, hows) {
|
|
8452
|
+
for (const [n, how] of hows.entries()) {
|
|
8453
|
+
if (how === "pipe" || how === "null") continue;
|
|
8454
|
+
if (how !== "inherit" && typeof how !== "number") throw new JsCallError("EINVAL", "spawn");
|
|
8455
|
+
await kernel.json({ op: "fd-info", fd: how === "inherit" ? n : how });
|
|
8456
|
+
}
|
|
8457
|
+
}
|
|
8458
|
+
async function slots(kernel, o, mine, theirs) {
|
|
8459
|
+
const hows = STDIO2.map((name) => o[name] ?? "inherit");
|
|
8460
|
+
await preflight(kernel, hows);
|
|
8461
|
+
const stdio = [];
|
|
8462
|
+
for (const [n, how] of hows.entries()) {
|
|
8463
|
+
if (how === "inherit") stdio.push({ fd: n });
|
|
8464
|
+
else if (how === "null") stdio.push({ none: true });
|
|
8465
|
+
else if (typeof how === "number") stdio.push({ fd: how });
|
|
8466
|
+
else {
|
|
8467
|
+
const [read, write] = await kernel.json({ op: "fd-pipe" });
|
|
8468
|
+
mine[n] = n === 0 ? write : read;
|
|
8469
|
+
theirs.push(n === 0 ? read : write);
|
|
8470
|
+
stdio.push({ fd: n === 0 ? read : write });
|
|
8471
|
+
}
|
|
8472
|
+
}
|
|
8473
|
+
return stdio;
|
|
8474
|
+
}
|
|
8475
|
+
var STDIO2, SIGTERM;
|
|
8476
|
+
var init_js_children = __esm({
|
|
8477
|
+
"src/process/js/js-children.ts"() {
|
|
8478
|
+
"use strict";
|
|
8479
|
+
init_js_kernel();
|
|
8480
|
+
STDIO2 = ["stdin", "stdout", "stderr"];
|
|
8481
|
+
SIGTERM = 15;
|
|
8482
|
+
}
|
|
8483
|
+
});
|
|
8484
|
+
|
|
8328
8485
|
// src/process/js/js-io.ts
|
|
8329
8486
|
function typeOf(info) {
|
|
8330
8487
|
if (info.meta && "dir" in info.meta) return "directory";
|
|
@@ -8689,22 +8846,20 @@ function createContext(o) {
|
|
|
8689
8846
|
infos.set(fd, got);
|
|
8690
8847
|
return got;
|
|
8691
8848
|
};
|
|
8692
|
-
const read = async (fd, max = CHUNK) => {
|
|
8849
|
+
const read = async (fd, max = CHUNK, signal) => {
|
|
8693
8850
|
index(max, "read");
|
|
8694
8851
|
const emulated = readDevice(await info(fd), max, random);
|
|
8695
8852
|
if (emulated) return emulated;
|
|
8696
|
-
|
|
8697
|
-
return r.ok && r.kind === "bytes" ? r.bytes : new Uint8Array(0);
|
|
8853
|
+
return readPipe(kernel, fd, Math.min(max, MAX_IO), signal);
|
|
8698
8854
|
};
|
|
8699
|
-
const writeAll = async (fd, data) => {
|
|
8855
|
+
const writeAll = async (fd, data, signal) => {
|
|
8700
8856
|
const i = await info(fd);
|
|
8701
8857
|
if (writeDevice(i)) return;
|
|
8702
8858
|
let at = 0;
|
|
8703
8859
|
while (at < data.length) {
|
|
8704
8860
|
const body = data.subarray(at, at + MAX_IO);
|
|
8705
8861
|
try {
|
|
8706
|
-
|
|
8707
|
-
at += written(r, body.length);
|
|
8862
|
+
at += signal ? await sendSome(kernel, fd, body, signal) : written(await kernel.blocking({ op: "fd-write", fd, body }), body.length);
|
|
8708
8863
|
} catch (err) {
|
|
8709
8864
|
if (brokenPipe(err, i)) await kernel.call({ op: "proc-kill", pid: o.pid, sig: SIG.PIPE });
|
|
8710
8865
|
throw err;
|
|
@@ -8725,7 +8880,7 @@ function createContext(o) {
|
|
|
8725
8880
|
}
|
|
8726
8881
|
})();
|
|
8727
8882
|
};
|
|
8728
|
-
const
|
|
8883
|
+
const writable2 = (fd) => new WritableStream({ write: (chunk) => write(fd, chunk) });
|
|
8729
8884
|
const statOf = async (op, path) => {
|
|
8730
8885
|
const abs = resolve(path);
|
|
8731
8886
|
await kernel.call({ op: "fd-path-flush", path: abs });
|
|
@@ -8760,6 +8915,11 @@ function createContext(o) {
|
|
|
8760
8915
|
infos,
|
|
8761
8916
|
handles
|
|
8762
8917
|
});
|
|
8918
|
+
const children = childOps(
|
|
8919
|
+
kernel,
|
|
8920
|
+
{ read, send: writeAll, close: (fd) => ctx.close(fd) },
|
|
8921
|
+
{ env: o.env, cwd: o.cwd, signal: signalNumber }
|
|
8922
|
+
);
|
|
8763
8923
|
const ctx = {
|
|
8764
8924
|
argv: o.argv,
|
|
8765
8925
|
env: o.env,
|
|
@@ -8778,8 +8938,8 @@ function createContext(o) {
|
|
|
8778
8938
|
},
|
|
8779
8939
|
{ highWaterMark: 0 }
|
|
8780
8940
|
),
|
|
8781
|
-
stdout:
|
|
8782
|
-
stderr:
|
|
8941
|
+
stdout: writable2(1),
|
|
8942
|
+
stderr: writable2(2),
|
|
8783
8943
|
read,
|
|
8784
8944
|
write,
|
|
8785
8945
|
async close(fd) {
|
|
@@ -8802,6 +8962,7 @@ function createContext(o) {
|
|
|
8802
8962
|
reset: async (signal) => kernel.setHandler(signalNumber(signal), "default")
|
|
8803
8963
|
},
|
|
8804
8964
|
sync,
|
|
8965
|
+
...children,
|
|
8805
8966
|
exit
|
|
8806
8967
|
};
|
|
8807
8968
|
const drain2 = async () => {
|
|
@@ -8878,6 +9039,29 @@ function fileHandle(kernel, fd, path, append, forget) {
|
|
|
8878
9039
|
}
|
|
8879
9040
|
};
|
|
8880
9041
|
}
|
|
9042
|
+
async function readPipe(kernel, fd, max, signal) {
|
|
9043
|
+
if (signal) return receiveSome(kernel, fd, max, signal);
|
|
9044
|
+
const r = await kernel.blocking({ op: "fd-read", fd, max });
|
|
9045
|
+
return r.ok && r.kind === "bytes" ? r.bytes : new Uint8Array(0);
|
|
9046
|
+
}
|
|
9047
|
+
async function receiveSome(kernel, fd, max, signal) {
|
|
9048
|
+
for (; ; ) {
|
|
9049
|
+
signal.throwIfAborted();
|
|
9050
|
+
const r = await kernel.raw({ op: "fd-read", fd, max, nonblock: true });
|
|
9051
|
+
if (r.ok) return r.kind === "bytes" ? r.bytes : new Uint8Array(0);
|
|
9052
|
+
if (r.errno !== "EAGAIN") throw new JsCallError(r.errno, "fd-read");
|
|
9053
|
+
await kernel.blocking({ op: "fd-select", read: [fd], write: [], timeoutMs: -1 }, signal);
|
|
9054
|
+
}
|
|
9055
|
+
}
|
|
9056
|
+
async function sendSome(kernel, fd, body, signal) {
|
|
9057
|
+
for (; ; ) {
|
|
9058
|
+
signal.throwIfAborted();
|
|
9059
|
+
const r = await kernel.raw({ op: "fd-write", fd, body, nonblock: true });
|
|
9060
|
+
if (r.ok) return written(r, body.length);
|
|
9061
|
+
if (r.errno !== "EAGAIN") throw new JsCallError(r.errno, "fd-write");
|
|
9062
|
+
await kernel.blocking({ op: "fd-select", read: [], write: [fd], timeoutMs: -1 }, signal);
|
|
9063
|
+
}
|
|
9064
|
+
}
|
|
8881
9065
|
function pathOps(kernel, resolve, statOf, open) {
|
|
8882
9066
|
return {
|
|
8883
9067
|
stat: (path) => statOf("stat", path),
|
|
@@ -8911,6 +9095,7 @@ var init_js_context = __esm({
|
|
|
8911
9095
|
"use strict";
|
|
8912
9096
|
init_signals();
|
|
8913
9097
|
init_sync_fs_wire();
|
|
9098
|
+
init_js_children();
|
|
8914
9099
|
init_js_io();
|
|
8915
9100
|
init_js_kernel();
|
|
8916
9101
|
init_js_sync();
|