@ai-ecoverse/slicc-kernel 1.125.2 → 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 +5 -1
- package/dist/kernel-worker.js +235 -110
- package/dist/kernel-worker.js.map +3 -3
- package/dist/node-process-worker.js +167 -22
- package/dist/node-process-worker.js.map +4 -4
- package/dist/node.js +238 -113
- package/dist/node.js.map +3 -3
- package/dist/process-worker.js +167 -22
- 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/dist/types/process/wasi/wasi-host.d.ts +2 -0
- package/package.json +1 -1
package/dist/node.js
CHANGED
|
@@ -1418,8 +1418,8 @@ var SwitchConn = class {
|
|
|
1418
1418
|
switching = false;
|
|
1419
1419
|
secure;
|
|
1420
1420
|
failed;
|
|
1421
|
-
constructor(
|
|
1422
|
-
this.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 (
|
|
1875
|
+
async (raw2) => {
|
|
1876
1876
|
if (abort.signal.aborted) throw dialError(abort.signal.reason, timedOut, true);
|
|
1877
|
-
const conn = new SwitchConn(
|
|
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
|
|
4364
|
-
const name2 = typeof
|
|
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
|
|
5312
|
-
for await (const child of handle.values())
|
|
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 (!
|
|
5315
|
+
if (!children3.has(name2)) children3.set(name2, link2);
|
|
5316
5316
|
}
|
|
5317
|
-
return [found.path, [...
|
|
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,
|
|
5323
|
+
const [dir, children3] = await this.listing(path);
|
|
5324
5324
|
const base = dir === "/" ? "" : dir;
|
|
5325
|
-
const touched =
|
|
5326
|
-
const metas = await this.meta.get(
|
|
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
|
-
|
|
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
|
|
6975
|
-
if (!
|
|
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
|
|
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.
|
|
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,
|
|
7110
|
+
function envOf(pkg, raw2) {
|
|
7111
7111
|
const env = {};
|
|
7112
|
-
if (!
|
|
7113
|
-
for (const [key, value2] of Object.entries(
|
|
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,
|
|
7133
|
-
if (!Array.isArray(
|
|
7134
|
-
if (!
|
|
7135
|
-
return
|
|
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,
|
|
7139
|
-
if (!
|
|
7140
|
-
const { env, wasm } =
|
|
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,
|
|
7151
|
-
if (
|
|
7152
|
-
const variants = Array.isArray(
|
|
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(
|
|
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(
|
|
7169
|
-
const abi =
|
|
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,
|
|
7173
|
-
const withEnv = envFields({ ...shared, ...envOf(pkg,
|
|
7174
|
-
const script = inside(pkg,
|
|
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(
|
|
7179
|
-
const fixed = typeof
|
|
7180
|
-
const argv0 = fixed ?
|
|
7181
|
-
const args = argsOf(pkg,
|
|
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,
|
|
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
|
-
...
|
|
7192
|
+
...raw2.argv0Path === true ? { argv0Path: true } : {},
|
|
7193
7193
|
...args ? { args } : {},
|
|
7194
7194
|
...withEnv
|
|
7195
7195
|
};
|
|
7196
7196
|
}
|
|
7197
|
-
const wasm = inside(pkg,
|
|
7198
|
-
const glue = abi === "wasi" ? wasm : inside(pkg,
|
|
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,
|
|
7201
|
-
const variants = variantsOf(pkg, name2,
|
|
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
|
-
...
|
|
7210
|
-
...abi === "wasi" &&
|
|
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,
|
|
7226
|
-
if (!commandName(name2) || !
|
|
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,
|
|
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
|
|
7781
|
-
return
|
|
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,
|
|
7829
|
+
for (const [index, raw2] of text.split("\n").entries()) {
|
|
7830
7830
|
const line = index + 1;
|
|
7831
|
-
const content =
|
|
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
|
|
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
|
|
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
|
|
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 [];
|
|
@@ -9761,7 +9761,7 @@ var FsWatchers = class {
|
|
|
9761
9761
|
if (created4.length > 0 || !await fs.exists(ancestor)) created4.push(ancestor);
|
|
9762
9762
|
}
|
|
9763
9763
|
}
|
|
9764
|
-
const fresh2 = !options?.recursive ||
|
|
9764
|
+
const fresh2 = !options?.recursive || this.typed.size > 0 && !await fs.exists(path);
|
|
9765
9765
|
let done4 = false;
|
|
9766
9766
|
try {
|
|
9767
9767
|
await fs.mkdir(path, options);
|
|
@@ -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
|
|
14442
|
+
let raw2;
|
|
14442
14443
|
try {
|
|
14443
|
-
|
|
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 (!
|
|
14449
|
-
const head = parseHead(
|
|
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(
|
|
14836
|
-
const half =
|
|
14837
|
-
return seq(integer(
|
|
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(
|
|
16825
|
-
const name2 =
|
|
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
|
|
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 =
|
|
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
|
-
|
|
17226
|
+
fields.push(field4);
|
|
17229
17227
|
at = field4.end;
|
|
17230
17228
|
}
|
|
17231
|
-
|
|
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
|
|
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
|
|
17335
|
+
return shape.leafSelfSigned ? "DEPTH_ZERO_SELF_SIGNED_CERT" : "UNABLE_TO_VERIFY_LEAF_SIGNATURE";
|
|
17244
17336
|
}
|
|
17245
|
-
return
|
|
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
|
|
17383
|
+
const hex4 = `0x${id2.toString(16).padStart(4, "0").toUpperCase()}`;
|
|
17292
17384
|
return {
|
|
17293
|
-
name: known?.[1] ??
|
|
17294
|
-
standardName: known?.[2] ??
|
|
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
|
-
|
|
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 (
|
|
17770
|
+
const make = async (raw2) => {
|
|
17677
17771
|
ran = true;
|
|
17678
17772
|
try {
|
|
17679
|
-
return await tlsClient(
|
|
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(() =>
|
|
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))
|
|
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
|
|
21629
|
-
const [address, ...names2] =
|
|
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
|
|
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
|
|
21962
|
+
const raw2 = utf82(value2);
|
|
21841
21963
|
const seen = /* @__PURE__ */ new Set([value2]);
|
|
21842
21964
|
const out = [];
|
|
21843
|
-
if (
|
|
21844
|
-
for (let offset = 0;
|
|
21845
|
-
out.push({ bytes:
|
|
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, "'"), html(value2, "'")]) add(text, "html");
|
|
21863
|
-
for (const text of encodings(
|
|
21864
|
-
add(
|
|
21865
|
-
add(
|
|
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
|
|
23077
|
-
const item =
|
|
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((
|
|
23135
|
-
const content =
|
|
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
|
|
28059
|
-
if (!
|
|
28060
|
-
head = parseHead2(
|
|
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();
|