@leofcoin/peernet 1.1.57 → 1.1.58

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 (71) hide show
  1. package/.esdoc.json +10 -10
  2. package/.eslintrc.json +24 -24
  3. package/.gitattributes +2 -2
  4. package/.travis.yml +27 -27
  5. package/BREAKING_CHANGES.md +34 -34
  6. package/LICENSE +21 -21
  7. package/README.md +72 -72
  8. package/deploy.js +8 -8
  9. package/exports/browser/{index-329e0324.js → index-8868bdd8.js} +1 -1
  10. package/exports/browser/{messages-000b7f84.js → messages-eb6e5c71.js} +174 -174
  11. package/exports/browser/{peernet-bfbe6fff.js → peernet-87ea02a4.js} +2005 -1915
  12. package/exports/browser/peernet.d.ts +13 -11
  13. package/exports/browser/peernet.js +1 -1
  14. package/exports/{messages-dc960cb3.js → messages-b9a32987.js} +173 -173
  15. package/exports/peernet.js +288 -246
  16. package/exports/src/prompts/password.js +3 -3
  17. package/exports/store.js +7 -8
  18. package/exports/types/peernet.d.ts +13 -11
  19. package/index.html +19 -19
  20. package/package.json +70 -70
  21. package/rollup.config.js +76 -69
  22. package/src/dht/dht.ts +141 -141
  23. package/src/discovery/peer-discovery.js +75 -75
  24. package/src/errors/errors.js +12 -12
  25. package/src/handlers/data.js +11 -11
  26. package/src/handlers/message.js +34 -34
  27. package/src/identity.ts +101 -101
  28. package/src/messages/chat.js +14 -14
  29. package/src/messages/data-response.js +14 -14
  30. package/src/messages/data.js +18 -18
  31. package/src/messages/dht-response.js +14 -14
  32. package/src/messages/dht.js +22 -22
  33. package/src/messages/file-link.js +18 -18
  34. package/src/messages/file.js +18 -18
  35. package/src/messages/peer-response.js +14 -14
  36. package/src/messages/peer.js +13 -13
  37. package/src/messages/peernet.js +14 -14
  38. package/src/messages/ps.js +13 -13
  39. package/src/messages/request.js +14 -14
  40. package/src/messages/response.js +14 -14
  41. package/src/messages.js +13 -13
  42. package/src/peer-info.js +9 -9
  43. package/src/peernet.ts +848 -776
  44. package/src/prompts/password/node.js +5 -5
  45. package/src/proto/chat-message.proto.js +6 -6
  46. package/src/proto/data-response.proto.js +4 -4
  47. package/src/proto/data.proto.js +4 -4
  48. package/src/proto/dht-response.proto.js +4 -4
  49. package/src/proto/dht.proto.js +4 -4
  50. package/src/proto/file-link.proto.js +5 -5
  51. package/src/proto/file.proto.js +5 -5
  52. package/src/proto/peer-response.proto.js +3 -3
  53. package/src/proto/peer.proto.js +3 -3
  54. package/src/proto/peernet.proto.js +7 -7
  55. package/src/proto/ps.proto.js +4 -4
  56. package/src/proto/request.proto.js +4 -4
  57. package/src/proto/response.proto.js +3 -3
  58. package/src/types.ts +27 -27
  59. package/src/utils/utils.js +78 -78
  60. package/test/client.js +14 -14
  61. package/test/codec.js +56 -56
  62. package/test/hash.js +13 -13
  63. package/test/index.js +3 -3
  64. package/test/lastBlock.js +7 -7
  65. package/test/messages.js +26 -26
  66. package/test/peernet.js +17 -17
  67. package/test.js +64 -64
  68. package/test2.js +9 -9
  69. package/test3.js +15 -15
  70. package/test4.js +7 -7
  71. package/tsconfig.json +12 -12
@@ -4868,11 +4868,27 @@ var index$2 = {
4868
4868
  };
4869
4869
 
