signify-ts 0.1.1 → 0.2.1

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 (115) hide show
  1. package/README.md +96 -47
  2. package/dist/buffer-polyfill.d.ts +1 -0
  3. package/dist/exports.d.ts +40 -0
  4. package/dist/index.d.ts +4 -3
  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 +245 -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 -47
  15. package/dist/keri/app/notifying.d.ts +34 -0
  16. package/dist/keri/core/authing.d.ts +10 -9
  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 -53
  21. package/dist/keri/core/counter.d.ts +43 -43
  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 -21
  26. package/dist/keri/core/httping.d.ts +44 -34
  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 -172
  31. package/dist/keri/core/matter.d.ts +116 -69
  32. package/dist/keri/core/number.d.ts +7 -6
  33. package/dist/keri/core/pather.d.ts +7 -0
  34. package/dist/keri/core/prefixer.d.ts +15 -15
  35. package/dist/keri/core/saider.d.ts +23 -23
  36. package/dist/keri/core/salter.d.ts +23 -23
  37. package/dist/keri/core/seqner.d.ts +15 -0
  38. package/dist/keri/core/serder.d.ts +31 -23
  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 -14
  42. package/dist/keri/core/utils.d.ts +20 -15
  43. package/dist/keri/core/vdring.d.ts +16 -0
  44. package/dist/keri/core/verfer.d.ts +13 -12
  45. package/dist/keri/end/ending.d.ts +13 -13
  46. package/dist/math.d.ts +1 -0
  47. package/dist/ready.d.ts +1 -0
  48. package/dist/signify-ts.cjs +7842 -0
  49. package/dist/signify-ts.cjs.development.js +6369 -256
  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 +6205 -229
  55. package/dist/signify-ts.esm.js.map +1 -1
  56. package/dist/signify-ts.mjs +7818 -0
  57. package/dist/signify-ts.mjs.map +7 -0
  58. package/package.json +49 -49
  59. package/src/buffer-polyfill.ts +5 -0
  60. package/src/exports.ts +44 -0
  61. package/src/index.ts +4 -5
  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 +841 -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 +118 -85
  72. package/src/keri/app/notifying.ts +69 -0
  73. package/src/keri/core/authing.ts +73 -85
  74. package/src/keri/core/bexter.ts +138 -0
  75. package/src/keri/core/cigar.ts +10 -11
  76. package/src/keri/core/cipher.ts +23 -14
  77. package/src/keri/core/core.ts +223 -81
  78. package/src/keri/core/counter.ts +182 -116
  79. package/src/keri/core/decrypter.ts +48 -34
  80. package/src/keri/core/diger.ts +23 -22
  81. package/src/keri/core/encrypter.ts +37 -27
  82. package/src/keri/core/eventing.ts +468 -106
  83. package/src/keri/core/httping.ts +151 -105
  84. package/src/keri/core/indexer.ts +313 -211
  85. package/src/keri/core/keeping.ts +679 -3
  86. package/src/keri/core/kering.ts +4 -6
  87. package/src/keri/core/manager.ts +660 -499
  88. package/src/keri/core/matter.ts +382 -148
  89. package/src/keri/core/number.ts +56 -11
  90. package/src/keri/core/pather.ts +98 -0
  91. package/src/keri/core/prefixer.ts +122 -101
  92. package/src/keri/core/saider.ts +104 -76
  93. package/src/keri/core/salter.ts +71 -40
  94. package/src/keri/core/seqner.ts +46 -0
  95. package/src/keri/core/serder.ts +102 -38
  96. package/src/keri/core/siger.ts +19 -18
  97. package/src/keri/core/signer.ts +73 -53
  98. package/src/keri/core/tholder.ts +196 -30
  99. package/src/keri/core/utils.ts +121 -50
  100. package/src/keri/core/vdring.ts +94 -0
  101. package/src/keri/core/verfer.ts +22 -9
  102. package/src/keri/end/ending.ts +111 -101
  103. package/src/math.ts +3 -0
  104. package/src/ready.ts +5 -0
  105. package/dist/keri/app/accountant.d.ts +0 -10
  106. package/dist/keri/app/apping.d.ts +0 -1
  107. package/dist/keri/app/client.d.ts +0 -7
  108. package/dist/keri/app/signify.d.ts +0 -6
  109. package/src/keri/app/accountant.ts +0 -35
  110. package/src/keri/app/apping.ts +0 -12
  111. package/src/keri/app/client.ts +0 -30
  112. package/src/keri/app/signify.ts +0 -12
  113. package/src/keri/app/tsconfig.json +0 -100
  114. package/src/keri/core/tsconfig.json +0 -100
  115. package/src/keri/end/tsconfig.json +0 -100
