@leofcoin/peernet 0.17.1 → 0.18.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 (112) hide show
  1. package/exports/browser/client-1c52a169.js +645 -0
  2. package/exports/browser/dht/dht.d.ts +30 -0
  3. package/exports/browser/discovery/peer-discovery.d.ts +7 -0
  4. package/exports/browser/errors/errors.d.ts +3 -0
  5. package/exports/browser/handlers/data.d.ts +2 -0
  6. package/exports/browser/handlers/message.d.ts +30 -0
  7. package/exports/browser/{index-019272d8.js → index-4a0fc4ea.js} +38 -923
  8. package/exports/browser/{index-3a25de4d.js → index-639f2260.js} +3 -1
  9. package/exports/browser/messages/chat.d.ts +6 -0
  10. package/exports/browser/messages/data-response.d.ts +6 -0
  11. package/exports/browser/messages/data.d.ts +10 -0
  12. package/exports/browser/messages/dht-response.d.ts +6 -0
  13. package/exports/browser/messages/dht.d.ts +14 -0
  14. package/exports/browser/messages/file-link.d.ts +10 -0
  15. package/exports/browser/messages/file.d.ts +10 -0
  16. package/exports/browser/messages/peer-response.d.ts +6 -0
  17. package/exports/browser/messages/peer.d.ts +6 -0
  18. package/exports/browser/messages/peernet.d.ts +6 -0
  19. package/exports/browser/messages/ps.d.ts +6 -0
  20. package/exports/browser/messages/request.d.ts +6 -0
  21. package/exports/browser/messages/response.d.ts +6 -0
  22. package/exports/browser/messages-6db1f01d.js +204 -0
  23. package/exports/browser/messages.d.ts +12 -0
  24. package/exports/browser/peer-info.d.ts +4 -0
  25. package/exports/browser/peernet-3b3933a5.js +3096 -0
  26. package/exports/browser/peernet.js +1 -1
  27. package/exports/browser/proto/chat-message.proto.d.ts +7 -0
  28. package/exports/browser/proto/data-response.proto.d.ts +5 -0
  29. package/exports/browser/proto/data.proto.d.ts +5 -0
  30. package/exports/browser/proto/dht-response.proto.d.ts +5 -0
  31. package/exports/browser/proto/dht.proto.d.ts +5 -0
  32. package/exports/browser/proto/file-link.proto.d.ts +6 -0
  33. package/exports/browser/proto/file.proto.d.ts +6 -0
  34. package/exports/browser/proto/peer-response.proto.d.ts +4 -0
  35. package/exports/browser/proto/peer.proto.d.ts +4 -0
  36. package/exports/browser/proto/peernet.proto.d.ts +8 -0
  37. package/exports/browser/proto/ps.proto.d.ts +5 -0
  38. package/exports/browser/proto/request.proto.d.ts +4 -0
  39. package/exports/browser/proto/response.proto.d.ts +4 -0
  40. package/exports/browser/utils/utils.d.ts +7 -0
  41. package/exports/dht/dht.d.ts +30 -0
  42. package/exports/discovery/peer-discovery.d.ts +7 -0
  43. package/exports/errors/errors.d.ts +3 -0
  44. package/exports/handlers/data.d.ts +2 -0
  45. package/exports/handlers/message.d.ts +30 -0
  46. package/exports/messages/chat.d.ts +6 -0
  47. package/exports/messages/data-response.d.ts +6 -0
  48. package/exports/messages/data.d.ts +10 -0
  49. package/exports/messages/dht-response.d.ts +6 -0
  50. package/exports/messages/dht.d.ts +14 -0
  51. package/exports/messages/file-link.d.ts +10 -0
  52. package/exports/messages/file.d.ts +10 -0
  53. package/exports/messages/peer-response.d.ts +6 -0
  54. package/exports/messages/peer.d.ts +6 -0
  55. package/exports/messages/peernet.d.ts +6 -0
  56. package/exports/messages/ps.d.ts +6 -0
  57. package/exports/messages/request.d.ts +6 -0
  58. package/exports/messages/response.d.ts +6 -0
  59. package/exports/messages-ebdc8c69.js +203 -0
  60. package/exports/messages.d.ts +12 -0
  61. package/exports/peer-info.d.ts +4 -0
  62. package/exports/peernet.js +863 -930
  63. package/exports/proto/chat-message.proto.d.ts +7 -0
  64. package/exports/proto/data-response.proto.d.ts +5 -0
  65. package/exports/proto/data.proto.d.ts +5 -0
  66. package/exports/proto/dht-response.proto.d.ts +5 -0
  67. package/exports/proto/dht.proto.d.ts +5 -0
  68. package/exports/proto/file-link.proto.d.ts +6 -0
  69. package/exports/proto/file.proto.d.ts +6 -0
  70. package/exports/proto/peer-response.proto.d.ts +4 -0
  71. package/exports/proto/peer.proto.d.ts +4 -0
  72. package/exports/proto/peernet.proto.d.ts +8 -0
  73. package/exports/proto/ps.proto.d.ts +5 -0
  74. package/exports/proto/request.proto.d.ts +4 -0
  75. package/exports/proto/response.proto.d.ts +4 -0
  76. package/exports/utils/utils.d.ts +7 -0
  77. package/package.json +4 -3
  78. package/rollup.config.js +9 -3
  79. package/src/messages/chat.js +0 -3
  80. package/src/messages/data-response.js +0 -3
  81. package/src/messages/data.js +0 -3
  82. package/src/messages/dht-response.js +0 -3
  83. package/src/messages/dht.js +0 -6
  84. package/src/messages/file-link.js +18 -0
  85. package/src/messages/file.js +0 -3
  86. package/src/messages/peer-response.js +0 -3
  87. package/src/messages/peer.js +0 -4
  88. package/src/messages/peernet.js +0 -3
  89. package/src/messages/ps.js +0 -4
  90. package/src/messages/request.js +0 -3
  91. package/src/messages/response.js +0 -3
  92. package/src/peernet.ts +26 -20
  93. package/src/proto/chat-message.proto.js +6 -7
  94. package/src/proto/data-response.proto.js +3 -6
  95. package/src/proto/data.proto.js +3 -6
  96. package/src/proto/dht-response.proto.js +3 -6
  97. package/src/proto/dht.proto.js +3 -6
  98. package/src/proto/file-link.proto.js +5 -0
  99. package/src/proto/file.proto.js +4 -13
  100. package/src/proto/peer-response.proto.js +2 -5
  101. package/src/proto/peer.proto.js +2 -5
  102. package/src/proto/peernet.proto.js +7 -9
  103. package/src/proto/ps.proto.js +4 -6
  104. package/src/proto/request.proto.js +2 -5
  105. package/src/proto/response.proto.js +2 -5
  106. package/test.js +2 -2
  107. package/test2.js +1 -1
  108. package/tsconfig.json +3 -9
  109. package/exports/browser/client-29660363.js +0 -690
  110. package/exports/browser/messages-4850566c.js +0 -303
  111. package/exports/browser/peernet-379769d5.js +0 -2896
  112. package/exports/messages-796c4d5c.js +0 -302
