libp2p 0.43.4 → 0.44.0-0d46c78f

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 (215) hide show
  1. package/dist/index.min.js +29 -29
  2. package/dist/src/address-manager/index.d.ts +4 -4
  3. package/dist/src/address-manager/index.d.ts.map +1 -1
  4. package/dist/src/address-manager/index.js +9 -6
  5. package/dist/src/address-manager/index.js.map +1 -1
  6. package/dist/src/autonat/index.d.ts +1 -2
  7. package/dist/src/autonat/index.d.ts.map +1 -1
  8. package/dist/src/autonat/index.js +19 -19
  9. package/dist/src/autonat/index.js.map +1 -1
  10. package/dist/src/circuit-relay/server/advert-service.d.ts.map +1 -1
  11. package/dist/src/circuit-relay/server/advert-service.js +2 -2
  12. package/dist/src/circuit-relay/server/advert-service.js.map +1 -1
  13. package/dist/src/circuit-relay/server/index.d.ts.map +1 -1
  14. package/dist/src/circuit-relay/server/index.js +7 -3
  15. package/dist/src/circuit-relay/server/index.js.map +1 -1
  16. package/dist/src/circuit-relay/transport/discovery.d.ts.map +1 -1
  17. package/dist/src/circuit-relay/transport/discovery.js +3 -1
  18. package/dist/src/circuit-relay/transport/discovery.js.map +1 -1
  19. package/dist/src/circuit-relay/transport/index.d.ts +3 -0
  20. package/dist/src/circuit-relay/transport/index.d.ts.map +1 -1
  21. package/dist/src/circuit-relay/transport/index.js +6 -2
  22. package/dist/src/circuit-relay/transport/index.js.map +1 -1
  23. package/dist/src/circuit-relay/transport/listener.d.ts +3 -0
  24. package/dist/src/circuit-relay/transport/listener.d.ts.map +1 -1
  25. package/dist/src/circuit-relay/transport/listener.js +5 -4
  26. package/dist/src/circuit-relay/transport/listener.js.map +1 -1
  27. package/dist/src/circuit-relay/transport/reservation-store.d.ts +4 -1
  28. package/dist/src/circuit-relay/transport/reservation-store.d.ts.map +1 -1
  29. package/dist/src/circuit-relay/transport/reservation-store.js +11 -6
  30. package/dist/src/circuit-relay/transport/reservation-store.js.map +1 -1
  31. package/dist/src/circuit-relay/utils.d.ts.map +1 -1
  32. package/dist/src/circuit-relay/utils.js +3 -1
  33. package/dist/src/circuit-relay/utils.js.map +1 -1
  34. package/dist/src/components.d.ts +7 -69
  35. package/dist/src/components.d.ts.map +1 -1
  36. package/dist/src/components.js +60 -174
  37. package/dist/src/components.js.map +1 -1
  38. package/dist/src/config/connection-gater.browser.d.ts +8 -0
  39. package/dist/src/config/connection-gater.browser.d.ts.map +1 -0
  40. package/dist/src/config/connection-gater.browser.js +27 -0
  41. package/dist/src/config/connection-gater.browser.js.map +1 -0
  42. package/dist/src/config/connection-gater.d.ts +6 -0
  43. package/dist/src/config/connection-gater.d.ts.map +1 -0
  44. package/dist/src/config/connection-gater.js +18 -0
  45. package/dist/src/config/connection-gater.js.map +1 -0
  46. package/dist/src/config.d.ts +2 -1
  47. package/dist/src/config.d.ts.map +1 -1
  48. package/dist/src/config.js +0 -71
  49. package/dist/src/config.js.map +1 -1
  50. package/dist/src/connection-manager/auto-dial.d.ts +39 -0
  51. package/dist/src/connection-manager/auto-dial.d.ts.map +1 -0
  52. package/dist/src/connection-manager/auto-dial.js +136 -0
  53. package/dist/src/connection-manager/auto-dial.js.map +1 -0
  54. package/dist/src/connection-manager/connection-pruner.d.ts +32 -0
  55. package/dist/src/connection-manager/connection-pruner.d.ts.map +1 -0
  56. package/dist/src/connection-manager/connection-pruner.js +111 -0
  57. package/dist/src/connection-manager/connection-pruner.js.map +1 -0
  58. package/dist/src/connection-manager/constants.d.ts +49 -0
  59. package/dist/src/connection-manager/constants.d.ts.map +1 -0
  60. package/dist/src/connection-manager/constants.js +49 -0
  61. package/dist/src/connection-manager/constants.js.map +1 -0
  62. package/dist/src/connection-manager/dial-queue.d.ts +78 -0
  63. package/dist/src/connection-manager/dial-queue.d.ts.map +1 -0
  64. package/dist/src/connection-manager/dial-queue.js +372 -0
  65. package/dist/src/connection-manager/dial-queue.js.map +1 -0
  66. package/dist/src/connection-manager/index.d.ts +70 -73
  67. package/dist/src/connection-manager/index.d.ts.map +1 -1
  68. package/dist/src/connection-manager/index.js +118 -247
  69. package/dist/src/connection-manager/index.js.map +1 -1
  70. package/dist/src/connection-manager/utils.d.ts +9 -0
  71. package/dist/src/connection-manager/utils.d.ts.map +1 -0
  72. package/dist/src/connection-manager/utils.js +66 -0
  73. package/dist/src/connection-manager/utils.js.map +1 -0
  74. package/dist/src/content-routing/index.d.ts +0 -10
  75. package/dist/src/content-routing/index.d.ts.map +1 -1
  76. package/dist/src/content-routing/index.js +7 -42
  77. package/dist/src/content-routing/index.js.map +1 -1
  78. package/dist/src/content-routing/utils.d.ts.map +1 -1
  79. package/dist/src/content-routing/utils.js +3 -1
  80. package/dist/src/content-routing/utils.js.map +1 -1
  81. package/dist/src/fetch/index.d.ts +13 -35
  82. package/dist/src/fetch/index.d.ts.map +1 -1
  83. package/dist/src/fetch/index.js +10 -12
  84. package/dist/src/fetch/index.js.map +1 -1
  85. package/dist/src/identify/index.d.ts +16 -48
  86. package/dist/src/identify/index.d.ts.map +1 -1
  87. package/dist/src/identify/index.js +203 -201
  88. package/dist/src/identify/index.js.map +1 -1
  89. package/dist/src/index.d.ts +11 -67
  90. package/dist/src/index.d.ts.map +1 -1
  91. package/dist/src/index.js.map +1 -1
  92. package/dist/src/insecure/index.d.ts.map +1 -1
  93. package/dist/src/insecure/index.js +3 -1
  94. package/dist/src/insecure/index.js.map +1 -1
  95. package/dist/src/libp2p.d.ts +12 -35
  96. package/dist/src/libp2p.d.ts.map +1 -1
  97. package/dist/src/libp2p.js +141 -206
  98. package/dist/src/libp2p.js.map +1 -1
  99. package/dist/src/peer-routing.d.ts +1 -38
  100. package/dist/src/peer-routing.d.ts.map +1 -1
  101. package/dist/src/peer-routing.js +0 -59
  102. package/dist/src/peer-routing.js.map +1 -1
  103. package/dist/src/ping/constants.d.ts +4 -0
  104. package/dist/src/ping/constants.d.ts.map +1 -1
  105. package/dist/src/ping/constants.js +10 -0
  106. package/dist/src/ping/constants.js.map +1 -1
  107. package/dist/src/ping/index.d.ts +10 -27
  108. package/dist/src/ping/index.d.ts.map +1 -1
  109. package/dist/src/ping/index.js +18 -21
  110. package/dist/src/ping/index.js.map +1 -1
  111. package/dist/src/registrar.d.ts +5 -2
  112. package/dist/src/registrar.d.ts.map +1 -1
  113. package/dist/src/registrar.js +27 -25
  114. package/dist/src/registrar.js.map +1 -1
  115. package/dist/src/transport-manager.d.ts +15 -4
  116. package/dist/src/transport-manager.d.ts.map +1 -1
  117. package/dist/src/transport-manager.js +37 -12
  118. package/dist/src/transport-manager.js.map +1 -1
  119. package/dist/src/upgrader.d.ts +16 -11
  120. package/dist/src/upgrader.d.ts.map +1 -1
  121. package/dist/src/upgrader.js +38 -47
  122. package/dist/src/upgrader.js.map +1 -1
  123. package/dist/src/upnp-nat/index.d.ts +42 -0
  124. package/dist/src/upnp-nat/index.d.ts.map +1 -0
  125. package/dist/src/{nat-manager.js → upnp-nat/index.js} +11 -7
  126. package/dist/src/upnp-nat/index.js.map +1 -0
  127. package/package.json +70 -54
  128. package/src/address-manager/index.ts +12 -8
  129. package/src/autonat/index.ts +20 -22
  130. package/src/circuit-relay/server/advert-service.ts +2 -2
  131. package/src/circuit-relay/server/index.ts +7 -3
  132. package/src/circuit-relay/transport/discovery.ts +3 -1
  133. package/src/circuit-relay/transport/index.ts +10 -2
  134. package/src/circuit-relay/transport/listener.ts +8 -4
  135. package/src/circuit-relay/transport/reservation-store.ts +15 -7
  136. package/src/circuit-relay/utils.ts +3 -1
  137. package/src/components.ts +72 -251
  138. package/src/config/connection-gater.browser.ts +31 -0
  139. package/src/config/connection-gater.ts +19 -0
  140. package/src/config.ts +3 -73
  141. package/src/connection-manager/auto-dial.ts +189 -0
  142. package/src/connection-manager/connection-pruner.ts +157 -0
  143. package/src/connection-manager/constants.ts +60 -0
  144. package/src/connection-manager/dial-queue.ts +506 -0
  145. package/src/connection-manager/index.ts +194 -339
  146. package/src/connection-manager/utils.ts +76 -0
  147. package/src/content-routing/index.ts +7 -55
  148. package/src/content-routing/utils.ts +3 -1
  149. package/src/fetch/index.ts +55 -18
  150. package/src/identify/index.ts +238 -228
  151. package/src/index.ts +12 -76
  152. package/src/insecure/index.ts +9 -5
  153. package/src/libp2p.ts +146 -265
  154. package/src/peer-routing.ts +1 -101
  155. package/src/ping/constants.ts +11 -0
  156. package/src/ping/index.ts +32 -28
  157. package/src/registrar.ts +31 -27
  158. package/src/transport-manager.ts +49 -15
  159. package/src/upgrader.ts +62 -57
  160. package/src/{nat-manager.ts → upnp-nat/index.ts} +15 -16
  161. package/src/version.ts +1 -1
  162. package/dist/src/connection-manager/auto-dialler.d.ts +0 -42
  163. package/dist/src/connection-manager/auto-dialler.d.ts.map +0 -1
  164. package/dist/src/connection-manager/auto-dialler.js +0 -105
  165. package/dist/src/connection-manager/auto-dialler.js.map +0 -1
  166. package/dist/src/connection-manager/dialer/dial-request.d.ts +0 -27
  167. package/dist/src/connection-manager/dialer/dial-request.d.ts.map +0 -1
  168. package/dist/src/connection-manager/dialer/dial-request.js +0 -114
  169. package/dist/src/connection-manager/dialer/dial-request.js.map +0 -1
  170. package/dist/src/connection-manager/dialer/index.d.ts +0 -121
  171. package/dist/src/connection-manager/dialer/index.d.ts.map +0 -1
  172. package/dist/src/connection-manager/dialer/index.js +0 -324
  173. package/dist/src/connection-manager/dialer/index.js.map +0 -1
  174. package/dist/src/connection-manager/latency-monitor.d.ts +0 -120
  175. package/dist/src/connection-manager/latency-monitor.d.ts.map +0 -1
  176. package/dist/src/connection-manager/latency-monitor.js +0 -220
  177. package/dist/src/connection-manager/latency-monitor.js.map +0 -1
  178. package/dist/src/connection-manager/visibility-change-emitter.d.ts +0 -66
  179. package/dist/src/connection-manager/visibility-change-emitter.d.ts.map +0 -1
  180. package/dist/src/connection-manager/visibility-change-emitter.js +0 -118
  181. package/dist/src/connection-manager/visibility-change-emitter.js.map +0 -1
  182. package/dist/src/constants.d.ts +0 -27
  183. package/dist/src/constants.d.ts.map +0 -1
  184. package/dist/src/constants.js +0 -31
  185. package/dist/src/constants.js.map +0 -1
  186. package/dist/src/dht/dht-content-routing.d.ts +0 -17
  187. package/dist/src/dht/dht-content-routing.d.ts.map +0 -1
  188. package/dist/src/dht/dht-content-routing.js +0 -32
  189. package/dist/src/dht/dht-content-routing.js.map +0 -1
  190. package/dist/src/dht/dht-peer-routing.d.ts +0 -15
  191. package/dist/src/dht/dht-peer-routing.d.ts.map +0 -1
  192. package/dist/src/dht/dht-peer-routing.js +0 -26
  193. package/dist/src/dht/dht-peer-routing.js.map +0 -1
  194. package/dist/src/dht/dummy-dht.d.ts +0 -20
  195. package/dist/src/dht/dummy-dht.d.ts.map +0 -1
  196. package/dist/src/dht/dummy-dht.js +0 -46
  197. package/dist/src/dht/dummy-dht.js.map +0 -1
  198. package/dist/src/nat-manager.d.ts +0 -74
  199. package/dist/src/nat-manager.d.ts.map +0 -1
  200. package/dist/src/nat-manager.js.map +0 -1
  201. package/dist/src/peer-record-updater.d.ts +0 -24
  202. package/dist/src/peer-record-updater.d.ts.map +0 -1
  203. package/dist/src/peer-record-updater.js +0 -44
  204. package/dist/src/peer-record-updater.js.map +0 -1
  205. package/dist/typedoc-urls.json +0 -41
  206. package/src/connection-manager/auto-dialler.ts +0 -158
  207. package/src/connection-manager/dialer/dial-request.ts +0 -144
  208. package/src/connection-manager/dialer/index.ts +0 -461
  209. package/src/connection-manager/latency-monitor.ts +0 -319
  210. package/src/connection-manager/visibility-change-emitter.ts +0 -135
  211. package/src/constants.ts +0 -36
  212. package/src/dht/dht-content-routing.ts +0 -44
  213. package/src/dht/dht-peer-routing.ts +0 -36
  214. package/src/dht/dummy-dht.ts +0 -60
  215. package/src/peer-record-updater.ts +0 -65
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../src/connection-manager/constants.ts"],"names":[],"mappings":"AACA;;GAEG;AACH,eAAO,MAAM,YAAY,QAAO,CAAA;AAEhC;;GAEG;AACH,eAAO,MAAM,uBAAuB,QAAO,CAAA;AAE3C;;GAEG;AACH,eAAO,MAAM,kBAAkB,MAAM,CAAA;AAErC;;GAEG;AACH,eAAO,MAAM,sBAAsB,KAAK,CAAA;AAExC;;GAEG;AACH,eAAO,MAAM,2BAA2B,KAAK,CAAA;AAE7C;;GAEG;AACH,eAAO,MAAM,eAAe,KAAK,CAAA;AAEjC;;GAEG;AACH,eAAO,MAAM,eAAe,MAAM,CAAA;AAElC;;GAEG;AACH,eAAO,MAAM,kBAAkB,OAAO,CAAA;AAEtC;;GAEG;AACH,eAAO,MAAM,qBAAqB,KAAK,CAAA;AAEvC;;GAEG;AACH,eAAO,MAAM,kBAAkB,IAAI,CAAA;AAEnC;;GAEG;AACH,eAAO,MAAM,4BAA4B,IAAI,CAAA;AAE7C;;GAEG;AACH,eAAO,MAAM,gCAAgC,KAAK,CAAA"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * @see https://libp2p.github.io/js-libp2p/interfaces/index._internal_.ConnectionManagerConfig.html#dialTimeout
3
+ */
4
+ export const DIAL_TIMEOUT = 30e3;
5
+ /**
6
+ * @see https://libp2p.github.io/js-libp2p/interfaces/index._internal_.ConnectionManagerConfig.html#inboundUpgradeTimeout
7
+ */
8
+ export const INBOUND_UPGRADE_TIMEOUT = 30e3;
9
+ /**
10
+ * @see https://libp2p.github.io/js-libp2p/interfaces/index._internal_.ConnectionManagerConfig.html#maxParallelDials
11
+ */
12
+ export const MAX_PARALLEL_DIALS = 100;
13
+ /**
14
+ * @see https://libp2p.github.io/js-libp2p/interfaces/index._internal_.ConnectionManagerConfig.html#maxPeerAddrsToDial
15
+ */
16
+ export const MAX_PEER_ADDRS_TO_DIAL = 25;
17
+ /**
18
+ * @see https://libp2p.github.io/js-libp2p/interfaces/index._internal_.ConnectionManagerConfig.html#maxParallelDialsPerPeer
19
+ */
20
+ export const MAX_PARALLEL_DIALS_PER_PEER = 10;
21
+ /**
22
+ * @see https://libp2p.github.io/js-libp2p/interfaces/index._internal_.ConnectionManagerConfig.html#minConnections
23
+ */
24
+ export const MIN_CONNECTIONS = 50;
25
+ /**
26
+ * @see https://libp2p.github.io/js-libp2p/interfaces/index._internal_.ConnectionManagerConfig.html#maxConnections
27
+ */
28
+ export const MAX_CONNECTIONS = 300;
29
+ /**
30
+ * @see https://libp2p.github.io/js-libp2p/interfaces/index._internal_.ConnectionManagerConfig.html#autoDialInterval
31
+ */
32
+ export const AUTO_DIAL_INTERVAL = 5000;
33
+ /**
34
+ * @see https://libp2p.github.io/js-libp2p/interfaces/index._internal_.ConnectionManagerConfig.html#autoDialConcurrency
35
+ */
36
+ export const AUTO_DIAL_CONCURRENCY = 25;
37
+ /**
38
+ * @see https://libp2p.github.io/js-libp2p/interfaces/index._internal_.ConnectionManagerConfig.html#autoDialPriority
39
+ */
40
+ export const AUTO_DIAL_PRIORITY = 0;
41
+ /**
42
+ * @see https://libp2p.github.io/js-libp2p/interfaces/index._internal_.ConnectionManagerConfig.html#inboundConnectionThreshold
43
+ */
44
+ export const INBOUND_CONNECTION_THRESHOLD = 5;
45
+ /**
46
+ * @see https://libp2p.github.io/js-libp2p/interfaces/index._internal_.ConnectionManagerConfig.html#maxIncomingPendingConnections
47
+ */
48
+ export const MAX_INCOMING_PENDING_CONNECTIONS = 10;
49
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../src/connection-manager/constants.ts"],"names":[],"mappings":"AACA;;GAEG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,CAAA;AAEhC;;GAEG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,IAAI,CAAA;AAE3C;;GAEG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,GAAG,CAAA;AAErC;;GAEG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,EAAE,CAAA;AAExC;;GAEG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAG,EAAE,CAAA;AAE7C;;GAEG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,EAAE,CAAA;AAEjC;;GAEG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,GAAG,CAAA;AAElC;;GAEG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,IAAI,CAAA;AAEtC;;GAEG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,EAAE,CAAA;AAEvC;;GAEG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAA;AAEnC;;GAEG;AACH,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAAC,CAAA;AAE7C;;GAEG;AACH,MAAM,CAAC,MAAM,gCAAgC,GAAG,EAAE,CAAA"}
@@ -0,0 +1,78 @@
1
+ import { Multiaddr, Resolver } from '@multiformats/multiaddr';
2
+ import type { Connection } from '@libp2p/interface-connection';
3
+ import type { AbortOptions } from '@libp2p/interfaces';
4
+ import type { PeerId } from '@libp2p/interface-peer-id';
5
+ import type { PeerStore } from '@libp2p/interface-peer-store';
6
+ import type { Metrics } from '@libp2p/interface-metrics';
7
+ import type { TransportManager } from '@libp2p/interface-transport';
8
+ import type { ConnectionGater } from '@libp2p/interface-connection-gater';
9
+ import PQueue from 'p-queue';
10
+ import type { AddressSorter } from '@libp2p/interface-libp2p';
11
+ export type PendingDialStatus = 'queued' | 'active' | 'error' | 'success';
12
+ export interface PendingDial {
13
+ id: string;
14
+ status: PendingDialStatus;
15
+ peerId?: PeerId;
16
+ multiaddrs: Multiaddr[];
17
+ promise: Promise<Connection>;
18
+ }
19
+ export interface PendingDialTarget {
20
+ resolve: (value: any) => void;
21
+ reject: (err: Error) => void;
22
+ }
23
+ export interface DialOptions extends AbortOptions {
24
+ priority?: number;
25
+ }
26
+ interface DialerInit {
27
+ addressSorter?: AddressSorter;
28
+ maxParallelDials?: number;
29
+ maxPeerAddrsToDial?: number;
30
+ maxParallelDialsPerPeer?: number;
31
+ dialTimeout?: number;
32
+ resolvers?: Record<string, Resolver>;
33
+ }
34
+ interface DialQueueComponents {
35
+ peerId: PeerId;
36
+ metrics?: Metrics;
37
+ peerStore: PeerStore;
38
+ transportManager: TransportManager;
39
+ connectionGater: ConnectionGater;
40
+ }
41
+ export declare class DialQueue {
42
+ pendingDials: PendingDial[];
43
+ queue: PQueue;
44
+ private readonly peerId;
45
+ private readonly peerStore;
46
+ private readonly connectionGater;
47
+ private readonly transportManager;
48
+ private readonly addressSorter;
49
+ private readonly maxPeerAddrsToDial;
50
+ private readonly maxParallelDialsPerPeer;
51
+ private readonly dialTimeout;
52
+ private readonly inProgressDialCount?;
53
+ private readonly pendingDialCount?;
54
+ private readonly shutDownController;
55
+ constructor(components: DialQueueComponents, init?: DialerInit);
56
+ /**
57
+ * Clears any pending dials
58
+ */
59
+ stop(): void;
60
+ /**
61
+ * Connects to a given peer, multiaddr or list of multiaddrs.
62
+ *
63
+ * If a peer is passed, all known multiaddrs will be tried. If a multiaddr or
64
+ * multiaddrs are passed only those will be dialled.
65
+ *
66
+ * Where a list of multiaddrs is passed, if any contain a peer id then all
67
+ * multiaddrs in the list must contain the same peer id.
68
+ *
69
+ * The dial to the first address that is successfully able to upgrade a connection
70
+ * will be used, all other dials will be aborted when that happens.
71
+ */
72
+ dial(peerIdOrMultiaddr: PeerId | Multiaddr | Multiaddr[], options?: DialOptions): Promise<Connection>;
73
+ private createDialAbortControllers;
74
+ private calculateMultiaddrs;
75
+ private performDial;
76
+ }
77
+ export {};
78
+ //# sourceMappingURL=dial-queue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dial-queue.d.ts","sourceRoot":"","sources":["../../../src/connection-manager/dial-queue.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,372 @@
1
+ import { logger } from '@libp2p/logger';
2
+ import { AbortError, CodeError } from '@libp2p/interfaces/errors';
3
+ import { resolvers } from '@multiformats/multiaddr';
4
+ import { publicAddressesFirst } from '@libp2p/utils/address-sort';
5
+ import { codes } from '../errors.js';
6
+ import { DIAL_TIMEOUT, MAX_PARALLEL_DIALS_PER_PEER, MAX_PARALLEL_DIALS, MAX_PEER_ADDRS_TO_DIAL } from './constants.js';
7
+ import { getPeerAddress } from '../get-peer.js';
8
+ import PQueue from 'p-queue';
9
+ import { dnsaddrResolver } from '@multiformats/multiaddr/resolvers';
10
+ import { combineSignals, resolveMultiaddrs } from './utils.js';
11
+ import pDefer from 'p-defer';
12
+ import { anySignal } from 'any-signal';
13
+ const log = logger('libp2p:connection-manager:dial-queue');
14
+ const defaultOptions = {
15
+ addressSorter: publicAddressesFirst,
16
+ maxParallelDials: MAX_PARALLEL_DIALS,
17
+ maxPeerAddrsToDial: MAX_PEER_ADDRS_TO_DIAL,
18
+ maxParallelDialsPerPeer: MAX_PARALLEL_DIALS_PER_PEER,
19
+ dialTimeout: DIAL_TIMEOUT,
20
+ resolvers: {
21
+ dnsaddr: dnsaddrResolver
22
+ }
23
+ };
24
+ export class DialQueue {
25
+ constructor(components, init = {}) {
26
+ this.addressSorter = init.addressSorter ?? defaultOptions.addressSorter;
27
+ this.maxPeerAddrsToDial = init.maxPeerAddrsToDial ?? defaultOptions.maxPeerAddrsToDial;
28
+ this.maxParallelDialsPerPeer = init.maxParallelDialsPerPeer ?? defaultOptions.maxParallelDialsPerPeer;
29
+ this.dialTimeout = init.dialTimeout ?? defaultOptions.dialTimeout;
30
+ this.peerId = components.peerId;
31
+ this.peerStore = components.peerStore;
32
+ this.connectionGater = components.connectionGater;
33
+ this.transportManager = components.transportManager;
34
+ this.shutDownController = new AbortController();
35
+ this.pendingDialCount = components.metrics?.registerMetric('libp2p_dialler_pending_dials');
36
+ this.inProgressDialCount = components.metrics?.registerMetric('libp2p_dialler_in_progress_dials');
37
+ this.pendingDials = [];
38
+ for (const [key, value] of Object.entries(init.resolvers ?? {})) {
39
+ resolvers.set(key, value);
40
+ }
41
+ // controls dial concurrency
42
+ this.queue = new PQueue({
43
+ concurrency: init.maxParallelDials ?? defaultOptions.maxParallelDials
44
+ });
45
+ // a job was added to the queue
46
+ this.queue.on('add', () => {
47
+ this.pendingDialCount?.update(this.queue.size);
48
+ this.inProgressDialCount?.update(this.queue.pending);
49
+ });
50
+ // a queued job started
51
+ this.queue.on('active', () => {
52
+ this.pendingDialCount?.update(this.queue.size);
53
+ this.inProgressDialCount?.update(this.queue.pending);
54
+ });
55
+ // a started job completed without error
56
+ this.queue.on('completed', () => {
57
+ this.pendingDialCount?.update(this.queue.size);
58
+ this.inProgressDialCount?.update(this.queue.pending);
59
+ });
60
+ // a started job errored
61
+ this.queue.on('error', (err) => {
62
+ log.error('error in dial queue', err);
63
+ this.pendingDialCount?.update(this.queue.size);
64
+ this.inProgressDialCount?.update(this.queue.pending);
65
+ });
66
+ // all queued jobs have been started
67
+ this.queue.on('empty', () => {
68
+ this.pendingDialCount?.update(this.queue.size);
69
+ this.inProgressDialCount?.update(this.queue.pending);
70
+ });
71
+ // add started jobs have run and the queue is empty
72
+ this.queue.on('idle', () => {
73
+ this.pendingDialCount?.update(this.queue.size);
74
+ this.inProgressDialCount?.update(this.queue.pending);
75
+ });
76
+ }
77
+ /**
78
+ * Clears any pending dials
79
+ */
80
+ stop() {
81
+ this.shutDownController.abort();
82
+ }
83
+ /**
84
+ * Connects to a given peer, multiaddr or list of multiaddrs.
85
+ *
86
+ * If a peer is passed, all known multiaddrs will be tried. If a multiaddr or
87
+ * multiaddrs are passed only those will be dialled.
88
+ *
89
+ * Where a list of multiaddrs is passed, if any contain a peer id then all
90
+ * multiaddrs in the list must contain the same peer id.
91
+ *
92
+ * The dial to the first address that is successfully able to upgrade a connection
93
+ * will be used, all other dials will be aborted when that happens.
94
+ */
95
+ async dial(peerIdOrMultiaddr, options = {}) {
96
+ const { peerId, multiaddrs } = getPeerAddress(peerIdOrMultiaddr);
97
+ const addrs = multiaddrs.map(multiaddr => ({
98
+ multiaddr,
99
+ isCertified: false
100
+ }));
101
+ // create abort conditions - need to do this before `calculateMultiaddrs` as we may be about to
102
+ // resolve a dns addr which can time out
103
+ const signal = this.createDialAbortControllers(options.signal);
104
+ let addrsToDial;
105
+ try {
106
+ // load addresses from address book, resolve and dnsaddrs, filter undiallables, add peer IDs, etc
107
+ addrsToDial = await this.calculateMultiaddrs(peerId, addrs, {
108
+ ...options,
109
+ signal
110
+ });
111
+ }
112
+ catch (err) {
113
+ signal.clear();
114
+ throw err;
115
+ }
116
+ // ready to dial, all async work finished - make sure we don't have any
117
+ // pending dials in progress for this peer or set of multiaddrs
118
+ const existingDial = this.pendingDials.find(dial => {
119
+ // is the dial for the same peer id?
120
+ if (dial.peerId != null && peerId != null && dial.peerId.equals(peerId)) {
121
+ return true;
122
+ }
123
+ // is the dial for the same set of multiaddrs?
124
+ if (addrsToDial.map(({ multiaddr }) => multiaddr.toString()).join() === dial.multiaddrs.map(multiaddr => multiaddr.toString()).join()) {
125
+ return true;
126
+ }
127
+ return false;
128
+ });
129
+ if (existingDial != null) {
130
+ log('joining existing dial target for %p', peerId);
131
+ signal.clear();
132
+ return await existingDial.promise;
133
+ }
134
+ log('creating dial target for', addrsToDial.map(({ multiaddr }) => multiaddr.toString()));
135
+ // @ts-expect-error .promise property is set below
136
+ const pendingDial = {
137
+ id: randomId(),
138
+ status: 'queued',
139
+ peerId,
140
+ multiaddrs: addrsToDial.map(({ multiaddr }) => multiaddr)
141
+ };
142
+ pendingDial.promise = this.performDial(pendingDial, {
143
+ ...options,
144
+ signal
145
+ })
146
+ .finally(() => {
147
+ // remove our pending dial entry
148
+ this.pendingDials = this.pendingDials.filter(p => p.id !== pendingDial.id);
149
+ // clean up abort signals/controllers
150
+ signal.clear();
151
+ })
152
+ .catch(err => {
153
+ log.error('dial failed to %s', addrsToDial.map(({ multiaddr }) => multiaddr.toString()).join(', '), err);
154
+ // Error is a timeout
155
+ if (signal.aborted) {
156
+ const error = new CodeError(err.message, codes.ERR_TIMEOUT);
157
+ throw error;
158
+ }
159
+ throw err;
160
+ });
161
+ // let other dials join this one
162
+ this.pendingDials.push(pendingDial);
163
+ return await pendingDial.promise;
164
+ }
165
+ createDialAbortControllers(userSignal) {
166
+ // let any signal abort the dial
167
+ const signal = anySignal([AbortSignal.timeout(this.dialTimeout),
168
+ this.shutDownController.signal,
169
+ userSignal
170
+ ]);
171
+ return signal;
172
+ }
173
+ async calculateMultiaddrs(peerId, addrs = [], options = {}) {
174
+ // if a peer id or multiaddr(s) with a peer id, make sure it isn't our peer id and that we are allowed to dial it
175
+ if (peerId != null) {
176
+ if (this.peerId.equals(peerId)) {
177
+ throw new CodeError('Tried to dial self', codes.ERR_DIALED_SELF);
178
+ }
179
+ if ((await this.connectionGater.denyDialPeer?.(peerId)) === true) {
180
+ throw new CodeError('The dial request is blocked by gater.allowDialPeer', codes.ERR_PEER_DIAL_INTERCEPTED);
181
+ }
182
+ // if just a peer id was passed, load available multiaddrs for this peer from the address book
183
+ if (addrs.length === 0) {
184
+ log('loading multiaddrs for %p', peerId);
185
+ try {
186
+ const peer = await this.peerStore.get(peerId);
187
+ addrs.push(...peer.addresses);
188
+ log('loaded multiaddrs for %p', peerId, addrs.map(({ multiaddr }) => multiaddr.toString()));
189
+ }
190
+ catch (err) {
191
+ if (err.code !== codes.ERR_NOT_FOUND) {
192
+ throw err;
193
+ }
194
+ }
195
+ }
196
+ }
197
+ // resolve addresses - this can result in a one-to-many translation when dnsaddrs are resolved
198
+ const resolvedAddresses = (await Promise.all(addrs.map(async (addr) => {
199
+ const result = await resolveMultiaddrs(addr.multiaddr, options);
200
+ if (result.length === 1 && result[0].equals(addr.multiaddr)) {
201
+ return addr;
202
+ }
203
+ return result.map(multiaddr => ({
204
+ multiaddr,
205
+ isCertified: false
206
+ }));
207
+ })))
208
+ .flat();
209
+ // filter out any multiaddrs that we do not have transports for
210
+ const filteredAddrs = resolvedAddresses.filter(addr => Boolean(this.transportManager.transportForMultiaddr(addr.multiaddr)));
211
+ // deduplicate addresses
212
+ const dedupedAddrs = new Map();
213
+ for (const addr of filteredAddrs) {
214
+ const maStr = addr.multiaddr.toString();
215
+ const existing = dedupedAddrs.get(maStr);
216
+ if (existing != null) {
217
+ existing.isCertified = existing.isCertified || addr.isCertified || false;
218
+ continue;
219
+ }
220
+ dedupedAddrs.set(maStr, addr);
221
+ }
222
+ let dedupedMultiaddrs = [...dedupedAddrs.values()];
223
+ if (dedupedMultiaddrs.length === 0 || dedupedMultiaddrs.length > this.maxPeerAddrsToDial) {
224
+ log('addresses for %p before filtering', peerId ?? 'unknown peer', resolvedAddresses.map(({ multiaddr }) => multiaddr.toString()));
225
+ log('addresses for %p after filtering', peerId ?? 'unknown peer', dedupedMultiaddrs.map(({ multiaddr }) => multiaddr.toString()));
226
+ }
227
+ // make sure we actually have some addresses to dial
228
+ if (dedupedMultiaddrs.length === 0) {
229
+ throw new CodeError('The dial request has no valid addresses', codes.ERR_NO_VALID_ADDRESSES);
230
+ }
231
+ // make sure we don't have too many addresses to dial
232
+ if (dedupedMultiaddrs.length > this.maxPeerAddrsToDial) {
233
+ throw new CodeError('dial with more addresses than allowed', codes.ERR_TOO_MANY_ADDRESSES);
234
+ }
235
+ // ensure the peer id is appended to the multiaddr
236
+ if (peerId != null) {
237
+ const peerIdMultiaddr = `/p2p/${peerId.toString()}`;
238
+ dedupedMultiaddrs = dedupedMultiaddrs.map(addr => {
239
+ const addressPeerId = addr.multiaddr.getPeerId();
240
+ const lastProto = addr.multiaddr.protos().pop();
241
+ // do not append peer id to path multiaddrs
242
+ if (lastProto?.path === true) {
243
+ return addr;
244
+ }
245
+ // append peer id to multiaddr if it is not already present
246
+ if (addressPeerId !== peerId.toString()) {
247
+ return {
248
+ multiaddr: addr.multiaddr.encapsulate(peerIdMultiaddr),
249
+ isCertified: addr.isCertified
250
+ };
251
+ }
252
+ return addr;
253
+ });
254
+ }
255
+ const gatedAdrs = [];
256
+ for (const addr of dedupedMultiaddrs) {
257
+ if (this.connectionGater.denyDialMultiaddr != null && await this.connectionGater.denyDialMultiaddr(addr.multiaddr)) {
258
+ continue;
259
+ }
260
+ gatedAdrs.push(addr);
261
+ }
262
+ return gatedAdrs.sort(this.addressSorter);
263
+ }
264
+ async performDial(pendingDial, options = {}) {
265
+ const dialAbortControllers = pendingDial.multiaddrs.map(() => new AbortController());
266
+ try {
267
+ // internal peer dial queue to ensure we only dial the configured number of addresses
268
+ // per peer at the same time to prevent one peer with a lot of addresses swamping
269
+ // the dial queue
270
+ const peerDialQueue = new PQueue({
271
+ concurrency: this.maxParallelDialsPerPeer
272
+ });
273
+ peerDialQueue.on('error', (err) => {
274
+ log.error('error dialling', err);
275
+ });
276
+ const conn = await Promise.any(pendingDial.multiaddrs.map(async (addr, i) => {
277
+ const controller = dialAbortControllers[i];
278
+ if (controller == null) {
279
+ throw new CodeError('dialAction did not come with an AbortController', codes.ERR_INVALID_PARAMETERS);
280
+ }
281
+ // let any signal abort the dial
282
+ const signal = combineSignals(controller.signal, options.signal);
283
+ signal.addEventListener('abort', () => {
284
+ log('dial to %s aborted', addr);
285
+ });
286
+ const deferred = pDefer();
287
+ await peerDialQueue.add(async () => {
288
+ if (signal.aborted) {
289
+ log('dial to %s was aborted before reaching the head of the peer dial queue', addr);
290
+ deferred.reject(new AbortError());
291
+ return;
292
+ }
293
+ // add the individual dial to the dial queue so we don't breach maxConcurrentDials
294
+ await this.queue.add(async () => {
295
+ try {
296
+ if (signal.aborted) {
297
+ log('dial to %s was aborted before reaching the head of the dial queue', addr);
298
+ deferred.reject(new AbortError());
299
+ return;
300
+ }
301
+ // update dial status
302
+ pendingDial.status = 'active';
303
+ const conn = await this.transportManager.dial(addr, {
304
+ ...options,
305
+ signal
306
+ });
307
+ if (controller.signal.aborted) {
308
+ // another dial succeeded faster than this one
309
+ log('multiple dials succeeded, closing superfluous connection');
310
+ conn.close().catch(err => {
311
+ log.error('error closing superfluous connection', err);
312
+ });
313
+ deferred.reject(new AbortError());
314
+ return;
315
+ }
316
+ // remove the successful AbortController so it is not aborted
317
+ dialAbortControllers[i] = undefined;
318
+ // immediately abort any other dials
319
+ dialAbortControllers.forEach(c => {
320
+ if (c !== undefined) {
321
+ c.abort();
322
+ }
323
+ });
324
+ log('dial to %s succeeded', addr);
325
+ // resolve the connection promise
326
+ deferred.resolve(conn);
327
+ }
328
+ catch (err) {
329
+ // something only went wrong if our signal was not aborted
330
+ log.error('error during dial of %s', addr, err);
331
+ deferred.reject(err);
332
+ }
333
+ }, {
334
+ ...options,
335
+ signal
336
+ }).catch(err => {
337
+ deferred.reject(err);
338
+ });
339
+ }, {
340
+ signal
341
+ }).catch(err => {
342
+ deferred.reject(err);
343
+ }).finally(() => {
344
+ signal.clear();
345
+ });
346
+ return await deferred.promise;
347
+ }));
348
+ // dial succeeded or failed
349
+ if (conn == null) {
350
+ throw new CodeError('successful dial led to empty object returned from peer dial queue', codes.ERR_TRANSPORT_DIAL_FAILED);
351
+ }
352
+ pendingDial.status = 'success';
353
+ return conn;
354
+ }
355
+ catch (err) {
356
+ pendingDial.status = 'error';
357
+ // if we only dialled one address, unwrap the AggregateError to provide more
358
+ // useful feedback to the user
359
+ if (pendingDial.multiaddrs.length === 1 && err.name === 'AggregateError') {
360
+ throw err.errors[0];
361
+ }
362
+ throw err;
363
+ }
364
+ }
365
+ }
366
+ /**
367
+ * Returns a random string
368
+ */
369
+ function randomId() {
370
+ return `${(parseInt(String(Math.random() * 1e9), 10)).toString()}${Date.now()}`;
371
+ }
372
+ //# sourceMappingURL=dial-queue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dial-queue.js","sourceRoot":"","sources":["../../../src/connection-manager/dial-queue.ts"],"names":[],"mappings":"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"}