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,5 +1,5 @@
1
- import {IdxSigDex, Indexer, IndexerArgs} from "./indexer";
2
- import {Verfer} from "./verfer";
1
+ import { IdxSigDex, Indexer, IndexerArgs } from './indexer';
2
+ import { Verfer } from './verfer';
3
3
 
4
4
  /**
5
5
  Siger is subclass of Indexer, indexed signature material,
@@ -17,23 +17,24 @@ import {Verfer} from "./verfer";
17
17
  **/
18
18
 
19
19
  export class Siger extends Indexer {
20
-
21
- private _verfer?: Verfer
22
- constructor({raw, code, index, ondex, qb64, qb64b, qb2}: IndexerArgs, verfer?: Verfer) {
23
- super({raw, code, index, ondex, qb64, qb64b, qb2});
24
-
25
- if (!IdxSigDex.has(this.code)) {
26
- throw new Error(`Invalid code = ${this.code} for Siger.`)
20
+ private _verfer?: Verfer;
21
+ constructor(
22
+ { raw, code, index, ondex, qb64, qb64b, qb2 }: IndexerArgs,
23
+ verfer?: Verfer
24
+ ) {
25
+ super({ raw, code, index, ondex, qb64, qb64b, qb2 });
26
+
27
+ if (!IdxSigDex.has(this.code)) {
28
+ throw new Error(`Invalid code = ${this.code} for Siger.`);
29
+ }
30
+ this._verfer = verfer;
27
31
  }
28
- this._verfer = verfer
29
- }
30
-
31
- get verfer(): Verfer | undefined {
32
- return this._verfer;
33
- }
34
32
 
35
- set verfer(verfer: Verfer | undefined) {
36
- this._verfer = verfer;
37
- }
33
+ get verfer(): Verfer | undefined {
34
+ return this._verfer;
35
+ }
38
36
 
37
+ set verfer(verfer: Verfer | undefined) {
38
+ this._verfer = verfer;
39
+ }
39
40
  }
@@ -1,13 +1,13 @@
1
- import {EmptyMaterialError} from "./kering";
1
+ import { EmptyMaterialError } from './kering';
2
2
 
3
3
  export {};
4
4
  import libsodium from 'libsodium-wrappers-sumo';
5
- import {Matter} from './matter';
6
- import {MtrDex} from './matter';
7
- import {Verfer} from "./verfer";
8
- import {Cigar} from "./cigar";
9
- import {Siger} from "./siger";
10
- import {IdrDex} from "./indexer";
5
+ import { Matter } from './matter';
6
+ import { MtrDex } from './matter';
7
+ import { Verfer } from './verfer';
8
+ import { Cigar } from './cigar';
9
+ import { Siger } from './siger';
10
+ import { IdrDex } from './indexer';
11
11
  import { Buffer } from 'buffer';
12
12
 
13
13
  /**
@@ -19,48 +19,57 @@ import { Buffer } from 'buffer';
19
19
  as cipher suite for creating key-pair.
20
20
  */
21
21
  interface SignerArgs {
22
- raw?: Uint8Array | undefined
23
- code?: string
24
- qb64b?: Uint8Array | undefined
25
- qb64?: string
26
- qb2?: Uint8Array | undefined
27
- transferable?: boolean
22
+ raw?: Uint8Array | undefined;
23
+ code?: string;
24
+ qb64b?: Uint8Array | undefined;
25
+ qb64?: string;
26
+ qb2?: Uint8Array | undefined;
27
+ transferable?: boolean;
28
28
  }
29
29
 
30
30
  export class Signer extends Matter {
31
- private readonly _sign: Function
32
- private readonly _verfer: Verfer
33
-
34
- constructor({raw, code = MtrDex.Ed25519_Seed, qb64, qb64b, qb2, transferable = true}: SignerArgs) {
31
+ private readonly _sign: Function;
32
+ private readonly _verfer: Verfer;
33
+
34
+ constructor({
35
+ raw,
36
+ code = MtrDex.Ed25519_Seed,
37
+ qb64,
38
+ qb64b,
39
+ qb2,
40
+ transferable = true,
41
+ }: SignerArgs) {
35
42
  try {
36
- super({raw, code, qb64, qb64b, qb2})
43
+ super({ raw, code, qb64, qb64b, qb2 });
37
44
  } catch (e) {
38
45
  if (e instanceof EmptyMaterialError) {
39
46
  if (code == MtrDex.Ed25519_Seed) {
40
- let raw = libsodium.randombytes_buf(libsodium.crypto_sign_SEEDBYTES);
41
- super({raw, code, qb64, qb64b, qb2})
47
+ const raw = libsodium.randombytes_buf(
48
+ libsodium.crypto_sign_SEEDBYTES
49
+ );
50
+ super({ raw, code, qb64, qb64b, qb2 });
42
51
  } else {
43
- throw new Error(`Unsupported signer code = ${code}.`)
52
+ throw new Error(`Unsupported signer code = ${code}.`);
44
53
  }
45
54
  } else {
46
- throw e
55
+ throw e;
47
56
  }
48
57
  }
49
- let verfer
58
+ let verfer;
50
59
  if (this.code == MtrDex.Ed25519_Seed) {
51
- this._sign = this._ed25519
52
- const keypair = libsodium.crypto_sign_seed_keypair(this.raw)
53
- verfer = new Verfer({raw: keypair.publicKey, code: transferable ? MtrDex.Ed25519 : MtrDex.Ed25519N})
54
-
60
+ this._sign = this._ed25519;
61
+ const keypair = libsodium.crypto_sign_seed_keypair(this.raw);
62
+ verfer = new Verfer({
63
+ raw: keypair.publicKey,
64
+ code: transferable ? MtrDex.Ed25519 : MtrDex.Ed25519N,
65
+ });
55
66
  } else {
56
- throw new Error(`Unsupported signer code = ${this.code}.`)
67
+ throw new Error(`Unsupported signer code = ${this.code}.`);
57
68
  }
58
69
 
59
- this._verfer = verfer
60
-
70
+ this._verfer = verfer;
61
71
  }
62
72
 
63
-
64
73
  /**
65
74
  * @description Property verfer:
66
75
  Returns Verfer instance
@@ -70,44 +79,55 @@ export class Signer extends Matter {
70
79
  return this._verfer;
71
80
  }
72
81
 
73
- sign(ser: Uint8Array, index: number | null = null, only: boolean = false,
74
- ondex: number | undefined = undefined): Siger | Cigar {
75
- return this._sign(ser, this.raw, this.verfer, index, only, ondex)
82
+ sign(
83
+ ser: Uint8Array,
84
+ index: number | null = null,
85
+ only: boolean = false,
86
+ ondex: number | undefined = undefined
87
+ ): Siger | Cigar {
88
+ return this._sign(ser, this.raw, this.verfer, index, only, ondex);
76
89
  }
77
90
 
78
- _ed25519(ser: Uint8Array, seed: Uint8Array, verfer: Verfer, index: number | null,
79
- only: boolean = false, ondex: number | undefined) {
80
-
81
- let sig = libsodium.crypto_sign_detached(
91
+ _ed25519(
92
+ ser: Uint8Array,
93
+ seed: Uint8Array,
94
+ verfer: Verfer,
95
+ index: number | null,
96
+ only: boolean = false,
97
+ ondex: number | undefined
98
+ ) {
99
+ const sig = libsodium.crypto_sign_detached(
82
100
  ser,
83
- Buffer.concat([seed, verfer.raw]),
101
+ Buffer.concat([seed, verfer.raw])
84
102
  );
85
103
 
86
104
  if (index == null) {
87
- return new Cigar({raw: sig, code: MtrDex.Ed25519_Sig}, verfer);
105
+ return new Cigar({ raw: sig, code: MtrDex.Ed25519_Sig }, verfer);
88
106
  } else {
89
107
  let code;
90
108
  if (only) {
91
- ondex = undefined
109
+ ondex = undefined;
92
110
  if (index <= 63) {
93
- code = IdrDex.Ed25519_Crt_Sig
111
+ code = IdrDex.Ed25519_Crt_Sig;
94
112
  } else {
95
- code = IdrDex.Ed25519_Big_Crt_Sig
113
+ code = IdrDex.Ed25519_Big_Crt_Sig;
96
114
  }
97
115
  } else {
98
- if(ondex == undefined) {
99
- ondex = index
116
+ if (ondex == undefined) {
117
+ ondex = index;
100
118
  }
101
119
 
102
- if (ondex == index && index <= 63) // both same and small
103
- code = IdrDex.Ed25519_Sig // use small both same
104
- else // otherwise big or both not same so use big both
105
- code = IdrDex.Ed25519_Big_Sig // use use big both
106
-
120
+ if (ondex == index && index <= 63)
121
+ // both same and small
122
+ code = IdrDex.Ed25519_Sig; // use small both same
123
+ // otherwise big or both not same so use big both
124
+ else code = IdrDex.Ed25519_Big_Sig; // use use big both
107
125
  }
108
126
 
109
- return new Siger({raw: sig, code: code, index: index, ondex: ondex}, verfer)
127
+ return new Siger(
128
+ { raw: sig, code: code, index: index, ondex: ondex },
129
+ verfer
130
+ );
110
131
  }
111
-
112
132
  }
113
- }
133
+ }
@@ -1,52 +1,218 @@
1
-
1
+ import { BexDex, Matter, NumDex } from './matter';
2
+ import { CesrNumber } from './number';
3
+ import { Fraction } from 'mathjs';
4
+ import { math } from '../../index';
2
5
 
3
6
  export class Tholder {
4
- private _weighted: boolean = false
5
- private _thold: number = 0
6
- private _size: number = 0
7
- private _sith: string = ""
8
- private _limen: Array<string> = new Array<string>()
7
+ private _weighted: boolean = false;
8
+ private _thold: any = undefined;
9
+ private _size: number = 0;
10
+ private _number: CesrNumber | undefined = undefined;
11
+ private _satisfy: any = undefined;
9
12
 
10
- constructor(sith: string | number | Array<string>) {
11
- this.processSith(sith)
12
- }
13
+ // private _bexter: any
13
14
 
14
- get num(): number | undefined {
15
- return this._weighted ? undefined : this._thold
15
+ constructor(kargs: { thold?: any; limen?: any; sith?: any }) {
16
+ if (kargs.thold !== undefined) {
17
+ this._processThold(kargs.thold);
18
+ } else if (kargs.limen != undefined) {
19
+ this._processLimen(kargs.limen);
20
+ } else if (kargs.sith !== undefined) {
21
+ this._processSith(kargs.sith);
22
+ } else {
23
+ throw new Error('Missing threshold expression');
24
+ }
16
25
  }
17
26
 
18
- get size(): number {
19
- return this._size
27
+ get weighted(): boolean {
28
+ return this._weighted;
20
29
  }
21
30
 
22
- get thold(): number {
31
+ get thold(): any {
23
32
  return this._thold;
24
33
  }
25
- get weighted(): boolean {
26
- return this._weighted;
34
+
35
+ get size(): number {
36
+ return this._size;
37
+ }
38
+
39
+ get limen(): any {
40
+ return this._number?.qb64b;
27
41
  }
28
42
 
29
43
  get sith(): string {
30
44
  if (this.weighted) {
31
- if (this._sith == "") {
32
- return `${this._limen}`
45
+ let sith = this.thold.map((clause: Fraction[]) => {
46
+ return clause.map((c) => {
47
+ if (0 < Number(c) && Number(c) < 1) {
48
+ return math.format(c, { fraction: 'ratio' });
49
+ } else {
50
+ return math.format(c, { fraction: 'decimal' });
51
+ }
52
+ });
53
+ });
54
+ if (sith.length == 1) {
55
+ sith = sith[0];
33
56
  }
34
- return this._sith
57
+
58
+ return sith;
35
59
  } else {
36
- return this.thold.toString(16)
60
+ return this.thold.toString(16);
37
61
  }
38
62
  }
39
63
 
40
- private processSith(sith: string | number | Array<string>) {
41
- if (typeof(sith) == "string") {
42
- this._sith = sith
43
- this._thold = parseInt(sith)
44
- } else if (typeof(sith) == "number") {
45
- this._thold = sith
46
- this._size = this._thold
64
+ get json(): string {
65
+ return JSON.stringify(this.sith);
66
+ }
67
+
68
+ get num(): number | undefined {
69
+ return this._weighted ? undefined : this._thold;
70
+ }
71
+
72
+ private _processThold(thold: number | Array<Array<Fraction>>) {
73
+ if (typeof thold === 'number') {
74
+ this._processUnweighted(thold);
75
+ } else {
76
+ this._processWeighted(thold);
77
+ }
78
+ }
79
+
80
+ private _processLimen(limen: string) {
81
+ const matter = new Matter({ qb64: limen });
82
+ if (NumDex.has(matter.code)) {
83
+ const number = new CesrNumber({
84
+ raw: matter.raw,
85
+ code: matter.code,
86
+ });
87
+ this._processUnweighted(number.num);
88
+ } else if (BexDex.has(matter.code)) {
89
+ // TODO: Implement Bexter
47
90
  } else {
48
- this._limen = sith
49
- this._size = this._limen.length
91
+ throw new Error('Invalid code for limen=' + matter.code);
92
+ }
93
+ }
94
+
95
+ private _processSith(sith: string | number | Array<string>) {
96
+ if (typeof sith == 'number') {
97
+ this._processUnweighted(sith);
98
+ } else if (typeof sith == 'string' && sith.indexOf('[') == -1) {
99
+ this._processUnweighted(parseInt(sith, 16));
100
+ } else {
101
+ let _sith: any = sith;
102
+ if (typeof sith == 'string') {
103
+ _sith = JSON.parse(sith);
104
+ }
105
+
106
+ if (_sith.length == 0) {
107
+ throw new Error('Empty weight list');
108
+ }
109
+
110
+ const mask = _sith.map((x: any) => {
111
+ return typeof x !== 'string';
112
+ });
113
+
114
+ if (mask.length > 0 && !mask.every((x: boolean) => x)) {
115
+ _sith = [_sith];
116
+ }
117
+
118
+ for (const c of _sith) {
119
+ const mask = c.map((x: any) => {
120
+ return typeof x === 'string';
121
+ });
122
+ if (mask.length > 0 && !mask.every((x: boolean) => x)) {
123
+ throw new Error(
124
+ 'Invalid sith, some weights in clause ' +
125
+ mask +
126
+ ' are non string'
127
+ );
128
+ }
129
+ }
130
+
131
+ const thold = this._processClauses(_sith);
132
+ this._processWeighted(thold);
133
+ }
134
+ }
135
+
136
+ private _processClauses(sith: Array<Array<string>>): Fraction[][] {
137
+ const thold = new Array<Array<Fraction>>();
138
+ sith.forEach((clause) => {
139
+ thold.push(
140
+ clause.map((w) => {
141
+ return this.weight(w);
142
+ })
143
+ );
144
+ });
145
+ return thold;
146
+ }
147
+
148
+ private _processUnweighted(thold: number) {
149
+ if (thold < 0) {
150
+ throw new Error('Non-positive int threshold = {thold}.');
151
+ }
152
+ this._thold = thold;
153
+ this._weighted = false;
154
+ this._size = this._thold; // used to verify that keys list size is at least size
155
+ this._satisfy = this._satisfy_numeric;
156
+ this._number = new CesrNumber({}, thold);
157
+ // this._bexter = undefined
158
+ }
159
+
160
+ private _processWeighted(thold: Array<Array<Fraction>>) {
161
+ for (const clause of thold) {
162
+ if (Number(math.sum(clause)) < 1) {
163
+ throw new Error(
164
+ 'Invalid sith clause: ' +
165
+ thold +
166
+ 'all clause weight sums must be >= 1'
167
+ );
168
+ }
50
169
  }
170
+
171
+ this._thold = thold;
172
+ this._weighted = true;
173
+ this._size = thold.reduce((acc, currentValue) => {
174
+ return acc + currentValue.length;
175
+ }, 0);
176
+ this._satisfy = this._satisfy_weighted;
177
+ //TODO: created Bexter if needed
178
+ }
179
+
180
+ private weight(w: string): Fraction {
181
+ return math.fraction(w);
182
+ }
183
+
184
+ private _satisfy_numeric(indices: any[]) {
185
+ return this.thold > 0 && indices.length >= this.thold; // at least one
186
+ }
187
+
188
+ private _satisfy_weighted(indices: any) {
189
+ if (indices.length === 0) {
190
+ return false;
191
+ }
192
+
193
+ const indexes: Set<number> = new Set(indices.sort());
194
+ const sats = new Array(indices.length).fill(false);
195
+ for (const idx of indexes) {
196
+ sats[idx] = true;
197
+ }
198
+ let wio = 0;
199
+ for (const clause of this.thold) {
200
+ let cw = 0;
201
+ for (const w of clause) {
202
+ if (sats[wio]) {
203
+ cw += Number(w);
204
+ }
205
+ wio += 1;
206
+ }
207
+ if (cw < 1) {
208
+ return false;
209
+ }
210
+ }
211
+
212
+ return true;
213
+ }
214
+
215
+ public satisfy(indices: any): boolean {
216
+ return this._satisfy(indices);
51
217
  }
52
- }
218
+ }
@@ -1,6 +1,12 @@
1
+ import { Counter, CtrDex } from './counter';
2
+ import { Seqner } from './seqner';
3
+ import { Prefixer } from './prefixer';
4
+ import { Saider } from './saider';
5
+ import { Serder } from './serder';
6
+ import { b } from './core';
1
7
 
2
8
  export function pad(n: any, width = 3, z = 0) {
3
- return (String(z).repeat(width) + String(n)).slice(String(n).length);
9
+ return (String(z).repeat(width) + String(n)).slice(String(n).length);
4
10
  }
5
11
 
6
12
  /**
@@ -11,19 +17,19 @@ export function pad(n: any, width = 3, z = 0) {
11
17
  * @param {*} labels labels is list of element labels in ked from which to extract values
12
18
  */
13
19
  export function extractValues(ked: any, labels: any) {
14
- let values = [];
15
- for (let label of labels) {
16
- values = extractElementValues(ked[label], values);
17
- }
20
+ let values = [];
21
+ for (const label of labels) {
22
+ values = extractElementValues(ked[label], values);
23
+ }
18
24
 
19
- return values;
25
+ return values;
20
26
  }
21
27
 
22
28
  export function arrayEquals(ar1: Uint8Array, ar2: Uint8Array) {
23
- return (
24
- ar1.length === ar2.length &&
25
- ar1.every((val, index) => val === ar2[index])
26
- );
29
+ return (
30
+ ar1.length === ar2.length &&
31
+ ar1.every((val, index) => val === ar2[index])
32
+ );
27
33
  }
28
34
 
29
35
  /**
@@ -36,27 +42,22 @@ export function arrayEquals(ar1: Uint8Array, ar2: Uint8Array) {
36
42
  */
37
43
 
38
44
  function extractElementValues(element: any, values: any) {
39
- let data = [];
40
-
41
-
42
- try {
43
- if((element instanceof Array) && !(typeof(element) == 'string')) {
44
- for(let k in element)
45
- extractElementValues(element[k], values);
46
- } else if (typeof(element) == 'string') {
47
- values.push(element);
45
+ let data = [];
46
+
47
+ try {
48
+ if (element instanceof Array && !(typeof element == 'string')) {
49
+ for (const k in element) extractElementValues(element[k], values);
50
+ } else if (typeof element == 'string') {
51
+ values.push(element);
52
+ }
53
+ data = values;
54
+ } catch (error) {
55
+ throw new Error(error as string);
48
56
  }
49
- data = values;
50
- } catch (error) {
51
- throw new Error(error as string);
52
- }
53
57
 
54
- return data;
58
+ return data;
55
59
  }
56
60
 
57
-
58
-
59
-
60
61
  /**
61
62
  * @description Returns True if obj is non-string iterable, False otherwise
62
63
 
@@ -68,31 +69,101 @@ function extractElementValues(element: any, values: any) {
68
69
  // return instanceof(obj, (str, bytes)) && instanceof(obj, Iterable))
69
70
  // }
70
71
 
71
-
72
72
  export function nowUTC(): Date {
73
- return new Date()
73
+ return new Date();
74
74
  }
75
75
 
76
-
77
76
  export function range(start: number, stop: number, step: number) {
78
- if (typeof stop == 'undefined') {
79
- // one param defined
80
- stop = start;
81
- start = 0;
82
- }
83
-
84
- if (typeof step == 'undefined') {
85
- step = 1;
86
- }
87
-
88
- if ((step > 0 && start >= stop) || (step < 0 && start <= stop)) {
89
- return [];
90
- }
91
-
92
- let result = new Array<number>();
93
- for (let i: number = start; step > 0 ? i < stop : i > stop; i += step) {
94
- result.push(i);
95
- }
96
-
97
- return result;
77
+ if (typeof stop == 'undefined') {
78
+ // one param defined
79
+ stop = start;
80
+ start = 0;
81
+ }
82
+
83
+ if (typeof step == 'undefined') {
84
+ step = 1;
85
+ }
86
+
87
+ if ((step > 0 && start >= stop) || (step < 0 && start <= stop)) {
88
+ return [];
89
+ }
90
+
91
+ const result = new Array<number>();
92
+ for (let i: number = start; step > 0 ? i < stop : i > stop; i += step) {
93
+ result.push(i);
94
+ }
95
+
96
+ return result;
97
+ }
98
+
99
+ export function intToBytes(value: number, length: number): Uint8Array {
100
+ const byteArray = new Uint8Array(length); // Assuming a 4-byte integer (32 bits)
101
+
102
+ for (let index = byteArray.length - 1; index >= 0; index--) {
103
+ const byte = value & 0xff;
104
+ byteArray[index] = byte;
105
+ value = (value - byte) / 256;
106
+ }
107
+ return byteArray;
108
+ }
109
+
110
+ export function bytesToInt(ar: Uint8Array): number {
111
+ let value = 0;
112
+ for (let i = 0; i < ar.length; i++) {
113
+ value = value * 256 + ar[i];
114
+ }
115
+ return value;
116
+ }
117
+
118
+ export function serializeACDCAttachment(anc: Serder): Uint8Array {
119
+ const prefixer = new Prefixer({ qb64: anc.pre });
120
+ const seqner = new Seqner({ sn: anc.sn });
121
+ const saider = new Saider({ qb64: anc.ked['d'] });
122
+ const craw = new Uint8Array();
123
+ const ctr = new Counter({ code: CtrDex.SealSourceTriples, count: 1 }).qb64b;
124
+ const prefix = prefixer.qb64b;
125
+ const seq = seqner.qb64b;
126
+ const said = saider.qb64b;
127
+ const newCraw = new Uint8Array(
128
+ craw.length + ctr.length + prefix.length + seq.length + said.length
129
+ );
130
+ newCraw.set(craw);
131
+ newCraw.set(ctr, craw.length);
132
+ newCraw.set(prefix, craw.length + ctr.length);
133
+ newCraw.set(seq, craw.length + ctr.length + prefix.length);
134
+ newCraw.set(said, craw.length + ctr.length + prefix.length + seq.length);
135
+ return newCraw;
136
+ }
137
+
138
+ export function serializeIssExnAttachment(anc: Serder): Uint8Array {
139
+ const seqner = new Seqner({ sn: anc.sn });
140
+ const ancSaider = new Saider({ qb64: anc.ked['d'] });
141
+ const coupleArray = new Uint8Array(
142
+ seqner.qb64b.length + ancSaider.qb64b.length
143
+ );
144
+ coupleArray.set(seqner.qb64b);
145
+ coupleArray.set(ancSaider.qb64b, seqner.qb64b.length);
146
+ const counter = new Counter({
147
+ code: CtrDex.SealSourceCouples,
148
+ count: 1,
149
+ });
150
+ const counterQb64b = counter.qb64b;
151
+ const atc = new Uint8Array(counter.qb64b.length + coupleArray.length);
152
+ atc.set(counterQb64b);
153
+ atc.set(coupleArray, counterQb64b.length);
154
+
155
+ if (atc.length % 4 !== 0) {
156
+ throw new Error(
157
+ `Invalid attachments size: ${atc.length}, non-integral quadlets detected.`
158
+ );
159
+ }
160
+ const pcnt = new Counter({
161
+ code: CtrDex.AttachedMaterialQuadlets,
162
+ count: Math.floor(atc.length / 4),
163
+ });
164
+ const msg = new Uint8Array(pcnt.qb64b.length + atc.length);
165
+ msg.set(pcnt.qb64b);
166
+ msg.set(atc, pcnt.qb64b.length);
167
+
168
+ return msg;
98
169
  }