@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.
@@ -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
- continue;
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":"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"}
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-ce62600.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":">=18"},"dependencies":{"@waku/interfaces":"0.0.26-ce62600.0","@waku/proto":"0.0.8-ce62600.0","@waku/enr":"0.0.25-ce62600.0","@waku/core":"0.0.31-ce62600.0","@waku/utils":"0.0.19-ce62600.0","debug":"^4.3.4","dns-query":"^0.11.2","hi-base32":"^0.5.1","uint8arrays":"^5.0.1"},"devDependencies":{"@libp2p/peer-id":"^4.0.4","@libp2p/peer-id-factory":"^4.0.5","@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/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-ce62600.0","@waku/enr":"0.0.25-ce62600.0","@waku/interfaces":"0.0.26-ce62600.0","@waku/proto":"0.0.8-ce62600.0","@waku/utils":"0.0.19-ce62600.0","@libp2p/interface":"^1.1.2"},"peerDependenciesMeta":{"@waku/interfaces":{"optional":true},"@libp2p/interface":{"optional":true}},"files":["dist","bundle","src/**/*.ts","!**/*.spec.*","!**/*.json","CHANGELOG.md","LICENSE","README.md"]}
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"]}
@@ -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> {
@@ -36,7 +36,10 @@ export class PeerDiscoveryDns
36
36
  private _components: DnsDiscoveryComponents;
37
37
  private _options: DnsDiscOptions;
38
38
 
39
- constructor(components: DnsDiscoveryComponents, options: DnsDiscOptions) {
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(
@@ -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);
@@ -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(params: proto.PeerExchangeQuery): PeerExchangeRPC {
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(components: Libp2pComponents, pubsubTopics: PubsubTopic[]) {
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(params.peerId);
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<PeerDiscoveryEvents>
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
- continue;
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(