@libp2p/webrtc 5.1.1-8331c8ea8 → 5.1.1-ff951f1a0
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/dist/index.min.js +1 -1
- package/dist/src/private-to-private/listener.d.ts +0 -1
- package/dist/src/private-to-private/listener.d.ts.map +1 -1
- package/dist/src/private-to-private/listener.js +0 -2
- package/dist/src/private-to-private/listener.js.map +1 -1
- package/dist/src/private-to-public/listener.browser.d.ts +0 -1
- package/dist/src/private-to-public/listener.browser.d.ts.map +1 -1
- package/dist/src/private-to-public/listener.browser.js +0 -2
- package/dist/src/private-to-public/listener.browser.js.map +1 -1
- package/dist/src/private-to-public/listener.d.ts +0 -1
- package/dist/src/private-to-public/listener.d.ts.map +1 -1
- package/dist/src/private-to-public/listener.js +30 -71
- package/dist/src/private-to-public/listener.js.map +1 -1
- package/package.json +9 -9
- package/src/private-to-private/listener.ts +0 -4
- package/src/private-to-public/listener.browser.ts +0 -4
- package/src/private-to-public/listener.ts +33 -91
@@ -15,7 +15,6 @@ export declare class WebRTCPeerListener extends TypedEventEmitter<ListenerEvents
|
|
15
15
|
constructor(components: WebRTCPeerListenerComponents, init: WebRTCPeerListenerInit);
|
16
16
|
listen(): Promise<void>;
|
17
17
|
getAddrs(): Multiaddr[];
|
18
|
-
updateAnnounceAddrs(): void;
|
19
18
|
close(): Promise<void>;
|
20
19
|
}
|
21
20
|
//# sourceMappingURL=listener.d.ts.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"listener.d.ts","sourceRoot":"","sources":["../../../src/private-to-private/listener.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AAGrD,OAAO,KAAK,EAAE,MAAM,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AACzE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAA;AAClE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAA;AAIxD,MAAM,WAAW,4BAA4B;IAC3C,MAAM,EAAE,MAAM,CAAA;IACd,gBAAgB,EAAE,gBAAgB,CAAA;CACnC;AAED,MAAM,WAAW,sBAAsB;IACrC,kBAAkB,EAAE,eAAe,CAAA;CACpC;AAED,qBAAa,kBAAmB,SAAQ,iBAAiB,CAAC,cAAc,CAAE,YAAW,QAAQ;IAC3F,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAkB;IACnD,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAiB;gBAEvC,UAAU,EAAE,4BAA4B,EAAE,IAAI,EAAE,sBAAsB;IAO7E,MAAM,IAAK,OAAO,CAAC,IAAI,CAAC;IAM9B,QAAQ,IAAK,SAAS,EAAE;
|
1
|
+
{"version":3,"file":"listener.d.ts","sourceRoot":"","sources":["../../../src/private-to-private/listener.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AAGrD,OAAO,KAAK,EAAE,MAAM,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AACzE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAA;AAClE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAA;AAIxD,MAAM,WAAW,4BAA4B;IAC3C,MAAM,EAAE,MAAM,CAAA;IACd,gBAAgB,EAAE,gBAAgB,CAAA;CACnC;AAED,MAAM,WAAW,sBAAsB;IACrC,kBAAkB,EAAE,eAAe,CAAA;CACpC;AAED,qBAAa,kBAAmB,SAAQ,iBAAiB,CAAC,cAAc,CAAE,YAAW,QAAQ;IAC3F,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAkB;IACnD,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAiB;gBAEvC,UAAU,EAAE,4BAA4B,EAAE,IAAI,EAAE,sBAAsB;IAO7E,MAAM,IAAK,OAAO,CAAC,IAAI,CAAC;IAM9B,QAAQ,IAAK,SAAS,EAAE;IAalB,KAAK,IAAK,OAAO,CAAC,IAAI,CAAC;CAM9B"}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"listener.js","sourceRoot":"","sources":["../../../src/private-to-private/listener.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AACrD,OAAO,EAAE,GAAG,EAAE,MAAM,iCAAiC,CAAA;AACrD,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,uCAAuC,CAAA;AAKpE,MAAM,OAAO,GAAG,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC,CAAA;AAW5D,MAAM,OAAO,kBAAmB,SAAQ,iBAAiC;IACtD,gBAAgB,CAAkB;IAClC,kBAAkB,CAAiB;IAEpD,YAAa,UAAwC,EAAE,IAA4B;QACjF,KAAK,EAAE,CAAA;QAEP,IAAI,CAAC,gBAAgB,GAAG,UAAU,CAAC,gBAAgB,CAAA;QACnD,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,kBAAkB,CAAA;IACnD,CAAC;IAED,KAAK,CAAC,MAAM;QACV,cAAc,CAAC,GAAG,EAAE;YAClB,IAAI,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAA;QACrC,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,QAAQ;QACN,OAAO,IAAI,CAAC,gBAAgB;aACzB,YAAY,EAAE;aACd,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC;aACvB,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE;aACnB,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;aACpC,GAAG,CAAC,EAAE,CAAC,EAAE;YACR,OAAO,EAAE,CAAC,WAAW,CAAC,SAAS,CAAC,CAAA;QAClC,CAAC,CAAC,CACH;aACA,IAAI,EAAE,CAAA;IACX,CAAC;IAED,
|
1
|
+
{"version":3,"file":"listener.js","sourceRoot":"","sources":["../../../src/private-to-private/listener.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AACrD,OAAO,EAAE,GAAG,EAAE,MAAM,iCAAiC,CAAA;AACrD,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,uCAAuC,CAAA;AAKpE,MAAM,OAAO,GAAG,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC,CAAA;AAW5D,MAAM,OAAO,kBAAmB,SAAQ,iBAAiC;IACtD,gBAAgB,CAAkB;IAClC,kBAAkB,CAAiB;IAEpD,YAAa,UAAwC,EAAE,IAA4B;QACjF,KAAK,EAAE,CAAA;QAEP,IAAI,CAAC,gBAAgB,GAAG,UAAU,CAAC,gBAAgB,CAAA;QACnD,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,kBAAkB,CAAA;IACnD,CAAC;IAED,KAAK,CAAC,MAAM;QACV,cAAc,CAAC,GAAG,EAAE;YAClB,IAAI,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAA;QACrC,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,QAAQ;QACN,OAAO,IAAI,CAAC,gBAAgB;aACzB,YAAY,EAAE;aACd,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC;aACvB,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE;aACnB,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;aACpC,GAAG,CAAC,EAAE,CAAC,EAAE;YACR,OAAO,EAAE,CAAC,WAAW,CAAC,SAAS,CAAC,CAAA;QAClC,CAAC,CAAC,CACH;aACA,IAAI,EAAE,CAAA;IACX,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE,CAAA;QAC/B,cAAc,CAAC,GAAG,EAAE;YAClB,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAA;QACjC,CAAC,CAAC,CAAA;IACJ,CAAC;CACF"}
|
@@ -12,7 +12,6 @@ export interface WebRTCDirectListenerInit {
|
|
12
12
|
export declare class WebRTCDirectListener extends TypedEventEmitter<ListenerEvents> implements Listener {
|
13
13
|
listen(): Promise<void>;
|
14
14
|
getAddrs(): Multiaddr[];
|
15
|
-
updateAnnounceAddrs(): void;
|
16
15
|
close(): Promise<void>;
|
17
16
|
}
|
18
17
|
//# sourceMappingURL=listener.browser.d.ts.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"listener.browser.d.ts","sourceRoot":"","sources":["../../../src/private-to-public/listener.browser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AAErD,OAAO,KAAK,EAAE,MAAM,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AACzE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAA;AAClE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAA;AAExD,MAAM,WAAW,8BAA8B;IAC7C,MAAM,EAAE,MAAM,CAAA;IACd,gBAAgB,EAAE,gBAAgB,CAAA;CACnC;AAED,MAAM,WAAW,wBAAwB;IACvC,kBAAkB,EAAE,eAAe,CAAA;CACpC;AAED,qBAAa,oBAAqB,SAAQ,iBAAiB,CAAC,cAAc,CAAE,YAAW,QAAQ;IACvF,MAAM,IAAK,OAAO,CAAC,IAAI,CAAC;IAI9B,QAAQ,IAAK,SAAS,EAAE;
|
1
|
+
{"version":3,"file":"listener.browser.d.ts","sourceRoot":"","sources":["../../../src/private-to-public/listener.browser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AAErD,OAAO,KAAK,EAAE,MAAM,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AACzE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAA;AAClE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAA;AAExD,MAAM,WAAW,8BAA8B;IAC7C,MAAM,EAAE,MAAM,CAAA;IACd,gBAAgB,EAAE,gBAAgB,CAAA;CACnC;AAED,MAAM,WAAW,wBAAwB;IACvC,kBAAkB,EAAE,eAAe,CAAA;CACpC;AAED,qBAAa,oBAAqB,SAAQ,iBAAiB,CAAC,cAAc,CAAE,YAAW,QAAQ;IACvF,MAAM,IAAK,OAAO,CAAC,IAAI,CAAC;IAI9B,QAAQ,IAAK,SAAS,EAAE;IAIlB,KAAK,IAAK,OAAO,CAAC,IAAI,CAAC;CAG9B"}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"listener.browser.js","sourceRoot":"","sources":["../../../src/private-to-public/listener.browser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AACrD,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AAchD,MAAM,OAAO,oBAAqB,SAAQ,iBAAiC;IACzE,KAAK,CAAC,MAAM;QACV,MAAM,IAAI,kBAAkB,CAAC,gCAAgC,CAAC,CAAA;IAChE,CAAC;IAED,QAAQ;QACN,OAAO,EAAE,CAAA;IACX,CAAC;IAED,
|
1
|
+
{"version":3,"file":"listener.browser.js","sourceRoot":"","sources":["../../../src/private-to-public/listener.browser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AACrD,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AAchD,MAAM,OAAO,oBAAqB,SAAQ,iBAAiC;IACzE,KAAK,CAAC,MAAM;QACV,MAAM,IAAI,kBAAkB,CAAC,gCAAgC,CAAC,CAAA;IAChE,CAAC;IAED,QAAQ;QACN,OAAO,EAAE,CAAA;IACX,CAAC;IAED,KAAK,CAAC,KAAK;IAEX,CAAC;CACF"}
|
@@ -33,7 +33,6 @@ export declare class WebRTCDirectListener extends TypedEventEmitter<ListenerEven
|
|
33
33
|
private startUDPMuxServer;
|
34
34
|
private incomingConnection;
|
35
35
|
getAddrs(): Multiaddr[];
|
36
|
-
updateAnnounceAddrs(multiaddrs: Multiaddr[]): void;
|
37
36
|
close(): Promise<void>;
|
38
37
|
}
|
39
38
|
//# sourceMappingURL=listener.d.ts.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"listener.d.ts","sourceRoot":"","sources":["../../../src/private-to-public/listener.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AAUrD,OAAO,KAAK,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAA;AAG3E,OAAO,KAAK,EAAE,MAAM,EAAE,cAAc,EAAE,QAAQ,EAAE,QAAQ,EAAE,eAAe,EAAU,YAAY,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAC/I,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAA;
|
1
|
+
{"version":3,"file":"listener.d.ts","sourceRoot":"","sources":["../../../src/private-to-public/listener.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AAUrD,OAAO,KAAK,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAA;AAG3E,OAAO,KAAK,EAAE,MAAM,EAAE,cAAc,EAAE,QAAQ,EAAE,QAAQ,EAAE,eAAe,EAAU,YAAY,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAC/I,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAA;AASxD,MAAM,WAAW,8BAA8B;IAC7C,MAAM,EAAE,MAAM,CAAA;IACd,UAAU,EAAE,UAAU,CAAA;IACtB,MAAM,EAAE,eAAe,CAAA;IACvB,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB;AAED,MAAM,WAAW,wBAAwB;IACvC,QAAQ,EAAE,QAAQ,CAAA;IAClB,YAAY,CAAC,EAAE,oBAAoB,EAAE,CAAA;IACrC,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,WAAW,CAAC,EAAE,kBAAkB,CAAA;IAChC,gBAAgB,CAAC,EAAE,gBAAgB,GAAG,CAAC,MAAM,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAA;IAC1F,WAAW,CAAC,EAAE,OAAO,CAAA;CACtB;AAED,MAAM,WAAW,qBAAqB;IACpC,cAAc,EAAE,YAAY,CAAA;CAC7B;AAMD,qBAAa,oBAAqB,SAAQ,iBAAiB,CAAC,cAAc,CAAE,YAAW,QAAQ;IAC7F,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAqC;IAC7D,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAa;IACxC,OAAO,CAAC,WAAW,CAAC,CAAsB;IAC1C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAsC;IAClE,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAQ;IAC5B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAA0B;IAC/C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAgC;IAC3D,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAuB;gBAEnC,UAAU,EAAE,8BAA8B,EAAE,IAAI,EAAE,wBAAwB;IAqBjF,MAAM,CAAE,EAAE,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;YAuC7B,iBAAiB;YA2BjB,kBAAkB;IAgDhC,QAAQ,IAAK,SAAS,EAAE;IAIlB,KAAK,IAAK,OAAO,CAAC,IAAI,CAAC;CAqB9B"}
|
@@ -1,8 +1,8 @@
|
|
1
1
|
import { networkInterfaces } from 'node:os';
|
2
2
|
import { isIPv4, isIPv6 } from '@chainsafe/is-ip';
|
3
3
|
import { TypedEventEmitter } from '@libp2p/interface';
|
4
|
-
import { multiaddr, protocols
|
5
|
-
import { IP4
|
4
|
+
import { multiaddr, protocols } from '@multiformats/multiaddr';
|
5
|
+
import { IP4 } from '@multiformats/multiaddr-matcher';
|
6
6
|
import { Crypto } from '@peculiar/webcrypto';
|
7
7
|
import getPort from 'get-port';
|
8
8
|
import pWaitFor from 'p-wait-for';
|
@@ -15,8 +15,6 @@ const crypto = new Crypto();
|
|
15
15
|
* The time to wait, in milliseconds, for the data channel handshake to complete
|
16
16
|
*/
|
17
17
|
const HANDSHAKE_TIMEOUT_MS = 10_000;
|
18
|
-
const CODEC_WEBRTC_DIRECT = 0x0118;
|
19
|
-
const CODEC_CERTHASH = 0x01d2;
|
20
18
|
const UDP_PROTOCOL = protocols('udp');
|
21
19
|
const IP4_PROTOCOL = protocols('ip4');
|
22
20
|
const IP6_PROTOCOL = protocols('ip6');
|
@@ -34,7 +32,7 @@ export class WebRTCDirectListener extends TypedEventEmitter {
|
|
34
32
|
this.init = init;
|
35
33
|
this.components = components;
|
36
34
|
this.multiaddrs = [];
|
37
|
-
this.servers =
|
35
|
+
this.servers = {};
|
38
36
|
this.connections = new Map();
|
39
37
|
this.log = components.logger.forComponent('libp2p:webrtc-direct:listener');
|
40
38
|
this.certificate = init.certificates?.[0];
|
@@ -69,56 +67,38 @@ export class WebRTCDirectListener extends TypedEventEmitter {
|
|
69
67
|
// single mux listener. This is necessary because libjuice binds to all
|
70
68
|
// interfaces for a given port so we we need to key on just the port number
|
71
69
|
// not the host + the port number
|
72
|
-
|
73
|
-
|
74
|
-
// and there is already a wildcard port for this address family, start a new
|
75
|
-
// UDP mux server
|
76
|
-
const wildcardPorts = port === 0 && existingServer?.port === 0;
|
77
|
-
const sameAddressFamily = (existingServer?.isIPv4 === true && isIPv4(host)) || (existingServer?.isIPv6 === true && isIPv6(host));
|
78
|
-
if (existingServer == null || (wildcardPorts && sameAddressFamily)) {
|
79
|
-
existingServer = this.startUDPMuxServer(host, port);
|
80
|
-
this.servers.push(existingServer);
|
70
|
+
if (this.servers[port] == null) {
|
71
|
+
this.servers[port] = this.startUDPMuxServer(host, port);
|
81
72
|
}
|
82
|
-
const server = await
|
73
|
+
const server = await this.servers[port];
|
83
74
|
const address = server.address();
|
84
75
|
getNetworkAddresses(host, address.port, ipVersion).forEach((ma) => {
|
85
76
|
this.multiaddrs.push(multiaddr(`${ma}/webrtc-direct/certhash/${this.certificate?.certhash}`));
|
86
77
|
});
|
87
78
|
this.safeDispatchEvent('listening');
|
88
79
|
}
|
89
|
-
startUDPMuxServer(host, port) {
|
90
|
-
|
91
|
-
port
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
this.certificate = certificate;
|
112
|
-
}
|
113
|
-
}
|
114
|
-
return stunListener(host, port, this.log, (ufrag, remoteHost, remotePort) => {
|
115
|
-
this.incomingConnection(ufrag, remoteHost, remotePort)
|
116
|
-
.catch(err => {
|
117
|
-
this.log.error('error processing incoming STUN request', err);
|
118
|
-
});
|
119
|
-
});
|
120
|
-
})
|
121
|
-
};
|
80
|
+
async startUDPMuxServer(host, port) {
|
81
|
+
if (port === 0) {
|
82
|
+
// libjuice doesn't map 0 to a random free port so we have to do it
|
83
|
+
// ourselves
|
84
|
+
port = await getPort();
|
85
|
+
}
|
86
|
+
// ensure we have a certificate
|
87
|
+
if (this.certificate == null) {
|
88
|
+
const keyPair = await crypto.subtle.generateKey({
|
89
|
+
name: 'ECDSA',
|
90
|
+
namedCurve: 'P-256'
|
91
|
+
}, true, ['sign', 'verify']);
|
92
|
+
this.certificate = await generateTransportCertificate(keyPair, {
|
93
|
+
days: 365 * 10
|
94
|
+
});
|
95
|
+
}
|
96
|
+
return stunListener(host, port, this.log, (ufrag, remoteHost, remotePort) => {
|
97
|
+
this.incomingConnection(ufrag, remoteHost, remotePort)
|
98
|
+
.catch(err => {
|
99
|
+
this.log.error('error processing incoming STUN request', err);
|
100
|
+
});
|
101
|
+
});
|
122
102
|
}
|
123
103
|
async incomingConnection(ufrag, remoteHost, remotePort) {
|
124
104
|
const key = `${remoteHost}:${remotePort}:${ufrag}`;
|
@@ -165,34 +145,13 @@ export class WebRTCDirectListener extends TypedEventEmitter {
|
|
165
145
|
getAddrs() {
|
166
146
|
return this.multiaddrs;
|
167
147
|
}
|
168
|
-
updateAnnounceAddrs(multiaddrs) {
|
169
|
-
for (let i = 0; i < multiaddrs.length; i++) {
|
170
|
-
let ma = multiaddrs[i];
|
171
|
-
if (!WebRTCDirect.exactMatch(ma)) {
|
172
|
-
continue;
|
173
|
-
}
|
174
|
-
// add the certhash if it is missing
|
175
|
-
const tuples = ma.stringTuples();
|
176
|
-
for (let j = 0; j < tuples.length; j++) {
|
177
|
-
if (tuples[j][0] !== CODEC_WEBRTC_DIRECT) {
|
178
|
-
continue;
|
179
|
-
}
|
180
|
-
const certhashIndex = j + 1;
|
181
|
-
if (tuples[certhashIndex] == null || tuples[certhashIndex][0] !== CODEC_CERTHASH) {
|
182
|
-
tuples.splice(certhashIndex, 0, [CODEC_CERTHASH, this.certificate?.certhash]);
|
183
|
-
ma = fromStringTuples(tuples);
|
184
|
-
multiaddrs[i] = ma;
|
185
|
-
}
|
186
|
-
}
|
187
|
-
}
|
188
|
-
}
|
189
148
|
async close() {
|
190
149
|
for (const connection of this.connections.values()) {
|
191
150
|
connection.close();
|
192
151
|
}
|
193
152
|
// stop all UDP mux listeners
|
194
|
-
await Promise.all(this.servers.map(async (p) => {
|
195
|
-
const server = await p
|
153
|
+
await Promise.all(Object.values(this.servers).map(async (p) => {
|
154
|
+
const server = await p;
|
196
155
|
await server.close();
|
197
156
|
}));
|
198
157
|
// RTCPeerConnections will be removed from the connections map when their
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"listener.js","sourceRoot":"","sources":["../../../src/private-to-public/listener.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAA;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AACrD,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,
|
1
|
+
{"version":3,"file":"listener.js","sourceRoot":"","sources":["../../../src/private-to-public/listener.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "@libp2p/webrtc",
|
3
|
-
"version": "5.1.1-
|
3
|
+
"version": "5.1.1-ff951f1a0",
|
4
4
|
"description": "A libp2p transport using WebRTC connections",
|
5
5
|
"license": "Apache-2.0 OR MIT",
|
6
6
|
"homepage": "https://github.com/libp2p/js-libp2p/tree/main/packages/transport-webrtc#readme",
|
@@ -54,11 +54,11 @@
|
|
54
54
|
"@chainsafe/is-ip": "^2.0.2",
|
55
55
|
"@chainsafe/libp2p-noise": "^16.0.0",
|
56
56
|
"@ipshipyard/node-datachannel": "^0.26.4",
|
57
|
-
"@libp2p/interface": "2.5.0-
|
58
|
-
"@libp2p/interface-internal": "2.3.1-
|
59
|
-
"@libp2p/peer-id": "5.0.12-
|
60
|
-
"@libp2p/utils": "6.5.1-
|
61
|
-
"@multiformats/multiaddr": "^12.
|
57
|
+
"@libp2p/interface": "2.5.0-ff951f1a0",
|
58
|
+
"@libp2p/interface-internal": "2.3.1-ff951f1a0",
|
59
|
+
"@libp2p/peer-id": "5.0.12-ff951f1a0",
|
60
|
+
"@libp2p/utils": "6.5.1-ff951f1a0",
|
61
|
+
"@multiformats/multiaddr": "^12.3.3",
|
62
62
|
"@multiformats/multiaddr-matcher": "^1.6.0",
|
63
63
|
"@peculiar/webcrypto": "^1.5.0",
|
64
64
|
"@peculiar/x509": "^1.11.0",
|
@@ -83,9 +83,9 @@
|
|
83
83
|
"uint8arrays": "^5.1.0"
|
84
84
|
},
|
85
85
|
"devDependencies": {
|
86
|
-
"@libp2p/crypto": "5.0.11-
|
87
|
-
"@libp2p/interface-compliance-tests": "6.3.1-
|
88
|
-
"@libp2p/logger": "5.1.8-
|
86
|
+
"@libp2p/crypto": "5.0.11-ff951f1a0",
|
87
|
+
"@libp2p/interface-compliance-tests": "6.3.1-ff951f1a0",
|
88
|
+
"@libp2p/logger": "5.1.8-ff951f1a0",
|
89
89
|
"@types/sinon": "^17.0.3",
|
90
90
|
"aegir": "^45.0.5",
|
91
91
|
"delay": "^6.0.0",
|
@@ -1,8 +1,8 @@
|
|
1
1
|
import { networkInterfaces } from 'node:os'
|
2
2
|
import { isIPv4, isIPv6 } from '@chainsafe/is-ip'
|
3
3
|
import { TypedEventEmitter } from '@libp2p/interface'
|
4
|
-
import { multiaddr, protocols
|
5
|
-
import { IP4
|
4
|
+
import { multiaddr, protocols } from '@multiformats/multiaddr'
|
5
|
+
import { IP4 } from '@multiformats/multiaddr-matcher'
|
6
6
|
import { Crypto } from '@peculiar/webcrypto'
|
7
7
|
import getPort from 'get-port'
|
8
8
|
import pWaitFor from 'p-wait-for'
|
@@ -22,8 +22,6 @@ const crypto = new Crypto()
|
|
22
22
|
* The time to wait, in milliseconds, for the data channel handshake to complete
|
23
23
|
*/
|
24
24
|
const HANDSHAKE_TIMEOUT_MS = 10_000
|
25
|
-
const CODEC_WEBRTC_DIRECT = 0x0118
|
26
|
-
const CODEC_CERTHASH = 0x01d2
|
27
25
|
|
28
26
|
export interface WebRTCDirectListenerComponents {
|
29
27
|
peerId: PeerId
|
@@ -49,15 +47,8 @@ const UDP_PROTOCOL = protocols('udp')
|
|
49
47
|
const IP4_PROTOCOL = protocols('ip4')
|
50
48
|
const IP6_PROTOCOL = protocols('ip6')
|
51
49
|
|
52
|
-
interface UDPMuxServer {
|
53
|
-
server: Promise<StunServer>
|
54
|
-
isIPv4: boolean
|
55
|
-
isIPv6: boolean
|
56
|
-
port: number
|
57
|
-
}
|
58
|
-
|
59
50
|
export class WebRTCDirectListener extends TypedEventEmitter<ListenerEvents> implements Listener {
|
60
|
-
private readonly servers:
|
51
|
+
private readonly servers: Record<number, Promise<StunServer>>
|
61
52
|
private readonly multiaddrs: Multiaddr[]
|
62
53
|
private certificate?: TransportCertificate
|
63
54
|
private readonly connections: Map<string, DirectRTCPeerConnection>
|
@@ -72,7 +63,7 @@ export class WebRTCDirectListener extends TypedEventEmitter<ListenerEvents> impl
|
|
72
63
|
this.init = init
|
73
64
|
this.components = components
|
74
65
|
this.multiaddrs = []
|
75
|
-
this.servers =
|
66
|
+
this.servers = {}
|
76
67
|
this.connections = new Map()
|
77
68
|
this.log = components.logger.forComponent('libp2p:webrtc-direct:listener')
|
78
69
|
this.certificate = init.certificates?.[0]
|
@@ -112,20 +103,11 @@ export class WebRTCDirectListener extends TypedEventEmitter<ListenerEvents> impl
|
|
112
103
|
// single mux listener. This is necessary because libjuice binds to all
|
113
104
|
// interfaces for a given port so we we need to key on just the port number
|
114
105
|
// not the host + the port number
|
115
|
-
|
116
|
-
|
117
|
-
// if the server has not been started yet, or the port is a wildcard port
|
118
|
-
// and there is already a wildcard port for this address family, start a new
|
119
|
-
// UDP mux server
|
120
|
-
const wildcardPorts = port === 0 && existingServer?.port === 0
|
121
|
-
const sameAddressFamily = (existingServer?.isIPv4 === true && isIPv4(host)) || (existingServer?.isIPv6 === true && isIPv6(host))
|
122
|
-
|
123
|
-
if (existingServer == null || (wildcardPorts && sameAddressFamily)) {
|
124
|
-
existingServer = this.startUDPMuxServer(host, port)
|
125
|
-
this.servers.push(existingServer)
|
106
|
+
if (this.servers[port] == null) {
|
107
|
+
this.servers[port] = this.startUDPMuxServer(host, port)
|
126
108
|
}
|
127
109
|
|
128
|
-
const server = await
|
110
|
+
const server = await this.servers[port]
|
129
111
|
const address = server.address()
|
130
112
|
|
131
113
|
getNetworkAddresses(host, address.port, ipVersion).forEach((ma) => {
|
@@ -135,43 +117,31 @@ export class WebRTCDirectListener extends TypedEventEmitter<ListenerEvents> impl
|
|
135
117
|
this.safeDispatchEvent('listening')
|
136
118
|
}
|
137
119
|
|
138
|
-
private startUDPMuxServer (host: string, port: number):
|
139
|
-
|
140
|
-
port
|
141
|
-
|
142
|
-
|
143
|
-
server: Promise.resolve()
|
144
|
-
.then(async (): Promise<StunServer> => {
|
145
|
-
if (port === 0) {
|
146
|
-
// libjuice doesn't map 0 to a random free port so we have to do it
|
147
|
-
// ourselves
|
148
|
-
port = await getPort()
|
149
|
-
}
|
150
|
-
|
151
|
-
// ensure we have a certificate
|
152
|
-
if (this.certificate == null) {
|
153
|
-
const keyPair = await crypto.subtle.generateKey({
|
154
|
-
name: 'ECDSA',
|
155
|
-
namedCurve: 'P-256'
|
156
|
-
}, true, ['sign', 'verify'])
|
157
|
-
|
158
|
-
const certificate = await generateTransportCertificate(keyPair, {
|
159
|
-
days: 365 * 10
|
160
|
-
})
|
161
|
-
|
162
|
-
if (this.certificate == null) {
|
163
|
-
this.certificate = certificate
|
164
|
-
}
|
165
|
-
}
|
166
|
-
|
167
|
-
return stunListener(host, port, this.log, (ufrag, remoteHost, remotePort) => {
|
168
|
-
this.incomingConnection(ufrag, remoteHost, remotePort)
|
169
|
-
.catch(err => {
|
170
|
-
this.log.error('error processing incoming STUN request', err)
|
171
|
-
})
|
172
|
-
})
|
173
|
-
})
|
120
|
+
private async startUDPMuxServer (host: string, port: number): Promise<StunServer> {
|
121
|
+
if (port === 0) {
|
122
|
+
// libjuice doesn't map 0 to a random free port so we have to do it
|
123
|
+
// ourselves
|
124
|
+
port = await getPort()
|
174
125
|
}
|
126
|
+
|
127
|
+
// ensure we have a certificate
|
128
|
+
if (this.certificate == null) {
|
129
|
+
const keyPair = await crypto.subtle.generateKey({
|
130
|
+
name: 'ECDSA',
|
131
|
+
namedCurve: 'P-256'
|
132
|
+
}, true, ['sign', 'verify'])
|
133
|
+
|
134
|
+
this.certificate = await generateTransportCertificate(keyPair, {
|
135
|
+
days: 365 * 10
|
136
|
+
})
|
137
|
+
}
|
138
|
+
|
139
|
+
return stunListener(host, port, this.log, (ufrag, remoteHost, remotePort) => {
|
140
|
+
this.incomingConnection(ufrag, remoteHost, remotePort)
|
141
|
+
.catch(err => {
|
142
|
+
this.log.error('error processing incoming STUN request', err)
|
143
|
+
})
|
144
|
+
})
|
175
145
|
}
|
176
146
|
|
177
147
|
private async incomingConnection (ufrag: string, remoteHost: string, remotePort: number): Promise<void> {
|
@@ -226,34 +196,6 @@ export class WebRTCDirectListener extends TypedEventEmitter<ListenerEvents> impl
|
|
226
196
|
return this.multiaddrs
|
227
197
|
}
|
228
198
|
|
229
|
-
updateAnnounceAddrs (multiaddrs: Multiaddr[]): void {
|
230
|
-
for (let i = 0; i < multiaddrs.length; i++) {
|
231
|
-
let ma = multiaddrs[i]
|
232
|
-
|
233
|
-
if (!WebRTCDirect.exactMatch(ma)) {
|
234
|
-
continue
|
235
|
-
}
|
236
|
-
|
237
|
-
// add the certhash if it is missing
|
238
|
-
const tuples = ma.stringTuples()
|
239
|
-
|
240
|
-
for (let j = 0; j < tuples.length; j++) {
|
241
|
-
if (tuples[j][0] !== CODEC_WEBRTC_DIRECT) {
|
242
|
-
continue
|
243
|
-
}
|
244
|
-
|
245
|
-
const certhashIndex = j + 1
|
246
|
-
|
247
|
-
if (tuples[certhashIndex] == null || tuples[certhashIndex][0] !== CODEC_CERTHASH) {
|
248
|
-
tuples.splice(certhashIndex, 0, [CODEC_CERTHASH, this.certificate?.certhash])
|
249
|
-
|
250
|
-
ma = fromStringTuples(tuples)
|
251
|
-
multiaddrs[i] = ma
|
252
|
-
}
|
253
|
-
}
|
254
|
-
}
|
255
|
-
}
|
256
|
-
|
257
199
|
async close (): Promise<void> {
|
258
200
|
for (const connection of this.connections.values()) {
|
259
201
|
connection.close()
|
@@ -261,8 +203,8 @@ export class WebRTCDirectListener extends TypedEventEmitter<ListenerEvents> impl
|
|
261
203
|
|
262
204
|
// stop all UDP mux listeners
|
263
205
|
await Promise.all(
|
264
|
-
this.servers.map(async p => {
|
265
|
-
const server = await p
|
206
|
+
Object.values(this.servers).map(async p => {
|
207
|
+
const server = await p
|
266
208
|
await server.close()
|
267
209
|
})
|
268
210
|
)
|