node-datachannel 0.31.0 → 0.32.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/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.1)
6
6
 
7
7
  # compile_commands.json
8
8
  # -----------------------------------
@@ -70,6 +70,7 @@ if(NOT NO_MEDIA)
70
70
  src/cpp/media-h264rtppacketizer-wrapper.cpp
71
71
  src/cpp/media-h265rtppacketizer-wrapper.cpp
72
72
  src/cpp/media-mediahandler-helper.cpp
73
+ src/cpp/media-pacinghandler-wrapper.cpp
73
74
  src/cpp/media-rtcpnackresponder-wrapper.cpp
74
75
  src/cpp/media-rtcpreceivingsession-wrapper.cpp
75
76
  src/cpp/media-rtcpsrreporter-wrapper.cpp
@@ -127,6 +128,11 @@ endif()
127
128
 
128
129
  target_link_libraries(${PROJECT_NAME} PRIVATE ${LINK_LIBRARIES})
129
130
 
131
+ if(UNIX AND NOT APPLE)
132
+ target_compile_options(${PROJECT_NAME} PRIVATE -fvisibility=hidden -fvisibility-inlines-hidden)
133
+ target_link_options(${PROJECT_NAME} PRIVATE -Wl,--exclude-libs,ALL)
134
+ endif()
135
+
130
136
  if(MSVC AND CMAKE_JS_NODELIB_DEF AND CMAKE_JS_NODELIB_TARGET)
131
137
  # Generate node.lib
132
138
  execute_process(COMMAND ${CMAKE_AR} /def:${CMAKE_JS_NODELIB_DEF} /out:${CMAKE_JS_NODELIB_TARGET} ${CMAKE_STATIC_LINKER_FLAGS})
@@ -29,6 +29,7 @@ const DataChannel = nodeDatachannel.default.DataChannel;
29
29
  const PeerConnection = nodeDatachannel.default.PeerConnection;
30
30
  const IceUdpMuxListener = nodeDatachannel.default.IceUdpMuxListener;
31
31
  const RtpPacketizationConfig = nodeDatachannel.default.RtpPacketizationConfig;
32
+ const PacingHandler = nodeDatachannel.default.PacingHandler;
32
33
  const RtcpReceivingSession = nodeDatachannel.default.RtcpReceivingSession;
33
34
  const RtcpNackResponder = nodeDatachannel.default.RtcpNackResponder;
34
35
  const RtcpSrReporter = nodeDatachannel.default.RtcpSrReporter;
@@ -43,6 +44,7 @@ var n = {
43
44
  preload,
44
45
  setSctpSettings,
45
46
  getLibraryVersion,
47
+ PacingHandler,
46
48
  RtcpReceivingSession,
47
49
  RtcpNackResponder,
48
50
  RtcpSrReporter,
@@ -71,6 +73,7 @@ exports.DataChannelStream = DataChannelStream;
71
73
  exports.H264RtpPacketizer = H264RtpPacketizer;
72
74
  exports.H265RtpPacketizer = H265RtpPacketizer;
73
75
  exports.IceUdpMuxListener = IceUdpMuxListener;
76
+ exports.PacingHandler = PacingHandler;
74
77
  exports.PeerConnection = PeerConnection;
75
78
  exports.RtcpNackResponder = RtcpNackResponder;
76
79
  exports.RtcpReceivingSession = RtcpReceivingSession;
@@ -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 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 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,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,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): 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;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -25,6 +25,7 @@ const DataChannel = nodeDataChannel.DataChannel;
25
25
  const PeerConnection = nodeDataChannel.PeerConnection;
26
26
  const IceUdpMuxListener = nodeDataChannel.IceUdpMuxListener;
27
27
  const RtpPacketizationConfig = nodeDataChannel.RtpPacketizationConfig;
28
+ const PacingHandler = nodeDataChannel.PacingHandler;
28
29
  const RtcpReceivingSession = nodeDataChannel.RtcpReceivingSession;
29
30
  const RtcpNackResponder = nodeDataChannel.RtcpNackResponder;
