node-datachannel 0.28.0 → 0.29.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/.prettierignore CHANGED
@@ -2,3 +2,6 @@ test/wpt-tests/wpt
2
2
  vcpkg
3
3
  out
4
4
  .webpack
5
+ build
6
+ dist
7
+ prebuilds
package/API.md CHANGED
@@ -16,12 +16,19 @@ export interface RtcConfig {
16
16
  bindAddress?: string;
17
17
  enableIceTcp?: boolean;
18
18
  enableIceUdpMux?: boolean;
19
+ disableAutoNegotiation?: boolean;
20
+ disableFingerprintVerification?: boolean;
21
+ disableAutoGathering?: boolean;
22
+ forceMediaTransport?: boolean;
19
23
  portRangeBegin?: number;
20
24
  portRangeEnd?: number;
21
25
  maxMessageSize?: number;
22
26
  mtu?: number;
23
27
  iceTransportPolicy?: TransportPolicy;
24
28
  disableFingerprintVerification?: boolean;
29
+ certificatePemFile?: string;
30
+ keyPemFile?: string;
31
+ keyPemPass?: string;
25
32
  }
26
33
 
27
34
  export const enum RelayType {
@@ -69,6 +76,29 @@ export const enum DescriptionType {
69
76
  }
70
77
  ```
71
78
 
79
+ **setLocalDescription: (sdp: string, init?: LocalDescriptionInit) => void**
80
+
81
+ Set Local Description and optionally the ICE ufrag/pwd to use. These should not
82
+ be set as they will be generated automatically as per the spec.
83
+
84
+ ```
85
+ export interface LocalDescriptionInit {
86
+ iceUfrag?: string;
87
+ icePwd?: string;
88
+ }
89
+ ```
90
+
91
+ **remoteFingerprint: () => CertificateFingerprint**
92
+
93
+ Returns the certificate fingerprint used by the remote peer
94
+
95
+ ```
96
+ export interface CertificateFingerprint {
97
+ value: string;
98
+ algorithm: 'sha-1' | 'sha-224' | 'sha-256' | 'sha-384' | 'sha-512' | 'md5' | 'md2';
99
+ }
100
+ ```
101
+
72
102
  **addRemoteCandidate: (candidate: string, mid: string) => void**
73
103
 
74
104
  Add remote candidate info
package/BULDING.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  ## Requirements
4
4
 
5
- - cmake >= V3.14
5
+ - cmake >= V3.21
6
6
  - [libdatachannel dependencies](https://github.com/paullouisageneau/libdatachannel/blob/master/README.md#dependencies)
7
7
 
8
8
  ## Building from source
@@ -25,6 +25,7 @@ Other Options
25
25
  ```
26
26
 
27
27
  Compile without Media and Websocket
28
+
28
29
  ```sh
29
30
  npx cmake-js clean
30
31
  npx cmake-js configure --CDNO_MEDIA=ON --CDNO_WEBSOCKET=ON
package/CMakeLists.txt CHANGED
@@ -2,7 +2,7 @@ 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.28.0)
5
+ project(node_datachannel VERSION 0.29.0)
6
6
 
7
7
  # -Dnapi_build_version=8
8
8
  add_definitions(-DNAPI_VERSION=8)
@@ -32,7 +32,7 @@ include(FetchContent)
32
32
  FetchContent_Declare(
33
33
  libdatachannel
34
34
  GIT_REPOSITORY https://github.com/paullouisageneau/libdatachannel.git
35
- GIT_TAG "aa57f4285936a878fb96f4f84085ee84d20c3397" # v0.22.2+
35
+ GIT_TAG "v0.23.0"
36
36
  )
37
37
 
38
38
  option(NO_MEDIA "Disable media transport support in libdatachannel" OFF)
@@ -50,6 +50,7 @@ endif()
50
50
  set(SRC_FILES
51
51
  src/cpp/rtc-wrapper.cpp
52
52
  src/cpp/data-channel-wrapper.cpp
53
+ src/cpp/ice-udp-mux-listener-wrapper.cpp
53
54
  src/cpp/peer-connection-wrapper.cpp
54
55
  src/cpp/thread-safe-callback.cpp
55
56
  src/cpp/main.cpp
@@ -27,6 +27,7 @@ const Video = nodeDatachannel.default.Video;
27
27
  const Track = nodeDatachannel.default.Track;
28
28
  const DataChannel = nodeDatachannel.default.DataChannel;
29
29
  const PeerConnection = nodeDatachannel.default.PeerConnection;
30
+ const IceUdpMuxListener = nodeDatachannel.default.IceUdpMuxListener;
30
31
  const RtcpReceivingSession = nodeDatachannel.default.RtcpReceivingSession;
31
32
  const DataChannelStream = datachannelStream.default;
32
33
  var n = {
@@ -43,7 +44,8 @@ var n = {
43
44
  PeerConnection,
44
45
  WebSocket: websocket.WebSocket,
45
46
  WebSocketServer: websocketServer.WebSocketServer,
46
- DataChannelStream
47
+ DataChannelStream,
48
+ IceUdpMuxListener
47
49
  };
48
50
 
49
51
  exports.WebSocketServer = websocketServer.WebSocketServer;
@@ -51,6 +53,7 @@ exports.WebSocket = websocket.WebSocket;
51
53
  exports.Audio = Audio;
52
54
  exports.DataChannel = DataChannel;
53
55
  exports.DataChannelStream = DataChannelStream;
56
+ exports.IceUdpMuxListener = IceUdpMuxListener;
54
57
  exports.PeerConnection = PeerConnection;
55
58
  exports.RtcpReceivingSession = RtcpReceivingSession;
56
59
  exports.Track = Track;
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../../../src/lib/index.ts"],"sourcesContent":["import nodeDataChannel from './node-datachannel';\nimport _DataChannelStream from './datachannel-stream';\nimport { WebSocketServer } from './websocket-server';\nimport {\n Channel,\n DataChannelInitConfig,\n DescriptionType,\n Direction,\n LogLevel,\n RtcConfig,\n RTCIceConnectionState,\n RTCIceGatheringState,\n RTCPeerConnectionState,\n RTCSignalingState,\n SctpSettings,\n SelectedCandidateInfo,\n} from './types';\nimport { WebSocket } from './websocket';\n\nexport function preload(): void {\n nodeDataChannel.preload();\n}\nexport function initLogger(level: LogLevel): void {\n nodeDataChannel.initLogger(level);\n}\nexport function cleanup(): void {\n nodeDataChannel.cleanup();\n}\nexport function setSctpSettings(settings: SctpSettings): void {\n nodeDataChannel.setSctpSettings(settings);\n}\nexport function getLibraryVersion(): string {\n return nodeDataChannel.getLibraryVersion();\n}\n\nexport interface Audio {\n addAudioCodec(payloadType: number, codec: string, profile?: string): void;\n addOpusCodec(payloadType: number, profile?: string): string;\n direction(): Direction;\n generateSdp(eol: string, addr: string, port: number): string;\n mid(): string;\n setDirection(dir: Direction): void;\n description(): string;\n removeFormat(fmt: string): void;\n addSSRC(ssrc: number, name?: string, msid?: string, trackID?: string): void;\n removeSSRC(ssrc: number): void;\n replaceSSRC(oldSsrc: number, ssrc: number, name?: string, msid?: string, trackID?: string): void;\n hasSSRC(ssrc: number): boolean;\n getSSRCs(): number[];\n getCNameForSsrc(ssrc: number): string;\n setBitrate(bitRate: number): void;\n getBitrate(): number;\n hasPayloadType(payloadType: number): boolean;\n addRTXCodec(payloadType: number, originalPayloadType: number, clockRate: number): void;\n addRTPMap(): void;\n parseSdpLine(line: string): void;\n}\nexport const Audio: {\n new (mid: string, dir: Direction): Audio;\n} = nodeDataChannel.Audio;\n\nexport interface Video {\n addVideoCodec(payloadType: number, codec: string, profile?: string): void;\n addH264Codec(payloadType: number, profile?: string): void;\n addVP8Codec(payloadType: number): void;\n addVP9Codec(payloadType: number): void;\n direction(): Direction;\n generateSdp(eol: string, addr: string, port: number): string;\n mid(): string;\n setDirection(dir: Direction): void;\n description(): string;\n removeFormat(fmt: string): void;\n addSSRC(ssrc: number, name?: string, msid?: string, trackID?: string): void;\n removeSSRC(ssrc: number): void;\n replaceSSRC(oldSsrc: number, ssrc: number, name?: string, msid?: string, trackID?: string): void;\n hasSSRC(ssrc: number): boolean;\n getSSRCs(): number[];\n getCNameForSsrc(ssrc: number): string;\n setBitrate(bitRate: number): void;\n getBitrate(): number;\n hasPayloadType(payloadType: number): boolean;\n addRTXCodec(payloadType: number, originalPayloadType: number, clockRate: number): void;\n addRTPMap(): void;\n parseSdpLine(line: string): void;\n}\nexport const Video: {\n new (mid: string, dir: Direction): Video;\n} = nodeDataChannel.Video;\n\nexport interface Track {\n direction(): Direction;\n mid(): string;\n type(): string;\n close(): void;\n sendMessage(msg: string): boolean;\n sendMessageBinary(buffer: Buffer): boolean;\n isOpen(): boolean;\n isClosed(): boolean;\n bufferedAmount(): number;\n maxMessageSize(): number;\n requestBitrate(bitRate: number): boolean;\n setBufferedAmountLowThreshold(newSize: number): void;\n requestKeyframe(): boolean;\n setMediaHandler(handler: RtcpReceivingSession): void;\n onOpen(cb: () => void): void;\n onClosed(cb: () => void): void;\n onError(cb: (err: string) => void): void;\n onMessage(cb: (msg: Buffer) => void): void;\n}\nexport const Track: {\n new (): Track;\n} = nodeDataChannel.Track;\n\nexport interface DataChannel extends Channel {\n getLabel(): string;\n getId(): number;\n getProtocol(): string;\n\n // Channel implementation\n close(): void;\n sendMessage(msg: string): boolean;\n sendMessageBinary(buffer: Buffer | Uint8Array): boolean;\n isOpen(): boolean;\n bufferedAmount(): number;\n maxMessageSize(): number;\n setBufferedAmountLowThreshold(newSize: number): void;\n onOpen(cb: () => void): void;\n onClosed(cb: () => void): void;\n onError(cb: (err: string) => void): void;\n onBufferedAmountLow(cb: () => void): void;\n onMessage(cb: (msg: string | Buffer | ArrayBuffer) => void): void;\n}\nexport const DataChannel: {\n // DataChannel implementation\n} = nodeDataChannel.DataChannel;\n\nexport interface PeerConnection {\n close(): void;\n setLocalDescription(type?: DescriptionType): void;\n setRemoteDescription(sdp: string, type: DescriptionType): void;\n localDescription(): { type: DescriptionType; sdp: string } | null;\n remoteDescription(): { type: DescriptionType; sdp: string } | null;\n addRemoteCandidate(candidate: string, mid: string): void;\n createDataChannel(label: string, config?: DataChannelInitConfig): DataChannel;\n addTrack(media: Video | Audio): Track;\n hasMedia(): boolean;\n state(): RTCPeerConnectionState;\n iceState(): RTCIceConnectionState;\n signalingState(): RTCSignalingState;\n gatheringState(): RTCIceGatheringState;\n onLocalDescription(cb: (sdp: string, type: DescriptionType) => void): void;\n onLocalCandidate(cb: (candidate: string, mid: string) => void): void;\n onStateChange(cb: (state: string) => void): void;\n onIceStateChange(cb: (state: string) => void): void;\n onSignalingStateChange(cb: (state: string) => void): void;\n onGatheringStateChange(cb: (state: string) => void): void;\n onDataChannel(cb: (dc: DataChannel) => void): void;\n onTrack(cb: (track: Track) => void): void;\n bytesSent(): number;\n bytesReceived(): number;\n rtt(): number;\n getSelectedCandidatePair(): {\n local: SelectedCandidateInfo;\n remote: SelectedCandidateInfo;\n } | null;\n maxDataChannelId(): number;\n maxMessageSize(): number;\n}\nexport const PeerConnection: {\n new (peerName: string, config: RtcConfig): PeerConnection;\n} = nodeDataChannel.PeerConnection;\n\nexport interface RtcpReceivingSession {}\n\nexport const RtcpReceivingSession: {\n new (): RtcpReceivingSession;\n} = nodeDataChannel.RtcpReceivingSession;\n\nexport { WebSocketServer } from './websocket-server';\nexport { WebSocket } from './websocket';\n\nexport const DataChannelStream = _DataChannelStream;\n\nexport default {\n initLogger,\n cleanup,\n preload,\n setSctpSettings,\n getLibraryVersion,\n RtcpReceivingSession,\n Track,\n Video,\n Audio,\n DataChannel,\n PeerConnection,\n WebSocket,\n WebSocketServer,\n DataChannelStream,\n};\n\n// Types\n// https://github.com/murat-dogan/node-datachannel/issues/300\nexport * from './types';\n"],"names":["nodeDataChannel","_DataChannelStream","WebSocket","WebSocketServer"],"mappings":";;;;;;;;;AAmBO,SAAS,OAAgB,GAAA;AAC9B,EAAAA,uBAAA,CAAgB,OAAQ,EAAA,CAAA;AAC1B,CAAA;AACO,SAAS,WAAW,KAAuB,EAAA;AAChD,EAAAA,uBAAA,CAAgB,WAAW,KAAK,CAAA,CAAA;AAClC,CAAA;AACO,SAAS,OAAgB,GAAA;AAC9B,EAAAA,uBAAA,CAAgB,OAAQ,EAAA,CAAA;AAC1B,CAAA;AACO,SAAS,gBAAgB,QAA8B,EAAA;AAC5D,EAAAA,uBAAA,CAAgB,gBAAgB,QAAQ,CAAA,CAAA;AAC1C,CAAA;AACO,SAAS,iBAA4B,GAAA;AAC1C,EAAA,OAAOA,wBAAgB,iBAAkB,EAAA,CAAA;AAC3C,CAAA;AAwBO,MAAM,QAETA,uBAAgB,CAAA,MAAA;AA0Bb,MAAM,QAETA,uBAAgB,CAAA,MAAA;AAsBb,MAAM,QAETA,uBAAgB,CAAA,MAAA;AAqBb,MAAM,cAETA,uBAAgB,CAAA,YAAA;AAkCb,MAAM,iBAETA,uBAAgB,CAAA,eAAA;AAIb,MAAM,uBAETA,uBAAgB,CAAA,qBAAA;AAKb,MAAM,iBAAoB,GAAAC,0BAAA;AAEjC,QAAe;AAAA,EACb,UAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,eAAA;AAAA,EACA,iBAAA;AAAA,EACA,oBAAA;AAAA,EACA,KAAA;AAAA,EACA,KAAA;AAAA,EACA,KAAA;AAAA,EACA,WAAA;AAAA,EACA,cAAA;AAAA,aACAC,mBAAA;AAAA,mBACAC,+BAAA;AAAA,EACA,iBAAA;AACF,CAAA;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.cjs","sources":["../../../src/lib/index.ts"],"sourcesContent":["import nodeDataChannel from './node-datachannel';\nimport _DataChannelStream from './datachannel-stream';\nimport { WebSocketServer } from './websocket-server';\nimport {\n Channel,\n DataChannelInitConfig,\n DescriptionType,\n Direction,\n LogLevel,\n RtcConfig,\n RTCIceConnectionState,\n RTCIceGatheringState,\n RTCPeerConnectionState,\n RTCSignalingState,\n SctpSettings,\n SelectedCandidateInfo,\n} from './types';\nimport { WebSocket } from './websocket';\nimport type { CertificateFingerprint, IceUdpMuxRequest, LocalDescriptionInit } from './types';\n\nexport function preload(): void {\n nodeDataChannel.preload();\n}\nexport function initLogger(level: LogLevel): void {\n nodeDataChannel.initLogger(level);\n}\nexport function cleanup(): void {\n nodeDataChannel.cleanup();\n}\nexport function setSctpSettings(settings: SctpSettings): void {\n nodeDataChannel.setSctpSettings(settings);\n}\nexport function getLibraryVersion(): string {\n return nodeDataChannel.getLibraryVersion();\n}\n\nexport interface Audio {\n addAudioCodec(payloadType: number, codec: string, profile?: string): void;\n addOpusCodec(payloadType: number, profile?: string): string;\n direction(): Direction;\n generateSdp(eol: string, addr: string, port: number): string;\n mid(): string;\n setDirection(dir: Direction): void;\n description(): string;\n removeFormat(fmt: string): void;\n addSSRC(ssrc: number, name?: string, msid?: string, trackID?: string): void;\n removeSSRC(ssrc: number): void;\n replaceSSRC(oldSsrc: number, ssrc: number, name?: string, msid?: string, trackID?: string): void;\n hasSSRC(ssrc: number): boolean;\n getSSRCs(): number[];\n getCNameForSsrc(ssrc: number): string;\n setBitrate(bitRate: number): void;\n getBitrate(): number;\n hasPayloadType(payloadType: number): boolean;\n addRTXCodec(payloadType: number, originalPayloadType: number, clockRate: number): void;\n addRTPMap(): void;\n parseSdpLine(line: string): void;\n}\nexport const Audio: {\n new (mid: string, dir: Direction): Audio;\n} = nodeDataChannel.Audio;\n\nexport interface Video {\n addVideoCodec(payloadType: number, codec: string, profile?: string): void;\n addH264Codec(payloadType: number, profile?: string): void;\n addVP8Codec(payloadType: number): void;\n addVP9Codec(payloadType: number): void;\n direction(): Direction;\n generateSdp(eol: string, addr: string, port: number): string;\n mid(): string;\n setDirection(dir: Direction): void;\n description(): string;\n removeFormat(fmt: string): void;\n addSSRC(ssrc: number, name?: string, msid?: string, trackID?: string): void;\n removeSSRC(ssrc: number): void;\n replaceSSRC(oldSsrc: number, ssrc: number, name?: string, msid?: string, trackID?: string): void;\n hasSSRC(ssrc: number): boolean;\n getSSRCs(): number[];\n getCNameForSsrc(ssrc: number): string;\n setBitrate(bitRate: number): void;\n getBitrate(): number;\n hasPayloadType(payloadType: number): boolean;\n addRTXCodec(payloadType: number, originalPayloadType: number, clockRate: number): void;\n addRTPMap(): void;\n parseSdpLine(line: string): void;\n}\nexport const Video: {\n new (mid: string, dir: Direction): Video;\n} = nodeDataChannel.Video;\n\nexport interface Track {\n direction(): Direction;\n mid(): string;\n type(): string;\n close(): void;\n sendMessage(msg: string): boolean;\n sendMessageBinary(buffer: Buffer): boolean;\n isOpen(): boolean;\n isClosed(): boolean;\n bufferedAmount(): number;\n maxMessageSize(): number;\n requestBitrate(bitRate: number): boolean;\n setBufferedAmountLowThreshold(newSize: number): void;\n requestKeyframe(): boolean;\n setMediaHandler(handler: RtcpReceivingSession): void;\n onOpen(cb: () => void): void;\n onClosed(cb: () => void): void;\n onError(cb: (err: string) => void): void;\n onMessage(cb: (msg: Buffer) => void): void;\n}\nexport const Track: {\n new (): Track;\n} = nodeDataChannel.Track;\n\nexport interface DataChannel extends Channel {\n getLabel(): string;\n getId(): number;\n getProtocol(): string;\n\n // Channel implementation\n close(): void;\n sendMessage(msg: string): boolean;\n sendMessageBinary(buffer: Buffer | Uint8Array): boolean;\n isOpen(): boolean;\n bufferedAmount(): number;\n maxMessageSize(): number;\n setBufferedAmountLowThreshold(newSize: number): void;\n onOpen(cb: () => void): void;\n onClosed(cb: () => void): void;\n onError(cb: (err: string) => void): void;\n onBufferedAmountLow(cb: () => void): void;\n onMessage(cb: (msg: string | Buffer | ArrayBuffer) => void): void;\n}\nexport const DataChannel: {\n // DataChannel implementation\n} = nodeDataChannel.DataChannel;\n\nexport interface PeerConnection {\n close(): void;\n setLocalDescription(type?: DescriptionType, init?: LocalDescriptionInit): void;\n setRemoteDescription(sdp: string, type: DescriptionType): void;\n localDescription(): { type: DescriptionType; sdp: string } | null;\n remoteDescription(): { type: DescriptionType; sdp: string } | null;\n remoteFingerprint(): CertificateFingerprint;\n addRemoteCandidate(candidate: string, mid: string): void;\n createDataChannel(label: string, config?: DataChannelInitConfig): DataChannel;\n addTrack(media: Video | Audio): Track;\n hasMedia(): boolean;\n state(): RTCPeerConnectionState;\n iceState(): RTCIceConnectionState;\n signalingState(): RTCSignalingState;\n gatheringState(): RTCIceGatheringState;\n onLocalDescription(cb: (sdp: string, type: DescriptionType) => void): void;\n onLocalCandidate(cb: (candidate: string, mid: string) => void): void;\n onStateChange(cb: (state: string) => void): void;\n onIceStateChange(cb: (state: string) => void): void;\n onSignalingStateChange(cb: (state: string) => void): void;\n onGatheringStateChange(cb: (state: string) => void): void;\n onDataChannel(cb: (dc: DataChannel) => void): void;\n onTrack(cb: (track: Track) => void): void;\n bytesSent(): number;\n bytesReceived(): number;\n rtt(): number;\n getSelectedCandidatePair(): {\n local: SelectedCandidateInfo;\n remote: SelectedCandidateInfo;\n } | null;\n maxDataChannelId(): number;\n maxMessageSize(): number;\n}\nexport const PeerConnection: {\n new (peerName: string, config: RtcConfig): PeerConnection;\n} = nodeDataChannel.PeerConnection;\n\nexport interface IceUdpMuxListener {\n address?: string;\n port: number;\n stop(): void;\n onUnhandledStunRequest(cb: (req: IceUdpMuxRequest) => void): void;\n}\nexport const IceUdpMuxListener: {\n new (port: number, address?: string): IceUdpMuxListener;\n} = nodeDataChannel.IceUdpMuxListener;\n\nexport interface RtcpReceivingSession {}\n\nexport const RtcpReceivingSession: {\n new (): RtcpReceivingSession;\n} = nodeDataChannel.RtcpReceivingSession;\n\nexport { WebSocketServer } from './websocket-server';\nexport { WebSocket } from './websocket';\n\nexport const DataChannelStream = _DataChannelStream;\n\nexport default {\n initLogger,\n cleanup,\n preload,\n setSctpSettings,\n getLibraryVersion,\n RtcpReceivingSession,\n Track,\n Video,\n Audio,\n DataChannel,\n PeerConnection,\n WebSocket,\n WebSocketServer,\n DataChannelStream,\n IceUdpMuxListener,\n};\n\n// Types\n// https://github.com/murat-dogan/node-datachannel/issues/300\nexport * from './types';\n"],"names":["nodeDataChannel","_DataChannelStream","WebSocket","WebSocketServer"],"mappings":";;;;;;;;;AAoBO,SAAS,OAAgB,GAAA;AAC9B,EAAAA,uBAAA,CAAgB,OAAQ,EAAA,CAAA;AAC1B,CAAA;AACO,SAAS,WAAW,KAAuB,EAAA;AAChD,EAAAA,uBAAA,CAAgB,WAAW,KAAK,CAAA,CAAA;AAClC,CAAA;AACO,SAAS,OAAgB,GAAA;AAC9B,EAAAA,uBAAA,CAAgB,OAAQ,EAAA,CAAA;AAC1B,CAAA;AACO,SAAS,gBAAgB,QAA8B,EAAA;AAC5D,EAAAA,uBAAA,CAAgB,gBAAgB,QAAQ,CAAA,CAAA;AAC1C,CAAA;AACO,SAAS,iBAA4B,GAAA;AAC1C,EAAA,OAAOA,wBAAgB,iBAAkB,EAAA,CAAA;AAC3C,CAAA;AAwBO,MAAM,QAETA,uBAAgB,CAAA,MAAA;AA0Bb,MAAM,QAETA,uBAAgB,CAAA,MAAA;AAsBb,MAAM,QAETA,uBAAgB,CAAA,MAAA;AAqBb,MAAM,cAETA,uBAAgB,CAAA,YAAA;AAmCb,MAAM,iBAETA,uBAAgB,CAAA,eAAA;AAQb,MAAM,oBAETA,uBAAgB,CAAA,kBAAA;AAIb,MAAM,uBAETA,uBAAgB,CAAA,qBAAA;AAKb,MAAM,iBAAoB,GAAAC,0BAAA;AAEjC,QAAe;AAAA,EACb,UAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,eAAA;AAAA,EACA,iBAAA;AAAA,EACA,oBAAA;AAAA,EACA,KAAA;AAAA,EACA,KAAA;AAAA,EACA,KAAA;AAAA,EACA,WAAA;AAAA,EACA,cAAA;AAAA,aACAC,mBAAA;AAAA,mBACAC,+BAAA;AAAA,EACA,iBAAA;AAAA,EACA,iBAAA;AACF,CAAA;;;;;;;;;;;;;;;;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"Events.cjs","sources":["../../../src/polyfill/Events.ts"],"sourcesContent":["import RTCDataChannel from './RTCDataChannel';\nimport RTCError from './RTCError';\n\nexport class RTCPeerConnectionIceEvent extends Event implements globalThis.RTCPeerConnectionIceEvent {\n #candidate: globalThis.RTCIceCandidate;\n\n constructor(candidate: globalThis.RTCIceCandidate) {\n super('icecandidate');\n\n this.#candidate = candidate;\n }\n\n get candidate(): globalThis.RTCIceCandidate {\n return this.#candidate;\n }\n\n get url(): string {\n return '';\n }\n}\n\nexport class RTCDataChannelEvent extends Event implements globalThis.RTCDataChannelEvent {\n #channel: RTCDataChannel;\n\n constructor(type: string = 'datachannel', eventInitDict: globalThis.RTCDataChannelEventInit) {\n super(type);\n\n if (arguments.length === 0)\n throw new TypeError(\n `Failed to construct 'RTCDataChannelEvent': 2 arguments required, but only ${arguments.length} present.`,\n );\n if (typeof eventInitDict !== 'object')\n throw new TypeError(\n \"Failed to construct 'RTCDataChannelEvent': The provided value is not of type 'RTCDataChannelEventInit'.\",\n );\n if (!eventInitDict.channel)\n throw new TypeError(\n \"Failed to construct 'RTCDataChannelEvent': Failed to read the 'channel' property from 'RTCDataChannelEventInit': Required member is undefined.\",\n );\n if (eventInitDict.channel.constructor !== RTCDataChannel)\n throw new TypeError(\n \"Failed to construct 'RTCDataChannelEvent': Failed to read the 'channel' property from 'RTCDataChannelEventInit': Failed to convert value to 'RTCDataChannel'.\",\n );\n\n this.#channel = eventInitDict?.channel;\n }\n\n get channel(): RTCDataChannel {\n return this.#channel;\n }\n}\n\nexport class RTCErrorEvent extends Event implements globalThis.RTCErrorEvent {\n #error: RTCError;\n constructor(type: string, init: globalThis.RTCErrorEventInit) {\n if (arguments.length < 2)\n throw new TypeError(\n `Failed to construct 'RTCErrorEvent': 2 arguments required, but only ${arguments.length} present.`,\n );\n if (typeof init !== 'object')\n throw new TypeError(\n \"Failed to construct 'RTCErrorEvent': The provided value is not of type 'RTCErrorEventInit'.\",\n );\n if (!init.error)\n throw new TypeError(\n \"Failed to construct 'RTCErrorEvent': Failed to read the 'error' property from 'RTCErrorEventInit': Required member is undefined.\",\n );\n if (init.error.constructor !== RTCError)\n throw new TypeError(\n \"Failed to construct 'RTCErrorEvent': Failed to read the 'error' property from 'RTCErrorEventInit': Failed to convert value to 'RTCError'.\",\n );\n super(type || 'error');\n this.#error = init.error;\n }\n\n get error(): RTCError {\n return this.#error;\n }\n}\n"],"names":["RTCDataChannel","RTCError"],"mappings":"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"}
1
+ {"version":3,"file":"Events.cjs","sources":["../../../src/polyfill/Events.ts"],"sourcesContent":["import RTCDataChannel from './RTCDataChannel';\nimport RTCError from './RTCError';\n\nexport class RTCPeerConnectionIceEvent\n extends Event\n implements globalThis.RTCPeerConnectionIceEvent\n{\n #candidate: globalThis.RTCIceCandidate;\n\n constructor(candidate: globalThis.RTCIceCandidate) {\n super('icecandidate');\n\n this.#candidate = candidate;\n }\n\n get candidate(): globalThis.RTCIceCandidate {\n return this.#candidate;\n }\n\n get url(): string {\n return '';\n }\n}\n\nexport class RTCDataChannelEvent extends Event implements globalThis.RTCDataChannelEvent {\n #channel: RTCDataChannel;\n\n constructor(type: string = 'datachannel', eventInitDict: globalThis.RTCDataChannelEventInit) {\n super(type);\n\n if (arguments.length === 0)\n throw new TypeError(\n `Failed to construct 'RTCDataChannelEvent': 2 arguments required, but only ${arguments.length} present.`,\n );\n if (typeof eventInitDict !== 'object')\n throw new TypeError(\n \"Failed to construct 'RTCDataChannelEvent': The provided value is not of type 'RTCDataChannelEventInit'.\",\n );\n if (!eventInitDict.channel)\n throw new TypeError(\n \"Failed to construct 'RTCDataChannelEvent': Failed to read the 'channel' property from 'RTCDataChannelEventInit': Required member is undefined.\",\n );\n if (eventInitDict.channel.constructor !== RTCDataChannel)\n throw new TypeError(\n \"Failed to construct 'RTCDataChannelEvent': Failed to read the 'channel' property from 'RTCDataChannelEventInit': Failed to convert value to 'RTCDataChannel'.\",\n );\n\n this.#channel = eventInitDict?.channel;\n }\n\n get channel(): RTCDataChannel {\n return this.#channel;\n }\n}\n\nexport class RTCErrorEvent extends Event implements globalThis.RTCErrorEvent {\n #error: RTCError;\n constructor(type: string, init: globalThis.RTCErrorEventInit) {\n if (arguments.length < 2)\n throw new TypeError(\n `Failed to construct 'RTCErrorEvent': 2 arguments required, but only ${arguments.length} present.`,\n );\n if (typeof init !== 'object')\n throw new TypeError(\n \"Failed to construct 'RTCErrorEvent': The provided value is not of type 'RTCErrorEventInit'.\",\n );\n if (!init.error)\n throw new TypeError(\n \"Failed to construct 'RTCErrorEvent': Failed to read the 'error' property from 'RTCErrorEventInit': Required member is undefined.\",\n );\n if (init.error.constructor !== RTCError)\n throw new TypeError(\n \"Failed to construct 'RTCErrorEvent': Failed to read the 'error' property from 'RTCErrorEventInit': Failed to convert value to 'RTCError'.\",\n );\n super(type || 'error');\n this.#error = init.error;\n }\n\n get error(): RTCError {\n return this.#error;\n }\n}\n"],"names":["RTCDataChannel","RTCError"],"mappings":"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"}
@@ -39,7 +39,7 @@ class RTCDataChannel extends EventTarget {
39
39
  __publicField(this, "onmessage", null);
40
40
  __publicField(this, "onopen", null);
41
41
  __privateSet(this, _dataChannel, dataChannel);
42
- __privateSet(this, _binaryType, "blob");
42
+ __privateSet(this, _binaryType, "arraybuffer");
43
43
  __privateSet(this, _readyState, __privateGet(this, _dataChannel).isOpen() ? "open" : "connecting");
44
44
  __privateSet(this, _bufferedAmountLowThreshold, 0);
45
45
  __privateSet(this, _maxPacketLifeTime, opts.maxPacketLifeTime ?? null);
@@ -78,10 +78,23 @@ class RTCDataChannel extends EventTarget {
78
78
  __privateGet(this, _dataChannel).onBufferedAmountLow(() => {
79
79
  this.dispatchEvent(new Event("bufferedamountlow"));
80
80
  });
81
- __privateGet(this, _dataChannel).onMessage((data) => {
82
- if (ArrayBuffer.isView(data)) {
83
- if (this.binaryType == "arraybuffer") data = data.buffer;
84
- else data = Buffer.from(data.buffer);
81
+ __privateGet(this, _dataChannel).onMessage((message) => {
82
+ if (typeof message === "string") {
83
+ this.dispatchEvent(new MessageEvent("message", { data: message }));
84
+ return;
85
+ }
86
+ let data;
87
+ if (message instanceof ArrayBuffer) {
88
+ data = message;
89
+ } else {
90
+ data = message.buffer;
91
+ if (message.byteOffset !== 0 || message.byteLength !== message.buffer.byteLength) {
92
+ data = new ArrayBuffer(message.byteLength);
93
+ new Uint8Array(data, 0, message.byteLength).set(message);
94
+ }
95
+ }
96
+ if (__privateGet(this, _binaryType) === "blob") {
97
+ data = new Blob([data]);
85
98
  }
86
99
  this.dispatchEvent(new MessageEvent("message", { data }));
87
100
  });
@@ -1 +1 @@
1
- {"version":3,"file":"RTCDataChannel.cjs","sources":["../../../src/polyfill/RTCDataChannel.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport * as exceptions from './Exception';\nimport { DataChannel } from '../lib/index';\nimport { RTCErrorEvent } from './Events';\n\nexport default class RTCDataChannel extends EventTarget implements globalThis.RTCDataChannel {\n #dataChannel: DataChannel;\n #readyState: globalThis.RTCDataChannelState;\n #bufferedAmountLowThreshold: number;\n #binaryType: BinaryType;\n #maxPacketLifeTime: number | null;\n #maxRetransmits: number | null;\n #negotiated: boolean;\n #ordered: boolean;\n #id: number;\n #label: string;\n #protocol: string;\n\n #closeRequested = false;\n\n // events\n onbufferedamountlow: globalThis.RTCDataChannel['onbufferedamountlow'] = null;\n onclose: globalThis.RTCDataChannel['onclose'] = null;\n onclosing: globalThis.RTCDataChannel['onclosing'] = null;\n onerror: globalThis.RTCDataChannel['onerror'] = null;\n onmessage: globalThis.RTCDataChannel['onmessage'] = null;\n onopen: globalThis.RTCDataChannel['onopen'] = null;\n\n constructor(dataChannel: DataChannel, opts: globalThis.RTCDataChannelInit = {}) {\n super();\n\n this.#dataChannel = dataChannel;\n this.#binaryType = 'blob';\n this.#readyState = this.#dataChannel.isOpen() ? 'open' : 'connecting';\n this.#bufferedAmountLowThreshold = 0;\n this.#maxPacketLifeTime = opts.maxPacketLifeTime ?? null;\n this.#maxRetransmits = opts.maxRetransmits ?? null;\n this.#negotiated = opts.negotiated ?? false;\n this.#ordered = opts.ordered ?? true;\n this.#id = this.#dataChannel.getId();\n this.#label = this.#dataChannel.getLabel();\n this.#protocol = this.#dataChannel.getProtocol();\n\n // forward dataChannel events\n this.#dataChannel.onOpen(() => {\n this.#readyState = 'open';\n this.dispatchEvent(new Event('open', {}));\n });\n\n this.#dataChannel.onClosed(() => {\n // Simulate closing event\n if (!this.#closeRequested) {\n this.#readyState = 'closing';\n this.dispatchEvent(new Event('closing'));\n }\n\n setImmediate(() => {\n this.#readyState = 'closed';\n this.dispatchEvent(new Event('close'));\n });\n });\n\n this.#dataChannel.onError((msg) => {\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\n this.#dataChannel.onBufferedAmountLow(() => {\n this.dispatchEvent(new Event('bufferedamountlow'));\n });\n\n this.#dataChannel.onMessage((data) => {\n if (ArrayBuffer.isView(data)) {\n if (this.binaryType == 'arraybuffer') data = data.buffer;\n else data = Buffer.from(data.buffer);\n }\n\n this.dispatchEvent(new MessageEvent('message', { data }));\n });\n\n // forward events to properties\n this.addEventListener('message', (e) => {\n if (this.onmessage) this.onmessage(e as MessageEvent);\n });\n this.addEventListener('bufferedamountlow', (e) => {\n if (this.onbufferedamountlow) this.onbufferedamountlow(e);\n });\n this.addEventListener('error', (e) => {\n if (this.onerror) this.onerror(e as RTCErrorEvent);\n });\n this.addEventListener('close', (e) => {\n if (this.onclose) this.onclose(e);\n });\n this.addEventListener('closing', (e) => {\n if (this.onclosing) this.onclosing(e);\n });\n this.addEventListener('open', (e) => {\n if (this.onopen) this.onopen(e);\n });\n }\n\n set binaryType(type) {\n if (type !== 'blob' && type !== 'arraybuffer') {\n throw new DOMException(\n \"Failed to set the 'binaryType' property on 'RTCDataChannel': Unknown binary type : \" +\n type,\n 'TypeMismatchError',\n );\n }\n this.#binaryType = type;\n }\n\n get binaryType(): BinaryType {\n return this.#binaryType;\n }\n\n get bufferedAmount(): number {\n return this.#dataChannel.bufferedAmount();\n }\n\n get bufferedAmountLowThreshold(): number {\n return this.#bufferedAmountLowThreshold;\n }\n\n set bufferedAmountLowThreshold(value) {\n const number = Number(value) || 0;\n this.#bufferedAmountLowThreshold = number;\n this.#dataChannel.setBufferedAmountLowThreshold(number);\n }\n\n get id(): number | null {\n return this.#id;\n }\n\n get label(): string {\n return this.#label;\n }\n\n get maxPacketLifeTime(): number | null {\n return this.#maxPacketLifeTime;\n }\n\n get maxRetransmits(): number | null {\n return this.#maxRetransmits;\n }\n\n get negotiated(): boolean {\n return this.#negotiated;\n }\n\n get ordered(): boolean {\n return this.#ordered;\n }\n\n get protocol(): string {\n return this.#protocol;\n }\n\n get readyState(): globalThis.RTCDataChannelState {\n return this.#readyState;\n }\n\n send(data): void {\n if (this.#readyState !== 'open') {\n throw new exceptions.InvalidStateError(\n \"Failed to execute 'send' on 'RTCDataChannel': RTCDataChannel.readyState is not 'open'\",\n );\n }\n\n // Needs network error, type error implemented\n if (typeof data === 'string') {\n this.#dataChannel.sendMessage(data);\n } else if (data instanceof Blob) {\n data.arrayBuffer().then((ab) => {\n if (process?.versions?.bun) {\n this.#dataChannel.sendMessageBinary(Buffer.from(ab));\n } else {\n this.#dataChannel.sendMessageBinary(new Uint8Array(ab));\n }\n });\n } else if (data instanceof Uint8Array) {\n this.#dataChannel.sendMessageBinary(data);\n } else {\n if (process?.versions?.bun) {\n this.#dataChannel.sendMessageBinary(Buffer.from(data));\n } else {\n this.#dataChannel.sendMessageBinary(new Uint8Array(data));\n }\n }\n }\n\n close(): void {\n this.#closeRequested = true;\n setImmediate(() => {\n this.#dataChannel.close();\n });\n }\n}\n"],"names":["RTCErrorEvent","exceptions.InvalidStateError"],"mappings":"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"}
1
+ {"version":3,"file":"RTCDataChannel.cjs","sources":["../../../src/polyfill/RTCDataChannel.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport * as exceptions from './Exception';\nimport { DataChannel } from '../lib/index';\nimport { RTCErrorEvent } from './Events';\n\nexport default class RTCDataChannel extends EventTarget implements globalThis.RTCDataChannel {\n #dataChannel: DataChannel;\n #readyState: globalThis.RTCDataChannelState;\n #bufferedAmountLowThreshold: number;\n #binaryType: BinaryType;\n #maxPacketLifeTime: number | null;\n #maxRetransmits: number | null;\n #negotiated: boolean;\n #ordered: boolean;\n #id: number;\n #label: string;\n #protocol: string;\n\n #closeRequested = false;\n\n // events\n onbufferedamountlow: globalThis.RTCDataChannel['onbufferedamountlow'] = null;\n onclose: globalThis.RTCDataChannel['onclose'] = null;\n onclosing: globalThis.RTCDataChannel['onclosing'] = null;\n onerror: globalThis.RTCDataChannel['onerror'] = null;\n onmessage: globalThis.RTCDataChannel['onmessage'] = null;\n onopen: globalThis.RTCDataChannel['onopen'] = null;\n\n constructor(dataChannel: DataChannel, opts: globalThis.RTCDataChannelInit = {}) {\n super();\n\n this.#dataChannel = dataChannel;\n this.#binaryType = 'arraybuffer';\n this.#readyState = this.#dataChannel.isOpen() ? 'open' : 'connecting';\n this.#bufferedAmountLowThreshold = 0;\n this.#maxPacketLifeTime = opts.maxPacketLifeTime ?? null;\n this.#maxRetransmits = opts.maxRetransmits ?? null;\n this.#negotiated = opts.negotiated ?? false;\n this.#ordered = opts.ordered ?? true;\n this.#id = this.#dataChannel.getId();\n this.#label = this.#dataChannel.getLabel();\n this.#protocol = this.#dataChannel.getProtocol();\n\n // forward dataChannel events\n this.#dataChannel.onOpen(() => {\n this.#readyState = 'open';\n this.dispatchEvent(new Event('open', {}));\n });\n\n this.#dataChannel.onClosed(() => {\n // Simulate closing event\n if (!this.#closeRequested) {\n this.#readyState = 'closing';\n this.dispatchEvent(new Event('closing'));\n }\n\n setImmediate(() => {\n this.#readyState = 'closed';\n this.dispatchEvent(new Event('close'));\n });\n });\n\n this.#dataChannel.onError((msg) => {\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\n this.#dataChannel.onBufferedAmountLow(() => {\n this.dispatchEvent(new Event('bufferedamountlow'));\n });\n\n this.#dataChannel.onMessage((message) => {\n if (typeof message === 'string') {\n this.dispatchEvent(new MessageEvent('message', { data: message }));\n return;\n }\n\n let data: Blob | ArrayBuffer;\n\n if (message instanceof ArrayBuffer) {\n data = message;\n } else {\n data = message.buffer;\n\n if (message.byteOffset !== 0 || message.byteLength !== message.buffer.byteLength) {\n // message is view on underlying buffer, must create new\n // ArrayBuffer that only contains message data\n data = new ArrayBuffer(message.byteLength);\n new Uint8Array(data, 0, message.byteLength).set(message);\n }\n }\n\n if (this.#binaryType === 'blob') {\n data = new Blob([data]);\n }\n\n this.dispatchEvent(new MessageEvent('message', { data }));\n });\n\n // forward events to properties\n this.addEventListener('message', (e) => {\n if (this.onmessage) this.onmessage(e as MessageEvent);\n });\n this.addEventListener('bufferedamountlow', (e) => {\n if (this.onbufferedamountlow) this.onbufferedamountlow(e);\n });\n this.addEventListener('error', (e) => {\n if (this.onerror) this.onerror(e as RTCErrorEvent);\n });\n this.addEventListener('close', (e) => {\n if (this.onclose) this.onclose(e);\n });\n this.addEventListener('closing', (e) => {\n if (this.onclosing) this.onclosing(e);\n });\n this.addEventListener('open', (e) => {\n if (this.onopen) this.onopen(e);\n });\n }\n\n set binaryType(type) {\n if (type !== 'blob' && type !== 'arraybuffer') {\n throw new DOMException(\n \"Failed to set the 'binaryType' property on 'RTCDataChannel': Unknown binary type : \" +\n type,\n 'TypeMismatchError',\n );\n }\n this.#binaryType = type;\n }\n\n get binaryType(): BinaryType {\n return this.#binaryType;\n }\n\n get bufferedAmount(): number {\n return this.#dataChannel.bufferedAmount();\n }\n\n get bufferedAmountLowThreshold(): number {\n return this.#bufferedAmountLowThreshold;\n }\n\n set bufferedAmountLowThreshold(value) {\n const number = Number(value) || 0;\n this.#bufferedAmountLowThreshold = number;\n this.#dataChannel.setBufferedAmountLowThreshold(number);\n }\n\n get id(): number | null {\n return this.#id;\n }\n\n get label(): string {\n return this.#label;\n }\n\n get maxPacketLifeTime(): number | null {\n return this.#maxPacketLifeTime;\n }\n\n get maxRetransmits(): number | null {\n return this.#maxRetransmits;\n }\n\n get negotiated(): boolean {\n return this.#negotiated;\n }\n\n get ordered(): boolean {\n return this.#ordered;\n }\n\n get protocol(): string {\n return this.#protocol;\n }\n\n get readyState(): globalThis.RTCDataChannelState {\n return this.#readyState;\n }\n\n send(data): void {\n if (this.#readyState !== 'open') {\n throw new exceptions.InvalidStateError(\n \"Failed to execute 'send' on 'RTCDataChannel': RTCDataChannel.readyState is not 'open'\",\n );\n }\n\n // Needs network error, type error implemented\n if (typeof data === 'string') {\n this.#dataChannel.sendMessage(data);\n } else if (data instanceof Blob) {\n data.arrayBuffer().then((ab) => {\n if (process?.versions?.bun) {\n this.#dataChannel.sendMessageBinary(Buffer.from(ab));\n } else {\n this.#dataChannel.sendMessageBinary(new Uint8Array(ab));\n }\n });\n } else if (data instanceof Uint8Array) {\n this.#dataChannel.sendMessageBinary(data);\n } else {\n if (process?.versions?.bun) {\n this.#dataChannel.sendMessageBinary(Buffer.from(data));\n } else {\n this.#dataChannel.sendMessageBinary(new Uint8Array(data));\n }\n }\n }\n\n close(): void {\n this.#closeRequested = true;\n setImmediate(() => {\n this.#dataChannel.close();\n });\n }\n}\n"],"names":["RTCErrorEvent","exceptions.InvalidStateError"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"RTCDtlsTransport.cjs","sources":["../../../src/polyfill/RTCDtlsTransport.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport RTCIceTransport from './RTCIceTransport';\nimport RTCPeerConnection from './RTCPeerConnection';\n\nexport default class RTCDtlsTransport extends EventTarget implements globalThis.RTCDtlsTransport {\n #pc: RTCPeerConnection = null;\n #iceTransport = null;\n\n onstatechange: globalThis.RTCDtlsTransport['onstatechange'] = null;\n onerror: globalThis.RTCDtlsTransport['onstatechange'] = null;\n\n constructor(init: { pc: RTCPeerConnection }) {\n super();\n this.#pc = init.pc;\n\n this.#iceTransport = new RTCIceTransport({\n pc: init.pc\n });\n\n // forward peerConnection events\n this.#pc.addEventListener('connectionstatechange', () => {\n const e = new Event('statechange');\n this.dispatchEvent(e);\n this.onstatechange?.(e);\n });\n }\n\n get iceTransport(): globalThis.RTCIceTransport {\n return this.#iceTransport;\n }\n\n get state(): globalThis.RTCDtlsTransportState {\n // reduce state from new, connecting, connected, disconnected, failed, closed, unknown\n // to RTCDtlsTRansport states new, connecting, connected, closed, failed\n let state = this.#pc ? this.#pc.connectionState : 'new';\n if (state === 'disconnected') {\n state = 'closed';\n }\n return state;\n }\n\n getRemoteCertificates(): ArrayBuffer[] {\n // TODO: implement\n return [new ArrayBuffer(0)];\n }\n}\n"],"names":["RTCIceTransport"],"mappings":";;;;;;;;;;;;;;;;AAAA,IAAA,GAAA,EAAA,aAAA,CAAA;AAIA,MAAqB,yBAAyB,WAAmD,CAAA;AAAA,EAO/F,YAAY,IAAiC,EAAA;AAC3C,IAAM,KAAA,EAAA,CAAA;AAPR,IAAyB,YAAA,CAAA,IAAA,EAAA,GAAA,EAAA,IAAA,CAAA,CAAA;AACzB,IAAgB,YAAA,CAAA,IAAA,EAAA,aAAA,EAAA,IAAA,CAAA,CAAA;AAEhB,IAA8D,aAAA,CAAA,IAAA,EAAA,eAAA,EAAA,IAAA,CAAA,CAAA;AAC9D,IAAwD,aAAA,CAAA,IAAA,EAAA,SAAA,EAAA,IAAA,CAAA,CAAA;AAItD,IAAA,YAAA,CAAA,IAAA,EAAK,KAAM,IAAK,CAAA,EAAA,CAAA,CAAA;AAEhB,IAAK,YAAA,CAAA,IAAA,EAAA,aAAA,EAAgB,IAAIA,uBAAgB,CAAA;AAAA,MACvC,IAAI,IAAK,CAAA,EAAA;AAAA,KACV,CAAA,CAAA,CAAA;AAGD,IAAK,YAAA,CAAA,IAAA,EAAA,GAAA,CAAA,CAAI,gBAAiB,CAAA,uBAAA,EAAyB,MAAM;AACvD,MAAM,MAAA,CAAA,GAAI,IAAI,KAAA,CAAM,aAAa,CAAA,CAAA;AACjC,MAAA,IAAA,CAAK,cAAc,CAAC,CAAA,CAAA;AACpB,MAAA,IAAA,CAAK,gBAAgB,CAAC,CAAA,CAAA;AAAA,KACvB,CAAA,CAAA;AAAA,GACH;AAAA,EAEA,IAAI,YAA2C,GAAA;AAC7C,IAAA,OAAO,YAAK,CAAA,IAAA,EAAA,aAAA,CAAA,CAAA;AAAA,GACd;AAAA,EAEA,IAAI,KAA0C,GAAA;AAG5C,IAAA,IAAI,KAAQ,GAAA,YAAA,CAAA,IAAA,EAAK,GAAM,CAAA,GAAA,YAAA,CAAA,IAAA,EAAK,KAAI,eAAkB,GAAA,KAAA,CAAA;AAClD,IAAA,IAAI,UAAU,cAAgB,EAAA;AAC5B,MAAQ,KAAA,GAAA,QAAA,CAAA;AAAA,KACV;AACA,IAAO,OAAA,KAAA,CAAA;AAAA,GACT;AAAA,EAEA,qBAAuC,GAAA;AAErC,IAAA,OAAO,CAAC,IAAI,WAAY,CAAA,CAAC,CAAC,CAAA,CAAA;AAAA,GAC5B;AACF,CAAA;AAxCE,GAAA,GAAA,IAAA,OAAA,EAAA,CAAA;AACA,aAAA,GAAA,IAAA,OAAA,EAAA;;;;"}
1
+ {"version":3,"file":"RTCDtlsTransport.cjs","sources":["../../../src/polyfill/RTCDtlsTransport.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport RTCIceTransport from './RTCIceTransport';\nimport RTCPeerConnection from './RTCPeerConnection';\n\nexport default class RTCDtlsTransport extends EventTarget implements globalThis.RTCDtlsTransport {\n #pc: RTCPeerConnection = null;\n #iceTransport = null;\n\n onstatechange: globalThis.RTCDtlsTransport['onstatechange'] = null;\n onerror: globalThis.RTCDtlsTransport['onstatechange'] = null;\n\n constructor(init: { pc: RTCPeerConnection }) {\n super();\n this.#pc = init.pc;\n\n this.#iceTransport = new RTCIceTransport({\n pc: init.pc,\n });\n\n // forward peerConnection events\n this.#pc.addEventListener('connectionstatechange', () => {\n const e = new Event('statechange');\n this.dispatchEvent(e);\n this.onstatechange?.(e);\n });\n }\n\n get iceTransport(): globalThis.RTCIceTransport {\n return this.#iceTransport;\n }\n\n get state(): globalThis.RTCDtlsTransportState {\n // reduce state from new, connecting, connected, disconnected, failed, closed, unknown\n // to RTCDtlsTRansport states new, connecting, connected, closed, failed\n let state = this.#pc ? this.#pc.connectionState : 'new';\n if (state === 'disconnected') {\n state = 'closed';\n }\n return state;\n }\n\n getRemoteCertificates(): ArrayBuffer[] {\n // TODO: implement\n return [new ArrayBuffer(0)];\n }\n}\n"],"names":["RTCIceTransport"],"mappings":";;;;;;;;;;;;;;;;AAAA,IAAA,GAAA,EAAA,aAAA,CAAA;AAIA,MAAqB,yBAAyB,WAAmD,CAAA;AAAA,EAO/F,YAAY,IAAiC,EAAA;AAC3C,IAAM,KAAA,EAAA,CAAA;AAPR,IAAyB,YAAA,CAAA,IAAA,EAAA,GAAA,EAAA,IAAA,CAAA,CAAA;AACzB,IAAgB,YAAA,CAAA,IAAA,EAAA,aAAA,EAAA,IAAA,CAAA,CAAA;AAEhB,IAA8D,aAAA,CAAA,IAAA,EAAA,eAAA,EAAA,IAAA,CAAA,CAAA;AAC9D,IAAwD,aAAA,CAAA,IAAA,EAAA,SAAA,EAAA,IAAA,CAAA,CAAA;AAItD,IAAA,YAAA,CAAA,IAAA,EAAK,KAAM,IAAK,CAAA,EAAA,CAAA,CAAA;AAEhB,IAAK,YAAA,CAAA,IAAA,EAAA,aAAA,EAAgB,IAAIA,uBAAgB,CAAA;AAAA,MACvC,IAAI,IAAK,CAAA,EAAA;AAAA,KACV,CAAA,CAAA,CAAA;AAGD,IAAK,YAAA,CAAA,IAAA,EAAA,GAAA,CAAA,CAAI,gBAAiB,CAAA,uBAAA,EAAyB,MAAM;AACvD,MAAM,MAAA,CAAA,GAAI,IAAI,KAAA,CAAM,aAAa,CAAA,CAAA;AACjC,MAAA,IAAA,CAAK,cAAc,CAAC,CAAA,CAAA;AACpB,MAAA,IAAA,CAAK,gBAAgB,CAAC,CAAA,CAAA;AAAA,KACvB,CAAA,CAAA;AAAA,GACH;AAAA,EAEA,IAAI,YAA2C,GAAA;AAC7C,IAAA,OAAO,YAAK,CAAA,IAAA,EAAA,aAAA,CAAA,CAAA;AAAA,GACd;AAAA,EAEA,IAAI,KAA0C,GAAA;AAG5C,IAAA,IAAI,KAAQ,GAAA,YAAA,CAAA,IAAA,EAAK,GAAM,CAAA,GAAA,YAAA,CAAA,IAAA,EAAK,KAAI,eAAkB,GAAA,KAAA,CAAA;AAClD,IAAA,IAAI,UAAU,cAAgB,EAAA;AAC5B,MAAQ,KAAA,GAAA,QAAA,CAAA;AAAA,KACV;AACA,IAAO,OAAA,KAAA,CAAA;AAAA,GACT;AAAA,EAEA,qBAAuC,GAAA;AAErC,IAAA,OAAO,CAAC,IAAI,WAAY,CAAA,CAAC,CAAC,CAAA,CAAA;AAAA,GAC5B;AACF,CAAA;AAxCE,GAAA,GAAA,IAAA,OAAA,EAAA,CAAA;AACA,aAAA,GAAA,IAAA,OAAA,EAAA;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"RTCSctpTransport.cjs","sources":["../../../src/polyfill/RTCSctpTransport.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport RTCDtlsTransport from './RTCDtlsTransport';\nimport RTCPeerConnection from './RTCPeerConnection';\n\nexport default class RTCSctpTransport extends EventTarget implements globalThis.RTCSctpTransport {\n #pc: RTCPeerConnection = null;\n #transport: globalThis.RTCDtlsTransport = null;\n\n onstatechange: globalThis.RTCSctpTransport['onstatechange'] = null;\n\n constructor(initial: { pc: RTCPeerConnection }) {\n super();\n this.#pc = initial.pc;\n\n this.#transport = new RTCDtlsTransport({\n pc: initial.pc\n });\n\n this.#pc.addEventListener('connectionstatechange', () => {\n const e = new Event('statechange');\n this.dispatchEvent(e);\n this.onstatechange?.(e);\n });\n }\n\n get maxChannels(): number | null {\n if (this.state !== 'connected') return null;\n return this.#pc.ext_maxDataChannelId;\n }\n\n get maxMessageSize(): number {\n if (this.state !== 'connected') return null;\n return this.#pc?.ext_maxMessageSize ?? 65536;;\n }\n\n get state(): globalThis.RTCSctpTransportState {\n // reduce state from new, connecting, connected, disconnected, failed, closed, unknown\n // to RTCSctpTransport states connecting, connected, closed\n let state = this.#pc.connectionState;\n if (state === 'new' || state === 'connecting') {\n state = 'connecting';\n } else if (state === 'disconnected' || state === 'failed' || state === 'closed') {\n state = 'closed';\n }\n return state;\n }\n\n get transport(): globalThis.RTCDtlsTransport {\n return this.#transport;\n }\n}\n"],"names":["RTCDtlsTransport"],"mappings":";;;;;;;;;;;;;;;;AAAA,IAAA,GAAA,EAAA,UAAA,CAAA;AAIA,MAAqB,yBAAyB,WAAmD,CAAA;AAAA,EAM/F,YAAY,OAAoC,EAAA;AAC9C,IAAM,KAAA,EAAA,CAAA;AANR,IAAyB,YAAA,CAAA,IAAA,EAAA,GAAA,EAAA,IAAA,CAAA,CAAA;AACzB,IAA0C,YAAA,CAAA,IAAA,EAAA,UAAA,EAAA,IAAA,CAAA,CAAA;AAE1C,IAA8D,aAAA,CAAA,IAAA,EAAA,eAAA,EAAA,IAAA,CAAA,CAAA;AAI5D,IAAA,YAAA,CAAA,IAAA,EAAK,KAAM,OAAQ,CAAA,EAAA,CAAA,CAAA;AAEnB,IAAK,YAAA,CAAA,IAAA,EAAA,UAAA,EAAa,IAAIA,wBAAiB,CAAA;AAAA,MACrC,IAAI,OAAQ,CAAA,EAAA;AAAA,KACb,CAAA,CAAA,CAAA;AAED,IAAK,YAAA,CAAA,IAAA,EAAA,GAAA,CAAA,CAAI,gBAAiB,CAAA,uBAAA,EAAyB,MAAM;AACvD,MAAM,MAAA,CAAA,GAAI,IAAI,KAAA,CAAM,aAAa,CAAA,CAAA;AACjC,MAAA,IAAA,CAAK,cAAc,CAAC,CAAA,CAAA;AACpB,MAAA,IAAA,CAAK,gBAAgB,CAAC,CAAA,CAAA;AAAA,KACvB,CAAA,CAAA;AAAA,GACH;AAAA,EAEA,IAAI,WAA6B,GAAA;AAC/B,IAAI,IAAA,IAAA,CAAK,KAAU,KAAA,WAAA,EAAoB,OAAA,IAAA,CAAA;AACvC,IAAA,OAAO,mBAAK,GAAI,CAAA,CAAA,oBAAA,CAAA;AAAA,GAClB;AAAA,EAEA,IAAI,cAAyB,GAAA;AAC3B,IAAI,IAAA,IAAA,CAAK,KAAU,KAAA,WAAA,EAAoB,OAAA,IAAA,CAAA;AACvC,IAAO,OAAA,YAAA,CAAA,IAAA,EAAK,MAAK,kBAAsB,IAAA,KAAA,CAAA;AAAM,GAC/C;AAAA,EAEA,IAAI,KAA0C,GAAA;AAG5C,IAAI,IAAA,KAAA,GAAQ,mBAAK,GAAI,CAAA,CAAA,eAAA,CAAA;AACrB,IAAI,IAAA,KAAA,KAAU,KAAS,IAAA,KAAA,KAAU,YAAc,EAAA;AAC7C,MAAQ,KAAA,GAAA,YAAA,CAAA;AAAA,eACC,KAAU,KAAA,cAAA,IAAkB,KAAU,KAAA,QAAA,IAAY,UAAU,QAAU,EAAA;AAC/E,MAAQ,KAAA,GAAA,QAAA,CAAA;AAAA,KACV;AACA,IAAO,OAAA,KAAA,CAAA;AAAA,GACT;AAAA,EAEA,IAAI,SAAyC,GAAA;AAC3C,IAAA,OAAO,YAAK,CAAA,IAAA,EAAA,UAAA,CAAA,CAAA;AAAA,GACd;AACF,CAAA;AA7CE,GAAA,GAAA,IAAA,OAAA,EAAA,CAAA;AACA,UAAA,GAAA,IAAA,OAAA,EAAA;;;;"}
1
+ {"version":3,"file":"RTCSctpTransport.cjs","sources":["../../../src/polyfill/RTCSctpTransport.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport RTCDtlsTransport from './RTCDtlsTransport';\nimport RTCPeerConnection from './RTCPeerConnection';\n\nexport default class RTCSctpTransport extends EventTarget implements globalThis.RTCSctpTransport {\n #pc: RTCPeerConnection = null;\n #transport: globalThis.RTCDtlsTransport = null;\n\n onstatechange: globalThis.RTCSctpTransport['onstatechange'] = null;\n\n constructor(initial: { pc: RTCPeerConnection }) {\n super();\n this.#pc = initial.pc;\n\n this.#transport = new RTCDtlsTransport({\n pc: initial.pc,\n });\n\n this.#pc.addEventListener('connectionstatechange', () => {\n const e = new Event('statechange');\n this.dispatchEvent(e);\n this.onstatechange?.(e);\n });\n }\n\n get maxChannels(): number | null {\n if (this.state !== 'connected') return null;\n return this.#pc.ext_maxDataChannelId;\n }\n\n get maxMessageSize(): number {\n if (this.state !== 'connected') return null;\n return this.#pc?.ext_maxMessageSize ?? 65536;\n }\n\n get state(): globalThis.RTCSctpTransportState {\n // reduce state from new, connecting, connected, disconnected, failed, closed, unknown\n // to RTCSctpTransport states connecting, connected, closed\n let state = this.#pc.connectionState;\n if (state === 'new' || state === 'connecting') {\n state = 'connecting';\n } else if (state === 'disconnected' || state === 'failed' || state === 'closed') {\n state = 'closed';\n }\n return state;\n }\n\n get transport(): globalThis.RTCDtlsTransport {\n return this.#transport;\n }\n}\n"],"names":["RTCDtlsTransport"],"mappings":";;;;;;;;;;;;;;;;AAAA,IAAA,GAAA,EAAA,UAAA,CAAA;AAIA,MAAqB,yBAAyB,WAAmD,CAAA;AAAA,EAM/F,YAAY,OAAoC,EAAA;AAC9C,IAAM,KAAA,EAAA,CAAA;AANR,IAAyB,YAAA,CAAA,IAAA,EAAA,GAAA,EAAA,IAAA,CAAA,CAAA;AACzB,IAA0C,YAAA,CAAA,IAAA,EAAA,UAAA,EAAA,IAAA,CAAA,CAAA;AAE1C,IAA8D,aAAA,CAAA,IAAA,EAAA,eAAA,EAAA,IAAA,CAAA,CAAA;AAI5D,IAAA,YAAA,CAAA,IAAA,EAAK,KAAM,OAAQ,CAAA,EAAA,CAAA,CAAA;AAEnB,IAAK,YAAA,CAAA,IAAA,EAAA,UAAA,EAAa,IAAIA,wBAAiB,CAAA;AAAA,MACrC,IAAI,OAAQ,CAAA,EAAA;AAAA,KACb,CAAA,CAAA,CAAA;AAED,IAAK,YAAA,CAAA,IAAA,EAAA,GAAA,CAAA,CAAI,gBAAiB,CAAA,uBAAA,EAAyB,MAAM;AACvD,MAAM,MAAA,CAAA,GAAI,IAAI,KAAA,CAAM,aAAa,CAAA,CAAA;AACjC,MAAA,IAAA,CAAK,cAAc,CAAC,CAAA,CAAA;AACpB,MAAA,IAAA,CAAK,gBAAgB,CAAC,CAAA,CAAA;AAAA,KACvB,CAAA,CAAA;AAAA,GACH;AAAA,EAEA,IAAI,WAA6B,GAAA;AAC/B,IAAI,IAAA,IAAA,CAAK,KAAU,KAAA,WAAA,EAAoB,OAAA,IAAA,CAAA;AACvC,IAAA,OAAO,mBAAK,GAAI,CAAA,CAAA,oBAAA,CAAA;AAAA,GAClB;AAAA,EAEA,IAAI,cAAyB,GAAA;AAC3B,IAAI,IAAA,IAAA,CAAK,KAAU,KAAA,WAAA,EAAoB,OAAA,IAAA,CAAA;AACvC,IAAO,OAAA,YAAA,CAAA,IAAA,EAAK,MAAK,kBAAsB,IAAA,KAAA,CAAA;AAAA,GACzC;AAAA,EAEA,IAAI,KAA0C,GAAA;AAG5C,IAAI,IAAA,KAAA,GAAQ,mBAAK,GAAI,CAAA,CAAA,eAAA,CAAA;AACrB,IAAI,IAAA,KAAA,KAAU,KAAS,IAAA,KAAA,KAAU,YAAc,EAAA;AAC7C,MAAQ,KAAA,GAAA,YAAA,CAAA;AAAA,eACC,KAAU,KAAA,cAAA,IAAkB,KAAU,KAAA,QAAA,IAAY,UAAU,QAAU,EAAA;AAC/E,MAAQ,KAAA,GAAA,QAAA,CAAA;AAAA,KACV;AACA,IAAO,OAAA,KAAA,CAAA;AAAA,GACT;AAAA,EAEA,IAAI,SAAyC,GAAA;AAC3C,IAAA,OAAO,YAAK,CAAA,IAAA,EAAA,UAAA,CAAA,CAAA;AAAA,GACd;AACF,CAAA;AA7CE,GAAA,GAAA,IAAA,OAAA,EAAA,CAAA;AACA,UAAA,GAAA,IAAA,OAAA,EAAA;;;;"}
@@ -23,6 +23,7 @@ const Video = nodeDataChannel.Video;
23
23
  const Track = nodeDataChannel.Track;
24
24
  const DataChannel = nodeDataChannel.DataChannel;
25
25
  const PeerConnection = nodeDataChannel.PeerConnection;
26
+ const IceUdpMuxListener = nodeDataChannel.IceUdpMuxListener;
26
27
  const RtcpReceivingSession = nodeDataChannel.RtcpReceivingSession;
27
28
  const DataChannelStream = DataChannelStream$1;
28
29
  var n = {
@@ -39,8 +40,9 @@ var n = {
39
40
  PeerConnection,
40
41
  WebSocket,
41
42
  WebSocketServer,
42
- DataChannelStream
43
+ DataChannelStream,
44
+ IceUdpMuxListener
43
45
  };
44
46
 
45
- export { Audio, DataChannel, DataChannelStream, PeerConnection, RtcpReceivingSession, Track, Video, WebSocket, WebSocketServer, cleanup, n as default, getLibraryVersion, initLogger, preload, setSctpSettings };
47
+ export { Audio, DataChannel, DataChannelStream, IceUdpMuxListener, PeerConnection, RtcpReceivingSession, Track, Video, WebSocket, WebSocketServer, cleanup, n as default, getLibraryVersion, initLogger, preload, setSctpSettings };
46
48
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../../../src/lib/index.ts"],"sourcesContent":["import nodeDataChannel from './node-datachannel';\nimport _DataChannelStream from './datachannel-stream';\nimport { WebSocketServer } from './websocket-server';\nimport {\n Channel,\n DataChannelInitConfig,\n DescriptionType,\n Direction,\n LogLevel,\n RtcConfig,\n RTCIceConnectionState,\n RTCIceGatheringState,\n RTCPeerConnectionState,\n RTCSignalingState,\n SctpSettings,\n SelectedCandidateInfo,\n} from './types';\nimport { WebSocket } from './websocket';\n\nexport function preload(): void {\n nodeDataChannel.preload();\n}\nexport function initLogger(level: LogLevel): void {\n nodeDataChannel.initLogger(level);\n}\nexport function cleanup(): void {\n nodeDataChannel.cleanup();\n}\nexport function setSctpSettings(settings: SctpSettings): void {\n nodeDataChannel.setSctpSettings(settings);\n}\nexport function getLibraryVersion(): string {\n return nodeDataChannel.getLibraryVersion();\n}\n\nexport interface Audio {\n addAudioCodec(payloadType: number, codec: string, profile?: string): void;\n addOpusCodec(payloadType: number, profile?: string): string;\n direction(): Direction;\n generateSdp(eol: string, addr: string, port: number): string;\n mid(): string;\n setDirection(dir: Direction): void;\n description(): string;\n removeFormat(fmt: string): void;\n addSSRC(ssrc: number, name?: string, msid?: string, trackID?: string): void;\n removeSSRC(ssrc: number): void;\n replaceSSRC(oldSsrc: number, ssrc: number, name?: string, msid?: string, trackID?: string): void;\n hasSSRC(ssrc: number): boolean;\n getSSRCs(): number[];\n getCNameForSsrc(ssrc: number): string;\n setBitrate(bitRate: number): void;\n getBitrate(): number;\n hasPayloadType(payloadType: number): boolean;\n addRTXCodec(payloadType: number, originalPayloadType: number, clockRate: number): void;\n addRTPMap(): void;\n parseSdpLine(line: string): void;\n}\nexport const Audio: {\n new (mid: string, dir: Direction): Audio;\n} = nodeDataChannel.Audio;\n\nexport interface Video {\n addVideoCodec(payloadType: number, codec: string, profile?: string): void;\n addH264Codec(payloadType: number, profile?: string): void;\n addVP8Codec(payloadType: number): void;\n addVP9Codec(payloadType: number): void;\n direction(): Direction;\n generateSdp(eol: string, addr: string, port: number): string;\n mid(): string;\n setDirection(dir: Direction): void;\n description(): string;\n removeFormat(fmt: string): void;\n addSSRC(ssrc: number, name?: string, msid?: string, trackID?: string): void;\n removeSSRC(ssrc: number): void;\n replaceSSRC(oldSsrc: number, ssrc: number, name?: string, msid?: string, trackID?: string): void;\n hasSSRC(ssrc: number): boolean;\n getSSRCs(): number[];\n getCNameForSsrc(ssrc: number): string;\n setBitrate(bitRate: number): void;\n getBitrate(): number;\n hasPayloadType(payloadType: number): boolean;\n addRTXCodec(payloadType: number, originalPayloadType: number, clockRate: number): void;\n addRTPMap(): void;\n parseSdpLine(line: string): void;\n}\nexport const Video: {\n new (mid: string, dir: Direction): Video;\n} = nodeDataChannel.Video;\n\nexport interface Track {\n direction(): Direction;\n mid(): string;\n type(): string;\n close(): void;\n sendMessage(msg: string): boolean;\n sendMessageBinary(buffer: Buffer): boolean;\n isOpen(): boolean;\n isClosed(): boolean;\n bufferedAmount(): number;\n maxMessageSize(): number;\n requestBitrate(bitRate: number): boolean;\n setBufferedAmountLowThreshold(newSize: number): void;\n requestKeyframe(): boolean;\n setMediaHandler(handler: RtcpReceivingSession): void;\n onOpen(cb: () => void): void;\n onClosed(cb: () => void): void;\n onError(cb: (err: string) => void): void;\n onMessage(cb: (msg: Buffer) => void): void;\n}\nexport const Track: {\n new (): Track;\n} = nodeDataChannel.Track;\n\nexport interface DataChannel extends Channel {\n getLabel(): string;\n getId(): number;\n getProtocol(): string;\n\n // Channel implementation\n close(): void;\n sendMessage(msg: string): boolean;\n sendMessageBinary(buffer: Buffer | Uint8Array): boolean;\n isOpen(): boolean;\n bufferedAmount(): number;\n maxMessageSize(): number;\n setBufferedAmountLowThreshold(newSize: number): void;\n onOpen(cb: () => void): void;\n onClosed(cb: () => void): void;\n onError(cb: (err: string) => void): void;\n onBufferedAmountLow(cb: () => void): void;\n onMessage(cb: (msg: string | Buffer | ArrayBuffer) => void): void;\n}\nexport const DataChannel: {\n // DataChannel implementation\n} = nodeDataChannel.DataChannel;\n\nexport interface PeerConnection {\n close(): void;\n setLocalDescription(type?: DescriptionType): void;\n setRemoteDescription(sdp: string, type: DescriptionType): void;\n localDescription(): { type: DescriptionType; sdp: string } | null;\n remoteDescription(): { type: DescriptionType; sdp: string } | null;\n addRemoteCandidate(candidate: string, mid: string): void;\n createDataChannel(label: string, config?: DataChannelInitConfig): DataChannel;\n addTrack(media: Video | Audio): Track;\n hasMedia(): boolean;\n state(): RTCPeerConnectionState;\n iceState(): RTCIceConnectionState;\n signalingState(): RTCSignalingState;\n gatheringState(): RTCIceGatheringState;\n onLocalDescription(cb: (sdp: string, type: DescriptionType) => void): void;\n onLocalCandidate(cb: (candidate: string, mid: string) => void): void;\n onStateChange(cb: (state: string) => void): void;\n onIceStateChange(cb: (state: string) => void): void;\n onSignalingStateChange(cb: (state: string) => void): void;\n onGatheringStateChange(cb: (state: string) => void): void;\n onDataChannel(cb: (dc: DataChannel) => void): void;\n onTrack(cb: (track: Track) => void): void;\n bytesSent(): number;\n bytesReceived(): number;\n rtt(): number;\n getSelectedCandidatePair(): {\n local: SelectedCandidateInfo;\n remote: SelectedCandidateInfo;\n } | null;\n maxDataChannelId(): number;\n maxMessageSize(): number;\n}\nexport const PeerConnection: {\n new (peerName: string, config: RtcConfig): PeerConnection;\n} = nodeDataChannel.PeerConnection;\n\nexport interface RtcpReceivingSession {}\n\nexport const RtcpReceivingSession: {\n new (): RtcpReceivingSession;\n} = nodeDataChannel.RtcpReceivingSession;\n\nexport { WebSocketServer } from './websocket-server';\nexport { WebSocket } from './websocket';\n\nexport const DataChannelStream = _DataChannelStream;\n\nexport default {\n initLogger,\n cleanup,\n preload,\n setSctpSettings,\n getLibraryVersion,\n RtcpReceivingSession,\n Track,\n Video,\n Audio,\n DataChannel,\n PeerConnection,\n WebSocket,\n WebSocketServer,\n DataChannelStream,\n};\n\n// Types\n// https://github.com/murat-dogan/node-datachannel/issues/300\nexport * from './types';\n"],"names":["_DataChannelStream"],"mappings":";;;;;AAmBO,SAAS,OAAgB,GAAA;AAC9B,EAAA,eAAA,CAAgB,OAAQ,EAAA,CAAA;AAC1B,CAAA;AACO,SAAS,WAAW,KAAuB,EAAA;AAChD,EAAA,eAAA,CAAgB,WAAW,KAAK,CAAA,CAAA;AAClC,CAAA;AACO,SAAS,OAAgB,GAAA;AAC9B,EAAA,eAAA,CAAgB,OAAQ,EAAA,CAAA;AAC1B,CAAA;AACO,SAAS,gBAAgB,QAA8B,EAAA;AAC5D,EAAA,eAAA,CAAgB,gBAAgB,QAAQ,CAAA,CAAA;AAC1C,CAAA;AACO,SAAS,iBAA4B,GAAA;AAC1C,EAAA,OAAO,gBAAgB,iBAAkB,EAAA,CAAA;AAC3C,CAAA;AAwBO,MAAM,QAET,eAAgB,CAAA,MAAA;AA0Bb,MAAM,QAET,eAAgB,CAAA,MAAA;AAsBb,MAAM,QAET,eAAgB,CAAA,MAAA;AAqBb,MAAM,cAET,eAAgB,CAAA,YAAA;AAkCb,MAAM,iBAET,eAAgB,CAAA,eAAA;AAIb,MAAM,uBAET,eAAgB,CAAA,qBAAA;AAKb,MAAM,iBAAoB,GAAAA,oBAAA;AAEjC,QAAe;AAAA,EACb,UAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,eAAA;AAAA,EACA,iBAAA;AAAA,EACA,oBAAA;AAAA,EACA,KAAA;AAAA,EACA,KAAA;AAAA,EACA,KAAA;AAAA,EACA,WAAA;AAAA,EACA,cAAA;AAAA,EACA,SAAA;AAAA,EACA,eAAA;AAAA,EACA,iBAAA;AACF,CAAA;;;;"}
1
+ {"version":3,"file":"index.mjs","sources":["../../../src/lib/index.ts"],"sourcesContent":["import nodeDataChannel from './node-datachannel';\nimport _DataChannelStream from './datachannel-stream';\nimport { WebSocketServer } from './websocket-server';\nimport {\n Channel,\n DataChannelInitConfig,\n DescriptionType,\n Direction,\n LogLevel,\n RtcConfig,\n RTCIceConnectionState,\n RTCIceGatheringState,\n RTCPeerConnectionState,\n RTCSignalingState,\n SctpSettings,\n SelectedCandidateInfo,\n} from './types';\nimport { WebSocket } from './websocket';\nimport type { CertificateFingerprint, IceUdpMuxRequest, LocalDescriptionInit } from './types';\n\nexport function preload(): void {\n nodeDataChannel.preload();\n}\nexport function initLogger(level: LogLevel): void {\n nodeDataChannel.initLogger(level);\n}\nexport function cleanup(): void {\n nodeDataChannel.cleanup();\n}\nexport function setSctpSettings(settings: SctpSettings): void {\n nodeDataChannel.setSctpSettings(settings);\n}\nexport function getLibraryVersion(): string {\n return nodeDataChannel.getLibraryVersion();\n}\n\nexport interface Audio {\n addAudioCodec(payloadType: number, codec: string, profile?: string): void;\n addOpusCodec(payloadType: number, profile?: string): string;\n direction(): Direction;\n generateSdp(eol: string, addr: string, port: number): string;\n mid(): string;\n setDirection(dir: Direction): void;\n description(): string;\n removeFormat(fmt: string): void;\n addSSRC(ssrc: number, name?: string, msid?: string, trackID?: string): void;\n removeSSRC(ssrc: number): void;\n replaceSSRC(oldSsrc: number, ssrc: number, name?: string, msid?: string, trackID?: string): void;\n hasSSRC(ssrc: number): boolean;\n getSSRCs(): number[];\n getCNameForSsrc(ssrc: number): string;\n setBitrate(bitRate: number): void;\n getBitrate(): number;\n hasPayloadType(payloadType: number): boolean;\n addRTXCodec(payloadType: number, originalPayloadType: number, clockRate: number): void;\n addRTPMap(): void;\n parseSdpLine(line: string): void;\n}\nexport const Audio: {\n new (mid: string, dir: Direction): Audio;\n} = nodeDataChannel.Audio;\n\nexport interface Video {\n addVideoCodec(payloadType: number, codec: string, profile?: string): void;\n addH264Codec(payloadType: number, profile?: string): void;\n addVP8Codec(payloadType: number): void;\n addVP9Codec(payloadType: number): void;\n direction(): Direction;\n generateSdp(eol: string, addr: string, port: number): string;\n mid(): string;\n setDirection(dir: Direction): void;\n description(): string;\n removeFormat(fmt: string): void;\n addSSRC(ssrc: number, name?: string, msid?: string, trackID?: string): void;\n removeSSRC(ssrc: number): void;\n replaceSSRC(oldSsrc: number, ssrc: number, name?: string, msid?: string, trackID?: string): void;\n hasSSRC(ssrc: number): boolean;\n getSSRCs(): number[];\n getCNameForSsrc(ssrc: number): string;\n setBitrate(bitRate: number): void;\n getBitrate(): number;\n hasPayloadType(payloadType: number): boolean;\n addRTXCodec(payloadType: number, originalPayloadType: number, clockRate: number): void;\n addRTPMap(): void;\n parseSdpLine(line: string): void;\n}\nexport const Video: {\n new (mid: string, dir: Direction): Video;\n} = nodeDataChannel.Video;\n\nexport interface Track {\n direction(): Direction;\n mid(): string;\n type(): string;\n close(): void;\n sendMessage(msg: string): boolean;\n sendMessageBinary(buffer: Buffer): boolean;\n isOpen(): boolean;\n isClosed(): boolean;\n bufferedAmount(): number;\n maxMessageSize(): number;\n requestBitrate(bitRate: number): boolean;\n setBufferedAmountLowThreshold(newSize: number): void;\n requestKeyframe(): boolean;\n setMediaHandler(handler: RtcpReceivingSession): void;\n onOpen(cb: () => void): void;\n onClosed(cb: () => void): void;\n onError(cb: (err: string) => void): void;\n onMessage(cb: (msg: Buffer) => void): void;\n}\nexport const Track: {\n new (): Track;\n} = nodeDataChannel.Track;\n\nexport interface DataChannel extends Channel {\n getLabel(): string;\n getId(): number;\n getProtocol(): string;\n\n // Channel implementation\n close(): void;\n sendMessage(msg: string): boolean;\n sendMessageBinary(buffer: Buffer | Uint8Array): boolean;\n isOpen(): boolean;\n bufferedAmount(): number;\n maxMessageSize(): number;\n setBufferedAmountLowThreshold(newSize: number): void;\n onOpen(cb: () => void): void;\n onClosed(cb: () => void): void;\n onError(cb: (err: string) => void): void;\n onBufferedAmountLow(cb: () => void): void;\n onMessage(cb: (msg: string | Buffer | ArrayBuffer) => void): void;\n}\nexport const DataChannel: {\n // DataChannel implementation\n} = nodeDataChannel.DataChannel;\n\nexport interface PeerConnection {\n close(): void;\n setLocalDescription(type?: DescriptionType, init?: LocalDescriptionInit): void;\n setRemoteDescription(sdp: string, type: DescriptionType): void;\n localDescription(): { type: DescriptionType; sdp: string } | null;\n remoteDescription(): { type: DescriptionType; sdp: string } | null;\n remoteFingerprint(): CertificateFingerprint;\n addRemoteCandidate(candidate: string, mid: string): void;\n createDataChannel(label: string, config?: DataChannelInitConfig): DataChannel;\n addTrack(media: Video | Audio): Track;\n hasMedia(): boolean;\n state(): RTCPeerConnectionState;\n iceState(): RTCIceConnectionState;\n signalingState(): RTCSignalingState;\n gatheringState(): RTCIceGatheringState;\n onLocalDescription(cb: (sdp: string, type: DescriptionType) => void): void;\n onLocalCandidate(cb: (candidate: string, mid: string) => void): void;\n onStateChange(cb: (state: string) => void): void;\n onIceStateChange(cb: (state: string) => void): void;\n onSignalingStateChange(cb: (state: string) => void): void;\n onGatheringStateChange(cb: (state: string) => void): void;\n onDataChannel(cb: (dc: DataChannel) => void): void;\n onTrack(cb: (track: Track) => void): void;\n bytesSent(): number;\n bytesReceived(): number;\n rtt(): number;\n getSelectedCandidatePair(): {\n local: SelectedCandidateInfo;\n remote: SelectedCandidateInfo;\n } | null;\n maxDataChannelId(): number;\n maxMessageSize(): number;\n}\nexport const PeerConnection: {\n new (peerName: string, config: RtcConfig): PeerConnection;\n} = nodeDataChannel.PeerConnection;\n\nexport interface IceUdpMuxListener {\n address?: string;\n port: number;\n stop(): void;\n onUnhandledStunRequest(cb: (req: IceUdpMuxRequest) => void): void;\n}\nexport const IceUdpMuxListener: {\n new (port: number, address?: string): IceUdpMuxListener;\n} = nodeDataChannel.IceUdpMuxListener;\n\nexport interface RtcpReceivingSession {}\n\nexport const RtcpReceivingSession: {\n new (): RtcpReceivingSession;\n} = nodeDataChannel.RtcpReceivingSession;\n\nexport { WebSocketServer } from './websocket-server';\nexport { WebSocket } from './websocket';\n\nexport const DataChannelStream = _DataChannelStream;\n\nexport default {\n initLogger,\n cleanup,\n preload,\n setSctpSettings,\n getLibraryVersion,\n RtcpReceivingSession,\n Track,\n Video,\n Audio,\n DataChannel,\n PeerConnection,\n WebSocket,\n WebSocketServer,\n DataChannelStream,\n IceUdpMuxListener,\n};\n\n// Types\n// https://github.com/murat-dogan/node-datachannel/issues/300\nexport * from './types';\n"],"names":["_DataChannelStream"],"mappings":";;;;;AAoBO,SAAS,OAAgB,GAAA;AAC9B,EAAA,eAAA,CAAgB,OAAQ,EAAA,CAAA;AAC1B,CAAA;AACO,SAAS,WAAW,KAAuB,EAAA;AAChD,EAAA,eAAA,CAAgB,WAAW,KAAK,CAAA,CAAA;AAClC,CAAA;AACO,SAAS,OAAgB,GAAA;AAC9B,EAAA,eAAA,CAAgB,OAAQ,EAAA,CAAA;AAC1B,CAAA;AACO,SAAS,gBAAgB,QAA8B,EAAA;AAC5D,EAAA,eAAA,CAAgB,gBAAgB,QAAQ,CAAA,CAAA;AAC1C,CAAA;AACO,SAAS,iBAA4B,GAAA;AAC1C,EAAA,OAAO,gBAAgB,iBAAkB,EAAA,CAAA;AAC3C,CAAA;AAwBO,MAAM,QAET,eAAgB,CAAA,MAAA;AA0Bb,MAAM,QAET,eAAgB,CAAA,MAAA;AAsBb,MAAM,QAET,eAAgB,CAAA,MAAA;AAqBb,MAAM,cAET,eAAgB,CAAA,YAAA;AAmCb,MAAM,iBAET,eAAgB,CAAA,eAAA;AAQb,MAAM,oBAET,eAAgB,CAAA,kBAAA;AAIb,MAAM,uBAET,eAAgB,CAAA,qBAAA;AAKb,MAAM,iBAAoB,GAAAA,oBAAA;AAEjC,QAAe;AAAA,EACb,UAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,eAAA;AAAA,EACA,iBAAA;AAAA,EACA,oBAAA;AAAA,EACA,KAAA;AAAA,EACA,KAAA;AAAA,EACA,KAAA;AAAA,EACA,WAAA;AAAA,EACA,cAAA;AAAA,EACA,SAAA;AAAA,EACA,eAAA;AAAA,EACA,iBAAA;AAAA,EACA,iBAAA;AACF,CAAA;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"Events.mjs","sources":["../../../src/polyfill/Events.ts"],"sourcesContent":["import RTCDataChannel from './RTCDataChannel';\nimport RTCError from './RTCError';\n\nexport class RTCPeerConnectionIceEvent extends Event implements globalThis.RTCPeerConnectionIceEvent {\n #candidate: globalThis.RTCIceCandidate;\n\n constructor(candidate: globalThis.RTCIceCandidate) {\n super('icecandidate');\n\n this.#candidate = candidate;\n }\n\n get candidate(): globalThis.RTCIceCandidate {\n return this.#candidate;\n }\n\n get url(): string {\n return '';\n }\n}\n\nexport class RTCDataChannelEvent extends Event implements globalThis.RTCDataChannelEvent {\n #channel: RTCDataChannel;\n\n constructor(type: string = 'datachannel', eventInitDict: globalThis.RTCDataChannelEventInit) {\n super(type);\n\n if (arguments.length === 0)\n throw new TypeError(\n `Failed to construct 'RTCDataChannelEvent': 2 arguments required, but only ${arguments.length} present.`,\n );\n if (typeof eventInitDict !== 'object')\n throw new TypeError(\n \"Failed to construct 'RTCDataChannelEvent': The provided value is not of type 'RTCDataChannelEventInit'.\",\n );\n if (!eventInitDict.channel)\n throw new TypeError(\n \"Failed to construct 'RTCDataChannelEvent': Failed to read the 'channel' property from 'RTCDataChannelEventInit': Required member is undefined.\",\n );\n if (eventInitDict.channel.constructor !== RTCDataChannel)\n throw new TypeError(\n \"Failed to construct 'RTCDataChannelEvent': Failed to read the 'channel' property from 'RTCDataChannelEventInit': Failed to convert value to 'RTCDataChannel'.\",\n );\n\n this.#channel = eventInitDict?.channel;\n }\n\n get channel(): RTCDataChannel {\n return this.#channel;\n }\n}\n\nexport class RTCErrorEvent extends Event implements globalThis.RTCErrorEvent {\n #error: RTCError;\n constructor(type: string, init: globalThis.RTCErrorEventInit) {\n if (arguments.length < 2)\n throw new TypeError(\n `Failed to construct 'RTCErrorEvent': 2 arguments required, but only ${arguments.length} present.`,\n );\n if (typeof init !== 'object')\n throw new TypeError(\n \"Failed to construct 'RTCErrorEvent': The provided value is not of type 'RTCErrorEventInit'.\",\n );\n if (!init.error)\n throw new TypeError(\n \"Failed to construct 'RTCErrorEvent': Failed to read the 'error' property from 'RTCErrorEventInit': Required member is undefined.\",\n );\n if (init.error.constructor !== RTCError)\n throw new TypeError(\n \"Failed to construct 'RTCErrorEvent': Failed to read the 'error' property from 'RTCErrorEventInit': Failed to convert value to 'RTCError'.\",\n );\n super(type || 'error');\n this.#error = init.error;\n }\n\n get error(): RTCError {\n return this.#error;\n }\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Events.mjs","sources":["../../../src/polyfill/Events.ts"],"sourcesContent":["import RTCDataChannel from './RTCDataChannel';\nimport RTCError from './RTCError';\n\nexport class RTCPeerConnectionIceEvent\n extends Event\n implements globalThis.RTCPeerConnectionIceEvent\n{\n #candidate: globalThis.RTCIceCandidate;\n\n constructor(candidate: globalThis.RTCIceCandidate) {\n super('icecandidate');\n\n this.#candidate = candidate;\n }\n\n get candidate(): globalThis.RTCIceCandidate {\n return this.#candidate;\n }\n\n get url(): string {\n return '';\n }\n}\n\nexport class RTCDataChannelEvent extends Event implements globalThis.RTCDataChannelEvent {\n #channel: RTCDataChannel;\n\n constructor(type: string = 'datachannel', eventInitDict: globalThis.RTCDataChannelEventInit) {\n super(type);\n\n if (arguments.length === 0)\n throw new TypeError(\n `Failed to construct 'RTCDataChannelEvent': 2 arguments required, but only ${arguments.length} present.`,\n );\n if (typeof eventInitDict !== 'object')\n throw new TypeError(\n \"Failed to construct 'RTCDataChannelEvent': The provided value is not of type 'RTCDataChannelEventInit'.\",\n );\n if (!eventInitDict.channel)\n throw new TypeError(\n \"Failed to construct 'RTCDataChannelEvent': Failed to read the 'channel' property from 'RTCDataChannelEventInit': Required member is undefined.\",\n );\n if (eventInitDict.channel.constructor !== RTCDataChannel)\n throw new TypeError(\n \"Failed to construct 'RTCDataChannelEvent': Failed to read the 'channel' property from 'RTCDataChannelEventInit': Failed to convert value to 'RTCDataChannel'.\",\n );\n\n this.#channel = eventInitDict?.channel;\n }\n\n get channel(): RTCDataChannel {\n return this.#channel;\n }\n}\n\nexport class RTCErrorEvent extends Event implements globalThis.RTCErrorEvent {\n #error: RTCError;\n constructor(type: string, init: globalThis.RTCErrorEventInit) {\n if (arguments.length < 2)\n throw new TypeError(\n `Failed to construct 'RTCErrorEvent': 2 arguments required, but only ${arguments.length} present.`,\n );\n if (typeof init !== 'object')\n throw new TypeError(\n \"Failed to construct 'RTCErrorEvent': The provided value is not of type 'RTCErrorEventInit'.\",\n );\n if (!init.error)\n throw new TypeError(\n \"Failed to construct 'RTCErrorEvent': Failed to read the 'error' property from 'RTCErrorEventInit': Required member is undefined.\",\n );\n if (init.error.constructor !== RTCError)\n throw new TypeError(\n \"Failed to construct 'RTCErrorEvent': Failed to read the 'error' property from 'RTCErrorEventInit': Failed to convert value to 'RTCError'.\",\n );\n super(type || 'error');\n this.#error = init.error;\n }\n\n get error(): RTCError {\n return this.#error;\n }\n}\n"],"names":[],"mappings":";;;;;;;;;;AAAA,IAAA,UAAA,EAAA,QAAA,EAAA,MAAA,CAAA;AAGO,MAAM,kCACH,KAEV,CAAA;AAAA,EAGE,YAAY,SAAuC,EAAA;AACjD,IAAA,KAAA,CAAM,cAAc,CAAA,CAAA;AAHtB,IAAA,YAAA,CAAA,IAAA,EAAA,UAAA,CAAA,CAAA;AAKE,IAAA,YAAA,CAAA,IAAA,EAAK,UAAa,EAAA,SAAA,CAAA,CAAA;AAAA,GACpB;AAAA,EAEA,IAAI,SAAwC,GAAA;AAC1C,IAAA,OAAO,YAAK,CAAA,IAAA,EAAA,UAAA,CAAA,CAAA;AAAA,GACd;AAAA,EAEA,IAAI,GAAc,GAAA;AAChB,IAAO,OAAA,EAAA,CAAA;AAAA,GACT;AACF,CAAA;AAfE,UAAA,GAAA,IAAA,OAAA,EAAA,CAAA;AAiBK,MAAM,4BAA4B,KAAgD,CAAA;AAAA,EAGvF,WAAA,CAAY,IAAe,GAAA,aAAA,EAAe,aAAmD,EAAA;AAC3F,IAAA,KAAA,CAAM,IAAI,CAAA,CAAA;AAHZ,IAAA,YAAA,CAAA,IAAA,EAAA,QAAA,CAAA,CAAA;AAKE,IAAA,IAAI,UAAU,MAAW,KAAA,CAAA;AACvB,MAAA,MAAM,IAAI,SAAA;AAAA,QACR,CAAA,0EAAA,EAA6E,UAAU,MAAM,CAAA,SAAA,CAAA;AAAA,OAC/F,CAAA;AACF,IAAA,IAAI,OAAO,aAAkB,KAAA,QAAA;AAC3B,MAAA,MAAM,IAAI,SAAA;AAAA,QACR,yGAAA;AAAA,OACF,CAAA;AACF,IAAA,IAAI,CAAC,aAAc,CAAA,OAAA;AACjB,MAAA,MAAM,IAAI,SAAA;AAAA,QACR,gJAAA;AAAA,OACF,CAAA;AACF,IAAI,IAAA,aAAA,CAAc,QAAQ,WAAgB,KAAA,cAAA;AACxC,MAAA,MAAM,IAAI,SAAA;AAAA,QACR,+JAAA;AAAA,OACF,CAAA;AAEF,IAAA,YAAA,CAAA,IAAA,EAAK,UAAW,aAAe,EAAA,OAAA,CAAA,CAAA;AAAA,GACjC;AAAA,EAEA,IAAI,OAA0B,GAAA;AAC5B,IAAA,OAAO,YAAK,CAAA,IAAA,EAAA,QAAA,CAAA,CAAA;AAAA,GACd;AACF,CAAA;AA5BE,QAAA,GAAA,IAAA,OAAA,EAAA,CAAA;AA8BK,MAAM,sBAAsB,KAA0C,CAAA;AAAA,EAE3E,WAAA,CAAY,MAAc,IAAoC,EAAA;AAC5D,IAAA,IAAI,UAAU,MAAS,GAAA,CAAA;AACrB,MAAA,MAAM,IAAI,SAAA;AAAA,QACR,CAAA,oEAAA,EAAuE,UAAU,MAAM,CAAA,SAAA,CAAA;AAAA,OACzF,CAAA;AACF,IAAA,IAAI,OAAO,IAAS,KAAA,QAAA;AAClB,MAAA,MAAM,IAAI,SAAA;AAAA,QACR,6FAAA;AAAA,OACF,CAAA;AACF,IAAA,IAAI,CAAC,IAAK,CAAA,KAAA;AACR,MAAA,MAAM,IAAI,SAAA;AAAA,QACR,kIAAA;AAAA,OACF,CAAA;AACF,IAAI,IAAA,IAAA,CAAK,MAAM,WAAgB,KAAA,QAAA;AAC7B,MAAA,MAAM,IAAI,SAAA;AAAA,QACR,2IAAA;AAAA,OACF,CAAA;AACF,IAAA,KAAA,CAAM,QAAQ,OAAO,CAAA,CAAA;AAlBvB,IAAA,YAAA,CAAA,IAAA,EAAA,MAAA,CAAA,CAAA;AAmBE,IAAA,YAAA,CAAA,IAAA,EAAK,QAAS,IAAK,CAAA,KAAA,CAAA,CAAA;AAAA,GACrB;AAAA,EAEA,IAAI,KAAkB,GAAA;AACpB,IAAA,OAAO,YAAK,CAAA,IAAA,EAAA,MAAA,CAAA,CAAA;AAAA,GACd;AACF,CAAA;AAzBE,MAAA,GAAA,IAAA,OAAA,EAAA;;;;"}
@@ -35,7 +35,7 @@ class RTCDataChannel extends EventTarget {
35
35
  __publicField(this, "onmessage", null);
36
36
  __publicField(this, "onopen", null);
37
37
  __privateSet(this, _dataChannel, dataChannel);
38
- __privateSet(this, _binaryType, "blob");
38
+ __privateSet(this, _binaryType, "arraybuffer");
39
39
  __privateSet(this, _readyState, __privateGet(this, _dataChannel).isOpen() ? "open" : "connecting");
40
40
  __privateSet(this, _bufferedAmountLowThreshold, 0);
41
41
  __privateSet(this, _maxPacketLifeTime, opts.maxPacketLifeTime ?? null);
@@ -74,10 +74,23 @@ class RTCDataChannel extends EventTarget {
74
74
  __privateGet(this, _dataChannel).onBufferedAmountLow(() => {
75
75
  this.dispatchEvent(new Event("bufferedamountlow"));
76
76
  });
77
- __privateGet(this, _dataChannel).onMessage((data) => {
78
- if (ArrayBuffer.isView(data)) {
79
- if (this.binaryType == "arraybuffer") data = data.buffer;
80
- else data = Buffer.from(data.buffer);
77
+ __privateGet(this, _dataChannel).onMessage((message) => {
78
+ if (typeof message === "string") {
79
+ this.dispatchEvent(new MessageEvent("message", { data: message }));
80
+ return;
81
+ }
82
+ let data;
83
+ if (message instanceof ArrayBuffer) {
84
+ data = message;
85
+ } else {
86
+ data = message.buffer;
87
+ if (message.byteOffset !== 0 || message.byteLength !== message.buffer.byteLength) {
88
+ data = new ArrayBuffer(message.byteLength);
89
+ new Uint8Array(data, 0, message.byteLength).set(message);
90
+ }
91
+ }
92
+ if (__privateGet(this, _binaryType) === "blob") {
93
+ data = new Blob([data]);
81
94
  }
82
95
  this.dispatchEvent(new MessageEvent("message", { data }));
83
96
  });
@@ -1 +1 @@
1
- {"version":3,"file":"RTCDataChannel.mjs","sources":["../../../src/polyfill/RTCDataChannel.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport * as exceptions from './Exception';\nimport { DataChannel } from '../lib/index';\nimport { RTCErrorEvent } from './Events';\n\nexport default class RTCDataChannel extends EventTarget implements globalThis.RTCDataChannel {\n #dataChannel: DataChannel;\n #readyState: globalThis.RTCDataChannelState;\n #bufferedAmountLowThreshold: number;\n #binaryType: BinaryType;\n #maxPacketLifeTime: number | null;\n #maxRetransmits: number | null;\n #negotiated: boolean;\n #ordered: boolean;\n #id: number;\n #label: string;\n #protocol: string;\n\n #closeRequested = false;\n\n // events\n onbufferedamountlow: globalThis.RTCDataChannel['onbufferedamountlow'] = null;\n onclose: globalThis.RTCDataChannel['onclose'] = null;\n onclosing: globalThis.RTCDataChannel['onclosing'] = null;\n onerror: globalThis.RTCDataChannel['onerror'] = null;\n onmessage: globalThis.RTCDataChannel['onmessage'] = null;\n onopen: globalThis.RTCDataChannel['onopen'] = null;\n\n constructor(dataChannel: DataChannel, opts: globalThis.RTCDataChannelInit = {}) {\n super();\n\n this.#dataChannel = dataChannel;\n this.#binaryType = 'blob';\n this.#readyState = this.#dataChannel.isOpen() ? 'open' : 'connecting';\n this.#bufferedAmountLowThreshold = 0;\n this.#maxPacketLifeTime = opts.maxPacketLifeTime ?? null;\n this.#maxRetransmits = opts.maxRetransmits ?? null;\n this.#negotiated = opts.negotiated ?? false;\n this.#ordered = opts.ordered ?? true;\n this.#id = this.#dataChannel.getId();\n this.#label = this.#dataChannel.getLabel();\n this.#protocol = this.#dataChannel.getProtocol();\n\n // forward dataChannel events\n this.#dataChannel.onOpen(() => {\n this.#readyState = 'open';\n this.dispatchEvent(new Event('open', {}));\n });\n\n this.#dataChannel.onClosed(() => {\n // Simulate closing event\n if (!this.#closeRequested) {\n this.#readyState = 'closing';\n this.dispatchEvent(new Event('closing'));\n }\n\n setImmediate(() => {\n this.#readyState = 'closed';\n this.dispatchEvent(new Event('close'));\n });\n });\n\n this.#dataChannel.onError((msg) => {\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\n this.#dataChannel.onBufferedAmountLow(() => {\n this.dispatchEvent(new Event('bufferedamountlow'));\n });\n\n this.#dataChannel.onMessage((data) => {\n if (ArrayBuffer.isView(data)) {\n if (this.binaryType == 'arraybuffer') data = data.buffer;\n else data = Buffer.from(data.buffer);\n }\n\n this.dispatchEvent(new MessageEvent('message', { data }));\n });\n\n // forward events to properties\n this.addEventListener('message', (e) => {\n if (this.onmessage) this.onmessage(e as MessageEvent);\n });\n this.addEventListener('bufferedamountlow', (e) => {\n if (this.onbufferedamountlow) this.onbufferedamountlow(e);\n });\n this.addEventListener('error', (e) => {\n if (this.onerror) this.onerror(e as RTCErrorEvent);\n });\n this.addEventListener('close', (e) => {\n if (this.onclose) this.onclose(e);\n });\n this.addEventListener('closing', (e) => {\n if (this.onclosing) this.onclosing(e);\n });\n this.addEventListener('open', (e) => {\n if (this.onopen) this.onopen(e);\n });\n }\n\n set binaryType(type) {\n if (type !== 'blob' && type !== 'arraybuffer') {\n throw new DOMException(\n \"Failed to set the 'binaryType' property on 'RTCDataChannel': Unknown binary type : \" +\n type,\n 'TypeMismatchError',\n );\n }\n this.#binaryType = type;\n }\n\n get binaryType(): BinaryType {\n return this.#binaryType;\n }\n\n get bufferedAmount(): number {\n return this.#dataChannel.bufferedAmount();\n }\n\n get bufferedAmountLowThreshold(): number {\n return this.#bufferedAmountLowThreshold;\n }\n\n set bufferedAmountLowThreshold(value) {\n const number = Number(value) || 0;\n this.#bufferedAmountLowThreshold = number;\n this.#dataChannel.setBufferedAmountLowThreshold(number);\n }\n\n get id(): number | null {\n return this.#id;\n }\n\n get label(): string {\n return this.#label;\n }\n\n get maxPacketLifeTime(): number | null {\n return this.#maxPacketLifeTime;\n }\n\n get maxRetransmits(): number | null {\n return this.#maxRetransmits;\n }\n\n get negotiated(): boolean {\n return this.#negotiated;\n }\n\n get ordered(): boolean {\n return this.#ordered;\n }\n\n get protocol(): string {\n return this.#protocol;\n }\n\n get readyState(): globalThis.RTCDataChannelState {\n return this.#readyState;\n }\n\n send(data): void {\n if (this.#readyState !== 'open') {\n throw new exceptions.InvalidStateError(\n \"Failed to execute 'send' on 'RTCDataChannel': RTCDataChannel.readyState is not 'open'\",\n );\n }\n\n // Needs network error, type error implemented\n if (typeof data === 'string') {\n this.#dataChannel.sendMessage(data);\n } else if (data instanceof Blob) {\n data.arrayBuffer().then((ab) => {\n if (process?.versions?.bun) {\n this.#dataChannel.sendMessageBinary(Buffer.from(ab));\n } else {\n this.#dataChannel.sendMessageBinary(new Uint8Array(ab));\n }\n });\n } else if (data instanceof Uint8Array) {\n this.#dataChannel.sendMessageBinary(data);\n } else {\n if (process?.versions?.bun) {\n this.#dataChannel.sendMessageBinary(Buffer.from(data));\n } else {\n this.#dataChannel.sendMessageBinary(new Uint8Array(data));\n }\n }\n }\n\n close(): void {\n this.#closeRequested = true;\n setImmediate(() => {\n this.#dataChannel.close();\n });\n }\n}\n"],"names":["exceptions.InvalidStateError"],"mappings":"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"}
1
+ {"version":3,"file":"RTCDataChannel.mjs","sources":["../../../src/polyfill/RTCDataChannel.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport * as exceptions from './Exception';\nimport { DataChannel } from '../lib/index';\nimport { RTCErrorEvent } from './Events';\n\nexport default class RTCDataChannel extends EventTarget implements globalThis.RTCDataChannel {\n #dataChannel: DataChannel;\n #readyState: globalThis.RTCDataChannelState;\n #bufferedAmountLowThreshold: number;\n #binaryType: BinaryType;\n #maxPacketLifeTime: number | null;\n #maxRetransmits: number | null;\n #negotiated: boolean;\n #ordered: boolean;\n #id: number;\n #label: string;\n #protocol: string;\n\n #closeRequested = false;\n\n // events\n onbufferedamountlow: globalThis.RTCDataChannel['onbufferedamountlow'] = null;\n onclose: globalThis.RTCDataChannel['onclose'] = null;\n onclosing: globalThis.RTCDataChannel['onclosing'] = null;\n onerror: globalThis.RTCDataChannel['onerror'] = null;\n onmessage: globalThis.RTCDataChannel['onmessage'] = null;\n onopen: globalThis.RTCDataChannel['onopen'] = null;\n\n constructor(dataChannel: DataChannel, opts: globalThis.RTCDataChannelInit = {}) {\n super();\n\n this.#dataChannel = dataChannel;\n this.#binaryType = 'arraybuffer';\n this.#readyState = this.#dataChannel.isOpen() ? 'open' : 'connecting';\n this.#bufferedAmountLowThreshold = 0;\n this.#maxPacketLifeTime = opts.maxPacketLifeTime ?? null;\n this.#maxRetransmits = opts.maxRetransmits ?? null;\n this.#negotiated = opts.negotiated ?? false;\n this.#ordered = opts.ordered ?? true;\n this.#id = this.#dataChannel.getId();\n this.#label = this.#dataChannel.getLabel();\n this.#protocol = this.#dataChannel.getProtocol();\n\n // forward dataChannel events\n this.#dataChannel.onOpen(() => {\n this.#readyState = 'open';\n this.dispatchEvent(new Event('open', {}));\n });\n\n this.#dataChannel.onClosed(() => {\n // Simulate closing event\n if (!this.#closeRequested) {\n this.#readyState = 'closing';\n this.dispatchEvent(new Event('closing'));\n }\n\n setImmediate(() => {\n this.#readyState = 'closed';\n this.dispatchEvent(new Event('close'));\n });\n });\n\n this.#dataChannel.onError((msg) => {\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\n this.#dataChannel.onBufferedAmountLow(() => {\n this.dispatchEvent(new Event('bufferedamountlow'));\n });\n\n this.#dataChannel.onMessage((message) => {\n if (typeof message === 'string') {\n this.dispatchEvent(new MessageEvent('message', { data: message }));\n return;\n }\n\n let data: Blob | ArrayBuffer;\n\n if (message instanceof ArrayBuffer) {\n data = message;\n } else {\n data = message.buffer;\n\n if (message.byteOffset !== 0 || message.byteLength !== message.buffer.byteLength) {\n // message is view on underlying buffer, must create new\n // ArrayBuffer that only contains message data\n data = new ArrayBuffer(message.byteLength);\n new Uint8Array(data, 0, message.byteLength).set(message);\n }\n }\n\n if (this.#binaryType === 'blob') {\n data = new Blob([data]);\n }\n\n this.dispatchEvent(new MessageEvent('message', { data }));\n });\n\n // forward events to properties\n this.addEventListener('message', (e) => {\n if (this.onmessage) this.onmessage(e as MessageEvent);\n });\n this.addEventListener('bufferedamountlow', (e) => {\n if (this.onbufferedamountlow) this.onbufferedamountlow(e);\n });\n this.addEventListener('error', (e) => {\n if (this.onerror) this.onerror(e as RTCErrorEvent);\n });\n this.addEventListener('close', (e) => {\n if (this.onclose) this.onclose(e);\n });\n this.addEventListener('closing', (e) => {\n if (this.onclosing) this.onclosing(e);\n });\n this.addEventListener('open', (e) => {\n if (this.onopen) this.onopen(e);\n });\n }\n\n set binaryType(type) {\n if (type !== 'blob' && type !== 'arraybuffer') {\n throw new DOMException(\n \"Failed to set the 'binaryType' property on 'RTCDataChannel': Unknown binary type : \" +\n type,\n 'TypeMismatchError',\n );\n }\n this.#binaryType = type;\n }\n\n get binaryType(): BinaryType {\n return this.#binaryType;\n }\n\n get bufferedAmount(): number {\n return this.#dataChannel.bufferedAmount();\n }\n\n get bufferedAmountLowThreshold(): number {\n return this.#bufferedAmountLowThreshold;\n }\n\n set bufferedAmountLowThreshold(value) {\n const number = Number(value) || 0;\n this.#bufferedAmountLowThreshold = number;\n this.#dataChannel.setBufferedAmountLowThreshold(number);\n }\n\n get id(): number | null {\n return this.#id;\n }\n\n get label(): string {\n return this.#label;\n }\n\n get maxPacketLifeTime(): number | null {\n return this.#maxPacketLifeTime;\n }\n\n get maxRetransmits(): number | null {\n return this.#maxRetransmits;\n }\n\n get negotiated(): boolean {\n return this.#negotiated;\n }\n\n get ordered(): boolean {\n return this.#ordered;\n }\n\n get protocol(): string {\n return this.#protocol;\n }\n\n get readyState(): globalThis.RTCDataChannelState {\n return this.#readyState;\n }\n\n send(data): void {\n if (this.#readyState !== 'open') {\n throw new exceptions.InvalidStateError(\n \"Failed to execute 'send' on 'RTCDataChannel': RTCDataChannel.readyState is not 'open'\",\n );\n }\n\n // Needs network error, type error implemented\n if (typeof data === 'string') {\n this.#dataChannel.sendMessage(data);\n } else if (data instanceof Blob) {\n data.arrayBuffer().then((ab) => {\n if (process?.versions?.bun) {\n this.#dataChannel.sendMessageBinary(Buffer.from(ab));\n } else {\n this.#dataChannel.sendMessageBinary(new Uint8Array(ab));\n }\n });\n } else if (data instanceof Uint8Array) {\n this.#dataChannel.sendMessageBinary(data);\n } else {\n if (process?.versions?.bun) {\n this.#dataChannel.sendMessageBinary(Buffer.from(data));\n } else {\n this.#dataChannel.sendMessageBinary(new Uint8Array(data));\n }\n }\n }\n\n close(): void {\n this.#closeRequested = true;\n setImmediate(() => {\n this.#dataChannel.close();\n });\n }\n}\n"],"names":["exceptions.InvalidStateError"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"RTCDtlsTransport.mjs","sources":["../../../src/polyfill/RTCDtlsTransport.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport RTCIceTransport from './RTCIceTransport';\nimport RTCPeerConnection from './RTCPeerConnection';\n\nexport default class RTCDtlsTransport extends EventTarget implements globalThis.RTCDtlsTransport {\n #pc: RTCPeerConnection = null;\n #iceTransport = null;\n\n onstatechange: globalThis.RTCDtlsTransport['onstatechange'] = null;\n onerror: globalThis.RTCDtlsTransport['onstatechange'] = null;\n\n constructor(init: { pc: RTCPeerConnection }) {\n super();\n this.#pc = init.pc;\n\n this.#iceTransport = new RTCIceTransport({\n pc: init.pc\n });\n\n // forward peerConnection events\n this.#pc.addEventListener('connectionstatechange', () => {\n const e = new Event('statechange');\n this.dispatchEvent(e);\n this.onstatechange?.(e);\n });\n }\n\n get iceTransport(): globalThis.RTCIceTransport {\n return this.#iceTransport;\n }\n\n get state(): globalThis.RTCDtlsTransportState {\n // reduce state from new, connecting, connected, disconnected, failed, closed, unknown\n // to RTCDtlsTRansport states new, connecting, connected, closed, failed\n let state = this.#pc ? this.#pc.connectionState : 'new';\n if (state === 'disconnected') {\n state = 'closed';\n }\n return state;\n }\n\n getRemoteCertificates(): ArrayBuffer[] {\n // TODO: implement\n return [new ArrayBuffer(0)];\n }\n}\n"],"names":[],"mappings":";;;;;;;;;;;;AAAA,IAAA,GAAA,EAAA,aAAA,CAAA;AAIA,MAAqB,yBAAyB,WAAmD,CAAA;AAAA,EAO/F,YAAY,IAAiC,EAAA;AAC3C,IAAM,KAAA,EAAA,CAAA;AAPR,IAAyB,YAAA,CAAA,IAAA,EAAA,GAAA,EAAA,IAAA,CAAA,CAAA;AACzB,IAAgB,YAAA,CAAA,IAAA,EAAA,aAAA,EAAA,IAAA,CAAA,CAAA;AAEhB,IAA8D,aAAA,CAAA,IAAA,EAAA,eAAA,EAAA,IAAA,CAAA,CAAA;AAC9D,IAAwD,aAAA,CAAA,IAAA,EAAA,SAAA,EAAA,IAAA,CAAA,CAAA;AAItD,IAAA,YAAA,CAAA,IAAA,EAAK,KAAM,IAAK,CAAA,EAAA,CAAA,CAAA;AAEhB,IAAK,YAAA,CAAA,IAAA,EAAA,aAAA,EAAgB,IAAI,eAAgB,CAAA;AAAA,MACvC,IAAI,IAAK,CAAA,EAAA;AAAA,KACV,CAAA,CAAA,CAAA;AAGD,IAAK,YAAA,CAAA,IAAA,EAAA,GAAA,CAAA,CAAI,gBAAiB,CAAA,uBAAA,EAAyB,MAAM;AACvD,MAAM,MAAA,CAAA,GAAI,IAAI,KAAA,CAAM,aAAa,CAAA,CAAA;AACjC,MAAA,IAAA,CAAK,cAAc,CAAC,CAAA,CAAA;AACpB,MAAA,IAAA,CAAK,gBAAgB,CAAC,CAAA,CAAA;AAAA,KACvB,CAAA,CAAA;AAAA,GACH;AAAA,EAEA,IAAI,YAA2C,GAAA;AAC7C,IAAA,OAAO,YAAK,CAAA,IAAA,EAAA,aAAA,CAAA,CAAA;AAAA,GACd;AAAA,EAEA,IAAI,KAA0C,GAAA;AAG5C,IAAA,IAAI,KAAQ,GAAA,YAAA,CAAA,IAAA,EAAK,GAAM,CAAA,GAAA,YAAA,CAAA,IAAA,EAAK,KAAI,eAAkB,GAAA,KAAA,CAAA;AAClD,IAAA,IAAI,UAAU,cAAgB,EAAA;AAC5B,MAAQ,KAAA,GAAA,QAAA,CAAA;AAAA,KACV;AACA,IAAO,OAAA,KAAA,CAAA;AAAA,GACT;AAAA,EAEA,qBAAuC,GAAA;AAErC,IAAA,OAAO,CAAC,IAAI,WAAY,CAAA,CAAC,CAAC,CAAA,CAAA;AAAA,GAC5B;AACF,CAAA;AAxCE,GAAA,GAAA,IAAA,OAAA,EAAA,CAAA;AACA,aAAA,GAAA,IAAA,OAAA,EAAA;;;;"}
1
+ {"version":3,"file":"RTCDtlsTransport.mjs","sources":["../../../src/polyfill/RTCDtlsTransport.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport RTCIceTransport from './RTCIceTransport';\nimport RTCPeerConnection from './RTCPeerConnection';\n\nexport default class RTCDtlsTransport extends EventTarget implements globalThis.RTCDtlsTransport {\n #pc: RTCPeerConnection = null;\n #iceTransport = null;\n\n onstatechange: globalThis.RTCDtlsTransport['onstatechange'] = null;\n onerror: globalThis.RTCDtlsTransport['onstatechange'] = null;\n\n constructor(init: { pc: RTCPeerConnection }) {\n super();\n this.#pc = init.pc;\n\n this.#iceTransport = new RTCIceTransport({\n pc: init.pc,\n });\n\n // forward peerConnection events\n this.#pc.addEventListener('connectionstatechange', () => {\n const e = new Event('statechange');\n this.dispatchEvent(e);\n this.onstatechange?.(e);\n });\n }\n\n get iceTransport(): globalThis.RTCIceTransport {\n return this.#iceTransport;\n }\n\n get state(): globalThis.RTCDtlsTransportState {\n // reduce state from new, connecting, connected, disconnected, failed, closed, unknown\n // to RTCDtlsTRansport states new, connecting, connected, closed, failed\n let state = this.#pc ? this.#pc.connectionState : 'new';\n if (state === 'disconnected') {\n state = 'closed';\n }\n return state;\n }\n\n getRemoteCertificates(): ArrayBuffer[] {\n // TODO: implement\n return [new ArrayBuffer(0)];\n }\n}\n"],"names":[],"mappings":";;;;;;;;;;;;AAAA,IAAA,GAAA,EAAA,aAAA,CAAA;AAIA,MAAqB,yBAAyB,WAAmD,CAAA;AAAA,EAO/F,YAAY,IAAiC,EAAA;AAC3C,IAAM,KAAA,EAAA,CAAA;AAPR,IAAyB,YAAA,CAAA,IAAA,EAAA,GAAA,EAAA,IAAA,CAAA,CAAA;AACzB,IAAgB,YAAA,CAAA,IAAA,EAAA,aAAA,EAAA,IAAA,CAAA,CAAA;AAEhB,IAA8D,aAAA,CAAA,IAAA,EAAA,eAAA,EAAA,IAAA,CAAA,CAAA;AAC9D,IAAwD,aAAA,CAAA,IAAA,EAAA,SAAA,EAAA,IAAA,CAAA,CAAA;AAItD,IAAA,YAAA,CAAA,IAAA,EAAK,KAAM,IAAK,CAAA,EAAA,CAAA,CAAA;AAEhB,IAAK,YAAA,CAAA,IAAA,EAAA,aAAA,EAAgB,IAAI,eAAgB,CAAA;AAAA,MACvC,IAAI,IAAK,CAAA,EAAA;AAAA,KACV,CAAA,CAAA,CAAA;AAGD,IAAK,YAAA,CAAA,IAAA,EAAA,GAAA,CAAA,CAAI,gBAAiB,CAAA,uBAAA,EAAyB,MAAM;AACvD,MAAM,MAAA,CAAA,GAAI,IAAI,KAAA,CAAM,aAAa,CAAA,CAAA;AACjC,MAAA,IAAA,CAAK,cAAc,CAAC,CAAA,CAAA;AACpB,MAAA,IAAA,CAAK,gBAAgB,CAAC,CAAA,CAAA;AAAA,KACvB,CAAA,CAAA;AAAA,GACH;AAAA,EAEA,IAAI,YAA2C,GAAA;AAC7C,IAAA,OAAO,YAAK,CAAA,IAAA,EAAA,aAAA,CAAA,CAAA;AAAA,GACd;AAAA,EAEA,IAAI,KAA0C,GAAA;AAG5C,IAAA,IAAI,KAAQ,GAAA,YAAA,CAAA,IAAA,EAAK,GAAM,CAAA,GAAA,YAAA,CAAA,IAAA,EAAK,KAAI,eAAkB,GAAA,KAAA,CAAA;AAClD,IAAA,IAAI,UAAU,cAAgB,EAAA;AAC5B,MAAQ,KAAA,GAAA,QAAA,CAAA;AAAA,KACV;AACA,IAAO,OAAA,KAAA,CAAA;AAAA,GACT;AAAA,EAEA,qBAAuC,GAAA;AAErC,IAAA,OAAO,CAAC,IAAI,WAAY,CAAA,CAAC,CAAC,CAAA,CAAA;AAAA,GAC5B;AACF,CAAA;AAxCE,GAAA,GAAA,IAAA,OAAA,EAAA,CAAA;AACA,aAAA,GAAA,IAAA,OAAA,EAAA;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"RTCSctpTransport.mjs","sources":["../../../src/polyfill/RTCSctpTransport.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport RTCDtlsTransport from './RTCDtlsTransport';\nimport RTCPeerConnection from './RTCPeerConnection';\n\nexport default class RTCSctpTransport extends EventTarget implements globalThis.RTCSctpTransport {\n #pc: RTCPeerConnection = null;\n #transport: globalThis.RTCDtlsTransport = null;\n\n onstatechange: globalThis.RTCSctpTransport['onstatechange'] = null;\n\n constructor(initial: { pc: RTCPeerConnection }) {\n super();\n this.#pc = initial.pc;\n\n this.#transport = new RTCDtlsTransport({\n pc: initial.pc\n });\n\n this.#pc.addEventListener('connectionstatechange', () => {\n const e = new Event('statechange');\n this.dispatchEvent(e);\n this.onstatechange?.(e);\n });\n }\n\n get maxChannels(): number | null {\n if (this.state !== 'connected') return null;\n return this.#pc.ext_maxDataChannelId;\n }\n\n get maxMessageSize(): number {\n if (this.state !== 'connected') return null;\n return this.#pc?.ext_maxMessageSize ?? 65536;;\n }\n\n get state(): globalThis.RTCSctpTransportState {\n // reduce state from new, connecting, connected, disconnected, failed, closed, unknown\n // to RTCSctpTransport states connecting, connected, closed\n let state = this.#pc.connectionState;\n if (state === 'new' || state === 'connecting') {\n state = 'connecting';\n } else if (state === 'disconnected' || state === 'failed' || state === 'closed') {\n state = 'closed';\n }\n return state;\n }\n\n get transport(): globalThis.RTCDtlsTransport {\n return this.#transport;\n }\n}\n"],"names":[],"mappings":";;;;;;;;;;;;AAAA,IAAA,GAAA,EAAA,UAAA,CAAA;AAIA,MAAqB,yBAAyB,WAAmD,CAAA;AAAA,EAM/F,YAAY,OAAoC,EAAA;AAC9C,IAAM,KAAA,EAAA,CAAA;AANR,IAAyB,YAAA,CAAA,IAAA,EAAA,GAAA,EAAA,IAAA,CAAA,CAAA;AACzB,IAA0C,YAAA,CAAA,IAAA,EAAA,UAAA,EAAA,IAAA,CAAA,CAAA;AAE1C,IAA8D,aAAA,CAAA,IAAA,EAAA,eAAA,EAAA,IAAA,CAAA,CAAA;AAI5D,IAAA,YAAA,CAAA,IAAA,EAAK,KAAM,OAAQ,CAAA,EAAA,CAAA,CAAA;AAEnB,IAAK,YAAA,CAAA,IAAA,EAAA,UAAA,EAAa,IAAI,gBAAiB,CAAA;AAAA,MACrC,IAAI,OAAQ,CAAA,EAAA;AAAA,KACb,CAAA,CAAA,CAAA;AAED,IAAK,YAAA,CAAA,IAAA,EAAA,GAAA,CAAA,CAAI,gBAAiB,CAAA,uBAAA,EAAyB,MAAM;AACvD,MAAM,MAAA,CAAA,GAAI,IAAI,KAAA,CAAM,aAAa,CAAA,CAAA;AACjC,MAAA,IAAA,CAAK,cAAc,CAAC,CAAA,CAAA;AACpB,MAAA,IAAA,CAAK,gBAAgB,CAAC,CAAA,CAAA;AAAA,KACvB,CAAA,CAAA;AAAA,GACH;AAAA,EAEA,IAAI,WAA6B,GAAA;AAC/B,IAAI,IAAA,IAAA,CAAK,KAAU,KAAA,WAAA,EAAoB,OAAA,IAAA,CAAA;AACvC,IAAA,OAAO,mBAAK,GAAI,CAAA,CAAA,oBAAA,CAAA;AAAA,GAClB;AAAA,EAEA,IAAI,cAAyB,GAAA;AAC3B,IAAI,IAAA,IAAA,CAAK,KAAU,KAAA,WAAA,EAAoB,OAAA,IAAA,CAAA;AACvC,IAAO,OAAA,YAAA,CAAA,IAAA,EAAK,MAAK,kBAAsB,IAAA,KAAA,CAAA;AAAM,GAC/C;AAAA,EAEA,IAAI,KAA0C,GAAA;AAG5C,IAAI,IAAA,KAAA,GAAQ,mBAAK,GAAI,CAAA,CAAA,eAAA,CAAA;AACrB,IAAI,IAAA,KAAA,KAAU,KAAS,IAAA,KAAA,KAAU,YAAc,EAAA;AAC7C,MAAQ,KAAA,GAAA,YAAA,CAAA;AAAA,eACC,KAAU,KAAA,cAAA,IAAkB,KAAU,KAAA,QAAA,IAAY,UAAU,QAAU,EAAA;AAC/E,MAAQ,KAAA,GAAA,QAAA,CAAA;AAAA,KACV;AACA,IAAO,OAAA,KAAA,CAAA;AAAA,GACT;AAAA,EAEA,IAAI,SAAyC,GAAA;AAC3C,IAAA,OAAO,YAAK,CAAA,IAAA,EAAA,UAAA,CAAA,CAAA;AAAA,GACd;AACF,CAAA;AA7CE,GAAA,GAAA,IAAA,OAAA,EAAA,CAAA;AACA,UAAA,GAAA,IAAA,OAAA,EAAA;;;;"}
1
+ {"version":3,"file":"RTCSctpTransport.mjs","sources":["../../../src/polyfill/RTCSctpTransport.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport RTCDtlsTransport from './RTCDtlsTransport';\nimport RTCPeerConnection from './RTCPeerConnection';\n\nexport default class RTCSctpTransport extends EventTarget implements globalThis.RTCSctpTransport {\n #pc: RTCPeerConnection = null;\n #transport: globalThis.RTCDtlsTransport = null;\n\n onstatechange: globalThis.RTCSctpTransport['onstatechange'] = null;\n\n constructor(initial: { pc: RTCPeerConnection }) {\n super();\n this.#pc = initial.pc;\n\n this.#transport = new RTCDtlsTransport({\n pc: initial.pc,\n });\n\n this.#pc.addEventListener('connectionstatechange', () => {\n const e = new Event('statechange');\n this.dispatchEvent(e);\n this.onstatechange?.(e);\n });\n }\n\n get maxChannels(): number | null {\n if (this.state !== 'connected') return null;\n return this.#pc.ext_maxDataChannelId;\n }\n\n get maxMessageSize(): number {\n if (this.state !== 'connected') return null;\n return this.#pc?.ext_maxMessageSize ?? 65536;\n }\n\n get state(): globalThis.RTCSctpTransportState {\n // reduce state from new, connecting, connected, disconnected, failed, closed, unknown\n // to RTCSctpTransport states connecting, connected, closed\n let state = this.#pc.connectionState;\n if (state === 'new' || state === 'connecting') {\n state = 'connecting';\n } else if (state === 'disconnected' || state === 'failed' || state === 'closed') {\n state = 'closed';\n }\n return state;\n }\n\n get transport(): globalThis.RTCDtlsTransport {\n return this.#transport;\n }\n}\n"],"names":[],"mappings":";;;;;;;;;;;;AAAA,IAAA,GAAA,EAAA,UAAA,CAAA;AAIA,MAAqB,yBAAyB,WAAmD,CAAA;AAAA,EAM/F,YAAY,OAAoC,EAAA;AAC9C,IAAM,KAAA,EAAA,CAAA;AANR,IAAyB,YAAA,CAAA,IAAA,EAAA,GAAA,EAAA,IAAA,CAAA,CAAA;AACzB,IAA0C,YAAA,CAAA,IAAA,EAAA,UAAA,EAAA,IAAA,CAAA,CAAA;AAE1C,IAA8D,aAAA,CAAA,IAAA,EAAA,eAAA,EAAA,IAAA,CAAA,CAAA;AAI5D,IAAA,YAAA,CAAA,IAAA,EAAK,KAAM,OAAQ,CAAA,EAAA,CAAA,CAAA;AAEnB,IAAK,YAAA,CAAA,IAAA,EAAA,UAAA,EAAa,IAAI,gBAAiB,CAAA;AAAA,MACrC,IAAI,OAAQ,CAAA,EAAA;AAAA,KACb,CAAA,CAAA,CAAA;AAED,IAAK,YAAA,CAAA,IAAA,EAAA,GAAA,CAAA,CAAI,gBAAiB,CAAA,uBAAA,EAAyB,MAAM;AACvD,MAAM,MAAA,CAAA,GAAI,IAAI,KAAA,CAAM,aAAa,CAAA,CAAA;AACjC,MAAA,IAAA,CAAK,cAAc,CAAC,CAAA,CAAA;AACpB,MAAA,IAAA,CAAK,gBAAgB,CAAC,CAAA,CAAA;AAAA,KACvB,CAAA,CAAA;AAAA,GACH;AAAA,EAEA,IAAI,WAA6B,GAAA;AAC/B,IAAI,IAAA,IAAA,CAAK,KAAU,KAAA,WAAA,EAAoB,OAAA,IAAA,CAAA;AACvC,IAAA,OAAO,mBAAK,GAAI,CAAA,CAAA,oBAAA,CAAA;AAAA,GAClB;AAAA,EAEA,IAAI,cAAyB,GAAA;AAC3B,IAAI,IAAA,IAAA,CAAK,KAAU,KAAA,WAAA,EAAoB,OAAA,IAAA,CAAA;AACvC,IAAO,OAAA,YAAA,CAAA,IAAA,EAAK,MAAK,kBAAsB,IAAA,KAAA,CAAA;AAAA,GACzC;AAAA,EAEA,IAAI,KAA0C,GAAA;AAG5C,IAAI,IAAA,KAAA,GAAQ,mBAAK,GAAI,CAAA,CAAA,eAAA,CAAA;AACrB,IAAI,IAAA,KAAA,KAAU,KAAS,IAAA,KAAA,KAAU,YAAc,EAAA;AAC7C,MAAQ,KAAA,GAAA,YAAA,CAAA;AAAA,eACC,KAAU,KAAA,cAAA,IAAkB,KAAU,KAAA,QAAA,IAAY,UAAU,QAAU,EAAA;AAC/E,MAAQ,KAAA,GAAA,QAAA,CAAA;AAAA,KACV;AACA,IAAO,OAAA,KAAA,CAAA;AAAA,GACT;AAAA,EAEA,IAAI,SAAyC,GAAA;AAC3C,IAAA,OAAO,YAAK,CAAA,IAAA,EAAA,UAAA,CAAA,CAAA;AAAA,GACd;AACF,CAAA;AA7CE,GAAA,GAAA,IAAA,OAAA,EAAA,CAAA;AACA,UAAA,GAAA,IAAA,OAAA,EAAA;;;;"}
@@ -1,4 +1,4 @@
1
- import { LogLevel, SctpSettings, Direction, Channel, DescriptionType, DataChannelInitConfig, RTCPeerConnectionState, RTCIceConnectionState, RTCSignalingState, RTCIceGatheringState, SelectedCandidateInfo, RtcConfig, WebSocketServerConfiguration } from './types.js';
1
+ import { LogLevel, SctpSettings, Direction, Channel, DescriptionType, LocalDescriptionInit, CertificateFingerprint, DataChannelInitConfig, RTCPeerConnectionState, RTCIceConnectionState, RTCSignalingState, RTCIceGatheringState, SelectedCandidateInfo, RtcConfig, IceUdpMuxRequest, WebSocketServerConfiguration } from './types.js';
2
2
  export { IceServer, ProxyServer, ProxyServerType, RTCIceGathererState, RTCIceTransportState, RTCSdpType, RelayType, TransportPolicy } from './types.js';
3
3
  import DataChannelStream$1 from './datachannel-stream.js';
4
4
  import { WebSocketServer } from './websocket-server.js';
@@ -104,7 +104,7 @@ interface DataChannel extends Channel {
104
104
  declare const DataChannel: {};
105
105
  interface PeerConnection {
106
106
  close(): void;
107
- setLocalDescription(type?: DescriptionType): void;
107
+ setLocalDescription(type?: DescriptionType, init?: LocalDescriptionInit): void;
108
108
  setRemoteDescription(sdp: string, type: DescriptionType): void;
109
109
  localDescription(): {
110
110
  type: DescriptionType;
@@ -114,6 +114,7 @@ interface PeerConnection {
114
114
  type: DescriptionType;
115
115
  sdp: string;
116
116
  } | null;
117
+ remoteFingerprint(): CertificateFingerprint;
117
118
  addRemoteCandidate(candidate: string, mid: string): void;
118
119
  createDataChannel(label: string, config?: DataChannelInitConfig): DataChannel;
119
120
  addTrack(media: Video | Audio): Track;
@@ -143,6 +144,15 @@ interface PeerConnection {
143
144
  declare const PeerConnection: {
144
145
  new (peerName: string, config: RtcConfig): PeerConnection;
145
146
  };
147
+ interface IceUdpMuxListener {
148
+ address?: string;
149
+ port: number;
150
+ stop(): void;
151
+ onUnhandledStunRequest(cb: (req: IceUdpMuxRequest) => void): void;
152
+ }
153
+ declare const IceUdpMuxListener: {
154
+ new (port: number, address?: string): IceUdpMuxListener;
155
+ };
146
156
  interface RtcpReceivingSession {
147
157
  }
148
158
  declare const RtcpReceivingSession: {
@@ -165,6 +175,7 @@ declare const _default: {
165
175
  WebSocket: new (config?: WebSocketServerConfiguration) => WebSocket;
166
176
  WebSocketServer: typeof WebSocketServer;
167
177
  DataChannelStream: typeof DataChannelStream$1;
178
+ IceUdpMuxListener: new (port: number, address?: string) => IceUdpMuxListener;
168
179
  };
169
180
 
170
- export { Audio, Channel, DataChannel, DataChannelInitConfig, DataChannelStream, DescriptionType, Direction, LogLevel, PeerConnection, RTCIceConnectionState, RTCIceGatheringState, RTCPeerConnectionState, RTCSignalingState, RtcConfig, RtcpReceivingSession, SctpSettings, SelectedCandidateInfo, Track, Video, WebSocket, WebSocketServer, WebSocketServerConfiguration, cleanup, _default as default, getLibraryVersion, initLogger, preload, setSctpSettings };
181
+ export { Audio, CertificateFingerprint, Channel, DataChannel, DataChannelInitConfig, DataChannelStream, DescriptionType, Direction, IceUdpMuxListener, IceUdpMuxRequest, LocalDescriptionInit, LogLevel, PeerConnection, RTCIceConnectionState, RTCIceGatheringState, RTCPeerConnectionState, RTCSignalingState, RtcConfig, RtcpReceivingSession, SctpSettings, SelectedCandidateInfo, Track, Video, WebSocket, WebSocketServer, WebSocketServerConfiguration, cleanup, _default as default, getLibraryVersion, initLogger, preload, setSctpSettings };
@@ -62,6 +62,10 @@ interface RtcConfig {
62
62
  mtu?: number;
63
63
  iceTransportPolicy?: TransportPolicy;
64
64
  disableFingerprintVerification?: boolean;
65
+ disableAutoGathering?: boolean;
66
+ certificatePemFile?: string;
67
+ keyPemFile?: string;
68
+ keyPemPass?: string;
65
69
  }
66
70
  type DescriptionType = 'unspec' | 'offer' | 'answer' | 'pranswer' | 'rollback';
67
71
  type RTCSdpType = 'answer' | 'offer' | 'pranswer' | 'rollback';
@@ -71,6 +75,10 @@ type RTCIceConnectionState = 'checking' | 'closed' | 'completed' | 'connected' |
71
75
  type RTCIceGathererState = 'complete' | 'gathering' | 'new';
72
76
  type RTCIceGatheringState = 'complete' | 'gathering' | 'new';
73
77
  type RTCSignalingState = 'closed' | 'have-local-offer' | 'have-local-pranswer' | 'have-remote-offer' | 'have-remote-pranswer' | 'stable';
78
+ interface LocalDescriptionInit {
79
+ iceUfrag?: string;
80
+ icePwd?: string;
81
+ }
74
82
  interface DataChannelInitConfig {
75
83
  protocol?: string;
76
84
  negotiated?: boolean;
@@ -79,6 +87,16 @@ interface DataChannelInitConfig {
79
87
  maxPacketLifeTime?: number;
80
88
  maxRetransmits?: number;
81
89
  }
90
+ interface CertificateFingerprint {
91
+ /**
92
+ * @see https://developer.mozilla.org/en-US/docs/Web/API/RTCCertificate/getFingerprints#value
93
+ */
94
+ value: string;
95
+ /**
96
+ * @see https://developer.mozilla.org/en-US/docs/Web/API/RTCCertificate/getFingerprints#algorithm
97
+ */
98
+ algorithm: 'sha-1' | 'sha-224' | 'sha-256' | 'sha-384' | 'sha-512' | 'md5' | 'md2';
99
+ }
82
100
  interface SelectedCandidateInfo {
83
101
  address: string;
84
102
  port: number;
@@ -89,5 +107,10 @@ interface SelectedCandidateInfo {
89
107
  priority: number;
90
108
  }
91
109
  type Direction = 'SendOnly' | 'RecvOnly' | 'SendRecv' | 'Inactive' | 'Unknown';
110
+ interface IceUdpMuxRequest {
111
+ ufrag: string;
112
+ host: string;
113
+ port: number;
114
+ }
92
115
 
93
- export type { Channel, DataChannelInitConfig, DescriptionType, Direction, IceServer, LogLevel, ProxyServer, ProxyServerType, RTCIceConnectionState, RTCIceGathererState, RTCIceGatheringState, RTCIceTransportState, RTCPeerConnectionState, RTCSdpType, RTCSignalingState, RelayType, RtcConfig, SctpSettings, SelectedCandidateInfo, TransportPolicy, WebSocketServerConfiguration };
116
+ export type { CertificateFingerprint, Channel, DataChannelInitConfig, DescriptionType, Direction, IceServer, IceUdpMuxRequest, LocalDescriptionInit, LogLevel, ProxyServer, ProxyServerType, RTCIceConnectionState, RTCIceGathererState, RTCIceGatheringState, RTCIceTransportState, RTCPeerConnectionState, RTCSdpType, RTCSignalingState, RelayType, RtcConfig, SctpSettings, SelectedCandidateInfo, TransportPolicy, WebSocketServerConfiguration };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "node-datachannel",
3
- "version": "0.28.0",
3
+ "version": "0.29.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",
@@ -50,7 +50,8 @@
50
50
  "wpt:server": "cd test/wpt-tests/wpt && ./wpt serve",
51
51
  "wpt:test": "ts-node test/wpt-tests/index.ts",
52
52
  "_prebuild": "prebuild -r napi --backend cmake-js",
53
- "prepack": "npm run build:tsc"
53
+ "prepack": "npm run build:tsc",
54
+ "prettier": "prettier --write ."
54
55
  },
55
56
  "binary": {
56
57
  "napi_versions": [
@@ -0,0 +1,150 @@
1
+ #include "ice-udp-mux-listener-wrapper.h"
2
+
3
+ #include "plog/Log.h"
4
+
5
+ #include <cctype>
6
+ #include <sstream>
7
+
8
+ Napi::FunctionReference IceUdpMuxListenerWrapper::constructor = Napi::FunctionReference();
9
+ std::unordered_set<IceUdpMuxListenerWrapper *> IceUdpMuxListenerWrapper::instances;
10
+
11
+ void IceUdpMuxListenerWrapper::StopAll()
12
+ {
13
+ PLOG_DEBUG << "IceUdpMuxListenerWrapper StopAll() called";
14
+ auto copy(instances);
15
+ for (auto inst : copy)
16
+ inst->doCleanup();
17
+ }
18
+
19
+ Napi::Object IceUdpMuxListenerWrapper::Init(Napi::Env env, Napi::Object exports)
20
+ {
21
+ Napi::HandleScope scope(env);
22
+
23
+ Napi::Function func = DefineClass(
24
+ env,
25
+ "IceUdpMuxListener",
26
+ {
27
+ InstanceMethod("stop", &IceUdpMuxListenerWrapper::stop),
28
+ InstanceMethod("onUnhandledStunRequest", &IceUdpMuxListenerWrapper::onUnhandledStunRequest),
29
+ InstanceMethod("port", &IceUdpMuxListenerWrapper::port),
30
+ InstanceMethod("address", &IceUdpMuxListenerWrapper::address)
31
+ });
32
+
33
+ // If this is not the first call, we don't want to reassign the constructor (hot-reload problem)
34
+ if(constructor.IsEmpty())
35
+ {
36
+ constructor = Napi::Persistent(func);
37
+ constructor.SuppressDestruct();
38
+ }
39
+
40
+ exports.Set("IceUdpMuxListener", func);
41
+ return exports;
42
+ }
43
+
44
+ IceUdpMuxListenerWrapper::IceUdpMuxListenerWrapper(const Napi::CallbackInfo &info) : Napi::ObjectWrap<IceUdpMuxListenerWrapper>(info)
45
+ {
46
+ PLOG_DEBUG << "IceUdpMuxListenerWrapper Constructor called";
47
+ Napi::Env env = info.Env();
48
+ int length = info.Length();
49
+
50
+ // We expect (Number, String?) as param
51
+ if (length > 0 && info[0].IsNumber()) {
52
+ // Port
53
+ mPort = info[0].As<Napi::Number>().ToNumber().Uint32Value();
54
+ } else {
55
+ Napi::TypeError::New(env, "Port (Number) and optional Address (String) expected").ThrowAsJavaScriptException();
56
+ return;
57
+ }
58
+
59
+ if (length > 1 && info[1].IsString()) {
60
+ // Address
61
+ mAddress = info[1].As<Napi::String>().ToString();
62
+ }
63
+
64
+ iceUdpMuxListenerPtr = std::make_unique<rtc::IceUdpMuxListener>(mPort, mAddress);
65
+ instances.insert(this);
66
+ }
67
+
68
+ IceUdpMuxListenerWrapper::~IceUdpMuxListenerWrapper()
69
+ {
70
+ PLOG_DEBUG << "IceUdpMuxListenerWrapper Destructor called";
71
+ doCleanup();
72
+ }
73
+
74
+ void IceUdpMuxListenerWrapper::doCleanup()
75
+ {
76
+ PLOG_DEBUG << "IceUdpMuxListenerWrapper::doCleanup() called";
77
+
78
+ if (iceUdpMuxListenerPtr)
79
+ {
80
+ iceUdpMuxListenerPtr->stop();
81
+ iceUdpMuxListenerPtr.reset();
82
+ }
83
+
84
+ mOnUnhandledStunRequestCallback.reset();
85
+ instances.erase(this);
86
+ }
87
+
88
+ Napi::Value IceUdpMuxListenerWrapper::port(const Napi::CallbackInfo &info)
89
+ {
90
+ Napi::Env env = info.Env();
91
+
92
+ return Napi::Number::New(env, mPort);
93
+ }
94
+
95
+ Napi::Value IceUdpMuxListenerWrapper::address(const Napi::CallbackInfo &info)
96
+ {
97
+ Napi::Env env = info.Env();
98
+
99
+ if (!mAddress.has_value()) {
100
+ return env.Undefined();
101
+ }
102
+
103
+ return Napi::String::New(env, mAddress.value());
104
+ }
105
+
106
+ void IceUdpMuxListenerWrapper::stop(const Napi::CallbackInfo &info)
107
+ {
108
+ PLOG_DEBUG << "IceUdpMuxListenerWrapper::stop() called";
109
+ doCleanup();
110
+ }
111
+
112
+ void IceUdpMuxListenerWrapper::onUnhandledStunRequest(const Napi::CallbackInfo &info)
113
+ {
114
+ PLOG_DEBUG << "IceUdpMuxListenerWrapper::onUnhandledStunRequest() called";
115
+ Napi::Env env = info.Env();
116
+ int length = info.Length();
117
+
118
+ if (!iceUdpMuxListenerPtr)
119
+ {
120
+ Napi::Error::New(env, "IceUdpMuxListenerWrapper::onUnhandledStunRequest() called on destroyed IceUdpMuxListener").ThrowAsJavaScriptException();
121
+ return;
122
+ }
123
+
124
+ if (length < 1 || !info[0].IsFunction())
125
+ {
126
+ Napi::TypeError::New(env, "Function expected").ThrowAsJavaScriptException();
127
+ return;
128
+ }
129
+
130
+ // Callback
131
+ mOnUnhandledStunRequestCallback = std::make_unique<ThreadSafeCallback>(info[0].As<Napi::Function>());
132
+
133
+ iceUdpMuxListenerPtr->OnUnhandledStunRequest([&](rtc::IceUdpMuxRequest request)
134
+ {
135
+ PLOG_DEBUG << "IceUdpMuxListenerWrapper::onUnhandledStunRequest() IceUdpMuxCallback call(1)";
136
+
137
+ if (mOnUnhandledStunRequestCallback) {
138
+ mOnUnhandledStunRequestCallback->call([request = std::move(request)](Napi::Env env, std::vector<napi_value> &args) {
139
+ Napi::Object reqObj = Napi::Object::New(env);
140
+ reqObj.Set("ufrag", request.remoteUfrag.c_str());
141
+ reqObj.Set("host", request.remoteAddress.c_str());
142
+ reqObj.Set("port", request.remotePort);
143
+
144
+ args = {reqObj};
145
+ });
146
+ }
147
+
148
+ PLOG_DEBUG << "IceUdpMuxListenerWrapper::onUnhandledStunRequest() IceUdpMuxCallback call(2)";
149
+ });
150
+ }
@@ -0,0 +1,43 @@
1
+ #ifndef ICE_UDP_MUX_LISTENER_WRAPPER_H
2
+ #define ICE_UDP_MUX_LISTENER_WRAPPER_H
3
+
4
+ #include <napi.h>
5
+ #include <rtc/rtc.hpp>
6
+ #include <unordered_set>
7
+
8
+ #include "thread-safe-callback.h"
9
+
10
+ class IceUdpMuxListenerWrapper : public Napi::ObjectWrap<IceUdpMuxListenerWrapper>
11
+ {
12
+ public:
13
+ static Napi::Object Init(Napi::Env env, Napi::Object exports);
14
+ IceUdpMuxListenerWrapper(const Napi::CallbackInfo &info);
15
+ ~IceUdpMuxListenerWrapper();
16
+
17
+ // Functions
18
+ void stop(const Napi::CallbackInfo &info);
19
+ void onUnhandledStunRequest(const Napi::CallbackInfo &info);
20
+
21
+ // Stop listening on all ports
22
+ static void StopAll();
23
+
24
+ // Properties
25
+ Napi::Value port(const Napi::CallbackInfo &info);
26
+ Napi::Value address(const Napi::CallbackInfo &info);
27
+ Napi::Value unhandledStunRequestCallback(const Napi::CallbackInfo &info);
28
+
29
+ // Callback Ptrs
30
+ std::unique_ptr<ThreadSafeCallback> mOnUnhandledStunRequestCallback = nullptr;
31
+
32
+ private:
33
+ static Napi::FunctionReference constructor;
34
+ static std::unordered_set<IceUdpMuxListenerWrapper *> instances;
35
+
36
+ void doCleanup();
37
+
38
+ std::optional<std::string> mAddress;
39
+ uint16_t mPort;
40
+ std::unique_ptr<rtc::IceUdpMuxListener> iceUdpMuxListenerPtr = nullptr;
41
+ };
42
+
43
+ #endif // ICE_UDP_MUX_LISTENER_WRAPPER_H
package/src/cpp/main.cpp CHANGED
@@ -2,6 +2,7 @@
2
2
  #include "rtc-wrapper.h"
3
3
  #include "peer-connection-wrapper.h"
4
4
  #include "data-channel-wrapper.h"
5
+ #include "ice-udp-mux-listener-wrapper.h"
5
6
 
6
7
  #if RTC_ENABLE_MEDIA == 1
7
8
  #include "media-rtcpreceivingsession-wrapper.h"
@@ -27,6 +28,7 @@ Napi::Object InitAll(Napi::Env env, Napi::Object exports)
27
28
  #endif
28
29
 
29
30
  DataChannelWrapper::Init(env, exports);
31
+ IceUdpMuxListenerWrapper::Init(env, exports);
30
32
  PeerConnectionWrapper::Init(env, exports);
31
33
 
32
34
  #if RTC_ENABLE_WEBSOCKET == 1
@@ -44,6 +44,7 @@ Napi::Object PeerConnectionWrapper::Init(Napi::Env env, Napi::Object exports)
44
44
  InstanceMethod("setRemoteDescription", &PeerConnectionWrapper::setRemoteDescription),
45
45
  InstanceMethod("localDescription", &PeerConnectionWrapper::localDescription),
46
46
  InstanceMethod("remoteDescription", &PeerConnectionWrapper::remoteDescription),
47
+ InstanceMethod("remoteFingerprint", &PeerConnectionWrapper::remoteFingerprint),
47
48
  InstanceMethod("addRemoteCandidate", &PeerConnectionWrapper::addRemoteCandidate),
48
49
  InstanceMethod("createDataChannel", &PeerConnectionWrapper::createDataChannel),
49
50
 
@@ -220,6 +221,10 @@ PeerConnectionWrapper::PeerConnectionWrapper(const Napi::CallbackInfo &info) : N
220
221
  if (config.Get("disableAutoNegotiation").IsBoolean())
221
222
  rtcConfig.disableAutoNegotiation = config.Get("disableAutoNegotiation").As<Napi::Boolean>();
222
223
 
224
+ // disableAutoGathering option
225
+ if (config.Get("disableAutoGathering").IsBoolean())
226
+ rtcConfig.disableAutoGathering = config.Get("disableAutoGathering").As<Napi::Boolean>();
227
+
223
228
  // forceMediaTransport option
224
229
  if (config.Get("forceMediaTransport").IsBoolean())
225
230
  rtcConfig.forceMediaTransport = config.Get("forceMediaTransport").As<Napi::Boolean>();
@@ -257,6 +262,17 @@ PeerConnectionWrapper::PeerConnectionWrapper(const Napi::CallbackInfo &info) : N
257
262
  rtcConfig.disableFingerprintVerification = config.Get("disableFingerprintVerification").As<Napi::Boolean>();
258
263
  }
259
264
 
265
+ // Specify certificate to use if set
266
+ if (config.Get("certificatePemFile").IsString()) {
267
+ rtcConfig.certificatePemFile = config.Get("certificatePemFile").As<Napi::String>().ToString();
268
+ }
269
+ if (config.Get("keyPemFile").IsString()) {
270
+ rtcConfig.keyPemFile = config.Get("keyPemFile").As<Napi::String>().ToString();
271
+ }
272
+ if (config.Get("keyPemPass").IsString()) {
273
+ rtcConfig.keyPemPass = config.Get("keyPemPass").As<Napi::String>().ToString();
274
+ }
275
+
260
276
  // Create peer-connection
261
277
  try
262
278
  {
@@ -337,6 +353,7 @@ void PeerConnectionWrapper::setLocalDescription(const Napi::CallbackInfo &info)
337
353
  }
338
354
 
339
355
  rtc::Description::Type type = rtc::Description::Type::Unspec;
356
+ rtc::LocalDescriptionInit init;
340
357
 
341
358
  // optional
342
359
  if (length > 0)
@@ -362,7 +379,29 @@ void PeerConnectionWrapper::setLocalDescription(const Napi::CallbackInfo &info)
362
379
  type = rtc::Description::Type::Rollback;
363
380
  }
364
381
 
365
- mRtcPeerConnPtr->setLocalDescription(type);
382
+ // optional
383
+ if (length > 1)
384
+ {
385
+ PLOG_DEBUG << "setLocalDescription() called with LocalDescriptionInit";
386
+
387
+ if (info[1].IsObject())
388
+ {
389
+ PLOG_DEBUG << "setLocalDescription() called with LocalDescriptionInit as object";
390
+ Napi::Object obj = info[1].As<Napi::Object>();
391
+
392
+ if (obj.Get("iceUfrag").IsString()) {
393
+ PLOG_DEBUG << "setLocalDescription() has ufrag";
394
+ init.iceUfrag = obj.Get("iceUfrag").As<Napi::String>();
395
+ }
396
+
397
+ if (obj.Get("icePwd").IsString()) {
398
+ PLOG_DEBUG << "setLocalDescription() has password";
399
+ init.icePwd = obj.Get("icePwd").As<Napi::String>();
400
+ }
401
+ }
402
+ }
403
+
404
+ mRtcPeerConnPtr->setLocalDescription(type, init);
366
405
  }
367
406
 
368
407
  void PeerConnectionWrapper::setRemoteDescription(const Napi::CallbackInfo &info)
@@ -1008,7 +1047,34 @@ Napi::Value PeerConnectionWrapper::maxMessageSize(const Napi::CallbackInfo &info
1008
1047
 
1009
1048
  try
1010
1049
  {
1011
- return Napi::Number::New(env, mRtcPeerConnPtr->remoteMaxMessageSize());
1050
+ return Napi::Array::New(env, mRtcPeerConnPtr->remoteMaxMessageSize());
1051
+ }
1052
+ catch (std::exception &ex)
1053
+ {
1054
+ Napi::Error::New(env, std::string("libdatachannel error: ") + ex.what()).ThrowAsJavaScriptException();
1055
+ return Napi::Number::New(info.Env(), 0);
1056
+ }
1057
+ }
1058
+
1059
+ Napi::Value PeerConnectionWrapper::remoteFingerprint(const Napi::CallbackInfo &info)
1060
+ {
1061
+ PLOG_DEBUG << "remoteFingerprints() called";
1062
+ Napi::Env env = info.Env();
1063
+
1064
+ if (!mRtcPeerConnPtr)
1065
+ {
1066
+ return Napi::Number::New(info.Env(), 0);
1067
+ }
1068
+
1069
+ try
1070
+ {
1071
+ auto fingerprint = mRtcPeerConnPtr->remoteFingerprint();
1072
+
1073
+ Napi::Object fingerprintObject = Napi::Object::New(env);
1074
+ fingerprintObject.Set("value", fingerprint.value);
1075
+ fingerprintObject.Set("algorithm", rtc::CertificateFingerprint::AlgorithmIdentifier(fingerprint.algorithm));
1076
+
1077
+ return fingerprintObject;
1012
1078
  }
1013
1079
  catch (std::exception &ex)
1014
1080
  {
@@ -38,6 +38,7 @@ public:
38
38
  Napi::Value iceState(const Napi::CallbackInfo &info);
39
39
  Napi::Value signalingState(const Napi::CallbackInfo &info);
40
40
  Napi::Value gatheringState(const Napi::CallbackInfo &info);
41
+ Napi::Value remoteFingerprint(const Napi::CallbackInfo &info);
41
42
 
42
43
  // Callbacks
43
44
  void onLocalDescription(const Napi::CallbackInfo &info);
package/src/lib/index.ts CHANGED
@@ -16,6 +16,7 @@ import {
16
16
  SelectedCandidateInfo,
17
17
  } from './types';
18
18
  import { WebSocket } from './websocket';
19
+ import type { CertificateFingerprint, IceUdpMuxRequest, LocalDescriptionInit } from './types';
19
20
 
20
21
  export function preload(): void {
21
22
  nodeDataChannel.preload();
@@ -136,10 +137,11 @@ export const DataChannel: {
136
137
 
137
138
  export interface PeerConnection {
138
139
  close(): void;
139
- setLocalDescription(type?: DescriptionType): void;
140
+ setLocalDescription(type?: DescriptionType, init?: LocalDescriptionInit): void;
140
141
  setRemoteDescription(sdp: string, type: DescriptionType): void;
141
142
  localDescription(): { type: DescriptionType; sdp: string } | null;
142
143
  remoteDescription(): { type: DescriptionType; sdp: string } | null;
144
+ remoteFingerprint(): CertificateFingerprint;
143
145
  addRemoteCandidate(candidate: string, mid: string): void;
144
146
  createDataChannel(label: string, config?: DataChannelInitConfig): DataChannel;
145
147
  addTrack(media: Video | Audio): Track;
@@ -170,6 +172,16 @@ export const PeerConnection: {
170
172
  new (peerName: string, config: RtcConfig): PeerConnection;
171
173
  } = nodeDataChannel.PeerConnection;
172
174
 
175
+ export interface IceUdpMuxListener {
176
+ address?: string;
177
+ port: number;
178
+ stop(): void;
179
+ onUnhandledStunRequest(cb: (req: IceUdpMuxRequest) => void): void;
180
+ }
181
+ export const IceUdpMuxListener: {
182
+ new (port: number, address?: string): IceUdpMuxListener;
183
+ } = nodeDataChannel.IceUdpMuxListener;
184
+
173
185
  export interface RtcpReceivingSession {}
174
186
 
175
187
  export const RtcpReceivingSession: {
@@ -196,6 +208,7 @@ export default {
196
208
  WebSocket,
197
209
  WebSocketServer,
198
210
  DataChannelStream,
211
+ IceUdpMuxListener,
199
212
  };
200
213
 
201
214
  // Types
package/src/lib/types.ts CHANGED
@@ -73,6 +73,10 @@ export interface RtcConfig {
73
73
  mtu?: number;
74
74
  iceTransportPolicy?: TransportPolicy;
75
75
  disableFingerprintVerification?: boolean;
76
+ disableAutoGathering?: boolean;
77
+ certificatePemFile?: string;
78
+ keyPemFile?: string;
79
+ keyPemPass?: string;
76
80
  }
77
81
 
78
82
  // Lowercase to match the description type string from libdatachannel
@@ -113,6 +117,11 @@ export type RTCSignalingState =
113
117
  | 'have-remote-pranswer'
114
118
  | 'stable';
115
119
 
120
+ export interface LocalDescriptionInit {
121
+ iceUfrag?: string;
122
+ icePwd?: string;
123
+ }
124
+
116
125
  export interface DataChannelInitConfig {
117
126
  protocol?: string;
118
127
  negotiated?: boolean;
@@ -122,6 +131,17 @@ export interface DataChannelInitConfig {
122
131
  maxRetransmits?: number; // Reliability
123
132
  }
124
133
 
134
+ export interface CertificateFingerprint {
135
+ /**
136
+ * @see https://developer.mozilla.org/en-US/docs/Web/API/RTCCertificate/getFingerprints#value
137
+ */
138
+ value: string;
139
+ /**
140
+ * @see https://developer.mozilla.org/en-US/docs/Web/API/RTCCertificate/getFingerprints#algorithm
141
+ */
142
+ algorithm: 'sha-1' | 'sha-224' | 'sha-256' | 'sha-384' | 'sha-512' | 'md5' | 'md2';
143
+ }
144
+
125
145
  export interface SelectedCandidateInfo {
126
146
  address: string;
127
147
  port: number;
@@ -134,3 +154,9 @@ export interface SelectedCandidateInfo {
134
154
 
135
155
  // Must be same as rtc enum class Direction
136
156
  export type Direction = 'SendOnly' | 'RecvOnly' | 'SendRecv' | 'Inactive' | 'Unknown';
157
+
158
+ export interface IceUdpMuxRequest {
159
+ ufrag: string;
160
+ host: string;
161
+ port: number;
162
+ }
@@ -1,7 +1,10 @@
1
1
  import RTCDataChannel from './RTCDataChannel';
2
2
  import RTCError from './RTCError';
3
3
 
4
- export class RTCPeerConnectionIceEvent extends Event implements globalThis.RTCPeerConnectionIceEvent {
4
+ export class RTCPeerConnectionIceEvent
5
+ extends Event
6
+ implements globalThis.RTCPeerConnectionIceEvent
7
+ {
5
8
  #candidate: globalThis.RTCIceCandidate;
6
9
 
7
10
  constructor(candidate: globalThis.RTCIceCandidate) {
@@ -30,7 +30,7 @@ export default class RTCDataChannel extends EventTarget implements globalThis.RT
30
30
  super();
31
31
 
32
32
  this.#dataChannel = dataChannel;
33
- this.#binaryType = 'blob';
33
+ this.#binaryType = 'arraybuffer';
34
34
  this.#readyState = this.#dataChannel.isOpen() ? 'open' : 'connecting';
35
35
  this.#bufferedAmountLowThreshold = 0;
36
36
  this.#maxPacketLifeTime = opts.maxPacketLifeTime ?? null;
@@ -77,10 +77,29 @@ export default class RTCDataChannel extends EventTarget implements globalThis.RT
77
77
  this.dispatchEvent(new Event('bufferedamountlow'));
78
78
  });
79
79
 
80
- this.#dataChannel.onMessage((data) => {
81
- if (ArrayBuffer.isView(data)) {
82
- if (this.binaryType == 'arraybuffer') data = data.buffer;
83
- else data = Buffer.from(data.buffer);
80
+ this.#dataChannel.onMessage((message) => {
81
+ if (typeof message === 'string') {
82
+ this.dispatchEvent(new MessageEvent('message', { data: message }));
83
+ return;
84
+ }
85
+
86
+ let data: Blob | ArrayBuffer;
87
+
88
+ if (message instanceof ArrayBuffer) {
89
+ data = message;
90
+ } else {
91
+ data = message.buffer;
92
+
93
+ if (message.byteOffset !== 0 || message.byteLength !== message.buffer.byteLength) {
94
+ // message is view on underlying buffer, must create new
95
+ // ArrayBuffer that only contains message data
96
+ data = new ArrayBuffer(message.byteLength);
97
+ new Uint8Array(data, 0, message.byteLength).set(message);
98
+ }
99
+ }
100
+
101
+ if (this.#binaryType === 'blob') {
102
+ data = new Blob([data]);
84
103
  }
85
104
 
86
105
  this.dispatchEvent(new MessageEvent('message', { data }));
@@ -14,7 +14,7 @@ export default class RTCDtlsTransport extends EventTarget implements globalThis.
14
14
  this.#pc = init.pc;
15
15
 
16
16
  this.#iceTransport = new RTCIceTransport({
17
- pc: init.pc
17
+ pc: init.pc,
18
18
  });
19
19
 
20
20
  // forward peerConnection events
@@ -13,7 +13,7 @@ export default class RTCSctpTransport extends EventTarget implements globalThis.
13
13
  this.#pc = initial.pc;
14
14
 
15
15
  this.#transport = new RTCDtlsTransport({
16
- pc: initial.pc
16
+ pc: initial.pc,
17
17
  });
18
18
 
19
19
  this.#pc.addEventListener('connectionstatechange', () => {
@@ -30,7 +30,7 @@ export default class RTCSctpTransport extends EventTarget implements globalThis.
30
30
 
31
31
  get maxMessageSize(): number {
32
32
  if (this.state !== 'connected') return null;
33
- return this.#pc?.ext_maxMessageSize ?? 65536;;
33
+ return this.#pc?.ext_maxMessageSize ?? 65536;
34
34
  }
35
35
 
36
36
  get state(): globalThis.RTCSctpTransportState {