Files
quixos-protocol/test/artifact-fixture.ts
T

52 lines
2.0 KiB
TypeScript

import { createHash } from "node:crypto";
import {
implementationDigest,
type ExecutionPlan,
type PackageArtifacts,
type ArtifactImplementation,
} from "../src/execution-world/index.js";
export const buildArtifactFixture = (plan: ExecutionPlan, revision = plan.definition.packages[0]!.revision) => {
const expected = plan.definition.packages.find((pkg) => pkg.revision === revision)!;
const bytes = new TextEncoder().encode("export const handlers = Object.freeze({});\n");
const implementation = (
id: string,
target: string,
compatibility: ArtifactImplementation["compatibility"],
): ArtifactImplementation => {
const path = compatibility === "quixos-service-v1" ? "bin/service" : `portable/${target}/module.mjs`;
const value = {
id,
target,
compatibility,
path,
ports: "quixos-transaction-ports-v1" as const,
...(compatibility === "quixos-js-module-v1" ? { registryExport: "handlers" } : {}),
exports: expected.exports
.filter((e) => target === "server" || (e.execution.kind !== "remote" && e.execution.targets.includes(target)))
.map((e) => e.id),
files: [
{
path,
digest: createHash("sha256").update(bytes).digest("hex"),
bytes: bytes.length,
mediaType: compatibility === "quixos-service-v1" ? "application/octet-stream" : "text/javascript",
},
],
};
return { ...value, contentDigest: implementationDigest(value) };
};
const manifest: PackageArtifacts = {
schemaVersion: 1,
packageRevisionId: expected.revision,
bindingDigest: expected.bindingDigest,
sourceDigest: expected.sourceDigest,
versions: plan.definition.versions,
implementations: [
implementation("service", "server", "quixos-service-v1"),
implementation("server", "server", "quixos-js-module-v1"),
implementation("browser", "browser", "quixos-js-module-v1"),
],
};
return { manifest, bytes, read: async () => bytes };
};