@lng2004/node-datachannel 0.31.0-20251228.2 → 0.32.3-20260813

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 (56) hide show
  1. package/CMakeLists.txt +9 -2
  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 +12 -5
  16. package/src/cpp/ice-udp-mux-listener-wrapper.cpp +1 -0
  17. package/src/cpp/main.cpp +4 -0
  18. package/src/cpp/media-mediahandler-helper.cpp +6 -0
  19. package/src/cpp/media-pacinghandler-wrapper.cpp +18 -0
  20. package/src/cpp/media-pacinghandler-wrapper.h +1 -0
  21. package/src/cpp/media-vp8rtppacketizer-wrapper.cpp +110 -0
  22. package/src/cpp/media-vp8rtppacketizer-wrapper.h +30 -0
  23. package/src/cpp/media-vp9rtppacketizer-wrapper.cpp +110 -0
  24. package/src/cpp/media-vp9rtppacketizer-wrapper.h +30 -0
  25. package/.clang-format +0 -17
  26. package/.editorconfig +0 -12
  27. package/.eslintignore +0 -8
  28. package/.eslintrc.json +0 -27
  29. package/.gitmodules +0 -3
  30. package/.prettierignore +0 -7
  31. package/.prettierrc +0 -13
  32. package/API.md +0 -247
  33. package/BULDING.md +0 -33
  34. package/jest.config.ts +0 -14
  35. package/rollup.config.mjs +0 -72
  36. package/src/index.ts +0 -9
  37. package/src/lib/datachannel-stream.ts +0 -100
  38. package/src/lib/index.ts +0 -290
  39. package/src/lib/node-datachannel.ts +0 -3
  40. package/src/lib/types.ts +0 -168
  41. package/src/lib/websocket-server.ts +0 -37
  42. package/src/lib/websocket.ts +0 -26
  43. package/src/polyfill/Events.ts +0 -82
  44. package/src/polyfill/Exception.ts +0 -37
  45. package/src/polyfill/README.md +0 -41
  46. package/src/polyfill/RTCCertificate.ts +0 -21
  47. package/src/polyfill/RTCDataChannel.ts +0 -225
  48. package/src/polyfill/RTCDtlsTransport.ts +0 -46
  49. package/src/polyfill/RTCError.ts +0 -78
  50. package/src/polyfill/RTCIceCandidate.ts +0 -128
  51. package/src/polyfill/RTCIceTransport.ts +0 -90
  52. package/src/polyfill/RTCPeerConnection.ts +0 -527
  53. package/src/polyfill/RTCSctpTransport.ts +0 -51
  54. package/src/polyfill/RTCSessionDescription.ts +0 -41
  55. package/src/polyfill/index.ts +0 -38
  56. 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.31.0)
5
+ project(node_datachannel VERSION 0.32.3)
6
6
 
7
7
  # compile_commands.json
8
8
  # -----------------------------------
@@ -36,7 +36,7 @@ include(FetchContent)
36
36
  FetchContent_Declare(
37
37
  libdatachannel
38
38
  GIT_REPOSITORY https://github.com/paullouisageneau/libdatachannel.git
39
- GIT_TAG "v0.24.0"
39
+ GIT_TAG a2627fb96c85c75064676ec2b1131d3779c1fc2a
40
40
  )
41
41
 
42
42
  option(NO_MEDIA "Disable media transport support in libdatachannel" OFF)
@@ -69,6 +69,8 @@ if(NOT NO_MEDIA)
69
69
  src/cpp/media-h26xseparator.cpp
70
70
  src/cpp/media-h264rtppacketizer-wrapper.cpp
71
71
  src/cpp/media-h265rtppacketizer-wrapper.cpp
72
+ src/cpp/media-vp8rtppacketizer-wrapper.cpp
73
+ src/cpp/media-vp9rtppacketizer-wrapper.cpp
72
74
  src/cpp/media-mediahandler-helper.cpp
73
75
  src/cpp/media-pacinghandler-wrapper.cpp
74
76
  src/cpp/media-rtcpnackresponder-wrapper.cpp
@@ -128,6 +130,11 @@ endif()
128
130
 
129
131
  target_link_libraries(${PROJECT_NAME} PRIVATE ${LINK_LIBRARIES})
130
132
 
