@libp2p/kad-dht 10.0.15 → 11.0.0-06e6d235f
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -5
- package/dist/index.min.js +18 -18
- package/dist/src/content-fetching/index.d.ts.map +1 -1
- package/dist/src/content-fetching/index.js +2 -3
- package/dist/src/content-fetching/index.js.map +1 -1
- package/dist/src/content-routing/index.d.ts.map +1 -1
- package/dist/src/content-routing/index.js +3 -6
- package/dist/src/content-routing/index.js.map +1 -1
- package/dist/src/dual-kad-dht.d.ts +6 -8
- package/dist/src/dual-kad-dht.d.ts.map +1 -1
- package/dist/src/dual-kad-dht.js +9 -13
- package/dist/src/dual-kad-dht.js.map +1 -1
- package/dist/src/index.d.ts +3 -9
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/kad-dht.d.ts +2 -4
- package/dist/src/kad-dht.d.ts.map +1 -1
- package/dist/src/kad-dht.js +4 -5
- package/dist/src/kad-dht.js.map +1 -1
- package/dist/src/message/dht.js.map +1 -1
- package/dist/src/message/index.d.ts +3 -1
- package/dist/src/message/index.d.ts.map +1 -1
- package/dist/src/message/index.js +7 -2
- package/dist/src/message/index.js.map +1 -1
- package/dist/src/network.d.ts +4 -9
- package/dist/src/network.d.ts.map +1 -1
- package/dist/src/network.js +12 -26
- package/dist/src/network.js.map +1 -1
- package/dist/src/peer-list/index.d.ts +1 -1
- package/dist/src/peer-list/index.d.ts.map +1 -1
- package/dist/src/peer-list/index.js.map +1 -1
- package/dist/src/peer-list/peer-distance-list.d.ts +1 -1
- package/dist/src/peer-list/peer-distance-list.d.ts.map +1 -1
- package/dist/src/peer-list/peer-distance-list.js.map +1 -1
- package/dist/src/peer-routing/index.d.ts +3 -4
- package/dist/src/peer-routing/index.d.ts.map +1 -1
- package/dist/src/peer-routing/index.js +16 -18
- package/dist/src/peer-routing/index.js.map +1 -1
- package/dist/src/providers.d.ts +4 -3
- package/dist/src/providers.d.ts.map +1 -1
- package/dist/src/providers.js +17 -17
- package/dist/src/providers.js.map +1 -1
- package/dist/src/query/events.d.ts +1 -2
- package/dist/src/query/events.d.ts.map +1 -1
- package/dist/src/query/events.js +1 -1
- package/dist/src/query/events.js.map +1 -1
- package/dist/src/query/manager.d.ts +5 -5
- package/dist/src/query/manager.d.ts.map +1 -1
- package/dist/src/query/manager.js +14 -14
- package/dist/src/query/manager.js.map +1 -1
- package/dist/src/query/query-path.d.ts +1 -3
- package/dist/src/query/query-path.d.ts.map +1 -1
- package/dist/src/query/query-path.js.map +1 -1
- package/dist/src/query/types.d.ts +1 -1
- package/dist/src/query/types.d.ts.map +1 -1
- package/dist/src/query/utils.d.ts +1 -2
- package/dist/src/query/utils.d.ts.map +1 -1
- package/dist/src/query/utils.js +1 -1
- package/dist/src/query/utils.js.map +1 -1
- package/dist/src/query-self.d.ts +3 -3
- package/dist/src/query-self.d.ts.map +1 -1
- package/dist/src/query-self.js +5 -6
- package/dist/src/query-self.js.map +1 -1
- package/dist/src/record/index.js.map +1 -1
- package/dist/src/record/record.js.map +1 -1
- package/dist/src/record/selectors.js +1 -1
- package/dist/src/record/selectors.js.map +1 -1
- package/dist/src/record/utils.js.map +1 -1
- package/dist/src/record/validators.js +1 -1
- package/dist/src/record/validators.js.map +1 -1
- package/dist/src/routing-table/index.d.ts +4 -6
- package/dist/src/routing-table/index.d.ts.map +1 -1
- package/dist/src/routing-table/index.js +2 -3
- package/dist/src/routing-table/index.js.map +1 -1
- package/dist/src/routing-table/k-bucket.d.ts +2 -2
- package/dist/src/routing-table/k-bucket.d.ts.map +1 -1
- package/dist/src/routing-table/k-bucket.js +1 -1
- package/dist/src/routing-table/k-bucket.js.map +1 -1
- package/dist/src/routing-table/refresh.d.ts +5 -2
- package/dist/src/routing-table/refresh.d.ts.map +1 -1
- package/dist/src/routing-table/refresh.js +2 -3
- package/dist/src/routing-table/refresh.js.map +1 -1
- package/dist/src/rpc/handlers/add-provider.d.ts +6 -2
- package/dist/src/rpc/handlers/add-provider.d.ts.map +1 -1
- package/dist/src/rpc/handlers/add-provider.js +10 -11
- package/dist/src/rpc/handlers/add-provider.js.map +1 -1
- package/dist/src/rpc/handlers/find-node.d.ts +6 -3
- package/dist/src/rpc/handlers/find-node.d.ts.map +1 -1
- package/dist/src/rpc/handlers/find-node.js +11 -10
- package/dist/src/rpc/handlers/find-node.js.map +1 -1
- package/dist/src/rpc/handlers/get-providers.d.ts +4 -4
- package/dist/src/rpc/handlers/get-providers.d.ts.map +1 -1
- package/dist/src/rpc/handlers/get-providers.js +9 -10
- package/dist/src/rpc/handlers/get-providers.js.map +1 -1
- package/dist/src/rpc/handlers/get-value.d.ts +5 -3
- package/dist/src/rpc/handlers/get-value.d.ts.map +1 -1
- package/dist/src/rpc/handlers/get-value.js +17 -16
- package/dist/src/rpc/handlers/get-value.js.map +1 -1
- package/dist/src/rpc/handlers/ping.d.ts +6 -1
- package/dist/src/rpc/handlers/ping.d.ts.map +1 -1
- package/dist/src/rpc/handlers/ping.js +5 -3
- package/dist/src/rpc/handlers/ping.js.map +1 -1
- package/dist/src/rpc/handlers/put-value.d.ts +3 -2
- package/dist/src/rpc/handlers/put-value.d.ts.map +1 -1
- package/dist/src/rpc/handlers/put-value.js +3 -4
- package/dist/src/rpc/handlers/put-value.js.map +1 -1
- package/dist/src/rpc/index.d.ts +2 -2
- package/dist/src/rpc/index.d.ts.map +1 -1
- package/dist/src/rpc/index.js +3 -4
- package/dist/src/rpc/index.js.map +1 -1
- package/dist/src/topology-listener.d.ts +2 -3
- package/dist/src/topology-listener.d.ts.map +1 -1
- package/dist/src/topology-listener.js +2 -3
- package/dist/src/topology-listener.js.map +1 -1
- package/dist/src/utils.d.ts +1 -2
- package/dist/src/utils.d.ts.map +1 -1
- package/dist/src/utils.js.map +1 -1
- package/package.json +26 -23
- package/src/content-fetching/index.ts +3 -5
- package/src/content-routing/index.ts +4 -8
- package/src/dual-kad-dht.ts +10 -16
- package/src/index.ts +3 -9
- package/src/kad-dht.ts +5 -8
- package/src/message/index.ts +10 -3
- package/src/network.ts +15 -49
- package/src/peer-list/index.ts +1 -1
- package/src/peer-list/peer-distance-list.ts +1 -1
- package/src/peer-routing/index.ts +17 -22
- package/src/providers.ts +19 -20
- package/src/query/events.ts +2 -3
- package/src/query/manager.ts +19 -21
- package/src/query/query-path.ts +1 -3
- package/src/query/types.ts +1 -1
- package/src/query/utils.ts +2 -3
- package/src/query-self.ts +7 -8
- package/src/record/selectors.ts +1 -1
- package/src/record/validators.ts +1 -1
- package/src/routing-table/index.ts +5 -9
- package/src/routing-table/k-bucket.ts +2 -2
- package/src/routing-table/refresh.ts +7 -5
- package/src/rpc/handlers/add-provider.ts +14 -12
- package/src/rpc/handlers/find-node.ts +14 -14
- package/src/rpc/handlers/get-providers.ts +11 -14
- package/src/rpc/handlers/get-value.ts +19 -20
- package/src/rpc/handlers/ping.ts +11 -4
- package/src/rpc/handlers/put-value.ts +5 -5
- package/src/rpc/index.ts +5 -6
- package/src/topology-listener.ts +3 -6
- package/src/utils.ts +1 -2
- package/dist/typedoc-urls.json +0 -55
package/src/network.ts
CHANGED
|
@@ -1,11 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import { logger } from '@libp2p/logger'
|
|
4
|
-
import { abortableDuplex } from 'abortable-iterator'
|
|
5
|
-
import drain from 'it-drain'
|
|
6
|
-
import first from 'it-first'
|
|
7
|
-
import * as lp from 'it-length-prefixed'
|
|
8
|
-
import { pipe } from 'it-pipe'
|
|
1
|
+
import { TypedEventEmitter, CustomEvent } from '@libp2p/interface'
|
|
2
|
+
import { pbStream } from 'it-protobuf-stream'
|
|
9
3
|
import { Message } from './message/index.js'
|
|
10
4
|
import {
|
|
11
5
|
dialPeerEvent,
|
|
@@ -14,14 +8,7 @@ import {
|
|
|
14
8
|
queryErrorEvent
|
|
15
9
|
} from './query/events.js'
|
|
16
10
|
import type { KadDHTComponents, QueryEvent, QueryOptions } from './index.js'
|
|
17
|
-
import type { AbortOptions } from '@libp2p/interface'
|
|
18
|
-
import type { Stream } from '@libp2p/interface/connection'
|
|
19
|
-
import type { PeerId } from '@libp2p/interface/peer-id'
|
|
20
|
-
import type { PeerInfo } from '@libp2p/interface/peer-info'
|
|
21
|
-
import type { Startable } from '@libp2p/interface/startable'
|
|
22
|
-
import type { Logger } from '@libp2p/logger'
|
|
23
|
-
import type { Duplex, Source } from 'it-stream-types'
|
|
24
|
-
import type { Uint8ArrayList } from 'uint8arraylist'
|
|
11
|
+
import type { AbortOptions, Logger, Stream, PeerId, PeerInfo, Startable } from '@libp2p/interface'
|
|
25
12
|
|
|
26
13
|
export interface NetworkInit {
|
|
27
14
|
protocol: string
|
|
@@ -49,7 +36,7 @@ export class Network extends TypedEventEmitter<NetworkEvents> implements Startab
|
|
|
49
36
|
|
|
50
37
|
const { protocol, lan } = init
|
|
51
38
|
this.components = components
|
|
52
|
-
this.log = logger(`libp2p:kad-dht:${lan ? 'lan' : 'wan'}:network`)
|
|
39
|
+
this.log = components.logger.forComponent(`libp2p:kad-dht:${lan ? 'lan' : 'wan'}:network`)
|
|
53
40
|
this.running = false
|
|
54
41
|
this.protocol = protocol
|
|
55
42
|
}
|
|
@@ -97,7 +84,7 @@ export class Network extends TypedEventEmitter<NetworkEvents> implements Startab
|
|
|
97
84
|
const connection = await this.components.connectionManager.openConnection(to, options)
|
|
98
85
|
const stream = await connection.newStream(this.protocol, options)
|
|
99
86
|
|
|
100
|
-
const response = await this._writeReadMessage(stream, msg
|
|
87
|
+
const response = await this._writeReadMessage(stream, msg, options)
|
|
101
88
|
|
|
102
89
|
yield peerResponseEvent({
|
|
103
90
|
from: to,
|
|
@@ -133,7 +120,7 @@ export class Network extends TypedEventEmitter<NetworkEvents> implements Startab
|
|
|
133
120
|
const connection = await this.components.connectionManager.openConnection(to, options)
|
|
134
121
|
const stream = await connection.newStream(this.protocol, options)
|
|
135
122
|
|
|
136
|
-
await this._writeMessage(stream, msg
|
|
123
|
+
await this._writeMessage(stream, msg, options)
|
|
137
124
|
|
|
138
125
|
yield peerResponseEvent({ from: to, messageType: msg.type }, options)
|
|
139
126
|
} catch (err: any) {
|
|
@@ -148,17 +135,10 @@ export class Network extends TypedEventEmitter<NetworkEvents> implements Startab
|
|
|
148
135
|
/**
|
|
149
136
|
* Write a message to the given stream
|
|
150
137
|
*/
|
|
151
|
-
async _writeMessage (stream:
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
await pipe(
|
|
157
|
-
[msg],
|
|
158
|
-
(source) => lp.encode(source),
|
|
159
|
-
stream,
|
|
160
|
-
drain
|
|
161
|
-
)
|
|
138
|
+
async _writeMessage (stream: Stream, msg: Message, options: AbortOptions): Promise<void> {
|
|
139
|
+
const pb = pbStream(stream)
|
|
140
|
+
await pb.write(msg, Message, options)
|
|
141
|
+
await pb.unwrap().close(options)
|
|
162
142
|
}
|
|
163
143
|
|
|
164
144
|
/**
|
|
@@ -166,28 +146,14 @@ export class Network extends TypedEventEmitter<NetworkEvents> implements Startab
|
|
|
166
146
|
* If no response is received after the specified timeout
|
|
167
147
|
* this will error out.
|
|
168
148
|
*/
|
|
169
|
-
async _writeReadMessage (stream:
|
|
170
|
-
|
|
171
|
-
stream = abortableDuplex(stream, options.signal)
|
|
172
|
-
}
|
|
149
|
+
async _writeReadMessage (stream: Stream, msg: Message, options: AbortOptions): Promise<Message> {
|
|
150
|
+
const pb = pbStream(stream)
|
|
173
151
|
|
|
174
|
-
|
|
175
|
-
[msg],
|
|
176
|
-
(source) => lp.encode(source),
|
|
177
|
-
stream,
|
|
178
|
-
(source) => lp.decode(source),
|
|
179
|
-
async source => {
|
|
180
|
-
const buf = await first(source)
|
|
152
|
+
await pb.write(msg, Message, options)
|
|
181
153
|
|
|
182
|
-
|
|
183
|
-
return buf
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
throw new CodeError('No message received', 'ERR_NO_MESSAGE_RECEIVED')
|
|
187
|
-
}
|
|
188
|
-
)
|
|
154
|
+
const message = await pb.read(Message, options)
|
|
189
155
|
|
|
190
|
-
|
|
156
|
+
await pb.unwrap().close(options)
|
|
191
157
|
|
|
192
158
|
// tell any listeners about new peers we've seen
|
|
193
159
|
message.closerPeers.forEach(peerData => {
|
package/src/peer-list/index.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { compare as uint8ArrayCompare } from 'uint8arrays/compare'
|
|
2
2
|
import { xor as uint8ArrayXor } from 'uint8arrays/xor'
|
|
3
3
|
import * as utils from '../utils.js'
|
|
4
|
-
import type { PeerId } from '@libp2p/interface
|
|
4
|
+
import type { PeerId } from '@libp2p/interface'
|
|
5
5
|
|
|
6
6
|
interface PeerDistance {
|
|
7
7
|
peerId: PeerId
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { keys } from '@libp2p/crypto'
|
|
2
|
-
import { CodeError } from '@libp2p/interface
|
|
3
|
-
import { logger } from '@libp2p/logger'
|
|
2
|
+
import { CodeError } from '@libp2p/interface'
|
|
4
3
|
import { peerIdFromKeys } from '@libp2p/peer-id'
|
|
5
4
|
import { toString as uint8ArrayToString } from 'uint8arrays/to-string'
|
|
6
5
|
import { Message, MESSAGE_TYPE } from '../message/index.js'
|
|
@@ -18,10 +17,7 @@ import type { Network } from '../network.js'
|
|
|
18
17
|
import type { QueryManager, QueryOptions } from '../query/manager.js'
|
|
19
18
|
import type { QueryFunc } from '../query/types.js'
|
|
20
19
|
import type { RoutingTable } from '../routing-table/index.js'
|
|
21
|
-
import type { AbortOptions } from '@libp2p/interface'
|
|
22
|
-
import type { PeerId } from '@libp2p/interface/peer-id'
|
|
23
|
-
import type { PeerInfo } from '@libp2p/interface/peer-info'
|
|
24
|
-
import type { Logger } from '@libp2p/logger'
|
|
20
|
+
import type { AbortOptions, Logger, PeerId, PeerInfo, PeerStore } from '@libp2p/interface'
|
|
25
21
|
|
|
26
22
|
export interface PeerRoutingInit {
|
|
27
23
|
routingTable: RoutingTable
|
|
@@ -32,22 +28,24 @@ export interface PeerRoutingInit {
|
|
|
32
28
|
}
|
|
33
29
|
|
|
34
30
|
export class PeerRouting {
|
|
35
|
-
private readonly components: KadDHTComponents
|
|
36
31
|
private readonly log: Logger
|
|
37
32
|
private readonly routingTable: RoutingTable
|
|
38
33
|
private readonly network: Network
|
|
39
34
|
private readonly validators: Validators
|
|
40
35
|
private readonly queryManager: QueryManager
|
|
36
|
+
private readonly peerStore: PeerStore
|
|
37
|
+
private readonly peerId: PeerId
|
|
41
38
|
|
|
42
39
|
constructor (components: KadDHTComponents, init: PeerRoutingInit) {
|
|
43
40
|
const { routingTable, network, validators, queryManager, lan } = init
|
|
44
41
|
|
|
45
|
-
this.components = components
|
|
46
42
|
this.routingTable = routingTable
|
|
47
43
|
this.network = network
|
|
48
44
|
this.validators = validators
|
|
49
45
|
this.queryManager = queryManager
|
|
50
|
-
this.
|
|
46
|
+
this.peerStore = components.peerStore
|
|
47
|
+
this.peerId = components.peerId
|
|
48
|
+
this.log = components.logger.forComponent(`libp2p:kad-dht:${lan ? 'lan' : 'wan'}:peer-routing`)
|
|
51
49
|
}
|
|
52
50
|
|
|
53
51
|
/**
|
|
@@ -62,7 +60,7 @@ export class PeerRouting {
|
|
|
62
60
|
this.log('findPeerLocal found %p in routing table', peer)
|
|
63
61
|
|
|
64
62
|
try {
|
|
65
|
-
peerData = await this.
|
|
63
|
+
peerData = await this.peerStore.get(p)
|
|
66
64
|
} catch (err: any) {
|
|
67
65
|
if (err.code !== 'ERR_NOT_FOUND') {
|
|
68
66
|
throw err
|
|
@@ -72,7 +70,7 @@ export class PeerRouting {
|
|
|
72
70
|
|
|
73
71
|
if (peerData == null) {
|
|
74
72
|
try {
|
|
75
|
-
peerData = await this.
|
|
73
|
+
peerData = await this.peerStore.get(peer)
|
|
76
74
|
} catch (err: any) {
|
|
77
75
|
if (err.code !== 'ERR_NOT_FOUND') {
|
|
78
76
|
throw err
|
|
@@ -85,8 +83,7 @@ export class PeerRouting {
|
|
|
85
83
|
|
|
86
84
|
return {
|
|
87
85
|
id: peerData.id,
|
|
88
|
-
multiaddrs: peerData.addresses.map((address) => address.multiaddr)
|
|
89
|
-
protocols: []
|
|
86
|
+
multiaddrs: peerData.addresses.map((address) => address.multiaddr)
|
|
90
87
|
}
|
|
91
88
|
}
|
|
92
89
|
|
|
@@ -142,7 +139,7 @@ export class PeerRouting {
|
|
|
142
139
|
if (pi != null) {
|
|
143
140
|
this.log('found local')
|
|
144
141
|
yield finalPeerEvent({
|
|
145
|
-
from: this.
|
|
142
|
+
from: this.peerId,
|
|
146
143
|
peer: pi
|
|
147
144
|
}, options)
|
|
148
145
|
return
|
|
@@ -181,7 +178,7 @@ export class PeerRouting {
|
|
|
181
178
|
}
|
|
182
179
|
|
|
183
180
|
if (!foundPeer) {
|
|
184
|
-
yield queryErrorEvent({ from: this.
|
|
181
|
+
yield queryErrorEvent({ from: this.peerId, error: new CodeError('Not found', 'ERR_NOT_FOUND') }, options)
|
|
185
182
|
}
|
|
186
183
|
}
|
|
187
184
|
|
|
@@ -220,14 +217,13 @@ export class PeerRouting {
|
|
|
220
217
|
|
|
221
218
|
for (const peerId of peers.peers) {
|
|
222
219
|
try {
|
|
223
|
-
const peer = await this.
|
|
220
|
+
const peer = await this.peerStore.get(peerId)
|
|
224
221
|
|
|
225
222
|
yield finalPeerEvent({
|
|
226
|
-
from: this.
|
|
223
|
+
from: this.peerId,
|
|
227
224
|
peer: {
|
|
228
225
|
id: peerId,
|
|
229
|
-
multiaddrs: peer.addresses.map(({ multiaddr }) => multiaddr)
|
|
230
|
-
protocols: peer.protocols
|
|
226
|
+
multiaddrs: peer.addresses.map(({ multiaddr }) => multiaddr)
|
|
231
227
|
}
|
|
232
228
|
}, options)
|
|
233
229
|
} catch (err: any) {
|
|
@@ -292,12 +288,11 @@ export class PeerRouting {
|
|
|
292
288
|
}
|
|
293
289
|
|
|
294
290
|
try {
|
|
295
|
-
const peer = await this.
|
|
291
|
+
const peer = await this.peerStore.get(peerId)
|
|
296
292
|
|
|
297
293
|
output.push({
|
|
298
294
|
id: peerId,
|
|
299
|
-
multiaddrs: peer.addresses.map(({ multiaddr }) => multiaddr)
|
|
300
|
-
protocols: peer.protocols
|
|
295
|
+
multiaddrs: peer.addresses.map(({ multiaddr }) => multiaddr)
|
|
301
296
|
})
|
|
302
297
|
} catch (err: any) {
|
|
303
298
|
if (err.code !== 'ERR_NOT_FOUND') {
|
package/src/providers.ts
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { logger } from '@libp2p/logger'
|
|
2
1
|
import { peerIdFromString } from '@libp2p/peer-id'
|
|
3
2
|
import cache from 'hashlru'
|
|
4
3
|
import { Key } from 'interface-datastore/key'
|
|
@@ -11,13 +10,10 @@ import {
|
|
|
11
10
|
PROVIDERS_LRU_CACHE_SIZE,
|
|
12
11
|
PROVIDER_KEY_PREFIX
|
|
13
12
|
} from './constants.js'
|
|
14
|
-
import type { PeerId } from '@libp2p/interface
|
|
15
|
-
import type { Startable } from '@libp2p/interface/startable'
|
|
13
|
+
import type { ComponentLogger, Logger, PeerId, Startable } from '@libp2p/interface'
|
|
16
14
|
import type { Datastore } from 'interface-datastore'
|
|
17
15
|
import type { CID } from 'multiformats'
|
|
18
16
|
|
|
19
|
-
const log = logger('libp2p:kad-dht:providers')
|
|
20
|
-
|
|
21
17
|
export interface ProvidersInit {
|
|
22
18
|
cacheSize?: number
|
|
23
19
|
/**
|
|
@@ -32,6 +28,7 @@ export interface ProvidersInit {
|
|
|
32
28
|
|
|
33
29
|
export interface ProvidersComponents {
|
|
34
30
|
datastore: Datastore
|
|
31
|
+
logger: ComponentLogger
|
|
35
32
|
}
|
|
36
33
|
|
|
37
34
|
/**
|
|
@@ -47,7 +44,8 @@ export interface ProvidersComponents {
|
|
|
47
44
|
* access is fast there is an LRU cache in front of that.
|
|
48
45
|
*/
|
|
49
46
|
export class Providers implements Startable {
|
|
50
|
-
private readonly
|
|
47
|
+
private readonly log: Logger
|
|
48
|
+
private readonly datastore: Datastore
|
|
51
49
|
private readonly cache: ReturnType<typeof cache>
|
|
52
50
|
private readonly cleanupInterval: number
|
|
53
51
|
private readonly provideValidity: number
|
|
@@ -58,7 +56,8 @@ export class Providers implements Startable {
|
|
|
58
56
|
constructor (components: ProvidersComponents, init: ProvidersInit = {}) {
|
|
59
57
|
const { cacheSize, cleanupInterval, provideValidity } = init
|
|
60
58
|
|
|
61
|
-
this.
|
|
59
|
+
this.log = components.logger.forComponent('libp2p:kad-dht:providers')
|
|
60
|
+
this.datastore = components.datastore
|
|
62
61
|
this.cleanupInterval = cleanupInterval ?? PROVIDERS_CLEANUP_INTERVAL
|
|
63
62
|
this.provideValidity = provideValidity ?? PROVIDERS_VALIDITY
|
|
64
63
|
this.cache = cache(cacheSize ?? PROVIDERS_LRU_CACHE_SIZE)
|
|
@@ -83,7 +82,7 @@ export class Providers implements Startable {
|
|
|
83
82
|
this.cleaner = setInterval(
|
|
84
83
|
() => {
|
|
85
84
|
this._cleanup().catch(err => {
|
|
86
|
-
log.error(err)
|
|
85
|
+
this.log.error(err)
|
|
87
86
|
})
|
|
88
87
|
},
|
|
89
88
|
this.cleanupInterval
|
|
@@ -112,10 +111,10 @@ export class Providers implements Startable {
|
|
|
112
111
|
let count = 0
|
|
113
112
|
let deleteCount = 0
|
|
114
113
|
const deleted = new Map<string, Set<string>>()
|
|
115
|
-
const batch = this.
|
|
114
|
+
const batch = this.datastore.batch()
|
|
116
115
|
|
|
117
116
|
// Get all provider entries from the datastore
|
|
118
|
-
const query = this.
|
|
117
|
+
const query = this.datastore.query({ prefix: PROVIDER_KEY_PREFIX })
|
|
119
118
|
|
|
120
119
|
for await (const entry of query) {
|
|
121
120
|
try {
|
|
@@ -126,7 +125,7 @@ export class Providers implements Startable {
|
|
|
126
125
|
const delta = now - time
|
|
127
126
|
const expired = delta > this.provideValidity
|
|
128
127
|
|
|
129
|
-
log('comparing: %d - %d = %d > %d %s', now, time, delta, this.provideValidity, expired ? '(expired)' : '')
|
|
128
|
+
this.log('comparing: %d - %d = %d > %d %s', now, time, delta, this.provideValidity, expired ? '(expired)' : '')
|
|
130
129
|
|
|
131
130
|
if (expired) {
|
|
132
131
|
deleteCount++
|
|
@@ -137,16 +136,16 @@ export class Providers implements Startable {
|
|
|
137
136
|
}
|
|
138
137
|
count++
|
|
139
138
|
} catch (err: any) {
|
|
140
|
-
log.error(err.message)
|
|
139
|
+
this.log.error(err.message)
|
|
141
140
|
}
|
|
142
141
|
}
|
|
143
142
|
|
|
144
143
|
// Commit the deletes to the datastore
|
|
145
144
|
if (deleted.size > 0) {
|
|
146
|
-
log('deleting %d / %d entries', deleteCount, count)
|
|
145
|
+
this.log('deleting %d / %d entries', deleteCount, count)
|
|
147
146
|
await batch.commit()
|
|
148
147
|
} else {
|
|
149
|
-
log('nothing to delete')
|
|
148
|
+
this.log('nothing to delete')
|
|
150
149
|
}
|
|
151
150
|
|
|
152
151
|
// Clear expired entries from the cache
|
|
@@ -167,7 +166,7 @@ export class Providers implements Startable {
|
|
|
167
166
|
}
|
|
168
167
|
}
|
|
169
168
|
|
|
170
|
-
log('Cleanup successful (%dms)', Date.now() - start)
|
|
169
|
+
this.log('Cleanup successful (%dms)', Date.now() - start)
|
|
171
170
|
})
|
|
172
171
|
}
|
|
173
172
|
|
|
@@ -179,7 +178,7 @@ export class Providers implements Startable {
|
|
|
179
178
|
let provs: Map<string, Date> = this.cache.get(cacheKey)
|
|
180
179
|
|
|
181
180
|
if (provs == null) {
|
|
182
|
-
provs = await loadProviders(this.
|
|
181
|
+
provs = await loadProviders(this.datastore, cid)
|
|
183
182
|
this.cache.set(cacheKey, provs)
|
|
184
183
|
}
|
|
185
184
|
|
|
@@ -191,17 +190,17 @@ export class Providers implements Startable {
|
|
|
191
190
|
*/
|
|
192
191
|
async addProvider (cid: CID, provider: PeerId): Promise<void> {
|
|
193
192
|
await this.syncQueue.add(async () => {
|
|
194
|
-
log('%p provides %s', provider, cid)
|
|
193
|
+
this.log('%p provides %s', provider, cid)
|
|
195
194
|
const provs = await this._getProvidersMap(cid)
|
|
196
195
|
|
|
197
|
-
log('loaded %s provs', provs.size)
|
|
196
|
+
this.log('loaded %s provs', provs.size)
|
|
198
197
|
const now = new Date()
|
|
199
198
|
provs.set(provider.toString(), now)
|
|
200
199
|
|
|
201
200
|
const dsKey = makeProviderKey(cid)
|
|
202
201
|
this.cache.set(dsKey, provs)
|
|
203
202
|
|
|
204
|
-
await writeProviderEntry(this.
|
|
203
|
+
await writeProviderEntry(this.datastore, cid, provider, now)
|
|
205
204
|
})
|
|
206
205
|
}
|
|
207
206
|
|
|
@@ -210,7 +209,7 @@ export class Providers implements Startable {
|
|
|
210
209
|
*/
|
|
211
210
|
async getProviders (cid: CID): Promise<PeerId[]> {
|
|
212
211
|
return this.syncQueue.add(async () => {
|
|
213
|
-
log('get providers for %s', cid)
|
|
212
|
+
this.log('get providers for %s', cid)
|
|
214
213
|
const provs = await this._getProvidersMap(cid)
|
|
215
214
|
|
|
216
215
|
return [...provs.keys()].map(peerIdStr => {
|
package/src/query/events.ts
CHANGED
|
@@ -1,10 +1,9 @@
|
|
|
1
|
-
import { CustomEvent } from '@libp2p/interface
|
|
1
|
+
import { CustomEvent } from '@libp2p/interface'
|
|
2
2
|
import { MESSAGE_TYPE_LOOKUP } from '../message/index.js'
|
|
3
3
|
import type { SendQueryEvent, PeerResponseEvent, DialPeerEvent, AddPeerEvent, ValueEvent, ProviderEvent, QueryErrorEvent, FinalPeerEvent, QueryOptions } from '../index.js'
|
|
4
4
|
import type { Message } from '../message/dht.js'
|
|
5
5
|
import type { Libp2pRecord } from '../record/index.js'
|
|
6
|
-
import type { PeerId } from '@libp2p/interface
|
|
7
|
-
import type { PeerInfo } from '@libp2p/interface/peer-info'
|
|
6
|
+
import type { PeerId, PeerInfo } from '@libp2p/interface'
|
|
8
7
|
|
|
9
8
|
export interface QueryEventFields {
|
|
10
9
|
to: PeerId
|
package/src/query/manager.ts
CHANGED
|
@@ -1,6 +1,4 @@
|
|
|
1
|
-
import { AbortError } from '@libp2p/interface
|
|
2
|
-
import { TypedEventEmitter, CustomEvent, setMaxListeners } from '@libp2p/interface/events'
|
|
3
|
-
import { logger } from '@libp2p/logger'
|
|
1
|
+
import { AbortError, TypedEventEmitter, CustomEvent, setMaxListeners } from '@libp2p/interface'
|
|
4
2
|
import { PeerSet } from '@libp2p/peer-collections'
|
|
5
3
|
import { anySignal } from 'any-signal'
|
|
6
4
|
import merge from 'it-merge'
|
|
@@ -13,9 +11,7 @@ import { queryPath } from './query-path.js'
|
|
|
13
11
|
import type { QueryFunc } from './types.js'
|
|
14
12
|
import type { QueryEvent, QueryOptions as RootQueryOptions } from '../index.js'
|
|
15
13
|
import type { RoutingTable } from '../routing-table/index.js'
|
|
16
|
-
import type { Metric, Metrics } from '@libp2p/interface
|
|
17
|
-
import type { PeerId } from '@libp2p/interface/peer-id'
|
|
18
|
-
import type { Startable } from '@libp2p/interface/startable'
|
|
14
|
+
import type { ComponentLogger, Metric, Metrics, PeerId, Startable } from '@libp2p/interface'
|
|
19
15
|
import type { DeferredPromise } from 'p-defer'
|
|
20
16
|
|
|
21
17
|
export interface CleanUpEvents {
|
|
@@ -33,6 +29,7 @@ export interface QueryManagerInit {
|
|
|
33
29
|
export interface QueryManagerComponents {
|
|
34
30
|
peerId: PeerId
|
|
35
31
|
metrics?: Metrics
|
|
32
|
+
logger: ComponentLogger
|
|
36
33
|
}
|
|
37
34
|
|
|
38
35
|
export interface QueryOptions extends RootQueryOptions {
|
|
@@ -44,25 +41,24 @@ export interface QueryOptions extends RootQueryOptions {
|
|
|
44
41
|
* Keeps track of all running queries
|
|
45
42
|
*/
|
|
46
43
|
export class QueryManager implements Startable {
|
|
47
|
-
private readonly components: QueryManagerComponents
|
|
48
44
|
private readonly lan: boolean
|
|
49
45
|
public disjointPaths: number
|
|
50
46
|
private readonly alpha: number
|
|
51
47
|
private readonly shutDownController: AbortController
|
|
52
48
|
private running: boolean
|
|
53
49
|
private queries: number
|
|
54
|
-
private
|
|
50
|
+
private readonly logger: ComponentLogger
|
|
51
|
+
private readonly peerId: PeerId
|
|
52
|
+
private readonly routingTable: RoutingTable
|
|
53
|
+
private initialQuerySelfHasRun?: DeferredPromise<void>
|
|
54
|
+
private readonly metrics?: {
|
|
55
55
|
runningQueries: Metric
|
|
56
56
|
queryTime: Metric
|
|
57
57
|
}
|
|
58
58
|
|
|
59
|
-
private readonly routingTable: RoutingTable
|
|
60
|
-
private initialQuerySelfHasRun?: DeferredPromise<void>
|
|
61
|
-
|
|
62
59
|
constructor (components: QueryManagerComponents, init: QueryManagerInit) {
|
|
63
60
|
const { lan = false, disjointPaths = K, alpha = ALPHA } = init
|
|
64
61
|
|
|
65
|
-
this.components = components
|
|
66
62
|
this.disjointPaths = disjointPaths ?? K
|
|
67
63
|
this.running = false
|
|
68
64
|
this.alpha = alpha ?? ALPHA
|
|
@@ -70,6 +66,15 @@ export class QueryManager implements Startable {
|
|
|
70
66
|
this.queries = 0
|
|
71
67
|
this.initialQuerySelfHasRun = init.initialQuerySelfHasRun
|
|
72
68
|
this.routingTable = init.routingTable
|
|
69
|
+
this.logger = components.logger
|
|
70
|
+
this.peerId = components.peerId
|
|
71
|
+
|
|
72
|
+
if (components.metrics != null) {
|
|
73
|
+
this.metrics = {
|
|
74
|
+
runningQueries: components.metrics.registerMetric(`libp2p_kad_dht_${this.lan ? 'lan' : 'wan'}_running_queries`),
|
|
75
|
+
queryTime: components.metrics.registerMetric(`libp2p_kad_dht_${this.lan ? 'lan' : 'wan'}_query_time_seconds`)
|
|
76
|
+
}
|
|
77
|
+
}
|
|
73
78
|
|
|
74
79
|
// allow us to stop queries on shut down
|
|
75
80
|
this.shutDownController = new AbortController()
|
|
@@ -86,13 +91,6 @@ export class QueryManager implements Startable {
|
|
|
86
91
|
*/
|
|
87
92
|
async start (): Promise<void> {
|
|
88
93
|
this.running = true
|
|
89
|
-
|
|
90
|
-
if (this.components.metrics != null && this.metrics == null) {
|
|
91
|
-
this.metrics = {
|
|
92
|
-
runningQueries: this.components.metrics.registerMetric(`libp2p_kad_dht_${this.lan ? 'lan' : 'wan'}_running_queries`),
|
|
93
|
-
queryTime: this.components.metrics.registerMetric(`libp2p_kad_dht_${this.lan ? 'lan' : 'wan'}_query_time_seconds`)
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
94
|
}
|
|
97
95
|
|
|
98
96
|
/**
|
|
@@ -131,7 +129,7 @@ export class QueryManager implements Startable {
|
|
|
131
129
|
// so make sure we don't make a lot of noise in the logs
|
|
132
130
|
setMaxListeners(Infinity, signal)
|
|
133
131
|
|
|
134
|
-
const log = logger(`libp2p:kad-dht:${this.lan ? 'lan' : 'wan'}:query:` + uint8ArrayToString(key, 'base58btc'))
|
|
132
|
+
const log = this.logger.forComponent(`libp2p:kad-dht:${this.lan ? 'lan' : 'wan'}:query:` + uint8ArrayToString(key, 'base58btc'))
|
|
135
133
|
|
|
136
134
|
// query a subset of peers up to `kBucketSize / 2` in length
|
|
137
135
|
const startTime = Date.now()
|
|
@@ -174,7 +172,7 @@ export class QueryManager implements Startable {
|
|
|
174
172
|
return queryPath({
|
|
175
173
|
key,
|
|
176
174
|
startingPeer: peer,
|
|
177
|
-
ourPeerId: this.
|
|
175
|
+
ourPeerId: this.peerId,
|
|
178
176
|
signal,
|
|
179
177
|
query: queryFunc,
|
|
180
178
|
pathIndex: index,
|
package/src/query/query-path.ts
CHANGED
|
@@ -8,9 +8,7 @@ import { queueToGenerator } from './utils.js'
|
|
|
8
8
|
import type { CleanUpEvents } from './manager.js'
|
|
9
9
|
import type { QueryEvent, QueryOptions } from '../index.js'
|
|
10
10
|
import type { QueryFunc } from '../query/types.js'
|
|
11
|
-
import type { TypedEventTarget } from '@libp2p/interface
|
|
12
|
-
import type { PeerId } from '@libp2p/interface/peer-id'
|
|
13
|
-
import type { Logger } from '@libp2p/logger'
|
|
11
|
+
import type { Logger, TypedEventTarget, PeerId } from '@libp2p/interface'
|
|
14
12
|
import type { PeerSet } from '@libp2p/peer-collections'
|
|
15
13
|
|
|
16
14
|
const MAX_XOR = BigInt('0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF')
|
package/src/query/types.ts
CHANGED
package/src/query/utils.ts
CHANGED
|
@@ -1,9 +1,8 @@
|
|
|
1
|
-
import { CodeError } from '@libp2p/interface
|
|
1
|
+
import { CodeError } from '@libp2p/interface'
|
|
2
2
|
import { pushable } from 'it-pushable'
|
|
3
3
|
import type { CleanUpEvents } from './manager.js'
|
|
4
4
|
import type { QueryEvent } from '../index.js'
|
|
5
|
-
import type { TypedEventTarget } from '@libp2p/interface
|
|
6
|
-
import type { Logger } from '@libp2p/logger'
|
|
5
|
+
import type { Logger, TypedEventTarget } from '@libp2p/interface'
|
|
7
6
|
import type Queue from 'p-queue'
|
|
8
7
|
|
|
9
8
|
export async function * queueToGenerator (queue: Queue, signal: AbortSignal, cleanUp: TypedEventTarget<CleanUpEvents>, log: Logger): AsyncGenerator<QueryEvent, void, undefined> {
|
package/src/query-self.ts
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import { setMaxListeners } from '@libp2p/interface
|
|
2
|
-
import { logger, type Logger } from '@libp2p/logger'
|
|
1
|
+
import { setMaxListeners } from '@libp2p/interface'
|
|
3
2
|
import { anySignal } from 'any-signal'
|
|
4
3
|
import length from 'it-length'
|
|
5
4
|
import { pipe } from 'it-pipe'
|
|
@@ -9,8 +8,7 @@ import { pEvent } from 'p-event'
|
|
|
9
8
|
import { QUERY_SELF_INTERVAL, QUERY_SELF_TIMEOUT, K, QUERY_SELF_INITIAL_INTERVAL } from './constants.js'
|
|
10
9
|
import type { PeerRouting } from './peer-routing/index.js'
|
|
11
10
|
import type { RoutingTable } from './routing-table/index.js'
|
|
12
|
-
import type { PeerId } from '@libp2p/interface
|
|
13
|
-
import type { Startable } from '@libp2p/interface/startable'
|
|
11
|
+
import type { ComponentLogger, Logger, PeerId, Startable } from '@libp2p/interface'
|
|
14
12
|
import type { DeferredPromise } from 'p-defer'
|
|
15
13
|
|
|
16
14
|
export interface QuerySelfInit {
|
|
@@ -26,6 +24,7 @@ export interface QuerySelfInit {
|
|
|
26
24
|
|
|
27
25
|
export interface QuerySelfComponents {
|
|
28
26
|
peerId: PeerId
|
|
27
|
+
logger: ComponentLogger
|
|
29
28
|
}
|
|
30
29
|
|
|
31
30
|
/**
|
|
@@ -33,7 +32,7 @@ export interface QuerySelfComponents {
|
|
|
33
32
|
*/
|
|
34
33
|
export class QuerySelf implements Startable {
|
|
35
34
|
private readonly log: Logger
|
|
36
|
-
private readonly
|
|
35
|
+
private readonly peerId: PeerId
|
|
37
36
|
private readonly peerRouting: PeerRouting
|
|
38
37
|
private readonly routingTable: RoutingTable
|
|
39
38
|
private readonly count: number
|
|
@@ -49,8 +48,8 @@ export class QuerySelf implements Startable {
|
|
|
49
48
|
constructor (components: QuerySelfComponents, init: QuerySelfInit) {
|
|
50
49
|
const { peerRouting, lan, count, interval, queryTimeout, routingTable } = init
|
|
51
50
|
|
|
52
|
-
this.
|
|
53
|
-
this.log = logger(`libp2p:kad-dht:${lan ? 'lan' : 'wan'}:query-self`)
|
|
51
|
+
this.peerId = components.peerId
|
|
52
|
+
this.log = components.logger.forComponent(`libp2p:kad-dht:${lan ? 'lan' : 'wan'}:query-self`)
|
|
54
53
|
this.started = false
|
|
55
54
|
this.peerRouting = peerRouting
|
|
56
55
|
this.routingTable = routingTable
|
|
@@ -125,7 +124,7 @@ export class QuerySelf implements Startable {
|
|
|
125
124
|
const start = Date.now()
|
|
126
125
|
|
|
127
126
|
const found = await pipe(
|
|
128
|
-
this.peerRouting.getClosestPeers(this.
|
|
127
|
+
this.peerRouting.getClosestPeers(this.peerId.toBytes(), {
|
|
129
128
|
signal,
|
|
130
129
|
isSelfQuery: true
|
|
131
130
|
}),
|
package/src/record/selectors.ts
CHANGED
package/src/record/validators.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { CodeError } from '@libp2p/interface
|
|
1
|
+
import { CodeError } from '@libp2p/interface'
|
|
2
2
|
import { sha256 } from 'multiformats/hashes/sha2'
|
|
3
3
|
import { equals as uint8ArrayEquals } from 'uint8arrays/equals'
|
|
4
4
|
import { toString as uint8ArrayToString } from 'uint8arrays/to-string'
|
|
@@ -1,15 +1,10 @@
|
|
|
1
|
-
import { TypedEventEmitter } from '@libp2p/interface
|
|
2
|
-
import { logger } from '@libp2p/logger'
|
|
1
|
+
import { TypedEventEmitter } from '@libp2p/interface'
|
|
3
2
|
import { PeerSet } from '@libp2p/peer-collections'
|
|
4
3
|
import Queue from 'p-queue'
|
|
5
4
|
import * as utils from '../utils.js'
|
|
6
5
|
import { KBucket, type PingEventDetails } from './k-bucket.js'
|
|
7
|
-
import type { Metric, Metrics } from '@libp2p/interface
|
|
8
|
-
import type {
|
|
9
|
-
import type { PeerStore } from '@libp2p/interface/peer-store'
|
|
10
|
-
import type { Startable } from '@libp2p/interface/startable'
|
|
11
|
-
import type { ConnectionManager } from '@libp2p/interface-internal/connection-manager'
|
|
12
|
-
import type { Logger } from '@libp2p/logger'
|
|
6
|
+
import type { ComponentLogger, Logger, Metric, Metrics, PeerId, PeerStore, Startable } from '@libp2p/interface'
|
|
7
|
+
import type { ConnectionManager } from '@libp2p/interface-internal'
|
|
13
8
|
|
|
14
9
|
export const KAD_CLOSE_TAG_NAME = 'kad-close'
|
|
15
10
|
export const KAD_CLOSE_TAG_VALUE = 50
|
|
@@ -32,6 +27,7 @@ export interface RoutingTableComponents {
|
|
|
32
27
|
peerStore: PeerStore
|
|
33
28
|
connectionManager: ConnectionManager
|
|
34
29
|
metrics?: Metrics
|
|
30
|
+
logger: ComponentLogger
|
|
35
31
|
}
|
|
36
32
|
|
|
37
33
|
export interface RoutingTableEvents {
|
|
@@ -69,7 +65,7 @@ export class RoutingTable extends TypedEventEmitter<RoutingTableEvents> implemen
|
|
|
69
65
|
const { kBucketSize, pingTimeout, lan, pingConcurrency, protocol, tagName, tagValue } = init
|
|
70
66
|
|
|
71
67
|
this.components = components
|
|
72
|
-
this.log = logger(`libp2p:kad-dht:${lan ? 'lan' : 'wan'}:routing-table`)
|
|
68
|
+
this.log = components.logger.forComponent(`libp2p:kad-dht:${lan ? 'lan' : 'wan'}:routing-table`)
|
|
73
69
|
this.kBucketSize = kBucketSize ?? KBUCKET_SIZE
|
|
74
70
|
this.pingTimeout = pingTimeout ?? PING_TIMEOUT
|
|
75
71
|
this.pingConcurrency = pingConcurrency ?? PING_CONCURRENCY
|
|
@@ -27,8 +27,8 @@ FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
|
|
27
27
|
OTHER DEALINGS IN THE SOFTWARE.
|
|
28
28
|
*/
|
|
29
29
|
|
|
30
|
-
import { TypedEventEmitter } from '@libp2p/interface
|
|
31
|
-
import type { PeerId } from '@libp2p/interface
|
|
30
|
+
import { TypedEventEmitter } from '@libp2p/interface'
|
|
31
|
+
import type { PeerId } from '@libp2p/interface'
|
|
32
32
|
|
|
33
33
|
function arrayEquals (array1: Uint8Array, array2: Uint8Array): boolean {
|
|
34
34
|
if (array1 === array2) {
|