From fb34b7262a8d85fdf76cb30774d14bcd3a150f58 Mon Sep 17 00:00:00 2001 From: Arseniy Klempner Date: Mon, 29 Apr 2024 15:39:02 -0700 Subject: [PATCH] fix: only override ping metadata in peer store (#1984) Co-authored-by: Sasha <118575614+weboko@users.noreply.github.com> --- packages/core/src/lib/keep_alive_manager.ts | 2 +- packages/tests/tests/metadata.spec.ts | 31 +++++++++++++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/packages/core/src/lib/keep_alive_manager.ts b/packages/core/src/lib/keep_alive_manager.ts index 34e4ed7f0..3051a53f5 100644 --- a/packages/core/src/lib/keep_alive_manager.ts +++ b/packages/core/src/lib/keep_alive_manager.ts @@ -56,7 +56,7 @@ export class KeepAliveManager { } try { - await peerStore.patch(peerId, { + await peerStore.merge(peerId, { metadata: { ping: utf8ToBytes(ping.toString()) } diff --git a/packages/tests/tests/metadata.spec.ts b/packages/tests/tests/metadata.spec.ts index b501d8661..95a5cb410 100644 --- a/packages/tests/tests/metadata.spec.ts +++ b/packages/tests/tests/metadata.spec.ts @@ -233,4 +233,35 @@ describe("Metadata Protocol", function () { expect(metadataShardInfo!.clusterId).to.eq(shardInfo.clusterId); expect(metadataShardInfo.shards).to.include.members(shardInfo.shards); }); + + it("receiving a ping from a peer does not overwrite shard info", async function () { + const shardInfo: ShardInfo = { + clusterId: 2, + shards: [1] + }; + + await nwaku1.start({ + relay: true, + discv5Discovery: true, + peerExchange: true, + clusterId: shardInfo.clusterId, + pubsubTopic: shardInfoToPubsubTopics(shardInfo) + }); + + const nwaku1Ma = await nwaku1.getMultiaddrWithId(); + const nwaku1PeerId = await nwaku1.getPeerId(); + + waku = await createLightNode({ shardInfo, pingKeepAlive: 1 }); + await waku.start(); + await waku.libp2p.dialProtocol(nwaku1Ma, MetadataCodec); + + // delay to ensure the connection is estabilished, shardInfo is updated, and there is a ping + await delay(1500); + + const metadata = (await waku.libp2p.peerStore.get(nwaku1PeerId)).metadata; + expect(metadata.get("shardInfo")).to.not.be.undefined; + + const pingInfo = metadata.get("ping"); + expect(pingInfo).to.not.be.undefined; + }); });