Skip to content

Commit 8858e45

Browse files
use PeerData to hold the ping instead of a new variable
1 parent 42eb3cb commit 8858e45

File tree

4 files changed

+24
-11
lines changed

4 files changed

+24
-11
lines changed

packages/core/src/lib/base_protocol.ts

-3
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import type { IBaseProtocol, Libp2pComponents } from "@waku/interfaces";
66
import { getPeersForProtocol, selectPeerForProtocol } from "@waku/utils/libp2p";
77

88
import { filterPeers } from "./filterPeers.js";
9-
import { KeepAliveManager } from "./keep_alive_manager.js";
109
import { StreamManager } from "./stream_manager.js";
1110

1211
/**
@@ -55,10 +54,8 @@ export class BaseProtocol implements IBaseProtocol {
5554
}
5655

5756
protected async getPeer(peerId?: PeerId): Promise<Peer> {
58-
const { peerPings } = KeepAliveManager.getInstance();
5957
const { peer } = await selectPeerForProtocol(
6058
this.peerStore,
61-
peerPings,
6259
[this.multicodec],
6360
peerId
6461
);

packages/core/src/lib/connection_manager.ts

+1
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,7 @@ export class ConnectionManager
118118

119119
this.keepAliveManager = KeepAliveManager.createInstance(
120120
this.libp2p.services.ping,
121+
this.libp2p.peerStore,
121122
keepAliveOptions,
122123
relay
123124
);

packages/core/src/lib/keep_alive_manager.ts

+14-3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
import type { PeerId } from "@libp2p/interface/peer-id";
2+
import type { PeerStore } from "@libp2p/interface/peer-store";
23
import type { IRelay } from "@waku/interfaces";
34
import type { KeepAliveOptions } from "@waku/interfaces";
5+
import { utf8ToBytes } from "@waku/utils/bytes";
46
import debug from "debug";
57
import type { PingService } from "libp2p/ping";
68

@@ -17,29 +19,32 @@ export class KeepAliveManager {
1719
private options: KeepAliveOptions;
1820
private relay?: IRelay;
1921
private libp2pPing: PingService;
20-
public peerPings: Map<string, number>;
22+
private peerStore: PeerStore;
2123

2224
private constructor(
2325
libp2pPing: PingService,
26+
peerStore: PeerStore,
2427
options: KeepAliveOptions,
2528
relay?: IRelay
2629
) {
2730
this.pingKeepAliveTimers = new Map();
2831
this.relayKeepAliveTimers = new Map();
2932
this.options = options;
3033
this.relay = relay;
31-
this.peerPings = new Map();
3234
this.libp2pPing = libp2pPing;
35+
this.peerStore = peerStore;
3336
}
3437

3538
public static createInstance(
3639
libp2pPing: PingService,
40+
peerStore: PeerStore,
3741
options: KeepAliveOptions,
3842
relay?: IRelay
3943
): KeepAliveManager {
4044
if (!KeepAliveManager.instance) {
4145
KeepAliveManager.instance = new KeepAliveManager(
4246
libp2pPing,
47+
peerStore,
4348
options,
4449
relay
4550
);
@@ -71,7 +76,13 @@ export class KeepAliveManager {
7176
.ping(peerId)
7277
.then((ping) => {
7378
log(`Ping succeeded (${peerIdStr})`, ping);
74-
this.peerPings.set(peerIdStr, ping);
79+
this.peerStore
80+
.patch(peerId, {
81+
metadata: {
82+
ping: utf8ToBytes(ping.toString())
83+
}
84+
})
85+
.catch((e) => log("Failed to update ping", e));
7586
})
7687
.catch((e) => {
7788
log(`Ping failed (${peerIdStr})`, e);

packages/utils/src/libp2p/index.ts

+9-5
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ import type { PeerId } from "@libp2p/interface/peer-id";
33
import type { Peer, PeerStore } from "@libp2p/interface/peer-store";
44
import debug from "debug";
55

6+
import { bytesToUtf8 } from "../bytes/index.js";
7+
68
const log = debug("waku:libp2p-utils");
79

810
/**
@@ -23,14 +25,17 @@ export function selectRandomPeer(peers: Peer[]): Peer | undefined {
2325
* @returns The peer with the lowest latency, or undefined if no peer could be reached
2426
*/
2527
export async function selectLowestLatencyPeer(
26-
peerPings: Map<string, number>,
28+
peerStore: PeerStore,
2729
peers: Peer[]
2830
): Promise<Peer | undefined> {
2931
if (peers.length === 0) return;
3032

3133
const results = await Promise.all(
32-
peers.map((peer) => {
33-
const ping = peerPings.get(peer.id.toString()) ?? Infinity;
34+
peers.map(async (peer) => {
35+
const pingBytes = (await peerStore.get(peer.id)).metadata.get("ping");
36+
if (!pingBytes) return { peer, ping: Infinity };
37+
38+
const ping = Number(bytesToUtf8(pingBytes)) ?? Infinity;
3439
return { peer, ping };
3540
})
3641
);
@@ -69,7 +74,6 @@ export async function getPeersForProtocol(
6974
*/
7075
export async function selectPeerForProtocol(
7176
peerStore: PeerStore,
72-
peerPings: Map<string, number>,
7377
protocols: string[],
7478
peerId?: PeerId
7579
): Promise<{ peer: Peer; protocol: string }> {
@@ -83,7 +87,7 @@ export async function selectPeerForProtocol(
8387
}
8488
} else {
8589
const peers = await getPeersForProtocol(peerStore, protocols);
86-
peer = await selectLowestLatencyPeer(peerPings, peers);
90+
peer = await selectLowestLatencyPeer(peerStore, peers);
8791
if (!peer) {
8892
peer = selectRandomPeer(peers);
8993
if (!peer)

0 commit comments

Comments
 (0)