@libp2p/webrtc 6.0.2-39e2e541a → 6.0.2-8d66d5ff1
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 +6 -6
- package/dist/index.min.js.map +3 -3
- package/dist/src/muxer.d.ts +8 -0
- package/dist/src/muxer.d.ts.map +1 -1
- package/dist/src/muxer.js +38 -15
- package/dist/src/muxer.js.map +1 -1
- package/dist/src/private-to-private/initiate-connection.d.ts +1 -2
- package/dist/src/private-to-private/initiate-connection.d.ts.map +1 -1
- package/dist/src/private-to-private/initiate-connection.js +1 -0
- package/dist/src/private-to-private/initiate-connection.js.map +1 -1
- package/dist/src/private-to-private/transport.d.ts.map +1 -1
- package/dist/src/private-to-private/transport.js +2 -0
- package/dist/src/private-to-private/transport.js.map +1 -1
- package/dist/src/private-to-public/listener.d.ts +1 -0
- package/dist/src/private-to-public/listener.d.ts.map +1 -1
- package/dist/src/private-to-public/listener.js +8 -3
- package/dist/src/private-to-public/listener.js.map +1 -1
- package/dist/src/private-to-public/transport.d.ts.map +1 -1
- package/dist/src/private-to-public/transport.js +5 -3
- package/dist/src/private-to-public/transport.js.map +1 -1
- package/dist/src/private-to-public/utils/connect.d.ts +4 -4
- package/dist/src/private-to-public/utils/connect.d.ts.map +1 -1
- package/dist/src/private-to-public/utils/connect.js +6 -8
- package/dist/src/private-to-public/utils/connect.js.map +1 -1
- package/dist/src/private-to-public/utils/get-rtcpeerconnection.browser.d.ts +6 -1
- package/dist/src/private-to-public/utils/get-rtcpeerconnection.browser.d.ts.map +1 -1
- package/dist/src/private-to-public/utils/get-rtcpeerconnection.browser.js +15 -3
- package/dist/src/private-to-public/utils/get-rtcpeerconnection.browser.js.map +1 -1
- package/dist/src/private-to-public/utils/get-rtcpeerconnection.d.ts +17 -2
- package/dist/src/private-to-public/utils/get-rtcpeerconnection.d.ts.map +1 -1
- package/dist/src/private-to-public/utils/get-rtcpeerconnection.js +18 -7
- package/dist/src/private-to-public/utils/get-rtcpeerconnection.js.map +1 -1
- package/dist/src/rtcpeerconnection-to-conn.d.ts +0 -1
- package/dist/src/rtcpeerconnection-to-conn.d.ts.map +1 -1
- package/dist/src/rtcpeerconnection-to-conn.js.map +1 -1
- package/dist/src/stream.d.ts.map +1 -1
- package/dist/src/stream.js +24 -16
- package/dist/src/stream.js.map +1 -1
- package/package.json +8 -8
- package/src/muxer.ts +50 -15
- package/src/private-to-private/initiate-connection.ts +2 -1
- package/src/private-to-private/transport.ts +3 -1
- package/src/private-to-public/listener.ts +9 -3
- package/src/private-to-public/transport.ts +8 -3
- package/src/private-to-public/utils/connect.ts +10 -13
- package/src/private-to-public/utils/get-rtcpeerconnection.browser.ts +20 -3
- package/src/private-to-public/utils/get-rtcpeerconnection.ts +31 -8
- package/src/rtcpeerconnection-to-conn.ts +0 -1
- package/src/stream.ts +25 -17
@@ -1,6 +1,8 @@
|
|
1
1
|
import { PeerConnection } from 'node-datachannel';
|
2
2
|
import { RTCPeerConnection } from 'node-datachannel/polyfill';
|
3
|
-
import
|
3
|
+
import { DataChannelMuxerFactory } from '../../muxer.ts';
|
4
|
+
import type { DataChannelOptions, TransportCertificate } from '../../index.js';
|
5
|
+
import type { CounterGroup } from '@libp2p/interface';
|
4
6
|
import type { CertificateFingerprint } from 'node-datachannel';
|
5
7
|
interface DirectRTCPeerConnectionInit extends RTCConfiguration {
|
6
8
|
ufrag: string;
|
@@ -14,6 +16,19 @@ export declare class DirectRTCPeerConnection extends RTCPeerConnection {
|
|
14
16
|
createAnswer(): Promise<globalThis.RTCSessionDescriptionInit | any>;
|
15
17
|
remoteFingerprint(): CertificateFingerprint;
|
16
18
|
}
|
17
|
-
export
|
19
|
+
export interface CreateDialerRTCPeerConnectionOptions {
|
20
|
+
rtcConfiguration?: RTCConfiguration | (() => RTCConfiguration | Promise<RTCConfiguration>);
|
21
|
+
certificate?: TransportCertificate;
|
22
|
+
events?: CounterGroup;
|
23
|
+
dataChannel?: DataChannelOptions;
|
24
|
+
}
|
25
|
+
export declare function createDialerRTCPeerConnection(role: 'client', ufrag: string, options?: CreateDialerRTCPeerConnectionOptions): Promise<{
|
26
|
+
peerConnection: globalThis.RTCPeerConnection;
|
27
|
+
muxerFactory: DataChannelMuxerFactory;
|
28
|
+
}>;
|
29
|
+
export declare function createDialerRTCPeerConnection(role: 'server', ufrag: string, options?: CreateDialerRTCPeerConnectionOptions): Promise<{
|
30
|
+
peerConnection: DirectRTCPeerConnection;
|
31
|
+
muxerFactory: DataChannelMuxerFactory;
|
32
|
+
}>;
|
18
33
|
export {};
|
19
34
|
//# sourceMappingURL=get-rtcpeerconnection.d.ts.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"get-rtcpeerconnection.d.ts","sourceRoot":"","sources":["../../../../src/private-to-public/utils/get-rtcpeerconnection.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAA;
|
1
|
+
{"version":3,"file":"get-rtcpeerconnection.d.ts","sourceRoot":"","sources":["../../../../src/private-to-public/utils/get-rtcpeerconnection.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAA;AAE7D,OAAO,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAA;AAExD,OAAO,KAAK,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAA;AAC9E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AACrD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAA;AAI9D,UAAU,2BAA4B,SAAQ,gBAAgB;IAC5D,KAAK,EAAE,MAAM,CAAA;IACb,cAAc,EAAE,cAAc,CAAA;CAC/B;AAED,qBAAa,uBAAwB,SAAQ,iBAAiB;IAC5D,OAAO,CAAC,cAAc,CAAgB;IACtC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAQ;gBAEjB,IAAI,EAAE,2BAA2B;IAmBxC,WAAW,IAAK,OAAO,CAAC,UAAU,CAAC,yBAAyB,GAAG,GAAG,CAAC;IAYnE,YAAY,IAAK,OAAO,CAAC,UAAU,CAAC,yBAAyB,GAAG,GAAG,CAAC;IAY1E,iBAAiB,IAAK,sBAAsB;CAO7C;AAkBD,MAAM,WAAW,oCAAoC;IACnD,gBAAgB,CAAC,EAAE,gBAAgB,GAAG,CAAC,MAAM,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAA;IAC1F,WAAW,CAAC,EAAE,oBAAoB,CAAA;IAClC,MAAM,CAAC,EAAE,YAAY,CAAA;IACrB,WAAW,CAAC,EAAE,kBAAkB,CAAA;CACjC;AAED,wBAAsB,6BAA6B,CAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,oCAAoC,GAAG,OAAO,CAAC;IAAE,cAAc,EAAE,UAAU,CAAC,iBAAiB,CAAC;IAAC,YAAY,EAAE,uBAAuB,CAAA;CAAE,CAAC,CAAA;AACrO,wBAAsB,6BAA6B,CAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,oCAAoC,GAAG,OAAO,CAAC;IAAE,cAAc,EAAE,uBAAuB,CAAC;IAAC,YAAY,EAAE,uBAAuB,CAAA;CAAE,CAAC,CAAA"}
|
@@ -2,6 +2,7 @@ import { Crypto } from '@peculiar/webcrypto';
|
|
2
2
|
import { PeerConnection } from 'node-datachannel';
|
3
3
|
import { RTCPeerConnection } from 'node-datachannel/polyfill';
|
4
4
|
import { DEFAULT_ICE_SERVERS, MAX_MESSAGE_SIZE } from '../../constants.js';
|
5
|
+
import { DataChannelMuxerFactory } from "../../muxer.js";
|
5
6
|
import { generateTransportCertificate } from './generate-certificates.js';
|
6
7
|
const crypto = new Crypto();
|
7
8
|
export class DirectRTCPeerConnection extends RTCPeerConnection {
|
@@ -64,8 +65,8 @@ function mapIceServers(iceServers) {
|
|
64
65
|
})
|
65
66
|
.flat() ?? [];
|
66
67
|
}
|
67
|
-
export async function createDialerRTCPeerConnection(role, ufrag,
|
68
|
-
if (certificate == null) {
|
68
|
+
export async function createDialerRTCPeerConnection(role, ufrag, options = {}) {
|
69
|
+
if (options.certificate == null) {
|
69
70
|
// ECDSA is preferred over RSA here. From our testing we find that P-256
|
70
71
|
// elliptic curve is supported by Pion, webrtc-rs, as well as Chromium
|
71
72
|
// (P-228 and P-384 was not supported in Chromium). We use the same hash
|
@@ -74,23 +75,33 @@ export async function createDialerRTCPeerConnection(role, ufrag, rtcConfiguratio
|
|
74
75
|
name: 'ECDSA',
|
75
76
|
namedCurve: 'P-256'
|
76
77
|
}, true, ['sign', 'verify']);
|
77
|
-
certificate = await generateTransportCertificate(keyPair, {
|
78
|
+
options.certificate = await generateTransportCertificate(keyPair, {
|
78
79
|
days: 365
|
79
80
|
});
|
80
81
|
}
|
81
|
-
const rtcConfig = typeof rtcConfiguration === 'function' ? await rtcConfiguration() : rtcConfiguration;
|
82
|
-
|
82
|
+
const rtcConfig = typeof options.rtcConfiguration === 'function' ? await options.rtcConfiguration() : options.rtcConfiguration;
|
83
|
+
const peerConnection = new DirectRTCPeerConnection({
|
83
84
|
...rtcConfig,
|
84
85
|
ufrag,
|
85
86
|
peerConnection: new PeerConnection(`${role}-${Date.now()}`, {
|
86
87
|
disableFingerprintVerification: true,
|
87
88
|
disableAutoNegotiation: true,
|
88
|
-
certificatePemFile: certificate.pem,
|
89
|
-
keyPemFile: certificate.privateKey,
|
89
|
+
certificatePemFile: options.certificate.pem,
|
90
|
+
keyPemFile: options.certificate.privateKey,
|
90
91
|
enableIceUdpMux: role === 'server',
|
91
92
|
maxMessageSize: MAX_MESSAGE_SIZE,
|
92
93
|
iceServers: mapIceServers(rtcConfig?.iceServers ?? DEFAULT_ICE_SERVERS.map(urls => ({ urls })))
|
93
94
|
})
|
94
95
|
});
|
96
|
+
const muxerFactory = new DataChannelMuxerFactory({
|
97
|
+
// @ts-expect-error https://github.com/murat-dogan/node-datachannel/pull/370
|
98
|
+
peerConnection,
|
99
|
+
metrics: options.events,
|
100
|
+
dataChannelOptions: options.dataChannel
|
101
|
+
});
|
102
|
+
return {
|
103
|
+
peerConnection,
|
104
|
+
muxerFactory
|
105
|
+
};
|
95
106
|
}
|
96
107
|
//# sourceMappingURL=get-rtcpeerconnection.js.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"get-rtcpeerconnection.js","sourceRoot":"","sources":["../../../../src/private-to-public/utils/get-rtcpeerconnection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAA;AAC7D,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AAC1E,OAAO,EAAE,4BAA4B,EAAE,MAAM,4BAA4B,CAAA;
|
1
|
+
{"version":3,"file":"get-rtcpeerconnection.js","sourceRoot":"","sources":["../../../../src/private-to-public/utils/get-rtcpeerconnection.ts"],"names":[],"mappings":"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"}
|
@@ -1,4 +1,3 @@
|
|
1
|
-
import type { RTCPeerConnection } from './webrtc/index.js';
|
2
1
|
import type { MultiaddrConnection } from '@libp2p/interface';
|
3
2
|
import type { AbstractMultiaddrConnectionInit } from '@libp2p/utils';
|
4
3
|
export interface RTCPeerConnectionMultiaddrConnectionInit extends Omit<AbstractMultiaddrConnectionInit, 'stream'> {
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"rtcpeerconnection-to-conn.d.ts","sourceRoot":"","sources":["../../src/rtcpeerconnection-to-conn.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,
|
1
|
+
{"version":3,"file":"rtcpeerconnection-to-conn.d.ts","sourceRoot":"","sources":["../../src/rtcpeerconnection-to-conn.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAgB,mBAAmB,EAAE,MAAM,mBAAmB,CAAA;AAC1E,OAAO,KAAK,EAAE,+BAA+B,EAAc,MAAM,eAAe,CAAA;AAGhF,MAAM,WAAW,wCAAyC,SAAQ,IAAI,CAAC,+BAA+B,EAAE,QAAQ,CAAC;IAC/G,cAAc,EAAE,iBAAiB,CAAA;CAClC;AAmDD;;;GAGG;AACH,eAAO,MAAM,qBAAqB,GAAI,MAAM,wCAAwC,KAAG,mBAEtF,CAAA"}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"rtcpeerconnection-to-conn.js","sourceRoot":"","sources":["../../src/rtcpeerconnection-to-conn.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,2BAA2B,EAAE,MAAM,eAAe,CAAA;
|
1
|
+
{"version":3,"file":"rtcpeerconnection-to-conn.js","sourceRoot":"","sources":["../../src/rtcpeerconnection-to-conn.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,2BAA2B,EAAE,MAAM,eAAe,CAAA;AAS3D,MAAM,oCAAqC,SAAQ,2BAA2B;IACpE,cAAc,CAAmB;IAEzC,YAAa,IAA8C;QACzD,KAAK,CAAC,IAAI,CAAC,CAAA;QAEX,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,cAAc,CAAA;QAEzC,MAAM,YAAY,GAAG,IAAI,CAAC,cAAc,CAAC,eAAe,CAAA;QAExD,IAAI,CAAC,cAAc,CAAC,uBAAuB,GAAG,GAAG,EAAE;YACjD,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,kDAAkD,EAAE,IAAI,CAAC,cAAc,CAAC,eAAe,EAAE,YAAY,CAAC,CAAA;YAErH,IAAI,IAAI,CAAC,cAAc,CAAC,eAAe,KAAK,cAAc,IAAI,IAAI,CAAC,cAAc,CAAC,eAAe,KAAK,QAAQ,IAAI,IAAI,CAAC,cAAc,CAAC,eAAe,KAAK,QAAQ,EAAE,CAAC;gBACnK,8CAA8C;gBAC9C,IAAI,CAAC,iBAAiB,EAAE,CAAA;gBAExB,uCAAuC;gBACvC,qFAAqF;gBACrF,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,CAAA;YAC7B,CAAC;QACH,CAAC,CAAA;IACH,CAAC;IAED,QAAQ,CAAE,IAAoB;QAC5B,OAAO;YACL,SAAS,EAAE,IAAI,CAAC,UAAU;YAC1B,WAAW,EAAE,IAAI;SAClB,CAAA;IACH,CAAC;IAED,KAAK,CAAC,SAAS,CAAE,OAAsB;QACrC,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,CAAA;QAC3B,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,CAAA;IACnC,CAAC;IAED,SAAS;QACP,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,CAAA;IAC7B,CAAC;IAED,SAAS;QACP,+BAA+B;IACjC,CAAC;IAED,UAAU;QACR,+BAA+B;IACjC,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,IAA8C,EAAuB,EAAE;IAC3G,OAAO,IAAI,oCAAoC,CAAC,IAAI,CAAC,CAAA;AACvD,CAAC,CAAA"}
|
package/dist/src/stream.d.ts.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"stream.d.ts","sourceRoot":"","sources":["../../src/stream.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAK9C,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAI/C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAA;AACpD,OAAO,KAAK,EAAE,YAAY,EAAE,sBAAsB,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AACrF,OAAO,KAAK,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAGnE,MAAM,WAAW,gBAAiB,SAAQ,kBAAkB,EAAE,kBAAkB;IAC9E;;;;;OAKG;IACH,OAAO,EAAE,cAAc,CAAA;IAEvB,GAAG,EAAE,MAAM,CAAA;CACZ;AAED,qBAAa,YAAa,SAAQ,cAAc;IAC9C;;OAEG;IACH,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAgB;IAExC;;;OAGG;IACH,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAsB;IACnD,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAQ;IAC1C,OAAO,CAAC,cAAc,CAAC,CAA4B;IACnD,OAAO,CAAC,aAAa,CAAQ;gBAEhB,IAAI,EAAE,gBAAgB;
|
1
|
+
{"version":3,"file":"stream.d.ts","sourceRoot":"","sources":["../../src/stream.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAK9C,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAI/C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAA;AACpD,OAAO,KAAK,EAAE,YAAY,EAAE,sBAAsB,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AACrF,OAAO,KAAK,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAGnE,MAAM,WAAW,gBAAiB,SAAQ,kBAAkB,EAAE,kBAAkB;IAC9E;;;;;OAKG;IACH,OAAO,EAAE,cAAc,CAAA;IAEvB,GAAG,EAAE,MAAM,CAAA;CACZ;AAED,qBAAa,YAAa,SAAQ,cAAc;IAC9C;;OAEG;IACH,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAgB;IAExC;;;OAGG;IACH,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAsB;IACnD,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAQ;IAC1C,OAAO,CAAC,cAAc,CAAC,CAA4B;IACnD,OAAO,CAAC,aAAa,CAAQ;gBAEhB,IAAI,EAAE,gBAAgB;IAyFnC,aAAa,IAAK,IAAI;IAItB,YAAY,CAAE,IAAI,EAAE,cAAc,GAAG,IAAI;IAqBzC,QAAQ,CAAE,IAAI,EAAE,cAAc,GAAG,UAAU;IAsC3C,SAAS,CAAE,GAAG,EAAE,KAAK,GAAG,IAAI;IAUtB,cAAc,CAAE,OAAO,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAqBtD,aAAa,CAAE,OAAO,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAK3D;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAmC/B,OAAO,CAAC,SAAS;IAwBjB,SAAS,IAAK,IAAI;IAIlB,UAAU,IAAK,IAAI;CAGpB;AAED,MAAM,WAAW,mBAAoB,SAAQ,kBAAkB;IAC7D;;;;;OAKG;IACH,OAAO,EAAE,cAAc,CAAA;IAEvB;;OAEG;IACH,SAAS,EAAE,sBAAsB,CAAA;IAEjC;;OAEG;IACH,GAAG,EAAE,MAAM,CAAA;IAEX;;;OAGG;IACH,WAAW,CAAC,EAAE,OAAO,CAAA;CACtB;AAED,wBAAgB,YAAY,CAAE,OAAO,EAAE,mBAAmB,GAAG,YAAY,CASxE"}
|
package/dist/src/stream.js
CHANGED
@@ -57,22 +57,6 @@ export class WebRTCStream extends AbstractStream {
|
|
57
57
|
this.safeDispatchEvent('drain');
|
58
58
|
}
|
59
59
|
};
|
60
|
-
if (this.channel.readyState !== 'open') {
|
61
|
-
this.log('channel ready state is "%s" and not "open", waiting for "open" event before sending data', this.channel.readyState);
|
62
|
-
pEvent(this.channel, 'open', {
|
63
|
-
rejectionEvents: [
|
64
|
-
'close',
|
65
|
-
'error'
|
66
|
-
]
|
67
|
-
})
|
68
|
-
.then(() => {
|
69
|
-
this.log('channel ready state is now "%s", dispatching drain', this.channel.readyState);
|
70
|
-
this.safeDispatchEvent('drain');
|
71
|
-
})
|
72
|
-
.catch(err => {
|
73
|
-
this.abort(err.error ?? err);
|
74
|
-
});
|
75
|
-
}
|
76
60
|
// pipe framed protobuf messages through a length prefixed decoder, and
|
77
61
|
// surface data from the `Message.message` field through a source.
|
78
62
|
Promise.resolve().then(async () => {
|
@@ -91,6 +75,25 @@ export class WebRTCStream extends AbstractStream {
|
|
91
75
|
}
|
92
76
|
};
|
93
77
|
this.addEventListener('close', cleanUpDatachannelOnClose);
|
78
|
+
// chrome can receive message events before the open even is fired - calling
|
79
|
+
// code needs to attach message event listeners before these events occur
|
80
|
+
// but we need to wait before sending any data so this has to be done async
|
81
|
+
if (this.channel.readyState !== 'open') {
|
82
|
+
this.log('channel ready state is "%s" and not "open", waiting for "open" event before sending data', this.channel.readyState);
|
83
|
+
pEvent(this.channel, 'open', {
|
84
|
+
rejectionEvents: [
|
85
|
+
'close',
|
86
|
+
'error'
|
87
|
+
]
|
88
|
+
})
|
89
|
+
.then(() => {
|
90
|
+
this.log('channel ready state is now "%s", dispatching drain', this.channel.readyState);
|
91
|
+
this.safeDispatchEvent('drain');
|
92
|
+
})
|
93
|
+
.catch(err => {
|
94
|
+
this.abort(err.error ?? err);
|
95
|
+
});
|
96
|
+
}
|
94
97
|
}
|
95
98
|
sendNewStream() {
|
96
99
|
// opening new streams is handled by WebRTC so this is a noop
|
@@ -158,8 +161,13 @@ export class WebRTCStream extends AbstractStream {
|
|
158
161
|
this._sendFlag(Message.Flag.FIN);
|
159
162
|
options?.signal?.throwIfAborted();
|
160
163
|
this.receivedFinAck = Promise.withResolvers();
|
164
|
+
// wait for either:
|
165
|
+
// 1. the FIN_ACK to be received
|
166
|
+
// 2. the datachannel to close
|
167
|
+
// 3. timeout
|
161
168
|
await Promise.any([
|
162
169
|
raceSignal(this.receivedFinAck.promise, options?.signal),
|
170
|
+
pEvent(this.channel, 'close'),
|
163
171
|
new Promise(resolve => {
|
164
172
|
AbortSignal.timeout(this.finAckTimeout)
|
165
173
|
.addEventListener('abort', () => {
|
package/dist/src/stream.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"stream.js","sourceRoot":"","sources":["../../src/stream.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AACtE,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAC9C,OAAO,KAAK,cAAc,MAAM,oBAAoB,CAAA;AACpD,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AACtC,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAA;AAChC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAC/C,OAAO,EAAE,uBAAuB,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAA;AAClH,OAAO,EAAE,OAAO,EAAE,MAAM,mCAAmC,CAAA;AAC3D,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA;AAkBrC,MAAM,OAAO,YAAa,SAAQ,cAAc;IAC9C;;OAEG;IACc,OAAO,CAAgB;IAExC;;;OAGG;IACc,YAAY,CAAsB;IAClC,iBAAiB,CAAQ;IAClC,cAAc,CAA6B;IAC3C,aAAa,CAAQ;IAE7B,YAAa,IAAsB;QACjC,KAAK,CAAC;YACJ,GAAG,IAAI;YACP,cAAc,EAAE,CAAC,IAAI,CAAC,cAAc,IAAI,gBAAgB,CAAC,GAAG,iBAAiB;SAC9E,CAAC,CAAA;QAEF,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAA;QAC3B,IAAI,CAAC,OAAO,CAAC,UAAU,GAAG,aAAa,CAAA;QACvC,IAAI,CAAC,YAAY,GAAG,QAAQ,EAAc,CAAA;QAC1C,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,iBAAiB,IAAI,mBAAmB,CAAA;QACtE,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,IAAI,uBAAuB,CAAA;QAElE,+BAA+B;QAC/B,IAAI,CAAC,OAAO,CAAC,OAAO,GAAG,GAAG,EAAE;YAC1B,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,kCAAkC,CAAC,CAAA;YAElD,IAAI,CAAC,kBAAkB,EAAE,CAAA;YACzB,IAAI,CAAC,iBAAiB,EAAE,CAAA;QAC1B,CAAC,CAAA;QAED,IAAI,CAAC,OAAO,CAAC,OAAO,GAAG,CAAC,GAAG,EAAE,EAAE;YAC7B,MAAM,GAAG,GAAI,GAAqB,CAAC,KAAK,CAAA;YAExC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,uCAAuC,EAAE,GAAG,CAAC,CAAA;YAE5D,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;QACjB,CAAC,CAAA;QAED,IAAI,CAAC,OAAO,CAAC,SAAS,GAAG,KAAK,EAAE,KAAgC,EAAE,EAAE;YAClE,IAAI,CAAC,GAAG,CAAC,2BAA2B,EAAE,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;YAC5D,MAAM,EAAE,IAAI,EAAE,GAAG,KAAK,CAAA;YAEtB,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI,CAAC,UAAU,KAAK,CAAC,EAAE,CAAC;gBAC3C,OAAM;YACR,CAAC;YAED,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,CAAA;QAClE,CAAC,CAAA;QAED,8DAA8D;QAC9D,IAAI,CAAC,OAAO,CAAC,0BAA0B,GAAG,CAAC,CAAA;QAE3C,IAAI,CAAC,OAAO,CAAC,mBAAmB,GAAG,GAAG,EAAE;YACtC,IAAI,IAAI,CAAC,kBAAkB,EAAE,CAAC;gBAC5B,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAA;YACjC,CAAC;QACH,CAAC,CAAA;QAED,
|
1
|
+
{"version":3,"file":"stream.js","sourceRoot":"","sources":["../../src/stream.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.2-
|
3
|
+
"version": "6.0.2-8d66d5ff1",
|
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",
|
@@ -45,13 +45,13 @@
|
|
45
45
|
},
|
46
46
|
"dependencies": {
|
47
47
|
"@chainsafe/is-ip": "^2.1.0",
|
48
|
-
"@libp2p/crypto": "5.1.10-
|
49
|
-
"@libp2p/interface": "3.0.0-
|
50
|
-
"@libp2p/interface-internal": "3.0.1-
|
51
|
-
"@libp2p/keychain": "6.0.1-
|
48
|
+
"@libp2p/crypto": "5.1.10-8d66d5ff1",
|
49
|
+
"@libp2p/interface": "3.0.0-8d66d5ff1",
|
50
|
+
"@libp2p/interface-internal": "3.0.1-8d66d5ff1",
|
51
|
+
"@libp2p/keychain": "6.0.1-8d66d5ff1",
|
52
52
|
"@chainsafe/libp2p-noise": "^17.0.0",
|
53
|
-
"@libp2p/peer-id": "6.0.1-
|
54
|
-
"@libp2p/utils": "7.0.1-
|
53
|
+
"@libp2p/peer-id": "6.0.1-8d66d5ff1",
|
54
|
+
"@libp2p/utils": "7.0.1-8d66d5ff1",
|
55
55
|
"@multiformats/multiaddr": "^13.0.1",
|
56
56
|
"@multiformats/multiaddr-matcher": "^3.0.1",
|
57
57
|
"@peculiar/webcrypto": "^1.5.0",
|
@@ -79,7 +79,7 @@
|
|
79
79
|
"uint8arrays": "^5.1.0"
|
80
80
|
},
|
81
81
|
"devDependencies": {
|
82
|
-
"@libp2p/logger": "6.0.1-
|
82
|
+
"@libp2p/logger": "6.0.1-8d66d5ff1",
|
83
83
|
"@types/sinon": "^17.0.4",
|
84
84
|
"aegir": "^47.0.22",
|
85
85
|
"any-signal": "^4.1.1",
|
package/src/muxer.ts
CHANGED
@@ -39,26 +39,44 @@ export class DataChannelMuxerFactory implements StreamMuxerFactory {
|
|
39
39
|
private readonly peerConnection: RTCPeerConnection
|
40
40
|
private readonly metrics?: CounterGroup
|
41
41
|
private readonly dataChannelOptions?: DataChannelOptions
|
42
|
+
private readonly earlyDataChannels: RTCDataChannel[]
|
42
43
|
|
43
44
|
constructor (init: DataChannelMuxerFactoryInit) {
|
45
|
+
this.onEarlyDataChannel = this.onEarlyDataChannel.bind(this)
|
46
|
+
|
44
47
|
this.peerConnection = init.peerConnection
|
45
48
|
this.metrics = init.metrics
|
46
49
|
this.protocol = init.protocol ?? MUXER_PROTOCOL
|
47
50
|
this.dataChannelOptions = init.dataChannelOptions ?? {}
|
51
|
+
this.peerConnection.addEventListener('datachannel', this.onEarlyDataChannel)
|
52
|
+
this.earlyDataChannels = []
|
53
|
+
}
|
54
|
+
|
55
|
+
private onEarlyDataChannel (evt: RTCDataChannelEvent): void {
|
56
|
+
this.earlyDataChannels.push(evt.channel)
|
48
57
|
}
|
49
58
|
|
50
59
|
createStreamMuxer (maConn: MultiaddrConnection): StreamMuxer {
|
60
|
+
this.peerConnection.removeEventListener('datachannel', this.onEarlyDataChannel)
|
61
|
+
|
51
62
|
return new DataChannelMuxer(maConn, {
|
52
63
|
peerConnection: this.peerConnection,
|
53
64
|
dataChannelOptions: this.dataChannelOptions,
|
54
65
|
metrics: this.metrics,
|
55
|
-
protocol: this.protocol
|
66
|
+
protocol: this.protocol,
|
67
|
+
earlyDataChannels: this.earlyDataChannels
|
56
68
|
})
|
57
69
|
}
|
58
70
|
}
|
59
71
|
|
60
72
|
export interface DataChannelMuxerInit extends DataChannelMuxerFactoryInit {
|
61
73
|
protocol: string
|
74
|
+
|
75
|
+
/**
|
76
|
+
* Incoming data channels that were opened by the remote before the peer
|
77
|
+
* connection was established
|
78
|
+
*/
|
79
|
+
earlyDataChannels: RTCDataChannel[]
|
62
80
|
}
|
63
81
|
|
64
82
|
export interface DataChannelMuxerComponents {
|
@@ -89,27 +107,44 @@ export class DataChannelMuxer extends AbstractStreamMuxer<WebRTCStream> implemen
|
|
89
107
|
* {@link https://developer.mozilla.org/en-US/docs/Web/API/RTCPeerConnection/datachannel_event}
|
90
108
|
*/
|
91
109
|
this.peerConnection.ondatachannel = ({ channel }) => {
|
92
|
-
this.
|
93
|
-
|
94
|
-
// 'init' channel is only used during connection establishment, it is
|
95
|
-
// closed by the initiator
|
96
|
-
if (channel.label === 'init') {
|
97
|
-
this.log.trace('closing init channel %d', channel.id)
|
98
|
-
channel.close()
|
110
|
+
this.onDataChannel(channel)
|
111
|
+
}
|
99
112
|
|
113
|
+
queueMicrotask(() => {
|
114
|
+
if (this.status !== 'open') {
|
115
|
+
init.earlyDataChannels.forEach(channel => {
|
116
|
+
channel.close()
|
117
|
+
})
|
100
118
|
return
|
101
119
|
}
|
102
120
|
|
103
|
-
|
104
|
-
|
105
|
-
...this.dataChannelOptions,
|
106
|
-
channel,
|
107
|
-
direction: 'inbound',
|
108
|
-
log: this.log
|
121
|
+
init.earlyDataChannels.forEach(channel => {
|
122
|
+
this.onDataChannel(channel)
|
109
123
|
})
|
124
|
+
})
|
125
|
+
}
|
126
|
+
|
127
|
+
private onDataChannel (channel: RTCDataChannel): void {
|
128
|
+
this.log('incoming datachannel with channel id %d, protocol %s and status %s', channel.id, channel.protocol, channel.readyState)
|
129
|
+
|
130
|
+
// 'init' channel is only used during connection establishment, it is
|
131
|
+
// closed by the initiator
|
132
|
+
if (channel.label === 'init') {
|
133
|
+
this.log.trace('closing init channel %d', channel.id)
|
134
|
+
channel.close()
|
110
135
|
|
111
|
-
|
136
|
+
return
|
112
137
|
}
|
138
|
+
|
139
|
+
const stream = createStream({
|
140
|
+
...this.streamOptions,
|
141
|
+
...this.dataChannelOptions,
|
142
|
+
channel,
|
143
|
+
direction: 'inbound',
|
144
|
+
log: this.log
|
145
|
+
})
|
146
|
+
|
147
|
+
this.onRemoteStream(stream)
|
113
148
|
}
|
114
149
|
|
115
150
|
async onCreateStream (options?: CreateStreamOptions): Promise<WebRTCStream> {
|
@@ -32,7 +32,7 @@ export interface ConnectOptions extends LoggerOptions, ProgressOptions<WebRTCDia
|
|
32
32
|
logger: ComponentLogger
|
33
33
|
}
|
34
34
|
|
35
|
-
export async function initiateConnection ({ rtcConfiguration, dataChannel, signal, metrics, multiaddr: ma, connectionManager, transportManager, log, logger, onProgress }: ConnectOptions): Promise<{ remoteAddress: Multiaddr, peerConnection: RTCPeerConnection, muxerFactory: DataChannelMuxerFactory }> {
|
35
|
+
export async function initiateConnection ({ rtcConfiguration, dataChannel, signal, metrics, multiaddr: ma, connectionManager, transportManager, log, logger, onProgress }: ConnectOptions): Promise<{ remoteAddress: Multiaddr, peerConnection: globalThis.RTCPeerConnection, muxerFactory: DataChannelMuxerFactory }> {
|
36
36
|
const { circuitAddress, targetPeer } = splitAddr(ma)
|
37
37
|
|
38
38
|
metrics?.dialerEvents.increment({ open: true })
|
@@ -209,6 +209,7 @@ export async function initiateConnection ({ rtcConfiguration, dataChannel, signa
|
|
209
209
|
|
210
210
|
return {
|
211
211
|
remoteAddress: ma,
|
212
|
+
// @ts-expect-error https://github.com/murat-dogan/node-datachannel/pull/370
|
212
213
|
peerConnection,
|
213
214
|
muxerFactory
|
214
215
|
}
|
@@ -229,6 +229,7 @@ export class WebRTCTransport implements Transport<WebRTCDialEvents>, Startable {
|
|
229
229
|
})
|
230
230
|
|
231
231
|
const webRTCConn = toMultiaddrConnection({
|
232
|
+
// @ts-expect-error https://github.com/murat-dogan/node-datachannel/pull/370
|
232
233
|
peerConnection,
|
233
234
|
remoteAddr: remoteAddress,
|
234
235
|
metrics: this.metrics?.listenerEvents,
|
@@ -245,6 +246,7 @@ export class WebRTCTransport implements Transport<WebRTCDialEvents>, Startable {
|
|
245
246
|
})
|
246
247
|
|
247
248
|
// close the connection on shut down
|
249
|
+
// @ts-expect-error https://github.com/murat-dogan/node-datachannel/pull/370
|
248
250
|
this._closeOnShutdown(peerConnection, webRTCConn)
|
249
251
|
} catch (err: any) {
|
250
252
|
this.log.error('incoming signaling error', err)
|
@@ -255,7 +257,7 @@ export class WebRTCTransport implements Transport<WebRTCDialEvents>, Startable {
|
|
255
257
|
}
|
256
258
|
}
|
257
259
|
|
258
|
-
private _closeOnShutdown (pc: RTCPeerConnection, webRTCConn: MultiaddrConnection): void {
|
260
|
+
private _closeOnShutdown (pc: globalThis.RTCPeerConnection, webRTCConn: MultiaddrConnection): void {
|
259
261
|
// close the connection on shut down
|
260
262
|
const shutDownListener = (): void => {
|
261
263
|
webRTCConn.close()
|
@@ -27,6 +27,7 @@ export interface WebRTCDirectListenerComponents {
|
|
27
27
|
keychain?: Keychain
|
28
28
|
datastore: Datastore
|
29
29
|
metrics?: Metrics
|
30
|
+
events?: CounterGroup
|
30
31
|
}
|
31
32
|
|
32
33
|
export interface WebRTCDirectListenerInit {
|
@@ -184,7 +185,13 @@ export class WebRTCDirectListener extends TypedEventEmitter<ListenerEvents> impl
|
|
184
185
|
signal.throwIfAborted()
|
185
186
|
|
186
187
|
// https://github.com/libp2p/specs/blob/master/webrtc/webrtc-direct.md#browser-to-public-server
|
187
|
-
|
188
|
+
const results = await createDialerRTCPeerConnection('server', ufrag, {
|
189
|
+
rtcConfiguration: this.init.rtcConfiguration,
|
190
|
+
certificate: this.certificate,
|
191
|
+
events: this.metrics?.listenerEvents,
|
192
|
+
dataChannel: this.init.dataChannel
|
193
|
+
})
|
194
|
+
peerConnection = results.peerConnection
|
188
195
|
|
189
196
|
this.connections.set(key, peerConnection)
|
190
197
|
|
@@ -201,11 +208,10 @@ export class WebRTCDirectListener extends TypedEventEmitter<ListenerEvents> impl
|
|
201
208
|
})
|
202
209
|
|
203
210
|
try {
|
204
|
-
await connect(peerConnection, ufrag, {
|
211
|
+
await connect(peerConnection, results.muxerFactory, ufrag, {
|
205
212
|
role: 'server',
|
206
213
|
log: this.log,
|
207
214
|
logger: this.components.logger,
|
208
|
-
metrics: this.components.metrics,
|
209
215
|
events: this.metrics?.listenerEvents,
|
210
216
|
signal,
|
211
217
|
remoteAddr: multiaddr(`/ip${isIPv4(remoteHost) ? 4 : 6}/${remoteHost}/udp/${remotePort}/webrtc-direct`),
|
@@ -163,14 +163,19 @@ export class WebRTCDirectTransport implements Transport, Startable {
|
|
163
163
|
const ufrag = genUfrag()
|
164
164
|
|
165
165
|
// https://github.com/libp2p/specs/blob/master/webrtc/webrtc-direct.md#browser-to-public-server
|
166
|
-
const
|
166
|
+
const {
|
167
|
+
peerConnection,
|
168
|
+
muxerFactory
|
169
|
+
} = await createDialerRTCPeerConnection('client', ufrag, {
|
170
|
+
rtcConfiguration: typeof this.init.rtcConfiguration === 'function' ? await this.init.rtcConfiguration() : this.init.rtcConfiguration ?? {},
|
171
|
+
dataChannel: this.init.dataChannel
|
172
|
+
})
|
167
173
|
|
168
174
|
try {
|
169
|
-
return await connect(peerConnection, ufrag, {
|
175
|
+
return await connect(peerConnection, muxerFactory, ufrag, {
|
170
176
|
role: 'client',
|
171
177
|
log: this.log,
|
172
178
|
logger: this.components.logger,
|
173
|
-
metrics: this.components.metrics,
|
174
179
|
events: this.metrics?.dialerEvents,
|
175
180
|
signal: options.signal,
|
176
181
|
remoteAddr: ma,
|
@@ -9,13 +9,12 @@ import { generateNoisePrologue } from './generate-noise-prologue.js'
|
|
9
9
|
import * as sdp from './sdp.js'
|
10
10
|
import type { DirectRTCPeerConnection } from './get-rtcpeerconnection.js'
|
11
11
|
import type { DataChannelOptions } from '../../index.js'
|
12
|
-
import type { ComponentLogger, Connection, CounterGroup, Logger,
|
12
|
+
import type { ComponentLogger, Connection, CounterGroup, Logger, PeerId, PrivateKey, Upgrader } from '@libp2p/interface'
|
13
13
|
import type { Multiaddr } from '@multiformats/multiaddr'
|
14
14
|
|
15
15
|
export interface ConnectOptions {
|
16
16
|
log: Logger
|
17
17
|
logger: ComponentLogger
|
18
|
-
metrics?: Metrics
|
19
18
|
events?: CounterGroup
|
20
19
|
remoteAddr: Multiaddr
|
21
20
|
role: 'client' | 'server'
|
@@ -37,9 +36,13 @@ export interface ServerOptions extends ConnectOptions {
|
|
37
36
|
|
38
37
|
const CONNECTION_STATE_CHANGE_EVENT = isFirefox ? 'iceconnectionstatechange' : 'connectionstatechange'
|
39
38
|
|
40
|
-
|
41
|
-
|
42
|
-
|
39
|
+
function isServer (options: ClientOptions | ServerOptions, peerConnection: any): peerConnection is DirectRTCPeerConnection {
|
40
|
+
return options.role === 'server'
|
41
|
+
}
|
42
|
+
|
43
|
+
export async function connect (peerConnection: RTCPeerConnection, muxerFactory: DataChannelMuxerFactory, ufrag: string, options: ClientOptions): Promise<Connection>
|
44
|
+
export async function connect (peerConnection: DirectRTCPeerConnection, muxerFactory: DataChannelMuxerFactory, ufrag: string, options: ServerOptions): Promise<void>
|
45
|
+
export async function connect (peerConnection: RTCPeerConnection | DirectRTCPeerConnection, muxerFactory: DataChannelMuxerFactory, ufrag: string, options: ClientOptions | ServerOptions): Promise<any> {
|
43
46
|
// create data channel for running the noise handshake. Once the data
|
44
47
|
// channel is opened, the listener will initiate the noise handshake. This
|
45
48
|
// is used to confirm the identity of the peer.
|
@@ -88,7 +91,7 @@ export async function connect (peerConnection: DirectRTCPeerConnection, ufrag: s
|
|
88
91
|
|
89
92
|
options.log.trace('%s handshake channel opened', options.role)
|
90
93
|
|
91
|
-
if (options
|
94
|
+
if (isServer(options, peerConnection)) {
|
92
95
|
// now that the connection has been opened, add the remote's certhash to
|
93
96
|
// it's multiaddr so we can complete the noise handshake
|
94
97
|
const remoteFingerprint = peerConnection.remoteFingerprint()?.value ?? ''
|
@@ -124,6 +127,7 @@ export async function connect (peerConnection: DirectRTCPeerConnection, ufrag: s
|
|
124
127
|
// Creating the connection before completion of the noise
|
125
128
|
// handshake ensures that the stream opening callback is set up
|
126
129
|
const maConn = toMultiaddrConnection({
|
130
|
+
// @ts-expect-error types are broken
|
127
131
|
peerConnection,
|
128
132
|
remoteAddr: options.remoteAddr,
|
129
133
|
metrics: options.events,
|
@@ -149,13 +153,6 @@ export async function connect (peerConnection: DirectRTCPeerConnection, ufrag: s
|
|
149
153
|
// Track opened peer connection
|
150
154
|
options.events?.increment({ peer_connection: true })
|
151
155
|
|
152
|
-
const muxerFactory = new DataChannelMuxerFactory({
|
153
|
-
// @ts-expect-error https://github.com/murat-dogan/node-datachannel/pull/370
|
154
|
-
peerConnection,
|
155
|
-
metrics: options.events,
|
156
|
-
dataChannelOptions: options.dataChannel
|
157
|
-
})
|
158
|
-
|
159
156
|
if (options.role === 'client') {
|
160
157
|
// For outbound connections, the remote is expected to start the noise
|
161
158
|
// handshake. Therefore, we need to secure an inbound noise connection
|
@@ -1,4 +1,10 @@
|
|
1
|
-
|
1
|
+
import { DataChannelMuxerFactory } from '../../muxer.ts'
|
2
|
+
import type { CreateDialerRTCPeerConnectionOptions } from './get-rtcpeerconnection.ts'
|
3
|
+
|
4
|
+
export async function createDialerRTCPeerConnection (role: 'client' | 'server', ufrag: string, options: CreateDialerRTCPeerConnectionOptions = {}): Promise<{ peerConnection: RTCPeerConnection, muxerFactory: DataChannelMuxerFactory }> {
|
5
|
+
// @ts-expect-error options type is wrong
|
6
|
+
let certificate: RTCCertificate = options.certificate
|
7
|
+
|
2
8
|
if (certificate == null) {
|
3
9
|
// ECDSA is preferred over RSA here. From our testing we find that P-256 elliptic
|
4
10
|
// curve is supported by Pion, webrtc-rs, as well as Chromium (P-228 and P-384
|
@@ -13,10 +19,21 @@ export async function createDialerRTCPeerConnection (role: 'client' | 'server',
|
|
13
19
|
})
|
14
20
|
}
|
15
21
|
|
16
|
-
const rtcConfig = typeof rtcConfiguration === 'function' ? await rtcConfiguration() : rtcConfiguration
|
22
|
+
const rtcConfig = typeof options.rtcConfiguration === 'function' ? await options.rtcConfiguration() : options.rtcConfiguration
|
17
23
|
|
18
|
-
|
24
|
+
const peerConnection = new RTCPeerConnection({
|
19
25
|
...(rtcConfig ?? {}),
|
20
26
|
certificates: [certificate]
|
21
27
|
})
|
28
|
+
|
29
|
+
const muxerFactory = new DataChannelMuxerFactory({
|
30
|
+
peerConnection,
|
31
|
+
metrics: options.events,
|
32
|
+
dataChannelOptions: options.dataChannel
|
33
|
+
})
|
34
|
+
|
35
|
+
return {
|
36
|
+
peerConnection,
|
37
|
+
muxerFactory
|
38
|
+
}
|
22
39
|
}
|