@libp2p/upnp-nat 3.0.4 → 3.0.5-26313e695

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 (42) hide show
  1. package/README.md +40 -0
  2. package/dist/src/check-external-address.d.ts.map +1 -1
  3. package/dist/src/check-external-address.js +0 -2
  4. package/dist/src/check-external-address.js.map +1 -1
  5. package/dist/src/constants.d.ts +4 -0
  6. package/dist/src/constants.d.ts.map +1 -1
  7. package/dist/src/constants.js +4 -0
  8. package/dist/src/constants.js.map +1 -1
  9. package/dist/src/index.d.ts +125 -0
  10. package/dist/src/index.d.ts.map +1 -1
  11. package/dist/src/index.js +40 -0
  12. package/dist/src/index.js.map +1 -1
  13. package/dist/src/search-gateway-finder.d.ts +27 -0
  14. package/dist/src/search-gateway-finder.d.ts.map +1 -0
  15. package/dist/src/search-gateway-finder.js +66 -0
  16. package/dist/src/search-gateway-finder.js.map +1 -0
  17. package/dist/src/static-gateway-finder.d.ts +23 -0
  18. package/dist/src/static-gateway-finder.d.ts.map +1 -0
  19. package/dist/src/static-gateway-finder.js +42 -0
  20. package/dist/src/static-gateway-finder.js.map +1 -0
  21. package/dist/src/upnp-nat.d.ts +6 -1
  22. package/dist/src/upnp-nat.d.ts.map +1 -1
  23. package/dist/src/upnp-nat.js +20 -5
  24. package/dist/src/upnp-nat.js.map +1 -1
  25. package/dist/src/upnp-port-mapper.d.ts +1 -0
  26. package/dist/src/upnp-port-mapper.d.ts.map +1 -1
  27. package/dist/src/upnp-port-mapper.js +15 -10
  28. package/dist/src/upnp-port-mapper.js.map +1 -1
  29. package/package.json +7 -7
  30. package/src/check-external-address.ts +0 -2
  31. package/src/constants.ts +5 -0
  32. package/src/index.ts +133 -0
  33. package/src/search-gateway-finder.ts +94 -0
  34. package/src/static-gateway-finder.ts +60 -0
  35. package/src/upnp-nat.ts +28 -6
  36. package/src/upnp-port-mapper.ts +16 -10
  37. package/dist/src/gateway-finder.d.ts +0 -26
  38. package/dist/src/gateway-finder.d.ts.map +0 -1
  39. package/dist/src/gateway-finder.js +0 -53
  40. package/dist/src/gateway-finder.js.map +0 -1
  41. package/dist/typedoc-urls.json +0 -12
  42. package/src/gateway-finder.ts +0 -75
@@ -6,7 +6,7 @@ import { isPrivate } from '@libp2p/utils/multiaddr/is-private';
6
6
  import { isPrivateIp } from '@libp2p/utils/private-ip';
7
7
  import { multiaddr } from '@multiformats/multiaddr';
8
8
  import { QUICV1, TCP, WebSockets, WebSocketsSecure, WebTransport } from '@multiformats/multiaddr-matcher';
9
- import { dynamicExternalAddress } from './check-external-address.js';
9
+ import { dynamicExternalAddress, staticExternalAddress } from './check-external-address.js';
10
10
  import { DoubleNATError } from './errors.js';
11
11
  const MAX_DATE = 8_640_000_000_000_000;
