@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.
Files changed (137) hide show
  1. package/README.md +78 -0
  2. package/dist/index.min.js +23 -23
  3. package/dist/src/constants.d.ts +2 -4
  4. package/dist/src/constants.d.ts.map +1 -1
  5. package/dist/src/constants.js +7 -9
  6. package/dist/src/constants.js.map +1 -1
  7. package/dist/src/content-fetching/index.d.ts +7 -7
  8. package/dist/src/content-fetching/index.d.ts.map +1 -1
  9. package/dist/src/content-fetching/index.js +13 -7
  10. package/dist/src/content-fetching/index.js.map +1 -1
  11. package/dist/src/content-routing/index.d.ts +5 -4
  12. package/dist/src/content-routing/index.d.ts.map +1 -1
  13. package/dist/src/content-routing/index.js +23 -13
  14. package/dist/src/content-routing/index.js.map +1 -1
  15. package/dist/src/index.d.ts +142 -28
  16. package/dist/src/index.d.ts.map +1 -1
  17. package/dist/src/index.js +87 -2
  18. package/dist/src/index.js.map +1 -1
  19. package/dist/src/kad-dht.d.ts +20 -21
  20. package/dist/src/kad-dht.d.ts.map +1 -1
  21. package/dist/src/kad-dht.js +181 -35
  22. package/dist/src/kad-dht.js.map +1 -1
  23. package/dist/src/message/dht.d.ts +35 -35
  24. package/dist/src/message/dht.d.ts.map +1 -1
  25. package/dist/src/message/dht.js +150 -130
  26. package/dist/src/message/dht.js.map +1 -1
  27. package/dist/src/message/utils.d.ts +5 -0
  28. package/dist/src/message/utils.d.ts.map +1 -0
  29. package/dist/src/message/utils.js +20 -0
  30. package/dist/src/message/utils.js.map +1 -0
  31. package/dist/src/network.d.ts +8 -8
  32. package/dist/src/network.d.ts.map +1 -1
  33. package/dist/src/network.js +30 -18
  34. package/dist/src/network.js.map +1 -1
  35. package/dist/src/peer-routing/index.d.ts +6 -6
  36. package/dist/src/peer-routing/index.d.ts.map +1 -1
  37. package/dist/src/peer-routing/index.js +48 -35
  38. package/dist/src/peer-routing/index.js.map +1 -1
  39. package/dist/src/providers.d.ts +7 -0
  40. package/dist/src/providers.d.ts.map +1 -1
  41. package/dist/src/providers.js.map +1 -1
  42. package/dist/src/query/events.d.ts +13 -12
  43. package/dist/src/query/events.d.ts.map +1 -1
  44. package/dist/src/query/events.js +2 -2
  45. package/dist/src/query/events.js.map +1 -1
  46. package/dist/src/query/manager.d.ts +8 -5
  47. package/dist/src/query/manager.d.ts.map +1 -1
  48. package/dist/src/query/manager.js +6 -6
  49. package/dist/src/query/manager.js.map +1 -1
  50. package/dist/src/query/query-path.d.ts +3 -3
  51. package/dist/src/query/query-path.d.ts.map +1 -1
  52. package/dist/src/query-self.d.ts +1 -1
  53. package/dist/src/query-self.d.ts.map +1 -1
  54. package/dist/src/query-self.js +2 -2
  55. package/dist/src/query-self.js.map +1 -1
  56. package/dist/src/routing-table/index.d.ts +5 -6
  57. package/dist/src/routing-table/index.d.ts.map +1 -1
  58. package/dist/src/routing-table/index.js +72 -58
  59. package/dist/src/routing-table/index.js.map +1 -1
  60. package/dist/src/routing-table/refresh.d.ts +1 -1
  61. package/dist/src/routing-table/refresh.d.ts.map +1 -1
  62. package/dist/src/routing-table/refresh.js +2 -2
  63. package/dist/src/routing-table/refresh.js.map +1 -1
  64. package/dist/src/rpc/handlers/add-provider.d.ts +2 -1
  65. package/dist/src/rpc/handlers/add-provider.d.ts.map +1 -1
  66. package/dist/src/rpc/handlers/add-provider.js +8 -6
  67. package/dist/src/rpc/handlers/add-provider.js.map +1 -1
  68. package/dist/src/rpc/handlers/find-node.d.ts +5 -3
  69. package/dist/src/rpc/handlers/find-node.d.ts.map +1 -1
  70. package/dist/src/rpc/handlers/find-node.js +22 -14
  71. package/dist/src/rpc/handlers/find-node.js.map +1 -1
  72. package/dist/src/rpc/handlers/get-providers.d.ts +5 -3
  73. package/dist/src/rpc/handlers/get-providers.d.ts.map +1 -1
  74. package/dist/src/rpc/handlers/get-providers.js +29 -16
  75. package/dist/src/rpc/handlers/get-providers.js.map +1 -1
  76. package/dist/src/rpc/handlers/get-value.d.ts +2 -1
  77. package/dist/src/rpc/handlers/get-value.d.ts.map +1 -1
  78. package/dist/src/rpc/handlers/get-value.js +16 -7
  79. package/dist/src/rpc/handlers/get-value.js.map +1 -1
  80. package/dist/src/rpc/handlers/ping.d.ts +5 -2
  81. package/dist/src/rpc/handlers/ping.d.ts.map +1 -1
  82. package/dist/src/rpc/handlers/ping.js +2 -2
  83. package/dist/src/rpc/handlers/ping.js.map +1 -1
  84. package/dist/src/rpc/handlers/put-value.d.ts +2 -1
  85. package/dist/src/rpc/handlers/put-value.d.ts.map +1 -1
  86. package/dist/src/rpc/handlers/put-value.js +8 -7
  87. package/dist/src/rpc/handlers/put-value.js.map +1 -1
  88. package/dist/src/rpc/index.d.ts +4 -3
  89. package/dist/src/rpc/index.d.ts.map +1 -1
  90. package/dist/src/rpc/index.js +11 -11
  91. package/dist/src/rpc/index.js.map +1 -1
  92. package/dist/src/topology-listener.d.ts +1 -1
  93. package/dist/src/topology-listener.d.ts.map +1 -1
  94. package/dist/src/topology-listener.js +2 -2
  95. package/dist/src/topology-listener.js.map +1 -1
  96. package/dist/src/utils.d.ts +5 -2
  97. package/dist/src/utils.d.ts.map +1 -1
  98. package/dist/src/utils.js +32 -2
  99. package/dist/src/utils.js.map +1 -1
  100. package/package.json +13 -11
  101. package/src/constants.ts +7 -11
  102. package/src/content-fetching/index.ts +21 -14
  103. package/src/content-routing/index.ts +29 -18
  104. package/src/index.ts +148 -32
  105. package/src/kad-dht.ts +225 -56
  106. package/src/message/dht.proto +32 -32
  107. package/src/message/dht.ts +155 -138
  108. package/src/message/utils.ts +25 -0
  109. package/src/network.ts +41 -25
  110. package/src/peer-routing/index.ts +57 -42
  111. package/src/providers.ts +7 -0
  112. package/src/query/events.ts +14 -14
  113. package/src/query/manager.ts +14 -10
  114. package/src/query/query-path.ts +3 -3
  115. package/src/query-self.ts +3 -3
  116. package/src/routing-table/index.ts +86 -64
  117. package/src/routing-table/refresh.ts +4 -4
  118. package/src/rpc/handlers/add-provider.ts +10 -7
  119. package/src/rpc/handlers/find-node.ts +27 -18
  120. package/src/rpc/handlers/get-providers.ts +33 -20
  121. package/src/rpc/handlers/get-value.ts +18 -7
  122. package/src/rpc/handlers/ping.ts +7 -3
  123. package/src/rpc/handlers/put-value.ts +11 -9
  124. package/src/rpc/index.ts +14 -13
  125. package/src/topology-listener.ts +3 -3
  126. package/src/utils.ts +41 -2
  127. package/dist/src/dual-kad-dht.d.ts +0 -69
  128. package/dist/src/dual-kad-dht.d.ts.map +0 -1
  129. package/dist/src/dual-kad-dht.js +0 -304
  130. package/dist/src/dual-kad-dht.js.map +0 -1
  131. package/dist/src/message/index.d.ts +0 -35
  132. package/dist/src/message/index.d.ts.map +0 -1
  133. package/dist/src/message/index.js +0 -92
  134. package/dist/src/message/index.js.map +0 -1
  135. package/dist/typedoc-urls.json +0 -55
  136. package/src/dual-kad-dht.ts +0 -384
  137. package/src/message/index.ts +0 -117