133
+ if(UNIX AND NOT APPLE)
134
+ target_compile_options(${PROJECT_NAME} PRIVATE -fvisibility=hidden -fvisibility-inlines-hidden)
135
+ target_link_options(${PROJECT_NAME} PRIVATE -Wl,--exclude-libs,ALL)
136
+ endif()
137
+
131
138
  if(MSVC AND CMAKE_JS_NODELIB_DEF AND CMAKE_JS_NODELIB_TARGET)
132
139
  # Generate node.lib
133
140
  execute_process(COMMAND ${CMAKE_AR} /def:${CMAKE_JS_NODELIB_DEF} /out:${CMAKE_JS_NODELIB_TARGET} ${CMAKE_STATIC_LINKER_FLAGS})
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.31.0-20251228.2",
3
+ "version": "0.32.3-20260813",
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,7 +33,8 @@
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)",
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 || cmake-js rebuild",
37
38
  "install:nice": "npm run clean && npm install --ignore-scripts --production=false && 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",
39
40
  "build": "npm run compile && npm run build:tsc",
@@ -49,11 +50,18 @@
49
50
  "test:wpt": "npm run run:wpt:server & (sleep 8 && (npm run run:wpt:test | tee test/wpt-tests/last-test-results.md) )",
50
51
  "wpt:server": "cd test/wpt-tests/wpt && ./wpt serve",
51
52
  "wpt:test": "ts-node test/wpt-tests/index.ts",
52
- "_prebuild": "prebuild -r napi --backend cmake-js",
53
53
  "prepack": "npm run build:tsc",
54
54
  "prettier": "prettier --write .",
55
55
  "format-cpp": "find src/cpp \\( -name \"*.h\" -o -name \"*.cpp\" \\) -exec clang-format -i \"{}\" \\; "
56
56
  },
57
+ "files": [
58
+ "dist",
59
+ "prebuilds",
60
+ "binding-options.js",
61
+ "src/cpp",
62
+ "CMakeLists.txt",
63
+ "cmake"
64
+ ],
57
65
  "binary": {
58
66
  "napi_versions": [
59
67
  8
@@ -103,7 +111,6 @@
103
111
  "jest": "^29.7.0",
104
112
  "jsdom": "^24.1.1",
105
113
  "node-addon-api": "^7.0.0",
106
- "prebuild": "^13.0.1",
107
114
  "prettier": "^3.3.3",
108
115
  "puppeteer": "^22.14.0",
109
116
  "rimraf": "^5.0.9",
@@ -116,6 +123,6 @@
116
123
  "typescript": "5.4"
117
124
  },
118
125
  "dependencies": {
119
- "prebuild-install": "^7.1.3"
126
+ "pkg-prebuilds": "^1.0.0"
120
127
  }
121
128
  }
@@ -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);
@@ -2,6 +2,8 @@
2
2
  #include "media-av1rtppacketizer-wrapper.h"
3
3
  #include "media-h264rtppacketizer-wrapper.h"
4
4
  #include "media-h265rtppacketizer-wrapper.h"
5
+ #include "media-vp8rtppacketizer-wrapper.h"
6
+ #include "media-vp9rtppacketizer-wrapper.h"
5
7
  #include "media-pacinghandler-wrapper.h"
6
8
  #include "media-rtcpnackresponder-wrapper.h"
7
9
  #include "media-rtcpreceivingsession-wrapper.h"
@@ -17,6 +19,10 @@ std::shared_ptr<rtc::MediaHandler> asMediaHandler(const Napi::Object &val)
17
19
  mediaHandler = H264RtpPacketizerWrapper::Unwrap(val)->getPacketizerInstance();
18
20
  else if (val.InstanceOf(H265RtpPacketizerWrapper::constructor.Value()))
19
21
  mediaHandler = H265RtpPacketizerWrapper::Unwrap(val)->getPacketizerInstance();
22
+ else if (val.InstanceOf(VP8RtpPacketizerWrapper::constructor.Value()))
23
+ mediaHandler = VP8RtpPacketizerWrapper::Unwrap(val)->getPacketizerInstance();
24
+ else if (val.InstanceOf(VP9RtpPacketizerWrapper::constructor.Value()))
25
+ mediaHandler = VP9RtpPacketizerWrapper::Unwrap(val)->getPacketizerInstance();
20
26
  else if (val.InstanceOf(PacingHandlerWrapper::constructor.Value()))
21
27
  mediaHandler = PacingHandlerWrapper::Unwrap(val)->getHandlerInstance();
