UNPKG

@baqhub/sdk

Version:

The official JavaScript SDK for the BAQ federated app platform.

51 lines (50 loc) 1.6 kB
import { Canonicalization } from "../../helpers/canonicalization.js"; import { Hash } from "../../helpers/hash.js"; function canonicalize(object, level, propertyName) { // Primitive type. if (object === null || typeof object !== "object") { return object; } // Array. if (Array.isArray(object)) { return object.map(o => canonicalize(o, level + 1)); } const mapProperties = (keys) => { return Object.fromEntries(keys.map(k => [k, canonicalize(object[k], level + 1, k)])); }; // Top level object: record. if (level === 0) { return mapProperties([ "author", "id", "created_at", "version", "permissions", "type", "content", "no_content", ]); } // 2nd level object: version. if (level === 1 && propertyName === "version") { return mapProperties(["author", "created_at", "parent_hash"]); } // Link. if ("original_entity" in object && "entity" in object) { return { ...mapProperties(Object.keys(object)), original_entity: undefined, entity: object.original_entity, }; } return mapProperties(Object.keys(object)); } function ofRecord(model, record) { const encodedRecord = model.encode(record); const canonicalRecord = canonicalize(encodedRecord, 0); const canonicalRecordJson = Canonicalization.canonicalize(canonicalRecord); return Hash.hash(canonicalRecordJson); } export const RecordVersionHash = { ofRecord, };