UNPKG

signify-ts

Version:

Signing at the edge for KERI, ACDC, and KERIA

170 lines (143 loc) 4.96 kB
import { Counter, CtrDex } from './counter'; import { Seqner } from './seqner'; import { Prefixer } from './prefixer'; import { Saider } from './saider'; import { Serder } from './serder'; import { b } from './core'; export function pad(n: any, width = 3, z = 0) { return (String(z).repeat(width) + String(n)).slice(String(n).length); } /** * @description Returns list of depth first recursively extracted values from elements of key event dict ked whose flabels are in lables list * @param {*} ked ked is key event dict * @param {*} labels labels is list of element labels in ked from which to extract values */ export function extractValues(ked: any, labels: any) { let values = []; for (const label of labels) { values = extractElementValues(ked[label], values); } return values; } export function arrayEquals(ar1: Uint8Array, ar2: Uint8Array) { return ( ar1.length === ar2.length && ar1.every((val, index) => val === ar2[index]) ); } /** * @description Recusive depth first search that recursively extracts value(s) from element and appends to values list Assumes that extracted values are str * @param {*} element * @param {*} values */ function extractElementValues(element: any, values: any) { let data = []; try { if (element instanceof Array && !(typeof element == 'string')) { for (const k in element) extractElementValues(element[k], values); } else if (typeof element == 'string') { values.push(element); } data = values; } catch (error) { throw new Error(error as string); } return data; } /** * @description Returns True if obj is non-string iterable, False otherwise * @param {*} obj */ // function nonStringIterable(obj) { // obj instanceof (String) // return instanceof(obj, (str, bytes)) && instanceof(obj, Iterable)) // } export function nowUTC(): Date { return new Date(); } export function range(start: number, stop: number, step: number) { if (typeof stop == 'undefined') { // one param defined stop = start; start = 0; } if (typeof step == 'undefined') { step = 1; } if ((step > 0 && start >= stop) || (step < 0 && start <= stop)) { return []; } const result = new Array<number>(); for (let i: number = start; step > 0 ? i < stop : i > stop; i += step) { result.push(i); } return result; } export function intToBytes(value: number, length: number): Uint8Array { const byteArray = new Uint8Array(length); // Assuming a 4-byte integer (32 bits) for (let index = byteArray.length - 1; index >= 0; index--) { const byte = value & 0xff; byteArray[index] = byte; value = (value - byte) / 256; } return byteArray; } export function bytesToInt(ar: Uint8Array): number { let value = 0; for (let i = 0; i < ar.length; i++) { value = value * 256 + ar[i]; } return value; } export function serializeACDCAttachment(anc: Serder): Uint8Array { const prefixer = new Prefixer({ qb64: anc.pre }); const seqner = new Seqner({ sn: anc.sn }); const saider = new Saider({ qb64: anc.ked['d'] }); const craw = new Uint8Array(); const ctr = new Counter({ code: CtrDex.SealSourceTriples, count: 1 }).qb64b; const prefix = prefixer.qb64b; const seq = seqner.qb64b; const said = saider.qb64b; const newCraw = new Uint8Array( craw.length + ctr.length + prefix.length + seq.length + said.length ); newCraw.set(craw); newCraw.set(ctr, craw.length); newCraw.set(prefix, craw.length + ctr.length); newCraw.set(seq, craw.length + ctr.length + prefix.length); newCraw.set(said, craw.length + ctr.length + prefix.length + seq.length); return newCraw; } export function serializeIssExnAttachment(anc: Serder): Uint8Array { const seqner = new Seqner({ sn: anc.sn }); const ancSaider = new Saider({ qb64: anc.ked['d'] }); const coupleArray = new Uint8Array( seqner.qb64b.length + ancSaider.qb64b.length ); coupleArray.set(seqner.qb64b); coupleArray.set(ancSaider.qb64b, seqner.qb64b.length); const counter = new Counter({ code: CtrDex.SealSourceCouples, count: 1, }); const counterQb64b = counter.qb64b; const atc = new Uint8Array(counter.qb64b.length + coupleArray.length); atc.set(counterQb64b); atc.set(coupleArray, counterQb64b.length); if (atc.length % 4 !== 0) { throw new Error( `Invalid attachments size: ${atc.length}, non-integral quadlets detected.` ); } const pcnt = new Counter({ code: CtrDex.AttachedMaterialQuadlets, count: Math.floor(atc.length / 4), }); const msg = new Uint8Array(pcnt.qb64b.length + atc.length); msg.set(pcnt.qb64b); msg.set(atc, pcnt.qb64b.length); return msg; }