Skip to content
This repository was archived by the owner on Jul 21, 2023. It is now read-only.

Commit c84fa2a

Browse files
authored
fix: return self when asked for self (#318)
Restores pre-1.x behaviour where when an RPC findNode request comes in, if it's asking for us, return our info instead of looking for closer peers which queries the routing table which may not have our peer id in it.
1 parent ad7c1ec commit c84fa2a

File tree

3 files changed

+45
-29
lines changed

3 files changed

+45
-29
lines changed

src/rpc/handlers/find-node.ts

+22-14
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,14 @@ import {
44
removePrivateAddresses,
55
removePublicAddresses
66
} from '../../utils.js'
7-
import { pipe } from 'it-pipe'
7+
import { equals as uint8ArrayEquals } from 'uint8arrays'
8+
import { Components } from '@libp2p/interfaces/components'
9+
import { protocols } from '@multiformats/multiaddr'
10+
import type { Initializable } from '@libp2p/interfaces/components'
11+
import type { PeerInfo } from '@libp2p/interfaces/peer-info'
812
import type { DHTMessageHandler } from '../index.js'
913
import type { PeerRouting } from '../../peer-routing/index.js'
1014
import type { PeerId } from '@libp2p/interfaces/peer-id'
11-
import map from 'it-map'
12-
import filter from 'it-filter'
13-
import all from 'it-all'
14-
import type { Initializable } from '@libp2p/interfaces/components'
1515

1616
const log = logger('libp2p:kad-dht:rpc:handlers:find-node')
1717

@@ -23,15 +23,16 @@ export interface FindNodeHandlerInit {
2323
export class FindNodeHandler implements DHTMessageHandler, Initializable {
2424
private readonly peerRouting: PeerRouting
2525
private readonly lan: boolean
26+
private components = new Components()
2627

2728
constructor (init: FindNodeHandlerInit) {
2829
const { peerRouting, lan } = init
2930
this.peerRouting = peerRouting
3031
this.lan = Boolean(lan)
3132
}
3233

33-
init (): void {
34-
34+
init (components: Components): void {
35+
this.components = components
3536
}
3637

3738
/**
@@ -40,14 +41,21 @@ export class FindNodeHandler implements DHTMessageHandler, Initializable {
4041
async handle (peerId: PeerId, msg: Message) {
4142
log('incoming request from %p for peers closer to %b', peerId, msg.key)
4243

43-
const mapper = this.lan ? removePublicAddresses : removePrivateAddresses
44+
let closer: PeerInfo[] = []
45+
46+
if (uint8ArrayEquals(this.components.getPeerId().toBytes(), msg.key)) {
47+
closer = [{
48+
id: this.components.getPeerId(),
49+
multiaddrs: this.components.getAddressManager().getAddresses().map(ma => ma.decapsulateCode(protocols('p2p').code)),
50+
protocols: []
51+
}]
52+
} else {
53+
closer = await this.peerRouting.getCloserPeersOffline(msg.key, peerId)
54+
}
4455

45-
const closer = await pipe(
46-
await this.peerRouting.getCloserPeersOffline(msg.key, peerId),
47-
(source) => map(source, mapper),
48-
(source) => filter(source, ({ multiaddrs }) => multiaddrs.length > 0),
49-
async (source) => await all(source)
50-
)
56+
closer = closer
57+
.map(this.lan ? removePublicAddresses : removePrivateAddresses)
58+
.filter(({ multiaddrs }) => multiaddrs.length)
5159

5260
const response = new Message(msg.type, new Uint8Array(0), msg.clusterLevel)
5361

src/rpc/index.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ import type { PeerRouting } from '../peer-routing'
1616
import type { Validators } from '@libp2p/interfaces/dht'
1717
import type { Components, Initializable } from '@libp2p/interfaces/components'
1818

19-
export interface DHTMessageHandler {
19+
export interface DHTMessageHandler extends Initializable {
2020
handle: (peerId: PeerId, msg: Message) => Promise<Message | undefined>
2121
}
2222

@@ -29,7 +29,7 @@ export interface RPCInit {
2929
}
3030

3131
export class RPC implements Initializable {
32-
private readonly handlers: Record<string, DHTMessageHandler & Initializable>
32+
private readonly handlers: Record<string, DHTMessageHandler>
3333
private readonly routingTable: RoutingTable
3434
private readonly log: Logger
3535

test/rpc/handlers/find-node.spec.ts

+21-13
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,14 @@ import { Message, MESSAGE_TYPE } from '../../../src/message/index.js'
55
import { FindNodeHandler } from '../../../src/rpc/handlers/find-node.js'
66
import { Multiaddr } from '@multiformats/multiaddr'
77
import { createPeerId } from '../../utils/create-peer-id.js'
8-
import type { PeerId } from '@libp2p/interfaces/peer-id'
9-
import type { DHTMessageHandler } from '../../../src/rpc/index.js'
108
import { PeerRouting } from '../../../src/peer-routing/index.js'
119
import Sinon, { SinonStubbedInstance } from 'sinon'
10+
import { Components } from '@libp2p/interfaces/components'
11+
import type { PeerId } from '@libp2p/interfaces/peer-id'
12+
import type { DHTMessageHandler } from '../../../src/rpc/index.js'
13+
import type { AddressManager } from '@libp2p/interfaces'
14+
import { stubInterface } from 'ts-sinon'
15+
import type { StubbedInstance } from 'ts-sinon'
1216

1317
const T = MESSAGE_TYPE.FIND_NODE
1418

@@ -18,33 +22,33 @@ describe('rpc - handlers - FindNode', () => {
1822
let targetPeer: PeerId
1923
let handler: DHTMessageHandler
2024
let peerRouting: SinonStubbedInstance<PeerRouting>
25+
let addressManager: StubbedInstance<AddressManager>
2126

2227
beforeEach(async () => {
2328
peerId = await createPeerId()
2429
sourcePeer = await createPeerId()
2530
targetPeer = await createPeerId()
2631
peerRouting = Sinon.createStubInstance(PeerRouting)
32+
addressManager = stubInterface<AddressManager>()
2733

2834
handler = new FindNodeHandler({
2935
peerRouting,
3036
lan: false
3137
})
38+
handler.init(new Components({
39+
peerId,
40+
addressManager
41+
}))
3242
})
3343

3444
it('returns self, if asked for self', async () => {
3545
const msg = new Message(T, peerId.multihash.bytes, 0)
3646

37-
peerRouting.getCloserPeersOffline
38-
.withArgs(peerId.multihash.bytes, sourcePeer)
39-
.resolves([{
40-
id: peerId,
41-
multiaddrs: [
42-
new Multiaddr('/ip4/127.0.0.1/tcp/4002'),
43-
new Multiaddr('/ip4/192.168.1.5/tcp/4002'),
44-
new Multiaddr('/ip4/221.4.67.0/tcp/4002')
45-
],
46-
protocols: []
47-
}])
47+
addressManager.getAddresses.returns([
48+
new Multiaddr(`/ip4/127.0.0.1/tcp/4002/p2p/${peerId.toString()}`),
49+
new Multiaddr(`/ip4/192.168.1.5/tcp/4002/p2p/${peerId.toString()}`),
50+
new Multiaddr(`/ip4/221.4.67.0/tcp/4002/p2p/${peerId.toString()}`)
51+
])
4852

4953
const response = await handler.handle(sourcePeer, msg)
5054

@@ -115,6 +119,10 @@ describe('rpc - handlers - FindNode', () => {
115119
peerRouting,
116120
lan: true
117121
})
122+
handler.init(new Components({
123+
peerId,
124+
addressManager
125+
}))
118126

119127
const response = await handler.handle(sourcePeer, msg)
120128

0 commit comments

Comments
 (0)