signify-ts
Version:
Signing at the edge for KERI, ACDC, and KERIA
137 lines (136 loc) • 4.67 kB
JavaScript
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;
}