@waku/core 0.0.36-f911bf8.0 → 0.0.37-2ed5ddc.0
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/CHANGELOG.md +39 -0
- package/bundle/index.js +5647 -1359
- package/bundle/lib/message/version_0.js +1 -2
- package/bundle/{version_0-CiYGrPc2.js → version_0-Bc0h7ah2.js} +1886 -31
- package/dist/.tsbuildinfo +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/lib/connection_manager/connection_limiter.d.ts +35 -0
- package/dist/lib/connection_manager/connection_limiter.js +103 -0
- package/dist/lib/connection_manager/connection_limiter.js.map +1 -0
- package/dist/lib/connection_manager/connection_manager.d.ts +19 -104
- package/dist/lib/connection_manager/connection_manager.js +64 -499
- package/dist/lib/connection_manager/connection_manager.js.map +1 -1
- package/dist/lib/connection_manager/discovery_dialer.d.ts +32 -0
- package/dist/lib/connection_manager/discovery_dialer.js +131 -0
- package/dist/lib/connection_manager/discovery_dialer.js.map +1 -0
- package/dist/lib/connection_manager/keep_alive_manager.d.ts +17 -7
- package/dist/lib/connection_manager/keep_alive_manager.js +110 -74
- package/dist/lib/connection_manager/keep_alive_manager.js.map +1 -1
- package/dist/lib/connection_manager/network_monitor.d.ts +22 -0
- package/dist/lib/connection_manager/network_monitor.js +63 -0
- package/dist/lib/connection_manager/network_monitor.js.map +1 -0
- package/dist/lib/connection_manager/shard_reader.d.ts +28 -0
- package/dist/lib/connection_manager/shard_reader.js +70 -0
- package/dist/lib/connection_manager/shard_reader.js.map +1 -0
- package/dist/lib/connection_manager/utils.d.ts +16 -1
- package/dist/lib/connection_manager/utils.js +23 -0
- package/dist/lib/connection_manager/utils.js.map +1 -1
- package/dist/lib/filter/filter.d.ts +7 -5
- package/dist/lib/filter/filter.js +14 -11
- package/dist/lib/filter/filter.js.map +1 -1
- package/dist/lib/light_push/light_push.d.ts +5 -5
- package/dist/lib/light_push/light_push.js +7 -7
- package/dist/lib/light_push/light_push.js.map +1 -1
- package/dist/lib/message/version_0.d.ts +3 -4
- package/dist/lib/message/version_0.js +1 -4
- package/dist/lib/message/version_0.js.map +1 -1
- package/dist/lib/message_hash/index.d.ts +1 -0
- package/dist/lib/message_hash/index.js +2 -0
- package/dist/lib/message_hash/index.js.map +1 -0
- package/dist/lib/message_hash/message_hash.d.ts +52 -0
- package/dist/lib/message_hash/message_hash.js +84 -0
- package/dist/lib/message_hash/message_hash.js.map +1 -0
- package/dist/lib/metadata/metadata.js +6 -4
- package/dist/lib/metadata/metadata.js.map +1 -1
- package/dist/lib/store/rpc.js +16 -10
- package/dist/lib/store/rpc.js.map +1 -1
- package/dist/lib/store/store.d.ts +5 -5
- package/dist/lib/store/store.js +19 -9
- package/dist/lib/store/store.js.map +1 -1
- package/dist/lib/stream_manager/stream_manager.d.ts +3 -4
- package/dist/lib/stream_manager/stream_manager.js +6 -8
- package/dist/lib/stream_manager/stream_manager.js.map +1 -1
- package/package.json +1 -1
- package/src/index.ts +2 -0
- package/src/lib/connection_manager/connection_limiter.ts +161 -0
- package/src/lib/connection_manager/connection_manager.ts +87 -668
- package/src/lib/connection_manager/discovery_dialer.ts +195 -0
- package/src/lib/connection_manager/keep_alive_manager.ts +154 -87
- package/src/lib/connection_manager/network_monitor.ts +88 -0
- package/src/lib/connection_manager/shard_reader.ts +134 -0
- package/src/lib/connection_manager/utils.ts +27 -1
- package/src/lib/filter/filter.ts +26 -15
- package/src/lib/light_push/light_push.ts +9 -10
- package/src/lib/message/version_0.ts +3 -7
- package/src/lib/message_hash/index.ts +1 -0
- package/src/lib/message_hash/message_hash.ts +106 -0
- package/src/lib/metadata/metadata.ts +8 -5
- package/src/lib/store/rpc.ts +23 -19
- package/src/lib/store/store.ts +22 -11
- package/src/lib/stream_manager/stream_manager.ts +8 -6
- package/bundle/base_protocol-DvQrudwy.js +0 -152
- package/bundle/index-CTo1my9M.js +0 -1543
- package/bundle/lib/base_protocol.js +0 -2
- package/dist/lib/base_protocol.d.ts +0 -18
- package/dist/lib/base_protocol.js +0 -25
- package/dist/lib/base_protocol.js.map +0 -1
- package/src/lib/base_protocol.ts +0 -44
@@ -0,0 +1,131 @@
|
|
1
|
+
import { Logger } from "@waku/utils";
|
2
|
+
const log = new Logger("discovery-dialer");
|
3
|
+
/**
|
4
|
+
* This class is responsible for dialing peers that are discovered by the libp2p node.
|
5
|
+
* Managing limits for the peers is out of scope for this class.
|
6
|
+
* Dialing after discovery is needed to identify the peer and get all other information: metadata, protocols, etc.
|
7
|
+
*/
|
8
|
+
export class DiscoveryDialer {
|
9
|
+
libp2p;
|
10
|
+
shardReader;
|
11
|
+
dialingInterval = null;
|
12
|
+
dialingQueue = [];
|
13
|
+
dialHistory = new Set();
|
14
|
+
constructor(options) {
|
15
|
+
this.libp2p = options.libp2p;
|
16
|
+
this.shardReader = options.shardReader;
|
17
|
+
this.onPeerDiscovery = this.onPeerDiscovery.bind(this);
|
18
|
+
}
|
19
|
+
start() {
|
20
|
+
log.info("Starting discovery dialer");
|
21
|
+
this.libp2p.addEventListener("peer:discovery", this.onPeerDiscovery);
|
22
|
+
if (!this.dialingInterval) {
|
23
|
+
this.dialingInterval = setInterval(() => {
|
24
|
+
void this.processQueue();
|
25
|
+
}, 500);
|
26
|
+
log.info("Started dialing interval processor");
|
27
|
+
}
|
28
|
+
this.dialHistory.clear();
|
29
|
+
}
|
30
|
+
stop() {
|
31
|
+
log.info("Stopping discovery dialer");
|
32
|
+
this.libp2p.removeEventListener("peer:discovery", this.onPeerDiscovery);
|
33
|
+
if (this.dialingInterval) {
|
34
|
+
clearInterval(this.dialingInterval);
|
35
|
+
this.dialingInterval = null;
|
36
|
+
log.info("Stopped dialing interval processor");
|
37
|
+
}
|
38
|
+
this.dialHistory.clear();
|
39
|
+
}
|
40
|
+
async onPeerDiscovery(event) {
|
41
|
+
const peerId = event.detail.id;
|
42
|
+
log.info(`Discovered new peer: ${peerId}`);
|
43
|
+
try {
|
44
|
+
const shouldSkip = await this.shouldSkipPeer(peerId);
|
45
|
+
if (shouldSkip) {
|
46
|
+
log.info(`Skipping peer: ${peerId}`);
|
47
|
+
return;
|
48
|
+
}
|
49
|
+
await this.updatePeerStore(peerId, event.detail.multiaddrs);
|
50
|
+
if (this.dialingQueue.length === 0) {
|
51
|
+
await this.dialPeer(peerId);
|
52
|
+
}
|
53
|
+
else {
|
54
|
+
this.dialingQueue.push(peerId);
|
55
|
+
log.info(`Added peer to dialing queue, queue size: ${this.dialingQueue.length}`);
|
56
|
+
}
|
57
|
+
}
|
58
|
+
catch (error) {
|
59
|
+
log.error(`Error dialing peer ${peerId}`, error);
|
60
|
+
}
|
61
|
+
}
|
62
|
+
async processQueue() {
|
63
|
+
if (this.dialingQueue.length === 0)
|
64
|
+
return;
|
65
|
+
const peersToDial = this.dialingQueue.slice(0, 3);
|
66
|
+
this.dialingQueue = this.dialingQueue.slice(peersToDial.length);
|
67
|
+
log.info(`Processing dial queue: dialing ${peersToDial.length} peers, ${this.dialingQueue.length} remaining in queue`);
|
68
|
+
await Promise.all(peersToDial.map(this.dialPeer));
|
69
|
+
}
|
70
|
+
async shouldSkipPeer(peerId) {
|
71
|
+
if (this.dialHistory.has(peerId.toString())) {
|
72
|
+
return true;
|
73
|
+
}
|
74
|
+
const hasShardInfo = await this.shardReader.hasShardInfo(peerId);
|
75
|
+
if (!hasShardInfo) {
|
76
|
+
return false;
|
77
|
+
}
|
78
|
+
const isOnSameShard = await this.shardReader.isPeerOnNetwork(peerId);
|
79
|
+
if (!isOnSameShard) {
|
80
|
+
log.info(`Skipping peer ${peerId} - not on same shard`);
|
81
|
+
return true;
|
82
|
+
}
|
83
|
+
const hasConnection = this.libp2p.getPeers().some((p) => p.equals(peerId));
|
84
|
+
if (hasConnection) {
|
85
|
+
return true;
|
86
|
+
}
|
87
|
+
return false;
|
88
|
+
}
|
89
|
+
async updatePeerStore(peerId, multiaddrs) {
|
90
|
+
try {
|
91
|
+
const peer = await this.getPeer(peerId);
|
92
|
+
if (!peer) {
|
93
|
+
await this.libp2p.peerStore.save(peerId, {
|
94
|
+
multiaddrs: multiaddrs
|
95
|
+
});
|
96
|
+
return;
|
97
|
+
}
|
98
|
+
const hasSameAddr = multiaddrs.every((addr) => peer.addresses.some((a) => a.multiaddr.equals(addr)));
|
99
|
+
if (hasSameAddr) {
|
100
|
+
return;
|
101
|
+
}
|
102
|
+
await this.libp2p.peerStore.merge(peerId, {
|
103
|
+
multiaddrs: multiaddrs
|
104
|
+
});
|
105
|
+
}
|
106
|
+
catch (error) {
|
107
|
+
log.error(`Error updating peer store for ${peerId}`, error);
|
108
|
+
}
|
109
|
+
}
|
110
|
+
async dialPeer(peerId) {
|
111
|
+
try {
|
112
|
+
log.info(`Dialing peer from queue: ${peerId}`);
|
113
|
+
await this.libp2p.dial(peerId);
|
114
|
+
this.dialHistory.add(peerId.toString());
|
115
|
+
log.info(`Successfully dialed peer from queue: ${peerId}`);
|
116
|
+
}
|
117
|
+
catch (error) {
|
118
|
+
log.error(`Error dialing peer ${peerId}`, error);
|
119
|
+
}
|
120
|
+
}
|
121
|
+
async getPeer(peerId) {
|
122
|
+
try {
|
123
|
+
return await this.libp2p.peerStore.get(peerId);
|
124
|
+
}
|
125
|
+
catch (error) {
|
126
|
+
log.error(`Error getting peer info for ${peerId}`, error);
|
127
|
+
return undefined;
|
128
|
+
}
|
129
|
+
}
|
130
|
+
}
|
131
|
+
//# sourceMappingURL=discovery_dialer.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"discovery_dialer.js","sourceRoot":"","sources":["../../../src/lib/connection_manager/discovery_dialer.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAiBrC,MAAM,GAAG,GAAG,IAAI,MAAM,CAAC,kBAAkB,CAAC,CAAC;AAE3C;;;;GAIG;AACH,MAAM,OAAO,eAAe;IACT,MAAM,CAAS;IACf,WAAW,CAAc;IAElC,eAAe,GAA0B,IAAI,CAAC;IAC9C,YAAY,GAAa,EAAE,CAAC;IAC5B,WAAW,GAAgB,IAAI,GAAG,EAAE,CAAC;IAE7C,YAAmB,OAA0C;QAC3D,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;QAC7B,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;QAEvC,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACzD,CAAC;IAEM,KAAK;QACV,GAAG,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;QAEtC,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAC1B,gBAAgB,EAChB,IAAI,CAAC,eAA+C,CACrD,CAAC;QAEF,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;YAC1B,IAAI,CAAC,eAAe,GAAG,WAAW,CAAC,GAAG,EAAE;gBACtC,KAAK,IAAI,CAAC,YAAY,EAAE,CAAC;YAC3B,CAAC,EAAE,GAAG,CAAC,CAAC;YAER,GAAG,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;QACjD,CAAC;QAED,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;IAC3B,CAAC;IAEM,IAAI;QACT,GAAG,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;QAEtC,IAAI,CAAC,MAAM,CAAC,mBAAmB,CAC7B,gBAAgB,EAChB,IAAI,CAAC,eAA+C,CACrD,CAAC;QAEF,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YACzB,aAAa,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;YACpC,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;YAE5B,GAAG,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;QACjD,CAAC;QAED,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;IAC3B,CAAC;IAEO,KAAK,CAAC,eAAe,CAAC,KAA4B;QACxD,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;QAC/B,GAAG,CAAC,IAAI,CAAC,wBAAwB,MAAM,EAAE,CAAC,CAAC;QAE3C,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;YAErD,IAAI,UAAU,EAAE,CAAC;gBACf,GAAG,CAAC,IAAI,CAAC,kBAAkB,MAAM,EAAE,CAAC,CAAC;gBACrC,OAAO;YACT,CAAC;YAED,MAAM,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YAE5D,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACnC,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YAC9B,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBAE/B,GAAG,CAAC,IAAI,CACN,4CAA4C,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,CACvE,CAAC;YACJ,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,GAAG,CAAC,KAAK,CAAC,sBAAsB,MAAM,EAAE,EAAE,KAAK,CAAC,CAAC;QACnD,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,YAAY;QACxB,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAE3C,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAClD,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QAEhE,GAAG,CAAC,IAAI,CACN,kCAAkC,WAAW,CAAC,MAAM,WAAW,IAAI,CAAC,YAAY,CAAC,MAAM,qBAAqB,CAC7G,CAAC;QAEF,MAAM,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;IACpD,CAAC;IAEO,KAAK,CAAC,cAAc,CAAC,MAAc;QACzC,IAAI,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC;YAC5C,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QACjE,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,OAAO,KAAK,CAAC;QACf,CAAC;QAED,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;QACrE,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,GAAG,CAAC,IAAI,CAAC,iBAAiB,MAAM,sBAAsB,CAAC,CAAC;YACxD,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;QAC3E,IAAI,aAAa,EAAE,CAAC;YAClB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAEO,KAAK,CAAC,eAAe,CAC3B,MAAc,EACd,UAAuB;QAEvB,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YAExC,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,MAAM,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE;oBACvC,UAAU,EAAE,UAAU;iBACvB,CAAC,CAAC;gBACH,OAAO;YACT,CAAC;YAED,MAAM,WAAW,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAC5C,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CACrD,CAAC;YAEF,IAAI,WAAW,EAAE,CAAC;gBAChB,OAAO;YACT,CAAC;YAED,MAAM,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,EAAE;gBACxC,UAAU,EAAE,UAAU;aACvB,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,GAAG,CAAC,KAAK,CAAC,iCAAiC,MAAM,EAAE,EAAE,KAAK,CAAC,CAAC;QAC9D,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,QAAQ,CAAC,MAAc;QACnC,IAAI,CAAC;YACH,GAAG,CAAC,IAAI,CAAC,4BAA4B,MAAM,EAAE,CAAC,CAAC;YAE/C,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAC/B,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;YAExC,GAAG,CAAC,IAAI,CAAC,wCAAwC,MAAM,EAAE,CAAC,CAAC;QAC7D,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,GAAG,CAAC,KAAK,CAAC,sBAAsB,MAAM,EAAE,EAAE,KAAK,CAAC,CAAC;QACnD,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,OAAO,CAAC,MAAc;QAClC,IAAI,CAAC;YACH,OAAO,MAAM,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACjD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,GAAG,CAAC,KAAK,CAAC,+BAA+B,MAAM,EAAE,EAAE,KAAK,CAAC,CAAC;YAC1D,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;CACF"}
|
@@ -1,4 +1,3 @@
|
|
1
|
-
import type { PeerId } from "@libp2p/interface";
|
2
1
|
import type { IRelay, Libp2p } from "@waku/interfaces";
|
3
2
|
type KeepAliveOptions = {
|
4
3
|
pingKeepAlive: number;
|
@@ -9,17 +8,28 @@ type CreateKeepAliveManagerOptions = {
|
|
9
8
|
libp2p: Libp2p;
|
10
9
|
relay?: IRelay;
|
11
10
|
};
|
12
|
-
|
11
|
+
interface IKeepAliveManager {
|
12
|
+
start(): void;
|
13
|
+
stop(): void;
|
14
|
+
}
|
15
|
+
export declare class KeepAliveManager implements IKeepAliveManager {
|
13
16
|
private readonly relay?;
|
14
17
|
private readonly libp2p;
|
15
18
|
private readonly options;
|
16
19
|
private pingKeepAliveTimers;
|
17
20
|
private relayKeepAliveTimers;
|
18
21
|
constructor({ options, relay, libp2p }: CreateKeepAliveManagerOptions);
|
19
|
-
start(
|
20
|
-
stop(
|
21
|
-
|
22
|
-
|
23
|
-
private
|
22
|
+
start(): void;
|
23
|
+
stop(): void;
|
24
|
+
private onPeerConnect;
|
25
|
+
private onPeerDisconnect;
|
26
|
+
private startPingForPeer;
|
27
|
+
private stopPingForPeer;
|
28
|
+
private startLibp2pPing;
|
29
|
+
private stopLibp2pPing;
|
30
|
+
private startRelayPing;
|
31
|
+
private stopRelayPing;
|
32
|
+
private pingRelay;
|
33
|
+
private pingLibp2p;
|
24
34
|
}
|
25
35
|
export {};
|
@@ -13,100 +13,136 @@ export class KeepAliveManager {
|
|
13
13
|
this.options = options;
|
14
14
|
this.relay = relay;
|
15
15
|
this.libp2p = libp2p;
|
16
|
+
this.onPeerConnect = this.onPeerConnect.bind(this);
|
17
|
+
this.onPeerDisconnect = this.onPeerDisconnect.bind(this);
|
16
18
|
}
|
17
|
-
start(
|
18
|
-
|
19
|
-
this.
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
void (async () => {
|
27
|
-
let ping;
|
28
|
-
try {
|
29
|
-
// ping the peer for keep alive
|
30
|
-
// also update the peer store with the latency
|
31
|
-
try {
|
32
|
-
ping = await this.libp2p.services.ping.ping(peerId);
|
33
|
-
log.info(`Ping succeeded (${peerIdStr})`, ping);
|
34
|
-
}
|
35
|
-
catch (error) {
|
36
|
-
log.error(`Ping failed for peer (${peerIdStr}).
|
37
|
-
Next ping will be attempted in ${pingPeriodSecs} seconds.
|
38
|
-
`);
|
39
|
-
return;
|
40
|
-
}
|
41
|
-
try {
|
42
|
-
await this.libp2p.peerStore.merge(peerId, {
|
43
|
-
metadata: {
|
44
|
-
ping: utf8ToBytes(ping.toString())
|
45
|
-
}
|
46
|
-
});
|
47
|
-
}
|
48
|
-
catch (e) {
|
49
|
-
log.error("Failed to update ping", e);
|
50
|
-
}
|
51
|
-
}
|
52
|
-
catch (e) {
|
53
|
-
log.error(`Ping failed (${peerIdStr})`, e);
|
54
|
-
}
|
55
|
-
})();
|
56
|
-
}, pingPeriodSecs * 1000);
|
57
|
-
this.pingKeepAliveTimers.set(peerIdStr, interval);
|
19
|
+
start() {
|
20
|
+
this.libp2p.addEventListener("peer:connect", this.onPeerConnect);
|
21
|
+
this.libp2p.addEventListener("peer:disconnect", this.onPeerDisconnect);
|
22
|
+
}
|
23
|
+
stop() {
|
24
|
+
this.libp2p.removeEventListener("peer:connect", this.onPeerConnect);
|
25
|
+
this.libp2p.removeEventListener("peer:disconnect", this.onPeerDisconnect);
|
26
|
+
for (const timer of this.pingKeepAliveTimers.values()) {
|
27
|
+
clearInterval(timer);
|
58
28
|
}
|
59
|
-
const
|
60
|
-
|
61
|
-
|
62
|
-
|
29
|
+
for (const timerArray of this.relayKeepAliveTimers.values()) {
|
30
|
+
for (const timer of timerArray) {
|
31
|
+
clearInterval(timer);
|
32
|
+
}
|
63
33
|
}
|
34
|
+
this.pingKeepAliveTimers.clear();
|
35
|
+
this.relayKeepAliveTimers.clear();
|
36
|
+
}
|
37
|
+
onPeerConnect(evt) {
|
38
|
+
const peerId = evt.detail;
|
39
|
+
this.startPingForPeer(peerId);
|
40
|
+
}
|
41
|
+
onPeerDisconnect(evt) {
|
42
|
+
const peerId = evt.detail;
|
43
|
+
this.stopPingForPeer(peerId);
|
64
44
|
}
|
65
|
-
|
45
|
+
startPingForPeer(peerId) {
|
46
|
+
// Just in case a timer already exists for this peer
|
47
|
+
this.stopPingForPeer(peerId);
|
48
|
+
this.startLibp2pPing(peerId);
|
49
|
+
this.startRelayPing(peerId);
|
50
|
+
}
|
51
|
+
stopPingForPeer(peerId) {
|
52
|
+
this.stopLibp2pPing(peerId);
|
53
|
+
this.stopRelayPing(peerId);
|
54
|
+
}
|
55
|
+
startLibp2pPing(peerId) {
|
56
|
+
if (this.options.pingKeepAlive === 0) {
|
57
|
+
log.warn(`Ping keep alive is disabled pingKeepAlive:${this.options.pingKeepAlive}, skipping start for libp2p ping`);
|
58
|
+
return;
|
59
|
+
}
|
66
60
|
const peerIdStr = peerId.toString();
|
67
61
|
if (this.pingKeepAliveTimers.has(peerIdStr)) {
|
68
|
-
|
69
|
-
|
70
|
-
}
|
71
|
-
if (this.relayKeepAliveTimers.has(peerId)) {
|
72
|
-
this.relayKeepAliveTimers.get(peerId)?.map(clearInterval);
|
73
|
-
this.relayKeepAliveTimers.delete(peerId);
|
62
|
+
log.warn(`Ping already started for peer: ${peerIdStr}, skipping start for libp2p ping`);
|
63
|
+
return;
|
74
64
|
}
|
65
|
+
const interval = setInterval(() => {
|
66
|
+
void this.pingLibp2p(peerId);
|
67
|
+
}, this.options.pingKeepAlive * 1000);
|
68
|
+
this.pingKeepAliveTimers.set(peerIdStr, interval);
|
75
69
|
}
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
clearInterval(timer);
|
70
|
+
stopLibp2pPing(peerId) {
|
71
|
+
const peerIdStr = peerId.toString();
|
72
|
+
if (!this.pingKeepAliveTimers.has(peerIdStr)) {
|
73
|
+
log.warn(`Ping not started for peer: ${peerIdStr}, skipping stop for ping`);
|
74
|
+
return;
|
82
75
|
}
|
83
|
-
this.pingKeepAliveTimers.
|
84
|
-
this.
|
85
|
-
}
|
86
|
-
connectionsExist() {
|
87
|
-
return (this.pingKeepAliveTimers.size > 0 || this.relayKeepAliveTimers.size > 0);
|
76
|
+
clearInterval(this.pingKeepAliveTimers.get(peerIdStr));
|
77
|
+
this.pingKeepAliveTimers.delete(peerIdStr);
|
88
78
|
}
|
89
|
-
|
90
|
-
|
79
|
+
startRelayPing(peerId) {
|
80
|
+
if (!this.relay) {
|
81
|
+
return;
|
82
|
+
}
|
83
|
+
if (this.options.relayKeepAlive === 0) {
|
84
|
+
log.warn(`Relay keep alive is disabled relayKeepAlive:${this.options.relayKeepAlive}, skipping start for relay ping`);
|
85
|
+
return;
|
86
|
+
}
|
87
|
+
if (this.relayKeepAliveTimers.has(peerId.toString())) {
|
88
|
+
log.warn(`Relay ping already started for peer: ${peerId.toString()}, skipping start for relay ping`);
|
89
|
+
return;
|
90
|
+
}
|
91
91
|
const intervals = [];
|
92
|
-
for (const topic of relay.pubsubTopics) {
|
93
|
-
const meshPeers = relay.getMeshPeers(topic);
|
94
|
-
if (!meshPeers.includes(
|
92
|
+
for (const topic of this.relay.pubsubTopics) {
|
93
|
+
const meshPeers = this.relay.getMeshPeers(topic);
|
94
|
+
if (!meshPeers.includes(peerId.toString())) {
|
95
|
+
log.warn(`Peer: ${peerId.toString()} is not in the mesh for topic: ${topic}, skipping start for relay ping`);
|
95
96
|
continue;
|
97
|
+
}
|
96
98
|
const encoder = createEncoder({
|
97
99
|
pubsubTopicShardInfo: pubsubTopicToSingleShardInfo(topic),
|
98
100
|
contentTopic: RelayPingContentTopic,
|
99
101
|
ephemeral: true
|
100
102
|
});
|
101
103
|
const interval = setInterval(() => {
|
102
|
-
|
103
|
-
|
104
|
-
.send(encoder, { payload: new Uint8Array([1]) })
|
105
|
-
.catch((e) => log.error("Failed to send relay ping", e));
|
106
|
-
}, relayPeriodSecs * 1000);
|
104
|
+
void this.pingRelay(encoder);
|
105
|
+
}, this.options.relayKeepAlive * 1000);
|
107
106
|
intervals.push(interval);
|
108
107
|
}
|
109
|
-
|
108
|
+
this.relayKeepAliveTimers.set(peerId.toString(), intervals);
|
109
|
+
}
|
110
|
+
stopRelayPing(peerId) {
|
111
|
+
if (!this.relay) {
|
112
|
+
return;
|
113
|
+
}
|
114
|
+
const peerIdStr = peerId.toString();
|
115
|
+
if (!this.relayKeepAliveTimers.has(peerIdStr)) {
|
116
|
+
log.warn(`Relay ping not started for peer: ${peerIdStr}, skipping stop for relay ping`);
|
117
|
+
return;
|
118
|
+
}
|
119
|
+
this.relayKeepAliveTimers.get(peerIdStr)?.map(clearInterval);
|
120
|
+
this.relayKeepAliveTimers.delete(peerIdStr);
|
121
|
+
}
|
122
|
+
async pingRelay(encoder) {
|
123
|
+
try {
|
124
|
+
log.info("Sending Waku Relay ping message");
|
125
|
+
await this.relay.send(encoder, { payload: new Uint8Array([1]) });
|
126
|
+
}
|
127
|
+
catch (e) {
|
128
|
+
log.error("Failed to send relay ping", e);
|
129
|
+
}
|
130
|
+
}
|
131
|
+
async pingLibp2p(peerId) {
|
132
|
+
try {
|
133
|
+
log.info(`Pinging libp2p peer (${peerId.toString()})`);
|
134
|
+
const ping = await this.libp2p.services.ping.ping(peerId);
|
135
|
+
log.info(`Ping succeeded (${peerId.toString()})`, ping);
|
136
|
+
await this.libp2p.peerStore.merge(peerId, {
|
137
|
+
metadata: {
|
138
|
+
ping: utf8ToBytes(ping.toString())
|
139
|
+
}
|
140
|
+
});
|
141
|
+
log.info(`Ping updated for peer (${peerId.toString()})`);
|
142
|
+
}
|
143
|
+
catch (e) {
|
144
|
+
log.error(`Ping failed for peer (${peerId.toString()})`, e);
|
145
|
+
}
|
110
146
|
}
|
111
147
|
}
|
112
148
|
//# sourceMappingURL=keep_alive_manager.js.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"keep_alive_manager.js","sourceRoot":"","sources":["../../../src/lib/connection_manager/keep_alive_manager.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,4BAA4B,EAAE,MAAM,aAAa,CAAC;AACnE,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAExD,MAAM,qBAAqB,GAAG,yBAAyB,CAAC;AACxD,MAAM,GAAG,GAAG,IAAI,MAAM,CAAC,YAAY,CAAC,CAAC;
|
1
|
+
{"version":3,"file":"keep_alive_manager.js","sourceRoot":"","sources":["../../../src/lib/connection_manager/keep_alive_manager.ts"],"names":[],"mappings":"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"}
|
@@ -0,0 +1,22 @@
|
|
1
|
+
import { IWakuEventEmitter, Libp2p } from "@waku/interfaces";
|
2
|
+
type NetworkMonitorConstructorOptions = {
|
3
|
+
libp2p: Libp2p;
|
4
|
+
events: IWakuEventEmitter;
|
5
|
+
};
|
6
|
+
interface INetworkMonitor {
|
7
|
+
start(): void;
|
8
|
+
stop(): void;
|
9
|
+
}
|
10
|
+
export declare class NetworkMonitor implements INetworkMonitor {
|
11
|
+
private readonly libp2p;
|
12
|
+
private readonly events;
|
13
|
+
private isNetworkConnected;
|
14
|
+
constructor(options: NetworkMonitorConstructorOptions);
|
15
|
+
start(): void;
|
16
|
+
stop(): void;
|
17
|
+
isConnected(): boolean;
|
18
|
+
private onConnectedEvent;
|
19
|
+
private onDisconnectedEvent;
|
20
|
+
private dispatchNetworkEvent;
|
21
|
+
}
|
22
|
+
export {};
|
@@ -0,0 +1,63 @@
|
|
1
|
+
export class NetworkMonitor {
|
2
|
+
libp2p;
|
3
|
+
events;
|
4
|
+
isNetworkConnected = false;
|
5
|
+
constructor(options) {
|
6
|
+
this.libp2p = options.libp2p;
|
7
|
+
this.events = options.events;
|
8
|
+
this.onConnectedEvent = this.onConnectedEvent.bind(this);
|
9
|
+
this.onDisconnectedEvent = this.onDisconnectedEvent.bind(this);
|
10
|
+
this.dispatchNetworkEvent = this.dispatchNetworkEvent.bind(this);
|
11
|
+
}
|
12
|
+
start() {
|
13
|
+
this.libp2p.addEventListener("peer:connect", this.onConnectedEvent);
|
14
|
+
this.libp2p.addEventListener("peer:disconnect", this.onDisconnectedEvent);
|
15
|
+
try {
|
16
|
+
globalThis.addEventListener("online", this.dispatchNetworkEvent);
|
17
|
+
globalThis.addEventListener("offline", this.dispatchNetworkEvent);
|
18
|
+
}
|
19
|
+
catch (err) {
|
20
|
+
// ignore
|
21
|
+
}
|
22
|
+
}
|
23
|
+
stop() {
|
24
|
+
this.libp2p.removeEventListener("peer:connect", this.onConnectedEvent);
|
25
|
+
this.libp2p.removeEventListener("peer:disconnect", this.onDisconnectedEvent);
|
26
|
+
try {
|
27
|
+
globalThis.removeEventListener("online", this.dispatchNetworkEvent);
|
28
|
+
globalThis.removeEventListener("offline", this.dispatchNetworkEvent);
|
29
|
+
}
|
30
|
+
catch (err) {
|
31
|
+
// ignore
|
32
|
+
}
|
33
|
+
}
|
34
|
+
isConnected() {
|
35
|
+
try {
|
36
|
+
if (globalThis?.navigator && !globalThis?.navigator?.onLine) {
|
37
|
+
return false;
|
38
|
+
}
|
39
|
+
}
|
40
|
+
catch (err) {
|
41
|
+
// ignore
|
42
|
+
}
|
43
|
+
return this.isNetworkConnected;
|
44
|
+
}
|
45
|
+
onConnectedEvent() {
|
46
|
+
if (!this.isNetworkConnected) {
|
47
|
+
this.isNetworkConnected = true;
|
48
|
+
this.dispatchNetworkEvent();
|
49
|
+
}
|
50
|
+
}
|
51
|
+
onDisconnectedEvent() {
|
52
|
+
if (this.isNetworkConnected && this.libp2p.getConnections().length === 0) {
|
53
|
+
this.isNetworkConnected = false;
|
54
|
+
this.dispatchNetworkEvent();
|
55
|
+
}
|
56
|
+
}
|
57
|
+
dispatchNetworkEvent() {
|
58
|
+
this.events.dispatchEvent(new CustomEvent("waku:connection", {
|
59
|
+
detail: this.isConnected()
|
60
|
+
}));
|
61
|
+
}
|
62
|
+
}
|
63
|
+
//# sourceMappingURL=network_monitor.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"network_monitor.js","sourceRoot":"","sources":["../../../src/lib/connection_manager/network_monitor.ts"],"names":[],"mappings":"AAYA,MAAM,OAAO,cAAc;IACR,MAAM,CAAS;IACf,MAAM,CAAoB;IAEnC,kBAAkB,GAAY,KAAK,CAAC;IAE5C,YAAmB,OAAyC;QAC1D,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;QAC7B,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;QAE7B,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzD,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/D,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnE,CAAC;IAEM,KAAK;QACV,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,cAAc,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;QACpE,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,iBAAiB,EAAE,IAAI,CAAC,mBAAmB,CAAC,CAAC;QAE1E,IAAI,CAAC;YACH,UAAU,CAAC,gBAAgB,CAAC,QAAQ,EAAE,IAAI,CAAC,oBAAoB,CAAC,CAAC;YACjE,UAAU,CAAC,gBAAgB,CAAC,SAAS,EAAE,IAAI,CAAC,oBAAoB,CAAC,CAAC;QACpE,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,SAAS;QACX,CAAC;IACH,CAAC;IAEM,IAAI;QACT,IAAI,CAAC,MAAM,CAAC,mBAAmB,CAAC,cAAc,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;QACvE,IAAI,CAAC,MAAM,CAAC,mBAAmB,CAC7B,iBAAiB,EACjB,IAAI,CAAC,mBAAmB,CACzB,CAAC;QAEF,IAAI,CAAC;YACH,UAAU,CAAC,mBAAmB,CAAC,QAAQ,EAAE,IAAI,CAAC,oBAAoB,CAAC,CAAC;YACpE,UAAU,CAAC,mBAAmB,CAAC,SAAS,EAAE,IAAI,CAAC,oBAAoB,CAAC,CAAC;QACvE,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,SAAS;QACX,CAAC;IACH,CAAC;IAEM,WAAW;QAChB,IAAI,CAAC;YACH,IAAI,UAAU,EAAE,SAAS,IAAI,CAAC,UAAU,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC;gBAC5D,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,SAAS;QACX,CAAC;QAED,OAAO,IAAI,CAAC,kBAAkB,CAAC;IACjC,CAAC;IAEO,gBAAgB;QACtB,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC7B,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;YAC/B,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAC9B,CAAC;IACH,CAAC;IAEO,mBAAmB;QACzB,IAAI,IAAI,CAAC,kBAAkB,IAAI,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzE,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC;YAChC,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAC9B,CAAC;IACH,CAAC;IAEO,oBAAoB;QAC1B,IAAI,CAAC,MAAM,CAAC,aAAa,CACvB,IAAI,WAAW,CAAU,iBAAiB,EAAE;YAC1C,MAAM,EAAE,IAAI,CAAC,WAAW,EAAE;SAC3B,CAAC,CACH,CAAC;IACJ,CAAC;CACF"}
|
@@ -0,0 +1,28 @@
|
|
1
|
+
import type { PeerId } from "@libp2p/interface";
|
2
|
+
import type { NetworkConfig, PubsubTopic, SingleShardInfo } from "@waku/interfaces";
|
3
|
+
import { Libp2p } from "libp2p";
|
4
|
+
type ShardReaderConstructorOptions = {
|
5
|
+
libp2p: Libp2p;
|
6
|
+
networkConfig: NetworkConfig;
|
7
|
+
};
|
8
|
+
interface IShardReader {
|
9
|
+
hasShardInfo(id: PeerId): Promise<boolean>;
|
10
|
+
isPeerOnNetwork(id: PeerId): Promise<boolean>;
|
11
|
+
isPeerOnShard(id: PeerId, shard: SingleShardInfo): Promise<boolean>;
|
12
|
+
isPeerOnTopic(id: PeerId, pubsubTopic: PubsubTopic): Promise<boolean>;
|
13
|
+
}
|
14
|
+
/**
|
15
|
+
* This class is responsible for reading the shard info from the libp2p peer store or from the current node's network config.
|
16
|
+
*/
|
17
|
+
export declare class ShardReader implements IShardReader {
|
18
|
+
private readonly libp2p;
|
19
|
+
private readonly staticShard;
|
20
|
+
constructor(options: ShardReaderConstructorOptions);
|
21
|
+
isPeerOnNetwork(id: PeerId): Promise<boolean>;
|
22
|
+
hasShardInfo(id: PeerId): Promise<boolean>;
|
23
|
+
isPeerOnTopic(id: PeerId, pubsubTopic: PubsubTopic): Promise<boolean>;
|
24
|
+
isPeerOnShard(id: PeerId, shard: SingleShardInfo): Promise<boolean>;
|
25
|
+
private getShardInfo;
|
26
|
+
private getStaticShardFromNetworkConfig;
|
27
|
+
}
|
28
|
+
export {};
|
@@ -0,0 +1,70 @@
|
|
1
|
+
import { contentTopicToShardIndex, decodeRelayShard, Logger, pubsubTopicToSingleShardInfo } from "@waku/utils";
|
2
|
+
const log = new Logger("shard-reader");
|
3
|
+
/**
|
4
|
+
* This class is responsible for reading the shard info from the libp2p peer store or from the current node's network config.
|
5
|
+
*/
|
6
|
+
export class ShardReader {
|
7
|
+
libp2p;
|
8
|
+
staticShard;
|
9
|
+
constructor(options) {
|
10
|
+
this.libp2p = options.libp2p;
|
11
|
+
this.staticShard = this.getStaticShardFromNetworkConfig(options.networkConfig);
|
12
|
+
}
|
13
|
+
async isPeerOnNetwork(id) {
|
14
|
+
const shardInfo = await this.getShardInfo(id);
|
15
|
+
if (!shardInfo) {
|
16
|
+
return false;
|
17
|
+
}
|
18
|
+
const clusterMatch = shardInfo.clusterId === this.staticShard.clusterId;
|
19
|
+
const shardOverlap = this.staticShard.shards.some((s) => shardInfo.shards.includes(s));
|
20
|
+
return clusterMatch && shardOverlap;
|
21
|
+
}
|
22
|
+
async hasShardInfo(id) {
|
23
|
+
const shardInfo = await this.getShardInfo(id);
|
24
|
+
return !!shardInfo;
|
25
|
+
}
|
26
|
+
async isPeerOnTopic(id, pubsubTopic) {
|
27
|
+
try {
|
28
|
+
const shardInfo = pubsubTopicToSingleShardInfo(pubsubTopic);
|
29
|
+
return await this.isPeerOnShard(id, shardInfo);
|
30
|
+
}
|
31
|
+
catch (error) {
|
32
|
+
log.error(`Error comparing pubsub topic ${pubsubTopic} with shard info for ${id}`, error);
|
33
|
+
return false;
|
34
|
+
}
|
35
|
+
}
|
36
|
+
async isPeerOnShard(id, shard) {
|
37
|
+
const peerShardInfo = await this.getShardInfo(id);
|
38
|
+
if (!peerShardInfo || shard.shard === undefined) {
|
39
|
+
return false;
|
40
|
+
}
|
41
|
+
return (peerShardInfo.clusterId === shard.clusterId &&
|
42
|
+
peerShardInfo.shards.includes(shard.shard));
|
43
|
+
}
|
44
|
+
async getShardInfo(id) {
|
45
|
+
try {
|
46
|
+
const peer = await this.libp2p.peerStore.get(id);
|
47
|
+
const shardInfoBytes = peer.metadata.get("shardInfo");
|
48
|
+
if (!shardInfoBytes) {
|
49
|
+
return undefined;
|
50
|
+
}
|
51
|
+
const decodedShardInfo = decodeRelayShard(shardInfoBytes);
|
52
|
+
return decodedShardInfo;
|
53
|
+
}
|
54
|
+
catch (error) {
|
55
|
+
log.error(`Error getting shard info for ${id}`, error);
|
56
|
+
return undefined;
|
57
|
+
}
|
58
|
+
}
|
59
|
+
getStaticShardFromNetworkConfig(networkConfig) {
|
60
|
+
if ("shards" in networkConfig) {
|
61
|
+
return networkConfig;
|
62
|
+
}
|
63
|
+
const shards = networkConfig.contentTopics.map((topic) => contentTopicToShardIndex(topic));
|
64
|
+
return {
|
65
|
+
clusterId: networkConfig.clusterId,
|
66
|
+
shards
|
67
|
+
};
|
68
|
+
}
|
69
|
+
}
|
70
|
+
//# sourceMappingURL=shard_reader.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"shard_reader.js","sourceRoot":"","sources":["../../../src/lib/connection_manager/shard_reader.ts"],"names":[],"mappings":"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"}
|
@@ -1,7 +1,22 @@
|
|
1
|
-
import type
|
1
|
+
import { type Peer, type PeerId } from "@libp2p/interface";
|
2
|
+
import { Multiaddr, MultiaddrInput } from "@multiformats/multiaddr";
|
2
3
|
/**
|
3
4
|
* Reads peer's metadata and retrieves ping value.
|
4
5
|
* @param peer Peer or null
|
5
6
|
* @returns -1 if no ping attached, otherwise returns ping value
|
6
7
|
*/
|
7
8
|
export declare const getPeerPing: (peer: Peer | null) => number;
|
9
|
+
/**
|
10
|
+
* Maps a PeerId or MultiaddrInput to a PeerId or Multiaddr.
|
11
|
+
* @param input - The PeerId or MultiaddrInput to map.
|
12
|
+
* @returns The PeerId or Multiaddr.
|
13
|
+
* @throws {Error} If the input is not a valid PeerId or MultiaddrInput.
|
14
|
+
*/
|
15
|
+
export declare const mapToPeerIdOrMultiaddr: (input: PeerId | MultiaddrInput) => PeerId | Multiaddr;
|
16
|
+
/**
|
17
|
+
* Maps a PeerId or MultiaddrInput to a PeerId.
|
18
|
+
* @param input - The PeerId or MultiaddrInput to map.
|
19
|
+
* @returns The PeerId.
|
20
|
+
* @throws {Error} If the input is not a valid PeerId or MultiaddrInput.
|
21
|
+
*/
|
22
|
+
export declare const mapToPeerId: (input: PeerId | MultiaddrInput) => PeerId;
|