cesr-ts 0.4.0 → 0.6.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.
Files changed (204) hide show
  1. package/esm/src/adapters/async-iterable.js +8 -0
  2. package/esm/src/adapters/effection.js +6 -0
  3. package/esm/src/annotate/annotator.js +12 -0
  4. package/esm/src/annotate/cli.js +12 -0
  5. package/esm/src/annotate/comments.js +5 -1
  6. package/esm/src/annotate/denot.js +6 -0
  7. package/esm/src/annotate/render.js +15 -3
  8. package/esm/src/core/bytes.js +9 -0
  9. package/esm/src/core/errors.js +3 -0
  10. package/esm/src/core/parser-engine.js +1 -1
  11. package/esm/src/core/parser-frame-parser.js +22 -18
  12. package/esm/src/core/vocabulary.js +47 -0
  13. package/esm/src/index.js +5 -0
  14. package/esm/src/parser/attachment-parser.js +4 -0
  15. package/esm/src/parser/cold-start.js +6 -0
  16. package/esm/src/parser/group-dispatch.js +2 -2
  17. package/esm/src/primitives/aggor.js +374 -30
  18. package/esm/src/primitives/bexter.js +2 -3
  19. package/esm/src/primitives/blinder.js +6 -0
  20. package/esm/src/primitives/byte-like.js +19 -0
  21. package/esm/src/primitives/cigar.js +17 -3
  22. package/esm/src/primitives/cipher.js +91 -6
  23. package/esm/src/primitives/codex.js +39 -6
  24. package/esm/src/primitives/compactor.js +307 -3
  25. package/esm/src/primitives/counter.js +6 -2
  26. package/esm/src/primitives/dater.js +1 -2
  27. package/esm/src/primitives/decimer.js +7 -11
  28. package/esm/src/primitives/decrypter.js +123 -7
  29. package/esm/src/primitives/diger.js +57 -3
  30. package/esm/src/primitives/disclosure.js +300 -0
  31. package/esm/src/primitives/encrypter.js +130 -7
  32. package/esm/src/primitives/hydrate.js +49 -0
  33. package/esm/src/primitives/ilker.js +2 -3
  34. package/esm/src/primitives/indexer.js +21 -4
  35. package/esm/src/primitives/labeler.js +1 -2
  36. package/esm/src/primitives/mapper.js +612 -35
  37. package/esm/src/primitives/matter.js +133 -3
  38. package/esm/src/primitives/mediar.js +6 -0
  39. package/esm/src/primitives/noncer.js +2 -3
  40. package/esm/src/primitives/number.js +1 -2
  41. package/esm/src/primitives/pather.js +102 -5
  42. package/esm/src/primitives/prefixer.js +1 -2
  43. package/esm/src/primitives/primitive.js +14 -0
  44. package/esm/src/primitives/registry.js +2 -0
  45. package/esm/src/primitives/saider.js +80 -3
  46. package/esm/src/primitives/salter.js +96 -2
  47. package/esm/src/primitives/sealed-box.js +41 -0
  48. package/esm/src/primitives/seqner.js +1 -2
  49. package/esm/src/primitives/siger.js +58 -3
  50. package/esm/src/primitives/signer.js +243 -9
  51. package/esm/src/primitives/streamer.js +28 -0
  52. package/esm/src/primitives/structing.js +727 -0
  53. package/esm/src/primitives/structor.js +20 -0
  54. package/esm/src/primitives/tagger.js +1 -2
  55. package/esm/src/primitives/texter.js +1 -2
  56. package/esm/src/primitives/tholder.js +552 -10
  57. package/esm/src/primitives/traitor.js +2 -3
  58. package/esm/src/primitives/verfer.js +50 -6
  59. package/esm/src/primitives/verser.js +16 -6
  60. package/esm/src/router/router-stub.js +1 -0
  61. package/esm/src/serder/native.js +1326 -0
  62. package/esm/src/serder/serder.js +1558 -59
  63. package/esm/src/serder/serdery.js +92 -7
  64. package/esm/src/serder/smell.js +26 -1
  65. package/esm/src/tables/codex-utils.js +2 -0
  66. package/esm/src/tables/counter-codex.js +2 -0
  67. package/esm/src/tables/counter-groups.js +6 -0
  68. package/esm/src/tables/versions.js +4 -0
  69. package/esm/src/version.js +5 -2
  70. package/package.json +5 -2
  71. package/types/src/adapters/async-iterable.d.ts +8 -0
  72. package/types/src/adapters/async-iterable.d.ts.map +1 -1
  73. package/types/src/adapters/effection.d.ts +7 -0
  74. package/types/src/adapters/effection.d.ts.map +1 -1
  75. package/types/src/annotate/annotator.d.ts +12 -0
  76. package/types/src/annotate/annotator.d.ts.map +1 -1
  77. package/types/src/annotate/cli.d.ts +13 -0
  78. package/types/src/annotate/cli.d.ts.map +1 -1
  79. package/types/src/annotate/comments.d.ts +4 -0
  80. package/types/src/annotate/comments.d.ts.map +1 -1
  81. package/types/src/annotate/denot.d.ts +6 -0
  82. package/types/src/annotate/denot.d.ts.map +1 -1
  83. package/types/src/annotate/render.d.ts.map +1 -1
  84. package/types/src/annotate/types.d.ts +2 -0
  85. package/types/src/annotate/types.d.ts.map +1 -1
  86. package/types/src/bench/parser-benchmark.d.ts +3 -0
  87. package/types/src/bench/parser-benchmark.d.ts.map +1 -1
  88. package/types/src/core/bytes.d.ts +9 -0
  89. package/types/src/core/bytes.d.ts.map +1 -1
  90. package/types/src/core/errors.d.ts +3 -0
  91. package/types/src/core/errors.d.ts.map +1 -1
  92. package/types/src/core/parser-engine.d.ts +4 -0
  93. package/types/src/core/parser-engine.d.ts.map +1 -1
  94. package/types/src/core/parser-frame-parser.d.ts.map +1 -1
  95. package/types/src/core/types.d.ts +2 -0
  96. package/types/src/core/types.d.ts.map +1 -1
  97. package/types/src/core/vocabulary.d.ts +48 -0
  98. package/types/src/core/vocabulary.d.ts.map +1 -0
  99. package/types/src/index.d.ts +5 -0
  100. package/types/src/index.d.ts.map +1 -1
  101. package/types/src/parser/attachment-parser.d.ts +4 -0
  102. package/types/src/parser/attachment-parser.d.ts.map +1 -1
  103. package/types/src/parser/cold-start.d.ts +6 -0
  104. package/types/src/parser/cold-start.d.ts.map +1 -1
  105. package/types/src/parser/group-dispatch.d.ts.map +1 -1
  106. package/types/src/primitives/aggor.d.ts +100 -13
  107. package/types/src/primitives/aggor.d.ts.map +1 -1
  108. package/types/src/primitives/bexter.d.ts.map +1 -1
  109. package/types/src/primitives/blinder.d.ts +6 -0
  110. package/types/src/primitives/blinder.d.ts.map +1 -1
  111. package/types/src/primitives/byte-like.d.ts +7 -0
  112. package/types/src/primitives/byte-like.d.ts.map +1 -0
  113. package/types/src/primitives/cigar.d.ts +11 -1
  114. package/types/src/primitives/cigar.d.ts.map +1 -1
  115. package/types/src/primitives/cipher.d.ts +73 -2
  116. package/types/src/primitives/cipher.d.ts.map +1 -1
  117. package/types/src/primitives/codex.d.ts +34 -4
  118. package/types/src/primitives/codex.d.ts.map +1 -1
  119. package/types/src/primitives/compactor.d.ts +94 -2
  120. package/types/src/primitives/compactor.d.ts.map +1 -1
  121. package/types/src/primitives/counter.d.ts.map +1 -1
  122. package/types/src/primitives/dater.d.ts.map +1 -1
  123. package/types/src/primitives/decimer.d.ts.map +1 -1
  124. package/types/src/primitives/decrypter.d.ts +64 -3
  125. package/types/src/primitives/decrypter.d.ts.map +1 -1
  126. package/types/src/primitives/diger.d.ts +16 -0
  127. package/types/src/primitives/diger.d.ts.map +1 -1
  128. package/types/src/primitives/disclosure.d.ts +201 -0
  129. package/types/src/primitives/disclosure.d.ts.map +1 -0
  130. package/types/src/primitives/encrypter.d.ts +66 -4
  131. package/types/src/primitives/encrypter.d.ts.map +1 -1
  132. package/types/src/primitives/hydrate.d.ts +20 -0
  133. package/types/src/primitives/hydrate.d.ts.map +1 -0
  134. package/types/src/primitives/ilker.d.ts.map +1 -1
  135. package/types/src/primitives/indexer.d.ts.map +1 -1
  136. package/types/src/primitives/labeler.d.ts.map +1 -1
  137. package/types/src/primitives/mapper.d.ts +132 -11
  138. package/types/src/primitives/mapper.d.ts.map +1 -1
  139. package/types/src/primitives/matter.d.ts +33 -1
  140. package/types/src/primitives/matter.d.ts.map +1 -1
  141. package/types/src/primitives/mediar.d.ts +6 -0
  142. package/types/src/primitives/mediar.d.ts.map +1 -1
  143. package/types/src/primitives/noncer.d.ts.map +1 -1
  144. package/types/src/primitives/number.d.ts.map +1 -1
  145. package/types/src/primitives/pather.d.ts +21 -0
  146. package/types/src/primitives/pather.d.ts.map +1 -1
  147. package/types/src/primitives/prefixer.d.ts.map +1 -1
  148. package/types/src/primitives/primitive.d.ts +26 -0
  149. package/types/src/primitives/primitive.d.ts.map +1 -1
  150. package/types/src/primitives/registry.d.ts +3 -0
  151. package/types/src/primitives/registry.d.ts.map +1 -1
  152. package/types/src/primitives/saider.d.ts +41 -0
  153. package/types/src/primitives/saider.d.ts.map +1 -1
  154. package/types/src/primitives/salter.d.ts +56 -1
  155. package/types/src/primitives/salter.d.ts.map +1 -1
  156. package/types/src/primitives/sealed-box.d.ts +29 -0
  157. package/types/src/primitives/sealed-box.d.ts.map +1 -0
  158. package/types/src/primitives/seqner.d.ts.map +1 -1
  159. package/types/src/primitives/siger.d.ts +14 -0
  160. package/types/src/primitives/siger.d.ts.map +1 -1
  161. package/types/src/primitives/signer.d.ts +80 -4
  162. package/types/src/primitives/signer.d.ts.map +1 -1
  163. package/types/src/primitives/streamer.d.ts +31 -0
  164. package/types/src/primitives/streamer.d.ts.map +1 -0
  165. package/types/src/primitives/structing.d.ts +4114 -0
  166. package/types/src/primitives/structing.d.ts.map +1 -0
  167. package/types/src/primitives/structor.d.ts +6 -0
  168. package/types/src/primitives/structor.d.ts.map +1 -1
  169. package/types/src/primitives/tagger.d.ts.map +1 -1
  170. package/types/src/primitives/texter.d.ts.map +1 -1
  171. package/types/src/primitives/tholder.d.ts +150 -5
  172. package/types/src/primitives/tholder.d.ts.map +1 -1
  173. package/types/src/primitives/traitor.d.ts.map +1 -1
  174. package/types/src/primitives/unknown.d.ts +1 -0
  175. package/types/src/primitives/unknown.d.ts.map +1 -1
  176. package/types/src/primitives/verfer.d.ts +12 -0
  177. package/types/src/primitives/verfer.d.ts.map +1 -1
  178. package/types/src/primitives/verser.d.ts +14 -3
  179. package/types/src/primitives/verser.d.ts.map +1 -1
  180. package/types/src/router/router-stub.d.ts +3 -0
  181. package/types/src/router/router-stub.d.ts.map +1 -1
  182. package/types/src/serder/native.d.ts +115 -0
  183. package/types/src/serder/native.d.ts.map +1 -0
  184. package/types/src/serder/serder.d.ts +187 -9
  185. package/types/src/serder/serder.d.ts.map +1 -1
  186. package/types/src/serder/serdery.d.ts +42 -0
  187. package/types/src/serder/serdery.d.ts.map +1 -1
  188. package/types/src/serder/smell.d.ts +22 -0
  189. package/types/src/serder/smell.d.ts.map +1 -1
  190. package/types/src/tables/codex-utils.d.ts +3 -0
  191. package/types/src/tables/codex-utils.d.ts.map +1 -1
  192. package/types/src/tables/counter-codex.d.ts +4 -0
  193. package/types/src/tables/counter-codex.d.ts.map +1 -1
  194. package/types/src/tables/counter-groups.d.ts +6 -0
  195. package/types/src/tables/counter-groups.d.ts.map +1 -1
  196. package/types/src/tables/counter.tables.generated.d.ts.map +1 -1
  197. package/types/src/tables/indexer.codex.generated.d.ts.map +1 -1
  198. package/types/src/tables/matter.codex.generated.d.ts.map +1 -1
  199. package/types/src/tables/table-types.d.ts +6 -0
  200. package/types/src/tables/table-types.d.ts.map +1 -1
  201. package/types/src/tables/versions.d.ts +6 -0
  202. package/types/src/tables/versions.d.ts.map +1 -1
  203. package/types/src/version.d.ts +5 -2
  204. package/types/src/version.d.ts.map +1 -1
