2026-10-19 19:45:10 +02:00
|
|
|
// The TypeScript reader in its own process, for content-https.test.ts. Argv: <endpoints json> <manifests dir> [only case].
|
|
|
|
|
// One stdout line per case: {case, ok:true, sha256} (hashed here by node:crypto, not by the reader) or {case, ok:false, code, status}.
|
|
|
|
|
import { createHash } from "node:crypto";
|
|
|
|
|
import { readFileSync } from "node:fs";
|
|
|
|
|
import { join } from "node:path";
|
npm: scope cultnet-ts, cultmesh-ts and cultmesh-browser under @gamecult
Unscoped npm names are unclaimed and open to dependency confusion; cultcache-ts was
already @gamecult/cultcache-ts. package.json names, intra-repo dependencies, package-lock,
import specifiers (src, tests, samples, docs/start, first-call docs test), the workspace
list in run-typescript-workspaces, the verify-eve module map and package READMEs now use
the scoped names. Directory names, workspace paths in CI and release tag prefixes are
unchanged. Historical cut docs and past CHANGELOG entries keep the old names.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-11-07 16:25:10 +00:00
|
|
|
import { decodeManifest } from "@gamecult/cultnet-ts/content";
|
2026-10-19 19:45:10 +02:00
|
|
|
import { fetchVerifiedChunk, fetchVerifiedContent, CultMeshContentError } from "../../src/content.js";
|
|
|
|
|
|
|
|
|
|
const [endpointsJson, manifestsDir, only] = process.argv.slice(2) as [string, string, string | undefined];
|
|
|
|
|
const endpoints = JSON.parse(endpointsJson) as Record<"honest" | "tampered" | "corrupt", string>;
|
|
|
|
|
const manifest = (name: string) => decodeManifest(readFileSync(join(manifestsDir, `${name}.manifest`)));
|
|
|
|
|
const single = manifest("single");
|
|
|
|
|
|
|
|
|
|
const cases: Record<string, () => Promise<Uint8Array>> = {
|
|
|
|
|
"honest-multi": () => fetchVerifiedContent(endpoints.honest, manifest("multi")),
|
|
|
|
|
"honest-single": () => fetchVerifiedContent(endpoints.honest, single),
|
|
|
|
|
"honest-empty": () => fetchVerifiedContent(endpoints.honest, manifest("empty")),
|
2026-10-19 20:45:35 +02:00
|
|
|
"honest-escape": () => fetchVerifiedContent(endpoints.honest, manifest("escape")),
|
2026-10-19 19:45:10 +02:00
|
|
|
"honest-single-chunk": () => fetchVerifiedChunk(endpoints.honest, single.chunks[0]!.chunkHash!, single.chunks[0]!.sizeBytes),
|
|
|
|
|
"tampered-multi": () => fetchVerifiedContent(endpoints.tampered, manifest("multi")),
|
|
|
|
|
"corrupt-single": () => fetchVerifiedContent(endpoints.corrupt, single),
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
for (const [name, run] of Object.entries(cases)) {
|
|
|
|
|
if (only && only !== name) continue;
|
|
|
|
|
try {
|
|
|
|
|
console.log(JSON.stringify({ case: name, ok: true, sha256: createHash("sha256").update(await run()).digest("hex") }));
|
|
|
|
|
} catch (error) {
|
|
|
|
|
const e = error as CultMeshContentError;
|
|
|
|
|
console.log(JSON.stringify({ case: name, ok: false, code: e.code, status: e.status }));
|
|
|
|
|
}
|
|
|
|
|
}
|