@libp2p/upnp-nat 2.0.11 → 2.0.12-06f79b646

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,19 +1,19 @@
1
- import type { NatAPI } from '@achingbrain/nat-port-mapper';
1
+ import type { Gateway } from '@achingbrain/nat-port-mapper';
2
2
  import type { AbortOptions, ComponentLogger } from '@libp2p/interface';
3
3
  import type { AddressManager } from '@libp2p/interface-internal';
4
4
  export interface ExternalAddressCheckerComponents {
5
- client: NatAPI;
5
+ gateway: Gateway;
6
6
  addressManager: AddressManager;
7
7
  logger: ComponentLogger;
8
8
  }
9
9
  export interface ExternalAddressCheckerInit {
10
10
  interval?: number;
11
11
  timeout?: number;
12
- autoConfirmAddress?: boolean;
12
+ onExternalAddressChange?(newExternalAddress: string): void;
13
13
  }
14
14
  export interface ExternalAddress {
15
15
  getPublicIp(options?: AbortOptions): Promise<string> | string;
16
16
  }
17
- export declare function dynamicExternalAddress(components: ExternalAddressCheckerComponents, init?: ExternalAddressCheckerInit): ExternalAddress;
17
+ export declare function dynamicExternalAddress(components: ExternalAddressCheckerComponents, init: ExternalAddressCheckerInit): ExternalAddress;
18
18
  export declare function staticExternalAddress(address: string): ExternalAddress;
19
19
  //# sourceMappingURL=check-external-address.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"check-external-address.d.ts","sourceRoot":"","sources":["../../src/check-external-address.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,8BAA8B,CAAA;AAC1D,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,MAAM,EAAE,MAAM,CAAA;IACd,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,kBAAkB,CAAC,EAAE,OAAO,CAAA;CAC7B;AAED,MAAM,WAAW,eAAe;IAC9B,WAAW,CAAE,OAAO,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,MAAM,CAAA;CAC/D;AAyGD,wBAAgB,sBAAsB,CAAE,UAAU,EAAE,gCAAgC,EAAE,IAAI,GAAE,0BAA+B,GAAG,eAAe,CAE5I;AAED,wBAAgB,qBAAqB,CAAE,OAAO,EAAE,MAAM,GAAG,eAAe,CAIvE"}
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;AAsFD,wBAAgB,sBAAsB,CAAE,UAAU,EAAE,gCAAgC,EAAE,IAAI,EAAE,0BAA0B,GAAG,eAAe,CAEvI;AAED,wBAAgB,qBAAqB,CAAE,OAAO,EAAE,MAAM,GAAG,eAAe,CAIvE"}
@@ -1,6 +1,5 @@
1
1
  import { NotStartedError, start, stop } from '@libp2p/interface';
2
2
  import { repeatingTask } from '@libp2p/utils/repeating-task';
3
- import { multiaddr } from '@multiformats/multiaddr';
4
3
  import pDefer from 'p-defer';
5
4
  import { raceSignal } from 'race-signal';
6
5
  /**
@@ -8,18 +7,18 @@ import { raceSignal } from 'race-signal';
8
7
  */
