cesr-ts 0.3.0 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -1
- package/esm/src/annotate/annotator.js +4 -7
- package/esm/src/annotate/comments.js +1 -1
- package/esm/src/annotate/render.js +66 -75
- package/esm/src/core/bytes.js +47 -0
- package/esm/src/core/cbor.js +122 -0
- package/esm/src/core/errors.js +13 -0
- package/esm/src/core/parser-attachment-collector.js +1 -2
- package/esm/src/core/parser-engine.js +7 -7
- package/esm/src/core/parser-frame-parser.js +14 -20
- package/esm/src/index.js +59 -33
- package/esm/src/parser/attachment-parser.js +1 -1
- package/esm/src/parser/group-dispatch.js +27 -41
- package/esm/src/primitives/aggor.js +74 -31
- package/esm/src/primitives/bexter.js +60 -16
- package/esm/src/primitives/blinder.js +27 -20
- package/esm/src/primitives/cigar.js +25 -15
- package/esm/src/primitives/cipher.js +18 -0
- package/esm/src/primitives/codex.js +74 -0
- package/esm/src/primitives/compactor.js +1 -7
- package/esm/src/primitives/counter.js +203 -13
- package/esm/src/primitives/dater.js +31 -16
- package/esm/src/primitives/decimer.js +65 -0
- package/esm/src/primitives/decrypter.js +18 -0
- package/esm/src/primitives/diger.js +24 -18
- package/esm/src/primitives/encrypter.js +19 -0
- package/esm/src/primitives/ilker.js +24 -12
- package/esm/src/primitives/indexer.js +199 -7
- package/esm/src/primitives/labeler.js +74 -24
- package/esm/src/primitives/mapper.js +14 -35
- package/esm/src/primitives/matter.js +160 -6
- package/esm/src/primitives/mediar.js +27 -18
- package/esm/src/primitives/noncer.js +33 -15
- package/esm/src/primitives/number.js +28 -27
- package/esm/src/primitives/pather.js +30 -18
- package/esm/src/primitives/prefixer.js +23 -20
- package/esm/src/primitives/primitive.js +9 -0
- package/esm/src/primitives/registry.js +3 -3
- package/esm/src/primitives/saider.js +24 -18
- package/esm/src/primitives/salter.js +22 -0
- package/esm/src/primitives/sealer.js +27 -32
- package/esm/src/primitives/seqner.js +28 -19
- package/esm/src/primitives/siger.js +29 -0
- package/esm/src/primitives/signer.js +23 -0
- package/esm/src/primitives/structor.js +104 -0
- package/esm/src/primitives/tagger.js +44 -0
- package/esm/src/primitives/texter.js +24 -15
- package/esm/src/primitives/tholder.js +27 -24
- package/esm/src/primitives/traitor.js +23 -16
- package/esm/src/primitives/unknown.js +89 -0
- package/esm/src/primitives/verfer.js +25 -25
- package/esm/src/primitives/verser.js +54 -23
- package/esm/src/serder/serder.js +190 -10
- package/esm/src/serder/serdery.js +2 -2
- package/esm/src/tables/codex-utils.js +9 -0
- package/esm/src/tables/counter-codex.js +1 -1
- package/esm/src/tables/counter-groups.js +46 -0
- package/esm/src/tables/counter-version-registry.js +1 -1
- package/esm/src/tables/indexer.codex.generated.js +64 -0
- package/esm/src/tables/indexer.tables.generated.js +72 -0
- package/esm/src/tables/matter.codex.generated.js +399 -0
- package/esm/src/tables/matter.tables.generated.js +112 -0
- package/esm/src/tables/trait.codex.generated.js +10 -0
- package/esm/src/version.js +2 -2
- package/package.json +1 -1
- package/types/src/adapters/async-iterable.d.ts +1 -1
- package/types/src/adapters/async-iterable.d.ts.map +1 -1
- package/types/src/adapters/effection.d.ts +1 -1
- package/types/src/adapters/effection.d.ts.map +1 -1
- package/types/src/annotate/annotator.d.ts.map +1 -1
- package/types/src/annotate/comments.d.ts.map +1 -1
- package/types/src/annotate/render.d.ts.map +1 -1
- package/types/src/bench/parser-benchmark.d.ts.map +1 -1
- package/types/src/core/bytes.d.ts +22 -0
- package/types/src/core/bytes.d.ts.map +1 -1
- package/types/src/core/cbor.d.ts +30 -0
- package/types/src/core/cbor.d.ts.map +1 -0
- package/types/src/core/errors.d.ts +13 -0
- package/types/src/core/errors.d.ts.map +1 -1
- package/types/src/core/parser-attachment-collector.d.ts.map +1 -1
- package/types/src/core/parser-engine.d.ts +1 -1
- package/types/src/core/parser-engine.d.ts.map +1 -1
- package/types/src/core/parser-frame-parser.d.ts +1 -1
- package/types/src/core/parser-frame-parser.d.ts.map +1 -1
- package/types/src/core/types.d.ts +7 -36
- package/types/src/core/types.d.ts.map +1 -1
- package/types/src/index.d.ts +59 -33
- package/types/src/index.d.ts.map +1 -1
- package/types/src/parser/attachment-fallback-policy.d.ts.map +1 -1
- package/types/src/parser/attachment-parser.d.ts.map +1 -1
- package/types/src/parser/group-dispatch.d.ts +2 -2
- package/types/src/parser/group-dispatch.d.ts.map +1 -1
- package/types/src/primitives/aggor.d.ts +34 -8
- package/types/src/primitives/aggor.d.ts.map +1 -1
- package/types/src/primitives/bexter.d.ts +28 -6
- package/types/src/primitives/bexter.d.ts.map +1 -1
- package/types/src/primitives/blinder.d.ts +16 -8
- package/types/src/primitives/blinder.d.ts.map +1 -1
- package/types/src/primitives/cigar.d.ts +12 -7
- package/types/src/primitives/cigar.d.ts.map +1 -1
- package/types/src/primitives/cipher.d.ts +11 -0
- package/types/src/primitives/cipher.d.ts.map +1 -0
- package/types/src/primitives/codex.d.ts +54 -0
- package/types/src/primitives/codex.d.ts.map +1 -0
- package/types/src/primitives/compactor.d.ts.map +1 -1
- package/types/src/primitives/counter.d.ts +63 -2
- package/types/src/primitives/counter.d.ts.map +1 -1
- package/types/src/primitives/dater.d.ts +12 -7
- package/types/src/primitives/dater.d.ts.map +1 -1
- package/types/src/primitives/decimer.d.ts +23 -0
- package/types/src/primitives/decimer.d.ts.map +1 -0
- package/types/src/primitives/decrypter.d.ts +11 -0
- package/types/src/primitives/decrypter.d.ts.map +1 -0
- package/types/src/primitives/diger.d.ts +16 -7
- package/types/src/primitives/diger.d.ts.map +1 -1
- package/types/src/primitives/encrypter.d.ts +12 -0
- package/types/src/primitives/encrypter.d.ts.map +1 -0
- package/types/src/primitives/ilker.d.ts +13 -6
- package/types/src/primitives/ilker.d.ts.map +1 -1
- package/types/src/primitives/indexer.d.ts +52 -1
- package/types/src/primitives/indexer.d.ts.map +1 -1
- package/types/src/primitives/labeler.d.ts +28 -11
- package/types/src/primitives/labeler.d.ts.map +1 -1
- package/types/src/primitives/mapper.d.ts +4 -6
- package/types/src/primitives/mapper.d.ts.map +1 -1
- package/types/src/primitives/matter.d.ts +44 -1
- package/types/src/primitives/matter.d.ts.map +1 -1
- package/types/src/primitives/mediar.d.ts +16 -8
- package/types/src/primitives/mediar.d.ts.map +1 -1
- package/types/src/primitives/noncer.d.ts +20 -6
- package/types/src/primitives/noncer.d.ts.map +1 -1
- package/types/src/primitives/number.d.ts +12 -7
- package/types/src/primitives/number.d.ts.map +1 -1
- package/types/src/primitives/pather.d.ts +12 -6
- package/types/src/primitives/pather.d.ts.map +1 -1
- package/types/src/primitives/prefixer.d.ts +12 -6
- package/types/src/primitives/prefixer.d.ts.map +1 -1
- package/types/src/primitives/primitive.d.ts +25 -0
- package/types/src/primitives/primitive.d.ts.map +1 -0
- package/types/src/primitives/registry.d.ts.map +1 -1
- package/types/src/primitives/saider.d.ts +12 -7
- package/types/src/primitives/saider.d.ts.map +1 -1
- package/types/src/primitives/salter.d.ts +13 -0
- package/types/src/primitives/salter.d.ts.map +1 -0
- package/types/src/primitives/sealer.d.ts +16 -8
- package/types/src/primitives/sealer.d.ts.map +1 -1
- package/types/src/primitives/seqner.d.ts +12 -7
- package/types/src/primitives/seqner.d.ts.map +1 -1
- package/types/src/primitives/siger.d.ts +16 -0
- package/types/src/primitives/siger.d.ts.map +1 -0
- package/types/src/primitives/signer.d.ts +14 -0
- package/types/src/primitives/signer.d.ts.map +1 -0
- package/types/src/primitives/structor.d.ts +44 -0
- package/types/src/primitives/structor.d.ts.map +1 -0
- package/types/src/primitives/tagger.d.ts +17 -0
- package/types/src/primitives/tagger.d.ts.map +1 -0
- package/types/src/primitives/texter.d.ts +11 -6
- package/types/src/primitives/texter.d.ts.map +1 -1
- package/types/src/primitives/tholder.d.ts +11 -6
- package/types/src/primitives/tholder.d.ts.map +1 -1
- package/types/src/primitives/traitor.d.ts +13 -6
- package/types/src/primitives/traitor.d.ts.map +1 -1
- package/types/src/primitives/unknown.d.ts +31 -0
- package/types/src/primitives/unknown.d.ts.map +1 -0
- package/types/src/primitives/verfer.d.ts +12 -7
- package/types/src/primitives/verfer.d.ts.map +1 -1
- package/types/src/primitives/verser.d.ts +18 -8
- package/types/src/primitives/verser.d.ts.map +1 -1
- package/types/src/serder/serder.d.ts +69 -3
- package/types/src/serder/serder.d.ts.map +1 -1
- package/types/src/serder/serdery.d.ts.map +1 -1
- package/types/src/tables/codex-utils.d.ts +4 -0
- package/types/src/tables/codex-utils.d.ts.map +1 -0
- package/types/src/tables/counter-codex.d.ts.map +1 -1
- package/types/src/tables/counter-groups.d.ts +8 -0
- package/types/src/tables/counter-groups.d.ts.map +1 -0
- package/types/src/tables/indexer.codex.generated.d.ts +127 -0
- package/types/src/tables/indexer.codex.generated.d.ts.map +1 -0
- package/types/src/tables/indexer.tables.generated.d.ts +46 -0
- package/types/src/tables/indexer.tables.generated.d.ts.map +1 -0
- package/types/src/tables/matter.codex.generated.d.ts +797 -0
- package/types/src/tables/matter.codex.generated.d.ts.map +1 -0
- package/types/src/tables/matter.tables.generated.d.ts +112 -0
- package/types/src/tables/matter.tables.generated.d.ts.map +1 -1
- package/types/src/tables/table-types.d.ts +7 -0
- package/types/src/tables/table-types.d.ts.map +1 -1
- package/types/src/tables/trait.codex.generated.d.ts +19 -0
- package/types/src/tables/trait.codex.generated.d.ts.map +1 -0
- package/types/src/version.d.ts +2 -2
- package/esm/src/tables/indexer.tables.js +0 -30
- package/types/src/tables/indexer.tables.d.ts +0 -12
- package/types/src/tables/indexer.tables.d.ts.map +0 -1
|
@@ -1,21 +1,30 @@
|
|
|
1
1
|
import { UnknownCodeError } from "../core/errors.js";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
2
|
+
import { MEDIAR_CODES } from "../tables/counter-groups.js";
|
|
3
|
+
import { parseStructor, Structor } from "./structor.js";
|
|
4
|
+
/** True when counter code belongs to typed-media tuple families. */
|
|
5
|
+
export function isMediarCode(code) {
|
|
6
|
+
return MEDIAR_CODES.has(code);
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Typed-media structor primitive.
|
|
10
|
+
*
|
|
11
|
+
* KERIpy substance: `Mediar` materializes media metadata/value tuple groups
|
|
12
|
+
* used in blinded media attachments and related CESR payload envelopes.
|
|
13
|
+
*/
|
|
14
|
+
export class Mediar extends Structor {
|
|
15
|
+
constructor(init) {
|
|
16
|
+
const structor = init instanceof Structor ? init : new Structor(init);
|
|
17
|
+
super(structor);
|
|
18
|
+
if (!isMediarCode(this.code)) {
|
|
19
|
+
throw new UnknownCodeError(`Expected mediar group code, got ${this.code}`);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
/** Hydrate a `Mediar` from an already parsed counter-group node. */
|
|
23
|
+
static fromGroup(group, sourceDomain = "txt") {
|
|
24
|
+
return new Mediar({ group, sourceDomain });
|
|
12
25
|
}
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
items: parsed.group.items,
|
|
18
|
-
raw: parsed.group.raw,
|
|
19
|
-
consumed: parsed.consumed,
|
|
20
|
-
};
|
|
26
|
+
}
|
|
27
|
+
/** Parse and validate typed-media attachment groups. */
|
|
28
|
+
export function parseMediar(input, version, cold) {
|
|
29
|
+
return new Mediar(parseStructor(input, version, cold, MEDIAR_CODES, "mediar"));
|
|
21
30
|
}
|
|
@@ -1,18 +1,36 @@
|
|
|
1
1
|
import { UnknownCodeError } from "../core/errors.js";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
2
|
+
import { NONCE_CODES, NonceDex } from "./codex.js";
|
|
3
|
+
import { Diger } from "./diger.js";
|
|
4
|
+
import { Matter, parseMatter } from "./matter.js";
|
|
5
|
+
/**
|
|
6
|
+
* Nonce primitive for UUID/salt-or-digest nonce representations.
|
|
7
|
+
*
|
|
8
|
+
* KERIpy semantics: `Noncer` subclasses `Diger` with relaxed digest-code
|
|
9
|
+
* enforcement and validates membership in `NonceCodex` (including `Empty`).
|
|
10
|
+
*/
|
|
11
|
+
export class Noncer extends Diger {
|
|
12
|
+
constructor(init) {
|
|
13
|
+
const matter = init instanceof Matter ? init : new Matter(init);
|
|
14
|
+
super(matter, { strict: false });
|
|
15
|
+
if (!NONCE_CODES.has(this.code)) {
|
|
16
|
+
throw new UnknownCodeError(`Expected nonce code, got ${this.code}`);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Roundtrippable nonce text.
|
|
21
|
+
*
|
|
22
|
+
* Mirrors KERIpy behavior: empty nonce is represented as empty string when
|
|
23
|
+
* code is `Empty`; otherwise returns qualified qb64 nonce token.
|
|
24
|
+
*/
|
|
25
|
+
get nonce() {
|
|
26
|
+
return this.code === NonceDex.Empty ? "" : this.qb64;
|
|
27
|
+
}
|
|
28
|
+
/** Binary companion to `.nonce` with empty-bytes behavior for `Empty` code. */
|
|
29
|
+
get nonceb() {
|
|
30
|
+
return this.code === NonceDex.Empty ? new Uint8Array() : this.qb64b;
|
|
10
31
|
}
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
fullSize: matter.fullSize,
|
|
16
|
-
fullSizeB2: matter.fullSizeB2,
|
|
17
|
-
};
|
|
32
|
+
}
|
|
33
|
+
/** Parse and hydrate `Noncer` from txt/qb2 bytes. */
|
|
34
|
+
export function parseNoncer(input, cold) {
|
|
35
|
+
return new Noncer(parseMatter(input, cold));
|
|
18
36
|
}
|
|
@@ -1,31 +1,32 @@
|
|
|
1
1
|
import { UnknownCodeError } from "../core/errors.js";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
2
|
+
import { NUMBER_CODES } from "./codex.js";
|
|
3
|
+
import { Matter, parseMatter } from "./matter.js";
|
|
4
|
+
/**
|
|
5
|
+
* Ordinal number primitive.
|
|
6
|
+
*
|
|
7
|
+
* KERIpy substance: `Number` encodes non-negative integer values using compact
|
|
8
|
+
* numeric codex families while preserving deterministic serialization.
|
|
9
|
+
*/
|
|
10
|
+
export class NumberPrimitive extends Matter {
|
|
11
|
+
constructor(init) {
|
|
12
|
+
const matter = init instanceof Matter ? init : new Matter(init);
|
|
13
|
+
super(matter);
|
|
14
|
+
if (!NUMBER_CODES.has(this.code)) {
|
|
15
|
+
throw new UnknownCodeError(`Expected number code, got ${this.code}`);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
get num() {
|
|
19
|
+
let value = 0n;
|
|
20
|
+
for (const b of this.raw) {
|
|
21
|
+
value = (value << 8n) | BigInt(b);
|
|
22
|
+
}
|
|
23
|
+
return value;
|
|
18
24
|
}
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
num = (num << 8n) | BigInt(b);
|
|
25
|
+
get numh() {
|
|
26
|
+
return this.num.toString(16);
|
|
22
27
|
}
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
numh: num.toString(16),
|
|
28
|
-
fullSize: matter.fullSize,
|
|
29
|
-
fullSizeB2: matter.fullSizeB2,
|
|
30
|
-
};
|
|
28
|
+
}
|
|
29
|
+
/** Parse and hydrate `NumberPrimitive` from txt/qb2 bytes. */
|
|
30
|
+
export function parseNumber(input, cold) {
|
|
31
|
+
return new NumberPrimitive(parseMatter(input, cold));
|
|
31
32
|
}
|
|
@@ -1,23 +1,35 @@
|
|
|
1
|
+
import { t } from "../core/bytes.js";
|
|
1
2
|
import { UnknownCodeError } from "../core/errors.js";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
3
|
+
import { Bexter } from "./bexter.js";
|
|
4
|
+
import { BEXTER_CODES, TEXTER_CODES } from "./codex.js";
|
|
5
|
+
import { Matter, parseMatter } from "./matter.js";
|
|
4
6
|
function isPatherCode(code) {
|
|
5
|
-
|
|
6
|
-
return name.startsWith("StrB64_") || name.startsWith("StrB64_Big_") ||
|
|
7
|
-
name.startsWith("Bytes_") || name.startsWith("Bytes_Big_");
|
|
7
|
+
return BEXTER_CODES.has(code) || TEXTER_CODES.has(code);
|
|
8
8
|
}
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
9
|
+
/**
|
|
10
|
+
* CESR path primitive for SAD traversal routes.
|
|
11
|
+
*
|
|
12
|
+
* KERIpy semantics: path strings may be compactly encoded via StrB64 family
|
|
13
|
+
* (`-` separators, optional `--` escape prefix) or carried as raw bytes.
|
|
14
|
+
*/
|
|
15
|
+
export class Pather extends Matter {
|
|
16
|
+
constructor(init) {
|
|
17
|
+
const matter = init instanceof Matter ? init : new Matter(init);
|
|
18
|
+
super(matter);
|
|
19
|
+
if (!isPatherCode(this.code)) {
|
|
20
|
+
throw new UnknownCodeError(`Expected pather-compatible code, got ${this.code}`);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
/** Decoded `/`-separated path form regardless of underlying CESR code family. */
|
|
24
|
+
get path() {
|
|
25
|
+
if (BEXTER_CODES.has(this.code)) {
|
|
26
|
+
const bext = Bexter.derawify(this.raw, this.code).replace(/^--/, "");
|
|
27
|
+
return bext.split("-").join("/");
|
|
28
|
+
}
|
|
29
|
+
return t(this.raw);
|
|
13
30
|
}
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
qb64: matter.qb64,
|
|
19
|
-
path,
|
|
20
|
-
fullSize: matter.fullSize,
|
|
21
|
-
fullSizeB2: matter.fullSizeB2,
|
|
22
|
-
};
|
|
31
|
+
}
|
|
32
|
+
/** Parse and hydrate a `Pather` from txt/qb2 bytes. */
|
|
33
|
+
export function parsePather(input, cold) {
|
|
34
|
+
return new Pather(parseMatter(input, cold));
|
|
23
35
|
}
|
|
@@ -1,23 +1,26 @@
|
|
|
1
1
|
import { UnknownCodeError } from "../core/errors.js";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
2
|
+
import { PREFIX_CODES } from "./codex.js";
|
|
3
|
+
import { Matter, parseMatter } from "./matter.js";
|
|
4
|
+
/**
|
|
5
|
+
* Identifier-prefix primitive.
|
|
6
|
+
*
|
|
7
|
+
* KERIpy substance: `Prefixer` represents AID prefix material and accepts the
|
|
8
|
+
* full KERI prefix derivation codex (`PreDex`), including transferable and
|
|
9
|
+
* self-addressing derivation families.
|
|
10
|
+
*/
|
|
11
|
+
export class Prefixer extends Matter {
|
|
12
|
+
constructor(init) {
|
|
13
|
+
const matter = init instanceof Matter ? init : new Matter(init);
|
|
14
|
+
super(matter);
|
|
15
|
+
if (!PREFIX_CODES.has(this.code)) {
|
|
16
|
+
throw new UnknownCodeError(`Expected prefix code, got ${this.code}`);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
get prefix() {
|
|
20
|
+
return this.qb64;
|
|
15
21
|
}
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
fullSize: matter.fullSize,
|
|
21
|
-
fullSizeB2: matter.fullSizeB2,
|
|
22
|
-
};
|
|
22
|
+
}
|
|
23
|
+
/** Parse and hydrate `Prefixer` from txt/qb2 bytes. */
|
|
24
|
+
export function parsePrefixer(input, cold) {
|
|
25
|
+
return new Prefixer(parseMatter(input, cold));
|
|
23
26
|
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/** Runtime guard for tuple-shaped group entries. */
|
|
2
|
+
export function isPrimitiveTuple(entry) {
|
|
3
|
+
return Array.isArray(entry);
|
|
4
|
+
}
|
|
5
|
+
/** Runtime guard for parsed counter-group nodes in recursive payload graphs. */
|
|
6
|
+
export function isCounterGroupLike(entry) {
|
|
7
|
+
return typeof entry === "object" && entry !== null && !Array.isArray(entry)
|
|
8
|
+
&& "items" in entry && "count" in entry && "code" in entry;
|
|
9
|
+
}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { parseMatterFromText } from "./matter.js";
|
|
2
1
|
import { MATTER_CODE_NAMES } from "../tables/matter.tables.generated.js";
|
|
2
|
+
import { parseMatterFromText } from "./matter.js";
|
|
3
3
|
export function parsePrimitiveFromText(input) {
|
|
4
4
|
const matter = parseMatterFromText(input);
|
|
5
|
-
const name = MATTER_CODE_NAMES[matter.code]
|
|
6
|
-
"UnknownPrimitive";
|
|
5
|
+
const name = MATTER_CODE_NAMES[matter.code]
|
|
6
|
+
?? "UnknownPrimitive";
|
|
7
7
|
return {
|
|
8
8
|
code: matter.code,
|
|
9
9
|
name,
|
|
@@ -1,22 +1,28 @@
|
|
|
1
1
|
import { UnknownCodeError } from "../core/errors.js";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
2
|
+
import { DIGEST_CODES } from "./codex.js";
|
|
3
|
+
import { Matter, parseMatter } from "./matter.js";
|
|
4
|
+
/**
|
|
5
|
+
* Self-addressing identifier digest primitive.
|
|
6
|
+
*
|
|
7
|
+
* KERIpy substance: `Saider` is digest-qualified material used as SAD SAID
|
|
8
|
+
* values; this class validates digest-family code semantics.
|
|
9
|
+
*/
|
|
10
|
+
export class Saider extends Matter {
|
|
11
|
+
constructor(init) {
|
|
12
|
+
const matter = init instanceof Matter ? init : new Matter(init);
|
|
13
|
+
super(matter);
|
|
14
|
+
if (!DIGEST_CODES.has(this.code)) {
|
|
15
|
+
throw new UnknownCodeError(`Expected said digest code, got ${this.code}`);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
get said() {
|
|
19
|
+
return this.qb64;
|
|
20
|
+
}
|
|
21
|
+
get digest() {
|
|
22
|
+
return this.raw;
|
|
23
|
+
}
|
|
7
24
|
}
|
|
25
|
+
/** Parse and hydrate `Saider` from txt/qb2 bytes. */
|
|
8
26
|
export function parseSaider(input, cold) {
|
|
9
|
-
|
|
10
|
-
const name = MATTER_CODE_NAMES[matter.code] ?? "";
|
|
11
|
-
if (!isDigestName(name)) {
|
|
12
|
-
throw new UnknownCodeError(`Expected said digest code, got ${matter.code}`);
|
|
13
|
-
}
|
|
14
|
-
return {
|
|
15
|
-
code: matter.code,
|
|
16
|
-
qb64: matter.qb64,
|
|
17
|
-
said: matter.qb64,
|
|
18
|
-
digest: matter.raw,
|
|
19
|
-
fullSize: matter.fullSize,
|
|
20
|
-
fullSizeB2: matter.fullSizeB2,
|
|
21
|
-
};
|
|
27
|
+
return new Saider(parseMatter(input, cold));
|
|
22
28
|
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { UnknownCodeError } from "../core/errors.js";
|
|
2
|
+
import { SALTER_CODES } from "./codex.js";
|
|
3
|
+
import { Matter } from "./matter.js";
|
|
4
|
+
/**
|
|
5
|
+
* Salt primitive for deterministic secret/signer derivation workflows.
|
|
6
|
+
*
|
|
7
|
+
* KERIpy substance: Salter stores random or fixed salt bytes and is used as
|
|
8
|
+
* input to deterministic signer/seed generation paths.
|
|
9
|
+
*/
|
|
10
|
+
export class Salter extends Matter {
|
|
11
|
+
constructor(init) {
|
|
12
|
+
const matter = init instanceof Matter ? init : new Matter(init);
|
|
13
|
+
super(matter);
|
|
14
|
+
if (!SALTER_CODES.has(this.code)) {
|
|
15
|
+
throw new UnknownCodeError(`Expected salt code, got ${this.code}`);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
/** Raw salt bytes used by key-derivation consumers. */
|
|
19
|
+
get salt() {
|
|
20
|
+
return this.raw;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
@@ -1,35 +1,30 @@
|
|
|
1
1
|
import { UnknownCodeError } from "../core/errors.js";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
throw new UnknownCodeError(`Expected sealer group code, got ${parsed.group.code}`);
|
|
2
|
+
import { SEALER_CODES } from "../tables/counter-groups.js";
|
|
3
|
+
import { parseStructor, Structor } from "./structor.js";
|
|
4
|
+
/** True when counter code belongs to KERI seal source/digest families. */
|
|
5
|
+
export function isSealerCode(code) {
|
|
6
|
+
return SEALER_CODES.has(code);
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Seal-group structor primitive.
|
|
10
|
+
*
|
|
11
|
+
* KERIpy substance: `Sealer` materializes counted seal tuple groups used for
|
|
12
|
+
* anchoring, seal-source references, and registrar-binding payloads.
|
|
13
|
+
*/
|
|
14
|
+
export class Sealer extends Structor {
|
|
15
|
+
constructor(init) {
|
|
16
|
+
const structor = init instanceof Structor ? init : new Structor(init);
|
|
17
|
+
super(structor);
|
|
18
|
+
if (!isSealerCode(this.code)) {
|
|
19
|
+
throw new UnknownCodeError(`Expected sealer group code, got ${this.code}`);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
/** Hydrate a `Sealer` from an already parsed counter-group node. */
|
|
23
|
+
static fromGroup(group, sourceDomain = "txt") {
|
|
24
|
+
return new Sealer({ group, sourceDomain });
|
|
26
25
|
}
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
items: parsed.group.items,
|
|
32
|
-
raw: parsed.group.raw,
|
|
33
|
-
consumed: parsed.consumed,
|
|
34
|
-
};
|
|
26
|
+
}
|
|
27
|
+
/** Parse and validate seal attachment groups across v1/v2 seal families. */
|
|
28
|
+
export function parseSealer(input, version, cold) {
|
|
29
|
+
return new Sealer(parseStructor(input, version, cold, SEALER_CODES, "sealer"));
|
|
35
30
|
}
|
|
@@ -1,23 +1,32 @@
|
|
|
1
1
|
import { UnknownCodeError } from "../core/errors.js";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
2
|
+
import { SEQNER_CODES } from "./codex.js";
|
|
3
|
+
import { Matter, parseMatter } from "./matter.js";
|
|
4
|
+
/**
|
|
5
|
+
* Fixed-width sequence/ordinal primitive.
|
|
6
|
+
*
|
|
7
|
+
* KERIpy substance: `Seqner` forces fixed-size ordinal serialization (Salt_128
|
|
8
|
+
* family) for lexicographically stable ordering in key-value namespaces.
|
|
9
|
+
*/
|
|
10
|
+
export class Seqner extends Matter {
|
|
11
|
+
constructor(init) {
|
|
12
|
+
const matter = init instanceof Matter ? init : new Matter(init);
|
|
13
|
+
super(matter);
|
|
14
|
+
if (!SEQNER_CODES.has(this.code)) {
|
|
15
|
+
throw new UnknownCodeError(`Expected seqner Salt_128 code, got ${this.code}`);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
get sn() {
|
|
19
|
+
let sn = 0n;
|
|
20
|
+
for (const b of this.raw) {
|
|
21
|
+
sn = (sn << 8n) | BigInt(b);
|
|
22
|
+
}
|
|
23
|
+
return sn;
|
|
9
24
|
}
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
sn = (sn << 8n) | BigInt(b);
|
|
25
|
+
get snh() {
|
|
26
|
+
return this.sn.toString(16).padStart(this.raw.length * 2, "0");
|
|
13
27
|
}
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
sn,
|
|
19
|
-
snh,
|
|
20
|
-
fullSize: matter.fullSize,
|
|
21
|
-
fullSizeB2: matter.fullSizeB2,
|
|
22
|
-
};
|
|
28
|
+
}
|
|
29
|
+
/** Parse and hydrate `Seqner` from txt/qb2 bytes. */
|
|
30
|
+
export function parseSeqner(input, cold) {
|
|
31
|
+
return new Seqner(parseMatter(input, cold));
|
|
23
32
|
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { UnknownCodeError } from "../core/errors.js";
|
|
2
|
+
import { SIGER_CODES } from "./codex.js";
|
|
3
|
+
import { Indexer, parseIndexer } from "./indexer.js";
|
|
4
|
+
/**
|
|
5
|
+
* Indexed signature primitive with optional verifier association.
|
|
6
|
+
*
|
|
7
|
+
* KERIpy substance: `Siger` extends indexed signature material and carries
|
|
8
|
+
* optional `verfer` linkage so verification context can travel with signature.
|
|
9
|
+
*/
|
|
10
|
+
export class Siger extends Indexer {
|
|
11
|
+
constructor(init, verfer) {
|
|
12
|
+
const indexer = init instanceof Indexer ? init : new Indexer(init);
|
|
13
|
+
super(indexer);
|
|
14
|
+
Object.defineProperty(this, "verfer", {
|
|
15
|
+
enumerable: true,
|
|
16
|
+
configurable: true,
|
|
17
|
+
writable: true,
|
|
18
|
+
value: void 0
|
|
19
|
+
});
|
|
20
|
+
if (!SIGER_CODES.has(this.code)) {
|
|
21
|
+
throw new UnknownCodeError(`Expected indexed signature code, got ${this.code}`);
|
|
22
|
+
}
|
|
23
|
+
this.verfer = verfer;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
/** Parse and hydrate `Siger` from txt or qb2 encoded bytes. */
|
|
27
|
+
export function parseSiger(input, cold) {
|
|
28
|
+
return new Siger(parseIndexer(input, cold));
|
|
29
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { UnknownCodeError } from "../core/errors.js";
|
|
2
|
+
import { SIGNER_CODES } from "./codex.js";
|
|
3
|
+
import { Matter } from "./matter.js";
|
|
4
|
+
/**
|
|
5
|
+
* Signing-seed primitive.
|
|
6
|
+
*
|
|
7
|
+
* KERIpy substance: Signer wraps private seed material that is used to derive
|
|
8
|
+
* signing key pairs and associated verifier material; this TS layer constrains
|
|
9
|
+
* codex validity while higher crypto layers perform key derivation/signing.
|
|
10
|
+
*/
|
|
11
|
+
export class Signer extends Matter {
|
|
12
|
+
constructor(init) {
|
|
13
|
+
const matter = init instanceof Matter ? init : new Matter(init);
|
|
14
|
+
super(matter);
|
|
15
|
+
if (!SIGNER_CODES.has(this.code)) {
|
|
16
|
+
throw new UnknownCodeError(`Expected signer seed code, got ${this.code}`);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
/** Raw seed bytes for signer key-derivation/instantiation. */
|
|
20
|
+
get seed() {
|
|
21
|
+
return this.raw;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { b, codeB64ToB2, encodeB64, t } from "../core/bytes.js";
|
|
2
|
+
import { UnknownCodeError } from "../core/errors.js";
|
|
3
|
+
import { parseAttachmentDispatch } from "../parser/group-dispatch.js";
|
|
4
|
+
import { CounterGroup } from "./counter.js";
|
|
5
|
+
import { isCounterGroupLike, isPrimitiveTuple } from "./primitive.js";
|
|
6
|
+
function toText(input) {
|
|
7
|
+
return t(input);
|
|
8
|
+
}
|
|
9
|
+
function serializeEntryQb64(entry) {
|
|
10
|
+
if (isPrimitiveTuple(entry)) {
|
|
11
|
+
return entry.map((item) => serializeEntryQb64(item)).join("");
|
|
12
|
+
}
|
|
13
|
+
if (isCounterGroupLike(entry)) {
|
|
14
|
+
return `${entry.qb64}${entry.items.map((item) => serializeEntryQb64(item)).join("")}`;
|
|
15
|
+
}
|
|
16
|
+
return entry.qb64;
|
|
17
|
+
}
|
|
18
|
+
function inferSerialized(group, sourceDomain) {
|
|
19
|
+
const qb64 = `${group.qb64}${group.items.map((item) => serializeEntryQb64(item)).join("")}`;
|
|
20
|
+
return sourceDomain === "txt" ? b(qb64) : codeB64ToB2(qb64);
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Group primitive base class for counted CESR tuple/list attachment structures.
|
|
24
|
+
*
|
|
25
|
+
* KERIpy substance: `Structor` models one counted-group unit where tuple/list
|
|
26
|
+
* members are hydrated CESR primitives and serialization remains deterministic.
|
|
27
|
+
*/
|
|
28
|
+
export class Structor extends CounterGroup {
|
|
29
|
+
constructor(init) {
|
|
30
|
+
if (init instanceof Structor) {
|
|
31
|
+
super(init, init.raw, init.items);
|
|
32
|
+
this.sourceDomain = init.sourceDomain;
|
|
33
|
+
this.serialized = init.serialized.slice();
|
|
34
|
+
this.consumed = init.consumed;
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
const group = init.group;
|
|
38
|
+
super(group, group.raw, group.items);
|
|
39
|
+
Object.defineProperty(this, "sourceDomain", {
|
|
40
|
+
enumerable: true,
|
|
41
|
+
configurable: true,
|
|
42
|
+
writable: true,
|
|
43
|
+
value: void 0
|
|
44
|
+
});
|
|
45
|
+
Object.defineProperty(this, "consumed", {
|
|
46
|
+
enumerable: true,
|
|
47
|
+
configurable: true,
|
|
48
|
+
writable: true,
|
|
49
|
+
value: void 0
|
|
50
|
+
});
|
|
51
|
+
Object.defineProperty(this, "serialized", {
|
|
52
|
+
enumerable: true,
|
|
53
|
+
configurable: true,
|
|
54
|
+
writable: true,
|
|
55
|
+
value: void 0
|
|
56
|
+
});
|
|
57
|
+
this.sourceDomain = init.sourceDomain ?? "txt";
|
|
58
|
+
this.serialized = init.serialized?.slice()
|
|
59
|
+
?? inferSerialized(group, this.sourceDomain);
|
|
60
|
+
this.consumed = init.consumed ?? this.serialized.length;
|
|
61
|
+
}
|
|
62
|
+
/** Semantic clan/tag alias for KERIpy parity terminology (`name` in TS). */
|
|
63
|
+
get clan() {
|
|
64
|
+
return this.name;
|
|
65
|
+
}
|
|
66
|
+
/** Fully enclosed group serialization in text domain (`counter + payload`). */
|
|
67
|
+
get qb64g() {
|
|
68
|
+
return this.sourceDomain === "txt"
|
|
69
|
+
? toText(this.serialized)
|
|
70
|
+
: encodeB64(this.serialized);
|
|
71
|
+
}
|
|
72
|
+
/** Fully enclosed group serialization in binary domain (`counter + payload`). */
|
|
73
|
+
get qb2g() {
|
|
74
|
+
return this.sourceDomain === "bny"
|
|
75
|
+
? this.serialized.slice()
|
|
76
|
+
: codeB64ToB2(this.qb64g);
|
|
77
|
+
}
|
|
78
|
+
/** Deterministic value-equivalence over full enclosed qb64 text form. */
|
|
79
|
+
equalsStructor(other) {
|
|
80
|
+
return this.qb64g === other.qb64g;
|
|
81
|
+
}
|
|
82
|
+
/** Hydrate a generic structor from an already parsed counter group. */
|
|
83
|
+
static fromGroup(group, sourceDomain = "txt") {
|
|
84
|
+
return new Structor({ group, sourceDomain });
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Parse one counted attachment group and hydrate it as `Structor`.
|
|
89
|
+
*
|
|
90
|
+
* Optional `allowedCodes` guard narrows acceptable group families for
|
|
91
|
+
* subclass parsers (`Sealer`, `Blinder`, `Mediar`, `Aggor`).
|
|
92
|
+
*/
|
|
93
|
+
export function parseStructor(input, version, cold, allowedCodes, expectedFamily = "structor") {
|
|
94
|
+
const parsed = parseAttachmentDispatch(input, version, cold);
|
|
95
|
+
if (allowedCodes && !allowedCodes.has(parsed.group.code)) {
|
|
96
|
+
throw new UnknownCodeError(`Expected ${expectedFamily} group code, got ${parsed.group.code}`);
|
|
97
|
+
}
|
|
98
|
+
return new Structor({
|
|
99
|
+
group: parsed.group,
|
|
100
|
+
sourceDomain: cold,
|
|
101
|
+
consumed: parsed.consumed,
|
|
102
|
+
serialized: input.slice(0, parsed.consumed),
|
|
103
|
+
});
|
|
104
|
+
}
|