node-datachannel 0.29.0 → 0.30.0
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/.clang-format +17 -0
- package/CMakeLists.txt +5 -1
- package/dist/cjs/polyfill/RTCPeerConnection.cjs +6 -1
- package/dist/cjs/polyfill/RTCPeerConnection.cjs.map +1 -1
- package/dist/esm/polyfill/RTCPeerConnection.mjs +6 -1
- package/dist/esm/polyfill/RTCPeerConnection.mjs.map +1 -1
- package/dist/types/polyfill/RTCPeerConnection.d.ts +1 -2
- package/package.json +3 -2
- package/src/cpp/data-channel-wrapper.cpp +432 -411
- package/src/cpp/data-channel-wrapper.h +0 -2
- package/src/cpp/ice-udp-mux-listener-wrapper.cpp +104 -97
- package/src/cpp/main.cpp +11 -11
- package/src/cpp/media-audio-wrapper.cpp +291 -294
- package/src/cpp/media-audio-wrapper.h +1 -3
- package/src/cpp/media-direction.cpp +32 -32
- package/src/cpp/media-direction.h +1 -1
- package/src/cpp/media-rtcpreceivingsession-wrapper.cpp +24 -28
- package/src/cpp/media-rtcpreceivingsession-wrapper.h +0 -5
- package/src/cpp/media-track-wrapper.cpp +350 -339
- package/src/cpp/media-track-wrapper.h +0 -3
- package/src/cpp/media-video-wrapper.cpp +312 -313
- package/src/cpp/media-video-wrapper.h +1 -3
- package/src/cpp/peer-connection-wrapper.cpp +1094 -1047
- package/src/cpp/peer-connection-wrapper.h +0 -2
- package/src/cpp/rtc-wrapper.cpp +142 -138
- package/src/cpp/rtc-wrapper.h +8 -10
- package/src/cpp/thread-safe-callback.cpp +39 -50
- package/src/cpp/thread-safe-callback.h +26 -28
- package/src/cpp/web-socket-server-wrapper.cpp +205 -199
- package/src/cpp/web-socket-server-wrapper.h +0 -4
- package/src/cpp/web-socket-wrapper.cpp +625 -598
- package/src/cpp/web-socket-wrapper.h +0 -3
- package/src/polyfill/RTCPeerConnection.ts +9 -3
package/.clang-format
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
BasedOnStyle: LLVM
|
|
2
|
+
|
|
3
|
+
# Indentation
|
|
4
|
+
NamespaceIndentation: All
|
|
5
|
+
|
|
6
|
+
# Braces
|
|
7
|
+
BreakBeforeBraces: Allman
|
|
8
|
+
|
|
9
|
+
#include
|
|
10
|
+
SortIncludes: false
|
|
11
|
+
|
|
12
|
+
# Line Length
|
|
13
|
+
ColumnLimit: 120
|
|
14
|
+
|
|
15
|
+
# Line Breaks
|
|
16
|
+
AlwaysBreakTemplateDeclarations: true
|
|
17
|
+
LambdaBodyIndentation: OuterScope
|
package/CMakeLists.txt
CHANGED
|
@@ -2,7 +2,11 @@ cmake_minimum_required(VERSION 3.15)
|
|
|
2
2
|
cmake_policy(SET CMP0091 NEW)
|
|
3
3
|
cmake_policy(SET CMP0042 NEW)
|
|
4
4
|
|
|
5
|
-
project(node_datachannel VERSION 0.
|
|
5
|
+
project(node_datachannel VERSION 0.30.0)
|
|
6
|
+
|
|
7
|
+
# compile_commands.json
|
|
8
|
+
# -----------------------------------
|
|
9
|
+
set(CMAKE_EXPORT_COMPILE_COMMANDS True)
|
|
6
10
|
|
|
7
11
|
# -Dnapi_build_version=8
|
|
8
12
|
add_definitions(-DNAPI_VERSION=8)
|
|
@@ -287,7 +287,12 @@ class RTCPeerConnection extends EventTarget {
|
|
|
287
287
|
return __privateGet(this, _localAnswer);
|
|
288
288
|
}
|
|
289
289
|
createDataChannel(label, opts = {}) {
|
|
290
|
-
const
|
|
290
|
+
const nativeOpts = {
|
|
291
|
+
...opts,
|
|
292
|
+
// libdatachannel uses "unordered", opposite of RTCDataChannelInit.ordered
|
|
293
|
+
unordered: opts.ordered === false ? true : false
|
|
294
|
+
};
|
|
295
|
+
const channel = __privateGet(this, _peerConnection).createDataChannel(label, nativeOpts);
|
|
291
296
|
const dataChannel = new RTCDataChannel.default(channel, opts);
|
|
292
297
|
__privateGet(this, _dataChannels).add(dataChannel);
|
|
293
298
|
dataChannel.addEventListener("close", () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RTCPeerConnection.cjs","sources":["../../../src/polyfill/RTCPeerConnection.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { SelectedCandidateInfo } from '../lib/types';\nimport { PeerConnection } from '../lib/index';\nimport RTCSessionDescription from './RTCSessionDescription';\nimport RTCDataChannel from './RTCDataChannel';\nimport RTCIceCandidate from './RTCIceCandidate';\nimport { RTCDataChannelEvent, RTCPeerConnectionIceEvent } from './Events';\nimport RTCSctpTransport from './RTCSctpTransport';\nimport * as exceptions from './Exception';\nimport RTCCertificate from './RTCCertificate';\n\n// extend RTCConfiguration with peerIdentity\ninterface RTCConfiguration extends globalThis.RTCConfiguration {\n peerIdentity?: string;\n peerConnection?: PeerConnection;\n}\n\nexport default class RTCPeerConnection extends EventTarget implements globalThis.RTCPeerConnection {\n static async generateCertificate(): Promise<RTCCertificate> {\n throw new DOMException('Not implemented');\n }\n\n #peerConnection: PeerConnection;\n #localOffer: ReturnType<typeof createDeferredPromise>;\n #localAnswer: ReturnType<typeof createDeferredPromise>;\n #dataChannels: Set<globalThis.RTCDataChannel>;\n #dataChannelsClosed = 0;\n #config: globalThis.RTCConfiguration;\n #canTrickleIceCandidates: boolean | null = null;\n #sctp: globalThis.RTCSctpTransport;\n #announceNegotiation = false;\n\n #localCandidates: globalThis.RTCIceCandidate[] = [];\n #remoteCandidates: globalThis.RTCIceCandidate[] = [];\n\n // events\n onconnectionstatechange: globalThis.RTCPeerConnection['onconnectionstatechange'] = null;\n // For ondatachannel we need to define type manually\n ondatachannel: ((this: globalThis.RTCPeerConnection, ev: RTCDataChannelEvent) => any) | null;\n onicecandidate: globalThis.RTCPeerConnection['onicecandidate'] = null;\n onicecandidateerror: globalThis.RTCPeerConnection['onicecandidateerror'] = null;\n oniceconnectionstatechange: globalThis.RTCPeerConnection['oniceconnectionstatechange'] = null;\n onicegatheringstatechange: globalThis.RTCPeerConnection['onicegatheringstatechange'] = null;\n onnegotiationneeded: globalThis.RTCPeerConnection['onnegotiationneeded'] = null;\n onsignalingstatechange: globalThis.RTCPeerConnection['onsignalingstatechange'] = null;\n ontrack: globalThis.RTCPeerConnection['ontrack'] = null;\n\n private _checkConfiguration(config: globalThis.RTCConfiguration): void {\n if (config && config.iceServers === undefined) config.iceServers = [];\n if (config && config.iceTransportPolicy === undefined) config.iceTransportPolicy = 'all';\n\n if (config?.iceServers === null) throw new TypeError('IceServers cannot be null');\n\n // Check for all the properties of iceServers\n if (Array.isArray(config?.iceServers)) {\n for (let i = 0; i < config.iceServers.length; i++) {\n if (config.iceServers[i] === null) throw new TypeError('IceServers cannot be null');\n if (config.iceServers[i] === undefined)\n throw new TypeError('IceServers cannot be undefined');\n if (Object.keys(config.iceServers[i]).length === 0)\n throw new TypeError('IceServers cannot be empty');\n\n // If iceServers is string convert to array\n if (typeof config.iceServers[i].urls === 'string')\n config.iceServers[i].urls = [config.iceServers[i].urls as string];\n\n // urls can not be empty\n if ((config.iceServers[i].urls as string[])?.some((url) => url == ''))\n throw new exceptions.SyntaxError('IceServers urls cannot be empty');\n\n // urls should be valid URLs and match the protocols \"stun:|turn:|turns:\"\n if (\n (config.iceServers[i].urls as string[])?.some((url) => {\n try {\n const parsedURL = new URL(url);\n\n return !/^(stun:|turn:|turns:)$/.test(parsedURL.protocol);\n } catch (error) {\n return true;\n }\n })\n )\n throw new exceptions.SyntaxError('IceServers urls wrong format');\n\n // If this is a turn server check for username and credential\n if ((config.iceServers[i].urls as string[])?.some((url) => url.startsWith('turn'))) {\n if (!config.iceServers[i].username)\n throw new exceptions.InvalidAccessError('IceServers username cannot be null');\n if (!config.iceServers[i].credential)\n throw new exceptions.InvalidAccessError('IceServers username cannot be undefined');\n }\n\n // length of urls can not be 0\n if (config.iceServers[i].urls?.length === 0)\n throw new exceptions.SyntaxError('IceServers urls cannot be empty');\n }\n }\n\n if (\n config &&\n config.iceTransportPolicy &&\n config.iceTransportPolicy !== 'all' &&\n config.iceTransportPolicy !== 'relay'\n )\n throw new TypeError('IceTransportPolicy must be either \"all\" or \"relay\"');\n }\n\n setConfiguration(config: globalThis.RTCConfiguration): void {\n this._checkConfiguration(config);\n this.#config = config;\n }\n\n constructor(config: RTCConfiguration = { iceServers: [], iceTransportPolicy: 'all' }) {\n super();\n\n this._checkConfiguration(config);\n this.#config = config;\n this.#localOffer = createDeferredPromise();\n this.#localAnswer = createDeferredPromise();\n this.#dataChannels = new Set();\n this.#canTrickleIceCandidates = null;\n\n try {\n const peerIdentity = (config as any)?.peerIdentity ?? `peer-${getRandomString(7)}`;\n this.#peerConnection =\n config?.peerConnection ??\n new PeerConnection(peerIdentity, {\n ...config,\n iceServers:\n config?.iceServers\n ?.map((server) => {\n const urls = Array.isArray(server.urls) ? server.urls : [server.urls];\n\n return urls.map((url) => {\n if (server.username && server.credential) {\n const [protocol, rest] = url.split(/:(.*)/);\n return `${protocol}:${server.username}:${server.credential}@${rest}`;\n }\n return url;\n });\n })\n .flat() ?? [],\n });\n } catch (error) {\n if (!error || !error.message) throw new exceptions.NotFoundError('Unknown error');\n throw new exceptions.SyntaxError(error.message);\n }\n\n // forward peerConnection events\n this.#peerConnection.onStateChange(() => {\n this.dispatchEvent(new Event('connectionstatechange'));\n });\n\n this.#peerConnection.onIceStateChange(() => {\n this.dispatchEvent(new Event('iceconnectionstatechange'));\n });\n\n this.#peerConnection.onSignalingStateChange(() => {\n this.dispatchEvent(new Event('signalingstatechange'));\n });\n\n this.#peerConnection.onGatheringStateChange(() => {\n this.dispatchEvent(new Event('icegatheringstatechange'));\n });\n\n this.#peerConnection.onDataChannel((channel) => {\n const dc = new RTCDataChannel(channel);\n this.#dataChannels.add(dc);\n this.dispatchEvent(new RTCDataChannelEvent('datachannel', { channel: dc }));\n });\n\n this.#peerConnection.onLocalDescription((sdp, type) => {\n if (type === 'offer') {\n this.#localOffer.resolve(new RTCSessionDescription({ sdp, type }));\n }\n\n if (type === 'answer') {\n this.#localAnswer.resolve(new RTCSessionDescription({ sdp, type }));\n }\n });\n\n this.#peerConnection.onLocalCandidate((candidate, sdpMid) => {\n if (sdpMid === 'unspec') {\n this.#localAnswer.reject(new Error(`Invalid description type ${sdpMid}`));\n return;\n }\n\n this.#localCandidates.push(new RTCIceCandidate({ candidate, sdpMid }));\n this.dispatchEvent(new RTCPeerConnectionIceEvent(new RTCIceCandidate({ candidate, sdpMid })));\n });\n\n // forward events to properties\n this.addEventListener('connectionstatechange', (e) => {\n this.onconnectionstatechange?.(e);\n });\n this.addEventListener('signalingstatechange', (e) => {\n this.onsignalingstatechange?.(e);\n });\n this.addEventListener('iceconnectionstatechange', (e) => {\n this.oniceconnectionstatechange?.(e);\n });\n this.addEventListener('icegatheringstatechange', (e) => {\n this.onicegatheringstatechange?.(e);\n });\n this.addEventListener('datachannel', (e) => {\n this.ondatachannel?.(e as RTCDataChannelEvent);\n });\n this.addEventListener('icecandidate', (e) => {\n this.onicecandidate?.(e as globalThis.RTCPeerConnectionIceEvent);\n });\n this.addEventListener('track', (e) => {\n this.ontrack?.(e as RTCTrackEvent);\n });\n this.addEventListener('negotiationneeded', (e) => {\n this.#announceNegotiation = true;\n this.onnegotiationneeded?.(e);\n });\n\n this.#sctp = new RTCSctpTransport({\n pc: this,\n });\n }\n\n // Extra FUnctions\n get ext_maxDataChannelId(): number {\n return this.#peerConnection.maxDataChannelId();\n }\n\n get ext_maxMessageSize(): number {\n return this.#peerConnection.maxMessageSize();\n }\n\n get ext_localCandidates(): globalThis.RTCIceCandidate[] {\n return this.#localCandidates;\n }\n\n get ext_remoteCandidates(): globalThis.RTCIceCandidate[] {\n return this.#remoteCandidates;\n }\n\n selectedCandidatePair(): {\n local: SelectedCandidateInfo;\n remote: SelectedCandidateInfo;\n } | null {\n return this.#peerConnection.getSelectedCandidatePair();\n }\n\n get canTrickleIceCandidates(): boolean | null {\n return this.#canTrickleIceCandidates;\n }\n\n get connectionState(): globalThis.RTCPeerConnectionState {\n return this.#peerConnection.state();\n }\n\n get iceConnectionState(): globalThis.RTCIceConnectionState {\n let state = this.#peerConnection.iceState();\n // libdatachannel uses 'completed' instead of 'connected'\n // see /webrtc/getstats.html\n if (state == 'completed') state = 'connected';\n return state;\n }\n\n get iceGatheringState(): globalThis.RTCIceGatheringState {\n return this.#peerConnection.gatheringState();\n }\n\n get currentLocalDescription(): globalThis.RTCSessionDescription {\n return new RTCSessionDescription(this.#peerConnection.localDescription() as any);\n }\n\n get currentRemoteDescription(): globalThis.RTCSessionDescription {\n return new RTCSessionDescription(this.#peerConnection.remoteDescription() as any);\n }\n\n get localDescription(): globalThis.RTCSessionDescription {\n return new RTCSessionDescription(this.#peerConnection.localDescription() as any);\n }\n\n get pendingLocalDescription(): globalThis.RTCSessionDescription {\n return new RTCSessionDescription(this.#peerConnection.localDescription() as any);\n }\n\n get pendingRemoteDescription(): globalThis.RTCSessionDescription {\n return new RTCSessionDescription(this.#peerConnection.remoteDescription() as any);\n }\n\n get remoteDescription(): globalThis.RTCSessionDescription {\n return new RTCSessionDescription(this.#peerConnection.remoteDescription() as any);\n }\n\n get sctp(): globalThis.RTCSctpTransport {\n return this.#sctp;\n }\n\n get signalingState(): globalThis.RTCSignalingState {\n return this.#peerConnection.signalingState();\n }\n\n async addIceCandidate(candidate?: globalThis.RTCIceCandidateInit | null): Promise<void> {\n if (!candidate || !candidate.candidate) {\n return;\n }\n\n if (candidate.sdpMid === null && candidate.sdpMLineIndex === null) {\n throw new TypeError('sdpMid must be set');\n }\n\n if (candidate.sdpMid === undefined && candidate.sdpMLineIndex == undefined) {\n throw new TypeError('sdpMid must be set');\n }\n\n // Reject if sdpMid format is not valid\n // ??\n if (candidate.sdpMid && candidate.sdpMid.length > 3) {\n // console.log(candidate.sdpMid);\n throw new exceptions.OperationError('Invalid sdpMid format');\n }\n\n // We don't care about sdpMLineIndex, just for test\n if (!candidate.sdpMid && candidate.sdpMLineIndex > 1) {\n throw new exceptions.OperationError('This is only for test case.');\n }\n\n try {\n this.#peerConnection.addRemoteCandidate(candidate.candidate, candidate.sdpMid ?? '0');\n this.#remoteCandidates.push(\n new RTCIceCandidate({\n candidate: candidate.candidate,\n sdpMid: candidate.sdpMid ?? '0',\n }),\n );\n } catch (error) {\n if (!error || !error.message) throw new exceptions.NotFoundError('Unknown error');\n\n // Check error Message if contains specific message\n if (error.message.includes('remote candidate without remote description'))\n throw new exceptions.InvalidStateError(error.message);\n if (error.message.includes('Invalid candidate format'))\n throw new exceptions.OperationError(error.message);\n\n throw new exceptions.NotFoundError(error.message);\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n addTrack(_track, ..._streams): globalThis.RTCRtpSender {\n throw new DOMException('Not implemented');\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n addTransceiver(_trackOrKind, _init): globalThis.RTCRtpTransceiver {\n throw new DOMException('Not implemented');\n }\n\n close(): void {\n this.#peerConnection.close();\n }\n\n createAnswer(): Promise<globalThis.RTCSessionDescriptionInit | any> {\n return this.#localAnswer;\n }\n\n createDataChannel(label: string, opts: globalThis.RTCDataChannelInit = {}): RTCDataChannel {\n const channel = this.#peerConnection.createDataChannel(label, opts);\n const dataChannel = new RTCDataChannel(channel, opts);\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 this.#dataChannelsClosed++;\n });\n\n if (this.#announceNegotiation == null) {\n this.#announceNegotiation = false;\n this.dispatchEvent(new Event('negotiationneeded'));\n }\n\n return dataChannel;\n }\n\n createOffer(): Promise<globalThis.RTCSessionDescriptionInit | any> {\n return this.#localOffer;\n }\n\n getConfiguration(): globalThis.RTCConfiguration {\n return this.#config;\n }\n\n getReceivers(): globalThis.RTCRtpReceiver[] {\n throw new DOMException('Not implemented');\n }\n\n getSenders(): globalThis.RTCRtpSender[] {\n throw new DOMException('Not implemented');\n }\n\n getStats(): Promise<globalThis.RTCStatsReport> | any {\n return new Promise((resolve) => {\n const report = new Map();\n const cp = this.#peerConnection?.getSelectedCandidatePair();\n const bytesSent = this.#peerConnection?.bytesSent();\n const bytesReceived = this.#peerConnection?.bytesReceived();\n const rtt = this.#peerConnection?.rtt();\n\n if (!cp) {\n return resolve(report);\n }\n\n const localIdRs = getRandomString(8);\n const localId = 'RTCIceCandidate_' + localIdRs;\n report.set(localId, {\n id: localId,\n type: 'local-candidate',\n timestamp: Date.now(),\n candidateType: cp.local.type,\n ip: cp.local.address,\n port: cp.local.port,\n });\n\n const remoteIdRs = getRandomString(8);\n const remoteId = 'RTCIceCandidate_' + remoteIdRs;\n report.set(remoteId, {\n id: remoteId,\n type: 'remote-candidate',\n timestamp: Date.now(),\n candidateType: cp.remote.type,\n ip: cp.remote.address,\n port: cp.remote.port,\n });\n\n const candidateId = 'RTCIceCandidatePair_' + localIdRs + '_' + remoteIdRs;\n report.set(candidateId, {\n id: candidateId,\n type: 'candidate-pair',\n timestamp: Date.now(),\n localCandidateId: localId,\n remoteCandidateId: remoteId,\n state: 'succeeded',\n nominated: true,\n writable: true,\n bytesSent: bytesSent,\n bytesReceived: bytesReceived,\n totalRoundTripTime: rtt,\n currentRoundTripTime: rtt,\n });\n\n const transportId = 'RTCTransport_0_1';\n report.set(transportId, {\n id: transportId,\n timestamp: Date.now(),\n type: 'transport',\n bytesSent: bytesSent,\n bytesReceived: bytesReceived,\n dtlsState: 'connected',\n selectedCandidatePairId: candidateId,\n selectedCandidatePairChanges: 1,\n });\n\n // peer-connection'\n report.set('P', {\n id: 'P',\n type: 'peer-connection',\n timestamp: Date.now(),\n dataChannelsOpened: this.#dataChannels.size,\n dataChannelsClosed: this.#dataChannelsClosed,\n });\n\n return resolve(report);\n });\n }\n\n getTransceivers(): globalThis.RTCRtpTransceiver[] {\n return []; // throw new DOMException('Not implemented');\n }\n\n removeTrack(): void {\n throw new DOMException('Not implemented');\n }\n\n restartIce(): Promise<void> {\n throw new DOMException('Not implemented');\n }\n\n async setLocalDescription(description: globalThis.RTCSessionDescriptionInit): Promise<void> {\n if (description?.type !== 'offer') {\n // any other type causes libdatachannel to throw\n return;\n }\n\n this.#peerConnection.setLocalDescription(description?.type as any);\n }\n\n async setRemoteDescription(description: globalThis.RTCSessionDescriptionInit): Promise<void> {\n if (description.sdp == null) {\n throw new DOMException('Remote SDP must be set');\n }\n\n this.#peerConnection.setRemoteDescription(description.sdp, description.type as any);\n }\n}\n\nfunction createDeferredPromise(): any {\n let resolve: any, reject: any;\n\n const promise = new Promise(function (_resolve, _reject) {\n resolve = _resolve;\n reject = _reject;\n });\n\n (promise as any).resolve = resolve;\n (promise as any).reject = reject;\n return promise;\n}\n\nfunction getRandomString(length: number): string {\n return Math.random()\n .toString(36)\n .substring(2, 2 + length);\n}\n"],"names":["PeerConnection","exceptions.NotFoundError","exceptions.SyntaxError","RTCDataChannel","RTCDataChannelEvent","RTCSessionDescription","RTCIceCandidate","RTCPeerConnectionIceEvent","RTCSctpTransport","exceptions.InvalidAccessError","exceptions.OperationError","exceptions.InvalidStateError"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"RTCPeerConnection.cjs","sources":["../../../src/polyfill/RTCPeerConnection.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { DataChannelInitConfig, SelectedCandidateInfo } from '../lib/types';\nimport { PeerConnection } from '../lib/index';\nimport RTCSessionDescription from './RTCSessionDescription';\nimport RTCDataChannel from './RTCDataChannel';\nimport RTCIceCandidate from './RTCIceCandidate';\nimport { RTCDataChannelEvent, RTCPeerConnectionIceEvent } from './Events';\nimport RTCSctpTransport from './RTCSctpTransport';\nimport * as exceptions from './Exception';\nimport RTCCertificate from './RTCCertificate';\n\n// extend RTCConfiguration with peerIdentity\ninterface RTCConfiguration extends globalThis.RTCConfiguration {\n peerIdentity?: string;\n peerConnection?: PeerConnection;\n}\n\nexport default class RTCPeerConnection extends EventTarget implements globalThis.RTCPeerConnection {\n static async generateCertificate(): Promise<RTCCertificate> {\n throw new DOMException('Not implemented');\n }\n\n #peerConnection: PeerConnection;\n #localOffer: ReturnType<typeof createDeferredPromise>;\n #localAnswer: ReturnType<typeof createDeferredPromise>;\n #dataChannels: Set<globalThis.RTCDataChannel>;\n #dataChannelsClosed = 0;\n #config: globalThis.RTCConfiguration;\n #canTrickleIceCandidates: boolean | null = null;\n #sctp: globalThis.RTCSctpTransport;\n #announceNegotiation = false;\n\n #localCandidates: globalThis.RTCIceCandidate[] = [];\n #remoteCandidates: globalThis.RTCIceCandidate[] = [];\n\n // events\n onconnectionstatechange: globalThis.RTCPeerConnection['onconnectionstatechange'] = null;\n // For ondatachannel we need to define type manually\n ondatachannel: ((this: globalThis.RTCPeerConnection, ev: globalThis.RTCDataChannelEvent) => any) | null;\n onicecandidate: globalThis.RTCPeerConnection['onicecandidate'] = null;\n onicecandidateerror: globalThis.RTCPeerConnection['onicecandidateerror'] = null;\n oniceconnectionstatechange: globalThis.RTCPeerConnection['oniceconnectionstatechange'] = null;\n onicegatheringstatechange: globalThis.RTCPeerConnection['onicegatheringstatechange'] = null;\n onnegotiationneeded: globalThis.RTCPeerConnection['onnegotiationneeded'] = null;\n onsignalingstatechange: globalThis.RTCPeerConnection['onsignalingstatechange'] = null;\n ontrack: globalThis.RTCPeerConnection['ontrack'] = null;\n\n private _checkConfiguration(config: globalThis.RTCConfiguration): void {\n if (config && config.iceServers === undefined) config.iceServers = [];\n if (config && config.iceTransportPolicy === undefined) config.iceTransportPolicy = 'all';\n\n if (config?.iceServers === null) throw new TypeError('IceServers cannot be null');\n\n // Check for all the properties of iceServers\n if (Array.isArray(config?.iceServers)) {\n for (let i = 0; i < config.iceServers.length; i++) {\n if (config.iceServers[i] === null) throw new TypeError('IceServers cannot be null');\n if (config.iceServers[i] === undefined)\n throw new TypeError('IceServers cannot be undefined');\n if (Object.keys(config.iceServers[i]).length === 0)\n throw new TypeError('IceServers cannot be empty');\n\n // If iceServers is string convert to array\n if (typeof config.iceServers[i].urls === 'string')\n config.iceServers[i].urls = [config.iceServers[i].urls as string];\n\n // urls can not be empty\n if ((config.iceServers[i].urls as string[])?.some((url) => url == ''))\n throw new exceptions.SyntaxError('IceServers urls cannot be empty');\n\n // urls should be valid URLs and match the protocols \"stun:|turn:|turns:\"\n if (\n (config.iceServers[i].urls as string[])?.some((url) => {\n try {\n const parsedURL = new URL(url);\n\n return !/^(stun:|turn:|turns:)$/.test(parsedURL.protocol);\n } catch (error) {\n return true;\n }\n })\n )\n throw new exceptions.SyntaxError('IceServers urls wrong format');\n\n // If this is a turn server check for username and credential\n if ((config.iceServers[i].urls as string[])?.some((url) => url.startsWith('turn'))) {\n if (!config.iceServers[i].username)\n throw new exceptions.InvalidAccessError('IceServers username cannot be null');\n if (!config.iceServers[i].credential)\n throw new exceptions.InvalidAccessError('IceServers username cannot be undefined');\n }\n\n // length of urls can not be 0\n if (config.iceServers[i].urls?.length === 0)\n throw new exceptions.SyntaxError('IceServers urls cannot be empty');\n }\n }\n\n if (\n config &&\n config.iceTransportPolicy &&\n config.iceTransportPolicy !== 'all' &&\n config.iceTransportPolicy !== 'relay'\n )\n throw new TypeError('IceTransportPolicy must be either \"all\" or \"relay\"');\n }\n\n setConfiguration(config: globalThis.RTCConfiguration): void {\n this._checkConfiguration(config);\n this.#config = config;\n }\n\n constructor(config: RTCConfiguration = { iceServers: [], iceTransportPolicy: 'all' }) {\n super();\n\n this._checkConfiguration(config);\n this.#config = config;\n this.#localOffer = createDeferredPromise();\n this.#localAnswer = createDeferredPromise();\n this.#dataChannels = new Set();\n this.#canTrickleIceCandidates = null;\n\n try {\n const peerIdentity = (config as any)?.peerIdentity ?? `peer-${getRandomString(7)}`;\n this.#peerConnection =\n config?.peerConnection ??\n new PeerConnection(peerIdentity, {\n ...config,\n iceServers:\n config?.iceServers\n ?.map((server) => {\n const urls = Array.isArray(server.urls) ? server.urls : [server.urls];\n\n return urls.map((url) => {\n if (server.username && server.credential) {\n const [protocol, rest] = url.split(/:(.*)/);\n return `${protocol}:${server.username}:${server.credential}@${rest}`;\n }\n return url;\n });\n })\n .flat() ?? [],\n });\n } catch (error) {\n if (!error || !error.message) throw new exceptions.NotFoundError('Unknown error');\n throw new exceptions.SyntaxError(error.message);\n }\n\n // forward peerConnection events\n this.#peerConnection.onStateChange(() => {\n this.dispatchEvent(new Event('connectionstatechange'));\n });\n\n this.#peerConnection.onIceStateChange(() => {\n this.dispatchEvent(new Event('iceconnectionstatechange'));\n });\n\n this.#peerConnection.onSignalingStateChange(() => {\n this.dispatchEvent(new Event('signalingstatechange'));\n });\n\n this.#peerConnection.onGatheringStateChange(() => {\n this.dispatchEvent(new Event('icegatheringstatechange'));\n });\n\n this.#peerConnection.onDataChannel((channel) => {\n const dc = new RTCDataChannel(channel);\n this.#dataChannels.add(dc);\n this.dispatchEvent(new RTCDataChannelEvent('datachannel', { channel: dc }));\n });\n\n this.#peerConnection.onLocalDescription((sdp, type) => {\n if (type === 'offer') {\n this.#localOffer.resolve(new RTCSessionDescription({ sdp, type }));\n }\n\n if (type === 'answer') {\n this.#localAnswer.resolve(new RTCSessionDescription({ sdp, type }));\n }\n });\n\n this.#peerConnection.onLocalCandidate((candidate, sdpMid) => {\n if (sdpMid === 'unspec') {\n this.#localAnswer.reject(new Error(`Invalid description type ${sdpMid}`));\n return;\n }\n\n this.#localCandidates.push(new RTCIceCandidate({ candidate, sdpMid }));\n this.dispatchEvent(new RTCPeerConnectionIceEvent(new RTCIceCandidate({ candidate, sdpMid })));\n });\n\n // forward events to properties\n this.addEventListener('connectionstatechange', (e) => {\n this.onconnectionstatechange?.(e);\n });\n this.addEventListener('signalingstatechange', (e) => {\n this.onsignalingstatechange?.(e);\n });\n this.addEventListener('iceconnectionstatechange', (e) => {\n this.oniceconnectionstatechange?.(e);\n });\n this.addEventListener('icegatheringstatechange', (e) => {\n this.onicegatheringstatechange?.(e);\n });\n this.addEventListener('datachannel', (e) => {\n this.ondatachannel?.(e as RTCDataChannelEvent);\n });\n this.addEventListener('icecandidate', (e) => {\n this.onicecandidate?.(e as globalThis.RTCPeerConnectionIceEvent);\n });\n this.addEventListener('track', (e) => {\n this.ontrack?.(e as RTCTrackEvent);\n });\n this.addEventListener('negotiationneeded', (e) => {\n this.#announceNegotiation = true;\n this.onnegotiationneeded?.(e);\n });\n\n this.#sctp = new RTCSctpTransport({\n pc: this,\n });\n }\n\n // Extra FUnctions\n get ext_maxDataChannelId(): number {\n return this.#peerConnection.maxDataChannelId();\n }\n\n get ext_maxMessageSize(): number {\n return this.#peerConnection.maxMessageSize();\n }\n\n get ext_localCandidates(): globalThis.RTCIceCandidate[] {\n return this.#localCandidates;\n }\n\n get ext_remoteCandidates(): globalThis.RTCIceCandidate[] {\n return this.#remoteCandidates;\n }\n\n selectedCandidatePair(): {\n local: SelectedCandidateInfo;\n remote: SelectedCandidateInfo;\n } | null {\n return this.#peerConnection.getSelectedCandidatePair();\n }\n\n get canTrickleIceCandidates(): boolean | null {\n return this.#canTrickleIceCandidates;\n }\n\n get connectionState(): globalThis.RTCPeerConnectionState {\n return this.#peerConnection.state();\n }\n\n get iceConnectionState(): globalThis.RTCIceConnectionState {\n let state = this.#peerConnection.iceState();\n // libdatachannel uses 'completed' instead of 'connected'\n // see /webrtc/getstats.html\n if (state == 'completed') state = 'connected';\n return state;\n }\n\n get iceGatheringState(): globalThis.RTCIceGatheringState {\n return this.#peerConnection.gatheringState();\n }\n\n get currentLocalDescription(): globalThis.RTCSessionDescription {\n return new RTCSessionDescription(this.#peerConnection.localDescription() as any);\n }\n\n get currentRemoteDescription(): globalThis.RTCSessionDescription {\n return new RTCSessionDescription(this.#peerConnection.remoteDescription() as any);\n }\n\n get localDescription(): globalThis.RTCSessionDescription {\n return new RTCSessionDescription(this.#peerConnection.localDescription() as any);\n }\n\n get pendingLocalDescription(): globalThis.RTCSessionDescription {\n return new RTCSessionDescription(this.#peerConnection.localDescription() as any);\n }\n\n get pendingRemoteDescription(): globalThis.RTCSessionDescription {\n return new RTCSessionDescription(this.#peerConnection.remoteDescription() as any);\n }\n\n get remoteDescription(): globalThis.RTCSessionDescription {\n return new RTCSessionDescription(this.#peerConnection.remoteDescription() as any);\n }\n\n get sctp(): globalThis.RTCSctpTransport {\n return this.#sctp;\n }\n\n get signalingState(): globalThis.RTCSignalingState {\n return this.#peerConnection.signalingState();\n }\n\n async addIceCandidate(candidate?: globalThis.RTCIceCandidateInit | null): Promise<void> {\n if (!candidate || !candidate.candidate) {\n return;\n }\n\n if (candidate.sdpMid === null && candidate.sdpMLineIndex === null) {\n throw new TypeError('sdpMid must be set');\n }\n\n if (candidate.sdpMid === undefined && candidate.sdpMLineIndex == undefined) {\n throw new TypeError('sdpMid must be set');\n }\n\n // Reject if sdpMid format is not valid\n // ??\n if (candidate.sdpMid && candidate.sdpMid.length > 3) {\n // console.log(candidate.sdpMid);\n throw new exceptions.OperationError('Invalid sdpMid format');\n }\n\n // We don't care about sdpMLineIndex, just for test\n if (!candidate.sdpMid && candidate.sdpMLineIndex > 1) {\n throw new exceptions.OperationError('This is only for test case.');\n }\n\n try {\n this.#peerConnection.addRemoteCandidate(candidate.candidate, candidate.sdpMid ?? '0');\n this.#remoteCandidates.push(\n new RTCIceCandidate({\n candidate: candidate.candidate,\n sdpMid: candidate.sdpMid ?? '0',\n }),\n );\n } catch (error) {\n if (!error || !error.message) throw new exceptions.NotFoundError('Unknown error');\n\n // Check error Message if contains specific message\n if (error.message.includes('remote candidate without remote description'))\n throw new exceptions.InvalidStateError(error.message);\n if (error.message.includes('Invalid candidate format'))\n throw new exceptions.OperationError(error.message);\n\n throw new exceptions.NotFoundError(error.message);\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n addTrack(_track, ..._streams): globalThis.RTCRtpSender {\n throw new DOMException('Not implemented');\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n addTransceiver(_trackOrKind, _init): globalThis.RTCRtpTransceiver {\n throw new DOMException('Not implemented');\n }\n\n close(): void {\n this.#peerConnection.close();\n }\n\n createAnswer(): Promise<globalThis.RTCSessionDescriptionInit | any> {\n return this.#localAnswer;\n }\n\n createDataChannel(label: string, opts: globalThis.RTCDataChannelInit = {}): RTCDataChannel {\n const nativeOpts: DataChannelInitConfig = {\n ...opts,\n // libdatachannel uses \"unordered\", opposite of RTCDataChannelInit.ordered\n unordered: opts.ordered === false ? true : false,\n };\n\n const channel = this.#peerConnection.createDataChannel(label, nativeOpts);\n const dataChannel = new RTCDataChannel(channel, opts);\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 this.#dataChannelsClosed++;\n });\n\n if (this.#announceNegotiation == null) {\n this.#announceNegotiation = false;\n this.dispatchEvent(new Event('negotiationneeded'));\n }\n\n return dataChannel;\n }\n\n createOffer(): Promise<globalThis.RTCSessionDescriptionInit | any> {\n return this.#localOffer;\n }\n\n getConfiguration(): globalThis.RTCConfiguration {\n return this.#config;\n }\n\n getReceivers(): globalThis.RTCRtpReceiver[] {\n throw new DOMException('Not implemented');\n }\n\n getSenders(): globalThis.RTCRtpSender[] {\n throw new DOMException('Not implemented');\n }\n\n getStats(): Promise<globalThis.RTCStatsReport> | any {\n return new Promise((resolve) => {\n const report = new Map();\n const cp = this.#peerConnection?.getSelectedCandidatePair();\n const bytesSent = this.#peerConnection?.bytesSent();\n const bytesReceived = this.#peerConnection?.bytesReceived();\n const rtt = this.#peerConnection?.rtt();\n\n if (!cp) {\n return resolve(report);\n }\n\n const localIdRs = getRandomString(8);\n const localId = 'RTCIceCandidate_' + localIdRs;\n report.set(localId, {\n id: localId,\n type: 'local-candidate',\n timestamp: Date.now(),\n candidateType: cp.local.type,\n ip: cp.local.address,\n port: cp.local.port,\n });\n\n const remoteIdRs = getRandomString(8);\n const remoteId = 'RTCIceCandidate_' + remoteIdRs;\n report.set(remoteId, {\n id: remoteId,\n type: 'remote-candidate',\n timestamp: Date.now(),\n candidateType: cp.remote.type,\n ip: cp.remote.address,\n port: cp.remote.port,\n });\n\n const candidateId = 'RTCIceCandidatePair_' + localIdRs + '_' + remoteIdRs;\n report.set(candidateId, {\n id: candidateId,\n type: 'candidate-pair',\n timestamp: Date.now(),\n localCandidateId: localId,\n remoteCandidateId: remoteId,\n state: 'succeeded',\n nominated: true,\n writable: true,\n bytesSent: bytesSent,\n bytesReceived: bytesReceived,\n totalRoundTripTime: rtt,\n currentRoundTripTime: rtt,\n });\n\n const transportId = 'RTCTransport_0_1';\n report.set(transportId, {\n id: transportId,\n timestamp: Date.now(),\n type: 'transport',\n bytesSent: bytesSent,\n bytesReceived: bytesReceived,\n dtlsState: 'connected',\n selectedCandidatePairId: candidateId,\n selectedCandidatePairChanges: 1,\n });\n\n // peer-connection'\n report.set('P', {\n id: 'P',\n type: 'peer-connection',\n timestamp: Date.now(),\n dataChannelsOpened: this.#dataChannels.size,\n dataChannelsClosed: this.#dataChannelsClosed,\n });\n\n return resolve(report);\n });\n }\n\n getTransceivers(): globalThis.RTCRtpTransceiver[] {\n return []; // throw new DOMException('Not implemented');\n }\n\n removeTrack(): void {\n throw new DOMException('Not implemented');\n }\n\n restartIce(): Promise<void> {\n throw new DOMException('Not implemented');\n }\n\n async setLocalDescription(description: globalThis.RTCSessionDescriptionInit): Promise<void> {\n if (description?.type !== 'offer') {\n // any other type causes libdatachannel to throw\n return;\n }\n\n this.#peerConnection.setLocalDescription(description?.type as any);\n }\n\n async setRemoteDescription(description: globalThis.RTCSessionDescriptionInit): Promise<void> {\n if (description.sdp == null) {\n throw new DOMException('Remote SDP must be set');\n }\n\n this.#peerConnection.setRemoteDescription(description.sdp, description.type as any);\n }\n}\n\nfunction createDeferredPromise(): any {\n let resolve: any, reject: any;\n\n const promise = new Promise(function (_resolve, _reject) {\n resolve = _resolve;\n reject = _reject;\n });\n\n (promise as any).resolve = resolve;\n (promise as any).reject = reject;\n return promise;\n}\n\nfunction getRandomString(length: number): string {\n return Math.random()\n .toString(36)\n .substring(2, 2 + length);\n}\n"],"names":["PeerConnection","exceptions.NotFoundError","exceptions.SyntaxError","RTCDataChannel","RTCDataChannelEvent","RTCSessionDescription","RTCIceCandidate","RTCPeerConnectionIceEvent","RTCSctpTransport","exceptions.InvalidAccessError","exceptions.OperationError","exceptions.InvalidStateError"],"mappings":"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"}
|
|
@@ -283,7 +283,12 @@ class RTCPeerConnection extends EventTarget {
|
|
|
283
283
|
return __privateGet(this, _localAnswer);
|
|
284
284
|
}
|
|
285
285
|
createDataChannel(label, opts = {}) {
|
|
286
|
-
const
|
|
286
|
+
const nativeOpts = {
|
|
287
|
+
...opts,
|
|
288
|
+
// libdatachannel uses "unordered", opposite of RTCDataChannelInit.ordered
|
|
289
|
+
unordered: opts.ordered === false ? true : false
|
|
290
|
+
};
|
|
291
|
+
const channel = __privateGet(this, _peerConnection).createDataChannel(label, nativeOpts);
|
|
287
292
|
const dataChannel = new RTCDataChannel(channel, opts);
|
|
288
293
|
__privateGet(this, _dataChannels).add(dataChannel);
|
|
289
294
|
dataChannel.addEventListener("close", () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RTCPeerConnection.mjs","sources":["../../../src/polyfill/RTCPeerConnection.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { SelectedCandidateInfo } from '../lib/types';\nimport { PeerConnection } from '../lib/index';\nimport RTCSessionDescription from './RTCSessionDescription';\nimport RTCDataChannel from './RTCDataChannel';\nimport RTCIceCandidate from './RTCIceCandidate';\nimport { RTCDataChannelEvent, RTCPeerConnectionIceEvent } from './Events';\nimport RTCSctpTransport from './RTCSctpTransport';\nimport * as exceptions from './Exception';\nimport RTCCertificate from './RTCCertificate';\n\n// extend RTCConfiguration with peerIdentity\ninterface RTCConfiguration extends globalThis.RTCConfiguration {\n peerIdentity?: string;\n peerConnection?: PeerConnection;\n}\n\nexport default class RTCPeerConnection extends EventTarget implements globalThis.RTCPeerConnection {\n static async generateCertificate(): Promise<RTCCertificate> {\n throw new DOMException('Not implemented');\n }\n\n #peerConnection: PeerConnection;\n #localOffer: ReturnType<typeof createDeferredPromise>;\n #localAnswer: ReturnType<typeof createDeferredPromise>;\n #dataChannels: Set<globalThis.RTCDataChannel>;\n #dataChannelsClosed = 0;\n #config: globalThis.RTCConfiguration;\n #canTrickleIceCandidates: boolean | null = null;\n #sctp: globalThis.RTCSctpTransport;\n #announceNegotiation = false;\n\n #localCandidates: globalThis.RTCIceCandidate[] = [];\n #remoteCandidates: globalThis.RTCIceCandidate[] = [];\n\n // events\n onconnectionstatechange: globalThis.RTCPeerConnection['onconnectionstatechange'] = null;\n // For ondatachannel we need to define type manually\n ondatachannel: ((this: globalThis.RTCPeerConnection, ev: RTCDataChannelEvent) => any) | null;\n onicecandidate: globalThis.RTCPeerConnection['onicecandidate'] = null;\n onicecandidateerror: globalThis.RTCPeerConnection['onicecandidateerror'] = null;\n oniceconnectionstatechange: globalThis.RTCPeerConnection['oniceconnectionstatechange'] = null;\n onicegatheringstatechange: globalThis.RTCPeerConnection['onicegatheringstatechange'] = null;\n onnegotiationneeded: globalThis.RTCPeerConnection['onnegotiationneeded'] = null;\n onsignalingstatechange: globalThis.RTCPeerConnection['onsignalingstatechange'] = null;\n ontrack: globalThis.RTCPeerConnection['ontrack'] = null;\n\n private _checkConfiguration(config: globalThis.RTCConfiguration): void {\n if (config && config.iceServers === undefined) config.iceServers = [];\n if (config && config.iceTransportPolicy === undefined) config.iceTransportPolicy = 'all';\n\n if (config?.iceServers === null) throw new TypeError('IceServers cannot be null');\n\n // Check for all the properties of iceServers\n if (Array.isArray(config?.iceServers)) {\n for (let i = 0; i < config.iceServers.length; i++) {\n if (config.iceServers[i] === null) throw new TypeError('IceServers cannot be null');\n if (config.iceServers[i] === undefined)\n throw new TypeError('IceServers cannot be undefined');\n if (Object.keys(config.iceServers[i]).length === 0)\n throw new TypeError('IceServers cannot be empty');\n\n // If iceServers is string convert to array\n if (typeof config.iceServers[i].urls === 'string')\n config.iceServers[i].urls = [config.iceServers[i].urls as string];\n\n // urls can not be empty\n if ((config.iceServers[i].urls as string[])?.some((url) => url == ''))\n throw new exceptions.SyntaxError('IceServers urls cannot be empty');\n\n // urls should be valid URLs and match the protocols \"stun:|turn:|turns:\"\n if (\n (config.iceServers[i].urls as string[])?.some((url) => {\n try {\n const parsedURL = new URL(url);\n\n return !/^(stun:|turn:|turns:)$/.test(parsedURL.protocol);\n } catch (error) {\n return true;\n }\n })\n )\n throw new exceptions.SyntaxError('IceServers urls wrong format');\n\n // If this is a turn server check for username and credential\n if ((config.iceServers[i].urls as string[])?.some((url) => url.startsWith('turn'))) {\n if (!config.iceServers[i].username)\n throw new exceptions.InvalidAccessError('IceServers username cannot be null');\n if (!config.iceServers[i].credential)\n throw new exceptions.InvalidAccessError('IceServers username cannot be undefined');\n }\n\n // length of urls can not be 0\n if (config.iceServers[i].urls?.length === 0)\n throw new exceptions.SyntaxError('IceServers urls cannot be empty');\n }\n }\n\n if (\n config &&\n config.iceTransportPolicy &&\n config.iceTransportPolicy !== 'all' &&\n config.iceTransportPolicy !== 'relay'\n )\n throw new TypeError('IceTransportPolicy must be either \"all\" or \"relay\"');\n }\n\n setConfiguration(config: globalThis.RTCConfiguration): void {\n this._checkConfiguration(config);\n this.#config = config;\n }\n\n constructor(config: RTCConfiguration = { iceServers: [], iceTransportPolicy: 'all' }) {\n super();\n\n this._checkConfiguration(config);\n this.#config = config;\n this.#localOffer = createDeferredPromise();\n this.#localAnswer = createDeferredPromise();\n this.#dataChannels = new Set();\n this.#canTrickleIceCandidates = null;\n\n try {\n const peerIdentity = (config as any)?.peerIdentity ?? `peer-${getRandomString(7)}`;\n this.#peerConnection =\n config?.peerConnection ??\n new PeerConnection(peerIdentity, {\n ...config,\n iceServers:\n config?.iceServers\n ?.map((server) => {\n const urls = Array.isArray(server.urls) ? server.urls : [server.urls];\n\n return urls.map((url) => {\n if (server.username && server.credential) {\n const [protocol, rest] = url.split(/:(.*)/);\n return `${protocol}:${server.username}:${server.credential}@${rest}`;\n }\n return url;\n });\n })\n .flat() ?? [],\n });\n } catch (error) {\n if (!error || !error.message) throw new exceptions.NotFoundError('Unknown error');\n throw new exceptions.SyntaxError(error.message);\n }\n\n // forward peerConnection events\n this.#peerConnection.onStateChange(() => {\n this.dispatchEvent(new Event('connectionstatechange'));\n });\n\n this.#peerConnection.onIceStateChange(() => {\n this.dispatchEvent(new Event('iceconnectionstatechange'));\n });\n\n this.#peerConnection.onSignalingStateChange(() => {\n this.dispatchEvent(new Event('signalingstatechange'));\n });\n\n this.#peerConnection.onGatheringStateChange(() => {\n this.dispatchEvent(new Event('icegatheringstatechange'));\n });\n\n this.#peerConnection.onDataChannel((channel) => {\n const dc = new RTCDataChannel(channel);\n this.#dataChannels.add(dc);\n this.dispatchEvent(new RTCDataChannelEvent('datachannel', { channel: dc }));\n });\n\n this.#peerConnection.onLocalDescription((sdp, type) => {\n if (type === 'offer') {\n this.#localOffer.resolve(new RTCSessionDescription({ sdp, type }));\n }\n\n if (type === 'answer') {\n this.#localAnswer.resolve(new RTCSessionDescription({ sdp, type }));\n }\n });\n\n this.#peerConnection.onLocalCandidate((candidate, sdpMid) => {\n if (sdpMid === 'unspec') {\n this.#localAnswer.reject(new Error(`Invalid description type ${sdpMid}`));\n return;\n }\n\n this.#localCandidates.push(new RTCIceCandidate({ candidate, sdpMid }));\n this.dispatchEvent(new RTCPeerConnectionIceEvent(new RTCIceCandidate({ candidate, sdpMid })));\n });\n\n // forward events to properties\n this.addEventListener('connectionstatechange', (e) => {\n this.onconnectionstatechange?.(e);\n });\n this.addEventListener('signalingstatechange', (e) => {\n this.onsignalingstatechange?.(e);\n });\n this.addEventListener('iceconnectionstatechange', (e) => {\n this.oniceconnectionstatechange?.(e);\n });\n this.addEventListener('icegatheringstatechange', (e) => {\n this.onicegatheringstatechange?.(e);\n });\n this.addEventListener('datachannel', (e) => {\n this.ondatachannel?.(e as RTCDataChannelEvent);\n });\n this.addEventListener('icecandidate', (e) => {\n this.onicecandidate?.(e as globalThis.RTCPeerConnectionIceEvent);\n });\n this.addEventListener('track', (e) => {\n this.ontrack?.(e as RTCTrackEvent);\n });\n this.addEventListener('negotiationneeded', (e) => {\n this.#announceNegotiation = true;\n this.onnegotiationneeded?.(e);\n });\n\n this.#sctp = new RTCSctpTransport({\n pc: this,\n });\n }\n\n // Extra FUnctions\n get ext_maxDataChannelId(): number {\n return this.#peerConnection.maxDataChannelId();\n }\n\n get ext_maxMessageSize(): number {\n return this.#peerConnection.maxMessageSize();\n }\n\n get ext_localCandidates(): globalThis.RTCIceCandidate[] {\n return this.#localCandidates;\n }\n\n get ext_remoteCandidates(): globalThis.RTCIceCandidate[] {\n return this.#remoteCandidates;\n }\n\n selectedCandidatePair(): {\n local: SelectedCandidateInfo;\n remote: SelectedCandidateInfo;\n } | null {\n return this.#peerConnection.getSelectedCandidatePair();\n }\n\n get canTrickleIceCandidates(): boolean | null {\n return this.#canTrickleIceCandidates;\n }\n\n get connectionState(): globalThis.RTCPeerConnectionState {\n return this.#peerConnection.state();\n }\n\n get iceConnectionState(): globalThis.RTCIceConnectionState {\n let state = this.#peerConnection.iceState();\n // libdatachannel uses 'completed' instead of 'connected'\n // see /webrtc/getstats.html\n if (state == 'completed') state = 'connected';\n return state;\n }\n\n get iceGatheringState(): globalThis.RTCIceGatheringState {\n return this.#peerConnection.gatheringState();\n }\n\n get currentLocalDescription(): globalThis.RTCSessionDescription {\n return new RTCSessionDescription(this.#peerConnection.localDescription() as any);\n }\n\n get currentRemoteDescription(): globalThis.RTCSessionDescription {\n return new RTCSessionDescription(this.#peerConnection.remoteDescription() as any);\n }\n\n get localDescription(): globalThis.RTCSessionDescription {\n return new RTCSessionDescription(this.#peerConnection.localDescription() as any);\n }\n\n get pendingLocalDescription(): globalThis.RTCSessionDescription {\n return new RTCSessionDescription(this.#peerConnection.localDescription() as any);\n }\n\n get pendingRemoteDescription(): globalThis.RTCSessionDescription {\n return new RTCSessionDescription(this.#peerConnection.remoteDescription() as any);\n }\n\n get remoteDescription(): globalThis.RTCSessionDescription {\n return new RTCSessionDescription(this.#peerConnection.remoteDescription() as any);\n }\n\n get sctp(): globalThis.RTCSctpTransport {\n return this.#sctp;\n }\n\n get signalingState(): globalThis.RTCSignalingState {\n return this.#peerConnection.signalingState();\n }\n\n async addIceCandidate(candidate?: globalThis.RTCIceCandidateInit | null): Promise<void> {\n if (!candidate || !candidate.candidate) {\n return;\n }\n\n if (candidate.sdpMid === null && candidate.sdpMLineIndex === null) {\n throw new TypeError('sdpMid must be set');\n }\n\n if (candidate.sdpMid === undefined && candidate.sdpMLineIndex == undefined) {\n throw new TypeError('sdpMid must be set');\n }\n\n // Reject if sdpMid format is not valid\n // ??\n if (candidate.sdpMid && candidate.sdpMid.length > 3) {\n // console.log(candidate.sdpMid);\n throw new exceptions.OperationError('Invalid sdpMid format');\n }\n\n // We don't care about sdpMLineIndex, just for test\n if (!candidate.sdpMid && candidate.sdpMLineIndex > 1) {\n throw new exceptions.OperationError('This is only for test case.');\n }\n\n try {\n this.#peerConnection.addRemoteCandidate(candidate.candidate, candidate.sdpMid ?? '0');\n this.#remoteCandidates.push(\n new RTCIceCandidate({\n candidate: candidate.candidate,\n sdpMid: candidate.sdpMid ?? '0',\n }),\n );\n } catch (error) {\n if (!error || !error.message) throw new exceptions.NotFoundError('Unknown error');\n\n // Check error Message if contains specific message\n if (error.message.includes('remote candidate without remote description'))\n throw new exceptions.InvalidStateError(error.message);\n if (error.message.includes('Invalid candidate format'))\n throw new exceptions.OperationError(error.message);\n\n throw new exceptions.NotFoundError(error.message);\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n addTrack(_track, ..._streams): globalThis.RTCRtpSender {\n throw new DOMException('Not implemented');\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n addTransceiver(_trackOrKind, _init): globalThis.RTCRtpTransceiver {\n throw new DOMException('Not implemented');\n }\n\n close(): void {\n this.#peerConnection.close();\n }\n\n createAnswer(): Promise<globalThis.RTCSessionDescriptionInit | any> {\n return this.#localAnswer;\n }\n\n createDataChannel(label: string, opts: globalThis.RTCDataChannelInit = {}): RTCDataChannel {\n const channel = this.#peerConnection.createDataChannel(label, opts);\n const dataChannel = new RTCDataChannel(channel, opts);\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 this.#dataChannelsClosed++;\n });\n\n if (this.#announceNegotiation == null) {\n this.#announceNegotiation = false;\n this.dispatchEvent(new Event('negotiationneeded'));\n }\n\n return dataChannel;\n }\n\n createOffer(): Promise<globalThis.RTCSessionDescriptionInit | any> {\n return this.#localOffer;\n }\n\n getConfiguration(): globalThis.RTCConfiguration {\n return this.#config;\n }\n\n getReceivers(): globalThis.RTCRtpReceiver[] {\n throw new DOMException('Not implemented');\n }\n\n getSenders(): globalThis.RTCRtpSender[] {\n throw new DOMException('Not implemented');\n }\n\n getStats(): Promise<globalThis.RTCStatsReport> | any {\n return new Promise((resolve) => {\n const report = new Map();\n const cp = this.#peerConnection?.getSelectedCandidatePair();\n const bytesSent = this.#peerConnection?.bytesSent();\n const bytesReceived = this.#peerConnection?.bytesReceived();\n const rtt = this.#peerConnection?.rtt();\n\n if (!cp) {\n return resolve(report);\n }\n\n const localIdRs = getRandomString(8);\n const localId = 'RTCIceCandidate_' + localIdRs;\n report.set(localId, {\n id: localId,\n type: 'local-candidate',\n timestamp: Date.now(),\n candidateType: cp.local.type,\n ip: cp.local.address,\n port: cp.local.port,\n });\n\n const remoteIdRs = getRandomString(8);\n const remoteId = 'RTCIceCandidate_' + remoteIdRs;\n report.set(remoteId, {\n id: remoteId,\n type: 'remote-candidate',\n timestamp: Date.now(),\n candidateType: cp.remote.type,\n ip: cp.remote.address,\n port: cp.remote.port,\n });\n\n const candidateId = 'RTCIceCandidatePair_' + localIdRs + '_' + remoteIdRs;\n report.set(candidateId, {\n id: candidateId,\n type: 'candidate-pair',\n timestamp: Date.now(),\n localCandidateId: localId,\n remoteCandidateId: remoteId,\n state: 'succeeded',\n nominated: true,\n writable: true,\n bytesSent: bytesSent,\n bytesReceived: bytesReceived,\n totalRoundTripTime: rtt,\n currentRoundTripTime: rtt,\n });\n\n const transportId = 'RTCTransport_0_1';\n report.set(transportId, {\n id: transportId,\n timestamp: Date.now(),\n type: 'transport',\n bytesSent: bytesSent,\n bytesReceived: bytesReceived,\n dtlsState: 'connected',\n selectedCandidatePairId: candidateId,\n selectedCandidatePairChanges: 1,\n });\n\n // peer-connection'\n report.set('P', {\n id: 'P',\n type: 'peer-connection',\n timestamp: Date.now(),\n dataChannelsOpened: this.#dataChannels.size,\n dataChannelsClosed: this.#dataChannelsClosed,\n });\n\n return resolve(report);\n });\n }\n\n getTransceivers(): globalThis.RTCRtpTransceiver[] {\n return []; // throw new DOMException('Not implemented');\n }\n\n removeTrack(): void {\n throw new DOMException('Not implemented');\n }\n\n restartIce(): Promise<void> {\n throw new DOMException('Not implemented');\n }\n\n async setLocalDescription(description: globalThis.RTCSessionDescriptionInit): Promise<void> {\n if (description?.type !== 'offer') {\n // any other type causes libdatachannel to throw\n return;\n }\n\n this.#peerConnection.setLocalDescription(description?.type as any);\n }\n\n async setRemoteDescription(description: globalThis.RTCSessionDescriptionInit): Promise<void> {\n if (description.sdp == null) {\n throw new DOMException('Remote SDP must be set');\n }\n\n this.#peerConnection.setRemoteDescription(description.sdp, description.type as any);\n }\n}\n\nfunction createDeferredPromise(): any {\n let resolve: any, reject: any;\n\n const promise = new Promise(function (_resolve, _reject) {\n resolve = _resolve;\n reject = _reject;\n });\n\n (promise as any).resolve = resolve;\n (promise as any).reject = reject;\n return promise;\n}\n\nfunction getRandomString(length: number): string {\n return Math.random()\n .toString(36)\n .substring(2, 2 + length);\n}\n"],"names":["exceptions.NotFoundError","exceptions.SyntaxError","exceptions.InvalidAccessError","exceptions.OperationError","exceptions.InvalidStateError"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"RTCPeerConnection.mjs","sources":["../../../src/polyfill/RTCPeerConnection.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { DataChannelInitConfig, SelectedCandidateInfo } from '../lib/types';\nimport { PeerConnection } from '../lib/index';\nimport RTCSessionDescription from './RTCSessionDescription';\nimport RTCDataChannel from './RTCDataChannel';\nimport RTCIceCandidate from './RTCIceCandidate';\nimport { RTCDataChannelEvent, RTCPeerConnectionIceEvent } from './Events';\nimport RTCSctpTransport from './RTCSctpTransport';\nimport * as exceptions from './Exception';\nimport RTCCertificate from './RTCCertificate';\n\n// extend RTCConfiguration with peerIdentity\ninterface RTCConfiguration extends globalThis.RTCConfiguration {\n peerIdentity?: string;\n peerConnection?: PeerConnection;\n}\n\nexport default class RTCPeerConnection extends EventTarget implements globalThis.RTCPeerConnection {\n static async generateCertificate(): Promise<RTCCertificate> {\n throw new DOMException('Not implemented');\n }\n\n #peerConnection: PeerConnection;\n #localOffer: ReturnType<typeof createDeferredPromise>;\n #localAnswer: ReturnType<typeof createDeferredPromise>;\n #dataChannels: Set<globalThis.RTCDataChannel>;\n #dataChannelsClosed = 0;\n #config: globalThis.RTCConfiguration;\n #canTrickleIceCandidates: boolean | null = null;\n #sctp: globalThis.RTCSctpTransport;\n #announceNegotiation = false;\n\n #localCandidates: globalThis.RTCIceCandidate[] = [];\n #remoteCandidates: globalThis.RTCIceCandidate[] = [];\n\n // events\n onconnectionstatechange: globalThis.RTCPeerConnection['onconnectionstatechange'] = null;\n // For ondatachannel we need to define type manually\n ondatachannel: ((this: globalThis.RTCPeerConnection, ev: globalThis.RTCDataChannelEvent) => any) | null;\n onicecandidate: globalThis.RTCPeerConnection['onicecandidate'] = null;\n onicecandidateerror: globalThis.RTCPeerConnection['onicecandidateerror'] = null;\n oniceconnectionstatechange: globalThis.RTCPeerConnection['oniceconnectionstatechange'] = null;\n onicegatheringstatechange: globalThis.RTCPeerConnection['onicegatheringstatechange'] = null;\n onnegotiationneeded: globalThis.RTCPeerConnection['onnegotiationneeded'] = null;\n onsignalingstatechange: globalThis.RTCPeerConnection['onsignalingstatechange'] = null;\n ontrack: globalThis.RTCPeerConnection['ontrack'] = null;\n\n private _checkConfiguration(config: globalThis.RTCConfiguration): void {\n if (config && config.iceServers === undefined) config.iceServers = [];\n if (config && config.iceTransportPolicy === undefined) config.iceTransportPolicy = 'all';\n\n if (config?.iceServers === null) throw new TypeError('IceServers cannot be null');\n\n // Check for all the properties of iceServers\n if (Array.isArray(config?.iceServers)) {\n for (let i = 0; i < config.iceServers.length; i++) {\n if (config.iceServers[i] === null) throw new TypeError('IceServers cannot be null');\n if (config.iceServers[i] === undefined)\n throw new TypeError('IceServers cannot be undefined');\n if (Object.keys(config.iceServers[i]).length === 0)\n throw new TypeError('IceServers cannot be empty');\n\n // If iceServers is string convert to array\n if (typeof config.iceServers[i].urls === 'string')\n config.iceServers[i].urls = [config.iceServers[i].urls as string];\n\n // urls can not be empty\n if ((config.iceServers[i].urls as string[])?.some((url) => url == ''))\n throw new exceptions.SyntaxError('IceServers urls cannot be empty');\n\n // urls should be valid URLs and match the protocols \"stun:|turn:|turns:\"\n if (\n (config.iceServers[i].urls as string[])?.some((url) => {\n try {\n const parsedURL = new URL(url);\n\n return !/^(stun:|turn:|turns:)$/.test(parsedURL.protocol);\n } catch (error) {\n return true;\n }\n })\n )\n throw new exceptions.SyntaxError('IceServers urls wrong format');\n\n // If this is a turn server check for username and credential\n if ((config.iceServers[i].urls as string[])?.some((url) => url.startsWith('turn'))) {\n if (!config.iceServers[i].username)\n throw new exceptions.InvalidAccessError('IceServers username cannot be null');\n if (!config.iceServers[i].credential)\n throw new exceptions.InvalidAccessError('IceServers username cannot be undefined');\n }\n\n // length of urls can not be 0\n if (config.iceServers[i].urls?.length === 0)\n throw new exceptions.SyntaxError('IceServers urls cannot be empty');\n }\n }\n\n if (\n config &&\n config.iceTransportPolicy &&\n config.iceTransportPolicy !== 'all' &&\n config.iceTransportPolicy !== 'relay'\n )\n throw new TypeError('IceTransportPolicy must be either \"all\" or \"relay\"');\n }\n\n setConfiguration(config: globalThis.RTCConfiguration): void {\n this._checkConfiguration(config);\n this.#config = config;\n }\n\n constructor(config: RTCConfiguration = { iceServers: [], iceTransportPolicy: 'all' }) {\n super();\n\n this._checkConfiguration(config);\n this.#config = config;\n this.#localOffer = createDeferredPromise();\n this.#localAnswer = createDeferredPromise();\n this.#dataChannels = new Set();\n this.#canTrickleIceCandidates = null;\n\n try {\n const peerIdentity = (config as any)?.peerIdentity ?? `peer-${getRandomString(7)}`;\n this.#peerConnection =\n config?.peerConnection ??\n new PeerConnection(peerIdentity, {\n ...config,\n iceServers:\n config?.iceServers\n ?.map((server) => {\n const urls = Array.isArray(server.urls) ? server.urls : [server.urls];\n\n return urls.map((url) => {\n if (server.username && server.credential) {\n const [protocol, rest] = url.split(/:(.*)/);\n return `${protocol}:${server.username}:${server.credential}@${rest}`;\n }\n return url;\n });\n })\n .flat() ?? [],\n });\n } catch (error) {\n if (!error || !error.message) throw new exceptions.NotFoundError('Unknown error');\n throw new exceptions.SyntaxError(error.message);\n }\n\n // forward peerConnection events\n this.#peerConnection.onStateChange(() => {\n this.dispatchEvent(new Event('connectionstatechange'));\n });\n\n this.#peerConnection.onIceStateChange(() => {\n this.dispatchEvent(new Event('iceconnectionstatechange'));\n });\n\n this.#peerConnection.onSignalingStateChange(() => {\n this.dispatchEvent(new Event('signalingstatechange'));\n });\n\n this.#peerConnection.onGatheringStateChange(() => {\n this.dispatchEvent(new Event('icegatheringstatechange'));\n });\n\n this.#peerConnection.onDataChannel((channel) => {\n const dc = new RTCDataChannel(channel);\n this.#dataChannels.add(dc);\n this.dispatchEvent(new RTCDataChannelEvent('datachannel', { channel: dc }));\n });\n\n this.#peerConnection.onLocalDescription((sdp, type) => {\n if (type === 'offer') {\n this.#localOffer.resolve(new RTCSessionDescription({ sdp, type }));\n }\n\n if (type === 'answer') {\n this.#localAnswer.resolve(new RTCSessionDescription({ sdp, type }));\n }\n });\n\n this.#peerConnection.onLocalCandidate((candidate, sdpMid) => {\n if (sdpMid === 'unspec') {\n this.#localAnswer.reject(new Error(`Invalid description type ${sdpMid}`));\n return;\n }\n\n this.#localCandidates.push(new RTCIceCandidate({ candidate, sdpMid }));\n this.dispatchEvent(new RTCPeerConnectionIceEvent(new RTCIceCandidate({ candidate, sdpMid })));\n });\n\n // forward events to properties\n this.addEventListener('connectionstatechange', (e) => {\n this.onconnectionstatechange?.(e);\n });\n this.addEventListener('signalingstatechange', (e) => {\n this.onsignalingstatechange?.(e);\n });\n this.addEventListener('iceconnectionstatechange', (e) => {\n this.oniceconnectionstatechange?.(e);\n });\n this.addEventListener('icegatheringstatechange', (e) => {\n this.onicegatheringstatechange?.(e);\n });\n this.addEventListener('datachannel', (e) => {\n this.ondatachannel?.(e as RTCDataChannelEvent);\n });\n this.addEventListener('icecandidate', (e) => {\n this.onicecandidate?.(e as globalThis.RTCPeerConnectionIceEvent);\n });\n this.addEventListener('track', (e) => {\n this.ontrack?.(e as RTCTrackEvent);\n });\n this.addEventListener('negotiationneeded', (e) => {\n this.#announceNegotiation = true;\n this.onnegotiationneeded?.(e);\n });\n\n this.#sctp = new RTCSctpTransport({\n pc: this,\n });\n }\n\n // Extra FUnctions\n get ext_maxDataChannelId(): number {\n return this.#peerConnection.maxDataChannelId();\n }\n\n get ext_maxMessageSize(): number {\n return this.#peerConnection.maxMessageSize();\n }\n\n get ext_localCandidates(): globalThis.RTCIceCandidate[] {\n return this.#localCandidates;\n }\n\n get ext_remoteCandidates(): globalThis.RTCIceCandidate[] {\n return this.#remoteCandidates;\n }\n\n selectedCandidatePair(): {\n local: SelectedCandidateInfo;\n remote: SelectedCandidateInfo;\n } | null {\n return this.#peerConnection.getSelectedCandidatePair();\n }\n\n get canTrickleIceCandidates(): boolean | null {\n return this.#canTrickleIceCandidates;\n }\n\n get connectionState(): globalThis.RTCPeerConnectionState {\n return this.#peerConnection.state();\n }\n\n get iceConnectionState(): globalThis.RTCIceConnectionState {\n let state = this.#peerConnection.iceState();\n // libdatachannel uses 'completed' instead of 'connected'\n // see /webrtc/getstats.html\n if (state == 'completed') state = 'connected';\n return state;\n }\n\n get iceGatheringState(): globalThis.RTCIceGatheringState {\n return this.#peerConnection.gatheringState();\n }\n\n get currentLocalDescription(): globalThis.RTCSessionDescription {\n return new RTCSessionDescription(this.#peerConnection.localDescription() as any);\n }\n\n get currentRemoteDescription(): globalThis.RTCSessionDescription {\n return new RTCSessionDescription(this.#peerConnection.remoteDescription() as any);\n }\n\n get localDescription(): globalThis.RTCSessionDescription {\n return new RTCSessionDescription(this.#peerConnection.localDescription() as any);\n }\n\n get pendingLocalDescription(): globalThis.RTCSessionDescription {\n return new RTCSessionDescription(this.#peerConnection.localDescription() as any);\n }\n\n get pendingRemoteDescription(): globalThis.RTCSessionDescription {\n return new RTCSessionDescription(this.#peerConnection.remoteDescription() as any);\n }\n\n get remoteDescription(): globalThis.RTCSessionDescription {\n return new RTCSessionDescription(this.#peerConnection.remoteDescription() as any);\n }\n\n get sctp(): globalThis.RTCSctpTransport {\n return this.#sctp;\n }\n\n get signalingState(): globalThis.RTCSignalingState {\n return this.#peerConnection.signalingState();\n }\n\n async addIceCandidate(candidate?: globalThis.RTCIceCandidateInit | null): Promise<void> {\n if (!candidate || !candidate.candidate) {\n return;\n }\n\n if (candidate.sdpMid === null && candidate.sdpMLineIndex === null) {\n throw new TypeError('sdpMid must be set');\n }\n\n if (candidate.sdpMid === undefined && candidate.sdpMLineIndex == undefined) {\n throw new TypeError('sdpMid must be set');\n }\n\n // Reject if sdpMid format is not valid\n // ??\n if (candidate.sdpMid && candidate.sdpMid.length > 3) {\n // console.log(candidate.sdpMid);\n throw new exceptions.OperationError('Invalid sdpMid format');\n }\n\n // We don't care about sdpMLineIndex, just for test\n if (!candidate.sdpMid && candidate.sdpMLineIndex > 1) {\n throw new exceptions.OperationError('This is only for test case.');\n }\n\n try {\n this.#peerConnection.addRemoteCandidate(candidate.candidate, candidate.sdpMid ?? '0');\n this.#remoteCandidates.push(\n new RTCIceCandidate({\n candidate: candidate.candidate,\n sdpMid: candidate.sdpMid ?? '0',\n }),\n );\n } catch (error) {\n if (!error || !error.message) throw new exceptions.NotFoundError('Unknown error');\n\n // Check error Message if contains specific message\n if (error.message.includes('remote candidate without remote description'))\n throw new exceptions.InvalidStateError(error.message);\n if (error.message.includes('Invalid candidate format'))\n throw new exceptions.OperationError(error.message);\n\n throw new exceptions.NotFoundError(error.message);\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n addTrack(_track, ..._streams): globalThis.RTCRtpSender {\n throw new DOMException('Not implemented');\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n addTransceiver(_trackOrKind, _init): globalThis.RTCRtpTransceiver {\n throw new DOMException('Not implemented');\n }\n\n close(): void {\n this.#peerConnection.close();\n }\n\n createAnswer(): Promise<globalThis.RTCSessionDescriptionInit | any> {\n return this.#localAnswer;\n }\n\n createDataChannel(label: string, opts: globalThis.RTCDataChannelInit = {}): RTCDataChannel {\n const nativeOpts: DataChannelInitConfig = {\n ...opts,\n // libdatachannel uses \"unordered\", opposite of RTCDataChannelInit.ordered\n unordered: opts.ordered === false ? true : false,\n };\n\n const channel = this.#peerConnection.createDataChannel(label, nativeOpts);\n const dataChannel = new RTCDataChannel(channel, opts);\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 this.#dataChannelsClosed++;\n });\n\n if (this.#announceNegotiation == null) {\n this.#announceNegotiation = false;\n this.dispatchEvent(new Event('negotiationneeded'));\n }\n\n return dataChannel;\n }\n\n createOffer(): Promise<globalThis.RTCSessionDescriptionInit | any> {\n return this.#localOffer;\n }\n\n getConfiguration(): globalThis.RTCConfiguration {\n return this.#config;\n }\n\n getReceivers(): globalThis.RTCRtpReceiver[] {\n throw new DOMException('Not implemented');\n }\n\n getSenders(): globalThis.RTCRtpSender[] {\n throw new DOMException('Not implemented');\n }\n\n getStats(): Promise<globalThis.RTCStatsReport> | any {\n return new Promise((resolve) => {\n const report = new Map();\n const cp = this.#peerConnection?.getSelectedCandidatePair();\n const bytesSent = this.#peerConnection?.bytesSent();\n const bytesReceived = this.#peerConnection?.bytesReceived();\n const rtt = this.#peerConnection?.rtt();\n\n if (!cp) {\n return resolve(report);\n }\n\n const localIdRs = getRandomString(8);\n const localId = 'RTCIceCandidate_' + localIdRs;\n report.set(localId, {\n id: localId,\n type: 'local-candidate',\n timestamp: Date.now(),\n candidateType: cp.local.type,\n ip: cp.local.address,\n port: cp.local.port,\n });\n\n const remoteIdRs = getRandomString(8);\n const remoteId = 'RTCIceCandidate_' + remoteIdRs;\n report.set(remoteId, {\n id: remoteId,\n type: 'remote-candidate',\n timestamp: Date.now(),\n candidateType: cp.remote.type,\n ip: cp.remote.address,\n port: cp.remote.port,\n });\n\n const candidateId = 'RTCIceCandidatePair_' + localIdRs + '_' + remoteIdRs;\n report.set(candidateId, {\n id: candidateId,\n type: 'candidate-pair',\n timestamp: Date.now(),\n localCandidateId: localId,\n remoteCandidateId: remoteId,\n state: 'succeeded',\n nominated: true,\n writable: true,\n bytesSent: bytesSent,\n bytesReceived: bytesReceived,\n totalRoundTripTime: rtt,\n currentRoundTripTime: rtt,\n });\n\n const transportId = 'RTCTransport_0_1';\n report.set(transportId, {\n id: transportId,\n timestamp: Date.now(),\n type: 'transport',\n bytesSent: bytesSent,\n bytesReceived: bytesReceived,\n dtlsState: 'connected',\n selectedCandidatePairId: candidateId,\n selectedCandidatePairChanges: 1,\n });\n\n // peer-connection'\n report.set('P', {\n id: 'P',\n type: 'peer-connection',\n timestamp: Date.now(),\n dataChannelsOpened: this.#dataChannels.size,\n dataChannelsClosed: this.#dataChannelsClosed,\n });\n\n return resolve(report);\n });\n }\n\n getTransceivers(): globalThis.RTCRtpTransceiver[] {\n return []; // throw new DOMException('Not implemented');\n }\n\n removeTrack(): void {\n throw new DOMException('Not implemented');\n }\n\n restartIce(): Promise<void> {\n throw new DOMException('Not implemented');\n }\n\n async setLocalDescription(description: globalThis.RTCSessionDescriptionInit): Promise<void> {\n if (description?.type !== 'offer') {\n // any other type causes libdatachannel to throw\n return;\n }\n\n this.#peerConnection.setLocalDescription(description?.type as any);\n }\n\n async setRemoteDescription(description: globalThis.RTCSessionDescriptionInit): Promise<void> {\n if (description.sdp == null) {\n throw new DOMException('Remote SDP must be set');\n }\n\n this.#peerConnection.setRemoteDescription(description.sdp, description.type as any);\n }\n}\n\nfunction createDeferredPromise(): any {\n let resolve: any, reject: any;\n\n const promise = new Promise(function (_resolve, _reject) {\n resolve = _resolve;\n reject = _reject;\n });\n\n (promise as any).resolve = resolve;\n (promise as any).reject = reject;\n return promise;\n}\n\nfunction getRandomString(length: number): string {\n return Math.random()\n .toString(36)\n .substring(2, 2 + length);\n}\n"],"names":["exceptions.NotFoundError","exceptions.SyntaxError","exceptions.InvalidAccessError","exceptions.OperationError","exceptions.InvalidStateError"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,IAAA,eAAA,EAAA,WAAA,EAAA,YAAA,EAAA,aAAA,EAAA,mBAAA,EAAA,OAAA,EAAA,wBAAA,EAAA,KAAA,EAAA,oBAAA,EAAA,gBAAA,EAAA,iBAAA,CAAA;AAiBA,MAAqB,0BAA0B,WAAoD,CAAA;AAAA,EA+FjG,WAAA,CAAY,SAA2B,EAAE,UAAA,EAAY,EAAI,EAAA,kBAAA,EAAoB,OAAS,EAAA;AACpF,IAAM,KAAA,EAAA,CAAA;AA3FR,IAAA,YAAA,CAAA,IAAA,EAAA,eAAA,CAAA,CAAA;AACA,IAAA,YAAA,CAAA,IAAA,EAAA,WAAA,CAAA,CAAA;AACA,IAAA,YAAA,CAAA,IAAA,EAAA,YAAA,CAAA,CAAA;AACA,IAAA,YAAA,CAAA,IAAA,EAAA,aAAA,CAAA,CAAA;AACA,IAAsB,YAAA,CAAA,IAAA,EAAA,mBAAA,EAAA,CAAA,CAAA,CAAA;AACtB,IAAA,YAAA,CAAA,IAAA,EAAA,OAAA,CAAA,CAAA;AACA,IAA2C,YAAA,CAAA,IAAA,EAAA,wBAAA,EAAA,IAAA,CAAA,CAAA;AAC3C,IAAA,YAAA,CAAA,IAAA,EAAA,KAAA,CAAA,CAAA;AACA,IAAuB,YAAA,CAAA,IAAA,EAAA,oBAAA,EAAA,KAAA,CAAA,CAAA;AAEvB,IAAA,YAAA,CAAA,IAAA,EAAA,gBAAA,EAAiD,EAAC,CAAA,CAAA;AAClD,IAAA,YAAA,CAAA,IAAA,EAAA,iBAAA,EAAkD,EAAC,CAAA,CAAA;AAGnD;AAAA,IAAmF,aAAA,CAAA,IAAA,EAAA,yBAAA,EAAA,IAAA,CAAA,CAAA;AAEnF;AAAA,IAAA,aAAA,CAAA,IAAA,EAAA,eAAA,CAAA,CAAA;AACA,IAAiE,aAAA,CAAA,IAAA,EAAA,gBAAA,EAAA,IAAA,CAAA,CAAA;AACjE,IAA2E,aAAA,CAAA,IAAA,EAAA,qBAAA,EAAA,IAAA,CAAA,CAAA;AAC3E,IAAyF,aAAA,CAAA,IAAA,EAAA,4BAAA,EAAA,IAAA,CAAA,CAAA;AACzF,IAAuF,aAAA,CAAA,IAAA,EAAA,2BAAA,EAAA,IAAA,CAAA,CAAA;AACvF,IAA2E,aAAA,CAAA,IAAA,EAAA,qBAAA,EAAA,IAAA,CAAA,CAAA;AAC3E,IAAiF,aAAA,CAAA,IAAA,EAAA,wBAAA,EAAA,IAAA,CAAA,CAAA;AACjF,IAAmD,aAAA,CAAA,IAAA,EAAA,SAAA,EAAA,IAAA,CAAA,CAAA;AAsEjD,IAAA,IAAA,CAAK,oBAAoB,MAAM,CAAA,CAAA;AAC/B,IAAA,YAAA,CAAA,IAAA,EAAK,OAAU,EAAA,MAAA,CAAA,CAAA;AACf,IAAA,YAAA,CAAA,IAAA,EAAK,aAAc,qBAAsB,EAAA,CAAA,CAAA;AACzC,IAAA,YAAA,CAAA,IAAA,EAAK,cAAe,qBAAsB,EAAA,CAAA,CAAA;AAC1C,IAAK,YAAA,CAAA,IAAA,EAAA,aAAA,sBAAoB,GAAI,EAAA,CAAA,CAAA;AAC7B,IAAA,YAAA,CAAA,IAAA,EAAK,wBAA2B,EAAA,IAAA,CAAA,CAAA;AAEhC,IAAI,IAAA;AACF,MAAA,MAAM,eAAgB,MAAgB,EAAA,YAAA,IAAgB,CAAQ,KAAA,EAAA,eAAA,CAAgB,CAAC,CAAC,CAAA,CAAA,CAAA;AAChF,MAAA,YAAA,CAAA,IAAA,EAAK,eACH,EAAA,MAAA,EAAQ,cACR,IAAA,IAAI,eAAe,YAAc,EAAA;AAAA,QAC/B,GAAG,MAAA;AAAA,QACH,UACE,EAAA,MAAA,EAAQ,UACJ,EAAA,GAAA,CAAI,CAAC,MAAW,KAAA;AAChB,UAAM,MAAA,IAAA,GAAO,KAAM,CAAA,OAAA,CAAQ,MAAO,CAAA,IAAI,IAAI,MAAO,CAAA,IAAA,GAAO,CAAC,MAAA,CAAO,IAAI,CAAA,CAAA;AAEpE,UAAO,OAAA,IAAA,CAAK,GAAI,CAAA,CAAC,GAAQ,KAAA;AACvB,YAAI,IAAA,MAAA,CAAO,QAAY,IAAA,MAAA,CAAO,UAAY,EAAA;AACxC,cAAA,MAAM,CAAC,QAAU,EAAA,IAAI,CAAI,GAAA,GAAA,CAAI,MAAM,OAAO,CAAA,CAAA;AAC1C,cAAO,OAAA,CAAA,EAAG,QAAQ,CAAI,CAAA,EAAA,MAAA,CAAO,QAAQ,CAAI,CAAA,EAAA,MAAA,CAAO,UAAU,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA,CAAA;AAAA,aACpE;AACA,YAAO,OAAA,GAAA,CAAA;AAAA,WACR,CAAA,CAAA;AAAA,SACF,CAAA,CACA,IAAK,EAAA,IAAK,EAAC;AAAA,OACjB,CAAA,CAAA,CAAA;AAAA,aACI,KAAO,EAAA;AACd,MAAI,IAAA,CAAC,SAAS,CAAC,KAAA,CAAM,SAAe,MAAA,IAAIA,aAAW,CAAc,eAAe,CAAA,CAAA;AAChF,MAAA,MAAM,IAAIC,WAAuB,CAAA,KAAA,CAAM,OAAO,CAAA,CAAA;AAAA,KAChD;AAGA,IAAK,YAAA,CAAA,IAAA,EAAA,eAAA,CAAA,CAAgB,cAAc,MAAM;AACvC,MAAA,IAAA,CAAK,aAAc,CAAA,IAAI,KAAM,CAAA,uBAAuB,CAAC,CAAA,CAAA;AAAA,KACtD,CAAA,CAAA;AAED,IAAK,YAAA,CAAA,IAAA,EAAA,eAAA,CAAA,CAAgB,iBAAiB,MAAM;AAC1C,MAAA,IAAA,CAAK,aAAc,CAAA,IAAI,KAAM,CAAA,0BAA0B,CAAC,CAAA,CAAA;AAAA,KACzD,CAAA,CAAA;AAED,IAAK,YAAA,CAAA,IAAA,EAAA,eAAA,CAAA,CAAgB,uBAAuB,MAAM;AAChD,MAAA,IAAA,CAAK,aAAc,CAAA,IAAI,KAAM,CAAA,sBAAsB,CAAC,CAAA,CAAA;AAAA,KACrD,CAAA,CAAA;AAED,IAAK,YAAA,CAAA,IAAA,EAAA,eAAA,CAAA,CAAgB,uBAAuB,MAAM;AAChD,MAAA,IAAA,CAAK,aAAc,CAAA,IAAI,KAAM,CAAA,yBAAyB,CAAC,CAAA,CAAA;AAAA,KACxD,CAAA,CAAA;AAED,IAAK,YAAA,CAAA,IAAA,EAAA,eAAA,CAAA,CAAgB,aAAc,CAAA,CAAC,OAAY,KAAA;AAC9C,MAAM,MAAA,EAAA,GAAK,IAAI,cAAA,CAAe,OAAO,CAAA,CAAA;AACrC,MAAK,YAAA,CAAA,IAAA,EAAA,aAAA,CAAA,CAAc,IAAI,EAAE,CAAA,CAAA;AACzB,MAAK,IAAA,CAAA,aAAA,CAAc,IAAI,mBAAoB,CAAA,aAAA,EAAe,EAAE,OAAS,EAAA,EAAA,EAAI,CAAC,CAAA,CAAA;AAAA,KAC3E,CAAA,CAAA;AAED,IAAA,YAAA,CAAA,IAAA,EAAK,eAAgB,CAAA,CAAA,kBAAA,CAAmB,CAAC,GAAA,EAAK,IAAS,KAAA;AACrD,MAAA,IAAI,SAAS,OAAS,EAAA;AACpB,QAAK,YAAA,CAAA,IAAA,EAAA,WAAA,CAAA,CAAY,QAAQ,IAAI,qBAAA,CAAsB,EAAE,GAAK,EAAA,IAAA,EAAM,CAAC,CAAA,CAAA;AAAA,OACnE;AAEA,MAAA,IAAI,SAAS,QAAU,EAAA;AACrB,QAAK,YAAA,CAAA,IAAA,EAAA,YAAA,CAAA,CAAa,QAAQ,IAAI,qBAAA,CAAsB,EAAE,GAAK,EAAA,IAAA,EAAM,CAAC,CAAA,CAAA;AAAA,OACpE;AAAA,KACD,CAAA,CAAA;AAED,IAAA,YAAA,CAAA,IAAA,EAAK,eAAgB,CAAA,CAAA,gBAAA,CAAiB,CAAC,SAAA,EAAW,MAAW,KAAA;AAC3D,MAAA,IAAI,WAAW,QAAU,EAAA;AACvB,QAAA,YAAA,CAAA,IAAA,EAAK,cAAa,MAAO,CAAA,IAAI,MAAM,CAA4B,yBAAA,EAAA,MAAM,EAAE,CAAC,CAAA,CAAA;AACxE,QAAA,OAAA;AAAA,OACF;AAEA,MAAK,YAAA,CAAA,IAAA,EAAA,gBAAA,CAAA,CAAiB,KAAK,IAAI,eAAA,CAAgB,EAAE,SAAW,EAAA,MAAA,EAAQ,CAAC,CAAA,CAAA;AACrE,MAAK,IAAA,CAAA,aAAA,CAAc,IAAI,yBAAA,CAA0B,IAAI,eAAA,CAAgB,EAAE,SAAW,EAAA,MAAA,EAAQ,CAAC,CAAC,CAAA,CAAA;AAAA,KAC7F,CAAA,CAAA;AAGD,IAAK,IAAA,CAAA,gBAAA,CAAiB,uBAAyB,EAAA,CAAC,CAAM,KAAA;AACpD,MAAA,IAAA,CAAK,0BAA0B,CAAC,CAAA,CAAA;AAAA,KACjC,CAAA,CAAA;AACD,IAAK,IAAA,CAAA,gBAAA,CAAiB,sBAAwB,EAAA,CAAC,CAAM,KAAA;AACnD,MAAA,IAAA,CAAK,yBAAyB,CAAC,CAAA,CAAA;AAAA,KAChC,CAAA,CAAA;AACD,IAAK,IAAA,CAAA,gBAAA,CAAiB,0BAA4B,EAAA,CAAC,CAAM,KAAA;AACvD,MAAA,IAAA,CAAK,6BAA6B,CAAC,CAAA,CAAA;AAAA,KACpC,CAAA,CAAA;AACD,IAAK,IAAA,CAAA,gBAAA,CAAiB,yBAA2B,EAAA,CAAC,CAAM,KAAA;AACtD,MAAA,IAAA,CAAK,4BAA4B,CAAC,CAAA,CAAA;AAAA,KACnC,CAAA,CAAA;AACD,IAAK,IAAA,CAAA,gBAAA,CAAiB,aAAe,EAAA,CAAC,CAAM,KAAA;AAC1C,MAAA,IAAA,CAAK,gBAAgB,CAAwB,CAAA,CAAA;AAAA,KAC9C,CAAA,CAAA;AACD,IAAK,IAAA,CAAA,gBAAA,CAAiB,cAAgB,EAAA,CAAC,CAAM,KAAA;AAC3C,MAAA,IAAA,CAAK,iBAAiB,CAAyC,CAAA,CAAA;AAAA,KAChE,CAAA,CAAA;AACD,IAAK,IAAA,CAAA,gBAAA,CAAiB,OAAS,EAAA,CAAC,CAAM,KAAA;AACpC,MAAA,IAAA,CAAK,UAAU,CAAkB,CAAA,CAAA;AAAA,KAClC,CAAA,CAAA;AACD,IAAK,IAAA,CAAA,gBAAA,CAAiB,mBAAqB,EAAA,CAAC,CAAM,KAAA;AAChD,MAAA,YAAA,CAAA,IAAA,EAAK,oBAAuB,EAAA,IAAA,CAAA,CAAA;AAC5B,MAAA,IAAA,CAAK,sBAAsB,CAAC,CAAA,CAAA;AAAA,KAC7B,CAAA,CAAA;AAED,IAAK,YAAA,CAAA,IAAA,EAAA,KAAA,EAAQ,IAAI,gBAAiB,CAAA;AAAA,MAChC,EAAI,EAAA,IAAA;AAAA,KACL,CAAA,CAAA,CAAA;AAAA,GACH;AAAA,EA3MA,aAAa,mBAA+C,GAAA;AAC1D,IAAM,MAAA,IAAI,aAAa,iBAAiB,CAAA,CAAA;AAAA,GAC1C;AAAA,EA2BQ,oBAAoB,MAA2C,EAAA;AACrE,IAAA,IAAI,UAAU,MAAO,CAAA,UAAA,KAAe,KAAW,CAAA,EAAA,MAAA,CAAO,aAAa,EAAC,CAAA;AACpE,IAAA,IAAI,MAAU,IAAA,MAAA,CAAO,kBAAuB,KAAA,KAAA,CAAA,SAAkB,kBAAqB,GAAA,KAAA,CAAA;AAEnF,IAAA,IAAI,QAAQ,UAAe,KAAA,IAAA,EAAY,MAAA,IAAI,UAAU,2BAA2B,CAAA,CAAA;AAGhF,IAAA,IAAI,KAAM,CAAA,OAAA,CAAQ,MAAQ,EAAA,UAAU,CAAG,EAAA;AACrC,MAAA,KAAA,IAAS,IAAI,CAAG,EAAA,CAAA,GAAI,MAAO,CAAA,UAAA,CAAW,QAAQ,CAAK,EAAA,EAAA;AACjD,QAAI,IAAA,MAAA,CAAO,WAAW,CAAC,CAAA,KAAM,MAAY,MAAA,IAAI,UAAU,2BAA2B,CAAA,CAAA;AAClF,QAAI,IAAA,MAAA,CAAO,UAAW,CAAA,CAAC,CAAM,KAAA,KAAA,CAAA;AAC3B,UAAM,MAAA,IAAI,UAAU,gCAAgC,CAAA,CAAA;AACtD,QAAA,IAAI,OAAO,IAAK,CAAA,MAAA,CAAO,WAAW,CAAC,CAAC,EAAE,MAAW,KAAA,CAAA;AAC/C,UAAM,MAAA,IAAI,UAAU,4BAA4B,CAAA,CAAA;AAGlD,QAAA,IAAI,OAAO,MAAA,CAAO,UAAW,CAAA,CAAC,EAAE,IAAS,KAAA,QAAA;AACvC,UAAO,MAAA,CAAA,UAAA,CAAW,CAAC,CAAE,CAAA,IAAA,GAAO,CAAC,MAAO,CAAA,UAAA,CAAW,CAAC,CAAA,CAAE,IAAc,CAAA,CAAA;AAGlE,QAAK,IAAA,MAAA,CAAO,WAAW,CAAC,CAAA,CAAE,MAAmB,IAAK,CAAA,CAAC,GAAQ,KAAA,GAAA,IAAO,EAAE,CAAA;AAClE,UAAM,MAAA,IAAIA,WAAW,CAAY,iCAAiC,CAAA,CAAA;AAGpE,QAAA,IACG,OAAO,UAAW,CAAA,CAAC,EAAE,IAAmB,EAAA,IAAA,CAAK,CAAC,GAAQ,KAAA;AACrD,UAAI,IAAA;AACF,YAAM,MAAA,SAAA,GAAY,IAAI,GAAA,CAAI,GAAG,CAAA,CAAA;AAE7B,YAAA,OAAO,CAAC,wBAAA,CAAyB,IAAK,CAAA,SAAA,CAAU,QAAQ,CAAA,CAAA;AAAA,mBACjD,KAAO,EAAA;AACd,YAAO,OAAA,IAAA,CAAA;AAAA,WACT;AAAA,SACD,CAAA;AAED,UAAM,MAAA,IAAIA,WAAW,CAAY,8BAA8B,CAAA,CAAA;AAGjE,QAAA,IAAK,MAAO,CAAA,UAAA,CAAW,CAAC,CAAA,CAAE,IAAmB,EAAA,IAAA,CAAK,CAAC,GAAA,KAAQ,GAAI,CAAA,UAAA,CAAW,MAAM,CAAC,CAAG,EAAA;AAClF,UAAA,IAAI,CAAC,MAAA,CAAO,UAAW,CAAA,CAAC,CAAE,CAAA,QAAA;AACxB,YAAM,MAAA,IAAIC,kBAAW,CAAmB,oCAAoC,CAAA,CAAA;AAC9E,UAAA,IAAI,CAAC,MAAA,CAAO,UAAW,CAAA,CAAC,CAAE,CAAA,UAAA;AACxB,YAAM,MAAA,IAAIA,kBAAW,CAAmB,yCAAyC,CAAA,CAAA;AAAA,SACrF;AAGA,QAAA,IAAI,MAAO,CAAA,UAAA,CAAW,CAAC,CAAA,CAAE,MAAM,MAAW,KAAA,CAAA;AACxC,UAAM,MAAA,IAAID,WAAW,CAAY,iCAAiC,CAAA,CAAA;AAAA,OACtE;AAAA,KACF;AAEA,IAAA,IACE,UACA,MAAO,CAAA,kBAAA,IACP,OAAO,kBAAuB,KAAA,KAAA,IAC9B,OAAO,kBAAuB,KAAA,OAAA;AAE9B,MAAM,MAAA,IAAI,UAAU,oDAAoD,CAAA,CAAA;AAAA,GAC5E;AAAA,EAEA,iBAAiB,MAA2C,EAAA;AAC1D,IAAA,IAAA,CAAK,oBAAoB,MAAM,CAAA,CAAA;AAC/B,IAAA,YAAA,CAAA,IAAA,EAAK,OAAU,EAAA,MAAA,CAAA,CAAA;AAAA,GACjB;AAAA;AAAA,EAkHA,IAAI,oBAA+B,GAAA;AACjC,IAAO,OAAA,YAAA,CAAA,IAAA,EAAK,iBAAgB,gBAAiB,EAAA,CAAA;AAAA,GAC/C;AAAA,EAEA,IAAI,kBAA6B,GAAA;AAC/B,IAAO,OAAA,YAAA,CAAA,IAAA,EAAK,iBAAgB,cAAe,EAAA,CAAA;AAAA,GAC7C;AAAA,EAEA,IAAI,mBAAoD,GAAA;AACtD,IAAA,OAAO,YAAK,CAAA,IAAA,EAAA,gBAAA,CAAA,CAAA;AAAA,GACd;AAAA,EAEA,IAAI,oBAAqD,GAAA;AACvD,IAAA,OAAO,YAAK,CAAA,IAAA,EAAA,iBAAA,CAAA,CAAA;AAAA,GACd;AAAA,EAEA,qBAGS,GAAA;AACP,IAAO,OAAA,YAAA,CAAA,IAAA,EAAK,iBAAgB,wBAAyB,EAAA,CAAA;AAAA,GACvD;AAAA,EAEA,IAAI,uBAA0C,GAAA;AAC5C,IAAA,OAAO,YAAK,CAAA,IAAA,EAAA,wBAAA,CAAA,CAAA;AAAA,GACd;AAAA,EAEA,IAAI,eAAqD,GAAA;AACvD,IAAO,OAAA,YAAA,CAAA,IAAA,EAAK,iBAAgB,KAAM,EAAA,CAAA;AAAA,GACpC;AAAA,EAEA,IAAI,kBAAuD,GAAA;AACzD,IAAI,IAAA,KAAA,GAAQ,YAAK,CAAA,IAAA,EAAA,eAAA,CAAA,CAAgB,QAAS,EAAA,CAAA;AAG1C,IAAI,IAAA,KAAA,IAAS,aAAqB,KAAA,GAAA,WAAA,CAAA;AAClC,IAAO,OAAA,KAAA,CAAA;AAAA,GACT;AAAA,EAEA,IAAI,iBAAqD,GAAA;AACvD,IAAO,OAAA,YAAA,CAAA,IAAA,EAAK,iBAAgB,cAAe,EAAA,CAAA;AAAA,GAC7C;AAAA,EAEA,IAAI,uBAA4D,GAAA;AAC9D,IAAA,OAAO,IAAI,qBAAA,CAAsB,YAAK,CAAA,IAAA,EAAA,eAAA,CAAA,CAAgB,kBAAyB,CAAA,CAAA;AAAA,GACjF;AAAA,EAEA,IAAI,wBAA6D,GAAA;AAC/D,IAAA,OAAO,IAAI,qBAAA,CAAsB,YAAK,CAAA,IAAA,EAAA,eAAA,CAAA,CAAgB,mBAA0B,CAAA,CAAA;AAAA,GAClF;AAAA,EAEA,IAAI,gBAAqD,GAAA;AACvD,IAAA,OAAO,IAAI,qBAAA,CAAsB,YAAK,CAAA,IAAA,EAAA,eAAA,CAAA,CAAgB,kBAAyB,CAAA,CAAA;AAAA,GACjF;AAAA,EAEA,IAAI,uBAA4D,GAAA;AAC9D,IAAA,OAAO,IAAI,qBAAA,CAAsB,YAAK,CAAA,IAAA,EAAA,eAAA,CAAA,CAAgB,kBAAyB,CAAA,CAAA;AAAA,GACjF;AAAA,EAEA,IAAI,wBAA6D,GAAA;AAC/D,IAAA,OAAO,IAAI,qBAAA,CAAsB,YAAK,CAAA,IAAA,EAAA,eAAA,CAAA,CAAgB,mBAA0B,CAAA,CAAA;AAAA,GAClF;AAAA,EAEA,IAAI,iBAAsD,GAAA;AACxD,IAAA,OAAO,IAAI,qBAAA,CAAsB,YAAK,CAAA,IAAA,EAAA,eAAA,CAAA,CAAgB,mBAA0B,CAAA,CAAA;AAAA,GAClF;AAAA,EAEA,IAAI,IAAoC,GAAA;AACtC,IAAA,OAAO,YAAK,CAAA,IAAA,EAAA,KAAA,CAAA,CAAA;AAAA,GACd;AAAA,EAEA,IAAI,cAA+C,GAAA;AACjD,IAAO,OAAA,YAAA,CAAA,IAAA,EAAK,iBAAgB,cAAe,EAAA,CAAA;AAAA,GAC7C;AAAA,EAEA,MAAM,gBAAgB,SAAkE,EAAA;AACtF,IAAA,IAAI,CAAC,SAAA,IAAa,CAAC,SAAA,CAAU,SAAW,EAAA;AACtC,MAAA,OAAA;AAAA,KACF;AAEA,IAAA,IAAI,SAAU,CAAA,MAAA,KAAW,IAAQ,IAAA,SAAA,CAAU,kBAAkB,IAAM,EAAA;AACjE,MAAM,MAAA,IAAI,UAAU,oBAAoB,CAAA,CAAA;AAAA,KAC1C;AAEA,IAAA,IAAI,SAAU,CAAA,MAAA,KAAW,KAAa,CAAA,IAAA,SAAA,CAAU,iBAAiB,KAAW,CAAA,EAAA;AAC1E,MAAM,MAAA,IAAI,UAAU,oBAAoB,CAAA,CAAA;AAAA,KAC1C;AAIA,IAAA,IAAI,SAAU,CAAA,MAAA,IAAU,SAAU,CAAA,MAAA,CAAO,SAAS,CAAG,EAAA;AAEnD,MAAM,MAAA,IAAIE,cAAW,CAAe,uBAAuB,CAAA,CAAA;AAAA,KAC7D;AAGA,IAAA,IAAI,CAAC,SAAA,CAAU,MAAU,IAAA,SAAA,CAAU,gBAAgB,CAAG,EAAA;AACpD,MAAM,MAAA,IAAIA,cAAW,CAAe,6BAA6B,CAAA,CAAA;AAAA,KACnE;AAEA,IAAI,IAAA;AACF,MAAA,YAAA,CAAA,IAAA,EAAK,iBAAgB,kBAAmB,CAAA,SAAA,CAAU,SAAW,EAAA,SAAA,CAAU,UAAU,GAAG,CAAA,CAAA;AACpF,MAAA,YAAA,CAAA,IAAA,EAAK,iBAAkB,CAAA,CAAA,IAAA;AAAA,QACrB,IAAI,eAAgB,CAAA;AAAA,UAClB,WAAW,SAAU,CAAA,SAAA;AAAA,UACrB,MAAA,EAAQ,UAAU,MAAU,IAAA,GAAA;AAAA,SAC7B,CAAA;AAAA,OACH,CAAA;AAAA,aACO,KAAO,EAAA;AACd,MAAI,IAAA,CAAC,SAAS,CAAC,KAAA,CAAM,SAAe,MAAA,IAAIH,aAAW,CAAc,eAAe,CAAA,CAAA;AAGhF,MAAI,IAAA,KAAA,CAAM,OAAQ,CAAA,QAAA,CAAS,6CAA6C,CAAA;AACtE,QAAA,MAAM,IAAII,iBAA6B,CAAA,KAAA,CAAM,OAAO,CAAA,CAAA;AACtD,MAAI,IAAA,KAAA,CAAM,OAAQ,CAAA,QAAA,CAAS,0BAA0B,CAAA;AACnD,QAAA,MAAM,IAAID,cAA0B,CAAA,KAAA,CAAM,OAAO,CAAA,CAAA;AAEnD,MAAA,MAAM,IAAIH,aAAyB,CAAA,KAAA,CAAM,OAAO,CAAA,CAAA;AAAA,KAClD;AAAA,GACF;AAAA;AAAA,EAGA,QAAA,CAAS,WAAW,QAAmC,EAAA;AACrD,IAAM,MAAA,IAAI,aAAa,iBAAiB,CAAA,CAAA;AAAA,GAC1C;AAAA;AAAA,EAGA,cAAA,CAAe,cAAc,KAAqC,EAAA;AAChE,IAAM,MAAA,IAAI,aAAa,iBAAiB,CAAA,CAAA;AAAA,GAC1C;AAAA,EAEA,KAAc,GAAA;AACZ,IAAA,YAAA,CAAA,IAAA,EAAK,iBAAgB,KAAM,EAAA,CAAA;AAAA,GAC7B;AAAA,EAEA,YAAoE,GAAA;AAClE,IAAA,OAAO,YAAK,CAAA,IAAA,EAAA,YAAA,CAAA,CAAA;AAAA,GACd;AAAA,EAEA,iBAAkB,CAAA,KAAA,EAAe,IAAsC,GAAA,EAAoB,EAAA;AACzF,IAAA,MAAM,UAAoC,GAAA;AAAA,MACxC,GAAG,IAAA;AAAA;AAAA,MAEH,SAAW,EAAA,IAAA,CAAK,OAAY,KAAA,KAAA,GAAQ,IAAO,GAAA,KAAA;AAAA,KAC7C,CAAA;AAEA,IAAA,MAAM,OAAU,GAAA,YAAA,CAAA,IAAA,EAAK,eAAgB,CAAA,CAAA,iBAAA,CAAkB,OAAO,UAAU,CAAA,CAAA;AACxE,IAAA,MAAM,WAAc,GAAA,IAAI,cAAe,CAAA,OAAA,EAAS,IAAI,CAAA,CAAA;AAGpD,IAAK,YAAA,CAAA,IAAA,EAAA,aAAA,CAAA,CAAc,IAAI,WAAW,CAAA,CAAA;AAClC,IAAY,WAAA,CAAA,gBAAA,CAAiB,SAAS,MAAM;AAC1C,MAAK,YAAA,CAAA,IAAA,EAAA,aAAA,CAAA,CAAc,OAAO,WAAW,CAAA,CAAA;AACrC,MAAA,gBAAA,CAAA,IAAA,EAAK,mBAAL,CAAA,CAAA,CAAA,EAAA,CAAA;AAAA,KACD,CAAA,CAAA;AAED,IAAI,IAAA,YAAA,CAAA,IAAA,EAAK,yBAAwB,IAAM,EAAA;AACrC,MAAA,YAAA,CAAA,IAAA,EAAK,oBAAuB,EAAA,KAAA,CAAA,CAAA;AAC5B,MAAA,IAAA,CAAK,aAAc,CAAA,IAAI,KAAM,CAAA,mBAAmB,CAAC,CAAA,CAAA;AAAA,KACnD;AAEA,IAAO,OAAA,WAAA,CAAA;AAAA,GACT;AAAA,EAEA,WAAmE,GAAA;AACjE,IAAA,OAAO,YAAK,CAAA,IAAA,EAAA,WAAA,CAAA,CAAA;AAAA,GACd;AAAA,EAEA,gBAAgD,GAAA;AAC9C,IAAA,OAAO,YAAK,CAAA,IAAA,EAAA,OAAA,CAAA,CAAA;AAAA,GACd;AAAA,EAEA,YAA4C,GAAA;AAC1C,IAAM,MAAA,IAAI,aAAa,iBAAiB,CAAA,CAAA;AAAA,GAC1C;AAAA,EAEA,UAAwC,GAAA;AACtC,IAAM,MAAA,IAAI,aAAa,iBAAiB,CAAA,CAAA;AAAA,GAC1C;AAAA,EAEA,QAAqD,GAAA;AACnD,IAAO,OAAA,IAAI,OAAQ,CAAA,CAAC,OAAY,KAAA;AAC9B,MAAM,MAAA,MAAA,uBAAa,GAAI,EAAA,CAAA;AACvB,MAAM,MAAA,EAAA,GAAK,YAAK,CAAA,IAAA,EAAA,eAAA,CAAA,EAAiB,wBAAyB,EAAA,CAAA;AAC1D,MAAM,MAAA,SAAA,GAAY,YAAK,CAAA,IAAA,EAAA,eAAA,CAAA,EAAiB,SAAU,EAAA,CAAA;AAClD,MAAM,MAAA,aAAA,GAAgB,YAAK,CAAA,IAAA,EAAA,eAAA,CAAA,EAAiB,aAAc,EAAA,CAAA;AAC1D,MAAM,MAAA,GAAA,GAAM,YAAK,CAAA,IAAA,EAAA,eAAA,CAAA,EAAiB,GAAI,EAAA,CAAA;AAEtC,MAAA,IAAI,CAAC,EAAI,EAAA;AACP,QAAA,OAAO,QAAQ,MAAM,CAAA,CAAA;AAAA,OACvB;AAEA,MAAM,MAAA,SAAA,GAAY,gBAAgB,CAAC,CAAA,CAAA;AACnC,MAAA,MAAM,UAAU,kBAAqB,GAAA,SAAA,CAAA;AACrC,MAAA,MAAA,CAAO,IAAI,OAAS,EAAA;AAAA,QAClB,EAAI,EAAA,OAAA;AAAA,QACJ,IAAM,EAAA,iBAAA;AAAA,QACN,SAAA,EAAW,KAAK,GAAI,EAAA;AAAA,QACpB,aAAA,EAAe,GAAG,KAAM,CAAA,IAAA;AAAA,QACxB,EAAA,EAAI,GAAG,KAAM,CAAA,OAAA;AAAA,QACb,IAAA,EAAM,GAAG,KAAM,CAAA,IAAA;AAAA,OAChB,CAAA,CAAA;AAED,MAAM,MAAA,UAAA,GAAa,gBAAgB,CAAC,CAAA,CAAA;AACpC,MAAA,MAAM,WAAW,kBAAqB,GAAA,UAAA,CAAA;AACtC,MAAA,MAAA,CAAO,IAAI,QAAU,EAAA;AAAA,QACnB,EAAI,EAAA,QAAA;AAAA,QACJ,IAAM,EAAA,kBAAA;AAAA,QACN,SAAA,EAAW,KAAK,GAAI,EAAA;AAAA,QACpB,aAAA,EAAe,GAAG,MAAO,CAAA,IAAA;AAAA,QACzB,EAAA,EAAI,GAAG,MAAO,CAAA,OAAA;AAAA,QACd,IAAA,EAAM,GAAG,MAAO,CAAA,IAAA;AAAA,OACjB,CAAA,CAAA;AAED,MAAM,MAAA,WAAA,GAAc,sBAAyB,GAAA,SAAA,GAAY,GAAM,GAAA,UAAA,CAAA;AAC/D,MAAA,MAAA,CAAO,IAAI,WAAa,EAAA;AAAA,QACtB,EAAI,EAAA,WAAA;AAAA,QACJ,IAAM,EAAA,gBAAA;AAAA,QACN,SAAA,EAAW,KAAK,GAAI,EAAA;AAAA,QACpB,gBAAkB,EAAA,OAAA;AAAA,QAClB,iBAAmB,EAAA,QAAA;AAAA,QACnB,KAAO,EAAA,WAAA;AAAA,QACP,SAAW,EAAA,IAAA;AAAA,QACX,QAAU,EAAA,IAAA;AAAA,QACV,SAAA;AAAA,QACA,aAAA;AAAA,QACA,kBAAoB,EAAA,GAAA;AAAA,QACpB,oBAAsB,EAAA,GAAA;AAAA,OACvB,CAAA,CAAA;AAED,MAAA,MAAM,WAAc,GAAA,kBAAA,CAAA;AACpB,MAAA,MAAA,CAAO,IAAI,WAAa,EAAA;AAAA,QACtB,EAAI,EAAA,WAAA;AAAA,QACJ,SAAA,EAAW,KAAK,GAAI,EAAA;AAAA,QACpB,IAAM,EAAA,WAAA;AAAA,QACN,SAAA;AAAA,QACA,aAAA;AAAA,QACA,SAAW,EAAA,WAAA;AAAA,QACX,uBAAyB,EAAA,WAAA;AAAA,QACzB,4BAA8B,EAAA,CAAA;AAAA,OAC/B,CAAA,CAAA;AAGD,MAAA,MAAA,CAAO,IAAI,GAAK,EAAA;AAAA,QACd,EAAI,EAAA,GAAA;AAAA,QACJ,IAAM,EAAA,iBAAA;AAAA,QACN,SAAA,EAAW,KAAK,GAAI,EAAA;AAAA,QACpB,kBAAA,EAAoB,mBAAK,aAAc,CAAA,CAAA,IAAA;AAAA,QACvC,oBAAoB,YAAK,CAAA,IAAA,EAAA,mBAAA,CAAA;AAAA,OAC1B,CAAA,CAAA;AAED,MAAA,OAAO,QAAQ,MAAM,CAAA,CAAA;AAAA,KACtB,CAAA,CAAA;AAAA,GACH;AAAA,EAEA,eAAkD,GAAA;AAChD,IAAA,OAAO,EAAC,CAAA;AAAA,GACV;AAAA,EAEA,WAAoB,GAAA;AAClB,IAAM,MAAA,IAAI,aAAa,iBAAiB,CAAA,CAAA;AAAA,GAC1C;AAAA,EAEA,UAA4B,GAAA;AAC1B,IAAM,MAAA,IAAI,aAAa,iBAAiB,CAAA,CAAA;AAAA,GAC1C;AAAA,EAEA,MAAM,oBAAoB,WAAkE,EAAA;AAC1F,IAAI,IAAA,WAAA,EAAa,SAAS,OAAS,EAAA;AAEjC,MAAA,OAAA;AAAA,KACF;AAEA,IAAK,YAAA,CAAA,IAAA,EAAA,eAAA,CAAA,CAAgB,mBAAoB,CAAA,WAAA,EAAa,IAAW,CAAA,CAAA;AAAA,GACnE;AAAA,EAEA,MAAM,qBAAqB,WAAkE,EAAA;AAC3F,IAAI,IAAA,WAAA,CAAY,OAAO,IAAM,EAAA;AAC3B,MAAM,MAAA,IAAI,aAAa,wBAAwB,CAAA,CAAA;AAAA,KACjD;AAEA,IAAA,YAAA,CAAA,IAAA,EAAK,eAAgB,CAAA,CAAA,oBAAA,CAAqB,WAAY,CAAA,GAAA,EAAK,YAAY,IAAW,CAAA,CAAA;AAAA,GACpF;AACF,CAAA;AAreE,eAAA,GAAA,IAAA,OAAA,EAAA,CAAA;AACA,WAAA,GAAA,IAAA,OAAA,EAAA,CAAA;AACA,YAAA,GAAA,IAAA,OAAA,EAAA,CAAA;AACA,aAAA,GAAA,IAAA,OAAA,EAAA,CAAA;AACA,mBAAA,GAAA,IAAA,OAAA,EAAA,CAAA;AACA,OAAA,GAAA,IAAA,OAAA,EAAA,CAAA;AACA,wBAAA,GAAA,IAAA,OAAA,EAAA,CAAA;AACA,KAAA,GAAA,IAAA,OAAA,EAAA,CAAA;AACA,oBAAA,GAAA,IAAA,OAAA,EAAA,CAAA;AAEA,gBAAA,GAAA,IAAA,OAAA,EAAA,CAAA;AACA,iBAAA,GAAA,IAAA,OAAA,EAAA,CAAA;AA4dF,SAAS,qBAA6B,GAAA;AACpC,EAAA,IAAI,OAAc,EAAA,MAAA,CAAA;AAElB,EAAA,MAAM,OAAU,GAAA,IAAI,OAAQ,CAAA,SAAU,UAAU,OAAS,EAAA;AACvD,IAAU,OAAA,GAAA,QAAA,CAAA;AACV,IAAS,MAAA,GAAA,OAAA,CAAA;AAAA,GACV,CAAA,CAAA;AAED,EAAC,QAAgB,OAAU,GAAA,OAAA,CAAA;AAC3B,EAAC,QAAgB,MAAS,GAAA,MAAA,CAAA;AAC1B,EAAO,OAAA,OAAA,CAAA;AACT,CAAA;AAEA,SAAS,gBAAgB,MAAwB,EAAA;AAC/C,EAAO,OAAA,IAAA,CAAK,QACT,CAAA,QAAA,CAAS,EAAE,CACX,CAAA,SAAA,CAAU,CAAG,EAAA,CAAA,GAAI,MAAM,CAAA,CAAA;AAC5B;;;;"}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { SelectedCandidateInfo } from '../lib/types';
|
|
2
2
|
import { PeerConnection } from '../lib/index';
|
|
3
3
|
import RTCDataChannel from './RTCDataChannel.js';
|
|
4
|
-
import { RTCDataChannelEvent } from './Events.js';
|
|
5
4
|
import RTCCertificate from './RTCCertificate.js';
|
|
6
5
|
|
|
7
6
|
interface RTCConfiguration extends globalThis.RTCConfiguration {
|
|
@@ -12,7 +11,7 @@ declare class RTCPeerConnection extends EventTarget implements globalThis.RTCPee
|
|
|
12
11
|
#private;
|
|
13
12
|
static generateCertificate(): Promise<RTCCertificate>;
|
|
14
13
|
onconnectionstatechange: globalThis.RTCPeerConnection['onconnectionstatechange'];
|
|
15
|
-
ondatachannel: ((this: globalThis.RTCPeerConnection, ev: RTCDataChannelEvent) => any) | null;
|
|
14
|
+
ondatachannel: ((this: globalThis.RTCPeerConnection, ev: globalThis.RTCDataChannelEvent) => any) | null;
|
|
16
15
|
onicecandidate: globalThis.RTCPeerConnection['onicecandidate'];
|
|
17
16
|
onicecandidateerror: globalThis.RTCPeerConnection['onicecandidateerror'];
|
|
18
17
|
oniceconnectionstatechange: globalThis.RTCPeerConnection['oniceconnectionstatechange'];
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "node-datachannel",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.30.0",
|
|
4
4
|
"description": "WebRTC For Node.js and Electron. libdatachannel node bindings.",
|
|
5
5
|
"main": "./dist/cjs/lib/index.cjs",
|
|
6
6
|
"module": "./dist/esm/lib/index.mjs",
|
|
@@ -51,7 +51,8 @@
|
|
|
51
51
|
"wpt:test": "ts-node test/wpt-tests/index.ts",
|
|
52
52
|
"_prebuild": "prebuild -r napi --backend cmake-js",
|
|
53
53
|
"prepack": "npm run build:tsc",
|
|
54
|
-
"prettier": "prettier --write ."
|
|
54
|
+
"prettier": "prettier --write .",
|
|
55
|
+
"format-cpp": "find src/cpp \\( -name \"*.h\" -o -name \"*.cpp\" \\) -exec clang-format -i \"{}\" \\; "
|
|
55
56
|
},
|
|
56
57
|
"binary": {
|
|
57
58
|
"napi_versions": [
|