@libp2p/webrtc 6.0.10 → 6.0.11
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 +15 -150
- package/dist/index.min.js.map +4 -4
- package/dist/src/private-to-public/transport.browser.d.ts +58 -0
- package/dist/src/private-to-public/transport.browser.d.ts.map +1 -0
- package/dist/src/private-to-public/transport.browser.js +89 -0
- package/dist/src/private-to-public/transport.browser.js.map +1 -0
- package/dist/src/private-to-public/transport.d.ts +8 -41
- package/dist/src/private-to-public/transport.d.ts.map +1 -1
- package/dist/src/private-to-public/transport.js +13 -72
- package/dist/src/private-to-public/transport.js.map +1 -1
- package/package.json +6 -5
- package/src/private-to-public/transport.browser.ts +138 -0
- package/src/private-to-public/transport.ts +27 -113
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { serviceCapabilities, transportSymbol } from '@libp2p/interface';
|
|
2
|
+
import type { DataChannelOptions } from '../index.js';
|
|
3
|
+
import type { WebRTCDialEvents } from '../private-to-private/transport.js';
|
|
4
|
+
import type { CreateListenerOptions, Transport, Listener, ComponentLogger, Logger, Connection, CounterGroup, Metrics, PeerId, DialTransportOptions, PrivateKey, Upgrader } from '@libp2p/interface';
|
|
5
|
+
import type { TransportManager } from '@libp2p/interface-internal';
|
|
6
|
+
import type { Keychain } from '@libp2p/keychain';
|
|
7
|
+
import type { Multiaddr } from '@multiformats/multiaddr';
|
|
8
|
+
import type { Datastore } from 'interface-datastore';
|
|
9
|
+
export interface WebRTCDirectTransportComponents {
|
|
10
|
+
peerId: PeerId;
|
|
11
|
+
privateKey: PrivateKey;
|
|
12
|
+
metrics?: Metrics;
|
|
13
|
+
logger: ComponentLogger;
|
|
14
|
+
transportManager: TransportManager;
|
|
15
|
+
upgrader: Upgrader;
|
|
16
|
+
keychain?: Keychain;
|
|
17
|
+
datastore: Datastore;
|
|
18
|
+
}
|
|
19
|
+
export interface WebRTCMetrics {
|
|
20
|
+
dialerEvents: CounterGroup;
|
|
21
|
+
}
|
|
22
|
+
export interface WebRTCTransportDirectInit {
|
|
23
|
+
/**
|
|
24
|
+
* The default configuration used by all created RTCPeerConnections
|
|
25
|
+
*/
|
|
26
|
+
rtcConfiguration?: RTCConfiguration | (() => RTCConfiguration | Promise<RTCConfiguration>);
|
|
27
|
+
/**
|
|
28
|
+
* The default configuration used by all created RTCDataChannels
|
|
29
|
+
*/
|
|
30
|
+
dataChannel?: DataChannelOptions;
|
|
31
|
+
}
|
|
32
|
+
export declare class WebRTCDirectTransport implements Transport {
|
|
33
|
+
protected readonly log: Logger;
|
|
34
|
+
protected readonly metrics?: WebRTCMetrics;
|
|
35
|
+
protected readonly components: WebRTCDirectTransportComponents;
|
|
36
|
+
protected readonly init: WebRTCTransportDirectInit;
|
|
37
|
+
constructor(components: WebRTCDirectTransportComponents, init?: WebRTCTransportDirectInit);
|
|
38
|
+
readonly [transportSymbol] = true;
|
|
39
|
+
readonly [Symbol.toStringTag] = "@libp2p/webrtc-direct";
|
|
40
|
+
readonly [serviceCapabilities]: string[];
|
|
41
|
+
/**
|
|
42
|
+
* Dial a given multiaddr
|
|
43
|
+
*/
|
|
44
|
+
dial(ma: Multiaddr, options: DialTransportOptions<WebRTCDialEvents>): Promise<Connection>;
|
|
45
|
+
/**
|
|
46
|
+
* Create a transport listener - this will throw in browsers
|
|
47
|
+
*/
|
|
48
|
+
createListener(options: CreateListenerOptions): Listener;
|
|
49
|
+
/**
|
|
50
|
+
* Filter check for all Multiaddrs that this transport can listen on
|
|
51
|
+
*/
|
|
52
|
+
listenFilter(multiaddrs: Multiaddr[]): Multiaddr[];
|
|
53
|
+
/**
|
|
54
|
+
* Filter check for all Multiaddrs that this transport can dial
|
|
55
|
+
*/
|
|
56
|
+
dialFilter(multiaddrs: Multiaddr[]): Multiaddr[];
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=transport.browser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transport.browser.d.ts","sourceRoot":"","sources":["../../../src/private-to-public/transport.browser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AAQxE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAA;AACrD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAA;AAC1E,OAAO,KAAK,EAAE,qBAAqB,EAAE,SAAS,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,EAAE,UAAU,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,EAAE,oBAAoB,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AACnM,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAA;AAClE,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,+BAA+B;IAC9C,MAAM,EAAE,MAAM,CAAA;IACd,UAAU,EAAE,UAAU,CAAA;IACtB,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,MAAM,EAAE,eAAe,CAAA;IACvB,gBAAgB,EAAE,gBAAgB,CAAA;IAClC,QAAQ,EAAE,QAAQ,CAAA;IAClB,QAAQ,CAAC,EAAE,QAAQ,CAAA;IACnB,SAAS,EAAE,SAAS,CAAA;CACrB;AAED,MAAM,WAAW,aAAa;IAC5B,YAAY,EAAE,YAAY,CAAA;CAC3B;AAED,MAAM,WAAW,yBAAyB;IACxC;;OAEG;IACH,gBAAgB,CAAC,EAAE,gBAAgB,GAAG,CAAC,MAAM,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAA;IAE1F;;OAEG;IACH,WAAW,CAAC,EAAE,kBAAkB,CAAA;CACjC;AAED,qBAAa,qBAAsB,YAAW,SAAS;IACrD,SAAS,CAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IAC9B,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,aAAa,CAAA;IAC1C,SAAS,CAAC,QAAQ,CAAC,UAAU,EAAE,+BAA+B,CAAA;IAC9D,SAAS,CAAC,QAAQ,CAAC,IAAI,EAAE,yBAAyB,CAAA;gBAErC,UAAU,EAAE,+BAA+B,EAAE,IAAI,GAAE,yBAA8B;IAe9F,QAAQ,CAAC,CAAC,eAAe,CAAC,QAAO;IAEjC,QAAQ,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,2BAA0B;IAEvD,QAAQ,CAAC,CAAC,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAEvC;IAED;;OAEG;IACG,IAAI,CAAE,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,oBAAoB,CAAC,gBAAgB,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC;IA0ChG;;OAEG;IACH,cAAc,CAAE,OAAO,EAAE,qBAAqB,GAAG,QAAQ;IAIzD;;OAEG;IACH,YAAY,CAAE,UAAU,EAAE,SAAS,EAAE,GAAG,SAAS,EAAE;IAInD;;OAEG;IACH,UAAU,CAAE,UAAU,EAAE,SAAS,EAAE,GAAG,SAAS,EAAE;CAGlD"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { serviceCapabilities, transportSymbol } from '@libp2p/interface';
|
|
2
|
+
import { peerIdFromString } from '@libp2p/peer-id';
|
|
3
|
+
import { CODE_P2P } from '@multiformats/multiaddr';
|
|
4
|
+
import { WebRTCDirect } from '@multiformats/multiaddr-matcher';
|
|
5
|
+
import { UnimplementedError } from "../error.js";
|
|
6
|
+
import { genUfrag } from '../util.js';
|
|
7
|
+
import { connect } from './utils/connect.js';
|
|
8
|
+
import { createDialerRTCPeerConnection } from './utils/get-rtcpeerconnection.js';
|
|
9
|
+
export class WebRTCDirectTransport {
|
|
10
|
+
log;
|
|
11
|
+
metrics;
|
|
12
|
+
components;
|
|
13
|
+
init;
|
|
14
|
+
constructor(components, init = {}) {
|
|
15
|
+
this.log = components.logger.forComponent('libp2p:webrtc-direct');
|
|
16
|
+
this.components = components;
|
|
17
|
+
this.init = init;
|
|
18
|
+
if (components.metrics != null) {
|
|
19
|
+
this.metrics = {
|
|
20
|
+
dialerEvents: components.metrics.registerCounterGroup('libp2p_webrtc-direct_dialer_events_total', {
|
|
21
|
+
label: 'event',
|
|
22
|
+
help: 'Total count of WebRTC-direct dial events by type'
|
|
23
|
+
})
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
[transportSymbol] = true;
|
|
28
|
+
[Symbol.toStringTag] = '@libp2p/webrtc-direct';
|
|
29
|
+
[serviceCapabilities] = [
|
|
30
|
+
'@libp2p/transport'
|
|
31
|
+
];
|
|
32
|
+
/**
|
|
33
|
+
* Dial a given multiaddr
|
|
34
|
+
*/
|
|
35
|
+
async dial(ma, options) {
|
|
36
|
+
this.log('dial %a', ma);
|
|
37
|
+
// do not create RTCPeerConnection if the signal has already been aborted
|
|
38
|
+
options.signal.throwIfAborted();
|
|
39
|
+
let theirPeerId;
|
|
40
|
+
const remotePeerString = ma.getComponents().findLast(c => c.code === CODE_P2P)?.value;
|
|
41
|
+
if (remotePeerString != null) {
|
|
42
|
+
theirPeerId = peerIdFromString(remotePeerString);
|
|
43
|
+
}
|
|
44
|
+
const ufrag = genUfrag();
|
|
45
|
+
// https://github.com/libp2p/specs/blob/master/webrtc/webrtc-direct.md#browser-to-public-server
|
|
46
|
+
const { peerConnection, muxerFactory } = await createDialerRTCPeerConnection('client', ufrag, {
|
|
47
|
+
rtcConfiguration: typeof this.init.rtcConfiguration === 'function' ? await this.init.rtcConfiguration() : this.init.rtcConfiguration ?? {},
|
|
48
|
+
dataChannel: this.init.dataChannel
|
|
49
|
+
});
|
|
50
|
+
try {
|
|
51
|
+
return await connect(peerConnection, muxerFactory, ufrag, {
|
|
52
|
+
role: 'client',
|
|
53
|
+
log: this.log,
|
|
54
|
+
logger: this.components.logger,
|
|
55
|
+
events: this.metrics?.dialerEvents,
|
|
56
|
+
signal: options.signal,
|
|
57
|
+
remoteAddr: ma,
|
|
58
|
+
dataChannel: this.init.dataChannel,
|
|
59
|
+
upgrader: options.upgrader,
|
|
60
|
+
peerId: this.components.peerId,
|
|
61
|
+
remotePeer: theirPeerId,
|
|
62
|
+
privateKey: this.components.privateKey
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
catch (err) {
|
|
66
|
+
peerConnection.close();
|
|
67
|
+
throw err;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Create a transport listener - this will throw in browsers
|
|
72
|
+
*/
|
|
73
|
+
createListener(options) {
|
|
74
|
+
throw new UnimplementedError('WebRTCDirectTransport.createListener');
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Filter check for all Multiaddrs that this transport can listen on
|
|
78
|
+
*/
|
|
79
|
+
listenFilter(multiaddrs) {
|
|
80
|
+
return [];
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Filter check for all Multiaddrs that this transport can dial
|
|
84
|
+
*/
|
|
85
|
+
dialFilter(multiaddrs) {
|
|
86
|
+
return multiaddrs.filter(WebRTCDirect.exactMatch);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=transport.browser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transport.browser.js","sourceRoot":"","sources":["../../../src/private-to-public/transport.browser.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,35 +1,12 @@
|
|
|
1
|
-
import { serviceCapabilities, transportSymbol } from '@libp2p/interface';
|
|
2
1
|
import { X509Certificate } from '@peculiar/x509';
|
|
3
2
|
import { Key } from 'interface-datastore';
|
|
4
|
-
import
|
|
5
|
-
import type {
|
|
6
|
-
import type {
|
|
7
|
-
import type {
|
|
8
|
-
import type { Keychain } from '@libp2p/keychain';
|
|
3
|
+
import { WebRTCDirectTransport as WebRTCDirectBrowserTransport } from './transport.browser.js';
|
|
4
|
+
import type { TransportCertificate } from '../index.js';
|
|
5
|
+
import type { WebRTCTransportDirectInit as WebRTCTransportDirectBrowserInit, WebRTCMetrics, WebRTCDirectTransportComponents } from './transport.browser.ts';
|
|
6
|
+
import type { CreateListenerOptions, Transport, Listener, Startable } from '@libp2p/interface';
|
|
9
7
|
import type { Multiaddr } from '@multiformats/multiaddr';
|
|
10
|
-
|
|
11
|
-
export interface
|
|
12
|
-
peerId: PeerId;
|
|
13
|
-
privateKey: PrivateKey;
|
|
14
|
-
metrics?: Metrics;
|
|
15
|
-
logger: ComponentLogger;
|
|
16
|
-
transportManager: TransportManager;
|
|
17
|
-
upgrader: Upgrader;
|
|
18
|
-
keychain?: Keychain;
|
|
19
|
-
datastore: Datastore;
|
|
20
|
-
}
|
|
21
|
-
export interface WebRTCMetrics {
|
|
22
|
-
dialerEvents: CounterGroup;
|
|
23
|
-
}
|
|
24
|
-
export interface WebRTCTransportDirectInit {
|
|
25
|
-
/**
|
|
26
|
-
* The default configuration used by all created RTCPeerConnections
|
|
27
|
-
*/
|
|
28
|
-
rtcConfiguration?: RTCConfiguration | (() => RTCConfiguration | Promise<RTCConfiguration>);
|
|
29
|
-
/**
|
|
30
|
-
* The default configuration used by all created RTCDataChannels
|
|
31
|
-
*/
|
|
32
|
-
dataChannel?: DataChannelOptions;
|
|
8
|
+
export type { WebRTCMetrics, WebRTCDirectTransportComponents };
|
|
9
|
+
export interface WebRTCTransportDirectInit extends WebRTCTransportDirectBrowserInit {
|
|
33
10
|
/**
|
|
34
11
|
* Use an existing TLS certificate to secure incoming connections or supply
|
|
35
12
|
* settings to generate one.
|
|
@@ -69,25 +46,15 @@ export interface WebRTCTransportDirectInit {
|
|
|
69
46
|
export interface WebRTCDirectTransportCertificateEvents {
|
|
70
47
|
'certificate:renew': CustomEvent<TransportCertificate>;
|
|
71
48
|
}
|
|
72
|
-
export declare class WebRTCDirectTransport implements Transport, Startable {
|
|
73
|
-
private readonly log;
|
|
74
|
-
private readonly metrics?;
|
|
75
|
-
private readonly components;
|
|
76
|
-
private readonly init;
|
|
49
|
+
export declare class WebRTCDirectTransport extends WebRTCDirectBrowserTransport implements Transport, Startable {
|
|
77
50
|
private certificate?;
|
|
78
51
|
private privateKey?;
|
|
79
52
|
private readonly emitter;
|
|
80
53
|
private renewCertificateTask?;
|
|
54
|
+
private certInit;
|
|
81
55
|
constructor(components: WebRTCDirectTransportComponents, init?: WebRTCTransportDirectInit);
|
|
82
|
-
readonly [transportSymbol] = true;
|
|
83
|
-
readonly [Symbol.toStringTag] = "@libp2p/webrtc-direct";
|
|
84
|
-
readonly [serviceCapabilities]: string[];
|
|
85
56
|
start(): Promise<void>;
|
|
86
57
|
stop(): Promise<void>;
|
|
87
|
-
/**
|
|
88
|
-
* Dial a given multiaddr
|
|
89
|
-
*/
|
|
90
|
-
dial(ma: Multiaddr, options: DialTransportOptions<WebRTCDialEvents>): Promise<Connection>;
|
|
91
58
|
/**
|
|
92
59
|
* Create a transport listener - this will throw in browsers
|
|
93
60
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../../../src/private-to-public/transport.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../../../src/private-to-public/transport.ts"],"names":[],"mappings":"AAGA,OAAO,EAA6B,eAAe,EAA4B,MAAM,gBAAgB,CAAA;AACrG,OAAO,EAAE,GAAG,EAAE,MAAM,qBAAqB,CAAA;AAQzC,OAAO,EAAE,qBAAqB,IAAI,4BAA4B,EAAE,MAAM,wBAAwB,CAAA;AAE9F,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAA;AACvD,OAAO,KAAK,EAAE,yBAAyB,IAAI,gCAAgC,EAAE,aAAa,EAAE,+BAA+B,EAAE,MAAM,wBAAwB,CAAA;AAC3J,OAAO,KAAK,EAAE,qBAAqB,EAAE,SAAS,EAAE,QAAQ,EAAc,SAAS,EAAE,MAAM,mBAAmB,CAAA;AAE1G,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAA;AAGxD,YAAY,EAAE,aAAa,EAAE,+BAA+B,EAAE,CAAA;AAE9D,MAAM,WAAW,yBAA0B,SAAQ,gCAAgC;IACjF;;;;;;;;;OASG;IACH,WAAW,CAAC,EAAE,oBAAoB,CAAA;IAElC;;;;OAIG;IACH,uBAAuB,CAAC,EAAE,MAAM,CAAA;IAEhC;;;;OAIG;IACH,uBAAuB,CAAC,EAAE,MAAM,CAAA;IAEhC;;;;OAIG;IACH,mBAAmB,CAAC,EAAE,MAAM,CAAA;IAE5B;;;;OAIG;IACH,2BAA2B,CAAC,EAAE,MAAM,CAAA;CACrC;AAED,MAAM,WAAW,sCAAsC;IACrD,mBAAmB,EAAE,WAAW,CAAC,oBAAoB,CAAC,CAAA;CACvD;AAUD,qBAAa,qBAAsB,SAAQ,4BAA6B,YAAW,SAAS,EAAE,SAAS;IACrG,OAAO,CAAC,WAAW,CAAC,CAAsB;IAC1C,OAAO,CAAC,UAAU,CAAC,CAAY;IAC/B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA0D;IAClF,OAAO,CAAC,oBAAoB,CAAC,CAA+B;IAC5D,OAAO,CAAC,QAAQ,CAAU;gBAEb,UAAU,EAAE,+BAA+B,EAAE,IAAI,GAAE,yBAA8B;IAWxF,KAAK,IAAK,OAAO,CAAC,IAAI,CAAC;IAIvB,IAAI,IAAK,OAAO,CAAC,IAAI,CAAC;IAQ5B;;OAEG;IACH,cAAc,CAAE,OAAO,EAAE,qBAAqB,GAAG,QAAQ;IAazD;;OAEG;IACH,YAAY,CAAE,UAAU,EAAE,SAAS,EAAE,GAAG,SAAS,EAAE;IAInD;;OAEG;IACH,UAAU,CAAE,UAAU,EAAE,SAAS,EAAE,GAAG,SAAS,EAAE;YAInC,cAAc;YAgBd,sBAAsB;YAmCtB,uBAAuB;IAuD/B,eAAe,CAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,eAAe,CAAC;IAiC9E,iBAAiB,CAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,eAAe,CAAC;IA6BtF,OAAO,CAAC,WAAW;CAKpB"}
|
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
import { generateKeyPair, privateKeyToCryptoKeyPair } from '@libp2p/crypto/keys';
|
|
2
|
-
import { InvalidParametersError, NotFoundError, NotStartedError
|
|
3
|
-
import { peerIdFromString } from '@libp2p/peer-id';
|
|
4
|
-
import { CODE_P2P } from '@multiformats/multiaddr';
|
|
2
|
+
import { InvalidParametersError, NotFoundError, NotStartedError } from '@libp2p/interface';
|
|
5
3
|
import { WebRTCDirect } from '@multiformats/multiaddr-matcher';
|
|
6
4
|
import { BasicConstraintsExtension, X509Certificate, X509CertificateGenerator } from '@peculiar/x509';
|
|
7
5
|
import { Key } from 'interface-datastore';
|
|
@@ -11,42 +9,23 @@ import { sha256 } from 'multiformats/hashes/sha2';
|
|
|
11
9
|
import { equals as uint8ArrayEquals } from 'uint8arrays/equals';
|
|
12
10
|
import { fromString as uint8ArrayFromString } from 'uint8arrays/from-string';
|
|
13
11
|
import { DEFAULT_CERTIFICATE_DATASTORE_KEY, DEFAULT_CERTIFICATE_LIFESPAN, DEFAULT_CERTIFICATE_PRIVATE_KEY_NAME, DEFAULT_CERTIFICATE_RENEWAL_THRESHOLD } from '../constants.js';
|
|
14
|
-
import { genUfrag } from '../util.js';
|
|
15
12
|
import { WebRTCDirectListener } from './listener.js';
|
|
16
|
-
import {
|
|
17
|
-
import { createDialerRTCPeerConnection } from './utils/get-rtcpeerconnection.js';
|
|
13
|
+
import { WebRTCDirectTransport as WebRTCDirectBrowserTransport } from './transport.browser.js';
|
|
18
14
|
import { formatAsPem } from './utils/pem.js';
|
|
19
|
-
export class WebRTCDirectTransport {
|
|
20
|
-
log;
|
|
21
|
-
metrics;
|
|
22
|
-
components;
|
|
23
|
-
init;
|
|
15
|
+
export class WebRTCDirectTransport extends WebRTCDirectBrowserTransport {
|
|
24
16
|
certificate;
|
|
25
17
|
privateKey;
|
|
26
18
|
emitter;
|
|
27
19
|
renewCertificateTask;
|
|
20
|
+
certInit;
|
|
28
21
|
constructor(components, init = {}) {
|
|
29
|
-
|
|
30
|
-
this.components = components;
|
|
31
|
-
this.init = init;
|
|
22
|
+
super(components, init);
|
|
32
23
|
this.emitter = new TypedEventEmitter();
|
|
24
|
+
this.certInit = init;
|
|
33
25
|
if (init.certificateLifespan != null && init.certificateRenewalThreshold != null && init.certificateRenewalThreshold >= init.certificateLifespan) {
|
|
34
26
|
throw new InvalidParametersError('Certificate renewal threshold must be less than certificate lifespan');
|
|
35
27
|
}
|
|
36
|
-
if (components.metrics != null) {
|
|
37
|
-
this.metrics = {
|
|
38
|
-
dialerEvents: components.metrics.registerCounterGroup('libp2p_webrtc-direct_dialer_events_total', {
|
|
39
|
-
label: 'event',
|
|
40
|
-
help: 'Total count of WebRTC-direct dial events by type'
|
|
41
|
-
})
|
|
42
|
-
};
|
|
43
|
-
}
|
|
44
28
|
}
|
|
45
|
-
[transportSymbol] = true;
|
|
46
|
-
[Symbol.toStringTag] = '@libp2p/webrtc-direct';
|
|
47
|
-
[serviceCapabilities] = [
|
|
48
|
-
'@libp2p/transport'
|
|
49
|
-
];
|
|
50
29
|
async start() {
|
|
51
30
|
this.certificate = await this.getCertificate();
|
|
52
31
|
}
|
|
@@ -56,44 +35,6 @@ export class WebRTCDirectTransport {
|
|
|
56
35
|
}
|
|
57
36
|
this.certificate = undefined;
|
|
58
37
|
}
|
|
59
|
-
/**
|
|
60
|
-
* Dial a given multiaddr
|
|
61
|
-
*/
|
|
62
|
-
async dial(ma, options) {
|
|
63
|
-
this.log('dial %a', ma);
|
|
64
|
-
// do not create RTCPeerConnection if the signal has already been aborted
|
|
65
|
-
options.signal.throwIfAborted();
|
|
66
|
-
let theirPeerId;
|
|
67
|
-
const remotePeerString = ma.getComponents().findLast(c => c.code === CODE_P2P)?.value;
|
|
68
|
-
if (remotePeerString != null) {
|
|
69
|
-
theirPeerId = peerIdFromString(remotePeerString);
|
|
70
|
-
}
|
|
71
|
-
const ufrag = genUfrag();
|
|
72
|
-
// https://github.com/libp2p/specs/blob/master/webrtc/webrtc-direct.md#browser-to-public-server
|
|
73
|
-
const { peerConnection, muxerFactory } = await createDialerRTCPeerConnection('client', ufrag, {
|
|
74
|
-
rtcConfiguration: typeof this.init.rtcConfiguration === 'function' ? await this.init.rtcConfiguration() : this.init.rtcConfiguration ?? {},
|
|
75
|
-
dataChannel: this.init.dataChannel
|
|
76
|
-
});
|
|
77
|
-
try {
|
|
78
|
-
return await connect(peerConnection, muxerFactory, ufrag, {
|
|
79
|
-
role: 'client',
|
|
80
|
-
log: this.log,
|
|
81
|
-
logger: this.components.logger,
|
|
82
|
-
events: this.metrics?.dialerEvents,
|
|
83
|
-
signal: options.signal,
|
|
84
|
-
remoteAddr: ma,
|
|
85
|
-
dataChannel: this.init.dataChannel,
|
|
86
|
-
upgrader: options.upgrader,
|
|
87
|
-
peerId: this.components.peerId,
|
|
88
|
-
remotePeer: theirPeerId,
|
|
89
|
-
privateKey: this.components.privateKey
|
|
90
|
-
});
|
|
91
|
-
}
|
|
92
|
-
catch (err) {
|
|
93
|
-
peerConnection.close();
|
|
94
|
-
throw err;
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
38
|
/**
|
|
98
39
|
* Create a transport listener - this will throw in browsers
|
|
99
40
|
*/
|
|
@@ -121,9 +62,9 @@ export class WebRTCDirectTransport {
|
|
|
121
62
|
return this.listenFilter(multiaddrs);
|
|
122
63
|
}
|
|
123
64
|
async getCertificate(forceRenew) {
|
|
124
|
-
if (isTransportCertificate(this.
|
|
65
|
+
if (isTransportCertificate(this.certInit.certificate)) {
|
|
125
66
|
this.log('using provided TLS certificate');
|
|
126
|
-
return this.
|
|
67
|
+
return this.certInit.certificate;
|
|
127
68
|
}
|
|
128
69
|
const privateKey = await this.loadOrCreatePrivateKey();
|
|
129
70
|
const { pem, certhash } = await this.loadOrCreateCertificate(privateKey, forceRenew);
|
|
@@ -137,7 +78,7 @@ export class WebRTCDirectTransport {
|
|
|
137
78
|
if (this.privateKey != null) {
|
|
138
79
|
return this.privateKey;
|
|
139
80
|
}
|
|
140
|
-
const keychainName = this.
|
|
81
|
+
const keychainName = this.certInit.certificateKeychainName ?? DEFAULT_CERTIFICATE_PRIVATE_KEY_NAME;
|
|
141
82
|
const keychain = this.getKeychain();
|
|
142
83
|
try {
|
|
143
84
|
if (keychain == null) {
|
|
@@ -168,7 +109,7 @@ export class WebRTCDirectTransport {
|
|
|
168
109
|
return this.certificate;
|
|
169
110
|
}
|
|
170
111
|
let cert;
|
|
171
|
-
const dsKey = new Key(this.
|
|
112
|
+
const dsKey = new Key(this.certInit.certificateDatastoreKey ?? DEFAULT_CERTIFICATE_DATASTORE_KEY);
|
|
172
113
|
const keyPair = await privateKeyToCryptoKeyPair(privateKey);
|
|
173
114
|
try {
|
|
174
115
|
if (forceRenew === true) {
|
|
@@ -186,7 +127,7 @@ export class WebRTCDirectTransport {
|
|
|
186
127
|
cert = await this.createCertificate(dsKey, keyPair);
|
|
187
128
|
}
|
|
188
129
|
// set timeout to renew certificate
|
|
189
|
-
let renewTime = (cert.notAfter.getTime() - (this.
|
|
130
|
+
let renewTime = (cert.notAfter.getTime() - (this.certInit.certificateRenewalThreshold ?? DEFAULT_CERTIFICATE_RENEWAL_THRESHOLD)) - Date.now();
|
|
190
131
|
if (renewTime < 0) {
|
|
191
132
|
renewTime = 100;
|
|
192
133
|
}
|
|
@@ -213,7 +154,7 @@ export class WebRTCDirectTransport {
|
|
|
213
154
|
const buf = await this.components.datastore.get(dsKey);
|
|
214
155
|
const cert = new X509Certificate(buf);
|
|
215
156
|
// check expiry date
|
|
216
|
-
const expiryTime = cert.notAfter.getTime() - (this.
|
|
157
|
+
const expiryTime = cert.notAfter.getTime() - (this.certInit.certificateRenewalThreshold ?? DEFAULT_CERTIFICATE_RENEWAL_THRESHOLD);
|
|
217
158
|
if (Date.now() > expiryTime) {
|
|
218
159
|
this.log('stored TLS certificate has expired');
|
|
219
160
|
// act as if no certificate was present
|
|
@@ -233,7 +174,7 @@ export class WebRTCDirectTransport {
|
|
|
233
174
|
}
|
|
234
175
|
async createCertificate(dsKey, keyPair) {
|
|
235
176
|
const notBefore = new Date();
|
|
236
|
-
const notAfter = new Date(Date.now() + (this.
|
|
177
|
+
const notAfter = new Date(Date.now() + (this.certInit.certificateLifespan ?? DEFAULT_CERTIFICATE_LIFESPAN));
|
|
237
178
|
// have to set ms to 0 to work around https://github.com/PeculiarVentures/x509/issues/73
|
|
238
179
|
notBefore.setMilliseconds(0);
|
|
239
180
|
notAfter.setMilliseconds(0);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transport.js","sourceRoot":"","sources":["../../../src/private-to-public/transport.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAA;AAChF,OAAO,EAAE,sBAAsB,EAAE,aAAa,EAAE,eAAe,EAAE,
|
|
1
|
+
{"version":3,"file":"transport.js","sourceRoot":"","sources":["../../../src/private-to-public/transport.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@libp2p/webrtc",
|
|
3
|
-
"version": "6.0.
|
|
3
|
+
"version": "6.0.11",
|
|
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",
|
|
@@ -33,7 +33,7 @@
|
|
|
33
33
|
"generate": "protons src/private-to-private/pb/message.proto",
|
|
34
34
|
"build": "aegir build",
|
|
35
35
|
"test": "aegir test -t node -t browser",
|
|
36
|
-
"test:node": "aegir test -t node --cov",
|
|
36
|
+
"test:node": "aegir test -t node --cov -- --exit",
|
|
37
37
|
"test:chrome": "aegir test -t browser --cov",
|
|
38
38
|
"test:firefox": "aegir test -t browser -- --browser firefox",
|
|
39
39
|
"test:webkit": "aegir test -t browser -- --browser webkit",
|
|
@@ -47,11 +47,11 @@
|
|
|
47
47
|
"@chainsafe/is-ip": "^2.1.0",
|
|
48
48
|
"@libp2p/crypto": "^5.1.13",
|
|
49
49
|
"@libp2p/interface": "^3.1.0",
|
|
50
|
-
"@libp2p/interface-internal": "^3.0.
|
|
51
|
-
"@libp2p/keychain": "^6.0.
|
|
50
|
+
"@libp2p/interface-internal": "^3.0.10",
|
|
51
|
+
"@libp2p/keychain": "^6.0.10",
|
|
52
52
|
"@chainsafe/libp2p-noise": "^17.0.0",
|
|
53
53
|
"@libp2p/peer-id": "^6.0.4",
|
|
54
|
-
"@libp2p/utils": "^7.0.
|
|
54
|
+
"@libp2p/utils": "^7.0.10",
|
|
55
55
|
"@multiformats/multiaddr": "^13.0.1",
|
|
56
56
|
"@multiformats/multiaddr-matcher": "^3.0.1",
|
|
57
57
|
"@peculiar/webcrypto": "^1.5.0",
|
|
@@ -94,6 +94,7 @@
|
|
|
94
94
|
"browser": {
|
|
95
95
|
"./dist/src/webrtc/index.js": "./dist/src/webrtc/index.browser.js",
|
|
96
96
|
"./dist/src/private-to-public/listener.js": "./dist/src/private-to-public/listener.browser.js",
|
|
97
|
+
"./dist/src/private-to-public/transport.js": "./dist/src/private-to-public/transport.browser.js",
|
|
97
98
|
"./dist/src/private-to-public/utils/get-rtcpeerconnection.js": "./dist/src/private-to-public/utils/get-rtcpeerconnection.browser.js",
|
|
98
99
|
"node:net": false,
|
|
99
100
|
"node:os": false
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import { serviceCapabilities, transportSymbol } from '@libp2p/interface'
|
|
2
|
+
import { peerIdFromString } from '@libp2p/peer-id'
|
|
3
|
+
import { CODE_P2P } from '@multiformats/multiaddr'
|
|
4
|
+
import { WebRTCDirect } from '@multiformats/multiaddr-matcher'
|
|
5
|
+
import { UnimplementedError } from '../error.ts'
|
|
6
|
+
import { genUfrag } from '../util.js'
|
|
7
|
+
import { connect } from './utils/connect.js'
|
|
8
|
+
import { createDialerRTCPeerConnection } from './utils/get-rtcpeerconnection.js'
|
|
9
|
+
import type { DataChannelOptions } from '../index.js'
|
|
10
|
+
import type { WebRTCDialEvents } from '../private-to-private/transport.js'
|
|
11
|
+
import type { CreateListenerOptions, Transport, Listener, ComponentLogger, Logger, Connection, CounterGroup, Metrics, PeerId, DialTransportOptions, PrivateKey, Upgrader } from '@libp2p/interface'
|
|
12
|
+
import type { TransportManager } from '@libp2p/interface-internal'
|
|
13
|
+
import type { Keychain } from '@libp2p/keychain'
|
|
14
|
+
import type { Multiaddr } from '@multiformats/multiaddr'
|
|
15
|
+
import type { Datastore } from 'interface-datastore'
|
|
16
|
+
|
|
17
|
+
export interface WebRTCDirectTransportComponents {
|
|
18
|
+
peerId: PeerId
|
|
19
|
+
privateKey: PrivateKey
|
|
20
|
+
metrics?: Metrics
|
|
21
|
+
logger: ComponentLogger
|
|
22
|
+
transportManager: TransportManager
|
|
23
|
+
upgrader: Upgrader
|
|
24
|
+
keychain?: Keychain
|
|
25
|
+
datastore: Datastore
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export interface WebRTCMetrics {
|
|
29
|
+
dialerEvents: CounterGroup
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export interface WebRTCTransportDirectInit {
|
|
33
|
+
/**
|
|
34
|
+
* The default configuration used by all created RTCPeerConnections
|
|
35
|
+
*/
|
|
36
|
+
rtcConfiguration?: RTCConfiguration | (() => RTCConfiguration | Promise<RTCConfiguration>)
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* The default configuration used by all created RTCDataChannels
|
|
40
|
+
*/
|
|
41
|
+
dataChannel?: DataChannelOptions
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export class WebRTCDirectTransport implements Transport {
|
|
45
|
+
protected readonly log: Logger
|
|
46
|
+
protected readonly metrics?: WebRTCMetrics
|
|
47
|
+
protected readonly components: WebRTCDirectTransportComponents
|
|
48
|
+
protected readonly init: WebRTCTransportDirectInit
|
|
49
|
+
|
|
50
|
+
constructor (components: WebRTCDirectTransportComponents, init: WebRTCTransportDirectInit = {}) {
|
|
51
|
+
this.log = components.logger.forComponent('libp2p:webrtc-direct')
|
|
52
|
+
this.components = components
|
|
53
|
+
this.init = init
|
|
54
|
+
|
|
55
|
+
if (components.metrics != null) {
|
|
56
|
+
this.metrics = {
|
|
57
|
+
dialerEvents: components.metrics.registerCounterGroup('libp2p_webrtc-direct_dialer_events_total', {
|
|
58
|
+
label: 'event',
|
|
59
|
+
help: 'Total count of WebRTC-direct dial events by type'
|
|
60
|
+
})
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
readonly [transportSymbol] = true
|
|
66
|
+
|
|
67
|
+
readonly [Symbol.toStringTag] = '@libp2p/webrtc-direct'
|
|
68
|
+
|
|
69
|
+
readonly [serviceCapabilities]: string[] = [
|
|
70
|
+
'@libp2p/transport'
|
|
71
|
+
]
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Dial a given multiaddr
|
|
75
|
+
*/
|
|
76
|
+
async dial (ma: Multiaddr, options: DialTransportOptions<WebRTCDialEvents>): Promise<Connection> {
|
|
77
|
+
this.log('dial %a', ma)
|
|
78
|
+
// do not create RTCPeerConnection if the signal has already been aborted
|
|
79
|
+
options.signal.throwIfAborted()
|
|
80
|
+
|
|
81
|
+
let theirPeerId: PeerId | undefined
|
|
82
|
+
const remotePeerString = ma.getComponents().findLast(c => c.code === CODE_P2P)?.value
|
|
83
|
+
if (remotePeerString != null) {
|
|
84
|
+
theirPeerId = peerIdFromString(remotePeerString)
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
const ufrag = genUfrag()
|
|
88
|
+
|
|
89
|
+
// https://github.com/libp2p/specs/blob/master/webrtc/webrtc-direct.md#browser-to-public-server
|
|
90
|
+
const {
|
|
91
|
+
peerConnection,
|
|
92
|
+
muxerFactory
|
|
93
|
+
} = await createDialerRTCPeerConnection('client', ufrag, {
|
|
94
|
+
rtcConfiguration: typeof this.init.rtcConfiguration === 'function' ? await this.init.rtcConfiguration() : this.init.rtcConfiguration ?? {},
|
|
95
|
+
dataChannel: this.init.dataChannel
|
|
96
|
+
})
|
|
97
|
+
|
|
98
|
+
try {
|
|
99
|
+
return await connect(peerConnection, muxerFactory, ufrag, {
|
|
100
|
+
role: 'client',
|
|
101
|
+
log: this.log,
|
|
102
|
+
logger: this.components.logger,
|
|
103
|
+
events: this.metrics?.dialerEvents,
|
|
104
|
+
signal: options.signal,
|
|
105
|
+
remoteAddr: ma,
|
|
106
|
+
dataChannel: this.init.dataChannel,
|
|
107
|
+
upgrader: options.upgrader,
|
|
108
|
+
peerId: this.components.peerId,
|
|
109
|
+
remotePeer: theirPeerId,
|
|
110
|
+
privateKey: this.components.privateKey
|
|
111
|
+
})
|
|
112
|
+
} catch (err) {
|
|
113
|
+
peerConnection.close()
|
|
114
|
+
throw err
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* Create a transport listener - this will throw in browsers
|
|
120
|
+
*/
|
|
121
|
+
createListener (options: CreateListenerOptions): Listener {
|
|
122
|
+
throw new UnimplementedError('WebRTCDirectTransport.createListener')
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* Filter check for all Multiaddrs that this transport can listen on
|
|
127
|
+
*/
|
|
128
|
+
listenFilter (multiaddrs: Multiaddr[]): Multiaddr[] {
|
|
129
|
+
return []
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
/**
|
|
133
|
+
* Filter check for all Multiaddrs that this transport can dial
|
|
134
|
+
*/
|
|
135
|
+
dialFilter (multiaddrs: Multiaddr[]): Multiaddr[] {
|
|
136
|
+
return multiaddrs.filter(WebRTCDirect.exactMatch)
|
|
137
|
+
}
|
|
138
|
+
}
|