@@ -5,7 +5,6 @@ import defer from 'p-defer'
5
5
import errCode from 'err-code'
6
6
import anySignal from 'any-signal'
7
7
import type { PeerId } from '@libp2p/interface-peer-id'
8
- import type { IPFSHTTPClient , HTTPClientExtraOptions } from 'ipfs-http-client'
9
8
import type { AbortOptions } from 'ipfs-core-types/src/utils'
10
9
import type { PeerRouting } from '@libp2p/interface-peer-routing'
11
10
import type { PeerInfo } from '@libp2p/interface-peer-info'
@@ -17,16 +16,115 @@ const log = logger('libp2p-delegated-peer-routing')
17
16
const DEFAULT_TIMEOUT = 30e3 // 30 second default
18
17
const CONCURRENT_HTTP_REQUESTS = 4
19
18
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
22
120
private readonly httpQueue : PQueue
23
121
private started : boolean
24
122
private abortController : AbortController
25
123
26
124
/**
27
125
* Create a new DelegatedPeerRouting instance
28
126
*/
29
- constructor ( client : IPFSHTTPClient ) {
127
+ constructor ( client : Delegate ) {
30
128
if ( client == null ) {
31
129
throw new Error ( 'missing ipfs http client' )
32
130
}
@@ -153,3 +251,7 @@ export class DelegatedPeerRouting implements PeerRouting, Startable {
153
251
}
154
252
}
155
253
}
254
+
255
+ export function delegatedPeerRouting ( client : Delegate ) : ( components ?: any ) => PeerRouting {
256
+ return ( ) => new DelegatedPeerRouting ( client )
257
+ }
0 commit comments