@@ -0,0 +1,3096 @@
1
+ import { K as KeyValue } from './value-40634404.js';
2
+
3
+ if (!globalThis.DEBUG) {
4
+ if (globalThis.localStorage) globalThis.DEBUG = Boolean(globalThis.localStorage.getItem('DEBUG') === 'true');
5
+ }
6
+
7
+ globalThis.debug = text => {
8
+ if (globalThis.DEBUG) console.log('\x1b[34m\x1b[1m%s', text, '\x1b[0m'); // bright blue
9
+ };
10
+
11
+ class LittlePubSub {
12
+ subscribers = {};
13
+ verbose;
14
+ constructor(verbose = false) {
15
+ this.verbose = verbose;
16
+ }
17
+ #handleContext(handler, context) {
18
+ if (typeof context === 'undefined') {
19
+ context = handler;
20
+ }
21
+ return context;
22
+ }
23
+ hasSubscribers(event) {
24
+ return this.subscribers[event] ? true : false;
25
+ }
26
+ subscribe(event, handler, context) {
27
+ if (!this.hasSubscribers(event))
28
+ this.subscribers[event] = { handlers: [], value: undefined };
29
+ context = this.#handleContext(handler, context);
30
+ this.subscribers[event].handlers.push(handler.bind(context));
31
+ }
32
+ unsubscribe(event, handler, context) {
33
+ if (!this.hasSubscribers(event))
34
+ return;
35
+ context = this.#handleContext(handler, context);
36
+ const index = this.subscribers[event].handlers.indexOf(handler.bind(context));
37
+ this.subscribers[event].handlers.splice(index);
38
+ if (this.subscribers[event].handlers.length === 0)
39
+ delete this.subscribers[event];
40
+ }
41
+ publish(event, change) {
42
+ if (!this.hasSubscribers(event))
43
+ return;
44
+ if (this.verbose || this.subscribers[event].value !== change) {
45
+ this.subscribers[event].value = change;
46
+ this.subscribers[event].handlers.forEach((handler) => {
47
+ handler(change, this.subscribers[event].value);
48
+ });
49
+ }
50
+ }
51
+ once(event) {
52
+ return new Promise((resolve) => {
53
+ const cb = (value) => {
54
+ this.unsubscribe(event, cb);
55
+ resolve(value);
56
+ };
57
+ this.subscribe(event, cb);
58
+ });
59
+ }
60
+ }
61
+
62
+ // base-x encoding / decoding
63
+ // Copyright (c) 2018 base-x contributors
64
+ // Copyright (c) 2014-2018 The Bitcoin Core developers (base58.cpp)
65
+ // Distributed under the MIT software license, see the accompanying
66
+ // file LICENSE or http://www.opensource.org/licenses/mit-license.php.
67
+ const base = (ALPHABET) => {
68
+ if (ALPHABET.length >= 255) {
69
+ throw new TypeError('Alphabet too long');
70
+ }
71
+ const BASE_MAP = new Uint8Array(256);
72
+ for (let j = 0; j < BASE_MAP.length; j++) {
73
+ BASE_MAP[j] = 255;
74
+ }
75
+ for (let i = 0; i < ALPHABET.length; i++) {
76
+ const x = ALPHABET.charAt(i);
77
+ const xc = x.charCodeAt(0);
78
+ if (BASE_MAP[xc] !== 255) {
79
+ throw new TypeError(x + ' is ambiguous');
80
+ }
81
+ BASE_MAP[xc] = i;
82
+ }
83
+ const BASE = ALPHABET.length;
84
+ const LEADER = ALPHABET.charAt(0);
85
+ const FACTOR = Math.log(BASE) / Math.log(256); // log(BASE) / log(256), rounded up
86
+ const iFACTOR = Math.log(256) / Math.log(BASE); // log(256) / log(BASE), rounded up
87
+ const encode = (source) => {
88
+ if (source instanceof Uint8Array) ;
89
+ else if (ArrayBuffer.isView(source)) {
90
+ source = new Uint8Array(source.buffer, source.byteOffset, source.byteLength);
91
+ }
92
+ else if (Array.isArray(source)) {
93
+ source = Uint8Array.from(source);
94
+ }
95
+ if (!(source instanceof Uint8Array)) {
96
+ throw new TypeError('Expected Uint8Array');
97
+ }
98
+ if (source.length === 0) {
99
+ return '';
100
+ }
101
+ // Skip & count leading zeroes.
102
+ let zeroes = 0;
103
+ let length = 0;
104
+ let pbegin = 0;
105
+ const pend = source.length;
106
+ while (pbegin !== pend && source[pbegin] === 0) {
107
+ pbegin++;
108
+ zeroes++;
109
+ }
110
+ // Allocate enough space in big-endian base58 representation.
111
+ const size = ((pend - pbegin) * iFACTOR + 1) >>> 0;
112
+ const b58 = new Uint8Array(size);
113
+ // Process the bytes.
114
+ while (pbegin !== pend) {
115
+ let carry = source[pbegin];
116
+ // Apply "b58 = b58 * 256 + ch".
117
+ let i = 0;
118
+ for (let it1 = size - 1; (carry !== 0 || i < length) && (it1 !== -1); it1--, i++) {
119
+ carry += (256 * b58[it1]) >>> 0;
120
+ b58[it1] = (carry % BASE) >>> 0;
121
+ carry = (carry / BASE) >>> 0;
122
+ }
123
+ if (carry !== 0) {
124
+ throw new Error('Non-zero carry');
125
+ }
126
+ length = i;
127
+ pbegin++;
128
+ }
129
+ // Skip leading zeroes in base58 result.
130
+ let it2 = size - length;
131
+ while (it2 !== size && b58[it2] === 0) {
132
+ it2++;
133
+ }
134
+ // Translate the result into a string.
135
+ let str = LEADER.repeat(zeroes);
136
+ for (; it2 < size; ++it2) {
137
+ str += ALPHABET.charAt(b58[it2]);
138
+ }
139
+ return str;
140
+ };
141
+ const decodeUnsafe = (source) => {
142
+ if (typeof source !== 'string') {
143
+ throw new TypeError('Expected String');
144
+ }
145
+ if (source.length === 0) {
146
+ return new Uint8Array();
147
+ }
148
+ let psz = 0;
149
+ // Skip and count leading '1's.
150
+ let zeroes = 0;
151
+ let length = 0;
152
+ while (source[psz] === LEADER) {
153
+ zeroes++;
154
+ psz++;
155
+ }
156
+ // Allocate enough space in big-endian base256 representation.
157
+ const size = (((source.length - psz) * FACTOR) + 1) >>> 0; // log(58) / log(256), rounded up.
158
+ let b256 = new Uint8Array(size);
159
+ // Process the characters.
160
+ while (source[psz]) {
161
+ // Decode character
162
+ let carry = BASE_MAP[source.charCodeAt(psz)];
163
+ // Invalid character
164
+ if (carry === 255) {
165
+ return;
166
+ }
167
+ let i = 0;
168
+ for (let it3 = size - 1; (carry !== 0 || i < length) && (it3 !== -1); it3--, i++) {
169
+ carry += (BASE * b256[it3]) >>> 0;
170
+ b256[it3] = (carry % 256) >>> 0;
171
+ carry = (carry / 256) >>> 0;
172
+ }
173
+ if (carry !== 0) {
174
+ throw new Error('Non-zero carry');
175
+ }
176
+ length = i;
177
+ psz++;
178
+ }
179
+ // Skip leading zeroes in b256.
180
+ let it4 = size - length;
181
+ while (it4 !== size && b256[it4] === 0) {
182
+ it4++;
183
+ }
184
+ let vch = new Uint8Array(zeroes + (size - it4));
185
+ let j = zeroes;
186
+ while (it4 !== size) {
187
+ vch[j++] = b256[it4++];
188
+ }
189
+ return vch;
190
+ };
191
+ const decode = (string) => {
192
+ const buffer = decodeUnsafe(string);
193
+ if (buffer) {
194
+ return buffer;
195
+ }
196
+ throw new Error('Non-base' + BASE + ' character');
197
+ };
198
+ return {
199
+ encode,
200
+ decodeUnsafe,
201
+ decode
202
+ };
203
+ };
204
+
205
+ const ALPHABET$3 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567';
206
+ const ALPHABET_HEX$1 = '0123456789ABCDEFGHIJKLMNOPQRSTUV';
207
+ const base32 = base(ALPHABET$3);
208
+ const base32Hex = base(ALPHABET_HEX$1);
209
+ const decode$6 = base32.decode;
210
+ const decodeHex$1 = base32Hex.decode;
211
+ const encode$6 = base32.encode;
212
+ const encodeHex$1 = base32Hex.encode;
213
+ const isBase32 = (string, hex = false) => {
214
+ try {
215
+ if (hex)
216
+ decodeHex$1(string);
217
+ else
218
+ decode$6(string);
219
+ return true;
220
+ }
221
+ catch (e) {
222
+ return false;
223
+ }
224
+ };
225
+ const isBase32Hex = (string) => {
226
+ return isBase32(string, true);
227
+ };
228
+ var index$7 = {
229
+ encode: encode$6,
230
+ decode: decode$6,
231
+ encodeHex: encodeHex$1,
232
+ decodeHex: decodeHex$1,
233
+ isBase32,
234
+ isBase32Hex
235
+ };
236
+
237
+ var ALPHABET$2 = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz';
238
+ var ALPHABET_HEX = '0123456789ABCDEFGHJKLMNPQRSTUVabcdefghijklmnopqrstuv';
239
+ var base58 = base(ALPHABET$2);
240
+ var base58Hex = base(ALPHABET_HEX);
241
+ var encode$5 = base58.encode;
242
+ var decode$5 = base58.decode;
243
+ var encodeHex = base58Hex.encode;
244
+ var decodeHex = base58Hex.decode;
245
+ var isBase58 = function (string) {
246
+ try {
247
+ decode$5(string);
248
+ return true;
249
+ }
250
+ catch (e) {
251
+ return false;
252
+ }
253
+ };
254
+ var isBase58Hex = function (string) {
255
+ try {
256
+ decodeHex(string);
257
+ return true;
258
+ }
259
+ catch (e) {
260
+ return false;
261
+ }
262
+ };
263
+ var whatType = function (string) {
264
+ try {
265
+ decode$5(string);
266
+ return 'base58';
267
+ }
268
+ catch (e) {
269
+ try {
270
+ decodeHex(string);
271
+ return 'base58Hex';
272
+ }
273
+ catch (_a) {
274
+ return;
275
+ }
276
+ }
277
+ };
278
+ var base58$1 = { encode: encode$5, decode: decode$5, isBase58: isBase58, isBase58Hex: isBase58Hex, encodeHex: encodeHex, decodeHex: decodeHex, whatType: whatType };
279
+
280
+ const MSB$1 = 0x80;
281
+ const REST$1 = 0x7F;
282
+ const MSBALL = ~REST$1;
283
+ const INT = Math.pow(2, 31);
284
+ const encode$4 = (num, out, offset) => {
285
+ if (Number.MAX_SAFE_INTEGER && num > Number.MAX_SAFE_INTEGER) {
286
+ encode$4.bytes = 0;
287
+ throw new RangeError('Could not encode varint');
288
+ }
289
+ out = out || [];
290
+ offset = offset || 0;
291
+ const oldOffset = offset;
292
+ while (num >= INT) {
293
+ out[offset++] = (num & 0xFF) | MSB$1;
294
+ num /= 128;
295
+ }
296
+ while (num & MSBALL) {
297
+ out[offset++] = (num & 0xFF) | MSB$1;
298
+ num >>>= 7;
299
+ }
300
+ out[offset] = num | 0;
301
+ encode$4.bytes = offset - oldOffset + 1;
302
+ return out;
303
+ };
304
+
305
+ const MSB = 0x80;
306
+ const REST = 0x7F;
307
+ const decode$4 = (buf, offset) => {
308
+ offset = offset || 0;
309
+ const l = buf.length;
310
+ let counter = offset;
311
+ let result = 0;
312
+ let shift = 0;
313
+ let b;
314
+ do {
315
+ if (counter >= l || shift > 49) {
316
+ decode$4.bytes = 0;
317
+ throw new RangeError('Could not decode varint');
318
+ }
319
+ b = buf[counter++];
320
+ result += shift < 28
321
+ ? (b & REST) << shift
322
+ : (b & REST) * Math.pow(2, shift);
323
+ shift += 7;
324
+ } while (b >= MSB);
325
+ decode$4.bytes = counter - offset;
326
+ return result;
327
+ };
328
+
329
+ const N1 = Math.pow(2, 7);
330
+ const N2 = Math.pow(2, 14);
331
+ const N3 = Math.pow(2, 21);
332
+ const N4 = Math.pow(2, 28);
333
+ const N5 = Math.pow(2, 35);
334
+ const N6 = Math.pow(2, 42);
335
+ const N7 = Math.pow(2, 49);
336
+ const N8 = Math.pow(2, 56);
337
+ const N9 = Math.pow(2, 63);
338
+ var encodingLength = (value) => (value < N1 ? 1
339
+ : value < N2 ? 2
340
+ : value < N3 ? 3
341
+ : value < N4 ? 4
342
+ : value < N5 ? 5
343
+ : value < N6 ? 6
344
+ : value < N7 ? 7
345
+ : value < N8 ? 8
346
+ : value < N9 ? 9
347
+ : 10);
348
+
349
+ var index$6 = {
350
+ encode: encode$4,
351
+ decode: decode$4,
352
+ encodingLength
353
+ };
354
+
355
+ var index$5 = (input, prefix) => {
356
+ const encodedArray = [];
357
+ const length = input.reduce((total, current) => {
358
+ const encoded = index$6.encode(current.length);
359
+ encodedArray.push(encoded);
360
+ total += current.length + encoded.length;
361
+ return total;
362
+ }, 0);
363
+ const typedArray = new Uint8Array(prefix ? prefix.length + length : length);
364
+ let currentIndex = 0;
365
+ let index = 0;
366
+ if (prefix) {
367
+ typedArray.set(prefix);
368
+ currentIndex += prefix.length;
369
+ }
370
+ for (const source of input) {
371
+ typedArray.set(encodedArray[index], currentIndex);
372
+ currentIndex += encodedArray[index].length;
373
+ typedArray.set(source, currentIndex);
374
+ currentIndex += source.length;
375
+ index += 1;
376
+ }
377
+ return typedArray;
378
+ };
379
+
380
+ var index$4 = (typedArray, prefix) => {
381
+ const set = [];
382
+ if (prefix)
383
+ typedArray = typedArray.subarray(prefix.length);
384
+ const varintAndSub = (typedArray) => {
385
+ const length = index$6.decode(typedArray);
386
+ // remove length
387
+ typedArray = typedArray.subarray(index$6.decode.bytes);
388
+ // push value
389
+ set.push(typedArray.subarray(0, length));
390
+ // remove value
391
+ typedArray = typedArray.subarray(length);
392
+ if (typedArray.length !== 0)
393
+ return varintAndSub(typedArray);
394
+ return set;
395
+ };
396
+ return varintAndSub(typedArray);
397
+ };
398
+
399
+ const ALPHABET$1 = '0123456789ABCDEF';
400
+ const base16 = base(ALPHABET$1);
401
+ const decode$3 = base16.decode;
402
+ const encode$3 = base16.encode;
403
+ const isBase16 = (string) => {
404
+ try {
405
+ decode$3(string);
406
+ return true;
407
+ }
408
+ catch (e) {
409
+ return false;
410
+ }
411
+ };
412
+ var index$3 = {
413
+ encode: encode$3,
414
+ decode: decode$3,
415
+ isBase16
416
+ };
417
+
418
+ const ALPHABET = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_';
419
+ const base64 = base(ALPHABET);
420
+ const decode$2 = base64.decode;
421
+ const encode$2 = base64.encode;
422
+ const isBase64 = (string) => {
423
+ try {
424
+ decode$2(string);
425
+ return true;
426
+ }
427
+ catch (e) {
428
+ return false;
429
+ }
430
+ };
431
+ var index$2 = {
432
+ encode: encode$2,
433
+ decode: decode$2,
434
+ isBase64
435
+ };
436
+
437
+ const isTypedArrayCompatible = (possibleUint8Array) => {
438
+ if (typeof possibleUint8Array === 'string') {
439
+ possibleUint8Array = possibleUint8Array.split(',').map(number => Number(number));
440
+ for (const number of possibleUint8Array) {
441
+ if (isNaN(number))
442
+ return false;
443
+ }
444
+ }
445
+ for (const number of possibleUint8Array) {
446
+ if (isNaN(number))
447
+ return false;
448
+ }
449
+ return true;
450
+ };
451
+ /**
452
+ * Returns a String as Uint8Array
453
+ * @param string string to encode to Uint8Array
454
+ * @returns Uint8Array
455
+ */
456
+ const fromString$1 = (string) => new TextEncoder().encode(string);
457
+ /**
458
+ * Returns a Uint8Array as String
459
+ * @param uint8Array Uint8Array to encode to String
460
+ * @returns String
461
+ */
462
+ const toString$1 = (uint8Array) => new TextDecoder().decode(uint8Array);
463
+ /**
464
+ * Returns a String as Uint8Array
465
+ * @param string string to encode to Uint8Array
466
+ * @returns Uint8Array
467
+ */
468
+ const fromUintArrayString = (string) => Uint8Array.from(string.split(',').map(string => Number(string)));
469
+ /**
470
+ * Returns a Uint8Array as String
471
+ * @param uint8Array Uint8Array to encode to String
472
+ * @returns String
473
+ */
474
+ const toUintArrayString = (uint8Array) => uint8Array.toString();
475
+ /**
476
+ * hexString -> uint8Array
477
+ * @param string hex encoded string
478
+ * @returns UintArray
479
+ */
480
+ const fromHex = (string) => Uint8Array.from(string.match(/.{1,2}/g).map((byte) => parseInt(byte, 16)));
481
+ /**
482
+ * uint8Array -> hexString
483
+ * @param bytes number[]
484
+ * @returns hexString
485
+ */
486
+ const toHex = (bytes) => bytes.reduce((string, byte) => string + byte.toString(16).padStart(2, '0'), '');
487
+ /**
488
+ * number[] -> Uint8Array
489
+ * @param array number[]
490
+ * @returns Uint8Array
491
+ */
492
+ const fromArrayLike = (array) => Uint8Array.from(array);
493
+ /**
494
+ * Uint8Array -> number[]
495
+ * @param uint8Array Uint8Array
496
+ * @returns Uint8Array
497
+ */
498
+ const toArrayLike = (uint8Array) => [...uint8Array.values()];
499
+ const toBase64 = (uint8Array) => index$2.encode(uint8Array);
500
+ const fromBase64 = (string) => index$2.decode(string);
501
+ const toBase58 = (uint8Array) => base58$1.encode(uint8Array);
502
+ const fromBase58 = (string) => base58$1.decode(string);
503
+ const toBase32 = (uint8Array) => index$7.encode(uint8Array);
504
+ const fromBase32 = (string) => index$7.decode(string);
505
+ const toBase16 = (uint8Array) => index$3.encode(uint8Array);
506
+ const fromBase16 = (string) => index$3.decode(string);
507
+ let FormatInterface$2 = class FormatInterface {
508
+ encoded;
509
+ constructor(input) {
510
+ if (input) {
511
+ if (index$3.isBase16(input))
512
+ this.encoded = this.fromBase16(input);
513
+ else if (index$7.isBase32(input))
514
+ this.encoded = this.fromBase32(input);
515
+ else if (base58$1.isBase58(input))
516
+ this.encoded = this.fromBase58(input);
517
+ else if (index$2.isBase64(input))
518
+ this.encoded = this.fromBase64(input);
519
+ else if (typeof input === 'string') {
520
+ let isCompatible = isTypedArrayCompatible(input);
521
+ if (isCompatible)
522
+ this.encoded = fromUintArrayString(input);
523
+ else
524
+ this.encoded = this.fromString(input); // normal string
525
+ }
526
+ else if (typeof input === 'object')
527
+ this.encoded = this.fromObject(input);
528
+ else if (input instanceof Uint8Array)
529
+ this.encoded = input;
530
+ else if (Array.isArray(input) && isTypedArrayCompatible(input))
531
+ this.encoded = this.fromArrayLike(input);
532
+ }
533
+ }
534
+ /**
535
+ * Returns a String as Uint8Array
536
+ * @param string string to encode to Uint8Array
537
+ * @returns Uint8Array
538
+ */
539
+ fromString(string) {
540
+ return new TextEncoder().encode(string);
541
+ }
542
+ /**
543
+ * Returns a Uint8Array as String
544
+ * @param uint8Array Uint8Array to encode to String
545
+ * @returns String
546
+ */
547
+ toString(uint8Array) {
548
+ return new TextDecoder().decode(uint8Array);
549
+ }
550
+ /**
551
+ * Returns a String as Uint8Array
552
+ * @param string string to encode to Uint8Array
553
+ * @returns Uint8Array
554
+ */
555
+ fromUintArrayString(string) {
556
+ return Uint8Array.from(string.split(',').map(string => Number(string)));
557
+ }
558
+ /**
559
+ * Returns a Uint8Array as String
560
+ * @param uint8Array Uint8Array to encode to String
561
+ * @returns String
562
+ */
563
+ toUintArrayString(uint8Array) {
564
+ return uint8Array.toString();
565
+ }
566
+ /**
567
+ * hexString -> uint8Array
568
+ * @param string hex encoded string
569
+ * @returns UintArray
570
+ */
571
+ fromHex(string) {
572
+ return Uint8Array.from(string.match(/.{1,2}/g).map((byte) => parseInt(byte, 16)));
573
+ }
574
+ /**
575
+ * uint8Array -> hexString
576
+ * @param bytes number[]
577
+ * @returns hexString
578
+ */
579
+ toHex(bytes) {
580
+ return bytes.reduce((string, byte) => string + byte.toString(16).padStart(2, '0'), '');
581
+ }
582
+ /**
583
+ * number[] -> Uint8Array
584
+ * @param array number[]
585
+ * @returns Uint8Array
586
+ */
587
+ fromArrayLike(array) {
588
+ return Uint8Array.from(array);
589
+ }
590
+ /**
591
+ * Uint8Array -> number[]
592
+ * @param uint8Array Uint8Array
593
+ * @returns Uint8Array
594
+ */
595
+ toArrayLike(uint8Array) {
596
+ return [...uint8Array.values()];
597
+ }
598
+ fromObject(object) {
599
+ return new TextEncoder().encode(JSON.stringify(object));
600
+ }
601
+ toObject(uint8Array) {
602
+ return JSON.parse(new TextDecoder().decode(uint8Array));
603
+ }
604
+ toBase64(uint8Array) {
605
+ return index$2.encode(uint8Array);
606
+ }
607
+ fromBase64(string) {
608
+ return index$2.decode(string);
609
+ }
610
+ toBase58(uint8Array) {
611
+ return base58$1.encode(uint8Array);
612
+ }
613
+ fromBase58(string) {
614
+ return base58$1.decode(string);
615
+ }
616
+ toBase32(uint8Array) {
617
+ return index$7.encode(uint8Array);
618
+ }
619
+ fromBase32(string) {
620
+ return index$7.decode(string);
621
+ }
622
+ toBase16(uint8Array) {
623
+ return index$3.encode(uint8Array);
624
+ }
625
+ fromBase16(string) {
626
+ return index$3.decode(string);
627
+ }
628
+ };
629
+ var index$1 = {
630
+ fromString: fromString$1,
631
+ toString: toString$1,
632
+ fromHex,
633
+ toHex,
634
+ fromArrayLike,
635
+ toArrayLike,
636
+ fromUintArrayString,
637
+ toUintArrayString,
638
+ toBase64,
639
+ fromBase64,
640
+ toBase58,
641
+ fromBase58,
642
+ toBase32,
643
+ fromBase32,
644
+ toBase16,
645
+ fromBase16,
646
+ FormatInterface: FormatInterface$2
647
+ };
648
+
649
+ const { fromString, toString } = index$1;
650
+ const isJson = (type) => type === 'object' || 'array';
651
+ const isString = (type) => type === 'string';
652
+ const isNumber = (type) => type === 'number';
653
+ const isUint8Array = (type) => type === 'uint8Array';
654
+ const tokenize = (key, value) => {
655
+ const optional = key.endsWith('?');
656
+ let type = value;
657
+ type = Array.isArray(type) ? 'array' : typeof type;
658
+ if (value instanceof Uint8Array)
659
+ type = 'uint8Array';
660
+ const parts = key.split('?');
661
+ const minimumLength = parts[2]?.includes('min') ? parts[2].split['min:'][1] : 0;
662
+ return { type, optional, key: parts[0], minimumLength };
663
+ };
664
+ const encode$1 = (proto, input) => {
665
+ const keys = Object.keys(proto);
666
+ const values = Object.values(proto);
667
+ const set = [];
668
+ for (let i = 0; i < keys.length; i++) {
669
+ const token = tokenize(keys[i], values[i]);
670
+ const data = input[token.key];
671
+ if (!token.optional && data === undefined)
672
+ throw new Error(`requires: ${token.key}`);
673
+ if (token.type !== 'object' && token.minimumLength > data.length || token.type === 'object' && token.minimumLength > Object.keys(data).length)
674
+ throw new Error(`minimumLength for ${token.key} is set to ${token.minimumLength} but got ${data.length}`);
675
+ if (isUint8Array(token.type))
676
+ set.push(data);
677
+ else if (isString(token.type))
678
+ set.push(fromString(data));
679
+ else if (isNumber(token.type))
680
+ set.push(new TextEncoder().encode(data.toString()));
681
+ else if (isJson(token.type))
682
+ set.push(new TextEncoder().encode(JSON.stringify(data)));
683
+ }
684
+ return index$5(set);
685
+ };
686
+ const decode$1 = (proto, uint8Array) => {
687
+ let deconcated = index$4(uint8Array);
688
+ const output = {};
689
+ const keys = Object.keys(proto);
690
+ const values = Object.values(proto);
691
+ if (keys.length !== deconcated.length)
692
+ console.warn(`length mismatch: expected ${keys.length} got ${uint8Array.length}`);
693
+ for (let i = 0; i < keys.length; i++) {
694
+ const token = tokenize(keys[i], values[i]);
695
+ if (isUint8Array(token.type))
696
+ output[token.key] = deconcated[i];
697
+ else if (isString(token.type))
698
+ output[token.key] = toString(deconcated[i]);
699
+ else if (isNumber(token.type))
700
+ output[token.key] = Number(new TextDecoder().decode(deconcated[i]));
701
+ else if (isJson(token.type))
702
+ output[token.key] = JSON.parse(new TextDecoder().decode(deconcated[i]));
703
+ if (!token.optional && output[token.key] === undefined)
704
+ throw new Error(`missing required property: ${token.key}`);
705
+ }
706
+ return output;
707
+ };
708
+ var index = {
709
+ encode: encode$1,
710
+ decode: decode$1
711
+ };
712
+
713
+ /*!
714
+ * hash-wasm (https://www.npmjs.com/package/hash-wasm)
715
+ * (c) Dani Biro
716
+ * @license MIT
717
+ */
718
+
719
+ /*! *****************************************************************************
720
+ Copyright (c) Microsoft Corporation.
721
+
722
+ Permission to use, copy, modify, and/or distribute this software for any
723
+ purpose with or without fee is hereby granted.
724
+
725
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
726
+ REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
727
+ AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
728
+ INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
729
+ LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
730
+ OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
731
+ PERFORMANCE OF THIS SOFTWARE.
732
+ ***************************************************************************** */
733
+
734
+ function __awaiter(thisArg, _arguments, P, generator) {
735
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
736
+ return new (P || (P = Promise))(function (resolve, reject) {
737
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
738
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
739
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
740
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
741
+ });
742
+ }
743
+
744
+ class Mutex {
745
+ constructor() {
746
+ this.mutex = Promise.resolve();
747
+ }
748
+ lock() {
749
+ let begin = () => { };
750
+ this.mutex = this.mutex.then(() => new Promise(begin));
751
+ return new Promise((res) => {
752
+ begin = res;
753
+ });
754
+ }
755
+ dispatch(fn) {
756
+ return __awaiter(this, void 0, void 0, function* () {
757
+ const unlock = yield this.lock();
758
+ try {
759
+ return yield Promise.resolve(fn());
760
+ }
761
+ finally {
762
+ unlock();
763
+ }
764
+ });
765
+ }
766
+ }
767
+
768
+ /* eslint-disable import/prefer-default-export */
769
+ /* eslint-disable no-bitwise */
770
+ var _a;
771
+ function getGlobal() {
772
+ if (typeof globalThis !== 'undefined')
773
+ return globalThis;
774
+ // eslint-disable-next-line no-restricted-globals
775
+ if (typeof self !== 'undefined')
776
+ return self;
777
+ if (typeof window !== 'undefined')
778
+ return window;
779
+ return global;
780
+ }
781
+ const globalObject = getGlobal();
782
+ const nodeBuffer = (_a = globalObject.Buffer) !== null && _a !== void 0 ? _a : null;
783
+ const textEncoder = globalObject.TextEncoder ? new globalObject.TextEncoder() : null;
784
+ function hexCharCodesToInt(a, b) {
785
+ return (((a & 0xF) + ((a >> 6) | ((a >> 3) & 0x8))) << 4) | ((b & 0xF) + ((b >> 6) | ((b >> 3) & 0x8)));
786
+ }
787
+ function writeHexToUInt8(buf, str) {
788
+ const size = str.length >> 1;
789
+ for (let i = 0; i < size; i++) {
790
+ const index = i << 1;
791
+ buf[i] = hexCharCodesToInt(str.charCodeAt(index), str.charCodeAt(index + 1));
792
+ }
793
+ }
794
+ function hexStringEqualsUInt8(str, buf) {
795
+ if (str.length !== buf.length * 2) {
796
+ return false;
797
+ }
798
+ for (let i = 0; i < buf.length; i++) {
799
+ const strIndex = i << 1;
800
+ if (buf[i] !== hexCharCodesToInt(str.charCodeAt(strIndex), str.charCodeAt(strIndex + 1))) {
801
+ return false;
802
+ }
803
+ }
804
+ return true;
805
+ }
806
+ const alpha = 'a'.charCodeAt(0) - 10;
807
+ const digit = '0'.charCodeAt(0);
808
+ function getDigestHex(tmpBuffer, input, hashLength) {
809
+ let p = 0;
810
+ /* eslint-disable no-plusplus */
811
+ for (let i = 0; i < hashLength; i++) {
812
+ let nibble = input[i] >>> 4;
813
+ tmpBuffer[p++] = nibble > 9 ? nibble + alpha : nibble + digit;
814
+ nibble = input[i] & 0xF;
815
+ tmpBuffer[p++] = nibble > 9 ? nibble + alpha : nibble + digit;
816
+ }
817
+ /* eslint-enable no-plusplus */
818
+ return String.fromCharCode.apply(null, tmpBuffer);
819
+ }
820
+ const getUInt8Buffer = nodeBuffer !== null
821
+ ? (data) => {
822
+ if (typeof data === 'string') {
823
+ const buf = nodeBuffer.from(data, 'utf8');
824
+ return new Uint8Array(buf.buffer, buf.byteOffset, buf.length);
825
+ }
826
+ if (nodeBuffer.isBuffer(data)) {
827
+ return new Uint8Array(data.buffer, data.byteOffset, data.length);
828
+ }
829
+ if (ArrayBuffer.isView(data)) {
830
+ return new Uint8Array(data.buffer, data.byteOffset, data.byteLength);
831
+ }
832
+ throw new Error('Invalid data type!');
833
+ }
834
+ : (data) => {
835
+ if (typeof data === 'string') {
836
+ return textEncoder.encode(data);
837
+ }
838
+ if (ArrayBuffer.isView(data)) {
839
+ return new Uint8Array(data.buffer, data.byteOffset, data.byteLength);
840
+ }
841
+ throw new Error('Invalid data type!');
842
+ };
843
+ const base64Chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
844
+ const base64Lookup = new Uint8Array(256);
845
+ for (let i = 0; i < base64Chars.length; i++) {
846
+ base64Lookup[base64Chars.charCodeAt(i)] = i;
847
+ }
848
+ function getDecodeBase64Length(data) {
849
+ let bufferLength = Math.floor(data.length * 0.75);
850
+ const len = data.length;
851
+ if (data[len - 1] === '=') {
852
+ bufferLength -= 1;
853
+ if (data[len - 2] === '=') {
854
+ bufferLength -= 1;
855
+ }
856
+ }
857
+ return bufferLength;
858
+ }
859
+ function decodeBase64(data) {
860
+ const bufferLength = getDecodeBase64Length(data);
861
+ const len = data.length;
862
+ const bytes = new Uint8Array(bufferLength);
863
+ let p = 0;
864
+ for (let i = 0; i < len; i += 4) {
865
+ const encoded1 = base64Lookup[data.charCodeAt(i)];
866
+ const encoded2 = base64Lookup[data.charCodeAt(i + 1)];
867
+ const encoded3 = base64Lookup[data.charCodeAt(i + 2)];
868
+ const encoded4 = base64Lookup[data.charCodeAt(i + 3)];
869
+ bytes[p] = (encoded1 << 2) | (encoded2 >> 4);
870
+ p += 1;
871
+ bytes[p] = ((encoded2 & 15) << 4) | (encoded3 >> 2);
872
+ p += 1;
873
+ bytes[p] = ((encoded3 & 3) << 6) | (encoded4 & 63);
874
+ p += 1;
875
+ }
876
+ return bytes;
877
+ }
878
+
879
+ const MAX_HEAP = 16 * 1024;
880
+ const WASM_FUNC_HASH_LENGTH = 4;
881
+ const wasmMutex = new Mutex();
882
+ const wasmModuleCache = new Map();
883
+ function WASMInterface(binary, hashLength) {
884
+ return __awaiter(this, void 0, void 0, function* () {
885
+ let wasmInstance = null;
886
+ let memoryView = null;
887
+ let initialized = false;
888
+ if (typeof WebAssembly === 'undefined') {
889
+ throw new Error('WebAssembly is not supported in this environment!');
890
+ }
891
+ const writeMemory = (data, offset = 0) => {
892
+ memoryView.set(data, offset);
893
+ };
894
+ const getMemory = () => memoryView;
895
+ const getExports = () => wasmInstance.exports;
896
+ const setMemorySize = (totalSize) => {
897
+ wasmInstance.exports.Hash_SetMemorySize(totalSize);
898
+ const arrayOffset = wasmInstance.exports.Hash_GetBuffer();
899
+ const memoryBuffer = wasmInstance.exports.memory.buffer;
900
+ memoryView = new Uint8Array(memoryBuffer, arrayOffset, totalSize);
901
+ };
902
+ const getStateSize = () => {
903
+ const view = new DataView(wasmInstance.exports.memory.buffer);
904
+ const stateSize = view.getUint32(wasmInstance.exports.STATE_SIZE, true);
905
+ return stateSize;
906
+ };
907
+ const loadWASMPromise = wasmMutex.dispatch(() => __awaiter(this, void 0, void 0, function* () {
908
+ if (!wasmModuleCache.has(binary.name)) {
909
+ const asm = decodeBase64(binary.data);
910
+ const promise = WebAssembly.compile(asm);
911
+ wasmModuleCache.set(binary.name, promise);
912
+ }
913
+ const module = yield wasmModuleCache.get(binary.name);
914
+ wasmInstance = yield WebAssembly.instantiate(module, {
915
+ // env: {
916
+ // emscripten_memcpy_big: (dest, src, num) => {
917
+ // const memoryBuffer = wasmInstance.exports.memory.buffer;
918
+ // const memView = new Uint8Array(memoryBuffer, 0);
919
+ // memView.set(memView.subarray(src, src + num), dest);
920
+ // },
921
+ // print_memory: (offset, len) => {
922
+ // const memoryBuffer = wasmInstance.exports.memory.buffer;
923
+ // const memView = new Uint8Array(memoryBuffer, 0);
924
+ // console.log('print_int32', memView.subarray(offset, offset + len));
925
+ // },
926
+ // },
927
+ });
928
+ // wasmInstance.exports._start();
929
+ }));
930
+ const setupInterface = () => __awaiter(this, void 0, void 0, function* () {
931
+ if (!wasmInstance) {
932
+ yield loadWASMPromise;
933
+ }
934
+ const arrayOffset = wasmInstance.exports.Hash_GetBuffer();
935
+ const memoryBuffer = wasmInstance.exports.memory.buffer;
936
+ memoryView = new Uint8Array(memoryBuffer, arrayOffset, MAX_HEAP);
937
+ });
938
+ const init = (bits = null) => {
939
+ initialized = true;
940
+ wasmInstance.exports.Hash_Init(bits);
941
+ };
942
+ const updateUInt8Array = (data) => {
943
+ let read = 0;
944
+ while (read < data.length) {
945
+ const chunk = data.subarray(read, read + MAX_HEAP);
946
+ read += chunk.length;
947
+ memoryView.set(chunk);
948
+ wasmInstance.exports.Hash_Update(chunk.length);
949
+ }
950
+ };
951
+ const update = (data) => {
952
+ if (!initialized) {
953
+ throw new Error('update() called before init()');
954
+ }
955
+ const Uint8Buffer = getUInt8Buffer(data);
956
+ updateUInt8Array(Uint8Buffer);
957
+ };
958
+ const digestChars = new Uint8Array(hashLength * 2);
959
+ const digest = (outputType, padding = null) => {
960
+ if (!initialized) {
961
+ throw new Error('digest() called before init()');
962
+ }
963
+ initialized = false;
964
+ wasmInstance.exports.Hash_Final(padding);
965
+ if (outputType === 'binary') {
966
+ // the data is copied to allow GC of the original memory object
967
+ return memoryView.slice(0, hashLength);
968
+ }
969
+ return getDigestHex(digestChars, memoryView, hashLength);
970
+ };
971
+ const save = () => {
972
+ if (!initialized) {
973
+ throw new Error('save() can only be called after init() and before digest()');
974
+ }
975
+ const stateOffset = wasmInstance.exports.Hash_GetState();
976
+ const stateLength = getStateSize();
977
+ const memoryBuffer = wasmInstance.exports.memory.buffer;
978
+ const internalState = new Uint8Array(memoryBuffer, stateOffset, stateLength);
979
+ // prefix is 4 bytes from SHA1 hash of the WASM binary
980
+ // it is used to detect incompatible internal states between different versions of hash-wasm
981
+ const prefixedState = new Uint8Array(WASM_FUNC_HASH_LENGTH + stateLength);
982
+ writeHexToUInt8(prefixedState, binary.hash);
983
+ prefixedState.set(internalState, WASM_FUNC_HASH_LENGTH);
984
+ return prefixedState;
985
+ };
986
+ const load = (state) => {
987
+ if (!(state instanceof Uint8Array)) {
988
+ throw new Error('load() expects an Uint8Array generated by save()');
989
+ }
990
+ const stateOffset = wasmInstance.exports.Hash_GetState();
991
+ const stateLength = getStateSize();
992
+ const overallLength = WASM_FUNC_HASH_LENGTH + stateLength;
993
+ const memoryBuffer = wasmInstance.exports.memory.buffer;
994
+ if (state.length !== overallLength) {
995
+ throw new Error(`Bad state length (expected ${overallLength} bytes, got ${state.length})`);
996
+ }
997
+ if (!hexStringEqualsUInt8(binary.hash, state.subarray(0, WASM_FUNC_HASH_LENGTH))) {
998
+ throw new Error('This state was written by an incompatible hash implementation');
999
+ }
1000
+ const internalState = state.subarray(WASM_FUNC_HASH_LENGTH);
1001
+ new Uint8Array(memoryBuffer, stateOffset, stateLength).set(internalState);
1002
+ initialized = true;
1003
+ };
1004
+ const isDataShort = (data) => {
1005
+ if (typeof data === 'string') {
1006
+ // worst case is 4 bytes / char
1007
+ return data.length < MAX_HEAP / 4;
1008
+ }
1009
+ return data.byteLength < MAX_HEAP;
1010
+ };
1011
+ let canSimplify = isDataShort;
1012
+ switch (binary.name) {
1013
+ case 'argon2':
1014
+ case 'scrypt':
1015
+ canSimplify = () => true;
1016
+ break;
1017
+ case 'blake2b':
1018
+ case 'blake2s':
1019
+ // if there is a key at blake2 then cannot simplify
1020
+ canSimplify = (data, initParam) => initParam <= 512 && isDataShort(data);
1021
+ break;
1022
+ case 'blake3':
1023
+ // if there is a key at blake3 then cannot simplify
1024
+ canSimplify = (data, initParam) => initParam === 0 && isDataShort(data);
1025
+ break;
1026
+ case 'xxhash64': // cannot simplify
1027
+ case 'xxhash3':
1028
+ case 'xxhash128':
1029
+ canSimplify = () => false;
1030
+ break;
1031
+ }
1032
+ // shorthand for (init + update + digest) for better performance
1033
+ const calculate = (data, initParam = null, digestParam = null) => {
1034
+ if (!canSimplify(data, initParam)) {
1035
+ init(initParam);
1036
+ update(data);
1037
+ return digest('hex', digestParam);
1038
+ }
1039
+ const buffer = getUInt8Buffer(data);
1040
+ memoryView.set(buffer);
1041
+ wasmInstance.exports.Hash_Calculate(buffer.length, initParam, digestParam);
1042
+ return getDigestHex(digestChars, memoryView, hashLength);
1043
+ };
1044
+ yield setupInterface();
1045
+ return {
1046
+ getMemory,
1047
+ writeMemory,
1048
+ getExports,
1049
+ setMemorySize,
1050
+ init,
1051
+ update,
1052
+ digest,
1053
+ save,
1054
+ load,
1055
+ calculate,
1056
+ hashLength,
1057
+ };
1058
+ });
1059
+ }
1060
+
1061
+ new Mutex();
1062
+
1063
+ new Mutex();
1064
+
1065
+ new Mutex();
1066
+
1067
+ new Mutex();
1068
+
1069
+ new Mutex();
1070
+
1071
+ new Mutex();
1072
+
1073
+ new Mutex();
1074
+
1075
+ new Mutex();
1076
+
1077
+ new Mutex();
1078
+
1079
+ var name$b = "sha3";
1080
+ var data$b = "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";
1081
+ var hash$b = "ec266d91";
1082
+ var wasmJson$b = {
1083
+ name: name$b,
1084
+ data: data$b,
1085
+ hash: hash$b
1086
+ };
1087
+
1088
+ new Mutex();
1089
+
1090
+ new Mutex();
1091
+ function validateBits(bits) {
1092
+ if (![224, 256, 384, 512].includes(bits)) {
1093
+ return new Error('Invalid variant! Valid values: 224, 256, 384, 512');
1094
+ }
1095
+ return null;
1096
+ }
1097
+ /**
1098
+ * Creates a new Keccak hash instance
1099
+ * @param bits Number of output bits. Valid values: 224, 256, 384, 512
1100
+ */
1101
+ function createKeccak(bits = 512) {
1102
+ if (validateBits(bits)) {
1103
+ return Promise.reject(validateBits(bits));
1104
+ }
1105
+ const outputSize = bits / 8;
1106
+ return WASMInterface(wasmJson$b, outputSize).then((wasm) => {
1107
+ wasm.init(bits);
1108
+ const obj = {
1109
+ init: () => { wasm.init(bits); return obj; },
1110
+ update: (data) => { wasm.update(data); return obj; },
1111
+ digest: (outputType) => wasm.digest(outputType, 0x01),
1112
+ save: () => wasm.save(),
1113
+ load: (data) => { wasm.load(data); return obj; },
1114
+ blockSize: 200 - 2 * outputSize,
1115
+ digestSize: outputSize,
1116
+ };
1117
+ return obj;
1118
+ });
1119
+ }
1120
+
1121
+ new Mutex();
1122
+
1123
+ new Mutex();
1124
+
1125
+ var name$9 = "sha512";
1126
+ var data$9 = "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";
1127
+ var hash$9 = "a5d1ca7c";
1128
+ var wasmJson$9 = {
1129
+ name: name$9,
1130
+ data: data$9,
1131
+ hash: hash$9
1132
+ };
1133
+
1134
+ new Mutex();
1135
+
1136
+ new Mutex();
1137
+ /**
1138
+ * Creates a new SHA-2 (SHA-512) hash instance
1139
+ */
1140
+ function createSHA512() {
1141
+ return WASMInterface(wasmJson$9, 64).then((wasm) => {
1142
+ wasm.init(512);
1143
+ const obj = {
1144
+ init: () => { wasm.init(512); return obj; },
1145
+ update: (data) => { wasm.update(data); return obj; },
1146
+ digest: (outputType) => wasm.digest(outputType),
1147
+ save: () => wasm.save(),
1148
+ load: (data) => { wasm.load(data); return obj; },
1149
+ blockSize: 128,
1150
+ digestSize: 64,
1151
+ };
1152
+ return obj;
1153
+ });
1154
+ }
1155
+
1156
+ new Mutex();
1157
+
1158
+ new Mutex();
1159
+
1160
+ new Mutex();
1161
+
1162
+ new Mutex();
1163
+
1164
+ var name$4 = "ripemd160";
1165
+ var data$4 = "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";
1166
+ var hash$4 = "42f1de39";
1167
+ var wasmJson$4 = {
1168
+ name: name$4,
1169
+ data: data$4,
1170
+ hash: hash$4
1171
+ };
1172
+
1173
+ new Mutex();
1174
+ /**
1175
+ * Creates a new RIPEMD-160 hash instance
1176
+ */
1177
+ function createRIPEMD160() {
1178
+ return WASMInterface(wasmJson$4, 20).then((wasm) => {
1179
+ wasm.init();
1180
+ const obj = {
1181
+ init: () => { wasm.init(); return obj; },
1182
+ update: (data) => { wasm.update(data); return obj; },
1183
+ digest: (outputType) => wasm.digest(outputType),
1184
+ save: () => wasm.save(),
1185
+ load: (data) => { wasm.load(data); return obj; },
1186
+ blockSize: 64,
1187
+ digestSize: 20,
1188
+ };
1189
+ return obj;
1190
+ });
1191
+ }
1192
+
1193
+ function calculateKeyBuffer(hasher, key) {
1194
+ const { blockSize } = hasher;
1195
+ const buf = getUInt8Buffer(key);
1196
+ if (buf.length > blockSize) {
1197
+ hasher.update(buf);
1198
+ const uintArr = hasher.digest('binary');
1199
+ hasher.init();
1200
+ return uintArr;
1201
+ }
1202
+ return new Uint8Array(buf.buffer, buf.byteOffset, buf.length);
1203
+ }
1204
+ function calculateHmac(hasher, key) {
1205
+ hasher.init();
1206
+ const { blockSize } = hasher;
1207
+ const keyBuf = calculateKeyBuffer(hasher, key);
1208
+ const keyBuffer = new Uint8Array(blockSize);
1209
+ keyBuffer.set(keyBuf);
1210
+ const opad = new Uint8Array(blockSize);
1211
+ for (let i = 0; i < blockSize; i++) {
1212
+ const v = keyBuffer[i];
1213
+ opad[i] = v ^ 0x5C;
1214
+ keyBuffer[i] = v ^ 0x36;
1215
+ }
1216
+ hasher.update(keyBuffer);
1217
+ const obj = {
1218
+ init: () => {
1219
+ hasher.init();
1220
+ hasher.update(keyBuffer);
1221
+ return obj;
1222
+ },
1223
+ update: (data) => {
1224
+ hasher.update(data);
1225
+ return obj;
1226
+ },
1227
+ digest: ((outputType) => {
1228
+ const uintArr = hasher.digest('binary');
1229
+ hasher.init();
1230
+ hasher.update(opad);
1231
+ hasher.update(uintArr);
1232
+ return hasher.digest(outputType);
1233
+ }),
1234
+ save: () => {
1235
+ throw new Error('save() not supported');
1236
+ },
1237
+ load: () => {
1238
+ throw new Error('load() not supported');
1239
+ },
1240
+ blockSize: hasher.blockSize,
1241
+ digestSize: hasher.digestSize,
1242
+ };
1243
+ return obj;
1244
+ }
1245
+ /**
1246
+ * Calculates HMAC hash
1247
+ * @param hash Hash algorithm to use. It has to be the return value of a function like createSHA1()
1248
+ * @param key Key (string, Buffer or TypedArray)
1249
+ */
1250
+ function createHMAC(hash, key) {
1251
+ if (!hash || !hash.then) {
1252
+ throw new Error('Invalid hash function is provided! Usage: createHMAC(createMD5(), "key").');
1253
+ }
1254
+ return hash.then((hasher) => calculateHmac(hasher, key));
1255
+ }
1256
+
1257
+ new Mutex();
1258
+
1259
+ new Mutex();
1260
+
1261
+ /**
1262
+ * @param {string}
1263
+ */
1264
+ var isHex = (function (string) { return /^[A-F0-9]+$/i.test(string); });
1265
+
1266
+ let BasicInterface$1 = class BasicInterface {
1267
+ encoded;
1268
+ decoded;
1269
+ keys;
1270
+ name;
1271
+ #proto;
1272
+ set proto(value) {
1273
+ this.#proto = value;
1274
+ this.keys = Object.keys(value);
1275
+ }
1276
+ get proto() {
1277
+ return this.#proto;
1278
+ }
1279
+ decode(encoded) {
1280
+ encoded = encoded || this.encoded;
1281
+ return new Object();
1282
+ }
1283
+ encode(decoded) {
1284
+ decoded = decoded || this.decoded;
1285
+ return new Uint8Array();
1286
+ }
1287
+ // get Codec(): Codec {}
1288
+ protoEncode(data) {
1289
+ // check schema
1290
+ return index.encode(this.proto, data);
1291
+ }
1292
+ protoDecode(data) {
1293
+ // check schema
1294
+ return index.decode(this.proto, data);
1295
+ }
1296
+ isHex(string) {
1297
+ return isHex(string);
1298
+ }
1299
+ isBase32(string) {
1300
+ return index$7.isBase32(string);
1301
+ }
1302
+ isBase58(string) {
1303
+ return base58$1.isBase58(string);
1304
+ }
1305
+ fromBs32(encoded) {
1306
+ return this.decode(index$7.decode(encoded));
1307
+ }
1308
+ fromBs58(encoded) {
1309
+ return this.decode(fromBase58(encoded));
1310
+ }
1311
+ async toArray() {
1312
+ const array = [];
1313
+ for await (const value of this.encoded.values()) {
1314
+ array.push(value);
1315
+ }
1316
+ return array;
1317
+ }
1318
+ fromString(string) {
1319
+ const array = string.split(',');
1320
+ const arrayLike = array.map(string => Number(string));
1321
+ return this.decode(Uint8Array.from(arrayLike));
1322
+ }
1323
+ fromHex(string) {
1324
+ return this.decode(fromHex(string));
1325
+ }
1326
+ fromArray(array) {
1327
+ return this.decode(Uint8Array.from([...array]));
1328
+ }
1329
+ fromEncoded(encoded) {
1330
+ return this.decode(encoded);
1331
+ }
1332
+ toString() {
1333
+ if (!this.encoded)
1334
+ this.encode();
1335
+ return this.encoded.toString();
1336
+ }
1337
+ toHex() {
1338
+ if (!this.encoded)
1339
+ this.encode();
1340
+ return toHex(this.encoded.toString().split(',').map(number => Number(number)));
1341
+ }
1342
+ /**
1343
+ * @return {String} encoded
1344
+ */
1345
+ toBs32() {
1346
+ if (!this.encoded)
1347
+ this.encode();
1348
+ return toBase32(this.encoded);
1349
+ }
1350
+ /**
1351
+ * @return {String} encoded
1352
+ */
1353
+ toBs58() {
1354
+ if (!this.encoded)
1355
+ this.encode();
1356
+ return toBase58(this.encoded);
1357
+ }
1358
+ /**
1359
+ * @param {Object} data
1360
+ */
1361
+ create(data) {
1362
+ const decoded = {};
1363
+ if (this.keys?.length > 0) {
1364
+ for (const key of this.keys) {
1365
+ Object.defineProperties(decoded, {
1366
+ [key]: {
1367
+ enumerable: true,
1368
+ configurable: true,
1369
+ set: (value) => data[key],
1370
+ get: () => data[key]
1371
+ }
1372
+ });
1373
+ }
1374
+ this.decoded = decoded;
1375
+ return this.encode(decoded);
1376
+ }
1377
+ }
1378
+ };
1379
+
1380
+ var codecs$1 = {
1381
+ // just a hash
1382
+ 'disco-hash': {
1383
+ codec: parseInt('0x30', 16),
1384
+ hashAlg: 'dbl-keccak-256', // ,
1385
+ // testnet: 'olivia'
1386
+ },
1387
+ 'peernet-peer-response': {
1388
+ codec: parseInt('0x707072', 16),
1389
+ hashAlg: 'keccak-256',
1390
+ },
1391
+ 'peernet-peer': {
1392
+ codec: parseInt('0x7070', 16),
1393
+ hashAlg: 'keccak-256',
1394
+ },
1395
+ 'peernet-dht': {
1396
+ codec: parseInt('0x706468', 16),
1397
+ hashAlg: 'keccak-256',
1398
+ },
1399
+ 'peernet-dht-response': {
1400
+ codec: parseInt('0x706472', 16),
1401
+ hashAlg: 'keccak-256',
1402
+ },
1403
+ // data
1404
+ 'peernet-data': {
1405
+ codec: parseInt('0x706461', 16),
1406
+ hashAlg: 'keccak-256',
1407
+ },
1408
+ 'peernet-data-response': {
1409
+ codec: parseInt('0x70646172', 16),
1410
+ hashAlg: 'keccak-256',
1411
+ },
1412
+ // message
1413
+ 'peernet-message': {
1414
+ codec: parseInt('0x706d65', 16),
1415
+ hashAlg: 'keccak-256',
1416
+ },
1417
+ // pubsub
1418
+ 'peernet-ps': {
1419
+ codec: parseInt('0x707073', 16),
1420
+ hashAlg: 'keccak-256',
1421
+ },
1422
+ 'peernet-response': {
1423
+ codec: parseInt('0x7072', 16),
1424
+ hashAlg: 'keccak-256',
1425
+ },
1426
+ 'peernet-request': {
1427
+ codec: parseInt('0x707271', 16),
1428
+ hashAlg: 'keccak-256',
1429
+ },
1430
+ // normal block
1431
+ 'leofcoin-block': {
1432
+ codec: parseInt('0x6c62', 16),
1433
+ hashAlg: 'dbl-keccak-512', // ,
1434
+ // testnet: 'olivia'
1435
+ },
1436
+ 'leofcoin-tx': {
1437
+ codec: parseInt('0x6c74', 16),
1438
+ hashAlg: 'dbl-keccak-512', // ,
1439
+ // testnet: 'olivia'
1440
+ },
1441
+ // itx
1442
+ 'leofcoin-itx': {
1443
+ codec: parseInt('0x6c69', 16),
1444
+ hashAlg: 'keccak-512', // ,
1445
+ // testnet: 'olivia'
1446
+ },
1447
+ // peer reputation
1448
+ 'leofcoin-pr': {
1449
+ codec: parseInt('0x6c70', 16),
1450
+ hashAlg: 'keccak-256', // ,
1451
+ // testnet: 'olivia'
1452
+ },
1453
+ // chat message
1454
+ 'chat-message': {
1455
+ codec: parseInt('0x70636d', 16),
1456
+ hashAlg: 'dbl-keccak-256',
1457
+ },
1458
+ 'peernet-file': {
1459
+ codec: parseInt('0x7066', 16),
1460
+ hashAlg: 'keccak-256',
1461
+ },
1462
+ 'peernet-file-response': {
1463
+ codec: parseInt('0x706672', 16),
1464
+ hashAlg: 'keccak-256',
1465
+ }
1466
+ };
1467
+
1468
+ let Codec$1 = class Codec extends BasicInterface$1 {
1469
+ codecBuffer;
1470
+ codec;
1471
+ hashAlg;
1472
+ get codecs() {
1473
+ const globalCodecs = globalThis.peernet?.codecs || {};
1474
+ return { ...globalCodecs, ...codecs$1 };
1475
+ }
1476
+ constructor(buffer) {
1477
+ super();
1478
+ if (buffer) {
1479
+ if (buffer instanceof Uint8Array) {
1480
+ const codec = index$6.decode(buffer);
1481
+ const name = this.getCodecName(codec);
1482
+ if (name) {
1483
+ this.name = name;
1484
+ this.encoded = buffer;
1485
+ this.decode(buffer);
1486
+ }
1487
+ else {
1488
+ this.encode(buffer);
1489
+ }
1490
+ }
1491
+ else if (buffer instanceof ArrayBuffer) {
1492
+ const codec = index$6.decode(buffer);
1493
+ const name = this.getCodecName(codec);
1494
+ if (name) {
1495
+ this.name = name;
1496
+ this.decode(buffer);
1497
+ }
1498
+ else {
1499
+ this.encode(buffer);
1500
+ }
1501
+ }
1502
+ else if (typeof buffer === 'string') {
1503
+ if (this.codecs[buffer])
1504
+ this.fromName(buffer);
1505
+ else if (this.isHex(buffer))
1506
+ this.fromHex(buffer);
1507
+ else if (this.isBase32(buffer))
1508
+ this.fromBs32(buffer);
1509
+ else if (this.isBase58(buffer))
1510
+ this.fromBs58(buffer);
1511
+ else
1512
+ throw new Error(`unsupported string ${buffer}`);
1513
+ }
1514
+ if (!isNaN(buffer))
1515
+ if (this.codecs[this.getCodecName(buffer)])
1516
+ this.fromCodec(buffer);
1517
+ }
1518
+ }
1519
+ fromEncoded(encoded) {
1520
+ const codec = index$6.decode(encoded);
1521
+ const name = this.getCodecName(codec);
1522
+ this.name = name;
1523
+ this.encoded = encoded;
1524
+ return this.decode(encoded);
1525
+ }
1526
+ getCodec(name) {
1527
+ return this.codecs[name].codec;
1528
+ }
1529
+ getCodecName(codec) {
1530
+ return Object.keys(this.codecs).reduce((p, c) => {
1531
+ const item = this.codecs[c];
1532
+ if (item.codec === codec)
1533
+ return c;
1534
+ else
1535
+ return p;
1536
+ }, undefined);
1537
+ }
1538
+ getHashAlg(name) {
1539
+ return this.codecs[name].hashAlg;
1540
+ }
1541
+ fromCodec(codec) {
1542
+ this.name = this.getCodecName(codec);
1543
+ this.hashAlg = this.getHashAlg(this.name);
1544
+ this.codec = this.getCodec(this.name);
1545
+ this.codecBuffer = index$6.encode(codec);
1546
+ }
1547
+ fromName(name) {
1548
+ const codec = this.getCodec(name);
1549
+ this.name = name;
1550
+ this.codec = codec;
1551
+ this.hashAlg = this.getHashAlg(name);
1552
+ this.codecBuffer = index$6.encode(codec);
1553
+ }
1554
+ decode(encoded) {
1555
+ encoded = encoded || this.encoded;
1556
+ const codec = index$6.decode(encoded);
1557
+ this.fromCodec(codec);
1558
+ return this.decoded;
1559
+ }
1560
+ encode(codec) {
1561
+ codec = codec || this.codec;
1562
+ this.encoded = index$6.encode(codec);
1563
+ return this.encoded;
1564
+ }
1565
+ };
1566
+
1567
+ let CodecHash$1 = class CodecHash extends BasicInterface$1 {
1568
+ constructor(buffer, options = {}) {
1569
+ super();
1570
+ if (options.name)
1571
+ this.name = options.name;
1572
+ else
1573
+ this.name = 'disco-hash';
1574
+ if (options.codecs)
1575
+ this.codecs = options.codecs;
1576
+ return this.init(buffer);
1577
+ }
1578
+ async init(uint8Array) {
1579
+ if (uint8Array) {
1580
+ if (uint8Array instanceof Uint8Array) {
1581
+ this.discoCodec = new Codec$1(uint8Array, this.codecs);
1582
+ const name = this.discoCodec.name;
1583
+ if (name) {
1584
+ this.name = name;
1585
+ this.decode(uint8Array);
1586
+ }
1587
+ else {
1588
+ await this.encode(uint8Array);
1589
+ }
1590
+ }
1591
+ if (typeof uint8Array === 'string') {
1592
+ if (this.isHex(uint8Array))
1593
+ await this.fromHex(uint8Array);
1594
+ if (this.isBase32(uint8Array))
1595
+ await this.fromBs32(uint8Array);
1596
+ else if (this.isBase58(uint8Array))
1597
+ await this.fromBs58(uint8Array);
1598
+ else
1599
+ throw new Error(`unsupported string ${uint8Array}`);
1600
+ }
1601
+ else if (typeof uint8Array === 'object')
1602
+ await this.fromJSON(uint8Array);
1603
+ }
1604
+ return this;
1605
+ }
1606
+ get prefix() {
1607
+ const length = this.length;
1608
+ const uint8Array = new Uint8Array(length.length + this.discoCodec.codecBuffer.length);
1609
+ uint8Array.set(length);
1610
+ uint8Array.set(this.discoCodec.codecBuffer, length.length);
1611
+ return uint8Array;
1612
+ }
1613
+ get length() {
1614
+ return index$6.encode(this.size);
1615
+ }
1616
+ get buffer() {
1617
+ return this.encoded;
1618
+ }
1619
+ get hash() {
1620
+ return this.encoded;
1621
+ }
1622
+ fromJSON(json) {
1623
+ return this.encode(Buffer.from(JSON.stringify(json)));
1624
+ }
1625
+ async encode(buffer, name) {
1626
+ if (!this.name && name)
1627
+ this.name = name;
1628
+ if (!buffer)
1629
+ buffer = this.buffer;
1630
+ this.discoCodec = new Codec$1(this.name, this.codecs);
1631
+ this.discoCodec.fromName(this.name);
1632
+ let hashAlg = this.discoCodec.hashAlg;
1633
+ const hashVariant = Number(hashAlg.split('-')[hashAlg.split('-').length - 1]);
1634
+ if (hashAlg.includes('dbl')) {
1635
+ hashAlg = hashAlg.replace('dbl-', '');
1636
+ const hasher = await createKeccak(hashVariant);
1637
+ await hasher.init();
1638
+ hasher.update(buffer);
1639
+ buffer = hasher.digest('binary');
1640
+ }
1641
+ const hasher = await createKeccak(hashVariant);
1642
+ await hasher.init();
1643
+ hasher.update(buffer);
1644
+ this.digest = hasher.digest('binary');
1645
+ this.size = this.digest.length;
1646
+ this.codec = this.discoCodec.encode();
1647
+ this.codec = this.discoCodec.codecBuffer;
1648
+ const uint8Array = new Uint8Array(this.digest.length + this.prefix.length);
1649
+ uint8Array.set(this.prefix);
1650
+ uint8Array.set(this.digest, this.prefix.length);
1651
+ this.encoded = uint8Array;
1652
+ return this.encoded;
1653
+ }
1654
+ async validate(buffer) {
1655
+ if (Buffer.isBuffer(buffer)) {
1656
+ const codec = index$6.decode(buffer);
1657
+ if (this.codecs[codec]) {
1658
+ this.decode(buffer);
1659
+ }
1660
+ else {
1661
+ await this.encode(buffer);
1662
+ }
1663
+ }
1664
+ if (typeof buffer === 'string') {
1665
+ if (this.isHex(buffer))
1666
+ this.fromHex(buffer);
1667
+ if (this.isBase32(buffer))
1668
+ this.fromBs32(buffer);
1669
+ }
1670
+ if (typeof buffer === 'object')
1671
+ this.fromJSON(buffer);
1672
+ }
1673
+ decode(buffer) {
1674
+ this.encoded = buffer;
1675
+ const codec = index$6.decode(buffer);
1676
+ this.discoCodec = new Codec$1(codec, this.codecs);
1677
+ // TODO: validate codec
1678
+ buffer = buffer.slice(index$6.decode.bytes);
1679
+ this.size = index$6.decode(buffer);
1680
+ this.digest = buffer.slice(index$6.decode.bytes);
1681
+ if (this.digest.length !== this.size) {
1682
+ throw new Error(`hash length inconsistent: 0x${this.encoded.toString('hex')}`);
1683
+ }
1684
+ // const discoCodec = new Codec(codec, this.codecs)
1685
+ this.name = this.discoCodec.name;
1686
+ this.size = this.digest.length;
1687
+ return {
1688
+ codec: this.codec,
1689
+ name: this.name,
1690
+ size: this.size,
1691
+ length: this.length,
1692
+ digest: this.digest,
1693
+ };
1694
+ }
1695
+ };
1696
+
1697
+ let FormatInterface$1 = class FormatInterface extends BasicInterface$1 {
1698
+ hashFormat;
1699
+ init(buffer) {
1700
+ if (buffer instanceof Uint8Array)
1701
+ this.fromUint8Array(buffer);
1702
+ else if (buffer instanceof ArrayBuffer)
1703
+ this.fromArrayBuffer(buffer);
1704
+ else if (buffer instanceof FormatInterface$1 && buffer?.name === this.name)
1705
+ return buffer;
1706
+ else if (buffer instanceof String) {
1707
+ if (this.isHex(buffer))
1708
+ this.fromHex(buffer);
1709
+ else if (this.isBase58(buffer))
1710
+ this.fromBs58(buffer);
1711
+ else if (this.isBase32(buffer))
1712
+ this.fromBs32(buffer);
1713
+ else
1714
+ throw new Error(`unsupported ${buffer}`);
1715
+ }
1716
+ else {
1717
+ this.create(buffer);
1718
+ }
1719
+ return this;
1720
+ }
1721
+ hasCodec() {
1722
+ if (!this.encoded)
1723
+ return false;
1724
+ const codec = new Codec$1(this.encoded);
1725
+ if (codec.name)
1726
+ return true;
1727
+ }
1728
+ decode(encoded) {
1729
+ encoded = encoded || this.encoded;
1730
+ const codec = new Codec$1(this.encoded);
1731
+ if (codec.codecBuffer) {
1732
+ encoded = encoded.slice(codec.codecBuffer.length);
1733
+ this.name = codec.name;
1734
+ this.decoded = this.protoDecode(encoded);
1735
+ // try {
1736
+ // this.decoded = JSON.parse(this.decoded)
1737
+ // } catch {
1738
+ // }
1739
+ }
1740
+ else {
1741
+ throw new Error(`no codec found`);
1742
+ }
1743
+ return this.decoded;
1744
+ }
1745
+ encode(decoded) {
1746
+ let encoded;
1747
+ if (!decoded)
1748
+ decoded = this.decoded;
1749
+ const codec = new Codec$1(this.name);
1750
+ if (decoded instanceof Uint8Array)
1751
+ encoded = decoded;
1752
+ else
1753
+ encoded = this.protoEncode(decoded);
1754
+ if (codec.codecBuffer) {
1755
+ const uint8Array = new Uint8Array(encoded.length + codec.codecBuffer.length);
1756
+ uint8Array.set(codec.codecBuffer);
1757
+ uint8Array.set(encoded, codec.codecBuffer.length);
1758
+ this.encoded = uint8Array;
1759
+ }
1760
+ else {
1761
+ throw new Error(`invalid codec`);
1762
+ }
1763
+ return this.encoded;
1764
+ }
1765
+ /**
1766
+ * @param {Buffer|String|Object} buffer - data - The data needed to create the desired message
1767
+ * @param {Object} proto - {protoObject}
1768
+ * @param {Object} options - {hashFormat, name}
1769
+ */
1770
+ constructor(buffer, proto, options) {
1771
+ super();
1772
+ this.proto = proto;
1773
+ this.hashFormat = options?.hashFormat ? options.hashFormat : 'bs32';
1774
+ if (options?.name)
1775
+ this.name = options.name;
1776
+ this.init(buffer);
1777
+ }
1778
+ /**
1779
+ * @return {PeernetHash}
1780
+ */
1781
+ get peernetHash() {
1782
+ return new CodecHash$1(this.decoded, { name: this.name });
1783
+ }
1784
+ /**
1785
+ * @return {peernetHash}
1786
+ */
1787
+ async hash() {
1788
+ const upper = this.hashFormat.charAt(0).toUpperCase();
1789
+ const format = `${upper}${this.hashFormat.substring(1, this.hashFormat.length)}`;
1790
+ return (await this.peernetHash)[`to${format}`]();
1791
+ }
1792
+ fromUint8Array(buffer) {
1793
+ this.encoded = buffer;
1794
+ return this.hasCodec() ? this.decode() : this.create(JSON.parse(new TextDecoder().decode(this.encoded)));
1795
+ }
1796
+ fromArrayBuffer(buffer) {
1797
+ this.encoded = new Uint8Array(buffer, buffer.byteOffset, buffer.byteLength);
1798
+ return this.hasCodec() ? this.decode() : this.create(JSON.parse(new TextDecoder().decode(this.encoded)));
1799
+ }
1800
+ };
1801
+ const FormatInterface = FormatInterface$1;
1802
+ const Codec = Codec$1;
1803
+
1804
+ const BufferToUint8Array = data => {
1805
+ if (data.type === 'Buffer') {
1806
+ data = new Uint8Array(data.data);
1807
+ }
1808
+ return data;
1809
+ };
1810
+ const protoFor = (message) => {
1811
+ const codec = new Codec(message);
1812
+ if (!codec.name)
1813
+ throw new Error('proto not found');
1814
+ const Proto = globalThis.peernet.protos[codec.name];
1815
+ if (!Proto)
1816
+ throw (new Error(`No proto defined for ${codec.name}`));
1817
+ return new Proto(message);
1818
+ };
1819
+ /**
1820
+ * wether or not a peernet daemon is active
1821
+ * @return {Boolean}
1822
+ */
1823
+ const hasDaemon = async () => {
1824
+ try {
1825
+ let response = await fetch('http://127.0.0.1:1000/api/version');
1826
+ response = await response.json();
1827
+ return Boolean(response.client === '@peernet/api/http');
1828
+ }
1829
+ catch (e) {
1830
+ return false;
1831
+ }
1832
+ };
1833
+ const https = () => {
1834
+ if (!globalThis.location)
1835
+ return false;
1836
+ return Boolean(globalThis.location.protocol === 'https:');
1837
+ };
1838
+ /**
1839
+ * Get current environment
1840
+ * @return {String} current environment [node, electron, browser]
1841
+ */
1842
+ const environment = () => {
1843
+ const _navigator = globalThis.navigator;
1844
+ if (!_navigator) {
1845
+ return 'node';
1846
+ }
1847
+ else if (_navigator && /electron/i.test(_navigator.userAgent)) {
1848
+ return 'electron';
1849
+ }
1850
+ else {
1851
+ return 'browser';
1852
+ }
1853
+ };
1854
+ /**
1855
+ * * Get current environment
1856
+ * @return {Object} result
1857
+ * @property {Boolean} reult.daemon whether or not daemon is running
1858
+ * @property {Boolean} reult.environment Current environment
1859
+ */
1860
+ const target = async () => {
1861
+ let daemon = false;
1862
+ if (!https())
1863
+ daemon = await hasDaemon();
1864
+ return { daemon, environment: environment() };
1865
+ };
1866
+
1867
+ class PeerDiscovery {
1868
+ constructor(id) {
1869
+ this.id = id;
1870
+ }
1871
+ _getPeerId(id) {
1872
+ if (!peernet.peerMap || peernet.peerMap && peernet.peerMap.size === 0)
1873
+ return false;
1874
+ for (const entry of [...peernet.peerMap.entries()]) {
1875
+ for (const _id of entry[1]) {
1876
+ if (_id === id)
1877
+ return entry[0];
1878
+ }
1879
+ }
1880
+ }
1881
+ async discover(peer) {
1882
+ let id = this._getPeerId(peer.id);
1883
+ if (id)
1884
+ return id;
1885
+ const data = await new peernet.protos['peernet-peer']({ id: this.id });
1886
+ const node = await peernet.prepareMessage(peer.id, data.encoded);
1887
+ let response = await peer.request(node.encoded);
1888
+ response = await protoFor(response);
1889
+ response = await new peernet.protos['peernet-peer-response'](response.decoded.data);
1890
+ id = response.decoded.id;
1891
+ if (id === this.id)
1892
+ return;
1893
+ if (!peernet.peerMap.has(id))
1894
+ peernet.peerMap.set(id, [peer.id]);
1895
+ else {
1896
+ const connections = peernet.peerMap.get(id);
1897
+ if (connections.indexOf(peer.id) === -1) {
1898
+ connections.push(peer.id);
1899
+ peernet.peerMap.set(peer.id, connections);
1900
+ }
1901
+ }
1902
+ return id;
1903
+ }
1904
+ async discoverHandler(message, peer) {
1905
+ const { id, proto } = message;
1906
+ // if (typeof message.data === 'string') message.data = Buffer.from(message.data)
1907
+ if (proto.name === 'peernet-peer') {
1908
+ const from = proto.decoded.id;
1909
+ if (from === this.id)
1910
+ return;
1911
+ if (!peernet.peerMap.has(from))
1912
+ peernet.peerMap.set(from, [peer.id]);
1913
+ else {
1914
+ const connections = peernet.peerMap.get(from);
1915
+ if (connections.indexOf(peer.id) === -1) {
1916
+ connections.push(peer.id);
1917
+ peernet.peerMap.set(from, connections);
1918
+ }
1919
+ }
1920
+ const data = await new peernet.protos['peernet-peer-response']({ id: this.id });
1921
+ const node = await peernet.prepareMessage(from, data.encoded);
1922
+ peer.write(Buffer.from(JSON.stringify({ id, data: node.encoded })));
1923
+ }
1924
+ else if (proto.name === 'peernet-peer-response') {
1925
+ const from = proto.decoded.id;
1926
+ if (from === this.id)
1927
+ return;
1928
+ if (!peernet.peerMap.has(from))
1929
+ peernet.peerMap.set(from, [peer.id]);
1930
+ else {
1931
+ const connections = peernet.peerMap.get(from);
1932
+ if (connections.indexOf(peer.id) === -1) {
1933
+ connections.push(peer.id);
1934
+ peernet.peerMap.set(from, connections);
1935
+ }
1936
+ }
1937
+ }
1938
+ }
1939
+ }
1940
+
1941
+ /**
1942
+ * Keep history of fetched address and ptr
1943
+ * @property {Object} address
1944
+ * @property {Object} ptr
1945
+ */
1946
+ const lastFetched = {
1947
+ address: {
1948
+ value: undefined,
1949
+ timestamp: 0,
1950
+ },
1951
+ ptr: {
1952
+ value: undefined,
1953
+ timestamp: 0,
1954
+ },
1955
+ };
1956
+ const getAddress = async () => {
1957
+ const { address } = lastFetched;
1958
+ const now = Math.round(new Date().getTime() / 1000);
1959
+ if (now - address.timestamp > 1200000) {
1960
+ address.value = await fetch('https://icanhazip.com/');
1961
+ address.value = await address.value.text();
1962
+ address.timestamp = Math.round(new Date().getTime() / 1000);
1963
+ lastFetched.address = address;
1964
+ }
1965
+ return address.value;
1966
+ };
1967
+ const degreesToRadians = (degrees) => {
1968
+ return degrees * Math.PI / 180;
1969
+ };
1970
+ const distanceInKmBetweenEarthCoordinates = (lat1, lon1, lat2, lon2) => {
1971
+ const earthRadiusKm = 6371;
1972
+ const dLat = degreesToRadians(lat2 - lat1);
1973
+ const dLon = degreesToRadians(lon2 - lon1);
1974
+ lat1 = degreesToRadians(lat1);
1975
+ lat2 = degreesToRadians(lat2);
1976
+ const a = Math.sin(dLat / 2) * Math.sin(dLat / 2) +
1977
+ Math.sin(dLon / 2) * Math.sin(dLon / 2) * Math.cos(lat1) * Math.cos(lat2);
1978
+ const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
1979
+ return earthRadiusKm * c;
1980
+ };
1981
+ class DhtEarth {
1982
+ /**
1983
+ *
1984
+ */
1985
+ constructor() {
1986
+ this.providerMap = new Map();
1987
+ }
1988
+ /**
1989
+ * @param {Object} address
1990
+ * @return {Object} {latitude: lat, longitude: lon}
1991
+ */
1992
+ async getCoordinates(address) {
1993
+ // const {address} = parseAddress(provider)
1994
+ const request = `https://whereis.leofcoin.org/?ip=${address}`;
1995
+ let response = await fetch(request);
1996
+ response = await response.json();
1997
+ const { lat, lon } = response;
1998
+ return { latitude: lat, longitude: lon };
1999
+ }
2000
+ /**
2001
+ * @param {Object} peer
2002
+ * @param {Object} provider
2003
+ * @return {Object} {provider, distance}
2004
+ */
2005
+ async getDistance(peer, provider) {
2006
+ const { latitude, longitude } = await this.getCoordinates(provider.address);
2007
+ return { provider, distance: distanceInKmBetweenEarthCoordinates(peer.latitude, peer.longitude, latitude, longitude) };
2008
+ }
2009
+ /**
2010
+ * @param {Array} providers
2011
+ * @return {Object} closestPeer
2012
+ */
2013
+ async closestPeer(providers) {
2014
+ let all = [];
2015
+ const address = await getAddress();
2016
+ const peerLoc = await this.getCoordinates(address);
2017
+ for (const provider of providers) {
2018
+ if (provider.address === '127.0.0.1')
2019
+ all.push({ provider, distance: 0 });
2020
+ else
2021
+ all.push(this.getDistance(peerLoc, provider));
2022
+ }
2023
+ all = await Promise.all(all);
2024
+ all = all.sort((previous, current) => previous.distance - current.distance);
2025
+ return all[0].provider;
2026
+ }
2027
+ /**
2028
+ * @param {String} hash
2029
+ * @return {Array} providers
2030
+ */
2031
+ providersFor(hash) {
2032
+ return this.providerMap.get(hash);
2033
+ }
2034
+ /**
2035
+ * @param {String} address
2036
+ * @param {String} hash
2037
+ * @return {Array} providers
2038
+ */
2039
+ async addProvider(address, hash) {
2040
+ let providers = [];
2041
+ if (this.providerMap.has(hash))
2042
+ providers = this.providerMap.get(hash);
2043
+ providers = new Set([...providers, address]);
2044
+ this.providerMap.set(hash, providers);
2045
+ return providers;
2046
+ }
2047
+ }
2048
+
2049
+ class MessageHandler {
2050
+ constructor(network) {
2051
+ this.network = network;
2052
+ }
2053
+ /**
2054
+ * hash and sign message
2055
+ *
2056
+ * @param {object} message
2057
+ * @param {Buffer} message.from peer id
2058
+ * @param {Buffer} message.to peer id
2059
+ * @param {string} message.data Peernet message
2060
+ * (PeernetMessage excluded) encoded as a string
2061
+ * @return message
2062
+ */
2063
+ async hashAndSignMessage(message) {
2064
+ let identity = await walletStore.get('identity');
2065
+ identity = JSON.parse(identity);
2066
+ if (!globalThis.MultiWallet) {
2067
+ const importee = await import(/* webpackChunkName: "multi-wallet" */ './index-4a0fc4ea.js');
2068
+ globalThis.MultiWallet = importee.default;
2069
+ }
2070
+ const wallet = new MultiWallet(this.network);
2071
+ wallet.recover(identity.mnemonic);
2072
+ message.decoded.signature = wallet.sign(Buffer.from(await message.hash).slice(0, 32));
2073
+ return message;
2074
+ }
2075
+ /**
2076
+ * @param {String} from - peer id
2077
+ * @param {String} to - peer id
2078
+ * @param {String|PeernetMessage} data - data encoded message string
2079
+ * or the messageNode itself
2080
+ */
2081
+ async prepareMessage(message) {
2082
+ if (message.keys.includes('signature')) {
2083
+ message = await this.hashAndSignMessage(message);
2084
+ }
2085
+ return message;
2086
+ }
2087
+ }
2088
+
2089
+ const dataHandler = async (message) => {
2090
+ if (!message)
2091
+ return;
2092
+ const { data, id, from } = message;
2093
+ const proto = await protoFor(data);
2094
+ peernet._protoHandler({ id, proto }, peernet.client.connections[from], from);
2095
+ };
2096
+
2097
+ const dhtError = (proto) => {
2098
+ const text = `Received proto ${proto.name} expected peernet-dht-response`;
2099
+ return new Error(`Routing error: ${text}`);
2100
+ };
2101
+ const nothingFoundError = (hash) => {
2102
+ return new Error(`nothing found for ${hash}`);
2103
+ };
2104
+
2105
+ // import base32 from '@vandeurenglenn/base32'
2106
+ // import base58 from '@vandeurenglenn/base58'
2107
+
2108
+ // export const encodings = {
2109
+ // base58,
2110
+ // base32
2111
+ // }
2112
+
2113
+ const encode = (string, encoding = 'utf-8') => {
2114
+ if (typeof string === 'string') {
2115
+ let encoded;
2116
+
2117
+ // if (encodings[encoding]) encoded = encodings[encoding].encode(encoded)
2118
+ encoded = new TextEncoder().encode(string);
2119
+ return encoded
2120
+ }
2121
+ throw Error(`expected typeof String instead got ${string}`)
2122
+ };
2123
+
2124
+ const decode = (uint8Array, encoding) => {
2125
+ if (uint8Array instanceof Uint8Array) {
2126
+ let decoded;
2127
+ // if (encodings[encoding]) decoded = encodings[encoding].decode(decoded)
2128
+ decoded = new TextDecoder().decode(uint8Array);
2129
+
2130
+ return decoded
2131
+ }
2132
+ throw Error(`expected typeof uint8Array instead got ${uint8Array}`)
2133
+ };
2134
+
2135
+ const pathSepS = '/';
2136
+ class KeyPath {
2137
+
2138
+ /**
2139
+ * @param {string | Uint8Array} input
2140
+ */
2141
+ constructor(input) {
2142
+ if (typeof input === 'string') {
2143
+ this.uint8Array = encode(input);
2144
+ } else if (input instanceof Uint8Array) {
2145
+ this.uint8Array = input;
2146
+ } else if (input instanceof KeyPath) {
2147
+ this.uint8Array = input.uint8Array;
2148
+ } else {
2149
+ throw new Error('Invalid keyPath, should be a String, Uint8Array or KeyPath')
2150
+ }
2151
+ }
2152
+
2153
+ isKeyPath() {
2154
+ return true
2155
+ }
2156
+
2157
+ /**
2158
+ * Convert to the string representation
2159
+ *
2160
+ * @param {import('uint8arrays/to-string').SupportedEncodings} [encoding='utf8'] - The encoding to use.
2161
+ * @returns {string}
2162
+ */
2163
+ toString(encoding = 'hex') {
2164
+ return decode(this.uint8Array)
2165
+ }
2166
+
2167
+ /**
2168
+ * Returns the `list` representation of this path.
2169
+ *
2170
+ * @returns string[]
2171
+ *
2172
+ * @example
2173
+ * ```js
2174
+ * new Key('/Comedy/MontyPython/Actor:JohnCleese').list()
2175
+ * // => ['Comedy', 'MontyPythong', 'Actor:JohnCleese']
2176
+ * ```
2177
+ */
2178
+ list() {
2179
+ return this.toString().split(pathSepS).slice(1)
2180
+ }
2181
+
2182
+ }
2183
+
2184
+ class LeofcoinStorage {
2185
+
2186
+ constructor(name = 'storage', root = '.leofcoin') {
2187
+ this.name = name;
2188
+ this.root = root;
2189
+ }
2190
+
2191
+ async init(name, root) {
2192
+ const importee = await import(globalThis.navigator ? './browser-store.js' : './store.js');
2193
+ const Store = importee.default;
2194
+ this.db = new Store(this.name, this.root);
2195
+ }
2196
+
2197
+ async get(key) {
2198
+ if (typeof key === 'object') return this.many('get', key);
2199
+ return this.db.get(new KeyPath(key))
2200
+ }
2201
+
2202
+ /**
2203
+ *
2204
+ * @param {*} key
2205
+ * @param {*} value
2206
+ * @returns Promise
2207
+ */
2208
+ put(key, value) {
2209
+ if (typeof key === 'object') return this.many('put', key);
2210
+ return this.db.put(new KeyPath(key), new KeyValue(value));
2211
+ }
2212
+
2213
+ async has(key) {
2214
+ if (typeof key === 'object') return this.many('has', key);
2215
+
2216
+ try {
2217
+ const has = await this.db.get(new KeyPath(key));
2218
+
2219
+ return Boolean(has);
2220
+ } catch (e) {
2221
+ return false
2222
+ }
2223
+ }
2224
+
2225
+ async delete(key) {
2226
+ return this.db.delete(new KeyPath(key))
2227
+ }
2228
+
2229
+ keys(limit = -1) {
2230
+ return this.db.keys(limit)
2231
+ }
2232
+
2233
+ async values(limit = -1) {
2234
+ return this.db.values(limit)
2235
+ }
2236
+
2237
+ async many(type, _value) {
2238
+ const jobs = [];
2239
+
2240
+ for (const key of Object.keys(_value)) {
2241
+ jobs.push(this[type](key, _value[key]));
2242
+ }
2243
+
2244
+ return Promise.all(jobs)
2245
+ }
2246
+
2247
+ async length() {
2248
+ const keys = await this.keys();
2249
+ return keys.length
2250
+ }
2251
+
2252
+ async size() {
2253
+ let size = 0;
2254
+ const query = await this.db.iterate();
2255
+ console.log(query);
2256
+ for await (const item of query) {
2257
+ size += item.value ? item.value.length : item[1].length;
2258
+ }
2259
+ return size
2260
+ }
2261
+
2262
+ async clear() {
2263
+ return this.db.clear()
2264
+ }
2265
+
2266
+ async iterate() {
2267
+ return this.db.iterate()
2268
+ }
2269
+
2270
+ }
2271
+
2272
+ const blockchainCodecs = [
2273
+ {
2274
+ name: 'leofcoin-block',
2275
+ codec: '0x6c62',
2276
+ hashAlg: 'dbl-keccak-512',
2277
+ },
2278
+ {
2279
+ name: 'leofcoin-tx',
2280
+ codec: '0x6c74',
2281
+ hashAlg: 'dbl-keccak-512',
2282
+ },
2283
+ {
2284
+ name: 'leofcoin-itx',
2285
+ codec: '0x6c69',
2286
+ hashAlg: 'keccak-512',
2287
+ },
2288
+ {
2289
+ name: 'leofcoin-pr',
2290
+ codec: '0x6c70',
2291
+ hashAlg: 'keccak-256',
2292
+ },
2293
+ {
2294
+ name: 'contract-message',
2295
+ codec: '0x63636d',
2296
+ hashAlg: 'keccak-256'
2297
+ },
2298
+ {
2299
+ name: 'transaction-message',
2300
+ codec: '0x746d',
2301
+ hashAlg: 'keccak-256'
2302
+ },
2303
+ {
2304
+ name: 'block-message',
2305
+ codec: '0x626d',
2306
+ hashAlg: 'keccak-256'
2307
+ },
2308
+ {
2309
+ name: 'bw-message',
2310
+ codec: '0x62776d',
2311
+ hashAlg: 'keccak-256'
2312
+ },
2313
+ {
2314
+ name: 'bw-request-message',
2315
+ codec: '0x6277726d',
2316
+ hashAlg: 'keccak-256'
2317
+ },
2318
+ {
2319
+ name: 'validator-message',
2320
+ codec: '0x766d',
2321
+ hashAlg: 'keccak-256'
2322
+ }
2323
+ ];
2324
+
2325
+ const internalCodecs = [
2326
+ {
2327
+ name: 'disco-hash',
2328
+ codec: '0x30',
2329
+ hashAlg: 'dbl-keccak-256',
2330
+ },
2331
+ {
2332
+ name: 'peernet-peer-response',
2333
+ codec: '0x707072',
2334
+ hashAlg: 'keccak-256',
2335
+ },
2336
+ {
2337
+ name: 'peernet-peer',
2338
+ codec: '0x7070',
2339
+ hashAlg: 'keccak-256',
2340
+ },
2341
+ {
2342
+ name: 'peernet-dht',
2343
+ codec: '0x706468',
2344
+ hashAlg: 'keccak-256',
2345
+ },
2346
+ {
2347
+ name: 'peernet-dht-response',
2348
+ codec: '0x706472',
2349
+ hashAlg: 'keccak-256',
2350
+ },
2351
+ {
2352
+ name: 'peernet-data',
2353
+ codec: '0x706461',
2354
+ hashAlg: 'keccak-256',
2355
+ },
2356
+ {
2357
+ name: 'peernet-data-response',
2358
+ codec: '0x70646172',
2359
+ hashAlg: 'keccak-256',
2360
+ },
2361
+ {
2362
+ name: 'peernet-message',
2363
+ codec: '0x706d65',
2364
+ hashAlg: 'keccak-256',
2365
+ },
2366
+ {
2367
+ name: 'peernet-ps',
2368
+ codec: '707073',
2369
+ hashAlg: 'keccak-256',
2370
+ },
2371
+ {
2372
+ name: 'peernet-response',
2373
+ codec: '0x7072',
2374
+ hashAlg: 'keccak-256',
2375
+ },
2376
+ {
2377
+ name: 'peernet-request',
2378
+ codec: '0x707271',
2379
+ hashAlg: 'keccak-256',
2380
+ },
2381
+ {
2382
+ name: 'peernet-file',
2383
+ codec: '0x7066',
2384
+ hashAlg: 'keccak-256',
2385
+ },
2386
+ {
2387
+ name: 'peernet-file-response',
2388
+ codec: '0x706672',
2389
+ hashAlg: 'keccak-256',
2390
+ }
2391
+ ];
2392
+
2393
+ const codecs = [
2394
+ ...internalCodecs,
2395
+ ...blockchainCodecs,
2396
+ {
2397
+ name: 'chat-message',
2398
+ codec: '0x70636d',
2399
+ hashAlg: 'dbl-keccak-256',
2400
+ }
2401
+ ];
2402
+
2403
+ globalThis.peernet = globalThis.peernet || {};
2404
+ globalThis.peernet.codecs = globalThis.peernet.codecs || {};
2405
+ const addCodec = (codecInput) => {
2406
+ let { hashAlg, codec, name } = codecInput;
2407
+ if (!globalThis.peernet.codecs[name])
2408
+ globalThis.peernet.codecs[name] = {
2409
+ hashAlg,
2410
+ codec: parseInt(codec, 16)
2411
+ };
2412
+ };
2413
+ const getCodec = (name) => globalThis.peernet.codecs[name];
2414
+ const getCodecName = (codec) => {
2415
+ return Object.keys(globalThis.peernet.codecs).reduce((p, c) => {
2416
+ const item = globalThis.peernet.codecs[c];
2417
+ if (item.codec === codec)
2418
+ return c;
2419
+ else
2420
+ return p;
2421
+ }, undefined);
2422
+ };
2423
+ const getCodecByName = (name) => globalThis.peernet.codecs[name];
2424
+ const getHashAlg = (name) => {
2425
+ if (typeof name === 'number')
2426
+ return getCodecByName(getCodecName(name)).hashAlg;
2427
+ return getCodecByName(name).hashAlg;
2428
+ };
2429
+ const isCodec = (codec) => {
2430
+ if (codec.codec !== undefined && codec.hashAlg)
2431
+ return true;
2432
+ return false;
2433
+ };
2434
+ const validateCodec = (codec) => {
2435
+ if (codec.codec === undefined ||
2436
+ codec.hashAlg === undefined ||
2437
+ codec.name === undefined)
2438
+ throw new Error(`invalid codecInput: ${codec}`);
2439
+ };
2440
+ for (const codec of codecs) {
2441
+ addCodec(codec);
2442
+ }
2443
+ var utils = {
2444
+ isCodec,
2445
+ addCodec,
2446
+ getCodec,
2447
+ getHashAlg,
2448
+ getCodecName,
2449
+ validateCodec,
2450
+ codecs: globalThis.peernet.codecs
2451
+ };
2452
+
2453
+ globalThis.LeofcoinStorage = LeofcoinStorage;
2454
+ globalThis.leofcoin = globalThis.leofcoin || {};
2455
+ globalThis.pubsub = globalThis.pubsub || new LittlePubSub();
2456
+ globalThis.globalSub = globalThis.globalSub || new LittlePubSub(true);
2457
+ /**
2458
+ * @access public
2459
+ * @example
2460
+ * const peernet = new Peernet();
2461
+ */
2462
+ class Peernet {
2463
+ stores = [];
2464
+ /**
2465
+ * @type {Object}
2466
+ * @property {Object} peer Instance of Peer
2467
+ */
2468
+ dht = new DhtEarth();
2469
+ /** @leofcoin/peernet-swarm/client */
2470
+ client;
2471
+ network;
2472
+ stars;
2473
+ networkVersion;
2474
+ bw;
2475
+ /**
2476
+ * @access public
2477
+ * @param {Object} options
2478
+ * @param {String} options.network - desired network
2479
+ * @param {String} options.stars - star list for selected network (these should match, don't mix networks)
2480
+ * @param {String} options.root - path to root directory
2481
+ * @param {String} options.storePrefix - prefix for datatores (lfc)
2482
+ *
2483
+ * @return {Promise} instance of Peernet
2484
+ *
2485
+ * @example
2486
+ * const peernet = new Peernet({network: 'leofcoin', root: '.leofcoin'});
2487
+ */
2488
+ constructor(options) {
2489
+ /**
2490
+ * @property {String} network - current network
2491
+ */
2492
+ this.network = options.network || 'leofcoin';
2493
+ this.stars = options.stars;
2494
+ const parts = this.network.split(':');
2495
+ this.networkVersion = options.networkVersion || parts.length > 1 ? parts[1] : 'mainnet';
2496
+ if (!options.storePrefix)
2497
+ options.storePrefix = 'lfc';
2498
+ if (!options.port)
2499
+ options.port = 2000;
2500
+ if (!options.root) {
2501
+ parts[1] ? options.root = `.${parts[0]}/${parts[1]}` : options.root = `.${this.network}`;
2502
+ }
2503
+ globalThis.peernet = this;
2504
+ this.bw = {
2505
+ up: 0,
2506
+ down: 0,
2507
+ };
2508
+ return this._init(options);
2509
+ }
2510
+ get defaultStores() {
2511
+ return ['account', 'wallet', 'block', 'transaction', 'chain', 'data', 'message'];
2512
+ }
2513
+ addProto(name, proto) {
2514
+ if (!globalThis.peernet.protos[name])
2515
+ globalThis.peernet.protos[name] = proto;
2516
+ }
2517
+ addCodec(codec) {
2518
+ return utils.addCodec(codec);
2519
+ }
2520
+ async addStore(name, prefix, root, isPrivate = true) {
2521
+ if (name === 'block' || name === 'transaction' || name === 'chain' ||
2522
+ name === 'data' || name === 'message')
2523
+ isPrivate = false;
2524
+ let Storage;
2525
+ this.hasDaemon ? Storage = LeofcoinStorageClient : Storage = LeofcoinStorage;
2526
+ if (!globalThis[`${name}Store`]) {
2527
+ globalThis[`${name}Store`] = new Storage(name, root);
2528
+ await globalThis[`${name}Store`].init();
2529
+ }
2530
+ globalThis[`${name}Store`].private = isPrivate;
2531
+ if (!isPrivate)
2532
+ this.stores.push(name);
2533
+ }
2534
+ /**
2535
+ * @see MessageHandler
2536
+ */
2537
+ prepareMessage(data) {
2538
+ return this._messageHandler.prepareMessage(data);
2539
+ }
2540
+ /**
2541
+ * @access public
2542
+ *
2543
+ * @return {Array} peerId
2544
+ */
2545
+ get peers() {
2546
+ return Object.keys(this.client.connections);
2547
+ }
2548
+ get connections() {
2549
+ return Object.values(this.client.connections);
2550
+ }
2551
+ get peerEntries() {
2552
+ return Object.entries(this.client.connections);
2553
+ }
2554
+ /**
2555
+ * @return {String} id - peerId
2556
+ */
2557
+ getConnection(id) {
2558
+ return this.client.connections[id];
2559
+ }
2560
+ /**
2561
+ * @private
2562
+ *
2563
+ * @param {Object} options
2564
+ * @param {String} options.root - path to root directory
2565
+ *
2566
+ * @return {Promise} instance of Peernet
2567
+ */
2568
+ async _init(options) {
2569
+ this.requestProtos = {};
2570
+ this.storePrefix = options.storePrefix;
2571
+ this.root = options.root;
2572
+ const { RequestMessage, ResponseMessage, PeerMessage, PeerMessageResponse, PeernetMessage, DHTMessage, DHTMessageResponse, DataMessage, DataMessageResponse, PsMessage, ChatMessage, PeernetFile
2573
+ // FolderMessageResponse
2574
+ } = await import(/* webpackChunkName: "messages" */ './messages-6db1f01d.js');
2575
+ /**
2576
+ * proto Object containing protos
2577
+ * @type {Object}
2578
+ * @property {PeernetMessage} protos[peernet-message] messageNode
2579
+ * @property {DHTMessage} protos[peernet-dht] messageNode
2580
+ * @property {DHTMessageResponse} protos[peernet-dht-response] messageNode
2581
+ * @property {DataMessage} protos[peernet-data] messageNode
2582
+ * @property {DataMessageResponse} protos[peernet-data-response] messageNode
2583
+ */
2584
+ globalThis.peernet.protos = {
2585
+ 'peernet-request': RequestMessage,
2586
+ 'peernet-response': ResponseMessage,
2587
+ 'peernet-peer': PeerMessage,
2588
+ 'peernet-peer-response': PeerMessageResponse,
2589
+ 'peernet-message': PeernetMessage,
2590
+ 'peernet-dht': DHTMessage,
2591
+ 'peernet-dht-response': DHTMessageResponse,
2592
+ 'peernet-data': DataMessage,
2593
+ 'peernet-data-response': DataMessageResponse,
2594
+ 'peernet-ps': PsMessage,
2595
+ 'chat-message': ChatMessage,
2596
+ 'peernet-file': PeernetFile
2597
+ };
2598
+ this._messageHandler = new MessageHandler(this.network);
2599
+ const { daemon, environment } = await target();
2600
+ this.hasDaemon = daemon;
2601
+ for (const store of this.defaultStores) {
2602
+ await this.addStore(store, options.storePrefix, options.root);
2603
+ }
2604
+ const accountExists = await accountStore.has('public');
2605
+ if (accountExists) {
2606
+ const pub = await accountStore.get('public');
2607
+ this.id = JSON.parse(new TextDecoder().decode(pub)).walletId;
2608
+ let accounts = await walletStore.get('accounts');
2609
+ accounts = new TextDecoder().decode(accounts);
2610
+ const selected = await walletStore.get('selected-account');
2611
+ globalThis.peernet.selectedAccount = new TextDecoder().decode(selected);
2612
+ // fixing account issue (string while needs to be a JSON)
2613
+ // TODO: remove when on mainnet
2614
+ try {
2615
+ this.accounts = JSON.parse(accounts);
2616
+ }
2617
+ catch {
2618
+ this.accounts = [accounts.split(',')];
2619
+ }
2620
+ }
2621
+ else {
2622
+ const importee = await import(/* webpackChunkName: "generate-account" */ './index-639f2260.js');
2623
+ const generateAccount = importee.default;
2624
+ const { identity, accounts, config } = await generateAccount(this.network);
2625
+ // await accountStore.put('config', JSON.stringify(config));
2626
+ await accountStore.put('public', JSON.stringify({ walletId: identity.walletId }));
2627
+ await walletStore.put('version', String(1));
2628
+ await walletStore.put('accounts', JSON.stringify(accounts));
2629
+ await walletStore.put('selected-account', accounts[0][1]);
2630
+ await walletStore.put('identity', JSON.stringify(identity));
2631
+ globalThis.peernet.selectedAccount = accounts[0][1];
2632
+ this.id = identity.walletId;
2633
+ }
2634
+ this._peerHandler = new PeerDiscovery(this.id);
2635
+ this.peerId = this.id;
2636
+ pubsub.subscribe('peer:connected', async (peer) => {
2637
+ // console.log(peer);
2638
+ // console.log({connected: peer.id, as: this._getPeerId(peer.id) });
2639
+ // peer.on('peernet.data', async (message) => {
2640
+ // const id = message.id
2641
+ // message = new PeernetMessage(Buffer.from(message.data.data))
2642
+ // const proto = protoFor(message.decoded.data)
2643
+ // this._protoHandler({id, proto}, peer)
2644
+ // })
2645
+ });
2646
+ /**
2647
+ * converts data -> message -> proto
2648
+ * @see DataHandler
2649
+ */
2650
+ pubsub.subscribe('peer:data', dataHandler);
2651
+ const importee = await import('./client-1c52a169.js');
2652
+ /**
2653
+ * @access public
2654
+ * @type {PeernetClient}
2655
+ */
2656
+ this.client = new importee.default(this.id, this.networkVersion, this.stars);
2657
+ if (globalThis.navigator) {
2658
+ globalThis.addEventListener('beforeunload', async () => this.client.close());
2659
+ }
2660
+ else {
2661
+ process.on('SIGTERM', async () => {
2662
+ process.stdin.resume();
2663
+ await this.client.close();
2664
+ process.exit();
2665
+ });
2666
+ }
2667
+ return this;
2668
+ }
2669
+ addRequestHandler(name, method) {
2670
+ this.requestProtos[name] = method;
2671
+ }
2672
+ sendMessage(peer, id, data) {
2673
+ if (peer.readyState === 'open') {
2674
+ peer.send(data, id);
2675
+ this.bw.up += data.length;
2676
+ }
2677
+ else if (peer.readyState === 'closed') ;
2678
+ }
2679
+ async handleDHT(peer, id, proto) {
2680
+ let { hash, store } = proto.decoded;
2681
+ let has;
2682
+ if (store) {
2683
+ store = globalThis[`${store}Store`];
2684
+ has = store.private ? false : await store.has(hash);
2685
+ }
2686
+ else {
2687
+ has = await this.has(hash);
2688
+ }
2689
+ const data = await new globalThis.peernet.protos['peernet-dht-response']({ hash, has });
2690
+ const node = await this.prepareMessage(data);
2691
+ this.sendMessage(peer, id, node.encoded);
2692
+ }
2693
+ async handleData(peer, id, proto) {
2694
+ let { hash, store } = proto.decoded;
2695
+ let data;
2696
+ store = globalThis[`${store}Store`] || await this.whichStore([...this.stores], hash);
2697
+ if (store && !store.private) {
2698
+ data = await store.get(hash);
2699
+ if (data) {
2700
+ data = await new globalThis.peernet.protos['peernet-data-response']({ hash, data });
2701
+ const node = await this.prepareMessage(data);
2702
+ this.sendMessage(peer, id, node.encoded);
2703
+ }
2704
+ }
2705
+ }
2706
+ async handleRequest(peer, id, proto) {
2707
+ const method = this.requestProtos[proto.decoded.request];
2708
+ if (method) {
2709
+ const data = await method();
2710
+ const node = await this.prepareMessage(data);
2711
+ this.sendMessage(peer, id, node.encoded);
2712
+ }
2713
+ }
2714
+ /**
2715
+ * @private
2716
+ *
2717
+ * @param {Buffer} message - peernet message
2718
+ * @param {PeernetPeer} peer - peernet peer
2719
+ */
2720
+ async _protoHandler(message, peer, from) {
2721
+ const { id, proto } = message;
2722
+ this.bw.down += proto.encoded.length;
2723
+ switch (proto.name) {
2724
+ case 'peernet-dht': {
2725
+ this.handleDHT(peer, id, proto);
2726
+ break;
2727
+ }
2728
+ case 'peenet-data': {
2729
+ this.handleData(peer, id, proto);
2730
+ break;
2731
+ }
2732
+ case 'peernet-request': {
2733
+ this.handleRequest(peer, id, proto);
2734
+ }
2735
+ case 'peernet-ps': {
2736
+ if (peer.peerId !== this.id)
2737
+ globalSub.publish(proto.decoded.topic, proto.decoded.data);
2738
+ }
2739
+ }
2740
+ }
2741
+ /**
2742
+ * performs a walk and resolves first encounter
2743
+ *
2744
+ * @param {String} hash
2745
+ */
2746
+ async walk(hash) {
2747
+ if (!hash)
2748
+ throw new Error('hash expected, received undefined');
2749
+ const data = await new globalThis.peernet.protos['peernet-dht']({ hash });
2750
+ this.client.id;
2751
+ const walk = async (peer) => {
2752
+ const node = await this.prepareMessage(data);
2753
+ let result = await peer.request(node.encoded);
2754
+ result = new Uint8Array(Object.values(result));
2755
+ const proto = await protoFor(result);
2756
+ if (proto.name !== 'peernet-dht-response')
2757
+ throw dhtError(proto.name);
2758
+ // TODO: give ip and port (just used for location)
2759
+ if (!peer.connection.remoteAddress || !peer.connection.localAddress) {
2760
+ peer.connection.remoteFamily = 'ipv4';
2761
+ peer.connection.remoteAddress = '127.0.0.1';
2762
+ peer.connection.remotePort = '0000';
2763
+ }
2764
+ const peerInfo = {
2765
+ family: peer.connection.remoteFamily || peer.connection.localFamily,
2766
+ address: peer.connection.remoteAddress || peer.connection.localAddress,
2767
+ port: peer.connection.remotePort || peer.connection.localPort,
2768
+ id: peer.peerId,
2769
+ };
2770
+ if (proto.decoded.has)
2771
+ this.dht.addProvider(peerInfo, proto.decoded.hash);
2772
+ };
2773
+ let walks = [];
2774
+ for (const peer of this.connections) {
2775
+ if (peer.peerId !== this.id) {
2776
+ walks.push(walk(peer));
2777
+ }
2778
+ }
2779
+ return Promise.all(walks);
2780
+ }
2781
+ /**
2782
+ * Override DHT behavior, try's finding the content three times
2783
+ *
2784
+ * @param {String} hash
2785
+ */
2786
+ async providersFor(hash) {
2787
+ let providers = await this.dht.providersFor(hash);
2788
+ // walk the network to find a provider
2789
+ if (!providers || providers.length === 0) {
2790
+ await this.walk(hash);
2791
+ providers = await this.dht.providersFor(hash);
2792
+ // second walk the network to find a provider
2793
+ if (!providers || providers.length === 0) {
2794
+ await this.walk(hash);
2795
+ providers = await this.dht.providersFor(hash);
2796
+ }
2797
+ // last walk
2798
+ if (!providers || providers.length === 0) {
2799
+ await this.walk(hash);
2800
+ providers = await this.dht.providersFor(hash);
2801
+ }
2802
+ }
2803
+ // undefined if no providers given
2804
+ return providers;
2805
+ }
2806
+ get block() {
2807
+ return {
2808
+ get: async (hash) => {
2809
+ const data = await blockStore.has(hash);
2810
+ if (data)
2811
+ return blockStore.get(hash);
2812
+ return this.requestData(hash, 'block');
2813
+ },
2814
+ put: async (hash, data) => {
2815
+ if (await blockStore.has(hash))
2816
+ return;
2817
+ return await blockStore.put(hash, data);
2818
+ },
2819
+ has: async (hash) => await blockStore.has(hash, 'block'),
2820
+ };
2821
+ }
2822
+ get transaction() {
2823
+ return {
2824
+ get: async (hash) => {
2825
+ const data = await transactionStore.has(hash);
2826
+ if (data)
2827
+ return await transactionStore.get(hash);
2828
+ return this.requestData(hash, 'transaction');
2829
+ },
2830
+ put: async (hash, data) => {
2831
+ if (await transactionStore.has(hash))
2832
+ return;
2833
+ return await transactionStore.put(hash, data);
2834
+ },
2835
+ has: async (hash) => await transactionStore.has(hash),
2836
+ };
2837
+ }
2838
+ async requestData(hash, store) {
2839
+ const providers = await this.providersFor(hash);
2840
+ if (!providers || providers.size === 0)
2841
+ throw nothingFoundError(hash);
2842
+ debug(`found ${providers.size} provider(s) for ${hash}`);
2843
+ // get closest peer on earth
2844
+ const closestPeer = await this.dht.closestPeer(providers);
2845
+ // get peer instance by id
2846
+ if (!closestPeer || !closestPeer.id)
2847
+ return this.requestData(hash, store?.name || store);
2848
+ const id = closestPeer.id;
2849
+ if (this.connections) {
2850
+ let closest = this.connections.filter((peer) => {
2851
+ if (peer.peerId === id)
2852
+ return peer;
2853
+ });
2854
+ let data = await new globalThis.peernet.protos['peernet-data']({ hash, store: store?.name || store });
2855
+ const node = await this.prepareMessage(data);
2856
+ if (closest[0])
2857
+ data = await closest[0].request(node.encoded);
2858
+ else {
2859
+ closest = this.connections.filter((peer) => {
2860
+ if (peer.peerId === id)
2861
+ return peer;
2862
+ });
2863
+ if (closest[0])
2864
+ data = await closest[0].request(node.encoded);
2865
+ }
2866
+ data = new Uint8Array(Object.values(data));
2867
+ const proto = await protoFor(data);
2868
+ // TODO: store data automaticly or not
2869
+ return BufferToUint8Array(proto.decoded.data);
2870
+ // this.put(hash, proto.decoded.data)
2871
+ }
2872
+ return;
2873
+ }
2874
+ get message() {
2875
+ return {
2876
+ /**
2877
+ * Get content for given message hash
2878
+ *
2879
+ * @param {String} hash
2880
+ */
2881
+ get: async (hash) => {
2882
+ debug(`get message ${hash}`);
2883
+ const message = await messageStore.has(hash);
2884
+ if (message)
2885
+ return await messageStore.get(hash);
2886
+ return this.requestData(hash, 'message');
2887
+ },
2888
+ /**
2889
+ * put message content
2890
+ *
2891
+ * @param {String} hash
2892
+ * @param {Buffer} message
2893
+ */
2894
+ put: async (hash, message) => await messageStore.put(hash, message),
2895
+ /**
2896
+ * @param {String} hash
2897
+ * @return {Boolean}
2898
+ */
2899
+ has: async (hash) => await messageStore.has(hash),
2900
+ };
2901
+ }
2902
+ get data() {
2903
+ return {
2904
+ /**
2905
+ * Get content for given data hash
2906
+ *
2907
+ * @param {String} hash
2908
+ */
2909
+ get: async (hash) => {
2910
+ debug(`get data ${hash}`);
2911
+ const data = await dataStore.has(hash);
2912
+ if (data)
2913
+ return await dataStore.get(hash);
2914
+ return this.requestData(hash, 'data');
2915
+ },
2916
+ /**
2917
+ * put data content
2918
+ *
2919
+ * @param {String} hash
2920
+ * @param {Buffer} data
2921
+ */
2922
+ put: async (hash, data) => await dataStore.put(hash, data),
2923
+ /**
2924
+ * @param {String} hash
2925
+ * @return {Boolean}
2926
+ */
2927
+ has: async (hash) => await dataStore.has(hash),
2928
+ };
2929
+ }
2930
+ get folder() {
2931
+ return {
2932
+ /**
2933
+ * Get content for given data hash
2934
+ *
2935
+ * @param {String} hash
2936
+ */
2937
+ get: async (hash) => {
2938
+ debug(`get data ${hash}`);
2939
+ const data = await dataStore.has(hash);
2940
+ if (data)
2941
+ return await dataStore.get(hash);
2942
+ return this.requestData(hash, 'data');
2943
+ },
2944
+ /**
2945
+ * put data content
2946
+ *
2947
+ * @param {String} hash
2948
+ * @param {Buffer} data
2949
+ */
2950
+ put: async (hash, data) => await dataStore.put(hash, data),
2951
+ /**
2952
+ * @param {String} hash
2953
+ * @return {Boolean}
2954
+ */
2955
+ has: async (hash) => await dataStore.has(hash),
2956
+ };
2957
+ }
2958
+ async addFolder(files) {
2959
+ const links = [];
2960
+ for (const file of files) {
2961
+ const fileNode = await new globalThis.peernet.protos['peernet-file'](file);
2962
+ const hash = await fileNode.hash;
2963
+ await dataStore.put(hash, fileNode.encoded);
2964
+ links.push({ hash, path: file.path });
2965
+ }
2966
+ const node = await new globalThis.peernet.protos['peernet-file']({ path: '/', links });
2967
+ const hash = await node.hash;
2968
+ await dataStore.put(hash, node.encoded);
2969
+ return hash;
2970
+ }
2971
+ async ls(hash, options) {
2972
+ let data;
2973
+ const has = await dataStore.has(hash);
2974
+ data = has ? await dataStore.get(hash) : await this.requestData(hash, 'data');
2975
+ const node = await new peernet.protos['peernet-file'](data);
2976
+ await node.decode();
2977
+ console.log(data);
2978
+ const paths = [];
2979
+ if (node.decoded?.links.length === 0)
2980
+ throw new Error(`${hash} is a file`);
2981
+ for (const { path, hash } of node.decoded.links) {
2982
+ paths.push({ path, hash });
2983
+ }
2984
+ if (options?.pin)
2985
+ await dataStore.put(hash, node.encoded);
2986
+ return paths;
2987
+ }
2988
+ async cat(hash, options) {
2989
+ let data;
2990
+ const has = await dataStore.has(hash);
2991
+ data = has ? await dataStore.get(hash) : await this.requestData(hash, 'data');
2992
+ const node = await new peernet.protos['peernet-file'](data);
2993
+ if (node.decoded?.links.length > 0)
2994
+ throw new Error(`${hash} is a directory`);
2995
+ if (options?.pin)
2996
+ await dataStore.put(hash, node.encoded);
2997
+ return node.decoded.content;
2998
+ }
2999
+ /**
3000
+ * goes trough given stores and tries to find data for given hash
3001
+ * @param {Array} stores
3002
+ * @param {string} hash
3003
+ */
3004
+ async whichStore(stores, hash) {
3005
+ let store = stores.pop();
3006
+ store = globalThis[`${store}Store`];
3007
+ if (store) {
3008
+ const has = await store.has(hash);
3009
+ if (has)
3010
+ return store;
3011
+ if (stores.length > 0)
3012
+ return this.whichStore(stores, hash);
3013
+ }
3014
+ else
3015
+ return;
3016
+ }
3017
+ /**
3018
+ * Get content for given hash
3019
+ *
3020
+ * @param {String} hash - the hash of the wanted data
3021
+ * @param {String} store - storeName to access
3022
+ */
3023
+ async get(hash, store) {
3024
+ debug(`get ${hash}`);
3025
+ let data;
3026
+ if (store)
3027
+ store = globalThis[`${store}Store`];
3028
+ if (!store)
3029
+ store = await this.whichStore([...this.stores], hash);
3030
+ if (store && await store.has(hash))
3031
+ data = await store.get(hash);
3032
+ if (data)
3033
+ return data;
3034
+ return this.requestData(hash, store?.name || store);
3035
+ }
3036
+ /**
3037
+ * put content
3038
+ *
3039
+ * @param {String} hash
3040
+ * @param {Buffer} data
3041
+ * @param {String} store - storeName to access
3042
+ */
3043
+ async put(hash, data, store = 'data') {
3044
+ store = globalThis[`${store}Store`];
3045
+ return store.put(hash, data);
3046
+ }
3047
+ /**
3048
+ * @param {String} hash
3049
+ * @return {Boolean}
3050
+ */
3051
+ async has(hash) {
3052
+ const store = await this.whichStore([...this.stores], hash);
3053
+ if (store) {
3054
+ return store.private ? false : true;
3055
+ }
3056
+ return false;
3057
+ }
3058
+ /**
3059
+ *
3060
+ * @param {String} topic
3061
+ * @param {String|Object|Array|Boolean|Buffer} data
3062
+ */
3063
+ async publish(topic, data) {
3064
+ // globalSub.publish(topic, data)
3065
+ const id = Math.random().toString(36).slice(-12);
3066
+ data = await new globalThis.peernet.protos['peernet-ps']({ data, topic });
3067
+ for (const peer of this.connections) {
3068
+ if (peer.peerId !== this.peerId) {
3069
+ const node = await this.prepareMessage(data);
3070
+ this.sendMessage(peer, id, node.encoded);
3071
+ }
3072
+ // TODO: if peer subscribed
3073
+ }
3074
+ }
3075
+ createHash(data, name) {
3076
+ return new CodeHash(data, { name });
3077
+ }
3078
+ /**
3079
+ *
3080
+ * @param {String} topic
3081
+ * @param {Method} cb
3082
+ */
3083
+ async subscribe(topic, callback) {
3084
+ // TODO: if peer subscribed
3085
+ globalSub.subscribe(topic, callback);
3086
+ }
3087
+ async removePeer(peer) {
3088
+ return this.client.removePeer(peer);
3089
+ }
3090
+ get Buffer() {
3091
+ return Buffer;
3092
+ }
3093
+ }
3094
+ globalThis.Peernet = Peernet;
3095
+
3096
+ export { FormatInterface as F, LittlePubSub as L, Peernet as P, index$4 as a, base58$1 as b, index$6 as c, index$7 as d, createRIPEMD160 as e, createHMAC as f, createSHA512 as g, createKeccak as h, index$5 as i };