22
28
  else if (val.InstanceOf(RtcpNackResponderWrapper::constructor.Value()))
@@ -12,6 +12,7 @@ Napi::Object PacingHandlerWrapper::Init(Napi::Env env, Napi::Object exports)
12
12
  {
13
13
  // Instance Methods
14
14
  InstanceMethod("addToChain", &PacingHandlerWrapper::addToChain),
15
+ InstanceMethod("setBitrate", &PacingHandlerWrapper::setBitrate),
15
16
  });
16
17
 
17
18
  // If this is not the first call, we don't want to reassign the constructor (hot-reload problem)
@@ -77,3 +78,20 @@ void PacingHandlerWrapper::addToChain(const Napi::CallbackInfo &info)
77
78
  }
78
79
  mHandlerPtr->addToChain(mediaHandler);
79
80
  }
81
+
82
+ void PacingHandlerWrapper::setBitrate(const Napi::CallbackInfo &info)
83
+ {
84
+ auto env = info.Env();
85
+ if (info.Length() < 1 || !info[0].IsNumber())
86
+ {
87
+ Napi::TypeError::New(env, "Expected a number").ThrowAsJavaScriptException();
88
+ return;
89
+ }
90
+ auto bitrate = info[0].As<Napi::Number>().DoubleValue();
91
+ if (bitrate <= 0)
92
+ {
93
+ Napi::RangeError::New(env, "Bitrate must be positive").ThrowAsJavaScriptException();
94
+ return;
95
+ }
96
+ mHandlerPtr->setBitrate(bitrate);
97
+ }
@@ -18,6 +18,7 @@ public:
18
18
 
19
19
  // Functions
20
20
  void addToChain(const Napi::CallbackInfo &info);
21
+ void setBitrate(const Napi::CallbackInfo &info);
21
22
 
22
23
  // Callbacks
23
24
 
