@libp2p/kad-dht 11.0.8 → 12.0.0-4e0135c7d
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 +78 -0
- package/dist/index.min.js +23 -23
- package/dist/src/constants.d.ts +2 -4
- package/dist/src/constants.d.ts.map +1 -1
- package/dist/src/constants.js +7 -9
- package/dist/src/constants.js.map +1 -1
- package/dist/src/content-fetching/index.d.ts +7 -7
- package/dist/src/content-fetching/index.d.ts.map +1 -1
- package/dist/src/content-fetching/index.js +13 -7
- package/dist/src/content-fetching/index.js.map +1 -1
- package/dist/src/content-routing/index.d.ts +5 -4
- package/dist/src/content-routing/index.d.ts.map +1 -1
- package/dist/src/content-routing/index.js +23 -13
- package/dist/src/content-routing/index.js.map +1 -1
- package/dist/src/index.d.ts +142 -28
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +87 -2
- package/dist/src/index.js.map +1 -1
- package/dist/src/kad-dht.d.ts +20 -21
- package/dist/src/kad-dht.d.ts.map +1 -1
- package/dist/src/kad-dht.js +181 -35
- package/dist/src/kad-dht.js.map +1 -1
- package/dist/src/message/dht.d.ts +35 -35
- package/dist/src/message/dht.d.ts.map +1 -1
- package/dist/src/message/dht.js +150 -130
- package/dist/src/message/dht.js.map +1 -1
- package/dist/src/message/utils.d.ts +5 -0
- package/dist/src/message/utils.d.ts.map +1 -0
- package/dist/src/message/utils.js +20 -0
- package/dist/src/message/utils.js.map +1 -0
- package/dist/src/network.d.ts +8 -8
- package/dist/src/network.d.ts.map +1 -1
- package/dist/src/network.js +30 -18
- package/dist/src/network.js.map +1 -1
- package/dist/src/peer-routing/index.d.ts +6 -6
- package/dist/src/peer-routing/index.d.ts.map +1 -1
- package/dist/src/peer-routing/index.js +48 -35
- package/dist/src/peer-routing/index.js.map +1 -1
- package/dist/src/providers.d.ts +7 -0
- package/dist/src/providers.d.ts.map +1 -1
- package/dist/src/providers.js.map +1 -1
- package/dist/src/query/events.d.ts +13 -12
- package/dist/src/query/events.d.ts.map +1 -1
- package/dist/src/query/events.js +2 -2
- package/dist/src/query/events.js.map +1 -1
- package/dist/src/query/manager.d.ts +8 -5
- package/dist/src/query/manager.d.ts.map +1 -1
- package/dist/src/query/manager.js +6 -6
- package/dist/src/query/manager.js.map +1 -1
- package/dist/src/query/query-path.d.ts +3 -3
- package/dist/src/query/query-path.d.ts.map +1 -1
- package/dist/src/query-self.d.ts +1 -1
- package/dist/src/query-self.d.ts.map +1 -1
- package/dist/src/query-self.js +2 -2
- package/dist/src/query-self.js.map +1 -1
- package/dist/src/routing-table/index.d.ts +5 -6
- package/dist/src/routing-table/index.d.ts.map +1 -1
- package/dist/src/routing-table/index.js +72 -58
- package/dist/src/routing-table/index.js.map +1 -1
- package/dist/src/routing-table/refresh.d.ts +1 -1
- package/dist/src/routing-table/refresh.d.ts.map +1 -1
- package/dist/src/routing-table/refresh.js +2 -2
- package/dist/src/routing-table/refresh.js.map +1 -1
- package/dist/src/rpc/handlers/add-provider.d.ts +2 -1
- package/dist/src/rpc/handlers/add-provider.d.ts.map +1 -1
- package/dist/src/rpc/handlers/add-provider.js +8 -6
- package/dist/src/rpc/handlers/add-provider.js.map +1 -1
- package/dist/src/rpc/handlers/find-node.d.ts +5 -3
- package/dist/src/rpc/handlers/find-node.d.ts.map +1 -1
- package/dist/src/rpc/handlers/find-node.js +22 -14
- package/dist/src/rpc/handlers/find-node.js.map +1 -1
- package/dist/src/rpc/handlers/get-providers.d.ts +5 -3
- package/dist/src/rpc/handlers/get-providers.d.ts.map +1 -1
- package/dist/src/rpc/handlers/get-providers.js +29 -16
- package/dist/src/rpc/handlers/get-providers.js.map +1 -1
- package/dist/src/rpc/handlers/get-value.d.ts +2 -1
- package/dist/src/rpc/handlers/get-value.d.ts.map +1 -1
- package/dist/src/rpc/handlers/get-value.js +16 -7
- package/dist/src/rpc/handlers/get-value.js.map +1 -1
- package/dist/src/rpc/handlers/ping.d.ts +5 -2
- package/dist/src/rpc/handlers/ping.d.ts.map +1 -1
- package/dist/src/rpc/handlers/ping.js +2 -2
- package/dist/src/rpc/handlers/ping.js.map +1 -1
- package/dist/src/rpc/handlers/put-value.d.ts +2 -1
- package/dist/src/rpc/handlers/put-value.d.ts.map +1 -1
- package/dist/src/rpc/handlers/put-value.js +8 -7
- package/dist/src/rpc/handlers/put-value.js.map +1 -1
- package/dist/src/rpc/index.d.ts +4 -3
- package/dist/src/rpc/index.d.ts.map +1 -1
- package/dist/src/rpc/index.js +11 -11
- package/dist/src/rpc/index.js.map +1 -1
- package/dist/src/topology-listener.d.ts +1 -1
- package/dist/src/topology-listener.d.ts.map +1 -1
- package/dist/src/topology-listener.js +2 -2
- package/dist/src/topology-listener.js.map +1 -1
- package/dist/src/utils.d.ts +5 -2
- package/dist/src/utils.d.ts.map +1 -1
- package/dist/src/utils.js +32 -2
- package/dist/src/utils.js.map +1 -1
- package/package.json +13 -11
- package/src/constants.ts +7 -11
- package/src/content-fetching/index.ts +21 -14
- package/src/content-routing/index.ts +29 -18
- package/src/index.ts +148 -32
- package/src/kad-dht.ts +225 -56
- package/src/message/dht.proto +32 -32
- package/src/message/dht.ts +155 -138
- package/src/message/utils.ts +25 -0
- package/src/network.ts +41 -25
- package/src/peer-routing/index.ts +57 -42
- package/src/providers.ts +7 -0
- package/src/query/events.ts +14 -14
- package/src/query/manager.ts +14 -10
- package/src/query/query-path.ts +3 -3
- package/src/query-self.ts +3 -3
- package/src/routing-table/index.ts +86 -64
- package/src/routing-table/refresh.ts +4 -4
- package/src/rpc/handlers/add-provider.ts +10 -7
- package/src/rpc/handlers/find-node.ts +27 -18
- package/src/rpc/handlers/get-providers.ts +33 -20
- package/src/rpc/handlers/get-value.ts +18 -7
- package/src/rpc/handlers/ping.ts +7 -3
- package/src/rpc/handlers/put-value.ts +11 -9
- package/src/rpc/index.ts +14 -13
- package/src/topology-listener.ts +3 -3
- package/src/utils.ts +41 -2
- package/dist/src/dual-kad-dht.d.ts +0 -69
- package/dist/src/dual-kad-dht.d.ts.map +0 -1
- package/dist/src/dual-kad-dht.js +0 -304
- package/dist/src/dual-kad-dht.js.map +0 -1
- package/dist/src/message/index.d.ts +0 -35
- package/dist/src/message/index.d.ts.map +0 -1
- package/dist/src/message/index.js +0 -92
- package/dist/src/message/index.js.map +0 -1
- package/dist/typedoc-urls.json +0 -55
- package/src/dual-kad-dht.ts +0 -384
- package/src/message/index.ts +0 -117
package/src/message/dht.ts
CHANGED
|
@@ -4,8 +4,8 @@
|
|
|
4
4
|
/* eslint-disable @typescript-eslint/no-unnecessary-boolean-literal-compare */
|
|
5
5
|
/* eslint-disable @typescript-eslint/no-empty-interface */
|
|
6
6
|
|
|
7
|
-
import {
|
|
8
|
-
import
|
|
7
|
+
import { type Codec, decodeMessage, encodeMessage, enumeration, message } from 'protons-runtime'
|
|
8
|
+
import { alloc as uint8ArrayAlloc } from 'uint8arrays/alloc'
|
|
9
9
|
import type { Uint8ArrayList } from 'uint8arraylist'
|
|
10
10
|
|
|
11
11
|
export interface Record {
|
|
@@ -63,24 +63,30 @@ export namespace Record {
|
|
|
63
63
|
const tag = reader.uint32()
|
|
64
64
|
|
|
65
65
|
switch (tag >>> 3) {
|
|
66
|
-
case 1:
|
|
66
|
+
case 1: {
|
|
67
67
|
obj.key = reader.bytes()
|
|
68
68
|
break
|
|
69
|
-
|
|
69
|
+
}
|
|
70
|
+
case 2: {
|
|
70
71
|
obj.value = reader.bytes()
|
|
71
72
|
break
|
|
72
|
-
|
|
73
|
+
}
|
|
74
|
+
case 3: {
|
|
73
75
|
obj.author = reader.bytes()
|
|
74
76
|
break
|
|
75
|
-
|
|
77
|
+
}
|
|
78
|
+
case 4: {
|
|
76
79
|
obj.signature = reader.bytes()
|
|
77
80
|
break
|
|
78
|
-
|
|
81
|
+
}
|
|
82
|
+
case 5: {
|
|
79
83
|
obj.timeReceived = reader.string()
|
|
80
84
|
break
|
|
81
|
-
|
|
85
|
+
}
|
|
86
|
+
default: {
|
|
82
87
|
reader.skipType(tag & 7)
|
|
83
88
|
break
|
|
89
|
+
}
|
|
84
90
|
}
|
|
85
91
|
}
|
|
86
92
|
|
|
@@ -100,138 +106,141 @@ export namespace Record {
|
|
|
100
106
|
}
|
|
101
107
|
}
|
|
102
108
|
|
|
103
|
-
export
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
109
|
+
export enum MessageType {
|
|
110
|
+
PUT_VALUE = 'PUT_VALUE',
|
|
111
|
+
GET_VALUE = 'GET_VALUE',
|
|
112
|
+
ADD_PROVIDER = 'ADD_PROVIDER',
|
|
113
|
+
GET_PROVIDERS = 'GET_PROVIDERS',
|
|
114
|
+
FIND_NODE = 'FIND_NODE',
|
|
115
|
+
PING = 'PING'
|
|
110
116
|
}
|
|
111
117
|
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
enum __MessageTypeValues {
|
|
123
|
-
PUT_VALUE = 0,
|
|
124
|
-
GET_VALUE = 1,
|
|
125
|
-
ADD_PROVIDER = 2,
|
|
126
|
-
GET_PROVIDERS = 3,
|
|
127
|
-
FIND_NODE = 4,
|
|
128
|
-
PING = 5
|
|
129
|
-
}
|
|
118
|
+
enum __MessageTypeValues {
|
|
119
|
+
PUT_VALUE = 0,
|
|
120
|
+
GET_VALUE = 1,
|
|
121
|
+
ADD_PROVIDER = 2,
|
|
122
|
+
GET_PROVIDERS = 3,
|
|
123
|
+
FIND_NODE = 4,
|
|
124
|
+
PING = 5
|
|
125
|
+
}
|
|
130
126
|
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
}
|
|
127
|
+
export namespace MessageType {
|
|
128
|
+
export const codec = (): Codec<MessageType> => {
|
|
129
|
+
return enumeration<MessageType>(__MessageTypeValues)
|
|
135
130
|
}
|
|
131
|
+
}
|
|
132
|
+
export enum ConnectionType {
|
|
133
|
+
NOT_CONNECTED = 'NOT_CONNECTED',
|
|
134
|
+
CONNECTED = 'CONNECTED',
|
|
135
|
+
CAN_CONNECT = 'CAN_CONNECT',
|
|
136
|
+
CANNOT_CONNECT = 'CANNOT_CONNECT'
|
|
137
|
+
}
|
|
136
138
|
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
139
|
+
enum __ConnectionTypeValues {
|
|
140
|
+
NOT_CONNECTED = 0,
|
|
141
|
+
CONNECTED = 1,
|
|
142
|
+
CAN_CONNECT = 2,
|
|
143
|
+
CANNOT_CONNECT = 3
|
|
144
|
+
}
|
|
143
145
|
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
CAN_CONNECT = 2,
|
|
148
|
-
CANNOT_CONNECT = 3
|
|
146
|
+
export namespace ConnectionType {
|
|
147
|
+
export const codec = (): Codec<ConnectionType> => {
|
|
148
|
+
return enumeration<ConnectionType>(__ConnectionTypeValues)
|
|
149
149
|
}
|
|
150
|
+
}
|
|
151
|
+
export interface PeerInfo {
|
|
152
|
+
id: Uint8Array
|
|
153
|
+
multiaddrs: Uint8Array[]
|
|
154
|
+
connection?: ConnectionType
|
|
155
|
+
}
|
|
150
156
|
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
return enumeration<ConnectionType>(__ConnectionTypeValues)
|
|
154
|
-
}
|
|
155
|
-
}
|
|
157
|
+
export namespace PeerInfo {
|
|
158
|
+
let _codec: Codec<PeerInfo>
|
|
156
159
|
|
|
157
|
-
export
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
160
|
+
export const codec = (): Codec<PeerInfo> => {
|
|
161
|
+
if (_codec == null) {
|
|
162
|
+
_codec = message<PeerInfo>((obj, w, opts = {}) => {
|
|
163
|
+
if (opts.lengthDelimited !== false) {
|
|
164
|
+
w.fork()
|
|
165
|
+
}
|
|
162
166
|
|
|
163
|
-
|
|
164
|
-
|
|
167
|
+
if ((obj.id != null && obj.id.byteLength > 0)) {
|
|
168
|
+
w.uint32(10)
|
|
169
|
+
w.bytes(obj.id)
|
|
170
|
+
}
|
|
165
171
|
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
w.fork()
|
|
172
|
+
if (obj.multiaddrs != null) {
|
|
173
|
+
for (const value of obj.multiaddrs) {
|
|
174
|
+
w.uint32(18)
|
|
175
|
+
w.bytes(value)
|
|
171
176
|
}
|
|
177
|
+
}
|
|
172
178
|
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
179
|
+
if (obj.connection != null) {
|
|
180
|
+
w.uint32(24)
|
|
181
|
+
ConnectionType.codec().encode(obj.connection, w)
|
|
182
|
+
}
|
|
177
183
|
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
+
if (opts.lengthDelimited !== false) {
|
|
185
|
+
w.ldelim()
|
|
186
|
+
}
|
|
187
|
+
}, (reader, length) => {
|
|
188
|
+
const obj: any = {
|
|
189
|
+
id: uint8ArrayAlloc(0),
|
|
190
|
+
multiaddrs: []
|
|
191
|
+
}
|
|
184
192
|
|
|
185
|
-
|
|
186
|
-
w.uint32(24)
|
|
187
|
-
Message.ConnectionType.codec().encode(obj.connection, w)
|
|
188
|
-
}
|
|
193
|
+
const end = length == null ? reader.len : reader.pos + length
|
|
189
194
|
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
}
|
|
193
|
-
}, (reader, length) => {
|
|
194
|
-
const obj: any = {
|
|
195
|
-
addrs: []
|
|
196
|
-
}
|
|
195
|
+
while (reader.pos < end) {
|
|
196
|
+
const tag = reader.uint32()
|
|
197
197
|
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
reader.skipType(tag & 7)
|
|
215
|
-
break
|
|
198
|
+
switch (tag >>> 3) {
|
|
199
|
+
case 1: {
|
|
200
|
+
obj.id = reader.bytes()
|
|
201
|
+
break
|
|
202
|
+
}
|
|
203
|
+
case 2: {
|
|
204
|
+
obj.multiaddrs.push(reader.bytes())
|
|
205
|
+
break
|
|
206
|
+
}
|
|
207
|
+
case 3: {
|
|
208
|
+
obj.connection = ConnectionType.codec().decode(reader)
|
|
209
|
+
break
|
|
210
|
+
}
|
|
211
|
+
default: {
|
|
212
|
+
reader.skipType(tag & 7)
|
|
213
|
+
break
|
|
216
214
|
}
|
|
217
215
|
}
|
|
216
|
+
}
|
|
218
217
|
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
}
|
|
222
|
-
|
|
223
|
-
return _codec
|
|
218
|
+
return obj
|
|
219
|
+
})
|
|
224
220
|
}
|
|
225
221
|
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
}
|
|
222
|
+
return _codec
|
|
223
|
+
}
|
|
229
224
|
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
225
|
+
export const encode = (obj: Partial<PeerInfo>): Uint8Array => {
|
|
226
|
+
return encodeMessage(obj, PeerInfo.codec())
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
export const decode = (buf: Uint8Array | Uint8ArrayList): PeerInfo => {
|
|
230
|
+
return decodeMessage(buf, PeerInfo.codec())
|
|
233
231
|
}
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
export interface Message {
|
|
235
|
+
type: MessageType
|
|
236
|
+
clusterLevel?: number
|
|
237
|
+
key?: Uint8Array
|
|
238
|
+
record?: Uint8Array
|
|
239
|
+
closer: PeerInfo[]
|
|
240
|
+
providers: PeerInfo[]
|
|
241
|
+
}
|
|
234
242
|
|
|
243
|
+
export namespace Message {
|
|
235
244
|
let _codec: Codec<Message>
|
|
236
245
|
|
|
237
246
|
export const codec = (): Codec<Message> => {
|
|
@@ -241,14 +250,14 @@ export namespace Message {
|
|
|
241
250
|
w.fork()
|
|
242
251
|
}
|
|
243
252
|
|
|
244
|
-
if (obj.type != null) {
|
|
253
|
+
if (obj.type != null && __MessageTypeValues[obj.type] !== 0) {
|
|
245
254
|
w.uint32(8)
|
|
246
|
-
|
|
255
|
+
MessageType.codec().encode(obj.type, w)
|
|
247
256
|
}
|
|
248
257
|
|
|
249
|
-
if (obj.
|
|
258
|
+
if (obj.clusterLevel != null) {
|
|
250
259
|
w.uint32(80)
|
|
251
|
-
w.int32(obj.
|
|
260
|
+
w.int32(obj.clusterLevel)
|
|
252
261
|
}
|
|
253
262
|
|
|
254
263
|
if (obj.key != null) {
|
|
@@ -261,17 +270,17 @@ export namespace Message {
|
|
|
261
270
|
w.bytes(obj.record)
|
|
262
271
|
}
|
|
263
272
|
|
|
264
|
-
if (obj.
|
|
265
|
-
for (const value of obj.
|
|
273
|
+
if (obj.closer != null) {
|
|
274
|
+
for (const value of obj.closer) {
|
|
266
275
|
w.uint32(66)
|
|
267
|
-
|
|
276
|
+
PeerInfo.codec().encode(value, w)
|
|
268
277
|
}
|
|
269
278
|
}
|
|
270
279
|
|
|
271
|
-
if (obj.
|
|
272
|
-
for (const value of obj.
|
|
280
|
+
if (obj.providers != null) {
|
|
281
|
+
for (const value of obj.providers) {
|
|
273
282
|
w.uint32(74)
|
|
274
|
-
|
|
283
|
+
PeerInfo.codec().encode(value, w)
|
|
275
284
|
}
|
|
276
285
|
}
|
|
277
286
|
|
|
@@ -280,8 +289,9 @@ export namespace Message {
|
|
|
280
289
|
}
|
|
281
290
|
}, (reader, length) => {
|
|
282
291
|
const obj: any = {
|
|
283
|
-
|
|
284
|
-
|
|
292
|
+
type: MessageType.PUT_VALUE,
|
|
293
|
+
closer: [],
|
|
294
|
+
providers: []
|
|
285
295
|
}
|
|
286
296
|
|
|
287
297
|
const end = length == null ? reader.len : reader.pos + length
|
|
@@ -290,27 +300,34 @@ export namespace Message {
|
|
|
290
300
|
const tag = reader.uint32()
|
|
291
301
|
|
|
292
302
|
switch (tag >>> 3) {
|
|
293
|
-
case 1:
|
|
294
|
-
obj.type =
|
|
303
|
+
case 1: {
|
|
304
|
+
obj.type = MessageType.codec().decode(reader)
|
|
295
305
|
break
|
|
296
|
-
|
|
297
|
-
|
|
306
|
+
}
|
|
307
|
+
case 10: {
|
|
308
|
+
obj.clusterLevel = reader.int32()
|
|
298
309
|
break
|
|
299
|
-
|
|
310
|
+
}
|
|
311
|
+
case 2: {
|
|
300
312
|
obj.key = reader.bytes()
|
|
301
313
|
break
|
|
302
|
-
|
|
314
|
+
}
|
|
315
|
+
case 3: {
|
|
303
316
|
obj.record = reader.bytes()
|
|
304
317
|
break
|
|
305
|
-
|
|
306
|
-
|
|
318
|
+
}
|
|
319
|
+
case 8: {
|
|
320
|
+
obj.closer.push(PeerInfo.codec().decode(reader, reader.uint32()))
|
|
307
321
|
break
|
|
308
|
-
|
|
309
|
-
|
|
322
|
+
}
|
|
323
|
+
case 9: {
|
|
324
|
+
obj.providers.push(PeerInfo.codec().decode(reader, reader.uint32()))
|
|
310
325
|
break
|
|
311
|
-
|
|
326
|
+
}
|
|
327
|
+
default: {
|
|
312
328
|
reader.skipType(tag & 7)
|
|
313
329
|
break
|
|
330
|
+
}
|
|
314
331
|
}
|
|
315
332
|
}
|
|
316
333
|
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { peerIdFromBytes } from '@libp2p/peer-id'
|
|
2
|
+
import { multiaddr } from '@multiformats/multiaddr'
|
|
3
|
+
import type { PeerInfo as PBPeerInfo, ConnectionType } from './dht.js'
|
|
4
|
+
import type { PeerInfo } from '@libp2p/interface'
|
|
5
|
+
|
|
6
|
+
export function toPbPeerInfo (peer: PeerInfo, connection?: ConnectionType): PBPeerInfo {
|
|
7
|
+
const output: PBPeerInfo = {
|
|
8
|
+
id: peer.id.toBytes(),
|
|
9
|
+
multiaddrs: (peer.multiaddrs ?? []).map((m) => m.bytes),
|
|
10
|
+
connection
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
return output
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export function fromPbPeerInfo (peer: PBPeerInfo): PeerInfo {
|
|
17
|
+
if (peer.id == null) {
|
|
18
|
+
throw new Error('Invalid peer in message')
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
return {
|
|
22
|
+
id: peerIdFromBytes(peer.id),
|
|
23
|
+
multiaddrs: (peer.multiaddrs ?? []).map((a) => multiaddr(a))
|
|
24
|
+
}
|
|
25
|
+
}
|
package/src/network.ts
CHANGED
|
@@ -1,18 +1,21 @@
|
|
|
1
|
-
import { TypedEventEmitter
|
|
1
|
+
import { TypedEventEmitter } from '@libp2p/interface'
|
|
2
2
|
import { pbStream } from 'it-protobuf-stream'
|
|
3
|
-
import {
|
|
3
|
+
import { CodeError } from 'protons-runtime'
|
|
4
|
+
import { Message } from './message/dht.js'
|
|
5
|
+
import { fromPbPeerInfo } from './message/utils.js'
|
|
4
6
|
import {
|
|
5
7
|
dialPeerEvent,
|
|
6
8
|
sendQueryEvent,
|
|
7
9
|
peerResponseEvent,
|
|
8
10
|
queryErrorEvent
|
|
9
11
|
} from './query/events.js'
|
|
10
|
-
import
|
|
11
|
-
import type {
|
|
12
|
+
import { Libp2pRecord } from './record/index.js'
|
|
13
|
+
import type { KadDHTComponents, QueryEvent } from './index.js'
|
|
14
|
+
import type { AbortOptions, Logger, Stream, PeerId, PeerInfo, Startable, RoutingOptions } from '@libp2p/interface'
|
|
12
15
|
|
|
13
16
|
export interface NetworkInit {
|
|
14
17
|
protocol: string
|
|
15
|
-
|
|
18
|
+
logPrefix: string
|
|
16
19
|
}
|
|
17
20
|
|
|
18
21
|
interface NetworkEvents {
|
|
@@ -34,9 +37,9 @@ export class Network extends TypedEventEmitter<NetworkEvents> implements Startab
|
|
|
34
37
|
constructor (components: KadDHTComponents, init: NetworkInit) {
|
|
35
38
|
super()
|
|
36
39
|
|
|
37
|
-
const { protocol
|
|
40
|
+
const { protocol } = init
|
|
38
41
|
this.components = components
|
|
39
|
-
this.log = components.logger.forComponent(
|
|
42
|
+
this.log = components.logger.forComponent(`${init.logPrefix}:network`)
|
|
40
43
|
this.running = false
|
|
41
44
|
this.protocol = protocol
|
|
42
45
|
}
|
|
@@ -69,14 +72,20 @@ export class Network extends TypedEventEmitter<NetworkEvents> implements Startab
|
|
|
69
72
|
/**
|
|
70
73
|
* Send a request and record RTT for latency measurements
|
|
71
74
|
*/
|
|
72
|
-
async * sendRequest (to: PeerId, msg: Message
|
|
75
|
+
async * sendRequest (to: PeerId, msg: Partial<Message>, options: RoutingOptions = {}): AsyncGenerator<QueryEvent> {
|
|
73
76
|
if (!this.running) {
|
|
74
77
|
return
|
|
75
78
|
}
|
|
76
79
|
|
|
80
|
+
const type = msg.type
|
|
81
|
+
|
|
82
|
+
if (type == null) {
|
|
83
|
+
throw new CodeError('Message type was missing', 'ERR_INVALID_PARAMETERS')
|
|
84
|
+
}
|
|
85
|
+
|
|
77
86
|
this.log('sending %s to %p', msg.type, to)
|
|
78
87
|
yield dialPeerEvent({ peer: to }, options)
|
|
79
|
-
yield sendQueryEvent({ to, type
|
|
88
|
+
yield sendQueryEvent({ to, type }, options)
|
|
80
89
|
|
|
81
90
|
let stream: Stream | undefined
|
|
82
91
|
|
|
@@ -89,11 +98,12 @@ export class Network extends TypedEventEmitter<NetworkEvents> implements Startab
|
|
|
89
98
|
yield peerResponseEvent({
|
|
90
99
|
from: to,
|
|
91
100
|
messageType: response.type,
|
|
92
|
-
closer: response.
|
|
93
|
-
providers: response.
|
|
94
|
-
record: response.record
|
|
101
|
+
closer: response.closer.map(fromPbPeerInfo),
|
|
102
|
+
providers: response.providers.map(fromPbPeerInfo),
|
|
103
|
+
record: response.record == null ? undefined : Libp2pRecord.deserialize(response.record)
|
|
95
104
|
}, options)
|
|
96
105
|
} catch (err: any) {
|
|
106
|
+
this.log.error('could not send %s to %p', msg.type, to, err)
|
|
97
107
|
yield queryErrorEvent({ from: to, error: err }, options)
|
|
98
108
|
} finally {
|
|
99
109
|
if (stream != null) {
|
|
@@ -105,14 +115,20 @@ export class Network extends TypedEventEmitter<NetworkEvents> implements Startab
|
|
|
105
115
|
/**
|
|
106
116
|
* Sends a message without expecting an answer
|
|
107
117
|
*/
|
|
108
|
-
async * sendMessage (to: PeerId, msg: Message
|
|
118
|
+
async * sendMessage (to: PeerId, msg: Partial<Message>, options: RoutingOptions = {}): AsyncGenerator<QueryEvent> {
|
|
109
119
|
if (!this.running) {
|
|
110
120
|
return
|
|
111
121
|
}
|
|
112
122
|
|
|
123
|
+
const type = msg.type
|
|
124
|
+
|
|
125
|
+
if (type == null) {
|
|
126
|
+
throw new CodeError('Message type was missing', 'ERR_INVALID_PARAMETERS')
|
|
127
|
+
}
|
|
128
|
+
|
|
113
129
|
this.log('sending %s to %p', msg.type, to)
|
|
114
130
|
yield dialPeerEvent({ peer: to }, options)
|
|
115
|
-
yield sendQueryEvent({ to, type
|
|
131
|
+
yield sendQueryEvent({ to, type }, options)
|
|
116
132
|
|
|
117
133
|
let stream: Stream | undefined
|
|
118
134
|
|
|
@@ -122,7 +138,7 @@ export class Network extends TypedEventEmitter<NetworkEvents> implements Startab
|
|
|
122
138
|
|
|
123
139
|
await this._writeMessage(stream, msg, options)
|
|
124
140
|
|
|
125
|
-
yield peerResponseEvent({ from: to, messageType:
|
|
141
|
+
yield peerResponseEvent({ from: to, messageType: type }, options)
|
|
126
142
|
} catch (err: any) {
|
|
127
143
|
yield queryErrorEvent({ from: to, error: err }, options)
|
|
128
144
|
} finally {
|
|
@@ -135,7 +151,7 @@ export class Network extends TypedEventEmitter<NetworkEvents> implements Startab
|
|
|
135
151
|
/**
|
|
136
152
|
* Write a message to the given stream
|
|
137
153
|
*/
|
|
138
|
-
async _writeMessage (stream: Stream, msg: Message
|
|
154
|
+
async _writeMessage (stream: Stream, msg: Partial<Message>, options: AbortOptions): Promise<void> {
|
|
139
155
|
const pb = pbStream(stream)
|
|
140
156
|
await pb.write(msg, Message, options)
|
|
141
157
|
await pb.unwrap().close(options)
|
|
@@ -146,7 +162,7 @@ export class Network extends TypedEventEmitter<NetworkEvents> implements Startab
|
|
|
146
162
|
* If no response is received after the specified timeout
|
|
147
163
|
* this will error out.
|
|
148
164
|
*/
|
|
149
|
-
async _writeReadMessage (stream: Stream, msg: Message
|
|
165
|
+
async _writeReadMessage (stream: Stream, msg: Partial<Message>, options: AbortOptions): Promise<Message> {
|
|
150
166
|
const pb = pbStream(stream)
|
|
151
167
|
|
|
152
168
|
await pb.write(msg, Message, options)
|
|
@@ -156,15 +172,15 @@ export class Network extends TypedEventEmitter<NetworkEvents> implements Startab
|
|
|
156
172
|
await pb.unwrap().close(options)
|
|
157
173
|
|
|
158
174
|
// tell any listeners about new peers we've seen
|
|
159
|
-
message.
|
|
160
|
-
this.
|
|
161
|
-
detail: peerData
|
|
162
|
-
})
|
|
175
|
+
message.closer.forEach(peerData => {
|
|
176
|
+
this.safeDispatchEvent<PeerInfo>('peer', {
|
|
177
|
+
detail: fromPbPeerInfo(peerData)
|
|
178
|
+
})
|
|
163
179
|
})
|
|
164
|
-
message.
|
|
165
|
-
this.
|
|
166
|
-
detail: peerData
|
|
167
|
-
})
|
|
180
|
+
message.providers.forEach(peerData => {
|
|
181
|
+
this.safeDispatchEvent<PeerInfo>('peer', {
|
|
182
|
+
detail: fromPbPeerInfo(peerData)
|
|
183
|
+
})
|
|
168
184
|
})
|
|
169
185
|
|
|
170
186
|
return message
|