@@ -1,158 +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";
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
5
 
6
- import {createHash} from "blake3"
6
+ import { blake3 } from '@noble/hashes/blake3';
7
7
 
8
- const Dummy = "#"
8
+ const Dummy = '#';
9
9
 
10
10
  export enum Ids {
11
- d = "d"
11
+ d = 'd',
12
12
  }
13
13
 
14
14
  class Digestage {
15
- public klas: any = undefined
16
- public size: number | undefined = 0
17
- public length: number | undefined = 0
15
+ public klas: any = undefined;
16
+ public size: number | undefined = 0;
17
+ public length: number | undefined = 0;
18
18
  constructor(klas: any, size?: number, length?: number) {
19
- this.klas = klas
20
- this.size = size
21
- this.length = length
19
+ this.klas = klas;
20
+ this.size = size;
21
+ this.length = length;
22
22
  }
23
23
  }
24
24
 
25
-
26
-
27
25
  export class Saider extends Matter {
28
26
  static Digests = new Map<string, Digestage>([
29
- [MtrDex.Blake3_256, new Digestage(Saider._derive_blake3_256, undefined, undefined)]
30
- ])
31
-
32
- constructor({raw, code, qb64b, qb64, qb2}: MatterArgs, sad?: Dict<any>, kind?: Serials, label: string = Ids.d) {
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
+ ) {
33
39
  try {
34
- super({raw, code, qb64b, qb64, qb2});
40
+ super({ raw, code, qb64b, qb64, qb2 });
35
41
  } catch (e) {
36
42
  if (e instanceof EmptyMaterialError) {
37
43
  if (sad == undefined || !(label in sad)) {
38
- throw e
44
+ throw e;
39
45
  }
40
46
 
41
47
  if (code == undefined) {
42
- if (sad[label] != "") {
43
- super({qb64: sad[label], code: code})
44
- code = this.code
48
+ if (sad[label] != '') {
49
+ super({ qb64: sad[label], code: code });
50
+ code = this.code;
45
51
  } else {
46
- code = MtrDex.Blake3_256
52
+ code = MtrDex.Blake3_256;
47
53
  }
48
54
  }
49
55
 
50
56
  if (!DigiDex.has(code)) {
51
- throw new Error(`Unsupported digest code = ${code}`)
57
+ throw new Error(`Unsupported digest code = ${code}`);
52
58
  }
53
59
 
54
- [raw] = Saider._derive({...sad}, code, kind, label)
55
- super({raw: raw, code: code})
60
+ [raw] = Saider._derive({ ...sad }, code, kind, label);
61
+ super({ raw: raw, code: code });
56
62
  } else {
57
- throw e
63
+ throw e;
58
64
  }
59
65
  }
60
66
 
61
67
  if (!this.digestive) {
62
- throw new Error(`Unsupported digest code = ${this.code}.`)
68
+ throw new Error(`Unsupported digest code = ${this.code}.`);
63
69
  }
64
-
65
70
  }
66
71
 
67
- static _derive_blake3_256(ser: Uint8Array, _digest_size: number, _length: number) {
68
- const hasher = createHash();
69
- return hasher.update(ser).digest('');
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());
70
78
  }
71
79
 
72
-
73
- private static _derive(sad: Dict<any>, code: string, kind: Serials | undefined, label: string): [Uint8Array, Dict<any>] {
80
+ private static _derive(
81
+ sad: Dict<any>,
82
+ code: string,
83
+ kind: Serials | undefined,
84
+ label: string
85
+ ): [Uint8Array, Dict<any>] {
74
86
  if (!DigiDex.has(code) || !Saider.Digests.has(code)) {
75
- throw new Error(`Unsupported digest code = ${code}.`)
87
+ throw new Error(`Unsupported digest code = ${code}.`);
76
88
  }
77
89
 
78
- sad = {...sad}
79
- sad[label] = "".padStart(Matter.Sizes.get(code)!.fs, Dummy)
90
+ sad = { ...sad };
91
+ sad[label] = ''.padStart(Matter.Sizes.get(code)!.fs!, Dummy);
80
92
  if ('v' in sad) {
81
- [, , kind, sad, ] = sizeify(sad, kind)
93
+ [, , kind, sad] = sizeify(sad, kind);
82
94
  }
83
95
 
84
- let ser = {...sad}
96
+ const ser = { ...sad };
85
97
 
86
- let digestage = Saider.Digests.get(code)
98
+ const digestage = Saider.Digests.get(code);
87
99
 
88
- let cpa = Saider._serialze(ser, kind)
89
- let args: any[] = []
100
+ const cpa = Saider._serialze(ser, kind);
101
+ const args: any[] = [];
90
102
  if (digestage!.size != undefined) {
91
- args.push(digestage!.size)
103
+ args.push(digestage!.size);
92
104
  }
93
105
 
94
106
  if (digestage!.length != undefined) {
95
- args.push(digestage!.length)
107
+ args.push(digestage!.length);
96
108
  }
97
109
 
98
- return [digestage!.klas(cpa, ...args), sad]
110
+ return [digestage!.klas(cpa, ...args), sad];
99
111
  }
100
112
 
101
- public derive(sad: Dict<any>, code: string, kind: Serials | undefined, label: string) : [Uint8Array, Dict<any>]{
102
- code = code != undefined ? code : this.code
103
- return Saider._derive(sad, code, kind, label)
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);
104
121
  }
105
122
 
106
- public verify(sad: Dict<any>, prefixed: boolean = false, versioned: boolean = false, kind?: Serials,
107
- label: string = Ids.d): boolean {
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 {
108
130
  try {
109
- let [raw, dsad] = Saider._derive(sad, this.code, kind, label)
110
- let saider = new Saider({raw: raw, code: this.code})
131
+ const [raw, dsad] = Saider._derive(sad, this.code, kind, label);
132
+ const saider = new Saider({ raw: raw, code: this.code });
111
133
  if (this.qb64 != saider.qb64) {
112
- return false
134
+ return false;
113
135
  }
114
136
 
115
- if ("v" in sad && versioned) {
116
- if (sad['v'] != dsad["v"]) {
117
- return false
137
+ if ('v' in sad && versioned) {
138
+ if (sad['v'] != dsad['v']) {
139
+ return false;
118
140
  }
119
141
  }
120
142
 
121
143
  if (prefixed && sad[label] != this.qb64) {
122
- return false
144
+ return false;
123
145
  }
124
-
125
146
  } catch (e) {
126
- return false
147
+ return false;
127
148
  }
128
149
 
129
- return true
150
+ return true;
130
151
  }
131
152
 
132
153
  private static _serialze(sad: Dict<any>, kind?: Serials): string {
133
- let knd = Serials.JSON
154
+ let knd = Serials.JSON;
134
155
  if ('v' in sad) {
135
- [knd] = deversify(sad['v'])
156
+ [, knd] = deversify(sad['v']);
136
157
  }
137
158
 
138
159
  if (kind == undefined) {
139
- kind = knd
160
+ kind = knd;
140
161
  }
141
162
 
142
- return dumps(sad, kind)
163
+ return dumps(sad, kind);
143
164
  }
144
165
 
145
- public static saidify(sad: Dict<any>, code: string = MtrDex.Blake3_256, kind: Serials = Serials.JSON,
146
- label: string = Ids.d): [Saider, Dict<any>] {
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>] {
147
172
  if (!(label in sad)) {
148
- throw new Error(`Missing id field labeled=${label} in sad.`)
173
+ throw new Error(`Missing id field labeled=${label} in sad.`);
149
174
  }
150
- let raw
151
- [raw, sad]= Saider._derive(sad, code, kind, label)
152
- let saider = new Saider({raw: raw, code: code}, undefined, kind, label)
153
- sad[label] = saider.qb64
154
- return [saider, sad]
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];
155
185
  }
156
-
157
-
158
186
  }
@@ -1,36 +1,47 @@
1
- import {Signer} from "./signer";
1
+ import { Signer } from './signer';
2
2
 
3
3
  import { Matter, MtrDex } from './matter';
4
- import { EmptyMaterialError } from './kering'
5
- import libsodium from 'libsodium-wrappers-sumo';
4
+ import { EmptyMaterialError } from './kering';
5
+ import libsodium from 'libsodium-wrappers-sumo';
6
6
 
7
- export const enum Tier {
8
- low = "low",
9
- med = "med",
10
- high = "high"
7
+ export enum Tier {
8
+ low = 'low',
9
+ med = 'med',
10
+ high = 'high',
11
11
  }
12
12
 
13
13
  interface SalterArgs {
14
- raw?: Uint8Array | undefined
15
- code? :string
16
- tier?:Tier
17
- qb64b? :Uint8Array | undefined
18
- qb64?: string
19
- qb2?: Uint8Array | undefined
14
+ raw?: Uint8Array | undefined;
15
+ code?: string;
16
+ tier?: Tier;
17
+ qb64b?: Uint8Array | undefined;
18
+ qb64?: string;
19
+ qb2?: Uint8Array | undefined;
20
20
  }
21
21
  export class Salter extends Matter {
22
22
  private readonly _tier: Tier | null;
23
23
 
24
- constructor({raw, code = MtrDex.Salt_128, tier=Tier.low, qb64, qb64b, qb2}:SalterArgs) {
24
+ constructor({
25
+ raw,
26
+ code = MtrDex.Salt_128,
27
+ tier = Tier.low,
28
+ qb64,
29
+ qb64b,
30
+ qb2,
31
+ }: SalterArgs) {
25
32
  try {
26
- super({raw, code, qb64, qb64b, qb2});
33
+ super({ raw, code, qb64, qb64b, qb2 });
27
34
  } catch (e) {
28
- if(e instanceof EmptyMaterialError) {
35
+ if (e instanceof EmptyMaterialError) {
29
36
  if (code == MtrDex.Salt_128) {
30
- let salt = libsodium.randombytes_buf(libsodium.crypto_pwhash_SALTBYTES);
31
- super({raw: salt, code: code})
37
+ const salt = libsodium.randombytes_buf(
38
+ libsodium.crypto_pwhash_SALTBYTES
39
+ );
40
+ super({ raw: salt, code: code });
32
41
  } else {
33
- throw new Error("invalid code for Salter, only Salt_128 accepted")
42
+ throw new Error(
43
+ 'invalid code for Salter, only Salt_128 accepted'
44
+ );
34
45
  }
35
46
  } else {
36
47
  throw e;
@@ -38,52 +49,72 @@ export class Salter extends Matter {
38
49
  }
39
50
 
40
51
  if (this.code != MtrDex.Salt_128) {
41
- throw new Error("invalid code for Salter, only Salt_128 accepted")
52
+ throw new Error('invalid code for Salter, only Salt_128 accepted');
42
53
  }
43
54
 
44
- this._tier = tier !== null ? tier : Tier.low
55
+ this._tier = tier !== null ? tier : Tier.low;
45
56
  }
46
57
 
47
- private stretch(size: number = 32, path: string = "", tier: Tier | null = null, temp: boolean = false): Uint8Array {
58
+ private stretch(
59
+ size: number = 32,
60
+ path: string = '',
61
+ tier: Tier | null = null,
62
+ temp: boolean = false
63
+ ): Uint8Array {
48
64
  tier = tier == null ? this.tier : tier;
49
65
 
50
- let opslimit: number, memlimit: number
66
+ let opslimit: number, memlimit: number;
51
67
 
68
+ // Harcoded values based on keripy
52
69
  if (temp) {
53
- opslimit = libsodium.crypto_pwhash_OPSLIMIT_MIN
54
- memlimit = libsodium.crypto_pwhash_MEMLIMIT_MIN
55
-
70
+ opslimit = 1; //libsodium.crypto_pwhash_OPSLIMIT_MIN
71
+ memlimit = 8192; //libsodium.crypto_pwhash_MEMLIMIT_MIN
56
72
  } else {
57
73
  switch (tier) {
58
74
  case Tier.low:
59
- opslimit = libsodium.crypto_pwhash_OPSLIMIT_INTERACTIVE
60
- memlimit = libsodium.crypto_pwhash_MEMLIMIT_INTERACTIVE
75
+ opslimit = 2; //libsodium.crypto_pwhash_OPSLIMIT_INTERACTIVE
76
+ memlimit = 67108864; //libsodium.crypto_pwhash_MEMLIMIT_INTERACTIVE
61
77
  break;
62
78
  case Tier.med:
63
- opslimit = libsodium.crypto_pwhash_OPSLIMIT_MODERATE
64
- memlimit = libsodium.crypto_pwhash_MEMLIMIT_MODERATE
79
+ opslimit = 3; //libsodium.crypto_pwhash_OPSLIMIT_MODERATE
80
+ memlimit = 268435456; //libsodium.crypto_pwhash_MEMLIMIT_MODERATE
65
81
  break;
66
82
  case Tier.high:
67
- opslimit = libsodium.crypto_pwhash_OPSLIMIT_SENSITIVE
68
- memlimit = libsodium.crypto_pwhash_MEMLIMIT_SENSITIVE
83
+ opslimit = 4; //libsodium.crypto_pwhash_OPSLIMIT_SENSITIVE
84
+ memlimit = 1073741824; //libsodium.crypto_pwhash_MEMLIMIT_SENSITIVE
69
85
  break;
70
86
  default:
71
- throw new Error(`Unsupported security tier = ${tier}.`)
87
+ throw new Error(`Unsupported security tier = ${tier}.`);
72
88
  }
73
89
  }
74
90
 
75
- return libsodium.crypto_pwhash(size, path, this.raw, opslimit, memlimit, libsodium.crypto_pwhash_ALG_DEFAULT)
91
+ return libsodium.crypto_pwhash(
92
+ size,
93
+ path,
94
+ this.raw,
95
+ opslimit,
96
+ memlimit,
97
+ libsodium.crypto_pwhash_ALG_ARGON2ID13
98
+ );
76
99
  }
77
100
 
78
- signer(code: string=MtrDex.Ed25519_Seed, transferable: boolean=true, path: string = "",
79
- tier: Tier | null = null, temp:boolean = false): Signer {
80
- let seed = this.stretch(Matter._rawSize(code), path, tier, temp)
101
+ signer(
102
+ code: string = MtrDex.Ed25519_Seed,
103
+ transferable: boolean = true,
104
+ path: string = '',
105
+ tier: Tier | null = null,
106
+ temp: boolean = false
107
+ ): Signer {
108
+ const seed = this.stretch(Matter._rawSize(code), path, tier, temp);
81
109
 
82
- return new Signer({raw: seed, code: code, transferable: transferable})
110
+ return new Signer({
111
+ raw: seed,
112
+ code: code,
113
+ transferable: transferable,
114
+ });
83
115
  }
84
116
 
85
117
  get tier(): Tier | null {
86
118
  return this._tier;
87
119
  }
88
-
89
- }
120
+ }
@@ -0,0 +1,46 @@
1
+ import { Matter, MatterArgs, MtrDex } from './matter';
2
+ import { intToBytes, bytesToInt } from './utils';
3
+ /**
4
+ * @description Seqner: subclass of Matter, cryptographic material, for ordinal numbers
5
+ * such as sequence numbers or first seen ordering numbers.
6
+ * Seqner provides fully qualified format for ordinals (sequence numbers etc)
7
+ * when provided as attached cryptographic material elements.
8
+ */
9
+ export class Seqner extends Matter {
10
+ constructor({
11
+ raw,
12
+ code = MtrDex.Salt_128,
13
+ qb64,
14
+ qb64b,
15
+ qb2,
16
+ sn,
17
+ snh,
18
+ ...kwa
19
+ }: MatterArgs & { sn?: number; snh?: string }) {
20
+ if (!raw && !qb64b && !qb64 && !qb2) {
21
+ if (sn === undefined) {
22
+ if (snh === undefined) {
23
+ sn = 0;
24
+ } else {
25
+ sn = parseInt(snh, 16);
26
+ }
27
+ }
28
+
29
+ raw = intToBytes(sn, Matter._rawSize(MtrDex.Salt_128));
30
+ }
31
+
32
+ super({ raw, code, qb64, qb64b, qb2, ...kwa });
33
+
34
+ if (this.code !== MtrDex.Salt_128) {
35
+ throw new Error(`Invalid code = ${this.code} for Seqner.`);
36
+ }
37
+ }
38
+
39
+ get sn(): number {
40
+ return bytesToInt(this.raw); //To check if other readUInt64 is needed
41
+ }
42
+
43
+ get snh(): string {
44
+ return this.sn.toString(16);
45
+ }
46
+ }
@@ -1,34 +1,53 @@
1
- import {MtrDex} from "./matter";
2
- import {deversify, Dict, Ident, Serials, versify, Version, Versionage} from "./core";
1
+ import { MtrDex } from './matter';
2
+ import {
3
+ deversify,
4
+ Dict,
5
+ Ident,
6
+ Serials,
7
+ versify,
8
+ Version,
9
+ Versionage,
10
+ } from './core';
11
+ import { Verfer } from './verfer';
12
+ import { Diger } from './diger';
13
+ import { CesrNumber } from './number';
3
14
 
4
15
  export class Serder {
5
16
  private _kind: Serials;
6
- private _raw: string = "";
17
+ private _raw: string = '';
7
18
  private _ked: Dict<any> = {};
8
19
  private _ident: Ident = Ident.KERI;
9
20
  private _size: number = 0;
10
21
  private _version: Version = Versionage;
11
22
  private readonly _code: string;
12
23
 
13
- constructor(ked: Dict<any>, kind: Serials=Serials.JSON, code: string=MtrDex.Blake3_256) {
14
- this._code = code
15
- this._kind = kind
16
- this.ked = ked
24
+ constructor(
25
+ ked: Dict<any>,
26
+ kind: Serials = Serials.JSON,
27
+ code: string = MtrDex.Blake3_256
28
+ ) {
29
+ this._code = code;
30
+ this._kind = kind;
31
+ this.ked = ked;
17
32
  }
18
33
 
19
34
  set ked(ked: Dict<any>) {
20
- let [raw, ident, kind, kd, version] = this._exhale(ked, this._kind)
21
- let size = raw.length
22
- this._raw = raw
23
- this._ident = ident
24
- this._ked = kd
25
- this._kind = kind
26
- this._size = size
27
- this._version = version
35
+ const [raw, ident, kind, kd, version] = this._exhale(ked, this._kind);
36
+ const size = raw.length;
37
+ this._raw = raw;
38
+ this._ident = ident;
39
+ this._ked = kd;
40
+ this._kind = kind;
41
+ this._size = size;
42
+ this._version = version;
43
+ }
44
+
45
+ get pre(): string {
46
+ return this._ked['i'];
28
47
  }
29
48
 
30
49
  get ked(): Dict<any> {
31
- return this._ked
50
+ return this._ked;
32
51
  }
33
52
 
34
53
  get code(): string {
@@ -39,61 +58,106 @@ export class Serder {
39
58
  return this._raw;
40
59
  }
41
60
 
61
+ get sner(): CesrNumber {
62
+ return new CesrNumber({}, this.ked['s']);
63
+ }
64
+
65
+ get sn(): number {
66
+ return this.sner.num;
67
+ }
68
+
42
69
  get kind(): Serials {
43
- return this._kind
70
+ return this._kind;
44
71
  }
45
72
 
46
- private _exhale(ked: Dict<any>, kind: Serials): [string, Ident, Serials, Dict<any>, Version] {
47
- return sizeify(ked, kind)
73
+ private _exhale(
74
+ ked: Dict<any>,
75
+ kind: Serials
76
+ ): [string, Ident, Serials, Dict<any>, Version] {
77
+ return sizeify(ked, kind);
48
78
  }
49
79
 
50
80
  get ident(): Ident {
51
- return this._ident
81
+ return this._ident;
52
82
  }
53
83
 
54
84
  get size(): number {
55
- return this._size
85
+ return this._size;
56
86
  }
57
87
 
58
88
  get version(): Version {
59
- return this._version
89
+ return this._version;
90
+ }
91
+ get verfers(): Verfer[] {
92
+ let keys: any = [];
93
+ if ('k' in this._ked) {
94
+ // establishment event
95
+ keys = this._ked['k'];
96
+ } else {
97
+ // non-establishment event
98
+ keys = [];
99
+ }
100
+ // create a new Verfer for each key
101
+ const verfers = [];
102
+ for (const key of keys) {
103
+ verfers.push(new Verfer({ qb64: key }));
104
+ }
105
+ return verfers;
106
+ }
107
+
108
+ get digers(): Diger[] {
109
+ let keys: any = [];
110
+ if ('n' in this._ked) {
111
+ // establishment event
112
+ keys = this._ked['n'];
113
+ } else {
114
+ // non-establishment event
115
+ keys = [];
116
+ }
117
+ // create a new Verfer for each key
118
+ const digers = [];
119
+ for (const key of keys) {
120
+ digers.push(new Diger({ qb64: key }));
121
+ }
122
+ return digers;
60
123
  }
61
124
 
62
125
  pretty() {
63
- return JSON.stringify(this._ked, undefined, 2)
126
+ return JSON.stringify(this._ked, undefined, 2);
64
127
  }
65
128
  }
66
129
 
67
130
  export function dumps(ked: Object, kind: Serials.JSON): string {
68
131
  if (kind == Serials.JSON) {
69
- return JSON.stringify(ked)
132
+ return JSON.stringify(ked);
70
133
  } else {
71
- throw new Error("unsupported event encoding")
134
+ throw new Error('unsupported event encoding');
72
135
  }
73
136
  }
74
137
 
75
- export function sizeify(ked: Dict<any>, kind?: Serials) : [string, Ident, Serials, Dict<any>, Version]{
76
- if (!("v" in ked)) {
77
- throw new Error("Missing or empty version string")
138
+ export function sizeify(
139
+ ked: Dict<any>,
140
+ kind?: Serials
141
+ ): [string, Ident, Serials, Dict<any>, Version] {
142
+ if (!('v' in ked)) {
143
+ throw new Error('Missing or empty version string');
78
144
  }
79
145
 
80
- let ident = Ident.KERI
81
- let [knd, version,] = deversify(ked["v"] as string)
146
+ const [ident, knd, version] = deversify(ked['v'] as string);
82
147
  if (version != Versionage) {
83
- throw new Error(`unsupported version ${version.toString()}`)
148
+ throw new Error(`unsupported version ${version.toString()}`);
84
149
  }
85
150
 
86
151
  if (kind == undefined) {
87
- kind = knd
152
+ kind = knd;
88
153
  }
89
154
 
90
- let raw = dumps(ked, kind)
91
- let size = raw.length
92
-
93
- ked['v'] = versify(ident, version, kind, size)
155
+ let raw = dumps(ked, kind);
156
+ const size = raw.length;
94
157
 
95
- raw = dumps(ked, kind)
158
+ ked['v'] = versify(ident, version, kind, size);
96
159
 
97
- return [raw, ident, kind, ked, version]
160
+ raw = dumps(ked, kind);
98
161
 
162
+ return [raw, ident, kind, ked, version];
99
163
  }