@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/node.js
CHANGED
|
@@ -3913,8 +3913,8 @@ var Integrity = class {
|
|
|
3913
3913
|
}
|
|
3914
3914
|
}
|
|
3915
3915
|
async expected(path) {
|
|
3916
|
-
const
|
|
3917
|
-
return typeof
|
|
3916
|
+
const answer2 = await this.lookup(path);
|
|
3917
|
+
return typeof answer2 === "string" ? answer2.toLowerCase() : void 0;
|
|
3918
3918
|
}
|
|
3919
3919
|
say(event) {
|
|
3920
3920
|
try {
|
|
@@ -4247,12 +4247,12 @@ var RemoteWatch = class {
|
|
|
4247
4247
|
}
|
|
4248
4248
|
greeted(peer) {
|
|
4249
4249
|
this.arrived(peer);
|
|
4250
|
-
const
|
|
4250
|
+
const answer2 = () => {
|
|
4251
4251
|
this.channel.postMessage({ here: this.tab, to: peer });
|
|
4252
4252
|
if (this.mine.length > 0) void this.announce(this.mine);
|
|
4253
4253
|
};
|
|
4254
|
-
if (this.quiet) void this.quiet().then(
|
|
4255
|
-
else
|
|
4254
|
+
if (this.quiet) void this.quiet().then(answer2, answer2);
|
|
4255
|
+
else answer2();
|
|
4256
4256
|
}
|
|
4257
4257
|
announced({ tab, paths, seq: seq2 }) {
|
|
4258
4258
|
const from = tab;
|
|
@@ -7392,7 +7392,7 @@ function satisfies(version, range2) {
|
|
|
7392
7392
|
}
|
|
7393
7393
|
|
|
7394
7394
|
// src/version.ts
|
|
7395
|
-
var KERNEL_VERSION = true ? "1.
|
|
7395
|
+
var KERNEL_VERSION = true ? "1.130.0" : "0.0.0-dev";
|
|
7396
7396
|
var OS_RELEASE = "6.0.0-slicc";
|
|
7397
7397
|
function procVersion() {
|
|
7398
7398
|
return `Linux version ${OS_RELEASE} (slicc-kernel ${KERNEL_VERSION}) #1 SMP PREEMPT_DYNAMIC
|
|
@@ -16301,11 +16301,11 @@ function carriesUdp(uplink) {
|
|
|
16301
16301
|
return uplink.traits.udp === true && typeof uplink.udp === "function";
|
|
16302
16302
|
}
|
|
16303
16303
|
function answerOf(result) {
|
|
16304
|
-
const
|
|
16305
|
-
const addresses = Array.isArray(
|
|
16304
|
+
const answer2 = Array.isArray(result) ? { addresses: result } : result;
|
|
16305
|
+
const addresses = Array.isArray(answer2?.addresses) ? answer2.addresses.filter((a) => typeof a === "string") : [];
|
|
16306
16306
|
return {
|
|
16307
16307
|
addresses,
|
|
16308
|
-
...typeof
|
|
16308
|
+
...typeof answer2?.ttl === "number" && answer2.ttl >= 0 ? { ttl: answer2.ttl } : {}
|
|
16309
16309
|
};
|
|
16310
16310
|
}
|
|
16311
16311
|
var NEVER = new Routes(true);
|
|
@@ -16383,9 +16383,9 @@ var Resolver = class {
|
|
|
16383
16383
|
async lookup(name2, family, id2, abandoned) {
|
|
16384
16384
|
const uplink = this.uplink;
|
|
16385
16385
|
const timeout = AbortSignal.any([AbortSignal.timeout(this.timeoutMs), abandoned]);
|
|
16386
|
-
let
|
|
16386
|
+
let answer2;
|
|
16387
16387
|
try {
|
|
16388
|
-
|
|
16388
|
+
answer2 = answerOf(
|
|
16389
16389
|
await Promise.race([
|
|
16390
16390
|
uplink.resolve(name2, family, timeout),
|
|
16391
16391
|
new Promise(
|
|
@@ -16396,8 +16396,8 @@ var Resolver = class {
|
|
|
16396
16396
|
} catch {
|
|
16397
16397
|
return [];
|
|
16398
16398
|
}
|
|
16399
|
-
const addresses =
|
|
16400
|
-
if (addresses.length > 0) this.remember(id2, addresses,
|
|
16399
|
+
const addresses = answer2.addresses.filter((a) => this.usable(name2, a, family));
|
|
16400
|
+
if (addresses.length > 0) this.remember(id2, addresses, answer2.ttl);
|
|
16401
16401
|
return addresses;
|
|
16402
16402
|
}
|
|
16403
16403
|
usable(name2, address, family) {
|
|
@@ -21053,8 +21053,8 @@ var WasmProcess = class {
|
|
|
21053
21053
|
spares(sig) {
|
|
21054
21054
|
const { caught, ignored } = this.signalMasks();
|
|
21055
21055
|
const bit = isSignal(sig) ? sigbit(sig) : 0;
|
|
21056
|
-
const
|
|
21057
|
-
return { ok: true, kind: "json", json:
|
|
21056
|
+
const answer2 = (ignored & bit) !== 0 ? "ignore" : (caught & bit) !== 0 ? "spare" : "terminate";
|
|
21057
|
+
return { ok: true, kind: "json", json: answer2 };
|
|
21058
21058
|
}
|
|
21059
21059
|
async killSelf(sig, target, probe2) {
|
|
21060
21060
|
if (!this.options.exitSignal) throw new KernelError("ENOSYS");
|
|
@@ -22171,10 +22171,10 @@ var WasmProcess = class {
|
|
|
22171
22171
|
cwd: typeof req.cwd === "string" && req.cwd.startsWith("/") ? req.cwd : "/",
|
|
22172
22172
|
...typeof req.term === "string" ? { term: req.term } : {}
|
|
22173
22173
|
};
|
|
22174
|
-
const
|
|
22175
|
-
if (!("grant" in
|
|
22174
|
+
const answer2 = await sudo(call, this.blockingSignal(cancelled));
|
|
22175
|
+
if (!("grant" in answer2)) return answer2;
|
|
22176
22176
|
if (this.dying) throw new KernelError("EINTR");
|
|
22177
|
-
const { file, argv, env, cwd, cred, caller } =
|
|
22177
|
+
const { file, argv, env, cwd, cred, caller } = answer2.grant;
|
|
22178
22178
|
const stdio = [{ fd: 0 }, { fd: 1 }, { fd: 2 }];
|
|
22179
22179
|
return {
|
|
22180
22180
|
pid: await this.children.spawn({ file, argv, env, cwd, pgid: 0 }, stdio, [], {
|
|
@@ -22334,6 +22334,153 @@ var WASM_THREAD_SPAWN = "wasm-thread-spawn";
|
|
|
22334
22334
|
var WASM_THREAD_INIT = "wasm-thread-init";
|
|
22335
22335
|
var WASM_THREAD_EXIT = "wasm-thread-exit";
|
|
22336
22336
|
var WASM_MAX_THREADS = 256;
|
|
22337
|
+
var JS_THREAD_SPAWN = "js-thread-spawn";
|
|
22338
|
+
var JS_THREAD_INIT = "js-thread-init";
|
|
22339
|
+
var JS_THREAD_EXIT = "js-thread-exit";
|
|
22340
|
+
var JS_MAX_THREADS = 256;
|
|
22341
|
+
var JS_DEFAULT_THREADS = 16;
|
|
22342
|
+
var JS_THREAD_NO_MEMORY = 256;
|
|
22343
|
+
var JS_THREAD_CRASHED = 257;
|
|
22344
|
+
|
|
22345
|
+
// src/kernel/js-threads.ts
|
|
22346
|
+
var JS_OOM = /out of memory|Array buffer allocation failed|Cannot allocate Wasm memory|could not allocate memory|ERR_WORKER_OUT_OF_MEMORY/i;
|
|
22347
|
+
var ENDING = { ok: false, errno: "EINTR", message: "the thread is ending" };
|
|
22348
|
+
var MAIN_ONLY = { ok: true, kind: "void" };
|
|
22349
|
+
function track(ops, req, result) {
|
|
22350
|
+
if (req.op === "async-submit" && result.ok && result.kind === "json") {
|
|
22351
|
+
if (typeof result.json === "number") ops.set(result.json, req.token);
|
|
22352
|
+
} else if (req.op === "async-cancel" || req.op === "async-take" && (result.ok || result.errno !== "EAGAIN")) {
|
|
22353
|
+
ops.delete(req.id);
|
|
22354
|
+
}
|
|
22355
|
+
}
|
|
22356
|
+
function cores() {
|
|
22357
|
+
const n = globalThis.navigator?.hardwareConcurrency;
|
|
22358
|
+
return typeof n === "number" && Number.isInteger(n) && n > 0 ? n : 0;
|
|
22359
|
+
}
|
|
22360
|
+
function jsThreadCap(env) {
|
|
22361
|
+
const asked = Number.parseInt(env.SLICC_JS_THREADS ?? "", 10);
|
|
22362
|
+
if (asked >= 1) return Math.min(asked, JS_MAX_THREADS);
|
|
22363
|
+
return Math.min(JS_MAX_THREADS, Math.max(JS_DEFAULT_THREADS, 2 * cores()));
|
|
22364
|
+
}
|
|
22365
|
+
function codeOf4(code) {
|
|
22366
|
+
if (code === JS_THREAD_NO_MEMORY || code === JS_THREAD_CRASHED) return code;
|
|
22367
|
+
return typeof code === "number" && Number.isInteger(code) ? code & 255 : JS_THREAD_CRASHED;
|
|
22368
|
+
}
|
|
22369
|
+
function answer(control, message3) {
|
|
22370
|
+
control.postMessage(message3);
|
|
22371
|
+
}
|
|
22372
|
+
var JsThreads = class {
|
|
22373
|
+
deps;
|
|
22374
|
+
live = /* @__PURE__ */ new Map();
|
|
22375
|
+
headers = /* @__PURE__ */ new Map();
|
|
22376
|
+
frozen = false;
|
|
22377
|
+
last = 0;
|
|
22378
|
+
closed = false;
|
|
22379
|
+
constructor(deps) {
|
|
22380
|
+
this.deps = deps;
|
|
22381
|
+
}
|
|
22382
|
+
get size() {
|
|
22383
|
+
return this.live.size;
|
|
22384
|
+
}
|
|
22385
|
+
spawn(msg) {
|
|
22386
|
+
const { control, port } = msg;
|
|
22387
|
+
if (this.closed || this.live.size >= this.deps.cap) {
|
|
22388
|
+
answer(
|
|
22389
|
+
control,
|
|
22390
|
+
this.closed ? { errno: "ESRCH", message: "the process is ending" } : { errno: "EAGAIN", message: `more than ${this.deps.cap} threads` }
|
|
22391
|
+
);
|
|
22392
|
+
control.close();
|
|
22393
|
+
port.close();
|
|
22394
|
+
return;
|
|
22395
|
+
}
|
|
22396
|
+
const tid = ++this.last;
|
|
22397
|
+
const sab = new SharedArrayBuffer(SAB_HEADER_BYTES + SAB_DEFAULT_WINDOW_BYTES);
|
|
22398
|
+
const header4 = new Int32Array(sab, 0, SAB_HEADER_I32);
|
|
22399
|
+
if (this.frozen) Atomics.store(header4, SAB_I_STOP, 1);
|
|
22400
|
+
const worker = this.deps.createWorker();
|
|
22401
|
+
const clock = this.deps.clocks.thread(tid + 1, sab);
|
|
22402
|
+
let ended = false;
|
|
22403
|
+
const end = (code) => {
|
|
22404
|
+
if (ended) return;
|
|
22405
|
+
ended = true;
|
|
22406
|
+
this.live.delete(tid);
|
|
22407
|
+
this.headers.delete(tid);
|
|
22408
|
+
this.deps.wakes.delete(header4);
|
|
22409
|
+
for (const [id2, token] of ops) {
|
|
22410
|
+
void this.deps.dispatch({ op: "async-cancel", id: id2, token });
|
|
22411
|
+
}
|
|
22412
|
+
ops.clear();
|
|
22413
|
+
worker.removeEventListener("message", onMessage);
|
|
22414
|
+
worker.removeEventListener("error", onError);
|
|
22415
|
+
control.removeEventListener("message", onControl);
|
|
22416
|
+
responder.dispose();
|
|
22417
|
+
lane.dispose();
|
|
22418
|
+
this.deps.clocks.threadEnded(tid + 1);
|
|
22419
|
+
worker.terminate();
|
|
22420
|
+
answer(control, { exited: code });
|
|
22421
|
+
control.close();
|
|
22422
|
+
};
|
|
22423
|
+
const ops = /* @__PURE__ */ new Map();
|
|
22424
|
+
const dispatch2 = async (req, block) => {
|
|
22425
|
+
if (isWasmSyscall(req) && req.op === "proc-exit") {
|
|
22426
|
+
queueMicrotask(() => end(req.status & 255));
|
|
22427
|
+
return ENDING;
|
|
22428
|
+
}
|
|
22429
|
+
if (isWasmSyscall(req) && req.op === "sig-mask") return MAIN_ONLY;
|
|
22430
|
+
const result = await this.deps.dispatch(req, block);
|
|
22431
|
+
if (!ended) track(ops, req, result);
|
|
22432
|
+
return result;
|
|
22433
|
+
};
|
|
22434
|
+
const responder = this.deps.attach(worker, sab, this.deps.clocks.timed(clock, dispatch2));
|
|
22435
|
+
const lane = this.deps.openLane(dispatch2);
|
|
22436
|
+
const onMessage = (event) => {
|
|
22437
|
+
const data = event.data;
|
|
22438
|
+
if (data?.type === JS_THREAD_EXIT) end(codeOf4(data.code));
|
|
22439
|
+
else if (data?.type === JS_THREAD_SPAWN) this.spawn(event.data);
|
|
22440
|
+
else if (data?.type === WASM_PROCESS_ERROR) this.crashed(String(data.message), end);
|
|
22441
|
+
};
|
|
22442
|
+
const onError = (event) => {
|
|
22443
|
+
event.preventDefault();
|
|
22444
|
+
this.crashed(String(event.message ?? "worker error"), end);
|
|
22445
|
+
};
|
|
22446
|
+
const onControl = (event) => {
|
|
22447
|
+
if (event.data?.terminate === true) end(1);
|
|
22448
|
+
};
|
|
22449
|
+
worker.addEventListener("message", onMessage);
|
|
22450
|
+
worker.addEventListener("error", onError);
|
|
22451
|
+
control.addEventListener("message", onControl);
|
|
22452
|
+
control.start();
|
|
22453
|
+
this.live.set(tid, end);
|
|
22454
|
+
this.headers.set(tid, header4);
|
|
22455
|
+
this.deps.wakes.add(header4);
|
|
22456
|
+
const init = {
|
|
22457
|
+
...this.deps.init(sab, lane.lane),
|
|
22458
|
+
type: JS_THREAD_INIT,
|
|
22459
|
+
thread: { tid, port, data: msg.data }
|
|
22460
|
+
};
|
|
22461
|
+
try {
|
|
22462
|
+
worker.postMessage(init, [lane.lane.port, port, ...msg.transfer ?? []]);
|
|
22463
|
+
} catch {
|
|
22464
|
+
end(JS_THREAD_CRASHED);
|
|
22465
|
+
return;
|
|
22466
|
+
}
|
|
22467
|
+
answer(control, { tid });
|
|
22468
|
+
}
|
|
22469
|
+
crashed(message3, end) {
|
|
22470
|
+
end(JS_OOM.test(message3) ? JS_THREAD_NO_MEMORY : JS_THREAD_CRASHED);
|
|
22471
|
+
}
|
|
22472
|
+
stopped(stopped) {
|
|
22473
|
+
this.frozen = stopped;
|
|
22474
|
+
for (const header4 of this.headers.values()) {
|
|
22475
|
+
Atomics.store(header4, SAB_I_STOP, stopped ? 1 : 0);
|
|
22476
|
+
Atomics.notify(header4, SAB_I_STOP);
|
|
22477
|
+
}
|
|
22478
|
+
}
|
|
22479
|
+
close() {
|
|
22480
|
+
this.closed = true;
|
|
22481
|
+
for (const end of [...this.live.values()]) end(1);
|
|
22482
|
+
}
|
|
22483
|
+
};
|
|
22337
22484
|
|
|
22338
22485
|
// src/kernel/host.ts
|
|
22339
22486
|
var CRASHED = 70;
|
|
@@ -22436,6 +22583,7 @@ function threadSignalsOf(sab) {
|
|
|
22436
22583
|
function threadCancel(thread) {
|
|
22437
22584
|
return unblocked(thread.header) !== 0 ? AbortSignal.abort() : thread.interrupt.signal;
|
|
22438
22585
|
}
|
|
22586
|
+
var asyncFanout = /* @__PURE__ */ new WeakMap();
|
|
22439
22587
|
function notifiers(header4) {
|
|
22440
22588
|
return {
|
|
22441
22589
|
onPending(sig) {
|
|
@@ -22443,8 +22591,10 @@ function notifiers(header4) {
|
|
|
22443
22591
|
Atomics.notify(header4, SAB_I_SIGNALS);
|
|
22444
22592
|
},
|
|
22445
22593
|
onAsync() {
|
|
22446
|
-
|
|
22447
|
-
|
|
22594
|
+
for (const at of [header4, ...asyncFanout.get(header4) ?? []]) {
|
|
22595
|
+
Atomics.add(at, SAB_I_ASYNC, 1);
|
|
22596
|
+
Atomics.notify(at, SAB_I_ASYNC);
|
|
22597
|
+
}
|
|
22448
22598
|
}
|
|
22449
22599
|
};
|
|
22450
22600
|
}
|
|
@@ -22675,6 +22825,7 @@ function spawnWasmProcess(opts) {
|
|
|
22675
22825
|
dispatch: clocks.timed(void 0, dispatch2)
|
|
22676
22826
|
});
|
|
22677
22827
|
const lane = opts.program.abi === "js" ? openLane(token, dispatch2) : void 0;
|
|
22828
|
+
const jsThreads = jsThreadsOf(opts, process2, token, dispatch2, clocks, header4);
|
|
22678
22829
|
const { promise: exited, resolve: settle } = Promise.withResolvers();
|
|
22679
22830
|
let done4 = false;
|
|
22680
22831
|
let endedBy;
|
|
@@ -22688,6 +22839,7 @@ function spawnWasmProcess(opts) {
|
|
|
22688
22839
|
worker.removeEventListener("message", onMessage);
|
|
22689
22840
|
worker.removeEventListener("error", onError);
|
|
22690
22841
|
for (const tid of [...threads.keys()]) endThread(tid);
|
|
22842
|
+
jsThreads?.close();
|
|
22691
22843
|
responder.dispose();
|
|
22692
22844
|
lane?.dispose();
|
|
22693
22845
|
revokeSyncFsToken(token);
|
|
@@ -22711,6 +22863,8 @@ function spawnWasmProcess(opts) {
|
|
|
22711
22863
|
finish(...dying.status(data.code));
|
|
22712
22864
|
} else if (data?.type === WASM_THREAD_SPAWN && data.thread) {
|
|
22713
22865
|
spawnThread(data.thread);
|
|
22866
|
+
} else if (data?.type === JS_THREAD_SPAWN && jsThreads) {
|
|
22867
|
+
jsThreads.spawn(data);
|
|
22714
22868
|
}
|
|
22715
22869
|
};
|
|
22716
22870
|
const onMessage = (event) => handle(event.data);
|
|
@@ -22784,13 +22938,35 @@ function spawnWasmProcess(opts) {
|
|
|
22784
22938
|
termsig: () => endedBy,
|
|
22785
22939
|
onState: (listener) => process2.onState(listener),
|
|
22786
22940
|
memory: () => Atomics.load(header4, SAB_I_MEMORY) * 65536,
|
|
22941
|
+
...processViews(process2, opts, header4),
|
|
22942
|
+
writesBack: () => opts.program.abi === "wasi" && !done4,
|
|
22943
|
+
...clockViews(clocks)
|
|
22944
|
+
};
|
|
22945
|
+
}
|
|
22946
|
+
function jsThreadsOf(opts, process2, token, dispatch2, clocks, header4) {
|
|
22947
|
+
if (opts.program.abi !== "js") return void 0;
|
|
22948
|
+
const wakes = /* @__PURE__ */ new Set();
|
|
22949
|
+
asyncFanout.set(header4, wakes);
|
|
22950
|
+
const threads = new JsThreads({
|
|
22951
|
+
wakes,
|
|
22952
|
+
cap: jsThreadCap(opts.env),
|
|
22953
|
+
createWorker: opts.createWorker,
|
|
22954
|
+
init: (sab, lane) => processInit(opts, sab, process2.umask, copyCred(process2.cred), lane),
|
|
22955
|
+
openLane: (laneDispatch) => openLane(token, laneDispatch),
|
|
22956
|
+
attach: (worker, sab, threadDispatch) => attachSyncSabResponder(worker, sab, token, { dispatch: threadDispatch }),
|
|
22957
|
+
dispatch: dispatch2,
|
|
22958
|
+
clocks
|
|
22959
|
+
});
|
|
22960
|
+
process2.onState((state) => threads.stopped(state === "stopped"));
|
|
22961
|
+
return threads;
|
|
22962
|
+
}
|
|
22963
|
+
function processViews(process2, opts, header4) {
|
|
22964
|
+
return {
|
|
22787
22965
|
ignoredSignals: (fork) => process2.inheritable(fork),
|
|
22788
22966
|
blockedSignals: () => opts.program.abi === "wasi" ? loadBlocked(header4) : [0, 0],
|
|
22789
22967
|
signalMasks: () => process2.signalMasks(),
|
|
22790
22968
|
umask: () => process2.umask,
|
|
22791
|
-
cred: () => copyCred(process2.cred)
|
|
22792
|
-
writesBack: () => opts.program.abi === "wasi" && !done4,
|
|
22793
|
-
...clockViews(clocks)
|
|
22969
|
+
cred: () => copyCred(process2.cred)
|
|
22794
22970
|
};
|
|
22795
22971
|
}
|
|
22796
22972
|
function clockViews(clocks) {
|
|
@@ -24108,8 +24284,8 @@ var FSA_CAPABILITIES = {
|
|
|
24108
24284
|
ranges: true,
|
|
24109
24285
|
sessions: true
|
|
24110
24286
|
};
|
|
24111
|
-
var
|
|
24112
|
-
var denied = (err) =>
|
|
24287
|
+
var codeOf5 = (err) => err?.code;
|
|
24288
|
+
var denied = (err) => codeOf5(err) === "EACCES" || err?.name === "NotAllowedError";
|
|
24113
24289
|
function attrOf(st) {
|
|
24114
24290
|
return {
|
|
24115
24291
|
kind: st.isDirectory ? "directory" : st.isSymbolicLink ? "symlink" : "file",
|
|
@@ -24131,7 +24307,7 @@ function kernelFsHandlers(fs) {
|
|
|
24131
24307
|
try {
|
|
24132
24308
|
return await fs.stat(path);
|
|
24133
24309
|
} catch (err) {
|
|
24134
|
-
if (
|
|
24310
|
+
if (codeOf5(err) === "ENOENT") return void 0;
|
|
24135
24311
|
throw err;
|
|
24136
24312
|
}
|
|
24137
24313
|
}
|
|
@@ -24324,7 +24500,7 @@ function parseFstab(text) {
|
|
|
24324
24500
|
});
|
|
24325
24501
|
return lines2;
|
|
24326
24502
|
}
|
|
24327
|
-
function
|
|
24503
|
+
function codeOf6(err) {
|
|
24328
24504
|
const code = err?.code;
|
|
24329
24505
|
return typeof code === "string" ? code : "EIO";
|
|
24330
24506
|
}
|
|
@@ -24362,18 +24538,18 @@ async function mountLine({ line, spec, invalid }, mount, signal, retries, discar
|
|
|
24362
24538
|
break;
|
|
24363
24539
|
} catch (err) {
|
|
24364
24540
|
failed3 = err;
|
|
24365
|
-
if (FINAL.has(
|
|
24541
|
+
if (FINAL.has(codeOf6(err)) || attempt === retries.length) break;
|
|
24366
24542
|
await wait(retries[attempt], signal);
|
|
24367
24543
|
}
|
|
24368
24544
|
}
|
|
24369
|
-
const code =
|
|
24545
|
+
const code = codeOf6(failed3);
|
|
24370
24546
|
return { line, target: spec.target, code, error: String(failed3?.message ?? code) };
|
|
24371
24547
|
}
|
|
24372
24548
|
|
|
24373
24549
|
// src/mount/hostfs.ts
|
|
24374
24550
|
var HOSTFS_IO = 16 * 1024 * 1024;
|
|
24375
|
-
var
|
|
24376
|
-
var unreachable = (err) =>
|
|
24551
|
+
var codeOf7 = (err) => err?.code;
|
|
24552
|
+
var unreachable = (err) => codeOf7(err) === "ENOTCONN";
|
|
24377
24553
|
function rel(path) {
|
|
24378
24554
|
return path.replace(/^\/+/, "");
|
|
24379
24555
|
}
|
|
@@ -24550,7 +24726,7 @@ function hostfsHandlers(current, againMs = RESTORE_AGAIN_MS) {
|
|
|
24550
24726
|
try {
|
|
24551
24727
|
return { opened: await opening2(), restore: void 0 };
|
|
24552
24728
|
} catch (err) {
|
|
24553
|
-
if (!flags2.write ||
|
|
24729
|
+
if (!flags2.write || codeOf7(err) !== "EACCES") throw err;
|
|
24554
24730
|
const was = await client.call("stat", { path: rel(path) });
|
|
24555
24731
|
const mode = was.mode ?? 0;
|
|
24556
24732
|
if (mode & 128) throw err;
|
|
@@ -24975,7 +25151,7 @@ var PortTransport = class {
|
|
|
24975
25151
|
}
|
|
24976
25152
|
};
|
|
24977
25153
|
var errorOf = (err) => ({
|
|
24978
|
-
code: typeof
|
|
25154
|
+
code: typeof codeOf7(err) === "string" ? codeOf7(err) : "EIO",
|
|
24979
25155
|
message: err?.message ?? String(err)
|
|
24980
25156
|
});
|
|
24981
25157
|
function serveHostfsPort(port, transport) {
|
|
@@ -24989,14 +25165,14 @@ function serveHostfsPort(port, transport) {
|
|
|
24989
25165
|
};
|
|
24990
25166
|
const send2 = (reply, transfer = []) => port.postMessage(reply, transfer);
|
|
24991
25167
|
const pending = /* @__PURE__ */ new Set();
|
|
24992
|
-
const
|
|
25168
|
+
const track2 = (work) => {
|
|
24993
25169
|
pending.add(work);
|
|
24994
25170
|
const done4 = () => pending.delete(work);
|
|
24995
25171
|
work.then(done4, done4);
|
|
24996
25172
|
return work;
|
|
24997
25173
|
};
|
|
24998
|
-
const
|
|
24999
|
-
const result = await
|
|
25174
|
+
const answer2 = async (name2, body) => {
|
|
25175
|
+
const result = await track2(transport.call(name2, body));
|
|
25000
25176
|
const opened2 = result?.fh;
|
|
25001
25177
|
if (name2 === "open" && typeof opened2 === "number") handles.add(opened2);
|
|
25002
25178
|
if (name2 === "release") handles.delete(body?.fh);
|
|
@@ -25010,7 +25186,7 @@ function serveHostfsPort(port, transport) {
|
|
|
25010
25186
|
if (op === "ping") return send2({ id: id2, pong: true });
|
|
25011
25187
|
if (op === "bye") return stop();
|
|
25012
25188
|
if (op === "cleanup")
|
|
25013
|
-
return void Promise.allSettled([...pending]).then(() =>
|
|
25189
|
+
return void Promise.allSettled([...pending]).then(() => answer2(data.name, data.body)).catch(() => {
|
|
25014
25190
|
});
|
|
25015
25191
|
if (op === "unwatch") return watches.get(id2)?.abort();
|
|
25016
25192
|
if (op === "watch") {
|
|
@@ -25032,7 +25208,7 @@ function serveHostfsPort(port, transport) {
|
|
|
25032
25208
|
}
|
|
25033
25209
|
try {
|
|
25034
25210
|
if (op === "read") {
|
|
25035
|
-
const read = await
|
|
25211
|
+
const read = await track2(
|
|
25036
25212
|
transport.read(
|
|
25037
25213
|
data.fh,
|
|
25038
25214
|
data.offset,
|
|
@@ -25044,13 +25220,13 @@ function serveHostfsPort(port, transport) {
|
|
|
25044
25220
|
return send2({ id: id2, bytes }, [bytes.buffer]);
|
|
25045
25221
|
}
|
|
25046
25222
|
if (op === "write") {
|
|
25047
|
-
await
|
|
25223
|
+
await track2(
|
|
25048
25224
|
transport.write(data.fh, data.offset, data.bytes)
|
|
25049
25225
|
);
|
|
25050
25226
|
return send2({ id: id2 });
|
|
25051
25227
|
}
|
|
25052
25228
|
if (op !== "call") throw fsError2("EINVAL", `unknown hostfs port op ${op}`);
|
|
25053
|
-
send2({ id: id2, result: await
|
|
25229
|
+
send2({ id: id2, result: await answer2(data.name, data.body) });
|
|
25054
25230
|
} catch (err) {
|
|
25055
25231
|
send2({ id: id2, error: errorOf(err) });
|
|
25056
25232
|
}
|
|
@@ -25842,14 +26018,14 @@ var Sudo = class {
|
|
|
25842
26018
|
if (this.pending.has(cred.ruid)) return failed2("EBUSY", "sudo: another request is pending");
|
|
25843
26019
|
this.pending.add(cred.ruid);
|
|
25844
26020
|
try {
|
|
25845
|
-
const
|
|
25846
|
-
if (typeof
|
|
26021
|
+
const answer2 = await this.ask(caller, self, target, parsed2.command, path, cwd, signal);
|
|
26022
|
+
if (typeof answer2 !== "string") return answer2;
|
|
25847
26023
|
if (await this.canonical(call.cwd) !== cwd || !await this.reachable(cred, cwd)) {
|
|
25848
26024
|
return failed2("EACCES", `sudo: ${call.cwd} changed while the request waited`);
|
|
25849
26025
|
}
|
|
25850
26026
|
const changed = await this.untrusted(path, cwd, word);
|
|
25851
26027
|
if (changed) return changed;
|
|
25852
|
-
if (
|
|
26028
|
+
if (answer2 === "always" && !await this.remember(self, target, cwd, argv)) {
|
|
25853
26029
|
return failed2("EIO", "sudo: the rule could not be recorded");
|
|
25854
26030
|
}
|
|
25855
26031
|
return grant();
|
|
@@ -25904,11 +26080,11 @@ ${lines2}
|
|
|
25904
26080
|
);
|
|
25905
26081
|
try {
|
|
25906
26082
|
const answered = Promise.resolve().then(() => approve(req, { signal: control.signal })).catch(() => "deny");
|
|
25907
|
-
const
|
|
25908
|
-
if (
|
|
26083
|
+
const answer2 = await Promise.race([answered, aborted2]);
|
|
26084
|
+
if (answer2 === "aborted" || control.signal.aborted) {
|
|
25909
26085
|
return control.signal.reason === "expired" ? failed2("ETIMEDOUT", "sudo: the request expired") : failed2("EINTR", "sudo: the request was withdrawn");
|
|
25910
26086
|
}
|
|
25911
|
-
return
|
|
26087
|
+
return answer2 === "once" || answer2 === "always" ? answer2 : failed2("EACCES", "sudo: approval denied");
|
|
25912
26088
|
} finally {
|
|
25913
26089
|
clearTimeout(timer);
|
|
25914
26090
|
requester.removeEventListener("abort", withdraw);
|
|
@@ -26819,7 +26995,7 @@ var Launcher = class {
|
|
|
26819
26995
|
try {
|
|
26820
26996
|
return await this.planOne(req, ctx);
|
|
26821
26997
|
} catch (err) {
|
|
26822
|
-
const code =
|
|
26998
|
+
const code = codeOf8(err);
|
|
26823
26999
|
const searched = bare && req.search !== false && (code === "ENOENT" || code === "ENOEXEC");
|
|
26824
27000
|
if (!searched || await this.commandAt(req.file, ctx.scope)) throw err;
|
|
26825
27001
|
const found = await this.onPath(req, ctx);
|
|
@@ -26836,7 +27012,7 @@ var Launcher = class {
|
|
|
26836
27012
|
try {
|
|
26837
27013
|
return await this.planOne({ ...req, file }, ctx);
|
|
26838
27014
|
} catch (err) {
|
|
26839
|
-
const code =
|
|
27015
|
+
const code = codeOf8(err);
|
|
26840
27016
|
if (code === "EACCES") denied2 = true;
|
|
26841
27017
|
else if (code !== "ENOENT" && code !== "ENOTDIR") throw err;
|
|
26842
27018
|
}
|
|
@@ -26846,7 +27022,7 @@ var Launcher = class {
|
|
|
26846
27022
|
}
|
|
26847
27023
|
async planOne(req, { ppid, cred, scope }) {
|
|
26848
27024
|
const refused3 = (err) => {
|
|
26849
|
-
throw
|
|
27025
|
+
throw codeOf8(err) === "EACCES" ? new SpawnError("EACCES") : err;
|
|
26850
27026
|
};
|
|
26851
27027
|
const file = await this.execFile(req.file, req.cwd, this.execGuard(cred, ppid)).catch(refused3);
|
|
26852
27028
|
const planned = await this.plan(file, req.argv, req.cwd, scope, req.argv0);
|
|
@@ -28356,7 +28532,7 @@ var Launcher = class {
|
|
|
28356
28532
|
function cronLocks() {
|
|
28357
28533
|
return globalThis.navigator?.locks;
|
|
28358
28534
|
}
|
|
28359
|
-
function
|
|
28535
|
+
function codeOf8(err) {
|
|
28360
28536
|
return err?.code;
|
|
28361
28537
|
}
|
|
28362
28538
|
|
|
@@ -28769,7 +28945,7 @@ import { connect as tls } from "node:tls";
|
|
|
28769
28945
|
var PROBE_MS = 3e3;
|
|
28770
28946
|
var PASSED = /* @__PURE__ */ new Set(["ECONNREFUSED", "EHOSTUNREACH", "ENETUNREACH", "ETIMEDOUT", "ECONNRESET"]);
|
|
28771
28947
|
var NO_NAME = /* @__PURE__ */ new Set(["ENOTFOUND", "EAI_AGAIN", "EAI_NONAME", "EAI_FAIL", "ENODATA"]);
|
|
28772
|
-
function
|
|
28948
|
+
function codeOf9(e) {
|
|
28773
28949
|
const code = e?.code;
|
|
28774
28950
|
return typeof code === "string" ? code : void 0;
|
|
28775
28951
|
}
|
|
@@ -28798,7 +28974,7 @@ function probe(secure2, host, port, ms, signal) {
|
|
|
28798
28974
|
signal?.addEventListener("abort", stop, { once: true });
|
|
28799
28975
|
socket.once(secure2 ? "secureConnect" : "connect", () => done4("EPROTO"));
|
|
28800
28976
|
socket.once("error", (e) => {
|
|
28801
|
-
const code =
|
|
28977
|
+
const code = codeOf9(e) ?? "";
|
|
28802
28978
|
done4(PASSED.has(code) ? code : "EPROTO");
|
|
28803
28979
|
});
|
|
28804
28980
|
});
|
|
@@ -28813,7 +28989,7 @@ async function diagnose(url, ms = PROBE_MS, signal) {
|
|
|
28813
28989
|
await abortable(lookup3(host), signal);
|
|
28814
28990
|
} catch (e) {
|
|
28815
28991
|
if (signal?.aborted) throw signal.reason;
|
|
28816
|
-
return NO_NAME.has(
|
|
28992
|
+
return NO_NAME.has(codeOf9(e) ?? "") ? "EAI_NONAME" : void 0;
|
|
28817
28993
|
}
|
|
28818
28994
|
const code = await probe(secure2, host, port, ms, signal);
|
|
28819
28995
|
signal?.throwIfAborted();
|
|
@@ -28832,7 +29008,7 @@ function diagnosing(transport, check = byDefault) {
|
|
|
28832
29008
|
try {
|
|
28833
29009
|
return await open(request);
|
|
28834
29010
|
} catch (e) {
|
|
28835
|
-
if (request.signal.aborted || !(e instanceof Error) ||
|
|
29011
|
+
if (request.signal.aborted || !(e instanceof Error) || codeOf9(e)) throw e;
|
|
28836
29012
|
const code = await abortable(
|
|
28837
29013
|
check(request.url, request.signal).catch(() => void 0),
|
|
28838
29014
|
request.signal
|