@@ -0,0 +1,110 @@
1
+ #include "media-vp8rtppacketizer-wrapper.h"
2
+ #include "media-rtppacketizationconfig-wrapper.h"
3
+ #include "media-mediahandler-helper.h"
4
+
5
+ Napi::FunctionReference VP8RtpPacketizerWrapper::constructor = Napi::FunctionReference();
6
+
7
+ Napi::Object VP8RtpPacketizerWrapper::Init(Napi::Env env, Napi::Object exports)
8
+ {
9
+ Napi::HandleScope scope(env);
10
+
11
+ Napi::Function func = Napi::ObjectWrap<VP8RtpPacketizerWrapper>::DefineClass(env, "VP8RtpPacketizer",
12
+ {
13
+ // Instance Methods
14
+ InstanceMethod("addToChain", &VP8RtpPacketizerWrapper::addToChain),
15
+ // Accessors
16
+ InstanceAccessor("rtpConfig", &VP8RtpPacketizerWrapper::getRtpPacketizationConfig, nullptr),
17
+ });
18
+
19
+ // If this is not the first call, we don't want to reassign the constructor (hot-reload problem)
20
+ if (constructor.IsEmpty())
21
+ {
22
+ constructor = Napi::Persistent(func);
23
+ constructor.SuppressDestruct();
24
+ }
25
+
26
+ exports.Set("VP8RtpPacketizer", func);
27
+ return exports;
28
+ }
29
+
30
+ VP8RtpPacketizerWrapper::VP8RtpPacketizerWrapper(const Napi::CallbackInfo &info)
31
+ : Napi::ObjectWrap<VP8RtpPacketizerWrapper>(info)
32
+ {
33
+ Napi::Env env = info.Env();
34
+
35
+ if (info.Length() < 2)
36
+ {
37
+ Napi::Error::New(env, "Expected 2 parameters").ThrowAsJavaScriptException();
38
+ return;
39
+ }
40
+
41
+ if (!info[0].IsObject())
42
+ {
43
+ Napi::TypeError::New(env, "rtpConfig must be a RtpPacketizationConfig instance").ThrowAsJavaScriptException();
44
+ return;
45
+ }
46
+ auto obj = info[0].As<Napi::Object>();
47
+ if (!obj.InstanceOf(RtpPacketizationConfigWrapper::constructor.Value()))
48
+ {
49
+ Napi::TypeError::New(env, "rtpConfig must be a RtpPacketizationConfig instance").ThrowAsJavaScriptException();
50
+ return;
51
+ }
52
+ // store original JS object so we can return it later
53
+ mRtpConfigObject = Napi::Persistent(obj);
54
+ mRtpConfigObject.SuppressDestruct();
55
+ auto rtpConfig = RtpPacketizationConfigWrapper::Unwrap(obj)->getConfigInstance();
56
+
57
+ size_t maxFragmentSize = rtc::RtpPacketizer::DefaultMaxFragmentSize;
58
+ if (info.Length() >= 2)
59
+ {
60
+ if (!info[1].IsNumber())
61
+ {
62
+ Napi::TypeError::New(env, "maxFragmentSize must be a number").ThrowAsJavaScriptException();
63
+ return;
64
+ }
65
+ maxFragmentSize = info[1].As<Napi::Number>().Uint32Value();
66
+ }
67
+
68
+ mPacketizerPtr = std::make_unique<rtc::VP8RtpPacketizer>(rtpConfig, maxFragmentSize);
69
+ }
70
+
71
+ VP8RtpPacketizerWrapper::~VP8RtpPacketizerWrapper()
72
+ {
73
+ mPacketizerPtr.reset();
74
+ mRtpConfigObject.Reset();
75
+ }
76
+
77
+ std::shared_ptr<rtc::VP8RtpPacketizer> VP8RtpPacketizerWrapper::getPacketizerInstance() { return mPacketizerPtr; }
78
+
79
+ void VP8RtpPacketizerWrapper::addToChain(const Napi::CallbackInfo &info)
80
+ {
81
+ auto env = info.Env();
82
+ if (info.Length() < 1 || !info[0].IsObject())
83
+ {
84
+ Napi::TypeError::New(env, "Expected a MediaHandler instance").ThrowAsJavaScriptException();
85
+ return;
86
+ }
87
+ auto mediaHandler = asMediaHandler(info[0].As<Napi::Object>());
88
+ if (!mediaHandler)
89
+ {
90
+ Napi::TypeError::New(env, "Expected a MediaHandler instance. If this error is unexpected, please report a bug!")
91
+ .ThrowAsJavaScriptException();
92
+ return;
93
+ }
94
+ mPacketizerPtr->addToChain(mediaHandler);
95
+ }
96
+
97
+ Napi::Value VP8RtpPacketizerWrapper::getRtpPacketizationConfig(const Napi::CallbackInfo &info)
98
+ {
99
+ Napi::Env env = info.Env();
100
+ if (!mPacketizerPtr)
101
+ {
102
+ Napi::Error::New(env, "getRtpPacketizationConfig() called on destroyed packetizer").ThrowAsJavaScriptException();
103
+ return env.Null();
104
+ }
105
+
106
+ if (mRtpConfigObject.IsEmpty())
107
+ return env.Null();
108
+
109
+ return mRtpConfigObject.Value();
110
+ }
@@ -0,0 +1,30 @@
1
+ #ifndef MEDIA_VP8RTPPACKETIZER_WRAPPER_H
2
+ #define MEDIA_VP8RTPPACKETIZER_WRAPPER_H
3
+
4
+ #include <memory>
5
+ #include <unordered_set>
6
+
7
+ #include <napi.h>
8
+ #include <rtc/rtc.hpp>
9
+
10
+ class VP8RtpPacketizerWrapper : public Napi::ObjectWrap<VP8RtpPacketizerWrapper>
11
+ {
12
+ public:
13
+ static Napi::FunctionReference constructor;
14
+ static Napi::Object Init(Napi::Env env, Napi::Object exports);
15
+ VP8RtpPacketizerWrapper(const Napi::CallbackInfo &info);
16
+ ~VP8RtpPacketizerWrapper();
17
+ std::shared_ptr<rtc::VP8RtpPacketizer> getPacketizerInstance();
18
+
19
+ // Functions
20
+ Napi::Value getRtpPacketizationConfig(const Napi::CallbackInfo &info);
21
+ void addToChain(const Napi::CallbackInfo &info);
22
+
23
+ // Callbacks
24
+
25
+ private:
26
+ std::shared_ptr<rtc::VP8RtpPacketizer> mPacketizerPtr = nullptr;
27
+ Napi::ObjectReference mRtpConfigObject;
28
+ };
29
+
30
+ #endif // MEDIA_VP8RTPPACKETIZER_WRAPPER_H