9
8
  class ExternalAddressChecker {
10
9
  log;
11
- client;
10
+ gateway;
12
11
  addressManager;
13
12
  started;
14
13
  lastPublicIp;
15
14
  lastPublicIpPromise;
16
15
  check;
17
- autoConfirmAddress;
18
- constructor(components, init = {}) {
16
+ onExternalAddressChange;
17
+ constructor(components, init) {
19
18
  this.log = components.logger.forComponent('libp2p:upnp-nat:external-address-check');
20
- this.client = components.client;
19
+ this.gateway = components.gateway;
21
20
  this.addressManager = components.addressManager;
22
- this.autoConfirmAddress = init.autoConfirmAddress ?? false;
21
+ this.onExternalAddressChange = init.onExternalAddressChange;
23
22
  this.started = false;
24
23
  this.checkExternalAddress = this.checkExternalAddress.bind(this);
25
24
  this.lastPublicIpPromise = pDefer();
@@ -33,7 +32,6 @@ class ExternalAddressChecker {
33
32
  return;
34
33
  }
35
34
  await start(this.check);
36
- this.check.start();
37
35
  this.started = true;
38
36
  }
39
37
  async stop() {
@@ -53,32 +51,18 @@ class ExternalAddressChecker {
53
51
  }
54
52
  async checkExternalAddress(options) {
55
53
  try {
56
- const externalAddress = await this.client.externalIp(options);
54
+ const externalAddress = await this.gateway.externalIp(options);
57
55
  // check if our public address has changed
58
56
  if (this.lastPublicIp != null && externalAddress !== this.lastPublicIp) {
59
57
  this.log('external address changed from %s to %s', this.lastPublicIp, externalAddress);
60
- for (const ma of this.addressManager.getAddresses()) {
61
- const addrString = ma.toString();
62
- if (!addrString.includes(this.lastPublicIp)) {
63
- continue;
64
- }
65
- // create a new version of the multiaddr with the new public IP
66
- const newAddress = multiaddr(addrString.replace(this.lastPublicIp, externalAddress));
67
- // remove the old address and add the new one
68
- this.addressManager.removeObservedAddr(ma);
69
- this.addressManager.confirmObservedAddr(newAddress);
70
- if (this.autoConfirmAddress) {
71
- this.addressManager.confirmObservedAddr(newAddress);
72
- }
73
- else {
74
- this.addressManager.addObservedAddr(newAddress);
75
- }
76
- }
58
+ // notify listeners that the address has changed
59
+ this.onExternalAddressChange?.(externalAddress);
77
60
  }
78
61
  this.lastPublicIp = externalAddress;
79
62
  this.lastPublicIpPromise.resolve(externalAddress);
80
63
  }
81
64
  catch (err) {
65
+ this.log.error('could not resolve external address - %e', err);
82
66
  if (this.lastPublicIp != null) {
83
67
  // ignore the error if we've previously run successfully
84
68
  return;
@@ -87,7 +71,7 @@ class ExternalAddressChecker {
87
71
  }
88
72
  }
89
73
  }
90
- export function dynamicExternalAddress(components, init = {}) {
74
+ export function dynamicExternalAddress(components, init) {
91
75
  return new ExternalAddressChecker(components, init);
92
76
  }
93
77
  export function staticExternalAddress(address) {
@@ -1 +1 @@
1
- {"version":3,"file":"check-external-address.js","sourceRoot":"","sources":["../../src/check-external-address.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"check-external-address.js","sourceRoot":"","sources":["../../src/check-external-address.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export declare const DEFAULT_GATEWAY_SEARCH_TIMEOUT = 60000;
2
+ export declare const DEFAULT_GATEWAY_SEARCH_INTERVAL = 300000;
3
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,8BAA8B,QAAS,CAAA;AACpD,eAAO,MAAM,+BAA+B,SAAU,CAAA"}
@@ -0,0 +1,3 @@
1
+ export const DEFAULT_GATEWAY_SEARCH_TIMEOUT = 60_000;
2
+ export const DEFAULT_GATEWAY_SEARCH_INTERVAL = 300_000;
3
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/constants.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,8BAA8B,GAAG,MAAM,CAAA;AACpD,MAAM,CAAC,MAAM,+BAA+B,GAAG,OAAO,CAAA"}
@@ -0,0 +1,26 @@
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
@@ -0,0 +1 @@
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"}
@@ -0,0 +1,53 @@
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
@@ -0,0 +1 @@
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"}
@@ -34,10 +34,10 @@
34
34
  * })
35
35
  * ```
36
36
  */
37
- import { type NatAPI, type MapPortOptions } from './upnp-nat.js';
37
+ import type { UPnPNAT as UPnPNATClient, MapPortOptions } from '@achingbrain/nat-port-mapper';
38
38
  import type { ComponentLogger, Libp2pEvents, NodeInfo, PeerId, TypedEventTarget } from '@libp2p/interface';
39
39
  import type { AddressManager } from '@libp2p/interface-internal';
40
- export type { NatAPI, MapPortOptions };
40
+ export type { UPnPNATClient, MapPortOptions };
41
41
  export interface PMPOptions {
42
42
  /**
43
43
  * Whether to enable PMP as well as UPnP
@@ -45,11 +45,6 @@ export interface PMPOptions {
45
45
  enabled?: boolean;
46
46
  }
47
47
  export interface UPnPNATInit {
48
- /**
49
- * Pass a string to hard code the external address, otherwise it will be
50
- * auto-detected
51
- */
52
- externalAddress?: string;
53
48
  /**
54
49
  * Check if the external address has changed this often in ms. Ignored if an
55
50
  * external address is specified.
@@ -64,58 +59,34 @@ export interface UPnPNATInit {
64
59
  * @default 10000
65
60
  */
66
61
  externalAddressCheckTimeout?: number;
67
- /**
68
- * Pass a value to use instead of auto-detection
69
- */
70
- localAddress?: string;
71
62
  /**
72
63
  * A string value to use for the port mapping description on the gateway
73
64
  */
74
- description?: string;
75
- /**
76
- * How long UPnP port mappings should last for in seconds (minimum 1200)
77
- */
78
- ttl?: number;
79
- /**
80
- * Whether to automatically refresh UPnP port mappings when their TTL is reached
81
- */
82
- keepAlive?: boolean;
65
+ portMappingDescription?: string;
83
66
  /**
84
- * Pass a value to use instead of auto-detection
67
+ * How long UPnP port mappings should last for in ms
68
+ *
69
+ * @default 720_000
85
70
  */
86
- gateway?: string;
71
+ portMappingTTL?: number;
87
72
  /**
88
- * How long in ms to wait before giving up trying to auto-detect a
89
- * `urn:schemas-upnp-org:device:InternetGatewayDevice:1` device on the local
90
- * network
73
+ * Whether to automatically refresh UPnP port mappings when their TTL is
74
+ * reached
91
75
  *
92
- * @default 10000
76
+ * @default true
93
77
  */
94
- gatewayDetectionTimeout?: number;
78
+ portMappingAutoRefresh?: boolean;
95
79
  /**
96
- * Ports are mapped when the `self:peer:update` event fires, which happens
97
- * when the node's addresses change. To avoid starting to map ports while
98
- * multiple addresses are being added, the mapping function is debounced by
99
- * this number of ms
80
+ * How long before a port mapping expires to refresh it in ms
100
81
  *
101
- * @default 5000
82
+ * @default 60_000
102
83
  */
103
- delay?: number;
84
+ portMappingRefreshThreshold?: number;
104
85
  /**
105
86
  * A preconfigured instance of a NatAPI client can be passed as an option,
106
87
  * otherwise one will be created
107
88
  */
108
- client?: NatAPI;
109
- /**
110
- * Any mapped addresses are added to the observed address list. These
111
- * addresses require additional verification by the `@libp2p/autonat` protocol
112
- * or similar before they are trusted.
113
- *
114
- * To skip this verification and trust them immediately pass `true` here
115
- *
116
- * @default false
117
- */
118
- autoConfirmAddress?: boolean;
89
+ portMappingClient?: UPnPNATClient;
119
90
  }
120
91
  export interface UPnPNATComponents {
121
92
  peerId: PeerId;
@@ -125,7 +96,7 @@ export interface UPnPNATComponents {
125
96
  events: TypedEventTarget<Libp2pEvents>;
126
97
  }
127
98
  export interface UPnPNAT {
128
- client: NatAPI;
99
+ portMappingClient: UPnPNATClient;
129
100
  }
130
101
  export declare function uPnPNAT(init?: UPnPNATInit): (components: UPnPNATComponents) => UPnPNAT;
131
102
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AAEH,OAAO,EAA2B,KAAK,MAAM,EAAE,KAAK,cAAc,EAAE,MAAM,eAAe,CAAA;AACzF,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,MAAM,EAAE,cAAc,EAAE,CAAA;AAEtC,MAAM,WAAW,UAAU;IACzB;;OAEG;IACH,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB;AAED,MAAM,WAAW,WAAW;IAC1B;;;OAGG;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,YAAY,CAAC,EAAE,MAAM,CAAA;IAErB;;OAEG;IACH,WAAW,CAAC,EAAE,MAAM,CAAA;IAEpB;;OAEG;IACH,GAAG,CAAC,EAAE,MAAM,CAAA;IAEZ;;OAEG;IACH,SAAS,CAAC,EAAE,OAAO,CAAA;IAEnB;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAA;IAEhB;;;;;;OAMG;IACH,uBAAuB,CAAC,EAAE,MAAM,CAAA;IAEhC;;;;;;;OAOG;IACH,KAAK,CAAC,EAAE,MAAM,CAAA;IAEd;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAA;IAEf;;;;;;;;OAQG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAA;CAC7B;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,MAAM,EAAE,MAAM,CAAA;CACf;AAED,wBAAgB,OAAO,CAAE,IAAI,GAAE,WAAgB,GAAG,CAAC,UAAU,EAAE,iBAAiB,KAAK,OAAO,CAI3F"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;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,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;CAClC;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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AAEH,OAAO,EAAE,OAAO,IAAI,YAAY,EAAoC,MAAM,eAAe,CAAA;AA8GzF,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
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AAEH,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,eAAe,CAAA;AA6EvD,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,40 +1,27 @@
1
- import { serviceCapabilities, serviceDependencies } from '@libp2p/interface';
1
+ import { serviceCapabilities } from '@libp2p/interface';
2
2
  import type { UPnPNATComponents, UPnPNATInit, UPnPNAT as UPnPNATInterface } from './index.js';
3
- import type { NatAPI, MapPortOptions } from '@achingbrain/nat-port-mapper';
3
+ import type { Gateway, UPnPNAT as UPnPNATClient } from '@achingbrain/nat-port-mapper';
4
4
  import type { Startable } from '@libp2p/interface';
5
- export type { NatAPI, MapPortOptions };
6
5
  export declare class UPnPNAT implements Startable, UPnPNATInterface {
7
- client: NatAPI;
8
- private readonly addressManager;
9
- private readonly events;
10
- private readonly externalAddress;
11
- private readonly localAddress?;
12
- private readonly description;
13
- private readonly ttl;
14
- private readonly keepAlive;
15
- private readonly gateway?;
16
- private started;
17
6
  private readonly log;
18
- private readonly gatewayDetectionTimeout;
19
- private readonly mappedPorts;
20
- private readonly onSelfPeerUpdate;
21
- private readonly autoConfirmAddress;
7
+ private readonly components;
8
+ private readonly init;
9
+ private started;
10
+ portMappingClient: UPnPNATClient;
11
+ private shutdownController?;
12
+ private readonly mapIpAddressesDebounced;
13
+ private readonly gatewayFinder;
14
+ private readonly portMappers;
22
15
  constructor(components: UPnPNATComponents, init: UPnPNATInit);
23
16
  readonly [Symbol.toStringTag] = "@libp2p/upnp-nat";
24
17
  readonly [serviceCapabilities]: string[];
25
- get [serviceDependencies](): string[];
26
18
  isStarted(): boolean;
27
19
  start(): Promise<void>;
28
20
  /**
29
21
  * Stops the NAT manager
30
22
  */
31
23
  stop(): Promise<void>;
32
- _onSelfPeerUpdate(): void;
33
- private getUnmappedAddresses;
24
+ onGatewayDiscovered(event: CustomEvent<Gateway>): void;
34
25
  mapIpAddresses(): Promise<void>;
35
- /**
36
- * Some ISPs have double-NATs, there's not much we can do with them
37
- */
38
- private assertNotBehindDoubleNAT;
39
26
  }
40
27
  //# sourceMappingURL=upnp-nat.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"upnp-nat.d.ts","sourceRoot":"","sources":["../../src/upnp-nat.ts"],"names":[],"mappings":"AAEA,OAAO,EAA0B,mBAAmB,EAAE,mBAAmB,EAAe,MAAM,mBAAmB,CAAA;AAWjH,OAAO,KAAK,EAAE,iBAAiB,EAAE,WAAW,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAC7F,OAAO,KAAK,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAA;AAC1E,OAAO,KAAK,EAAwB,SAAS,EAAoB,MAAM,mBAAmB,CAAA;AAO1F,YAAY,EAAE,MAAM,EAAE,cAAc,EAAE,CAAA;AAEtC,qBAAa,OAAQ,YAAW,SAAS,EAAE,gBAAgB;IAClD,MAAM,EAAE,MAAM,CAAA;IACrB,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAgB;IAC/C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgC;IACvD,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAiB;IACjD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAQ;IACtC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAQ;IACpC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAQ;IAC5B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAQ;IACjC,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAQ;IAC5B,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAAQ;IAChD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAqB;IACjD,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAmB;IACpD,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAS;gBAE/B,UAAU,EAAE,iBAAiB,EAAE,IAAI,EAAE,WAAW;IA0C7D,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;IAU7B;;OAEG;IACG,IAAI,IAAK,OAAO,CAAC,IAAI,CAAC;IAY5B,iBAAiB,IAAK,IAAI;IAO1B,OAAO,CAAC,oBAAoB;IAyCtB,cAAc,IAAK,OAAO,CAAC,IAAI,CAAC;IAyEtC;;OAEG;IACH,OAAO,CAAC,wBAAwB;CAWjC"}
1
+ {"version":3,"file":"upnp-nat.d.ts","sourceRoot":"","sources":["../../src/upnp-nat.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAgC,MAAM,mBAAmB,CAAA;AAIrF,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,MAAM,mBAAmB,CAAA;AAG1D,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;gBAEjC,UAAU,EAAE,iBAAiB,EAAE,IAAI,EAAE,WAAW;IA+B7D,QAAQ,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,sBAAqB;IAElD,QAAQ,CAAC,CAAC,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAEvC;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;CASvC"}