@libp2p/webrtc 5.2.8-757577dd2 → 5.2.8-a7ab9a41b
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/src/private-to-public/listener.d.ts +2 -1
- package/dist/src/private-to-public/listener.d.ts.map +1 -1
- package/dist/src/private-to-public/listener.js +16 -54
- package/dist/src/private-to-public/listener.js.map +1 -1
- package/package.json +8 -8
- package/src/private-to-public/listener.ts +18 -63
@@ -21,8 +21,9 @@ export interface WebRTCListenerMetrics {
|
|
21
21
|
listenerEvents: CounterGroup;
|
22
22
|
}
|
23
23
|
export declare class WebRTCDirectListener extends TypedEventEmitter<ListenerEvents> implements Listener {
|
24
|
-
private
|
24
|
+
private listeningMultiaddr?;
|
25
25
|
private certificate?;
|
26
|
+
private stunServer?;
|
26
27
|
private readonly connections;
|
27
28
|
private readonly log;
|
28
29
|
private readonly init;
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"listener.d.ts","sourceRoot":"","sources":["../../../src/private-to-public/listener.ts"],"names":[],"mappings":"
|
1
|
+
{"version":3,"file":"listener.d.ts","sourceRoot":"","sources":["../../../src/private-to-public/listener.ts"],"names":[],"mappings":"AACA,OAAO,EAAsB,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AAYzE,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;AAIxD,MAAM,WAAW,8BAA8B;IAC7C,MAAM,EAAE,MAAM,CAAA;IACd,UAAU,EAAE,UAAU,CAAA;IACtB,MAAM,EAAE,eAAe,CAAA;IACvB,QAAQ,EAAE,QAAQ,CAAA;IAClB,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;AAaD,qBAAa,oBAAqB,SAAQ,iBAAiB,CAAC,cAAc,CAAE,YAAW,QAAQ;IAC7F,OAAO,CAAC,kBAAkB,CAAC,CAAW;IACtC,OAAO,CAAC,WAAW,CAAC,CAAsB;IAC1C,OAAO,CAAC,UAAU,CAAC,CAAY;IAC/B,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;IAChD,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAiB;gBAEvC,UAAU,EAAE,8BAA8B,EAAE,IAAI,EAAE,wBAAwB;IAoBjF,MAAM,CAAE,EAAE,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAyC3C,OAAO,CAAC,iBAAiB;YAgDX,kBAAkB;IAmDhC,QAAQ,IAAK,SAAS,EAAE;IAYxB,mBAAmB,CAAE,UAAU,EAAE,SAAS,EAAE,GAAG,IAAI;IA4B7C,KAAK,IAAK,OAAO,CAAC,IAAI,CAAC;CA8B9B"}
|
@@ -1,8 +1,8 @@
|
|
1
|
-
import { networkInterfaces } from 'node:os';
|
2
1
|
import { isIPv4, isIPv6 } from '@chainsafe/is-ip';
|
3
2
|
import { InvalidPeerIdError, TypedEventEmitter } from '@libp2p/interface';
|
4
|
-
import {
|
5
|
-
import {
|
3
|
+
import { getThinWaistAddresses } from '@libp2p/utils/get-thin-waist-addresses';
|
4
|
+
import { multiaddr, fromStringTuples } from '@multiformats/multiaddr';
|
5
|
+
import { WebRTCDirect } 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';
|
@@ -12,13 +12,11 @@ import { generateTransportCertificate } from './utils/generate-certificates.js';
|
|
12
12
|
import { createDialerRTCPeerConnection } from './utils/get-rtcpeerconnection.js';
|
13
13
|
import { stunListener } from './utils/stun-listener.js';
|
14
14
|
const crypto = new Crypto();
|
15
|
-
const UDP_PROTOCOL = protocols('udp');
|
16
|
-
const IP4_PROTOCOL = protocols('ip4');
|
17
|
-
const IP6_PROTOCOL = protocols('ip6');
|
18
15
|
let UDP_MUX_LISTENERS = [];
|
19
16
|
export class WebRTCDirectListener extends TypedEventEmitter {
|
20
|
-
|
17
|
+
listeningMultiaddr;
|
21
18
|
certificate;
|
19
|
+
stunServer;
|
22
20
|
connections;
|
23
21
|
log;
|
24
22
|
init;
|
@@ -29,7 +27,6 @@ export class WebRTCDirectListener extends TypedEventEmitter {
|
|
29
27
|
super();
|
30
28
|
this.init = init;
|
31
29
|
this.components = components;
|
32
|
-
this.multiaddrs = [];
|
33
30
|
this.connections = new Map();
|
34
31
|
this.log = components.logger.forComponent('libp2p:webrtc-direct:listener');
|
35
32
|
this.certificate = init.certificates?.[0];
|
@@ -44,22 +41,7 @@ export class WebRTCDirectListener extends TypedEventEmitter {
|
|
44
41
|
}
|
45
42
|
}
|
46
43
|
async listen(ma) {
|
47
|
-
const
|
48
|
-
const ipVersion = IP4.matches(ma) ? 4 : 6;
|
49
|
-
const host = parts
|
50
|
-
.filter(([code]) => code === IP4_PROTOCOL.code)
|
51
|
-
.pop()?.[1] ?? parts
|
52
|
-
.filter(([code]) => code === IP6_PROTOCOL.code)
|
53
|
-
.pop()?.[1];
|
54
|
-
if (host == null) {
|
55
|
-
throw new Error('IP4/6 host must be specified in webrtc-direct multiaddr');
|
56
|
-
}
|
57
|
-
const port = parseInt(parts
|
58
|
-
.filter(([code, value]) => code === UDP_PROTOCOL.code)
|
59
|
-
.pop()?.[1] ?? '');
|
60
|
-
if (isNaN(port)) {
|
61
|
-
throw new Error('UDP port must be specified in webrtc-direct multiaddr');
|
62
|
-
}
|
44
|
+
const { host, port } = ma.toOptions();
|
63
45
|
// have to do this before any async work happens so starting two listeners
|
64
46
|
// for the same port concurrently (e.g. ipv4/ipv6 both port 0) results in a
|
65
47
|
// single mux listener. This is necessary because libjuice binds to all
|
@@ -83,14 +65,12 @@ export class WebRTCDirectListener extends TypedEventEmitter {
|
|
83
65
|
// testing environment
|
84
66
|
throw new InvalidPeerIdError(`Another peer is already performing UDP mux on ${host}:${existingServer.port}`);
|
85
67
|
}
|
86
|
-
|
87
|
-
const address =
|
68
|
+
this.stunServer = await existingServer.server;
|
69
|
+
const address = this.stunServer.address();
|
88
70
|
if (!createdMuxServer) {
|
89
71
|
this.log('reused existing UDP mux server on %s:%p', host, address.port);
|
90
72
|
}
|
91
|
-
|
92
|
-
this.multiaddrs.push(multiaddr(`${ma}/webrtc-direct/certhash/${this.certificate?.certhash}`));
|
93
|
-
});
|
73
|
+
this.listeningMultiaddr = ma;
|
94
74
|
this.safeDispatchEvent('listening');
|
95
75
|
}
|
96
76
|
startUDPMuxServer(host, port) {
|
@@ -180,7 +160,13 @@ export class WebRTCDirectListener extends TypedEventEmitter {
|
|
180
160
|
}
|
181
161
|
}
|
182
162
|
getAddrs() {
|
183
|
-
|
163
|
+
if (this.stunServer == null) {
|
164
|
+
return [];
|
165
|
+
}
|
166
|
+
const address = this.stunServer.address();
|
167
|
+
return getThinWaistAddresses(this.listeningMultiaddr, address.port).map(ma => {
|
168
|
+
return ma.encapsulate(`/webrtc-direct/certhash/${this.certificate?.certhash}`);
|
169
|
+
});
|
184
170
|
}
|
185
171
|
updateAnnounceAddrs(multiaddrs) {
|
186
172
|
for (let i = 0; i < multiaddrs.length; i++) {
|
@@ -227,28 +213,4 @@ export class WebRTCDirectListener extends TypedEventEmitter {
|
|
227
213
|
this.safeDispatchEvent('close');
|
228
214
|
}
|
229
215
|
}
|
230
|
-
function getNetworkAddresses(host, port, version) {
|
231
|
-
if (host === '0.0.0.0' || host === '::') {
|
232
|
-
// return all ip4 interfaces
|
233
|
-
return Object.entries(networkInterfaces())
|
234
|
-
.flatMap(([_, addresses]) => addresses)
|
235
|
-
.map(address => address?.address)
|
236
|
-
.filter(address => {
|
237
|
-
if (address == null) {
|
238
|
-
return false;
|
239
|
-
}
|
240
|
-
if (version === 4) {
|
241
|
-
return isIPv4(address);
|
242
|
-
}
|
243
|
-
if (version === 6) {
|
244
|
-
return isIPv6(address);
|
245
|
-
}
|
246
|
-
return false;
|
247
|
-
})
|
248
|
-
.map(address => `/ip${version}/${address}/udp/${port}`);
|
249
|
-
}
|
250
|
-
return [
|
251
|
-
`/ip${version}/${host}/udp/${port}`
|
252
|
-
];
|
253
|
-
}
|
254
216
|
//# sourceMappingURL=listener.js.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"listener.js","sourceRoot":"","sources":["../../../src/private-to-public/listener.ts"],"names":[],"mappings":"AAAA,OAAO,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.2.8-
|
3
|
+
"version": "5.2.8-a7ab9a41b",
|
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,10 +54,10 @@
|
|
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.7.0-
|
58
|
-
"@libp2p/interface-internal": "2.3.8-
|
59
|
-
"@libp2p/peer-id": "5.1.0-
|
60
|
-
"@libp2p/utils": "6.5.8-
|
57
|
+
"@libp2p/interface": "2.7.0-a7ab9a41b",
|
58
|
+
"@libp2p/interface-internal": "2.3.8-a7ab9a41b",
|
59
|
+
"@libp2p/peer-id": "5.1.0-a7ab9a41b",
|
60
|
+
"@libp2p/utils": "6.5.8-a7ab9a41b",
|
61
61
|
"@multiformats/multiaddr": "^12.4.0",
|
62
62
|
"@multiformats/multiaddr-matcher": "^1.6.0",
|
63
63
|
"@peculiar/webcrypto": "^1.5.0",
|
@@ -83,9 +83,9 @@
|
|
83
83
|
"uint8arrays": "^5.1.0"
|
84
84
|
},
|
85
85
|
"devDependencies": {
|
86
|
-
"@libp2p/crypto": "5.0.15-
|
87
|
-
"@libp2p/interface-compliance-tests": "6.4.1-
|
88
|
-
"@libp2p/logger": "5.1.13-
|
86
|
+
"@libp2p/crypto": "5.0.15-a7ab9a41b",
|
87
|
+
"@libp2p/interface-compliance-tests": "6.4.1-a7ab9a41b",
|
88
|
+
"@libp2p/logger": "5.1.13-a7ab9a41b",
|
89
89
|
"@types/sinon": "^17.0.3",
|
90
90
|
"aegir": "^45.1.1",
|
91
91
|
"delay": "^6.0.0",
|
@@ -1,8 +1,8 @@
|
|
1
|
-
import { networkInterfaces } from 'node:os'
|
2
1
|
import { isIPv4, isIPv6 } from '@chainsafe/is-ip'
|
3
2
|
import { InvalidPeerIdError, TypedEventEmitter } from '@libp2p/interface'
|
4
|
-
import {
|
5
|
-
import {
|
3
|
+
import { getThinWaistAddresses } from '@libp2p/utils/get-thin-waist-addresses'
|
4
|
+
import { multiaddr, fromStringTuples } from '@multiformats/multiaddr'
|
5
|
+
import { WebRTCDirect } 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'
|
@@ -40,10 +40,6 @@ export interface WebRTCListenerMetrics {
|
|
40
40
|
listenerEvents: CounterGroup
|
41
41
|
}
|
42
42
|
|
43
|
-
const UDP_PROTOCOL = protocols('udp')
|
44
|
-
const IP4_PROTOCOL = protocols('ip4')
|
45
|
-
const IP6_PROTOCOL = protocols('ip6')
|
46
|
-
|
47
43
|
interface UDPMuxServer {
|
48
44
|
server: Promise<StunServer>
|
49
45
|
isIPv4: boolean
|
@@ -56,8 +52,9 @@ interface UDPMuxServer {
|
|
56
52
|
let UDP_MUX_LISTENERS: UDPMuxServer[] = []
|
57
53
|
|
58
54
|
export class WebRTCDirectListener extends TypedEventEmitter<ListenerEvents> implements Listener {
|
59
|
-
private
|
55
|
+
private listeningMultiaddr?: Multiaddr
|
60
56
|
private certificate?: TransportCertificate
|
57
|
+
private stunServer?: StunServer
|
61
58
|
private readonly connections: Map<string, DirectRTCPeerConnection>
|
62
59
|
private readonly log: Logger
|
63
60
|
private readonly init: WebRTCDirectListenerInit
|
@@ -70,7 +67,6 @@ export class WebRTCDirectListener extends TypedEventEmitter<ListenerEvents> impl
|
|
70
67
|
|
71
68
|
this.init = init
|
72
69
|
this.components = components
|
73
|
-
this.multiaddrs = []
|
74
70
|
this.connections = new Map()
|
75
71
|
this.log = components.logger.forComponent('libp2p:webrtc-direct:listener')
|
76
72
|
this.certificate = init.certificates?.[0]
|
@@ -87,24 +83,7 @@ export class WebRTCDirectListener extends TypedEventEmitter<ListenerEvents> impl
|
|
87
83
|
}
|
88
84
|
|
89
85
|
async listen (ma: Multiaddr): Promise<void> {
|
90
|
-
const
|
91
|
-
const ipVersion = IP4.matches(ma) ? 4 : 6
|
92
|
-
const host = parts
|
93
|
-
.filter(([code]) => code === IP4_PROTOCOL.code)
|
94
|
-
.pop()?.[1] ?? parts
|
95
|
-
.filter(([code]) => code === IP6_PROTOCOL.code)
|
96
|
-
.pop()?.[1]
|
97
|
-
|
98
|
-
if (host == null) {
|
99
|
-
throw new Error('IP4/6 host must be specified in webrtc-direct multiaddr')
|
100
|
-
}
|
101
|
-
const port = parseInt(parts
|
102
|
-
.filter(([code, value]) => code === UDP_PROTOCOL.code)
|
103
|
-
.pop()?.[1] ?? '')
|
104
|
-
|
105
|
-
if (isNaN(port)) {
|
106
|
-
throw new Error('UDP port must be specified in webrtc-direct multiaddr')
|
107
|
-
}
|
86
|
+
const { host, port } = ma.toOptions()
|
108
87
|
|
109
88
|
// have to do this before any async work happens so starting two listeners
|
110
89
|
// for the same port concurrently (e.g. ipv4/ipv6 both port 0) results in a
|
@@ -133,17 +112,14 @@ export class WebRTCDirectListener extends TypedEventEmitter<ListenerEvents> impl
|
|
133
112
|
throw new InvalidPeerIdError(`Another peer is already performing UDP mux on ${host}:${existingServer.port}`)
|
134
113
|
}
|
135
114
|
|
136
|
-
|
137
|
-
const address =
|
115
|
+
this.stunServer = await existingServer.server
|
116
|
+
const address = this.stunServer.address()
|
138
117
|
|
139
118
|
if (!createdMuxServer) {
|
140
119
|
this.log('reused existing UDP mux server on %s:%p', host, address.port)
|
141
120
|
}
|
142
121
|
|
143
|
-
|
144
|
-
this.multiaddrs.push(multiaddr(`${ma}/webrtc-direct/certhash/${this.certificate?.certhash}`))
|
145
|
-
})
|
146
|
-
|
122
|
+
this.listeningMultiaddr = ma
|
147
123
|
this.safeDispatchEvent('listening')
|
148
124
|
}
|
149
125
|
|
@@ -247,7 +223,15 @@ export class WebRTCDirectListener extends TypedEventEmitter<ListenerEvents> impl
|
|
247
223
|
}
|
248
224
|
|
249
225
|
getAddrs (): Multiaddr[] {
|
250
|
-
|
226
|
+
if (this.stunServer == null) {
|
227
|
+
return []
|
228
|
+
}
|
229
|
+
|
230
|
+
const address = this.stunServer.address()
|
231
|
+
|
232
|
+
return getThinWaistAddresses(this.listeningMultiaddr, address.port).map(ma => {
|
233
|
+
return ma.encapsulate(`/webrtc-direct/certhash/${this.certificate?.certhash}`)
|
234
|
+
})
|
251
235
|
}
|
252
236
|
|
253
237
|
updateAnnounceAddrs (multiaddrs: Multiaddr[]): void {
|
@@ -309,32 +293,3 @@ export class WebRTCDirectListener extends TypedEventEmitter<ListenerEvents> impl
|
|
309
293
|
this.safeDispatchEvent('close')
|
310
294
|
}
|
311
295
|
}
|
312
|
-
|
313
|
-
function getNetworkAddresses (host: string, port: number, version: 4 | 6): string[] {
|
314
|
-
if (host === '0.0.0.0' || host === '::') {
|
315
|
-
// return all ip4 interfaces
|
316
|
-
return Object.entries(networkInterfaces())
|
317
|
-
.flatMap(([_, addresses]) => addresses)
|
318
|
-
.map(address => address?.address)
|
319
|
-
.filter(address => {
|
320
|
-
if (address == null) {
|
321
|
-
return false
|
322
|
-
}
|
323
|
-
|
324
|
-
if (version === 4) {
|
325
|
-
return isIPv4(address)
|
326
|
-
}
|
327
|
-
|
328
|
-
if (version === 6) {
|
329
|
-
return isIPv6(address)
|
330
|
-
}
|
331
|
-
|
332
|
-
return false
|
333
|
-
})
|
334
|
-
.map(address => `/ip${version}/${address}/udp/${port}`)
|
335
|
-
}
|
336
|
-
|
337
|
-
return [
|
338
|
-
`/ip${version}/${host}/udp/${port}`
|
339
|
-
]
|
340
|
-
}
|