@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.
Files changed (79) hide show
  1. package/CHANGELOG.md +39 -0
  2. package/bundle/index.js +5647 -1359
  3. package/bundle/lib/message/version_0.js +1 -2
  4. package/bundle/{version_0-CiYGrPc2.js → version_0-Bc0h7ah2.js} +1886 -31
  5. package/dist/.tsbuildinfo +1 -1
  6. package/dist/index.d.ts +1 -0
  7. package/dist/index.js +1 -0
  8. package/dist/index.js.map +1 -1
  9. package/dist/lib/connection_manager/connection_limiter.d.ts +35 -0
  10. package/dist/lib/connection_manager/connection_limiter.js +103 -0
  11. package/dist/lib/connection_manager/connection_limiter.js.map +1 -0
  12. package/dist/lib/connection_manager/connection_manager.d.ts +19 -104
  13. package/dist/lib/connection_manager/connection_manager.js +64 -499
  14. package/dist/lib/connection_manager/connection_manager.js.map +1 -1
  15. package/dist/lib/connection_manager/discovery_dialer.d.ts +32 -0
  16. package/dist/lib/connection_manager/discovery_dialer.js +131 -0
  17. package/dist/lib/connection_manager/discovery_dialer.js.map +1 -0
  18. package/dist/lib/connection_manager/keep_alive_manager.d.ts +17 -7
  19. package/dist/lib/connection_manager/keep_alive_manager.js +110 -74
  20. package/dist/lib/connection_manager/keep_alive_manager.js.map +1 -1
  21. package/dist/lib/connection_manager/network_monitor.d.ts +22 -0
  22. package/dist/lib/connection_manager/network_monitor.js +63 -0
  23. package/dist/lib/connection_manager/network_monitor.js.map +1 -0
  24. package/dist/lib/connection_manager/shard_reader.d.ts +28 -0
  25. package/dist/lib/connection_manager/shard_reader.js +70 -0
  26. package/dist/lib/connection_manager/shard_reader.js.map +1 -0
  27. package/dist/lib/connection_manager/utils.d.ts +16 -1
  28. package/dist/lib/connection_manager/utils.js +23 -0
  29. package/dist/lib/connection_manager/utils.js.map +1 -1
  30. package/dist/lib/filter/filter.d.ts +7 -5
  31. package/dist/lib/filter/filter.js +14 -11
  32. package/dist/lib/filter/filter.js.map +1 -1
  33. package/dist/lib/light_push/light_push.d.ts +5 -5
  34. package/dist/lib/light_push/light_push.js +7 -7
  35. package/dist/lib/light_push/light_push.js.map +1 -1
  36. package/dist/lib/message/version_0.d.ts +3 -4
  37. package/dist/lib/message/version_0.js +1 -4
  38. package/dist/lib/message/version_0.js.map +1 -1
  39. package/dist/lib/message_hash/index.d.ts +1 -0
  40. package/dist/lib/message_hash/index.js +2 -0
  41. package/dist/lib/message_hash/index.js.map +1 -0
  42. package/dist/lib/message_hash/message_hash.d.ts +52 -0
  43. package/dist/lib/message_hash/message_hash.js +84 -0
  44. package/dist/lib/message_hash/message_hash.js.map +1 -0
  45. package/dist/lib/metadata/metadata.js +6 -4
  46. package/dist/lib/metadata/metadata.js.map +1 -1
  47. package/dist/lib/store/rpc.js +16 -10
  48. package/dist/lib/store/rpc.js.map +1 -1
  49. package/dist/lib/store/store.d.ts +5 -5
  50. package/dist/lib/store/store.js +19 -9
  51. package/dist/lib/store/store.js.map +1 -1
  52. package/dist/lib/stream_manager/stream_manager.d.ts +3 -4
  53. package/dist/lib/stream_manager/stream_manager.js +6 -8
  54. package/dist/lib/stream_manager/stream_manager.js.map +1 -1
  55. package/package.json +1 -1
  56. package/src/index.ts +2 -0
  57. package/src/lib/connection_manager/connection_limiter.ts +161 -0
  58. package/src/lib/connection_manager/connection_manager.ts +87 -668
  59. package/src/lib/connection_manager/discovery_dialer.ts +195 -0
  60. package/src/lib/connection_manager/keep_alive_manager.ts +154 -87
  61. package/src/lib/connection_manager/network_monitor.ts +88 -0
  62. package/src/lib/connection_manager/shard_reader.ts +134 -0
  63. package/src/lib/connection_manager/utils.ts +27 -1
  64. package/src/lib/filter/filter.ts +26 -15
  65. package/src/lib/light_push/light_push.ts +9 -10
  66. package/src/lib/message/version_0.ts +3 -7
  67. package/src/lib/message_hash/index.ts +1 -0
  68. package/src/lib/message_hash/message_hash.ts +106 -0
  69. package/src/lib/metadata/metadata.ts +8 -5
  70. package/src/lib/store/rpc.ts +23 -19
  71. package/src/lib/store/store.ts +22 -11
  72. package/src/lib/stream_manager/stream_manager.ts +8 -6
  73. package/bundle/base_protocol-DvQrudwy.js +0 -152
  74. package/bundle/index-CTo1my9M.js +0 -1543
  75. package/bundle/lib/base_protocol.js +0 -2
  76. package/dist/lib/base_protocol.d.ts +0 -18
  77. package/dist/lib/base_protocol.js +0 -25
  78. package/dist/lib/base_protocol.js.map +0 -1
  79. 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":"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"}
@@ -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
- export declare class KeepAliveManager {
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(peerId: PeerId): void;
20
- stop(peerId: PeerId): void;
21
- stopAll(): void;
22
- connectionsExist(): boolean;
23
- private scheduleRelayPings;
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(peerId) {
18
- // Just in case a timer already exists for this peer
19
- this.stop(peerId);
20
- const { pingKeepAlive: pingPeriodSecs, relayKeepAlive: relayPeriodSecs } = this.options;
21
- const peerIdStr = peerId.toString();
22
- // Ping the peer every pingPeriodSecs seconds
23
- // if pingPeriodSecs is 0, don't ping the peer
24
- if (pingPeriodSecs !== 0) {
25
- const interval = setInterval(() => {
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 relay = this.relay;
60
- if (relay && relayPeriodSecs !== 0) {
61
- const intervals = this.scheduleRelayPings(relay, relayPeriodSecs, peerId.toString());
62
- this.relayKeepAliveTimers.set(peerId, intervals);
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
- stop(peerId) {
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
- clearInterval(this.pingKeepAliveTimers.get(peerIdStr));
69
- this.pingKeepAliveTimers.delete(peerIdStr);
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
- stopAll() {
77
- for (const timer of [
78
- ...Object.values(this.pingKeepAliveTimers),
79
- ...Object.values(this.relayKeepAliveTimers)
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.clear();
84
- this.relayKeepAliveTimers.clear();
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
- scheduleRelayPings(relay, relayPeriodSecs, peerIdStr) {
90
- // send a ping message to each PubsubTopic the peer is part of
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(peerIdStr))
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
- log.info("Sending Waku Relay ping message");
103
- relay
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
- return intervals;
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":"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"}
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 { Peer } from "@libp2p/interface";
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;