Files
rea/src/domain/functionComparison.ts
T

55 lines
2.1 KiB
TypeScript

import { canonicalJson } from "./comparisonSemantics.js";
import { compareUnicodeCodePoints } from "./unicodeCodePointOrder.js";
import {
functionSnapshotCoordinateContext,
type FunctionSnapshot,
} from "./functionDossierEvidence.js";
import { functionMatch } from "./functionComparisonNormalization.js";
import {
functionComparisonResultSchema,
type FunctionComparisonResult,
} from "./functionComparisonSchemas.js";
import { overallStatus, summarize } from "./functionComparisonResults.js";
import { compareDimensions } from "./functionComparisonDimensions.js";
/** Compare two authenticated function snapshots without fuzzy matching. */
export const compareFunctions = (
left: FunctionSnapshot,
right: FunctionSnapshot,
): FunctionComparisonResult => {
const links = [left.evidence.evidence_id, right.evidence.evidence_id];
const providersDiffer =
canonicalJson(left.evidence.provider, "Function comparison") !==
canonicalJson(right.evidence.provider, "Function comparison");
const coordinateContext = functionSnapshotCoordinateContext(left, right);
const match = functionMatch(left, right, coordinateContext);
const dimensions = compareDimensions(left, right, {
links,
providersDiffer,
sameIdentity:
match.method === "same-entry" || match.method === "same-evidence",
coordinateContext,
});
const changes = dimensions.filter(({ status }) => status !== "unchanged");
return functionComparisonResultSchema.parse({
status: overallStatus(dimensions, match.status),
function_match: match,
left_subject_sha256: left.subject.digest.sha256,
right_subject_sha256: right.subject.digest.sha256,
summary: summarize(dimensions),
dimensions,
changes,
limitations: [
...new Set([
...left.limitations.map((item) => `Left: ${item}`),
...right.limitations.map((item) => `Right: ${item}`),
...(providersDiffer
? [
"Provider-specific pseudocode and assembly representations were not equated.",
]
: []),
]),
].sort((a, b) => compareUnicodeCodePoints(a, b)),
});
};