cesr-ts 0.1.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/LICENSE +202 -0
- package/README.md +32 -0
- package/esm/_dnt.polyfills.js +127 -0
- package/esm/mod.js +2 -0
- package/esm/package.json +3 -0
- package/esm/src/adapters/async-iterable.js +17 -0
- package/esm/src/adapters/effection.js +9 -0
- package/esm/src/annotate/annotator.js +36 -0
- package/esm/src/annotate/cli-node.js +53 -0
- package/esm/src/annotate/cli.js +89 -0
- package/esm/src/annotate/comments.js +43 -0
- package/esm/src/annotate/denot.js +17 -0
- package/esm/src/annotate/render.js +246 -0
- package/esm/src/annotate/types.js +1 -0
- package/esm/src/core/bytes.js +70 -0
- package/esm/src/core/errors.js +45 -0
- package/esm/src/core/parser-engine.js +589 -0
- package/esm/src/core/types.js +1 -0
- package/esm/src/index.js +46 -0
- package/esm/src/parser/attachment-parser.js +4 -0
- package/esm/src/parser/cold-start.js +17 -0
- package/esm/src/parser/group-dispatch.js +420 -0
- package/esm/src/primitives/aggor.js +41 -0
- package/esm/src/primitives/bexter.js +20 -0
- package/esm/src/primitives/blinder.js +23 -0
- package/esm/src/primitives/cigar.js +18 -0
- package/esm/src/primitives/compactor.js +16 -0
- package/esm/src/primitives/counter.js +100 -0
- package/esm/src/primitives/dater.js +22 -0
- package/esm/src/primitives/diger.js +22 -0
- package/esm/src/primitives/ilker.js +15 -0
- package/esm/src/primitives/indexer.js +84 -0
- package/esm/src/primitives/labeler.js +31 -0
- package/esm/src/primitives/mapper.js +158 -0
- package/esm/src/primitives/matter.js +109 -0
- package/esm/src/primitives/mediar.js +21 -0
- package/esm/src/primitives/noncer.js +18 -0
- package/esm/src/primitives/number.js +31 -0
- package/esm/src/primitives/pather.js +23 -0
- package/esm/src/primitives/prefixer.js +23 -0
- package/esm/src/primitives/registry.js +17 -0
- package/esm/src/primitives/saider.js +22 -0
- package/esm/src/primitives/sealer.js +35 -0
- package/esm/src/primitives/seqner.js +23 -0
- package/esm/src/primitives/texter.js +20 -0
- package/esm/src/primitives/tholder.js +27 -0
- package/esm/src/primitives/traitor.js +20 -0
- package/esm/src/primitives/verfer.js +28 -0
- package/esm/src/primitives/verser.js +30 -0
- package/esm/src/router/router-stub.js +17 -0
- package/esm/src/serder/serder.js +22 -0
- package/esm/src/serder/serdery.js +12 -0
- package/esm/src/serder/smell.js +56 -0
- package/esm/src/tables/counter-codex.js +10 -0
- package/esm/src/tables/counter.tables.generated.js +178 -0
- package/esm/src/tables/indexer.tables.js +30 -0
- package/esm/src/tables/matter.tables.generated.js +238 -0
- package/esm/src/tables/table-types.js +1 -0
- package/esm/src/tables/versions.js +12 -0
- package/package.json +52 -0
- package/types/_dnt.polyfills.d.ts +101 -0
- package/types/_dnt.polyfills.d.ts.map +1 -0
- package/types/mod.d.ts +3 -0
- package/types/mod.d.ts.map +1 -0
- package/types/src/adapters/async-iterable.d.ts +4 -0
- package/types/src/adapters/async-iterable.d.ts.map +1 -0
- package/types/src/adapters/effection.d.ts +8 -0
- package/types/src/adapters/effection.d.ts.map +1 -0
- package/types/src/annotate/annotator.d.ts +4 -0
- package/types/src/annotate/annotator.d.ts.map +1 -0
- package/types/src/annotate/cli-node.d.ts +2 -0
- package/types/src/annotate/cli-node.d.ts.map +1 -0
- package/types/src/annotate/cli.d.ts +10 -0
- package/types/src/annotate/cli.d.ts.map +1 -0
- package/types/src/annotate/comments.d.ts +6 -0
- package/types/src/annotate/comments.d.ts.map +1 -0
- package/types/src/annotate/denot.d.ts +2 -0
- package/types/src/annotate/denot.d.ts.map +1 -0
- package/types/src/annotate/render.d.ts +5 -0
- package/types/src/annotate/render.d.ts.map +1 -0
- package/types/src/annotate/types.d.ts +15 -0
- package/types/src/annotate/types.d.ts.map +1 -0
- package/types/src/core/bytes.d.ts +12 -0
- package/types/src/core/bytes.d.ts.map +1 -0
- package/types/src/core/errors.d.ts +21 -0
- package/types/src/core/errors.d.ts.map +1 -0
- package/types/src/core/parser-engine.d.ts +58 -0
- package/types/src/core/parser-engine.d.ts.map +1 -0
- package/types/src/core/types.d.ts +52 -0
- package/types/src/core/types.d.ts.map +1 -0
- package/types/src/index.d.ts +47 -0
- package/types/src/index.d.ts.map +1 -0
- package/types/src/parser/attachment-parser.d.ts +8 -0
- package/types/src/parser/attachment-parser.d.ts.map +1 -0
- package/types/src/parser/cold-start.d.ts +3 -0
- package/types/src/parser/cold-start.d.ts.map +1 -0
- package/types/src/parser/group-dispatch.d.ts +29 -0
- package/types/src/parser/group-dispatch.d.ts.map +1 -0
- package/types/src/primitives/aggor.d.ts +13 -0
- package/types/src/primitives/aggor.d.ts.map +1 -0
- package/types/src/primitives/bexter.d.ts +10 -0
- package/types/src/primitives/bexter.d.ts.map +1 -0
- package/types/src/primitives/blinder.d.ts +12 -0
- package/types/src/primitives/blinder.d.ts.map +1 -0
- package/types/src/primitives/cigar.d.ts +11 -0
- package/types/src/primitives/cigar.d.ts.map +1 -0
- package/types/src/primitives/compactor.d.ts +5 -0
- package/types/src/primitives/compactor.d.ts.map +1 -0
- package/types/src/primitives/counter.d.ts +14 -0
- package/types/src/primitives/counter.d.ts.map +1 -0
- package/types/src/primitives/dater.d.ts +11 -0
- package/types/src/primitives/dater.d.ts.map +1 -0
- package/types/src/primitives/diger.d.ts +11 -0
- package/types/src/primitives/diger.d.ts.map +1 -0
- package/types/src/primitives/ilker.d.ts +10 -0
- package/types/src/primitives/ilker.d.ts.map +1 -0
- package/types/src/primitives/indexer.d.ts +12 -0
- package/types/src/primitives/indexer.d.ts.map +1 -0
- package/types/src/primitives/labeler.d.ts +15 -0
- package/types/src/primitives/labeler.d.ts.map +1 -0
- package/types/src/primitives/mapper.d.ts +28 -0
- package/types/src/primitives/mapper.d.ts.map +1 -0
- package/types/src/primitives/matter.d.ts +12 -0
- package/types/src/primitives/matter.d.ts.map +1 -0
- package/types/src/primitives/mediar.d.ts +12 -0
- package/types/src/primitives/mediar.d.ts.map +1 -0
- package/types/src/primitives/noncer.d.ts +10 -0
- package/types/src/primitives/noncer.d.ts.map +1 -0
- package/types/src/primitives/number.d.ts +11 -0
- package/types/src/primitives/number.d.ts.map +1 -0
- package/types/src/primitives/pather.d.ts +10 -0
- package/types/src/primitives/pather.d.ts.map +1 -0
- package/types/src/primitives/prefixer.d.ts +10 -0
- package/types/src/primitives/prefixer.d.ts.map +1 -0
- package/types/src/primitives/registry.d.ts +10 -0
- package/types/src/primitives/registry.d.ts.map +1 -0
- package/types/src/primitives/saider.d.ts +11 -0
- package/types/src/primitives/saider.d.ts.map +1 -0
- package/types/src/primitives/sealer.d.ts +12 -0
- package/types/src/primitives/sealer.d.ts.map +1 -0
- package/types/src/primitives/seqner.d.ts +11 -0
- package/types/src/primitives/seqner.d.ts.map +1 -0
- package/types/src/primitives/texter.d.ts +10 -0
- package/types/src/primitives/texter.d.ts.map +1 -0
- package/types/src/primitives/tholder.d.ts +10 -0
- package/types/src/primitives/tholder.d.ts.map +1 -0
- package/types/src/primitives/traitor.d.ts +10 -0
- package/types/src/primitives/traitor.d.ts.map +1 -0
- package/types/src/primitives/verfer.d.ts +11 -0
- package/types/src/primitives/verfer.d.ts.map +1 -0
- package/types/src/primitives/verser.d.ts +14 -0
- package/types/src/primitives/verser.d.ts.map +1 -0
- package/types/src/router/router-stub.d.ts +11 -0
- package/types/src/router/router-stub.d.ts.map +1 -0
- package/types/src/serder/serder.d.ts +4 -0
- package/types/src/serder/serder.d.ts.map +1 -0
- package/types/src/serder/serdery.d.ts +6 -0
- package/types/src/serder/serdery.d.ts.map +1 -0
- package/types/src/serder/smell.d.ts +7 -0
- package/types/src/serder/smell.d.ts.map +1 -0
- package/types/src/tables/counter-codex.d.ts +6 -0
- package/types/src/tables/counter-codex.d.ts.map +1 -0
- package/types/src/tables/counter.tables.generated.d.ts +92 -0
- package/types/src/tables/counter.tables.generated.d.ts.map +1 -0
- package/types/src/tables/indexer.tables.d.ts +12 -0
- package/types/src/tables/indexer.tables.d.ts.map +1 -0
- package/types/src/tables/matter.tables.generated.d.ts +116 -0
- package/types/src/tables/matter.tables.generated.d.ts.map +1 -0
- package/types/src/tables/table-types.d.ts +19 -0
- package/types/src/tables/table-types.d.ts.map +1 -0
- package/types/src/tables/versions.d.ts +16 -0
- package/types/src/tables/versions.d.ts.map +1 -0
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { UnknownCodeError } from "../core/errors.js";
|
|
2
|
+
import { parseMatter } from "./matter.js";
|
|
3
|
+
export function parseIlker(input, cold) {
|
|
4
|
+
const matter = parseMatter(input, cold);
|
|
5
|
+
if (matter.code !== "X") {
|
|
6
|
+
throw new UnknownCodeError(`Expected ilker code X, got ${matter.code}`);
|
|
7
|
+
}
|
|
8
|
+
return {
|
|
9
|
+
code: matter.code,
|
|
10
|
+
qb64: matter.qb64,
|
|
11
|
+
fullSize: matter.fullSize,
|
|
12
|
+
fullSizeB2: matter.fullSizeB2,
|
|
13
|
+
ilk: matter.qb64.slice(matter.code.length),
|
|
14
|
+
};
|
|
15
|
+
}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { b64ToInt, codeB2ToB64, codeB64ToB2, decodeB64, nabSextets, sceil, } from "../core/bytes.js";
|
|
2
|
+
import { DeserializeError, ShortageError, UnknownCodeError, } from "../core/errors.js";
|
|
3
|
+
import { INDEXER_HARDS, INDEXER_SIZES } from "../tables/indexer.tables.js";
|
|
4
|
+
const INDEXER_BARDS = new Map([...INDEXER_HARDS.entries()].map(([code, hs]) => [
|
|
5
|
+
String.fromCharCode(codeB64ToB2(code)[0]),
|
|
6
|
+
hs,
|
|
7
|
+
]));
|
|
8
|
+
function parseIndexerCodeFromText(txt) {
|
|
9
|
+
const hs = INDEXER_HARDS.get(txt[0]);
|
|
10
|
+
if (!hs) {
|
|
11
|
+
throw new UnknownCodeError(`Unknown indexer hard selector ${txt[0]}`);
|
|
12
|
+
}
|
|
13
|
+
const code = txt.slice(0, hs);
|
|
14
|
+
if (!INDEXER_SIZES.has(code)) {
|
|
15
|
+
throw new UnknownCodeError(`Unknown indexer code ${code}`);
|
|
16
|
+
}
|
|
17
|
+
return { code };
|
|
18
|
+
}
|
|
19
|
+
export function parseIndexerFromText(input) {
|
|
20
|
+
const txt = String.fromCharCode(...input);
|
|
21
|
+
if (txt.length === 0) {
|
|
22
|
+
throw new DeserializeError("Empty indexer input");
|
|
23
|
+
}
|
|
24
|
+
const { code } = parseIndexerCodeFromText(txt);
|
|
25
|
+
const sizage = INDEXER_SIZES.get(code);
|
|
26
|
+
const cs = sizage.hs + sizage.ss;
|
|
27
|
+
const soft = txt.slice(sizage.hs, cs);
|
|
28
|
+
const fullSize = sizage.fs ?? (cs + b64ToInt(soft) * 4);
|
|
29
|
+
if (txt.length < fullSize) {
|
|
30
|
+
throw new ShortageError(fullSize, txt.length);
|
|
31
|
+
}
|
|
32
|
+
const raw = decodeB64(txt.slice(cs, fullSize)).slice(sizage.ls);
|
|
33
|
+
return {
|
|
34
|
+
code,
|
|
35
|
+
raw,
|
|
36
|
+
qb64: txt.slice(0, fullSize),
|
|
37
|
+
fullSize,
|
|
38
|
+
fullSizeB2: sceil((fullSize * 3) / 4),
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
export function parseIndexerFromBinary(input) {
|
|
42
|
+
if (input.length === 0) {
|
|
43
|
+
throw new ShortageError(1, 0);
|
|
44
|
+
}
|
|
45
|
+
const first = nabSextets(input, 1);
|
|
46
|
+
const hs = INDEXER_BARDS.get(String.fromCharCode(first[0]));
|
|
47
|
+
if (!hs) {
|
|
48
|
+
throw new UnknownCodeError(`Unsupported qb2 indexer start sextet=0x${first[0].toString(16)}`);
|
|
49
|
+
}
|
|
50
|
+
const bhs = sceil((hs * 3) / 4);
|
|
51
|
+
if (input.length < bhs) {
|
|
52
|
+
throw new ShortageError(bhs, input.length);
|
|
53
|
+
}
|
|
54
|
+
const hard = codeB2ToB64(input, hs);
|
|
55
|
+
const sizage = INDEXER_SIZES.get(hard);
|
|
56
|
+
if (!sizage) {
|
|
57
|
+
throw new UnknownCodeError(`Unknown indexer code ${hard}`);
|
|
58
|
+
}
|
|
59
|
+
const cs = sizage.hs + sizage.ss;
|
|
60
|
+
const bcs = sceil((cs * 3) / 4);
|
|
61
|
+
if (input.length < bcs) {
|
|
62
|
+
throw new ShortageError(bcs, input.length);
|
|
63
|
+
}
|
|
64
|
+
const qb64cs = codeB2ToB64(input, cs);
|
|
65
|
+
const soft = qb64cs.slice(sizage.hs, cs);
|
|
66
|
+
const fs = sizage.fs ?? ((b64ToInt(soft) * 4) + cs);
|
|
67
|
+
const bfs = sceil((fs * 3) / 4);
|
|
68
|
+
if (input.length < bfs) {
|
|
69
|
+
throw new ShortageError(bfs, input.length);
|
|
70
|
+
}
|
|
71
|
+
const qb2 = input.slice(0, bfs);
|
|
72
|
+
const qb64 = codeB2ToB64(qb2, fs);
|
|
73
|
+
const raw = decodeB64(qb64.slice(cs)).slice(sizage.ls);
|
|
74
|
+
return {
|
|
75
|
+
code: hard,
|
|
76
|
+
raw,
|
|
77
|
+
qb64,
|
|
78
|
+
fullSize: fs,
|
|
79
|
+
fullSizeB2: bfs,
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
export function parseIndexer(input, cold) {
|
|
83
|
+
return cold === "bny" ? parseIndexerFromBinary(input) : parseIndexerFromText(input);
|
|
84
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { UnknownCodeError } from "../core/errors.js";
|
|
2
|
+
import { parseMatter } from "./matter.js";
|
|
3
|
+
const TEXT_DECODER = new TextDecoder();
|
|
4
|
+
const LABELER_CODES = new Set(["V", "W"]);
|
|
5
|
+
export function isLabelerCode(code) {
|
|
6
|
+
return LABELER_CODES.has(code);
|
|
7
|
+
}
|
|
8
|
+
/** Parse a V/W label primitive into decoded map-label metadata. */
|
|
9
|
+
export function parseLabeler(input, cold) {
|
|
10
|
+
// Labelers are fixed-size matter primitives used as map field keys.
|
|
11
|
+
const matter = parseMatter(input, cold);
|
|
12
|
+
if (!isLabelerCode(matter.code)) {
|
|
13
|
+
throw new UnknownCodeError(`Expected labeler code (V/W), got ${matter.code}`);
|
|
14
|
+
}
|
|
15
|
+
let index = 0;
|
|
16
|
+
for (const b of matter.raw) {
|
|
17
|
+
index = (index << 8) | b;
|
|
18
|
+
}
|
|
19
|
+
const text = TEXT_DECODER.decode(matter.raw).replace(/\u0000/g, "");
|
|
20
|
+
const label = text.length > 0 ? text : matter.qb64.slice(matter.code.length);
|
|
21
|
+
return {
|
|
22
|
+
code: matter.code,
|
|
23
|
+
qb64: matter.qb64,
|
|
24
|
+
fullSize: matter.fullSize,
|
|
25
|
+
fullSizeB2: matter.fullSizeB2,
|
|
26
|
+
token: matter.qb64,
|
|
27
|
+
label,
|
|
28
|
+
index,
|
|
29
|
+
bytes: matter.raw,
|
|
30
|
+
};
|
|
31
|
+
}
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
import { encodeB64 } from "../core/bytes.js";
|
|
2
|
+
import { DeserializeError, ShortageError, UnknownCodeError, } from "../core/errors.js";
|
|
3
|
+
import { parseAttachmentDispatch } from "../parser/group-dispatch.js";
|
|
4
|
+
import { CtrDexV2 } from "../tables/counter-codex.js";
|
|
5
|
+
import { parseCounter } from "./counter.js";
|
|
6
|
+
import { parseLabeler } from "./labeler.js";
|
|
7
|
+
import { parseMatter } from "./matter.js";
|
|
8
|
+
const MAP_GROUP_CODES = new Set([
|
|
9
|
+
CtrDexV2.MapBodyGroup,
|
|
10
|
+
CtrDexV2.BigMapBodyGroup,
|
|
11
|
+
CtrDexV2.GenericMapGroup,
|
|
12
|
+
CtrDexV2.BigGenericMapGroup,
|
|
13
|
+
]);
|
|
14
|
+
const LIST_GROUP_CODES = new Set([
|
|
15
|
+
CtrDexV2.GenericGroup,
|
|
16
|
+
CtrDexV2.BigGenericGroup,
|
|
17
|
+
CtrDexV2.GenericListGroup,
|
|
18
|
+
CtrDexV2.BigGenericListGroup,
|
|
19
|
+
]);
|
|
20
|
+
function tokenSize(token, domain) {
|
|
21
|
+
return domain === "bny" ? token.fullSizeB2 : token.fullSize;
|
|
22
|
+
}
|
|
23
|
+
function isMapGroupCode(code) {
|
|
24
|
+
return MAP_GROUP_CODES.has(code);
|
|
25
|
+
}
|
|
26
|
+
function asQb64(raw, domain) {
|
|
27
|
+
return domain === "txt" ? String.fromCharCode(...raw) : encodeB64(raw);
|
|
28
|
+
}
|
|
29
|
+
function parseCounterProbe(input, version, domain) {
|
|
30
|
+
// Probe both active and known majors so map parsing remains robust when
|
|
31
|
+
// streams mix legacy and current counters in nested structures.
|
|
32
|
+
const attempts = [
|
|
33
|
+
version,
|
|
34
|
+
{ major: 2, minor: 0 },
|
|
35
|
+
{ major: 1, minor: 0 },
|
|
36
|
+
];
|
|
37
|
+
for (const attempt of attempts) {
|
|
38
|
+
try {
|
|
39
|
+
return parseCounter(input, attempt, domain);
|
|
40
|
+
}
|
|
41
|
+
catch (error) {
|
|
42
|
+
if (error instanceof ShortageError) {
|
|
43
|
+
throw error;
|
|
44
|
+
}
|
|
45
|
+
if (error instanceof UnknownCodeError ||
|
|
46
|
+
error instanceof DeserializeError) {
|
|
47
|
+
continue;
|
|
48
|
+
}
|
|
49
|
+
throw error;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return null;
|
|
53
|
+
}
|
|
54
|
+
function parseLabelProbe(input, domain) {
|
|
55
|
+
try {
|
|
56
|
+
return parseLabeler(input, domain);
|
|
57
|
+
}
|
|
58
|
+
catch (error) {
|
|
59
|
+
if (error instanceof ShortageError) {
|
|
60
|
+
throw error;
|
|
61
|
+
}
|
|
62
|
+
if (error instanceof UnknownCodeError ||
|
|
63
|
+
error instanceof DeserializeError) {
|
|
64
|
+
return null;
|
|
65
|
+
}
|
|
66
|
+
throw error;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
function parseMapperValue(input, version, domain) {
|
|
70
|
+
const counter = parseCounterProbe(input, version, domain);
|
|
71
|
+
if (counter) {
|
|
72
|
+
const dispatch = parseAttachmentDispatch(input, version, domain);
|
|
73
|
+
const raw = input.slice(0, dispatch.consumed);
|
|
74
|
+
const field = {
|
|
75
|
+
code: dispatch.group.code,
|
|
76
|
+
qb64: asQb64(raw, domain),
|
|
77
|
+
isCounter: true,
|
|
78
|
+
};
|
|
79
|
+
if (isMapGroupCode(dispatch.group.code)) {
|
|
80
|
+
const nested = parseMapperBody(input, version, domain);
|
|
81
|
+
field.children = nested.fields;
|
|
82
|
+
}
|
|
83
|
+
return { field, consumed: dispatch.consumed };
|
|
84
|
+
}
|
|
85
|
+
const matter = parseMatter(input, domain);
|
|
86
|
+
return {
|
|
87
|
+
field: {
|
|
88
|
+
code: matter.code,
|
|
89
|
+
qb64: matter.qb64,
|
|
90
|
+
isCounter: false,
|
|
91
|
+
},
|
|
92
|
+
consumed: tokenSize(matter, domain),
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
function parseMapPayload(input, version, domain, start, end) {
|
|
96
|
+
const fields = [];
|
|
97
|
+
let offset = start;
|
|
98
|
+
let pendingLabel = null;
|
|
99
|
+
while (offset < end) {
|
|
100
|
+
const at = input.slice(offset, end);
|
|
101
|
+
const maybeLabel = parseLabelProbe(at, domain);
|
|
102
|
+
if (maybeLabel) {
|
|
103
|
+
pendingLabel = maybeLabel.label;
|
|
104
|
+
offset += tokenSize(maybeLabel, domain);
|
|
105
|
+
continue;
|
|
106
|
+
}
|
|
107
|
+
const { field, consumed } = parseMapperValue(at, version, domain);
|
|
108
|
+
fields.push({
|
|
109
|
+
label: pendingLabel,
|
|
110
|
+
code: field.code,
|
|
111
|
+
qb64: field.qb64,
|
|
112
|
+
isCounter: field.isCounter,
|
|
113
|
+
children: field.children,
|
|
114
|
+
});
|
|
115
|
+
pendingLabel = null;
|
|
116
|
+
offset += consumed;
|
|
117
|
+
}
|
|
118
|
+
if (offset !== end) {
|
|
119
|
+
throw new ShortageError(end, offset);
|
|
120
|
+
}
|
|
121
|
+
if (pendingLabel !== null) {
|
|
122
|
+
throw new UnknownCodeError("Dangling map label without value");
|
|
123
|
+
}
|
|
124
|
+
return fields;
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Parse map-style native bodies/counters into labeled semantic fields.
|
|
128
|
+
* Parsing is strict: payload boundaries and label/value pairing must be exact.
|
|
129
|
+
*/
|
|
130
|
+
export function parseMapperBody(input, version, domain) {
|
|
131
|
+
// Mapper is intentionally strict: payload boundaries must be exact and
|
|
132
|
+
// labels cannot be left dangling without a value.
|
|
133
|
+
const counter = parseCounter(input, version, domain);
|
|
134
|
+
if (!isMapGroupCode(counter.code)) {
|
|
135
|
+
throw new UnknownCodeError(`Expected map-body/group counter, got ${counter.code}`);
|
|
136
|
+
}
|
|
137
|
+
const unit = domain === "bny" ? 3 : 4;
|
|
138
|
+
const header = tokenSize(counter, domain);
|
|
139
|
+
const payload = counter.count * unit;
|
|
140
|
+
const total = header + payload;
|
|
141
|
+
if (input.length < total) {
|
|
142
|
+
throw new ShortageError(total, input.length);
|
|
143
|
+
}
|
|
144
|
+
const fields = parseMapPayload(input, version, domain, header, total);
|
|
145
|
+
return {
|
|
146
|
+
code: counter.code,
|
|
147
|
+
count: counter.count,
|
|
148
|
+
fullSize: counter.fullSize,
|
|
149
|
+
fullSizeB2: counter.fullSizeB2,
|
|
150
|
+
totalSize: domain === "txt" ? total : Math.ceil(total * 4 / 3),
|
|
151
|
+
totalSizeB2: domain === "bny" ? total : Math.ceil(total * 3 / 4),
|
|
152
|
+
fields,
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
/** True for counter codes that represent map/list-native aggregate primitives. */
|
|
156
|
+
export function isMapperCounterCode(code) {
|
|
157
|
+
return MAP_GROUP_CODES.has(code) || LIST_GROUP_CODES.has(code);
|
|
158
|
+
}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { b64ToInt, codeB2ToB64, codeB64ToB2, decodeB64, nabSextets, sceil, } from "../core/bytes.js";
|
|
2
|
+
import { DeserializeError, ShortageError, UnknownCodeError, } from "../core/errors.js";
|
|
3
|
+
import { MATTER_HARDS, MATTER_SIZES, } from "../tables/matter.tables.generated.js";
|
|
4
|
+
const MATTER_BARDS = new Map([...MATTER_HARDS.entries()].map(([code, hs]) => [
|
|
5
|
+
String.fromCharCode(codeB64ToB2(code)[0]),
|
|
6
|
+
hs,
|
|
7
|
+
]));
|
|
8
|
+
function parseMatterCodeFromText(txt) {
|
|
9
|
+
const hs = MATTER_HARDS.get(txt[0]);
|
|
10
|
+
if (!hs) {
|
|
11
|
+
throw new UnknownCodeError(`Unknown matter hard selector ${txt[0]}`);
|
|
12
|
+
}
|
|
13
|
+
let code = txt.slice(0, hs);
|
|
14
|
+
let sizage = MATTER_SIZES.get(code);
|
|
15
|
+
if (!sizage && hs < txt.length) {
|
|
16
|
+
const fallback = txt.slice(0, Math.min(4, txt.length));
|
|
17
|
+
sizage = MATTER_SIZES.get(fallback);
|
|
18
|
+
if (sizage)
|
|
19
|
+
code = fallback;
|
|
20
|
+
}
|
|
21
|
+
if (!sizage) {
|
|
22
|
+
throw new UnknownCodeError(`Unknown matter code ${code}`);
|
|
23
|
+
}
|
|
24
|
+
return { code, hs: sizage.hs };
|
|
25
|
+
}
|
|
26
|
+
export function parseMatterFromText(input) {
|
|
27
|
+
const txt = String.fromCharCode(...input);
|
|
28
|
+
if (txt.length === 0) {
|
|
29
|
+
throw new DeserializeError("Empty matter input");
|
|
30
|
+
}
|
|
31
|
+
const { code } = parseMatterCodeFromText(txt);
|
|
32
|
+
const sizage = MATTER_SIZES.get(code);
|
|
33
|
+
const cs = sizage.hs + sizage.ss;
|
|
34
|
+
const soft = sizage.ss > 0 ? txt.slice(sizage.hs, cs).slice(sizage.xs) : "";
|
|
35
|
+
const fullSize = sizage.fs ?? (cs + b64ToInt(soft) * 4);
|
|
36
|
+
if (txt.length < fullSize) {
|
|
37
|
+
throw new ShortageError(fullSize, txt.length);
|
|
38
|
+
}
|
|
39
|
+
const ps = cs % 4;
|
|
40
|
+
const body = txt.slice(cs, fullSize);
|
|
41
|
+
const paw = decodeB64("A".repeat(ps) + body);
|
|
42
|
+
const raw = paw.slice(ps + sizage.ls);
|
|
43
|
+
return {
|
|
44
|
+
code,
|
|
45
|
+
raw,
|
|
46
|
+
qb64: txt.slice(0, fullSize),
|
|
47
|
+
fullSize,
|
|
48
|
+
fullSizeB2: sceil((fullSize * 3) / 4),
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
export function parseMatterFromBinary(input) {
|
|
52
|
+
if (input.length === 0) {
|
|
53
|
+
throw new ShortageError(1, 0);
|
|
54
|
+
}
|
|
55
|
+
const first = nabSextets(input, 1);
|
|
56
|
+
const hs = MATTER_BARDS.get(String.fromCharCode(first[0]));
|
|
57
|
+
if (!hs) {
|
|
58
|
+
throw new UnknownCodeError(`Unsupported qb2 code start sextet=0x${first[0].toString(16)}`);
|
|
59
|
+
}
|
|
60
|
+
const bhs = sceil((hs * 3) / 4);
|
|
61
|
+
if (input.length < bhs) {
|
|
62
|
+
throw new ShortageError(bhs, input.length);
|
|
63
|
+
}
|
|
64
|
+
const hard = codeB2ToB64(input, hs);
|
|
65
|
+
const sizage = MATTER_SIZES.get(hard);
|
|
66
|
+
if (!sizage) {
|
|
67
|
+
throw new UnknownCodeError(`Unknown matter code ${hard}`);
|
|
68
|
+
}
|
|
69
|
+
const cs = sizage.hs + sizage.ss;
|
|
70
|
+
const bcs = sceil((cs * 3) / 4);
|
|
71
|
+
if (input.length < bcs) {
|
|
72
|
+
throw new ShortageError(bcs, input.length);
|
|
73
|
+
}
|
|
74
|
+
const both = codeB2ToB64(input, cs);
|
|
75
|
+
const softWithXtra = both.slice(sizage.hs, sizage.hs + sizage.ss);
|
|
76
|
+
const xtra = softWithXtra.slice(0, sizage.xs);
|
|
77
|
+
if (xtra !== "_".repeat(sizage.xs)) {
|
|
78
|
+
throw new UnknownCodeError(`Invalid prepad xtra=${xtra}`);
|
|
79
|
+
}
|
|
80
|
+
const soft = softWithXtra.slice(sizage.xs);
|
|
81
|
+
const fs = sizage.fs ?? ((b64ToInt(soft) * 4) + cs);
|
|
82
|
+
const bfs = sceil((fs * 3) / 4);
|
|
83
|
+
if (input.length < bfs) {
|
|
84
|
+
throw new ShortageError(bfs, input.length);
|
|
85
|
+
}
|
|
86
|
+
const qb2 = input.slice(0, bfs);
|
|
87
|
+
const ps = cs % 4;
|
|
88
|
+
const pbs = 2 * ps;
|
|
89
|
+
if (pbs > 0) {
|
|
90
|
+
const pi = qb2[bcs - 1] & ((2 ** pbs) - 1);
|
|
91
|
+
if (pi !== 0) {
|
|
92
|
+
throw new DeserializeError(`Nonzero code mid pad bits=0b${pi.toString(2).padStart(pbs, "0")}`);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
const qb64 = codeB2ToB64(qb2, fs);
|
|
96
|
+
const raw = decodeB64(qb64.slice(cs)).slice(sizage.ls);
|
|
97
|
+
return {
|
|
98
|
+
code: hard,
|
|
99
|
+
raw,
|
|
100
|
+
qb64,
|
|
101
|
+
fullSize: fs,
|
|
102
|
+
fullSizeB2: bfs,
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
export function parseMatter(input, cold) {
|
|
106
|
+
return cold === "bny"
|
|
107
|
+
? parseMatterFromBinary(input)
|
|
108
|
+
: parseMatterFromText(input);
|
|
109
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { UnknownCodeError } from "../core/errors.js";
|
|
2
|
+
import { CtrDexV2 } from "../tables/counter-codex.js";
|
|
3
|
+
import { parseAttachmentDispatch } from "../parser/group-dispatch.js";
|
|
4
|
+
const MEDIAR_CODES = new Set([
|
|
5
|
+
CtrDexV2.TypedMediaQuadruples,
|
|
6
|
+
CtrDexV2.BigTypedMediaQuadruples,
|
|
7
|
+
]);
|
|
8
|
+
export function parseMediar(input, version, cold) {
|
|
9
|
+
const parsed = parseAttachmentDispatch(input, version, cold);
|
|
10
|
+
if (!MEDIAR_CODES.has(parsed.group.code)) {
|
|
11
|
+
throw new UnknownCodeError(`Expected mediar group code, got ${parsed.group.code}`);
|
|
12
|
+
}
|
|
13
|
+
return {
|
|
14
|
+
code: parsed.group.code,
|
|
15
|
+
name: parsed.group.name,
|
|
16
|
+
count: parsed.group.count,
|
|
17
|
+
items: parsed.group.items,
|
|
18
|
+
raw: parsed.group.raw,
|
|
19
|
+
consumed: parsed.consumed,
|
|
20
|
+
};
|
|
21
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { UnknownCodeError } from "../core/errors.js";
|
|
2
|
+
import { parseMatter } from "./matter.js";
|
|
3
|
+
import { MATTER_CODE_NAMES } from "../tables/matter.tables.generated.js";
|
|
4
|
+
const NONCE_CODE_NAMES = new Set(["Salt_128", "Salt_256"]);
|
|
5
|
+
export function parseNoncer(input, cold) {
|
|
6
|
+
const matter = parseMatter(input, cold);
|
|
7
|
+
const name = MATTER_CODE_NAMES[matter.code] ?? "";
|
|
8
|
+
if (!NONCE_CODE_NAMES.has(name)) {
|
|
9
|
+
throw new UnknownCodeError(`Expected nonce code, got ${matter.code}`);
|
|
10
|
+
}
|
|
11
|
+
return {
|
|
12
|
+
code: matter.code,
|
|
13
|
+
qb64: matter.qb64,
|
|
14
|
+
nonce: matter.raw,
|
|
15
|
+
fullSize: matter.fullSize,
|
|
16
|
+
fullSizeB2: matter.fullSizeB2,
|
|
17
|
+
};
|
|
18
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { UnknownCodeError } from "../core/errors.js";
|
|
2
|
+
import { parseMatter } from "./matter.js";
|
|
3
|
+
import { MATTER_CODE_NAMES } from "../tables/matter.tables.generated.js";
|
|
4
|
+
const NUMBER_CODE_NAMES = new Set([
|
|
5
|
+
"Short",
|
|
6
|
+
"Long",
|
|
7
|
+
"Big",
|
|
8
|
+
"Tall",
|
|
9
|
+
"Large",
|
|
10
|
+
"Great",
|
|
11
|
+
"Vast",
|
|
12
|
+
]);
|
|
13
|
+
export function parseNumber(input, cold) {
|
|
14
|
+
const matter = parseMatter(input, cold);
|
|
15
|
+
const name = MATTER_CODE_NAMES[matter.code];
|
|
16
|
+
if (!name || !NUMBER_CODE_NAMES.has(name)) {
|
|
17
|
+
throw new UnknownCodeError(`Expected number code, got ${matter.code}`);
|
|
18
|
+
}
|
|
19
|
+
let num = 0n;
|
|
20
|
+
for (const b of matter.raw) {
|
|
21
|
+
num = (num << 8n) | BigInt(b);
|
|
22
|
+
}
|
|
23
|
+
return {
|
|
24
|
+
code: matter.code,
|
|
25
|
+
qb64: matter.qb64,
|
|
26
|
+
num,
|
|
27
|
+
numh: num.toString(16),
|
|
28
|
+
fullSize: matter.fullSize,
|
|
29
|
+
fullSizeB2: matter.fullSizeB2,
|
|
30
|
+
};
|
|
31
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { UnknownCodeError } from "../core/errors.js";
|
|
2
|
+
import { parseMatter } from "./matter.js";
|
|
3
|
+
import { MATTER_CODE_NAMES } from "../tables/matter.tables.generated.js";
|
|
4
|
+
function isPatherCode(code) {
|
|
5
|
+
const name = MATTER_CODE_NAMES[code] ?? "";
|
|
6
|
+
return name.startsWith("StrB64_") || name.startsWith("StrB64_Big_") ||
|
|
7
|
+
name.startsWith("Bytes_") || name.startsWith("Bytes_Big_");
|
|
8
|
+
}
|
|
9
|
+
export function parsePather(input, cold) {
|
|
10
|
+
const matter = parseMatter(input, cold);
|
|
11
|
+
if (!isPatherCode(matter.code)) {
|
|
12
|
+
throw new UnknownCodeError(`Expected pather-compatible code, got ${matter.code}`);
|
|
13
|
+
}
|
|
14
|
+
// For parser-level fidelity we preserve encoded path token text.
|
|
15
|
+
const path = matter.qb64.slice(matter.code.length);
|
|
16
|
+
return {
|
|
17
|
+
code: matter.code,
|
|
18
|
+
qb64: matter.qb64,
|
|
19
|
+
path,
|
|
20
|
+
fullSize: matter.fullSize,
|
|
21
|
+
fullSizeB2: matter.fullSizeB2,
|
|
22
|
+
};
|
|
23
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { UnknownCodeError } from "../core/errors.js";
|
|
2
|
+
import { parseMatter } from "./matter.js";
|
|
3
|
+
import { MATTER_CODE_NAMES } from "../tables/matter.tables.generated.js";
|
|
4
|
+
const PREFIX_CODE_NAMES = new Set([
|
|
5
|
+
"Ed25519N",
|
|
6
|
+
"ECDSA_256k1N",
|
|
7
|
+
"ECDSA_256r1N",
|
|
8
|
+
"Ed448N",
|
|
9
|
+
]);
|
|
10
|
+
export function parsePrefixer(input, cold) {
|
|
11
|
+
const matter = parseMatter(input, cold);
|
|
12
|
+
const name = MATTER_CODE_NAMES[matter.code] ?? "";
|
|
13
|
+
if (!PREFIX_CODE_NAMES.has(name)) {
|
|
14
|
+
throw new UnknownCodeError(`Expected prefix code, got ${matter.code}`);
|
|
15
|
+
}
|
|
16
|
+
return {
|
|
17
|
+
code: matter.code,
|
|
18
|
+
qb64: matter.qb64,
|
|
19
|
+
prefix: matter.qb64,
|
|
20
|
+
fullSize: matter.fullSize,
|
|
21
|
+
fullSizeB2: matter.fullSizeB2,
|
|
22
|
+
};
|
|
23
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { parseMatterFromText } from "./matter.js";
|
|
2
|
+
import { MATTER_CODE_NAMES } from "../tables/matter.tables.generated.js";
|
|
3
|
+
export function parsePrimitiveFromText(input) {
|
|
4
|
+
const matter = parseMatterFromText(input);
|
|
5
|
+
const name = MATTER_CODE_NAMES[matter.code] ??
|
|
6
|
+
"UnknownPrimitive";
|
|
7
|
+
return {
|
|
8
|
+
code: matter.code,
|
|
9
|
+
name,
|
|
10
|
+
qb64: matter.qb64,
|
|
11
|
+
raw: matter.raw,
|
|
12
|
+
fullSize: matter.fullSize,
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
export function supportedPrimitiveCodes() {
|
|
16
|
+
return Object.keys(MATTER_CODE_NAMES).sort();
|
|
17
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { UnknownCodeError } from "../core/errors.js";
|
|
2
|
+
import { parseMatter } from "./matter.js";
|
|
3
|
+
import { MATTER_CODE_NAMES } from "../tables/matter.tables.generated.js";
|
|
4
|
+
function isDigestName(name) {
|
|
5
|
+
return name.startsWith("Blake") || name.startsWith("SHA2_") ||
|
|
6
|
+
name.startsWith("SHA3_");
|
|
7
|
+
}
|
|
8
|
+
export function parseSaider(input, cold) {
|
|
9
|
+
const matter = parseMatter(input, cold);
|
|
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
|
+
};
|
|
22
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { UnknownCodeError } from "../core/errors.js";
|
|
2
|
+
import { CtrDexV1, CtrDexV2 } from "../tables/counter-codex.js";
|
|
3
|
+
import { parseAttachmentDispatch } from "../parser/group-dispatch.js";
|
|
4
|
+
const SEALER_CODES = new Set([
|
|
5
|
+
CtrDexV1.SealSourceCouples,
|
|
6
|
+
CtrDexV1.SealSourceTriples,
|
|
7
|
+
CtrDexV2.SealSourceCouples,
|
|
8
|
+
CtrDexV2.BigSealSourceCouples,
|
|
9
|
+
CtrDexV2.SealSourceTriples,
|
|
10
|
+
CtrDexV2.BigSealSourceTriples,
|
|
11
|
+
CtrDexV2.SealSourceLastSingles,
|
|
12
|
+
CtrDexV2.BigSealSourceLastSingles,
|
|
13
|
+
CtrDexV2.DigestSealSingles,
|
|
14
|
+
CtrDexV2.BigDigestSealSingles,
|
|
15
|
+
CtrDexV2.MerkleRootSealSingles,
|
|
16
|
+
CtrDexV2.BigMerkleRootSealSingles,
|
|
17
|
+
CtrDexV2.BackerRegistrarSealCouples,
|
|
18
|
+
CtrDexV2.BigBackerRegistrarSealCouples,
|
|
19
|
+
CtrDexV2.TypedDigestSealCouples,
|
|
20
|
+
CtrDexV2.BigTypedDigestSealCouples,
|
|
21
|
+
]);
|
|
22
|
+
export function parseSealer(input, version, cold) {
|
|
23
|
+
const parsed = parseAttachmentDispatch(input, version, cold);
|
|
24
|
+
if (!SEALER_CODES.has(parsed.group.code)) {
|
|
25
|
+
throw new UnknownCodeError(`Expected sealer group code, got ${parsed.group.code}`);
|
|
26
|
+
}
|
|
27
|
+
return {
|
|
28
|
+
code: parsed.group.code,
|
|
29
|
+
name: parsed.group.name,
|
|
30
|
+
count: parsed.group.count,
|
|
31
|
+
items: parsed.group.items,
|
|
32
|
+
raw: parsed.group.raw,
|
|
33
|
+
consumed: parsed.consumed,
|
|
34
|
+
};
|
|
35
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { UnknownCodeError } from "../core/errors.js";
|
|
2
|
+
import { parseMatter } from "./matter.js";
|
|
3
|
+
import { MATTER_CODE_NAMES } from "../tables/matter.tables.generated.js";
|
|
4
|
+
export function parseSeqner(input, cold) {
|
|
5
|
+
const matter = parseMatter(input, cold);
|
|
6
|
+
const name = MATTER_CODE_NAMES[matter.code];
|
|
7
|
+
if (name !== "Salt_128") {
|
|
8
|
+
throw new UnknownCodeError(`Expected seqner Salt_128 code, got ${matter.code}`);
|
|
9
|
+
}
|
|
10
|
+
let sn = 0n;
|
|
11
|
+
for (const b of matter.raw) {
|
|
12
|
+
sn = (sn << 8n) | BigInt(b);
|
|
13
|
+
}
|
|
14
|
+
const snh = sn.toString(16).padStart(matter.raw.length * 2, "0");
|
|
15
|
+
return {
|
|
16
|
+
code: matter.code,
|
|
17
|
+
qb64: matter.qb64,
|
|
18
|
+
sn,
|
|
19
|
+
snh,
|
|
20
|
+
fullSize: matter.fullSize,
|
|
21
|
+
fullSizeB2: matter.fullSizeB2,
|
|
22
|
+
};
|
|
23
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { UnknownCodeError } from "../core/errors.js";
|
|
2
|
+
import { parseMatter } from "./matter.js";
|
|
3
|
+
import { MATTER_CODE_NAMES } from "../tables/matter.tables.generated.js";
|
|
4
|
+
function isTexterCode(code) {
|
|
5
|
+
const name = MATTER_CODE_NAMES[code] ?? "";
|
|
6
|
+
return name.startsWith("Bytes_") || name.startsWith("Bytes_Big_");
|
|
7
|
+
}
|
|
8
|
+
export function parseTexter(input, cold) {
|
|
9
|
+
const matter = parseMatter(input, cold);
|
|
10
|
+
if (!isTexterCode(matter.code)) {
|
|
11
|
+
throw new UnknownCodeError(`Expected texter bytes code, got ${matter.code}`);
|
|
12
|
+
}
|
|
13
|
+
return {
|
|
14
|
+
code: matter.code,
|
|
15
|
+
qb64: matter.qb64,
|
|
16
|
+
text: new TextDecoder().decode(matter.raw),
|
|
17
|
+
fullSize: matter.fullSize,
|
|
18
|
+
fullSizeB2: matter.fullSizeB2,
|
|
19
|
+
};
|
|
20
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { UnknownCodeError } from "../core/errors.js";
|
|
2
|
+
import { parseMatter } from "./matter.js";
|
|
3
|
+
import { MATTER_CODE_NAMES } from "../tables/matter.tables.generated.js";
|
|
4
|
+
function isNumericName(name) {
|
|
5
|
+
return name === "Short" || name === "Long" || name === "Big" || name === "Tall" ||
|
|
6
|
+
name === "Large" || name === "Great" || name === "Vast";
|
|
7
|
+
}
|
|
8
|
+
function isWeightedName(name) {
|
|
9
|
+
return name.startsWith("StrB64_") || name.startsWith("StrB64_Big_");
|
|
10
|
+
}
|
|
11
|
+
export function parseTholder(input, cold) {
|
|
12
|
+
const matter = parseMatter(input, cold);
|
|
13
|
+
const name = MATTER_CODE_NAMES[matter.code] ?? "";
|
|
14
|
+
if (!isNumericName(name) && !isWeightedName(name)) {
|
|
15
|
+
throw new UnknownCodeError(`Expected threshold code, got ${matter.code}`);
|
|
16
|
+
}
|
|
17
|
+
const sith = isNumericName(name)
|
|
18
|
+
? [...matter.raw].reduce((acc, b) => (acc << 8n) | BigInt(b), 0n).toString(16)
|
|
19
|
+
: new TextDecoder().decode(matter.raw);
|
|
20
|
+
return {
|
|
21
|
+
code: matter.code,
|
|
22
|
+
qb64: matter.qb64,
|
|
23
|
+
sith,
|
|
24
|
+
fullSize: matter.fullSize,
|
|
25
|
+
fullSizeB2: matter.fullSizeB2,
|
|
26
|
+
};
|
|
27
|
+
}
|