@@ -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 { encodeMessage, decodeMessage, message, enumeration } from 'protons-runtime'
8
- import type { Codec } from 'protons-runtime'
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
- case 2:
69
+ }
70
+ case 2: {
70
71
  obj.value = reader.bytes()
71
72
  break
72
- case 3:
73
+ }
74
+ case 3: {
73
75
  obj.author = reader.bytes()
74
76
  break
75
- case 4:
77
+ }
78
+ case 4: {
76
79
  obj.signature = reader.bytes()
77
80
  break
78
- case 5:
81
+ }
82
+ case 5: {
79
83
  obj.timeReceived = reader.string()
80
84
  break
81
- default:
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 interface Message {
104
- type?: Message.MessageType
105
- clusterLevelRaw?: number
106
- key?: Uint8Array
107
- record?: Uint8Array
108
- closerPeers: Message.Peer[]
109
- providerPeers: Message.Peer[]
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
- export namespace Message {
113
- export enum MessageType {
114
- PUT_VALUE = 'PUT_VALUE',
115
- GET_VALUE = 'GET_VALUE',
116
- ADD_PROVIDER = 'ADD_PROVIDER',
117
- GET_PROVIDERS = 'GET_PROVIDERS',
118
- FIND_NODE = 'FIND_NODE',
119
- PING = 'PING'
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
- export namespace MessageType {
132
- export const codec = (): Codec<MessageType> => {
133
- return enumeration<MessageType>(__MessageTypeValues)
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
- export enum ConnectionType {
138
- NOT_CONNECTED = 'NOT_CONNECTED',
139
- CONNECTED = 'CONNECTED',
140
- CAN_CONNECT = 'CAN_CONNECT',
141
- CANNOT_CONNECT = 'CANNOT_CONNECT'
142
- }
139
+ enum __ConnectionTypeValues {
140
+ NOT_CONNECTED = 0,
141
+ CONNECTED = 1,
142
+ CAN_CONNECT = 2,
143
+ CANNOT_CONNECT = 3
144
+ }
143
145
 
144
- enum __ConnectionTypeValues {
145
- NOT_CONNECTED = 0,
146
- CONNECTED = 1,
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
- export namespace ConnectionType {
152
- export const codec = (): Codec<ConnectionType> => {
153
- return enumeration<ConnectionType>(__ConnectionTypeValues)
154
- }
155
- }
157
+ export namespace PeerInfo {
158
+ let _codec: Codec<PeerInfo>
156
159
 
157
- export interface Peer {
158
- id?: Uint8Array
159
- addrs: Uint8Array[]
160
- connection?: Message.ConnectionType
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
- export namespace Peer {
164
- let _codec: Codec<Peer>
167
+ if ((obj.id != null && obj.id.byteLength > 0)) {
168
+ w.uint32(10)
169
+ w.bytes(obj.id)
170
+ }
165
171
 
166
- export const codec = (): Codec<Peer> => {
167
- if (_codec == null) {
168
- _codec = message<Peer>((obj, w, opts = {}) => {
169
- if (opts.lengthDelimited !== false) {
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
- if (obj.id != null) {
174
- w.uint32(10)
175
- w.bytes(obj.id)
176
- }
179
+ if (obj.connection != null) {
180
+ w.uint32(24)
181
+ ConnectionType.codec().encode(obj.connection, w)
182
+ }
177
183
 
178
- if (obj.addrs != null) {
179
- for (const value of obj.addrs) {
180
- w.uint32(18)
181
- w.bytes(value)
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
- if (obj.connection != null) {
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
- if (opts.lengthDelimited !== false) {
191
- w.ldelim()
192
- }
193
- }, (reader, length) => {
194
- const obj: any = {
195
- addrs: []
196
- }
195
+ while (reader.pos < end) {
196
+ const tag = reader.uint32()
197
197
 
198
- const end = length == null ? reader.len : reader.pos + length
199
-
200
- while (reader.pos < end) {
201
- const tag = reader.uint32()
202
-
203
- switch (tag >>> 3) {
204
- case 1:
205
- obj.id = reader.bytes()
206
- break
207
- case 2:
208
- obj.addrs.push(reader.bytes())
209
- break
210
- case 3:
211
- obj.connection = Message.ConnectionType.codec().decode(reader)
212
- break
213
- default:
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
- return obj
220
- })
221
- }
222
-
223
- return _codec
218
+ return obj
219
+ })
224
220
  }
225
221
 
226
- export const encode = (obj: Partial<Peer>): Uint8Array => {
227
- return encodeMessage(obj, Peer.codec())
228
- }
222
+ return _codec
223
+ }
229
224
 
230
- export const decode = (buf: Uint8Array | Uint8ArrayList): Peer => {
231
- return decodeMessage(buf, Peer.codec())
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
- Message.MessageType.codec().encode(obj.type, w)
255
+ MessageType.codec().encode(obj.type, w)
247
256
  }
248
257
 
249
- if (obj.clusterLevelRaw != null) {
258
+ if (obj.clusterLevel != null) {
250
259
  w.uint32(80)
251
- w.int32(obj.clusterLevelRaw)
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.closerPeers != null) {
265
- for (const value of obj.closerPeers) {
273
+ if (obj.closer != null) {
274
+ for (const value of obj.closer) {
266
275
  w.uint32(66)
267
- Message.Peer.codec().encode(value, w)
276
+ PeerInfo.codec().encode(value, w)
268
277
  }
269
278
  }
270
279
 
271
- if (obj.providerPeers != null) {
272
- for (const value of obj.providerPeers) {
280
+ if (obj.providers != null) {
281
+ for (const value of obj.providers) {
273
282
  w.uint32(74)
274
- Message.Peer.codec().encode(value, w)
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
- closerPeers: [],
284
- providerPeers: []
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 = Message.MessageType.codec().decode(reader)
303
+ case 1: {
304
+ obj.type = MessageType.codec().decode(reader)
295
305
  break
296
- case 10:
297
- obj.clusterLevelRaw = reader.int32()
306
+ }
307
+ case 10: {
308
+ obj.clusterLevel = reader.int32()
298
309
  break
299
- case 2:
310
+ }
311
+ case 2: {
300
312
  obj.key = reader.bytes()
301
313
  break
302
- case 3:
314
+ }
315
+ case 3: {
303
316
  obj.record = reader.bytes()
304
317
  break
305
- case 8:
306
- obj.closerPeers.push(Message.Peer.codec().decode(reader, reader.uint32()))
318
+ }
319
+ case 8: {
320
+ obj.closer.push(PeerInfo.codec().decode(reader, reader.uint32()))
307
321
  break
308
- case 9:
309
- obj.providerPeers.push(Message.Peer.codec().decode(reader, reader.uint32()))
322
+ }
323
+ case 9: {
324
+ obj.providers.push(PeerInfo.codec().decode(reader, reader.uint32()))
310
325
  break
311
- default:
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, CustomEvent } from '@libp2p/interface'
1
+ import { TypedEventEmitter } from '@libp2p/interface'
2
2
  import { pbStream } from 'it-protobuf-stream'
3
- import { Message } from './message/index.js'
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 type { KadDHTComponents, QueryEvent, QueryOptions } from './index.js'
11
- import type { AbortOptions, Logger, Stream, PeerId, PeerInfo, Startable } from '@libp2p/interface'
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
- lan: boolean
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, lan } = init
40
+ const { protocol } = init
38
41
  this.components = components
39
- this.log = components.logger.forComponent(`libp2p:kad-dht:${lan ? 'lan' : 'wan'}:network`)
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, options: QueryOptions = {}): AsyncGenerator<QueryEvent> {
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: msg.type }, options)
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.closerPeers,
93
- providers: response.providerPeers,
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, options: QueryOptions = {}): AsyncGenerator<QueryEvent> {
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: msg.type }, options)
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: msg.type }, options)
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, options: AbortOptions): Promise<void> {
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, options: AbortOptions): Promise<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.closerPeers.forEach(peerData => {
160
- this.dispatchEvent(new CustomEvent('peer', {
161
- detail: peerData
162
- }))
175
+ message.closer.forEach(peerData => {
176
+ this.safeDispatchEvent<PeerInfo>('peer', {
177
+ detail: fromPbPeerInfo(peerData)
178
+ })
163
179
  })
164
- message.providerPeers.forEach(peerData => {
165
- this.dispatchEvent(new CustomEvent('peer', {
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