1
1
import { KadDHT as SingleKadDHT } from './kad-dht.js'
2
2
import { DualKadDHT } from './dual-kad-dht.js'
3
+ import drain from 'it-drain'
4
+ import { CodeError } from '@libp2p/interfaces/errors'
5
+ import type { DHT , DualDHT , Selectors , Validators } from '@libp2p/interface-dht'
6
+ import { ContentRouting , contentRouting } from '@libp2p/interface-content-routing'
7
+ import type { CID } from 'multiformats/cid'
8
+ import type { AbortOptions } from '@libp2p/interfaces'
9
+ import type { PeerInfo } from '@libp2p/interface-peer-info'
3
10
import type { ProvidersInit } from './providers.js'
4
- import type { Selectors , Validators } from '@libp2p/interface-dht'
5
11
import type { Registrar } from '@libp2p/interface-registrar'
6
12
import type { AddressManager } from '@libp2p/interface-address-manager'
7
13
import type { PeerStore } from '@libp2p/interface-peer-store'
8
14
import type { ConnectionManager } from '@libp2p/interface-connection-manager'
9
15
import type { Metrics } from '@libp2p/interface-metrics'
10
- import type { PeerId } from '@libp2p/interface-peer-id'
11
16
import type { Datastore } from 'interface-datastore'
17
+ import { PeerRouting , peerRouting } from '@libp2p/interface-peer-routing'
18
+ import { PeerDiscovery , peerDiscovery } from '@libp2p/interface-peer-discovery'
19
+ import type { PeerId } from '@libp2p/interface-peer-id'
12
20
13
21
export interface KadDHTInit {
14
22
/**
@@ -80,7 +88,76 @@ export interface KadDHTComponents {
80
88
datastore : Datastore
81
89
}
82
90
91
+ /**
92
+ * Wrapper class to convert events into returned values
93
+ */
94
+ export class DHTContentRouting implements ContentRouting {
95
+ private readonly dht : DHT
96
+
97
+ constructor ( dht : DHT ) {
98
+ this . dht = dht
99
+ }
100
+
101
+ async provide ( cid : CID ) : Promise < void > {
102
+ await drain ( this . dht . provide ( cid ) )
103
+ }
104
+
105
+ async * findProviders ( cid : CID , options : AbortOptions = { } ) : AsyncGenerator < PeerInfo , void , undefined > {
106
+ for await ( const event of this . dht . findProviders ( cid , options ) ) {
107
+ if ( event . name === 'PROVIDER' ) {
108
+ yield * event . providers
109
+ }
110
+ }
111
+ }
112
+
113
+ async put ( key : Uint8Array , value : Uint8Array , options ?: AbortOptions ) : Promise < void > {
114
+ await drain ( this . dht . put ( key , value , options ) )
115
+ }
116
+
117
+ async get ( key : Uint8Array , options ?: AbortOptions ) : Promise < Uint8Array > {
118
+ for await ( const event of this . dht . get ( key , options ) ) {
119
+ if ( event . name === 'VALUE' ) {
120
+ return event . value
121
+ }
122
+ }
123
+
124
+ throw new CodeError ( 'Not found' , 'ERR_NOT_FOUND' )
125
+ }
126
+ }
127
+
128
+ /**
129
+ * Wrapper class to convert events into returned values
130
+ */
131
+ export class DHTPeerRouting implements PeerRouting {
132
+ private readonly dht : DHT
133
+
134
+ constructor ( dht : DHT ) {
135
+ this . dht = dht
136
+ }
137
+
138
+ async findPeer ( peerId : PeerId , options : AbortOptions = { } ) : Promise < PeerInfo > {
139
+ for await ( const event of this . dht . findPeer ( peerId , options ) ) {
140
+ if ( event . name === 'FINAL_PEER' ) {
141
+ return event . peer
142
+ }
143
+ }
144
+
145
+ throw new CodeError ( 'Not found' , 'ERR_NOT_FOUND' )
146
+ }
147
+
148
+ async * getClosestPeers ( key : Uint8Array , options : AbortOptions = { } ) : AsyncIterable < PeerInfo > {
149
+ for await ( const event of this . dht . getClosestPeers ( key , options ) ) {
150
+ if ( event . name === 'FINAL_PEER' ) {
151
+ yield event . peer
152
+ }
153
+ }
154
+ }
155
+ }
156
+
83
157
class KadDHT extends DualKadDHT {
158
+ private readonly contentRouting : ContentRouting
159
+ private readonly peerRouting : PeerRouting
160
+
84
161
constructor ( components : KadDHTComponents , init ?: KadDHTInit ) {
85
162
super ( components , new SingleKadDHT ( components , {
86
163
protocolPrefix : '/ipfs' ,
@@ -93,9 +170,24 @@ class KadDHT extends DualKadDHT {
93
170
clientMode : false ,
94
171
lan : true
95
172
} ) )
173
+
174
+ this . contentRouting = new DHTContentRouting ( this )
175
+ this . peerRouting = new DHTPeerRouting ( this )
176
+ }
177
+
178
+ get [ contentRouting ] ( ) : ContentRouting {
179
+ return this . contentRouting
180
+ }
181
+
182
+ get [ peerRouting ] ( ) : PeerRouting {
183
+ return this . peerRouting
184
+ }
185
+
186
+ get [ peerDiscovery ] ( ) : PeerDiscovery {
187
+ return this
96
188
}
97
189
}
98
190
99
- export function kadDHT ( init ?: KadDHTInit ) : ( components : KadDHTComponents ) => DualKadDHT {
191
+ export function kadDHT ( init ?: KadDHTInit ) : ( components : KadDHTComponents ) => DualDHT {
100
192
return ( components : KadDHTComponents ) => new KadDHT ( components , init )
101
193
}
0 commit comments