signify-ts 0.1.0 → 0.2.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 (105) hide show
  1. package/README.md +101 -5
  2. package/dist/buffer-polyfill.d.ts +1 -0
  3. package/dist/exports.d.ts +40 -0
  4. package/dist/index.d.ts +4 -1
  5. package/dist/keri/app/aiding.d.ts +138 -0
  6. package/dist/keri/app/clienting.d.ts +182 -0
  7. package/dist/keri/app/contacting.d.ts +93 -0
  8. package/dist/keri/app/controller.d.ts +49 -0
  9. package/dist/keri/app/coring.d.ts +121 -0
  10. package/dist/keri/app/credentialing.d.ts +239 -0
  11. package/dist/keri/app/escrowing.d.ts +19 -0
  12. package/dist/keri/app/exchanging.d.ts +60 -0
  13. package/dist/keri/app/grouping.d.ts +44 -0
  14. package/dist/keri/app/habery.d.ts +48 -0
  15. package/dist/keri/app/notifying.d.ts +34 -0
  16. package/dist/keri/core/authing.d.ts +10 -0
  17. package/dist/keri/core/bexter.d.ts +7 -0
  18. package/dist/keri/core/cigar.d.ts +8 -8
  19. package/dist/keri/core/cipher.d.ts +5 -5
  20. package/dist/keri/core/core.d.ts +59 -68
  21. package/dist/keri/core/counter.d.ts +43 -0
  22. package/dist/keri/core/decrypter.d.ts +10 -10
  23. package/dist/keri/core/diger.d.ts +21 -21
  24. package/dist/keri/core/encrypter.d.ts +9 -9
  25. package/dist/keri/core/eventing.d.ts +54 -0
  26. package/dist/keri/core/httping.d.ts +44 -0
  27. package/dist/keri/core/indexer.d.ts +98 -88
  28. package/dist/keri/core/keeping.d.ts +103 -1
  29. package/dist/keri/core/kering.d.ts +5 -5
  30. package/dist/keri/core/manager.d.ts +174 -151
  31. package/dist/keri/core/matter.d.ts +116 -47
  32. package/dist/keri/core/number.d.ts +7 -0
  33. package/dist/keri/core/pather.d.ts +7 -0
  34. package/dist/keri/core/prefixer.d.ts +15 -0
  35. package/dist/keri/core/saider.d.ts +23 -0
  36. package/dist/keri/core/salter.d.ts +23 -0
  37. package/dist/keri/core/seqner.d.ts +15 -0
  38. package/dist/keri/core/serder.d.ts +31 -0
  39. package/dist/keri/core/siger.d.ts +18 -18
  40. package/dist/keri/core/signer.d.ts +34 -34
  41. package/dist/keri/core/tholder.d.ts +29 -0
  42. package/dist/keri/core/utils.d.ts +20 -14
  43. package/dist/keri/core/vdring.d.ts +16 -0
  44. package/dist/keri/core/verfer.d.ts +13 -0
  45. package/dist/keri/end/ending.d.ts +13 -0
  46. package/dist/math.d.ts +1 -0
  47. package/dist/ready.d.ts +1 -0
  48. package/dist/signify-ts.cjs +7835 -0
  49. package/dist/signify-ts.cjs.development.js +9493 -5
  50. package/dist/signify-ts.cjs.development.js.map +1 -1
  51. package/dist/signify-ts.cjs.map +7 -0
  52. package/dist/signify-ts.cjs.production.min.js +1 -1
  53. package/dist/signify-ts.cjs.production.min.js.map +1 -1
  54. package/dist/signify-ts.esm.js +9341 -5
  55. package/dist/signify-ts.esm.js.map +1 -1
  56. package/dist/signify-ts.mjs +7811 -0
  57. package/dist/signify-ts.mjs.map +7 -0
  58. package/package.json +51 -49
  59. package/src/buffer-polyfill.ts +5 -0
  60. package/src/exports.ts +44 -0
  61. package/src/index.ts +4 -6
  62. package/src/keri/app/aiding.ts +493 -0
  63. package/src/keri/app/clienting.ts +492 -0
  64. package/src/keri/app/contacting.ts +188 -0
  65. package/src/keri/app/controller.ts +372 -0
  66. package/src/keri/app/coring.ts +225 -0
  67. package/src/keri/app/credentialing.ts +820 -0
  68. package/src/keri/app/escrowing.ts +34 -0
  69. package/src/keri/app/exchanging.ts +220 -0
  70. package/src/keri/app/grouping.ts +90 -0
  71. package/src/keri/app/habery.ts +185 -0
  72. package/src/keri/app/notifying.ts +69 -0
  73. package/src/keri/core/authing.ts +117 -0
  74. package/src/keri/core/bexter.ts +138 -0
  75. package/src/keri/core/cigar.ts +11 -12
  76. package/src/keri/core/cipher.ts +23 -14
  77. package/src/keri/core/core.ts +249 -97
  78. package/src/keri/core/counter.ts +273 -0
  79. package/src/keri/core/decrypter.ts +48 -34
  80. package/src/keri/core/diger.ts +25 -24
  81. package/src/keri/core/encrypter.ts +37 -27
  82. package/src/keri/core/eventing.ts +581 -0
  83. package/src/keri/core/httping.ts +209 -0
  84. package/src/keri/core/indexer.ts +314 -211
  85. package/src/keri/core/keeping.ts +679 -4
  86. package/src/keri/core/kering.ts +4 -6
  87. package/src/keri/core/manager.ts +759 -450
  88. package/src/keri/core/matter.ts +404 -135
  89. package/src/keri/core/number.ts +66 -0
  90. package/src/keri/core/pather.ts +98 -0
  91. package/src/keri/core/prefixer.ts +233 -0
  92. package/src/keri/core/saider.ts +186 -0
  93. package/src/keri/core/salter.ts +76 -41
  94. package/src/keri/core/seqner.ts +46 -0
  95. package/src/keri/core/serder.ts +163 -0
  96. package/src/keri/core/siger.ts +19 -18
  97. package/src/keri/core/signer.ts +74 -53
  98. package/src/keri/core/tholder.ts +218 -0
  99. package/src/keri/core/utils.ts +120 -45
  100. package/src/keri/core/vdring.ts +94 -0
  101. package/src/keri/core/verfer.ts +25 -11
  102. package/src/keri/end/ending.ts +170 -0
  103. package/src/math.ts +3 -0
  104. package/src/ready.ts +5 -0
  105. package/src/keri/core/tsconfig.json +0 -100
