@ai-ecoverse/slicc-kernel 1.129.0 → 1.130.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 +19 -1
- package/dist/index.js.map +2 -2
- package/dist/kernel-worker.js +230 -54
- package/dist/kernel-worker.js.map +4 -4
- package/dist/node-process-worker.js +149 -31
- package/dist/node-process-worker.js.map +4 -4
- package/dist/node.js +230 -54
- package/dist/node.js.map +4 -4
- package/dist/process-worker.js +129 -14
- package/dist/process-worker.js.map +4 -4
- package/dist/types/index.d.ts +1 -0
- package/dist/types/kernel/js-threads.d.ts +38 -0
- package/dist/types/kernel/protocol.d.ts +35 -0
- package/dist/types/process/js/js-context.d.ts +3 -0
- package/dist/types/process/js/js-thread.d.ts +22 -0
- package/package.json +2 -2
package/dist/kernel-worker.js
CHANGED
|
@@ -636,8 +636,8 @@ var Integrity = class {
|
|
|
636
636
|
}
|
|
637
637
|
}
|
|
638
638
|
async expected(path) {
|
|
639
|
-
const
|
|
640
|
-
return typeof
|
|
639
|
+
const answer2 = await this.lookup(path);
|
|
640
|
+
return typeof answer2 === "string" ? answer2.toLowerCase() : void 0;
|
|
641
641
|
}
|
|
642
642
|
say(event) {
|
|
643
643
|
try {
|
|
@@ -983,12 +983,12 @@ var RemoteWatch = class {
|
|
|
983
983
|
}
|
|
984
984
|
greeted(peer) {
|
|
985
985
|
this.arrived(peer);
|
|
986
|
-
const
|
|
986
|
+
const answer2 = () => {
|
|
987
987
|
this.channel.postMessage({ here: this.tab, to: peer });
|
|
988
988
|
if (this.mine.length > 0) void this.announce(this.mine);
|
|
989
989
|
};
|
|
990
|
-
if (this.quiet) void this.quiet().then(
|
|
991
|
-
else
|
|
990
|
+
if (this.quiet) void this.quiet().then(answer2, answer2);
|
|
991
|
+
else answer2();
|
|
992
992
|
}
|
|
993
993
|
announced({ tab, paths, seq: seq2 }) {
|
|
994
994
|
const from = tab;
|
|
@@ -7020,7 +7020,7 @@ function satisfies(version, range2) {
|
|
|
7020
7020
|
}
|
|
7021
7021
|
|
|
7022
7022
|
// src/version.ts
|
|
7023
|
-
var KERNEL_VERSION = true ? "1.
|
|
7023
|
+
var KERNEL_VERSION = true ? "1.130.0" : "0.0.0-dev";
|
|
7024
7024
|
var OS_RELEASE = "6.0.0-slicc";
|
|
7025
7025
|
function procVersion() {
|
|
7026
7026
|
return `Linux version ${OS_RELEASE} (slicc-kernel ${KERNEL_VERSION}) #1 SMP PREEMPT_DYNAMIC
|
|
@@ -16336,11 +16336,11 @@ function carriesUdp(uplink) {
|
|
|
16336
16336
|
return uplink.traits.udp === true && typeof uplink.udp === "function";
|
|
16337
16337
|
}
|
|
16338
16338
|
function answerOf(result) {
|
|
16339
|
-
const
|
|
16340
|
-
const addresses = Array.isArray(
|
|
16339
|
+
const answer2 = Array.isArray(result) ? { addresses: result } : result;
|
|
16340
|
+
const addresses = Array.isArray(answer2?.addresses) ? answer2.addresses.filter((a) => typeof a === "string") : [];
|
|
16341
16341
|
return {
|
|
16342
16342
|
addresses,
|
|
16343
|
-
...typeof
|
|
16343
|
+
...typeof answer2?.ttl === "number" && answer2.ttl >= 0 ? { ttl: answer2.ttl } : {}
|
|
16344
16344
|
};
|
|
16345
16345
|
}
|
|
16346
16346
|
var NEVER = new Routes(true);
|
|
@@ -16528,9 +16528,9 @@ var Resolver = class {
|
|
|
16528
16528
|
async lookup(name2, family, id2, abandoned) {
|
|
16529
16529
|
const uplink = this.uplink;
|
|
16530
16530
|
const timeout = AbortSignal.any([AbortSignal.timeout(this.timeoutMs), abandoned]);
|
|
16531
|
-
let
|
|
16531
|
+
let answer2;
|
|
16532
16532
|
try {
|
|
16533
|
-
|
|
16533
|
+
answer2 = answerOf(
|
|
16534
16534
|
await Promise.race([
|
|
16535
16535
|
uplink.resolve(name2, family, timeout),
|
|
16536
16536
|
new Promise(
|
|
@@ -16541,8 +16541,8 @@ var Resolver = class {
|
|
|
16541
16541
|
} catch {
|
|
16542
16542
|
return [];
|
|
16543
16543
|
}
|
|
16544
|
-
const addresses =
|
|
16545
|
-
if (addresses.length > 0) this.remember(id2, addresses,
|
|
16544
|
+
const addresses = answer2.addresses.filter((a) => this.usable(name2, a, family));
|
|
16545
|
+
if (addresses.length > 0) this.remember(id2, addresses, answer2.ttl);
|
|
16546
16546
|
return addresses;
|
|
16547
16547
|
}
|
|
16548
16548
|
usable(name2, address, family) {
|
|
@@ -21198,8 +21198,8 @@ var WasmProcess = class {
|
|
|
21198
21198
|
spares(sig) {
|
|
21199
21199
|
const { caught, ignored } = this.signalMasks();
|
|
21200
21200
|
const bit = isSignal(sig) ? sigbit(sig) : 0;
|
|
21201
|
-
const
|
|
21202
|
-
return { ok: true, kind: "json", json:
|
|
21201
|
+
const answer2 = (ignored & bit) !== 0 ? "ignore" : (caught & bit) !== 0 ? "spare" : "terminate";
|
|
21202
|
+
return { ok: true, kind: "json", json: answer2 };
|
|
21203
21203
|
}
|
|
21204
21204
|
async killSelf(sig, target, probe) {
|
|
21205
21205
|
if (!this.options.exitSignal) throw new KernelError("ENOSYS");
|
|
@@ -22316,10 +22316,10 @@ var WasmProcess = class {
|
|
|
22316
22316
|
cwd: typeof req.cwd === "string" && req.cwd.startsWith("/") ? req.cwd : "/",
|
|
22317
22317
|
...typeof req.term === "string" ? { term: req.term } : {}
|
|
22318
22318
|
};
|
|
22319
|
-
const
|
|
22320
|
-
if (!("grant" in
|
|
22319
|
+
const answer2 = await sudo(call, this.blockingSignal(cancelled));
|
|
22320
|
+
if (!("grant" in answer2)) return answer2;
|
|
22321
22321
|
if (this.dying) throw new KernelError("EINTR");
|
|
22322
|
-
const { file, argv, env, cwd, cred, caller } =
|
|
22322
|
+
const { file, argv, env, cwd, cred, caller } = answer2.grant;
|
|
22323
22323
|
const stdio = [{ fd: 0 }, { fd: 1 }, { fd: 2 }];
|
|
22324
22324
|
return {
|
|
22325
22325
|
pid: await this.children.spawn({ file, argv, env, cwd, pgid: 0 }, stdio, [], {
|
|
@@ -22479,6 +22479,153 @@ var WASM_THREAD_SPAWN = "wasm-thread-spawn";
|
|
|
22479
22479
|
var WASM_THREAD_INIT = "wasm-thread-init";
|
|
22480
22480
|
var WASM_THREAD_EXIT = "wasm-thread-exit";
|
|
22481
22481
|
var WASM_MAX_THREADS = 256;
|
|
22482
|
+
var JS_THREAD_SPAWN = "js-thread-spawn";
|
|
22483
|
+
var JS_THREAD_INIT = "js-thread-init";
|
|
22484
|
+
var JS_THREAD_EXIT = "js-thread-exit";
|
|
22485
|
+
var JS_MAX_THREADS = 256;
|
|
22486
|
+
var JS_DEFAULT_THREADS = 16;
|
|
22487
|
+
var JS_THREAD_NO_MEMORY = 256;
|
|
22488
|
+
var JS_THREAD_CRASHED = 257;
|
|
22489
|
+
|
|
22490
|
+
// src/kernel/js-threads.ts
|
|
22491
|
+
var JS_OOM = /out of memory|Array buffer allocation failed|Cannot allocate Wasm memory|could not allocate memory|ERR_WORKER_OUT_OF_MEMORY/i;
|
|
22492
|
+
var ENDING = { ok: false, errno: "EINTR", message: "the thread is ending" };
|
|
22493
|
+
var MAIN_ONLY = { ok: true, kind: "void" };
|
|
22494
|
+
function track(ops, req, result) {
|
|
22495
|
+
if (req.op === "async-submit" && result.ok && result.kind === "json") {
|
|
22496
|
+
if (typeof result.json === "number") ops.set(result.json, req.token);
|
|
22497
|
+
} else if (req.op === "async-cancel" || req.op === "async-take" && (result.ok || result.errno !== "EAGAIN")) {
|
|
22498
|
+
ops.delete(req.id);
|
|
22499
|
+
}
|
|
22500
|
+
}
|
|
22501
|
+
function cores() {
|
|
22502
|
+
const n = globalThis.navigator?.hardwareConcurrency;
|
|
22503
|
+
return typeof n === "number" && Number.isInteger(n) && n > 0 ? n : 0;
|
|
22504
|
+
}
|
|
22505
|
+
function jsThreadCap(env) {
|
|
22506
|
+
const asked = Number.parseInt(env.SLICC_JS_THREADS ?? "", 10);
|
|
22507
|
+
if (asked >= 1) return Math.min(asked, JS_MAX_THREADS);
|
|
22508
|
+
return Math.min(JS_MAX_THREADS, Math.max(JS_DEFAULT_THREADS, 2 * cores()));
|
|
22509
|
+
}
|
|
22510
|
+
function codeOf4(code) {
|
|
22511
|
+
if (code === JS_THREAD_NO_MEMORY || code === JS_THREAD_CRASHED) return code;
|
|
22512
|
+
return typeof code === "number" && Number.isInteger(code) ? code & 255 : JS_THREAD_CRASHED;
|
|
22513
|
+
}
|
|
22514
|
+
function answer(control, message3) {
|
|
22515
|
+
control.postMessage(message3);
|
|
22516
|
+
}
|
|
22517
|
+
var JsThreads = class {
|
|
22518
|
+
deps;
|
|
22519
|
+
live = /* @__PURE__ */ new Map();
|
|
22520
|
+
headers = /* @__PURE__ */ new Map();
|
|
22521
|
+
frozen = false;
|
|
22522
|
+
last = 0;
|
|
22523
|
+
closed = false;
|
|
22524
|
+
constructor(deps) {
|
|
22525
|
+
this.deps = deps;
|
|
22526
|
+
}
|
|
22527
|
+
get size() {
|
|
22528
|
+
return this.live.size;
|
|
22529
|
+
}
|
|
22530
|
+
spawn(msg) {
|
|
22531
|
+
const { control, port } = msg;
|
|
22532
|
+
if (this.closed || this.live.size >= this.deps.cap) {
|
|
22533
|
+
answer(
|
|
22534
|
+
control,
|
|
22535
|
+
this.closed ? { errno: "ESRCH", message: "the process is ending" } : { errno: "EAGAIN", message: `more than ${this.deps.cap} threads` }
|
|
22536
|
+
);
|
|
22537
|
+
control.close();
|
|
22538
|
+
port.close();
|
|
22539
|
+
return;
|
|
22540
|
+
}
|
|
22541
|
+
const tid = ++this.last;
|
|
22542
|
+
const sab = new SharedArrayBuffer(SAB_HEADER_BYTES + SAB_DEFAULT_WINDOW_BYTES);
|
|
22543
|
+
const header3 = new Int32Array(sab, 0, SAB_HEADER_I32);
|
|
22544
|
+
if (this.frozen) Atomics.store(header3, SAB_I_STOP, 1);
|
|
22545
|
+
const worker = this.deps.createWorker();
|
|
22546
|
+
const clock = this.deps.clocks.thread(tid + 1, sab);
|
|
22547
|
+
let ended = false;
|
|
22548
|
+
const end = (code) => {
|
|
22549
|
+
if (ended) return;
|
|
22550
|
+
ended = true;
|
|
22551
|
+
this.live.delete(tid);
|
|
22552
|
+
this.headers.delete(tid);
|
|
22553
|
+
this.deps.wakes.delete(header3);
|
|
22554
|
+
for (const [id2, token] of ops) {
|
|
22555
|
+
void this.deps.dispatch({ op: "async-cancel", id: id2, token });
|
|
22556
|
+
}
|
|
22557
|
+
ops.clear();
|
|
22558
|
+
worker.removeEventListener("message", onMessage);
|
|
22559
|
+
worker.removeEventListener("error", onError);
|
|
22560
|
+
control.removeEventListener("message", onControl);
|
|
22561
|
+
responder.dispose();
|
|
22562
|
+
lane.dispose();
|
|
22563
|
+
this.deps.clocks.threadEnded(tid + 1);
|
|
22564
|
+
worker.terminate();
|
|
22565
|
+
answer(control, { exited: code });
|
|
22566
|
+
control.close();
|
|
22567
|
+
};
|
|
22568
|
+
const ops = /* @__PURE__ */ new Map();
|
|
22569
|
+
const dispatch2 = async (req, block) => {
|
|
22570
|
+
if (isWasmSyscall(req) && req.op === "proc-exit") {
|
|
22571
|
+
queueMicrotask(() => end(req.status & 255));
|
|
22572
|
+
return ENDING;
|
|
22573
|
+
}
|
|
22574
|
+
if (isWasmSyscall(req) && req.op === "sig-mask") return MAIN_ONLY;
|
|
22575
|
+
const result = await this.deps.dispatch(req, block);
|
|
22576
|
+
if (!ended) track(ops, req, result);
|
|
22577
|
+
return result;
|
|
22578
|
+
};
|
|
22579
|
+
const responder = this.deps.attach(worker, sab, this.deps.clocks.timed(clock, dispatch2));
|
|
22580
|
+
const lane = this.deps.openLane(dispatch2);
|
|
22581
|
+
const onMessage = (event) => {
|
|
22582
|
+
const data = event.data;
|
|
22583
|
+
if (data?.type === JS_THREAD_EXIT) end(codeOf4(data.code));
|
|
22584
|
+
else if (data?.type === JS_THREAD_SPAWN) this.spawn(event.data);
|
|
22585
|
+
else if (data?.type === WASM_PROCESS_ERROR) this.crashed(String(data.message), end);
|
|
22586
|
+
};
|
|
22587
|
+
const onError = (event) => {
|
|
22588
|
+
event.preventDefault();
|
|
22589
|
+
this.crashed(String(event.message ?? "worker error"), end);
|
|
22590
|
+
};
|
|
22591
|
+
const onControl = (event) => {
|
|
22592
|
+
if (event.data?.terminate === true) end(1);
|
|
22593
|
+
};
|
|
22594
|
+
worker.addEventListener("message", onMessage);
|
|
22595
|
+
worker.addEventListener("error", onError);
|
|
22596
|
+
control.addEventListener("message", onControl);
|
|
22597
|
+
control.start();
|
|
22598
|
+
this.live.set(tid, end);
|
|
22599
|
+
this.headers.set(tid, header3);
|
|
22600
|
+
this.deps.wakes.add(header3);
|
|
22601
|
+
const init = {
|
|
22602
|
+
...this.deps.init(sab, lane.lane),
|
|
22603
|
+
type: JS_THREAD_INIT,
|
|
22604
|
+
thread: { tid, port, data: msg.data }
|
|
22605
|
+
};
|
|
22606
|
+
try {
|
|
22607
|
+
worker.postMessage(init, [lane.lane.port, port, ...msg.transfer ?? []]);
|
|
22608
|
+
} catch {
|
|
22609
|
+
end(JS_THREAD_CRASHED);
|
|
22610
|
+
return;
|
|
22611
|
+
}
|
|
22612
|
+
answer(control, { tid });
|
|
22613
|
+
}
|
|
22614
|
+
crashed(message3, end) {
|
|
22615
|
+
end(JS_OOM.test(message3) ? JS_THREAD_NO_MEMORY : JS_THREAD_CRASHED);
|
|
22616
|
+
}
|
|
22617
|
+
stopped(stopped) {
|
|
22618
|
+
this.frozen = stopped;
|
|
22619
|
+
for (const header3 of this.headers.values()) {
|
|
22620
|
+
Atomics.store(header3, SAB_I_STOP, stopped ? 1 : 0);
|
|
22621
|
+
Atomics.notify(header3, SAB_I_STOP);
|
|
22622
|
+
}
|
|
22623
|
+
}
|
|
22624
|
+
close() {
|
|
22625
|
+
this.closed = true;
|
|
22626
|
+
for (const end of [...this.live.values()]) end(1);
|
|
22627
|
+
}
|
|
22628
|
+
};
|
|
22482
22629
|
|
|
22483
22630
|
// src/kernel/host.ts
|
|
22484
22631
|
var CRASHED = 70;
|
|
@@ -22581,6 +22728,7 @@ function threadSignalsOf(sab) {
|
|
|
22581
22728
|
function threadCancel(thread) {
|
|
22582
22729
|
return unblocked(thread.header) !== 0 ? AbortSignal.abort() : thread.interrupt.signal;
|
|
22583
22730
|
}
|
|
22731
|
+
var asyncFanout = /* @__PURE__ */ new WeakMap();
|
|
22584
22732
|
function notifiers(header3) {
|
|
22585
22733
|
return {
|
|
22586
22734
|
onPending(sig) {
|
|
@@ -22588,8 +22736,10 @@ function notifiers(header3) {
|
|
|
22588
22736
|
Atomics.notify(header3, SAB_I_SIGNALS);
|
|
22589
22737
|
},
|
|
22590
22738
|
onAsync() {
|
|
22591
|
-
|
|
22592
|
-
|
|
22739
|
+
for (const at of [header3, ...asyncFanout.get(header3) ?? []]) {
|
|
22740
|
+
Atomics.add(at, SAB_I_ASYNC, 1);
|
|
22741
|
+
Atomics.notify(at, SAB_I_ASYNC);
|
|
22742
|
+
}
|
|
22593
22743
|
}
|
|
22594
22744
|
};
|
|
22595
22745
|
}
|
|
@@ -22820,6 +22970,7 @@ function spawnWasmProcess(opts) {
|
|
|
22820
22970
|
dispatch: clocks.timed(void 0, dispatch2)
|
|
22821
22971
|
});
|
|
22822
22972
|
const lane = opts.program.abi === "js" ? openLane(token, dispatch2) : void 0;
|
|
22973
|
+
const jsThreads = jsThreadsOf(opts, process, token, dispatch2, clocks, header3);
|
|
22823
22974
|
const { promise: exited, resolve: settle3 } = Promise.withResolvers();
|
|
22824
22975
|
let done5 = false;
|
|
22825
22976
|
let endedBy;
|
|
@@ -22833,6 +22984,7 @@ function spawnWasmProcess(opts) {
|
|
|
22833
22984
|
worker.removeEventListener("message", onMessage);
|
|
22834
22985
|
worker.removeEventListener("error", onError);
|
|
22835
22986
|
for (const tid of [...threads.keys()]) endThread(tid);
|
|
22987
|
+
jsThreads?.close();
|
|
22836
22988
|
responder.dispose();
|
|
22837
22989
|
lane?.dispose();
|
|
22838
22990
|
revokeSyncFsToken(token);
|
|
@@ -22856,6 +23008,8 @@ function spawnWasmProcess(opts) {
|
|
|
22856
23008
|
finish(...dying.status(data.code));
|
|
22857
23009
|
} else if (data?.type === WASM_THREAD_SPAWN && data.thread) {
|
|
22858
23010
|
spawnThread(data.thread);
|
|
23011
|
+
} else if (data?.type === JS_THREAD_SPAWN && jsThreads) {
|
|
23012
|
+
jsThreads.spawn(data);
|
|
22859
23013
|
}
|
|
22860
23014
|
};
|
|
22861
23015
|
const onMessage = (event) => handle(event.data);
|
|
@@ -22929,13 +23083,35 @@ function spawnWasmProcess(opts) {
|
|
|
22929
23083
|
termsig: () => endedBy,
|
|
22930
23084
|
onState: (listener) => process.onState(listener),
|
|
22931
23085
|
memory: () => Atomics.load(header3, SAB_I_MEMORY) * 65536,
|
|
23086
|
+
...processViews(process, opts, header3),
|
|
23087
|
+
writesBack: () => opts.program.abi === "wasi" && !done5,
|
|
23088
|
+
...clockViews(clocks)
|
|
23089
|
+
};
|
|
23090
|
+
}
|
|
23091
|
+
function jsThreadsOf(opts, process, token, dispatch2, clocks, header3) {
|
|
23092
|
+
if (opts.program.abi !== "js") return void 0;
|
|
23093
|
+
const wakes = /* @__PURE__ */ new Set();
|
|
23094
|
+
asyncFanout.set(header3, wakes);
|
|
23095
|
+
const threads = new JsThreads({
|
|
23096
|
+
wakes,
|
|
23097
|
+
cap: jsThreadCap(opts.env),
|
|
23098
|
+
createWorker: opts.createWorker,
|
|
23099
|
+
init: (sab, lane) => processInit(opts, sab, process.umask, copyCred(process.cred), lane),
|
|
23100
|
+
openLane: (laneDispatch) => openLane(token, laneDispatch),
|
|
23101
|
+
attach: (worker, sab, threadDispatch) => attachSyncSabResponder(worker, sab, token, { dispatch: threadDispatch }),
|
|
23102
|
+
dispatch: dispatch2,
|
|
23103
|
+
clocks
|
|
23104
|
+
});
|
|
23105
|
+
process.onState((state) => threads.stopped(state === "stopped"));
|
|
23106
|
+
return threads;
|
|
23107
|
+
}
|
|
23108
|
+
function processViews(process, opts, header3) {
|
|
23109
|
+
return {
|
|
22932
23110
|
ignoredSignals: (fork) => process.inheritable(fork),
|
|
22933
23111
|
blockedSignals: () => opts.program.abi === "wasi" ? loadBlocked(header3) : [0, 0],
|
|
22934
23112
|
signalMasks: () => process.signalMasks(),
|
|
22935
23113
|
umask: () => process.umask,
|
|
22936
|
-
cred: () => copyCred(process.cred)
|
|
22937
|
-
writesBack: () => opts.program.abi === "wasi" && !done5,
|
|
22938
|
-
...clockViews(clocks)
|
|
23114
|
+
cred: () => copyCred(process.cred)
|
|
22939
23115
|
};
|
|
22940
23116
|
}
|
|
22941
23117
|
function clockViews(clocks) {
|
|
@@ -24253,8 +24429,8 @@ var FSA_CAPABILITIES = {
|
|
|
24253
24429
|
ranges: true,
|
|
24254
24430
|
sessions: true
|
|
24255
24431
|
};
|
|
24256
|
-
var
|
|
24257
|
-
var denied = (err) =>
|
|
24432
|
+
var codeOf5 = (err) => err?.code;
|
|
24433
|
+
var denied = (err) => codeOf5(err) === "EACCES" || err?.name === "NotAllowedError";
|
|
24258
24434
|
function attrOf(st) {
|
|
24259
24435
|
return {
|
|
24260
24436
|
kind: st.isDirectory ? "directory" : st.isSymbolicLink ? "symlink" : "file",
|
|
@@ -24276,7 +24452,7 @@ function kernelFsHandlers(fs) {
|
|
|
24276
24452
|
try {
|
|
24277
24453
|
return await fs.stat(path);
|
|
24278
24454
|
} catch (err) {
|
|
24279
|
-
if (
|
|
24455
|
+
if (codeOf5(err) === "ENOENT") return void 0;
|
|
24280
24456
|
throw err;
|
|
24281
24457
|
}
|
|
24282
24458
|
}
|
|
@@ -24469,7 +24645,7 @@ function parseFstab(text) {
|
|
|
24469
24645
|
});
|
|
24470
24646
|
return lines2;
|
|
24471
24647
|
}
|
|
24472
|
-
function
|
|
24648
|
+
function codeOf6(err) {
|
|
24473
24649
|
const code = err?.code;
|
|
24474
24650
|
return typeof code === "string" ? code : "EIO";
|
|
24475
24651
|
}
|
|
@@ -24507,18 +24683,18 @@ async function mountLine({ line, spec, invalid }, mount, signal, retries, discar
|
|
|
24507
24683
|
break;
|
|
24508
24684
|
} catch (err) {
|
|
24509
24685
|
failed3 = err;
|
|
24510
|
-
if (FINAL.has(
|
|
24686
|
+
if (FINAL.has(codeOf6(err)) || attempt === retries.length) break;
|
|
24511
24687
|
await wait(retries[attempt], signal);
|
|
24512
24688
|
}
|
|
24513
24689
|
}
|
|
24514
|
-
const code =
|
|
24690
|
+
const code = codeOf6(failed3);
|
|
24515
24691
|
return { line, target: spec.target, code, error: String(failed3?.message ?? code) };
|
|
24516
24692
|
}
|
|
24517
24693
|
|
|
24518
24694
|
// src/mount/hostfs.ts
|
|
24519
24695
|
var HOSTFS_IO = 16 * 1024 * 1024;
|
|
24520
|
-
var
|
|
24521
|
-
var unreachable = (err) =>
|
|
24696
|
+
var codeOf7 = (err) => err?.code;
|
|
24697
|
+
var unreachable = (err) => codeOf7(err) === "ENOTCONN";
|
|
24522
24698
|
function rel(path) {
|
|
24523
24699
|
return path.replace(/^\/+/, "");
|
|
24524
24700
|
}
|
|
@@ -24695,7 +24871,7 @@ function hostfsHandlers(current, againMs = RESTORE_AGAIN_MS) {
|
|
|
24695
24871
|
try {
|
|
24696
24872
|
return { opened: await opening2(), restore: void 0 };
|
|
24697
24873
|
} catch (err) {
|
|
24698
|
-
if (!flags2.write ||
|
|
24874
|
+
if (!flags2.write || codeOf7(err) !== "EACCES") throw err;
|
|
24699
24875
|
const was = await client.call("stat", { path: rel(path) });
|
|
24700
24876
|
const mode = was.mode ?? 0;
|
|
24701
24877
|
if (mode & 128) throw err;
|
|
@@ -25915,14 +26091,14 @@ var Sudo = class {
|
|
|
25915
26091
|
if (this.pending.has(cred.ruid)) return failed2("EBUSY", "sudo: another request is pending");
|
|
25916
26092
|
this.pending.add(cred.ruid);
|
|
25917
26093
|
try {
|
|
25918
|
-
const
|
|
25919
|
-
if (typeof
|
|
26094
|
+
const answer2 = await this.ask(caller, self, target, parsed2.command, path, cwd, signal);
|
|
26095
|
+
if (typeof answer2 !== "string") return answer2;
|
|
25920
26096
|
if (await this.canonical(call.cwd) !== cwd || !await this.reachable(cred, cwd)) {
|
|
25921
26097
|
return failed2("EACCES", `sudo: ${call.cwd} changed while the request waited`);
|
|
25922
26098
|
}
|
|
25923
26099
|
const changed = await this.untrusted(path, cwd, word);
|
|
25924
26100
|
if (changed) return changed;
|
|
25925
|
-
if (
|
|
26101
|
+
if (answer2 === "always" && !await this.remember(self, target, cwd, argv)) {
|
|
25926
26102
|
return failed2("EIO", "sudo: the rule could not be recorded");
|
|
25927
26103
|
}
|
|
25928
26104
|
return grant();
|
|
@@ -25977,11 +26153,11 @@ ${lines2}
|
|
|
25977
26153
|
);
|
|
25978
26154
|
try {
|
|
25979
26155
|
const answered2 = Promise.resolve().then(() => approve(req, { signal: control.signal })).catch(() => "deny");
|
|
25980
|
-
const
|
|
25981
|
-
if (
|
|
26156
|
+
const answer2 = await Promise.race([answered2, aborted2]);
|
|
26157
|
+
if (answer2 === "aborted" || control.signal.aborted) {
|
|
25982
26158
|
return control.signal.reason === "expired" ? failed2("ETIMEDOUT", "sudo: the request expired") : failed2("EINTR", "sudo: the request was withdrawn");
|
|
25983
26159
|
}
|
|
25984
|
-
return
|
|
26160
|
+
return answer2 === "once" || answer2 === "always" ? answer2 : failed2("EACCES", "sudo: approval denied");
|
|
25985
26161
|
} finally {
|
|
25986
26162
|
clearTimeout(timer);
|
|
25987
26163
|
requester.removeEventListener("abort", withdraw);
|
|
@@ -26896,7 +27072,7 @@ var Launcher = class {
|
|
|
26896
27072
|
try {
|
|
26897
27073
|
return await this.planOne(req, ctx);
|
|
26898
27074
|
} catch (err) {
|
|
26899
|
-
const code =
|
|
27075
|
+
const code = codeOf8(err);
|
|
26900
27076
|
const searched = bare && req.search !== false && (code === "ENOENT" || code === "ENOEXEC");
|
|
26901
27077
|
if (!searched || await this.commandAt(req.file, ctx.scope)) throw err;
|
|
26902
27078
|
const found = await this.onPath(req, ctx);
|
|
@@ -26913,7 +27089,7 @@ var Launcher = class {
|
|
|
26913
27089
|
try {
|
|
26914
27090
|
return await this.planOne({ ...req, file }, ctx);
|
|
26915
27091
|
} catch (err) {
|
|
26916
|
-
const code =
|
|
27092
|
+
const code = codeOf8(err);
|
|
26917
27093
|
if (code === "EACCES") denied2 = true;
|
|
26918
27094
|
else if (code !== "ENOENT" && code !== "ENOTDIR") throw err;
|
|
26919
27095
|
}
|
|
@@ -26923,7 +27099,7 @@ var Launcher = class {
|
|
|
26923
27099
|
}
|
|
26924
27100
|
async planOne(req, { ppid, cred, scope }) {
|
|
26925
27101
|
const refused3 = (err) => {
|
|
26926
|
-
throw
|
|
27102
|
+
throw codeOf8(err) === "EACCES" ? new SpawnError("EACCES") : err;
|
|
26927
27103
|
};
|
|
26928
27104
|
const file = await this.execFile(req.file, req.cwd, this.execGuard(cred, ppid)).catch(refused3);
|
|
26929
27105
|
const planned = await this.plan(file, req.argv, req.cwd, scope, req.argv0);
|
|
@@ -28433,7 +28609,7 @@ var Launcher = class {
|
|
|
28433
28609
|
function cronLocks() {
|
|
28434
28610
|
return globalThis.navigator?.locks;
|
|
28435
28611
|
}
|
|
28436
|
-
function
|
|
28612
|
+
function codeOf8(err) {
|
|
28437
28613
|
return err?.code;
|
|
28438
28614
|
}
|
|
28439
28615
|
|
|
@@ -28473,14 +28649,14 @@ function clipboardAsker(port) {
|
|
|
28473
28649
|
await ask("write", stamp, text);
|
|
28474
28650
|
}
|
|
28475
28651
|
};
|
|
28476
|
-
const
|
|
28652
|
+
const answer2 = ({ id: id2, text, error }) => {
|
|
28477
28653
|
const waiting = asks.get(id2);
|
|
28478
28654
|
if (!waiting) return;
|
|
28479
28655
|
asks.delete(id2);
|
|
28480
28656
|
if (error) waiting.reject(Object.assign(new Error(error.message), { name: error.name }));
|
|
28481
28657
|
else waiting.resolve(text);
|
|
28482
28658
|
};
|
|
28483
|
-
return { hook, answer };
|
|
28659
|
+
return { hook, answer: answer2 };
|
|
28484
28660
|
}
|
|
28485
28661
|
|
|
28486
28662
|
// src/integrity-relay.ts
|
|
@@ -28494,14 +28670,14 @@ function integrityAsker(port) {
|
|
|
28494
28670
|
port.postMessage({ integrityAsk: { id: id2, path } });
|
|
28495
28671
|
return waiting.promise;
|
|
28496
28672
|
};
|
|
28497
|
-
const
|
|
28673
|
+
const answer2 = ({ id: id2, hash, error }) => {
|
|
28498
28674
|
const waiting = asks.get(id2);
|
|
28499
28675
|
if (!waiting) return;
|
|
28500
28676
|
asks.delete(id2);
|
|
28501
28677
|
if (error !== void 0) waiting.reject(new Error(error));
|
|
28502
28678
|
else waiting.resolve(hash);
|
|
28503
28679
|
};
|
|
28504
|
-
return { lookup: lookup2, answer };
|
|
28680
|
+
return { lookup: lookup2, answer: answer2 };
|
|
28505
28681
|
}
|
|
28506
28682
|
|
|
28507
28683
|
// src/kernel/net/remote-transport.ts
|
|
@@ -28725,14 +28901,14 @@ function sealedAsker(port) {
|
|
|
28725
28901
|
port.postMessage({ sealedAsk: { id: id2, req } });
|
|
28726
28902
|
return waiting.promise.finally(() => signal.removeEventListener("abort", abort));
|
|
28727
28903
|
};
|
|
28728
|
-
const
|
|
28904
|
+
const answer2 = ({ id: id2, reply, error }) => {
|
|
28729
28905
|
const waiting = asks.get(id2);
|
|
28730
28906
|
if (!waiting) return;
|
|
28731
28907
|
asks.delete(id2);
|
|
28732
28908
|
if (reply) waiting.resolve(reply);
|
|
28733
28909
|
else waiting.reject(new Error(error ?? "no reply"));
|
|
28734
28910
|
};
|
|
28735
|
-
return { hook, answer };
|
|
28911
|
+
return { hook, answer: answer2 };
|
|
28736
28912
|
}
|
|
28737
28913
|
|
|
28738
28914
|
// src/serve.ts
|
|
@@ -28845,8 +29021,8 @@ function sudoApprovals(port) {
|
|
|
28845
29021
|
);
|
|
28846
29022
|
port.postMessage({ sudoAsk: req });
|
|
28847
29023
|
}),
|
|
28848
|
-
answer({ id: id2, answer }) {
|
|
28849
|
-
waiting.get(id2)?.(
|
|
29024
|
+
answer({ id: id2, answer: answer2 }) {
|
|
29025
|
+
waiting.get(id2)?.(answer2);
|
|
28850
29026
|
waiting.delete(id2);
|
|
28851
29027
|
}
|
|
28852
29028
|
};
|
|
@@ -28940,10 +29116,10 @@ function policyAsker(port) {
|
|
|
28940
29116
|
return {
|
|
28941
29117
|
mountPolicy: (policy) => policy === void 0 ? {} : { processMounts: policy === "ask" ? askPolicy : policy },
|
|
28942
29118
|
allowed(data) {
|
|
28943
|
-
const
|
|
28944
|
-
if (!
|
|
28945
|
-
policies.get(
|
|
28946
|
-
policies.delete(
|
|
29119
|
+
const answer2 = data.mountAllowed;
|
|
29120
|
+
if (!answer2) return false;
|
|
29121
|
+
policies.get(answer2.id)?.(answer2.allowed);
|
|
29122
|
+
policies.delete(answer2.id);
|
|
28947
29123
|
return true;
|
|
28948
29124
|
}
|
|
28949
29125
|
};
|