@dxos/network-manager 0.3.9-main.14901ff → 0.3.9-main.1b9ffda
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-S2JHWVGQ.mjs → chunk-KGZ5C6JO.mjs} +93 -31
- package/dist/lib/browser/{chunk-S2JHWVGQ.mjs.map → chunk-KGZ5C6JO.mjs.map} +3 -3
- package/dist/lib/browser/index.mjs +1 -1
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/testing/index.mjs +1 -1
- package/dist/lib/node/{chunk-DMWORJG3.cjs → chunk-JDKM4UPJ.cjs} +12 -13
- package/dist/lib/node/chunk-JDKM4UPJ.cjs.map +7 -0
- package/dist/lib/node/{chunk-3SCPMSHV.cjs → chunk-WUBZ4UOJ.cjs} +99 -37
- package/dist/lib/node/{chunk-3SCPMSHV.cjs.map → chunk-WUBZ4UOJ.cjs.map} +3 -3
- package/dist/lib/node/{datachannel-ABYQKZRC.cjs → datachannel-3VTTIMR5.cjs} +9 -9
- package/dist/lib/node/{datachannel-ABYQKZRC.cjs.map → datachannel-3VTTIMR5.cjs.map} +2 -2
- package/dist/lib/node/index.cjs +32 -32
- package/dist/lib/node/index.cjs.map +1 -1
- package/dist/lib/node/meta.json +1 -1
- package/dist/lib/node/testing/index.cjs +19 -19
- package/dist/types/src/topology/mmst-topology.d.ts +1 -0
- package/dist/types/src/topology/mmst-topology.d.ts.map +1 -1
- package/dist/types/src/transport/datachannel/rtc-peer-connection.d.ts.map +1 -1
- package/dist/types/src/transport/simplepeer-transport.d.ts +3 -0
- package/dist/types/src/transport/simplepeer-transport.d.ts.map +1 -1
- package/package.json +17 -17
- package/src/topology/mmst-topology.ts +34 -6
- package/src/transport/datachannel/rtc-peer-connection.ts +7 -11
- package/src/transport/libdatachannel-transport.test.ts +0 -4
- package/src/transport/simplepeer-transport.ts +5 -3
- package/dist/lib/node/chunk-DMWORJG3.cjs.map +0 -7
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dxos/network-manager",
|
|
3
|
-
"version": "0.3.9-main.
|
|
3
|
+
"version": "0.3.9-main.1b9ffda",
|
|
4
4
|
"description": "Network Manager",
|
|
5
5
|
"homepage": "https://dxos.org",
|
|
6
6
|
"bugs": "https://github.com/dxos/dxos/issues",
|
|
@@ -31,21 +31,21 @@
|
|
|
31
31
|
"tiny-invariant": "^1.3.1",
|
|
32
32
|
"ws": "^8.14.2",
|
|
33
33
|
"xor-distance": "^2.0.0",
|
|
34
|
-
"@dxos/async": "0.3.9-main.
|
|
35
|
-
"@dxos/
|
|
36
|
-
"@dxos/
|
|
37
|
-
"@dxos/
|
|
38
|
-
"@dxos/
|
|
39
|
-
"@dxos/debug": "0.3.9-main.
|
|
40
|
-
"@dxos/
|
|
41
|
-
"@dxos/
|
|
42
|
-
"@dxos/log": "0.3.9-main.
|
|
43
|
-
"@dxos/
|
|
44
|
-
"@dxos/node-std": "0.3.9-main.
|
|
45
|
-
"@dxos/
|
|
46
|
-
"@dxos/
|
|
47
|
-
"@dxos/util": "0.3.9-main.
|
|
48
|
-
"@dxos/
|
|
34
|
+
"@dxos/async": "0.3.9-main.1b9ffda",
|
|
35
|
+
"@dxos/context": "0.3.9-main.1b9ffda",
|
|
36
|
+
"@dxos/codec-protobuf": "0.3.9-main.1b9ffda",
|
|
37
|
+
"@dxos/crypto": "0.3.9-main.1b9ffda",
|
|
38
|
+
"@dxos/credentials": "0.3.9-main.1b9ffda",
|
|
39
|
+
"@dxos/debug": "0.3.9-main.1b9ffda",
|
|
40
|
+
"@dxos/keys": "0.3.9-main.1b9ffda",
|
|
41
|
+
"@dxos/messaging": "0.3.9-main.1b9ffda",
|
|
42
|
+
"@dxos/log": "0.3.9-main.1b9ffda",
|
|
43
|
+
"@dxos/invariant": "0.3.9-main.1b9ffda",
|
|
44
|
+
"@dxos/node-std": "0.3.9-main.1b9ffda",
|
|
45
|
+
"@dxos/protocols": "0.3.9-main.1b9ffda",
|
|
46
|
+
"@dxos/rpc": "0.3.9-main.1b9ffda",
|
|
47
|
+
"@dxos/util": "0.3.9-main.1b9ffda",
|
|
48
|
+
"@dxos/teleport": "0.3.9-main.1b9ffda"
|
|
49
49
|
},
|
|
50
50
|
"devDependencies": {
|
|
51
51
|
"@swc-node/register": "1.5.4",
|
|
@@ -55,7 +55,7 @@
|
|
|
55
55
|
"earljs": "~0.1.10",
|
|
56
56
|
"fast-check": "~3.3.0",
|
|
57
57
|
"typescript": "^5.2.2",
|
|
58
|
-
"@dxos/signal": "0.3.9-main.
|
|
58
|
+
"@dxos/signal": "0.3.9-main.1b9ffda"
|
|
59
59
|
},
|
|
60
60
|
"publishConfig": {
|
|
61
61
|
"access": "public"
|
|
@@ -10,6 +10,9 @@ import { log } from '@dxos/log';
|
|
|
10
10
|
|
|
11
11
|
import { type SwarmController, type Topology } from './topology';
|
|
12
12
|
|
|
13
|
+
const MIN_UPDATE_INTERVAL = 1000 * 10;
|
|
14
|
+
const MAX_CHANGES_PER_UPDATE = 1;
|
|
15
|
+
|
|
13
16
|
export interface MMSTTopologyOptions {
|
|
14
17
|
/**
|
|
15
18
|
* Number of connections the peer will originate by itself.
|
|
@@ -36,6 +39,8 @@ export class MMSTTopology implements Topology {
|
|
|
36
39
|
|
|
37
40
|
private _sampleCollected = false;
|
|
38
41
|
|
|
42
|
+
private _lastAction = new Date(0);
|
|
43
|
+
|
|
39
44
|
constructor({ originateConnections = 2, maxPeers = 4, sampleSize = 10 }: MMSTTopologyOptions = {}) {
|
|
40
45
|
this._originateConnections = originateConnections;
|
|
41
46
|
this._maxPeers = maxPeers;
|
|
@@ -74,22 +79,45 @@ export class MMSTTopology implements Topology {
|
|
|
74
79
|
invariant(this._controller, 'Not initialized');
|
|
75
80
|
const { connected, candidates, ownPeerId } = this._controller.getState();
|
|
76
81
|
|
|
82
|
+
// TODO(nf): does this rate limiting/flap dampening logic belong here or in the SwarmController?
|
|
77
83
|
if (connected.length > this._maxPeers) {
|
|
78
84
|
// Disconnect extra peers.
|
|
85
|
+
log(`disconnect ${connected.length - this._maxPeers} peers.`);
|
|
79
86
|
const sorted = sortByXorDistance(connected, ownPeerId)
|
|
80
87
|
.reverse()
|
|
81
88
|
.slice(0, this._maxPeers - connected.length);
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
89
|
+
invariant(sorted.length === 0);
|
|
90
|
+
|
|
91
|
+
if (sorted.length > MAX_CHANGES_PER_UPDATE) {
|
|
92
|
+
log(`want to disconnect ${sorted.length} peers but limited to ${MAX_CHANGES_PER_UPDATE}`);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
if (Date.now() - this._lastAction.getTime() > MIN_UPDATE_INTERVAL) {
|
|
96
|
+
for (const peer of sorted.slice(0, MAX_CHANGES_PER_UPDATE)) {
|
|
97
|
+
log(`Disconnect ${peer}.`);
|
|
98
|
+
this._controller.disconnect(peer);
|
|
99
|
+
}
|
|
100
|
+
this._lastAction = new Date();
|
|
101
|
+
} else {
|
|
102
|
+
log('rate limited discconnect');
|
|
85
103
|
}
|
|
86
104
|
} else if (connected.length < this._originateConnections) {
|
|
87
105
|
// Connect new peers to reach desired quota.
|
|
106
|
+
log(`connect ${this._originateConnections - connected.length} peers.`);
|
|
88
107
|
const sample = candidates.sort(() => Math.random() - 0.5).slice(0, this._sampleSize);
|
|
89
108
|
const sorted = sortByXorDistance(sample, ownPeerId).slice(0, this._originateConnections - connected.length);
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
109
|
+
|
|
110
|
+
if (sorted.length > MAX_CHANGES_PER_UPDATE) {
|
|
111
|
+
log(`want to connect ${sorted.length} peers but limited to ${MAX_CHANGES_PER_UPDATE}`);
|
|
112
|
+
}
|
|
113
|
+
if (Date.now() - this._lastAction.getTime() > MIN_UPDATE_INTERVAL) {
|
|
114
|
+
for (const peer of sorted.slice(0, MAX_CHANGES_PER_UPDATE)) {
|
|
115
|
+
log(`Connect ${peer}.`);
|
|
116
|
+
this._controller.connect(peer);
|
|
117
|
+
}
|
|
118
|
+
this._lastAction = new Date();
|
|
119
|
+
} else {
|
|
120
|
+
log('rate limited connect');
|
|
93
121
|
}
|
|
94
122
|
}
|
|
95
123
|
}
|
|
@@ -45,21 +45,17 @@ export class PeerConnection extends EventTarget implements RTCPeerConnection {
|
|
|
45
45
|
const iceServers = init.iceServers ?? [];
|
|
46
46
|
|
|
47
47
|
this.#peerConnection = new node.PeerConnection(`peer-${Math.random()}`, {
|
|
48
|
+
// convert https://developer.mozilla.org/en-US/docs/Web/API/RTCPeerConnection/RTCPeerConnection#iceservers to the format expected by https://github.com/murat-dogan/node-datachannel/blob/master/src/peer-connection-wrapper.cpp#L101
|
|
48
49
|
iceServers: iceServers
|
|
49
50
|
.map((server) => {
|
|
50
|
-
const urls =
|
|
51
|
+
const urls = Array.isArray(server.urls) ? server.urls : [server.urls];
|
|
51
52
|
|
|
52
53
|
return urls.map((url) => {
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
password: server.credential,
|
|
59
|
-
// relayType - how to specify?
|
|
60
|
-
};
|
|
61
|
-
|
|
62
|
-
return iceServer;
|
|
54
|
+
if (server.username && server.credential) {
|
|
55
|
+
const [protocol, rest] = url.split(/:(.*)/);
|
|
56
|
+
return `${protocol}:${server.username}:${server.credential}@${rest}`;
|
|
57
|
+
}
|
|
58
|
+
return url;
|
|
63
59
|
});
|
|
64
60
|
})
|
|
65
61
|
.flat(),
|
|
@@ -37,6 +37,9 @@ export class SimplePeerTransport implements Transport {
|
|
|
37
37
|
|
|
38
38
|
private readonly _instanceId = PublicKey.random().toHex();
|
|
39
39
|
|
|
40
|
+
/**
|
|
41
|
+
* @params opts.config formatted as per https://developer.mozilla.org/en-US/docs/Web/API/RTCPeerConnection/RTCPeerConnection
|
|
42
|
+
*/
|
|
40
43
|
constructor(private readonly params: SimplePeerTransportParams) {
|
|
41
44
|
log.trace('dxos.mesh.webrtc-transport.constructor', trace.begin({ id: this._instanceId }));
|
|
42
45
|
log('created connection', params);
|
|
@@ -179,8 +182,8 @@ export class SimplePeerTransport implements Transport {
|
|
|
179
182
|
return 'unavailable';
|
|
180
183
|
}
|
|
181
184
|
|
|
182
|
-
if (rc.relay) {
|
|
183
|
-
return `${rc.ip}:${rc.port}/${rc.protocol} relay for
|
|
185
|
+
if (rc.candidateType === 'relay') {
|
|
186
|
+
return `${rc.ip}:${rc.port}/${rc.protocol} relay for ${rc.relatedAddress}:${rc.relatedPort}`;
|
|
184
187
|
}
|
|
185
188
|
return `${rc.ip}:${rc.port}/${rc.protocol} ${rc.candidateType}`;
|
|
186
189
|
}
|
|
@@ -190,7 +193,6 @@ export class SimplePeerTransport implements Transport {
|
|
|
190
193
|
if (this._closed) {
|
|
191
194
|
return;
|
|
192
195
|
}
|
|
193
|
-
this._closed = true;
|
|
194
196
|
this._disconnectStreams();
|
|
195
197
|
this._peer!.destroy();
|
|
196
198
|
this._closed = true;
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/transport/datachannel/index.ts", "../../../src/transport/datachannel/rtc-ice-candidate.ts", "../../../src/transport/datachannel/rtc-peer-connection.ts", "../../../src/transport/datachannel/rtc-data-channel.ts", "../../../src/transport/datachannel/rtc-events.ts", "../../../src/transport/datachannel/rtc-session-description.ts"],
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport node from 'node-datachannel';\n\nimport { IceCandidate } from './rtc-ice-candidate';\nimport { PeerConnection } from './rtc-peer-connection';\nimport { SessionDescription } from './rtc-session-description';\n\nexport { SessionDescription as RTCSessionDescription };\nexport { IceCandidate as RTCIceCandidate };\nexport { PeerConnection as RTCPeerConnection };\n\nexport const cleanup = (): void => {\n node.cleanup();\n};\n", "//\n// Copyright 2023 DXOS.org\n//\n\n/**\n * @see https://developer.mozilla.org/docs/Web/API/RTCIceCandidate\n */\nexport class IceCandidate implements RTCIceCandidate {\n readonly address: string | null;\n readonly candidate: string;\n readonly component: RTCIceComponent | null;\n readonly foundation: string | null;\n readonly port: number | null;\n readonly priority: number | null;\n readonly protocol: RTCIceProtocol | null;\n readonly relatedAddress: string | null;\n readonly relatedPort: number | null;\n readonly sdpMLineIndex: number | null;\n readonly sdpMid: string | null;\n readonly tcpType: RTCIceTcpCandidateType | null;\n readonly type: RTCIceCandidateType | null;\n readonly usernameFragment: string | null;\n\n constructor(init: RTCIceCandidateInit) {\n if (init.candidate == null) {\n throw new DOMException('candidate must be specified');\n }\n\n this.candidate = init.candidate;\n this.sdpMLineIndex = init.sdpMLineIndex ?? null;\n this.sdpMid = init.sdpMid ?? null;\n this.usernameFragment = init.usernameFragment ?? null;\n\n this.address = null;\n this.component = null;\n this.foundation = null;\n this.port = null;\n this.priority = null;\n this.protocol = null;\n this.relatedAddress = null;\n this.relatedPort = null;\n this.tcpType = null;\n this.type = null;\n }\n\n toJSON(): RTCIceCandidateInit {\n return {\n candidate: this.candidate,\n sdpMLineIndex: this.sdpMLineIndex,\n sdpMid: this.sdpMid,\n usernameFragment: this.usernameFragment,\n };\n }\n}\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport node, { type SelectedCandidateInfo } from 'node-datachannel';\nimport defer, { type DeferredPromise } from 'p-defer';\n\nimport { DataChannel } from './rtc-data-channel';\nimport { DataChannelEvent, PeerConnectionIceEvent } from './rtc-events';\nimport { IceCandidate } from './rtc-ice-candidate';\nimport { SessionDescription } from './rtc-session-description';\n\nexport class PeerConnection extends EventTarget implements RTCPeerConnection {\n static async generateCertificate(keygenAlgorithm: AlgorithmIdentifier): Promise<RTCCertificate> {\n throw new Error('Not implemented');\n }\n\n canTrickleIceCandidates: boolean | null;\n sctp: RTCSctpTransport | null;\n\n onconnectionstatechange: ((this: RTCPeerConnection, ev: Event) => any) | null;\n ondatachannel: ((this: RTCPeerConnection, ev: RTCDataChannelEvent) => any) | null;\n onicecandidate: ((this: RTCPeerConnection, ev: RTCPeerConnectionIceEvent) => any) | null;\n onicecandidateerror: ((this: RTCPeerConnection, ev: Event) => any) | null;\n oniceconnectionstatechange: ((this: RTCPeerConnection, ev: Event) => any) | null;\n onicegatheringstatechange: ((this: RTCPeerConnection, ev: Event) => any) | null;\n onnegotiationneeded: ((this: RTCPeerConnection, ev: Event) => any) | null;\n onsignalingstatechange: ((this: RTCPeerConnection, ev: Event) => any) | null;\n ontrack: ((this: RTCPeerConnection, ev: RTCTrackEvent) => any) | null;\n\n #peerConnection: node.PeerConnection;\n #config: RTCConfiguration;\n #localOffer: DeferredPromise<RTCSessionDescriptionInit>;\n #localAnswer: DeferredPromise<RTCSessionDescriptionInit>;\n #dataChannels: Set<DataChannel>;\n\n constructor(init: RTCConfiguration = {}) {\n super();\n\n this.#config = init;\n this.#localOffer = defer();\n this.#localAnswer = defer();\n this.#dataChannels = new Set();\n\n const iceServers = init.iceServers ?? [];\n\n this.#peerConnection = new node.PeerConnection(`peer-${Math.random()}`, {\n iceServers: iceServers\n .map((server) => {\n const urls = (Array.isArray(server.urls) ? server.urls : [server.urls]).map((str) => new URL(str));\n\n return urls.map((url) => {\n /** @type {import('../lib/index.js').IceServer} */\n const iceServer = {\n hostname: url.hostname,\n port: parseInt(url.port, 10),\n username: server.username,\n password: server.credential,\n // relayType - how to specify?\n };\n\n return iceServer;\n });\n })\n .flat(),\n iceTransportPolicy: init?.iceTransportPolicy,\n });\n\n this.#peerConnection.onStateChange(() => {\n this.dispatchEvent(new Event('connectionstatechange'));\n });\n // https://github.com/murat-dogan/node-datachannel/pull/171\n // this.#peerConnection.onSignalingStateChange(() => {\n // this.dispatchEvent(new Event('signalingstatechange'))\n // })\n this.#peerConnection.onGatheringStateChange(() => {\n this.dispatchEvent(new Event('icegatheringstatechange'));\n });\n this.#peerConnection.onDataChannel((channel) => {\n this.dispatchEvent(new DataChannelEvent(new DataChannel(channel)));\n });\n\n // forward events to properties\n this.addEventListener('connectionstatechange', (event) => {\n this.onconnectionstatechange?.(event);\n });\n this.addEventListener('signalingstatechange', (event) => {\n this.onsignalingstatechange?.(event);\n });\n this.addEventListener('icegatheringstatechange', (event) => {\n this.onicegatheringstatechange?.(event);\n });\n this.addEventListener('datachannel', (event) => {\n this.ondatachannel?.(event as RTCDataChannelEvent);\n });\n\n this.#peerConnection.onLocalDescription((sdp, type) => {\n if (type === 'offer') {\n this.#localOffer.resolve({\n sdp,\n type,\n });\n }\n\n if (type === 'answer') {\n this.#localAnswer.resolve({\n sdp,\n type,\n });\n }\n });\n\n this.#peerConnection.onLocalCandidate((candidate, mid) => {\n if (mid === 'unspec') {\n this.#localAnswer.reject(new Error(`Invalid description type ${mid}`));\n return;\n }\n\n const event = new PeerConnectionIceEvent(new IceCandidate({ candidate }));\n\n this.onicecandidate?.(event);\n });\n\n this.canTrickleIceCandidates = null;\n this.sctp = null;\n this.onconnectionstatechange = null;\n this.ondatachannel = null;\n this.onicecandidate = null;\n this.onicecandidateerror = null;\n this.oniceconnectionstatechange = null;\n this.onicegatheringstatechange = null;\n this.onnegotiationneeded = null;\n this.onsignalingstatechange = null;\n this.ontrack = null;\n }\n\n get connectionState(): RTCPeerConnectionState {\n return assertState(this.#peerConnection.state(), RTCPeerConnectionStates);\n }\n\n get iceConnectionState(): RTCIceConnectionState {\n return assertState(this.#peerConnection.state(), RTCIceConnectionStates);\n }\n\n get iceGatheringState(): RTCIceGatheringState {\n return assertState(this.#peerConnection.gatheringState(), RTCIceGatheringStates);\n }\n\n get signalingState(): RTCSignalingState {\n return assertState(this.#peerConnection.signalingState(), RTCSignalingStates);\n }\n\n get currentLocalDescription(): RTCSessionDescription | null {\n return toSessionDescription(this.#peerConnection.localDescription());\n }\n\n get localDescription(): RTCSessionDescription | null {\n return toSessionDescription(this.#peerConnection.localDescription());\n }\n\n get pendingLocalDescription(): RTCSessionDescription | null {\n return toSessionDescription(this.#peerConnection.localDescription());\n }\n\n get currentRemoteDescription(): RTCSessionDescription | null {\n // not exposed by node-datachannel\n console.log(\"node-datachannel doesn't expose currentRemoteDescription\");\n return toSessionDescription(null);\n }\n\n get pendingRemoteDescription(): RTCSessionDescription | null {\n // not exposed by node-datachannel\n console.log(\"node-datachannel doesn't expose pendingRemoteDescription\");\n return toSessionDescription(null);\n }\n\n get remoteDescription(): RTCSessionDescription | null {\n // not exposed by node-datachannel\n console.log(\"node-datachannel doesn't expose remoteDescription\");\n return toSessionDescription(null);\n }\n\n async addIceCandidate(candidate?: RTCIceCandidateInit): Promise<void> {\n if (candidate == null || candidate.candidate == null) {\n throw new Error('Candidate invalid');\n }\n\n this.#peerConnection.addRemoteCandidate(candidate.candidate, candidate.sdpMid ?? '0');\n }\n\n getSelectedCandidatePair(): { local: SelectedCandidateInfo; remote: SelectedCandidateInfo } | null {\n return this.#peerConnection.getSelectedCandidatePair();\n }\n\n addTrack(track: MediaStreamTrack, ...streams: MediaStream[]): RTCRtpSender {\n throw new Error('addTrack Not implemented');\n }\n\n addTransceiver(trackOrKind: MediaStreamTrack | string, init?: RTCRtpTransceiverInit): RTCRtpTransceiver {\n throw new Error('addTransciever Not implemented');\n }\n\n close(): void {\n // close all channels before shutting down\n this.#dataChannels.forEach((channel) => {\n channel.close();\n });\n\n this.#peerConnection.close();\n this.#peerConnection.destroy();\n }\n\n bytesSent(): number {\n return this.#peerConnection.bytesSent();\n }\n\n bytesReceived(): number {\n return this.#peerConnection.bytesReceived();\n }\n\n createDataChannel(label: string, dataChannelDict: RTCDataChannelInit = {}): RTCDataChannel {\n const channel = this.#peerConnection.createDataChannel(label, dataChannelDict);\n const dataChannel = new DataChannel(channel, dataChannelDict);\n\n // ensure we can close all channels when shutting down\n this.#dataChannels.add(dataChannel);\n dataChannel.addEventListener('close', () => {\n this.#dataChannels.delete(dataChannel);\n });\n\n return dataChannel;\n }\n\n async createOffer(options?: RTCOfferOptions): Promise<RTCSessionDescriptionInit>;\n async createOffer(\n successCallback: RTCSessionDescriptionCallback,\n failureCallback: RTCPeerConnectionErrorCallback,\n options?: RTCOfferOptions,\n ): Promise<void>;\n\n async createOffer(...args: any[]): Promise<any> {\n return this.#localOffer.promise;\n }\n\n async createAnswer(options?: RTCAnswerOptions): Promise<RTCSessionDescriptionInit>;\n async createAnswer(\n successCallback: RTCSessionDescriptionCallback,\n failureCallback: RTCPeerConnectionErrorCallback,\n ): Promise<void>;\n\n async createAnswer(...args: any[]): Promise<any> {\n return this.#localAnswer.promise;\n }\n\n getConfiguration(): RTCConfiguration {\n return this.#config;\n }\n\n getReceivers(): RTCRtpReceiver[] {\n throw new Error('getReceivers Not implemented');\n }\n\n getSenders(): RTCRtpSender[] {\n throw new Error('getSenders Not implemented');\n }\n\n async getStats(selector?: MediaStreamTrack | null): Promise<RTCStatsReport> {\n throw new Error('getStats Not implemented');\n }\n\n getTransceivers(): RTCRtpTransceiver[] {\n throw new Error('getTranscievers Not implemented');\n }\n\n removeTrack(sender: RTCRtpSender): void {\n throw new Error('removeTrack Not implemented');\n }\n\n restartIce(): void {\n throw new Error('restartIce Not implemented');\n }\n\n setConfiguration(configuration: RTCConfiguration = {}): void {\n this.#config = configuration;\n }\n\n async setLocalDescription(description?: RTCLocalSessionDescriptionInit): Promise<void> {\n if (description == null || description.type == null) {\n throw new Error('Local description type must be set');\n }\n\n if (description.type !== 'offer') {\n console.log(`node-datachannel: setLocalDescription: only offer is supported, not ${description.type}`);\n // any other type causes libdatachannel to throw\n return;\n }\n\n // @ts-expect-error types are wrong\n this.#peerConnection.setLocalDescription(description.type);\n }\n\n async setRemoteDescription(description: RTCSessionDescriptionInit): Promise<void> {\n if (description.sdp == null) {\n throw new Error('Remote SDP must be set');\n }\n\n // @ts-expect-error types are wrong\n this.#peerConnection.setRemoteDescription(description.sdp, description.type);\n }\n}\n\nexport { PeerConnection as RTCPeerConnection };\n\nconst assertState = <T>(state: any, states: T[]): T => {\n if (state != null && !states.includes(state)) {\n throw new Error(`Invalid value encountered - \"${state}\" must be one of ${states}`);\n }\n\n return state as T;\n};\n\nconst toSessionDescription = (description: { sdp?: string; type: string } | null): RTCSessionDescription | null => {\n if (description == null) {\n return null;\n }\n\n return new SessionDescription({\n sdp: description.sdp,\n type: assertState(description.type, RTCSdpTypes),\n });\n};\n\nconst RTCPeerConnectionStates: RTCPeerConnectionState[] = [\n 'closed',\n 'connected',\n 'connecting',\n 'disconnected',\n 'failed',\n 'new',\n];\nconst RTCSdpTypes: RTCSdpType[] = ['answer', 'offer', 'pranswer', 'rollback'];\nconst RTCIceConnectionStates: RTCIceConnectionState[] = [\n 'checking',\n 'closed',\n 'completed',\n 'connected',\n 'disconnected',\n 'failed',\n 'new',\n];\nconst RTCIceGatheringStates: RTCIceGatheringState[] = ['complete', 'gathering', 'new'];\nconst RTCSignalingStates: RTCSignalingState[] = [\n 'closed',\n 'have-local-offer',\n 'have-local-pranswer',\n 'have-remote-offer',\n 'have-remote-pranswer',\n 'stable',\n];\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport type node from 'node-datachannel';\n\nexport class DataChannel extends EventTarget implements RTCDataChannel {\n binaryType: BinaryType;\n\n readonly maxPacketLifeTime: number | null;\n readonly maxRetransmits: number | null;\n readonly negotiated: boolean;\n readonly ordered: boolean;\n\n onbufferedamountlow: ((this: RTCDataChannel, ev: Event) => any) | null;\n onclose: ((this: RTCDataChannel, ev: Event) => any) | null;\n onclosing: ((this: RTCDataChannel, ev: Event) => any) | null;\n onerror: ((this: RTCDataChannel, ev: Event) => any) | null;\n onmessage: ((this: RTCDataChannel, ev: MessageEvent) => any) | null;\n onopen: ((this: RTCDataChannel, ev: Event) => any) | null;\n\n #dataChannel: node.DataChannel;\n #bufferedAmountLowThreshold: number;\n #readyState: RTCDataChannelState;\n\n constructor(dataChannel: node.DataChannel, dataChannelDict: RTCDataChannelInit = {}) {\n super();\n\n this.#dataChannel = dataChannel;\n this.#readyState = 'connecting';\n this.#bufferedAmountLowThreshold = 0;\n\n this.binaryType = 'arraybuffer';\n\n this.#dataChannel.onOpen(() => {\n this.#readyState = 'open';\n this.dispatchEvent(new Event('open'));\n });\n this.#dataChannel.onClosed(() => {\n this.#readyState = 'closed';\n this.dispatchEvent(new Event('close'));\n });\n this.#dataChannel.onError((msg) => {\n this.#readyState = 'closed';\n this.dispatchEvent(\n new RTCErrorEvent('error', {\n error: new RTCError(\n {\n errorDetail: 'data-channel-failure',\n },\n msg,\n ),\n }),\n );\n });\n this.#dataChannel.onBufferedAmountLow(() => {\n this.dispatchEvent(new Event('bufferedamountlow'));\n });\n this.#dataChannel.onMessage((data: string | Uint8Array) => {\n if (typeof data === 'string') {\n data = Buffer.from(data);\n }\n\n this.dispatchEvent(new MessageEvent('message', { data }));\n });\n\n // forward events to properties\n this.addEventListener('message', (event) => {\n this.onmessage?.(event as MessageEvent<ArrayBuffer>);\n });\n this.addEventListener('bufferedamountlow', (event) => {\n this.onbufferedamountlow?.(event);\n });\n this.addEventListener('error', (event) => {\n this.onerror?.(event);\n });\n this.addEventListener('close', (event) => {\n this.onclose?.(event);\n });\n this.addEventListener('closing', (event) => {\n this.onclosing?.(event);\n });\n this.addEventListener('open', (event) => {\n this.onopen?.(event);\n });\n\n this.onbufferedamountlow = null;\n this.onclose = null;\n this.onclosing = null;\n this.onerror = null;\n this.onmessage = null;\n this.onopen = null;\n\n this.maxPacketLifeTime = dataChannelDict.maxPacketLifeTime ?? null;\n this.maxRetransmits = dataChannelDict.maxRetransmits ?? null;\n this.negotiated = dataChannelDict.negotiated ?? false;\n this.ordered = dataChannelDict.ordered ?? true;\n }\n\n get id(): number {\n return this.#dataChannel.getId();\n }\n\n get label(): string {\n return this.#dataChannel.getLabel();\n }\n\n get protocol(): string {\n return this.#dataChannel.getProtocol();\n }\n\n get bufferedAmount(): number {\n return this.#dataChannel.bufferedAmount();\n }\n\n set bufferedAmountLowThreshold(threshold: number) {\n this.#bufferedAmountLowThreshold = threshold;\n this.#dataChannel.setBufferedAmountLowThreshold(threshold);\n }\n\n get bufferedAmountLowThreshold(): number {\n return this.#bufferedAmountLowThreshold;\n }\n\n get readyState(): RTCDataChannelState {\n return this.#readyState;\n }\n\n close(): void {\n this.#readyState = 'closing';\n this.dispatchEvent(new Event('closing'));\n\n this.#dataChannel.close();\n }\n\n send(data: string): void;\n send(data: Blob): void;\n send(data: ArrayBuffer): void;\n send(data: ArrayBufferView): void;\n send(data: any): void {\n // TODO: sending Blobs\n if (typeof data === 'string') {\n this.#dataChannel.sendMessage(data);\n } else {\n this.#dataChannel.sendMessageBinary(data);\n }\n }\n}\n", "//\n// Copyright 2023 DXOS.org\n//\n\nexport class PeerConnectionIceEvent extends Event implements RTCPeerConnectionIceEvent {\n readonly candidate: RTCIceCandidate | null;\n\n constructor(candidate: RTCIceCandidate) {\n super('icecandidate');\n\n this.candidate = candidate;\n }\n}\n\nexport class DataChannelEvent extends Event implements RTCDataChannelEvent {\n readonly channel: RTCDataChannel;\n\n constructor(channel: RTCDataChannel) {\n super('datachannel');\n\n this.channel = channel;\n }\n}\n", "//\n// Copyright 2023 DXOS.org\n//\n\n/**\n * @see https://developer.mozilla.org/docs/Web/API/RTCSessionDescription\n */\nexport class SessionDescription implements RTCSessionDescription {\n readonly sdp: string;\n readonly type: RTCSdpType;\n\n constructor(init: RTCSessionDescriptionInit) {\n this.sdp = init.sdp ?? '';\n this.type = init.type;\n }\n\n toJSON(): RTCSessionDescriptionInit {\n return {\n sdp: this.sdp,\n type: this.type,\n };\n }\n}\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAIA,8BAAiB;AEAjB,IAAAA,2BAAiD;AACjD,qBAA4C;;;;;;;;ADErC,IAAMC,eAAN,MAAMA;EAgBXC,YAAYC,MAA2B;AACrC,QAAIA,KAAKC,aAAa,MAAM;AAC1B,YAAM,IAAIC,aAAa,6BAAA;IACzB;AAEA,SAAKD,YAAYD,KAAKC;AACtB,SAAKE,gBAAgBH,KAAKG,iBAAiB;AAC3C,SAAKC,SAASJ,KAAKI,UAAU;AAC7B,SAAKC,mBAAmBL,KAAKK,oBAAoB;AAEjD,SAAKC,UAAU;AACf,SAAKC,YAAY;AACjB,SAAKC,aAAa;AAClB,SAAKC,OAAO;AACZ,SAAKC,WAAW;AAChB,SAAKC,WAAW;AAChB,SAAKC,iBAAiB;AACtB,SAAKC,cAAc;AACnB,SAAKC,UAAU;AACf,SAAKC,OAAO;EACd;EAEAC,SAA8B;AAC5B,WAAO;MACLf,WAAW,KAAKA;MAChBE,eAAe,KAAKA;MACpBC,QAAQ,KAAKA;MACbC,kBAAkB,KAAKA;IACzB;EACF;AACF;AE/CO,IAAMY,cAAN,cAA0BC,YAAAA;EAmB/BnB,YAAYoB,aAA+BC,kBAAsC,CAAC,GAAG;AACnF,UAAK;AAEL,SAAK,eAAeD;AACpB,SAAK,cAAc;AACnB,SAAK,8BAA8B;AAEnC,SAAKE,aAAa;AAElB,SAAK,aAAaC,OAAO,MAAA;AACvB,WAAK,cAAc;AACnB,WAAKC,cAAc,IAAIC,MAAM,MAAA,CAAA;IAC/B,CAAA;AACA,SAAK,aAAaC,SAAS,MAAA;AACzB,WAAK,cAAc;AACnB,WAAKF,cAAc,IAAIC,MAAM,OAAA,CAAA;IAC/B,CAAA;AACA,SAAK,aAAaE,QAAQ,CAACC,QAAAA;AACzB,WAAK,cAAc;AACnB,WAAKJ,cACH,IAAIK,cAAc,SAAS;QACzBC,OAAO,IAAIC,SACT;UACEC,aAAa;QACf,GACAJ,GAAAA;MAEJ,CAAA,CAAA;IAEJ,CAAA;AACA,SAAK,aAAaK,oBAAoB,MAAA;AACpC,WAAKT,cAAc,IAAIC,MAAM,mBAAA,CAAA;IAC/B,CAAA;AACA,SAAK,aAAaS,UAAU,CAACC,SAAAA;AAC3B,UAAI,OAAOA,SAAS,UAAU;AAC5BA,eAAOC,OAAOC,KAAKF,IAAAA;MACrB;AAEA,WAAKX,cAAc,IAAIc,aAAa,WAAW;QAAEH;MAAK,CAAA,CAAA;IACxD,CAAA;AAGA,SAAKI,iBAAiB,WAAW,CAACC,UAAAA;AAChC,WAAKC,YAAYD,KAAAA;IACnB,CAAA;AACA,SAAKD,iBAAiB,qBAAqB,CAACC,UAAAA;AAC1C,WAAKE,sBAAsBF,KAAAA;IAC7B,CAAA;AACA,SAAKD,iBAAiB,SAAS,CAACC,UAAAA;AAC9B,WAAKG,UAAUH,KAAAA;IACjB,CAAA;AACA,SAAKD,iBAAiB,SAAS,CAACC,UAAAA;AAC9B,WAAKI,UAAUJ,KAAAA;IACjB,CAAA;AACA,SAAKD,iBAAiB,WAAW,CAACC,UAAAA;AAChC,WAAKK,YAAYL,KAAAA;IACnB,CAAA;AACA,SAAKD,iBAAiB,QAAQ,CAACC,UAAAA;AAC7B,WAAKM,SAASN,KAAAA;IAChB,CAAA;AAEA,SAAKE,sBAAsB;AAC3B,SAAKE,UAAU;AACf,SAAKC,YAAY;AACjB,SAAKF,UAAU;AACf,SAAKF,YAAY;AACjB,SAAKK,SAAS;AAEd,SAAKC,oBAAoB1B,gBAAgB0B,qBAAqB;AAC9D,SAAKC,iBAAiB3B,gBAAgB2B,kBAAkB;AACxD,SAAKC,aAAa5B,gBAAgB4B,cAAc;AAChD,SAAKC,UAAU7B,gBAAgB6B,WAAW;EAC5C;EA5EA;EACA;EACA;EA4EA,IAAIC,KAAa;AACf,WAAO,KAAK,aAAaC,MAAK;EAChC;EAEA,IAAIC,QAAgB;AAClB,WAAO,KAAK,aAAaC,SAAQ;EACnC;EAEA,IAAI1C,WAAmB;AACrB,WAAO,KAAK,aAAa2C,YAAW;EACtC;EAEA,IAAIC,iBAAyB;AAC3B,WAAO,KAAK,aAAaA,eAAc;EACzC;EAEA,IAAIC,2BAA2BC,WAAmB;AAChD,SAAK,8BAA8BA;AACnC,SAAK,aAAaC,8BAA8BD,SAAAA;EAClD;EAEA,IAAID,6BAAqC;AACvC,WAAO,KAAK;EACd;EAEA,IAAIG,aAAkC;AACpC,WAAO,KAAK;EACd;EAEAC,QAAc;AACZ,SAAK,cAAc;AACnB,SAAKrC,cAAc,IAAIC,MAAM,SAAA,CAAA;AAE7B,SAAK,aAAaoC,MAAK;EACzB;EAMAC,KAAK3B,MAAiB;AAEpB,QAAI,OAAOA,SAAS,UAAU;AAC5B,WAAK,aAAa4B,YAAY5B,IAAAA;IAChC,OAAO;AACL,WAAK,aAAa6B,kBAAkB7B,IAAAA;IACtC;EACF;AACF;AC/IO,IAAM8B,yBAAN,cAAqCxC,MAAAA;EAG1CzB,YAAYE,WAA4B;AACtC,UAAM,cAAA;AAEN,SAAKA,YAAYA;EACnB;AACF;AAEO,IAAMgE,mBAAN,cAA+BzC,MAAAA;EAGpCzB,YAAYmE,SAAyB;AACnC,UAAM,aAAA;AAEN,SAAKA,UAAUA;EACjB;AACF;ACfO,IAAMC,qBAAN,MAAMA;EAIXpE,YAAYC,MAAiC;AAC3C,SAAKoE,MAAMpE,KAAKoE,OAAO;AACvB,SAAKrD,OAAOf,KAAKe;EACnB;EAEAC,SAAoC;AAClC,WAAO;MACLoD,KAAK,KAAKA;MACVrD,MAAM,KAAKA;IACb;EACF;AACF;AHVO,IAAMsD,iBAAN,cAA6BnD,YAAAA;EAwBlCnB,YAAYC,OAAyB,CAAC,GAAG;AACvC,UAAK;AAEL,SAAK,UAAUA;AACf,SAAK,kBAAcsE,eAAAA,SAAAA;AACnB,SAAK,mBAAeA,eAAAA,SAAAA;AACpB,SAAK,gBAAgB,oBAAIC,IAAAA;AAEzB,UAAMC,aAAaxE,KAAKwE,cAAc,CAAA;AAEtC,SAAK,kBAAkB,IAAIC,yBAAAA,QAAKJ,eAAe,QAAQK,KAAKC,OAAM,CAAA,IAAM;MACtEH,YAAYA,WACTI,IAAI,CAACC,WAAAA;AACJ,cAAMC,QAAQC,MAAMC,QAAQH,OAAOC,IAAI,IAAID,OAAOC,OAAO;UAACD,OAAOC;WAAOF,IAAI,CAACK,QAAQ,IAAIC,IAAID,GAAAA,CAAAA;AAE7F,eAAOH,KAAKF,IAAI,CAACO,QAAAA;AAEf,gBAAMC,YAAY;YAChBC,UAAUF,IAAIE;YACd5E,MAAM6E,SAASH,IAAI1E,MAAM,EAAA;YACzB8E,UAAUV,OAAOU;YACjBC,UAAUX,OAAOY;UAEnB;AAEA,iBAAOL;QACT,CAAA;MACF,CAAA,EACCM,KAAI;MACPC,oBAAoB3F,MAAM2F;IAC5B,CAAA;AAEA,SAAK,gBAAgBC,cAAc,MAAA;AACjC,WAAKrE,cAAc,IAAIC,MAAM,uBAAA,CAAA;IAC/B,CAAA;AAKA,SAAK,gBAAgBqE,uBAAuB,MAAA;AAC1C,WAAKtE,cAAc,IAAIC,MAAM,yBAAA,CAAA;IAC/B,CAAA;AACA,SAAK,gBAAgBsE,cAAc,CAAC5B,YAAAA;AAClC,WAAK3C,cAAc,IAAI0C,iBAAiB,IAAIhD,YAAYiD,OAAAA,CAAAA,CAAAA;IAC1D,CAAA;AAGA,SAAK5B,iBAAiB,yBAAyB,CAACC,UAAAA;AAC9C,WAAKwD,0BAA0BxD,KAAAA;IACjC,CAAA;AACA,SAAKD,iBAAiB,wBAAwB,CAACC,UAAAA;AAC7C,WAAKyD,yBAAyBzD,KAAAA;IAChC,CAAA;AACA,SAAKD,iBAAiB,2BAA2B,CAACC,UAAAA;AAChD,WAAK0D,4BAA4B1D,KAAAA;IACnC,CAAA;AACA,SAAKD,iBAAiB,eAAe,CAACC,UAAAA;AACpC,WAAK2D,gBAAgB3D,KAAAA;IACvB,CAAA;AAEA,SAAK,gBAAgB4D,mBAAmB,CAAC/B,KAAKrD,SAAAA;AAC5C,UAAIA,SAAS,SAAS;AACpB,aAAK,YAAYqF,QAAQ;UACvBhC;UACArD;QACF,CAAA;MACF;AAEA,UAAIA,SAAS,UAAU;AACrB,aAAK,aAAaqF,QAAQ;UACxBhC;UACArD;QACF,CAAA;MACF;IACF,CAAA;AAEA,SAAK,gBAAgBsF,iBAAiB,CAACpG,WAAWqG,QAAAA;AAChD,UAAIA,QAAQ,UAAU;AACpB,aAAK,aAAaC,OAAO,IAAIC,MAAM,4BAA4BF,GAAAA,EAAK,CAAA;AACpE;MACF;AAEA,YAAM/D,QAAQ,IAAIyB,uBAAuB,IAAIlE,aAAa;QAAEG;MAAU,CAAA,CAAA;AAEtE,WAAKwG,iBAAiBlE,KAAAA;IACxB,CAAA;AAEA,SAAKmE,0BAA0B;AAC/B,SAAKC,OAAO;AACZ,SAAKZ,0BAA0B;AAC/B,SAAKG,gBAAgB;AACrB,SAAKO,iBAAiB;AACtB,SAAKG,sBAAsB;AAC3B,SAAKC,6BAA6B;AAClC,SAAKZ,4BAA4B;AACjC,SAAKa,sBAAsB;AAC3B,SAAKd,yBAAyB;AAC9B,SAAKe,UAAU;EACjB;EAzHA,aAAaC,oBAAoBC,iBAA+D;AAC9F,UAAM,IAAIT,MAAM,iBAAA;EAClB;EAeA;EACA;EACA;EACA;EACA;EAsGA,IAAIU,kBAA0C;AAC5C,WAAOC,YAAY,KAAK,gBAAgBC,MAAK,GAAIC,uBAAAA;EACnD;EAEA,IAAIC,qBAA4C;AAC9C,WAAOH,YAAY,KAAK,gBAAgBC,MAAK,GAAIG,sBAAAA;EACnD;EAEA,IAAIC,oBAA0C;AAC5C,WAAOL,YAAY,KAAK,gBAAgBM,eAAc,GAAIC,qBAAAA;EAC5D;EAEA,IAAIC,iBAAoC;AACtC,WAAOR,YAAY,KAAK,gBAAgBQ,eAAc,GAAIC,kBAAAA;EAC5D;EAEA,IAAIC,0BAAwD;AAC1D,WAAOC,qBAAqB,KAAK,gBAAgBC,iBAAgB,CAAA;EACnE;EAEA,IAAIA,mBAAiD;AACnD,WAAOD,qBAAqB,KAAK,gBAAgBC,iBAAgB,CAAA;EACnE;EAEA,IAAIC,0BAAwD;AAC1D,WAAOF,qBAAqB,KAAK,gBAAgBC,iBAAgB,CAAA;EACnE;EAEA,IAAIE,2BAAyD;AAE3DC,YAAQC,IAAI,0DAAA;AACZ,WAAOL,qBAAqB,IAAA;EAC9B;EAEA,IAAIM,2BAAyD;AAE3DF,YAAQC,IAAI,0DAAA;AACZ,WAAOL,qBAAqB,IAAA;EAC9B;EAEA,IAAIO,oBAAkD;AAEpDH,YAAQC,IAAI,mDAAA;AACZ,WAAOL,qBAAqB,IAAA;EAC9B;EAEA,MAAMQ,gBAAgBrI,WAAgD;AACpE,QAAIA,aAAa,QAAQA,UAAUA,aAAa,MAAM;AACpD,YAAM,IAAIuG,MAAM,mBAAA;IAClB;AAEA,SAAK,gBAAgB+B,mBAAmBtI,UAAUA,WAAWA,UAAUG,UAAU,GAAA;EACnF;EAEAoI,2BAAmG;AACjG,WAAO,KAAK,gBAAgBA,yBAAwB;EACtD;EAEAC,SAASC,UAA4BC,SAAsC;AACzE,UAAM,IAAInC,MAAM,0BAAA;EAClB;EAEAoC,eAAeC,aAAwC7I,MAAiD;AACtG,UAAM,IAAIwG,MAAM,gCAAA;EAClB;EAEA5C,QAAc;AAEZ,SAAK,cAAckF,QAAQ,CAAC5E,YAAAA;AAC1BA,cAAQN,MAAK;IACf,CAAA;AAEA,SAAK,gBAAgBA,MAAK;AAC1B,SAAK,gBAAgBmF,QAAO;EAC9B;EAEAC,YAAoB;AAClB,WAAO,KAAK,gBAAgBA,UAAS;EACvC;EAEAC,gBAAwB;AACtB,WAAO,KAAK,gBAAgBA,cAAa;EAC3C;EAEAC,kBAAkB9F,OAAehC,kBAAsC,CAAC,GAAmB;AACzF,UAAM8C,UAAU,KAAK,gBAAgBgF,kBAAkB9F,OAAOhC,eAAAA;AAC9D,UAAMD,cAAc,IAAIF,YAAYiD,SAAS9C,eAAAA;AAG7C,SAAK,cAAc+H,IAAIhI,WAAAA;AACvBA,gBAAYmB,iBAAiB,SAAS,MAAA;AACpC,WAAK,cAAc8G,OAAOjI,WAAAA;IAC5B,CAAA;AAEA,WAAOA;EACT;EASA,MAAMkI,eAAeC,MAA2B;AAC9C,WAAO,KAAK,YAAYC;EAC1B;EAQA,MAAMC,gBAAgBF,MAA2B;AAC/C,WAAO,KAAK,aAAaC;EAC3B;EAEAE,mBAAqC;AACnC,WAAO,KAAK;EACd;EAEAC,eAAiC;AAC/B,UAAM,IAAIlD,MAAM,8BAAA;EAClB;EAEAmD,aAA6B;AAC3B,UAAM,IAAInD,MAAM,4BAAA;EAClB;EAEA,MAAMoD,SAASC,UAA6D;AAC1E,UAAM,IAAIrD,MAAM,0BAAA;EAClB;EAEAsD,kBAAuC;AACrC,UAAM,IAAItD,MAAM,iCAAA;EAClB;EAEAuD,YAAYC,QAA4B;AACtC,UAAM,IAAIxD,MAAM,6BAAA;EAClB;EAEAyD,aAAmB;AACjB,UAAM,IAAIzD,MAAM,4BAAA;EAClB;EAEA0D,iBAAiBC,gBAAkC,CAAC,GAAS;AAC3D,SAAK,UAAUA;EACjB;EAEA,MAAMC,oBAAoBC,aAA6D;AACrF,QAAIA,eAAe,QAAQA,YAAYtJ,QAAQ,MAAM;AACnD,YAAM,IAAIyF,MAAM,oCAAA;IAClB;AAEA,QAAI6D,YAAYtJ,SAAS,SAAS;AAChCmH,cAAQC,IAAI,uEAAuEkC,YAAYtJ,IAAI,EAAE;AAErG;IACF;AAGA,SAAK,gBAAgBqJ,oBAAoBC,YAAYtJ,IAAI;EAC3D;EAEA,MAAMuJ,qBAAqBD,aAAuD;AAChF,QAAIA,YAAYjG,OAAO,MAAM;AAC3B,YAAM,IAAIoC,MAAM,wBAAA;IAClB;AAGA,SAAK,gBAAgB8D,qBAAqBD,YAAYjG,KAAKiG,YAAYtJ,IAAI;EAC7E;AACF;AAIA,IAAMoG,cAAc,CAAIC,OAAYmD,WAAAA;AAClC,MAAInD,SAAS,QAAQ,CAACmD,OAAOC,SAASpD,KAAAA,GAAQ;AAC5C,UAAM,IAAIZ,MAAM,gCAAgCY,KAAAA,oBAAyBmD,MAAAA,EAAQ;EACnF;AAEA,SAAOnD;AACT;AAEA,IAAMU,uBAAuB,CAACuC,gBAAAA;AAC5B,MAAIA,eAAe,MAAM;AACvB,WAAO;EACT;AAEA,SAAO,IAAIlG,mBAAmB;IAC5BC,KAAKiG,YAAYjG;IACjBrD,MAAMoG,YAAYkD,YAAYtJ,MAAM0J,WAAAA;EACtC,CAAA;AACF;AAEA,IAAMpD,0BAAoD;EACxD;EACA;EACA;EACA;EACA;EACA;;AAEF,IAAMoD,cAA4B;EAAC;EAAU;EAAS;EAAY;;AAClE,IAAMlD,yBAAkD;EACtD;EACA;EACA;EACA;EACA;EACA;EACA;;AAEF,IAAMG,wBAAgD;EAAC;EAAY;EAAa;;AAChF,IAAME,qBAA0C;EAC9C;EACA;EACA;EACA;EACA;EACA;;AFvVK,IAAM8C,UAAU,MAAA;AACrBjG,0BAAAA,QAAKiG,QAAO;AACd;",
|
|
6
|
-
"names": ["import_node_datachannel", "IceCandidate", "constructor", "init", "candidate", "DOMException", "sdpMLineIndex", "sdpMid", "usernameFragment", "address", "component", "foundation", "port", "priority", "protocol", "relatedAddress", "relatedPort", "tcpType", "type", "toJSON", "DataChannel", "EventTarget", "dataChannel", "dataChannelDict", "binaryType", "onOpen", "dispatchEvent", "Event", "onClosed", "onError", "msg", "RTCErrorEvent", "error", "RTCError", "errorDetail", "onBufferedAmountLow", "onMessage", "data", "Buffer", "from", "MessageEvent", "addEventListener", "event", "onmessage", "onbufferedamountlow", "onerror", "onclose", "onclosing", "onopen", "maxPacketLifeTime", "maxRetransmits", "negotiated", "ordered", "id", "getId", "label", "getLabel", "getProtocol", "bufferedAmount", "bufferedAmountLowThreshold", "threshold", "setBufferedAmountLowThreshold", "readyState", "close", "send", "sendMessage", "sendMessageBinary", "PeerConnectionIceEvent", "DataChannelEvent", "channel", "SessionDescription", "sdp", "PeerConnection", "defer", "Set", "iceServers", "node", "Math", "random", "map", "server", "urls", "Array", "isArray", "str", "URL", "url", "iceServer", "hostname", "parseInt", "username", "password", "credential", "flat", "iceTransportPolicy", "onStateChange", "onGatheringStateChange", "onDataChannel", "onconnectionstatechange", "onsignalingstatechange", "onicegatheringstatechange", "ondatachannel", "onLocalDescription", "resolve", "onLocalCandidate", "mid", "reject", "Error", "onicecandidate", "canTrickleIceCandidates", "sctp", "onicecandidateerror", "oniceconnectionstatechange", "onnegotiationneeded", "ontrack", "generateCertificate", "keygenAlgorithm", "connectionState", "assertState", "state", "RTCPeerConnectionStates", "iceConnectionState", "RTCIceConnectionStates", "iceGatheringState", "gatheringState", "RTCIceGatheringStates", "signalingState", "RTCSignalingStates", "currentLocalDescription", "toSessionDescription", "localDescription", "pendingLocalDescription", "currentRemoteDescription", "console", "log", "pendingRemoteDescription", "remoteDescription", "addIceCandidate", "addRemoteCandidate", "getSelectedCandidatePair", "addTrack", "track", "streams", "addTransceiver", "trackOrKind", "forEach", "destroy", "bytesSent", "bytesReceived", "createDataChannel", "add", "delete", "createOffer", "args", "promise", "createAnswer", "getConfiguration", "getReceivers", "getSenders", "getStats", "selector", "getTransceivers", "removeTrack", "sender", "restartIce", "setConfiguration", "configuration", "setLocalDescription", "description", "setRemoteDescription", "states", "includes", "RTCSdpTypes", "cleanup"]
|
|
7
|
-
}
|