@waku/core 0.0.37-7a9850d.0 → 0.0.37-987c6cd.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/bundle/index.js +4745 -899
- package/bundle/lib/message/version_0.js +1 -1
- package/bundle/{version_0-9DPFjcJG.js → version_0-BpF0pNhc.js} +314 -35
- package/dist/.tsbuildinfo +1 -1
- package/dist/lib/connection_manager/connection_limiter.d.ts +37 -0
- package/dist/lib/connection_manager/connection_limiter.js +124 -0
- package/dist/lib/connection_manager/connection_limiter.js.map +1 -0
- package/dist/lib/connection_manager/connection_manager.d.ts +20 -105
- package/dist/lib/connection_manager/connection_manager.js +83 -508
- package/dist/lib/connection_manager/connection_manager.js.map +1 -1
- package/dist/lib/connection_manager/dialer.d.ts +28 -0
- package/dist/lib/connection_manager/dialer.js +100 -0
- package/dist/lib/connection_manager/dialer.js.map +1 -0
- package/dist/lib/connection_manager/discovery_dialer.d.ts +26 -0
- package/dist/lib/connection_manager/discovery_dialer.js +68 -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 +36 -0
- package/dist/lib/connection_manager/network_monitor.js +81 -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 +2 -3
- package/dist/lib/filter/filter.js +5 -25
- package/dist/lib/filter/filter.js.map +1 -1
- package/dist/lib/light_push/light_push.d.ts +2 -3
- package/dist/lib/light_push/light_push.js +1 -3
- package/dist/lib/light_push/light_push.js.map +1 -1
- package/package.json +1 -1
- package/src/lib/connection_manager/connection_limiter.ts +201 -0
- package/src/lib/connection_manager/connection_manager.ts +104 -669
- package/src/lib/connection_manager/dialer.ts +139 -0
- package/src/lib/connection_manager/discovery_dialer.ts +106 -0
- package/src/lib/connection_manager/keep_alive_manager.ts +154 -87
- package/src/lib/connection_manager/network_monitor.ts +112 -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 +3 -28
- package/src/lib/light_push/light_push.ts +1 -5
@@ -0,0 +1,28 @@
|
|
1
|
+
import type { PeerId } from "@libp2p/interface";
|
2
|
+
import { Libp2p } from "@waku/interfaces";
|
3
|
+
import { ShardReader } from "./shard_reader.js";
|
4
|
+
type DialerConstructorOptions = {
|
5
|
+
libp2p: Libp2p;
|
6
|
+
shardReader: ShardReader;
|
7
|
+
};
|
8
|
+
interface IDialer {
|
9
|
+
start(): void;
|
10
|
+
stop(): void;
|
11
|
+
dial(peerId: PeerId): Promise<void>;
|
12
|
+
}
|
13
|
+
export declare class Dialer implements IDialer {
|
14
|
+
private readonly libp2p;
|
15
|
+
private readonly shardReader;
|
16
|
+
private dialingQueue;
|
17
|
+
private dialHistory;
|
18
|
+
private dialingInterval;
|
19
|
+
private isProcessing;
|
20
|
+
constructor(options: DialerConstructorOptions);
|
21
|
+
start(): void;
|
22
|
+
stop(): void;
|
23
|
+
dial(peerId: PeerId): Promise<void>;
|
24
|
+
private processQueue;
|
25
|
+
private dialPeer;
|
26
|
+
private shouldSkipPeer;
|
27
|
+
}
|
28
|
+
export {};
|
@@ -0,0 +1,100 @@
|
|
1
|
+
import { Logger } from "@waku/utils";
|
2
|
+
const log = new Logger("dialer");
|
3
|
+
export class Dialer {
|
4
|
+
libp2p;
|
5
|
+
shardReader;
|
6
|
+
dialingQueue = [];
|
7
|
+
dialHistory = new Map();
|
8
|
+
dialingInterval = null;
|
9
|
+
isProcessing = false;
|
10
|
+
constructor(options) {
|
11
|
+
this.libp2p = options.libp2p;
|
12
|
+
this.shardReader = options.shardReader;
|
13
|
+
}
|
14
|
+
start() {
|
15
|
+
if (!this.dialingInterval) {
|
16
|
+
this.dialingInterval = setInterval(() => {
|
17
|
+
void this.processQueue();
|
18
|
+
}, 500);
|
19
|
+
}
|
20
|
+
this.dialHistory.clear();
|
21
|
+
}
|
22
|
+
stop() {
|
23
|
+
if (this.dialingInterval) {
|
24
|
+
clearInterval(this.dialingInterval);
|
25
|
+
this.dialingInterval = null;
|
26
|
+
}
|
27
|
+
this.dialHistory.clear();
|
28
|
+
}
|
29
|
+
async dial(peerId) {
|
30
|
+
const shouldSkip = await this.shouldSkipPeer(peerId);
|
31
|
+
if (shouldSkip) {
|
32
|
+
log.info(`Skipping peer: ${peerId}`);
|
33
|
+
return;
|
34
|
+
}
|
35
|
+
// If queue is empty and we're not currently processing, dial immediately
|
36
|
+
if (this.dialingQueue.length === 0 && !this.isProcessing) {
|
37
|
+
await this.dialPeer(peerId);
|
38
|
+
}
|
39
|
+
else {
|
40
|
+
// Add to queue
|
41
|
+
this.dialingQueue.push(peerId);
|
42
|
+
log.info(`Added peer to dialing queue, queue size: ${this.dialingQueue.length}`);
|
43
|
+
}
|
44
|
+
}
|
45
|
+
async processQueue() {
|
46
|
+
if (this.dialingQueue.length === 0 || this.isProcessing)
|
47
|
+
return;
|
48
|
+
this.isProcessing = true;
|
49
|
+
try {
|
50
|
+
const peersToDial = this.dialingQueue.slice(0, 3);
|
51
|
+
this.dialingQueue = this.dialingQueue.slice(peersToDial.length);
|
52
|
+
log.info(`Processing dial queue: dialing ${peersToDial.length} peers, ${this.dialingQueue.length} remaining in queue`);
|
53
|
+
await Promise.all(peersToDial.map((peerId) => this.dialPeer(peerId)));
|
54
|
+
}
|
55
|
+
finally {
|
56
|
+
this.isProcessing = false;
|
57
|
+
}
|
58
|
+
}
|
59
|
+
async dialPeer(peerId) {
|
60
|
+
try {
|
61
|
+
log.info(`Dialing peer from queue: ${peerId}`);
|
62
|
+
await this.libp2p.dial(peerId);
|
63
|
+
this.dialHistory.set(peerId.toString(), Date.now());
|
64
|
+
log.info(`Successfully dialed peer from queue: ${peerId}`);
|
65
|
+
}
|
66
|
+
catch (error) {
|
67
|
+
log.error(`Error dialing peer ${peerId}`, error);
|
68
|
+
}
|
69
|
+
}
|
70
|
+
async shouldSkipPeer(peerId) {
|
71
|
+
const hasConnection = this.libp2p.getPeers().some((p) => p.equals(peerId));
|
72
|
+
if (hasConnection) {
|
73
|
+
log.info(`Skipping peer ${peerId} - already connected`);
|
74
|
+
return true;
|
75
|
+
}
|
76
|
+
const lastDialed = this.dialHistory.get(peerId.toString());
|
77
|
+
if (lastDialed && Date.now() - lastDialed < 10_000) {
|
78
|
+
log.info(`Skipping peer ${peerId} - already dialed in the last 10 seconds`);
|
79
|
+
return true;
|
80
|
+
}
|
81
|
+
try {
|
82
|
+
const hasShardInfo = await this.shardReader.hasShardInfo(peerId);
|
83
|
+
if (!hasShardInfo) {
|
84
|
+
log.info(`Skipping peer ${peerId} - no shard info`);
|
85
|
+
return false;
|
86
|
+
}
|
87
|
+
const isOnSameShard = await this.shardReader.isPeerOnNetwork(peerId);
|
88
|
+
if (!isOnSameShard) {
|
89
|
+
log.info(`Skipping peer ${peerId} - not on same shard`);
|
90
|
+
return true;
|
91
|
+
}
|
92
|
+
return false;
|
93
|
+
}
|
94
|
+
catch (error) {
|
95
|
+
log.error(`Error checking shard info for peer ${peerId}`, error);
|
96
|
+
return true; // Skip peer when there's an error
|
97
|
+
}
|
98
|
+
}
|
99
|
+
}
|
100
|
+
//# sourceMappingURL=dialer.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"dialer.js","sourceRoot":"","sources":["../../../src/lib/connection_manager/dialer.ts"],"names":[],"mappings":"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"}
|
@@ -0,0 +1,26 @@
|
|
1
|
+
import { Libp2p } from "libp2p";
|
2
|
+
import { Dialer } from "./dialer.js";
|
3
|
+
type DiscoveryDialerConstructorOptions = {
|
4
|
+
libp2p: Libp2p;
|
5
|
+
dialer: Dialer;
|
6
|
+
};
|
7
|
+
interface IDiscoveryDialer {
|
8
|
+
start(): void;
|
9
|
+
stop(): void;
|
10
|
+
}
|
11
|
+
/**
|
12
|
+
* This class is responsible for dialing peers that are discovered by the libp2p node.
|
13
|
+
* Managing limits for the peers is out of scope for this class.
|
14
|
+
* Dialing after discovery is needed to identify the peer and get all other information: metadata, protocols, etc.
|
15
|
+
*/
|
16
|
+
export declare class DiscoveryDialer implements IDiscoveryDialer {
|
17
|
+
private readonly libp2p;
|
18
|
+
private readonly dialer;
|
19
|
+
constructor(options: DiscoveryDialerConstructorOptions);
|
20
|
+
start(): void;
|
21
|
+
stop(): void;
|
22
|
+
private onPeerDiscovery;
|
23
|
+
private updatePeerStore;
|
24
|
+
private getPeer;
|
25
|
+
}
|
26
|
+
export {};
|
@@ -0,0 +1,68 @@
|
|
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
|
+
dialer;
|
11
|
+
constructor(options) {
|
12
|
+
this.libp2p = options.libp2p;
|
13
|
+
this.dialer = options.dialer;
|
14
|
+
this.onPeerDiscovery = this.onPeerDiscovery.bind(this);
|
15
|
+
}
|
16
|
+
start() {
|
17
|
+
this.libp2p.addEventListener("peer:discovery", this.onPeerDiscovery);
|
18
|
+
}
|
19
|
+
stop() {
|
20
|
+
this.libp2p.removeEventListener("peer:discovery", this.onPeerDiscovery);
|
21
|
+
}
|
22
|
+
async onPeerDiscovery(event) {
|
23
|
+
const peerId = event.detail.id;
|
24
|
+
log.info(`Discovered new peer: ${peerId}`);
|
25
|
+
try {
|
26
|
+
await this.updatePeerStore(peerId, event.detail.multiaddrs);
|
27
|
+
await this.dialer.dial(peerId);
|
28
|
+
}
|
29
|
+
catch (error) {
|
30
|
+
log.error(`Error dialing peer ${peerId}`, error);
|
31
|
+
}
|
32
|
+
}
|
33
|
+
async updatePeerStore(peerId, multiaddrs) {
|
34
|
+
try {
|
35
|
+
log.info(`Updating peer store for ${peerId}`);
|
36
|
+
const peer = await this.getPeer(peerId);
|
37
|
+
if (!peer) {
|
38
|
+
log.info(`Peer ${peerId} not found in store, saving`);
|
39
|
+
await this.libp2p.peerStore.save(peerId, {
|
40
|
+
multiaddrs: multiaddrs
|
41
|
+
});
|
42
|
+
return;
|
43
|
+
}
|
44
|
+
const hasSameAddr = multiaddrs.every((addr) => peer.addresses.some((a) => a.multiaddr.equals(addr)));
|
45
|
+
if (hasSameAddr) {
|
46
|
+
log.info(`Peer ${peerId} has same addresses in peer store, skipping`);
|
47
|
+
return;
|
48
|
+
}
|
49
|
+
log.info(`Merging peer ${peerId} addresses in peer store`);
|
50
|
+
await this.libp2p.peerStore.merge(peerId, {
|
51
|
+
multiaddrs: multiaddrs
|
52
|
+
});
|
53
|
+
}
|
54
|
+
catch (error) {
|
55
|
+
log.error(`Error updating peer store for ${peerId}`, error);
|
56
|
+
}
|
57
|
+
}
|
58
|
+
async getPeer(peerId) {
|
59
|
+
try {
|
60
|
+
return await this.libp2p.peerStore.get(peerId);
|
61
|
+
}
|
62
|
+
catch (error) {
|
63
|
+
log.error(`Error getting peer info for ${peerId}`, error);
|
64
|
+
return undefined;
|
65
|
+
}
|
66
|
+
}
|
67
|
+
}
|
68
|
+
//# 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
|
-
|
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,36 @@
|
|
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
|
+
isConnected(): boolean;
|
10
|
+
isP2PConnected(): boolean;
|
11
|
+
isBrowserConnected(): boolean;
|
12
|
+
}
|
13
|
+
export declare class NetworkMonitor implements INetworkMonitor {
|
14
|
+
private readonly libp2p;
|
15
|
+
private readonly events;
|
16
|
+
private isNetworkConnected;
|
17
|
+
constructor(options: NetworkMonitorConstructorOptions);
|
18
|
+
start(): void;
|
19
|
+
stop(): void;
|
20
|
+
/**
|
21
|
+
* Returns true if the node is connected to the network via libp2p and browser.
|
22
|
+
*/
|
23
|
+
isConnected(): boolean;
|
24
|
+
/**
|
25
|
+
* Returns true if the node is connected to the network via libp2p.
|
26
|
+
*/
|
27
|
+
isP2PConnected(): boolean;
|
28
|
+
/**
|
29
|
+
* Returns true if the node is connected to the network via browser.
|
30
|
+
*/
|
31
|
+
isBrowserConnected(): boolean;
|
32
|
+
private onConnectedEvent;
|
33
|
+
private onDisconnectedEvent;
|
34
|
+
private dispatchNetworkEvent;
|
35
|
+
}
|
36
|
+
export {};
|
@@ -0,0 +1,81 @@
|
|
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
|
+
/**
|
35
|
+
* Returns true if the node is connected to the network via libp2p and browser.
|
36
|
+
*/
|
37
|
+
isConnected() {
|
38
|
+
if (!this.isBrowserConnected()) {
|
39
|
+
return false;
|
40
|
+
}
|
41
|
+
return this.isP2PConnected();
|
42
|
+
}
|
43
|
+
/**
|
44
|
+
* Returns true if the node is connected to the network via libp2p.
|
45
|
+
*/
|
46
|
+
isP2PConnected() {
|
47
|
+
return this.isNetworkConnected;
|
48
|
+
}
|
49
|
+
/**
|
50
|
+
* Returns true if the node is connected to the network via browser.
|
51
|
+
*/
|
52
|
+
isBrowserConnected() {
|
53
|
+
try {
|
54
|
+
if (globalThis?.navigator && !globalThis?.navigator?.onLine) {
|
55
|
+
return false;
|
56
|
+
}
|
57
|
+
}
|
58
|
+
catch (err) {
|
59
|
+
// ignore
|
60
|
+
}
|
61
|
+
return true;
|
62
|
+
}
|
63
|
+
onConnectedEvent() {
|
64
|
+
if (!this.isNetworkConnected) {
|
65
|
+
this.isNetworkConnected = true;
|
66
|
+
this.dispatchNetworkEvent();
|
67
|
+
}
|
68
|
+
}
|
69
|
+
onDisconnectedEvent() {
|
70
|
+
if (this.isNetworkConnected && this.libp2p.getConnections().length === 0) {
|
71
|
+
this.isNetworkConnected = false;
|
72
|
+
this.dispatchNetworkEvent();
|
73
|
+
}
|
74
|
+
}
|
75
|
+
dispatchNetworkEvent() {
|
76
|
+
this.events.dispatchEvent(new CustomEvent("waku:connection", {
|
77
|
+
detail: this.isConnected()
|
78
|
+
}));
|
79
|
+
}
|
80
|
+
}
|
81
|
+
//# 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":"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"}
|