@@ -0,0 +1,727 @@
1
+ /**
2
+ * Fixed-field structing descriptors and plain record values.
3
+ *
4
+ * This file is the TypeScript correlate of the fixed-field portion of KERIpy
5
+ * `structing.py`.
6
+ *
7
+ * The important mental model is a representation ladder:
8
+ * - semantic record: plain frozen object with real CESR primitives
9
+ * - crew / SAD object: same field names, projected to string properties named
10
+ * by the cast metadata (`ipn`)
11
+ * - CESR tuple body: concatenated primitive serializations in field order
12
+ * - counted-group transport: attachment framing owned elsewhere by
13
+ * `Structor`, `Sealer`, `Blinder`, and `Mediar`
14
+ *
15
+ * This module owns the first three layers for fixed-field seal, blind-state,
16
+ * and typed-media values. It does not own workflow verbs such as blind,
17
+ * unblind, or commitment recomputation; those live in `disclosure.ts`.
18
+ */
19
+ import { b, concatBytes } from "../core/bytes.js";
20
+ import { Bexter } from "./bexter.js";
21
+ import { LabelDex, NonceDex } from "./codex.js";
22
+ import { Diger } from "./diger.js";
23
+ import { Labeler } from "./labeler.js";
24
+ import { Noncer } from "./noncer.js";
25
+ import { NumberPrimitive } from "./number.js";
26
+ import { Prefixer } from "./prefixer.js";
27
+ import { Texter } from "./texter.js";
28
+ import { Verser } from "./verser.js";
29
+ /**
30
+ * Build one immutable cast entry.
31
+ *
32
+ * KERIpy substance:
33
+ * - mirrors `Castage(kls=..., ipn=...)`
34
+ *
35
+ * `ipn` is the string projection name used in crew/SAD form. For example:
36
+ * - `NumberPrimitive` uses `numh`
37
+ * - `Noncer` uses `nonce`
38
+ * - `Labeler` / `Texter` use `text`
39
+ * - `null` falls back to canonical `qb64`
40
+ */
41
+ export function castage(kls, ipn = null) {
42
+ return Object.freeze({ kls, ipn });
43
+ }
44
+ const NUMBER_CAPACITIES = [
45
+ { code: "M", rawSize: 2 },
46
+ { code: "0H", rawSize: 4 },
47
+ { code: "R", rawSize: 5 },
48
+ { code: "N", rawSize: 8 },
49
+ { code: "S", rawSize: 11 },
50
+ { code: "T", rawSize: 14 },
51
+ { code: "0A", rawSize: 16 },
52
+ { code: "U", rawSize: 17 },
53
+ ];
54
+ function freezeRecord(value) {
55
+ return Object.freeze(value);
56
+ }
57
+ function bigintToBytes(value) {
58
+ if (value < 0n) {
59
+ throw new TypeError(`Negative CESR number=${value}`);
60
+ }
61
+ if (value === 0n) {
62
+ return new Uint8Array([0]);
63
+ }
64
+ const bytes = [];
65
+ let working = value;
66
+ while (working > 0n) {
67
+ bytes.unshift(Number(working & 0xffn));
68
+ working >>= 8n;
69
+ }
70
+ return new Uint8Array(bytes);
71
+ }
72
+ function hydrateNumber(numh) {
73
+ const bigint = BigInt(`0x${numh || "0"}`);
74
+ const raw = bigintToBytes(bigint);
75
+ const entry = NUMBER_CAPACITIES.find(({ rawSize }) => raw.length <= rawSize);
76
+ if (!entry) {
77
+ throw new TypeError(`Unsupported CESR number width=${raw.length}`);
78
+ }
79
+ const padded = new Uint8Array(entry.rawSize);
80
+ padded.set(raw, entry.rawSize - raw.length);
81
+ return new NumberPrimitive({ code: entry.code, raw: padded });
82
+ }
83
+ function encodeTag(text) {
84
+ const code = new Map([
85
+ [1, LabelDex.Tag1],
86
+ [2, LabelDex.Tag2],
87
+ [3, LabelDex.Tag3],
88
+ [4, LabelDex.Tag4],
89
+ [5, LabelDex.Tag5],
90
+ [6, LabelDex.Tag6],
91
+ [7, LabelDex.Tag7],
92
+ [8, LabelDex.Tag8],
93
+ [9, LabelDex.Tag9],
94
+ [10, LabelDex.Tag10],
95
+ [11, LabelDex.Tag11],
96
+ ]).get(text.length);
97
+ if (!code) {
98
+ throw new TypeError(`Unsupported label text length=${text.length}`);
99
+ }
100
+ const pad = code === LabelDex.Tag1 || code === LabelDex.Tag5
101
+ || code === LabelDex.Tag9
102
+ ? "_"
103
+ : "";
104
+ return `${code}${pad}${text}`;
105
+ }
106
+ function encodeBext(text) {
107
+ const rem = text.length % 4;
108
+ const code = rem === 0
109
+ ? LabelDex.StrB64_L0
110
+ : rem === 1
111
+ ? LabelDex.StrB64_L1
112
+ : LabelDex.StrB64_L2;
113
+ return new Bexter({ code, raw: Bexter.rawify(text) }).qb64;
114
+ }
115
+ function encodeBytes(text) {
116
+ const raw = b(text);
117
+ const rem = raw.length % 3;
118
+ const code = rem === 0
119
+ ? LabelDex.Bytes_L0
120
+ : rem === 1
121
+ ? LabelDex.Bytes_L1
122
+ : LabelDex.Bytes_L2;
123
+ return new Texter({ code, raw }).qb64;
124
+ }
125
+ function encodeLabelText(text) {
126
+ if (text.length === 0) {
127
+ return LabelDex.Empty;
128
+ }
129
+ if (/^[A-Za-z0-9_-]{1,11}$/.test(text)) {
130
+ return encodeTag(text);
131
+ }
132
+ if (/^[A-Za-z0-9_-]+$/.test(text)) {
133
+ return encodeBext(text);
134
+ }
135
+ return encodeBytes(text);
136
+ }
137
+ /**
138
+ * Inverse of crew/SAD projection for one field.
139
+ *
140
+ * Maintainer rule:
141
+ * - `fromSad()` does not blindly assume `qb64`
142
+ * - it must rebuild the primitive from the same string property selected by
143
+ * the field's cast metadata
144
+ *
145
+ * This is why `BlindState.ts` and friends can round-trip placeholders and
146
+ * human-readable labels without losing parity with KERIpy.
147
+ */
148
+ function hydrateStructingField(spec, value) {
149
+ if (spec.kls === NumberPrimitive) {
150
+ return hydrateNumber(value);
151
+ }
152
+ if (spec.kls === Noncer) {
153
+ return value === ""
154
+ ? new Noncer({ code: NonceDex.Empty, raw: new Uint8Array() })
155
+ : new Noncer({ qb64: value });
156
+ }
157
+ if (spec.kls === Labeler) {
158
+ return new Labeler({ qb64: encodeLabelText(value) });
159
+ }
160
+ if (spec.kls === Texter) {
161
+ return new Texter({ qb64: encodeBytes(value) });
162
+ }
163
+ return new spec.kls({ qb64: value });
164
+ }
165
+ /**
166
+ * Project one semantic primitive field into crew/SAD string form.
167
+ *
168
+ * `crew` means "same field names, but string values selected by cast
169
+ * metadata," not "stringify everything as `qb64`".
170
+ */
171
+ function serializeCrewField(field, spec) {
172
+ const prop = spec.ipn ?? "qb64";
173
+ const value = Reflect.get(field, prop);
174
+ if (typeof value !== "string") {
175
+ throw new TypeError(`Structing field ${field.constructor.name} does not expose string property ${prop}.`);
176
+ }
177
+ return value;
178
+ }
179
+ /** Build the crew/SAD object for one fixed-field semantic record. */
180
+ function buildCrew(fields, cast, value) {
181
+ const out = {};
182
+ for (const field of fields) {
183
+ const key = field;
184
+ out[key] = serializeCrewField(value[key], cast[key]);
185
+ }
186
+ return Object.freeze(out);
187
+ }
188
+ function serializeTupleQb64(tuple) {
189
+ return tuple.map((field) => field.qb64).join("");
190
+ }
191
+ function serializeTupleQb64b(tuple) {
192
+ return b(serializeTupleQb64(tuple));
193
+ }
194
+ function serializeTupleQb2(tuple) {
195
+ return concatBytes(...tuple.map((field) => field.qb2));
196
+ }
197
+ function invertClanCodens(map) {
198
+ const out = {};
199
+ for (const [clan, coden] of Object.entries(map)) {
200
+ out[coden] = clan;
201
+ }
202
+ return Object.freeze(out);
203
+ }
204
+ function isSadShape(fields, value) {
205
+ if (!value || typeof value !== "object" || Array.isArray(value)) {
206
+ return false;
207
+ }
208
+ const candidate = value;
209
+ const keys = Object.keys(candidate);
210
+ if (keys.length !== fields.length) {
211
+ return false;
212
+ }
213
+ for (const field of fields) {
214
+ if (typeof candidate[field] !== "string") {
215
+ return false;
216
+ }
217
+ }
218
+ return keys.every((key) => fields.includes(key));
219
+ }
220
+ /**
221
+ * Attach raw-SAD helpers to one plain descriptor object.
222
+ *
223
+ * TypeScript divergence from KERIpy:
224
+ * - KERIpy wraps these behaviors inside richer `Structor` descendants
225
+ * - `keri-ts` keeps the values as plain records and exposes schema/conversion
226
+ * helpers directly on frozen descriptor companions
227
+ */
228
+ function withSadProjection(descriptor) {
229
+ return Object.freeze({
230
+ ...descriptor,
231
+ isSad(value) {
232
+ return isSadShape(descriptor.fields, value);
233
+ },
234
+ fromSad(value) {
235
+ const tuple = descriptor.fields.map((field) => {
236
+ const key = field;
237
+ return hydrateStructingField(descriptor.cast[key], value[key]);
238
+ });
239
+ return descriptor.fromTuple(tuple);
240
+ },
241
+ toSad(value) {
242
+ return descriptor.toCrew(value);
243
+ },
244
+ });
245
+ }
246
+ const SEAL_DIGEST_FIELDS = Object.freeze(["d"]);
247
+ const SEAL_DIGEST_CAST = Object.freeze({ d: castage(Diger) });
248
+ export const SealDigest = withSadProjection({
249
+ name: "SealDigest",
250
+ fields: SEAL_DIGEST_FIELDS,
251
+ cast: SEAL_DIGEST_CAST,
252
+ coden: "DigestSealSingles",
253
+ fromTuple([d]) {
254
+ return freezeRecord({ d });
255
+ },
256
+ fromQb64bTuple([d]) {
257
+ return freezeRecord({ d: new Diger({ qb64b: d }) });
258
+ },
259
+ toTuple(value) {
260
+ return [value.d];
261
+ },
262
+ toCrew(value) {
263
+ return buildCrew(SEAL_DIGEST_FIELDS, SEAL_DIGEST_CAST, value);
264
+ },
265
+ qb64(value) {
266
+ return serializeTupleQb64([value.d]);
267
+ },
268
+ qb64b(value) {
269
+ return serializeTupleQb64b([value.d]);
270
+ },
271
+ qb2(value) {
272
+ return serializeTupleQb2([value.d]);
273
+ },
274
+ });
275
+ const SEAL_ROOT_FIELDS = Object.freeze(["rd"]);
276
+ const SEAL_ROOT_CAST = Object.freeze({ rd: castage(Diger) });
277
+ export const SealRoot = withSadProjection({
278
+ name: "SealRoot",
279
+ fields: SEAL_ROOT_FIELDS,
280
+ cast: SEAL_ROOT_CAST,
281
+ coden: "MerkleRootSealSingles",
282
+ fromTuple([rd]) {
283
+ return freezeRecord({ rd });
284
+ },
285
+ fromQb64bTuple([rd]) {
286
+ return freezeRecord({ rd: new Diger({ qb64b: rd }) });
287
+ },
288
+ toTuple(value) {
289
+ return [value.rd];
290
+ },
291
+ toCrew(value) {
292
+ return buildCrew(SEAL_ROOT_FIELDS, SEAL_ROOT_CAST, value);
293
+ },
294
+ qb64(value) {
295
+ return serializeTupleQb64([value.rd]);
296
+ },
297
+ qb64b(value) {
298
+ return serializeTupleQb64b([value.rd]);
299
+ },
300
+ qb2(value) {
301
+ return serializeTupleQb2([value.rd]);
302
+ },
303
+ });
304
+ const SEAL_SOURCE_FIELDS = Object.freeze(["s", "d"]);
305
+ const SEAL_SOURCE_CAST = Object.freeze({
306
+ s: castage(NumberPrimitive, "numh"),
307
+ d: castage(Diger),
308
+ });
309
+ export const SealSource = withSadProjection({
310
+ name: "SealSource",
311
+ fields: SEAL_SOURCE_FIELDS,
312
+ cast: SEAL_SOURCE_CAST,
313
+ coden: "SealSourceCouples",
314
+ fromTuple([s, d]) {
315
+ return freezeRecord({ s, d });
316
+ },
317
+ fromQb64bTuple([s, d]) {
318
+ return freezeRecord({
319
+ s: new NumberPrimitive({ qb64b: s }),
320
+ d: new Diger({ qb64b: d }),
321
+ });
322
+ },
323
+ toTuple(value) {
324
+ return [value.s, value.d];
325
+ },
326
+ toCrew(value) {
327
+ return buildCrew(SEAL_SOURCE_FIELDS, SEAL_SOURCE_CAST, value);
328
+ },
329
+ qb64(value) {
330
+ return serializeTupleQb64([value.s, value.d]);
331
+ },
332
+ qb64b(value) {
333
+ return serializeTupleQb64b([value.s, value.d]);
334
+ },
335
+ qb2(value) {
336
+ return serializeTupleQb2([value.s, value.d]);
337
+ },
338
+ });
339
+ const SEAL_EVENT_FIELDS = Object.freeze(["i", "s", "d"]);
340
+ const SEAL_EVENT_CAST = Object.freeze({
341
+ i: castage(Prefixer),
342
+ s: castage(NumberPrimitive, "numh"),
343
+ d: castage(Diger),
344
+ });
345
+ export const SealEvent = withSadProjection({
346
+ name: "SealEvent",
347
+ fields: SEAL_EVENT_FIELDS,
348
+ cast: SEAL_EVENT_CAST,
349
+ coden: "SealSourceTriples",
350
+ fromTuple([i, s, d]) {
351
+ return freezeRecord({ i, s, d });
352
+ },
353
+ fromQb64bTuple([i, s, d]) {
354
+ return freezeRecord({
355
+ i: new Prefixer({ qb64b: i }),
356
+ s: new NumberPrimitive({ qb64b: s }),
357
+ d: new Diger({ qb64b: d }),
358
+ });
359
+ },
360
+ toTuple(value) {
361
+ return [value.i, value.s, value.d];
362
+ },
363
+ toCrew(value) {
364
+ return buildCrew(SEAL_EVENT_FIELDS, SEAL_EVENT_CAST, value);
365
+ },
366
+ qb64(value) {
367
+ return serializeTupleQb64([value.i, value.s, value.d]);
368
+ },
369
+ qb64b(value) {
370
+ return serializeTupleQb64b([value.i, value.s, value.d]);
371
+ },
372
+ qb2(value) {
373
+ return serializeTupleQb2([value.i, value.s, value.d]);
374
+ },
375
+ });
376
+ const SEAL_LAST_FIELDS = Object.freeze(["i"]);
377
+ const SEAL_LAST_CAST = Object.freeze({ i: castage(Prefixer) });
378
+ export const SealLast = withSadProjection({
379
+ name: "SealLast",
380
+ fields: SEAL_LAST_FIELDS,
381
+ cast: SEAL_LAST_CAST,
382
+ coden: "SealSourceLastSingles",
383
+ fromTuple([i]) {
384
+ return freezeRecord({ i });
385
+ },
386
+ fromQb64bTuple([i]) {
387
+ return freezeRecord({ i: new Prefixer({ qb64b: i }) });
388
+ },
389
+ toTuple(value) {
390
+ return [value.i];
391
+ },
392
+ toCrew(value) {
393
+ return buildCrew(SEAL_LAST_FIELDS, SEAL_LAST_CAST, value);
394
+ },
395
+ qb64(value) {
396
+ return serializeTupleQb64([value.i]);
397
+ },
398
+ qb64b(value) {
399
+ return serializeTupleQb64b([value.i]);
400
+ },
401
+ qb2(value) {
402
+ return serializeTupleQb2([value.i]);
403
+ },
404
+ });
405
+ const SEAL_BACK_FIELDS = Object.freeze(["bi", "d"]);
406
+ const SEAL_BACK_CAST = Object.freeze({
407
+ bi: castage(Prefixer),
408
+ d: castage(Diger),
409
+ });
410
+ export const SealBack = withSadProjection({
411
+ name: "SealBack",
412
+ fields: SEAL_BACK_FIELDS,
413
+ cast: SEAL_BACK_CAST,
414
+ coden: "BackerRegistrarSealCouples",
415
+ fromTuple([bi, d]) {
416
+ return freezeRecord({ bi, d });
417
+ },
418
+ fromQb64bTuple([bi, d]) {
419
+ return freezeRecord({
420
+ bi: new Prefixer({ qb64b: bi }),
421
+ d: new Diger({ qb64b: d }),
422
+ });
423
+ },
424
+ toTuple(value) {
425
+ return [value.bi, value.d];
426
+ },
427
+ toCrew(value) {
428
+ return buildCrew(SEAL_BACK_FIELDS, SEAL_BACK_CAST, value);
429
+ },
430
+ qb64(value) {
431
+ return serializeTupleQb64([value.bi, value.d]);
432
+ },
433
+ qb64b(value) {
434
+ return serializeTupleQb64b([value.bi, value.d]);
435
+ },
436
+ qb2(value) {
437
+ return serializeTupleQb2([value.bi, value.d]);
438
+ },
439
+ });
440
+ const SEAL_KIND_FIELDS = Object.freeze(["t", "d"]);
441
+ const SEAL_KIND_CAST = Object.freeze({
442
+ t: castage(Verser),
443
+ d: castage(Diger),
444
+ });
445
+ export const SealKind = withSadProjection({
446
+ name: "SealKind",
447
+ fields: SEAL_KIND_FIELDS,
448
+ cast: SEAL_KIND_CAST,
449
+ coden: "TypedDigestSealCouples",
450
+ fromTuple([t, d]) {
451
+ return freezeRecord({ t, d });
452
+ },
453
+ fromQb64bTuple([t, d]) {
454
+ return freezeRecord({
455
+ t: new Verser({ qb64b: t }),
456
+ d: new Diger({ qb64b: d }),
457
+ });
458
+ },
459
+ toTuple(value) {
460
+ return [value.t, value.d];
461
+ },
462
+ toCrew(value) {
463
+ return buildCrew(SEAL_KIND_FIELDS, SEAL_KIND_CAST, value);
464
+ },
465
+ qb64(value) {
466
+ return serializeTupleQb64([value.t, value.d]);
467
+ },
468
+ qb64b(value) {
469
+ return serializeTupleQb64b([value.t, value.d]);
470
+ },
471
+ qb2(value) {
472
+ return serializeTupleQb2([value.t, value.d]);
473
+ },
474
+ });
475
+ const BLIND_STATE_FIELDS = Object.freeze(["d", "u", "td", "ts"]);
476
+ const BLIND_STATE_CAST = Object.freeze({
477
+ d: castage(Noncer, "nonce"),
478
+ u: castage(Noncer, "nonce"),
479
+ td: castage(Noncer, "nonce"),
480
+ ts: castage(Labeler, "text"),
481
+ });
482
+ export const BlindState = withSadProjection({
483
+ name: "BlindState",
484
+ fields: BLIND_STATE_FIELDS,
485
+ cast: BLIND_STATE_CAST,
486
+ coden: "BlindedStateQuadruples",
487
+ fromTuple([d, u, td, ts]) {
488
+ return freezeRecord({ d, u, td, ts });
489
+ },
490
+ fromQb64bTuple([d, u, td, ts]) {
491
+ return freezeRecord({
492
+ d: new Noncer({ qb64b: d }),
493
+ u: new Noncer({ qb64b: u }),
494
+ td: new Noncer({ qb64b: td }),
495
+ ts: new Labeler({ qb64b: ts }),
496
+ });
497
+ },
498
+ toTuple(value) {
499
+ return [value.d, value.u, value.td, value.ts];
500
+ },
501
+ toCrew(value) {
502
+ return buildCrew(BLIND_STATE_FIELDS, BLIND_STATE_CAST, value);
503
+ },
504
+ qb64(value) {
505
+ return serializeTupleQb64([value.d, value.u, value.td, value.ts]);
506
+ },
507
+ qb64b(value) {
508
+ return serializeTupleQb64b([value.d, value.u, value.td, value.ts]);
509
+ },
510
+ qb2(value) {
511
+ return serializeTupleQb2([value.d, value.u, value.td, value.ts]);
512
+ },
513
+ });
514
+ const BOUND_STATE_FIELDS = Object.freeze(["d", "u", "td", "ts", "bn", "bd"]);
515
+ const BOUND_STATE_CAST = Object.freeze({
516
+ d: castage(Noncer, "nonce"),
517
+ u: castage(Noncer, "nonce"),
518
+ td: castage(Noncer, "nonce"),
519
+ ts: castage(Labeler, "text"),
520
+ bn: castage(NumberPrimitive, "numh"),
521
+ bd: castage(Noncer, "nonce"),
522
+ });
523
+ export const BoundState = withSadProjection({
524
+ name: "BoundState",
525
+ fields: BOUND_STATE_FIELDS,
526
+ cast: BOUND_STATE_CAST,
527
+ coden: "BoundStateSextuples",
528
+ fromTuple([d, u, td, ts, bn, bd]) {
529
+ return freezeRecord({ d, u, td, ts, bn, bd });
530
+ },
531
+ fromQb64bTuple([d, u, td, ts, bn, bd]) {
532
+ return freezeRecord({
533
+ d: new Noncer({ qb64b: d }),
534
+ u: new Noncer({ qb64b: u }),
535
+ td: new Noncer({ qb64b: td }),
536
+ ts: new Labeler({ qb64b: ts }),
537
+ bn: new NumberPrimitive({ qb64b: bn }),
538
+ bd: new Noncer({ qb64b: bd }),
539
+ });
540
+ },
541
+ toTuple(value) {
542
+ return [
543
+ value.d,
544
+ value.u,
545
+ value.td,
546
+ value.ts,
547
+ value.bn,
548
+ value.bd,
549
+ ];
550
+ },
551
+ toCrew(value) {
552
+ return buildCrew(BOUND_STATE_FIELDS, BOUND_STATE_CAST, value);
553
+ },
554
+ qb64(value) {
555
+ return serializeTupleQb64([
556
+ value.d,
557
+ value.u,
558
+ value.td,
559
+ value.ts,
560
+ value.bn,
561
+ value.bd,
562
+ ]);
563
+ },
564
+ qb64b(value) {
565
+ return serializeTupleQb64b([
566
+ value.d,
567
+ value.u,
568
+ value.td,
569
+ value.ts,
570
+ value.bn,
571
+ value.bd,
572
+ ]);
573
+ },
574
+ qb2(value) {
575
+ return serializeTupleQb2([
576
+ value.d,
577
+ value.u,
578
+ value.td,
579
+ value.ts,
580
+ value.bn,
581
+ value.bd,
582
+ ]);
583
+ },
584
+ });
585
+ const TYPE_MEDIA_FIELDS = Object.freeze(["d", "u", "mt", "mv"]);
586
+ const TYPE_MEDIA_CAST = Object.freeze({
587
+ d: castage(Noncer, "nonce"),
588
+ u: castage(Noncer, "nonce"),
589
+ mt: castage(Labeler, "text"),
590
+ mv: castage(Texter, "text"),
591
+ });
592
+ export const TypeMedia = withSadProjection({
593
+ name: "TypeMedia",
594
+ fields: TYPE_MEDIA_FIELDS,
595
+ cast: TYPE_MEDIA_CAST,
596
+ coden: "TypedMediaQuadruples",
597
+ fromTuple([d, u, mt, mv]) {
598
+ return freezeRecord({ d, u, mt, mv });
599
+ },
600
+ fromQb64bTuple([d, u, mt, mv]) {
601
+ return freezeRecord({
602
+ d: new Noncer({ qb64b: d }),
603
+ u: new Noncer({ qb64b: u }),
604
+ mt: new Labeler({ qb64b: mt }),
605
+ mv: new Texter({ qb64b: mv }),
606
+ });
607
+ },
608
+ toTuple(value) {
609
+ return [value.d, value.u, value.mt, value.mv];
610
+ },
611
+ toCrew(value) {
612
+ return buildCrew(TYPE_MEDIA_FIELDS, TYPE_MEDIA_CAST, value);
613
+ },
614
+ qb64(value) {
615
+ return serializeTupleQb64([value.d, value.u, value.mt, value.mv]);
616
+ },
617
+ qb64b(value) {
618
+ return serializeTupleQb64b([value.d, value.u, value.mt, value.mv]);
619
+ },
620
+ qb2(value) {
621
+ return serializeTupleQb2([value.d, value.u, value.mt, value.mv]);
622
+ },
623
+ });
624
+ /** Empty clan registry placeholder retained for KERIpy naming familiarity. */
625
+ export const EmptyClanDom = Object.freeze({});
626
+ /** Empty cast registry placeholder retained for KERIpy naming familiarity. */
627
+ export const EmptyCastDom = Object.freeze({});
628
+ /** KERIpy alias for `EmptyClanDom`. */
629
+ export const EClanDom = EmptyClanDom;
630
+ /** KERIpy alias for `EmptyCastDom`. */
631
+ export const ECastDom = EmptyCastDom;
632
+ /** Seal-struct clan registry (`SealDigest` through `SealKind`). */
633
+ export const SealClanDom = Object.freeze({
634
+ SealDigest,
635
+ SealRoot,
636
+ SealSource,
637
+ SealEvent,
638
+ SealLast,
639
+ SealBack,
640
+ SealKind,
641
+ });
642
+ /** KERIpy alias for `SealClanDom`. */
643
+ export const SClanDom = SealClanDom;
644
+ /** Seal-struct cast registry keyed by clan name. */
645
+ export const SealCastDom = Object.freeze({
646
+ SealDigest: SealDigest.cast,
647
+ SealRoot: SealRoot.cast,
648
+ SealSource: SealSource.cast,
649
+ SealEvent: SealEvent.cast,
650
+ SealLast: SealLast.cast,
651
+ SealBack: SealBack.cast,
652
+ SealKind: SealKind.cast,
653
+ });
654
+ /** KERIpy alias for `SealCastDom`. */
655
+ export const SCastDom = SealCastDom;
656
+ /** Blind-state clan registry (`BlindState`, `BoundState`). */
657
+ export const BlindStateClanDom = Object.freeze({
658
+ BlindState,
659
+ BoundState,
660
+ });
661
+ /** KERIpy alias for `BlindStateClanDom`. */
662
+ export const BSClanDom = BlindStateClanDom;
663
+ /** Blind-state cast registry keyed by clan name. */
664
+ export const BlindStateCastDom = Object.freeze({
665
+ BlindState: BlindState.cast,
666
+ BoundState: BoundState.cast,
667
+ });
668
+ /** KERIpy alias for `BlindStateCastDom`. */
669
+ export const BSCastDom = BlindStateCastDom;
670
+ /** Typed-media clan registry (`TypeMedia`). */
671
+ export const TypeMediaClanDom = Object.freeze({
672
+ TypeMedia,
673
+ });
674
+ /** KERIpy alias for `TypeMediaClanDom`. */
675
+ export const TMClanDom = TypeMediaClanDom;
676
+ /** Typed-media cast registry keyed by clan name. */
677
+ export const TypeMediaCastDom = Object.freeze({
678
+ TypeMedia: TypeMedia.cast,
679
+ });
680
+ /** KERIpy alias for `TypeMediaCastDom`. */
681
+ export const TMCastDom = TypeMediaCastDom;
682
+ /** All structing clan registries combined into one authoritative CESR view. */
683
+ export const AllClanDom = Object.freeze({
684
+ ...SealClanDom,
685
+ ...BlindStateClanDom,
686
+ ...TypeMediaClanDom,
687
+ });
688
+ /** KERIpy alias for `AllClanDom`. */
689
+ export const AClanDom = AllClanDom;
690
+ /** All structing cast registries combined into one authoritative CESR view. */
691
+ export const AllCastDom = Object.freeze({
692
+ ...SealCastDom,
693
+ ...BlindStateCastDom,
694
+ ...TypeMediaCastDom,
695
+ });
696
+ /** KERIpy alias for `AllCastDom`. */
697
+ export const ACastDom = AllCastDom;
698
+ /** Ordered seal descriptor registry for raw-SAD projection helpers. */
699
+ export const SealDescriptors = Object.freeze([
700
+ SealDigest,
701
+ SealRoot,
702
+ SealSource,
703
+ SealEvent,
704
+ SealLast,
705
+ SealBack,
706
+ SealKind,
707
+ ]);
708
+ /**
709
+ * Authoritative clan-name -> semantic counter-name map for structing families.
710
+ *
711
+ * This mirrors KERIpy `ClanToCodens`, but stores semantic counter names rather
712
+ * than Python codex members.
713
+ */
714
+ export const ClanToCodens = Object.freeze({
715
+ SealDigest: SealDigest.coden,
716
+ SealRoot: SealRoot.coden,
717
+ SealSource: SealSource.coden,
718
+ SealEvent: SealEvent.coden,
719
+ SealLast: SealLast.coden,
720
+ SealBack: SealBack.coden,
721
+ SealKind: SealKind.coden,
722
+ BlindState: BlindState.coden,
723
+ BoundState: BoundState.coden,
724
+ TypeMedia: TypeMedia.coden,
725
+ });
726
+ /** Inverse semantic counter-name -> clan-name registry for structing families. */
727
+ export const CodenToClans = invertClanCodens(ClanToCodens);