cesr
Version:
[](https://www.npmjs.com/package/cesr) [](https://github.com/lenkan/cesr-js/blob/main/LICENSE) [ • 1.79 kB
JavaScript
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,
});
}
}