@ai-ecoverse/slicc-kernel 1.125.3 → 1.125.5

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.
@@ -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 raw = err?.name;
1101
- const name2 = typeof raw === "string" ? raw : "Error";
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 children2 = /* @__PURE__ */ new Map();
2053
- for await (const child of handle.values()) children2.set(child.name, child);
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 (!children2.has(name2)) children2.set(name2, link2);
2056
+ if (!children3.has(name2)) children3.set(name2, link2);
2057
2057
  }
2058
- return [found.path, [...children2].sort(([a], [b]) => a < b ? -1 : 1)];
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, children2] = await this.listing(path);
2064
+ const [dir, children3] = await this.listing(path);
2065
2065
  const base = dir === "/" ? "" : dir;
2066
- const touched = children2.map(([name2]) => this.timesOf(`${base}/${name2}`));
2067
- const metas = await this.meta.get(children2.map(([name2]) => `${base}/${name2}`));
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
- children2.map(async ([name2, child], i) => {
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(raw) {
4520
- this.raw = 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 (raw) => {
4973
+ async (raw2) => {
4974
4974
  if (abort.signal.aborted) throw dialError(abort.signal.reason, timedOut, true);
4975
- const conn = new SwitchConn(raw);
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 raw = [m[1], m[2], m[3]];
6521
- if (!raw.every((p) => p === void 0 || PART.test(p))) return void 0;
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 raw) {
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.3" : "0.0.0-dev";
6635
+ var KERNEL_VERSION = true ? "1.125.5" : "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, raw) {
6656
+ function envOf(pkg, raw2) {
6657
6657
  const env = {};
6658
- if (!raw || typeof raw !== "object") return env;
6659
- for (const [key, value2] of Object.entries(raw)) {
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, raw) {
6679
- if (!Array.isArray(raw) || raw.length === 0) return void 0;
6680
- if (!raw.every((arg) => typeof arg === "string")) return void 0;
6681
- return raw.map((arg) => arg.replace(PACKAGE, pkg));
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, raw) {
6685
- if (!raw || typeof raw !== "object" || Array.isArray(raw)) return void 0;
6686
- const { env, wasm } = raw;
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, raw) {
6697
- if (raw === void 0) return void 0;
6698
- const variants = Array.isArray(raw) ? raw.map((one) => variantOf(pkg, one)) : [void 0];
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(raw)}`;
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(raw, fallback) {
6715
- const abi = raw ?? fallback;
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, raw, packageAbi, shared) {
6719
- const withEnv = envFields({ ...shared, ...envOf(pkg, raw.env) });
6720
- const script = inside(pkg, raw.script);
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(raw.abi, packageAbi);
6725
- const fixed = typeof raw.argv0 === "string" && raw.argv0 !== "";
6726
- const argv0 = fixed ? raw.argv0 : name2;
6727
- const args = argsOf(pkg, raw.args);
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, raw.module);
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
- ...raw.argv0Path === true ? { argv0Path: true } : {},
6738
+ ...raw2.argv0Path === true ? { argv0Path: true } : {},
6739
6739
  ...args ? { args } : {},
6740
6740
  ...withEnv
6741
6741
  };
6742
6742
  }
6743
- const wasm = inside(pkg, raw.wasm);
6744
- const glue = abi === "wasi" ? wasm : inside(pkg, raw.glue);
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, raw.imports) : void 0;
6747
- const variants = variantsOf(pkg, name2, raw.variants);
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
- ...raw.argv0Path === true ? { argv0Path: true } : {},
6756
- ...abi === "wasi" && raw.preopenRoot === true ? { preopenRoot: true } : {},
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, raw] of Object.entries(entries)) {
6772
- if (!commandName(name2) || !raw || typeof raw !== "object") {
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, raw, packageAbi, shared);
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 hex3 = (n) => (n >>> 0).toString(16).padStart(8, "0");
7327
- return hex3(a) + hex3(b);
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, raw] of text.split("\n").entries()) {
7375
+ for (const [index, raw2] of text.split("\n").entries()) {
7376
7376
  const line = index + 1;
7377
- const content = raw.trim();
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 children2(path) {
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 children2(path);
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 children2(path);
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 raw;
14347
+ let raw2;
14347
14348
  try {
14348
- raw = await incoming.head(MAX_HEAD2, signal);
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 (!raw) throw errno2("ECONNRESET", "the connection closed before a response");
14354
- const head = parseHead(raw);
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(raw) {
14741
- const half = raw.length / 2;
14742
- return seq(integer(raw.subarray(0, half)), integer(raw.subarray(half)));
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(raw) {
16888
- const name2 = raw.replace(/^\/+/, "");
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 names(der) {
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 = tbs.body; at < tbs.end && fields.length < 6; ) {
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
- if (fields.length > 0 || der[at] !== 160) fields.push(field4);
17289
+ fields.push(field4);
17292
17290
  at = field4.end;
17293
17291
  }
17294
- const [, , issuer, , subject] = fields;
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.subarray(issuer.start, issuer.end), der.subarray(subject.start, subject.end)];
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 selfIssued(chain2[0]) ? "DEPTH_ZERO_SELF_SIGNED_CERT" : "UNABLE_TO_VERIFY_LEAF_SIGNATURE";
17398
+ return shape.leafSelfSigned ? "DEPTH_ZERO_SELF_SIGNED_CERT" : "UNABLE_TO_VERIFY_LEAF_SIGNATURE";
17307
17399
  }
17308
- return selfIssued(chain2.at(-1)) ? "SELF_SIGNED_CERT_IN_CHAIN" : "UNABLE_TO_GET_ISSUER_CERT_LOCALLY";
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 hex3 = `0x${id2.toString(16).padStart(4, "0").toUpperCase()}`;
17446
+ const hex4 = `0x${id2.toString(16).padStart(4, "0").toUpperCase()}`;
17355
17447
  return {
17356
- name: known?.[1] ?? hex3,
17357
- standardName: known?.[2] ?? hex3,
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
- return { conn: plaintext(conn, session, inbox), info: infoOf(o, session) };
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 (raw) => {
17833
+ const make = async (raw2) => {
17740
17834
  ran = true;
17741
17835
  try {
17742
- return await tlsClient(raw, prepared.options);
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(() => void 0);
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)) return;
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 raw of text.split("\n")) {
21692
- const [address, ...names2] = raw.replace(/#.*/, "").trim().split(/\s+/);
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 hex2(bytes) {
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 raw = utf82(value2);
22025
+ const raw2 = utf82(value2);
21904
22026
  const seen = /* @__PURE__ */ new Set([value2]);
21905
22027
  const out = [];
21906
- if (raw.length < FRAGMENT) out.push({ bytes: raw, form: "raw" });
21907
- for (let offset = 0; raw.length >= FRAGMENT && offset + FRAGMENT <= raw.length; offset++) {
21908
- out.push({ bytes: raw.subarray(offset, offset + FRAGMENT), form: "fragment", offset });
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, "&#39;"), html(value2, "&#x27;")]) add(text, "html");
21926
- for (const text of encodings(raw)) add(text, "base64");
21927
- add(hex2(raw), "hex");
21928
- add(hex2(raw).toUpperCase(), "hex");
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 raw of data.split(",")) {
23140
- const item = raw.trim();
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((raw, index) => {
23198
- const content = raw.replace(/#.*$/, "").trim();
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
  });