@libp2p/upnp-nat 2.0.12-92cc74082 → 2.0.12-9614de7c6
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.
|
@@ -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,
|
|
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;IAkBrE,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"}
|
|
@@ -8,6 +8,7 @@ import { multiaddr } from '@multiformats/multiaddr';
|
|
|
8
8
|
import { QUICV1, TCP, WebSockets, WebSocketsSecure, WebTransport } from '@multiformats/multiaddr-matcher';
|
|
9
9
|
import { dynamicExternalAddress } from './check-external-address.js';
|
|
10
10
|
import { DoubleNATError } from './errors.js';
|
|
11
|
+
const MAX_DATE = 8_640_000_000_000_000;
|
|
11
12
|
export class UPnPPortMapper {
|
|
12
13
|
gateway;
|
|
13
14
|
externalAddress;
|
|
@@ -68,7 +69,11 @@ export class UPnPPortMapper {
|
|
|
68
69
|
*/
|
|
69
70
|
getUnmappedAddresses(multiaddrs, publicAddresses) {
|
|
70
71
|
const output = [];
|
|
71
|
-
for (const ma of multiaddrs) {
|
|
72
|
+
for (const { multiaddr: ma, type } of multiaddrs) {
|
|
73
|
+
// only consider transport addresses, ignore mapped/observed addrs
|
|
74
|
+
if (type !== 'transport') {
|
|
75
|
+
continue;
|
|
76
|
+
}
|
|
72
77
|
const stringTuples = ma.stringTuples();
|
|
73
78
|
const address = `${stringTuples[0][1]}`;
|
|
74
79
|
// ignore public IPv4 addresses
|
|
@@ -88,11 +93,7 @@ export class UPnPPortMapper {
|
|
|
88
93
|
continue;
|
|
89
94
|
}
|
|
90
95
|
// only IP based addresses
|
|
91
|
-
if (!
|
|
92
|
-
WebSockets.exactMatch(ma) ||
|
|
93
|
-
WebSocketsSecure.exactMatch(ma) ||
|
|
94
|
-
QUICV1.exactMatch(ma) ||
|
|
95
|
-
WebTransport.exactMatch(ma))) {
|
|
96
|
+
if (!this.isIPAddress(ma)) {
|
|
96
97
|
continue;
|
|
97
98
|
}
|
|
98
99
|
const { port, transport } = ma.toOptions();
|
|
@@ -108,7 +109,7 @@ export class UPnPPortMapper {
|
|
|
108
109
|
const externalHost = await this.externalAddress.getPublicIp();
|
|
109
110
|
// filter addresses to get private, non-relay, IP based addresses that we
|
|
110
111
|
// haven't mapped yet
|
|
111
|
-
const addresses = this.getUnmappedAddresses(this.addressManager.
|
|
112
|
+
const addresses = this.getUnmappedAddresses(this.addressManager.getAddressesWithMetadata(), [externalHost]);
|
|
112
113
|
if (addresses.length === 0) {
|
|
113
114
|
this.log('no private, non-relay, unmapped, IP based addresses found');
|
|
114
115
|
return;
|
|
@@ -141,7 +142,9 @@ export class UPnPPortMapper {
|
|
|
141
142
|
if (options?.autoConfirmAddress === true) {
|
|
142
143
|
const ma = multiaddr(`/ip${family}/${host}/${transport}/${port}`);
|
|
143
144
|
this.log('auto-confirming IP address %a', ma);
|
|
144
|
-
this.addressManager.confirmObservedAddr(ma
|
|
145
|
+
this.addressManager.confirmObservedAddr(ma, {
|
|
146
|
+
ttl: MAX_DATE - Date.now()
|
|
147
|
+
});
|
|
145
148
|
}
|
|
146
149
|
}
|
|
147
150
|
catch (err) {
|
|
@@ -165,5 +168,12 @@ export class UPnPPortMapper {
|
|
|
165
168
|
throw new InvalidParametersError(`${publicIp} is not an IP address`);
|
|
166
169
|
}
|
|
167
170
|
}
|
|
171
|
+
isIPAddress(ma) {
|
|
172
|
+
return TCP.exactMatch(ma) ||
|
|
173
|
+
WebSockets.exactMatch(ma) ||
|
|
174
|
+
WebSocketsSecure.exactMatch(ma) ||
|
|
175
|
+
QUICV1.exactMatch(ma) ||
|
|
176
|
+
WebTransport.exactMatch(ma);
|
|
177
|
+
}
|
|
168
178
|
}
|
|
169
179
|
//# sourceMappingURL=upnp-port-mapper.js.map
|
|
@@ -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;AACpE,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,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": "2.0.12-
|
|
3
|
+
"version": "2.0.12-9614de7c6",
|
|
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.2.1-
|
|
56
|
-
"@libp2p/interface-internal": "2.1.1-
|
|
57
|
-
"@libp2p/utils": "6.2.1-
|
|
55
|
+
"@libp2p/interface": "2.2.1-9614de7c6",
|
|
56
|
+
"@libp2p/interface-internal": "2.1.1-9614de7c6",
|
|
57
|
+
"@libp2p/utils": "6.2.1-9614de7c6",
|
|
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.7-
|
|
65
|
-
"@libp2p/logger": "5.1.4-
|
|
66
|
-
"@libp2p/peer-id": "5.0.8-
|
|
64
|
+
"@libp2p/crypto": "5.0.7-9614de7c6",
|
|
65
|
+
"@libp2p/logger": "5.1.4-9614de7c6",
|
|
66
|
+
"@libp2p/peer-id": "5.0.8-9614de7c6",
|
|
67
67
|
"aegir": "^45.0.5",
|
|
68
68
|
"sinon-ts": "^2.0.0"
|
|
69
69
|
},
|
package/src/upnp-port-mapper.ts
CHANGED
|
@@ -11,9 +11,11 @@ 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'
|
|
13
13
|
import type { ComponentLogger, Logger } from '@libp2p/interface'
|
|
14
|
-
import type { AddressManager } from '@libp2p/interface-internal'
|
|
14
|
+
import type { AddressManager, NodeAddress } from '@libp2p/interface-internal'
|
|
15
15
|
import type { Multiaddr } from '@multiformats/multiaddr'
|
|
16
16
|
|
|
17
|
+
const MAX_DATE = 8_640_000_000_000_000
|
|
18
|
+
|
|
17
19
|
export interface UPnPPortMapperInit {
|
|
18
20
|
gateway: Gateway
|
|
19
21
|
externalAddressCheckInterval?: number
|
|
@@ -104,10 +106,15 @@ export class UPnPPortMapper {
|
|
|
104
106
|
/**
|
|
105
107
|
* Return any eligible multiaddrs that are not mapped on the detected gateway
|
|
106
108
|
*/
|
|
107
|
-
private getUnmappedAddresses (multiaddrs:
|
|
109
|
+
private getUnmappedAddresses (multiaddrs: NodeAddress[], publicAddresses: string[]): Multiaddr[] {
|
|
108
110
|
const output: Multiaddr[] = []
|
|
109
111
|
|
|
110
|
-
for (const ma of multiaddrs) {
|
|
112
|
+
for (const { multiaddr: ma, type } of multiaddrs) {
|
|
113
|
+
// only consider transport addresses, ignore mapped/observed addrs
|
|
114
|
+
if (type !== 'transport') {
|
|
115
|
+
continue
|
|
116
|
+
}
|
|
117
|
+
|
|
111
118
|
const stringTuples = ma.stringTuples()
|
|
112
119
|
const address = `${stringTuples[0][1]}`
|
|
113
120
|
|
|
@@ -132,13 +139,7 @@ export class UPnPPortMapper {
|
|
|
132
139
|
}
|
|
133
140
|
|
|
134
141
|
// only IP based addresses
|
|
135
|
-
if (!(
|
|
136
|
-
TCP.exactMatch(ma) ||
|
|
137
|
-
WebSockets.exactMatch(ma) ||
|
|
138
|
-
WebSocketsSecure.exactMatch(ma) ||
|
|
139
|
-
QUICV1.exactMatch(ma) ||
|
|
140
|
-
WebTransport.exactMatch(ma)
|
|
141
|
-
)) {
|
|
142
|
+
if (!this.isIPAddress(ma)) {
|
|
142
143
|
continue
|
|
143
144
|
}
|
|
144
145
|
|
|
@@ -160,7 +161,7 @@ export class UPnPPortMapper {
|
|
|
160
161
|
|
|
161
162
|
// filter addresses to get private, non-relay, IP based addresses that we
|
|
162
163
|
// haven't mapped yet
|
|
163
|
-
const addresses = this.getUnmappedAddresses(this.addressManager.
|
|
164
|
+
const addresses = this.getUnmappedAddresses(this.addressManager.getAddressesWithMetadata(), [externalHost])
|
|
164
165
|
|
|
165
166
|
if (addresses.length === 0) {
|
|
166
167
|
this.log('no private, non-relay, unmapped, IP based addresses found')
|
|
@@ -203,7 +204,9 @@ export class UPnPPortMapper {
|
|
|
203
204
|
if (options?.autoConfirmAddress === true) {
|
|
204
205
|
const ma = multiaddr(`/ip${family}/${host}/${transport}/${port}`)
|
|
205
206
|
this.log('auto-confirming IP address %a', ma)
|
|
206
|
-
this.addressManager.confirmObservedAddr(ma
|
|
207
|
+
this.addressManager.confirmObservedAddr(ma, {
|
|
208
|
+
ttl: MAX_DATE - Date.now()
|
|
209
|
+
})
|
|
207
210
|
}
|
|
208
211
|
} catch (err) {
|
|
209
212
|
this.log.error('failed to create mapping for %s:%d for protocol - %e', host, port, transport, err)
|
|
@@ -228,4 +231,12 @@ export class UPnPPortMapper {
|
|
|
228
231
|
throw new InvalidParametersError(`${publicIp} is not an IP address`)
|
|
229
232
|
}
|
|
230
233
|
}
|
|
234
|
+
|
|
235
|
+
private isIPAddress (ma: Multiaddr): boolean {
|
|
236
|
+
return TCP.exactMatch(ma) ||
|
|
237
|
+
WebSockets.exactMatch(ma) ||
|
|
238
|
+
WebSocketsSecure.exactMatch(ma) ||
|
|
239
|
+
QUICV1.exactMatch(ma) ||
|
|
240
|
+
WebTransport.exactMatch(ma)
|
|
241
|
+
}
|
|
231
242
|
}
|