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,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
+ }