Skip to content

Commit 67e8ae3

Browse files
authored
fix: update interfaces (#59)
Updates to latest code from libp2p/js-libp2p-interfaces#180
1 parent 87f0b78 commit 67e8ae3

File tree

3 files changed

+53
-72
lines changed

3 files changed

+53
-72
lines changed

package.json

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -130,19 +130,22 @@
130130
"release": "semantic-release"
131131
},
132132
"dependencies": {
133-
"@libp2p/interfaces": "^1.3.11",
134-
"@libp2p/logger": "^1.0.4",
135-
"multiformats": "^9.0.2",
133+
"@libp2p/interfaces": "^1.3.14",
134+
"@libp2p/logger": "^1.1.2",
135+
"@multiformats/multiaddr": "^10.1.7",
136+
"err-code": "^3.0.1",
137+
"multiformats": "^9.6.3",
136138
"p-defer": "^4.0.0",
137139
"p-queue": "^7.2.0"
138140
},
139141
"devDependencies": {
140-
"@libp2p/peer-id": "^1.1.5",
141-
"@libp2p/peer-id-factory": "^1.0.5",
142+
"@libp2p/peer-id": "^1.1.8",
143+
"@libp2p/peer-id-factory": "^1.0.8",
142144
"aegir": "^36.1.3",
143145
"go-ipfs": "^0.12.0",
144146
"ipfs-http-client": "^56.0.1",
145147
"ipfsd-ctl": "^10.0.6",
148+
"it-all": "^1.0.6",
146149
"wherearewe": "^1.0.0"
147150
},
148151
"browser": {

src/index.ts

Lines changed: 33 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,22 @@ import { logger } from '@libp2p/logger'
22
import { base58btc } from 'multiformats/bases/base58'
33
import PQueue from 'p-queue'
44
import defer from 'p-defer'
5+
import errCode from 'err-code'
6+
import { Multiaddr } from '@multiformats/multiaddr'
7+
import { peerIdFromString } from '@libp2p/peer-id'
58
import type { PeerId } from '@libp2p/interfaces/peer-id'
69
import type { IPFSHTTPClient } from 'ipfs-http-client'
710
import type { HTTPClientExtraOptions } from 'ipfs-http-client/types/src/types'
811
import type { AbortOptions } from 'ipfs-core-types/src/utils'
12+
import type { PeerRouting } from '@libp2p/interfaces/peer-routing'
13+
import type { PeerData } from '@libp2p/interfaces/peer-data'
914

1015
const log = logger('libp2p-delegated-peer-routing')
1116

1217
const DEFAULT_TIMEOUT = 30e3 // 30 second default
1318
const CONCURRENT_HTTP_REQUESTS = 4
1419

15-
export class DelegatedPeerRouting {
20+
export class DelegatedPeerRouting implements PeerRouting {
1621
private readonly client: IPFSHTTPClient
1722
private readonly httpQueue: PQueue
1823

@@ -44,7 +49,7 @@ export class DelegatedPeerRouting {
4449
/**
4550
* Attempts to find the given peer
4651
*/
47-
async * findPeer (id: PeerId, options: HTTPClientExtraOptions & AbortOptions = {}) {
52+
async findPeer (id: PeerId, options: HTTPClientExtraOptions & AbortOptions = {}) {
4853
log('findPeer starts: %p', id)
4954
options.timeout = options.timeout ?? DEFAULT_TIMEOUT
5055

@@ -57,21 +62,31 @@ export class DelegatedPeerRouting {
5762
})
5863

5964
try {
60-
yield * this.client.dht.findPeer(id.toString(), {
65+
await onStart.promise
66+
67+
for await (const event of this.client.dht.findPeer(id.toString(), {
6168
timeout: options.timeout
62-
})
69+
})) {
70+
if (event.name === 'FINAL_PEER') {
71+
const peerData: PeerData = {
72+
id: peerIdFromString(event.peer.id),
73+
multiaddrs: event.peer.multiaddrs.map(ma => new Multiaddr(ma.toString())),
74+
protocols: []
75+
}
76+
77+
return peerData
78+
}
79+
}
6380
} catch (err: any) {
6481
log.error('findPeer errored: %o', err)
6582

66-
if (err.message.includes('not found')) { // eslint-disable-line @typescript-eslint/strict-boolean-expressions
67-
return
68-
}
69-
7083
throw err
7184
} finally {
7285
onFinish.resolve()
7386
log('findPeer finished: %p', id)
7487
}
88+
89+
throw errCode(new Error('Not found'), 'ERR_NOT_FOUND')
7590
}
7691

7792
/**
@@ -94,9 +109,17 @@ export class DelegatedPeerRouting {
94109
try {
95110
await onStart.promise
96111

97-
yield * this.client.dht.query(keyStr, {
112+
for await (const event of this.client.dht.query(keyStr, {
98113
timeout: options.timeout
99-
})
114+
})) {
115+
if (event.name === 'PEER_RESPONSE') {
116+
yield * event.closer.map(closer => ({
117+
id: peerIdFromString(closer.id),
118+
multiaddrs: closer.multiaddrs.map(ma => new Multiaddr(ma.toString())),
119+
protocols: []
120+
}))
121+
}
122+
}
100123
} catch (err) {
101124
log.error('getClosestPeers errored:', err)
102125
throw err

test/index.spec.ts

Lines changed: 12 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@ import { DelegatedPeerRouting } from '../src/index.js'
99
import goIpfs from 'go-ipfs'
1010
import { peerIdFromString } from '@libp2p/peer-id'
1111
import { createEd25519PeerId } from '@libp2p/peer-id-factory'
12+
import all from 'it-all'
1213
import type { IDResult } from 'ipfs-core-types/src/root'
13-
import type { PeerData } from 'ipfs-core-types/src/dht'
1414

1515
const factory = createFactory({
1616
type: 'go',
@@ -107,22 +107,12 @@ describe('DelegatedPeerRouting', function () {
107107
host: opts.host
108108
}))
109109

110-
let peer: PeerData | undefined
111-
112-
for await (const event of router.findPeer(peerIdFromString(peerIdToFind.id))) {
113-
if (event.name === 'FINAL_PEER') {
114-
peer = event.peer
115-
}
116-
}
117-
118-
if (peer == null) {
119-
throw new Error('Did not find peer')
120-
}
110+
const peer = await router.findPeer(peerIdFromString(peerIdToFind.id))
121111

122112
const { id, multiaddrs } = peer
123113
expect(id).to.exist()
124114
expect(multiaddrs).to.exist()
125-
expect(id).to.eql(peerIdToFind.id)
115+
expect(id.equals(peerIdToFind.id)).to.be.true()
126116
})
127117

128118
it('should be able to find peers via the delegate with a peerid', async () => {
@@ -133,17 +123,7 @@ describe('DelegatedPeerRouting', function () {
133123
host: opts.host
134124
}))
135125

136-
let peer: PeerData | undefined
137-
138-
for await (const event of router.findPeer(peerIdFromString(peerIdToFind.id))) {
139-
if (event.name === 'FINAL_PEER') {
140-
peer = event.peer
141-
}
142-
}
143-
144-
if (peer == null) {
145-
throw new Error('Did not find peer')
146-
}
126+
const peer = await router.findPeer(peerIdFromString(peerIdToFind.id))
147127

148128
const { id, multiaddrs } = peer
149129
expect(id).to.exist()
@@ -160,17 +140,7 @@ describe('DelegatedPeerRouting', function () {
160140
host: opts.host
161141
}))
162142

163-
let peer: PeerData | undefined
164-
165-
for await (const event of router.findPeer(peerIdFromString(peerIdToFind.id), { timeout: 2000 })) {
166-
if (event.name === 'FINAL_PEER') {
167-
peer = event.peer
168-
}
169-
}
170-
171-
if (peer == null) {
172-
throw new Error('Did not find peer')
173-
}
143+
const peer = await router.findPeer(peerIdFromString(peerIdToFind.id), { timeout: 2000 })
174144

175145
const { id, multiaddrs } = peer
176146
expect(id).to.exist()
@@ -189,11 +159,8 @@ describe('DelegatedPeerRouting', function () {
189159

190160
// This is one of the default Bootstrap nodes, but we're not connected to it
191161
// so we'll test with it.
192-
for await (const event of router.findPeer(peerIdFromString('QmSoLV4Bbm51jM9C4gDYZQ9Cy3U6aXMJDAbzgu2fzaDs64'))) {
193-
if (event.name === 'FINAL_PEER') {
194-
throw new Error('Should not have found peer')
195-
}
196-
}
162+
await expect(router.findPeer(peerIdFromString('QmSoLV4Bbm51jM9C4gDYZQ9Cy3U6aXMJDAbzgu2fzaDs64')))
163+
.to.eventually.be.rejected.with.property('code', 'ERR_NOT_FOUND')
197164
})
198165
})
199166

@@ -212,19 +179,13 @@ describe('DelegatedPeerRouting', function () {
212179

213180
const key = peerIdFromString(peerIdToFind.id).toBytes()
214181

215-
const closerPeers: PeerData[] = []
216-
217-
for await (const event of router.getClosestPeers(key)) {
218-
if (event.name === 'PEER_RESPONSE') {
219-
closerPeers.push(...event.closer)
220-
}
221-
}
182+
const closerPeers = await all(router.getClosestPeers(key))
222183

223184
// we should be closest to the 2 other peers
224185
expect(closerPeers.length).to.equal(2)
225186
closerPeers.forEach(result => {
226-
// shouldnt be the delegate
227-
expect(delegatePeerId.equals(peerIdFromString(result.id))).to.equal(false)
187+
// shouldn't be the delegate
188+
expect(delegatePeerId.equals(result.id)).to.equal(false)
228189
expect(result.multiaddrs).to.be.an('array')
229190
})
230191
})
@@ -242,19 +203,13 @@ describe('DelegatedPeerRouting', function () {
242203
const delegatePeerId = peerIdFromString(nodeId.id)
243204

244205
const peerId = await createEd25519PeerId()
245-
const closerPeers: PeerData[] = []
246-
247-
for await (const event of router.getClosestPeers(peerId.toBytes())) {
248-
if (event.name === 'PEER_RESPONSE') {
249-
closerPeers.push(...event.closer)
250-
}
251-
}
206+
const closerPeers = await all(router.getClosestPeers(peerId.toBytes()))
252207

253208
// we should be closest to the 2 other peers
254209
expect(closerPeers.length).to.equal(2)
255210
closerPeers.forEach(result => {
256211
// shouldnt be the delegate
257-
expect(delegatePeerId.equals(peerIdFromString(result.id))).to.equal(false)
212+
expect(delegatePeerId.equals(result.id)).to.equal(false)
258213
expect(result.multiaddrs).to.be.an('array')
259214
})
260215
})

0 commit comments

Comments
 (0)