@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.
- package/.esdoc.json +10 -10
- package/.eslintrc.json +24 -24
- package/.gitattributes +2 -2
- package/.travis.yml +27 -27
- package/BREAKING_CHANGES.md +34 -34
- package/LICENSE +21 -21
- package/README.md +72 -72
- package/deploy.js +8 -8
- package/exports/browser/{index-329e0324.js → index-8868bdd8.js} +1 -1
- package/exports/browser/{messages-000b7f84.js → messages-eb6e5c71.js} +174 -174
- package/exports/browser/{peernet-bfbe6fff.js → peernet-87ea02a4.js} +2005 -1915
- package/exports/browser/peernet.d.ts +13 -11
- package/exports/browser/peernet.js +1 -1
- package/exports/{messages-dc960cb3.js → messages-b9a32987.js} +173 -173
- package/exports/peernet.js +288 -246
- package/exports/src/prompts/password.js +3 -3
- package/exports/store.js +7 -8
- package/exports/types/peernet.d.ts +13 -11
- package/index.html +19 -19
- package/package.json +70 -70
- package/rollup.config.js +76 -69
- package/src/dht/dht.ts +141 -141
- package/src/discovery/peer-discovery.js +75 -75
- package/src/errors/errors.js +12 -12
- package/src/handlers/data.js +11 -11
- package/src/handlers/message.js +34 -34
- package/src/identity.ts +101 -101
- package/src/messages/chat.js +14 -14
- package/src/messages/data-response.js +14 -14
- package/src/messages/data.js +18 -18
- package/src/messages/dht-response.js +14 -14
- package/src/messages/dht.js +22 -22
- package/src/messages/file-link.js +18 -18
- package/src/messages/file.js +18 -18
- package/src/messages/peer-response.js +14 -14
- package/src/messages/peer.js +13 -13
- package/src/messages/peernet.js +14 -14
- package/src/messages/ps.js +13 -13
- package/src/messages/request.js +14 -14
- package/src/messages/response.js +14 -14
- package/src/messages.js +13 -13
- package/src/peer-info.js +9 -9
- package/src/peernet.ts +848 -776
- package/src/prompts/password/node.js +5 -5
- package/src/proto/chat-message.proto.js +6 -6
- package/src/proto/data-response.proto.js +4 -4
- package/src/proto/data.proto.js +4 -4
- package/src/proto/dht-response.proto.js +4 -4
- package/src/proto/dht.proto.js +4 -4
- package/src/proto/file-link.proto.js +5 -5
- package/src/proto/file.proto.js +5 -5
- package/src/proto/peer-response.proto.js +3 -3
- package/src/proto/peer.proto.js +3 -3
- package/src/proto/peernet.proto.js +7 -7
- package/src/proto/ps.proto.js +4 -4
- package/src/proto/request.proto.js +4 -4
- package/src/proto/response.proto.js +3 -3
- package/src/types.ts +27 -27
- package/src/utils/utils.js +78 -78
- package/test/client.js +14 -14
- package/test/codec.js +56 -56
- package/test/hash.js +13 -13
- package/test/index.js +3 -3
- package/test/lastBlock.js +7 -7
- package/test/messages.js +26 -26
- package/test/peernet.js +17 -17
- package/test.js +64 -64
- package/test2.js +9 -9
- package/test3.js +15 -15
- package/test4.js +7 -7
- 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
|
-
|
|
4966
|
-
|
|
4967
|
-
|
|
4968
|
-
|
|
4969
|
-
|
|
4970
|
-
|
|
4971
|
-
|
|
4972
|
-
|
|
4973
|
-
|
|
4974
|
-
|
|
4975
|
-
|
|
4976
|
-
|
|
4977
|
-
|
|
4978
|
-
|
|
4979
|
-
|
|
4980
|
-
|
|
4981
|
-
|
|
4982
|
-
|
|
4983
|
-
|
|
4984
|
-
|
|
4985
|
-
|
|
4986
|
-
|
|
4987
|
-
|
|
4988
|
-
|
|
4989
|
-
|
|
4990
|
-
|
|
4991
|
-
|
|
4992
|
-
|
|
4993
|
-
|
|
4994
|
-
}
|
|
4995
|
-
|
|
4996
|
-
|
|
4997
|
-
|
|
4998
|
-
|
|
4999
|
-
|
|
5000
|
-
|
|
5001
|
-
|
|
5002
|
-
|
|
5003
|
-
|
|
5004
|
-
|
|
5005
|
-
|
|
5006
|
-
|
|
5007
|
-
|
|
5008
|
-
|
|
5009
|
-
|
|
5010
|
-
|
|
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
|
-
|
|
5014
|
-
|
|
5015
|
-
|
|
5016
|
-
|
|
5017
|
-
|
|
5018
|
-
|
|
5019
|
-
|
|
5020
|
-
|
|
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
|
-
|
|
5027
|
-
|
|
5028
|
-
|
|
5029
|
-
|
|
5030
|
-
|
|
5031
|
-
|
|
5032
|
-
|
|
5033
|
-
|
|
5034
|
-
|
|
5035
|
-
|
|
5036
|
-
|
|
5037
|
-
|
|
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
|
-
|
|
5040
|
-
|
|
5041
|
-
|
|
5042
|
-
|
|
5043
|
-
|
|
5044
|
-
|
|
5045
|
-
|
|
5046
|
-
|
|
5047
|
-
|
|
5048
|
-
|
|
5049
|
-
|
|
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
|
-
|
|
5053
|
-
|
|
5054
|
-
|
|
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
|
-
|
|
5057
|
-
|
|
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
|
-
|
|
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
|
-
|
|
5076
|
-
|
|
5077
|
-
}
|
|
5078
|
-
|
|
5079
|
-
|
|
5080
|
-
|
|
5081
|
-
|
|
5082
|
-
|
|
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
|
-
|
|
5085
|
-
|
|
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
|
-
|
|
5088
|
-
|
|
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
|
-
|
|
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
|
-
|
|
5093
|
-
if (
|
|
5094
|
-
|
|
5095
|
-
|
|
5096
|
-
|
|
5097
|
-
|
|
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
|
-
|
|
5100
|
-
|
|
5101
|
-
|
|
5102
|
-
|
|
5103
|
-
|
|
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
|
-
|
|
5116
|
-
|
|
5117
|
-
|
|
5118
|
-
|
|
5119
|
-
|
|
5120
|
-
|
|
5121
|
-
|
|
5122
|
-
|
|
5123
|
-
|
|
5124
|
-
|
|
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
|
-
//
|
|
5291
|
-
|
|
5292
|
-
|
|
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
|
-
|
|
5305
|
-
|
|
5306
|
-
|
|
5307
|
-
|
|
5308
|
-
|
|
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
|
-
|
|
5320
|
-
|
|
5321
|
-
|
|
5322
|
-
|
|
5323
|
-
|
|
5324
|
-
|
|
5325
|
-
|
|
5326
|
-
|
|
5327
|
-
|
|
5328
|
-
|
|
5329
|
-
|
|
5330
|
-
|
|
5331
|
-
|
|
5332
|
-
|
|
5333
|
-
|
|
5334
|
-
|
|
5335
|
-
|
|
5336
|
-
|
|
5337
|
-
|
|
5338
|
-
|
|
5339
|
-
|
|
5340
|
-
|
|
5341
|
-
|
|
5342
|
-
|
|
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
|
-
|
|
5354
|
-
|
|
5355
|
-
|
|
5356
|
-
|
|
5357
|
-
|
|
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
|
-
|
|
5364
|
-
|
|
5365
|
-
|
|
5366
|
-
|
|
5367
|
-
|
|
5368
|
-
|
|
5369
|
-
|
|
5370
|
-
|
|
5371
|
-
|
|
5372
|
-
|
|
5373
|
-
|
|
5374
|
-
}
|
|
5375
|
-
|
|
5376
|
-
|
|
5377
|
-
}
|
|
5378
|
-
|
|
5379
|
-
|
|
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
|
-
|
|
5539
|
+
const FormatInterface = FormatInterface$1;
|
|
5540
|
+
const Codec = Codec$1;
|
|
5382
5541
|
|
|
5383
|
-
|
|
5384
|
-
var data$9 = "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";
|
|
5385
|
-
|
|
5386
|
-
|
|
5387
|
-
|
|
5388
|
-
|
|
5389
|
-
|
|
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
|
-
|
|
5393
|
-
|
|
5394
|
-
|
|
5395
|
-
|
|
5396
|
-
|
|
5397
|
-
|
|
5398
|
-
|
|
5399
|
-
|
|
5400
|
-
|
|
5401
|
-
|
|
5402
|
-
|
|
5403
|
-
|
|
5404
|
-
|
|
5405
|
-
|
|
5406
|
-
|
|
5407
|
-
|
|
5408
|
-
|
|
5409
|
-
|
|
5410
|
-
|
|
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
|
-
*
|
|
5679
|
+
* Keep history of fetched address and ptr
|
|
5680
|
+
* @property {Object} address
|
|
5681
|
+
* @property {Object} ptr
|
|
5434
5682
|
*/
|
|
5435
|
-
|
|
5436
|
-
|
|
5437
|
-
|
|
5438
|
-
|
|
5439
|
-
|
|
5440
|
-
|
|
5441
|
-
|
|
5442
|
-
|
|
5443
|
-
|
|
5444
|
-
|
|
5445
|
-
|
|
5446
|
-
|
|
5447
|
-
|
|
5448
|
-
|
|
5449
|
-
|
|
5450
|
-
|
|
5451
|
-
|
|
5452
|
-
|
|
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
|
|
5461
|
-
}
|
|
5462
|
-
|
|
5463
|
-
|
|
5464
|
-
|
|
5465
|
-
|
|
5466
|
-
const
|
|
5467
|
-
|
|
5468
|
-
const
|
|
5469
|
-
|
|
5470
|
-
|
|
5471
|
-
|
|
5472
|
-
|
|
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
|
-
|
|
5475
|
-
|
|
5476
|
-
|
|
5477
|
-
|
|
5478
|
-
|
|
5479
|
-
|
|
5480
|
-
}
|
|
5481
|
-
|
|
5482
|
-
|
|
5483
|
-
|
|
5484
|
-
|
|
5485
|
-
|
|
5486
|
-
|
|
5487
|
-
|
|
5488
|
-
|
|
5489
|
-
|
|
5490
|
-
|
|
5491
|
-
|
|
5492
|
-
|
|
5493
|
-
|
|
5494
|
-
|
|
5495
|
-
|
|
5496
|
-
|
|
5497
|
-
|
|
5498
|
-
|
|
5499
|
-
|
|
5500
|
-
|
|
5501
|
-
|
|
5502
|
-
|
|
5503
|
-
|
|
5504
|
-
|
|
5505
|
-
|
|
5506
|
-
|
|
5507
|
-
|
|
5508
|
-
|
|
5509
|
-
|
|
5510
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
5520
|
-
|
|
5521
|
-
|
|
5522
|
-
|
|
5523
|
-
|
|
5524
|
-
|
|
5525
|
-
|
|
5526
|
-
|
|
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
|
|
5578
|
-
|
|
5579
|
-
|
|
5580
|
-
|
|
5581
|
-
|
|
5582
|
-
|
|
5583
|
-
|
|
5584
|
-
|
|
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
|
-
|
|
5646
|
-
|
|
5647
|
-
|
|
5648
|
-
|
|
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
|
-
|
|
5758
|
-
|
|
5759
|
-
|
|
5760
|
-
this.
|
|
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
|
-
|
|
5768
|
-
|
|
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
|
-
|
|
5771
|
-
|
|
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
|
-
|
|
5774
|
-
|
|
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
|
-
|
|
5780
|
-
|
|
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
|
-
|
|
5787
|
-
|
|
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
|
-
|
|
5793
|
-
|
|
5794
|
-
|
|
5795
|
-
|
|
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
|
-
|
|
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
|
|
5816
|
-
|
|
5817
|
-
|
|
5818
|
-
|
|
5819
|
-
|
|
5820
|
-
|
|
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
|
|
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
|
-
|
|
5851
|
-
return
|
|
5910
|
+
async clear() {
|
|
5911
|
+
return this.db.clear();
|
|
5852
5912
|
}
|
|
5853
|
-
|
|
5854
|
-
return this.
|
|
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
|
|
6083
|
-
if (!globalThis.location) return false;
|
|
6084
|
-
return Boolean(globalThis.location.protocol === 'https:')
|
|
6085
|
-
};
|
|
5920
|
+
const {subtle} = crypto;
|
|
6086
5921
|
|
|
6087
5922
|
/**
|
|
6088
|
-
*
|
|
6089
|
-
*
|
|
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
|
|
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
|
-
*
|
|
6104
|
-
*
|
|
6105
|
-
*
|
|
6106
|
-
*
|
|
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
|
|
6109
|
-
|
|
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
|
-
|
|
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
|
-
|
|
6116
|
-
|
|
6117
|
-
|
|
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
|
-
|
|
6121
|
-
|
|
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
|
-
|
|
6124
|
-
|
|
6125
|
-
|
|
6126
|
-
|
|
6127
|
-
|
|
6128
|
-
|
|
6129
|
-
|
|
6130
|
-
|
|
6131
|
-
|
|
6132
|
-
|
|
6133
|
-
|
|
6134
|
-
|
|
6135
|
-
|
|
6136
|
-
|
|
6137
|
-
|
|
6138
|
-
|
|
6139
|
-
|
|
6140
|
-
|
|
6141
|
-
|
|
6142
|
-
|
|
6143
|
-
|
|
6144
|
-
|
|
6145
|
-
|
|
6146
|
-
|
|
6147
|
-
|
|
6148
|
-
|
|
6149
|
-
|
|
6150
|
-
|
|
6151
|
-
|
|
6152
|
-
|
|
6153
|
-
|
|
6154
|
-
|
|
6155
|
-
|
|
6156
|
-
|
|
6157
|
-
|
|
6158
|
-
|
|
6159
|
-
|
|
6160
|
-
|
|
6161
|
-
|
|
6162
|
-
|
|
6163
|
-
|
|
6164
|
-
|
|
6165
|
-
|
|
6166
|
-
|
|
6167
|
-
|
|
6168
|
-
|
|
6169
|
-
|
|
6170
|
-
|
|
6171
|
-
|
|
6172
|
-
|
|
6173
|
-
|
|
6174
|
-
|
|
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
|
-
|
|
6191
|
-
|
|
6192
|
-
|
|
6193
|
-
|
|
6194
|
-
|
|
6195
|
-
|
|
6196
|
-
|
|
6197
|
-
|
|
6198
|
-
}
|
|
6199
|
-
|
|
6200
|
-
|
|
6201
|
-
|
|
6202
|
-
|
|
6203
|
-
|
|
6204
|
-
|
|
6205
|
-
|
|
6206
|
-
|
|
6207
|
-
|
|
6208
|
-
|
|
6209
|
-
|
|
6210
|
-
|
|
6211
|
-
|
|
6212
|
-
|
|
6213
|
-
|
|
6214
|
-
|
|
6215
|
-
|
|
6216
|
-
|
|
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
|
-
|
|
6219
|
-
|
|
6220
|
-
|
|
6221
|
-
|
|
6222
|
-
|
|
6223
|
-
|
|
6224
|
-
|
|
6225
|
-
|
|
6226
|
-
|
|
6227
|
-
|
|
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
|
-
|
|
6230
|
-
|
|
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
|
-
|
|
6297
|
-
|
|
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
|
-
|
|
6318
|
-
|
|
6319
|
-
|
|
6320
|
-
|
|
6321
|
-
|
|
6322
|
-
|
|
6323
|
-
|
|
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
|
-
|
|
6332
|
-
|
|
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
|
-
|
|
6340
|
-
|
|
6341
|
-
|
|
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
|
-
|
|
6345
|
-
return
|
|
6346
|
-
}
|
|
6132
|
+
function toTypeString (value) {
|
|
6133
|
+
return Object.prototype.toString.call(value).slice(8, -1)
|
|
6134
|
+
}
|
|
6347
6135
|
|
|
6348
|
-
|
|
6349
|
-
|
|
6350
|
-
|
|
6351
|
-
|
|
6352
|
-
|
|
6353
|
-
|
|
6354
|
-
|
|
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
|
-
|
|
6145
|
+
switch (secp256k1.contextRandomize(seed)) {
|
|
6146
|
+
case 1:
|
|
6147
|
+
throw new Error(errors.CONTEXT_RANDOMIZE_UNKNOW)
|
|
6148
|
+
}
|
|
6149
|
+
},
|
|
6426
6150
|
|
|
6427
|
-
|
|
6151
|
+
privateKeyVerify (seckey) {
|
|
6152
|
+
isUint8Array('private key', seckey, 32);
|
|
6428
6153
|
|
|
6429
|
-
|
|
6430
|
-
|
|
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
|
-
|
|
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
|
-
|
|
6454
|
-
|
|
6455
|
-
|
|
6456
|
-
|
|
6457
|
-
|
|
6458
|
-
|
|
6459
|
-
|
|
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
|
-
|
|
6464
|
-
|
|
6465
|
-
|
|
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
|
-
|
|
6474
|
-
|
|
6475
|
-
|
|
6476
|
-
|
|
6477
|
-
|
|
6478
|
-
|
|
6479
|
-
|
|
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
|
-
|
|
6503
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
16122
|
-
if (r.cmp(ecparams.n) >= 0) r = new BN(0);
|
|
16199
|
+
new Mutex();
|
|
16123
16200
|
|
|
16124
|
-
|
|
16125
|
-
if (s.cmp(ecparams.n) >= 0) s = new BN(0);
|
|
16201
|
+
new Mutex();
|
|
16126
16202
|
|
|
16127
|
-
|
|
16128
|
-
output.set(s.toArrayLike(Uint8Array, 'be', 32), 32);
|
|
16203
|
+
new Mutex();
|
|
16129
16204
|
|
|
16130
|
-
|
|
16131
|
-
},
|
|
16205
|
+
new Mutex();
|
|
16132
16206
|
|
|
16133
|
-
|
|
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
|
-
|
|
16140
|
-
if (!isValid) throw new Error('This is the way')
|
|
16209
|
+
new Mutex();
|
|
16141
16210
|
|
|
16142
|
-
|
|
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
|
-
|
|
16147
|
-
if (d.cmp(ecparams.n) >= 0 || d.isZero()) return 1
|
|
16220
|
+
new Mutex();
|
|
16148
16221
|
|
|
16149
|
-
|
|
16150
|
-
|
|
16151
|
-
|
|
16152
|
-
|
|
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
|
-
|
|
16157
|
-
|
|
16158
|
-
|
|
16159
|
-
|
|
16160
|
-
|
|
16161
|
-
|
|
16162
|
-
|
|
16163
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
16220
|
-
const y = point.getY().toArray('be', 32);
|
|
16221
|
-
|
|
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
|
-
|
|
16266
|
+
new Mutex();
|
|
16224
16267
|
|
|
16225
|
-
|
|
16226
|
-
|
|
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
|
-
|
|
16229
|
-
}
|
|
16288
|
+
new Mutex();
|
|
16230
16289
|
|
|
16231
|
-
|
|
16232
|
-
}
|
|
16233
|
-
};
|
|
16290
|
+
new Mutex();
|
|
16234
16291
|
|
|
16235
|
-
|
|
16292
|
+
new Mutex();
|
|
16236
16293
|
|
|
16237
|
-
|
|
16294
|
+
new Mutex();
|
|
16238
16295
|
|
|
16239
|
-
|
|
16240
|
-
|
|
16241
|
-
|
|
16242
|
-
|
|
16243
|
-
|
|
16244
|
-
|
|
16245
|
-
|
|
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
|
-
|
|
16272
|
-
// usage:
|
|
16273
|
-
// networks['bitcoin']['testnet']
|
|
16274
|
-
// networks.bitcoin.testnet
|
|
16305
|
+
new Mutex();
|
|
16275
16306
|
/**
|
|
16276
|
-
*
|
|
16277
|
-
* @return {messagePrefix, pubKeyHash, scriptHash, wif, bip32}
|
|
16307
|
+
* Creates a new RIPEMD-160 hash instance
|
|
16278
16308
|
*/
|
|
16279
|
-
|
|
16280
|
-
|
|
16281
|
-
|
|
16282
|
-
|
|
16283
|
-
|
|
16284
|
-
|
|
16285
|
-
|
|
16286
|
-
|
|
16287
|
-
|
|
16288
|
-
|
|
16289
|
-
|
|
16290
|
-
|
|
16291
|
-
|
|
16292
|
-
|
|
16293
|
-
|
|
16294
|
-
|
|
16295
|
-
|
|
16296
|
-
|
|
16297
|
-
|
|
16298
|
-
|
|
16299
|
-
|
|
16300
|
-
|
|
16301
|
-
|
|
16302
|
-
|
|
16303
|
-
|
|
16304
|
-
|
|
16305
|
-
|
|
16306
|
-
|
|
16307
|
-
|
|
16308
|
-
};
|
|
16309
|
-
const
|
|
16310
|
-
|
|
16311
|
-
|
|
16312
|
-
|
|
16313
|
-
|
|
16314
|
-
|
|
16315
|
-
|
|
16316
|
-
|
|
16317
|
-
|
|
16318
|
-
|
|
16319
|
-
|
|
16320
|
-
|
|
16321
|
-
|
|
16322
|
-
|
|
16323
|
-
|
|
16324
|
-
|
|
16325
|
-
|
|
16326
|
-
|
|
16327
|
-
|
|
16328
|
-
|
|
16329
|
-
|
|
16330
|
-
|
|
16331
|
-
|
|
16332
|
-
|
|
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
|
-
*
|
|
16336
|
-
* @return
|
|
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
|
-
|
|
16339
|
-
|
|
16340
|
-
|
|
16341
|
-
|
|
16342
|
-
|
|
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-
|
|
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 ||
|
|
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 =
|
|
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 =
|
|
20282
|
+
options.storePrefix = "lfc";
|
|
20234
20283
|
if (!options.port)
|
|
20235
20284
|
options.port = 2000;
|
|
20236
20285
|
if (!options.root) {
|
|
20237
|
-
parts[1]
|
|
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 [
|
|
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 ===
|
|
20271
|
-
name ===
|
|
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
|
|
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-
|
|
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
|
-
|
|
20334
|
-
|
|
20335
|
-
|
|
20336
|
-
|
|
20337
|
-
|
|
20338
|
-
|
|
20339
|
-
|
|
20340
|
-
|
|
20341
|
-
|
|
20342
|
-
|
|
20343
|
-
|
|
20344
|
-
|
|
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(
|
|
20357
|
-
return new peernet.protos[
|
|
20420
|
+
this.addRequestHandler("handshake", () => {
|
|
20421
|
+
return new peernet.protos["peernet-response"]({
|
|
20422
|
+
response: { peerId: this.id },
|
|
20423
|
+
});
|
|
20358
20424
|
});
|
|
20359
|
-
pubsub.subscribe(
|
|
20425
|
+
pubsub.subscribe("peer:discovered", async (peer) => {
|
|
20360
20426
|
// console.log(peer);
|
|
20361
|
-
if (this.requestProtos[
|
|
20362
|
-
let data = await new globalThis.peernet.protos[
|
|
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[
|
|
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[
|
|
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[
|
|
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(
|
|
20444
|
+
pubsub.publish("peer:connected", peer);
|
|
20375
20445
|
// todo: cleanup discovered
|
|
20376
20446
|
});
|
|
20377
|
-
pubsub.subscribe(
|
|
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(
|
|
20452
|
+
pubsub.subscribe("peer:data", dataHandler);
|
|
20383
20453
|
if (globalThis.navigator) {
|
|
20384
|
-
globalThis.addEventListener(
|
|
20454
|
+
globalThis.addEventListener("beforeunload", async () => this.client.destroy());
|
|
20385
20455
|
}
|
|
20386
20456
|
else {
|
|
20387
|
-
process.on(
|
|
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 &&
|
|
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[
|
|
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 =
|
|
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[
|
|
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
|
|
20560
|
+
case "peernet-dht": {
|
|
20481
20561
|
this.handleDHT(peer, id, proto);
|
|
20482
20562
|
break;
|
|
20483
20563
|
}
|
|
20484
|
-
case
|
|
20564
|
+
case "peernet-data": {
|
|
20485
20565
|
this.handleData(peer, id, proto);
|
|
20486
20566
|
break;
|
|
20487
20567
|
}
|
|
20488
|
-
case
|
|
20568
|
+
case "peernet-request": {
|
|
20489
20569
|
this.handleRequest(peer, id, proto);
|
|
20490
20570
|
break;
|
|
20491
20571
|
}
|
|
20492
|
-
case
|
|
20493
|
-
|
|
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(
|
|
20506
|
-
const data = await new globalThis.peernet.protos[
|
|
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 !==
|
|
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 ||
|
|
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,
|
|
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,
|
|
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[
|
|
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,
|
|
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,
|
|
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,
|
|
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[
|
|
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[
|
|
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
|
|
20719
|
-
|
|
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
|
|
20736
|
-
|
|
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 =
|
|
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[
|
|
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(
|
|
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(
|
|
20930
|
+
return this.client.emit("peerconnect", connection);
|
|
20841
20931
|
}
|
|
20842
20932
|
}
|
|
20843
20933
|
}
|