UNPKG

cesr

Version:

[![NPM Version](https://img.shields.io/npm/v/cesr.svg?style=flat)](https://www.npmjs.com/package/cesr) [![NPM License](https://img.shields.io/npm/l/cesr.svg?style=flat)](https://github.com/lenkan/cesr-js/blob/main/LICENSE) [![CI](https://github.com/lenkan

66 lines (65 loc) 1.79 kB
import { decodeBase64Int, encodeBase64Int } from "./encoding-base64.js"; import { encodeBinary, encodeText, decodeText, resolveQuadletCount } from "./frame.js"; const Size = Object.freeze({ hs: 5, ss: 3, fs: 8, ls: 0, xs: 0, }); export class Genus { code; protocol; major; minor; constructor(init) { if (typeof init.major !== "number" || init.major < 0 || init.major > 63) { throw new Error(`Invalid major version: ${init.major}`); } const minor = init.minor ?? 0; if (typeof minor !== "number" || minor < 0) { throw new Error(`Invalid minor version: ${minor}`); } this.code = `-_${init.protocol}`; this.protocol = init.protocol; this.major = init.major; this.minor = init.minor ?? 0; } get size() { return Size; } get soft() { return decodeBase64Int(`${encodeBase64Int(this.major, 1)}${encodeBase64Int(this.minor, 2)}`); } get quadlets() { return resolveQuadletCount(this); } text() { return encodeText(this); } binary() { return encodeBinary(this); } static KERIACDC_10 = new Genus({ protocol: "AAA", major: 1, minor: 0, }); static KERIACDC_20 = new Genus({ protocol: "AAA", major: 2, minor: 0, }); static parse(input) { const frame = decodeText(input, Size); const genus = frame.code.slice(2); const soft = encodeBase64Int(frame.soft ?? 0, 3); const major = decodeBase64Int(soft.slice(0, 1)); const minor = decodeBase64Int(soft.slice(1, 3)); return new Genus({ protocol: genus, major, minor, }); } }