30
31
  const RtcpSrReporter = nodeDataChannel.RtcpSrReporter;
@@ -39,6 +40,7 @@ var n = {
39
40
  preload,
40
41
  setSctpSettings,
41
42
  getLibraryVersion,
43
+ PacingHandler,
42
44
  RtcpReceivingSession,
43
45
  RtcpNackResponder,
44
46
  RtcpSrReporter,
@@ -58,5 +60,5 @@ var n = {
58
60
  IceUdpMuxListener
59
61
  };
60
62
 
61
- export { AV1RtpPacketizer, Audio, DataChannel, DataChannelStream, H264RtpPacketizer, H265RtpPacketizer, IceUdpMuxListener, PeerConnection, RtcpNackResponder, RtcpReceivingSession, RtcpSrReporter, RtpPacketizationConfig, RtpPacketizer, Track, Video, WebSocket, WebSocketServer, cleanup, n as default, getLibraryVersion, initLogger, preload, setSctpSettings };
63
+ export { AV1RtpPacketizer, Audio, DataChannel, DataChannelStream, H264RtpPacketizer, H265RtpPacketizer, IceUdpMuxListener, PacingHandler, PeerConnection, RtcpNackResponder, RtcpReceivingSession, RtcpSrReporter, RtpPacketizationConfig, RtpPacketizer, Track, Video, WebSocket, WebSocketServer, cleanup, n as default, getLibraryVersion, initLogger, preload, setSctpSettings };
62
64
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../../../src/lib/index.ts"],"sourcesContent":["import nodeDataChannel from './node-datachannel';\nimport _DataChannelStream from './datachannel-stream';\nimport { WebSocketServer } from './websocket-server';\nimport {\n Channel,\n DataChannelInitConfig,\n DescriptionType,\n Direction,\n LogLevel,\n 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 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 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,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,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): 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;;;;"}
@@ -168,6 +168,11 @@ declare const RtpPacketizationConfig: {
168
168
  interface MediaHandler {
169
169
  addToChain(handler: MediaHandler): void;
170
170
  }
171
+ interface PacingHandler extends MediaHandler {
172
+ }
173
+ declare const PacingHandler: {
174
+ new (bitsPerSecond: number, sendInterval: number): PacingHandler;
175
+ };
171
176
  interface RtcpReceivingSession extends MediaHandler {
172
177
  }
173
178
  declare const RtcpReceivingSession: {
@@ -213,6 +218,7 @@ declare const _default: {
213
218
  preload: typeof preload;
214
219
  setSctpSettings: typeof setSctpSettings;
215
220
  getLibraryVersion: typeof getLibraryVersion;
221
+ PacingHandler: new (bitsPerSecond: number, sendInterval: number) => PacingHandler;
216
222
  RtcpReceivingSession: new () => RtcpReceivingSession;
217
223
  RtcpNackResponder: new (maxSize?: number) => RtcpNackResponder;
218
224
  RtcpSrReporter: new (rtpConfig: RtpPacketizationConfig) => RtcpSrReporter;
@@ -232,4 +238,4 @@ declare const _default: {
232
238
  IceUdpMuxListener: new (port: number, address?: string) => IceUdpMuxListener;
233
239
  };
234
240
 
235
- export { AV1RtpPacketizer, Audio, CertificateFingerprint, Channel, DataChannel, DataChannelInitConfig, DataChannelStream, DescriptionType, Direction, H264RtpPacketizer, H265RtpPacketizer, IceUdpMuxListener, IceUdpMuxRequest, LocalDescriptionInit, LogLevel, type MediaHandler, NalUnitSeparator, ObuPacketization, 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 };
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 };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "node-datachannel",
3
- "version": "0.31.0",
3
+ "version": "0.32.1",
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",
package/src/cpp/main.cpp CHANGED
@@ -8,6 +8,7 @@
8
8
  #include "media-av1rtppacketizer-wrapper.h"
9
9
  #include "media-h264rtppacketizer-wrapper.h"
10
10
  #include "media-h265rtppacketizer-wrapper.h"
11
+ #include "media-pacinghandler-wrapper.h"
11
12
  #include "media-rtcpnackresponder-wrapper.h"
12
13
  #include "media-rtcpreceivingsession-wrapper.h"
13
14
  #include "media-rtcpsrreporter-wrapper.h"
@@ -31,6 +32,7 @@ Napi::Object InitAll(Napi::Env env, Napi::Object exports)
31
32
  AV1RtpPacketizerWrapper::Init(env, exports);
32
33
  H264RtpPacketizerWrapper::Init(env, exports);
33
34
  H265RtpPacketizerWrapper::Init(env, exports);
35
+ PacingHandlerWrapper::Init(env, exports);
34
36
  RtcpNackResponderWrapper::Init(env, exports);
35
37
  RtcpReceivingSessionWrapper::Init(env, exports);
36
38
  RtcpSrReporterWrapper::Init(env, exports);
@@ -2,6 +2,7 @@
2
2
  #include "media-av1rtppacketizer-wrapper.h"
3
3
  #include "media-h264rtppacketizer-wrapper.h"
4
4
  #include "media-h265rtppacketizer-wrapper.h"
5
+ #include "media-pacinghandler-wrapper.h"
5
6
  #include "media-rtcpnackresponder-wrapper.h"
6
7
  #include "media-rtcpreceivingsession-wrapper.h"
7
8
  #include "media-rtcpsrreporter-wrapper.h"
@@ -16,6 +17,8 @@ std::shared_ptr<rtc::MediaHandler> asMediaHandler(const Napi::Object &val)
16
17
  mediaHandler = H264RtpPacketizerWrapper::Unwrap(val)->getPacketizerInstance();
17
18
  else if (val.InstanceOf(H265RtpPacketizerWrapper::constructor.Value()))
18
19
  mediaHandler = H265RtpPacketizerWrapper::Unwrap(val)->getPacketizerInstance();
20
+ else if (val.InstanceOf(PacingHandlerWrapper::constructor.Value()))
21
+ mediaHandler = PacingHandlerWrapper::Unwrap(val)->getHandlerInstance();
19
22
  else if (val.InstanceOf(RtcpNackResponderWrapper::constructor.Value()))
20
23
  mediaHandler = RtcpNackResponderWrapper::Unwrap(val)->getResponderInstance();
21
24
  else if (val.InstanceOf(RtcpReceivingSessionWrapper::constructor.Value()))
@@ -0,0 +1,79 @@
1
+ #include "media-pacinghandler-wrapper.h"
2
+ #include "media-mediahandler-helper.h"
3
+ #include <chrono>
4
+
5
+ Napi::FunctionReference PacingHandlerWrapper::constructor = Napi::FunctionReference();
6
+
7
+ Napi::Object PacingHandlerWrapper::Init(Napi::Env env, Napi::Object exports)
8
+ {
9
+ Napi::HandleScope scope(env);
10
+
11
+ Napi::Function func = Napi::ObjectWrap<PacingHandlerWrapper>::DefineClass(env, "PacingHandler",
12
+ {
13
+ // Instance Methods
14
+ InstanceMethod("addToChain", &PacingHandlerWrapper::addToChain),
15
+ });
16
+
17
+ // If this is not the first call, we don't want to reassign the constructor (hot-reload problem)
18
+ if (constructor.IsEmpty())
19
+ {
20
+ constructor = Napi::Persistent(func);
21
+ constructor.SuppressDestruct();
22
+ }
23
+
24
+ exports.Set("PacingHandler", func);
25
+ return exports;
26
+ }
27
+
28
+ PacingHandlerWrapper::PacingHandlerWrapper(const Napi::CallbackInfo &info)
29
+ : Napi::ObjectWrap<PacingHandlerWrapper>(info)
30
+ {
31
+ Napi::Env env = info.Env();
32
+
33
+ if (info.Length() < 2)
34
+ {
35
+ Napi::TypeError::New(env, "Expected 2 parameters").ThrowAsJavaScriptException();
36
+ return;
37
+ }
38
+ if (!info[0].IsNumber())
39
+ {
40
+ Napi::TypeError::New(env, "Expected bitsPerSecond to be a number").ThrowAsJavaScriptException();
41
+ return;
42
+ }
43
+ if (!info[1].IsNumber())
44
+ {
45
+ Napi::TypeError::New(env, "Expected sendInterval to be a number").ThrowAsJavaScriptException();
46
+ return;
47
+ }
48
+ auto bitsPerSecond = info[0].As<Napi::Number>().DoubleValue();
49
+ auto sendInterval = info[1].As<Napi::Number>().Uint32Value();
50
+
51
+ mHandlerPtr = std::make_unique<rtc::PacingHandler>(
52
+ bitsPerSecond, std::chrono::milliseconds(sendInterval)
53
+ );
54
+ }
55
+
56
+ PacingHandlerWrapper::~PacingHandlerWrapper()
57
+ {
58
+ mHandlerPtr.reset();
59
+ }
60
+
61
+ std::shared_ptr<rtc::PacingHandler> PacingHandlerWrapper::getHandlerInstance() { return mHandlerPtr; }
62
+
63
+ void PacingHandlerWrapper::addToChain(const Napi::CallbackInfo &info)
64
+ {
65
+ auto env = info.Env();
66
+ if (info.Length() < 1 || !info[0].IsObject())
67
+ {
68
+ Napi::TypeError::New(env, "Expected a MediaHandler instance").ThrowAsJavaScriptException();
69
+ return;
70
+ }
71
+ auto mediaHandler = asMediaHandler(info[0].As<Napi::Object>());
72
+ if (!mediaHandler)
73
+ {
74
+ Napi::TypeError::New(env, "Expected a MediaHandler instance. If this error is unexpected, please report a bug!")
75
+ .ThrowAsJavaScriptException();
76
+ return;
77
+ }
78
+ mHandlerPtr->addToChain(mediaHandler);
79
+ }
@@ -0,0 +1,28 @@
1
+ #ifndef MEDIA_PACINGHANDLER_WRAPPER_H
2
+ #define MEDIA_PACINGHANDLER_WRAPPER_H
3
+
4
+ #include <memory>
5
+ #include <unordered_set>
6
+
7
+ #include <napi.h>
8
+ #include <rtc/rtc.hpp>
9
+
10
+ class PacingHandlerWrapper : public Napi::ObjectWrap<PacingHandlerWrapper>
11
+ {
12
+ public:
13
+ static Napi::FunctionReference constructor;
14
+ static Napi::Object Init(Napi::Env env, Napi::Object exports);
15
+ PacingHandlerWrapper(const Napi::CallbackInfo &info);
16
+ ~PacingHandlerWrapper();
17
+ std::shared_ptr<rtc::PacingHandler> getHandlerInstance();
18
+
19
+ // Functions
20
+ void addToChain(const Napi::CallbackInfo &info);
21
+
22
+ // Callbacks
23
+
24
+ private:
25
+ std::shared_ptr<rtc::PacingHandler> mHandlerPtr = nullptr;
26
+ };
27
+
28
+ #endif // MEDIA_PACINGHANDLER_WRAPPER_H
package/src/lib/index.ts CHANGED
@@ -202,6 +202,12 @@ export interface MediaHandler {
202
202
  addToChain(handler: MediaHandler): void
203
203
  }
204
204
 
205
+ export interface PacingHandler extends MediaHandler {}
206
+
207
+ export const PacingHandler: {
208
+ new (bitsPerSecond: number, sendInterval: number): PacingHandler;
209
+ } = nodeDataChannel.PacingHandler;
210
+
205
211
  export interface RtcpReceivingSession extends MediaHandler {}
206
212
 
207
213
  export const RtcpReceivingSession: {
@@ -259,6 +265,7 @@ export default {
259
265
  preload,
260
266
  setSctpSettings,
261
267
  getLibraryVersion,
268
+ PacingHandler,
262
269
  RtcpReceivingSession,
263
270
  RtcpNackResponder,
264
271
  RtcpSrReporter,