feat: Filter reacts to peer:disconnect event, add tests

This commit is contained in:
Danish Arora 2024-10-09 11:45:14 +05:30
parent ed138cc3c9
commit 43fa32b43a
No known key found for this signature in database
GPG Key ID: 1C6EF37CDAE1426E
4 changed files with 65 additions and 4 deletions

View File

@ -53,7 +53,8 @@ export class SubscriptionManager implements ISubscription {
this.getPeers.bind(this),
this.renewPeer.bind(this),
() => Array.from(this.subscriptionCallbacks.keys()),
this.protocol.subscribe.bind(this.protocol)
this.protocol.subscribe.bind(this.protocol),
this.protocol.addLibp2pEventListener.bind(this.protocol)
);
}

View File

@ -2,6 +2,7 @@ import type { Peer, PeerId } from "@libp2p/interface";
import {
ContentTopic,
CoreProtocolResult,
Libp2p,
PubsubTopic
} from "@waku/interfaces";
@ -24,7 +25,8 @@ export class ReliabilityMonitorManager {
pubsubTopic: PubsubTopic,
peer: Peer,
contentTopics: ContentTopic[]
) => Promise<CoreProtocolResult>
) => Promise<CoreProtocolResult>,
addLibp2pEventListener: Libp2p["addEventListener"]
): ReceiverReliabilityMonitor {
if (ReliabilityMonitorManager.receiverMonitors.has(pubsubTopic)) {
return ReliabilityMonitorManager.receiverMonitors.get(pubsubTopic)!;
@ -35,7 +37,8 @@ export class ReliabilityMonitorManager {
getPeers,
renewPeer,
getContentTopics,
protocolSubscribe
protocolSubscribe,
addLibp2pEventListener
);
ReliabilityMonitorManager.receiverMonitors.set(pubsubTopic, monitor);
return monitor;

View File

@ -3,6 +3,7 @@ import {
ContentTopic,
CoreProtocolResult,
IProtoMessage,
Libp2p,
PeerIdStr,
PubsubTopic
} from "@waku/interfaces";
@ -38,7 +39,8 @@ export class ReceiverReliabilityMonitor {
pubsubTopic: PubsubTopic,
peer: Peer,
contentTopics: ContentTopic[]
) => Promise<CoreProtocolResult>
) => Promise<CoreProtocolResult>,
private addLibp2pEventListener: Libp2p["addEventListener"]
) {
const allPeerIdStr = this.getPeers().map((p) => p.id.toString());
@ -49,6 +51,13 @@ export class ReceiverReliabilityMonitor {
}
};
allPeerIdStr.forEach((peerId) => this.missedMessagesByPeer.set(peerId, 0));
this.addLibp2pEventListener("peer:disconnect", (evt) => {
const peerId = evt.detail;
if (this.getPeers().some((p) => p.id.equals(peerId))) {
void this.renewAndSubscribePeer(peerId);
}
});
}
public setMaxMissedMessagesThreshold(value: number | undefined): void {

View File

@ -272,4 +272,52 @@ describe("Waku Filter: Peer Management: E2E", function () {
expect(waku.filter.connectedPeers.length).to.equal(2);
});
it("Renews peer for Filter on peer:disconnect event", async function () {
this.timeout(30000);
const messages: DecodedMessage[] = [];
const { error, subscription } = await waku.filter.subscribe(
[decoder],
(msg) => {
messages.push(msg);
}
);
if (error) {
throw error;
}
const initialPeers = waku.filter.connectedPeers;
expect(initialPeers.length).to.equal(waku.filter.numPeersToUse);
const peerToDisconnect = initialPeers[0];
await waku.connectionManager.dropConnection(peerToDisconnect.id);
await delay(5000);
expect(waku.filter.connectedPeers.length).to.equal(
waku.filter.numPeersToUse
);
const stillConnected = waku.filter.connectedPeers.some((peer) =>
peer.id.equals(peerToDisconnect.id)
);
expect(stillConnected).to.be.false;
await waku.lightPush.send(encoder, {
payload: utf8ToBytes("Hello after disconnect")
});
await delay(2000);
expect(messages.length).to.equal(1);
expect(new TextDecoder().decode(messages[0].payload)).to.equal(
"Hello after disconnect"
);
const pingResult = await subscription.ping();
expect(pingResult.successes.length).to.equal(waku.filter.numPeersToUse);
expect(pingResult.failures.length).to.equal(0);
});
});