@@ -0,0 +1,66 @@
1
+ import { Matter, MatterArgs, NumDex } from './matter';
2
+ import { bytesToInt, intToBytes } from './utils';
3
+
4
+ export class CesrNumber extends Matter {
5
+ constructor(
6
+ { raw, code, qb64b, qb64, qb2 }: MatterArgs,
7
+ num?: number | string,
8
+ numh?: string
9
+ ) {
10
+ let _num;
11
+ if (
12
+ raw == undefined &&
13
+ qb64 == undefined &&
14
+ qb64b == undefined &&
15
+ qb2 == undefined
16
+ ) {
17
+ if (typeof num == 'number') {
18
+ _num = num;
19
+ } else if (numh != undefined) {
20
+ _num = parseInt(numh, 16);
21
+ } else {
22
+ _num = 0;
23
+ }
24
+ }
25
+
26
+ if (_num == undefined) {
27
+ throw new Error('Invalid whole number');
28
+ }
29
+
30
+ if (_num <= 256 ** 2 - 1) {
31
+ // make short version of code
32
+ code = NumDex.Short;
33
+ } else if (_num <= 256 ** 4 - 1) {
34
+ // make long version of code
35
+ code = code = NumDex.Long;
36
+ } else if (_num <= 256 ** 8 - 1) {
37
+ // make big version of code
38
+ code = code = NumDex.Big;
39
+ } else if (_num <= 256 ** 16 - 1) {
40
+ // make huge version of code
41
+ code = code = NumDex.Huge;
42
+ } else {
43
+ throw new Error('Invalid num = {num}, too large to encode.');
44
+ }
45
+
46
+ raw = intToBytes(_num, Matter._rawSize(code));
47
+
48
+ super({ raw, code, qb64b, qb64, qb2 });
49
+
50
+ if (!NumDex.has(this.code)) {
51
+ throw new Error('Invalid code ' + code + ' for Number');
52
+ }
53
+ }
54
+
55
+ get num(): number {
56
+ return bytesToInt(this.raw);
57
+ }
58
+
59
+ get numh(): string {
60
+ return this.num.toString(16);
61
+ }
62
+
63
+ get positive(): boolean {
64
+ return this.num > 0;
65
+ }
66
+ }
@@ -0,0 +1,98 @@
1
+ import { Bexter, Reb64 } from './bexter';
2
+ import { MatterArgs, MtrDex } from './matter';
3
+ import { EmptyMaterialError } from './kering';
4
+
5
+ /*
6
+ Pather is a subclass of Bexter that provides SAD Path language specific functionality
7
+ for variable length strings that only contain Base64 URL safe characters. Pather allows
8
+ the specification of SAD Paths as a list of field components which will be converted to the
9
+ Base64 URL safe character representation.
10
+
11
+ Additionally, Pather provides .rawify for extracting and serializing the content targeted by
12
+ .path for a SAD, represented as an instance of Serder. Pather enforces Base64 URL character
13
+ safety by leveraging the fact that SADs must have static field ordering. Any field label can
14
+ be replaced by its field ordinal to allow for path specification and traversal for any field
15
+ labels that contain non-Base64 URL safe characters.
16
+
17
+
18
+ Examples: strings:
19
+ path = []
20
+ text = "-"
21
+ qb64 = '6AABAAA-'
22
+
23
+ path = ["A"]
24
+ text = "-A"
25
+ qb64 = '5AABAA-A'
26
+
27
+ path = ["A", "B"]
28
+ text = "-A-B"
29
+ qb64 = '4AAB-A-B'
30
+
31
+ path = ["A", 1, "B", 3]
32
+ text = "-A-1-B-3"
33
+ qb64 = '4AAC-A-1-B-3'
34
+
35
+ */
36
+
37
+ export class Pather extends Bexter {
38
+ constructor(
39
+ { raw, code = MtrDex.StrB64_L0, qb64b, qb64, qb2 }: MatterArgs,
40
+ bext?: string,
41
+ path?: string[]
42
+ ) {
43
+ if (
44
+ raw === undefined &&
45
+ bext === undefined &&
46
+ qb64b === undefined &&
47
+ qb64 === undefined &&
48
+ qb2 === undefined
49
+ ) {
50
+ if (path === undefined)
51
+ throw new EmptyMaterialError('Missing bext string.');
52
+
53
+ bext = Pather._bextify(path);
54
+ }
55
+
56
+ super({ raw, code, qb64b, qb64, qb2 }, bext);
57
+ }
58
+
59
+ // TODO: implement SAD access methods like resolve, root, strip, startswith and tail
60
+
61
+ get path(): string[] {
62
+ if (!this.bext.startsWith('-')) {
63
+ throw new Error('invalid SAD ptr');
64
+ }
65
+
66
+ let path = this.bext;
67
+ while (path.charAt(0) === '-') {
68
+ path = path.substring(1);
69
+ }
70
+
71
+ const apath = path.split('-');
72
+ if (apath[0] !== '') {
73
+ return apath;
74
+ } else {
75
+ return [];
76
+ }
77
+ }
78
+
79
+ static _bextify(path: any[]): string {
80
+ const vath = [];
81
+ for (const p of path) {
82
+ let sp = '';
83
+ if (typeof p === 'number') {
84
+ sp = p.toString();
85
+ } else {
86
+ sp = p;
87
+ }
88
+
89
+ const match = Reb64.exec(sp);
90
+ if (!match) {
91
+ throw new Error(`"Non Base64 path component = ${p}.`);
92
+ }
93
+
94
+ vath.push(sp);
95
+ }
96
+ return '-' + vath.join('-');
97
+ }
98
+ }
@@ -0,0 +1,233 @@
1
+ import { Matter, MatterArgs, MtrDex } from './matter';
2
+ import { EmptyMaterialError } from './kering';
3
+ import { Dict, Ilks } from './core';
4
+ import { sizeify } from './serder';
5
+ import { Verfer } from './verfer';
6
+
7
+ import { blake3 } from '@noble/hashes/blake3';
8
+
9
+ const Dummy: string = '#';
10
+
11
+ export class Prefixer extends Matter {
12
+ private readonly _derive: Function | undefined;
13
+ private readonly _verify: Function | undefined;
14
+
15
+ constructor({ raw, code, qb64b, qb64, qb2 }: MatterArgs, ked?: Dict<any>) {
16
+ try {
17
+ super({ raw, code, qb64b, qb64, qb2 });
18
+ } catch (e) {
19
+ if (e instanceof EmptyMaterialError) {
20
+ if (ked == undefined || (code == undefined && !('i' in ked))) {
21
+ throw e;
22
+ }
23
+
24
+ if (code == undefined) {
25
+ super({ qb64: ked['i'], code: code });
26
+ code = this.code;
27
+ }
28
+
29
+ let _derive;
30
+ if (code == MtrDex.Ed25519N) {
31
+ _derive = Prefixer._derive_ed25519N;
32
+ } else if (code == MtrDex.Ed25519) {
33
+ _derive = Prefixer._derive_ed25519;
34
+ } else if (code == MtrDex.Blake3_256) {
35
+ _derive = Prefixer._derive_blake3_256;
36
+ } else {
37
+ throw new Error(`Unsupported code = ${code} for prefixer.`);
38
+ }
39
+
40
+ [raw, code] = _derive(ked);
41
+ super({ raw: raw, code: code });
42
+ this._derive = _derive;
43
+ } else {
44
+ throw e;
45
+ }
46
+ }
47
+
48
+ if (this.code == MtrDex.Ed25519N) {
49
+ this._verify = this._verify_ed25519N;
50
+ } else if (this.code == MtrDex.Ed25519) {
51
+ this._verify = this._verify_ed25519;
52
+ } else if (this.code == MtrDex.Blake3_256) {
53
+ this._verify = this._verify_blake3_256;
54
+ } else {
55
+ throw new Error(`Unsupported code = ${code} for prefixer.`);
56
+ }
57
+ }
58
+
59
+ derive(ked: Dict<any>): [Uint8Array, string] {
60
+ if (ked['i'] != Ilks.icp) {
61
+ throw new Error(
62
+ `Non-incepting ilk ${ked['i']} for prefix derivation`
63
+ );
64
+ }
65
+ return this._derive!(ked);
66
+ }
67
+
68
+ verify(ked: Dict<any>, prefixed: boolean = false): boolean {
69
+ if (ked['i'] != Ilks.icp) {
70
+ throw new Error(
71
+ `Non-incepting ilk ${ked['i']} for prefix derivation`
72
+ );
73
+ }
74
+ return this._verify!(ked, this.qb64, prefixed);
75
+ }
76
+
77
+ static _derive_ed25519N(ked: Dict<any>): [Uint8Array, string] {
78
+ let verfer;
79
+ const keys = ked['k'];
80
+ if (keys.length != 1) {
81
+ throw new Error(
82
+ `Basic derivation needs at most 1 key got ${keys.length} keys instead`
83
+ );
84
+ }
85
+ try {
86
+ verfer = new Verfer({ qb64: keys[0] });
87
+ } catch (e) {
88
+ throw new Error(`Error extracting public key = ${e}`);
89
+ }
90
+
91
+ if (!(verfer.code in [MtrDex.Ed25519N])) {
92
+ throw new Error(`Mismatch derivation code = ${verfer.code}`);
93
+ }
94
+
95
+ const next = 'n' in ked ? ked['n'] : [];
96
+ if (verfer.code == MtrDex.Ed25519N && next.length > 0) {
97
+ throw new Error(
98
+ `Non-empty nxt = ${next} for non-transferable code = ${verfer.code}`
99
+ );
100
+ }
101
+
102
+ const backers = 'b' in ked ? ked['b'] : [];
103
+ if (verfer.code == MtrDex.Ed25519N && backers.length > 0) {
104
+ throw new Error(
105
+ `Non-empty b =${backers} for non-transferable code = ${verfer.code}`
106
+ );
107
+ }
108
+
109
+ const anchor = 'a' in ked ? ked['a'] : [];
110
+ if (verfer.code == MtrDex.Ed25519N && anchor.length > 0) {
111
+ throw new Error(
112
+ `Non-empty a = ${verfer.code} for non-transferable code = ${verfer.code}`
113
+ );
114
+ }
115
+
116
+ return [verfer.raw, verfer.code];
117
+ }
118
+
119
+ static _derive_ed25519(ked: Dict<any>): [Uint8Array, string] {
120
+ let verfer;
121
+ const keys = ked['k'];
122
+ if (keys.length != 1) {
123
+ throw new Error(
124
+ `Basic derivation needs at most 1 key got ${keys.length} keys instead`
125
+ );
126
+ }
127
+
128
+ try {
129
+ verfer = new Verfer({ qb64: keys[0] });
130
+ } catch (e) {
131
+ throw new Error(`Error extracting public key = ${e}`);
132
+ }
133
+
134
+ if (verfer.code in [MtrDex.Ed25519]) {
135
+ throw new Error(`Mismatch derivation code = ${verfer.code}`);
136
+ }
137
+
138
+ return [verfer.raw, verfer.code];
139
+ }
140
+
141
+ static _derive_blake3_256(ked: Dict<any>): [Uint8Array, string] {
142
+ const kd = ked;
143
+ const ilk = ked['t'];
144
+ if (![Ilks.icp, Ilks.dip, Ilks.vcp, Ilks.dip].includes(ilk)) {
145
+ throw new Error(`Invalid ilk = ${ilk} to derive pre.`);
146
+ }
147
+
148
+ kd['i'] = ''.padStart(Matter.Sizes.get(MtrDex.Blake3_256)!.fs!, Dummy);
149
+ kd['d'] = ked['i'];
150
+ const [raw] = sizeify(ked);
151
+ const dig = Buffer.from(
152
+ blake3.create({ dkLen: 32 }).update(raw).digest()
153
+ );
154
+ return [dig, MtrDex.Blake3_256];
155
+ }
156
+
157
+ _verify_ed25519N(
158
+ ked: Dict<any>,
159
+ pre: string,
160
+ prefixed: boolean = false
161
+ ): boolean {
162
+ try {
163
+ const keys = ked['k'];
164
+ if (keys.length != 1) {
165
+ return false;
166
+ }
167
+
168
+ if (keys[0] != pre) {
169
+ return false;
170
+ }
171
+
172
+ if (prefixed && ked['i'] != pre) {
173
+ return false;
174
+ }
175
+
176
+ const next = 'n' in ked ? ked['n'] : [];
177
+ if (next.length > 0) {
178
+ // must be empty
179
+ return false;
180
+ }
181
+ } catch (e) {
182
+ return false;
183
+ }
184
+
185
+ return true;
186
+ }
187
+
188
+ _verify_ed25519(
189
+ ked: Dict<any>,
190
+ pre: string,
191
+ prefixed: boolean = false
192
+ ): boolean {
193
+ try {
194
+ const keys = ked['k'];
195
+ if (keys.length != 1) {
196
+ return false;
197
+ }
198
+
199
+ if (keys[0] != pre) {
200
+ return false;
201
+ }
202
+
203
+ if (prefixed && ked['i'] != pre) {
204
+ return false;
205
+ }
206
+ } catch (e) {
207
+ return false;
208
+ }
209
+
210
+ return true;
211
+ }
212
+
213
+ _verify_blake3_256(
214
+ ked: Dict<any>,
215
+ pre: string,
216
+ prefixed: boolean = false
217
+ ): boolean {
218
+ try {
219
+ const [raw] = Prefixer._derive_blake3_256(ked);
220
+ const crymat = new Matter({ raw: raw, code: MtrDex.Blake3_256 });
221
+ if (crymat.qb64 != pre) {
222
+ return false;
223
+ }
224
+
225
+ if (prefixed && ked['i'] != pre) {
226
+ return false;
227
+ }
228
+ } catch (e) {
229
+ return false;
230
+ }
231
+ return true;
232
+ }
233
+ }
@@ -0,0 +1,186 @@
1
+ import { DigiDex, Matter, MatterArgs, MtrDex } from './matter';
2
+ import { deversify, Dict, Serials } from './core';
3
+ import { EmptyMaterialError } from './kering';
4
+ import { dumps, sizeify } from './serder';
5
+
6
+ import { blake3 } from '@noble/hashes/blake3';
7
+
8
+ const Dummy = '#';
9
+
10
+ export enum Ids {
11
+ d = 'd',
12
+ }
13
+
14
+ class Digestage {
15
+ public klas: any = undefined;
16
+ public size: number | undefined = 0;
17
+ public length: number | undefined = 0;
18
+ constructor(klas: any, size?: number, length?: number) {
19
+ this.klas = klas;
20
+ this.size = size;
21
+ this.length = length;
22
+ }
23
+ }
24
+
25
+ export class Saider extends Matter {
26
+ static Digests = new Map<string, Digestage>([
27
+ [
28
+ MtrDex.Blake3_256,
29
+ new Digestage(Saider._derive_blake3_256, undefined, undefined),
30
+ ],
31
+ ]);
32
+
33
+ constructor(
34
+ { raw, code, qb64b, qb64, qb2 }: MatterArgs,
35
+ sad?: Dict<any>,
36
+ kind?: Serials,
37
+ label: string = Ids.d
38
+ ) {
39
+ try {
40
+ super({ raw, code, qb64b, qb64, qb2 });
41
+ } catch (e) {
42
+ if (e instanceof EmptyMaterialError) {
43
+ if (sad == undefined || !(label in sad)) {
44
+ throw e;
45
+ }
46
+
47
+ if (code == undefined) {
48
+ if (sad[label] != '') {
49
+ super({ qb64: sad[label], code: code });
50
+ code = this.code;
51
+ } else {
52
+ code = MtrDex.Blake3_256;
53
+ }
54
+ }
55
+
56
+ if (!DigiDex.has(code)) {
57
+ throw new Error(`Unsupported digest code = ${code}`);
58
+ }
59
+
60
+ [raw] = Saider._derive({ ...sad }, code, kind, label);
61
+ super({ raw: raw, code: code });
62
+ } else {
63
+ throw e;
64
+ }
65
+ }
66
+
67
+ if (!this.digestive) {
68
+ throw new Error(`Unsupported digest code = ${this.code}.`);
69
+ }
70
+ }
71
+
72
+ static _derive_blake3_256(
73
+ ser: Uint8Array,
74
+ _digest_size: number,
75
+ _length: number
76
+ ) {
77
+ return Buffer.from(blake3.create({ dkLen: 32 }).update(ser).digest());
78
+ }
79
+
80
+ private static _derive(
81
+ sad: Dict<any>,
82
+ code: string,
83
+ kind: Serials | undefined,
84
+ label: string
85
+ ): [Uint8Array, Dict<any>] {
86
+ if (!DigiDex.has(code) || !Saider.Digests.has(code)) {
87
+ throw new Error(`Unsupported digest code = ${code}.`);
88
+ }
89
+
90
+ sad = { ...sad };
91
+ sad[label] = ''.padStart(Matter.Sizes.get(code)!.fs!, Dummy);
92
+ if ('v' in sad) {
93
+ [, , kind, sad] = sizeify(sad, kind);
94
+ }
95
+
96
+ const ser = { ...sad };
97
+
98
+ const digestage = Saider.Digests.get(code);
99
+
100
+ const cpa = Saider._serialze(ser, kind);
101
+ const args: any[] = [];
102
+ if (digestage!.size != undefined) {
103
+ args.push(digestage!.size);
104
+ }
105
+
106
+ if (digestage!.length != undefined) {
107
+ args.push(digestage!.length);
108
+ }
109
+
110
+ return [digestage!.klas(cpa, ...args), sad];
111
+ }
112
+
113
+ public derive(
114
+ sad: Dict<any>,
115
+ code: string,
116
+ kind: Serials | undefined,
117
+ label: string
118
+ ): [Uint8Array, Dict<any>] {
119
+ code = code != undefined ? code : this.code;
120
+ return Saider._derive(sad, code, kind, label);
121
+ }
122
+
123
+ public verify(
124
+ sad: Dict<any>,
125
+ prefixed: boolean = false,
126
+ versioned: boolean = false,
127
+ kind?: Serials,
128
+ label: string = Ids.d
129
+ ): boolean {
130
+ try {
131
+ const [raw, dsad] = Saider._derive(sad, this.code, kind, label);
132
+ const saider = new Saider({ raw: raw, code: this.code });
133
+ if (this.qb64 != saider.qb64) {
134
+ return false;
135
+ }
136
+
137
+ if ('v' in sad && versioned) {
138
+ if (sad['v'] != dsad['v']) {
139
+ return false;
140
+ }
141
+ }
142
+
143
+ if (prefixed && sad[label] != this.qb64) {
144
+ return false;
145
+ }
146
+ } catch (e) {
147
+ return false;
148
+ }
149
+
150
+ return true;
151
+ }
152
+
153
+ private static _serialze(sad: Dict<any>, kind?: Serials): string {
154
+ let knd = Serials.JSON;
155
+ if ('v' in sad) {
156
+ [, knd] = deversify(sad['v']);
157
+ }
158
+
159
+ if (kind == undefined) {
160
+ kind = knd;
161
+ }
162
+
163
+ return dumps(sad, kind);
164
+ }
165
+
166
+ public static saidify(
167
+ sad: Dict<any>,
168
+ code: string = MtrDex.Blake3_256,
169
+ kind: Serials = Serials.JSON,
170
+ label: string = Ids.d
171
+ ): [Saider, Dict<any>] {
172
+ if (!(label in sad)) {
173
+ throw new Error(`Missing id field labeled=${label} in sad.`);
174
+ }
175
+ let raw;
176
+ [raw, sad] = Saider._derive(sad, code, kind, label);
177
+ const saider = new Saider(
178
+ { raw: raw, code: code },
179
+ undefined,
180
+ kind,
181
+ label
182
+ );
183
+ sad[label] = saider.qb64;
184
+ return [saider, sad];
185
+ }
186
+ }