@libp2p/webrtc 5.2.8 → 5.2.9-4c64bd06d
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 +54 -0
- package/dist/index.min.js +153 -18
- package/dist/src/constants.d.ts +16 -0
- package/dist/src/constants.d.ts.map +1 -1
- package/dist/src/constants.js +16 -0
- package/dist/src/constants.js.map +1 -1
- package/dist/src/index.d.ts +54 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +54 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/private-to-private/util.d.ts +2 -2
- package/dist/src/private-to-private/util.d.ts.map +1 -1
- package/dist/src/private-to-public/listener.d.ts +11 -5
- package/dist/src/private-to-public/listener.d.ts.map +1 -1
- package/dist/src/private-to-public/listener.js +49 -98
- package/dist/src/private-to-public/listener.js.map +1 -1
- package/dist/src/private-to-public/transport.d.ts +66 -5
- package/dist/src/private-to-public/transport.d.ts.map +1 -1
- package/dist/src/private-to-public/transport.js +149 -2
- package/dist/src/private-to-public/transport.js.map +1 -1
- package/dist/src/private-to-public/utils/pem.d.ts +6 -0
- package/dist/src/private-to-public/utils/pem.d.ts.map +1 -0
- package/dist/src/private-to-public/utils/pem.js +15 -0
- package/dist/src/private-to-public/utils/pem.js.map +1 -0
- package/package.json +12 -9
- package/src/constants.ts +20 -0
- package/src/index.ts +54 -0
- package/src/private-to-private/util.ts +2 -2
- package/src/private-to-public/listener.ts +64 -119
- package/src/private-to-public/transport.ts +242 -7
- package/src/private-to-public/utils/pem.ts +18 -0
- package/dist/typedoc-urls.json +0 -14
package/dist/src/constants.d.ts
CHANGED
@@ -69,4 +69,20 @@ export declare const MUXER_PROTOCOL = "/webrtc";
|
|
69
69
|
* The protocol used for the signalling stream protocol
|
70
70
|
*/
|
71
71
|
export declare const SIGNALING_PROTOCOL = "/webrtc-signaling/0.0.1";
|
72
|
+
/**
|
73
|
+
* Used to store generated certificates in the datastore
|
74
|
+
*/
|
75
|
+
export declare const DEFAULT_CERTIFICATE_DATASTORE_KEY = "/libp2p/webrtc-direct/certificate";
|
76
|
+
/**
|
77
|
+
* Used to store the certificate private key in the keychain
|
78
|
+
*/
|
79
|
+
export declare const DEFAULT_CERTIFICATE_PRIVATE_KEY_NAME = "webrtc-direct-certificate-private-key";
|
80
|
+
/**
|
81
|
+
* The default type of certificate private key
|
82
|
+
*/
|
83
|
+
export declare const DEFAULT_CERTIFICATE_PRIVATE_KEY_TYPE = "ECDSA";
|
84
|
+
/**
|
85
|
+
* How long the certificate is valid for
|
86
|
+
*/
|
87
|
+
export declare const DEFAULT_CERTIFICATE_LIFESPAN = 365;
|
72
88
|
//# sourceMappingURL=constants.d.ts.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/constants.ts"],"names":[],"mappings":"AAGA;;;;;;;GAOG;AACH,eAAO,MAAM,mBAAmB,UAK/B,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,cAAc,UAA+E,CAAA;AAE1G;;GAEG;AACH,eAAO,MAAM,YAAY,sBAAsB,CAAA;AAE/C;;GAEG;AACH,eAAO,MAAM,mBAAmB,MAAS,CAAA;AAEzC;;GAEG;AACH,eAAO,MAAM,cAAc,MAAS,CAAA;AAEpC;;GAEG;AACH,eAAO,MAAM,mBAAmB,QAAkB,CAAA;AAElD;;GAEG;AACH,eAAO,MAAM,2BAA2B,QAAY,CAAA;AAEpD;;;;;;;GAOG;AACH,eAAO,MAAM,gBAAgB,QAAY,CAAA;AAsBzC;;;GAGG;AACH,eAAO,MAAM,iBAAiB,QAA8B,CAAA;AAE5D;;;;GAIG;AACH,eAAO,MAAM,eAAe,OAAQ,CAAA;AAEpC;;;GAGG;AACH,eAAO,MAAM,YAAY,OAAQ,CAAA;AAEjC;;;GAGG;AACH,eAAO,MAAM,0BAA0B,QAAS,CAAA;AAEhD;;GAEG;AACH,eAAO,MAAM,cAAc,YAAY,CAAA;AAEvC;;GAEG;AACH,eAAO,MAAM,kBAAkB,4BAA4B,CAAA"}
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/constants.ts"],"names":[],"mappings":"AAGA;;;;;;;GAOG;AACH,eAAO,MAAM,mBAAmB,UAK/B,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,cAAc,UAA+E,CAAA;AAE1G;;GAEG;AACH,eAAO,MAAM,YAAY,sBAAsB,CAAA;AAE/C;;GAEG;AACH,eAAO,MAAM,mBAAmB,MAAS,CAAA;AAEzC;;GAEG;AACH,eAAO,MAAM,cAAc,MAAS,CAAA;AAEpC;;GAEG;AACH,eAAO,MAAM,mBAAmB,QAAkB,CAAA;AAElD;;GAEG;AACH,eAAO,MAAM,2BAA2B,QAAY,CAAA;AAEpD;;;;;;;GAOG;AACH,eAAO,MAAM,gBAAgB,QAAY,CAAA;AAsBzC;;;GAGG;AACH,eAAO,MAAM,iBAAiB,QAA8B,CAAA;AAE5D;;;;GAIG;AACH,eAAO,MAAM,eAAe,OAAQ,CAAA;AAEpC;;;GAGG;AACH,eAAO,MAAM,YAAY,OAAQ,CAAA;AAEjC;;;GAGG;AACH,eAAO,MAAM,0BAA0B,QAAS,CAAA;AAEhD;;GAEG;AACH,eAAO,MAAM,cAAc,YAAY,CAAA;AAEvC;;GAEG;AACH,eAAO,MAAM,kBAAkB,4BAA4B,CAAA;AAE3D;;GAEG;AACH,eAAO,MAAM,iCAAiC,sCAAsC,CAAA;AAEpF;;GAEG;AACH,eAAO,MAAM,oCAAoC,0CAA0C,CAAA;AAE3F;;GAEG;AACH,eAAO,MAAM,oCAAoC,UAAU,CAAA;AAE3D;;GAEG;AACH,eAAO,MAAM,4BAA4B,MAAM,CAAA"}
|
package/dist/src/constants.js
CHANGED
@@ -93,4 +93,20 @@ export const MUXER_PROTOCOL = '/webrtc';
|
|
93
93
|
* The protocol used for the signalling stream protocol
|
94
94
|
*/
|
95
95
|
export const SIGNALING_PROTOCOL = '/webrtc-signaling/0.0.1';
|
96
|
+
/**
|
97
|
+
* Used to store generated certificates in the datastore
|
98
|
+
*/
|
99
|
+
export const DEFAULT_CERTIFICATE_DATASTORE_KEY = '/libp2p/webrtc-direct/certificate';
|
100
|
+
/**
|
101
|
+
* Used to store the certificate private key in the keychain
|
102
|
+
*/
|
103
|
+
export const DEFAULT_CERTIFICATE_PRIVATE_KEY_NAME = 'webrtc-direct-certificate-private-key';
|
104
|
+
/**
|
105
|
+
* The default type of certificate private key
|
106
|
+
*/
|
107
|
+
export const DEFAULT_CERTIFICATE_PRIVATE_KEY_TYPE = 'ECDSA';
|
108
|
+
/**
|
109
|
+
* How long the certificate is valid for
|
110
|
+
*/
|
111
|
+
export const DEFAULT_CERTIFICATE_LIFESPAN = 365;
|
96
112
|
//# sourceMappingURL=constants.js.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/constants.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,mCAAmC,CAAA;AAE3D;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG;IACjC,8BAA8B;IAC9B,kCAAkC;IAClC,+BAA+B;IAC/B,qCAAqC;CACtC,CAAA;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,KAAK,CAAC,IAAI,CAAC,gEAAgE,CAAC,CAAA;AAE1G;;GAEG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,mBAAmB,CAAA;AAE/C;;GAEG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,MAAM,CAAA;AAEzC;;GAEG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,MAAM,CAAA;AAEpC;;GAEG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,GAAG,IAAI,GAAG,IAAI,CAAA;AAElD;;GAEG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAG,EAAE,GAAG,IAAI,CAAA;AAEpD;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,EAAE,GAAG,IAAI,CAAA;AAEzC;;;;;;GAMG;AACH,SAAS,yBAAyB,CAAE,cAAc,GAAG,gBAAgB;IACnE,0BAA0B;IAC1B,MAAM,aAAa,GAAG,cAAc,CAAC,cAAc,GAAG,cAAc,CAAC,cAAc,CAAC,CAAC,CAAA;IACrF,MAAM,SAAS,GAAG,CAAC,GAAG,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA,CAAC,gBAAgB;IAC3F,MAAM,kBAAkB,GAAG,CAAC,CAAA,CAAC,UAAU;IACvC,MAAM,SAAS,GAAG,cAAc,GAAG,aAAa,GAAG,SAAS,GAAG,kBAAkB,CAAA;IAEjF,+DAA+D;IAC/D,MAAM,wBAAwB,GAAG,cAAc,CAAC,SAAS,CAAC,CAAA;IAE1D,OAAO,aAAa,GAAG,SAAS,GAAG,kBAAkB,GAAG,wBAAwB,CAAA;AAClF,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,yBAAyB,EAAE,CAAA;AAE5D;;;;GAIG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,KAAK,CAAA;AAEpC;;;GAGG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,KAAK,CAAA;AAEjC;;;GAGG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAG,MAAM,CAAA;AAEhD;;GAEG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,SAAS,CAAA;AAEvC;;GAEG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,yBAAyB,CAAA"}
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/constants.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,mCAAmC,CAAA;AAE3D;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG;IACjC,8BAA8B;IAC9B,kCAAkC;IAClC,+BAA+B;IAC/B,qCAAqC;CACtC,CAAA;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,KAAK,CAAC,IAAI,CAAC,gEAAgE,CAAC,CAAA;AAE1G;;GAEG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,mBAAmB,CAAA;AAE/C;;GAEG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,MAAM,CAAA;AAEzC;;GAEG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,MAAM,CAAA;AAEpC;;GAEG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,GAAG,IAAI,GAAG,IAAI,CAAA;AAElD;;GAEG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAG,EAAE,GAAG,IAAI,CAAA;AAEpD;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,EAAE,GAAG,IAAI,CAAA;AAEzC;;;;;;GAMG;AACH,SAAS,yBAAyB,CAAE,cAAc,GAAG,gBAAgB;IACnE,0BAA0B;IAC1B,MAAM,aAAa,GAAG,cAAc,CAAC,cAAc,GAAG,cAAc,CAAC,cAAc,CAAC,CAAC,CAAA;IACrF,MAAM,SAAS,GAAG,CAAC,GAAG,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA,CAAC,gBAAgB;IAC3F,MAAM,kBAAkB,GAAG,CAAC,CAAA,CAAC,UAAU;IACvC,MAAM,SAAS,GAAG,cAAc,GAAG,aAAa,GAAG,SAAS,GAAG,kBAAkB,CAAA;IAEjF,+DAA+D;IAC/D,MAAM,wBAAwB,GAAG,cAAc,CAAC,SAAS,CAAC,CAAA;IAE1D,OAAO,aAAa,GAAG,SAAS,GAAG,kBAAkB,GAAG,wBAAwB,CAAA;AAClF,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,yBAAyB,EAAE,CAAA;AAE5D;;;;GAIG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,KAAK,CAAA;AAEpC;;;GAGG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,KAAK,CAAA;AAEjC;;;GAGG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAG,MAAM,CAAA;AAEhD;;GAEG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,SAAS,CAAA;AAEvC;;GAEG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,yBAAyB,CAAA;AAE3D;;GAEG;AACH,MAAM,CAAC,MAAM,iCAAiC,GAAG,mCAAmC,CAAA;AAEpF;;GAEG;AACH,MAAM,CAAC,MAAM,oCAAoC,GAAG,uCAAuC,CAAA;AAE3F;;GAEG;AACH,MAAM,CAAC,MAAM,oCAAoC,GAAG,OAAO,CAAA;AAE3D;;GAEG;AACH,MAAM,CAAC,MAAM,4BAA4B,GAAG,GAAG,CAAA"}
|
package/dist/src/index.d.ts
CHANGED
@@ -206,6 +206,60 @@
|
|
206
206
|
* }
|
207
207
|
* )
|
208
208
|
* ```
|
209
|
+
*
|
210
|
+
* ## WebRTC Direct certificate hashes
|
211
|
+
*
|
212
|
+
* WebRTC Direct listeners publish the hash of their TLS certificate as part of
|
213
|
+
* the listening multiaddr.
|
214
|
+
*
|
215
|
+
* By default these certificates are generated at start up using an ephemeral
|
216
|
+
* keypair that only exists while the node is running.
|
217
|
+
*
|
218
|
+
* This means that the certificate hashes change when the node is restarted,
|
219
|
+
* which can be undesirable if multiaddrs are intended to be long lived (e.g.
|
220
|
+
* if the node is used as a network bootstrapper).
|
221
|
+
*
|
222
|
+
* To reuse the same certificate and keypair, configure a persistent datastore
|
223
|
+
* and the [@libp2p/keychain](https://www.npmjs.com/package/@libp2p/keychain)
|
224
|
+
* service as part of your service map:
|
225
|
+
*
|
226
|
+
* @example Reuse TLS certificates after restart
|
227
|
+
*
|
228
|
+
* ```ts
|
229
|
+
* import { LevelDatastore } from 'datastore-level'
|
230
|
+
* import { webRTCDirect } from '@libp2p/webrtc'
|
231
|
+
* import { keychain } from '@libp2p/keychain'
|
232
|
+
* import { createLibp2p } from 'libp2p'
|
233
|
+
*
|
234
|
+
* // store data on disk between restarts
|
235
|
+
* const datastore = new LevelDatastore('/path/to/store')
|
236
|
+
*
|
237
|
+
* const listener = await createLibp2p({
|
238
|
+
* addresses: {
|
239
|
+
* listen: [
|
240
|
+
* '/ip4/0.0.0.0/udp/0/webrtc-direct'
|
241
|
+
* ]
|
242
|
+
* },
|
243
|
+
* datastore,
|
244
|
+
* transports: [
|
245
|
+
* webRTCDirect()
|
246
|
+
* ],
|
247
|
+
* services: {
|
248
|
+
* keychain: keychain()
|
249
|
+
* }
|
250
|
+
* })
|
251
|
+
*
|
252
|
+
* await listener.start()
|
253
|
+
*
|
254
|
+
* console.info(listener.getMultiaddrs())
|
255
|
+
* // /ip4/...../udp/../webrtc-direct/certhash/foo
|
256
|
+
*
|
257
|
+
* await listener.stop()
|
258
|
+
* await listener.start()
|
259
|
+
*
|
260
|
+
* console.info(listener.getMultiaddrs())
|
261
|
+
* // /ip4/...../udp/../webrtc-direct/certhash/foo
|
262
|
+
* ```
|
209
263
|
*/
|
210
264
|
import { type WebRTCTransportDirectInit, type WebRTCDirectTransportComponents } from './private-to-public/transport.js';
|
211
265
|
import type { WebRTCTransportComponents, WebRTCTransportInit } from './private-to-private/transport.js';
|
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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsQG;AAGH,OAAO,EAAyB,KAAK,yBAAyB,EAAE,KAAK,+BAA+B,EAAE,MAAM,kCAAkC,CAAA;AAC9I,OAAO,KAAK,EAAE,yBAAyB,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAA;AACvG,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAA;AAElD,MAAM,WAAW,kBAAkB;IACjC;;;;OAIG;IACH,cAAc,CAAC,EAAE,MAAM,CAAA;IAEvB;;;;;OAKG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAE1B;;;;;;OAMG;IACH,6BAA6B,CAAC,EAAE,MAAM,CAAA;IAEtC;;;;;;OAMG;IACH,YAAY,CAAC,EAAE,MAAM,CAAA;IAErB;;;;;;OAMG;IACH,YAAY,CAAC,EAAE,MAAM,CAAA;IAErB;;;;;OAKG;IACH,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC;;OAEG;IACH,UAAU,EAAE,MAAM,CAAA;IAElB;;OAEG;IACH,GAAG,EAAE,MAAM,CAAA;IAEX;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAA;CACjB;AAED,YAAY,EAAE,yBAAyB,EAAE,+BAA+B,EAAE,CAAA;AAE1E,iBAAS,YAAY,CAAE,IAAI,CAAC,EAAE,yBAAyB,GAAG,CAAC,UAAU,EAAE,+BAA+B,KAAK,SAAS,CAEnH;AAED,YAAY,EAAE,mBAAmB,EAAE,yBAAyB,EAAE,CAAA;AAE9D,iBAAS,MAAM,CAAE,IAAI,CAAC,EAAE,mBAAmB,GAAG,CAAC,UAAU,EAAE,yBAAyB,KAAK,SAAS,CAEjG;AAED,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,CAAA"}
|
package/dist/src/index.js
CHANGED
@@ -206,6 +206,60 @@
|
|
206
206
|
* }
|
207
207
|
* )
|
208
208
|
* ```
|
209
|
+
*
|
210
|
+
* ## WebRTC Direct certificate hashes
|
211
|
+
*
|
212
|
+
* WebRTC Direct listeners publish the hash of their TLS certificate as part of
|
213
|
+
* the listening multiaddr.
|
214
|
+
*
|
215
|
+
* By default these certificates are generated at start up using an ephemeral
|
216
|
+
* keypair that only exists while the node is running.
|
217
|
+
*
|
218
|
+
* This means that the certificate hashes change when the node is restarted,
|
219
|
+
* which can be undesirable if multiaddrs are intended to be long lived (e.g.
|
220
|
+
* if the node is used as a network bootstrapper).
|
221
|
+
*
|
222
|
+
* To reuse the same certificate and keypair, configure a persistent datastore
|
223
|
+
* and the [@libp2p/keychain](https://www.npmjs.com/package/@libp2p/keychain)
|
224
|
+
* service as part of your service map:
|
225
|
+
*
|
226
|
+
* @example Reuse TLS certificates after restart
|
227
|
+
*
|
228
|
+
* ```ts
|
229
|
+
* import { LevelDatastore } from 'datastore-level'
|
230
|
+
* import { webRTCDirect } from '@libp2p/webrtc'
|
231
|
+
* import { keychain } from '@libp2p/keychain'
|
232
|
+
* import { createLibp2p } from 'libp2p'
|
233
|
+
*
|
234
|
+
* // store data on disk between restarts
|
235
|
+
* const datastore = new LevelDatastore('/path/to/store')
|
236
|
+
*
|
237
|
+
* const listener = await createLibp2p({
|
238
|
+
* addresses: {
|
239
|
+
* listen: [
|
240
|
+
* '/ip4/0.0.0.0/udp/0/webrtc-direct'
|
241
|
+
* ]
|
242
|
+
* },
|
243
|
+
* datastore,
|
244
|
+
* transports: [
|
245
|
+
* webRTCDirect()
|
246
|
+
* ],
|
247
|
+
* services: {
|
248
|
+
* keychain: keychain()
|
249
|
+
* }
|
250
|
+
* })
|
251
|
+
*
|
252
|
+
* await listener.start()
|
253
|
+
*
|
254
|
+
* console.info(listener.getMultiaddrs())
|
255
|
+
* // /ip4/...../udp/../webrtc-direct/certhash/foo
|
256
|
+
*
|
257
|
+
* await listener.stop()
|
258
|
+
* await listener.start()
|
259
|
+
*
|
260
|
+
* console.info(listener.getMultiaddrs())
|
261
|
+
* // /ip4/...../udp/../webrtc-direct/certhash/foo
|
262
|
+
* ```
|
209
263
|
*/
|
210
264
|
import { WebRTCTransport } from './private-to-private/transport.js';
|
211
265
|
import { WebRTCDirectTransport } from './private-to-public/transport.js';
|
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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsQG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAA;AACnE,OAAO,EAAE,qBAAqB,EAAwE,MAAM,kCAAkC,CAAA;AA8E9I,SAAS,YAAY,CAAE,IAAgC;IACrD,OAAO,CAAC,UAA2C,EAAE,EAAE,CAAC,IAAI,qBAAqB,CAAC,UAAU,EAAE,IAAI,CAAC,CAAA;AACrG,CAAC;AAID,SAAS,MAAM,CAAE,IAA0B;IACzC,OAAO,CAAC,UAAqC,EAAE,EAAE,CAAC,IAAI,eAAe,CAAC,UAAU,EAAE,IAAI,CAAC,CAAA;AACzF,CAAC;AAED,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,CAAA"}
|
@@ -1,8 +1,8 @@
|
|
1
1
|
import { Message } from './pb/message.js';
|
2
2
|
import type { WebRTCDialEvents } from './transport.js';
|
3
3
|
import type { RTCPeerConnection } from '../webrtc/index.js';
|
4
|
-
import type { LoggerOptions, Stream } from '@libp2p/interface';
|
5
|
-
import type {
|
4
|
+
import type { AbortOptions, LoggerOptions, Stream } from '@libp2p/interface';
|
5
|
+
import type { MessageStream } from 'it-protobuf-stream';
|
6
6
|
import type { ProgressOptions } from 'progress-events';
|
7
7
|
export interface ReadCandidatesOptions extends AbortOptions, LoggerOptions, ProgressOptions<WebRTCDialEvents> {
|
8
8
|
direction: string;
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../../../src/private-to-private/util.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAA;AACzC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AACtD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAA;AAC3D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;
|
1
|
+
{"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../../../src/private-to-private/util.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAA;AACzC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AACtD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAA;AAC3D,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAC5E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAEvD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAEtD,MAAM,WAAW,qBAAsB,SAAQ,YAAY,EAAE,aAAa,EAAE,eAAe,CAAC,gBAAgB,CAAC;IAC3G,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,eAAO,MAAM,4BAA4B,OAAc,iBAAiB,UAAU,cAAc,OAAO,EAAE,MAAM,CAAC,WAAW,qBAAqB,KAAG,QAAQ,IAAI,CAyD9J,CAAA;AAED,wBAAgB,kBAAkB,CAAE,EAAE,EAAE,iBAAiB,GAAG,MAAM,CAEjE"}
|
@@ -1,28 +1,34 @@
|
|
1
1
|
import { TypedEventEmitter } from '@libp2p/interface';
|
2
2
|
import type { DataChannelOptions, TransportCertificate } from '../index.js';
|
3
|
-
import type {
|
3
|
+
import type { WebRTCDirectTransportCertificateEvents } from './transport.js';
|
4
|
+
import type { PeerId, ListenerEvents, Listener, Upgrader, ComponentLogger, CounterGroup, Metrics, PrivateKey, TypedEventTarget } from '@libp2p/interface';
|
5
|
+
import type { Keychain } from '@libp2p/keychain';
|
4
6
|
import type { Multiaddr } from '@multiformats/multiaddr';
|
7
|
+
import type { Datastore } from 'interface-datastore';
|
5
8
|
export interface WebRTCDirectListenerComponents {
|
6
9
|
peerId: PeerId;
|
7
10
|
privateKey: PrivateKey;
|
8
11
|
logger: ComponentLogger;
|
9
12
|
upgrader: Upgrader;
|
13
|
+
keychain?: Keychain;
|
14
|
+
datastore: Datastore;
|
10
15
|
metrics?: Metrics;
|
11
16
|
}
|
12
17
|
export interface WebRTCDirectListenerInit {
|
13
18
|
upgrader: Upgrader;
|
14
|
-
|
19
|
+
certificate: TransportCertificate;
|
15
20
|
maxInboundStreams?: number;
|
16
21
|
dataChannel?: DataChannelOptions;
|
17
22
|
rtcConfiguration?: RTCConfiguration | (() => RTCConfiguration | Promise<RTCConfiguration>);
|
18
|
-
|
23
|
+
emitter: TypedEventTarget<WebRTCDirectTransportCertificateEvents>;
|
19
24
|
}
|
20
25
|
export interface WebRTCListenerMetrics {
|
21
26
|
listenerEvents: CounterGroup;
|
22
27
|
}
|
23
28
|
export declare class WebRTCDirectListener extends TypedEventEmitter<ListenerEvents> implements Listener {
|
24
|
-
private
|
25
|
-
private certificate
|
29
|
+
private listeningMultiaddr?;
|
30
|
+
private certificate;
|
31
|
+
private stunServer?;
|
26
32
|
private readonly connections;
|
27
33
|
private readonly log;
|
28
34
|
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,EAA0B,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AAU7E,OAAO,KAAK,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAA;AAC3E,OAAO,KAAK,EAAE,sCAAsC,EAAE,MAAM,gBAAgB,CAAA;AAG5E,OAAO,KAAK,EAAE,MAAM,EAAE,cAAc,EAAE,QAAQ,EAAE,QAAQ,EAAE,eAAe,EAAU,YAAY,EAAE,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AACjK,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAChD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAA;AACxD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAA;AAEpD,MAAM,WAAW,8BAA8B;IAC7C,MAAM,EAAE,MAAM,CAAA;IACd,UAAU,EAAE,UAAU,CAAA;IACtB,MAAM,EAAE,eAAe,CAAA;IACvB,QAAQ,EAAE,QAAQ,CAAA;IAClB,QAAQ,CAAC,EAAE,QAAQ,CAAA;IACnB,SAAS,EAAE,SAAS,CAAA;IACpB,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB;AAED,MAAM,WAAW,wBAAwB;IACvC,QAAQ,EAAE,QAAQ,CAAA;IAClB,WAAW,EAAE,oBAAoB,CAAA;IACjC,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,OAAO,EAAE,gBAAgB,CAAC,sCAAsC,CAAC,CAAA;CAClE;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,CAAsB;IACzC,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;IA0BjF,MAAM,CAAE,EAAE,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAyC3C,OAAO,CAAC,iBAAiB;YA+BX,kBAAkB;IAmDhC,QAAQ,IAAK,SAAS,EAAE;IAYxB,mBAAmB,CAAE,UAAU,EAAE,SAAS,EAAE,GAAG,IAAI;IA4B7C,KAAK,IAAK,OAAO,CAAC,IAAI,CAAC;CA8B9B"}
|
@@ -1,24 +1,19 @@
|
|
1
|
-
import {
|
2
|
-
import {
|
3
|
-
import {
|
4
|
-
import { multiaddr,
|
5
|
-
import {
|
6
|
-
import { Crypto } from '@peculiar/webcrypto';
|
1
|
+
import { isIPv4 } from '@chainsafe/is-ip';
|
2
|
+
import { InvalidParametersError, TypedEventEmitter } from '@libp2p/interface';
|
3
|
+
import { getThinWaistAddresses } from '@libp2p/utils/get-thin-waist-addresses';
|
4
|
+
import { multiaddr, fromStringTuples } from '@multiformats/multiaddr';
|
5
|
+
import { WebRTCDirect } from '@multiformats/multiaddr-matcher';
|
7
6
|
import getPort from 'get-port';
|
8
7
|
import pWaitFor from 'p-wait-for';
|
9
8
|
import { CODEC_CERTHASH, CODEC_WEBRTC_DIRECT } from '../constants.js';
|
10
9
|
import { connect } from './utils/connect.js';
|
11
|
-
import { generateTransportCertificate } from './utils/generate-certificates.js';
|
12
10
|
import { createDialerRTCPeerConnection } from './utils/get-rtcpeerconnection.js';
|
13
11
|
import { stunListener } from './utils/stun-listener.js';
|
14
|
-
const crypto = new Crypto();
|
15
|
-
const UDP_PROTOCOL = protocols('udp');
|
16
|
-
const IP4_PROTOCOL = protocols('ip4');
|
17
|
-
const IP6_PROTOCOL = protocols('ip6');
|
18
12
|
let UDP_MUX_LISTENERS = [];
|
19
13
|
export class WebRTCDirectListener extends TypedEventEmitter {
|
20
|
-
|
14
|
+
listeningMultiaddr;
|
21
15
|
certificate;
|
16
|
+
stunServer;
|
22
17
|
connections;
|
23
18
|
log;
|
24
19
|
init;
|
@@ -29,11 +24,10 @@ export class WebRTCDirectListener extends TypedEventEmitter {
|
|
29
24
|
super();
|
30
25
|
this.init = init;
|
31
26
|
this.components = components;
|
32
|
-
this.multiaddrs = [];
|
33
27
|
this.connections = new Map();
|
34
28
|
this.log = components.logger.forComponent('libp2p:webrtc-direct:listener');
|
35
|
-
this.certificate = init.certificates?.[0];
|
36
29
|
this.shutdownController = new AbortController();
|
30
|
+
this.certificate = init.certificate;
|
37
31
|
if (components.metrics != null) {
|
38
32
|
this.metrics = {
|
39
33
|
listenerEvents: components.metrics.registerCounterGroup('libp2p_webrtc-direct_listener_events_total', {
|
@@ -42,80 +36,55 @@ export class WebRTCDirectListener extends TypedEventEmitter {
|
|
42
36
|
})
|
43
37
|
};
|
44
38
|
}
|
39
|
+
// inform the transport manager our addresses have changed
|
40
|
+
init.emitter.addEventListener('certificate:renew', evt => {
|
41
|
+
this.certificate = evt.detail;
|
42
|
+
this.safeDispatchEvent('listening');
|
43
|
+
});
|
45
44
|
}
|
46
45
|
async listen(ma) {
|
47
|
-
const
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
46
|
+
const { host, port, family } = ma.toOptions();
|
47
|
+
let udpMuxServer;
|
48
|
+
if (port !== 0) {
|
49
|
+
// libjuice binds to all interfaces (IPv4/IPv6) for a given port so if we
|
50
|
+
// want to listen on a specific port, and there's already a mux listener
|
51
|
+
// for that port for the other family started by this node, we should
|
52
|
+
// reuse it
|
53
|
+
udpMuxServer = UDP_MUX_LISTENERS.find(s => s.port === port);
|
54
|
+
// make sure the port is free for the given family
|
55
|
+
if (udpMuxServer != null && ((udpMuxServer.isIPv4 && family === 4) || (udpMuxServer.isIPv6 && family === 6))) {
|
56
|
+
throw new InvalidParametersError(`There is already a listener for ${host}:${port}`);
|
57
|
+
}
|
58
|
+
// check that we own the mux server
|
59
|
+
if (udpMuxServer != null && !udpMuxServer.peerId.equals(this.components.peerId)) {
|
60
|
+
throw new InvalidParametersError(`Another peer is already performing UDP mux on ${host}:${port}`);
|
61
|
+
}
|
62
62
|
}
|
63
|
-
//
|
64
|
-
|
65
|
-
// single mux listener. This is necessary because libjuice binds to all
|
66
|
-
// interfaces for a given port so we we need to key on just the port number
|
67
|
-
// not the host + the port number
|
68
|
-
let existingServer = UDP_MUX_LISTENERS.find(s => s.port === port);
|
69
|
-
// if the server has not been started yet, or the port is a wildcard port
|
70
|
-
// and there is already a wildcard port for this address family, start a new
|
71
|
-
// UDP mux server
|
72
|
-
const wildcardPorts = port === 0 && existingServer?.port === 0;
|
73
|
-
const sameAddressFamily = (existingServer?.isIPv4 === true && isIPv4(host)) || (existingServer?.isIPv6 === true && isIPv6(host));
|
74
|
-
let createdMuxServer = false;
|
75
|
-
if (existingServer == null || (wildcardPorts && sameAddressFamily)) {
|
63
|
+
// start the mux server if we don't have one already
|
64
|
+
if (udpMuxServer == null) {
|
76
65
|
this.log('starting UDP mux server on %s:%p', host, port);
|
77
|
-
|
78
|
-
UDP_MUX_LISTENERS.push(
|
79
|
-
createdMuxServer = true;
|
66
|
+
udpMuxServer = this.startUDPMuxServer(host, port, family);
|
67
|
+
UDP_MUX_LISTENERS.push(udpMuxServer);
|
80
68
|
}
|
81
|
-
if (
|
82
|
-
|
83
|
-
// testing environment
|
84
|
-
throw new InvalidPeerIdError(`Another peer is already performing UDP mux on ${host}:${existingServer.port}`);
|
69
|
+
if (family === 4) {
|
70
|
+
udpMuxServer.isIPv4 = true;
|
85
71
|
}
|
86
|
-
|
87
|
-
|
88
|
-
if (!createdMuxServer) {
|
89
|
-
this.log('reused existing UDP mux server on %s:%p', host, address.port);
|
72
|
+
else if (family === 6) {
|
73
|
+
udpMuxServer.isIPv6 = true;
|
90
74
|
}
|
91
|
-
|
92
|
-
|
93
|
-
});
|
75
|
+
this.stunServer = await udpMuxServer.server;
|
76
|
+
this.listeningMultiaddr = ma;
|
94
77
|
this.safeDispatchEvent('listening');
|
95
78
|
}
|
96
|
-
startUDPMuxServer(host, port) {
|
79
|
+
startUDPMuxServer(host, port, family) {
|
97
80
|
return {
|
98
81
|
peerId: this.components.peerId,
|
99
82
|
owner: this,
|
100
83
|
port,
|
101
|
-
isIPv4:
|
102
|
-
isIPv6:
|
84
|
+
isIPv4: family === 4,
|
85
|
+
isIPv6: family === 6,
|
103
86
|
server: Promise.resolve()
|
104
87
|
.then(async () => {
|
105
|
-
// ensure we have a certificate
|
106
|
-
if (this.certificate == null) {
|
107
|
-
this.log.trace('creating TLS certificate');
|
108
|
-
const keyPair = await crypto.subtle.generateKey({
|
109
|
-
name: 'ECDSA',
|
110
|
-
namedCurve: 'P-256'
|
111
|
-
}, true, ['sign', 'verify']);
|
112
|
-
const certificate = await generateTransportCertificate(keyPair, {
|
113
|
-
days: 365 * 10
|
114
|
-
});
|
115
|
-
if (this.certificate == null) {
|
116
|
-
this.certificate = certificate;
|
117
|
-
}
|
118
|
-
}
|
119
88
|
if (port === 0) {
|
120
89
|
// libjuice doesn't map 0 to a random free port so we have to do it
|
121
90
|
// ourselves
|
@@ -180,7 +149,13 @@ export class WebRTCDirectListener extends TypedEventEmitter {
|
|
180
149
|
}
|
181
150
|
}
|
182
151
|
getAddrs() {
|
183
|
-
|
152
|
+
if (this.stunServer == null) {
|
153
|
+
return [];
|
154
|
+
}
|
155
|
+
const address = this.stunServer.address();
|
156
|
+
return getThinWaistAddresses(this.listeningMultiaddr, address.port).map(ma => {
|
157
|
+
return ma.encapsulate(`/webrtc-direct/certhash/${this.certificate?.certhash}`);
|
158
|
+
});
|
184
159
|
}
|
185
160
|
updateAnnounceAddrs(multiaddrs) {
|
186
161
|
for (let i = 0; i < multiaddrs.length; i++) {
|
@@ -227,28 +202,4 @@ export class WebRTCDirectListener extends TypedEventEmitter {
|
|
227
202
|
this.safeDispatchEvent('close');
|
228
203
|
}
|
229
204
|
}
|
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
205
|
//# 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":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AACzC,OAAO,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AAC7E,OAAO,EAAE,qBAAqB,EAAE,MAAM,wCAAwC,CAAA;AAC9E,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAA;AACrE,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAA;AAC9D,OAAO,OAAO,MAAM,UAAU,CAAA;AAC9B,OAAO,QAAQ,MAAM,YAAY,CAAA;AACjC,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAA;AACrE,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAA;AAC5C,OAAO,EAAE,6BAA6B,EAAE,MAAM,kCAAkC,CAAA;AAChF,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AA0CvD,IAAI,iBAAiB,GAAmB,EAAE,CAAA;AAE1C,MAAM,OAAO,oBAAqB,SAAQ,iBAAiC;IACjE,kBAAkB,CAAY;IAC9B,WAAW,CAAsB;IACjC,UAAU,CAAa;IACd,WAAW,CAAsC;IACjD,GAAG,CAAQ;IACX,IAAI,CAA0B;IAC9B,UAAU,CAAgC;IAC1C,OAAO,CAAwB;IAC/B,kBAAkB,CAAiB;IAEpD,YAAa,UAA0C,EAAE,IAA8B;QACrF,KAAK,EAAE,CAAA;QAEP,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;QAChB,IAAI,CAAC,UAAU,GAAG,UAAU,CAAA;QAC5B,IAAI,CAAC,WAAW,GAAG,IAAI,GAAG,EAAE,CAAA;QAC5B,IAAI,CAAC,GAAG,GAAG,UAAU,CAAC,MAAM,CAAC,YAAY,CAAC,+BAA+B,CAAC,CAAA;QAC1E,IAAI,CAAC,kBAAkB,GAAG,IAAI,eAAe,EAAE,CAAA;QAC/C,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAA;QAEnC,IAAI,UAAU,CAAC,OAAO,IAAI,IAAI,EAAE,CAAC;YAC/B,IAAI,CAAC,OAAO,GAAG;gBACb,cAAc,EAAE,UAAU,CAAC,OAAO,CAAC,oBAAoB,CAAC,4CAA4C,EAAE;oBACpG,KAAK,EAAE,OAAO;oBACd,IAAI,EAAE,oDAAoD;iBAC3D,CAAC;aACH,CAAA;QACH,CAAC;QAED,0DAA0D;QAC1D,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,mBAAmB,EAAE,GAAG,CAAC,EAAE;YACvD,IAAI,CAAC,WAAW,GAAG,GAAG,CAAC,MAAM,CAAA;YAC7B,IAAI,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAA;QACrC,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,KAAK,CAAC,MAAM,CAAE,EAAa;QACzB,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,SAAS,EAAE,CAAA;QAE7C,IAAI,YAAsC,CAAA;QAE1C,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;YACf,yEAAyE;YACzE,wEAAwE;YACxE,qEAAqE;YACrE,WAAW;YACX,YAAY,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAA;YAE3D,kDAAkD;YAClD,IAAI,YAAY,IAAI,IAAI,IAAI,CAAC,CAAC,YAAY,CAAC,MAAM,IAAI,MAAM,KAAK,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,IAAI,MAAM,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC7G,MAAM,IAAI,sBAAsB,CAAC,mCAAmC,IAAI,IAAI,IAAI,EAAE,CAAC,CAAA;YACrF,CAAC;YAED,mCAAmC;YACnC,IAAI,YAAY,IAAI,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;gBAChF,MAAM,IAAI,sBAAsB,CAAC,iDAAiD,IAAI,IAAI,IAAI,EAAE,CAAC,CAAA;YACnG,CAAC;QACH,CAAC;QAED,oDAAoD;QACpD,IAAI,YAAY,IAAI,IAAI,EAAE,CAAC;YACzB,IAAI,CAAC,GAAG,CAAC,kCAAkC,EAAE,IAAI,EAAE,IAAI,CAAC,CAAA;YACxD,YAAY,GAAG,IAAI,CAAC,iBAAiB,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,CAAA;YACzD,iBAAiB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;QACtC,CAAC;QAED,IAAI,MAAM,KAAK,CAAC,EAAE,CAAC;YACjB,YAAY,CAAC,MAAM,GAAG,IAAI,CAAA;QAC5B,CAAC;aAAM,IAAI,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,YAAY,CAAC,MAAM,GAAG,IAAI,CAAA;QAC5B,CAAC;QAED,IAAI,CAAC,UAAU,GAAG,MAAM,YAAY,CAAC,MAAM,CAAA;QAC3C,IAAI,CAAC,kBAAkB,GAAG,EAAE,CAAA;QAC5B,IAAI,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAA;IACrC,CAAC;IAEO,iBAAiB,CAAE,IAAY,EAAE,IAAY,EAAE,MAAa;QAClE,OAAO;YACL,MAAM,EAAE,IAAI,CAAC,UAAU,CAAC,MAAM;YAC9B,KAAK,EAAE,IAAI;YACX,IAAI;YACJ,MAAM,EAAE,MAAM,KAAK,CAAC;YACpB,MAAM,EAAE,MAAM,KAAK,CAAC;YACpB,MAAM,EAAE,OAAO,CAAC,OAAO,EAAE;iBACtB,IAAI,CAAC,KAAK,IAAyB,EAAE;gBACpC,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;oBACf,mEAAmE;oBACnE,YAAY;oBACZ,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAA;oBACzC,IAAI,GAAG,MAAM,OAAO,EAAE,CAAA;gBACxB,CAAC;gBAED,OAAO,YAAY,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,EAAE;oBAC1E,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,wBAAwB,CAAC,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAA;oBAEhG,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,CAAC;yBAC3D,KAAK,CAAC,GAAG,CAAC,EAAE;wBACX,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,wCAAwC,EAAE,GAAG,CAAC,CAAA;oBAC/D,CAAC,CAAC;yBACD,OAAO,CAAC,GAAG,EAAE;wBACZ,MAAM,CAAC,KAAK,EAAE,CAAA;oBAChB,CAAC,CAAC,CAAA;gBACN,CAAC,CAAC,CAAA;YACJ,CAAC,CAAC;SACL,CAAA;IACH,CAAC;IAEO,KAAK,CAAC,kBAAkB,CAAE,KAAa,EAAE,UAAkB,EAAE,UAAkB,EAAE,MAAmB;QAC1G,MAAM,GAAG,GAAG,GAAG,UAAU,IAAI,UAAU,IAAI,KAAK,EAAE,CAAA;QAClD,IAAI,cAAc,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QAE9C,IAAI,cAAc,IAAI,IAAI,EAAE,CAAC;YAC3B,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,oCAAoC,EAAE,GAAG,CAAC,CAAA;YACzD,OAAM;QACR,CAAC;QAED,IAAI,CAAC,GAAG,CAAC,+BAA+B,EAAE,GAAG,CAAC,CAAA;QAE9C,4EAA4E;QAC5E,MAAM,CAAC,cAAc,EAAE,CAAA;QAEvB,+FAA+F;QAC/F,cAAc,GAAG,MAAM,6BAA6B,CAAC,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,WAAW,CAAC,CAAA;QAEnH,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,EAAE,cAAc,CAAC,CAAA;QAEzC,cAAc,CAAC,gBAAgB,CAAC,uBAAuB,EAAE,GAAG,EAAE;YAC5D,QAAQ,cAAc,CAAC,eAAe,EAAE,CAAC;gBACvC,KAAK,QAAQ,CAAC;gBACd,KAAK,cAAc,CAAC;gBACpB,KAAK,QAAQ;oBACX,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;oBAC5B,MAAK;gBACP;oBACE,MAAK;YACT,CAAC;QACH,CAAC,CAAC,CAAA;QAEF,IAAI,CAAC;YACH,MAAM,OAAO,CAAC,cAAc,EAAE,KAAK,EAAE;gBACnC,IAAI,EAAE,QAAQ;gBACd,GAAG,EAAE,IAAI,CAAC,GAAG;gBACb,MAAM,EAAE,IAAI,CAAC,UAAU,CAAC,MAAM;gBAC9B,OAAO,EAAE,IAAI,CAAC,UAAU,CAAC,OAAO;gBAChC,MAAM,EAAE,IAAI,CAAC,OAAO,EAAE,cAAc;gBACpC,MAAM;gBACN,UAAU,EAAE,SAAS,CAAC,MAAM,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,UAAU,QAAQ,UAAU,EAAE,CAAC;gBACzF,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,WAAW;gBAClC,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ;gBAC5B,MAAM,EAAE,IAAI,CAAC,UAAU,CAAC,MAAM;gBAC9B,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC,UAAU;aACvC,CAAC,CAAA;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,cAAc,CAAC,KAAK,EAAE,CAAA;YACtB,MAAM,GAAG,CAAA;QACX,CAAC;IACH,CAAC;IAED,QAAQ;QACN,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,EAAE,CAAC;YAC5B,OAAO,EAAE,CAAA;QACX,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAA;QAEzC,OAAO,qBAAqB,CAAC,IAAI,CAAC,kBAAkB,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;YAC3E,OAAO,EAAE,CAAC,WAAW,CAAC,2BAA2B,IAAI,CAAC,WAAW,EAAE,QAAQ,EAAE,CAAC,CAAA;QAChF,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,mBAAmB,CAAE,UAAuB;QAC1C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC3C,IAAI,EAAE,GAAG,UAAU,CAAC,CAAC,CAAC,CAAA;YAEtB,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,EAAE,CAAC,EAAE,CAAC;gBACjC,SAAQ;YACV,CAAC;YAED,oCAAoC;YACpC,MAAM,MAAM,GAAG,EAAE,CAAC,YAAY,EAAE,CAAA;YAEhC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACvC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,mBAAmB,EAAE,CAAC;oBACzC,SAAQ;gBACV,CAAC;gBAED,MAAM,aAAa,GAAG,CAAC,GAAG,CAAC,CAAA;gBAE3B,IAAI,MAAM,CAAC,aAAa,CAAC,IAAI,IAAI,IAAI,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,KAAK,cAAc,EAAE,CAAC;oBACjF,MAAM,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC,EAAE,CAAC,cAAc,EAAE,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC,CAAA;oBAE7E,EAAE,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAA;oBAC7B,UAAU,CAAC,CAAC,CAAC,GAAG,EAAE,CAAA;gBACpB,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,KAAK,CAAC,KAAK;QACT,6BAA6B;QAC7B,MAAM,OAAO,CAAC,GAAG,CACf,iBAAiB;aACd,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,KAAK,KAAK,IAAI,CAAC;aAC3C,GAAG,CAAC,KAAK,EAAC,QAAQ,EAAC,EAAE;YACpB,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAA;YACpC,MAAM,MAAM,CAAC,KAAK,EAAE,CAAA;QACtB,CAAC,CAAC,CACL,CAAA;QAED,uCAAuC;QACvC,iBAAiB,GAAG,iBAAiB,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,KAAK,KAAK,IAAI,CAAC,CAAA;QAEjF,6BAA6B;QAC7B,KAAK,MAAM,UAAU,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,EAAE,CAAC;YACnD,UAAU,CAAC,KAAK,EAAE,CAAA;QACpB,CAAC;QAED,sCAAsC;QACtC,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE,CAAA;QAE/B,yEAAyE;QACzE,8DAA8D;QAC9D,MAAM,QAAQ,CAAC,GAAG,EAAE;YAClB,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,KAAK,CAAC,CAAA;QACpC,CAAC,CAAC,CAAA;QAEF,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAA;IACjC,CAAC;CACF"}
|
@@ -1,12 +1,13 @@
|
|
1
1
|
import { serviceCapabilities, transportSymbol } from '@libp2p/interface';
|
2
|
+
import { X509Certificate } from '@peculiar/x509';
|
3
|
+
import { Key } from 'interface-datastore';
|
2
4
|
import type { DataChannelOptions, TransportCertificate } from '../index.js';
|
3
5
|
import type { WebRTCDialEvents } from '../private-to-private/transport.js';
|
4
|
-
import type { CreateListenerOptions, Transport, Listener, ComponentLogger, Connection, CounterGroup, Metrics, PeerId, DialTransportOptions, PrivateKey, Upgrader } from '@libp2p/interface';
|
6
|
+
import type { CreateListenerOptions, Transport, Listener, ComponentLogger, Connection, CounterGroup, Metrics, PeerId, DialTransportOptions, PrivateKey, Upgrader, Startable } from '@libp2p/interface';
|
5
7
|
import type { TransportManager } from '@libp2p/interface-internal';
|
8
|
+
import type { Keychain } from '@libp2p/keychain';
|
6
9
|
import type { Multiaddr } from '@multiformats/multiaddr';
|
7
|
-
|
8
|
-
* The peer for this transport
|
9
|
-
*/
|
10
|
+
import type { Datastore } from 'interface-datastore';
|
10
11
|
export interface WebRTCDirectTransportComponents {
|
11
12
|
peerId: PeerId;
|
12
13
|
privateKey: PrivateKey;
|
@@ -14,28 +15,82 @@ export interface WebRTCDirectTransportComponents {
|
|
14
15
|
logger: ComponentLogger;
|
15
16
|
transportManager: TransportManager;
|
16
17
|
upgrader: Upgrader;
|
18
|
+
keychain?: Keychain;
|
19
|
+
datastore: Datastore;
|
17
20
|
}
|
18
21
|
export interface WebRTCMetrics {
|
19
22
|
dialerEvents: CounterGroup;
|
20
23
|
}
|
21
24
|
export interface WebRTCTransportDirectInit {
|
25
|
+
/**
|
26
|
+
* The default configuration used by all created RTCPeerConnections
|
27
|
+
*/
|
22
28
|
rtcConfiguration?: RTCConfiguration | (() => RTCConfiguration | Promise<RTCConfiguration>);
|
29
|
+
/**
|
30
|
+
* The default configuration used by all created RTCDataChannels
|
31
|
+
*/
|
23
32
|
dataChannel?: DataChannelOptions;
|
33
|
+
/**
|
34
|
+
* @deprecated use `certificate` instead - this option will be removed in a future release
|
35
|
+
*/
|
24
36
|
certificates?: TransportCertificate[];
|
37
|
+
/**
|
38
|
+
* Use an existing TLS certificate to secure incoming connections or supply
|
39
|
+
* settings to generate one.
|
40
|
+
*
|
41
|
+
* This must be an ECDSA certificate using the P-256 curve.
|
42
|
+
*
|
43
|
+
* From our testing we find that P-256 elliptic curve is supported by Pion,
|
44
|
+
* webrtc-rs, as well as Chromium (P-228 and P-384 was not supported in
|
45
|
+
* Chromium).
|
46
|
+
*/
|
47
|
+
certificate?: TransportCertificate;
|
25
48
|
/**
|
26
49
|
* @deprecated this setting is ignored and will be removed in a future release
|
27
50
|
*/
|
28
51
|
useLibjuice?: boolean;
|
52
|
+
/**
|
53
|
+
* The key the certificate is stored in the datastore under
|
54
|
+
*
|
55
|
+
* @default '/libp2p/webrtc-direct/certificate'
|
56
|
+
*/
|
57
|
+
certificateDatastoreKey?: string;
|
58
|
+
/**
|
59
|
+
* The name the certificate private key is stored in the keychain with
|
60
|
+
*
|
61
|
+
* @default 'webrtc-direct-certificate-private-key'
|
62
|
+
*/
|
63
|
+
certificateKeychainName?: string;
|
64
|
+
/**
|
65
|
+
* Number of days a certificate should be valid for
|
66
|
+
*
|
67
|
+
* @default 365
|
68
|
+
*/
|
69
|
+
certificateLifespan?: number;
|
70
|
+
/**
|
71
|
+
* Certificates will be renewed this many days before their expiry
|
72
|
+
*
|
73
|
+
* @default 5
|
74
|
+
*/
|
75
|
+
certificateRenewalThreshold?: number;
|
76
|
+
}
|
77
|
+
export interface WebRTCDirectTransportCertificateEvents {
|
78
|
+
'certificate:renew': CustomEvent<TransportCertificate>;
|
29
79
|
}
|
30
|
-
export declare class WebRTCDirectTransport implements Transport {
|
80
|
+
export declare class WebRTCDirectTransport implements Transport, Startable {
|
31
81
|
private readonly log;
|
32
82
|
private readonly metrics?;
|
33
83
|
private readonly components;
|
34
84
|
private readonly init;
|
85
|
+
private certificate?;
|
86
|
+
private privateKey?;
|
87
|
+
private readonly emitter;
|
35
88
|
constructor(components: WebRTCDirectTransportComponents, init?: WebRTCTransportDirectInit);
|
36
89
|
readonly [transportSymbol] = true;
|
37
90
|
readonly [Symbol.toStringTag] = "@libp2p/webrtc-direct";
|
38
91
|
readonly [serviceCapabilities]: string[];
|
92
|
+
start(): Promise<void>;
|
93
|
+
stop(): Promise<void>;
|
39
94
|
/**
|
40
95
|
* Dial a given multiaddr
|
41
96
|
*/
|
@@ -56,5 +111,11 @@ export declare class WebRTCDirectTransport implements Transport {
|
|
56
111
|
* Connect to a peer using a multiaddr
|
57
112
|
*/
|
58
113
|
_connect(ma: Multiaddr, options: DialTransportOptions<WebRTCDialEvents>): Promise<Connection>;
|
114
|
+
private getCertificate;
|
115
|
+
private loadOrCreatePrivateKey;
|
116
|
+
private loadOrCreateCertificate;
|
117
|
+
loadCertificate(dsKey: Key, keyPair: CryptoKeyPair): Promise<X509Certificate>;
|
118
|
+
createCertificate(dsKey: Key, keyPair: CryptoKeyPair): Promise<X509Certificate>;
|
119
|
+
private getKeychain;
|
59
120
|
}
|
60
121
|
//# sourceMappingURL=transport.d.ts.map
|