@libp2p/upnp-nat 3.0.5-66c3ec5e1 → 3.0.5-bf0f74d66
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 +40 -0
- package/dist/src/check-external-address.d.ts.map +1 -1
- package/dist/src/check-external-address.js +0 -2
- package/dist/src/check-external-address.js.map +1 -1
- package/dist/src/index.d.ts +63 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +40 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/{gateway-finder.d.ts → search-gateway-finder.d.ts} +7 -12
- package/dist/src/search-gateway-finder.d.ts.map +1 -0
- package/dist/src/{gateway-finder.js → search-gateway-finder.js} +2 -5
- package/dist/src/search-gateway-finder.js.map +1 -0
- package/dist/src/static-gateway-finder.d.ts +23 -0
- package/dist/src/static-gateway-finder.d.ts.map +1 -0
- package/dist/src/static-gateway-finder.js +42 -0
- package/dist/src/static-gateway-finder.js.map +1 -0
- package/dist/src/upnp-nat.d.ts +6 -1
- package/dist/src/upnp-nat.d.ts.map +1 -1
- package/dist/src/upnp-nat.js +20 -11
- package/dist/src/upnp-nat.js.map +1 -1
- package/dist/src/upnp-port-mapper.d.ts +1 -0
- package/dist/src/upnp-port-mapper.d.ts.map +1 -1
- package/dist/src/upnp-port-mapper.js +15 -10
- package/dist/src/upnp-port-mapper.js.map +1 -1
- package/package.json +7 -7
- package/src/check-external-address.ts +0 -2
- package/src/index.ts +65 -0
- package/src/{gateway-finder.ts → search-gateway-finder.ts} +5 -11
- package/src/static-gateway-finder.ts +60 -0
- package/src/upnp-nat.ts +28 -12
- package/src/upnp-port-mapper.ts +16 -10
- package/dist/src/gateway-finder.d.ts.map +0 -1
- package/dist/src/gateway-finder.js.map +0 -1
package/README.md
CHANGED
|
@@ -57,6 +57,46 @@ const node = await createLibp2p({
|
|
|
57
57
|
})
|
|
58
58
|
```
|
|
59
59
|
|
|
60
|
+
## Example - Manually specifying gateways and external ports
|
|
61
|
+
|
|
62
|
+
Some ISP-provided routers are underpowered and may require rebooting before
|
|
63
|
+
they will respond to SSDP M-SEARCH messages.
|
|
64
|
+
|
|
65
|
+
You can manually specify your external address and/or gateways, though note
|
|
66
|
+
that those gateways will still need to have UPnP enabled in order for libp2p
|
|
67
|
+
to configure mapping of external ports (for IPv4) and/or opening pinholes in
|
|
68
|
+
the firewall (for IPv6).
|
|
69
|
+
|
|
70
|
+
```typescript
|
|
71
|
+
import { createLibp2p } from 'libp2p'
|
|
72
|
+
import { tcp } from '@libp2p/tcp'
|
|
73
|
+
import { uPnPNAT } from '@libp2p/upnp-nat'
|
|
74
|
+
|
|
75
|
+
const node = await createLibp2p({
|
|
76
|
+
addresses: {
|
|
77
|
+
listen: [
|
|
78
|
+
'/ip4/0.0.0.0/tcp/0'
|
|
79
|
+
]
|
|
80
|
+
},
|
|
81
|
+
transports: [
|
|
82
|
+
tcp()
|
|
83
|
+
],
|
|
84
|
+
services: {
|
|
85
|
+
upnpNAT: uPnPNAT({
|
|
86
|
+
// manually specify external address - this will normally be an IPv4
|
|
87
|
+
// address that the router is performing NAT with
|
|
88
|
+
externalAddress: '92.137.164.96',
|
|
89
|
+
gateways: [
|
|
90
|
+
// an IPv4 gateway
|
|
91
|
+
'http://192.168.1.1:8080/path/to/descriptor.xml',
|
|
92
|
+
// an IPv6 gateway
|
|
93
|
+
'http://[xx:xx:xx:xx]:8080/path/to/descriptor.xml'
|
|
94
|
+
]
|
|
95
|
+
})
|
|
96
|
+
}
|
|
97
|
+
})
|
|
98
|
+
```
|
|
99
|
+
|
|
60
100
|
# Install
|
|
61
101
|
|
|
62
102
|
```console
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"check-external-address.d.ts","sourceRoot":"","sources":["../../src/check-external-address.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,8BAA8B,CAAA;AAC3D,OAAO,KAAK,EAAE,YAAY,EAAE,eAAe,EAAqB,MAAM,mBAAmB,CAAA;AACzF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAA;AAIhE,MAAM,WAAW,gCAAgC;IAC/C,OAAO,EAAE,OAAO,CAAA;IAChB,cAAc,EAAE,cAAc,CAAA;IAC9B,MAAM,EAAE,eAAe,CAAA;CACxB;AAED,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,uBAAuB,CAAC,CAAC,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAA;CAC3D;AAED,MAAM,WAAW,eAAe;IAC9B,WAAW,CAAE,OAAO,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,MAAM,CAAA;CAC/D;
|
|
1
|
+
{"version":3,"file":"check-external-address.d.ts","sourceRoot":"","sources":["../../src/check-external-address.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,8BAA8B,CAAA;AAC3D,OAAO,KAAK,EAAE,YAAY,EAAE,eAAe,EAAqB,MAAM,mBAAmB,CAAA;AACzF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAA;AAIhE,MAAM,WAAW,gCAAgC;IAC/C,OAAO,EAAE,OAAO,CAAA;IAChB,cAAc,EAAE,cAAc,CAAA;IAC9B,MAAM,EAAE,eAAe,CAAA;CACxB;AAED,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,uBAAuB,CAAC,CAAC,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAA;CAC3D;AAED,MAAM,WAAW,eAAe;IAC9B,WAAW,CAAE,OAAO,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,MAAM,CAAA;CAC/D;AAwFD,wBAAgB,sBAAsB,CAAE,UAAU,EAAE,gCAAgC,EAAE,IAAI,EAAE,0BAA0B,GAAG,eAAe,CAEvI;AAED,wBAAgB,qBAAqB,CAAE,OAAO,EAAE,MAAM,GAAG,eAAe,CAIvE"}
|
|
@@ -8,7 +8,6 @@ import { raceSignal } from 'race-signal';
|
|
|
8
8
|
class ExternalAddressChecker {
|
|
9
9
|
log;
|
|
10
10
|
gateway;
|
|
11
|
-
addressManager;
|
|
12
11
|
started;
|
|
13
12
|
lastPublicIp;
|
|
14
13
|
lastPublicIpPromise;
|
|
@@ -17,7 +16,6 @@ class ExternalAddressChecker {
|
|
|
17
16
|
constructor(components, init) {
|
|
18
17
|
this.log = components.logger.forComponent('libp2p:upnp-nat:external-address-check');
|
|
19
18
|
this.gateway = components.gateway;
|
|
20
|
-
this.addressManager = components.addressManager;
|
|
21
19
|
this.onExternalAddressChange = init.onExternalAddressChange;
|
|
22
20
|
this.started = false;
|
|
23
21
|
this.checkExternalAddress = this.checkExternalAddress.bind(this);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"check-external-address.js","sourceRoot":"","sources":["../../src/check-external-address.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAA;AAChE,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAA;AAC5D,OAAO,MAAM,MAAM,SAAS,CAAA;AAC5B,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAuBxC;;GAEG;AACH,MAAM,sBAAsB;IACT,GAAG,CAAQ;IACX,OAAO,CAAS;
|
|
1
|
+
{"version":3,"file":"check-external-address.js","sourceRoot":"","sources":["../../src/check-external-address.ts"],"names":[],"mappings":"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"}
|
package/dist/src/index.d.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
|
import type { UPnPNAT as UPnPNATClient, MapPortOptions } from '@achingbrain/nat-port-mapper';
|
|
38
78
|
import type { ComponentLogger, Libp2pEvents, NodeInfo, PeerId, TypedEventTarget } from '@libp2p/interface';
|
|
@@ -45,6 +85,13 @@ export interface PMPOptions {
|
|
|
45
85
|
enabled?: boolean;
|
|
46
86
|
}
|
|
47
87
|
export interface UPnPNATInit {
|
|
88
|
+
/**
|
|
89
|
+
* By default we query discovered/configured gateways for their external
|
|
90
|
+
* address. To specify it manually instead, pass a value here.
|
|
91
|
+
*
|
|
92
|
+
* Typically this would be an IPv4 address that the router performs NAT with.
|
|
93
|
+
*/
|
|
94
|
+
externalAddress?: string;
|
|
48
95
|
/**
|
|
49
96
|
* Check if the external address has changed this often in ms. Ignored if an
|
|
50
97
|
* external address is specified.
|
|
@@ -97,6 +144,22 @@ export interface UPnPNATInit {
|
|
|
97
144
|
* @default false
|
|
98
145
|
*/
|
|
99
146
|
autoConfirmAddress?: boolean;
|
|
147
|
+
/**
|
|
148
|
+
* By default we search for local gateways using SSDP M-SEARCH messages. To
|
|
149
|
+
* manually specify a gateway instead, pass values here.
|
|
150
|
+
*
|
|
151
|
+
* A lot of ISP-provided gateway/routers are underpowered so may need
|
|
152
|
+
* rebooting before they will respond to M-SEARCH messages.
|
|
153
|
+
*
|
|
154
|
+
* Each value is an IPv4 or IPv6 URL of the UPnP device descriptor document,
|
|
155
|
+
* e.g. `http://192.168.1.1:8080/description.xml`. Please see the
|
|
156
|
+
* documentation of your gateway to discover the URL.
|
|
157
|
+
*
|
|
158
|
+
* Note that some gateways will randomise the port/path the descriptor
|
|
159
|
+
* document is served from and even change it over time so you may be forced
|
|
160
|
+
* to use an SSDP search instead.
|
|
161
|
+
*/
|
|
162
|
+
gateways?: string[];
|
|
100
163
|
/**
|
|
101
164
|
* How often to search for network gateways in ms.
|
|
102
165
|
*
|
package/dist/src/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2EG;AAGH,OAAO,KAAK,EAAE,OAAO,IAAI,aAAa,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAA;AAC5F,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AAC1G,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAA;AAEhE,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,CAAA;AAE7C,MAAM,WAAW,UAAU;IACzB;;OAEG;IACH,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB;AAED,MAAM,WAAW,WAAW;IAC1B;;;;;OAKG;IACH,eAAe,CAAC,EAAE,MAAM,CAAA;IAExB;;;;;OAKG;IACH,4BAA4B,CAAC,EAAE,MAAM,CAAA;IAErC;;;;;OAKG;IACH,2BAA2B,CAAC,EAAE,MAAM,CAAA;IAEpC;;OAEG;IACH,sBAAsB,CAAC,EAAE,MAAM,CAAA;IAE/B;;;;OAIG;IACH,cAAc,CAAC,EAAE,MAAM,CAAA;IAEvB;;;;;OAKG;IACH,sBAAsB,CAAC,EAAE,OAAO,CAAA;IAEhC;;;;OAIG;IACH,2BAA2B,CAAC,EAAE,MAAM,CAAA;IAEpC;;;OAGG;IACH,iBAAiB,CAAC,EAAE,aAAa,CAAA;IAEjC;;;;;;;;OAQG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAA;IAE5B;;;;;;;;;;;;;;OAcG;IACH,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;IAEnB;;;;;;;;OAQG;IACH,4BAA4B,CAAC,EAAE,MAAM,CAAA;IAErC;;;;;;;;;;;;OAYG;IACH,mCAAmC,CAAC,EAAE,MAAM,CAAA;IAE5C;;;;;;;;OAQG;IACH,2BAA2B,CAAC,EAAE,MAAM,CAAA;IAEpC;;;;;;OAMG;IACH,qBAAqB,CAAC,EAAE,MAAM,CAAA;IAE9B;;;;;;;;;;OAUG;IACH,4BAA4B,CAAC,EAAE,MAAM,CAAA;IAErC;;;;;;OAMG;IACH,oBAAoB,CAAC,EAAE,MAAM,CAAA;CAC9B;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,QAAQ,CAAA;IAClB,MAAM,EAAE,eAAe,CAAA;IACvB,cAAc,EAAE,cAAc,CAAA;IAC9B,MAAM,EAAE,gBAAgB,CAAC,YAAY,CAAC,CAAA;CACvC;AAED,MAAM,WAAW,OAAO;IACtB,iBAAiB,EAAE,aAAa,CAAA;CACjC;AAED,wBAAgB,OAAO,CAAE,IAAI,GAAE,WAAgB,GAAG,CAAC,UAAU,EAAE,iBAAiB,KAAK,OAAO,CAI3F"}
|
package/dist/src/index.js
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
|
import { UPnPNAT as UPnPNATClass } from './upnp-nat.js';
|
|
38
78
|
export function uPnPNAT(init = {}) {
|
package/dist/src/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2EG;AAEH,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,eAAe,CAAA;AAqLvD,MAAM,UAAU,OAAO,CAAE,OAAoB,EAAE;IAC7C,OAAO,CAAC,UAA6B,EAAE,EAAE;QACvC,OAAO,IAAI,YAAY,CAAC,UAAU,EAAE,IAAI,CAAC,CAAA;IAC3C,CAAC,CAAA;AACH,CAAC"}
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { TypedEventEmitter } from '@libp2p/interface';
|
|
2
|
-
import type {
|
|
2
|
+
import type { GatewayFinder, GatewayFinderEvents } from './upnp-nat.js';
|
|
3
|
+
import type { UPnPNAT } from '@achingbrain/nat-port-mapper';
|
|
3
4
|
import type { ComponentLogger } from '@libp2p/interface';
|
|
4
|
-
export interface
|
|
5
|
+
export interface SearchGatewayFinderComponents {
|
|
5
6
|
logger: ComponentLogger;
|
|
6
7
|
}
|
|
7
|
-
export interface
|
|
8
|
+
export interface SearchGatewayFinderInit {
|
|
8
9
|
portMappingClient: UPnPNAT;
|
|
9
10
|
initialSearchInterval?: number;
|
|
10
11
|
initialSearchTimeout?: number;
|
|
@@ -13,20 +14,14 @@ export interface GatewayFinderInit {
|
|
|
13
14
|
searchTimeout?: number;
|
|
14
15
|
searchMessageInterval?: number;
|
|
15
16
|
}
|
|
16
|
-
export
|
|
17
|
-
'gateway': CustomEvent<Gateway>;
|
|
18
|
-
}
|
|
19
|
-
export declare class GatewayFinder extends TypedEventEmitter<GatewayFinderEvents> {
|
|
17
|
+
export declare class SearchGatewayFinder extends TypedEventEmitter<GatewayFinderEvents> implements GatewayFinder {
|
|
20
18
|
private readonly log;
|
|
21
19
|
private readonly gateways;
|
|
22
20
|
private readonly findGateways;
|
|
23
21
|
private readonly portMappingClient;
|
|
24
22
|
private started;
|
|
25
|
-
constructor(components:
|
|
23
|
+
constructor(components: SearchGatewayFinderComponents, init: SearchGatewayFinderInit);
|
|
26
24
|
start(): Promise<void>;
|
|
27
|
-
/**
|
|
28
|
-
* Stops the NAT manager
|
|
29
|
-
*/
|
|
30
25
|
stop(): Promise<void>;
|
|
31
26
|
}
|
|
32
|
-
//# sourceMappingURL=gateway-finder.d.ts.map
|
|
27
|
+
//# sourceMappingURL=search-gateway-finder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search-gateway-finder.d.ts","sourceRoot":"","sources":["../../src/search-gateway-finder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAe,MAAM,mBAAmB,CAAA;AAGlE,OAAO,KAAK,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAA;AACvE,OAAO,KAAK,EAAW,OAAO,EAAE,MAAM,8BAA8B,CAAA;AACpE,OAAO,KAAK,EAAE,eAAe,EAAU,MAAM,mBAAmB,CAAA;AAGhE,MAAM,WAAW,6BAA6B;IAC5C,MAAM,EAAE,eAAe,CAAA;CACxB;AAED,MAAM,WAAW,uBAAuB;IACtC,iBAAiB,EAAE,OAAO,CAAA;IAC1B,qBAAqB,CAAC,EAAE,MAAM,CAAA;IAC9B,oBAAoB,CAAC,EAAE,MAAM,CAAA;IAC7B,4BAA4B,CAAC,EAAE,MAAM,CAAA;IACrC,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,qBAAqB,CAAC,EAAE,MAAM,CAAA;CAC/B;AAED,qBAAa,mBAAoB,SAAQ,iBAAiB,CAAC,mBAAmB,CAAE,YAAW,aAAa;IACtG,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,6BAA6B,EAAE,IAAI,EAAE,uBAAuB;IAmD/E,KAAK,IAAK,OAAO,CAAC,IAAI,CAAC;IASvB,IAAI,IAAK,OAAO,CAAC,IAAI,CAAC;CAI7B"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { TypedEventEmitter, start, stop } from '@libp2p/interface';
|
|
2
2
|
import { repeatingTask } from '@libp2p/utils/repeating-task';
|
|
3
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
|
-
export class
|
|
4
|
+
export class SearchGatewayFinder extends TypedEventEmitter {
|
|
5
5
|
log;
|
|
6
6
|
gateways;
|
|
7
7
|
findGateways;
|
|
@@ -58,12 +58,9 @@ export class GatewayFinder extends TypedEventEmitter {
|
|
|
58
58
|
this.started = true;
|
|
59
59
|
await start(this.findGateways);
|
|
60
60
|
}
|
|
61
|
-
/**
|
|
62
|
-
* Stops the NAT manager
|
|
63
|
-
*/
|
|
64
61
|
async stop() {
|
|
65
62
|
await stop(this.findGateways);
|
|
66
63
|
this.started = false;
|
|
67
64
|
}
|
|
68
65
|
}
|
|
69
|
-
//# sourceMappingURL=gateway-finder.js.map
|
|
66
|
+
//# sourceMappingURL=search-gateway-finder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search-gateway-finder.js","sourceRoot":"","sources":["../../src/search-gateway-finder.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { TypedEventEmitter } from '@libp2p/interface';
|
|
2
|
+
import type { GatewayFinder, GatewayFinderEvents } from './upnp-nat.js';
|
|
3
|
+
import type { UPnPNAT } from '@achingbrain/nat-port-mapper';
|
|
4
|
+
import type { ComponentLogger } from '@libp2p/interface';
|
|
5
|
+
export interface StaticGatewayFinderComponents {
|
|
6
|
+
logger: ComponentLogger;
|
|
7
|
+
}
|
|
8
|
+
export interface StaticGatewayFinderInit {
|
|
9
|
+
portMappingClient: UPnPNAT;
|
|
10
|
+
gateways: string[];
|
|
11
|
+
}
|
|
12
|
+
export declare class StaticGatewayFinder extends TypedEventEmitter<GatewayFinderEvents> implements GatewayFinder {
|
|
13
|
+
private readonly log;
|
|
14
|
+
private readonly gatewayUrls;
|
|
15
|
+
private readonly gateways;
|
|
16
|
+
private readonly portMappingClient;
|
|
17
|
+
private started;
|
|
18
|
+
constructor(components: StaticGatewayFinderComponents, init: StaticGatewayFinderInit);
|
|
19
|
+
start(): Promise<void>;
|
|
20
|
+
afterStart(): Promise<void>;
|
|
21
|
+
stop(): Promise<void>;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=static-gateway-finder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"static-gateway-finder.d.ts","sourceRoot":"","sources":["../../src/static-gateway-finder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AACrD,OAAO,KAAK,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAA;AACvE,OAAO,KAAK,EAAW,OAAO,EAAE,MAAM,8BAA8B,CAAA;AACpE,OAAO,KAAK,EAAE,eAAe,EAAU,MAAM,mBAAmB,CAAA;AAEhE,MAAM,WAAW,6BAA6B;IAC5C,MAAM,EAAE,eAAe,CAAA;CACxB;AAED,MAAM,WAAW,uBAAuB;IACtC,iBAAiB,EAAE,OAAO,CAAA;IAC1B,QAAQ,EAAE,MAAM,EAAE,CAAA;CACnB;AAED,qBAAa,mBAAoB,SAAQ,iBAAiB,CAAC,mBAAmB,CAAE,YAAW,aAAa;IACtG,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAQ;IAC5B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAO;IACnC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAW;IACpC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAS;IAC3C,OAAO,CAAC,OAAO,CAAS;gBAEX,UAAU,EAAE,6BAA6B,EAAE,IAAI,EAAE,uBAAuB;IAU/E,KAAK,IAAK,OAAO,CAAC,IAAI,CAAC;IAIvB,UAAU,IAAK,OAAO,CAAC,IAAI,CAAC;IAqB5B,IAAI,IAAK,OAAO,CAAC,IAAI,CAAC;CAG7B"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { TypedEventEmitter } from '@libp2p/interface';
|
|
2
|
+
export class StaticGatewayFinder extends TypedEventEmitter {
|
|
3
|
+
log;
|
|
4
|
+
gatewayUrls;
|
|
5
|
+
gateways;
|
|
6
|
+
portMappingClient;
|
|
7
|
+
started;
|
|
8
|
+
constructor(components, init) {
|
|
9
|
+
super();
|
|
10
|
+
this.log = components.logger.forComponent('libp2p:upnp-nat:static-gateway-finder');
|
|
11
|
+
this.portMappingClient = init.portMappingClient;
|
|
12
|
+
this.started = false;
|
|
13
|
+
this.gateways = [];
|
|
14
|
+
this.gatewayUrls = init.gateways.map(url => new URL(url));
|
|
15
|
+
}
|
|
16
|
+
async start() {
|
|
17
|
+
this.started = true;
|
|
18
|
+
}
|
|
19
|
+
async afterStart() {
|
|
20
|
+
for (const url of this.gatewayUrls) {
|
|
21
|
+
try {
|
|
22
|
+
this.log('fetching gateway descriptor from %s', url);
|
|
23
|
+
const gateway = await this.portMappingClient.getGateway(url);
|
|
24
|
+
if (!this.started) {
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
this.log('found static gateway at %s', url);
|
|
28
|
+
this.gateways.push(gateway);
|
|
29
|
+
this.safeDispatchEvent('gateway', {
|
|
30
|
+
detail: gateway
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
catch (err) {
|
|
34
|
+
this.log.error('could not contact static gateway at %s - %e', url, err);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
async stop() {
|
|
39
|
+
this.started = false;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=static-gateway-finder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"static-gateway-finder.js","sourceRoot":"","sources":["../../src/static-gateway-finder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AAcrD,MAAM,OAAO,mBAAoB,SAAQ,iBAAsC;IAC5D,GAAG,CAAQ;IACX,WAAW,CAAO;IAClB,QAAQ,CAAW;IACnB,iBAAiB,CAAS;IACnC,OAAO,CAAS;IAExB,YAAa,UAAyC,EAAE,IAA6B;QACnF,KAAK,EAAE,CAAA;QAEP,IAAI,CAAC,GAAG,GAAG,UAAU,CAAC,MAAM,CAAC,YAAY,CAAC,uCAAuC,CAAC,CAAA;QAClF,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,iBAAiB,CAAA;QAC/C,IAAI,CAAC,OAAO,GAAG,KAAK,CAAA;QACpB,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAA;QAClB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,CAAA;IAC3D,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,CAAC,OAAO,GAAG,IAAI,CAAA;IACrB,CAAC;IAED,KAAK,CAAC,UAAU;QACd,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACnC,IAAI,CAAC;gBACH,IAAI,CAAC,GAAG,CAAC,qCAAqC,EAAE,GAAG,CAAC,CAAA;gBACpD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC,GAAG,CAAC,CAAA;gBAE5D,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;oBAClB,OAAM;gBACR,CAAC;gBAED,IAAI,CAAC,GAAG,CAAC,4BAA4B,EAAE,GAAG,CAAC,CAAA;gBAC3C,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;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,6CAA6C,EAAE,GAAG,EAAE,GAAG,CAAC,CAAA;YACzE,CAAC;QACH,CAAC;IACH,CAAC;IAED,KAAK,CAAC,IAAI;QACR,IAAI,CAAC,OAAO,GAAG,KAAK,CAAA;IACtB,CAAC;CACF"}
|
package/dist/src/upnp-nat.d.ts
CHANGED
|
@@ -1,7 +1,12 @@
|
|
|
1
1
|
import { serviceCapabilities, serviceDependencies } from '@libp2p/interface';
|
|
2
2
|
import type { UPnPNATComponents, UPnPNATInit, UPnPNAT as UPnPNATInterface } from './index.js';
|
|
3
3
|
import type { Gateway, UPnPNAT as UPnPNATClient } from '@achingbrain/nat-port-mapper';
|
|
4
|
-
import type { Startable } from '@libp2p/interface';
|
|
4
|
+
import type { Startable, TypedEventTarget } from '@libp2p/interface';
|
|
5
|
+
export interface GatewayFinderEvents {
|
|
6
|
+
'gateway': CustomEvent<Gateway>;
|
|
7
|
+
}
|
|
8
|
+
export interface GatewayFinder extends TypedEventTarget<GatewayFinderEvents> {
|
|
9
|
+
}
|
|
5
10
|
export declare class UPnPNAT implements Startable, UPnPNATInterface {
|
|
6
11
|
private readonly log;
|
|
7
12
|
private readonly components;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"upnp-nat.d.ts","sourceRoot":"","sources":["../../src/upnp-nat.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAgC,MAAM,mBAAmB,CAAA;
|
|
1
|
+
{"version":3,"file":"upnp-nat.d.ts","sourceRoot":"","sources":["../../src/upnp-nat.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAgC,MAAM,mBAAmB,CAAA;AAK1G,OAAO,KAAK,EAAE,iBAAiB,EAAE,WAAW,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAC7F,OAAO,KAAK,EAAE,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,8BAA8B,CAAA;AACrF,OAAO,KAAK,EAAU,SAAS,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AAG5E,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,WAAW,CAAC,OAAO,CAAC,CAAA;CAChC;AAED,MAAM,WAAW,aAAc,SAAQ,gBAAgB,CAAC,mBAAmB,CAAC;CAE3E;AAED,qBAAa,OAAQ,YAAW,SAAS,EAAE,gBAAgB;IACzD,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAQ;IAC5B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAmB;IAC9C,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAa;IAClC,OAAO,CAAC,OAAO,CAAS;IACjB,iBAAiB,EAAE,aAAa,CAAA;IACvC,OAAO,CAAC,kBAAkB,CAAC,CAAiB;IAC5C,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAAmB;IAC3D,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAe;IAC7C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAkB;IAC9C,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAS;gBAE/B,UAAU,EAAE,iBAAiB,EAAE,IAAI,EAAE,WAAW;IA6C7D,QAAQ,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,sBAAqB;IAElD,QAAQ,CAAC,CAAC,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAEvC;IAED,IAAI,CAAC,mBAAmB,CAAC,IAAK,MAAM,EAAE,CAQrC;IAED,SAAS,IAAK,OAAO;IAIf,KAAK,IAAK,OAAO,CAAC,IAAI,CAAC;IAa7B;;OAEG;IACG,IAAI,IAAK,OAAO,CAAC,IAAI,CAAC;IAQ5B,mBAAmB,CAAE,KAAK,EAAE,WAAW,CAAC,OAAO,CAAC,GAAG,IAAI;IAejD,cAAc,IAAK,OAAO,CAAC,IAAI,CAAC;CAWvC"}
|
package/dist/src/upnp-nat.js
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
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 {
|
|
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
|
export class UPnPNAT {
|
|
7
8
|
log;
|
|
@@ -36,16 +37,24 @@ export class UPnPNAT {
|
|
|
36
37
|
this.log.error('error mapping IP addresses - %e', err);
|
|
37
38
|
}
|
|
38
39
|
}, 5_000);
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
40
|
+
if (init.gateways != null) {
|
|
41
|
+
this.gatewayFinder = new StaticGatewayFinder(components, {
|
|
42
|
+
portMappingClient: this.portMappingClient,
|
|
43
|
+
gateways: init.gateways
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
// trigger update when we discovery gateways on the network
|
|
48
|
+
this.gatewayFinder = new SearchGatewayFinder(components, {
|
|
49
|
+
portMappingClient: this.portMappingClient,
|
|
50
|
+
initialSearchInterval: init.initialGatewaySearchInterval,
|
|
51
|
+
initialSearchTimeout: init.initialGatewaySearchTimeout,
|
|
52
|
+
initialSearchMessageInterval: init.initialGatewaySearchMessageInterval,
|
|
53
|
+
searchInterval: init.gatewaySearchInterval,
|
|
54
|
+
searchTimeout: init.gatewaySearchTimeout,
|
|
55
|
+
searchMessageInterval: init.gatewaySearchMessageInterval
|
|
56
|
+
});
|
|
57
|
+
}
|
|
49
58
|
this.onGatewayDiscovered = this.onGatewayDiscovered.bind(this);
|
|
50
59
|
}
|
|
51
60
|
[Symbol.toStringTag] = '@libp2p/upnp-nat';
|
package/dist/src/upnp-nat.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"upnp-nat.js","sourceRoot":"","sources":["../../src/upnp-nat.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,8BAA8B,CAAA;AACtD,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,eAAe,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAA;AAC1G,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAA;AACjD,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"upnp-nat.js","sourceRoot":"","sources":["../../src/upnp-nat.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,6 +3,7 @@ import type { ComponentLogger } from '@libp2p/interface';
|
|
|
3
3
|
import type { AddressManager } from '@libp2p/interface-internal';
|
|
4
4
|
export interface UPnPPortMapperInit {
|
|
5
5
|
gateway: Gateway;
|
|
6
|
+
externalAddress?: string;
|
|
6
7
|
externalAddressCheckInterval?: number;
|
|
7
8
|
externalAddressCheckTimeout?: number;
|
|
8
9
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"upnp-port-mapper.d.ts","sourceRoot":"","sources":["../../src/upnp-port-mapper.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,8BAA8B,CAAA;AAC3D,OAAO,KAAK,EAAE,eAAe,EAAU,MAAM,mBAAmB,CAAA;AAChE,OAAO,KAAK,EAAE,cAAc,EAAe,MAAM,4BAA4B,CAAA;AAK7E,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,OAAO,CAAA;IAChB,4BAA4B,CAAC,EAAE,MAAM,CAAA;IACrC,2BAA2B,CAAC,EAAE,MAAM,CAAA;CACrC;AAED,MAAM,WAAW,wBAAwB;IACvC,MAAM,EAAE,eAAe,CAAA;IACvB,cAAc,EAAE,cAAc,CAAA;CAC/B;AAOD,MAAM,WAAW,eAAe;IAC9B,kBAAkB,CAAC,EAAE,OAAO,CAAA;CAC7B;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAiB;IACjD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAgB;IAC/C,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAQ;IAC5B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA0B;IACtD,OAAO,CAAC,OAAO,CAAS;gBAEX,UAAU,EAAE,wBAAwB,EAAE,IAAI,EAAE,kBAAkB;
|
|
1
|
+
{"version":3,"file":"upnp-port-mapper.d.ts","sourceRoot":"","sources":["../../src/upnp-port-mapper.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,8BAA8B,CAAA;AAC3D,OAAO,KAAK,EAAE,eAAe,EAAU,MAAM,mBAAmB,CAAA;AAChE,OAAO,KAAK,EAAE,cAAc,EAAe,MAAM,4BAA4B,CAAA;AAK7E,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,OAAO,CAAA;IAChB,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,4BAA4B,CAAC,EAAE,MAAM,CAAA;IACrC,2BAA2B,CAAC,EAAE,MAAM,CAAA;CACrC;AAED,MAAM,WAAW,wBAAwB;IACvC,MAAM,EAAE,eAAe,CAAA;IACvB,cAAc,EAAE,cAAc,CAAA;CAC/B;AAOD,MAAM,WAAW,eAAe;IAC9B,kBAAkB,CAAC,EAAE,OAAO,CAAA;CAC7B;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAiB;IACjD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAgB;IAC/C,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAQ;IAC5B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA0B;IACtD,OAAO,CAAC,OAAO,CAAS;gBAEX,UAAU,EAAE,wBAAwB,EAAE,IAAI,EAAE,kBAAkB;IAuBrE,KAAK,IAAK,OAAO,CAAC,IAAI,CAAC;IASvB,IAAI,IAAK,OAAO,CAAC,IAAI,CAAC;IAe5B;;;OAGG;IACH,OAAO,CAAC,UAAU;IAalB;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAiDtB,cAAc,CAAE,OAAO,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IA8D/D;;OAEG;IACH,OAAO,CAAC,wBAAwB;IAYhC,OAAO,CAAC,WAAW;CAOpB"}
|
|
@@ -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
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
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":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AACzC,OAAO,EAAE,sBAAsB,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAA;AACvE,OAAO,EAAE,WAAW,EAAE,MAAM,uCAAuC,CAAA;AACnE,OAAO,EAAE,UAAU,EAAE,MAAM,qCAAqC,CAAA;AAChE,OAAO,EAAE,SAAS,EAAE,MAAM,oCAAoC,CAAA;AAC9D,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAA;AACtD,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAA;AACnD,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,UAAU,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAA;AACzG,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAA;
|
|
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.5-
|
|
3
|
+
"version": "3.0.5-bf0f74d66",
|
|
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.1-
|
|
56
|
-
"@libp2p/interface-internal": "2.2.3-
|
|
57
|
-
"@libp2p/utils": "6.4.0-
|
|
55
|
+
"@libp2p/interface": "2.4.1-bf0f74d66",
|
|
56
|
+
"@libp2p/interface-internal": "2.2.3-bf0f74d66",
|
|
57
|
+
"@libp2p/utils": "6.4.0-bf0f74d66",
|
|
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.10-
|
|
65
|
-
"@libp2p/logger": "5.1.7-
|
|
66
|
-
"@libp2p/peer-id": "5.0.11-
|
|
64
|
+
"@libp2p/crypto": "5.0.10-bf0f74d66",
|
|
65
|
+
"@libp2p/logger": "5.1.7-bf0f74d66",
|
|
66
|
+
"@libp2p/peer-id": "5.0.11-bf0f74d66",
|
|
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/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.
|
|
@@ -110,6 +158,23 @@ export interface UPnPNATInit {
|
|
|
110
158
|
*/
|
|
111
159
|
autoConfirmAddress?: boolean
|
|
112
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
|
+
|
|
113
178
|
/**
|
|
114
179
|
* How often to search for network gateways in ms.
|
|
115
180
|
*
|
|
@@ -1,15 +1,16 @@
|
|
|
1
1
|
import { TypedEventEmitter, start, stop } from '@libp2p/interface'
|
|
2
2
|
import { repeatingTask } from '@libp2p/utils/repeating-task'
|
|
3
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'
|
|
4
5
|
import type { Gateway, UPnPNAT } from '@achingbrain/nat-port-mapper'
|
|
5
6
|
import type { ComponentLogger, Logger } from '@libp2p/interface'
|
|
6
7
|
import type { RepeatingTask } from '@libp2p/utils/repeating-task'
|
|
7
8
|
|
|
8
|
-
export interface
|
|
9
|
+
export interface SearchGatewayFinderComponents {
|
|
9
10
|
logger: ComponentLogger
|
|
10
11
|
}
|
|
11
12
|
|
|
12
|
-
export interface
|
|
13
|
+
export interface SearchGatewayFinderInit {
|
|
13
14
|
portMappingClient: UPnPNAT
|
|
14
15
|
initialSearchInterval?: number
|
|
15
16
|
initialSearchTimeout?: number
|
|
@@ -19,18 +20,14 @@ export interface GatewayFinderInit {
|
|
|
19
20
|
searchMessageInterval?: number
|
|
20
21
|
}
|
|
21
22
|
|
|
22
|
-
export
|
|
23
|
-
'gateway': CustomEvent<Gateway>
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
export class GatewayFinder extends TypedEventEmitter<GatewayFinderEvents> {
|
|
23
|
+
export class SearchGatewayFinder extends TypedEventEmitter<GatewayFinderEvents> implements GatewayFinder {
|
|
27
24
|
private readonly log: Logger
|
|
28
25
|
private readonly gateways: Gateway[]
|
|
29
26
|
private readonly findGateways: RepeatingTask
|
|
30
27
|
private readonly portMappingClient: UPnPNAT
|
|
31
28
|
private started: boolean
|
|
32
29
|
|
|
33
|
-
constructor (components:
|
|
30
|
+
constructor (components: SearchGatewayFinderComponents, init: SearchGatewayFinderInit) {
|
|
34
31
|
super()
|
|
35
32
|
|
|
36
33
|
this.log = components.logger.forComponent('libp2p:upnp-nat')
|
|
@@ -90,9 +87,6 @@ export class GatewayFinder extends TypedEventEmitter<GatewayFinderEvents> {
|
|
|
90
87
|
await start(this.findGateways)
|
|
91
88
|
}
|
|
92
89
|
|
|
93
|
-
/**
|
|
94
|
-
* Stops the NAT manager
|
|
95
|
-
*/
|
|
96
90
|
async stop (): Promise<void> {
|
|
97
91
|
await stop(this.findGateways)
|
|
98
92
|
this.started = false
|
|
@@ -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 {
|
|
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,16 +53,23 @@ export class UPnPNAT implements Startable, UPnPNATInterface {
|
|
|
44
53
|
}
|
|
45
54
|
}, 5_000)
|
|
46
55
|
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
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
|
+
}
|
|
57
73
|
|
|
58
74
|
this.onGatewayDiscovered = this.onGatewayDiscovered.bind(this)
|
|
59
75
|
}
|
package/src/upnp-port-mapper.ts
CHANGED
|
@@ -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
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
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 +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;IAC1B,qBAAqB,CAAC,EAAE,MAAM,CAAA;IAC9B,oBAAoB,CAAC,EAAE,MAAM,CAAA;IAC7B,4BAA4B,CAAC,EAAE,MAAM,CAAA;IACrC,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,qBAAqB,CAAC,EAAE,MAAM,CAAA;CAC/B;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;IAmDnE,KAAK,IAAK,OAAO,CAAC,IAAI,CAAC;IAS7B;;OAEG;IACG,IAAI,IAAK,OAAO,CAAC,IAAI,CAAC;CAI7B"}
|
|
@@ -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,uCAAuC,EAAE,8BAA8B,EAAE,uCAAuC,EAAE,+CAA+C,EAAE,sCAAsC,EAAE,MAAM,gBAAgB,CAAA;AAuB3Q,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,CAAC;gBACH,MAAM,qBAAqB,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC;oBACpD,CAAC,CAAC,IAAI,CAAC,qBAAqB,IAAI,uCAAuC;oBACvE,CAAC,CAAC,IAAI,CAAC,4BAA4B,IAAI,+CAA+C,CAAA;gBAExF,IAAI,CAAC,GAAG,CAAC,mDAAmD,EAAE,qBAAqB,CAAC,CAAA;gBAEpF,IAAI,KAAK,EAAE,MAAM,OAAO,IAAI,IAAI,CAAC,iBAAiB,CAAC,YAAY,CAAC;oBAC9D,GAAG,OAAO;oBACV,cAAc,EAAE,qBAAqB;iBACtC,CAAC,EAAE,CAAC;oBACH,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE;wBACzB,OAAO,CAAC,CAAC,EAAE,KAAK,OAAO,CAAC,EAAE,IAAI,CAAC,CAAC,MAAM,KAAK,OAAO,CAAC,MAAM,CAAA;oBAC3D,CAAC,CAAC,EAAE,CAAC;wBACH,4BAA4B;wBAC5B,SAAQ;oBACV,CAAC;oBAED,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;oBAC3B,IAAI,CAAC,iBAAiB,CAAC,SAAS,EAAE;wBAChC,MAAM,EAAE,OAAO;qBAChB,CAAC,CAAA;oBAEF,gEAAgE;oBAChE,MAAM,cAAc,GAAG,IAAI,CAAC,aAAa,IAAI,+BAA+B,CAAA;oBAC5E,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,IAAI,8BAA8B,CAAA;oBAC1E,IAAI,CAAC,GAAG,CAAC,+DAA+D,EAAE,cAAc,EAAE,aAAa,CAAC,CAAA;oBACxG,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,cAAc,CAAC,CAAA;oBAC7C,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,aAAa,CAAC,CAAA;gBAC7C,CAAC;gBAED,IAAI,CAAC,GAAG,CAAC,4CAA4C,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAA;YAC9E,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,6BAA6B,EAAE,GAAG,CAAC,CAAA;YACpD,CAAC;QACH,CAAC,EAAE,IAAI,CAAC,qBAAqB,IAAI,uCAAuC,EAAE;YACxE,cAAc,EAAE,IAAI;YACpB,OAAO,EAAE,IAAI,CAAC,oBAAoB,IAAI,sCAAsC;SAC7E,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"}
|