@waku/discovery 0.0.4-ce62600.0 → 0.0.4-f387f59.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 +644 -826
- package/dist/.tsbuildinfo +1 -1
- package/dist/dns/constants.d.ts +0 -2
- package/dist/dns/constants.js +1 -3
- package/dist/dns/constants.js.map +1 -1
- package/dist/dns/dns.js.map +1 -1
- package/dist/dns/dns_discovery.js.map +1 -1
- package/dist/dns/dns_over_https.js.map +1 -1
- package/dist/dns/enrtree.js.map +1 -1
- package/dist/local-peer-cache/index.js.map +1 -1
- package/dist/peer-exchange/rpc.js.map +1 -1
- package/dist/peer-exchange/waku_peer_exchange.js +2 -2
- package/dist/peer-exchange/waku_peer_exchange.js.map +1 -1
- package/dist/peer-exchange/waku_peer_exchange_discovery.d.ts +6 -1
- package/dist/peer-exchange/waku_peer_exchange_discovery.js +48 -2
- package/dist/peer-exchange/waku_peer_exchange_discovery.js.map +1 -1
- package/package.json +1 -1
- package/src/dns/constants.ts +1 -4
- package/src/dns/dns.ts +2 -2
- package/src/dns/dns_discovery.ts +8 -5
- package/src/dns/dns_over_https.ts +1 -1
- package/src/dns/enrtree.ts +4 -4
- package/src/local-peer-cache/index.ts +5 -5
- package/src/peer-exchange/rpc.ts +7 -5
- package/src/peer-exchange/waku_peer_exchange.ts +8 -4
- package/src/peer-exchange/waku_peer_exchange_discovery.ts +92 -8
@@ -1,7 +1,7 @@
|
|
1
1
|
import { CustomEvent, TypedEventEmitter } from "@libp2p/interface";
|
2
2
|
import { peerDiscoverySymbol as symbol } from "@libp2p/interface";
|
3
3
|
import { Tags } from "@waku/interfaces";
|
4
|
-
import { encodeRelayShard, Logger } from "@waku/utils";
|
4
|
+
import { decodeRelayShard, encodeRelayShard, Logger } from "@waku/utils";
|
5
5
|
import { PeerExchangeCodec, WakuPeerExchange } from "./waku_peer_exchange.js";
|
6
6
|
const log = new Logger("peer-exchange-discovery");
|
7
7
|
const DEFAULT_PEER_EXCHANGE_REQUEST_NODES = 10;
|
@@ -39,6 +39,7 @@ export class PeerExchangeDiscovery extends TypedEventEmitter {
|
|
39
39
|
if (this.isStarted) {
|
40
40
|
return;
|
41
41
|
}
|
42
|
+
this.dispatchEvent(new CustomEvent("waku:peer-exchange:started", { detail: true }));
|
42
43
|
log.info("Starting peer exchange node discovery, discovering peers");
|
43
44
|
// might be better to use "peer:identify" or "peer:update"
|
44
45
|
this.components.events.addEventListener("peer:identify", this.handleDiscoveredPeer);
|
@@ -98,7 +99,31 @@ export class PeerExchangeDiscovery extends TypedEventEmitter {
|
|
98
99
|
}
|
99
100
|
const hasPeer = await this.components.peerStore.has(peerId);
|
100
101
|
if (hasPeer) {
|
101
|
-
|
102
|
+
const { hasMultiaddrDiff, hasShardDiff } = await this.checkPeerInfoDiff(peerInfo, shardInfo);
|
103
|
+
if (hasMultiaddrDiff || hasShardDiff) {
|
104
|
+
log.info(`Peer ${peerId.toString()} has updated multiaddrs or shardInfo, updating`);
|
105
|
+
if (hasMultiaddrDiff) {
|
106
|
+
log.info(`Peer ${peerId.toString()} has updated multiaddrs, updating`);
|
107
|
+
await this.components.peerStore.patch(peerId, {
|
108
|
+
multiaddrs: peerInfo.multiaddrs
|
109
|
+
});
|
110
|
+
}
|
111
|
+
if (hasShardDiff && shardInfo) {
|
112
|
+
log.info(`Peer ${peerId.toString()} has updated shardInfo, updating`);
|
113
|
+
await this.components.peerStore.merge(peerId, {
|
114
|
+
metadata: {
|
115
|
+
shardInfo: encodeRelayShard(shardInfo)
|
116
|
+
}
|
117
|
+
});
|
118
|
+
this.dispatchEvent(new CustomEvent("peer", {
|
119
|
+
detail: {
|
120
|
+
id: peerId,
|
121
|
+
multiaddrs: peerInfo.multiaddrs
|
122
|
+
}
|
123
|
+
}));
|
124
|
+
}
|
125
|
+
continue;
|
126
|
+
}
|
102
127
|
}
|
103
128
|
// update the tags for the peer
|
104
129
|
await this.components.peerStore.save(peerId, {
|
@@ -112,6 +137,9 @@ export class PeerExchangeDiscovery extends TypedEventEmitter {
|
|
112
137
|
metadata: {
|
113
138
|
shardInfo: encodeRelayShard(shardInfo)
|
114
139
|
}
|
140
|
+
}),
|
141
|
+
...(peerInfo.multiaddrs && {
|
142
|
+
multiaddrs: peerInfo.multiaddrs
|
115
143
|
})
|
116
144
|
});
|
117
145
|
log.info(`Discovered peer: ${peerId.toString()}`);
|
@@ -129,6 +157,24 @@ export class PeerExchangeDiscovery extends TypedEventEmitter {
|
|
129
157
|
this.queryingPeers.delete(peerIdStr);
|
130
158
|
this.queryAttempts.delete(peerIdStr);
|
131
159
|
}
|
160
|
+
async checkPeerInfoDiff(peerInfo, shardInfo) {
|
161
|
+
const { id: peerId } = peerInfo;
|
162
|
+
const peer = await this.components.peerStore.get(peerId);
|
163
|
+
const existingMultiaddrs = peer.addresses.map((a) => a.multiaddr.toString());
|
164
|
+
const newMultiaddrs = peerInfo.multiaddrs.map((ma) => ma.toString());
|
165
|
+
const hasMultiaddrDiff = existingMultiaddrs.some((ma) => !newMultiaddrs.includes(ma));
|
166
|
+
let hasShardDiff = false;
|
167
|
+
const existingShardInfoBytes = peer.metadata.get("shardInfo");
|
168
|
+
if (existingShardInfoBytes) {
|
169
|
+
const existingShardInfo = decodeRelayShard(existingShardInfoBytes);
|
170
|
+
if (existingShardInfo || shardInfo) {
|
171
|
+
hasShardDiff =
|
172
|
+
existingShardInfo.clusterId !== shardInfo?.clusterId ||
|
173
|
+
existingShardInfo.shards.some((shard) => !shardInfo?.shards.includes(shard));
|
174
|
+
}
|
175
|
+
}
|
176
|
+
return { hasMultiaddrDiff, hasShardDiff };
|
177
|
+
}
|
132
178
|
}
|
133
179
|
export function wakuPeerExchangeDiscovery(pubsubTopics) {
|
134
180
|
return (components) => new PeerExchangeDiscovery(components, pubsubTopics);
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"waku_peer_exchange_discovery.js","sourceRoot":"","sources":["../../src/peer-exchange/waku_peer_exchange_discovery.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACnE,OAAO,EAAE,mBAAmB,IAAI,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAQlE,OAAO,
|
1
|
+
{"version":3,"file":"waku_peer_exchange_discovery.js","sourceRoot":"","sources":["../../src/peer-exchange/waku_peer_exchange_discovery.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"name":"@waku/discovery","version":"0.0.4-
|
1
|
+
{"name":"@waku/discovery","version":"0.0.4-f387f59.0","description":"Contains various discovery mechanisms: DNS Discovery (EIP-1459, Peer Exchange, Local Peer Cache Discovery.","types":"./dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"type":"module","author":"Waku Team","homepage":"https://github.com/waku-org/js-waku/tree/master/packages/discovery#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","decentralized","secure","communication","web3","ethereum","dapps","privacy"],"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:lint":"eslint src --ext .ts","check:spelling":"cspell \"{README.md,src/**/*.ts}\"","check:tsc":"tsc -p tsconfig.dev.json","prepublish":"npm run build","reset-hard":"git clean -dfx -e .idea && git reset --hard && npm i && npm run build","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"},"engines":{"node":">=20"},"dependencies":{"@waku/interfaces":"0.0.26-f387f59.0","@waku/proto":"0.0.8-f387f59.0","@waku/enr":"0.0.25-f387f59.0","@waku/core":"0.0.31-f387f59.0","@waku/utils":"0.0.19-f387f59.0","debug":"^4.3.4","dns-query":"^0.11.2","hi-base32":"^0.5.1","uint8arrays":"^5.0.1"},"devDependencies":{"@libp2p/peer-id":"^4.2.1","@libp2p/peer-id-factory":"^4.2.1","@multiformats/multiaddr":"^12.3.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/node-localstorage":"^1.3.3","@waku/build-utils":"*","chai":"^4.3.10","chai-as-promised":"^7.1.1","cspell":"^8.6.1","mocha":"^10.3.0","node-localstorage":"^3.0.5","npm-run-all":"^4.1.5","rollup":"^4.12.0","sinon":"^18.0.0"},"peerDependencies":{"@waku/core":"0.0.31-f387f59.0","@waku/enr":"0.0.25-f387f59.0","@waku/interfaces":"0.0.26-f387f59.0","@waku/proto":"0.0.8-f387f59.0","@waku/utils":"0.0.19-f387f59.0","@libp2p/interface":"^1.6.3"},"peerDependenciesMeta":{"@waku/interfaces":{"optional":true},"@libp2p/interface":{"optional":true}},"files":["dist","bundle","src/**/*.ts","!**/*.spec.*","!**/*.json","CHANGELOG.md","LICENSE","README.md"]}
|
package/src/dns/constants.ts
CHANGED
@@ -3,14 +3,11 @@ import type { NodeCapabilityCount } from "@waku/interfaces";
|
|
3
3
|
/**
|
4
4
|
* The ENR tree for the different fleets.
|
5
5
|
* SANDBOX and TEST fleets are for The Waku Network.
|
6
|
-
* DEPRECATED_DEFAULT_PUBSUB is the fleet of nodes supporting the now deprecated DefaultPubsubTopic.
|
7
6
|
*/
|
8
7
|
export const enrTree = {
|
9
8
|
SANDBOX:
|
10
9
|
"enrtree://AIRVQ5DDA4FFWLRBCHJWUWOO6X6S4ZTZ5B667LQ6AJU6PEYDLRD5O@sandbox.waku.nodes.status.im",
|
11
|
-
TEST: "enrtree://AOGYWMBYOUIMOENHXCHILPKY3ZRFEULMFI4DOM442QSZ73TT2A7VI@test.waku.nodes.status.im"
|
12
|
-
DEPRECATED_DEFAULT_PUBSUB:
|
13
|
-
"enrtree://ANEDLO25QVUGJOUTQFRYKWX6P4Z4GKVESBMHML7DZ6YK4LGS5FC5O@prod.wakuv2.nodes.status.im"
|
10
|
+
TEST: "enrtree://AOGYWMBYOUIMOENHXCHILPKY3ZRFEULMFI4DOM442QSZ73TT2A7VI@test.waku.nodes.status.im"
|
14
11
|
};
|
15
12
|
|
16
13
|
export const DEFAULT_BOOTSTRAP_TAG_NAME = "bootstrap";
|
package/src/dns/dns.ts
CHANGED
@@ -37,7 +37,7 @@ export class DnsNodeDiscovery {
|
|
37
37
|
* peers encountered by randomized search exceeds the sum of the fields of
|
38
38
|
* @link wantedNodeCapabilityCount plus the @link _errorTolerance factor.
|
39
39
|
*/
|
40
|
-
async getPeers(
|
40
|
+
public async getPeers(
|
41
41
|
enrTreeUrls: string[],
|
42
42
|
wantedNodeCapabilityCount: Partial<NodeCapabilityCount>
|
43
43
|
): Promise<IEnr[]> {
|
@@ -74,7 +74,7 @@ export class DnsNodeDiscovery {
|
|
74
74
|
/**
|
75
75
|
* {@inheritDoc getPeers}
|
76
76
|
*/
|
77
|
-
async *getNextPeer(
|
77
|
+
public async *getNextPeer(
|
78
78
|
enrTreeUrls: string[],
|
79
79
|
wantedNodeCapabilityCount: Partial<NodeCapabilityCount>
|
80
80
|
): AsyncGenerator<IEnr> {
|
package/src/dns/dns_discovery.ts
CHANGED
@@ -36,7 +36,10 @@ export class PeerDiscoveryDns
|
|
36
36
|
private _components: DnsDiscoveryComponents;
|
37
37
|
private _options: DnsDiscOptions;
|
38
38
|
|
39
|
-
constructor(
|
39
|
+
public constructor(
|
40
|
+
components: DnsDiscoveryComponents,
|
41
|
+
options: DnsDiscOptions
|
42
|
+
) {
|
40
43
|
super();
|
41
44
|
this._started = false;
|
42
45
|
this._components = components;
|
@@ -49,7 +52,7 @@ export class PeerDiscoveryDns
|
|
49
52
|
/**
|
50
53
|
* Start discovery process
|
51
54
|
*/
|
52
|
-
async start(): Promise<void> {
|
55
|
+
public async start(): Promise<void> {
|
53
56
|
log.info("Starting peer discovery via dns");
|
54
57
|
|
55
58
|
this._started = true;
|
@@ -122,15 +125,15 @@ export class PeerDiscoveryDns
|
|
122
125
|
/**
|
123
126
|
* Stop emitting events
|
124
127
|
*/
|
125
|
-
stop(): void {
|
128
|
+
public stop(): void {
|
126
129
|
this._started = false;
|
127
130
|
}
|
128
131
|
|
129
|
-
get [symbol](): true {
|
132
|
+
public get [symbol](): true {
|
130
133
|
return true;
|
131
134
|
}
|
132
135
|
|
133
|
-
get [Symbol.toStringTag](): string {
|
136
|
+
public get [Symbol.toStringTag](): string {
|
134
137
|
return "@waku/bootstrap";
|
135
138
|
}
|
136
139
|
}
|
@@ -36,7 +36,7 @@ export class DnsOverHttps implements DnsClient {
|
|
36
36
|
*
|
37
37
|
* @throws if the query fails
|
38
38
|
*/
|
39
|
-
async resolveTXT(domain: string): Promise<string[]> {
|
39
|
+
public async resolveTXT(domain: string): Promise<string[]> {
|
40
40
|
let answers;
|
41
41
|
try {
|
42
42
|
const res = await query(
|
package/src/dns/enrtree.ts
CHANGED
@@ -26,7 +26,7 @@ export class ENRTree {
|
|
26
26
|
* Extracts the branch subdomain referenced by a DNS tree root string after verifying
|
27
27
|
* the root record signature with its base32 compressed public key.
|
28
28
|
*/
|
29
|
-
static parseAndVerifyRoot(root: string, publicKey: string): string {
|
29
|
+
public static parseAndVerifyRoot(root: string, publicKey: string): string {
|
30
30
|
if (!root.startsWith(this.ROOT_PREFIX))
|
31
31
|
throw new Error(
|
32
32
|
`ENRTree root entry must start with '${this.ROOT_PREFIX}'`
|
@@ -57,7 +57,7 @@ export class ENRTree {
|
|
57
57
|
return rootValues.eRoot;
|
58
58
|
}
|
59
59
|
|
60
|
-
static parseRootValues(txt: string): ENRRootValues {
|
60
|
+
public static parseRootValues(txt: string): ENRRootValues {
|
61
61
|
const matches = txt.match(
|
62
62
|
/^enrtree-root:v1 e=([^ ]+) l=([^ ]+) seq=(\d+) sig=([^ ]+)$/
|
63
63
|
);
|
@@ -86,7 +86,7 @@ export class ENRTree {
|
|
86
86
|
* The domain is the starting point for traversing a set of linked DNS TXT records
|
87
87
|
* and the public key is used to verify the root entry record
|
88
88
|
*/
|
89
|
-
static parseTree(tree: string): ENRTreeValues {
|
89
|
+
public static parseTree(tree: string): ENRTreeValues {
|
90
90
|
if (!tree.startsWith(this.TREE_PREFIX))
|
91
91
|
throw new Error(
|
92
92
|
`ENRTree tree entry must start with '${this.TREE_PREFIX}'`
|
@@ -112,7 +112,7 @@ export class ENRTree {
|
|
112
112
|
* Returns subdomains listed in an ENR branch entry. These in turn lead to
|
113
113
|
* either further branch entries or ENR records.
|
114
114
|
*/
|
115
|
-
static parseBranch(branch: string): string[] {
|
115
|
+
public static parseBranch(branch: string): string[] {
|
116
116
|
if (!branch.startsWith(this.BRANCH_PREFIX))
|
117
117
|
throw new Error(
|
118
118
|
`ENRTree branch entry must start with '${this.BRANCH_PREFIX}'`
|
@@ -35,7 +35,7 @@ export class LocalPeerCacheDiscovery
|
|
35
35
|
private isStarted: boolean;
|
36
36
|
private peers: LocalStoragePeerInfo[] = [];
|
37
37
|
|
38
|
-
constructor(
|
38
|
+
public constructor(
|
39
39
|
private readonly components: Libp2pComponents,
|
40
40
|
private readonly options?: LocalPeerCacheDiscoveryOptions
|
41
41
|
) {
|
@@ -44,11 +44,11 @@ export class LocalPeerCacheDiscovery
|
|
44
44
|
this.peers = this.getPeersFromLocalStorage();
|
45
45
|
}
|
46
46
|
|
47
|
-
get [Symbol.toStringTag](): string {
|
47
|
+
public get [Symbol.toStringTag](): string {
|
48
48
|
return "@waku/local-peer-cache-discovery";
|
49
49
|
}
|
50
50
|
|
51
|
-
async start(): Promise<void> {
|
51
|
+
public async start(): Promise<void> {
|
52
52
|
if (this.isStarted) return;
|
53
53
|
|
54
54
|
log.info("Starting Local Storage Discovery");
|
@@ -86,7 +86,7 @@ export class LocalPeerCacheDiscovery
|
|
86
86
|
this.isStarted = true;
|
87
87
|
}
|
88
88
|
|
89
|
-
stop(): void | Promise<void> {
|
89
|
+
public stop(): void | Promise<void> {
|
90
90
|
if (!this.isStarted) return;
|
91
91
|
log.info("Stopping Local Storage Discovery");
|
92
92
|
this.components.events.removeEventListener(
|
@@ -98,7 +98,7 @@ export class LocalPeerCacheDiscovery
|
|
98
98
|
this.savePeersToLocalStorage();
|
99
99
|
}
|
100
100
|
|
101
|
-
handleNewPeers = (event: CustomEvent<IdentifyResult>): void => {
|
101
|
+
public handleNewPeers = (event: CustomEvent<IdentifyResult>): void => {
|
102
102
|
const { peerId, listenAddrs } = event.detail;
|
103
103
|
|
104
104
|
const websocketMultiaddr = getWsMultiaddrFromMultiaddrs(listenAddrs);
|
package/src/peer-exchange/rpc.ts
CHANGED
@@ -7,7 +7,9 @@ import type { Uint8ArrayList } from "uint8arraylist";
|
|
7
7
|
export class PeerExchangeRPC {
|
8
8
|
public constructor(public proto: proto.PeerExchangeRPC) {}
|
9
9
|
|
10
|
-
static createRequest(
|
10
|
+
public static createRequest(
|
11
|
+
params: proto.PeerExchangeQuery
|
12
|
+
): PeerExchangeRPC {
|
11
13
|
const { numPeers } = params;
|
12
14
|
return new PeerExchangeRPC({
|
13
15
|
query: {
|
@@ -21,7 +23,7 @@ export class PeerExchangeRPC {
|
|
21
23
|
* Encode the current PeerExchangeRPC request to bytes
|
22
24
|
* @returns Uint8Array
|
23
25
|
*/
|
24
|
-
encode(): Uint8Array {
|
26
|
+
public encode(): Uint8Array {
|
25
27
|
return proto.PeerExchangeRPC.encode(this.proto);
|
26
28
|
}
|
27
29
|
|
@@ -29,16 +31,16 @@ export class PeerExchangeRPC {
|
|
29
31
|
* Decode the current PeerExchangeRPC request to bytes
|
30
32
|
* @returns Uint8Array
|
31
33
|
*/
|
32
|
-
static decode(bytes: Uint8ArrayList): PeerExchangeRPC {
|
34
|
+
public static decode(bytes: Uint8ArrayList): PeerExchangeRPC {
|
33
35
|
const res = proto.PeerExchangeRPC.decode(bytes);
|
34
36
|
return new PeerExchangeRPC(res);
|
35
37
|
}
|
36
38
|
|
37
|
-
get query(): proto.PeerExchangeQuery | undefined {
|
39
|
+
public get query(): proto.PeerExchangeQuery | undefined {
|
38
40
|
return this.proto.query;
|
39
41
|
}
|
40
42
|
|
41
|
-
get response(): proto.PeerExchangeResponse | undefined {
|
43
|
+
public get response(): proto.PeerExchangeResponse | undefined {
|
42
44
|
return this.proto.response;
|
43
45
|
}
|
44
46
|
}
|
@@ -28,22 +28,26 @@ export class WakuPeerExchange extends BaseProtocol implements IPeerExchange {
|
|
28
28
|
/**
|
29
29
|
* @param components - libp2p components
|
30
30
|
*/
|
31
|
-
constructor(
|
31
|
+
public constructor(
|
32
|
+
components: Libp2pComponents,
|
33
|
+
pubsubTopics: PubsubTopic[]
|
34
|
+
) {
|
32
35
|
super(PeerExchangeCodec, components, log, pubsubTopics);
|
33
36
|
}
|
34
37
|
|
35
38
|
/**
|
36
39
|
* Make a peer exchange query to a peer
|
37
40
|
*/
|
38
|
-
async query(
|
41
|
+
public async query(
|
39
42
|
params: PeerExchangeQueryParams
|
40
43
|
): Promise<PeerExchangeQueryResult> {
|
41
|
-
const { numPeers } = params;
|
44
|
+
const { numPeers, peerId } = params;
|
45
|
+
|
42
46
|
const rpcQuery = PeerExchangeRPC.createRequest({
|
43
47
|
numPeers: BigInt(numPeers)
|
44
48
|
});
|
45
49
|
|
46
|
-
const peer = await this.peerStore.get(
|
50
|
+
const peer = await this.peerStore.get(peerId);
|
47
51
|
if (!peer) {
|
48
52
|
return {
|
49
53
|
peerInfos: null,
|
@@ -11,9 +11,10 @@ import {
|
|
11
11
|
type Libp2pComponents,
|
12
12
|
type PeerExchangeQueryResult,
|
13
13
|
PubsubTopic,
|
14
|
+
ShardInfo,
|
14
15
|
Tags
|
15
16
|
} from "@waku/interfaces";
|
16
|
-
import { encodeRelayShard, Logger } from "@waku/utils";
|
17
|
+
import { decodeRelayShard, encodeRelayShard, Logger } from "@waku/utils";
|
17
18
|
|
18
19
|
import { PeerExchangeCodec, WakuPeerExchange } from "./waku_peer_exchange.js";
|
19
20
|
|
@@ -50,12 +51,16 @@ export interface Options {
|
|
50
51
|
maxRetries?: number;
|
51
52
|
}
|
52
53
|
|
54
|
+
interface CustomDiscoveryEvent extends PeerDiscoveryEvents {
|
55
|
+
"waku:peer-exchange:started": CustomEvent<boolean>;
|
56
|
+
}
|
57
|
+
|
53
58
|
export const DEFAULT_PEER_EXCHANGE_TAG_NAME = Tags.PEER_EXCHANGE;
|
54
59
|
const DEFAULT_PEER_EXCHANGE_TAG_VALUE = 50;
|
55
60
|
const DEFAULT_PEER_EXCHANGE_TAG_TTL = 100_000_000;
|
56
61
|
|
57
62
|
export class PeerExchangeDiscovery
|
58
|
-
extends TypedEventEmitter<
|
63
|
+
extends TypedEventEmitter<CustomDiscoveryEvent>
|
59
64
|
implements PeerDiscovery
|
60
65
|
{
|
61
66
|
private readonly components: Libp2pComponents;
|
@@ -82,7 +87,7 @@ export class PeerExchangeDiscovery
|
|
82
87
|
);
|
83
88
|
};
|
84
89
|
|
85
|
-
constructor(
|
90
|
+
public constructor(
|
86
91
|
components: Libp2pComponents,
|
87
92
|
pubsubTopics: PubsubTopic[],
|
88
93
|
options: Options = {}
|
@@ -97,11 +102,15 @@ export class PeerExchangeDiscovery
|
|
97
102
|
/**
|
98
103
|
* Start emitting events
|
99
104
|
*/
|
100
|
-
start(): void {
|
105
|
+
public start(): void {
|
101
106
|
if (this.isStarted) {
|
102
107
|
return;
|
103
108
|
}
|
104
109
|
|
110
|
+
this.dispatchEvent(
|
111
|
+
new CustomEvent("waku:peer-exchange:started", { detail: true })
|
112
|
+
);
|
113
|
+
|
105
114
|
log.info("Starting peer exchange node discovery, discovering peers");
|
106
115
|
|
107
116
|
// might be better to use "peer:identify" or "peer:update"
|
@@ -114,7 +123,7 @@ export class PeerExchangeDiscovery
|
|
114
123
|
/**
|
115
124
|
* Remove event listener
|
116
125
|
*/
|
117
|
-
stop(): void {
|
126
|
+
public stop(): void {
|
118
127
|
if (!this.isStarted) return;
|
119
128
|
log.info("Stopping peer exchange node discovery");
|
120
129
|
this.isStarted = false;
|
@@ -125,11 +134,11 @@ export class PeerExchangeDiscovery
|
|
125
134
|
);
|
126
135
|
}
|
127
136
|
|
128
|
-
get [symbol](): true {
|
137
|
+
public get [symbol](): true {
|
129
138
|
return true;
|
130
139
|
}
|
131
140
|
|
132
|
-
get [Symbol.toStringTag](): string {
|
141
|
+
public get [Symbol.toStringTag](): string {
|
133
142
|
return "@waku/peer-exchange";
|
134
143
|
}
|
135
144
|
|
@@ -190,7 +199,48 @@ export class PeerExchangeDiscovery
|
|
190
199
|
|
191
200
|
const hasPeer = await this.components.peerStore.has(peerId);
|
192
201
|
if (hasPeer) {
|
193
|
-
|
202
|
+
const { hasMultiaddrDiff, hasShardDiff } = await this.checkPeerInfoDiff(
|
203
|
+
peerInfo,
|
204
|
+
shardInfo
|
205
|
+
);
|
206
|
+
|
207
|
+
if (hasMultiaddrDiff || hasShardDiff) {
|
208
|
+
log.info(
|
209
|
+
`Peer ${peerId.toString()} has updated multiaddrs or shardInfo, updating`
|
210
|
+
);
|
211
|
+
|
212
|
+
if (hasMultiaddrDiff) {
|
213
|
+
log.info(
|
214
|
+
`Peer ${peerId.toString()} has updated multiaddrs, updating`
|
215
|
+
);
|
216
|
+
|
217
|
+
await this.components.peerStore.patch(peerId, {
|
218
|
+
multiaddrs: peerInfo.multiaddrs
|
219
|
+
});
|
220
|
+
}
|
221
|
+
|
222
|
+
if (hasShardDiff && shardInfo) {
|
223
|
+
log.info(
|
224
|
+
`Peer ${peerId.toString()} has updated shardInfo, updating`
|
225
|
+
);
|
226
|
+
await this.components.peerStore.merge(peerId, {
|
227
|
+
metadata: {
|
228
|
+
shardInfo: encodeRelayShard(shardInfo)
|
229
|
+
}
|
230
|
+
});
|
231
|
+
|
232
|
+
this.dispatchEvent(
|
233
|
+
new CustomEvent<PeerInfo>("peer", {
|
234
|
+
detail: {
|
235
|
+
id: peerId,
|
236
|
+
multiaddrs: peerInfo.multiaddrs
|
237
|
+
}
|
238
|
+
})
|
239
|
+
);
|
240
|
+
}
|
241
|
+
|
242
|
+
continue;
|
243
|
+
}
|
194
244
|
}
|
195
245
|
|
196
246
|
// update the tags for the peer
|
@@ -205,6 +255,9 @@ export class PeerExchangeDiscovery
|
|
205
255
|
metadata: {
|
206
256
|
shardInfo: encodeRelayShard(shardInfo)
|
207
257
|
}
|
258
|
+
}),
|
259
|
+
...(peerInfo.multiaddrs && {
|
260
|
+
multiaddrs: peerInfo.multiaddrs
|
208
261
|
})
|
209
262
|
});
|
210
263
|
|
@@ -228,6 +281,37 @@ export class PeerExchangeDiscovery
|
|
228
281
|
this.queryingPeers.delete(peerIdStr);
|
229
282
|
this.queryAttempts.delete(peerIdStr);
|
230
283
|
}
|
284
|
+
|
285
|
+
private async checkPeerInfoDiff(
|
286
|
+
peerInfo: PeerInfo,
|
287
|
+
shardInfo?: ShardInfo
|
288
|
+
): Promise<{ hasMultiaddrDiff: boolean; hasShardDiff: boolean }> {
|
289
|
+
const { id: peerId } = peerInfo;
|
290
|
+
const peer = await this.components.peerStore.get(peerId);
|
291
|
+
|
292
|
+
const existingMultiaddrs = peer.addresses.map((a) =>
|
293
|
+
a.multiaddr.toString()
|
294
|
+
);
|
295
|
+
const newMultiaddrs = peerInfo.multiaddrs.map((ma) => ma.toString());
|
296
|
+
const hasMultiaddrDiff = existingMultiaddrs.some(
|
297
|
+
(ma) => !newMultiaddrs.includes(ma)
|
298
|
+
);
|
299
|
+
|
300
|
+
let hasShardDiff: boolean = false;
|
301
|
+
const existingShardInfoBytes = peer.metadata.get("shardInfo");
|
302
|
+
if (existingShardInfoBytes) {
|
303
|
+
const existingShardInfo = decodeRelayShard(existingShardInfoBytes);
|
304
|
+
if (existingShardInfo || shardInfo) {
|
305
|
+
hasShardDiff =
|
306
|
+
existingShardInfo.clusterId !== shardInfo?.clusterId ||
|
307
|
+
existingShardInfo.shards.some(
|
308
|
+
(shard) => !shardInfo?.shards.includes(shard)
|
309
|
+
);
|
310
|
+
}
|
311
|
+
}
|
312
|
+
|
313
|
+
return { hasMultiaddrDiff, hasShardDiff };
|
314
|
+
}
|
231
315
|
}
|
232
316
|
|
233
317
|
export function wakuPeerExchangeDiscovery(
|