UNPKG

signify-ts

Version:

Signing at the edge for KERI, ACDC, and KERIA

137 lines (136 loc) 4.67 kB
import { Siger } from "../core/siger.js"; import { Cigar } from "../core/cigar.js"; export const FALSY = [false, 0, '?0', 'no', 'false', 'False', 'off']; export const TRUTHY = [true, 1, '?1', 'yes', 'true', 'True', 'on']; export class Signage { constructor(markers, indexed, signer, ordinal, digest, kind) { this.markers = markers; this.indexed = indexed; this.signer = signer; this.ordinal = ordinal; this.digest = digest; this.kind = kind; } } export function signature(signages) { var _a; const values = []; for (const signage of signages) { let markers; let tags; if (signage.markers instanceof Map) { markers = Array.from(signage.markers.values()); tags = Array.from(signage.markers.keys()); } else { markers = signage.markers; tags = []; } const items = new Array(); const indexed = (_a = signage.indexed) !== null && _a !== void 0 ? _a : markers[0] instanceof Siger; if (indexed) { items.push('indexed="?1"'); } else { items.push('indexed="?0"'); } if (signage.signer != undefined) { items.push(`signer="${signage.signer}"`); } if (signage.ordinal != undefined) { items.push(`ordinal="${signage.ordinal}"`); } if (signage.digest != undefined) { items.push(`digest="${signage.digest}"`); } if (signage.kind != undefined) { items.push(`kind="${signage.kind}"`); } items.push(...markers.map((marker, idx) => { let tag = undefined; let val; if (tags != undefined && tags.length > idx) { tag = tags[idx]; } if (marker instanceof Siger) { if (!indexed) { throw new Error(`Indexed signature marker ${marker} when indexed False.`); } tag = tag !== null && tag !== void 0 ? tag : marker.index.toString(); val = marker.qb64; } else if (marker instanceof Cigar) { if (indexed) { throw new Error(`Unindexed signature marker ${marker} when indexed True.`); } if (!marker.verfer) { throw new Error(`Indexed signature marker is missing verfer`); } tag = tag !== null && tag !== void 0 ? tag : marker.verfer.qb64; val = marker.qb64; } else { tag = tag !== null && tag !== void 0 ? tag : idx.toString(); val = marker; } return `${tag}="${val}"`; })); values.push(items.join(';')); } return new Headers([['Signature', values.join(',')]]); } export function designature(value) { const values = value.replace(' ', '').split(','); const signages = values.map((val) => { const dict = new Map(); val.split(';').forEach((v) => { const splits = v.split('=', 2); dict.set(splits[0], splits[1].replaceAll('"', '')); }); if (!dict.has('indexed')) { throw new Error('Missing indexed field in Signature header signage.'); } const item = dict.get('indexed'); const indexed = !FALSY.includes(item); dict.delete('indexed'); let signer; if (dict.has('signer')) { signer = dict.get('signer'); dict.delete('signer'); } let ordinal; if (dict.has('ordinal')) { ordinal = dict.get('ordinal'); dict.delete('ordinal'); } let digest; if (dict.has('digest')) { digest = dict.get('digest'); dict.delete('digest'); } let kind; if (dict.has('kind')) { kind = dict.get('kind'); dict.delete('kind'); } else { kind = 'CESR'; } if (kind == 'CESR') { const markers = new Map(); for (const [key, val] of dict.entries()) { if (indexed) { markers.set(key, new Siger({ qb64: val })); } else { markers.set(key, new Cigar({ qb64: val })); } } return new Signage(markers, indexed, signer, ordinal, digest, kind); } else { return new Signage(dict, indexed, signer, ordinal, digest, kind); } }); return signages; }