@lng2004/node-datachannel 0.32.0-20260202 → 0.32.3-20260815

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.
Files changed (59) hide show
  1. package/CMakeLists.txt +29 -7
  2. package/README.md +12 -0
  3. package/binding-options.js +7 -0
  4. package/cmake/toolchain/ci.cmake +23 -0
  5. package/dist/cjs/lib/index.cjs +4 -2
  6. package/dist/cjs/lib/index.cjs.map +1 -1
  7. package/dist/cjs/lib/node-datachannel.cjs +4 -1
  8. package/dist/cjs/lib/node-datachannel.cjs.map +1 -1
  9. package/dist/esm/lib/index.mjs +4 -2
  10. package/dist/esm/lib/index.mjs.map +1 -1
  11. package/dist/esm/lib/node-datachannel.mjs +4 -1
  12. package/dist/esm/lib/node-datachannel.mjs.map +1 -1
  13. package/dist/types/lib/index.d.ts +17 -3
  14. package/dist/types/lib/types.d.ts +1 -0
  15. package/package.json +17 -8
  16. package/scripts/build-mbedtls.js +28 -0
  17. package/scripts/build-mbedtls.ps1 +84 -0
  18. package/scripts/build-mbedtls.sh +50 -0
  19. package/src/cpp/ice-udp-mux-listener-wrapper.cpp +1 -0
  20. package/src/cpp/main.cpp +4 -0
  21. package/src/cpp/media-mediahandler-helper.cpp +6 -0
  22. package/src/cpp/media-pacinghandler-wrapper.cpp +18 -0
  23. package/src/cpp/media-pacinghandler-wrapper.h +1 -0
  24. package/src/cpp/media-vp8rtppacketizer-wrapper.cpp +110 -0
  25. package/src/cpp/media-vp8rtppacketizer-wrapper.h +30 -0
  26. package/src/cpp/media-vp9rtppacketizer-wrapper.cpp +110 -0
  27. package/src/cpp/media-vp9rtppacketizer-wrapper.h +30 -0
  28. package/.clang-format +0 -17
  29. package/.editorconfig +0 -12
  30. package/.eslintignore +0 -8
  31. package/.eslintrc.json +0 -27
  32. package/.gitmodules +0 -3
  33. package/.prettierignore +0 -7
  34. package/.prettierrc +0 -13
  35. package/API.md +0 -247
  36. package/BULDING.md +0 -33
  37. package/jest.config.ts +0 -14
  38. package/rollup.config.mjs +0 -72
  39. package/src/index.ts +0 -9
  40. package/src/lib/datachannel-stream.ts +0 -100
  41. package/src/lib/index.ts +0 -290
  42. package/src/lib/node-datachannel.ts +0 -3
  43. package/src/lib/types.ts +0 -168
  44. package/src/lib/websocket-server.ts +0 -37
  45. package/src/lib/websocket.ts +0 -26
  46. package/src/polyfill/Events.ts +0 -82
  47. package/src/polyfill/Exception.ts +0 -37
  48. package/src/polyfill/README.md +0 -41
  49. package/src/polyfill/RTCCertificate.ts +0 -21
  50. package/src/polyfill/RTCDataChannel.ts +0 -225
  51. package/src/polyfill/RTCDtlsTransport.ts +0 -46
  52. package/src/polyfill/RTCError.ts +0 -78
  53. package/src/polyfill/RTCIceCandidate.ts +0 -128
  54. package/src/polyfill/RTCIceTransport.ts +0 -90
  55. package/src/polyfill/RTCPeerConnection.ts +0 -527
  56. package/src/polyfill/RTCSctpTransport.ts +0 -51
  57. package/src/polyfill/RTCSessionDescription.ts +0 -41
  58. package/src/polyfill/index.ts +0 -38
  59. package/tsconfig.json +0 -21
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.32.0)
5
+ project(node_datachannel VERSION 0.32.3)
6
6
 
7
7
  # compile_commands.json
8
8
  # -----------------------------------
@@ -14,8 +14,7 @@ add_definitions(-DNAPI_VERSION=8)
14
14
  include_directories(${CMAKE_JS_INC})
15
15
 
16
16
  if(WIN32)
17
- set(OPENSSL_MSVC_STATIC_RT TRUE)
18
- set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>")
17
+ set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>DLL")
19
18
  endif()
20
19
 
21
20
  if(CMAKE_HOST_SYSTEM_NAME STREQUAL "Android")
@@ -27,8 +26,30 @@ if (NOT CMAKE_SYSTEM_NAME STREQUAL "Windows")
27
26
  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -frtti")
28
27
  endif()
29
28
 
30
- set(OPENSSL_USE_STATIC_LIBS TRUE)
31
- find_package(OpenSSL REQUIRED)
29
+ option(USE_MBEDTLS "Use Mbed TLS instead of OpenSSL" ON)
30
+ option(USE_GNUTLS "Use GnuTLS instead of OpenSSL" OFF)
31
+
32
+ if(USE_MBEDTLS AND USE_GNUTLS)
33
+ message(FATAL_ERROR "Both USE_MBEDTLS and USE_GNUTLS cannot be enabled at the same time")
34
+ endif()
35
+
36
+ set(NDC_MBEDTLS_INSTALL_DIR "${CMAKE_SOURCE_DIR}/deps/mbedtls/install" CACHE PATH "Path to manually built MbedTLS install prefix")
37
+
38
+ if(DEFINED ENV{NDC_MBEDTLS_INSTALL_DIR} AND NOT "$ENV{NDC_MBEDTLS_INSTALL_DIR}" STREQUAL "")
39
+ set(NDC_MBEDTLS_INSTALL_DIR "$ENV{NDC_MBEDTLS_INSTALL_DIR}" CACHE PATH "Path to manually built MbedTLS install prefix" FORCE)
40
+ endif()
41
+
42
+ if(USE_MBEDTLS)
43
+ if(EXISTS "${NDC_MBEDTLS_INSTALL_DIR}")
44
+ list(PREPEND CMAKE_PREFIX_PATH "${NDC_MBEDTLS_INSTALL_DIR}")
45
+ else()
46
+ message(WARNING "MbedTLS install directory not found at ${NDC_MBEDTLS_INSTALL_DIR}. Run scripts/build-mbedtls.sh or scripts/build-mbedtls.ps1 first.")
47
+ endif()
48
+ endif()
49
+
50
+ # Forward crypto backend selection to libdatachannel.
51
+ set(USE_MBEDTLS ${USE_MBEDTLS} CACHE BOOL "Use Mbed TLS instead of OpenSSL" FORCE)
52
+ set(USE_GNUTLS ${USE_GNUTLS} CACHE BOOL "Use GnuTLS instead of OpenSSL" FORCE)
32
53
 
33
54
  include(FetchContent)
34
55
 
@@ -36,7 +57,7 @@ include(FetchContent)
36
57
  FetchContent_Declare(
37
58
  libdatachannel
38
59
  GIT_REPOSITORY https://github.com/paullouisageneau/libdatachannel.git
39
- GIT_TAG "v0.24.0"
60
+ GIT_TAG a2627fb96c85c75064676ec2b1131d3779c1fc2a
40
61
  )
41
62
 
42
63
  option(NO_MEDIA "Disable media transport support in libdatachannel" OFF)
@@ -69,6 +90,8 @@ if(NOT NO_MEDIA)
69
90
  src/cpp/media-h26xseparator.cpp
