webpeerjs 0.1.0 → 0.1.2
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/README.md +14 -5
- package/dist/esm/webpeerjs.js +83 -1999
- package/dist/umd/webpeerjs.js +53 -50793
- package/package.json +13 -6
- package/src/config.js +3 -1
- package/src/peer.js +2 -0
- package/src/umd.js +1 -0
- package/src/utils.js +1 -0
- package/src/webpeerjs.js +68 -13
- package/dist/esm/webpeerjs.d.ts +0 -17
package/dist/esm/webpeerjs.js
CHANGED
|
@@ -1,1999 +1,83 @@
|
|
|
1
|
-
|
|
2
|
-
import { alloc } from 'uint8arrays/alloc';
|
|
3
|
-
|
|
4
|
-
import { sha256 } from 'multiformats/hashes/sha2';
|
|
5
|
-
|
|
6
|
-
import { pipe } from 'it-pipe';
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
import { webSockets } from '@libp2p/websockets';
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
const CONFIG_KNOWN_BOOTSTRAP_HYBRID_IDS = [
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
],
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
},
|
|
82
|
-
|
|
83
|
-
"Peers": [
|
|
84
|
-
{
|
|
85
|
-
"Addrs": [
|
|
86
|
-
"/dns6/sg1.bootstrap.libp2p.io/tcp/443/wss",
|
|
87
|
-
"/dns4/sg1.bootstrap.libp2p.io/tcp/443/wss"
|
|
88
|
-
],
|
|
89
|
-
"ID": "QmcZf59bWwK5XFi76CZX8cbJ4BhTzzA3gU1ZjYZcYW3dwt",
|
|
90
|
-
"Schema": "peer"
|
|
91
|
-
}
|
|
92
|
-
]
|
|
93
|
-
}
|
|
94
|
-
];
|
|
95
|
-
|
|
96
|
-
//this code comes from https://github.com/libp2p/js-libp2p-pubsub-peer-discovery/blob/9d0da565f70e9b2403251c9d11dfc0b9b52babfa/src/peer.ts
|
|
97
|
-
|
|
98
|
-
var Peer;
|
|
99
|
-
(function (Peer) {
|
|
100
|
-
let _codec;
|
|
101
|
-
Peer.codec = () => {
|
|
102
|
-
if (_codec == null) {
|
|
103
|
-
_codec = message((obj, w, opts = {}) => {
|
|
104
|
-
if (opts.lengthDelimited !== false) {
|
|
105
|
-
w.fork();
|
|
106
|
-
}
|
|
107
|
-
if ((obj.publicKey != null && obj.publicKey.byteLength > 0)) {
|
|
108
|
-
w.uint32(10);
|
|
109
|
-
w.bytes(obj.publicKey);
|
|
110
|
-
}
|
|
111
|
-
if (obj.addrs != null) {
|
|
112
|
-
for (const value of obj.addrs) {
|
|
113
|
-
w.uint32(18);
|
|
114
|
-
w.bytes(value);
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
if (opts.lengthDelimited !== false) {
|
|
118
|
-
w.ldelim();
|
|
119
|
-
}
|
|
120
|
-
}, (reader, length) => {
|
|
121
|
-
const obj = {
|
|
122
|
-
publicKey: alloc(0),
|
|
123
|
-
addrs: []
|
|
124
|
-
};
|
|
125
|
-
const end = length == null ? reader.len : reader.pos + length;
|
|
126
|
-
while (reader.pos < end) {
|
|
127
|
-
const tag = reader.uint32();
|
|
128
|
-
switch (tag >>> 3) {
|
|
129
|
-
case 1: {
|
|
130
|
-
obj.publicKey = reader.bytes();
|
|
131
|
-
break;
|
|
132
|
-
}
|
|
133
|
-
case 2: {
|
|
134
|
-
obj.addrs.push(reader.bytes());
|
|
135
|
-
break;
|
|
136
|
-
}
|
|
137
|
-
default: {
|
|
138
|
-
reader.skipType(tag & 7);
|
|
139
|
-
break;
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
return obj;
|
|
144
|
-
});
|
|
145
|
-
}
|
|
146
|
-
return _codec;
|
|
147
|
-
};
|
|
148
|
-
Peer.encode = (obj) => {
|
|
149
|
-
return encodeMessage(obj, Peer.codec());
|
|
150
|
-
};
|
|
151
|
-
Peer.decode = (buf) => {
|
|
152
|
-
return decodeMessage(buf, Peer.codec());
|
|
153
|
-
};
|
|
154
|
-
})(Peer || (Peer = {}));
|
|
155
|
-
|
|
156
|
-
const prefix = CONFIG_PREFIX;
|
|
157
|
-
|
|
158
|
-
const mkErr = msg => new Error(`${prefix}: ${msg}`);
|
|
159
|
-
|
|
160
|
-
function uint8ArrayToString(uint8Array){
|
|
161
|
-
const string = new TextDecoder().decode(uint8Array);
|
|
162
|
-
return string
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
function uint8ArrayFromString(string){
|
|
166
|
-
const uint8Array = new TextEncoder().encode(string);
|
|
167
|
-
return uint8Array
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
async function first(farr){
|
|
171
|
-
for await(const data of farr){
|
|
172
|
-
return data
|
|
173
|
-
//break
|
|
174
|
-
}
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
//Add id to pupsub message
|
|
178
|
-
async function msgIdFnStrictNoSign(msg){
|
|
179
|
-
var enc = new TextEncoder();
|
|
180
|
-
const signedMessage = msg;
|
|
181
|
-
const encodedSeqNum = enc.encode(signedMessage.sequenceNumber.toString());
|
|
182
|
-
return await sha256.encode(encodedSeqNum)
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
let totals = {
|
|
186
|
-
readyErrored: 0,
|
|
187
|
-
noiseErrored: 0,
|
|
188
|
-
upgradeErrored: 0,
|
|
189
|
-
readyTimedout: 0,
|
|
190
|
-
noiseTimedout: 0,
|
|
191
|
-
success: 0
|
|
192
|
-
};
|
|
193
|
-
|
|
194
|
-
let stats = {
|
|
195
|
-
pending: 0,
|
|
196
|
-
open: 0,
|
|
197
|
-
|
|
198
|
-
ready_error: 0,
|
|
199
|
-
noise_error: 0,
|
|
200
|
-
upgrade_error: 0,
|
|
201
|
-
|
|
202
|
-
ready_timeout: 0,
|
|
203
|
-
noise_timeout: 0,
|
|
204
|
-
|
|
205
|
-
close: 0,
|
|
206
|
-
abort: 0,
|
|
207
|
-
remote_close: 0,
|
|
208
|
-
};
|
|
209
|
-
|
|
210
|
-
let lastStats = {
|
|
211
|
-
pending: 0,
|
|
212
|
-
ready_error: 0,
|
|
213
|
-
noise_error: 0,
|
|
214
|
-
upgrade_error: 0,
|
|
215
|
-
close: 0,
|
|
216
|
-
remote_close: 0,
|
|
217
|
-
ready: 0,
|
|
218
|
-
abort: 0,
|
|
219
|
-
ready_timeout: 0,
|
|
220
|
-
noise_timeout: 0,
|
|
221
|
-
open: 0
|
|
222
|
-
};
|
|
223
|
-
|
|
224
|
-
let isDialEnabled = true;
|
|
225
|
-
let lastfailtreshold = 0;
|
|
226
|
-
let fail = 0;
|
|
227
|
-
|
|
228
|
-
function metrics(data){
|
|
229
|
-
try{
|
|
230
|
-
const webTransportEvents = data.libp2p_webtransport_dialer_events_total;
|
|
231
|
-
|
|
232
|
-
const newPending = (webTransportEvents.pending ?? 0) - (lastStats.pending ?? 0);
|
|
233
|
-
const newReadyError = (webTransportEvents.ready_error ?? 0) - (lastStats.ready_error ?? 0);
|
|
234
|
-
const newNoiseError = (webTransportEvents.noise_error ?? 0) - (lastStats.noise_error ?? 0);
|
|
235
|
-
const newUpgradeError = (webTransportEvents.upgrade_error ?? 0) - (lastStats.upgrade_error ?? 0);
|
|
236
|
-
const newClose = (webTransportEvents.close ?? 0) - (lastStats.close ?? 0);
|
|
237
|
-
const newReady = (webTransportEvents.ready ?? 0) - (lastStats.ready ?? 0);
|
|
238
|
-
const newAbort = (webTransportEvents.abort ?? 0) - (lastStats.abort ?? 0);
|
|
239
|
-
const newReadyTimeout = (webTransportEvents.ready_timeout ?? 0) - (lastStats.ready_timeout ?? 0);
|
|
240
|
-
const newNoiseTimeout = (webTransportEvents.noise_timeout ?? 0) - (lastStats.noise_timeout ?? 0);
|
|
241
|
-
const newOpen = (webTransportEvents.open ?? 0) - (lastStats.open ?? 0);
|
|
242
|
-
const newRemoteClose = (webTransportEvents.remote_close ?? 0) - (lastStats.remote_close ?? 0);
|
|
243
|
-
|
|
244
|
-
stats.pending += newPending;
|
|
245
|
-
stats.pending -= newReadyTimeout;
|
|
246
|
-
stats.pending -= newNoiseTimeout;
|
|
247
|
-
stats.pending -= newReadyError;
|
|
248
|
-
stats.pending -= newNoiseError;
|
|
249
|
-
stats.pending -= newUpgradeError;
|
|
250
|
-
stats.pending -= newOpen;
|
|
251
|
-
|
|
252
|
-
stats.open += newOpen;
|
|
253
|
-
stats.open -= newClose;
|
|
254
|
-
stats.open -= newRemoteClose;
|
|
255
|
-
stats.open -= newAbort;
|
|
256
|
-
|
|
257
|
-
stats.ready_error = newReadyError;
|
|
258
|
-
stats.noise_error = newNoiseError;
|
|
259
|
-
stats.upgrade_error = newUpgradeError;
|
|
260
|
-
stats.ready_timeout = newReadyTimeout;
|
|
261
|
-
stats.noise_timeout = newNoiseTimeout;
|
|
262
|
-
stats.close = newClose;
|
|
263
|
-
stats.abort = newAbort;
|
|
264
|
-
stats.remote_close = newRemoteClose;
|
|
265
|
-
|
|
266
|
-
totals.success += newReady;
|
|
267
|
-
totals.readyErrored += newReadyError;
|
|
268
|
-
totals.noiseErrored += newNoiseError;
|
|
269
|
-
totals.upgradeErrored += newUpgradeError;
|
|
270
|
-
totals.readyTimedout += newReadyTimeout;
|
|
271
|
-
totals.noiseTimedout += newNoiseTimeout;
|
|
272
|
-
|
|
273
|
-
const errors = totals.readyErrored + totals.noiseErrored + totals.upgradeErrored;
|
|
274
|
-
const timeouts = totals.readyTimedout + totals.noiseTimedout;
|
|
275
|
-
//const failureRate = ((errors + timeouts) / (errors + timeouts + totals.success) * 100).toFixed(2)
|
|
276
|
-
|
|
277
|
-
lastStats = webTransportEvents;
|
|
278
|
-
|
|
279
|
-
fail = errors+timeouts;
|
|
280
|
-
const treshold = errors+timeouts+stats.open+stats.pending;
|
|
281
|
-
|
|
282
|
-
if(treshold>30){
|
|
283
|
-
//console.log(`Treeshold hit : ${treshold}`)
|
|
284
|
-
}
|
|
285
|
-
|
|
286
|
-
if(fail>30){
|
|
287
|
-
//console.log(`Open : ${stats.open} , Pending : ${stats.pending} , Succes : ${totals.success} , Fail : ${fail} `)
|
|
288
|
-
|
|
289
|
-
}
|
|
290
|
-
|
|
291
|
-
if ((fail-lastfailtreshold)>30){
|
|
292
|
-
if(isDialEnabled){
|
|
293
|
-
isDialEnabled = false;
|
|
294
|
-
const str = JSON.stringify({isDialEnabled,fail,lastfailtreshold});
|
|
295
|
-
console.warn('dial disabled');
|
|
296
|
-
setTimeout(()=>{
|
|
297
|
-
if(!isDialEnabled){
|
|
298
|
-
isDialEnabled = true;
|
|
299
|
-
lastfailtreshold = fail;
|
|
300
|
-
const str = JSON.stringify({isDialEnabled,fail,lastfailtreshold});
|
|
301
|
-
console.warn('dial enabled');
|
|
302
|
-
}
|
|
303
|
-
},6*60*1000);
|
|
304
|
-
}
|
|
305
|
-
}
|
|
306
|
-
|
|
307
|
-
return isDialEnabled
|
|
308
|
-
|
|
309
|
-
}
|
|
310
|
-
catch{
|
|
311
|
-
console.debug('Metrics error');
|
|
312
|
-
}
|
|
313
|
-
}
|
|
314
|
-
|
|
315
|
-
class webpeerjs{
|
|
316
|
-
|
|
317
|
-
//libp2p instance
|
|
318
|
-
#libp2p
|
|
319
|
-
|
|
320
|
-
//map [id,addrs] of discovered peers (addrs is array of address)
|
|
321
|
-
#discoveredPeers
|
|
322
|
-
|
|
323
|
-
//array of all webpeers id has been found
|
|
324
|
-
#webPeersId
|
|
325
|
-
|
|
326
|
-
//map [id,addrs]
|
|
327
|
-
#webPeersAddrs
|
|
328
|
-
|
|
329
|
-
//database of best peers has been found
|
|
330
|
-
#dbstore
|
|
331
|
-
#dbstoreData
|
|
332
|
-
|
|
333
|
-
//map of [id,number_of_dialed] of good peers on #connectionTracker
|
|
334
|
-
#dialedGoodPeers
|
|
335
|
-
|
|
336
|
-
//boolean is dial websocket
|
|
337
|
-
#isDialWebsocket
|
|
338
|
-
|
|
339
|
-
//map [id,mddrs] of dialed bootstrap address
|
|
340
|
-
#dialedKnownBootstrap
|
|
341
|
-
|
|
342
|
-
//array of dialed discovered peers id
|
|
343
|
-
//#dialedDiscoveredPeers
|
|
344
|
-
|
|
345
|
-
//object from joinRoom()
|
|
346
|
-
#rooms
|
|
347
|
-
|
|
348
|
-
//map [id,addrs] of webpeers currently connected (addrs is array of address)
|
|
349
|
-
#connectedPeers
|
|
350
|
-
|
|
351
|
-
//array of we peers id proxy of #connectedPeers
|
|
352
|
-
#connectedPeersArr
|
|
353
|
-
|
|
354
|
-
//map [id,number_of_dialed] of #connectionTracker object store
|
|
355
|
-
#connectionTrackerStore
|
|
356
|
-
|
|
357
|
-
//map [id,addr] of all peers connections (addr is string of address)
|
|
358
|
-
#connections
|
|
359
|
-
|
|
360
|
-
//track disconnect event
|
|
361
|
-
#trackDisconnect
|
|
362
|
-
|
|
363
|
-
//list of dial multiaddress queue
|
|
364
|
-
#dialQueue
|
|
365
|
-
|
|
366
|
-
//is dial enabled
|
|
367
|
-
#isDialEnabled
|
|
368
|
-
|
|
369
|
-
//message tracker avoid double
|
|
370
|
-
#msgIdtracker
|
|
371
|
-
|
|
372
|
-
//map of peer exchange data
|
|
373
|
-
#peerexchangedata
|
|
374
|
-
|
|
375
|
-
id
|
|
376
|
-
status
|
|
377
|
-
IPFS
|
|
378
|
-
address
|
|
379
|
-
peers
|
|
380
|
-
|
|
381
|
-
constructor(libp2p,dbstore,onMetrics){
|
|
382
|
-
|
|
383
|
-
this.#libp2p = libp2p;
|
|
384
|
-
this.#dbstore = dbstore;
|
|
385
|
-
this.#dbstoreData = new Map();
|
|
386
|
-
this.#discoveredPeers = new Map();
|
|
387
|
-
this.#webPeersId = [];
|
|
388
|
-
this.#webPeersAddrs = new Map();
|
|
389
|
-
this.#dialedGoodPeers = new Map();
|
|
390
|
-
this.#isDialWebsocket = false;
|
|
391
|
-
this.#dialedKnownBootstrap = new Map();
|
|
392
|
-
//this.#dialedDiscoveredPeers = []
|
|
393
|
-
this.address = [];
|
|
394
|
-
this.#rooms = {};
|
|
395
|
-
this.#connectedPeers = new Map();
|
|
396
|
-
this.#connectedPeersArr = [];
|
|
397
|
-
this.#connectionTrackerStore = new Map();
|
|
398
|
-
this.#connections = new Map();
|
|
399
|
-
this.#trackDisconnect = new Map();
|
|
400
|
-
this.#dialQueue = [];
|
|
401
|
-
this.#isDialEnabled = true;
|
|
402
|
-
this.#msgIdtracker = [];
|
|
403
|
-
this.#peerexchangedata = new Map();
|
|
404
|
-
|
|
405
|
-
this.peers = (function(f) {
|
|
406
|
-
return f
|
|
407
|
-
})(this.#connectedPeersArr);
|
|
408
|
-
|
|
409
|
-
this.status = (function(libp2p) {
|
|
410
|
-
return libp2p.status
|
|
411
|
-
})(this.#libp2p);
|
|
412
|
-
|
|
413
|
-
this.status = 'unconnected';
|
|
414
|
-
|
|
415
|
-
this.IPFS = (function(libp2p,discoveredPeers) {
|
|
416
|
-
const obj = {libp2p,discoveredPeers};
|
|
417
|
-
return obj
|
|
418
|
-
})(this.#libp2p,this.#discoveredPeers);
|
|
419
|
-
|
|
420
|
-
this.id = this.#libp2p.peerId.toString();
|
|
421
|
-
|
|
422
|
-
for(const topic of CONFIG_PUPSUB_PEER_DATA){
|
|
423
|
-
this.#libp2p.services.pubsub.subscribe(topic);
|
|
424
|
-
}
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
//listen to peer connect event
|
|
428
|
-
this.#libp2p.addEventListener("peer:connect",async (evt) => {
|
|
429
|
-
|
|
430
|
-
evt.detail;
|
|
431
|
-
const id = evt.detail.toString();
|
|
432
|
-
|
|
433
|
-
//console.log('peer:connect '+id,evt)
|
|
434
|
-
|
|
435
|
-
const connections = this.#libp2p.getConnections().map((con)=>{return {id:con.remotePeer.toString(),addr:con.remoteAddr.toString()}});
|
|
436
|
-
const connect = connections.find((con)=>con.id == id);
|
|
437
|
-
const addr = connect.addr;
|
|
438
|
-
|
|
439
|
-
if(CONFIG_KNOWN_BOOTSTRAP_PEERS_IDS.includes(id)){
|
|
440
|
-
if((!this.#connections.has(id) || (this.#connections.get(id).includes('/wss/')))&&addr.includes('webtransport')){
|
|
441
|
-
await this.#dbstore.put(new Key(id), new TextEncoder().encode(addr));
|
|
442
|
-
}
|
|
443
|
-
}
|
|
444
|
-
|
|
445
|
-
this.#connections.set(id,addr);
|
|
446
|
-
|
|
447
|
-
//required by joinRoom version 1 to announce via universal connectivity
|
|
448
|
-
if(CONFIG_KNOWN_BOOTSTRAP_HYBRID_IDS.includes(id)){
|
|
449
|
-
setTimeout(()=>{
|
|
450
|
-
this.#announce();
|
|
451
|
-
setTimeout(()=>{
|
|
452
|
-
this.#announce();
|
|
453
|
-
},5000);
|
|
454
|
-
},1000);
|
|
455
|
-
}
|
|
456
|
-
|
|
457
|
-
if(this.#webPeersId.includes(id)){
|
|
458
|
-
|
|
459
|
-
let address = [addr];
|
|
460
|
-
|
|
461
|
-
if(this.#connectedPeers.has(id)){
|
|
462
|
-
//reset this last seen
|
|
463
|
-
const now = new Date().getTime();
|
|
464
|
-
const metadata = {addrs:address,last:now};
|
|
465
|
-
this.#connectedPeers.set(id,metadata);
|
|
466
|
-
}
|
|
467
|
-
else {
|
|
468
|
-
//add to connected webpeers
|
|
469
|
-
this.#onConnectFn(id);
|
|
470
|
-
const now = new Date().getTime();
|
|
471
|
-
const metadata = {addrs:address,last:now};
|
|
472
|
-
this.#connectedPeers.set(id,metadata);
|
|
473
|
-
this.#updatePeers();
|
|
474
|
-
}
|
|
475
|
-
|
|
476
|
-
}
|
|
477
|
-
|
|
478
|
-
});
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
//listen message from subscribed pupsub topic
|
|
482
|
-
this.#libp2p.services.pubsub.addEventListener('message', event => {
|
|
483
|
-
|
|
484
|
-
//console.log('on:'+event.detail.topic,event.detail.data)
|
|
485
|
-
//console.log('from '+event.detail.from.toString(),event)
|
|
486
|
-
//console.log('ontopic:'+event.detail.topic)
|
|
487
|
-
|
|
488
|
-
if (event.detail.type !== 'signed') {
|
|
489
|
-
return
|
|
490
|
-
}
|
|
491
|
-
{
|
|
492
|
-
event.detail.topic;
|
|
493
|
-
const senderPeerId = event.detail.from.toString();
|
|
494
|
-
|
|
495
|
-
try{
|
|
496
|
-
|
|
497
|
-
//if it is webpeer
|
|
498
|
-
if(this.#webPeersId.includes(senderPeerId)){
|
|
499
|
-
|
|
500
|
-
if(this.#connectedPeers.has(senderPeerId)){
|
|
501
|
-
//reset this last seen
|
|
502
|
-
const address = this.#connectedPeers.get(senderPeerId).addrs;
|
|
503
|
-
const now = new Date().getTime();
|
|
504
|
-
const metadata = {addrs:address,last:now};
|
|
505
|
-
this.#connectedPeers.set(senderPeerId,metadata);
|
|
506
|
-
}
|
|
507
|
-
else {
|
|
508
|
-
//add to connected webpeers
|
|
509
|
-
this.#onConnectFn(senderPeerId);
|
|
510
|
-
const address = this.#webPeersAddrs.get(senderPeerId);
|
|
511
|
-
const now = new Date().getTime();
|
|
512
|
-
const metadata = {addrs:address,last:now};
|
|
513
|
-
this.#connectedPeers.set(senderPeerId,metadata);
|
|
514
|
-
this.#updatePeers();
|
|
515
|
-
}
|
|
516
|
-
|
|
517
|
-
//dial if not connected
|
|
518
|
-
if(!this.#isConnected(senderPeerId)){
|
|
519
|
-
if(this.#connections.has(senderPeerId)){
|
|
520
|
-
let mddrs = [];
|
|
521
|
-
const addr = this.#connections.get(senderPeerId);
|
|
522
|
-
const mddr = multiaddr(addr);
|
|
523
|
-
mddrs.push(mddr);
|
|
524
|
-
this.#dialMultiaddress(mddrs);
|
|
525
|
-
}
|
|
526
|
-
else if(this.#discoveredPeers.has(senderPeerId)){
|
|
527
|
-
const addrs = this.#discoveredPeers.get(senderPeerId);
|
|
528
|
-
let mddrs = [];
|
|
529
|
-
for(const addr of addrs){
|
|
530
|
-
if(!addr.includes('webrtc'))continue
|
|
531
|
-
const mddr = multiaddr(addr);
|
|
532
|
-
mddrs.push(mddr);
|
|
533
|
-
}
|
|
534
|
-
this.#dialMultiaddress(mddrs);
|
|
535
|
-
}
|
|
536
|
-
else if(this.#connectedPeers.has(senderPeerId)){
|
|
537
|
-
const addrs = this.#connectedPeers.get(senderPeerId).addrs;
|
|
538
|
-
let mddrs = [];
|
|
539
|
-
for(const addr of addrs){
|
|
540
|
-
if(!addr.includes('webrtc'))continue
|
|
541
|
-
const mddr = multiaddr(addr);
|
|
542
|
-
mddrs.push(mddr);
|
|
543
|
-
}
|
|
544
|
-
this.#dialMultiaddress(mddrs);
|
|
545
|
-
}
|
|
546
|
-
}
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
}
|
|
550
|
-
|
|
551
|
-
//parse the message over pupsub peer discovery
|
|
552
|
-
const peer = Peer.decode(event.detail.data);
|
|
553
|
-
const msg = uint8ArrayToString(peer.addrs[0]);
|
|
554
|
-
const json = JSON.parse(msg);
|
|
555
|
-
const prefix = json.prefix;
|
|
556
|
-
const room = json.room;
|
|
557
|
-
const rooms = json.rooms;
|
|
558
|
-
const message = json.message;
|
|
559
|
-
const msgId = json.msgId;
|
|
560
|
-
const signal = json.signal;
|
|
561
|
-
const id = json.id;
|
|
562
|
-
//console.log(`from ${id}:${signal} = ${message}`)
|
|
563
|
-
if(id != senderPeerId)return
|
|
564
|
-
let address = json.address;
|
|
565
|
-
|
|
566
|
-
//detect special webpeer identity
|
|
567
|
-
if(prefix === CONFIG_PREFIX){
|
|
568
|
-
|
|
569
|
-
//add to webpeers id
|
|
570
|
-
if(!this.#webPeersId.includes(id))this.#webPeersId.push(id);
|
|
571
|
-
|
|
572
|
-
//add to connected webpeers
|
|
573
|
-
if(!this.#connectedPeers.has(id)){
|
|
574
|
-
this.#onConnectFn(id);
|
|
575
|
-
address = [];
|
|
576
|
-
const now = new Date().getTime();
|
|
577
|
-
const metadata = {addrs:address,last:now};
|
|
578
|
-
this.#connectedPeers.set(id,metadata);
|
|
579
|
-
this.#webPeersAddrs.set(id,address);
|
|
580
|
-
this.#updatePeers();
|
|
581
|
-
}
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
if(room){
|
|
585
|
-
if(this.#rooms[room]){
|
|
586
|
-
|
|
587
|
-
//update room members
|
|
588
|
-
if(!this.#rooms[room].members.includes(id)){
|
|
589
|
-
if(this.#connectedPeers.has(id)){
|
|
590
|
-
this.#rooms[room].members.push(id);
|
|
591
|
-
this.#rooms[room].onMembers(this.#rooms[room].members);
|
|
592
|
-
}
|
|
593
|
-
}
|
|
594
|
-
|
|
595
|
-
//inbound message
|
|
596
|
-
if(message){
|
|
597
|
-
const msgID = msgId+id;
|
|
598
|
-
if(!this.#msgIdtracker.includes(msgID)){
|
|
599
|
-
this.#msgIdtracker.push(msgID);
|
|
600
|
-
this.#rooms[room].onMessage(message,id);
|
|
601
|
-
}
|
|
602
|
-
}
|
|
603
|
-
|
|
604
|
-
}
|
|
605
|
-
}
|
|
606
|
-
|
|
607
|
-
if(rooms){
|
|
608
|
-
for(const room of Object.keys(this.#rooms)){
|
|
609
|
-
//update room members
|
|
610
|
-
if(!this.#rooms[room].members.includes(id)){
|
|
611
|
-
if(this.#connectedPeers.has(id)){
|
|
612
|
-
this.#rooms[room].members.push(id);
|
|
613
|
-
this.#rooms[room].onMembers(this.#rooms[room].members);
|
|
614
|
-
}
|
|
615
|
-
}
|
|
616
|
-
}
|
|
617
|
-
}
|
|
618
|
-
|
|
619
|
-
if(signal){
|
|
620
|
-
|
|
621
|
-
//repply announce with ping
|
|
622
|
-
if(signal == 'announce'){
|
|
623
|
-
setTimeout(()=>{this.#ping('');},1000);
|
|
624
|
-
//console.log('rooms',rooms)
|
|
625
|
-
}
|
|
626
|
-
|
|
627
|
-
if(signal == 'ping'){
|
|
628
|
-
//console.log('rooms',rooms)
|
|
629
|
-
}
|
|
630
|
-
|
|
631
|
-
}
|
|
632
|
-
}
|
|
633
|
-
|
|
634
|
-
}catch(err){
|
|
635
|
-
}
|
|
636
|
-
|
|
637
|
-
}
|
|
638
|
-
|
|
639
|
-
});
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
//listen to peer discovery event
|
|
643
|
-
this.#libp2p.addEventListener('peer:discovery', (evt) => {
|
|
644
|
-
|
|
645
|
-
//console.log('Discovered:', evt.detail.id.toString())
|
|
646
|
-
//console.log('Discovered: '+evt.detail.id.toString(), evt.detail.multiaddrs.toString())
|
|
647
|
-
|
|
648
|
-
//save peer discover
|
|
649
|
-
|
|
650
|
-
const multiaddrs = evt.detail.multiaddrs;
|
|
651
|
-
const id = evt.detail.id;
|
|
652
|
-
|
|
653
|
-
if(multiaddrs.length != 0){
|
|
654
|
-
let addrs = [];
|
|
655
|
-
for(const addr of multiaddrs){
|
|
656
|
-
let peeraddr;
|
|
657
|
-
if(multiaddrs.toString().includes(evt.detail.id.toString())){
|
|
658
|
-
//console.log('Discovered:', evt.detail.multiaddrs.toString())
|
|
659
|
-
//peer from pupsub peer discovery already has included self id
|
|
660
|
-
peeraddr = addr.toString();
|
|
661
|
-
}
|
|
662
|
-
else {
|
|
663
|
-
//other need to add Id
|
|
664
|
-
peeraddr = addr.toString()+'/p2p/'+id;
|
|
665
|
-
}
|
|
666
|
-
addrs.push(peeraddr);
|
|
667
|
-
}
|
|
668
|
-
//save the new format multiaddrs
|
|
669
|
-
this.#discoveredPeers.set(id.toString(), addrs);
|
|
670
|
-
|
|
671
|
-
//track if peer come from relay then dial it because there is a chance it is from other browser node
|
|
672
|
-
if(multiaddrs.toString().includes('certhash')&& multiaddrs.toString().includes('webtransport') && multiaddrs.toString().includes('p2p-circuit')){
|
|
673
|
-
//console.log(addrs)
|
|
674
|
-
if(!this.#connections.has(id)){
|
|
675
|
-
let mddrs = [];
|
|
676
|
-
for(const addr of addrs){
|
|
677
|
-
if(!addr.includes('webrtc'))continue
|
|
678
|
-
const mddr = multiaddr(addr);
|
|
679
|
-
mddrs.push(mddr);
|
|
680
|
-
}
|
|
681
|
-
this.#dialMultiaddress(mddrs);
|
|
682
|
-
}
|
|
683
|
-
}
|
|
684
|
-
}
|
|
685
|
-
|
|
686
|
-
});
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
//listen to peer disconnect event
|
|
690
|
-
this.#libp2p.addEventListener("peer:disconnect",async (evt) => {
|
|
691
|
-
|
|
692
|
-
//const connection = evt.detail;
|
|
693
|
-
//console.log(`Disconnected from ${connection.toCID().toString()}`);
|
|
694
|
-
const id = evt.detail.string;
|
|
695
|
-
|
|
696
|
-
//track disconnect event
|
|
697
|
-
if(this.#trackDisconnect.has(id)){
|
|
698
|
-
let count = this.#trackDisconnect.get(id);
|
|
699
|
-
count++;
|
|
700
|
-
this.#trackDisconnect.set(id,count);
|
|
701
|
-
//console.log(this.#trackDisconnect)
|
|
702
|
-
if(count>10){
|
|
703
|
-
if(this.#dbstoreData.has(id)){
|
|
704
|
-
this.#dbstoreData.delete(id);
|
|
705
|
-
}
|
|
706
|
-
|
|
707
|
-
if(!this.#webPeersId.includes(id) && !this.#dialedKnownBootstrap.has(id)){
|
|
708
|
-
return
|
|
709
|
-
}
|
|
710
|
-
}
|
|
711
|
-
}
|
|
712
|
-
else {
|
|
713
|
-
this.#trackDisconnect.set(id,0);
|
|
714
|
-
}
|
|
715
|
-
|
|
716
|
-
let peerexchangelist = [];
|
|
717
|
-
for(const peer of this.#peerexchangedata.values()){
|
|
718
|
-
peerexchangelist.push(peer.id);
|
|
719
|
-
}
|
|
720
|
-
|
|
721
|
-
//if this disconnected peer is web peer redial it
|
|
722
|
-
if(this.#webPeersId.includes(id)){
|
|
723
|
-
const addr = this.#connections.get(id);
|
|
724
|
-
let mddrs = [];
|
|
725
|
-
const mddr = multiaddr(addr);
|
|
726
|
-
mddrs.push(mddr);
|
|
727
|
-
this.#dialMultiaddress(mddrs);
|
|
728
|
-
}
|
|
729
|
-
|
|
730
|
-
//if this disconnected peer is known bootstrap redial it
|
|
731
|
-
else if(this.#dialedKnownBootstrap.has(id)){
|
|
732
|
-
const addr = this.#connections.get(id);
|
|
733
|
-
if(addr.includes('/wss/'))return
|
|
734
|
-
let mddrs = [];
|
|
735
|
-
const addrs = multiaddr(addr);
|
|
736
|
-
mddrs.push(addrs);
|
|
737
|
-
this.#dialMultiaddress(mddrs);
|
|
738
|
-
}
|
|
739
|
-
|
|
740
|
-
else if(peerexchangelist.includes(id)){
|
|
741
|
-
const addr = this.#connections.get(id);
|
|
742
|
-
let mddrs = [];
|
|
743
|
-
const addrs = multiaddr(addr);
|
|
744
|
-
mddrs.push(addrs);
|
|
745
|
-
this.#dialMultiaddress(mddrs);
|
|
746
|
-
}
|
|
747
|
-
|
|
748
|
-
//redial if this disconnected peer is regular peer
|
|
749
|
-
else {
|
|
750
|
-
const addr = this.#connections.get(id);
|
|
751
|
-
multiaddr(addr);
|
|
752
|
-
//this.#dialMultiaddress(mddrs)
|
|
753
|
-
}
|
|
754
|
-
});
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
//listen to self peer update
|
|
758
|
-
this.#libp2p.addEventListener('self:peer:update', ({ detail: { peer } }) => {
|
|
759
|
-
//const multiaddrs = peer.addresses.map(({ multiaddr }) => multiaddr)
|
|
760
|
-
//console.log(`changed multiaddrs: peer ${peer.id.toString()} multiaddrs: ${multiaddrs}`)
|
|
761
|
-
const id = peer.id.toString();
|
|
762
|
-
const mddrs = [];
|
|
763
|
-
peer.addresses.forEach((addr)=>{
|
|
764
|
-
const maddr = addr.multiaddr.toString()+'/p2p/'+id;
|
|
765
|
-
if(maddr.includes('webtransport') && maddr.includes('certhash') && maddr.includes('webrtc')){
|
|
766
|
-
mddrs.push(maddr);
|
|
767
|
-
}
|
|
768
|
-
});
|
|
769
|
-
//this.#ListenAddressChange(mddrs)
|
|
770
|
-
this.address = mddrs;
|
|
771
|
-
this.#ping();
|
|
772
|
-
});
|
|
773
|
-
|
|
774
|
-
this.#libp2p.addEventListener('peer:identify', async (evt) => {
|
|
775
|
-
//console.log('peer:identify '+evt.detail.peerId.toString(),evt.detail)
|
|
776
|
-
|
|
777
|
-
const id = evt.detail.peerId.toString();
|
|
778
|
-
|
|
779
|
-
if(CONFIG_KNOWN_BOOTSTRAP_PUBLIC_IDS.includes(id)){
|
|
780
|
-
const remoteAddr = evt.detail.connection.remoteAddr.toString();
|
|
781
|
-
if(remoteAddr.includes('/wss/')){
|
|
782
|
-
let addrs = [];
|
|
783
|
-
let mddrs = [];
|
|
784
|
-
for(const peer of evt.detail.listenAddrs){
|
|
785
|
-
if(!peer.toString().includes('webtransport'))continue
|
|
786
|
-
const addr = peer.toString()+'/p2p/'+id;
|
|
787
|
-
const mddr = multiaddr(addr);
|
|
788
|
-
addrs.push(addr);
|
|
789
|
-
mddrs.push(mddr);
|
|
790
|
-
}
|
|
791
|
-
this.#dialedKnownBootstrap.set(id,addrs);
|
|
792
|
-
await this.#libp2p.hangUp(peerIdFromString(id));
|
|
793
|
-
this.#dialMultiaddress(mddrs);
|
|
794
|
-
}
|
|
795
|
-
}
|
|
796
|
-
|
|
797
|
-
if(evt.detail.protocols.includes(CONFIG_PROTOCOL)){
|
|
798
|
-
//console.log('peer:identify '+evt.detail.peerId.toString(),evt)
|
|
799
|
-
|
|
800
|
-
const id = evt.detail.peerId.toString();
|
|
801
|
-
let address = [];
|
|
802
|
-
|
|
803
|
-
for(const addrs of evt.detail.listenAddrs){
|
|
804
|
-
const addr = addrs.toString()+'/p2p/'+id;
|
|
805
|
-
multiaddr(addr);
|
|
806
|
-
if(addr.includes('webtransport')){
|
|
807
|
-
address.push(addr);
|
|
808
|
-
}
|
|
809
|
-
}
|
|
810
|
-
|
|
811
|
-
if(this.#connectedPeers.has(id)){
|
|
812
|
-
//reset this last seen
|
|
813
|
-
const now = new Date().getTime();
|
|
814
|
-
const metadata = {addrs:address,last:now};
|
|
815
|
-
this.#connectedPeers.set(id,metadata);
|
|
816
|
-
}
|
|
817
|
-
|
|
818
|
-
|
|
819
|
-
const command = 'peer-exchange';
|
|
820
|
-
this.#dialProtocol(id,command);
|
|
821
|
-
|
|
822
|
-
|
|
823
|
-
}
|
|
824
|
-
});
|
|
825
|
-
|
|
826
|
-
//dial known peers from configuration
|
|
827
|
-
this.#dialKnownPeers();
|
|
828
|
-
|
|
829
|
-
//watch connection every 30s if none dial known peers again from configuration
|
|
830
|
-
this.#watchConnection();
|
|
831
|
-
|
|
832
|
-
//if found good peers save to storage and reconnect if disconnect
|
|
833
|
-
this.#connectionTracker();
|
|
834
|
-
|
|
835
|
-
//periodically dial saved bootstrap address if disconnect
|
|
836
|
-
this.#dialRandomBootstrap();
|
|
837
|
-
|
|
838
|
-
//dial random discovered peers
|
|
839
|
-
//this.#dialdiscoveredpeers()
|
|
840
|
-
|
|
841
|
-
this.#registerProtocol();
|
|
842
|
-
|
|
843
|
-
|
|
844
|
-
onMetrics((data)=>{
|
|
845
|
-
const signal = metrics(data);
|
|
846
|
-
this.#isDialEnabled = signal;
|
|
847
|
-
|
|
848
|
-
});
|
|
849
|
-
|
|
850
|
-
setTimeout(()=>{
|
|
851
|
-
this.#dialQueueList();
|
|
852
|
-
setInterval(()=>{
|
|
853
|
-
this.#dialQueueList();
|
|
854
|
-
},5e3);
|
|
855
|
-
},10e3);
|
|
856
|
-
|
|
857
|
-
|
|
858
|
-
|
|
859
|
-
setInterval(()=>{
|
|
860
|
-
this.#trackLastSeen();
|
|
861
|
-
},5e3);
|
|
862
|
-
|
|
863
|
-
|
|
864
|
-
/*setTimeout(async()=>{
|
|
865
|
-
try{
|
|
866
|
-
//console.log('getClosestPeers')
|
|
867
|
-
const digest = await getDigest()
|
|
868
|
-
//console.log('digest',digest)
|
|
869
|
-
for await (const event of this.#libp2p.services.aminoDHT.getClosestPeers(digest)){
|
|
870
|
-
if (event.name === 'FINAL_PEER'){
|
|
871
|
-
//event.peer.multiaddrs.forEach((ma) => {
|
|
872
|
-
//console.log(event.peer.id.toString(),ma.toString())
|
|
873
|
-
//})
|
|
874
|
-
//console.log(event.peer.id.toString(),event.peer.multiaddrs.toString())
|
|
875
|
-
}
|
|
876
|
-
}
|
|
877
|
-
}
|
|
878
|
-
catch(err){
|
|
879
|
-
console.error('query error', err)
|
|
880
|
-
}
|
|
881
|
-
},60e3)*/
|
|
882
|
-
|
|
883
|
-
/*setTimeout(async()=>{
|
|
884
|
-
const key = uint8ArrayFromString(config.CONFIG_PREFIX)
|
|
885
|
-
const value = uint8ArrayFromString(this.id)
|
|
886
|
-
for await (const event of this.#libp2p.services.aminoDHT.put(key,value)){
|
|
887
|
-
console.log('put',event)
|
|
888
|
-
}
|
|
889
|
-
},30e3)*/
|
|
890
|
-
|
|
891
|
-
}
|
|
892
|
-
|
|
893
|
-
|
|
894
|
-
|
|
895
|
-
|
|
896
|
-
/*
|
|
897
|
-
PUBLIC FUNCTION
|
|
898
|
-
*/
|
|
899
|
-
|
|
900
|
-
//Listen on new peer connection
|
|
901
|
-
#onConnectFn = () => {}
|
|
902
|
-
onConnect = f => (this.#onConnectFn = f)
|
|
903
|
-
|
|
904
|
-
|
|
905
|
-
//Listen on peer disconnect
|
|
906
|
-
#onDisconnectFn = () => {}
|
|
907
|
-
onDisconnect = f => (this.#onDisconnectFn = f)
|
|
908
|
-
|
|
909
|
-
joinRoom = room => {
|
|
910
|
-
if (this.#rooms[room]) {
|
|
911
|
-
return [
|
|
912
|
-
this.#rooms[room].sendMessage,
|
|
913
|
-
this.#rooms[room].listenMessage,
|
|
914
|
-
this.#rooms[room].onMembersChange
|
|
915
|
-
]
|
|
916
|
-
|
|
917
|
-
|
|
918
|
-
}
|
|
919
|
-
|
|
920
|
-
if (!room) {
|
|
921
|
-
throw mkErr('room is required')
|
|
922
|
-
}
|
|
923
|
-
|
|
924
|
-
//join room version 1 user pupsub via pupsub peer discovery
|
|
925
|
-
{
|
|
926
|
-
|
|
927
|
-
const topics = CONFIG_PUPSUB_PEER_DATA;
|
|
928
|
-
|
|
929
|
-
this.#rooms[room] = {
|
|
930
|
-
onMessage : () => {},
|
|
931
|
-
listenMessage : f => (this.#rooms[room] = {...this.#rooms[room], onMessage: f}),
|
|
932
|
-
sendMessage : async (message) => {
|
|
933
|
-
const msgId = (new Date()).getTime();
|
|
934
|
-
const data = JSON.stringify({prefix:CONFIG_PREFIX,room,message,id:this.#libp2p.peerId.toString(),msgId});
|
|
935
|
-
const peer = {
|
|
936
|
-
publicKey: this.#libp2p.peerId.publicKey,
|
|
937
|
-
addrs: [uint8ArrayFromString(data)],
|
|
938
|
-
};
|
|
939
|
-
const encodedPeer = Peer.encode(peer);
|
|
940
|
-
for(const topic of topics){
|
|
941
|
-
await this.#libp2p.services.pubsub.publish(topic, encodedPeer);
|
|
942
|
-
}
|
|
943
|
-
},
|
|
944
|
-
members : [this.id],
|
|
945
|
-
onMembers : () => {},
|
|
946
|
-
onMembersChange : f => {this.#rooms[room] = {...this.#rooms[room], onMembers: f};this.#rooms[room].onMembers(this.#rooms[room].members);this.#ping();},
|
|
947
|
-
};
|
|
948
|
-
}
|
|
949
|
-
|
|
950
|
-
return [
|
|
951
|
-
this.#rooms[room].sendMessage,
|
|
952
|
-
this.#rooms[room].listenMessage,
|
|
953
|
-
this.#rooms[room].onMembersChange
|
|
954
|
-
]
|
|
955
|
-
}
|
|
956
|
-
|
|
957
|
-
dial(addr){
|
|
958
|
-
let mddrs = [];
|
|
959
|
-
const mddr = multiaddr(addr);
|
|
960
|
-
mddrs.push(mddr);
|
|
961
|
-
this.#dialMultiaddress(mddrs);
|
|
962
|
-
}
|
|
963
|
-
|
|
964
|
-
|
|
965
|
-
/*
|
|
966
|
-
PRIVATE FUNCTION
|
|
967
|
-
*/
|
|
968
|
-
|
|
969
|
-
#updatePeers(){
|
|
970
|
-
this.#connectedPeersArr.length = 0;
|
|
971
|
-
for(const peer of this.#connectedPeers){
|
|
972
|
-
const item = {id:peer[0],address:peer[1].addrs};
|
|
973
|
-
this.#connectedPeersArr.push(item);
|
|
974
|
-
}
|
|
975
|
-
if(this.#connectedPeers.size > 0){
|
|
976
|
-
this.status = 'connected';
|
|
977
|
-
}
|
|
978
|
-
else {
|
|
979
|
-
this.status = 'unconnected';
|
|
980
|
-
}
|
|
981
|
-
this.#ping();
|
|
982
|
-
}
|
|
983
|
-
|
|
984
|
-
async #registerProtocol(){
|
|
985
|
-
|
|
986
|
-
const handler = async ({ connection, stream, protocol }) => {
|
|
987
|
-
try{
|
|
988
|
-
const output = await pipe(
|
|
989
|
-
stream.source,
|
|
990
|
-
(source) => lp.decode(source),
|
|
991
|
-
(source) => map(source, (buf) => uint8ArrayToString(buf.subarray())),
|
|
992
|
-
async function (source) {
|
|
993
|
-
let string = '';
|
|
994
|
-
for await (const msg of source) {
|
|
995
|
-
string += msg.toString();
|
|
996
|
-
}
|
|
997
|
-
return string
|
|
998
|
-
}
|
|
999
|
-
);
|
|
1000
|
-
|
|
1001
|
-
const id = connection.remotePeer.toString();
|
|
1002
|
-
|
|
1003
|
-
let json = JSON.parse(output);
|
|
1004
|
-
|
|
1005
|
-
let jsonMessage = {
|
|
1006
|
-
protocol:CONFIG_PROTOCOL,
|
|
1007
|
-
command:null,
|
|
1008
|
-
data:null
|
|
1009
|
-
};
|
|
1010
|
-
|
|
1011
|
-
if(json.command === 'peer-exchange'){
|
|
1012
|
-
|
|
1013
|
-
if(json.protocol == CONFIG_PROTOCOL){
|
|
1014
|
-
const address = [connection.remoteAddr.toString()];
|
|
1015
|
-
if(this.#connectedPeers.has(id)){
|
|
1016
|
-
//reset this last seen
|
|
1017
|
-
const now = new Date().getTime();
|
|
1018
|
-
const metadata = {addrs:address,last:now};
|
|
1019
|
-
this.#connectedPeers.set(id,metadata);
|
|
1020
|
-
}
|
|
1021
|
-
else {
|
|
1022
|
-
if(!this.#webPeersId.includes(id))this.#webPeersId.push(id);
|
|
1023
|
-
|
|
1024
|
-
//add to connected webpeers
|
|
1025
|
-
this.#onConnectFn(id);
|
|
1026
|
-
const now = new Date().getTime();
|
|
1027
|
-
const metadata = {addrs:address,last:now};
|
|
1028
|
-
this.#connectedPeers.set(id,metadata);
|
|
1029
|
-
this.#updatePeers();
|
|
1030
|
-
}
|
|
1031
|
-
}
|
|
1032
|
-
|
|
1033
|
-
if(json.data != null){
|
|
1034
|
-
this.#peerexchangedata.set(id,json.data);
|
|
1035
|
-
let mddrs = [];
|
|
1036
|
-
const dataaddr = json.data.addr;
|
|
1037
|
-
const datamddr = multiaddr(dataaddr);
|
|
1038
|
-
const dataid = json.data.id;
|
|
1039
|
-
mddrs.push(datamddr);
|
|
1040
|
-
this.#dialMultiaddress(mddrs);
|
|
1041
|
-
if(!this.#dbstoreData.has(dataid)){
|
|
1042
|
-
//await this.#dbstore.put(new Key(dataid), new TextEncoder().encode(dataaddr))
|
|
1043
|
-
//this.#dbstoreData.set(dataid,dataaddr)
|
|
1044
|
-
}
|
|
1045
|
-
}
|
|
1046
|
-
|
|
1047
|
-
const keys = Array.from(this.#dbstoreData.keys());
|
|
1048
|
-
const randomKey = Math.floor(Math.random() * keys.length);
|
|
1049
|
-
const key = keys[randomKey];
|
|
1050
|
-
const addr = this.#dbstoreData.get(key);
|
|
1051
|
-
|
|
1052
|
-
jsonMessage.command = json.command;
|
|
1053
|
-
jsonMessage.data = {id:key,addr};
|
|
1054
|
-
}
|
|
1055
|
-
|
|
1056
|
-
const message = JSON.stringify(jsonMessage);
|
|
1057
|
-
//console.log('answer message '+id,message)
|
|
1058
|
-
|
|
1059
|
-
pipe(
|
|
1060
|
-
message,
|
|
1061
|
-
(source) => map(source, (string) => uint8ArrayFromString(string)),
|
|
1062
|
-
(source) => lp.encode(source),
|
|
1063
|
-
stream.sink
|
|
1064
|
-
);
|
|
1065
|
-
}
|
|
1066
|
-
catch(err){
|
|
1067
|
-
//console.warn(err)
|
|
1068
|
-
}
|
|
1069
|
-
};
|
|
1070
|
-
|
|
1071
|
-
await this.#libp2p.handle(CONFIG_PROTOCOL, handler, {
|
|
1072
|
-
maxInboundStreams: 50,
|
|
1073
|
-
maxOutboundStreams: 50,
|
|
1074
|
-
runOnTransientConnection:false
|
|
1075
|
-
});
|
|
1076
|
-
|
|
1077
|
-
await this.#libp2p.register(CONFIG_PROTOCOL, {
|
|
1078
|
-
onConnect: (peer, connection) => {
|
|
1079
|
-
// handle connect
|
|
1080
|
-
//console.log('handle connect',peer)
|
|
1081
|
-
},
|
|
1082
|
-
onDisconnect: (peer, connection) => {
|
|
1083
|
-
// handle disconnect
|
|
1084
|
-
//console.log('handle disconnect',peer)
|
|
1085
|
-
}
|
|
1086
|
-
});
|
|
1087
|
-
|
|
1088
|
-
}
|
|
1089
|
-
|
|
1090
|
-
async #dialProtocol(id,command){
|
|
1091
|
-
|
|
1092
|
-
const connections = this.#libp2p.getConnections().map((con)=>{return {id:con.remotePeer.toString(),addr:con.remoteAddr.toString()}});
|
|
1093
|
-
const connect = connections.find((con)=>con.id == id);
|
|
1094
|
-
const addr = connect.addr;
|
|
1095
|
-
const mddr = multiaddr(addr);
|
|
1096
|
-
|
|
1097
|
-
let jsonMessage = {
|
|
1098
|
-
protocol:CONFIG_PROTOCOL,
|
|
1099
|
-
command:null,
|
|
1100
|
-
data:null
|
|
1101
|
-
};
|
|
1102
|
-
|
|
1103
|
-
if(command === 'peer-exchange'){
|
|
1104
|
-
|
|
1105
|
-
if(this.#peerexchangedata.has(id))return
|
|
1106
|
-
|
|
1107
|
-
const keys = Array.from(this.#dbstoreData.keys());
|
|
1108
|
-
const randomKey = Math.floor(Math.random() * keys.length);
|
|
1109
|
-
const key = keys[randomKey];
|
|
1110
|
-
const addr = this.#dbstoreData.get(key);
|
|
1111
|
-
|
|
1112
|
-
jsonMessage.command = command;
|
|
1113
|
-
jsonMessage.data = {id:key,addr};
|
|
1114
|
-
}
|
|
1115
|
-
|
|
1116
|
-
const message = JSON.stringify(jsonMessage);
|
|
1117
|
-
//console.log('ask message '+id,message)
|
|
1118
|
-
|
|
1119
|
-
try{
|
|
1120
|
-
|
|
1121
|
-
const stream = await this.#libp2p.dialProtocol(mddr, CONFIG_PROTOCOL,{runOnTransientConnection:false});
|
|
1122
|
-
|
|
1123
|
-
const output = await pipe(
|
|
1124
|
-
message,
|
|
1125
|
-
(source) => map(source, (string) => uint8ArrayFromString(string)),
|
|
1126
|
-
(source) => lp.encode(source),
|
|
1127
|
-
stream,
|
|
1128
|
-
(source) => lp.decode(source),
|
|
1129
|
-
(source) => map(source, (buf) => uint8ArrayToString(buf.subarray())),
|
|
1130
|
-
async function (source) {
|
|
1131
|
-
let string = '';
|
|
1132
|
-
for await (const msg of source) {
|
|
1133
|
-
string += msg.toString();
|
|
1134
|
-
}
|
|
1135
|
-
return string
|
|
1136
|
-
}
|
|
1137
|
-
);
|
|
1138
|
-
//console.log(output)
|
|
1139
|
-
const json = JSON.parse(output);
|
|
1140
|
-
if(json.protocol == CONFIG_PROTOCOL){
|
|
1141
|
-
const address = [addr];
|
|
1142
|
-
if(this.#connectedPeers.has(id)){
|
|
1143
|
-
//reset this last seen
|
|
1144
|
-
const now = new Date().getTime();
|
|
1145
|
-
const metadata = {addrs:address,last:now};
|
|
1146
|
-
this.#connectedPeers.set(id,metadata);
|
|
1147
|
-
}
|
|
1148
|
-
else {
|
|
1149
|
-
if(!this.#webPeersId.includes(id))this.#webPeersId.push(id);
|
|
1150
|
-
|
|
1151
|
-
//add to connected webpeers
|
|
1152
|
-
this.#onConnectFn(id);
|
|
1153
|
-
const now = new Date().getTime();
|
|
1154
|
-
const metadata = {addrs:address,last:now};
|
|
1155
|
-
this.#connectedPeers.set(id,metadata);
|
|
1156
|
-
this.#updatePeers();
|
|
1157
|
-
}
|
|
1158
|
-
}
|
|
1159
|
-
if(json.command == 'peer-exchange'){
|
|
1160
|
-
if(json.data != null){
|
|
1161
|
-
this.#peerexchangedata.set(id,json.data);
|
|
1162
|
-
let mddrs = [];
|
|
1163
|
-
const dataaddr = json.data.addr;
|
|
1164
|
-
const datamddr = multiaddr(dataaddr);
|
|
1165
|
-
const dataid = json.data.id;
|
|
1166
|
-
mddrs.push(datamddr);
|
|
1167
|
-
this.#dialMultiaddress(mddrs);
|
|
1168
|
-
if(!this.#dbstoreData.has(dataid)){
|
|
1169
|
-
//await this.#dbstore.put(new Key(dataid), new TextEncoder().encode(dataaddr))
|
|
1170
|
-
//this.#dbstoreData.set(dataid,dataaddr)
|
|
1171
|
-
}
|
|
1172
|
-
}
|
|
1173
|
-
}
|
|
1174
|
-
}
|
|
1175
|
-
catch(err){
|
|
1176
|
-
//console.warn(err)
|
|
1177
|
-
}
|
|
1178
|
-
}
|
|
1179
|
-
|
|
1180
|
-
async #findHybridPeer(){
|
|
1181
|
-
|
|
1182
|
-
if(!navigator.onLine)return
|
|
1183
|
-
if(!this.#isDialEnabled)return
|
|
1184
|
-
|
|
1185
|
-
for(const target of CONFIG_KNOWN_BOOTSTRAP_HYBRID_IDS){
|
|
1186
|
-
if(!this.#isConnected(target) && !this.#connections.has(target)){
|
|
1187
|
-
//console.log('findPeer',target)
|
|
1188
|
-
const peerId = peerIdFromString(target);
|
|
1189
|
-
//const peerInfo = await this.#libp2p.services.aminoDHT.findPeer(peerId)
|
|
1190
|
-
|
|
1191
|
-
//console.info(peerInfo)
|
|
1192
|
-
for await (const event of this.#libp2p.services.aminoDHT.findPeer(peerId)){
|
|
1193
|
-
//console.info('findPeer',event)
|
|
1194
|
-
if (event.name === 'FINAL_PEER'){
|
|
1195
|
-
//console.log(event.peer.id.toString(),event.peer.multiaddrs.toString())
|
|
1196
|
-
let mddrs = [];
|
|
1197
|
-
let addrs = [];
|
|
1198
|
-
const id = event.peer.id.toString();
|
|
1199
|
-
for(const mddr of event.peer.multiaddrs){
|
|
1200
|
-
const peeraddr = mddr.toString()+'/p2p/'+id;
|
|
1201
|
-
const peermddr = multiaddr(peeraddr);
|
|
1202
|
-
addrs.push(peeraddr);
|
|
1203
|
-
mddrs.push(peermddr);
|
|
1204
|
-
}
|
|
1205
|
-
this.#dialedKnownBootstrap.set(id,addrs);
|
|
1206
|
-
if(!this.#isConnected(id)){
|
|
1207
|
-
this.#dialMultiaddress(mddrs);
|
|
1208
|
-
}
|
|
1209
|
-
}
|
|
1210
|
-
}
|
|
1211
|
-
}
|
|
1212
|
-
}
|
|
1213
|
-
}
|
|
1214
|
-
|
|
1215
|
-
|
|
1216
|
-
//check the last seen in web peer
|
|
1217
|
-
#trackLastSeen(){
|
|
1218
|
-
const timeout = 25*1000;
|
|
1219
|
-
const forcetimeout = 60*1000;
|
|
1220
|
-
const now = new Date().getTime();
|
|
1221
|
-
|
|
1222
|
-
//if webpeer last seen grather then timeout send onDisconnect
|
|
1223
|
-
for(const peer of this.#connectedPeers){
|
|
1224
|
-
const id = peer[0];
|
|
1225
|
-
const last = peer[1].last;
|
|
1226
|
-
const time = now-last;
|
|
1227
|
-
if((time>timeout && !this.#isConnected(id))||(time>forcetimeout)){
|
|
1228
|
-
|
|
1229
|
-
this.#connectedPeers.delete(id);
|
|
1230
|
-
this.#updatePeers();
|
|
1231
|
-
this.#onDisconnectFn(id);
|
|
1232
|
-
|
|
1233
|
-
//remove id from room member
|
|
1234
|
-
const rooms = Object.keys(this.#rooms);
|
|
1235
|
-
for(const room of rooms){
|
|
1236
|
-
if(this.#rooms[room].members.includes(id)){
|
|
1237
|
-
const index = this.#rooms[room].members.indexOf(id);
|
|
1238
|
-
this.#rooms[room].members.splice(index,1);
|
|
1239
|
-
this.#rooms[room].onMembers(this.#rooms[room].members);
|
|
1240
|
-
}
|
|
1241
|
-
}
|
|
1242
|
-
|
|
1243
|
-
}
|
|
1244
|
-
}
|
|
1245
|
-
}
|
|
1246
|
-
|
|
1247
|
-
//check if this id is connected
|
|
1248
|
-
#isConnected(id){
|
|
1249
|
-
let peers = [];
|
|
1250
|
-
for(const peer of this.#libp2p.getPeers()){
|
|
1251
|
-
peers.push(peer.toString());
|
|
1252
|
-
}
|
|
1253
|
-
if(peers.includes(id)){
|
|
1254
|
-
return true
|
|
1255
|
-
}
|
|
1256
|
-
else {
|
|
1257
|
-
return false
|
|
1258
|
-
}
|
|
1259
|
-
}
|
|
1260
|
-
|
|
1261
|
-
|
|
1262
|
-
//add multiaddr address to queue list
|
|
1263
|
-
#dialMultiaddress(mddrs){
|
|
1264
|
-
if(mddrs.length>0){
|
|
1265
|
-
|
|
1266
|
-
const id = mddrs[0].toString().split('/').pop();
|
|
1267
|
-
|
|
1268
|
-
const queueids = this.#dialQueue.map((arr)=> arr[0].toString().split('/').pop());
|
|
1269
|
-
|
|
1270
|
-
//if peer id is already in the queque cancel queque
|
|
1271
|
-
if(queueids.includes(id)){
|
|
1272
|
-
return
|
|
1273
|
-
}
|
|
1274
|
-
|
|
1275
|
-
const webPeerCount = this.#connectedPeers.size;
|
|
1276
|
-
const allPeerCount = this.#libp2p.getPeers().length;
|
|
1277
|
-
const nodePeerCount = allPeerCount - webPeerCount;
|
|
1278
|
-
const limitCount = CONFIG_MAX_CONNECTIONS / 2;
|
|
1279
|
-
|
|
1280
|
-
if(this.#webPeersId.includes(id)){
|
|
1281
|
-
if(webPeerCount>limitCount)return
|
|
1282
|
-
}
|
|
1283
|
-
else {
|
|
1284
|
-
if(nodePeerCount>limitCount)return
|
|
1285
|
-
}
|
|
1286
|
-
|
|
1287
|
-
if(this.#webPeersId.includes(id) || CONFIG_KNOWN_BOOTSTRAP_PEERS_IDS.includes(id) || CONFIG_KNOWN_BOOTSTRAP_HYBRID_IDS.includes(id)){
|
|
1288
|
-
this.#dialQueue.unshift(mddrs);
|
|
1289
|
-
}
|
|
1290
|
-
else {
|
|
1291
|
-
this.#dialQueue.push(mddrs);
|
|
1292
|
-
}
|
|
1293
|
-
|
|
1294
|
-
}
|
|
1295
|
-
}
|
|
1296
|
-
|
|
1297
|
-
//dial multiaddr address in queue list
|
|
1298
|
-
#dialQueueList(){
|
|
1299
|
-
|
|
1300
|
-
if(!this.#isDialEnabled || !navigator.onLine)return
|
|
1301
|
-
|
|
1302
|
-
const mddrsToDial = 5;
|
|
1303
|
-
|
|
1304
|
-
let queue = [];
|
|
1305
|
-
for(const item of this.#libp2p.getDialQueue()){
|
|
1306
|
-
const id = item.peerId.string;
|
|
1307
|
-
queue.push(id);
|
|
1308
|
-
}
|
|
1309
|
-
|
|
1310
|
-
if (queue.length > mddrsToDial)return
|
|
1311
|
-
|
|
1312
|
-
for(let i = 0; i < mddrsToDial; i++){
|
|
1313
|
-
const mddrs = this.#dialQueue.shift();
|
|
1314
|
-
if(mddrs != undefined && mddrs.length>0){
|
|
1315
|
-
|
|
1316
|
-
const id = mddrs[0].toString().split('/').pop();
|
|
1317
|
-
|
|
1318
|
-
if(this.#isConnected(id))continue
|
|
1319
|
-
if(queue.includes(id)){continue;}
|
|
1320
|
-
|
|
1321
|
-
//console.log('dial',id)
|
|
1322
|
-
|
|
1323
|
-
//dial with webtransport
|
|
1324
|
-
this.#dialWebtransport(mddrs);
|
|
1325
|
-
|
|
1326
|
-
//fallback dial with websocket if enabled
|
|
1327
|
-
if(this.#isDialWebsocket){
|
|
1328
|
-
this.#dialWebsocket(mddrs);
|
|
1329
|
-
}
|
|
1330
|
-
|
|
1331
|
-
}
|
|
1332
|
-
else {
|
|
1333
|
-
break
|
|
1334
|
-
}
|
|
1335
|
-
}
|
|
1336
|
-
|
|
1337
|
-
}
|
|
1338
|
-
|
|
1339
|
-
|
|
1340
|
-
//announce and ping via pupsub peer discovery
|
|
1341
|
-
async #announce(){
|
|
1342
|
-
const topics = CONFIG_PUPSUB_PEER_DATA;
|
|
1343
|
-
const data = JSON.stringify({prefix:CONFIG_PREFIX,signal:'announce',id:this.#libp2p.peerId.toString(),address:this.address,rooms:this.#rooms});
|
|
1344
|
-
const peer = {
|
|
1345
|
-
publicKey: this.#libp2p.peerId.publicKey,
|
|
1346
|
-
addrs: [uint8ArrayFromString(data)],
|
|
1347
|
-
};
|
|
1348
|
-
const encodedPeer = Peer.encode(peer);
|
|
1349
|
-
for(const topic of topics){
|
|
1350
|
-
await this.#libp2p.services.pubsub.publish(topic, encodedPeer);
|
|
1351
|
-
}
|
|
1352
|
-
}
|
|
1353
|
-
async #ping(){
|
|
1354
|
-
const topics = CONFIG_PUPSUB_PEER_DATA;
|
|
1355
|
-
const data = JSON.stringify({prefix:CONFIG_PREFIX,signal:'ping',id:this.#libp2p.peerId.toString(),address:this.address,rooms:this.#rooms});
|
|
1356
|
-
const peer = {
|
|
1357
|
-
publicKey: this.#libp2p.peerId.publicKey,
|
|
1358
|
-
addrs: [uint8ArrayFromString(data)],
|
|
1359
|
-
};
|
|
1360
|
-
const encodedPeer = Peer.encode(peer);
|
|
1361
|
-
for(const topic of topics){
|
|
1362
|
-
await this.#libp2p.services.pubsub.publish(topic, encodedPeer);
|
|
1363
|
-
}
|
|
1364
|
-
}
|
|
1365
|
-
|
|
1366
|
-
|
|
1367
|
-
//dial discovered peers
|
|
1368
|
-
/*#dialdiscoveredpeers(){
|
|
1369
|
-
setInterval(()=>{
|
|
1370
|
-
const keys = Array.from(this.#discoveredPeers.keys())
|
|
1371
|
-
for(const key of keys){
|
|
1372
|
-
if(!this.#dialedDiscoveredPeers.includes(key)){
|
|
1373
|
-
this.#dialedDiscoveredPeers.push(key)
|
|
1374
|
-
const addrs = this.#discoveredPeers.get(key)
|
|
1375
|
-
let mddrs = []
|
|
1376
|
-
for(const addr of addrs){
|
|
1377
|
-
const mddr = multiaddr(addr)
|
|
1378
|
-
mddrs.push(mddr)
|
|
1379
|
-
}
|
|
1380
|
-
this.#dialMultiaddress(mddrs)
|
|
1381
|
-
break
|
|
1382
|
-
}
|
|
1383
|
-
}
|
|
1384
|
-
},30*1000)
|
|
1385
|
-
}*/
|
|
1386
|
-
|
|
1387
|
-
|
|
1388
|
-
//dial random known bootstrap periodically
|
|
1389
|
-
#dialRandomBootstrap(){
|
|
1390
|
-
setInterval(()=>{
|
|
1391
|
-
//const keys = Array.from(this.#dialedKnownBootstrap.keys())
|
|
1392
|
-
const keys = CONFIG_KNOWN_BOOTSTRAP_PEERS_IDS;
|
|
1393
|
-
const randomKey = Math.floor(Math.random() * keys.length);
|
|
1394
|
-
let ids = [];
|
|
1395
|
-
ids.push(keys[randomKey]);
|
|
1396
|
-
|
|
1397
|
-
//universal connectivity id for webpeer discovery and joinRoom version 1 to work
|
|
1398
|
-
for(const id of CONFIG_KNOWN_BOOTSTRAP_HYBRID_IDS){
|
|
1399
|
-
ids.push(id);
|
|
1400
|
-
}
|
|
1401
|
-
|
|
1402
|
-
for(const id of ids){
|
|
1403
|
-
if(id == undefined)continue
|
|
1404
|
-
//const addrs = this.#dialedKnownBootstrap.get(id)
|
|
1405
|
-
|
|
1406
|
-
if(!this.#isConnected(id)){
|
|
1407
|
-
if(this.#connections.has(id))
|
|
1408
|
-
{
|
|
1409
|
-
let mddrs = [];
|
|
1410
|
-
const addr = this.#connections.get(id);
|
|
1411
|
-
const mddr = multiaddr(addr);
|
|
1412
|
-
mddrs.push(mddr);
|
|
1413
|
-
this.#dialMultiaddress(mddrs);
|
|
1414
|
-
}
|
|
1415
|
-
else if (this.#dialedKnownBootstrap.has(id)){
|
|
1416
|
-
let mddrs = [];
|
|
1417
|
-
const addrs = this.#dialedKnownBootstrap.get(id);
|
|
1418
|
-
for(const addr of addrs){
|
|
1419
|
-
const mddr = multiaddr(addr);
|
|
1420
|
-
mddrs.push(mddr);
|
|
1421
|
-
}
|
|
1422
|
-
this.#dialMultiaddress(mddrs);
|
|
1423
|
-
}
|
|
1424
|
-
else {
|
|
1425
|
-
const bootstrap = CONFIG_KNOWN_BOOTSTRAP_PEERS_ADDRS;
|
|
1426
|
-
const index = bootstrap.findIndex((peer)=>peer.Peers[0].ID == id);
|
|
1427
|
-
if(index > -1){
|
|
1428
|
-
const addrs = bootstrap[index].Peers[0].Addrs;
|
|
1429
|
-
let mddrs = [];
|
|
1430
|
-
for(const addr of addrs){
|
|
1431
|
-
const peeraddr = addr+'/p2p/'+id;
|
|
1432
|
-
const mddr = multiaddr(peeraddr);
|
|
1433
|
-
mddrs.push(mddr);
|
|
1434
|
-
}
|
|
1435
|
-
this.#dialMultiaddress(mddrs);
|
|
1436
|
-
}
|
|
1437
|
-
}
|
|
1438
|
-
}
|
|
1439
|
-
}
|
|
1440
|
-
},45*1000);
|
|
1441
|
-
}
|
|
1442
|
-
|
|
1443
|
-
|
|
1444
|
-
//track for good connection
|
|
1445
|
-
async #connectionTracker(){
|
|
1446
|
-
|
|
1447
|
-
for await (const { key, value } of this.#dbstore.query({})) {
|
|
1448
|
-
const id = key.toString().split('/')[1];
|
|
1449
|
-
const addr = new TextDecoder().decode(value);
|
|
1450
|
-
this.#dbstoreData.set(id,addr);
|
|
1451
|
-
}
|
|
1452
|
-
|
|
1453
|
-
setInterval(async ()=>{
|
|
1454
|
-
|
|
1455
|
-
//save peer address if connection is good
|
|
1456
|
-
const connections = this.#libp2p.getConnections();
|
|
1457
|
-
for(const connect of connections){
|
|
1458
|
-
const peer = connect.remotePeer;
|
|
1459
|
-
const remote = connect.remoteAddr;
|
|
1460
|
-
const upgraded = connect.timeline.upgraded;
|
|
1461
|
-
const bestlimit = 5*60*1000;
|
|
1462
|
-
const now = new Date().getTime();
|
|
1463
|
-
const besttime = now-upgraded;
|
|
1464
|
-
if(besttime>bestlimit){
|
|
1465
|
-
const addr = remote.toString();
|
|
1466
|
-
const id = peer.toString();
|
|
1467
|
-
if(!this.#webPeersId.includes(id) && !CONFIG_KNOWN_BOOTSTRAP_PEERS_IDS.includes(id) && !this.#dbstoreData.has(id) && !addr.includes('p2p-circuit') && addr.includes('webtransport')){
|
|
1468
|
-
await this.#dbstore.put(new Key(id), new TextEncoder().encode(addr));
|
|
1469
|
-
this.#dbstoreData.set(id,addr);
|
|
1470
|
-
}
|
|
1471
|
-
}
|
|
1472
|
-
const goodlimit = 60*1000;
|
|
1473
|
-
const goodtime = now-upgraded;
|
|
1474
|
-
if(goodtime>goodlimit){
|
|
1475
|
-
const id = peer.toString();
|
|
1476
|
-
if(!this.#dialedGoodPeers.has(id))this.#dialedGoodPeers.set(id,0);
|
|
1477
|
-
}
|
|
1478
|
-
|
|
1479
|
-
}
|
|
1480
|
-
|
|
1481
|
-
|
|
1482
|
-
//connect to saved best peer address
|
|
1483
|
-
//working great
|
|
1484
|
-
for(const peer of this.#dbstoreData){
|
|
1485
|
-
const id = peer[0];
|
|
1486
|
-
const addr = peer[1];
|
|
1487
|
-
if(this.#isConnected(id)){
|
|
1488
|
-
this.#connectionTrackerStore.set(id,0);
|
|
1489
|
-
continue
|
|
1490
|
-
}else {
|
|
1491
|
-
if(this.#connectionTrackerStore.has(id)){
|
|
1492
|
-
let current = this.#connectionTrackerStore.get(id);
|
|
1493
|
-
current++;
|
|
1494
|
-
this.#connectionTrackerStore.set(id,current);
|
|
1495
|
-
if(current>5){
|
|
1496
|
-
if(!this.#connections.has(id) && !CONFIG_KNOWN_BOOTSTRAP_PEERS_IDS.includes(id) && navigator.onLine)
|
|
1497
|
-
{
|
|
1498
|
-
setTimeout(async ()=> {
|
|
1499
|
-
if(this.#dbstoreData.has(id) && !this.#connections.has(id)){
|
|
1500
|
-
this.#dbstoreData.delete(id);
|
|
1501
|
-
await this.#dbstore.delete(new Key(id));
|
|
1502
|
-
}
|
|
1503
|
-
},60*1000);
|
|
1504
|
-
}
|
|
1505
|
-
continue
|
|
1506
|
-
}
|
|
1507
|
-
}
|
|
1508
|
-
else {
|
|
1509
|
-
this.#connectionTrackerStore.set(id,0);
|
|
1510
|
-
}
|
|
1511
|
-
let mddrs = [];
|
|
1512
|
-
const mddr = multiaddr(addr);
|
|
1513
|
-
mddrs.push(mddr);
|
|
1514
|
-
this.#dialMultiaddress(mddrs);
|
|
1515
|
-
}
|
|
1516
|
-
}
|
|
1517
|
-
|
|
1518
|
-
//connect to good peer address if it is disconnected
|
|
1519
|
-
const goods = Array.from(this.#dialedGoodPeers.keys());
|
|
1520
|
-
for(const id of goods){
|
|
1521
|
-
if(this.#isConnected(id)){
|
|
1522
|
-
this.#dialedGoodPeers.set(id,0);
|
|
1523
|
-
continue
|
|
1524
|
-
}
|
|
1525
|
-
else {
|
|
1526
|
-
|
|
1527
|
-
let count = this.#dialedGoodPeers.get(id);
|
|
1528
|
-
if (count < 15 || (count < 25 && this.#dialedKnownBootstrap.has(id))){
|
|
1529
|
-
const addr = this.#connections.get(id);
|
|
1530
|
-
let mddrs = [];
|
|
1531
|
-
const mddr = multiaddr(addr);
|
|
1532
|
-
mddrs.push(mddr);
|
|
1533
|
-
this.#dialMultiaddress(mddrs);
|
|
1534
|
-
count++;
|
|
1535
|
-
this.#dialedGoodPeers.set(id,count);
|
|
1536
|
-
}
|
|
1537
|
-
}
|
|
1538
|
-
}
|
|
1539
|
-
|
|
1540
|
-
},15*1000);
|
|
1541
|
-
}
|
|
1542
|
-
|
|
1543
|
-
|
|
1544
|
-
//update listen address on change
|
|
1545
|
-
//#ListenAddressChange = () => {}
|
|
1546
|
-
//#onSelfAddress = f => (this.#ListenAddressChange = f)
|
|
1547
|
-
|
|
1548
|
-
|
|
1549
|
-
//Periodically watch for connection
|
|
1550
|
-
#watchConnection(){
|
|
1551
|
-
setInterval(()=>{
|
|
1552
|
-
const peers = this.#libp2p.getPeers().length;
|
|
1553
|
-
if(peers == 0){
|
|
1554
|
-
this.#dialKnownPeers();
|
|
1555
|
-
}
|
|
1556
|
-
},120*1000);
|
|
1557
|
-
}
|
|
1558
|
-
|
|
1559
|
-
|
|
1560
|
-
//dial to all known bootstrap peers and DNS
|
|
1561
|
-
#dialKnownPeers(){
|
|
1562
|
-
setTimeout(()=>{
|
|
1563
|
-
this.#dialSavedKnownID();
|
|
1564
|
-
setTimeout(()=>{this.#dialUpdateSavedKnownID();},50000);
|
|
1565
|
-
setTimeout(()=>{this.#findHybridPeer();},60000);
|
|
1566
|
-
setTimeout(()=>{
|
|
1567
|
-
const peers = this.#libp2p.getPeers().length;
|
|
1568
|
-
if(peers == 0){
|
|
1569
|
-
this.#dialKnownID();
|
|
1570
|
-
setTimeout(()=>{this.#findHybridPeer();},60000);
|
|
1571
|
-
setTimeout(()=>{
|
|
1572
|
-
const peers = this.#libp2p.getPeers().length;
|
|
1573
|
-
if(peers == 0){
|
|
1574
|
-
this.#dialKnownBootstrap();
|
|
1575
|
-
setTimeout(()=>{this.#findHybridPeer();},15000);
|
|
1576
|
-
setTimeout(()=>{
|
|
1577
|
-
const peers = this.#libp2p.getPeers().length;
|
|
1578
|
-
if(peers == 0){
|
|
1579
|
-
this.#dialKnownDNS();
|
|
1580
|
-
setTimeout(()=>{this.#findHybridPeer();},15000);
|
|
1581
|
-
setTimeout(()=>{
|
|
1582
|
-
const peers = this.#libp2p.getPeers().length;
|
|
1583
|
-
if(peers == 0){
|
|
1584
|
-
this.#dialKnownDNSonly();
|
|
1585
|
-
setTimeout(()=>{this.#findHybridPeer();},15000);
|
|
1586
|
-
}
|
|
1587
|
-
},CONFIG_TIMEOUT_DIAL_KNOWN_PEERS);
|
|
1588
|
-
}
|
|
1589
|
-
},CONFIG_TIMEOUT_DIAL_KNOWN_PEERS);
|
|
1590
|
-
}
|
|
1591
|
-
},CONFIG_TIMEOUT_DIAL_KNOWN_PEERS);
|
|
1592
|
-
}
|
|
1593
|
-
},CONFIG_TIMEOUT_DIAL_KNOWN_PEERS);
|
|
1594
|
-
},5000);
|
|
1595
|
-
}
|
|
1596
|
-
|
|
1597
|
-
async #dialSavedKnownID(){
|
|
1598
|
-
|
|
1599
|
-
if(!navigator.onLine)return
|
|
1600
|
-
if(!this.#isDialEnabled)return
|
|
1601
|
-
|
|
1602
|
-
let firsttime = true;
|
|
1603
|
-
for(const target of CONFIG_KNOWN_BOOTSTRAP_PEERS_IDS){
|
|
1604
|
-
if(this.#dbstoreData.has(target)){
|
|
1605
|
-
firsttime = false;
|
|
1606
|
-
let mddrs = [];
|
|
1607
|
-
let addrs = [];
|
|
1608
|
-
const id = target;
|
|
1609
|
-
const peeraddr = this.#dbstoreData.get(target);
|
|
1610
|
-
const peermddr = multiaddr(peeraddr);
|
|
1611
|
-
addrs.push(peeraddr);
|
|
1612
|
-
mddrs.push(peermddr);
|
|
1613
|
-
this.#dialedKnownBootstrap.set(id,addrs);
|
|
1614
|
-
if(!this.#isConnected(id)){
|
|
1615
|
-
this.#dialMultiaddress(mddrs);
|
|
1616
|
-
}
|
|
1617
|
-
}
|
|
1618
|
-
}
|
|
1619
|
-
if(firsttime){
|
|
1620
|
-
for(const target of CONFIG_KNOWN_BOOTSTRAP_PEERS_IDS){
|
|
1621
|
-
const api = CONFIG_DELEGATED_API;
|
|
1622
|
-
const delegatedClient = createDelegatedRoutingV1HttpApiClient(api);
|
|
1623
|
-
const peer = await first(delegatedClient.getPeers(peerIdFromString(target)));
|
|
1624
|
-
if(!peer)continue
|
|
1625
|
-
const address = peer.Addrs;
|
|
1626
|
-
const id = peer.ID;
|
|
1627
|
-
let mddrs = [];
|
|
1628
|
-
let addrs = [];
|
|
1629
|
-
for(const addr of address){
|
|
1630
|
-
const peeraddr = addr.toString()+'/p2p/'+id.toString();
|
|
1631
|
-
const peermddr = multiaddr(peeraddr);
|
|
1632
|
-
addrs.push(peeraddr);
|
|
1633
|
-
mddrs.push(peermddr);
|
|
1634
|
-
}
|
|
1635
|
-
|
|
1636
|
-
this.#dialedKnownBootstrap.set(id,addrs);
|
|
1637
|
-
if(!this.#isConnected(id)){
|
|
1638
|
-
this.#dialMultiaddress(mddrs);
|
|
1639
|
-
}
|
|
1640
|
-
}
|
|
1641
|
-
}
|
|
1642
|
-
}
|
|
1643
|
-
|
|
1644
|
-
async #dialUpdateSavedKnownID(){
|
|
1645
|
-
|
|
1646
|
-
if(!navigator.onLine)return
|
|
1647
|
-
if(!this.#isDialEnabled)return
|
|
1648
|
-
|
|
1649
|
-
let firsttime = true;
|
|
1650
|
-
for(const target of CONFIG_KNOWN_BOOTSTRAP_PEERS_IDS){
|
|
1651
|
-
if(this.#dbstoreData.has(target)){
|
|
1652
|
-
firsttime = false;
|
|
1653
|
-
}
|
|
1654
|
-
if(!this.#connections.has(target) && (this.#dbstoreData.has(target) || firsttime)){
|
|
1655
|
-
//console.log('#dialUpdateSavedKnownID()',target)
|
|
1656
|
-
const api = CONFIG_DELEGATED_API;
|
|
1657
|
-
const delegatedClient = createDelegatedRoutingV1HttpApiClient(api);
|
|
1658
|
-
const peer = await first(delegatedClient.getPeers(peerIdFromString(target)));
|
|
1659
|
-
if(!peer){
|
|
1660
|
-
if (navigator.onLine) {
|
|
1661
|
-
await this.#dbstore.delete(new Key(target));
|
|
1662
|
-
}
|
|
1663
|
-
continue
|
|
1664
|
-
}
|
|
1665
|
-
const address = peer.Addrs;
|
|
1666
|
-
const id = peer.ID;
|
|
1667
|
-
let mddrs = [];
|
|
1668
|
-
let addrs = [];
|
|
1669
|
-
for(const addr of address){
|
|
1670
|
-
const peeraddr = addr.toString()+'/p2p/'+id.toString();
|
|
1671
|
-
const peermddr = multiaddr(peeraddr);
|
|
1672
|
-
addrs.push(peeraddr);
|
|
1673
|
-
mddrs.push(peermddr);
|
|
1674
|
-
}
|
|
1675
|
-
|
|
1676
|
-
this.#dialedKnownBootstrap.set(id,addrs);
|
|
1677
|
-
if(!this.#isConnected(id)){
|
|
1678
|
-
this.#dialMultiaddress(mddrs);
|
|
1679
|
-
}
|
|
1680
|
-
}
|
|
1681
|
-
}
|
|
1682
|
-
}
|
|
1683
|
-
|
|
1684
|
-
|
|
1685
|
-
//dial based on known peers ID
|
|
1686
|
-
async #dialKnownID(){
|
|
1687
|
-
|
|
1688
|
-
if(!navigator.onLine)return
|
|
1689
|
-
if(!this.#isDialEnabled)return
|
|
1690
|
-
|
|
1691
|
-
//console.log('#dialKnownID()')
|
|
1692
|
-
const api = CONFIG_DELEGATED_API;
|
|
1693
|
-
const delegatedClient = createDelegatedRoutingV1HttpApiClient(api);
|
|
1694
|
-
const BOOTSTRAP_PEER_IDS = CONFIG_KNOWN_BOOTSTRAP_PEERS_IDS;
|
|
1695
|
-
const peers = await Promise.all(
|
|
1696
|
-
BOOTSTRAP_PEER_IDS.map((peerId) => first(delegatedClient.getPeers(peerIdFromString(peerId)))),
|
|
1697
|
-
);
|
|
1698
|
-
for(const peer of peers){
|
|
1699
|
-
if(!peer)return
|
|
1700
|
-
const address = peer.Addrs;
|
|
1701
|
-
const id = peer.ID;
|
|
1702
|
-
let mddrs = [];
|
|
1703
|
-
let addrs = [];
|
|
1704
|
-
for(const addr of address){
|
|
1705
|
-
const peeraddr = addr.toString()+'/p2p/'+id.toString();
|
|
1706
|
-
const peermddr = multiaddr(peeraddr);
|
|
1707
|
-
addrs.push(peeraddr);
|
|
1708
|
-
mddrs.push(peermddr);
|
|
1709
|
-
}
|
|
1710
|
-
|
|
1711
|
-
this.#dialedKnownBootstrap.set(id,addrs);
|
|
1712
|
-
if(!this.#isConnected(id)){
|
|
1713
|
-
this.#dialMultiaddress(mddrs);
|
|
1714
|
-
}
|
|
1715
|
-
}
|
|
1716
|
-
}
|
|
1717
|
-
|
|
1718
|
-
|
|
1719
|
-
//dial based on known bootsrap peers address using Websocket expected
|
|
1720
|
-
#dialKnownBootstrap(){
|
|
1721
|
-
|
|
1722
|
-
if(!navigator.onLine)return
|
|
1723
|
-
if(!this.#isDialEnabled)return
|
|
1724
|
-
|
|
1725
|
-
const bootstrap = CONFIG_KNOWN_BOOTSTRAP_PEERS_ADDRS;
|
|
1726
|
-
for(const peer of bootstrap){
|
|
1727
|
-
const address = peer.Peers[0].Addrs;
|
|
1728
|
-
const id = peer.Peers[0].ID;
|
|
1729
|
-
let mddrs = [];
|
|
1730
|
-
let addrs = [];
|
|
1731
|
-
for(const addr of address){
|
|
1732
|
-
if(!addr.includes('wss'))continue
|
|
1733
|
-
const peeraddr = addr+'/p2p/'+id;
|
|
1734
|
-
const peermddr = multiaddr(peeraddr);
|
|
1735
|
-
addrs.push(peeraddr);
|
|
1736
|
-
mddrs.push(peermddr);
|
|
1737
|
-
}
|
|
1738
|
-
|
|
1739
|
-
this.#dialedKnownBootstrap.set(id,addrs);
|
|
1740
|
-
this.#isDialWebsocket = true;
|
|
1741
|
-
if(!this.#isConnected(id)){
|
|
1742
|
-
this.#dialMultiaddress(mddrs);
|
|
1743
|
-
}
|
|
1744
|
-
|
|
1745
|
-
}
|
|
1746
|
-
}
|
|
1747
|
-
|
|
1748
|
-
//dial based on known bootstrap DNS
|
|
1749
|
-
async #dialKnownDNS(){
|
|
1750
|
-
|
|
1751
|
-
if(!navigator.onLine)return
|
|
1752
|
-
if(!this.#isDialEnabled)return
|
|
1753
|
-
|
|
1754
|
-
const dnsresolver = CONFIG_DNS_RESOLVER;
|
|
1755
|
-
const bootstrapdns = CONFIG_KNOWN_BOOTSTRAP_DNS;
|
|
1756
|
-
const response = await fetch(dnsresolver+'?name='+bootstrapdns+'&type=txt');
|
|
1757
|
-
const json = await response.json();
|
|
1758
|
-
const dns = json.Answer;
|
|
1759
|
-
const BOOTSTRAP_PEER_IDS = [];
|
|
1760
|
-
for(const dnsaddr of dns){
|
|
1761
|
-
const id = dnsaddr.data.split('/').pop();
|
|
1762
|
-
BOOTSTRAP_PEER_IDS.push(id);
|
|
1763
|
-
}
|
|
1764
|
-
const api = CONFIG_DELEGATED_API;
|
|
1765
|
-
const delegatedClient = createDelegatedRoutingV1HttpApiClient(api);
|
|
1766
|
-
const peers = await Promise.all(
|
|
1767
|
-
BOOTSTRAP_PEER_IDS.map((peerId) => first(delegatedClient.getPeers(peerIdFromString(peerId)))),
|
|
1768
|
-
);
|
|
1769
|
-
for(const peer of peers){
|
|
1770
|
-
const address = peer.Addrs;
|
|
1771
|
-
const id = peer.ID;
|
|
1772
|
-
let mddrs = [];
|
|
1773
|
-
let addrs = [];
|
|
1774
|
-
for(const addr of address){
|
|
1775
|
-
const peeraddr = addr.toString()+'/p2p/'+id.toString();
|
|
1776
|
-
const peermddr = multiaddr(peeraddr);
|
|
1777
|
-
addrs.push(peeraddr);
|
|
1778
|
-
mddrs.push(peermddr);
|
|
1779
|
-
}
|
|
1780
|
-
|
|
1781
|
-
this.#dialedKnownBootstrap.set(id,addrs);
|
|
1782
|
-
this.#isDialWebsocket = true;
|
|
1783
|
-
if(!this.#isConnected(id)){
|
|
1784
|
-
this.#dialMultiaddress(mddrs);
|
|
1785
|
-
}
|
|
1786
|
-
}
|
|
1787
|
-
|
|
1788
|
-
}
|
|
1789
|
-
|
|
1790
|
-
|
|
1791
|
-
//dial based on known bootstrap DNS using DNS resolver only
|
|
1792
|
-
async #dialKnownDNSonly(){
|
|
1793
|
-
|
|
1794
|
-
if(!navigator.onLine)return
|
|
1795
|
-
if(!this.#isDialEnabled)return
|
|
1796
|
-
|
|
1797
|
-
const dnsresolver = CONFIG_DNS_RESOLVER;
|
|
1798
|
-
const bootstrapdns = CONFIG_KNOWN_BOOTSTRAP_DNS;
|
|
1799
|
-
const response = await fetch(dnsresolver+'?name='+bootstrapdns+'&type=txt');
|
|
1800
|
-
const json = await response.json();
|
|
1801
|
-
const dns = json.Answer;
|
|
1802
|
-
|
|
1803
|
-
for(const dnsitem of dns){
|
|
1804
|
-
const arr = dnsitem.data.split('/');
|
|
1805
|
-
const id = arr.pop();
|
|
1806
|
-
const dnsaddr = '_dnsaddr.'+arr[2];
|
|
1807
|
-
this.#dialDNSWebsocketWebtransport(id,dnsaddr);
|
|
1808
|
-
}
|
|
1809
|
-
}
|
|
1810
|
-
|
|
1811
|
-
|
|
1812
|
-
//dial DNS with webtransport and websocket
|
|
1813
|
-
async #dialDNSWebsocketWebtransport(id,dnsaddr){
|
|
1814
|
-
const dnsresolver = CONFIG_DNS_RESOLVER;
|
|
1815
|
-
const response = await fetch(dnsresolver+'?name='+dnsaddr+'&type=txt');
|
|
1816
|
-
const json = await response.json();
|
|
1817
|
-
const dns = json.Answer;
|
|
1818
|
-
let mddrs = [];
|
|
1819
|
-
let addrs = [];
|
|
1820
|
-
for(const dnsitem of dns){
|
|
1821
|
-
const arr = dnsitem.data.split('=');
|
|
1822
|
-
const dnsaddr = arr[1];
|
|
1823
|
-
const maddr = multiaddr(dnsaddr);
|
|
1824
|
-
mddrs.push(maddr);
|
|
1825
|
-
addrs.push(dnsaddr);
|
|
1826
|
-
}
|
|
1827
|
-
|
|
1828
|
-
|
|
1829
|
-
this.#isDialWebsocket = true;
|
|
1830
|
-
this.#dialedKnownBootstrap.set(id,addrs);
|
|
1831
|
-
|
|
1832
|
-
this.#dialedKnownBootstrap.set(id,addrs);
|
|
1833
|
-
if(!this.#isConnected(id)){
|
|
1834
|
-
this.#dialMultiaddress(mddrs);
|
|
1835
|
-
this.#dialWebsocket(mddrs);
|
|
1836
|
-
}
|
|
1837
|
-
}
|
|
1838
|
-
|
|
1839
|
-
|
|
1840
|
-
//dial only webtransport multiaddrs
|
|
1841
|
-
async #dialWebtransport(multiaddrs){
|
|
1842
|
-
const webTransportMadrs = multiaddrs.filter((maddr) => maddr.protoNames().includes('webtransport')&&maddr.protoNames().includes('certhash'));
|
|
1843
|
-
for (const mddr of webTransportMadrs) {
|
|
1844
|
-
try {
|
|
1845
|
-
//console.log(`attempting to dial webtransport multiaddr: %o`, mddr.toString())
|
|
1846
|
-
await this.#libp2p.dial(mddr);
|
|
1847
|
-
return // if we succeed dialing the peer, no need to try another address
|
|
1848
|
-
} catch (error) {
|
|
1849
|
-
}
|
|
1850
|
-
}
|
|
1851
|
-
}
|
|
1852
|
-
|
|
1853
|
-
//dial only websocket multiaddrs
|
|
1854
|
-
async #dialWebsocket(multiaddrs){
|
|
1855
|
-
const webSocketMadrs = multiaddrs.filter((maddr) => maddr.protoNames().includes('wss'));
|
|
1856
|
-
for (const mddr of webSocketMadrs) {
|
|
1857
|
-
try {
|
|
1858
|
-
//console.log(`attempting to dial websocket multiaddr: %o`, mddr)
|
|
1859
|
-
await this.#libp2p.dial(mddr);
|
|
1860
|
-
return // if we succeed dialing the peer, no need to try another address
|
|
1861
|
-
} catch (error) {
|
|
1862
|
-
}
|
|
1863
|
-
}
|
|
1864
|
-
}
|
|
1865
|
-
|
|
1866
|
-
|
|
1867
|
-
//entry point to webpeerjs
|
|
1868
|
-
static async createWebpeer(){
|
|
1869
|
-
|
|
1870
|
-
// all libp2p debug logs
|
|
1871
|
-
//localStorage.setItem('debug', 'libp2p:*')
|
|
1872
|
-
|
|
1873
|
-
const dbstore = new IDBDatastore(CONFIG_DBSTORE_PATH);
|
|
1874
|
-
await dbstore.open();
|
|
1875
|
-
|
|
1876
|
-
//let addrs = []
|
|
1877
|
-
const getbootstrap = CONFIG_KNOWN_BOOTSTRAP_PEERS_ADDRS;
|
|
1878
|
-
for(const peer of getbootstrap){
|
|
1879
|
-
const addrs = peer.Peers[0].Addrs;
|
|
1880
|
-
peer.Peers[0].ID;
|
|
1881
|
-
//let mddrs = []
|
|
1882
|
-
for(const addr of addrs){
|
|
1883
|
-
if(addr.includes('webtransport')&&addr.includes('certhash'));
|
|
1884
|
-
}
|
|
1885
|
-
}
|
|
1886
|
-
|
|
1887
|
-
let onMetricsFn = () => {};
|
|
1888
|
-
const onMetrics = f => (onMetricsFn = f);
|
|
1889
|
-
|
|
1890
|
-
//create libp2p instance
|
|
1891
|
-
const libp2p = await createLibp2p({
|
|
1892
|
-
addresses: {
|
|
1893
|
-
listen: [
|
|
1894
|
-
'/webrtc'
|
|
1895
|
-
],
|
|
1896
|
-
},
|
|
1897
|
-
transports:[
|
|
1898
|
-
webTransport(),
|
|
1899
|
-
webSockets(),
|
|
1900
|
-
webRTC(),
|
|
1901
|
-
circuitRelayTransport({
|
|
1902
|
-
discoverRelays: CONFIG_DISCOVER_RELAYS,
|
|
1903
|
-
reservationConcurrency: 1,
|
|
1904
|
-
maxReservationQueueLength: 3
|
|
1905
|
-
}),
|
|
1906
|
-
],
|
|
1907
|
-
connectionManager: {
|
|
1908
|
-
maxConnections: CONFIG_MAX_CONNECTIONS,
|
|
1909
|
-
minConnections: CONFIG_MIN_CONNECTIONS,
|
|
1910
|
-
autoDialInterval:60e3,
|
|
1911
|
-
autoDialConcurrency:0,
|
|
1912
|
-
autoDialMaxQueueLength:0,
|
|
1913
|
-
autoDialPriority:1000,
|
|
1914
|
-
autoDialDiscoveredPeersDebounce:60e3,
|
|
1915
|
-
maxParallelDials: 3,
|
|
1916
|
-
dialTimeout: 5e3,
|
|
1917
|
-
maxIncomingPendingConnections: 5,
|
|
1918
|
-
maxDialQueueLength:10,
|
|
1919
|
-
inboundConnectionThreshold:3,
|
|
1920
|
-
maxPeerAddrsToDial:2,
|
|
1921
|
-
inboundUpgradeTimeout:5e3
|
|
1922
|
-
},
|
|
1923
|
-
connectionEncryption: [noise()],
|
|
1924
|
-
streamMuxers: [
|
|
1925
|
-
yamux({
|
|
1926
|
-
maxInboundStreams: 20,
|
|
1927
|
-
maxOutboundStreams: 20,
|
|
1928
|
-
})
|
|
1929
|
-
],
|
|
1930
|
-
connectionGater: {
|
|
1931
|
-
filterMultiaddrForPeer: async (peer, multiaddrTest) => {
|
|
1932
|
-
const multiaddrString = multiaddrTest.toString();
|
|
1933
|
-
if (
|
|
1934
|
-
multiaddrString.includes("/ip4/127.0.0.1") ||
|
|
1935
|
-
multiaddrString.includes("/ip6/")
|
|
1936
|
-
) {
|
|
1937
|
-
return false;
|
|
1938
|
-
}
|
|
1939
|
-
return true;
|
|
1940
|
-
},
|
|
1941
|
-
denyDialMultiaddr: async (multiaddrTest) => {
|
|
1942
|
-
const multiaddrString = multiaddrTest.toString();
|
|
1943
|
-
if (
|
|
1944
|
-
multiaddrString.includes("/ip4/127.0.0.1") ||
|
|
1945
|
-
multiaddrString.includes("/ip6/")
|
|
1946
|
-
) {
|
|
1947
|
-
return true;
|
|
1948
|
-
}
|
|
1949
|
-
return false;
|
|
1950
|
-
},
|
|
1951
|
-
},
|
|
1952
|
-
peerDiscovery: [
|
|
1953
|
-
pubsubPeerDiscovery({
|
|
1954
|
-
interval: 10_000,
|
|
1955
|
-
topics: CONFIG_PUBSUB_PEER_DISCOVERY,
|
|
1956
|
-
listenOnly: false,
|
|
1957
|
-
}),
|
|
1958
|
-
|
|
1959
|
-
],
|
|
1960
|
-
services: {
|
|
1961
|
-
pubsub: gossipsub({
|
|
1962
|
-
allowPublishToZeroTopicPeers: true,
|
|
1963
|
-
msgIdFn: msgIdFnStrictNoSign,
|
|
1964
|
-
ignoreDuplicatePublishError: true,
|
|
1965
|
-
runOnTransientConnection:false,
|
|
1966
|
-
}),
|
|
1967
|
-
identify: identify(),
|
|
1968
|
-
identifyPush: identifyPush(),
|
|
1969
|
-
aminoDHT: kadDHT({
|
|
1970
|
-
protocol: '/ipfs/kad/1.0.0',
|
|
1971
|
-
peerInfoMapper: removePrivateAddressesMapper,
|
|
1972
|
-
clientMode: false
|
|
1973
|
-
}),
|
|
1974
|
-
dcutr: dcutr()
|
|
1975
|
-
},
|
|
1976
|
-
peerStore: {
|
|
1977
|
-
persistence: true,
|
|
1978
|
-
threshold: 1
|
|
1979
|
-
},
|
|
1980
|
-
metrics: simpleMetrics({
|
|
1981
|
-
onMetrics: (metrics) => {onMetricsFn(metrics);},
|
|
1982
|
-
intervalMs: 1000
|
|
1983
|
-
})
|
|
1984
|
-
});
|
|
1985
|
-
|
|
1986
|
-
|
|
1987
|
-
|
|
1988
|
-
//console.log(`Node started with id ${libp2p.peerId.toString()}`)
|
|
1989
|
-
|
|
1990
|
-
//DHT server mode act as bootstrap peer in IPFS network
|
|
1991
|
-
await libp2p.services.aminoDHT.setMode("server");
|
|
1992
|
-
|
|
1993
|
-
|
|
1994
|
-
//return webpeerjs class
|
|
1995
|
-
return new webpeerjs(libp2p,dbstore,onMetrics)
|
|
1996
|
-
}
|
|
1997
|
-
}
|
|
1998
|
-
|
|
1999
|
-
export { webpeerjs };
|
|
1
|
+
//! WebPEER.js -- https://github.com/nuzulul/webpeerjs
|
|
2
|
+
const e="webpeerjs",t=e,n="/"+e+"/1.0.0",r=e+"-dbstore",s=["universal-connectivity-browser-peer-discovery"],i=["_peer-discovery._p2p._pubsub",e+"-peer-discovery"],o=["_"+e+"-peer-data_"],a="https://delegated-ipfs.dev",c="https://dns.google/resolve",l="_dnsaddr.bootstrap.libp2p.io",u=15e3,h=["QmNnooDu7bfjPFoTZYxMNLWUQJyrVwtbZg5gBMjTezGAJN","QmbLHAnMoJPWSCR5Zhtx6BHJX9KiKNN6tpvbUcqanj75Nb","QmcZf59bWwK5XFi76CZX8cbJ4BhTzzA3gU1ZjYZcYW3dwt","QmaCpDMGvV2BGHeYERUEnRQAwe3N8SzbUtfsmvsqQLuvuJ"],d=["12D3KooWFhXabKDwALpzqMbto94sB7rvmZ6M28hs9Y9xSopDKwQr"],p=h.concat(d),f=[{Peers:[{Addrs:["/dns6/sv15.bootstrap.libp2p.io/tcp/443/wss","/dns4/sv15.bootstrap.libp2p.io/tcp/443/wss"],ID:"QmNnooDu7bfjPFoTZYxMNLWUQJyrVwtbZg5gBMjTezGAJN",Schema:"peer"}]},{Peers:[{Addrs:["/dns4/am6.bootstrap.libp2p.io/tcp/443/wss","/dns6/am6.bootstrap.libp2p.io/tcp/443/wss"],ID:"QmbLHAnMoJPWSCR5Zhtx6BHJX9KiKNN6tpvbUcqanj75Nb",Schema:"peer"}]},{Peers:[{Addrs:["/dns6/sg1.bootstrap.libp2p.io/tcp/443/wss","/dns4/sg1.bootstrap.libp2p.io/tcp/443/wss"],ID:"QmcZf59bWwK5XFi76CZX8cbJ4BhTzzA3gU1ZjYZcYW3dwt",Schema:"peer"}]}];function g(e=0){return new Uint8Array(e)}function m(e=0){return new Uint8Array(e)}const y=Math.pow(2,7),w=Math.pow(2,14),b=Math.pow(2,21),v=Math.pow(2,28),E=Math.pow(2,35),S=Math.pow(2,42),_=Math.pow(2,49),I=128,R=127;function A(e){if(e<y)return 1;if(e<w)return 2;if(e<b)return 3;if(e<v)return 4;if(e<E)return 5;if(e<S)return 6;if(e<_)return 7;if(null!=Number.MAX_SAFE_INTEGER&&e>Number.MAX_SAFE_INTEGER)throw new RangeError("Could not encode varint");return 8}function T(e,t,n=0){switch(A(e)){case 8:t[n++]=255&e|I,e/=128;case 7:t[n++]=255&e|I,e/=128;case 6:t[n++]=255&e|I,e/=128;case 5:t[n++]=255&e|I,e/=128;case 4:t[n++]=255&e|I,e>>>=7;case 3:t[n++]=255&e|I,e>>>=7;case 2:t[n++]=255&e|I,e>>>=7;case 1:t[n++]=255&e,e>>>=7;break;default:throw new Error("unreachable")}return t}function D(e,t){let n=e[t],r=0;if(r+=n&R,n<I)return r;if(n=e[t+1],r+=(n&R)<<7,n<I)return r;if(n=e[t+2],r+=(n&R)<<14,n<I)return r;if(n=e[t+3],r+=(n&R)<<21,n<I)return r;if(n=e[t+4],r+=(n&R)*v,n<I)return r;if(n=e[t+5],r+=(n&R)*E,n<I)return r;if(n=e[t+6],r+=(n&R)*S,n<I)return r;if(n=e[t+7],r+=(n&R)*_,n<I)return r;throw new RangeError("Could not decode varint")}function k(e,t,n=0){return null==t&&(t=m(A(e))),t instanceof Uint8Array?T(e,t,n):function(e,t,n=0){switch(A(e)){case 8:t.set(n++,255&e|I),e/=128;case 7:t.set(n++,255&e|I),e/=128;case 6:t.set(n++,255&e|I),e/=128;case 5:t.set(n++,255&e|I),e/=128;case 4:t.set(n++,255&e|I),e>>>=7;case 3:t.set(n++,255&e|I),e>>>=7;case 2:t.set(n++,255&e|I),e>>>=7;case 1:t.set(n++,255&e),e>>>=7;break;default:throw new Error("unreachable")}return t}(e,t,n)}function P(e,t=0){return e instanceof Uint8Array?D(e,t):function(e,t){let n=e.get(t),r=0;if(r+=n&R,n<I)return r;if(n=e.get(t+1),r+=(n&R)<<7,n<I)return r;if(n=e.get(t+2),r+=(n&R)<<14,n<I)return r;if(n=e.get(t+3),r+=(n&R)<<21,n<I)return r;if(n=e.get(t+4),r+=(n&R)*v,n<I)return r;if(n=e.get(t+5),r+=(n&R)*E,n<I)return r;if(n=e.get(t+6),r+=(n&R)*S,n<I)return r;if(n=e.get(t+7),r+=(n&R)*_,n<I)return r;throw new RangeError("Could not decode varint")}(e,t)}const C=new Float32Array([-0]),x=new Uint8Array(C.buffer);function N(e,t,n){C[0]=e,t[n]=x[0],t[n+1]=x[1],t[n+2]=x[2],t[n+3]=x[3]}const M=new Float64Array([-0]),O=new Uint8Array(M.buffer);function L(e,t,n){M[0]=e,t[n]=O[0],t[n+1]=O[1],t[n+2]=O[2],t[n+3]=O[3],t[n+4]=O[4],t[n+5]=O[5],t[n+6]=O[6],t[n+7]=O[7]}const B=BigInt(Number.MAX_SAFE_INTEGER),U=BigInt(Number.MIN_SAFE_INTEGER);class F{lo;hi;constructor(e,t){this.lo=0|e,this.hi=0|t}toNumber(e=!1){if(!e&&this.hi>>>31>0){const e=1+~this.lo>>>0;let t=~this.hi>>>0;return 0===e&&(t=t+1>>>0),-(e+4294967296*t)}return this.lo+4294967296*this.hi}toBigInt(e=!1){if(e)return BigInt(this.lo>>>0)+(BigInt(this.hi>>>0)<<32n);if(this.hi>>>31!=0){const e=1+~this.lo>>>0;let t=~this.hi>>>0;return 0===e&&(t=t+1>>>0),-(BigInt(e)+(BigInt(t)<<32n))}return BigInt(this.lo>>>0)+(BigInt(this.hi>>>0)<<32n)}toString(e=!1){return this.toBigInt(e).toString()}zzEncode(){const e=this.hi>>31;return this.hi=((this.hi<<1|this.lo>>>31)^e)>>>0,this.lo=(this.lo<<1^e)>>>0,this}zzDecode(){const e=-(1&this.lo);return this.lo=((this.lo>>>1|this.hi<<31)^e)>>>0,this.hi=(this.hi>>>1^e)>>>0,this}length(){const e=this.lo,t=(this.lo>>>28|this.hi<<4)>>>0,n=this.hi>>>24;return 0===n?0===t?e<16384?e<128?1:2:e<2097152?3:4:t<16384?t<128?5:6:t<2097152?7:8:n<128?9:10}static fromBigInt(e){if(0n===e)return V;if(e<B&&e>U)return this.fromNumber(Number(e));const t=e<0n;t&&(e=-e);let n=e>>32n,r=e-(n<<32n);return t&&(n=0n|~n,r=0n|~r,++r>K&&(r=0n,++n>K&&(n=0n))),new F(Number(r),Number(n))}static fromNumber(e){if(0===e)return V;const t=e<0;t&&(e=-e);let n=e>>>0,r=(e-n)/4294967296>>>0;return t&&(r=~r>>>0,n=~n>>>0,++n>4294967295&&(n=0,++r>4294967295&&(r=0))),new F(n,r)}static from(e){return"number"==typeof e?F.fromNumber(e):"bigint"==typeof e?F.fromBigInt(e):"string"==typeof e?F.fromBigInt(BigInt(e)):null!=e.low||null!=e.high?new F(e.low>>>0,e.high>>>0):V}}const V=new F(0,0);V.toBigInt=function(){return 0n},V.zzEncode=V.zzDecode=function(){return this},V.length=function(){return 1};const K=4294967296n;function $(e,t,n){const r=n;let s,i;for(let r=0;r<e.length;++r)s=e.charCodeAt(r),s<128?t[n++]=s:s<2048?(t[n++]=s>>6|192,t[n++]=63&s|128):55296==(64512&s)&&56320==(64512&(i=e.charCodeAt(r+1)))?(s=65536+((1023&s)<<10)+(1023&i),++r,t[n++]=s>>18|240,t[n++]=s>>12&63|128,t[n++]=s>>6&63|128,t[n++]=63&s|128):(t[n++]=s>>12|224,t[n++]=s>>6&63|128,t[n++]=63&s|128);return n-r}function q(e,t){return RangeError(`index out of range: ${e.pos} + ${t??1} > ${e.len}`)}function H(e,t){return(e[t-4]|e[t-3]<<8|e[t-2]<<16|e[t-1]<<24)>>>0}class z{buf;pos;len;_slice=Uint8Array.prototype.subarray;constructor(e){this.buf=e,this.pos=0,this.len=e.length}uint32(){let e=4294967295;if(e=(127&this.buf[this.pos])>>>0,this.buf[this.pos++]<128)return e;if(e=(e|(127&this.buf[this.pos])<<7)>>>0,this.buf[this.pos++]<128)return e;if(e=(e|(127&this.buf[this.pos])<<14)>>>0,this.buf[this.pos++]<128)return e;if(e=(e|(127&this.buf[this.pos])<<21)>>>0,this.buf[this.pos++]<128)return e;if(e=(e|(15&this.buf[this.pos])<<28)>>>0,this.buf[this.pos++]<128)return e;if((this.pos+=5)>this.len)throw this.pos=this.len,q(this,10);return e}int32(){return 0|this.uint32()}sint32(){const e=this.uint32();return e>>>1^-(1&e)}bool(){return 0!==this.uint32()}fixed32(){if(this.pos+4>this.len)throw q(this,4);return H(this.buf,this.pos+=4)}sfixed32(){if(this.pos+4>this.len)throw q(this,4);return 0|H(this.buf,this.pos+=4)}float(){if(this.pos+4>this.len)throw q(this,4);const e=(t=this.buf,n=this.pos,x[0]=t[n],x[1]=t[n+1],x[2]=t[n+2],x[3]=t[n+3],C[0]);var t,n;return this.pos+=4,e}double(){if(this.pos+8>this.len)throw q(this,4);const e=(t=this.buf,n=this.pos,O[0]=t[n],O[1]=t[n+1],O[2]=t[n+2],O[3]=t[n+3],O[4]=t[n+4],O[5]=t[n+5],O[6]=t[n+6],O[7]=t[n+7],M[0]);var t,n;return this.pos+=8,e}bytes(){const e=this.uint32(),t=this.pos,n=this.pos+e;if(n>this.len)throw q(this,e);return this.pos+=e,t===n?new Uint8Array(0):this.buf.subarray(t,n)}string(){const e=this.bytes();return function(e,t,n){if(n-t<1)return"";let r;const s=[];let i,o=0;for(;t<n;)i=e[t++],i<128?s[o++]=i:i>191&&i<224?s[o++]=(31&i)<<6|63&e[t++]:i>239&&i<365?(i=((7&i)<<18|(63&e[t++])<<12|(63&e[t++])<<6|63&e[t++])-65536,s[o++]=55296+(i>>10),s[o++]=56320+(1023&i)):s[o++]=(15&i)<<12|(63&e[t++])<<6|63&e[t++],o>8191&&((r??(r=[])).push(String.fromCharCode.apply(String,s)),o=0);return null!=r?(o>0&&r.push(String.fromCharCode.apply(String,s.slice(0,o))),r.join("")):String.fromCharCode.apply(String,s.slice(0,o))}(e,0,e.length)}skip(e){if("number"==typeof e){if(this.pos+e>this.len)throw q(this,e);this.pos+=e}else do{if(this.pos>=this.len)throw q(this)}while(128&this.buf[this.pos++]);return this}skipType(e){switch(e){case 0:this.skip();break;case 1:this.skip(8);break;case 2:this.skip(this.uint32());break;case 3:for(;4!=(e=7&this.uint32());)this.skipType(e);break;case 5:this.skip(4);break;default:throw Error(`invalid wire type ${e} at offset ${this.pos}`)}return this}readLongVarint(){const e=new F(0,0);let t=0;if(!(this.len-this.pos>4)){for(;t<3;++t){if(this.pos>=this.len)throw q(this);if(e.lo=(e.lo|(127&this.buf[this.pos])<<7*t)>>>0,this.buf[this.pos++]<128)return e}return e.lo=(e.lo|(127&this.buf[this.pos++])<<7*t)>>>0,e}for(;t<4;++t)if(e.lo=(e.lo|(127&this.buf[this.pos])<<7*t)>>>0,this.buf[this.pos++]<128)return e;if(e.lo=(e.lo|(127&this.buf[this.pos])<<28)>>>0,e.hi=(e.hi|(127&this.buf[this.pos])>>4)>>>0,this.buf[this.pos++]<128)return e;if(t=0,this.len-this.pos>4){for(;t<5;++t)if(e.hi=(e.hi|(127&this.buf[this.pos])<<7*t+3)>>>0,this.buf[this.pos++]<128)return e}else for(;t<5;++t){if(this.pos>=this.len)throw q(this);if(e.hi=(e.hi|(127&this.buf[this.pos])<<7*t+3)>>>0,this.buf[this.pos++]<128)return e}throw Error("invalid varint encoding")}readFixed64(){if(this.pos+8>this.len)throw q(this,8);const e=H(this.buf,this.pos+=4),t=H(this.buf,this.pos+=4);return new F(e,t)}int64(){return this.readLongVarint().toBigInt()}int64Number(){return this.readLongVarint().toNumber()}int64String(){return this.readLongVarint().toString()}uint64(){return this.readLongVarint().toBigInt(!0)}uint64Number(){const e=D(this.buf,this.pos);return this.pos+=A(e),e}uint64String(){return this.readLongVarint().toString(!0)}sint64(){return this.readLongVarint().zzDecode().toBigInt()}sint64Number(){return this.readLongVarint().zzDecode().toNumber()}sint64String(){return this.readLongVarint().zzDecode().toString()}fixed64(){return this.readFixed64().toBigInt()}fixed64Number(){return this.readFixed64().toNumber()}fixed64String(){return this.readFixed64().toString()}sfixed64(){return this.readFixed64().toBigInt()}sfixed64Number(){return this.readFixed64().toNumber()}sfixed64String(){return this.readFixed64().toString()}}function W(e,t,n){const r=function(e){return new z(e instanceof Uint8Array?e:e.subarray())}(e);return t.decode(r,void 0,n)}function j(e){if(e instanceof Uint8Array&&"Uint8Array"===e.constructor.name)return e;if(e instanceof ArrayBuffer)return new Uint8Array(e);if(ArrayBuffer.isView(e))return new Uint8Array(e.buffer,e.byteOffset,e.byteLength);throw new Error("Unknown type, must be binary type")}var G=function(e,t){if(e.length>=255)throw new TypeError("Alphabet too long");for(var n=new Uint8Array(256),r=0;r<n.length;r++)n[r]=255;for(var s=0;s<e.length;s++){var i=e.charAt(s),o=i.charCodeAt(0);if(255!==n[o])throw new TypeError(i+" is ambiguous");n[o]=s}var a=e.length,c=e.charAt(0),l=Math.log(a)/Math.log(256),u=Math.log(256)/Math.log(a);function h(e){if("string"!=typeof e)throw new TypeError("Expected String");if(0===e.length)return new Uint8Array;var t=0;if(" "!==e[t]){for(var r=0,s=0;e[t]===c;)r++,t++;for(var i=(e.length-t)*l+1>>>0,o=new Uint8Array(i);e[t];){var u=n[e.charCodeAt(t)];if(255===u)return;for(var h=0,d=i-1;(0!==u||h<s)&&-1!==d;d--,h++)u+=a*o[d]>>>0,o[d]=u%256>>>0,u=u/256>>>0;if(0!==u)throw new Error("Non-zero carry");s=h,t++}if(" "!==e[t]){for(var p=i-s;p!==i&&0===o[p];)p++;for(var f=new Uint8Array(r+(i-p)),g=r;p!==i;)f[g++]=o[p++];return f}}}return{encode:function(t){if(t instanceof Uint8Array||(ArrayBuffer.isView(t)?t=new Uint8Array(t.buffer,t.byteOffset,t.byteLength):Array.isArray(t)&&(t=Uint8Array.from(t))),!(t instanceof Uint8Array))throw new TypeError("Expected Uint8Array");if(0===t.length)return"";for(var n=0,r=0,s=0,i=t.length;s!==i&&0===t[s];)s++,n++;for(var o=(i-s)*u+1>>>0,l=new Uint8Array(o);s!==i;){for(var h=t[s],d=0,p=o-1;(0!==h||d<r)&&-1!==p;p--,d++)h+=256*l[p]>>>0,l[p]=h%a>>>0,h=h/a>>>0;if(0!==h)throw new Error("Non-zero carry");r=d,s++}for(var f=o-r;f!==o&&0===l[f];)f++;for(var g=c.repeat(n);f<o;++f)g+=e.charAt(l[f]);return g},decodeUnsafe:h,decode:function(e){var n=h(e);if(n)return n;throw new Error(`Non-${t} character`)}}},Y=G;class Q{name;prefix;baseEncode;constructor(e,t,n){this.name=e,this.prefix=t,this.baseEncode=n}encode(e){if(e instanceof Uint8Array)return`${this.prefix}${this.baseEncode(e)}`;throw Error("Unknown type, must be binary type")}}let J=class{name;prefix;baseDecode;prefixCodePoint;constructor(e,t,n){if(this.name=e,this.prefix=t,void 0===t.codePointAt(0))throw new Error("Invalid prefix character");this.prefixCodePoint=t.codePointAt(0),this.baseDecode=n}decode(e){if("string"==typeof e){if(e.codePointAt(0)!==this.prefixCodePoint)throw Error(`Unable to decode multibase string ${JSON.stringify(e)}, ${this.name} decoder only supports inputs prefixed with ${this.prefix}`);return this.baseDecode(e.slice(this.prefix.length))}throw Error("Can only multibase decode strings")}or(e){return X(this,e)}};class Z{decoders;constructor(e){this.decoders=e}or(e){return X(this,e)}decode(e){const t=e[0],n=this.decoders[t];if(null!=n)return n.decode(e);throw RangeError(`Unable to decode multibase string ${JSON.stringify(e)}, only inputs prefixed with ${Object.keys(this.decoders)} are supported`)}}function X(e,t){return new Z({...e.decoders??{[e.prefix]:e},...t.decoders??{[t.prefix]:t}})}class ee{name;prefix;baseEncode;baseDecode;encoder;decoder;constructor(e,t,n,r){this.name=e,this.prefix=t,this.baseEncode=n,this.baseDecode=r,this.encoder=new Q(e,t,n),this.decoder=new J(e,t,r)}encode(e){return this.encoder.encode(e)}decode(e){return this.decoder.decode(e)}}function te({name:e,prefix:t,encode:n,decode:r}){return new ee(e,t,n,r)}function ne({name:e,prefix:t,alphabet:n}){const{encode:r,decode:s}=Y(n,e);return te({prefix:t,name:e,encode:r,decode:e=>j(s(e))})}function re({name:e,prefix:t,bitsPerChar:n,alphabet:r}){return te({prefix:t,name:e,encode:e=>function(e,t,n){const r="="===t[t.length-1],s=(1<<n)-1;let i="",o=0,a=0;for(let r=0;r<e.length;++r)for(a=a<<8|e[r],o+=8;o>n;)o-=n,i+=t[s&a>>o];if(0!==o&&(i+=t[s&a<<n-o]),r)for(;i.length*n&7;)i+="=";return i}(e,r,n),decode:t=>function(e,t,n,r){const s={};for(let e=0;e<t.length;++e)s[t[e]]=e;let i=e.length;for(;"="===e[i-1];)--i;const o=new Uint8Array(i*n/8|0);let a=0,c=0,l=0;for(let t=0;t<i;++t){const i=s[e[t]];if(void 0===i)throw new SyntaxError(`Non-${r} character`);c=c<<n|i,a+=n,a>=8&&(a-=8,o[l++]=255&c>>a)}if(a>=n||255&c<<8-a)throw new SyntaxError("Unexpected end of data");return o}(t,r,n,e)})}const se=ne({prefix:"9",name:"base10",alphabet:"0123456789"});var ie=Object.freeze({__proto__:null,base10:se});const oe=re({prefix:"f",name:"base16",alphabet:"0123456789abcdef",bitsPerChar:4}),ae=re({prefix:"F",name:"base16upper",alphabet:"0123456789ABCDEF",bitsPerChar:4});var ce=Object.freeze({__proto__:null,base16:oe,base16upper:ae});const le=re({prefix:"0",name:"base2",alphabet:"01",bitsPerChar:1});var ue=Object.freeze({__proto__:null,base2:le});const he=Array.from("🚀🪐☄🛰🌌🌑🌒🌓🌔🌕🌖🌗🌘🌍🌏🌎🐉☀💻🖥💾💿😂❤😍🤣😊🙏💕😭😘👍😅👏😁🔥🥰💔💖💙😢🤔😆🙄💪😉☺👌🤗💜😔😎😇🌹🤦🎉💞✌✨🤷😱😌🌸🙌😋💗💚😏💛🙂💓🤩😄😀🖤😃💯🙈👇🎶😒🤭❣😜💋👀😪😑💥🙋😞😩😡🤪👊🥳😥🤤👉💃😳✋😚😝😴🌟😬🙃🍀🌷😻😓⭐✅🥺🌈😈🤘💦✔😣🏃💐☹🎊💘😠☝😕🌺🎂🌻😐🖕💝🙊😹🗣💫💀👑🎵🤞😛🔴😤🌼😫⚽🤙☕🏆🤫👈😮🙆🍻🍃🐶💁😲🌿🧡🎁⚡🌞🎈❌✊👋😰🤨😶🤝🚶💰🍓💢🤟🙁🚨💨🤬✈🎀🍺🤓😙💟🌱😖👶🥴▶➡❓💎💸⬇😨🌚🦋😷🕺⚠🙅😟😵👎🤲🤠🤧📌🔵💅🧐🐾🍒😗🤑🌊🤯🐷☎💧😯💆👆🎤🙇🍑❄🌴💣🐸💌📍🥀🤢👅💡💩👐📸👻🤐🤮🎼🥵🚩🍎🍊👼💍📣🥂"),de=he.reduce(((e,t,n)=>(e[n]=t,e)),[]),pe=he.reduce(((e,t,n)=>(e[t.codePointAt(0)]=n,e)),[]);const fe=te({prefix:"🚀",name:"base256emoji",encode:function(e){return e.reduce(((e,t)=>e+=de[t]),"")},decode:function(e){const t=[];for(const n of e){const e=pe[n.codePointAt(0)];if(void 0===e)throw new Error(`Non-base256emoji character: ${n}`);t.push(e)}return new Uint8Array(t)}});var ge=Object.freeze({__proto__:null,base256emoji:fe});const me=re({prefix:"b",name:"base32",alphabet:"abcdefghijklmnopqrstuvwxyz234567",bitsPerChar:5}),ye=re({prefix:"B",name:"base32upper",alphabet:"ABCDEFGHIJKLMNOPQRSTUVWXYZ234567",bitsPerChar:5}),we=re({prefix:"c",name:"base32pad",alphabet:"abcdefghijklmnopqrstuvwxyz234567=",bitsPerChar:5}),be=re({prefix:"C",name:"base32padupper",alphabet:"ABCDEFGHIJKLMNOPQRSTUVWXYZ234567=",bitsPerChar:5}),ve=re({prefix:"v",name:"base32hex",alphabet:"0123456789abcdefghijklmnopqrstuv",bitsPerChar:5}),Ee=re({prefix:"V",name:"base32hexupper",alphabet:"0123456789ABCDEFGHIJKLMNOPQRSTUV",bitsPerChar:5}),Se=re({prefix:"t",name:"base32hexpad",alphabet:"0123456789abcdefghijklmnopqrstuv=",bitsPerChar:5}),_e=re({prefix:"T",name:"base32hexpadupper",alphabet:"0123456789ABCDEFGHIJKLMNOPQRSTUV=",bitsPerChar:5}),Ie=re({prefix:"h",name:"base32z",alphabet:"ybndrfg8ejkmcpqxot1uwisza345h769",bitsPerChar:5});var Re=Object.freeze({__proto__:null,base32:me,base32hex:ve,base32hexpad:Se,base32hexpadupper:_e,base32hexupper:Ee,base32pad:we,base32padupper:be,base32upper:ye,base32z:Ie});const Ae=ne({prefix:"k",name:"base36",alphabet:"0123456789abcdefghijklmnopqrstuvwxyz"}),Te=ne({prefix:"K",name:"base36upper",alphabet:"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"});var De=Object.freeze({__proto__:null,base36:Ae,base36upper:Te});const ke=ne({name:"base58btc",prefix:"z",alphabet:"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz"}),Pe=ne({name:"base58flickr",prefix:"Z",alphabet:"123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ"});var Ce=Object.freeze({__proto__:null,base58btc:ke,base58flickr:Pe});const xe=re({prefix:"m",name:"base64",alphabet:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",bitsPerChar:6}),Ne=re({prefix:"M",name:"base64pad",alphabet:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",bitsPerChar:6}),Me=re({prefix:"u",name:"base64url",alphabet:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_",bitsPerChar:6}),Oe=re({prefix:"U",name:"base64urlpad",alphabet:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_=",bitsPerChar:6});var Le=Object.freeze({__proto__:null,base64:xe,base64pad:Ne,base64url:Me,base64urlpad:Oe});const Be=re({prefix:"7",name:"base8",alphabet:"01234567",bitsPerChar:3});var Ue=Object.freeze({__proto__:null,base8:Be});const Fe=te({prefix:"\0",name:"identity",encode:e=>{return t=e,(new TextDecoder).decode(t);var t},decode:e=>function(e){return(new TextEncoder).encode(e)}(e)});var Ve=Object.freeze({__proto__:null,identity:Fe});new TextEncoder,new TextDecoder;var Ke=function e(t,n,r){n=n||[];var s=r=r||0;for(;t>=He;)n[r++]=255&t|$e,t/=128;for(;t&qe;)n[r++]=255&t|$e,t>>>=7;return n[r]=0|t,e.bytes=r-s+1,n},$e=128,qe=-128,He=Math.pow(2,31);var ze=function e(t,n){var r,s=0,i=0,o=n=n||0,a=t.length;do{if(o>=a)throw e.bytes=0,new RangeError("Could not decode varint");r=t[o++],s+=i<28?(r&je)<<i:(r&je)*Math.pow(2,i),i+=7}while(r>=We);return e.bytes=o-n,s},We=128,je=127;var Ge=Math.pow(2,7),Ye=Math.pow(2,14),Qe=Math.pow(2,21),Je=Math.pow(2,28),Ze=Math.pow(2,35),Xe=Math.pow(2,42),et=Math.pow(2,49),tt=Math.pow(2,56),nt=Math.pow(2,63),rt={encode:Ke,decode:ze,encodingLength:function(e){return e<Ge?1:e<Ye?2:e<Qe?3:e<Je?4:e<Ze?5:e<Xe?6:e<et?7:e<tt?8:e<nt?9:10}};function st(e,t=0){return[rt.decode(e,t),rt.decode.bytes]}function it(e,t,n=0){return rt.encode(e,t,n),t}function ot(e){return rt.encodingLength(e)}function at(e,t){const n=t.byteLength,r=ot(e),s=r+ot(n),i=new Uint8Array(s+n);return it(e,i,0),it(n,i,r),i.set(t,s),new lt(e,n,t,i)}function ct(e){const t=j(e),[n,r]=st(t),[s,i]=st(t.subarray(r)),o=t.subarray(r+i);if(o.byteLength!==s)throw new Error("Incorrect length");return new lt(n,s,o,t)}class lt{code;size;digest;bytes;constructor(e,t,n,r){this.code=e,this.size=t,this.digest=n,this.bytes=r}}const ut=j;const ht={code:0,name:"identity",encode:ut,digest:function(e){return at(0,ut(e))}};class dt{name;code;encode;constructor(e,t,n){this.name=e,this.code=t,this.encode=n}digest(e){if(e instanceof Uint8Array){const t=this.encode(e);return t instanceof Uint8Array?at(this.code,t):t.then((e=>at(this.code,e)))}throw Error("Unknown type, must be binary type")}}const pt=function({name:e,code:t,encode:n}){return new dt(e,t,n)}({name:"sha2-256",code:18,encode:function(e){return async t=>new Uint8Array(await crypto.subtle.digest(e,t))}("SHA-256")});function ft(e,t){const{bytes:n,version:r}=e;return 0===r?function(e,t,n){const{prefix:r}=n;if(r!==ke.prefix)throw Error(`Cannot string encode V0 in ${n.name} encoding`);const s=t.get(r);if(null==s){const s=n.encode(e).slice(1);return t.set(r,s),s}return s}(n,mt(e),t??ke.encoder):function(e,t,n){const{prefix:r}=n,s=t.get(r);if(null==s){const s=n.encode(e);return t.set(r,s),s}return s}(n,mt(e),t??me.encoder)}const gt=new WeakMap;function mt(e){const t=gt.get(e);if(null==t){const t=new Map;return gt.set(e,t),t}return t}class yt{code;version;multihash;bytes;"/";constructor(e,t,n,r){this.code=t,this.version=e,this.multihash=n,this.bytes=r,this["/"]=r}get asCID(){return this}get byteOffset(){return this.bytes.byteOffset}get byteLength(){return this.bytes.byteLength}toV0(){switch(this.version){case 0:return this;case 1:{const{code:e,multihash:t}=this;if(e!==wt)throw new Error("Cannot convert a non dag-pb CID to CIDv0");if(t.code!==bt)throw new Error("Cannot convert non sha2-256 multihash CID to CIDv0");return yt.createV0(t)}default:throw Error(`Can not convert CID version ${this.version} to version 0. This is a bug please report`)}}toV1(){switch(this.version){case 0:{const{code:e,digest:t}=this.multihash,n=at(e,t);return yt.createV1(this.code,n)}case 1:return this;default:throw Error(`Can not convert CID version ${this.version} to version 1. This is a bug please report`)}}equals(e){return yt.equals(this,e)}static equals(e,t){const n=t;return null!=n&&e.code===n.code&&e.version===n.version&&function(e,t){if(e===t)return!0;{const n=t;return e.code===n.code&&e.size===n.size&&n.bytes instanceof Uint8Array&&function(e,t){if(e===t)return!0;if(e.byteLength!==t.byteLength)return!1;for(let n=0;n<e.byteLength;n++)if(e[n]!==t[n])return!1;return!0}(e.bytes,n.bytes)}}(e.multihash,n.multihash)}toString(e){return ft(this,e)}toJSON(){return{"/":ft(this)}}link(){return this}[Symbol.toStringTag]="CID";[Symbol.for("nodejs.util.inspect.custom")](){return`CID(${this.toString()})`}static asCID(e){if(null==e)return null;const t=e;if(t instanceof yt)return t;if(null!=t["/"]&&t["/"]===t.bytes||t.asCID===t){const{version:e,code:n,multihash:r,bytes:s}=t;return new yt(e,n,r,s??vt(e,n,r.bytes))}if(!0===t[Et]){const{version:e,multihash:n,code:r}=t,s=ct(n);return yt.create(e,r,s)}return null}static create(e,t,n){if("number"!=typeof t)throw new Error("String codecs are no longer supported");if(!(n.bytes instanceof Uint8Array))throw new Error("Invalid digest");switch(e){case 0:if(t!==wt)throw new Error(`Version 0 CID must use dag-pb (code: ${wt}) block encoding`);return new yt(e,t,n,n.bytes);case 1:{const r=vt(e,t,n.bytes);return new yt(e,t,n,r)}default:throw new Error("Invalid version")}}static createV0(e){return yt.create(0,wt,e)}static createV1(e,t){return yt.create(1,e,t)}static decode(e){const[t,n]=yt.decodeFirst(e);if(0!==n.length)throw new Error("Incorrect length");return t}static decodeFirst(e){const t=yt.inspectBytes(e),n=t.size-t.multihashSize,r=j(e.subarray(n,n+t.multihashSize));if(r.byteLength!==t.multihashSize)throw new Error("Incorrect length");const s=r.subarray(t.multihashSize-t.digestSize),i=new lt(t.multihashCode,t.digestSize,s,r);return[0===t.version?yt.createV0(i):yt.createV1(t.codec,i),e.subarray(t.size)]}static inspectBytes(e){let t=0;const n=()=>{const[n,r]=st(e.subarray(t));return t+=r,n};let r=n(),s=wt;if(18===r?(r=0,t=0):s=n(),0!==r&&1!==r)throw new RangeError(`Invalid CID version ${r}`);const i=t,o=n(),a=n(),c=t+a;return{version:r,codec:s,multihashCode:o,digestSize:a,multihashSize:c-i,size:c}}static parse(e,t){const[n,r]=function(e,t){switch(e[0]){case"Q":{const n=t??ke;return[ke.prefix,n.decode(`${ke.prefix}${e}`)]}case ke.prefix:{const n=t??ke;return[ke.prefix,n.decode(e)]}case me.prefix:{const n=t??me;return[me.prefix,n.decode(e)]}default:if(null==t)throw Error("To parse non base32 or base58btc encoded CID multibase decoder must be provided");return[e[0],t.decode(e)]}}(e,t),s=yt.decode(r);if(0===s.version&&"Q"!==e[0])throw Error("Version 0 CID string must not include multibase prefix");return mt(s).set(n,e),s}}const wt=112,bt=18;function vt(e,t,n){const r=ot(e),s=r+ot(t),i=new Uint8Array(s+n.byteLength);return it(e,i,0),it(t,i,r),i.set(n,s),i}const Et=Symbol.for("@ipld/js-cid/CID"),St={...Ve,...ue,...Ue,...ie,...ce,...Re,...De,...Ce,...Le,...ge};function _t(e,t,n,r){return{name:e,prefix:t,encoder:{name:e,prefix:t,encode:n},decoder:{decode:r}}}const It=_t("utf8","u",(e=>"u"+new TextDecoder("utf8").decode(e)),(e=>(new TextEncoder).encode(e.substring(1)))),Rt=_t("ascii","a",(e=>{let t="a";for(let n=0;n<e.length;n++)t+=String.fromCharCode(e[n]);return t}),(e=>{const t=m((e=e.substring(1)).length);for(let n=0;n<e.length;n++)t[n]=e.charCodeAt(n);return t})),At={utf8:It,"utf-8":It,hex:St.base16,latin1:Rt,ascii:Rt,binary:Rt,...St};function Tt(e,t="utf8"){const n=At[t];if(null==n)throw new Error(`Unsupported encoding "${t}"`);return n.decoder.decode(`${n.prefix}${e}`)}class Dt{fn;len;next;val;constructor(e,t,n){this.fn=e,this.len=t,this.next=void 0,this.val=n}}function kt(){}class Pt{head;tail;len;next;constructor(e){this.head=e.head,this.tail=e.tail,this.len=e.len,this.next=e.states}}const Ct=function(e){const t=8192;let n,r=t;return function(e){if(e<1||e>4096)return m(e);r+e>t&&(n=m(t),r=0);const s=n.subarray(r,r+=e);return 7&r&&(r=1+(7|r)),s}}();class xt{len;head;tail;states;constructor(){this.len=0,this.head=new Dt(kt,0,0),this.tail=this.head,this.states=null}_push(e,t,n){return this.tail=this.tail.next=new Dt(e,t,n),this.len+=t,this}uint32(e){return this.len+=(this.tail=this.tail.next=new Ot((e>>>=0)<128?1:e<16384?2:e<2097152?3:e<268435456?4:5,e)).len,this}int32(e){return e<0?this._push(Lt,10,F.fromNumber(e)):this.uint32(e)}sint32(e){return this.uint32((e<<1^e>>31)>>>0)}uint64(e){const t=F.fromBigInt(e);return this._push(Lt,t.length(),t)}uint64Number(e){return this._push(T,A(e),e)}uint64String(e){return this.uint64(BigInt(e))}int64(e){return this.uint64(e)}int64Number(e){return this.uint64Number(e)}int64String(e){return this.uint64String(e)}sint64(e){const t=F.fromBigInt(e).zzEncode();return this._push(Lt,t.length(),t)}sint64Number(e){const t=F.fromNumber(e).zzEncode();return this._push(Lt,t.length(),t)}sint64String(e){return this.sint64(BigInt(e))}bool(e){return this._push(Nt,1,e?1:0)}fixed32(e){return this._push(Bt,4,e>>>0)}sfixed32(e){return this.fixed32(e)}fixed64(e){const t=F.fromBigInt(e);return this._push(Bt,4,t.lo)._push(Bt,4,t.hi)}fixed64Number(e){const t=F.fromNumber(e);return this._push(Bt,4,t.lo)._push(Bt,4,t.hi)}fixed64String(e){return this.fixed64(BigInt(e))}sfixed64(e){return this.fixed64(e)}sfixed64Number(e){return this.fixed64Number(e)}sfixed64String(e){return this.fixed64String(e)}float(e){return this._push(N,4,e)}double(e){return this._push(L,8,e)}bytes(e){const t=e.length>>>0;return 0===t?this._push(Nt,1,0):this.uint32(t)._push(Ut,t,e)}string(e){const t=function(e){let t=0,n=0;for(let r=0;r<e.length;++r)n=e.charCodeAt(r),n<128?t+=1:n<2048?t+=2:55296==(64512&n)&&56320==(64512&e.charCodeAt(r+1))?(++r,t+=4):t+=3;return t}(e);return 0!==t?this.uint32(t)._push($,t,e):this._push(Nt,1,0)}fork(){return this.states=new Pt(this),this.head=this.tail=new Dt(kt,0,0),this.len=0,this}reset(){return null!=this.states?(this.head=this.states.head,this.tail=this.states.tail,this.len=this.states.len,this.states=this.states.next):(this.head=this.tail=new Dt(kt,0,0),this.len=0),this}ldelim(){const e=this.head,t=this.tail,n=this.len;return this.reset().uint32(n),0!==n&&(this.tail.next=e.next,this.tail=t,this.len+=n),this}finish(){let e=this.head.next;const t=(n=this.len,null!=globalThis.Buffer?m(n):Ct(n));var n;let r=0;for(;null!=e;)e.fn(e.val,t,r),r+=e.len,e=e.next;return t}}function Nt(e,t,n){t[n]=255&e}function Mt(e,t,n){for(;e>127;)t[n++]=127&e|128,e>>>=7;t[n]=e}class Ot extends Dt{next;constructor(e,t){super(Mt,e,t),this.next=void 0}}function Lt(e,t,n){for(;0!==e.hi;)t[n++]=127&e.lo|128,e.lo=(e.lo>>>7|e.hi<<25)>>>0,e.hi>>>=7;for(;e.lo>127;)t[n++]=127&e.lo|128,e.lo=e.lo>>>7;t[n++]=e.lo}function Bt(e,t,n){t[n]=255&e,t[n+1]=e>>>8&255,t[n+2]=e>>>16&255,t[n+3]=e>>>24}function Ut(e,t,n){t.set(e,n)}function Ft(e,t,n){t.set(e,n)}function Vt(e,t,n){e.length<40?$(e,t,n):null!=t.utf8Write?t.utf8Write(e,n):t.set(Tt(e),n)}function Kt(e,t){const n=new xt;return t.encode(e,n,{lengthDelimited:!1}),n.finish()}var $t;function qt(e,t,n,r){return{name:e,type:t,encode:n,decode:r}}function Ht(e){function t(t){if(null==e[t.toString()])throw new Error("Invalid enum value");return e[t]}return qt("enum",$t.VARINT,(function(e,n){const r=t(e);n.int32(r)}),(function(e){return t(e.int32())}))}function zt(e,t){return qt("message",$t.LENGTH_DELIMITED,e,t)}null!=globalThis.Buffer&&(xt.prototype.bytes=function(e){const t=e.length>>>0;return this.uint32(t),t>0&&this._push(Ft,t,e),this},xt.prototype.string=function(e){const t=globalThis.Buffer.byteLength(e);return this.uint32(t),t>0&&this._push(Vt,t,e),this}),function(e){e[e.VARINT=0]="VARINT",e[e.BIT64=1]="BIT64",e[e.LENGTH_DELIMITED=2]="LENGTH_DELIMITED",e[e.START_GROUP=3]="START_GROUP",e[e.END_GROUP=4]="END_GROUP",e[e.BIT32=5]="BIT32"}($t||($t={}));let Wt=class extends Error{code;constructor(e,t,n){super(e,n),this.code=t}};
|
|
3
|
+
//! WebPEER.js -- https://github.com/nuzulul/webpeerjs
|
|
4
|
+
var jt;function Gt(e,t="utf8"){const n=At[t];if(null==n)throw new Error(`Unsupported encoding "${t}"`);return n.encoder.encode(e).substring(1)}!function(e){let t;e.codec=()=>(null==t&&(t=zt(((e,t,n={})=>{if(!1!==n.lengthDelimited&&t.fork(),null!=e.publicKey&&e.publicKey.byteLength>0&&(t.uint32(10),t.bytes(e.publicKey)),null!=e.addrs)for(const n of e.addrs)t.uint32(18),t.bytes(n);!1!==n.lengthDelimited&&t.ldelim()}),((e,t)=>{const n={publicKey:g(0),addrs:[]},r=null==t?e.len:e.pos+t;for(;e.pos<r;){const t=e.uint32();switch(t>>>3){case 1:n.publicKey=e.bytes();break;case 2:n.addrs.push(e.bytes());break;default:e.skipType(7&t)}}return n}))),t),e.encode=t=>Kt(t,e.codec()),e.decode=t=>W(t,e.codec())}(jt||(jt={}));const Yt="/",Qt=(new TextEncoder).encode(Yt),Jt=Qt[0];class Zt{_buf;constructor(e,t){if("string"==typeof e)this._buf=Tt(e);else{if(!(e instanceof Uint8Array))throw new Error("Invalid key, should be String of Uint8Array");this._buf=e}if(null==t&&(t=!0),t&&this.clean(),0===this._buf.byteLength||this._buf[0]!==Jt)throw new Error("Invalid key")}toString(e="utf8"){return Gt(this._buf,e)}uint8Array(){return this._buf}get[Symbol.toStringTag](){return`Key(${this.toString()})`}static withNamespaces(e){return new Zt(e.join(Yt))}static random(){return new Zt(Math.random().toString().substring(2))}static asKey(e){return e instanceof Uint8Array||"string"==typeof e?new Zt(e):"function"==typeof e.uint8Array?new Zt(e.uint8Array()):null}clean(){if(null!=this._buf&&0!==this._buf.byteLength||(this._buf=Qt),this._buf[0]!==Jt){const e=new Uint8Array(this._buf.byteLength+1);e.fill(Jt,0,1),e.set(this._buf,1),this._buf=e}for(;this._buf.byteLength>1&&this._buf[this._buf.byteLength-1]===Jt;)this._buf=this._buf.subarray(0,-1)}less(e){const t=this.list(),n=e.list();for(let e=0;e<t.length;e++){if(n.length<e+1)return!1;const r=t[e],s=n[e];if(r<s)return!0;if(r>s)return!1}return t.length<n.length}reverse(){return Zt.withNamespaces(this.list().slice().reverse())}namespaces(){return this.list()}baseNamespace(){const e=this.namespaces();return e[e.length-1]}list(){return this.toString().split(Yt).slice(1)}type(){return function(e){const t=e.split(":");if(t.length<2)return"";return t.slice(0,-1).join(":")}(this.baseNamespace())}name(){return function(e){const t=e.split(":");return t[t.length-1]}(this.baseNamespace())}instance(e){return new Zt(this.toString()+":"+e)}path(){let e=this.parent().toString();return e.endsWith(Yt)||(e+=Yt),e+=this.type(),new Zt(e)}parent(){const e=this.list();return 1===e.length?new Zt(Yt):new Zt(e.slice(0,-1).join(Yt))}child(e){return this.toString()===Yt?e:e.toString()===Yt?this:new Zt(this.toString()+e.toString(),!1)}isAncestorOf(e){return e.toString()!==this.toString()&&e.toString().startsWith(this.toString())}isDecendantOf(e){return e.toString()!==this.toString()&&this.toString().startsWith(e.toString())}isTopLevel(){return 1===this.list().length}concat(...e){return Zt.withNamespaces([...this.namespaces(),...(t=e.map((e=>e.namespaces())),[].concat(...t))]);var t}}const Xt=Symbol.for("@libp2p/connection"),en=Symbol.for("@libp2p/content-routing"),tn=Symbol.for("@libp2p/peer-discovery"),nn=Symbol.for("@libp2p/peer-id");function rn(e){return null!=e&&Boolean(e[nn])}const sn=Symbol.for("@libp2p/peer-routing"),on="StrictSign",an="StrictNoSign";var cn;!function(e){e.Accept="accept",e.Ignore="ignore",e.Reject="reject"}(cn||(cn={}));const ln=Symbol.for("@libp2p/transport");var un;!function(e){e[e.FATAL_ALL=0]="FATAL_ALL",e[e.NO_FATAL=1]="NO_FATAL"}(un||(un={}));let hn=class e extends Error{code;type;constructor(t="The operation was aborted"){super(t),this.name="AbortError",this.code=e.code,this.type=e.type}static code="ABORT_ERR";static type="aborted"},dn=class extends Error{code;props;constructor(e,t,n){super(e),this.code=t,this.name=n?.name??"CodeError",this.props=n??{}}};class pn extends AggregateError{code;props;constructor(e,t,n,r){super(e,t),this.code=n,this.name=r?.name??"AggregateCodeError",this.props=r??{}}}const fn="ERR_TIMEOUT",gn="ERR_INVALID_MESSAGE";class mn extends EventTarget{#e=new Map;constructor(){super()}listenerCount(e){const t=this.#e.get(e);return null==t?0:t.length}addEventListener(e,t,n){super.addEventListener(e,t,n);let r=this.#e.get(e);null==r&&(r=[],this.#e.set(e,r)),r.push({callback:t,once:(!0!==n&&!1!==n&&n?.once)??!1})}removeEventListener(e,t,n){super.removeEventListener(e.toString(),t??null,n);let r=this.#e.get(e);null!=r&&(r=r.filter((({callback:e})=>e!==t)),this.#e.set(e,r))}dispatchEvent(e){const t=super.dispatchEvent(e);let n=this.#e.get(e.type);return null==n||(n=n.filter((({once:e})=>!e)),this.#e.set(e.type,n)),t}safeDispatchEvent(e,t={}){return this.dispatchEvent(new wn(e,t))}}class yn extends Event{detail;constructor(e,t){super(e,t),this.detail=t?.detail}}const wn=globalThis.CustomEvent??yn;function bn(e){return null!=e&&"function"==typeof e.start&&"function"==typeof e.stop}const vn=Symbol.for("@libp2p/service-capabilities"),En=Symbol.for("@libp2p/service-dependencies");function Sn(e,t){if(e===t)return!0;if(e.byteLength!==t.byteLength)return!1;for(let n=0;n<e.byteLength;n++)if(e[n]!==t[n])return!1;return!0}function _n(e,t){null==t&&(t=e.reduce(((e,t)=>e+t.length),0));const n=m(t);let r=0;for(const t of e)n.set(t,r),r+=t.length;return n}const In=45,Rn=15,An=new class{index=0;input="";new(e){return this.index=0,this.input=e,this}readAtomically(e){const t=this.index,n=e();return void 0===n&&(this.index=t),n}parseWith(e){const t=e();if(this.index===this.input.length)return t}peekChar(){if(!(this.index>=this.input.length))return this.input[this.index]}readChar(){if(!(this.index>=this.input.length))return this.input[this.index++]}readGivenChar(e){return this.readAtomically((()=>{const t=this.readChar();if(t===e)return t}))}readSeparator(e,t,n){return this.readAtomically((()=>{if(!(t>0&&void 0===this.readGivenChar(e)))return n()}))}readNumber(e,t,n,r){return this.readAtomically((()=>{let s=0,i=0;const o=this.peekChar();if(void 0===o)return;const a="0"===o,c=2**(8*r)-1;for(;;){const n=this.readAtomically((()=>{const t=this.readChar();if(void 0===t)return;const n=Number.parseInt(t,e);return Number.isNaN(n)?void 0:n}));if(void 0===n)break;if(s*=e,s+=n,s>c)return;if(i+=1,void 0!==t&&i>t)return}return 0===i||!n&&a&&i>1?void 0:s}))}readIPv4Addr(){return this.readAtomically((()=>{const e=new Uint8Array(4);for(let t=0;t<e.length;t++){const n=this.readSeparator(".",t,(()=>this.readNumber(10,3,!1,1)));if(void 0===n)return;e[t]=n}return e}))}readIPv6Addr(){const e=e=>{for(let t=0;t<e.length/2;t++){const n=2*t;if(t<e.length-3){const r=this.readSeparator(":",t,(()=>this.readIPv4Addr()));if(void 0!==r)return e[n]=r[0],e[n+1]=r[1],e[n+2]=r[2],e[n+3]=r[3],[n+4,!0]}const r=this.readSeparator(":",t,(()=>this.readNumber(16,4,!0,2)));if(void 0===r)return[n,!1];e[n]=r>>8,e[n+1]=255&r}return[e.length,!1]};return this.readAtomically((()=>{const t=new Uint8Array(16),[n,r]=e(t);if(16===n)return t;if(r)return;if(void 0===this.readGivenChar(":"))return;if(void 0===this.readGivenChar(":"))return;const s=new Uint8Array(14),i=16-(n+2),[o]=e(s.subarray(0,i));return t.set(s.subarray(0,o),16-o),t}))}readIPAddr(){return this.readIPv4Addr()??this.readIPv6Addr()}};function Tn(e){return Boolean(function(e){if(!(e.length>Rn))return An.new(e).parseWith((()=>An.readIPv4Addr()))}(e))}function Dn(e){return Boolean(function(e){if(e.includes("%")&&(e=e.split("%")[0]),!(e.length>In))return An.new(e).parseWith((()=>An.readIPv6Addr()))}(e))}function kn(e){return Boolean(function(e){if(e.includes("%")&&(e=e.split("%")[0]),!(e.length>In))return An.new(e).parseWith((()=>An.readIPAddr()))}(e))}const Pn=Tn,Cn=Dn,xn=function(e){let t=0;if(e=e.toString().trim(),Pn(e)){const n=new Uint8Array(t+4);return e.split(/\./g).forEach((e=>{n[t++]=255&parseInt(e,10)})),n}if(Cn(e)){const n=e.split(":",8);let r;for(r=0;r<n.length;r++){let e;Pn(n[r])&&(e=xn(n[r]),n[r]=Gt(e.slice(0,2),"base16")),null!=e&&++r<8&&n.splice(r,0,Gt(e.slice(2,4),"base16"))}if(""===n[0])for(;n.length<8;)n.unshift("0");else if(""===n[n.length-1])for(;n.length<8;)n.push("0");else if(n.length<8){for(r=0;r<n.length&&""!==n[r];r++);const e=[r,1];for(r=9-n.length;r>0;r--)e.push("0");n.splice.apply(n,e)}const s=new Uint8Array(t+16);for(r=0;r<n.length;r++){const e=parseInt(n[r],16);s[t++]=e>>8&255,s[t++]=255&e}return s}throw new Error("invalid ip address")},Nn=function(e,t=0,n){t=~~t,n=n??e.length-t;const r=new DataView(e.buffer);if(4===n){const r=[];for(let s=0;s<n;s++)r.push(e[t+s]);return r.join(".")}if(16===n){const e=[];for(let s=0;s<n;s+=2)e.push(r.getUint16(t+s).toString(16));return e.join(":").replace(/(^|:)0(:0)*:0(:|$)/,"$1::$3").replace(/:{3,4}/,"::")}return""},Mn=-1,On={},Ln={};function Bn(e){if("number"==typeof e){if(null!=Ln[e])return Ln[e];throw new Error(`no protocol with code: ${e}`)}if("string"==typeof e){if(null!=On[e])return On[e];throw new Error(`no protocol with name: ${e}`)}throw new Error("invalid protocol id type: "+typeof e)}function Un(e,t){switch(Bn(e).code){case 4:case 41:return function(e){const t=Nn(e,0,e.length);if(null==t)throw new Error("ipBuff is required");if(!kn(t))throw new Error("invalid ip address");return t}(t);case 42:case 53:case 54:case 55:case 56:case 400:case 449:case 777:return Wn(t);case 6:case 273:case 33:case 132:return Hn(t).toString();case 421:return function(e){const t=P(e),n=e.slice(A(t));if(n.length!==t)throw new Error("inconsistent lengths");return Gt(n,"base58btc")}(t);case 444:case 445:return jn(t);case 466:return function(e){const t=P(e),n=e.slice(A(t));if(n.length!==t)throw new Error("inconsistent lengths");return"u"+Gt(n,"base64url")}(t);case 481:return globalThis.encodeURIComponent(Wn(t));default:return Gt(t,"base16")}}function Fn(e,t){switch(Bn(e).code){case 4:case 41:return $n(t);case 42:case 53:case 54:case 55:case 56:case 400:case 449:case 777:return zn(t);case 6:case 273:case 33:case 132:return qn(parseInt(t,10));case 421:return function(e){let t;t="Q"===e[0]||"1"===e[0]?ct(ke.decode(`z${e}`)).bytes:yt.parse(e).multihash.bytes;const n=Uint8Array.from(k(t.length));return _n([n,t],n.length+t.length)}(t);case 444:return function(e){const t=e.split(":");if(2!==t.length)throw new Error(`failed to parse onion addr: ["'${t.join('", "')}'"]' does not contain a port number`);if(16!==t[0].length)throw new Error(`failed to parse onion addr: ${t[0]} not a Tor onion address.`);const n=me.decode("b"+t[0]),r=parseInt(t[1],10);if(r<1||r>65536)throw new Error("Port number is not in range(1, 65536)");const s=qn(r);return _n([n,s],n.length+s.length)}(t);case 445:return function(e){const t=e.split(":");if(2!==t.length)throw new Error(`failed to parse onion addr: ["'${t.join('", "')}'"]' does not contain a port number`);if(56!==t[0].length)throw new Error(`failed to parse onion addr: ${t[0]} not a Tor onion3 address.`);const n=me.decode(`b${t[0]}`),r=parseInt(t[1],10);if(r<1||r>65536)throw new Error("Port number is not in range(1, 65536)");const s=qn(r);return _n([n,s],n.length+s.length)}(t);case 466:return function(e){const t=Kn.decode(e),n=Uint8Array.from(k(t.length));return _n([n,t],n.length+t.length)}(t);case 481:return zn(globalThis.decodeURIComponent(t));default:return Tt(t,"base16")}}[[4,32,"ip4"],[6,16,"tcp"],[33,16,"dccp"],[41,128,"ip6"],[42,Mn,"ip6zone"],[43,8,"ipcidr"],[53,Mn,"dns",!0],[54,Mn,"dns4",!0],[55,Mn,"dns6",!0],[56,Mn,"dnsaddr",!0],[132,16,"sctp"],[273,16,"udp"],[275,0,"p2p-webrtc-star"],[276,0,"p2p-webrtc-direct"],[277,0,"p2p-stardust"],[280,0,"webrtc-direct"],[281,0,"webrtc"],[290,0,"p2p-circuit"],[301,0,"udt"],[302,0,"utp"],[400,Mn,"unix",!1,!0],[421,Mn,"ipfs"],[421,Mn,"p2p"],[443,0,"https"],[444,96,"onion"],[445,296,"onion3"],[446,Mn,"garlic64"],[448,0,"tls"],[449,Mn,"sni"],[460,0,"quic"],[461,0,"quic-v1"],[465,0,"webtransport"],[466,Mn,"certhash"],[477,0,"ws"],[478,0,"wss"],[479,0,"p2p-websocket-star"],[480,0,"http"],[481,Mn,"http-path"],[777,Mn,"memory"]].forEach((e=>{const t=function(e,t,n,r,s){return{code:e,size:t,name:n,resolvable:Boolean(r),path:Boolean(s)}}(...e);Ln[t.code]=t,On[t.name]=t})),Bn("ip4"),Bn("ip6"),Bn("ipcidr");const Vn=Object.values(St).map((e=>e.decoder)),Kn=function(){let e=Vn[0].or(Vn[1]);return Vn.slice(2).forEach((t=>e=e.or(t))),e}();function $n(e){if(!kn(e))throw new Error("invalid ip address");return xn(e)}function qn(e){const t=new ArrayBuffer(2);return new DataView(t).setUint16(0,e),new Uint8Array(t)}function Hn(e){return new DataView(e.buffer).getUint16(e.byteOffset)}function zn(e){const t=Tt(e),n=Uint8Array.from(k(t.length));return _n([n,t],n.length+t.length)}function Wn(e){const t=P(e);if((e=e.slice(A(t))).length!==t)throw new Error("inconsistent lengths");return Gt(e)}function jn(e){const t=e.slice(0,e.length-2),n=e.slice(e.length-2);return`${Gt(t,"base32")}:${Hn(n)}`}function Gn(e){const t=[],n=[];let r=null,s=0;for(;s<e.length;){const i=P(e,s),o=A(i),a=Bn(i),c=Jn(a,e.slice(s+o));if(0===c){t.push([i]),n.push([i]),s+=o;continue}const l=e.slice(s+o,s+o+c);if(s+=c+o,s>e.length)throw Xn("Invalid address Uint8Array: "+Gt(e,"base16"));t.push([i,l]);const u=Un(i,l);if(n.push([i,u]),!0===a.path){r=u;break}}return{bytes:Uint8Array.from(e),string:Yn(n),tuples:t,stringTuples:n,path:r}}function Yn(e){const t=[];return e.map((e=>{const n=Bn(e[0]);return t.push(n.name),e.length>1&&null!=e[1]&&t.push(e[1]),null})),Zn(t.join("/"))}function Qn(e){return _n(e.map((e=>{const t=Bn(e[0]);let n=Uint8Array.from(k(t.code));return e.length>1&&null!=e[1]&&(n=_n([n,e[1]])),n})))}function Jn(e,t){if(e.size>0)return e.size/8;if(0===e.size)return 0;{const e=P(t instanceof Uint8Array?t:Uint8Array.from(t));return e+A(e)}}function Zn(e){return"/"+e.trim().split("/").filter((e=>e)).join("/")}function Xn(e){return new Error("Error parsing address: "+e)}const er=Symbol.for("nodejs.util.inspect.custom"),tr=Symbol.for("@multiformats/js-multiaddr/multiaddr"),nr=[Bn("dns").code,Bn("dns4").code,Bn("dns6").code,Bn("dnsaddr").code];class rr{bytes;#t;#n;#r;#s;[tr]=!0;constructor(e){let t;if(null==e&&(e=""),e instanceof Uint8Array)t=Gn(e);else if("string"==typeof e){if(e.length>0&&"/"!==e.charAt(0))throw new Error(`multiaddr "${e}" must start with a "/"`);t=function(e){const t=[],n=[];let r=null;const s=(e=Zn(e)).split("/").slice(1);if(1===s.length&&""===s[0])return{bytes:new Uint8Array,string:"/",tuples:[],stringTuples:[],path:null};for(let i=0;i<s.length;i++){const o=Bn(s[i]);if(0===o.size){t.push([o.code]),n.push([o.code]);continue}if(i++,i>=s.length)throw Xn("invalid address: "+e);if(!0===o.path){r=Zn(s.slice(i).join("/")),t.push([o.code,Fn(o.code,r)]),n.push([o.code,r]);break}const a=Fn(o.code,s[i]);t.push([o.code,a]),n.push([o.code,Un(o.code,a)])}return{string:Yn(n),bytes:Qn(t),tuples:t,stringTuples:n,path:r}}(e)}else{if(!ir(e))throw new Error("addr must be a string, Buffer, or another Multiaddr");t=Gn(e.bytes)}this.bytes=t.bytes,this.#t=t.string,this.#n=t.tuples,this.#r=t.stringTuples,this.#s=t.path}toString(){return this.#t}toJSON(){return this.toString()}toOptions(){let e,t,n,r,s="";const i=Bn("tcp"),o=Bn("udp"),a=Bn("ip4"),c=Bn("ip6"),l=Bn("dns6"),u=Bn("ip6zone");for(const[h,d]of this.stringTuples())h===u.code&&(s=`%${d??""}`),nr.includes(h)&&(t=i.name,r=443,n=`${d??""}${s}`,e=h===l.code?6:4),h!==i.code&&h!==o.code||(t=Bn(h).name,r=parseInt(d??"")),h!==a.code&&h!==c.code||(t=Bn(h).name,n=`${d??""}${s}`,e=h===c.code?6:4);if(null==e||null==t||null==n||null==r)throw new Error('multiaddr must have a valid format: "/{ip4, ip6, dns4, dns6, dnsaddr}/{address}/{tcp, udp}/{port}".');return{family:e,host:n,transport:t,port:r}}protos(){return this.#n.map((([e])=>Object.assign({},Bn(e))))}protoCodes(){return this.#n.map((([e])=>e))}protoNames(){return this.#n.map((([e])=>Bn(e).name))}tuples(){return this.#n}stringTuples(){return this.#r}encapsulate(e){return e=new rr(e),new rr(this.toString()+e.toString())}decapsulate(e){const t=e.toString(),n=this.toString(),r=n.lastIndexOf(t);if(r<0)throw new Error(`Address ${this.toString()} does not contain subaddress: ${e.toString()}`);return new rr(n.slice(0,r))}decapsulateCode(e){const t=this.tuples();for(let n=t.length-1;n>=0;n--)if(t[n][0]===e)return new rr(Qn(t.slice(0,n)));return this}getPeerId(){try{let e=[];this.stringTuples().forEach((([t,n])=>{t===On.p2p.code&&e.push([t,n]),t===On["p2p-circuit"].code&&(e=[])}));const t=e.pop();if(null!=t?.[1]){const e=t[1];return"Q"===e[0]||"1"===e[0]?Gt(ke.decode(`z${e}`),"base58btc"):Gt(yt.parse(e).multihash.bytes,"base58btc")}return null}catch(e){return null}}getPath(){return this.#s}equals(e){return Sn(this.bytes,e.bytes)}async resolve(e){const t=this.protos().find((e=>e.resolvable));if(null==t)return[this];const n=sr.get(t.name);if(null==n)throw new dn(`no available resolver for ${t.name}`,"ERR_NO_AVAILABLE_RESOLVER");return(await n(this,e)).map((e=>or(e)))}nodeAddress(){const e=this.toOptions();if("tcp"!==e.transport&&"udp"!==e.transport)throw new Error(`multiaddr must have a valid format - no protocol with name: "${e.transport}". Must have a valid transport protocol: "{tcp, udp}"`);return{family:e.family,address:e.host,port:e.port}}isThinWaistAddress(e){const t=(e??this).protos();return 2===t.length&&((4===t[0].code||41===t[0].code)&&(6===t[1].code||273===t[1].code))}[er](){return`Multiaddr(${this.#t})`}}const sr=new Map;function ir(e){return Boolean(e?.[tr])}function or(e){return new rr(e)}function ar(){const e={};return e.promise=new Promise(((t,n)=>{e.resolve=t,e.reject=n})),e}class cr{buffer;mask;top;btm;next;constructor(e){if(!(e>0)||e-1&e)throw new Error("Max size for a FixedFIFO should be a power of two");this.buffer=new Array(e),this.mask=e-1,this.top=0,this.btm=0,this.next=null}push(e){return void 0===this.buffer[this.top]&&(this.buffer[this.top]=e,this.top=this.top+1&this.mask,!0)}shift(){const e=this.buffer[this.btm];if(void 0!==e)return this.buffer[this.btm]=void 0,this.btm=this.btm+1&this.mask,e}isEmpty(){return void 0===this.buffer[this.btm]}}class lr{size;hwm;head;tail;constructor(e={}){this.hwm=e.splitLimit??16,this.head=new cr(this.hwm),this.tail=this.head,this.size=0}calculateSize(e){return null!=e?.byteLength?e.byteLength:1}push(e){if(null!=e?.value&&(this.size+=this.calculateSize(e.value)),!this.head.push(e)){const t=this.head;this.head=t.next=new cr(2*this.head.buffer.length),this.head.push(e)}}shift(){let e=this.tail.shift();if(void 0===e&&null!=this.tail.next){const t=this.tail.next;this.tail.next=null,this.tail=t,e=this.tail.shift()}return null!=e?.value&&(this.size-=this.calculateSize(e.value)),e}isEmpty(){return this.head.isEmpty()}}let ur=class extends Error{type;code;constructor(e,t){super(e??"The operation was aborted"),this.type="aborted",this.code=t??"ABORT_ERR"}};function hr(e={}){return function(e,t){t=t??{};let n,r,s,i=t.onEnd,o=new lr,a=ar();const c=async()=>{try{return o.isEmpty()?s?{done:!0}:await new Promise(((t,s)=>{r=i=>{r=null,o.push(i);try{t(e(o))}catch(e){s(e)}return n}})):e(o)}finally{o.isEmpty()&&queueMicrotask((()=>{a.resolve(),a=ar()}))}},l=e=>null!=r?r(e):(o.push(e),n),u=e=>(o=new lr,null!=r?r({error:e}):(o.push({error:e}),n)),h=e=>{if(s)return n;if(!0!==t?.objectMode&&null==e?.byteLength)throw new Error("objectMode was not true but tried to push non-Uint8Array value");return l({done:!1,value:e})},d=e=>s?n:(s=!0,null!=e?u(e):l({done:!0})),p=()=>(o=new lr,d(),{done:!0}),f=e=>(d(e),{done:!0});if(n={[Symbol.asyncIterator](){return this},next:c,return:p,throw:f,push:h,end:d,get readableLength(){return o.size},onEmpty:async e=>{const t=e?.signal;if(t?.throwIfAborted(),o.isEmpty())return;let n,r;null!=t&&(n=new Promise(((e,n)=>{r=()=>{n(new ur)},t.addEventListener("abort",r)})));try{await Promise.race([a.promise,n])}finally{null!=r&&null!=t&&t?.removeEventListener("abort",r)}}},null==i)return n;const g=n;return n={[Symbol.asyncIterator](){return this},next:()=>g.next(),throw:e=>(g.throw(e),null!=i&&(i(e),i=void 0),{done:!0}),return:()=>(g.return(),null!=i&&(i(),i=void 0),{done:!0}),push:h,end:e=>(g.end(e),null!=i&&(i(e),i=void 0),n),get readableLength(){return g.readableLength},onEmpty:e=>g.onEmpty(e)},n}((e=>{const t=e.shift();if(null==t)return{done:!0};if(null!=t.error)throw t.error;return{done:!0===t.done,value:t.value}}),e)}function dr(...e){const t=[];for(const n of e)null==n[Symbol.asyncIterator]&&t.push(n);return t.length===e.length?function*(){for(const e of t)yield*e}():async function*(){const t=hr({objectMode:!0});Promise.resolve().then((async()=>{try{await Promise.all(e.map((async e=>{for await(const n of e)t.push(n)}))),t.end()}catch(e){t.end(e)}})),yield*t}()}function pr(e,...t){if(null==e)throw new Error("Empty pipeline");if(yr(e)){const t=e;e=()=>t.source}else if(mr(e)||gr(e)){const t=e;e=()=>t}const n=[e,...t];if(n.length>1&&yr(n[n.length-1])&&(n[n.length-1]=n[n.length-1].sink),n.length>2)for(let e=1;e<n.length-1;e++)yr(n[e])&&(n[e]=wr(n[e]));return fr(...n)}const fr=(...e)=>{let t;for(;e.length>0;)t=e.shift()(t);return t},gr=e=>null!=e?.[Symbol.asyncIterator],mr=e=>null!=e?.[Symbol.iterator],yr=e=>null!=e&&(null!=e.sink&&null!=e.source),wr=e=>t=>{const n=e.sink(t);if(null!=n?.then){const t=hr({objectMode:!0});let r;n.then((()=>{t.end()}),(e=>{t.end(e)}));const s=e.source;if(gr(s))r=async function*(){yield*s,t.end()};else{if(!mr(s))throw new Error("Unknown duplex source type - must be Iterable or AsyncIterable");r=function*(){yield*s,t.end()}}return dr(t,r())}return e.source},br=Symbol.for("@achingbrain/uint8arraylist");function vr(e,t){if(null==t||t<0)throw new RangeError("index is out of bounds");let n=0;for(const r of e){const e=n+r.byteLength;if(t<e)return{buf:r,index:t-n};n=e}throw new RangeError("index is out of bounds")}function Er(e){return Boolean(e?.[br])}class Sr{bufs;length;[br]=!0;constructor(...e){this.bufs=[],this.length=0,e.length>0&&this.appendAll(e)}*[Symbol.iterator](){yield*this.bufs}get byteLength(){return this.length}append(...e){this.appendAll(e)}appendAll(e){let t=0;for(const n of e)if(n instanceof Uint8Array)t+=n.byteLength,this.bufs.push(n);else{if(!Er(n))throw new Error("Could not append value, must be an Uint8Array or a Uint8ArrayList");t+=n.byteLength,this.bufs.push(...n.bufs)}this.length+=t}prepend(...e){this.prependAll(e)}prependAll(e){let t=0;for(const n of e.reverse())if(n instanceof Uint8Array)t+=n.byteLength,this.bufs.unshift(n);else{if(!Er(n))throw new Error("Could not prepend value, must be an Uint8Array or a Uint8ArrayList");t+=n.byteLength,this.bufs.unshift(...n.bufs)}this.length+=t}get(e){const t=vr(this.bufs,e);return t.buf[t.index]}set(e,t){const n=vr(this.bufs,e);n.buf[n.index]=t}write(e,t=0){if(e instanceof Uint8Array)for(let n=0;n<e.length;n++)this.set(t+n,e[n]);else{if(!Er(e))throw new Error("Could not write value, must be an Uint8Array or a Uint8ArrayList");for(let n=0;n<e.length;n++)this.set(t+n,e.get(n))}}consume(e){if(e=Math.trunc(e),!(Number.isNaN(e)||e<=0)){if(e===this.byteLength)return this.bufs=[],void(this.length=0);for(;this.bufs.length>0;){if(!(e>=this.bufs[0].byteLength)){this.bufs[0]=this.bufs[0].subarray(e),this.length-=e;break}e-=this.bufs[0].byteLength,this.length-=this.bufs[0].byteLength,this.bufs.shift()}}}slice(e,t){const{bufs:n,length:r}=this._subList(e,t);return _n(n,r)}subarray(e,t){const{bufs:n,length:r}=this._subList(e,t);return 1===n.length?n[0]:_n(n,r)}sublist(e,t){const{bufs:n,length:r}=this._subList(e,t),s=new Sr;return s.length=r,s.bufs=[...n],s}_subList(e,t){if(e=e??0,t=t??this.length,e<0&&(e=this.length+e),t<0&&(t=this.length+t),e<0||t>this.length)throw new RangeError("index is out of bounds");if(e===t)return{bufs:[],length:0};if(0===e&&t===this.length)return{bufs:this.bufs,length:this.length};const n=[];let r=0;for(let s=0;s<this.bufs.length;s++){const i=this.bufs[s],o=r,a=o+i.byteLength;if(r=a,e>=a)continue;const c=e>=o&&e<a,l=t>o&&t<=a;if(c&&l){if(e===o&&t===a){n.push(i);break}const r=e-o;n.push(i.subarray(r,r+(t-e)));break}if(c){if(0===e){n.push(i);continue}n.push(i.subarray(e-o))}else{if(l){if(t===a){n.push(i);break}n.push(i.subarray(0,t-o));break}n.push(i)}}return{bufs:n,length:t-e}}indexOf(e,t=0){if(!(Er(e)||e instanceof Uint8Array))throw new TypeError('The "value" argument must be a Uint8ArrayList or Uint8Array');const n=e instanceof Uint8Array?e:e.subarray();if(t=Number(t??0),isNaN(t)&&(t=0),t<0&&(t=this.length+t),t<0&&(t=0),0===e.length)return t>this.length?this.length:t;const r=n.byteLength;if(0===r)throw new TypeError("search must be at least 1 byte long");const s=new Int32Array(256);for(let e=0;e<256;e++)s[e]=-1;for(let e=0;e<r;e++)s[n[e]]=e;const i=s,o=this.byteLength-n.byteLength,a=n.byteLength-1;let c;for(let e=t;e<=o;e+=c){c=0;for(let t=a;t>=0;t--){const r=this.get(e+t);if(n[t]!==r){c=Math.max(1,t-i[r]);break}}if(0===c)return e}return-1}getInt8(e){const t=this.subarray(e,e+1);return new DataView(t.buffer,t.byteOffset,t.byteLength).getInt8(0)}setInt8(e,t){const n=m(1);new DataView(n.buffer,n.byteOffset,n.byteLength).setInt8(0,t),this.write(n,e)}getInt16(e,t){const n=this.subarray(e,e+2);return new DataView(n.buffer,n.byteOffset,n.byteLength).getInt16(0,t)}setInt16(e,t,n){const r=g(2);new DataView(r.buffer,r.byteOffset,r.byteLength).setInt16(0,t,n),this.write(r,e)}getInt32(e,t){const n=this.subarray(e,e+4);return new DataView(n.buffer,n.byteOffset,n.byteLength).getInt32(0,t)}setInt32(e,t,n){const r=g(4);new DataView(r.buffer,r.byteOffset,r.byteLength).setInt32(0,t,n),this.write(r,e)}getBigInt64(e,t){const n=this.subarray(e,e+8);return new DataView(n.buffer,n.byteOffset,n.byteLength).getBigInt64(0,t)}setBigInt64(e,t,n){const r=g(8);new DataView(r.buffer,r.byteOffset,r.byteLength).setBigInt64(0,t,n),this.write(r,e)}getUint8(e){const t=this.subarray(e,e+1);return new DataView(t.buffer,t.byteOffset,t.byteLength).getUint8(0)}setUint8(e,t){const n=m(1);new DataView(n.buffer,n.byteOffset,n.byteLength).setUint8(0,t),this.write(n,e)}getUint16(e,t){const n=this.subarray(e,e+2);return new DataView(n.buffer,n.byteOffset,n.byteLength).getUint16(0,t)}setUint16(e,t,n){const r=g(2);new DataView(r.buffer,r.byteOffset,r.byteLength).setUint16(0,t,n),this.write(r,e)}getUint32(e,t){const n=this.subarray(e,e+4);return new DataView(n.buffer,n.byteOffset,n.byteLength).getUint32(0,t)}setUint32(e,t,n){const r=g(4);new DataView(r.buffer,r.byteOffset,r.byteLength).setUint32(0,t,n),this.write(r,e)}getBigUint64(e,t){const n=this.subarray(e,e+8);return new DataView(n.buffer,n.byteOffset,n.byteLength).getBigUint64(0,t)}setBigUint64(e,t,n){const r=g(8);new DataView(r.buffer,r.byteOffset,r.byteLength).setBigUint64(0,t,n),this.write(r,e)}getFloat32(e,t){const n=this.subarray(e,e+4);return new DataView(n.buffer,n.byteOffset,n.byteLength).getFloat32(0,t)}setFloat32(e,t,n){const r=g(4);new DataView(r.buffer,r.byteOffset,r.byteLength).setFloat32(0,t,n),this.write(r,e)}getFloat64(e,t){const n=this.subarray(e,e+8);return new DataView(n.buffer,n.byteOffset,n.byteLength).getFloat64(0,t)}setFloat64(e,t,n){const r=g(8);new DataView(r.buffer,r.byteOffset,r.byteLength).setFloat64(0,t,n),this.write(r,e)}equals(e){if(null==e)return!1;if(!(e instanceof Sr))return!1;if(e.bufs.length!==this.bufs.length)return!1;for(let t=0;t<this.bufs.length;t++)if(!Sn(this.bufs[t],e.bufs[t]))return!1;return!0}static fromUint8Arrays(e,t){const n=new Sr;return n.bufs=e,null==t&&(t=e.reduce(((e,t)=>e+t.byteLength),0)),n.length=t,n}}let _r=class extends Error{type;code;constructor(e,t){super(e??"The operation was aborted"),this.type="aborted",this.name="AbortError",this.code=t??"ABORT_ERR"}};async function Ir(e,t,n){if(null==t)return e;if(t.aborted)return Promise.reject(new _r(n?.errorMessage,n?.errorCode));let r;const s=new _r(n?.errorMessage,n?.errorCode);try{return await Promise.race([e,new Promise(((e,n)=>{r=()=>{n(s)},t.addEventListener("abort",r)}))])}finally{null!=r&&t.removeEventListener("abort",r)}}class Rr{readNext;haveNext;ended;nextResult;constructor(){this.ended=!1,this.readNext=ar(),this.haveNext=ar()}[Symbol.asyncIterator](){return this}async next(){if(null==this.nextResult&&await this.haveNext.promise,null==this.nextResult)throw new Error("HaveNext promise resolved but nextResult was undefined");const e=this.nextResult;return this.nextResult=void 0,this.readNext.resolve(),this.readNext=ar(),e}async throw(e){this.ended=!0,null!=e&&this.haveNext.reject(e);return{done:!0,value:void 0}}async return(){const e={done:!0,value:void 0};return await this._push(void 0),e}async push(e,t){await this._push(e,t)}async end(e,t){null!=e?await this.throw(e):await this._push(void 0,t)}async _push(e,t){if(null!=e&&this.ended)throw new Error("Cannot push value onto an ended pushable");if(null!=this.nextResult&&(await this.readNext.promise,null!=this.nextResult))throw new Error("NeedNext promise resolved but nextResult was not consumed");null!=e?this.nextResult={done:!1,value:e}:(this.ended=!0,this.nextResult={done:!0,value:void 0}),this.haveNext.resolve(),this.haveNext=ar(),await Ir(this.readNext.promise,t?.signal,t)}}let Ar=class extends Error{code;constructor(e,t){super(e),this.code=t}},Tr=class extends Ar{type;constructor(e){super(e,"ABORT_ERR"),this.type="aborted"}};function Dr(e,t){const n=new Rr;e.sink(n).catch((async e=>{await n.end(e)})),e.sink=async e=>{for await(const t of e)await n.push(t);await n.end()};let r=e.source;null!=e.source[Symbol.iterator]?r=e.source[Symbol.iterator]():null!=e.source[Symbol.asyncIterator]&&(r=e.source[Symbol.asyncIterator]());const s=new Sr,i={read:async(e,t)=>{let n;t?.signal?.throwIfAborted();const i=new Promise(((e,r)=>{n=()=>{r(new Tr("Read aborted"))},t?.signal?.addEventListener("abort",n)}));try{if(null==e){const{done:e,value:t}=await Promise.race([r.next(),i]);return!0===e?new Sr:t}for(;s.byteLength<e;){const{value:e,done:t}=await Promise.race([r.next(),i]);if(!0===t)throw new Ar("unexpected end of input","ERR_UNEXPECTED_EOF");s.append(e)}const t=s.sublist(0,e);return s.consume(e),t}finally{null!=n&&t?.signal?.removeEventListener("abort",n)}},write:async(e,t)=>{t?.signal?.throwIfAborted(),e instanceof Uint8Array?await n.push(e,t):await n.push(e.subarray(),t)},unwrap:()=>{if(s.byteLength>0){const n=e.source;e.source=async function*(){!1===t?.yieldBytes?yield s:yield*s,yield*n}()}return e}};return i}class kr extends Error{code;constructor(e,t){super(e),this.code=t}}function Pr(e,t={}){const n=Dr(e,t);null!=t.maxDataLength&&null==t.maxLengthLength&&(t.maxLengthLength=A(t.maxDataLength));const r=t?.lengthDecoder??P,s=t?.lengthEncoder??k;return{read:async e=>{let s=-1;const i=new Sr;for(;;){i.append(await n.read(1,e));try{s=r(i)}catch(e){if(e instanceof RangeError)continue;throw e}if(null!=t?.maxLengthLength&&i.byteLength>t.maxLengthLength)throw new kr("message length length too long","ERR_MSG_LENGTH_TOO_LONG");if(s>-1)break}if(null!=t?.maxDataLength&&s>t.maxDataLength)throw new kr("message length too long","ERR_MSG_DATA_TOO_LONG");return n.read(s,e)},write:async(e,t)=>{await n.write(new Sr(s(e.byteLength),e),t)},writeV:async(e,t)=>{const r=new Sr(...e.flatMap((e=>[s(e.byteLength),e])));await n.write(r,t)},unwrap:()=>n.unwrap()}}function Cr(e){return null!=e[Symbol.asyncIterator]}const xr=e=>{const t=A(e),n=m(t);return k(e,n),xr.bytes=t,n};function Nr(e,t){const n=(t=t??{}).lengthEncoder??xr;function*r(e){const t=n(e.byteLength);t instanceof Uint8Array?yield t:yield*t,e instanceof Uint8Array?yield e:yield*e}return Cr(e)?async function*(){for await(const t of e)yield*r(t)}():function*(){for(const t of e)yield*r(t)}()}xr.bytes=0,Nr.single=(e,t)=>{const n=(t=t??{}).lengthEncoder??xr;return new Sr(n(e.byteLength),e)};var Mr="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{};function Or(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}function Lr(e,t){for(const n in t)Object.defineProperty(e,n,{value:t[n],enumerable:!0,configurable:!0});return e}var Br=function(e,t,n){if(!e||"string"==typeof e)throw new TypeError("Please pass an Error to err-code");n||(n={}),"object"==typeof t&&(n=t,t=""),t&&(n.code=t);try{return Lr(e,n)}catch(t){n.message=e.message,n.stack=e.stack;const r=function(){};r.prototype=Object.create(Object.getPrototypeOf(e));return Lr(new r,n)}},Ur=Or(Br);var Fr;!function(e){e[e.LENGTH=0]="LENGTH",e[e.DATA=1]="DATA"}(Fr||(Fr={}));const Vr=e=>{const t=P(e);return Vr.bytes=A(t),t};function Kr(e,t){const n=new Sr;let r=Fr.LENGTH,s=-1;const i=t?.lengthDecoder??Vr,o=t?.maxLengthLength??8,a=t?.maxDataLength??4194304;function*c(){for(;n.byteLength>0;){if(r===Fr.LENGTH)try{if(s=i(n),s<0)throw Ur(new Error("invalid message length"),"ERR_INVALID_MSG_LENGTH");if(s>a)throw Ur(new Error("message length too long"),"ERR_MSG_DATA_TOO_LONG");const e=i.bytes;n.consume(e),null!=t?.onLength&&t.onLength(s),r=Fr.DATA}catch(e){if(e instanceof RangeError){if(n.byteLength>o)throw Ur(new Error("message length length too long"),"ERR_MSG_LENGTH_TOO_LONG");break}throw e}if(r===Fr.DATA){if(n.byteLength<s)break;const e=n.sublist(0,s);n.consume(s),null!=t?.onData&&t.onData(e),yield e,r=Fr.LENGTH}}}return Cr(e)?async function*(){for await(const t of e)n.append(t),yield*c();if(n.byteLength>0)throw Ur(new Error("unexpected end of input"),"ERR_UNEXPECTED_EOF")}():function*(){for(const t of e)n.append(t),yield*c();if(n.byteLength>0)throw Ur(new Error("unexpected end of input"),"ERR_UNEXPECTED_EOF")}()}function $r(e){const[t,n]=null!=e[Symbol.asyncIterator]?[e[Symbol.asyncIterator](),Symbol.asyncIterator]:[e[Symbol.iterator](),Symbol.iterator],r=[];return{peek:()=>t.next(),push:e=>{r.push(e)},next:()=>r.length>0?{done:!1,value:r.shift()}:t.next(),[n](){return this}}}function qr(e,t){let n=0;if(null!=e[Symbol.asyncIterator])return async function*(){for await(const r of e)yield t(r,n++)}();const r=$r(e),{value:s,done:i}=r.next();if(!0===i)return function*(){}();const o=t(s,n++);if("function"==typeof o.then)return async function*(){yield await o;for await(const e of r)yield t(e,n++)}();const a=t;return function*(){yield o;for(const e of r)yield a(e,n++)}()}
|
|
5
|
+
//! WebPEER.js -- https://github.com/nuzulul/webpeerjs
|
|
6
|
+
Vr.bytes=0,Kr.fromReader=(e,t)=>{let n=1;return Kr(async function*(){for(;;)try{const{done:t,value:r}=await e.next(n);if(!0===t)return;null!=r&&(yield r)}catch(e){if("ERR_UNDER_READ"===e.code)return{done:!0,value:null};throw e}finally{n=1}}(),{...t??{},onLength:e=>{n=e}})};const Hr=t,zr=e=>new Error(`${Hr}: ${e}`);function Wr(e){return(new TextDecoder).decode(e)}function jr(e){return(new TextEncoder).encode(e)}async function Gr(e){for await(const t of e)return t}async function Yr(e){const t=e,n=(new TextEncoder).encode(t.sequenceNumber.toString());return await pt.encode(n)}let Qr={readyErrored:0,noiseErrored:0,upgradeErrored:0,readyTimedout:0,noiseTimedout:0,success:0},Jr={pending:0,open:0,ready_error:0,noise_error:0,upgrade_error:0,ready_timeout:0,noise_timeout:0,close:0,abort:0,remote_close:0},Zr={pending:0,ready_error:0,noise_error:0,upgrade_error:0,close:0,remote_close:0,ready:0,abort:0,ready_timeout:0,noise_timeout:0,open:0},Xr=!0,es=0,ts=0;var ns,rs,ss={exports:{}};function is(){if(rs)return ns;rs=1;var e=1e3,t=60*e,n=60*t,r=24*n,s=7*r,i=365.25*r;function o(e,t,n,r){var s=t>=1.5*n;return Math.round(e/n)+" "+r+(s?"s":"")}return ns=function(a,c){c=c||{};var l=typeof a;if("string"===l&&a.length>0)return function(o){if((o=String(o)).length>100)return;var a=/^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(o);if(!a)return;var c=parseFloat(a[1]);switch((a[2]||"ms").toLowerCase()){case"years":case"year":case"yrs":case"yr":case"y":return c*i;case"weeks":case"week":case"w":return c*s;case"days":case"day":case"d":return c*r;case"hours":case"hour":case"hrs":case"hr":case"h":return c*n;case"minutes":case"minute":case"mins":case"min":case"m":return c*t;case"seconds":case"second":case"secs":case"sec":case"s":return c*e;case"milliseconds":case"millisecond":case"msecs":case"msec":case"ms":return c;default:return}}(a);if("number"===l&&isFinite(a))return c.long?function(s){var i=Math.abs(s);if(i>=r)return o(s,i,r,"day");if(i>=n)return o(s,i,n,"hour");if(i>=t)return o(s,i,t,"minute");if(i>=e)return o(s,i,e,"second");return s+" ms"}(a):function(s){var i=Math.abs(s);if(i>=r)return Math.round(s/r)+"d";if(i>=n)return Math.round(s/n)+"h";if(i>=t)return Math.round(s/t)+"m";if(i>=e)return Math.round(s/e)+"s";return s+"ms"}(a);throw new Error("val is not a non-empty string or a valid number. val="+JSON.stringify(a))}}var os=function(e){function t(e){let r,s,i,o=null;function a(...e){if(!a.enabled)return;const n=a,s=Number(new Date),i=s-(r||s);n.diff=i,n.prev=r,n.curr=s,r=s,e[0]=t.coerce(e[0]),"string"!=typeof e[0]&&e.unshift("%O");let o=0;e[0]=e[0].replace(/%([a-zA-Z%])/g,((r,s)=>{if("%%"===r)return"%";o++;const i=t.formatters[s];if("function"==typeof i){const t=e[o];r=i.call(n,t),e.splice(o,1),o--}return r})),t.formatArgs.call(n,e);(n.log||t.log).apply(n,e)}return a.namespace=e,a.useColors=t.useColors(),a.color=t.selectColor(e),a.extend=n,a.destroy=t.destroy,Object.defineProperty(a,"enabled",{enumerable:!0,configurable:!1,get:()=>null!==o?o:(s!==t.namespaces&&(s=t.namespaces,i=t.enabled(e)),i),set:e=>{o=e}}),"function"==typeof t.init&&t.init(a),a}function n(e,n){const r=t(this.namespace+(void 0===n?":":n)+e);return r.log=this.log,r}function r(e){return e.toString().substring(2,e.toString().length-2).replace(/\.\*\?$/,"*")}return t.debug=t,t.default=t,t.coerce=function(e){if(e instanceof Error)return e.stack||e.message;return e},t.disable=function(){const e=[...t.names.map(r),...t.skips.map(r).map((e=>"-"+e))].join(",");return t.enable(""),e},t.enable=function(e){let n;t.save(e),t.namespaces=e,t.names=[],t.skips=[];const r=("string"==typeof e?e:"").split(/[\s,]+/),s=r.length;for(n=0;n<s;n++)r[n]&&("-"===(e=r[n].replace(/\*/g,".*?"))[0]?t.skips.push(new RegExp("^"+e.slice(1)+"$")):t.names.push(new RegExp("^"+e+"$")))},t.enabled=function(e){if("*"===e[e.length-1])return!0;let n,r;for(n=0,r=t.skips.length;n<r;n++)if(t.skips[n].test(e))return!1;for(n=0,r=t.names.length;n<r;n++)if(t.names[n].test(e))return!0;return!1},t.humanize=is(),t.destroy=function(){console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.")},Object.keys(e).forEach((n=>{t[n]=e[n]})),t.names=[],t.skips=[],t.formatters={},t.selectColor=function(e){let n=0;for(let t=0;t<e.length;t++)n=(n<<5)-n+e.charCodeAt(t),n|=0;return t.colors[Math.abs(n)%t.colors.length]},t.enable(t.load()),t};!function(e,t){t.formatArgs=function(t){if(t[0]=(this.useColors?"%c":"")+this.namespace+(this.useColors?" %c":" ")+t[0]+(this.useColors?"%c ":" ")+"+"+e.exports.humanize(this.diff),!this.useColors)return;const n="color: "+this.color;t.splice(1,0,n,"color: inherit");let r=0,s=0;t[0].replace(/%[a-zA-Z%]/g,(e=>{"%%"!==e&&(r++,"%c"===e&&(s=r))})),t.splice(s,0,n)},t.save=function(e){try{e?t.storage.setItem("debug",e):t.storage.removeItem("debug")}catch(e){}},t.load=function(){let e;try{e=t.storage.getItem("debug")}catch(e){}!e&&"undefined"!=typeof process&&"env"in process&&(e=process.env.DEBUG);return e},t.useColors=function(){if("undefined"!=typeof window&&window.process&&("renderer"===window.process.type||window.process.__nwjs))return!0;if("undefined"!=typeof navigator&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/))return!1;return"undefined"!=typeof document&&document.documentElement&&document.documentElement.style&&document.documentElement.style.WebkitAppearance||"undefined"!=typeof window&&window.console&&(window.console.firebug||window.console.exception&&window.console.table)||"undefined"!=typeof navigator&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/)&&parseInt(RegExp.$1,10)>=31||"undefined"!=typeof navigator&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/)},t.storage=function(){try{return localStorage}catch(e){}}(),t.destroy=(()=>{let e=!1;return()=>{e||(e=!0,console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`."))}})(),t.colors=["#0000CC","#0000FF","#0033CC","#0033FF","#0066CC","#0066FF","#0099CC","#0099FF","#00CC00","#00CC33","#00CC66","#00CC99","#00CCCC","#00CCFF","#3300CC","#3300FF","#3333CC","#3333FF","#3366CC","#3366FF","#3399CC","#3399FF","#33CC00","#33CC33","#33CC66","#33CC99","#33CCCC","#33CCFF","#6600CC","#6600FF","#6633CC","#6633FF","#66CC00","#66CC33","#9900CC","#9900FF","#9933CC","#9933FF","#99CC00","#99CC33","#CC0000","#CC0033","#CC0066","#CC0099","#CC00CC","#CC00FF","#CC3300","#CC3333","#CC3366","#CC3399","#CC33CC","#CC33FF","#CC6600","#CC6633","#CC9900","#CC9933","#CCCC00","#CCCC33","#FF0000","#FF0033","#FF0066","#FF0099","#FF00CC","#FF00FF","#FF3300","#FF3333","#FF3366","#FF3399","#FF33CC","#FF33FF","#FF6600","#FF6633","#FF9900","#FF9933","#FFCC00","#FFCC33"],t.log=console.debug||console.log||(()=>{}),e.exports=os(t);const{formatters:n}=e.exports;n.j=function(e){try{return JSON.stringify(e)}catch(e){return"[UnexpectedJSONParseError]: "+e.message}}}(ss,ss.exports);var as=Or(ss.exports);function cs(){return{forComponent:e=>ls(e)}}function ls(e){let t=function(e){const t=()=>{};return t.enabled=!1,t.color="",t.diff=0,t.log=()=>{},t.namespace=e,t.destroy=()=>!0,t.extend=()=>t,t}(`${e}:trace`);return as.enabled(`${e}:trace`)&&null!=as.names.map((e=>e.toString())).find((e=>e.includes(":trace")))&&(t=as(`${e}:trace`)),Object.assign(as(e),{error:as(`${e}:error`),trace:t})}as.formatters.b=e=>null==e?"undefined":ke.baseEncode(e),as.formatters.t=e=>null==e?"undefined":me.baseEncode(e),as.formatters.m=e=>null==e?"undefined":xe.baseEncode(e),as.formatters.p=e=>null==e?"undefined":e.toString(),as.formatters.c=e=>null==e?"undefined":e.toString(),as.formatters.k=e=>null==e?"undefined":e.toString(),as.formatters.a=e=>null==e?"undefined":e.toString();const us=Symbol.for("nodejs.util.inspect.custom"),hs=Object.values(St).map((e=>e.decoder)).reduce(((e,t)=>e.or(t)),St.identity.decoder),ds=114,ps=36,fs=37;class gs{type;multihash;privateKey;publicKey;string;constructor(e){this.type=e.type,this.multihash=e.multihash,this.privateKey=e.privateKey,Object.defineProperty(this,"string",{enumerable:!1,writable:!0})}get[Symbol.toStringTag](){return`PeerId(${this.toString()})`}[nn]=!0;toString(){return null==this.string&&(this.string=ke.encode(this.multihash.bytes).slice(1)),this.string}toCID(){return yt.createV1(ds,this.multihash)}toBytes(){return this.multihash.bytes}toJSON(){return this.toString()}equals(e){if(null==e)return!1;if(e instanceof Uint8Array)return Sn(this.multihash.bytes,e);if("string"==typeof e)return bs(e).equals(this);if(null!=e?.multihash?.bytes)return Sn(this.multihash.bytes,e.multihash.bytes);throw new Error("not valid Id")}[us](){return`PeerId(${this.toString()})`}}class ms extends gs{type="RSA";publicKey;constructor(e){super({...e,type:"RSA"}),this.publicKey=e.publicKey}}class ys extends gs{type="Ed25519";publicKey;constructor(e){super({...e,type:"Ed25519"}),this.publicKey=e.multihash.digest}}class ws extends gs{type="secp256k1";publicKey;constructor(e){super({...e,type:"secp256k1"}),this.publicKey=e.multihash.digest}}function bs(e,t){if(t=t??hs,"1"===e.charAt(0)||"Q"===e.charAt(0)){const t=ct(ke.decode(`z${e}`));return e.startsWith("12D")?new ys({multihash:t}):e.startsWith("16U")?new ws({multihash:t}):new ms({multihash:t})}return vs(hs.decode(e))}function vs(e){try{const t=ct(e);if(t.code===ht.code){if(t.digest.length===ps)return new ys({multihash:t});if(t.digest.length===fs)return new ws({multihash:t})}if(t.code===pt.code)return new ms({multihash:t})}catch{return function(e){if(null==e||null==e.multihash||null==e.version||1===e.version&&e.code!==ds)throw new Error("Supplied PeerID CID is invalid");const t=e.multihash;if(t.code===pt.code)return new ms({multihash:e.multihash});if(t.code===ht.code){if(t.digest.length===ps)return new ys({multihash:e.multihash});if(t.digest.length===fs)return new ws({multihash:e.multihash})}throw new Error("Supplied PeerID CID is invalid")}(yt.decode(e))}throw new Error("Supplied PeerID CID is invalid")}async function Es(e,t){return e.length===ps?new ys({multihash:at(ht.code,e),privateKey:t}):e.length===fs?new ws({multihash:at(ht.code,e),privateKey:t}):new ms({multihash:await pt.digest(e),publicKey:e,privateKey:t})}function Ss(e){const t=new globalThis.AbortController;function n(){t.abort();for(const t of e)null!=t?.removeEventListener&&t.removeEventListener("abort",n)}for(const t of e){if(!0===t?.aborted){n();break}null!=t?.addEventListener&&t.addEventListener("abort",n)}const r=t.signal;return r.clear=function(){for(const t of e)null!=t?.removeEventListener&&t.removeEventListener("abort",n)},r}async function*_s(e,t={}){const n=e.getReader();try{for(;;){const e=await n.read();if(e.done)return;yield e.value}}finally{!0!==t.preventCancel&&await n.cancel(),n.releaseLock()}}function Is(e){return null!=e&&("function"==typeof e.then&&"function"==typeof e.catch&&"function"==typeof e.finally)}function Rs(e){if(!Number.isSafeInteger(e)||e<0)throw new Error(`positive integer expected, not ${e}`)}function As(e,...t){if(!((n=e)instanceof Uint8Array||null!=n&&"object"==typeof n&&"Uint8Array"===n.constructor.name))throw new Error("Uint8Array expected");var n;if(t.length>0&&!t.includes(e.length))throw new Error(`Uint8Array expected of length ${t}, not of length=${e.length}`)}function Ts(e){if("function"!=typeof e||"function"!=typeof e.create)throw new Error("Hash should be wrapped by utils.wrapConstructor");Rs(e.outputLen),Rs(e.blockLen)}function Ds(e,t=!0){if(e.destroyed)throw new Error("Hash instance has been destroyed");if(t&&e.finished)throw new Error("Hash#digest() has already been called")}const ks="object"==typeof globalThis&&"crypto"in globalThis?globalThis.crypto:void 0,Ps=e=>new DataView(e.buffer,e.byteOffset,e.byteLength),Cs=(e,t)=>e<<32-t|e>>>t;
|
|
7
|
+
/*! noble-hashes - MIT License (c) 2022 Paul Miller (paulmillr.com) */new Uint8Array(new Uint32Array([287454020]).buffer)[0];const xs=async()=>{};async function Ns(e,t,n){let r=Date.now();for(let s=0;s<e;s++){n(s);const e=Date.now()-r;e>=0&&e<t||(await xs(),r+=e)}}function Ms(e){if("string"!=typeof e)throw new Error("utf8ToBytes expected string, got "+typeof e);return new Uint8Array((new TextEncoder).encode(e))}function Os(e){return"string"==typeof e&&(e=Ms(e)),As(e),e}function Ls(...e){let t=0;for(let n=0;n<e.length;n++){const r=e[n];As(r),t+=r.length}const n=new Uint8Array(t);for(let t=0,r=0;t<e.length;t++){const s=e[t];n.set(s,r),r+=s.length}return n}class Bs{clone(){return this._cloneInto()}}const Us={}.toString;function Fs(e){const t=t=>e().update(Os(t)).digest(),n=e();return t.outputLen=n.outputLen,t.blockLen=n.blockLen,t.create=()=>e(),t}function Vs(e=32){if(ks&&"function"==typeof ks.getRandomValues)return ks.getRandomValues(new Uint8Array(e));throw new Error("crypto.getRandomValues must be defined")}const Ks=(e,t,n)=>e&t^e&n^t&n;class $s extends Bs{constructor(e,t,n,r){super(),this.blockLen=e,this.outputLen=t,this.padOffset=n,this.isLE=r,this.finished=!1,this.length=0,this.pos=0,this.destroyed=!1,this.buffer=new Uint8Array(e),this.view=Ps(this.buffer)}update(e){Ds(this);const{view:t,buffer:n,blockLen:r}=this,s=(e=Os(e)).length;for(let i=0;i<s;){const o=Math.min(r-this.pos,s-i);if(o!==r)n.set(e.subarray(i,i+o),this.pos),this.pos+=o,i+=o,this.pos===r&&(this.process(t,0),this.pos=0);else{const t=Ps(e);for(;r<=s-i;i+=r)this.process(t,i)}}return this.length+=e.length,this.roundClean(),this}digestInto(e){Ds(this),function(e,t){As(e);const n=t.outputLen;if(e.length<n)throw new Error(`digestInto() expects output buffer of length at least ${n}`)}(e,this),this.finished=!0;const{buffer:t,view:n,blockLen:r,isLE:s}=this;let{pos:i}=this;t[i++]=128,this.buffer.subarray(i).fill(0),this.padOffset>r-i&&(this.process(n,0),i=0);for(let e=i;e<r;e++)t[e]=0;!function(e,t,n,r){if("function"==typeof e.setBigUint64)return e.setBigUint64(t,n,r);const s=BigInt(32),i=BigInt(4294967295),o=Number(n>>s&i),a=Number(n&i),c=r?4:0,l=r?0:4;e.setUint32(t+c,o,r),e.setUint32(t+l,a,r)}(n,r-8,BigInt(8*this.length),s),this.process(n,0);const o=Ps(e),a=this.outputLen;if(a%4)throw new Error("_sha2: outputLen should be aligned to 32bit");const c=a/4,l=this.get();if(c>l.length)throw new Error("_sha2: outputLen bigger than state");for(let e=0;e<c;e++)o.setUint32(4*e,l[e],s)}digest(){const{buffer:e,outputLen:t}=this;this.digestInto(e);const n=e.slice(0,t);return this.destroy(),n}_cloneInto(e){e||(e=new this.constructor),e.set(...this.get());const{blockLen:t,buffer:n,length:r,finished:s,destroyed:i,pos:o}=this;return e.length=r,e.pos=o,e.finished=s,e.destroyed=i,r%t&&e.buffer.set(n),e}}const qs=BigInt(2**32-1),Hs=BigInt(32);function zs(e,t=!1){return t?{h:Number(e&qs),l:Number(e>>Hs&qs)}:{h:0|Number(e>>Hs&qs),l:0|Number(e&qs)}}const Ws={fromBig:zs,split:function(e,t=!1){let n=new Uint32Array(e.length),r=new Uint32Array(e.length);for(let s=0;s<e.length;s++){const{h:i,l:o}=zs(e[s],t);[n[s],r[s]]=[i,o]}return[n,r]},toBig:(e,t)=>BigInt(e>>>0)<<Hs|BigInt(t>>>0),shrSH:(e,t,n)=>e>>>n,shrSL:(e,t,n)=>e<<32-n|t>>>n,rotrSH:(e,t,n)=>e>>>n|t<<32-n,rotrSL:(e,t,n)=>e<<32-n|t>>>n,rotrBH:(e,t,n)=>e<<64-n|t>>>n-32,rotrBL:(e,t,n)=>e>>>n-32|t<<64-n,rotr32H:(e,t)=>t,rotr32L:(e,t)=>e,rotlSH:(e,t,n)=>e<<n|t>>>32-n,rotlSL:(e,t,n)=>t<<n|e>>>32-n,rotlBH:(e,t,n)=>t<<n-32|e>>>64-n,rotlBL:(e,t,n)=>e<<n-32|t>>>64-n,add:function(e,t,n,r){const s=(t>>>0)+(r>>>0);return{h:e+n+(s/2**32|0)|0,l:0|s}},add3L:(e,t,n)=>(e>>>0)+(t>>>0)+(n>>>0),add3H:(e,t,n,r)=>t+n+r+(e/2**32|0)|0,add4L:(e,t,n,r)=>(e>>>0)+(t>>>0)+(n>>>0)+(r>>>0),add4H:(e,t,n,r,s)=>t+n+r+s+(e/2**32|0)|0,add5H:(e,t,n,r,s,i)=>t+n+r+s+i+(e/2**32|0)|0,add5L:(e,t,n,r,s)=>(e>>>0)+(t>>>0)+(n>>>0)+(r>>>0)+(s>>>0)},[js,Gs]=(()=>Ws.split(["0x428a2f98d728ae22","0x7137449123ef65cd","0xb5c0fbcfec4d3b2f","0xe9b5dba58189dbbc","0x3956c25bf348b538","0x59f111f1b605d019","0x923f82a4af194f9b","0xab1c5ed5da6d8118","0xd807aa98a3030242","0x12835b0145706fbe","0x243185be4ee4b28c","0x550c7dc3d5ffb4e2","0x72be5d74f27b896f","0x80deb1fe3b1696b1","0x9bdc06a725c71235","0xc19bf174cf692694","0xe49b69c19ef14ad2","0xefbe4786384f25e3","0x0fc19dc68b8cd5b5","0x240ca1cc77ac9c65","0x2de92c6f592b0275","0x4a7484aa6ea6e483","0x5cb0a9dcbd41fbd4","0x76f988da831153b5","0x983e5152ee66dfab","0xa831c66d2db43210","0xb00327c898fb213f","0xbf597fc7beef0ee4","0xc6e00bf33da88fc2","0xd5a79147930aa725","0x06ca6351e003826f","0x142929670a0e6e70","0x27b70a8546d22ffc","0x2e1b21385c26c926","0x4d2c6dfc5ac42aed","0x53380d139d95b3df","0x650a73548baf63de","0x766a0abb3c77b2a8","0x81c2c92e47edaee6","0x92722c851482353b","0xa2bfe8a14cf10364","0xa81a664bbc423001","0xc24b8b70d0f89791","0xc76c51a30654be30","0xd192e819d6ef5218","0xd69906245565a910","0xf40e35855771202a","0x106aa07032bbd1b8","0x19a4c116b8d2d0c8","0x1e376c085141ab53","0x2748774cdf8eeb99","0x34b0bcb5e19b48a8","0x391c0cb3c5c95a63","0x4ed8aa4ae3418acb","0x5b9cca4f7763e373","0x682e6ff3d6b2b8a3","0x748f82ee5defb2fc","0x78a5636f43172f60","0x84c87814a1f0ab72","0x8cc702081a6439ec","0x90befffa23631e28","0xa4506cebde82bde9","0xbef9a3f7b2c67915","0xc67178f2e372532b","0xca273eceea26619c","0xd186b8c721c0c207","0xeada7dd6cde0eb1e","0xf57d4f7fee6ed178","0x06f067aa72176fba","0x0a637dc5a2c898a6","0x113f9804bef90dae","0x1b710b35131c471b","0x28db77f523047d84","0x32caab7b40c72493","0x3c9ebe0a15c9bebc","0x431d67c49c100d4c","0x4cc5d4becb3e42b6","0x597f299cfc657e2a","0x5fcb6fab3ad6faec","0x6c44198c4a475817"].map((e=>BigInt(e)))))(),Ys=new Uint32Array(80),Qs=new Uint32Array(80);class Js extends $s{constructor(){super(128,64,16,!1),this.Ah=1779033703,this.Al=-205731576,this.Bh=-1150833019,this.Bl=-2067093701,this.Ch=1013904242,this.Cl=-23791573,this.Dh=-1521486534,this.Dl=1595750129,this.Eh=1359893119,this.El=-1377402159,this.Fh=-1694144372,this.Fl=725511199,this.Gh=528734635,this.Gl=-79577749,this.Hh=1541459225,this.Hl=327033209}get(){const{Ah:e,Al:t,Bh:n,Bl:r,Ch:s,Cl:i,Dh:o,Dl:a,Eh:c,El:l,Fh:u,Fl:h,Gh:d,Gl:p,Hh:f,Hl:g}=this;return[e,t,n,r,s,i,o,a,c,l,u,h,d,p,f,g]}set(e,t,n,r,s,i,o,a,c,l,u,h,d,p,f,g){this.Ah=0|e,this.Al=0|t,this.Bh=0|n,this.Bl=0|r,this.Ch=0|s,this.Cl=0|i,this.Dh=0|o,this.Dl=0|a,this.Eh=0|c,this.El=0|l,this.Fh=0|u,this.Fl=0|h,this.Gh=0|d,this.Gl=0|p,this.Hh=0|f,this.Hl=0|g}process(e,t){for(let n=0;n<16;n++,t+=4)Ys[n]=e.getUint32(t),Qs[n]=e.getUint32(t+=4);for(let e=16;e<80;e++){const t=0|Ys[e-15],n=0|Qs[e-15],r=Ws.rotrSH(t,n,1)^Ws.rotrSH(t,n,8)^Ws.shrSH(t,n,7),s=Ws.rotrSL(t,n,1)^Ws.rotrSL(t,n,8)^Ws.shrSL(t,n,7),i=0|Ys[e-2],o=0|Qs[e-2],a=Ws.rotrSH(i,o,19)^Ws.rotrBH(i,o,61)^Ws.shrSH(i,o,6),c=Ws.rotrSL(i,o,19)^Ws.rotrBL(i,o,61)^Ws.shrSL(i,o,6),l=Ws.add4L(s,c,Qs[e-7],Qs[e-16]),u=Ws.add4H(l,r,a,Ys[e-7],Ys[e-16]);Ys[e]=0|u,Qs[e]=0|l}let{Ah:n,Al:r,Bh:s,Bl:i,Ch:o,Cl:a,Dh:c,Dl:l,Eh:u,El:h,Fh:d,Fl:p,Gh:f,Gl:g,Hh:m,Hl:y}=this;for(let e=0;e<80;e++){const t=Ws.rotrSH(u,h,14)^Ws.rotrSH(u,h,18)^Ws.rotrBH(u,h,41),w=Ws.rotrSL(u,h,14)^Ws.rotrSL(u,h,18)^Ws.rotrBL(u,h,41),b=u&d^~u&f,v=h&p^~h&g,E=Ws.add5L(y,w,v,Gs[e],Qs[e]),S=Ws.add5H(E,m,t,b,js[e],Ys[e]),_=0|E,I=Ws.rotrSH(n,r,28)^Ws.rotrBH(n,r,34)^Ws.rotrBH(n,r,39),R=Ws.rotrSL(n,r,28)^Ws.rotrBL(n,r,34)^Ws.rotrBL(n,r,39),A=n&s^n&o^s&o,T=r&i^r&a^i&a;m=0|f,y=0|g,f=0|d,g=0|p,d=0|u,p=0|h,({h:u,l:h}=Ws.add(0|c,0|l,0|S,0|_)),c=0|o,l=0|a,o=0|s,a=0|i,s=0|n,i=0|r;const D=Ws.add3L(_,R,T);n=Ws.add3H(D,S,I,A),r=0|D}({h:n,l:r}=Ws.add(0|this.Ah,0|this.Al,0|n,0|r)),({h:s,l:i}=Ws.add(0|this.Bh,0|this.Bl,0|s,0|i)),({h:o,l:a}=Ws.add(0|this.Ch,0|this.Cl,0|o,0|a)),({h:c,l:l}=Ws.add(0|this.Dh,0|this.Dl,0|c,0|l)),({h:u,l:h}=Ws.add(0|this.Eh,0|this.El,0|u,0|h)),({h:d,l:p}=Ws.add(0|this.Fh,0|this.Fl,0|d,0|p)),({h:f,l:g}=Ws.add(0|this.Gh,0|this.Gl,0|f,0|g)),({h:m,l:y}=Ws.add(0|this.Hh,0|this.Hl,0|m,0|y)),this.set(n,r,s,i,o,a,c,l,u,h,d,p,f,g,m,y)}roundClean(){Ys.fill(0),Qs.fill(0)}destroy(){this.buffer.fill(0),this.set(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0)}}const Zs=Fs((()=>new Js)),Xs=BigInt(0),ei=BigInt(1),ti=BigInt(2);
|
|
8
|
+
/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */function ni(e){return e instanceof Uint8Array||null!=e&&"object"==typeof e&&"Uint8Array"===e.constructor.name}function ri(e){if(!ni(e))throw new Error("Uint8Array expected")}const si=Array.from({length:256},((e,t)=>t.toString(16).padStart(2,"0")));function ii(e){ri(e);let t="";for(let n=0;n<e.length;n++)t+=si[e[n]];return t}function oi(e){const t=e.toString(16);return 1&t.length?`0${t}`:t}function ai(e){if("string"!=typeof e)throw new Error("hex string expected, got "+typeof e);return BigInt(""===e?"0":`0x${e}`)}const ci={_0:48,_9:57,_A:65,_F:70,_a:97,_f:102};function li(e){return e>=ci._0&&e<=ci._9?e-ci._0:e>=ci._A&&e<=ci._F?e-(ci._A-10):e>=ci._a&&e<=ci._f?e-(ci._a-10):void 0}function ui(e){if("string"!=typeof e)throw new Error("hex string expected, got "+typeof e);const t=e.length,n=t/2;if(t%2)throw new Error("padded hex string expected, got unpadded hex of length "+t);const r=new Uint8Array(n);for(let t=0,s=0;t<n;t++,s+=2){const n=li(e.charCodeAt(s)),i=li(e.charCodeAt(s+1));if(void 0===n||void 0===i){const t=e[s]+e[s+1];throw new Error('hex string expected, got non-hex character "'+t+'" at index '+s)}r[t]=16*n+i}return r}function hi(e){return ai(ii(e))}function di(e){return ri(e),ai(ii(Uint8Array.from(e).reverse()))}function pi(e,t){return ui(e.toString(16).padStart(2*t,"0"))}function fi(e,t){return pi(e,t).reverse()}function gi(e,t,n){let r;if("string"==typeof t)try{r=ui(t)}catch(n){throw new Error(`${e} must be valid hex string, got "${t}". Cause: ${n}`)}else{if(!ni(t))throw new Error(`${e} must be hex string or Uint8Array`);r=Uint8Array.from(t)}const s=r.length;if("number"==typeof n&&s!==n)throw new Error(`${e} expected ${n} bytes, got ${s}`);return r}function mi(...e){let t=0;for(let n=0;n<e.length;n++){const r=e[n];ri(r),t+=r.length}const n=new Uint8Array(t);for(let t=0,r=0;t<e.length;t++){const s=e[t];n.set(s,r),r+=s.length}return n}const yi=e=>(ti<<BigInt(e-1))-ei,wi=e=>new Uint8Array(e),bi=e=>Uint8Array.from(e);function vi(e,t,n){if("number"!=typeof e||e<2)throw new Error("hashLen must be a number");if("number"!=typeof t||t<2)throw new Error("qByteLen must be a number");if("function"!=typeof n)throw new Error("hmacFn must be a function");let r=wi(e),s=wi(e),i=0;const o=()=>{r.fill(1),s.fill(0),i=0},a=(...e)=>n(s,r,...e),c=(e=wi())=>{s=a(bi([0]),e),r=a(),0!==e.length&&(s=a(bi([1]),e),r=a())},l=()=>{if(i++>=1e3)throw new Error("drbg: tried 1000 values");let e=0;const n=[];for(;e<t;){r=a();const t=r.slice();n.push(t),e+=r.length}return mi(...n)};return(e,t)=>{let n;for(o(),c(e);!(n=t(l()));)c();return o(),n}}const Ei={bigint:e=>"bigint"==typeof e,function:e=>"function"==typeof e,boolean:e=>"boolean"==typeof e,string:e=>"string"==typeof e,stringOrUint8Array:e=>"string"==typeof e||ni(e),isSafeInteger:e=>Number.isSafeInteger(e),array:e=>Array.isArray(e),field:(e,t)=>t.Fp.isValid(e),hash:e=>"function"==typeof e&&Number.isSafeInteger(e.outputLen)};function Si(e,t,n={}){const r=(t,n,r)=>{const s=Ei[n];if("function"!=typeof s)throw new Error(`Invalid validator "${n}", expected function`);const i=e[t];if(!(r&&void 0===i||s(i,e)))throw new Error(`Invalid param ${String(t)}=${i} (${typeof i}), expected ${n}`)};for(const[e,n]of Object.entries(t))r(e,n,!1);for(const[e,t]of Object.entries(n))r(e,t,!0);return e}var _i=Object.freeze({__proto__:null,abytes:ri,bitGet:function(e,t){return e>>BigInt(t)&ei},bitLen:function(e){let t;for(t=0;e>Xs;e>>=ei,t+=1);return t},bitMask:yi,bitSet:function(e,t,n){return e|(n?ei:Xs)<<BigInt(t)},bytesToHex:ii,bytesToNumberBE:hi,bytesToNumberLE:di,concatBytes:mi,createHmacDrbg:vi,ensureBytes:gi,equalBytes:function(e,t){if(e.length!==t.length)return!1;let n=0;for(let r=0;r<e.length;r++)n|=e[r]^t[r];return 0===n},hexToBytes:ui,hexToNumber:ai,isBytes:ni,numberToBytesBE:pi,numberToBytesLE:fi,numberToHexUnpadded:oi,numberToVarBytesBE:function(e){return ui(oi(e))},utf8ToBytes:function(e){if("string"!=typeof e)throw new Error("utf8ToBytes expected string, got "+typeof e);return new Uint8Array((new TextEncoder).encode(e))},validateObject:Si});
|
|
9
|
+
/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */const Ii=BigInt(0),Ri=BigInt(1),Ai=BigInt(2),Ti=BigInt(3),Di=BigInt(4),ki=BigInt(5),Pi=BigInt(8);function Ci(e,t){const n=e%t;return n>=Ii?n:t+n}function xi(e,t,n){if(n<=Ii||t<Ii)throw new Error("Expected power/modulo > 0");if(n===Ri)return Ii;let r=Ri;for(;t>Ii;)t&Ri&&(r=r*e%n),e=e*e%n,t>>=Ri;return r}function Ni(e,t,n){let r=e;for(;t-- >Ii;)r*=r,r%=n;return r}function Mi(e,t){if(e===Ii||t<=Ii)throw new Error(`invert: expected positive integers, got n=${e} mod=${t}`);let n=Ci(e,t),r=t,s=Ii,i=Ri;for(;n!==Ii;){const e=r%n,t=s-i*(r/n);r=n,n=e,s=i,i=t}if(r!==Ri)throw new Error("invert: does not exist");return Ci(s,t)}function Oi(e){if(e%Di===Ti){const t=(e+Ri)/Di;return function(e,n){const r=e.pow(n,t);if(!e.eql(e.sqr(r),n))throw new Error("Cannot find square root");return r}}if(e%Pi===ki){const t=(e-ki)/Pi;return function(e,n){const r=e.mul(n,Ai),s=e.pow(r,t),i=e.mul(n,s),o=e.mul(e.mul(i,Ai),s),a=e.mul(i,e.sub(o,e.ONE));if(!e.eql(e.sqr(a),n))throw new Error("Cannot find square root");return a}}return function(e){const t=(e-Ri)/Ai;let n,r,s;for(n=e-Ri,r=0;n%Ai===Ii;n/=Ai,r++);for(s=Ai;s<e&&xi(s,t,e)!==e-Ri;s++);if(1===r){const t=(e+Ri)/Di;return function(e,n){const r=e.pow(n,t);if(!e.eql(e.sqr(r),n))throw new Error("Cannot find square root");return r}}const i=(n+Ri)/Ai;return function(e,o){if(e.pow(o,t)===e.neg(e.ONE))throw new Error("Cannot find square root");let a=r,c=e.pow(e.mul(e.ONE,s),n),l=e.pow(o,i),u=e.pow(o,n);for(;!e.eql(u,e.ONE);){if(e.eql(u,e.ZERO))return e.ZERO;let t=1;for(let n=e.sqr(u);t<a&&!e.eql(n,e.ONE);t++)n=e.sqr(n);const n=e.pow(c,Ri<<BigInt(a-t-1));c=e.sqr(n),l=e.mul(l,n),u=e.mul(u,c),a=t}return l}}(e)}BigInt(9),BigInt(16);const Li=["create","isValid","is0","neg","inv","sqrt","sqr","eql","add","sub","mul","pow","div","addN","subN","mulN","sqrN"];function Bi(e,t){const n=void 0!==t?t:e.toString(2).length;return{nBitLength:n,nByteLength:Math.ceil(n/8)}}function Ui(e,t,n=!1,r={}){if(e<=Ii)throw new Error(`Expected Field ORDER > 0, got ${e}`);const{nBitLength:s,nByteLength:i}=Bi(e,t);if(i>2048)throw new Error("Field lengths over 2048 bytes are not supported");const o=Oi(e),a=Object.freeze({ORDER:e,BITS:s,BYTES:i,MASK:yi(s),ZERO:Ii,ONE:Ri,create:t=>Ci(t,e),isValid:t=>{if("bigint"!=typeof t)throw new Error("Invalid field element: expected bigint, got "+typeof t);return Ii<=t&&t<e},is0:e=>e===Ii,isOdd:e=>(e&Ri)===Ri,neg:t=>Ci(-t,e),eql:(e,t)=>e===t,sqr:t=>Ci(t*t,e),add:(t,n)=>Ci(t+n,e),sub:(t,n)=>Ci(t-n,e),mul:(t,n)=>Ci(t*n,e),pow:(e,t)=>function(e,t,n){if(n<Ii)throw new Error("Expected power > 0");if(n===Ii)return e.ONE;if(n===Ri)return t;let r=e.ONE,s=t;for(;n>Ii;)n&Ri&&(r=e.mul(r,s)),s=e.sqr(s),n>>=Ri;return r}(a,e,t),div:(t,n)=>Ci(t*Mi(n,e),e),sqrN:e=>e*e,addN:(e,t)=>e+t,subN:(e,t)=>e-t,mulN:(e,t)=>e*t,inv:t=>Mi(t,e),sqrt:r.sqrt||(e=>o(a,e)),invertBatch:e=>function(e,t){const n=new Array(t.length),r=t.reduce(((t,r,s)=>e.is0(r)?t:(n[s]=t,e.mul(t,r))),e.ONE),s=e.inv(r);return t.reduceRight(((t,r,s)=>e.is0(r)?t:(n[s]=e.mul(t,n[s]),e.mul(t,r))),s),n}(a,e),cmov:(e,t,n)=>n?t:e,toBytes:e=>n?fi(e,i):pi(e,i),fromBytes:e=>{if(e.length!==i)throw new Error(`Fp.fromBytes: expected ${i}, got ${e.length}`);return n?di(e):hi(e)}});return Object.freeze(a)}function Fi(e){if("bigint"!=typeof e)throw new Error("field order must be bigint");const t=e.toString(2).length;return Math.ceil(t/8)}function Vi(e){const t=Fi(e);return t+Math.ceil(t/2)}
|
|
10
|
+
/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */
|
|
11
|
+
const Ki=BigInt(0),$i=BigInt(1);function qi(e,t){const n=(e,t)=>{const n=t.negate();return e?n:t},r=e=>({windows:Math.ceil(t/e)+1,windowSize:2**(e-1)});return{constTimeNegate:n,unsafeLadder(t,n){let r=e.ZERO,s=t;for(;n>Ki;)n&$i&&(r=r.add(s)),s=s.double(),n>>=$i;return r},precomputeWindow(e,t){const{windows:n,windowSize:s}=r(t),i=[];let o=e,a=o;for(let e=0;e<n;e++){a=o,i.push(a);for(let e=1;e<s;e++)a=a.add(o),i.push(a);o=a.double()}return i},wNAF(t,s,i){const{windows:o,windowSize:a}=r(t);let c=e.ZERO,l=e.BASE;const u=BigInt(2**t-1),h=2**t,d=BigInt(t);for(let e=0;e<o;e++){const t=e*a;let r=Number(i&u);i>>=d,r>a&&(r-=h,i+=$i);const o=t,p=t+Math.abs(r)-1,f=e%2!=0,g=r<0;0===r?l=l.add(n(f,s[o])):c=c.add(n(g,s[p]))}return{p:c,f:l}},wNAFCached(e,t,n,r){const s=e._WINDOW_SIZE||1;let i=t.get(e);return i||(i=this.precomputeWindow(e,s),1!==s&&t.set(e,r(i))),this.wNAF(s,i,n)}}}function Hi(e){return function(e){const t=Li.reduce(((e,t)=>(e[t]="function",e)),{ORDER:"bigint",MASK:"bigint",BYTES:"isSafeInteger",BITS:"isSafeInteger"});Si(e,t)}(e.Fp),Si(e,{n:"bigint",h:"bigint",Gx:"field",Gy:"field"},{nBitLength:"isSafeInteger",nByteLength:"isSafeInteger"}),Object.freeze({...Bi(e.n,e.nBitLength),...e,p:e.Fp.ORDER})}
|
|
12
|
+
/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */const zi=BigInt(0),Wi=BigInt(1),ji=BigInt(2),Gi=BigInt(8),Yi={zip215:!0};function Qi(e){const t=function(e){const t=Hi(e);return Si(e,{hash:"function",a:"bigint",d:"bigint",randomBytes:"function"},{adjustScalarBytes:"function",domain:"function",uvRatio:"function",mapToCurve:"function"}),Object.freeze({...t})}(e),{Fp:n,n:r,prehash:s,hash:i,randomBytes:o,nByteLength:a,h:c}=t,l=ji<<BigInt(8*a)-Wi,u=n.create,h=t.uvRatio||((e,t)=>{try{return{isValid:!0,value:n.sqrt(e*n.inv(t))}}catch(e){return{isValid:!1,value:zi}}}),d=t.adjustScalarBytes||(e=>e),p=t.domain||((e,t,n)=>{if(t.length||n)throw new Error("Contexts/pre-hash are not supported");return e}),f=e=>"bigint"==typeof e&&zi<e,g=(e,t)=>f(e)&&f(t)&&e<t,m=e=>e===zi||g(e,l);function y(e,t){if(g(e,t))return e;throw new Error(`Expected valid scalar < ${t}, got ${typeof e} ${e}`)}function w(e){return e===zi?e:y(e,r)}const b=new Map;function v(e){if(!(e instanceof E))throw new Error("ExtendedPoint expected")}class E{constructor(e,t,n,r){if(this.ex=e,this.ey=t,this.ez=n,this.et=r,!m(e))throw new Error("x required");if(!m(t))throw new Error("y required");if(!m(n))throw new Error("z required");if(!m(r))throw new Error("t required")}get x(){return this.toAffine().x}get y(){return this.toAffine().y}static fromAffine(e){if(e instanceof E)throw new Error("extended point not allowed");const{x:t,y:n}=e||{};if(!m(t)||!m(n))throw new Error("invalid affine point");return new E(t,n,Wi,u(t*n))}static normalizeZ(e){const t=n.invertBatch(e.map((e=>e.ez)));return e.map(((e,n)=>e.toAffine(t[n]))).map(E.fromAffine)}_setWindowSize(e){this._WINDOW_SIZE=e,b.delete(this)}assertValidity(){const{a:e,d:n}=t;if(this.is0())throw new Error("bad point: ZERO");const{ex:r,ey:s,ez:i,et:o}=this,a=u(r*r),c=u(s*s),l=u(i*i),h=u(l*l),d=u(a*e);if(u(l*u(d+c))!==u(h+u(n*u(a*c))))throw new Error("bad point: equation left != right (1)");if(u(r*s)!==u(i*o))throw new Error("bad point: equation left != right (2)")}equals(e){v(e);const{ex:t,ey:n,ez:r}=this,{ex:s,ey:i,ez:o}=e,a=u(t*o),c=u(s*r),l=u(n*o),h=u(i*r);return a===c&&l===h}is0(){return this.equals(E.ZERO)}negate(){return new E(u(-this.ex),this.ey,this.ez,u(-this.et))}double(){const{a:e}=t,{ex:n,ey:r,ez:s}=this,i=u(n*n),o=u(r*r),a=u(ji*u(s*s)),c=u(e*i),l=n+r,h=u(u(l*l)-i-o),d=c+o,p=d-a,f=c-o,g=u(h*p),m=u(d*f),y=u(h*f),w=u(p*d);return new E(g,m,w,y)}add(e){v(e);const{a:n,d:r}=t,{ex:s,ey:i,ez:o,et:a}=this,{ex:c,ey:l,ez:h,et:d}=e;if(n===BigInt(-1)){const e=u((i-s)*(l+c)),t=u((i+s)*(l-c)),n=u(t-e);if(n===zi)return this.double();const r=u(o*ji*d),p=u(a*ji*h),f=p+r,g=t+e,m=p-r,y=u(f*n),w=u(g*m),b=u(f*m),v=u(n*g);return new E(y,w,v,b)}const p=u(s*c),f=u(i*l),g=u(a*r*d),m=u(o*h),y=u((s+i)*(c+l)-p-f),w=m-g,b=m+g,S=u(f-n*p),_=u(y*w),I=u(b*S),R=u(y*S),A=u(w*b);return new E(_,I,A,R)}subtract(e){return this.add(e.negate())}wNAF(e){return I.wNAFCached(this,b,e,E.normalizeZ)}multiply(e){const{p:t,f:n}=this.wNAF(y(e,r));return E.normalizeZ([t,n])[0]}multiplyUnsafe(e){let t=w(e);return t===zi?_:this.equals(_)||t===Wi?this:this.equals(S)?this.wNAF(t).p:I.unsafeLadder(this,t)}isSmallOrder(){return this.multiplyUnsafe(c).is0()}isTorsionFree(){return I.unsafeLadder(this,r).is0()}toAffine(e){const{ex:t,ey:r,ez:s}=this,i=this.is0();null==e&&(e=i?Gi:n.inv(s));const o=u(t*e),a=u(r*e),c=u(s*e);if(i)return{x:zi,y:Wi};if(c!==Wi)throw new Error("invZ was invalid");return{x:o,y:a}}clearCofactor(){const{h:e}=t;return e===Wi?this:this.multiplyUnsafe(e)}static fromHex(e,r=!1){const{d:s,a:i}=t,o=n.BYTES,a=(e=gi("pointHex",e,o)).slice(),c=e[o-1];a[o-1]=-129&c;const d=di(a);d===zi||y(d,r?l:n.ORDER);const p=u(d*d),f=u(p-Wi),g=u(s*p-i);let{isValid:m,value:w}=h(f,g);if(!m)throw new Error("Point.fromHex: invalid y coordinate");const b=(w&Wi)===Wi,v=!!(128&c);if(!r&&w===zi&&v)throw new Error("Point.fromHex: x=0 and x_0=1");return v!==b&&(w=u(-w)),E.fromAffine({x:w,y:d})}static fromPrivateKey(e){return T(e).point}toRawBytes(){const{x:e,y:t}=this.toAffine(),r=fi(t,n.BYTES);return r[r.length-1]|=e&Wi?128:0,r}toHex(){return ii(this.toRawBytes())}}E.BASE=new E(t.Gx,t.Gy,Wi,u(t.Gx*t.Gy)),E.ZERO=new E(zi,Wi,Wi,zi);const{BASE:S,ZERO:_}=E,I=qi(E,8*a);function R(e){return Ci(e,r)}function A(e){return R(di(e))}function T(e){const t=a;e=gi("private key",e,t);const n=gi("hashed private key",i(e),2*t),r=d(n.slice(0,t)),s=n.slice(t,2*t),o=A(r),c=S.multiply(o),l=c.toRawBytes();return{head:r,prefix:s,scalar:o,point:c,pointBytes:l}}function D(e=new Uint8Array,...t){const n=mi(...t);return A(i(p(n,gi("context",e),!!s)))}const k=Yi;S._setWindowSize(8);return{CURVE:t,getPublicKey:function(e){return T(e).pointBytes},sign:function(e,t,r={}){e=gi("message",e),s&&(e=s(e));const{prefix:i,scalar:o,pointBytes:c}=T(t),l=D(r.context,i,e),u=S.multiply(l).toRawBytes(),h=R(l+D(r.context,u,c,e)*o);return w(h),gi("result",mi(u,fi(h,n.BYTES)),2*a)},verify:function(e,t,r,i=k){const{context:o,zip215:a}=i,c=n.BYTES;e=gi("signature",e,2*c),t=gi("message",t),s&&(t=s(t));const l=di(e.slice(c,2*c));let u,h,d;try{u=E.fromHex(r,a),h=E.fromHex(e.slice(0,c),a),d=S.multiplyUnsafe(l)}catch(e){return!1}if(!a&&u.isSmallOrder())return!1;const p=D(o,h.toRawBytes(),u.toRawBytes(),t);return h.add(u.multiplyUnsafe(p)).subtract(d).clearCofactor().equals(E.ZERO)},ExtendedPoint:E,utils:{getExtendedPublicKey:T,randomPrivateKey:()=>o(n.BYTES),precompute:(e=8,t=E.BASE)=>(t._setWindowSize(e),t.multiply(BigInt(3)),t)}}}
|
|
13
|
+
/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */const Ji=BigInt(0),Zi=BigInt(1);function Xi(e){const t=(Si(n=e,{a:"bigint"},{montgomeryBits:"isSafeInteger",nByteLength:"isSafeInteger",adjustScalarBytes:"function",domain:"function",powPminus2:"function",Gu:"bigint"}),Object.freeze({...n}));var n;const{P:r}=t,s=e=>Ci(e,r),i=t.montgomeryBits,o=Math.ceil(i/8),a=t.nByteLength,c=t.adjustScalarBytes||(e=>e),l=t.powPminus2||(e=>xi(e,r-BigInt(2),r));function u(e,t,n){const r=s(e*(t-n));return[t=s(t-r),n=s(n+r)]}function h(e){if("bigint"==typeof e&&Ji<=e&&e<r)return e;throw new Error("Expected valid scalar 0 < scalar < CURVE.P")}const d=(t.a-BigInt(2))/BigInt(4);function p(e){return fi(s(e),o)}function f(e,t){const n=function(e){const t=gi("u coordinate",e,o);return 32===a&&(t[31]&=127),di(t)}(t),r=function(e){const t=gi("scalar",e),n=t.length;if(n!==o&&n!==a)throw new Error(`Expected ${o} or ${a} bytes, got ${n}`);return di(c(t))}(e),f=function(e,t){const n=h(e),r=h(t),o=n;let a,c=Zi,p=Ji,f=n,g=Zi,m=Ji;for(let e=BigInt(i-1);e>=Ji;e--){const t=r>>e&Zi;m^=t,a=u(m,c,f),c=a[0],f=a[1],a=u(m,p,g),p=a[0],g=a[1],m=t;const n=c+p,i=s(n*n),l=c-p,h=s(l*l),y=i-h,w=f+g,b=s((f-g)*n),v=s(w*l),E=b+v,S=b-v;f=s(E*E),g=s(o*s(S*S)),c=s(i*h),p=s(y*(i+s(d*y)))}a=u(m,c,f),c=a[0],f=a[1],a=u(m,p,g),p=a[0],g=a[1];const y=l(p);return s(c*y)}(n,r);if(f===Ji)throw new Error("Invalid private or public key received");return p(f)}const g=p(t.Gu);function m(e){return f(e,g)}return{scalarMult:f,scalarMultBase:m,getSharedSecret:(e,t)=>f(e,t),getPublicKey:e=>m(e),utils:{randomPrivateKey:()=>t.randomBytes(t.nByteLength)},GuBytes:g}}
|
|
14
|
+
/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */const eo=BigInt("57896044618658097711785492504343953926634992332820282019728792003956564819949"),to=BigInt("19681161376707505956807079304988542015446066515923890162744021073123829784752");BigInt(0);const no=BigInt(1),ro=BigInt(2),so=BigInt(5),io=BigInt(10),oo=BigInt(20),ao=BigInt(40),co=BigInt(80);function lo(e){const t=eo,n=e*e%t*e%t,r=Ni(n,ro,t)*n%t,s=Ni(r,no,t)*e%t,i=Ni(s,so,t)*s%t,o=Ni(i,io,t)*i%t,a=Ni(o,oo,t)*o%t,c=Ni(a,ao,t)*a%t,l=Ni(c,co,t)*c%t,u=Ni(l,co,t)*c%t,h=Ni(u,io,t)*i%t;return{pow_p_5_8:Ni(h,ro,t)*e%t,b2:n}}function uo(e){return e[0]&=248,e[31]&=127,e[31]|=64,e}const ho=Ui(eo,void 0,!0),po={a:BigInt(-1),d:BigInt("37095705934669439343138083508754565189542113879843219016388785533085940283555"),Fp:ho,n:BigInt("7237005577332262213973186563042994240857116359379907606001950938285454250989"),h:BigInt(8),Gx:BigInt("15112221349535400772501151409588531511454012693041857206046113283949847762202"),Gy:BigInt("46316835694926478169428394003475163141307993866256225615783033603165251855960"),hash:Zs,randomBytes:Vs,adjustScalarBytes:uo,uvRatio:function(e,t){const n=eo,r=Ci(t*t*t,n),s=Ci(r*r*t,n);let i=Ci(e*r*lo(e*s).pow_p_5_8,n);const o=Ci(t*i*i,n),a=i,c=Ci(i*to,n),l=o===e,u=o===Ci(-e,n),h=o===Ci(-e*to,n);return l&&(i=a),(u||h)&&(i=c),(Ci(i,n)&Ri)===Ri&&(i=Ci(-i,n)),{isValid:l||u,value:i}}},fo=Qi(po);const go=(()=>Xi({P:eo,a:BigInt(486662),montgomeryBits:255,nByteLength:32,Gu:BigInt(9),powPminus2:e=>{const t=eo,{pow_p_5_8:n,b2:r}=lo(e);return Ci(Ni(n,BigInt(3),t)*r,t)},adjustScalarBytes:uo,randomBytes:Vs}))(),mo=(ho.ORDER+BigInt(3))/BigInt(8);ho.pow(ro,mo),ho.sqrt(ho.neg(ho.ONE)),ho.ORDER,BigInt(5),BigInt(8),BigInt(486662),function(e,t){if(!e.isOdd)throw new Error("Field doesn't have isOdd");const n=e.sqrt(t);e.isOdd(n)&&e.neg(n)}(ho,ho.neg(BigInt(486664))),BigInt("25063068953384623474111414158702152701244531502492656460079210482610430750235"),BigInt("54469307008909316920995813868745141605393597292927456921205312896311721017578"),BigInt("1159843021668779879193775521855586647937357759715417654439879720876111806838"),BigInt("40440834346308536858101042469323190826248399146238708352240133220865137265952"),BigInt("0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff");const yo=64,wo=32;function bo(e,t){const n=new Uint8Array(yo);for(let r=0;r<wo;r++)n[r]=e[r],n[wo+r]=t[r];return n}var vo={get(e=globalThis){const t=e.crypto;if(null==t||null==t.subtle)throw Object.assign(new Error("Missing Web Crypto API. The most likely cause of this error is that this page is being accessed from an insecure context (i.e. not HTTPS). For more information and possible resolutions see https://github.com/libp2p/js-libp2p/blob/main/packages/crypto/README.md#web-crypto-api"),{code:"ERR_MISSING_WEB_CRYPTO"});return t}};const Eo={alg:"A128GCM",ext:!0,k:"scm9jmO_4BJAgdwWGVulLg",key_ops:["encrypt","decrypt"],kty:"oct"};async function So(e,t){const n=function(e){const t="AES-GCM";let n=16;const r="SHA-256",s=32767,i=vo.get();return n*=8,{encrypt:async function(e,o){const a=i.getRandomValues(new Uint8Array(16)),c=i.getRandomValues(new Uint8Array(12)),l={name:t,iv:c};let u;if("string"==typeof o&&(o=Tt(o)),0===o.length){u=await i.subtle.importKey("jwk",Eo,{name:"AES-GCM"},!0,["encrypt"]);try{const e={name:"PBKDF2",salt:a,iterations:s,hash:{name:r}},c=await i.subtle.importKey("raw",o,{name:"PBKDF2"},!1,["deriveKey"]);u=await i.subtle.deriveKey(e,c,{name:t,length:n},!0,["encrypt"])}catch{u=await i.subtle.importKey("jwk",Eo,{name:"AES-GCM"},!0,["encrypt"])}}else{const e={name:"PBKDF2",salt:a,iterations:s,hash:{name:r}},c=await i.subtle.importKey("raw",o,{name:"PBKDF2"},!1,["deriveKey"]);u=await i.subtle.deriveKey(e,c,{name:t,length:n},!0,["encrypt"])}const h=await i.subtle.encrypt(l,u,e);return _n([a,l.iv,new Uint8Array(h)])},decrypt:async function(e,o){const a=e.subarray(0,16),c=e.subarray(16,28),l=e.subarray(28),u={name:t,iv:c};let h;if("string"==typeof o&&(o=Tt(o)),0===o.length)try{const e={name:"PBKDF2",salt:a,iterations:s,hash:{name:r}},c=await i.subtle.importKey("raw",o,{name:"PBKDF2"},!1,["deriveKey"]);h=await i.subtle.deriveKey(e,c,{name:t,length:n},!0,["decrypt"])}catch{h=await i.subtle.importKey("jwk",Eo,{name:"AES-GCM"},!0,["decrypt"])}else{const e={name:"PBKDF2",salt:a,iterations:s,hash:{name:r}},c=await i.subtle.importKey("raw",o,{name:"PBKDF2"},!1,["deriveKey"]);h=await i.subtle.deriveKey(e,c,{name:t,length:n},!0,["decrypt"])}const d=await i.subtle.decrypt(u,h,l);return new Uint8Array(d)}}}(),r=await n.encrypt(e,t);return xe.encode(r)}var _o,Io,Ro,Ao;!function(e){e.RSA="RSA",e.Ed25519="Ed25519",e.Secp256k1="Secp256k1"}(_o||(_o={})),function(e){e[e.RSA=0]="RSA",e[e.Ed25519=1]="Ed25519",e[e.Secp256k1=2]="Secp256k1"}(Io||(Io={})),function(e){e.codec=()=>Ht(Io)}(_o||(_o={})),function(e){let t;e.codec=()=>(null==t&&(t=zt(((e,t,n={})=>{!1!==n.lengthDelimited&&t.fork(),null!=e.Type&&(t.uint32(8),_o.codec().encode(e.Type,t)),null!=e.Data&&(t.uint32(18),t.bytes(e.Data)),!1!==n.lengthDelimited&&t.ldelim()}),((e,t)=>{const n={},r=null==t?e.len:e.pos+t;for(;e.pos<r;){const t=e.uint32();switch(t>>>3){case 1:n.Type=_o.codec().decode(e);break;case 2:n.Data=e.bytes();break;default:e.skipType(7&t)}}return n}))),t),e.encode=t=>Kt(t,e.codec()),e.decode=t=>W(t,e.codec())}(Ro||(Ro={})),function(e){let t;e.codec=()=>(null==t&&(t=zt(((e,t,n={})=>{!1!==n.lengthDelimited&&t.fork(),null!=e.Type&&(t.uint32(8),_o.codec().encode(e.Type,t)),null!=e.Data&&(t.uint32(18),t.bytes(e.Data)),!1!==n.lengthDelimited&&t.ldelim()}),((e,t)=>{const n={},r=null==t?e.len:e.pos+t;for(;e.pos<r;){const t=e.uint32();switch(t>>>3){case 1:n.Type=_o.codec().decode(e);break;case 2:n.Data=e.bytes();break;default:e.skipType(7&t)}}return n}))),t),e.encode=t=>Kt(t,e.codec()),e.decode=t=>W(t,e.codec())}(Ao||(Ao={}));class To{_key;constructor(e){this._key=ko(e,32)}verify(e,t){return function(e,t,n){return fo.verify(t,n instanceof Uint8Array?n:n.subarray(),e)}(this._key,t,e)}marshal(){return this._key}get bytes(){return Ro.encode({Type:_o.Ed25519,Data:this.marshal()}).subarray()}equals(e){return Sn(this.bytes,e.bytes)}hash(){const e=pt.digest(this.bytes);return Is(e)?e.then((({bytes:e})=>e)):e.bytes}}class Do{_key;_publicKey;constructor(e,t){this._key=ko(e,yo),this._publicKey=ko(t,32)}sign(e){return function(e,t){const n=e.subarray(0,wo);return fo.sign(t instanceof Uint8Array?t:t.subarray(),n)}(this._key,e)}get public(){return new To(this._publicKey)}marshal(){return this._key}get bytes(){return Ao.encode({Type:_o.Ed25519,Data:this.marshal()}).subarray()}equals(e){return Sn(this.bytes,e.bytes)}async hash(){const e=pt.digest(this.bytes);let t;return Is(e)?({bytes:t}=await e):t=e.bytes,t}async id(){const e=ht.digest(this.public.bytes);return ke.encode(e.bytes).substring(1)}async export(e,t="libp2p-key"){if("libp2p-key"===t)return So(this.bytes,e);throw new dn(`export format '${t}' is not supported`,"ERR_INVALID_EXPORT_FORMAT")}}function ko(e,t){if((e=Uint8Array.from(e??[])).length!==t)throw new dn(`Key must be a Uint8Array of length ${t}, got ${e.length}`,"ERR_INVALID_KEY_TYPE");return e}var Po=Object.freeze({__proto__:null,Ed25519PrivateKey:Do,Ed25519PublicKey:To,generateKeyPair:async function(){const{privateKey:e,publicKey:t}=function(){const e=fo.utils.randomPrivateKey(),t=fo.getPublicKey(e);return{privateKey:bo(e,t),publicKey:t}}();return new Do(e,t)},generateKeyPairFromSeed:async function(e){const{privateKey:t,publicKey:n}=function(e){if(e.length!==wo)throw new TypeError('"seed" must be 32 bytes in length.');if(!(e instanceof Uint8Array))throw new TypeError('"seed" must be a node.js Buffer, or Uint8Array.');const t=e,n=fo.getPublicKey(t);return{privateKey:bo(t,n),publicKey:n}}(e);return new Do(t,n)},unmarshalEd25519PrivateKey:function(e){if(e.length>yo){const t=(e=ko(e,yo+32)).subarray(0,yo),n=e.subarray(yo,e.length);return new Do(t,n)}const t=(e=ko(e,yo)).subarray(0,yo),n=e.subarray(32);return new Do(t,n)},unmarshalEd25519PublicKey:function(e){return e=ko(e,32),new To(e)}});function Co(e){if(isNaN(e)||e<=0)throw new dn("random bytes length must be a Number bigger than 0","ERR_INVALID_LENGTH");return Vs(e)}class xo extends Bs{constructor(e,t){super(),this.finished=!1,this.destroyed=!1,Ts(e);const n=Os(t);if(this.iHash=e.create(),"function"!=typeof this.iHash.update)throw new Error("Expected instance of class which extends utils.Hash");this.blockLen=this.iHash.blockLen,this.outputLen=this.iHash.outputLen;const r=this.blockLen,s=new Uint8Array(r);s.set(n.length>r?e.create().update(n).digest():n);for(let e=0;e<s.length;e++)s[e]^=54;this.iHash.update(s),this.oHash=e.create();for(let e=0;e<s.length;e++)s[e]^=106;this.oHash.update(s),s.fill(0)}update(e){return Ds(this),this.iHash.update(e),this}digestInto(e){Ds(this),As(e,this.outputLen),this.finished=!0,this.iHash.digestInto(e),this.oHash.update(e),this.oHash.digestInto(e),this.destroy()}digest(){const e=new Uint8Array(this.oHash.outputLen);return this.digestInto(e),e}_cloneInto(e){e||(e=Object.create(Object.getPrototypeOf(this),{}));const{oHash:t,iHash:n,finished:r,destroyed:s,blockLen:i,outputLen:o}=this;return e.finished=r,e.destroyed=s,e.blockLen=i,e.outputLen=o,e.oHash=t._cloneInto(e.oHash),e.iHash=n._cloneInto(e.iHash),e}destroy(){this.destroyed=!0,this.oHash.destroy(),this.iHash.destroy()}}const No=(e,t,n)=>new xo(e,t).update(n).digest();function Mo(e,t,n,r){Ts(e);const s=function(e,t){if(void 0!==t&&"[object Object]"!==Us.call(t))throw new Error("Options should be object or undefined");return Object.assign(e,t)}({dkLen:32,asyncTick:10},r),{c:i,dkLen:o,asyncTick:a}=s;if(Rs(i),Rs(o),Rs(a),i<1)throw new Error("PBKDF2: iterations (c) should be >= 1");const c=Os(t),l=Os(n),u=new Uint8Array(o),h=No.create(e,c),d=h._cloneInto().update(l);return{c:i,dkLen:o,asyncTick:a,DK:u,PRF:h,PRFSalt:d}}No.create=(e,t)=>new xo(e,t);class Oo{static isArrayBuffer(e){return"[object ArrayBuffer]"===Object.prototype.toString.call(e)}static toArrayBuffer(e){return this.isArrayBuffer(e)?e:e.byteLength===e.buffer.byteLength||0===e.byteOffset&&e.byteLength===e.buffer.byteLength?e.buffer:this.toUint8Array(e.buffer).slice(e.byteOffset,e.byteOffset+e.byteLength).buffer}static toUint8Array(e){return this.toView(e,Uint8Array)}static toView(e,t){if(e.constructor===t)return e;if(this.isArrayBuffer(e))return new t(e);if(this.isArrayBufferView(e))return new t(e.buffer,e.byteOffset,e.byteLength);throw new TypeError("The provided value is not of type '(ArrayBuffer or ArrayBufferView)'")}static isBufferSource(e){return this.isArrayBufferView(e)||this.isArrayBuffer(e)}static isArrayBufferView(e){return ArrayBuffer.isView(e)||e&&this.isArrayBuffer(e.buffer)}static isEqual(e,t){const n=Oo.toUint8Array(e),r=Oo.toUint8Array(t);if(n.length!==r.byteLength)return!1;for(let e=0;e<n.length;e++)if(n[e]!==r[e])return!1;return!0}static concat(...e){let t;t=!Array.isArray(e[0])||e[1]instanceof Function?Array.isArray(e[0])&&e[1]instanceof Function?e[0]:e[e.length-1]instanceof Function?e.slice(0,e.length-1):e:e[0];let n=0;for(const e of t)n+=e.byteLength;const r=new Uint8Array(n);let s=0;for(const e of t){const t=this.toUint8Array(e);r.set(t,s),s+=t.length}return e[e.length-1]instanceof Function?this.toView(r,e[e.length-1]):r.buffer}}const Lo="string",Bo=/^[0-9a-f]+$/i,Uo=/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/,Fo=/^[a-zA-Z0-9-_]+$/;class Vo{static fromString(e){const t=unescape(encodeURIComponent(e)),n=new Uint8Array(t.length);for(let e=0;e<t.length;e++)n[e]=t.charCodeAt(e);return n.buffer}static toString(e){const t=Oo.toUint8Array(e);let n="";for(let e=0;e<t.length;e++)n+=String.fromCharCode(t[e]);return decodeURIComponent(escape(n))}}class Ko{static toString(e,t=!1){const n=Oo.toArrayBuffer(e),r=new DataView(n);let s="";for(let e=0;e<n.byteLength;e+=2){const n=r.getUint16(e,t);s+=String.fromCharCode(n)}return s}static fromString(e,t=!1){const n=new ArrayBuffer(2*e.length),r=new DataView(n);for(let n=0;n<e.length;n++)r.setUint16(2*n,e.charCodeAt(n),t);return n}}class $o{static isHex(e){return typeof e===Lo&&Bo.test(e)}static isBase64(e){return typeof e===Lo&&Uo.test(e)}static isBase64Url(e){return typeof e===Lo&&Fo.test(e)}static ToString(e,t="utf8"){const n=Oo.toUint8Array(e);switch(t.toLowerCase()){case"utf8":return this.ToUtf8String(n);case"binary":return this.ToBinary(n);case"hex":return this.ToHex(n);case"base64":return this.ToBase64(n);case"base64url":return this.ToBase64Url(n);case"utf16le":return Ko.toString(n,!0);case"utf16":case"utf16be":return Ko.toString(n);default:throw new Error(`Unknown type of encoding '${t}'`)}}static FromString(e,t="utf8"){if(!e)return new ArrayBuffer(0);switch(t.toLowerCase()){case"utf8":return this.FromUtf8String(e);case"binary":return this.FromBinary(e);case"hex":return this.FromHex(e);case"base64":return this.FromBase64(e);case"base64url":return this.FromBase64Url(e);case"utf16le":return Ko.fromString(e,!0);case"utf16":case"utf16be":return Ko.fromString(e);default:throw new Error(`Unknown type of encoding '${t}'`)}}static ToBase64(e){const t=Oo.toUint8Array(e);if("undefined"!=typeof btoa){const e=this.ToString(t,"binary");return btoa(e)}return Buffer.from(t).toString("base64")}static FromBase64(e){const t=this.formatString(e);if(!t)return new ArrayBuffer(0);if(!$o.isBase64(t))throw new TypeError("Argument 'base64Text' is not Base64 encoded");return"undefined"!=typeof atob?this.FromBinary(atob(t)):new Uint8Array(Buffer.from(t,"base64")).buffer}static FromBase64Url(e){const t=this.formatString(e);if(!t)return new ArrayBuffer(0);if(!$o.isBase64Url(t))throw new TypeError("Argument 'base64url' is not Base64Url encoded");return this.FromBase64(this.Base64Padding(t.replace(/\-/g,"+").replace(/\_/g,"/")))}static ToBase64Url(e){return this.ToBase64(e).replace(/\+/g,"-").replace(/\//g,"_").replace(/\=/g,"")}static FromUtf8String(e,t=$o.DEFAULT_UTF8_ENCODING){switch(t){case"ascii":return this.FromBinary(e);case"utf8":return Vo.fromString(e);case"utf16":case"utf16be":return Ko.fromString(e);case"utf16le":case"usc2":return Ko.fromString(e,!0);default:throw new Error(`Unknown type of encoding '${t}'`)}}static ToUtf8String(e,t=$o.DEFAULT_UTF8_ENCODING){switch(t){case"ascii":return this.ToBinary(e);case"utf8":return Vo.toString(e);case"utf16":case"utf16be":return Ko.toString(e);case"utf16le":case"usc2":return Ko.toString(e,!0);default:throw new Error(`Unknown type of encoding '${t}'`)}}static FromBinary(e){const t=e.length,n=new Uint8Array(t);for(let r=0;r<t;r++)n[r]=e.charCodeAt(r);return n.buffer}static ToBinary(e){const t=Oo.toUint8Array(e);let n="";for(let e=0;e<t.length;e++)n+=String.fromCharCode(t[e]);return n}static ToHex(e){const t=Oo.toUint8Array(e);let n="";const r=t.length;for(let e=0;e<r;e++){const r=t[e];r<16&&(n+="0"),n+=r.toString(16)}return n}static FromHex(e){let t=this.formatString(e);if(!t)return new ArrayBuffer(0);if(!$o.isHex(t))throw new TypeError("Argument 'hexString' is not HEX encoded");t.length%2&&(t=`0${t}`);const n=new Uint8Array(t.length/2);for(let e=0;e<t.length;e+=2){const r=t.slice(e,e+2);n[e/2]=parseInt(r,16)}return n.buffer}static ToUtf16String(e,t=!1){return Ko.toString(e,t)}static FromUtf16String(e,t=!1){return Ko.fromString(e,t)}static Base64Padding(e){const t=4-e.length%4;if(t<4)for(let n=0;n<t;n++)e+="=";return e}static formatString(e){return(null==e?void 0:e.replace(/[\n\r\t ]/g,""))||""}}$o.DEFAULT_UTF8_ENCODING="utf8";var qo=Oo,Ho=$o;
|
|
15
|
+
/*!
|
|
16
|
+
Copyright (c) Peculiar Ventures, LLC
|
|
17
|
+
*/
|
|
18
|
+
function zo(e,t){let n=0;if(1===e.length)return e[0];for(let r=e.length-1;r>=0;r--)n+=e[e.length-1-r]*Math.pow(2,t*r);return n}function Wo(e,t,n=-1){const r=n;let s=e,i=0,o=Math.pow(2,t);for(let n=1;n<8;n++){if(e<o){let e;if(r<0)e=new ArrayBuffer(n),i=n;else{if(r<n)return new ArrayBuffer(0);e=new ArrayBuffer(r),i=r}const o=new Uint8Array(e);for(let e=n-1;e>=0;e--){const n=Math.pow(2,e*t);o[i-e-1]=Math.floor(s/n),s-=o[i-e-1]*n}return e}o*=Math.pow(2,t)}return new ArrayBuffer(0)}function jo(...e){let t=0,n=0;for(const n of e)t+=n.length;const r=new ArrayBuffer(t),s=new Uint8Array(r);for(const t of e)s.set(t,n),n+=t.length;return s}function Go(){const e=new Uint8Array(this.valueHex);if(this.valueHex.byteLength>=2){const t=255===e[0]&&128&e[1],n=0===e[0]&&!(128&e[1]);(t||n)&&this.warnings.push("Needlessly long format")}const t=new ArrayBuffer(this.valueHex.byteLength),n=new Uint8Array(t);for(let e=0;e<this.valueHex.byteLength;e++)n[e]=0;n[0]=128&e[0];const r=zo(n,8),s=new ArrayBuffer(this.valueHex.byteLength),i=new Uint8Array(s);for(let t=0;t<this.valueHex.byteLength;t++)i[t]=e[t];i[0]&=127;return zo(i,8)-r}function Yo(e,t){const n=e.toString(10);if(t<n.length)return"";const r=t-n.length,s=new Array(r);for(let e=0;e<r;e++)s[e]="0";return s.join("").concat(n)}
|
|
19
|
+
/*!
|
|
20
|
+
* Copyright (c) 2014, GMO GlobalSign
|
|
21
|
+
* Copyright (c) 2015-2022, Peculiar Ventures
|
|
22
|
+
* All rights reserved.
|
|
23
|
+
*
|
|
24
|
+
* Author 2014-2019, Yury Strozhevsky
|
|
25
|
+
*
|
|
26
|
+
* Redistribution and use in source and binary forms, with or without modification,
|
|
27
|
+
* are permitted provided that the following conditions are met:
|
|
28
|
+
*
|
|
29
|
+
* * Redistributions of source code must retain the above copyright notice, this
|
|
30
|
+
* list of conditions and the following disclaimer.
|
|
31
|
+
*
|
|
32
|
+
* * Redistributions in binary form must reproduce the above copyright notice, this
|
|
33
|
+
* list of conditions and the following disclaimer in the documentation and/or
|
|
34
|
+
* other materials provided with the distribution.
|
|
35
|
+
*
|
|
36
|
+
* * Neither the name of the copyright holder nor the names of its
|
|
37
|
+
* contributors may be used to endorse or promote products derived from
|
|
38
|
+
* this software without specific prior written permission.
|
|
39
|
+
*
|
|
40
|
+
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
|
41
|
+
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
42
|
+
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
43
|
+
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
|
|
44
|
+
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
|
45
|
+
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
|
46
|
+
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
|
47
|
+
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
48
|
+
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
|
49
|
+
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
50
|
+
*
|
|
51
|
+
*/function Qo(){if("undefined"==typeof BigInt)throw new Error("BigInt is not defined. Your environment doesn't implement BigInt.")}function Jo(e){let t=0,n=0;for(let n=0;n<e.length;n++){t+=e[n].byteLength}const r=new Uint8Array(t);for(let t=0;t<e.length;t++){const s=e[t];r.set(new Uint8Array(s),n),n+=s.byteLength}return r.buffer}function Zo(e,t,n,r){return t instanceof Uint8Array?t.byteLength?n<0?(e.error="Wrong parameter: inputOffset less than zero",!1):r<0?(e.error="Wrong parameter: inputLength less than zero",!1):!(t.byteLength-n-r<0)||(e.error="End of input reached before message was fully decoded (inconsistent offset and length values)",!1):(e.error="Wrong parameter: inputBuffer has zero length",!1):(e.error="Wrong parameter: inputBuffer must be 'Uint8Array'",!1)}class Xo{constructor(){this.items=[]}write(e){this.items.push(e)}final(){return Jo(this.items)}}const ea=[new Uint8Array([1])],ta="0123456789",na="",ra=new ArrayBuffer(0),sa=new Uint8Array(0),ia="EndOfContent",oa="OCTET STRING",aa="BIT STRING";function ca(e){var t;return(t=class extends e{constructor(...e){var t;super(...e);const n=e[0]||{};this.isHexOnly=null!==(t=n.isHexOnly)&&void 0!==t&&t,this.valueHexView=n.valueHex?qo.toUint8Array(n.valueHex):sa}get valueHex(){return this.valueHexView.slice().buffer}set valueHex(e){this.valueHexView=new Uint8Array(e)}fromBER(e,t,n){const r=e instanceof ArrayBuffer?new Uint8Array(e):e;if(!Zo(this,r,t,n))return-1;const s=t+n;return this.valueHexView=r.subarray(t,s),this.valueHexView.length?(this.blockLength=n,s):(this.warnings.push("Zero buffer length"),t)}toBER(e=!1){return this.isHexOnly?e?new ArrayBuffer(this.valueHexView.byteLength):this.valueHexView.byteLength===this.valueHexView.buffer.byteLength?this.valueHexView.buffer:this.valueHexView.slice().buffer:(this.error="Flag 'isHexOnly' is not set, abort",ra)}toJSON(){return{...super.toJSON(),isHexOnly:this.isHexOnly,valueHex:Ho.ToHex(this.valueHexView)}}}).NAME="hexBlock",t}class la{constructor({blockLength:e=0,error:t="",warnings:n=[],valueBeforeDecode:r=sa}={}){this.blockLength=e,this.error=t,this.warnings=n,this.valueBeforeDecodeView=qo.toUint8Array(r)}static blockName(){return this.NAME}get valueBeforeDecode(){return this.valueBeforeDecodeView.slice().buffer}set valueBeforeDecode(e){this.valueBeforeDecodeView=new Uint8Array(e)}toJSON(){return{blockName:this.constructor.NAME,blockLength:this.blockLength,error:this.error,warnings:this.warnings,valueBeforeDecode:Ho.ToHex(this.valueBeforeDecodeView)}}}la.NAME="baseBlock";class ua extends la{fromBER(e,t,n){throw TypeError("User need to make a specific function in a class which extends 'ValueBlock'")}toBER(e,t){throw TypeError("User need to make a specific function in a class which extends 'ValueBlock'")}}ua.NAME="valueBlock";class ha extends(ca(la)){constructor({idBlock:e={}}={}){var t,n,r,s;super(),e?(this.isHexOnly=null!==(t=e.isHexOnly)&&void 0!==t&&t,this.valueHexView=e.valueHex?qo.toUint8Array(e.valueHex):sa,this.tagClass=null!==(n=e.tagClass)&&void 0!==n?n:-1,this.tagNumber=null!==(r=e.tagNumber)&&void 0!==r?r:-1,this.isConstructed=null!==(s=e.isConstructed)&&void 0!==s&&s):(this.tagClass=-1,this.tagNumber=-1,this.isConstructed=!1)}toBER(e=!1){let t=0;switch(this.tagClass){case 1:t|=0;break;case 2:t|=64;break;case 3:t|=128;break;case 4:t|=192;break;default:return this.error="Unknown tag class",ra}if(this.isConstructed&&(t|=32),this.tagNumber<31&&!this.isHexOnly){const n=new Uint8Array(1);if(!e){let e=this.tagNumber;e&=31,t|=e,n[0]=t}return n.buffer}if(!this.isHexOnly){const n=Wo(this.tagNumber,7),r=new Uint8Array(n),s=n.byteLength,i=new Uint8Array(s+1);if(i[0]=31|t,!e){for(let e=0;e<s-1;e++)i[e+1]=128|r[e];i[s]=r[s-1]}return i.buffer}const n=new Uint8Array(this.valueHexView.byteLength+1);if(n[0]=31|t,!e){const e=this.valueHexView;for(let t=0;t<e.length-1;t++)n[t+1]=128|e[t];n[this.valueHexView.byteLength]=e[e.length-1]}return n.buffer}fromBER(e,t,n){const r=qo.toUint8Array(e);if(!Zo(this,r,t,n))return-1;const s=r.subarray(t,t+n);if(0===s.length)return this.error="Zero buffer length",-1;switch(192&s[0]){case 0:this.tagClass=1;break;case 64:this.tagClass=2;break;case 128:this.tagClass=3;break;case 192:this.tagClass=4;break;default:return this.error="Unknown tag class",-1}this.isConstructed=!(32&~s[0]),this.isHexOnly=!1;const i=31&s[0];if(31!==i)this.tagNumber=i,this.blockLength=1;else{let e=1,t=this.valueHexView=new Uint8Array(255),n=255;for(;128&s[e];){if(t[e-1]=127&s[e],e++,e>=s.length)return this.error="End of input reached before message was fully decoded",-1;if(e===n){n+=255;const e=new Uint8Array(n);for(let n=0;n<t.length;n++)e[n]=t[n];t=this.valueHexView=new Uint8Array(n)}}this.blockLength=e+1,t[e-1]=127&s[e];const r=new Uint8Array(e);for(let n=0;n<e;n++)r[n]=t[n];t=this.valueHexView=new Uint8Array(e),t.set(r),this.blockLength<=9?this.tagNumber=zo(t,7):(this.isHexOnly=!0,this.warnings.push("Tag too long, represented as hex-coded"))}if(1===this.tagClass&&this.isConstructed)switch(this.tagNumber){case 1:case 2:case 5:case 6:case 9:case 13:case 14:case 23:case 24:case 31:case 32:case 33:case 34:return this.error="Constructed encoding used for primitive type",-1}return t+this.blockLength}toJSON(){return{...super.toJSON(),tagClass:this.tagClass,tagNumber:this.tagNumber,isConstructed:this.isConstructed}}}ha.NAME="identificationBlock";class da extends la{constructor({lenBlock:e={}}={}){var t,n,r;super(),this.isIndefiniteForm=null!==(t=e.isIndefiniteForm)&&void 0!==t&&t,this.longFormUsed=null!==(n=e.longFormUsed)&&void 0!==n&&n,this.length=null!==(r=e.length)&&void 0!==r?r:0}fromBER(e,t,n){const r=qo.toUint8Array(e);if(!Zo(this,r,t,n))return-1;const s=r.subarray(t,t+n);if(0===s.length)return this.error="Zero buffer length",-1;if(255===s[0])return this.error="Length block 0xFF is reserved by standard",-1;if(this.isIndefiniteForm=128===s[0],this.isIndefiniteForm)return this.blockLength=1,t+this.blockLength;if(this.longFormUsed=!!(128&s[0]),!1===this.longFormUsed)return this.length=s[0],this.blockLength=1,t+this.blockLength;const i=127&s[0];if(i>8)return this.error="Too big integer",-1;if(i+1>s.length)return this.error="End of input reached before message was fully decoded",-1;const o=t+1,a=r.subarray(o,o+i);return 0===a[i-1]&&this.warnings.push("Needlessly long encoded length"),this.length=zo(a,8),this.longFormUsed&&this.length<=127&&this.warnings.push("Unnecessary usage of long length form"),this.blockLength=i+1,t+this.blockLength}toBER(e=!1){let t,n;if(this.length>127&&(this.longFormUsed=!0),this.isIndefiniteForm)return t=new ArrayBuffer(1),!1===e&&(n=new Uint8Array(t),n[0]=128),t;if(this.longFormUsed){const r=Wo(this.length,8);if(r.byteLength>127)return this.error="Too big length",ra;if(t=new ArrayBuffer(r.byteLength+1),e)return t;const s=new Uint8Array(r);n=new Uint8Array(t),n[0]=128|r.byteLength;for(let e=0;e<r.byteLength;e++)n[e+1]=s[e];return t}return t=new ArrayBuffer(1),!1===e&&(n=new Uint8Array(t),n[0]=this.length),t}toJSON(){return{...super.toJSON(),isIndefiniteForm:this.isIndefiniteForm,longFormUsed:this.longFormUsed,length:this.length}}}da.NAME="lengthBlock";const pa={};class fa extends la{constructor({name:e="",optional:t=!1,primitiveSchema:n,...r}={},s){super(r),this.name=e,this.optional=t,n&&(this.primitiveSchema=n),this.idBlock=new ha(r),this.lenBlock=new da(r),this.valueBlock=s?new s(r):new ua(r)}fromBER(e,t,n){const r=this.valueBlock.fromBER(e,t,this.lenBlock.isIndefiniteForm?n:this.lenBlock.length);return-1===r?(this.error=this.valueBlock.error,r):(this.idBlock.error.length||(this.blockLength+=this.idBlock.blockLength),this.lenBlock.error.length||(this.blockLength+=this.lenBlock.blockLength),this.valueBlock.error.length||(this.blockLength+=this.valueBlock.blockLength),r)}toBER(e,t){const n=t||new Xo;t||ga(this);const r=this.idBlock.toBER(e);if(n.write(r),this.lenBlock.isIndefiniteForm)n.write(new Uint8Array([128]).buffer),this.valueBlock.toBER(e,n),n.write(new ArrayBuffer(2));else{const t=this.valueBlock.toBER(e);this.lenBlock.length=t.byteLength;const r=this.lenBlock.toBER(e);n.write(r),n.write(t)}return t?ra:n.final()}toJSON(){const e={...super.toJSON(),idBlock:this.idBlock.toJSON(),lenBlock:this.lenBlock.toJSON(),valueBlock:this.valueBlock.toJSON(),name:this.name,optional:this.optional};return this.primitiveSchema&&(e.primitiveSchema=this.primitiveSchema.toJSON()),e}toString(e="ascii"){return"ascii"===e?this.onAsciiEncoding():Ho.ToHex(this.toBER())}onAsciiEncoding(){return`${this.constructor.NAME} : ${Ho.ToHex(this.valueBlock.valueBeforeDecodeView)}`}isEqual(e){if(this===e)return!0;if(!(e instanceof this.constructor))return!1;return function(e,t){if(e.byteLength!==t.byteLength)return!1;const n=new Uint8Array(e),r=new Uint8Array(t);for(let e=0;e<n.length;e++)if(n[e]!==r[e])return!1;return!0}(this.toBER(),e.toBER())}}function ga(e){if(e instanceof pa.Constructed)for(const t of e.valueBlock.value)ga(t)&&(e.lenBlock.isIndefiniteForm=!0);return!!e.lenBlock.isIndefiniteForm}fa.NAME="BaseBlock";class ma extends fa{constructor({value:e="",...t}={},n){super(t,n),e&&this.fromString(e)}getValue(){return this.valueBlock.value}setValue(e){this.valueBlock.value=e}fromBER(e,t,n){const r=this.valueBlock.fromBER(e,t,this.lenBlock.isIndefiniteForm?n:this.lenBlock.length);return-1===r?(this.error=this.valueBlock.error,r):(this.fromBuffer(this.valueBlock.valueHexView),this.idBlock.error.length||(this.blockLength+=this.idBlock.blockLength),this.lenBlock.error.length||(this.blockLength+=this.lenBlock.blockLength),this.valueBlock.error.length||(this.blockLength+=this.valueBlock.blockLength),r)}onAsciiEncoding(){return`${this.constructor.NAME} : '${this.valueBlock.value}'`}}ma.NAME="BaseStringBlock";class ya extends(ca(ua)){constructor({isHexOnly:e=!0,...t}={}){super(t),this.isHexOnly=e}}var wa,ba,va,Ea,Sa;ya.NAME="PrimitiveValueBlock";class _a extends fa{constructor(e={}){super(e,ya),this.idBlock.isConstructed=!1}}function Ia(e,t=0,n=e.length){const r=t;let s=new fa({},ua);const i=new la;if(!Zo(i,e,t,n))return s.error=i.error,{offset:-1,result:s};if(!e.subarray(t,t+n).length)return s.error="Zero buffer length",{offset:-1,result:s};let o=s.idBlock.fromBER(e,t,n);if(s.idBlock.warnings.length&&s.warnings.concat(s.idBlock.warnings),-1===o)return s.error=s.idBlock.error,{offset:-1,result:s};if(t=o,n-=s.idBlock.blockLength,o=s.lenBlock.fromBER(e,t,n),s.lenBlock.warnings.length&&s.warnings.concat(s.lenBlock.warnings),-1===o)return s.error=s.lenBlock.error,{offset:-1,result:s};if(t=o,n-=s.lenBlock.blockLength,!s.idBlock.isConstructed&&s.lenBlock.isIndefiniteForm)return s.error="Indefinite length form used for primitive encoding form",{offset:-1,result:s};let a=fa;if(1===s.idBlock.tagClass){if(s.idBlock.tagNumber>=37&&!1===s.idBlock.isHexOnly)return s.error="UNIVERSAL 37 and upper tags are reserved by ASN.1 standard",{offset:-1,result:s};switch(s.idBlock.tagNumber){case 0:if(s.idBlock.isConstructed&&s.lenBlock.length>0)return s.error="Type [UNIVERSAL 0] is reserved",{offset:-1,result:s};a=pa.EndOfContent;break;case 1:a=pa.Boolean;break;case 2:a=pa.Integer;break;case 3:a=pa.BitString;break;case 4:a=pa.OctetString;break;case 5:a=pa.Null;break;case 6:a=pa.ObjectIdentifier;break;case 10:a=pa.Enumerated;break;case 12:a=pa.Utf8String;break;case 13:a=pa.RelativeObjectIdentifier;break;case 14:a=pa.TIME;break;case 15:return s.error="[UNIVERSAL 15] is reserved by ASN.1 standard",{offset:-1,result:s};case 16:a=pa.Sequence;break;case 17:a=pa.Set;break;case 18:a=pa.NumericString;break;case 19:a=pa.PrintableString;break;case 20:a=pa.TeletexString;break;case 21:a=pa.VideotexString;break;case 22:a=pa.IA5String;break;case 23:a=pa.UTCTime;break;case 24:a=pa.GeneralizedTime;break;case 25:a=pa.GraphicString;break;case 26:a=pa.VisibleString;break;case 27:a=pa.GeneralString;break;case 28:a=pa.UniversalString;break;case 29:a=pa.CharacterString;break;case 30:a=pa.BmpString;break;case 31:a=pa.DATE;break;case 32:a=pa.TimeOfDay;break;case 33:a=pa.DateTime;break;case 34:a=pa.Duration;break;default:{const e=s.idBlock.isConstructed?new pa.Constructed:new pa.Primitive;e.idBlock=s.idBlock,e.lenBlock=s.lenBlock,e.warnings=s.warnings,s=e}}}else a=s.idBlock.isConstructed?pa.Constructed:pa.Primitive;return s=function(e,t){if(e instanceof t)return e;const n=new t;return n.idBlock=e.idBlock,n.lenBlock=e.lenBlock,n.warnings=e.warnings,n.valueBeforeDecodeView=e.valueBeforeDecodeView,n}(s,a),o=s.fromBER(e,t,s.lenBlock.isIndefiniteForm?n:s.lenBlock.length),s.valueBeforeDecodeView=e.subarray(r,r+s.blockLength),{offset:o,result:s}}function Ra(e){if(!e.byteLength){const e=new fa({},ua);return e.error="Input buffer has zero length",{offset:-1,result:e}}return Ia(qo.toUint8Array(e).slice(),0,e.byteLength)}function Aa(e,t){return e?1:t}wa=_a,pa.Primitive=wa,_a.NAME="PRIMITIVE";class Ta extends ua{constructor({value:e=[],isIndefiniteForm:t=!1,...n}={}){super(n),this.value=e,this.isIndefiniteForm=t}fromBER(e,t,n){const r=qo.toUint8Array(e);if(!Zo(this,r,t,n))return-1;if(this.valueBeforeDecodeView=r.subarray(t,t+n),0===this.valueBeforeDecodeView.length)return this.warnings.push("Zero buffer length"),t;let s=t;for(;Aa(this.isIndefiniteForm,n)>0;){const e=Ia(r,s,n);if(-1===e.offset)return this.error=e.result.error,this.warnings.concat(e.result.warnings),-1;if(s=e.offset,this.blockLength+=e.result.blockLength,n-=e.result.blockLength,this.value.push(e.result),this.isIndefiniteForm&&e.result.constructor.NAME===ia)break}return this.isIndefiniteForm&&(this.value[this.value.length-1].constructor.NAME===ia?this.value.pop():this.warnings.push("No EndOfContent block encoded")),s}toBER(e,t){const n=t||new Xo;for(let t=0;t<this.value.length;t++)this.value[t].toBER(e,n);return t?ra:n.final()}toJSON(){const e={...super.toJSON(),isIndefiniteForm:this.isIndefiniteForm,value:[]};for(const t of this.value)e.value.push(t.toJSON());return e}}Ta.NAME="ConstructedValueBlock";class Da extends fa{constructor(e={}){super(e,Ta),this.idBlock.isConstructed=!0}fromBER(e,t,n){this.valueBlock.isIndefiniteForm=this.lenBlock.isIndefiniteForm;const r=this.valueBlock.fromBER(e,t,this.lenBlock.isIndefiniteForm?n:this.lenBlock.length);return-1===r?(this.error=this.valueBlock.error,r):(this.idBlock.error.length||(this.blockLength+=this.idBlock.blockLength),this.lenBlock.error.length||(this.blockLength+=this.lenBlock.blockLength),this.valueBlock.error.length||(this.blockLength+=this.valueBlock.blockLength),r)}onAsciiEncoding(){const e=[];for(const t of this.valueBlock.value)e.push(t.toString("ascii").split("\n").map((e=>` ${e}`)).join("\n"));const t=3===this.idBlock.tagClass?`[${this.idBlock.tagNumber}]`:this.constructor.NAME;return e.length?`${t} :\n${e.join("\n")}`:`${t} :`}}ba=Da,pa.Constructed=ba,Da.NAME="CONSTRUCTED";class ka extends ua{fromBER(e,t,n){return t}toBER(e){return ra}}ka.override="EndOfContentValueBlock";class Pa extends fa{constructor(e={}){super(e,ka),this.idBlock.tagClass=1,this.idBlock.tagNumber=0}}va=Pa,pa.EndOfContent=va,Pa.NAME=ia;class Ca extends fa{constructor(e={}){super(e,ua),this.idBlock.tagClass=1,this.idBlock.tagNumber=5}fromBER(e,t,n){return this.lenBlock.length>0&&this.warnings.push("Non-zero length of value block for Null type"),this.idBlock.error.length||(this.blockLength+=this.idBlock.blockLength),this.lenBlock.error.length||(this.blockLength+=this.lenBlock.blockLength),this.blockLength+=n,t+n>e.byteLength?(this.error="End of input reached before message was fully decoded (inconsistent offset and length values)",-1):t+n}toBER(e,t){const n=new ArrayBuffer(2);if(!e){const e=new Uint8Array(n);e[0]=5,e[1]=0}return t&&t.write(n),n}onAsciiEncoding(){return`${this.constructor.NAME}`}}Ea=Ca,pa.Null=Ea,Ca.NAME="NULL";class xa extends(ca(ua)){constructor({value:e,...t}={}){super(t),t.valueHex?this.valueHexView=qo.toUint8Array(t.valueHex):this.valueHexView=new Uint8Array(1),e&&(this.value=e)}get value(){for(const e of this.valueHexView)if(e>0)return!0;return!1}set value(e){this.valueHexView[0]=e?255:0}fromBER(e,t,n){const r=qo.toUint8Array(e);return Zo(this,r,t,n)?(this.valueHexView=r.subarray(t,t+n),n>1&&this.warnings.push("Boolean value encoded in more then 1 octet"),this.isHexOnly=!0,Go.call(this),this.blockLength=n,t+n):-1}toBER(){return this.valueHexView.slice()}toJSON(){return{...super.toJSON(),value:this.value}}}xa.NAME="BooleanValueBlock";let Na=class extends fa{constructor(e={}){super(e,xa),this.idBlock.tagClass=1,this.idBlock.tagNumber=1}getValue(){return this.valueBlock.value}setValue(e){this.valueBlock.value=e}onAsciiEncoding(){return`${this.constructor.NAME} : ${this.getValue}`}};Sa=Na,pa.Boolean=Sa,Na.NAME="BOOLEAN";class Ma extends(ca(Ta)){constructor({isConstructed:e=!1,...t}={}){super(t),this.isConstructed=e}fromBER(e,t,n){let r=0;if(this.isConstructed){if(this.isHexOnly=!1,r=Ta.prototype.fromBER.call(this,e,t,n),-1===r)return r;for(let e=0;e<this.value.length;e++){const t=this.value[e].constructor.NAME;if(t===ia){if(this.isIndefiniteForm)break;return this.error="EndOfContent is unexpected, OCTET STRING may consists of OCTET STRINGs only",-1}if(t!==oa)return this.error="OCTET STRING may consists of OCTET STRINGs only",-1}}else this.isHexOnly=!0,r=super.fromBER(e,t,n),this.blockLength=n;return r}toBER(e,t){return this.isConstructed?Ta.prototype.toBER.call(this,e,t):e?new ArrayBuffer(this.valueHexView.byteLength):this.valueHexView.slice().buffer}toJSON(){return{...super.toJSON(),isConstructed:this.isConstructed}}}var Oa,La,Ba,Ua,Fa,Va,Ka,$a,qa;Ma.NAME="OctetStringValueBlock";class Ha extends fa{constructor({idBlock:e={},lenBlock:t={},...n}={}){var r,s;null!==(r=n.isConstructed)&&void 0!==r||(n.isConstructed=!!(null===(s=n.value)||void 0===s?void 0:s.length)),super({idBlock:{isConstructed:n.isConstructed,...e},lenBlock:{...t,isIndefiniteForm:!!n.isIndefiniteForm},...n},Ma),this.idBlock.tagClass=1,this.idBlock.tagNumber=4}fromBER(e,t,n){if(this.valueBlock.isConstructed=this.idBlock.isConstructed,this.valueBlock.isIndefiniteForm=this.lenBlock.isIndefiniteForm,0===n)return 0===this.idBlock.error.length&&(this.blockLength+=this.idBlock.blockLength),0===this.lenBlock.error.length&&(this.blockLength+=this.lenBlock.blockLength),t;if(!this.valueBlock.isConstructed){const r=(e instanceof ArrayBuffer?new Uint8Array(e):e).subarray(t,t+n);try{if(r.byteLength){const e=Ia(r,0,r.byteLength);-1!==e.offset&&e.offset===n&&(this.valueBlock.value=[e.result])}}catch(e){}}return super.fromBER(e,t,n)}onAsciiEncoding(){return this.valueBlock.isConstructed||this.valueBlock.value&&this.valueBlock.value.length?Da.prototype.onAsciiEncoding.call(this):`${this.constructor.NAME} : ${Ho.ToHex(this.valueBlock.valueHexView)}`}getValue(){if(!this.idBlock.isConstructed)return this.valueBlock.valueHexView.slice().buffer;const e=[];for(const t of this.valueBlock.value)t instanceof Ha&&e.push(t.valueBlock.valueHexView);return qo.concat(e)}}Oa=Ha,pa.OctetString=Oa,Ha.NAME=oa;class za extends(ca(Ta)){constructor({unusedBits:e=0,isConstructed:t=!1,...n}={}){super(n),this.unusedBits=e,this.isConstructed=t,this.blockLength=this.valueHexView.byteLength}fromBER(e,t,n){if(!n)return t;let r=-1;if(this.isConstructed){if(r=Ta.prototype.fromBER.call(this,e,t,n),-1===r)return r;for(const e of this.value){const t=e.constructor.NAME;if(t===ia){if(this.isIndefiniteForm)break;return this.error="EndOfContent is unexpected, BIT STRING may consists of BIT STRINGs only",-1}if(t!==aa)return this.error="BIT STRING may consists of BIT STRINGs only",-1;const n=e.valueBlock;if(this.unusedBits>0&&n.unusedBits>0)return this.error='Using of "unused bits" inside constructive BIT STRING allowed for least one only',-1;this.unusedBits=n.unusedBits}return r}const s=qo.toUint8Array(e);if(!Zo(this,s,t,n))return-1;const i=s.subarray(t,t+n);if(this.unusedBits=i[0],this.unusedBits>7)return this.error="Unused bits for BitString must be in range 0-7",-1;if(!this.unusedBits){const e=i.subarray(1);try{if(e.byteLength){const t=Ia(e,0,e.byteLength);-1!==t.offset&&t.offset===n-1&&(this.value=[t.result])}}catch(e){}}return this.valueHexView=i.subarray(1),this.blockLength=i.length,t+n}toBER(e,t){if(this.isConstructed)return Ta.prototype.toBER.call(this,e,t);if(e)return new ArrayBuffer(this.valueHexView.byteLength+1);if(!this.valueHexView.byteLength)return ra;const n=new Uint8Array(this.valueHexView.length+1);return n[0]=this.unusedBits,n.set(this.valueHexView,1),n.buffer}toJSON(){return{...super.toJSON(),unusedBits:this.unusedBits,isConstructed:this.isConstructed}}}za.NAME="BitStringValueBlock";class Wa extends fa{constructor({idBlock:e={},lenBlock:t={},...n}={}){var r,s;null!==(r=n.isConstructed)&&void 0!==r||(n.isConstructed=!!(null===(s=n.value)||void 0===s?void 0:s.length)),super({idBlock:{isConstructed:n.isConstructed,...e},lenBlock:{...t,isIndefiniteForm:!!n.isIndefiniteForm},...n},za),this.idBlock.tagClass=1,this.idBlock.tagNumber=3}fromBER(e,t,n){return this.valueBlock.isConstructed=this.idBlock.isConstructed,this.valueBlock.isIndefiniteForm=this.lenBlock.isIndefiniteForm,super.fromBER(e,t,n)}onAsciiEncoding(){if(this.valueBlock.isConstructed||this.valueBlock.value&&this.valueBlock.value.length)return Da.prototype.onAsciiEncoding.call(this);{const e=[],t=this.valueBlock.valueHexView;for(const n of t)e.push(n.toString(2).padStart(8,"0"));const n=e.join("");return`${this.constructor.NAME} : ${n.substring(0,n.length-this.valueBlock.unusedBits)}`}}}function ja(e,t){const n=new Uint8Array([0]),r=new Uint8Array(e),s=new Uint8Array(t);let i=r.slice(0);const o=i.length-1,a=s.slice(0),c=a.length-1;let l=0;let u=0;for(let e=c<o?o:c;e>=0;e--,u++){if(!0==u<a.length)l=i[o-u]+a[c-u]+n[0];else l=i[o-u]+n[0];if(n[0]=l/10,!0==u>=i.length)i=jo(new Uint8Array([l%10]),i);else i[o-u]=l%10}return n[0]>0&&(i=jo(n,i)),i}function Ga(e){if(e>=ea.length)for(let t=ea.length;t<=e;t++){const e=new Uint8Array([0]);let n=ea[t-1].slice(0);for(let t=n.length-1;t>=0;t--){const r=new Uint8Array([(n[t]<<1)+e[0]]);e[0]=r[0]/10,n[t]=r[0]%10}e[0]>0&&(n=jo(e,n)),ea.push(n)}return ea[e]}function Ya(e,t){let n=0;const r=new Uint8Array(e),s=new Uint8Array(t),i=r.slice(0),o=i.length-1,a=s.slice(0),c=a.length-1;let l,u=0;for(let e=c;e>=0;e--,u++)if(l=i[o-u]-a[c-u]-n,!0==l<0)n=1,i[o-u]=l+10;else n=0,i[o-u]=l;if(n>0)for(let e=o-c+1;e>=0;e--,u++){if(l=i[o-u]-n,!(l<0)){n=0,i[o-u]=l;break}n=1,i[o-u]=l+10}return i.slice()}La=Wa,pa.BitString=La,Wa.NAME=aa;class Qa extends(ca(ua)){constructor({value:e,...t}={}){super(t),this._valueDec=0,t.valueHex&&this.setValueHex(),void 0!==e&&(this.valueDec=e)}setValueHex(){this.valueHexView.length>=4?(this.warnings.push("Too big Integer for decoding, hex only"),this.isHexOnly=!0,this._valueDec=0):(this.isHexOnly=!1,this.valueHexView.length>0&&(this._valueDec=Go.call(this)))}set valueDec(e){this._valueDec=e,this.isHexOnly=!1,this.valueHexView=new Uint8Array(function(e){const t=e<0?-1*e:e;let n=128;for(let r=1;r<8;r++){if(t<=n){if(e<0){const e=Wo(n-t,8,r);return new Uint8Array(e)[0]|=128,e}let s=Wo(t,8,r),i=new Uint8Array(s);if(128&i[0]){const e=s.slice(0),t=new Uint8Array(e);s=new ArrayBuffer(s.byteLength+1),i=new Uint8Array(s);for(let n=0;n<e.byteLength;n++)i[n+1]=t[n];i[0]=0}return s}n*=Math.pow(2,8)}return new ArrayBuffer(0)}(e))}get valueDec(){return this._valueDec}fromDER(e,t,n,r=0){const s=this.fromBER(e,t,n);if(-1===s)return s;const i=this.valueHexView;return 0===i[0]&&128&i[1]?this.valueHexView=i.subarray(1):0!==r&&i.length<r&&(r-i.length>1&&(r=i.length+1),this.valueHexView=i.subarray(r-i.length)),s}toDER(e=!1){const t=this.valueHexView;switch(!0){case!!(128&t[0]):{const e=new Uint8Array(this.valueHexView.length+1);e[0]=0,e.set(t,1),this.valueHexView=e}break;case 0===t[0]&&!(128&t[1]):this.valueHexView=this.valueHexView.subarray(1)}return this.toBER(e)}fromBER(e,t,n){const r=super.fromBER(e,t,n);return-1===r||this.setValueHex(),r}toBER(e){return e?new ArrayBuffer(this.valueHexView.length):this.valueHexView.slice().buffer}toJSON(){return{...super.toJSON(),valueDec:this.valueDec}}toString(){const e=8*this.valueHexView.length-1;let t,n=new Uint8Array(8*this.valueHexView.length/3),r=0;const s=this.valueHexView;let i="",o=!1;for(let o=s.byteLength-1;o>=0;o--){t=s[o];for(let s=0;s<8;s++){if(!(1&~t))if(r===e)n=Ya(Ga(r),n),i="-";else n=ja(n,Ga(r));r++,t>>=1}}for(let e=0;e<n.length;e++)n[e]&&(o=!0),o&&(i+=ta.charAt(n[e]));return!1===o&&(i+=ta.charAt(0)),i}}Ba=Qa,Qa.NAME="IntegerValueBlock",Object.defineProperty(Ba.prototype,"valueHex",{set:function(e){this.valueHexView=new Uint8Array(e),this.setValueHex()},get:function(){return this.valueHexView.slice().buffer}});class Ja extends fa{constructor(e={}){super(e,Qa),this.idBlock.tagClass=1,this.idBlock.tagNumber=2}toBigInt(){return Qo(),BigInt(this.valueBlock.toString())}static fromBigInt(e){Qo();const t=BigInt(e),n=new Xo,r=t.toString(16).replace(/^-/,""),s=new Uint8Array(Ho.FromHex(r));if(t<0){const e=new Uint8Array(s.length+(128&s[0]?1:0));e[0]|=128;const r=BigInt(`0x${Ho.ToHex(e)}`)+t,i=qo.toUint8Array(Ho.FromHex(r.toString(16)));i[0]|=128,n.write(i)}else 128&s[0]&&n.write(new Uint8Array([0])),n.write(s);return new Ja({valueHex:n.final()})}convertToDER(){const e=new Ja({valueHex:this.valueBlock.valueHexView});return e.valueBlock.toDER(),e}convertFromDER(){return new Ja({valueHex:0===this.valueBlock.valueHexView[0]?this.valueBlock.valueHexView.subarray(1):this.valueBlock.valueHexView})}onAsciiEncoding(){return`${this.constructor.NAME} : ${this.valueBlock.toString()}`}}Ua=Ja,pa.Integer=Ua,Ja.NAME="INTEGER";class Za extends Ja{constructor(e={}){super(e),this.idBlock.tagClass=1,this.idBlock.tagNumber=10}}Fa=Za,pa.Enumerated=Fa,Za.NAME="ENUMERATED";class Xa extends(ca(ua)){constructor({valueDec:e=-1,isFirstSid:t=!1,...n}={}){super(n),this.valueDec=e,this.isFirstSid=t}fromBER(e,t,n){if(!n)return t;const r=qo.toUint8Array(e);if(!Zo(this,r,t,n))return-1;const s=r.subarray(t,t+n);this.valueHexView=new Uint8Array(n);for(let e=0;e<n&&(this.valueHexView[e]=127&s[e],this.blockLength++,128&s[e]);e++);const i=new Uint8Array(this.blockLength);for(let e=0;e<this.blockLength;e++)i[e]=this.valueHexView[e];return this.valueHexView=i,128&s[this.blockLength-1]?(this.error="End of input reached before message was fully decoded",-1):(0===this.valueHexView[0]&&this.warnings.push("Needlessly long format of SID encoding"),this.blockLength<=8?this.valueDec=zo(this.valueHexView,7):(this.isHexOnly=!0,this.warnings.push("Too big SID for decoding, hex only")),t+this.blockLength)}set valueBigInt(e){Qo();let t=BigInt(e).toString(2);for(;t.length%7;)t="0"+t;const n=new Uint8Array(t.length/7);for(let e=0;e<n.length;e++)n[e]=parseInt(t.slice(7*e,7*e+7),2)+(e+1<n.length?128:0);this.fromBER(n.buffer,0,n.length)}toBER(e){if(this.isHexOnly){if(e)return new ArrayBuffer(this.valueHexView.byteLength);const t=this.valueHexView,n=new Uint8Array(this.blockLength);for(let e=0;e<this.blockLength-1;e++)n[e]=128|t[e];return n[this.blockLength-1]=t[this.blockLength-1],n.buffer}const t=Wo(this.valueDec,7);if(0===t.byteLength)return this.error="Error during encoding SID value",ra;const n=new Uint8Array(t.byteLength);if(!e){const e=new Uint8Array(t),r=t.byteLength-1;for(let t=0;t<r;t++)n[t]=128|e[t];n[r]=e[r]}return n}toString(){let e="";if(this.isHexOnly)e=Ho.ToHex(this.valueHexView);else if(this.isFirstSid){let t=this.valueDec;this.valueDec<=39?e="0.":this.valueDec<=79?(e="1.",t-=40):(e="2.",t-=80),e+=t.toString()}else e=this.valueDec.toString();return e}toJSON(){return{...super.toJSON(),valueDec:this.valueDec,isFirstSid:this.isFirstSid}}}Xa.NAME="sidBlock";class ec extends ua{constructor({value:e="",...t}={}){super(t),this.value=[],e&&this.fromString(e)}fromBER(e,t,n){let r=t;for(;n>0;){const t=new Xa;if(r=t.fromBER(e,r,n),-1===r)return this.blockLength=0,this.error=t.error,r;0===this.value.length&&(t.isFirstSid=!0),this.blockLength+=t.blockLength,n-=t.blockLength,this.value.push(t)}return r}toBER(e){const t=[];for(let n=0;n<this.value.length;n++){const r=this.value[n].toBER(e);if(0===r.byteLength)return this.error=this.value[n].error,ra;t.push(r)}return Jo(t)}fromString(e){this.value=[];let t=0,n=0,r="",s=!1;do{if(n=e.indexOf(".",t),r=-1===n?e.substring(t):e.substring(t,n),t=n+1,s){const e=this.value[0];let t=0;switch(e.valueDec){case 0:break;case 1:t=40;break;case 2:t=80;break;default:return void(this.value=[])}const n=parseInt(r,10);if(isNaN(n))return;e.valueDec=n+t,s=!1}else{const e=new Xa;if(r>Number.MAX_SAFE_INTEGER){Qo();const t=BigInt(r);e.valueBigInt=t}else if(e.valueDec=parseInt(r,10),isNaN(e.valueDec))return;this.value.length||(e.isFirstSid=!0,s=!0),this.value.push(e)}}while(-1!==n)}toString(){let e="",t=!1;for(let n=0;n<this.value.length;n++){t=this.value[n].isHexOnly;let r=this.value[n].toString();0!==n&&(e=`${e}.`),t?(r=`{${r}}`,this.value[n].isFirstSid?e=`2.{${r} - 80}`:e+=r):e+=r}return e}toJSON(){const e={...super.toJSON(),value:this.toString(),sidArray:[]};for(let t=0;t<this.value.length;t++)e.sidArray.push(this.value[t].toJSON());return e}}ec.NAME="ObjectIdentifierValueBlock";class tc extends fa{constructor(e={}){super(e,ec),this.idBlock.tagClass=1,this.idBlock.tagNumber=6}getValue(){return this.valueBlock.toString()}setValue(e){this.valueBlock.fromString(e)}onAsciiEncoding(){return`${this.constructor.NAME} : ${this.valueBlock.toString()||"empty"}`}toJSON(){return{...super.toJSON(),value:this.getValue()}}}Va=tc,pa.ObjectIdentifier=Va,tc.NAME="OBJECT IDENTIFIER";class nc extends(ca(la)){constructor({valueDec:e=0,...t}={}){super(t),this.valueDec=e}fromBER(e,t,n){if(0===n)return t;const r=qo.toUint8Array(e);if(!Zo(this,r,t,n))return-1;const s=r.subarray(t,t+n);this.valueHexView=new Uint8Array(n);for(let e=0;e<n&&(this.valueHexView[e]=127&s[e],this.blockLength++,128&s[e]);e++);const i=new Uint8Array(this.blockLength);for(let e=0;e<this.blockLength;e++)i[e]=this.valueHexView[e];return this.valueHexView=i,128&s[this.blockLength-1]?(this.error="End of input reached before message was fully decoded",-1):(0===this.valueHexView[0]&&this.warnings.push("Needlessly long format of SID encoding"),this.blockLength<=8?this.valueDec=zo(this.valueHexView,7):(this.isHexOnly=!0,this.warnings.push("Too big SID for decoding, hex only")),t+this.blockLength)}toBER(e){if(this.isHexOnly){if(e)return new ArrayBuffer(this.valueHexView.byteLength);const t=this.valueHexView,n=new Uint8Array(this.blockLength);for(let e=0;e<this.blockLength-1;e++)n[e]=128|t[e];return n[this.blockLength-1]=t[this.blockLength-1],n.buffer}const t=Wo(this.valueDec,7);if(0===t.byteLength)return this.error="Error during encoding SID value",ra;const n=new Uint8Array(t.byteLength);if(!e){const e=new Uint8Array(t),r=t.byteLength-1;for(let t=0;t<r;t++)n[t]=128|e[t];n[r]=e[r]}return n.buffer}toString(){let e="";return e=this.isHexOnly?Ho.ToHex(this.valueHexView):this.valueDec.toString(),e}toJSON(){return{...super.toJSON(),valueDec:this.valueDec}}}nc.NAME="relativeSidBlock";class rc extends ua{constructor({value:e="",...t}={}){super(t),this.value=[],e&&this.fromString(e)}fromBER(e,t,n){let r=t;for(;n>0;){const t=new nc;if(r=t.fromBER(e,r,n),-1===r)return this.blockLength=0,this.error=t.error,r;this.blockLength+=t.blockLength,n-=t.blockLength,this.value.push(t)}return r}toBER(e,t){const n=[];for(let t=0;t<this.value.length;t++){const r=this.value[t].toBER(e);if(0===r.byteLength)return this.error=this.value[t].error,ra;n.push(r)}return Jo(n)}fromString(e){this.value=[];let t=0,n=0,r="";do{n=e.indexOf(".",t),r=-1===n?e.substring(t):e.substring(t,n),t=n+1;const s=new nc;if(s.valueDec=parseInt(r,10),isNaN(s.valueDec))return!0;this.value.push(s)}while(-1!==n);return!0}toString(){let e="",t=!1;for(let n=0;n<this.value.length;n++){t=this.value[n].isHexOnly;let r=this.value[n].toString();0!==n&&(e=`${e}.`),t?(r=`{${r}}`,e+=r):e+=r}return e}toJSON(){const e={...super.toJSON(),value:this.toString(),sidArray:[]};for(let t=0;t<this.value.length;t++)e.sidArray.push(this.value[t].toJSON());return e}}rc.NAME="RelativeObjectIdentifierValueBlock";class sc extends fa{constructor(e={}){super(e,rc),this.idBlock.tagClass=1,this.idBlock.tagNumber=13}getValue(){return this.valueBlock.toString()}setValue(e){this.valueBlock.fromString(e)}onAsciiEncoding(){return`${this.constructor.NAME} : ${this.valueBlock.toString()||"empty"}`}toJSON(){return{...super.toJSON(),value:this.getValue()}}}Ka=sc,pa.RelativeObjectIdentifier=Ka,sc.NAME="RelativeObjectIdentifier";class ic extends Da{constructor(e={}){super(e),this.idBlock.tagClass=1,this.idBlock.tagNumber=16}}$a=ic,pa.Sequence=$a,ic.NAME="SEQUENCE";let oc=class extends Da{constructor(e={}){super(e),this.idBlock.tagClass=1,this.idBlock.tagNumber=17}};qa=oc,pa.Set=qa,oc.NAME="SET";class ac extends(ca(ua)){constructor({...e}={}){super(e),this.isHexOnly=!0,this.value=na}toJSON(){return{...super.toJSON(),value:this.value}}}ac.NAME="StringValueBlock";class cc extends ac{}cc.NAME="SimpleStringValueBlock";class lc extends ma{constructor({...e}={}){super(e,cc)}fromBuffer(e){this.valueBlock.value=String.fromCharCode.apply(null,qo.toUint8Array(e))}fromString(e){const t=e.length,n=this.valueBlock.valueHexView=new Uint8Array(t);for(let r=0;r<t;r++)n[r]=e.charCodeAt(r);this.valueBlock.value=e}}lc.NAME="SIMPLE STRING";class uc extends lc{fromBuffer(e){this.valueBlock.valueHexView=qo.toUint8Array(e);try{this.valueBlock.value=Ho.ToUtf8String(e)}catch(t){this.warnings.push(`Error during "decodeURIComponent": ${t}, using raw string`),this.valueBlock.value=Ho.ToBinary(e)}}fromString(e){this.valueBlock.valueHexView=new Uint8Array(Ho.FromUtf8String(e)),this.valueBlock.value=e}}var hc,dc,pc,fc,gc,mc,yc,wc,bc,vc,Ec,Sc,_c,Ic,Rc,Ac,Tc,Dc,kc;uc.NAME="Utf8StringValueBlock";class Pc extends uc{constructor(e={}){super(e),this.idBlock.tagClass=1,this.idBlock.tagNumber=12}}hc=Pc,pa.Utf8String=hc,Pc.NAME="UTF8String";class Cc extends lc{fromBuffer(e){this.valueBlock.value=Ho.ToUtf16String(e),this.valueBlock.valueHexView=qo.toUint8Array(e)}fromString(e){this.valueBlock.value=e,this.valueBlock.valueHexView=new Uint8Array(Ho.FromUtf16String(e))}}Cc.NAME="BmpStringValueBlock";class xc extends Cc{constructor({...e}={}){super(e),this.idBlock.tagClass=1,this.idBlock.tagNumber=30}}dc=xc,pa.BmpString=dc,xc.NAME="BMPString";class Nc extends lc{fromBuffer(e){const t=ArrayBuffer.isView(e)?e.slice().buffer:e.slice(0),n=new Uint8Array(t);for(let e=0;e<n.length;e+=4)n[e]=n[e+3],n[e+1]=n[e+2],n[e+2]=0,n[e+3]=0;this.valueBlock.value=String.fromCharCode.apply(null,new Uint32Array(t))}fromString(e){const t=e.length,n=this.valueBlock.valueHexView=new Uint8Array(4*t);for(let r=0;r<t;r++){const t=Wo(e.charCodeAt(r),8),s=new Uint8Array(t);if(s.length>4)continue;const i=4-s.length;for(let e=s.length-1;e>=0;e--)n[4*r+e+i]=s[e]}this.valueBlock.value=e}}Nc.NAME="UniversalStringValueBlock";class Mc extends Nc{constructor({...e}={}){super(e),this.idBlock.tagClass=1,this.idBlock.tagNumber=28}}pc=Mc,pa.UniversalString=pc,Mc.NAME="UniversalString";class Oc extends lc{constructor(e={}){super(e),this.idBlock.tagClass=1,this.idBlock.tagNumber=18}}fc=Oc,pa.NumericString=fc,Oc.NAME="NumericString";class Lc extends lc{constructor(e={}){super(e),this.idBlock.tagClass=1,this.idBlock.tagNumber=19}}gc=Lc,pa.PrintableString=gc,Lc.NAME="PrintableString";class Bc extends lc{constructor(e={}){super(e),this.idBlock.tagClass=1,this.idBlock.tagNumber=20}}mc=Bc,pa.TeletexString=mc,Bc.NAME="TeletexString";class Uc extends lc{constructor(e={}){super(e),this.idBlock.tagClass=1,this.idBlock.tagNumber=21}}yc=Uc,pa.VideotexString=yc,Uc.NAME="VideotexString";class Fc extends lc{constructor(e={}){super(e),this.idBlock.tagClass=1,this.idBlock.tagNumber=22}}wc=Fc,pa.IA5String=wc,Fc.NAME="IA5String";class Vc extends lc{constructor(e={}){super(e),this.idBlock.tagClass=1,this.idBlock.tagNumber=25}}bc=Vc,pa.GraphicString=bc,Vc.NAME="GraphicString";class Kc extends lc{constructor(e={}){super(e),this.idBlock.tagClass=1,this.idBlock.tagNumber=26}}vc=Kc,pa.VisibleString=vc,Kc.NAME="VisibleString";class $c extends lc{constructor(e={}){super(e),this.idBlock.tagClass=1,this.idBlock.tagNumber=27}}Ec=$c,pa.GeneralString=Ec,$c.NAME="GeneralString";class qc extends lc{constructor(e={}){super(e),this.idBlock.tagClass=1,this.idBlock.tagNumber=29}}Sc=qc,pa.CharacterString=Sc,qc.NAME="CharacterString";class Hc extends Kc{constructor({value:e,valueDate:t,...n}={}){if(super(n),this.year=0,this.month=0,this.day=0,this.hour=0,this.minute=0,this.second=0,e){this.fromString(e),this.valueBlock.valueHexView=new Uint8Array(e.length);for(let t=0;t<e.length;t++)this.valueBlock.valueHexView[t]=e.charCodeAt(t)}t&&(this.fromDate(t),this.valueBlock.valueHexView=new Uint8Array(this.toBuffer())),this.idBlock.tagClass=1,this.idBlock.tagNumber=23}fromBuffer(e){this.fromString(String.fromCharCode.apply(null,qo.toUint8Array(e)))}toBuffer(){const e=this.toString(),t=new ArrayBuffer(e.length),n=new Uint8Array(t);for(let t=0;t<e.length;t++)n[t]=e.charCodeAt(t);return t}fromDate(e){this.year=e.getUTCFullYear(),this.month=e.getUTCMonth()+1,this.day=e.getUTCDate(),this.hour=e.getUTCHours(),this.minute=e.getUTCMinutes(),this.second=e.getUTCSeconds()}toDate(){return new Date(Date.UTC(this.year,this.month-1,this.day,this.hour,this.minute,this.second))}fromString(e){const t=/(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})Z/gi.exec(e);if(null===t)return void(this.error="Wrong input string for conversion");const n=parseInt(t[1],10);this.year=n>=50?1900+n:2e3+n,this.month=parseInt(t[2],10),this.day=parseInt(t[3],10),this.hour=parseInt(t[4],10),this.minute=parseInt(t[5],10),this.second=parseInt(t[6],10)}toString(e="iso"){if("iso"===e){const e=new Array(7);return e[0]=Yo(this.year<2e3?this.year-1900:this.year-2e3,2),e[1]=Yo(this.month,2),e[2]=Yo(this.day,2),e[3]=Yo(this.hour,2),e[4]=Yo(this.minute,2),e[5]=Yo(this.second,2),e[6]="Z",e.join("")}return super.toString(e)}onAsciiEncoding(){return`${this.constructor.NAME} : ${this.toDate().toISOString()}`}toJSON(){return{...super.toJSON(),year:this.year,month:this.month,day:this.day,hour:this.hour,minute:this.minute,second:this.second}}}_c=Hc,pa.UTCTime=_c,Hc.NAME="UTCTime";class zc extends Hc{constructor(e={}){var t;super(e),null!==(t=this.millisecond)&&void 0!==t||(this.millisecond=0),this.idBlock.tagClass=1,this.idBlock.tagNumber=24}fromDate(e){super.fromDate(e),this.millisecond=e.getUTCMilliseconds()}toDate(){return new Date(Date.UTC(this.year,this.month-1,this.day,this.hour,this.minute,this.second,this.millisecond))}fromString(e){let t,n=!1,r="",s="",i=0,o=0,a=0;if("Z"===e[e.length-1])r=e.substring(0,e.length-1),n=!0;else{const t=new Number(e[e.length-1]);if(isNaN(t.valueOf()))throw new Error("Wrong input string for conversion");r=e}if(n){if(-1!==r.indexOf("+"))throw new Error("Wrong input string for conversion");if(-1!==r.indexOf("-"))throw new Error("Wrong input string for conversion")}else{let e=1,t=r.indexOf("+"),n="";if(-1===t&&(t=r.indexOf("-"),e=-1),-1!==t){if(n=r.substring(t+1),r=r.substring(0,t),2!==n.length&&4!==n.length)throw new Error("Wrong input string for conversion");let s=parseInt(n.substring(0,2),10);if(isNaN(s.valueOf()))throw new Error("Wrong input string for conversion");if(o=e*s,4===n.length){if(s=parseInt(n.substring(2,4),10),isNaN(s.valueOf()))throw new Error("Wrong input string for conversion");a=e*s}}}let c=r.indexOf(".");if(-1===c&&(c=r.indexOf(",")),-1!==c){const e=new Number(`0${r.substring(c)}`);if(isNaN(e.valueOf()))throw new Error("Wrong input string for conversion");i=e.valueOf(),s=r.substring(0,c)}else s=r;switch(!0){case 8===s.length:if(t=/(\d{4})(\d{2})(\d{2})/gi,-1!==c)throw new Error("Wrong input string for conversion");break;case 10===s.length:if(t=/(\d{4})(\d{2})(\d{2})(\d{2})/gi,-1!==c){let e=60*i;this.minute=Math.floor(e),e=60*(e-this.minute),this.second=Math.floor(e),e=1e3*(e-this.second),this.millisecond=Math.floor(e)}break;case 12===s.length:if(t=/(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})/gi,-1!==c){let e=60*i;this.second=Math.floor(e),e=1e3*(e-this.second),this.millisecond=Math.floor(e)}break;case 14===s.length:if(t=/(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})/gi,-1!==c){const e=1e3*i;this.millisecond=Math.floor(e)}break;default:throw new Error("Wrong input string for conversion")}const l=t.exec(s);if(null===l)throw new Error("Wrong input string for conversion");for(let e=1;e<l.length;e++)switch(e){case 1:this.year=parseInt(l[e],10);break;case 2:this.month=parseInt(l[e],10);break;case 3:this.day=parseInt(l[e],10);break;case 4:this.hour=parseInt(l[e],10)+o;break;case 5:this.minute=parseInt(l[e],10)+a;break;case 6:this.second=parseInt(l[e],10);break;default:throw new Error("Wrong input string for conversion")}if(!1===n){const e=new Date(this.year,this.month,this.day,this.hour,this.minute,this.second,this.millisecond);this.year=e.getUTCFullYear(),this.month=e.getUTCMonth(),this.day=e.getUTCDay(),this.hour=e.getUTCHours(),this.minute=e.getUTCMinutes(),this.second=e.getUTCSeconds(),this.millisecond=e.getUTCMilliseconds()}}toString(e="iso"){if("iso"===e){const e=[];return e.push(Yo(this.year,4)),e.push(Yo(this.month,2)),e.push(Yo(this.day,2)),e.push(Yo(this.hour,2)),e.push(Yo(this.minute,2)),e.push(Yo(this.second,2)),0!==this.millisecond&&(e.push("."),e.push(Yo(this.millisecond,3))),e.push("Z"),e.join("")}return super.toString(e)}toJSON(){return{...super.toJSON(),millisecond:this.millisecond}}}Ic=zc,pa.GeneralizedTime=Ic,zc.NAME="GeneralizedTime";class Wc extends Pc{constructor(e={}){super(e),this.idBlock.tagClass=1,this.idBlock.tagNumber=31}}Rc=Wc,pa.DATE=Rc,Wc.NAME="DATE";class jc extends Pc{constructor(e={}){super(e),this.idBlock.tagClass=1,this.idBlock.tagNumber=32}}Ac=jc,pa.TimeOfDay=Ac,jc.NAME="TimeOfDay";class Gc extends Pc{constructor(e={}){super(e),this.idBlock.tagClass=1,this.idBlock.tagNumber=33}}Tc=Gc,pa.DateTime=Tc,Gc.NAME="DateTime";class Yc extends Pc{constructor(e={}){super(e),this.idBlock.tagClass=1,this.idBlock.tagNumber=34}}Dc=Yc,pa.Duration=Dc,Yc.NAME="Duration";class Qc extends Pc{constructor(e={}){super(e),this.idBlock.tagClass=1,this.idBlock.tagNumber=14}}function Jc(e){let t=e.toString(16);t.length%2>0&&(t=`0${t}`);const n=t.length/2,r=new Uint8Array(n);let s=0,i=0;for(;s<n;)r[s]=parseInt(t.slice(i,i+2),16),s+=1,i+=2;return r}function Zc(e){const t=[];return e.forEach((function(e){let n=e.toString(16);n.length%2>0&&(n=`0${n}`),t.push(n)})),BigInt("0x"+t.join(""))}kc=Qc,pa.TIME=kc,Qc.NAME="TIME";async function Xc(e,t){const n=vo.get(),r=new ic({value:[new Ja({value:0}),new ic({value:[new tc({value:"1.2.840.113549.1.1.1"}),new Ca]}),new Ha({valueHex:e.marshal()})]}).toBER(),s=new Uint8Array(r,0,r.byteLength),i=Co(16),o=await async function(e,t,n,r){const{c:s,dkLen:i,asyncTick:o,DK:a,PRF:c,PRFSalt:l}=Mo(e,t,n,r);let u;const h=new Uint8Array(4),d=Ps(h),p=new Uint8Array(c.outputLen);for(let e=1,t=0;t<i;e++,t+=c.outputLen){const n=a.subarray(t,t+c.outputLen);d.setInt32(0,e,!1),(u=l._cloneInto(u)).update(h).digestInto(p),n.set(p.subarray(0,n.length)),await Ns(s-1,o,(()=>{c._cloneInto(u).update(p).digestInto(p);for(let e=0;e<n.length;e++)n[e]^=p[e]}))}return function(e,t,n,r,s){return e.destroy(),t.destroy(),r&&r.destroy(),s.fill(0),n}(c,l,a,u,p)}
|
|
52
|
+
/*!
|
|
53
|
+
* MIT License
|
|
54
|
+
*
|
|
55
|
+
* Copyright (c) 2017-2022 Peculiar Ventures, LLC
|
|
56
|
+
*
|
|
57
|
+
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
58
|
+
* of this software and associated documentation files (the "Software"), to deal
|
|
59
|
+
* in the Software without restriction, including without limitation the rights
|
|
60
|
+
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
61
|
+
* copies of the Software, and to permit persons to whom the Software is
|
|
62
|
+
* furnished to do so, subject to the following conditions:
|
|
63
|
+
*
|
|
64
|
+
* The above copyright notice and this permission notice shall be included in all
|
|
65
|
+
* copies or substantial portions of the Software.
|
|
66
|
+
*
|
|
67
|
+
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
68
|
+
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
69
|
+
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
70
|
+
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
71
|
+
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
72
|
+
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
73
|
+
* SOFTWARE.
|
|
74
|
+
*
|
|
75
|
+
*/(Zs,t,i,{c:1e4,dkLen:32}),a=Co(16),c=await n.subtle.importKey("raw",o,"AES-CBC",!1,["encrypt"]),l=await n.subtle.encrypt({name:"AES-CBC",iv:a},c,s),u=new ic({value:[new Ha({valueHex:i}),new Ja({value:1e4}),new Ja({value:32}),new ic({value:[new tc({value:"1.2.840.113549.2.11"}),new Ca]})]}),h=new ic({value:[new tc({value:"1.2.840.113549.1.5.13"}),new ic({value:[new ic({value:[new tc({value:"1.2.840.113549.1.5.12"}),u]}),new ic({value:[new tc({value:"2.16.840.1.101.3.4.1.42"}),new Ha({valueHex:a})]})]})]}),d=new ic({value:[h,new Ha({valueHex:l})]}).toBER();return["-----BEGIN ENCRYPTED PRIVATE KEY-----",...Gt(new Uint8Array(d,0,d.byteLength),"base64pad").split(/(.{64})/).filter(Boolean),"-----END ENCRYPTED PRIVATE KEY-----"].join("\n")}async function el(e){const t=[await vo.get().subtle.importKey("jwk",e,{name:"RSASSA-PKCS1-v1_5",hash:{name:"SHA-256"}},!0,["sign"]),await nl(e)],n=await tl({privateKey:t[0],publicKey:t[1]});return{privateKey:n[0],publicKey:n[1]}}async function tl(e){if(null==e.privateKey||null==e.publicKey)throw new dn("Private and public key are required","ERR_INVALID_PARAMETERS");return Promise.all([vo.get().subtle.exportKey("jwk",e.privateKey),vo.get().subtle.exportKey("jwk",e.publicKey)])}async function nl(e){return vo.get().subtle.importKey("jwk",{kty:e.kty,n:e.n,e:e.e},{name:"RSASSA-PKCS1-v1_5",hash:{name:"SHA-256"}},!0,["verify"])}function rl(e){if("RSA"!==e.kty)throw new dn("invalid key type","ERR_INVALID_KEY_TYPE");if(null==e.n)throw new dn("invalid key modulus","ERR_INVALID_KEY_MODULUS");return 8*Tt(e.n,"base64url").length}const sl=8192;class il{_key;constructor(e){this._key=e}verify(e,t){return async function(e,t,n){const r=await vo.get().subtle.importKey("jwk",e,{name:"RSASSA-PKCS1-v1_5",hash:{name:"SHA-256"}},!1,["verify"]);return vo.get().subtle.verify({name:"RSASSA-PKCS1-v1_5"},r,t,n instanceof Uint8Array?n:n.subarray())}(this._key,t,e)}marshal(){return function(e){if(null==e.n||null==e.e)throw new dn("JWK was missing components","ERR_INVALID_PARAMETERS");const t=new ic({value:[new ic({value:[new tc({value:"1.2.840.113549.1.1.1"}),new Ca]}),new Wa({valueHex:new ic({value:[Ja.fromBigInt(Zc(Tt(e.n,"base64url"))),Ja.fromBigInt(Zc(Tt(e.e,"base64url")))]}).toBER()})]}).toBER();return new Uint8Array(t,0,t.byteLength)}(this._key)}get bytes(){return Ro.encode({Type:_o.RSA,Data:this.marshal()}).subarray()}equals(e){return Sn(this.bytes,e.bytes)}hash(){const e=pt.digest(this.bytes);return Is(e)?e.then((({bytes:e})=>e)):e.bytes}}class ol{_key;_publicKey;constructor(e,t){this._key=e,this._publicKey=t}genSecret(){return Co(16)}sign(e){return async function(e,t){const n=await vo.get().subtle.importKey("jwk",e,{name:"RSASSA-PKCS1-v1_5",hash:{name:"SHA-256"}},!1,["sign"]),r=await vo.get().subtle.sign({name:"RSASSA-PKCS1-v1_5"},n,t instanceof Uint8Array?t:t.subarray());return new Uint8Array(r,0,r.byteLength)}(this._key,e)}get public(){if(null==this._publicKey)throw new dn("public key not provided","ERR_PUBKEY_NOT_PROVIDED");return new il(this._publicKey)}marshal(){return function(e){if(null==e.n||null==e.e||null==e.d||null==e.p||null==e.q||null==e.dp||null==e.dq||null==e.qi)throw new dn("JWK was missing components","ERR_INVALID_PARAMETERS");const t=new ic({value:[new Ja({value:0}),Ja.fromBigInt(Zc(Tt(e.n,"base64url"))),Ja.fromBigInt(Zc(Tt(e.e,"base64url"))),Ja.fromBigInt(Zc(Tt(e.d,"base64url"))),Ja.fromBigInt(Zc(Tt(e.p,"base64url"))),Ja.fromBigInt(Zc(Tt(e.q,"base64url"))),Ja.fromBigInt(Zc(Tt(e.dp,"base64url"))),Ja.fromBigInt(Zc(Tt(e.dq,"base64url"))),Ja.fromBigInt(Zc(Tt(e.qi,"base64url")))]}).toBER();return new Uint8Array(t,0,t.byteLength)}(this._key)}get bytes(){return Ao.encode({Type:_o.RSA,Data:this.marshal()}).subarray()}equals(e){return Sn(this.bytes,e.bytes)}hash(){const e=pt.digest(this.bytes);return Is(e)?e.then((({bytes:e})=>e)):e.bytes}async id(){return Gt(await this.public.hash(),"base58btc")}async export(e,t="pkcs-8"){if("pkcs-8"===t)return Xc(this,e);if("libp2p-key"===t)return So(this.bytes,e);throw new dn(`export format '${t}' is not supported`,"ERR_INVALID_EXPORT_FORMAT")}}var al=Object.freeze({__proto__:null,MAX_RSA_KEY_SIZE:sl,RsaPrivateKey:ol,RsaPublicKey:il,fromJwk:async function(e){if(rl(e)>sl)throw new dn("key size is too large","ERR_KEY_SIZE_TOO_LARGE");const t=await el(e);return new ol(t.privateKey,t.publicKey)},generateKeyPair:async function(e){if(e>sl)throw new dn("key size is too large","ERR_KEY_SIZE_TOO_LARGE");const t=await async function(e){const t=await vo.get().subtle.generateKey({name:"RSASSA-PKCS1-v1_5",modulusLength:e,publicExponent:new Uint8Array([1,0,1]),hash:{name:"SHA-256"}},!0,["sign","verify"]),n=await tl(t);return{privateKey:n[0],publicKey:n[1]}}(e);return new ol(t.privateKey,t.publicKey)},unmarshalRsaPrivateKey:async function(e){const t=function(e){const{result:t}=Ra(e),n=t.valueBlock.value;return{n:Gt(Jc(n[1].toBigInt()),"base64url"),e:Gt(Jc(n[2].toBigInt()),"base64url"),d:Gt(Jc(n[3].toBigInt()),"base64url"),p:Gt(Jc(n[4].toBigInt()),"base64url"),q:Gt(Jc(n[5].toBigInt()),"base64url"),dp:Gt(Jc(n[6].toBigInt()),"base64url"),dq:Gt(Jc(n[7].toBigInt()),"base64url"),qi:Gt(Jc(n[8].toBigInt()),"base64url"),kty:"RSA",alg:"RS256"}}(e);if(rl(t)>sl)throw new dn("key size is too large","ERR_KEY_SIZE_TOO_LARGE");const n=await el(t);return new ol(n.privateKey,n.publicKey)},unmarshalRsaPublicKey:function(e){const t=function(e){const{result:t}=Ra(e),n=t.valueBlock.value[1].valueBlock.value[0].valueBlock.value;return{kty:"RSA",n:Gt(Jc(n[0].toBigInt()),"base64url"),e:Gt(Jc(n[1].toBigInt()),"base64url")}}(e);if(rl(t)>sl)throw new dn("key size is too large","ERR_KEY_SIZE_TOO_LARGE");return new il(t)}});const cl=new Uint32Array([1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298]),ll=new Uint32Array([1779033703,3144134277,1013904242,2773480762,1359893119,2600822924,528734635,1541459225]),ul=new Uint32Array(64);class hl extends $s{constructor(){super(64,32,8,!1),this.A=0|ll[0],this.B=0|ll[1],this.C=0|ll[2],this.D=0|ll[3],this.E=0|ll[4],this.F=0|ll[5],this.G=0|ll[6],this.H=0|ll[7]}get(){const{A:e,B:t,C:n,D:r,E:s,F:i,G:o,H:a}=this;return[e,t,n,r,s,i,o,a]}set(e,t,n,r,s,i,o,a){this.A=0|e,this.B=0|t,this.C=0|n,this.D=0|r,this.E=0|s,this.F=0|i,this.G=0|o,this.H=0|a}process(e,t){for(let n=0;n<16;n++,t+=4)ul[n]=e.getUint32(t,!1);for(let e=16;e<64;e++){const t=ul[e-15],n=ul[e-2],r=Cs(t,7)^Cs(t,18)^t>>>3,s=Cs(n,17)^Cs(n,19)^n>>>10;ul[e]=s+ul[e-7]+r+ul[e-16]|0}let{A:n,B:r,C:s,D:i,E:o,F:a,G:c,H:l}=this;for(let e=0;e<64;e++){const t=l+(Cs(o,6)^Cs(o,11)^Cs(o,25))+((u=o)&a^~u&c)+cl[e]+ul[e]|0,h=(Cs(n,2)^Cs(n,13)^Cs(n,22))+Ks(n,r,s)|0;l=c,c=a,a=o,o=i+t|0,i=s,s=r,r=n,n=t+h|0}var u;n=n+this.A|0,r=r+this.B|0,s=s+this.C|0,i=i+this.D|0,o=o+this.E|0,a=a+this.F|0,c=c+this.G|0,l=l+this.H|0,this.set(n,r,s,i,o,a,c,l)}roundClean(){ul.fill(0)}destroy(){this.set(0,0,0,0,0,0,0,0),this.buffer.fill(0)}}const dl=Fs((()=>new hl));
|
|
76
|
+
/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */const{bytesToNumberBE:pl,hexToBytes:fl}=_i,gl={Err:class extends Error{constructor(e=""){super(e)}},_parseInt(e){const{Err:t}=gl;if(e.length<2||2!==e[0])throw new t("Invalid signature integer tag");const n=e[1],r=e.subarray(2,n+2);if(!n||r.length!==n)throw new t("Invalid signature integer: wrong length");if(128&r[0])throw new t("Invalid signature integer: negative");if(0===r[0]&&!(128&r[1]))throw new t("Invalid signature integer: unnecessary leading zero");return{d:pl(r),l:e.subarray(n+2)}},toSig(e){const{Err:t}=gl,n="string"==typeof e?fl(e):e;ri(n);let r=n.length;if(r<2||48!=n[0])throw new t("Invalid signature tag");if(n[1]!==r-2)throw new t("Invalid signature: incorrect length");const{d:s,l:i}=gl._parseInt(n.subarray(2)),{d:o,l:a}=gl._parseInt(i);if(a.length)throw new t("Invalid signature: left bytes after parsing");return{r:s,s:o}},hexFromSig(e){const t=e=>8&Number.parseInt(e[0],16)?"00"+e:e,n=e=>{const t=e.toString(16);return 1&t.length?`0${t}`:t},r=t(n(e.s)),s=t(n(e.r)),i=r.length/2,o=s.length/2,a=n(i),c=n(o);return`30${n(o+i+4)}02${c}${s}02${a}${r}`}},ml=BigInt(0),yl=BigInt(1);BigInt(2);const wl=BigInt(3);function bl(e){const t=function(e){const t=Hi(e);Si(t,{a:"field",b:"field"},{allowedPrivateKeyLengths:"array",wrapPrivateKey:"boolean",isTorsionFree:"function",clearCofactor:"function",allowInfinityPoint:"boolean",fromBytes:"function",toBytes:"function"});const{endo:n,Fp:r,a:s}=t;if(n){if(!r.eql(s,r.ZERO))throw new Error("Endomorphism can only be defined for Koblitz curves that have a=0");if("object"!=typeof n||"bigint"!=typeof n.beta||"function"!=typeof n.splitScalar)throw new Error("Expected endomorphism with beta: bigint and splitScalar: function")}return Object.freeze({...t})}(e),{Fp:n}=t,r=t.toBytes||((e,t,r)=>{const s=t.toAffine();return mi(Uint8Array.from([4]),n.toBytes(s.x),n.toBytes(s.y))}),s=t.fromBytes||(e=>{const t=e.subarray(1);return{x:n.fromBytes(t.subarray(0,n.BYTES)),y:n.fromBytes(t.subarray(n.BYTES,2*n.BYTES))}});function i(e){const{a:r,b:s}=t,i=n.sqr(e),o=n.mul(i,e);return n.add(n.add(o,n.mul(e,r)),s)}if(!n.eql(n.sqr(t.Gy),i(t.Gx)))throw new Error("bad generator point: equation left != right");function o(e){return"bigint"==typeof e&&ml<e&&e<t.n}function a(e){if(!o(e))throw new Error("Expected valid bigint: 0 < bigint < curve.n")}function c(e){const{allowedPrivateKeyLengths:n,nByteLength:r,wrapPrivateKey:s,n:i}=t;if(n&&"bigint"!=typeof e){if(ni(e)&&(e=ii(e)),"string"!=typeof e||!n.includes(e.length))throw new Error("Invalid key");e=e.padStart(2*r,"0")}let o;try{o="bigint"==typeof e?e:hi(gi("private key",e,r))}catch(t){throw new Error(`private key must be ${r} bytes, hex or bigint, not ${typeof e}`)}return s&&(o=Ci(o,i)),a(o),o}const l=new Map;function u(e){if(!(e instanceof h))throw new Error("ProjectivePoint expected")}class h{constructor(e,t,r){if(this.px=e,this.py=t,this.pz=r,null==e||!n.isValid(e))throw new Error("x required");if(null==t||!n.isValid(t))throw new Error("y required");if(null==r||!n.isValid(r))throw new Error("z required")}static fromAffine(e){const{x:t,y:r}=e||{};if(!e||!n.isValid(t)||!n.isValid(r))throw new Error("invalid affine point");if(e instanceof h)throw new Error("projective point not allowed");const s=e=>n.eql(e,n.ZERO);return s(t)&&s(r)?h.ZERO:new h(t,r,n.ONE)}get x(){return this.toAffine().x}get y(){return this.toAffine().y}static normalizeZ(e){const t=n.invertBatch(e.map((e=>e.pz)));return e.map(((e,n)=>e.toAffine(t[n]))).map(h.fromAffine)}static fromHex(e){const t=h.fromAffine(s(gi("pointHex",e)));return t.assertValidity(),t}static fromPrivateKey(e){return h.BASE.multiply(c(e))}_setWindowSize(e){this._WINDOW_SIZE=e,l.delete(this)}assertValidity(){if(this.is0()){if(t.allowInfinityPoint&&!n.is0(this.py))return;throw new Error("bad point: ZERO")}const{x:e,y:r}=this.toAffine();if(!n.isValid(e)||!n.isValid(r))throw new Error("bad point: x or y not FE");const s=n.sqr(r),o=i(e);if(!n.eql(s,o))throw new Error("bad point: equation left != right");if(!this.isTorsionFree())throw new Error("bad point: not in prime-order subgroup")}hasEvenY(){const{y:e}=this.toAffine();if(n.isOdd)return!n.isOdd(e);throw new Error("Field doesn't support isOdd")}equals(e){u(e);const{px:t,py:r,pz:s}=this,{px:i,py:o,pz:a}=e,c=n.eql(n.mul(t,a),n.mul(i,s)),l=n.eql(n.mul(r,a),n.mul(o,s));return c&&l}negate(){return new h(this.px,n.neg(this.py),this.pz)}double(){const{a:e,b:r}=t,s=n.mul(r,wl),{px:i,py:o,pz:a}=this;let c=n.ZERO,l=n.ZERO,u=n.ZERO,d=n.mul(i,i),p=n.mul(o,o),f=n.mul(a,a),g=n.mul(i,o);return g=n.add(g,g),u=n.mul(i,a),u=n.add(u,u),c=n.mul(e,u),l=n.mul(s,f),l=n.add(c,l),c=n.sub(p,l),l=n.add(p,l),l=n.mul(c,l),c=n.mul(g,c),u=n.mul(s,u),f=n.mul(e,f),g=n.sub(d,f),g=n.mul(e,g),g=n.add(g,u),u=n.add(d,d),d=n.add(u,d),d=n.add(d,f),d=n.mul(d,g),l=n.add(l,d),f=n.mul(o,a),f=n.add(f,f),d=n.mul(f,g),c=n.sub(c,d),u=n.mul(f,p),u=n.add(u,u),u=n.add(u,u),new h(c,l,u)}add(e){u(e);const{px:r,py:s,pz:i}=this,{px:o,py:a,pz:c}=e;let l=n.ZERO,d=n.ZERO,p=n.ZERO;const f=t.a,g=n.mul(t.b,wl);let m=n.mul(r,o),y=n.mul(s,a),w=n.mul(i,c),b=n.add(r,s),v=n.add(o,a);b=n.mul(b,v),v=n.add(m,y),b=n.sub(b,v),v=n.add(r,i);let E=n.add(o,c);return v=n.mul(v,E),E=n.add(m,w),v=n.sub(v,E),E=n.add(s,i),l=n.add(a,c),E=n.mul(E,l),l=n.add(y,w),E=n.sub(E,l),p=n.mul(f,v),l=n.mul(g,w),p=n.add(l,p),l=n.sub(y,p),p=n.add(y,p),d=n.mul(l,p),y=n.add(m,m),y=n.add(y,m),w=n.mul(f,w),v=n.mul(g,v),y=n.add(y,w),w=n.sub(m,w),w=n.mul(f,w),v=n.add(v,w),m=n.mul(y,v),d=n.add(d,m),m=n.mul(E,v),l=n.mul(b,l),l=n.sub(l,m),m=n.mul(b,y),p=n.mul(E,p),p=n.add(p,m),new h(l,d,p)}subtract(e){return this.add(e.negate())}is0(){return this.equals(h.ZERO)}wNAF(e){return p.wNAFCached(this,l,e,(e=>{const t=n.invertBatch(e.map((e=>e.pz)));return e.map(((e,n)=>e.toAffine(t[n]))).map(h.fromAffine)}))}multiplyUnsafe(e){const r=h.ZERO;if(e===ml)return r;if(a(e),e===yl)return this;const{endo:s}=t;if(!s)return p.unsafeLadder(this,e);let{k1neg:i,k1:o,k2neg:c,k2:l}=s.splitScalar(e),u=r,d=r,f=this;for(;o>ml||l>ml;)o&yl&&(u=u.add(f)),l&yl&&(d=d.add(f)),f=f.double(),o>>=yl,l>>=yl;return i&&(u=u.negate()),c&&(d=d.negate()),d=new h(n.mul(d.px,s.beta),d.py,d.pz),u.add(d)}multiply(e){a(e);let r,s,i=e;const{endo:o}=t;if(o){const{k1neg:e,k1:t,k2neg:a,k2:c}=o.splitScalar(i);let{p:l,f:u}=this.wNAF(t),{p:d,f:f}=this.wNAF(c);l=p.constTimeNegate(e,l),d=p.constTimeNegate(a,d),d=new h(n.mul(d.px,o.beta),d.py,d.pz),r=l.add(d),s=u.add(f)}else{const{p:e,f:t}=this.wNAF(i);r=e,s=t}return h.normalizeZ([r,s])[0]}multiplyAndAddUnsafe(e,t,n){const r=h.BASE,s=(e,t)=>t!==ml&&t!==yl&&e.equals(r)?e.multiply(t):e.multiplyUnsafe(t),i=s(this,t).add(s(e,n));return i.is0()?void 0:i}toAffine(e){const{px:t,py:r,pz:s}=this,i=this.is0();null==e&&(e=i?n.ONE:n.inv(s));const o=n.mul(t,e),a=n.mul(r,e),c=n.mul(s,e);if(i)return{x:n.ZERO,y:n.ZERO};if(!n.eql(c,n.ONE))throw new Error("invZ was invalid");return{x:o,y:a}}isTorsionFree(){const{h:e,isTorsionFree:n}=t;if(e===yl)return!0;if(n)return n(h,this);throw new Error("isTorsionFree() has not been declared for the elliptic curve")}clearCofactor(){const{h:e,clearCofactor:n}=t;return e===yl?this:n?n(h,this):this.multiplyUnsafe(t.h)}toRawBytes(e=!0){return this.assertValidity(),r(h,this,e)}toHex(e=!0){return ii(this.toRawBytes(e))}}h.BASE=new h(t.Gx,t.Gy,n.ONE),h.ZERO=new h(n.ZERO,n.ONE,n.ZERO);const d=t.nBitLength,p=qi(h,t.endo?Math.ceil(d/2):d);return{CURVE:t,ProjectivePoint:h,normPrivateKeyToScalar:c,weierstrassEquation:i,isWithinCurveOrder:o}}function vl(e){const t=function(e){const t=Hi(e);return Si(t,{hash:"hash",hmac:"function",randomBytes:"function"},{bits2int:"function",bits2int_modN:"function",lowS:"boolean"}),Object.freeze({lowS:!0,...t})}(e),{Fp:n,n:r}=t,s=n.BYTES+1,i=2*n.BYTES+1;function o(e){return Ci(e,r)}function a(e){return Mi(e,r)}const{ProjectivePoint:c,normPrivateKeyToScalar:l,weierstrassEquation:u,isWithinCurveOrder:h}=bl({...t,toBytes(e,t,r){const s=t.toAffine(),i=n.toBytes(s.x),o=mi;return r?o(Uint8Array.from([t.hasEvenY()?2:3]),i):o(Uint8Array.from([4]),i,n.toBytes(s.y))},fromBytes(e){const t=e.length,r=e[0],o=e.subarray(1);if(t!==s||2!==r&&3!==r){if(t===i&&4===r){return{x:n.fromBytes(o.subarray(0,n.BYTES)),y:n.fromBytes(o.subarray(n.BYTES,2*n.BYTES))}}throw new Error(`Point of length ${t} was invalid. Expected ${s} compressed bytes or ${i} uncompressed bytes`)}{const e=hi(o);if(!(ml<(a=e)&&a<n.ORDER))throw new Error("Point is not on curve");const t=u(e);let s;try{s=n.sqrt(t)}catch(e){const t=e instanceof Error?": "+e.message:"";throw new Error("Point is not on curve"+t)}return!(1&~r)!==((s&yl)===yl)&&(s=n.neg(s)),{x:e,y:s}}var a}}),d=e=>ii(pi(e,t.nByteLength));function p(e){return e>r>>yl}const f=(e,t,n)=>hi(e.slice(t,n));class g{constructor(e,t,n){this.r=e,this.s=t,this.recovery=n,this.assertValidity()}static fromCompact(e){const n=t.nByteLength;return e=gi("compactSignature",e,2*n),new g(f(e,0,n),f(e,n,2*n))}static fromDER(e){const{r:t,s:n}=gl.toSig(gi("DER",e));return new g(t,n)}assertValidity(){if(!h(this.r))throw new Error("r must be 0 < r < CURVE.n");if(!h(this.s))throw new Error("s must be 0 < s < CURVE.n")}addRecoveryBit(e){return new g(this.r,this.s,e)}recoverPublicKey(e){const{r:r,s:s,recovery:i}=this,l=b(gi("msgHash",e));if(null==i||![0,1,2,3].includes(i))throw new Error("recovery id invalid");const u=2===i||3===i?r+t.n:r;if(u>=n.ORDER)throw new Error("recovery id 2 or 3 invalid");const h=1&i?"03":"02",p=c.fromHex(h+d(u)),f=a(u),g=o(-l*f),m=o(s*f),y=c.BASE.multiplyAndAddUnsafe(p,g,m);if(!y)throw new Error("point at infinify");return y.assertValidity(),y}hasHighS(){return p(this.s)}normalizeS(){return this.hasHighS()?new g(this.r,o(-this.s),this.recovery):this}toDERRawBytes(){return ui(this.toDERHex())}toDERHex(){return gl.hexFromSig({r:this.r,s:this.s})}toCompactRawBytes(){return ui(this.toCompactHex())}toCompactHex(){return d(this.r)+d(this.s)}}const m={isValidPrivateKey(e){try{return l(e),!0}catch(e){return!1}},normPrivateKeyToScalar:l,randomPrivateKey:()=>{const e=Vi(t.n);return function(e,t,n=!1){const r=e.length,s=Fi(t),i=Vi(t);if(r<16||r<i||r>1024)throw new Error(`expected ${i}-1024 bytes of input, got ${r}`);const o=Ci(n?hi(e):di(e),t-Ri)+Ri;return n?fi(o,s):pi(o,s)}(t.randomBytes(e),t.n)},precompute:(e=8,t=c.BASE)=>(t._setWindowSize(e),t.multiply(BigInt(3)),t)};function y(e){const t=ni(e),n="string"==typeof e,r=(t||n)&&e.length;return t?r===s||r===i:n?r===2*s||r===2*i:e instanceof c}const w=t.bits2int||function(e){const n=hi(e),r=8*e.length-t.nBitLength;return r>0?n>>BigInt(r):n},b=t.bits2int_modN||function(e){return o(w(e))},v=yi(t.nBitLength);function E(e){if("bigint"!=typeof e)throw new Error("bigint expected");if(!(ml<=e&&e<v))throw new Error(`bigint expected < 2^${t.nBitLength}`);return pi(e,t.nByteLength)}function S(e,r,s=_){if(["recovered","canonical"].some((e=>e in s)))throw new Error("sign() legacy options not supported");const{hash:i,randomBytes:u}=t;let{lowS:d,prehash:f,extraEntropy:m}=s;null==d&&(d=!0),e=gi("msgHash",e),f&&(e=gi("prehashed msgHash",i(e)));const y=b(e),v=l(r),S=[E(v),E(y)];if(null!=m&&!1!==m){const e=!0===m?u(n.BYTES):m;S.push(gi("extraEntropy",e))}const I=mi(...S),R=y;return{seed:I,k2sig:function(e){const t=w(e);if(!h(t))return;const n=a(t),r=c.BASE.multiply(t).toAffine(),s=o(r.x);if(s===ml)return;const i=o(n*o(R+s*v));if(i===ml)return;let l=(r.x===s?0:2)|Number(r.y&yl),u=i;return d&&p(i)&&(u=function(e){return p(e)?o(-e):e}(i),l^=1),new g(s,u,l)}}}const _={lowS:t.lowS,prehash:!1},I={lowS:t.lowS,prehash:!1};return c.BASE._setWindowSize(8),{CURVE:t,getPublicKey:function(e,t=!0){return c.fromPrivateKey(e).toRawBytes(t)},getSharedSecret:function(e,t,n=!0){if(y(e))throw new Error("first arg must be private key");if(!y(t))throw new Error("second arg must be public key");return c.fromHex(t).multiply(l(e)).toRawBytes(n)},sign:function(e,n,r=_){const{seed:s,k2sig:i}=S(e,n,r),o=t;return vi(o.hash.outputLen,o.nByteLength,o.hmac)(s,i)},verify:function(e,n,r,s=I){const i=e;if(n=gi("msgHash",n),r=gi("publicKey",r),"strict"in s)throw new Error("options.strict was renamed to lowS");const{lowS:l,prehash:u}=s;let h,d;try{if("string"==typeof i||ni(i))try{h=g.fromDER(i)}catch(e){if(!(e instanceof gl.Err))throw e;h=g.fromCompact(i)}else{if("object"!=typeof i||"bigint"!=typeof i.r||"bigint"!=typeof i.s)throw new Error("PARSE");{const{r:e,s:t}=i;h=new g(e,t)}}d=c.fromHex(r)}catch(e){if("PARSE"===e.message)throw new Error("signature must be Signature instance, Uint8Array or hex string");return!1}if(l&&h.hasHighS())return!1;u&&(n=t.hash(n));const{r:p,s:f}=h,m=b(n),y=a(f),w=o(m*y),v=o(p*y),E=c.BASE.multiplyAndAddUnsafe(d,w,v)?.toAffine();return!!E&&o(E.x)===p},ProjectivePoint:c,Signature:g,utils:m}}
|
|
77
|
+
/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */function El(e){return{hash:e,hmac:(t,...n)=>No(e,t,Ls(...n)),randomBytes:Vs}}BigInt(4);
|
|
78
|
+
/*! noble-curves - MIT License (c) 2022 Paul Miller (paulmillr.com) */
|
|
79
|
+
const Sl=BigInt("0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f"),_l=BigInt("0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141"),Il=BigInt(1),Rl=BigInt(2),Al=(e,t)=>(e+t/Rl)/t;const Tl=Ui(Sl,void 0,void 0,{sqrt:function(e){const t=Sl,n=BigInt(3),r=BigInt(6),s=BigInt(11),i=BigInt(22),o=BigInt(23),a=BigInt(44),c=BigInt(88),l=e*e*e%t,u=l*l*e%t,h=Ni(u,n,t)*u%t,d=Ni(h,n,t)*u%t,p=Ni(d,Rl,t)*l%t,f=Ni(p,s,t)*p%t,g=Ni(f,i,t)*f%t,m=Ni(g,a,t)*g%t,y=Ni(m,c,t)*m%t,w=Ni(y,a,t)*g%t,b=Ni(w,n,t)*u%t,v=Ni(b,o,t)*f%t,E=Ni(v,r,t)*l%t,S=Ni(E,Rl,t);if(!Tl.eql(Tl.sqr(S),e))throw new Error("Cannot find square root");return S}}),Dl=function(e,t){const n=t=>vl({...e,...El(t)});return Object.freeze({...n(t),create:n})}({a:BigInt(0),b:BigInt(7),Fp:Tl,n:_l,Gx:BigInt("55066263022277343669578718895168534326250603453777594175500187360389116729240"),Gy:BigInt("32670510020758816978083085130507043184471273380659243275938904335757337482424"),h:BigInt(1),lowS:!0,endo:{beta:BigInt("0x7ae96a2b657c07106e64479eac3434e99cf0497512f58995c1396c28719501ee"),splitScalar:e=>{const t=_l,n=BigInt("0x3086d221a7d46bcde86c90e49284eb15"),r=-Il*BigInt("0xe4437ed6010e88286f547fa90abfe4c3"),s=BigInt("0x114ca50f7a8e2f3f657c1108d9d44cfd8"),i=n,o=BigInt("0x100000000000000000000000000000000"),a=Al(i*e,t),c=Al(-r*e,t);let l=Ci(e-a*n-c*s,t),u=Ci(-a*r-c*i,t);const h=l>o,d=u>o;if(h&&(l=t-l),d&&(u=t-u),l>o||u>o)throw new Error("splitScalar: Endomorphism failed, k="+e);return{k1neg:h,k1:l,k2neg:d,k2:u}}}},dl);function kl(e){try{Dl.ProjectivePoint.fromHex(e)}catch(e){throw new dn(String(e),"ERR_INVALID_PUBLIC_KEY")}}BigInt(0),Dl.ProjectivePoint;class Pl{_key;constructor(e){kl(e),this._key=e}verify(e,t){return function(e,t,n){const r=pt.digest(n instanceof Uint8Array?n:n.subarray());if(Is(r))return r.then((({digest:n})=>Dl.verify(t,n,e))).catch((e=>{throw new dn(String(e),"ERR_INVALID_INPUT")}));try{return Dl.verify(t,r.digest,e)}catch(e){throw new dn(String(e),"ERR_INVALID_INPUT")}}(this._key,t,e)}marshal(){return e=this._key,Dl.ProjectivePoint.fromHex(e).toRawBytes(!0);var e}get bytes(){return Ro.encode({Type:_o.Secp256k1,Data:this.marshal()}).subarray()}equals(e){return Sn(this.bytes,e.bytes)}async hash(){const e=pt.digest(this.bytes);let t;return Is(e)?({bytes:t}=await e):t=e.bytes,t}}class Cl{_key;_publicKey;constructor(e,t){this._key=e,this._publicKey=t??function(e){try{return Dl.getPublicKey(e,!0)}catch(e){throw new dn(String(e),"ERR_INVALID_PRIVATE_KEY")}}(e),function(e){try{Dl.getPublicKey(e,!0)}catch(e){throw new dn(String(e),"ERR_INVALID_PRIVATE_KEY")}}(this._key),kl(this._publicKey)}sign(e){return function(e,t){const n=pt.digest(t instanceof Uint8Array?t:t.subarray());if(Is(n))return n.then((({digest:t})=>Dl.sign(t,e).toDERRawBytes())).catch((e=>{throw new dn(String(e),"ERR_INVALID_INPUT")}));try{return Dl.sign(n.digest,e).toDERRawBytes()}catch(e){throw new dn(String(e),"ERR_INVALID_INPUT")}}(this._key,e)}get public(){return new Pl(this._publicKey)}marshal(){return this._key}get bytes(){return Ao.encode({Type:_o.Secp256k1,Data:this.marshal()}).subarray()}equals(e){return Sn(this.bytes,e.bytes)}hash(){const e=pt.digest(this.bytes);return Is(e)?e.then((({bytes:e})=>e)):e.bytes}async id(){return Gt(await this.public.hash(),"base58btc")}async export(e,t="libp2p-key"){if("libp2p-key"===t)return So(this.bytes,e);throw new dn(`export format '${t}' is not supported`,"ERR_INVALID_EXPORT_FORMAT")}}var xl=Object.freeze({__proto__:null,Secp256k1PrivateKey:Cl,Secp256k1PublicKey:Pl,generateKeyPair:async function(){const e=Dl.utils.randomPrivateKey();return new Cl(e)},unmarshalSecp256k1PrivateKey:function(e){return new Cl(e)},unmarshalSecp256k1PublicKey:function(e){return new Pl(e)}});const Nl={rsa:al,ed25519:Po,secp256k1:xl};function Ml(e){const t=Object.keys(Nl).join(" / ");return new dn(`invalid or unsupported key type ${e}. Must be ${t}`,"ERR_UNSUPPORTED_KEY_TYPE")}function Ol(e){if("rsa"===(e=e.toLowerCase())||"ed25519"===e||"secp256k1"===e)return Nl[e];throw Ml(e)}function Ll(e){const t=Ro.decode(e),n=t.Data??new Uint8Array;switch(t.Type){case _o.RSA:return Nl.rsa.unmarshalRsaPublicKey(n);case _o.Ed25519:return Nl.ed25519.unmarshalEd25519PublicKey(n);case _o.Secp256k1:return Nl.secp256k1.unmarshalSecp256k1PublicKey(n);default:throw Ml(t.Type??"unknown")}}function Bl(e,t){return Ol(t=(t??"rsa").toLowerCase()),e.bytes}async function Ul(e){const t=Ao.decode(e),n=t.Data??new Uint8Array;switch(t.Type){case _o.RSA:return Nl.rsa.unmarshalRsaPrivateKey(n);case _o.Ed25519:return Nl.ed25519.unmarshalEd25519PrivateKey(n);case _o.Secp256k1:return Nl.secp256k1.unmarshalSecp256k1PrivateKey(n);default:throw Ml(t.Type??"RSA")}}var Fl,Vl={exports:{}};Fl=Vl,function(){Fl.exports=g;var e=86400,t=3200,n=146097*t/400,r=e*n,s=1e3*r,i=864e13,o=4294967296,a=1e6,c="000000000",l=Math.trunc||function(e){var t=e-e%1;return 0==t&&(e<0||0===e&&1/e!=1/0)?-0:t},u=g.prototype,h=(g.fromDate=function(e){return new g(+e)},g.fromInt64BE=v(0,1,2,3,0,4),g.fromInt64LE=v(3,2,1,0,4,0),g.fromString=function(e){var t,n=new g;if(e=(e+="").replace(/^\s*[+\-]?\d+/,(function(e){var t=1970+((e=+e)-1970)%400;return n.year=e-t,t})).replace(/(?:Z|([+\-]\d{2}):?(\d{2}))$/,(function(e,n,r){return n<0&&(r*=-1),t=6e4*(60*+n+ +r),""})).replace(/\.\d+$/,(function(e){return n.nano=+(e+c).substr(1,9),""})).split(/\D+/),1<e.length?e[1]--:e[1]=0,n.time=t=Date.UTC.apply(Date,e)-(t||0),isNaN(t))throw new TypeError("Invalid Date");return m(n)},g.fromTimeT=function(e){return w(e,0)},u.year=0,u.time=0,u.nano=0,u.addNano=function(e){return this.nano+=+e||0,this},u.getNano=function(){var e=m(this);return(e.time%1e3*a+ +e.nano+1e9)%1e9},u.getTimeT=function(){var r=m(this),s=Math.floor(r.time/1e3);return(r=r.year)&&(s+=r*n*e/t),s},u.getYear=function(){return this.toDate().getUTCFullYear()+this.year},u.toDate=function(){return y(m(this).time)},u.toJSON=function(){return this.toString().replace(/0{1,6}Z$/,"Z")},u.toString=function(e){var t=this,n=t.toDate(),r={H:function(){return S(n.getUTCHours())},L:function(){return _(n.getUTCMilliseconds(),3)},M:function(){return S(n.getUTCMinutes())},N:function(){return _(t.getNano(),9)},S:function(){return S(n.getUTCSeconds())},Y:function(){var e=t.getYear();return 999999<e?"+"+e:9999<e?"+"+_(e,6):0<=e?_(e,4):-999999<=e?"-"+_(-e,6):e},a:function(){return p[n.getUTCDay()]},b:function(){return d[n.getUTCMonth()]},d:function(){return S(n.getUTCDate())},e:function(){return function(e){return(9<e?"":" ")+(0|e)}(n.getUTCDate())},m:function(){return S(n.getUTCMonth()+1)}};return function e(t){return t.replace(/%./g,(function(t){var n=t[1],s=f[n];return n=r[n],s?e(s):n?n():t}))}(e||h)},u.writeInt64BE=b(0,1,2,3,0,4),u.writeInt64LE=b(3,2,1,0,4,0),"%Y-%m-%dT%H:%M:%S.%NZ"),d=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],p=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],f={"%":"%",F:"%Y-%m-%d",n:"\n",R:"%H:%M",T:"%H:%M:%S",t:"\t",X:"%T",Z:"GMT",z:"+0000"};return g;function g(e,t,n){var r=this;if(!(r instanceof g))return new g(e,t,n);r.time=+e||0,r.nano=+t||0,r.year=+n||0,m(r)}function m(e){var n,r,o,c=e.year,u=e.time,h=e.nano,d=((h<0||a<=h)&&(h-=(r=Math.floor(h/a))*a,u+=r,r=1),c%t);return(u<-i||i<u||d)&&((n=l(u/s))&&(c+=n*t,u-=n*s),(o=y(u)).setUTCFullYear(d+o.getUTCFullYear()),o=(u=+o)+(n=l((c-=d)/t))*s,n&&-i<=o&&o<=i&&(c-=n*t,u=o),r=1),r&&(e.year=c,e.time=u,e.nano=h),e}function y(e){var t=new Date(0);return t.setTime(e),t}function w(e,n){e=+e||0;var s=l((n=(0|n)*o)/r)+l(e/r);return(e=l((n=n%r+e%r)/r))&&(s+=e,n-=e*r),new g(1e3*n,0,s*t)}function b(r,s,i,a,c,u){return function(r,s){var i=m(this);E(r=r||new Array(8),s|=0);var a=Math.floor(i.time/1e3),d=(i=i.year*(n*e/t),l(i/o)+l(a/o));return i=i%o+a%o,(a=Math.floor(i/o))&&(d+=a,i-=a*o),h(r,s+c,d),h(r,s+u,i),r};function h(e,t,n){e[t+r]=n>>24&255,e[t+s]=n>>16&255,e[t+i]=n>>8&255,e[t+a]=255&n}}function v(e,t,n,r,s,i){return function(e,t){E(e,t|=0);var n=o(e,t+s);return w(o(e,t+i),n)};function o(s,i){return 16777216*s[i+e]+(s[i+t]<<16|s[i+n]<<8|s[i+r])}}function E(e,t){if(null==(e=e&&e.length))throw new TypeError("Invalid Buffer");if(e<t+8)throw new RangeError("Out of range")}function S(e){return(9<e?"":"0")+(0|e)}function _(e,t){return(c+(0|e)).substr(-t)}}();var Kl=Or(Vl.exports);const $l="ERR_UNRECOGNIZED_VALIDITY",ql="ERR_SIGNATURE_VERIFICATION",Hl="ERR_UNDEFINED_PARAMETER";var zl;!function(e){let t,n;(e.ValidityType||(e.ValidityType={})).EOL="EOL",function(e){e[e.EOL=0]="EOL"}(t||(t={})),function(e){e.codec=()=>Ht(t)}(e.ValidityType||(e.ValidityType={})),e.codec=()=>(null==n&&(n=zt(((t,n,r={})=>{!1!==r.lengthDelimited&&n.fork(),null!=t.value&&(n.uint32(10),n.bytes(t.value)),null!=t.signatureV1&&(n.uint32(18),n.bytes(t.signatureV1)),null!=t.validityType&&(n.uint32(24),e.ValidityType.codec().encode(t.validityType,n)),null!=t.validity&&(n.uint32(34),n.bytes(t.validity)),null!=t.sequence&&(n.uint32(40),n.uint64(t.sequence)),null!=t.ttl&&(n.uint32(48),n.uint64(t.ttl)),null!=t.pubKey&&(n.uint32(58),n.bytes(t.pubKey)),null!=t.signatureV2&&(n.uint32(66),n.bytes(t.signatureV2)),null!=t.data&&(n.uint32(74),n.bytes(t.data)),!1!==r.lengthDelimited&&n.ldelim()}),((t,n)=>{const r={},s=null==n?t.len:t.pos+n;for(;t.pos<s;){const n=t.uint32();switch(n>>>3){case 1:r.value=t.bytes();break;case 2:r.signatureV1=t.bytes();break;case 3:r.validityType=e.ValidityType.codec().decode(t);break;case 4:r.validity=t.bytes();break;case 5:r.sequence=t.uint64();break;case 6:r.ttl=t.uint64();break;case 7:r.pubKey=t.bytes();break;case 8:r.signatureV2=t.bytes();break;case 9:r.data=t.bytes();break;default:t.skipType(7&n)}}return r}))),n),e.encode=t=>Kt(t,e.codec()),e.decode=t=>W(t,e.codec())}(zl||(zl={}));const Wl=["string","number","bigint","symbol"],jl=["Function","Generator","AsyncGenerator","GeneratorFunction","AsyncGeneratorFunction","AsyncFunction","Observable","Array","Buffer","Object","RegExp","Date","Error","Map","Set","WeakMap","WeakSet","ArrayBuffer","SharedArrayBuffer","DataView","Promise","URL","HTMLElement","Int8Array","Uint8Array","Uint8ClampedArray","Int16Array","Uint16Array","Int32Array","Uint32Array","Float32Array","Float64Array","BigInt64Array","BigUint64Array"];function Gl(e){if(null===e)return"null";if(void 0===e)return"undefined";if(!0===e||!1===e)return"boolean";const t=typeof e;if(Wl.includes(t))return t;if("function"===t)return"Function";if(Array.isArray(e))return"Array";if(function(e){return e&&e.constructor&&e.constructor.isBuffer&&e.constructor.isBuffer.call(null,e)}(e))return"Buffer";const n=function(e){const t=Object.prototype.toString.call(e).slice(8,-1);if(jl.includes(t))return t;return}(e);return n||"Object"}class Yl{constructor(e,t,n){this.major=e,this.majorEncoded=e<<5,this.name=t,this.terminal=n}toString(){return`Type[${this.major}].${this.name}`}compare(e){return this.major<e.major?-1:this.major>e.major?1:0}}Yl.uint=new Yl(0,"uint",!0),Yl.negint=new Yl(1,"negint",!0),Yl.bytes=new Yl(2,"bytes",!0),Yl.string=new Yl(3,"string",!0),Yl.array=new Yl(4,"array",!1),Yl.map=new Yl(5,"map",!1),Yl.tag=new Yl(6,"tag",!1),Yl.float=new Yl(7,"float",!0),Yl.false=new Yl(7,"false",!0),Yl.true=new Yl(7,"true",!0),Yl.null=new Yl(7,"null",!0),Yl.undefined=new Yl(7,"undefined",!0),Yl.break=new Yl(7,"break",!0);class Ql{constructor(e,t,n){this.type=e,this.value=t,this.encodedLength=n,this.encodedBytes=void 0,this.byteValue=void 0}toString(){return`Token[${this.type}].${this.value}`}}const Jl=globalThis.process&&!globalThis.process.browser&&globalThis.Buffer&&"function"==typeof globalThis.Buffer.isBuffer,Zl=new TextDecoder,Xl=new TextEncoder;function eu(e){return Jl&&globalThis.Buffer.isBuffer(e)}const tu=Jl?(e,t,n)=>n-t>64?globalThis.Buffer.from(e.subarray(t,n)).toString("utf8"):iu(e,t,n):(e,t,n)=>n-t>64?Zl.decode(e.subarray(t,n)):iu(e,t,n),nu=Jl?e=>e.length>64?globalThis.Buffer.from(e):su(e):e=>e.length>64?Xl.encode(e):su(e),ru=Jl?(e,t,n)=>eu(e)?new Uint8Array(e.subarray(t,n)):e.slice(t,n):(e,t,n)=>e.slice(t,n);function su(e){const t=[];let n=0;for(let r=0;r<e.length;r++){let s=e.charCodeAt(r);s<128?t[n++]=s:s<2048?(t[n++]=s>>6|192,t[n++]=63&s|128):55296==(64512&s)&&r+1<e.length&&56320==(64512&e.charCodeAt(r+1))?(s=65536+((1023&s)<<10)+(1023&e.charCodeAt(++r)),t[n++]=s>>18|240,t[n++]=s>>12&63|128,t[n++]=s>>6&63|128,t[n++]=63&s|128):(t[n++]=s>>12|224,t[n++]=s>>6&63|128,t[n++]=63&s|128)}return t}function iu(e,t,n){const r=[];for(;t<n;){const s=e[t];let i=null,o=s>239?4:s>223?3:s>191?2:1;if(t+o<=n){let n,r,a,c;switch(o){case 1:s<128&&(i=s);break;case 2:n=e[t+1],128==(192&n)&&(c=(31&s)<<6|63&n,c>127&&(i=c));break;case 3:n=e[t+1],r=e[t+2],128==(192&n)&&128==(192&r)&&(c=(15&s)<<12|(63&n)<<6|63&r,c>2047&&(c<55296||c>57343)&&(i=c));break;case 4:n=e[t+1],r=e[t+2],a=e[t+3],128==(192&n)&&128==(192&r)&&128==(192&a)&&(c=(15&s)<<18|(63&n)<<12|(63&r)<<6|63&a,c>65535&&c<1114112&&(i=c))}}null===i?(i=65533,o=1):i>65535&&(i-=65536,r.push(i>>>10&1023|55296),i=56320|1023&i),r.push(i),t+=o}return function(e){const t=e.length;if(t<=ou)return String.fromCharCode.apply(String,e);let n="",r=0;for(;r<t;)n+=String.fromCharCode.apply(String,e.slice(r,r+=ou));return n}(r)}const ou=4096;const au="CBOR decode error:",cu="CBOR encode error:";function lu(e,t,n){if(e.length-t<n)throw new Error(`${au} not enough data for type`)}const uu=[24,256,65536,4294967296,BigInt("18446744073709551616")];function hu(e,t,n){lu(e,t,1);const r=e[t];if(!0===n.strict&&r<uu[0])throw new Error(`${au} integer encoded in more bytes than necessary (strict decode)`);return r}function du(e,t,n){lu(e,t,2);const r=e[t]<<8|e[t+1];if(!0===n.strict&&r<uu[1])throw new Error(`${au} integer encoded in more bytes than necessary (strict decode)`);return r}function pu(e,t,n){lu(e,t,4);const r=16777216*e[t]+(e[t+1]<<16)+(e[t+2]<<8)+e[t+3];if(!0===n.strict&&r<uu[2])throw new Error(`${au} integer encoded in more bytes than necessary (strict decode)`);return r}function fu(e,t,n){lu(e,t,8);const r=16777216*e[t]+(e[t+1]<<16)+(e[t+2]<<8)+e[t+3],s=16777216*e[t+4]+(e[t+5]<<16)+(e[t+6]<<8)+e[t+7],i=(BigInt(r)<<BigInt(32))+BigInt(s);if(!0===n.strict&&i<uu[3])throw new Error(`${au} integer encoded in more bytes than necessary (strict decode)`);if(i<=Number.MAX_SAFE_INTEGER)return Number(i);if(!0===n.allowBigInt)return i;throw new Error(`${au} integers outside of the safe integer range are not supported`)}function gu(e,t){return mu(e,0,t.value)}function mu(e,t,n){if(n<uu[0]){const r=Number(n);e.push([t|r])}else if(n<uu[1]){const r=Number(n);e.push([24|t,r])}else if(n<uu[2]){const r=Number(n);e.push([25|t,r>>>8,255&r])}else if(n<uu[3]){const r=Number(n);e.push([26|t,r>>>24&255,r>>>16&255,r>>>8&255,255&r])}else{const r=BigInt(n);if(!(r<uu[4]))throw new Error(`${au} encountered BigInt larger than allowable range`);{const n=[27|t,0,0,0,0,0,0,0];let s=Number(r&BigInt(4294967295)),i=Number(r>>BigInt(32)&BigInt(4294967295));n[8]=255&s,s>>=8,n[7]=255&s,s>>=8,n[6]=255&s,s>>=8,n[5]=255&s,n[4]=255&i,i>>=8,n[3]=255&i,i>>=8,n[2]=255&i,i>>=8,n[1]=255&i,e.push(n)}}}gu.encodedSize=function(e){return mu.encodedSize(e.value)},mu.encodedSize=function(e){return e<uu[0]?1:e<uu[1]?2:e<uu[2]?3:e<uu[3]?5:9},gu.compareTokens=function(e,t){return e.value<t.value?-1:e.value>t.value?1:0};const yu=BigInt(-1),wu=BigInt(1);function bu(e,t){const n=t.value,r="bigint"==typeof n?n*yu-wu:-1*n-1;mu(e,t.type.majorEncoded,r)}function vu(e,t,n,r){lu(e,t,n+r);const s=ru(e,t+n,t+n+r);return new Ql(Yl.bytes,s,n+r)}function Eu(e,t,n,r){return vu(e,t,1,n)}function Su(e){return void 0===e.encodedBytes&&(e.encodedBytes=e.type===Yl.string?nu(e.value):e.value),e.encodedBytes}function _u(e,t){const n=Su(t);mu(e,t.type.majorEncoded,n.length),e.push(n)}function Iu(e,t,n,r,s){const i=n+r;lu(e,t,i);const o=new Ql(Yl.string,tu(e,t+n,t+i),i);return!0===s.retainStringBytes&&(o.byteValue=ru(e,t+n,t+i)),o}function Ru(e,t,n,r){return Iu(e,t,1,n,r)}bu.encodedSize=function(e){const t=e.value,n="bigint"==typeof t?t*yu-wu:-1*t-1;return n<uu[0]?1:n<uu[1]?2:n<uu[2]?3:n<uu[3]?5:9},bu.compareTokens=function(e,t){return e.value<t.value?1:e.value>t.value?-1:0},_u.encodedSize=function(e){const t=Su(e);return mu.encodedSize(t.length)+t.length},_u.compareTokens=function(e,t){return n=Su(e),r=Su(t),n.length<r.length?-1:n.length>r.length?1:function(e,t){if(eu(e)&&eu(t))return e.compare(t);for(let n=0;n<e.length;n++)if(e[n]!==t[n])return e[n]<t[n]?-1:1;return 0}(n,r);var n,r};const Au=_u;function Tu(e,t,n,r){return new Ql(Yl.array,r,n)}function Du(e,t,n,r){return Tu(0,0,1,n)}function ku(e,t){mu(e,Yl.array.majorEncoded,t.value)}function Pu(e,t,n,r){return new Ql(Yl.map,r,n)}function Cu(e,t,n,r){return Pu(0,0,1,n)}function xu(e,t){mu(e,Yl.map.majorEncoded,t.value)}function Nu(e,t,n,r){return new Ql(Yl.tag,n,1)}function Mu(e,t){mu(e,Yl.tag.majorEncoded,t.value)}ku.compareTokens=gu.compareTokens,ku.encodedSize=function(e){return mu.encodedSize(e.value)},xu.compareTokens=gu.compareTokens,xu.encodedSize=function(e){return mu.encodedSize(e.value)},Mu.compareTokens=gu.compareTokens,Mu.encodedSize=function(e){return mu.encodedSize(e.value)};const Ou=20,Lu=21,Bu=22,Uu=23;function Fu(e,t,n){if(n){if(!1===n.allowNaN&&Number.isNaN(e))throw new Error(`${au} NaN values are not supported`);if(!1===n.allowInfinity&&(e===1/0||e===-1/0))throw new Error(`${au} Infinity values are not supported`)}return new Ql(Yl.float,e,t)}function Vu(e,t,n){const r=t.value;if(!1===r)e.push([Yl.float.majorEncoded|Ou]);else if(!0===r)e.push([Yl.float.majorEncoded|Lu]);else if(null===r)e.push([Yl.float.majorEncoded|Bu]);else if(void 0===r)e.push([Yl.float.majorEncoded|Uu]);else{let t,i=!1;n&&!0===n.float64||(Hu(r),t=zu(qu,1),r===t||Number.isNaN(r)?(qu[0]=249,e.push(qu.slice(0,3)),i=!0):(Wu(r),t=ju(qu,1),r===t&&(qu[0]=250,e.push(qu.slice(0,5)),i=!0))),i||(s=r,$u.setFloat64(0,s,!1),t=Gu(qu,1),qu[0]=251,e.push(qu.slice(0,9)))}var s}Vu.encodedSize=function(e,t){const n=e.value;if(!1===n||!0===n||null==n)return 1;if(!t||!0!==t.float64){Hu(n);let e=zu(qu,1);if(n===e||Number.isNaN(n))return 3;if(Wu(n),e=ju(qu,1),n===e)return 5}return 9};const Ku=new ArrayBuffer(9),$u=new DataView(Ku,1),qu=new Uint8Array(Ku,0);function Hu(e){if(e===1/0)$u.setUint16(0,31744,!1);else if(e===-1/0)$u.setUint16(0,64512,!1);else if(Number.isNaN(e))$u.setUint16(0,32256,!1);else{$u.setFloat32(0,e);const t=$u.getUint32(0),n=(2139095040&t)>>23,r=8388607&t;if(255===n)$u.setUint16(0,31744,!1);else if(0===n)$u.setUint16(0,(2147483648&e)>>16|r>>13,!1);else{const e=n-127;e<-24?$u.setUint16(0,0):e<-14?$u.setUint16(0,(2147483648&t)>>16|1<<24+e,!1):$u.setUint16(0,(2147483648&t)>>16|e+15<<10|r>>13,!1)}}}function zu(e,t){if(e.length-t<2)throw new Error(`${au} not enough data for float16`);const n=(e[t]<<8)+e[t+1];if(31744===n)return 1/0;if(64512===n)return-1/0;if(32256===n)return NaN;const r=n>>10&31,s=1023&n;let i;return i=0===r?s*2**-24:31!==r?(s+1024)*2**(r-25):0===s?1/0:NaN,32768&n?-i:i}function Wu(e){$u.setFloat32(0,e,!1)}function ju(e,t){if(e.length-t<4)throw new Error(`${au} not enough data for float32`);const n=(e.byteOffset||0)+t;return new DataView(e.buffer,n,4).getFloat32(0,!1)}function Gu(e,t){if(e.length-t<8)throw new Error(`${au} not enough data for float64`);const n=(e.byteOffset||0)+t;return new DataView(e.buffer,n,8).getFloat64(0,!1)}function Yu(e,t,n){throw new Error(`${au} encountered invalid minor (${n}) for major ${e[t]>>>5}`)}function Qu(e){return()=>{throw new Error(`${au} ${e}`)}}Vu.compareTokens=gu.compareTokens;const Ju=[];for(let e=0;e<=23;e++)Ju[e]=Yu;Ju[24]=function(e,t,n,r){return new Ql(Yl.uint,hu(e,t+1,r),2)},Ju[25]=function(e,t,n,r){return new Ql(Yl.uint,du(e,t+1,r),3)},Ju[26]=function(e,t,n,r){return new Ql(Yl.uint,pu(e,t+1,r),5)},Ju[27]=function(e,t,n,r){return new Ql(Yl.uint,fu(e,t+1,r),9)},Ju[28]=Yu,Ju[29]=Yu,Ju[30]=Yu,Ju[31]=Yu;for(let e=32;e<=55;e++)Ju[e]=Yu;Ju[56]=function(e,t,n,r){return new Ql(Yl.negint,-1-hu(e,t+1,r),2)},Ju[57]=function(e,t,n,r){return new Ql(Yl.negint,-1-du(e,t+1,r),3)},Ju[58]=function(e,t,n,r){return new Ql(Yl.negint,-1-pu(e,t+1,r),5)},Ju[59]=function(e,t,n,r){const s=fu(e,t+1,r);if("bigint"!=typeof s){const e=-1-s;if(e>=Number.MIN_SAFE_INTEGER)return new Ql(Yl.negint,e,9)}if(!0!==r.allowBigInt)throw new Error(`${au} integers outside of the safe integer range are not supported`);return new Ql(Yl.negint,yu-BigInt(s),9)},Ju[60]=Yu,Ju[61]=Yu,Ju[62]=Yu,Ju[63]=Yu;for(let e=64;e<=87;e++)Ju[e]=Eu;Ju[88]=function(e,t,n,r){return vu(e,t,2,hu(e,t+1,r))},Ju[89]=function(e,t,n,r){return vu(e,t,3,du(e,t+1,r))},Ju[90]=function(e,t,n,r){return vu(e,t,5,pu(e,t+1,r))},Ju[91]=function(e,t,n,r){const s=fu(e,t+1,r);if("bigint"==typeof s)throw new Error(`${au} 64-bit integer bytes lengths not supported`);return vu(e,t,9,s)},Ju[92]=Yu,Ju[93]=Yu,Ju[94]=Yu,Ju[95]=Qu("indefinite length bytes/strings are not supported");for(let e=96;e<=119;e++)Ju[e]=Ru;Ju[120]=function(e,t,n,r){return Iu(e,t,2,hu(e,t+1,r),r)},Ju[121]=function(e,t,n,r){return Iu(e,t,3,du(e,t+1,r),r)},Ju[122]=function(e,t,n,r){return Iu(e,t,5,pu(e,t+1,r),r)},Ju[123]=function(e,t,n,r){const s=fu(e,t+1,r);if("bigint"==typeof s)throw new Error(`${au} 64-bit integer string lengths not supported`);return Iu(e,t,9,s,r)},Ju[124]=Yu,Ju[125]=Yu,Ju[126]=Yu,Ju[127]=Qu("indefinite length bytes/strings are not supported");for(let e=128;e<=151;e++)Ju[e]=Du;Ju[152]=function(e,t,n,r){return Tu(0,0,2,hu(e,t+1,r))},Ju[153]=function(e,t,n,r){return Tu(0,0,3,du(e,t+1,r))},Ju[154]=function(e,t,n,r){return Tu(0,0,5,pu(e,t+1,r))},Ju[155]=function(e,t,n,r){const s=fu(e,t+1,r);if("bigint"==typeof s)throw new Error(`${au} 64-bit integer array lengths not supported`);return Tu(0,0,9,s)},Ju[156]=Yu,Ju[157]=Yu,Ju[158]=Yu,Ju[159]=function(e,t,n,r){if(!1===r.allowIndefinite)throw new Error(`${au} indefinite length items not allowed`);return Tu(0,0,1,1/0)};for(let e=160;e<=183;e++)Ju[e]=Cu;Ju[184]=function(e,t,n,r){return Pu(0,0,2,hu(e,t+1,r))},Ju[185]=function(e,t,n,r){return Pu(0,0,3,du(e,t+1,r))},Ju[186]=function(e,t,n,r){return Pu(0,0,5,pu(e,t+1,r))},Ju[187]=function(e,t,n,r){const s=fu(e,t+1,r);if("bigint"==typeof s)throw new Error(`${au} 64-bit integer map lengths not supported`);return Pu(0,0,9,s)},Ju[188]=Yu,Ju[189]=Yu,Ju[190]=Yu,Ju[191]=function(e,t,n,r){if(!1===r.allowIndefinite)throw new Error(`${au} indefinite length items not allowed`);return Pu(0,0,1,1/0)};for(let e=192;e<=215;e++)Ju[e]=Nu;Ju[216]=function(e,t,n,r){return new Ql(Yl.tag,hu(e,t+1,r),2)},Ju[217]=function(e,t,n,r){return new Ql(Yl.tag,du(e,t+1,r),3)},Ju[218]=function(e,t,n,r){return new Ql(Yl.tag,pu(e,t+1,r),5)},Ju[219]=function(e,t,n,r){return new Ql(Yl.tag,fu(e,t+1,r),9)},Ju[220]=Yu,Ju[221]=Yu,Ju[222]=Yu,Ju[223]=Yu;for(let e=224;e<=243;e++)Ju[e]=Qu("simple values are not supported");Ju[244]=Yu,Ju[245]=Yu,Ju[246]=Yu,Ju[247]=function(e,t,n,r){if(!1===r.allowUndefined)throw new Error(`${au} undefined values are not supported`);return!0===r.coerceUndefinedToNull?new Ql(Yl.null,null,1):new Ql(Yl.undefined,void 0,1)},Ju[248]=Qu("simple values are not supported"),Ju[249]=function(e,t,n,r){return Fu(zu(e,t+1),3,r)},Ju[250]=function(e,t,n,r){return Fu(ju(e,t+1),5,r)},Ju[251]=function(e,t,n,r){return Fu(Gu(e,t+1),9,r)},Ju[252]=Yu,Ju[253]=Yu,Ju[254]=Yu,Ju[255]=function(e,t,n,r){if(!1===r.allowIndefinite)throw new Error(`${au} indefinite length items not allowed`);return new Ql(Yl.break,void 0,1)};const Zu=[];for(let e=0;e<24;e++)Zu[e]=new Ql(Yl.uint,e,1);for(let e=-1;e>=-24;e--)Zu[31-e]=new Ql(Yl.negint,e,1);Zu[64]=new Ql(Yl.bytes,new Uint8Array(0),1),Zu[96]=new Ql(Yl.string,"",1),Zu[128]=new Ql(Yl.array,0,1),Zu[160]=new Ql(Yl.map,0,1),Zu[244]=new Ql(Yl.false,!1,1),Zu[245]=new Ql(Yl.true,!0,1),Zu[246]=new Ql(Yl.null,null,1),function(){const e=[];e[Yl.uint.major]=gu,e[Yl.negint.major]=bu,e[Yl.bytes.major]=_u,e[Yl.string.major]=Au,e[Yl.array.major]=ku,e[Yl.map.major]=xu,e[Yl.tag.major]=Mu,e[Yl.float.major]=Vu}();class Xu{constructor(e,t){this.obj=e,this.parent=t}includes(e){let t=this;do{if(t.obj===e)return!0}while(t=t.parent);return!1}static createCheck(e,t){if(e&&e.includes(t))throw new Error(`${cu} object contains circular references`);return new Xu(t,e)}}const eh={null:new Ql(Yl.null,null),undefined:new Ql(Yl.undefined,void 0),true:new Ql(Yl.true,!0),false:new Ql(Yl.false,!1),emptyArray:new Ql(Yl.array,0),emptyMap:new Ql(Yl.map,0)},th={number:(e,t,n,r)=>Number.isInteger(e)&&Number.isSafeInteger(e)?new Ql(e>=0?Yl.uint:Yl.negint,e):new Ql(Yl.float,e),bigint:(e,t,n,r)=>e>=BigInt(0)?new Ql(Yl.uint,e):new Ql(Yl.negint,e),Uint8Array:(e,t,n,r)=>new Ql(Yl.bytes,e),string:(e,t,n,r)=>new Ql(Yl.string,e),boolean:(e,t,n,r)=>e?eh.true:eh.false,null:(e,t,n,r)=>eh.null,undefined:(e,t,n,r)=>eh.undefined,ArrayBuffer:(e,t,n,r)=>new Ql(Yl.bytes,new Uint8Array(e)),DataView:(e,t,n,r)=>new Ql(Yl.bytes,new Uint8Array(e.buffer,e.byteOffset,e.byteLength)),Array(e,t,n,r){if(!e.length)return!0===n.addBreakTokens?[eh.emptyArray,new Ql(Yl.break)]:eh.emptyArray;r=Xu.createCheck(r,e);const s=[];let i=0;for(const t of e)s[i++]=nh(t,n,r);return n.addBreakTokens?[new Ql(Yl.array,e.length),s,new Ql(Yl.break)]:[new Ql(Yl.array,e.length),s]},Object(e,t,n,r){const s="Object"!==t,i=s?e.keys():Object.keys(e),o=s?e.size:i.length;if(!o)return!0===n.addBreakTokens?[eh.emptyMap,new Ql(Yl.break)]:eh.emptyMap;r=Xu.createCheck(r,e);const a=[];let c=0;for(const t of i)a[c++]=[nh(t,n,r),nh(s?e.get(t):e[t],n,r)];return function(e,t){t.mapSorter&&e.sort(t.mapSorter)}(a,n),n.addBreakTokens?[new Ql(Yl.map,o),a,new Ql(Yl.break)]:[new Ql(Yl.map,o),a]}};th.Map=th.Object,th.Buffer=th.Uint8Array;for(const e of"Uint8Clamped Uint16 Uint32 Int8 Int16 Int32 BigUint64 BigInt64 Float32 Float64".split(" "))th[`${e}Array`]=th.DataView;function nh(e,t={},n){const r=Gl(e),s=t&&t.typeEncoders&&t.typeEncoders[r]||th[r];if("function"==typeof s){const i=s(e,r,t,n);if(null!=i)return i}const i=th[r];if(!i)throw new Error(`${cu} unsupported type: ${r}`);return i(e,r,t,n)}const rh={strict:!1,allowIndefinite:!0,allowUndefined:!0,allowBigInt:!0};class sh{constructor(e,t={}){this._pos=0,this.data=e,this.options=t}pos(){return this._pos}done(){return this._pos>=this.data.length}next(){const e=this.data[this._pos];let t=Zu[e];if(void 0===t){const n=Ju[e];if(!n)throw new Error(`${au} no decoder for major type ${e>>>5} (byte 0x${e.toString(16).padStart(2,"0")})`);const r=31&e;t=n(this.data,this._pos,r,this.options)}return this._pos+=t.encodedLength,t}}const ih=Symbol.for("DONE"),oh=Symbol.for("BREAK");function ah(e,t){if(e.done())return ih;const n=e.next();if(n.type===Yl.break)return oh;if(n.type.terminal)return n.value;if(n.type===Yl.array)return function(e,t,n){const r=[];for(let s=0;s<e.value;s++){const i=ah(t,n);if(i===oh){if(e.value===1/0)break;throw new Error(`${au} got unexpected break to lengthed array`)}if(i===ih)throw new Error(`${au} found array but not enough entries (got ${s}, expected ${e.value})`);r[s]=i}return r}(n,e,t);if(n.type===Yl.map)return function(e,t,n){const r=!0===n.useMaps,s=r?void 0:{},i=r?new Map:void 0;for(let o=0;o<e.value;o++){const a=ah(t,n);if(a===oh){if(e.value===1/0)break;throw new Error(`${au} got unexpected break to lengthed map`)}if(a===ih)throw new Error(`${au} found map but not enough entries (got ${o} [no key], expected ${e.value})`);if(!0!==r&&"string"!=typeof a)throw new Error(`${au} non-string keys not supported (got ${typeof a})`);if(!0===n.rejectDuplicateMapKeys&&(r&&i.has(a)||!r&&a in s))throw new Error(`${au} found repeat map key "${a}"`);const c=ah(t,n);if(c===ih)throw new Error(`${au} found map but not enough entries (got ${o} [no value], expected ${e.value})`);r?i.set(a,c):s[a]=c}return r?i:s}(n,e,t);if(n.type===Yl.tag){if(t.tags&&"function"==typeof t.tags[n.value]){const r=ah(e,t);return t.tags[n.value](r)}throw new Error(`${au} tag not supported (${n.value})`)}throw new Error("unsupported")}function ch(e,t){const[n,r]=function(e,t){if(!(e instanceof Uint8Array))throw new Error(`${au} data to decode must be a Uint8Array`);const n=(t=Object.assign({},rh,t)).tokenizer||new sh(e,t),r=ah(n,t);if(r===ih)throw new Error(`${au} did not find any content to decode`);if(r===oh)throw new Error(`${au} got unexpected break`);return[r,e.subarray(n.pos())]}(e,t);if(r.length>0)throw new Error(`${au} too many terminals, data makes no sense`);return n}const lh=ls("ipns:utils"),uh=Tt("/ipns/"),hh=e=>"signatureV1"in e?zl.encode({value:Tt(e.value),signatureV1:e.signatureV1,validityType:e.validityType,validity:Tt(e.validity),sequence:e.sequence,ttl:e.ttl,pubKey:e.pubKey,signatureV2:e.signatureV2,data:e.data}):zl.encode({pubKey:e.pubKey,signatureV2:e.signatureV2,data:e.data});function dh(e){const t=zl.decode(e);if(null!=t.sequence&&(t.sequence=BigInt(t.sequence)),null!=t.ttl&&(t.ttl=BigInt(t.ttl)),null==t.signatureV2||null==t.data)throw Ur(new Error("missing data or signatureV2"),ql);const n=ph(t.data),r=fh(n.Value),s=Gt(n.Validity);if(null!=t.value&&null!=t.signatureV1)return gh(t),{value:r,validityType:zl.ValidityType.EOL,validity:s,sequence:n.Sequence,ttl:n.TTL,pubKey:t.pubKey,signatureV1:t.signatureV1,signatureV2:t.signatureV2,data:t.data};if(null!=t.signatureV2)return{value:r,validityType:zl.ValidityType.EOL,validity:s,sequence:n.Sequence,ttl:n.TTL,pubKey:t.pubKey,signatureV2:t.signatureV2,data:t.data};throw new Error("invalid record: does not include signatureV1 or signatureV2")}const ph=e=>{const t=ch(e);if(0!==t.ValidityType)throw Ur(new Error("Unknown validity type"),$l);return t.ValidityType=zl.ValidityType.EOL,Number.isInteger(t.Sequence)&&(t.Sequence=BigInt(t.Sequence)),Number.isInteger(t.TTL)&&(t.TTL=BigInt(t.TTL)),t},fh=e=>{if(null!=e){if(rn(e))return`/ipns/${e.toCID().toString(Ae)}`;if(e instanceof Uint8Array){const t=Gt(e);t.startsWith("/")&&(e=t)}const t=e.toString().trim();if(t.startsWith("/")&&t.length>1)return t;const n=yt.asCID(e);if(null!=n)return 114===n.code?`/ipns/${n.toString(Ae)}`:`/ipfs/${n.toV1().toString()}`;try{return e instanceof Uint8Array?`/ipfs/${yt.decode(e).toV1().toString()}`:`/ipfs/${yt.parse(t).toV1().toString()}`}catch{}}throw Ur(new Error("Value must be a valid content path starting with /"),"ERR_INVALID_VALUE")},gh=e=>{if(null==e.data)throw Ur(new Error("Record data is missing"),"ERR_INVALID_RECORD_DATA");const t=ph(e.data);if(!Sn(t.Value,e.value??new Uint8Array(0)))throw Ur(new Error('Field "value" did not match between protobuf and CBOR'),ql);if(!Sn(t.Validity,e.validity??new Uint8Array(0)))throw Ur(new Error('Field "validity" did not match between protobuf and CBOR'),ql);if(t.ValidityType!==e.validityType)throw Ur(new Error('Field "validityType" did not match between protobuf and CBOR'),ql);if(t.Sequence!==e.sequence)throw Ur(new Error('Field "sequence" did not match between protobuf and CBOR'),ql);if(t.TTL!==e.ttl)throw Ur(new Error('Field "ttl" did not match between protobuf and CBOR'),ql)},mh=ls("ipns:validator"),yh=async(e,t)=>{const n=dh(t);let r;try{const t=(s=n.data,_n([Tt("ipns-signature:"),s]));r=await e.verify(t,n.signatureV2)}catch(e){r=!1}var s;if(!r)throw mh.error("record signature verification failed"),Ur(new Error("record signature verification failed"),ql);if(n.validityType===zl.ValidityType.EOL){if(Kl.fromString(n.validity).toDate().getTime()<Date.now())throw mh.error("record has expired"),Ur(new Error("record has expired"),"ERR_IPNS_EXPIRED_RECORD")}else if(null!=n.validityType)throw mh.error("unrecognized validity type"),Ur(new Error("unrecognized validity type"),$l);mh("ipns record for %s is valid",n.value)};async function wh(e,t){if(t.byteLength>10240)throw Ur(new Error("record too large"),"ERR_RECORD_TOO_LARGE");const n=(e=>vs(e.slice(uh.length)))(e),r=dh(t),s=await(async(e,t)=>{if(null==t||null==e){const e=new Error("one or more of the provided parameters are not defined");throw lh.error(e),Ur(e,Hl)}let n;if(null!=t.pubKey){try{n=Ll(t.pubKey)}catch(e){throw lh.error(e),e}if(!(await Es(t.pubKey)).equals(e))throw Ur(new Error("Embedded public key did not match PeerID"),"ERR_INVALID_EMBEDDED_KEY")}else null!=e.publicKey&&(n=Ll(e.publicKey));if(null!=n)return n;throw Ur(new Error("no public key is available"),Hl)})(n,r);await yh(s,t)}async function*bh(e){const t=/\r?\n/,n=new TextDecoder("utf8");let r="";for await(let s of e){"string"==typeof s&&(s=(new TextEncoder).encode(s)),r+=n.decode(s,{stream:!0});const e=r.split(t);r=e.pop()??"";for(let t=0;t<e.length;t++)yield JSON.parse(e[t])}r+=n.decode(),""!==r&&(yield JSON.parse(r))}var vh={exports:{}};!function(e){var t=Object.prototype.hasOwnProperty,n="~";function r(){}function s(e,t,n){this.fn=e,this.context=t,this.once=n||!1}function i(e,t,r,i,o){if("function"!=typeof r)throw new TypeError("The listener must be a function");var a=new s(r,i||e,o),c=n?n+t:t;return e._events[c]?e._events[c].fn?e._events[c]=[e._events[c],a]:e._events[c].push(a):(e._events[c]=a,e._eventsCount++),e}function o(e,t){0==--e._eventsCount?e._events=new r:delete e._events[t]}function a(){this._events=new r,this._eventsCount=0}Object.create&&(r.prototype=Object.create(null),(new r).__proto__||(n=!1)),a.prototype.eventNames=function(){var e,r,s=[];if(0===this._eventsCount)return s;for(r in e=this._events)t.call(e,r)&&s.push(n?r.slice(1):r);return Object.getOwnPropertySymbols?s.concat(Object.getOwnPropertySymbols(e)):s},a.prototype.listeners=function(e){var t=n?n+e:e,r=this._events[t];if(!r)return[];if(r.fn)return[r.fn];for(var s=0,i=r.length,o=new Array(i);s<i;s++)o[s]=r[s].fn;return o},a.prototype.listenerCount=function(e){var t=n?n+e:e,r=this._events[t];return r?r.fn?1:r.length:0},a.prototype.emit=function(e,t,r,s,i,o){var a=n?n+e:e;if(!this._events[a])return!1;var c,l,u=this._events[a],h=arguments.length;if(u.fn){switch(u.once&&this.removeListener(e,u.fn,void 0,!0),h){case 1:return u.fn.call(u.context),!0;case 2:return u.fn.call(u.context,t),!0;case 3:return u.fn.call(u.context,t,r),!0;case 4:return u.fn.call(u.context,t,r,s),!0;case 5:return u.fn.call(u.context,t,r,s,i),!0;case 6:return u.fn.call(u.context,t,r,s,i,o),!0}for(l=1,c=new Array(h-1);l<h;l++)c[l-1]=arguments[l];u.fn.apply(u.context,c)}else{var d,p=u.length;for(l=0;l<p;l++)switch(u[l].once&&this.removeListener(e,u[l].fn,void 0,!0),h){case 1:u[l].fn.call(u[l].context);break;case 2:u[l].fn.call(u[l].context,t);break;case 3:u[l].fn.call(u[l].context,t,r);break;case 4:u[l].fn.call(u[l].context,t,r,s);break;default:if(!c)for(d=1,c=new Array(h-1);d<h;d++)c[d-1]=arguments[d];u[l].fn.apply(u[l].context,c)}}return!0},a.prototype.on=function(e,t,n){return i(this,e,t,n,!1)},a.prototype.once=function(e,t,n){return i(this,e,t,n,!0)},a.prototype.removeListener=function(e,t,r,s){var i=n?n+e:e;if(!this._events[i])return this;if(!t)return o(this,i),this;var a=this._events[i];if(a.fn)a.fn!==t||s&&!a.once||r&&a.context!==r||o(this,i);else{for(var c=0,l=[],u=a.length;c<u;c++)(a[c].fn!==t||s&&!a[c].once||r&&a[c].context!==r)&&l.push(a[c]);l.length?this._events[i]=1===l.length?l[0]:l:o(this,i)}return this},a.prototype.removeAllListeners=function(e){var t;return e?(t=n?n+e:e,this._events[t]&&o(this,t)):(this._events=new r,this._eventsCount=0),this},a.prototype.off=a.prototype.removeListener,a.prototype.addListener=a.prototype.on,a.prefixed=n,a.EventEmitter=a,e.exports=a}(vh);var Eh=Or(vh.exports);class Sh extends Error{constructor(e){super(e),this.name="TimeoutError"}}let _h=class extends Error{constructor(e){super(),this.name="AbortError",this.message=e}};const Ih=e=>void 0===globalThis.DOMException?new _h(e):new DOMException(e),Rh=e=>{const t=void 0===e.reason?Ih("This operation was aborted."):e.reason;return t instanceof Error?t:Ih(t)};function Ah(e,t){const{milliseconds:n,fallback:r,message:s,customTimers:i={setTimeout:setTimeout,clearTimeout:clearTimeout}}=t;let o;const a=new Promise(((a,c)=>{if("number"!=typeof n||1!==Math.sign(n))throw new TypeError(`Expected \`milliseconds\` to be a positive number, got \`${n}\``);if(t.signal){const{signal:e}=t;e.aborted&&c(Rh(e)),e.addEventListener("abort",(()=>{c(Rh(e))}))}if(n===Number.POSITIVE_INFINITY)return void e.then(a,c);const l=new Sh;o=i.setTimeout.call(void 0,(()=>{if(r)try{a(r())}catch(e){c(e)}else"function"==typeof e.cancel&&e.cancel(),!1===s?a():s instanceof Error?c(s):(l.message=s??`Promise timed out after ${n} milliseconds`,c(l))}),n),(async()=>{try{a(await e)}catch(e){c(e)}})()})).finally((()=>{a.clear()}));return a.clear=()=>{i.clearTimeout.call(void 0,o),o=void 0},a}let Th=class{#i=[];enqueue(e,t){const n={priority:(t={priority:0,...t}).priority,run:e};if(this.size&&this.#i[this.size-1].priority>=t.priority)return void this.#i.push(n);const r=function(e,t,n){let r=0,s=e.length;for(;s>0;){const i=Math.trunc(s/2);let o=r+i;n(e[o],t)<=0?(r=++o,s-=i+1):s=i}return r}(this.#i,n,((e,t)=>t.priority-e.priority));this.#i.splice(r,0,n)}dequeue(){const e=this.#i.shift();return e?.run}filter(e){return this.#i.filter((t=>t.priority===e.priority)).map((e=>e.run))}get size(){return this.#i.length}};class Dh extends Eh{#o;#a;#c=0;#l;#u;#h=0;#d;#p;#i;#f;#g=0;#m;#y;#w;timeout;constructor(e){if(super(),!("number"==typeof(e={carryoverConcurrencyCount:!1,intervalCap:Number.POSITIVE_INFINITY,interval:0,concurrency:Number.POSITIVE_INFINITY,autoStart:!0,queueClass:Th,...e}).intervalCap&&e.intervalCap>=1))throw new TypeError(`Expected \`intervalCap\` to be a number from 1 and up, got \`${e.intervalCap?.toString()??""}\` (${typeof e.intervalCap})`);if(void 0===e.interval||!(Number.isFinite(e.interval)&&e.interval>=0))throw new TypeError(`Expected \`interval\` to be a finite number >= 0, got \`${e.interval?.toString()??""}\` (${typeof e.interval})`);this.#o=e.carryoverConcurrencyCount,this.#a=e.intervalCap===Number.POSITIVE_INFINITY||0===e.interval,this.#l=e.intervalCap,this.#u=e.interval,this.#i=new e.queueClass,this.#f=e.queueClass,this.concurrency=e.concurrency,this.timeout=e.timeout,this.#w=!0===e.throwOnTimeout,this.#y=!1===e.autoStart}get#b(){return this.#a||this.#c<this.#l}get#v(){return this.#g<this.#m}#E(){this.#g--,this.#S(),this.emit("next")}#_(){this.#I(),this.#R(),this.#p=void 0}get#A(){const e=Date.now();if(void 0===this.#d){const t=this.#h-e;if(!(t<0))return void 0===this.#p&&(this.#p=setTimeout((()=>{this.#_()}),t)),!0;this.#c=this.#o?this.#g:0}return!1}#S(){if(0===this.#i.size)return this.#d&&clearInterval(this.#d),this.#d=void 0,this.emit("empty"),0===this.#g&&this.emit("idle"),!1;if(!this.#y){const e=!this.#A;if(this.#b&&this.#v){const t=this.#i.dequeue();return!!t&&(this.emit("active"),t(),e&&this.#R(),!0)}}return!1}#R(){this.#a||void 0!==this.#d||(this.#d=setInterval((()=>{this.#I()}),this.#u),this.#h=Date.now()+this.#u)}#I(){0===this.#c&&0===this.#g&&this.#d&&(clearInterval(this.#d),this.#d=void 0),this.#c=this.#o?this.#g:0,this.#T()}#T(){for(;this.#S(););}get concurrency(){return this.#m}set concurrency(e){if(!("number"==typeof e&&e>=1))throw new TypeError(`Expected \`concurrency\` to be a number from 1 and up, got \`${e}\` (${typeof e})`);this.#m=e,this.#T()}async#D(e){return new Promise(((t,n)=>{e.addEventListener("abort",(()=>{n(e.reason)}),{once:!0})}))}async add(e,t={}){return t={timeout:this.timeout,throwOnTimeout:this.#w,...t},new Promise(((n,r)=>{this.#i.enqueue((async()=>{this.#g++,this.#c++;try{t.signal?.throwIfAborted();let r=e({signal:t.signal});t.timeout&&(r=Ah(Promise.resolve(r),{milliseconds:t.timeout})),t.signal&&(r=Promise.race([r,this.#D(t.signal)]));const s=await r;n(s),this.emit("completed",s)}catch(e){if(e instanceof Sh&&!t.throwOnTimeout)return void n();r(e),this.emit("error",e)}finally{this.#E()}}),t),this.emit("add"),this.#S()}))}async addAll(e,t){return Promise.all(e.map((async e=>this.add(e,t))))}start(){return this.#y?(this.#y=!1,this.#T(),this):this}pause(){this.#y=!0}clear(){this.#i=new this.#f}async onEmpty(){0!==this.#i.size&&await this.#k("empty")}async onSizeLessThan(e){this.#i.size<e||await this.#k("next",(()=>this.#i.size<e))}async onIdle(){0===this.#g&&0===this.#i.size||await this.#k("idle")}async#k(e,t){return new Promise((n=>{const r=()=>{t&&!t()||(this.off(e,r),n())};this.on(e,r)}))}get size(){return this.#i.size}sizeBy(e){return this.#i.filter(e).length}get pending(){return this.#g}get isPaused(){return this.#y}}function kh(e){if(null!=e[Symbol.asyncIterator])return(async()=>{for await(const t of e)return t})();for(const t of e)return t}const Ph=Tt("/ipns/");function Ch(e){return Sn(e.subarray(0,Ph.byteLength),Ph)}const xh=e=>vs(e.slice(Ph.length));class Nh{client;constructor(e){this.client=e}async*findProviders(e,t={}){yield*qr(this.client.getProviders(e,t),(e=>({id:e.ID,multiaddrs:e.Addrs??[]})))}async provide(){}async put(e,t,n){if(!Ch(e))return;const r=xh(e),s=dh(t);await this.client.putIPNS(r,s,n)}async get(e,t){if(!Ch(e))throw new dn("Not found","ERR_NOT_FOUND");const n=xh(e);try{const e=await this.client.getIPNS(n,t);return hh(e)}catch(e){if("ERR_BAD_RESPONSE"===e.code)throw new dn("Not found","ERR_NOT_FOUND");throw e}}}class Mh{client;constructor(e){this.client=e}async findPeer(e,t={}){const n=await kh(this.client.getPeers(e,t));if(null!=n)return{id:n.ID,multiaddrs:n.Addrs??[]};throw new dn("Not found","ERR_NOT_FOUND")}async*getClosestPeers(e,t={}){}}const Oh=ls("delegated-routing-v1-http-api-client"),Lh=4,Bh=3e4;class Uh{started;httpQueue;shutDownController;clientUrl;timeout;contentRouting;peerRouting;constructor(e,t={}){this.started=!1,this.shutDownController=new AbortController,this.shutDownController.signal,this.httpQueue=new Dh({concurrency:t.concurrentRequests??Lh}),this.clientUrl=e instanceof URL?e:new URL(e),this.timeout=t.timeout??Bh,this.contentRouting=new Nh(this),this.peerRouting=new Mh(this)}get[en](){return this.contentRouting}get[sn](){return this.peerRouting}isStarted(){return this.started}start(){this.started=!0}stop(){this.httpQueue.clear(),this.shutDownController.abort(),this.started=!1}async*getProviders(e,t={}){Oh("getProviders starts: %c",e);const n=AbortSignal.timeout(this.timeout),r=Ss([this.shutDownController.signal,n,t.signal]),s=ar(),i=ar();this.httpQueue.add((async()=>(s.resolve(),i.promise)));try{await s.promise;const t=`${this.clientUrl}routing/v1/providers/${e.toString()}`,n={headers:{Accept:"application/x-ndjson"},signal:r},i=await fetch(t,n);if(404===i.status)throw new dn("No matching records found.","ERR_NOT_FOUND");if(422===i.status)throw new dn("Request does not conform to schema or semantic constraints.","ERR_INVALID_REQUEST");if(null==i.body)throw new dn("Routing response had no body","ERR_BAD_RESPONSE");if("application/json"===i.headers.get("Content-Type")){const e=await i.json();for(const t of e.Providers){const e=this.#P(t);null!=e&&(yield e)}}else for await(const e of bh(_s(i.body))){const t=this.#P(e);null!=t&&(yield t)}}catch(e){Oh.error("getProviders errored:",e)}finally{r.clear(),i.resolve(),Oh("getProviders finished: %c",e)}}async*getPeers(e,t={}){Oh("getPeers starts: %c",e);const n=AbortSignal.timeout(this.timeout),r=Ss([this.shutDownController.signal,n,t.signal]),s=ar(),i=ar();this.httpQueue.add((async()=>(s.resolve(),i.promise)));try{await s.promise;const t=`${this.clientUrl}routing/v1/peers/${e.toCID().toString()}`,n={headers:{Accept:"application/x-ndjson"},signal:r},i=await fetch(t,n);if(404===i.status)throw new dn("No matching records found.","ERR_NOT_FOUND");if(422===i.status)throw new dn("Request does not conform to schema or semantic constraints.","ERR_INVALID_REQUEST");if(null==i.body)throw new dn("Routing response had no body","ERR_BAD_RESPONSE");if("application/json"===i.headers.get("Content-Type")){const e=await i.json();for(const t of e.Peers){const e=this.#P(t);null!=e&&(yield e)}}else for await(const e of bh(_s(i.body))){const t=this.#P(e);null!=t&&(yield t)}}catch(e){Oh.error("getPeers errored:",e)}finally{r.clear(),i.resolve(),Oh("getPeers finished: %c",e)}}async getIPNS(e,t={}){Oh("getIPNS starts: %c",e);const n=AbortSignal.timeout(this.timeout),r=Ss([this.shutDownController.signal,n,t.signal]),s=ar(),i=ar();this.httpQueue.add((async()=>(s.resolve(),i.promise)));const o=`${this.clientUrl}routing/v1/ipns/${e.toCID().toString()}`;try{await s.promise;const n={headers:{Accept:"application/vnd.ipfs.ipns-record"},signal:r},i=await fetch(o,n);if(Oh("getIPNS GET %s %d",o,i.status),404===i.status)throw new dn("No matching records found.","ERR_NOT_FOUND");if(422===i.status)throw new dn("Request does not conform to schema or semantic constraints.","ERR_INVALID_REQUEST");if(null==i.body)throw new dn("GET ipns response had no body","ERR_BAD_RESPONSE");const a=await i.arrayBuffer(),c=new Uint8Array(a,0,a.byteLength);return!1!==t.validate&&await wh((e=>_n([uh,e.toBytes()]))(e),c),dh(c)}catch(e){throw Oh.error("getIPNS GET %s error:",o,e),e}finally{r.clear(),i.resolve(),Oh("getIPNS finished: %c",e)}}async putIPNS(e,t,n={}){Oh("putIPNS starts: %c",e);const r=AbortSignal.timeout(this.timeout),s=Ss([this.shutDownController.signal,r,n.signal]),i=ar(),o=ar();this.httpQueue.add((async()=>(i.resolve(),o.promise)));const a=`${this.clientUrl}routing/v1/ipns/${e.toCID().toString()}`;try{await i.promise;const e={method:"PUT",headers:{"Content-Type":"application/vnd.ipfs.ipns-record"},body:hh(t),signal:s},n=await fetch(a,e);if(Oh("putIPNS PUT %s %d",a,n.status),200!==n.status)throw new dn("PUT ipns response had status other than 200","ERR_BAD_RESPONSE")}catch(e){throw Oh.error("putIPNS PUT %s error:",a,e.stack),e}finally{s.clear(),o.resolve(),Oh("putIPNS finished: %c",e)}}#P(e){const t=[],n=e.Addrs?.map(or)??[];return null!=e.Protocols&&t.push(...e.Protocols),null!=e.Protocol&&(t.push(e.Protocol),delete e.Protocol),{...e,Schema:"peer",ID:bs(e.ID),Addrs:n,Protocols:t}}}function Fh(e,t={}){return new Uh(new URL(e),t)}function Vh(e,t){const n={[Symbol.iterator]:()=>n,next:()=>{const n=e.next(),r=n.value;if(!0===n.done||null==r){return{done:!0,value:void 0}}return{done:!1,value:t(r)}}};return n}class Kh{map;constructor(e){if(this.map=new Map,null!=e)for(const[t,n]of e.entries())this.map.set(t.toString(),n)}[Symbol.iterator](){return this.entries()}clear(){this.map.clear()}delete(e){return this.map.delete(e.toString())}entries(){return Vh(this.map.entries(),(e=>[bs(e[0]),e[1]]))}forEach(e){this.map.forEach(((t,n)=>{e(t,bs(n),this)}))}get(e){return this.map.get(e.toString())}has(e){return this.map.has(e.toString())}set(e,t){this.map.set(e.toString(),t)}keys(){return Vh(this.map.keys(),(e=>bs(e)))}values(){return this.map.values()}get size(){return this.map.size}}class $h{set;constructor(e){if(this.set=new Set,null!=e)for(const t of e)this.set.add(t.toString())}get size(){return this.set.size}[Symbol.iterator](){return this.values()}add(e){this.set.add(e.toString())}clear(){this.set.clear()}delete(e){this.set.delete(e.toString())}entries(){return Vh(this.set.entries(),(e=>{const t=bs(e[0]);return[t,t]}))}forEach(e){this.set.forEach((t=>{const n=bs(t);e(n,n,this)}))}has(e){return this.set.has(e.toString())}values(){return Vh(this.set.values(),(e=>bs(e)))}intersection(e){const t=new $h;for(const n of e)this.has(n)&&t.add(n);return t}difference(e){const t=new $h;for(const n of this)e.has(n)||t.add(n);return t}union(e){const t=new $h;for(const n of e)t.add(n);for(const e of this)t.add(e);return t}}const qh=async()=>{const e=await async function(e,t){return Ol(e).generateKeyPair(2048)}("Ed25519"),t=await async function(e){return Es(Bl(e.public),function(e,t){return Ol(t=(t??"rsa").toLowerCase()),e.bytes}(e))}(e);if("Ed25519"===t.type)return t;throw new Error(`Generated unexpected PeerId type "${t.type}"`)};const Hh="ERR_SIGNATURE_NOT_VALID";var zh;!function(e){let t;e.codec=()=>(null==t&&(t=zt(((e,t,n={})=>{!1!==n.lengthDelimited&&t.fork(),null!=e.publicKey&&e.publicKey.byteLength>0&&(t.uint32(10),t.bytes(e.publicKey)),null!=e.payloadType&&e.payloadType.byteLength>0&&(t.uint32(18),t.bytes(e.payloadType)),null!=e.payload&&e.payload.byteLength>0&&(t.uint32(26),t.bytes(e.payload)),null!=e.signature&&e.signature.byteLength>0&&(t.uint32(42),t.bytes(e.signature)),!1!==n.lengthDelimited&&t.ldelim()}),((e,t)=>{const n={publicKey:new Uint8Array(0),payloadType:new Uint8Array(0),payload:new Uint8Array(0),signature:new Uint8Array(0)},r=null==t?e.len:e.pos+t;for(;e.pos<r;){const t=e.uint32();switch(t>>>3){case 1:n.publicKey=e.bytes();break;case 2:n.payloadType=e.bytes();break;case 3:n.payload=e.bytes();break;case 5:n.signature=e.bytes();break;default:e.skipType(7&t)}}return n}))),t),e.encode=t=>Kt(t,e.codec()),e.decode=t=>W(t,e.codec())}(zh||(zh={}));class Wh{static createFromProtobuf=async e=>{const t=zh.decode(e),n=await Es(t.publicKey);return new Wh({peerId:n,payloadType:t.payloadType,payload:t.payload,signature:t.signature})};static seal=async(e,t)=>{if(null==t.privateKey)throw new Error("Missing private key");const n=e.domain,r=e.codec,s=e.marshal(),i=jh(n,r,s),o=await Ul(t.privateKey),a=await o.sign(i.subarray());return new Wh({peerId:t,payloadType:r,payload:s,signature:a})};static openAndCertify=async(e,t)=>{const n=await Wh.createFromProtobuf(e);if(!await n.validate(t))throw new dn("envelope signature is not valid for the given domain",Hh);return n};peerId;payloadType;payload;signature;marshaled;constructor(e){const{peerId:t,payloadType:n,payload:r,signature:s}=e;this.peerId=t,this.payloadType=n,this.payload=r,this.signature=s}marshal(){if(null==this.peerId.publicKey)throw new Error("Missing public key");return null==this.marshaled&&(this.marshaled=zh.encode({publicKey:this.peerId.publicKey,payloadType:this.payloadType,payload:this.payload.subarray(),signature:this.signature})),this.marshaled}equals(e){return Sn(this.marshal(),e.marshal())}async validate(e){const t=jh(e,this.payloadType,this.payload);if(null==this.peerId.publicKey)throw new Error("Missing public key");return Ll(this.peerId.publicKey).verify(t.subarray(),this.signature)}}const jh=(e,t,n)=>{const r=Tt(e),s=k(r.byteLength),i=k(t.length),o=k(n.length);return new Sr(s,r,i,t,o,n)};const Gh=Uint8Array.from([3,1]);var Yh;!function(e){let t;!function(e){let t;e.codec=()=>(null==t&&(t=zt(((e,t,n={})=>{!1!==n.lengthDelimited&&t.fork(),null!=e.multiaddr&&e.multiaddr.byteLength>0&&(t.uint32(10),t.bytes(e.multiaddr)),!1!==n.lengthDelimited&&t.ldelim()}),((e,t)=>{const n={multiaddr:new Uint8Array(0)},r=null==t?e.len:e.pos+t;for(;e.pos<r;){const t=e.uint32();if(t>>>3==1)n.multiaddr=e.bytes();else e.skipType(7&t)}return n}))),t),e.encode=t=>Kt(t,e.codec()),e.decode=t=>W(t,e.codec())}(e.AddressInfo||(e.AddressInfo={})),e.codec=()=>(null==t&&(t=zt(((t,n,r={})=>{if(!1!==r.lengthDelimited&&n.fork(),null!=t.peerId&&t.peerId.byteLength>0&&(n.uint32(10),n.bytes(t.peerId)),null!=t.seq&&0n!==t.seq&&(n.uint32(16),n.uint64(t.seq)),null!=t.addresses)for(const r of t.addresses)n.uint32(26),e.AddressInfo.codec().encode(r,n);!1!==r.lengthDelimited&&n.ldelim()}),((t,n)=>{const r={peerId:new Uint8Array(0),seq:0n,addresses:[]},s=null==n?t.len:t.pos+n;for(;t.pos<s;){const n=t.uint32();switch(n>>>3){case 1:r.peerId=t.bytes();break;case 2:r.seq=t.uint64();break;case 3:r.addresses.push(e.AddressInfo.codec().decode(t,t.uint32()));break;default:t.skipType(7&n)}}return r}))),t),e.encode=t=>Kt(t,e.codec()),e.decode=t=>W(t,e.codec())}(Yh||(Yh={}));class Qh{static createFromProtobuf=e=>{const t=Yh.decode(e),n=vs(t.peerId),r=(t.addresses??[]).map((e=>or(e.multiaddr))),s=t.seq;return new Qh({peerId:n,multiaddrs:r,seqNumber:s})};static DOMAIN="libp2p-peer-record";static CODEC=Gh;peerId;multiaddrs;seqNumber;domain=Qh.DOMAIN;codec=Qh.CODEC;marshaled;constructor(e){const{peerId:t,multiaddrs:n,seqNumber:r}=e;this.peerId=t,this.multiaddrs=n??[],this.seqNumber=r??BigInt(Date.now())}marshal(){return null==this.marshaled&&(this.marshaled=Yh.encode({peerId:this.peerId.toBytes(),seq:BigInt(this.seqNumber),addresses:this.multiaddrs.map((e=>({multiaddr:e.bytes})))})),this.marshaled}equals(e){return e instanceof Qh&&(!!this.peerId.equals(e.peerId)&&(this.seqNumber===e.seqNumber&&!!function(e,t){const n=(e,t)=>e.toString().localeCompare(t.toString());return e.length===t.length&&(t.sort(n),e.sort(n).every(((e,n)=>t[n].equals(e))))}(this.multiaddrs,e.multiaddrs)))}}function Jh(e){if(null!=e[Symbol.asyncIterator])return(async()=>{const t=[];for await(const n of e)t.push(n);return t})();const t=[];for(const n of e)t.push(n);return t}const Zh={},Xh=e=>{e.addEventListener("message",(t=>{Xh.dispatchEvent("message",e,t)})),null!=e.port&&e.port.addEventListener("message",(t=>{Xh.dispatchEvent("message",e,t)}))};Xh.addEventListener=(e,t)=>{null==Zh[e]&&(Zh[e]=[]),Zh[e].push(t)},Xh.removeEventListener=(e,t)=>{null!=Zh[e]&&(Zh[e]=Zh[e].filter((e=>e===t)))},Xh.dispatchEvent=function(e,t,n){null!=Zh[e]&&Zh[e].forEach((e=>e(t,n)))};const ed="lock:worker:request-read",td="lock:worker:release-read",nd="lock:master:grant-read",rd="lock:worker:request-write",sd="lock:worker:release-write",id="lock:master:grant-write",od=(e,t,n,r,s)=>(i,o)=>{if(o.data.type!==n)return;const a={type:o.data.type,name:o.data.name,identifier:o.data.identifier};e.dispatchEvent(new MessageEvent(t,{data:{name:a.name,handler:async()=>{i.postMessage({type:s,name:a.name,identifier:a.identifier}),await new Promise((e=>{const t=n=>{if(null==n||null==n.data)return;const s=n.data.type,o=(n.data.name,n.data.identifier);s===r&&o===a.identifier&&(i.removeEventListener("message",t),e())};i.addEventListener("message",t)}))}}}))},ad=(e,t,n,r)=>async()=>{const s=Math.random().toString().substring(2);return globalThis.postMessage({type:t,identifier:s,name:e}),new Promise((t=>{const i=o=>{if(null==o||null==o.data)return;const a=o.data.type,c=o.data.identifier;a===n&&c===s&&(globalThis.removeEventListener("message",i),t((()=>{globalThis.postMessage({type:r,identifier:s,name:e})})))};globalThis.addEventListener("message",i)}))},cd={singleProcess:!1};const ld={};let ud;async function hd(e,t){let n;const r=new Promise((e=>{n=e}));return e.add((async()=>Ah((async()=>{await new Promise((e=>{n((()=>{e()}))}))})(),{milliseconds:t.timeout}))),r}const dd={name:"lock",concurrency:1/0,timeout:846e5,singleProcess:!1};function pd(e){const t=Object.assign({},dd,e);return null==ud&&(ud=(e=>{if(e=Object.assign({},cd,e),Boolean(globalThis.document)||e.singleProcess){const e=new EventTarget;return Xh.addEventListener("message",od(e,"requestReadLock",ed,td,nd)),Xh.addEventListener("message",od(e,"requestWriteLock",rd,sd,id)),e}return{isWorker:!0,readLock:e=>ad(e,ed,nd,td),writeLock:e=>ad(e,rd,id,sd)}})(t),!0!==ud.isWorker&&(ud.addEventListener("requestReadLock",(e=>{null!=ld[e.data.name]&&ld[e.data.name].readLock().then((async t=>e.data.handler().finally((()=>{t()}))))})),ud.addEventListener("requestWriteLock",(async e=>{null!=ld[e.data.name]&&ld[e.data.name].writeLock().then((async t=>e.data.handler().finally((()=>{t()}))))})))),null==ld[t.name]&&(ld[t.name]=((e,t)=>{if(!0===ud.isWorker)return{readLock:ud.readLock(e,t),writeLock:ud.writeLock(e,t)};const n=new Dh({concurrency:1});let r;return{async readLock(){if(null!=r)return hd(r,t);r=new Dh({concurrency:t.concurrency,autoStart:!1});const e=r,s=hd(r,t);return n.add((async()=>{e.start(),await e.onIdle().then((()=>{r===e&&(r=null)}))})),s},writeLock:async()=>(r=null,hd(n,t))}})(t.name,t)),ld[t.name]}const fd={ERR_INVALID_PARAMETERS:"ERR_INVALID_PARAMETERS"};var gd,md,yd;function wd(e,t){const n=gd.decode(t);null!=n.publicKey&&null==e.publicKey&&(e=function(e){if("RSA"===e.type)return new ms(e);if("Ed25519"===e.type)return new ys(e);if("secp256k1"===e.type)return new ws(e);throw new dn("Not a PeerId","ERR_INVALID_PARAMETERS")}({...e,publicKey:e.publicKey}));const r=new Map,s=BigInt(Date.now());for(const[e,t]of n.tags.entries())null!=t.expiry&&t.expiry<s||r.set(e,t);return{...n,id:e,addresses:n.addresses.map((({multiaddr:e,isCertified:t})=>({multiaddr:or(e),isCertified:t??!1}))),metadata:n.metadata,peerRecordEnvelope:n.peerRecordEnvelope??void 0,tags:r}}!function(e){let t;!function(e){let t;e.codec=()=>(null==t&&(t=zt(((e,t,n={})=>{!1!==n.lengthDelimited&&t.fork(),null!=e.key&&""!==e.key&&(t.uint32(10),t.string(e.key)),null!=e.value&&e.value.byteLength>0&&(t.uint32(18),t.bytes(e.value)),!1!==n.lengthDelimited&&t.ldelim()}),((e,t)=>{const n={key:"",value:new Uint8Array(0)},r=null==t?e.len:e.pos+t;for(;e.pos<r;){const t=e.uint32();switch(t>>>3){case 1:n.key=e.string();break;case 2:n.value=e.bytes();break;default:e.skipType(7&t)}}return n}))),t),e.encode=t=>Kt(t,e.codec()),e.decode=t=>W(t,e.codec())}(e.Peer$metadataEntry||(e.Peer$metadataEntry={})),function(e){let t;e.codec=()=>(null==t&&(t=zt(((e,t,n={})=>{!1!==n.lengthDelimited&&t.fork(),null!=e.key&&""!==e.key&&(t.uint32(10),t.string(e.key)),null!=e.value&&(t.uint32(18),yd.codec().encode(e.value,t)),!1!==n.lengthDelimited&&t.ldelim()}),((e,t)=>{const n={key:""},r=null==t?e.len:e.pos+t;for(;e.pos<r;){const t=e.uint32();switch(t>>>3){case 1:n.key=e.string();break;case 2:n.value=yd.codec().decode(e,e.uint32());break;default:e.skipType(7&t)}}return n}))),t),e.encode=t=>Kt(t,e.codec()),e.decode=t=>W(t,e.codec())}(e.Peer$tagsEntry||(e.Peer$tagsEntry={})),e.codec=()=>(null==t&&(t=zt(((t,n,r={})=>{if(!1!==r.lengthDelimited&&n.fork(),null!=t.addresses)for(const e of t.addresses)n.uint32(10),md.codec().encode(e,n);if(null!=t.protocols)for(const e of t.protocols)n.uint32(18),n.string(e);if(null!=t.publicKey&&(n.uint32(34),n.bytes(t.publicKey)),null!=t.peerRecordEnvelope&&(n.uint32(42),n.bytes(t.peerRecordEnvelope)),null!=t.metadata&&0!==t.metadata.size)for(const[r,s]of t.metadata.entries())n.uint32(50),e.Peer$metadataEntry.codec().encode({key:r,value:s},n);if(null!=t.tags&&0!==t.tags.size)for(const[r,s]of t.tags.entries())n.uint32(58),e.Peer$tagsEntry.codec().encode({key:r,value:s},n);!1!==r.lengthDelimited&&n.ldelim()}),((t,n)=>{const r={addresses:[],protocols:[],metadata:new Map,tags:new Map},s=null==n?t.len:t.pos+n;for(;t.pos<s;){const n=t.uint32();switch(n>>>3){case 1:r.addresses.push(md.codec().decode(t,t.uint32()));break;case 2:r.protocols.push(t.string());break;case 4:r.publicKey=t.bytes();break;case 5:r.peerRecordEnvelope=t.bytes();break;case 6:{const n=e.Peer$metadataEntry.codec().decode(t,t.uint32());r.metadata.set(n.key,n.value);break}case 7:{const n=e.Peer$tagsEntry.codec().decode(t,t.uint32());r.tags.set(n.key,n.value);break}default:t.skipType(7&n)}}return r}))),t),e.encode=t=>Kt(t,e.codec()),e.decode=t=>W(t,e.codec())}(gd||(gd={})),function(e){let t;e.codec=()=>(null==t&&(t=zt(((e,t,n={})=>{!1!==n.lengthDelimited&&t.fork(),null!=e.multiaddr&&e.multiaddr.byteLength>0&&(t.uint32(10),t.bytes(e.multiaddr)),null!=e.isCertified&&(t.uint32(16),t.bool(e.isCertified)),!1!==n.lengthDelimited&&t.ldelim()}),((e,t)=>{const n={multiaddr:new Uint8Array(0)},r=null==t?e.len:e.pos+t;for(;e.pos<r;){const t=e.uint32();switch(t>>>3){case 1:n.multiaddr=e.bytes();break;case 2:n.isCertified=e.bool();break;default:e.skipType(7&t)}}return n}))),t),e.encode=t=>Kt(t,e.codec()),e.decode=t=>W(t,e.codec())}(md||(md={})),function(e){let t;e.codec=()=>(null==t&&(t=zt(((e,t,n={})=>{!1!==n.lengthDelimited&&t.fork(),null!=e.value&&0!==e.value&&(t.uint32(8),t.uint32(e.value)),null!=e.expiry&&(t.uint32(16),t.uint64(e.expiry)),!1!==n.lengthDelimited&&t.ldelim()}),((e,t)=>{const n={value:0},r=null==t?e.len:e.pos+t;for(;e.pos<r;){const t=e.uint32();switch(t>>>3){case 1:n.value=e.uint32();break;case 2:n.expiry=e.uint64();break;default:e.skipType(7&t)}}return n}))),t),e.encode=t=>Kt(t,e.codec()),e.decode=t=>W(t,e.codec())}(yd||(yd={}));const bd="/peers/";function vd(e){if(!rn(e)||null==e.type)throw new dn("Invalid PeerId",fd.ERR_INVALID_PARAMETERS);const t=e.toCID().toString();return new Zt(`${bd}${t}`)}async function Ed(e,t,n){const r=new Map;for(const s of n){if(null==s)continue;if(s.multiaddr instanceof Uint8Array&&(s.multiaddr=or(s.multiaddr)),!ir(s.multiaddr))throw new dn("Multiaddr was invalid",fd.ERR_INVALID_PARAMETERS);if(!await t(e,s.multiaddr))continue;const n=s.isCertified??!1,i=s.multiaddr.toString(),o=r.get(i);null!=o?s.isCertified=o.isCertified||n:r.set(i,{multiaddr:s.multiaddr,isCertified:n})}return[...r.values()].sort(((e,t)=>e.multiaddr.toString().localeCompare(t.multiaddr.toString()))).map((({isCertified:e,multiaddr:t})=>({isCertified:e,multiaddr:t.bytes})))}async function Sd(e,t,n,r){if(null==t)throw new dn("Invalid PeerData",fd.ERR_INVALID_PARAMETERS);if(null!=t.publicKey&&null!=e.publicKey&&!Sn(t.publicKey,e.publicKey))throw new dn("publicKey bytes do not match peer id publicKey bytes",fd.ERR_INVALID_PARAMETERS);const s=r.existingPeer;if(null!=s&&!e.equals(s.id))throw new dn("peer id did not match existing peer id",fd.ERR_INVALID_PARAMETERS);let i=s?.addresses??[],o=new Set(s?.protocols??[]),a=s?.metadata??new Map,c=s?.tags??new Map,l=s?.peerRecordEnvelope;if("patch"===n){if(null==t.multiaddrs&&null==t.addresses||(i=[],null!=t.multiaddrs&&i.push(...t.multiaddrs.map((e=>({isCertified:!1,multiaddr:e})))),null!=t.addresses&&i.push(...t.addresses)),null!=t.protocols&&(o=new Set(t.protocols)),null!=t.metadata){a=_d(t.metadata instanceof Map?[...t.metadata.entries()]:Object.entries(t.metadata),{validate:Id})}if(null!=t.tags){c=_d(t.tags instanceof Map?[...t.tags.entries()]:Object.entries(t.tags),{validate:Rd,map:Ad})}null!=t.peerRecordEnvelope&&(l=t.peerRecordEnvelope)}if("merge"===n){if(null!=t.multiaddrs&&i.push(...t.multiaddrs.map((e=>({isCertified:!1,multiaddr:e})))),null!=t.addresses&&i.push(...t.addresses),null!=t.protocols&&(o=new Set([...o,...t.protocols])),null!=t.metadata){const e=t.metadata instanceof Map?[...t.metadata.entries()]:Object.entries(t.metadata);for(const[t,n]of e)null==n?a.delete(t):a.set(t,n);a=_d([...a.entries()],{validate:Id})}if(null!=t.tags){const e=t.tags instanceof Map?[...t.tags.entries()]:Object.entries(t.tags),n=new Map(c);for(const[t,r]of e)null==r?n.delete(t):n.set(t,r);c=_d([...n.entries()],{validate:Rd,map:Ad})}null!=t.peerRecordEnvelope&&(l=t.peerRecordEnvelope)}const u={addresses:await Ed(e,r.addressFilter??(async()=>!0),i),protocols:[...o.values()].sort(((e,t)=>e.localeCompare(t))),metadata:a,tags:c,publicKey:s?.id.publicKey??t.publicKey??e.publicKey,peerRecordEnvelope:l};return"RSA"!==e.type&&delete u.publicKey,u}function _d(e,t){const n=new Map;for(const[n,r]of e)null!=r&&t.validate(n,r);for(const[r,s]of e.sort((([e],[t])=>e.localeCompare(t))))null!=s&&n.set(r,t.map?.(r,s)??s);return n}function Id(e,t){if("string"!=typeof e)throw new dn("Metadata key must be a string",fd.ERR_INVALID_PARAMETERS);if(!(t instanceof Uint8Array))throw new dn("Metadata value must be a Uint8Array",fd.ERR_INVALID_PARAMETERS)}function Rd(e,t){if("string"!=typeof e)throw new dn("Tag name must be a string",fd.ERR_INVALID_PARAMETERS);if(null!=t.value){if(parseInt(`${t.value}`,10)!==t.value)throw new dn("Tag value must be an integer",fd.ERR_INVALID_PARAMETERS);if(t.value<0||t.value>100)throw new dn("Tag value must be between 0-100",fd.ERR_INVALID_PARAMETERS)}if(null!=t.ttl){if(parseInt(`${t.ttl}`,10)!==t.ttl)throw new dn("Tag ttl must be an integer",fd.ERR_INVALID_PARAMETERS);if(t.ttl<0)throw new dn("Tag ttl must be between greater than 0",fd.ERR_INVALID_PARAMETERS)}}function Ad(e,t){let n;return null!=t.expiry&&(n=t.expiry),null!=t.ttl&&(n=BigInt(Date.now()+Number(t.ttl))),{value:t.value??0,expiry:n}}function Td(e,t,n){const r=e.toString().split("/")[2],s=vs(me.decode(r)),i=n.get(s);if(null!=i)return i;const o=wd(s,t);return n.set(s,o),o}class Dd{peerId;datastore;lock;addressFilter;constructor(e,t={}){this.peerId=e.peerId,this.datastore=e.datastore,this.addressFilter=t.addressFilter,this.lock=pd({name:"peer-store",singleProcess:!0})}async has(e){return this.datastore.has(vd(e))}async delete(e){if(this.peerId.equals(e))throw new dn("Cannot delete self peer",fd.ERR_INVALID_PARAMETERS);await this.datastore.delete(vd(e))}async load(e){return wd(e,await this.datastore.get(vd(e)))}async save(e,t){const{existingBuf:n,existingPeer:r}=await this.#C(e),s=await Sd(e,t,"patch",{addressFilter:this.addressFilter});return this.#x(e,s,n,r)}async patch(e,t){const{existingBuf:n,existingPeer:r}=await this.#C(e),s=await Sd(e,t,"patch",{addressFilter:this.addressFilter,existingPeer:r});return this.#x(e,s,n,r)}async merge(e,t){const{existingBuf:n,existingPeer:r}=await this.#C(e),s=await Sd(e,t,"merge",{addressFilter:this.addressFilter,existingPeer:r});return this.#x(e,s,n,r)}async*all(e){const t=new Kh;for await(const{key:n,value:r}of this.datastore.query(function(e,t){return null==e?{}:{prefix:bd,filters:(e.filters??[]).map((e=>({key:n,value:r})=>e(Td(n,r,t)))),orders:(e.orders??[]).map((e=>(n,r)=>e(Td(n.key,n.value,t),Td(r.key,r.value,t))))}}(e??{},t))){const e=Td(n,r,t);e.id.equals(this.peerId)||(yield e)}}async#C(e){try{const t=await this.datastore.get(vd(e));return{existingBuf:t,existingPeer:wd(e,t)}}catch(e){if("ERR_NOT_FOUND"!==e.code)throw e}return{}}async#x(e,t,n,r){const s=gd.encode(t);return null!=n&&Sn(s,n)?{peer:wd(e,s),previous:r,updated:!1}:(await this.datastore.put(vd(e),s),{peer:wd(e,s),previous:r,updated:!0})}}class kd{store;events;peerId;log;constructor(e,t={}){this.log=e.logger.forComponent("libp2p:peer-store"),this.events=e.events,this.peerId=e.peerId,this.store=new Dd(e,t)}async forEach(e,t){this.log.trace("forEach await read lock");const n=await this.store.lock.readLock();this.log.trace("forEach got read lock");try{for await(const n of this.store.all(t))e(n)}finally{this.log.trace("forEach release read lock"),n()}}async all(e){this.log.trace("all await read lock");const t=await this.store.lock.readLock();this.log.trace("all got read lock");try{return await Jh(this.store.all(e))}finally{this.log.trace("all release read lock"),t()}}async delete(e){this.log.trace("delete await write lock");const t=await this.store.lock.writeLock();this.log.trace("delete got write lock");try{await this.store.delete(e)}finally{this.log.trace("delete release write lock"),t()}}async has(e){this.log.trace("has await read lock");const t=await this.store.lock.readLock();this.log.trace("has got read lock");try{return await this.store.has(e)}finally{this.log.trace("has release read lock"),t()}}async get(e){this.log.trace("get await read lock");const t=await this.store.lock.readLock();this.log.trace("get got read lock");try{return await this.store.load(e)}finally{this.log.trace("get release read lock"),t()}}async save(e,t){this.log.trace("save await write lock");const n=await this.store.lock.writeLock();this.log.trace("save got write lock");try{const n=await this.store.save(e,t);return this.#N(e,n),n.peer}finally{this.log.trace("save release write lock"),n()}}async patch(e,t){this.log.trace("patch await write lock");const n=await this.store.lock.writeLock();this.log.trace("patch got write lock");try{const n=await this.store.patch(e,t);return this.#N(e,n),n.peer}finally{this.log.trace("patch release write lock"),n()}}async merge(e,t){this.log.trace("merge await write lock");const n=await this.store.lock.writeLock();this.log.trace("merge got write lock");try{const n=await this.store.merge(e,t);return this.#N(e,n),n.peer}finally{this.log.trace("merge release write lock"),n()}}async consumePeerRecord(e,t){const n=await Wh.openAndCertify(e,Qh.DOMAIN);if(!1===t?.equals(n.peerId))return this.log("envelope peer id was not the expected peer id - expected: %p received: %p",t,n.peerId),!1;const r=Qh.createFromProtobuf(n.payload);let s;try{s=await this.get(n.peerId)}catch(e){if("ERR_NOT_FOUND"!==e.code)throw e}if(null!=s?.peerRecordEnvelope){const e=await Wh.createFromProtobuf(s.peerRecordEnvelope),t=Qh.createFromProtobuf(e.payload);if(t.seqNumber>=r.seqNumber)return this.log("sequence number was lower or equal to existing sequence number - stored: %d received: %d",t.seqNumber,r.seqNumber),!1}return await this.patch(r.peerId,{peerRecordEnvelope:e,addresses:r.multiaddrs.map((e=>({isCertified:!0,multiaddr:e})))}),!0}#N(e,t){t.updated&&(this.peerId.equals(e)?this.events.safeDispatchEvent("self:peer:update",{detail:t}):this.events.safeDispatchEvent("peer:update",{detail:t}))}}function Pd(e){if(null!=e[Symbol.asyncIterator])return(async()=>{for await(const t of e);})();for(const t of e);}function Cd(e,t){let n=0;if(null!=e[Symbol.asyncIterator])return async function*(){for await(const r of e)await t(r,n++)&&(yield r)}();const r=$r(e),{value:s,done:i}=r.next();if(!0===i)return function*(){}();const o=t(s,n++);if("function"==typeof o.then)return async function*(){await o&&(yield s);for await(const e of r)await t(e,n++)&&(yield e)}();const a=t;return function*(){!0===o&&(yield s);for(const e of r)a(e,n++)&&(yield e)}()}function xd(e,t){return null!=e[Symbol.asyncIterator]?async function*(){const n=await Jh(e);yield*n.sort(t)}():function*(){const n=Jh(e);yield*n.sort(t)}()}function Nd(e,t){return null!=e[Symbol.asyncIterator]?async function*(){let n=0;if(!(t<1))for await(const r of e)if(yield r,n++,n===t)return}():function*(){let n=0;if(!(t<1))for(const r of e)if(yield r,n++,n===t)return}()}class Md{put(e,t,n){return Promise.reject(new Error(".put is not implemented"))}get(e,t){return Promise.reject(new Error(".get is not implemented"))}has(e,t){return Promise.reject(new Error(".has is not implemented"))}delete(e,t){return Promise.reject(new Error(".delete is not implemented"))}async*putMany(e,t={}){for await(const{key:n,value:r}of e)await this.put(n,r,t),yield n}async*getMany(e,t={}){for await(const n of e)yield{key:n,value:await this.get(n,t)}}async*deleteMany(e,t={}){for await(const n of e)await this.delete(n,t),yield n}batch(){let e=[],t=[];return{put(t,n){e.push({key:t,value:n})},delete(e){t.push(e)},commit:async n=>{await Pd(this.putMany(e,n)),e=[],await Pd(this.deleteMany(t,n)),t=[]}}}async*_all(e,t){throw new Error("._all is not implemented")}async*_allKeys(e,t){throw new Error("._allKeys is not implemented")}query(e,t){let n=this._all(e,t);if(null!=e.prefix){const t=e.prefix;n=Cd(n,(e=>e.key.toString().startsWith(t)))}if(Array.isArray(e.filters)&&(n=e.filters.reduce(((e,t)=>Cd(e,t)),n)),Array.isArray(e.orders)&&(n=e.orders.reduce(((e,t)=>xd(e,t)),n)),null!=e.offset){let t=0;const r=e.offset;n=Cd(n,(()=>t++>=r))}return null!=e.limit&&(n=Nd(n,e.limit)),n}queryKeys(e,t){let n=this._allKeys(e,t);if(null!=e.prefix){const t=e.prefix;n=Cd(n,(e=>e.toString().startsWith(t)))}if(Array.isArray(e.filters)&&(n=e.filters.reduce(((e,t)=>Cd(e,t)),n)),Array.isArray(e.orders)&&(n=e.orders.reduce(((e,t)=>xd(e,t)),n)),null!=e.offset){const t=e.offset;let r=0;n=Cd(n,(()=>r++>=t))}return null!=e.limit&&(n=Nd(n,e.limit)),n}}function Od(e){return e=e??new Error("Read failed"),Ur(e,"ERR_DB_READ_FAILED")}function Ld(e){return e=e??new Error("Not Found"),Ur(e,"ERR_NOT_FOUND")}class Bd extends Md{data;constructor(){super(),this.data=new Map}put(e,t){return this.data.set(e.toString(),t),e}get(e){const t=this.data.get(e.toString());if(null==t)throw Ld();return t}has(e){return this.data.has(e.toString())}delete(e){this.data.delete(e.toString())}*_all(){for(const[e,t]of this.data.entries())yield{key:new Zt(e),value:t}}*_allKeys(){for(const e of this.data.keys())yield new Zt(e)}}const Ud=e=>e;function Fd(e,t){const n=e.getPeerId();if(null!=n){bs(n).equals(t)&&(e=e.decapsulate(or(`/p2p/${t.toString()}`)))}return e}class Vd{log;components;listen;announce;observed;announceFilter;constructor(e,t={}){const{listen:n=[],announce:r=[]}=t;this.components=e,this.log=e.logger.forComponent("libp2p:address-manager"),this.listen=n.map((e=>e.toString())),this.announce=new Set(r.map((e=>e.toString()))),this.observed=new Map,this.announceFilter=t.announceFilter??Ud,this._updatePeerStoreAddresses=function(e,t){let n;return function(){clearTimeout(n),n=setTimeout((function(){n=void 0,e()}),t)}}(this._updatePeerStoreAddresses.bind(this),1e3),e.events.addEventListener("transport:listening",(()=>{this._updatePeerStoreAddresses()})),e.events.addEventListener("transport:close",(()=>{this._updatePeerStoreAddresses()}))}_updatePeerStoreAddresses(){const e=this.getAnnounceAddrs().concat(this.components.transportManager.getAddrs()).concat([...this.observed.entries()].filter((([e,t])=>t.confident)).map((([e])=>or(e)))).map((e=>e.getPeerId()===this.components.peerId.toString()?e.decapsulate(`/p2p/${this.components.peerId.toString()}`):e));this.components.peerStore.patch(this.components.peerId,{multiaddrs:e}).catch((e=>{this.log.error("error updating addresses",e)}))}getListenAddrs(){return Array.from(this.listen).map((e=>or(e)))}getAnnounceAddrs(){return Array.from(this.announce).map((e=>or(e)))}getObservedAddrs(){return Array.from(this.observed).map((([e])=>or(e)))}addObservedAddr(e){const t=(e=Fd(e,this.components.peerId)).toString();this.observed.has(t)||this.observed.set(t,{confident:!1})}confirmObservedAddr(e){const t=(e=Fd(e,this.components.peerId)).toString(),n=(this.observed.get(t)??{confident:!1}).confident;this.observed.set(t,{confident:!0}),n||this._updatePeerStoreAddresses()}removeObservedAddr(e){const t=(e=Fd(e,this.components.peerId)).toString();this.observed.delete(t)}getAddresses(){let e=this.getAnnounceAddrs().map((e=>e.toString()));0===e.length&&(e=this.components.transportManager.getAddrs().map((e=>e.toString()))),e=e.concat(Array.from(this.observed).filter((([e,t])=>t.confident)).map((([e])=>e)));const t=new Set(e);return this.announceFilter(Array.from(t).map((e=>or(e)))).map((e=>!0===e.protos().pop()?.path||e.getPeerId()===this.components.peerId.toString()?e:e.encapsulate(`/p2p/${this.components.peerId.toString()}`)))}}class Kd{components={};_started=!1;constructor(e={}){this.components={};for(const[t,n]of Object.entries(e))this.components[t]=n;null==this.components.logger&&(this.components.logger=cs())}isStarted(){return this._started}async _invokeStartableMethod(e){await Promise.all(Object.values(this.components).filter((e=>bn(e))).map((async t=>{await(t[e]?.())})))}async beforeStart(){await this._invokeStartableMethod("beforeStart")}async start(){await this._invokeStartableMethod("start"),this._started=!0}async afterStart(){await this._invokeStartableMethod("afterStart")}async beforeStop(){await this._invokeStartableMethod("beforeStop")}async stop(){await this._invokeStartableMethod("stop"),this._started=!1}async afterStop(){await this._invokeStartableMethod("afterStop")}}const $d=["metrics","connectionProtector","dns"],qd=["components","isStarted","beforeStart","start","afterStart","beforeStop","stop","afterStop","then","_invokeStartableMethod"];var Hd;(function(){var e,t,n,r,s,i,o,a;a=function(e){return[(e&255<<24)>>>24,(e&255<<16)>>>16,(65280&e)>>>8,255&e].join(".")},o=function(e){var n,r,s,i,o,a;for(n=[],s=i=0;i<=3&&0!==e.length;s=++i){if(s>0){if("."!==e[0])throw new Error("Invalid IP");e=e.substring(1)}o=(a=t(e))[0],r=a[1],e=e.substring(r),n.push(o)}if(0!==e.length)throw new Error("Invalid IP");switch(n.length){case 1:if(n[0]>4294967295)throw new Error("Invalid IP");return n[0]>>>0;case 2:if(n[0]>255||n[1]>16777215)throw new Error("Invalid IP");return(n[0]<<24|n[1])>>>0;case 3:if(n[0]>255||n[1]>255||n[2]>65535)throw new Error("Invalid IP");return(n[0]<<24|n[1]<<16|n[2])>>>0;case 4:if(n[0]>255||n[1]>255||n[2]>255||n[3]>255)throw new Error("Invalid IP");return(n[0]<<24|n[1]<<16|n[2]<<8|n[3])>>>0;default:throw new Error("Invalid IP")}},r=(n=function(e){return e.charCodeAt(0)})("0"),i=n("a"),s=n("A"),t=function(e){var t,o,a,c,l;for(c=0,t=10,o="9",a=0,e.length>1&&"0"===e[a]&&("x"===e[a+1]||"X"===e[a+1]?(a+=2,t=16):"0"<=e[a+1]&&e[a+1]<="9"&&(a++,t=8,o="7")),l=a;a<e.length;){if("0"<=e[a]&&e[a]<=o)c=c*t+(n(e[a])-r)>>>0;else{if(16!==t)break;if("a"<=e[a]&&e[a]<="f")c=c*t+(10+n(e[a])-i)>>>0;else{if(!("A"<=e[a]&&e[a]<="F"))break;c=c*t+(10+n(e[a])-s)>>>0}}if(c>4294967295)throw new Error("too large");a++}if(a===l)throw new Error("empty octet");return[c,a]},e=function(){function e(e,t){var n,r,s;if("string"!=typeof e)throw new Error("Missing `net' parameter");if(t||(s=e.split("/",2),e=s[0],t=s[1]),t||(t=32),"string"==typeof t&&t.indexOf(".")>-1){try{this.maskLong=o(t)}catch(e){throw new Error("Invalid mask: "+t)}for(n=r=32;r>=0;n=--r)if(this.maskLong===4294967295<<32-n>>>0){this.bitmask=n;break}}else{if(!t&&0!==t)throw new Error("Invalid mask: empty");this.bitmask=parseInt(t,10),this.maskLong=0,this.bitmask>0&&(this.maskLong=4294967295<<32-this.bitmask>>>0)}try{this.netLong=(o(e)&this.maskLong)>>>0}catch(t){throw new Error("Invalid net address: "+e)}if(!(this.bitmask<=32))throw new Error("Invalid mask for ip4: "+t);this.size=Math.pow(2,32-this.bitmask),this.base=a(this.netLong),this.mask=a(this.maskLong),this.hostmask=a(~this.maskLong),this.first=this.bitmask<=30?a(this.netLong+1):this.base,this.last=this.bitmask<=30?a(this.netLong+this.size-2):a(this.netLong+this.size-1),this.broadcast=this.bitmask<=30?a(this.netLong+this.size-1):void 0}return e.prototype.contains=function(t){return"string"==typeof t&&(t.indexOf("/")>0||4!==t.split(".").length)&&(t=new e(t)),t instanceof e?this.contains(t.base)&&this.contains(t.broadcast||t.last):(o(t)&this.maskLong)>>>0==(this.netLong&this.maskLong)>>>0},e.prototype.next=function(t){return null==t&&(t=1),new e(a(this.netLong+this.size*t),this.mask)},e.prototype.forEach=function(e){var t,n,r;for(r=o(this.first),n=o(this.last),t=0;r<=n;)e(a(r),r,t),t++,r++},e.prototype.toString=function(){return this.base+"/"+this.bitmask},e}(),Hd=e}).call(Mr);const zd=["0.0.0.0/8","10.0.0.0/8","100.64.0.0/10","127.0.0.0/8","169.254.0.0/16","172.16.0.0/12","192.0.0.0/24","192.0.0.0/29","192.0.0.8/32","192.0.0.9/32","192.0.0.10/32","192.0.0.170/32","192.0.0.171/32","192.0.2.0/24","192.31.196.0/24","192.52.193.0/24","192.88.99.0/24","192.168.0.0/16","192.175.48.0/24","198.18.0.0/15","198.51.100.0/24","203.0.113.0/24","240.0.0.0/4","255.255.255.255/32"].map((e=>new Hd(e)));function Wd(e){return Tn(e)?function(e){for(const t of zd)if(t.contains(e))return!0;return!1}(e):Dn(e)?/^::$/.test(t=e)||/^::1$/.test(t)||/^::f{4}:([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})$/.test(t)||/^::f{4}:0.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})$/.test(t)||/^64:ff9b::([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})$/.test(t)||/^100::([0-9a-fA-F]{0,4}):?([0-9a-fA-F]{0,4}):?([0-9a-fA-F]{0,4}):?([0-9a-fA-F]{0,4})$/.test(t)||/^2001::([0-9a-fA-F]{0,4}):?([0-9a-fA-F]{0,4}):?([0-9a-fA-F]{0,4}):?([0-9a-fA-F]{0,4}):?([0-9a-fA-F]{0,4}):?([0-9a-fA-F]{0,4})$/.test(t)||/^2001:2[0-9a-fA-F]:([0-9a-fA-F]{0,4}):?([0-9a-fA-F]{0,4}):?([0-9a-fA-F]{0,4}):?([0-9a-fA-F]{0,4}):?([0-9a-fA-F]{0,4}):?([0-9a-fA-F]{0,4})$/.test(t)||/^2001:db8:([0-9a-fA-F]{0,4}):?([0-9a-fA-F]{0,4}):?([0-9a-fA-F]{0,4}):?([0-9a-fA-F]{0,4}):?([0-9a-fA-F]{0,4}):?([0-9a-fA-F]{0,4})$/.test(t)||/^2002:([0-9a-fA-F]{0,4}):?([0-9a-fA-F]{0,4}):?([0-9a-fA-F]{0,4}):?([0-9a-fA-F]{0,4}):?([0-9a-fA-F]{0,4}):?([0-9a-fA-F]{0,4}):?([0-9a-fA-F]{0,4})$/.test(t)||/^f[c-d]([0-9a-fA-F]{2,2}):/i.test(t)||/^fe[8-9a-bA-B][0-9a-fA-F]:/i.test(t)||/^ff([0-9a-fA-F]{2,2}):/i.test(t):void 0;var t}function jd(e={}){return{denyDialPeer:async()=>!1,denyDialMultiaddr:async e=>{const t=e.stringTuples();return(4===t[0][0]||41===t[0][0])&&Boolean(Wd(`${t[0][1]}`))},denyInboundConnection:async()=>!1,denyOutboundConnection:async()=>!1,denyInboundEncryptedConnection:async()=>!1,denyOutboundEncryptedConnection:async()=>!1,denyInboundUpgradedConnection:async()=>!1,denyOutboundUpgradedConnection:async()=>!1,filterMultiaddrForPeer:async()=>!0,...e}}const Gd=e=>({match:t=>!(t.length<1)&&(!!e(t[0])&&t.slice(1)),pattern:"fn"}),Yd=e=>({match:t=>Gd((t=>t===e)).match(t),pattern:e}),Qd=()=>({match:e=>Gd((e=>"string"==typeof e)).match(e),pattern:"{string}"}),Jd=()=>({match:e=>Gd((e=>!isNaN(parseInt(e)))).match(e),pattern:"{number}"}),Zd=()=>({match:e=>{if(e.length<2)return!1;if("p2p"!==e[0]&&"ipfs"!==e[0])return!1;if(!e[1].startsWith("Q")&&!e[1].startsWith("1"))return!1;try{ke.decode(`z${e[1]}`)}catch(e){return!1}return e.slice(2)},pattern:"/p2p/{peerid}"}),Xd=()=>({match:e=>{if(e.length<2)return!1;if("certhash"!==e[0])return!1;try{Me.decode(e[1])}catch{return!1}return e.slice(2)},pattern:"/certhash/{certhash}"}),ep=e=>({match:t=>{const n=e.match(t);return!1===n?t:n},pattern:`optional(${e.pattern})`}),tp=(...e)=>({match:t=>{let n;for(const r of e){const e=r.match(t);!1!==e&&((null==n||e.length<n.length)&&(n=e))}return null!=n&&n},pattern:`or(${e.map((e=>e.pattern)).join(", ")})`}),np=(...e)=>({match:t=>{for(const n of e){const e=n.match(t);if(!1===e)return!1;t=e}return t},pattern:`and(${e.map((e=>e.pattern)).join(", ")})`});function rp(...e){function t(t){let n=(e=>e.toString().split("/").slice(1))(t);for(const t of e){const e=t.match(n);if(!1===e)return!1;n=e}return n}return{matches:function(e){return!1!==t(e)},exactMatch:function(e){const n=t(e);return!1!==n&&0===n.length}}}const sp=np(Yd("dns4"),Qd()),ip=np(Yd("dns6"),Qd()),op=np(Yd("dnsaddr"),Qd()),ap=np(Yd("dns"),Qd()),cp=rp(tp(ap,op,sp,ip)),lp=tp(np(Yd("ip4"),Gd(Tn)),np(Yd("ip6"),Gd(Dn))),up=tp(lp,ap,sp,ip,op),hp=rp(up),dp=rp(lp),pp=np(up,Yd("tcp"),Jd()),fp=np(up,Yd("udp"),Jd()),gp=tp(pp,fp),mp=np(fp,Yd("quic")),yp=np(fp,Yd("quic-v1")),wp=tp(mp,yp),bp=tp(up,pp,fp,mp,yp),vp=tp(np(bp,Yd("ws"),ep(Zd()))),Ep=tp(np(bp,Yd("wss"),ep(Zd())),np(bp,Yd("tls"),Yd("ws"),ep(Zd()))),Sp=np(gp,Yd("webrtc-direct"),Xd(),ep(Xd()),ep(Zd())),_p=np(yp,Yd("webtransport"),ep(Xd()),ep(Xd()),ep(Zd())),Ip=rp(_p),Rp=tp(vp,Ep,np(pp,ep(Zd())),np(wp,ep(Zd())),np(up,ep(Zd())),Sp,_p,Zd()),Ap=rp(np(Rp,Yd("p2p-circuit"),Zd())),Tp=rp(tp(np(Rp,Yd("p2p-circuit"),Yd("webrtc"),Zd()),np(Rp,Yd("webrtc"),ep(Zd())),Yd("webrtc")));function Dp(e){try{const{address:t}=e.nodeAddress();return Boolean(Wd(t))}catch{return!0}}function kp(e,t){const n=function(e,t){const n=Dp(e.multiaddr),r=Dp(t.multiaddr);return n&&!r?1:!n&&r?-1:0}(e,t);if(0!==n)return n;const r=function(e,t){const n=Ap.exactMatch(e.multiaddr),r=Ap.exactMatch(t.multiaddr);return n&&!r?1:!n&&r?-1:0}(e,t);if(0!==r)return r;const s=function(e,t){return e.isCertified&&!t.isCertified?-1:!e.isCertified&&t.isCertified?1:0}(e,t);return s}tp(np(up,Yd("tcp"),Jd(),Yd("http"),ep(Zd())),np(up,Yd("http"),ep(Zd()))),tp(np(up,Yd("tcp"),tp(np(Yd("443"),Yd("http")),np(Jd(),Yd("https"))),ep(Zd())),np(up,Yd("tls"),Yd("http"),ep(Zd())),np(up,Yd("https"),ep(Zd())));class Pp extends Event{constructor(e,t){super(e),this.detail=t}}function Cp(e){const t=[Vp.A];return null==e?t:Array.isArray(e)?0===e.length?t:e:[e]}const xp=60;function Np(e){return{Status:e.Status??0,TC:e.TC??e.flag_tc??!1,RD:e.RD??e.flag_rd??!1,RA:e.RA??e.flag_ra??!1,AD:e.AD??e.flag_ad??!1,CD:e.CD??e.flag_cd??!1,Question:(e.Question??e.questions??[]).map((e=>({name:e.name,type:Vp[e.type]}))),Answer:(e.Answer??e.answers??[]).map((e=>({name:e.name,type:Vp[e.type],TTL:e.TTL??e.ttl??xp,data:e.data instanceof Uint8Array?Gt(e.data):e.data})))}}const Mp=4;function Op(e,t={}){const n=new Dh({concurrency:t.queryConcurrency??Mp});return async(t,r={})=>{const s=new URLSearchParams;s.set("name",t),Cp(r.types).forEach((e=>{s.append("type",Vp[e])})),r.onProgress?.(new Pp("dns:query",{detail:t}));const i=await n.add((async()=>{const t=await fetch(`${e}?${s}`,{headers:{accept:"application/dns-json"},signal:r?.signal});if(200!==t.status)throw new Error(`Unexpected HTTP status: ${t.status} - ${t.statusText}`);const n=Np(await t.json());return r.onProgress?.(new Pp("dns:response",{detail:n})),n}),{signal:r.signal});if(null==i)throw new Error("No DNS response received");return i}}var Lp=function(e){if(!e)throw Error("hashlru must have a max value, of type number, greater than 0");var t=0,n=Object.create(null),r=Object.create(null);function s(s,i){n[s]=i,++t>=e&&(t=0,r=n,n=Object.create(null))}return{has:function(e){return void 0!==n[e]||void 0!==r[e]},remove:function(e){void 0!==n[e]&&(n[e]=void 0),void 0!==r[e]&&(r[e]=void 0)},get:function(e){var t=n[e];return void 0!==t?t:void 0!==(t=r[e])?(s(e,t),t):void 0},set:function(e,t){void 0!==n[e]?n[e]=t:s(e,t)},clear:function(){n=Object.create(null),r=Object.create(null)}}},Bp=Or(Lp);class Up{lru;constructor(e){this.lru=Bp(e)}get(e,t){let n=!0;const r=[];for(const s of t){const t=this.getAnswers(e,s);if(0===t.length){n=!1;break}r.push(...t)}if(n)return Np({answers:r})}getAnswers(e,t){const n=`${e.toLowerCase()}-${t}`,r=this.lru.get(n);if(null!=r){const e=r.filter((e=>e.expires>Date.now())).map((({expires:e,value:t})=>({...t,TTL:Math.round((e-Date.now())/1e3),type:Vp[t.type]})));return 0===e.length&&this.lru.remove(n),e}return[]}add(e,t){const n=`${e.toLowerCase()}-${t.type}`,r=this.lru.get(n)??[];r.push({expires:Date.now()+1e3*(t.TTL??xp),value:t}),this.lru.set(n,r)}remove(e,t){const n=`${e.toLowerCase()}-${t}`;this.lru.remove(n)}clear(){this.lru.clear()}}let Fp=class{resolvers;cache;constructor(e){var t;this.resolvers={},this.cache=(t=e.cacheSize??1e3,new Up(t)),Object.entries(e.resolvers??{}).forEach((([e,t])=>{Array.isArray(t)||(t=[t]),e.endsWith(".")||(e=`${e}.`),this.resolvers[e]=t})),null==this.resolvers["."]&&(this.resolvers["."]=[Op("https://cloudflare-dns.com/dns-query"),Op("https://dns.google/resolve")])}async query(e,t={}){const n=Cp(t.types),r=!1!==t.cached?this.cache.get(e,n):void 0;if(null!=r)return t.onProgress?.(new Pp("dns:cache",{detail:r})),r;const s=`${e.split(".").pop()}.`,i=(this.resolvers[s]??this.resolvers["."]).sort((()=>Math.random()>.5?-1:1)),o=[];for(const r of i){if(!0===t.signal?.aborted)break;try{const s=await r(e,{...t,types:n});for(const t of s.Answer)this.cache.add(e,t);return s}catch(e){o.push(e),t.onProgress?.(new Pp("dns:error",{detail:e}))}}if(1===o.length)throw o[0];throw new AggregateError(o,`DNS lookup of ${e} ${n} failed`)}};var Vp;!function(e){e[e.A=1]="A",e[e.CNAME=5]="CNAME",e[e.TXT=16]="TXT",e[e.AAAA=28]="AAAA"}(Vp||(Vp={}));const{code:Kp}=Bn("dnsaddr"),$p=async function(e,t={}){const n=t.maxRecursiveDepth??32;if(0===n)throw new dn("Max recursive depth reached","ERR_MAX_RECURSIVE_DEPTH_REACHED");const[,r]=e.stringTuples().find((([e])=>e===Kp))??[],s=t?.dns??function(e={}){return new Fp(e)}(),i=await s.query(`_dnsaddr.${r}`,{signal:t?.signal,types:[Vp.TXT]}),o=e.getPeerId(),a=[];for(const e of i.Answer){const r=e.data.replace(/["']/g,"").trim().split("=")[1];if(null==r)continue;if(null!=o&&!r.includes(o))continue;const s=or(r);if(r.startsWith("/dnsaddr")){const e=await s.resolve({...t,maxRecursiveDepth:n-1});a.push(...e.map((e=>e.toString())))}else a.push(s.toString())}return a};const qp=e=>{if("[object Object]"!==Object.prototype.toString.call(e))return!1;const t=Object.getPrototypeOf(e);return null===t||t===Object.prototype},{hasOwnProperty:Hp}=Object.prototype,{propertyIsEnumerable:zp}=Object,Wp=(e,t,n)=>Object.defineProperty(e,t,{value:n,writable:!0,enumerable:!0,configurable:!0}),jp=Mr,Gp={concatArrays:!1,ignoreUndefined:!1},Yp=e=>{const t=[];for(const n in e)Hp.call(e,n)&&t.push(n);if(Object.getOwnPropertySymbols){const n=Object.getOwnPropertySymbols(e);for(const r of n)zp.call(e,r)&&t.push(r)}return t};function Qp(e){return Array.isArray(e)?function(e){const t=e.slice(0,0);return Yp(e).forEach((n=>{Wp(t,n,Qp(e[n]))})),t}(e):qp(e)?function(e){const t=null===Object.getPrototypeOf(e)?Object.create(null):{};return Yp(e).forEach((n=>{Wp(t,n,Qp(e[n]))})),t}(e):e}const Jp=(e,t,n,r)=>(n.forEach((n=>{void 0===t[n]&&r.ignoreUndefined||(n in e&&e[n]!==Object.getPrototypeOf(e)?Wp(e,n,Xp(e[n],t[n],r)):Wp(e,n,Qp(t[n])))})),e),Zp=(e,t,n)=>{let r=e.slice(0,0),s=0;return[e,t].forEach((t=>{const i=[];for(let n=0;n<t.length;n++)Hp.call(t,n)&&(i.push(String(n)),Wp(r,s++,t===e?t[n]:Qp(t[n])));r=Jp(r,t,Yp(t).filter((e=>!i.includes(e))),n)})),r};function Xp(e,t,n){return n.concatArrays&&Array.isArray(e)&&Array.isArray(t)?Zp(e,t,n):qp(t)&&qp(e)?Jp(e,t,Yp(t),n):Qp(t)}var ef,tf,nf=Or((function(...e){const t=Xp(Qp(Gp),this!==jp&&this||{},Gp);let n={_:{}};for(const r of e)if(void 0!==r){if(!qp(r))throw new TypeError("`"+r+"` is not an Option Object");n=Xp(n,{_:r},t)}return n._}));!function(e){e.NOT_STARTED_YET="The libp2p node is not started yet",e.ERR_PROTECTOR_REQUIRED="Private network is enforced, but no protector was provided",e.NOT_FOUND="Not found"}(ef||(ef={})),function(e){e.ERR_PROTECTOR_REQUIRED="ERR_PROTECTOR_REQUIRED",e.ERR_PEER_DIAL_INTERCEPTED="ERR_PEER_DIAL_INTERCEPTED",e.ERR_CONNECTION_INTERCEPTED="ERR_CONNECTION_INTERCEPTED",e.ERR_INVALID_PROTOCOLS_FOR_STREAM="ERR_INVALID_PROTOCOLS_FOR_STREAM",e.ERR_CONNECTION_ENDED="ERR_CONNECTION_ENDED",e.ERR_CONNECTION_FAILED="ERR_CONNECTION_FAILED",e.ERR_NODE_NOT_STARTED="ERR_NODE_NOT_STARTED",e.ERR_ALREADY_ABORTED="ERR_ALREADY_ABORTED",e.ERR_TOO_MANY_ADDRESSES="ERR_TOO_MANY_ADDRESSES",e.ERR_NO_VALID_ADDRESSES="ERR_NO_VALID_ADDRESSES",e.ERR_RELAYED_DIAL="ERR_RELAYED_DIAL",e.ERR_DIALED_SELF="ERR_DIALED_SELF",e.ERR_DISCOVERED_SELF="ERR_DISCOVERED_SELF",e.ERR_DUPLICATE_TRANSPORT="ERR_DUPLICATE_TRANSPORT",e.ERR_ENCRYPTION_FAILED="ERR_ENCRYPTION_FAILED",e.ERR_HOP_REQUEST_FAILED="ERR_HOP_REQUEST_FAILED",e.ERR_INVALID_KEY="ERR_INVALID_KEY",e.ERR_INVALID_MESSAGE="ERR_INVALID_MESSAGE",e.ERR_INVALID_PARAMETERS="ERR_INVALID_PARAMETERS",e.ERR_INVALID_PEER="ERR_INVALID_PEER",e.ERR_MUXER_UNAVAILABLE="ERR_MUXER_UNAVAILABLE",e.ERR_NOT_FOUND="ERR_NOT_FOUND",e.ERR_TRANSPORT_UNAVAILABLE="ERR_TRANSPORT_UNAVAILABLE",e.ERR_TRANSPORT_DIAL_FAILED="ERR_TRANSPORT_DIAL_FAILED",e.ERR_UNSUPPORTED_PROTOCOL="ERR_UNSUPPORTED_PROTOCOL",e.ERR_PROTOCOL_HANDLER_ALREADY_REGISTERED="ERR_PROTOCOL_HANDLER_ALREADY_REGISTERED",e.ERR_INVALID_MULTIADDR="ERR_INVALID_MULTIADDR",e.ERR_SIGNATURE_NOT_VALID="ERR_SIGNATURE_NOT_VALID",e.ERR_FIND_SELF="ERR_FIND_SELF",e.ERR_NO_ROUTERS_AVAILABLE="ERR_NO_ROUTERS_AVAILABLE",e.ERR_CONNECTION_NOT_MULTIPLEXED="ERR_CONNECTION_NOT_MULTIPLEXED",e.ERR_NO_DIAL_TOKENS="ERR_NO_DIAL_TOKENS",e.ERR_INVALID_CMS="ERR_INVALID_CMS",e.ERR_MISSING_KEYS="ERR_MISSING_KEYS",e.ERR_NO_KEY="ERR_NO_KEY",e.ERR_INVALID_KEY_NAME="ERR_INVALID_KEY_NAME",e.ERR_INVALID_KEY_TYPE="ERR_INVALID_KEY_TYPE",e.ERR_KEY_ALREADY_EXISTS="ERR_KEY_ALREADY_EXISTS",e.ERR_INVALID_KEY_SIZE="ERR_INVALID_KEY_SIZE",e.ERR_KEY_NOT_FOUND="ERR_KEY_NOT_FOUND",e.ERR_OLD_KEY_NAME_INVALID="ERR_OLD_KEY_NAME_INVALID",e.ERR_NEW_KEY_NAME_INVALID="ERR_NEW_KEY_NAME_INVALID",e.ERR_PASSWORD_REQUIRED="ERR_PASSWORD_REQUIRED",e.ERR_PEM_REQUIRED="ERR_PEM_REQUIRED",e.ERR_CANNOT_READ_KEY="ERR_CANNOT_READ_KEY",e.ERR_MISSING_PRIVATE_KEY="ERR_MISSING_PRIVATE_KEY",e.ERR_MISSING_PUBLIC_KEY="ERR_MISSING_PUBLIC_KEY",e.ERR_INVALID_OLD_PASS_TYPE="ERR_INVALID_OLD_PASS_TYPE",e.ERR_INVALID_NEW_PASS_TYPE="ERR_INVALID_NEW_PASS_TYPE",e.ERR_INVALID_PASS_LENGTH="ERR_INVALID_PASS_LENGTH",e.ERR_NOT_IMPLEMENTED="ERR_NOT_IMPLEMENTED",e.ERR_WRONG_PING_ACK="ERR_WRONG_PING_ACK",e.ERR_INVALID_RECORD="ERR_INVALID_RECORD",e.ERR_ALREADY_SUCCEEDED="ERR_ALREADY_SUCCEEDED",e.ERR_NO_HANDLER_FOR_PROTOCOL="ERR_NO_HANDLER_FOR_PROTOCOL",e.ERR_TOO_MANY_OUTBOUND_PROTOCOL_STREAMS="ERR_TOO_MANY_OUTBOUND_PROTOCOL_STREAMS",e.ERR_TOO_MANY_INBOUND_PROTOCOL_STREAMS="ERR_TOO_MANY_INBOUND_PROTOCOL_STREAMS",e.ERR_CONNECTION_DENIED="ERR_CONNECTION_DENIED",e.ERR_TRANSFER_LIMIT_EXCEEDED="ERR_TRANSFER_LIMIT_EXCEEDED"}(tf||(tf={}));const rf={addresses:{listen:[],announce:[],noAnnounce:[],announceFilter:e=>e},connectionManager:{resolvers:{dnsaddr:$p},addressSorter:kp},transportManager:{faultTolerance:un.FATAL_ALL}};const sf=()=>{const e=new Error("Delay aborted");return e.name="AbortError",e},of=new WeakMap;const af=function({clearTimeout:e,setTimeout:t}={}){return(n,{value:r,signal:s}={})=>{if(s?.aborted)return Promise.reject(sf());let i,o,a;const c=e??clearTimeout,l=()=>{c(i),a(sf())},u=new Promise(((e,c)=>{o=()=>{s&&s.removeEventListener("abort",l),e(r)},a=c,i=(t??setTimeout)(o,n)}));return s&&s.addEventListener("abort",l,{once:!0}),of.set(u,(()=>{c(i),i=null,o()})),u}}();class cf{memoryStorage;points;duration;blockDuration;execEvenly;execEvenlyMinDelayMs;keyPrefix;constructor(e={}){this.points=e.points??4,this.duration=e.duration??1,this.blockDuration=e.blockDuration??0,this.execEvenly=e.execEvenly??!1,this.execEvenlyMinDelayMs=e.execEvenlyMinDelayMs??1e3*this.duration/this.points,this.keyPrefix=e.keyPrefix??"rlflx",this.memoryStorage=new lf}async consume(e,t=1,n={}){const r=this.getKey(e),s=this._getKeySecDuration(n);let i=this.memoryStorage.incrby(r,t,s);if(i.remainingPoints=Math.max(this.points-i.consumedPoints,0),i.consumedPoints>this.points)throw this.blockDuration>0&&i.consumedPoints<=this.points+t&&(i=this.memoryStorage.set(r,i.consumedPoints,this.blockDuration)),new dn("Rate limit exceeded","ERR_RATE_LIMIT_EXCEEDED",i);if(this.execEvenly&&i.msBeforeNext>0&&!i.isFirstInDuration){let e=Math.ceil(i.msBeforeNext/(i.remainingPoints+2));e<this.execEvenlyMinDelayMs&&(e=i.consumedPoints*this.execEvenlyMinDelayMs),await af(e)}return i}penalty(e,t=1,n={}){const r=this.getKey(e),s=this._getKeySecDuration(n),i=this.memoryStorage.incrby(r,t,s);return i.remainingPoints=Math.max(this.points-i.consumedPoints,0),i}reward(e,t=1,n={}){const r=this.getKey(e),s=this._getKeySecDuration(n),i=this.memoryStorage.incrby(r,-t,s);return i.remainingPoints=Math.max(this.points-i.consumedPoints,0),i}block(e,t){const n=1e3*t,r=this.points+1;return this.memoryStorage.set(this.getKey(e),r,t),{remainingPoints:0,msBeforeNext:0===n?-1:n,consumedPoints:r,isFirstInDuration:!1}}set(e,t,n=0){const r=1e3*(n>=0?n:this.duration);return this.memoryStorage.set(this.getKey(e),t,n),{remainingPoints:0,msBeforeNext:0===r?-1:r,consumedPoints:t,isFirstInDuration:!1}}get(e){const t=this.memoryStorage.get(this.getKey(e));return null!=t&&(t.remainingPoints=Math.max(this.points-t.consumedPoints,0)),t}delete(e){this.memoryStorage.delete(this.getKey(e))}_getKeySecDuration(e){return null!=e?.customDuration&&e.customDuration>=0?e.customDuration:this.duration}getKey(e){return this.keyPrefix.length>0?`${this.keyPrefix}:${e}`:e}parseKey(e){return e.substring(this.keyPrefix.length)}}class lf{storage;constructor(){this.storage=new Map}incrby(e,t,n){const r=this.storage.get(e);if(null!=r){const s=null!=r.expiresAt?r.expiresAt.getTime()-(new Date).getTime():-1;return null==r.expiresAt||s>0?(r.value+=t,{remainingPoints:0,msBeforeNext:s,consumedPoints:r.value,isFirstInDuration:!1}):this.set(e,t,n)}return this.set(e,t,n)}set(e,t,n){const r=1e3*n,s=this.storage.get(e);null!=s&&clearTimeout(s.timeoutId);const i={value:t,expiresAt:r>0?new Date(Date.now()+r):void 0};return this.storage.set(e,i),r>0&&(i.timeoutId=setTimeout((()=>{this.storage.delete(e)}),r),null!=i.timeoutId.unref&&i.timeoutId.unref()),{remainingPoints:0,msBeforeNext:0===r?-1:r,consumedPoints:i.value,isFirstInDuration:!0}}get(e){const t=this.storage.get(e);if(null!=t){return{remainingPoints:0,msBeforeNext:null!=t.expiresAt?t.expiresAt.getTime()-(new Date).getTime():-1,consumedPoints:t.value,isFirstInDuration:!1}}}delete(e){const t=this.storage.get(e);return null!=t&&(null!=t.timeoutId&&clearTimeout(t.timeoutId),this.storage.delete(e),!0)}}function uf(e){if(rn(e))return{peerId:e,multiaddrs:[]};let t;if(Array.isArray(e)||(e=[e]),e.length>0){const n=e[0].getPeerId();t=null==n?void 0:bs(n),e.forEach((e=>{if(!ir(e))throw new dn("Invalid Multiaddr",tf.ERR_INVALID_MULTIADDR);const n=e.getPeerId();if(null==n){if(null!=t)throw new dn("Multiaddrs must all have the same peer id or have no peer id",tf.ERR_INVALID_PARAMETERS)}else{const e=bs(n);if(null==t||!t.equals(e))throw new dn("Multiaddrs must all have the same peer id or have no peer id",tf.ERR_INVALID_PARAMETERS)}}))}return{peerId:t,multiaddrs:e}}class hf extends Error{type;code;constructor(e,t){super(e??"The operation was aborted"),this.type="aborted",this.name="AbortError",this.code=t??"ABORT_ERR"}}async function df(e,t,n,r){const s=new hf(r?.errorMessage,r?.errorCode);return!0===n?.aborted?Promise.reject(s):new Promise(((i,o)=>{function a(){n?.removeEventListener("abort",u),e.removeEventListener(t,c),null!=r?.errorEvent&&e.removeEventListener(r.errorEvent,l)}const c=e=>{try{if(!1===r?.filter?.(e))return}catch(e){return a(),void o(e)}a(),i(e)},l=e=>{a(),o(e.detail)},u=()=>{a(),o(s)};n?.addEventListener("abort",u),e.addEventListener(t,c),null!=r?.errorEvent&&e.addEventListener(r.errorEvent,l)}))}class pf{deferred;signal;constructor(e){this.signal=e,this.deferred=ar(),this.onAbort=this.onAbort.bind(this),this.signal?.addEventListener("abort",this.onAbort)}onAbort(){this.deferred.reject(this.signal?.reason??new hn)}cleanup(){this.signal?.removeEventListener("abort",this.onAbort)}}class ff{id;fn;options;recipients;status;timeline;controller;constructor(e,t){this.id=`${parseInt(String(1e9*Math.random()),10).toString()}${Date.now()}`,this.status="queued",this.fn=e,this.options=t,this.recipients=[],this.timeline={created:Date.now()},this.controller=new AbortController,this.controller.signal,this.onAbort=this.onAbort.bind(this)}abort(e){this.controller.abort(e)}onAbort(){this.recipients.reduce(((e,t)=>e&&!0===t.signal?.aborted),!0)&&(this.controller.abort(new hn),this.cleanup())}async join(e={}){const t=new pf(e.signal);return this.recipients.push(t),e.signal?.addEventListener("abort",this.onAbort),t.deferred.promise}async run(){this.status="running",this.timeline.started=Date.now();try{this.controller.signal.throwIfAborted();const e=await Ir(this.fn({...this.options??{},signal:this.controller.signal}),this.controller.signal);this.recipients.forEach((t=>{t.deferred.resolve(e)})),this.status="complete"}catch(e){this.recipients.forEach((t=>{t.deferred.reject(e)})),this.status="errored"}finally{this.timeline.finished=Date.now(),this.cleanup()}}cleanup(){this.recipients.forEach((e=>{e.cleanup(),e.signal?.removeEventListener("abort",this.onAbort)}))}}class gf extends mn{concurrency;queue;pending;sort;constructor(e={}){super(),this.concurrency=e.concurrency??Number.POSITIVE_INFINITY,this.pending=0,null!=e.metricName&&e.metrics?.registerMetricGroup(e.metricName,{calculate:()=>({size:this.queue.length,running:this.pending,queued:this.queue.length-this.pending})}),this.sort=e.sort,this.queue=[]}tryToStartAnother(){if(0===this.size)return queueMicrotask((()=>{this.safeDispatchEvent("empty")})),0===this.running&&queueMicrotask((()=>{this.safeDispatchEvent("idle")})),!1;if(this.pending<this.concurrency){let e;for(const t of this.queue)if("queued"===t.status){e=t;break}return null!=e&&(this.safeDispatchEvent("active"),this.pending++,e.run().finally((()=>{for(let t=0;t<this.queue.length;t++)if(this.queue[t]===e){this.queue.splice(t,1);break}this.pending--,this.tryToStartAnother(),this.safeDispatchEvent("next")})),!0)}return!1}enqueue(e){this.queue.push(e),null!=this.sort&&this.queue.sort(this.sort)}async add(e,t){t?.signal?.throwIfAborted();const n=new ff(e,t);return this.enqueue(n),this.safeDispatchEvent("add"),this.tryToStartAnother(),n.join(t).then((e=>(this.safeDispatchEvent("completed",{detail:e}),this.safeDispatchEvent("success",{detail:{job:n,result:e}}),e))).catch((e=>{if("queued"===n.status)for(let e=0;e<this.queue.length;e++)if(this.queue[e]===n){this.queue.splice(e,1);break}throw this.safeDispatchEvent("error",{detail:e}),this.safeDispatchEvent("failure",{detail:{job:n,error:e}}),e}))}clear(){this.queue.splice(0,this.queue.length)}abort(){this.queue.forEach((e=>{e.abort(new hn)})),this.clear()}async onEmpty(e){0!==this.size&&await df(this,"empty",e?.signal)}async onSizeLessThan(e,t){this.size<e||await df(this,"next",t?.signal,{filter:()=>this.size<e})}async onIdle(e){0===this.pending&&0===this.size||await df(this,"idle",e?.signal)}get size(){return this.queue.length}get queued(){return this.queue.length-this.pending}get running(){return this.pending}async*toGenerator(e){e?.signal?.throwIfAborted();const t=hr({objectMode:!0}),n=e=>{null!=e?this.abort():this.clear(),t.end(e)},r=e=>{null!=e.detail&&t.push(e.detail)},s=e=>{n(e.detail)},i=()=>{n()},o=()=>{n(new dn("Queue aborted","ERR_QUEUE_ABORTED"))};this.addEventListener("completed",r),this.addEventListener("error",s),this.addEventListener("idle",i),e?.signal?.addEventListener("abort",o);try{yield*t}finally{this.removeEventListener("completed",r),this.removeEventListener("error",s),this.removeEventListener("idle",i),e?.signal?.removeEventListener("abort",o),n()}}}class mf extends gf{has(e){return null!=this.find(e)}find(e){return this.queue.find((t=>e.equals(t.options.peerId)))}}const yf="last-dial-failure",wf=42e4,bf={minConnections:5,maxQueueLength:100,autoDialConcurrency:25,autoDialPriority:0,autoDialInterval:5e3,autoDialPeerRetryThreshold:wf,autoDialDiscoveredPeersDebounce:10};class vf{connectionManager;peerStore;queue;minConnections;autoDialPriority;autoDialIntervalMs;autoDialMaxQueueLength;autoDialPeerRetryThresholdMs;autoDialDiscoveredPeersDebounce;autoDialInterval;started;running;log;constructor(e,t){let n;this.connectionManager=e.connectionManager,this.peerStore=e.peerStore,this.minConnections=t.minConnections??bf.minConnections,this.autoDialPriority=t.autoDialPriority??bf.autoDialPriority,this.autoDialIntervalMs=t.autoDialInterval??bf.autoDialInterval,this.autoDialMaxQueueLength=t.maxQueueLength??bf.maxQueueLength,this.autoDialPeerRetryThresholdMs=t.autoDialPeerRetryThreshold??bf.autoDialPeerRetryThreshold,this.autoDialDiscoveredPeersDebounce=t.autoDialDiscoveredPeersDebounce??bf.autoDialDiscoveredPeersDebounce,this.log=e.logger.forComponent("libp2p:connection-manager:auto-dial"),this.started=!1,this.running=!1,this.queue=new mf({concurrency:t.autoDialConcurrency??bf.autoDialConcurrency,metricName:"libp2p_autodial_queue",metrics:e.metrics}),this.queue.addEventListener("error",(e=>{this.log.error("error during auto-dial",e.detail)})),e.events.addEventListener("connection:close",(()=>{this.autoDial().catch((e=>{this.log.error(e)}))})),e.events.addEventListener("peer:discovery",(()=>{clearTimeout(n),n=setTimeout((()=>{this.autoDial().catch((e=>{this.log.error(e)}))}),this.autoDialDiscoveredPeersDebounce)}))}isStarted(){return this.started}start(){this.started=!0}afterStart(){this.autoDial().catch((e=>{this.log.error("error while autodialing",e)}))}stop(){this.queue.clear(),clearTimeout(this.autoDialInterval),this.started=!1,this.running=!1}async autoDial(){if(!this.started||this.running)return;const e=this.connectionManager.getConnectionsMap(),t=e.size;if(t>=this.minConnections)return void(this.minConnections>0&&this.log.trace("have enough connections %d/%d",t,this.minConnections));if(this.queue.size>this.autoDialMaxQueueLength)return this.log("not enough connections %d/%d but auto dial queue is full",t,this.minConnections),void this.sheduleNextAutodial();this.running=!0,this.log("not enough connections %d/%d - will dial peers to increase the number of connections",t,this.minConnections);const n=new $h(this.connectionManager.getDialQueue().map((e=>e.peerId)).filter(Boolean)),r=await this.peerStore.all({filters:[t=>0===t.addresses.length?(this.log.trace("not autodialing %p because they have no addresses",t.id),!1):e.has(t.id)?(this.log.trace("not autodialing %p because they are already connected",t.id),!1):n.has(t.id)?(this.log.trace("not autodialing %p because they are already being dialed",t.id),!1):!this.queue.has(t.id)||(this.log.trace("not autodialing %p because they are already being autodialed",t.id),!1)]}),s=r.sort((()=>Math.random()>.5?1:-1)),i=new Kh;for(const e of s)i.has(e.id)||i.set(e.id,[...e.tags.values()].reduce(((e,t)=>e+t.value),0));const o=s.sort(((e,t)=>{const n=i.get(e.id)??0,r=i.get(t.id)??0;return n>r?-1:n<r?1:0})).filter((e=>{const t=e.metadata.get(yf);if(null==t)return!0;const n=parseInt(Gt(t));return!!isNaN(n)||Date.now()-n>this.autoDialPeerRetryThresholdMs}));this.log("selected %d/%d peers to dial",o.length,r.length);for(const e of o)this.queue.add((async()=>{const t=this.connectionManager.getConnectionsMap().size;if(t>=this.minConnections)return this.log("got enough connections now %d/%d",t,this.minConnections),void this.queue.clear();this.log("connecting to a peerStore stored peer %p",e.id),await this.connectionManager.openConnection(e.id,{priority:this.autoDialPriority})}),{peerId:e.id}).catch((e=>{this.log.error("could not connect to peerStore stored peer",e)}));this.running=!1,this.sheduleNextAutodial()}sheduleNextAutodial(){this.started&&(this.autoDialInterval=setTimeout((()=>{this.autoDial().catch((e=>{this.log.error("error while autodialing",e)}))}),this.autoDialIntervalMs))}}const Ef=["/ipfs/id/1.0.0","/ipfs/id/push/1.0.0","/libp2p/autonat/1.0.0","/libp2p/dcutr"];const Sf={maxConnections:100,allow:[]};class _f{maxConnections;connectionManager;peerStore;allow;events;log;constructor(e,t={}){this.maxConnections=t.maxConnections??Sf.maxConnections,this.allow=t.allow??Sf.allow,this.connectionManager=e.connectionManager,this.peerStore=e.peerStore,this.events=e.events,this.log=e.logger.forComponent("libp2p:connection-manager:connection-pruner"),e.events.addEventListener("connection:open",(()=>{this.maybePruneConnections().catch((e=>{this.log.error(e)}))}))}async maybePruneConnections(){const e=this.connectionManager.getConnections(),t=e.length;if(this.log("checking max connections limit %d/%d",t,this.maxConnections),t<=this.maxConnections)return;const n=new Kh;for(const t of e){const e=t.remotePeer;if(!n.has(e)){n.set(e,0);try{const t=await this.peerStore.get(e);n.set(e,[...t.tags.values()].reduce(((e,t)=>e+t.value),0))}catch(e){"ERR_NOT_FOUND"!==e.code&&this.log.error("error loading peer tags",e)}}}const r=this.sortConnections(e,n),s=Math.max(t-this.maxConnections,0),i=[];for(const e of r){this.log("too many connections open - closing a connection to %p",e.remotePeer);if(this.allow.some((t=>e.remoteAddr.toString().startsWith(t.toString())))||i.push(e),i.length===s)break}await Promise.all(i.map((async e=>{await async function(e,t){const n=e?.streams?.map((e=>e.protocol))??[],r=t?.closableProtocols??Ef;if(!(n.filter((e=>null!=e&&!r.includes(e))).length>0))try{await(e?.close(t))}catch(t){e?.abort(t)}}(e,{signal:AbortSignal.timeout(1e3)})}))),this.events.safeDispatchEvent("connection:prune",{detail:i})}sortConnections(e,t){return e.sort(((e,t)=>{const n=e.timeline.open,r=t.timeline.open;return n<r?1:n>r?-1:0})).sort(((e,t)=>"outbound"===e.direction&&"inbound"===t.direction?1:"inbound"===e.direction&&"outbound"===t.direction?-1:0)).sort(((e,t)=>e.streams.length>t.streams.length?1:e.streams.length<t.streams.length?-1:0)).sort(((e,n)=>{const r=t.get(e.remotePeer)??0,s=t.get(n.remotePeer)??0;return r>s?1:r<s?-1:0}))}}class If extends gf{constructor(e={}){super({...e,sort:(e,t)=>e.options.priority>t.options.priority?-1:e.options.priority<t.options.priority?1:0})}}const Rf={addressSorter:kp,maxParallelDials:50,maxDialQueueLength:500,maxPeerAddrsToDial:25,dialTimeout:5e3,resolvers:{dnsaddr:$p}};class Af{queue;components;addressSorter;maxPeerAddrsToDial;maxDialQueueLength;dialTimeout;shutDownController;connections;log;constructor(e,t={}){this.addressSorter=t.addressSorter??Rf.addressSorter,this.maxPeerAddrsToDial=t.maxPeerAddrsToDial??Rf.maxPeerAddrsToDial,this.maxDialQueueLength=t.maxDialQueueLength??Rf.maxDialQueueLength,this.dialTimeout=t.dialTimeout??Rf.dialTimeout,this.connections=t.connections??new Kh,this.log=e.logger.forComponent("libp2p:connection-manager:dial-queue"),this.components=e,this.shutDownController=new AbortController,this.shutDownController.signal;for(const[e,n]of Object.entries(t.resolvers??{}))sr.set(e,n);this.queue=new If({concurrency:t.maxParallelDials??Rf.maxParallelDials,metricName:"libp2p_dial_queue",metrics:e.metrics}),this.queue.addEventListener("error",(e=>{this.log.error("error in dial queue",e.detail)}))}start(){this.shutDownController=new AbortController,this.shutDownController.signal}stop(){this.shutDownController.abort(),this.queue.abort()}async dial(e,t={}){const{peerId:n,multiaddrs:r}=uf(e),s=Array.from(this.connections.values()).flat().find((e=>!0!==t.force&&(!!e.remotePeer.equals(n)||r.find((t=>t.equals(e.remoteAddr))))));if(null!=s)return this.log("already connected to %a",s.remoteAddr),s;const i=this.queue.queue.find((e=>{if(!0===n?.equals(e.options.peerId))return!0;const t=e.options.multiaddrs;if(null==t)return!1;for(const e of r)if(t.has(e.toString()))return!0;return!1}));if(null!=i){this.log("joining existing dial target for %p",n);for(const e of r)i.options.multiaddrs.add(e.toString());return i.join(t)}if(this.queue.size>=this.maxDialQueueLength)throw new dn("Dial queue is full","ERR_DIAL_QUEUE_FULL");return this.log("creating dial target for %p",n,r.map((e=>e.toString()))),this.queue.add((async e=>{const t=this.createDialAbortController(e?.signal);let r;try{r=await this.calculateMultiaddrs(n,e?.multiaddrs,{...e,signal:t}),r.map((({multiaddr:e})=>e.toString())).forEach((t=>{e?.multiaddrs.add(t)}))}catch(e){throw t.clear(),e}try{let s=0;const i=[];for(const o of r){if(s===this.maxPeerAddrsToDial)throw this.log("dialed maxPeerAddrsToDial (%d) addresses for %p, not trying any others",s,n),new dn("Peer had more than maxPeerAddrsToDial",tf.ERR_TOO_MANY_ADDRESSES);s++;try{const n=await this.components.transportManager.dial(o.multiaddr,{...e,signal:t});return this.log("dial to %a succeeded",o.multiaddr),n}catch(e){if(this.log.error("dial failed to %a",o.multiaddr,e),null!=n)try{await this.components.peerStore.patch(n,{metadata:{[yf]:Tt(Date.now().toString())}})}catch(e){this.log.error("could not update last dial failure key for %p",n,e)}if(t.aborted)throw new dn(e.message,fn);i.push(e)}}if(1===i.length)throw i[0];throw new pn(i,"All multiaddr dials failed",tf.ERR_TRANSPORT_DIAL_FAILED)}finally{t.clear()}}),{peerId:n,priority:t.priority??Tf,multiaddrs:new Set(r.map((e=>e.toString()))),signal:t.signal})}createDialAbortController(e){const t=Ss([AbortSignal.timeout(this.dialTimeout),this.shutDownController.signal,e]);return t}async calculateMultiaddrs(e,t=new Set,n={}){const r=[...t].map((e=>({multiaddr:or(e),isCertified:!1})));if(null!=e){if(this.components.peerId.equals(e))throw new dn("Tried to dial self",tf.ERR_DIALED_SELF);if(!0===await(this.components.connectionGater.denyDialPeer?.(e)))throw new dn("The dial request is blocked by gater.allowDialPeer",tf.ERR_PEER_DIAL_INTERCEPTED);if(0===r.length){this.log("loading multiaddrs for %p",e);try{const t=await this.components.peerStore.get(e);r.push(...t.addresses),this.log("loaded multiaddrs for %p",e,r.map((({multiaddr:e})=>e.toString())))}catch(e){if(e.code!==tf.ERR_NOT_FOUND)throw e}}if(0===r.length){this.log("looking up multiaddrs for %p in the peer routing",e);try{const t=await this.components.peerRouting.findPeer(e);this.log("found multiaddrs for %p in the peer routing",e,r.map((({multiaddr:e})=>e.toString()))),r.push(...t.multiaddrs.map((e=>({multiaddr:e,isCertified:!1}))))}catch(t){t.code!==tf.ERR_NO_ROUTERS_AVAILABLE&&this.log.error("looking up multiaddrs for %p in the peer routing failed",e,t)}}}let s=(await Promise.all(r.map((async e=>{const t=await async function(e,t){let n=!1;for(const t of sr.keys())if(n=e.protoNames().includes(t),n)break;if(!n)return[e];const r=await e.resolve(t);return t.log("resolved %s to",e,r.map((e=>e.toString()))),r}(e.multiaddr,{dns:this.components.dns,...n,log:this.log});return 1===t.length&&t[0].equals(e.multiaddr)?e:t.map((e=>({multiaddr:e,isCertified:!1})))})))).flat();if(null!=e){const t=`/p2p/${e.toString()}`;s=s.map((e=>{const n=e.multiaddr.protos().pop();return!0===n?.path?e:null==e.multiaddr.getPeerId()?{multiaddr:e.multiaddr.encapsulate(t),isCertified:e.isCertified}:e}))}const i=s.filter((t=>{if(null==this.components.transportManager.dialTransportForMultiaddr(t.multiaddr))return!1;const n=t.multiaddr.getPeerId();return null==e||null==n||e.equals(n)})),o=new Map;for(const e of i){const t=e.multiaddr.toString(),n=o.get(t);null==n?o.set(t,e):n.isCertified=n.isCertified||e.isCertified||!1}const a=[...o.values()];if(0===a.length)throw new dn("The dial request has no valid addresses",tf.ERR_NO_VALID_ADDRESSES);const c=[];for(const e of a)null!=this.components.connectionGater.denyDialMultiaddr&&await this.components.connectionGater.denyDialMultiaddr(e.multiaddr)||c.push(e);const l=c.sort(this.addressSorter);if(0===l.length)throw new dn("The connection gater denied all addresses in the dial request",tf.ERR_NO_VALID_ADDRESSES);return this.log.trace("addresses for %p before filtering",e??"unknown peer",s.map((({multiaddr:e})=>e.toString()))),this.log.trace("addresses for %p after filtering",e??"unknown peer",l.map((({multiaddr:e})=>e.toString()))),l}async isDialable(e,t={}){Array.isArray(e)||(e=[e]);try{const n=await this.calculateMultiaddrs(void 0,new Set(e.map((e=>e.toString()))),t);return!1!==t.runOnTransientConnection||null!=n.find((e=>!Ap.matches(e.multiaddr)))}catch(e){this.log.trace("error calculating if multiaddr(s) were dialable",e)}return!1}}const Tf=50,Df={minConnections:5,maxConnections:100,inboundConnectionThreshold:5,maxIncomingPendingConnections:10,autoDialConcurrency:25,autoDialPriority:0,autoDialMaxQueueLength:100,autoDialPeerRetryThreshold:wf,autoDialDiscoveredPeersDebounce:10};class kf{started;connections;allow;deny;maxIncomingPendingConnections;incomingPendingConnections;maxConnections;dialQueue;autoDial;connectionPruner;inboundConnectionRateLimiter;peerStore;metrics;events;log;constructor(e,t={}){this.maxConnections=t.maxConnections??Df.maxConnections;const n=t.minConnections??Df.minConnections;if(this.maxConnections<n)throw new dn("Connection Manager maxConnections must be greater than minConnections",tf.ERR_INVALID_PARAMETERS);this.connections=new Kh,this.started=!1,this.peerStore=e.peerStore,this.metrics=e.metrics,this.events=e.events,this.log=e.logger.forComponent("libp2p:connection-manager"),this.onConnect=this.onConnect.bind(this),this.onDisconnect=this.onDisconnect.bind(this),this.events.addEventListener("connection:open",this.onConnect),this.events.addEventListener("connection:close",this.onDisconnect),this.allow=(t.allow??[]).map((e=>or(e))),this.deny=(t.deny??[]).map((e=>or(e))),this.incomingPendingConnections=0,this.maxIncomingPendingConnections=t.maxIncomingPendingConnections??Df.maxIncomingPendingConnections,this.inboundConnectionRateLimiter=new cf({points:t.inboundConnectionThreshold??Df.inboundConnectionThreshold,duration:1}),this.autoDial=new vf({connectionManager:this,peerStore:e.peerStore,events:e.events,logger:e.logger},{minConnections:n,autoDialConcurrency:t.autoDialConcurrency??Df.autoDialConcurrency,autoDialPriority:t.autoDialPriority??Df.autoDialPriority,autoDialPeerRetryThreshold:t.autoDialPeerRetryThreshold??Df.autoDialPeerRetryThreshold,autoDialDiscoveredPeersDebounce:t.autoDialDiscoveredPeersDebounce??Df.autoDialDiscoveredPeersDebounce,maxQueueLength:t.autoDialMaxQueueLength??Df.autoDialMaxQueueLength}),this.connectionPruner=new _f({connectionManager:this,peerStore:e.peerStore,events:e.events,logger:e.logger},{maxConnections:this.maxConnections,allow:this.allow}),this.dialQueue=new Af(e,{addressSorter:t.addressSorter??kp,maxParallelDials:t.maxParallelDials??50,maxDialQueueLength:t.maxDialQueueLength??500,maxPeerAddrsToDial:t.maxPeerAddrsToDial??25,dialTimeout:t.dialTimeout??5e3,resolvers:t.resolvers??{dnsaddr:$p},connections:this.connections})}isStarted(){return this.started}async start(){this.metrics?.registerMetricGroup("libp2p_connection_manager_connections",{calculate:()=>{const e={inbound:0,outbound:0};for(const t of this.connections.values())for(const n of t)"inbound"===n.direction?e.inbound++:e.outbound++;return e}}),this.metrics?.registerMetricGroup("libp2p_protocol_streams_total",{label:"protocol",calculate:()=>{const e={};for(const t of this.connections.values())for(const n of t)for(const t of n.streams){const n=`${t.direction} ${t.protocol??"unnegotiated"}`;e[n]=(e[n]??0)+1}return e}}),this.metrics?.registerMetricGroup("libp2p_connection_manager_protocol_streams_per_connection_90th_percentile",{label:"protocol",calculate:()=>{const e={};for(const t of this.connections.values())for(const n of t){const t={};for(const e of n.streams){const n=`${e.direction} ${e.protocol??"unnegotiated"}`;t[n]=(t[n]??0)+1}for(const[n,r]of Object.entries(t))e[n]=e[n]??[],e[n].push(r)}const t={};for(let[n,r]of Object.entries(e)){r=r.sort(((e,t)=>e-t));const e=Math.floor(.9*r.length);t[n]=r[e]}return t}}),this.dialQueue.start(),this.autoDial.start(),this.started=!0,this.log("started")}async afterStart(){Promise.resolve().then((async()=>{const e=await this.peerStore.all({filters:[e=>e.tags.has("keep-alive")]});await Promise.all(e.map((async e=>{await this.openConnection(e.id).catch((e=>{this.log.error(e)}))})))})).catch((e=>{this.log.error(e)})),this.autoDial.afterStart()}async stop(){this.dialQueue.stop(),this.autoDial.stop();const e=[];for(const t of this.connections.values())for(const n of t)e.push((async()=>{try{await n.close()}catch(e){this.log.error(e)}})());this.log("closing %d connections",e.length),await Promise.all(e),this.connections.clear(),this.log("stopped")}onConnect(e){this._onConnect(e).catch((e=>{this.log.error(e)}))}async _onConnect(e){const{detail:t}=e;if(!this.started)return void await t.close();const n=t.remotePeer,r=this.connections.get(n);let s=!1;null!=r?r.push(t):(s=!0,this.connections.set(n,[t])),null!=n.publicKey&&"RSA"===n.type&&await this.peerStore.patch(n,{publicKey:n.publicKey}),s&&this.events.safeDispatchEvent("peer:connect",{detail:t.remotePeer})}onDisconnect(e){const{detail:t}=e;if(!this.started)return;const n=t.remotePeer;let r=this.connections.get(n);null!=r&&r.length>1?(r=r.filter((e=>e.id!==t.id)),this.connections.set(n,r)):null!=r&&(this.connections.delete(n),this.events.safeDispatchEvent("peer:disconnect",{detail:t.remotePeer}))}getConnections(e){if(null!=e)return this.connections.get(e)??[];let t=[];for(const e of this.connections.values())t=t.concat(e);return t}getConnectionsMap(){return this.connections}async openConnection(e,t={}){if(!this.isStarted())throw new dn("Not started",tf.ERR_NODE_NOT_STARTED);t.signal?.throwIfAborted();const{peerId:n}=uf(e);if(null!=n&&!0!==t.force){this.log("dial %p",n);const e=this.getConnections(n).find((e=>!e.transient));if(null!=e)return this.log("had an existing non-transient connection to %p",n),e}const r=await this.dialQueue.dial(e,{...t,priority:t.priority??Tf});let s=this.connections.get(r.remotePeer);null==s&&(s=[],this.connections.set(r.remotePeer,s));let i=!1;for(const e of s)e.id===r.id&&(i=!0);return i||s.push(r),r}async closeConnections(e,t={}){const n=this.connections.get(e)??[];await Promise.all(n.map((async e=>{try{await e.close(t)}catch(t){e.abort(t)}})))}async acceptIncomingConnection(e){if(this.deny.some((t=>e.remoteAddr.toString().startsWith(t.toString()))))return this.log("connection from %a refused - connection remote address was in deny list",e.remoteAddr),!1;if(this.allow.some((t=>e.remoteAddr.toString().startsWith(t.toString()))))return this.incomingPendingConnections++,!0;if(this.incomingPendingConnections===this.maxIncomingPendingConnections)return this.log("connection from %a refused - incomingPendingConnections exceeded by host",e.remoteAddr),!1;if(e.remoteAddr.isThinWaistAddress()){const t=e.remoteAddr.nodeAddress().address;try{await this.inboundConnectionRateLimiter.consume(t,1)}catch{return this.log("connection from %a refused - inboundConnectionThreshold exceeded by host %s",e.remoteAddr,t),!1}}return this.getConnections().length<this.maxConnections?(this.incomingPendingConnections++,!0):(this.log("connection from %a refused - maxConnections exceeded",e.remoteAddr),!1)}afterUpgradeInbound(){this.incomingPendingConnections--}getDialQueue(){const e={queued:"queued",running:"active",errored:"error",complete:"success"};return this.dialQueue.queue.queue.map((t=>({id:t.id,status:e[t.status],peerId:t.options.peerId,multiaddrs:[...t.options.multiaddrs].map((e=>or(e)))})))}async isDialable(e,t={}){return this.dialQueue.isDialable(e,t)}}class Pf{routers;started;components;constructor(e,t){this.routers=t.routers??[],this.started=!1,this.components=e}isStarted(){return this.started}async start(){this.started=!0}async stop(){this.started=!1}async*findProviders(e,t={}){if(0===this.routers.length)throw new dn("No content routers available",tf.ERR_NO_ROUTERS_AVAILABLE);const n=this,r=new $h;for await(const s of dr(...n.routers.map((n=>n.findProviders(e,t)))))null!=s&&(s.multiaddrs.length>0&&await this.components.peerStore.merge(s.id,{multiaddrs:s.multiaddrs}),r.has(s.id)||(r.add(s.id),yield s))}async provide(e,t={}){if(0===this.routers.length)throw new dn("No content routers available",tf.ERR_NO_ROUTERS_AVAILABLE);await Promise.all(this.routers.map((async n=>{await n.provide(e,t)})))}async put(e,t,n){if(!this.isStarted())throw new dn(ef.NOT_STARTED_YET,tf.ERR_NODE_NOT_STARTED);await Promise.all(this.routers.map((async r=>{await r.put(e,t,n)})))}async get(e,t){if(!this.isStarted())throw new dn(ef.NOT_STARTED_YET,tf.ERR_NODE_NOT_STARTED);return Promise.any(this.routers.map((async n=>n.get(e,t))))}}const Cf=globalThis.CustomEvent??Event;async function*xf(e,t={}){let n=t.concurrency??1/0;n<1&&(n=1/0);const r=null!=t.ordered&&t.ordered,s=new EventTarget,i=[];let o,a=ar(),c=ar(),l=!1,u=!1;function h(){return r?i[0]?.done:Boolean(i.find((e=>e.done)))}function*d(){for(;i.length>0&&i[0].done;){const e=i[0];if(i.shift(),!e.ok)throw u=!0,a.resolve(),e.err;yield e.value,a.resolve()}}function*p(){for(;h();)for(let e=0;e<i.length;e++)if(i[e].done){const t=i[e];if(i.splice(e,1),e--,!t.ok)throw u=!0,a.resolve(),t.err;yield t.value,a.resolve()}}for(s.addEventListener("task-complete",(()=>{c.resolve()})),Promise.resolve().then((async()=>{try{for await(const t of e){if(i.length===n&&(a=ar(),await a.promise),u)break;const e={done:!1};i.push(e),t().then((t=>{e.done=!0,e.ok=!0,e.value=t,s.dispatchEvent(new Cf("task-complete"))}),(t=>{e.done=!0,e.err=t,s.dispatchEvent(new Cf("task-complete"))}))}l=!0,s.dispatchEvent(new Cf("task-complete"))}catch(e){o=e,s.dispatchEvent(new Cf("task-complete"))}}));;){if(h()||(c=ar(),await c.promise),null!=o)throw o;if(r?yield*d():yield*p(),l&&0===i.length)break}}class Nf{log;peerId;peerStore;routers;constructor(e,t={}){this.log=e.logger.forComponent("libp2p:peer-routing"),this.peerId=e.peerId,this.peerStore=e.peerStore,this.routers=t.routers??[]}async findPeer(e,t){if(0===this.routers.length)throw new dn("No peer routers available",tf.ERR_NO_ROUTERS_AVAILABLE);if(e.toString()===this.peerId.toString())throw new dn("Should not try to find self",tf.ERR_FIND_SELF);const n=this,r=dr(...this.routers.map((r=>async function*(){try{yield await r.findPeer(e,t)}catch(e){n.log.error(e)}}())));for await(const e of r)if(null!=e)return e.multiaddrs.length>0&&await this.peerStore.merge(e.id,{multiaddrs:e.multiaddrs}),e;throw new dn(ef.NOT_FOUND,tf.ERR_NOT_FOUND)}async*getClosestPeers(e,t={}){if(0===this.routers.length)throw new dn("No peer routers available",tf.ERR_NO_ROUTERS_AVAILABLE);const n=this,r=new $h;for await(const s of xf(async function*(){const r=dr(...n.routers.map((n=>n.getClosestPeers(e,t))));for await(let e of r)yield async()=>{if(0===e.multiaddrs.length)try{e=await n.findPeer(e.id,{...t,useCache:!1})}catch(e){return void n.log.error("could not find peer multiaddrs",e)}return e}}()))null!=s&&(s.multiaddrs.length>0&&await this.peerStore.merge(s.id,{multiaddrs:s.multiaddrs}),r.has(s.id)||(r.add(s.id),yield s))}}class Mf extends mn{peerRouting;log;walking;walkers;shutdownController;walkController;needNext;constructor(e){super(),this.log=e.logger.forComponent("libp2p:random-walk"),this.peerRouting=e.peerRouting,this.walkers=0,this.walking=!1,this.shutdownController=new AbortController,this.shutdownController.signal}start(){this.shutdownController=new AbortController,this.shutdownController.signal}stop(){this.shutdownController.abort()}async*walk(e){this.walking||this.startWalk(),this.walkers++;const t=Ss([this.shutdownController.signal,e?.signal]);try{for(;;){this.needNext?.resolve(),this.needNext=ar();const e=await df(this,"walk:peer",t,{errorEvent:"walk:error"});yield e.detail}}finally{t.clear(),this.walkers--,0===this.walkers&&(this.walkController?.abort(),this.walkController=void 0)}}startWalk(){this.walking=!0,this.walkController=new AbortController,this.walkController.signal;const e=Ss([this.walkController.signal,this.shutdownController.signal]),t=Date.now();let n=0;Promise.resolve().then((async()=>{for(this.log("start walk");this.walkers>0;)try{for await(const t of this.peerRouting.getClosestPeers(Co(32),{signal:e}))e.throwIfAborted(),this.log("found peer %p",t.id),n++,this.safeDispatchEvent("walk:peer",{detail:t}),1===this.walkers&&null!=this.needNext&&await Ir(this.needNext.promise,e)}catch(e){this.log.error("randomwalk errored",e),this.safeDispatchEvent("walk:error",{detail:e})}})).catch((e=>{this.log.error("randomwalk errored",e)})).finally((()=>{this.log("finished walk, found %d peers after %dms",n,Date.now()-t),this.walking=!1}))}}class Of{log;topologies;handlers;components;constructor(e){this.log=e.logger.forComponent("libp2p:registrar"),this.topologies=new Map,this.handlers=new Map,this.components=e,this._onDisconnect=this._onDisconnect.bind(this),this._onPeerUpdate=this._onPeerUpdate.bind(this),this._onPeerIdentify=this._onPeerIdentify.bind(this),this.components.events.addEventListener("peer:disconnect",this._onDisconnect),this.components.events.addEventListener("peer:update",this._onPeerUpdate),this.components.events.addEventListener("peer:identify",this._onPeerIdentify)}getProtocols(){return Array.from(new Set([...this.handlers.keys()])).sort()}getHandler(e){const t=this.handlers.get(e);if(null==t)throw new dn(`No handler registered for protocol ${e}`,tf.ERR_NO_HANDLER_FOR_PROTOCOL);return t}getTopologies(e){const t=this.topologies.get(e);return null==t?[]:[...t.values()]}async handle(e,t,n){if(this.handlers.has(e))throw new dn(`Handler already registered for protocol ${e}`,tf.ERR_PROTOCOL_HANDLER_ALREADY_REGISTERED);const r=nf.bind({ignoreUndefined:!0})({maxInboundStreams:32,maxOutboundStreams:64},n);this.handlers.set(e,{handler:t,options:r}),await this.components.peerStore.merge(this.components.peerId,{protocols:[e]})}async unhandle(e){(Array.isArray(e)?e:[e]).forEach((e=>{this.handlers.delete(e)})),await this.components.peerStore.patch(this.components.peerId,{protocols:this.getProtocols()})}async register(e,t){if(null==t)throw new dn("invalid topology",tf.ERR_INVALID_PARAMETERS);const n=`${(1e9*Math.random()).toString(36)}${Date.now()}`;let r=this.topologies.get(e);return null==r&&(r=new Map,this.topologies.set(e,r)),r.set(n,t),n}unregister(e){for(const[t,n]of this.topologies.entries())n.has(e)&&(n.delete(e),0===n.size&&this.topologies.delete(t))}_onDisconnect(e){const t=e.detail;this.components.peerStore.get(t).then((e=>{for(const n of e.protocols){const e=this.topologies.get(n);if(null!=e)for(const n of e.values())!1!==n.filter?.has(t)&&(n.filter?.remove(t),n.onDisconnect?.(t))}})).catch((e=>{e.code!==tf.ERR_NOT_FOUND&&this.log.error("could not inform topologies of disconnecting peer %p",t,e)}))}_onPeerUpdate(e){const{peer:t,previous:n}=e.detail,r=(n?.protocols??[]).filter((e=>!t.protocols.includes(e)));for(const e of r){const n=this.topologies.get(e);if(null!=n)for(const e of n.values())!1!==e.filter?.has(t.id)&&(e.filter?.remove(t.id),e.onDisconnect?.(t.id))}}_onPeerIdentify(e){const t=e.detail.protocols,n=e.detail.connection,r=e.detail.peerId;for(const e of t){const t=this.topologies.get(e);if(null!=t)for(const e of t.values())n.transient&&!0!==e.notifyOnTransient||!0!==e.filter?.has(r)&&(e.filter?.add(r),e.onConnect?.(r,n))}}}class Lf extends Map{metric;constructor(e){super();const{name:t,metrics:n}=e;this.metric=n.registerMetric(t),this.updateComponentMetric()}set(e,t){return super.set(e,t),this.updateComponentMetric(),this}delete(e){const t=super.delete(e);return this.updateComponentMetric(),t}clear(){super.clear(),this.updateComponentMetric()}updateComponentMetric(){this.metric.update(this.size)}}class Bf{log;components;transports;listeners;faultTolerance;started;constructor(e,t={}){this.log=e.logger.forComponent("libp2p:transports"),this.components=e,this.started=!1,this.transports=new Map,this.listeners=function(e){const{name:t,metrics:n}=e;let r;return r=null!=n?new Lf({name:t,metrics:n}):new Map,r}({name:"libp2p_transport_manager_listeners",metrics:this.components.metrics}),this.faultTolerance=t.faultTolerance??un.FATAL_ALL}add(e){const t=e[Symbol.toStringTag];if(null==t)throw new dn("Transport must have a valid tag",tf.ERR_INVALID_KEY);if(this.transports.has(t))throw new dn(`There is already a transport with the tag ${t}`,tf.ERR_DUPLICATE_TRANSPORT);this.log("adding transport %s",t),this.transports.set(t,e),this.listeners.has(t)||this.listeners.set(t,[])}isStarted(){return this.started}start(){this.started=!0}async afterStart(){const e=this.components.addressManager.getListenAddrs();await this.listen(e)}async stop(){const e=[];for(const[t,n]of this.listeners)for(this.log("closing listeners for %s",t);n.length>0;){const t=n.pop();null!=t&&e.push(t.close())}await Promise.all(e),this.log("all listeners closed");for(const e of this.listeners.keys())this.listeners.set(e,[]);this.started=!1}async dial(e,t){const n=this.dialTransportForMultiaddr(e);if(null==n)throw new dn(`No transport available for address ${String(e)}`,tf.ERR_TRANSPORT_UNAVAILABLE);try{return await n.dial(e,{...t,upgrader:this.components.upgrader})}catch(e){throw null==e.code&&(e.code=tf.ERR_TRANSPORT_DIAL_FAILED),e}}getAddrs(){let e=[];for(const t of this.listeners.values())for(const n of t)e=[...e,...n.getAddrs()];return e}getTransports(){return Array.of(...this.transports.values())}getListeners(){return Array.of(...this.listeners.values()).flat()}dialTransportForMultiaddr(e){for(const t of this.transports.values()){if(t.dialFilter([e]).length>0)return t}}listenTransportForMultiaddr(e){for(const t of this.transports.values()){if(t.listenFilter([e]).length>0)return t}}async listen(e){if(!this.isStarted())throw new dn("Not started",tf.ERR_NODE_NOT_STARTED);if(null==e||0===e.length)return void this.log("no addresses were provided for listening, this node is dial only");const t=[];for(const[n,r]of this.transports.entries()){const s=r.listenFilter(e),i=[];for(const e of s){this.log("creating listener for %s on %a",n,e);const t=r.createListener({upgrader:this.components.upgrader});let s=this.listeners.get(n)??[];null==s&&(s=[],this.listeners.set(n,s)),s.push(t),t.addEventListener("listening",(()=>{this.components.events.safeDispatchEvent("transport:listening",{detail:t})})),t.addEventListener("close",(()=>{const e=s.findIndex((e=>e===t));s.splice(e,1),this.components.events.safeDispatchEvent("transport:close",{detail:t})})),i.push(t.listen(e))}if(0===i.length){t.push(n);continue}if(null==(await Promise.allSettled(i)).find((e=>"fulfilled"===e.status))&&this.faultTolerance!==un.NO_FATAL)throw new dn(`Transport (${n}) could not listen on any available address`,tf.ERR_NO_VALID_ADDRESSES)}if(t.length===this.transports.size){const e=`no valid addresses were provided for transports [${t.join(", ")}]`;if(this.faultTolerance===un.FATAL_ALL)throw new dn(e,tf.ERR_NO_VALID_ADDRESSES);this.log(`libp2p in dial mode only: ${e}`)}}async remove(e){const t=this.listeners.get(e)??[];this.log.trace("removing transport %s",e);const n=[];for(this.log.trace("closing listeners for %s",e);t.length>0;){const e=t.pop();null!=e&&n.push(e.close())}await Promise.all(n),this.transports.delete(e),this.listeners.delete(e)}async removeAll(){const e=[];for(const t of this.transports.keys())e.push(this.remove(t));await Promise.all(e)}}const Uf="/multistream/1.0.0",Ff=1024,Vf=Tt("\n");async function Kf(e,t,n){await e.write(t,n)}async function $f(e,t){const n=await async function(e,t){const n=await e.read(t);if(0===n.byteLength||n.get(n.byteLength-1)!==Vf[0])throw t.log.error("Invalid mss message - missing newline",n),new dn("missing newline","ERR_INVALID_MULTISTREAM_SELECT_MESSAGE");return n.sublist(0,-1)}(e,t);return Gt(n.subarray())}async function qf(e,t,n){if(1===(t=Array.isArray(t)?[...t]:[t]).length&&!1===n.negotiateFully)return function(e,t,n){const r=e.sink.bind(e),s=e.source;let i=!1,o=!1;const a=ar();let c=!1,l=!1;const u=ar();let h=!1,d=!1;const p=ar(),f=Pr({sink:r,source:s},{...n,maxDataLength:Ff});async function g(){if(o)return n.log.trace("optimistic: already negotiating %s stream",t),void await a.promise;o=!0;try{c||(n.log.trace("optimistic: doing send protocol for %s stream",t),await m()),h||(n.log.trace("optimistic: doing read protocol for %s stream",t),await y())}finally{o=!1,i=!0,a.resolve()}}async function m(){if(l)await u.promise;else{l=!0;try{n.log.trace('optimistic: write ["%s", "%s", data] in source',Uf,t),await f.writeV([Tt(`${Uf}\n`),Tt(`${t}\n`)]),n.log.trace('optimistic: wrote ["%s", "%s", data] in source',Uf,t)}finally{c=!0,l=!1,u.resolve()}}}async function y(){if(d)await p.promise;else{d=!0;try{n.log.trace("optimistic: reading multistream select header");let e=await $f(f,n);if(n.log.trace('optimistic: read multistream select header "%s"',e),e===Uf&&(e=await $f(f,n)),n.log.trace('optimistic: read protocol "%s", expecting "%s"',e,t),e!==t)throw new dn("protocol selection failed","ERR_UNSUPPORTED_PROTOCOL")}finally{h=!0,d=!1,p.resolve()}}}if(e.sink=async e=>{const{sink:r}=f.unwrap();await r(async function*(){let r=!1;for await(const s of e){if(l&&await u.promise,c)yield s;else{l=!0,n.log.trace('optimistic: write ["%s", "%s", data(%d)] in sink',Uf,t,s.byteLength);const e=`${t}\n`;yield new Sr(Uint8Array.from([19]),Tt(`${Uf}\n`),k(e.length),Tt(e),s).subarray(),n.log.trace('optimistic: wrote ["%s", "%s", data(%d)] in sink',Uf,t,s.byteLength),c=!0,l=!1,u.resolve(),g().catch((e=>{n.log.error("could not finish optimistic protocol negotiation of %s",t,e)}))}r=!0}r||await g()}())},e.source=async function*(){await g(),n.log.trace('optimistic: reading data from "%s" stream',t),yield*f.unwrap().source}(),null!=e.closeRead){const t=e.closeRead.bind(e);e.closeRead=async e=>{i||await g().catch((e=>{n.log.error("could not negotiate protocol before close read",e)})),await t(e)}}if(null!=e.closeWrite){const t=e.closeWrite.bind(e);e.closeWrite=async e=>{i||await g().catch((e=>{n.log.error("could not negotiate protocol before close write",e)})),await t(e)}}if(null!=e.close){const t=e.close.bind(e);e.close=async e=>{const n=[];l&&n.push(u.promise),d&&n.push(p.promise),n.length>0?await Ir(Promise.all(n),e?.signal):(i=!0,o=!1,a.resolve()),await t(e)}}return{stream:e,protocol:t}}(e,t[0],n);const r=Pr(e,{...n,maxDataLength:Ff}),s=t.shift();if(null==s)throw new Error("At least one protocol must be specified");n.log.trace('select: write ["%s", "%s"]',Uf,s);const i=Tt(`${Uf}\n`),o=Tt(`${s}\n`);await async function(e,t,n){await e.writeV(t,n)}(r,[i,o],n),n.log.trace("select: reading multistream-select header");let a=await $f(r,n);if(n.log.trace('select: read "%s"',a),a===Uf&&(n.log.trace("select: reading protocol response"),a=await $f(r,n),n.log.trace('select: read "%s"',a)),a===s)return{stream:r.unwrap(),protocol:s};for(const e of t){n.log.trace('select: write "%s"',e),await Kf(r,Tt(`${e}\n`),n),n.log.trace("select: reading protocol response");const t=await $f(r,n);if(n.log.trace('select: read "%s" for "%s"',t,e),t===e)return{stream:r.unwrap(),protocol:e}}throw new dn("protocol selection failed","ERR_UNSUPPORTED_PROTOCOL")}async function Hf(e,t,n){t=Array.isArray(t)?t:[t],n.log.trace("handle: available protocols %s",t);const r=Pr(e,{...n,maxDataLength:Ff,maxLengthLength:2});for(;;){n.log.trace("handle: reading incoming string");const e=await $f(r,n);if(n.log.trace('handle: read "%s"',e),e!==Uf){if(t.includes(e))return n.log.trace('handle: respond with "%s" for "%s"',e,e),await Kf(r,Tt(`${e}\n`),n),n.log.trace('handle: responded with "%s" for "%s"',e,e),{stream:r.unwrap(),protocol:e};if("ls"!==e)n.log('handle: respond with "na" for "%s"',e),await Kf(r,Tt("na\n"),n),n.log('handle: responded with "na" for "%s"',e);else{const s=new Sr(...t.map((e=>Nr.single(Tt(`${e}\n`)))),Tt("\n"));n.log.trace('handle: respond with "%s" for %s',t,e),await Kf(r,s,n),n.log.trace('handle: responded with "%s" for %s',t,e)}}else n.log.trace('handle: respond with "%s" for "%s"',Uf,e),await Kf(r,Tt(`${Uf}\n`),n),n.log.trace('handle: responded with "%s" for "%s"',Uf,e)}}class zf{id;remoteAddr;remotePeer;direction;timeline;multiplexer;encryption;status;transient;log;tags;_newStream;_close;_abort;_getStreams;constructor(e){const{remoteAddr:t,remotePeer:n,newStream:r,close:s,abort:i,getStreams:o}=e;this.id=`${parseInt(String(1e9*Math.random())).toString(36)}${Date.now()}`,this.remoteAddr=t,this.remotePeer=n,this.direction=e.direction,this.status="open",this.timeline=e.timeline,this.multiplexer=e.multiplexer,this.encryption=e.encryption,this.transient=e.transient??!1,this.log=e.logger.forComponent(`libp2p:connection:${this.direction}:${this.id}`),null==this.remoteAddr.getPeerId()&&(this.remoteAddr=this.remoteAddr.encapsulate(`/p2p/${this.remotePeer}`)),this._newStream=r,this._close=s,this._abort=i,this._getStreams=o,this.tags=[]}[Symbol.toStringTag]="Connection";[Xt]=!0;get streams(){return this._getStreams()}async newStream(e,t){if("closing"===this.status)throw new dn("the connection is being closed","ERR_CONNECTION_BEING_CLOSED");if("closed"===this.status)throw new dn("the connection is closed","ERR_CONNECTION_CLOSED");if(Array.isArray(e)||(e=[e]),this.transient&&!0!==t?.runOnTransientConnection)throw new dn("Cannot open protocol stream on transient connection","ERR_TRANSIENT_CONNECTION");const n=await this._newStream(e,t);return n.direction="outbound",n}async close(e={}){if("closed"!==this.status&&"closing"!==this.status){if(this.log("closing connection to %a",this.remoteAddr),this.status="closing",null==e.signal){const t=AbortSignal.timeout(500);e={...e,signal:t}}try{this.log.trace("closing all streams"),await Promise.all(this.streams.map((async t=>t.close(e)))),this.log.trace("closing underlying transport"),await this._close(e),this.log.trace("updating timeline with close time"),this.status="closed",this.timeline.close=Date.now()}catch(e){this.log.error("error encountered during graceful close of connection to %a",this.remoteAddr,e),this.abort(e)}}}abort(e){this.log.error("aborting connection to %a due to error",this.remoteAddr,e),this.status="closing",this.streams.forEach((t=>{t.abort(e)})),this.log.error("all streams aborted",this.streams.length),this._abort(e),this.timeline.close=Date.now(),this.status="closed"}}function Wf(e,t,n){let r=0;return n.streams.forEach((n=>{n.direction===t&&n.protocol===e&&r++})),r}class jf{components;connectionEncryption;muxers;inboundUpgradeTimeout;events;constructor(e,t){this.components=e,this.connectionEncryption=new Map,t.connectionEncryption.forEach((e=>{this.connectionEncryption.set(e.protocol,e)})),this.muxers=new Map,t.muxers.forEach((e=>{this.muxers.set(e.protocol,e)})),this.inboundUpgradeTimeout=t.inboundUpgradeTimeout??2e3,this.events=e.events}async shouldBlockConnection(e,t,n){const r=this.components.connectionGater[n];if(void 0!==r&&await r(e,t))throw new dn(`The multiaddr connection is blocked by gater.${n}`,tf.ERR_CONNECTION_INTERCEPTED)}async upgradeInbound(e,t){if(!await this.components.connectionManager.acceptIncomingConnection(e))throw new dn("connection denied",tf.ERR_CONNECTION_DENIED);let n,r,s,i,o;const a=AbortSignal.timeout(this.inboundUpgradeTimeout),c=()=>{e.abort(new dn("inbound upgrade timeout",fn))};a.addEventListener("abort",c,{once:!0});try{if(!0===await(this.components.connectionGater.denyInboundConnection?.(e)))throw new dn("The multiaddr connection is blocked by gater.acceptConnection",tf.ERR_CONNECTION_INTERCEPTED);this.components.metrics?.trackMultiaddrConnection(e),e.log("starting the inbound connection upgrade");let a=e;if(!0!==t?.skipProtection){const t=this.components.connectionProtector;null!=t&&(e.log("protecting the inbound connection"),a=await t.protect(e))}try{if(n=a,!0!==t?.skipEncryption){({conn:n,remotePeer:r,protocol:o}=await this._encryptInbound(a));const e={...a,...n};await this.shouldBlockConnection(r,e,"denyInboundEncryptedConnection")}else{const t=e.remoteAddr.getPeerId();if(null==t)throw new dn("inbound connection that skipped encryption must have a peer id",tf.ERR_INVALID_MULTIADDR);const n=bs(t);o="native",r=n}if(s=n,null!=t?.muxerFactory)i=t.muxerFactory;else if(this.muxers.size>0){const e=await this._multiplexInbound({...a,...n},this.muxers);i=e.muxerFactory,s=e.stream}}catch(t){throw e.log.error("failed to upgrade inbound connection",t),t}return await this.shouldBlockConnection(r,e,"denyInboundUpgradedConnection"),e.log("successfully upgraded inbound connection"),this._createConnection({cryptoProtocol:o,direction:"inbound",maConn:e,upgradedConn:s,muxerFactory:i,remotePeer:r,transient:t?.transient})}finally{a.removeEventListener("abort",c),this.components.connectionManager.afterUpgradeInbound()}}async upgradeOutbound(e,t){const n=e.remoteAddr.getPeerId();let r,s,i,o,a,c;null!=n&&(r=bs(n),await this.shouldBlockConnection(r,e,"denyOutboundConnection")),this.components.metrics?.trackMultiaddrConnection(e),e.log("starting the outbound connection upgrade");let l=e;if(!0!==t?.skipProtection){const t=this.components.connectionProtector;null!=t&&(l=await t.protect(e))}try{if(s=l,!0!==t?.skipEncryption){({conn:s,remotePeer:i,protocol:a}=await this._encryptOutbound(l,r));const e={...l,...s};await this.shouldBlockConnection(i,e,"denyOutboundEncryptedConnection")}else{if(null==r)throw new dn("Encryption was skipped but no peer id was passed",tf.ERR_INVALID_PEER);a="native",i=r}if(o=s,null!=t?.muxerFactory)c=t.muxerFactory;else if(this.muxers.size>0){const e=await this._multiplexOutbound({...l,...s},this.muxers);c=e.muxerFactory,o=e.stream}}catch(t){throw e.log.error("failed to upgrade outbound connection",t),await e.close(t),t}return await this.shouldBlockConnection(i,e,"denyOutboundUpgradedConnection"),e.log("successfully upgraded outbound connection"),this._createConnection({cryptoProtocol:a,direction:"outbound",maConn:e,upgradedConn:o,muxerFactory:c,remotePeer:i,transient:t?.transient})}_createConnection(e){const{cryptoProtocol:t,direction:n,maConn:r,upgradedConn:s,remotePeer:i,muxerFactory:o,transient:a}=e;let c,l,u;null!=o&&(c=o.createStreamMuxer({direction:n,onIncomingStream:e=>{null!=u&&Promise.resolve().then((async()=>{const t=this.components.registrar.getProtocols(),{stream:n,protocol:r}=await Hf(e,t,{log:e.log,yieldBytes:!1});if(null==u)return;u.log("incoming stream opened on %s",r);const s=function(e,t){try{const{options:n}=t.getHandler(e);return n.maxInboundStreams}catch(e){if(e.code!==tf.ERR_NO_HANDLER_FOR_PROTOCOL)throw e}return 32}(r,this.components.registrar);if(Wf(r,"inbound",u)===s){const t=new dn(`Too many inbound protocol streams for protocol "${r}" - limit ${s}`,tf.ERR_TOO_MANY_INBOUND_PROTOCOL_STREAMS);throw e.abort(t),t}e.source=n.source,e.sink=n.sink,e.protocol=r,null!=n.closeWrite&&(e.closeWrite=n.closeWrite),null!=n.closeRead&&(e.closeRead=n.closeRead),null!=n.close&&(e.close=n.close),await this.components.peerStore.merge(i,{protocols:[r]}),this.components.metrics?.trackProtocolStream(e,u),this._onStream({connection:u,stream:e,protocol:r})})).catch((async t=>{u.log.error("error handling incoming stream id %s",e.id,t.message,t.code,t.stack),null==e.timeline.close&&await e.close()}))}}),l=async(e,t={})=>{if(null==c)throw new dn("Stream is not multiplexed",tf.ERR_MUXER_UNAVAILABLE);u.log("starting new stream for protocols %s",e);const n=await c.newStream();u.log.trace("started new stream %s for protocols %s",n.id,e);try{if(null==t.signal){n.log("no abort signal was passed while trying to negotiate protocols %s falling back to default timeout",e);const r=AbortSignal.timeout(3e4);t={...t,signal:r}}n.log.trace("selecting protocol from protocols %s",e);const{stream:r,protocol:s}=await qf(n,e,{...t,log:n.log,yieldBytes:!0});n.log("selected protocol %s",s);const o=function(e,t,n={}){try{const{options:n}=t.getHandler(e);if(null!=n.maxOutboundStreams)return n.maxOutboundStreams}catch(e){if(e.code!==tf.ERR_NO_HANDLER_FOR_PROTOCOL)throw e}return n.maxOutboundStreams??64}(s,this.components.registrar,t),a=Wf(s,"outbound",u);if(a>=o){const e=new dn(`Too many outbound protocol streams for protocol "${s}" - ${a}/${o}`,tf.ERR_TOO_MANY_OUTBOUND_PROTOCOL_STREAMS);throw n.abort(e),e}return await this.components.peerStore.merge(i,{protocols:[s]}),n.source=r.source,n.sink=r.sink,n.protocol=s,null!=r.closeWrite&&(n.closeWrite=r.closeWrite),null!=r.closeRead&&(n.closeRead=r.closeRead),null!=r.close&&(n.close=r.close),this.components.metrics?.trackProtocolStream(n,u),n}catch(t){if(u.log.error("could not create new stream for protocols %s",e,t),null==n.timeline.close&&n.abort(t),null!=t.code)throw t;throw new dn(String(t),tf.ERR_UNSUPPORTED_PROTOCOL)}},Promise.all([c.sink(s.source),s.sink(c.source)]).catch((e=>{u.log.error("error piping data through muxer",e)})));const h=r.timeline;r.timeline=new Proxy(h,{set:(...e)=>(null!=u&&"close"===e[1]&&null!=e[2]&&null==h.close&&(async()=>{try{"open"===u.status&&await u.close()}catch(e){u.log.error("error closing connection after timeline close",e)}finally{this.events.safeDispatchEvent("connection:close",{detail:u})}})().catch((e=>{u.log.error("error thrown while dispatching connection:close event",e)})),Reflect.set(...e))}),r.timeline.upgraded=Date.now();var d;return d={remoteAddr:r.remoteAddr,remotePeer:i,status:"open",direction:n,timeline:r.timeline,multiplexer:c?.protocol,encryption:t,transient:a,logger:this.components.logger,newStream:l??(()=>{throw new dn("connection is not multiplexed",tf.ERR_CONNECTION_NOT_MULTIPLEXED)}),getStreams:()=>null!=c?c.streams:[],close:async e=>{null!=c&&(u.log.trace("close muxer"),await c.close(e)),u.log.trace("close maconn"),await r.close(e),u.log.trace("closed maconn")},abort:e=>{r.abort(e),null!=c&&c.abort(e)}},u=new zf(d),this.events.safeDispatchEvent("connection:open",{detail:u}),u}_onStream(e){const{connection:t,stream:n,protocol:r}=e,{handler:s,options:i}=this.components.registrar.getHandler(r);if(t.transient&&!0!==i.runOnTransientConnection)throw new dn("Cannot open protocol stream on transient connection","ERR_TRANSIENT_CONNECTION");s({connection:t,stream:n})}async _encryptInbound(e){const t=Array.from(this.connectionEncryption.keys());e.log("handling inbound crypto protocol selection",t);try{const{stream:n,protocol:r}=await Hf(e,t,{log:e.log}),s=this.connectionEncryption.get(r);if(null==s)throw new Error(`no crypto module found for ${r}`);return e.log("encrypting inbound connection using",r),{...await s.secureInbound(this.components.peerId,n),protocol:r}}catch(t){throw e.log.error("encrypting inbound connection failed",t),new dn(t.message,tf.ERR_ENCRYPTION_FAILED)}}async _encryptOutbound(e,t){const n=Array.from(this.connectionEncryption.keys());e.log("selecting outbound crypto protocol",n);try{e.log.trace("selecting encrypter from %s",n);const{stream:r,protocol:s}=await qf(e,n,{log:e.log,yieldBytes:!0}),i=this.connectionEncryption.get(s);if(null==i)throw new Error(`no crypto module found for ${s}`);return e.log("encrypting outbound connection to %p using %s",t,i),{...await i.secureOutbound(this.components.peerId,r,t),protocol:s}}catch(n){throw e.log.error("encrypting outbound connection to %p failed",t,n),new dn(n.message,tf.ERR_ENCRYPTION_FAILED)}}async _multiplexOutbound(e,t){const n=Array.from(t.keys());e.log("outbound selecting muxer %s",n);try{e.log.trace("selecting stream muxer from %s",n);const{stream:r,protocol:s}=await qf(e,n,{log:e.log,yieldBytes:!0});e.log("selected %s as muxer protocol",s);return{stream:r,muxerFactory:t.get(s)}}catch(t){throw e.log.error("error multiplexing outbound connection",t),new dn(String(t),tf.ERR_MUXER_UNAVAILABLE)}}async _multiplexInbound(e,t){const n=Array.from(t.keys());e.log("inbound handling muxers %s",n);try{const{stream:r,protocol:s}=await Hf(e,n,{log:e.log});return{stream:r,muxerFactory:t.get(s)}}catch(t){throw e.log.error("error multiplexing inbound connection",t),new dn(String(t),tf.ERR_MUXER_UNAVAILABLE)}}}class Gf extends mn{peerId;peerStore;contentRouting;peerRouting;metrics;services;logger;status;components;log;constructor(e){super(),this.status="stopped";const t=new mn,n=t.dispatchEvent.bind(t);t.dispatchEvent=e=>{const t=n(e),r=this.dispatchEvent(new wn(e.type,{detail:e.detail}));return t||r},this.peerId=e.peerId,this.logger=e.logger??cs(),this.log=this.logger.forComponent("libp2p"),this.services={};const r=this.components=function(e={}){const t=new Kd(e);return new Proxy(t,{get(e,n,r){if("string"==typeof n&&!qd.includes(n)){const e=t.components[n];if(null==e&&!$d.includes(n))throw new dn(`${n} not set`,"ERR_SERVICE_MISSING");return e}return Reflect.get(e,n,r)},set:(e,n,r)=>("string"==typeof n?t.components[n]=r:Reflect.set(e,n,r),!0)})}({peerId:e.peerId,privateKey:e.privateKey,nodeInfo:e.nodeInfo??{name:"libp2p",version:"1.6.0"},logger:this.logger,events:t,datastore:e.datastore??new Bd,connectionGater:jd(e.connectionGater),dns:e.dns});this.peerStore=this.configureComponent("peerStore",new kd(r,{addressFilter:this.components.connectionGater.filterMultiaddrForPeer,...e.peerStore})),null!=e.metrics&&(this.metrics=this.configureComponent("metrics",e.metrics(this.components))),r.events.addEventListener("peer:update",(e=>{if(null==e.detail.previous){const t={id:e.detail.peer.id,multiaddrs:e.detail.peer.addresses.map((e=>e.multiaddr))};r.events.safeDispatchEvent("peer:discovery",{detail:t})}})),null!=e.connectionProtector&&this.configureComponent("connectionProtector",e.connectionProtector(r)),this.components.upgrader=new jf(this.components,{connectionEncryption:(e.connectionEncryption??[]).map(((e,t)=>this.configureComponent(`connection-encryption-${t}`,e(this.components)))),muxers:(e.streamMuxers??[]).map(((e,t)=>this.configureComponent(`stream-muxers-${t}`,e(this.components)))),inboundUpgradeTimeout:e.connectionManager.inboundUpgradeTimeout}),this.configureComponent("transportManager",new Bf(this.components,e.transportManager)),this.configureComponent("connectionManager",new kf(this.components,e.connectionManager)),this.configureComponent("registrar",new Of(this.components)),this.configureComponent("addressManager",new Vd(this.components,e.addresses));const s=(e.peerRouters??[]).map(((e,t)=>this.configureComponent(`peer-router-${t}`,e(this.components))));this.peerRouting=this.components.peerRouting=this.configureComponent("peerRouting",new Nf(this.components,{routers:s}));const i=(e.contentRouters??[]).map(((e,t)=>this.configureComponent(`content-router-${t}`,e(this.components))));if(this.contentRouting=this.components.contentRouting=this.configureComponent("contentRouting",new Pf(this.components,{routers:i})),this.configureComponent("randomWalk",new Mf(this.components)),(e.peerDiscovery??[]).forEach(((e,t)=>{this.configureComponent(`peer-discovery-${t}`,e(this.components)).addEventListener("peer",(e=>{this.#M(e)}))})),e.transports?.forEach(((e,t)=>{this.components.transportManager.add(this.configureComponent(`transport-${t}`,e(this.components)))})),null!=e.services)for(const t of Object.keys(e.services)){const n=(0,e.services[t])(this.components);null!=n?(this.services[t]=n,this.configureComponent(t,n),null!=n[en]&&(this.log("registering service %s for content routing",t),i.push(n[en])),null!=n[sn]&&(this.log("registering service %s for peer routing",t),s.push(n[sn])),null!=n[tn]&&(this.log("registering service %s for peer discovery",t),n[tn].addEventListener?.("peer",(e=>{this.#M(e)})))):this.log.error("service factory %s returned null or undefined instance",t)}}configureComponent(e,t){return null==t&&this.log.error("component %s was null or undefined",e),this.components[e]=t,t}async start(){if("stopped"===this.status){this.status="starting",this.log("libp2p is starting");try{await(this.components.beforeStart?.()),await this.components.start(),await(this.components.afterStart?.()),this.status="started",this.safeDispatchEvent("start",{detail:this}),this.log("libp2p has started")}catch(e){throw this.log.error("An error occurred starting libp2p",e),this.status="started",await this.stop(),e}}}async stop(){"started"===this.status&&(this.log("libp2p is stopping"),this.status="stopping",await(this.components.beforeStop?.()),await this.components.stop(),await(this.components.afterStop?.()),this.status="stopped",this.safeDispatchEvent("stop",{detail:this}),this.log("libp2p has stopped"))}getConnections(e){return this.components.connectionManager.getConnections(e)}getDialQueue(){return this.components.connectionManager.getDialQueue()}getPeers(){const e=new $h;for(const t of this.components.connectionManager.getConnections())e.add(t.remotePeer);return Array.from(e)}async dial(e,t={}){return this.components.connectionManager.openConnection(e,{priority:75,...t})}async dialProtocol(e,t,n={}){if(null==t)throw new dn("no protocols were provided to open a stream",tf.ERR_INVALID_PROTOCOLS_FOR_STREAM);if(0===(t=Array.isArray(t)?t:[t]).length)throw new dn("no protocols were provided to open a stream",tf.ERR_INVALID_PROTOCOLS_FOR_STREAM);return(await this.dial(e,n)).newStream(t,n)}getMultiaddrs(){return this.components.addressManager.getAddresses()}getProtocols(){return this.components.registrar.getProtocols()}async hangUp(e,t={}){ir(e)&&(e=bs(e.getPeerId()??"")),await this.components.connectionManager.closeConnections(e,t)}async getPublicKey(e,t={}){if(this.log("getPublicKey %p",e),null!=e.publicKey)return e.publicKey;try{const t=await this.peerStore.get(e);if(null!=t.id.publicKey)return t.id.publicKey}catch(e){if(e.code!==tf.ERR_NOT_FOUND)throw e}const n=_n([Tt("/pk/"),e.multihash.digest]),r=await this.contentRouting.get(n,t);return Ll(r),await this.peerStore.patch(e,{publicKey:r}),r}async handle(e,t,n){Array.isArray(e)||(e=[e]),await Promise.all(e.map((async e=>{await this.components.registrar.handle(e,t,n)})))}async unhandle(e){Array.isArray(e)||(e=[e]),await Promise.all(e.map((async e=>{await this.components.registrar.unhandle(e)})))}async register(e,t){return this.components.registrar.register(e,t)}unregister(e){this.components.registrar.unregister(e)}async isDialable(e,t={}){return this.components.connectionManager.isDialable(e,t)}#M(e){const{detail:t}=e;t.id.toString()!==this.peerId.toString()?this.components.peerStore.merge(t.id,{multiaddrs:t.multiaddrs}).catch((e=>{this.log.error(e)})):this.log.error(new Error(tf.ERR_DISCOVERED_SELF))}}async function Yf(e={}){const t=e.peerId??=await qh();if(null==t.privateKey)throw new dn("peer id was missing private key","ERR_MISSING_PRIVATE_KEY");return e.privateKey??=await Ul(t.privateKey),new Gf(await async function(e){const t=nf(rf,e);if(null===t.connectionProtector&&null!=globalThis.process?.env?.LIBP2P_FORCE_PNET)throw new dn(ef.ERR_PROTECTOR_REQUIRED,tf.ERR_PROTECTOR_REQUIRED);if(!(await Es(t.privateKey.public.bytes,t.privateKey.bytes)).equals(t.peerId))throw new dn("Private key doesn't match peer id",tf.ERR_INVALID_KEY);return t}(e))}new Zt("SHARDING"),ls("datastore:core:tiered");const Qf=(e,t)=>t.some((t=>e instanceof t));let Jf,Zf;const Xf=new WeakMap,eg=new WeakMap,tg=new WeakMap;let ng={get(e,t,n){if(e instanceof IDBTransaction){if("done"===t)return Xf.get(e);if("store"===t)return n.objectStoreNames[1]?void 0:n.objectStore(n.objectStoreNames[0])}return og(e[t])},set:(e,t,n)=>(e[t]=n,!0),has:(e,t)=>e instanceof IDBTransaction&&("done"===t||"store"===t)||t in e};function rg(e){ng=e(ng)}function sg(e){return(Zf||(Zf=[IDBCursor.prototype.advance,IDBCursor.prototype.continue,IDBCursor.prototype.continuePrimaryKey])).includes(e)?function(...t){return e.apply(ag(this),t),og(this.request)}:function(...t){return og(e.apply(ag(this),t))}}function ig(e){return"function"==typeof e?sg(e):(e instanceof IDBTransaction&&function(e){if(Xf.has(e))return;const t=new Promise(((t,n)=>{const r=()=>{e.removeEventListener("complete",s),e.removeEventListener("error",i),e.removeEventListener("abort",i)},s=()=>{t(),r()},i=()=>{n(e.error||new DOMException("AbortError","AbortError")),r()};e.addEventListener("complete",s),e.addEventListener("error",i),e.addEventListener("abort",i)}));Xf.set(e,t)}(e),Qf(e,Jf||(Jf=[IDBDatabase,IDBObjectStore,IDBIndex,IDBCursor,IDBTransaction]))?new Proxy(e,ng):e)}function og(e){if(e instanceof IDBRequest)return function(e){const t=new Promise(((t,n)=>{const r=()=>{e.removeEventListener("success",s),e.removeEventListener("error",i)},s=()=>{t(og(e.result)),r()},i=()=>{n(e.error),r()};e.addEventListener("success",s),e.addEventListener("error",i)}));return tg.set(t,e),t}(e);if(eg.has(e))return eg.get(e);const t=ig(e);return t!==e&&(eg.set(e,t),tg.set(t,e)),t}const ag=e=>tg.get(e);const cg=["get","getKey","getAll","getAllKeys","count"],lg=["put","add","delete","clear"],ug=new Map;function hg(e,t){if(!(e instanceof IDBDatabase)||t in e||"string"!=typeof t)return;if(ug.get(t))return ug.get(t);const n=t.replace(/FromIndex$/,""),r=t!==n,s=lg.includes(n);if(!(n in(r?IDBIndex:IDBObjectStore).prototype)||!s&&!cg.includes(n))return;const i=async function(e,...t){const i=this.transaction(e,s?"readwrite":"readonly");let o=i.store;return r&&(o=o.index(t.shift())),(await Promise.all([o[n](...t),s&&i.done]))[0]};return ug.set(t,i),i}rg((e=>({...e,get:(t,n,r)=>hg(t,n)||e.get(t,n,r),has:(t,n)=>!!hg(t,n)||e.has(t,n)})));const dg=["continue","continuePrimaryKey","advance"],pg={},fg=new WeakMap,gg=new WeakMap,mg={get(e,t){if(!dg.includes(t))return e[t];let n=pg[t];return n||(n=pg[t]=function(...e){fg.set(this,gg.get(this)[t](...e))}),n}};async function*yg(...e){let t=this;if(t instanceof IDBCursor||(t=await t.openCursor(...e)),!t)return;const n=new Proxy(t,mg);for(gg.set(n,t),tg.set(n,ag(t));t;)yield n,t=await(fg.get(n)||t.continue()),fg.delete(n)}function wg(e,t){return t===Symbol.asyncIterator&&Qf(e,[IDBIndex,IDBObjectStore,IDBCursor])||"iterate"===t&&Qf(e,[IDBIndex,IDBObjectStore])}rg((e=>({...e,get:(t,n,r)=>wg(t,n)?yg:e.get(t,n,r),has:(t,n)=>wg(t,n)||e.has(t,n)})));class bg extends Md{location;version;db;constructor(e,t={}){super(),this.location=`${t.prefix??""}${e}`,this.version=t.version??1}async open(){try{const e=this.location;this.db=await function(e,t,{blocked:n,upgrade:r,blocking:s,terminated:i}={}){const o=indexedDB.open(e,t),a=og(o);return r&&o.addEventListener("upgradeneeded",(e=>{r(og(o.result),e.oldVersion,e.newVersion,og(o.transaction),e)})),n&&o.addEventListener("blocked",(e=>n(e.oldVersion,e.newVersion,e))),a.then((e=>{i&&e.addEventListener("close",(()=>i())),s&&e.addEventListener("versionchange",(e=>s(e.oldVersion,e.newVersion,e)))})).catch((()=>{})),a}(e,this.version,{upgrade(t){t.createObjectStore(e)}})}catch(e){throw function(e){return e=e??new Error("Cannot open database"),Ur(e,"ERR_DB_OPEN_FAILED")}(e)}}async close(){this.db?.close()}async put(e,t){if(null==this.db)throw new Error("Datastore needs to be opened.");try{return await this.db.put(this.location,t,e.toString()),e}catch(e){throw function(e){return e=e??new Error("Write failed"),Ur(e,"ERR_DB_WRITE_FAILED")}(e)}}async get(e){if(null==this.db)throw new Error("Datastore needs to be opened.");let t;try{t=await this.db.get(this.location,e.toString())}catch(e){throw Od(e)}if(void 0===t)throw Ld();return t}async has(e){if(null==this.db)throw new Error("Datastore needs to be opened.");try{return Boolean(await this.db.getKey(this.location,e.toString()))}catch(e){throw Od(e)}}async delete(e){if(null==this.db)throw new Error("Datastore needs to be opened.");try{await this.db.delete(this.location,e.toString())}catch(e){throw function(e){return e=e??new Error("Delete failed"),Ur(e,"ERR_DB_DELETE_FAILED")}(e)}}batch(){const e=[],t=[];return{put(t,n){e.push({key:t,value:n})},delete(e){t.push(e)},commit:async()=>{if(null==this.db)throw new Error("Datastore needs to be opened.");const n=this.db.transaction(this.location,"readwrite");try{const r=e.filter((({key:e})=>null==t.find((t=>t.toString()===e.toString())))).map((e=>async()=>{await n.store.put(e.value,e.key.toString())})).concat(t.map((e=>async()=>{await n.store.delete(e.toString())}))).concat((async()=>{await n.done}));await Promise.all(r.map((async e=>{await e()})))}catch{n.abort()}}}}async*query(e){let t=this.#O(e,((e,t)=>({key:e,value:t})));Array.isArray(e.filters)&&(t=e.filters.reduce(((e,t)=>Cd(e,t)),t)),Array.isArray(e.orders)&&(t=e.orders.reduce(((e,t)=>xd(e,t)),t)),yield*t}async*queryKeys(e){let t=this.#O(e,(e=>e));Array.isArray(e.filters)&&(t=e.filters.reduce(((e,t)=>Cd(e,t)),t)),Array.isArray(e.orders)&&(t=e.orders.reduce(((e,t)=>xd(e,t)),t)),yield*t}async*#O(e,t){if(null==this.db)throw new Error("Datastore needs to be opened.");let n=0,r=-1;for(const s of await this.db.getAllKeys(this.location)){if(null!=e.prefix&&!s.toString().startsWith(e.prefix))continue;if(null!=e.limit&&n===e.limit)return;if(r++,null!=e.offset&&r<e.offset)continue;const i=new Zt(s.toString());let o;try{o=await this.get(i)}catch(e){if("ERR_NOT_FOUND"!==e.code)throw e;continue}null!=o&&(yield t(i,o),n++)}}async destroy(){await function(e,{blocked:t}={}){const n=indexedDB.deleteDatabase(e);return t&&n.addEventListener("blocked",(e=>t(e.oldVersion,e))),og(n).then((()=>{}))}(this.location)}}function vg(){const e=ar();let t=!1;return{sink:async n=>{if(t)throw new Error("already piped");t=!0,e.resolve(n)},source:async function*(){const t=await e.promise;yield*t}()}}const Eg=65535,Sg=Boolean(globalThis.process?.env?.DUMP_SESSION_KEYS),_g=e=>new Uint32Array(e.buffer,e.byteOffset,Math.floor(e.byteLength/4));function Ig(e){return e instanceof Uint8Array||null!=e&&"object"==typeof e&&"Uint8Array"===e.constructor.name}if(!(68===new Uint8Array(new Uint32Array([287454020]).buffer)[0]))throw new Error("Non little-endian hardware is not supported");function Rg(e){if("string"!=typeof e)throw new Error("utf8ToBytes expected string, got "+typeof e);return new Uint8Array((new TextEncoder).encode(e))}function Ag(e){if("string"==typeof e)e=Rg(e);else{if(!Ig(e))throw new Error("expected Uint8Array, got "+typeof e);e=e.slice()}return e}const Tg=e=>"[object Object]"===Object.prototype.toString.call(e)&&e.constructor===Object;function Dg(e,t){if(!Ig(e))throw new Error("Uint8Array expected");if("number"==typeof t&&e.length!==t)throw new Error(`Uint8Array length ${t} expected`)}const kg=(e,t)=>(Object.assign(t,e),t);function Pg(e,t,n,r){if("function"==typeof e.setBigUint64)return e.setBigUint64(t,n,r);const s=BigInt(32),i=BigInt(4294967295),o=Number(n>>s&i),a=Number(n&i);e.setUint32(t+4,o,r),e.setUint32(t+0,a,r)}function Cg(e){if(!Number.isSafeInteger(e)||e<0)throw new Error(`wrong positive integer: ${e}`)}function xg(e){if("boolean"!=typeof e)throw new Error(`boolean expected, not ${e}`)}function Ng(e,...t){if(null==(n=e)||"object"!=typeof n||!(n instanceof Uint8Array||"Uint8Array"===n.constructor.name))throw new Error("Uint8Array expected");var n;if(t.length>0&&!t.includes(e.length))throw new Error(`Uint8Array expected of length ${t}, not of length=${e.length}`)}function Mg(e,t=!0){if(e.destroyed)throw new Error("Hash instance has been destroyed");if(t&&e.finished)throw new Error("Hash#digest() has already been called")}const Og=(e,t)=>255&e[t++]|(255&e[t++])<<8;class Lg{constructor(e){this.blockLen=16,this.outputLen=16,this.buffer=new Uint8Array(16),this.r=new Uint16Array(10),this.h=new Uint16Array(10),this.pad=new Uint16Array(8),this.pos=0,this.finished=!1,Dg(e=Ag(e),32);const t=Og(e,0),n=Og(e,2),r=Og(e,4),s=Og(e,6),i=Og(e,8),o=Og(e,10),a=Og(e,12),c=Og(e,14);this.r[0]=8191&t,this.r[1]=8191&(t>>>13|n<<3),this.r[2]=7939&(n>>>10|r<<6),this.r[3]=8191&(r>>>7|s<<9),this.r[4]=255&(s>>>4|i<<12),this.r[5]=i>>>1&8190,this.r[6]=8191&(i>>>14|o<<2),this.r[7]=8065&(o>>>11|a<<5),this.r[8]=8191&(a>>>8|c<<8),this.r[9]=c>>>5&127;for(let t=0;t<8;t++)this.pad[t]=Og(e,16+2*t)}process(e,t,n=!1){const r=n?0:2048,{h:s,r:i}=this,o=i[0],a=i[1],c=i[2],l=i[3],u=i[4],h=i[5],d=i[6],p=i[7],f=i[8],g=i[9],m=Og(e,t+0),y=Og(e,t+2),w=Og(e,t+4),b=Og(e,t+6),v=Og(e,t+8),E=Og(e,t+10),S=Og(e,t+12),_=Og(e,t+14);let I=s[0]+(8191&m),R=s[1]+(8191&(m>>>13|y<<3)),A=s[2]+(8191&(y>>>10|w<<6)),T=s[3]+(8191&(w>>>7|b<<9)),D=s[4]+(8191&(b>>>4|v<<12)),k=s[5]+(v>>>1&8191),P=s[6]+(8191&(v>>>14|E<<2)),C=s[7]+(8191&(E>>>11|S<<5)),x=s[8]+(8191&(S>>>8|_<<8)),N=s[9]+(_>>>5|r),M=0,O=M+I*o+R*(5*g)+A*(5*f)+T*(5*p)+D*(5*d);M=O>>>13,O&=8191,O+=k*(5*h)+P*(5*u)+C*(5*l)+x*(5*c)+N*(5*a),M+=O>>>13,O&=8191;let L=M+I*a+R*o+A*(5*g)+T*(5*f)+D*(5*p);M=L>>>13,L&=8191,L+=k*(5*d)+P*(5*h)+C*(5*u)+x*(5*l)+N*(5*c),M+=L>>>13,L&=8191;let B=M+I*c+R*a+A*o+T*(5*g)+D*(5*f);M=B>>>13,B&=8191,B+=k*(5*p)+P*(5*d)+C*(5*h)+x*(5*u)+N*(5*l),M+=B>>>13,B&=8191;let U=M+I*l+R*c+A*a+T*o+D*(5*g);M=U>>>13,U&=8191,U+=k*(5*f)+P*(5*p)+C*(5*d)+x*(5*h)+N*(5*u),M+=U>>>13,U&=8191;let F=M+I*u+R*l+A*c+T*a+D*o;M=F>>>13,F&=8191,F+=k*(5*g)+P*(5*f)+C*(5*p)+x*(5*d)+N*(5*h),M+=F>>>13,F&=8191;let V=M+I*h+R*u+A*l+T*c+D*a;M=V>>>13,V&=8191,V+=k*o+P*(5*g)+C*(5*f)+x*(5*p)+N*(5*d),M+=V>>>13,V&=8191;let K=M+I*d+R*h+A*u+T*l+D*c;M=K>>>13,K&=8191,K+=k*a+P*o+C*(5*g)+x*(5*f)+N*(5*p),M+=K>>>13,K&=8191;let $=M+I*p+R*d+A*h+T*u+D*l;M=$>>>13,$&=8191,$+=k*c+P*a+C*o+x*(5*g)+N*(5*f),M+=$>>>13,$&=8191;let q=M+I*f+R*p+A*d+T*h+D*u;M=q>>>13,q&=8191,q+=k*l+P*c+C*a+x*o+N*(5*g),M+=q>>>13,q&=8191;let H=M+I*g+R*f+A*p+T*d+D*h;M=H>>>13,H&=8191,H+=k*u+P*l+C*c+x*a+N*o,M+=H>>>13,H&=8191,M=(M<<2)+M|0,M=M+O|0,O=8191&M,M>>>=13,L+=M,s[0]=O,s[1]=L,s[2]=B,s[3]=U,s[4]=F,s[5]=V,s[6]=K,s[7]=$,s[8]=q,s[9]=H}finalize(){const{h:e,pad:t}=this,n=new Uint16Array(10);let r=e[1]>>>13;e[1]&=8191;for(let t=2;t<10;t++)e[t]+=r,r=e[t]>>>13,e[t]&=8191;e[0]+=5*r,r=e[0]>>>13,e[0]&=8191,e[1]+=r,r=e[1]>>>13,e[1]&=8191,e[2]+=r,n[0]=e[0]+5,r=n[0]>>>13,n[0]&=8191;for(let t=1;t<10;t++)n[t]=e[t]+r,r=n[t]>>>13,n[t]&=8191;n[9]-=8192;let s=(1^r)-1;for(let e=0;e<10;e++)n[e]&=s;s=~s;for(let t=0;t<10;t++)e[t]=e[t]&s|n[t];e[0]=65535&(e[0]|e[1]<<13),e[1]=65535&(e[1]>>>3|e[2]<<10),e[2]=65535&(e[2]>>>6|e[3]<<7),e[3]=65535&(e[3]>>>9|e[4]<<4),e[4]=65535&(e[4]>>>12|e[5]<<1|e[6]<<14),e[5]=65535&(e[6]>>>2|e[7]<<11),e[6]=65535&(e[7]>>>5|e[8]<<8),e[7]=65535&(e[8]>>>8|e[9]<<5);let i=e[0]+t[0];e[0]=65535&i;for(let n=1;n<8;n++)i=(e[n]+t[n]|0)+(i>>>16)|0,e[n]=65535&i}update(e){Mg(this);const{buffer:t,blockLen:n}=this,r=(e=Ag(e)).length;for(let s=0;s<r;){const i=Math.min(n-this.pos,r-s);if(i!==n)t.set(e.subarray(s,s+i),this.pos),this.pos+=i,s+=i,this.pos===n&&(this.process(t,0,!1),this.pos=0);else for(;n<=r-s;s+=n)this.process(e,s)}return this}destroy(){this.h.fill(0),this.r.fill(0),this.buffer.fill(0),this.pad.fill(0)}digestInto(e){Mg(this),function(e,t){Ng(e);const n=t.outputLen;if(e.length<n)throw new Error(`digestInto() expects output buffer of length at least ${n}`)}(e,this),this.finished=!0;const{buffer:t,h:n}=this;let{pos:r}=this;if(r){for(t[r++]=1;r<16;r++)t[r]=0;this.process(t,0,!0)}this.finalize();let s=0;for(let t=0;t<8;t++)e[s++]=n[t]>>>0,e[s++]=n[t]>>>8;return e}digest(){const{buffer:e,outputLen:t}=this;this.digestInto(e);const n=e.slice(0,t);return this.destroy(),n}}const Bg=function(e){const t=(t,n)=>e(n).update(Ag(t)).digest(),n=e(new Uint8Array(32));return t.outputLen=n.outputLen,t.blockLen=n.blockLen,t.create=t=>e(t),t}((e=>new Lg(e))),Ug=Rg("expand 16-byte k"),Fg=Rg("expand 32-byte k"),Vg=_g(Ug),Kg=_g(Fg);function $g(e,t){return e<<t|e>>>32-t}function qg(e){return e.byteOffset%4==0}const Hg=64,zg=16,Wg=2**32-1,jg=new Uint32Array;function Gg(e,t){const{allowShortKeys:n,extendNonceFn:r,counterLength:s,counterRight:i,rounds:o}=function(e,t){if(void 0!==t&&("object"!=typeof t||!Tg(t)))throw new Error("options must be object or undefined");return Object.assign(e,t)}({allowShortKeys:!1,counterLength:8,counterRight:!1,rounds:20},t);if("function"!=typeof e)throw new Error("core must be a function");return Cg(s),Cg(o),xg(i),xg(n),(t,a,c,l,u=0)=>{Ng(t),Ng(a),Ng(c);const h=c.length;if(l||(l=new Uint8Array(h)),Ng(l),Cg(u),u<0||u>=Wg)throw new Error("arx: counter overflow");if(l.length<h)throw new Error(`arx: output (${l.length}) is shorter than data (${h})`);const d=[];let p,f,g=t.length;if(32===g)p=t.slice(),d.push(p),f=Kg;else{if(16!==g||!n)throw new Error(`arx: invalid 32-byte key, got length=${g}`);p=new Uint8Array(32),p.set(t),p.set(t,16),f=Vg,d.push(p)}qg(a)||(a=a.slice(),d.push(a));const m=_g(p);if(r){if(24!==a.length)throw new Error("arx: extended nonce must be 24 bytes");r(f,m,_g(a.subarray(0,16)),m),a=a.subarray(16)}const y=16-s;if(y!==a.length)throw new Error(`arx: nonce must be ${y} or 16 bytes`);if(12!==y){const e=new Uint8Array(12);e.set(a,i?0:12-a.length),a=e,d.push(a)}const w=_g(a);for(!function(e,t,n,r,s,i,o,a){const c=s.length,l=new Uint8Array(Hg),u=_g(l),h=qg(s)&&qg(i),d=h?_g(s):jg,p=h?_g(i):jg;for(let f=0;f<c;o++){if(e(t,n,r,u,o,a),o>=Wg)throw new Error("arx: counter overflow");const g=Math.min(Hg,c-f);if(h&&g===Hg){const e=f/4;if(f%4!=0)throw new Error("arx: invalid block position");for(let t,n=0;n<zg;n++)t=e+n,p[t]=d[t]^u[n];f+=Hg}else{for(let e,t=0;t<g;t++)e=f+t,i[e]=s[e]^l[t];f+=g}}}(e,f,m,w,c,l,u,o);d.length>0;)d.pop().fill(0);return l}}function Yg(e,t,n,r,s,i=20){let o=e[0],a=e[1],c=e[2],l=e[3],u=t[0],h=t[1],d=t[2],p=t[3],f=t[4],g=t[5],m=t[6],y=t[7],w=s,b=n[0],v=n[1],E=n[2],S=o,_=a,I=c,R=l,A=u,T=h,D=d,k=p,P=f,C=g,x=m,N=y,M=w,O=b,L=v,B=E;for(let e=0;e<i;e+=2)S=S+A|0,M=$g(M^S,16),P=P+M|0,A=$g(A^P,12),S=S+A|0,M=$g(M^S,8),P=P+M|0,A=$g(A^P,7),_=_+T|0,O=$g(O^_,16),C=C+O|0,T=$g(T^C,12),_=_+T|0,O=$g(O^_,8),C=C+O|0,T=$g(T^C,7),I=I+D|0,L=$g(L^I,16),x=x+L|0,D=$g(D^x,12),I=I+D|0,L=$g(L^I,8),x=x+L|0,D=$g(D^x,7),R=R+k|0,B=$g(B^R,16),N=N+B|0,k=$g(k^N,12),R=R+k|0,B=$g(B^R,8),N=N+B|0,k=$g(k^N,7),S=S+T|0,B=$g(B^S,16),x=x+B|0,T=$g(T^x,12),S=S+T|0,B=$g(B^S,8),x=x+B|0,T=$g(T^x,7),_=_+D|0,M=$g(M^_,16),N=N+M|0,D=$g(D^N,12),_=_+D|0,M=$g(M^_,8),N=N+M|0,D=$g(D^N,7),I=I+k|0,O=$g(O^I,16),P=P+O|0,k=$g(k^P,12),I=I+k|0,O=$g(O^I,8),P=P+O|0,k=$g(k^P,7),R=R+A|0,L=$g(L^R,16),C=C+L|0,A=$g(A^C,12),R=R+A|0,L=$g(L^R,8),C=C+L|0,A=$g(A^C,7);let U=0;r[U++]=o+S|0,r[U++]=a+_|0,r[U++]=c+I|0,r[U++]=l+R|0,r[U++]=u+A|0,r[U++]=h+T|0,r[U++]=d+D|0,r[U++]=p+k|0,r[U++]=f+P|0,r[U++]=g+C|0,r[U++]=m+x|0,r[U++]=y+N|0,r[U++]=w+M|0,r[U++]=b+O|0,r[U++]=v+L|0,r[U++]=E+B|0}const Qg=Gg(Yg,{counterRight:!1,counterLength:4,allowShortKeys:!1}),Jg=new Uint8Array(16),Zg=(e,t)=>{e.update(t);const n=t.length%16;n&&e.update(Jg.subarray(n))},Xg=new Uint8Array(32);function em(e,t,n,r,s){const i=e(t,n,Xg),o=Bg.create(i);s&&Zg(o,s),Zg(o,r);const a=new Uint8Array(16),c=(l=a,new DataView(l.buffer,l.byteOffset,l.byteLength));var l;Pg(c,0,BigInt(s?s.length:0),!0),Pg(c,8,BigInt(r.length),!0),o.update(a);const u=o.digest();return i.fill(0),u}const tm=kg({blockSize:64,nonceLength:12,tagLength:16},(nm=Qg,(e,t,n)=>{const r=16;return Dg(e,32),Dg(t),{encrypt:(s,i)=>{const o=s.length,a=o+r;i?Dg(i,a):i=new Uint8Array(a),nm(e,t,s,i,1);const c=em(nm,e,t,i.subarray(0,-16),n);return i.set(c,o),i},decrypt:(s,i)=>{const o=s.length,a=o-r;if(o<r)throw new Error("encrypted data must be at least 16 bytes");i?Dg(i,a):i=new Uint8Array(a);const c=s.subarray(0,-16);if(!function(e,t){if(e.length!==t.length)return!1;let n=0;for(let r=0;r<e.length;r++)n|=e[r]^t[r];return 0===n}(s.subarray(-16),em(nm,e,t,c,n)))throw new Error("invalid tag");return nm(e,t,c,i,1),i}}}));var nm;const rm=new Uint8Array([0]),sm=new Uint8Array;const im={hashSHA256:e=>dl(e.subarray()),getHKDF(e,t){const n=function(e,t,n){return Ts(e),void 0===n&&(n=new Uint8Array(e.outputLen)),No(e,Os(n),Os(t))}(dl,t,e),r=function(e,t,n,r=32){if(Ts(e),Rs(r),r>255*e.outputLen)throw new Error("Length should be <= 255*HashLen");const s=Math.ceil(r/e.outputLen);void 0===n&&(n=sm);const i=new Uint8Array(s*e.outputLen),o=No.create(e,t),a=o._cloneInto(),c=new Uint8Array(o.outputLen);for(let t=0;t<s;t++)rm[0]=t+1,a.update(0===t?sm:c).update(n).update(rm).digestInto(c),i.set(c,e.outputLen*t),o._cloneInto(a);return o.destroy(),a.destroy(),c.fill(0),rm.fill(0),i.slice(0,r)}(dl,n,void 0,96),s=r;return[s.subarray(0,32),s.subarray(32,64),s.subarray(64,96)]},generateX25519KeyPair(){const e=go.utils.randomPrivateKey();return{publicKey:go.getPublicKey(e),privateKey:e}},generateX25519KeyPairFromSeed:e=>({publicKey:go.getPublicKey(e),privateKey:e}),generateX25519SharedKey:(e,t)=>go.getSharedSecret(e.subarray(),t.subarray()),chaCha20Poly1305Encrypt:(e,t,n,r)=>tm(r,t,n).encrypt(e.subarray()),chaCha20Poly1305Decrypt:(e,t,n,r,s)=>tm(r,t,n).decrypt(e.subarray(),s)},om=im;const am=e=>{const t=m(2);return t[0]=e>>8,t[1]=e,t};am.bytes=2;const cm=e=>{if(e.length<2)throw RangeError("Could not decode int16BE");if(e instanceof Uint8Array){let t=0;return t+=e[0]<<8,t+=e[1],t}return e.getUint16(0)};function lm(e,t){t.enabled&&Sg&&(e?(t(`LOCAL_STATIC_PUBLIC_KEY ${Gt(e.publicKey,"hex")}`),t(`LOCAL_STATIC_PRIVATE_KEY ${Gt(e.privateKey,"hex")}`)):t("Missing local static keys."))}function um(e,t){t.enabled&&Sg&&(e?(t(`LOCAL_PUBLIC_EPHEMERAL_KEY ${Gt(e.publicKey,"hex")}`),t(`LOCAL_PRIVATE_EPHEMERAL_KEY ${Gt(e.privateKey,"hex")}`)):t("Missing local ephemeral keys."))}function hm(e,t){t.enabled&&Sg&&t(e?`REMOTE_EPHEMERAL_PUBLIC_KEY ${Gt(e.subarray(),"hex")}`:"Missing remote ephemeral keys.")}function dm(e,t,n){n.enabled&&Sg&&(n(`CIPHER_STATE_1 ${e.n.getUint64()} ${e.k&&Gt(e.k,"hex")}`),n(`CIPHER_STATE_2 ${t.n.getUint64()} ${t.k&&Gt(t.k,"hex")}`))}function pm(e,t){if(e.length!==t.length)throw new Error("Inputs should have the same length");const n=m(e.length);for(let r=0;r<e.length;r++)n[r]=e[r]^t[r];return n}cm.bytes=2;class fm extends Error{code;constructor(e="Unexpected Peer"){super(e),this.code=fm.code}static code="ERR_UNEXPECTED_PEER"}class gm extends Error{code;constructor(e="Invalid crypto exchange"){super(e),this.code=gm.code}static code="ERR_INVALID_CRYPTO_EXCHANGE"}class mm{n;bytes;view;constructor(e=0){this.n=e,this.bytes=g(12),this.view=new DataView(this.bytes.buffer,this.bytes.byteOffset,this.bytes.byteLength),this.view.setUint32(4,e,!0)}increment(){this.n++,this.view.setUint32(4,this.n,!0)}getBytes(){return this.bytes}getUint64(){return this.n}assertValue(){if(this.n>4294967295)throw new Error("Cipherstate has reached maximum n, a new handshake must be performed")}}const ym=g(0);class wm{k;n;crypto;constructor(e,t=void 0,n=0){this.crypto=e,this.k=t,this.n=new mm(n)}hasKey(){return Boolean(this.k)}encryptWithAd(e,t){if(!this.hasKey())return t;this.n.assertValue();const n=this.crypto.encrypt(t,this.n.getBytes(),e,this.k);return this.n.increment(),n}decryptWithAd(e,t,n){if(!this.hasKey())return t;this.n.assertValue();const r=this.crypto.decrypt(t,this.n.getBytes(),e,this.k,n);return this.n.increment(),r}}class bm{cs;ck;h;crypto;constructor(e,t){this.crypto=e;const n=Tt(t,"utf-8");this.h=function(e,t){if(t.length<=32){const e=g(32);return e.set(t),e}return e.hash(t)}(e,n),this.ck=this.h,this.cs=new wm(e)}mixKey(e){const[t,n]=this.crypto.hkdf(this.ck,e);this.ck=t,this.cs=new wm(this.crypto,n)}mixHash(e){this.h=this.crypto.hash(new Sr(this.h,e))}encryptAndHash(e){const t=this.cs.encryptWithAd(this.h,e);return this.mixHash(t),t}decryptAndHash(e){const t=this.cs.decryptWithAd(this.h,e);return this.mixHash(e),t}split(){const[e,t]=this.crypto.hkdf(this.ck,ym);return[new wm(this.crypto,e),new wm(this.crypto,t)]}}class vm{ss;s;e;rs;re;initiator;crypto;constructor(e){const{crypto:t,protocolName:n,prologue:r,initiator:s,s:i,e:o,rs:a,re:c}=e;this.crypto=t,this.ss=new bm(t,n),this.ss.mixHash(r),this.initiator=s,this.s=i,this.e=o,this.rs=a,this.re=c}writeE(){if(this.e)throw new Error("ephemeral keypair is already set");const e=this.crypto.generateKeypair();return this.ss.mixHash(e.publicKey),this.e=e,e.publicKey}writeS(){if(!this.s)throw new Error("static keypair is not set");return this.ss.encryptAndHash(this.s.publicKey)}writeEE(){if(!this.e)throw new Error("ephemeral keypair is not set");if(!this.re)throw new Error("remote ephemeral public key is not set");this.ss.mixKey(this.crypto.dh(this.e,this.re))}writeES(){if(this.initiator){if(!this.e)throw new Error("ephemeral keypair is not set");if(!this.rs)throw new Error("remote static public key is not set");this.ss.mixKey(this.crypto.dh(this.e,this.rs))}else{if(!this.s)throw new Error("static keypair is not set");if(!this.re)throw new Error("remote ephemeral public key is not set");this.ss.mixKey(this.crypto.dh(this.s,this.re))}}writeSE(){if(this.initiator){if(!this.s)throw new Error("static keypair is not set");if(!this.re)throw new Error("remote ephemeral public key is not set");this.ss.mixKey(this.crypto.dh(this.s,this.re))}else{if(!this.e)throw new Error("ephemeral keypair is not set");if(!this.rs)throw new Error("remote static public key is not set");this.ss.mixKey(this.crypto.dh(this.e,this.rs))}}readE(e,t=0){if(this.re)throw new Error("remote ephemeral public key is already set");if(e.byteLength<t+32)throw new Error("message is not long enough");this.re=e.sublist(t,t+32),this.ss.mixHash(this.re)}readS(e,t=0){if(this.rs)throw new Error("remote static public key is already set");const n=32+(this.ss.cs.hasKey()?16:0);if(e.byteLength<t+n)throw new Error("message is not long enough");const r=e.sublist(t,t+n);return this.rs=this.ss.decryptAndHash(r),n}readEE(){this.writeEE()}readES(){this.writeES()}readSE(){this.writeSE()}}class Em extends vm{writeMessageA(e){return new Sr(this.writeE(),this.ss.encryptAndHash(e))}writeMessageB(e){const t=this.writeE();this.writeEE();const n=this.writeS();return this.writeES(),new Sr(t,n,this.ss.encryptAndHash(e))}writeMessageC(e){const t=this.writeS();return this.writeSE(),new Sr(t,this.ss.encryptAndHash(e))}readMessageA(e){try{return this.readE(e),this.ss.decryptAndHash(e.sublist(32))}catch(e){throw new gm(`handshake stage 0 validation fail: ${e.message}`)}}readMessageB(e){try{this.readE(e),this.readEE();const t=this.readS(e,32);return this.readES(),this.ss.decryptAndHash(e.sublist(32+t))}catch(e){throw new gm(`handshake stage 1 validation fail: ${e.message}`)}}readMessageC(e){try{const t=this.readS(e);return this.readSE(),this.ss.decryptAndHash(e.sublist(t))}catch(e){throw new gm(`handshake stage 2 validation fail: ${e.message}`)}}}var Sm,_m;async function Im(e,t,n){const r=await e.sign(Am(t));return _m.encode({identityKey:e.public.bytes,identitySig:r,extensions:n})}async function Rm(e,t,n){try{const r=_m.decode(e);if(n){const e=n.subarray();if(!Sn(e,r.identityKey))throw new Error(`Payload identity key ${Gt(r.identityKey,"hex")} does not match expected remote identity key ${Gt(e,"hex")}`)}if(!t)throw new Error("Remote static does not exist");const s=Am(t),i=Ll(r.identityKey);if(!await i.verify(s,r.identitySig))throw new Error("Invalid payload signature");return r}catch(e){throw new fm(e.message)}}function Am(e){const t=Tt("noise-libp2p-static-key:");return e instanceof Uint8Array?_n([t,e],t.length+e.length):(e.prepend(t),e)}async function Tm(e){const{log:t,connection:n,crypto:r,privateKey:s,prologue:i,s:o,remoteIdentityKey:a,extensions:c}=e,l=await Im(s,o.publicKey,c),u=new Em({crypto:r,protocolName:"Noise_XX_25519_ChaChaPoly_SHA256",initiator:!0,prologue:i,s:o});lm(u.s,t),t.trace("Stage 0 - Initiator starting to send first message."),await n.write(u.writeMessageA(ym)),t.trace("Stage 0 - Initiator finished sending first message."),um(u.e,t),t.trace("Stage 1 - Initiator waiting to receive first message from responder...");const h=u.readMessageB(await n.read());var d,p;t.trace("Stage 1 - Initiator received the message."),hm(u.re,t),d=u.rs,(p=t).enabled&&Sg&&p(d?`REMOTE_STATIC_PUBLIC_KEY ${Gt(d.subarray(),"hex")}`:"Missing remote static public key."),t.trace("Initiator going to check remote's signature...");const f=await Rm(h,u.rs,a);t.trace("All good with the signature!"),t.trace("Stage 2 - Initiator sending third handshake message."),await n.write(u.writeMessageC(l)),t.trace("Stage 2 - Initiator sent message with signed payload.");const[g,m]=u.ss.split();return dm(g,m,t),{payload:f,encrypt:e=>g.encryptWithAd(ym,e),decrypt:(e,t)=>m.decryptWithAd(ym,e,t)}}!function(e){let t;e.codec=()=>(null==t&&(t=zt(((e,t,n={})=>{if(!1!==n.lengthDelimited&&t.fork(),null!=e.webtransportCerthashes)for(const n of e.webtransportCerthashes)t.uint32(10),t.bytes(n);!1!==n.lengthDelimited&&t.ldelim()}),((e,t)=>{const n={webtransportCerthashes:[]},r=null==t?e.len:e.pos+t;for(;e.pos<r;){const t=e.uint32();if(t>>>3==1)n.webtransportCerthashes.push(e.bytes());else e.skipType(7&t)}return n}))),t),e.encode=t=>Kt(t,e.codec()),e.decode=t=>W(t,e.codec())}(Sm||(Sm={})),function(e){let t;e.codec=()=>(null==t&&(t=zt(((e,t,n={})=>{!1!==n.lengthDelimited&&t.fork(),null!=e.identityKey&&e.identityKey.byteLength>0&&(t.uint32(10),t.bytes(e.identityKey)),null!=e.identitySig&&e.identitySig.byteLength>0&&(t.uint32(18),t.bytes(e.identitySig)),null!=e.extensions&&(t.uint32(34),Sm.codec().encode(e.extensions,t)),!1!==n.lengthDelimited&&t.ldelim()}),((e,t)=>{const n={identityKey:g(0),identitySig:g(0)},r=null==t?e.len:e.pos+t;for(;e.pos<r;){const t=e.uint32();switch(t>>>3){case 1:n.identityKey=e.bytes();break;case 2:n.identitySig=e.bytes();break;case 4:n.extensions=Sm.codec().decode(e,e.uint32());break;default:e.skipType(7&t)}}return n}))),t),e.encode=t=>Kt(t,e.codec()),e.decode=t=>W(t,e.codec())}(_m||(_m={}));class Dm{protocol="/noise";crypto;prologue;staticKey;extensions;metrics;components;constructor(e,t={}){const{staticNoiseKey:n,extensions:r,crypto:s,prologueBytes:i}=t,{metrics:o}=e;this.components=e;const a=s??om;this.crypto=function(e){return{generateKeypair:e.generateX25519KeyPair,dh:(t,n)=>e.generateX25519SharedKey(t.privateKey,n).subarray(0,32),encrypt:e.chaCha20Poly1305Encrypt,decrypt:e.chaCha20Poly1305Decrypt,hash:e.hashSHA256,hkdf:e.getHKDF}}(a),this.extensions=r,this.metrics=o?function(e){return{xxHandshakeSuccesses:e.registerCounter("libp2p_noise_xxhandshake_successes_total",{help:"Total count of noise xxHandshakes successes_"}),xxHandshakeErrors:e.registerCounter("libp2p_noise_xxhandshake_error_total",{help:"Total count of noise xxHandshakes errors"}),encryptedPackets:e.registerCounter("libp2p_noise_encrypted_packets_total",{help:"Total count of noise encrypted packets successfully"}),decryptedPackets:e.registerCounter("libp2p_noise_decrypted_packets_total",{help:"Total count of noise decrypted packets"}),decryptErrors:e.registerCounter("libp2p_noise_decrypt_errors_total",{help:"Total count of noise decrypt errors"})}}(o):void 0,this.staticKey=n?a.generateX25519KeyPairFromSeed(n):a.generateX25519KeyPair(),this.prologue=i??g(0)}async secureOutbound(e,t,n){const r=Pr(t,{lengthEncoder:am,lengthDecoder:cm,maxDataLength:Eg});if(!e.privateKey)throw new dn("local peerId does not contain private key","ERR_NO_PRIVATE_KEY");const s=await Ul(e.privateKey),i=n?.publicKey,o=await this.performHandshakeInitiator(r,s,i),a=await this.createSecureConnection(r,o);return t.source=a.source,t.sink=a.sink,{conn:t,remoteExtensions:o.payload.extensions,remotePeer:await Es(o.payload.identityKey)}}async secureInbound(e,t,n){const r=Pr(t,{lengthEncoder:am,lengthDecoder:cm,maxDataLength:Eg});if(!e.privateKey)throw new dn("local peerId does not contain private key","ERR_NO_PRIVATE_KEY");const s=await Ul(e.privateKey),i=n?.publicKey,o=await this.performHandshakeResponder(r,s,i),a=await this.createSecureConnection(r,o);return t.source=a.source,t.sink=a.sink,{conn:t,remoteExtensions:o.payload.extensions,remotePeer:await Es(o.payload.identityKey)}}async performHandshakeInitiator(e,t,n){let r;try{r=await Tm({connection:e,privateKey:t,remoteIdentityKey:n,log:this.components.logger.forComponent("libp2p:noise:xxhandshake"),crypto:this.crypto,prologue:this.prologue,s:this.staticKey,extensions:this.extensions}),this.metrics?.xxHandshakeSuccesses.increment()}catch(e){throw this.metrics?.xxHandshakeErrors.increment(),e}return r}async performHandshakeResponder(e,t,n){let r;try{r=await async function(e){const{log:t,connection:n,crypto:r,privateKey:s,prologue:i,s:o,remoteIdentityKey:a,extensions:c}=e,l=await Im(s,o.publicKey,c),u=new Em({crypto:r,protocolName:"Noise_XX_25519_ChaChaPoly_SHA256",initiator:!1,prologue:i,s:o});lm(u.s,t),t.trace("Stage 0 - Responder waiting to receive first message."),u.readMessageA(await n.read()),t.trace("Stage 0 - Responder received first message."),hm(u.re,t),t.trace("Stage 1 - Responder sending out first message with signed payload and static key."),await n.write(u.writeMessageB(l)),t.trace("Stage 1 - Responder sent the second handshake message with signed payload."),um(u.e,t),t.trace("Stage 2 - Responder waiting for third handshake message...");const h=u.readMessageC(await n.read());t.trace("Stage 2 - Responder received the message, finished handshake.");const d=await Rm(h,u.rs,a),[p,f]=u.ss.split();return dm(p,f,t),{payload:d,encrypt:e=>f.encryptWithAd(ym,e),decrypt:(e,t)=>p.decryptWithAd(ym,e,t)}}({connection:e,privateKey:t,remoteIdentityKey:n,log:this.components.logger.forComponent("libp2p:noise:xxhandshake"),crypto:this.crypto,prologue:this.prologue,s:this.staticKey,extensions:this.extensions}),this.metrics?.xxHandshakeSuccesses.increment()}catch(e){throw this.metrics?.xxHandshakeErrors.increment(),e}return r}async createSecureConnection(e,t){const[n,r]=function(){const e=vg(),t=vg();return[{source:e.source,sink:t.sink},{source:t.source,sink:e.sink}]}(),s=e.unwrap();return await pr(n,function(e,t){return async function*(n){for await(const r of n)for(let n=0;n<r.length;n+=65519){let s,i=n+65519;i>r.length&&(i=r.length),s=r instanceof Uint8Array?e.encrypt(r.subarray(n,i)):e.encrypt(r.sublist(n,i)),t?.encryptedPackets.increment(),yield new Sr(am(s.byteLength),s)}}}(t,this.metrics),s,(e=>Kr(e,{lengthDecoder:cm})),function(e,t){return async function*(n){for await(const r of n)for(let n=0;n<r.length;n+=Eg){let s=n+Eg;if(s>r.length&&(s=r.length),s-16<n)throw new Error("Invalid chunk");const i=r.sublist(n,s),o=r.subarray(n,s-16);try{const n=e.decrypt(i,o);t?.decryptedPackets.increment(),yield n}catch(e){throw t?.decryptErrors.increment(),e}}}}(t,this.metrics),n),r}}function km(e={}){return t=>new Dm(t,e)}function Pm(e){if(null!=e){if("function"==typeof e[Symbol.iterator])return e[Symbol.iterator]();if("function"==typeof e[Symbol.asyncIterator])return e[Symbol.asyncIterator]();if("function"==typeof e.next)return e}throw new Error("argument is not an iterator or iterable")}function Cm(e){return null!=e&&("function"==typeof e.then&&"function"==typeof e.catch&&"function"==typeof e.finally)}class xm{id;direction;timeline;protocol;metadata;source;status;readStatus;writeStatus;log;sinkController;sinkEnd;closed;endErr;streamSource;onEnd;onCloseRead;onCloseWrite;onReset;onAbort;sendCloseWriteTimeout;sendingData;constructor(e){this.sinkController=new AbortController,this.sinkEnd=ar(),this.closed=ar(),this.log=e.log,this.status="open",this.readStatus="ready",this.writeStatus="ready",this.id=e.id,this.metadata=e.metadata??{},this.direction=e.direction,this.timeline={open:Date.now()},this.sendCloseWriteTimeout=e.sendCloseWriteTimeout??5e3,this.onEnd=e.onEnd,this.onCloseRead=e?.onCloseRead,this.onCloseWrite=e?.onCloseWrite,this.onReset=e?.onReset,this.onAbort=e?.onAbort,this.source=this.streamSource=hr({onEnd:e=>{null!=e?this.log.trace("source ended with error",e):this.log.trace("source ended"),this.onSourceEnd(e)}}),this.sink=this.sink.bind(this)}async sink(e){if("ready"!==this.writeStatus)throw new dn(`writable end state is "${this.writeStatus}" not "ready"`,"ERR_SINK_INVALID_STATE");try{this.writeStatus="writing";const t={signal:this.sinkController.signal};if("outbound"===this.direction){const e=this.sendNewStream(t);Cm(e)&&await e}const n=()=>{!function(e,t){const n=Pm(e).return?.();var r;null!=(r=n)&&"function"==typeof r.then&&"function"==typeof r.catch&&"function"==typeof r.finally&&n.catch((e=>{t.error("could not cause iterator to return",e)}))}(e,this.log)};try{this.sinkController.signal.addEventListener("abort",n),this.log.trace("sink reading from source");for await(let n of e){n=n instanceof Uint8Array?new Sr(n):n;const e=this.sendData(n,t);Cm(e)&&(this.sendingData=ar(),await e,this.sendingData.resolve(),this.sendingData=void 0)}}finally{this.sinkController.signal.removeEventListener("abort",n)}this.log.trace('sink finished reading from source, write status is "%s"',this.writeStatus),"writing"===this.writeStatus&&(this.writeStatus="closing",this.log.trace("send close write to remote"),await this.sendCloseWrite({signal:AbortSignal.timeout(this.sendCloseWriteTimeout)}),this.writeStatus="closed"),this.onSinkEnd()}catch(e){throw this.log.trace("sink ended with error, calling abort with error",e),this.abort(e),e}finally{this.log.trace("resolve sink end"),this.sinkEnd.resolve()}}onSourceEnd(e){null==this.timeline.closeRead&&(this.timeline.closeRead=Date.now(),this.readStatus="closed",null!=e&&null==this.endErr&&(this.endErr=e),this.onCloseRead?.(),null!=this.timeline.closeWrite?(this.log.trace("source and sink ended"),this.timeline.close=Date.now(),"aborted"!==this.status&&"reset"!==this.status&&(this.status="closed"),null!=this.onEnd&&this.onEnd(this.endErr),this.closed.resolve()):this.log.trace("source ended, waiting for sink to end"))}onSinkEnd(e){null==this.timeline.closeWrite&&(this.timeline.closeWrite=Date.now(),this.writeStatus="closed",null!=e&&null==this.endErr&&(this.endErr=e),this.onCloseWrite?.(),null!=this.timeline.closeRead?(this.log.trace("sink and source ended"),this.timeline.close=Date.now(),"aborted"!==this.status&&"reset"!==this.status&&(this.status="closed"),null!=this.onEnd&&this.onEnd(this.endErr),this.closed.resolve()):this.log.trace("sink ended, waiting for source to end"))}async close(e){this.log.trace("closing gracefully"),this.status="closing",await Ir(Promise.all([this.closeWrite(e),this.closeRead(e),this.closed.promise]),e?.signal),this.status="closed",this.log.trace("closed gracefully")}async closeRead(e={}){if("closing"===this.readStatus||"closed"===this.readStatus)return;this.log.trace('closing readable end of stream with starting read status "%s"',this.readStatus);const t=this.readStatus;this.readStatus="closing","reset"!==this.status&&"aborted"!==this.status&&null==this.timeline.closeRead&&(this.log.trace("send close read to remote"),await this.sendCloseRead(e)),"ready"===t&&(this.log.trace("ending internal source queue with %d queued bytes",this.streamSource.readableLength),this.streamSource.end()),this.log.trace("closed readable end of stream")}async closeWrite(e={}){"closing"!==this.writeStatus&&"closed"!==this.writeStatus&&(this.log.trace('closing writable end of stream with starting write status "%s"',this.writeStatus),"ready"===this.writeStatus&&(this.log.trace("sink was never sunk, sink an empty array"),await Ir(this.sink([]),e.signal)),"writing"===this.writeStatus&&(null!=this.sendingData&&await Ir(this.sendingData.promise,e.signal),this.log.trace("aborting source passed to .sink"),this.sinkController.abort(),await Ir(this.sinkEnd.promise,e.signal)),this.writeStatus="closed",this.log.trace("closed writable end of stream"))}abort(e){if("closed"===this.status||"aborted"===this.status||"reset"===this.status)return;this.log("abort with error",e),this.log("try to send reset to remote");const t=this.sendReset();Cm(t)&&t.catch((e=>{this.log.error("error sending reset message",e)})),this.status="aborted",this.timeline.abort=Date.now(),this._closeSinkAndSource(e),this.onAbort?.(e)}reset(){if("closed"===this.status||"aborted"===this.status||"reset"===this.status)return;const e=new dn("stream reset","ERR_STREAM_RESET");this.status="reset",this.timeline.reset=Date.now(),this._closeSinkAndSource(e),this.onReset?.()}_closeSinkAndSource(e){this._closeSink(e),this._closeSource(e)}_closeSink(e){"writing"===this.writeStatus&&(this.log.trace("end sink source"),this.sinkController.abort()),this.onSinkEnd(e)}_closeSource(e){"closing"!==this.readStatus&&"closed"!==this.readStatus&&(this.log.trace("ending source with %d bytes to be read by consumer",this.streamSource.readableLength),this.readStatus="closing",this.streamSource.end(e))}remoteCloseWrite(){"closing"!==this.readStatus&&"closed"!==this.readStatus?(this.log.trace("remote close write"),this._closeSource()):this.log("received remote close write but local source is already closed")}remoteCloseRead(){"closing"!==this.writeStatus&&"closed"!==this.writeStatus?(this.log.trace("remote close read"),this._closeSink()):this.log("received remote close read but local sink is already closed")}destroy(){"closed"!==this.status&&"aborted"!==this.status&&"reset"!==this.status?(this.log.trace("stream destroyed"),this._closeSinkAndSource()):this.log("received destroy but we are already closed")}sourcePush(e){this.streamSource.push(e)}sourceReadableLength(){return this.streamSource.readableLength}}class Nm extends xm{writer;reader;constructor(e){super(e),this.writer=e.bidiStream.writable.getWriter(),this.reader=e.bidiStream.readable.getReader(),Promise.resolve().then((async()=>{for(;;){const t=await this.reader.read();if(t.done)return void e.log("remote closed write");null!=t.value&&this.sourcePush(new Sr(t.value))}})).catch((t=>{e.log.error("error reading from stream",t),this.abort(t)})).finally((()=>{this.remoteCloseWrite()})),this.writer.closed.then((()=>{e.log("writer closed")})).catch((t=>{e.log("writer close promise rejected",t)})).finally((()=>{this.remoteCloseRead()}))}sendNewStream(e){}async sendData(e,t){for await(const n of e)this.log("sendData waiting for writer to be ready"),await Ir(this.writer.ready,t?.signal),this.writer.write(n).catch((e=>{this.log.error("error sending stream data",e)}))}async sendReset(e){this.log("sendReset aborting writer"),await Ir(this.writer.abort(),e?.signal),this.log("sendReset aborted writer")}async sendCloseWrite(e){this.log("sendCloseWrite closing writer"),await Ir(this.writer.close(),e?.signal),this.log("sendCloseWrite closed writer")}async sendCloseRead(e){this.log("sendCloseRead cancelling reader"),await Ir(this.reader.cancel(),e?.signal),this.log("sendCloseRead cancelled reader")}}async function Mm(e,t,n,r,s,i){const o=i.forComponent(`libp2p:webtransport:stream:${n}:${t}`),a=new Nm({bidiStream:e,id:t,direction:n,log:o,onEnd:()=>{const e=r.findIndex((e=>e===a));-1!==e&&r.splice(e,1),s?.(a)}});return a}function Om(){return{source:{[Symbol.asyncIterator]:()=>({next:async()=>new Promise((()=>{}))})},sink:async e=>new Promise((()=>{}))}}function Lm(e,t,n,r){let s=0;const i=n.forComponent("libp2p:webtransport:muxer");return{protocol:"webtransport",createStreamMuxer:o=>{"function"==typeof o&&(o={onIncomingStream:o});const a=[];Promise.resolve().then((async()=>{
|
|
80
|
+
//! TODO unclear how to add backpressure here?
|
|
81
|
+
for(;;){const{done:e,value:c}=await t.read();if(e)break;if(a.length>=r.maxInboundStreams)i(`too many inbound streams open - ${a.length}/${r.maxInboundStreams}, closing new incoming stream`),c.writable.close().catch((e=>{i.error(`failed to close inbound stream that crossed our maxInboundStream limit: ${e.message}`)})),c.readable.cancel().catch((e=>{i.error(`failed to close inbound stream that crossed our maxInboundStream limit: ${e.message}`)}));else{const e=await Mm(c,String(s++),"inbound",a,o?.onStreamEnd,n);a.push(e),o?.onIncomingStream?.(e)}}}));const c={protocol:"webtransport",streams:a,newStream:async t=>{i("new outgoing stream",t);const r=await e.createBidirectionalStream(),c=await Mm(r,String(s++),o?.direction??"outbound",a,o?.onStreamEnd,n);return a.push(c),c},close:async()=>{i("closing webtransport muxer gracefully"),e.close()},abort:t=>{i("closing webtransport muxer with err:",t),e.close()},...Om()};return c}}}const Bm=Object.values(St).map((e=>e.decoder)).reduce(((e,t)=>e.or(t)));function Um(e){if(!Ip.matches(e))throw new dn("Invalid multiaddr, was not a WebTransport address","ERR_INVALID_MULTIADDR");const t=e.stringTuples(),n=t.filter((([e,t])=>e===Bn("certhash").code)).map((([e,t])=>{return n=t??"",ct(Bm.decode(n));var n})),r=t.filter((([e,t])=>e===Bn("p2p").code)).map((([e,t])=>bs(t??"")))[0],s=e.toOptions();let i=s.host;return 6===s.family&&i?.includes(":")&&(i=`[${i}]`),{url:`https://${i}:${s.port}`,certhashes:n,remotePeer:r}}var Fm=WebTransport;class Vm{log;components;config;metrics;constructor(e,t={}){this.log=e.logger.forComponent("libp2p:webtransport"),this.components=e,this.config={...t,maxInboundStreams:t.maxInboundStreams??1e3,certificates:t.certificates??[]},null!=e.metrics&&(this.metrics={dialerEvents:e.metrics.registerCounterGroup("libp2p_webtransport_dialer_events_total",{label:"event",help:"Total count of WebTransport dialer events by type"})})}[Symbol.toStringTag]="@libp2p/webtransport";[ln]=!0;async dial(e,t){if(!0===t?.signal?.aborted)throw new hn;this.log("dialing %s",e);const n=this.components.peerId;if(void 0===n)throw new dn("Need a local peerid","ERR_INVALID_PARAMETERS");t=t??{};const{url:r,certhashes:s,remotePeer:i}=Um(e);let o,a,c=()=>{},l=!1,u=!1,h=!1;try{this.metrics?.dialerEvents.increment({pending:!0});const d=new Fm(`${r}/.well-known/libp2p-webtransport?type=noise`,{serverCertificateHashes:s.map((e=>({algorithm:"sha-256",value:e.digest})))});if(c=e=>{if(!l)try{this.metrics?.dialerEvents.increment({[e]:!0}),d.close()}catch(e){this.log.error("error closing wt session",e)}finally{null!=a&&(a.timeline.close=Date.now()),l=!0}},o=()=>{c(u?"noise_timeout":"ready_timeout")},t.signal?.addEventListener("abort",o,{once:!0}),this.log("wait for session to be ready"),await Promise.race([d.closed,d.ready]),this.log("session became ready"),u=!0,this.metrics?.dialerEvents.increment({ready:!0}),d.closed.catch((e=>{this.log.error("error on remote wt session close",e)})).finally((()=>{c("remote_close")})),h=await Ir(this.authenticateWebTransport(d,n,i,s),t.signal),!h)throw new dn("Failed to authenticate webtransport","ERR_AUTHENTICATION_FAILED");return this.metrics?.dialerEvents.increment({open:!0}),a={close:async()=>{this.log("closing webtransport"),c("close")},abort:e=>{this.log("aborting webtransport due to passed err",e),c("abort")},remoteAddr:e,timeline:{open:Date.now()},log:this.components.logger.forComponent("libp2p:webtransport:maconn"),...Om()},await t.upgrader.upgradeOutbound(a,{skipEncryption:!0,muxerFactory:Lm(d,d.incomingBidirectionalStreams.getReader(),this.components.logger,this.config),skipProtection:!0})}catch(e){throw this.log.error("caught wt session err",e),c(h?"upgrade_error":u?"noise_error":"ready_error"),e}finally{null!=o&&t.signal?.removeEventListener("abort",o)}}async authenticateWebTransport(e,t,n,r=[],s){if(!0===s?.aborted)throw new hn;const i=await e.createBidirectionalStream(),o=i.writable.getWriter(),a=i.readable.getReader(),c={source:async function*(){for(;;){const e=await a.read();if(null!=e.value&&(yield e.value),e.done)break}}(),sink:async e=>{for await(const t of e){await Ir(o.ready,s);const e=t instanceof Uint8Array?t:t.subarray();o.write(e).catch((e=>{this.log.error("could not write chunk during authentication of WebTransport stream",e)}))}}},l=km()(this.components),{remoteExtensions:u}=await l.secureOutbound(t,c,n);if(o.close().catch((e=>{this.log.error(`Failed to close authentication stream writer: ${e.message}`)})),a.cancel().catch((e=>{this.log.error(`Failed to close authentication stream reader: ${e.message}`)})),h=u?.webtransportCerthashes??[],(d=r.map((e=>e.bytes))).filter((e=>Boolean(h.find((t=>Sn(e,t)))))).length!==d.length)throw new Error("Our certhashes are not a subset of the remote's reported certhashes");var h,d;return!0}createListener(e){return function(e){throw new Error("Not implemented")}(this.components,(this.config.certificates,this.config.maxInboundStreams))}listenFilter(){return[]}dialFilter(e){return e.filter((e=>{if(!Ip.exactMatch(e))return!1;const{url:t,certhashes:n}=Um(e);return null!=t&&n.length>0}))}}function Km(e={}){return t=>new Vm(t,e)}const $m=[Bn("tcp").code,Bn("dns").code,Bn("dnsaddr").code,Bn("dns4").code,Bn("dns6").code];function qm(e){let t;try{t=Bn("sni").code}catch(e){return null}for(const[n,r]of e)if(n===t&&void 0!==r)return r;return null}function Hm(e){return e.some((([e,t])=>e===Bn("tls").code))}function zm(e,t,n){const r=Wm[Bn(e).name];if(void 0===r)throw new Error(`Can't interpret protocol ${Bn(e).name}`);const s=r(t,n);return e===Bn("ip6").code?`[${s}]`:s}const Wm={ip4:(e,t)=>e,ip6:(e,t)=>0===t.length?e:`[${e}]`,tcp:(e,t)=>{const n=t.pop();if(void 0===n)throw new Error("Unexpected end of multiaddr");return`tcp://${zm(n[0],n[1]??"",t)}:${e}`},udp:(e,t)=>{const n=t.pop();if(void 0===n)throw new Error("Unexpected end of multiaddr");return`udp://${zm(n[0],n[1]??"",t)}:${e}`},dnsaddr:(e,t)=>e,dns4:(e,t)=>e,dns6:(e,t)=>e,dns:(e,t)=>e,ipfs:(e,t)=>{const n=t.pop();if(void 0===n)throw new Error("Unexpected end of multiaddr");return`${zm(n[0],n[1]??"",t)}/ipfs/${e}`},p2p:(e,t)=>{const n=t.pop();if(void 0===n)throw new Error("Unexpected end of multiaddr");return`${zm(n[0],n[1]??"",t)}/p2p/${e}`},http:(e,t)=>{const n=Hm(t),r=qm(t);if(n&&null!==r)return`https://${r}`;const s=n?"https://":"http://",i=t.pop();if(void 0===i)throw new Error("Unexpected end of multiaddr");let o=zm(i[0],i[1]??"",t);return o=o.replace("tcp://",""),`${s}${o}`},"http-path":(e,t)=>{const n=t.pop();if(void 0===n)throw new Error("Unexpected end of multiaddr");return`${zm(n[0],n[1]??"",t)}/${decodeURIComponent(e)}`},tls:(e,t)=>{const n=t.pop();if(void 0===n)throw new Error("Unexpected end of multiaddr");return zm(n[0],n[1]??"",t)},sni:(e,t)=>{const n=t.pop();if(void 0===n)throw new Error("Unexpected end of multiaddr");return zm(n[0],n[1]??"",t)},https:(e,t)=>{const n=t.pop();if(void 0===n)throw new Error("Unexpected end of multiaddr");let r=zm(n[0],n[1]??"",t);return r=r.replace("tcp://",""),`https://${r}`},ws:(e,t)=>{const n=Hm(t),r=qm(t);if(n&&null!==r)return`wss://${r}`;const s=n?"wss://":"ws://",i=t.pop();if(void 0===i)throw new Error("Unexpected end of multiaddr");let o=zm(i[0],i[1]??"",t);return o=o.replace("tcp://",""),`${s}${o}`},wss:(e,t)=>{const n=t.pop();if(void 0===n)throw new Error("Unexpected end of multiaddr");let r=zm(n[0],n[1]??"",t);return r=r.replace("tcp://",""),`wss://${r}`},"p2p-websocket-star":(e,t)=>{const n=t.pop();if(void 0===n)throw new Error("Unexpected end of multiaddr");return`${zm(n[0],n[1]??"",t)}/p2p-websocket-star`},"p2p-webrtc-star":(e,t)=>{const n=t.pop();if(void 0===n)throw new Error("Unexpected end of multiaddr");return`${zm(n[0],n[1]??"",t)}/p2p-webrtc-star`},"p2p-webrtc-direct":(e,t)=>{const n=t.pop();if(void 0===n)throw new Error("Unexpected end of multiaddr");return`${zm(n[0],n[1]??"",t)}/p2p-webrtc-direct`}};var jm=async e=>{if(e.readyState>=2)throw new Error("socket closed");1!==e.readyState&&await new Promise(((t,n)=>{function r(){e.removeEventListener("open",s),e.removeEventListener("error",i)}function s(){r(),t()}function i(t){r(),n(t.error??new Error(`connect ECONNREFUSED ${e.url}`))}e.addEventListener("open",s),e.addEventListener("error",i)}))},Gm=(e,t)=>{(t=t??{}).closeOnEnd=!1!==t.closeOnEnd;return async n=>{for await(const t of n){try{await jm(e)}catch(e){if("socket closed"===e.message)break;throw e}if(e.readyState===e.CLOSING||e.readyState===e.CLOSED)break;e.send(t)}null!=t.closeOnEnd&&e.readyState<=1&&await new Promise(((t,n)=>{e.addEventListener("close",(e=>{if(e.wasClean||1006===e.code)t();else{const t=Object.assign(new Error("ws error"),{event:e});n(t)}})),setTimeout((()=>{e.close()}))}))}},Ym={},Qm={};Object.defineProperty(Qm,"__esModule",{value:!0});class Jm{constructor(){this.pullQueue=[],this.pushQueue=[],this.eventHandlers={},this.isPaused=!1,this.isStopped=!1}push(e){if(this.isStopped)return;const t={value:e,done:!1};if(this.pullQueue.length){const e=this.pullQueue.shift();e&&e.resolve(t)}else this.pushQueue.push(Promise.resolve(t)),void 0!==this.highWaterMark&&this.pushQueue.length>=this.highWaterMark&&!this.isPaused&&(this.isPaused=!0,this.eventHandlers.highWater?this.eventHandlers.highWater():console&&console.warn(`EventIterator queue reached ${this.pushQueue.length} items`))}stop(){if(!this.isStopped){this.isStopped=!0,this.remove();for(const e of this.pullQueue)e.resolve({value:void 0,done:!0});this.pullQueue.length=0}}fail(e){if(!this.isStopped)if(this.isStopped=!0,this.remove(),this.pullQueue.length){for(const t of this.pullQueue)t.reject(e);this.pullQueue.length=0}else{const t=Promise.reject(e);t.catch((()=>{})),this.pushQueue.push(t)}}remove(){Promise.resolve().then((()=>{this.removeCallback&&this.removeCallback()}))}[Symbol.asyncIterator](){return{next:e=>{const t=this.pushQueue.shift();return t?(void 0!==this.lowWaterMark&&this.pushQueue.length<=this.lowWaterMark&&this.isPaused&&(this.isPaused=!1,this.eventHandlers.lowWater&&this.eventHandlers.lowWater()),t):this.isStopped?Promise.resolve({value:void 0,done:!0}):new Promise(((e,t)=>{this.pullQueue.push({resolve:e,reject:t})}))},return:()=>(this.isStopped=!0,this.pushQueue.length=0,this.remove(),Promise.resolve({value:void 0,done:!0}))}}}let Zm=class{constructor(e,{highWaterMark:t=100,lowWaterMark:n=1}={}){const r=new Jm;r.highWaterMark=t,r.lowWaterMark=n,r.removeCallback=e({push:e=>r.push(e),stop:()=>r.stop(),fail:e=>r.fail(e),on:(e,t)=>{r.eventHandlers[e]=t}})||(()=>{}),this[Symbol.asyncIterator]=()=>r[Symbol.asyncIterator](),Object.freeze(this)}};Qm.EventIterator=Zm,Qm.default=Zm,Object.defineProperty(Ym,"__esModule",{value:!0});const Xm=Qm;var ey=Ym.EventIterator=Xm.EventIterator;function ty(e){return e instanceof ArrayBuffer||"ArrayBuffer"===e?.constructor?.name&&"number"==typeof e?.byteLength}Ym.subscribe=function(e,t,n){return new Xm.EventIterator((({push:n})=>(this.addEventListener(e,n,t),()=>this.removeEventListener(e,n,t))),n)},Ym.default=Xm.EventIterator;var ny=(e,t)=>{t=t??{};const n=(e=>{e.binaryType="arraybuffer";const t=async()=>{await new Promise(((t,n)=>{if(s)return void t();if(null!=r)return void n(r);const i=t=>{e.removeEventListener("open",o),e.removeEventListener("error",a),t()},o=()=>{i(t)},a=t=>{i((()=>{n(t.error??new Error(`connect ECONNREFUSED ${e.url}`))}))};e.addEventListener("open",o),e.addEventListener("error",a)}))},n=async function*(){const n=new ey((({push:t,stop:n,fail:r})=>{const s=e=>{let n=null;"string"==typeof e.data&&(n=Tt(e.data)),ty(e.data)&&(n=new Uint8Array(e.data)),e.data instanceof Uint8Array&&(n=e.data),null!=n&&t(n)},i=e=>{r(e.error??new Error("Socket error"))};return e.addEventListener("message",s),e.addEventListener("error",i),e.addEventListener("close",n),()=>{e.removeEventListener("message",s),e.removeEventListener("error",i),e.removeEventListener("close",n)}}),{highWaterMark:1/0});await t();for await(const e of n)yield ty(e)?new Uint8Array(e):e}();let r,s=1===e.readyState;return e.addEventListener("open",(()=>{s=!0,r=null})),e.addEventListener("close",(()=>{s=!1,r=null})),e.addEventListener("error",(t=>{s||(r=t.error??new Error(`connect ECONNREFUSED ${e.url}`))})),Object.assign(n,{connected:t})})(e);let r=t.remoteAddress,s=t.remotePort;if(null!=e.url)try{const t=new URL(e.url);r=t.hostname,s=parseInt(t.port,10)}catch{}if(null==r||null==s)throw new Error("Remote connection did not have address and/or port");return{sink:Gm(e,t),source:n,connected:async()=>{await n.connected()},close:async()=>{e.readyState!==e.CONNECTING&&e.readyState!==e.OPEN||await new Promise((t=>{e.addEventListener("close",(()=>{t()})),e.close()}))},destroy:()=>{null!=e.terminate?e.terminate():e.close()},remoteAddress:r,remotePort:s,socket:e}},ry=WebSocket;const sy={"http:":"ws:","https:":"wss:"};function iy(e,t){t=t??{};const n=((e,t)=>{if(e.startsWith("//")&&(e=`${t?.protocol??"ws:"}${e}`),e.startsWith("/")&&null!=t){const n=t.protocol??"ws:",r=t.host,s=null!=t.port&&!0!==r?.endsWith(`:${t.port}`)?`:${t.port}`:"";e=`${n}//${r}${s}${e}`}const n=new URL(e);for(const[e,t]of Object.entries(sy))n.protocol===e&&(n.protocol=t);return n})(e,"undefined"==typeof window?void 0:window.location),r=new ry(n.toString(),t.websocket);return ny(r,t)}var oy=Or((function(){return"undefined"!=typeof window&&"object"==typeof window.process&&"renderer"===window.process.type||(!("undefined"==typeof process||"object"!=typeof process.versions||!process.versions.electron)||"object"==typeof navigator&&"string"==typeof navigator.userAgent&&navigator.userAgent.indexOf("Electron")>=0)}));const ay="object"==typeof window&&"object"==typeof document&&9===document.nodeType,cy=oy(),ly=ay&&!cy,uy=cy&&!ay,hy=cy&&ay,dy=void 0!==globalThis.process&&void 0!==globalThis.process.release&&"node"===globalThis.process.release.name&&!cy,py="function"==typeof importScripts&&"undefined"!=typeof self&&"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope;void 0!==globalThis.process&&void 0!==globalThis.process.env&&globalThis.process.env.NODE_ENV;const fy="undefined"!=typeof navigator&&"ReactNative"===navigator.product,gy=zy("dns4"),my=zy("dns6"),yy=zy("dnsaddr"),wy=Hy(zy("dns"),yy,gy,my),by=Hy(zy("ip4"),zy("ip6")),vy=Hy(qy(by,zy("tcp")),qy(wy,zy("tcp"))),Ey=qy(by,zy("udp")),Sy=qy(Ey,zy("utp")),_y=qy(Ey,zy("quic")),Iy=qy(Ey,zy("quic-v1")),Ry=Hy(qy(vy,zy("ws")),qy(wy,zy("ws"))),Ay=Hy(qy(Ry,zy("p2p")),Ry),Ty=Hy(qy(vy,zy("wss")),qy(wy,zy("wss")),qy(vy,zy("tls"),zy("ws")),qy(wy,zy("tls"),zy("ws"))),Dy=Hy(qy(Ty,zy("p2p")),Ty),ky=Hy(qy(vy,zy("http")),qy(by,zy("http")),qy(wy,zy("http"))),Py=Hy(qy(vy,zy("https")),qy(by,zy("https")),qy(wy,zy("https"))),Cy=qy(Ey,zy("webrtc-direct"),zy("certhash")),xy=Hy(qy(Cy,zy("p2p")),Cy),Ny=qy(Iy,zy("webtransport"),zy("certhash"),zy("certhash")),My=Hy(qy(Ny,zy("p2p")),Ny),Oy=Hy(qy(Ay,zy("p2p-webrtc-star"),zy("p2p")),qy(Dy,zy("p2p-webrtc-star"),zy("p2p")),qy(Ay,zy("p2p-webrtc-star")),qy(Dy,zy("p2p-webrtc-star"))),Ly=Hy(qy(ky,zy("p2p-webrtc-direct"),zy("p2p")),qy(Py,zy("p2p-webrtc-direct"),zy("p2p")),qy(ky,zy("p2p-webrtc-direct")),qy(Py,zy("p2p-webrtc-direct"))),By=Hy(Ry,Ty,ky,Py,Oy,Ly,vy,Sy,_y,wy,xy,My),Uy=Hy(qy(By,zy("p2p")),Oy,Ly,xy,My,zy("p2p")),Fy=Hy(qy(Uy,zy("p2p-circuit"),Uy),qy(Uy,zy("p2p-circuit")),qy(zy("p2p-circuit"),Uy),qy(By,zy("p2p-circuit")),qy(zy("p2p-circuit"),By),zy("p2p-circuit")),Vy=()=>Hy(qy(Fy,Vy),Fy),Ky=Vy();function $y(e){return function(t){let n;try{n=or(t)}catch(e){return!1}const r=e(n.protoNames());return null!==r&&(!0===r||!1===r?r:0===r.length)}}function qy(...e){function t(t){if(t.length<e.length)return null;let n=t;return e.some((e=>(n="function"==typeof e?e().partialMatch(t):e.partialMatch(t),Array.isArray(n)&&(t=n),null===n))),n}return{toString:function(){return"{ "+e.join(" ")+" }"},input:e,matches:$y(t),partialMatch:t}}function Hy(...e){function t(t){let n=null;return e.some((e=>{const r="function"==typeof e?e().partialMatch(t):e.partialMatch(t);return null!=r&&(n=r,!0)})),n}return{toString:function(){return"{ "+e.join(" ")+" }"},input:e,matches:$y(t),partialMatch:t}}function zy(e){const t=e;return{toString:function(){return t},matches:function(e){let n;try{n=or(e)}catch(e){return!1}const r=n.protoNames();return 1===r.length&&r[0]===t},partialMatch:function(e){return 0===e.length?null:e[0]===t?e.slice(1):null}}}class Wy{log;init;logger;constructor(e,t){this.log=e.logger.forComponent("libp2p:websockets"),this.logger=e.logger,this.init=t}[ln]=!0;[Symbol.toStringTag]="@libp2p/websockets";[vn]=["@libp2p/transport"];async dial(e,t){this.log("dialing %s",e),t=t??{};const n=function(e,t,n){const r=n.logger.forComponent("libp2p:websockets:maconn"),s={log:r,async sink(t){try{await e.sink(async function*(){for await(const e of t)e instanceof Uint8Array?yield e:yield e.subarray()}())}catch(e){"aborted"!==e.type&&r.error(e)}},source:e.source,remoteAddr:t,timeline:{open:Date.now()},async close(t={}){const n=Date.now();if(null==t.signal){const e=AbortSignal.timeout(500);t={...t,signal:e}}const i=()=>{const{host:e,port:t}=s.remoteAddr.toOptions();r("timeout closing stream to %s:%s after %dms, destroying it manually",e,t,Date.now()-n),this.abort(new dn("Socket close timeout","ERR_SOCKET_CLOSE_TIMEOUT"))};t.signal?.addEventListener("abort",i);try{await e.close()}catch(e){r.error("error closing WebSocket gracefully",e),this.abort(e)}finally{t.signal?.removeEventListener("abort",i),s.timeline.close=Date.now()}},abort(t){const{host:n,port:i}=s.remoteAddr.toOptions();r("timeout closing stream to %s:%s due to error",n,i,t),e.destroy(),s.timeline.close=Date.now()}};return e.socket.addEventListener("close",(()=>{null==s.timeline.close&&(s.timeline.close=Date.now())}),{once:!0}),s}(await this._connect(e,t),e,{logger:this.logger});this.log("new outbound connection %s",n.remoteAddr);const r=await t.upgrader.upgradeOutbound(n);return this.log("outbound connection %s upgraded",n.remoteAddr),r}async _connect(e,t){if(!0===t?.signal?.aborted)throw new hn;const n=e.toOptions();this.log("dialing %s:%s",n.host,n.port);const r=ar(),s=iy(function(e,t){const n=or(e).stringTuples(),r=n.pop();if(void 0===r)throw new Error("Unexpected end of multiaddr");const s=Bn(r[0]),i=Wm[s.name];if(null==i)throw new Error(`No interpreter found for ${s.name}`);let o=i(r[1]??"",n);return $m.includes(r[0])&&(o=o.replace(/^.*:\/\//,""),o="443"===r[1]?`https://${o}`:`http://${o}`),(o.startsWith("http://")||o.startsWith("https://"))&&(o=new URL(o).toString(),o.endsWith("/")&&(o=o.substring(0,o.length-1))),o}(e),this.init);if(s.socket.addEventListener("error",(()=>{const t=new dn(`Could not connect to ${e.toString()}`,"ERR_CONNECTION_FAILED");this.log.error("connection error:",t),r.reject(t)})),null==t.signal)return await Promise.race([s.connected(),r.promise]),this.log("connected %s",e),s;let i;const o=new Promise(((e,n)=>{i=()=>{n(new hn),s.close().catch((e=>{this.log.error("error closing raw socket",e)}))},!0!==t?.signal?.aborted?t?.signal?.addEventListener("abort",i):i()}));try{await Promise.race([o,r.promise,s.connected()])}finally{null!=i&&t?.signal?.removeEventListener("abort",i)}return this.log("connected %s",e),s}createListener(e){return function(){throw new Error("WebSocket Servers can not be created in the browser!")}(this.logger,this.init)}listenFilter(e){return e=Array.isArray(e)?e:[e],null!=this.init?.filter?this.init?.filter(e):ly||py?function(e){return e.filter((e=>{if(e.protoCodes().includes(290))return!1;const t=e.decapsulateCode(421);return Dy.matches(t)}))}(e):function(e){return e.filter((e=>{if(e.protoCodes().includes(290))return!1;const t=e.decapsulateCode(421);return Ay.matches(t)||Dy.matches(t)}))}(e)}dialFilter(e){return this.listenFilter(e)}}function jy(e={}){return t=>new Wy(t,e)}var Gy;!function(e){e.ERR_ALREADY_ABORTED="ERR_ALREADY_ABORTED",e.ERR_DATA_CHANNEL="ERR_DATA_CHANNEL",e.ERR_CONNECTION_CLOSED="ERR_CONNECTION_CLOSED",e.ERR_HASH_NOT_SUPPORTED="ERR_HASH_NOT_SUPPORTED",e.ERR_INVALID_MULTIADDR="ERR_INVALID_MULTIADDR",e.ERR_INVALID_FINGERPRINT="ERR_INVALID_FINGERPRINT",e.ERR_INVALID_PARAMETERS="ERR_INVALID_PARAMETERS",e.ERR_NOT_IMPLEMENTED="ERR_NOT_IMPLEMENTED",e.ERR_TOO_MANY_INBOUND_PROTOCOL_STREAMS="ERR_TOO_MANY_INBOUND_PROTOCOL_STREAMS",e.ERR_TOO_MANY_OUTBOUND_PROTOCOL_STREAMS="ERR_TOO_MANY_OUTBOUND_PROTOCOL_STREAMS"}(Gy||(Gy={}));var Yy=function(e,t,n){if(n||2===arguments.length)for(var r,s=0,i=t.length;s<i;s++)!r&&s in t||(r||(r=Array.prototype.slice.call(t,0,s)),r[s]=t[s]);return e.concat(r||Array.prototype.slice.call(t))},Qy=function(e,t,n){this.name=e,this.version=t,this.os=n,this.type="browser"},Jy=function(e){this.version=e,this.type="node",this.name="node",this.os=process.platform},Zy=function(e,t,n,r){this.name=e,this.version=t,this.os=n,this.bot=r,this.type="bot-device"},Xy=function(){this.type="bot",this.bot=!0,this.name="bot",this.version=null,this.os=null},ew=function(){this.type="react-native",this.name="react-native",this.version=null,this.os=null},tw=/(nuhk|curl|Googlebot|Yammybot|Openbot|Slurp|MSNBot|Ask\ Jeeves\/Teoma|ia_archiver)/,nw=3,rw=[["aol",/AOLShield\/([0-9\._]+)/],["edge",/Edge\/([0-9\._]+)/],["edge-ios",/EdgiOS\/([0-9\._]+)/],["yandexbrowser",/YaBrowser\/([0-9\._]+)/],["kakaotalk",/KAKAOTALK\s([0-9\.]+)/],["samsung",/SamsungBrowser\/([0-9\.]+)/],["silk",/\bSilk\/([0-9._-]+)\b/],["miui",/MiuiBrowser\/([0-9\.]+)$/],["beaker",/BeakerBrowser\/([0-9\.]+)/],["edge-chromium",/EdgA?\/([0-9\.]+)/],["chromium-webview",/(?!Chrom.*OPR)wv\).*Chrom(?:e|ium)\/([0-9\.]+)(:?\s|$)/],["chrome",/(?!Chrom.*OPR)Chrom(?:e|ium)\/([0-9\.]+)(:?\s|$)/],["phantomjs",/PhantomJS\/([0-9\.]+)(:?\s|$)/],["crios",/CriOS\/([0-9\.]+)(:?\s|$)/],["firefox",/Firefox\/([0-9\.]+)(?:\s|$)/],["fxios",/FxiOS\/([0-9\.]+)/],["opera-mini",/Opera Mini.*Version\/([0-9\.]+)/],["opera",/Opera\/([0-9\.]+)(?:\s|$)/],["opera",/OPR\/([0-9\.]+)(:?\s|$)/],["pie",/^Microsoft Pocket Internet Explorer\/(\d+\.\d+)$/],["pie",/^Mozilla\/\d\.\d+\s\(compatible;\s(?:MSP?IE|MSInternet Explorer) (\d+\.\d+);.*Windows CE.*\)$/],["netfront",/^Mozilla\/\d\.\d+.*NetFront\/(\d.\d)/],["ie",/Trident\/7\.0.*rv\:([0-9\.]+).*\).*Gecko$/],["ie",/MSIE\s([0-9\.]+);.*Trident\/[4-7].0/],["ie",/MSIE\s(7\.0)/],["bb10",/BB10;\sTouch.*Version\/([0-9\.]+)/],["android",/Android\s([0-9\.]+)/],["ios",/Version\/([0-9\._]+).*Mobile.*Safari.*/],["safari",/Version\/([0-9\._]+).*Safari/],["facebook",/FB[AS]V\/([0-9\.]+)/],["instagram",/Instagram\s([0-9\.]+)/],["ios-webview",/AppleWebKit\/([0-9\.]+).*Mobile/],["ios-webview",/AppleWebKit\/([0-9\.]+).*Gecko\)$/],["curl",/^curl\/([0-9\.]+)$/],["searchbot",/alexa|bot|crawl(er|ing)|facebookexternalhit|feedburner|google web preview|nagios|postrank|pingdom|slurp|spider|yahoo!|yandex/]],sw=[["iOS",/iP(hone|od|ad)/],["Android OS",/Android/],["BlackBerry OS",/BlackBerry|BB10/],["Windows Mobile",/IEMobile/],["Amazon OS",/Kindle/],["Windows 3.11",/Win16/],["Windows 95",/(Windows 95)|(Win95)|(Windows_95)/],["Windows 98",/(Windows 98)|(Win98)/],["Windows 2000",/(Windows NT 5.0)|(Windows 2000)/],["Windows XP",/(Windows NT 5.1)|(Windows XP)/],["Windows Server 2003",/(Windows NT 5.2)/],["Windows Vista",/(Windows NT 6.0)/],["Windows 7",/(Windows NT 6.1)/],["Windows 8",/(Windows NT 6.2)/],["Windows 8.1",/(Windows NT 6.3)/],["Windows 10",/(Windows NT 10.0)/],["Windows ME",/Windows ME/],["Windows CE",/Windows CE|WinCE|Microsoft Pocket Internet Explorer/],["Open BSD",/OpenBSD/],["Sun OS",/SunOS/],["Chrome OS",/CrOS/],["Linux",/(Linux)|(X11)/],["Mac OS",/(Mac_PowerPC)|(Macintosh)/],["QNX",/QNX/],["BeOS",/BeOS/],["OS/2",/OS\/2/]];const iw="undefined"==typeof document&&"undefined"!=typeof navigator&&"ReactNative"===navigator.product?new ew:"undefined"!=typeof navigator?function(e){var t=function(e){return""!==e&&rw.reduce((function(t,n){var r=n[0],s=n[1];if(t)return t;var i=s.exec(e);return!!i&&[r,i]}),!1)}(e);if(!t)return null;var n=t[0],r=t[1];if("searchbot"===n)return new Xy;var s=r[1]&&r[1].split(".").join("_").split("_").slice(0,3);s?s.length<nw&&(s=Yy(Yy([],s,!0),function(e){for(var t=[],n=0;n<e;n++)t.push("0");return t}(nw-s.length),!0)):s=[];var i=s.join("."),o=function(e){for(var t=0,n=sw.length;t<n;t++){var r=sw[t],s=r[0];if(r[1].exec(e))return s}return null}(e),a=tw.exec(e);return a&&a[1]?new Zy(n,i,o,a[1]):new Qy(n,i,o)}(navigator.userAgent):function(){var e="undefined"!=typeof process&&process.version;return e?new Jy(process.version.slice(1)):null}(),ow=null!=iw&&"firefox"===iw.name,aw=async function*(){},cw=async e=>{};class lw{log;peerConnection;remoteAddr;timeline;metrics;source=aw();sink=cw;constructor(e,t){this.log=e.logger.forComponent("libp2p:webrtc:maconn"),this.remoteAddr=t.remoteAddr,this.timeline=t.timeline,this.peerConnection=t.peerConnection;const n=this.peerConnection.connectionState;this.peerConnection.onconnectionstatechange=()=>{this.log.trace("peer connection state change",this.peerConnection.connectionState,"initial state",n),"disconnected"!==this.peerConnection.connectionState&&"failed"!==this.peerConnection.connectionState&&"closed"!==this.peerConnection.connectionState||(this.timeline.close=Date.now())}}async close(e){this.log.trace("closing connection"),this.peerConnection.close(),this.timeline.close=Date.now(),this.metrics?.increment({close:!0})}abort(e){this.log.error("closing connection due to error",e),this.peerConnection.close(),this.timeline.close=Date.now(),this.metrics?.increment({abort:!0})}}const uw=e=>{const t=e.addEventListener||e.on||e.addListener,n=e.removeEventListener||e.off||e.removeListener;if(!t||!n)throw new TypeError("Emitter is not compatible");return{addListener:t.bind(e),removeListener:n.bind(e)}};function hw(e,t,n){"function"==typeof n&&(n={filter:n});const r=function(e,t,n){let r;const s=new Promise(((s,i)=>{if(!((n={rejectionEvents:["error"],multiArgs:!1,resolveImmediately:!1,...n}).count>=0)||n.count!==Number.POSITIVE_INFINITY&&!Number.isInteger(n.count))throw new TypeError("The `count` option should be at least 0 or more");n.signal?.throwIfAborted();const o=[t].flat(),a=[],{addListener:c,removeListener:l}=uw(e),u=(...e)=>{const t=n.multiArgs?e:e[0];n.filter&&!n.filter(t)||(a.push(t),n.count===a.length&&(r(),s(a)))},h=e=>{r(),i(e)};r=()=>{for(const e of o)l(e,u);for(const e of n.rejectionEvents)l(e,h)};for(const e of o)c(e,u);for(const e of n.rejectionEvents)c(e,h);n.signal&&n.signal.addEventListener("abort",(()=>{h(n.signal.reason)}),{once:!0}),n.resolveImmediately&&s(a)}));if(s.cancel=r,"number"==typeof n.timeout){const e=Ah(s,{milliseconds:n.timeout});return e.cancel=r,e}return s}(e,t,n={...n,count:1,resolveImmediately:!1}),s=r.then((e=>e[0]));return s.cancel=r.cancel,s}var dw;!function(e){let t,n;!function(e){e.FIN="FIN",e.STOP_SENDING="STOP_SENDING",e.RESET="RESET",e.FIN_ACK="FIN_ACK"}(e.Flag||(e.Flag={})),function(e){e[e.FIN=0]="FIN",e[e.STOP_SENDING=1]="STOP_SENDING",e[e.RESET=2]="RESET",e[e.FIN_ACK=3]="FIN_ACK"}(t||(t={})),function(e){e.codec=()=>Ht(t)}(e.Flag||(e.Flag={})),e.codec=()=>(null==n&&(n=zt(((t,n,r={})=>{!1!==r.lengthDelimited&&n.fork(),null!=t.flag&&(n.uint32(8),e.Flag.codec().encode(t.flag,n)),null!=t.message&&(n.uint32(18),n.bytes(t.message)),!1!==r.lengthDelimited&&n.ldelim()}),((t,n)=>{const r={},s=null==n?t.len:t.pos+n;for(;t.pos<s;){const n=t.uint32();switch(n>>>3){case 1:r.flag=e.Flag.codec().decode(t);break;case 2:r.message=t.bytes();break;default:t.skipType(7&n)}}return r}))),n),e.encode=t=>Kt(t,e.codec()),e.decode=t=>W(t,e.codec())}(dw||(dw={}));class pw extends xm{channel;incomingData;maxBufferedAmount;bufferedAmountLowEventTimeout;maxMessageSize;receiveFinAck;finAckTimeout;openTimeout;constructor(e){const t=e.onEnd;switch(e.onEnd=e=>{this.log.trace("readable and writeable ends closed",this.status),Promise.resolve((async()=>{if(null==this.timeline.abort&&null===this.timeline.reset)try{await Ah(this.receiveFinAck.promise,{milliseconds:this.finAckTimeout})}catch(e){this.log.error("error receiving FIN_ACK",e)}})).then((()=>{this.incomingData.end(),t?.(e)})).catch((e=>{this.log.error("error ending stream",e)}))},super(e),this.channel=e.channel,this.channel.binaryType="arraybuffer",this.incomingData=hr(),this.bufferedAmountLowEventTimeout=e.bufferedAmountLowEventTimeout??3e4,this.maxBufferedAmount=e.maxBufferedAmount??16777216,this.maxMessageSize=(e.maxMessageSize??16384)-5-2,this.receiveFinAck=ar(),this.finAckTimeout=e.closeTimeout??5e3,this.openTimeout=e.openTimeout??5e3,this.channel.readyState){case"open":this.timeline.open=(new Date).getTime();break;case"closed":case"closing":void 0!==this.timeline.close&&0!==this.timeline.close||(this.timeline.close=Date.now());break;case"connecting":break;default:throw this.log.error("unknown datachannel state %s",this.channel.readyState),new dn("Unknown datachannel state","ERR_INVALID_STATE")}this.channel.onopen=e=>{this.timeline.open=(new Date).getTime()},this.channel.onclose=e=>{this.receiveFinAck.resolve(),this.close().catch((e=>{this.log.error("error closing stream after channel closed",e)}))},this.channel.onerror=e=>{const t=e.error;this.abort(t)},this.channel.onmessage=async e=>{const{data:t}=e;null!==t&&0!==t.byteLength&&this.incomingData.push(new Uint8Array(t,0,t.byteLength))};const n=this;Promise.resolve().then((async()=>{for await(const e of Kr(this.incomingData)){const t=n.processIncomingProtobuf(e);null!=t&&n.sourcePush(new Sr(t))}})).catch((e=>{this.log.error("error processing incoming data channel messages",e)}))}sendNewStream(){}async _sendMessage(e,t=!0){if(t&&this.channel.bufferedAmount>this.maxBufferedAmount)try{this.log('channel buffer is %d, wait for "bufferedamountlow" event',this.channel.bufferedAmount),await hw(this.channel,"bufferedamountlow",{timeout:this.bufferedAmountLowEventTimeout})}catch(e){if(e instanceof Sh)throw new dn(`Timed out waiting for DataChannel buffer to clear after ${this.bufferedAmountLowEventTimeout}ms`,"ERR_BUFFER_CLEAR_TIMEOUT");throw e}if("closed"===this.channel.readyState||"closing"===this.channel.readyState)throw new dn(`Invalid datachannel state - ${this.channel.readyState}`,"ERR_INVALID_STATE");"open"!==this.channel.readyState&&(this.log('channel state is "%s" and not "open", waiting for "open" event before sending data',this.channel.readyState),await hw(this.channel,"open",{timeout:this.openTimeout}),this.log('channel state is now "%s", sending data',this.channel.readyState)),this.channel.send(e.subarray())}async sendData(e){for(e=e.sublist();e.byteLength>0;){const t=Math.min(e.byteLength,this.maxMessageSize),n=e.subarray(0,t),r=dw.encode({message:n}),s=Nr.single(r);await this._sendMessage(s),e.consume(t)}}async sendReset(){await this._sendFlag(dw.Flag.RESET)}async sendCloseWrite(e){if(await this._sendFlag(dw.Flag.FIN)){this.log.trace("awaiting FIN_ACK");try{await Ir(this.receiveFinAck.promise,e?.signal,{errorMessage:"sending close-write was aborted before FIN_ACK was received",errorCode:"ERR_FIN_ACK_NOT_RECEIVED"})}catch(e){this.log.error("failed to await FIN_ACK",e)}}else this.log.trace("sending FIN failed, not awaiting FIN_ACK");this.receiveFinAck.resolve()}async sendCloseRead(){await this._sendFlag(dw.Flag.STOP_SENDING)}processIncomingProtobuf(e){const t=dw.decode(e);if(void 0!==t.flag&&(this.log.trace('incoming flag %s, write status "%s", read status "%s"',t.flag,this.writeStatus,this.readStatus),t.flag===dw.Flag.FIN&&(this.remoteCloseWrite(),this.log.trace("sending FIN_ACK"),this._sendFlag(dw.Flag.FIN_ACK).catch((e=>{this.log.error("error sending FIN_ACK immediately",e)}))),t.flag===dw.Flag.RESET&&this.reset(),t.flag===dw.Flag.STOP_SENDING&&this.remoteCloseRead(),t.flag===dw.Flag.FIN_ACK&&(this.log.trace("received FIN_ACK"),this.receiveFinAck.resolve())),"ready"===this.readStatus)return t.message}async _sendFlag(e){if("open"!==this.channel.readyState)return this.log.trace('not sending flag %s because channel is "%s" and not "open"',this.channel.readyState,e.toString()),!1;this.log.trace("sending flag %s",e.toString());const t=dw.encode({flag:e}),n=Nr.single(t);try{return await this._sendMessage(n,!1),!0}catch(t){this.log.error("could not send flag %s",e.toString(),t)}return!1}}function fw(e){const{channel:t,direction:n}=e;return new pw({id:"inbound"===n?`i${t.id}`:`r${t.id}`,log:e.logger.forComponent(`libp2p:webrtc:stream:${n}:${t.id}`),...e})}const gw="/webrtc";class mw{protocol;peerConnection;bufferedStreams=[];metrics;dataChannelOptions;components;log;constructor(e,t){this.components=e,this.peerConnection=t.peerConnection,this.metrics=t.metrics,this.protocol=t.protocol??gw,this.dataChannelOptions=t.dataChannelOptions??{},this.log=e.logger.forComponent("libp2p:webrtc:datachannelmuxerfactory"),this.peerConnection.ondatachannel=({channel:t})=>{if(this.log.trace('incoming early datachannel with channel id %d and label "%s"',t.id),"init"===t.label)return this.log.trace("closing early init channel"),void t.close();const n={},r=fw({channel:t,direction:"inbound",onEnd:e=>{n.onEnd(e)},logger:e.logger,...this.dataChannelOptions});n.stream=r,n.channel=t,n.onEnd=()=>{this.bufferedStreams=this.bufferedStreams.filter((e=>e.stream.id!==r.id))},this.bufferedStreams.push(n)}}createStreamMuxer(e){return new yw(this.components,{...e,peerConnection:this.peerConnection,dataChannelOptions:this.dataChannelOptions,metrics:this.metrics,streams:this.bufferedStreams,protocol:this.protocol})}}class yw{init;streams;protocol;log;peerConnection;dataChannelOptions;metrics;logger;constructor(e,t){this.init=t,this.log=e.logger.forComponent("libp2p:webrtc:muxer"),this.logger=e.logger,this.streams=t.streams.map((e=>e.stream)),this.peerConnection=t.peerConnection,this.protocol=t.protocol??gw,this.metrics=t.metrics,this.dataChannelOptions=t.dataChannelOptions??{},this.peerConnection.ondatachannel=({channel:e})=>{if(this.log.trace("incoming datachannel with channel id %d",e.id),"init"===e.label)return this.log.trace("closing init channel"),void e.close();const n=fw({channel:e,direction:"inbound",onEnd:()=>{this.log("incoming channel %s ended with state %s",e.id,e.readyState),this.#L(n,e)},logger:this.logger,...this.dataChannelOptions});this.streams.push(n),this.metrics?.increment({incoming_stream:!0}),t?.onIncomingStream?.(n)},this.init.streams.length>0&&queueMicrotask((()=>{this.init.streams.forEach((e=>{e.onEnd=()=>{this.log("incoming early channel %s ended with state %s",e.channel.id,e.channel.readyState),this.#L(e.stream,e.channel)},this.metrics?.increment({incoming_stream:!0}),this.init?.onIncomingStream?.(e.stream)}))}))}#L(e,t){this.log.trace("stream %s %s %s onEnd",e.direction,e.id,e.protocol),function(e,t,n=3e4,r){"open"===e.readyState&&Promise.resolve().then((async()=>{if(e.bufferedAmount>0){r.log("%s drain channel with %d buffered bytes",t,e.bufferedAmount);const s=ar();let i=!1;e.bufferedAmountLowThreshold=0;const o=()=>{i||(r.log("%s drain channel closed before drain",t),s.resolve())};e.addEventListener("close",o,{once:!0}),e.addEventListener("bufferedamountlow",(()=>{i=!0,e.removeEventListener("close",o),s.resolve()})),await Ah(s.promise,{milliseconds:n})}})).then((async()=>{"open"===e.readyState&&e.close()})).catch((e=>{r.log.error("error closing outbound stream",e)}))}(t,`${e.direction} ${e.id} ${e.protocol}`,this.dataChannelOptions.drainTimeout,{log:this.log}),this.streams=this.streams.filter((t=>t.id!==e.id)),this.metrics?.increment({stream_end:!0}),this.init?.onStreamEnd?.(e)}async close(e){try{await Promise.all(this.streams.map((async t=>t.close(e))))}catch(e){this.abort(e)}}abort(e){for(const t of this.streams)t.abort(e)}source=aw();sink=cw;newStream(){const e=this.peerConnection.createDataChannel("");this.log.trace("opened outgoing datachannel with channel id %s",e.id);const t=fw({channel:e,direction:"outbound",onEnd:()=>{this.log("outgoing channel %s ended with state %s",e.id,e.readyState),this.#L(t,e)},logger:this.logger,...this.dataChannelOptions});return this.streams.push(t),this.metrics?.increment({outgoing_stream:!0}),t}}const ww=globalThis.RTCPeerConnection,bw=globalThis.RTCSessionDescription,vw=globalThis.RTCIceCandidate;function Ew(e,t){const n=Pr(e,t),r={read:async(e,t)=>{const r=await n.read(t);return e.decode(r)},write:async(e,t,r)=>{await n.write(t.encode(e),r)},writeV:async(e,t,r)=>{await n.writeV(e.map((e=>t.encode(e))),r)},pb:e=>({read:async t=>r.read(e,t),write:async(t,n)=>r.write(t,e,n),writeV:async(t,n)=>r.writeV(t,e,n),unwrap:()=>r}),unwrap:()=>n.unwrap()};return r}var Sw;!function(e){let t,n;!function(e){e.SDP_OFFER="SDP_OFFER",e.SDP_ANSWER="SDP_ANSWER",e.ICE_CANDIDATE="ICE_CANDIDATE"}(e.Type||(e.Type={})),function(e){e[e.SDP_OFFER=0]="SDP_OFFER",e[e.SDP_ANSWER=1]="SDP_ANSWER",e[e.ICE_CANDIDATE=2]="ICE_CANDIDATE"}(t||(t={})),function(e){e.codec=()=>Ht(t)}(e.Type||(e.Type={})),e.codec=()=>(null==n&&(n=zt(((t,n,r={})=>{!1!==r.lengthDelimited&&n.fork(),null!=t.type&&(n.uint32(8),e.Type.codec().encode(t.type,n)),null!=t.data&&(n.uint32(18),n.string(t.data)),!1!==r.lengthDelimited&&n.ldelim()}),((t,n)=>{const r={},s=null==n?t.len:t.pos+n;for(;t.pos<s;){const n=t.uint32();switch(n>>>3){case 1:r.type=e.Type.codec().decode(t);break;case 2:r.data=t.string();break;default:t.skipType(7&n)}}return r}))),n),e.encode=t=>Kt(t,e.codec()),e.decode=t=>W(t,e.codec())}(Sw||(Sw={}));const _w=async(e,t,n)=>{try{const r=ar();for(!function(e,t){e[ow?"oniceconnectionstatechange":"onconnectionstatechange"]=n=>{switch(function(e){return ow?e.iceConnectionState:e.connectionState}(e)){case"connected":t.resolve();break;case"failed":case"disconnected":case"closed":t.reject(new dn("RTCPeerConnection was closed","ERR_CONNECTION_CLOSED_BEFORE_CONNECTED"))}}}(e,r);;){const s=await Promise.race([r.promise,t.read({signal:n.signal}).catch((()=>{}))]);if(null==s){n.signal?.throwIfAborted();break}if(s.type!==Sw.Type.ICE_CANDIDATE)throw new dn("ICE candidate message expected","ERR_NOT_ICE_CANDIDATE");const i=JSON.parse(s.data??"null");if(""===i||null===i){n.log.trace("end-of-candidates received");continue}const o=new vw(i);n.log.trace("%s received new ICE candidate %o",n.direction,i);try{await e.addIceCandidate(o)}catch(e){n.log.error("%s bad candidate received",n.direction,i,e)}}}catch(e){if(n.log.error("%s error parsing ICE candidate",n.direction,e),!0===n.signal?.aborted)throw e}};async function Iw({rtcConfiguration:e,dataChannel:t,signal:n,metrics:r,multiaddr:s,connectionManager:i,transportManager:o,log:a,logger:c}){const{baseAddr:l}=function(e){const t=e.toString().split(Aw+"/");if(2!==t.length)throw new dn("webrtc protocol was not present in multiaddr",Gy.ERR_INVALID_MULTIADDR);if(!t[0].includes(Tw))throw new dn("p2p-circuit protocol was not present in multiaddr",Gy.ERR_INVALID_MULTIADDR);let n=or(t[0]);const r=or("/"+t[1]).getPeerId();if(null==r)throw new dn("destination peer id was missing",Gy.ERR_INVALID_MULTIADDR);const s=n.protos().pop();if(void 0===s)throw new dn("invalid multiaddr",Gy.ERR_INVALID_MULTIADDR);"p2p"!==s.name&&(n=n.encapsulate(`/p2p/${r}`));return{baseAddr:n,peerId:bs(r)}}(s);r?.dialerEvents.increment({open:!0}),a.trace("dialing base address: %a",l);const u=l.getPeerId();if(null==u)throw new dn("Relay peer was missing","ERR_INVALID_ADDRESS");const h=i.getConnections(bs(u));let d,p=!1;0===h.length?(d=await o.dial(l,{signal:n}),p=!0):d=h[0];try{const r=await d.newStream(Dw,{signal:n,runOnTransientConnection:!0}),i=Ew(r).pb(Sw),o=new ww(e),l=new mw({logger:c},{peerConnection:o,dataChannelOptions:t});try{const e=o.createDataChannel("init");o.onicecandidate=({candidate:e})=>{const t=JSON.stringify(e?.toJSON()??null);a.trace("initiator sending ICE candidate %o",e),i.write({type:Sw.Type.ICE_CANDIDATE,data:t},{signal:n}).catch((e=>{a.error("error sending ICE candidate",e)}))},o.onicecandidateerror=e=>{a.error("initiator ICE candidate error",e)};const t=await o.createOffer().catch((e=>{throw a.error("could not execute createOffer",e),new dn("Failed to set createOffer","ERR_SDP_HANDSHAKE_FAILED")}));a.trace("initiator send SDP offer %s",t.sdp),await i.write({type:Sw.Type.SDP_OFFER,data:t.sdp},{signal:n}),await o.setLocalDescription(t).catch((e=>{throw a.error("could not execute setLocalDescription",e),new dn("Failed to set localDescription","ERR_SDP_HANDSHAKE_FAILED")}));const c=await i.read({signal:n});if(c.type!==Sw.Type.SDP_ANSWER)throw new dn("Remote should send an SDP answer","ERR_SDP_HANDSHAKE_FAILED");a.trace("initiator receive SDP answer %s",c.data);const u=new bw({type:"answer",sdp:c.data});return await o.setRemoteDescription(u).catch((e=>{throw a.error("could not execute setRemoteDescription",e),new dn("Failed to set remoteDescription","ERR_SDP_HANDSHAKE_FAILED")})),a.trace("initiator read candidates until connected"),await _w(o,i,{direction:"initiator",signal:n,log:a}),a.trace("initiator connected, closing init channel"),e.close(),a.trace("closing signalling channel"),await r.close({signal:n}),a.trace("initiator connected to remote address %s",s),{remoteAddress:s,peerConnection:o,muxerFactory:l}}catch(e){throw a.error("outgoing signalling error",e),o.close(),r.abort(e),e}finally{o.onicecandidate=null,o.onicecandidateerror=null}}finally{if(p)try{await d.close({signal:n})}catch(e){d.abort(e)}}}class Rw extends mn{peerId;transportManager;shutdownController;constructor(e,t){super(),this.peerId=e.peerId,this.transportManager=e.transportManager,this.shutdownController=t.shutdownController}async listen(){this.safeDispatchEvent("listening",{})}getAddrs(){return this.transportManager.getListeners().filter((e=>e!==this)).map((e=>e.getAddrs().filter((e=>Ky.matches(e))).map((e=>e.encapsulate(`/webrtc/p2p/${this.peerId}`))))).flat()}async close(){this.shutdownController.abort(),this.safeDispatchEvent("close",{})}}const Aw="/webrtc",Tw="/p2p-circuit",Dw="/webrtc-signaling/0.0.1";class kw{components;init;log;_started=!1;metrics;shutdownController;constructor(e,t={}){this.components=e,this.init=t,this.log=e.logger.forComponent("libp2p:webrtc"),this.shutdownController=new AbortController,this.shutdownController.signal,null!=e.metrics&&(this.metrics={dialerEvents:e.metrics.registerCounterGroup("libp2p_webrtc_dialer_events_total",{label:"event",help:"Total count of WebRTC dialer events by type"}),listenerEvents:e.metrics.registerCounterGroup("libp2p_webrtc_listener_events_total",{label:"event",help:"Total count of WebRTC listener events by type"})})}[ln]=!0;[Symbol.toStringTag]="@libp2p/webrtc";[vn]=["@libp2p/transport"];[En]=["@libp2p/identify","@libp2p/circuit-relay-v2-transport"];isStarted(){return this._started}async start(){await this.components.registrar.handle(Dw,(e=>{this._onProtocol(e).catch((t=>{this.log.error("failed to handle incoming connect from %p",e.connection.remotePeer,t)}))}),{runOnTransientConnection:!0}),this._started=!0}async stop(){await this.components.registrar.unhandle(Dw),this._started=!1}createListener(e){return new Rw(this.components,{shutdownController:this.shutdownController})}listenFilter(e){return e.filter(Tp.exactMatch)}dialFilter(e){return this.listenFilter(e)}async dial(e,t){this.log.trace("dialing address: %a",e);const{remoteAddress:n,peerConnection:r,muxerFactory:s}=await Iw({rtcConfiguration:"function"==typeof this.init.rtcConfiguration?await this.init.rtcConfiguration():this.init.rtcConfiguration,dataChannel:this.init.dataChannel,multiaddr:e,dataChannelOptions:this.init.dataChannel,signal:t.signal,connectionManager:this.components.connectionManager,transportManager:this.components.transportManager,log:this.log,logger:this.components.logger}),i=new lw(this.components,{peerConnection:r,timeline:{open:Date.now()},remoteAddr:n,metrics:this.metrics?.dialerEvents}),o=await t.upgrader.upgradeOutbound(i,{skipProtection:!0,skipEncryption:!0,muxerFactory:s});return this._closeOnShutdown(r,i),o}async _onProtocol({connection:e,stream:t}){const n=AbortSignal.timeout(this.init.inboundConnectionTimeout??3e4),r=new ww("function"==typeof this.init.rtcConfiguration?await this.init.rtcConfiguration():this.init.rtcConfiguration),s=new mw(this.components,{peerConnection:r,dataChannelOptions:this.init.dataChannel});try{const{remoteAddress:i}=await async function({peerConnection:e,stream:t,signal:n,connection:r,log:s}){s.trace("new inbound signaling stream");const i=Ew(t).pb(Sw);try{e.onicecandidate=({candidate:e})=>{const t=JSON.stringify(e?.toJSON()??null);s.trace("recipient sending ICE candidate %s",t),i.write({type:Sw.Type.ICE_CANDIDATE,data:t},{signal:n}).catch((e=>{s.error("error sending ICE candidate",e)}))};const t=await i.read({signal:n});if(t.type!==Sw.Type.SDP_OFFER)throw new dn(`expected message type SDP_OFFER, received: ${t.type??"undefined"} `,"ERR_SDP_HANDSHAKE_FAILED");s.trace("recipient receive SDP offer %s",t.data);const r=new bw({type:"offer",sdp:t.data});await e.setRemoteDescription(r).catch((e=>{throw s.error("could not execute setRemoteDescription",e),new dn("Failed to set remoteDescription","ERR_SDP_HANDSHAKE_FAILED")}));const o=await e.createAnswer().catch((e=>{throw s.error("could not execute createAnswer",e),new dn("Failed to create answer","ERR_SDP_HANDSHAKE_FAILED")}));s.trace("recipient send SDP answer %s",o.sdp),await i.write({type:Sw.Type.SDP_ANSWER,data:o.sdp},{signal:n}),await e.setLocalDescription(o).catch((e=>{throw s.error("could not execute setLocalDescription",e),new dn("Failed to set localDescription","ERR_SDP_HANDSHAKE_FAILED")})),s.trace("recipient read candidates until connected"),await _w(e,i,{direction:"recipient",signal:n,log:s})}catch(t){if("connected"!==e.connectionState)throw s.error("error while handling signaling stream from peer %a",r.remoteAddr,t),e.close(),t;s("error while handling signaling stream from peer %a, ignoring as the RTCPeerConnection is already connected",r.remoteAddr,t)}const o=or(`/webrtc/p2p/${r.remoteAddr.getPeerId()}`);return s.trace("recipient connected to remote address %s",o),{remoteAddress:o}}({peerConnection:r,connection:e,stream:t,signal:n,log:this.log});await t.close({signal:n});const o=new lw(this.components,{peerConnection:r,timeline:{open:(new Date).getTime()},remoteAddr:i,metrics:this.metrics?.listenerEvents});await this.components.upgrader.upgradeInbound(o,{skipEncryption:!0,skipProtection:!0,muxerFactory:s}),this._closeOnShutdown(r,o)}catch(e){throw this.log.error("incoming signalling error",e),r.close(),t.abort(e),e}}_closeOnShutdown(e,t){const n=()=>{t.close().catch((e=>{this.log.error("could not close WebRTCMultiaddrConnection",e)}))};this.shutdownController.signal.addEventListener("abort",n),e.addEventListener("close",(()=>{this.shutdownController.signal.removeEventListener("abort",n)}))}}var Pw;function Cw(e,t){if(Ap.matches(e))return!1;return null!=t.dialTransportForMultiaddr(e)&&(!!cp.matches(e)||!!dp.matches(e)&&!1===Wd(e.toOptions().host))}!function(e){let t,n;!function(e){e.UNUSED="UNUSED",e.CONNECT="CONNECT",e.SYNC="SYNC"}(e.Type||(e.Type={})),function(e){e[e.UNUSED=0]="UNUSED",e[e.CONNECT=100]="CONNECT",e[e.SYNC=300]="SYNC"}(t||(t={})),function(e){e.codec=()=>Ht(t)}(e.Type||(e.Type={})),e.codec=()=>(null==n&&(n=zt(((t,n,r={})=>{if(!1!==r.lengthDelimited&&n.fork(),null!=t.type&&(n.uint32(8),e.Type.codec().encode(t.type,n)),null!=t.observedAddresses)for(const e of t.observedAddresses)n.uint32(18),n.bytes(e);!1!==r.lengthDelimited&&n.ldelim()}),((t,n)=>{const r={observedAddresses:[]},s=null==n?t.len:t.pos+n;for(;t.pos<s;){const n=t.uint32();switch(n>>>3){case 1:r.type=e.Type.codec().decode(t);break;case 2:r.observedAddresses.push(t.bytes());break;default:t.skipType(7&n)}}return r}))),n),e.encode=t=>Kt(t,e.codec()),e.decode=t=>W(t,e.codec())}(Pw||(Pw={}));const xw=5e3,Nw=3,Mw=1,Ow=1;class Lw{started;timeout;retries;maxInboundStreams;maxOutboundStreams;peerStore;registrar;connectionManager;addressManager;transportManager;topologyId;log;constructor(e,t){this.log=e.logger.forComponent("libp2p:dcutr"),this.started=!1,this.peerStore=e.peerStore,this.registrar=e.registrar,this.addressManager=e.addressManager,this.connectionManager=e.connectionManager,this.transportManager=e.transportManager,this.timeout=t.timeout??xw,this.retries=t.retries??Nw,this.maxInboundStreams=t.maxInboundStreams??Mw,this.maxOutboundStreams=t.maxOutboundStreams??Ow}[Symbol.toStringTag]="@libp2p/dcutr";[En]=["@libp2p/identify"];isStarted(){return this.started}async start(){this.started||(this.topologyId=await this.registrar.register(Bw,{notifyOnTransient:!0,onConnect:(e,t)=>{t.transient&&"inbound"===t.direction&&this.upgradeInbound(t).catch((e=>{this.log.error("error during outgoing DCUtR attempt",e)}))}}),await this.registrar.handle(Bw,(e=>{this.handleIncomingUpgrade(e.stream,e.connection).catch((t=>{this.log.error("error during incoming DCUtR attempt",t),e.stream.abort(t)}))}),{maxInboundStreams:this.maxInboundStreams,maxOutboundStreams:this.maxOutboundStreams,runOnTransientConnection:!0}),this.started=!0)}async stop(){await this.registrar.unhandle(Bw),null!=this.topologyId&&this.registrar.unregister(this.topologyId),this.started=!1}async upgradeInbound(e){if(await this.attemptUnilateralConnectionUpgrade(e))return;let t;for(let n=0;n<this.retries;n++){const r={signal:AbortSignal.timeout(this.timeout)};try{t=await e.newStream([Bw],{signal:r.signal,runOnTransientConnection:!0});const n=Ew(t,{maxDataLength:4096}).pb(Pw);this.log("B sending connect to %p",e.remotePeer);const s=Date.now();await n.write({type:Pw.Type.CONNECT,observedAddresses:this.addressManager.getAddresses().map((e=>e.bytes))},r),this.log("B receiving connect from %p",e.remotePeer);const i=await n.read(r);if(i.type!==Pw.Type.CONNECT)throw this.log("A sent wrong message type"),new dn("DCUtR message type was incorrect",gn);const o=this.getDialableMultiaddrs(i.observedAddresses);if(0===o.length)throw this.log("A did not have any dialable multiaddrs"),new dn("DCUtR connect message had no multiaddrs",gn);const a=Date.now()-s;this.log("A sending sync, rtt %dms",a),await n.write({type:Pw.Type.SYNC,observedAddresses:[]},r),this.log("A waiting for half RTT"),await af(a/2),this.log("B dialing",o);const c=await this.connectionManager.openConnection(o,{signal:r.signal,priority:100});this.log("DCUtR to %p succeeded to address %a, closing relayed connection",e.remotePeer,c.remoteAddr),await e.close(r);break}catch(e){if(this.log.error("error while attempting DCUtR on attempt %d of %d",n+1,this.retries,e),t?.abort(e),n===this.retries)throw e}finally{null!=t&&await t.close(r)}}}async attemptUnilateralConnectionUpgrade(e){const t=(await this.peerStore.get(e.remotePeer)).addresses.map((t=>{const n=t.multiaddr;return null==n.getPeerId()?n.encapsulate(`/p2p/${e.remotePeer}`):n})).filter((e=>Cw(e,this.transportManager)));if(t.length>0){const n=AbortSignal.timeout(this.timeout);try{this.log("attempting unilateral connection upgrade to %a",t);const r=await this.connectionManager.openConnection(t,{signal:n,force:!0});if(r.transient)throw new Error("Could not open a new, non-transient, connection");return this.log("unilateral connection upgrade to %p succeeded via %a, closing relayed connection",e.remotePeer,r.remoteAddr),await e.close({signal:n}),!0}catch(n){this.log.error("unilateral connection upgrade to %p on addresses %a failed",e.remotePeer,t,n)}}else this.log("peer %p has no public addresses, not attempting unilateral connection upgrade",e.remotePeer);return!1}async handleIncomingUpgrade(e,t){const n={signal:AbortSignal.timeout(this.timeout)};try{const r=Ew(e,{maxDataLength:4096}).pb(Pw);this.log("A receiving connect");const s=await r.read(n);if(s.type!==Pw.Type.CONNECT)throw this.log("B sent wrong message type"),new dn("DCUtR message type was incorrect",gn);if(0===s.observedAddresses.length)throw this.log("B sent no multiaddrs"),new dn("DCUtR connect message had no multiaddrs",gn);const i=this.getDialableMultiaddrs(s.observedAddresses);if(0===i.length)throw this.log("B had no dialable multiaddrs"),new dn("DCUtR connect message had no dialable multiaddrs",gn);this.log("A sending connect"),await r.write({type:Pw.Type.CONNECT,observedAddresses:this.addressManager.getAddresses().map((e=>e.bytes))}),this.log("A receiving sync");if((await r.read(n)).type!==Pw.Type.SYNC)throw new dn("DCUtR message type was incorrect",gn);this.log("A dialing",i);const o=await this.connectionManager.openConnection(i,{signal:n.signal,priority:100,force:!0});this.log("DCUtR to %p succeeded via %a, closing relayed connection",t.remotePeer,o.remoteAddr),await t.close(n)}catch(n){this.log.error("incoming DCUtR from %p failed",t.remotePeer,n),e.abort(n)}finally{await e.close(n)}}getDialableMultiaddrs(e){const t=[];for(const n of e)if(null!=n&&0!==n.length)try{const e=or(n);if(!Cw(e,this.transportManager))continue;t.push(e)}catch{}return t}}const Bw="/libp2p/dcutr";function Uw(e={}){return t=>new Lw(t,e)}const Fw="ERR_INVALID_FRAME",Vw="ERR_UNREQUESTED_PING",Kw="ERR_NOT_MATCHING_PING",$w="ERR_STREAM_ALREADY_EXISTS",qw="ERR_DECODE_INVALID_VERSION",Hw="ERR_BOTH_CLIENTS",zw="ERR_RECV_WINDOW_EXCEEDED",Ww=new Set([Fw,Vw,Kw,$w,qw,Hw,zw]),jw="ERR_INVALID_CONFIG",Gw="ERR_MUXER_LOCAL_CLOSED",Yw="ERR_MUXER_REMOTE_CLOSED",Qw=262144,Jw={enableKeepAlive:!0,keepAliveInterval:3e4,maxInboundStreams:1e3,maxOutboundStreams:1e3,initialStreamWindowSize:Qw,maxStreamWindowSize:16777216,maxMessageSize:65536};var Zw,Xw;!function(e){e[e.Data=0]="Data",e[e.WindowUpdate=1]="WindowUpdate",e[e.Ping=2]="Ping",e[e.GoAway=3]="GoAway"}(Zw||(Zw={})),function(e){e[e.SYN=1]="SYN",e[e.ACK=2]="ACK",e[e.FIN=4]="FIN",e[e.RST=8]="RST"}(Xw||(Xw={})),Object.values(Xw).filter((e=>"string"!=typeof e));var eb;!function(e){e[e.NormalTermination=0]="NormalTermination",e[e.ProtocolError=1]="ProtocolError",e[e.InternalError=2]="InternalError"}(eb||(eb={}));const tb=2**24;class nb{source;buffer;frameInProgress;constructor(e){this.source=function(e){if(void 0!==e[Symbol.iterator]){const t=e[Symbol.iterator]();return t.return=void 0,{[Symbol.iterator]:()=>t}}if(void 0!==e[Symbol.asyncIterator]){const t=e[Symbol.asyncIterator]();return t.return=void 0,{[Symbol.asyncIterator]:()=>t}}throw new Error("a source must be either an iterable or an async iterable")}(e),this.buffer=new Sr,this.frameInProgress=!1}async*emitFrames(){for await(const e of this.source)for(this.buffer.append(e);;){const e=this.readHeader();if(void 0===e)break;const{type:t,length:n}=e;t===Zw.Data?(this.frameInProgress=!0,yield{header:e,readData:this.readBytes.bind(this,n)}):yield{header:e}}}readHeader(){if(this.frameInProgress)throw new dn("decoding frame already in progress","ERR_DECODE_IN_PROGRESS");if(this.buffer.length<12)return;const e=function(e){if(0!==e[0])throw new dn("Invalid frame version",qw);return{type:e[1],flag:(e[2]<<8)+e[3],streamID:e[4]*tb+(e[5]<<16)+(e[6]<<8)+e[7],length:e[8]*tb+(e[9]<<16)+(e[10]<<8)+e[11]}}(this.buffer.subarray(0,12));return this.buffer.consume(12),e}async readBytes(e){if(this.buffer.length<e)for await(const t of this.source)if(this.buffer.append(t),this.buffer.length>=e)break;const t=this.buffer.sublist(0,e);return this.buffer.consume(e),this.frameInProgress=!1,t}}function rb(e){const t=new Uint8Array(12);return t[1]=e.type,t[2]=e.flag>>>8,t[3]=e.flag,t[4]=e.streamID>>>24,t[5]=e.streamID>>>16,t[6]=e.streamID>>>8,t[7]=e.streamID,t[8]=e.length>>>24,t[9]=e.length>>>16,t[10]=e.length>>>8,t[11]=e.length,t}function sb(e){return null!=e?.then}function ib(e,t){let n=0;if(null!=e[Symbol.asyncIterator])return async function*(){for await(const r of e){const e=t(r,n++);sb(e)&&await e,yield r}}();const r=$r(e),{value:s,done:i}=r.next();if(!0===i)return function*(){}();const o=t(s,n++);if("function"==typeof o?.then)return async function*(){yield s;for await(const e of r){const r=t(e,n++);sb(r)&&await r,yield e}}();const a=t;return function*(){yield s;for(const e of r)a(e,n++),yield e}()}var ob;!function(e){e[e.Init=0]="Init",e[e.SYNSent=1]="SYNSent",e[e.SYNReceived=2]="SYNReceived",e[e.Established=3]="Established",e[e.Finished=4]="Finished"}(ob||(ob={}));class ab extends xm{name;state;config;_id;sendWindowCapacity;sendWindowCapacityUpdate;recvWindow;recvWindowCapacity;epochStart;getRTT;sendFrame;constructor(e){super({...e,onEnd:t=>{this.state=ob.Finished,e.onEnd?.(t)}}),this.config=e.config,this._id=parseInt(e.id,10),this.name=e.name,this.state=e.state,this.sendWindowCapacity=Qw,this.recvWindow=this.config.initialStreamWindowSize,this.recvWindowCapacity=this.recvWindow,this.epochStart=Date.now(),this.getRTT=e.getRTT,this.sendFrame=e.sendFrame,this.source=ib(this.source,(()=>{this.sendWindowUpdate()}))}async sendNewStream(){}async sendData(e,t={}){for(e=e.sublist();0!==e.byteLength;){if(0===this.sendWindowCapacity&&(this.log?.trace("wait for send window capacity, status %s",this.status),await this.waitForSendWindowCapacity(t),"closed"===this.status||"aborted"===this.status||"reset"===this.status))return void this.log?.trace("%s while waiting for send window capacity",this.status);const n=Math.min(this.sendWindowCapacity,this.config.maxMessageSize-12,e.length),r=this.getSendFlags();this.sendFrame({type:Zw.Data,flag:r,streamID:this._id,length:n},e.sublist(0,n)),this.sendWindowCapacity-=n,e.consume(n)}}async sendReset(){this.sendFrame({type:Zw.WindowUpdate,flag:Xw.RST,streamID:this._id,length:0})}async sendCloseWrite(){const e=this.getSendFlags()|Xw.FIN;this.sendFrame({type:Zw.WindowUpdate,flag:e,streamID:this._id,length:0})}async sendCloseRead(){}async waitForSendWindowCapacity(e={}){if(this.sendWindowCapacity>0)return;let t,n;const r=()=>{"open"===this.status||"closing"===this.status?n(new dn("stream aborted","ERR_STREAM_ABORT")):t()};e.signal?.addEventListener("abort",r);try{await new Promise(((e,r)=>{this.sendWindowCapacityUpdate=()=>{e()},n=r,t=e}))}finally{e.signal?.removeEventListener("abort",r)}}handleWindowUpdate(e){this.log?.trace("stream received window update id=%s",this._id),this.processFlags(e.flag);const t=this.sendWindowCapacity;this.sendWindowCapacity+=e.length,0===t&&e.length>0&&this.sendWindowCapacityUpdate?.()}async handleData(e,t){if(this.log?.trace("stream received data id=%s",this._id),this.processFlags(e.flag),this.recvWindowCapacity<e.length)throw new dn("receive window exceeded",zw,{available:this.recvWindowCapacity,recv:e.length});const n=await t();this.recvWindowCapacity-=e.length,this.sourcePush(n)}processFlags(e){(e&Xw.ACK)===Xw.ACK&&this.state===ob.SYNSent&&(this.state=ob.Established),(e&Xw.FIN)===Xw.FIN&&this.remoteCloseWrite(),(e&Xw.RST)===Xw.RST&&this.reset()}getSendFlags(){switch(this.state){case ob.Init:return this.state=ob.SYNSent,Xw.SYN;case ob.SYNReceived:return this.state=ob.Established,Xw.ACK;default:return 0}}sendWindowUpdate(){const e=this.getSendFlags(),t=Date.now(),n=this.getRTT();if(0===e&&n>-1&&t-this.epochStart<4*n&&(this.recvWindow=Math.min(2*this.recvWindow,this.config.maxStreamWindowSize)),this.recvWindowCapacity>=this.recvWindow&&0===e)return;const r=this.recvWindow-this.recvWindowCapacity;this.recvWindowCapacity=this.recvWindow,this.epochStart=t,this.sendFrame({type:Zw.WindowUpdate,flag:e,streamID:this._id,length:r})}}const cb="/yamux/1.0.0";class lb{protocol=cb;_components;_init;constructor(e,t={}){this._components=e,this._init=t}createStreamMuxer(e){return new ub(this._components,{...this._init,...e})}}class ub{protocol=cb;source;sink;config;log;logger;closeController;nextStreamID;_streams;nextPingID;activePing;rtt;client;localGoAway;remoteGoAway;numInboundStreams;numOutboundStreams;onIncomingStream;onStreamEnd;constructor(e,t){this.client="outbound"===t.direction,this.config={...Jw,...t},this.logger=e.logger,this.log=this.logger.forComponent("libp2p:yamux"),function(e){if(e.keepAliveInterval<=0)throw new dn("keep-alive interval must be positive",jw);if(e.maxInboundStreams<0)throw new dn("max inbound streams must be larger or equal 0",jw);if(e.maxOutboundStreams<0)throw new dn("max outbound streams must be larger or equal 0",jw);if(e.initialStreamWindowSize<Qw)throw new dn("InitialStreamWindowSize must be larger or equal 256 kB",jw);if(e.maxStreamWindowSize<e.initialStreamWindowSize)throw new dn("MaxStreamWindowSize must be larger than the InitialStreamWindowSize",jw);if(e.maxStreamWindowSize>2**32-1)throw new dn("MaxStreamWindowSize must be less than equal MAX_UINT32",jw);if(e.maxMessageSize<1024)throw new dn("MaxMessageSize must be greater than a kilobyte",jw)}(this.config),this.closeController=new AbortController,this.closeController.signal,this.onIncomingStream=t.onIncomingStream,this.onStreamEnd=t.onStreamEnd,this._streams=new Map,this.source=hr({onEnd:()=>{this.log?.trace("muxer source ended"),this._streams.forEach((e=>{e.destroy()}))}}),this.sink=async e=>{const t=()=>{const t=Pm(e);if(null!=t.return){const e=t.return();null!=(n=e)&&"function"==typeof n.then&&e.catch((e=>{this.log?.("could not cause sink source to return",e)}))}var n};let n,r;try{const r=new nb(e);try{this.closeController.signal.addEventListener("abort",t);for await(const e of r.emitFrames())await this.handleFrame(e.header,e.readData)}finally{this.closeController.signal.removeEventListener("abort",t)}n=eb.NormalTermination}catch(e){const t=e.code;Ww.has(t)?(this.log?.error("protocol error in sink",e),n=eb.ProtocolError):(this.log?.error("internal error in sink",e),n=eb.InternalError),r=e}this.log?.trace("muxer sink ended"),null!=r?this.abort(r,n):await this.close({reason:n})},this.numInboundStreams=0,this.numOutboundStreams=0,this.nextStreamID=this.client?1:2,this.nextPingID=0,this.rtt=-1,this.log?.trace("muxer created"),this.config.enableKeepAlive&&this.keepAliveLoop().catch((e=>this.log?.error("keepalive error: %s",e))),this.ping().catch((e=>this.log?.error("ping error: %s",e)))}get streams(){return Array.from(this._streams.values())}newStream(e){if(void 0!==this.remoteGoAway)throw new dn("muxer closed remotely",Yw);if(void 0!==this.localGoAway)throw new dn("muxer closed locally",Gw);const t=this.nextStreamID;if(this.nextStreamID+=2,this.numOutboundStreams>=this.config.maxOutboundStreams)throw new dn("max outbound streams exceeded","ERROR_MAX_OUTBOUND_STREAMS_EXCEEDED");this.log?.trace("new outgoing stream id=%s",t);const n=this._newStream(t,e,ob.Init,"outbound");return this._streams.set(t,n),this.numOutboundStreams++,n.sendWindowUpdate(),n}async ping(){if(void 0!==this.remoteGoAway)throw new dn("muxer closed remotely",Yw);if(void 0!==this.localGoAway)throw new dn("muxer closed locally",Gw);if(void 0===this.activePing){let e=()=>{};this.activePing={id:this.nextPingID++,promise:new Promise(((t,n)=>{const r=()=>{n(new dn("muxer closed locally",Gw))};this.closeController.signal.addEventListener("abort",r,{once:!0}),e=()=>{this.closeController.signal.removeEventListener("abort",r),t()}})),resolve:e};const t=Date.now();this.sendPing(this.activePing.id);try{await this.activePing.promise}finally{delete this.activePing}const n=Date.now();this.rtt=n-t}else await this.activePing.promise;return this.rtt}getRTT(){return this.rtt}async close(e={}){if(this.closeController.signal.aborted)return;const t=e?.reason??eb.NormalTermination;if(this.log?.trace("muxer close reason=%s",t),null==e.signal){const t=AbortSignal.timeout(500);e={...e,signal:t}}try{await Promise.all([...this._streams.values()].map((async t=>t.close(e)))),this.sendGoAway(t),this._closeMuxer()}catch(e){this.abort(e)}}abort(e,t){if(!this.closeController.signal.aborted){t=t??eb.InternalError,this.log?.error("muxer abort reason=%s error=%s",t,e);for(const t of this._streams.values())t.abort(e);this.sendGoAway(t),this._closeMuxer()}}isClosed(){return this.closeController.signal.aborted}_closeMuxer(){this.closeController.abort(),this.source.end()}_newStream(e,t,n,r){if(null!=this._streams.get(e))throw new dn("Stream already exists",$w,{id:e});const s=new ab({id:e.toString(),name:t,state:n,direction:r,sendFrame:this.sendFrame.bind(this),onEnd:()=>{this.closeStream(e),this.onStreamEnd?.(s)},log:this.logger.forComponent(`libp2p:yamux:${r}:${e}`),config:this.config,getRTT:this.getRTT.bind(this)});return s}closeStream(e){this.client===(e%2==0)?this.numInboundStreams--:this.numOutboundStreams--,this._streams.delete(e)}async keepAliveLoop(){const e=new Promise(((e,t)=>{this.closeController.signal.addEventListener("abort",t,{once:!0})}));for(this.log?.trace("muxer keepalive enabled interval=%s",this.config.keepAliveInterval);;){let t;try{await Promise.race([e,new Promise((e=>{t=setTimeout(e,this.config.keepAliveInterval)}))]),this.ping().catch((e=>this.log?.error("ping error: %s",e)))}catch(e){return void clearInterval(t)}}}async handleFrame(e,t){const{streamID:n,type:r,length:s}=e;if(this.log?.trace("received frame %o",e),0===n)switch(r){case Zw.Ping:return void this.handlePing(e);case Zw.GoAway:return void this.handleGoAway(s);default:throw new dn("Invalid frame type",Fw,{header:e})}else switch(e.type){case Zw.Data:case Zw.WindowUpdate:return void await this.handleStreamMessage(e,t);default:throw new dn("Invalid frame type",Fw,{header:e})}}handlePing(e){if(e.flag===Xw.SYN)this.log?.trace("received ping request pingId=%s",e.length),this.sendPing(e.length,Xw.ACK);else{if(e.flag!==Xw.ACK)throw new dn("Invalid frame flag",Fw,{header:e});this.log?.trace("received ping response pingId=%s",e.length),this.handlePingResponse(e.length)}}handlePingResponse(e){if(void 0===this.activePing)throw new dn("ping not requested",Vw);if(this.activePing.id!==e)throw new dn("ping doesn't match our id",Kw);this.activePing.resolve()}handleGoAway(e){this.log?.trace("received GoAway reason=%s",eb[e]??"unknown"),this.remoteGoAway=e;for(const e of this._streams.values())e.reset();this._closeMuxer()}async handleStreamMessage(e,t){const{streamID:n,flag:r,type:s}=e;(r&Xw.SYN)===Xw.SYN&&this.incomingStream(n);const i=this._streams.get(n);if(void 0!==i)switch(s){case Zw.WindowUpdate:return void i.handleWindowUpdate(e);case Zw.Data:if(void 0===t)throw new Error("unreachable");return void await i.handleData(e,t);default:throw new Error("unreachable")}else if(s===Zw.Data){if(this.log?.("discarding data for stream id=%s",n),void 0===t)throw new Error("unreachable");await t()}else this.log?.("frame for missing stream id=%s",n)}incomingStream(e){if(this.client!==(e%2==0))throw new dn("both endpoints are clients",Hw);if(this._streams.has(e))return;if(this.log?.trace("new incoming stream id=%s",e),void 0!==this.localGoAway)return void this.sendFrame({type:Zw.WindowUpdate,flag:Xw.RST,streamID:e,length:0});if(this.numInboundStreams>=this.config.maxInboundStreams)return this.log?.("maxIncomingStreams exceeded, forcing stream reset"),void this.sendFrame({type:Zw.WindowUpdate,flag:Xw.RST,streamID:e,length:0});const t=this._newStream(e,void 0,ob.SYNReceived,"inbound");this.numInboundStreams++,this._streams.set(e,t),this.onIncomingStream?.(t)}sendFrame(e,t){if(this.log?.trace("sending frame %o",e),e.type===Zw.Data){if(void 0===t)throw new dn("invalid frame",Fw);this.source.push(new Sr(rb(e),t))}else this.source.push(rb(e))}sendPing(e,t=Xw.SYN){t===Xw.SYN?this.log?.trace("sending ping request pingId=%s",e):this.log?.trace("sending ping response pingId=%s",e),this.sendFrame({type:Zw.Ping,flag:t,streamID:0,length:e})}sendGoAway(e=eb.NormalTermination){this.log?.("sending GoAway reason=%s",eb[e]),this.localGoAway=e,this.sendFrame({type:Zw.GoAway,flag:0,streamID:0,length:e})}}function hb(e={}){return t=>new lb(t,e)}function db(e=0){return null!=globalThis.Buffer?.alloc?(t=globalThis.Buffer.alloc(e),null!=globalThis.Buffer?new Uint8Array(t.buffer,t.byteOffset,t.byteLength):t):new Uint8Array(e);var t}var pb;!function(e){let t;e.codec=()=>(null==t&&(t=zt(((e,t,n={})=>{if(!1!==n.lengthDelimited&&t.fork(),null!=e.publicKey&&e.publicKey.byteLength>0&&(t.uint32(10),t.bytes(e.publicKey)),null!=e.addrs)for(const n of e.addrs)t.uint32(18),t.bytes(n);!1!==n.lengthDelimited&&t.ldelim()}),((e,t)=>{const n={publicKey:db(0),addrs:[]},r=null==t?e.len:e.pos+t;for(;e.pos<r;){const t=e.uint32();switch(t>>>3){case 1:n.publicKey=e.bytes();break;case 2:n.addrs.push(e.bytes());break;default:e.skipType(7&t)}}return n}))),t),e.encode=t=>Kt(t,e.codec()),e.decode=t=>W(t,e.codec())}(pb||(pb={}));class fb extends mn{[tn]=!0;[Symbol.toStringTag]="@libp2p/pubsub-peer-discovery";interval;listenOnly;topics;intervalId;components;log;constructor(e,t={}){super();const{interval:n,topics:r,listenOnly:s}=t;this.components=e,this.interval=n??1e4,this.listenOnly=s??!1,this.log=e.logger.forComponent("libp2p:discovery:pubsub"),Array.isArray(r)&&r.length>0?this.topics=r:this.topics=["_peer-discovery._p2p._pubsub"],this._onMessage=this._onMessage.bind(this)}isStarted(){return null!=this.intervalId}start(){}afterStart(){if(null!=this.intervalId)return;const e=this.components.pubsub;if(null==e)throw new Error("PubSub not configured");for(const t of this.topics)e.subscribe(t),e.addEventListener("message",this._onMessage);this.listenOnly||(this._broadcast(),this.intervalId=setInterval((()=>{this._broadcast()}),this.interval))}beforeStop(){const e=this.components.pubsub;if(null==e)throw new Error("PubSub not configured");for(const t of this.topics)e.unsubscribe(t),e.removeEventListener("message",this._onMessage)}stop(){null!=this.intervalId&&(clearInterval(this.intervalId),this.intervalId=void 0)}_broadcast(){const e=this.components.peerId;if(null==e.publicKey)throw new Error("PeerId was missing public key");const t={publicKey:e.publicKey,addrs:this.components.addressManager.getAddresses().map((e=>e.bytes))},n=pb.encode(t),r=this.components.pubsub;if(null==r)throw new Error("PubSub not configured");for(const e of this.topics)0!==r.getSubscribers(e).length?(this.log("broadcasting our peer data on topic %s",e),r.publish(e,n)):this.log("skipping broadcasting our peer data on topic %s because there are no peers present",e)}_onMessage(e){if(!this.isStarted())return;const t=e.detail;if(!this.topics.includes(t.topic))return;const n=pb.decode(t.data);Es(n.publicKey).then((e=>{e.equals(this.components.peerId)||(this.log("discovered peer %p on %s",e,t.topic),this.safeDispatchEvent("peer",{detail:{id:e,multiaddrs:n.addrs.map((e=>or(e)))}}))})).catch((e=>{this.log.error(e)}))}}function gb(e={}){return t=>new fb(t,e)}const mb="circuit-relay-relay";BigInt(1<<17);const yb="/libp2p/circuit/relay/0.2.0/hop",wb="/libp2p/circuit/relay/0.2.0/stop",bb="ERR_RELAYED_DIAL";var vb,Eb,Sb,_b,Ib,Rb,Ab,Tb;function Db(e){const t=e*BigInt(1e3),n=(new Date).getTime();return Number(t-BigInt(n))}!function(e){let t,n;!function(e){e.RESERVE="RESERVE",e.CONNECT="CONNECT",e.STATUS="STATUS"}(e.Type||(e.Type={})),function(e){e[e.RESERVE=0]="RESERVE",e[e.CONNECT=1]="CONNECT",e[e.STATUS=2]="STATUS"}(t||(t={})),function(e){e.codec=()=>Ht(t)}(e.Type||(e.Type={})),e.codec=()=>(null==n&&(n=zt(((t,n,r={})=>{!1!==r.lengthDelimited&&n.fork(),null!=t.type&&(n.uint32(8),e.Type.codec().encode(t.type,n)),null!=t.peer&&(n.uint32(18),Sb.codec().encode(t.peer,n)),null!=t.reservation&&(n.uint32(26),_b.codec().encode(t.reservation,n)),null!=t.limit&&(n.uint32(34),Ib.codec().encode(t.limit,n)),null!=t.status&&(n.uint32(40),Rb.codec().encode(t.status,n)),!1!==r.lengthDelimited&&n.ldelim()}),((t,n)=>{const r={},s=null==n?t.len:t.pos+n;for(;t.pos<s;){const n=t.uint32();switch(n>>>3){case 1:r.type=e.Type.codec().decode(t);break;case 2:r.peer=Sb.codec().decode(t,t.uint32());break;case 3:r.reservation=_b.codec().decode(t,t.uint32());break;case 4:r.limit=Ib.codec().decode(t,t.uint32());break;case 5:r.status=Rb.codec().decode(t);break;default:t.skipType(7&n)}}return r}))),n),e.encode=t=>Kt(t,e.codec()),e.decode=t=>W(t,e.codec())}(vb||(vb={})),function(e){let t,n;!function(e){e.CONNECT="CONNECT",e.STATUS="STATUS"}(e.Type||(e.Type={})),function(e){e[e.CONNECT=0]="CONNECT",e[e.STATUS=1]="STATUS"}(t||(t={})),function(e){e.codec=()=>Ht(t)}(e.Type||(e.Type={})),e.codec=()=>(null==n&&(n=zt(((t,n,r={})=>{!1!==r.lengthDelimited&&n.fork(),null!=t.type&&(n.uint32(8),e.Type.codec().encode(t.type,n)),null!=t.peer&&(n.uint32(18),Sb.codec().encode(t.peer,n)),null!=t.limit&&(n.uint32(26),Ib.codec().encode(t.limit,n)),null!=t.status&&(n.uint32(32),Rb.codec().encode(t.status,n)),!1!==r.lengthDelimited&&n.ldelim()}),((t,n)=>{const r={},s=null==n?t.len:t.pos+n;for(;t.pos<s;){const n=t.uint32();switch(n>>>3){case 1:r.type=e.Type.codec().decode(t);break;case 2:r.peer=Sb.codec().decode(t,t.uint32());break;case 3:r.limit=Ib.codec().decode(t,t.uint32());break;case 4:r.status=Rb.codec().decode(t);break;default:t.skipType(7&n)}}return r}))),n),e.encode=t=>Kt(t,e.codec()),e.decode=t=>W(t,e.codec())}(Eb||(Eb={})),function(e){let t;e.codec=()=>(null==t&&(t=zt(((e,t,n={})=>{if(!1!==n.lengthDelimited&&t.fork(),null!=e.id&&e.id.byteLength>0&&(t.uint32(10),t.bytes(e.id)),null!=e.addrs)for(const n of e.addrs)t.uint32(18),t.bytes(n);!1!==n.lengthDelimited&&t.ldelim()}),((e,t)=>{const n={id:new Uint8Array(0),addrs:[]},r=null==t?e.len:e.pos+t;for(;e.pos<r;){const t=e.uint32();switch(t>>>3){case 1:n.id=e.bytes();break;case 2:n.addrs.push(e.bytes());break;default:e.skipType(7&t)}}return n}))),t),e.encode=t=>Kt(t,e.codec()),e.decode=t=>W(t,e.codec())}(Sb||(Sb={})),function(e){let t;e.codec=()=>(null==t&&(t=zt(((e,t,n={})=>{if(!1!==n.lengthDelimited&&t.fork(),null!=e.expire&&0n!==e.expire&&(t.uint32(8),t.uint64(e.expire)),null!=e.addrs)for(const n of e.addrs)t.uint32(18),t.bytes(n);null!=e.voucher&&(t.uint32(26),t.bytes(e.voucher)),!1!==n.lengthDelimited&&t.ldelim()}),((e,t)=>{const n={expire:0n,addrs:[]},r=null==t?e.len:e.pos+t;for(;e.pos<r;){const t=e.uint32();switch(t>>>3){case 1:n.expire=e.uint64();break;case 2:n.addrs.push(e.bytes());break;case 3:n.voucher=e.bytes();break;default:e.skipType(7&t)}}return n}))),t),e.encode=t=>Kt(t,e.codec()),e.decode=t=>W(t,e.codec())}(_b||(_b={})),function(e){let t;e.codec=()=>(null==t&&(t=zt(((e,t,n={})=>{!1!==n.lengthDelimited&&t.fork(),null!=e.duration&&(t.uint32(8),t.uint32(e.duration)),null!=e.data&&(t.uint32(16),t.uint64(e.data)),!1!==n.lengthDelimited&&t.ldelim()}),((e,t)=>{const n={},r=null==t?e.len:e.pos+t;for(;e.pos<r;){const t=e.uint32();switch(t>>>3){case 1:n.duration=e.uint32();break;case 2:n.data=e.uint64();break;default:e.skipType(7&t)}}return n}))),t),e.encode=t=>Kt(t,e.codec()),e.decode=t=>W(t,e.codec())}(Ib||(Ib={})),function(e){e.UNUSED="UNUSED",e.OK="OK",e.RESERVATION_REFUSED="RESERVATION_REFUSED",e.RESOURCE_LIMIT_EXCEEDED="RESOURCE_LIMIT_EXCEEDED",e.PERMISSION_DENIED="PERMISSION_DENIED",e.CONNECTION_FAILED="CONNECTION_FAILED",e.NO_RESERVATION="NO_RESERVATION",e.MALFORMED_MESSAGE="MALFORMED_MESSAGE",e.UNEXPECTED_MESSAGE="UNEXPECTED_MESSAGE"}(Rb||(Rb={})),function(e){e[e.UNUSED=0]="UNUSED",e[e.OK=100]="OK",e[e.RESERVATION_REFUSED=200]="RESERVATION_REFUSED",e[e.RESOURCE_LIMIT_EXCEEDED=201]="RESOURCE_LIMIT_EXCEEDED",e[e.PERMISSION_DENIED=202]="PERMISSION_DENIED",e[e.CONNECTION_FAILED=203]="CONNECTION_FAILED",e[e.NO_RESERVATION=204]="NO_RESERVATION",e[e.MALFORMED_MESSAGE=400]="MALFORMED_MESSAGE",e[e.UNEXPECTED_MESSAGE=401]="UNEXPECTED_MESSAGE"}(Ab||(Ab={})),function(e){e.codec=()=>Ht(Ab)}(Rb||(Rb={})),function(e){let t;e.codec=()=>(null==t&&(t=zt(((e,t,n={})=>{!1!==n.lengthDelimited&&t.fork(),null!=e.relay&&e.relay.byteLength>0&&(t.uint32(10),t.bytes(e.relay)),null!=e.peer&&e.peer.byteLength>0&&(t.uint32(18),t.bytes(e.peer)),null!=e.expiration&&0n!==e.expiration&&(t.uint32(24),t.uint64(e.expiration)),!1!==n.lengthDelimited&&t.ldelim()}),((e,t)=>{const n={relay:new Uint8Array(0),peer:new Uint8Array(0),expiration:0n},r=null==t?e.len:e.pos+t;for(;e.pos<r;){const t=e.uint32();switch(t>>>3){case 1:n.relay=e.bytes();break;case 2:n.peer=e.bytes();break;case 3:n.expiration=e.uint64();break;default:e.skipType(7&t)}}return n}))),t),e.encode=t=>Kt(t,e.codec()),e.decode=t=>W(t,e.codec())}(Tb||(Tb={}));class kb extends mn{peerId;peerStore;contentRouting;registrar;started;topologyId;log;constructor(e){super(),this.log=e.logger.forComponent("libp2p:circuit-relay:discover-relays"),this.started=!1,this.peerId=e.peerId,this.peerStore=e.peerStore,this.contentRouting=e.contentRouting,this.registrar=e.registrar}isStarted(){return this.started}async start(){this.topologyId=await this.registrar.register(yb,{notifyOnTransient:!0,onConnect:e=>{this.safeDispatchEvent("relay:discover",{detail:e})}}),this.started=!0}afterStart(){this.discover().catch((e=>{this.log.error("error discovering relays",e)}))}stop(){null!=this.topologyId&&this.registrar.unregister(this.topologyId),this.started=!1}async discover(){this.log("searching peer store for relays");const e=await this.peerStore.all({filters:[e=>e.protocols.includes(yb)],orders:[()=>Math.random()<.5?1:-1]});for(const t of e)this.log("found relay peer %p in content peer store",t.id),this.safeDispatchEvent("relay:discover",{detail:t.id});this.log("found %d relay peers in peer store",e.length);try{this.log("searching content routing for relays");const e=await async function(e){const t=(new TextEncoder).encode(e),n=await pt.digest(t);return yt.createV0(n)}("/libp2p/relay");let t=0;for await(const n of this.contentRouting.findProviders(e))if(n.multiaddrs.length>0&&!n.id.equals(this.peerId)){const e=n.id;t++,await this.peerStore.merge(e,{multiaddrs:n.multiaddrs}),this.log("found relay peer %p in content routing",e),this.safeDispatchEvent("relay:discover",{detail:e})}this.log("found %d relay peers in content routing",t)}catch(e){this.log.error("failed when finding relays on the network",e)}}}class Pb extends mn{peerId;connectionManager;transportManager;peerStore;events;reserveQueue;reservations;maxDiscoveredRelays;maxReservationQueueLength;reservationCompletionTimeout;started;log;constructor(e,t){super(),this.log=e.logger.forComponent("libp2p:circuit-relay:transport:reservation-store"),this.peerId=e.peerId,this.connectionManager=e.connectionManager,this.transportManager=e.transportManager,this.peerStore=e.peerStore,this.events=e.events,this.reservations=new Kh,this.maxDiscoveredRelays=t?.discoverRelays??0,this.maxReservationQueueLength=t?.maxReservationQueueLength??100,this.reservationCompletionTimeout=t?.reservationCompletionTimeout??1e4,this.started=!1,this.reserveQueue=new mf({concurrency:t?.reservationConcurrency??1,metricName:"libp2p_relay_reservation_queue",metrics:e.metrics}),this.events.addEventListener("peer:disconnect",(e=>{this.#B(e.detail)}))}isStarted(){return this.started}start(){this.started=!0}stop(){this.reserveQueue.clear(),this.reservations.forEach((({timeout:e})=>{clearTimeout(e)})),this.reservations.clear(),this.started=!1}async addRelay(e,t){this.peerId.equals(e)?this.log("not trying to use self as relay"):this.reserveQueue.size>this.maxReservationQueueLength?this.log("not adding relay as the queue is full"):this.reserveQueue.has(e)?this.log("relay peer is already in the reservation queue"):(this.log("add relay %p",e),await this.reserveQueue.add((async()=>{try{const n=this.reservations.get(e);if(null!=n){if(Db(n.reservation.expire)>6e5)return void this.log("already have reservation on relay peer %p and it expires in more than 10 minutes",e);clearTimeout(n.timeout),this.reservations.delete(e)}if("discovered"===t&&[...this.reservations.values()].reduce(((e,t)=>("discovered"===t.type&&e++,e)),0)>=this.maxDiscoveredRelays)return void this.log("already have enough discovered relays");const r=AbortSignal.timeout(this.reservationCompletionTimeout),s=await this.connectionManager.openConnection(e,{signal:r});if(s.remoteAddr.protoNames().includes("p2p-circuit"))return void this.log("not creating reservation over relayed connection");const i=await this.#U(s,{signal:r});this.log("created reservation on relay peer %p",e);const o=Db(i.expire),a=Math.min(Math.max(o-3e5,3e4),Math.pow(2,31)-1),c=setTimeout((()=>{this.addRelay(e,t).catch((t=>{this.log.error("could not refresh reservation to relay %p",e,t)}))}),a);this.reservations.set(e,{timeout:c,reservation:i,type:t}),await this.peerStore.merge(e,{tags:{[mb]:{value:1,ttl:o}}}),await this.transportManager.listen([or(`/p2p/${e.toString()}/p2p-circuit`)])}catch(t){this.log.error("could not reserve slot on %p",e,t);const n=this.reservations.get(e);null!=n&&clearTimeout(n.timeout),this.reservations.delete(e)}}),{peerId:e}))}hasReservation(e){return this.reservations.has(e)}getReservation(e){return this.reservations.get(e)?.reservation}async#U(e,t){t.signal?.throwIfAborted(),this.log("requesting reservation from %p",e.remotePeer);const n=await e.newStream(yb,t),r=Ew(n).pb(vb);let s;await r.write({type:vb.Type.RESERVE},t);try{s=await r.read(t)}catch(t){throw this.log.error("error parsing reserve message response from %p because",e.remotePeer,t),n.abort(t),t}finally{await n.close()}if(s.status===Rb.OK&&null!=s.reservation){let t=!1;const n=e.remoteAddr.bytes;for(const e of s.reservation.addrs)if(Sn(n,e)){t=!0;break}return t||s.reservation.addrs.push(n),s.reservation}const i=`reservation failed with status ${s.status??"undefined"}`;throw this.log.error(i),new Error(i)}#B(e){const t=this.reservations.get(e);null!=t&&(this.log("connection to relay %p closed, removing reservation from local store",e),clearTimeout(t.timeout),this.reservations.delete(e),this.safeDispatchEvent("relay:removed",{detail:e}),this.reservations.size<this.maxDiscoveredRelays&&(this.log("not enough relays %d/%d",this.reservations.size,this.maxDiscoveredRelays),this.safeDispatchEvent("relay:not-enough-relays",{})))}}function Cb(e){const{stream:t,remoteAddr:n,logger:r}=e,s=r.forComponent("libp2p:stream:converter");let i=!1,o=!1;const a=t.close.bind(t);t.close=async e=>{await a(e),h(!0)};const c=t.abort.bind(t);t.abort=e=>{c(e),h(!0)};const l=t.sink.bind(t);t.sink=async e=>{try{await l(e)}catch(e){"aborted"!==e.type&&s.error("%s error in sink",n,e)}finally{o=!0,h()}};const u={log:s,sink:t.sink,source:async function*(){try{for await(const e of t.source)e instanceof Uint8Array?yield e:yield*e}finally{i=!0,h()}}(),remoteAddr:n,timeline:{open:Date.now(),close:void 0},close:t.close,abort:t.abort};function h(e){!0===e&&(i=!0,o=!0),i&&o&&null==u.timeline.close&&(u.timeline.close=Date.now())}return u}class xb extends mn{connectionManager;relayStore;listeningAddrs;log;constructor(e){super(),this.log=e.logger.forComponent("libp2p:circuit-relay:transport:listener"),this.connectionManager=e.connectionManager,this.relayStore=e.relayStore,this.listeningAddrs=new Kh,this.relayStore.addEventListener("relay:removed",this._onRemoveRelayPeer)}_onRemoveRelayPeer=e=>{this.#F(e.detail)};async listen(e){this.log("listen on %a",e);const t=e.decapsulate("/p2p-circuit"),n=await this.connectionManager.openConnection(t);if(!this.relayStore.hasReservation(n.remotePeer))return this.log("making reservation on peer %p",n.remotePeer),void await this.relayStore.addRelay(n.remotePeer,"configured");const r=this.relayStore.getReservation(n.remotePeer);if(null==r)throw new dn("Did not have reservation after making reservation","ERR_NO_RESERVATION");this.listeningAddrs.has(n.remotePeer)?this.log("already listening on relay %p",n.remotePeer):(this.listeningAddrs.set(n.remotePeer,r.addrs.map((e=>or(e).encapsulate("/p2p-circuit")))),this.safeDispatchEvent("listening",{}))}getAddrs(){return[...this.listeningAddrs.values()].flat()}async close(){}#F(e){const t=this.listeningAddrs.has(e);this.log("relay peer removed %p - had reservation",e,t),this.listeningAddrs.delete(e),t&&(this.log.trace("removing relay event listener for peer %p",e),this.relayStore.removeEventListener("relay:removed",this._onRemoveRelayPeer),this.safeDispatchEvent("close",{}))}}const Nb=300,Mb=300,Ob=3e4;class Lb{discovery;registrar;peerStore;connectionManager;transportManager;peerId;upgrader;addressManager;connectionGater;reservationStore;logger;maxInboundStopStreams;maxOutboundStopStreams;stopTimeout;started;log;constructor(e,t){this.log=e.logger.forComponent("libp2p:circuit-relay:transport"),this.registrar=e.registrar,this.peerStore=e.peerStore,this.connectionManager=e.connectionManager,this.transportManager=e.transportManager,this.logger=e.logger,this.peerId=e.peerId,this.upgrader=e.upgrader,this.addressManager=e.addressManager,this.connectionGater=e.connectionGater,this.maxInboundStopStreams=t.maxInboundStopStreams??Nb,this.maxOutboundStopStreams=t.maxOutboundStopStreams??Mb,this.stopTimeout=t.stopTimeout??Ob,null!=t.discoverRelays&&t.discoverRelays>0&&(this.discovery=new kb(e),this.discovery.addEventListener("relay:discover",(e=>{this.reservationStore.addRelay(e.detail,"discovered").catch((t=>{this.log.error("could not add discovered relay %p",e.detail,t)}))}))),this.reservationStore=new Pb(e,t),this.reservationStore.addEventListener("relay:not-enough-relays",(()=>{this.discovery?.discover().catch((e=>{this.log.error("could not discover relays",e)}))})),this.started=!1}isStarted(){return this.started}async start(){this.reservationStore.start(),await this.registrar.handle(wb,(e=>{this.onStop(e).catch((t=>{this.log.error("error while handling STOP protocol",t),e.stream.abort(t)}))}),{maxInboundStreams:this.maxInboundStopStreams,maxOutboundStreams:this.maxOutboundStopStreams,runOnTransientConnection:!0}),await(this.discovery?.start()),this.started=!0}afterStart(){this.discovery?.afterStart()}async stop(){this.discovery?.stop(),this.reservationStore.stop(),await this.registrar.unhandle(wb),this.started=!1}[ln]=!0;[Symbol.toStringTag]="libp2p/circuit-relay-v2";async dial(e,t={}){if(1!==e.protoCodes().filter((e=>290===e)).length){const t="Invalid circuit relay address";throw this.log.error(t,e),new dn(t,bb)}const n=e.toString().split("/p2p-circuit"),r=or(n[0]),s=or(n[n.length-1]),i=r.getPeerId(),o=s.getPeerId();if(null==i||null==o){const t=`Circuit relay dial to ${e.toString()} failed as address did not have peer ids`;throw this.log.error(t),new dn(t,bb)}const a=bs(i),c=bs(o);let l=!1;let u,h=this.connectionManager.getConnections(a)[0];null==h&&(await this.peerStore.merge(a,{multiaddrs:[r]}),h=await this.connectionManager.openConnection(a,t),l=!0);try{return u=await h.newStream(yb),await this.connectV2({stream:u,connection:h,destinationPeer:c,destinationAddr:s,relayAddr:r,ma:e,disconnectOnFailure:l})}catch(e){throw this.log.error("circuit relay dial to destination %p via relay %p failed",c,a,e),null!=u&&u.abort(e),l&&await h.close(),e}}async connectV2({stream:e,connection:t,destinationPeer:n,destinationAddr:r,relayAddr:s,ma:i,disconnectOnFailure:o}){try{const t=Ew(e),o=t.pb(vb);await o.write({type:vb.Type.CONNECT,peer:{id:n.toBytes(),addrs:[or(r).bytes]}});const a=await o.read();if(a.status!==Rb.OK)throw new dn(`failed to connect via relay with status ${a?.status?.toString()??"undefined"}`,"ERR_HOP_REQUEST_FAILED");const c=Cb({stream:t.unwrap(),remoteAddr:i,localAddr:s.encapsulate(`/p2p-circuit/p2p/${this.peerId.toString()}`),logger:this.logger});return this.log("new outbound transient connection %a",c.remoteAddr),await this.upgrader.upgradeOutbound(c,{transient:!0})}catch(e){throw this.log.error(`Circuit relay dial to destination ${n.toString()} via relay ${t.remotePeer.toString()} failed`,e),o&&await t.close(),e}}createListener(e){return function(e){return new xb(e)}({connectionManager:this.connectionManager,relayStore:this.reservationStore,logger:this.logger})}listenFilter(e){return(e=Array.isArray(e)?e:[e]).filter((e=>Ky.matches(e)))}dialFilter(e){return this.listenFilter(e)}async onStop({connection:e,stream:t}){if(!this.reservationStore.hasReservation(e.remotePeer))try{this.log("dialed via relay we did not have a reservation on, start listening on that relay address"),await this.transportManager.listen([e.remoteAddr.encapsulate("/p2p-circuit")])}catch(e){this.log.error("failed to listen on a relay peer we were dialed via but did not have a reservation on",e)}const n=AbortSignal.timeout(this.stopTimeout),r=Ew(t).pb(Eb),s=await r.read({signal:n});if(this.log("new circuit relay v2 stop stream from %p with type %s",e.remotePeer,s.type),void 0===s?.type)return this.log.error("type was missing from circuit v2 stop protocol request from %s",e.remotePeer),await r.write({type:Eb.Type.STATUS,status:Rb.MALFORMED_MESSAGE},{signal:n}),void await t.close();if(s.type!==Eb.Type.CONNECT)return this.log.error("invalid stop connect request via peer %p",e.remotePeer),await r.write({type:Eb.Type.STATUS,status:Rb.UNEXPECTED_MESSAGE},{signal:n}),void await t.close();if(!(e=>{if(null==e.peer)return!1;try{e.peer.addrs.forEach(or)}catch{return!1}return!0})(s))return this.log.error("invalid stop connect request via peer %p",e.remotePeer),await r.write({type:Eb.Type.STATUS,status:Rb.MALFORMED_MESSAGE},{signal:n}),void await t.close();const i=vs(s.peer.id);if(!0===await(this.connectionGater.denyInboundRelayedConnection?.(e.remotePeer,i)))return this.log.error("connection gater denied inbound relayed connection from %p",e.remotePeer),await r.write({type:Eb.Type.STATUS,status:Rb.PERMISSION_DENIED},{signal:n}),void await t.close();this.log.trace("sending success response to %p",e.remotePeer),await r.write({type:Eb.Type.STATUS,status:Rb.OK},{signal:n});const o=e.remoteAddr.encapsulate(`/p2p-circuit/p2p/${i.toString()}`),a=this.addressManager.getAddresses()[0],c=Cb({stream:r.unwrap().unwrap(),remoteAddr:o,localAddr:a,logger:this.logger});this.log("new inbound transient connection %a",c.remoteAddr),await this.upgrader.upgradeInbound(c,{transient:!0}),this.log("%s connection %a upgraded","inbound",c.remoteAddr)}}function Bb(e={}){return t=>new Lb(t,e)}const Ub="/floodsub/1.0.0",Fb="/meshsub/1.0.0",Vb="/meshsub/1.1.0",Kb=5e3,$b={maxSubscriptions:1/0,maxMessages:1/0,maxIhaveMessageIDs:1/0,maxIwantMessageIDs:1/0,maxControlMessages:1/0,maxPeerInfos:1/0};var qb,Hb,zb,Wb,jb,Gb,Yb,Qb,Jb,Zb,Xb,ev;!function(e){let t;!function(e){let t;e.codec=()=>(null==t&&(t=zt(((e,t,n={})=>{!1!==n.lengthDelimited&&t.fork(),null!=e.subscribe&&(t.uint32(8),t.bool(e.subscribe)),null!=e.topic&&(t.uint32(18),t.string(e.topic)),!1!==n.lengthDelimited&&t.ldelim()}),((e,t,n={})=>{const r={},s=null==t?e.len:e.pos+t;for(;e.pos<s;){const t=e.uint32();switch(t>>>3){case 1:r.subscribe=e.bool();break;case 2:r.topic=e.string();break;default:e.skipType(7&t)}}return r}))),t),e.encode=t=>Kt(t,e.codec()),e.decode=(t,n)=>W(t,e.codec(),n)}(e.SubOpts||(e.SubOpts={})),function(e){let t;e.codec=()=>(null==t&&(t=zt(((e,t,n={})=>{!1!==n.lengthDelimited&&t.fork(),null!=e.from&&(t.uint32(10),t.bytes(e.from)),null!=e.data&&(t.uint32(18),t.bytes(e.data)),null!=e.seqno&&(t.uint32(26),t.bytes(e.seqno)),null!=e.topic&&""!==e.topic&&(t.uint32(34),t.string(e.topic)),null!=e.signature&&(t.uint32(42),t.bytes(e.signature)),null!=e.key&&(t.uint32(50),t.bytes(e.key)),!1!==n.lengthDelimited&&t.ldelim()}),((e,t,n={})=>{const r={topic:""},s=null==t?e.len:e.pos+t;for(;e.pos<s;){const t=e.uint32();switch(t>>>3){case 1:r.from=e.bytes();break;case 2:r.data=e.bytes();break;case 3:r.seqno=e.bytes();break;case 4:r.topic=e.string();break;case 5:r.signature=e.bytes();break;case 6:r.key=e.bytes();break;default:e.skipType(7&t)}}return r}))),t),e.encode=t=>Kt(t,e.codec()),e.decode=(t,n)=>W(t,e.codec(),n)}(e.Message||(e.Message={})),function(t){let n;t.codec=()=>(null==n&&(n=zt(((t,n,r={})=>{if(!1!==r.lengthDelimited&&n.fork(),null!=t.ihave)for(const r of t.ihave)n.uint32(10),e.ControlIHave.codec().encode(r,n);if(null!=t.iwant)for(const r of t.iwant)n.uint32(18),e.ControlIWant.codec().encode(r,n);if(null!=t.graft)for(const r of t.graft)n.uint32(26),e.ControlGraft.codec().encode(r,n);if(null!=t.prune)for(const r of t.prune)n.uint32(34),e.ControlPrune.codec().encode(r,n);!1!==r.lengthDelimited&&n.ldelim()}),((t,n,r={})=>{const s={ihave:[],iwant:[],graft:[],prune:[]},i=null==n?t.len:t.pos+n;for(;t.pos<i;){const n=t.uint32();switch(n>>>3){case 1:if(null!=r.limits?.ihave&&s.ihave.length===r.limits.ihave)throw new Wt('decode error - map field "ihave" had too many elements',"ERR_MAX_LENGTH");s.ihave.push(e.ControlIHave.codec().decode(t,t.uint32()));break;case 2:if(null!=r.limits?.iwant&&s.iwant.length===r.limits.iwant)throw new Wt('decode error - map field "iwant" had too many elements',"ERR_MAX_LENGTH");s.iwant.push(e.ControlIWant.codec().decode(t,t.uint32()));break;case 3:if(null!=r.limits?.graft&&s.graft.length===r.limits.graft)throw new Wt('decode error - map field "graft" had too many elements',"ERR_MAX_LENGTH");s.graft.push(e.ControlGraft.codec().decode(t,t.uint32()));break;case 4:if(null!=r.limits?.prune&&s.prune.length===r.limits.prune)throw new Wt('decode error - map field "prune" had too many elements',"ERR_MAX_LENGTH");s.prune.push(e.ControlPrune.codec().decode(t,t.uint32()));break;default:t.skipType(7&n)}}return s}))),n),t.encode=e=>Kt(e,t.codec()),t.decode=(e,n)=>W(e,t.codec(),n)}(e.ControlMessage||(e.ControlMessage={})),function(e){let t;e.codec=()=>(null==t&&(t=zt(((e,t,n={})=>{if(!1!==n.lengthDelimited&&t.fork(),null!=e.topicID&&(t.uint32(10),t.string(e.topicID)),null!=e.messageIDs)for(const n of e.messageIDs)t.uint32(18),t.bytes(n);!1!==n.lengthDelimited&&t.ldelim()}),((e,t,n={})=>{const r={messageIDs:[]},s=null==t?e.len:e.pos+t;for(;e.pos<s;){const t=e.uint32();switch(t>>>3){case 1:r.topicID=e.string();break;case 2:if(null!=n.limits?.messageIDs&&r.messageIDs.length===n.limits.messageIDs)throw new Wt('decode error - map field "messageIDs" had too many elements',"ERR_MAX_LENGTH");r.messageIDs.push(e.bytes());break;default:e.skipType(7&t)}}return r}))),t),e.encode=t=>Kt(t,e.codec()),e.decode=(t,n)=>W(t,e.codec(),n)}(e.ControlIHave||(e.ControlIHave={})),function(e){let t;e.codec=()=>(null==t&&(t=zt(((e,t,n={})=>{if(!1!==n.lengthDelimited&&t.fork(),null!=e.messageIDs)for(const n of e.messageIDs)t.uint32(10),t.bytes(n);!1!==n.lengthDelimited&&t.ldelim()}),((e,t,n={})=>{const r={messageIDs:[]},s=null==t?e.len:e.pos+t;for(;e.pos<s;){const t=e.uint32();if(t>>>3==1){if(null!=n.limits?.messageIDs&&r.messageIDs.length===n.limits.messageIDs)throw new Wt('decode error - map field "messageIDs" had too many elements',"ERR_MAX_LENGTH");r.messageIDs.push(e.bytes())}else e.skipType(7&t)}return r}))),t),e.encode=t=>Kt(t,e.codec()),e.decode=(t,n)=>W(t,e.codec(),n)}(e.ControlIWant||(e.ControlIWant={})),function(e){let t;e.codec=()=>(null==t&&(t=zt(((e,t,n={})=>{!1!==n.lengthDelimited&&t.fork(),null!=e.topicID&&(t.uint32(10),t.string(e.topicID)),!1!==n.lengthDelimited&&t.ldelim()}),((e,t,n={})=>{const r={},s=null==t?e.len:e.pos+t;for(;e.pos<s;){const t=e.uint32();if(t>>>3==1)r.topicID=e.string();else e.skipType(7&t)}return r}))),t),e.encode=t=>Kt(t,e.codec()),e.decode=(t,n)=>W(t,e.codec(),n)}(e.ControlGraft||(e.ControlGraft={})),function(t){let n;t.codec=()=>(null==n&&(n=zt(((t,n,r={})=>{if(!1!==r.lengthDelimited&&n.fork(),null!=t.topicID&&(n.uint32(10),n.string(t.topicID)),null!=t.peers)for(const r of t.peers)n.uint32(18),e.PeerInfo.codec().encode(r,n);null!=t.backoff&&(n.uint32(24),n.uint64Number(t.backoff)),!1!==r.lengthDelimited&&n.ldelim()}),((t,n,r={})=>{const s={peers:[]},i=null==n?t.len:t.pos+n;for(;t.pos<i;){const n=t.uint32();switch(n>>>3){case 1:s.topicID=t.string();break;case 2:if(null!=r.limits?.peers&&s.peers.length===r.limits.peers)throw new Wt('decode error - map field "peers" had too many elements',"ERR_MAX_LENGTH");s.peers.push(e.PeerInfo.codec().decode(t,t.uint32()));break;case 3:s.backoff=t.uint64Number();break;default:t.skipType(7&n)}}return s}))),n),t.encode=e=>Kt(e,t.codec()),t.decode=(e,n)=>W(e,t.codec(),n)}(e.ControlPrune||(e.ControlPrune={})),function(e){let t;e.codec=()=>(null==t&&(t=zt(((e,t,n={})=>{!1!==n.lengthDelimited&&t.fork(),null!=e.peerID&&(t.uint32(10),t.bytes(e.peerID)),null!=e.signedPeerRecord&&(t.uint32(18),t.bytes(e.signedPeerRecord)),!1!==n.lengthDelimited&&t.ldelim()}),((e,t,n={})=>{const r={},s=null==t?e.len:e.pos+t;for(;e.pos<s;){const t=e.uint32();switch(t>>>3){case 1:r.peerID=e.bytes();break;case 2:r.signedPeerRecord=e.bytes();break;default:e.skipType(7&t)}}return r}))),t),e.encode=t=>Kt(t,e.codec()),e.decode=(t,n)=>W(t,e.codec(),n)}(e.PeerInfo||(e.PeerInfo={})),e.codec=()=>(null==t&&(t=zt(((t,n,r={})=>{if(!1!==r.lengthDelimited&&n.fork(),null!=t.subscriptions)for(const r of t.subscriptions)n.uint32(10),e.SubOpts.codec().encode(r,n);if(null!=t.messages)for(const r of t.messages)n.uint32(18),e.Message.codec().encode(r,n);null!=t.control&&(n.uint32(26),e.ControlMessage.codec().encode(t.control,n)),!1!==r.lengthDelimited&&n.ldelim()}),((t,n,r={})=>{const s={subscriptions:[],messages:[]},i=null==n?t.len:t.pos+n;for(;t.pos<i;){const n=t.uint32();switch(n>>>3){case 1:if(null!=r.limits?.subscriptions&&s.subscriptions.length===r.limits.subscriptions)throw new Wt('decode error - map field "subscriptions" had too many elements',"ERR_MAX_LENGTH");s.subscriptions.push(e.SubOpts.codec().decode(t,t.uint32()));break;case 2:if(null!=r.limits?.messages&&s.messages.length===r.limits.messages)throw new Wt('decode error - map field "messages" had too many elements',"ERR_MAX_LENGTH");s.messages.push(e.Message.codec().decode(t,t.uint32()));break;case 3:s.control=e.ControlMessage.codec().decode(t,t.uint32());break;default:t.skipType(7&n)}}return s}))),t),e.encode=t=>Kt(t,e.codec()),e.decode=(t,n)=>W(t,e.codec(),n)}(qb||(qb={}));class tv{gossip;msgs=new Map;msgIdToStrFn;history=[];notValidatedCount=0;constructor(e,t,n){this.gossip=e,this.msgIdToStrFn=n;for(let e=0;e<t;e++)this.history[e]=[]}get size(){return this.msgs.size}put(e,t,n=!1){const{msgIdStr:r}=e;return!this.msgs.has(r)&&(this.msgs.set(r,{message:t,validated:n,originatingPeers:new Set,iwantCounts:new Map}),this.history[0].push({...e,topic:t.topic}),n||this.notValidatedCount++,!0)}observeDuplicate(e,t){const n=this.msgs.get(e);null==n||n.validated||n.originatingPeers.add(t)}get(e){return this.msgs.get(this.msgIdToStrFn(e))?.message}getWithIWantCount(e,t){const n=this.msgs.get(e);if(null==n)return null;const r=(n.iwantCounts.get(t)??0)+1;return n.iwantCounts.set(t,r),{msg:n.message,count:r}}getGossipIDs(e){const t=new Map;for(let n=0;n<this.gossip;n++)this.history[n].forEach((n=>{const r=this.msgs.get(n.msgIdStr);if(r?.validated&&e.has(n.topic)){let e=t.get(n.topic);null==e&&(e=[],t.set(n.topic,e)),e.push(n.msgId)}}));return t}validate(e){const t=this.msgs.get(e);if(null==t)return null;t.validated||this.notValidatedCount--;const{message:n,originatingPeers:r}=t;return t.validated=!0,t.originatingPeers=new Set,{message:n,originatingPeers:r}}shift(){this.history[this.history.length-1].forEach((e=>{const t=this.msgs.get(e.msgIdStr);null!=t&&(this.msgs.delete(e.msgIdStr),t.validated||this.notValidatedCount--)})),this.history.pop(),this.history.unshift([])}remove(e){const t=this.msgs.get(e);return null==t?null:(this.msgs.delete(e),t)}}function nv(e){switch(e){case cn.Ignore:return Wb.Ignore;case cn.Reject:return Wb.Reject;default:throw new Error("Unreachable")}}!function(e){e.StrictSign="StrictSign",e.StrictNoSign="StrictNoSign"}(Hb||(Hb={})),function(e){e[e.Signing=0]="Signing",e[e.Anonymous=1]="Anonymous"}(zb||(zb={})),function(e){e.Error="error",e.Ignore="ignore",e.Reject="reject",e.Blacklisted="blacklisted"}(Wb||(Wb={})),function(e){e.InvalidSignature="invalid_signature",e.InvalidSeqno="invalid_seqno",e.InvalidPeerId="invalid_peerid",e.SignaturePresent="signature_present",e.SeqnoPresent="seqno_present",e.FromPresent="from_present",e.TransformFailed="transform_failed"}(jb||(jb={})),function(e){e.duplicate="duplicate",e.invalid="invalid",e.valid="valid"}(Gb||(Gb={})),function(e){e.forward="forward",e.publish="publish"}(Yb||(Yb={})),function(e){e.Fanout="fanout",e.Random="random",e.Subscribed="subscribed",e.Outbound="outbound",e.NotEnough="not_enough",e.Opportunistic="opportunistic"}(Qb||(Qb={})),function(e){e.Dc="disconnected",e.BadScore="bad_score",e.Prune="prune",e.Excess="excess"}(Jb||(Jb={})),function(e){e.GraftBackoff="graft_backoff",e.BrokenPromise="broken_promise",e.MessageDeficit="message_deficit",e.IPColocation="IP_colocation"}(Zb||(Zb={})),function(e){e.LowScore="low_score",e.MaxIhave="max_ihave",e.MaxIasked="max_iasked"}(Xb||(Xb={})),function(e){e.graylist="graylist",e.publish="publish",e.gossip="gossip",e.mesh="mesh"}(ev||(ev={}));const rv="ERR_INVALID_PEER_SCORE_PARAMS",sv={topics:{},topicScoreCap:10,appSpecificScore:()=>0,appSpecificWeight:10,IPColocationFactorWeight:-5,IPColocationFactorThreshold:10,IPColocationFactorWhitelist:new Set,behaviourPenaltyWeight:-10,behaviourPenaltyThreshold:0,behaviourPenaltyDecay:.2,decayInterval:1e3,decayToZero:.1,retainScore:36e5},iv={topicWeight:.5,timeInMeshWeight:1,timeInMeshQuantum:1,timeInMeshCap:3600,firstMessageDeliveriesWeight:1,firstMessageDeliveriesDecay:.5,firstMessageDeliveriesCap:2e3,meshMessageDeliveriesWeight:-1,meshMessageDeliveriesDecay:.5,meshMessageDeliveriesCap:100,meshMessageDeliveriesThreshold:20,meshMessageDeliveriesWindow:10,meshMessageDeliveriesActivation:5e3,meshFailurePenaltyWeight:-1,meshFailurePenaltyDecay:.5,invalidMessageDeliveriesWeight:-1,invalidMessageDeliveriesDecay:.3};function ov(e={}){return{...sv,...e,topics:null!=e.topics?Object.entries(e.topics).reduce(((e,[t,n])=>(e[t]=function(e={}){return{...iv,...e}}(n),e)),{}):{}}}function av(e){if(e.topicWeight<0)throw new dn("invalid topic weight; must be >= 0",rv);if(0===e.timeInMeshQuantum)throw new dn("invalid TimeInMeshQuantum; must be non zero",rv);if(e.timeInMeshWeight<0)throw new dn("invalid TimeInMeshWeight; must be positive (or 0 to disable)",rv);if(0!==e.timeInMeshWeight&&e.timeInMeshQuantum<=0)throw new dn("invalid TimeInMeshQuantum; must be positive",rv);if(0!==e.timeInMeshWeight&&e.timeInMeshCap<=0)throw new dn("invalid TimeInMeshCap; must be positive",rv);if(e.firstMessageDeliveriesWeight<0)throw new dn("invallid FirstMessageDeliveriesWeight; must be positive (or 0 to disable)",rv);if(0!==e.firstMessageDeliveriesWeight&&(e.firstMessageDeliveriesDecay<=0||e.firstMessageDeliveriesDecay>=1))throw new dn("invalid FirstMessageDeliveriesDecay; must be between 0 and 1",rv);if(0!==e.firstMessageDeliveriesWeight&&e.firstMessageDeliveriesCap<=0)throw new dn("invalid FirstMessageDeliveriesCap; must be positive",rv);if(e.meshMessageDeliveriesWeight>0)throw new dn("invalid MeshMessageDeliveriesWeight; must be negative (or 0 to disable)",rv);if(0!==e.meshMessageDeliveriesWeight&&(e.meshMessageDeliveriesDecay<=0||e.meshMessageDeliveriesDecay>=1))throw new dn("invalid MeshMessageDeliveriesDecay; must be between 0 and 1",rv);if(0!==e.meshMessageDeliveriesWeight&&e.meshMessageDeliveriesCap<=0)throw new dn("invalid MeshMessageDeliveriesCap; must be positive",rv);if(0!==e.meshMessageDeliveriesWeight&&e.meshMessageDeliveriesThreshold<=0)throw new dn("invalid MeshMessageDeliveriesThreshold; must be positive",rv);if(e.meshMessageDeliveriesWindow<0)throw new dn("invalid MeshMessageDeliveriesWindow; must be non-negative",rv);if(0!==e.meshMessageDeliveriesWeight&&e.meshMessageDeliveriesActivation<1e3)throw new dn("invalid MeshMessageDeliveriesActivation; must be at least 1s",rv);if(e.meshFailurePenaltyWeight>0)throw new dn("invalid MeshFailurePenaltyWeight; must be negative (or 0 to disable)",rv);if(0!==e.meshFailurePenaltyWeight&&(e.meshFailurePenaltyDecay<=0||e.meshFailurePenaltyDecay>=1))throw new dn("invalid MeshFailurePenaltyDecay; must be between 0 and 1",rv);if(e.invalidMessageDeliveriesWeight>0)throw new dn("invalid InvalidMessageDeliveriesWeight; must be negative (or 0 to disable)",rv);if(e.invalidMessageDeliveriesDecay<=0||e.invalidMessageDeliveriesDecay>=1)throw new dn("invalid InvalidMessageDeliveriesDecay; must be between 0 and 1",rv)}const cv={gossipThreshold:-10,publishThreshold:-50,graylistThreshold:-80,acceptPXThreshold:10,opportunisticGraftThreshold:20};function lv(e={}){return{...cv,...e}}function uv(e,t,n=(()=>!0)){const r=new Set;if(t<=0)return r;for(const s of e){if(r.size>=t)break;n(s)&&(r.add(s),e.delete(s))}return r}class hv extends Map{getDefault;constructor(e){super(),this.getDefault=e}getOrDefault(e){let t=super.get(e);return void 0===t&&(t=this.getDefault(),this.set(e,t)),t}}function dv(e,t,n,r){let s=0;Object.entries(t.topics).forEach((([e,t])=>{const r=n.topics[e];if(void 0===r)return;let i=0;if(t.inMesh){let e=t.meshTime/r.timeInMeshQuantum;e>r.timeInMeshCap&&(e=r.timeInMeshCap),i+=e*r.timeInMeshWeight}let o=t.firstMessageDeliveries;if(o>r.firstMessageDeliveriesCap&&(o=r.firstMessageDeliveriesCap),i+=o*r.firstMessageDeliveriesWeight,t.meshMessageDeliveriesActive&&t.meshMessageDeliveries<r.meshMessageDeliveriesThreshold){const e=r.meshMessageDeliveriesThreshold-t.meshMessageDeliveries;i+=e*e*r.meshMessageDeliveriesWeight}i+=t.meshFailurePenalty*r.meshFailurePenaltyWeight;i+=t.invalidMessageDeliveries*t.invalidMessageDeliveries*r.invalidMessageDeliveriesWeight,s+=i*r.topicWeight})),n.topicScoreCap>0&&s>n.topicScoreCap&&(s=n.topicScoreCap);const i=n.appSpecificScore(e);if(s+=i*n.appSpecificWeight,t.knownIPs.forEach((e=>{if(n.IPColocationFactorWhitelist.has(e))return;const t=r.get(e),i=null!=t?t.size:0;if(i>n.IPColocationFactorThreshold){const e=i-n.IPColocationFactorThreshold;s+=e*e*n.IPColocationFactorWeight}})),t.behaviourPenalty>n.behaviourPenaltyThreshold){const e=t.behaviourPenalty-n.behaviourPenaltyThreshold;s+=e*e*n.behaviourPenaltyWeight}return s}function pv(e,t){t=t||{};this._capacity=t.capacity,this._head=0,this._tail=0,Array.isArray(e)?this._fromArray(e):(this._capacityMask=3,this._list=new Array(4))}pv.prototype.peekAt=function(e){var t=e;if(t===(0|t)){var n=this.size();if(!(t>=n||t<-n))return t<0&&(t+=n),t=this._head+t&this._capacityMask,this._list[t]}},pv.prototype.get=function(e){return this.peekAt(e)},pv.prototype.peek=function(){if(this._head!==this._tail)return this._list[this._head]},pv.prototype.peekFront=function(){return this.peek()},pv.prototype.peekBack=function(){return this.peekAt(-1)},Object.defineProperty(pv.prototype,"length",{get:function(){return this.size()}}),pv.prototype.size=function(){return this._head===this._tail?0:this._head<this._tail?this._tail-this._head:this._capacityMask+1-(this._head-this._tail)},pv.prototype.unshift=function(e){if(0===arguments.length)return this.size();var t=this._list.length;return this._head=this._head-1+t&this._capacityMask,this._list[this._head]=e,this._tail===this._head&&this._growArray(),this._capacity&&this.size()>this._capacity&&this.pop(),this._head<this._tail?this._tail-this._head:this._capacityMask+1-(this._head-this._tail)},pv.prototype.shift=function(){var e=this._head;if(e!==this._tail){var t=this._list[e];return this._list[e]=void 0,this._head=e+1&this._capacityMask,e<2&&this._tail>1e4&&this._tail<=this._list.length>>>2&&this._shrinkArray(),t}},pv.prototype.push=function(e){if(0===arguments.length)return this.size();var t=this._tail;return this._list[t]=e,this._tail=t+1&this._capacityMask,this._tail===this._head&&this._growArray(),this._capacity&&this.size()>this._capacity&&this.shift(),this._head<this._tail?this._tail-this._head:this._capacityMask+1-(this._head-this._tail)},pv.prototype.pop=function(){var e=this._tail;if(e!==this._head){var t=this._list.length;this._tail=e-1+t&this._capacityMask;var n=this._list[this._tail];return this._list[this._tail]=void 0,this._head<2&&e>1e4&&e<=t>>>2&&this._shrinkArray(),n}},pv.prototype.removeOne=function(e){var t=e;if(t===(0|t)&&this._head!==this._tail){var n=this.size(),r=this._list.length;if(!(t>=n||t<-n)){t<0&&(t+=n),t=this._head+t&this._capacityMask;var s,i=this._list[t];if(e<n/2){for(s=e;s>0;s--)this._list[t]=this._list[t=t-1+r&this._capacityMask];this._list[t]=void 0,this._head=this._head+1+r&this._capacityMask}else{for(s=n-1-e;s>0;s--)this._list[t]=this._list[t=t+1+r&this._capacityMask];this._list[t]=void 0,this._tail=this._tail-1+r&this._capacityMask}return i}}},pv.prototype.remove=function(e,t){var n,r=e,s=t;if(r===(0|r)&&this._head!==this._tail){var i=this.size(),o=this._list.length;if(!(r>=i||r<-i||t<1)){if(r<0&&(r+=i),1===t||!t)return(n=new Array(1))[0]=this.removeOne(r),n;if(0===r&&r+t>=i)return n=this.toArray(),this.clear(),n;var a;for(r+t>i&&(t=i-r),n=new Array(t),a=0;a<t;a++)n[a]=this._list[this._head+r+a&this._capacityMask];if(r=this._head+r&this._capacityMask,e+t===i){for(this._tail=this._tail-t+o&this._capacityMask,a=t;a>0;a--)this._list[r=r+1+o&this._capacityMask]=void 0;return n}if(0===e){for(this._head=this._head+t+o&this._capacityMask,a=t-1;a>0;a--)this._list[r=r+1+o&this._capacityMask]=void 0;return n}if(r<i/2){for(this._head=this._head+e+t+o&this._capacityMask,a=e;a>0;a--)this.unshift(this._list[r=r-1+o&this._capacityMask]);for(r=this._head-1+o&this._capacityMask;s>0;)this._list[r=r-1+o&this._capacityMask]=void 0,s--;e<0&&(this._tail=r)}else{for(this._tail=r,r=r+t+o&this._capacityMask,a=i-(t+e);a>0;a--)this.push(this._list[r++]);for(r=this._tail;s>0;)this._list[r=r+1+o&this._capacityMask]=void 0,s--}return this._head<2&&this._tail>1e4&&this._tail<=o>>>2&&this._shrinkArray(),n}}},pv.prototype.splice=function(e,t){var n=e;if(n===(0|n)){var r=this.size();if(n<0&&(n+=r),!(n>r)){if(arguments.length>2){var s,i,o,a=arguments.length,c=this._list.length,l=2;if(!r||n<r/2){for(i=new Array(n),s=0;s<n;s++)i[s]=this._list[this._head+s&this._capacityMask];for(0===t?(o=[],n>0&&(this._head=this._head+n+c&this._capacityMask)):(o=this.remove(n,t),this._head=this._head+n+c&this._capacityMask);a>l;)this.unshift(arguments[--a]);for(s=n;s>0;s--)this.unshift(i[s-1])}else{var u=(i=new Array(r-(n+t))).length;for(s=0;s<u;s++)i[s]=this._list[this._head+n+t+s&this._capacityMask];for(0===t?(o=[],n!=r&&(this._tail=this._head+n+c&this._capacityMask)):(o=this.remove(n,t),this._tail=this._tail-u+c&this._capacityMask);l<a;)this.push(arguments[l++]);for(s=0;s<u;s++)this.push(i[s])}return o}return this.remove(n,t)}}},pv.prototype.clear=function(){this._list=new Array(this._list.length),this._head=0,this._tail=0},pv.prototype.isEmpty=function(){return this._head===this._tail},pv.prototype.toArray=function(){return this._copyArray(!1)},pv.prototype._fromArray=function(e){var t=e.length,n=this._nextPowerOf2(t);this._list=new Array(n),this._capacityMask=n-1,this._tail=t;for(var r=0;r<t;r++)this._list[r]=e[r]},pv.prototype._copyArray=function(e,t){var n=this._list,r=n.length,s=this.length;if((t|=s)==s&&this._head<this._tail)return this._list.slice(this._head,this._tail);var i,o=new Array(t),a=0;if(e||this._head>this._tail){for(i=this._head;i<r;i++)o[a++]=n[i];for(i=0;i<this._tail;i++)o[a++]=n[i]}else for(i=this._head;i<this._tail;i++)o[a++]=n[i];return o},pv.prototype._growArray=function(){if(0!=this._head){var e=this._copyArray(!0,this._list.length<<1);this._tail=this._list.length,this._head=0,this._list=e}else this._tail=this._list.length,this._list.length<<=1;this._capacityMask=this._capacityMask<<1|1},pv.prototype._shrinkArray=function(){this._list.length>>>=1,this._capacityMask>>>=1},pv.prototype._nextPowerOf2=function(e){var t=1<<Math.log(e)/Math.log(2)+1;return Math.max(t,4)};var fv,gv=Or(pv);!function(e){e[e.unknown=0]="unknown",e[e.valid=1]="valid",e[e.invalid=2]="invalid",e[e.ignored=3]="ignored"}(fv||(fv={}));class mv{records;queue;constructor(){this.records=new Map,this.queue=new gv}getRecord(e){return this.records.get(e)}ensureRecord(e){let t=this.records.get(e);if(null!=t)return t;t={status:fv.unknown,firstSeenTsMs:Date.now(),validated:0,peers:new Set},this.records.set(e,t);const n={msgId:e,expire:Date.now()+12e4};return this.queue.push(n),t}gc(){const e=Date.now();let t=this.queue.peekFront();for(;null!=t&&t.expire<e;)this.records.delete(t.msgId),this.queue.shift(),t=this.queue.peekFront()}clear(){this.records.clear(),this.queue.clear()}}class yv{params;metrics;peerStats=new Map;peerIPs=new hv((()=>new Set));scoreCache=new Map;deliveryRecords=new mv;_backgroundInterval;scoreCacheValidityMs;computeScore;log;constructor(e,t,n,r){this.params=e,this.metrics=t,function(e){for(const[t,n]of Object.entries(e.topics))try{av(n)}catch(e){throw new dn(`invalid score parameters for topic ${t}: ${e.message}`,rv)}if(e.topicScoreCap<0)throw new dn("invalid topic score cap; must be positive (or 0 for no cap)",rv);if(null===e.appSpecificScore||void 0===e.appSpecificScore)throw new dn("missing application specific score function",rv);if(e.IPColocationFactorWeight>0)throw new dn("invalid IPColocationFactorWeight; must be negative (or 0 to disable)",rv);if(0!==e.IPColocationFactorWeight&&e.IPColocationFactorThreshold<1)throw new dn("invalid IPColocationFactorThreshold; must be at least 1",rv);if(e.behaviourPenaltyWeight>0)throw new dn("invalid BehaviourPenaltyWeight; must be negative (or 0 to disable)",rv);if(0!==e.behaviourPenaltyWeight&&(e.behaviourPenaltyDecay<=0||e.behaviourPenaltyDecay>=1))throw new dn("invalid BehaviourPenaltyDecay; must be between 0 and 1",rv);if(e.decayInterval<1e3)throw new dn("invalid DecayInterval; must be at least 1s",rv);if(e.decayToZero<=0||e.decayToZero>=1)throw new dn("invalid DecayToZero; must be between 0 and 1",rv)}(e),this.scoreCacheValidityMs=r.scoreCacheValidityMs,this.computeScore=r.computeScore??dv,this.log=n.forComponent("libp2p:gossipsub:score")}get size(){return this.peerStats.size}start(){null==this._backgroundInterval?(this._backgroundInterval=setInterval((()=>{this.background()}),this.params.decayInterval),this.log("started")):this.log("Peer score already running")}stop(){null!=this._backgroundInterval?(clearInterval(this._backgroundInterval),delete this._backgroundInterval,this.peerIPs.clear(),this.peerStats.clear(),this.deliveryRecords.clear(),this.log("stopped")):this.log("Peer score already stopped")}background(){this.refreshScores(),this.deliveryRecords.gc()}dumpPeerScoreStats(){return Object.fromEntries(Array.from(this.peerStats.entries()).map((([e,t])=>[e,t])))}messageFirstSeenTimestampMs(e){const t=this.deliveryRecords.getRecord(e);return null!=t?t.firstSeenTsMs:null}refreshScores(){const e=Date.now(),t=this.params.decayToZero;this.peerStats.forEach(((n,r)=>{n.connected?(Object.entries(n.topics).forEach((([n,r])=>{const s=this.params.topics[n];void 0!==s&&(r.firstMessageDeliveries*=s.firstMessageDeliveriesDecay,r.firstMessageDeliveries<t&&(r.firstMessageDeliveries=0),r.meshMessageDeliveries*=s.meshMessageDeliveriesDecay,r.meshMessageDeliveries<t&&(r.meshMessageDeliveries=0),r.meshFailurePenalty*=s.meshFailurePenaltyDecay,r.meshFailurePenalty<t&&(r.meshFailurePenalty=0),r.invalidMessageDeliveries*=s.invalidMessageDeliveriesDecay,r.invalidMessageDeliveries<t&&(r.invalidMessageDeliveries=0),r.inMesh&&(r.meshTime=e-r.graftTime,r.meshTime>s.meshMessageDeliveriesActivation&&(r.meshMessageDeliveriesActive=!0)))})),n.behaviourPenalty*=this.params.behaviourPenaltyDecay,n.behaviourPenalty<t&&(n.behaviourPenalty=0)):e>n.expire&&(this.removeIPsForPeer(r,n.knownIPs),this.peerStats.delete(r),this.scoreCache.delete(r))}))}score(e){this.metrics?.scoreFnCalls.inc();const t=this.peerStats.get(e);if(null==t)return 0;const n=Date.now(),r=this.scoreCache.get(e);if(null!=r&&r.cacheUntil>n)return r.score;this.metrics?.scoreFnRuns.inc();const s=this.computeScore(e,t,this.params,this.peerIPs),i=n+this.scoreCacheValidityMs;return null!=r?(this.metrics?.scoreCachedDelta.observe(Math.abs(s-r.score)),r.score=s,r.cacheUntil=i):this.scoreCache.set(e,{score:s,cacheUntil:i}),s}addPenalty(e,t,n){const r=this.peerStats.get(e);null!=r&&(r.behaviourPenalty+=t,this.metrics?.onScorePenalty(n))}addPeer(e){const t={connected:!0,expire:0,topics:{},knownIPs:new Set,behaviourPenalty:0};this.peerStats.set(e,t)}addIP(e,t){const n=this.peerStats.get(e);null!=n&&n.knownIPs.add(t),this.peerIPs.getOrDefault(t).add(e)}removeIP(e,t){const n=this.peerStats.get(e);null!=n&&n.knownIPs.delete(t);const r=this.peerIPs.get(t);null!=r&&(r.delete(e),0===r.size&&this.peerIPs.delete(t))}removePeer(e){const t=this.peerStats.get(e);if(null!=t){if(this.score(e)>0)return this.removeIPsForPeer(e,t.knownIPs),void this.peerStats.delete(e);Object.entries(t.topics).forEach((([e,t])=>{t.firstMessageDeliveries=0;const n=this.params.topics[e].meshMessageDeliveriesThreshold;if(t.inMesh&&t.meshMessageDeliveriesActive&&t.meshMessageDeliveries<n){const e=n-t.meshMessageDeliveries;t.meshFailurePenalty+=e*e}t.inMesh=!1,t.meshMessageDeliveriesActive=!1})),t.connected=!1,t.expire=Date.now()+this.params.retainScore}}graft(e,t){const n=this.peerStats.get(e);if(null!=n){const e=this.getPtopicStats(n,t);null!=e&&(e.inMesh=!0,e.graftTime=Date.now(),e.meshTime=0,e.meshMessageDeliveriesActive=!1)}}prune(e,t){const n=this.peerStats.get(e);if(null!=n){const e=this.getPtopicStats(n,t);if(null!=e){const n=this.params.topics[t].meshMessageDeliveriesThreshold;if(e.meshMessageDeliveriesActive&&e.meshMessageDeliveries<n){const t=n-e.meshMessageDeliveries;e.meshFailurePenalty+=t*t}e.meshMessageDeliveriesActive=!1,e.inMesh=!1}}}validateMessage(e){this.deliveryRecords.ensureRecord(e)}deliverMessage(e,t,n){this.markFirstMessageDelivery(e,n);const r=this.deliveryRecords.ensureRecord(t),s=Date.now();r.status===fv.unknown?(r.status=fv.valid,r.validated=s,r.peers.forEach((t=>{t!==e.toString()&&this.markDuplicateMessageDelivery(t,n)}))):this.log("unexpected delivery: message from %s was first seen %s ago and has delivery status %s",e,s-r.firstSeenTsMs,fv[r.status])}rejectInvalidMessage(e,t){this.markInvalidMessageDelivery(e,t)}rejectMessage(e,t,n,r){switch(r){case Wb.Error:return void this.markInvalidMessageDelivery(e,n);case Wb.Blacklisted:return}const s=this.deliveryRecords.ensureRecord(t);if(s.status===fv.unknown){if(r===Wb.Ignore)return s.status=fv.ignored,void s.peers.clear();s.status=fv.invalid,this.markInvalidMessageDelivery(e,n),s.peers.forEach((e=>{this.markInvalidMessageDelivery(e,n)})),s.peers.clear()}else this.log("unexpected rejection: message from %s was first seen %s ago and has delivery status %d",e,Date.now()-s.firstSeenTsMs,fv[s.status])}duplicateMessage(e,t,n){const r=this.deliveryRecords.ensureRecord(t);if(!r.peers.has(e))switch(r.status){case fv.unknown:r.peers.add(e);break;case fv.valid:r.peers.add(e),this.markDuplicateMessageDelivery(e,n,r.validated);break;case fv.invalid:this.markInvalidMessageDelivery(e,n);case fv.ignored:}}markInvalidMessageDelivery(e,t){const n=this.peerStats.get(e);if(null!=n){const e=this.getPtopicStats(n,t);null!=e&&(e.invalidMessageDeliveries+=1)}}markFirstMessageDelivery(e,t){const n=this.peerStats.get(e);if(null!=n){const e=this.getPtopicStats(n,t);if(null!=e){let n=this.params.topics[t].firstMessageDeliveriesCap;e.firstMessageDeliveries=Math.min(n,e.firstMessageDeliveries+1),e.inMesh&&(n=this.params.topics[t].meshMessageDeliveriesCap,e.meshMessageDeliveries=Math.min(n,e.meshMessageDeliveries+1))}}}markDuplicateMessageDelivery(e,t,n){const r=this.peerStats.get(e);if(null!=r){const e=void 0!==n?Date.now():0,s=this.getPtopicStats(r,t);if(null!=s&&s.inMesh){const r=this.params.topics[t];if(void 0!==n){const s=e-n,i=s>r.meshMessageDeliveriesWindow;if(this.metrics?.onDuplicateMsgDelivery(t,s,i),i)return}const i=r.meshMessageDeliveriesCap;s.meshMessageDeliveries=Math.min(i,s.meshMessageDeliveries+1)}}}removeIPsForPeer(e,t){for(const n of t){const t=this.peerIPs.get(n);null!=t&&(t.delete(e),0===t.size&&this.peerIPs.delete(n))}}getPtopicStats(e,t){let n=e.topics[t];return void 0!==n?n:void 0!==this.params.topics[t]?(n={inMesh:!1,graftTime:0,meshTime:0,firstMessageDeliveries:0,meshMessageDeliveries:0,meshMessageDeliveriesActive:!1,meshFailurePenalty:0,invalidMessageDeliveries:0},e.topics[t]=n,n):null}}function wv(e,t,n,r,s){let i=0;const o=new Map;if(Object.entries(t.topics).forEach((([e,t])=>{const r=s.get(e)??"unknown",a=n.topics[e];if(void 0===a)return;let c=o.get(r);null==c&&(c={p1w:0,p2w:0,p3w:0,p3bw:0,p4w:0},o.set(r,c));let l=0,u=0,h=0,d=0,p=0;if(t.inMesh){l+=Math.max(t.meshTime/a.timeInMeshQuantum,a.timeInMeshCap)*a.timeInMeshWeight}let f=t.firstMessageDeliveries;if(f>a.firstMessageDeliveriesCap&&(f=a.firstMessageDeliveriesCap),u+=f*a.firstMessageDeliveriesWeight,t.meshMessageDeliveriesActive&&t.meshMessageDeliveries<a.meshMessageDeliveriesThreshold){const e=a.meshMessageDeliveriesThreshold-t.meshMessageDeliveries;h+=e*e*a.meshMessageDeliveriesWeight}d+=t.meshFailurePenalty*a.meshFailurePenaltyWeight;p+=t.invalidMessageDeliveries*t.invalidMessageDeliveries*a.invalidMessageDeliveriesWeight,i+=(l+u+h+d+p)*a.topicWeight,c.p1w+=l,c.p2w+=u,c.p3w+=h,c.p3bw+=d,c.p4w+=p})),n.topicScoreCap>0&&i>n.topicScoreCap){i=n.topicScoreCap;const e=n.topicScoreCap/i;for(const t of o.values())t.p1w*=e,t.p2w*=e,t.p3w*=e,t.p3bw*=e,t.p4w*=e}let a=0,c=0,l=0;a+=n.appSpecificScore(e)*n.appSpecificWeight,t.knownIPs.forEach((e=>{if(n.IPColocationFactorWhitelist.has(e))return;const t=r.get(e),s=null!=t?t.size:0;if(s>n.IPColocationFactorThreshold){const e=s-n.IPColocationFactorThreshold;c+=e*e*n.IPColocationFactorWeight}}));return l+=t.behaviourPenalty*t.behaviourPenalty*n.behaviourPenaltyWeight,i+=a+c+l,{byTopic:o,p5w:a,p6w:c,p7w:l,score:i}}class bv{rawStream;pushable;closeController;maxBufferSize;constructor(e,t,n){this.rawStream=e,this.pushable=hr(),this.closeController=new AbortController,this.maxBufferSize=n.maxBufferSize??1/0,this.closeController.signal.addEventListener("abort",(()=>{e.close().catch((t=>{e.abort(t)}))})),pr(this.pushable,this.rawStream).catch(t)}get protocol(){return this.rawStream.protocol}push(e){if(this.pushable.readableLength>this.maxBufferSize)throw Error(`OutboundStream buffer full, size > ${this.maxBufferSize}`);this.pushable.push(Nr.single(e))}pushPrefixed(e){if(this.pushable.readableLength>this.maxBufferSize)throw Error(`OutboundStream buffer full, size > ${this.maxBufferSize}`);this.pushable.push(e)}async close(){this.closeController.abort(),await this.pushable.return()}}class vv{source;rawStream;closeController;constructor(e,t={}){this.rawStream=e,this.closeController=new AbortController,this.closeController.signal.addEventListener("abort",(()=>{e.close().catch((t=>{e.abort(t)}))})),this.source=pr(this.rawStream,(e=>Kr(e,t)))}async close(){this.closeController.abort()}}class Ev{gossipsubIWantFollowupMs;msgIdToStrFn;metrics;promises=new Map;requestMsByMsg=new Map;requestMsByMsgExpire;constructor(e,t,n){this.gossipsubIWantFollowupMs=e,this.msgIdToStrFn=t,this.metrics=n,this.requestMsByMsgExpire=10*e}get size(){return this.promises.size}get requestMsByMsgSize(){return this.requestMsByMsg.size}addPromise(e,t){const n=t[Math.floor(Math.random()*t.length)],r=this.msgIdToStrFn(n);let s=this.promises.get(r);null==s&&(s=new Map,this.promises.set(r,s));const i=Date.now();s.has(e)||(s.set(e,i+this.gossipsubIWantFollowupMs),null!=this.metrics&&(this.metrics.iwantPromiseStarted.inc(1),this.requestMsByMsg.has(r)||this.requestMsByMsg.set(r,i)))}getBrokenPromises(){const e=Date.now(),t=new Map;let n=0;return this.promises.forEach(((r,s)=>{r.forEach(((s,i)=>{s<e&&(t.set(i,(t.get(i)??0)+1),r.delete(i),n++)})),0===r.size&&this.promises.delete(s)})),this.metrics?.iwantPromiseBroken.inc(n),t}deliverMessage(e,t=!1){this.trackMessage(e);const n=this.promises.get(e);null!=n&&(this.promises.delete(e),null!=this.metrics&&(this.metrics.iwantPromiseResolved.inc(1),t&&this.metrics.iwantPromiseResolvedFromDuplicate.inc(1),this.metrics.iwantPromiseResolvedPeers.inc(n.size)))}rejectMessage(e,t){this.trackMessage(e),t!==Wb.Error&&this.promises.delete(e)}clear(){this.promises.clear()}prune(){const e=Date.now()-this.requestMsByMsgExpire;let t=0;for(const[n,r]of this.requestMsByMsg.entries()){if(!(r<e))break;this.requestMsByMsg.delete(n),t++}this.metrics?.iwantMessagePruned.inc(t)}trackMessage(e){if(null!=this.metrics){const t=this.requestMsByMsg.get(e);void 0!==t&&(this.metrics.iwantPromiseDeliveryTime.observe((Date.now()-t)/1e3),this.requestMsByMsg.delete(e))}}}const Sv=Tt("libp2p-pubsub:");function _v(e=[],t){return{subscriptions:[],messages:e,control:void 0!==t?{graft:t.graft??[],prune:t.prune??[],ihave:t.ihave??[],iwant:t.iwant??[]}:void 0}}function Iv(e){return void 0===e.control&&(e.control={graft:[],prune:[],ihave:[],iwant:[]}),e}function Rv(e){if(e.length<=1)return e;for(let t=0;t<e.length;t++){const n=Math.floor(Math.random()*Math.floor(e.length)),r=e[t];e[t]=e[n],e[n]=r}return e}function Av(e){return Gt(e,"base64")}function Tv(e){if("signed"!==e.type)throw new Error("expected signed message type");if(null==e.sequenceNumber)throw Error("missing seqno field");return((e,t)=>{const n=Tt(t.toString(16).padStart(16,"0"),"base16"),r=new Uint8Array(e.length+n.length);return r.set(e,0),r.set(n,e.length),r})(e.from.toBytes(),e.sequenceNumber)}async function Dv(e){return pt.encode(e.data)}var kv,Pv;!function(e){e[e.ip4=4]="ip4",e[e.ip6=41]="ip6"}(kv||(kv={}));class Cv{entries=new Map;validityMs;constructor(e){this.validityMs=e.validityMs}get size(){return this.entries.size}put(e,t){return!!this.entries.has(e)||(this.entries.set(e,{value:t,validUntilMs:Date.now()+this.validityMs}),!1)}prune(){const e=Date.now();for(const[t,n]of this.entries.entries()){if(!(n.validUntilMs<e))break;this.entries.delete(t)}}has(e){return this.entries.has(e)}get(e){const t=this.entries.get(e);return null!=t&&t.validUntilMs>=Date.now()?t.value:void 0}clear(){this.entries.clear()}}!function(e){e[e.started=0]="started",e[e.stopped=1]="stopped"}(Pv||(Pv={}));class xv extends mn{globalSignaturePolicy;multicodecs=[Vb,Fb];publishConfig;dataTransform;peers=new Set;streamsInbound=new Map;streamsOutbound=new Map;outboundInflightQueue=hr({objectMode:!0});direct=new Set;floodsubPeers=new Set;seenCache;acceptFromWhitelist=new Map;topics=new Map;subscriptions=new Set;mesh=new Map;fanout=new Map;fanoutLastpub=new Map;gossip=new Map;control=new Map;peerhave=new Map;iasked=new Map;backoff=new Map;outbound=new Map;msgIdFn;fastMsgIdFn;msgIdToStrFn;fastMsgIdCache;publishedMessageIds;mcache;score;topicValidators=new Map;log;heartbeatTicks=0;gossipTracer;components;directPeerInitial=null;static multicodec=Vb;opts;decodeRpcLimits;metrics;status={code:Pv.stopped};maxInboundStreams;maxOutboundStreams;runOnTransientConnection;allowedTopics;heartbeatTimer=null;constructor(e,t={}){super();const n={fallbackToFloodsub:!0,floodPublish:!0,batchPublish:!1,tagMeshPeers:!0,doPX:!1,directPeers:[],D:6,Dlo:4,Dhi:12,Dscore:4,Dout:2,Dlazy:6,heartbeatInterval:1e3,fanoutTTL:6e4,mcacheLength:5,mcacheGossip:3,seenTTL:12e4,gossipsubIWantFollowupMs:3e3,prunePeers:16,pruneBackoff:6e4,unsubcribeBackoff:1e4,graftFloodThreshold:1e4,opportunisticGraftPeers:2,opportunisticGraftTicks:60,directConnectTicks:300,...t,scoreParams:ov(t.scoreParams),scoreThresholds:lv(t.scoreThresholds)};if(this.components=e,this.decodeRpcLimits=n.decodeRpcLimits??$b,this.globalSignaturePolicy=n.globalSignaturePolicy??on,n.fallbackToFloodsub&&this.multicodecs.push(Ub),this.log=e.logger.forComponent(n.debugName??"libp2p:gossipsub"),this.opts=n,this.direct=new Set(n.directPeers.map((e=>e.id.toString()))),this.seenCache=new Cv({validityMs:n.seenTTL}),this.publishedMessageIds=new Cv({validityMs:n.seenTTL}),null!=t.msgIdFn)this.msgIdFn=t.msgIdFn;else switch(this.globalSignaturePolicy){case on:this.msgIdFn=Tv;break;case an:this.msgIdFn=Dv;break;default:throw new Error(`Invalid globalSignaturePolicy: ${this.globalSignaturePolicy}`)}if(null!=t.fastMsgIdFn&&(this.fastMsgIdFn=t.fastMsgIdFn,this.fastMsgIdCache=new Cv({validityMs:n.seenTTL})),this.msgIdToStrFn=t.msgIdToStrFn??Av,this.mcache=t.messageCache??new tv(n.mcacheGossip,n.mcacheLength,this.msgIdToStrFn),null!=t.dataTransform&&(this.dataTransform=t.dataTransform),null!=t.metricsRegister){if(null==t.metricsTopicStrToLabel)throw Error("Must set metricsTopicStrToLabel with metrics");const e=Math.max(...Object.values(n.scoreParams.topics).map((e=>e.meshMessageDeliveriesWindow)),1e3),r=function(e,t,n){return{protocolsEnabled:e.gauge({name:"gossipsub_protocol",help:"Status of enabled protocols",labelNames:["protocol"]}),topicSubscriptionStatus:e.gauge({name:"gossipsub_topic_subscription_status",help:"Status of our subscription to this topic",labelNames:["topicStr"]}),topicPeersCount:e.gauge({name:"gossipsub_topic_peer_count",help:"Number of peers subscribed to each topic",labelNames:["topicStr"]}),meshPeerCounts:e.gauge({name:"gossipsub_mesh_peer_count",help:"Number of peers in our mesh",labelNames:["topicStr"]}),meshPeerInclusionEventsFanout:e.gauge({name:"gossipsub_mesh_peer_inclusion_events_fanout_total",help:"Number of times we include peers in a topic mesh for fanout reasons",labelNames:["topic"]}),meshPeerInclusionEventsRandom:e.gauge({name:"gossipsub_mesh_peer_inclusion_events_random_total",help:"Number of times we include peers in a topic mesh for random reasons",labelNames:["topic"]}),meshPeerInclusionEventsSubscribed:e.gauge({name:"gossipsub_mesh_peer_inclusion_events_subscribed_total",help:"Number of times we include peers in a topic mesh for subscribed reasons",labelNames:["topic"]}),meshPeerInclusionEventsOutbound:e.gauge({name:"gossipsub_mesh_peer_inclusion_events_outbound_total",help:"Number of times we include peers in a topic mesh for outbound reasons",labelNames:["topic"]}),meshPeerInclusionEventsNotEnough:e.gauge({name:"gossipsub_mesh_peer_inclusion_events_not_enough_total",help:"Number of times we include peers in a topic mesh for not_enough reasons",labelNames:["topic"]}),meshPeerInclusionEventsOpportunistic:e.gauge({name:"gossipsub_mesh_peer_inclusion_events_opportunistic_total",help:"Number of times we include peers in a topic mesh for opportunistic reasons",labelNames:["topic"]}),meshPeerInclusionEventsUnknown:e.gauge({name:"gossipsub_mesh_peer_inclusion_events_unknown_total",help:"Number of times we include peers in a topic mesh for unknown reasons",labelNames:["topic"]}),meshPeerChurnEventsDisconnected:e.gauge({name:"gossipsub_peer_churn_events_disconnected_total",help:"Number of times we remove peers in a topic mesh for disconnected reasons",labelNames:["topic"]}),meshPeerChurnEventsBadScore:e.gauge({name:"gossipsub_peer_churn_events_bad_score_total",help:"Number of times we remove peers in a topic mesh for bad_score reasons",labelNames:["topic"]}),meshPeerChurnEventsPrune:e.gauge({name:"gossipsub_peer_churn_events_prune_total",help:"Number of times we remove peers in a topic mesh for prune reasons",labelNames:["topic"]}),meshPeerChurnEventsExcess:e.gauge({name:"gossipsub_peer_churn_events_excess_total",help:"Number of times we remove peers in a topic mesh for excess reasons",labelNames:["topic"]}),meshPeerChurnEventsUnknown:e.gauge({name:"gossipsub_peer_churn_events_unknown_total",help:"Number of times we remove peers in a topic mesh for unknown reasons",labelNames:["topic"]}),peersPerProtocol:e.gauge({name:"gossipsub_peers_per_protocol_count",help:"Peers connected for each topic",labelNames:["protocol"]}),heartbeatDuration:e.histogram({name:"gossipsub_heartbeat_duration_seconds",help:"The time it takes to complete one iteration of the heartbeat",buckets:[.01,.1,1]}),heartbeatSkipped:e.gauge({name:"gossipsub_heartbeat_skipped",help:"Heartbeat run took longer than heartbeat interval so next is skipped"}),acceptedMessagesTotal:e.gauge({name:"gossipsub_accepted_messages_total",help:"Total accepted messages for each topic",labelNames:["topic"]}),ignoredMessagesTotal:e.gauge({name:"gossipsub_ignored_messages_total",help:"Total ignored messages for each topic",labelNames:["topic"]}),rejectedMessagesTotal:e.gauge({name:"gossipsub_rejected_messages_total",help:"Total rejected messages for each topic",labelNames:["topic"]}),unknownValidationResultsTotal:e.gauge({name:"gossipsub_unknown_validation_results_total",help:"Total unknown validation results for each topic",labelNames:["topic"]}),asyncValidationMcacheHit:e.gauge({name:"gossipsub_async_validation_mcache_hit_total",help:"Async validation result reported by the user layer",labelNames:["hit"]}),asyncValidationDelayFromFirstSeenSec:e.histogram({name:"gossipsub_async_validation_delay_from_first_seen",help:"Async validation report delay from first seen in second",buckets:[.01,.03,.1,.3,1,3,10]}),asyncValidationUnknownFirstSeen:e.gauge({name:"gossipsub_async_validation_unknown_first_seen_count_total",help:"Async validation report unknown first seen value for message"}),peerReadStreamError:e.gauge({name:"gossipsub_peer_read_stream_err_count_total",help:"Peer read stream error"}),rpcRecvBytes:e.gauge({name:"gossipsub_rpc_recv_bytes_total",help:"RPC recv"}),rpcRecvCount:e.gauge({name:"gossipsub_rpc_recv_count_total",help:"RPC recv"}),rpcRecvSubscription:e.gauge({name:"gossipsub_rpc_recv_subscription_total",help:"RPC recv"}),rpcRecvMessage:e.gauge({name:"gossipsub_rpc_recv_message_total",help:"RPC recv"}),rpcRecvControl:e.gauge({name:"gossipsub_rpc_recv_control_total",help:"RPC recv"}),rpcRecvIHave:e.gauge({name:"gossipsub_rpc_recv_ihave_total",help:"RPC recv"}),rpcRecvIWant:e.gauge({name:"gossipsub_rpc_recv_iwant_total",help:"RPC recv"}),rpcRecvGraft:e.gauge({name:"gossipsub_rpc_recv_graft_total",help:"RPC recv"}),rpcRecvPrune:e.gauge({name:"gossipsub_rpc_recv_prune_total",help:"RPC recv"}),rpcDataError:e.gauge({name:"gossipsub_rpc_data_err_count_total",help:"RPC data error"}),rpcRecvError:e.gauge({name:"gossipsub_rpc_recv_err_count_total",help:"RPC recv error"}),rpcRecvNotAccepted:e.gauge({name:"gossipsub_rpc_rcv_not_accepted_total",help:"Total count of RPC dropped because acceptFrom() == false"}),rpcSentBytes:e.gauge({name:"gossipsub_rpc_sent_bytes_total",help:"RPC sent"}),rpcSentCount:e.gauge({name:"gossipsub_rpc_sent_count_total",help:"RPC sent"}),rpcSentSubscription:e.gauge({name:"gossipsub_rpc_sent_subscription_total",help:"RPC sent"}),rpcSentMessage:e.gauge({name:"gossipsub_rpc_sent_message_total",help:"RPC sent"}),rpcSentControl:e.gauge({name:"gossipsub_rpc_sent_control_total",help:"RPC sent"}),rpcSentIHave:e.gauge({name:"gossipsub_rpc_sent_ihave_total",help:"RPC sent"}),rpcSentIWant:e.gauge({name:"gossipsub_rpc_sent_iwant_total",help:"RPC sent"}),rpcSentGraft:e.gauge({name:"gossipsub_rpc_sent_graft_total",help:"RPC sent"}),rpcSentPrune:e.gauge({name:"gossipsub_rpc_sent_prune_total",help:"RPC sent"}),msgPublishCount:e.gauge({name:"gossipsub_msg_publish_count_total",help:"Total count of msg published by topic",labelNames:["topic"]}),msgPublishPeersByTopic:e.gauge({name:"gossipsub_msg_publish_peers_total",help:"Total count of peers that we publish a msg to",labelNames:["topic"]}),directPeersPublishedTotal:e.gauge({name:"gossipsub_direct_peers_published_total",help:"Total direct peers that we publish a msg to",labelNames:["topic"]}),floodsubPeersPublishedTotal:e.gauge({name:"gossipsub_floodsub_peers_published_total",help:"Total floodsub peers that we publish a msg to",labelNames:["topic"]}),meshPeersPublishedTotal:e.gauge({name:"gossipsub_mesh_peers_published_total",help:"Total mesh peers that we publish a msg to",labelNames:["topic"]}),fanoutPeersPublishedTotal:e.gauge({name:"gossipsub_fanout_peers_published_total",help:"Total fanout peers that we publish a msg to",labelNames:["topic"]}),msgPublishBytes:e.gauge({name:"gossipsub_msg_publish_bytes_total",help:"Total count of msg publish data.length bytes",labelNames:["topic"]}),msgPublishTime:e.histogram({name:"gossipsub_msg_publish_seconds",help:"Total time in seconds to publish a message",buckets:[.001,.002,.005,.01,.1,.5,1],labelNames:["topic"]}),msgForwardCount:e.gauge({name:"gossipsub_msg_forward_count_total",help:"Total count of msg forwarded by topic",labelNames:["topic"]}),msgForwardPeers:e.gauge({name:"gossipsub_msg_forward_peers_total",help:"Total count of peers that we forward a msg to",labelNames:["topic"]}),msgReceivedPreValidation:e.gauge({name:"gossipsub_msg_received_prevalidation_total",help:"Total count of recv msgs before any validation",labelNames:["topic"]}),msgReceivedError:e.gauge({name:"gossipsub_msg_received_error_total",help:"Total count of recv msgs error",labelNames:["topic"]}),prevalidationInvalidTotal:e.gauge({name:"gossipsub_pre_validation_invalid_total",help:"Total count of invalid messages received",labelNames:["topic"]}),prevalidationValidTotal:e.gauge({name:"gossipsub_pre_validation_valid_total",help:"Total count of valid messages received",labelNames:["topic"]}),prevalidationDuplicateTotal:e.gauge({name:"gossipsub_pre_validation_duplicate_total",help:"Total count of duplicate messages received",labelNames:["topic"]}),prevalidationUnknownTotal:e.gauge({name:"gossipsub_pre_validation_unknown_status_total",help:"Total count of unknown_status messages received",labelNames:["topic"]}),msgReceivedInvalid:e.gauge({name:"gossipsub_msg_received_invalid_total",help:"Tracks specific reason of invalid",labelNames:["error"]}),msgReceivedInvalidByTopic:e.gauge({name:"gossipsub_msg_received_invalid_by_topic_total",help:"Tracks specific invalid message by topic",labelNames:["topic"]}),duplicateMsgDeliveryDelay:e.histogram({name:"gossisub_duplicate_msg_delivery_delay_seconds",help:"Time since the 1st duplicated message validated",labelNames:["topic"],buckets:[.25*n.maxMeshMessageDeliveriesWindowSec,.5*n.maxMeshMessageDeliveriesWindowSec,Number(n.maxMeshMessageDeliveriesWindowSec),2*n.maxMeshMessageDeliveriesWindowSec,4*n.maxMeshMessageDeliveriesWindowSec]}),duplicateMsgLateDelivery:e.gauge({name:"gossisub_duplicate_msg_late_delivery_total",help:"Total count of late duplicate message delivery by topic, which triggers P3 penalty",labelNames:["topic"]}),duplicateMsgIgnored:e.gauge({name:"gossisub_ignored_published_duplicate_msgs_total",help:"Total count of published duplicate message ignored by topic",labelNames:["topic"]}),scoreFnCalls:e.gauge({name:"gossipsub_score_fn_calls_total",help:"Total times score() is called"}),scoreFnRuns:e.gauge({name:"gossipsub_score_fn_runs_total",help:"Total times score() call actually computed computeScore(), no cache"}),scoreCachedDelta:e.histogram({name:"gossipsub_score_cache_delta",help:"Delta of score between cached values that expired",buckets:[10,100,1e3]}),peersByScoreThreshold:e.gauge({name:"gossipsub_peers_by_score_threshold_count",help:"Current count of peers by score threshold",labelNames:["threshold"]}),score:e.avgMinMax({name:"gossipsub_score",help:"Avg min max of gossip scores"}),scoreWeights:e.avgMinMax({name:"gossipsub_score_weights",help:"Separate score weights",labelNames:["topic","p"]}),scorePerMesh:e.avgMinMax({name:"gossipsub_score_per_mesh",help:"Histogram of the scores for each mesh topic",labelNames:["topic"]}),scoringPenalties:e.gauge({name:"gossipsub_scoring_penalties_total",help:"A counter of the kind of penalties being applied to peers",labelNames:["penalty"]}),behaviourPenalty:e.histogram({name:"gossipsub_peer_stat_behaviour_penalty",help:"Current peer stat behaviour_penalty at each scrape",buckets:[.25*n.behaviourPenaltyThreshold,.5*n.behaviourPenaltyThreshold,Number(n.behaviourPenaltyThreshold),2*n.behaviourPenaltyThreshold,4*n.behaviourPenaltyThreshold]}),ihaveRcvIgnored:e.gauge({name:"gossipsub_ihave_rcv_ignored_total",help:"Total received IHAVE messages that we ignore for some reason",labelNames:["reason"]}),ihaveRcvMsgids:e.gauge({name:"gossipsub_ihave_rcv_msgids_total",help:"Total received IHAVE messages by topic",labelNames:["topic"]}),ihaveRcvNotSeenMsgids:e.gauge({name:"gossipsub_ihave_rcv_not_seen_msgids_total",help:"Total messages per topic we do not have, not actual requests",labelNames:["topic"]}),iwantRcvMsgids:e.gauge({name:"gossipsub_iwant_rcv_msgids_total",help:"Total received IWANT messages by topic",labelNames:["topic"]}),iwantRcvDonthaveMsgids:e.gauge({name:"gossipsub_iwant_rcv_dont_have_msgids_total",help:"Total requested messageIDs that we do not have"}),iwantPromiseStarted:e.gauge({name:"gossipsub_iwant_promise_sent_total",help:"Total count of started IWANT promises"}),iwantPromiseResolved:e.gauge({name:"gossipsub_iwant_promise_resolved_total",help:"Total count of resolved IWANT promises"}),iwantPromiseResolvedFromDuplicate:e.gauge({name:"gossipsub_iwant_promise_resolved_from_duplicate_total",help:"Total count of resolved IWANT promises from duplicate messages"}),iwantPromiseResolvedPeers:e.gauge({name:"gossipsub_iwant_promise_resolved_peers",help:"Total count of peers we have asked IWANT promises that are resolved"}),iwantPromiseBroken:e.gauge({name:"gossipsub_iwant_promise_broken",help:"Total count of broken IWANT promises"}),iwantMessagePruned:e.gauge({name:"gossipsub_iwant_message_pruned",help:"Total count of pruned IWANT messages"}),iwantPromiseDeliveryTime:e.histogram({name:"gossipsub_iwant_promise_delivery_seconds",help:"Histogram of delivery time of resolved IWANT promises",buckets:[.5*n.gossipPromiseExpireSec,Number(n.gossipPromiseExpireSec),2*n.gossipPromiseExpireSec,4*n.gossipPromiseExpireSec]}),iwantPromiseUntracked:e.gauge({name:"gossip_iwant_promise_untracked",help:"Total count of untracked IWANT promise"}),connectedPeersBackoffSec:e.histogram({name:"gossipsub_connected_peers_backoff_seconds",help:"Backoff time in seconds",buckets:[1,2,4,10,20,60,120]}),cacheSize:e.gauge({name:"gossipsub_cache_size",help:"Unbounded cache sizes",labelNames:["cache"]}),mcacheSize:e.gauge({name:"gossipsub_mcache_size",help:"Current mcache msg count"}),mcacheNotValidatedCount:e.gauge({name:"gossipsub_mcache_not_validated_count",help:"Current mcache msg count not validated"}),fastMsgIdCacheCollision:e.gauge({name:"gossipsub_fastmsgid_cache_collision_total",help:"Total count of key collisions on fastmsgid cache put"}),newConnectionCount:e.gauge({name:"gossipsub_new_connection_total",help:"Total new connection by status",labelNames:["status"]}),topicStrToLabel:t,toTopic(e){return this.topicStrToLabel.get(e)??e},onJoin(e){this.topicSubscriptionStatus.set({topicStr:e},1),this.meshPeerCounts.set({topicStr:e},0)},onLeave(e){this.topicSubscriptionStatus.set({topicStr:e},0),this.meshPeerCounts.set({topicStr:e},0)},onAddToMesh(e,t,n){const r=this.toTopic(e);switch(t){case Qb.Fanout:this.meshPeerInclusionEventsFanout.inc({topic:r},n);break;case Qb.Random:this.meshPeerInclusionEventsRandom.inc({topic:r},n);break;case Qb.Subscribed:this.meshPeerInclusionEventsSubscribed.inc({topic:r},n);break;case Qb.Outbound:this.meshPeerInclusionEventsOutbound.inc({topic:r},n);break;case Qb.NotEnough:this.meshPeerInclusionEventsNotEnough.inc({topic:r},n);break;case Qb.Opportunistic:this.meshPeerInclusionEventsOpportunistic.inc({topic:r},n);break;default:this.meshPeerInclusionEventsUnknown.inc({topic:r},n)}},onRemoveFromMesh(e,t,n){const r=this.toTopic(e);switch(t){case Jb.Dc:this.meshPeerChurnEventsDisconnected.inc({topic:r},n);break;case Jb.BadScore:this.meshPeerChurnEventsBadScore.inc({topic:r},n);break;case Jb.Prune:this.meshPeerChurnEventsPrune.inc({topic:r},n);break;case Jb.Excess:this.meshPeerChurnEventsExcess.inc({topic:r},n);break;default:this.meshPeerChurnEventsUnknown.inc({topic:r},n)}},onReportValidation(e,t,n){if(this.asyncValidationMcacheHit.inc({hit:null!=e?"hit":"miss"}),null!=e){const n=this.toTopic(e.message.topic);switch(t){case cn.Accept:this.acceptedMessagesTotal.inc({topic:n});break;case cn.Ignore:this.ignoredMessagesTotal.inc({topic:n});break;case cn.Reject:this.rejectedMessagesTotal.inc({topic:n});break;default:this.unknownValidationResultsTotal.inc({topic:n})}}null!=n?this.asyncValidationDelayFromFirstSeenSec.observe((Date.now()-n)/1e3):this.asyncValidationUnknownFirstSeen.inc()},onScorePenalty(e){this.scoringPenalties.inc({penalty:e},1)},onIhaveRcv(e,t,n){const r=this.toTopic(e);this.ihaveRcvMsgids.inc({topic:r},t),this.ihaveRcvNotSeenMsgids.inc({topic:r},n)},onIwantRcv(e,t){for(const[t,n]of e){const e=this.toTopic(t);this.iwantRcvMsgids.inc({topic:e},n)}this.iwantRcvDonthaveMsgids.inc(t)},onForwardMsg(e,t){const n=this.toTopic(e);this.msgForwardCount.inc({topic:n},1),this.msgForwardPeers.inc({topic:n},t)},onPublishMsg(e,t,n,r,s){const i=this.toTopic(e);this.msgPublishCount.inc({topic:i},1),this.msgPublishBytes.inc({topic:i},n*r),this.msgPublishPeersByTopic.inc({topic:i},n),this.directPeersPublishedTotal.inc({topic:i},t.direct),this.floodsubPeersPublishedTotal.inc({topic:i},t.floodsub),this.meshPeersPublishedTotal.inc({topic:i},t.mesh),this.fanoutPeersPublishedTotal.inc({topic:i},t.fanout),this.msgPublishTime.observe({topic:i},s/1e3)},onMsgRecvPreValidation(e){const t=this.toTopic(e);this.msgReceivedPreValidation.inc({topic:t},1)},onMsgRecvError(e){const t=this.toTopic(e);this.msgReceivedError.inc({topic:t},1)},onPrevalidationResult(e,t){const n=this.toTopic(e);switch(t){case Gb.duplicate:this.prevalidationDuplicateTotal.inc({topic:n});break;case Gb.invalid:this.prevalidationInvalidTotal.inc({topic:n});break;case Gb.valid:this.prevalidationValidTotal.inc({topic:n});break;default:this.prevalidationUnknownTotal.inc({topic:n})}},onMsgRecvInvalid(e,t){const n=this.toTopic(e),r=t.reason===Wb.Error?t.error:t.reason;this.msgReceivedInvalid.inc({error:r},1),this.msgReceivedInvalidByTopic.inc({topic:n},1)},onDuplicateMsgDelivery(e,t,n){const r=this.toTopic(e);this.duplicateMsgDeliveryDelay.observe({topic:r},t/1e3),n&&this.duplicateMsgLateDelivery.inc({topic:r},1)},onPublishDuplicateMsg(e){const t=this.toTopic(e);this.duplicateMsgIgnored.inc({topic:t},1)},onPeerReadStreamError(){this.peerReadStreamError.inc(1)},onRpcRecvError(){this.rpcRecvError.inc(1)},onRpcDataError(){this.rpcDataError.inc(1)},onRpcRecv(e,t){this.rpcRecvBytes.inc(t),this.rpcRecvCount.inc(1),null!=e.subscriptions&&this.rpcRecvSubscription.inc(e.subscriptions.length),null!=e.messages&&this.rpcRecvMessage.inc(e.messages.length),null!=e.control&&(this.rpcRecvControl.inc(1),null!=e.control.ihave&&this.rpcRecvIHave.inc(e.control.ihave.length),null!=e.control.iwant&&this.rpcRecvIWant.inc(e.control.iwant.length),null!=e.control.graft&&this.rpcRecvGraft.inc(e.control.graft.length),null!=e.control.prune&&this.rpcRecvPrune.inc(e.control.prune.length))},onRpcSent(e,t){if(this.rpcSentBytes.inc(t),this.rpcSentCount.inc(1),null!=e.subscriptions&&this.rpcSentSubscription.inc(e.subscriptions.length),null!=e.messages&&this.rpcSentMessage.inc(e.messages.length),null!=e.control){const t=e.control.ihave?.length??0,n=e.control.iwant?.length??0,r=e.control.graft?.length??0,s=e.control.prune?.length??0;t>0&&this.rpcSentIHave.inc(t),n>0&&this.rpcSentIWant.inc(n),r>0&&this.rpcSentGraft.inc(r),s>0&&this.rpcSentPrune.inc(s),(t>0||n>0||r>0||s>0)&&this.rpcSentControl.inc(1)}},registerScores(e,t){let n=0,r=0,s=0,i=0;for(const o of e)o>=t.graylistThreshold&&n++,o>=t.publishThreshold&&r++,o>=t.gossipThreshold&&s++,o>=0&&i++;this.peersByScoreThreshold.set({threshold:ev.graylist},n),this.peersByScoreThreshold.set({threshold:ev.publish},r),this.peersByScoreThreshold.set({threshold:ev.gossip},s),this.peersByScoreThreshold.set({threshold:ev.mesh},i),this.score.set(e)},registerScoreWeights(e){for(const[t,n]of e.byTopic)this.scoreWeights.set({topic:t,p:"p1"},n.p1w),this.scoreWeights.set({topic:t,p:"p2"},n.p2w),this.scoreWeights.set({topic:t,p:"p3"},n.p3w),this.scoreWeights.set({topic:t,p:"p3b"},n.p3bw),this.scoreWeights.set({topic:t,p:"p4"},n.p4w);this.scoreWeights.set({p:"p5"},e.p5w),this.scoreWeights.set({p:"p6"},e.p6w),this.scoreWeights.set({p:"p7"},e.p7w)},registerScorePerMesh(e,t){const n=new Map;e.forEach(((e,t)=>{const r=this.topicStrToLabel.get(t)??"unknown";let s=n.get(r);null==s&&(s=new Set,n.set(r,s)),e.forEach((e=>s?.add(e)))}));for(const[e,r]of n){const n=[];r.forEach((e=>{n.push(t.get(e)??0)})),this.scorePerMesh.set({topic:e},n)}}}}(t.metricsRegister,t.metricsTopicStrToLabel,{gossipPromiseExpireSec:this.opts.gossipsubIWantFollowupMs/1e3,behaviourPenaltyThreshold:n.scoreParams.behaviourPenaltyThreshold,maxMeshMessageDeliveriesWindowSec:e/1e3});r.mcacheSize.addCollect((()=>{this.onScrapeMetrics(r)}));for(const e of this.multicodecs)r.protocolsEnabled.set({protocol:e},1);this.metrics=r}else this.metrics=null;this.gossipTracer=new Ev(this.opts.gossipsubIWantFollowupMs,this.msgIdToStrFn,this.metrics),this.score=new yv(this.opts.scoreParams,this.metrics,this.components.logger,{scoreCacheValidityMs:n.heartbeatInterval}),this.maxInboundStreams=t.maxInboundStreams,this.maxOutboundStreams=t.maxOutboundStreams,this.runOnTransientConnection=t.runOnTransientConnection,this.allowedTopics=null!=n.allowedTopics?new Set(n.allowedTopics):null}getPeers(){return[...this.peers.keys()].map((e=>bs(e)))}isStarted(){return this.status.code===Pv.started}async start(){if(this.isStarted())return;this.log("starting"),this.publishConfig=await async function(e,t){switch(e){case on:{if(null==t)throw Error("Must provide PeerId");if(null==t.privateKey)throw Error("Cannot sign message, no private key present");if(null==t.publicKey)throw Error("Cannot sign message, no public key present");const e=await Ul(t.privateKey);return{type:zb.Signing,author:t,key:t.publicKey,privateKey:e}}case an:return{type:zb.Anonymous};default:throw new Error(`Unknown signature policy "${e}"`)}}(this.globalSignaturePolicy,this.components.peerId),this.outboundInflightQueue=hr({objectMode:!0}),pr(this.outboundInflightQueue,(async e=>{for await(const{peerId:t,connection:n}of e)await this.createOutboundStream(t,n)})).catch((e=>{this.log.error("outbound inflight queue error",e)})),await Promise.all(this.opts.directPeers.map((async e=>{await this.components.peerStore.merge(e.id,{multiaddrs:e.addrs})})));const e=this.components.registrar;await Promise.all(this.multicodecs.map((async t=>e.handle(t,this.onIncomingStream.bind(this),{maxInboundStreams:this.maxInboundStreams,maxOutboundStreams:this.maxOutboundStreams,runOnTransientConnection:this.runOnTransientConnection}))));const t={onConnect:this.onPeerConnected.bind(this),onDisconnect:this.onPeerDisconnected.bind(this),notifyOnTransient:this.runOnTransientConnection},n=await Promise.all(this.multicodecs.map((async n=>e.register(n,t)))),r=setTimeout(this.runHeartbeat,100);this.status={code:Pv.started,registrarTopologyIds:n,heartbeatTimeout:r,hearbeatStartMs:Date.now()+100},this.score.start(),this.directPeerInitial=setTimeout((()=>{Promise.resolve().then((async()=>{await Promise.all(Array.from(this.direct).map((async e=>this.connect(e))))})).catch((e=>{this.log(e)}))}),1e3),this.opts.tagMeshPeers&&(this.addEventListener("gossipsub:graft",this.tagMeshPeer),this.addEventListener("gossipsub:prune",this.untagMeshPeer)),this.log("started")}async stop(){if(this.log("stopping"),this.status.code!==Pv.started)return;const{registrarTopologyIds:e}=this.status;this.status={code:Pv.stopped},this.opts.tagMeshPeers&&(this.removeEventListener("gossipsub:graft",this.tagMeshPeer),this.removeEventListener("gossipsub:prune",this.untagMeshPeer));const t=this.components.registrar;await Promise.all(this.multicodecs.map((async e=>t.unhandle(e)))),e.forEach((e=>{t.unregister(e)})),this.outboundInflightQueue.end();const n=[];for(const e of this.streamsOutbound.values())n.push(e.close());this.streamsOutbound.clear();for(const e of this.streamsInbound.values())n.push(e.close());this.streamsInbound.clear(),await Promise.all(n),this.peers.clear(),this.subscriptions.clear(),null!=this.heartbeatTimer&&(this.heartbeatTimer.cancel(),this.heartbeatTimer=null),this.score.stop(),this.mesh.clear(),this.fanout.clear(),this.fanoutLastpub.clear(),this.gossip.clear(),this.control.clear(),this.peerhave.clear(),this.iasked.clear(),this.backoff.clear(),this.outbound.clear(),this.gossipTracer.clear(),this.seenCache.clear(),null!=this.fastMsgIdCache&&this.fastMsgIdCache.clear(),null!=this.directPeerInitial&&clearTimeout(this.directPeerInitial),this.log("stopped")}dumpPeerScoreStats(){return this.score.dumpPeerScoreStats()}onIncomingStream({stream:e,connection:t}){if(!this.isStarted())return;const n=t.remotePeer;this.addPeer(n,t.direction,t.remoteAddr),this.createInboundStream(n,e),this.outboundInflightQueue.push({peerId:n,connection:t})}onPeerConnected(e,t){this.metrics?.newConnectionCount.inc({status:t.status}),this.isStarted()&&"open"===t.status&&(this.addPeer(e,t.direction,t.remoteAddr),this.outboundInflightQueue.push({peerId:e,connection:t}))}onPeerDisconnected(e){this.log("connection ended %p",e),this.removePeer(e)}async createOutboundStream(e,t){if(!this.isStarted())return;const n=e.toString();if(this.peers.has(n)&&!this.streamsOutbound.has(n))try{const r=new bv(await t.newStream(this.multicodecs,{runOnTransientConnection:this.runOnTransientConnection}),(e=>{this.log.error("outbound pipe error",e)}),{maxBufferSize:this.opts.maxOutboundBufferSize});this.log("create outbound stream %p",e),this.streamsOutbound.set(n,r);const s=r.protocol;s===Ub&&this.floodsubPeers.add(n),this.metrics?.peersPerProtocol.inc({protocol:s},1),this.subscriptions.size>0&&(this.log("send subscriptions to",n),this.sendSubscriptions(n,Array.from(this.subscriptions),!0))}catch(e){this.log.error("createOutboundStream error",e)}}createInboundStream(e,t){if(!this.isStarted())return;const n=e.toString();if(!this.peers.has(n))return;const r=this.streamsInbound.get(n);void 0!==r&&(this.log("replacing existing inbound steam %s",n),r.close().catch((e=>{this.log.error(e)}))),this.log("create inbound stream %s",n);const s=new vv(t,{maxDataLength:this.opts.maxInboundDataLength});this.streamsInbound.set(n,s),this.pipePeerReadStream(e,s.source).catch((e=>{this.log(e)}))}addPeer(e,t,n){const r=e.toString();if(!this.peers.has(r)){this.log("new peer %p",e),this.peers.add(r),this.score.addPeer(r);const s=function(e){for(const t of e.tuples())switch(t[0]){case kv.ip4:case kv.ip6:return Un(t[0],t[1])}return null}(n);null!==s?this.score.addIP(r,s):this.log("Added peer has no IP in current address %s %s",r,n.toString()),this.outbound.has(r)||this.outbound.set(r,"outbound"===t)}}removePeer(e){const t=e.toString();if(!this.peers.has(t))return;this.log("delete peer %p",e),this.peers.delete(t);const n=this.streamsOutbound.get(t),r=this.streamsInbound.get(t);null!=n&&this.metrics?.peersPerProtocol.inc({protocol:n.protocol},-1),n?.close().catch((e=>{this.log.error(e)})),r?.close().catch((e=>{this.log.error(e)})),this.streamsOutbound.delete(t),this.streamsInbound.delete(t);for(const e of this.topics.values())e.delete(t);for(const[e,n]of this.mesh)n.delete(t)&&this.metrics?.onRemoveFromMesh(e,Jb.Dc,1);for(const e of this.fanout.values())e.delete(t);this.floodsubPeers.delete(t),this.gossip.delete(t),this.control.delete(t),this.outbound.delete(t),this.score.removePeer(t),this.acceptFromWhitelist.delete(t)}get started(){return this.status.code===Pv.started}getMeshPeers(e){const t=this.mesh.get(e);return null!=t?Array.from(t):[]}getSubscribers(e){const t=this.topics.get(e);return(null!=t?Array.from(t):[]).map((e=>bs(e)))}getTopics(){return Array.from(this.subscriptions)}async pipePeerReadStream(e,t){try{await pr(t,(async t=>{for await(const n of t)try{const t=n.subarray(),r=qb.decode(t,{limits:{subscriptions:this.decodeRpcLimits.maxSubscriptions,messages:this.decodeRpcLimits.maxMessages,control$:{ihave:this.decodeRpcLimits.maxIhaveMessageIDs,iwant:this.decodeRpcLimits.maxIwantMessageIDs,graft:this.decodeRpcLimits.maxControlMessages,prune:this.decodeRpcLimits.maxControlMessages,prune$:{peers:this.decodeRpcLimits.maxPeerInfos}}}});if(this.metrics?.onRpcRecv(r,t.length),this.opts.awaitRpcHandler)try{await this.handleReceivedRpc(e,r)}catch(e){this.metrics?.onRpcRecvError(),this.log(e)}else this.handleReceivedRpc(e,r).catch((e=>{this.metrics?.onRpcRecvError(),this.log(e)}))}catch(e){this.metrics?.onRpcDataError(),this.log(e)}}))}catch(t){this.metrics?.onPeerReadStreamError(),this.handlePeerReadStreamError(t,e)}}handlePeerReadStreamError(e,t){this.log.error(e),this.onPeerDisconnected(t)}async handleReceivedRpc(e,t){if(!this.acceptFrom(e.toString()))return this.log("received message from unacceptable peer %p",e),void this.metrics?.rpcRecvNotAccepted.inc();const n=null!=t.subscriptions?t.subscriptions.length:0,r=null!=t.messages?t.messages.length:0;let s=0,i=0,o=0,a=0;if(null!=t.control&&(null!=t.control.ihave&&(s=t.control.ihave.length),null!=t.control.iwant&&(i=t.control.iwant.length),null!=t.control.graft&&(o=t.control.graft.length),null!=t.control.prune&&(a=t.control.prune.length)),this.log(`rpc.from ${e.toString()} subscriptions ${n} messages ${r} ihave ${s} iwant ${i} graft ${o} prune ${a}`),null!=t.subscriptions&&t.subscriptions.length>0){const n=[];t.subscriptions.forEach((t=>{const r=t.topic,s=!0===t.subscribe;if(null!=r){if(null!=this.allowedTopics&&!this.allowedTopics.has(r))return;this.handleReceivedSubscription(e,r,s),n.push({topic:r,subscribe:s})}})),this.safeDispatchEvent("subscription-change",{detail:{peerId:e,subscriptions:n}})}for(const n of t.messages){if(null!=this.allowedTopics&&!this.allowedTopics.has(n.topic))continue;const t=this.handleReceivedMessage(e,n).catch((e=>{this.metrics?.onMsgRecvError(n.topic),this.log(e)}));this.opts.awaitRpcMessageHandler&&await t}null!=t.control&&await this.handleControlMessage(e.toString(),t.control)}handleReceivedSubscription(e,t,n){this.log("subscription update from %p topic %s",e,t);let r=this.topics.get(t);null==r&&(r=new Set,this.topics.set(t,r)),n?r.add(e.toString()):r.delete(e.toString())}async handleReceivedMessage(e,t){this.metrics?.onMsgRecvPreValidation(t.topic);const n=await this.validateReceivedMessage(e,t);this.metrics?.onPrevalidationResult(t.topic,n.code);const r=n.code;switch(r){case Gb.duplicate:return this.score.duplicateMessage(e.toString(),n.msgIdStr,t.topic),this.gossipTracer.deliverMessage(n.msgIdStr,!0),void this.mcache.observeDuplicate(n.msgIdStr,e.toString());case Gb.invalid:if(null!=n.msgIdStr){const r=n.msgIdStr;this.score.rejectMessage(e.toString(),r,t.topic,n.reason),this.gossipTracer.rejectMessage(r,n.reason)}else this.score.rejectInvalidMessage(e.toString(),t.topic);return void this.metrics?.onMsgRecvInvalid(t.topic,n);case Gb.valid:if(this.score.validateMessage(n.messageId.msgIdStr),this.gossipTracer.deliverMessage(n.messageId.msgIdStr),this.mcache.put(n.messageId,t,!this.opts.asyncValidation),this.subscriptions.has(t.topic)){this.components.peerId.equals(e)&&!this.opts.emitSelf||(super.dispatchEvent(new wn("gossipsub:message",{detail:{propagationSource:e,msgId:n.messageId.msgIdStr,msg:n.msg}})),super.dispatchEvent(new wn("message",{detail:n.msg})))}this.opts.asyncValidation||this.forwardMessage(n.messageId.msgIdStr,t,e.toString());break;default:throw new Error(`Invalid validation result: ${r}`)}}async validateReceivedMessage(e,t){const n=this.fastMsgIdFn?.(t),r=void 0!==n?this.fastMsgIdCache?.get(n):void 0;if(null!=r)return{code:Gb.duplicate,msgIdStr:r};const s=await async function(e,t){switch(e){case an:return null!=t.signature?{valid:!1,error:jb.SignaturePresent}:null!=t.seqno?{valid:!1,error:jb.SeqnoPresent}:null!=t.key?{valid:!1,error:jb.FromPresent}:{valid:!0,message:{type:"unsigned",topic:t.topic,data:t.data??new Uint8Array(0)}};case on:{if(null==t.seqno)return{valid:!1,error:jb.InvalidSeqno};if(8!==t.seqno.length)return{valid:!1,error:jb.InvalidSeqno};if(null==t.signature)return{valid:!1,error:jb.InvalidSignature};if(null==t.from)return{valid:!1,error:jb.InvalidPeerId};let e,n;try{e=vs(t.from)}catch(e){return{valid:!1,error:jb.InvalidPeerId}}if(null!=t.key){if(n=Ll(t.key),void 0!==e.publicKey&&!Sn(n.bytes,e.publicKey))return{valid:!1,error:jb.InvalidPeerId}}else{if(null==e.publicKey)return{valid:!1,error:jb.InvalidPeerId};n=Ll(e.publicKey)}const r={from:t.from,data:t.data,seqno:t.seqno,topic:t.topic,signature:void 0,key:void 0},s=_n([Sv,qb.Message.encode(r)]);return await n.verify(s,t.signature)?{valid:!0,message:{type:"signed",from:e,data:t.data??new Uint8Array(0),sequenceNumber:BigInt(`0x${Gt(t.seqno,"base16")}`),topic:t.topic,signature:t.signature,key:t.key??Bl(n)}}:{valid:!1,error:jb.InvalidSignature}}default:throw new Error("Unreachable")}}(this.globalSignaturePolicy,t);if(!s.valid)return{code:Gb.invalid,reason:Wb.Error,error:s.error};const i=s.message;try{null!=this.dataTransform&&(i.data=this.dataTransform.inboundTransform(t.topic,i.data))}catch(e){return this.log("Invalid message, transform failed",e),{code:Gb.invalid,reason:Wb.Error,error:jb.TransformFailed}}const o=await this.msgIdFn(i),a=this.msgIdToStrFn(o),c={msgId:o,msgIdStr:a};if(void 0!==n&&null!=this.fastMsgIdCache){this.fastMsgIdCache.put(n,a)&&this.metrics?.fastMsgIdCacheCollision.inc()}if(this.seenCache.has(a))return{code:Gb.duplicate,msgIdStr:a};this.seenCache.put(a);const l=this.topicValidators.get(t.topic);if(null!=l){let t;try{t=await l(e,i)}catch(e){const n=e.code;"ERR_TOPIC_VALIDATOR_IGNORE"===n&&(t=cn.Ignore),t="ERR_TOPIC_VALIDATOR_REJECT"===n?cn.Reject:cn.Ignore}if(t!==cn.Accept)return{code:Gb.invalid,reason:nv(t),msgIdStr:a}}return{code:Gb.valid,messageId:c,msg:i}}getScore(e){return this.score.score(e)}sendSubscriptions(e,t,n){this.sendRpc(e,{subscriptions:t.map((e=>({topic:e,subscribe:n}))),messages:[]})}async handleControlMessage(e,t){if(void 0===t)return;const n=null!=t.ihave?this.handleIHave(e,t.ihave):[],r=null!=t.iwant?this.handleIWant(e,t.iwant):[],s=null!=t.graft?await this.handleGraft(e,t.graft):[];if(null!=t.prune&&await this.handlePrune(e,t.prune),0===n.length&&0===r.length&&0===s.length)return;const i=this.sendRpc(e,_v(r,{iwant:n,prune:s})),o=n[0]?.messageIDs;null!=o&&(i?this.gossipTracer.addPromise(e,o):this.metrics?.iwantPromiseUntracked.inc(1))}acceptFrom(e){if(this.direct.has(e))return!0;const t=Date.now(),n=this.acceptFromWhitelist.get(e);if(null!=n&&n.messagesAccepted<128&&n.acceptUntil>=t)return n.messagesAccepted+=1,!0;const r=this.score.score(e);return r>=0?this.acceptFromWhitelist.set(e,{messagesAccepted:0,acceptUntil:t+1e3}):this.acceptFromWhitelist.delete(e),r>=this.opts.scoreThresholds.graylistThreshold}handleIHave(e,t){if(0===t.length)return[];const n=this.score.score(e);if(n<this.opts.scoreThresholds.gossipThreshold)return this.log("IHAVE: ignoring peer %s with score below threshold [ score = %d ]",e,n),this.metrics?.ihaveRcvIgnored.inc({reason:Xb.LowScore}),[];const r=(this.peerhave.get(e)??0)+1;if(this.peerhave.set(e,r),r>10)return this.log("IHAVE: peer %s has advertised too many times (%d) within this heartbeat interval; ignoring",e,r),this.metrics?.ihaveRcvIgnored.inc({reason:Xb.MaxIhave}),[];const s=this.iasked.get(e)??0;if(s>=Kb)return this.log("IHAVE: peer %s has already advertised too many messages (%d); ignoring",e,s),this.metrics?.ihaveRcvIgnored.inc({reason:Xb.MaxIasked}),[];const i=new Map;if(t.forEach((({topicID:e,messageIDs:t})=>{if(null==e||null==t||!this.mesh.has(e))return;let n=0;t.forEach((e=>{const t=this.msgIdToStrFn(e);this.seenCache.has(t)||(i.set(t,e),n++)})),this.metrics?.onIhaveRcv(e,t.length,n)})),0===i.size)return[];let o=i.size;o+s>Kb&&(o=Kb-s),this.log("IHAVE: Asking for %d out of %d messages from %s",o,i.size,e);let a=Array.from(i.values());return Rv(a),a=a.slice(0,o),this.iasked.set(e,s+o),[{messageIDs:a}]}handleIWant(e,t){if(0===t.length)return[];const n=this.score.score(e);if(n<this.opts.scoreThresholds.gossipThreshold)return this.log("IWANT: ignoring peer %s with score below threshold [score = %d]",e,n),[];const r=new Map,s=new Map;let i=0;return t.forEach((({messageIDs:t})=>{t?.forEach((t=>{const n=this.msgIdToStrFn(t),o=this.mcache.getWithIWantCount(n,e);null!=o?(s.set(o.msg.topic,1+(s.get(o.msg.topic)??0)),o.count>3?this.log("IWANT: Peer %s has asked for message %s too many times: ignoring request",e,t):r.set(n,o.msg)):i++}))})),this.metrics?.onIwantRcv(s,i),0===r.size?(this.log("IWANT: Could not provide any wanted messages to %s",e),[]):(this.log("IWANT: Sending %d messages to %s",r.size,e),Array.from(r.values()))}async handleGraft(e,t){const n=[],r=this.score.score(e),s=Date.now();let i=this.opts.doPX;if(t.forEach((({topicID:t})=>{if(null==t)return;const o=this.mesh.get(t);if(null==o)return void(i=!1);if(o.has(e))return;const a=this.backoff.get(t)?.get(e);if(this.direct.has(e))this.log("GRAFT: ignoring request from direct peer %s",e),n.push(t),i=!1;else if("number"==typeof a&&s<a){this.log("GRAFT: ignoring backed off peer %s",e),this.score.addPenalty(e,1,Zb.GraftBackoff),i=!1;const r=a+this.opts.graftFloodThreshold-this.opts.pruneBackoff;s<r&&this.score.addPenalty(e,1,Zb.GraftBackoff),this.addBackoff(e,t),n.push(t)}else r<0?(this.log("GRAFT: ignoring peer %s with negative score: score=%d, topic=%s",e,r,t),n.push(t),i=!1,this.addBackoff(e,t)):o.size>=this.opts.Dhi&&!this.outbound.get(e)?(n.push(t),this.addBackoff(e,t)):(this.log("GRAFT: Add mesh link from %s in %s",e,t),this.score.graft(e,t),o.add(e),this.metrics?.onAddToMesh(t,Qb.Subscribed,1));this.safeDispatchEvent("gossipsub:graft",{detail:{peerId:e,topic:t,direction:"inbound"}})})),0===n.length)return[];return Promise.all(n.map((async t=>this.makePrune(e,t,i,false))))}async handlePrune(e,t){const n=this.score.score(e);for(const{topicID:r,backoff:s,peers:i}of t){if(null==r)continue;const t=this.mesh.get(r);if(null==t)return;this.log("PRUNE: Remove mesh link to %s in %s",e,r),this.score.prune(e,r),t.has(e)&&(t.delete(e),this.metrics?.onRemoveFromMesh(r,Jb.Prune,1)),"number"==typeof s&&s>0?this.doAddBackoff(e,r,1e3*s):this.addBackoff(e,r),null!=i&&i.length>0&&(n<this.opts.scoreThresholds.acceptPXThreshold?this.log("PRUNE: ignoring PX from peer %s with insufficient score [score = %d, topic = %s]",e,n,r):await this.pxConnect(i)),this.safeDispatchEvent("gossipsub:prune",{detail:{peerId:e,topic:r,direction:"inbound"}})}}addBackoff(e,t){this.doAddBackoff(e,t,this.opts.pruneBackoff)}doAddBackoff(e,t,n){let r=this.backoff.get(t);null==r&&(r=new Map,this.backoff.set(t,r));const s=Date.now()+n;(r.get(e)??0)<s&&r.set(e,s)}applyIwantPenalties(){this.gossipTracer.getBrokenPromises().forEach(((e,t)=>{this.log("peer %s didn't follow up in %d IWANT requests; adding penalty",t,e),this.score.addPenalty(t,e,Zb.BrokenPromise)}))}clearBackoff(){if(this.heartbeatTicks%15!=0)return;const e=Date.now();this.backoff.forEach(((t,n)=>{t.forEach(((n,r)=>{n+1*this.opts.heartbeatInterval<e&&t.delete(r)})),0===t.size&&this.backoff.delete(n)}))}async directConnect(){const e=[];this.direct.forEach((t=>{this.streamsOutbound.has(t)||e.push(t)})),await Promise.all(e.map((async e=>this.connect(e))))}async pxConnect(e){e.length>this.opts.prunePeers&&(Rv(e),e=e.slice(0,this.opts.prunePeers));const t=[];await Promise.all(e.map((async e=>{if(null==e.peerID)return;const n=vs(e.peerID),r=n.toString();if(!this.peers.has(r))if(null!=e.signedPeerRecord)try{if(!await this.components.peerStore.consumePeerRecord(e.signedPeerRecord,n))return void this.log("bogus peer record obtained through px: could not add peer record to address book");t.push(r)}catch(e){this.log("bogus peer record obtained through px: invalid signature or not a peer record")}else t.push(r)}))),0!==t.length&&await Promise.all(t.map((async e=>this.connect(e))))}async connect(e){this.log("Initiating connection with %s",e);const t=bs(e),n=await this.components.connectionManager.openConnection(t);for(const e of this.multicodecs)for(const r of this.components.registrar.getTopologies(e))r.onConnect?.(t,n)}subscribe(e){if(this.status.code!==Pv.started)throw new Error("Pubsub has not started");if(!this.subscriptions.has(e)){this.subscriptions.add(e);for(const t of this.peers.keys())this.sendSubscriptions(t,[e],!0)}this.join(e)}unsubscribe(e){if(this.status.code!==Pv.started)throw new Error("Pubsub is not started");const t=this.subscriptions.delete(e);if(this.log("unsubscribe from %s - am subscribed %s",e,t),t)for(const t of this.peers.keys())this.sendSubscriptions(t,[e],!1);this.leave(e)}join(e){if(this.status.code!==Pv.started)throw new Error("Gossipsub has not started");if(this.mesh.has(e))return;this.log("JOIN %s",e),this.metrics?.onJoin(e);const t=new Set,n=this.backoff.get(e),r=this.fanout.get(e);if(null!=r&&(this.fanout.delete(e),this.fanoutLastpub.delete(e),r.forEach((e=>{this.direct.has(e)||!(this.score.score(e)>=0)||null!=n&&n.has(e)||t.add(e)})),this.metrics?.onAddToMesh(e,Qb.Fanout,t.size)),t.size<this.opts.D){const r=t.size;this.getRandomGossipPeers(e,this.opts.D,(e=>!t.has(e)&&!this.direct.has(e)&&this.score.score(e)>=0&&(null==n||!n.has(e)))).forEach((e=>{t.add(e)})),this.metrics?.onAddToMesh(e,Qb.Random,t.size-r)}this.mesh.set(e,t),t.forEach((t=>{this.log("JOIN: Add mesh link to %s in %s",t,e),this.sendGraft(t,e)}))}leave(e){if(this.status.code!==Pv.started)throw new Error("Gossipsub has not started");this.log("LEAVE %s",e),this.metrics?.onLeave(e);const t=this.mesh.get(e);null!=t&&(Promise.all(Array.from(t).map((async t=>{this.log("LEAVE: Remove mesh link to %s in %s",t,e),await this.sendPrune(t,e)}))).catch((e=>{this.log("Error sending prunes to mesh peers",e)})),this.mesh.delete(e))}selectPeersToForward(e,t,n){const r=new Set,s=this.topics.get(e);null!=s&&(this.direct.forEach((e=>{s.has(e)&&t!==e&&!n?.has(e)&&r.add(e)})),this.floodsubPeers.forEach((e=>{s.has(e)&&t!==e&&!n?.has(e)&&this.score.score(e)>=this.opts.scoreThresholds.publishThreshold&&r.add(e)})));const i=this.mesh.get(e);return null!=i&&i.size>0&&i.forEach((e=>{t===e||n?.has(e)||r.add(e)})),r}selectPeersToPublish(e){const t=new Set,n={direct:0,floodsub:0,mesh:0,fanout:0},r=this.topics.get(e);if(null!=r)if(this.opts.floodPublish)r.forEach((e=>{this.direct.has(e)?(t.add(e),n.direct++):this.score.score(e)>=this.opts.scoreThresholds.publishThreshold&&(t.add(e),n.floodsub++)}));else{this.direct.forEach((e=>{r.has(e)&&(t.add(e),n.direct++)})),this.floodsubPeers.forEach((e=>{r.has(e)&&this.score.score(e)>=this.opts.scoreThresholds.publishThreshold&&(t.add(e),n.floodsub++)}));const s=this.mesh.get(e);if(null!=s&&s.size>0)s.forEach((e=>{t.add(e),n.mesh++}));else{const r=this.fanout.get(e);if(null!=r&&r.size>0)r.forEach((e=>{t.add(e),n.fanout++}));else{const r=this.getRandomGossipPeers(e,this.opts.D,(e=>this.score.score(e)>=this.opts.scoreThresholds.publishThreshold));r.size>0&&(this.fanout.set(e,r),r.forEach((e=>{t.add(e),n.fanout++})))}this.fanoutLastpub.set(e,Date.now())}}return{tosend:t,tosendCount:n}}forwardMessage(e,t,n,r){null!=n&&this.score.deliverMessage(n,e,t.topic);const s=this.selectPeersToForward(t.topic,n,r);s.forEach((e=>{this.sendRpc(e,_v([t]))})),this.metrics?.onForwardMsg(t.topic,s.size)}async publish(e,t,n){const r=Date.now(),s=null!=this.dataTransform?this.dataTransform.outboundTransform(e,t):t;if(null==this.publishConfig)throw Error("PublishError.Uninitialized");const{raw:i,msg:o}=await async function(e,t,n,r){switch(e.type){case zb.Signing:{const s={from:e.author.toBytes(),data:r,seqno:Co(8),topic:t,signature:void 0,key:void 0},i=_n([Sv,qb.Message.encode(s)]);return s.signature=await e.privateKey.sign(i),s.key=e.key,{raw:s,msg:{type:"signed",from:e.author,data:n,sequenceNumber:BigInt(`0x${Gt(s.seqno,"base16")}`),topic:t,signature:s.signature,key:s.key}}}case zb.Anonymous:return{raw:{from:void 0,data:r,seqno:void 0,topic:t,signature:void 0,key:void 0},msg:{type:"unsigned",data:n,topic:t}};default:throw new Error("Unreachable")}}(this.publishConfig,e,t,s),a=await this.msgIdFn(o),c=this.msgIdToStrFn(a),l=n?.ignoreDuplicatePublishError??this.opts.ignoreDuplicatePublishError;if(this.seenCache.has(c)){if(l)return this.metrics?.onPublishDuplicateMsg(e),{recipients:[]};throw Error("PublishError.Duplicate")}const{tosend:u,tosendCount:h}=this.selectPeersToPublish(e),d=this.opts.emitSelf&&this.subscriptions.has(e),p=n?.allowPublishToZeroTopicPeers??this.opts.allowPublishToZeroTopicPeers;if(0===u.size&&!p&&!d)throw Error("PublishError.NoPeersSubscribedToTopic");this.seenCache.put(c),this.mcache.put({msgId:a,msgIdStr:c},i,!0),this.publishedMessageIds.put(c);const f=n?.batchPublish??this.opts.batchPublish,g=_v([i]);if(f)this.sendRpcInBatch(u,g);else for(const e of u){this.sendRpc(e,g)||u.delete(e)}const m=Date.now()-r;return this.metrics?.onPublishMsg(e,h,u.size,null!=i.data?i.data.length:0,m),d&&(u.add(this.components.peerId.toString()),super.dispatchEvent(new wn("gossipsub:message",{detail:{propagationSource:this.components.peerId,msgId:c,msg:o}})),super.dispatchEvent(new wn("message",{detail:o}))),{recipients:Array.from(u.values()).map((e=>bs(e)))}}sendRpcInBatch(e,t){const n=qb.encode(t),r=Nr.single(n);for(const s of e){const i=this.streamsOutbound.get(s);if(null!=i){try{i.pushPrefixed(r)}catch(t){e.delete(s),this.log.error(`Cannot send rpc to ${s}`,t)}this.metrics?.onRpcSent(t,n.length)}else this.log(`Cannot send RPC to ${s} as there is no open stream to it available`),e.delete(s)}}reportMessageValidationResult(e,t,n){let r;if(n===cn.Accept){if(r=this.mcache.validate(e),null!=r){const{message:n,originatingPeers:s}=r;this.score.deliverMessage(t,e,n.topic),this.forwardMessage(e,r.message,t,s)}}else if(r=this.mcache.remove(e),null!=r){const s=nv(n),{message:i,originatingPeers:o}=r;this.score.rejectMessage(t,e,i.topic,s);for(const t of o)this.score.rejectMessage(t,e,i.topic,s)}const s=this.score.messageFirstSeenTimestampMs(e);this.metrics?.onReportValidation(r,n,s)}sendGraft(e,t){const n=_v([],{graft:[{topicID:t}]});this.sendRpc(e,n)}async sendPrune(e,t){const n=_v([],{prune:[await this.makePrune(e,t,this.opts.doPX,!0)]});this.sendRpc(e,n)}sendRpc(e,t){const n=this.streamsOutbound.get(e);if(null==n)return this.log(`Cannot send RPC to ${e} as there is no open stream to it available`),!1;const r=this.control.get(e);null!=r&&(this.piggybackControl(e,t,r),this.control.delete(e));const s=this.gossip.get(e);null!=s&&(this.piggybackGossip(e,t,s),this.gossip.delete(e));const i=qb.encode(t);try{n.push(i)}catch(t){return this.log.error(`Cannot send rpc to ${e}`,t),null!=r&&this.control.set(e,r),null!=s&&this.gossip.set(e,s),!1}if(this.metrics?.onRpcSent(t,i.length),null!=t.control?.graft)for(const n of t.control?.graft)null!=n.topicID&&this.safeDispatchEvent("gossipsub:graft",{detail:{peerId:e,topic:n.topicID,direction:"outbound"}});if(null!=t.control?.prune)for(const n of t.control?.prune)null!=n.topicID&&this.safeDispatchEvent("gossipsub:prune",{detail:{peerId:e,topic:n.topicID,direction:"outbound"}});return!0}piggybackControl(e,t,n){const r=Iv(t);for(const t of n.graft)null!=t.topicID&&this.mesh.get(t.topicID)?.has(e)&&r.control.graft.push(t);for(const t of n.prune)null==t.topicID||this.mesh.get(t.topicID)?.has(e)||r.control.prune.push(t)}piggybackGossip(e,t,n){Iv(t).control.ihave=n}async sendGraftPrune(e,t,n){const r=this.opts.doPX,s=!1;for(const[i,o]of e){const e=o.map((e=>({topicID:e})));let a=[];const c=t.get(i);null!=c&&(a=await Promise.all(c.map((async e=>this.makePrune(i,e,r&&!n.get(i),s)))),t.delete(i)),this.sendRpc(i,_v([],{graft:e,prune:a}))}for(const[e,i]of t){const t=await Promise.all(i.map((async t=>this.makePrune(e,t,r&&!n.get(e),s))));this.sendRpc(e,_v([],{prune:t}))}}emitGossip(e){const t=this.mcache.getGossipIDs(new Set(e.keys()));for(const[n,r]of e)this.doEmitGossip(n,r,t.get(n)??[])}doEmitGossip(e,t,n){if(0===n.length)return;if(Rv(n),n.length>Kb&&this.log("too many messages for gossip; will truncate IHAVE list (%d messages)",n.length),0===t.size)return;let r=this.opts.Dlazy;const s=.25*t.size;let i=t;s>r&&(r=s),r>i.size?r=i.size:i=Rv(Array.from(i)).slice(0,r),i.forEach((t=>{let r=n;n.length>Kb&&(r=Rv(r.slice()).slice(0,Kb)),this.pushGossip(t,{topicID:e,messageIDs:r})}))}flush(){for(const[e,t]of this.gossip.entries())this.gossip.delete(e),this.sendRpc(e,_v([],{ihave:t}));for(const[e,t]of this.control.entries()){this.control.delete(e);const n=_v([],{graft:t.graft,prune:t.prune});this.sendRpc(e,n)}}pushGossip(e,t){this.log("Add gossip to %s",e);const n=this.gossip.get(e)??[];this.gossip.set(e,n.concat(t))}async makePrune(e,t,n,r){if(this.score.prune(e,t),this.streamsOutbound.get(e)?.protocol===Fb)return{topicID:t,peers:[]};const s=r?this.opts.unsubcribeBackoff:this.opts.pruneBackoff,i=s/1e3;if(this.doAddBackoff(e,t,s),!n)return{topicID:t,peers:[],backoff:i};const o=this.getRandomGossipPeers(t,this.opts.prunePeers,(t=>t!==e&&this.score.score(t)>=0)),a=await Promise.all(Array.from(o).map((async e=>{const t=bs(e);let n;try{n=await this.components.peerStore.get(t)}catch(e){if("ERR_NOT_FOUND"!==e.code)throw e}return{peerID:t.toBytes(),signedPeerRecord:n?.peerRecordEnvelope}})));return{topicID:t,peers:a,backoff:i}}runHeartbeat=()=>{const e=this.metrics?.heartbeatDuration.startTimer();this.heartbeat().catch((e=>{this.log("Error running heartbeat",e)})).finally((()=>{if(null!=e&&e(),this.status.code===Pv.started){clearTimeout(this.status.heartbeatTimeout);let e=this.opts.heartbeatInterval-(Date.now()-this.status.hearbeatStartMs)%this.opts.heartbeatInterval;e<.25*this.opts.heartbeatInterval&&(e+=this.opts.heartbeatInterval,this.metrics?.heartbeatSkipped.inc()),this.status.heartbeatTimeout=setTimeout(this.runHeartbeat,e)}}))};async heartbeat(){const{D:e,Dlo:t,Dhi:n,Dscore:r,Dout:s,fanoutTTL:i}=this.opts;this.heartbeatTicks++;const o=new Map,a=e=>{let t=o.get(e);return void 0===t&&(t=this.score.score(e),o.set(e,t)),t},c=new Map,l=new Map,u=new Map;this.clearBackoff(),this.peerhave.clear(),this.metrics?.cacheSize.set({cache:"iasked"},this.iasked.size),this.iasked.clear(),this.applyIwantPenalties(),this.heartbeatTicks%this.opts.directConnectTicks==0&&await this.directConnect(),this.fastMsgIdCache?.prune(),this.seenCache.prune(),this.gossipTracer.prune(),this.publishedMessageIds.prune();const h=new Map;this.mesh.forEach(((i,o)=>{const d=this.topics.get(o),p=new Set,f=new Set;if(h.set(o,f),null!=d){const e=Rv(Array.from(d)),t=this.backoff.get(o);for(const n of e){const e=this.streamsOutbound.get(n);if(null!=e&&this.multicodecs.includes(e.protocol)&&!i.has(n)&&!this.direct.has(n)){const e=a(n);(null==t||!t.has(n))&&e>=0&&p.add(n),e>=this.opts.scoreThresholds.gossipThreshold&&f.add(n)}}}const g=(e,t)=>{this.log("HEARTBEAT: Remove mesh link to %s in %s",e,o),this.addBackoff(e,o),i.delete(e),a(e)>=this.opts.scoreThresholds.gossipThreshold&&f.add(e),this.metrics?.onRemoveFromMesh(o,t,1);const n=l.get(e);null==n?l.set(e,[o]):n.push(o)},m=(e,t)=>{this.log("HEARTBEAT: Add mesh link to %s in %s",e,o),this.score.graft(e,o),i.add(e),f.delete(e),this.metrics?.onAddToMesh(o,t,1);const n=c.get(e);null==n?c.set(e,[o]):n.push(o)};if(i.forEach((e=>{const t=a(e);t<0&&(this.log("HEARTBEAT: Prune peer %s with negative score: score=%d, topic=%s",e,t,o),g(e,Jb.BadScore),u.set(e,!0))})),i.size<t){const t=function(e,t){return uv(e,t,(()=>!0))}(p,e-i.size);t.forEach((e=>{m(e,Qb.NotEnough)}))}if(i.size>n){let t=Array.from(i);t.sort(((e,t)=>a(t)-a(e))),t=t.slice(0,r).concat(Rv(t.slice(r)));let n=0;if(t.slice(0,e).forEach((e=>{this.outbound.get(e)&&n++})),n<s){const r=e=>{const n=t[e];for(let n=e;n>0;n--)t[n]=t[n-1];t[0]=n};if(n>0){let s=n;for(let n=1;n<e&&s>0;n++)this.outbound.get(t[n])&&(r(n),s--)}let s=e-n;for(let n=e;n<t.length&&s>0;n++)this.outbound.get(t[n])&&(r(n),s--)}t.slice(e).forEach((e=>{g(e,Jb.Excess)}))}if(i.size>=t){let e=0;if(i.forEach((t=>{this.outbound.get(t)&&e++})),e<s){uv(p,s-e,(e=>!0===this.outbound.get(e))).forEach((e=>{m(e,Qb.Outbound)}))}}if(this.heartbeatTicks%this.opts.opportunisticGraftTicks==0&&i.size>1){const e=Array.from(i).sort(((e,t)=>a(e)-a(t))),t=Math.floor(i.size/2),n=a(e[t]);if(n<this.opts.scoreThresholds.opportunisticGraftThreshold){const e=uv(p,this.opts.opportunisticGraftPeers,(e=>a(e)>n));for(const t of e)this.log("HEARTBEAT: Opportunistically graft peer %s on topic %s",t,o),m(t,Qb.Opportunistic)}}}));const d=Date.now();this.fanoutLastpub.forEach(((e,t)=>{e+i<d&&(this.fanout.delete(t),this.fanoutLastpub.delete(t))})),this.fanout.forEach(((t,n)=>{const r=this.topics.get(n);t.forEach((e=>{(!r?.has(e)||a(e)<this.opts.scoreThresholds.publishThreshold)&&t.delete(e)}));const s=this.topics.get(n),i=[],o=new Set;if(h.set(n,o),null!=s){const e=Rv(Array.from(s));for(const n of e){const e=this.streamsOutbound.get(n);if(null!=e&&this.multicodecs.includes(e.protocol)&&!t.has(n)&&!this.direct.has(n)){const e=a(n);e>=this.opts.scoreThresholds.publishThreshold&&i.push(n),e>=this.opts.scoreThresholds.gossipThreshold&&o.add(n)}}}if(t.size<e){const n=e-t.size;i.slice(0,n).forEach((e=>{t.add(e),o?.delete(e)}))}})),this.emitGossip(h),await this.sendGraftPrune(c,l,u),this.flush(),this.mcache.shift(),this.dispatchEvent(new wn("gossipsub:heartbeat"))}getRandomGossipPeers(e,t,n=(()=>!0)){const r=this.topics.get(e);if(null==r)return new Set;let s=[];return r.forEach((e=>{const t=this.streamsOutbound.get(e);null!=t&&this.multicodecs.includes(t.protocol)&&n(e)&&s.push(e)})),s=Rv(s),t>0&&s.length>t&&(s=s.slice(0,t)),new Set(s)}onScrapeMetrics(e){e.mcacheSize.set(this.mcache.size),e.mcacheNotValidatedCount.set(this.mcache.notValidatedCount),e.cacheSize.set({cache:"direct"},this.direct.size),e.cacheSize.set({cache:"seenCache"},this.seenCache.size),e.cacheSize.set({cache:"fastMsgIdCache"},this.fastMsgIdCache?.size??0),e.cacheSize.set({cache:"publishedMessageIds"},this.publishedMessageIds.size),e.cacheSize.set({cache:"mcache"},this.mcache.size),e.cacheSize.set({cache:"score"},this.score.size),e.cacheSize.set({cache:"gossipTracer.promises"},this.gossipTracer.size),e.cacheSize.set({cache:"gossipTracer.requests"},this.gossipTracer.requestMsByMsgSize),e.cacheSize.set({cache:"topics"},this.topics.size),e.cacheSize.set({cache:"subscriptions"},this.subscriptions.size),e.cacheSize.set({cache:"mesh"},this.mesh.size),e.cacheSize.set({cache:"fanout"},this.fanout.size),e.cacheSize.set({cache:"peers"},this.peers.size),e.cacheSize.set({cache:"streamsOutbound"},this.streamsOutbound.size),e.cacheSize.set({cache:"streamsInbound"},this.streamsInbound.size),e.cacheSize.set({cache:"acceptFromWhitelist"},this.acceptFromWhitelist.size),e.cacheSize.set({cache:"gossip"},this.gossip.size),e.cacheSize.set({cache:"control"},this.control.size),e.cacheSize.set({cache:"peerhave"},this.peerhave.size),e.cacheSize.set({cache:"outbound"},this.outbound.size);let t=0;const n=Date.now();e.connectedPeersBackoffSec.reset();for(const r of this.backoff.values()){t+=r.size;for(const[t,s]of r.entries())this.peers.has(t)&&e.connectedPeersBackoffSec.observe(Math.max(0,s-n)/1e3)}e.cacheSize.set({cache:"backoff"},t);for(const[t,n]of this.topics)e.topicPeersCount.set({topicStr:t},n.size);for(const[t,n]of this.mesh)e.meshPeerCounts.set({topicStr:t},n.size);const r=[],s=new Map;e.behaviourPenalty.reset();for(const t of this.peers.keys()){const n=this.score.score(t);r.push(n),s.set(t,n),e.behaviourPenalty.observe(this.score.peerStats.get(t)?.behaviourPenalty??0)}e.registerScores(r,this.opts.scoreThresholds),e.registerScorePerMesh(this.mesh,s);const i=function(e,t,n,r,s){const i={byTopic:new Map,p5w:[],p6w:[],p7w:[],score:[]};for(const o of e){const e=t.get(o);if(null!=e){const t=wv(o,e,n,r,s);for(const[e,n]of t.byTopic){let t=i.byTopic.get(e);null==t&&(t={p1w:[],p2w:[],p3w:[],p3bw:[],p4w:[]},i.byTopic.set(e,t)),t.p1w.push(n.p1w),t.p2w.push(n.p2w),t.p3w.push(n.p3w),t.p3bw.push(n.p3bw),t.p4w.push(n.p4w)}i.p5w.push(t.p5w),i.p6w.push(t.p6w),i.p7w.push(t.p7w),i.score.push(t.score)}else i.p5w.push(0),i.p6w.push(0),i.p7w.push(0),i.score.push(0)}return i}(this.peers.keys(),this.score.peerStats,this.score.params,this.score.peerIPs,e.topicStrToLabel);e.registerScoreWeights(i)}tagMeshPeer=e=>{const{peerId:t,topic:n}=e.detail;this.components.peerStore.merge(bs(t),{tags:{[n]:{value:100}}}).catch((e=>{this.log.error("Error tagging peer %s with topic %s",t,n,e)}))};untagMeshPeer=e=>{const{peerId:t,topic:n}=e.detail;this.components.peerStore.merge(bs(t),{tags:{[n]:void 0}}).catch((e=>{this.log.error("Error untagging peer %s with topic %s",t,n,e)}))}}function Nv(e={}){return t=>new xv(t,e)}var Mv;!function(e){let t;e.codec=()=>(null==t&&(t=zt(((e,t,n={})=>{if(!1!==n.lengthDelimited&&t.fork(),null!=e.protocolVersion&&(t.uint32(42),t.string(e.protocolVersion)),null!=e.agentVersion&&(t.uint32(50),t.string(e.agentVersion)),null!=e.publicKey&&(t.uint32(10),t.bytes(e.publicKey)),null!=e.listenAddrs)for(const n of e.listenAddrs)t.uint32(18),t.bytes(n);if(null!=e.observedAddr&&(t.uint32(34),t.bytes(e.observedAddr)),null!=e.protocols)for(const n of e.protocols)t.uint32(26),t.string(n);null!=e.signedPeerRecord&&(t.uint32(66),t.bytes(e.signedPeerRecord)),!1!==n.lengthDelimited&&t.ldelim()}),((e,t)=>{const n={listenAddrs:[],protocols:[]},r=null==t?e.len:e.pos+t;for(;e.pos<r;){const t=e.uint32();switch(t>>>3){case 5:n.protocolVersion=e.string();break;case 6:n.agentVersion=e.string();break;case 1:n.publicKey=e.bytes();break;case 2:n.listenAddrs.push(e.bytes());break;case 4:n.observedAddr=e.bytes();break;case 3:n.protocols.push(e.string());break;case 8:n.signedPeerRecord=e.bytes();break;default:e.skipType(7&t)}}return n}))),t),e.encode=t=>Kt(t,e.codec()),e.decode=t=>W(t,e.codec())}(Mv||(Mv={}));const Ov={protocolPrefix:"ipfs",timeout:5e3,maxInboundStreams:1,maxOutboundStreams:1,maxObservedAddresses:10,maxMessageSize:8192,runOnConnectionOpen:!0,runOnSelfUpdate:!0,runOnTransientConnection:!0,concurrency:32};async function Lv(e,t,n,r,s){if(n("received identify from %p",r.remotePeer),null==s)throw new dn("message was null or undefined","ERR_INVALID_MESSAGE");const i={};if(s.listenAddrs.length>0&&(i.addresses=s.listenAddrs.map((e=>({isCertified:!1,multiaddr:or(e)})))),s.protocols.length>0&&(i.protocols=s.protocols),null!=s.publicKey){i.publicKey=s.publicKey;if(!(await Es(s.publicKey)).equals(r.remotePeer))throw new dn("public key did not match remote PeerId","ERR_INVALID_PUBLIC_KEY")}let o;if(null!=s.signedPeerRecord){n("received signedPeerRecord from %p",r.remotePeer);let t=s.signedPeerRecord;const a=await Wh.openAndCertify(t,Qh.DOMAIN);let c,l=Qh.createFromProtobuf(a.payload);if(!l.peerId.equals(a.peerId))throw new dn("signing key does not match PeerId in the PeerRecord","ERR_INVALID_SIGNING_KEY");if(!r.remotePeer.equals(l.peerId))throw new dn("signing key does not match remote PeerId","ERR_INVALID_PEER_RECORD_KEY");try{c=await e.get(l.peerId)}catch(e){if("ERR_NOT_FOUND"!==e.code)throw e}if(null!=c&&(i.metadata=c.metadata,null!=c.peerRecordEnvelope)){const e=await Wh.createFromProtobuf(c.peerRecordEnvelope),r=Qh.createFromProtobuf(e.payload);r.seqNumber>=l.seqNumber&&(n("sequence number was lower or equal to existing sequence number - stored: %d received: %d",r.seqNumber,l.seqNumber),l=r,t=c.peerRecordEnvelope)}i.peerRecordEnvelope=t,i.addresses=l.multiaddrs.map((e=>({isCertified:!0,multiaddr:e}))),o={seq:l.seqNumber,addresses:l.multiaddrs}}else n("%p did not send a signed peer record",r.remotePeer);if(n("patching %p with",r.remotePeer,i),await e.patch(r.remotePeer,i),null!=s.agentVersion||null!=s.protocolVersion){const t={};null!=s.agentVersion&&(t.AgentVersion=Tt(s.agentVersion)),null!=s.protocolVersion&&(t.ProtocolVersion=Tt(s.protocolVersion)),n("merging %p metadata",r.remotePeer,t),await e.merge(r.remotePeer,{metadata:t})}const a={peerId:r.remotePeer,protocolVersion:s.protocolVersion,agentVersion:s.agentVersion,publicKey:s.publicKey,listenAddrs:s.listenAddrs.map((e=>or(e))),observedAddr:null==s.observedAddr?void 0:or(s.observedAddr),protocols:s.protocols,signedPeerRecord:o,connection:r};return t.safeDispatchEvent("peer:identify",{detail:a}),a}class Bv{host;protocol;started;timeout;peerId;peerStore;registrar;addressManager;maxInboundStreams;maxOutboundStreams;maxMessageSize;maxObservedAddresses;events;runOnTransientConnection;log;constructor(e,t){var n,r;this.protocol=t.protocol,this.started=!1,this.peerId=e.peerId,this.peerStore=e.peerStore,this.registrar=e.registrar,this.addressManager=e.addressManager,this.events=e.events,this.log=t.log,this.timeout=t.timeout??Ov.timeout,this.maxInboundStreams=t.maxInboundStreams??Ov.maxInboundStreams,this.maxOutboundStreams=t.maxOutboundStreams??Ov.maxOutboundStreams,this.maxMessageSize=t.maxMessageSize??Ov.maxMessageSize,this.maxObservedAddresses=t.maxObservedAddresses??Ov.maxObservedAddresses,this.runOnTransientConnection=t.runOnTransientConnection??Ov.runOnTransientConnection,this.host={protocolVersion:`${t.protocolPrefix??Ov.protocolPrefix}/0.1.0`,agentVersion:(n=e.nodeInfo,r=t.agentVersion,null!=r||(r=`${n.name}/${n.version}`,dy||uy?r+=` UserAgent=${globalThis.process.version}`:(ly||py||hy||fy)&&(r+=` UserAgent=${globalThis.navigator.userAgent}`)),r)}}isStarted(){return this.started}async start(){this.started||(await this.peerStore.merge(this.peerId,{metadata:{AgentVersion:Tt(this.host.agentVersion),ProtocolVersion:Tt(this.host.protocolVersion)}}),await this.registrar.handle(this.protocol,(e=>{this.handleProtocol(e).catch((e=>{this.log.error(e)}))}),{maxInboundStreams:this.maxInboundStreams,maxOutboundStreams:this.maxOutboundStreams,runOnTransientConnection:this.runOnTransientConnection}),this.started=!0)}async stop(){await this.registrar.unhandle(this.protocol),this.started=!1}}class Uv extends Bv{connectionManager;concurrency;constructor(e,t={}){super(e,{...t,protocol:`/${t.protocolPrefix??Ov.protocolPrefix}/id/push/1.0.0`,log:e.logger.forComponent("libp2p:identify-push")}),this.connectionManager=e.connectionManager,this.concurrency=t.concurrency??Ov.concurrency,(t.runOnSelfUpdate??Ov.runOnSelfUpdate)&&e.events.addEventListener("self:peer:update",(e=>{this.push().catch((e=>{this.log.error(e)}))}))}async push(){if(!this.isStarted())return;const e=this.addressManager.getAddresses().map((e=>e.decapsulateCode(Bn("p2p").code))),t=new Qh({peerId:this.peerId,multiaddrs:e}),n=await Wh.seal(t,this.peerId),r=this.registrar.getProtocols(),s=await this.peerStore.get(this.peerId),i=Gt(s.metadata.get("AgentVersion")??Tt(this.host.agentVersion)),o=Gt(s.metadata.get("ProtocolVersion")??Tt(this.host.protocolVersion)),a=this;await Pd(xf(async function*(){for(const t of a.connectionManager.getConnections()){(await a.peerStore.get(t.remotePeer)).protocols.includes(a.protocol)&&(yield async()=>{let s;const c=AbortSignal.timeout(a.timeout);try{s=await t.newStream(a.protocol,{signal:c,runOnTransientConnection:a.runOnTransientConnection});const l=Ew(s,{maxDataLength:a.maxMessageSize}).pb(Mv);await l.write({listenAddrs:e.map((e=>e.bytes)),signedPeerRecord:n.marshal(),protocols:r,agentVersion:i,protocolVersion:o},{signal:c}),await s.close({signal:c})}catch(e){a.log.error("could not push identify update to peer",e),s?.abort(e)}})}}(),{concurrency:this.concurrency}))}async handleProtocol(e){const{connection:t,stream:n}=e;try{if(this.peerId.equals(t.remotePeer))throw new Error("received push from ourselves?");const e={signal:AbortSignal.timeout(this.timeout)},r=Ew(n,{maxDataLength:this.maxMessageSize}).pb(Mv),s=await r.read(e);await n.close(e),await Lv(this.peerStore,this.events,this.log,t,s)}catch(e){return this.log.error("received invalid message",e),void n.abort(e)}this.log("handled push from %p",t.remotePeer)}}class Fv extends Bv{constructor(e,t={}){super(e,{...t,protocol:`/${t.protocolPrefix??Ov.protocolPrefix}/id/1.0.0`,log:e.logger.forComponent("libp2p:identify")}),(t.runOnConnectionOpen??Ov.runOnConnectionOpen)&&e.events.addEventListener("connection:open",(e=>{const t=e.detail;this.identify(t).catch((e=>{this.log.error("error during identify trigged by connection:open",e)}))}))}async _identify(e,t={}){let n;if(null==t.signal){const e=AbortSignal.timeout(this.timeout);t={...t,signal:e}}try{n=await e.newStream(this.protocol,{...t,runOnTransientConnection:this.runOnTransientConnection});const r=Ew(n,{maxDataLength:this.maxMessageSize}).pb(Mv),s=await r.read(t);return await n.close(t),s}catch(e){throw this.log.error("error while reading identify message",e),n?.abort(e),e}}async identify(e,t={}){const n=await this._identify(e,t),{publicKey:r,protocols:s,observedAddr:i}=n;if(null==r)throw new dn("public key was missing from identify message","ERR_MISSING_PUBLIC_KEY");const o=await Es(r);if(!e.remotePeer.equals(o))throw new dn("identified peer does not match the expected peer","ERR_INVALID_PEER");if(this.peerId.equals(o))throw new dn("identified peer is our own peer id?","ERR_INVALID_PEER");const a=function(e){if(null!=e&&e.length>0)try{return or(e)}catch{}}(i);return this.log("identify completed for peer %p and protocols %o",o,s),this.log("our observed address is %a",a),null!=a&&this.addressManager.getObservedAddrs().length<(this.maxObservedAddresses??1/0)&&(this.log("storing our observed address %a",a),this.addressManager.addObservedAddr(a)),Lv(this.peerStore,this.events,this.log,e,n)}async handleProtocol(e){const{connection:t,stream:n}=e,r=AbortSignal.timeout(this.timeout);try{const e=this.peerId.publicKey??new Uint8Array(0),s=await this.peerStore.get(this.peerId),i=this.addressManager.getAddresses().map((e=>e.decapsulateCode(Bn("p2p").code)));let o=s.peerRecordEnvelope;if(i.length>0&&null==o){const e=new Qh({peerId:this.peerId,multiaddrs:i});o=(await Wh.seal(e,this.peerId)).marshal().subarray()}let a=t.remoteAddr.bytes;hp.matches(t.remoteAddr)||(a=void 0);const c=Ew(n).pb(Mv);await c.write({protocolVersion:this.host.protocolVersion,agentVersion:this.host.agentVersion,publicKey:e,listenAddrs:i.map((e=>e.bytes)),signedPeerRecord:o,observedAddr:a,protocols:s.protocols},{signal:r}),await n.close({signal:r})}catch(e){this.log.error("could not respond to identify request",e),n.abort(e)}}}function Vv(e={}){return t=>new Fv(t,e)}function Kv(e={}){return t=>new Uv(t,e)}const $v=36e5,qv=36*$v,Hv="/dht/provider",zv=$v,Wv=20,jv=3;var Gv,Yv,Qv,Jv,Zv,Xv,eE,tE;function nE(e){const t=e.getUTCFullYear(),n=String(e.getUTCMonth()+1).padStart(2,"0"),r=String(e.getUTCDate()).padStart(2,"0"),s=String(e.getUTCHours()).padStart(2,"0"),i=String(e.getUTCMinutes()).padStart(2,"0"),o=String(e.getUTCSeconds()).padStart(2,"0"),a=e.getUTCMilliseconds();return`${t}-${n}-${r}T${s}:${i}:${o}.${String(1e3*a*1e3).padStart(9,"0")}Z`}!function(e){let t;e.codec=()=>(null==t&&(t=zt(((e,t,n={})=>{!1!==n.lengthDelimited&&t.fork(),null!=e.key&&e.key.byteLength>0&&(t.uint32(10),t.bytes(e.key)),null!=e.value&&e.value.byteLength>0&&(t.uint32(18),t.bytes(e.value)),null!=e.timeReceived&&""!==e.timeReceived&&(t.uint32(42),t.string(e.timeReceived)),!1!==n.lengthDelimited&&t.ldelim()}),((e,t,n={})=>{const r={key:g(0),value:g(0),timeReceived:""},s=null==t?e.len:e.pos+t;for(;e.pos<s;){const t=e.uint32();switch(t>>>3){case 1:r.key=e.bytes();break;case 2:r.value=e.bytes();break;case 5:r.timeReceived=e.string();break;default:e.skipType(7&t)}}return r}))),t),e.encode=t=>Kt(t,e.codec()),e.decode=(t,n)=>W(t,e.codec(),n)}(Gv||(Gv={}));class rE{key;value;timeReceived;constructor(e,t,n){if(!(e instanceof Uint8Array))throw new Error("key must be a Uint8Array");if(!(t instanceof Uint8Array))throw new Error("value must be a Uint8Array");this.key=e,this.value=t,this.timeReceived=n}serialize(){return Gv.encode(this.prepareSerialize())}prepareSerialize(){return{key:this.key,value:this.value,timeReceived:nE(this.timeReceived)}}static deserialize(e){const t=Gv.decode(e);return new rE(t.key,t.value,new Date(t.timeReceived))}static fromDeserialized(e){const t=function(e){const t=new RegExp("(\\d{4})-(\\d{2})-(\\d{2})T(\\d{2}):(\\d{2}):(\\d{2})\\.(\\d+)Z"),n=String(e).trim().match(t);if(null==n)throw new Error("Invalid format");const r=parseInt(n[1],10),s=parseInt(n[2],10)-1,i=parseInt(n[3],10),o=parseInt(n[4],10),a=parseInt(n[5],10),c=parseInt(n[6],10),l=parseInt(n[7].slice(0,-6),10);return new Date(Date.UTC(r,s,i,o,a,c,l))}(e.timeReceived);if(null==e.key)throw new Error("key missing from deserialized object");if(null==e.value)throw new Error("value missing from deserialized object");return new rE(e.key,e.value,t)}}function sE(e,t={}){const n={...e,name:"SEND_QUERY",type:0,messageName:e.type,messageType:e.type};return t.onProgress?.(new wn("kad-dht:query:send-query",{detail:n})),n}function iE(e,t={}){const n={...e,name:"PEER_RESPONSE",type:1,messageName:e.messageType,closer:null!=e.closer?e.closer:[],providers:null!=e.providers?e.providers:[]};return t.onProgress?.(new wn("kad-dht:query:peer-response",{detail:n})),n}function oE(e,t={}){const n={...e,name:"FINAL_PEER",type:2};return t.onProgress?.(new wn("kad-dht:query:final-peer",{detail:n})),n}function aE(e,t={}){const n={...e,name:"QUERY_ERROR",type:3};return t.onProgress?.(new wn("kad-dht:query:query-error",{detail:n})),n}function cE(e,t={}){const n={...e,name:"PROVIDER",type:4};return t.onProgress?.(new wn("kad-dht:query:provider",{detail:n})),n}function lE(e,t={}){const n={...e,name:"VALUE",type:5};return t.onProgress?.(new wn("kad-dht:query:value",{detail:n})),n}function uE(e,t={}){const n={...e,name:"DIAL_PEER",type:7};return t.onProgress?.(new wn("kad-dht:query:dial-peer",{detail:n})),n}!function(e){let t;e.codec=()=>(null==t&&(t=zt(((e,t,n={})=>{!1!==n.lengthDelimited&&t.fork(),null!=e.key&&(t.uint32(10),t.bytes(e.key)),null!=e.value&&(t.uint32(18),t.bytes(e.value)),null!=e.author&&(t.uint32(26),t.bytes(e.author)),null!=e.signature&&(t.uint32(34),t.bytes(e.signature)),null!=e.timeReceived&&(t.uint32(42),t.string(e.timeReceived)),!1!==n.lengthDelimited&&t.ldelim()}),((e,t)=>{const n={},r=null==t?e.len:e.pos+t;for(;e.pos<r;){const t=e.uint32();switch(t>>>3){case 1:n.key=e.bytes();break;case 2:n.value=e.bytes();break;case 3:n.author=e.bytes();break;case 4:n.signature=e.bytes();break;case 5:n.timeReceived=e.string();break;default:e.skipType(7&t)}}return n}))),t),e.encode=t=>Kt(t,e.codec()),e.decode=t=>W(t,e.codec())}(Yv||(Yv={})),function(e){e.PUT_VALUE="PUT_VALUE",e.GET_VALUE="GET_VALUE",e.ADD_PROVIDER="ADD_PROVIDER",e.GET_PROVIDERS="GET_PROVIDERS",e.FIND_NODE="FIND_NODE",e.PING="PING"}(Qv||(Qv={})),function(e){e[e.PUT_VALUE=0]="PUT_VALUE",e[e.GET_VALUE=1]="GET_VALUE",e[e.ADD_PROVIDER=2]="ADD_PROVIDER",e[e.GET_PROVIDERS=3]="GET_PROVIDERS",e[e.FIND_NODE=4]="FIND_NODE",e[e.PING=5]="PING"}(Jv||(Jv={})),function(e){e.codec=()=>Ht(Jv)}(Qv||(Qv={})),function(e){e.NOT_CONNECTED="NOT_CONNECTED",e.CONNECTED="CONNECTED",e.CAN_CONNECT="CAN_CONNECT",e.CANNOT_CONNECT="CANNOT_CONNECT"}(Zv||(Zv={})),function(e){e[e.NOT_CONNECTED=0]="NOT_CONNECTED",e[e.CONNECTED=1]="CONNECTED",e[e.CAN_CONNECT=2]="CAN_CONNECT",e[e.CANNOT_CONNECT=3]="CANNOT_CONNECT"}(Xv||(Xv={})),function(e){e.codec=()=>Ht(Xv)}(Zv||(Zv={})),function(e){let t;e.codec=()=>(null==t&&(t=zt(((e,t,n={})=>{if(!1!==n.lengthDelimited&&t.fork(),null!=e.id&&e.id.byteLength>0&&(t.uint32(10),t.bytes(e.id)),null!=e.multiaddrs)for(const n of e.multiaddrs)t.uint32(18),t.bytes(n);null!=e.connection&&(t.uint32(24),Zv.codec().encode(e.connection,t)),!1!==n.lengthDelimited&&t.ldelim()}),((e,t)=>{const n={id:g(0),multiaddrs:[]},r=null==t?e.len:e.pos+t;for(;e.pos<r;){const t=e.uint32();switch(t>>>3){case 1:n.id=e.bytes();break;case 2:n.multiaddrs.push(e.bytes());break;case 3:n.connection=Zv.codec().decode(e);break;default:e.skipType(7&t)}}return n}))),t),e.encode=t=>Kt(t,e.codec()),e.decode=t=>W(t,e.codec())}(eE||(eE={})),function(e){let t;e.codec=()=>(null==t&&(t=zt(((e,t,n={})=>{if(!1!==n.lengthDelimited&&t.fork(),null!=e.type&&0!==Jv[e.type]&&(t.uint32(8),Qv.codec().encode(e.type,t)),null!=e.clusterLevel&&(t.uint32(80),t.int32(e.clusterLevel)),null!=e.key&&(t.uint32(18),t.bytes(e.key)),null!=e.record&&(t.uint32(26),t.bytes(e.record)),null!=e.closer)for(const n of e.closer)t.uint32(66),eE.codec().encode(n,t);if(null!=e.providers)for(const n of e.providers)t.uint32(74),eE.codec().encode(n,t);!1!==n.lengthDelimited&&t.ldelim()}),((e,t)=>{const n={type:Qv.PUT_VALUE,closer:[],providers:[]},r=null==t?e.len:e.pos+t;for(;e.pos<r;){const t=e.uint32();switch(t>>>3){case 1:n.type=Qv.codec().decode(e);break;case 10:n.clusterLevel=e.int32();break;case 2:n.key=e.bytes();break;case 3:n.record=e.bytes();break;case 8:n.closer.push(eE.codec().decode(e,e.uint32()));break;case 9:n.providers.push(eE.codec().decode(e,e.uint32()));break;default:e.skipType(7&t)}}return n}))),t),e.encode=t=>Kt(t,e.codec()),e.decode=t=>W(t,e.codec())}(tE||(tE={}));const hE={pk:function(e,t){return 0}};async function dE(e,t){const n=t.key,r=Gt(n).split("/");if(r.length<3)return;const s=e[r[1].toString()];if(null==s){const e=`No validator available for key type "${r[1]}"`;throw new dn(e,"ERR_INVALID_RECORD_KEY_TYPE")}await s(n,t.value)}const pE={pk:async(e,t)=>{if(!(e instanceof Uint8Array))throw new dn('"key" must be a Uint8Array',"ERR_INVALID_RECORD_KEY_NOT_BUFFER");if(e.byteLength<5)throw new dn("invalid public key record","ERR_INVALID_RECORD_KEY_TOO_SHORT");if("/pk/"!==Gt(e.subarray(0,4)))throw new dn("key was not prefixed with /pk/","ERR_INVALID_RECORD_KEY_BAD_PREFIX");if(!Sn(e.slice(4),(await pt.digest(t)).bytes))throw new dn("public key does not match passed in key","ERR_INVALID_RECORD_HASH_MISMATCH")}},fE=Tt("/pk/");function gE(e){return{...e,multiaddrs:e.multiaddrs.filter((e=>{const[[t,n]]=e.stringTuples();if(53===t||54===t||55===t)return"localhost"!==n;if(4!==t&&6!==t)return!1;if(null==n)return!1;const r=Wd(n);return null==r||!r}))}}async function mE(e){return(await pt.digest(e)).digest}async function yE(e){return mE(e.toBytes())}function wE(e){return new Zt(`/dht/record/${Gt(e,"base32")}`,!1)}function bE(e,t){const n=new Date;return new rE(e,t,n).serialize()}class vE{log;components;validators;selectors;peerRouting;queryManager;network;constructor(e,t){const{validators:n,selectors:r,peerRouting:s,queryManager:i,network:o,logPrefix:a}=t;this.components=e,this.log=e.logger.forComponent(`${a}:content-fetching`),this.validators=n,this.selectors=r,this.peerRouting=s,this.queryManager=i,this.network=o}async getLocal(e){this.log("getLocal %b",e);const t=wE(e);this.log("fetching record for key %k",t);const n=await this.components.datastore.get(t);this.log("found %k in local datastore",t);const r=rE.deserialize(n);return await dE(this.validators,r),r}async*sendCorrectionRecord(e,t,n,r={}){this.log("sendCorrection for %b",e);const s=bE(e,n);for(const{value:i,from:o}of t){if(Sn(i,n)){this.log("record was ok");continue}if(this.components.peerId.equals(o)){try{const t=wE(e);this.log(`Storing corrected record for key ${t.toString()}`),await this.components.datastore.put(t,s.subarray())}catch(e){this.log.error("Failed error correcting self",e)}continue}let t=!1;const a={type:Qv.PUT_VALUE,key:e,record:s};for await(const e of this.network.sendRequest(o,a,r))"PEER_RESPONSE"===e.name&&null!=e.record&&Sn(e.record.value,rE.deserialize(s).value)&&(t=!0),yield e;t||(yield aE({from:o,error:new dn("value not put correctly","ERR_PUT_VALUE_INVALID")},r)),this.log.error("Failed error correcting entry")}}async*put(e,t,n={}){this.log("put key %b value %b",e,t);const r=bE(e,t),s=wE(e);this.log(`storing record for key ${s.toString()}`),await this.components.datastore.put(s,r.subarray()),yield*pr(this.peerRouting.getClosestPeers(e,{signal:n.signal}),(t=>qr(t,(t=>async()=>{if("FINAL_PEER"!==t.name)return[t];const s=[],i={type:Qv.PUT_VALUE,key:e,record:r};this.log("send put to %p",t.peer.id);for await(const e of this.network.sendRequest(t.peer.id,i,n))s.push(e),"PEER_RESPONSE"===e.name&&(null!=e.record&&Sn(e.record.value,rE.deserialize(r).value)||s.push(aE({from:t.peer.id,error:new dn("value not put correctly","ERR_PUT_VALUE_INVALID")},n)));return s}))),(e=>xf(e,{ordered:!1,concurrency:jv})),(async function*(e){for await(const t of e)yield*t}))}async*get(e,t={}){this.log("get %b",e);const n=[];for await(const r of this.getMany(e,t))"VALUE"===r.name&&n.push(r),yield r;if(0===n.length)return;const r=n.map((e=>e.value));let s=0;try{s=function(e,t,n){if(0===n.length)throw new dn("No records given","ERR_NO_RECORDS_RECEIVED");const r=Gt(t).split("/");if(r.length<3)throw new dn("Record key does not have a selector function","ERR_NO_SELECTOR_FUNCTION_FOR_RECORD_KEY");const s=e[r[1].toString()];if(null==s){const e=`No selector function configured for key type "${r[1]}"`;throw new dn(e,"ERR_UNRECOGNIZED_KEY_PREFIX")}return 1===n.length?0:s(t,n)}(this.selectors,e,r)}catch(e){if("ERR_NO_SELECTOR_FUNCTION_FOR_RECORD_KEY"!==e.code)throw e}const i=r[s];if(this.log("GetValue %b %b",e,i),null==i)throw new dn("best value was not found","ERR_NOT_FOUND");yield*this.sendCorrectionRecord(e,n,i,t),yield n[s]}async*getMany(e,t={}){this.log("getMany values for %b",e);try{const n=await this.getLocal(e);yield lE({value:n.value,from:this.components.peerId},t)}catch(t){this.log("error getting local value for %b",e,t)}const n=this;yield*this.queryManager.run(e,(async function*({peer:r,signal:s}){for await(const i of n.peerRouting.getValueOrPeers(r,e,{signal:s}))yield i,"PEER_RESPONSE"===i.name&&null!=i.record&&(yield lE({from:r,value:i.record.value},t))}),t)}}function EE(e){if(null==e.id)throw new Error("Invalid peer in message");return{id:vs(e.id),multiaddrs:(e.multiaddrs??[]).map((e=>or(e)))}}class SE{log;components;network;peerRouting;queryManager;routingTable;providers;constructor(e,t){const{network:n,peerRouting:r,queryManager:s,routingTable:i,providers:o,logPrefix:a}=t;this.components=e,this.log=e.logger.forComponent(`${a}:content-routing`),this.network=n,this.peerRouting=r,this.queryManager=s,this.routingTable=i,this.providers=o}async*provide(e,t,n={}){this.log("provide %s",e);const r=e.multihash.bytes;await this.providers.addProvider(e,this.components.peerId);const s={type:Qv.ADD_PROVIDER,key:r,providers:[(i={id:this.components.peerId,multiaddrs:t},{id:i.id.toBytes(),multiaddrs:(i.multiaddrs??[]).map((e=>e.bytes)),connection:o})]};var i,o;let a=0;const c=t=>async()=>{if("FINAL_PEER"!==t.name)return[t];const r=[];this.log("putProvider %s to %p",e,t.peer.id);try{this.log("sending provider record for %s to %p",e,t.peer.id);for await(const i of this.network.sendMessage(t.peer.id,s,n))"PEER_RESPONSE"===i.name&&(this.log("sent provider record for %s to %p",e,t.peer.id),a++),r.push(i)}catch(e){this.log.error("error sending provide record to peer %p",t.peer.id,e),r.push(aE({from:t.peer.id,error:e},n))}return r};yield*pr(this.peerRouting.getClosestPeers(r,n),(e=>qr(e,(e=>c(e)))),(e=>xf(e,{ordered:!1,concurrency:jv})),(async function*(e){for await(const t of e)yield*t})),this.log("sent provider records to %d peers",a)}async*findProviders(e,t){const n=this.routingTable.kBucketSize;let r=0;const s=e.multihash.bytes,i=this;this.log("findProviders %c",e);const o=await this.providers.getProviders(e);if(o.length>0){const e=[];for(const t of o.slice(0,n))try{const n=await this.components.peerStore.get(t);e.push({id:t,multiaddrs:n.addresses.map((({multiaddr:e})=>e))})}catch(e){if("ERR_NOT_FOUND"!==e.code)throw e;this.log("no peer store entry for %p",t)}if(yield iE({from:this.components.peerId,messageType:Qv.GET_PROVIDERS,providers:e},t),yield cE({from:this.components.peerId,providers:e},t),r+=e.length,r>=n)return}const a=async function*({peer:e,signal:n}){const r={type:Qv.GET_PROVIDERS,key:s};yield*i.network.sendRequest(e,r,{...t,signal:n})},c=new $h(o);for await(const i of this.queryManager.run(s,a,t))if(yield i,"PEER_RESPONSE"===i.name){this.log("Found %d provider entries for %c and %d closer peers",i.providers.length,e,i.closer.length);const s=[];for(const e of i.providers)c.has(e.id)||(c.add(e.id),s.push(e));if(s.length>0&&(yield cE({from:i.from,providers:s},t),r+=s.length,r>=n))return}}}class _E{movingAverage;variance;deviation;forecast;timespan;previousTime;constructor(e){this.timespan=e,this.movingAverage=0,this.variance=0,this.deviation=0,this.forecast=0}alpha(e,t){return 1-Math.exp(-(e-t)/this.timespan)}push(e,t=Date.now()){if(null!=this.previousTime){const n=this.alpha(t,this.previousTime),r=e-this.movingAverage,s=n*r;this.movingAverage=n*e+(1-n)*this.movingAverage,this.variance=(1-n)*(this.variance+r*s),this.deviation=Math.sqrt(this.variance),this.forecast=this.movingAverage+n*r}else this.movingAverage=e;this.previousTime=t}}class IE{success;failure;next;metric;timeoutMultiplier;failureMultiplier;minTimeout;constructor(e={}){this.success=new _E(e.interval??5e3),this.failure=new _E(e.interval??5e3),this.next=new _E(e.interval??5e3),this.failureMultiplier=e.failureMultiplier??2,this.timeoutMultiplier=e.timeoutMultiplier??1.2,this.minTimeout=e.minTimeout??2e3,null!=e.metricName&&(this.metric=e.metrics?.registerMetricGroup(e.metricName))}getTimeoutSignal(e={}){const t=Math.max(Math.round(this.next.movingAverage*(e.timeoutFactor??this.timeoutMultiplier)),this.minTimeout),n=AbortSignal.timeout(t),r=Ss([e.signal,n]);return r.start=Date.now(),r.timeout=t,r}cleanUp(e){const t=Date.now()-e.start;e.aborted?(this.failure.push(t),this.next.push(t*this.failureMultiplier),this.metric?.update({failureMovingAverage:this.failure.movingAverage,failureDeviation:this.failure.deviation,failureForecast:this.failure.forecast,failureVariance:this.failure.variance,failure:t})):(this.success.push(t),this.next.push(t),this.metric?.update({successMovingAverage:this.success.movingAverage,successDeviation:this.success.deviation,successForecast:this.success.forecast,successVariance:this.success.variance,success:t}))}}class RE extends mn{log;protocol;running;components;timeout;constructor(e,t){super();const{protocol:n}=t;this.components=e,this.log=e.logger.forComponent(`${t.logPrefix}:network`),this.running=!1,this.protocol=n,this.timeout=new IE({...t.timeout??{},metrics:e.metrics,metricName:`${t.logPrefix.replaceAll(":","_")}_network_message_send_times_milliseconds`})}async start(){this.running||(this.running=!0)}async stop(){this.running=!1}isStarted(){return this.running}async*sendRequest(e,t,n={}){if(!this.running)return;const r=t.type;if(null==r)throw new Wt("Message type was missing","ERR_INVALID_PARAMETERS");let s;this.log("sending %s to %p",t.type,e),yield uE({peer:e},n),yield sE({to:e,type:r},n);const i=this.timeout.getTimeoutSignal(n);n={...n,signal:i};try{const r=await this.components.connectionManager.openConnection(e,n);s=await r.newStream(this.protocol,n);const i=await this._writeReadMessage(s,t,n);s.close(n).catch((t=>{this.log.error("error closing stream to %p",e,t),s?.abort(t)})),yield iE({from:e,messageType:i.type,closer:i.closer.map(EE),providers:i.providers.map(EE),record:null==i.record?void 0:rE.deserialize(i.record)},n)}catch(r){s?.abort(r),this.log.error("could not send %s to %p",t.type,e,r),yield aE({from:e,error:r},n)}finally{this.timeout.cleanUp(i)}}async*sendMessage(e,t,n={}){if(!this.running)return;const r=t.type;if(null==r)throw new Wt("Message type was missing","ERR_INVALID_PARAMETERS");let s;this.log("sending %s to %p",t.type,e),yield uE({peer:e},n),yield sE({to:e,type:r},n);const i=this.timeout.getTimeoutSignal(n);n={...n,signal:i};try{const i=await this.components.connectionManager.openConnection(e,n);s=await i.newStream(this.protocol,n),await this._writeMessage(s,t,n),s.close(n).catch((t=>{this.log.error("error closing stream to %p",e,t),s?.abort(t)})),yield iE({from:e,messageType:r},n)}catch(t){s?.abort(t),yield aE({from:e,error:t},n)}finally{this.timeout.cleanUp(i)}}async _writeMessage(e,t,n){const r=Ew(e);await r.write(t,tE,n),await r.unwrap().close(n)}async _writeReadMessage(e,t,n){const r=Ew(e);await r.write(t,tE,n);const s=await r.read(tE,n);return await r.unwrap().close(n),s.closer.forEach((e=>{this.safeDispatchEvent("peer",{detail:EE(e)})})),s.providers.forEach((e=>{this.safeDispatchEvent("peer",{detail:EE(e)})})),s}}function AE(e,t){if(e.byteLength!==t.byteLength)throw new Error("Inputs should have the same length");for(let n=0;n<e.byteLength;n++)if(e[n]!==t[n])return e[n]<t[n]?-1:1;return 0}class TE{originDhtKey;capacity;peerDistances;constructor(e,t){this.originDhtKey=e,this.capacity=t,this.peerDistances=[]}get length(){return this.peerDistances.length}get peers(){return this.peerDistances.map((e=>e.peer))}async add(e){const t=await yE(e.id);this.addWitKadId(e,t)}addWitKadId(e,t){if(null!=this.peerDistances.find((t=>t.peer.id.equals(e.id))))return;const n={peer:e,distance:pm(this.originDhtKey,t)};this.peerDistances.push(n),this.peerDistances.sort(((e,t)=>AE(e.distance,t.distance))),this.peerDistances=this.peerDistances.slice(0,this.capacity)}async isCloser(e){if(0===this.length)return!0;return-1===AE(pm(await yE(e),this.originDhtKey),this.peerDistances[this.peerDistances.length-1].distance)}async anyCloser(e){return 0!==e.length&&Promise.any(e.map((async e=>this.isCloser(e))))}}class DE{log;routingTable;network;validators;queryManager;peerStore;peerId;constructor(e,t){const{routingTable:n,network:r,validators:s,queryManager:i,logPrefix:o}=t;this.routingTable=n,this.network=r,this.validators=s,this.queryManager=i,this.peerStore=e.peerStore,this.peerId=e.peerId,this.log=e.logger.forComponent(`${o}:peer-routing`)}async findPeerLocal(e){let t;const n=await this.routingTable.find(e);if(null!=n){this.log("findPeerLocal found %p in routing table",e);try{t=await this.peerStore.get(n)}catch(e){if("ERR_NOT_FOUND"!==e.code)throw e}}if(null==t)try{t=await this.peerStore.get(e)}catch(e){if("ERR_NOT_FOUND"!==e.code)throw e}if(null!=t)return this.log("findPeerLocal found %p in peer store",e),{id:t.id,multiaddrs:t.addresses.map((e=>e.multiaddr))}}async*_getValueSingle(e,t,n={}){const r={type:Qv.GET_VALUE,key:t};yield*this.network.sendRequest(e,r,n)}async*getPublicKeyFromNode(e,t={}){const n=function(e){return _n([fE,e.toBytes()])}(e);for await(const r of this._getValueSingle(e,n,t))if(yield r,"PEER_RESPONSE"===r.name&&null!=r.record){const n=await Es(Bl({bytes:r.record.value}));if(!n.equals(e))throw new dn("public key does not match id","ERR_PUBLIC_KEY_DOES_NOT_MATCH_ID");if(null==n.publicKey)throw new dn("public key missing","ERR_PUBLIC_KEY_MISSING");yield lE({from:e,value:n.publicKey},t)}throw new dn(`Node not responding with its public key: ${e.toString()}`,"ERR_INVALID_RECORD")}async*findPeer(e,t={}){if(this.log("findPeer %p",e),!1!==t.useCache){const n=await this.findPeerLocal(e);if(null!=n)return this.log("found local"),void(yield oE({from:this.peerId,peer:n},t))}let n=!1;if(!1!==t.useNetwork){const r=this,s=async function*({peer:n,signal:s}){const i={type:Qv.FIND_NODE,key:e.toBytes()};for await(const o of r.network.sendRequest(n,i,{...t,signal:s}))if(yield o,"PEER_RESPONSE"===o.name){const n=o.closer.find((t=>t.id.equals(e)));null!=n&&(yield oE({from:o.from,peer:n},t))}};for await(const r of this.queryManager.run(e.toBytes(),s,t))"FINAL_PEER"===r.name&&(n=!0),yield r}n||(yield aE({from:this.peerId,error:new dn("Not found","ERR_NOT_FOUND")},t))}async*getClosestPeers(e,t={}){this.log("getClosestPeers to %b",e);const n=await mE(e),r=this.routingTable.closestPeers(n),s=this,i=new TE(n,this.routingTable.kBucketSize);await Promise.all(r.map((async e=>{await i.add({id:e,multiaddrs:[]})})));const o=async function*({peer:n,signal:r}){s.log("closerPeersSingle %s from %p",Gt(e,"base32"),n);const i={type:Qv.FIND_NODE,key:e};yield*s.network.sendRequest(n,i,{...t,signal:r})};for await(const n of this.queryManager.run(e,o,t))"PEER_RESPONSE"===n.name&&await Promise.all(n.closer.map((async e=>{await i.add(e)}))),yield n;this.log("found %d peers close to %b",i.length,e);for(const e of i.peers)yield oE({from:this.peerId,peer:e},t)}async*getValueOrPeers(e,t,n={}){for await(const r of this._getValueSingle(e,t,n)){if("PEER_RESPONSE"===r.name&&null!=r.record)try{await this._verifyRecordOnline(r.record)}catch(e){const t="invalid record received, discarded";this.log(t),yield aE({from:r.from,error:new dn(t,"ERR_INVALID_RECORD")},n);continue}yield r}}async _verifyRecordOnline(e){if(null==e.timeReceived)throw new dn("invalid record received","ERR_INVALID_RECORD");await dE(this.validators,new rE(e.key,e.value,e.timeReceived))}async getCloserPeersOffline(e,t){const n=await mE(e),r=this.routingTable.closestPeers(n),s=[];for(const e of r)if(!e.equals(t))try{const t=await this.peerStore.get(e);s.push({id:e,multiaddrs:t.addresses.map((({multiaddr:e})=>e))})}catch(e){if("ERR_NOT_FOUND"!==e.code)throw e}return s.length>0?this.log("getCloserPeersOffline found %d peer(s) closer to %b than %p",s.length,e,t):this.log("getCloserPeersOffline could not find peer closer to %b than %p with %d peers in the routing table",e,t,this.routingTable.size),s}}class kE{log;datastore;cache;cleanupInterval;provideValidity;syncQueue;started;cleaner;constructor(e,t={}){const{cacheSize:n,cleanupInterval:r,provideValidity:s}=t;this.log=e.logger.forComponent("libp2p:kad-dht:providers"),this.datastore=e.datastore,this.cleanupInterval=r??zv,this.provideValidity=s??864e5,this.cache=Bp(n??256),this.syncQueue=new Dh({concurrency:1}),this.started=!1}isStarted(){return this.started}async start(){this.started||(this.started=!0,this.cleaner=setInterval((()=>{this._cleanup().catch((e=>{this.log.error(e)}))}),this.cleanupInterval))}async stop(){this.started=!1,null!=this.cleaner&&(clearInterval(this.cleaner),this.cleaner=void 0)}async _cleanup(){await this.syncQueue.add((async()=>{const e=Date.now();let t=0,n=0;const r=new Map,s=this.datastore.batch(),i=this.datastore.query({prefix:Hv});for await(const e of i)try{const{cid:i,peerId:o}=CE(e.key),a=xE(e.value).getTime(),c=Date.now(),l=c-a,u=l>this.provideValidity;if(this.log("comparing: %d - %d = %d > %d %s",c,a,l,this.provideValidity,u?"(expired)":""),u){n++,s.delete(e.key);const t=r.get(i)??new Set;t.add(o),r.set(i,t)}t++}catch(e){this.log.error(e.message)}r.size>0?(this.log("deleting %d / %d entries",n,t),await s.commit()):this.log("nothing to delete");for(const[e,t]of r){const n=PE(e),r=this.cache.get(n);if(null!=r){for(const e of t)r.delete(e);0===r.size?this.cache.remove(n):this.cache.set(n,r)}}this.log("Cleanup successful (%dms)",Date.now()-e)}))}async _getProvidersMap(e){const t=PE(e);let n=this.cache.get(t);return null==n&&(n=await async function(e,t){const n=new Map,r=e.query({prefix:PE(t)});for await(const e of r){const{peerId:t}=CE(e.key);n.set(t,xE(e.value))}return n}(this.datastore,e),this.cache.set(t,n)),n}async addProvider(e,t){await this.syncQueue.add((async()=>{this.log("%p provides %s",t,e);const n=await this._getProvidersMap(e);this.log("loaded %s provs",n.size);const r=new Date;n.set(t.toString(),r);const s=PE(e);this.cache.set(s,n),await async function(e,t,n,r){const s=[PE(t),"/",n.toString()].join(""),i=new Zt(s),o=k(r.getTime());await e.put(i,o)}(this.datastore,e,t,r)}))}async getProviders(e){return this.syncQueue.add((async()=>{this.log("get providers for %s",e);return[...(await this._getProvidersMap(e)).keys()].map((e=>bs(e)))}),{throwOnTimeout:!0})}}function PE(e){const t="string"==typeof e?e:Gt(e.multihash.bytes,"base32");return`${Hv}/${t}`}function CE(e){const t=e.toString().split("/");if(5!==t.length)throw new Error(`incorrectly formatted provider entry key in datastore: ${e.toString()}`);return{cid:t[3],peerId:t[4]}}function xE(e){return new Date(P(e))}class NE{disjointPaths;alpha;shutDownController;running;queries;logger;peerId;connectionManager;routingTable;initialQuerySelfHasRun;logPrefix;metrics;constructor(e,t){const{disjointPaths:n=Wv,alpha:r=jv,logPrefix:s}=t;this.logPrefix=s,this.disjointPaths=n??Wv,this.running=!1,this.alpha=r??jv,this.queries=0,this.initialQuerySelfHasRun=t.initialQuerySelfHasRun,this.routingTable=t.routingTable,this.logger=e.logger,this.peerId=e.peerId,this.connectionManager=e.connectionManager,null!=e.metrics&&(this.metrics={runningQueries:e.metrics.registerMetric(`${s.replaceAll(":","_")}_running_queries`),queryTime:e.metrics.registerMetric(`${s.replaceAll(":","_")}_query_time_seconds`)}),this.shutDownController=new AbortController,this.shutDownController.signal}isStarted(){return this.running}async start(){this.running=!0,this.shutDownController=new AbortController,this.shutDownController.signal}async stop(){this.running=!1,this.shutDownController.abort()}async*run(e,t,n={}){if(!this.running)throw new Error("QueryManager not started");const r=this.metrics?.queryTime.timer();if(null==n.signal){const e=AbortSignal.timeout(18e4);n={...n,signal:e}}const s=new AbortController,i=Ss([this.shutDownController.signal,s.signal,n.signal]);s.signal;const o=this.logger.forComponent(`${this.logPrefix}:query:`+Gt(e,"base58btc")),a=Date.now();let c=!1;try{!0!==n.isSelfQuery&&null!=this.initialQuerySelfHasRun&&(o("waiting for initial query-self query before continuing"),await Ir(this.initialQuerySelfHasRun.promise,i),this.initialQuerySelfHasRun=void 0),o("query:start"),this.queries++,this.metrics?.runningQueries.update(this.queries);const r=await mE(e),s=this.routingTable.closestPeers(r),a=s.slice(0,Math.min(this.disjointPaths,s.length));if(0===s.length)return void o.error("Running query with no peers");const l=new $h,u=a.map(((r,s)=>async function*(e){const{key:t,startingPeer:n,ourPeerId:r,signal:s,query:i,alpha:o,pathIndex:a,numPaths:c,queryFuncTimeout:l,log:u,peersSeen:h,connectionManager:d}=e,p=new gf({concurrency:o,sort:(e,t)=>AE(e.options.distance,t.options.distance)}),f=await mE(t);!function n(o,g){if(null==o)return;h.add(o);const m=pm(g,f);p.add((async()=>{const g=[s];null!=l&&g.push(AbortSignal.timeout(l));const y=Ss(g);try{for await(const e of i({key:t,peer:o,signal:y,pathIndex:a,numPaths:c})){if(y.aborted)return;if("PEER_RESPONSE"===e.name)for(const s of e.closer){if(h.has(s.id)){u("already seen %p in query",s.id);continue}if(r.equals(s.id)){u("not querying ourselves");continue}if(!await d.isDialable(s.multiaddrs)){u("not querying undialable peer");continue}const e=await yE(s.id);-1===AE(pm(e,f),m)?(u("querying closer peer %p",s.id),n(s.id,e)):u("skipping %p as they are not closer to %b than %p",s.id,t,o)}p.safeDispatchEvent("completed",{detail:e})}}catch(t){if(!s.aborted)return aE({from:o,error:t},e)}finally{y.clear()}}),{distance:m}).catch((e=>{u.error(e)}))}(n,await yE(n));try{for await(const e of p.toGenerator({signal:s}))null!=e&&(yield e)}catch(e){if(s.aborted)throw new dn("Query aborted","ERR_QUERY_ABORTED");throw e}}({key:e,startingPeer:r,ourPeerId:this.peerId,signal:i,query:t,pathIndex:s,numPaths:a.length,alpha:this.alpha,queryFuncTimeout:n.queryFuncTimeout,log:o,peersSeen:l,onProgress:n.onProgress,connectionManager:this.connectionManager})));for await(const e of dr(...u)){if("QUERY_ERROR"===e.name&&o.error("query error",e.error),"PEER_RESPONSE"===e.name)for(const t of[...e.closer,...e.providers])await this.connectionManager.isDialable(t.multiaddrs)&&await this.routingTable.add(t.id);yield e}c=!0}catch(e){if(this.running||"ERR_QUERY_ABORTED"!==e.code)throw e}finally{c||(o("query exited early"),s.abort()),i.clear(),this.queries--,this.metrics?.runningQueries.update(this.queries),null!=r&&r(),o("query:done in %dms",Date.now()-a)}}}function ME(e){if(null!=e[Symbol.asyncIterator])return(async()=>{let t=0;for await(const n of e)t++;return t})();{let t=0;for(const n of e)t++;return t}}class OE{log;peerId;peerRouting;routingTable;count;interval;initialInterval;queryTimeout;started;timeoutId;controller;initialQuerySelfHasRun;querySelfPromise;constructor(e,t){const{peerRouting:n,logPrefix:r,count:s,interval:i,queryTimeout:o,routingTable:a}=t;this.peerId=e.peerId,this.log=e.logger.forComponent(`${r}:query-self`),this.started=!1,this.peerRouting=n,this.routingTable=a,this.count=s??Wv,this.interval=i??3e5,this.initialInterval=t.initialInterval??1e3,this.queryTimeout=o??5e3,this.initialQuerySelfHasRun=t.initialQuerySelfHasRun}isStarted(){return this.started}start(){this.started||(this.started=!0,clearTimeout(this.timeoutId),this.timeoutId=setTimeout((()=>{this.querySelf().catch((e=>{this.log.error("error running self-query",e)}))}),this.initialInterval))}stop(){this.started=!1,null!=this.timeoutId&&clearTimeout(this.timeoutId),null!=this.controller&&this.controller.abort()}async querySelf(){if(this.started){if(null!=this.querySelfPromise)return this.log("joining existing self query"),this.querySelfPromise.promise;if(this.querySelfPromise=ar(),this.started){this.controller=new AbortController;const e=AbortSignal.timeout(this.queryTimeout),t=Ss([this.controller.signal,e]);this.controller.signal;try{0===this.routingTable.size&&(this.log("routing table was empty, waiting for some peers before running query"),await hw(this.routingTable,"peer:add",{signal:t})),this.log("run self-query, look for %d peers timing out after %dms",this.count,this.queryTimeout);const e=Date.now(),n=await pr(this.peerRouting.getClosestPeers(this.peerId.toBytes(),{signal:t,isSelfQuery:!0}),(e=>Nd(e,this.count)),(async e=>ME(e)));this.log("self-query found %d peers in %dms",n,Date.now()-e)}catch(e){this.log.error("self-query error",e)}finally{t.clear(),null!=this.initialQuerySelfHasRun&&(this.initialQuerySelfHasRun.resolve(),this.initialQuerySelfHasRun=void 0)}}this.querySelfPromise.resolve(),this.querySelfPromise=void 0,this.started&&(this.timeoutId=setTimeout((()=>{this.querySelf().catch((e=>{this.log.error("error running self-query",e)}))}),this.interval))}else this.log("skip self-query because we are not started")}}function LE(e,t){if(!(t instanceof Uint8Array))throw new TypeError(e+" is not a Uint8Array");if(32!==t.byteLength)throw new TypeError(e+" had incorrect length")}function BE(e){return Array.isArray(e?.peers)}class UE extends mn{root;localPeer;prefixLength;splitThreshold;kBucketSize;numberOfNodesToPing;constructor(e){super(),this.localPeer=e.localPeer,this.prefixLength=e.prefixLength,this.kBucketSize=e.kBucketSize??FE,this.splitThreshold=e.splitThreshold??this.kBucketSize,this.numberOfNodesToPing=e.numberOfNodesToPing??3,LE("options.localPeer.kadId",e.localPeer.kadId),this.root={prefix:"",depth:0,peers:[]}}add(e){LE("peer.kadId",e?.kadId);const t=this._determineBucket(e.kadId);if(!(this._indexOf(t,e.kadId)>-1))return t.peers.length===this.splitThreshold&&t.depth<this.prefixLength?(this._split(t),void this.add(e)):t.peers.length<this.kBucketSize?(t.peers.push(e),void this.safeDispatchEvent("added",{detail:e})):void this.safeDispatchEvent("ping",{detail:{oldContacts:t.peers.slice(0,this.numberOfNodesToPing),newContact:e}})}*closest(e,t=this.kBucketSize){const n=new TE(e,t);for(const e of this.toIterable())n.addWitKadId({id:e.peerId,multiaddrs:[]},e.kadId);yield*qr(n.peers,(e=>e.id))}count(){return function e(t){if(BE(t))return t.peers.length;let n=0;return null!=t.left&&(n+=e(t.left)),null!=t.right&&(n+=e(t.right)),n}(this.root)}get(e){const t=this._determineBucket(e),n=this._indexOf(t,e);return t.peers[n]}remove(e){const t=this._determineBucket(e),n=this._indexOf(t,e);if(n>-1){const e=t.peers.splice(n,1)[0];this.safeDispatchEvent("removed",{detail:e})}}*toIterable(){yield*function*e(t){BE(t)?yield*t.peers:(yield*e(t.left),yield*e(t.right))}(this.root)}distance(e,t){return BigInt("0x"+Gt(pm(e,t),"base16"))}_determineBucket(e){const t=Gt(e,"base2").substring(0,this.prefixLength);return function e(n,r=0){return BE(n)?n:e("0"===t[r]?n.left:n.right,r+1)}(this.root)}_indexOf(e,t){return e.peers.findIndex((e=>function(e,t){if(e===t)return!0;if(e.length!==t.length)return!1;for(let n=0,r=e.length;n<r;++n)if(e[n]!==t[n])return!1;return!0}(e.kadId,t)))}_split(e){const t=e.depth+1,n={prefix:"0",depth:t,peers:[]},r={prefix:"1",depth:t,peers:[]};for(const s of e.peers){"0"===Gt(s.kadId,"base2")[t]?n.peers.push(s):r.peers.push(s)}delete e.peers,e.left=n,e.right=r}}const FE=20;class VE extends mn{kBucketSize;kb;pingQueue;log;components;prefixLength;splitThreshold;pingTimeout;pingConcurrency;running;protocol;tagName;tagValue;metrics;constructor(e,t){super(),this.components=e,this.log=e.logger.forComponent(`${t.logPrefix}:routing-table`),this.kBucketSize=t.kBucketSize??FE,this.pingTimeout=t.pingTimeout??1e4,this.pingConcurrency=t.pingConcurrency??10,this.running=!1,this.protocol=t.protocol,this.tagName=t.tagName??"kad-close",this.tagValue=t.tagValue??50,this.prefixLength=t.prefixLength??32,this.splitThreshold=t.splitThreshold??FE,this.pingQueue=new mf({concurrency:this.pingConcurrency,metricName:`${t.logPrefix.replaceAll(":","_")}_ping_queue`,metrics:this.components.metrics}),this.pingQueue.addEventListener("error",(e=>{this.log.error("error pinging peer",e.detail)})),null!=this.components.metrics&&(this.metrics={routingTableSize:this.components.metrics.registerMetric(`${t.logPrefix.replaceAll(":","_")}_routing_table_size`),routingTableKadBucketTotal:this.components.metrics.registerMetric(`${t.logPrefix.replaceAll(":","_")}_routing_table_kad_bucket_total`),routingTableKadBucketAverageOccupancy:this.components.metrics.registerMetric(`${t.logPrefix.replaceAll(":","_")}_routing_table_kad_bucket_average_occupancy`),routingTableKadBucketMaxDepth:this.components.metrics.registerMetric(`${t.logPrefix.replaceAll(":","_")}_routing_table_kad_bucket_max_depth`)})}isStarted(){return this.running}async start(){this.running=!0;const e=new UE({localPeer:{kadId:await yE(this.components.peerId),peerId:this.components.peerId},kBucketSize:this.kBucketSize,prefixLength:this.prefixLength,splitThreshold:this.splitThreshold,numberOfNodesToPing:1});this.kb=e,e.addEventListener("ping",(e=>{this._onPing(e).catch((e=>{this.log.error("could not process k-bucket ping event",e)}))}));let t=0;for(const e of await this.components.peerStore.all())if(e.protocols.includes(this.protocol)){const n=await yE(e.id);this.kb.add({kadId:n,peerId:e.id}),t++}this.log("added %d peer store peers to the routing table",t),this._tagPeers(e)}async stop(){this.running=!1,this.pingQueue.clear(),this.kb=void 0}_tagPeers(e){let t=new $h;const n=function(e,t=100){let n;return()=>{clearTimeout(n),n=setTimeout((()=>{e()}),t)}}((()=>{const n=new $h(e.closest(e.localPeer.kadId,FE)),r=n.difference(t),s=t.difference(n);Promise.resolve().then((async()=>{for(const e of r)await this.components.peerStore.merge(e,{tags:{[this.tagName]:{value:this.tagValue}}});for(const e of s)await this.components.peerStore.merge(e,{tags:{[this.tagName]:void 0}})})).catch((e=>{this.log.error("Could not update peer tags",e)})),t=n}));e.addEventListener("added",(e=>{n(),this.safeDispatchEvent("peer:add",{detail:e.detail.peerId})})),e.addEventListener("removed",(e=>{n(),this.safeDispatchEvent("peer:remove",{detail:e.detail.peerId})}))}async _onPing(e){if(!this.running)return;const{oldContacts:t,newContact:n}=e.detail,r=(await Promise.all(t.map((async e=>{const t=this.pingQueue.find(e.peerId);return null!=t?t.join():this.pingQueue.add((async()=>{let t;try{const n={signal:AbortSignal.timeout(this.pingTimeout)};this.log("pinging old contact %p",e.peerId);const r=await this.components.connectionManager.openConnection(e.peerId,n);t=await r.newStream(this.protocol,n);const s=Ew(t);await s.write({type:Qv.PING},tE,n);const i=await s.read(tE,n);if(await s.unwrap().close(),i.type!==Qv.PING)throw new dn(`Incorrect message type received, expected PING got ${i.type}`,"ERR_BAD_PING_RESPONSE");return!0}catch(n){return this.running&&null!=this.kb&&(this.log.error("could not ping peer %p",e.peerId,n),this.log("evicting old contact after ping failed %p",e.peerId),this.kb.remove(e.kadId)),t?.abort(n),!1}finally{this.metrics?.routingTableSize.update(this.size)}}),{peerId:e.peerId})})))).filter((e=>e)).length;this.running&&r<t.length&&null!=this.kb&&(this.log("adding new contact %p",n.peerId),this.kb.add(n))}get size(){return null==this.kb?0:this.kb.count()}async find(e){const t=await yE(e);return this.kb?.get(t)?.peerId}closestPeer(e){const t=this.closestPeers(e,1);if(t.length>0)return t[0]}closestPeers(e,t=this.kBucketSize){return null==this.kb?[]:[...this.kb.closest(e,t)]}async add(e){if(null==this.kb)throw new Error("RoutingTable is not started");const t=await yE(e);this.kb.add({kadId:t,peerId:e}),this.log("added %p with kad id %b",e,t),this.updateMetrics()}async remove(e){if(null==this.kb)throw new Error("RoutingTable is not started");const t=await yE(e);this.kb.remove(t),this.updateMetrics()}updateMetrics(){if(null==this.metrics||null==this.kb)return;let e=0,t=0,n=0;!function r(s){if(BE(s))return s.depth>n&&(n=s.depth),t++,void(e+=s.peers.length);r(s.left),r(s.right)}(this.kb.root),this.metrics.routingTableSize.update(e),this.metrics.routingTableKadBucketTotal.update(t),this.metrics.routingTableKadBucketAverageOccupancy.update(Math.round(e/t)),this.metrics.routingTableKadBucketMaxDepth.update(n)}}var KE=[77591,22417,43971,28421,740,29829,71467,228973,196661,78537,27689,36431,44415,14362,19456,106025,96308,2882,49509,21149,87173,131409,75844,23676,121838,30291,17492,2953,7564,110620,129477,127283,53113,72417,165166,109690,21200,102125,24049,71504,90342,25307,72039,26812,26715,32264,133800,71161,88956,171987,51779,24425,16671,30251,186294,247761,14202,2121,8465,35024,4876,85917,169730,3638,256836,96184,943,18678,6583,52907,35807,112254,214097,18796,11595,9243,23554,887,268203,382004,24590,111335,11625,16619,29039,102425,69006,97976,92362,32552,63717,41433,128974,137630,59943,10019,13986,35430,33665,108037,43799,43280,38195,29078,58629,18265,14425,46832,235538,40830,77881,110717,58937,3463,325358,51300,47623,117252,19007,10170,20540,91237,294813,4951,79841,56232,36270,128547,69209,66275,100156,32063,73531,34439,80937,28892,44466,88595,216307,32583,49620,16605,82127,45807,21630,78726,20235,40163,111007,96926,5567,72083,21665,58844,39419,179767,48328,42662,51550,5251,37811,49608,81056,50854,55513,20922,18891,197409,164656,32593,71449,220474,58919,85682,67854,13758,35066,3565,61905,214793,119572,141419,21504,10302,27354,67003,46131,32668,15165,64871,34450,17821,2757,11452,34189,5160,12257,85523,560,53385,65887,119549,135620,312353,115979,122356,10867,193231,124537,54783,90675,120791,4715,142253,50943,17271,43358,25331,4917,120566,34580,12878,33786,160528,32523,4869,301307,104817,81491,23276,8832,97911,31265,52065,7998,49622,9715,43998,34091,84587,20664,69041,29419,53205,10838,58288,116145,6185,5154,141795,35924,21307,144738,43730,12085,8279,10002,119,133779,199668,72938,31768,39176,67875,38453,9700,44144,4121,116048,41733,12868,82669,92308,128,34262,11332,7712,90764,36141,13553,71312,77470,117314,96549,49135,23602,54468,28605,6327,62308,17171,67531,21319,14105,894,107722,46157,8503,51069,100472,45138,15246,14577,35609,191464,1757,13364,161349,32067,91705,81144,52339,5408,91066,21983,14157,100545,4372,26630,129112,1423,29676,213626,4397,88436,99190,6877,49958,26122,114348,60661,29818,293118,50042,179738,16400,163423,89627,31040,43973,36638,45952,5153,1894,109322,1898,134021,12402,112077,68309,190269,69866,31938,107383,11522,105232,11248,14868,39852,71707,186525,16530,38162,106212,11700,5130,16608,26998,59586,108399,230033,43683,48135,82179,2073,5015,196684,189293,16378,23452,8301,35640,11632,214551,29240,57644,33137,91949,55157,52384,117313,5090,17717,89668,49363,82238,241035,66216,29066,184088,97206,62820,26595,4241,135635,173672,8202,459,71355,146294,29587,3008,135385,141203,14803,6634,45094,69362,50925,546,51884,62011,83296,234584,44515,56050,89476,87751,19373,12691,149923,19794,13833,35846,87557,58339,2884,19145,25647,12224,11024,77338,64608,122297,53025,7205,36189,36294,170779,21750,7739,173883,75192,35664,224240,113121,30181,26267,27036,117827,92015,106516,55628,203549,67949,60462,60844,35911,20457,1820,920,19773,8738,73173,181993,38521,98254,76257,46008,92796,5384,26868,151566,22124,2411,15919,186872,180021,28099,152961,78811,80237,62352,102653,74259,184890,16792,123702,224945,29940,19512,75283,14059,112691,92811,233329,20411,138569,53341,109802,50600,134528,66747,5529,166531,31578,64732,67189,1596,126357,967,167999,206598,109752,119431,207825,78791,91938,10301,27311,24233,252343,28831,32812,66002,112267,90895,8786,8095,16824,22866,21813,60507,174833,19549,130985,117051,52110,6938,81923,123864,38061,919,18680,53534,46739,112893,161529,85429,26761,11900,81121,91968,15390,217947,56524,1713,6654,37089,85630,138866,61850,16491,75577,16884,98296,73523,6140,44645,6062,36366,29844,57946,37932,42472,5266,20834,19309,33753,127182,134259,35810,41805,45878,312001,14881,47757,49251,120050,44252,3708,25856,107864,120347,1228,36550,41682,34496,47025,8393,173365,246526,12894,161607,35670,90785,126572,2095,124731,157033,58694,554,12786,9642,4817,16136,47864,174698,66992,4639,69284,10625,40710,27763,51738,30404,264105,137904,109882,52487,42824,57514,2740,10479,146799,107390,16586,88038,174951,9410,16185,44158,5568,40658,46108,12763,97385,26175,108859,664,230732,67470,46663,14395,50750,141320,93140,15361,47997,55784,6791,307840,118569,107326,18056,58281,260415,54691,8790,73332,45633,7511,45674,143373,14031,11799,94491,35646,96544,14560,26049,32983,25791,83814,42094,231370,63955,139212,2359,169908,3108,183486,105867,28197,32941,124968,26402,88267,149768,23053,3078,19091,52924,25383,19209,111548,97361,3959,24880,235061,9099,24921,161254,151405,20508,7159,34381,20133,11434,74036,19974,34769,36585,1076,22454,17354,38727,235160,111547,96454,117448,156940,91330,37299,7310,26915,117060,51369,22620,61861,322264,106850,111694,15091,2624,40345,300446,177064,1707,27389,54792,327783,132669,183543,59003,17744,20603,151134,106923,53084,71803,279424,319816,11579,21946,16728,38274,72711,5085,83391,88646,40159,25027,34680,10752,12988,54126,30365,18338,100445,230674,44874,84974,143877,123253,139372,28082,91477,144002,13096,219729,46016,50029,42377,14601,6660,58244,58978,23918,88206,113611,64452,17541,41032,10942,12021,49189,10978,40175,37156,10947,71709,106894,112538,57007,137486,150608,152719,40615,7746,279716,13101,19524,28708,40578,72320,1096,182051,94527,51275,22833,45164,81917,77519,48508,5421,140302,37845,149830,5587,27579,5357,428725,248187,6326,206760,39814,32585,89923,44341,288753,284443,96368,31201,94189,119504,20359,52073,103216,179,27934,32801,96035,34111,34309,101326,18198,20704,210266,37643,27880,141873,106e3,19414,56614,167714,66483,107885,86602,4379,20796,75467,4987,5017,118857,26003,34308,114428,29198,6686,29697,73632,3739,69795,16798,41504,7207,30722,21436,36735,28067,28545,3239,11221,36031,41889,100010,19247,317673,29495,174554,6424,129725,53845,94986,7955,59676,2604,191497,19735,102214,62954,23844,11872,179525,261436,34492,428,78404,142035,16747,17246,27578,37021,33672,57944,26056,135760,2369,61674,122066,31327,19374,157065,40553,130982,69619,71290,38855,72100,92903,95940,51422,165999,65713,57873,50726,7288,20272,2081,42326,22624,81120,57914,79352,19447,1684,72302,11774,302559,161481,96396,13692,414988,3721,79066,56627,46883,21150,11747,12184,5856,113458,176117,84416,52079,27933,3354,59765,141359,2212,216309,2555,23458,196722,142463,45701,44548,28798,19418,215,29916,9396,10574,114226,84475,13520,18694,34056,4524,90302,62930,13539,19407,77209,7728,38088,9535,2263,23875,183945,17750,26274,67172,10585,28042,22199,7478,51331,66030,26774,192929,31434,25850,50197,52926,178158,4679,181256,70184,229600,9959,105594,72158,73974,2726,35085,78087,23284,35568,51713,155676,5401,27254,11966,17569,223253,71993,103357,111477,55722,30504,26034,46774,35392,36285,214814,41143,163465,1051,16094,81044,6636,76489,179102,20712,39178,35683,125177,54219,30617,52994,25324,50123,2543,87529,58995,10688,125199,12388,60158,125481,131646,7642,133350,65874,3438,97277,101450,10075,56344,116821,50778,60547,98016,106135,13859,14255,16300,77373,173521,8285,45932,37426,4054,114295,55947,7703,39114,52,51119,128135,19714,60715,9554,50492,88180,2823,118271,52993,122625,97919,23859,37895,25040,33614,32102,20431,3577,9275,15686,43031,157741,110358,1884,40291,125391,13736,5008,64881,87336,77381,70711,43032,49155,118587,70494,4318,10168,30126,12580,10524,280104,104001,145413,2862,84140,6603,106005,13566,12780,11251,42830,571,179910,82443,13146,469,42714,32591,265217,424024,92553,54721,134100,6007,15242,114681,59030,16718,85465,200214,85982,55174,165013,23493,56964,82529,109150,32706,27568,82442,5350,14976,13165,44890,60021,21343,33978,17264,4655,22328,27819,75730,16567,55483,14510,17926,45827,150609,3704,7385,272531,161543,76904,122163,52405,2039,19165,41623,14423,228354,3369,176360,85491,7122,35789,303724,4465,13628,2233,55311,118771,20713,10006,221519,45115,71021,35650,29775,7337,10864,20665,21142,1746,15080,1624,32449,10905,105743,229797,7701,3940,22997,178467,57208,389057,39683,59403,63344,63125,54847,69691,18336,56448,3362,37202,18282,29648,138224,35867,10495,5911,28814,26653,31514,176702,26550,45621,11734,4525,40543,73944,121080,27858,155561,14887,44670,30742,8796,107455,113472,56369,75581,183777,240095,133699,153299,8768,160464,26058,49078,103971,21875,71486,44888,17156,9678,89541,123019,102337,3972,83930,21245,87852,109660,287918,183019,686,10100,39177,283941,11274,24736,26793,26214,25995,77011,141580,4070,23742,46285,46632,30700,26669,19056,35951,115575,174034,56097,35463,87425,24575,44245,38701,82317,85922,281616,100333,147697,61503,7730,84330,8530,59917,61597,17173,9092,32658,90288,193136,39023,20381,56654,31132,7779,1919,1375,117128,30819,11169,40938,23935,115201,101155,151034,4835,11231,74550,89388,59951,91704,107312,167882,115062,12732,72738,88703,464019,158267,57995,60496,737,14371,123867,4174,243339,159946,7568,16025,134556,110916,38103,191,80226,88794,29688,27230,10454,76308,57647,77409,113483,66864,14745,19808,12023,46583,84805,16015,17102,2231,20611,3547,95740,250131,34559,108894,8498,15853,159169,148920,20942,2813,93160,45188,210613,45531,52587,149062,39782,28194,57849,60965,84954,89766,84453,100927,16501,27658,165311,103841,54192,207341,19558,20084,319622,5672,205467,98462,61849,36279,13609,147177,24726,165015,209489,59591,31157,6551,117580,75060,141146,277310,21072,22023,106474,63041,137443,122965,68371,5383,42146,98961,113467,30863,23794,4843,99630,30392,82679,13699,241612,33601,93146,24319,18643,32155,95669,40440,15333,34089,67799,142144,58245,38633,114531,117400,77861,188726,5507,2568,8853,10987,107222,2663,2421,11530,13345,30075,41785,118661,104786,17459,12490,16281,71936,193555,17431,5944,71758,26485,77317,20803,367167,158,7362,93430,11735,172445,46002,11532,54482,930,62911,2235,23004,179236,4764,101859,208113,22477,55163,95579,14098,67320,162556,90709,156949,3826,57492,4025,34092,87442,104565,6718,186015,28214,14209,10039,107186,233912,58877,81637,55265,39828,6194,145813,50831,105849,4974,88319,122296,10272,197216,95714,51540,72418,23324,91555,8743,140452,250249,51666,34124,7229,38592,129641,78169,174242,22464,149964,51450,14034,10026,95376,26190,120062,14401,8700,265,31386,143573,7203,229889,61567,4227,140981,2466,72052,10787,10062,30958,6099,38471,30103,23202,208101,70847,467,58934,32271,32984,36637,24107,30771,17109,73353,13650,2098,157040,67366,66904,106018,265380,107238,18535,44025,32681,144983,62505,91295,56120,3082,77508,10322,63023,36700,81885,224127,16721,45023,239261,111272,13852,7866,149243,204199,32309,22084,42029,38316,126644,104973,14406,43454,67322,61310,15789,40285,24026,181047,6301,70927,23319,115823,27248,66693,115875,278566,63007,146844,56841,59007,87368,180001,22370,42114,80605,12022,10374,308,25079,14689,12618,63368,7936,264973,212291,136713,95999,105801,18965,32075,48700,52230,35119,96912,32992,8586,16606,101333,101812,14969,39930,759,193090,27387,42914,12937,5058,62646,64528,38624,25743,37502,3716,4435,30352,178687,26461,132611,42002,138442,35833,59582,16345,8048,60319,49349,309,47800,49739,90482,26405,34470,63786,32479,85028,39866,47846,11649,23934,29466,2816,42864,31828,7410,74885,49632,47629,111801,90749,19536,18767,105764,59606,21223,10746,76298,22220,39408,7190,79654,64856,11602,82156,272765,17079,70089,245473,51813,184407,384678,1576,122249,5064,27481,6188,25790,74361,27541,318284,45430,31488,620,93579,45723,192118,22670,51913,4162,70244,35966,26397,16199,50899,209613,121702,287507,2993,36101,132229,67345,33062,76295,118628,78705,52316,34375,107083,107454,44863,127561,33964,3073,154010,190914,55967,39074,6272,31047,5550,41123,26154,98638,47110,19998,148091,50229,31329,59900,195442,19106,61347,73497,70015,682,45850,25776,38022,148951,6288,37411,232526,109277,27286,32342,9262,5220,16651,23175,46740,129438,78614,121925,66914,88710,127952,5563,21500,34521,10739,14863,191006,62956,17359,16749,67027,56284,69134,43301,35039,58883,54466,60823,404451,75743,59856,86979,7923,34273,83785,32142,7693,268986,197428,282681,17049,22346,22990,92245,107180,3357,37104,96724,49153,7683,31197,43267,82231,164276,23696,20848,188364,22309,24821,158707,1018,22514,70922,27792,45589,59709,10765,736,35218,63479,51987,24275,63588,55361,92929,81964,4658,20122,12330,44058,13065,311456,72224,8337,211229,38979,22590,138478,52757,32595,133600,8838,31549,94412,43391,90056,1585,94802,127271,6223,31889,137038,132910,2165,57616,230152,6080,10748,36737,74579,134062,50525,180532,119270,34556,76155,82394,52595,29258,31435,87820,67996,26943,183878,38007,2410,13526,180297,69856,3503,187396,167700,7838,16701,9199,56267,3661,37407,65994,23767,5708,62508,221700,67088,86978,46776,84434,32088,5612,9149,88244,21685,95151,46750,189612,2979,506311,2594,3628,40074,105039,78243,28523,6651,38058,71999,30992,12764,68261,108991,6165,26450,61961,13400,22426,7490,60890,109623,2070,12958,50355,67979,257096,7213,42578,52121,35716,65461,7516,124758,39268,302,64712,14977,1467,219452,2840,34229,11121,21602,19270,63574,8024,1532,17331,79839,78885,52029,180767,57957,6069,91265,61380,55767,8927,32881,287603,22149,35029,68876,6428,199567,46926,13412,104132,21434,366616,45060,110046,81924,128910,45886,52821,130416,29416,77342,21762,67329,121432,79924,11724,38625,81006,102033,28338,13326,3250,82056,82526,38212,21112,12382,111495,3263,7414,86274,93490,40844,30224,45212,24019,48411,71367,24941,76729,57776,3769,38114,202019,197745,31953,237533,33270,201580,255648,100798,44741,32241,98468,106931,10085,15090,170358,33154,66787,18819,69760,25061,234005,82660,6295,131975,16874,9076,4094,25005,17740,40908,19533,220019,44330,99792,50040,19619,13950,55228,24423,31253,95308,103177,184795,28590,82285,5059,3210,75525,49894,70007,56178,10580,36051,139681,21617,98736,3555,106306,164189,37352,63915,47824,24883,145530,61904,28444,11483,19837,145446,30420,112972,85939,11835,191233,2262,20705,58630,1753,148334,1197,144714,6887,11223,107667,60879,77914,4151,57417,81594,96681,169430,1784,20444,95138,254041,27038,596,7117,72808,13759,3353,126776,21074,55322,27081,36942,39547,139830,179275,4453,713,8722,71399,19204,25785,22794,23923,104114,11291,25458,102309,88396,75288,230440,206396,104551,58447,130857,37247,94734,31548,176529,226077,65159,20104,10096,66881,94191,237909,27109,37404,1520,27421,25220,113003,23423,24884,50585,6286,231877,150800,11789,3226,90004,60642,5053,202400,61442,132531,175329,57138,30116,103847,9973,75367,16452,32360,59119,21246,10191,164804,23305,61051,37348,154530,13214,5468,50403,66754,130976,50559,80515,14436,155492,84017,5472,43107,41240,2890,90431,70188,382,76234,48040,50211,281038,237007,32115,142178,1536,22761,96429,1811,31243,1679,49143,55209,17402,235054,61494,7462,77030,34925,87609,78002,9499,9027,73289,201078,101379,63544,27666,5469,10642,30029,49816,132979,95620,58086,351930,116300,2110,2043,30845,6154,11279,16727,4122,2277,27281,4971,3650,39060,61970,65951,39674,75686,38151,11370,130809,177895,32665,63725,122267,7857,39618,118483,44792,157755,178624,136994,24260,41308,22471,12404,21707,12486,30473,52781,50246,20247,39065,909,56825,103158,128603,31542,1089,41935,32744,12428,37963,84420,33134,72921,208449,42622,168151,127335,147107,46699,38216,12591,94342,85814,31423,24944,2605,87542,67473,192551,4496,56321,91819,17630,6300,256183,114569,202090,33209,35289,34897,24967,40520,43470,5344,10199,34810,14283,10381,10017,62923,49924,23233,64539,13051,35686,19698,11570,135555,120868,44924,87065,52318,52335,47586,140906,245885,109834,78668,9065,46990,25258,72022,61243,40838,4545,146387,10537,11557,17470,36930,68104,46711,24264,79401,81043,18225,120488,24746,84338,81652,28266,13776,21878,46973,1047,230465,73357,95777,24973,210160,62210,58404,110633,169651,6937,41870,9909,26822,191062,76553,27519,96256,239070,2478,205678,67955,58532,20601,50120,19148,78501,195724,110740,8249,109665,27446,30568,57631,31425,49752,32820,65504,50079,3663,102256,219898,23849,211315,14645,4359,91767,9528,12449,49366,7941,49763,107848,8930,27086,50686,9744,10447,81935,39513,46514,1670,29229,6172,22312,137280,97759,9806,14445,22976,56458,73391,34983,93760,174219,52573,33149,59747,2429,136277,75123,165263,91040,7446,57632,48633,97140,246081,84766,151684,79918,93268,120346,54059,54875,77858,32996,103590,45276,11968,19600,25849,17159,132907,42828,16817,4913,99462,103303,27395,5737,74184,20749,21160,14377,77062,131403,158735,10999,27799,77785,9320,34366,51593,61070,33746,47048,29268,36675,30262,53297,9832,82e3,20188,122292,39917,7331,18160,68301,185935,134830,15031,4935,10004,165845,185534,46923,30109,44134,122631,18874,22903,112790,26561,18549,348902,82871,140345,255565,135390,63556,103747,145055,179600,145662,296111,61661,211987,23952,52342,126343,48450,32919,44277,82185,9591,62139,205363,376969,394874,108461,18040,120885,14798,39863,16571,16794,58271,81025,55206,14640,118656,6361,44092,85970,6262,153863,108244,180200,72264,79947,38044,10050,5735,61221,80712,5471,115689,11391,11661,184257,20010,60116,30320,19327,134598,45455,27542,18004,125092,452272,1549,91523,46567,180063,156026,2608,11174,58848,37788,65907,80194,30490,5786,40775,119519,106241,11323,156297,8425,61495,2617,29675,2425,59886,112582,49142,59618,4863,50597,86710,50650,168632,27693,85641,83643,18993,25768,84284,28090,93592,36627,312804,43381,9887,9402,100931,97165,3311,173330,66805,28935,4963,184460,3201,78102,19126,21607,37496,24938,22615,16153,32862,134792,153318,61120,6067,2812,12826,12792,23825,37559,64662,202250,102694,155488,85881,149193,46233,65383,15521,106982,11358,176786,25752,39717,34208,24510,32464,77742,39371,72028,138229,60688,71386,102834,132477,2208,11548,63670,271279,28351,30338,38620,32491,99845,143885,152266,13252,2825,178663,108097,1775,78201,14897,113573,163346,62292,171129,22183,96598,38733,64971,166776,117445,9968,146393,44677,74867,20908,97328,12761,25656,26785,9148,112344,26115,99176,110121,22437,49547,6180,79320,5835,31392,43328,33377,75870,119860,69497,80273,7325,155219,43167,111173,28347,20222,3763,71752,55041,47252,14618,28088,15012,97805,194698,54636,2036,41349,6173,96604,61530,51859,43782,13361,24334,22668,24792,7070,23441,16789,3209,36211,208475,26242,32880,122181,182407,21444,31060,88459,29929,77907,12716,10934,97005,20599,31690,8403,58445,30303,22700,10336,86731,103115,337709,72556,46788,112566,47684,67089,53548,36874,56487,41387,125985,26893,40071,106683,73712,18787,40105,72992,67246,137276,50802,36790,70328,138827,22466,39263,183295,29858,50975,9322,57397,10654,24364,30383,55799,41600,23584,127295,296610,129078,143558,244131,86397,36049,1085,80677,3820,108139,5476,34767,24683,7758,13060,7239,131671,250593,59556,103392,29810,4188,252323,39404,116877,7651,43600,40338,13554,157253,39196,25978,144387,61211,234,50104,6129,10449,93777,9240,356378,274148,4439,72970,3724,147770,78680,62570,115877,40027,40547,36817,224392,64609,34795,165027,67440,2477,37206,23431,50754,164797,46018,94995,170982,27051,7957,22767,3674,27900,56419,18930,60701,41302,2692,84749,339721,61996,111094,80221,50129,1045,8153,62945,19202,8250,37208,37418,32560,79477,41106,88569,33963,36693,5892,30570,1581,66471,49647,11922,160717,29442,5643,114865,82962,95982,132098,22633,22838,94726,54556,28566,205039,162340,33216,16849,35847,221339,94851,26533,71469,1805,3804,12935,45483,71020,36310,65381,192960,34240,35165,59773,1248,46954,155332,96864,4246,388800,16129,57133,74592,44807,442014,38203,42574,80818,91592,26377,36424,65760,977,77387,22628,147610,28018,30561,98454,6969,119628,63648,18170,36854,26601,64018,22027,37279,51395,152934,21153,9430,58760,194742,5330,55115,34158,28917,174111,13171,122326,1526,43896,66094,25325,4234,148354,11450,275,18999,112191,44365,22723,68409,8733,57746,96565,75007,14196,108844,29475,88599,177563,100792,106156,86323,93726,14248,135341,194131,40126,47099,14779,8272,39597,95983,171398,65882,28052,10393,47213,40689,22120,72212,106829,34964,109146,753,648,21660,30047,17527,181025,5619,145357,4085,216883,9359,186951,24779,53931,24545,36197,223296,62628,168101,4243,107313,30321,26642,13049,51059,31027,107912,807,73550,26551,84369,122422,165872,49754,74213,234264,33151,52014,33100,87183,22365,52500,40013,23302,5652,72723,21404,26107,48434,587,94049,168493,96418,32871,70860,31709,25128,443,71597,166253,15670,70994,26341,133675,28280,75491,54756,47955,56028,26182,11952,113272,472197,64640,110753,17919,337,50642,22576,142,87371,53391,93210,126694,15285,19642,85667,14148,1506,42092,52962,33243,11970,20734,135843,57044,58880,13002,219134,22876,64754,232519,4257,43120,321573,24799,64526,124728,52579,81472,70831,276848,17403,74359,23021,182101,74597,23744,148267,12055,7976,5349,11772,67540,167347,65318,18720,127832,108238,22828,90233,9987,259080,118185,73209,79270,13775,90100,137742,90799,70569,15699,19961,9087,67475,57872,39731,8810,134897,131868,146849,19898,3334,2281,167061,91073,60356,467742,74712,188,53179,137679,92769,29241,9537,132595,80119,1041,88962,5976,40171,44911,102859,139059,104558,98987,47761,19272,71472,113864,175377,73338,10857,23402,23758,1591,139864,5644,4076,118760,16427,134198,18853,20291,100849,37423,22038,36677,19071,195521,57445,11069,31869,55718,66882,148490,44,41296,75242,49704,166810,9906,20943,122258,49112,105667,15969,10344,6408,187694,21399,72742,58970,14867,14376,81889,41856,23225,15042,56993,16074,131389,74276,72407,53875,383108,53597,37363,68993,44854,122548,430927,198279,38430,80409,12245,2981,628,2818,17760,37437,238229,7968,46892,2200,3730,34190,65983,37959,112291,87850,70827,6522,20750,73913,111621,41652,19587,2780,58668,25916,85259,18200,168962,95781,42445,102050,7776,57662,103313,47742,96358,41964,66174,100396,29069,204735,19679,27978,7479,40264,22534,61183,36081,107436,58223,14680,23002,101311,24716,124108,12908,5646,31750,40380,14215,232799,102772,14122,96775,61398,50917,12096,149880,67833,598749,124194,155871,49216,790,14677,65319,56917,7440,145744,95701,12206,49405,129269,76199,45732,9767,11058,9047,210885,11051,7392,26307,2130,8132,147526,20802,232698,115660,50060,59789,57344,107623,80343,112676,23291,9866,160971,34032,118291,15719,59730,164911,28975,2659,58046,78480,21854,66209,53863,109085,116045,29021,46481,107552,22130,18764,70254,31272,11300,52460,43933,84738,20721,53869,190840,79673,105300,7561,321817,66924,13940,33281,101046,183181,32176,71878,5678,62924,79535,56646,40303,19559,27703,93042,73368,42187,3670,37376,46440,7023,36816,109628,20680,5940,276440,275233,170848,112093,136996,14984,20226,111441,77693,112960,48577,39370,55707,50314,123404,26570,54281,61372,123391,4857,35928,246740,132507,106646,44241,7196,92258,9825,37688,51197,303141,5590,15476,132986,10955,85782,34486,26696,7991,28813,18858,39546,11703,11365,38185,5716,93555,11925,40121,60002,6985,10976,171384,3887,43394,13337,56346,6381,252336,39573,75042,53711,1028,31781,44295,95925,131713,7214,68125,43571,70954,213234,1628,8760,13391,65485,17320,56038,1710,25248,60803,57399,19839,3870,326,281556,50945,72400,21460,316244,75619,56246,98775,481,13513,55765,50427,7388,123519,32929,57908,27124,61316,101097,57467,30228,48792,10788,20402,37318,50526,155730,34456,158065,145305,17832,43733,64052,4506,35072,205355,177028,184004,187081,68616,35938,83703,10367,36892,93186,260137,51934,89970,4985,23445,26755,21558,7948,78741,23376,124405,85594,68596,57536,49351,12619,56593,132668,99924,109728,71844,71935,196018,65464,17617,14987,89701,143773,33997,8687,22701,33258,2914,4436,72108,85610,9671,49067,2327,82988,1361,1672,44033,35777,30269,24057,10605,82236,616,15793,13919,47249,112086,116698,9484,80207,90574,33304,68624,93127,56101,42210,160929,4827,38995,38095,4701,125119,5027,33680,9236,231236,14135,87837,23318,70261,78893,30151,81482,14332,1084,74256,27532,46644,79185,3148,62615,6981,55672,31668,36825,1849,14536,37446,14738,23779,43058,162749,72199,1168,21346,5592,85932,85302,9668,18351,57135,150360,2080,228015,77953,34670,119302,151751,31009,106725,84265,45214,59289,74178,113071,263206,111009,4021,44449,188119,192629,123592,392506,292847,114487,12831,205858,9852,20780,79648,75767,357014,97721,18166,21005,67950,33226,204009,16536,2987,11335,66717,144910,47950,17262,55060,15063,2934,51038,26775,178497,66008,3427,49433,128592,20036,157553,63861,3089,23015,51210,28696,35933,49942,71135,231518,99620,17248,21835,176536,20676,16944,38700,165831,233253,295625,36723,13023,52745,10907,19423,67972,125868,95473,82875,1183,108455,52685,33417,64095,21433,52438,33191,127809,44505,211823,7810,2752,95548,162031,7185,91196,47563,61721,33359,17897,23682,42806,178101,22874,49707,199897,75419,82456,8618,11171,79712,116847,18783,44190,46564,5346,59046,95032,7893,14916,3214,26800,24172,121453,34362,10250,17408,18888,4840,68696,22831,13162,36005,32512,14800,62357,41723,45046,27247,37486,5372,2564,34261,298500,66509,133920,89138,31305,117697,19097,108304,81386,84106,23802,46411,63304,946,51417,41777,41041,19501,115864,60743,294354,37955,94165,18116,1156,17937,20645,57114,90804,58042,48643,92288,9861,2557,88546,61333,101008,12853,5148,87856,4152,144503,73841,18718,9789,147565,10846,42085,12789,30223,8993,56352,67203,2448,28215,6052,23540,126319,75933,36689,80235,23231,23561,21383,38800,77548,102798,21234,31468,158608,46188,63960,191679,8051,67014,11185,170078,42186,28827,34777,41930,212079,12421,34750,24111,110344,73918,45171,70826,141949,40063,23979,24254,37309,26724,27179,24718,83648,54938,14591,17425,29525,102675,48975,48654,12316,8929,60640,41709,50168,63264,89812,50716,48632,38755,138583,160123,55579,71829,24230,233277,46322,39650,166388,34718,24108,98252,7031,106695,62498,18258,35062,217827,78731,34824,33354,19520,60852,2432,60224,8587,2836,62955,702,20227,42285,40560,95592,62486,11094,53035,143291,18842,46177,77994,1770,9657,107422,172915,32655,128716,25886,25164,156740,119928,165875,85817,11007,89110,33956,12652,65156,180266,8494,36889,19958,20955,96,1264,118288,135769,44754,86671,5632,19026,168220,289120,33569,93821,66144,70635,7687,5642,2714,55445,56636,71545,184182,93133,7332,37389,12643,52315,22729,11014,158742,17050,152889,50178,34601,41945,52136,9948,26914,63548,95721,115951,40759,8960,158258,38938,49232,48325,42234,81523,253019,66128,40978,20048,238048,38760,62928,122560,118532,43687,137472,163689,26680,9878,17448,51035,16211,60834,36749,29178,14241,59868,150086,2305,26477,42422,34342,165341,83279,33894,14257,29928,12743,13957,125571,89134,66712,10952,16507,147839,30146,7249,16565,45399,39874,114565,215780,31990,230881,171477,102,196546,44538,10880,84948,281705,86651,10617,31395,2342,453658,43569,60561,132901,21845,17727,58556,258242,22262,58728,4008,77997,11806,37431,30599,81375,109137,185787,114085,217292,97453,169085,30593,60212,11544,102056,65580,2384,91655,4855,95725,7295,157994,16228,20669,53276,141590,105246,17334,25440,76067,17967,39321,38911,11362,28559,63807,21627,26468,85816,40120,1025,15234,58319,69516,66512,124548,75845,78873,22137,46681,51242,85683,32909,76747,35555,43396,101465,1765,73094,1077,2962,39028,66777,57831,42048,15828,13962,36041,63657,52412,5242,58846,2141,5506,219012,134451,3936,182230,17558,17153,152237,22621,49377,170216,35257,68233,65374,6510,11126,212151,7184,2480,22517,3437,33073,30156,16557,3768,55067,86829,91e3,12350,148650,66017,79424,70885,49066,28250,21369,51213,34533,11510,3258,18176,18465,84413,6315,36411,163765,4346,356,107618,598,13727,285026,162695,8749,14583,7132,63521,184253,32378,25991,5604,30961,53675,4874,84693,5086,34811,26978,56564,7904,33519,51221,113942,69253,6664,125563,22055,220680,102008,742,51930,19494,176108,44424,35123,13025,75685,11759,74335,22250,181453,131147,16984,132115,154311,11991,76452,52609,85351,196,30969,9198,74919,2529,56838,71779,29187,116304,3504,62330,41190,86153,28393,254926,104228,105189,13264,84359,3574,12415,8534,57147,10175,188174,59504,60932,66318,16407,107921,17638,99103,49278,28403,39786,145865,8462,3558,43406,142271,29139,21989,36552,93955,72365,7176,13556,106185,37957,321774,17782,129017,51154,27938,24952,1935,39366,2791,33489,41582,56078,24558,9311,5449,218786,27808,190429,68013,36020,86003,29735,3404,87348,119357,115714,2324,86796,81973,40992,43376,93621,28784,16808,36367,2517,2909,191926,24978,55303,53308,205724,60068,3098,21375,64784,23949,26579,63121,12319,80145,39967,97861,6757,70143,67642,37082,34698,69140,122883,46151,62187,80934,429,19437,135071,137885,222647,13331,154065,327,61778,74257,40116,37493,14855,85079,237641,42342,102164,199965,71204,4662,29368,5042,113914,122214,8955,13149,102503,43173,5659,163787,69003,307084,63392,171080,21390,81918,86666,36622,24126,28887,5736,28054,207170,163428,79891,346467,95363,38980,111806,80828,9200,19288,294896,114468,87405,111715,141705,7015,72754,68463,48738,243147,33397,101210,37051,98801,82847,20397,4940,185559,18716,54718,83491,11725,40803,1128,12128,23060,5174,7745,67007,46701,1571,27807,180186,256996,18975,16837,7877,212758,250379,15440,87954,57755,24719,124057,83461,258,50864,8874,29038,71289,31627,15429,9005,4061,113851,107716,82819,13651,79656,117851,17539,111446,12938,39724,190787,4352,15402,21070,62708,8539,23777,73853,13552,38810,86117,16285,56400,1718,75342,142863,29033,378,110113,180321,32586,23606,26393,160984,207987,23783,8406,16904,24596,47274,11693,46539,60524,78595,48423,31718,20170,9009,146268,15183,191060,172765,1349,138436,37365,10970,40509,225817,20021,70394,152138,21541,66559,66544,89352,2725,17258,91345,7313,3815,115868,8660,40362,4071,103524,39388,118275,21950,6549,38226,32754,209574,29201,43495,18028,20296,40597,18370,47520,202450,24134,2219,8195,69545,38041,136934,46374,19041,159811,84865,58620,846,98749,13569,30714,97246,32186,4479,27355,92973,35214,151491,75963,37631,1561,27200,238083,23182,60756,12291,25766,39355,102333,87362,65741,59906,19538,201575,48772,102938,24438,292580,39964,66366,9004,61379,50548,37622,38732,28379,68180,76622,17488,69849,5963,7219,48143,43413,55358,540,58691,29506,19245,52193,48621,5518,13048,118625,44755,191081,42061,89197,2259,60665,66994,71210,51232,3585,142096,55024,7892,8345,58653,463307,65658,64319,137941,136323,53499,12746,43492,6978,95163,29925,60175,5128,7352,41463,184756,121146,20473,18426,4598,5309,54580,14277,121151,10691,56711,43880,63409,76682,11830,172218,264898,32632,66536,81062,31649,25788,92774,60222,11100,63159,9432,224657,25240,53613,152,138620,163829,2397,85345,12501,37507,64932,38575,43522,65789,80198,78796,35226,3851,108891,73311,3060,28391,93671,39663,46142,30982,66041,37281,68157,26553,71872,81142,211527,39747,118119,22695,2859,11066,20232,168911,7933,197005,17066,111071,44434,133994,120798,12766,227798,45756,132852,29917,36076,55352,65281,129800,41958,18944,84678,18580,168093,132621,39997,54092,27740,32354,3770,114118,103242,43918,15899,18574,145944,3190,123469,219903,24169,100571,62403,16776,92779,14535,17168,16475,14304,37231,1712,28218,242754,61688,28980,1318,51359,222657,99200,67989,31772,23932,35351,201251,49041,27306,19128,40135,3986,77333,19649,120683,151927,21081,7076,78375,77501,101599,8011,89585,96715,58179,5378,102138,106793,26051,217276,4197,16297,27014,46721,13322,22806,5278,29629,70632,9647,71519,58818,40603,128530,8903,36770,56900,31483,26935,43845,34265,34920,87658,6114,84767,64250,47318,50720,19264,162514,33357,13117,6705,46696,75032,71054,87004,42035,69138,11903,99854,102328,19611,34525,69312,6431,49842,101600,133178,108751,41829,89939,225664,48916,99556,9195,130387,5960,36857,116724,53518,94002,39077,53996,6945,22261,64291,8314,152785,57588,16522,9091,5048,87671,35441,39509,1945,12423,158923,178413,37549,14095,1475,73188,62878,4819,24012,68534,42606,4010,120809,57497,59564,101758,103718,32701,80116,12345,95834,46918,21468,53213,15665,31200,3867,5140,96013,250744,21016,10069,13968,35449,180829,27683,39704,59956,22893,3115,26293,32785,75934,62445,141162,62720,2018,83638,19949,114012,95006,3330,99829,130935,309272,9565,55874,121727,37017,23586,319858,40970,27602,8625,112329,61060,100088,118525,25922,16232,1907,60671,51583,44553,80993,5262,94679,8676,940,20736,11823,3020,16476,12340,152600,97416,3703,25744,66826,16245,16876,46446,84798,74227,176020,45192,61955,75496,23946,23626,40372,26036,6149,11822,30582,16541,41914,82385,232823,40921,80773,14930,3631,7517,39619,4348,36180,126106,138939,62611,1477,113512,47321,25052,14546,118881,29060,23589,128322,36795,18401,137921,104699,267929,36194,172791,18113,4766,188215,30083,332586,94089,5805,77909,22194,68234,154976,43220,40660,70001,184893,138095,11128,103010,22663,5108,212615,8485,5565,49222,54614,26530,42639,16319,55062,152662,105595,21114,22216,10294,68158,10436,86950,7206,62115,3977,3657,59874,456,118617,18156,106663,112229,80992,17442,8217,55551,5133,34344,251927,51153,39364,201321,7816,66803,23057,156724,145664,14276,95705,979,2796,6875,13429,212525,50602,26276,28284,3424,19465,52397,46963,31420,51399,206476,92317,48851,637,100820,83349,10317,60227,21972,6908,282439,32857,224767,95629,83882,42106,87338,69757,29840,68709,37665,45244,114577,49188,175943,54009,186746,106158,70168,3358,234002,50555,9221,129338,9562,20118,32923,78479,118280,65752,4977,10474,102174,60947,129006,10570,83451,8598,8078,159367,123785,80438,16742,5905,5281,181513,42402,6977,163136,93179,42191,14968,50421,112401,105440,33456,57347,121611,4221,94954,36517,24046,27796,6255,33394,72990,135408,116627,1233,57874,25654,95419,68156,401399,313338,55208,45573,93124,119251,47200,38196,11909,130667,45391,73904,64964,167846,4137,115606,52036,62214,7969,160925,7187,1132,134835,40309,73195,64494,80472,444841,61111,26500,45323,40743,53625,52797,22659,15631,29739,36706,28841,39147,102836,26794,10536,14845,87305,45874,12241,127587,83833,57183,79722,30844,41304,84655,20825,92500,3722,25655,27811,10157,81634,31362,34088,92487,70123,22190,185100,72658,139035,192523,88241,2078,230490,44528,85638,100198,22088,29982,291233,241062,13865,4445,137791,37835,107218,31726,19718,38234,72528,23046,19177,66695,5109,17251,28077,5617,21554,47839,72425,133825,1486,73065,181275,141508,21768,62971,63082,2512,34200,9904,120309,6392,91243,68416,268253,41199,116757,138551,185526,41246,28986,4093,19057,17295,4148,245766,122360,35356,112075,20301,75441,10998,7977,19769,62922,937,63547,100196,26427,157820,20983,236696,22935,8140,90315,156004,47204,140973,7726,45097,52725,22636,23436,257282,105247,522,88389,216031,202204,46812,211666,19693,68828,81691,45925,11256,30292,372,5236,167826,88328,232776,151611,5360,82104,18841,80393,25465,18285,20320,72377,31730,33160,45803,38715,27705,37379,24163,18360,103586,4015,32305,269494,91252,20080,36567,54650,7797,57073,12650,31164,42209,6375,261663,105528,81661,106002,2800,5375,17247,43151,4442,15727,194619,100855,144898,62320,78465,39929,16454,1967,28311,61363,17219,9395,8745,121445,76939,80385,162380,22009,54191,44248,16299,122830,48151,74429,78291,64755,14238,44966,2511,17712,67954,93583,829,105899,49935,84750,11591,33185,85447,42717,27409,208542,28965,62052,52525,5597,25694,65594,16343,63224,276188,12475,9331,127507,38522,57287,24128,133161,79723,105548,133695,48917,27558,43278,46520,13778,141954,110785,83366,17715,46317,105763,66298,147013,41086,94180,16478,220447,44611,730,19722,78975,117889,125643,26254,16574,18480,65006,15806,38549,246418,46052,36056,8440,34984,30170,3163,59800,4458,115442,4283,41970,33507,104078,1653,22,121158,276486,3655,6338,24048,133421,23641,2161,24422,36006,8086,10675,181474,12307,29514,59143,14729,52509,87128,122470,19446,80852,33314,24573,119864,14237,9652,57779,6612,51851,15284,98871,90581,124466,156831,21190,22015,71380,161906,87247,69201,18392,17908,108470,72962,40719,14338,17911,95260,43339,20610,78916,20710,72451,11315,31448,17263,58853,178878,48111,116002,45497,80506,82605,85880,36300,121755,25215,36118,301929,88728,405223,276136,553,34704,212438,49970,78329,922,20711,25036,257130,38295,145369,18128,15385,30829,55656,48345,8012,3561,28004,122041,192900,58338,112508,41085,29976,87040,47117,23905,4336,92061,138880,97407,42083,172121,6256,25192,172671,5,93568,1420,12677,31605,56743,40620,6015,78415,231077,31298,80026,13902,19048,24924,170586,32955,176119,87859,36731,6773,27711,24658,26475,115216,133207,93250,95820,88522,8317,5714,124047,55219,86860,19677,23961,22928,162209,8904,225992,359835,56084,96201,29392,96558,86071,93643,55114,13347,8183,95129,82012,2017,123336,34219,115554,157159,47747,101684,41008,18735,193781,104151,226906,7552,179874,124113,31159,21162,44010,14771,51268,166128,31382,73124,77438,92830,205709,12113,1292,38937,13114,1334,2118,15597,69581,14449,21934,76618,48728,67038,14967,51495,24243,87736,147249,26720,11119,46063,43749,5843,44147,152629,133428,65703,14269,45604,57982,28672,55616,45957,8438,95433,37698,220862,132034,39456,61870,4161,26501,73560,56418,9845,4654,20916,10456,88920,119358,9015,65931,96507,48029,38534,21676,109081,43078,34943,25089,6131,28766,23665,5477,10255,16695,67,45778,42443,42770,29534,23733,100513,62617,42630,48746,14191,43753,50295,26007,8792,57243,43119,54725,164253,58250,112304,131796,25165,4651,3188,24831,47748,3705,19540,13211,102095,5593,18699,23666,32005,117571,33541,60584,74573,86311,99443,25172,27222,168938,7143,11853,53560,18834,19960,86522,28217,53266,117700,72989,34323,18721,66450,34346,74056,47217,202002,46269,9429,68582,75458,37823,82843,96652,32549,145144,27958,19820,158086,31955,201406,135379,31207,192545,12950,51704,9094,248263,76147,64028,110009,79407,89345,99284,223492,47966,26848,15359,201137,2861,110507,71231,72297,31851,118777,71039,151051,240855,16333,50766,14727,7939,4149,80908,418780,88378,59276,1327,7284,38576,79814,65820,42199,84860,49574,62596,12396,70598,40117,8648,7994,16836,7630,14047,359699,106878,525,29037,28064,13380,11675,50669,74216,103539,180314,27449,56299,172344,19274,7301,246099,32043,19422,36506,129317,6806,30140,4614,46639,66926,932,86600,6322,27847,233103,10541,39025,34887,3517,12972,26220,2031,66561,115015,48658,47596,12714,33845,3893,16165,35237,89983,14769,11962,147224,47018,29977,27979,5552,82338,86023,131368,1218,24853,237840,132193,15455,40873,3668,65351,53388,15229,59889,272245,47934,11858,34347,18038,90853,86981,300602,19343,114181,29362,84921,6095,106059,79472,38015,1206,48741,6208,8e4,21916,17423,6002,108083,24479,34931,56661,9511,26995,100694,163853,35997,81254,58321,18919,171890,86877,91341,74503,70477,53412,7027,59281,39892,131302,5864,15947,61301,67466,162369,47956,27874,35624,282324,21270,111847,102548,41482,30955,116737,28264,8592,55458,22301,75090,29821,30697,51709,3041,19208,8038,24634,30467,87509,126428,19389,18814,152686,20701,83474,45832,80891,105808,11378,153223,120770,98186,150633,49838,9141,12755,30962,5260,74490,21256,31678,65062,33326,289838,187831,20595,89768,2805,58535,10844,70085,12090,2451,138068,98544,24461,4511,6754,41684,28203,3383,65355,82833,30161,83924,234361,128424,28921,222594,33975,125491,34069,11508,67464,144226,41850,98703,34371,7901,21254,38398,65651,23549,53883,213340,123269,12028,71764,177701,28758,2623,68395,11549,15232,68603,9660,63116,36079,57093,31198,20475,48467,89984,35619,186847,107469,31389,43631,73867,41949,68841,114250,1605,30564,63403,17588,27680,99533,12641,70325,50428,73426,78379,11855,91651,72081,91720,60198,15743,12065,83398,140046,6761,46598,45900,5068,886,62448,148968,37347,19405,9680,15819,43496,63370,75667,163700,37639,3633,22774,34341,183131,134335,37200,23915,7054,14194,12970,26438,13350,285521,25594,8219,104410,91039,168804,138480,149734,15907,33818,61132,60082,4622,110187,56736,13551,73571,3945,73463,65498,17758,263266,17593,2710,27585,54469,38200,45367,63754,28881,3473,12791,98287,31895,65787,4463,94536,24951,36332,59901,28803,52130,86403,7668,181822,74831,18977,9850,177206,145485,109798,7292,31421,26280,77211,58511,12507,127004,11113,147,8729,56208,43066,79926,129937,31345,83947,39915,46146,98763,42566,1337,13192,18323,105163,80570,117753,16555,72883,11077,159438,40764,70933,83329,26066,12276,72059,21655,173836,126713,69454,153482,91585,70644,102558,110483,6764,127864,190133,3961,101798,20945,71138,82402,90884,69669,44753,923,16939,59700,164258,25969,27082,31399,43846,6306,246093,51342,6153,151581,202801,182731,56475,162188,89426,141356,14355,121815,27536,28023,65257,77523,106668,127314,24947,12790,38796,169698,23555,10725,44573,183083,42088,62716,43265,105958,32050,44067,50118,1668,3874,6243,318411,16599,1691,94999,52378,28671,216728,123258,2059,34969,69225,5913,136280,171443,141515,91662,22175,135282,80020,92270,1663,4808,4482,3495,34691,5226,109830,108512,17342,107488,11606,123190,100247,29666,146527,113014,15794,30894,13224,39585,243192,22351,9903,7836,47699,11078,25468,122291,48821,26780,122679,75521,81450,630,4895,92900,55074,74293,17441,3563,111657,103102,51613,12318,52370,36191,68245,34269,40445,41354,122901,168604,182500,62012,42557,11259,24428,115113,86345,12362,3909,78430,86852,134602,20459,47853,93879,22577,7659,3688,38555,13349,17381,56715,91639,12493,10895,92438,3142,37057,28928,2004,36427,32268,34222,209974,10432,67436,41989,173518,107930,27079,62729,30908,55558,5828,45031,14902,53546,8204,144263,60255,14520,88212,86582,109589,69356,8064,47449,8505,66558,16886,4844,52817,111260,215129,12941,91118,650,20770,6273,73089,40618,62790,2873,35002,14023,97208,19386,102646,36993,143736,135457,35385,113601,17893,32627,84439,100619,56016,6581,57264,172160,45452,111710,203627,70131,24100,322787,1996,35665,70078,22358,90922,83658,4097,63200,58499,14542,99153,52159,6615,12414,63415,31986,16823,1579,65405,137809,8841,16898,48082,259,33014,42375,12260,179850,73667,91389,98882,29532,17311,326251,41092,5928,20742,44964,48019,43505,9317,49265,6643,192712,48424,163487,19861,20113,70848,31928,105333,23685,78563,14638,54755,7158,24142,44018,20774,125255,20331,24280,10163,1285,2336,39851,4299,117269,46714,63816,87779,159624,11731,9971,990,137317,108831,50994,74554,162680,23640,131597,146962,170620,34829,91205,21184,1913,63616,18427,93136,156592,17519,67565,115882,138220,78622,88535,18115,2711,33554,109492,54298,971,24914,25863,36363,45715,27099,194995,14299,178181,111488,72395,322385,157719,130787,11897,81843,83999,11369,49280,118604,40922,61332,110343,53407,75639,40582,300440,54722,25637,13694,48248,48278,194521,56203,52779,48783,72627,10953,376,16733,280238,26351,230789,15132,25168,137270,3588,63704,73376,94031,74284,19443,159557,9697,39901,13351,119050,15406,146455,3460,29556,75195,37673,102524,92329,47289,98413,15311,100684,56345,7116,95480,11590,7200,167,23610,58426,17730,136656,27944,53151,2701,8824,103124,3017,90744,113588,53216,79736,65940,26931,498,29568,80540,143543,21292,1740,59268,16561,180816,42323,50174,40890,52866,10703,57169,4700,17191,4424,93511,49698,166650,26972,48631,165169,82879,69326,202970,4007,2376,231325,139592,22119,62851,37504,68816,58345,67398,186643,43331,277416,53749,15746,23102,17432,4793,151138,48822,54265,48203,198688,14305,54287,2291,18018,113378,123260,7180,97549,87027,120085,2920,76080,8190,102005,5641,64580,14955,59802,54028,58884,19367,81779,412567,85957,97053,103637,78871,29364,27637,141728,4767,30686,112738,130146,42745,12730,105040,14844,232,210944,36581,152317,135543,29744,3129,55647,58149,46319,27265,17499,28005,59948,7170,34138,5702,293047,110892,408,91760,218674,18469,46095,81403,14389,4610,35672,73060,11006,74848,104820,118143,190357,20043,105358,141735,5115,27093,45924,123073,52599,29433,9616,238350,78610,24851,58858,26769,31969,24613,18294,4982,32735,39639,143563,112073,202205,12567,4873,88601,44897,81503,101648,81362,34662,85277,17574,48173,21435,221188,40215,39576,80786,26544,64668,81841,10731,37733,247986,149188,127703,495,18382,54388,72446,43071,30974,198723,89608,41360,190,33045,8386,31658,19992,237838,119015,137622,50890,100913,6460,116233,267230,26621,104129,65114,14190,41542,14888,85962,23342,23041,26453,43725,71809,45186,4770,46452,53894,56616,221286,18973,9038,109299,55365,19366,26863,18808,60909,69353,41738,83463,12100,68561,72860,3980,13796,49340,12332,31311,27418,4255,53430,18976,45523,510,14224,30477,26581,4530,3651,101663,139840,22709,150861,31996,63923,120623,262522,3076,10528,2929,14672,130238,18087,9816,121894,100308,25085,55111,14565,18952,53293,2042,369988,23674,61789,133529,28783,108293,35477,47119,36448,71049,40015,33055,78598,198442,1833,159937,40654,77444,189245,113153,8621,18599,38553,35223,166072,2375,11659,21786,89523,6032,12116,63046,159398,18454,3678,32521,47626,11411,103527,38896,42946,15696,26370,10185,8413,37080,165583,4331,63555,14907,72220,50056,6623,62236,36565,49783,10049,17503,100581,55951,146244,24724,9626,17969,25524,109300,173965,99994,101056,46459,43647,53737,277968,8347,123521,74858,33829,44762,77574,877,81377,222525,123532,30602,43881,53145,2973,16284,81940,61281,127044,63620,9875,14756,114829,19032,9202,52759,119141,23928,120551,19607,3599,33401,76821,73233,117430,39968,36539,7071,5446,121735,194059,15206,45283,6706,15603,65615,1207,165723,92275,34773,104447,8396,32353,205240,164323,13600,60555,79205,25532,22907,33410,57480,107111,69630,32137,47832,70913,33161,20321,2371,117348,10714,86246,1625,11763,17900,268,78457,99175,97940,101092,86660,32221,14041,128504,125080,53744,124263,31017,13897,403,31859,21964,5633,111630,5547,77329,17961,18241,84995,25984,12983,67491,62168,47262,5241,297,51191,7351,8967,147212,82060,16821,782,11033,82431,62957,5026,43459,77963,203477,53528,6247,191852,87774,74164,215654,13467,1522,219964,28589,244104,16242,117821,67725,72570,156792,17186,15979,26990,44128,193014,35276,57125,16212,166451,68017,6905,77608,16364,53777,75921,76426,37975,26203,269296,64099,84122,12077,38533,830,4407,20139,963,43028,38902,42911,37503,83343,85045,16979,1165,60835,137387,58380,86990,110066,134540,56331,193845,81238,17922,163093,38744,110641,12502,56404,34862,26865,125964,12965,111648,25547,7771,27196,136980,9555,29551,107158,57885,18831,37705,35505,101742,13970,102109,62548,124657,23328,11124,89592,146376,248050,6241,22033,18337,80685,29898,11908,216623,67721,106162,146610,21377,15085,91552,42041,62560,122532,125336,102365,121537,142559,29693,223919,11515,110495,18776,22494,5895,185059,103592,229351,51220,100102,37027,257855,29359,54123,36066,106493,12244,79258,32002,432,56205,94836,90182,6726,14762,29391,48938,26864,38083,60364,3310,60192,14766,205567,57504,110760,22649,24666,46333,21517,3430,13135,28873,27052,158809,11597,20529,6695,23138,22960,37137,45574,6545,305877,43423,26153,24769,59844,14501,10430,134352,56169,13213,103432,49523,35181,13435,12408,129475,64620,230854,77390,51990,15653,83248,33466,44571,117828,51481,2187,10559,68019,18021,54895,48247,18354,33737,4554,108595,37288,39767,116707,9175,3726,108877,21616,83684,49862,1938,8543,276466,20134,108498,48770,102254,31914,131520,185291,100559,51890,209,19526,76471,50544,71814,99351,8172,198526,28816,20419,9109,98389,136777,76479,75596,30635,165417,48216,120220,25955,211071,39314,24308,32164,2559,146280,43403,9233,17947,90585,1786,86920,125662,2457,64741,32152,32918,122882,78538,44001,31723,56426,23375,103172,88177,145697,52506,49319,68016,31664,41488,18486,110400,7030,28241,986,109199,19900,42147,56864,65287,49183,7858,24e3,30453,840,16673,25907,68916,89927,6309,158335,36407,199737,130464,13137,59603,201778,195292,21015,42466,179062,172561,89492,11075,180407,31868,72493,20998,60217,9865,19530,39274,130266,54539,21623,12535,13505,40641,73375,4087,85633,2153,3117,70680,55788,92096,47509,98493,37490,271936,151475,3032,16171,96642,34106,78425,125761,19591,3366,19316,54508,24183,50786,194248,91528,33253,34622,108355,41741,705,3814,3883,108929,13203,67831,10142,59754,68208,29128,84820,56880,38794,24972,48571,40821,40476,18137,164254,24064,236309,79181,11282,395,39169,2013,51587,28551,9645,701,109513,115899,113566,12762,62045,58322,103726,41343,40866,244102,143816,2490,70346,40973,52618,15412,30720,104315,38917,42027,93676,17513,107418,20706,123890,13399,97727,24044,87962,65606,44250,98044,65276,74790,101473,19350,91570,1326,87790,172042,7577,100813,86896,85891,41512,108130,27794,14875,71431,12835,156250,58135,3759,22476,42176,115873,34686,56523,73643,108505,51491,20838,12721,32863,45700,29496,13700,34294,55360,29206,155942,123812,7706,163234,203,132720,49358,144431,8130,175788,35818,3270,76832,25710,54095,97274,28779,94621,74396,19092,128242,58067,20885,14670,93255,15107,63291,23654,126900,129421,59294,262659,9798,3251,67344,28600,44629,50672,29072,26999,31526,23183,49175,165843,175455,17282,175411,32022,45989,30298,90690,78118,83156,23749,35636,31317,7069,80381,94561,133756,14960,97404,6138,41065,78041,32843,16601,34123,9559,146529,123377,96395,54441,42012,84257,123541,10745,22139,106459,11720,150883,172651,154996,110538,4728,53447,25704,2009,71152,119354,21166,66604,1429,216162,8637,122250,63520,27180,29172,36124,276428,107787,77184,4680,14952,104903,24418,14793,51561,52931,8371,26342,48526,7118,92066,67280,40653,8847,34597,105438,14198,50163,61188,146286,50315,41205,170829,161496,585,197359,95056,1687,365794,91349,48507,5804,49263,5146,104902,96365,117343,132222,46084,96919,16875,8073,262381,79982,52663,13928,16056,153908,15145,109256,132308,18763,24904,167644,13618,40750,18686,147124,114709,150038,52849,2938,12568,48617,8778,5459,44202,44591,74914,17183,248689,13878,7822,80060,23116,194037,18487,2067,7798,43077,33678,244028,31320,74273,2794,19466,8218,36280,183997,48124,19416,29656,19280,98734,7715,18311,30701,133602,150307,126956,7378,2933,79903,13178,12593,86571,26604,92446,13574,44205,65699,427599,21118,8245,14407,27877,47936,33542,7916,26460,117762,21596,37818,2249,127359,209394,60044,47677,308089,36791,154971,31417,6998,150042,174360,12255,43009,29335,48739,3912,101398,53340,2580,146939,151295,45360,125275,15273,45383,27456,48761,23314,8750,60801,85823,104759,27894,123685,66968,39480,26917,55290,83305,2696,98390,57569,145853,340733,4919,20024,52268,30884,7413,203685,70989,112855,4129,50536,349518,68205,332641,159581,135361,236026,37563,176404,64899,6578,122033,63871,1850,85234,82089,66124,74145,121098,107351,12687,36881,117334,13136,14698,85933,93866,18047,32620,310,15094,46e3,88451,23632,36645,27940,87618,80520,58892,20976,27702,140090,96075,67841,103292,238964,87778,107338,17019,83427,67522,7302,8261,47570,116787,8730,80484,61772,174422,56005,131193,52875,14588,28471,59817,9586,15720,158155,51307,109734,15196,11025,59331,3884,52626,102602,84797,25158,27314,4437,20488,76214,189248,35023,114952,157376,2827,62439,102878,129749,36405,10329,109339,108633,36662,1254,13267,5470,87105,58004,15397,10434,159667,21864,52022,179464,3013,32147,31496,116832,18494,105502,129227,107267,50033,13481,9954,24267,22141,16257,116154,36185,950,115685,11305,176708,2048,178671,112573,287867,162328,497663,95170,50979,193861,50987,30368,136257,31830,46549,15119,169876,23788,17462,249887,57377,1949,35448,14791,43769,210091,3783,34612,282103,88380,245190,5457,20491,98908,11402,86899,117916,16028,162584,60644,320177,156096,31065,55876,22e3,77655,9992,23397,13757,317623,63978,215255,2443,17648,93231,27388,104529,93807,55505,140477,12046,112040,70887,40152,94365,112353,25063,114679,266061,71248,119555,15589,2244,617,14129,211431,70110,100652,7777,4383,85911,89221,21010,120615,58357,86405,37554,41647,18,15143,69662,60491,14714,186134,148344,42347,5410,168175,44535,42449,343894,129417,99682,20659,27272,140483,63455,222159,17536,13722,42637,62324,11976,114691,148109,2283,32057,182393,4295,147364,33705,2075,44303,30274,28331,63740,69740,29148,10346,44862,33716,73937,153333,12930,38784,247159,2515,41053,20256,83368,256189,54639,115240,5096,24661,175419,153552,26516,141,138176,63885,34115,47222,55709,2765,28479,38875,236608,12229,22921,77291,54426,45388,2860,57787,114579,295139,105782,17826,71066,19119,54364,69385,16568,12323,28057,33346,34919,124763,155533,101386,31644,8627,49001,303600,29868,63213,9103,77280,71333,9696,138789,37059,24823,5057,21352,32368,114208,56803,19424,10445,58514,8661,209508,26187,171838,10460,63454,14016,122504,41328,21329,46618,32493,38225,7855,31763,7945,29876,8734,6438,24205,97490,139977,130740,47323,33195,85390,57194,13813,60600,21313,96251,7699,27584,170521,139271,1363,4402,336738,129223,84983,69150,13147,3590,163929,207225,155260,55916,20288,4503,8398,98490,11773,27512,37113,84976,86558,28365,11756,116005,182148,13733,115313,47644,67208,85069,9347,14995,226141,14704,101835,41159,35314,13113,63526,214039,29978,50446,83339,17440,129441,72522,118641,97816,24907,73844,15717,118884,167255,96509,162793,30847,36849,51297,78974,77793,10427,1873,2972,9999,35074,28190,64297,146836,46298,60038,163007,108919,61219,2403,75022,127339,4233,110389,69022,9833,128097,88016,79390,222936,22570,94657,28462,56956,38803,81536,30474,152794,19566,16481,147408,74574,81895,20731,1918,1366,76367,187321,54494,24366,21690,61696,33283,107477,77499,31112,414383,74362,18463,218441,120929,59848,258629,201924,69269,454,19989,13054,59894,3623,58908,20681,35723,78523,102680,38988,184112,108087,50944,132704,52966,21699,18860,96349,201411,82697,85395,95658,5093,6427,177894,44191,32755,26961,155739,6249,31310,81030,26574,84311,120155,86730,113535,7424,48888,13516,45747,98098,20077,183995,81945,43210,26704,40420,75831,45648,11180,6855,57927,65528,124096,34851,2598,156633,107572,127352,38169,123845,60142,62722,105584,232364,23211,68120,1601,22169,89299,747,258039,80572,7258,152249,11862,101204,8834,121434,33761,19175,133142,46343,40178,48723,3589,41977,30210,38868,62257,10087,82658,87827,90646,16415,47552,351723,28298,72225,91146,272760,1701,11295,1652,109651,300747,51863,198800,29446,11794,32345,37538,22356,33102,37590,113544,37970,11478,179743,25454,103417,59905,221970,105196,145604,7817,164809,102360,16974,75840,255333,56902,6659,1954,645,59400,67769,7689,18675,5215,13793,20536,27852,3387,29523,259718,16860,94625,43143,29245,15848,233581,22685,63631,78557,22836,133302,84513,1348,51826,47129,98836,58284,1830,1749,94642,10933,6145,12506,10975,13879,103781,144434,10268,28409,32346,52968,121567,107374,77268,23686,35097,10501,155275,15303,47136,21102,168741,55332,90385,15996,84817,681,137803,25054,142275,6163,38175,8056,124296,240642,65621,4934,178205,16101,62803,60964,18230,100622,76465,44689,14545,9543,47514,16852,93380,28048,12047,107106,37575,101485,77047,57326,34819,96137,76916,6469,46264,115983,75768,87668,69942,13027,165,8373,114231,26434,52844,42799,182044,23580,146254,38081,43236,33883,146220,382894,14606,46035,36481,166621,35417,95382,2957,59384,60428,36358,66343,75378,22267,22950,83528,17577,56474,25285,4619,179691,75355,95836,53295,34588,171410,4487,14679,84208,44015,18562,109133,54101,11531,86052,174479,303157,28095,9953,35642,14564,39802,16145,77606,117406,53038,121117,53624,22062,1212,7632,127157,237292,189087,10478,127345,102515,181997,86752,87623,10966,121602,68783,68681,83042,114380,138349,191305,67176,50085,39016,1427,42384,1412,67118,122616,72389,25260,2237,13576,137346,19938,20304,2191,68759,5373,61364,238507,75814,23931,69565,38993,131741,38364,12528,87762,5679,129853,5310,186831,32653,90338,260176,389531,108118,26843,43985,50175,30563,25106,56965,18130,140428,4542,165503,117991,24219,229605,1819,129663,1240,3797,76093,18398,71339,51919,93043,27175,47060,216257,6483,35051,1217,16512,80798,129064,13225,69339,8548,237079,72298,2575,34280,51379,117910,55671,53345,247552,29486,39328,140821,34681,57045,60177,5004,90269,78522,2479,322607,48474,61296,13057,31558,4678,59271,6699,27044,31988,35944,12503,83480,4389,136508,3781,114121,70279,4488,155829,42214,2898,68191,75695,305850,45041,74344,106509,30087,17429,93292,12477,290,23080,114802,35714,18751,26554,105424,17775,2144,2412,100610,65192,113975,52975,180272,135050,129815,76238,106483,21440,63186,4260,46189,9711,28249,4169,23429,23390,8324,141585,63809,67668,38457,38063,39226,59972,1189,203916,62368,14403,16949,61767,85801,1739,40147,35049,76757,33124,62102,15780,103593,103009,53484,22952,67973,114645,6566,5245,50462,7601,8288,3513,194571,80276,1908,54592,5124,58571,2513,6800,273997,193904,1119,17991,117245,2508,129156,82366,26278,71465,63341,56943,39662,106116,94966,156875,9736,2204,122308,94418,27134,1280,24539,49022,45314,3764,50904,46424,30699,28087,293839,9400,33646,40165,822,147499,50263,116179,29085,11863,31314,5578,17797,5104,12454,1604,15342,219206,10232,67800,94261,25872,13565,90339,78971,75377,26649,41184,47695,11514,35369,20767,14227,41953,309396,148270,147938,33074,14453,27499,109019,39018,25738,240196,158931,52820,8612,95853,21524,137010,84901,70869,70021,116794,48404,38771,6732,1070,70990,187297,49140,5238,576,3564,253975,16027,16483,2811,37775,19034,25259,4053,2e3,70083,95774,19713,33431,92703,91314,42381,288770,48194,95985,3991,77418,13406,241328,245086,56533,35275,62725,9246,51924,70181,95331,16163,31410,79016,39312,120878,119371,275987,80124,27712,9186,220,23598,146167,85209,68238,282190,57048,31273,30555,80913,17594,75779,59160,135002,101219,189377,29225,96735,60126,62522,104e3,27620,86814,17240,147533,11001,5425,43682,410,49460,87270,69480,46315,59448,1816,76201,9431,11788,87960,29063,65539,47347,11678,33846,7008,196704,9895,6753,8633,120892,59970,572824,115934,6646,202559,892,48351,37611,251282,57823,67263,57750,26527,34485,90747,7685,88370,6144,64182,1709,41969,21458,62327,181657,49247,225330,122600,114574,107124,85361,111833,63243,71420,15655,191178,72430,18063,51425,54002,12364,53225,86557,18193,97580,41232,138398,67821,128724,8944,233212,101353,52099,42127,14006,120107,32789,32132,3498,18123,33758,56058,5779,128760,59888,98869,18445,84702,51911,13234,218379,20093,39031,8074,70195,20708,23462,24355,131384,60189,26390,10403,41060,7140,10781,49410,42261,87202,82566,41663,43105,60276,2768,5733,74176,28329,2297,145430,131632,83615,122915,105441,655,224102,5284,136426,67763,16294,188511,32538,61049,27893,3394,13951,159099,28542,17930,145360,9492,190122,32285,78855,26440,13570,58648,73908,4239,124561,2444,74172,53131,11468,10794,73566,11623,35343,64710,30481,4163,10328,38309,29901,10538,154377,76132,92405,24839,11679,3465,13449,11637,7824,2337,57754,1260,14458,41118,19878,38661,13416,159180,37074,163164,54137,28627,52134,184900,8520,40385,29546,30502,22386,66527,107458,6850,24022,47983,30603,35083,8934,304066,39500,9,28261,33026,77251,9374,44833,116312,34990,29236,63563,125639,135405,165398,159055,55690,88141,69643,236964,31983,25572,20436,36746,60896,31850,16179,11828,5888,3043,66368,9750,31167,7915,53111,36430,1333,64344,93659,20061,60596,180191,51630,6792,30244,43509,101058,22409,420,44210,109783,43223,27030,72477,72831,32679,29235,7675,47556,12258,39907,149412,84926,118247,24692,71717,105038,86009,45941,41189,89453,29856,52543,30627,226798,67303,59230,67415,34408,1367,99685,16867,128419,52147,4111,125381,117881,16173,44093,102224,31575,23234,24870,83790,127407,239098,3200,994,1255,100903,242275,117266,55116,38205,16140,29662,11307,40414,208793,123355,56470,4862,75600,30119,58218,70828,24075,26974,7802,192353,4851,5475,78720,66596,3409,28573,64396,30381,30690,59859,88256,5406,99945,103064,34463,37727,24238,86643,60088,4057,23741,5967,162904,38240,28356,93858,25510,122879,6897,3278,7057,11971,4400,35461,211413,21395,59615,39471,87233,55795,128426,3051,22470,41950,14705,3974,180108,80476,78442,204996,91987,15634,67610,139015,142373,35611,51134,10387,4353,153456,57749,181039,14183,68447,151532,21107,36452,20551,3186,46247,46383,129666,88736,140662,146243,2066,8360,7978,64818,106963,17896,47801,10723,114821,223295,74192,3293,3393,16987,74064,11277,91622,4270,29828,27951,387869,103235,1374,61988,120083,477,145892,128378,11779,211263,61354,18221,17869,46530,83061,108538,157981,90608,67199,95080,49064,195814,12302,66307,10348,231346,160732,112859,63633,146558,21271,31037,198802,47622,12862,95710,3910,77850,73961,85585,34752,61e3,4082,24595,103679,71107,8208,79568,150019,16615,24961,139857,32664,197366,4559,54735,32696,4126,162019,75698,13916,70108,159638,19834,9349,24675,175560,49643,18206,52459,27992,10809,88865,401975,133172,29e3,34558,30915,3658,25834,42430,36562,125265,18182,10155,40149,97082,208980,19575,60853,90529,66545,9600,789,46420,2317,88593,55595,98980,115302,5742,169155,1073,177901,3472,11189,63711,78643,65472,50459,127979,93,42202,67053,21720,157650,11145,141378,42033,22824,85705,79114,35584,15974,1510,54172,28562,12451,104226,19190,97151,73024,20948,5151,81741,21499,29006,84183,198074,54003,45120,170125,26240,35177,28389,64863,79974,60778,176915,232183,45342,2038,80253,41564,40703,32689,5430,100689,5366,23007,134279,14266,26712,73993,24934,64242,52113,102887,61801,46415,201049,54251,62133,122757,164883,30815,139966,2319,30842,766,13362,10287,134518,86111,81665,82440,28333,43019,18963,8804,161944,23439,102144,101145,80029,39052,248708,30350,117340,11878,128467,974,138625,63961,5237,74778,61834,67040,43814,13690,65947,33809,232476,115258,181745,28824,94013,9510,10246,93722,81976,7217,114383,3493,16014,69045,72692,12145,80981,9507,6692,1620,60820,330444,35474,33962,4797,7053,295463,46445,27026,12491,77988,49524,35675,90947,29114,166705,101385,133782,32704,6186,84595,176031,185623,45966,151302,63069,1699,107491,947,15458,74452,196212,6046,10498,12163,10239,35191,243951,9277,9090,29539,54460,22820,26514,112549,60372,51753,48756,21812,70861,260326,41,44222,10441,16961,48148,138771,216194,5914,52153,53400,212036,56519,26245,10117,45888,15294,138019,90913,26368,43842,42111,23348,6082,194845,161089,156206,51546,11647,30759,302912,262094,8635,78876,26535,35283,54183,31183,85484,147873,12989,5197,6356,72894,65347,20150,27370,73787,1493,45918,12366,190217,20724,13858,10981,67449,81213,7553,14115,72242,271517,11842,48310,88743,143726,22177,3290,243231,58452,62937,12592,1654,40066,33477,13751,9921,128442,15868,7106,75236,83773,10775,36938,10482,170465,17368,17469,161508,32752,98340,800,19824,264456,3901,87319,2867,26782,9630,113102,185815,24197,44584,86366,40224,3636,140916,31731,267731,9567,53678,72984,29389,27963,17106,50282,284911,60170,8322,12608,23374,89652,5268,39044,229766,8869,151350,31436,177342,12269,183212,120418,116270,2843,78888,69192,7865,184099,1086,129897,18383,70508,20242,18508,229924,124569,35749,50589,55626,9884,83115,40971,30671,18135,14452,38861,17844,201826,5549,26413,17189,13561,38539,10679,143331,3314,36785,171194,49685,187713,67506,4618,104039,17060,195080,50648,33159,19238,67559,134840,28599,157523,17130,38064,117398,94355,31918,13575,34538,40326,13997,3494,348283,62481,26862,3603,104426,244363,153709,112487,304612,199674,41239,35545,54869,293005,28223,26277,26899,4533,18518,15492,38587,80488,70485,160395,263,60162,11382,222152,4696,250751,51921,182609,10707,48463,46243,1227,49111,111564,46502,33342,56846,68541,63559,858,139927,16654,229375,76759,26478,33205,95828,23399,92945,2637,35630,28470,143992,50214,14174,21456,166191,65665,1711,21594,78019,97599,111701,36,147151,110246,189022,43021,30397,40757,131935,42065,73335,48039,26596,28984,15102,2361,7421,202167,69744,43766,52826,3642,83304,33873,75140,63169,192389,36551,92748,13039,123959,233220,21738,84447,77230,20228,187852,19095,25799,92136,108774,29237,53947,2299,118106,2687,8830,42331,202924,33667,2023,73763,30704,19363,19779,16737,35629,48081,24068,101013,162338,291912,13749,24745,328289,167679,70086,48299,23306,16732,17801,43322,54589,3586,63653,43624,53474,925,109177,251316,43805,13082,19511,86565,142182,92461,17117,101033,103319,64589,4022,4351,235897,5352,82705,107142,46391,156084,5860,61365,10558,13045,7717,18357,33922,12590,33065,6928,46993,783,46937,67846,8952,26295,6107,119656,18799,17458,50747,4229,179559,112727,118080,20683,41464,125468,51560,49749,44231,7359,35339,62988,136487,67015,5208,29150,24956,105186,48858,6143,18097,6972,16404,73489,58742,97196,36357,164616,5834,32267,13746,147733,15113,132091,34127,106298,39729,106426,22294,9780,15602,36213,71502,42808,66802,599,60755,5851,39120,67363,108623,126368,72770,91263,32486,30596,151717,7951,52002,43103,11768,68942,40901,39344,24037,127500,116890,48403,16926,86750,17745,48648,159545,34460,58419,5634,114317,67865,31462,23352,24010,98185,125708,69686,68337,13610,26271,70691,2980,4768,27225,102402,75453,28106,8104,6931,1176,6274,6475,112635,22498,6176,238686,26832,28893,90319,14441,15682,15087,39517,45270,109134,104440,45965,47645,81772,7876,52683,87720,12898,4505,185665,2769,113401,15664,57592,105229,137381,97059,119268,6876,43309,33886,128363,35476,144249,67013,143587,83367,25703,91436,59347,53236,2289,16519,19844,46309,58558,99834,23313,218816,231303,36388,51333,183535,109792,139277,54306,90139,18235,8275,32710,37677,82464,86025,92204,88842,117723,37570,128723,234242,76350,73795,34896,148247,58424,11105,11744,45746,63372,17118,49772,199520,81902,38004,22911,33752,3125,1995,53792,4689,26909,108150,146062,69674,41811,161444,84855,8999,28561,16731,93937,3189,21967,24890,22943,1356,145300,51569,28802,517,118679,31703,40607,48098,108854,25003,10233,73969,177495,5248,24516,215347,146192,48712,60626,69188,40735,5866,586,101541,6509,47590,52129,5969,222045,110933,25733,24223,65339,62812,2414,155418,35819,16022,78423,43138,20995,128255,240673,46745,236093,72176,57085,97841,61248,107,36068,193177,105427,55726,215229,20446,47228,100420,87091,14429,121708,23605,21157,187721,21880,2997,203976,99166,95068,25877,7724,98925,83401,4829,13182,18229,13718,239662,38653,116505,153497,30589,89029,38962,181302,43853,78872,180301,4786,248240,7401,106136,112590,77745,19731,60880,77789,125748,135487,5975,48627,34084,12419,215770,47557,254582,10364,106495,21856,67539,88981,38805,21428,48732,42316,12149,16078,52808,25327,51322,33850,51147,12253,122354,46077,56483,254553,115417,81834,150991,94662,86668,7381,12841,100650,18218,15741,22372,68294,50705,15535,84660,61887,22553,72299,31361,24824,17743,46820,64288,31582,77006,111674,116384,30760,80920,86149,77192,51979,79691,60342,122805,103800,240873,160744,233114,78962,54920,8608,3484,316104,72548,24337,5088,230040,21926,10172,36838,26,86221,83458,102176,12062,17571,41929,41170,28428,68239,41750,103930,2634,18313,53019,34825,97837,63115,24606,73157,152474,14715,91439,37033,109806,140259,30668,174760,380,135597,95673,136073,65073,134249,13829,17279,122305,4420,46444,10237,64848,203623,70728,10349,182885,65075,24519,25783,40318,34139,22222,63394,55266,102764,41422,20126,65100,90408,53640,35128,48932,11192,38935,96839,34782,39492,19396,41332,6250,5511,19492,51304,25936,104466,54099,73771,86115,5080,7669,30891,111700,13931,25276,72289,135447,14820,258641,25265,31005,281179,75286,393,95359,14623,13584,6680,101227,80173,44933,76666,54542,13244,39348,458,25379,109451,134348,81143,6959,65554,12027,51311,8716,57589,140731,28467,23316,17272,30458,25980,55229,77197,83798,28302,114784,7428,34548,26241,14712,39336,103304,18928,54080,12870,334,87722,15208,16895,142098,114262,39820,83913,57817,28682,7721,14900,108672,11250,62246,42849,415188,1724,26555,24549,25505,26443,107450,145899,61035,43528,6901,60726,65906,267741,21338,147590,42079,18924,73017,135236,15393,5206,4026,84185,1531,5988,113890,82647,303391,7386,69844,71611,189865,76523,31877,13315,19314,198575,32821,1928,67641,25913,104475,103489,3297,70391,18406,15446,113347,19295,93790,27856,1792,167471,116449,8541,4408,41757,63233,25765,86680,64501,27034,24816,34975,6079,4486,49693,36229,16917,21581,62426,27862,11612,54284,35702,194034,355,24277,48262,87411,70504,310164,118018,12516,47559,43502,57433,107139,9290,66533,80863,14634,34312,91725,28606,21342,67241,72355,43244,375789,37402,174015,105070,8342,44167,67494,1890,16365,11723,271002,1865,47918,8350,45564,27742,25110,125803,8553,49504,81925,62211,4534,15491,19011,80373,206920,667,102405,128623,245524,5553,113309,192739,65766,19567,22832,261958,29679,21293,71134,20962,105123,24721,860,21752,33448,18372,157167,94822,35770,173224,232737,75729,28937,46828,28062,25453,5207,140366,36665,30652,6169,67920,150458,92040,23186,184604,92330,20891,176492,49427,27828,38305,42495,143982,49560,25503,90043,29747,65328,47830,12932,11068,77721,9003,25213,94205,140426,46090,89945,138173,192691,33329,112232,129905,35709,27514,1841,19957,31411,127476,53572,17497,173549,55063,175135,19841,69314,5192,237921,117660,150697,4060,273045,50414,98940,65348,153665,164423,58804,156695,48994,213928,86036,28608,8355,39574,34540,16927,135680,18374,151587,10830,53805,16878,16623,4282,48030,8537,14986,46102,13062,72897,72,33050,108227,39451,45935,651,113320,40535,95176,57450,48843,5003,19019,10407,211163,3848,1068,4988,32091,30095,41692,15099,43602,107434,50744,7627,171349,16313,150832,352665,207750,33937,38256,51091,156e3,87889,90663,84175,24908,114900,50365,31494,83829,5398,169342,47521,54818,18935,8356,43094,41212,174536,10082,92550,6678,60614,23355,69721,14796,34149,128830,58187,3179,208,40325,28399,225029,401412,51150,31580,207268,6657,10993,69818,64282,289845,23308,12961,38447,6681,52944,31855,2572,47646,120728,179148,37240,45196,218274,4816,3695,21961,50084,35209,18073,51452,27004,6100,33941,1377,84831,171214,85,141510,9078,99227,32610,6417,11718,49868,65579,87902,73018,49062,46280,61742,21512,40862,107733,15941,29168,157765,144919,14487,5767,158014,140070,7241,573,71584,16921,223566,40331,179473,35081,47926,140885,41508,52104,59180,42310,32811,29048,123517,102413,80208,10104,14746,12649,153641,126022,37965,113017,4171,83,142592,2809,6362,50416,71323,116894,260776,16204,1524,5760,30351,12658,20703,54403,36083,45408,74772,4946,14485,50759,111222,10890,2195,167147,92962,130534,16283,177256,35016,15472,210156,151187,73922,117691,43250,52051,37392,24811,24358,30830,5775,818,21969,1476,127322,151783,58392,31021,106913,65215,89407,90802,28531,11690,20234,95249,44602,37256,18707,11928,5161,4410,26571,51903,49768,22008,25252,65780,209499,68769,203726,13249,137363,48845,86823,6658,5674,31881,1083,1823,108676,34518,166752,13791,14287,91576,91429,8665,11529,26401,16191,91972,30964,5254,28486,54697,79613,66520,18447,22870,45203,194466,22822,51703,12278,76716,44595,73455,33546,12235,144843,36154,51247,11116,33040,3180,225753,60864,1972,28469,12891,28879,10338,144157,56294,353058,38302,41447,87532,110616,27065,168438,6557,1213,50804,144643,24817,2390,136531,38174,247513,16190,4059,122791,131994,137430,39506,57650,16305,5188,54309,106128,20628,88071,67394,395446,250285,66176,91254,1399,114196,43915,60230,44853,27206,106353,43013,18733,345105,226453,51202,16607,57106,117175,35492,10476,89598,127439,15187,39624,13688,61570,10615,31111,59370,6238,175252,32143,224492,41388,95408,34384,148238,78307,38959,9340,160091,61443,15737,11216,41244,170,38299,102443,113097,26382,14027,33707,3957,76300,66160,19431,18900,6952,1717,108656,82206,188021,257335,27295,43999,41210,31777,46956,57457,12657,11489,15697,48060,204748,53583,82422,284790,30503,137341,8120,19615,220311,15991,10217,63424,9808,67431,70976,98221,4491,15177,28535,144789,751,13230,2394,1504,33977,132104,30316,22230,931,97193,185240,24826,22687,174322,15307,22988,1390,188745,180325,29580,59068,74903,18994,29195,79,15436,7622,38462,11566,138710,44828,45774,37768,99236,68137,84083,19282,22698,17134,74807,126662,173497,46248,16938,119735,3212,28292,213652,49013,9975,32180,45660,86250,4801,68788,95490,77482,113751,11994,44624,94452,46839,128497,100316,5798,58588,73184,202987,65417,37790,88524,1606,43156,97964,105717,34947,11203,100060,37742,130074,93653,107799,94311,196106,41347,8035,10780,16390,27883,118236,167395,1979,25006,19375,31628,18916,144723,78502,114047,103107,86492,107686,5844,20934,206963,23556,22591,16562,146333,20167,10471,117434,33085,2863,9740,36669,41849,37271,22790,18209,28979,8231,12952,54408,21731,25130,45208,55748,138120,75826,414,29593,9925,292865,25999,683,123149,7036,92159,86055,61827,103680,23176,54918,58466,57578,13305,5709,86479,16697,31064,17660,200919,10770,49793,33423,32370,52047,16488,62555,6459,8426,83493,7763,59725,82812,18628,67760,79405,68557,9612,7673,28102,56517,69620,171797,32458,29541,15870,81109,32080,207644,71495,21202,11039,91036,61230,2810,130800,32260,4613,60590,37112,75214,33979,126402,155062,30642,63875,12810,194463,82799,47664,16725,36685,43367,61099,449,172150,102867,21691,301838,36745,7130,18671,57316,34852,38034,54182,35578,65900,99486,19771,3456,2658,16914,99866,28390,28109,8262,21147,34353,20006,4228,137085,1675,203023,283196,198286,214375,163329,290603,152574,40471,83506,30068,14730,23177,131539,34759,27668,32178,71896,104799,116305,85430,119262,42860,25160,8911,23428,49437,105322,6519,16203,6349,74711,1230,38045,8540,75165,44736,25909,51026,317034,4984,32281,91312,27060,44431,17817,45363,155937,239085,35697,59784,91993,29531,126740,213757,76560,167776,285273,24262,8237,65030,41160,74437,48804,118916,13159,37842,1031,75349,1478,11655,108777,23435,277425,101734,67469,70231,124711,43532,28514,65526,54956,1e3,21882,17728,25302,40952,52214,149632,1999,2111,3259,63362,89961,220561,39777,26335,9063,10572,12416,34551,34623,38604,24723,5947,15588,69927,66252,119177,69173,46629,28714,70715,212408,20521,406913,74380,11716,50659,50862,37009,88460,130101,7210,53853,538,65120,151950,55806,163748,52837,13153,21100,16674,64536,6091,138201,44837,58547,3723,163,2177,32288,85454,34033,8497,14282,25742,10535,10741,79559,117493,243787,49337,100718,79495,40139,42956,7551,55433,15421,31509,23034,45081,547,61176,53434,328001,8470,36263,30145,4519,74173,53935,11845,73774,60211,78025,3,4102,73782,109293,315332,48412,26683,13714,6865,20128,18490,104141,325,39470,171970,115860,15707,7268,73301,74336,31370,2368,111827,107757,136231,142844,97138,96638,84053,38691,23801,1588,10573,122098,77039,240,186135,146101,11996,18143,112963,46171,155836,348769,47795,121213,116266,132515,3344,144804,31286,99187,255838,129694,35894,48779,55235,148582,71967,65282,15174,13920,47080,6147,108242,157593,125025,7136,1286,28957,127956,28402,98813,20805,7532,109417,40610,5041,32958,15142,18408,108596,33543,50517,27748,80114,233434,91447,487,37094,100048,30541,43477,10639,89862,155868,37667,8726,60684,237903,73408,99589,12190,38739,97348,3914,13594,2680,149016,13907,30171,28343,23530,115225,61104,35821,147679,14337,4297,244282,24085,326976,56428,7851,21303,131620,71446,83253,68692,111870,5224,15813,38197,49026,45057,13660,3306,76345,40671,27905,91072,996,68527,62085,91351,122634,55109,168209,2024,27560,112707,17352,8306,167115,169921,166958,5031,46020,11844,67284,19130,76185,6920,32849,5450,14610,22451,21002,17392,31872,66682,84796,13709,40210,59898,12029,8719,53564,21462,91884,21647,88379,194428,12754,37797,132826,160016,22567,54383,53186,77611,31107,8339,4694,19185,90355,23597,17222,140675,28442,23668,55977,9128,61555,28774,155229,17658,9390,24379,69357,15752,127381,239631,62460,93181,55913,45133,140155,18676,25249,33164,29581,82837,67223,22362,29975,7317,52813,1943,29613,20012,207130,49617,49651,5636,15334,36313,29226,28084,95247,72072,19e3,224932,15811,114,32127,38097,37508,88507,37225,27359,91626,12193,69279,20608,11055,88156,92808,2152,57259,55275,72789,24475,104414,1708,9882,3818,48661,66897,1631,34806,227930,85815,87753,18321,250664,72733,25107,206797,50891,8082,196411,92596,96764,152823,65514,22819,387277,62176,51225,40329,15563,189,3659,73670,64357,51793,275136,33482,86653,74615,67058,11318,125720,15388,22388,8267,1730,102663,170910,40784,7144,85373,13040,7088,94309,583,44224,140424,77439,18496,164026,36578,4722,9151,5824,63365,26510,35199,40500,79277,32495,44614,35233,9566,203293,152144,7097,2330,183480,98629,13423,330887,44130,68600,30939,97829,31012,345465,56747,94879,4939,160027,149761,99423,46099,32251,15332,8761,96094,128555,5763,235318,222223,55729,30241,55420,201746,3987,81382,8259,49325,23287,7719,24633,251100,92311,18591,110533,64759,170260,393860,7175,21144,132887,3593,75346,101277,91109,16387,259187,11627,57459,173829,44694,55780,49797,89192,120443,62622,3904,14814,23887,1027,112258,64955,99800,11132,66353,36202,48624,18158,88481,96882,43059,11040,2455,7077,21651,181159,99126,100434,61388,68186,19161,110468,120052,8819,55324,41494,7014,37689,3618,87729,92615,207943,9823,128657,12587,15857,6379,67628,51216,71775,157617,63244,1503,3864,218754,110864,5769,21492,7243,1192,87921,85529,31512,18537,42698,35350,73510,84474,34301,8991,21013,35034,566,38832,19838,35586,37216,39413,55006,12178,59742,856,84563,6900,25632,17437,49786,30723,13847,70845,4044,7843,23944,235976,55530,48942,6518,20939,73769,192653,52936,95207,23895,132542,142982,22632,87452,48042,54018,178468,10728,26230,23559,363,81269,142012,5718,346258,31456,84333,246476,51018,66692,101804,120570,39962,30373,70593,2864,60541,19425,54209,104092,7201,31545,48018,25865,15442,46257,40443,8328,6451,111782,47527,97754,33046,470,245116,31095,39,91934,87208,73470,36708,36521,12801,70624,36272,8892,79768,12427,55454,103756,5908,52390,62962,22720,141138,94634,41689,128402,126390,6628,106394,35527,134394,82727,254651,194502,148064,89549,3202,28359,957,21954,27906,49840,142747,8307,24206,48978,1186,71728,133038,71474,91306,6333,110959,74600,70387,18983,62609,56057,22970,1147,135850,1321,28834,3578,59715,102227,32827,81415,99952,55636,257598,390,22702,35701,85872,402916,39216,189795,14929,19467,10112,144422,61514,5279,63421,134686,41436,8424,51925,10598,132295,124416,4604,194739,210929,57866,31829,51626,50007,9976,91878,61906,56168,81906,60918,61859,40017,23059,16887,40927,62064,12785,32893,32913,21782,93965,20169,44387,79084,38463,11457,93950,27127,157050,2697,337088,5116,54128,48255,33279,8821,27352,25515,124022,65710,28906,38557,33390,1722,104435,72215,38551,12094,30978,25113,6671,37355,175109,42862,98024,65406,221276,59624,118012,64637,78760,86697,21426,1639,40350,12584,67193,84144,31396,7863,143011,69629,63112,9454,28666,65798,46372,134721,6314,51402,30837,151922,2847,38676,38008,92823,136245,17540,5504,109295,205242,37606,5211,214892,1586,20670,208711,137743,19328,40652,16995,20023,14657,154919,34422,12996,13918,38221,47690,16398,2959,37680,89122,6721,198469,91876,172043,83898,101992,26084,94570,3635,76958,22853,76497,38266,176590,168403,44464,142840,79180,184594,1984,41806,83147,11985,6546,366068,59732,24533,271505,8736,39084,222992,93429,28962,58985,86665,8432,30028,14548,32439,54424,165029,55175,27458,69046,121277,46168,33732,20661,24581,135574,123110,37556,79260,72611,16957,12939,46162,58238,44907,72936,253758,41324,32518,96480,11949,124438,65280,43256,34107,53533,43531,37037,28366,45970,32741,173438,6121,194202,62969,26355,30314,58370,28455,1848,50519,82830,90393,21761,295490,10936,256940,133568,44050,20269,4089,27457,21610,219460,36743,14821,101388,52005,13124,30979,140816,167362,26054,18458,60789,34917,40447,26606,33422,9066,3452,83614,5761,20263,137238,25038,91310,101,52322,74548,42572,38084,214054,186568,31802,17665,30620,141936,37730,14420,4265,187218,49640,188208,51441,55388,96452,66659,40869,42039,60967,221027,19234,178581,29105,96050,9165,196118,157335,3738,40354,117436,2965,34136,59659,15570,50843,230035,31444,71260,43886,18316,5387,38500,168508,17406,32174,8828,103373,143806,90367,3560,18719,122310,16508,26719,2541,105429,6645,37998,73190,10591,235916,49737,87112,233941,53188,32193,79154,4544,52905,126477,7580,63501,57314,3216,31337,6541,103083,60846,49,9756,15481,1355,43840,14319,13743,27486,10222,73114,230718,418644,16706,6674,279748,23058,45273,295831,86306,2743,5535,88773,21829,35253,120938,31153,3169,16839,42847,8751,80974,33942,36867,35514,16485,26474,77775,56877,5391,48346,3882,108713,31403,27804,55248,26235,43821,136104,40118,175507,28034,203908,18732,1788,34030,106427,36958,54359,7251,44936,15356,69139,455,157915,22173,140291,50348,43275,82066,49621,54952,15216,36226,96695,66855,6936,1987,8227,196087,4631,68827,99004,47541,110265,17953,147605,110242,58520,31312,38724,329975,642,3155,34497,75937,6207,73843,6120,17249,51429,117746,3218,910,68961,319671,14938,29555,34700,1649,66673,72268,9655,76800,153087,6941,210168,27130,35398,1780,73242,3135,56689,19556,165307,8765,35967,121458,13333,70453,17350,117253,22265,13340,44265,39869,441,3742,135025,23581,33309,16543,17731,13291,157637,283005,21408,101360,63887,52312,83873,5338,233779,23759,186949,34531,177320,38069,156465,91004,19353,59852,68160,14891,1338,1072,29823,1950,28901,81407,313445,73038,84807,162348,240257,37162,138934,16111,58013,41253,102951,16457,96056,19541,56402,67217,41638,94381,89674,29481,37456,80815,151579,13937,13683,132537,19699,134545,67020,29816,222341,141235,427578,48868,129557,233342,23077,87871,16213,18728,16184,9469,37913,19680,2798,171356,178328,13216,50049,72690,71904,124644,55455,7504,29052,41036,266546,19899,30391,188755,8659,59469,16,104298,112943,53865,76203,138226,68857,139953,14125,107625,119795,173133,4398,50273,48808,54390,16466,122086,31835,67035,50971,48859,7508,46427,66477,73021,84615,39985,83076,46779,201569,53336,36443,60865,168164,143810,51393,25548,169307,32896,24485,38424,21837,29087,275813,51674,6714,64883,46169,187369,55186,76192,12852,12018,62134,31067,118303,16542,12125,10579,4928,26291,43854,7091,10946,253716,109062,39283,17261,113012,258512,47764,125126,32646,55892,80279,201623,149872,3192,385,1208,48750,5376,58738,22335,5427,82416,47811,32435,143086,38930,94128,59975,156037,37977,38224,62485,7698,50405,71027,16462,21559,136153,34131,107506,162069,63703,3101,215029,40407,4178,3774,9187,80019,17880,97926,67579,2600,18405,8351,47924,86638,70820,92206,86453,29610,42241,119200,3198,15466,67813,57863,35454,4779,99518,4649,104641,144269,33730,38073,65864,6838,109456,193298,154007,5623,45741,30846,182578,25573,157224,1543,58575,138703,146140,44971,49356,18275,59064,20300,13122,11848,24453,11973,9797,86843,2919,25530,49210,1130,161220,76788,75373,85604,34926,36014,17777,17255,51533,11676,92226,51845,119859,21525,5936,18507,28050,1140,31418,14857,34207,47859,10750,36382,32079,106909,59426,87757,38393,110042,15965,97104,33757,35344,97993,53979,33651,45407,41884,82515,173089,7177,58371,35365,47543,51927,35587,10670,23544,29306,84233,39976,76076,62097,9007,8668,28119,78281,120790,19835,143020,54968,18670,64959,20649,34469,42570,33001,136570,87796,120044,1106,58700,63951,127623,12805,83057,40212,31773,49850,7361,54336,347524,101314,23751,19569,48791,29174,49369,20467,7465,75842,38281,623,112457,60210,28849,51003,94720,6426,90047,85560,43761,3579,85105,34607,90410,118528,7224,42907,111163,18168,6960,161135,191298,5247,100584,127552,171568,20121,91173,12636,54615,20199,63730,98105,2396,40387,14438,125012,4765,33235,12865,45299,37728,82098,77872,114037,59253,19675,24838,398016,102561,11446,17069,57508,178277,65836,99941,26114,2585,271882,136866,50126,11027,155648,118367,14585,8910,123015,335383,40434,41016,53021,14439,87098,176860,201543,121888,2358,9286,5739,22666,54270,37884,169381,33984,93859,16124,89364,72207,51639,76366,99029,65812,2198,12147,174891,194289,6986,30252,88822,21284,11445,288337,160821,33034,100869,43852,25761,52882,1144,103809,1924,84458,86079,43411,13542,139276,18141,34978,41298,7276,26481,173800,33210,17951,142652,33616,33677,2210,19941,98568,2486,192414,80136,12058,235883,50963,249638,29572,27221,47034,6124,72107,63346,97620,158513,299699,40388,23235,37176,224244,198386,121323,67992,23827,63170,17838,106622,158590,26807,5345,23489,91891,55474,74834,37981,13058,5977,72552,34706,26828,145172,19904,21367,34043,960,77092,91381,4733,47446,7680,41697,5170,16960,14741,46101,13656,473,51842,37433,11103,11551,121951,13191,97536,165932,50397,51628,129028,9069,44885,6590,59195,47045,32940,225472,90345,21833,13303,29407,96615,141951,5198,6028,18395,7181,3861,14966,156358,167182,36529,55253,25942,173153,30959,27261,50691,150176,162201,38467,48462,80602,42163,118482,168,108756,26011,17166,54149,456538,22512,91374,13816,90358,131615,18132,226707,1824,28139,26860,42253,93877,77351,65575,8980,80574,22020,27948,40422,91324,76376,13528,39281,91685,82215,122541,144066,1983,193851,17283,26320,2739,194978,4790,26845,42627,61300,65815,174612,55133,4200,191130,79771,158321,52280,166796,221620,62461,11278,4067,88152,83409,31717,121367,13522,47325,37945,10406,174348,249321,154101,64912,29938,51775,17220,15776,166138,78890,84425,54121,42861,16368,24572,291647,10197,32073,22651,11677,97509,26952,35787,18424,41910,71614,94977,72318,41594,70024,275419,37702,60199,7335,39107,61315,18271,18394,33768,87884,104277,123724,7277,56288,71981,189803,49320,3352,6798,14240,8954,69220,94433,57372,28620,68863,193727,85575,42309,41667,67689,42081,22543,44824,12719,28540,114236,101553,27638,27296,4300,5353,4663,19379,94098,3758,95888,95144,80344,87320,28447,259518,12718,71391,152731,37063,24132,31911,104896,15672,103782,1521,4945,72541,23717,122632,15619,87175,206120,29428,189780,61416,28350,44457,972,1175,47233,198738,95789,41907,21953,97034,59341,22864,53713,16873,32971,20693,20954,31336,21477,16169,38370,16412,9019,3841,24599,21938,17085,6484,81198,76413,5849,72514,12320,65247,276175,37234,59796,52642,16312,57349,198507,94148,46134,18958,125552,1747,18725,151873,14901,5490,68287,29470,3689,64794,40814,26018,25692,54450,2703,88278,124886,173087,174e3,24159,179477,24276,46004,201876,209202,445,52876,31948,30206,157610,39180,18439,44124,50469,5774,96278,222758,200216,50290,45486,20435,46986,46276,140133,142326,15569,13363,47522,92583,2182,7135,16853,22998,30272,4952,63263,35623,39096,53789,44864,20053,110392,124213,4630,16087,28221,127787,25839,77481,44693,13464,113146,6983,27069,55717,50102,4760,7107,26186,66507,59145,36032,104182,71328,29425,64317,50781,47465,94298,69706,74899,22754,120756,25108,93077,56834,73286,39928,16218,41699,176763,7555,70819,50083,26895,23315,26014,16773,123079,41712,5719,31516,90427,158540,85051,183128,40864,27505,55392,9058,45224,96857,30901,136622,96557,56304,120061,11501,151448,5773,89743,7769,86069,2935,18471,41628,10114,33660,110170,49479,26745,92846,33221,26731,18795,87076,8550,2100,29972,120289,3077,72490,33784,2630,208722,50861,63483,79029,6419,39467,14302,45286,64207,9686,67513,44170,1050,77246,59266,17055,53801,7150,11111,42432,4278,94579,362117,36175,42902,41933,39002,98489,22913,74161,84773,57036,17556,162288,74485,178760,93867,73635,128860,50362,261,67455,80001,46080,35662,4368,25247,19230,74393,22588,1822,27682,235324,13798,85998,13194,235067,23514,71669,147632,23191,134748,214683,105101,1518,25489,247114,7380,54842,26922,3971,26361,20844,68642,170517,77339,123255,8963,77818,150998,48466,36806,2732,23261,11741,236162,18243,126216,28690,50546,16385,92760,197383,246558,201295,88255,67588,71687,176076,172653,169058,33906,63747,24835,157621,43338,30050,46152,132741,2770,51371,94835,6614,15112,11749,56936,1250,19027,399017,58036,100215,23388,55815,308768,124152,94803,9521,64186,8971,28,30427,62163,7616,103838,35079,29203,131235,7743,17389,10882,37420,61460,228512,85363,41581,131077,62822,119647,10130,54445,26925,19968,29016,24446,74028,24176,61448,67185,9254,8563,119129,9771,99184,37716,39514,10532,221512,258753,218630,55980,23394,32141,61924,66749,32411,3741,36475,26678,77010,44946,91203,128749,116953,20476,49625,53116,13735,102335,29376,51946,83407,67892,59212,34685,21083,1546,112982,32972,74397,1078,190545,16082,86140,58591,89611,101531,10061,105104,76319,20035,17551,52611,169061,190842,100780,23907,90413,115619,9675,34710,193435,49443,129734,11183,258877,16318,136182,126808,44635,27304,192375,2599,125648,47051,12091,23814,721,58800,40137,66726,97930,60877,74487,7942,54326,9841,41428,13762,8211,85383,6950,99177,79806,201786,296464,124087,13144,29741,41721,47634,55088,254286,106408,17041,99064,12942,64086,45233,14005,2612,55827,255,7984,13980,38574,12776,46654,73499,249951,2101,26676,25996,132326,116415,119062,50449,31033,23038,11589,179252,20007,14860,129270,21143,17796,144715,60106,70758,69842,34674,282133,44014,16774,57268,38528,24053,46373,201667,28327,471023,51889,102667,21193,114909,84132,69317,96723,67969,16134,68145,15058,28765,32035,2524,101089,98664,25045,76571,14957,86040,118506,262428,154764,81573,39681,283900,73287,127825,544,80448,52347,38512,175971,15180,45467,33086,46552,48894,81107,43213,36672,54025,76703,8053,7608,13299,56619,20752,238099,54164,105133,1444,32942,953,37564,8e3,66316,119463,106817,404,13667,149108,128597,31267,10269,49836,106150,1484,52330,76965,160486,171648,38456,31263,22424,37738,66245,67467,143369,60471,75610,20895,115528,86070,60854,40796,49347,18989,15030,11371,37578,15779,79867,10187,86462,46402,155626,93200,40229,7090,57547,108053,99598,11088,47505,41218,206017,2173,20988,30219,22919,80563,57566,42369,93141,41675,2407,182519,120495,27154,16702,29456,14349,7958,16688,117177,140375,42467,261919,74916,153569,10836,34742,49526,7621,105997,12212,2270,392377,7755,17959,25086,232152,138791,33847,13860,35316,5811,1344,71259,50452,207539,92635,50359,5821,33674,30255,2086,2587,96264,17543,42,6029,9580,43007,139248,82831,12917,29607,25786,51467,42137,85161,100698,31561,88989,121990,278500,3602,109344,37982,15279,116442,28936,30880,87894,58079,128661,126731,67392,28051,146885,4861,16216,97344,42827,147561,153948,22684,21335,47685,1853,43349,15185,59642,10229,25520,187921,108972,5579,98037,24945,6697,19193,63734,137934,75056,89740,19767,224268,56138,63643,151661,39313,70618,84031,89723,84074,13703,85626,35460,8867,64845,3439,57906,99776,63968,49270,81130,34356,16210,23547,36446,34090,140028,72439,2221,22163,57058,363492,113754,18913,95451,48663,54464,54037,176097,68425,3023,34906,29482,117389,341780,80431,58330,16753,92616,60907,94846,147486,4498,48646,7773,46801,7778,18946,464978,47558,33223,177444,7328,15626,63337,94700,11743,9351,255024,39098,16447,42647,96230,39769,58840,10068,63439,35800,65843,58823,413844,9156,51258,7434,61791,85018,6872,3692,28096,7121,33024,6009,75532,31997,192535,9661,3304,9547,14753,31987,25314,55689,15896,20430,39472,31340,99744,25398,115569,54883,28719,205423,23071,57855,64638,149867,25671,82403,37616,20668,39989,77996,74948,140555,175248,64810,36515,46595,4958,248773,24045,28728,136673,168704,20804,114833,100325,27135,21205,96151,153134,45992,7093,13992,76047,1980,19432,145001,75159,87462,17710,1013,45556,34297,144882,20648,26061,11319,129567,108555,18872,464580,33386,22717,65948,167189,5603,135042,79542,8801,202632,18114,91882,5973,5239,67315,4431,60916,47819,71693,32597,32606,18183,45072,80329,76385,24749,51305,40314,156514,14693,130345,13168,66214,18029,12858,34801,27628,14544,10823,40522,40185,33739,148694,23548,9923,61012,28859,17933,19442,34364,99849,164107,141167,30629,21054,6744,36491,8096,42474,41706,155060,30650,10600,163442,1143,96655,61390,52359,7559,51568,64256,203854,4467,22453,14504,436398,7878,6980,8293,63610,293747,16167,35763,19627,147603,15419,18032,110744,51346,33681,54571,40472,48615,39073,21604,13754,173027,92560,11083,47299,63062,11813,52007,29883,9734,139722,15953,1550,20651,13616,49306,16113,90089,92326,7584,30712,72424,164858,6831,152871,55746,197721,34167,196442,6022,112107,55215,7538,123381,4920,43539,77165,8939,50392,34192,20225,79762,22505,58667,40770,29788,97180,82835,4568,8579,13273,363569,35898,49983,436,36598,3237,131691,62418,35591,8101,4073,379438,65218,76072,33887,2968,27573,212619,288680,68278,72851,150504,217896,6913,121339,22017,35340,51072,43616,75043,31437,10833,81487,4364,22968,41454,106687,85446,19863,109625,149241,524,141850,214404,54376,657,237023,9401,108137,53800,32474,49712,53334,126876,27337,45552,177696,8269,15036,12097,42240,2328,125374,119295,99715,2500,19624,39441,27220,102691,60957,94543,39101,18566,67362,13975,78230,25017,34017,239007,90027,39351,41681,35354,43822,1043,916,58587,141983,94818,38799,75459,41114,67432,16195,36606,59568,22272,126769,31424,68659,12287,134302,257977,5756,207285,95637,47248,117689,19583,77451,22373,12200,54993,117118,34244,29386,34562,53819,71267,64172,77665,49368,7716,59301,25749,45426,194789,17297,2650,1766,32501,45198,20403,20984,6600,14171,94604,19037,5402,29896,9938,59935,109708,88081,145182,44844,39167,352626,164173,35374,45982,6122,154,73419,220487,53834,53601,17992,8609,229321,5610,68098,66815,71012,95069,140968,27396,8957,134489,24656,86659,56598,134852,17316,123838,255436,6613,41610,138033,81452,32023,32396,123687,63398,8693,29712,30407,19296,121188,3551,36099,20032,111948,56624,16547,27453,35916,15378,52039,56849,13489,22214,73177,53097,277349,2157,14029,187886,10260,141743,246460,91880,50869,3788,49486,133566,54950,33120,129337,53768,18333,9525,26902,312251,10297,9020,70759,16647,112432,59260,84609,9818,82766,73569,468,46001,75780,55028,52106,11498,43645,108069,17150,17753,29417,16705,31799,9606,289,122254,115975,8620,6133,255357,56908,14456,133464,43554,79224,11247,29630,160,12756,25464,65960,350428,62521,321796,100359,67358,35169,46172,113128,48988,88868,31094,33266,6847,60887,98188,49659,69117,92977,220228,13947,80181,35103,62170,97351,13475,2440,199768,19498,36597,46971,25234,67806,62881,84717,73648,181966,10488,94149,21550,26655,63436,48375,14405,165650,9621,24439,28043,42735,4490,29963,56674,45373,1934,262446,50855,67098,26898,5261,52696,40644,33900,9440,180286,87162,22940,19704,26936,69769,10254,101759,27406,12243,48e3,73926,113215,54935,5726,192787,4312,106216,9366,11550,52949,23457,212271,277152,133895,108374,6191,96477,29980,218916,58024,54696,40853,91124,65894,91170,65908,252552,6793,29212,15389,44516,122515,52617,35058,9017,103536,39510,49136,19242,130652,662077,74699,47024,31422,8517,73351,24399,13867,128360,4810,4434,61779,111983,61036,17798,110240,59722,102960,39688,10001,23803,23039,176498,56659,44814,134295,17188,77577,74466,226175,102472,154333,63900,111747,18062,41171,79669,32773,408933,42562,28931,30907,107388,43487,2946,240310,23938,24354,319,184983,7927,6488,1422,10790,68809,68209,64775,4361,202,17123,59634,51200,44391,18188,17843,2619,74278,3230,9540,47187,21702,36274,56894,43907,16310,34790,16866,6150,5561,13587,107545,108873,126867,86986,28640,33427,19017,5762,80637,17430,46903,2047,131055,25958,13558,5444,47152,13900,44563,122857,45348,70863,39593,54332,38068,33637,318,40310,143467,18502,24520,11377,62013,28942,27246,28269,83545,17999,59015,90707,30065,15161,34720,1263,37008,2012,6060,98575,92933,5721,299,199555,24578,29223,2985,743,115825,109523,136657,47454,26378,53586,3733,174945,93340,244456,5693,37386,28782,89767,27545,23573,18798,136425,34320,84778,20041,48453,38215,7477,71958,40621,8773,5874,187927,105965,51100,43533,18083,8443,10180,43597,2003,183999,69689,12216,129696,146188,62389,34044,68410,12765,43273,26949,266807,3345,34477,79197,5688,47539,213110,21634,22257,50092,32222,42346,39530,63668,98,134978,74022,5152,59088,174145,37220,9934,9545,118937,5724,87240,19875,15784,40143,23263,87513,181654,285152,37881,263241,4966,43934,10433,186657,6470,74416,225854,25908,142677,246262,32280,6192,75890,45546,143264,135305,29742,47013,77787,11732,126658,8763,37950,21806,57557,113464,89465,108995,164574,23894,22996,23169,15369,23117,17642,130607,40503,36239,280990,44666,9981,40427,147487,26869,168452,32886,32991,46798,240839,15111,70502,65697,88548,44145,28701,48767,31139,206777,35659,181164,166262,14554,171445,31786,66523,76607,17956,6507,31279,90476,116611,167918,6560,1243,115324,80128,41867,55897,187323,37069,32596,189444,145931,13390,105530,65709,26805,6999,55714,41300,22915,68951,22138,21120,22264,10058,19945,33635,56123,99085,10032,5818,6016,46649,57476,35264,94413,112522,262288,93686,83038,14341,23204,28807,66084,77987,6101,126673,7133,38126,5923,122091,170240,97772,46874,215746,43948,41622,3272,55596,8332,146411,251315,13533,8561,81521,115449,48616,175175,2063,186556,3036,134537,75772,29728,82360,22973,186559,86348,89100,38388,82297,45610,2613,87082,9986,177812,57884,23591,47485,42543,33582,44713,74439,257444,252451,31825,35631,38540,33066,5147,13973,4343,51830,70378,22827,26448,95560,36896,241741,48067,203953,298860,61620,20450,3220,67272,6586,107662,100160,108684,6929,57226,4762,7457,1320,40404,77204,99309,62750,208653,59977,44e3,74315,34332,5819,172217,64904,114077,18147,84012,1791,98456,90930,21446,116669,103938,7422,85140,59713,5768,326211,16239,75411,13229,29398,10758,236107,1539,112472,95979,152154,151294,306,21196,38146,10700,6891,84282,109646,56492,40539,6589,119491,51354,30685,140209,136906,29622,73617,49553,70525,51671,166869,139616,74395,37439,49595,45678,11959,33211,86560,52434,9282,62690,112155,130810,5243,108261,99970,265613,72551,80049,6391,33365,90721,66737,69872,87011,1860,9032,112544,60905,37371,89015,140351,19076,850,373531,2802,36725,218795,72062,28990,16550,24614,7815,6187,26336,33373,32162,42791,73555,32062,23386,10244,56392,49442,27076,136262,12412,14883,1134,33675,97153,199281,15608,100152,74072,47942,254301,36451,16026,10687,65067,56708,254030,30290,50490,13864,57941,259331,35588,23485,43486,24869,21620,92971,22072,88645,1048,182050,13343,32452,14825,19509,3325,216938,45740,99716,189082,53740,78245,25609,24311,176777,47340,308354,40669,66085,14102,125339,9225,128709,97207,1271,200933,78439,113451,88975,18324,46521,11819,18570,141756,72512,170020,52754,63550,118515,103073,93330,32736,50499,14722,31600,68452,398867,29316,172786,18417,104924,2606,5670,84818,16288,67106,59580,82929,607401,291,85829,359,15897,35830,50696,65630,52672,22115,356968,29895,40837,231192,34024,38957,26722,406,23335,124952,72068,68804,13268,147101,164740,276569,162596,66943,11569,26654,66358,4777,23229,102127,5848,978,2921,59666,5371,28212,90108,42938,39320,2499,4271,108792,33510,125072,71653,65239,38250,66357,38577,13964,86251,35708,50755,36010,29448,12209,3844,38222,206337,100876,67827,137088,14167,252225,84163,195270,1306,5703,54198,779,46802,22028,51124,86759,70560,113164,35685,162145,45471,34561,422,2611,6464,47486,19223,38246,9191,18331,89942,243642,212364,15893,17518,22617,6409,30046,126182,59716,36560,104428,18846,26592,19458,50793,147333,30826,1388,27647,10922,14495,33545,19269,135828,39727,41601,46931,233379,49169,131130,182112,16276,82381,118209,142445,128310,19672,28740,82907,33436,3118,102206,28723,24819,41937,38854,5157,3881,111491,1142,9776,421673,152241,29309,14961,87854,6054,15424,3796,82656,54996,2108,55367,239450,154525,9643,118103,106041,64601,68549,48707,30266,25772,18740,9462,229669,91798,112152,191327,14493,72828,8175,66636,236474,25817,87351,129027,76653,20422,22983,71240,27846,44661,12399,46158,77704,53101,35032,11072,17300,109294,33638,24408,1895,11241,760,17584,82479,125877,63150,141075,34259,23274,81698,15732,43577,48340,91584,14688,16379,24481,150280,96420,262050,48635,43727,61819,56268,72003,88178,17281,79912,13218,122519,125295,166396,11811,2171,118930,67746,17636,178278,174656,95661,173039,83845,79689,17473,98555,127696,203415,54730,22925,232239,9309,12136,175026,20740,180188,10747,39816,314017,266131,10040,175732,112550,220651,31974,37393,888,23008,86799,4303,64905,148467,75337,251,3284,370102,50264,9835,5438,23655,4481,29851,329,12855,7162,64931,78141,12804,42372,296771,83547,18624,34874,86271,3360,48665,77735,88767,11463,63527,28889,22258,29140,194315,113924,25499,6406,31334,1845,4802,49184,43455,35469,127594,92970,61038,115005,38840,87761,106838,8811,20572,55637,11162,96721,132425,108925,2948,125457,36356,3502,75270,27622,127192,2561,123095,49394,61155,16897,110064,9699,89448,53356,19628,220310,21622,83036,9885,112214,6087,26713,17901,161912,91492,3440,68594,9266,92238,8087,6866,150194,72175,80701,13459,31836,43243,239700,95846,44749,50647,21945,230538,120612,132371,244604,5193,105637,34661,41341,68775,85393,1874,8771,33718,49672,77403,595452,99507,6490,58895,128742,7704,39239,73217,43816,62824,37804,199976,22361,80005,87514,94832,14089,4574,139975,59142,75523,100268,43906,53442,15152,2547,186002,17011,19513,204282,3343,60568,128318,119250,4298,51871,41336,71759,21921,45074,98169,145889,99427,11350,1237,5520,28799,7803,53702,21026,136352,38293,128690,12158,90132,44600,10184,26957,39459,126025,78904,82999,59373,39301,150198,120529,153042,20177,50089,14764,271571,30530,123161,38975,101562,22941,5648,124654,109243,69817,71675,49162,106884,21241,107795,30258,16572,188262,141456,7688,60718,8271,11044,32440,104608,103419,236109,93156,43293,128929,42107,67180,25201,115254,185488,130954,72813,167547,20537,39969,38432,22582,184022,1139,27199,5655,17767,97412,122606,209377,27070,35871,326617,188954,42680,73512,80911,22629,3011,95021,315242,157737,383,41821,41808,19335,27950,15674,25677,110950,35375,76835,59108,57370,35262,16569,160415,37706,78086,32041,49691,137143,9782,172080,50148,77917,6323,10110,69172,17711,21795,59511,76184,135114,31046,132319,59105,157578,20549,80778,57649,158421,65143,4575,72235,21899,10797,92745,34035,106079,80159,4508,78304,25350,75457,46458,32937,25623,47,8531,104751,84953,8138,36508,187199,66310,115274,13253,32461,38536,1916,42007,187160,35055,26325,84394,35963,94216,45590,97782];class $E{log;peerRouting;routingTable;refreshInterval;refreshQueryTimeout;commonPrefixLengthRefreshedAt;refreshTimeoutId;constructor(e,t){const{peerRouting:n,routingTable:r,refreshInterval:s,refreshQueryTimeout:i,logPrefix:o}=t;this.log=e.logger.forComponent(`${o}:routing-table:refresh`),this.peerRouting=n,this.routingTable=r,this.refreshInterval=s??3e5,this.refreshQueryTimeout=i??3e4,this.commonPrefixLengthRefreshedAt=[],this.refreshTable=this.refreshTable.bind(this)}async afterStart(){this.log(`refreshing routing table every ${this.refreshInterval}ms`),this.refreshTable(!0)}async stop(){null!=this.refreshTimeoutId&&clearTimeout(this.refreshTimeoutId)}refreshTable(e=!1){this.log("refreshing routing table");const t=this._maxCommonPrefix(),n=this._getTrackedCommonPrefixLengthsForRefresh(t);this.log(`max common prefix length ${t}`),this.log(`tracked CPLs [ ${n.map((e=>e.toISOString())).join(", ")} ]`),Promise.all(n.map((async(r,s)=>{try{if(await this._refreshCommonPrefixLength(s,r,e),0===this._numPeersForCpl(t)){const t=Math.min(2*(s+1),n.length-1);for(let n=s+1;n<t+1;n++)try{await this._refreshCommonPrefixLength(n,r,e)}catch(e){this.log.error(e)}}}catch(e){this.log.error(e)}}))).catch((e=>{this.log.error(e)})).then((()=>{this.refreshTimeoutId=setTimeout(this.refreshTable,this.refreshInterval),null!=this.refreshTimeoutId.unref&&this.refreshTimeoutId.unref()})).catch((e=>{this.log.error(e)}))}async _refreshCommonPrefixLength(e,t,n){if(!n&&t.getTime()>Date.now()-this.refreshInterval)return void this.log("not running refresh for cpl %s as time since last refresh not above interval",e);const r=await this._generateRandomPeerId(e);this.log("starting refreshing cpl %s with key %p (routing table size was %s)",e,r,this.routingTable.size);const s=AbortSignal.timeout(this.refreshQueryTimeout),i=await ME(this.peerRouting.getClosestPeers(r.toBytes(),{signal:s}));this.log(`found ${i} peers that were close to imaginary peer %p`,r),this.log("finished refreshing cpl %s with key %p (routing table size is now %s)",e,r,this.routingTable.size)}_getTrackedCommonPrefixLengthsForRefresh(e){e>15&&(e=15);const t=[];for(let n=0;n<=e;n++)t[n]=this.commonPrefixLengthRefreshedAt[n]??new Date;return t}async _generateRandomPeerId(e){if(null==this.routingTable.kb)throw new Error("Routing table not started");const t=Co(2),n=(t[1]<<8)+t[0];return vs(await this._makePeerId(this.routingTable.kb.localPeer.kadId,n,e))}async _makePeerId(e,t,n){if(n>15)throw new Error("Cannot generate peer ID for common prefix length greater than 15");const r=new DataView(e.buffer,e.byteOffset,e.byteLength).getUint16(0,!1),s=65535<<16-(n+1),i=KE[(r^32768>>n)&s|t&~s],o=new ArrayBuffer(34),a=new DataView(o,0,o.byteLength);return a.setUint8(0,pt.code),a.setUint8(1,32),a.setUint32(2,i,!1),new Uint8Array(a.buffer,a.byteOffset,a.byteLength)}_maxCommonPrefix(){let e=0;for(const t of this._prefixLengths())t>e&&(e=t);return e}_numPeersForCpl(e){let t=0;for(const n of this._prefixLengths())n===e&&t++;return t}*_prefixLengths(){if(null!=this.routingTable.kb)for(const{kadId:e}of this.routingTable.kb.toIterable()){const t=pm(this.routingTable.kb.localPeer.kadId,e);let n=0;for(const e of t){if(0!==e)break;n++}yield n}}}class qE{providers;log;constructor(e,t){this.log=e.logger.forComponent(`${t.logPrefix}:rpc:handlers:add-provider`),this.providers=t.providers}async handle(e,t){if(this.log("start"),null==t.key||0===t.key.length)throw new dn("Missing key","ERR_MISSING_KEY");let n;try{n=yt.decode(t.key)}catch(e){throw new dn("Invalid CID","ERR_INVALID_CID")}null!=t.providers&&0!==t.providers.length||this.log.error("no providers found in message"),await Promise.all(t.providers.map((async t=>{e.equals(t.id)?t.multiaddrs.length<1?this.log("no valid addresses for provider %p. Ignore",e):(this.log("received provider %p for %s (addrs %s)",e,n,t.multiaddrs.map((e=>or(e).toString()))),await this.providers.addProvider(n,vs(t.id))):this.log("invalid provider peer %p from %p",t.id,e)})))}}class HE{peerRouting;peerInfoMapper;peerId;addressManager;log;constructor(e,t){const{peerRouting:n,logPrefix:r}=t;this.log=e.logger.forComponent(`${r}:rpc:handlers:find-node`),this.peerId=e.peerId,this.addressManager=e.addressManager,this.peerRouting=n,this.peerInfoMapper=t.peerInfoMapper}async handle(e,t){if(this.log("incoming request from %p for peers closer to %b",e,t.key),null==t.key)throw new dn("Invalid FIND_NODE message received - key was missing","ERR_INVALID_MESSAGE");const n=await this.peerRouting.getCloserPeersOffline(t.key,e);Sn(this.peerId.toBytes(),t.key)&&n.push({id:this.peerId,multiaddrs:this.addressManager.getAddresses().map((e=>e.decapsulateCode(Bn("p2p").code)))});const r={type:Qv.FIND_NODE,clusterLevel:t.clusterLevel,closer:n.map(this.peerInfoMapper).filter((({multiaddrs:e})=>e.length)).map((e=>({id:e.id.toBytes(),multiaddrs:e.multiaddrs.map((e=>e.bytes))}))),providers:[]};return 0===r.closer.length&&this.log("could not find any peers closer to %b than %p",t.key,e),r}}class zE{peerRouting;providers;peerStore;peerInfoMapper;log;constructor(e,t){const{peerRouting:n,providers:r,logPrefix:s}=t;this.log=e.logger.forComponent(`${s}:rpc:handlers:get-providers`),this.peerStore=e.peerStore,this.peerRouting=n,this.providers=r,this.peerInfoMapper=t.peerInfoMapper}async handle(e,t){if(null==t.key)throw new dn("Invalid GET_PROVIDERS message received - key was missing","ERR_INVALID_MESSAGE");let n;try{n=yt.decode(t.key)}catch(e){throw new dn("Invalid CID","ERR_INVALID_CID")}this.log("%p asking for providers for %s",e,n);const[r,s]=await Promise.all([this.providers.getProviders(n),this.peerRouting.getCloserPeersOffline(t.key,e)]),i=await this._getPeers(r),o=await this._getPeers(s.map((({id:e})=>e))),a={type:Qv.GET_PROVIDERS,key:t.key,clusterLevel:t.clusterLevel,closer:o.map(this.peerInfoMapper).filter((({multiaddrs:e})=>e.length)).map((e=>({id:e.id.toBytes(),multiaddrs:e.multiaddrs.map((e=>e.bytes))}))),providers:i.map(this.peerInfoMapper).filter((({multiaddrs:e})=>e.length)).map((e=>({id:e.id.toBytes(),multiaddrs:e.multiaddrs.map((e=>e.bytes))})))};return this.log("got %s providers %s closerPeers",a.providers.length,a.closer.length),a}async _getAddresses(e){return[]}async _getPeers(e){const t=[];for(const n of e)try{const e=await this.peerStore.get(n),r=this.peerInfoMapper({id:n,multiaddrs:e.addresses.map((({multiaddr:e})=>e))});r.multiaddrs.length>0&&t.push(r)}catch(e){if("ERR_NOT_FOUND"!==e.code)throw e}return t}}class WE{peerStore;datastore;peerRouting;log;constructor(e,t){this.log=e.logger.forComponent(`${t.logPrefix}:rpc:handlers:get-value`),this.peerStore=e.peerStore,this.datastore=e.datastore,this.peerRouting=t.peerRouting}async handle(e,t){const n=t.key;if(this.log("%p asked for key %b",e,n),null==n||0===n.length)throw new dn("Invalid key","ERR_INVALID_KEY");const r={type:Qv.GET_VALUE,key:n,clusterLevel:t.clusterLevel,closer:[],providers:[]};if(function(e){return"/pk/"===Gt(e.subarray(0,4))}(n)){this.log("is public key");const e=function(e){return vs(e.subarray(4))}(n);let t;try{const n=await this.peerStore.get(e);if(null==n.id.publicKey)throw new dn("No public key found in key book","ERR_NOT_FOUND");t=n.id.publicKey}catch(e){if("ERR_NOT_FOUND"!==e.code)throw e}if(null!=t)return this.log("returning found public key"),r.record=new rE(n,t,new Date).serialize(),r}const[s,i]=await Promise.all([this._checkLocalDatastore(n),this.peerRouting.getCloserPeersOffline(n,e)]);return null!=s&&(this.log("had record for %b in local datastore",n),r.record=s.serialize()),i.length>0&&(this.log("had %s closer peers in routing table",i.length),r.closer=i.map((e=>({id:e.id.toBytes(),multiaddrs:e.multiaddrs.map((e=>e.bytes))})))),r}async _checkLocalDatastore(e){this.log("checkLocalDatastore looking for %b",e);const t=wE(e);let n;try{n=await this.datastore.get(t)}catch(e){if("ERR_NOT_FOUND"===e.code)return;throw e}const r=rE.deserialize(n);if(null==r)throw new dn("Invalid record","ERR_INVALID_RECORD");if(!(null==r.timeReceived||Date.now()-r.timeReceived.getTime()>qv))return r;await this.datastore.delete(t)}}class jE{log;constructor(e,t){this.log=e.logger.forComponent(`${t.logPrefix}:rpc:handlers:ping`)}async handle(e,t){return this.log("ping from %p",e),t}}class GE{components;validators;log;constructor(e,t){const{validators:n}=t;this.components=e,this.log=e.logger.forComponent(`${t.logPrefix}:rpc:handlers:put-value`),this.validators=n}async handle(e,t){const n=t.key;if(this.log("%p asked us to store value for key %b",e,n),null==t.record){const t=`Empty record from: ${e.toString()}`;throw this.log.error(t),new dn(t,"ERR_EMPTY_RECORD")}try{const e=rE.deserialize(t.record);await dE(this.validators,e),e.timeReceived=new Date;const r=wE(e.key);await this.components.datastore.put(r,e.serialize().subarray()),this.log("put record for %b into datastore under key %k",n,r)}catch(e){this.log("did not put record for key %b into datastore %o",n,e)}return t}}class YE{handlers;routingTable;log;constructor(e,t){const{providers:n,peerRouting:r,validators:s,logPrefix:i,peerInfoMapper:o}=t;this.log=e.logger.forComponent(`${i}:rpc`),this.routingTable=t.routingTable,this.handlers={[Qv.GET_VALUE.toString()]:new WE(e,{peerRouting:r,logPrefix:i}),[Qv.PUT_VALUE.toString()]:new GE(e,{validators:s,logPrefix:i}),[Qv.FIND_NODE.toString()]:new HE(e,{peerRouting:r,logPrefix:i,peerInfoMapper:o}),[Qv.ADD_PROVIDER.toString()]:new qE(e,{providers:n,logPrefix:i}),[Qv.GET_PROVIDERS.toString()]:new zE(e,{peerRouting:r,providers:n,logPrefix:i,peerInfoMapper:o}),[Qv.PING.toString()]:new jE(e,{logPrefix:i})}}async handleMessage(e,t){try{await this.routingTable.add(e)}catch(e){this.log.error("Failed to update the kbucket store",e)}const n=this.handlers[t.type];if(null!=n)return n.handle(e,t);this.log.error(`no handler found for message type: ${t.type}`)}onIncomingStream(e){Promise.resolve().then((async()=>{const{stream:t,connection:n}=e,r=n.remotePeer;try{await this.routingTable.add(r)}catch(e){this.log.error(e)}const s=this;await pr(t,(e=>Kr(e)),(async function*(e){for await(const t of e){const e=tE.decode(t);s.log("incoming %s from %p",e.type,r);const n=await s.handleMessage(r,e);null!=n&&(yield tE.encode(n))}}),(e=>Nr(e)),t)})).catch((e=>{this.log.error(e)}))}}class QE extends mn{log;components;protocol;running;registrarId;constructor(e,t){super();const{protocol:n,logPrefix:r}=t;this.components=e,this.log=e.logger.forComponent(`${r}:topology-listener`),this.running=!1,this.protocol=n}isStarted(){return this.running}async start(){this.running||(this.running=!0,this.registrarId=await this.components.registrar.register(this.protocol,{onConnect:e=>{this.log("observed peer %p with protocol %s",e,this.protocol),this.dispatchEvent(new wn("peer",{detail:e}))}}))}async stop(){this.running=!1,null!=this.registrarId&&(this.components.registrar.unregister(this.registrarId),this.registrarId=void 0)}}class JE{dht;constructor(e){this.dht=e}async provide(e,t={}){await Pd(this.dht.provide(e,t))}async*findProviders(e,t={}){for await(const n of this.dht.findProviders(e,t))"PROVIDER"===n.name&&(yield*n.providers)}async put(e,t,n){await Pd(this.dht.put(e,t,n))}async get(e,t){for await(const n of this.dht.get(e,t))if("VALUE"===n.name)return n.value;throw new dn("Not found","ERR_NOT_FOUND")}}class ZE{dht;constructor(e){this.dht=e}async findPeer(e,t={}){for await(const n of this.dht.findPeer(e,t))if("FINAL_PEER"===n.name)return n.peer;throw new dn("Not found","ERR_NOT_FOUND")}async*getClosestPeers(e,t={}){for await(const n of this.dht.getClosestPeers(e,t))"FINAL_PEER"===n.name&&(yield n.peer)}}class XE extends mn{protocol;routingTable;providers;network;peerRouting;components;log;running;kBucketSize;clientMode;validators;selectors;queryManager;contentFetching;contentRouting;routingTableRefresh;rpc;topologyListener;querySelf;maxInboundStreams;maxOutboundStreams;dhtContentRouting;dhtPeerRouting;peerInfoMapper;constructor(e,t){super();const{kBucketSize:n,clientMode:r,validators:s,selectors:i,querySelfInterval:o,protocol:a,logPrefix:c,pingTimeout:l,pingConcurrency:u,maxInboundStreams:h,maxOutboundStreams:d,providers:p}=t,f=c??"libp2p:kad-dht";this.running=!1,this.components=e,this.log=e.logger.forComponent(f),this.protocol=a??"/ipfs/kad/1.0.0",this.kBucketSize=n??20,this.clientMode=r??!0,this.maxInboundStreams=h??32,this.maxOutboundStreams=d??64,this.peerInfoMapper=t.peerInfoMapper??gE,this.routingTable=new VE(e,{kBucketSize:n,pingTimeout:l,pingConcurrency:u,protocol:this.protocol,logPrefix:f}),this.providers=new kE(e,p??{}),this.validators={...pE,...s},this.selectors={...hE,...i},this.network=new RE(e,{protocol:this.protocol,logPrefix:f});const g=ar();!0===t.allowQueryWithZeroPeers&&g.resolve(),this.queryManager=new NE(e,{disjointPaths:Math.ceil(this.kBucketSize/2),logPrefix:f,initialQuerySelfHasRun:g,routingTable:this.routingTable}),this.peerRouting=new DE(e,{routingTable:this.routingTable,network:this.network,validators:this.validators,queryManager:this.queryManager,logPrefix:f}),this.contentFetching=new vE(e,{validators:this.validators,selectors:this.selectors,peerRouting:this.peerRouting,queryManager:this.queryManager,network:this.network,logPrefix:f}),this.contentRouting=new SE(e,{network:this.network,peerRouting:this.peerRouting,queryManager:this.queryManager,routingTable:this.routingTable,providers:this.providers,logPrefix:f}),this.routingTableRefresh=new $E(e,{peerRouting:this.peerRouting,routingTable:this.routingTable,logPrefix:f}),this.rpc=new YE(e,{routingTable:this.routingTable,providers:this.providers,peerRouting:this.peerRouting,validators:this.validators,logPrefix:f,peerInfoMapper:this.peerInfoMapper}),this.topologyListener=new QE(e,{protocol:this.protocol,logPrefix:f}),this.querySelf=new OE(e,{peerRouting:this.peerRouting,interval:o,initialInterval:t.initialQuerySelfInterval,logPrefix:f,initialQuerySelfHasRun:g,routingTable:this.routingTable}),this.network.addEventListener("peer",(e=>{const t=e.detail;this.onPeerConnect(t).catch((e=>{this.log.error("could not add %p to routing table",t.id,e)})),this.dispatchEvent(new wn("peer",{detail:t}))})),this.topologyListener.addEventListener("peer",(e=>{const t=e.detail;Promise.resolve().then((async()=>{const e=await this.components.peerStore.get(t),n={id:t,multiaddrs:e.addresses.map((({multiaddr:e})=>e)),protocols:e.protocols};await this.onPeerConnect(n)})).catch((e=>{this.log.error("could not add %p to routing table",t,e)}))})),this.dhtPeerRouting=new ZE(this),this.dhtContentRouting=new JE(this),null==t.clientMode&&e.events.addEventListener("self:peer:update",(e=>{this.log("received update of self-peer info"),Promise.resolve().then((async()=>{const t=e.detail.peer.addresses.some((({multiaddr:e})=>function(e){const t=e.stringTuples();for(const e of t)if(290===e[0])return!1;if(54===t[0][0]||55===t[0][0]||56===t[0][0])return!0;if(4===t[0][0]||41===t[0][0]){const e=Wd(`${t[0][1]}`);return null==e||!e}return!1}(e))),n=this.getMode();t&&"client"===n?await this.setMode("server"):"server"!==n||t||await this.setMode("client")})).catch((e=>{this.log.error("error setting dht server mode",e)}))}))}get[en](){return this.dhtContentRouting}get[sn](){return this.dhtPeerRouting}get[tn](){return this}async onPeerConnect(e){if(this.log("peer %p connected",e.id),0!==(e=this.peerInfoMapper(e)).multiaddrs.length)try{await this.routingTable.add(e.id)}catch(t){this.log.error("could not add %p to routing table",e.id,t)}else this.log("ignoring %p as there were no valid addresses in %s after filtering",e.id,e.multiaddrs.map((e=>e.toString())))}isStarted(){return this.running}getMode(){return this.clientMode?"client":"server"}async setMode(e){await this.components.registrar.unhandle(this.protocol),"client"===e?(this.log("enabling client mode"),this.clientMode=!0):(this.log("enabling server mode"),this.clientMode=!1,await this.components.registrar.handle(this.protocol,this.rpc.onIncomingStream.bind(this.rpc),{maxInboundStreams:this.maxInboundStreams,maxOutboundStreams:this.maxOutboundStreams}))}async start(){this.running=!0,await this.setMode(this.clientMode?"client":"server"),await async function(...e){const t=[];for(const n of e)bn(n)&&t.push(n);await Promise.all(t.map((async e=>{null!=e.beforeStart&&await e.beforeStart()}))),await Promise.all(t.map((async e=>{await e.start()}))),await Promise.all(t.map((async e=>{null!=e.afterStart&&await e.afterStart()})))}(this.querySelf,this.providers,this.queryManager,this.network,this.routingTable,this.topologyListener,this.routingTableRefresh)}async stop(){this.running=!1,await async function(...e){const t=[];for(const n of e)bn(n)&&t.push(n);await Promise.all(t.map((async e=>{null!=e.beforeStop&&await e.beforeStop()}))),await Promise.all(t.map((async e=>{await e.stop()}))),await Promise.all(t.map((async e=>{null!=e.afterStop&&await e.afterStop()})))}(this.querySelf,this.providers,this.queryManager,this.network,this.routingTable,this.routingTableRefresh,this.topologyListener)}async*put(e,t,n={}){yield*this.contentFetching.put(e,t,n)}async*get(e,t={}){yield*this.contentFetching.get(e,t)}async*provide(e,t={}){yield*this.contentRouting.provide(e,this.components.addressManager.getAddresses(),t)}async*findProviders(e,t={}){yield*this.contentRouting.findProviders(e,t)}async*findPeer(e,t={}){yield*this.peerRouting.findPeer(e,t)}async*getClosestPeers(e,t={}){yield*this.peerRouting.getClosestPeers(e,t)}async refreshRoutingTable(){this.routingTableRefresh.refreshTable(!0)}}var eS;function tS(e){return t=>new XE(t,e)}!function(e){e[e.SEND_QUERY=0]="SEND_QUERY",e[e.PEER_RESPONSE=1]="PEER_RESPONSE",e[e.FINAL_PEER=2]="FINAL_PEER",e[e.QUERY_ERROR=3]="QUERY_ERROR",e[e.PROVIDER=4]="PROVIDER",e[e.VALUE=5]="VALUE",e[e.ADD_PEER=6]="ADD_PEER",e[e.DIAL_PEER=7]="DIAL_PEER"}(eS||(eS={}));const nS=ls("libp2p:simple-metrics");class rS{value=0;update(e){this.value=e}increment(e=1){this.value+=e}decrement(e=1){this.value-=e}reset(){this.value=0}timer(){const e=Date.now();return()=>{this.value=Date.now()-e}}}class sS{values={};update(e){Object.entries(e).forEach((([e,t])=>{this.values[e]=t}))}increment(e){Object.entries(e).forEach((([e,t])=>{this.values[e]=this.values[e]??0;const n="number"==typeof t?t:1;this.values[e]+=Number(n)}))}decrement(e){Object.entries(e).forEach((([e,t])=>{this.values[e]=this.values[e]??0;const n="number"==typeof t?t:1;this.values[e]-=Number(n)}))}reset(){this.values={}}timer(e){const t=Date.now();return()=>{this.values[e]=Date.now()-t}}}class iS{metrics=new Map;transferStats;started;interval;intervalMs;onMetrics;constructor(e,t){this.started=!1,this._emitMetrics=this._emitMetrics.bind(this),this.intervalMs=t.intervalMs??1e3,this.onMetrics=t.onMetrics,this.transferStats=new Map}isStarted(){return this.started}start(){this.started=!0,this.interval=setInterval(this._emitMetrics,this.intervalMs)}stop(){this.started=!1,clearInterval(this.interval)}_emitMetrics(){Promise.resolve().then((async()=>{const e={};for(const[t,n]of this.metrics.entries())e[t]=n instanceof rS?n.value:n instanceof sS?n.values:await n();this.onMetrics(structuredClone(e))})).catch((e=>{nS.error("could not invoke onMetrics callback",e)}))}_incrementValue(e,t){const n=this.transferStats.get(e)??0;this.transferStats.set(e,n+t)}_track(e,t){const n=this,r=e.sink;e.sink=async function(e){await r(ib(e,(e=>{n._incrementValue(`${t} sent`,e.byteLength)})))};const s=e.source;e.source=ib(s,(e=>{n._incrementValue(`${t} received`,e.byteLength)}))}trackMultiaddrConnection(e){this._track(e,"global")}trackProtocolStream(e,t){null!=e.protocol&&this._track(e,e.protocol)}registerMetric(e,t={}){if(null==e||""===e.trim())throw new Error("Metric name is required");if(null!=t?.calculate)return void this.metrics.set(e,t.calculate);const n=new rS;return this.metrics.set(e,n),n}registerMetricGroup(e,t={}){if(null==e||""===e.trim())throw new Error("Metric name is required");if(null!=t?.calculate)return void this.metrics.set(e,t.calculate);const n=new sS;return this.metrics.set(e,n),n}registerCounter(e,t={}){if(null==e||""===e.trim())throw new Error("Metric name is required");if(null!=t?.calculate)return void this.metrics.set(e,t.calculate);const n=new rS;return this.metrics.set(e,n),n}registerCounterGroup(e,t={}){if(null==e||""===e.trim())throw new Error("Metric name is required");if(null!=t?.calculate)return void this.metrics.set(e,t.calculate);const n=new sS;return this.metrics.set(e,n),n}}function oS(e){return t=>new iS(t,e)}
|
|
82
|
+
//! WebPEER.js -- https://github.com/nuzulul/webpeerjs
|
|
83
|
+
class aS{#V;#K;#$;#q;#H;#z;#W;#j;#G;#Y;#Q;#J;#Z;#X;#ee;#te;#ne;#re;#se;id;status;IPFS;address;peers;constructor(e,r,i){this.#V=e,this.#H=r,this.#z=new Map,this.#K=new Map,this.#$=[],this.#q=new Map,this.#W=new Map,this.#j=!1,this.#G=new Map,this.address=[],this.#Y={},this.#Q=new Map,this.#J=[],this.#Z=new Map,this.#X=new Map,this.#ee=new Map,this.#te=[],this.#ne=!0,this.#re=[],this.#se=new Map,this.peers=this.#J,this.status=function(e){return e.status}(this.#V),this.status="unconnected",this.IPFS=function(e,t){return{libp2p:e,discoveredPeers:t}}(this.#V,this.#K),this.id=this.#V.peerId.toString();for(const e of o)this.#V.services.pubsub.subscribe(e);for(const e of s)this.#V.services.pubsub.subscribe(e);this.#V.addEventListener("peer:connect",(async e=>{e.detail;const t=e.detail.toString(),n=this.#V.getConnections().map((e=>({id:e.remotePeer.toString(),addr:e.remoteAddr.toString()}))).find((e=>e.id==t)).addr;if(p.includes(t)&&(this.#X.has(t)&&!this.#X.get(t).includes("/wss/")||!n.includes("webtransport")||await this.#H.put(new Zt(t),(new TextEncoder).encode(n))),this.#X.set(t,n),d.includes(t)&&setTimeout((()=>{this.#ie(),this.#oe(),setTimeout((()=>{this.#ie(),this.#oe()}),5e3)}),1e3),this.#$.includes(t)){let e=[n];if(this.#Q.has(t)){const n={addrs:e,last:(new Date).getTime()};this.#Q.set(t,n)}else{this.#ae(t);const n={addrs:e,last:(new Date).getTime()};this.#Q.set(t,n),this.#ce()}}})),this.#V.services.pubsub.addEventListener("message",(e=>{if("signed"===e.detail.type){e.detail.topic;const n=e.detail.from.toString();try{if(this.#$.includes(n)){if(this.#Q.has(n)){const e=this.#Q.get(n).addrs,t={addrs:e,last:(new Date).getTime()};this.#Q.set(n,t)}else{this.#ae(n);const e=this.#q.get(n),t={addrs:e,last:(new Date).getTime()};this.#Q.set(n,t),this.#ce()}if(!this.#le(n))if(this.#X.has(n)){let e=[];const t=or(this.#X.get(n));e.push(t),this.#ue(e)}else if(this.#K.has(n)){const e=this.#K.get(n);let t=[];for(const n of e){if(!n.includes("webrtc"))continue;const e=or(n);t.push(e)}this.#ue(t)}else if(this.#Q.has(n)){const e=this.#Q.get(n).addrs;let t=[];for(const n of e){if(!n.includes("webrtc"))continue;const e=or(n);t.push(e)}this.#ue(t)}}const r=Wr(jt.decode(e.detail.data).addrs[0]),s=JSON.parse(r),i=s.prefix,o=s.room,a=s.rooms,c=s.message,l=s.msgId,u=s.signal,h=s.id;if(h!=n)return;let d=s.address;if(i===t){if(this.#$.includes(h)||this.#$.push(h),!this.#Q.has(h)){this.#ae(h),d=[];const e={addrs:d,last:(new Date).getTime()};this.#Q.set(h,e),this.#q.set(h,d),this.#ce()}if(o&&this.#Y[o]&&(this.#Y[o].members.includes(h)||this.#Q.has(h)&&(this.#Y[o].members.push(h),this.#Y[o].onMembers(this.#Y[o].members)),c)){const e=l+h;this.#re.includes(e)||(this.#re.push(e),this.#Y[o].onMessage(c,h))}if(a)for(const e of a)this.#Y[e]&&(this.#Y[e].members.includes(h)||this.#Q.has(h)&&(this.#Y[e].members.push(h),this.#Y[e].onMembers(this.#Y[e].members)));u&&"announce"==u&&setTimeout((()=>{this.#he("")}),1e3)}else if("hybrid"===i&&d.length>0&&!this.#X.has(h)){let e=[];for(const t of d){const n=or(t);e.push(n)}this.#ue(e)}}catch(e){}}})),this.#V.addEventListener("peer:discovery",(e=>{const t=e.detail.multiaddrs,n=e.detail.id;if(0!=t.length){let r=[];for(const s of t){let i;i=t.toString().includes(e.detail.id.toString())?s.toString():s.toString()+"/p2p/"+n,r.push(i)}if(this.#K.set(n.toString(),r),t.toString().includes("certhash")&&t.toString().includes("webtransport")&&t.toString().includes("p2p-circuit")&&!this.#X.has(n)){let e=[];for(const t of r){if(!t.includes("webrtc"))continue;const n=or(t);e.push(n)}this.#ue(e)}}})),this.#V.addEventListener("peer:disconnect",(async e=>{const t=e.detail.string;if(this.#ee.has(t)){let e=this.#ee.get(t);if(e++,this.#ee.set(t,e),e>10&&(this.#z.has(t)&&this.#z.delete(t),!this.#$.includes(t)&&!this.#G.has(t)))return}else this.#ee.set(t,0);let n=[];for(const e of this.#se.values())n.push(e.id);if(this.#$.includes(t)){let e=[];const n=or(this.#X.get(t));e.push(n),this.#ue(e)}else if(this.#G.has(t)){const e=this.#X.get(t);if(e.includes("/wss/"))return;let n=[];const r=or(e);n.push(r),this.#ue(n)}else if(n.includes(t)){let e=[];const n=or(this.#X.get(t));e.push(n),this.#ue(e)}else{or(this.#X.get(t))}})),this.#V.addEventListener("self:peer:update",(({detail:{peer:e}})=>{const t=e.id.toString(),n=[];e.addresses.forEach((e=>{const r=e.multiaddr.toString()+"/p2p/"+t;r.includes("webtransport")&&r.includes("certhash")&&r.includes("webrtc")&&n.push(r)})),this.address=n,this.#he(),this.#ie()})),this.#V.addEventListener("peer:identify",(async e=>{const t=e.detail.peerId.toString();if(h.includes(t)){if(e.detail.connection.remoteAddr.toString().includes("/wss/")){let n=[],r=[];for(const s of e.detail.listenAddrs){if(!s.toString().includes("webtransport"))continue;const e=s.toString()+"/p2p/"+t,i=or(e);n.push(e),r.push(i)}this.#G.set(t,n),await this.#V.hangUp(bs(t)),this.#ue(r)}}if(e.detail.protocols.includes(n)){const t=e.detail.peerId.toString();let n=[];for(const r of e.detail.listenAddrs){const e=r.toString()+"/p2p/"+t;or(e),e.includes("webtransport")&&n.push(e)}if(this.#Q.has(t)){const e={addrs:n,last:(new Date).getTime()};this.#Q.set(t,e)}const r="peer-exchange";this.#de(t,r)}})),this.#pe(),this.#fe(),this.#ge(),this.#me(),this.#ye(),i((e=>{const t=function(e){try{const t=e.libp2p_webtransport_dialer_events_total,n=(t.pending??0)-(Zr.pending??0),r=(t.ready_error??0)-(Zr.ready_error??0),s=(t.noise_error??0)-(Zr.noise_error??0),i=(t.upgrade_error??0)-(Zr.upgrade_error??0),o=(t.close??0)-(Zr.close??0),a=(t.ready??0)-(Zr.ready??0),c=(t.abort??0)-(Zr.abort??0),l=(t.ready_timeout??0)-(Zr.ready_timeout??0),u=(t.noise_timeout??0)-(Zr.noise_timeout??0),h=(t.open??0)-(Zr.open??0),d=(t.remote_close??0)-(Zr.remote_close??0);Jr.pending+=n,Jr.pending-=l,Jr.pending-=u,Jr.pending-=r,Jr.pending-=s,Jr.pending-=i,Jr.pending-=h,Jr.open+=h,Jr.open-=o,Jr.open-=d,Jr.open-=c,Jr.ready_error=r,Jr.noise_error=s,Jr.upgrade_error=i,Jr.ready_timeout=l,Jr.noise_timeout=u,Jr.close=o,Jr.abort=c,Jr.remote_close=d,Qr.success+=a,Qr.readyErrored+=r,Qr.noiseErrored+=s,Qr.upgradeErrored+=i,Qr.readyTimedout+=l,Qr.noiseTimedout+=u;const p=Qr.readyErrored+Qr.noiseErrored+Qr.upgradeErrored,f=Qr.readyTimedout+Qr.noiseTimedout;return Zr=t,ts=p+f,Jr.open,Jr.pending,ts-es>30&&Xr&&(Xr=!1,JSON.stringify({isDialEnabled:Xr,fail:ts,lastfailtreshold:es}),console.warn("dial disabled"),setTimeout((()=>{Xr||(Xr=!0,es=ts,JSON.stringify({isDialEnabled:Xr,fail:ts,lastfailtreshold:es}),console.warn("dial enabled"))}),36e4)),Xr}catch{console.debug("Metrics error")}}(e);this.#ne=t})),setTimeout((()=>{this.#we(),setInterval((()=>{this.#we()}),5e3)}),1e4),setInterval((()=>{this.#be()}),5e3),setInterval((()=>{this.#ie()}),1e4)}#ae=()=>{};onConnect=e=>this.#ae=e;#ve=()=>{};onDisconnect=e=>this.#ve=e;joinRoom=e=>{if(this.#Y[e])return[this.#Y[e].sendMessage,this.#Y[e].listenMessage,this.#Y[e].onMembersChange];if(!e)throw zr("room is required");{const n=o;this.#Y[e]={onMessage:()=>{},listenMessage:t=>this.#Y[e]={...this.#Y[e],onMessage:t},sendMessage:async r=>{const s=(new Date).getTime(),i=jr(JSON.stringify({prefix:t,room:e,message:r,id:this.#V.peerId.toString(),msgId:s}));if(i.byteLength>102400)throw zr("data too large");const o={publicKey:this.#V.peerId.publicKey,addrs:[i]},a=jt.encode(o);for(const e of n)await this.#V.services.pubsub.publish(e,a)},members:[this.id],onMembers:()=>{},onMembersChange:t=>{this.#Y[e]={...this.#Y[e],onMembers:t},this.#Y[e].onMembers(this.#Y[e].members),this.#he()}}}return[this.#Y[e].sendMessage,this.#Y[e].listenMessage,this.#Y[e].onMembersChange]};dial(e){let t=[];const n=or(e);t.push(n),this.#ue(t)}#ce(){this.#J.length=0;for(const e of this.#Q){const t={id:e[0],address:e[1].addrs};this.#J.push(t)}this.#Q.size>0?this.status="connected":this.status="unconnected",this.#he()}async#ye(){await this.#V.handle(n,(async({connection:e,stream:t,protocol:r})=>{try{const r=await pr(t.source,(e=>Kr(e)),(e=>qr(e,(e=>Wr(e.subarray())))),(async function(e){let t="";for await(const n of e)t+=n.toString();return t})),s=e.remotePeer.toString();let i=JSON.parse(r),o={protocol:n,command:null,data:null};if("peer-exchange"===i.command){if(i.protocol==n){const t=[e.remoteAddr.toString()];if(this.#Q.has(s)){const e={addrs:t,last:(new Date).getTime()};this.#Q.set(s,e)}else{this.#$.includes(s)||this.#$.push(s),this.#ae(s);const e={addrs:t,last:(new Date).getTime()};this.#Q.set(s,e),this.#ce()}}if(null!=i.data){this.#se.set(s,i.data);let e=[];const t=or(i.data.addr),n=i.data.id;e.push(t),this.#ue(e),this.#z.has(n)}const t=Array.from(this.#z.keys()),r=t[Math.floor(Math.random()*t.length)],a=this.#z.get(r);o.command=i.command,o.data={id:r,addr:a}}pr(JSON.stringify(o),(e=>qr(e,(e=>jr(e)))),(e=>Nr(e)),t.sink)}catch(e){}}),{maxInboundStreams:50,maxOutboundStreams:50,runOnTransientConnection:!1}),await this.#V.register(n,{onConnect:(e,t)=>{},onDisconnect:(e,t)=>{}})}async#de(e,t){const r=this.#V.getConnections().map((e=>({id:e.remotePeer.toString(),addr:e.remoteAddr.toString()}))).find((t=>t.id==e)).addr,s=or(r);let i={protocol:n,command:null,data:null};if("peer-exchange"===t){if(this.#se.has(e))return;const n=Array.from(this.#z.keys()),r=n[Math.floor(Math.random()*n.length)],s=this.#z.get(r);i.command=t,i.data={id:r,addr:s}}const o=JSON.stringify(i);try{const t=await this.#V.dialProtocol(s,n,{runOnTransientConnection:!1}),i=await pr(o,(e=>qr(e,(e=>jr(e)))),(e=>Nr(e)),t,(e=>Kr(e)),(e=>qr(e,(e=>Wr(e.subarray())))),(async function(e){let t="";for await(const n of e)t+=n.toString();return t})),a=JSON.parse(i);if(a.protocol==n){const t=[r];if(this.#Q.has(e)){const n={addrs:t,last:(new Date).getTime()};this.#Q.set(e,n)}else{this.#$.includes(e)||this.#$.push(e),this.#ae(e);const n={addrs:t,last:(new Date).getTime()};this.#Q.set(e,n),this.#ce()}}if("peer-exchange"==a.command&&null!=a.data){this.#se.set(e,a.data);let t=[];const n=or(a.data.addr),r=a.data.id;t.push(n),this.#ue(t),this.#z.has(r)}}catch(e){}}async#Ee(){if(navigator.onLine&&this.#ne)for(const e of d)if(!this.#le(e)&&!this.#X.has(e)){const t=bs(e);for await(const e of this.#V.services.aminoDHT.findPeer(t))if("FINAL_PEER"===e.name){let t=[],n=[];const r=e.peer.id.toString();for(const s of e.peer.multiaddrs){const e=s.toString()+"/p2p/"+r,i=or(e);n.push(e),t.push(i)}this.#G.set(r,n),this.#le(r)||this.#ue(t)}}}#be(){const e=(new Date).getTime();for(const t of this.#Q){const n=t[0],r=e-t[1].last;if(r>25e3&&!this.#le(n)||r>6e4){this.#Q.delete(n),this.#ce(),this.#ve(n);const e=Object.keys(this.#Y);for(const t of e)if(this.#Y[t].members.includes(n)){const e=this.#Y[t].members.indexOf(n);this.#Y[t].members.splice(e,1),this.#Y[t].onMembers(this.#Y[t].members)}}}}#le(e){let t=[];for(const e of this.#V.getPeers())t.push(e.toString());return!!t.includes(e)}#ue(e){if(e.length>0){const t=e[0].toString().split("/").pop();if(this.#te.map((e=>e[0].toString().split("/").pop())).includes(t))return;const n=this.#Q.size,r=this.#V.getPeers().length-n,s=50;if(this.#$.includes(t)){if(n>s)return}else if(r>s)return;this.#$.includes(t)||p.includes(t)||d.includes(t)?this.#te.unshift(e):this.#te.push(e)}}#we(){if(!this.#ne||!navigator.onLine)return;let e=[];for(const t of this.#V.getDialQueue()){const n=t.peerId.string;e.push(n)}if(!(e.length>5))for(let t=0;t<5;t++){const t=this.#te.shift();if(!(null!=t&&t.length>0))break;{const n=t[0].toString().split("/").pop();if(this.#le(n))continue;if(e.includes(n))continue;this.#Se(t),this.#j&&this.#_e(t)}}}async#ie(){const e=s,t=JSON.stringify({prefix:"hybrid",id:this.#V.peerId.toString(),address:this.address}),n={publicKey:this.#V.peerId.publicKey,addrs:[jr(t)]},r=jt.encode(n);for(const t of e)await this.#V.services.pubsub.publish(t,r)}async#oe(){const e=o,n=JSON.stringify({prefix:t,signal:"announce",id:this.#V.peerId.toString(),address:this.address,rooms:Object.keys(this.#Y)}),r={publicKey:this.#V.peerId.publicKey,addrs:[jr(n)]},s=jt.encode(r);for(const t of e)await this.#V.services.pubsub.publish(t,s)}async#he(){const e=o,n=JSON.stringify({prefix:t,signal:"ping",id:this.#V.peerId.toString(),address:this.address,rooms:Object.keys(this.#Y)}),r={publicKey:this.#V.peerId.publicKey,addrs:[jr(n)]},s=jt.encode(r);for(const t of e)await this.#V.services.pubsub.publish(t,s)}#me(){setInterval((()=>{const e=p,t=Math.floor(Math.random()*e.length);let n=[];n.push(e[t]);for(const e of d)n.push(e);for(const e of n)if(null!=e&&!this.#le(e))if(this.#X.has(e)){let t=[];const n=or(this.#X.get(e));t.push(n),this.#ue(t)}else if(this.#G.has(e)){let t=[];const n=this.#G.get(e);for(const e of n){const n=or(e);t.push(n)}this.#ue(t)}else{const t=f,n=t.findIndex((t=>t.Peers[0].ID==e));if(n>-1){const r=t[n].Peers[0].Addrs;let s=[];for(const t of r){const n=or(t+"/p2p/"+e);s.push(n)}this.#ue(s)}}}),45e3)}async#ge(){for await(const{key:e,value:t}of this.#H.query({})){const n=e.toString().split("/")[1],r=(new TextDecoder).decode(t);this.#z.set(n,r)}setInterval((async()=>{const e=this.#V.getConnections();for(const t of e){const e=t.remotePeer,n=t.remoteAddr,r=t.timeline.upgraded,s=3e5,i=(new Date).getTime();if(i-r>s){const t=n.toString(),r=e.toString();this.#$.includes(r)||p.includes(r)||this.#z.has(r)||t.includes("p2p-circuit")||!t.includes("webtransport")||(await this.#H.put(new Zt(r),(new TextEncoder).encode(t)),this.#z.set(r,t))}if(i-r>6e4){const t=e.toString();this.#W.has(t)||this.#W.set(t,0)}}for(const e of this.#z){const t=e[0],n=e[1];if(this.#le(t))this.#Z.set(t,0);else{if(this.#Z.has(t)){let e=this.#Z.get(t);if(e++,this.#Z.set(t,e),e>5){this.#X.has(t)||p.includes(t)||!navigator.onLine||setTimeout((async()=>{this.#z.has(t)&&!this.#X.has(t)&&(this.#z.delete(t),await this.#H.delete(new Zt(t)))}),6e4);continue}}else this.#Z.set(t,0);let e=[];const r=or(n);e.push(r),this.#ue(e)}}const t=Array.from(this.#W.keys());for(const e of t)if(this.#le(e))this.#W.set(e,0);else{let t=this.#W.get(e);if(t<15||t<25&&this.#G.has(e)){let n=[];const r=or(this.#X.get(e));n.push(r),this.#ue(n),t++,this.#W.set(e,t)}}}),15e3)}#fe(){setInterval((()=>{0==this.#V.getPeers().length&&this.#pe()}),12e4)}#pe(){setTimeout((()=>{this.#Ie(),setTimeout((()=>{this.#Re()}),5e4),setTimeout((()=>{this.#Ee()}),6e4),setTimeout((()=>{0==this.#V.getPeers().length&&(this.#Ae(),setTimeout((()=>{this.#Ee()}),6e4),setTimeout((()=>{0==this.#V.getPeers().length&&(this.#Te(),setTimeout((()=>{this.#Ee()}),15e3),setTimeout((()=>{0==this.#V.getPeers().length&&(this.#De(),setTimeout((()=>{this.#Ee()}),15e3),setTimeout((()=>{0==this.#V.getPeers().length&&(this.#ke(),setTimeout((()=>{this.#Ee()}),15e3))}),u))}),u))}),u))}),u)}),5e3)}async#Ie(){if(!navigator.onLine)return;if(!this.#ne)return;let e=!0;for(const t of p)if(this.#z.has(t)){e=!1;let n=[],r=[];const s=t,i=this.#z.get(t),o=or(i);r.push(i),n.push(o),this.#G.set(s,r),this.#le(s)||this.#ue(n)}if(e)for(const e of p){const t=Fh(a),n=await Gr(t.getPeers(bs(e)));if(!n)continue;const r=n.Addrs,s=n.ID;let i=[],o=[];for(const e of r){const t=e.toString()+"/p2p/"+s.toString(),n=or(t);o.push(t),i.push(n)}this.#G.set(s,o),this.#le(s)||this.#ue(i)}}async#Re(){if(!navigator.onLine)return;if(!this.#ne)return;let e=!0;for(const t of p)if(this.#z.has(t)&&(e=!1),!this.#X.has(t)&&(this.#z.has(t)||e)){const e=Fh(a),n=await Gr(e.getPeers(bs(t)));if(!n){navigator.onLine&&await this.#H.delete(new Zt(t));continue}const r=n.Addrs,s=n.ID;let i=[],o=[];for(const e of r){const t=e.toString()+"/p2p/"+s.toString(),n=or(t);o.push(t),i.push(n)}this.#G.set(s,o),this.#le(s)||this.#ue(i)}}async#Ae(){if(!navigator.onLine)return;if(!this.#ne)return;const e=Fh(a),t=p,n=await Promise.all(t.map((t=>Gr(e.getPeers(bs(t))))));for(const e of n){if(!e)return;const t=e.Addrs,n=e.ID;let r=[],s=[];for(const e of t){const t=e.toString()+"/p2p/"+n.toString(),i=or(t);s.push(t),r.push(i)}this.#G.set(n,s),this.#le(n)||this.#ue(r)}}#Te(){if(!navigator.onLine)return;if(!this.#ne)return;const e=f;for(const t of e){const e=t.Peers[0].Addrs,n=t.Peers[0].ID;let r=[],s=[];for(const t of e){if(!t.includes("wss"))continue;const e=t+"/p2p/"+n,i=or(e);s.push(e),r.push(i)}this.#G.set(n,s),this.#j=!0,this.#le(n)||this.#ue(r)}}async#De(){if(!navigator.onLine)return;if(!this.#ne)return;const e=c,t=l,n=await fetch(e+"?name="+t+"&type=txt"),r=(await n.json()).Answer,s=[];for(const e of r){const t=e.data.split("/").pop();s.push(t)}const i=Fh(a),o=await Promise.all(s.map((e=>Gr(i.getPeers(bs(e))))));for(const e of o){const t=e.Addrs,n=e.ID;let r=[],s=[];for(const e of t){const t=e.toString()+"/p2p/"+n.toString(),i=or(t);s.push(t),r.push(i)}this.#G.set(n,s),this.#j=!0,this.#le(n)||this.#ue(r)}}async#ke(){if(!navigator.onLine)return;if(!this.#ne)return;const e=c,t=l,n=await fetch(e+"?name="+t+"&type=txt"),r=(await n.json()).Answer;for(const e of r){const t=e.data.split("/"),n=t.pop(),r="_dnsaddr."+t[2];this.#Pe(n,r)}}async#Pe(e,t){const n=c,r=await fetch(n+"?name="+t+"&type=txt"),s=(await r.json()).Answer;let i=[],o=[];for(const e of s){const t=e.data.split("=")[1],n=or(t);i.push(n),o.push(t)}this.#j=!0,this.#G.set(e,o),this.#G.set(e,o),this.#le(e)||(this.#ue(i),this.#_e(i))}async#Se(e){const t=e.filter((e=>e.protoNames().includes("webtransport")&&e.protoNames().includes("certhash")));for(const e of t)try{return void await this.#V.dial(e)}catch(e){}}async#_e(e){const t=e.filter((e=>e.protoNames().includes("wss")));for(const e of t)try{return void await this.#V.dial(e)}catch(e){}}static async createWebpeer(){const e=new bg(r);await e.open();const t=f;for(const e of t){const t=e.Peers[0].Addrs;e.Peers[0].ID;for(const e of t)e.includes("webtransport")&&e.includes("certhash")}let n=()=>{};const s=await async function(e={}){const t=await Yf(e);return!1!==e.start&&await t.start(),t}({addresses:{listen:["/webrtc"]},transports:[Km(),jy(),(o={rtcConfiguration:{iceServers:[{urls:["stun:stun.l.google.com:19302","stun:global.stun.twilio.com:3478"]}]}},e=>new kw(e,o)),Bb({discoverRelays:1,reservationConcurrency:1,maxReservationQueueLength:3})],connectionManager:{maxConnections:100,minConnections:0,autoDialInterval:6e4,autoDialConcurrency:0,autoDialMaxQueueLength:0,autoDialPriority:1e3,autoDialDiscoveredPeersDebounce:6e4,maxParallelDials:3,dialTimeout:5e3,maxIncomingPendingConnections:5,maxDialQueueLength:10,inboundConnectionThreshold:3,maxPeerAddrsToDial:2,inboundUpgradeTimeout:5e3},connectionEncryption:[km()],streamMuxers:[hb({maxInboundStreams:20,maxOutboundStreams:20})],connectionGater:{filterMultiaddrForPeer:async(e,t)=>{const n=t.toString();return!n.includes("/ip4/127.0.0.1")&&!n.includes("/ip6/")},denyDialMultiaddr:async e=>{const t=e.toString();return!(!t.includes("/ip4/127.0.0.1")&&!t.includes("/ip6/"))}},peerDiscovery:[gb({interval:1e4,topics:i,listenOnly:!1})],services:{pubsub:Nv({allowPublishToZeroTopicPeers:!0,msgIdFn:Yr,ignoreDuplicatePublishError:!0,runOnTransientConnection:!1}),identify:Vv(),identifyPush:Kv(),aminoDHT:tS({protocol:"/ipfs/kad/1.0.0",peerInfoMapper:gE,clientMode:!1}),dcutr:Uw()},peerStore:{persistence:!0,threshold:1},metrics:oS({onMetrics:e=>{n(e)},intervalMs:1e3})});var o;return await s.services.aminoDHT.setMode("server"),new aS(s,e,(e=>n=e))}}export{aS as webpeerjs};
|