12
12
  export class UPnPPortMapper {
@@ -20,15 +20,20 @@ export class UPnPPortMapper {
20
20
  this.log = components.logger.forComponent(`libp2p:upnp-nat:gateway:${init.gateway.id}`);
21
21
  this.addressManager = components.addressManager;
22
22
  this.gateway = init.gateway;
23
- this.externalAddress = dynamicExternalAddress({
24
- gateway: this.gateway,
25
- addressManager: this.addressManager,
26
- logger: components.logger
27
- }, {
28
- interval: init.externalAddressCheckInterval,
29
- timeout: init.externalAddressCheckTimeout,
30
- onExternalAddressChange: this.remapPorts.bind(this)
31
- });
23
+ if (init.externalAddress != null) {
24
+ this.externalAddress = staticExternalAddress(init.externalAddress);
25
+ }
26
+ else {
27
+ this.externalAddress = dynamicExternalAddress({
28
+ gateway: this.gateway,
29
+ addressManager: this.addressManager,
30
+ logger: components.logger
31
+ }, {
32
+ interval: init.externalAddressCheckInterval,
33
+ timeout: init.externalAddressCheckTimeout,
34
+ onExternalAddressChange: this.remapPorts.bind(this)
35
+ });
36
+ }
32
37
  this.gateway = init.gateway;
33
38
  this.mappedPorts = new Map();
34
39
  this.started = false;
@@ -1 +1 @@
1
- {"version":3,"file":"upnp-port-mapper.js","sourceRoot":"","sources":["../../src/upnp-port-mapper.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"upnp-port-mapper.js","sourceRoot":"","sources":["../../src/upnp-port-mapper.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@libp2p/upnp-nat",
3
- "version": "3.0.4",
3
+ "version": "3.0.5-26313e695",
4
4
  "description": "UPnP NAT hole punching",
5
5
  "license": "Apache-2.0 OR MIT",
6
6
  "homepage": "https://github.com/libp2p/js-libp2p/tree/main/packages/upnp-nat#readme",
@@ -52,18 +52,18 @@
52
52
  "dependencies": {
53
53
  "@achingbrain/nat-port-mapper": "^4.0.0",
54
54
  "@chainsafe/is-ip": "^2.0.2",
55
- "@libp2p/interface": "^2.4.0",
56
- "@libp2p/interface-internal": "^2.2.2",
57
- "@libp2p/utils": "^6.3.1",
55
+ "@libp2p/interface": "2.4.1-26313e695",
56
+ "@libp2p/interface-internal": "2.2.3-26313e695",
57
+ "@libp2p/utils": "6.4.0-26313e695",
58
58
  "@multiformats/multiaddr": "^12.3.3",
59
59
  "@multiformats/multiaddr-matcher": "^1.6.0",
60
60
  "p-defer": "^4.0.1",
61
61
  "race-signal": "^1.1.0"
62
62
  },
63
63
  "devDependencies": {
64
- "@libp2p/crypto": "^5.0.9",
65
- "@libp2p/logger": "^5.1.6",
66
- "@libp2p/peer-id": "^5.0.10",
64
+ "@libp2p/crypto": "5.0.10-26313e695",
65
+ "@libp2p/logger": "5.1.7-26313e695",
66
+ "@libp2p/peer-id": "5.0.11-26313e695",
67
67
  "aegir": "^45.0.5",
68
68
  "sinon-ts": "^2.0.0"
69
69
  },
@@ -30,7 +30,6 @@ export interface ExternalAddress {
30
30
  class ExternalAddressChecker implements ExternalAddress, Startable {
31
31
  private readonly log: Logger
32
32
  private readonly gateway: Gateway
33
- private readonly addressManager: AddressManager
34
33
  private started: boolean
35
34
  private lastPublicIp?: string
36
35
  private lastPublicIpPromise?: DeferredPromise<string>
@@ -40,7 +39,6 @@ class ExternalAddressChecker implements ExternalAddress, Startable {
40
39
  constructor (components: ExternalAddressCheckerComponents, init: ExternalAddressCheckerInit) {
41
40
  this.log = components.logger.forComponent('libp2p:upnp-nat:external-address-check')
42
41
  this.gateway = components.gateway
43
- this.addressManager = components.addressManager
44
42
  this.onExternalAddressChange = init.onExternalAddressChange
45
43
  this.started = false
46
44
 
package/src/constants.ts CHANGED
@@ -1,2 +1,7 @@
1
+ export const DEFAULT_INITIAL_GATEWAY_SEARCH_INTERVAL = 5_000
2
+ export const DEFAULT_INITIAL_GATEWAY_SEARCH_TIMEOUT = 5_000
3
+ export const DEFAULT_INITIAL_GATEWAY_SEARCH_MESSAGE_INTERVAL = 1_000
4
+
1
5
  export const DEFAULT_GATEWAY_SEARCH_TIMEOUT = 60_000
2
6
  export const DEFAULT_GATEWAY_SEARCH_INTERVAL = 300_000
7
+ export const DEFAULT_GATEWAY_SEARCH_MESSAGE_INTERVAL = 10_000
package/src/index.ts CHANGED
@@ -33,6 +33,46 @@
33
33
  * }
34
34
  * })
35
35
  * ```
36
+ *
37
+ * @example Manually specifying gateways and external ports
38
+ *
39
+ * Some ISP-provided routers are underpowered and may require rebooting before
40
+ * they will respond to SSDP M-SEARCH messages.
41
+ *
42
+ * You can manually specify your external address and/or gateways, though note
43
+ * that those gateways will still need to have UPnP enabled in order for libp2p
44
+ * to configure mapping of external ports (for IPv4) and/or opening pinholes in
45
+ * the firewall (for IPv6).
46
+ *
47
+ * ```typescript
48
+ * import { createLibp2p } from 'libp2p'
49
+ * import { tcp } from '@libp2p/tcp'
50
+ * import { uPnPNAT } from '@libp2p/upnp-nat'
51
+ *
52
+ * const node = await createLibp2p({
53
+ * addresses: {
54
+ * listen: [
55
+ * '/ip4/0.0.0.0/tcp/0'
56
+ * ]
57
+ * },
58
+ * transports: [
59
+ * tcp()
60
+ * ],
61
+ * services: {
62
+ * upnpNAT: uPnPNAT({
63
+ * // manually specify external address - this will normally be an IPv4
64
+ * // address that the router is performing NAT with
65
+ * externalAddress: '92.137.164.96',
66
+ * gateways: [
67
+ * // an IPv4 gateway
68
+ * 'http://192.168.1.1:8080/path/to/descriptor.xml',
69
+ * // an IPv6 gateway
70
+ * 'http://[xx:xx:xx:xx]:8080/path/to/descriptor.xml'
71
+ * ]
72
+ * })
73
+ * }
74
+ * })
75
+ * ```
36
76
  */
37
77
 
38
78
  import { UPnPNAT as UPnPNATClass } from './upnp-nat.js'
@@ -50,6 +90,14 @@ export interface PMPOptions {
50
90
  }
51
91
 
52
92
  export interface UPnPNATInit {
93
+ /**
94
+ * By default we query discovered/configured gateways for their external
95
+ * address. To specify it manually instead, pass a value here.
96
+ *
97
+ * Typically this would be an IPv4 address that the router performs NAT with.
98
+ */
99
+ externalAddress?: string
100
+
53
101
  /**
54
102
  * Check if the external address has changed this often in ms. Ignored if an
55
103
  * external address is specified.
@@ -109,6 +157,91 @@ export interface UPnPNATInit {
109
157
  * @default false
110
158
  */
111
159
  autoConfirmAddress?: boolean
160
+
161
+ /**
162
+ * By default we search for local gateways using SSDP M-SEARCH messages. To
163
+ * manually specify a gateway instead, pass values here.
164
+ *
165
+ * A lot of ISP-provided gateway/routers are underpowered so may need
166
+ * rebooting before they will respond to M-SEARCH messages.
167
+ *
168
+ * Each value is an IPv4 or IPv6 URL of the UPnP device descriptor document,
169
+ * e.g. `http://192.168.1.1:8080/description.xml`. Please see the
170
+ * documentation of your gateway to discover the URL.
171
+ *
172
+ * Note that some gateways will randomise the port/path the descriptor
173
+ * document is served from and even change it over time so you may be forced
174
+ * to use an SSDP search instead.
175
+ */
176
+ gateways?: string[]
177
+
178
+ /**
179
+ * How often to search for network gateways in ms.
180
+ *
181
+ * This interval is used before a gateway has been found on the network, after
182
+ * that it switches to `gatewaySearchInterval` which lowers the frequency of
183
+ * the search.
184
+ *
185
+ * @default 5_000
186
+ */
187
+ initialGatewaySearchInterval?: number
188
+
189
+ /**
190
+ * How often to send the `M-SEARCH` SSDP message during a gateway search in
191
+ * ms.
192
+ *
193
+ * Some routers are flaky and may not respond to every query so decreasing
194
+ * this will increase the number of search messages sent before the timeout.
195
+ *
196
+ * This interval is used before a gateway has been found on the network, after
197
+ * that it switches to `gatewaySearchMessageInterval` which lowers the
198
+ * frequency of search messages sent.
199
+ *
200
+ * @default 1_000
201
+ */
202
+ initialGatewaySearchMessageInterval?: number
203
+
204
+ /**
205
+ * How long to search for gateways for before giving up in ms.
206
+ *
207
+ * This timeout is used before a gateway has been found on the network, after
208
+ * that it switches to `gatewaySearchTimeout` which increases the timeout to
209
+ * give gateways more time to respond.
210
+ *
211
+ * @default 5_000
212
+ */
213
+ initialGatewaySearchTimeout?: number
214
+
215
+ /**
216
+ * How often to search for network gateways in ms.
217
+ *
218
+ * This interval is used after a gateway has been found on the network.
219
+ *
220
+ * @default 300_000
221
+ */
222
+ gatewaySearchInterval?: number
223
+
224
+ /**
225
+ * How often to send the `M-SEARCH` SSDP message during a gateway search in
226
+ * ms.
227
+ *
228
+ * Some routers are flaky and may not respond to every query so decreasing
229
+ * this will increase the number of search messages sent before the timeout.
230
+ *
231
+ * This interval is used after a gateway has been found on the network.
232
+ *
233
+ * @default 10_000
234
+ */
235
+ gatewaySearchMessageInterval?: number
236
+
237
+ /**
238
+ * How long to search for gateways for before giving up in ms.
239
+ *
240
+ * This timeout is used after a gateway has been found on the network.
241
+ *
242
+ * @default 60_000
243
+ */
244
+ gatewaySearchTimeout?: number
112
245
  }
113
246
 
114
247
  export interface UPnPNATComponents {
@@ -0,0 +1,94 @@
1
+ import { TypedEventEmitter, start, stop } from '@libp2p/interface'
2
+ import { repeatingTask } from '@libp2p/utils/repeating-task'
3
+ import { DEFAULT_GATEWAY_SEARCH_INTERVAL, DEFAULT_GATEWAY_SEARCH_MESSAGE_INTERVAL, DEFAULT_GATEWAY_SEARCH_TIMEOUT, DEFAULT_INITIAL_GATEWAY_SEARCH_INTERVAL, DEFAULT_INITIAL_GATEWAY_SEARCH_MESSAGE_INTERVAL, DEFAULT_INITIAL_GATEWAY_SEARCH_TIMEOUT } from './constants.js'
4
+ import type { GatewayFinder, GatewayFinderEvents } from './upnp-nat.js'
5
+ import type { Gateway, UPnPNAT } from '@achingbrain/nat-port-mapper'
6
+ import type { ComponentLogger, Logger } from '@libp2p/interface'
7
+ import type { RepeatingTask } from '@libp2p/utils/repeating-task'
8
+
9
+ export interface SearchGatewayFinderComponents {
10
+ logger: ComponentLogger
11
+ }
12
+
13
+ export interface SearchGatewayFinderInit {
14
+ portMappingClient: UPnPNAT
15
+ initialSearchInterval?: number
16
+ initialSearchTimeout?: number
17
+ initialSearchMessageInterval?: number
18
+ searchInterval?: number
19
+ searchTimeout?: number
20
+ searchMessageInterval?: number
21
+ }
22
+
23
+ export class SearchGatewayFinder extends TypedEventEmitter<GatewayFinderEvents> implements GatewayFinder {
24
+ private readonly log: Logger
25
+ private readonly gateways: Gateway[]
26
+ private readonly findGateways: RepeatingTask
27
+ private readonly portMappingClient: UPnPNAT
28
+ private started: boolean
29
+
30
+ constructor (components: SearchGatewayFinderComponents, init: SearchGatewayFinderInit) {
31
+ super()
32
+
33
+ this.log = components.logger.forComponent('libp2p:upnp-nat')
34
+ this.portMappingClient = init.portMappingClient
35
+ this.started = false
36
+ this.gateways = []
37
+
38
+ // every five minutes, search for network gateways for one minute
39
+ this.findGateways = repeatingTask(async (options) => {
40
+ try {
41
+ const searchMessageInterval = this.gateways.length > 0
42
+ ? init.searchMessageInterval ?? DEFAULT_GATEWAY_SEARCH_MESSAGE_INTERVAL
43
+ : init.initialSearchMessageInterval ?? DEFAULT_INITIAL_GATEWAY_SEARCH_MESSAGE_INTERVAL
44
+
45
+ this.log('begin gateway search, sending M-SEARCH every %dms', searchMessageInterval)
46
+
47
+ for await (const gateway of this.portMappingClient.findGateways({
48
+ ...options,
49
+ searchInterval: searchMessageInterval
50
+ })) {
51
+ if (this.gateways.some(g => {
52
+ return g.id === gateway.id && g.family === gateway.family
53
+ })) {
54
+ // already seen this gateway
55
+ continue
56
+ }
57
+
58
+ this.gateways.push(gateway)
59
+ this.safeDispatchEvent('gateway', {
60
+ detail: gateway
61
+ })
62
+
63
+ // we've found a gateway, wait for longer before searching again
64
+ const searchInterval = init.searchTimeout ?? DEFAULT_GATEWAY_SEARCH_INTERVAL
65
+ const searchTimeout = init.searchTimeout ?? DEFAULT_GATEWAY_SEARCH_TIMEOUT
66
+ this.log('switching gateway search to every %dms, timing out after %dms', searchInterval, searchTimeout)
67
+ this.findGateways.setInterval(searchInterval)
68
+ this.findGateways.setTimeout(searchTimeout)
69
+ }
70
+
71
+ this.log('gateway search finished, found %d gateways', this.gateways.length)
72
+ } catch (err) {
73
+ this.log.error('gateway search errored - %e', err)
74
+ }
75
+ }, init.initialSearchInterval ?? DEFAULT_INITIAL_GATEWAY_SEARCH_INTERVAL, {
76
+ runImmediately: true,
77
+ timeout: init.initialSearchTimeout ?? DEFAULT_INITIAL_GATEWAY_SEARCH_TIMEOUT
78
+ })
79
+ }
80
+
81
+ async start (): Promise<void> {
82
+ if (this.started) {
83
+ return
84
+ }
85
+
86
+ this.started = true
87
+ await start(this.findGateways)
88
+ }
89
+
90
+ async stop (): Promise<void> {
91
+ await stop(this.findGateways)
92
+ this.started = false
93
+ }
94
+ }
@@ -0,0 +1,60 @@
1
+ import { TypedEventEmitter } from '@libp2p/interface'
2
+ import type { GatewayFinder, GatewayFinderEvents } from './upnp-nat.js'
3
+ import type { Gateway, UPnPNAT } from '@achingbrain/nat-port-mapper'
4
+ import type { ComponentLogger, Logger } from '@libp2p/interface'
5
+
6
+ export interface StaticGatewayFinderComponents {
7
+ logger: ComponentLogger
8
+ }
9
+
10
+ export interface StaticGatewayFinderInit {
11
+ portMappingClient: UPnPNAT
12
+ gateways: string[]
13
+ }
14
+
15
+ export class StaticGatewayFinder extends TypedEventEmitter<GatewayFinderEvents> implements GatewayFinder {
16
+ private readonly log: Logger
17
+ private readonly gatewayUrls: URL[]
18
+ private readonly gateways: Gateway[]
19
+ private readonly portMappingClient: UPnPNAT
20
+ private started: boolean
21
+
22
+ constructor (components: StaticGatewayFinderComponents, init: StaticGatewayFinderInit) {
23
+ super()
24
+
25
+ this.log = components.logger.forComponent('libp2p:upnp-nat:static-gateway-finder')
26
+ this.portMappingClient = init.portMappingClient
27
+ this.started = false
28
+ this.gateways = []
29
+ this.gatewayUrls = init.gateways.map(url => new URL(url))
30
+ }
31
+
32
+ async start (): Promise<void> {
33
+ this.started = true
34
+ }
35
+
36
+ async afterStart (): Promise<void> {
37
+ for (const url of this.gatewayUrls) {
38
+ try {
39
+ this.log('fetching gateway descriptor from %s', url)
40
+ const gateway = await this.portMappingClient.getGateway(url)
41
+
42
+ if (!this.started) {
43
+ return
44
+ }
45
+
46
+ this.log('found static gateway at %s', url)
47
+ this.gateways.push(gateway)
48
+ this.safeDispatchEvent('gateway', {
49
+ detail: gateway
50
+ })
51
+ } catch (err) {
52
+ this.log.error('could not contact static gateway at %s - %e', url, err)
53
+ }
54
+ }
55
+ }
56
+
57
+ async stop (): Promise<void> {
58
+ this.started = false
59
+ }
60
+ }
package/src/upnp-nat.ts CHANGED
@@ -1,13 +1,22 @@
1
1
  import { upnpNat } from '@achingbrain/nat-port-mapper'
2
2
  import { serviceCapabilities, serviceDependencies, setMaxListeners, start, stop } from '@libp2p/interface'
3
3
  import { debounce } from '@libp2p/utils/debounce'
4
- import { GatewayFinder } from './gateway-finder.js'
4
+ import { SearchGatewayFinder } from './search-gateway-finder.js'
5
+ import { StaticGatewayFinder } from './static-gateway-finder.js'
5
6
  import { UPnPPortMapper } from './upnp-port-mapper.js'
6
7
  import type { UPnPNATComponents, UPnPNATInit, UPnPNAT as UPnPNATInterface } from './index.js'
7
8
  import type { Gateway, UPnPNAT as UPnPNATClient } from '@achingbrain/nat-port-mapper'
8
- import type { Logger, Startable } from '@libp2p/interface'
9
+ import type { Logger, Startable, TypedEventTarget } from '@libp2p/interface'
9
10
  import type { DebouncedFunction } from '@libp2p/utils/debounce'
10
11
 
12
+ export interface GatewayFinderEvents {
13
+ 'gateway': CustomEvent<Gateway>
14
+ }
15
+
16
+ export interface GatewayFinder extends TypedEventTarget<GatewayFinderEvents> {
17
+
18
+ }
19
+
11
20
  export class UPnPNAT implements Startable, UPnPNATInterface {
12
21
  private readonly log: Logger
13
22
  private readonly components: UPnPNATComponents
@@ -44,10 +53,23 @@ export class UPnPNAT implements Startable, UPnPNATInterface {
44
53
  }
45
54
  }, 5_000)
46
55
 
47
- // trigger update when we discovery gateways on the network
48
- this.gatewayFinder = new GatewayFinder(components, {
49
- portMappingClient: this.portMappingClient
50
- })
56
+ if (init.gateways != null) {
57
+ this.gatewayFinder = new StaticGatewayFinder(components, {
58
+ portMappingClient: this.portMappingClient,
59
+ gateways: init.gateways
60
+ })
61
+ } else {
62
+ // trigger update when we discovery gateways on the network
63
+ this.gatewayFinder = new SearchGatewayFinder(components, {
64
+ portMappingClient: this.portMappingClient,
65
+ initialSearchInterval: init.initialGatewaySearchInterval,
66
+ initialSearchTimeout: init.initialGatewaySearchTimeout,
67
+ initialSearchMessageInterval: init.initialGatewaySearchMessageInterval,
68
+ searchInterval: init.gatewaySearchInterval,
69
+ searchTimeout: init.gatewaySearchTimeout,
70
+ searchMessageInterval: init.gatewaySearchMessageInterval
71
+ })
72
+ }
51
73
 
52
74
  this.onGatewayDiscovered = this.onGatewayDiscovered.bind(this)
53
75
  }
@@ -6,7 +6,7 @@ import { isPrivate } from '@libp2p/utils/multiaddr/is-private'
6
6
  import { isPrivateIp } from '@libp2p/utils/private-ip'
7
7
  import { multiaddr } from '@multiformats/multiaddr'
8
8
  import { QUICV1, TCP, WebSockets, WebSocketsSecure, WebTransport } from '@multiformats/multiaddr-matcher'
9
- import { dynamicExternalAddress } from './check-external-address.js'
9
+ import { dynamicExternalAddress, staticExternalAddress } from './check-external-address.js'
10
10
  import { DoubleNATError } from './errors.js'
11
11
  import type { ExternalAddress } from './check-external-address.js'
12
12
  import type { Gateway } from '@achingbrain/nat-port-mapper'
@@ -18,6 +18,7 @@ const MAX_DATE = 8_640_000_000_000_000
18
18
 
19
19
  export interface UPnPPortMapperInit {
20
20
  gateway: Gateway
21
+ externalAddress?: string
21
22
  externalAddressCheckInterval?: number
22
23
  externalAddressCheckTimeout?: number
23
24
  }
@@ -48,15 +49,20 @@ export class UPnPPortMapper {
48
49
  this.log = components.logger.forComponent(`libp2p:upnp-nat:gateway:${init.gateway.id}`)
49
50
  this.addressManager = components.addressManager
50
51
  this.gateway = init.gateway
51
- this.externalAddress = dynamicExternalAddress({
52
- gateway: this.gateway,
53
- addressManager: this.addressManager,
54
- logger: components.logger
55
- }, {
56
- interval: init.externalAddressCheckInterval,
57
- timeout: init.externalAddressCheckTimeout,
58
- onExternalAddressChange: this.remapPorts.bind(this)
59
- })
52
+
53
+ if (init.externalAddress != null) {
54
+ this.externalAddress = staticExternalAddress(init.externalAddress)
55
+ } else {
56
+ this.externalAddress = dynamicExternalAddress({
57
+ gateway: this.gateway,
58
+ addressManager: this.addressManager,
59
+ logger: components.logger
60
+ }, {
61
+ interval: init.externalAddressCheckInterval,
62
+ timeout: init.externalAddressCheckTimeout,
63
+ onExternalAddressChange: this.remapPorts.bind(this)
64
+ })
65
+ }
60
66
  this.gateway = init.gateway
61
67
  this.mappedPorts = new Map()
62
68
  this.started = false
@@ -1,26 +0,0 @@
1
- import { TypedEventEmitter } from '@libp2p/interface';
2
- import type { Gateway, UPnPNAT } from '@achingbrain/nat-port-mapper';
3
- import type { ComponentLogger } from '@libp2p/interface';
4
- export interface GatewayFinderComponents {
5
- logger: ComponentLogger;
6
- }
7
- export interface GatewayFinderInit {
8
- portMappingClient: UPnPNAT;
9
- }
10
- export interface GatewayFinderEvents {
11
- 'gateway': CustomEvent<Gateway>;
12
- }
13
- export declare class GatewayFinder extends TypedEventEmitter<GatewayFinderEvents> {
14
- private readonly log;
15
- private readonly gateways;
16
- private readonly findGateways;
17
- private readonly portMappingClient;
18
- private started;
19
- constructor(components: GatewayFinderComponents, init: GatewayFinderInit);
20
- start(): Promise<void>;
21
- /**
22
- * Stops the NAT manager
23
- */
24
- stop(): Promise<void>;
25
- }
26
- //# sourceMappingURL=gateway-finder.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"gateway-finder.d.ts","sourceRoot":"","sources":["../../src/gateway-finder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAe,MAAM,mBAAmB,CAAA;AAGlE,OAAO,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,8BAA8B,CAAA;AACpE,OAAO,KAAK,EAAE,eAAe,EAAU,MAAM,mBAAmB,CAAA;AAGhE,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,eAAe,CAAA;CACxB;AAED,MAAM,WAAW,iBAAiB;IAChC,iBAAiB,EAAE,OAAO,CAAA;CAC3B;AAED,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,WAAW,CAAC,OAAO,CAAC,CAAA;CAChC;AAED,qBAAa,aAAc,SAAQ,iBAAiB,CAAC,mBAAmB,CAAC;IACvE,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAQ;IAC5B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAW;IACpC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAe;IAC5C,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAS;IAC3C,OAAO,CAAC,OAAO,CAAS;gBAEX,UAAU,EAAE,uBAAuB,EAAE,IAAI,EAAE,iBAAiB;IAgCnE,KAAK,IAAK,OAAO,CAAC,IAAI,CAAC;IAS7B;;OAEG;IACG,IAAI,IAAK,OAAO,CAAC,IAAI,CAAC;CAI7B"}
@@ -1,53 +0,0 @@
1
- import { TypedEventEmitter, start, stop } from '@libp2p/interface';
2
- import { repeatingTask } from '@libp2p/utils/repeating-task';
3
- import { DEFAULT_GATEWAY_SEARCH_INTERVAL, DEFAULT_GATEWAY_SEARCH_TIMEOUT } from './constants.js';
4
- export class GatewayFinder extends TypedEventEmitter {
5
- log;
6
- gateways;
7
- findGateways;
8
- portMappingClient;
9
- started;
10
- constructor(components, init) {
11
- super();
12
- this.log = components.logger.forComponent('libp2p:upnp-nat');
13
- this.portMappingClient = init.portMappingClient;
14
- this.started = false;
15
- this.gateways = [];
16
- // every five minutes, search for network gateways for one minute
17
- this.findGateways = repeatingTask(async (options) => {
18
- for await (const gateway of this.portMappingClient.findGateways({
19
- ...options,
20
- searchInterval: 10000
21
- })) {
22
- if (this.gateways.some(g => {
23
- return g.id === gateway.id && g.family === gateway.family;
24
- })) {
25
- // already seen this gateway
26
- continue;
27
- }
28
- this.gateways.push(gateway);
29
- this.safeDispatchEvent('gateway', {
30
- detail: gateway
31
- });
32
- }
33
- }, DEFAULT_GATEWAY_SEARCH_INTERVAL, {
34
- runImmediately: true,
35
- timeout: DEFAULT_GATEWAY_SEARCH_TIMEOUT
36
- });
37
- }
38
- async start() {
39
- if (this.started) {
40
- return;
41
- }
42
- this.started = true;
43
- await start(this.findGateways);
44
- }
45
- /**
46
- * Stops the NAT manager
47
- */
48
- async stop() {
49
- await stop(this.findGateways);
50
- this.started = false;
51
- }
52
- }
53
- //# sourceMappingURL=gateway-finder.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"gateway-finder.js","sourceRoot":"","sources":["../../src/gateway-finder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAA;AAClE,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAA;AAC5D,OAAO,EAAE,+BAA+B,EAAE,8BAA8B,EAAE,MAAM,gBAAgB,CAAA;AAiBhG,MAAM,OAAO,aAAc,SAAQ,iBAAsC;IACtD,GAAG,CAAQ;IACX,QAAQ,CAAW;IACnB,YAAY,CAAe;IAC3B,iBAAiB,CAAS;IACnC,OAAO,CAAS;IAExB,YAAa,UAAmC,EAAE,IAAuB;QACvE,KAAK,EAAE,CAAA;QAEP,IAAI,CAAC,GAAG,GAAG,UAAU,CAAC,MAAM,CAAC,YAAY,CAAC,iBAAiB,CAAC,CAAA;QAC5D,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,iBAAiB,CAAA;QAC/C,IAAI,CAAC,OAAO,GAAG,KAAK,CAAA;QACpB,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAA;QAElB,iEAAiE;QACjE,IAAI,CAAC,YAAY,GAAG,aAAa,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;YAClD,IAAI,KAAK,EAAE,MAAM,OAAO,IAAI,IAAI,CAAC,iBAAiB,CAAC,YAAY,CAAC;gBAC9D,GAAG,OAAO;gBACV,cAAc,EAAE,KAAK;aACtB,CAAC,EAAE,CAAC;gBACH,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE;oBACzB,OAAO,CAAC,CAAC,EAAE,KAAK,OAAO,CAAC,EAAE,IAAI,CAAC,CAAC,MAAM,KAAK,OAAO,CAAC,MAAM,CAAA;gBAC3D,CAAC,CAAC,EAAE,CAAC;oBACH,4BAA4B;oBAC5B,SAAQ;gBACV,CAAC;gBAED,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;gBAC3B,IAAI,CAAC,iBAAiB,CAAC,SAAS,EAAE;oBAChC,MAAM,EAAE,OAAO;iBAChB,CAAC,CAAA;YACJ,CAAC;QACH,CAAC,EAAE,+BAA+B,EAAE;YAClC,cAAc,EAAE,IAAI;YACpB,OAAO,EAAE,8BAA8B;SACxC,CAAC,CAAA;IACJ,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,OAAM;QACR,CAAC;QAED,IAAI,CAAC,OAAO,GAAG,IAAI,CAAA;QACnB,MAAM,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;IAChC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,IAAI;QACR,MAAM,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;QAC7B,IAAI,CAAC,OAAO,GAAG,KAAK,CAAA;IACtB,CAAC;CACF"}
@@ -1,12 +0,0 @@
1
- {
2
- "PMPOptions": "https://libp2p.github.io/js-libp2p/interfaces/_libp2p_upnp_nat.PMPOptions.html",
3
- ".:PMPOptions": "https://libp2p.github.io/js-libp2p/interfaces/_libp2p_upnp_nat.PMPOptions.html",
4
- "UPnPNAT": "https://libp2p.github.io/js-libp2p/interfaces/_libp2p_upnp_nat.UPnPNAT.html",
5
- ".:UPnPNAT": "https://libp2p.github.io/js-libp2p/interfaces/_libp2p_upnp_nat.UPnPNAT.html",
6
- "UPnPNATComponents": "https://libp2p.github.io/js-libp2p/interfaces/_libp2p_upnp_nat.UPnPNATComponents.html",
7
- ".:UPnPNATComponents": "https://libp2p.github.io/js-libp2p/interfaces/_libp2p_upnp_nat.UPnPNATComponents.html",
8
- "UPnPNATInit": "https://libp2p.github.io/js-libp2p/interfaces/_libp2p_upnp_nat.UPnPNATInit.html",
9
- ".:UPnPNATInit": "https://libp2p.github.io/js-libp2p/interfaces/_libp2p_upnp_nat.UPnPNATInit.html",
10
- "uPnPNAT": "https://libp2p.github.io/js-libp2p/functions/_libp2p_upnp_nat.uPnPNAT-1.html",
11
- ".:uPnPNAT": "https://libp2p.github.io/js-libp2p/functions/_libp2p_upnp_nat.uPnPNAT-1.html"
12
- }