fix: yield only final peers from dht getClosestPeers (#1380)

* fix: yield final peers from dht getClosestPeers

`PEER_RESPONSE` is an intermediate event, we should only yield from `FINAL_PEER` events as we'll only get `K` of those.

* chore: fix test
This commit is contained in:
Alex Potsides 2022-09-23 09:31:04 +01:00 committed by GitHub
parent 62198414b3
commit 3f57edaf3b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 12 additions and 19 deletions

View File

@ -27,8 +27,8 @@ export class DHTPeerRouting implements PeerRouting {
async * getClosestPeers (key: Uint8Array, options: AbortOptions = {}) { async * getClosestPeers (key: Uint8Array, options: AbortOptions = {}) {
for await (const event of this.dht.getClosestPeers(key, options)) { for await (const event of this.dht.getClosestPeers(key, options)) {
if (event.name === 'PEER_RESPONSE') { if (event.name === 'FINAL_PEER') {
yield * event.closer yield event.peer
} }
} }
} }

View File

@ -112,16 +112,15 @@ describe('peer-routing', () => {
const dhtGetClosestPeersStub = sinon.stub(nodes[0].dht, 'getClosestPeers').callsFake(async function * () { const dhtGetClosestPeersStub = sinon.stub(nodes[0].dht, 'getClosestPeers').callsFake(async function * () {
yield { yield {
from: nodes[2].peerId, from: nodes[2].peerId,
type: EventTypes.PEER_RESPONSE, type: EventTypes.FINAL_PEER,
name: 'PEER_RESPONSE', name: 'FINAL_PEER',
messageName: 'FIND_NODE', messageName: 'FIND_NODE',
messageType: MessageType.FIND_NODE, messageType: MessageType.FIND_NODE,
closer: [{ peer: {
id: nodes[1].peerId, id: nodes[1].peerId,
multiaddrs: [], multiaddrs: [],
protocols: [] protocols: []
}], }
providers: []
} }
}) })
@ -589,26 +588,20 @@ describe('peer-routing', () => {
const peerStoreAddressBookAddStub = sinon.spy(node.peerStore.addressBook, 'add') const peerStoreAddressBookAddStub = sinon.spy(node.peerStore.addressBook, 'add')
const dhtGetClosestPeersStub = sinon.stub(node.dht, 'getClosestPeers').callsFake(async function * () { const dhtGetClosestPeersStub = sinon.stub(node.dht, 'getClosestPeers').callsFake(async function * () {
yield { yield {
name: 'PEER_RESPONSE', name: 'FINAL_PEER',
type: EventTypes.PEER_RESPONSE, type: EventTypes.FINAL_PEER,
messageName: 'FIND_NODE', messageName: 'FIND_NODE',
messageType: MessageType.FIND_NODE, messageType: MessageType.FIND_NODE,
from: peerIds[0], from: peerIds[0],
closer: [ peer: results[0]
results[0]
],
providers: []
} }
yield { yield {
name: 'PEER_RESPONSE', name: 'FINAL_PEER',
type: EventTypes.PEER_RESPONSE, type: EventTypes.FINAL_PEER,
messageName: 'FIND_NODE', messageName: 'FIND_NODE',
messageType: MessageType.FIND_NODE, messageType: MessageType.FIND_NODE,
from: peerIds[0], from: peerIds[0],
closer: [ peer: results[1]
results[1]
],
providers: []
} }
}) })