4870
4870
  class BasicInterface {
4871
- encoded;
4872
- decoded;
4871
+ #encoded;
4872
+ #decoded;
4873
4873
  keys;
4874
4874
  name;
4875
4875
  #proto;
4876
+ get encoded() {
4877
+ if (!this.#encoded)
4878
+ this.#encoded = this.encode();
4879
+ return this.#encoded;
4880
+ }
4881
+ set encoded(value) {
4882
+ this.#encoded = value;
4883
+ }
4884
+ get decoded() {
4885
+ if (!this.#decoded)
4886
+ this.#decoded = this.decode();
4887
+ return this.#decoded;
4888
+ }
4889
+ set decoded(value) {
4890
+ this.#decoded = value;
4891
+ }
4876
4892
  set proto(value) {
4877
4893
  this.#proto = value;
4878
4894
  this.keys = Object.keys(value);
@@ -4941,7 +4957,7 @@ class BasicInterface {
4941
4957
  toHex() {
4942
4958
  if (!this.encoded)
4943
4959
  this.encode();
4944
- return toHex$2(this.encoded);
4960
+ return toHex$2(this.encoded.toString().split(',').map(number => Number(number)));
4945
4961
  }
4946
4962
  /**
4947
4963
  * @return {String} encoded
@@ -4961,1732 +4977,1209 @@ class BasicInterface {
4961
4977
  }
4962
4978
  }
4963
4979
 
4964
- /*!
4965
- * hash-wasm (https://www.npmjs.com/package/hash-wasm)
4966
- * (c) Dani Biro
4967
- * @license MIT
4968
- */
4969
-
4970
- /******************************************************************************
4971
- Copyright (c) Microsoft Corporation.
4972
-
4973
- Permission to use, copy, modify, and/or distribute this software for any
4974
- purpose with or without fee is hereby granted.
4975
-
4976
- THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
4977
- REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
4978
- AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
4979
- INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
4980
- LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
4981
- OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
4982
- PERFORMANCE OF THIS SOFTWARE.
4983
- ***************************************************************************** */
4984
- /* global Reflect, Promise, SuppressedError, Symbol */
4985
-
4986
-
4987
- function __awaiter(thisArg, _arguments, P, generator) {
4988
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4989
- return new (P || (P = Promise))(function (resolve, reject) {
4990
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
4991
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
4992
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
4993
- step((generator = generator.apply(thisArg, _arguments || [])).next());
4994
- });
4995
- }
4996
-
4997
- typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
4998
- var e = new Error(message);
4999
- return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
5000
- };
5001
-
5002
- class Mutex {
5003
- constructor() {
5004
- this.mutex = Promise.resolve();
5005
- }
5006
- lock() {
5007
- let begin = () => { };
5008
- this.mutex = this.mutex.then(() => new Promise(begin));
5009
- return new Promise((res) => {
5010
- begin = res;
5011
- });
4980
+ const blockchainCodecs = [
4981
+ {
4982
+ name: 'leofcoin-block',
4983
+ codec: '0x6c62',
4984
+ hashAlg: 'dbl-keccak-512',
4985
+ },
4986
+ {
4987
+ name: 'leofcoin-tx',
4988
+ codec: '0x6c74',
4989
+ hashAlg: 'dbl-keccak-512',
4990
+ },
4991
+ {
4992
+ name: 'leofcoin-itx',
4993
+ codec: '0x6c69',
4994
+ hashAlg: 'keccak-512',
4995
+ },
4996
+ {
4997
+ name: 'leofcoin-pr',
4998
+ codec: '0x6c70',
4999
+ hashAlg: 'keccak-256',
5000
+ },
5001
+ {
5002
+ name: 'contract-message',
5003
+ codec: '0x63636d',
5004
+ hashAlg: 'keccak-256'
5005
+ },
5006
+ {
5007
+ name: 'transaction-message',
5008
+ codec: '0x746d',
5009
+ hashAlg: 'keccak-256'
5010
+ },
5011
+ {
5012
+ name: 'raw-transaction-message',
5013
+ codec: '0x772746d',
5014
+ hashAlg: 'keccak-256'
5015
+ },
5016
+ {
5017
+ name: 'block-message',
5018
+ codec: '0x626d',
5019
+ hashAlg: 'keccak-256'
5020
+ },
5021
+ {
5022
+ name: 'bw-message',
5023
+ codec: '0x62776d',
5024
+ hashAlg: 'keccak-256'
5025
+ },
5026
+ {
5027
+ name: 'bw-request-message',
5028
+ codec: '0x6277726d',
5029
+ hashAlg: 'keccak-256'
5030
+ },
5031
+ {
5032
+ name: 'validator-message',
5033
+ codec: '0x766d',
5034
+ hashAlg: 'keccak-256'
5012
5035
  }
5013
- dispatch(fn) {
5014
- return __awaiter(this, void 0, void 0, function* () {
5015
- const unlock = yield this.lock();
5016
- try {
5017
- return yield Promise.resolve(fn());
5018
- }
5019
- finally {
5020
- unlock();
5021
- }
5022
- });
5036
+ ];
5037
+
5038
+ const internalCodecs = [
5039
+ {
5040
+ name: 'disco-hash',
5041
+ codec: '0x30',
5042
+ hashAlg: 'dbl-keccak-256',
5043
+ },
5044
+ {
5045
+ name: 'peernet-peer-response',
5046
+ codec: '0x707072',
5047
+ hashAlg: 'keccak-256',
5048
+ },
5049
+ {
5050
+ name: 'peernet-peer',
5051
+ codec: '0x7070',
5052
+ hashAlg: 'keccak-256',
5053
+ },
5054
+ {
5055
+ name: 'peernet-dht',
5056
+ codec: '0x706468',
5057
+ hashAlg: 'keccak-256',
5058
+ },
5059
+ {
5060
+ name: 'peernet-dht-response',
5061
+ codec: '0x706472',
5062
+ hashAlg: 'keccak-256',
5063
+ },
5064
+ {
5065
+ name: 'peernet-data',
5066
+ codec: '0x706461',
5067
+ hashAlg: 'keccak-256',
5068
+ },
5069
+ {
5070
+ name: 'peernet-data-response',
5071
+ codec: '0x70646172',
5072
+ hashAlg: 'keccak-256',
5073
+ },
5074
+ {
5075
+ name: 'peernet-message',
5076
+ codec: '0x706d65',
5077
+ hashAlg: 'keccak-256',
5078
+ },
5079
+ {
5080
+ name: 'peernet-ps',
5081
+ codec: '707073',
5082
+ hashAlg: 'keccak-256',
5083
+ },
5084
+ {
5085
+ name: 'peernet-response',
5086
+ codec: '0x7072',
5087
+ hashAlg: 'keccak-256',
5088
+ },
5089
+ {
5090
+ name: 'peernet-request',
5091
+ codec: '0x707271',
5092
+ hashAlg: 'keccak-256',
5093
+ },
5094
+ {
5095
+ name: 'peernet-file',
5096
+ codec: '0x7066',
5097
+ hashAlg: 'keccak-256',
5098
+ },
5099
+ {
5100
+ name: 'peernet-file-response',
5101
+ codec: '0x706672',
5102
+ hashAlg: 'keccak-256',
5023
5103
  }
5024
- }
5104
+ ];
5025
5105
 
5026
- /* eslint-disable import/prefer-default-export */
5027
- /* eslint-disable no-bitwise */
5028
- var _a;
5029
- function getGlobal() {
5030
- if (typeof globalThis !== 'undefined')
5031
- return globalThis;
5032
- // eslint-disable-next-line no-restricted-globals
5033
- if (typeof self !== 'undefined')
5034
- return self;
5035
- if (typeof window !== 'undefined')
5036
- return window;
5037
- return global;
5106
+ var social = [{
5107
+ name: 'chat-message',
5108
+ codec: '0x70636d',
5109
+ hashAlg: 'dbl-keccak-256',
5110
+ }];
5111
+
5112
+ const codecs = [
5113
+ ...internalCodecs,
5114
+ ...blockchainCodecs,
5115
+ ...social
5116
+ ];
5117
+
5118
+ globalThis.peernetCodecs = globalThis.peernetCodecs || {};
5119
+ const addCodec = (codecInput) => {
5120
+ let { hashAlg, codec, name } = codecInput;
5121
+ if (!globalThis.peernetCodecs[name])
5122
+ globalThis.peernetCodecs[name] = {
5123
+ hashAlg,
5124
+ codec: typeof codec === 'string' ? parseInt(codec, 16) : codec
5125
+ };
5126
+ };
5127
+ const getCodec = (name) => {
5128
+ if (typeof name === 'number')
5129
+ return name;
5130
+ return getCodecByName(name).codec;
5131
+ };
5132
+ const getCodecName = (codec) => {
5133
+ return Object.keys(globalThis.peernetCodecs).reduce((p, c) => {
5134
+ const item = globalThis.peernetCodecs[c];
5135
+ if (item.codec === codec)
5136
+ return c;
5137
+ else
5138
+ return p;
5139
+ }, undefined);
5140
+ };
5141
+ const getCodecByName = (name) => globalThis.peernetCodecs[name];
5142
+ const getHashAlg = (name) => {
5143
+ if (typeof name === 'number')
5144
+ return getCodecByName(getCodecName(name)).hashAlg;
5145
+ return getCodecByName(name).hashAlg;
5146
+ };
5147
+ const isCodec = (codec) => {
5148
+ if (codec.codec !== undefined && codec.hashAlg)
5149
+ return true;
5150
+ return false;
5151
+ };
5152
+ const validateCodec = (codec) => {
5153
+ if (codec.codec === undefined ||
5154
+ codec.hashAlg === undefined ||
5155
+ codec.name === undefined)
5156
+ throw new Error(`invalid codecInput: ${codec}`);
5157
+ };
5158
+ for (const codec of codecs) {
5159
+ addCodec(codec);
5038
5160
  }
5039
- const globalObject = getGlobal();
5040
- const nodeBuffer = (_a = globalObject.Buffer) !== null && _a !== void 0 ? _a : null;
5041
- const textEncoder = globalObject.TextEncoder ? new globalObject.TextEncoder() : null;
5042
- function hexCharCodesToInt(a, b) {
5043
- return (((a & 0xF) + ((a >> 6) | ((a >> 3) & 0x8))) << 4) | ((b & 0xF) + ((b >> 6) | ((b >> 3) & 0x8)));
5044
- }
5045
- function writeHexToUInt8(buf, str) {
5046
- const size = str.length >> 1;
5047
- for (let i = 0; i < size; i++) {
5048
- const index = i << 1;
5049
- buf[i] = hexCharCodesToInt(str.charCodeAt(index), str.charCodeAt(index + 1));
5161
+ var utils$p = {
5162
+ isCodec,
5163
+ addCodec,
5164
+ getCodec,
5165
+ getHashAlg,
5166
+ getCodecName,
5167
+ validateCodec,
5168
+ codecs: globalThis.peernetCodecs
5169
+ };
5170
+
5171
+ let Codec$1 = class Codec extends BasicInterface {
5172
+ codecBuffer;
5173
+ codec;
5174
+ hashAlg;
5175
+ constructor(buffer) {
5176
+ super();
5177
+ if (buffer) {
5178
+ if (buffer instanceof Uint8Array) {
5179
+ const codec = index$8.decode(buffer);
5180
+ const name = this.getCodecName(codec);
5181
+ if (name) {
5182
+ this.name = name;
5183
+ this.encoded = buffer;
5184
+ this.decode(buffer);
5185
+ }
5186
+ else {
5187
+ this.encode(Number(new TextDecoder().decode(buffer)));
5188
+ }
5189
+ }
5190
+ else if (buffer instanceof ArrayBuffer) {
5191
+ const codec = index$8.decode(buffer);
5192
+ const name = this.getCodecName(codec);
5193
+ if (name) {
5194
+ this.name = name;
5195
+ this.decode(buffer);
5196
+ }
5197
+ else {
5198
+ this.encode(Number(new TextDecoder().decode(new Uint8Array(buffer))));
5199
+ }
5200
+ }
5201
+ else if (typeof buffer === 'string') {
5202
+ if (utils$p.getCodec(buffer))
5203
+ this.fromName(buffer);
5204
+ else if (this.isHex(buffer))
5205
+ this.fromHex(buffer);
5206
+ else if (this.isBase32(buffer))
5207
+ this.fromBs32(buffer);
5208
+ else if (this.isBase58(buffer))
5209
+ this.fromBs58(buffer);
5210
+ else
5211
+ this.fromString(buffer);
5212
+ }
5213
+ if (!isNaN(buffer))
5214
+ if (utils$p.getCodec(buffer))
5215
+ this.fromCodec(buffer);
5216
+ }
5050
5217
  }
5051
- }
5052
- function hexStringEqualsUInt8(str, buf) {
5053
- if (str.length !== buf.length * 2) {
5054
- return false;
5218
+ fromEncoded(encoded) {
5219
+ const codec = index$8.decode(encoded);
5220
+ const name = this.getCodecName(codec);
5221
+ this.name = name;
5222
+ this.encoded = encoded;
5223
+ return this.decode(encoded);
5055
5224
  }
5056
- for (let i = 0; i < buf.length; i++) {
5057
- const strIndex = i << 1;
5058
- if (buf[i] !== hexCharCodesToInt(str.charCodeAt(strIndex), str.charCodeAt(strIndex + 1))) {
5059
- return false;
5060
- }
5225
+ getCodec(name) {
5226
+ return utils$p.getCodec(name);
5061
5227
  }
5062
- return true;
5063
- }
5064
- const alpha = 'a'.charCodeAt(0) - 10;
5065
- const digit = '0'.charCodeAt(0);
5066
- function getDigestHex(tmpBuffer, input, hashLength) {
5067
- let p = 0;
5068
- /* eslint-disable no-plusplus */
5069
- for (let i = 0; i < hashLength; i++) {
5070
- let nibble = input[i] >>> 4;
5071
- tmpBuffer[p++] = nibble > 9 ? nibble + alpha : nibble + digit;
5072
- nibble = input[i] & 0xF;
5073
- tmpBuffer[p++] = nibble > 9 ? nibble + alpha : nibble + digit;
5228
+ getCodecName(codec) {
5229
+ return utils$p.getCodecName(codec);
5074
5230
  }
5075
- /* eslint-enable no-plusplus */
5076
- return String.fromCharCode.apply(null, tmpBuffer);
5077
- }
5078
- const getUInt8Buffer = nodeBuffer !== null
5079
- ? (data) => {
5080
- if (typeof data === 'string') {
5081
- const buf = nodeBuffer.from(data, 'utf8');
5082
- return new Uint8Array(buf.buffer, buf.byteOffset, buf.length);
5231
+ getHashAlg(name) {
5232
+ return utils$p.getHashAlg(name);
5233
+ }
5234
+ fromCodec(codec) {
5235
+ this.name = this.getCodecName(codec);
5236
+ this.hashAlg = this.getHashAlg(this.name);
5237
+ this.codec = this.getCodec(this.name);
5238
+ this.codecBuffer = index$8.encode(this.codec);
5239
+ this.decoded = {
5240
+ name: this.name,
5241
+ hashAlg: this.hashAlg,
5242
+ codec: this.codec,
5243
+ codecBuffer: this.codecBuffer
5244
+ };
5245
+ }
5246
+ fromName(name) {
5247
+ const codec = this.getCodec(name);
5248
+ this.name = name;
5249
+ this.codec = codec;
5250
+ this.hashAlg = this.getHashAlg(name);
5251
+ this.codecBuffer = index$8.encode(this.codec);
5252
+ this.decoded = {
5253
+ name: this.name,
5254
+ hashAlg: this.hashAlg,
5255
+ codec: this.codec,
5256
+ codecBuffer: this.codecBuffer
5257
+ };
5258
+ }
5259
+ decode(encoded) {
5260
+ encoded = encoded || this.encoded;
5261
+ const codec = index$8.decode(encoded);
5262
+ this.fromCodec(codec);
5263
+ return this.decoded;
5264
+ }
5265
+ encode(codec) {
5266
+ codec = codec || this.codec;
5267
+ this.encoded = index$8.encode(codec);
5268
+ return this.encoded;
5269
+ }
5270
+ };
5271
+
5272
+ class CodecHash extends BasicInterface {
5273
+ codec;
5274
+ discoCodec;
5275
+ constructor(buffer, options = {}) {
5276
+ super();
5277
+ if (options.name)
5278
+ this.name = options.name;
5279
+ else
5280
+ this.name = 'disco-hash';
5281
+ if (options.codecs)
5282
+ this.codecs = options.codecs;
5283
+ return this.init(buffer);
5284
+ }
5285
+ async init(uint8Array) {
5286
+ if (uint8Array) {
5287
+ if (uint8Array instanceof Uint8Array) {
5288
+ this.discoCodec = new Codec$1(uint8Array, this.codecs);
5289
+ const name = this.discoCodec.name;
5290
+ if (name) {
5291
+ this.name = name;
5292
+ this.decode(uint8Array);
5293
+ }
5294
+ else {
5295
+ await this.encode(uint8Array);
5296
+ }
5297
+ }
5298
+ if (typeof uint8Array === 'string') {
5299
+ if (this.isHex(uint8Array))
5300
+ await this.fromHex(uint8Array);
5301
+ if (this.isBase32(uint8Array))
5302
+ await this.fromBs32(uint8Array);
5303
+ else if (this.isBase58(uint8Array))
5304
+ await this.fromBs58(uint8Array);
5305
+ else
5306
+ throw new Error(`unsupported string ${uint8Array}`);
5307
+ }
5308
+ else if (typeof uint8Array === 'object')
5309
+ await this.fromJSON(uint8Array);
5083
5310
  }
5084
- if (nodeBuffer.isBuffer(data)) {
5085
- return new Uint8Array(data.buffer, data.byteOffset, data.length);
5311
+ return this;
5312
+ }
5313
+ get prefix() {
5314
+ const length = this.length;
5315
+ const uint8Array = new Uint8Array(length.length + this.discoCodec.codecBuffer.length);
5316
+ uint8Array.set(length);
5317
+ uint8Array.set(this.discoCodec.codecBuffer, length.length);
5318
+ return uint8Array;
5319
+ }
5320
+ get length() {
5321
+ return index$8.encode(this.size);
5322
+ }
5323
+ get buffer() {
5324
+ return this.encoded;
5325
+ }
5326
+ get hash() {
5327
+ return this.encoded;
5328
+ }
5329
+ fromJSON(json) {
5330
+ return this.encode(new TextEncoder().encode(JSON.stringify(json)));
5331
+ }
5332
+ async encode(buffer, name) {
5333
+ if (!this.name && name)
5334
+ this.name = name;
5335
+ if (!buffer)
5336
+ buffer = this.buffer;
5337
+ this.discoCodec = new Codec$1(this.name);
5338
+ this.discoCodec.fromName(this.name);
5339
+ let hashAlg = this.discoCodec.hashAlg;
5340
+ const hashVariant = Number(hashAlg.split('-')[hashAlg.split('-').length - 1]);
5341
+ if (hashAlg.includes('dbl')) {
5342
+ hashAlg = hashAlg.replace('dbl-', '');
5343
+ // const hasher = await createKeccak(hashVariant)
5344
+ // await hasher.init()
5345
+ // hasher.update(buffer)
5346
+ // buffer = hasher.digest('binary')
5347
+ buffer = await crypto.subtle.digest(`SHA-${hashVariant}`, buffer);
5086
5348
  }
5087
- if (ArrayBuffer.isView(data)) {
5088
- return new Uint8Array(data.buffer, data.byteOffset, data.byteLength);
5349
+ // const hasher = await createKeccak(hashVariant)
5350
+ // await hasher.init()
5351
+ // hasher.update(buffer)
5352
+ // this.digest = hasher.digest('binary')
5353
+ this.digest = await crypto.subtle.digest(`SHA-${hashVariant}`, buffer);
5354
+ if (this.digest instanceof ArrayBuffer) {
5355
+ this.digest = new Uint8Array(this.digest);
5089
5356
  }
5090
- throw new Error('Invalid data type!');
5357
+ this.size = this.digest.length;
5358
+ this.codec = this.discoCodec.encode();
5359
+ this.codec = this.discoCodec.codecBuffer;
5360
+ const uint8Array = new Uint8Array(this.digest.length + this.prefix.length);
5361
+ uint8Array.set(this.prefix);
5362
+ uint8Array.set(this.digest, this.prefix.length);
5363
+ this.encoded = uint8Array;
5364
+ return this.encoded;
5091
5365
  }
5092
- : (data) => {
5093
- if (typeof data === 'string') {
5094
- return textEncoder.encode(data);
5095
- }
5096
- if (ArrayBuffer.isView(data)) {
5097
- return new Uint8Array(data.buffer, data.byteOffset, data.byteLength);
5366
+ async validate(buffer) {
5367
+ if (Buffer.isBuffer(buffer)) {
5368
+ const codec = index$8.decode(buffer);
5369
+ if (this.codecs[codec]) {
5370
+ this.decode(buffer);
5371
+ }
5372
+ else {
5373
+ await this.encode(buffer);
5374
+ }
5098
5375
  }
5099
- throw new Error('Invalid data type!');
5100
- };
5101
- const base64Chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
5102
- const base64Lookup = new Uint8Array(256);
5103
- for (let i = 0; i < base64Chars.length; i++) {
5104
- base64Lookup[base64Chars.charCodeAt(i)] = i;
5105
- }
5106
- function getDecodeBase64Length(data) {
5107
- let bufferLength = Math.floor(data.length * 0.75);
5108
- const len = data.length;
5109
- if (data[len - 1] === '=') {
5110
- bufferLength -= 1;
5111
- if (data[len - 2] === '=') {
5112
- bufferLength -= 1;
5376
+ if (typeof buffer === 'string') {
5377
+ if (this.isHex(buffer))
5378
+ this.fromHex(buffer);
5379
+ if (this.isBase32(buffer))
5380
+ this.fromBs32(buffer);
5113
5381
  }
5382
+ if (typeof buffer === 'object')
5383
+ this.fromJSON(buffer);
5114
5384
  }
5115
- return bufferLength;
5116
- }
5117
- function decodeBase64(data) {
5118
- const bufferLength = getDecodeBase64Length(data);
5119
- const len = data.length;
5120
- const bytes = new Uint8Array(bufferLength);
5121
- let p = 0;
5122
- for (let i = 0; i < len; i += 4) {
5123
- const encoded1 = base64Lookup[data.charCodeAt(i)];
5124
- const encoded2 = base64Lookup[data.charCodeAt(i + 1)];
5125
- const encoded3 = base64Lookup[data.charCodeAt(i + 2)];
5126
- const encoded4 = base64Lookup[data.charCodeAt(i + 3)];
5127
- bytes[p] = (encoded1 << 2) | (encoded2 >> 4);
5128
- p += 1;
5129
- bytes[p] = ((encoded2 & 15) << 4) | (encoded3 >> 2);
5130
- p += 1;
5131
- bytes[p] = ((encoded3 & 3) << 6) | (encoded4 & 63);
5132
- p += 1;
5133
- }
5134
- return bytes;
5135
- }
5136
-
5137
- const MAX_HEAP = 16 * 1024;
5138
- const WASM_FUNC_HASH_LENGTH = 4;
5139
- const wasmMutex = new Mutex();
5140
- const wasmModuleCache = new Map();
5141
- function WASMInterface(binary, hashLength) {
5142
- return __awaiter(this, void 0, void 0, function* () {
5143
- let wasmInstance = null;
5144
- let memoryView = null;
5145
- let initialized = false;
5146
- if (typeof WebAssembly === 'undefined') {
5147
- throw new Error('WebAssembly is not supported in this environment!');
5148
- }
5149
- const writeMemory = (data, offset = 0) => {
5150
- memoryView.set(data, offset);
5151
- };
5152
- const getMemory = () => memoryView;
5153
- const getExports = () => wasmInstance.exports;
5154
- const setMemorySize = (totalSize) => {
5155
- wasmInstance.exports.Hash_SetMemorySize(totalSize);
5156
- const arrayOffset = wasmInstance.exports.Hash_GetBuffer();
5157
- const memoryBuffer = wasmInstance.exports.memory.buffer;
5158
- memoryView = new Uint8Array(memoryBuffer, arrayOffset, totalSize);
5159
- };
5160
- const getStateSize = () => {
5161
- const view = new DataView(wasmInstance.exports.memory.buffer);
5162
- const stateSize = view.getUint32(wasmInstance.exports.STATE_SIZE, true);
5163
- return stateSize;
5164
- };
5165
- const loadWASMPromise = wasmMutex.dispatch(() => __awaiter(this, void 0, void 0, function* () {
5166
- if (!wasmModuleCache.has(binary.name)) {
5167
- const asm = decodeBase64(binary.data);
5168
- const promise = WebAssembly.compile(asm);
5169
- wasmModuleCache.set(binary.name, promise);
5170
- }
5171
- const module = yield wasmModuleCache.get(binary.name);
5172
- wasmInstance = yield WebAssembly.instantiate(module, {
5173
- // env: {
5174
- // emscripten_memcpy_big: (dest, src, num) => {
5175
- // const memoryBuffer = wasmInstance.exports.memory.buffer;
5176
- // const memView = new Uint8Array(memoryBuffer, 0);
5177
- // memView.set(memView.subarray(src, src + num), dest);
5178
- // },
5179
- // print_memory: (offset, len) => {
5180
- // const memoryBuffer = wasmInstance.exports.memory.buffer;
5181
- // const memView = new Uint8Array(memoryBuffer, 0);
5182
- // console.log('print_int32', memView.subarray(offset, offset + len));
5183
- // },
5184
- // },
5185
- });
5186
- // wasmInstance.exports._start();
5187
- }));
5188
- const setupInterface = () => __awaiter(this, void 0, void 0, function* () {
5189
- if (!wasmInstance) {
5190
- yield loadWASMPromise;
5191
- }
5192
- const arrayOffset = wasmInstance.exports.Hash_GetBuffer();
5193
- const memoryBuffer = wasmInstance.exports.memory.buffer;
5194
- memoryView = new Uint8Array(memoryBuffer, arrayOffset, MAX_HEAP);
5195
- });
5196
- const init = (bits = null) => {
5197
- initialized = true;
5198
- wasmInstance.exports.Hash_Init(bits);
5199
- };
5200
- const updateUInt8Array = (data) => {
5201
- let read = 0;
5202
- while (read < data.length) {
5203
- const chunk = data.subarray(read, read + MAX_HEAP);
5204
- read += chunk.length;
5205
- memoryView.set(chunk);
5206
- wasmInstance.exports.Hash_Update(chunk.length);
5207
- }
5208
- };
5209
- const update = (data) => {
5210
- if (!initialized) {
5211
- throw new Error('update() called before init()');
5212
- }
5213
- const Uint8Buffer = getUInt8Buffer(data);
5214
- updateUInt8Array(Uint8Buffer);
5215
- };
5216
- const digestChars = new Uint8Array(hashLength * 2);
5217
- const digest = (outputType, padding = null) => {
5218
- if (!initialized) {
5219
- throw new Error('digest() called before init()');
5220
- }
5221
- initialized = false;
5222
- wasmInstance.exports.Hash_Final(padding);
5223
- if (outputType === 'binary') {
5224
- // the data is copied to allow GC of the original memory object
5225
- return memoryView.slice(0, hashLength);
5226
- }
5227
- return getDigestHex(digestChars, memoryView, hashLength);
5228
- };
5229
- const save = () => {
5230
- if (!initialized) {
5231
- throw new Error('save() can only be called after init() and before digest()');
5232
- }
5233
- const stateOffset = wasmInstance.exports.Hash_GetState();
5234
- const stateLength = getStateSize();
5235
- const memoryBuffer = wasmInstance.exports.memory.buffer;
5236
- const internalState = new Uint8Array(memoryBuffer, stateOffset, stateLength);
5237
- // prefix is 4 bytes from SHA1 hash of the WASM binary
5238
- // it is used to detect incompatible internal states between different versions of hash-wasm
5239
- const prefixedState = new Uint8Array(WASM_FUNC_HASH_LENGTH + stateLength);
5240
- writeHexToUInt8(prefixedState, binary.hash);
5241
- prefixedState.set(internalState, WASM_FUNC_HASH_LENGTH);
5242
- return prefixedState;
5243
- };
5244
- const load = (state) => {
5245
- if (!(state instanceof Uint8Array)) {
5246
- throw new Error('load() expects an Uint8Array generated by save()');
5247
- }
5248
- const stateOffset = wasmInstance.exports.Hash_GetState();
5249
- const stateLength = getStateSize();
5250
- const overallLength = WASM_FUNC_HASH_LENGTH + stateLength;
5251
- const memoryBuffer = wasmInstance.exports.memory.buffer;
5252
- if (state.length !== overallLength) {
5253
- throw new Error(`Bad state length (expected ${overallLength} bytes, got ${state.length})`);
5254
- }
5255
- if (!hexStringEqualsUInt8(binary.hash, state.subarray(0, WASM_FUNC_HASH_LENGTH))) {
5256
- throw new Error('This state was written by an incompatible hash implementation');
5257
- }
5258
- const internalState = state.subarray(WASM_FUNC_HASH_LENGTH);
5259
- new Uint8Array(memoryBuffer, stateOffset, stateLength).set(internalState);
5260
- initialized = true;
5261
- };
5262
- const isDataShort = (data) => {
5263
- if (typeof data === 'string') {
5264
- // worst case is 4 bytes / char
5265
- return data.length < MAX_HEAP / 4;
5266
- }
5267
- return data.byteLength < MAX_HEAP;
5268
- };
5269
- let canSimplify = isDataShort;
5270
- switch (binary.name) {
5271
- case 'argon2':
5272
- case 'scrypt':
5273
- canSimplify = () => true;
5274
- break;
5275
- case 'blake2b':
5276
- case 'blake2s':
5277
- // if there is a key at blake2 then cannot simplify
5278
- canSimplify = (data, initParam) => initParam <= 512 && isDataShort(data);
5279
- break;
5280
- case 'blake3':
5281
- // if there is a key at blake3 then cannot simplify
5282
- canSimplify = (data, initParam) => initParam === 0 && isDataShort(data);
5283
- break;
5284
- case 'xxhash64': // cannot simplify
5285
- case 'xxhash3':
5286
- case 'xxhash128':
5287
- canSimplify = () => false;
5288
- break;
5385
+ decode(buffer) {
5386
+ this.encoded = buffer;
5387
+ const codec = index$8.decode(buffer);
5388
+ this.discoCodec = new Codec$1(codec, this.codecs);
5389
+ // TODO: validate codec
5390
+ buffer = buffer.slice(index$8.decode.bytes);
5391
+ this.size = index$8.decode(buffer);
5392
+ this.digest = buffer.slice(index$8.decode.bytes);
5393
+ if (this.digest.length !== this.size) {
5394
+ throw new Error(`hash length inconsistent: 0x${this.encoded.toString('hex')}`);
5289
5395
  }
5290
- // shorthand for (init + update + digest) for better performance
5291
- const calculate = (data, initParam = null, digestParam = null) => {
5292
- if (!canSimplify(data, initParam)) {
5293
- init(initParam);
5294
- update(data);
5295
- return digest('hex', digestParam);
5296
- }
5297
- const buffer = getUInt8Buffer(data);
5298
- memoryView.set(buffer);
5299
- wasmInstance.exports.Hash_Calculate(buffer.length, initParam, digestParam);
5300
- return getDigestHex(digestChars, memoryView, hashLength);
5301
- };
5302
- yield setupInterface();
5396
+ // const discoCodec = new Codec(codec, this.codecs)
5397
+ this.name = this.discoCodec.name;
5398
+ this.size = this.digest.length;
5303
5399
  return {
5304
- getMemory,
5305
- writeMemory,
5306
- getExports,
5307
- setMemorySize,
5308
- init,
5309
- update,
5310
- digest,
5311
- save,
5312
- load,
5313
- calculate,
5314
- hashLength,
5400
+ codec: this.codec,
5401
+ name: this.name,
5402
+ size: this.size,
5403
+ length: this.length,
5404
+ digest: this.digest,
5315
5405
  };
5316
- });
5406
+ }
5317
5407
  }
5318
5408
 
5319
- new Mutex();
5320
-
5321
- new Mutex();
5322
-
5323
- new Mutex();
5324
-
5325
- new Mutex();
5326
-
5327
- new Mutex();
5328
-
5329
- new Mutex();
5330
-
5331
- new Mutex();
5332
-
5333
- new Mutex();
5334
-
5335
- new Mutex();
5336
-
5337
- var name$b = "sha3";
5338
- var data$b = "AGFzbQEAAAABFARgAAF/YAF/AGACf38AYAN/f38AAwgHAAEBAgEAAwUEAQECAgYOAn8BQZCNBQt/AEGACAsHcAgGbWVtb3J5AgAOSGFzaF9HZXRCdWZmZXIAAAlIYXNoX0luaXQAAQtIYXNoX1VwZGF0ZQACCkhhc2hfRmluYWwABA1IYXNoX0dldFN0YXRlAAUOSGFzaF9DYWxjdWxhdGUABgpTVEFURV9TSVpFAwEKqBwHBQBBgAoL1wMAQQBCADcDgI0BQQBCADcD+IwBQQBCADcD8IwBQQBCADcD6IwBQQBCADcD4IwBQQBCADcD2IwBQQBCADcD0IwBQQBCADcDyIwBQQBCADcDwIwBQQBCADcDuIwBQQBCADcDsIwBQQBCADcDqIwBQQBCADcDoIwBQQBCADcDmIwBQQBCADcDkIwBQQBCADcDiIwBQQBCADcDgIwBQQBCADcD+IsBQQBCADcD8IsBQQBCADcD6IsBQQBCADcD4IsBQQBCADcD2IsBQQBCADcD0IsBQQBCADcDyIsBQQBCADcDwIsBQQBCADcDuIsBQQBCADcDsIsBQQBCADcDqIsBQQBCADcDoIsBQQBCADcDmIsBQQBCADcDkIsBQQBCADcDiIsBQQBCADcDgIsBQQBCADcD+IoBQQBCADcD8IoBQQBCADcD6IoBQQBCADcD4IoBQQBCADcD2IoBQQBCADcD0IoBQQBCADcDyIoBQQBCADcDwIoBQQBCADcDuIoBQQBCADcDsIoBQQBCADcDqIoBQQBCADcDoIoBQQBCADcDmIoBQQBCADcDkIoBQQBCADcDiIoBQQBCADcDgIoBQQBBwAwgAEEBdGtBA3Y2AoyNAUEAQQA2AoiNAQuMAwEIfwJAQQAoAoiNASIBQQBIDQBBACABIABqQQAoAoyNASICcDYCiI0BAkACQCABDQBBgAohAwwBCwJAIAIgAWsiBCAAIAQgAEkbIgNFDQAgA0EDcSEFQQAhBgJAIANBBEkNACABQYCKAWohByADQXxxIQhBACEGA0AgByAGaiIDQcgBaiAGQYAKai0AADoAACADQckBaiAGQYEKai0AADoAACADQcoBaiAGQYIKai0AADoAACADQcsBaiAGQYMKai0AADoAACAIIAZBBGoiBkcNAAsLIAVFDQAgAUHIiwFqIQMDQCADIAZqIAZBgApqLQAAOgAAIAZBAWohBiAFQX9qIgUNAAsLIAQgAEsNAUHIiwEgAhADIAAgBGshACAEQYAKaiEDCwJAIAAgAkkNAANAIAMgAhADIAMgAmohAyAAIAJrIgAgAk8NAAsLIABFDQBBACECQcgBIQYDQCAGQYCKAWogAyAGakG4fmotAAA6AAAgBkEBaiEGIAAgAkEBaiICQf8BcUsNAAsLC+QLAS1+IAApA0AhAkEAKQPAigEhAyAAKQM4IQRBACkDuIoBIQUgACkDMCEGQQApA7CKASEHIAApAyghCEEAKQOoigEhCSAAKQMgIQpBACkDoIoBIQsgACkDGCEMQQApA5iKASENIAApAxAhDkEAKQOQigEhDyAAKQMIIRBBACkDiIoBIREgACkDACESQQApA4CKASETQQApA8iKASEUAkACQCABQcgASw0AQQApA9CKASEVQQApA+CKASEWQQApA9iKASEXDAELQQApA+CKASAAKQNghSEWQQApA9iKASAAKQNYhSEXQQApA9CKASAAKQNQhSEVIBQgACkDSIUhFCABQekASQ0AQQBBACkD6IoBIAApA2iFNwPoigFBAEEAKQPwigEgACkDcIU3A/CKAUEAQQApA/iKASAAKQN4hTcD+IoBQQBBACkDgIsBIAApA4ABhTcDgIsBIAFBiQFJDQBBAEEAKQOIiwEgACkDiAGFNwOIiwELIAMgAoUhGCAFIASFIRkgByAGhSEHIAkgCIUhCCALIAqFIRogDSAMhSEJIA8gDoUhCiARIBCFIQsgEyAShSEMQQApA7iLASESQQApA5CLASETQQApA+iKASEbQQApA6CLASEcQQApA/iKASENQQApA7CLASEdQQApA4iLASEOQQApA8CLASEPQQApA5iLASEeQQApA/CKASEQQQApA6iLASERQQApA4CLASEfQcB+IQADQCAaIAcgC4UgF4UgH4UgEYVCAYmFIBSFIBCFIB6FIA+FIQIgDCAZIAqFIBaFIA6FIB2FQgGJhSAIhSAVhSANhSAchSIDIAeFISAgCSAIIAyFIBWFIA2FIByFQgGJhSAYhSAbhSAThSAShSIEIA+FISEgGCAKIBQgGoUgEIUgHoUgD4VCAYmFIBmFIBaFIA6FIB2FIgWFQjeJIiIgCyAYIAmFIBuFIBOFIBKFQgGJhSAHhSAXhSAfhSARhSIGIAqFQj6JIiNCf4WDIAMgEYVCAokiJIUhDyANIAKFQimJIiUgBCAQhUIniSImQn+FgyAihSERIBIgBYVCOIkiEiAGIA6FQg+JIidCf4WDIAMgF4VCCokiKIUhDiAEIBqFQhuJIikgKCAIIAKFQiSJIipCf4WDhSENIAYgGYVCBokiKyADIAuFQgGJIixCf4WDIBwgAoVCEokiLYUhECArIAQgHoVCCIkiLiAbIAWFQhmJIhtCf4WDhSEXIAYgHYVCPYkiGSAEIBSFQhSJIgQgCSAFhUIciSIIQn+Fg4UhFCAIIBlCf4WDIAMgH4VCLYkiA4UhGCAZIANCf4WDIBUgAoVCA4kiCYUhGSAEIAMgCUJ/hYOFIQcgCSAEQn+FgyAIhSEIIAwgAoUiAiAhQg6JIgNCf4WDIBMgBYVCFYkiBIUhCSAGIBaFQiuJIgUgAyAEQn+Fg4UhCiAEIAVCf4WDICBCLIkiBIUhCyAAQdAJaikDACAFIARCf4WDhSAChSEMICcgKEJ/hYMgKoUiBSEfIAMgBCACQn+Fg4UiAiEaICogKUJ/hYMgEoUiAyEeIC0gLkJ/hYMgG4UiBCEWICYgJCAlQn+Fg4UiBiEdIBsgK0J/hYMgLIUiKCEVICMgJiAiQn+Fg4UiIiEcIC4gLCAtQn+Fg4UiJiEbICcgKSASQn+Fg4UiJyETICMgJEJ/hYMgJYUiIyESIABBCGoiAA0AC0EAIBE3A6iLAUEAIAU3A4CLAUEAIBc3A9iKAUEAIAc3A7CKAUEAIAs3A4iKAUEAIA83A8CLAUEAIAM3A5iLAUEAIBA3A/CKAUEAIBQ3A8iKAUEAIAI3A6CKAUEAIAY3A7CLAUEAIA43A4iLAUEAIAQ3A+CKAUEAIBk3A7iKAUEAIAo3A5CKAUEAICI3A6CLAUEAIA03A/iKAUEAICg3A9CKAUEAIAg3A6iKAUEAIAw3A4CKAUEAICM3A7iLAUEAICc3A5CLAUEAICY3A+iKAUEAIBg3A8CKAUEAIAk3A5iKAQv4AgEFf0HkAEEAKAKMjQEiAUEBdmshAgJAQQAoAoiNASIDQQBIDQAgASEEAkAgASADRg0AIANByIsBaiEFQQAhAwNAIAUgA2pBADoAACADQQFqIgMgAUEAKAKIjQEiBGtJDQALCyAEQciLAWoiAyADLQAAIAByOgAAIAFBx4sBaiIDIAMtAABBgAFyOgAAQciLASABEANBAEGAgICAeDYCiI0BCwJAIAJBBEkNACACQQJ2IgNBA3EhBUEAIQQCQCADQX9qQQNJDQAgA0H8////A3EhAUEAIQNBACEEA0AgA0GACmogA0GAigFqKAIANgIAIANBhApqIANBhIoBaigCADYCACADQYgKaiADQYiKAWooAgA2AgAgA0GMCmogA0GMigFqKAIANgIAIANBEGohAyABIARBBGoiBEcNAAsLIAVFDQAgBUECdCEBIARBAnQhAwNAIANBgApqIANBgIoBaigCADYCACADQQRqIQMgAUF8aiIBDQALCwsGAEGAigEL0QYBA39BAEIANwOAjQFBAEIANwP4jAFBAEIANwPwjAFBAEIANwPojAFBAEIANwPgjAFBAEIANwPYjAFBAEIANwPQjAFBAEIANwPIjAFBAEIANwPAjAFBAEIANwO4jAFBAEIANwOwjAFBAEIANwOojAFBAEIANwOgjAFBAEIANwOYjAFBAEIANwOQjAFBAEIANwOIjAFBAEIANwOAjAFBAEIANwP4iwFBAEIANwPwiwFBAEIANwPoiwFBAEIANwPgiwFBAEIANwPYiwFBAEIANwPQiwFBAEIANwPIiwFBAEIANwPAiwFBAEIANwO4iwFBAEIANwOwiwFBAEIANwOoiwFBAEIANwOgiwFBAEIANwOYiwFBAEIANwOQiwFBAEIANwOIiwFBAEIANwOAiwFBAEIANwP4igFBAEIANwPwigFBAEIANwPoigFBAEIANwPgigFBAEIANwPYigFBAEIANwPQigFBAEIANwPIigFBAEIANwPAigFBAEIANwO4igFBAEIANwOwigFBAEIANwOoigFBAEIANwOgigFBAEIANwOYigFBAEIANwOQigFBAEIANwOIigFBAEIANwOAigFBAEHADCABQQF0a0EDdjYCjI0BQQBBADYCiI0BIAAQAkHkAEEAKAKMjQEiAEEBdmshAwJAQQAoAoiNASIBQQBIDQAgACEEAkAgACABRg0AIAFByIsBaiEFQQAhAQNAIAUgAWpBADoAACABQQFqIgEgAEEAKAKIjQEiBGtJDQALCyAEQciLAWoiASABLQAAIAJyOgAAIABBx4sBaiIBIAEtAABBgAFyOgAAQciLASAAEANBAEGAgICAeDYCiI0BCwJAIANBBEkNACADQQJ2IgFBA3EhBUEAIQQCQCABQX9qQQNJDQAgAUH8////A3EhAEEAIQFBACEEA0AgAUGACmogAUGAigFqKAIANgIAIAFBhApqIAFBhIoBaigCADYCACABQYgKaiABQYiKAWooAgA2AgAgAUGMCmogAUGMigFqKAIANgIAIAFBEGohASAAIARBBGoiBEcNAAsLIAVFDQAgBUECdCEAIARBAnQhAQNAIAFBgApqIAFBgIoBaigCADYCACABQQRqIQEgAEF8aiIADQALCwsL2AEBAEGACAvQAZABAAAAAAAAAAAAAAAAAAABAAAAAAAAAIKAAAAAAAAAioAAAAAAAIAAgACAAAAAgIuAAAAAAAAAAQAAgAAAAACBgACAAAAAgAmAAAAAAACAigAAAAAAAACIAAAAAAAAAAmAAIAAAAAACgAAgAAAAACLgACAAAAAAIsAAAAAAACAiYAAAAAAAIADgAAAAAAAgAKAAAAAAACAgAAAAAAAAIAKgAAAAAAAAAoAAIAAAACAgYAAgAAAAICAgAAAAAAAgAEAAIAAAAAACIAAgAAAAIA=";
5339
- var hash$b = "f2f6f5b2";
5340
- var wasmJson$b = {
5341
- name: name$b,
5342
- data: data$b,
5343
- hash: hash$b
5344
- };
5345
-
5346
- new Mutex();
5347
-
5348
- new Mutex();
5349
- function validateBits(bits) {
5350
- if (![224, 256, 384, 512].includes(bits)) {
5351
- return new Error('Invalid variant! Valid values: 224, 256, 384, 512');
5409
+ let FormatInterface$1 = class FormatInterface extends BasicInterface {
5410
+ hashFormat;
5411
+ #hash;
5412
+ init(buffer) {
5413
+ if (buffer instanceof Uint8Array)
5414
+ this.fromUint8Array(buffer);
5415
+ else if (buffer instanceof ArrayBuffer)
5416
+ this.fromArrayBuffer(buffer);
5417
+ else if (buffer instanceof FormatInterface && buffer?.name === this.name)
5418
+ return buffer;
5419
+ else if (typeof buffer === 'string') {
5420
+ if (this.isHex(buffer))
5421
+ this.fromHex(buffer);
5422
+ else if (this.isBase58(buffer))
5423
+ this.fromBs58(buffer);
5424
+ else if (this.isBase32(buffer))
5425
+ this.fromBs32(buffer);
5426
+ else
5427
+ this.fromString(buffer);
5428
+ }
5429
+ else {
5430
+ this.create(buffer);
5431
+ }
5432
+ return this;
5352
5433
  }
5353
- return null;
5354
- }
5355
- /**
5356
- * Creates a new Keccak hash instance
5357
- * @param bits Number of output bits. Valid values: 224, 256, 384, 512
5358
- */
5359
- function createKeccak(bits = 512) {
5360
- if (validateBits(bits)) {
5361
- return Promise.reject(validateBits(bits));
5434
+ hasCodec() {
5435
+ if (!this.encoded)
5436
+ return false;
5437
+ const codec = new Codec$1(this.encoded);
5438
+ if (codec.name)
5439
+ return true;
5362
5440
  }
5363
- const outputSize = bits / 8;
5364
- return WASMInterface(wasmJson$b, outputSize).then((wasm) => {
5365
- wasm.init(bits);
5366
- const obj = {
5367
- init: () => { wasm.init(bits); return obj; },
5368
- update: (data) => { wasm.update(data); return obj; },
5369
- digest: (outputType) => wasm.digest(outputType, 0x01),
5370
- save: () => wasm.save(),
5371
- load: (data) => { wasm.load(data); return obj; },
5372
- blockSize: 200 - 2 * outputSize,
5373
- digestSize: outputSize,
5374
- };
5375
- return obj;
5376
- });
5377
- }
5378
-
5379
- new Mutex();
5441
+ decode(encoded) {
5442
+ encoded = encoded || this.encoded;
5443
+ const codec = new Codec$1(encoded);
5444
+ if (codec.codecBuffer) {
5445
+ encoded = encoded.slice(codec.codecBuffer.length);
5446
+ this.name = codec.name;
5447
+ this.decoded = this.protoDecode(encoded);
5448
+ // try {
5449
+ // this.decoded = JSON.parse(this.decoded)
5450
+ // } catch {
5451
+ // }
5452
+ }
5453
+ else {
5454
+ throw new Error(`no codec found`);
5455
+ }
5456
+ return this.decoded;
5457
+ }
5458
+ encode(decoded) {
5459
+ let encoded;
5460
+ decoded = decoded || this.decoded;
5461
+ const codec = new Codec$1(this.name);
5462
+ if (decoded instanceof Uint8Array)
5463
+ encoded = decoded;
5464
+ else
5465
+ encoded = this.protoEncode(decoded);
5466
+ if (codec.codecBuffer) {
5467
+ const uint8Array = new Uint8Array(encoded.length + codec.codecBuffer.length);
5468
+ uint8Array.set(codec.codecBuffer);
5469
+ uint8Array.set(encoded, codec.codecBuffer.length);
5470
+ this.encoded = uint8Array;
5471
+ }
5472
+ else {
5473
+ throw new Error(`invalid codec`);
5474
+ }
5475
+ return this.encoded;
5476
+ }
5477
+ /**
5478
+ * @param {Buffer|String|Object} buffer - data - The data needed to create the desired message
5479
+ * @param {Object} proto - {protoObject}
5480
+ * @param {Object} options - {hashFormat, name}
5481
+ */
5482
+ constructor(buffer, proto, options) {
5483
+ super();
5484
+ this.proto = proto;
5485
+ this.hashFormat = options?.hashFormat ? options.hashFormat : 'bs32';
5486
+ if (options?.name)
5487
+ this.name = options.name;
5488
+ this.init(buffer);
5489
+ }
5490
+ get format() {
5491
+ const upper = this.hashFormat.charAt(0).toUpperCase();
5492
+ return `${upper}${this.hashFormat.substring(1, this.hashFormat.length)}`;
5493
+ }
5494
+ /**
5495
+ * @return {PeernetHash}
5496
+ */
5497
+ get peernetHash() {
5498
+ const decoded = this.decoded;
5499
+ // @ts-ignore
5500
+ delete decoded.hash;
5501
+ return new CodecHash(decoded, { name: this.name });
5502
+ }
5503
+ /**
5504
+ * @return {peernetHash}
5505
+ */
5506
+ async hash() {
5507
+ if (this.#hash)
5508
+ return this.#hash;
5509
+ const upper = this.hashFormat.charAt(0).toUpperCase();
5510
+ const format = `${upper}${this.hashFormat.substring(1, this.hashFormat.length)}`;
5511
+ this.#hash = (await this.peernetHash)[`to${format}`]();
5512
+ return this.#hash;
5513
+ }
5514
+ fromUint8Array(buffer) {
5515
+ this.encoded = buffer;
5516
+ return this.hasCodec() ? this.decode() : this.create(JSON.parse(new TextDecoder().decode(this.encoded)));
5517
+ }
5518
+ fromArrayBuffer(buffer) {
5519
+ this.encoded = new Uint8Array(buffer, buffer.byteOffset, buffer.byteLength);
5520
+ return this.hasCodec() ? this.decode() : this.create(JSON.parse(new TextDecoder().decode(this.encoded)));
5521
+ }
5522
+ /**
5523
+ * @param {Object} data
5524
+ */
5525
+ create(data) {
5526
+ const decoded = {};
5527
+ if (data.hash)
5528
+ this.#hash = data.hash;
5529
+ if (this.keys?.length > 0) {
5530
+ for (const key of this.keys) {
5531
+ decoded[key] = data[key];
5532
+ }
5533
+ this.decoded = decoded;
5534
+ // return this.encode(decoded)
5535
+ }
5536
+ }
5537
+ };
5380
5538
 
5381
- new Mutex();
5539
+ const FormatInterface = FormatInterface$1;
5540
+ const Codec = Codec$1;
5382
5541
 
5383
- var name$9 = "sha512";
5384
- var data$9 = "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";
5385
- var hash$9 = "cdd57f6a";
5386
- var wasmJson$9 = {
5387
- name: name$9,
5388
- data: data$9,
5389
- hash: hash$9
5542
+ const BufferToUint8Array = data => {
5543
+ if (data.type === 'Buffer') {
5544
+ data = new Uint8Array(data.data);
5545
+ }
5546
+ return data
5547
+ };
5548
+
5549
+ const protoFor = (message) => {
5550
+ const codec = new Codec(message);
5551
+ if (!codec.name) throw new Error('proto not found')
5552
+ const Proto = globalThis.peernet.protos[codec.name];
5553
+ if (!Proto) throw (new Error(`No proto defined for ${codec.name}`))
5554
+ return new Proto(message)
5555
+ };
5556
+
5557
+ /**
5558
+ * wether or not a peernet daemon is active
5559
+ * @return {Boolean}
5560
+ */
5561
+ const hasDaemon = async () => {
5562
+ try {
5563
+ let response = await fetch('http://127.0.0.1:1000/api/version');
5564
+ response = await response.json();
5565
+ return Boolean(response.client === '@peernet/api/http')
5566
+ } catch (e) {
5567
+ return false
5568
+ }
5569
+ };
5570
+
5571
+ const https = () => {
5572
+ if (!globalThis.location) return false;
5573
+ return Boolean(globalThis.location.protocol === 'https:')
5574
+ };
5575
+
5576
+ /**
5577
+ * Get current environment
5578
+ * @return {String} current environment [node, electron, browser]
5579
+ */
5580
+ const environment = () => {
5581
+ const _navigator = globalThis.navigator;
5582
+ if (!_navigator) {
5583
+ return 'node'
5584
+ } else if (_navigator && /electron/i.test(_navigator.userAgent)) {
5585
+ return 'electron'
5586
+ } else {
5587
+ return 'browser'
5588
+ }
5589
+ };
5590
+
5591
+ /**
5592
+ * * Get current environment
5593
+ * @return {Object} result
5594
+ * @property {Boolean} reult.daemon whether or not daemon is running
5595
+ * @property {Boolean} reult.environment Current environment
5596
+ */
5597
+ const target = async () => {
5598
+ let daemon = false;
5599
+ if (!https()) daemon = await hasDaemon();
5600
+
5601
+ return {daemon, environment: environment()}
5390
5602
  };
5391
5603
 
5392
- new Mutex();
5393
-
5394
- new Mutex();
5395
- /**
5396
- * Creates a new SHA-2 (SHA-512) hash instance
5397
- */
5398
- function createSHA512() {
5399
- return WASMInterface(wasmJson$9, 64).then((wasm) => {
5400
- wasm.init(512);
5401
- const obj = {
5402
- init: () => { wasm.init(512); return obj; },
5403
- update: (data) => { wasm.update(data); return obj; },
5404
- digest: (outputType) => wasm.digest(outputType),
5405
- save: () => wasm.save(),
5406
- load: (data) => { wasm.load(data); return obj; },
5407
- blockSize: 128,
5408
- digestSize: 64,
5409
- };
5410
- return obj;
5411
- });
5604
+ class PeerDiscovery {
5605
+ constructor(id) {
5606
+ this.id = id;
5607
+ }
5608
+
5609
+ _getPeerId(id) {
5610
+ if (!peernet.peerMap || peernet.peerMap && peernet.peerMap.size === 0) return false
5611
+
5612
+ for (const entry of [...peernet.peerMap.entries()]) {
5613
+ for (const _id of entry[1]) {
5614
+ if (_id === id) return entry[0]
5615
+ }
5616
+ }
5617
+ }
5618
+
5619
+ async discover(peer) {
5620
+ let id = this._getPeerId(peer.id);
5621
+ if (id) return id
5622
+ const data = await new peernet.protos['peernet-peer']({id: this.id});
5623
+ const node = await peernet.prepareMessage(peer.id, data.encoded);
5624
+
5625
+ let response = await peer.request(node.encoded);
5626
+ response = await protoFor(response);
5627
+ response = await new peernet.protos['peernet-peer-response'](response.decoded.data);
5628
+
5629
+ id = response.decoded.id;
5630
+ if (id === this.id) return;
5631
+
5632
+ if (!peernet.peerMap.has(id)) peernet.peerMap.set(id, [peer.id]);
5633
+ else {
5634
+ const connections = peernet.peerMap.get(id);
5635
+ if (connections.indexOf(peer.id) === -1) {
5636
+ connections.push(peer.id);
5637
+ peernet.peerMap.set(peer.id, connections);
5638
+ }
5639
+ }
5640
+ return id
5641
+ }
5642
+
5643
+ async discoverHandler(message, peer) {
5644
+ const {id, proto} = message;
5645
+ // if (typeof message.data === 'string') message.data = Buffer.from(message.data)
5646
+ if (proto.name === 'peernet-peer') {
5647
+ const from = proto.decoded.id;
5648
+ if (from === this.id) return;
5649
+
5650
+ if (!peernet.peerMap.has(from)) peernet.peerMap.set(from, [peer.id]);
5651
+ else {
5652
+ const connections = peernet.peerMap.get(from);
5653
+ if (connections.indexOf(peer.id) === -1) {
5654
+ connections.push(peer.id);
5655
+ peernet.peerMap.set(from, connections);
5656
+ }
5657
+ }
5658
+ const data = await new peernet.protos['peernet-peer-response']({id: this.id});
5659
+ const node = await peernet.prepareMessage(from, data.encoded);
5660
+
5661
+ peer.write(Buffer.from(JSON.stringify({id, data: node.encoded})));
5662
+ } else if (proto.name === 'peernet-peer-response') {
5663
+ const from = proto.decoded.id;
5664
+ if (from === this.id) return;
5665
+
5666
+ if (!peernet.peerMap.has(from)) peernet.peerMap.set(from, [peer.id]);
5667
+ else {
5668
+ const connections = peernet.peerMap.get(from);
5669
+ if (connections.indexOf(peer.id) === -1) {
5670
+ connections.push(peer.id);
5671
+ peernet.peerMap.set(from, connections);
5672
+ }
5673
+ }
5674
+ }
5675
+ }
5412
5676
  }
5413
5677
 
5414
- new Mutex();
5415
-
5416
- new Mutex();
5417
-
5418
- new Mutex();
5419
-
5420
- new Mutex();
5421
-
5422
- var name$4 = "ripemd160";
5423
- var data$4 = "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";
5424
- var hash$4 = "c089a7ca";
5425
- var wasmJson$4 = {
5426
- name: name$4,
5427
- data: data$4,
5428
- hash: hash$4
5429
- };
5430
-
5431
- new Mutex();
5432
5678
  /**
5433
- * Creates a new RIPEMD-160 hash instance
5679
+ * Keep history of fetched address and ptr
5680
+ * @property {Object} address
5681
+ * @property {Object} ptr
5434
5682
  */
5435
- function createRIPEMD160() {
5436
- return WASMInterface(wasmJson$4, 20).then((wasm) => {
5437
- wasm.init();
5438
- const obj = {
5439
- init: () => { wasm.init(); return obj; },
5440
- update: (data) => { wasm.update(data); return obj; },
5441
- digest: (outputType) => wasm.digest(outputType),
5442
- save: () => wasm.save(),
5443
- load: (data) => { wasm.load(data); return obj; },
5444
- blockSize: 64,
5445
- digestSize: 20,
5446
- };
5447
- return obj;
5448
- });
5449
- }
5450
-
5451
- function calculateKeyBuffer(hasher, key) {
5452
- const { blockSize } = hasher;
5453
- const buf = getUInt8Buffer(key);
5454
- if (buf.length > blockSize) {
5455
- hasher.update(buf);
5456
- const uintArr = hasher.digest('binary');
5457
- hasher.init();
5458
- return uintArr;
5683
+ const lastFetched = {
5684
+ address: {
5685
+ value: undefined,
5686
+ timestamp: 0,
5687
+ },
5688
+ ptr: {
5689
+ value: undefined,
5690
+ timestamp: 0,
5691
+ },
5692
+ };
5693
+ const fetchedCoordinates = {};
5694
+ const getAddress = async () => {
5695
+ const { address } = lastFetched;
5696
+ if (address) {
5697
+ address.value = await fetch('https://icanhazip.com/');
5698
+ address.value = await address.value.text();
5699
+ address.timestamp = Math.round(new Date().getTime() / 1000);
5700
+ lastFetched.address = address;
5459
5701
  }
5460
- return new Uint8Array(buf.buffer, buf.byteOffset, buf.length);
5461
- }
5462
- function calculateHmac(hasher, key) {
5463
- hasher.init();
5464
- const { blockSize } = hasher;
5465
- const keyBuf = calculateKeyBuffer(hasher, key);
5466
- const keyBuffer = new Uint8Array(blockSize);
5467
- keyBuffer.set(keyBuf);
5468
- const opad = new Uint8Array(blockSize);
5469
- for (let i = 0; i < blockSize; i++) {
5470
- const v = keyBuffer[i];
5471
- opad[i] = v ^ 0x5C;
5472
- keyBuffer[i] = v ^ 0x36;
5702
+ return address.value;
5703
+ };
5704
+ const degreesToRadians = (degrees) => {
5705
+ return degrees * Math.PI / 180;
5706
+ };
5707
+ const distanceInKmBetweenEarthCoordinates = (lat1, lon1, lat2, lon2) => {
5708
+ const earthRadiusKm = 6371;
5709
+ const dLat = degreesToRadians(lat2 - lat1);
5710
+ const dLon = degreesToRadians(lon2 - lon1);
5711
+ lat1 = degreesToRadians(lat1);
5712
+ lat2 = degreesToRadians(lat2);
5713
+ const a = Math.sin(dLat / 2) * Math.sin(dLat / 2) +
5714
+ Math.sin(dLon / 2) * Math.sin(dLon / 2) * Math.cos(lat1) * Math.cos(lat2);
5715
+ const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
5716
+ return earthRadiusKm * c;
5717
+ };
5718
+ class DhtEarth {
5719
+ providerMap = new Map;
5720
+ /**
5721
+ *
5722
+ */
5723
+ constructor() {
5724
+ this.providerMap = new Map();
5473
5725
  }
5474
- hasher.update(keyBuffer);
5475
- const obj = {
5476
- init: () => {
5477
- hasher.init();
5478
- hasher.update(keyBuffer);
5479
- return obj;
5480
- },
5481
- update: (data) => {
5482
- hasher.update(data);
5483
- return obj;
5484
- },
5485
- digest: ((outputType) => {
5486
- const uintArr = hasher.digest('binary');
5487
- hasher.init();
5488
- hasher.update(opad);
5489
- hasher.update(uintArr);
5490
- return hasher.digest(outputType);
5491
- }),
5492
- save: () => {
5493
- throw new Error('save() not supported');
5494
- },
5495
- load: () => {
5496
- throw new Error('load() not supported');
5497
- },
5498
- blockSize: hasher.blockSize,
5499
- digestSize: hasher.digestSize,
5500
- };
5501
- return obj;
5502
- }
5503
- /**
5504
- * Calculates HMAC hash
5505
- * @param hash Hash algorithm to use. It has to be the return value of a function like createSHA1()
5506
- * @param key Key (string, Buffer or TypedArray)
5507
- */
5508
- function createHMAC(hash, key) {
5509
- if (!hash || !hash.then) {
5510
- throw new Error('Invalid hash function is provided! Usage: createHMAC(createMD5(), "key").');
5726
+ async getCoordinates(address) {
5727
+ if (!fetchedCoordinates[address]) {
5728
+ const request = `https://whereis.leofcoin.org/?ip=${address}`;
5729
+ let response = await fetch(request);
5730
+ const { lat, lon } = await response.json();
5731
+ fetchedCoordinates[address] = { latitude: lat, longitude: lon };
5732
+ }
5733
+ return fetchedCoordinates[address];
5734
+ }
5735
+ /**
5736
+ * @param {Object} peer
5737
+ * @param {Object} provider
5738
+ * @return {Object} {provider, distance}
5739
+ */
5740
+ async getDistance(peer, provider) {
5741
+ const { latitude, longitude } = await this.getCoordinates(provider.address);
5742
+ return { provider, distance: distanceInKmBetweenEarthCoordinates(peer.latitude, peer.longitude, latitude, longitude) };
5743
+ }
5744
+ async closestPeer(providers) {
5745
+ let all = [];
5746
+ const address = await getAddress();
5747
+ const peerLoc = await this.getCoordinates(address);
5748
+ for (const provider of providers) {
5749
+ if (provider.address === '127.0.0.1' || provider.address === '::1')
5750
+ all.push({ provider, distance: 0 });
5751
+ else
5752
+ all.push(this.getDistance(peerLoc, provider));
5753
+ }
5754
+ // todo queue
5755
+ all = await Promise.all(all);
5756
+ all = all.sort((previous, current) => previous.distance - current.distance);
5757
+ return all[0].provider;
5758
+ }
5759
+ hasProvider(hash) {
5760
+ return this.providerMap.has(hash);
5761
+ }
5762
+ providersFor(hash) {
5763
+ let providers;
5764
+ if (this.providerMap.has(hash))
5765
+ providers = this.providerMap.get(hash);
5766
+ return providers;
5767
+ }
5768
+ addProvider(provider, hash) {
5769
+ let providers = {};
5770
+ if (this.providerMap.has(hash)) {
5771
+ providers = this.providerMap.get(hash);
5772
+ }
5773
+ providers[provider.address] = provider;
5774
+ this.providerMap.set(hash, providers);
5775
+ }
5776
+ removeProvider(address, hash) {
5777
+ if (this.providerMap.has(hash)) {
5778
+ const providers = this.providerMap.get(hash);
5779
+ delete providers[address];
5780
+ this.providerMap.set(hash, providers);
5781
+ }
5511
5782
  }
5512
- return hash.then((hasher) => calculateHmac(hasher, key));
5513
5783
  }
5514
5784
 
5515
- new Mutex();
5785
+ class MessageHandler {
5786
+ constructor(network) {
5787
+ this.network = network;
5788
+ }
5789
+ /**
5790
+ * hash and sign message
5791
+ *
5792
+ * @param {object} message
5793
+ * @param {Buffer} message.from peer id
5794
+ * @param {Buffer} message.to peer id
5795
+ * @param {string} message.data Peernet message
5796
+ * (PeernetMessage excluded) encoded as a string
5797
+ * @return message
5798
+ */
5799
+ async hashAndSignMessage(message) {
5800
+ const hash = await message.peernetHash;
5801
+ message.decoded.signature = globalThis.identity.sign(hash.buffer);
5802
+ return message
5803
+ }
5804
+
5805
+ /**
5806
+ * @param {String} from - peer id
5807
+ * @param {String} to - peer id
5808
+ * @param {String|PeernetMessage} data - data encoded message string
5809
+ * or the messageNode itself
5810
+ */
5811
+ async prepareMessage(message) {
5812
+ if (message.keys.includes('signature')) {
5813
+ message = await this.hashAndSignMessage(message);
5814
+ }
5815
+
5816
+ return message
5817
+ }
5818
+ }
5516
5819
 
5517
- new Mutex();
5820
+ const dataHandler = async message => {
5821
+ if (!message) return
5822
+
5823
+ const {data, id, from, peer} = message;
5824
+ const proto = await protoFor(data);
5825
+ peernet._protoHandler({id, proto}, peernet.connections[from] || peer, from);
5826
+ };
5518
5827
 
5519
- const blockchainCodecs = [
5520
- {
5521
- name: 'leofcoin-block',
5522
- codec: '0x6c62',
5523
- hashAlg: 'dbl-keccak-512',
5524
- },
5525
- {
5526
- name: 'leofcoin-tx',
5527
- codec: '0x6c74',
5528
- hashAlg: 'dbl-keccak-512',
5529
- },
5530
- {
5531
- name: 'leofcoin-itx',
5532
- codec: '0x6c69',
5533
- hashAlg: 'keccak-512',
5534
- },
5535
- {
5536
- name: 'leofcoin-pr',
5537
- codec: '0x6c70',
5538
- hashAlg: 'keccak-256',
5539
- },
5540
- {
5541
- name: 'contract-message',
5542
- codec: '0x63636d',
5543
- hashAlg: 'keccak-256'
5544
- },
5545
- {
5546
- name: 'transaction-message',
5547
- codec: '0x746d',
5548
- hashAlg: 'keccak-256'
5549
- },
5550
- {
5551
- name: 'raw-transaction-message',
5552
- codec: '0x772746d',
5553
- hashAlg: 'keccak-256'
5554
- },
5555
- {
5556
- name: 'block-message',
5557
- codec: '0x626d',
5558
- hashAlg: 'keccak-256'
5559
- },
5560
- {
5561
- name: 'bw-message',
5562
- codec: '0x62776d',
5563
- hashAlg: 'keccak-256'
5564
- },
5565
- {
5566
- name: 'bw-request-message',
5567
- codec: '0x6277726d',
5568
- hashAlg: 'keccak-256'
5569
- },
5570
- {
5571
- name: 'validator-message',
5572
- codec: '0x766d',
5573
- hashAlg: 'keccak-256'
5574
- }
5575
- ];
5828
+ const dhtError = (proto) => {
5829
+ const text = `Received proto ${proto.name} expected peernet-dht-response`;
5830
+ return new Error(`Routing error: ${text}`)
5831
+ };
5832
+
5833
+ const nothingFoundError = (hash) => {
5834
+ return new Error(`nothing found for ${hash}`)
5835
+ };
5576
5836
 
5577
- const internalCodecs = [
5578
- {
5579
- name: 'disco-hash',
5580
- codec: '0x30',
5581
- hashAlg: 'dbl-keccak-256',
5582
- },
5583
- {
5584
- name: 'peernet-peer-response',
5585
- codec: '0x707072',
5586
- hashAlg: 'keccak-256',
5587
- },
5588
- {
5589
- name: 'peernet-peer',
5590
- codec: '0x7070',
5591
- hashAlg: 'keccak-256',
5592
- },
5593
- {
5594
- name: 'peernet-dht',
5595
- codec: '0x706468',
5596
- hashAlg: 'keccak-256',
5597
- },
5598
- {
5599
- name: 'peernet-dht-response',
5600
- codec: '0x706472',
5601
- hashAlg: 'keccak-256',
5602
- },
5603
- {
5604
- name: 'peernet-data',
5605
- codec: '0x706461',
5606
- hashAlg: 'keccak-256',
5607
- },
5608
- {
5609
- name: 'peernet-data-response',
5610
- codec: '0x70646172',
5611
- hashAlg: 'keccak-256',
5612
- },
5613
- {
5614
- name: 'peernet-message',
5615
- codec: '0x706d65',
5616
- hashAlg: 'keccak-256',
5617
- },
5618
- {
5619
- name: 'peernet-ps',
5620
- codec: '707073',
5621
- hashAlg: 'keccak-256',
5622
- },
5623
- {
5624
- name: 'peernet-response',
5625
- codec: '0x7072',
5626
- hashAlg: 'keccak-256',
5627
- },
5628
- {
5629
- name: 'peernet-request',
5630
- codec: '0x707271',
5631
- hashAlg: 'keccak-256',
5632
- },
5633
- {
5634
- name: 'peernet-file',
5635
- codec: '0x7066',
5636
- hashAlg: 'keccak-256',
5637
- },
5638
- {
5639
- name: 'peernet-file-response',
5640
- codec: '0x706672',
5641
- hashAlg: 'keccak-256',
5837
+ const isBrowser = globalThis.navigator ? true : false;
5838
+ let LeofcoinStorage$1 = class LeofcoinStorage {
5839
+ name;
5840
+ root;
5841
+ db;
5842
+ constructor(name = 'storage', root = '.leofcoin') {
5843
+ this.name = name;
5844
+ this.root = root;
5642
5845
  }
5643
- ];
5644
-
5645
- var social = [{
5646
- name: 'chat-message',
5647
- codec: '0x70636d',
5648
- hashAlg: 'dbl-keccak-256',
5649
- }];
5650
-
5651
- const codecs = [
5652
- ...internalCodecs,
5653
- ...blockchainCodecs,
5654
- ...social
5655
- ];
5656
-
5657
- globalThis.peernetCodecs = globalThis.peernetCodecs || {};
5658
- const addCodec = (codecInput) => {
5659
- let { hashAlg, codec, name } = codecInput;
5660
- if (!globalThis.peernetCodecs[name])
5661
- globalThis.peernetCodecs[name] = {
5662
- hashAlg,
5663
- codec: typeof codec === 'string' ? parseInt(codec, 16) : codec
5664
- };
5665
- };
5666
- const getCodec = (name) => {
5667
- if (typeof name === 'number')
5668
- return name;
5669
- return getCodecByName(name).codec;
5670
- };
5671
- const getCodecName = (codec) => {
5672
- return Object.keys(globalThis.peernetCodecs).reduce((p, c) => {
5673
- const item = globalThis.peernetCodecs[c];
5674
- if (item.codec === codec)
5675
- return c;
5676
- else
5677
- return p;
5678
- }, undefined);
5679
- };
5680
- const getCodecByName = (name) => globalThis.peernetCodecs[name];
5681
- const getHashAlg = (name) => {
5682
- if (typeof name === 'number')
5683
- return getCodecByName(getCodecName(name)).hashAlg;
5684
- return getCodecByName(name).hashAlg;
5685
- };
5686
- const isCodec = (codec) => {
5687
- if (codec.codec !== undefined && codec.hashAlg)
5688
- return true;
5689
- return false;
5690
- };
5691
- const validateCodec = (codec) => {
5692
- if (codec.codec === undefined ||
5693
- codec.hashAlg === undefined ||
5694
- codec.name === undefined)
5695
- throw new Error(`invalid codecInput: ${codec}`);
5696
- };
5697
- for (const codec of codecs) {
5698
- addCodec(codec);
5699
- }
5700
- var utils$p = {
5701
- isCodec,
5702
- addCodec,
5703
- getCodec,
5704
- getHashAlg,
5705
- getCodecName,
5706
- validateCodec,
5707
- codecs: globalThis.peernetCodecs
5708
- };
5709
-
5710
- let Codec$1 = class Codec extends BasicInterface {
5711
- codecBuffer;
5712
- codec;
5713
- hashAlg;
5714
- constructor(buffer) {
5715
- super();
5716
- if (buffer) {
5717
- if (buffer instanceof Uint8Array) {
5718
- const codec = index$8.decode(buffer);
5719
- const name = this.getCodecName(codec);
5720
- if (name) {
5721
- this.name = name;
5722
- this.encoded = buffer;
5723
- this.decode(buffer);
5724
- }
5725
- else {
5726
- this.encode(Number(new TextDecoder().decode(buffer)));
5727
- }
5728
- }
5729
- else if (buffer instanceof ArrayBuffer) {
5730
- const codec = index$8.decode(new Uint8Array(buffer));
5731
- const name = this.getCodecName(codec);
5732
- if (name) {
5733
- this.name = name;
5734
- this.decode(buffer);
5735
- }
5736
- else {
5737
- this.encode(Number(new TextDecoder().decode(new Uint8Array(buffer))));
5738
- }
5739
- }
5740
- else if (typeof buffer === 'string') {
5741
- if (utils$p.getCodec(buffer))
5742
- this.fromName(buffer);
5743
- else if (this.isHex(buffer))
5744
- this.fromHex(buffer);
5745
- else if (this.isBase32(buffer))
5746
- this.fromBs32(buffer);
5747
- else if (this.isBase58(buffer))
5748
- this.fromBs58(buffer);
5749
- else
5750
- this.fromString(buffer);
5751
- }
5752
- if (!isNaN(buffer))
5753
- if (utils$p.getCodec(buffer))
5754
- this.fromCodec(buffer);
5846
+ async init() {
5847
+ const importee = await import(isBrowser ? './browser-store.js' : './store.js');
5848
+ this.db = new importee.default();
5849
+ if (!isBrowser) {
5850
+ // @ts-ignore
5851
+ await this.db.init(this.name, this.root);
5755
5852
  }
5756
5853
  }
5757
- fromEncoded(encoded) {
5758
- const codec = index$8.decode(encoded);
5759
- const name = this.getCodecName(codec);
5760
- this.name = name;
5761
- this.encoded = encoded;
5762
- return this.decode(encoded);
5763
- }
5764
- getCodec(name) {
5765
- return utils$p.getCodec(name);
5854
+ async get(key) {
5855
+ if (typeof key === 'object')
5856
+ return this.many('get', key);
5857
+ return this.db.get(new KeyPath(key));
5766
5858
  }
5767
- getCodecName(codec) {
5768
- return utils$p.getCodecName(codec);
5859
+ /**
5860
+ *
5861
+ * @param {*} key
5862
+ * @param {*} value
5863
+ * @returns Promise
5864
+ */
5865
+ put(key, value) {
5866
+ if (typeof key === 'object')
5867
+ return this.many('put', key);
5868
+ return this.db.put(new KeyPath(key), new KeyValue(value));
5769
5869
  }
5770
- getHashAlg(name) {
5771
- return utils$p.getHashAlg(name);
5870
+ async has(key) {
5871
+ if (typeof key === 'object')
5872
+ return this.many('has', key);
5873
+ try {
5874
+ const has = await this.db.get(new KeyPath(key));
5875
+ return Boolean(has);
5876
+ }
5877
+ catch (e) {
5878
+ return false;
5879
+ }
5772
5880
  }
5773
- fromCodec(codec) {
5774
- this.name = this.getCodecName(codec);
5775
- this.hashAlg = this.getHashAlg(this.name);
5776
- this.codec = this.getCodec(this.name);
5777
- this.codecBuffer = index$8.encode(this.codec);
5881
+ async delete(key) {
5882
+ return this.db.delete(new KeyPath(key));
5778
5883
  }
5779
- fromName(name) {
5780
- const codec = this.getCodec(name);
5781
- this.name = name;
5782
- this.codec = codec;
5783
- this.hashAlg = this.getHashAlg(name);
5784
- this.codecBuffer = index$8.encode(this.codec);
5884
+ keys(limit = -1) {
5885
+ return this.db.keys(limit);
5785
5886
  }
5786
- decode(encoded) {
5787
- encoded = encoded || this.encoded;
5788
- const codec = index$8.decode(encoded);
5789
- this.fromCodec(codec);
5790
- return this.decoded;
5887
+ async values(limit = -1) {
5888
+ return this.db.values(limit);
5791
5889
  }
5792
- encode(codec) {
5793
- codec = codec || this.codec;
5794
- this.encoded = index$8.encode(codec);
5795
- return this.encoded;
5890
+ async many(type, _value) {
5891
+ const jobs = [];
5892
+ for (const key of Object.keys(_value)) {
5893
+ jobs.push(this[type](key, _value[key]));
5894
+ }
5895
+ return Promise.all(jobs);
5796
5896
  }
5797
- };
5798
-
5799
- class CodecHash extends BasicInterface {
5800
- codec;
5801
- codecs;
5802
- digest;
5803
- size;
5804
- constructor(buffer, options) {
5805
- super();
5806
- if (options.name)
5807
- this.name = options.name;
5808
- else
5809
- this.name = 'disco-hash';
5810
- if (options.codecs)
5811
- this.codecs = options.codecs;
5812
- // @ts-ignore
5813
- return this.init(buffer);
5897
+ async length() {
5898
+ const keys = await this.keys();
5899
+ return keys.length;
5814
5900
  }
5815
- async init(uint8Array) {
5816
- if (uint8Array) {
5817
- if (uint8Array instanceof Uint8Array) {
5818
- this.codec = new Codec$1(uint8Array);
5819
- const name = this.codec.name;
5820
- if (name) {
5821
- this.name = name;
5822
- this.decode(uint8Array);
5823
- }
5824
- else {
5825
- await this.encode(uint8Array);
5826
- }
5827
- }
5828
- if (typeof uint8Array === 'string') {
5829
- if (this.isHex(uint8Array))
5830
- await this.fromHex(uint8Array);
5831
- if (this.isBase32(uint8Array))
5832
- await this.fromBs32(uint8Array);
5833
- else if (this.isBase58(uint8Array))
5834
- await this.fromBs58(uint8Array);
5835
- else
5836
- throw new Error(`unsupported string ${uint8Array}`);
5837
- }
5838
- else if (typeof uint8Array === 'object')
5839
- await this.fromJSON(uint8Array);
5901
+ async size() {
5902
+ let size = 0;
5903
+ const query = await this.db.iterate();
5904
+ for await (const item of query) {
5905
+ // @ts-ignore
5906
+ size += item.value ? item.value.length : item[1].length;
5840
5907
  }
5841
- return this;
5842
- }
5843
- get prefix() {
5844
- const length = this.length;
5845
- const uint8Array = new Uint8Array(length.length + this.codec.codecBuffer.length);
5846
- uint8Array.set(length);
5847
- uint8Array.set(this.codec.codecBuffer, length.length);
5848
- return uint8Array;
5908
+ return size;
5849
5909
  }
5850
- get length() {
5851
- return index$8.encode(this.size);
5910
+ async clear() {
5911
+ return this.db.clear();
5852
5912
  }
5853
- get buffer() {
5854
- return this.encoded;
5913
+ async iterate() {
5914
+ return this.db.iterate();
5855
5915
  }
5856
- get hash() {
5857
- return this.encoded;
5858
- }
5859
- fromJSON(json) {
5860
- return this.encode(new TextEncoder().encode(JSON.stringify(json)));
5861
- }
5862
- async encode(buffer, name) {
5863
- if (!this.name && name)
5864
- this.name = name;
5865
- if (!buffer)
5866
- buffer = this.buffer;
5867
- this.codec = new Codec$1(this.name);
5868
- this.codec.fromName(this.name);
5869
- let hashAlg = this.codec.hashAlg;
5870
- const hashVariant = Number(hashAlg.split('-')[hashAlg.split('-').length - 1]);
5871
- if (hashAlg.includes('dbl')) {
5872
- hashAlg = hashAlg.replace('dbl-', '');
5873
- const hasher = await createKeccak(hashVariant);
5874
- await hasher.init();
5875
- hasher.update(buffer);
5876
- buffer = hasher.digest('binary');
5877
- }
5878
- const hasher = await createKeccak(hashVariant);
5879
- await hasher.init();
5880
- hasher.update(buffer);
5881
- this.digest = hasher.digest('binary');
5882
- this.size = this.digest.length;
5883
- const uint8Array = new Uint8Array(this.digest.length + this.prefix.length);
5884
- uint8Array.set(this.prefix);
5885
- uint8Array.set(this.digest, this.prefix.length);
5886
- this.encoded = uint8Array;
5887
- return this.encoded;
5888
- }
5889
- async validate(buffer) {
5890
- if (Buffer.isBuffer(buffer)) {
5891
- const codec = index$8.decode(buffer);
5892
- if (this.codecs[codec]) {
5893
- this.decode(buffer);
5894
- }
5895
- else {
5896
- await this.encode(buffer);
5897
- }
5898
- }
5899
- if (typeof buffer === 'string') {
5900
- if (this.isHex(buffer))
5901
- this.fromHex(buffer);
5902
- if (this.isBase32(buffer))
5903
- this.fromBs32(buffer);
5904
- }
5905
- if (typeof buffer === 'object')
5906
- this.fromJSON(buffer);
5907
- }
5908
- decode(encoded) {
5909
- this.encoded = encoded;
5910
- const codec = index$8.decode(encoded);
5911
- this.codec = new Codec$1(codec);
5912
- // TODO: validate codec
5913
- encoded = encoded.slice(index$8.decode.bytes);
5914
- this.size = index$8.decode(encoded);
5915
- this.digest = encoded.slice(index$8.decode.bytes);
5916
- if (this.digest.length !== this.size) {
5917
- throw new Error(`hash length inconsistent: ${this.encoded.toString()}`);
5918
- }
5919
- // const codec = new Codec(codec, this.codecs)
5920
- this.name = this.codec.name;
5921
- this.size = this.digest.length;
5922
- return {
5923
- codec: this.codec,
5924
- name: this.name,
5925
- size: this.size,
5926
- length: this.length,
5927
- digest: this.digest,
5928
- };
5929
- }
5930
- }
5931
-
5932
- let FormatInterface$1 = class FormatInterface extends BasicInterface {
5933
- hashFormat;
5934
- init(buffer) {
5935
- if (buffer instanceof Uint8Array)
5936
- this.fromUint8Array(buffer);
5937
- else if (buffer instanceof ArrayBuffer)
5938
- this.fromArrayBuffer(buffer);
5939
- else if (buffer instanceof FormatInterface && buffer?.name === this.name)
5940
- return buffer;
5941
- else if (typeof buffer === 'string') {
5942
- if (this.isHex(buffer))
5943
- this.fromHex(buffer);
5944
- else if (this.isBase58(buffer))
5945
- this.fromBs58(buffer);
5946
- else if (this.isBase32(buffer))
5947
- this.fromBs32(buffer);
5948
- else
5949
- this.fromString(buffer);
5950
- }
5951
- else {
5952
- this.create(buffer);
5953
- }
5954
- return this;
5955
- }
5956
- hasCodec() {
5957
- if (!this.encoded)
5958
- return false;
5959
- const codec = new Codec$1(this.encoded);
5960
- if (codec.name)
5961
- return true;
5962
- }
5963
- decode(encoded) {
5964
- encoded = encoded || this.encoded;
5965
- const codec = new Codec$1(this.encoded);
5966
- if (codec.codecBuffer) {
5967
- encoded = encoded.slice(codec.codecBuffer.length);
5968
- this.name = codec.name;
5969
- this.decoded = this.protoDecode(encoded);
5970
- // try {
5971
- // this.decoded = JSON.parse(this.decoded)
5972
- // } catch {
5973
- // }
5974
- }
5975
- else {
5976
- throw new Error(`no codec found`);
5977
- }
5978
- return this.decoded;
5979
- }
5980
- encode(decoded) {
5981
- let encoded;
5982
- if (!decoded)
5983
- decoded = this.decoded;
5984
- const codec = new Codec$1(this.name);
5985
- if (decoded instanceof Uint8Array)
5986
- encoded = decoded;
5987
- else
5988
- encoded = this.protoEncode(decoded);
5989
- if (codec.codecBuffer) {
5990
- const uint8Array = new Uint8Array(encoded.length + codec.codecBuffer.length);
5991
- uint8Array.set(codec.codecBuffer);
5992
- uint8Array.set(encoded, codec.codecBuffer.length);
5993
- this.encoded = uint8Array;
5994
- }
5995
- else {
5996
- throw new Error(`invalid codec`);
5997
- }
5998
- return this.encoded;
5999
- }
6000
- /**
6001
- * @param {Buffer|String|Object} buffer - data - The data needed to create the desired message
6002
- * @param {Object} proto - {protoObject}
6003
- * @param {Object} options - {hashFormat, name}
6004
- */
6005
- constructor(buffer, proto, options) {
6006
- super();
6007
- this.proto = proto;
6008
- this.hashFormat = options?.hashFormat ? options.hashFormat : 'bs32';
6009
- if (options?.name)
6010
- this.name = options.name;
6011
- this.init(buffer);
6012
- }
6013
- /**
6014
- * @return {PeernetHash}
6015
- */
6016
- get peernetHash() {
6017
- return new CodecHash(this.decoded, { name: this.name });
6018
- }
6019
- /**
6020
- * @return {peernetHash}
6021
- */
6022
- async hash() {
6023
- const upper = this.hashFormat.charAt(0).toUpperCase();
6024
- const format = `${upper}${this.hashFormat.substring(1, this.hashFormat.length)}`;
6025
- return (await this.peernetHash)[`to${format}`]();
6026
- }
6027
- fromUint8Array(buffer) {
6028
- this.encoded = buffer;
6029
- return this.hasCodec() ? this.decode() : this.create(JSON.parse(new TextDecoder().decode(this.encoded)));
6030
- }
6031
- fromArrayBuffer(buffer) {
6032
- this.encoded = new Uint8Array(buffer, buffer.byteOffset, buffer.byteLength);
6033
- return this.hasCodec() ? this.decode() : this.create(JSON.parse(new TextDecoder().decode(this.encoded)));
6034
- }
6035
- /**
6036
- * @param {Object} data
6037
- */
6038
- create(data) {
6039
- const decoded = {};
6040
- if (this.keys?.length > 0) {
6041
- for (const key of this.keys) {
6042
- decoded[key] = data[key];
6043
- }
6044
- this.decoded = decoded;
6045
- return this.encode(decoded);
6046
- }
6047
- }
6048
- };
6049
-
6050
- const FormatInterface = FormatInterface$1;
6051
- const Codec = Codec$1;
6052
-
6053
- const BufferToUint8Array = data => {
6054
- if (data.type === 'Buffer') {
6055
- data = new Uint8Array(data.data);
6056
- }
6057
- return data
6058
- };
6059
-
6060
- const protoFor = (message) => {
6061
- const codec = new Codec(message);
6062
- if (!codec.name) throw new Error('proto not found')
6063
- const Proto = globalThis.peernet.protos[codec.name];
6064
- if (!Proto) throw (new Error(`No proto defined for ${codec.name}`))
6065
- return new Proto(message)
6066
5916
  };
6067
5917
 
6068
- /**
6069
- * wether or not a peernet daemon is active
6070
- * @return {Boolean}
6071
- */
6072
- const hasDaemon = async () => {
6073
- try {
6074
- let response = await fetch('http://127.0.0.1:1000/api/version');
6075
- response = await response.json();
6076
- return Boolean(response.client === '@peernet/api/http')
6077
- } catch (e) {
6078
- return false
6079
- }
6080
- };
5918
+ const randombytes = strength => crypto.getRandomValues(new Uint8Array(strength));
6081
5919
 
6082
- const https = () => {
6083
- if (!globalThis.location) return false;
6084
- return Boolean(globalThis.location.protocol === 'https:')
6085
- };
5920
+ const {subtle} = crypto;
6086
5921
 
6087
5922
  /**
6088
- * Get current environment
6089
- * @return {String} current environment [node, electron, browser]
5923
+ * ```js
5924
+ * const {createHash} = await import('@leofcoin/crypto')
5925
+ * createHash(data, algorithm)
5926
+ * ```
5927
+ * @param {Uint8Array} data
5928
+ * @param {string} algorithm
5929
+ * @returns Uint8Array
6090
5930
  */
6091
- const environment = () => {
6092
- const _navigator = globalThis.navigator;
6093
- if (!_navigator) {
6094
- return 'node'
6095
- } else if (_navigator && /electron/i.test(_navigator.userAgent)) {
6096
- return 'electron'
6097
- } else {
6098
- return 'browser'
6099
- }
6100
- };
5931
+ const createHash = (data, algorithm = 'SHA-512') => subtle.digest(algorithm, data);
6101
5932
 
6102
5933
  /**
6103
- * * Get current environment
6104
- * @return {Object} result
6105
- * @property {Boolean} reult.daemon whether or not daemon is running
6106
- * @property {Boolean} reult.environment Current environment
5934
+ * Hashes the created hash again
5935
+ * ```js
5936
+ * const {createDoubleHash} = await import('@leofcoin/crypto')
5937
+ * createDoubleHash(data, algorithm)
5938
+ * ```
5939
+ * @param {Uint8Array} data
5940
+ * @param {string} algorithm
5941
+ * @returns Uint8Array
6107
5942
  */
6108
- const target = async () => {
6109
- let daemon = false;
6110
- if (!https()) daemon = await hasDaemon();
5943
+ const createDoubleHash = async (data, algorithm = 'SHA-512') =>
5944
+ subtle.digest(algorithm, await subtle.digest(algorithm, data));
6111
5945
 
6112
- return {daemon, environment: environment()}
5946
+ const generatePbkdf2 = async (password) => {
5947
+ return subtle.importKey(
5948
+ 'raw',
5949
+ password,
5950
+ 'PBKDF2',
5951
+ false,
5952
+ ['deriveBits']
5953
+ )
6113
5954
  };
6114
5955
 
6115
- class PeerDiscovery {
6116
- constructor(id) {
6117
- this.id = id;
6118
- }
5956
+ const pbkdf2 = async (password, salt, iterations = 4096, length = 64, hash = 'SHA-512') => {
5957
+ const key = await generatePbkdf2(password);
5958
+ return subtle.deriveBits({
5959
+ name: 'PBKDF2',
5960
+ hash,
5961
+ salt,
5962
+ iterations,
5963
+ }, key, length)
5964
+ };
6119
5965
 
6120
- _getPeerId(id) {
6121
- if (!peernet.peerMap || peernet.peerMap && peernet.peerMap.size === 0) return false
5966
+ var typedArrayConcat = (input, options = {length: undefined, seperator: undefined}) => {
5967
+ if (!options) options = {};
5968
+
5969
+ if (typeof options.seperator === 'string')
5970
+ options.seperator = new TextEncoder().encode(options.seperator);
5971
+
5972
+ const length = options.length || input.reduce((total, current, i) => {
5973
+ total += current.length;
5974
+ if (options.seperator && input.length - 1 > i) total+= options.seperator.length;
5975
+ return total
5976
+ }, 0);
5977
+
5978
+ const typedArray = new Uint8Array(length);
5979
+
5980
+ let currentIndex = 0;
5981
+ let index = 0;
5982
+ for (const source of input) {
5983
+ typedArray.set(source, currentIndex);
5984
+ if (options.seperator && input.length - 1 > index) {
5985
+ typedArray.set(options.seperator, currentIndex + source.length);
5986
+ currentIndex+= options.seperator.length;
5987
+ }
5988
+ currentIndex += source.length;
5989
+ index += 1;
5990
+ }
5991
+
5992
+ return typedArray
5993
+ };
6122
5994
 
6123
- for (const entry of [...peernet.peerMap.entries()]) {
6124
- for (const _id of entry[1]) {
6125
- if (_id === id) return entry[0]
6126
- }
6127
- }
6128
- }
6129
-
6130
- async discover(peer) {
6131
- let id = this._getPeerId(peer.id);
6132
- if (id) return id
6133
- const data = await new peernet.protos['peernet-peer']({id: this.id});
6134
- const node = await peernet.prepareMessage(peer.id, data.encoded);
6135
-
6136
- let response = await peer.request(node.encoded);
6137
- response = await protoFor(response);
6138
- response = await new peernet.protos['peernet-peer-response'](response.decoded.data);
6139
-
6140
- id = response.decoded.id;
6141
- if (id === this.id) return;
6142
-
6143
- if (!peernet.peerMap.has(id)) peernet.peerMap.set(id, [peer.id]);
6144
- else {
6145
- const connections = peernet.peerMap.get(id);
6146
- if (connections.indexOf(peer.id) === -1) {
6147
- connections.push(peer.id);
6148
- peernet.peerMap.set(peer.id, connections);
6149
- }
6150
- }
6151
- return id
6152
- }
6153
-
6154
- async discoverHandler(message, peer) {
6155
- const {id, proto} = message;
6156
- // if (typeof message.data === 'string') message.data = Buffer.from(message.data)
6157
- if (proto.name === 'peernet-peer') {
6158
- const from = proto.decoded.id;
6159
- if (from === this.id) return;
6160
-
6161
- if (!peernet.peerMap.has(from)) peernet.peerMap.set(from, [peer.id]);
6162
- else {
6163
- const connections = peernet.peerMap.get(from);
6164
- if (connections.indexOf(peer.id) === -1) {
6165
- connections.push(peer.id);
6166
- peernet.peerMap.set(from, connections);
6167
- }
6168
- }
6169
- const data = await new peernet.protos['peernet-peer-response']({id: this.id});
6170
- const node = await peernet.prepareMessage(from, data.encoded);
6171
-
6172
- peer.write(Buffer.from(JSON.stringify({id, data: node.encoded})));
6173
- } else if (proto.name === 'peernet-peer-response') {
6174
- const from = proto.decoded.id;
6175
- if (from === this.id) return;
6176
-
6177
- if (!peernet.peerMap.has(from)) peernet.peerMap.set(from, [peer.id]);
6178
- else {
6179
- const connections = peernet.peerMap.get(from);
6180
- if (connections.indexOf(peer.id) === -1) {
6181
- connections.push(peer.id);
6182
- peernet.peerMap.set(from, connections);
6183
- }
6184
- }
6185
- }
6186
- }
6187
- }
5995
+ const concatAndDoubleHash = async (input) => {
5996
+ return new Uint8Array(await createDoubleHash(typedArrayConcat(input), 'SHA-256'));
5997
+ };
5998
+
5999
+ const encode$2 = async (source, prefix = new TextEncoder().encode('00'), hex) => {
6000
+ if (!(source instanceof Uint8Array) || !(prefix instanceof Uint8Array)) {
6001
+ throw new TypeError('Expected Uint8Array');
6002
+ }
6003
+ const hash = await concatAndDoubleHash([
6004
+ prefix,
6005
+ source
6006
+ ]);
6007
+ const uint8Array = typedArrayConcat([
6008
+ prefix,
6009
+ source,
6010
+ hash.subarray(0, 4)
6011
+ ]);
6012
+ if (hex)
6013
+ return base58$1.encodeHex(uint8Array);
6014
+ return base58$1.encode(uint8Array);
6015
+ };
6016
+ const decode$3 = async (string, hex) => {
6017
+ let uint8Array = hex ? base58$1.decodeHex(string) : base58$1.decode(string);
6018
+ const prefix = uint8Array.subarray(0, 2);
6019
+ const source = uint8Array.subarray(2, -4);
6020
+ const hash = await concatAndDoubleHash([
6021
+ prefix,
6022
+ source
6023
+ ]);
6024
+ let index = 0;
6025
+ const slice = uint8Array.subarray(-4);
6026
+ for (const check of slice) {
6027
+ if (check !== hash[index]) {
6028
+ throw new Error('Invalid checksum');
6029
+ }
6030
+ index++;
6031
+ }
6032
+ return { prefix, data: source };
6033
+ };
6034
+ const isBase58check = (string, hex) => {
6035
+ try {
6036
+ hex ? decode$3(string, true) : decode$3(string);
6037
+ return true;
6038
+ }
6039
+ catch (e) {
6040
+ return false;
6041
+ }
6042
+ };
6043
+ const encodeHex = (uint8Array, prefix = new TextEncoder().encode('00')) => encode$2(uint8Array, prefix, true);
6044
+ const decodeHex = (string) => decode$3(string, true);
6045
+ const isBase58checkHex = (string) => isBase58check(string, true);
6046
+ var base58check = { encode: encode$2, decode: decode$3, encodeHex, decodeHex, isBase58check, isBase58checkHex };
6188
6047
 
6189
- /**
6190
- * Keep history of fetched address and ptr
6191
- * @property {Object} address
6192
- * @property {Object} ptr
6193
- */
6194
- const lastFetched = {
6195
- address: {
6196
- value: undefined,
6197
- timestamp: 0,
6198
- },
6199
- ptr: {
6200
- value: undefined,
6201
- timestamp: 0,
6202
- },
6203
- };
6204
- const fetchedCoordinates = {};
6205
- const getAddress = async () => {
6206
- const { address } = lastFetched;
6207
- if (address) {
6208
- address.value = await fetch('https://icanhazip.com/');
6209
- address.value = await address.value.text();
6210
- address.timestamp = Math.round(new Date().getTime() / 1000);
6211
- lastFetched.address = address;
6212
- }
6213
- return address.value;
6214
- };
6215
- const degreesToRadians = (degrees) => {
6216
- return degrees * Math.PI / 180;
6048
+ const decode$2 = (multiWif, expectedVersion, expectedCodec) => {
6049
+ const decoded = base58$1.decode(multiWif);
6050
+ let [version, codec, privateKey] = index$6(decoded);
6051
+ version = Number(new TextDecoder().decode(version));
6052
+ codec = Number(new TextDecoder().decode(codec));
6053
+ if (expectedVersion && version !== expectedVersion)
6054
+ throw new Error(`invalid version: expected ${expectedVersion} but got ${version}`);
6055
+ if (expectedCodec && codec !== expectedCodec)
6056
+ throw new Error(`invalid codec: expected ${expectedCodec} but got ${codec}`);
6057
+ return { version, codec, privateKey };
6058
+ };
6059
+ var index$1 = {
6060
+ encode: (version, codec, privateKey) => {
6061
+ return base58$1.encode(index$7([
6062
+ new TextEncoder().encode(version.toString()),
6063
+ new TextEncoder().encode(codec.toString()),
6064
+ privateKey
6065
+ ]));
6066
+ },
6067
+ decode: decode$2,
6068
+ isMultiWif: (multiWif) => {
6069
+ try {
6070
+ const { version, codec, privateKey } = decode$2(multiWif);
6071
+ if (version === undefined)
6072
+ return false;
6073
+ if (codec === undefined)
6074
+ return false;
6075
+ if (privateKey === undefined)
6076
+ return false;
6077
+ if (privateKey && privateKey.length !== 32)
6078
+ return false;
6079
+ }
6080
+ catch {
6081
+ return false;
6082
+ }
6083
+ return true;
6084
+ }
6217
6085
  };
6218
- const distanceInKmBetweenEarthCoordinates = (lat1, lon1, lat2, lon2) => {
6219
- const earthRadiusKm = 6371;
6220
- const dLat = degreesToRadians(lat2 - lat1);
6221
- const dLon = degreesToRadians(lon2 - lon1);
6222
- lat1 = degreesToRadians(lat1);
6223
- lat2 = degreesToRadians(lat2);
6224
- const a = Math.sin(dLat / 2) * Math.sin(dLat / 2) +
6225
- Math.sin(dLon / 2) * Math.sin(dLon / 2) * Math.cos(lat1) * Math.cos(lat2);
6226
- const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
6227
- return earthRadiusKm * c;
6086
+
6087
+ const errors = {
6088
+ IMPOSSIBLE_CASE: 'Impossible case. Please create issue.',
6089
+ TWEAK_ADD:
6090
+ 'The tweak was out of range or the resulted private key is invalid',
6091
+ TWEAK_MUL: 'The tweak was out of range or equal to zero',
6092
+ CONTEXT_RANDOMIZE_UNKNOW: 'Unknow error on context randomization',
6093
+ SECKEY_INVALID: 'Private Key is invalid',
6094
+ PUBKEY_PARSE: 'Public Key could not be parsed',
6095
+ PUBKEY_SERIALIZE: 'Public Key serialization error',
6096
+ PUBKEY_COMBINE: 'The sum of the public keys is not valid',
6097
+ SIG_PARSE: 'Signature could not be parsed',
6098
+ SIGN: 'The nonce generation function failed, or the private key was invalid',
6099
+ RECOVER: 'Public key could not be recover',
6100
+ ECDH: 'Scalar was invalid (zero or overflow)'
6228
6101
  };
6229
- class DhtEarth {
6230
- providerMap = new Map;
6231
- /**
6232
- *
6233
- */
6234
- constructor() {
6235
- this.providerMap = new Map();
6236
- }
6237
- async getCoordinates(address) {
6238
- if (!fetchedCoordinates[address]) {
6239
- const request = `https://whereis.leofcoin.org/?ip=${address}`;
6240
- let response = await fetch(request);
6241
- const { lat, lon } = await response.json();
6242
- fetchedCoordinates[address] = { latitude: lat, longitude: lon };
6243
- }
6244
- return fetchedCoordinates[address];
6245
- }
6246
- /**
6247
- * @param {Object} peer
6248
- * @param {Object} provider
6249
- * @return {Object} {provider, distance}
6250
- */
6251
- async getDistance(peer, provider) {
6252
- const { latitude, longitude } = await this.getCoordinates(provider.address);
6253
- return { provider, distance: distanceInKmBetweenEarthCoordinates(peer.latitude, peer.longitude, latitude, longitude) };
6254
- }
6255
- async closestPeer(providers) {
6256
- let all = [];
6257
- const address = await getAddress();
6258
- const peerLoc = await this.getCoordinates(address);
6259
- for (const provider of providers) {
6260
- if (provider.address === '127.0.0.1' || provider.address === '::1')
6261
- all.push({ provider, distance: 0 });
6262
- else
6263
- all.push(this.getDistance(peerLoc, provider));
6264
- }
6265
- // todo queue
6266
- all = await Promise.all(all);
6267
- all = all.sort((previous, current) => previous.distance - current.distance);
6268
- return all[0].provider;
6269
- }
6270
- hasProvider(hash) {
6271
- return this.providerMap.has(hash);
6272
- }
6273
- providersFor(hash) {
6274
- let providers;
6275
- if (this.providerMap.has(hash))
6276
- providers = this.providerMap.get(hash);
6277
- return providers;
6278
- }
6279
- addProvider(provider, hash) {
6280
- let providers = {};
6281
- if (this.providerMap.has(hash)) {
6282
- providers = this.providerMap.get(hash);
6283
- }
6284
- providers[provider.address] = provider;
6285
- this.providerMap.set(hash, providers);
6286
- }
6287
- removeProvider(address, hash) {
6288
- if (this.providerMap.has(hash)) {
6289
- const providers = this.providerMap.get(hash);
6290
- delete providers[address];
6291
- this.providerMap.set(hash, providers);
6292
- }
6293
- }
6102
+
6103
+ function assert$g (cond, msg) {
6104
+ if (!cond) throw new Error(msg)
6294
6105
  }
6295
6106
 
6296
- class MessageHandler {
6297
- constructor(network) {
6298
- this.network = network;
6299
- }
6300
- /**
6301
- * hash and sign message
6302
- *
6303
- * @param {object} message
6304
- * @param {Buffer} message.from peer id
6305
- * @param {Buffer} message.to peer id
6306
- * @param {string} message.data Peernet message
6307
- * (PeernetMessage excluded) encoded as a string
6308
- * @return message
6309
- */
6310
- async hashAndSignMessage(message) {
6311
- const hash = await message.peernetHash;
6312
- message.decoded.signature = globalThis.identity.sign(hash.buffer);
6313
- return message
6314
- }
6107
+ function isUint8Array (name, value, length) {
6108
+ assert$g(value instanceof Uint8Array, `Expected ${name} to be an Uint8Array`);
6315
6109
 
6316
- /**
6317
- * @param {String} from - peer id
6318
- * @param {String} to - peer id
6319
- * @param {String|PeernetMessage} data - data encoded message string
6320
- * or the messageNode itself
6321
- */
6322
- async prepareMessage(message) {
6323
- if (message.keys.includes('signature')) {
6324
- message = await this.hashAndSignMessage(message);
6110
+ if (length !== undefined) {
6111
+ if (Array.isArray(length)) {
6112
+ const numbers = length.join(', ');
6113
+ const msg = `Expected ${name} to be an Uint8Array with length [${numbers}]`;
6114
+ assert$g(length.includes(value.length), msg);
6115
+ } else {
6116
+ const msg = `Expected ${name} to be an Uint8Array with length ${length}`;
6117
+ assert$g(value.length === length, msg);
6325
6118
  }
6326
-
6327
- return message
6328
6119
  }
6329
6120
  }
6330
6121
 
6331
- const dataHandler = async message => {
6332
- if (!message) return
6333
-
6334
- const {data, id, from, peer} = message;
6335
- const proto = await protoFor(data);
6336
- peernet._protoHandler({id, proto}, peernet.connections[from] || peer, from);
6337
- };
6122
+ function isCompressed (value) {
6123
+ assert$g(toTypeString(value) === 'Boolean', 'Expected compressed to be a Boolean');
6124
+ }
6338
6125
 
6339
- const dhtError = (proto) => {
6340
- const text = `Received proto ${proto.name} expected peernet-dht-response`;
6341
- return new Error(`Routing error: ${text}`)
6342
- };
6126
+ function getAssertedOutput (output = (len) => new Uint8Array(len), length) {
6127
+ if (typeof output === 'function') output = output(length);
6128
+ isUint8Array('output', output, length);
6129
+ return output
6130
+ }
6343
6131
 
6344
- const nothingFoundError = (hash) => {
6345
- return new Error(`nothing found for ${hash}`)
6346
- };
6132
+ function toTypeString (value) {
6133
+ return Object.prototype.toString.call(value).slice(8, -1)
6134
+ }
6347
6135
 
6348
- let LeofcoinStorage$1 = class LeofcoinStorage {
6349
- name;
6350
- root;
6351
- db;
6352
- constructor(name = 'storage', root = '.leofcoin') {
6353
- this.name = name;
6354
- this.root = root;
6355
- }
6356
- async init() {
6357
- const importee = await import(globalThis.navigator ? './browser-store.js' : './store.js');
6358
- const Store = importee.default;
6359
- this.db = new Store(this.name, this.root);
6360
- }
6361
- async get(key) {
6362
- if (typeof key === 'object')
6363
- return this.many('get', key);
6364
- return this.db.get(new KeyPath(key));
6365
- }
6366
- /**
6367
- *
6368
- * @param {*} key
6369
- * @param {*} value
6370
- * @returns Promise
6371
- */
6372
- put(key, value) {
6373
- if (typeof key === 'object')
6374
- return this.many('put', key);
6375
- return this.db.put(new KeyPath(key), new KeyValue(value));
6376
- }
6377
- async has(key) {
6378
- if (typeof key === 'object')
6379
- return this.many('has', key);
6380
- try {
6381
- const has = await this.db.get(new KeyPath(key));
6382
- return Boolean(has);
6383
- }
6384
- catch (e) {
6385
- return false;
6386
- }
6387
- }
6388
- async delete(key) {
6389
- return this.db.delete(new KeyPath(key));
6390
- }
6391
- keys(limit = -1) {
6392
- return this.db.keys(limit);
6393
- }
6394
- async values(limit = -1) {
6395
- return this.db.values(limit);
6396
- }
6397
- async many(type, _value) {
6398
- const jobs = [];
6399
- for (const key of Object.keys(_value)) {
6400
- jobs.push(this[type](key, _value[key]));
6401
- }
6402
- return Promise.all(jobs);
6403
- }
6404
- async length() {
6405
- const keys = await this.keys();
6406
- return keys.length;
6407
- }
6408
- async size() {
6409
- let size = 0;
6410
- const query = await this.db.iterate();
6411
- for await (const item of query) {
6412
- // @ts-ignore
6413
- size += item.value ? item.value.length : item[1].length;
6414
- }
6415
- return size;
6416
- }
6417
- async clear() {
6418
- return this.db.clear();
6419
- }
6420
- async iterate() {
6421
- return this.db.iterate();
6422
- }
6423
- };
6136
+ var lib = (secp256k1) => {
6137
+ return {
6138
+ contextRandomize (seed) {
6139
+ assert$g(
6140
+ seed === null || seed instanceof Uint8Array,
6141
+ 'Expected seed to be an Uint8Array or null'
6142
+ );
6143
+ if (seed !== null) isUint8Array('seed', seed, 32);
6424
6144
 
6425
- const randombytes = strength => crypto.getRandomValues(new Uint8Array(strength));
6145
+ switch (secp256k1.contextRandomize(seed)) {
6146
+ case 1:
6147
+ throw new Error(errors.CONTEXT_RANDOMIZE_UNKNOW)
6148
+ }
6149
+ },
6426
6150
 
6427
- const {subtle} = crypto;
6151
+ privateKeyVerify (seckey) {
6152
+ isUint8Array('private key', seckey, 32);
6428
6153
 
6429
- /**
6430
- * ```js
6431
- * const {createHash} = await import('@leofcoin/crypto')
6432
- * createHash(data, algorithm)
6433
- * ```
6434
- * @param {Uint8Array} data
6435
- * @param {string} algorithm
6436
- * @returns Uint8Array
6437
- */
6438
- const createHash = (data, algorithm = 'SHA-512') => subtle.digest(algorithm, data);
6154
+ return secp256k1.privateKeyVerify(seckey) === 0
6155
+ },
6439
6156
 
6440
- /**
6441
- * Hashes the created hash again
6442
- * ```js
6443
- * const {createDoubleHash} = await import('@leofcoin/crypto')
6444
- * createDoubleHash(data, algorithm)
6445
- * ```
6446
- * @param {Uint8Array} data
6447
- * @param {string} algorithm
6448
- * @returns Uint8Array
6449
- */
6450
- const createDoubleHash = async (data, algorithm = 'SHA-512') =>
6451
- subtle.digest(algorithm, await subtle.digest(algorithm, data));
6157
+ privateKeyNegate (seckey) {
6158
+ isUint8Array('private key', seckey, 32);
6452
6159
 
6453
- const generatePbkdf2 = async (password) => {
6454
- return subtle.importKey(
6455
- 'raw',
6456
- password,
6457
- 'PBKDF2',
6458
- false,
6459
- ['deriveBits']
6460
- )
6461
- };
6160
+ switch (secp256k1.privateKeyNegate(seckey)) {
6161
+ case 0:
6162
+ return seckey
6163
+ case 1:
6164
+ throw new Error(errors.IMPOSSIBLE_CASE)
6165
+ }
6166
+ },
6462
6167
 
6463
- const pbkdf2 = async (password, salt, iterations = 4096, length = 64, hash = 'SHA-512') => {
6464
- const key = await generatePbkdf2(password);
6465
- return subtle.deriveBits({
6466
- name: 'PBKDF2',
6467
- hash,
6468
- salt,
6469
- iterations,
6470
- }, key, length)
6471
- };
6168
+ privateKeyTweakAdd (seckey, tweak) {
6169
+ isUint8Array('private key', seckey, 32);
6170
+ isUint8Array('tweak', tweak, 32);
6472
6171
 
6473
- var typedArrayConcat = (input, options = {length: undefined, seperator: undefined}) => {
6474
- if (!options) options = {};
6475
-
6476
- if (typeof options.seperator === 'string')
6477
- options.seperator = new TextEncoder().encode(options.seperator);
6478
-
6479
- const length = options.length || input.reduce((total, current, i) => {
6480
- total += current.length;
6481
- if (options.seperator && input.length - 1 > i) total+= options.seperator.length;
6482
- return total
6483
- }, 0);
6484
-
6485
- const typedArray = new Uint8Array(length);
6486
-
6487
- let currentIndex = 0;
6488
- let index = 0;
6489
- for (const source of input) {
6490
- typedArray.set(source, currentIndex);
6491
- if (options.seperator && input.length - 1 > index) {
6492
- typedArray.set(options.seperator, currentIndex + source.length);
6493
- currentIndex+= options.seperator.length;
6494
- }
6495
- currentIndex += source.length;
6496
- index += 1;
6497
- }
6498
-
6499
- return typedArray
6500
- };
6172
+ switch (secp256k1.privateKeyTweakAdd(seckey, tweak)) {
6173
+ case 0:
6174
+ return seckey
6175
+ case 1:
6176
+ throw new Error(errors.TWEAK_ADD)
6177
+ }
6178
+ },
6501
6179
 
6502
- const concatAndDoubleHash = async (input) => {
6503
- return new Uint8Array(await createDoubleHash(typedArrayConcat(input), 'SHA-256'));
6504
- };
6505
-
6506
- const encode$2 = async (source, prefix = new TextEncoder().encode('00'), hex) => {
6507
- if (!(source instanceof Uint8Array) || !(prefix instanceof Uint8Array)) {
6508
- throw new TypeError('Expected Uint8Array');
6509
- }
6510
- const hash = await concatAndDoubleHash([
6511
- prefix,
6512
- source
6513
- ]);
6514
- const uint8Array = typedArrayConcat([
6515
- prefix,
6516
- source,
6517
- hash.subarray(0, 4)
6518
- ]);
6519
- if (hex)
6520
- return base58$1.encodeHex(uint8Array);
6521
- return base58$1.encode(uint8Array);
6522
- };
6523
- const decode$3 = async (string, hex) => {
6524
- let uint8Array = hex ? base58$1.decodeHex(string) : base58$1.decode(string);
6525
- const prefix = uint8Array.subarray(0, 2);
6526
- const source = uint8Array.subarray(2, -4);
6527
- const hash = await concatAndDoubleHash([
6528
- prefix,
6529
- source
6530
- ]);
6531
- let index = 0;
6532
- const slice = uint8Array.subarray(-4);
6533
- for (const check of slice) {
6534
- if (check !== hash[index]) {
6535
- throw new Error('Invalid checksum');
6536
- }
6537
- index++;
6538
- }
6539
- return { prefix, data: source };
6540
- };
6541
- const isBase58check = (string, hex) => {
6542
- try {
6543
- hex ? decode$3(string, true) : decode$3(string);
6544
- return true;
6545
- }
6546
- catch (e) {
6547
- return false;
6548
- }
6549
- };
6550
- const encodeHex = (uint8Array, prefix = new TextEncoder().encode('00')) => encode$2(uint8Array, prefix, true);
6551
- const decodeHex = (string) => decode$3(string, true);
6552
- const isBase58checkHex = (string) => isBase58check(string, true);
6553
- var base58check = { encode: encode$2, decode: decode$3, encodeHex, decodeHex, isBase58check, isBase58checkHex };
6554
-
6555
- const decode$2 = (multiWif, expectedVersion, expectedCodec) => {
6556
- const decoded = base58$1.decode(multiWif);
6557
- let [version, codec, privateKey] = index$6(decoded);
6558
- version = Number(new TextDecoder().decode(version));
6559
- codec = Number(new TextDecoder().decode(codec));
6560
- if (expectedVersion && version !== expectedVersion)
6561
- throw new Error(`invalid version: expected ${expectedVersion} but got ${version}`);
6562
- if (expectedCodec && codec !== expectedCodec)
6563
- throw new Error(`invalid codec: expected ${expectedCodec} but got ${codec}`);
6564
- return { version, codec, privateKey };
6565
- };
6566
- var index$1 = {
6567
- encode: (version, codec, privateKey) => {
6568
- return base58$1.encode(index$7([
6569
- new TextEncoder().encode(version.toString()),
6570
- new TextEncoder().encode(codec.toString()),
6571
- privateKey
6572
- ]));
6573
- },
6574
- decode: decode$2,
6575
- isMultiWif: (multiWif) => {
6576
- try {
6577
- const { version, codec, privateKey } = decode$2(multiWif);
6578
- if (version === undefined)
6579
- return false;
6580
- if (codec === undefined)
6581
- return false;
6582
- if (privateKey === undefined)
6583
- return false;
6584
- if (privateKey && privateKey.length !== 32)
6585
- return false;
6586
- }
6587
- catch {
6588
- return false;
6589
- }
6590
- return true;
6591
- }
6592
- };
6593
-
6594
- const errors = {
6595
- IMPOSSIBLE_CASE: 'Impossible case. Please create issue.',
6596
- TWEAK_ADD:
6597
- 'The tweak was out of range or the resulted private key is invalid',
6598
- TWEAK_MUL: 'The tweak was out of range or equal to zero',
6599
- CONTEXT_RANDOMIZE_UNKNOW: 'Unknow error on context randomization',
6600
- SECKEY_INVALID: 'Private Key is invalid',
6601
- PUBKEY_PARSE: 'Public Key could not be parsed',
6602
- PUBKEY_SERIALIZE: 'Public Key serialization error',
6603
- PUBKEY_COMBINE: 'The sum of the public keys is not valid',
6604
- SIG_PARSE: 'Signature could not be parsed',
6605
- SIGN: 'The nonce generation function failed, or the private key was invalid',
6606
- RECOVER: 'Public key could not be recover',
6607
- ECDH: 'Scalar was invalid (zero or overflow)'
6608
- };
6609
-
6610
- function assert$g (cond, msg) {
6611
- if (!cond) throw new Error(msg)
6612
- }
6613
-
6614
- function isUint8Array (name, value, length) {
6615
- assert$g(value instanceof Uint8Array, `Expected ${name} to be an Uint8Array`);
6616
-
6617
- if (length !== undefined) {
6618
- if (Array.isArray(length)) {
6619
- const numbers = length.join(', ');
6620
- const msg = `Expected ${name} to be an Uint8Array with length [${numbers}]`;
6621
- assert$g(length.includes(value.length), msg);
6622
- } else {
6623
- const msg = `Expected ${name} to be an Uint8Array with length ${length}`;
6624
- assert$g(value.length === length, msg);
6625
- }
6626
- }
6627
- }
6628
-
6629
- function isCompressed (value) {
6630
- assert$g(toTypeString(value) === 'Boolean', 'Expected compressed to be a Boolean');
6631
- }
6632
-
6633
- function getAssertedOutput (output = (len) => new Uint8Array(len), length) {
6634
- if (typeof output === 'function') output = output(length);
6635
- isUint8Array('output', output, length);
6636
- return output
6637
- }
6638
-
6639
- function toTypeString (value) {
6640
- return Object.prototype.toString.call(value).slice(8, -1)
6641
- }
6642
-
6643
- var lib = (secp256k1) => {
6644
- return {
6645
- contextRandomize (seed) {
6646
- assert$g(
6647
- seed === null || seed instanceof Uint8Array,
6648
- 'Expected seed to be an Uint8Array or null'
6649
- );
6650
- if (seed !== null) isUint8Array('seed', seed, 32);
6651
-
6652
- switch (secp256k1.contextRandomize(seed)) {
6653
- case 1:
6654
- throw new Error(errors.CONTEXT_RANDOMIZE_UNKNOW)
6655
- }
6656
- },
6657
-
6658
- privateKeyVerify (seckey) {
6659
- isUint8Array('private key', seckey, 32);
6660
-
6661
- return secp256k1.privateKeyVerify(seckey) === 0
6662
- },
6663
-
6664
- privateKeyNegate (seckey) {
6665
- isUint8Array('private key', seckey, 32);
6666
-
6667
- switch (secp256k1.privateKeyNegate(seckey)) {
6668
- case 0:
6669
- return seckey
6670
- case 1:
6671
- throw new Error(errors.IMPOSSIBLE_CASE)
6672
- }
6673
- },
6674
-
6675
- privateKeyTweakAdd (seckey, tweak) {
6676
- isUint8Array('private key', seckey, 32);
6677
- isUint8Array('tweak', tweak, 32);
6678
-
6679
- switch (secp256k1.privateKeyTweakAdd(seckey, tweak)) {
6680
- case 0:
6681
- return seckey
6682
- case 1:
6683
- throw new Error(errors.TWEAK_ADD)
6684
- }
6685
- },
6686
-
6687
- privateKeyTweakMul (seckey, tweak) {
6688
- isUint8Array('private key', seckey, 32);
6689
- isUint8Array('tweak', tweak, 32);
6180
+ privateKeyTweakMul (seckey, tweak) {
6181
+ isUint8Array('private key', seckey, 32);
6182
+ isUint8Array('tweak', tweak, 32);
6690
6183
 
6691
6184
  switch (secp256k1.privateKeyTweakMul(seckey, tweak)) {
6692
6185
  case 0:
@@ -16107,240 +15600,795 @@ var elliptic$1 = {
16107
15600
  if (sig[4] & 0x80) return 1
16108
15601
  if (lenR > 1 && (sig[4] === 0x00) && !(sig[5] & 0x80)) return 1
16109
15602
 
16110
- if (sig[lenR + 6] & 0x80) return 1
16111
- if (lenS > 1 && (sig[lenR + 6] === 0x00) && !(sig[lenR + 7] & 0x80)) return 1
15603
+ if (sig[lenR + 6] & 0x80) return 1
15604
+ if (lenS > 1 && (sig[lenR + 6] === 0x00) && !(sig[lenR + 7] & 0x80)) return 1
15605
+
15606
+ let sigR = sig.subarray(4, 4 + lenR);
15607
+ if (sigR.length === 33 && sigR[0] === 0x00) sigR = sigR.subarray(1);
15608
+ if (sigR.length > 32) return 1
15609
+
15610
+ let sigS = sig.subarray(6 + lenR);
15611
+ if (sigS.length === 33 && sigS[0] === 0x00) sigS = sigS.slice(1);
15612
+ if (sigS.length > 32) throw new Error('S length is too long')
15613
+
15614
+ let r = new BN(sigR);
15615
+ if (r.cmp(ecparams.n) >= 0) r = new BN(0);
15616
+
15617
+ let s = new BN(sig.subarray(6 + lenR));
15618
+ if (s.cmp(ecparams.n) >= 0) s = new BN(0);
15619
+
15620
+ output.set(r.toArrayLike(Uint8Array, 'be', 32), 0);
15621
+ output.set(s.toArrayLike(Uint8Array, 'be', 32), 32);
15622
+
15623
+ return 0
15624
+ },
15625
+
15626
+ ecdsaSign (obj, message, seckey, data, noncefn) {
15627
+ if (noncefn) {
15628
+ const _noncefn = noncefn;
15629
+ noncefn = (counter) => {
15630
+ const nonce = _noncefn(message, seckey, null, data, counter);
15631
+
15632
+ const isValid = nonce instanceof Uint8Array && nonce.length === 32;
15633
+ if (!isValid) throw new Error('This is the way')
15634
+
15635
+ return new BN(nonce)
15636
+ };
15637
+ }
15638
+
15639
+ const d = new BN(seckey);
15640
+ if (d.cmp(ecparams.n) >= 0 || d.isZero()) return 1
15641
+
15642
+ let sig;
15643
+ try {
15644
+ sig = ec.sign(message, seckey, { canonical: true, k: noncefn, pers: data });
15645
+ } catch (err) {
15646
+ return 1
15647
+ }
15648
+
15649
+ obj.signature.set(sig.r.toArrayLike(Uint8Array, 'be', 32), 0);
15650
+ obj.signature.set(sig.s.toArrayLike(Uint8Array, 'be', 32), 32);
15651
+ obj.recid = sig.recoveryParam;
15652
+
15653
+ return 0
15654
+ },
15655
+
15656
+ ecdsaVerify (sig, msg32, pubkey) {
15657
+ const sigObj = { r: sig.subarray(0, 32), s: sig.subarray(32, 64) };
15658
+
15659
+ const sigr = new BN(sigObj.r);
15660
+ const sigs = new BN(sigObj.s);
15661
+ if (sigr.cmp(ecparams.n) >= 0 || sigs.cmp(ecparams.n) >= 0) return 1
15662
+ if (sigs.cmp(ec.nh) === 1 || sigr.isZero() || sigs.isZero()) return 3
15663
+
15664
+ const pair = loadPublicKey(pubkey);
15665
+ if (pair === null) return 2
15666
+
15667
+ const point = pair.getPublic();
15668
+ const isValid = ec.verify(msg32, sigObj, point);
15669
+ return isValid ? 0 : 3
15670
+ },
15671
+
15672
+ ecdsaRecover (output, sig, recid, msg32) {
15673
+ const sigObj = { r: sig.slice(0, 32), s: sig.slice(32, 64) };
15674
+
15675
+ const sigr = new BN(sigObj.r);
15676
+ const sigs = new BN(sigObj.s);
15677
+ if (sigr.cmp(ecparams.n) >= 0 || sigs.cmp(ecparams.n) >= 0) return 1
15678
+
15679
+ if (sigr.isZero() || sigs.isZero()) return 2
15680
+
15681
+ // Can throw `throw new Error('Unable to find sencond key candinate');`
15682
+ let point;
15683
+ try {
15684
+ point = ec.recoverPubKey(msg32, sigObj, recid);
15685
+ } catch (err) {
15686
+ return 2
15687
+ }
15688
+
15689
+ savePublicKey(output, point);
15690
+
15691
+ return 0
15692
+ },
15693
+
15694
+ ecdh (output, pubkey, seckey, data, hashfn, xbuf, ybuf) {
15695
+ const pair = loadPublicKey(pubkey);
15696
+ if (pair === null) return 1
15697
+
15698
+ const scalar = new BN(seckey);
15699
+ if (scalar.cmp(ecparams.n) >= 0 || scalar.isZero()) return 2
15700
+
15701
+ const point = pair.getPublic().mul(scalar);
15702
+
15703
+ if (hashfn === undefined) {
15704
+ const data = point.encode(null, true);
15705
+ const sha256 = ec.hash().update(data).digest();
15706
+ for (let i = 0; i < 32; ++i) output[i] = sha256[i];
15707
+ } else {
15708
+ if (!xbuf) xbuf = new Uint8Array(32);
15709
+ const x = point.getX().toArray('be', 32);
15710
+ for (let i = 0; i < 32; ++i) xbuf[i] = x[i];
15711
+
15712
+ if (!ybuf) ybuf = new Uint8Array(32);
15713
+ const y = point.getY().toArray('be', 32);
15714
+ for (let i = 0; i < 32; ++i) ybuf[i] = y[i];
15715
+
15716
+ const hash = hashfn(xbuf, ybuf, data);
15717
+
15718
+ const isValid = hash instanceof Uint8Array && hash.length === output.length;
15719
+ if (!isValid) return 2
15720
+
15721
+ output.set(hash);
15722
+ }
15723
+
15724
+ return 0
15725
+ }
15726
+ };
15727
+
15728
+ var elliptic = lib(elliptic$1);
15729
+
15730
+ var secp256k1 = /*@__PURE__*/getDefaultExportFromCjs(elliptic);
15731
+
15732
+ const leofcoinOlivia = {
15733
+ messagePrefix: '\u0019Leofcoin Signed Message:',
15734
+ version: 1,
15735
+ pubKeyHash: 0x73,
15736
+ scriptHash: 0x76,
15737
+ multiTxHash: 0x8b4125,
15738
+ payments: {
15739
+ version: 0,
15740
+ unspent: 0x1fa443d7 // ounsp
15741
+ },
15742
+ wif: 0x7D,
15743
+ multiCodec: 0x7c4,
15744
+ bip32: { public: 0x13BBF2D5, private: 0x13BBCBC5 }
15745
+ };
15746
+ const bitcoinTestnet = {
15747
+ messagePrefix: '\x18Bitcoin Signed Message:\n',
15748
+ version: 1,
15749
+ bech32: 'tb',
15750
+ pubKeyHash: 0x6f,
15751
+ scriptHash: 0xc4,
15752
+ wif: 0xef,
15753
+ bip32: {
15754
+ public: 0x043587cf,
15755
+ private: 0x04358394
15756
+ },
15757
+ multiCodec: 0
15758
+ };
15759
+ var testnets = {
15760
+ 'leofcoin:olivia': leofcoinOlivia,
15761
+ 'bitcoin:testnet': bitcoinTestnet
15762
+ };
15763
+
15764
+ // https://en.bitcoin.it/wiki/List_of_address_prefixes
15765
+ // usage:
15766
+ // networks['bitcoin']['testnet']
15767
+ // networks.bitcoin.testnet
15768
+ /**
15769
+ * Main network
15770
+ * @return {messagePrefix, pubKeyHash, scriptHash, wif, bip32}
15771
+ */
15772
+ const leofcoin = {
15773
+ messagePrefix: '\u0019Leofcoin Signed Message:',
15774
+ version: 1,
15775
+ pubKeyHash: 0x30,
15776
+ scriptHash: 0x37,
15777
+ multiTxHash: 0x3adeed,
15778
+ payments: {
15779
+ version: 0,
15780
+ unspent: 0x0d6e0327 // Lunsp
15781
+ },
15782
+ coin_type: 640,
15783
+ wif: 0x3F,
15784
+ multiCodec: 0x3c4,
15785
+ bip32: { public: 0x13BBF2D4, private: 0x13BBCBC4 },
15786
+ testnet: testnets['leofcoin:olivia']
15787
+ };
15788
+ const bitcoin = {
15789
+ messagePrefix: '\x18Bitcoin Signed Message:\n',
15790
+ version: 1,
15791
+ bech32: 'bc',
15792
+ pubKeyHash: 0x00,
15793
+ multiCodec: 0x00,
15794
+ scriptHash: 0x05,
15795
+ wif: 0x80,
15796
+ coin_type: 0,
15797
+ bip32: {
15798
+ public: 0x0488b21e, private: 0x0488ade4
15799
+ },
15800
+ testnet: testnets['bitcoin:testnet']
15801
+ };
15802
+ const litecoin = {
15803
+ messagePrefix: '\x19Litecoin Signed Message:\n',
15804
+ version: 1,
15805
+ pubKeyHash: 0x30,
15806
+ scriptHash: 0x32,
15807
+ wif: 0xb0,
15808
+ bip32: {
15809
+ public: 0x019da462,
15810
+ private: 0x019d9cfe
15811
+ },
15812
+ bech32: '',
15813
+ multiCodec: 0
15814
+ };
15815
+ const ethereum = {
15816
+ messagePrefix: '\x19Ethereum Signed Message:\n',
15817
+ version: 1,
15818
+ pubKeyHash: 0x30,
15819
+ scriptHash: 0x32,
15820
+ bip32: {
15821
+ private: 0x0488ADE4, public: 0x0488B21E
15822
+ },
15823
+ coin_type: 60,
15824
+ wif: 0x45,
15825
+ multiCodec: 0x3c5
15826
+ };
15827
+ /**
15828
+ * Our & supported networks
15829
+ * @return {leofcoin, olivia}
15830
+ */
15831
+ var networks = {
15832
+ leofcoin,
15833
+ bitcoin,
15834
+ litecoin,
15835
+ ethereum
15836
+ };
15837
+
15838
+ /*!
15839
+ * hash-wasm (https://www.npmjs.com/package/hash-wasm)
15840
+ * (c) Dani Biro
15841
+ * @license MIT
15842
+ */
15843
+
15844
+ /******************************************************************************
15845
+ Copyright (c) Microsoft Corporation.
15846
+
15847
+ Permission to use, copy, modify, and/or distribute this software for any
15848
+ purpose with or without fee is hereby granted.
15849
+
15850
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
15851
+ REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
15852
+ AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
15853
+ INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
15854
+ LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
15855
+ OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
15856
+ PERFORMANCE OF THIS SOFTWARE.
15857
+ ***************************************************************************** */
15858
+ /* global Reflect, Promise, SuppressedError, Symbol */
15859
+
15860
+
15861
+ function __awaiter(thisArg, _arguments, P, generator) {
15862
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
15863
+ return new (P || (P = Promise))(function (resolve, reject) {
15864
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
15865
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
15866
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
15867
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
15868
+ });
15869
+ }
15870
+
15871
+ typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
15872
+ var e = new Error(message);
15873
+ return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
15874
+ };
15875
+
15876
+ class Mutex {
15877
+ constructor() {
15878
+ this.mutex = Promise.resolve();
15879
+ }
15880
+ lock() {
15881
+ let begin = () => { };
15882
+ this.mutex = this.mutex.then(() => new Promise(begin));
15883
+ return new Promise((res) => {
15884
+ begin = res;
15885
+ });
15886
+ }
15887
+ dispatch(fn) {
15888
+ return __awaiter(this, void 0, void 0, function* () {
15889
+ const unlock = yield this.lock();
15890
+ try {
15891
+ return yield Promise.resolve(fn());
15892
+ }
15893
+ finally {
15894
+ unlock();
15895
+ }
15896
+ });
15897
+ }
15898
+ }
15899
+
15900
+ /* eslint-disable import/prefer-default-export */
15901
+ /* eslint-disable no-bitwise */
15902
+ var _a;
15903
+ function getGlobal() {
15904
+ if (typeof globalThis !== 'undefined')
15905
+ return globalThis;
15906
+ // eslint-disable-next-line no-restricted-globals
15907
+ if (typeof self !== 'undefined')
15908
+ return self;
15909
+ if (typeof window !== 'undefined')
15910
+ return window;
15911
+ return global;
15912
+ }
15913
+ const globalObject = getGlobal();
15914
+ const nodeBuffer = (_a = globalObject.Buffer) !== null && _a !== void 0 ? _a : null;
15915
+ const textEncoder = globalObject.TextEncoder ? new globalObject.TextEncoder() : null;
15916
+ function hexCharCodesToInt(a, b) {
15917
+ return (((a & 0xF) + ((a >> 6) | ((a >> 3) & 0x8))) << 4) | ((b & 0xF) + ((b >> 6) | ((b >> 3) & 0x8)));
15918
+ }
15919
+ function writeHexToUInt8(buf, str) {
15920
+ const size = str.length >> 1;
15921
+ for (let i = 0; i < size; i++) {
15922
+ const index = i << 1;
15923
+ buf[i] = hexCharCodesToInt(str.charCodeAt(index), str.charCodeAt(index + 1));
15924
+ }
15925
+ }
15926
+ function hexStringEqualsUInt8(str, buf) {
15927
+ if (str.length !== buf.length * 2) {
15928
+ return false;
15929
+ }
15930
+ for (let i = 0; i < buf.length; i++) {
15931
+ const strIndex = i << 1;
15932
+ if (buf[i] !== hexCharCodesToInt(str.charCodeAt(strIndex), str.charCodeAt(strIndex + 1))) {
15933
+ return false;
15934
+ }
15935
+ }
15936
+ return true;
15937
+ }
15938
+ const alpha = 'a'.charCodeAt(0) - 10;
15939
+ const digit = '0'.charCodeAt(0);
15940
+ function getDigestHex(tmpBuffer, input, hashLength) {
15941
+ let p = 0;
15942
+ /* eslint-disable no-plusplus */
15943
+ for (let i = 0; i < hashLength; i++) {
15944
+ let nibble = input[i] >>> 4;
15945
+ tmpBuffer[p++] = nibble > 9 ? nibble + alpha : nibble + digit;
15946
+ nibble = input[i] & 0xF;
15947
+ tmpBuffer[p++] = nibble > 9 ? nibble + alpha : nibble + digit;
15948
+ }
15949
+ /* eslint-enable no-plusplus */
15950
+ return String.fromCharCode.apply(null, tmpBuffer);
15951
+ }
15952
+ const getUInt8Buffer = nodeBuffer !== null
15953
+ ? (data) => {
15954
+ if (typeof data === 'string') {
15955
+ const buf = nodeBuffer.from(data, 'utf8');
15956
+ return new Uint8Array(buf.buffer, buf.byteOffset, buf.length);
15957
+ }
15958
+ if (nodeBuffer.isBuffer(data)) {
15959
+ return new Uint8Array(data.buffer, data.byteOffset, data.length);
15960
+ }
15961
+ if (ArrayBuffer.isView(data)) {
15962
+ return new Uint8Array(data.buffer, data.byteOffset, data.byteLength);
15963
+ }
15964
+ throw new Error('Invalid data type!');
15965
+ }
15966
+ : (data) => {
15967
+ if (typeof data === 'string') {
15968
+ return textEncoder.encode(data);
15969
+ }
15970
+ if (ArrayBuffer.isView(data)) {
15971
+ return new Uint8Array(data.buffer, data.byteOffset, data.byteLength);
15972
+ }
15973
+ throw new Error('Invalid data type!');
15974
+ };
15975
+ const base64Chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
15976
+ const base64Lookup = new Uint8Array(256);
15977
+ for (let i = 0; i < base64Chars.length; i++) {
15978
+ base64Lookup[base64Chars.charCodeAt(i)] = i;
15979
+ }
15980
+ function getDecodeBase64Length(data) {
15981
+ let bufferLength = Math.floor(data.length * 0.75);
15982
+ const len = data.length;
15983
+ if (data[len - 1] === '=') {
15984
+ bufferLength -= 1;
15985
+ if (data[len - 2] === '=') {
15986
+ bufferLength -= 1;
15987
+ }
15988
+ }
15989
+ return bufferLength;
15990
+ }
15991
+ function decodeBase64(data) {
15992
+ const bufferLength = getDecodeBase64Length(data);
15993
+ const len = data.length;
15994
+ const bytes = new Uint8Array(bufferLength);
15995
+ let p = 0;
15996
+ for (let i = 0; i < len; i += 4) {
15997
+ const encoded1 = base64Lookup[data.charCodeAt(i)];
15998
+ const encoded2 = base64Lookup[data.charCodeAt(i + 1)];
15999
+ const encoded3 = base64Lookup[data.charCodeAt(i + 2)];
16000
+ const encoded4 = base64Lookup[data.charCodeAt(i + 3)];
16001
+ bytes[p] = (encoded1 << 2) | (encoded2 >> 4);
16002
+ p += 1;
16003
+ bytes[p] = ((encoded2 & 15) << 4) | (encoded3 >> 2);
16004
+ p += 1;
16005
+ bytes[p] = ((encoded3 & 3) << 6) | (encoded4 & 63);
16006
+ p += 1;
16007
+ }
16008
+ return bytes;
16009
+ }
16010
+
16011
+ const MAX_HEAP = 16 * 1024;
16012
+ const WASM_FUNC_HASH_LENGTH = 4;
16013
+ const wasmMutex = new Mutex();
16014
+ const wasmModuleCache = new Map();
16015
+ function WASMInterface(binary, hashLength) {
16016
+ return __awaiter(this, void 0, void 0, function* () {
16017
+ let wasmInstance = null;
16018
+ let memoryView = null;
16019
+ let initialized = false;
16020
+ if (typeof WebAssembly === 'undefined') {
16021
+ throw new Error('WebAssembly is not supported in this environment!');
16022
+ }
16023
+ const writeMemory = (data, offset = 0) => {
16024
+ memoryView.set(data, offset);
16025
+ };
16026
+ const getMemory = () => memoryView;
16027
+ const getExports = () => wasmInstance.exports;
16028
+ const setMemorySize = (totalSize) => {
16029
+ wasmInstance.exports.Hash_SetMemorySize(totalSize);
16030
+ const arrayOffset = wasmInstance.exports.Hash_GetBuffer();
16031
+ const memoryBuffer = wasmInstance.exports.memory.buffer;
16032
+ memoryView = new Uint8Array(memoryBuffer, arrayOffset, totalSize);
16033
+ };
16034
+ const getStateSize = () => {
16035
+ const view = new DataView(wasmInstance.exports.memory.buffer);
16036
+ const stateSize = view.getUint32(wasmInstance.exports.STATE_SIZE, true);
16037
+ return stateSize;
16038
+ };
16039
+ const loadWASMPromise = wasmMutex.dispatch(() => __awaiter(this, void 0, void 0, function* () {
16040
+ if (!wasmModuleCache.has(binary.name)) {
16041
+ const asm = decodeBase64(binary.data);
16042
+ const promise = WebAssembly.compile(asm);
16043
+ wasmModuleCache.set(binary.name, promise);
16044
+ }
16045
+ const module = yield wasmModuleCache.get(binary.name);
16046
+ wasmInstance = yield WebAssembly.instantiate(module, {
16047
+ // env: {
16048
+ // emscripten_memcpy_big: (dest, src, num) => {
16049
+ // const memoryBuffer = wasmInstance.exports.memory.buffer;
16050
+ // const memView = new Uint8Array(memoryBuffer, 0);
16051
+ // memView.set(memView.subarray(src, src + num), dest);
16052
+ // },
16053
+ // print_memory: (offset, len) => {
16054
+ // const memoryBuffer = wasmInstance.exports.memory.buffer;
16055
+ // const memView = new Uint8Array(memoryBuffer, 0);
16056
+ // console.log('print_int32', memView.subarray(offset, offset + len));
16057
+ // },
16058
+ // },
16059
+ });
16060
+ // wasmInstance.exports._start();
16061
+ }));
16062
+ const setupInterface = () => __awaiter(this, void 0, void 0, function* () {
16063
+ if (!wasmInstance) {
16064
+ yield loadWASMPromise;
16065
+ }
16066
+ const arrayOffset = wasmInstance.exports.Hash_GetBuffer();
16067
+ const memoryBuffer = wasmInstance.exports.memory.buffer;
16068
+ memoryView = new Uint8Array(memoryBuffer, arrayOffset, MAX_HEAP);
16069
+ });
16070
+ const init = (bits = null) => {
16071
+ initialized = true;
16072
+ wasmInstance.exports.Hash_Init(bits);
16073
+ };
16074
+ const updateUInt8Array = (data) => {
16075
+ let read = 0;
16076
+ while (read < data.length) {
16077
+ const chunk = data.subarray(read, read + MAX_HEAP);
16078
+ read += chunk.length;
16079
+ memoryView.set(chunk);
16080
+ wasmInstance.exports.Hash_Update(chunk.length);
16081
+ }
16082
+ };
16083
+ const update = (data) => {
16084
+ if (!initialized) {
16085
+ throw new Error('update() called before init()');
16086
+ }
16087
+ const Uint8Buffer = getUInt8Buffer(data);
16088
+ updateUInt8Array(Uint8Buffer);
16089
+ };
16090
+ const digestChars = new Uint8Array(hashLength * 2);
16091
+ const digest = (outputType, padding = null) => {
16092
+ if (!initialized) {
16093
+ throw new Error('digest() called before init()');
16094
+ }
16095
+ initialized = false;
16096
+ wasmInstance.exports.Hash_Final(padding);
16097
+ if (outputType === 'binary') {
16098
+ // the data is copied to allow GC of the original memory object
16099
+ return memoryView.slice(0, hashLength);
16100
+ }
16101
+ return getDigestHex(digestChars, memoryView, hashLength);
16102
+ };
16103
+ const save = () => {
16104
+ if (!initialized) {
16105
+ throw new Error('save() can only be called after init() and before digest()');
16106
+ }
16107
+ const stateOffset = wasmInstance.exports.Hash_GetState();
16108
+ const stateLength = getStateSize();
16109
+ const memoryBuffer = wasmInstance.exports.memory.buffer;
16110
+ const internalState = new Uint8Array(memoryBuffer, stateOffset, stateLength);
16111
+ // prefix is 4 bytes from SHA1 hash of the WASM binary
16112
+ // it is used to detect incompatible internal states between different versions of hash-wasm
16113
+ const prefixedState = new Uint8Array(WASM_FUNC_HASH_LENGTH + stateLength);
16114
+ writeHexToUInt8(prefixedState, binary.hash);
16115
+ prefixedState.set(internalState, WASM_FUNC_HASH_LENGTH);
16116
+ return prefixedState;
16117
+ };
16118
+ const load = (state) => {
16119
+ if (!(state instanceof Uint8Array)) {
16120
+ throw new Error('load() expects an Uint8Array generated by save()');
16121
+ }
16122
+ const stateOffset = wasmInstance.exports.Hash_GetState();
16123
+ const stateLength = getStateSize();
16124
+ const overallLength = WASM_FUNC_HASH_LENGTH + stateLength;
16125
+ const memoryBuffer = wasmInstance.exports.memory.buffer;
16126
+ if (state.length !== overallLength) {
16127
+ throw new Error(`Bad state length (expected ${overallLength} bytes, got ${state.length})`);
16128
+ }
16129
+ if (!hexStringEqualsUInt8(binary.hash, state.subarray(0, WASM_FUNC_HASH_LENGTH))) {
16130
+ throw new Error('This state was written by an incompatible hash implementation');
16131
+ }
16132
+ const internalState = state.subarray(WASM_FUNC_HASH_LENGTH);
16133
+ new Uint8Array(memoryBuffer, stateOffset, stateLength).set(internalState);
16134
+ initialized = true;
16135
+ };
16136
+ const isDataShort = (data) => {
16137
+ if (typeof data === 'string') {
16138
+ // worst case is 4 bytes / char
16139
+ return data.length < MAX_HEAP / 4;
16140
+ }
16141
+ return data.byteLength < MAX_HEAP;
16142
+ };
16143
+ let canSimplify = isDataShort;
16144
+ switch (binary.name) {
16145
+ case 'argon2':
16146
+ case 'scrypt':
16147
+ canSimplify = () => true;
16148
+ break;
16149
+ case 'blake2b':
16150
+ case 'blake2s':
16151
+ // if there is a key at blake2 then cannot simplify
16152
+ canSimplify = (data, initParam) => initParam <= 512 && isDataShort(data);
16153
+ break;
16154
+ case 'blake3':
16155
+ // if there is a key at blake3 then cannot simplify
16156
+ canSimplify = (data, initParam) => initParam === 0 && isDataShort(data);
16157
+ break;
16158
+ case 'xxhash64': // cannot simplify
16159
+ case 'xxhash3':
16160
+ case 'xxhash128':
16161
+ canSimplify = () => false;
16162
+ break;
16163
+ }
16164
+ // shorthand for (init + update + digest) for better performance
16165
+ const calculate = (data, initParam = null, digestParam = null) => {
16166
+ if (!canSimplify(data, initParam)) {
16167
+ init(initParam);
16168
+ update(data);
16169
+ return digest('hex', digestParam);
16170
+ }
16171
+ const buffer = getUInt8Buffer(data);
16172
+ memoryView.set(buffer);
16173
+ wasmInstance.exports.Hash_Calculate(buffer.length, initParam, digestParam);
16174
+ return getDigestHex(digestChars, memoryView, hashLength);
16175
+ };
16176
+ yield setupInterface();
16177
+ return {
16178
+ getMemory,
16179
+ writeMemory,
16180
+ getExports,
16181
+ setMemorySize,
16182
+ init,
16183
+ update,
16184
+ digest,
16185
+ save,
16186
+ load,
16187
+ calculate,
16188
+ hashLength,
16189
+ };
16190
+ });
16191
+ }
16192
+
16193
+ new Mutex();
16112
16194
 
16113
- let sigR = sig.subarray(4, 4 + lenR);
16114
- if (sigR.length === 33 && sigR[0] === 0x00) sigR = sigR.subarray(1);
16115
- if (sigR.length > 32) return 1
16195
+ new Mutex();
16116
16196
 
16117
- let sigS = sig.subarray(6 + lenR);
16118
- if (sigS.length === 33 && sigS[0] === 0x00) sigS = sigS.slice(1);
16119
- if (sigS.length > 32) throw new Error('S length is too long')
16197
+ new Mutex();
16120
16198
 
16121
- let r = new BN(sigR);
16122
- if (r.cmp(ecparams.n) >= 0) r = new BN(0);
16199
+ new Mutex();
16123
16200
 
16124
- let s = new BN(sig.subarray(6 + lenR));
16125
- if (s.cmp(ecparams.n) >= 0) s = new BN(0);
16201
+ new Mutex();
16126
16202
 
16127
- output.set(r.toArrayLike(Uint8Array, 'be', 32), 0);
16128
- output.set(s.toArrayLike(Uint8Array, 'be', 32), 32);
16203
+ new Mutex();
16129
16204
 
16130
- return 0
16131
- },
16205
+ new Mutex();
16132
16206
 
16133
- ecdsaSign (obj, message, seckey, data, noncefn) {
16134
- if (noncefn) {
16135
- const _noncefn = noncefn;
16136
- noncefn = (counter) => {
16137
- const nonce = _noncefn(message, seckey, null, data, counter);
16207
+ new Mutex();
16138
16208
 
16139
- const isValid = nonce instanceof Uint8Array && nonce.length === 32;
16140
- if (!isValid) throw new Error('This is the way')
16209
+ new Mutex();
16141
16210
 
16142
- return new BN(nonce)
16143
- };
16144
- }
16211
+ var name$b = "sha3";
16212
+ var data$b = "AGFzbQEAAAABFARgAAF/YAF/AGACf38AYAN/f38AAwgHAAEBAgEAAwUEAQECAgYOAn8BQZCNBQt/AEGACAsHcAgGbWVtb3J5AgAOSGFzaF9HZXRCdWZmZXIAAAlIYXNoX0luaXQAAQtIYXNoX1VwZGF0ZQACCkhhc2hfRmluYWwABA1IYXNoX0dldFN0YXRlAAUOSGFzaF9DYWxjdWxhdGUABgpTVEFURV9TSVpFAwEKqBwHBQBBgAoL1wMAQQBCADcDgI0BQQBCADcD+IwBQQBCADcD8IwBQQBCADcD6IwBQQBCADcD4IwBQQBCADcD2IwBQQBCADcD0IwBQQBCADcDyIwBQQBCADcDwIwBQQBCADcDuIwBQQBCADcDsIwBQQBCADcDqIwBQQBCADcDoIwBQQBCADcDmIwBQQBCADcDkIwBQQBCADcDiIwBQQBCADcDgIwBQQBCADcD+IsBQQBCADcD8IsBQQBCADcD6IsBQQBCADcD4IsBQQBCADcD2IsBQQBCADcD0IsBQQBCADcDyIsBQQBCADcDwIsBQQBCADcDuIsBQQBCADcDsIsBQQBCADcDqIsBQQBCADcDoIsBQQBCADcDmIsBQQBCADcDkIsBQQBCADcDiIsBQQBCADcDgIsBQQBCADcD+IoBQQBCADcD8IoBQQBCADcD6IoBQQBCADcD4IoBQQBCADcD2IoBQQBCADcD0IoBQQBCADcDyIoBQQBCADcDwIoBQQBCADcDuIoBQQBCADcDsIoBQQBCADcDqIoBQQBCADcDoIoBQQBCADcDmIoBQQBCADcDkIoBQQBCADcDiIoBQQBCADcDgIoBQQBBwAwgAEEBdGtBA3Y2AoyNAUEAQQA2AoiNAQuMAwEIfwJAQQAoAoiNASIBQQBIDQBBACABIABqQQAoAoyNASICcDYCiI0BAkACQCABDQBBgAohAwwBCwJAIAIgAWsiBCAAIAQgAEkbIgNFDQAgA0EDcSEFQQAhBgJAIANBBEkNACABQYCKAWohByADQXxxIQhBACEGA0AgByAGaiIDQcgBaiAGQYAKai0AADoAACADQckBaiAGQYEKai0AADoAACADQcoBaiAGQYIKai0AADoAACADQcsBaiAGQYMKai0AADoAACAIIAZBBGoiBkcNAAsLIAVFDQAgAUHIiwFqIQMDQCADIAZqIAZBgApqLQAAOgAAIAZBAWohBiAFQX9qIgUNAAsLIAQgAEsNAUHIiwEgAhADIAAgBGshACAEQYAKaiEDCwJAIAAgAkkNAANAIAMgAhADIAMgAmohAyAAIAJrIgAgAk8NAAsLIABFDQBBACECQcgBIQYDQCAGQYCKAWogAyAGakG4fmotAAA6AAAgBkEBaiEGIAAgAkEBaiICQf8BcUsNAAsLC+QLAS1+IAApA0AhAkEAKQPAigEhAyAAKQM4IQRBACkDuIoBIQUgACkDMCEGQQApA7CKASEHIAApAyghCEEAKQOoigEhCSAAKQMgIQpBACkDoIoBIQsgACkDGCEMQQApA5iKASENIAApAxAhDkEAKQOQigEhDyAAKQMIIRBBACkDiIoBIREgACkDACESQQApA4CKASETQQApA8iKASEUAkACQCABQcgASw0AQQApA9CKASEVQQApA+CKASEWQQApA9iKASEXDAELQQApA+CKASAAKQNghSEWQQApA9iKASAAKQNYhSEXQQApA9CKASAAKQNQhSEVIBQgACkDSIUhFCABQekASQ0AQQBBACkD6IoBIAApA2iFNwPoigFBAEEAKQPwigEgACkDcIU3A/CKAUEAQQApA/iKASAAKQN4hTcD+IoBQQBBACkDgIsBIAApA4ABhTcDgIsBIAFBiQFJDQBBAEEAKQOIiwEgACkDiAGFNwOIiwELIAMgAoUhGCAFIASFIRkgByAGhSEHIAkgCIUhCCALIAqFIRogDSAMhSEJIA8gDoUhCiARIBCFIQsgEyAShSEMQQApA7iLASESQQApA5CLASETQQApA+iKASEbQQApA6CLASEcQQApA/iKASENQQApA7CLASEdQQApA4iLASEOQQApA8CLASEPQQApA5iLASEeQQApA/CKASEQQQApA6iLASERQQApA4CLASEfQcB+IQADQCAaIAcgC4UgF4UgH4UgEYVCAYmFIBSFIBCFIB6FIA+FIQIgDCAZIAqFIBaFIA6FIB2FQgGJhSAIhSAVhSANhSAchSIDIAeFISAgCSAIIAyFIBWFIA2FIByFQgGJhSAYhSAbhSAThSAShSIEIA+FISEgGCAKIBQgGoUgEIUgHoUgD4VCAYmFIBmFIBaFIA6FIB2FIgWFQjeJIiIgCyAYIAmFIBuFIBOFIBKFQgGJhSAHhSAXhSAfhSARhSIGIAqFQj6JIiNCf4WDIAMgEYVCAokiJIUhDyANIAKFQimJIiUgBCAQhUIniSImQn+FgyAihSERIBIgBYVCOIkiEiAGIA6FQg+JIidCf4WDIAMgF4VCCokiKIUhDiAEIBqFQhuJIikgKCAIIAKFQiSJIipCf4WDhSENIAYgGYVCBokiKyADIAuFQgGJIixCf4WDIBwgAoVCEokiLYUhECArIAQgHoVCCIkiLiAbIAWFQhmJIhtCf4WDhSEXIAYgHYVCPYkiGSAEIBSFQhSJIgQgCSAFhUIciSIIQn+Fg4UhFCAIIBlCf4WDIAMgH4VCLYkiA4UhGCAZIANCf4WDIBUgAoVCA4kiCYUhGSAEIAMgCUJ/hYOFIQcgCSAEQn+FgyAIhSEIIAwgAoUiAiAhQg6JIgNCf4WDIBMgBYVCFYkiBIUhCSAGIBaFQiuJIgUgAyAEQn+Fg4UhCiAEIAVCf4WDICBCLIkiBIUhCyAAQdAJaikDACAFIARCf4WDhSAChSEMICcgKEJ/hYMgKoUiBSEfIAMgBCACQn+Fg4UiAiEaICogKUJ/hYMgEoUiAyEeIC0gLkJ/hYMgG4UiBCEWICYgJCAlQn+Fg4UiBiEdIBsgK0J/hYMgLIUiKCEVICMgJiAiQn+Fg4UiIiEcIC4gLCAtQn+Fg4UiJiEbICcgKSASQn+Fg4UiJyETICMgJEJ/hYMgJYUiIyESIABBCGoiAA0AC0EAIBE3A6iLAUEAIAU3A4CLAUEAIBc3A9iKAUEAIAc3A7CKAUEAIAs3A4iKAUEAIA83A8CLAUEAIAM3A5iLAUEAIBA3A/CKAUEAIBQ3A8iKAUEAIAI3A6CKAUEAIAY3A7CLAUEAIA43A4iLAUEAIAQ3A+CKAUEAIBk3A7iKAUEAIAo3A5CKAUEAICI3A6CLAUEAIA03A/iKAUEAICg3A9CKAUEAIAg3A6iKAUEAIAw3A4CKAUEAICM3A7iLAUEAICc3A5CLAUEAICY3A+iKAUEAIBg3A8CKAUEAIAk3A5iKAQv4AgEFf0HkAEEAKAKMjQEiAUEBdmshAgJAQQAoAoiNASIDQQBIDQAgASEEAkAgASADRg0AIANByIsBaiEFQQAhAwNAIAUgA2pBADoAACADQQFqIgMgAUEAKAKIjQEiBGtJDQALCyAEQciLAWoiAyADLQAAIAByOgAAIAFBx4sBaiIDIAMtAABBgAFyOgAAQciLASABEANBAEGAgICAeDYCiI0BCwJAIAJBBEkNACACQQJ2IgNBA3EhBUEAIQQCQCADQX9qQQNJDQAgA0H8////A3EhAUEAIQNBACEEA0AgA0GACmogA0GAigFqKAIANgIAIANBhApqIANBhIoBaigCADYCACADQYgKaiADQYiKAWooAgA2AgAgA0GMCmogA0GMigFqKAIANgIAIANBEGohAyABIARBBGoiBEcNAAsLIAVFDQAgBUECdCEBIARBAnQhAwNAIANBgApqIANBgIoBaigCADYCACADQQRqIQMgAUF8aiIBDQALCwsGAEGAigEL0QYBA39BAEIANwOAjQFBAEIANwP4jAFBAEIANwPwjAFBAEIANwPojAFBAEIANwPgjAFBAEIANwPYjAFBAEIANwPQjAFBAEIANwPIjAFBAEIANwPAjAFBAEIANwO4jAFBAEIANwOwjAFBAEIANwOojAFBAEIANwOgjAFBAEIANwOYjAFBAEIANwOQjAFBAEIANwOIjAFBAEIANwOAjAFBAEIANwP4iwFBAEIANwPwiwFBAEIANwPoiwFBAEIANwPgiwFBAEIANwPYiwFBAEIANwPQiwFBAEIANwPIiwFBAEIANwPAiwFBAEIANwO4iwFBAEIANwOwiwFBAEIANwOoiwFBAEIANwOgiwFBAEIANwOYiwFBAEIANwOQiwFBAEIANwOIiwFBAEIANwOAiwFBAEIANwP4igFBAEIANwPwigFBAEIANwPoigFBAEIANwPgigFBAEIANwPYigFBAEIANwPQigFBAEIANwPIigFBAEIANwPAigFBAEIANwO4igFBAEIANwOwigFBAEIANwOoigFBAEIANwOgigFBAEIANwOYigFBAEIANwOQigFBAEIANwOIigFBAEIANwOAigFBAEHADCABQQF0a0EDdjYCjI0BQQBBADYCiI0BIAAQAkHkAEEAKAKMjQEiAEEBdmshAwJAQQAoAoiNASIBQQBIDQAgACEEAkAgACABRg0AIAFByIsBaiEFQQAhAQNAIAUgAWpBADoAACABQQFqIgEgAEEAKAKIjQEiBGtJDQALCyAEQciLAWoiASABLQAAIAJyOgAAIABBx4sBaiIBIAEtAABBgAFyOgAAQciLASAAEANBAEGAgICAeDYCiI0BCwJAIANBBEkNACADQQJ2IgFBA3EhBUEAIQQCQCABQX9qQQNJDQAgAUH8////A3EhAEEAIQFBACEEA0AgAUGACmogAUGAigFqKAIANgIAIAFBhApqIAFBhIoBaigCADYCACABQYgKaiABQYiKAWooAgA2AgAgAUGMCmogAUGMigFqKAIANgIAIAFBEGohASAAIARBBGoiBEcNAAsLIAVFDQAgBUECdCEAIARBAnQhAQNAIAFBgApqIAFBgIoBaigCADYCACABQQRqIQEgAEF8aiIADQALCwsL2AEBAEGACAvQAZABAAAAAAAAAAAAAAAAAAABAAAAAAAAAIKAAAAAAAAAioAAAAAAAIAAgACAAAAAgIuAAAAAAAAAAQAAgAAAAACBgACAAAAAgAmAAAAAAACAigAAAAAAAACIAAAAAAAAAAmAAIAAAAAACgAAgAAAAACLgACAAAAAAIsAAAAAAACAiYAAAAAAAIADgAAAAAAAgAKAAAAAAACAgAAAAAAAAIAKgAAAAAAAAAoAAIAAAACAgYAAgAAAAICAgAAAAAAAgAEAAIAAAAAACIAAgAAAAIA=";
16213
+ var hash$b = "f2f6f5b2";
16214
+ var wasmJson$b = {
16215
+ name: name$b,
16216
+ data: data$b,
16217
+ hash: hash$b
16218
+ };
16145
16219
 
16146
- const d = new BN(seckey);
16147
- if (d.cmp(ecparams.n) >= 0 || d.isZero()) return 1
16220
+ new Mutex();
16148
16221
 
16149
- let sig;
16150
- try {
16151
- sig = ec.sign(message, seckey, { canonical: true, k: noncefn, pers: data });
16152
- } catch (err) {
16153
- return 1
16222
+ new Mutex();
16223
+ function validateBits(bits) {
16224
+ if (![224, 256, 384, 512].includes(bits)) {
16225
+ return new Error('Invalid variant! Valid values: 224, 256, 384, 512');
16154
16226
  }
16155
-
16156
- obj.signature.set(sig.r.toArrayLike(Uint8Array, 'be', 32), 0);
16157
- obj.signature.set(sig.s.toArrayLike(Uint8Array, 'be', 32), 32);
16158
- obj.recid = sig.recoveryParam;
16159
-
16160
- return 0
16161
- },
16162
-
16163
- ecdsaVerify (sig, msg32, pubkey) {
16164
- const sigObj = { r: sig.subarray(0, 32), s: sig.subarray(32, 64) };
16165
-
16166
- const sigr = new BN(sigObj.r);
16167
- const sigs = new BN(sigObj.s);
16168
- if (sigr.cmp(ecparams.n) >= 0 || sigs.cmp(ecparams.n) >= 0) return 1
16169
- if (sigs.cmp(ec.nh) === 1 || sigr.isZero() || sigs.isZero()) return 3
16170
-
16171
- const pair = loadPublicKey(pubkey);
16172
- if (pair === null) return 2
16173
-
16174
- const point = pair.getPublic();
16175
- const isValid = ec.verify(msg32, sigObj, point);
16176
- return isValid ? 0 : 3
16177
- },
16178
-
16179
- ecdsaRecover (output, sig, recid, msg32) {
16180
- const sigObj = { r: sig.slice(0, 32), s: sig.slice(32, 64) };
16181
-
16182
- const sigr = new BN(sigObj.r);
16183
- const sigs = new BN(sigObj.s);
16184
- if (sigr.cmp(ecparams.n) >= 0 || sigs.cmp(ecparams.n) >= 0) return 1
16185
-
16186
- if (sigr.isZero() || sigs.isZero()) return 2
16187
-
16188
- // Can throw `throw new Error('Unable to find sencond key candinate');`
16189
- let point;
16190
- try {
16191
- point = ec.recoverPubKey(msg32, sigObj, recid);
16192
- } catch (err) {
16193
- return 2
16227
+ return null;
16228
+ }
16229
+ /**
16230
+ * Creates a new Keccak hash instance
16231
+ * @param bits Number of output bits. Valid values: 224, 256, 384, 512
16232
+ */
16233
+ function createKeccak(bits = 512) {
16234
+ if (validateBits(bits)) {
16235
+ return Promise.reject(validateBits(bits));
16194
16236
  }
16237
+ const outputSize = bits / 8;
16238
+ return WASMInterface(wasmJson$b, outputSize).then((wasm) => {
16239
+ wasm.init(bits);
16240
+ const obj = {
16241
+ init: () => { wasm.init(bits); return obj; },
16242
+ update: (data) => { wasm.update(data); return obj; },
16243
+ digest: (outputType) => wasm.digest(outputType, 0x01),
16244
+ save: () => wasm.save(),
16245
+ load: (data) => { wasm.load(data); return obj; },
16246
+ blockSize: 200 - 2 * outputSize,
16247
+ digestSize: outputSize,
16248
+ };
16249
+ return obj;
16250
+ });
16251
+ }
16195
16252
 
16196
- savePublicKey(output, point);
16197
-
16198
- return 0
16199
- },
16200
-
16201
- ecdh (output, pubkey, seckey, data, hashfn, xbuf, ybuf) {
16202
- const pair = loadPublicKey(pubkey);
16203
- if (pair === null) return 1
16204
-
16205
- const scalar = new BN(seckey);
16206
- if (scalar.cmp(ecparams.n) >= 0 || scalar.isZero()) return 2
16207
-
16208
- const point = pair.getPublic().mul(scalar);
16253
+ new Mutex();
16209
16254
 
16210
- if (hashfn === undefined) {
16211
- const data = point.encode(null, true);
16212
- const sha256 = ec.hash().update(data).digest();
16213
- for (let i = 0; i < 32; ++i) output[i] = sha256[i];
16214
- } else {
16215
- if (!xbuf) xbuf = new Uint8Array(32);
16216
- const x = point.getX().toArray('be', 32);
16217
- for (let i = 0; i < 32; ++i) xbuf[i] = x[i];
16255
+ new Mutex();
16218
16256
 
16219
- if (!ybuf) ybuf = new Uint8Array(32);
16220
- const y = point.getY().toArray('be', 32);
16221
- for (let i = 0; i < 32; ++i) ybuf[i] = y[i];
16257
+ var name$9 = "sha512";
16258
+ var data$9 = "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";
16259
+ var hash$9 = "cdd57f6a";
16260
+ var wasmJson$9 = {
16261
+ name: name$9,
16262
+ data: data$9,
16263
+ hash: hash$9
16264
+ };
16222
16265
 
16223
- const hash = hashfn(xbuf, ybuf, data);
16266
+ new Mutex();
16224
16267
 
16225
- const isValid = hash instanceof Uint8Array && hash.length === output.length;
16226
- if (!isValid) return 2
16268
+ new Mutex();
16269
+ /**
16270
+ * Creates a new SHA-2 (SHA-512) hash instance
16271
+ */
16272
+ function createSHA512() {
16273
+ return WASMInterface(wasmJson$9, 64).then((wasm) => {
16274
+ wasm.init(512);
16275
+ const obj = {
16276
+ init: () => { wasm.init(512); return obj; },
16277
+ update: (data) => { wasm.update(data); return obj; },
16278
+ digest: (outputType) => wasm.digest(outputType),
16279
+ save: () => wasm.save(),
16280
+ load: (data) => { wasm.load(data); return obj; },
16281
+ blockSize: 128,
16282
+ digestSize: 64,
16283
+ };
16284
+ return obj;
16285
+ });
16286
+ }
16227
16287
 
16228
- output.set(hash);
16229
- }
16288
+ new Mutex();
16230
16289
 
16231
- return 0
16232
- }
16233
- };
16290
+ new Mutex();
16234
16291
 
16235
- var elliptic = lib(elliptic$1);
16292
+ new Mutex();
16236
16293
 
16237
- var secp256k1 = /*@__PURE__*/getDefaultExportFromCjs(elliptic);
16294
+ new Mutex();
16238
16295
 
16239
- const leofcoinOlivia = {
16240
- messagePrefix: '\u0019Leofcoin Signed Message:',
16241
- version: 1,
16242
- pubKeyHash: 0x73,
16243
- scriptHash: 0x76,
16244
- multiTxHash: 0x8b4125,
16245
- payments: {
16246
- version: 0,
16247
- unspent: 0x1fa443d7 // ounsp
16248
- },
16249
- wif: 0x7D,
16250
- multiCodec: 0x7c4,
16251
- bip32: { public: 0x13BBF2D5, private: 0x13BBCBC5 }
16252
- };
16253
- const bitcoinTestnet = {
16254
- messagePrefix: '\x18Bitcoin Signed Message:\n',
16255
- version: 1,
16256
- bech32: 'tb',
16257
- pubKeyHash: 0x6f,
16258
- scriptHash: 0xc4,
16259
- wif: 0xef,
16260
- bip32: {
16261
- public: 0x043587cf,
16262
- private: 0x04358394
16263
- },
16264
- multiCodec: 0
16265
- };
16266
- var testnets = {
16267
- 'leofcoin:olivia': leofcoinOlivia,
16268
- 'bitcoin:testnet': bitcoinTestnet
16296
+ var name$4 = "ripemd160";
16297
+ var data$4 = "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";
16298
+ var hash$4 = "c089a7ca";
16299
+ var wasmJson$4 = {
16300
+ name: name$4,
16301
+ data: data$4,
16302
+ hash: hash$4
16269
16303
  };
16270
16304
 
16271
- // https://en.bitcoin.it/wiki/List_of_address_prefixes
16272
- // usage:
16273
- // networks['bitcoin']['testnet']
16274
- // networks.bitcoin.testnet
16305
+ new Mutex();
16275
16306
  /**
16276
- * Main network
16277
- * @return {messagePrefix, pubKeyHash, scriptHash, wif, bip32}
16307
+ * Creates a new RIPEMD-160 hash instance
16278
16308
  */
16279
- const leofcoin = {
16280
- messagePrefix: '\u0019Leofcoin Signed Message:',
16281
- version: 1,
16282
- pubKeyHash: 0x30,
16283
- scriptHash: 0x37,
16284
- multiTxHash: 0x3adeed,
16285
- payments: {
16286
- version: 0,
16287
- unspent: 0x0d6e0327 // Lunsp
16288
- },
16289
- coin_type: 640,
16290
- wif: 0x3F,
16291
- multiCodec: 0x3c4,
16292
- bip32: { public: 0x13BBF2D4, private: 0x13BBCBC4 },
16293
- testnet: testnets['leofcoin:olivia']
16294
- };
16295
- const bitcoin = {
16296
- messagePrefix: '\x18Bitcoin Signed Message:\n',
16297
- version: 1,
16298
- bech32: 'bc',
16299
- pubKeyHash: 0x00,
16300
- multiCodec: 0x00,
16301
- scriptHash: 0x05,
16302
- wif: 0x80,
16303
- coin_type: 0,
16304
- bip32: {
16305
- public: 0x0488b21e, private: 0x0488ade4
16306
- },
16307
- testnet: testnets['bitcoin:testnet']
16308
- };
16309
- const litecoin = {
16310
- messagePrefix: '\x19Litecoin Signed Message:\n',
16311
- version: 1,
16312
- pubKeyHash: 0x30,
16313
- scriptHash: 0x32,
16314
- wif: 0xb0,
16315
- bip32: {
16316
- public: 0x019da462,
16317
- private: 0x019d9cfe
16318
- },
16319
- bech32: '',
16320
- multiCodec: 0
16321
- };
16322
- const ethereum = {
16323
- messagePrefix: '\x19Ethereum Signed Message:\n',
16324
- version: 1,
16325
- pubKeyHash: 0x30,
16326
- scriptHash: 0x32,
16327
- bip32: {
16328
- private: 0x0488ADE4, public: 0x0488B21E
16329
- },
16330
- coin_type: 60,
16331
- wif: 0x45,
16332
- multiCodec: 0x3c5
16333
- };
16309
+ function createRIPEMD160() {
16310
+ return WASMInterface(wasmJson$4, 20).then((wasm) => {
16311
+ wasm.init();
16312
+ const obj = {
16313
+ init: () => { wasm.init(); return obj; },
16314
+ update: (data) => { wasm.update(data); return obj; },
16315
+ digest: (outputType) => wasm.digest(outputType),
16316
+ save: () => wasm.save(),
16317
+ load: (data) => { wasm.load(data); return obj; },
16318
+ blockSize: 64,
16319
+ digestSize: 20,
16320
+ };
16321
+ return obj;
16322
+ });
16323
+ }
16324
+
16325
+ function calculateKeyBuffer(hasher, key) {
16326
+ const { blockSize } = hasher;
16327
+ const buf = getUInt8Buffer(key);
16328
+ if (buf.length > blockSize) {
16329
+ hasher.update(buf);
16330
+ const uintArr = hasher.digest('binary');
16331
+ hasher.init();
16332
+ return uintArr;
16333
+ }
16334
+ return new Uint8Array(buf.buffer, buf.byteOffset, buf.length);
16335
+ }
16336
+ function calculateHmac(hasher, key) {
16337
+ hasher.init();
16338
+ const { blockSize } = hasher;
16339
+ const keyBuf = calculateKeyBuffer(hasher, key);
16340
+ const keyBuffer = new Uint8Array(blockSize);
16341
+ keyBuffer.set(keyBuf);
16342
+ const opad = new Uint8Array(blockSize);
16343
+ for (let i = 0; i < blockSize; i++) {
16344
+ const v = keyBuffer[i];
16345
+ opad[i] = v ^ 0x5C;
16346
+ keyBuffer[i] = v ^ 0x36;
16347
+ }
16348
+ hasher.update(keyBuffer);
16349
+ const obj = {
16350
+ init: () => {
16351
+ hasher.init();
16352
+ hasher.update(keyBuffer);
16353
+ return obj;
16354
+ },
16355
+ update: (data) => {
16356
+ hasher.update(data);
16357
+ return obj;
16358
+ },
16359
+ digest: ((outputType) => {
16360
+ const uintArr = hasher.digest('binary');
16361
+ hasher.init();
16362
+ hasher.update(opad);
16363
+ hasher.update(uintArr);
16364
+ return hasher.digest(outputType);
16365
+ }),
16366
+ save: () => {
16367
+ throw new Error('save() not supported');
16368
+ },
16369
+ load: () => {
16370
+ throw new Error('load() not supported');
16371
+ },
16372
+ blockSize: hasher.blockSize,
16373
+ digestSize: hasher.digestSize,
16374
+ };
16375
+ return obj;
16376
+ }
16334
16377
  /**
16335
- * Our & supported networks
16336
- * @return {leofcoin, olivia}
16378
+ * Calculates HMAC hash
16379
+ * @param hash Hash algorithm to use. It has to be the return value of a function like createSHA1()
16380
+ * @param key Key (string, Buffer or TypedArray)
16337
16381
  */
16338
- var networks = {
16339
- leofcoin,
16340
- bitcoin,
16341
- litecoin,
16342
- ethereum
16343
- };
16382
+ function createHMAC(hash, key) {
16383
+ if (!hash || !hash.then) {
16384
+ throw new Error('Invalid hash function is provided! Usage: createHMAC(createMD5(), "key").');
16385
+ }
16386
+ return hash.then((hasher) => calculateHmac(hasher, key));
16387
+ }
16388
+
16389
+ new Mutex();
16390
+
16391
+ new Mutex();
16344
16392
 
16345
16393
  const encode$1 = (version, privateKey, compressed) => {
16346
16394
  if (privateKey.length !== 32)
@@ -20128,7 +20176,7 @@ class Identity {
20128
20176
  this.selectedAccount = new TextDecoder().decode(selected);
20129
20177
  }
20130
20178
  else {
20131
- const importee = await import(/* webpackChunkName: "generate-account" */ './index-329e0324.js');
20179
+ const importee = await import(/* webpackChunkName: "generate-account" */ './index-8868bdd8.js');
20132
20180
  const { identity, accounts } = await importee.default(password, this.network);
20133
20181
  await globalThis.accountStore.put('public', JSON.stringify({ walletId: identity.walletId }));
20134
20182
  await globalThis.walletStore.put('version', String(1));
@@ -20224,17 +20272,20 @@ class Peernet {
20224
20272
  /**
20225
20273
  * @property {String} network - current network
20226
20274
  */
20227
- this.network = options.network || 'leofcoin';
20275
+ this.network = options.network || "leofcoin";
20228
20276
  this.autoStart = options.autoStart === undefined ? true : options.autoStart;
20229
20277
  this.stars = options.stars;
20230
- const parts = this.network.split(':');
20231
- this.networkVersion = options.networkVersion || parts.length > 1 ? parts[1] : 'mainnet';
20278
+ const parts = this.network.split(":");
20279
+ this.networkVersion =
20280
+ options.networkVersion || parts.length > 1 ? parts[1] : "mainnet";
20232
20281
  if (!options.storePrefix)
20233
- options.storePrefix = 'lfc';
20282
+ options.storePrefix = "lfc";
20234
20283
  if (!options.port)
20235
20284
  options.port = 2000;
20236
20285
  if (!options.root) {
20237
- parts[1] ? options.root = `.${parts[0]}/${parts[1]}` : options.root = `.${this.network}`;
20286
+ parts[1]
20287
+ ? (options.root = `.${parts[0]}/${parts[1]}`)
20288
+ : (options.root = `.${this.network}`);
20238
20289
  }
20239
20290
  globalThis.peernet = this;
20240
20291
  this.bw = {
@@ -20254,7 +20305,15 @@ class Peernet {
20254
20305
  return this.identity.accounts;
20255
20306
  }
20256
20307
  get defaultStores() {
20257
- return ['account', 'wallet', 'block', 'transaction', 'chain', 'data', 'message'];
20308
+ return [
20309
+ "account",
20310
+ "wallet",
20311
+ "block",
20312
+ "transaction",
20313
+ "chain",
20314
+ "data",
20315
+ "message",
20316
+ ];
20258
20317
  }
20259
20318
  selectAccount(account) {
20260
20319
  return this.identity.selectAccount(account);
@@ -20267,11 +20326,16 @@ class Peernet {
20267
20326
  return utils$p.addCodec(codec);
20268
20327
  }
20269
20328
  async addStore(name, prefix, root, isPrivate = true) {
20270
- if (name === 'block' || name === 'transaction' || name === 'chain' ||
20271
- name === 'data' || name === 'message')
20329
+ if (name === "block" ||
20330
+ name === "transaction" ||
20331
+ name === "chain" ||
20332
+ name === "data" ||
20333
+ name === "message")
20272
20334
  isPrivate = false;
20273
20335
  let Storage;
20274
- this.hasDaemon ? Storage = LeofcoinStorageClient : Storage = LeofcoinStorage;
20336
+ this.hasDaemon
20337
+ ? (Storage = LeofcoinStorageClient)
20338
+ : (Storage = LeofcoinStorage);
20275
20339
  if (!globalThis[`${name}Store`]) {
20276
20340
  globalThis[`${name}Store`] = new Storage(name, root);
20277
20341
  await globalThis[`${name}Store`].init();
@@ -20317,9 +20381,9 @@ class Peernet {
20317
20381
  async _init(options, password) {
20318
20382
  this.storePrefix = options.storePrefix;
20319
20383
  this.root = options.root;
20320
- const { RequestMessage, ResponseMessage, PeerMessage, PeerMessageResponse, PeernetMessage, DHTMessage, DHTMessageResponse, DataMessage, DataMessageResponse, PsMessage, ChatMessage, PeernetFile
20384
+ const { RequestMessage, ResponseMessage, PeerMessage, PeerMessageResponse, PeernetMessage, DHTMessage, DHTMessageResponse, DataMessage, DataMessageResponse, PsMessage, ChatMessage, PeernetFile,
20321
20385
  // FolderMessageResponse
20322
- } = await import(/* webpackChunkName: "messages" */ './messages-000b7f84.js');
20386
+ } = await import(/* webpackChunkName: "messages" */ './messages-eb6e5c71.js');
20323
20387
  /**
20324
20388
  * proto Object containing protos
20325
20389
  * @type {Object}
@@ -20330,18 +20394,18 @@ class Peernet {
20330
20394
  * @property {DataMessageResponse} protos[peernet-data-response] messageNode
20331
20395
  */
20332
20396
  globalThis.peernet.protos = {
20333
- 'peernet-request': RequestMessage,
20334
- 'peernet-response': ResponseMessage,
20335
- 'peernet-peer': PeerMessage,
20336
- 'peernet-peer-response': PeerMessageResponse,
20337
- 'peernet-message': PeernetMessage,
20338
- 'peernet-dht': DHTMessage,
20339
- 'peernet-dht-response': DHTMessageResponse,
20340
- 'peernet-data': DataMessage,
20341
- 'peernet-data-response': DataMessageResponse,
20342
- 'peernet-ps': PsMessage,
20343
- 'chat-message': ChatMessage,
20344
- 'peernet-file': PeernetFile
20397
+ "peernet-request": RequestMessage,
20398
+ "peernet-response": ResponseMessage,
20399
+ "peernet-peer": PeerMessage,
20400
+ "peernet-peer-response": PeerMessageResponse,
20401
+ "peernet-message": PeernetMessage,
20402
+ "peernet-dht": DHTMessage,
20403
+ "peernet-dht-response": DHTMessageResponse,
20404
+ "peernet-data": DataMessage,
20405
+ "peernet-data-response": DataMessageResponse,
20406
+ "peernet-ps": PsMessage,
20407
+ "chat-message": ChatMessage,
20408
+ "peernet-file": PeernetFile,
20345
20409
  };
20346
20410
  this._messageHandler = new MessageHandler(this.network);
20347
20411
  const { daemon, environment } = await target();
@@ -20353,38 +20417,44 @@ class Peernet {
20353
20417
  await this.identity.load(password);
20354
20418
  this._peerHandler = new PeerDiscovery(this.id);
20355
20419
  this.peerId = this.id;
20356
- this.addRequestHandler('handshake', () => {
20357
- return new peernet.protos['peernet-response']({ response: { peerId: this.id } });
20420
+ this.addRequestHandler("handshake", () => {
20421
+ return new peernet.protos["peernet-response"]({
20422
+ response: { peerId: this.id },
20423
+ });
20358
20424
  });
20359
- pubsub.subscribe('peer:discovered', async (peer) => {
20425
+ pubsub.subscribe("peer:discovered", async (peer) => {
20360
20426
  // console.log(peer);
20361
- if (this.requestProtos['version']) {
20362
- let data = await new globalThis.peernet.protos['peernet-request']({ request: 'version' });
20427
+ if (this.requestProtos["version"]) {
20428
+ let data = await new globalThis.peernet.protos["peernet-request"]({
20429
+ request: "version",
20430
+ });
20363
20431
  let node = await globalThis.peernet.prepareMessage(data);
20364
20432
  let response = await peer.request(node.encoded);
20365
- response = await new globalThis.peernet.protos['peernet-response'](new Uint8Array(Object.values(response)));
20433
+ response = await new globalThis.peernet.protos["peernet-response"](new Uint8Array(Object.values(response)));
20366
20434
  peer.version = response.decoded.response.version;
20367
20435
  }
20368
- let data = await new globalThis.peernet.protos['peernet-request']({ request: 'handshake' });
20436
+ let data = await new globalThis.peernet.protos["peernet-request"]({
20437
+ request: "handshake",
20438
+ });
20369
20439
  let node = await globalThis.peernet.prepareMessage(data);
20370
20440
  let response = await peer.request(node.encoded);
20371
- response = await new globalThis.peernet.protos['peernet-response'](new Uint8Array(Object.values(response)));
20441
+ response = await new globalThis.peernet.protos["peernet-response"](new Uint8Array(Object.values(response)));
20372
20442
  // todo: response.decoded should be the response and not response.peerId
20373
20443
  this.#connections[response.decoded.response.peerId] = peer;
20374
- pubsub.publish('peer:connected', peer);
20444
+ pubsub.publish("peer:connected", peer);
20375
20445
  // todo: cleanup discovered
20376
20446
  });
20377
- pubsub.subscribe('peer:left', this.#peerLeft.bind(this));
20447
+ pubsub.subscribe("peer:left", this.#peerLeft.bind(this));
20378
20448
  /**
20379
20449
  * converts data -> message -> proto
20380
20450
  * @see DataHandler
20381
20451
  */
20382
- pubsub.subscribe('peer:data', dataHandler);
20452
+ pubsub.subscribe("peer:data", dataHandler);
20383
20453
  if (globalThis.navigator) {
20384
- globalThis.addEventListener('beforeunload', async () => this.client.destroy());
20454
+ globalThis.addEventListener("beforeunload", async () => this.client.destroy());
20385
20455
  }
20386
20456
  else {
20387
- process.on('SIGTERM', async () => {
20457
+ process.on("SIGTERM", async () => {
20388
20458
  process.stdin.resume();
20389
20459
  try {
20390
20460
  await this.client.destroy();
@@ -20415,7 +20485,9 @@ class Peernet {
20415
20485
  }
20416
20486
  #peerLeft(peer) {
20417
20487
  for (const [id, _peer] of Object.entries(this.#connections)) {
20418
- if (_peer.id === peer.id && this.#connections[id] && !this.#connections[id].connected) {
20488
+ if (_peer.id === peer.id &&
20489
+ this.#connections[id] &&
20490
+ !this.#connections[id].connected) {
20419
20491
  delete this.#connections[id];
20420
20492
  this.removePeer(_peer);
20421
20493
  }
@@ -20442,18 +20514,26 @@ class Peernet {
20442
20514
  else {
20443
20515
  has = await this.has(hash);
20444
20516
  }
20445
- const data = await new globalThis.peernet.protos['peernet-dht-response']({ hash, has });
20517
+ const data = await new globalThis.peernet.protos["peernet-dht-response"]({
20518
+ hash,
20519
+ has,
20520
+ });
20446
20521
  const node = await this.prepareMessage(data);
20447
20522
  this.sendMessage(peer, id, node.encoded);
20448
20523
  }
20449
20524
  async handleData(peer, id, proto) {
20450
20525
  let { hash, store } = proto.decoded;
20451
20526
  let data;
20452
- store = globalThis[`${store}Store`] || await this.whichStore([...this.stores], hash);
20527
+ store =
20528
+ globalThis[`${store}Store`] ||
20529
+ (await this.whichStore([...this.stores], hash));
20453
20530
  if (store && !store.private) {
20454
20531
  data = await store.get(hash);
20455
20532
  if (data) {
20456
- data = await new globalThis.peernet.protos['peernet-data-response']({ hash, data });
20533
+ data = await new globalThis.peernet.protos["peernet-data-response"]({
20534
+ hash,
20535
+ data,
20536
+ });
20457
20537
  const node = await this.prepareMessage(data);
20458
20538
  this.sendMessage(peer, id, node.encoded);
20459
20539
  }
@@ -20477,21 +20557,20 @@ class Peernet {
20477
20557
  const { id, proto } = message;
20478
20558
  this.bw.down += proto.encoded.length;
20479
20559
  switch (proto.name) {
20480
- case 'peernet-dht': {
20560
+ case "peernet-dht": {
20481
20561
  this.handleDHT(peer, id, proto);
20482
20562
  break;
20483
20563
  }
20484
- case 'peernet-data': {
20564
+ case "peernet-data": {
20485
20565
  this.handleData(peer, id, proto);
20486
20566
  break;
20487
20567
  }
20488
- case 'peernet-request': {
20568
+ case "peernet-request": {
20489
20569
  this.handleRequest(peer, id, proto);
20490
20570
  break;
20491
20571
  }
20492
- case 'peernet-ps': {
20493
- if (peer.peerId !== this.id)
20494
- globalSub.publish(proto.decoded.topic, proto.decoded.data);
20572
+ case "peernet-ps": {
20573
+ globalSub.publish(new TextDecoder().decode(proto.decoded.topic), proto.decoded.data);
20495
20574
  }
20496
20575
  }
20497
20576
  }
@@ -20502,14 +20581,14 @@ class Peernet {
20502
20581
  */
20503
20582
  async walk(hash) {
20504
20583
  if (!hash)
20505
- throw new Error('hash expected, received undefined');
20506
- const data = await new globalThis.peernet.protos['peernet-dht']({ hash });
20584
+ throw new Error("hash expected, received undefined");
20585
+ const data = await new globalThis.peernet.protos["peernet-dht"]({ hash });
20507
20586
  const walk = async (peer, peerId) => {
20508
20587
  const node = await this.prepareMessage(data);
20509
20588
  let result = await peer.request(node.encoded);
20510
20589
  result = new Uint8Array(Object.values(result));
20511
20590
  const proto = await protoFor(result);
20512
- if (proto.name !== 'peernet-dht-response')
20591
+ if (proto.name !== "peernet-dht-response")
20513
20592
  throw dhtError(proto.name);
20514
20593
  const peerInfo = {
20515
20594
  ...peer.connectionStats,
@@ -20535,7 +20614,8 @@ class Peernet {
20535
20614
  let providers = this.dht.providersFor(hash);
20536
20615
  // walk the network to find a provider
20537
20616
  let tries = 0;
20538
- while (!providers && tries < 3 || Object.keys(providers).length === 0 && tries < 3) {
20617
+ while ((!providers && tries < 3) ||
20618
+ (Object.keys(providers).length === 0 && tries < 3)) {
20539
20619
  tries += 1;
20540
20620
  await this.walk(hash);
20541
20621
  providers = this.dht.providersFor(hash);
@@ -20549,7 +20629,7 @@ class Peernet {
20549
20629
  const data = await blockStore.has(hash);
20550
20630
  if (data)
20551
20631
  return blockStore.get(hash);
20552
- return this.requestData(hash, 'block');
20632
+ return this.requestData(hash, "block");
20553
20633
  },
20554
20634
  put: async (hash, data) => {
20555
20635
  if (await blockStore.has(hash))
@@ -20565,7 +20645,7 @@ class Peernet {
20565
20645
  const data = await transactionStore.has(hash);
20566
20646
  if (data)
20567
20647
  return await transactionStore.get(hash);
20568
- return this.requestData(hash, 'transaction');
20648
+ return this.requestData(hash, "transaction");
20569
20649
  },
20570
20650
  put: async (hash, data) => {
20571
20651
  if (await transactionStore.has(hash))
@@ -20577,7 +20657,7 @@ class Peernet {
20577
20657
  }
20578
20658
  async requestData(hash, store) {
20579
20659
  const providers = await this.providersFor(hash);
20580
- if (!providers || providers && Object.keys(providers).length === 0)
20660
+ if (!providers || (providers && Object.keys(providers).length === 0))
20581
20661
  throw nothingFoundError(hash);
20582
20662
  debug(`found ${Object.keys(providers).length} provider(s) for ${hash}`);
20583
20663
  // get closest peer on earth
@@ -20588,7 +20668,10 @@ class Peernet {
20588
20668
  const id = closestPeer.id;
20589
20669
  const peer = this.#connections[id];
20590
20670
  if (peer?.connected) {
20591
- let data = await new globalThis.peernet.protos['peernet-data']({ hash, store: store?.name || store });
20671
+ let data = await new globalThis.peernet.protos["peernet-data"]({
20672
+ hash,
20673
+ store: store?.name || store,
20674
+ });
20592
20675
  const node = await this.prepareMessage(data);
20593
20676
  if (peer)
20594
20677
  data = await peer.request(node.encoded);
@@ -20627,7 +20710,7 @@ class Peernet {
20627
20710
  const message = await messageStore.has(hash);
20628
20711
  if (message)
20629
20712
  return await messageStore.get(hash);
20630
- return this.requestData(hash, 'message');
20713
+ return this.requestData(hash, "message");
20631
20714
  },
20632
20715
  /**
20633
20716
  * put message content
@@ -20655,7 +20738,7 @@ class Peernet {
20655
20738
  const data = await dataStore.has(hash);
20656
20739
  if (data)
20657
20740
  return await dataStore.get(hash);
20658
- return this.requestData(hash, 'data');
20741
+ return this.requestData(hash, "data");
20659
20742
  },
20660
20743
  /**
20661
20744
  * put data content
@@ -20683,7 +20766,7 @@ class Peernet {
20683
20766
  const data = await dataStore.has(hash);
20684
20767
  if (data)
20685
20768
  return await dataStore.get(hash);
20686
- return this.requestData(hash, 'data');
20769
+ return this.requestData(hash, "data");
20687
20770
  },
20688
20771
  /**
20689
20772
  * put data content
@@ -20702,12 +20785,15 @@ class Peernet {
20702
20785
  async addFolder(files) {
20703
20786
  const links = [];
20704
20787
  for (const file of files) {
20705
- const fileNode = await new globalThis.peernet.protos['peernet-file'](file);
20788
+ const fileNode = await new globalThis.peernet.protos["peernet-file"](file);
20706
20789
  const hash = await fileNode.hash;
20707
20790
  await dataStore.put(hash, fileNode.encoded);
20708
20791
  links.push({ hash, path: file.path });
20709
20792
  }
20710
- const node = await new globalThis.peernet.protos['peernet-file']({ path: '/', links });
20793
+ const node = await new globalThis.peernet.protos["peernet-file"]({
20794
+ path: "/",
20795
+ links,
20796
+ });
20711
20797
  const hash = await node.hash;
20712
20798
  await dataStore.put(hash, node.encoded);
20713
20799
  return hash;
@@ -20715,8 +20801,10 @@ class Peernet {
20715
20801
  async ls(hash, options) {
20716
20802
  let data;
20717
20803
  const has = await dataStore.has(hash);
20718
- data = has ? await dataStore.get(hash) : await this.requestData(hash, 'data');
20719
- const node = await new peernet.protos['peernet-file'](data);
20804
+ data = has
20805
+ ? await dataStore.get(hash)
20806
+ : await this.requestData(hash, "data");
20807
+ const node = await new peernet.protos["peernet-file"](data);
20720
20808
  await node.decode();
20721
20809
  console.log(data);
20722
20810
  const paths = [];
@@ -20732,8 +20820,10 @@ class Peernet {
20732
20820
  async cat(hash, options) {
20733
20821
  let data;
20734
20822
  const has = await dataStore.has(hash);
20735
- data = has ? await dataStore.get(hash) : await this.requestData(hash, 'data');
20736
- const node = await new peernet.protos['peernet-file'](data);
20823
+ data = has
20824
+ ? await dataStore.get(hash)
20825
+ : await this.requestData(hash, "data");
20826
+ const node = await new peernet.protos["peernet-file"](data);
20737
20827
  if (node.decoded?.links.length > 0)
20738
20828
  throw new Error(`${hash} is a directory`);
20739
20829
  if (options?.pin)
@@ -20771,7 +20861,7 @@ class Peernet {
20771
20861
  store = globalThis[`${store}Store`];
20772
20862
  if (!store)
20773
20863
  store = await this.whichStore([...this.stores], hash);
20774
- if (store && await store.has(hash))
20864
+ if (store && (await store.has(hash)))
20775
20865
  data = await store.get(hash);
20776
20866
  if (data)
20777
20867
  return data;
@@ -20784,7 +20874,7 @@ class Peernet {
20784
20874
  * @param {Buffer} data
20785
20875
  * @param {String} storeName - storeName to access
20786
20876
  */
20787
- async put(hash, data, storeName = 'data') {
20877
+ async put(hash, data, storeName = "data") {
20788
20878
  const store = globalThis[`${storeName}Store`];
20789
20879
  return store.put(hash, data);
20790
20880
  }
@@ -20807,7 +20897,7 @@ class Peernet {
20807
20897
  async publish(topic, data) {
20808
20898
  // globalSub.publish(topic, data)
20809
20899
  const id = Math.random().toString(36).slice(-12);
20810
- data = await new globalThis.peernet.protos['peernet-ps']({ data, topic });
20900
+ data = await new globalThis.peernet.protos["peernet-ps"]({ data, topic });
20811
20901
  for (const [peerId, peer] of Object.entries(this.#connections)) {
20812
20902
  if (peerId !== this.id) {
20813
20903
  const node = await this.prepareMessage(data);
@@ -20829,7 +20919,7 @@ class Peernet {
20829
20919
  globalSub.subscribe(topic, callback);
20830
20920
  }
20831
20921
  async removePeer(peer) {
20832
- console.log('removepeer', peer.id);
20922
+ console.log("removepeer", peer.id);
20833
20923
  const id = peer.id;
20834
20924
  await this.client._removePeer(peer);
20835
20925
  if (this.client.peers[id]) {
@@ -20837,7 +20927,7 @@ class Peernet {
20837
20927
  // if (this.client.peers[id][connection].connected === false) delete this.client.peers[id][connection]
20838
20928
  // @ts-ignore
20839
20929
  if (this.client.peers[id][connection].connected)
20840
- return this.client.emit('peerconnect', connection);
20930
+ return this.client.emit("peerconnect", connection);
20841
20931
  }
20842
20932
  }
20843
20933
  }