diff --git a/wasm/include/rtc/datachannel.hpp b/wasm/include/rtc/datachannel.hpp index 09f7160..7d1a587 100644 --- a/wasm/include/rtc/datachannel.hpp +++ b/wasm/include/rtc/datachannel.hpp @@ -25,6 +25,7 @@ #include "channel.hpp" #include "common.hpp" +#include "reliability.hpp" namespace rtc { @@ -41,6 +42,7 @@ class DataChannel final : public Channel { bool isClosed() const override; size_t bufferedAmount() const override; string label() const; + Reliability reliability() const; void setBufferedAmountLowThreshold(size_t amount) override; diff --git a/wasm/js/webrtc.js b/wasm/js/webrtc.js index 8371989..7f8358d 100644 --- a/wasm/js/webrtc.js +++ b/wasm/js/webrtc.js @@ -301,7 +301,7 @@ peerConnection.rtcStateChangeCallback = stateChangeCallback; }, - rtcSetIceStateChangeCallback: function(pc, iceStateChangeCallback) { + rtcSetIceStateChangeCallback: function(pc, iceStateChangeCallback) { if(!pc) return; var peerConnection = WEBRTC.peerConnectionsMap[pc]; peerConnection.rtcIceStateChangeCallback = iceStateChangeCallback; @@ -356,12 +356,32 @@ }, rtcGetDataChannelLabel: function(dc, pBuffer, size) { + if(!dc) return 0; var label = WEBRTC.dataChannelsMap[dc].label; stringToUTF8(label, pBuffer, size); return lengthBytesUTF8(label); }, + rtcGetDataChannelUnordered: function(dc) { + if(!dc) return false; + var dataChannel = WEBRTC.dataChannelsMap[dc]; + return dataChannel.ordered ? 0 : 1; + }, + + rtcGetDataChannelMaxPacketLifeTime: function(dc) { + if(!dc) return -1; + var dataChannel = WEBRTC.dataChannelsMap[dc]; + return dataChannel.maxPacketLifeTime !== null ? dataChannel.maxPacketLifeTime : -1; + }, + + rtcGetDataChannelMaxRetransmits: function(dc) { + if(!dc) return -1; + var dataChannel = WEBRTC.dataChannelsMap[dc]; + return dataChannel.maxRetransmits !== null ? dataChannel.maxRetransmits : -1; + }, + rtcSetOpenCallback: function(dc, openCallback) { + if(!dc) return; var dataChannel = WEBRTC.dataChannelsMap[dc]; var cb = function() { if(dataChannel.rtcUserDeleted) return; @@ -373,6 +393,7 @@ }, rtcSetErrorCallback: function(dc, errorCallback) { + if(!dc) return; var dataChannel = WEBRTC.dataChannelsMap[dc]; var cb = function(evt) { if(dataChannel.rtcUserDeleted) return; @@ -385,6 +406,7 @@ }, rtcSetMessageCallback: function(dc, messageCallback) { + if(!dc) return; var dataChannel = WEBRTC.dataChannelsMap[dc]; dataChannel.onmessage = function(evt) { if(dataChannel.rtcUserDeleted) return; @@ -411,6 +433,7 @@ }, rtcSetBufferedAmountLowCallback: function(dc, bufferedAmountLowCallback) { + if(!dc) return; var dataChannel = WEBRTC.dataChannelsMap[dc]; var cb = function(evt) { if(dataChannel.rtcUserDeleted) return; @@ -421,16 +444,19 @@ }, rtcGetBufferedAmount: function(dc) { + if(!dc) return; var dataChannel = WEBRTC.dataChannelsMap[dc]; return dataChannel.bufferedAmount; }, rtcSetBufferedAmountLowThreshold: function(dc, threshold) { + if(!dc) return; var dataChannel = WEBRTC.dataChannelsMap[dc]; dataChannel.bufferedAmountLowThreshold = threshold; }, rtcSendMessage: function(dc, pBuffer, size) { + if(!dc) return; var dataChannel = WEBRTC.dataChannelsMap[dc]; if(dataChannel.readyState != 'open') return -1; if(size >= 0) { diff --git a/wasm/src/datachannel.cpp b/wasm/src/datachannel.cpp index da1d3a7..2f4cbd3 100644 --- a/wasm/src/datachannel.cpp +++ b/wasm/src/datachannel.cpp @@ -24,12 +24,16 @@ #include +#include #include #include extern "C" { extern void rtcDeleteDataChannel(int dc); extern int rtcGetDataChannelLabel(int dc, char *buffer, int size); +extern int rtcGetDataChannelUnordered(int dc); +extern int rtcGetDataChannelMaxPacketLifeTime(int dc); +extern int rtcGetDataChannelMaxRetransmits(int dc); extern void rtcSetOpenCallback(int dc, void (*openCallback)(void *)); extern void rtcSetErrorCallback(int dc, void (*errorCallback)(const char *, void *)); extern void rtcSetMessageCallback(int dc, void (*messageCallback)(const char *, int, void *)); @@ -139,6 +143,26 @@ size_t DataChannel::bufferedAmount() const { std::string DataChannel::label() const { return mLabel; } +Reliability DataChannel::reliability() const { + Reliability reliability = {}; + + if (!mId) + return reliability; + + reliability.unordered = rtcGetDataChannelUnordered(mId) ? true : false; + + int maxRetransmits = rtcGetDataChannelMaxRetransmits(mId); + int maxPacketLifeTime = rtcGetDataChannelMaxPacketLifeTime(mId); + + if (maxRetransmits >= 0) + reliability.maxRetransmits = unsigned(maxRetransmits); + + if (maxPacketLifeTime >= 0) + reliability.maxPacketLifeTime = std::chrono::milliseconds(maxPacketLifeTime); + + return reliability; +} + void DataChannel::setBufferedAmountLowThreshold(size_t amount) { if (!mId) return;