Skip to content

Commit b8f7db2

Browse files
authored
Merge pull request #1244 from waku-org/chore/peer-exchange
2 parents 7621fab + 3a92355 commit b8f7db2

File tree

10 files changed

+35
-31
lines changed

10 files changed

+35
-31
lines changed

package-lock.json

+2
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/core/src/lib/store/index.ts

+1-4
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import {
1010
ProtocolCreateOptions,
1111
} from "@waku/interfaces";
1212
import { proto_store as proto } from "@waku/proto";
13+
import { isDefined } from "@waku/utils";
1314
import { concat, utf8ToBytes } from "@waku/utils/bytes";
1415
import debug from "debug";
1516
import all from "it-all";
@@ -345,10 +346,6 @@ async function* paginate<T extends IDecodedMessage>(
345346
}
346347
}
347348

348-
export function isDefined<T>(msg: T | undefined): msg is T {
349-
return !!msg;
350-
}
351-
352349
export async function createCursor(
353350
message: IDecodedMessage,
354351
pubsubTopic: string = DefaultPubSubTopic

packages/interfaces/src/peer_exchange.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import { IEnr } from "./enr.js";
66
import { PointToPointProtocol } from "./protocols.js";
77

88
export interface IPeerExchange extends PointToPointProtocol {
9-
query(params: PeerExchangeQueryParams): Promise<PeerInfo[]>;
9+
query(params: PeerExchangeQueryParams): Promise<PeerInfo[] | undefined>;
1010
}
1111

1212
export interface PeerExchangeQueryParams {

packages/peer-exchange/package.json

+1
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@
5454
"@libp2p/interfaces": "^3.3.1",
5555
"@waku/enr": "0.0.6",
5656
"@waku/proto": "0.0.3",
57+
"@waku/utils": "*",
5758
"debug": "^4.3.4",
5859
"it-all": "^2.0.0",
5960
"it-length-prefixed": "^8.0.4",

packages/peer-exchange/src/waku_peer_exchange.ts

+16-17
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import type {
77
PeerExchangeQueryParams,
88
PeerInfo,
99
} from "@waku/interfaces";
10+
import { isDefined } from "@waku/utils";
1011
import debug from "debug";
1112
import all from "it-all";
1213
import * as lp from "it-length-prefixed";
@@ -47,7 +48,9 @@ export class WakuPeerExchange extends BaseProtocol implements IPeerExchange {
4748
/**
4849
* Make a peer exchange query to a peer
4950
*/
50-
async query(params: PeerExchangeQueryParams): Promise<PeerInfo[]> {
51+
async query(
52+
params: PeerExchangeQueryParams
53+
): Promise<PeerInfo[] | undefined> {
5154
const { numPeers } = params;
5255

5356
const rpcQuery = PeerExchangeRPC.createRequest({
@@ -72,28 +75,24 @@ export class WakuPeerExchange extends BaseProtocol implements IPeerExchange {
7275
bytes.append(chunk);
7376
});
7477

75-
const decoded = PeerExchangeRPC.decode(bytes).response;
78+
const { response } = PeerExchangeRPC.decode(bytes);
7679

77-
if (!decoded) {
78-
throw new Error("Failed to decode response");
80+
if (!response) {
81+
log("PeerExchangeRPC message did not contains a `response` field");
82+
return;
7983
}
8084

81-
const enrs = await Promise.all(
82-
decoded.peerInfos.map(
83-
(peerInfo) => peerInfo.enr && EnrDecoder.fromRLP(peerInfo.enr)
84-
)
85+
return Promise.all(
86+
response.peerInfos
87+
.map((peerInfo) => peerInfo.enr)
88+
.filter(isDefined)
89+
.map(async (enr) => {
90+
return { ENR: await EnrDecoder.fromRLP(enr) };
91+
})
8592
);
86-
87-
const peerInfos = enrs.map((enr) => {
88-
return {
89-
ENR: enr,
90-
};
91-
});
92-
93-
return peerInfos;
9493
} catch (err) {
9594
log("Failed to decode push reply", err);
96-
throw new Error("Failed to decode push reply");
95+
return;
9796
}
9897
}
9998
}

packages/peer-exchange/src/waku_peer_exchange_discovery.ts

+6-1
Original file line numberDiff line numberDiff line change
@@ -155,10 +155,15 @@ export class PeerExchangeDiscovery
155155
peerId,
156156
});
157157

158+
if (!peerInfos) {
159+
log("Peer exchange query failed, no peer info returned");
160+
return;
161+
}
162+
158163
for (const _peerInfo of peerInfos) {
159164
const { ENR } = _peerInfo;
160165
if (!ENR) {
161-
log("no ENR");
166+
log("No ENR in peerInfo object, skipping");
162167
continue;
163168
}
164169

packages/tests/src/nwaku.ts

+1-6
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import type { PeerId } from "@libp2p/interface-peer-id";
44
import { peerIdFromString } from "@libp2p/peer-id";
55
import { Multiaddr, multiaddr } from "@multiformats/multiaddr";
66
import { DefaultPubSubTopic } from "@waku/core";
7+
import { isDefined } from "@waku/utils";
78
import { bytesToHex, hexToBytes } from "@waku/utils/bytes";
89
import appRoot from "app-root-path";
910
import debug from "debug";
@@ -272,12 +273,6 @@ export class Nwaku {
272273
): Promise<MessageRpcResponse[]> {
273274
this.checkProcess();
274275

275-
const isDefined = (
276-
msg: MessageRpcResponse | undefined
277-
): msg is MessageRpcResponse => {
278-
return !!msg;
279-
};
280-
281276
const msgs = await this.rpcCall<MessageRpcResponse[]>(
282277
"get_waku_v2_relay_v1_messages",
283278
[pubsubTopic]

packages/tests/tests/peer_exchange.node.spec.ts

+3-2
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import {
44
getPredefinedBootstrapNodes,
55
} from "@waku/core/lib/predefined_bootstrap_nodes";
66
import { createLightNode } from "@waku/create";
7+
import { PeerInfo } from "@waku/interfaces";
78
import type { LightNode } from "@waku/interfaces";
89
import {
910
PeerExchangeCodec,
@@ -117,9 +118,9 @@ describe("Peer Exchange", () => {
117118

118119
const numPeersToRequest = 1;
119120

120-
const peerInfos = await peerExchange.query({
121+
const peerInfos = (await peerExchange.query({
121122
numPeers: numPeersToRequest,
122-
});
123+
})) as PeerInfo[];
123124

124125
expect(peerInfos.length).to.be.greaterThan(0);
125126
expect(peerInfos.length).to.be.lessThanOrEqual(numPeersToRequest);

packages/utils/src/common/index.ts

+1
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
1+
export * from "./is_defined.js";
12
export * from "./random_subset.js";
+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
export function isDefined<T>(value: T | undefined): value is T {
2+
return Boolean(value);
3+
}

0 commit comments

Comments
 (0)