@waku/core 0.0.37-2ed5ddc.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 +200 -108
- package/bundle/lib/message/version_0.js +1 -1
- package/bundle/{version_0-Bc0h7ah2.js → version_0-BpF0pNhc.js} +2 -2
- package/dist/.tsbuildinfo +1 -1
- package/dist/lib/connection_manager/connection_limiter.d.ts +10 -8
- package/dist/lib/connection_manager/connection_limiter.js +22 -1
- package/dist/lib/connection_manager/connection_limiter.js.map +1 -1
- package/dist/lib/connection_manager/connection_manager.d.ts +1 -0
- package/dist/lib/connection_manager/connection_manager.js +21 -3
- 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 +3 -9
- package/dist/lib/connection_manager/discovery_dialer.js +7 -70
- package/dist/lib/connection_manager/discovery_dialer.js.map +1 -1
- package/dist/lib/connection_manager/network_monitor.d.ts +14 -0
- package/dist/lib/connection_manager/network_monitor.js +19 -1
- package/dist/lib/connection_manager/network_monitor.js.map +1 -1
- package/package.json +1 -1
- package/src/lib/connection_manager/connection_limiter.ts +50 -10
- package/src/lib/connection_manager/connection_manager.ts +28 -4
- package/src/lib/connection_manager/dialer.ts +139 -0
- package/src/lib/connection_manager/discovery_dialer.ts +9 -98
- package/src/lib/connection_manager/network_monitor.ts +25 -1
@@ -1,5 +1,6 @@
|
|
1
1
|
import { Logger } from "@waku/utils";
|
2
2
|
import { ConnectionLimiter } from "./connection_limiter.js";
|
3
|
+
import { Dialer } from "./dialer.js";
|
3
4
|
import { DiscoveryDialer } from "./discovery_dialer.js";
|
4
5
|
import { KeepAliveManager } from "./keep_alive_manager.js";
|
5
6
|
import { NetworkMonitor } from "./network_monitor.js";
|
@@ -13,6 +14,7 @@ export class ConnectionManager {
|
|
13
14
|
pubsubTopics;
|
14
15
|
keepAliveManager;
|
15
16
|
discoveryDialer;
|
17
|
+
dialer;
|
16
18
|
shardReader;
|
17
19
|
networkMonitor;
|
18
20
|
connectionLimiter;
|
@@ -39,16 +41,23 @@ export class ConnectionManager {
|
|
39
41
|
libp2p: options.libp2p,
|
40
42
|
networkConfig: options.networkConfig
|
41
43
|
});
|
42
|
-
this.
|
44
|
+
this.dialer = new Dialer({
|
43
45
|
libp2p: options.libp2p,
|
44
46
|
shardReader: this.shardReader
|
45
47
|
});
|
48
|
+
this.discoveryDialer = new DiscoveryDialer({
|
49
|
+
libp2p: options.libp2p,
|
50
|
+
dialer: this.dialer
|
51
|
+
});
|
46
52
|
this.networkMonitor = new NetworkMonitor({
|
47
53
|
libp2p: options.libp2p,
|
48
54
|
events: options.events
|
49
55
|
});
|
50
56
|
this.connectionLimiter = new ConnectionLimiter({
|
51
57
|
libp2p: options.libp2p,
|
58
|
+
events: options.events,
|
59
|
+
networkMonitor: this.networkMonitor,
|
60
|
+
dialer: this.dialer,
|
52
61
|
options: this.options
|
53
62
|
});
|
54
63
|
}
|
@@ -69,11 +78,16 @@ export class ConnectionManager {
|
|
69
78
|
}
|
70
79
|
async dial(peer, protocolCodecs) {
|
71
80
|
const ma = mapToPeerIdOrMultiaddr(peer);
|
72
|
-
|
81
|
+
log.info(`Dialing peer ${ma.toString()} with protocols ${protocolCodecs}`);
|
82
|
+
// must use libp2p directly instead of dialer because we need to dial the peer right away
|
83
|
+
const stream = await this.libp2p.dialProtocol(ma, protocolCodecs);
|
84
|
+
log.info(`Dialed peer ${ma.toString()} with protocols ${protocolCodecs}`);
|
85
|
+
return stream;
|
73
86
|
}
|
74
87
|
async hangUp(peer) {
|
75
88
|
const peerId = mapToPeerId(peer);
|
76
89
|
try {
|
90
|
+
log.info(`Dropping connection with peer ${peerId.toString()}`);
|
77
91
|
await this.libp2p.hangUp(peerId);
|
78
92
|
log.info(`Dropped connection with peer ${peerId.toString()}`);
|
79
93
|
return true;
|
@@ -85,7 +99,9 @@ export class ConnectionManager {
|
|
85
99
|
}
|
86
100
|
async getConnectedPeers(codec) {
|
87
101
|
const peerIDs = this.libp2p.getPeers();
|
102
|
+
log.info(`Getting connected peers for codec ${codec}`);
|
88
103
|
if (peerIDs.length === 0) {
|
104
|
+
log.info(`No connected peers`);
|
89
105
|
return [];
|
90
106
|
}
|
91
107
|
const peers = await Promise.all(peerIDs.map(async (id) => {
|
@@ -96,10 +112,12 @@ export class ConnectionManager {
|
|
96
112
|
return null;
|
97
113
|
}
|
98
114
|
}));
|
99
|
-
|
115
|
+
const result = peers
|
100
116
|
.filter((p) => !!p)
|
101
117
|
.filter((p) => (codec ? p.protocols.includes(codec) : true))
|
102
118
|
.sort((left, right) => getPeerPing(left) - getPeerPing(right));
|
119
|
+
log.info(`Found ${result.length} connected peers for codec ${codec}`);
|
120
|
+
return result;
|
103
121
|
}
|
104
122
|
isTopicConfigured(pubsubTopic) {
|
105
123
|
return this.pubsubTopics.includes(pubsubTopic);
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"connection_manager.js","sourceRoot":"","sources":["../../../src/lib/connection_manager/connection_manager.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAE9E,MAAM,GAAG,GAAG,IAAI,MAAM,CAAC,oBAAoB,CAAC,CAAC;AAE7C,MAAM,mCAAmC,GAAG,CAAC,CAAC;AAC9C,MAAM,2BAA2B,GAAG,CAAC,GAAG,EAAE,CAAC;AAC3C,MAAM,4BAA4B,GAAG,CAAC,GAAG,EAAE,CAAC;AAW5C,MAAM,OAAO,iBAAiB;IACX,YAAY,CAAgB;IAE5B,gBAAgB,CAAmB;IACnC,eAAe,CAAkB;IACjC,WAAW,CAAc;IACzB,cAAc,CAAiB;IAC/B,iBAAiB,CAAoB;IAE9C,OAAO,CAA2B;IAClC,MAAM,CAAS;IAEvB,YAAmB,OAA4C;QAC7D,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;QAC7B,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC;QAEzC,IAAI,CAAC,OAAO,GAAG;YACb,iBAAiB,EAAE,mCAAmC;YACtD,aAAa,EAAE,2BAA2B;YAC1C,cAAc,EAAE,4BAA4B;YAC5C,GAAG,OAAO,CAAC,MAAM;SAClB,CAAC;QAEF,IAAI,CAAC,gBAAgB,GAAG,IAAI,gBAAgB,CAAC;YAC3C,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,OAAO,EAAE;gBACP,aAAa,EAAE,IAAI,CAAC,OAAO,CAAC,aAAa;gBACzC,cAAc,EAAE,IAAI,CAAC,OAAO,CAAC,cAAc;aAC5C;SACF,CAAC,CAAC;QAEH,IAAI,CAAC,WAAW,GAAG,IAAI,WAAW,CAAC;YACjC,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,aAAa,EAAE,OAAO,CAAC,aAAa;SACrC,CAAC,CAAC;QAEH,IAAI,CAAC,
|
1
|
+
{"version":3,"file":"connection_manager.js","sourceRoot":"","sources":["../../../src/lib/connection_manager/connection_manager.ts"],"names":[],"mappings":"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"}
|
@@ -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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"}
|
@@ -1,8 +1,8 @@
|
|
1
1
|
import { Libp2p } from "libp2p";
|
2
|
-
import
|
2
|
+
import { Dialer } from "./dialer.js";
|
3
3
|
type DiscoveryDialerConstructorOptions = {
|
4
4
|
libp2p: Libp2p;
|
5
|
-
|
5
|
+
dialer: Dialer;
|
6
6
|
};
|
7
7
|
interface IDiscoveryDialer {
|
8
8
|
start(): void;
|
@@ -15,18 +15,12 @@ interface IDiscoveryDialer {
|
|
15
15
|
*/
|
16
16
|
export declare class DiscoveryDialer implements IDiscoveryDialer {
|
17
17
|
private readonly libp2p;
|
18
|
-
private readonly
|
19
|
-
private dialingInterval;
|
20
|
-
private dialingQueue;
|
21
|
-
private dialHistory;
|
18
|
+
private readonly dialer;
|
22
19
|
constructor(options: DiscoveryDialerConstructorOptions);
|
23
20
|
start(): void;
|
24
21
|
stop(): void;
|
25
22
|
private onPeerDiscovery;
|
26
|
-
private processQueue;
|
27
|
-
private shouldSkipPeer;
|
28
23
|
private updatePeerStore;
|
29
|
-
private dialPeer;
|
30
24
|
private getPeer;
|
31
25
|
}
|
32
26
|
export {};
|
@@ -7,89 +7,35 @@ const log = new Logger("discovery-dialer");
|
|
7
7
|
*/
|
8
8
|
export class DiscoveryDialer {
|
9
9
|
libp2p;
|
10
|
-
|
11
|
-
dialingInterval = null;
|
12
|
-
dialingQueue = [];
|
13
|
-
dialHistory = new Set();
|
10
|
+
dialer;
|
14
11
|
constructor(options) {
|
15
12
|
this.libp2p = options.libp2p;
|
16
|
-
this.
|
13
|
+
this.dialer = options.dialer;
|
17
14
|
this.onPeerDiscovery = this.onPeerDiscovery.bind(this);
|
18
15
|
}
|
19
16
|
start() {
|
20
|
-
log.info("Starting discovery dialer");
|
21
17
|
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
18
|
}
|
30
19
|
stop() {
|
31
|
-
log.info("Stopping discovery dialer");
|
32
20
|
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
21
|
}
|
40
22
|
async onPeerDiscovery(event) {
|
41
23
|
const peerId = event.detail.id;
|
42
24
|
log.info(`Discovered new peer: ${peerId}`);
|
43
25
|
try {
|
44
|
-
const shouldSkip = await this.shouldSkipPeer(peerId);
|
45
|
-
if (shouldSkip) {
|
46
|
-
log.info(`Skipping peer: ${peerId}`);
|
47
|
-
return;
|
48
|
-
}
|
49
26
|
await this.updatePeerStore(peerId, event.detail.multiaddrs);
|
50
|
-
|
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
|
-
}
|
27
|
+
await this.dialer.dial(peerId);
|
57
28
|
}
|
58
29
|
catch (error) {
|
59
30
|
log.error(`Error dialing peer ${peerId}`, error);
|
60
31
|
}
|
61
32
|
}
|
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
33
|
async updatePeerStore(peerId, multiaddrs) {
|
90
34
|
try {
|
35
|
+
log.info(`Updating peer store for ${peerId}`);
|
91
36
|
const peer = await this.getPeer(peerId);
|
92
37
|
if (!peer) {
|
38
|
+
log.info(`Peer ${peerId} not found in store, saving`);
|
93
39
|
await this.libp2p.peerStore.save(peerId, {
|
94
40
|
multiaddrs: multiaddrs
|
95
41
|
});
|
@@ -97,8 +43,10 @@ export class DiscoveryDialer {
|
|
97
43
|
}
|
98
44
|
const hasSameAddr = multiaddrs.every((addr) => peer.addresses.some((a) => a.multiaddr.equals(addr)));
|
99
45
|
if (hasSameAddr) {
|
46
|
+
log.info(`Peer ${peerId} has same addresses in peer store, skipping`);
|
100
47
|
return;
|
101
48
|
}
|
49
|
+
log.info(`Merging peer ${peerId} addresses in peer store`);
|
102
50
|
await this.libp2p.peerStore.merge(peerId, {
|
103
51
|
multiaddrs: multiaddrs
|
104
52
|
});
|
@@ -107,17 +55,6 @@ export class DiscoveryDialer {
|
|
107
55
|
log.error(`Error updating peer store for ${peerId}`, error);
|
108
56
|
}
|
109
57
|
}
|
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
58
|
async getPeer(peerId) {
|
122
59
|
try {
|
123
60
|
return await this.libp2p.peerStore.get(peerId);
|
@@ -1 +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,
|
1
|
+
{"version":3,"file":"discovery_dialer.js","sourceRoot":"","sources":["../../../src/lib/connection_manager/discovery_dialer.ts"],"names":[],"mappings":"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"}
|
@@ -6,6 +6,9 @@ type NetworkMonitorConstructorOptions = {
|
|
6
6
|
interface INetworkMonitor {
|
7
7
|
start(): void;
|
8
8
|
stop(): void;
|
9
|
+
isConnected(): boolean;
|
10
|
+
isP2PConnected(): boolean;
|
11
|
+
isBrowserConnected(): boolean;
|
9
12
|
}
|
10
13
|
export declare class NetworkMonitor implements INetworkMonitor {
|
11
14
|
private readonly libp2p;
|
@@ -14,7 +17,18 @@ export declare class NetworkMonitor implements INetworkMonitor {
|
|
14
17
|
constructor(options: NetworkMonitorConstructorOptions);
|
15
18
|
start(): void;
|
16
19
|
stop(): void;
|
20
|
+
/**
|
21
|
+
* Returns true if the node is connected to the network via libp2p and browser.
|
22
|
+
*/
|
17
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;
|
18
32
|
private onConnectedEvent;
|
19
33
|
private onDisconnectedEvent;
|
20
34
|
private dispatchNetworkEvent;
|
@@ -31,7 +31,25 @@ export class NetworkMonitor {
|
|
31
31
|
// ignore
|
32
32
|
}
|
33
33
|
}
|
34
|
+
/**
|
35
|
+
* Returns true if the node is connected to the network via libp2p and browser.
|
36
|
+
*/
|
34
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() {
|
35
53
|
try {
|
36
54
|
if (globalThis?.navigator && !globalThis?.navigator?.onLine) {
|
37
55
|
return false;
|
@@ -40,7 +58,7 @@ export class NetworkMonitor {
|
|
40
58
|
catch (err) {
|
41
59
|
// ignore
|
42
60
|
}
|
43
|
-
return
|
61
|
+
return true;
|
44
62
|
}
|
45
63
|
onConnectedEvent() {
|
46
64
|
if (!this.isNetworkConnected) {
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"network_monitor.js","sourceRoot":"","sources":["../../../src/lib/connection_manager/network_monitor.ts"],"names":[],"mappings":"
|
1
|
+
{"version":3,"file":"network_monitor.js","sourceRoot":"","sources":["../../../src/lib/connection_manager/network_monitor.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"name":"@waku/core","version":"0.0.37-
|
1
|
+
{"name":"@waku/core","version":"0.0.37-987c6cd.0","description":"TypeScript implementation of the Waku v2 protocol","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"},"./lib/message/version_0":{"types":"./dist/lib/message/version_0.d.ts","import":"./dist/lib/message/version_0.js"}},"typesVersions":{"*":{"lib/*":["dist/lib/*"],"constants/*":["dist/constants/*"]}},"type":"module","homepage":"https://github.com/waku-org/js-waku/tree/master/packages/core#readme","repository":{"type":"git","url":"https://github.com/waku-org/js-waku.git"},"bugs":{"url":"https://github.com/waku-org/js-waku/issues"},"license":"MIT OR Apache-2.0","keywords":["waku","decentralised","communication","web3","ethereum","dapps"],"scripts":{"build":"run-s build:**","build:esm":"tsc","build:bundle":"rollup --config rollup.config.js","fix":"run-s fix:*","fix:lint":"eslint src *.js --fix","check":"run-s check:*","check:tsc":"tsc -p tsconfig.dev.json","check:lint":"eslint src *.js","check:spelling":"cspell \"{README.md,src/**/*.ts}\"","test":"NODE_ENV=test run-s test:*","test:node":"NODE_ENV=test TS_NODE_PROJECT=./tsconfig.dev.json mocha","test:browser":"NODE_ENV=test karma start karma.conf.cjs","watch:build":"tsc -p tsconfig.json -w","watch:test":"mocha --watch","prepublish":"npm run build","reset-hard":"git clean -dfx -e .idea && git reset --hard && npm i && npm run build"},"engines":{"node":">=22"},"dependencies":{"@waku/enr":"0.0.31-987c6cd.0","@waku/interfaces":"0.0.32-987c6cd.0","@libp2p/ping":"2.0.35","@waku/proto":"0.0.12-987c6cd.0","@waku/utils":"0.0.25-987c6cd.0","debug":"^4.3.4","@noble/hashes":"^1.3.2","it-all":"^3.0.4","it-length-prefixed":"^9.0.4","it-pipe":"^3.0.1","uint8arraylist":"^2.4.3","uuid":"^9.0.0"},"devDependencies":{"@libp2p/peer-id":"5.1.7","@libp2p/interface":"2.10.4","@multiformats/multiaddr":"^12.0.0","@rollup/plugin-commonjs":"^25.0.7","@rollup/plugin-json":"^6.0.0","@rollup/plugin-node-resolve":"^15.2.3","@types/chai":"^4.3.11","@types/debug":"^4.1.12","@types/mocha":"^10.0.6","@types/uuid":"^9.0.8","@waku/build-utils":"*","chai":"^4.3.10","sinon":"^18.0.0","cspell":"^8.6.1","fast-check":"^3.19.0","ignore-loader":"^0.1.2","isomorphic-fetch":"^3.0.0","mocha":"^10.3.0","npm-run-all":"^4.1.5","process":"^0.11.10","rollup":"^4.12.0"},"peerDependencies":{"@multiformats/multiaddr":"^12.0.0","libp2p":"2.8.11"},"peerDependenciesMeta":{"@multiformats/multiaddr":{"optional":true},"libp2p":{"optional":true}},"files":["dist","bundle","src/**/*.ts","!**/*.spec.*","!**/*.json","CHANGELOG.md","LICENSE","README.md"]}
|
@@ -1,26 +1,29 @@
|
|
1
1
|
import { Peer, PeerId } from "@libp2p/interface";
|
2
|
-
import {
|
2
|
+
import {
|
3
|
+
ConnectionManagerOptions,
|
4
|
+
IWakuEventEmitter,
|
5
|
+
Libp2p,
|
6
|
+
Tags
|
7
|
+
} from "@waku/interfaces";
|
3
8
|
import { Logger } from "@waku/utils";
|
4
9
|
|
10
|
+
import { Dialer } from "./dialer.js";
|
11
|
+
import { NetworkMonitor } from "./network_monitor.js";
|
12
|
+
|
5
13
|
const log = new Logger("connection-limiter");
|
6
14
|
|
7
15
|
type Libp2pEventHandler<T> = (e: CustomEvent<T>) => void;
|
8
16
|
|
9
17
|
type ConnectionLimiterConstructorOptions = {
|
10
18
|
libp2p: Libp2p;
|
19
|
+
events: IWakuEventEmitter;
|
20
|
+
dialer: Dialer;
|
21
|
+
networkMonitor: NetworkMonitor;
|
11
22
|
options: ConnectionManagerOptions;
|
12
23
|
};
|
13
24
|
|
14
25
|
interface IConnectionLimiter {
|
15
|
-
/**
|
16
|
-
* Dial all known peers because libp2p might have emitted `peer:discovery` before initialization
|
17
|
-
* and listen to `peer:connect` and `peer:disconnect` events to manage connections.
|
18
|
-
*/
|
19
26
|
start(): void;
|
20
|
-
|
21
|
-
/**
|
22
|
-
* Stop listening to `peer:connect` and `peer:disconnect` events.
|
23
|
-
*/
|
24
27
|
stop(): void;
|
25
28
|
}
|
26
29
|
|
@@ -31,12 +34,21 @@ interface IConnectionLimiter {
|
|
31
34
|
*/
|
32
35
|
export class ConnectionLimiter implements IConnectionLimiter {
|
33
36
|
private readonly libp2p: Libp2p;
|
37
|
+
private readonly events: IWakuEventEmitter;
|
38
|
+
private readonly networkMonitor: NetworkMonitor;
|
39
|
+
private readonly dialer: Dialer;
|
40
|
+
|
34
41
|
private readonly options: ConnectionManagerOptions;
|
35
42
|
|
36
43
|
public constructor(options: ConnectionLimiterConstructorOptions) {
|
37
44
|
this.libp2p = options.libp2p;
|
45
|
+
this.events = options.events;
|
46
|
+
this.networkMonitor = options.networkMonitor;
|
47
|
+
this.dialer = options.dialer;
|
48
|
+
|
38
49
|
this.options = options.options;
|
39
50
|
|
51
|
+
this.onWakuConnectionEvent = this.onWakuConnectionEvent.bind(this);
|
40
52
|
this.onConnectedEvent = this.onConnectedEvent.bind(this);
|
41
53
|
this.onDisconnectedEvent = this.onDisconnectedEvent.bind(this);
|
42
54
|
}
|
@@ -45,6 +57,8 @@ export class ConnectionLimiter implements IConnectionLimiter {
|
|
45
57
|
// dial all known peers because libp2p might have emitted `peer:discovery` before initialization
|
46
58
|
void this.dialPeersFromStore();
|
47
59
|
|
60
|
+
this.events.addEventListener("waku:connection", this.onWakuConnectionEvent);
|
61
|
+
|
48
62
|
this.libp2p.addEventListener(
|
49
63
|
"peer:connect",
|
50
64
|
this.onConnectedEvent as Libp2pEventHandler<PeerId>
|
@@ -68,6 +82,11 @@ export class ConnectionLimiter implements IConnectionLimiter {
|
|
68
82
|
}
|
69
83
|
|
70
84
|
public stop(): void {
|
85
|
+
this.events.removeEventListener(
|
86
|
+
"waku:connection",
|
87
|
+
this.onWakuConnectionEvent
|
88
|
+
);
|
89
|
+
|
71
90
|
this.libp2p.removeEventListener(
|
72
91
|
"peer:connect",
|
73
92
|
this.onConnectedEvent as Libp2pEventHandler<PeerId>
|
@@ -79,6 +98,12 @@ export class ConnectionLimiter implements IConnectionLimiter {
|
|
79
98
|
);
|
80
99
|
}
|
81
100
|
|
101
|
+
private onWakuConnectionEvent(): void {
|
102
|
+
if (this.networkMonitor.isBrowserConnected()) {
|
103
|
+
void this.dialPeersFromStore();
|
104
|
+
}
|
105
|
+
}
|
106
|
+
|
82
107
|
private async onConnectedEvent(evt: CustomEvent<PeerId>): Promise<void> {
|
83
108
|
log.info(`Connected to peer ${evt.detail.toString()}`);
|
84
109
|
|
@@ -88,30 +113,45 @@ export class ConnectionLimiter implements IConnectionLimiter {
|
|
88
113
|
const isBootstrap = tags.includes(Tags.BOOTSTRAP);
|
89
114
|
|
90
115
|
if (!isBootstrap) {
|
116
|
+
log.info(
|
117
|
+
`Connected to peer ${peerId.toString()} is not a bootstrap peer`
|
118
|
+
);
|
91
119
|
return;
|
92
120
|
}
|
93
121
|
|
94
122
|
if (await this.hasMoreThanMaxBootstrapConnections()) {
|
123
|
+
log.info(
|
124
|
+
`Connected to peer ${peerId.toString()} and node has more than max bootstrap connections ${this.options.maxBootstrapPeers}. Dropping connection.`
|
125
|
+
);
|
95
126
|
await this.libp2p.hangUp(peerId);
|
96
127
|
}
|
97
128
|
}
|
98
129
|
|
99
130
|
private async onDisconnectedEvent(): Promise<void> {
|
100
131
|
if (this.libp2p.getConnections().length === 0) {
|
132
|
+
log.info(`No connections, dialing peers from store`);
|
101
133
|
await this.dialPeersFromStore();
|
102
134
|
}
|
103
135
|
}
|
104
136
|
|
105
137
|
private async dialPeersFromStore(): Promise<void> {
|
138
|
+
log.info(`Dialing peers from store`);
|
139
|
+
|
106
140
|
const allPeers = await this.libp2p.peerStore.all();
|
107
141
|
const allConnections = this.libp2p.getConnections();
|
108
142
|
|
143
|
+
log.info(
|
144
|
+
`Found ${allPeers.length} peers in store, and found ${allConnections.length} connections`
|
145
|
+
);
|
146
|
+
|
109
147
|
const promises = allPeers
|
110
148
|
.filter((p) => !allConnections.some((c) => c.remotePeer.equals(p.id)))
|
111
|
-
.map((p) => this.
|
149
|
+
.map((p) => this.dialer.dial(p.id));
|
112
150
|
|
113
151
|
try {
|
152
|
+
log.info(`Dialing ${promises.length} peers from store`);
|
114
153
|
await Promise.all(promises);
|
154
|
+
log.info(`Dialed ${promises.length} peers from store`);
|
115
155
|
} catch (error) {
|
116
156
|
log.error(`Unexpected error while dialing peer store peers`, error);
|
117
157
|
}
|