@ai-ecoverse/slicc-kernel 1.125.3 → 1.125.4
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 +4 -1
- package/dist/kernel-worker.js +234 -109
- package/dist/kernel-worker.js.map +3 -3
- package/dist/node-process-worker.js +134 -18
- package/dist/node-process-worker.js.map +4 -4
- package/dist/node.js +237 -112
- package/dist/node.js.map +3 -3
- package/dist/process-worker.js +134 -18
- package/dist/process-worker.js.map +4 -4
- package/dist/types/kernel/net/tls-chain.d.ts +7 -1
- package/dist/types/kernel/vfs-file.d.ts +5 -0
- package/dist/types/mount/mount-fs.d.ts +1 -0
- package/dist/types/process/kernel-streams.d.ts +3 -0
- package/package.json +1 -1
package/dist/kernel-worker.js
CHANGED
|
@@ -1097,8 +1097,8 @@ var ERRNO_BY_DOM_ERROR = {
|
|
|
1097
1097
|
var reported = /* @__PURE__ */ new Set();
|
|
1098
1098
|
function translate(err, path, op = "lookup", mapped = true) {
|
|
1099
1099
|
if (typeof err?.code === "string") return err;
|
|
1100
|
-
const
|
|
1101
|
-
const name2 = typeof
|
|
1100
|
+
const raw2 = err?.name;
|
|
1101
|
+
const name2 = typeof raw2 === "string" ? raw2 : "Error";
|
|
1102
1102
|
const code = name2 === "QuotaExceededError" ? "ENOSPC" : mapped && ERRNO_BY_DOM_ERROR[name2] || "EIO";
|
|
1103
1103
|
const error = Object.assign(fsError(code, path), { domName: name2, op, cause: err });
|
|
1104
1104
|
if (code !== "EIO" && code !== "ENOSPC") return error;
|
|
@@ -2049,26 +2049,26 @@ var OpfsFs = class {
|
|
|
2049
2049
|
const found = await this.locate(path, true);
|
|
2050
2050
|
const handle = found.handle;
|
|
2051
2051
|
if (handle.kind !== "directory") throw fsError("ENOTDIR", path);
|
|
2052
|
-
const
|
|
2053
|
-
for await (const child of handle.values())
|
|
2052
|
+
const children3 = /* @__PURE__ */ new Map();
|
|
2053
|
+
for await (const child of handle.values()) children3.set(child.name, child);
|
|
2054
2054
|
for (const link2 of await this.meta.links(found.path)) {
|
|
2055
2055
|
const name2 = baseOf(link2.path);
|
|
2056
|
-
if (!
|
|
2056
|
+
if (!children3.has(name2)) children3.set(name2, link2);
|
|
2057
2057
|
}
|
|
2058
|
-
return [found.path, [...
|
|
2058
|
+
return [found.path, [...children3].sort(([a], [b]) => a < b ? -1 : 1)];
|
|
2059
2059
|
}
|
|
2060
2060
|
async readdir(path) {
|
|
2061
2061
|
return (await this.listing(path))[1].map(([name2]) => name2);
|
|
2062
2062
|
}
|
|
2063
2063
|
async readdirStat(path) {
|
|
2064
|
-
const [dir,
|
|
2064
|
+
const [dir, children3] = await this.listing(path);
|
|
2065
2065
|
const base = dir === "/" ? "" : dir;
|
|
2066
|
-
const touched =
|
|
2067
|
-
const metas = await this.meta.get(
|
|
2066
|
+
const touched = children3.map(([name2]) => this.timesOf(`${base}/${name2}`));
|
|
2067
|
+
const metas = await this.meta.get(children3.map(([name2]) => `${base}/${name2}`));
|
|
2068
2068
|
const handed2 = this.owners ? await this.handedTo(dir) : void 0;
|
|
2069
2069
|
const owned4 = (stat, entry) => handed2 ? { ...stat, ...ownOf(entry) ?? handed2 } : stat;
|
|
2070
2070
|
return Promise.all(
|
|
2071
|
-
|
|
2071
|
+
children3.map(async ([name2, child], i) => {
|
|
2072
2072
|
if (!isHandle(child)) return [name2, owned4(this.linkStat(child), child)];
|
|
2073
2073
|
const stat = await this.statOf(`${base}/${name2}`, child, metas[i], touched[i]).catch(
|
|
2074
2074
|
() => null
|
|
@@ -4516,8 +4516,8 @@ var SwitchConn = class {
|
|
|
4516
4516
|
switching = false;
|
|
4517
4517
|
secure;
|
|
4518
4518
|
failed;
|
|
4519
|
-
constructor(
|
|
4520
|
-
this.raw =
|
|
4519
|
+
constructor(raw2) {
|
|
4520
|
+
this.raw = raw2;
|
|
4521
4521
|
}
|
|
4522
4522
|
get localAddr() {
|
|
4523
4523
|
return this.raw.localAddr;
|
|
@@ -4970,9 +4970,9 @@ var KernelSocket = class _KernelSocket {
|
|
|
4970
4970
|
() => void 0
|
|
4971
4971
|
);
|
|
4972
4972
|
return Promise.race([dialled, abandoned]).then(
|
|
4973
|
-
async (
|
|
4973
|
+
async (raw2) => {
|
|
4974
4974
|
if (abort.signal.aborted) throw dialError(abort.signal.reason, timedOut, true);
|
|
4975
|
-
const conn = new SwitchConn(
|
|
4975
|
+
const conn = new SwitchConn(raw2);
|
|
4976
4976
|
if (secure2) {
|
|
4977
4977
|
clearTimeout(timer);
|
|
4978
4978
|
try {
|
|
@@ -6517,10 +6517,10 @@ function partial(text) {
|
|
|
6517
6517
|
text
|
|
6518
6518
|
);
|
|
6519
6519
|
if (!m) return void 0;
|
|
6520
|
-
const
|
|
6521
|
-
if (!
|
|
6520
|
+
const raw2 = [m[1], m[2], m[3]];
|
|
6521
|
+
if (!raw2.every((p) => p === void 0 || PART.test(p))) return void 0;
|
|
6522
6522
|
const parts2 = [];
|
|
6523
|
-
for (const p of
|
|
6523
|
+
for (const p of raw2) {
|
|
6524
6524
|
if (p === void 0 || /^[xX*]$/.test(p) || parts2.includes(void 0)) parts2.push(void 0);
|
|
6525
6525
|
else parts2.push(Number(p));
|
|
6526
6526
|
}
|
|
@@ -6632,7 +6632,7 @@ function satisfies(version, range2) {
|
|
|
6632
6632
|
}
|
|
6633
6633
|
|
|
6634
6634
|
// src/version.ts
|
|
6635
|
-
var KERNEL_VERSION = true ? "1.125.
|
|
6635
|
+
var KERNEL_VERSION = true ? "1.125.4" : "0.0.0-dev";
|
|
6636
6636
|
var OS_RELEASE = "6.0.0-slicc";
|
|
6637
6637
|
function procVersion() {
|
|
6638
6638
|
return `Linux version ${OS_RELEASE} (slicc-kernel ${KERNEL_VERSION}) #1 SMP PREEMPT_DYNAMIC
|
|
@@ -6653,10 +6653,10 @@ function inside(pkg, rel2) {
|
|
|
6653
6653
|
if (clean.startsWith("/") || clean.split("/").includes("..")) return void 0;
|
|
6654
6654
|
return `${pkg}/${clean}`;
|
|
6655
6655
|
}
|
|
6656
|
-
function envOf(pkg,
|
|
6656
|
+
function envOf(pkg, raw2) {
|
|
6657
6657
|
const env = {};
|
|
6658
|
-
if (!
|
|
6659
|
-
for (const [key, value2] of Object.entries(
|
|
6658
|
+
if (!raw2 || typeof raw2 !== "object") return env;
|
|
6659
|
+
for (const [key, value2] of Object.entries(raw2)) {
|
|
6660
6660
|
if (!ENV_KEY.test(key)) continue;
|
|
6661
6661
|
if (typeof value2 === "string") env[key] = value2.replace(PACKAGE, pkg);
|
|
6662
6662
|
else if (value2 === null) env[key] = null;
|
|
@@ -6675,15 +6675,15 @@ function envFields(merged2) {
|
|
|
6675
6675
|
...unset.length > 0 ? { unset } : {}
|
|
6676
6676
|
};
|
|
6677
6677
|
}
|
|
6678
|
-
function argsOf(pkg,
|
|
6679
|
-
if (!Array.isArray(
|
|
6680
|
-
if (!
|
|
6681
|
-
return
|
|
6678
|
+
function argsOf(pkg, raw2) {
|
|
6679
|
+
if (!Array.isArray(raw2) || raw2.length === 0) return void 0;
|
|
6680
|
+
if (!raw2.every((arg) => typeof arg === "string")) return void 0;
|
|
6681
|
+
return raw2.map((arg) => arg.replace(PACKAGE, pkg));
|
|
6682
6682
|
}
|
|
6683
6683
|
var warnedVariants = /* @__PURE__ */ new Set();
|
|
6684
|
-
function variantOf(pkg,
|
|
6685
|
-
if (!
|
|
6686
|
-
const { env, wasm } =
|
|
6684
|
+
function variantOf(pkg, raw2) {
|
|
6685
|
+
if (!raw2 || typeof raw2 !== "object" || Array.isArray(raw2)) return void 0;
|
|
6686
|
+
const { env, wasm } = raw2;
|
|
6687
6687
|
const path = inside(pkg, wasm);
|
|
6688
6688
|
if (!path || !env || typeof env !== "object" || Array.isArray(env)) return void 0;
|
|
6689
6689
|
const pairs = Object.entries(env);
|
|
@@ -6693,13 +6693,13 @@ function variantOf(pkg, raw) {
|
|
|
6693
6693
|
}
|
|
6694
6694
|
return { env: Object.fromEntries(pairs), wasm: path };
|
|
6695
6695
|
}
|
|
6696
|
-
function variantsOf(pkg, name2,
|
|
6697
|
-
if (
|
|
6698
|
-
const variants = Array.isArray(
|
|
6696
|
+
function variantsOf(pkg, name2, raw2) {
|
|
6697
|
+
if (raw2 === void 0) return void 0;
|
|
6698
|
+
const variants = Array.isArray(raw2) ? raw2.map((one) => variantOf(pkg, one)) : [void 0];
|
|
6699
6699
|
if (variants.every((one) => one !== void 0)) {
|
|
6700
6700
|
return variants.length > 0 ? variants : void 0;
|
|
6701
6701
|
}
|
|
6702
|
-
const key = `${pkg}:${name2}:${JSON.stringify(
|
|
6702
|
+
const key = `${pkg}:${name2}:${JSON.stringify(raw2)}`;
|
|
6703
6703
|
if (!warnedVariants.has(key)) {
|
|
6704
6704
|
warnedVariants.add(key);
|
|
6705
6705
|
console.warn(`slicc-kernel: ${pkg}: ${name2}: ignoring malformed "variants", running its wasm`);
|
|
@@ -6711,22 +6711,22 @@ function variantFor(variants, env) {
|
|
|
6711
6711
|
(one) => Object.entries(one.env).every(([key, value2]) => env[key] === value2)
|
|
6712
6712
|
)?.wasm;
|
|
6713
6713
|
}
|
|
6714
|
-
function abiOf(
|
|
6715
|
-
const abi =
|
|
6714
|
+
function abiOf(raw2, fallback) {
|
|
6715
|
+
const abi = raw2 ?? fallback;
|
|
6716
6716
|
return abi === "emscripten" || abi === "wasi" || abi === "js" ? abi : void 0;
|
|
6717
6717
|
}
|
|
6718
|
-
function commandOf(pkg, name2,
|
|
6719
|
-
const withEnv = envFields({ ...shared, ...envOf(pkg,
|
|
6720
|
-
const script = inside(pkg,
|
|
6718
|
+
function commandOf(pkg, name2, raw2, packageAbi, shared) {
|
|
6719
|
+
const withEnv = envFields({ ...shared, ...envOf(pkg, raw2.env) });
|
|
6720
|
+
const script = inside(pkg, raw2.script);
|
|
6721
6721
|
if (script) {
|
|
6722
6722
|
return { name: name2, abi: packageAbi, glue: script, wasm: script, argv0: name2, script, ...withEnv };
|
|
6723
6723
|
}
|
|
6724
|
-
const abi = abiOf(
|
|
6725
|
-
const fixed = typeof
|
|
6726
|
-
const argv0 = fixed ?
|
|
6727
|
-
const args = argsOf(pkg,
|
|
6724
|
+
const abi = abiOf(raw2.abi, packageAbi);
|
|
6725
|
+
const fixed = typeof raw2.argv0 === "string" && raw2.argv0 !== "";
|
|
6726
|
+
const argv0 = fixed ? raw2.argv0 : name2;
|
|
6727
|
+
const args = argsOf(pkg, raw2.args);
|
|
6728
6728
|
if (abi === "js") {
|
|
6729
|
-
const module = inside(pkg,
|
|
6729
|
+
const module = inside(pkg, raw2.module);
|
|
6730
6730
|
if (!module) return void 0;
|
|
6731
6731
|
return {
|
|
6732
6732
|
name: name2,
|
|
@@ -6735,16 +6735,16 @@ function commandOf(pkg, name2, raw, packageAbi, shared) {
|
|
|
6735
6735
|
wasm: module,
|
|
6736
6736
|
argv0,
|
|
6737
6737
|
...fixed ? { argv0Fixed: true } : {},
|
|
6738
|
-
...
|
|
6738
|
+
...raw2.argv0Path === true ? { argv0Path: true } : {},
|
|
6739
6739
|
...args ? { args } : {},
|
|
6740
6740
|
...withEnv
|
|
6741
6741
|
};
|
|
6742
6742
|
}
|
|
6743
|
-
const wasm = inside(pkg,
|
|
6744
|
-
const glue = abi === "wasi" ? wasm : inside(pkg,
|
|
6743
|
+
const wasm = inside(pkg, raw2.wasm);
|
|
6744
|
+
const glue = abi === "wasi" ? wasm : inside(pkg, raw2.glue);
|
|
6745
6745
|
if (!abi || !glue || !wasm) return void 0;
|
|
6746
|
-
const imports = abi === "wasi" ? inside(pkg,
|
|
6747
|
-
const variants = variantsOf(pkg, name2,
|
|
6746
|
+
const imports = abi === "wasi" ? inside(pkg, raw2.imports) : void 0;
|
|
6747
|
+
const variants = variantsOf(pkg, name2, raw2.variants);
|
|
6748
6748
|
return {
|
|
6749
6749
|
name: name2,
|
|
6750
6750
|
abi,
|
|
@@ -6752,8 +6752,8 @@ function commandOf(pkg, name2, raw, packageAbi, shared) {
|
|
|
6752
6752
|
wasm,
|
|
6753
6753
|
argv0,
|
|
6754
6754
|
...fixed ? { argv0Fixed: true } : {},
|
|
6755
|
-
...
|
|
6756
|
-
...abi === "wasi" &&
|
|
6755
|
+
...raw2.argv0Path === true ? { argv0Path: true } : {},
|
|
6756
|
+
...abi === "wasi" && raw2.preopenRoot === true ? { preopenRoot: true } : {},
|
|
6757
6757
|
...args ? { args } : {},
|
|
6758
6758
|
...withEnv,
|
|
6759
6759
|
...imports ? { imports } : {},
|
|
@@ -6768,11 +6768,11 @@ function commandsOf(pkg, manifest) {
|
|
|
6768
6768
|
if (!packageAbi || !entries || typeof entries !== "object") return [];
|
|
6769
6769
|
const shared = envOf(pkg, slicc.env);
|
|
6770
6770
|
const out = [];
|
|
6771
|
-
for (const [name2,
|
|
6772
|
-
if (!commandName(name2) || !
|
|
6771
|
+
for (const [name2, raw2] of Object.entries(entries)) {
|
|
6772
|
+
if (!commandName(name2) || !raw2 || typeof raw2 !== "object") {
|
|
6773
6773
|
continue;
|
|
6774
6774
|
}
|
|
6775
|
-
const command = commandOf(pkg, name2,
|
|
6775
|
+
const command = commandOf(pkg, name2, raw2, packageAbi, shared);
|
|
6776
6776
|
if (command) out.push(command);
|
|
6777
6777
|
}
|
|
6778
6778
|
return out;
|
|
@@ -7323,8 +7323,8 @@ function hashId(text) {
|
|
|
7323
7323
|
a = Math.imul(a ^ c, 16777619);
|
|
7324
7324
|
b = Math.imul(b ^ c, 1540483477);
|
|
7325
7325
|
}
|
|
7326
|
-
const
|
|
7327
|
-
return
|
|
7326
|
+
const hex4 = (n) => (n >>> 0).toString(16).padStart(8, "0");
|
|
7327
|
+
return hex4(a) + hex4(b);
|
|
7328
7328
|
}
|
|
7329
7329
|
function split2(text, count2) {
|
|
7330
7330
|
const words2 = [];
|
|
@@ -7372,9 +7372,9 @@ function parseCrontab(text, path, system = false) {
|
|
|
7372
7372
|
const env = {};
|
|
7373
7373
|
const ctx = { path, system, names: /* @__PURE__ */ new Set() };
|
|
7374
7374
|
let name2;
|
|
7375
|
-
for (const [index,
|
|
7375
|
+
for (const [index, raw2] of text.split("\n").entries()) {
|
|
7376
7376
|
const line = index + 1;
|
|
7377
|
-
const content =
|
|
7377
|
+
const content = raw2.trim();
|
|
7378
7378
|
const named = NAME_LINE.exec(content);
|
|
7379
7379
|
if (named) {
|
|
7380
7380
|
name2 = named[1];
|
|
@@ -9125,7 +9125,7 @@ function withCommandDirs(fs, names2, userDir = async () => void 0, owners = fals
|
|
|
9125
9125
|
const { uid = 0, gid = 0 } = dir === void 0 ? {} : await nearest(dir);
|
|
9126
9126
|
return { ...stat2, uid, gid };
|
|
9127
9127
|
}
|
|
9128
|
-
async function
|
|
9128
|
+
async function children3(path) {
|
|
9129
9129
|
if (path === "/") return ["bin", "usr"];
|
|
9130
9130
|
if (path === "/usr") return ["bin"];
|
|
9131
9131
|
if (path === "/bin" || path === "/usr/bin") return [...await names2()];
|
|
@@ -9220,7 +9220,7 @@ function withCommandDirs(fs, names2, userDir = async () => void 0, owners = fals
|
|
|
9220
9220
|
stat: (path) => stat(path, (p) => fs.stat(p)),
|
|
9221
9221
|
lstat: (path) => stat(path, (p) => fs.lstat(p)),
|
|
9222
9222
|
async readdir(path) {
|
|
9223
|
-
const extra = await
|
|
9223
|
+
const extra = await children3(path);
|
|
9224
9224
|
if (!extra) return fs.readdir(path);
|
|
9225
9225
|
const real = await fs.readdir(path).catch((err) => {
|
|
9226
9226
|
if (missing3(err)) return [];
|
|
@@ -9229,7 +9229,7 @@ function withCommandDirs(fs, names2, userDir = async () => void 0, owners = fals
|
|
|
9229
9229
|
return [.../* @__PURE__ */ new Set([...real, ...extra])].sort();
|
|
9230
9230
|
},
|
|
9231
9231
|
async readdirStat(path) {
|
|
9232
|
-
const extra = await
|
|
9232
|
+
const extra = await children3(path);
|
|
9233
9233
|
if (!extra) return fs.readdirStat(path);
|
|
9234
9234
|
const real = await fs.readdirStat(path).catch((err) => {
|
|
9235
9235
|
if (missing3(err)) return [];
|
|
@@ -10907,6 +10907,7 @@ var MountTable = class {
|
|
|
10907
10907
|
if (paths === true) {
|
|
10908
10908
|
mount.attrs.clear();
|
|
10909
10909
|
mount.lists.clear();
|
|
10910
|
+
this.deps.doubted?.(target);
|
|
10910
10911
|
this.deps.changed?.(target);
|
|
10911
10912
|
return;
|
|
10912
10913
|
}
|
|
@@ -14343,15 +14344,15 @@ function parseHead(bytes) {
|
|
|
14343
14344
|
}
|
|
14344
14345
|
async function readHead(incoming, signal) {
|
|
14345
14346
|
for (; ; ) {
|
|
14346
|
-
let
|
|
14347
|
+
let raw2;
|
|
14347
14348
|
try {
|
|
14348
|
-
|
|
14349
|
+
raw2 = await incoming.head(MAX_HEAD2, signal);
|
|
14349
14350
|
} catch (err) {
|
|
14350
14351
|
if (err instanceof KernelError) throw err;
|
|
14351
14352
|
throw errno2("EPROTO", "the response head is malformed or too large");
|
|
14352
14353
|
}
|
|
14353
|
-
if (!
|
|
14354
|
-
const head = parseHead(
|
|
14354
|
+
if (!raw2) throw errno2("ECONNRESET", "the connection closed before a response");
|
|
14355
|
+
const head = parseHead(raw2);
|
|
14355
14356
|
if (head.status < 100 || head.status >= 200 || head.status === 101) return head;
|
|
14356
14357
|
}
|
|
14357
14358
|
}
|
|
@@ -14737,9 +14738,9 @@ async function keyId(spki) {
|
|
|
14737
14738
|
await crypto.subtle.digest("SHA-1", publicKeyBits(spki))
|
|
14738
14739
|
);
|
|
14739
14740
|
}
|
|
14740
|
-
function ecdsaDer(
|
|
14741
|
-
const half =
|
|
14742
|
-
return seq(integer(
|
|
14741
|
+
function ecdsaDer(raw2) {
|
|
14742
|
+
const half = raw2.length / 2;
|
|
14743
|
+
return seq(integer(raw2.subarray(0, half)), integer(raw2.subarray(half)));
|
|
14743
14744
|
}
|
|
14744
14745
|
function randomSerial() {
|
|
14745
14746
|
const serial = crypto.getRandomValues(new Uint8Array(16));
|
|
@@ -16884,8 +16885,8 @@ var SemHandles = class _SemHandles {
|
|
|
16884
16885
|
this.byHandle.clear();
|
|
16885
16886
|
}
|
|
16886
16887
|
};
|
|
16887
|
-
function semName(
|
|
16888
|
-
const name2 =
|
|
16888
|
+
function semName(raw2) {
|
|
16889
|
+
const name2 = raw2.replace(/^\/+/, "");
|
|
16889
16890
|
if (name2 === "" || name2.includes("/") || name2 === "." || name2 === "..") {
|
|
16890
16891
|
throw new KernelError("EINVAL");
|
|
16891
16892
|
}
|
|
@@ -17280,20 +17281,111 @@ function tlv2(der, at) {
|
|
|
17280
17281
|
const end = body + length2;
|
|
17281
17282
|
return end > der.length ? void 0 : { start: at, body, end };
|
|
17282
17283
|
}
|
|
17283
|
-
function
|
|
17284
|
-
const cert = tlv2(der, 0);
|
|
17285
|
-
const tbs = cert && tlv2(der, cert.body);
|
|
17286
|
-
if (!tbs) return void 0;
|
|
17284
|
+
function children2(der, outer, max) {
|
|
17287
17285
|
const fields = [];
|
|
17288
|
-
for (let at =
|
|
17286
|
+
for (let at = outer.body; at < outer.end && fields.length < max; ) {
|
|
17289
17287
|
const field4 = tlv2(der, at);
|
|
17290
17288
|
if (!field4) return void 0;
|
|
17291
|
-
|
|
17289
|
+
fields.push(field4);
|
|
17292
17290
|
at = field4.end;
|
|
17293
17291
|
}
|
|
17294
|
-
|
|
17292
|
+
return fields;
|
|
17293
|
+
}
|
|
17294
|
+
function tbsFields(der) {
|
|
17295
|
+
const outer = tlv2(der, 0);
|
|
17296
|
+
const cert = outer && children2(der, outer, 3);
|
|
17297
|
+
const tbs = cert?.[0] && children2(der, cert[0], 8);
|
|
17298
|
+
if (!cert || !tbs) return void 0;
|
|
17299
|
+
return { cert, tbs: der[tbs[0]?.start ?? 0] === 160 ? tbs.slice(1) : tbs };
|
|
17300
|
+
}
|
|
17301
|
+
var raw = (der, t) => der.subarray(t.start, t.end);
|
|
17302
|
+
function names(der) {
|
|
17303
|
+
const fields = tbsFields(der)?.tbs;
|
|
17304
|
+
const [, , issuer, , subject] = fields ?? [];
|
|
17295
17305
|
if (!issuer || !subject) return void 0;
|
|
17296
|
-
return [der
|
|
17306
|
+
return [raw(der, issuer), raw(der, subject)];
|
|
17307
|
+
}
|
|
17308
|
+
var hex2 = (bytes) => Array.from(bytes, (b) => b.toString(16).padStart(2, "0")).join("");
|
|
17309
|
+
var HASHES = {
|
|
17310
|
+
"2a864886f70d01010b": ["RSASSA-PKCS1-v1_5", "SHA-256"],
|
|
17311
|
+
"2a864886f70d01010c": ["RSASSA-PKCS1-v1_5", "SHA-384"],
|
|
17312
|
+
"2a864886f70d01010d": ["RSASSA-PKCS1-v1_5", "SHA-512"],
|
|
17313
|
+
"2a8648ce3d040302": ["ECDSA", "SHA-256"],
|
|
17314
|
+
"2a8648ce3d040303": ["ECDSA", "SHA-384"],
|
|
17315
|
+
"2a8648ce3d040304": ["ECDSA", "SHA-512"],
|
|
17316
|
+
"2b6570": ["Ed25519", ""]
|
|
17317
|
+
};
|
|
17318
|
+
var CURVES = {
|
|
17319
|
+
"2a8648ce3d030107": ["P-256", 32],
|
|
17320
|
+
"2b81040022": ["P-384", 48],
|
|
17321
|
+
"2b81040023": ["P-521", 66]
|
|
17322
|
+
};
|
|
17323
|
+
function oidOf(der, algorithm, index = 0) {
|
|
17324
|
+
const parts2 = children2(der, algorithm, 2);
|
|
17325
|
+
const oid2 = parts2?.[index];
|
|
17326
|
+
return oid2 && der[oid2.start] === 6 ? hex2(der.subarray(oid2.body, oid2.end)) : void 0;
|
|
17327
|
+
}
|
|
17328
|
+
function curveOf(der, spki) {
|
|
17329
|
+
const algorithm = children2(der, spki, 1)?.[0];
|
|
17330
|
+
const curve = algorithm && oidOf(der, algorithm, 1);
|
|
17331
|
+
return curve ? CURVES[curve] : void 0;
|
|
17332
|
+
}
|
|
17333
|
+
function fixedEcdsa(sig, size) {
|
|
17334
|
+
const outer = tlv2(sig, 0);
|
|
17335
|
+
const ints = outer && children2(sig, outer, 2);
|
|
17336
|
+
if (ints?.length !== 2) return void 0;
|
|
17337
|
+
const out = new Uint8Array(size * 2);
|
|
17338
|
+
for (const [i, int] of ints.entries()) {
|
|
17339
|
+
let value2 = sig.subarray(int.body, int.end);
|
|
17340
|
+
while (value2.length > size && value2[0] === 0) value2 = value2.subarray(1);
|
|
17341
|
+
if (value2.length > size) return void 0;
|
|
17342
|
+
out.set(value2, (i + 1) * size - value2.length);
|
|
17343
|
+
}
|
|
17344
|
+
return out;
|
|
17345
|
+
}
|
|
17346
|
+
function signedOf(der) {
|
|
17347
|
+
const parts2 = tbsFields(der);
|
|
17348
|
+
const [tbs, algorithm, value2] = parts2?.cert ?? [];
|
|
17349
|
+
const spki = parts2?.tbs[5];
|
|
17350
|
+
if (!tbs || !algorithm || !value2 || !spki || der[value2.start] !== 3) return void 0;
|
|
17351
|
+
const known = HASHES[oidOf(der, algorithm) ?? ""];
|
|
17352
|
+
if (!known) return "unknown";
|
|
17353
|
+
const [scheme, hash] = known;
|
|
17354
|
+
const curve = scheme === "ECDSA" ? curveOf(der, spki) : void 0;
|
|
17355
|
+
if (scheme === "ECDSA" && !curve) return "unknown";
|
|
17356
|
+
const signature = der.subarray(value2.body + 1, value2.end);
|
|
17357
|
+
return {
|
|
17358
|
+
tbs: raw(der, tbs),
|
|
17359
|
+
spki: raw(der, spki),
|
|
17360
|
+
signature,
|
|
17361
|
+
scheme,
|
|
17362
|
+
hash,
|
|
17363
|
+
...curve ? { curve } : {}
|
|
17364
|
+
};
|
|
17365
|
+
}
|
|
17366
|
+
async function verifiesItself(s) {
|
|
17367
|
+
const name2 = s.curve?.[0];
|
|
17368
|
+
const algorithm = s.scheme === "ECDSA" ? { name: "ECDSA", namedCurve: name2 } : s.hash ? { name: s.scheme, hash: s.hash } : { name: s.scheme };
|
|
17369
|
+
const key = await crypto.subtle.importKey("spki", new Uint8Array(s.spki), algorithm, false, [
|
|
17370
|
+
"verify"
|
|
17371
|
+
]);
|
|
17372
|
+
const signature = s.curve ? fixedEcdsa(s.signature, s.curve[1]) : s.signature;
|
|
17373
|
+
if (!signature) return false;
|
|
17374
|
+
const params = s.scheme === "ECDSA" ? { name: "ECDSA", hash: s.hash } : { name: s.scheme };
|
|
17375
|
+
return crypto.subtle.verify(params, key, new Uint8Array(signature), new Uint8Array(s.tbs));
|
|
17376
|
+
}
|
|
17377
|
+
async function selfSigned(der) {
|
|
17378
|
+
if (!selfIssued(der)) return false;
|
|
17379
|
+
const signed = signedOf(der);
|
|
17380
|
+
if (signed === "unknown") return true;
|
|
17381
|
+
if (!signed) return false;
|
|
17382
|
+
return verifiesItself(signed).catch(() => false);
|
|
17383
|
+
}
|
|
17384
|
+
async function chainShape(chain2) {
|
|
17385
|
+
return {
|
|
17386
|
+
leafSelfSigned: chain2.length === 1 && await selfSigned(chain2[0]),
|
|
17387
|
+
topSelfSigned: chain2.length > 1 && await selfSigned(chain2.at(-1))
|
|
17388
|
+
};
|
|
17297
17389
|
}
|
|
17298
17390
|
function selfIssued(der) {
|
|
17299
17391
|
const pair = der && names(der);
|
|
@@ -17301,17 +17393,17 @@ function selfIssued(der) {
|
|
|
17301
17393
|
const [issuer, subject] = pair;
|
|
17302
17394
|
return issuer.length === subject.length && issuer.every((b, i) => b === subject[i]);
|
|
17303
17395
|
}
|
|
17304
|
-
function untrusted(chain2) {
|
|
17396
|
+
function untrusted(chain2, shape) {
|
|
17305
17397
|
if (chain2.length === 1) {
|
|
17306
|
-
return
|
|
17398
|
+
return shape.leafSelfSigned ? "DEPTH_ZERO_SELF_SIGNED_CERT" : "UNABLE_TO_VERIFY_LEAF_SIGNATURE";
|
|
17307
17399
|
}
|
|
17308
|
-
return
|
|
17400
|
+
return shape.topSelfSigned ? "SELF_SIGNED_CERT_IN_CHAIN" : "UNABLE_TO_GET_ISSUER_CERT_LOCALLY";
|
|
17309
17401
|
}
|
|
17310
|
-
function chainError(flags2, chain2) {
|
|
17402
|
+
function chainError(flags2, chain2, shape) {
|
|
17311
17403
|
if (flags2 === -1) return "UNABLE_TO_VERIFY_LEAF_SIGNATURE";
|
|
17312
17404
|
const rest2 = flags2 & ~CN_MISMATCH;
|
|
17313
17405
|
if (rest2 === 0) return void 0;
|
|
17314
|
-
if (rest2 & NOT_TRUSTED) return untrusted(chain2);
|
|
17406
|
+
if (rest2 & NOT_TRUSTED) return untrusted(chain2, shape);
|
|
17315
17407
|
return verifyCode(rest2);
|
|
17316
17408
|
}
|
|
17317
17409
|
function nameMatches(flags2) {
|
|
@@ -17351,10 +17443,10 @@ var SUITES = [
|
|
|
17351
17443
|
];
|
|
17352
17444
|
function cipherOf(id2, protocol) {
|
|
17353
17445
|
const known = SUITES.find(([n]) => n === id2);
|
|
17354
|
-
const
|
|
17446
|
+
const hex4 = `0x${id2.toString(16).padStart(4, "0").toUpperCase()}`;
|
|
17355
17447
|
return {
|
|
17356
|
-
name: known?.[1] ??
|
|
17357
|
-
standardName: known?.[2] ??
|
|
17448
|
+
name: known?.[1] ?? hex4,
|
|
17449
|
+
standardName: known?.[2] ?? hex4,
|
|
17358
17450
|
version: known?.[3] ?? protocol
|
|
17359
17451
|
};
|
|
17360
17452
|
}
|
|
@@ -17460,12 +17552,12 @@ async function handshake(conn, o, session, inbox) {
|
|
|
17460
17552
|
}
|
|
17461
17553
|
}
|
|
17462
17554
|
}
|
|
17463
|
-
function insecureOf(session, chain2) {
|
|
17555
|
+
function insecureOf(session, chain2, shape) {
|
|
17464
17556
|
const flags2 = session.verifyResult;
|
|
17465
|
-
const error = chainError(flags2, chain2);
|
|
17557
|
+
const error = chainError(flags2, chain2, shape);
|
|
17466
17558
|
return { hostnameMatches: nameMatches(flags2), ...error ? { chainError: error } : {} };
|
|
17467
17559
|
}
|
|
17468
|
-
function controlsOf(o, session, protocol, chain2) {
|
|
17560
|
+
function controlsOf(o, session, protocol, chain2, shape) {
|
|
17469
17561
|
if (!o.engine.sessionControls) return {};
|
|
17470
17562
|
const checked = o.checkHostname !== false && !o.insecure;
|
|
17471
17563
|
return {
|
|
@@ -17473,21 +17565,22 @@ function controlsOf(o, session, protocol, chain2) {
|
|
|
17473
17565
|
clientCertificate: o.clientCertificate === true,
|
|
17474
17566
|
sni: o.sni !== false && !isIP(o.servername),
|
|
17475
17567
|
hostnameChecked: checked,
|
|
17476
|
-
...o.insecure ? insecureOf(session, chain2) : { hostnameMatches: checked || !session.nameMismatch }
|
|
17568
|
+
...o.insecure ? insecureOf(session, chain2, shape) : { hostnameMatches: checked || !session.nameMismatch }
|
|
17477
17569
|
};
|
|
17478
17570
|
}
|
|
17479
|
-
function infoOf(o, session) {
|
|
17571
|
+
async function infoOf(o, session) {
|
|
17480
17572
|
const flags2 = session.verifyResult;
|
|
17481
17573
|
const code = verifyCode(flags2);
|
|
17482
17574
|
const protocol = session.version === 772 ? "TLSv1.3" : "TLSv1.2";
|
|
17483
17575
|
const chain2 = session.peerChain();
|
|
17576
|
+
const shape = await chainShape(o.insecure ? chain2 : []);
|
|
17484
17577
|
return {
|
|
17485
17578
|
protocol,
|
|
17486
17579
|
alpnProtocol: session.alpn ?? false,
|
|
17487
17580
|
authorized: code === void 0,
|
|
17488
17581
|
...code ? { authorizationError: code, authorizationText: o.engine.verifyInfo(flags2).trim() } : {},
|
|
17489
17582
|
peerCertificates: chain2,
|
|
17490
|
-
...controlsOf(o, session, protocol, chain2)
|
|
17583
|
+
...controlsOf(o, session, protocol, chain2, shape)
|
|
17491
17584
|
};
|
|
17492
17585
|
}
|
|
17493
17586
|
var FATAL_ALERT = -30592;
|
|
@@ -17551,7 +17644,8 @@ async function tlsClient(conn, o, taken = new Uint8Array(0)) {
|
|
|
17551
17644
|
inbox.hand(taken);
|
|
17552
17645
|
try {
|
|
17553
17646
|
await handshake(conn, o, session, inbox);
|
|
17554
|
-
|
|
17647
|
+
const info = await infoOf(o, session);
|
|
17648
|
+
return { conn: plaintext(conn, session, inbox), info };
|
|
17555
17649
|
} catch (err) {
|
|
17556
17650
|
session.free();
|
|
17557
17651
|
throw err;
|
|
@@ -17736,10 +17830,10 @@ async function prepareWith(support, req, servername, cert) {
|
|
|
17736
17830
|
}
|
|
17737
17831
|
function secure(prepared) {
|
|
17738
17832
|
let ran = false;
|
|
17739
|
-
const make = async (
|
|
17833
|
+
const make = async (raw2) => {
|
|
17740
17834
|
ran = true;
|
|
17741
17835
|
try {
|
|
17742
|
-
return await tlsClient(
|
|
17836
|
+
return await tlsClient(raw2, prepared.options);
|
|
17743
17837
|
} finally {
|
|
17744
17838
|
prepared.own?.release();
|
|
17745
17839
|
}
|
|
@@ -18223,6 +18317,7 @@ var SEEK_SET = 0;
|
|
|
18223
18317
|
var SEEK_CUR = 1;
|
|
18224
18318
|
var SEEK_END = 2;
|
|
18225
18319
|
var WRITEBACK_MS = 250;
|
|
18320
|
+
var UNREACHABLE2 = /* @__PURE__ */ new Set(["ENOMEDIUM", "ENOTCONN", "ENODEV", "EIO"]);
|
|
18226
18321
|
var WRITEBACK_COST_FACTOR = 10;
|
|
18227
18322
|
function isMissing(err) {
|
|
18228
18323
|
if (err?.code === "ENOENT") return true;
|
|
@@ -18240,6 +18335,8 @@ var VfsNode = class {
|
|
|
18240
18335
|
queue = Promise.resolve();
|
|
18241
18336
|
writeBack;
|
|
18242
18337
|
writeBackCost = 0;
|
|
18338
|
+
failed = false;
|
|
18339
|
+
doubt = false;
|
|
18243
18340
|
opens = 0;
|
|
18244
18341
|
writers = 0;
|
|
18245
18342
|
missing = false;
|
|
@@ -18388,6 +18485,7 @@ var VfsNode = class {
|
|
|
18388
18485
|
}
|
|
18389
18486
|
async pwrite(bytes, at) {
|
|
18390
18487
|
if (bytes.length === 0) return 0;
|
|
18488
|
+
await this.settled();
|
|
18391
18489
|
await this.fits(at + bytes.length);
|
|
18392
18490
|
const ranged2 = await this.prepare();
|
|
18393
18491
|
if (ranged2) {
|
|
@@ -18403,6 +18501,7 @@ var VfsNode = class {
|
|
|
18403
18501
|
return bytes.length;
|
|
18404
18502
|
}
|
|
18405
18503
|
async truncate(size) {
|
|
18504
|
+
await this.settled();
|
|
18406
18505
|
await this.fits(size);
|
|
18407
18506
|
const ranged2 = await this.prepare();
|
|
18408
18507
|
if (ranged2) {
|
|
@@ -18415,6 +18514,20 @@ var VfsNode = class {
|
|
|
18415
18514
|
this.length = size;
|
|
18416
18515
|
this.markDirty();
|
|
18417
18516
|
}
|
|
18517
|
+
doubted() {
|
|
18518
|
+
if (this.dirty) this.failed = true;
|
|
18519
|
+
else if (!this.orphaned) this.doubt = true;
|
|
18520
|
+
}
|
|
18521
|
+
async settled() {
|
|
18522
|
+
if (this.failed) return this.flush();
|
|
18523
|
+
if (!this.doubt) return;
|
|
18524
|
+
const err = await this.fs.stat?.(this.path).then(
|
|
18525
|
+
() => void 0,
|
|
18526
|
+
(e) => e
|
|
18527
|
+
);
|
|
18528
|
+
if (UNREACHABLE2.has(err?.code ?? "")) throw err;
|
|
18529
|
+
this.doubt = false;
|
|
18530
|
+
}
|
|
18418
18531
|
markDirty() {
|
|
18419
18532
|
this.dirty = true;
|
|
18420
18533
|
this.recount();
|
|
@@ -18423,7 +18536,9 @@ var VfsNode = class {
|
|
|
18423
18536
|
const delay = Math.max(WRITEBACK_MS, this.writeBackCost * WRITEBACK_COST_FACTOR);
|
|
18424
18537
|
this.writeBack = setTimeout(() => {
|
|
18425
18538
|
this.writeBack = void 0;
|
|
18426
|
-
this.serial(() => this.flush()).catch(() =>
|
|
18539
|
+
this.serial(() => this.flush()).catch(() => {
|
|
18540
|
+
this.failed = true;
|
|
18541
|
+
});
|
|
18427
18542
|
}, delay);
|
|
18428
18543
|
}
|
|
18429
18544
|
ensure(need2) {
|
|
@@ -18436,7 +18551,10 @@ var VfsNode = class {
|
|
|
18436
18551
|
}
|
|
18437
18552
|
async flush() {
|
|
18438
18553
|
if (this.revoked && this.dirty) throw new KernelError("EIO");
|
|
18439
|
-
if (!this.dirty || this.orphaned || !(this.data || this.ranged))
|
|
18554
|
+
if (!this.dirty || this.orphaned || !(this.data || this.ranged)) {
|
|
18555
|
+
this.failed = false;
|
|
18556
|
+
return;
|
|
18557
|
+
}
|
|
18440
18558
|
this.dirty = false;
|
|
18441
18559
|
const started = performance.now();
|
|
18442
18560
|
try {
|
|
@@ -18448,6 +18566,7 @@ var VfsNode = class {
|
|
|
18448
18566
|
} finally {
|
|
18449
18567
|
this.recount();
|
|
18450
18568
|
}
|
|
18569
|
+
this.failed = false;
|
|
18451
18570
|
this.writeBackCost = performance.now() - started;
|
|
18452
18571
|
}
|
|
18453
18572
|
};
|
|
@@ -18688,6 +18807,9 @@ var VfsNodes = class {
|
|
|
18688
18807
|
rewritten(path) {
|
|
18689
18808
|
this.byPath.get(path)?.reread();
|
|
18690
18809
|
}
|
|
18810
|
+
doubted(path) {
|
|
18811
|
+
for (const [p, node] of this.byPath) if (within7(p, path)) node.doubted();
|
|
18812
|
+
}
|
|
18691
18813
|
async flush(path) {
|
|
18692
18814
|
for (const [p, node] of this.byPath) if (within7(p, path)) await node.serial(() => node.flush());
|
|
18693
18815
|
}
|
|
@@ -21688,8 +21810,8 @@ function isMessage(data) {
|
|
|
21688
21810
|
var HOSTS_PATH = "/etc/hosts";
|
|
21689
21811
|
function parseHosts(text) {
|
|
21690
21812
|
const table = /* @__PURE__ */ new Map();
|
|
21691
|
-
for (const
|
|
21692
|
-
const [address, ...names2] =
|
|
21813
|
+
for (const raw2 of text.split("\n")) {
|
|
21814
|
+
const [address, ...names2] = raw2.replace(/#.*/, "").trim().split(/\s+/);
|
|
21693
21815
|
if (!address || names2.length === 0) continue;
|
|
21694
21816
|
if (ipv4Bytes(address) === void 0 && ipv6Groups(address) === void 0) continue;
|
|
21695
21817
|
for (const name2 of names2) {
|
|
@@ -21844,7 +21966,7 @@ function base642(bytes, padded = true) {
|
|
|
21844
21966
|
function urlSafe(text) {
|
|
21845
21967
|
return text.replace(/\+/g, "-").replace(/\//g, "_");
|
|
21846
21968
|
}
|
|
21847
|
-
function
|
|
21969
|
+
function hex3(bytes) {
|
|
21848
21970
|
let out = "";
|
|
21849
21971
|
for (const byte of bytes) out += byte.toString(16).padStart(2, "0");
|
|
21850
21972
|
return out;
|
|
@@ -21900,12 +22022,12 @@ function encodings(bytes) {
|
|
|
21900
22022
|
return [...standard, ...standard.map(urlSafe)];
|
|
21901
22023
|
}
|
|
21902
22024
|
function shapes(value2) {
|
|
21903
|
-
const
|
|
22025
|
+
const raw2 = utf82(value2);
|
|
21904
22026
|
const seen = /* @__PURE__ */ new Set([value2]);
|
|
21905
22027
|
const out = [];
|
|
21906
|
-
if (
|
|
21907
|
-
for (let offset = 0;
|
|
21908
|
-
out.push({ bytes:
|
|
22028
|
+
if (raw2.length < FRAGMENT) out.push({ bytes: raw2, form: "raw" });
|
|
22029
|
+
for (let offset = 0; raw2.length >= FRAGMENT && offset + FRAGMENT <= raw2.length; offset++) {
|
|
22030
|
+
out.push({ bytes: raw2.subarray(offset, offset + FRAGMENT), form: "fragment", offset });
|
|
21909
22031
|
}
|
|
21910
22032
|
const add = (text, form) => {
|
|
21911
22033
|
if (seen.has(text)) return;
|
|
@@ -21923,9 +22045,9 @@ function shapes(value2) {
|
|
|
21923
22045
|
}
|
|
21924
22046
|
for (const text of percent(value2)) add(text, "percent");
|
|
21925
22047
|
for (const text of [html(value2, "'"), html(value2, "'")]) add(text, "html");
|
|
21926
|
-
for (const text of encodings(
|
|
21927
|
-
add(
|
|
21928
|
-
add(
|
|
22048
|
+
for (const text of encodings(raw2)) add(text, "base64");
|
|
22049
|
+
add(hex3(raw2), "hex");
|
|
22050
|
+
add(hex3(raw2).toUpperCase(), "hex");
|
|
21929
22051
|
return out;
|
|
21930
22052
|
}
|
|
21931
22053
|
function wrappable(form) {
|
|
@@ -23136,8 +23258,8 @@ var GENERIC = /* @__PURE__ */ new Set([
|
|
|
23136
23258
|
]);
|
|
23137
23259
|
function parseMountOptions(data) {
|
|
23138
23260
|
const options = {};
|
|
23139
|
-
for (const
|
|
23140
|
-
const item =
|
|
23261
|
+
for (const raw2 of data.split(",")) {
|
|
23262
|
+
const item = raw2.trim();
|
|
23141
23263
|
if (!item || GENERIC.has(item)) continue;
|
|
23142
23264
|
if (item === "rw") {
|
|
23143
23265
|
delete options.ro;
|
|
@@ -23194,8 +23316,8 @@ function unescape(field4) {
|
|
|
23194
23316
|
}
|
|
23195
23317
|
function parseFstab(text) {
|
|
23196
23318
|
const lines2 = [];
|
|
23197
|
-
text.split("\n").forEach((
|
|
23198
|
-
const content =
|
|
23319
|
+
text.split("\n").forEach((raw2, index) => {
|
|
23320
|
+
const content = raw2.replace(/#.*$/, "").trim();
|
|
23199
23321
|
if (!content) return;
|
|
23200
23322
|
const [source, target, type, options = "defaults"] = content.split(/\s+/).map(unescape);
|
|
23201
23323
|
if (source === void 0 || target === void 0 || type === void 0) return;
|
|
@@ -25164,6 +25286,9 @@ var Launcher = class {
|
|
|
25164
25286
|
if (paths.some((path) => this.pnpmChain.has(path))) this.pnpmStale();
|
|
25165
25287
|
this.watchers.changed(...paths);
|
|
25166
25288
|
},
|
|
25289
|
+
doubted: (target) => {
|
|
25290
|
+
for (const nodes of this.openFiles) nodes.doubted(target);
|
|
25291
|
+
},
|
|
25167
25292
|
reshaped: () => this.watchers.reshaped(),
|
|
25168
25293
|
owners: this.owners
|
|
25169
25294
|
});
|