@dxos/network-manager 0.6.13 → 0.6.14-main.7bd9c89
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/lib/browser/chunk-GW3YM55A.mjs +14 -0
- package/dist/lib/browser/chunk-GW3YM55A.mjs.map +7 -0
- package/dist/lib/browser/{chunk-XYSYUN63.mjs → chunk-MKIVP7G3.mjs} +1249 -1065
- package/dist/lib/browser/chunk-MKIVP7G3.mjs.map +7 -0
- package/dist/lib/browser/index.mjs +10 -19
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/testing/index.mjs +22 -32
- package/dist/lib/browser/testing/index.mjs.map +3 -3
- package/dist/lib/browser/transport/tcp/index.mjs +39 -0
- package/dist/lib/browser/transport/tcp/index.mjs.map +7 -0
- package/dist/lib/node/{chunk-4YAYC7WN.cjs → chunk-D6P7ACEM.cjs} +1262 -1205
- package/dist/lib/node/chunk-D6P7ACEM.cjs.map +7 -0
- package/dist/lib/node/index.cjs +27 -37
- package/dist/lib/node/index.cjs.map +2 -2
- package/dist/lib/node/meta.json +1 -1
- package/dist/lib/node/testing/index.cjs +24 -34
- package/dist/lib/node/testing/index.cjs.map +3 -3
- package/dist/lib/node/transport/tcp/index.cjs +191 -0
- package/dist/lib/node/transport/tcp/index.cjs.map +7 -0
- package/dist/lib/node-esm/chunk-22DA2US6.mjs +4373 -0
- package/dist/lib/node-esm/chunk-22DA2US6.mjs.map +7 -0
- package/dist/lib/node-esm/index.mjs +50 -0
- package/dist/lib/node-esm/index.mjs.map +7 -0
- package/dist/lib/node-esm/meta.json +1 -0
- package/dist/lib/node-esm/testing/index.mjs +279 -0
- package/dist/lib/node-esm/testing/index.mjs.map +7 -0
- package/dist/lib/node-esm/transport/tcp/index.mjs +159 -0
- package/dist/lib/node-esm/transport/tcp/index.mjs.map +7 -0
- package/dist/types/src/network-manager.d.ts +2 -1
- package/dist/types/src/network-manager.d.ts.map +1 -1
- package/dist/types/src/signal/ice.d.ts.map +1 -1
- package/dist/types/src/signal/integration.node.test.d.ts +2 -0
- package/dist/types/src/signal/integration.node.test.d.ts.map +1 -0
- package/dist/types/src/signal/swarm-messenger.node.test.d.ts +2 -0
- package/dist/types/src/signal/swarm-messenger.node.test.d.ts.map +1 -0
- package/dist/types/src/swarm/connection.d.ts.map +1 -1
- package/dist/types/src/swarm/swarm.d.ts +1 -1
- package/dist/types/src/testing/test-builder.d.ts +2 -2
- package/dist/types/src/testing/test-builder.d.ts.map +1 -1
- package/dist/types/src/testing/test-wire-protocol.d.ts +1 -2
- package/dist/types/src/testing/test-wire-protocol.d.ts.map +1 -1
- package/dist/types/src/tests/basic-test-suite.d.ts.map +1 -1
- package/dist/types/src/tests/property-test-suite.d.ts.map +1 -1
- package/dist/types/src/tests/tcp-transport.node.test.d.ts +2 -0
- package/dist/types/src/tests/tcp-transport.node.test.d.ts.map +1 -0
- package/dist/types/src/tests/utils.d.ts.map +1 -1
- package/dist/types/src/transport/index.d.ts +1 -5
- package/dist/types/src/transport/index.d.ts.map +1 -1
- package/dist/types/src/transport/memory-transport.d.ts +2 -2
- package/dist/types/src/transport/memory-transport.d.ts.map +1 -1
- package/dist/types/src/transport/tcp/index.d.ts +2 -0
- package/dist/types/src/transport/tcp/index.d.ts.map +1 -0
- package/dist/types/src/transport/{tcp-transport.browser.d.ts → tcp/tcp-transport.browser.d.ts} +3 -3
- package/dist/types/src/transport/tcp/tcp-transport.browser.d.ts.map +1 -0
- package/dist/types/src/transport/{tcp-transport.d.ts → tcp/tcp-transport.d.ts} +3 -3
- package/dist/types/src/transport/tcp/tcp-transport.d.ts.map +1 -0
- package/dist/types/src/transport/transport.d.ts +7 -6
- package/dist/types/src/transport/transport.d.ts.map +1 -1
- package/dist/types/src/transport/webrtc/index.d.ts +4 -0
- package/dist/types/src/transport/webrtc/index.d.ts.map +1 -0
- package/dist/types/src/transport/webrtc/rtc-connection-factory.d.ts +14 -0
- package/dist/types/src/transport/webrtc/rtc-connection-factory.d.ts.map +1 -0
- package/dist/types/src/transport/webrtc/rtc-peer-connection.d.ts +68 -0
- package/dist/types/src/transport/webrtc/rtc-peer-connection.d.ts.map +1 -0
- package/dist/types/src/transport/webrtc/rtc-transport-channel.d.ts +33 -0
- package/dist/types/src/transport/webrtc/rtc-transport-channel.d.ts.map +1 -0
- package/dist/types/src/transport/webrtc/rtc-transport-channel.test.d.ts +2 -0
- package/dist/types/src/transport/webrtc/rtc-transport-channel.test.d.ts.map +1 -0
- package/dist/types/src/transport/webrtc/rtc-transport-factory.d.ts +4 -0
- package/dist/types/src/transport/webrtc/rtc-transport-factory.d.ts.map +1 -0
- package/dist/types/src/transport/{simplepeer-transport-proxy.d.ts → webrtc/rtc-transport-proxy.d.ts} +10 -12
- package/dist/types/src/transport/webrtc/rtc-transport-proxy.d.ts.map +1 -0
- package/dist/types/src/transport/webrtc/rtc-transport-proxy.test.d.ts +2 -0
- package/dist/types/src/transport/webrtc/rtc-transport-proxy.test.d.ts.map +1 -0
- package/dist/types/src/transport/{simplepeer-transport-service.d.ts → webrtc/rtc-transport-service.d.ts} +9 -7
- package/dist/types/src/transport/webrtc/rtc-transport-service.d.ts.map +1 -0
- package/dist/types/src/transport/webrtc/rtc-transport-stats.d.ts +4 -0
- package/dist/types/src/transport/webrtc/rtc-transport-stats.d.ts.map +1 -0
- package/dist/types/src/transport/webrtc/rtc-transport.test.d.ts +2 -0
- package/dist/types/src/transport/webrtc/rtc-transport.test.d.ts.map +1 -0
- package/dist/types/src/transport/webrtc/test-utils.d.ts +5 -0
- package/dist/types/src/transport/webrtc/test-utils.d.ts.map +1 -0
- package/dist/types/src/transport/webrtc/utils.d.ts +3 -0
- package/dist/types/src/transport/webrtc/utils.d.ts.map +1 -0
- package/package.json +55 -30
- package/src/network-manager.ts +5 -13
- package/src/signal/ice.test.ts +1 -3
- package/src/signal/ice.ts +6 -1
- package/src/signal/{integration.test.ts → integration.node.test.ts} +9 -15
- package/src/signal/{swarm-messenger.test.ts → swarm-messenger.node.test.ts} +13 -23
- package/src/swarm/connection-limiter.test.ts +3 -6
- package/src/swarm/connection.test.ts +63 -38
- package/src/swarm/connection.ts +5 -5
- package/src/swarm/swarm.test.ts +10 -12
- package/src/swarm/swarm.ts +1 -1
- package/src/testing/test-builder.ts +13 -29
- package/src/testing/test-wire-protocol.ts +1 -4
- package/src/tests/basic-test-suite.ts +34 -33
- package/src/tests/memory-transport.test.ts +40 -42
- package/src/tests/property-test-suite.ts +21 -22
- package/src/tests/tcp-transport.node.test.ts +65 -0
- package/src/tests/utils.ts +3 -2
- package/src/tests/webrtc-transport.test.ts +9 -9
- package/src/transport/index.ts +1 -5
- package/src/transport/memory-transport.ts +2 -0
- package/src/transport/tcp/index.ts +5 -0
- package/src/transport/{tcp-transport.browser.ts → tcp/tcp-transport.browser.ts} +7 -3
- package/src/transport/{tcp-transport.ts → tcp/tcp-transport.ts} +3 -1
- package/src/transport/transport.ts +8 -7
- package/src/transport/webrtc/index.ts +7 -0
- package/src/transport/webrtc/rtc-connection-factory.ts +82 -0
- package/src/transport/webrtc/rtc-peer-connection.ts +472 -0
- package/src/transport/webrtc/rtc-transport-channel.test.ts +176 -0
- package/src/transport/webrtc/rtc-transport-channel.ts +195 -0
- package/src/transport/webrtc/rtc-transport-factory.ts +28 -0
- package/src/transport/webrtc/rtc-transport-proxy.test.ts +413 -0
- package/src/transport/webrtc/rtc-transport-proxy.ts +264 -0
- package/src/transport/webrtc/rtc-transport-service.ts +192 -0
- package/src/transport/webrtc/rtc-transport-stats.ts +67 -0
- package/src/transport/webrtc/rtc-transport.test.ts +198 -0
- package/src/transport/webrtc/test-utils.ts +22 -0
- package/src/transport/webrtc/utils.ts +36 -0
- package/src/typings.d.ts +8 -2
- package/dist/lib/browser/chunk-XYSYUN63.mjs.map +0 -7
- package/dist/lib/node/chunk-4YAYC7WN.cjs.map +0 -7
- package/dist/types/src/signal/integration.test.d.ts +0 -2
- package/dist/types/src/signal/integration.test.d.ts.map +0 -1
- package/dist/types/src/signal/swarm-messenger.test.d.ts +0 -2
- package/dist/types/src/signal/swarm-messenger.test.d.ts.map +0 -1
- package/dist/types/src/tests/tcp-transport.test.d.ts +0 -2
- package/dist/types/src/tests/tcp-transport.test.d.ts.map +0 -1
- package/dist/types/src/transport/libdatachannel-transport.d.ts +0 -42
- package/dist/types/src/transport/libdatachannel-transport.d.ts.map +0 -1
- package/dist/types/src/transport/libdatachannel-transport.test.d.ts +0 -2
- package/dist/types/src/transport/libdatachannel-transport.test.d.ts.map +0 -1
- package/dist/types/src/transport/memory-transport.test.d.ts +0 -2
- package/dist/types/src/transport/memory-transport.test.d.ts.map +0 -1
- package/dist/types/src/transport/simplepeer-simple-peer.d.ts +0 -2
- package/dist/types/src/transport/simplepeer-simple-peer.d.ts.map +0 -1
- package/dist/types/src/transport/simplepeer-transport-proxy-test.d.ts +0 -2
- package/dist/types/src/transport/simplepeer-transport-proxy-test.d.ts.map +0 -1
- package/dist/types/src/transport/simplepeer-transport-proxy.d.ts.map +0 -1
- package/dist/types/src/transport/simplepeer-transport-service.d.ts.map +0 -1
- package/dist/types/src/transport/simplepeer-transport.d.ts +0 -36
- package/dist/types/src/transport/simplepeer-transport.d.ts.map +0 -1
- package/dist/types/src/transport/simplepeer-transport.test.d.ts +0 -2
- package/dist/types/src/transport/simplepeer-transport.test.d.ts.map +0 -1
- package/dist/types/src/transport/tcp-transport.browser.d.ts.map +0 -1
- package/dist/types/src/transport/tcp-transport.d.ts.map +0 -1
- package/dist/types/src/transport/webrtc.d.ts +0 -6
- package/dist/types/src/transport/webrtc.d.ts.map +0 -1
- package/src/globals.d.ts +0 -7
- package/src/tests/tcp-transport.test.ts +0 -67
- package/src/transport/libdatachannel-transport.test.ts +0 -100
- package/src/transport/libdatachannel-transport.ts +0 -376
- package/src/transport/memory-transport.test.ts +0 -74
- package/src/transport/simplepeer-simple-peer.ts +0 -26
- package/src/transport/simplepeer-transport-proxy-test.ts +0 -181
- package/src/transport/simplepeer-transport-proxy.ts +0 -246
- package/src/transport/simplepeer-transport-service.ts +0 -160
- package/src/transport/simplepeer-transport.test.ts +0 -61
- package/src/transport/simplepeer-transport.ts +0 -250
- package/src/transport/webrtc.ts +0 -15
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"simplepeer-transport-proxy.d.ts","sourceRoot":"","sources":["../../../../src/transport/simplepeer-transport-proxy.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,KAAK,EAAgB,MAAM,aAAa,CAAC;AAGlD,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAW1C,OAAO,EAAqC,KAAK,aAAa,EAAE,MAAM,wCAAwC,CAAC;AAC/G,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,uCAAuC,CAAC;AAGpE,OAAO,EAAE,KAAK,SAAS,EAAE,KAAK,gBAAgB,EAAE,KAAK,gBAAgB,EAAE,KAAK,cAAc,EAAE,MAAM,aAAa,CAAC;AAMhH,MAAM,MAAM,+BAA+B,GAAG,gBAAgB,GAAG;IAC/D,aAAa,EAAE,aAAa,CAAC;CAC9B,CAAC;AAEF,qBAAa,wBAAyB,YAAW,SAAS;IAY5C,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAXrC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAsB;IAC/C,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAiB;IACtC,OAAO,CAAC,aAAa,CAAK;IAE1B,QAAQ,CAAC,MAAM,cAAe;IAC9B,QAAQ,CAAC,SAAS,cAAe;IACjC,QAAQ,CAAC,MAAM,cAAqB;IAEpC,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,cAAc,CAAuB;gBAEhB,QAAQ,EAAE,+BAA+B;IAEtE,IAAI,MAAM,YAGT;IAEK,IAAI;IAqEJ,KAAK;IAkBL,QAAQ,CAAC,MAAM,EAAE,MAAM;YAYf,iBAAiB;IAiB/B,OAAO,CAAC,WAAW;YAKL,aAAa;IAIrB,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC;IAI7B,QAAQ,IAAI,OAAO,CAAC,cAAc,CAAC;IAKzC;;OAEG;IAEH,UAAU;CAKX;AAGD,qBAAa,+BAAgC,YAAW,gBAAgB;IACtE,OAAO,CAAC,cAAc,CAA4B;IAClD,OAAO,CAAC,YAAY,CAAuC;IAE3D;;;OAGG;IACH,gBAAgB,CAAC,aAAa,EAAE,aAAa,GAAG,SAAS,GAAG,IAAI;IAShE,eAAe,CAAC,OAAO,EAAE,gBAAgB,GAAG,SAAS;CAWtD"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"simplepeer-transport-service.d.ts","sourceRoot":"","sources":["../../../../src/transport/simplepeer-transport-service.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAI9C,OAAO,EACL,KAAK,aAAa,EAClB,KAAK,iBAAiB,EACtB,KAAK,aAAa,EAClB,KAAK,WAAW,EAChB,KAAK,WAAW,EAEhB,KAAK,YAAY,EACjB,KAAK,cAAc,EACnB,KAAK,eAAe,EACpB,KAAK,YAAY,EACjB,KAAK,aAAa,EACnB,MAAM,wCAAwC,CAAC;AAIhD,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,WAAW,CAAC;AAS7C,qBAAa,0BAA2B,YAAW,aAAa;IAI5D,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC;IAC/B,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC;IAJhC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA6D;gBAGrE,aAAa,CAAC,EAAE,gBAAgB,YAAA,EAChC,YAAY,CAAC,EAAE,WAAW,YAAA;IAG7C,IAAI,CAAC,OAAO,EAAE,iBAAiB,GAAG,MAAM,CAAC,WAAW,CAAC;IA+E/C,UAAU,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAK7D,UAAU,CAAC,EAAE,OAAO,EAAE,EAAE,cAAc,GAAG,OAAO,CAAC,eAAe,CAAC;IAKjE,QAAQ,CAAC,EAAE,OAAO,EAAE,EAAE,YAAY,GAAG,OAAO,CAAC,aAAa,CAAC;IAK3D,QAAQ,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAc1D,KAAK,CAAC,EAAE,OAAO,EAAE,EAAE,YAAY;CAQtC"}
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
import { Event } from '@dxos/async';
|
|
2
|
-
import { ErrorStream } from '@dxos/debug';
|
|
3
|
-
import { type Signal } from '@dxos/protocols/proto/dxos/mesh/swarm';
|
|
4
|
-
import { type Transport, type TransportFactory, type TransportOptions, type TransportStats } from './transport';
|
|
5
|
-
import { type IceProvider } from '../signal';
|
|
6
|
-
export type SimplePeerTransportParams = TransportOptions & {
|
|
7
|
-
webrtcConfig?: RTCConfiguration;
|
|
8
|
-
iceProvider?: IceProvider;
|
|
9
|
-
};
|
|
10
|
-
export declare const createSimplePeerTransportFactory: (webrtcConfig?: RTCConfiguration, iceProvider?: IceProvider) => TransportFactory;
|
|
11
|
-
/**
|
|
12
|
-
* Implements Transport for WebRTC. Uses simple-peer under the hood.
|
|
13
|
-
*/
|
|
14
|
-
export declare class SimplePeerTransport implements Transport {
|
|
15
|
-
private readonly _params;
|
|
16
|
-
private _peer?;
|
|
17
|
-
private _closed;
|
|
18
|
-
private _piped;
|
|
19
|
-
readonly closed: Event<void>;
|
|
20
|
-
readonly connected: Event<void>;
|
|
21
|
-
readonly errors: ErrorStream;
|
|
22
|
-
private readonly _instanceId;
|
|
23
|
-
get isOpen(): boolean;
|
|
24
|
-
/**
|
|
25
|
-
* @params opts.config formatted as per https://developer.mozilla.org/en-US/docs/Web/API/RTCPeerConnection/RTCPeerConnection
|
|
26
|
-
*/
|
|
27
|
-
constructor(_params: SimplePeerTransportParams);
|
|
28
|
-
getStats(): Promise<TransportStats>;
|
|
29
|
-
_getStats(): Promise<any>;
|
|
30
|
-
getDetails(): Promise<string>;
|
|
31
|
-
open(): Promise<void>;
|
|
32
|
-
close(): Promise<void>;
|
|
33
|
-
onSignal(signal: Signal): Promise<void>;
|
|
34
|
-
private _disconnectStreams;
|
|
35
|
-
}
|
|
36
|
-
//# sourceMappingURL=simplepeer-transport.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"simplepeer-transport.d.ts","sourceRoot":"","sources":["../../../../src/transport/simplepeer-transport.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,KAAK,EAAgB,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,WAAW,EAAS,MAAM,aAAa,CAAC;AAIjD,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,uCAAuC,CAAC;AAEpE,OAAO,EAAE,KAAK,SAAS,EAAE,KAAK,gBAAgB,EAAE,KAAK,gBAAgB,EAAE,KAAK,cAAc,EAAE,MAAM,aAAa,CAAC;AAEhH,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,WAAW,CAAC;AAE7C,MAAM,MAAM,yBAAyB,GAAG,gBAAgB,GAAG;IACzD,YAAY,CAAC,EAAE,gBAAgB,CAAC;IAChC,WAAW,CAAC,EAAE,WAAW,CAAC;CAC3B,CAAC;AAEF,eAAO,MAAM,gCAAgC,kBAC5B,gBAAgB,gBACjB,WAAW,KACxB,gBAOD,CAAC;AAEH;;GAEG;AACH,qBAAa,mBAAoB,YAAW,SAAS;IAmBvC,OAAO,CAAC,QAAQ,CAAC,OAAO;IAlBpC,OAAO,CAAC,KAAK,CAAC,CAAyB;IACvC,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,MAAM,CAAS;IAEvB,QAAQ,CAAC,MAAM,cAAe;IAC9B,QAAQ,CAAC,SAAS,cAAe;IACjC,QAAQ,CAAC,MAAM,cAAqB;IAEpC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA8B;IAE1D,IAAI,MAAM,YAGT;IAED;;OAEG;gBAC0B,OAAO,EAAE,yBAAyB;IAEzD,QAAQ,IAAI,OAAO,CAAC,cAAc,CAAC;IAsBnC,SAAS,IAAI,OAAO,CAAC,GAAG,CAAC;IAwBzB,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC;IAc7B,IAAI;IAoGJ,KAAK;IAaL,QAAQ,CAAC,MAAM,EAAE,MAAM;IAU7B,OAAO,CAAC,kBAAkB;CAM3B"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"simplepeer-transport.test.d.ts","sourceRoot":"","sources":["../../../../src/transport/simplepeer-transport.test.ts"],"names":[],"mappings":""}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"tcp-transport.browser.d.ts","sourceRoot":"","sources":["../../../../src/transport/tcp-transport.browser.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C,OAAO,EAAE,KAAK,SAAS,EAAE,KAAK,gBAAgB,EAAE,KAAK,cAAc,EAAE,MAAM,aAAa,CAAC;AAEzF,eAAO,MAAM,mBAAmB,EAAE,gBAEjC,CAAC;AAEF;;GAEG;AACH,qBAAa,YAAa,YAAW,SAAS;IAC5C,SAAgB,MAAM,cAAqB;IAC3C,SAAgB,SAAS,cAAqB;IAC9C,SAAgB,MAAM,cAAqB;IAE3C,IAAI,MAAM,YAET;IAEK,IAAI;IAEJ,KAAK;IAEL,QAAQ;IAIR,QAAQ,IAAI,OAAO,CAAC,cAAc,CAAC;IAInC,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC;CAGpC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"tcp-transport.d.ts","sourceRoot":"","sources":["../../../../src/transport/tcp-transport.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,uCAAuC,CAAC;AAEpE,OAAO,EAAE,KAAK,SAAS,EAAE,KAAK,gBAAgB,EAAE,KAAK,gBAAgB,EAAE,KAAK,cAAc,EAAE,MAAM,aAAa,CAAC;AAEhH,eAAO,MAAM,mBAAmB,EAAE,gBAEjC,CAAC;AAEF;;GAEG;AACH,qBAAa,YAAa,YAAW,SAAS;IAWhC,OAAO,CAAC,QAAQ,CAAC,OAAO;IAVpC,OAAO,CAAC,OAAO,CAAC,CAAqB;IACrC,OAAO,CAAC,OAAO,CAAC,CAAqB;IAErC,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,OAAO,CAAS;IAExB,SAAgB,MAAM,cAAqB;IAC3C,SAAgB,SAAS,cAAqB;IAC9C,SAAgB,MAAM,cAAqB;gBAEd,OAAO,EAAE,gBAAgB;IAEtD,IAAI,MAAM,YAET;IAEK,IAAI;IAuCJ,KAAK;IAOL,QAAQ,CAAC,EAAE,OAAO,EAAE,EAAE,MAAM;IAW5B,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC;IAU7B,QAAQ,IAAI,OAAO,CAAC,cAAc,CAAC;IASzC,OAAO,CAAC,aAAa;CAoBtB"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"webrtc.d.ts","sourceRoot":"","sources":["../../../../src/transport/webrtc.ts"],"names":[],"mappings":"AAIA;;GAEG;AACH,QAAA,IAAI,IAAI,EAAE,GAAU,CAAC;AAOrB,OAAO,EAAE,IAAI,EAAE,CAAC"}
|
package/src/globals.d.ts
DELETED
|
@@ -1,67 +0,0 @@
|
|
|
1
|
-
//
|
|
2
|
-
// Copyright 2021 DXOS.org
|
|
3
|
-
//
|
|
4
|
-
|
|
5
|
-
import { randomBytes } from 'crypto';
|
|
6
|
-
|
|
7
|
-
import { PublicKey } from '@dxos/keys';
|
|
8
|
-
import { test } from '@dxos/test';
|
|
9
|
-
import { range } from '@dxos/util';
|
|
10
|
-
|
|
11
|
-
import { basicTestSuite } from './basic-test-suite';
|
|
12
|
-
import { exchangeMessages, joinSwarm, leaveSwarm, openAndCloseAfterTest } from './utils';
|
|
13
|
-
import { TestBuilder } from '../testing';
|
|
14
|
-
import { FullyConnectedTopology } from '../topology';
|
|
15
|
-
import { TransportKind } from '../transport';
|
|
16
|
-
|
|
17
|
-
describe('Tcp transport', () => {
|
|
18
|
-
const testBuilder = new TestBuilder({
|
|
19
|
-
transport: TransportKind.TCP,
|
|
20
|
-
});
|
|
21
|
-
|
|
22
|
-
basicTestSuite(testBuilder);
|
|
23
|
-
|
|
24
|
-
test
|
|
25
|
-
.skip('load', async () => {
|
|
26
|
-
const NUM_PAIRS = 100;
|
|
27
|
-
const NUM_ROUNDS = 10_000;
|
|
28
|
-
const PACKET_SIZE = 1_000;
|
|
29
|
-
|
|
30
|
-
const pairs = await Promise.all(
|
|
31
|
-
range(NUM_PAIRS).map(async () => {
|
|
32
|
-
const peer1 = testBuilder.createPeer();
|
|
33
|
-
const peer2 = testBuilder.createPeer();
|
|
34
|
-
await openAndCloseAfterTest([peer1, peer2]);
|
|
35
|
-
|
|
36
|
-
const topic = PublicKey.random();
|
|
37
|
-
const [swarm1, swarm2] = await joinSwarm([peer1, peer2], topic, () => new FullyConnectedTopology());
|
|
38
|
-
|
|
39
|
-
return {
|
|
40
|
-
peer1,
|
|
41
|
-
peer2,
|
|
42
|
-
topic,
|
|
43
|
-
swarm1,
|
|
44
|
-
swarm2,
|
|
45
|
-
};
|
|
46
|
-
}),
|
|
47
|
-
);
|
|
48
|
-
|
|
49
|
-
const message = randomBytes(PACKET_SIZE / 2).toString('hex');
|
|
50
|
-
|
|
51
|
-
for (let i = 0; i < NUM_ROUNDS; i++) {
|
|
52
|
-
// console.log(`Round ${i}/${NUM_ROUNDS}`);
|
|
53
|
-
await Promise.all(
|
|
54
|
-
pairs.map(async ({ swarm1, swarm2 }) => {
|
|
55
|
-
await exchangeMessages(swarm1, swarm2, message);
|
|
56
|
-
}),
|
|
57
|
-
);
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
await Promise.all(
|
|
61
|
-
pairs.map(async ({ peer1, peer2, topic }) => {
|
|
62
|
-
await leaveSwarm([peer1, peer2], topic);
|
|
63
|
-
}),
|
|
64
|
-
);
|
|
65
|
-
})
|
|
66
|
-
.timeout(1_000_000);
|
|
67
|
-
});
|
|
@@ -1,100 +0,0 @@
|
|
|
1
|
-
//
|
|
2
|
-
// Copyright 2023 DXOS.org
|
|
3
|
-
//
|
|
4
|
-
|
|
5
|
-
import { Duplex } from 'stream';
|
|
6
|
-
|
|
7
|
-
import { sleep, TestStream } from '@dxos/async';
|
|
8
|
-
import { log } from '@dxos/log';
|
|
9
|
-
import { afterTest, describe, test } from '@dxos/test';
|
|
10
|
-
|
|
11
|
-
import { LibDataChannelTransport } from './libdatachannel-transport';
|
|
12
|
-
import { SimplePeerTransport } from './simplepeer-transport';
|
|
13
|
-
|
|
14
|
-
describe('LibDataChannelTransport', () => {
|
|
15
|
-
test('open and close', async () => {
|
|
16
|
-
const connection = new LibDataChannelTransport({
|
|
17
|
-
initiator: true,
|
|
18
|
-
stream: new Duplex(),
|
|
19
|
-
sendSignal: async () => {},
|
|
20
|
-
});
|
|
21
|
-
|
|
22
|
-
await connection.open();
|
|
23
|
-
const wait = connection.closed.waitForCount(1);
|
|
24
|
-
await connection.close();
|
|
25
|
-
await wait;
|
|
26
|
-
})
|
|
27
|
-
.onlyEnvironments('nodejs')
|
|
28
|
-
.timeout(1_000)
|
|
29
|
-
.retries(3);
|
|
30
|
-
|
|
31
|
-
test('establish connection and send data through with protocol', async () => {
|
|
32
|
-
const stream1 = new TestStream();
|
|
33
|
-
const connection1 = new LibDataChannelTransport({
|
|
34
|
-
initiator: true,
|
|
35
|
-
stream: stream1,
|
|
36
|
-
sendSignal: async (signal) => {
|
|
37
|
-
await sleep(10);
|
|
38
|
-
await connection2.onSignal(signal);
|
|
39
|
-
},
|
|
40
|
-
});
|
|
41
|
-
await connection1.open();
|
|
42
|
-
afterTest(() => connection1.close());
|
|
43
|
-
afterTest(() => connection1.errors.assertNoUnhandledErrors());
|
|
44
|
-
|
|
45
|
-
const stream2 = new TestStream();
|
|
46
|
-
const connection2 = new LibDataChannelTransport({
|
|
47
|
-
initiator: false,
|
|
48
|
-
stream: stream2,
|
|
49
|
-
sendSignal: async (signal) => {
|
|
50
|
-
await sleep(10);
|
|
51
|
-
await connection1.onSignal(signal);
|
|
52
|
-
},
|
|
53
|
-
});
|
|
54
|
-
await connection2.open();
|
|
55
|
-
afterTest(() => connection2.close());
|
|
56
|
-
afterTest(() => connection2.errors.assertNoUnhandledErrors());
|
|
57
|
-
|
|
58
|
-
await TestStream.assertConnectivity(stream1, stream2, { timeout: 2_000 });
|
|
59
|
-
})
|
|
60
|
-
.onlyEnvironments('nodejs')
|
|
61
|
-
.timeout(2_000)
|
|
62
|
-
.retries(3);
|
|
63
|
-
|
|
64
|
-
test('establish connection between LibDataChannel and SimplePeer', async () => {
|
|
65
|
-
const stream1 = new TestStream();
|
|
66
|
-
const connection1 = new LibDataChannelTransport({
|
|
67
|
-
initiator: true,
|
|
68
|
-
stream: stream1,
|
|
69
|
-
sendSignal: async (signal) => {
|
|
70
|
-
log.debug('signal', signal);
|
|
71
|
-
|
|
72
|
-
await sleep(10);
|
|
73
|
-
await connection2.onSignal(signal);
|
|
74
|
-
},
|
|
75
|
-
});
|
|
76
|
-
await connection1.open();
|
|
77
|
-
afterTest(() => connection1.close());
|
|
78
|
-
afterTest(() => connection1.errors.assertNoUnhandledErrors());
|
|
79
|
-
|
|
80
|
-
const stream2 = new TestStream();
|
|
81
|
-
const connection2 = new SimplePeerTransport({
|
|
82
|
-
initiator: false,
|
|
83
|
-
stream: stream2,
|
|
84
|
-
sendSignal: async (signal) => {
|
|
85
|
-
log.debug('signal', signal);
|
|
86
|
-
|
|
87
|
-
await sleep(10);
|
|
88
|
-
await connection1.onSignal(signal);
|
|
89
|
-
},
|
|
90
|
-
});
|
|
91
|
-
await connection2.open();
|
|
92
|
-
afterTest(() => connection2.close());
|
|
93
|
-
afterTest(() => connection2.errors.assertNoUnhandledErrors());
|
|
94
|
-
|
|
95
|
-
await TestStream.assertConnectivity(stream1, stream2, { timeout: 2_000 });
|
|
96
|
-
})
|
|
97
|
-
.onlyEnvironments('nodejs')
|
|
98
|
-
.timeout(2_000)
|
|
99
|
-
.retries(3);
|
|
100
|
-
});
|
|
@@ -1,376 +0,0 @@
|
|
|
1
|
-
//
|
|
2
|
-
// Copyright 2023 DXOS.org
|
|
3
|
-
//
|
|
4
|
-
|
|
5
|
-
import { Duplex } from 'stream';
|
|
6
|
-
|
|
7
|
-
import { Event, Trigger, synchronized } from '@dxos/async';
|
|
8
|
-
import { ErrorStream } from '@dxos/debug';
|
|
9
|
-
import { invariant } from '@dxos/invariant';
|
|
10
|
-
import { log } from '@dxos/log';
|
|
11
|
-
import { type Signal } from '@dxos/protocols/proto/dxos/mesh/swarm';
|
|
12
|
-
|
|
13
|
-
import { type Transport, type TransportFactory, type TransportOptions, type TransportStats } from './transport';
|
|
14
|
-
import { type IceProvider } from '../signal';
|
|
15
|
-
|
|
16
|
-
const DATACHANNEL_LABEL = 'dxos.mesh.transport';
|
|
17
|
-
const MAX_BUFFERED_AMOUNT = 64 * 1024;
|
|
18
|
-
|
|
19
|
-
// https://viblast.com/blog/2015/2/5/webrtc-data-channel-message-size
|
|
20
|
-
const MAX_MESSAGE_SIZE = 64 * 1024;
|
|
21
|
-
|
|
22
|
-
export type LibDataChannelTransportOptions = TransportOptions & {
|
|
23
|
-
webrtcConfig?: RTCConfiguration;
|
|
24
|
-
iceProvider?: IceProvider;
|
|
25
|
-
};
|
|
26
|
-
|
|
27
|
-
export const createLibDataChannelTransportFactory = (
|
|
28
|
-
webrtcConfig?: RTCConfiguration,
|
|
29
|
-
iceProvider?: IceProvider,
|
|
30
|
-
): TransportFactory => {
|
|
31
|
-
return {
|
|
32
|
-
createTransport: (options) =>
|
|
33
|
-
new LibDataChannelTransport({
|
|
34
|
-
...options,
|
|
35
|
-
webrtcConfig,
|
|
36
|
-
iceProvider,
|
|
37
|
-
}),
|
|
38
|
-
};
|
|
39
|
-
};
|
|
40
|
-
|
|
41
|
-
/**
|
|
42
|
-
* Transport
|
|
43
|
-
*/
|
|
44
|
-
// TODO(burdon): Purpose (e.g., platform).
|
|
45
|
-
export class LibDataChannelTransport implements Transport {
|
|
46
|
-
private static _instanceCount = 0;
|
|
47
|
-
|
|
48
|
-
private _peer?: RTCPeerConnection;
|
|
49
|
-
private _channel!: RTCDataChannel;
|
|
50
|
-
private _stream!: Duplex;
|
|
51
|
-
|
|
52
|
-
private _closed = false;
|
|
53
|
-
private _connected = false;
|
|
54
|
-
|
|
55
|
-
private _writeCallback: (() => void) | null = null;
|
|
56
|
-
private readonly _readyForCandidates = new Trigger();
|
|
57
|
-
|
|
58
|
-
readonly closed = new Event();
|
|
59
|
-
readonly connected = new Event();
|
|
60
|
-
readonly errors = new ErrorStream();
|
|
61
|
-
|
|
62
|
-
constructor(private readonly _options: LibDataChannelTransportOptions) {}
|
|
63
|
-
|
|
64
|
-
get isOpen() {
|
|
65
|
-
return !!this._peer && !this._closed;
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
async open() {
|
|
69
|
-
if (this._closed) {
|
|
70
|
-
// TODO(burdon): Make idempotent?
|
|
71
|
-
this.errors.raise(new Error('connection already closed'));
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
// TODO(burdon): Move to factory?
|
|
75
|
-
/* eslint-disable @typescript-eslint/consistent-type-imports */
|
|
76
|
-
const { RTCPeerConnection } = (await importESM('node-datachannel/polyfill'))
|
|
77
|
-
.default as typeof import('node-datachannel/polyfill');
|
|
78
|
-
|
|
79
|
-
const providedIceServers = await this._options.iceProvider?.getIceServers();
|
|
80
|
-
|
|
81
|
-
// workaround https://github.com/murat-dogan/node-datachannel/pull/207
|
|
82
|
-
if (!this._options.webrtcConfig) {
|
|
83
|
-
this._options.webrtcConfig = {};
|
|
84
|
-
}
|
|
85
|
-
this._options.webrtcConfig.iceServers = [
|
|
86
|
-
...(this._options.webrtcConfig.iceServers ?? []),
|
|
87
|
-
...(providedIceServers ?? []),
|
|
88
|
-
];
|
|
89
|
-
|
|
90
|
-
this._peer = new RTCPeerConnection(this._options.webrtcConfig);
|
|
91
|
-
|
|
92
|
-
this._peer.onicecandidateerror = (event) => {
|
|
93
|
-
log.error('peer.onicecandidateerror', { event });
|
|
94
|
-
};
|
|
95
|
-
|
|
96
|
-
this._peer.onconnectionstatechange = (event) => {
|
|
97
|
-
log.debug('peer.onconnectionstatechange', {
|
|
98
|
-
event,
|
|
99
|
-
peerConnectionState: this._peer?.connectionState,
|
|
100
|
-
transportConnectionState: this._connected,
|
|
101
|
-
});
|
|
102
|
-
// TODO(nf): throw error if datachannel does not connect after some time?
|
|
103
|
-
// TODO(burdon): Restart ICE.
|
|
104
|
-
};
|
|
105
|
-
|
|
106
|
-
this._peer.onicecandidate = async (event) => {
|
|
107
|
-
log.debug('peer.onicecandidate', { event });
|
|
108
|
-
if (event.candidate) {
|
|
109
|
-
try {
|
|
110
|
-
await this._options.sendSignal({
|
|
111
|
-
payload: {
|
|
112
|
-
data: {
|
|
113
|
-
type: 'candidate',
|
|
114
|
-
candidate: {
|
|
115
|
-
candidate: event.candidate.candidate,
|
|
116
|
-
// These fields never seem to be not null, but connecting to Chrome doesn't work if they are.
|
|
117
|
-
sdpMLineIndex: event.candidate.sdpMLineIndex ?? 0,
|
|
118
|
-
sdpMid: event.candidate.sdpMid ?? 0,
|
|
119
|
-
},
|
|
120
|
-
},
|
|
121
|
-
},
|
|
122
|
-
});
|
|
123
|
-
} catch (err) {
|
|
124
|
-
log.info('signaling error', { err });
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
};
|
|
128
|
-
|
|
129
|
-
if (this._options.initiator) {
|
|
130
|
-
invariant(this._peer, 'not open');
|
|
131
|
-
// TODO(burdon): Deprecated negotiation pattern?
|
|
132
|
-
// https://developer.mozilla.org/en-US/docs/Web/API/WebRTC_API/Perfect_negotiation
|
|
133
|
-
this._peer
|
|
134
|
-
.createOffer()
|
|
135
|
-
.then(async (offer) => {
|
|
136
|
-
if (this._closed) {
|
|
137
|
-
return;
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
if (this._peer?.connectionState !== 'connecting') {
|
|
141
|
-
log.error('peer not connecting', { peer: this._peer });
|
|
142
|
-
this.errors.raise(new Error('invalid state: peer is initiator, but other peer not in state connecting'));
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
log.debug('creating offer', { peer: this._peer, offer });
|
|
146
|
-
await this._peer!.setLocalDescription(offer);
|
|
147
|
-
await this._options.sendSignal({ payload: { data: { type: offer.type, sdp: offer.sdp } } });
|
|
148
|
-
})
|
|
149
|
-
.catch((err) => {
|
|
150
|
-
this.errors.raise(err);
|
|
151
|
-
});
|
|
152
|
-
|
|
153
|
-
this._handleChannel(this._peer.createDataChannel(DATACHANNEL_LABEL));
|
|
154
|
-
|
|
155
|
-
log.debug('created data channel');
|
|
156
|
-
this._peer.ondatachannel = () => {
|
|
157
|
-
this.errors.raise(new Error('unexpected ondatachannel event for initiator'));
|
|
158
|
-
};
|
|
159
|
-
} else {
|
|
160
|
-
this._peer.ondatachannel = (event) => {
|
|
161
|
-
log.debug('peer.ondatachannel (non-initiator)', { event });
|
|
162
|
-
// TODO(nf): should the label contain some identifier?
|
|
163
|
-
if (event.channel.label !== DATACHANNEL_LABEL) {
|
|
164
|
-
this.errors.raise(new Error(`unexpected channel label ${event.channel.label}`));
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
this._handleChannel(event.channel);
|
|
168
|
-
};
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
LibDataChannelTransport._instanceCount++;
|
|
172
|
-
}
|
|
173
|
-
|
|
174
|
-
async close() {
|
|
175
|
-
await this._close();
|
|
176
|
-
if (--LibDataChannelTransport._instanceCount === 0) {
|
|
177
|
-
(await importESM('node-datachannel')).cleanup();
|
|
178
|
-
}
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
@synchronized
|
|
182
|
-
private async _close() {
|
|
183
|
-
if (this._closed) {
|
|
184
|
-
return;
|
|
185
|
-
}
|
|
186
|
-
await this._disconnectStreams();
|
|
187
|
-
|
|
188
|
-
try {
|
|
189
|
-
this._peer?.close();
|
|
190
|
-
} catch (err: any) {
|
|
191
|
-
this.errors.raise(err);
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
this._peer = undefined;
|
|
195
|
-
this._closed = true;
|
|
196
|
-
this.closed.emit();
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
/**
|
|
200
|
-
* Handle data channel events.
|
|
201
|
-
*/
|
|
202
|
-
private _handleChannel(dataChannel: RTCDataChannel) {
|
|
203
|
-
this._channel = dataChannel;
|
|
204
|
-
|
|
205
|
-
this._channel.onopen = () => {
|
|
206
|
-
log.debug('channel.onopen');
|
|
207
|
-
const duplex = new Duplex({
|
|
208
|
-
read: () => {},
|
|
209
|
-
write: async (chunk, encoding, callback) => {
|
|
210
|
-
// TODO(nf): Wait to open.
|
|
211
|
-
if (chunk.length > MAX_MESSAGE_SIZE) {
|
|
212
|
-
this.errors.raise(new Error(`message too large: ${chunk.length} > ${MAX_MESSAGE_SIZE}`));
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
try {
|
|
216
|
-
dataChannel.send(chunk);
|
|
217
|
-
} catch (err: any) {
|
|
218
|
-
this.errors.raise(err);
|
|
219
|
-
await this._close();
|
|
220
|
-
}
|
|
221
|
-
if (this._channel.bufferedAmount > MAX_BUFFERED_AMOUNT) {
|
|
222
|
-
if (this._writeCallback !== null) {
|
|
223
|
-
log.error('consumer trying to write before we are ready for more data');
|
|
224
|
-
}
|
|
225
|
-
this._writeCallback = callback;
|
|
226
|
-
} else {
|
|
227
|
-
callback();
|
|
228
|
-
}
|
|
229
|
-
},
|
|
230
|
-
});
|
|
231
|
-
|
|
232
|
-
duplex.pipe(this._options.stream).pipe(duplex);
|
|
233
|
-
this._stream = duplex;
|
|
234
|
-
this._connected = true;
|
|
235
|
-
this.connected.emit();
|
|
236
|
-
};
|
|
237
|
-
|
|
238
|
-
this._channel.onclose = async (err) => {
|
|
239
|
-
log.info('channel.onclose', { err });
|
|
240
|
-
await this._close();
|
|
241
|
-
};
|
|
242
|
-
|
|
243
|
-
this._channel.onerror = async (err) => {
|
|
244
|
-
this.errors.raise(new Error('channel error: ' + err.toString()));
|
|
245
|
-
await this._close();
|
|
246
|
-
};
|
|
247
|
-
|
|
248
|
-
this._channel.onbufferedamountlow = () => {
|
|
249
|
-
const cb = this._writeCallback;
|
|
250
|
-
this._writeCallback = null;
|
|
251
|
-
cb?.();
|
|
252
|
-
};
|
|
253
|
-
|
|
254
|
-
this._channel.onmessage = (event) => {
|
|
255
|
-
let data = event.data;
|
|
256
|
-
if (data instanceof ArrayBuffer) {
|
|
257
|
-
data = Buffer.from(data);
|
|
258
|
-
}
|
|
259
|
-
|
|
260
|
-
this._stream.push(data);
|
|
261
|
-
};
|
|
262
|
-
}
|
|
263
|
-
|
|
264
|
-
async onSignal(signal: Signal) {
|
|
265
|
-
invariant(this._peer, 'not open');
|
|
266
|
-
|
|
267
|
-
try {
|
|
268
|
-
const data = signal.payload.data;
|
|
269
|
-
switch (data.type) {
|
|
270
|
-
case 'offer': {
|
|
271
|
-
if (this._peer.connectionState !== 'new') {
|
|
272
|
-
log.error('received offer but peer not in state new', { peer: this._peer });
|
|
273
|
-
this.errors.raise(new Error('invalid signalling state: received offer when peer is not in state new'));
|
|
274
|
-
break;
|
|
275
|
-
}
|
|
276
|
-
|
|
277
|
-
try {
|
|
278
|
-
await this._peer.setRemoteDescription({ type: data.type, sdp: data.sdp });
|
|
279
|
-
const answer = await this._peer.createAnswer();
|
|
280
|
-
await this._peer.setLocalDescription(answer);
|
|
281
|
-
await this._options.sendSignal({ payload: { data: { type: answer.type, sdp: answer.sdp } } });
|
|
282
|
-
this._readyForCandidates.wake();
|
|
283
|
-
} catch (err) {
|
|
284
|
-
log.error('cannot handle offer from signalling server', { err });
|
|
285
|
-
this.errors.raise(new Error('error handling offer'));
|
|
286
|
-
}
|
|
287
|
-
break;
|
|
288
|
-
}
|
|
289
|
-
|
|
290
|
-
case 'answer':
|
|
291
|
-
try {
|
|
292
|
-
await this._peer.setRemoteDescription({ type: data.type, sdp: data.sdp });
|
|
293
|
-
this._readyForCandidates.wake();
|
|
294
|
-
} catch (err) {
|
|
295
|
-
log.error('cannot handle answer from signalling server', { err });
|
|
296
|
-
this.errors.raise(new Error('error handling answer'));
|
|
297
|
-
}
|
|
298
|
-
break;
|
|
299
|
-
|
|
300
|
-
case 'candidate':
|
|
301
|
-
await this._readyForCandidates.wait();
|
|
302
|
-
await this._peer.addIceCandidate({ candidate: data.candidate.candidate });
|
|
303
|
-
break;
|
|
304
|
-
|
|
305
|
-
default:
|
|
306
|
-
log.error('unhandled signal type', { type: data.type, signal });
|
|
307
|
-
this.errors.raise(new Error(`unhandled signal type ${data.type}`));
|
|
308
|
-
}
|
|
309
|
-
} catch (err) {
|
|
310
|
-
log.catch(err);
|
|
311
|
-
}
|
|
312
|
-
}
|
|
313
|
-
|
|
314
|
-
async getDetails(): Promise<string> {
|
|
315
|
-
const stats = await this._getStats();
|
|
316
|
-
const rc = stats?.remoteCandidate;
|
|
317
|
-
if (!rc) {
|
|
318
|
-
return 'unavailable';
|
|
319
|
-
}
|
|
320
|
-
|
|
321
|
-
if (rc.candidateType === 'relay') {
|
|
322
|
-
return `${rc.ip}:${rc.port} relay for ${rc.relatedAddress}:${rc.relatedPort}`;
|
|
323
|
-
}
|
|
324
|
-
|
|
325
|
-
return `${rc.ip}:${rc.port} ${rc.candidateType}`;
|
|
326
|
-
}
|
|
327
|
-
|
|
328
|
-
async getStats(): Promise<TransportStats> {
|
|
329
|
-
const stats = await this._getStats();
|
|
330
|
-
if (!stats) {
|
|
331
|
-
return {
|
|
332
|
-
bytesSent: 0,
|
|
333
|
-
bytesReceived: 0,
|
|
334
|
-
packetsSent: 0,
|
|
335
|
-
packetsReceived: 0,
|
|
336
|
-
rawStats: {},
|
|
337
|
-
};
|
|
338
|
-
}
|
|
339
|
-
|
|
340
|
-
return {
|
|
341
|
-
bytesSent: stats.transport.bytesSent,
|
|
342
|
-
bytesReceived: stats.transport.bytesReceived,
|
|
343
|
-
packetsSent: 0,
|
|
344
|
-
packetsReceived: 0,
|
|
345
|
-
rawStats: stats.raw,
|
|
346
|
-
};
|
|
347
|
-
}
|
|
348
|
-
|
|
349
|
-
async _getStats(): Promise<any> {
|
|
350
|
-
invariant(this._peer, 'not open');
|
|
351
|
-
const stats = await this._peer.getStats();
|
|
352
|
-
const statsEntries = Array.from((stats as any).entries() as any[]);
|
|
353
|
-
const transport = statsEntries.filter((s) => s[1].type === 'transport')[0][1];
|
|
354
|
-
const candidatePair = statsEntries.filter((s: any) => s[0] === transport.selectedCandidatePairId);
|
|
355
|
-
let selectedCandidatePair: any;
|
|
356
|
-
let remoteCandidate: any;
|
|
357
|
-
if (candidatePair.length > 0) {
|
|
358
|
-
selectedCandidatePair = candidatePair[0][1];
|
|
359
|
-
remoteCandidate = statsEntries.filter((s: any) => s[0] === selectedCandidatePair.remoteCandidateId)[0][1];
|
|
360
|
-
}
|
|
361
|
-
|
|
362
|
-
return {
|
|
363
|
-
transport,
|
|
364
|
-
selectedCandidatePair,
|
|
365
|
-
remoteCandidate,
|
|
366
|
-
raw: Object.fromEntries(stats as any),
|
|
367
|
-
};
|
|
368
|
-
}
|
|
369
|
-
|
|
370
|
-
private async _disconnectStreams() {
|
|
371
|
-
this._options.stream.unpipe?.(this._stream)?.unpipe?.(this._options.stream);
|
|
372
|
-
}
|
|
373
|
-
}
|
|
374
|
-
|
|
375
|
-
// eslint-disable-next-line no-new-func
|
|
376
|
-
const importESM = Function('path', 'return import(path)');
|