@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/dist/node.js CHANGED
@@ -1418,8 +1418,8 @@ var SwitchConn = class {
1418
1418
  switching = false;
1419
1419
  secure;
1420
1420
  failed;
1421
- constructor(raw) {
1422
- this.raw = raw;
1421
+ constructor(raw2) {
1422
+ this.raw = raw2;
1423
1423
  }
1424
1424
  get localAddr() {
1425
1425
  return this.raw.localAddr;
@@ -1872,9 +1872,9 @@ var KernelSocket = class _KernelSocket {
1872
1872
  () => void 0
1873
1873
  );
1874
1874
  return Promise.race([dialled, abandoned]).then(
1875
- async (raw) => {
1875
+ async (raw2) => {
1876
1876
  if (abort.signal.aborted) throw dialError(abort.signal.reason, timedOut, true);
1877
- const conn = new SwitchConn(raw);
1877
+ const conn = new SwitchConn(raw2);
1878
1878
  if (secure2) {
1879
1879
  clearTimeout(timer);
1880
1880
  try {
@@ -4360,8 +4360,8 @@ var ERRNO_BY_DOM_ERROR = {
4360
4360
  var reported = /* @__PURE__ */ new Set();
4361
4361
  function translate(err, path, op = "lookup", mapped = true) {
4362
4362
  if (typeof err?.code === "string") return err;
4363
- const raw = err?.name;
4364
- const name2 = typeof raw === "string" ? raw : "Error";
4363
+ const raw2 = err?.name;
4364
+ const name2 = typeof raw2 === "string" ? raw2 : "Error";
4365
4365
  const code = name2 === "QuotaExceededError" ? "ENOSPC" : mapped && ERRNO_BY_DOM_ERROR[name2] || "EIO";
4366
4366
  const error = Object.assign(fsError(code, path), { domName: name2, op, cause: err });
4367
4367
  if (code !== "EIO" && code !== "ENOSPC") return error;
@@ -5308,26 +5308,26 @@ var OpfsFs = class {
5308
5308
  const found = await this.locate(path, true);
5309
5309
  const handle = found.handle;
5310
5310
  if (handle.kind !== "directory") throw fsError("ENOTDIR", path);
5311
- const children2 = /* @__PURE__ */ new Map();
5312
- for await (const child of handle.values()) children2.set(child.name, child);
5311
+ const children3 = /* @__PURE__ */ new Map();
5312
+ for await (const child of handle.values()) children3.set(child.name, child);
5313
5313
  for (const link2 of await this.meta.links(found.path)) {
5314
5314
  const name2 = baseOf(link2.path);
5315
- if (!children2.has(name2)) children2.set(name2, link2);
5315
+ if (!children3.has(name2)) children3.set(name2, link2);
5316
5316
  }
5317
- return [found.path, [...children2].sort(([a], [b]) => a < b ? -1 : 1)];
5317
+ return [found.path, [...children3].sort(([a], [b]) => a < b ? -1 : 1)];
5318
5318
  }
5319
5319
  async readdir(path) {
5320
5320
  return (await this.listing(path))[1].map(([name2]) => name2);
5321
5321
  }
5322
5322
  async readdirStat(path) {
5323
- const [dir, children2] = await this.listing(path);
5323
+ const [dir, children3] = await this.listing(path);
5324
5324
  const base = dir === "/" ? "" : dir;
5325
- const touched = children2.map(([name2]) => this.timesOf(`${base}/${name2}`));
5326
- const metas = await this.meta.get(children2.map(([name2]) => `${base}/${name2}`));
5325
+ const touched = children3.map(([name2]) => this.timesOf(`${base}/${name2}`));
5326
+ const metas = await this.meta.get(children3.map(([name2]) => `${base}/${name2}`));
5327
5327
  const handed2 = this.owners ? await this.handedTo(dir) : void 0;
5328
5328
  const owned4 = (stat, entry) => handed2 ? { ...stat, ...ownOf(entry) ?? handed2 } : stat;
5329
5329
  return Promise.all(
5330
- children2.map(async ([name2, child], i) => {
5330
+ children3.map(async ([name2, child], i) => {
5331
5331
  if (!isHandle(child)) return [name2, owned4(this.linkStat(child), child)];
5332
5332
  const stat = await this.statOf(`${base}/${name2}`, child, metas[i], touched[i]).catch(
5333
5333
  () => null
@@ -6971,10 +6971,10 @@ function partial(text) {
6971
6971
  text
6972
6972
  );
6973
6973
  if (!m) return void 0;
6974
- const raw = [m[1], m[2], m[3]];
6975
- if (!raw.every((p) => p === void 0 || PART.test(p))) return void 0;
6974
+ const raw2 = [m[1], m[2], m[3]];
6975
+ if (!raw2.every((p) => p === void 0 || PART.test(p))) return void 0;
6976
6976
  const parts2 = [];
6977
- for (const p of raw) {
6977
+ for (const p of raw2) {
6978
6978
  if (p === void 0 || /^[xX*]$/.test(p) || parts2.includes(void 0)) parts2.push(void 0);
6979
6979
  else parts2.push(Number(p));
6980
6980
  }
@@ -7086,7 +7086,7 @@ function satisfies(version, range2) {
7086
7086
  }
7087
7087
 
7088
7088
  // src/version.ts
7089
- var KERNEL_VERSION = true ? "1.125.3" : "0.0.0-dev";
7089
+ var KERNEL_VERSION = true ? "1.125.4" : "0.0.0-dev";
7090
7090
  var OS_RELEASE = "6.0.0-slicc";
7091
7091
  function procVersion() {
7092
7092
  return `Linux version ${OS_RELEASE} (slicc-kernel ${KERNEL_VERSION}) #1 SMP PREEMPT_DYNAMIC
@@ -7107,10 +7107,10 @@ function inside(pkg, rel2) {
7107
7107
  if (clean.startsWith("/") || clean.split("/").includes("..")) return void 0;
7108
7108
  return `${pkg}/${clean}`;
7109
7109
  }
7110
- function envOf(pkg, raw) {
7110
+ function envOf(pkg, raw2) {
7111
7111
  const env = {};
7112
- if (!raw || typeof raw !== "object") return env;
7113
- for (const [key, value2] of Object.entries(raw)) {
7112
+ if (!raw2 || typeof raw2 !== "object") return env;
7113
+ for (const [key, value2] of Object.entries(raw2)) {
7114
7114
  if (!ENV_KEY.test(key)) continue;
7115
7115
  if (typeof value2 === "string") env[key] = value2.replace(PACKAGE, pkg);
7116
7116
  else if (value2 === null) env[key] = null;
@@ -7129,15 +7129,15 @@ function envFields(merged2) {
7129
7129
  ...unset.length > 0 ? { unset } : {}
7130
7130
  };
7131
7131
  }
7132
- function argsOf(pkg, raw) {
7133
- if (!Array.isArray(raw) || raw.length === 0) return void 0;
7134
- if (!raw.every((arg) => typeof arg === "string")) return void 0;
7135
- return raw.map((arg) => arg.replace(PACKAGE, pkg));
7132
+ function argsOf(pkg, raw2) {
7133
+ if (!Array.isArray(raw2) || raw2.length === 0) return void 0;
7134
+ if (!raw2.every((arg) => typeof arg === "string")) return void 0;
7135
+ return raw2.map((arg) => arg.replace(PACKAGE, pkg));
7136
7136
  }
7137
7137
  var warnedVariants = /* @__PURE__ */ new Set();
7138
- function variantOf(pkg, raw) {
7139
- if (!raw || typeof raw !== "object" || Array.isArray(raw)) return void 0;
7140
- const { env, wasm } = raw;
7138
+ function variantOf(pkg, raw2) {
7139
+ if (!raw2 || typeof raw2 !== "object" || Array.isArray(raw2)) return void 0;
7140
+ const { env, wasm } = raw2;
7141
7141
  const path = inside(pkg, wasm);
7142
7142
  if (!path || !env || typeof env !== "object" || Array.isArray(env)) return void 0;
7143
7143
  const pairs = Object.entries(env);
@@ -7147,13 +7147,13 @@ function variantOf(pkg, raw) {
7147
7147
  }
7148
7148
  return { env: Object.fromEntries(pairs), wasm: path };
7149
7149
  }
7150
- function variantsOf(pkg, name2, raw) {
7151
- if (raw === void 0) return void 0;
7152
- const variants = Array.isArray(raw) ? raw.map((one) => variantOf(pkg, one)) : [void 0];
7150
+ function variantsOf(pkg, name2, raw2) {
7151
+ if (raw2 === void 0) return void 0;
7152
+ const variants = Array.isArray(raw2) ? raw2.map((one) => variantOf(pkg, one)) : [void 0];
7153
7153
  if (variants.every((one) => one !== void 0)) {
7154
7154
  return variants.length > 0 ? variants : void 0;
7155
7155
  }
7156
- const key = `${pkg}:${name2}:${JSON.stringify(raw)}`;
7156
+ const key = `${pkg}:${name2}:${JSON.stringify(raw2)}`;
7157
7157
  if (!warnedVariants.has(key)) {
7158
7158
  warnedVariants.add(key);
7159
7159
  console.warn(`slicc-kernel: ${pkg}: ${name2}: ignoring malformed "variants", running its wasm`);
@@ -7165,22 +7165,22 @@ function variantFor(variants, env) {
7165
7165
  (one) => Object.entries(one.env).every(([key, value2]) => env[key] === value2)
7166
7166
  )?.wasm;
7167
7167
  }
7168
- function abiOf(raw, fallback) {
7169
- const abi = raw ?? fallback;
7168
+ function abiOf(raw2, fallback) {
7169
+ const abi = raw2 ?? fallback;
7170
7170
  return abi === "emscripten" || abi === "wasi" || abi === "js" ? abi : void 0;
7171
7171
  }
7172
- function commandOf(pkg, name2, raw, packageAbi, shared) {
7173
- const withEnv = envFields({ ...shared, ...envOf(pkg, raw.env) });
7174
- const script = inside(pkg, raw.script);
7172
+ function commandOf(pkg, name2, raw2, packageAbi, shared) {
7173
+ const withEnv = envFields({ ...shared, ...envOf(pkg, raw2.env) });
7174
+ const script = inside(pkg, raw2.script);
7175
7175
  if (script) {
7176
7176
  return { name: name2, abi: packageAbi, glue: script, wasm: script, argv0: name2, script, ...withEnv };
7177
7177
  }
7178
- const abi = abiOf(raw.abi, packageAbi);
7179
- const fixed = typeof raw.argv0 === "string" && raw.argv0 !== "";
7180
- const argv0 = fixed ? raw.argv0 : name2;
7181
- const args = argsOf(pkg, raw.args);
7178
+ const abi = abiOf(raw2.abi, packageAbi);
7179
+ const fixed = typeof raw2.argv0 === "string" && raw2.argv0 !== "";
7180
+ const argv0 = fixed ? raw2.argv0 : name2;
7181
+ const args = argsOf(pkg, raw2.args);
7182
7182
  if (abi === "js") {
7183
- const module = inside(pkg, raw.module);
7183
+ const module = inside(pkg, raw2.module);
7184
7184
  if (!module) return void 0;
7185
7185
  return {
7186
7186
  name: name2,
@@ -7189,16 +7189,16 @@ function commandOf(pkg, name2, raw, packageAbi, shared) {
7189
7189
  wasm: module,
7190
7190
  argv0,
7191
7191
  ...fixed ? { argv0Fixed: true } : {},
7192
- ...raw.argv0Path === true ? { argv0Path: true } : {},
7192
+ ...raw2.argv0Path === true ? { argv0Path: true } : {},
7193
7193
  ...args ? { args } : {},
7194
7194
  ...withEnv
7195
7195
  };
7196
7196
  }
7197
- const wasm = inside(pkg, raw.wasm);
7198
- const glue = abi === "wasi" ? wasm : inside(pkg, raw.glue);
7197
+ const wasm = inside(pkg, raw2.wasm);
7198
+ const glue = abi === "wasi" ? wasm : inside(pkg, raw2.glue);
7199
7199
  if (!abi || !glue || !wasm) return void 0;
7200
- const imports = abi === "wasi" ? inside(pkg, raw.imports) : void 0;
7201
- const variants = variantsOf(pkg, name2, raw.variants);
7200
+ const imports = abi === "wasi" ? inside(pkg, raw2.imports) : void 0;
7201
+ const variants = variantsOf(pkg, name2, raw2.variants);
7202
7202
  return {
7203
7203
  name: name2,
7204
7204
  abi,
@@ -7206,8 +7206,8 @@ function commandOf(pkg, name2, raw, packageAbi, shared) {
7206
7206
  wasm,
7207
7207
  argv0,
7208
7208
  ...fixed ? { argv0Fixed: true } : {},
7209
- ...raw.argv0Path === true ? { argv0Path: true } : {},
7210
- ...abi === "wasi" && raw.preopenRoot === true ? { preopenRoot: true } : {},
7209
+ ...raw2.argv0Path === true ? { argv0Path: true } : {},
7210
+ ...abi === "wasi" && raw2.preopenRoot === true ? { preopenRoot: true } : {},
7211
7211
  ...args ? { args } : {},
7212
7212
  ...withEnv,
7213
7213
  ...imports ? { imports } : {},
@@ -7222,11 +7222,11 @@ function commandsOf(pkg, manifest) {
7222
7222
  if (!packageAbi || !entries || typeof entries !== "object") return [];
7223
7223
  const shared = envOf(pkg, slicc.env);
7224
7224
  const out = [];
7225
- for (const [name2, raw] of Object.entries(entries)) {
7226
- if (!commandName(name2) || !raw || typeof raw !== "object") {
7225
+ for (const [name2, raw2] of Object.entries(entries)) {
7226
+ if (!commandName(name2) || !raw2 || typeof raw2 !== "object") {
7227
7227
  continue;
7228
7228
  }
7229
- const command = commandOf(pkg, name2, raw, packageAbi, shared);
7229
+ const command = commandOf(pkg, name2, raw2, packageAbi, shared);
7230
7230
  if (command) out.push(command);
7231
7231
  }
7232
7232
  return out;
@@ -7777,8 +7777,8 @@ function hashId(text) {
7777
7777
  a = Math.imul(a ^ c, 16777619);
7778
7778
  b = Math.imul(b ^ c, 1540483477);
7779
7779
  }
7780
- const hex3 = (n) => (n >>> 0).toString(16).padStart(8, "0");
7781
- return hex3(a) + hex3(b);
7780
+ const hex4 = (n) => (n >>> 0).toString(16).padStart(8, "0");
7781
+ return hex4(a) + hex4(b);
7782
7782
  }
7783
7783
  function split2(text, count2) {
7784
7784
  const words2 = [];
@@ -7826,9 +7826,9 @@ function parseCrontab(text, path, system = false) {
7826
7826
  const env = {};
7827
7827
  const ctx = { path, system, names: /* @__PURE__ */ new Set() };
7828
7828
  let name2;
7829
- for (const [index, raw] of text.split("\n").entries()) {
7829
+ for (const [index, raw2] of text.split("\n").entries()) {
7830
7830
  const line = index + 1;
7831
- const content = raw.trim();
7831
+ const content = raw2.trim();
7832
7832
  const named = NAME_LINE.exec(content);
7833
7833
  if (named) {
7834
7834
  name2 = named[1];
@@ -9220,7 +9220,7 @@ function withCommandDirs(fs, names2, userDir = async () => void 0, owners = fals
9220
9220
  const { uid = 0, gid = 0 } = dir === void 0 ? {} : await nearest(dir);
9221
9221
  return { ...stat2, uid, gid };
9222
9222
  }
9223
- async function children2(path) {
9223
+ async function children3(path) {
9224
9224
  if (path === "/") return ["bin", "usr"];
9225
9225
  if (path === "/usr") return ["bin"];
9226
9226
  if (path === "/bin" || path === "/usr/bin") return [...await names2()];
@@ -9315,7 +9315,7 @@ function withCommandDirs(fs, names2, userDir = async () => void 0, owners = fals
9315
9315
  stat: (path) => stat(path, (p) => fs.stat(p)),
9316
9316
  lstat: (path) => stat(path, (p) => fs.lstat(p)),
9317
9317
  async readdir(path) {
9318
- const extra = await children2(path);
9318
+ const extra = await children3(path);
9319
9319
  if (!extra) return fs.readdir(path);
9320
9320
  const real = await fs.readdir(path).catch((err) => {
9321
9321
  if (missing3(err)) return [];
@@ -9324,7 +9324,7 @@ function withCommandDirs(fs, names2, userDir = async () => void 0, owners = fals
9324
9324
  return [.../* @__PURE__ */ new Set([...real, ...extra])].sort();
9325
9325
  },
9326
9326
  async readdirStat(path) {
9327
- const extra = await children2(path);
9327
+ const extra = await children3(path);
9328
9328
  if (!extra) return fs.readdirStat(path);
9329
9329
  const real = await fs.readdirStat(path).catch((err) => {
9330
9330
  if (missing3(err)) return [];
@@ -11002,6 +11002,7 @@ var MountTable = class {
11002
11002
  if (paths === true) {
11003
11003
  mount.attrs.clear();
11004
11004
  mount.lists.clear();
11005
+ this.deps.doubted?.(target);
11005
11006
  this.deps.changed?.(target);
11006
11007
  return;
11007
11008
  }
@@ -14438,15 +14439,15 @@ function parseHead(bytes) {
14438
14439
  }
14439
14440
  async function readHead(incoming, signal) {
14440
14441
  for (; ; ) {
14441
- let raw;
14442
+ let raw2;
14442
14443
  try {
14443
- raw = await incoming.head(MAX_HEAD2, signal);
14444
+ raw2 = await incoming.head(MAX_HEAD2, signal);
14444
14445
  } catch (err) {
14445
14446
  if (err instanceof KernelError) throw err;
14446
14447
  throw errno2("EPROTO", "the response head is malformed or too large");
14447
14448
  }
14448
- if (!raw) throw errno2("ECONNRESET", "the connection closed before a response");
14449
- const head = parseHead(raw);
14449
+ if (!raw2) throw errno2("ECONNRESET", "the connection closed before a response");
14450
+ const head = parseHead(raw2);
14450
14451
  if (head.status < 100 || head.status >= 200 || head.status === 101) return head;
14451
14452
  }
14452
14453
  }
@@ -14832,9 +14833,9 @@ async function keyId(spki) {
14832
14833
  await crypto.subtle.digest("SHA-1", publicKeyBits(spki))
14833
14834
  );
14834
14835
  }
14835
- function ecdsaDer(raw) {
14836
- const half = raw.length / 2;
14837
- return seq(integer(raw.subarray(0, half)), integer(raw.subarray(half)));
14836
+ function ecdsaDer(raw2) {
14837
+ const half = raw2.length / 2;
14838
+ return seq(integer(raw2.subarray(0, half)), integer(raw2.subarray(half)));
14838
14839
  }
14839
14840
  function randomSerial() {
14840
14841
  const serial = crypto.getRandomValues(new Uint8Array(16));
@@ -16821,8 +16822,8 @@ var SemHandles = class _SemHandles {
16821
16822
  this.byHandle.clear();
16822
16823
  }
16823
16824
  };
16824
- function semName(raw) {
16825
- const name2 = raw.replace(/^\/+/, "");
16825
+ function semName(raw2) {
16826
+ const name2 = raw2.replace(/^\/+/, "");
16826
16827
  if (name2 === "" || name2.includes("/") || name2 === "." || name2 === "..") {
16827
16828
  throw new KernelError("EINVAL");
16828
16829
  }
@@ -17217,20 +17218,111 @@ function tlv2(der, at) {
17217
17218
  const end = body + length2;
17218
17219
  return end > der.length ? void 0 : { start: at, body, end };
17219
17220
  }
17220
- function names(der) {
17221
- const cert = tlv2(der, 0);
17222
- const tbs = cert && tlv2(der, cert.body);
17223
- if (!tbs) return void 0;
17221
+ function children2(der, outer, max) {
17224
17222
  const fields = [];
17225
- for (let at = tbs.body; at < tbs.end && fields.length < 6; ) {
17223
+ for (let at = outer.body; at < outer.end && fields.length < max; ) {
17226
17224
  const field4 = tlv2(der, at);
17227
17225
  if (!field4) return void 0;
17228
- if (fields.length > 0 || der[at] !== 160) fields.push(field4);
17226
+ fields.push(field4);
17229
17227
  at = field4.end;
17230
17228
  }
17231
- const [, , issuer, , subject] = fields;
17229
+ return fields;
17230
+ }
17231
+ function tbsFields(der) {
17232
+ const outer = tlv2(der, 0);
17233
+ const cert = outer && children2(der, outer, 3);
17234
+ const tbs = cert?.[0] && children2(der, cert[0], 8);
17235
+ if (!cert || !tbs) return void 0;
17236
+ return { cert, tbs: der[tbs[0]?.start ?? 0] === 160 ? tbs.slice(1) : tbs };
17237
+ }
17238
+ var raw = (der, t) => der.subarray(t.start, t.end);
17239
+ function names(der) {
17240
+ const fields = tbsFields(der)?.tbs;
17241
+ const [, , issuer, , subject] = fields ?? [];
17232
17242
  if (!issuer || !subject) return void 0;
17233
- return [der.subarray(issuer.start, issuer.end), der.subarray(subject.start, subject.end)];
17243
+ return [raw(der, issuer), raw(der, subject)];
17244
+ }
17245
+ var hex2 = (bytes) => Array.from(bytes, (b) => b.toString(16).padStart(2, "0")).join("");
17246
+ var HASHES = {
17247
+ "2a864886f70d01010b": ["RSASSA-PKCS1-v1_5", "SHA-256"],
17248
+ "2a864886f70d01010c": ["RSASSA-PKCS1-v1_5", "SHA-384"],
17249
+ "2a864886f70d01010d": ["RSASSA-PKCS1-v1_5", "SHA-512"],
17250
+ "2a8648ce3d040302": ["ECDSA", "SHA-256"],
17251
+ "2a8648ce3d040303": ["ECDSA", "SHA-384"],
17252
+ "2a8648ce3d040304": ["ECDSA", "SHA-512"],
17253
+ "2b6570": ["Ed25519", ""]
17254
+ };
17255
+ var CURVES = {
17256
+ "2a8648ce3d030107": ["P-256", 32],
17257
+ "2b81040022": ["P-384", 48],
17258
+ "2b81040023": ["P-521", 66]
17259
+ };
17260
+ function oidOf(der, algorithm, index = 0) {
17261
+ const parts2 = children2(der, algorithm, 2);
17262
+ const oid2 = parts2?.[index];
17263
+ return oid2 && der[oid2.start] === 6 ? hex2(der.subarray(oid2.body, oid2.end)) : void 0;
17264
+ }
17265
+ function curveOf(der, spki) {
17266
+ const algorithm = children2(der, spki, 1)?.[0];
17267
+ const curve = algorithm && oidOf(der, algorithm, 1);
17268
+ return curve ? CURVES[curve] : void 0;
17269
+ }
17270
+ function fixedEcdsa(sig, size) {
17271
+ const outer = tlv2(sig, 0);
17272
+ const ints = outer && children2(sig, outer, 2);
17273
+ if (ints?.length !== 2) return void 0;
17274
+ const out = new Uint8Array(size * 2);
17275
+ for (const [i, int] of ints.entries()) {
17276
+ let value2 = sig.subarray(int.body, int.end);
17277
+ while (value2.length > size && value2[0] === 0) value2 = value2.subarray(1);
17278
+ if (value2.length > size) return void 0;
17279
+ out.set(value2, (i + 1) * size - value2.length);
17280
+ }
17281
+ return out;
17282
+ }
17283
+ function signedOf(der) {
17284
+ const parts2 = tbsFields(der);
17285
+ const [tbs, algorithm, value2] = parts2?.cert ?? [];
17286
+ const spki = parts2?.tbs[5];
17287
+ if (!tbs || !algorithm || !value2 || !spki || der[value2.start] !== 3) return void 0;
17288
+ const known = HASHES[oidOf(der, algorithm) ?? ""];
17289
+ if (!known) return "unknown";
17290
+ const [scheme, hash] = known;
17291
+ const curve = scheme === "ECDSA" ? curveOf(der, spki) : void 0;
17292
+ if (scheme === "ECDSA" && !curve) return "unknown";
17293
+ const signature = der.subarray(value2.body + 1, value2.end);
17294
+ return {
17295
+ tbs: raw(der, tbs),
17296
+ spki: raw(der, spki),
17297
+ signature,
17298
+ scheme,
17299
+ hash,
17300
+ ...curve ? { curve } : {}
17301
+ };
17302
+ }
17303
+ async function verifiesItself(s) {
17304
+ const name2 = s.curve?.[0];
17305
+ const algorithm = s.scheme === "ECDSA" ? { name: "ECDSA", namedCurve: name2 } : s.hash ? { name: s.scheme, hash: s.hash } : { name: s.scheme };
17306
+ const key = await crypto.subtle.importKey("spki", new Uint8Array(s.spki), algorithm, false, [
17307
+ "verify"
17308
+ ]);
17309
+ const signature = s.curve ? fixedEcdsa(s.signature, s.curve[1]) : s.signature;
17310
+ if (!signature) return false;
17311
+ const params = s.scheme === "ECDSA" ? { name: "ECDSA", hash: s.hash } : { name: s.scheme };
17312
+ return crypto.subtle.verify(params, key, new Uint8Array(signature), new Uint8Array(s.tbs));
17313
+ }
17314
+ async function selfSigned(der) {
17315
+ if (!selfIssued(der)) return false;
17316
+ const signed = signedOf(der);
17317
+ if (signed === "unknown") return true;
17318
+ if (!signed) return false;
17319
+ return verifiesItself(signed).catch(() => false);
17320
+ }
17321
+ async function chainShape(chain2) {
17322
+ return {
17323
+ leafSelfSigned: chain2.length === 1 && await selfSigned(chain2[0]),
17324
+ topSelfSigned: chain2.length > 1 && await selfSigned(chain2.at(-1))
17325
+ };
17234
17326
  }
17235
17327
  function selfIssued(der) {
17236
17328
  const pair = der && names(der);
@@ -17238,17 +17330,17 @@ function selfIssued(der) {
17238
17330
  const [issuer, subject] = pair;
17239
17331
  return issuer.length === subject.length && issuer.every((b, i) => b === subject[i]);
17240
17332
  }
17241
- function untrusted(chain2) {
17333
+ function untrusted(chain2, shape) {
17242
17334
  if (chain2.length === 1) {
17243
- return selfIssued(chain2[0]) ? "DEPTH_ZERO_SELF_SIGNED_CERT" : "UNABLE_TO_VERIFY_LEAF_SIGNATURE";
17335
+ return shape.leafSelfSigned ? "DEPTH_ZERO_SELF_SIGNED_CERT" : "UNABLE_TO_VERIFY_LEAF_SIGNATURE";
17244
17336
  }
17245
- return selfIssued(chain2.at(-1)) ? "SELF_SIGNED_CERT_IN_CHAIN" : "UNABLE_TO_GET_ISSUER_CERT_LOCALLY";
17337
+ return shape.topSelfSigned ? "SELF_SIGNED_CERT_IN_CHAIN" : "UNABLE_TO_GET_ISSUER_CERT_LOCALLY";
17246
17338
  }
17247
- function chainError(flags2, chain2) {
17339
+ function chainError(flags2, chain2, shape) {
17248
17340
  if (flags2 === -1) return "UNABLE_TO_VERIFY_LEAF_SIGNATURE";
17249
17341
  const rest2 = flags2 & ~CN_MISMATCH;
17250
17342
  if (rest2 === 0) return void 0;
17251
- if (rest2 & NOT_TRUSTED) return untrusted(chain2);
17343
+ if (rest2 & NOT_TRUSTED) return untrusted(chain2, shape);
17252
17344
  return verifyCode(rest2);
17253
17345
  }
17254
17346
  function nameMatches(flags2) {
@@ -17288,10 +17380,10 @@ var SUITES = [
17288
17380
  ];
17289
17381
  function cipherOf(id2, protocol) {
17290
17382
  const known = SUITES.find(([n]) => n === id2);
17291
- const hex3 = `0x${id2.toString(16).padStart(4, "0").toUpperCase()}`;
17383
+ const hex4 = `0x${id2.toString(16).padStart(4, "0").toUpperCase()}`;
17292
17384
  return {
17293
- name: known?.[1] ?? hex3,
17294
- standardName: known?.[2] ?? hex3,
17385
+ name: known?.[1] ?? hex4,
17386
+ standardName: known?.[2] ?? hex4,
17295
17387
  version: known?.[3] ?? protocol
17296
17388
  };
17297
17389
  }
@@ -17397,12 +17489,12 @@ async function handshake(conn, o, session, inbox) {
17397
17489
  }
17398
17490
  }
17399
17491
  }
17400
- function insecureOf(session, chain2) {
17492
+ function insecureOf(session, chain2, shape) {
17401
17493
  const flags2 = session.verifyResult;
17402
- const error = chainError(flags2, chain2);
17494
+ const error = chainError(flags2, chain2, shape);
17403
17495
  return { hostnameMatches: nameMatches(flags2), ...error ? { chainError: error } : {} };
17404
17496
  }
17405
- function controlsOf(o, session, protocol, chain2) {
17497
+ function controlsOf(o, session, protocol, chain2, shape) {
17406
17498
  if (!o.engine.sessionControls) return {};
17407
17499
  const checked = o.checkHostname !== false && !o.insecure;
17408
17500
  return {
@@ -17410,21 +17502,22 @@ function controlsOf(o, session, protocol, chain2) {
17410
17502
  clientCertificate: o.clientCertificate === true,
17411
17503
  sni: o.sni !== false && !isIP(o.servername),
17412
17504
  hostnameChecked: checked,
17413
- ...o.insecure ? insecureOf(session, chain2) : { hostnameMatches: checked || !session.nameMismatch }
17505
+ ...o.insecure ? insecureOf(session, chain2, shape) : { hostnameMatches: checked || !session.nameMismatch }
17414
17506
  };
17415
17507
  }
17416
- function infoOf(o, session) {
17508
+ async function infoOf(o, session) {
17417
17509
  const flags2 = session.verifyResult;
17418
17510
  const code = verifyCode(flags2);
17419
17511
  const protocol = session.version === 772 ? "TLSv1.3" : "TLSv1.2";
17420
17512
  const chain2 = session.peerChain();
17513
+ const shape = await chainShape(o.insecure ? chain2 : []);
17421
17514
  return {
17422
17515
  protocol,
17423
17516
  alpnProtocol: session.alpn ?? false,
17424
17517
  authorized: code === void 0,
17425
17518
  ...code ? { authorizationError: code, authorizationText: o.engine.verifyInfo(flags2).trim() } : {},
17426
17519
  peerCertificates: chain2,
17427
- ...controlsOf(o, session, protocol, chain2)
17520
+ ...controlsOf(o, session, protocol, chain2, shape)
17428
17521
  };
17429
17522
  }
17430
17523
  var FATAL_ALERT = -30592;
@@ -17488,7 +17581,8 @@ async function tlsClient(conn, o, taken = new Uint8Array(0)) {
17488
17581
  inbox.hand(taken);
17489
17582
  try {
17490
17583
  await handshake(conn, o, session, inbox);
17491
- return { conn: plaintext(conn, session, inbox), info: infoOf(o, session) };
17584
+ const info = await infoOf(o, session);
17585
+ return { conn: plaintext(conn, session, inbox), info };
17492
17586
  } catch (err) {
17493
17587
  session.free();
17494
17588
  throw err;
@@ -17673,10 +17767,10 @@ async function prepareWith(support, req, servername, cert) {
17673
17767
  }
17674
17768
  function secure(prepared) {
17675
17769
  let ran = false;
17676
- const make = async (raw) => {
17770
+ const make = async (raw2) => {
17677
17771
  ran = true;
17678
17772
  try {
17679
- return await tlsClient(raw, prepared.options);
17773
+ return await tlsClient(raw2, prepared.options);
17680
17774
  } finally {
17681
17775
  prepared.own?.release();
17682
17776
  }
@@ -18160,6 +18254,7 @@ var SEEK_SET = 0;
18160
18254
  var SEEK_CUR = 1;
18161
18255
  var SEEK_END = 2;
18162
18256
  var WRITEBACK_MS = 250;
18257
+ var UNREACHABLE2 = /* @__PURE__ */ new Set(["ENOMEDIUM", "ENOTCONN", "ENODEV", "EIO"]);
18163
18258
  var WRITEBACK_COST_FACTOR = 10;
18164
18259
  function isMissing(err) {
18165
18260
  if (err?.code === "ENOENT") return true;
@@ -18177,6 +18272,8 @@ var VfsNode = class {
18177
18272
  queue = Promise.resolve();
18178
18273
  writeBack;
18179
18274
  writeBackCost = 0;
18275
+ failed = false;
18276
+ doubt = false;
18180
18277
  opens = 0;
18181
18278
  writers = 0;
18182
18279
  missing = false;
@@ -18325,6 +18422,7 @@ var VfsNode = class {
18325
18422
  }
18326
18423
  async pwrite(bytes, at) {
18327
18424
  if (bytes.length === 0) return 0;
18425
+ await this.settled();
18328
18426
  await this.fits(at + bytes.length);
18329
18427
  const ranged2 = await this.prepare();
18330
18428
  if (ranged2) {
@@ -18340,6 +18438,7 @@ var VfsNode = class {
18340
18438
  return bytes.length;
18341
18439
  }
18342
18440
  async truncate(size) {
18441
+ await this.settled();
18343
18442
  await this.fits(size);
18344
18443
  const ranged2 = await this.prepare();
18345
18444
  if (ranged2) {
@@ -18352,6 +18451,20 @@ var VfsNode = class {
18352
18451
  this.length = size;
18353
18452
  this.markDirty();
18354
18453
  }
18454
+ doubted() {
18455
+ if (this.dirty) this.failed = true;
18456
+ else if (!this.orphaned) this.doubt = true;
18457
+ }
18458
+ async settled() {
18459
+ if (this.failed) return this.flush();
18460
+ if (!this.doubt) return;
18461
+ const err = await this.fs.stat?.(this.path).then(
18462
+ () => void 0,
18463
+ (e) => e
18464
+ );
18465
+ if (UNREACHABLE2.has(err?.code ?? "")) throw err;
18466
+ this.doubt = false;
18467
+ }
18355
18468
  markDirty() {
18356
18469
  this.dirty = true;
18357
18470
  this.recount();
@@ -18360,7 +18473,9 @@ var VfsNode = class {
18360
18473
  const delay = Math.max(WRITEBACK_MS, this.writeBackCost * WRITEBACK_COST_FACTOR);
18361
18474
  this.writeBack = setTimeout(() => {
18362
18475
  this.writeBack = void 0;
18363
- this.serial(() => this.flush()).catch(() => void 0);
18476
+ this.serial(() => this.flush()).catch(() => {
18477
+ this.failed = true;
18478
+ });
18364
18479
  }, delay);
18365
18480
  }
18366
18481
  ensure(need2) {
@@ -18373,7 +18488,10 @@ var VfsNode = class {
18373
18488
  }
18374
18489
  async flush() {
18375
18490
  if (this.revoked && this.dirty) throw new KernelError("EIO");
18376
- if (!this.dirty || this.orphaned || !(this.data || this.ranged)) return;
18491
+ if (!this.dirty || this.orphaned || !(this.data || this.ranged)) {
18492
+ this.failed = false;
18493
+ return;
18494
+ }
18377
18495
  this.dirty = false;
18378
18496
  const started = performance.now();
18379
18497
  try {
@@ -18385,6 +18503,7 @@ var VfsNode = class {
18385
18503
  } finally {
18386
18504
  this.recount();
18387
18505
  }
18506
+ this.failed = false;
18388
18507
  this.writeBackCost = performance.now() - started;
18389
18508
  }
18390
18509
  };
@@ -18625,6 +18744,9 @@ var VfsNodes = class {
18625
18744
  rewritten(path) {
18626
18745
  this.byPath.get(path)?.reread();
18627
18746
  }
18747
+ doubted(path) {
18748
+ for (const [p, node] of this.byPath) if (within7(p, path)) node.doubted();
18749
+ }
18628
18750
  async flush(path) {
18629
18751
  for (const [p, node] of this.byPath) if (within7(p, path)) await node.serial(() => node.flush());
18630
18752
  }
@@ -21625,8 +21747,8 @@ function isMessage(data) {
21625
21747
  var HOSTS_PATH = "/etc/hosts";
21626
21748
  function parseHosts(text) {
21627
21749
  const table = /* @__PURE__ */ new Map();
21628
- for (const raw of text.split("\n")) {
21629
- const [address, ...names2] = raw.replace(/#.*/, "").trim().split(/\s+/);
21750
+ for (const raw2 of text.split("\n")) {
21751
+ const [address, ...names2] = raw2.replace(/#.*/, "").trim().split(/\s+/);
21630
21752
  if (!address || names2.length === 0) continue;
21631
21753
  if (ipv4Bytes(address) === void 0 && ipv6Groups(address) === void 0) continue;
21632
21754
  for (const name2 of names2) {
@@ -21781,7 +21903,7 @@ function base642(bytes, padded = true) {
21781
21903
  function urlSafe(text) {
21782
21904
  return text.replace(/\+/g, "-").replace(/\//g, "_");
21783
21905
  }
21784
- function hex2(bytes) {
21906
+ function hex3(bytes) {
21785
21907
  let out = "";
21786
21908
  for (const byte of bytes) out += byte.toString(16).padStart(2, "0");
21787
21909
  return out;
@@ -21837,12 +21959,12 @@ function encodings(bytes) {
21837
21959
  return [...standard, ...standard.map(urlSafe)];
21838
21960
  }
21839
21961
  function shapes(value2) {
21840
- const raw = utf82(value2);
21962
+ const raw2 = utf82(value2);
21841
21963
  const seen = /* @__PURE__ */ new Set([value2]);
21842
21964
  const out = [];
21843
- if (raw.length < FRAGMENT) out.push({ bytes: raw, form: "raw" });
21844
- for (let offset = 0; raw.length >= FRAGMENT && offset + FRAGMENT <= raw.length; offset++) {
21845
- out.push({ bytes: raw.subarray(offset, offset + FRAGMENT), form: "fragment", offset });
21965
+ if (raw2.length < FRAGMENT) out.push({ bytes: raw2, form: "raw" });
21966
+ for (let offset = 0; raw2.length >= FRAGMENT && offset + FRAGMENT <= raw2.length; offset++) {
21967
+ out.push({ bytes: raw2.subarray(offset, offset + FRAGMENT), form: "fragment", offset });
21846
21968
  }
21847
21969
  const add = (text, form) => {
21848
21970
  if (seen.has(text)) return;
@@ -21860,9 +21982,9 @@ function shapes(value2) {
21860
21982
  }
21861
21983
  for (const text of percent(value2)) add(text, "percent");
21862
21984
  for (const text of [html(value2, "&#39;"), html(value2, "&#x27;")]) add(text, "html");
21863
- for (const text of encodings(raw)) add(text, "base64");
21864
- add(hex2(raw), "hex");
21865
- add(hex2(raw).toUpperCase(), "hex");
21985
+ for (const text of encodings(raw2)) add(text, "base64");
21986
+ add(hex3(raw2), "hex");
21987
+ add(hex3(raw2).toUpperCase(), "hex");
21866
21988
  return out;
21867
21989
  }
21868
21990
  function wrappable(form) {
@@ -23073,8 +23195,8 @@ var GENERIC = /* @__PURE__ */ new Set([
23073
23195
  ]);
23074
23196
  function parseMountOptions(data) {
23075
23197
  const options = {};
23076
- for (const raw of data.split(",")) {
23077
- const item = raw.trim();
23198
+ for (const raw2 of data.split(",")) {
23199
+ const item = raw2.trim();
23078
23200
  if (!item || GENERIC.has(item)) continue;
23079
23201
  if (item === "rw") {
23080
23202
  delete options.ro;
@@ -23131,8 +23253,8 @@ function unescape(field4) {
23131
23253
  }
23132
23254
  function parseFstab(text) {
23133
23255
  const lines2 = [];
23134
- text.split("\n").forEach((raw, index) => {
23135
- const content = raw.replace(/#.*$/, "").trim();
23256
+ text.split("\n").forEach((raw2, index) => {
23257
+ const content = raw2.replace(/#.*$/, "").trim();
23136
23258
  if (!content) return;
23137
23259
  const [source, target, type, options = "defaults"] = content.split(/\s+/).map(unescape);
23138
23260
  if (source === void 0 || target === void 0 || type === void 0) return;
@@ -25169,6 +25291,9 @@ var Launcher = class {
25169
25291
  if (paths.some((path) => this.pnpmChain.has(path))) this.pnpmStale();
25170
25292
  this.watchers.changed(...paths);
25171
25293
  },
25294
+ doubted: (target) => {
25295
+ for (const nodes of this.openFiles) nodes.doubted(target);
25296
+ },
25172
25297
  reshaped: () => this.watchers.reshaped(),
25173
25298
  owners: this.owners
25174
25299
  });
@@ -28055,9 +28180,9 @@ async function loopbackFetch(dial, input, options) {
28055
28180
  const source = new ByteSource(socket.readable.getReader());
28056
28181
  let head;
28057
28182
  do {
28058
- const raw = await source.until("\r\n\r\n");
28059
- if (!raw) throw errorWithCode("ECONNRESET: the connection closed before a response");
28060
- head = parseHead2(raw);
28183
+ const raw2 = await source.until("\r\n\r\n");
28184
+ if (!raw2) throw errorWithCode("ECONNRESET: the connection closed before a response");
28185
+ head = parseHead2(raw2);
28061
28186
  } while (head.status >= 100 && head.status < 200);
28062
28187
  const chunks2 = bodyOf2(source, head, request.method);
28063
28188
  if (!chunks2) socket.close();