70
91
  src/cpp/media-h264rtppacketizer-wrapper.cpp
71
92
  src/cpp/media-h265rtppacketizer-wrapper.cpp
93
+ src/cpp/media-vp8rtppacketizer-wrapper.cpp
94
+ src/cpp/media-vp9rtppacketizer-wrapper.cpp
72
95
  src/cpp/media-mediahandler-helper.cpp
73
96
  src/cpp/media-pacinghandler-wrapper.cpp
74
97
  src/cpp/media-rtcpnackresponder-wrapper.cpp
@@ -122,7 +145,6 @@ elseif(UNIX)
122
145
  endif()
123
146
 
124
147
  if(WIN32)
125
- SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MT")
126
148
  list(APPEND LINK_LIBRARIES crypt32.lib)
127
149
  endif()
128
150
 
package/README.md CHANGED
@@ -16,6 +16,18 @@ This project is Node.js bindings for [libdatachannel](https://github.com/paullou
16
16
  npm install node-datachannel
17
17
  ```
18
18
 
19
+ On install, the package first checks for a prebuilt binary matching your
20
+ platform/architecture (shipped inside the package under `prebuilds/`). If no
21
+ matching prebuild is found, it falls back to building from source using
22
+ `cmake-js`, which requires the build dependencies listed in
23
+ [BULDING.md](./BULDING.md).
24
+
25
+ To force a build from source, set `npm_config_build_from_source=true`:
26
+
27
+ ```sh
28
+ npm install node-datachannel --build-from-source
29
+ ```
30
+
19
31
  ## Supported Platforms
20
32
 
21
33
  `node-datachannel` targets N-API version 8 and supports Node.js v18.20 and above. It is tested on Linux, Windows and MacOS. For N-API compatibility please check [here](https://nodejs.org/api/n-api.html#n_api_n_api_version_matrix).
@@ -0,0 +1,7 @@
1
+ module.exports = {
2
+ // This must match the output file as specified in CMakeLists.txt
3
+ // (project name `node_datachannel` -> `node_datachannel.node`)
4
+ name: 'node_datachannel',
5
+ // The node-api versions that are built
6
+ napi_versions: [8],
7
+ };
@@ -0,0 +1,23 @@
1
+ set(CMAKE_SYSTEM_NAME Linux)
2
+ set(triple $ENV{TRIPLE})
3
+
4
+ # use clang and lld
5
+ set(CMAKE_C_COMPILER $ENV{GCC})
6
+ set(CMAKE_CXX_COMPILER $ENV{GXX})
7
+ if (CMAKE_C_COMPILER MATCHES clang)
8
+ add_link_options("-fuse-ld=lld")
9
+ endif()
10
+
11
+ set(CMAKE_SYSROOT "$ENV{SYSROOT}")
12
+ message(STATUS "Using sysroot: ${CMAKE_SYSROOT}")
13
+
14
+ set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
15
+ set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
16
+ set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
17
+
18
+ set(CMAKE_C_COMPILER_TARGET ${triple})
19
+ set(CMAKE_CXX_COMPILER_TARGET ${triple})
20
+ message(STATUS "Compiling for: ${triple}")
21
+
22
+ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} $ENV{COMPILER_FLAGS}")
23
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} $ENV{COMPILER_FLAGS}")
@@ -10,8 +10,8 @@ var websocket = require('./websocket.cjs');
10
10
  function preload() {
11
11
  nodeDatachannel.default.preload();
12
12
  }
13
- function initLogger(level) {
14
- nodeDatachannel.default.initLogger(level);
13
+ function initLogger(level, cb) {
14
+ nodeDatachannel.default.initLogger(level, cb);
15
15
  }
16
16
  function cleanup() {
17
17
  nodeDatachannel.default.cleanup();
@@ -36,6 +36,8 @@ const RtcpSrReporter = nodeDatachannel.default.RtcpSrReporter;
36
36
  const RtpPacketizer = nodeDatachannel.default.RtpPacketizer;
37
37
  const H264RtpPacketizer = nodeDatachannel.default.H264RtpPacketizer;
38
38
  const H265RtpPacketizer = nodeDatachannel.default.H265RtpPacketizer;
39
+ nodeDatachannel.default.VP8RtpPacketizer;
40
+ nodeDatachannel.default.VP9RtpPacketizer;
39
41
  const AV1RtpPacketizer = nodeDatachannel.default.AV1RtpPacketizer;
40
42
  const DataChannelStream = datachannelStream.default;
41
43
  var n = {
@@ -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 NalUnitSeparator,\n ObuPacketization,\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 addH265Codec(payloadType: number): void;\n addVP8Codec(payloadType: number): void;\n addVP9Codec(payloadType: number): void;\n addAV1Codec(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: MediaHandler): 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 RtpPacketizationConfig {\n playoutDelayId: number,\n playoutDelayMin: number,\n playoutDelayMax: number,\n timestamp: number,\n get clockRate(): number\n}\n\nexport const RtpPacketizationConfig: {\n new(ssrc: number, cname: string, payloadType: number, clockRate: number, videoOrientationId?: number): RtpPacketizationConfig\n} = nodeDataChannel.RtpPacketizationConfig\n\nexport interface MediaHandler {\n addToChain(handler: MediaHandler): void\n}\n\nexport interface PacingHandler extends MediaHandler {}\n\nexport const PacingHandler: {\n new (bitsPerSecond: number, sendInterval: number): PacingHandler;\n} = nodeDataChannel.PacingHandler;\n\nexport interface RtcpReceivingSession extends MediaHandler {}\n\nexport const RtcpReceivingSession: {\n new (): RtcpReceivingSession;\n} = nodeDataChannel.RtcpReceivingSession;\n\nexport interface RtcpNackResponder extends MediaHandler {}\n\nexport const RtcpNackResponder: {\n new (maxSize?: number): RtcpNackResponder\n} = nodeDataChannel.RtcpNackResponder;\n\nexport interface RtcpSrReporter extends MediaHandler {\n get rtpConfig(): RtpPacketizationConfig\n}\n\nexport const RtcpSrReporter: {\n new (rtpConfig: RtpPacketizationConfig): RtcpSrReporter\n} = nodeDataChannel.RtcpSrReporter;\n\nexport interface RtpPacketizer extends MediaHandler {\n get rtpConfig(): RtpPacketizationConfig\n}\n\nexport const RtpPacketizer: {\n new (rtpConfig: RtpPacketizationConfig): RtpPacketizer\n} = nodeDataChannel.RtpPacketizer;\n\nexport interface H264RtpPacketizer extends RtpPacketizer {}\n\nexport const H264RtpPacketizer: {\n new (separator: NalUnitSeparator, rtpConfig: RtpPacketizationConfig, maxFragmentSize?: number): H264RtpPacketizer\n} = nodeDataChannel.H264RtpPacketizer\n\nexport interface H265RtpPacketizer extends RtpPacketizer {}\n\nexport const H265RtpPacketizer: {\n new (separator: NalUnitSeparator, rtpConfig: RtpPacketizationConfig, maxFragmentSize?: number): H265RtpPacketizer\n} = nodeDataChannel.H265RtpPacketizer\n\nexport interface AV1RtpPacketizer extends RtpPacketizer {}\n\nexport const AV1RtpPacketizer: {\n new (packetization: ObuPacketization, rtpConfig: RtpPacketizationConfig, maxFragmentSize?: number): AV1RtpPacketizer\n} = nodeDataChannel.AV1RtpPacketizer\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 PacingHandler,\n RtcpReceivingSession,\n RtcpNackResponder,\n RtcpSrReporter,\n RtpPacketizationConfig,\n RtpPacketizer,\n H264RtpPacketizer,\n H265RtpPacketizer,\n AV1RtpPacketizer,\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":";;;;;;;;;AAsBO,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;AA4Bb,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;AAUb,MAAM,yBAETA,uBAAgB,CAAA,uBAAA;AAQb,MAAM,gBAETA,uBAAgB,CAAA,cAAA;AAIb,MAAM,uBAETA,uBAAgB,CAAA,qBAAA;AAIb,MAAM,oBAETA,uBAAgB,CAAA,kBAAA;AAMb,MAAM,iBAETA,uBAAgB,CAAA,eAAA;AAMb,MAAM,gBAETA,uBAAgB,CAAA,cAAA;AAIb,MAAM,oBAETA,uBAAgB,CAAA,kBAAA;AAIb,MAAM,oBAETA,uBAAgB,CAAA,kBAAA;AAIb,MAAM,mBAETA,uBAAgB,CAAA,iBAAA;AAKb,MAAM,iBAAoB,GAAAC,0BAAA;AAEjC,QAAe;AAAA,EACb,UAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,eAAA;AAAA,EACA,iBAAA;AAAA,EACA,aAAA;AAAA,EACA,oBAAA;AAAA,EACA,iBAAA;AAAA,EACA,cAAA;AAAA,EACA,sBAAA;AAAA,EACA,aAAA;AAAA,EACA,iBAAA;AAAA,EACA,iBAAA;AAAA,EACA,gBAAA;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
+ {"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 NalUnitSeparator,\n ObuPacketization,\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, cb?: (level: LogLevel, message: string) => void): void {\n nodeDataChannel.initLogger(level, cb);\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 addH265Codec(payloadType: number): void;\n addVP8Codec(payloadType: number): void;\n addVP9Codec(payloadType: number): void;\n addAV1Codec(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: MediaHandler): 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 RtpPacketizationConfig {\n playoutDelayId: number,\n playoutDelayMin: number,\n playoutDelayMax: number,\n timestamp: number,\n get clockRate(): number\n}\n\nexport const RtpPacketizationConfig: {\n new(ssrc: number, cname: string, payloadType: number, clockRate: number, videoOrientationId?: number): RtpPacketizationConfig\n} = nodeDataChannel.RtpPacketizationConfig\n\nexport interface MediaHandler {\n addToChain(handler: MediaHandler): void\n}\n\nexport interface PacingHandler extends MediaHandler {}\n\nexport const PacingHandler: {\n new (bitsPerSecond: number, sendInterval: number): PacingHandler;\n setBitrate(bitsPerSecond: number): void;\n} = nodeDataChannel.PacingHandler;\n\nexport interface RtcpReceivingSession extends MediaHandler {}\n\nexport const RtcpReceivingSession: {\n new (): RtcpReceivingSession;\n} = nodeDataChannel.RtcpReceivingSession;\n\nexport interface RtcpNackResponder extends MediaHandler {}\n\nexport const RtcpNackResponder: {\n new (maxSize?: number): RtcpNackResponder\n} = nodeDataChannel.RtcpNackResponder;\n\nexport interface RtcpSrReporter extends MediaHandler {\n get rtpConfig(): RtpPacketizationConfig\n}\n\nexport const RtcpSrReporter: {\n new (rtpConfig: RtpPacketizationConfig): RtcpSrReporter\n} = nodeDataChannel.RtcpSrReporter;\n\nexport interface RtpPacketizer extends MediaHandler {\n get rtpConfig(): RtpPacketizationConfig\n}\n\nexport const RtpPacketizer: {\n new (rtpConfig: RtpPacketizationConfig): RtpPacketizer\n} = nodeDataChannel.RtpPacketizer;\n\nexport interface H264RtpPacketizer extends RtpPacketizer {}\n\nexport const H264RtpPacketizer: {\n new (separator: NalUnitSeparator, rtpConfig: RtpPacketizationConfig, maxFragmentSize?: number): H264RtpPacketizer\n} = nodeDataChannel.H264RtpPacketizer\n\nexport interface H265RtpPacketizer extends RtpPacketizer {}\n\nexport const H265RtpPacketizer: {\n new (separator: NalUnitSeparator, rtpConfig: RtpPacketizationConfig, maxFragmentSize?: number): H265RtpPacketizer\n} = nodeDataChannel.H265RtpPacketizer\n\nexport interface VP8RtpPacketizer extends RtpPacketizer {}\n\nexport const VP8RtpPacketizer: {\n new (rtpConfig: RtpPacketizationConfig, maxFragmentSize?: number): VP8RtpPacketizer\n} = nodeDataChannel.VP8RtpPacketizer\n\nexport interface VP9RtpPacketizer extends RtpPacketizer {}\n\nexport const VP9RtpPacketizer: {\n new (rtpConfig: RtpPacketizationConfig, maxFragmentSize?: number): VP9RtpPacketizer\n} = nodeDataChannel.VP9RtpPacketizer\n\nexport interface AV1RtpPacketizer extends RtpPacketizer {}\n\nexport const AV1RtpPacketizer: {\n new (packetization: ObuPacketization, rtpConfig: RtpPacketizationConfig, maxFragmentSize?: number): AV1RtpPacketizer\n} = nodeDataChannel.AV1RtpPacketizer\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 PacingHandler,\n RtcpReceivingSession,\n RtcpNackResponder,\n RtcpSrReporter,\n RtpPacketizationConfig,\n RtpPacketizer,\n H264RtpPacketizer,\n H265RtpPacketizer,\n AV1RtpPacketizer,\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":";;;;;;;;;AAsBO,SAAS,OAAgB,GAAA;AAC9B,EAAAA,uBAAA,CAAgB,OAAQ,EAAA,CAAA;AAC1B,CAAA;AACgB,SAAA,UAAA,CAAW,OAAiB,EAAuD,EAAA;AACjG,EAAgBA,uBAAA,CAAA,UAAA,CAAW,OAAO,EAAE,CAAA,CAAA;AACtC,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;AA4Bb,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;AAUb,MAAM,yBAETA,uBAAgB,CAAA,uBAAA;AAQb,MAAM,gBAGTA,uBAAgB,CAAA,cAAA;AAIb,MAAM,uBAETA,uBAAgB,CAAA,qBAAA;AAIb,MAAM,oBAETA,uBAAgB,CAAA,kBAAA;AAMb,MAAM,iBAETA,uBAAgB,CAAA,eAAA;AAMb,MAAM,gBAETA,uBAAgB,CAAA,cAAA;AAIb,MAAM,oBAETA,uBAAgB,CAAA,kBAAA;AAIb,MAAM,oBAETA,uBAAgB,CAAA,kBAAA;AAMhBA,uBAAgB,CAAA,iBAAA;AAMhBA,uBAAgB,CAAA,iBAAA;AAIb,MAAM,mBAETA,uBAAgB,CAAA,iBAAA;AAKb,MAAM,iBAAoB,GAAAC,0BAAA;AAEjC,QAAe;AAAA,EACb,UAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,eAAA;AAAA,EACA,iBAAA;AAAA,EACA,aAAA;AAAA,EACA,oBAAA;AAAA,EACA,iBAAA;AAAA,EACA,cAAA;AAAA,EACA,sBAAA;AAAA,EACA,aAAA;AAAA,EACA,iBAAA;AAAA,EACA,iBAAA;AAAA,EACA,gBAAA;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;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -2,7 +2,10 @@
2
2
 
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
- const nodeDataChannel = require("../../../build/Release/node_datachannel.node");
5
+ const loadBinding = require("pkg-prebuilds");
6
+ const bindingOptions = require("../../binding-options");
7
+ const packageRoot = __dirname + "/../../../" || __dirname + "/../../";
8
+ const nodeDataChannel = loadBinding(packageRoot, bindingOptions);
6
9
 
7
10
  exports.default = nodeDataChannel;
8
11
  //# sourceMappingURL=node-datachannel.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"node-datachannel.cjs","sources":["../../../src/lib/node-datachannel.ts"],"sourcesContent":["// @ts-expect-error no types\nimport nodeDataChannel = require('../../build/Release/node_datachannel.node');\nexport default nodeDataChannel;\n"],"names":[],"mappings":";;;;AACA,MAAO,kBAAkB,OAAoB,CAAA,8CAAA;;;;"}
1
+ {"version":3,"file":"node-datachannel.cjs","sources":["../../../src/lib/node-datachannel.ts"],"sourcesContent":["import loadBinding = require('pkg-prebuilds');\nimport bindingOptions = require('../../binding-options');\n\n// `process.env.PACKAGE_ROOT` is injected at build time by the rollup\n// `replace` plugin (see rollup.config.mjs) so that the path is correct both\n// when running from `src/lib/` and from the bundled `dist/<format>/lib/`.\nconst packageRoot = process.env.PACKAGE_ROOT || __dirname + '/../../';\n\n// Load the native binding from the prebuilds folder, falling back to a\n// locally built binary in build/Release or build/Debug.\nconst nodeDataChannel = loadBinding(packageRoot, bindingOptions);\nexport default nodeDataChannel;\n"],"names":[],"mappings":";;;;AAAA,MAAO,cAAc,OAAQ,CAAA,eAAA,CAAA,CAAA;AAC7B,MAAO,iBAAiB,OAAQ,CAAA,uBAAA,CAAA,CAAA;AAKhC,MAAM,WAAA,GAAc,4BAA4B,SAAY,GAAA,SAAA,CAAA;AAItD,MAAA,eAAA,GAAkB,WAAY,CAAA,WAAA,EAAa,cAAc;;;;"}
@@ -6,8 +6,8 @@ import { WebSocket } from './websocket.mjs';
6
6
  function preload() {
7
7
  nodeDataChannel.preload();
8
8
  }
9
- function initLogger(level) {
10
- nodeDataChannel.initLogger(level);
9
+ function initLogger(level, cb) {
10
+ nodeDataChannel.initLogger(level, cb);
11
11
  }
12
12
  function cleanup() {
13
13
  nodeDataChannel.cleanup();
@@ -32,6 +32,8 @@ const RtcpSrReporter = nodeDataChannel.RtcpSrReporter;
32
32
  const RtpPacketizer = nodeDataChannel.RtpPacketizer;
33
33
  const H264RtpPacketizer = nodeDataChannel.H264RtpPacketizer;
34
34
  const H265RtpPacketizer = nodeDataChannel.H265RtpPacketizer;
35
+ nodeDataChannel.VP8RtpPacketizer;
36
+ nodeDataChannel.VP9RtpPacketizer;
35
37
  const AV1RtpPacketizer = nodeDataChannel.AV1RtpPacketizer;
36
38
  const DataChannelStream = DataChannelStream$1;
37
39
  var n = {
@@ -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 NalUnitSeparator,\n ObuPacketization,\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 addH265Codec(payloadType: number): void;\n addVP8Codec(payloadType: number): void;\n addVP9Codec(payloadType: number): void;\n addAV1Codec(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: MediaHandler): 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 RtpPacketizationConfig {\n playoutDelayId: number,\n playoutDelayMin: number,\n playoutDelayMax: number,\n timestamp: number,\n get clockRate(): number\n}\n\nexport const RtpPacketizationConfig: {\n new(ssrc: number, cname: string, payloadType: number, clockRate: number, videoOrientationId?: number): RtpPacketizationConfig\n} = nodeDataChannel.RtpPacketizationConfig\n\nexport interface MediaHandler {\n addToChain(handler: MediaHandler): void\n}\n\nexport interface PacingHandler extends MediaHandler {}\n\nexport const PacingHandler: {\n new (bitsPerSecond: number, sendInterval: number): PacingHandler;\n} = nodeDataChannel.PacingHandler;\n\nexport interface RtcpReceivingSession extends MediaHandler {}\n\nexport const RtcpReceivingSession: {\n new (): RtcpReceivingSession;\n} = nodeDataChannel.RtcpReceivingSession;\n\nexport interface RtcpNackResponder extends MediaHandler {}\n\nexport const RtcpNackResponder: {\n new (maxSize?: number): RtcpNackResponder\n} = nodeDataChannel.RtcpNackResponder;\n\nexport interface RtcpSrReporter extends MediaHandler {\n get rtpConfig(): RtpPacketizationConfig\n}\n\nexport const RtcpSrReporter: {\n new (rtpConfig: RtpPacketizationConfig): RtcpSrReporter\n} = nodeDataChannel.RtcpSrReporter;\n\nexport interface RtpPacketizer extends MediaHandler {\n get rtpConfig(): RtpPacketizationConfig\n}\n\nexport const RtpPacketizer: {\n new (rtpConfig: RtpPacketizationConfig): RtpPacketizer\n} = nodeDataChannel.RtpPacketizer;\n\nexport interface H264RtpPacketizer extends RtpPacketizer {}\n\nexport const H264RtpPacketizer: {\n new (separator: NalUnitSeparator, rtpConfig: RtpPacketizationConfig, maxFragmentSize?: number): H264RtpPacketizer\n} = nodeDataChannel.H264RtpPacketizer\n\nexport interface H265RtpPacketizer extends RtpPacketizer {}\n\nexport const H265RtpPacketizer: {\n new (separator: NalUnitSeparator, rtpConfig: RtpPacketizationConfig, maxFragmentSize?: number): H265RtpPacketizer\n} = nodeDataChannel.H265RtpPacketizer\n\nexport interface AV1RtpPacketizer extends RtpPacketizer {}\n\nexport const AV1RtpPacketizer: {\n new (packetization: ObuPacketization, rtpConfig: RtpPacketizationConfig, maxFragmentSize?: number): AV1RtpPacketizer\n} = nodeDataChannel.AV1RtpPacketizer\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 PacingHandler,\n RtcpReceivingSession,\n RtcpNackResponder,\n RtcpSrReporter,\n RtpPacketizationConfig,\n RtpPacketizer,\n H264RtpPacketizer,\n H265RtpPacketizer,\n AV1RtpPacketizer,\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":";;;;;AAsBO,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;AA4Bb,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;AAUb,MAAM,yBAET,eAAgB,CAAA,uBAAA;AAQb,MAAM,gBAET,eAAgB,CAAA,cAAA;AAIb,MAAM,uBAET,eAAgB,CAAA,qBAAA;AAIb,MAAM,oBAET,eAAgB,CAAA,kBAAA;AAMb,MAAM,iBAET,eAAgB,CAAA,eAAA;AAMb,MAAM,gBAET,eAAgB,CAAA,cAAA;AAIb,MAAM,oBAET,eAAgB,CAAA,kBAAA;AAIb,MAAM,oBAET,eAAgB,CAAA,kBAAA;AAIb,MAAM,mBAET,eAAgB,CAAA,iBAAA;AAKb,MAAM,iBAAoB,GAAAA,oBAAA;AAEjC,QAAe;AAAA,EACb,UAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,eAAA;AAAA,EACA,iBAAA;AAAA,EACA,aAAA;AAAA,EACA,oBAAA;AAAA,EACA,iBAAA;AAAA,EACA,cAAA;AAAA,EACA,sBAAA;AAAA,EACA,aAAA;AAAA,EACA,iBAAA;AAAA,EACA,iBAAA;AAAA,EACA,gBAAA;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
+ {"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 NalUnitSeparator,\n ObuPacketization,\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, cb?: (level: LogLevel, message: string) => void): void {\n nodeDataChannel.initLogger(level, cb);\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 addH265Codec(payloadType: number): void;\n addVP8Codec(payloadType: number): void;\n addVP9Codec(payloadType: number): void;\n addAV1Codec(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: MediaHandler): 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 RtpPacketizationConfig {\n playoutDelayId: number,\n playoutDelayMin: number,\n playoutDelayMax: number,\n timestamp: number,\n get clockRate(): number\n}\n\nexport const RtpPacketizationConfig: {\n new(ssrc: number, cname: string, payloadType: number, clockRate: number, videoOrientationId?: number): RtpPacketizationConfig\n} = nodeDataChannel.RtpPacketizationConfig\n\nexport interface MediaHandler {\n addToChain(handler: MediaHandler): void\n}\n\nexport interface PacingHandler extends MediaHandler {}\n\nexport const PacingHandler: {\n new (bitsPerSecond: number, sendInterval: number): PacingHandler;\n setBitrate(bitsPerSecond: number): void;\n} = nodeDataChannel.PacingHandler;\n\nexport interface RtcpReceivingSession extends MediaHandler {}\n\nexport const RtcpReceivingSession: {\n new (): RtcpReceivingSession;\n} = nodeDataChannel.RtcpReceivingSession;\n\nexport interface RtcpNackResponder extends MediaHandler {}\n\nexport const RtcpNackResponder: {\n new (maxSize?: number): RtcpNackResponder\n} = nodeDataChannel.RtcpNackResponder;\n\nexport interface RtcpSrReporter extends MediaHandler {\n get rtpConfig(): RtpPacketizationConfig\n}\n\nexport const RtcpSrReporter: {\n new (rtpConfig: RtpPacketizationConfig): RtcpSrReporter\n} = nodeDataChannel.RtcpSrReporter;\n\nexport interface RtpPacketizer extends MediaHandler {\n get rtpConfig(): RtpPacketizationConfig\n}\n\nexport const RtpPacketizer: {\n new (rtpConfig: RtpPacketizationConfig): RtpPacketizer\n} = nodeDataChannel.RtpPacketizer;\n\nexport interface H264RtpPacketizer extends RtpPacketizer {}\n\nexport const H264RtpPacketizer: {\n new (separator: NalUnitSeparator, rtpConfig: RtpPacketizationConfig, maxFragmentSize?: number): H264RtpPacketizer\n} = nodeDataChannel.H264RtpPacketizer\n\nexport interface H265RtpPacketizer extends RtpPacketizer {}\n\nexport const H265RtpPacketizer: {\n new (separator: NalUnitSeparator, rtpConfig: RtpPacketizationConfig, maxFragmentSize?: number): H265RtpPacketizer\n} = nodeDataChannel.H265RtpPacketizer\n\nexport interface VP8RtpPacketizer extends RtpPacketizer {}\n\nexport const VP8RtpPacketizer: {\n new (rtpConfig: RtpPacketizationConfig, maxFragmentSize?: number): VP8RtpPacketizer\n} = nodeDataChannel.VP8RtpPacketizer\n\nexport interface VP9RtpPacketizer extends RtpPacketizer {}\n\nexport const VP9RtpPacketizer: {\n new (rtpConfig: RtpPacketizationConfig, maxFragmentSize?: number): VP9RtpPacketizer\n} = nodeDataChannel.VP9RtpPacketizer\n\nexport interface AV1RtpPacketizer extends RtpPacketizer {}\n\nexport const AV1RtpPacketizer: {\n new (packetization: ObuPacketization, rtpConfig: RtpPacketizationConfig, maxFragmentSize?: number): AV1RtpPacketizer\n} = nodeDataChannel.AV1RtpPacketizer\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 PacingHandler,\n RtcpReceivingSession,\n RtcpNackResponder,\n RtcpSrReporter,\n RtpPacketizationConfig,\n RtpPacketizer,\n H264RtpPacketizer,\n H265RtpPacketizer,\n AV1RtpPacketizer,\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":";;;;;AAsBO,SAAS,OAAgB,GAAA;AAC9B,EAAA,eAAA,CAAgB,OAAQ,EAAA,CAAA;AAC1B,CAAA;AACgB,SAAA,UAAA,CAAW,OAAiB,EAAuD,EAAA;AACjG,EAAgB,eAAA,CAAA,UAAA,CAAW,OAAO,EAAE,CAAA,CAAA;AACtC,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;AA4Bb,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;AAUb,MAAM,yBAET,eAAgB,CAAA,uBAAA;AAQb,MAAM,gBAGT,eAAgB,CAAA,cAAA;AAIb,MAAM,uBAET,eAAgB,CAAA,qBAAA;AAIb,MAAM,oBAET,eAAgB,CAAA,kBAAA;AAMb,MAAM,iBAET,eAAgB,CAAA,eAAA;AAMb,MAAM,gBAET,eAAgB,CAAA,cAAA;AAIb,MAAM,oBAET,eAAgB,CAAA,kBAAA;AAIb,MAAM,oBAET,eAAgB,CAAA,kBAAA;AAMhB,eAAgB,CAAA,iBAAA;AAMhB,eAAgB,CAAA,iBAAA;AAIb,MAAM,mBAET,eAAgB,CAAA,iBAAA;AAKb,MAAM,iBAAoB,GAAAA,oBAAA;AAEjC,QAAe;AAAA,EACb,UAAA;AAAA,EACA,OAAA;AAAA,EACA,OAAA;AAAA,EACA,eAAA;AAAA,EACA,iBAAA;AAAA,EACA,aAAA;AAAA,EACA,oBAAA;AAAA,EACA,iBAAA;AAAA,EACA,cAAA;AAAA,EACA,sBAAA;AAAA,EACA,aAAA;AAAA,EACA,iBAAA;AAAA,EACA,iBAAA;AAAA,EACA,gBAAA;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;;;;"}
@@ -6,7 +6,10 @@ import cjsModule from 'node:module';
6
6
  const __filename = cjsUrl.fileURLToPath(import.meta.url);
7
7
  const __dirname = cjsPath.dirname(__filename);
8
8
  const require = cjsModule.createRequire(import.meta.url);
9
- const nodeDataChannel = require("../../../build/Release/node_datachannel.node");
9
+ const loadBinding = require("pkg-prebuilds");
10
+ const bindingOptions = require("../../binding-options");
11
+ const packageRoot = __dirname + "/../../../" || __dirname + "/../../";
12
+ const nodeDataChannel = loadBinding(packageRoot, bindingOptions);
10
13
 
11
14
  export { nodeDataChannel as default };
12
15
  //# sourceMappingURL=node-datachannel.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"node-datachannel.mjs","sources":["../../../src/lib/node-datachannel.ts"],"sourcesContent":["// @ts-expect-error no types\nimport nodeDataChannel = require('../../build/Release/node_datachannel.node');\nexport default nodeDataChannel;\n"],"names":[],"mappings":";;;;;;;;AACA;;"}
1
+ {"version":3,"file":"node-datachannel.mjs","sources":["../../../src/lib/node-datachannel.ts"],"sourcesContent":["import loadBinding = require('pkg-prebuilds');\nimport bindingOptions = require('../../binding-options');\n\n// `process.env.PACKAGE_ROOT` is injected at build time by the rollup\n// `replace` plugin (see rollup.config.mjs) so that the path is correct both\n// when running from `src/lib/` and from the bundled `dist/<format>/lib/`.\nconst packageRoot = process.env.PACKAGE_ROOT || __dirname + '/../../';\n\n// Load the native binding from the prebuilds folder, falling back to a\n// locally built binary in build/Release or build/Debug.\nconst nodeDataChannel = loadBinding(packageRoot, bindingOptions);\nexport default nodeDataChannel;\n"],"names":[],"mappings":";;;;;;;;AAAA;AACA;AAKA;AAIM;;"}
@@ -5,7 +5,7 @@ import { WebSocketServer } from './websocket-server.js';
5
5
  import { WebSocket } from './websocket.js';
6
6
 
7
7
  declare function preload(): void;
8
- declare function initLogger(level: LogLevel): void;
8
+ declare function initLogger(level: LogLevel, cb?: (level: LogLevel, message: string) => void): void;
9
9
  declare function cleanup(): void;
10
10
  declare function setSctpSettings(settings: SctpSettings): void;
11
11
  declare function getLibraryVersion(): string;
@@ -172,6 +172,7 @@ interface PacingHandler extends MediaHandler {
172
172
  }
173
173
  declare const PacingHandler: {
174
174
  new (bitsPerSecond: number, sendInterval: number): PacingHandler;
175
+ setBitrate(bitsPerSecond: number): void;
175
176
  };
176
177
  interface RtcpReceivingSession extends MediaHandler {
177
178
  }
@@ -205,6 +206,16 @@ interface H265RtpPacketizer extends RtpPacketizer {
205
206
  declare const H265RtpPacketizer: {
206
207
  new (separator: NalUnitSeparator, rtpConfig: RtpPacketizationConfig, maxFragmentSize?: number): H265RtpPacketizer;
207
208
  };
209
+ interface VP8RtpPacketizer extends RtpPacketizer {
210
+ }
211
+ declare const VP8RtpPacketizer: {
212
+ new (rtpConfig: RtpPacketizationConfig, maxFragmentSize?: number): VP8RtpPacketizer;
213
+ };
214
+ interface VP9RtpPacketizer extends RtpPacketizer {
215
+ }
216
+ declare const VP9RtpPacketizer: {
217
+ new (rtpConfig: RtpPacketizationConfig, maxFragmentSize?: number): VP9RtpPacketizer;
218
+ };
208
219
  interface AV1RtpPacketizer extends RtpPacketizer {
209
220
  }
210
221
  declare const AV1RtpPacketizer: {
@@ -218,7 +229,10 @@ declare const _default: {
218
229
  preload: typeof preload;
219
230
  setSctpSettings: typeof setSctpSettings;
220
231
  getLibraryVersion: typeof getLibraryVersion;
221
- PacingHandler: new (bitsPerSecond: number, sendInterval: number) => PacingHandler;
232
+ PacingHandler: {
233
+ new (bitsPerSecond: number, sendInterval: number): PacingHandler;
234
+ setBitrate(bitsPerSecond: number): void;
235
+ };
222
236
  RtcpReceivingSession: new () => RtcpReceivingSession;
223
237
  RtcpNackResponder: new (maxSize?: number) => RtcpNackResponder;
224
238
  RtcpSrReporter: new (rtpConfig: RtpPacketizationConfig) => RtcpSrReporter;
@@ -238,4 +252,4 @@ declare const _default: {
238
252
  IceUdpMuxListener: new (port: number, address?: string) => IceUdpMuxListener;
239
253
  };
240
254
 
241
- export { AV1RtpPacketizer, Audio, CertificateFingerprint, Channel, DataChannel, DataChannelInitConfig, DataChannelStream, DescriptionType, Direction, H264RtpPacketizer, H265RtpPacketizer, IceUdpMuxListener, IceUdpMuxRequest, LocalDescriptionInit, LogLevel, type MediaHandler, NalUnitSeparator, ObuPacketization, PacingHandler, PeerConnection, RTCIceConnectionState, RTCIceGatheringState, RTCPeerConnectionState, RTCSignalingState, RtcConfig, RtcpNackResponder, RtcpReceivingSession, RtcpSrReporter, RtpPacketizationConfig, RtpPacketizer, SctpSettings, SelectedCandidateInfo, Track, Video, WebSocket, WebSocketServer, WebSocketServerConfiguration, cleanup, _default as default, getLibraryVersion, initLogger, preload, setSctpSettings };
255
+ export { AV1RtpPacketizer, Audio, CertificateFingerprint, Channel, DataChannel, DataChannelInitConfig, DataChannelStream, DescriptionType, Direction, H264RtpPacketizer, H265RtpPacketizer, IceUdpMuxListener, IceUdpMuxRequest, LocalDescriptionInit, LogLevel, type MediaHandler, NalUnitSeparator, ObuPacketization, PacingHandler, PeerConnection, RTCIceConnectionState, RTCIceGatheringState, RTCPeerConnectionState, RTCSignalingState, RtcConfig, RtcpNackResponder, RtcpReceivingSession, RtcpSrReporter, RtpPacketizationConfig, RtpPacketizer, SctpSettings, SelectedCandidateInfo, Track, VP8RtpPacketizer, VP9RtpPacketizer, Video, WebSocket, WebSocketServer, WebSocketServerConfiguration, cleanup, _default as default, getLibraryVersion, initLogger, preload, setSctpSettings };
@@ -109,6 +109,7 @@ interface SelectedCandidateInfo {
109
109
  type Direction = 'SendOnly' | 'RecvOnly' | 'SendRecv' | 'Inactive' | 'Unknown';
110
110
  interface IceUdpMuxRequest {
111
111
  ufrag: string;
112
+ localUfrag: string;
112
113
  host: string;
113
114
  port: number;
114
115
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lng2004/node-datachannel",
3
- "version": "0.32.0-20260202",
3
+ "version": "0.32.3-20260815",
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",
@@ -33,13 +33,15 @@
33
33
  "node": ">=18.20.0"
34
34
  },
35
35
  "scripts": {
36
- "install": "prebuild-install -r napi || (npm install --ignore-scripts --production=false && npm run _prebuild)",
37
- "install:nice": "npm run clean && npm install --ignore-scripts --production=false && cmake-js configure --CDUSE_NICE=1 && cmake-js build",
36
+ "install": "pkg-prebuilds-verify ./binding-options.js || (npm install --ignore-scripts --production=false && npm run compile)",
37
+ "rebuild": "pkg-prebuilds-verify ./binding-options.js || (npm run build:mbedtls && cmake-js rebuild)",
38
+ "install:nice": "npm run clean && npm install --ignore-scripts --production=false && npm run build:mbedtls && cmake-js configure --CDUSE_NICE=1 && cmake-js build",
38
39
  "install:gnu": "npm run clean && npm install --ignore-scripts --production=false && cmake-js configure --CDUSE_GNUTLS=1 && cmake-js build",
40
+ "build:mbedtls": "node ./scripts/build-mbedtls.js",
39
41
  "build": "npm run compile && npm run build:tsc",
40
- "compile": "cmake-js build",
42
+ "compile": "npm run build:mbedtls && cmake-js build",
41
43
  "build:debug": "npm run compile:debug && npm run build:tsc",
42
- "compile:debug": "cmake-js configure -D && cmake-js build -D",
44
+ "compile:debug": "npm run build:mbedtls && cmake-js configure -D && cmake-js build -D",
43
45
  "build:tsc": "rimraf dist && rollup -c",
44
46
  "build:tsc:watch": "rollup -c -w",
45
47
  "clean": "rimraf dist build",
@@ -49,11 +51,19 @@
49
51
  "test:wpt": "npm run run:wpt:server & (sleep 8 && (npm run run:wpt:test | tee test/wpt-tests/last-test-results.md) )",
50
52
  "wpt:server": "cd test/wpt-tests/wpt && ./wpt serve",
51
53
  "wpt:test": "ts-node test/wpt-tests/index.ts",
52
- "_prebuild": "prebuild -r napi --backend cmake-js",
53
54
  "prepack": "npm run build:tsc",
54
55
  "prettier": "prettier --write .",
55
56
  "format-cpp": "find src/cpp \\( -name \"*.h\" -o -name \"*.cpp\" \\) -exec clang-format -i \"{}\" \\; "
56
57
  },
58
+ "files": [
59
+ "dist",
60
+ "prebuilds",
61
+ "scripts",
62
+ "binding-options.js",
63
+ "src/cpp",
64
+ "CMakeLists.txt",
65
+ "cmake"
66
+ ],
57
67
  "binary": {
58
68
  "napi_versions": [
59
69
  8
@@ -103,7 +113,6 @@
103
113
  "jest": "^29.7.0",
104
114
  "jsdom": "^24.1.1",
105
115
  "node-addon-api": "^7.0.0",
106
- "prebuild": "^13.0.1",
107
116
  "prettier": "^3.3.3",
108
117
  "puppeteer": "^22.14.0",
109
118
  "rimraf": "^5.0.9",
@@ -116,6 +125,6 @@
116
125
  "typescript": "5.4"
117
126
  },
118
127
  "dependencies": {
119
- "prebuild-install": "^7.1.3"
128
+ "pkg-prebuilds": "^1.0.0"
120
129
  }
121
130
  }
@@ -0,0 +1,28 @@
1
+ const { spawnSync } = require('node:child_process');
2
+ const path = require('node:path');
3
+
4
+ const rootDir = path.resolve(__dirname, '..');
5
+ const shellScript = path.join(rootDir, 'scripts', 'build-mbedtls.sh');
6
+ const psScript = path.join(rootDir, 'scripts', 'build-mbedtls.ps1');
7
+
8
+ function run(command, args) {
9
+ const result = spawnSync(command, args, {
10
+ cwd: rootDir,
11
+ env: process.env,
12
+ stdio: 'inherit',
13
+ });
14
+
15
+ if (result.error) {
16
+ throw result.error;
17
+ }
18
+
19
+ if (typeof result.status === 'number' && result.status !== 0) {
20
+ process.exit(result.status);
21
+ }
22
+ }
23
+
24
+ if (process.platform === 'win32') {
25
+ run('powershell', ['-NoProfile', '-ExecutionPolicy', 'Bypass', '-File', psScript]);
26
+ } else {
27
+ run('sh', [shellScript]);
28
+ }
@@ -0,0 +1,84 @@
1
+ $ErrorActionPreference = "Stop"
2
+
3
+ $RootDir = Resolve-Path (Join-Path $PSScriptRoot "..")
4
+ $MbedTlsVersion = if ($env:MBEDTLS_VERSION) { $env:MBEDTLS_VERSION } else { "3.6.1" }
5
+ $MbedTlsTag = "v$MbedTlsVersion"
6
+ $MbedTlsRepo = "https://github.com/Mbed-TLS/mbedtls.git"
7
+
8
+ $MbedTlsRoot = Join-Path $RootDir "deps/mbedtls"
9
+ $MbedTlsSrc = Join-Path $MbedTlsRoot "src"
10
+ $MbedTlsBuild = Join-Path $MbedTlsRoot "build"
11
+ $MbedTlsInstall = if ($env:NDC_MBEDTLS_INSTALL_DIR) { $env:NDC_MBEDTLS_INSTALL_DIR } else { Join-Path $MbedTlsRoot "install" }
12
+ $MbedTlsConfig = Join-Path $MbedTlsSrc "include/mbedtls/mbedtls_config.h"
13
+
14
+ if (-not (Get-Command cmake -ErrorAction SilentlyContinue)) {
15
+ throw "cmake is required to build mbedtls"
16
+ }
17
+
18
+ if (-not (Get-Command git -ErrorAction SilentlyContinue)) {
19
+ throw "git is required to build mbedtls"
20
+ }
21
+
22
+ New-Item -ItemType Directory -Force -Path $MbedTlsRoot | Out-Null
23
+
24
+ if (-not (Test-Path (Join-Path $MbedTlsSrc ".git"))) {
25
+ if (Test-Path $MbedTlsSrc) {
26
+ Remove-Item -Recurse -Force $MbedTlsSrc
27
+ }
28
+ git clone --recursive --depth 1 --branch $MbedTlsTag $MbedTlsRepo $MbedTlsSrc
29
+ } else {
30
+ git -C $MbedTlsSrc fetch --depth 1 origin $MbedTlsTag
31
+ git -C $MbedTlsSrc checkout --force $MbedTlsTag
32
+ }
33
+
34
+ if (Test-Path $MbedTlsConfig) {
35
+ $configText = Get-Content -Path $MbedTlsConfig -Raw
36
+ $updated = $configText -replace '(?m)^//\s*#define MBEDTLS_SSL_DTLS_SRTP', '#define MBEDTLS_SSL_DTLS_SRTP'
37
+ if ($updated -ne $configText) {
38
+ Set-Content -Path $MbedTlsConfig -Value $updated -NoNewline
39
+ }
40
+ }
41
+
42
+ if (Test-Path $MbedTlsBuild) {
43
+ Remove-Item -Recurse -Force $MbedTlsBuild
44
+ }
45
+ if (Test-Path $MbedTlsInstall) {
46
+ Remove-Item -Recurse -Force $MbedTlsInstall
47
+ }
48
+
49
+ $cmakeArgs = @(
50
+ "-S", $MbedTlsSrc,
51
+ "-B", $MbedTlsBuild,
52
+ "-DCMAKE_BUILD_TYPE=Release",
53
+ "-DCMAKE_POSITION_INDEPENDENT_CODE=ON",
54
+ "-DENABLE_PROGRAMS=OFF",
55
+ "-DENABLE_TESTING=OFF",
56
+ "-DUSE_STATIC_MBEDTLS_LIBRARY=ON",
57
+ "-DUSE_SHARED_MBEDTLS_LIBRARY=OFF",
58
+ "-DCMAKE_INSTALL_PREFIX=$MbedTlsInstall"
59
+ )
60
+
61
+ $cmakePlatform = $null
62
+ if ($env:VSCMD_ARG_TGT_ARCH) {
63
+ switch ($env:VSCMD_ARG_TGT_ARCH.ToLowerInvariant()) {
64
+ "x86" { $cmakePlatform = "Win32" }
65
+ "x64" { $cmakePlatform = "x64" }
66
+ "arm" { $cmakePlatform = "ARM" }
67
+ "arm64" { $cmakePlatform = "ARM64" }
68
+ default { Write-Warning "Unknown VSCMD_ARG_TGT_ARCH '$($env:VSCMD_ARG_TGT_ARCH)'; not setting CMake platform." }
69
+ }
70
+ }
71
+
72
+ if ($cmakePlatform) {
73
+ $cmakeArgs += "-A"
74
+ $cmakeArgs += $cmakePlatform
75
+ }
76
+
77
+ if ($env:NDC_MBEDTLS_CMAKE_ARGS) {
78
+ $cmakeArgs += $env:NDC_MBEDTLS_CMAKE_ARGS.Split(' ', [System.StringSplitOptions]::RemoveEmptyEntries)
79
+ }
80
+
81
+ & cmake @cmakeArgs
82
+ & cmake --build $MbedTlsBuild --config Release --target install --parallel
83
+
84
+ Write-Host "Built mbedtls $MbedTlsVersion into $MbedTlsInstall"
@@ -0,0 +1,50 @@
1
+ #!/usr/bin/env sh
2
+ set -eu
3
+
4
+ ROOT_DIR="$(cd "$(dirname "$0")/.." && pwd)"
5
+ MBEDTLS_VERSION="${MBEDTLS_VERSION:-3.6.1}"
6
+ MBEDTLS_GIT_TAG="v${MBEDTLS_VERSION}"
7
+ MBEDTLS_REPO_URL="https://github.com/Mbed-TLS/mbedtls.git"
8
+
9
+ MBEDTLS_ROOT_DIR="${ROOT_DIR}/deps/mbedtls"
10
+ MBEDTLS_SRC_DIR="${MBEDTLS_ROOT_DIR}/src"
11
+ MBEDTLS_BUILD_DIR="${MBEDTLS_ROOT_DIR}/build"
12
+ MBEDTLS_INSTALL_DIR="${NDC_MBEDTLS_INSTALL_DIR:-${MBEDTLS_ROOT_DIR}/install}"
13
+ MBEDTLS_CONFIG_FILE="${MBEDTLS_SRC_DIR}/include/mbedtls/mbedtls_config.h"
14
+
15
+ if ! command -v cmake >/dev/null 2>&1; then
16
+ echo "cmake is required to build mbedtls" >&2
17
+ exit 1
18
+ fi
19
+
20
+ if ! command -v git >/dev/null 2>&1; then
21
+ echo "git is required to build mbedtls" >&2
22
+ exit 1
23
+ fi
24
+
25
+ mkdir -p "${MBEDTLS_ROOT_DIR}"
26
+
27
+ if [ ! -d "${MBEDTLS_SRC_DIR}/.git" ]; then
28
+ rm -rf "${MBEDTLS_SRC_DIR}"
29
+ git clone --recursive --depth 1 --branch "${MBEDTLS_GIT_TAG}" "${MBEDTLS_REPO_URL}" "${MBEDTLS_SRC_DIR}"
30
+ else
31
+ git -C "${MBEDTLS_SRC_DIR}" fetch --depth 1 origin "${MBEDTLS_GIT_TAG}"
32
+ git -C "${MBEDTLS_SRC_DIR}" checkout --force "${MBEDTLS_GIT_TAG}"
33
+ fi
34
+
35
+ if [ -f "${MBEDTLS_CONFIG_FILE}" ] && grep -q '^//[[:space:]]*#define MBEDTLS_SSL_DTLS_SRTP' "${MBEDTLS_CONFIG_FILE}"; then
36
+ sed -i.bak 's|^//[[:space:]]*#define MBEDTLS_SSL_DTLS_SRTP|#define MBEDTLS_SSL_DTLS_SRTP|' "${MBEDTLS_CONFIG_FILE}"
37
+ fi
38
+
39
+ rm -rf "${MBEDTLS_BUILD_DIR}" "${MBEDTLS_INSTALL_DIR}"
40
+
41
+ CMAKE_ARGS="-S ${MBEDTLS_SRC_DIR} -B ${MBEDTLS_BUILD_DIR} -DCMAKE_BUILD_TYPE=Release -DCMAKE_POSITION_INDEPENDENT_CODE=ON -DENABLE_PROGRAMS=OFF -DENABLE_TESTING=OFF -DUSE_STATIC_MBEDTLS_LIBRARY=ON -DUSE_SHARED_MBEDTLS_LIBRARY=OFF -DCMAKE_INSTALL_PREFIX=${MBEDTLS_INSTALL_DIR}"
42
+
43
+ if [ -n "${NDC_MBEDTLS_CMAKE_ARGS:-}" ]; then
44
+ CMAKE_ARGS="${CMAKE_ARGS} ${NDC_MBEDTLS_CMAKE_ARGS}"
45
+ fi
46
+
47
+ cmake ${CMAKE_ARGS}
48
+ cmake --build "${MBEDTLS_BUILD_DIR}" --config Release --target install --parallel
49
+
50
+ echo "Built mbedtls ${MBEDTLS_VERSION} into ${MBEDTLS_INSTALL_DIR}"
@@ -145,6 +145,7 @@ void IceUdpMuxListenerWrapper::onUnhandledStunRequest(const Napi::CallbackInfo &
145
145
  {
146
146
  Napi::Object reqObj = Napi::Object::New(env);
147
147
  reqObj.Set("ufrag", request.remoteUfrag.c_str());
148
+ reqObj.Set("localUfrag", request.localUfrag.c_str());
148
149
  reqObj.Set("host", request.remoteAddress.c_str());
149
150
  reqObj.Set("port", request.remotePort);
150
151
 
package/src/cpp/main.cpp CHANGED
@@ -8,6 +8,8 @@
8
8
  #include "media-av1rtppacketizer-wrapper.h"
9
9
  #include "media-h264rtppacketizer-wrapper.h"
10
10
  #include "media-h265rtppacketizer-wrapper.h"
11
+ #include "media-vp8rtppacketizer-wrapper.h"
12
+ #include "media-vp9rtppacketizer-wrapper.h"
11
13
  #include "media-pacinghandler-wrapper.h"
12
14
  #include "media-rtcpnackresponder-wrapper.h"
13
15
  #include "media-rtcpreceivingsession-wrapper.h"
@@ -32,6 +34,8 @@ Napi::Object InitAll(Napi::Env env, Napi::Object exports)
32
34
  AV1RtpPacketizerWrapper::Init(env, exports);
33
35
  H264RtpPacketizerWrapper::Init(env, exports);
34
36
  H265RtpPacketizerWrapper::Init(env, exports);
37
+ VP8RtpPacketizerWrapper::Init(env, exports);
38
+ VP9RtpPacketizerWrapper::Init(env, exports);
35
39
  PacingHandlerWrapper::Init(env, exports);
36
40
  RtcpNackResponderWrapper::Init(env, exports);
37
41
  RtcpReceivingSessionWrapper::Init(env, exports);