Skip to content

Commit a3816b1

Browse files
authored
fix!: remove @libp2p/components (#90)
`@libp2p/components` is a choke-point for our dependency graph as it depends on every interface, meaning when one interface revs a major `@libp2p/components` major has to change too which means every module depending on it also needs a major. Switch instead to constructor injection of simple objects that let modules declare their dependencies on interfaces directly instead of indirectly via `@libp2p/components` Refs libp2p/js-libp2p-components#6 BREAKING CHANGE: modules no longer implement `Initializable` instead switching to constructor injection
1 parent 4f472d3 commit a3816b1

File tree

4 files changed

+181
-46
lines changed

4 files changed

+181
-46
lines changed

README.md

+16-19
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
11
# @libp2p/delegated-peer-routing <!-- omit in toc -->
22

33
[![libp2p.io](https://img.shields.io/badge/project-libp2p-yellow.svg?style=flat-square)](http://libp2p.io/)
4-
[![IRC](https://img.shields.io/badge/freenode-%23libp2p-yellow.svg?style=flat-square)](http://webchat.freenode.net/?channels=%23libp2p)
54
[![Discuss](https://img.shields.io/discourse/https/discuss.libp2p.io/posts.svg?style=flat-square)](https://discuss.libp2p.io)
65
[![codecov](https://img.shields.io/codecov/c/github/libp2p/js-libp2p-delegated-peer-routing.svg?style=flat-square)](https://codecov.io/gh/libp2p/js-libp2p-delegated-peer-routing)
7-
[![CI](https://img.shields.io/github/workflow/status/libp2p/js-libp2p-interfaces/test%20&%20maybe%20release/master?style=flat-square)](https://github.com/libp2p/js-libp2p-delegated-peer-routing/actions/workflows/js-test-and-release.yml)
6+
[![CI](https://img.shields.io/github/workflow/status/libp2p/js-libp2p-delegated-peer-routing/test%20&%20maybe%20release/master?style=flat-square)](https://github.com/libp2p/js-libp2p-delegated-peer-routing/actions/workflows/js-test-and-release.yml)
87

98
> Leverage other peers in the libp2p network to perform Peer Routing calls.
109
@@ -37,30 +36,28 @@ npm install ipfs-http-client libp2p-delegated-peer-routing
3736
## Example
3837

3938
```js
40-
import { createEd25519PeerId } from '@libp2p/peer-id-factory'
41-
import { DelegatedPeerRouting } from '@libp2p/delegated-peer-routing')
39+
import { createLibp2p } from 'libp2p'
40+
import { delegatedPeerRouting } from '@libp2p/delegated-peer-routing')
4241
import { create as createIpfsHttpClient } from 'ipfs-http-client')
4342

4443
// default is to use ipfs.io
45-
const routing = new DelegatedPeerRouting(createIpfsHttpClient({
44+
const client = createIpfsHttpClient({
4645
// use default api settings
4746
protocol: 'https',
4847
port: 443,
4948
host: 'node0.delegate.ipfs.io'
50-
}))
51-
52-
try {
53-
for await (const event of routing.findPeer('peerid')) {
54-
console.log('query event', event)
55-
}
56-
} catch (err) {
57-
console.error(err)
58-
}
59-
60-
const peerId = await createEd25519PeerId()
61-
for await (const event of routing.getClosestPeers(peerId.id)) {
62-
console.log('query event', event)
63-
}
49+
})
50+
51+
const node = await createLibp2p({
52+
peerRouting: [
53+
delegatedPeerRouting(client)
54+
]
55+
//.. other config
56+
})
57+
await node.start()
58+
59+
const peerInfo = await node.peerRouting.findPeer('peerid')
60+
console.log('peerInfo', peerInfo)
6461
```
6562

6663
## License

package.json

+3-2
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,7 @@
143143
"@libp2p/peer-id": "^1.1.11",
144144
"any-signal": "^3.0.1",
145145
"err-code": "^3.0.1",
146-
"multiformats": "^9.6.3",
146+
"multiformats": "^10.0.0",
147147
"p-defer": "^4.0.0",
148148
"p-queue": "^7.2.0"
149149
},
@@ -155,7 +155,8 @@
155155
"ipfsd-ctl": "^12.0.2",
156156
"it-all": "^1.0.6",
157157
"it-drain": "^1.0.5",
158-
"uint8arrays": "^3.0.0",
158+
"timeout-abort-controller": "^3.0.0",
159+
"uint8arrays": "^4.0.2",
159160
"wherearewe": "^2.0.1"
160161
},
161162
"browser": {

src/index.ts

+106-4
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import defer from 'p-defer'
55
import errCode from 'err-code'
66
import anySignal from 'any-signal'
77
import type { PeerId } from '@libp2p/interface-peer-id'
8-
import type { IPFSHTTPClient, HTTPClientExtraOptions } from 'ipfs-http-client'
98
import type { AbortOptions } from 'ipfs-core-types/src/utils'
109
import type { PeerRouting } from '@libp2p/interface-peer-routing'
1110
import type { PeerInfo } from '@libp2p/interface-peer-info'
@@ -17,16 +16,115 @@ const log = logger('libp2p-delegated-peer-routing')
1716
const DEFAULT_TIMEOUT = 30e3 // 30 second default
1817
const CONCURRENT_HTTP_REQUESTS = 4
1918

20-
export class DelegatedPeerRouting implements PeerRouting, Startable {
21-
private readonly client: IPFSHTTPClient
19+
export interface HTTPClientExtraOptions {
20+
headers?: Record<string, string>
21+
searchParams?: URLSearchParams
22+
}
23+
24+
export enum EventTypes {
25+
SENDING_QUERY = 0,
26+
PEER_RESPONSE,
27+
FINAL_PEER,
28+
QUERY_ERROR,
29+
PROVIDER,
30+
VALUE,
31+
ADDING_PEER,
32+
DIALING_PEER
33+
}
34+
35+
/**
36+
* The types of messages set/received during DHT queries
37+
*/
38+
export enum MessageType {
39+
PUT_VALUE = 0,
40+
GET_VALUE,
41+
ADD_PROVIDER,
42+
GET_PROVIDERS,
43+
FIND_NODE,
44+
PING
45+
}
46+
47+
export type MessageName = keyof typeof MessageType
48+
49+
export interface DHTRecord {
50+
key: Uint8Array
51+
value: Uint8Array
52+
timeReceived?: Date
53+
}
54+
55+
export interface SendingQueryEvent {
56+
type: EventTypes.SENDING_QUERY
57+
name: 'SENDING_QUERY'
58+
}
59+
60+
export interface PeerResponseEvent {
61+
from: PeerId
62+
type: EventTypes.PEER_RESPONSE
63+
name: 'PEER_RESPONSE'
64+
messageType: MessageType
65+
messageName: MessageName
66+
providers: PeerInfo[]
67+
closer: PeerInfo[]
68+
record?: DHTRecord
69+
}
70+
71+
export interface FinalPeerEvent {
72+
peer: PeerInfo
73+
type: EventTypes.FINAL_PEER
74+
name: 'FINAL_PEER'
75+
}
76+
77+
export interface QueryErrorEvent {
78+
type: EventTypes.QUERY_ERROR
79+
name: 'QUERY_ERROR'
80+
error: Error
81+
}
82+
83+
export interface ProviderEvent {
84+
type: EventTypes.PROVIDER
85+
name: 'PROVIDER'
86+
providers: PeerInfo[]
87+
}
88+
89+
export interface ValueEvent {
90+
type: EventTypes.VALUE
91+
name: 'VALUE'
92+
value: Uint8Array
93+
}
94+
95+
export interface AddingPeerEvent {
96+
type: EventTypes.ADDING_PEER
97+
name: 'ADDING_PEER'
98+
peer: PeerId
99+
}
100+
101+
export interface DialingPeerEvent {
102+
peer: PeerId
103+
type: EventTypes.DIALING_PEER
104+
name: 'DIALING_PEER'
105+
}
106+
107+
export type QueryEvent = SendingQueryEvent | PeerResponseEvent | FinalPeerEvent | QueryErrorEvent | ProviderEvent | ValueEvent | AddingPeerEvent | DialingPeerEvent
108+
109+
export interface Delegate {
110+
getEndpointConfig: () => { protocol: string, host: string, port: string }
111+
112+
dht: {
113+
findPeer: (peerId: PeerId, options?: AbortOptions) => AsyncIterable<QueryEvent>
114+
query: (peerId: PeerId | CID, options?: AbortOptions) => AsyncIterable<QueryEvent>
115+
}
116+
}
117+
118+
class DelegatedPeerRouting implements PeerRouting, Startable {
119+
private readonly client: Delegate
22120
private readonly httpQueue: PQueue
23121
private started: boolean
24122
private abortController: AbortController
25123

26124
/**
27125
* Create a new DelegatedPeerRouting instance
28126
*/
29-
constructor (client: IPFSHTTPClient) {
127+
constructor (client: Delegate) {
30128
if (client == null) {
31129
throw new Error('missing ipfs http client')
32130
}
@@ -153,3 +251,7 @@ export class DelegatedPeerRouting implements PeerRouting, Startable {
153251
}
154252
}
155253
}
254+
255+
export function delegatedPeerRouting (client: Delegate): (components?: any) => PeerRouting {
256+
return () => new DelegatedPeerRouting(client)
257+
}

0 commit comments

Comments
 (0)