Something went wrong. Try again.
A local-first event pipeline for independent agents, built on Jazz.
Something went wrong. Try again.
1.2 kB · 37 lines
TypeScript
1234567891011121314151617181920212223242526272829303132333435363738import { createHash } from "node:crypto";
export type JsonPrimitive = string | number | boolean | null;export type JsonValue = JsonPrimitive | JsonValue[] | { [key: string]: JsonValue };export type JsonObject = { [key: string]: JsonValue };
export function canonicalJson(value: JsonValue): string { return JSON.stringify(sortValue(value));}
export function sha256(value: string | Buffer): string { return createHash("sha256").update(value).digest("hex");}
export function hashJson(value: JsonValue): string { return sha256(canonicalJson(value));}
export function parseJsonObject(value: string): JsonObject { const parsed: unknown = JSON.parse(value); if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) { throw new Error("Expected a JSON object"); } return parsed as JsonObject;}
function sortValue(value: JsonValue): JsonValue { if (Array.isArray(value)) return value.map(sortValue); if (value && typeof value === "object") { return Object.fromEntries( Object.entries(value) .sort(([left], [right]) => left.localeCompare(right)) .map(([key, child]) => [key, sortValue(child)]), ); } return value;}