mirror of https://github.com/waku-org/js-waku.git
Check against gossipsub protocol was also done in publish
Meaning it would sometimes fail to recognize another waku node at a subscriber of a topic, depending on timing with the `subscribe` call.
This commit is contained in:
parent
f35322967d
commit
95b88d2815
|
@ -73,24 +73,13 @@ describe('Waku Relay', () => {
|
||||||
expect(protocols.findIndex((value) => value.match(/sub/))).to.eq(-1);
|
expect(protocols.findIndex((value) => value.match(/sub/))).to.eq(-1);
|
||||||
});
|
});
|
||||||
|
|
||||||
// TODO: Fix this
|
it('Publish', async function () {
|
||||||
it.skip('Publish', async function () {
|
|
||||||
this.timeout(10000);
|
this.timeout(10000);
|
||||||
|
|
||||||
const message = WakuMessage.fromUtf8String('JS to JS communication works');
|
const message = WakuMessage.fromUtf8String('JS to JS communication works');
|
||||||
// waku.libp2p.pubsub.globalSignaturePolicy = 'StrictSign';
|
|
||||||
|
|
||||||
const receivedPromise = waitForNextData(waku2.libp2p.pubsub);
|
const receivedPromise = waitForNextData(waku2.libp2p.pubsub);
|
||||||
|
|
||||||
await Promise.all([
|
|
||||||
new Promise((resolve) =>
|
|
||||||
waku1.libp2p.pubsub.once('gossipsub:heartbeat', resolve)
|
|
||||||
),
|
|
||||||
new Promise((resolve) =>
|
|
||||||
waku2.libp2p.pubsub.once('gossipsub:heartbeat', resolve)
|
|
||||||
),
|
|
||||||
]);
|
|
||||||
|
|
||||||
await waku1.relay.publish(message);
|
await waku1.relay.publish(message);
|
||||||
|
|
||||||
const receivedMsg = await receivedPromise;
|
const receivedMsg = await receivedPromise;
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
import Gossipsub from 'libp2p-gossipsub';
|
import Gossipsub from 'libp2p-gossipsub';
|
||||||
import { Libp2p } from 'libp2p-gossipsub/src/interfaces';
|
import { Libp2p } from 'libp2p-gossipsub/src/interfaces';
|
||||||
import Pubsub from 'libp2p-interfaces/src/pubsub';
|
import { createGossipRpc, messageIdToString } from 'libp2p-gossipsub/src/utils';
|
||||||
|
import Pubsub, { InMessage } from 'libp2p-interfaces/src/pubsub';
|
||||||
import { SignaturePolicy } from 'libp2p-interfaces/src/pubsub/signature-policy';
|
import { SignaturePolicy } from 'libp2p-interfaces/src/pubsub/signature-policy';
|
||||||
|
|
||||||
import { getWakuPeers } from './get_waku_peers';
|
import { getWakuPeers } from './get_waku_peers';
|
||||||
|
@ -87,9 +88,78 @@ export class WakuRelayPubsub extends Gossipsub {
|
||||||
this._sendGraft(id, topic);
|
this._sendGraft(id, topic);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Publish messages
|
||||||
|
*
|
||||||
|
* @override
|
||||||
|
* @param {InMessage} msg
|
||||||
|
* @returns {void}
|
||||||
|
*/
|
||||||
|
async _publish(msg: InMessage): Promise<void> {
|
||||||
|
if (msg.receivedFrom !== this.peerId.toB58String()) {
|
||||||
|
this.score.deliverMessage(msg);
|
||||||
|
this.gossipTracer.deliverMessage(msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
const msgID = this.getMsgId(msg);
|
||||||
|
const msgIdStr = messageIdToString(msgID);
|
||||||
|
// put in seen cache
|
||||||
|
this.seenCache.put(msgIdStr);
|
||||||
|
|
||||||
|
this.messageCache.put(msg);
|
||||||
|
|
||||||
|
const toSend = new Set<string>();
|
||||||
|
msg.topicIDs.forEach((topic) => {
|
||||||
|
const peersInTopic = this.topics.get(topic);
|
||||||
|
if (!peersInTopic) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// direct peers
|
||||||
|
this.direct.forEach((id) => {
|
||||||
|
toSend.add(id);
|
||||||
|
});
|
||||||
|
|
||||||
|
let meshPeers = this.mesh.get(topic);
|
||||||
|
if (!meshPeers || !meshPeers.size) {
|
||||||
|
// We are not in the mesh for topic, use fanout peers
|
||||||
|
meshPeers = this.fanout.get(topic);
|
||||||
|
if (!meshPeers) {
|
||||||
|
// If we are not in the fanout, then pick peers in topic above the publishThreshold
|
||||||
|
const peers = getWakuPeers(this, topic, this._options.D, (id) => {
|
||||||
|
return (
|
||||||
|
this.score.score(id) >=
|
||||||
|
this._options.scoreThresholds.publishThreshold
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
if (peers.size > 0) {
|
||||||
|
meshPeers = peers;
|
||||||
|
this.fanout.set(topic, peers);
|
||||||
|
} else {
|
||||||
|
meshPeers = new Set();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Store the latest publishing time
|
||||||
|
this.lastpub.set(topic, this._now());
|
||||||
|
}
|
||||||
|
|
||||||
|
meshPeers!.forEach((peer) => {
|
||||||
|
toSend.add(peer);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
// Publish messages to peers
|
||||||
|
const rpc = createGossipRpc([Gossipsub.utils.normalizeOutRpcMessage(msg)]);
|
||||||
|
toSend.forEach((id) => {
|
||||||
|
if (id === msg.from) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this._sendRpc(id, rpc);
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: Implement dial for an address with format '/ip4/127.0.0.1/tcp/60000/p2p/16Uiu2HAkyzsXzENw5XBDYEQQAeQTCYjBJpMLgBmEXuwbtcrgxBJ4'
|
|
||||||
// This class provides an interface to execute the waku relay protocol
|
// This class provides an interface to execute the waku relay protocol
|
||||||
export class WakuRelay {
|
export class WakuRelay {
|
||||||
constructor(private pubsub: Pubsub) {}
|
constructor(private pubsub: Pubsub) {}
|
||||||
|
|
Loading…
Reference in New Issue