CultLib/packages/cultmesh-browser/test/interop/content-https-reader.ts
Meta Vens 11218b8889 C4 fix: parity fixtures carry a recordKey with every Uri.EscapeDataString special character
A fourth fixture (escape) has a chunk recordKey of k!'()* <e-acute>%41+~. The provider's honest mount answers that one key as the canonical key
after logging the raw URL, so both consumers fetch the bytes and the log holds what each actually sent. The orchestrator asserts the C# and TS
URLs are identical and equal the RFC 3986 escaping. Deleting the reader's !'() * escape now fails test:interop.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 20:45:35 +02:00

32 lines
1.9 KiB
TypeScript

// 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";
import { decodeManifest } from "cultnet-ts/content";
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")),
"honest-escape": () => fetchVerifiedContent(endpoints.honest, manifest("escape")),
"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 }));
}
}