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.
- package/README.md +101 -5
- package/dist/buffer-polyfill.d.ts +1 -0
- package/dist/exports.d.ts +40 -0
- package/dist/index.d.ts +4 -1
- package/dist/keri/app/aiding.d.ts +138 -0
- package/dist/keri/app/clienting.d.ts +182 -0
- package/dist/keri/app/contacting.d.ts +93 -0
- package/dist/keri/app/controller.d.ts +49 -0
- package/dist/keri/app/coring.d.ts +121 -0
- package/dist/keri/app/credentialing.d.ts +239 -0
- package/dist/keri/app/escrowing.d.ts +19 -0
- package/dist/keri/app/exchanging.d.ts +60 -0
- package/dist/keri/app/grouping.d.ts +44 -0
- package/dist/keri/app/habery.d.ts +48 -0
- package/dist/keri/app/notifying.d.ts +34 -0
- package/dist/keri/core/authing.d.ts +10 -0
- package/dist/keri/core/bexter.d.ts +7 -0
- package/dist/keri/core/cigar.d.ts +8 -8
- package/dist/keri/core/cipher.d.ts +5 -5
- package/dist/keri/core/core.d.ts +59 -68
- package/dist/keri/core/counter.d.ts +43 -0
- package/dist/keri/core/decrypter.d.ts +10 -10
- package/dist/keri/core/diger.d.ts +21 -21
- package/dist/keri/core/encrypter.d.ts +9 -9
- package/dist/keri/core/eventing.d.ts +54 -0
- package/dist/keri/core/httping.d.ts +44 -0
- package/dist/keri/core/indexer.d.ts +98 -88
- package/dist/keri/core/keeping.d.ts +103 -1
- package/dist/keri/core/kering.d.ts +5 -5
- package/dist/keri/core/manager.d.ts +174 -151
- package/dist/keri/core/matter.d.ts +116 -47
- package/dist/keri/core/number.d.ts +7 -0
- package/dist/keri/core/pather.d.ts +7 -0
- package/dist/keri/core/prefixer.d.ts +15 -0
- package/dist/keri/core/saider.d.ts +23 -0
- package/dist/keri/core/salter.d.ts +23 -0
- package/dist/keri/core/seqner.d.ts +15 -0
- package/dist/keri/core/serder.d.ts +31 -0
- package/dist/keri/core/siger.d.ts +18 -18
- package/dist/keri/core/signer.d.ts +34 -34
- package/dist/keri/core/tholder.d.ts +29 -0
- package/dist/keri/core/utils.d.ts +20 -14
- package/dist/keri/core/vdring.d.ts +16 -0
- package/dist/keri/core/verfer.d.ts +13 -0
- package/dist/keri/end/ending.d.ts +13 -0
- package/dist/math.d.ts +1 -0
- package/dist/ready.d.ts +1 -0
- package/dist/signify-ts.cjs +7835 -0
- package/dist/signify-ts.cjs.development.js +9493 -5
- package/dist/signify-ts.cjs.development.js.map +1 -1
- package/dist/signify-ts.cjs.map +7 -0
- package/dist/signify-ts.cjs.production.min.js +1 -1
- package/dist/signify-ts.cjs.production.min.js.map +1 -1
- package/dist/signify-ts.esm.js +9341 -5
- package/dist/signify-ts.esm.js.map +1 -1
- package/dist/signify-ts.mjs +7811 -0
- package/dist/signify-ts.mjs.map +7 -0
- package/package.json +51 -49
- package/src/buffer-polyfill.ts +5 -0
- package/src/exports.ts +44 -0
- package/src/index.ts +4 -6
- package/src/keri/app/aiding.ts +493 -0
- package/src/keri/app/clienting.ts +492 -0
- package/src/keri/app/contacting.ts +188 -0
- package/src/keri/app/controller.ts +372 -0
- package/src/keri/app/coring.ts +225 -0
- package/src/keri/app/credentialing.ts +820 -0
- package/src/keri/app/escrowing.ts +34 -0
- package/src/keri/app/exchanging.ts +220 -0
- package/src/keri/app/grouping.ts +90 -0
- package/src/keri/app/habery.ts +185 -0
- package/src/keri/app/notifying.ts +69 -0
- package/src/keri/core/authing.ts +117 -0
- package/src/keri/core/bexter.ts +138 -0
- package/src/keri/core/cigar.ts +11 -12
- package/src/keri/core/cipher.ts +23 -14
- package/src/keri/core/core.ts +249 -97
- package/src/keri/core/counter.ts +273 -0
- package/src/keri/core/decrypter.ts +48 -34
- package/src/keri/core/diger.ts +25 -24
- package/src/keri/core/encrypter.ts +37 -27
- package/src/keri/core/eventing.ts +581 -0
- package/src/keri/core/httping.ts +209 -0
- package/src/keri/core/indexer.ts +314 -211
- package/src/keri/core/keeping.ts +679 -4
- package/src/keri/core/kering.ts +4 -6
- package/src/keri/core/manager.ts +759 -450
- package/src/keri/core/matter.ts +404 -135
- package/src/keri/core/number.ts +66 -0
- package/src/keri/core/pather.ts +98 -0
- package/src/keri/core/prefixer.ts +233 -0
- package/src/keri/core/saider.ts +186 -0
- package/src/keri/core/salter.ts +76 -41
- package/src/keri/core/seqner.ts +46 -0
- package/src/keri/core/serder.ts +163 -0
- package/src/keri/core/siger.ts +19 -18
- package/src/keri/core/signer.ts +74 -53
- package/src/keri/core/tholder.ts +218 -0
- package/src/keri/core/utils.ts +120 -45
- package/src/keri/core/vdring.ts +94 -0
- package/src/keri/core/verfer.ts +25 -11
- package/src/keri/end/ending.ts +170 -0
- package/src/math.ts +3 -0
- package/src/ready.ts +5 -0
- package/src/keri/core/tsconfig.json +0 -100
|
@@ -0,0 +1,581 @@
|
|
|
1
|
+
import {
|
|
2
|
+
b,
|
|
3
|
+
concat,
|
|
4
|
+
Dict,
|
|
5
|
+
Ident,
|
|
6
|
+
Ilks,
|
|
7
|
+
Serials,
|
|
8
|
+
versify,
|
|
9
|
+
Version,
|
|
10
|
+
Versionage,
|
|
11
|
+
} from './core';
|
|
12
|
+
import { Tholder } from './tholder';
|
|
13
|
+
import { CesrNumber } from './number';
|
|
14
|
+
import { Prefixer } from './prefixer';
|
|
15
|
+
import { Serder } from './serder';
|
|
16
|
+
import { MtrDex, NonTransDex } from './matter';
|
|
17
|
+
import { Saider } from './saider';
|
|
18
|
+
import { Siger } from './siger';
|
|
19
|
+
import { Cigar } from './cigar';
|
|
20
|
+
import { Counter, CtrDex } from './counter';
|
|
21
|
+
import { Seqner } from './seqner';
|
|
22
|
+
|
|
23
|
+
const MaxIntThold = 2 ** 32 - 1;
|
|
24
|
+
|
|
25
|
+
export interface RotateArgs {
|
|
26
|
+
pre?: string;
|
|
27
|
+
keys: Array<string>;
|
|
28
|
+
dig?: string;
|
|
29
|
+
ilk?: string;
|
|
30
|
+
sn?: number;
|
|
31
|
+
isith?: number | string | Array<string>;
|
|
32
|
+
ndigs?: Array<string>;
|
|
33
|
+
nsith?: number | string | Array<string>;
|
|
34
|
+
toad?: number;
|
|
35
|
+
wits?: Array<string>;
|
|
36
|
+
cuts?: Array<string>;
|
|
37
|
+
adds?: Array<string>;
|
|
38
|
+
cnfg?: Array<string>;
|
|
39
|
+
data?: Array<object>;
|
|
40
|
+
version?: Version;
|
|
41
|
+
kind?: Serials;
|
|
42
|
+
size?: number;
|
|
43
|
+
intive?: boolean;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export function rotate({
|
|
47
|
+
pre = undefined,
|
|
48
|
+
keys,
|
|
49
|
+
dig = undefined,
|
|
50
|
+
ilk = Ilks.rot,
|
|
51
|
+
sn = 1,
|
|
52
|
+
isith = undefined,
|
|
53
|
+
ndigs = undefined,
|
|
54
|
+
nsith = undefined,
|
|
55
|
+
wits = undefined,
|
|
56
|
+
cuts = undefined,
|
|
57
|
+
adds = undefined,
|
|
58
|
+
toad = undefined,
|
|
59
|
+
data = undefined,
|
|
60
|
+
version = undefined,
|
|
61
|
+
kind = undefined,
|
|
62
|
+
intive = true,
|
|
63
|
+
}: RotateArgs) {
|
|
64
|
+
const vs = versify(Ident.KERI, version, kind, 0);
|
|
65
|
+
const _ilk = ilk;
|
|
66
|
+
if (_ilk != Ilks.rot && _ilk != Ilks.drt) {
|
|
67
|
+
throw new Error(`Invalid ilk = ${ilk} for rot or drt.`);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
const sner = Number(sn);
|
|
71
|
+
if (sner < 1) {
|
|
72
|
+
throw new Error(`Invalid sn = 0x${sner.toString()} for rot or drt.`);
|
|
73
|
+
}
|
|
74
|
+
let _isit: number;
|
|
75
|
+
|
|
76
|
+
if (isith == undefined) {
|
|
77
|
+
_isit = Math.max(1, Math.ceil(keys.length / 2));
|
|
78
|
+
} else {
|
|
79
|
+
_isit = isith as number;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
const tholder = new Tholder({ sith: _isit });
|
|
83
|
+
if (tholder.num != undefined && tholder.num < 1) {
|
|
84
|
+
throw new Error(`Invalid sith = ${tholder.num} less than 1.`);
|
|
85
|
+
}
|
|
86
|
+
if (tholder.size > keys.length) {
|
|
87
|
+
throw new Error(`Invalid sith = ${tholder.num} for keys = ${keys}`);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
let _ndigs: Array<string>;
|
|
91
|
+
|
|
92
|
+
if (ndigs === undefined) {
|
|
93
|
+
_ndigs = [];
|
|
94
|
+
} else {
|
|
95
|
+
_ndigs = ndigs;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
let _nsith;
|
|
99
|
+
if (nsith === undefined) {
|
|
100
|
+
_nsith = Math.max(1, Math.ceil(_ndigs.length / 2));
|
|
101
|
+
} else {
|
|
102
|
+
_nsith = nsith;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
const ntholder = new Tholder({ sith: _nsith });
|
|
106
|
+
if (ntholder.num != undefined && ntholder.num < 1) {
|
|
107
|
+
throw new Error(`Invalid sith = ${ntholder.num} less than 1.`);
|
|
108
|
+
}
|
|
109
|
+
if (ntholder.size > _ndigs.length) {
|
|
110
|
+
throw new Error(`Invalid sith = ${ntholder.num} for ndigs = ${ndigs}`);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
let _wits: Array<string>;
|
|
114
|
+
if (wits === undefined) {
|
|
115
|
+
_wits = [];
|
|
116
|
+
} else {
|
|
117
|
+
_wits = wits;
|
|
118
|
+
}
|
|
119
|
+
const witset = new Set(_wits);
|
|
120
|
+
if (witset.size != _wits.length) {
|
|
121
|
+
throw new Error(`Invalid wits = ${wits}, has duplicates.`);
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
let _cuts: Array<string>;
|
|
125
|
+
if (cuts === undefined) {
|
|
126
|
+
_cuts = [];
|
|
127
|
+
} else {
|
|
128
|
+
_cuts = cuts;
|
|
129
|
+
}
|
|
130
|
+
const cutset = new Set(_cuts);
|
|
131
|
+
if (cutset.size != _cuts.length) {
|
|
132
|
+
throw new Error(`Invalid cuts = ${cuts}, has duplicates.`);
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
let _adds: Array<string>;
|
|
136
|
+
if (adds === undefined) {
|
|
137
|
+
_adds = [];
|
|
138
|
+
} else {
|
|
139
|
+
_adds = adds;
|
|
140
|
+
}
|
|
141
|
+
const addset = new Set(_adds);
|
|
142
|
+
|
|
143
|
+
//non empty intersection of witset and addset
|
|
144
|
+
const witaddset = new Set([...witset].filter((x) => addset.has(x)));
|
|
145
|
+
if (witaddset.size > 0) {
|
|
146
|
+
throw new Error(
|
|
147
|
+
`Invalid member combination among wits = ${wits}, and adds = ${adds}.`
|
|
148
|
+
);
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
// non empty intersection of cutset and addset
|
|
152
|
+
const cutaddset = new Set([...cutset].filter((x) => addset.has(x)));
|
|
153
|
+
if (cutaddset.size > 0) {
|
|
154
|
+
throw new Error(
|
|
155
|
+
`Invalid member combination among cuts = ${cuts}, and adds = ${adds}.`
|
|
156
|
+
);
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
const newitsetdiff = new Set(_wits);
|
|
160
|
+
_cuts.forEach(function (v) {
|
|
161
|
+
newitsetdiff.delete(v);
|
|
162
|
+
});
|
|
163
|
+
const newitset = new Set(
|
|
164
|
+
(function* () {
|
|
165
|
+
yield* newitsetdiff;
|
|
166
|
+
yield* addset;
|
|
167
|
+
})()
|
|
168
|
+
);
|
|
169
|
+
|
|
170
|
+
if (newitset.size != witset.size - cutset.size + addset.size) {
|
|
171
|
+
throw new Error(
|
|
172
|
+
`Invalid member combination among wits = ${wits}, cuts = ${cuts}, and adds = ${adds}.`
|
|
173
|
+
);
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
let _toad: number;
|
|
177
|
+
|
|
178
|
+
if (toad === undefined) {
|
|
179
|
+
if (newitset.size == 0) {
|
|
180
|
+
_toad = 0;
|
|
181
|
+
} else {
|
|
182
|
+
_toad = ample(newitset.size);
|
|
183
|
+
}
|
|
184
|
+
} else {
|
|
185
|
+
_toad = toad;
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
if (newitset.size > 0) {
|
|
189
|
+
if (_toad < 1 || _toad > newitset.size) {
|
|
190
|
+
throw new Error(`Invalid toad = ${_toad} for wit = ${wits}`);
|
|
191
|
+
}
|
|
192
|
+
} else {
|
|
193
|
+
if (_toad != 0) {
|
|
194
|
+
throw new Error(`Invalid toad = ${_toad} for wit = ${wits}`);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
const _ked = {
|
|
198
|
+
v: vs,
|
|
199
|
+
t: _ilk,
|
|
200
|
+
d: '',
|
|
201
|
+
i: pre,
|
|
202
|
+
s: sner.toString(16),
|
|
203
|
+
p: dig,
|
|
204
|
+
kt:
|
|
205
|
+
tholder.num &&
|
|
206
|
+
intive &&
|
|
207
|
+
tholder.num !== undefined &&
|
|
208
|
+
tholder.num <= MaxIntThold
|
|
209
|
+
? tholder.num.toString(16)
|
|
210
|
+
: tholder.sith,
|
|
211
|
+
k: keys,
|
|
212
|
+
nt:
|
|
213
|
+
ntholder.num &&
|
|
214
|
+
intive &&
|
|
215
|
+
ntholder.num !== undefined &&
|
|
216
|
+
ntholder.num <= MaxIntThold
|
|
217
|
+
? ntholder.num.toString(16)
|
|
218
|
+
: ntholder.sith,
|
|
219
|
+
n: _ndigs,
|
|
220
|
+
bt:
|
|
221
|
+
_toad && intive && _toad !== undefined && _toad <= MaxIntThold
|
|
222
|
+
? _toad
|
|
223
|
+
: _toad.toString(16),
|
|
224
|
+
br: cuts,
|
|
225
|
+
ba: adds,
|
|
226
|
+
a: data != undefined ? data : [],
|
|
227
|
+
};
|
|
228
|
+
const [, ked] = Saider.saidify(_ked);
|
|
229
|
+
return new Serder(ked);
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
export function ample(n: number, f?: number, weak = true) {
|
|
233
|
+
n = Math.max(0, n); // no negatives
|
|
234
|
+
let f1;
|
|
235
|
+
if (f == undefined) {
|
|
236
|
+
f1 = Math.max(1, Math.floor(Math.max(0, n - 1) / 3)); // least floor f subject to n >= 3*f+1
|
|
237
|
+
|
|
238
|
+
const f2 = Math.max(1, Math.ceil(Math.max(0, n - 1) / 3)); // most Math.ceil f subject to n >= 3*f+1
|
|
239
|
+
if (weak) {
|
|
240
|
+
// try both fs to see which one has lowest m
|
|
241
|
+
return Math.min(
|
|
242
|
+
n,
|
|
243
|
+
Math.ceil((n + f1 + 1) / 2),
|
|
244
|
+
Math.ceil((n + f2 + 1) / 2)
|
|
245
|
+
);
|
|
246
|
+
} else {
|
|
247
|
+
return Math.min(
|
|
248
|
+
n,
|
|
249
|
+
Math.max(0, n - f1, Math.ceil((n + f1 + 1) / 2))
|
|
250
|
+
);
|
|
251
|
+
}
|
|
252
|
+
} else {
|
|
253
|
+
f = Math.max(0, f);
|
|
254
|
+
const m1 = Math.ceil((n + f + 1) / 2);
|
|
255
|
+
const m2 = Math.max(0, n - f);
|
|
256
|
+
if (m2 < m1 && n > 0) {
|
|
257
|
+
throw new Error(`Invalid f=${f} is too big for n=${n}.`);
|
|
258
|
+
}
|
|
259
|
+
if (weak) {
|
|
260
|
+
return Math.min(n, m1, m2);
|
|
261
|
+
} else {
|
|
262
|
+
return Math.min(n, Math.max(m1, m2));
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
export interface InceptArgs {
|
|
268
|
+
keys: Array<string>;
|
|
269
|
+
isith?: number | string | Array<string>;
|
|
270
|
+
ndigs?: Array<string>;
|
|
271
|
+
nsith?: number | string | Array<string>;
|
|
272
|
+
toad?: number | string;
|
|
273
|
+
wits?: Array<string>;
|
|
274
|
+
cnfg?: Array<string>;
|
|
275
|
+
data?: Array<object>;
|
|
276
|
+
version?: Version;
|
|
277
|
+
kind?: Serials;
|
|
278
|
+
code?: string;
|
|
279
|
+
intive?: boolean;
|
|
280
|
+
delpre?: string;
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
export function incept({
|
|
284
|
+
keys,
|
|
285
|
+
isith,
|
|
286
|
+
ndigs,
|
|
287
|
+
nsith,
|
|
288
|
+
toad,
|
|
289
|
+
wits,
|
|
290
|
+
cnfg,
|
|
291
|
+
data,
|
|
292
|
+
version = Versionage,
|
|
293
|
+
kind = Serials.JSON,
|
|
294
|
+
code,
|
|
295
|
+
intive = false,
|
|
296
|
+
delpre,
|
|
297
|
+
}: InceptArgs) {
|
|
298
|
+
const vs = versify(Ident.KERI, version, kind, 0);
|
|
299
|
+
const ilk = delpre == undefined ? Ilks.icp : Ilks.dip;
|
|
300
|
+
const sner = new CesrNumber({}, 0);
|
|
301
|
+
|
|
302
|
+
if (isith == undefined) {
|
|
303
|
+
isith = Math.max(1, Math.ceil(keys.length / 2));
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
const tholder = new Tholder({ sith: isith });
|
|
307
|
+
if (tholder.num != undefined && tholder.num < 1) {
|
|
308
|
+
throw new Error(`Invalid sith = ${tholder.num} less than 1.`);
|
|
309
|
+
}
|
|
310
|
+
if (tholder.size > keys.length) {
|
|
311
|
+
throw new Error(`Invalid sith = ${tholder.num} for keys ${keys}`);
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
if (ndigs == undefined) {
|
|
315
|
+
ndigs = new Array<string>();
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
if (nsith == undefined) {
|
|
319
|
+
nsith = Math.max(0, Math.ceil(ndigs.length / 2));
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
const ntholder = new Tholder({ sith: nsith });
|
|
323
|
+
if (ntholder.num != undefined && ntholder.num < 0) {
|
|
324
|
+
throw new Error(`Invalid nsith = ${ntholder.num} less than 0.`);
|
|
325
|
+
}
|
|
326
|
+
if (ntholder.size > keys.length) {
|
|
327
|
+
throw new Error(`Invalid nsith = ${ntholder.num} for keys ${ndigs}`);
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
wits = wits == undefined ? [] : wits;
|
|
331
|
+
if (new Set(wits).size != wits.length) {
|
|
332
|
+
throw new Error(`Invalid wits = ${wits}, has duplicates.`);
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
if (toad == undefined) {
|
|
336
|
+
if (wits.length == 0) {
|
|
337
|
+
toad = 0;
|
|
338
|
+
} else {
|
|
339
|
+
toad = ample(wits.length);
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
const toader = new CesrNumber({}, toad);
|
|
344
|
+
if (wits.length > 0) {
|
|
345
|
+
if (toader.num < 1 || toader.num > wits.length) {
|
|
346
|
+
throw new Error(`Invalid toad = ${toader.num} for wits = ${wits}`);
|
|
347
|
+
}
|
|
348
|
+
} else {
|
|
349
|
+
if (toader.num != 0) {
|
|
350
|
+
throw new Error(`Invalid toad = ${toader.num} for wits = ${wits}`);
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
cnfg = cnfg == undefined ? new Array<string>() : cnfg;
|
|
355
|
+
data = data == undefined ? new Array<object>() : data;
|
|
356
|
+
|
|
357
|
+
let ked = {
|
|
358
|
+
v: vs,
|
|
359
|
+
t: ilk,
|
|
360
|
+
d: '',
|
|
361
|
+
i: '',
|
|
362
|
+
s: sner.numh,
|
|
363
|
+
kt: intive && tholder.num != undefined ? tholder.num : tholder.sith,
|
|
364
|
+
k: keys,
|
|
365
|
+
nt: intive && tholder.num != undefined ? ntholder.num : ntholder.sith,
|
|
366
|
+
n: ndigs,
|
|
367
|
+
bt: intive ? toader.num : toader.numh,
|
|
368
|
+
b: wits,
|
|
369
|
+
c: cnfg,
|
|
370
|
+
a: data,
|
|
371
|
+
} as Dict<any>;
|
|
372
|
+
|
|
373
|
+
if (delpre != undefined) {
|
|
374
|
+
ked['di'] = delpre;
|
|
375
|
+
if (code == undefined) {
|
|
376
|
+
code = MtrDex.Blake3_256;
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
let prefixer;
|
|
381
|
+
if (delpre == undefined && code == undefined && keys.length == 1) {
|
|
382
|
+
prefixer = new Prefixer({ qb64: keys[0] });
|
|
383
|
+
if (prefixer.digestive) {
|
|
384
|
+
throw new Error(
|
|
385
|
+
`Invalid code, digestive=${prefixer.code}, must be derived from ked.`
|
|
386
|
+
);
|
|
387
|
+
}
|
|
388
|
+
} else {
|
|
389
|
+
prefixer = new Prefixer({ code: code }, ked);
|
|
390
|
+
if (delpre != undefined) {
|
|
391
|
+
if (!prefixer.digestive) {
|
|
392
|
+
throw new Error(
|
|
393
|
+
`Invalid derivation code = ${prefixer.code} for delegation. Must be digestive`
|
|
394
|
+
);
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
ked['i'] = prefixer.qb64;
|
|
400
|
+
if (prefixer.digestive) {
|
|
401
|
+
ked['d'] = prefixer.qb64;
|
|
402
|
+
} else {
|
|
403
|
+
[, ked] = Saider.saidify(ked);
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
return new Serder(ked);
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
export function messagize(
|
|
410
|
+
serder: Serder,
|
|
411
|
+
sigers?: Array<Siger>,
|
|
412
|
+
seal?: any,
|
|
413
|
+
wigers?: Array<Cigar>,
|
|
414
|
+
cigars?: Array<Cigar>,
|
|
415
|
+
pipelined: boolean = false
|
|
416
|
+
): Uint8Array {
|
|
417
|
+
let msg = new Uint8Array(b(serder.raw));
|
|
418
|
+
let atc = new Uint8Array();
|
|
419
|
+
|
|
420
|
+
if (sigers == undefined && wigers == undefined && cigars == undefined) {
|
|
421
|
+
throw new Error(
|
|
422
|
+
`Missing attached signatures on message = ${serder.ked}.`
|
|
423
|
+
);
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
if (sigers != undefined) {
|
|
427
|
+
if (seal != undefined) {
|
|
428
|
+
if (seal[0] == 'SealEvent') {
|
|
429
|
+
atc = concat(
|
|
430
|
+
atc,
|
|
431
|
+
new Counter({ code: CtrDex.TransIdxSigGroups, count: 1 })
|
|
432
|
+
.qb64b
|
|
433
|
+
);
|
|
434
|
+
atc = concat(atc, new TextEncoder().encode(seal[1].i));
|
|
435
|
+
atc = concat(
|
|
436
|
+
atc,
|
|
437
|
+
new Seqner({ sn: parseInt(seal[1].s) }).qb64b
|
|
438
|
+
);
|
|
439
|
+
atc = concat(atc, new TextEncoder().encode(seal[1].d));
|
|
440
|
+
} else if (seal[0] == 'SealLast') {
|
|
441
|
+
atc = concat(
|
|
442
|
+
atc,
|
|
443
|
+
new Counter({
|
|
444
|
+
code: CtrDex.TransLastIdxSigGroups,
|
|
445
|
+
count: 1,
|
|
446
|
+
}).qb64b
|
|
447
|
+
);
|
|
448
|
+
atc = concat(atc, new TextEncoder().encode(seal[1].i));
|
|
449
|
+
}
|
|
450
|
+
}
|
|
451
|
+
|
|
452
|
+
atc = concat(
|
|
453
|
+
atc,
|
|
454
|
+
new Counter({
|
|
455
|
+
code: CtrDex.ControllerIdxSigs,
|
|
456
|
+
count: sigers.length,
|
|
457
|
+
}).qb64b
|
|
458
|
+
);
|
|
459
|
+
sigers.forEach((siger) => {
|
|
460
|
+
atc = concat(atc, siger.qb64b);
|
|
461
|
+
});
|
|
462
|
+
}
|
|
463
|
+
|
|
464
|
+
if (wigers != undefined) {
|
|
465
|
+
atc = concat(
|
|
466
|
+
atc,
|
|
467
|
+
new Counter({
|
|
468
|
+
code: CtrDex.ControllerIdxSigs,
|
|
469
|
+
count: wigers.length,
|
|
470
|
+
}).qb64b
|
|
471
|
+
);
|
|
472
|
+
|
|
473
|
+
wigers.forEach((wiger) => {
|
|
474
|
+
if (wiger.verfer && !(wiger.verfer.code in NonTransDex)) {
|
|
475
|
+
throw new Error(
|
|
476
|
+
`Attempt to use tranferable prefix=${wiger.verfer.qb64} for receipt.`
|
|
477
|
+
);
|
|
478
|
+
}
|
|
479
|
+
atc = concat(atc, wiger.qb64b);
|
|
480
|
+
});
|
|
481
|
+
}
|
|
482
|
+
|
|
483
|
+
if (cigars != undefined) {
|
|
484
|
+
atc = concat(
|
|
485
|
+
atc,
|
|
486
|
+
new Counter({
|
|
487
|
+
code: CtrDex.ControllerIdxSigs,
|
|
488
|
+
count: cigars.length,
|
|
489
|
+
}).qb64b
|
|
490
|
+
);
|
|
491
|
+
|
|
492
|
+
cigars.forEach((cigar) => {
|
|
493
|
+
if (cigar.verfer && !(cigar.verfer.code in NonTransDex)) {
|
|
494
|
+
throw new Error(
|
|
495
|
+
`Attempt to use tranferable prefix=${cigar.verfer.qb64} for receipt.`
|
|
496
|
+
);
|
|
497
|
+
}
|
|
498
|
+
atc = concat(atc, cigar.qb64b);
|
|
499
|
+
});
|
|
500
|
+
}
|
|
501
|
+
|
|
502
|
+
if (pipelined) {
|
|
503
|
+
if (atc.length % 4 != 0) {
|
|
504
|
+
throw new Error(
|
|
505
|
+
`Invalid attachments size=${atc.length}, nonintegral quadlets.`
|
|
506
|
+
);
|
|
507
|
+
}
|
|
508
|
+
msg = concat(
|
|
509
|
+
msg,
|
|
510
|
+
new Counter({
|
|
511
|
+
code: CtrDex.AttachedMaterialQuadlets,
|
|
512
|
+
count: Math.floor(atc.length / 4),
|
|
513
|
+
}).qb64b
|
|
514
|
+
);
|
|
515
|
+
}
|
|
516
|
+
msg = concat(msg, atc);
|
|
517
|
+
return msg;
|
|
518
|
+
}
|
|
519
|
+
|
|
520
|
+
interface InteractArgs {
|
|
521
|
+
pre: string;
|
|
522
|
+
dig: string;
|
|
523
|
+
sn: number;
|
|
524
|
+
data: Array<any>;
|
|
525
|
+
version: Version | undefined;
|
|
526
|
+
kind: Serials | undefined;
|
|
527
|
+
}
|
|
528
|
+
|
|
529
|
+
export function interact(args: InteractArgs): Serder {
|
|
530
|
+
let { pre, dig, sn, data, version, kind } = args;
|
|
531
|
+
const vs = versify(Ident.KERI, version, kind, 0);
|
|
532
|
+
const ilk = Ilks.ixn;
|
|
533
|
+
const sner = new CesrNumber({}, sn);
|
|
534
|
+
|
|
535
|
+
if (sner.num < 1) {
|
|
536
|
+
throw new Error(`Invalid sn = 0x${sner.numh} for ixn.`);
|
|
537
|
+
}
|
|
538
|
+
|
|
539
|
+
data = data == undefined ? new Array<any>() : data;
|
|
540
|
+
|
|
541
|
+
let ked = {
|
|
542
|
+
v: vs,
|
|
543
|
+
t: ilk,
|
|
544
|
+
d: '',
|
|
545
|
+
i: pre,
|
|
546
|
+
s: sner.numh,
|
|
547
|
+
p: dig,
|
|
548
|
+
a: data,
|
|
549
|
+
} as Dict<any>;
|
|
550
|
+
|
|
551
|
+
[, ked] = Saider.saidify(ked);
|
|
552
|
+
|
|
553
|
+
return new Serder(ked);
|
|
554
|
+
}
|
|
555
|
+
|
|
556
|
+
export function reply(
|
|
557
|
+
route: string = '',
|
|
558
|
+
data: any | undefined,
|
|
559
|
+
stamp: string | undefined,
|
|
560
|
+
version: Version | undefined,
|
|
561
|
+
kind: Serials = Serials.JSON
|
|
562
|
+
) {
|
|
563
|
+
const vs = versify(Ident.KERI, version, kind, 0);
|
|
564
|
+
if (data == undefined) {
|
|
565
|
+
data = {};
|
|
566
|
+
}
|
|
567
|
+
const _sad = {
|
|
568
|
+
v: vs,
|
|
569
|
+
t: Ilks.rpy,
|
|
570
|
+
d: '',
|
|
571
|
+
dt: stamp ?? new Date().toISOString().replace('Z', '000+00:00'),
|
|
572
|
+
r: route,
|
|
573
|
+
a: data,
|
|
574
|
+
};
|
|
575
|
+
const [, sad] = Saider.saidify(_sad);
|
|
576
|
+
const saider = new Saider({ qb64: sad['d'] });
|
|
577
|
+
|
|
578
|
+
if (!saider.verify(sad, true, true, kind, 'd'))
|
|
579
|
+
throw new Error(`Invalid said = ${saider.qb64} for reply msg=${sad}.`);
|
|
580
|
+
return new Serder(sad);
|
|
581
|
+
}
|