From 379e20524844995da72075556951792327ac9991 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?I=C3=B1aki=20Baz=20Castillo?= Date: Thu, 28 May 2020 00:22:40 +0200 Subject: [PATCH 01/23] WIP: PayloadChannel --- lib/Worker.d.ts.map | 2 +- lib/Worker.js | 4 +- src/Worker.ts | 4 +- worker/.clang-format | 2 +- worker/include/Channel/UnixStreamSocket.hpp | 3 +- .../include/PayloadChannel/Notification.hpp | 42 +++ worker/include/PayloadChannel/Notifier.hpp | 30 ++ .../PayloadChannel/UnixStreamSocket.hpp | 93 +++++ worker/include/Worker.hpp | 15 +- worker/mediasoup-worker.gyp | 6 + worker/src/Channel/Notifier.cpp | 4 +- worker/src/Channel/UnixStreamSocket.cpp | 64 ++-- worker/src/PayloadChannel/Notification.cpp | 69 ++++ worker/src/PayloadChannel/Notifier.cpp | 52 +++ .../src/PayloadChannel/UnixStreamSocket.cpp | 345 ++++++++++++++++++ worker/src/Worker.cpp | 28 +- worker/src/main.cpp | 22 +- 17 files changed, 738 insertions(+), 47 deletions(-) create mode 100644 worker/include/PayloadChannel/Notification.hpp create mode 100644 worker/include/PayloadChannel/Notifier.hpp create mode 100644 worker/include/PayloadChannel/UnixStreamSocket.hpp create mode 100644 worker/src/PayloadChannel/Notification.cpp create mode 100644 worker/src/PayloadChannel/Notifier.cpp create mode 100644 worker/src/PayloadChannel/UnixStreamSocket.cpp diff --git a/lib/Worker.d.ts.map b/lib/Worker.d.ts.map index 4f3d58f949..0183ebc8c2 100644 --- a/lib/Worker.d.ts.map +++ b/lib/Worker.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"Worker.d.ts","sourceRoot":"","sources":["../src/Worker.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"Worker.d.ts","sourceRoot":"","sources":["../src/Worker.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/lib/Worker.js b/lib/Worker.js index 6a0d659b6b..80c57b26bd 100644 --- a/lib/Worker.js +++ b/lib/Worker.js @@ -81,7 +81,9 @@ class Worker extends EnhancedEventEmitter_1.EnhancedEventEmitter { // fd 2 (stderr) : Same as stdout. // fd 3 (channel) : Producer Channel fd. // fd 4 (channel) : Consumer Channel fd. - stdio: ['ignore', 'pipe', 'pipe', 'pipe', 'pipe'] + // fd 3 (channel) : Producer PayloadChannel fd. + // fd 4 (channel) : Consumer PayloadChannel fd. + stdio: ['ignore', 'pipe', 'pipe', 'pipe', 'pipe', 'pipe', 'pipe'] }); this._pid = this._child.pid; this._channel = new Channel_1.Channel({ diff --git a/src/Worker.ts b/src/Worker.ts index 2e27088467..d9d8a8821c 100644 --- a/src/Worker.ts +++ b/src/Worker.ts @@ -260,7 +260,9 @@ export class Worker extends EnhancedEventEmitter // fd 2 (stderr) : Same as stdout. // fd 3 (channel) : Producer Channel fd. // fd 4 (channel) : Consumer Channel fd. - stdio : [ 'ignore', 'pipe', 'pipe', 'pipe', 'pipe' ] + // fd 3 (channel) : Producer PayloadChannel fd. + // fd 4 (channel) : Consumer PayloadChannel fd. + stdio : [ 'ignore', 'pipe', 'pipe', 'pipe', 'pipe', 'pipe', 'pipe' ] }); this._pid = this._child.pid; diff --git a/worker/.clang-format b/worker/.clang-format index d985b81fdf..2de1fdd12e 100644 --- a/worker/.clang-format +++ b/worker/.clang-format @@ -50,7 +50,7 @@ FixNamespaceComments: true IncludeCategories: - Regex: '"common.hpp"' Priority: 1 - - Regex: '^"(Channel|RTC|Utils|handles)/' + - Regex: '^"(Channel|PayloadChannel|RTC|Utils|handles)/' Priority: 3 - Regex: '"*"' Priority: 2 diff --git a/worker/include/Channel/UnixStreamSocket.hpp b/worker/include/Channel/UnixStreamSocket.hpp index 73f27f0f97..8b994c10a4 100644 --- a/worker/include/Channel/UnixStreamSocket.hpp +++ b/worker/include/Channel/UnixStreamSocket.hpp @@ -64,8 +64,7 @@ namespace Channel public: void SetListener(Listener* listener); void Send(json& jsonMessage); - void SendLog(char* nsPayload, size_t nsPayloadLen); - void SendBinary(const uint8_t* nsPayload, size_t nsPayloadLen); + void SendLog(char* message, size_t messageLen); private: void SendImpl(const void* nsPayload, size_t nsPayloadLen); diff --git a/worker/include/PayloadChannel/Notification.hpp b/worker/include/PayloadChannel/Notification.hpp new file mode 100644 index 0000000000..4a879501d8 --- /dev/null +++ b/worker/include/PayloadChannel/Notification.hpp @@ -0,0 +1,42 @@ +#ifndef MS_PAYLOAD_CHANNEL_NOTIFICATION_HPP +#define MS_PAYLOAD_CHANNEL_NOTIFICATION_HPP + +#include "common.hpp" +#include +#include +#include + +using json = nlohmann::json; + +namespace PayloadChannel +{ + class Notification + { + public: + enum class EventId + { + DATA_PRODUCER_SEND = 1 + }; + + private: + static std::unordered_map string2EventId; + + public: + Notification(json& jsonNotification); + virtual ~Notification(); + + public: + void SetPayload(const uint8_t* payload, size_t payloadLen); + + public: + // Passed by argument. + std::string event; + EventId eventId; + json internal; + json data; + const uint8_t* payload{ nullptr }; + size_t payloadLen{ 0u }; + }; +} // namespace PayloadChannel + +#endif diff --git a/worker/include/PayloadChannel/Notifier.hpp b/worker/include/PayloadChannel/Notifier.hpp new file mode 100644 index 0000000000..821b23ec5a --- /dev/null +++ b/worker/include/PayloadChannel/Notifier.hpp @@ -0,0 +1,30 @@ +#ifndef MS_PAYLOAD_CHANNEL_NOTIFIER_HPP +#define MS_PAYLOAD_CHANNEL_NOTIFIER_HPP + +#include "common.hpp" +#include "PayloadChannel/UnixStreamSocket.hpp" +#include +#include + +namespace PayloadChannel +{ + class Notifier + { + public: + static void ClassInit(PayloadChannel::UnixStreamSocket* payloadChannel); + static void Emit( + const std::string& targetId, const char* event, const uint8_t* payload, size_t payloadLen); + static void Emit( + const std::string& targetId, + const char* event, + json& data, + const uint8_t* payload, + size_t payloadLen); + + public: + // Passed by argument. + static PayloadChannel::UnixStreamSocket* payloadChannel; + }; +} // namespace PayloadChannel + +#endif diff --git a/worker/include/PayloadChannel/UnixStreamSocket.hpp b/worker/include/PayloadChannel/UnixStreamSocket.hpp new file mode 100644 index 0000000000..9209936eee --- /dev/null +++ b/worker/include/PayloadChannel/UnixStreamSocket.hpp @@ -0,0 +1,93 @@ +#ifndef MS_PAYLOAD_CHANNEL_UNIX_STREAM_SOCKET_HPP +#define MS_PAYLOAD_CHANNEL_UNIX_STREAM_SOCKET_HPP + +#include "common.hpp" +#include "PayloadChannel/Notification.hpp" +#include "handles/UnixStreamSocket.hpp" +#include + +namespace PayloadChannel +{ + class ConsumerSocket : public ::UnixStreamSocket + { + public: + class Listener + { + public: + virtual void OnConsumerSocketMessage(ConsumerSocket* consumerSocket, json& jsonMessage) = 0; + virtual void OnConsumerSocketPayload( + ConsumerSocket* consumerSocket, const uint8_t* payload, size_t payloadLen) = 0; + virtual void OnConsumerSocketClosed(ConsumerSocket* consumerSocket) = 0; + }; + + public: + ConsumerSocket(int fd, size_t bufferSize, Listener* listener); + + /* Pure virtual methods inherited from ::UnixStreamSocket. */ + public: + void UserOnUnixStreamRead() override; + void UserOnUnixStreamSocketClosed() override; + + private: + // Passed by argument. + Listener* listener{ nullptr }; + // Others. + size_t msgStart{ 0u }; // Where the latest message starts. + }; + + class ProducerSocket : public ::UnixStreamSocket + { + public: + ProducerSocket(int fd, size_t bufferSize); + + /* Pure virtual methods inherited from ::UnixStreamSocket. */ + public: + void UserOnUnixStreamRead() override + { + } + void UserOnUnixStreamSocketClosed() override + { + } + }; + + class UnixStreamSocket : public ConsumerSocket::Listener + { + public: + class Listener + { + public: + virtual void OnPayloadChannelNotification( + PayloadChannel::UnixStreamSocket* payloadChannel, + PayloadChannel::Notification* notification) = 0; + virtual void OnPayloadChannelClosed(PayloadChannel::UnixStreamSocket* payloadChannel) = 0; + }; + + public: + explicit UnixStreamSocket(int consumerFd, int producerFd); + virtual ~UnixStreamSocket(); + + public: + void SetListener(Listener* listener); + void Send(json& jsonMessage, const uint8_t* payload, size_t payloadLen); + + private: + void SendImpl(const void* nsPayload, size_t nsPayloadLen); + + /* Pure virtual methods inherited from ConsumerSocket::Listener. */ + public: + void OnConsumerSocketMessage(ConsumerSocket* consumerSocket, json& jsonMessage) override; + void OnConsumerSocketPayload( + ConsumerSocket* consumerSocket, const uint8_t* payload, size_t payloadLen) override; + void OnConsumerSocketClosed(ConsumerSocket* consumerSocket) override; + + private: + // Passed by argument. + Listener* listener{ nullptr }; + // Others. + ConsumerSocket consumerSocket; + ProducerSocket producerSocket; + PayloadChannel::Notification* ongoingNotification{ nullptr }; + }; +} // namespace PayloadChannel + +#endif diff --git a/worker/include/Worker.hpp b/worker/include/Worker.hpp index 543df62415..936ba8cb50 100644 --- a/worker/include/Worker.hpp +++ b/worker/include/Worker.hpp @@ -4,6 +4,7 @@ #include "common.hpp" #include "Channel/Request.hpp" #include "Channel/UnixStreamSocket.hpp" +#include "PayloadChannel/UnixStreamSocket.hpp" #include "RTC/Router.hpp" #include "handles/SignalsHandler.hpp" #include @@ -12,10 +13,12 @@ using json = nlohmann::json; -class Worker : public Channel::UnixStreamSocket::Listener, public SignalsHandler::Listener +class Worker : public Channel::UnixStreamSocket::Listener, + public PayloadChannel::UnixStreamSocket::Listener, + public SignalsHandler::Listener { public: - explicit Worker(Channel::UnixStreamSocket* channel); + explicit Worker(Channel::UnixStreamSocket* channel, PayloadChannel::UnixStreamSocket* payloadChannel); ~Worker(); private: @@ -30,6 +33,13 @@ class Worker : public Channel::UnixStreamSocket::Listener, public SignalsHandler void OnChannelRequest(Channel::UnixStreamSocket* channel, Channel::Request* request) override; void OnChannelClosed(Channel::UnixStreamSocket* channel) override; + /* Methods inherited from PayloadChannel::lUnixStreamSocket::Listener. */ +public: + void OnPayloadChannelNotification( + PayloadChannel::UnixStreamSocket* payloadChannel, + PayloadChannel::Notification* notification) override; + void OnPayloadChannelClosed(PayloadChannel::UnixStreamSocket* payloadChannel) override; + /* Methods inherited from SignalsHandler::Listener. */ public: void OnSignal(SignalsHandler* signalsHandler, int signum) override; @@ -37,6 +47,7 @@ class Worker : public Channel::UnixStreamSocket::Listener, public SignalsHandler private: // Passed by argument. Channel::UnixStreamSocket* channel{ nullptr }; + PayloadChannel::UnixStreamSocket* payloadChannel{ nullptr }; // Allocated by this. SignalsHandler* signalsHandler{ nullptr }; std::unordered_map mapRouters; diff --git a/worker/mediasoup-worker.gyp b/worker/mediasoup-worker.gyp index c68cd293db..6c88114c5d 100644 --- a/worker/mediasoup-worker.gyp +++ b/worker/mediasoup-worker.gyp @@ -37,6 +37,9 @@ 'src/Channel/Notifier.cpp', 'src/Channel/Request.cpp', 'src/Channel/UnixStreamSocket.cpp', + 'src/PayloadChannel/Notification.cpp', + 'src/PayloadChannel/Notifier.cpp', + 'src/PayloadChannel/UnixStreamSocket.cpp', 'src/RTC/AudioLevelObserver.cpp', 'src/RTC/Consumer.cpp', 'src/RTC/DataConsumer.cpp', @@ -143,6 +146,9 @@ 'include/Channel/Notifier.hpp', 'include/Channel/Request.hpp', 'include/Channel/UnixStreamSocket.hpp', + 'include/PayloadChannel/Notification.hpp', + 'include/PayloadChannel/Notifier.hpp', + 'include/PayloadChannel/UnixStreamSocket.hpp', 'include/RTC/BweType.hpp', 'include/RTC/AudioLevelObserver.hpp', 'include/RTC/Consumer.hpp', diff --git a/worker/src/Channel/Notifier.cpp b/worker/src/Channel/Notifier.cpp index f0675a8710..b3fc8e0f6d 100644 --- a/worker/src/Channel/Notifier.cpp +++ b/worker/src/Channel/Notifier.cpp @@ -23,7 +23,7 @@ namespace Channel { MS_TRACE(); - MS_ASSERT(Notifier::channel != nullptr, "channel unset"); + MS_ASSERT(Notifier::channel, "channel unset"); json jsonNotification = json::object(); @@ -37,7 +37,7 @@ namespace Channel { MS_TRACE(); - MS_ASSERT(Notifier::channel != nullptr, "channel unset"); + MS_ASSERT(Notifier::channel, "channel unset"); json jsonNotification = json::object(); diff --git a/worker/src/Channel/UnixStreamSocket.cpp b/worker/src/Channel/UnixStreamSocket.cpp index 4851a034d4..c5a43864b7 100644 --- a/worker/src/Channel/UnixStreamSocket.cpp +++ b/worker/src/Channel/UnixStreamSocket.cpp @@ -28,9 +28,9 @@ namespace Channel MS_TRACE_STD(); } - UnixStreamSocket ::~UnixStreamSocket() + UnixStreamSocket::~UnixStreamSocket() { - MS_TRACE(); + MS_TRACE_STD(); } void UnixStreamSocket::SetListener(Listener* listener) @@ -42,57 +42,46 @@ namespace Channel void UnixStreamSocket::Send(json& jsonMessage) { - if (this->producerSocket.IsClosed()) - return; - - std::string nsPayload = jsonMessage.dump(); - size_t nsPayloadLen = nsPayload.length(); - - if (nsPayloadLen > NsPayloadMaxLen) - { - MS_ERROR_STD("mesage too big"); - - return; - } - - SendImpl(nsPayload.c_str(), nsPayloadLen); - } + MS_TRACE_STD(); - void UnixStreamSocket::SendLog(char* nsPayload, size_t nsPayloadLen) - { if (this->producerSocket.IsClosed()) return; - // MS_TRACE_STD(); + std::string message = jsonMessage.dump(); - if (nsPayloadLen > NsPayloadMaxLen) + if (message.length() > NsPayloadMaxLen) { MS_ERROR_STD("mesage too big"); return; } - SendImpl(nsPayload, nsPayloadLen); + SendImpl(message.c_str(), message.length()); } - void UnixStreamSocket::SendBinary(const uint8_t* nsPayload, size_t nsPayloadLen) + void UnixStreamSocket::SendLog(char* message, size_t messageLen) { + MS_TRACE_STD(); + if (this->producerSocket.IsClosed()) return; - if (nsPayloadLen > NsPayloadMaxLen) + if (messageLen > NsPayloadMaxLen) { MS_ERROR_STD("mesage too big"); return; } - SendImpl(nsPayload, nsPayloadLen); + SendImpl(message, messageLen); } - void UnixStreamSocket::SendImpl(const void* nsPayload, size_t nsPayloadLen) + inline void UnixStreamSocket::SendImpl(const void* nsPayload, size_t nsPayloadLen) { + MS_TRACE_STD(); + size_t nsNumLen; + if (nsPayloadLen == 0) { nsNumLen = 1; @@ -109,11 +98,14 @@ namespace Channel } size_t nsLen = nsNumLen + nsPayloadLen + 2; + this->producerSocket.Write(WriteBuffer, nsLen); } void UnixStreamSocket::OnConsumerSocketMessage(ConsumerSocket* /*consumerSocket*/, json& jsonMessage) { + MS_TRACE_STD(); + try { auto* request = new Channel::Request(this, jsonMessage); @@ -143,6 +135,8 @@ namespace Channel void UnixStreamSocket::OnConsumerSocketClosed(ConsumerSocket* /*consumerSocket*/) { + MS_TRACE_STD(); + this->listener->OnChannelClosed(this); } @@ -156,17 +150,17 @@ namespace Channel { MS_TRACE_STD(); - // Be ready to parse more than a single message in a single TCP chunk. + // Be ready to parse more than a single message in a single chunk. while (true) { if (IsClosed()) return; - size_t readLen = this->bufferDataLen - this->msgStart; - char* jsonStart = nullptr; - size_t jsonLen; + size_t readLen = this->bufferDataLen - this->msgStart; + char* msgStart = nullptr; + size_t msgLen; int nsRet = netstring_read( - reinterpret_cast(this->buffer + this->msgStart), readLen, &jsonStart, &jsonLen); + reinterpret_cast(this->buffer + this->msgStart), readLen, &msgStart, &msgLen); if (nsRet != 0) { @@ -245,14 +239,14 @@ namespace Channel return; } - // If here it means that jsonStart points to the beginning of a JSON string - // with jsonLen bytes length, so recalculate readLen. + // If here it means that msgStart points to the beginning of a message + // with msgLen bytes length, so recalculate readLen. readLen = - reinterpret_cast(jsonStart) - (this->buffer + this->msgStart) + jsonLen + 1; + reinterpret_cast(msgStart) - (this->buffer + this->msgStart) + msgLen + 1; try { - json jsonMessage = json::parse(jsonStart, jsonStart + jsonLen); + json jsonMessage = json::parse(msgStart, msgStart + msgLen); // Notify the listener. this->listener->OnConsumerSocketMessage(this, jsonMessage); diff --git a/worker/src/PayloadChannel/Notification.cpp b/worker/src/PayloadChannel/Notification.cpp new file mode 100644 index 0000000000..4d8a935de0 --- /dev/null +++ b/worker/src/PayloadChannel/Notification.cpp @@ -0,0 +1,69 @@ +#define MS_CLASS "PayloadChannel::Notification" +// #define MS_LOG_DEV_LEVEL 3 + +#include "PayloadChannel/Notification.hpp" +#include "Logger.hpp" +#include "MediaSoupErrors.hpp" +#include "Utils.hpp" + +namespace PayloadChannel +{ + /* Class variables. */ + + // clang-format off + std::unordered_map Notification::string2EventId = + { + { "dataProducer.send", Notification::EventId::DATA_PRODUCER_SEND } + }; + // clang-format on + + /* Instance methods. */ + + Notification::Notification(json& jsonNotification) + { + MS_TRACE(); + + auto jsonEventIdIt = jsonNotification.find("event"); + + if (jsonEventIdIt == jsonNotification.end() || !jsonEventIdIt->is_string()) + MS_THROW_ERROR("missing event"); + + this->event = jsonEventIdIt->get(); + + auto eventIdIt = Notification::string2EventId.find(this->event); + + if (eventIdIt == Notification::string2EventId.end()) + MS_THROW_ERROR("unknown event '%s'", this->event.c_str()); + + this->eventId = eventIdIt->second; + + auto jsonInternalIt = jsonNotification.find("internal"); + + if (jsonInternalIt != jsonNotification.end() && jsonInternalIt->is_object()) + this->internal = *jsonInternalIt; + else + this->internal = json::object(); + + auto jsonDataIt = jsonNotification.find("data"); + + if (jsonDataIt != jsonNotification.end() && jsonDataIt->is_object()) + this->data = *jsonDataIt; + else + this->data = json::object(); + } + + Notification::~Notification() + { + MS_TRACE(); + + delete this->payload; + } + + void Notification::SetPayload(const uint8_t* payload, size_t payloadLen) + { + MS_TRACE(); + + this->payload = payload; + this->payloadLen = payloadLen; + } +} // namespace PayloadChannel diff --git a/worker/src/PayloadChannel/Notifier.cpp b/worker/src/PayloadChannel/Notifier.cpp new file mode 100644 index 0000000000..189b4ca2dc --- /dev/null +++ b/worker/src/PayloadChannel/Notifier.cpp @@ -0,0 +1,52 @@ +#define MS_CLASS "PayloadChannel::Notifier" +// #define MS_LOG_DEV_LEVEL 3 + +#include "PayloadChannel/Notifier.hpp" +#include "Logger.hpp" + +namespace PayloadChannel +{ + /* Class variables. */ + + PayloadChannel::UnixStreamSocket* Notifier::payloadChannel{ nullptr }; + + /* Static methods. */ + + void Notifier::ClassInit(PayloadChannel::UnixStreamSocket* payloadChannel) + { + MS_TRACE(); + + Notifier::payloadChannel = payloadChannel; + } + + void Notifier::Emit( + const std::string& targetId, const char* event, const uint8_t* payload, size_t payloadLen) + { + MS_TRACE(); + + MS_ASSERT(Notifier::payloadChannel, "payloadChannel unset"); + + json jsonNotification = json::object(); + + jsonNotification["targetId"] = targetId; + jsonNotification["event"] = event; + + Notifier::payloadChannel->Send(jsonNotification, payload, payloadLen); + } + + void Notifier::Emit( + const std::string& targetId, const char* event, json& data, const uint8_t* payload, size_t payloadLen) + { + MS_TRACE(); + + MS_ASSERT(Notifier::payloadChannel, "payloadChannel unset"); + + json jsonNotification = json::object(); + + jsonNotification["targetId"] = targetId; + jsonNotification["event"] = event; + jsonNotification["data"] = data; + + Notifier::payloadChannel->Send(jsonNotification, payload, payloadLen); + } +} // namespace PayloadChannel diff --git a/worker/src/PayloadChannel/UnixStreamSocket.cpp b/worker/src/PayloadChannel/UnixStreamSocket.cpp new file mode 100644 index 0000000000..2da017f9dd --- /dev/null +++ b/worker/src/PayloadChannel/UnixStreamSocket.cpp @@ -0,0 +1,345 @@ +#define MS_CLASS "PayloadChannel::UnixStreamSocket" +// #define MS_LOG_DEV_LEVEL 3 + +#include "PayloadChannel/UnixStreamSocket.hpp" +#include "Logger.hpp" +#include "MediaSoupErrors.hpp" +#include // std::ceil() +#include // sprintf() +#include // std::memcpy(), std::memmove() +extern "C" +{ +#include +} + +namespace PayloadChannel +{ + /* Static. */ + + // netstring length for a 4194304 bytes payload. + static constexpr size_t NsMessageMaxLen{ 4194313 }; + static constexpr size_t NsPayloadMaxLen{ 4194304 }; + static uint8_t WriteBuffer[NsMessageMaxLen]; + + /* Instance methods. */ + UnixStreamSocket::UnixStreamSocket(int consumerFd, int producerFd) + : consumerSocket(consumerFd, NsMessageMaxLen, this), producerSocket(producerFd, NsMessageMaxLen) + { + MS_TRACE(); + } + + UnixStreamSocket::~UnixStreamSocket() + { + MS_TRACE(); + + delete this->ongoingNotification; + } + + void UnixStreamSocket::SetListener(Listener* listener) + { + MS_TRACE(); + + this->listener = listener; + } + + void UnixStreamSocket::Send(json& jsonMessage, const uint8_t* payload, size_t payloadLen) + { + MS_TRACE(); + + if (this->producerSocket.IsClosed()) + return; + + std::string message = jsonMessage.dump(); + + if (message.length() > NsPayloadMaxLen) + { + MS_ERROR("mesage too big"); + + return; + } + else if (payloadLen > NsPayloadMaxLen) + { + MS_ERROR("payload too big"); + + return; + } + + SendImpl(message.c_str(), message.length()); + SendImpl(payload, payloadLen); + } + + inline void UnixStreamSocket::SendImpl(const void* nsPayload, size_t nsPayloadLen) + { + MS_TRACE(); + + size_t nsNumLen; + + if (nsPayloadLen == 0) + { + nsNumLen = 1; + WriteBuffer[0] = '0'; + WriteBuffer[1] = ':'; + WriteBuffer[2] = ','; + } + else + { + nsNumLen = static_cast(std::ceil(std::log10(static_cast(nsPayloadLen) + 1))); + std::sprintf(reinterpret_cast(WriteBuffer), "%zu:", nsPayloadLen); + std::memcpy(WriteBuffer + nsNumLen + 1, nsPayload, nsPayloadLen); + WriteBuffer[nsNumLen + nsPayloadLen + 1] = ','; + } + + size_t nsLen = nsNumLen + nsPayloadLen + 2; + + this->producerSocket.Write(WriteBuffer, nsLen); + } + + void UnixStreamSocket::OnConsumerSocketMessage(ConsumerSocket* /*consumerSocket*/, json& jsonMessage) + { + MS_TRACE(); + + if (this->ongoingNotification) + { + MS_ERROR("ongoing notification exists, discarding received message"); + + return; + } + + try + { + this->ongoingNotification = new PayloadChannel::Notification(jsonMessage); + } + catch (const MediaSoupError& error) + { + MS_ERROR("discarding wrong Payload Channel notification"); + } + } + + void UnixStreamSocket::OnConsumerSocketPayload( + ConsumerSocket* /*consumerSocket*/, const uint8_t* payload, size_t payloadLen) + { + MS_TRACE(); + + if (!this->ongoingNotification) + { + MS_ERROR("no ongoing notification, discarding received payload"); + + return; + } + + this->ongoingNotification->SetPayload(payload, payloadLen); + + // Notify the listener. + try + { + this->listener->OnPayloadChannelNotification(this, this->ongoingNotification); + } + catch (const MediaSoupError& error) + { + MS_ERROR("notification error: %s", error.what()); + } + + // Delete the Notification. + delete this->ongoingNotification; + this->ongoingNotification = nullptr; + } + + void UnixStreamSocket::OnConsumerSocketClosed(ConsumerSocket* /*consumerSocket*/) + { + MS_TRACE(); + + this->listener->OnPayloadChannelClosed(this); + } + + ConsumerSocket::ConsumerSocket(int fd, size_t bufferSize, Listener* listener) + : ::UnixStreamSocket(fd, bufferSize, ::UnixStreamSocket::Role::CONSUMER), listener(listener) + { + MS_TRACE(); + } + + void ConsumerSocket::UserOnUnixStreamRead() + { + MS_TRACE(); + + // Be ready to parse more than a single message in a single chunk. + while (true) + { + if (IsClosed()) + return; + + size_t readLen = this->bufferDataLen - this->msgStart; + char* msgStart = nullptr; + size_t msgLen; + int nsRet = netstring_read( + reinterpret_cast(this->buffer + this->msgStart), readLen, &msgStart, &msgLen); + + if (nsRet != 0) + { + switch (nsRet) + { + case NETSTRING_ERROR_TOO_SHORT: + { + // Check if the buffer is full. + if (this->bufferDataLen == this->bufferSize) + { + // First case: the incomplete message does not begin at position 0 of + // the buffer, so move the incomplete message to the position 0. + if (this->msgStart != 0) + { + std::memmove(this->buffer, this->buffer + this->msgStart, readLen); + this->msgStart = 0; + this->bufferDataLen = readLen; + } + // Second case: the incomplete message begins at position 0 of the buffer. + // The message is too big, so discard it. + else + { + MS_ERROR( + "no more space in the buffer for the unfinished message being parsed, " + "discarding it"); + + this->msgStart = 0; + this->bufferDataLen = 0; + } + } + + // Otherwise the buffer is not full, just wait. + return; + } + + case NETSTRING_ERROR_TOO_LONG: + { + MS_ERROR("NETSTRING_ERROR_TOO_LONG"); + + break; + } + + case NETSTRING_ERROR_NO_COLON: + { + MS_ERROR("NETSTRING_ERROR_NO_COLON"); + + break; + } + + case NETSTRING_ERROR_NO_COMMA: + { + MS_ERROR("NETSTRING_ERROR_NO_COMMA"); + + break; + } + + case NETSTRING_ERROR_LEADING_ZERO: + { + MS_ERROR("NETSTRING_ERROR_LEADING_ZERO"); + + break; + } + + case NETSTRING_ERROR_NO_LENGTH: + { + MS_ERROR("NETSTRING_ERROR_NO_LENGTH"); + + break; + } + } + + // Error, so reset and exit the parsing loop. + this->msgStart = 0; + this->bufferDataLen = 0; + + return; + } + + // If here it means that msgStart points to the beginning of a message + // with msgLen bytes length, so recalculate readLen. + readLen = + reinterpret_cast(msgStart) - (this->buffer + this->msgStart) + msgLen + 1; + + if (msgLen > 0u) + { + // We can receive JSON messages or text/binary payloads. + switch (msgStart[0]) + { + // 'P' (a payload). + case 'P': + { + // Notify the listener. + this->listener->OnConsumerSocketPayload( + this, reinterpret_cast(msgStart + 1), msgLen - 1); + + break; + } + + // '{' (a Payload Channel JSON messsage). + case '{': + { + try + { + json jsonMessage = json::parse(msgStart, msgStart + msgLen); + + // Notify the listener. + this->listener->OnConsumerSocketMessage(this, jsonMessage); + } + catch (const json::parse_error& error) + { + MS_ERROR("JSON parsing error: %s", error.what()); + } + + break; + } + + default: + { + MS_ERROR("not a JSON message nor a payload"); + } + } + + return; + } + // Discard if msgLen is 0. + else + { + MS_ERROR("message length is 0, discarding"); + + return; + } + + // If there is no more space available in the buffer and that is because + // the latest parsed message filled it, then empty the full buffer. + if ((this->msgStart + readLen) == this->bufferSize) + { + this->msgStart = 0; + this->bufferDataLen = 0; + } + // If there is still space in the buffer, set the beginning of the next + // parsing to the next position after the parsed message. + else + { + this->msgStart += readLen; + } + + // If there is more data in the buffer after the parsed message + // then parse again. Otherwise break here and wait for more data. + if (this->bufferDataLen > this->msgStart) + { + continue; + } + + break; + } + } + + void ConsumerSocket::UserOnUnixStreamSocketClosed() + { + MS_TRACE(); + + // Notify the listener. + this->listener->OnConsumerSocketClosed(this); + } + + ProducerSocket::ProducerSocket(int fd, size_t bufferSize) + : ::UnixStreamSocket(fd, bufferSize, ::UnixStreamSocket::Role::PRODUCER) + { + MS_TRACE(); + } +} // namespace PayloadChannel diff --git a/worker/src/Worker.cpp b/worker/src/Worker.cpp index 07e8f6a567..770f4935fb 100644 --- a/worker/src/Worker.cpp +++ b/worker/src/Worker.cpp @@ -10,13 +10,17 @@ /* Instance methods. */ -Worker::Worker(Channel::UnixStreamSocket* channel) : channel(channel) +Worker::Worker(::Channel::UnixStreamSocket* channel, PayloadChannel::UnixStreamSocket* payloadChannel) + : channel(channel), payloadChannel(payloadChannel) { MS_TRACE(); // Set us as Channel's listener. this->channel->SetListener(this); + // Set us as PayloadChannel's listener. + this->payloadChannel->SetListener(this); + // Set the signals handler. this->signalsHandler = new SignalsHandler(this); @@ -63,6 +67,9 @@ void Worker::Close() // Close the Channel. delete this->channel; + + // Close the PayloadChannel. + delete this->payloadChannel; } void Worker::FillJson(json& jsonObject) const @@ -277,6 +284,25 @@ inline void Worker::OnChannelClosed(Channel::UnixStreamSocket* /*socket*/) Close(); } +inline void Worker::OnPayloadChannelNotification( + PayloadChannel::UnixStreamSocket* /*payloadChannel*/, PayloadChannel::Notification* notification) +{ + MS_TRACE(); + + // TODO +} + +inline void Worker::OnPayloadChannelClosed(PayloadChannel::UnixStreamSocket* /*payloadChannel*/) +{ + MS_TRACE(); + + // If the pipe is remotely closed it may mean that mediasoup Node process + // abruptly died (SIGKILL?) so we must die. + MS_ERROR_STD("payloadChannel remotely closed, closing myself"); + + Close(); +} + inline void Worker::OnSignal(SignalsHandler* /*signalsHandler*/, int signum) { MS_TRACE(); diff --git a/worker/src/main.cpp b/worker/src/main.cpp index 2e1c792ef1..842cc4152e 100644 --- a/worker/src/main.cpp +++ b/worker/src/main.cpp @@ -14,6 +14,8 @@ #include "Worker.hpp" #include "Channel/Notifier.hpp" #include "Channel/UnixStreamSocket.hpp" +#include "PayloadChannel/Notifier.hpp" +#include "PayloadChannel/UnixStreamSocket.hpp" #include "RTC/DtlsTransport.hpp" #include "RTC/SrtpSession.hpp" #include @@ -26,6 +28,8 @@ static constexpr int ConsumerChannelFd{ 3 }; static constexpr int ProducerChannelFd{ 4 }; +static constexpr int PayloadConsumerChannelFd{ 5 }; +static constexpr int PayloadProducerChannelFd{ 6 }; void IgnoreSignals(); @@ -47,6 +51,9 @@ int main(int argc, char* argv[]) // Channel socket (it will be handled and deleted by the Worker). Channel::UnixStreamSocket* channel{ nullptr }; + // PayloadChannel socket (it will be handled and deleted by the Worker). + PayloadChannel::UnixStreamSocket* payloadChannel{ nullptr }; + try { channel = new Channel::UnixStreamSocket(ConsumerChannelFd, ProducerChannelFd); @@ -58,6 +65,18 @@ int main(int argc, char* argv[]) std::_Exit(EXIT_FAILURE); } + try + { + payloadChannel = + new PayloadChannel::UnixStreamSocket(PayloadConsumerChannelFd, PayloadProducerChannelFd); + } + catch (const MediaSoupError& error) + { + MS_ERROR_STD("error creating the RTC Channel: %s", error.what()); + + std::_Exit(EXIT_FAILURE); + } + // Initialize the Logger. Logger::ClassInit(channel); @@ -111,12 +130,13 @@ int main(int argc, char* argv[]) RTC::DtlsTransport::ClassInit(); RTC::SrtpSession::ClassInit(); Channel::Notifier::ClassInit(channel); + PayloadChannel::Notifier::ClassInit(payloadChannel); // Ignore some signals. IgnoreSignals(); // Run the Worker. - Worker worker(channel); + Worker worker(channel, payloadChannel); // Free static stuff. DepLibUV::ClassDestroy(); From be9c3dbdc5da8bf3cbe97c63e557acc1b4661486 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?I=C3=B1aki=20Baz=20Castillo?= Date: Thu, 28 May 2020 00:26:39 +0200 Subject: [PATCH 02/23] Add TODO_DATACHANNEL_TERMINATION.md --- TODO_DATACHANNEL_TERMINATION.md | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 TODO_DATACHANNEL_TERMINATION.md diff --git a/TODO_DATACHANNEL_TERMINATION.md b/TODO_DATACHANNEL_TERMINATION.md new file mode 100644 index 0000000000..9c356d8b36 --- /dev/null +++ b/TODO_DATACHANNEL_TERMINATION.md @@ -0,0 +1,3 @@ +# TODO DataChannel Termination + +- Set proper max size for `netstring` messages in `PayloadChannel` (in JS and C++). From 368e1e59084e3587c9c04c003c893c1193f97ec5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?I=C3=B1aki=20Baz=20Castillo?= Date: Thu, 28 May 2020 03:53:37 +0200 Subject: [PATCH 03/23] PayloadChannel.ts done and working --- TODO_DATACHANNEL_TERMINATION.md | 3 + lib/Channel.js | 2 +- lib/DeviceChannel.d.ts | 28 ++ lib/DeviceChannel.d.ts.map | 1 + lib/DeviceChannel.js | 180 ++++++++++++ lib/PayloadChannel.d.ts | 26 ++ lib/PayloadChannel.d.ts.map | 1 + lib/PayloadChannel.js | 167 +++++++++++ lib/Worker.d.ts | 1 + lib/Worker.d.ts.map | 2 +- lib/Worker.js | 10 + src/Channel.ts | 2 +- src/PayloadChannel.ts | 265 ++++++++++++++++++ src/Worker.ts | 16 ++ worker/include/Channel/UnixStreamSocket.hpp | 6 +- .../PayloadChannel/UnixStreamSocket.hpp | 10 +- worker/src/Channel/UnixStreamSocket.cpp | 22 +- worker/src/PayloadChannel/Notification.cpp | 2 - .../src/PayloadChannel/UnixStreamSocket.cpp | 118 ++------ worker/src/Worker.cpp | 13 + 20 files changed, 760 insertions(+), 115 deletions(-) create mode 100644 lib/DeviceChannel.d.ts create mode 100644 lib/DeviceChannel.d.ts.map create mode 100644 lib/DeviceChannel.js create mode 100644 lib/PayloadChannel.d.ts create mode 100644 lib/PayloadChannel.d.ts.map create mode 100644 lib/PayloadChannel.js create mode 100644 src/PayloadChannel.ts diff --git a/TODO_DATACHANNEL_TERMINATION.md b/TODO_DATACHANNEL_TERMINATION.md index 9c356d8b36..15c7e6d72b 100644 --- a/TODO_DATACHANNEL_TERMINATION.md +++ b/TODO_DATACHANNEL_TERMINATION.md @@ -1,3 +1,6 @@ # TODO DataChannel Termination - Set proper max size for `netstring` messages in `PayloadChannel` (in JS and C++). + +- `payloadChannel.send()`: Assert that `payload` is given. + diff --git a/lib/Channel.js b/lib/Channel.js index 8d285fd038..a694aa4faa 100644 --- a/lib/Channel.js +++ b/lib/Channel.js @@ -65,7 +65,7 @@ class Channel extends EnhancedEventEmitter_1.EnhancedEventEmitter { switch (nsPayload[0]) { // 123 = '{' (a Channel JSON messsage). case 123: - this._processMessage(JSON.parse(nsPayload)); + this._processMessage(JSON.parse(nsPayload.toString('utf8'))); break; // 68 = 'D' (a debug log). case 68: diff --git a/lib/DeviceChannel.d.ts b/lib/DeviceChannel.d.ts new file mode 100644 index 0000000000..f121395f39 --- /dev/null +++ b/lib/DeviceChannel.d.ts @@ -0,0 +1,28 @@ +/// +import { EnhancedEventEmitter } from './EnhancedEventEmitter'; +export declare class PayloadChannel extends EnhancedEventEmitter { + private _closed; + private readonly _producerSocket; + private readonly _consumerSocket; + private _recvBuffer?; + private _ongoingNotification?; + /** + * @private + */ + constructor({ producerSocket, consumerSocket, pid }: { + producerSocket: any; + consumerSocket: any; + pid: number; + }); + /** + * @private + */ + close(): void; + /** + * @private + */ + send(event: string, internal: object, data: any | undefined, payload: string | Buffer): void; + private _processMessage; + private _processPayload; +} +//# sourceMappingURL=DeviceChannel.d.ts.map \ No newline at end of file diff --git a/lib/DeviceChannel.d.ts.map b/lib/DeviceChannel.d.ts.map new file mode 100644 index 0000000000..04968c6edf --- /dev/null +++ b/lib/DeviceChannel.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"DeviceChannel.d.ts","sourceRoot":"","sources":["../src/DeviceChannel.ts"],"names":[],"mappings":";AAIA,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAS9D,qBAAa,cAAe,SAAQ,oBAAoB;IAGvD,OAAO,CAAC,OAAO,CAAS;IAGxB,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAS;IAGzC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAS;IAGzC,OAAO,CAAC,WAAW,CAAC,CAAS;IAG7B,OAAO,CAAC,oBAAoB,CAAC,CAAkD;IAE/E;;OAEG;gBAEF,EACC,cAAc,EACd,cAAc,EACd,GAAG,EACH,EACD;QACC,cAAc,EAAE,GAAG,CAAC;QACpB,cAAc,EAAE,GAAG,CAAC;QACpB,GAAG,EAAE,MAAM,CAAC;KACZ;IAqHF;;OAEG;IACH,KAAK,IAAI,IAAI;IA6Bb;;OAEG;IACH,IAAI,CACH,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,GAAG,GAAG,SAAS,EACrB,OAAO,EAAE,MAAM,GAAG,MAAM,GACtB,IAAI;IAwCP,OAAO,CAAC,eAAe;IAyBvB,OAAO,CAAC,eAAe;CAoBvB"} \ No newline at end of file diff --git a/lib/DeviceChannel.js b/lib/DeviceChannel.js new file mode 100644 index 0000000000..13404b1c9d --- /dev/null +++ b/lib/DeviceChannel.js @@ -0,0 +1,180 @@ +"use strict"; +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k]; + result["default"] = mod; + return result; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +// @ts-ignore +const netstring = __importStar(require("netstring")); +const Logger_1 = require("./Logger"); +const EnhancedEventEmitter_1 = require("./EnhancedEventEmitter"); +const errors_1 = require("./errors"); +const logger = new Logger_1.Logger('PayloadChannel'); +// netstring length for a 4194304 bytes payload. +const NS_MESSAGE_MAX_LEN = 4194313; +const NS_PAYLOAD_MAX_LEN = 4194304; +class PayloadChannel extends EnhancedEventEmitter_1.EnhancedEventEmitter { + /** + * @private + */ + constructor({ producerSocket, consumerSocket, pid }) { + super(); + // Closed flag. + this._closed = false; + logger.debug('constructor()'); + this._producerSocket = producerSocket; + this._consumerSocket = consumerSocket; + // Read PayloadChannel notifications from the worker. + this._consumerSocket.on('data', (buffer) => { + if (!this._recvBuffer) { + this._recvBuffer = buffer; + } + else { + this._recvBuffer = Buffer.concat([this._recvBuffer, buffer], this._recvBuffer.length + buffer.length); + } + if (this._recvBuffer.length > NS_PAYLOAD_MAX_LEN) { + logger.error('receiving buffer is full, discarding all data into it'); + // Reset the buffer and exit. + this._recvBuffer = null; + return; + } + while (true) // eslint-disable-line no-constant-condition + { + let nsPayload; + try { + nsPayload = netstring.nsPayload(this._recvBuffer); + } + catch (error) { + logger.error('invalid netstring data received from the worker process: %s', String(error)); + // Reset the buffer and exit. + this._recvBuffer = undefined; + return; + } + // Incomplete netstring message. + if (nsPayload === -1) + return; + try { + // We can receive JSON messages (PayloadChannel messages) or + // text/binary payloads. + switch (nsPayload[0]) { + // 123 = '{' (a PayloadChannel JSON messsage). + case 123: + this._processMessage(JSON.parse(nsPayload)); + break; + // 80 = 'P' (a text/binary payload). + case 80: + this._processPayload(nsPayload.slice(1)); + break; + default: + // eslint-disable-next-line no-console + console.warn(`worker[pid:${pid}] unexpected data: %s`, nsPayload.toString('utf8', 1)); + } + } + catch (error) { + logger.error('received invalid message from the worker process: %s', String(error)); + } + // Remove the read payload from the buffer. + this._recvBuffer = + this._recvBuffer.slice(netstring.nsLength(this._recvBuffer)); + if (!this._recvBuffer.length) { + this._recvBuffer = undefined; + return; + } + } + }); + this._consumerSocket.on('end', () => (logger.debug('Consumer PayloadChannel ended by the worker process'))); + this._consumerSocket.on('error', (error) => (logger.error('Consumer PayloadChannel error: %s', String(error)))); + this._producerSocket.on('end', () => (logger.debug('Producer PayloadChannel ended by the worker process'))); + this._producerSocket.on('error', (error) => (logger.error('Producer PayloadChannel error: %s', String(error)))); + } + /** + * @private + */ + close() { + if (this._closed) + return; + logger.debug('close()'); + this._closed = true; + // Remove event listeners but leave a fake 'error' hander to avoid + // propagation. + this._consumerSocket.removeAllListeners('end'); + this._consumerSocket.removeAllListeners('error'); + this._consumerSocket.on('error', () => { }); + this._producerSocket.removeAllListeners('end'); + this._producerSocket.removeAllListeners('error'); + this._producerSocket.on('error', () => { }); + // Destroy the socket after a while to allow pending incoming messages. + setTimeout(() => { + try { + this._producerSocket.destroy(); + } + catch (error) { } + try { + this._consumerSocket.destroy(); + } + catch (error) { } + }, 200); + } + /** + * @private + */ + send(event, internal, data, payload) { + logger.debug('send() [event:%s]', event); + if (this._closed) + throw new errors_1.InvalidStateError('PayloadChannel closed'); + const notification = { event, internal, data }; + const ns = netstring.nsWrite(JSON.stringify(notification)); + if (Buffer.byteLength(ns) > NS_MESSAGE_MAX_LEN) + throw new Error('PayloadChannel notification too big'); + else if (Buffer.byteLength(payload) > NS_MESSAGE_MAX_LEN) + throw new Error('PayloadChannel payload too big'); + try { + // This may throw if closed or remote side ended. + this._producerSocket.write(ns); + } + catch (error) { + logger.warn('send() | sending notification failed: %s', String(error)); + return; + } + try { + // This may throw if closed or remote side ended. + this._producerSocket.write(payload); + } + catch (error) { + logger.warn('send() | sending payload failed: %s', String(error)); + return; + } + } + _processMessage(msg) { + if (!msg.targetId || !msg.event) { + logger.error('received message is not a notification'); + return; + } + // If we are not expecting a notification, warn and override ongoing + // notification. + if (this._ongoingNotification) { + logger.error('received a notification while expecting a payload, overriding ongoing notification'); + } + this._ongoingNotification = + { + targetId: msg.targetId, + event: msg.event, + data: msg.data + }; + } + _processPayload(payload) { + // If we are not expecting a payload, abort. + if (!this._ongoingNotification) { + logger.error('received a payload without previous notification'); + return; + } + // Emit the corresponding event. + this.emit(this._ongoingNotification.targetId, this._ongoingNotification.event, this._ongoingNotification.data, payload); + // Unset ongoing notification. + this._ongoingNotification = undefined; + } +} +exports.PayloadChannel = PayloadChannel; diff --git a/lib/PayloadChannel.d.ts b/lib/PayloadChannel.d.ts new file mode 100644 index 0000000000..2b252fbe45 --- /dev/null +++ b/lib/PayloadChannel.d.ts @@ -0,0 +1,26 @@ +/// +import { EnhancedEventEmitter } from './EnhancedEventEmitter'; +export declare class PayloadChannel extends EnhancedEventEmitter { + private _closed; + private readonly _producerSocket; + private readonly _consumerSocket; + private _recvBuffer?; + private _ongoingNotification?; + /** + * @private + */ + constructor({ producerSocket, consumerSocket }: { + producerSocket: any; + consumerSocket: any; + }); + /** + * @private + */ + close(): void; + /** + * @private + */ + send(event: string, internal: object, data: any | undefined, payload: string | Buffer): void; + private _processData; +} +//# sourceMappingURL=PayloadChannel.d.ts.map \ No newline at end of file diff --git a/lib/PayloadChannel.d.ts.map b/lib/PayloadChannel.d.ts.map new file mode 100644 index 0000000000..3bafca7558 --- /dev/null +++ b/lib/PayloadChannel.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"PayloadChannel.d.ts","sourceRoot":"","sources":["../src/PayloadChannel.ts"],"names":[],"mappings":";AAIA,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAS9D,qBAAa,cAAe,SAAQ,oBAAoB;IAGvD,OAAO,CAAC,OAAO,CAAS;IAGxB,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAS;IAGzC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAS;IAGzC,OAAO,CAAC,WAAW,CAAC,CAAS;IAG7B,OAAO,CAAC,oBAAoB,CAAC,CAAkD;IAE/E;;OAEG;gBAEF,EACC,cAAc,EACd,cAAc,EACd,EACD;QACC,cAAc,EAAE,GAAG,CAAC;QACpB,cAAc,EAAE,GAAG,CAAC;KACpB;IAyFF;;OAEG;IACH,KAAK,IAAI,IAAI;IA6Bb;;OAEG;IACH,IAAI,CACH,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,GAAG,GAAG,SAAS,EACrB,OAAO,EAAE,MAAM,GAAG,MAAM,GACtB,IAAI;IAyCP,OAAO,CAAC,YAAY;CAqDpB"} \ No newline at end of file diff --git a/lib/PayloadChannel.js b/lib/PayloadChannel.js new file mode 100644 index 0000000000..69fc10c162 --- /dev/null +++ b/lib/PayloadChannel.js @@ -0,0 +1,167 @@ +"use strict"; +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k]; + result["default"] = mod; + return result; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +// @ts-ignore +const netstring = __importStar(require("netstring")); +const Logger_1 = require("./Logger"); +const EnhancedEventEmitter_1 = require("./EnhancedEventEmitter"); +const errors_1 = require("./errors"); +const logger = new Logger_1.Logger('PayloadChannel'); +// netstring length for a 4194304 bytes payload. +const NS_MESSAGE_MAX_LEN = 4194313; +const NS_PAYLOAD_MAX_LEN = 4194304; +class PayloadChannel extends EnhancedEventEmitter_1.EnhancedEventEmitter { + /** + * @private + */ + constructor({ producerSocket, consumerSocket }) { + super(); + // Closed flag. + this._closed = false; + logger.debug('constructor()'); + this._producerSocket = producerSocket; + this._consumerSocket = consumerSocket; + // Read PayloadChannel notifications from the worker. + this._consumerSocket.on('data', (buffer) => { + if (!this._recvBuffer) { + this._recvBuffer = buffer; + } + else { + this._recvBuffer = Buffer.concat([this._recvBuffer, buffer], this._recvBuffer.length + buffer.length); + } + if (this._recvBuffer.length > NS_PAYLOAD_MAX_LEN) { + logger.error('receiving buffer is full, discarding all data into it'); + // Reset the buffer and exit. + this._recvBuffer = null; + return; + } + while (true) // eslint-disable-line no-constant-condition + { + let nsPayload; + try { + nsPayload = netstring.nsPayload(this._recvBuffer); + } + catch (error) { + logger.error('invalid netstring data received from the worker process: %s', String(error)); + // Reset the buffer and exit. + this._recvBuffer = undefined; + return; + } + // Incomplete netstring message. + if (nsPayload === -1) + return; + this._processData(nsPayload); + // Remove the read payload from the buffer. + this._recvBuffer = + this._recvBuffer.slice(netstring.nsLength(this._recvBuffer)); + if (!this._recvBuffer.length) { + this._recvBuffer = undefined; + return; + } + } + }); + this._consumerSocket.on('end', () => (logger.debug('Consumer PayloadChannel ended by the worker process'))); + this._consumerSocket.on('error', (error) => (logger.error('Consumer PayloadChannel error: %s', String(error)))); + this._producerSocket.on('end', () => (logger.debug('Producer PayloadChannel ended by the worker process'))); + this._producerSocket.on('error', (error) => (logger.error('Producer PayloadChannel error: %s', String(error)))); + } + /** + * @private + */ + close() { + if (this._closed) + return; + logger.debug('close()'); + this._closed = true; + // Remove event listeners but leave a fake 'error' hander to avoid + // propagation. + this._consumerSocket.removeAllListeners('end'); + this._consumerSocket.removeAllListeners('error'); + this._consumerSocket.on('error', () => { }); + this._producerSocket.removeAllListeners('end'); + this._producerSocket.removeAllListeners('error'); + this._producerSocket.on('error', () => { }); + // Destroy the socket after a while to allow pending incoming messages. + setTimeout(() => { + try { + this._producerSocket.destroy(); + } + catch (error) { } + try { + this._consumerSocket.destroy(); + } + catch (error) { } + }, 200); + } + /** + * @private + */ + send(event, internal, data, payload) { + logger.debug('send() [event:%s]', event); + if (this._closed) + throw new errors_1.InvalidStateError('PayloadChannel closed'); + const notification = { event, internal, data }; + const ns1 = netstring.nsWrite(JSON.stringify(notification)); + const ns2 = netstring.nsWrite(payload); + if (Buffer.byteLength(ns1) > NS_MESSAGE_MAX_LEN) + throw new Error('PayloadChannel notification too big'); + else if (Buffer.byteLength(ns2) > NS_MESSAGE_MAX_LEN) + throw new Error('PayloadChannel payload too big'); + try { + // This may throw if closed or remote side ended. + this._producerSocket.write(ns1); + } + catch (error) { + logger.warn('send() | sending notification failed: %s', String(error)); + return; + } + try { + // This may throw if closed or remote side ended. + this._producerSocket.write(ns2); + } + catch (error) { + logger.warn('send() | sending payload failed: %s', String(error)); + return; + } + } + _processData(data) { + if (!this._ongoingNotification) { + let msg; + try { + msg = JSON.parse(data.toString('utf8')); + } + catch (error) { + logger.error('received invalid data from the worker process: %s', String(error)); + return; + } + if (!msg.targetId || !msg.event) { + logger.error('received message is not a notification'); + return; + } + this._ongoingNotification = + { + targetId: msg.targetId, + event: msg.event, + data: msg.data + }; + } + else { + const payload = data; + // Emit the corresponding event. + this.emit(this._ongoingNotification.targetId, this._ongoingNotification.event, this._ongoingNotification.data, payload); + // TODO: REMOVE + logger.warn('<<<< NOTIFICATION RECEIVED IN NODE:', this._ongoingNotification); + logger.warn('- buffer: %o', payload); + logger.warn('- buffer.toString(): %s', payload.toString('utf-8')); + // Unset ongoing notification. + this._ongoingNotification = undefined; + } + } +} +exports.PayloadChannel = PayloadChannel; diff --git a/lib/Worker.d.ts b/lib/Worker.d.ts index 7ab86ecb73..1338bd782b 100644 --- a/lib/Worker.d.ts +++ b/lib/Worker.d.ts @@ -113,6 +113,7 @@ export declare class Worker extends EnhancedEventEmitter { private _child?; private readonly _pid; private readonly _channel; + private readonly _payloadChannel; private _closed; private readonly _appData?; private readonly _routers; diff --git a/lib/Worker.d.ts.map b/lib/Worker.d.ts.map index 0183ebc8c2..e479e5d14c 100644 --- a/lib/Worker.d.ts.map +++ b/lib/Worker.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"Worker.d.ts","sourceRoot":"","sources":["../src/Worker.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"Worker.d.ts","sourceRoot":"","sources":["../src/Worker.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/lib/Worker.js b/lib/Worker.js index 80c57b26bd..37f880849c 100644 --- a/lib/Worker.js +++ b/lib/Worker.js @@ -15,6 +15,7 @@ const Logger_1 = require("./Logger"); const EnhancedEventEmitter_1 = require("./EnhancedEventEmitter"); const ortc = __importStar(require("./ortc")); const Channel_1 = require("./Channel"); +const PayloadChannel_1 = require("./PayloadChannel"); const Router_1 = require("./Router"); // If env MEDIASOUP_WORKER_BIN is given, use it as worker binary. // Otherwise if env MEDIASOUP_BUILDTYPE is 'Debug' use the Debug binary. @@ -91,6 +92,13 @@ class Worker extends EnhancedEventEmitter_1.EnhancedEventEmitter { consumerSocket: this._child.stdio[4], pid: this._pid }); + this._payloadChannel = new PayloadChannel_1.PayloadChannel({ + // NOTE: TypeScript does not like more than 5 fds. + // @ts-ignore + producerSocket: this._child.stdio[5], + // @ts-ignore + consumerSocket: this._child.stdio[6] + }); this._appData = appData; let spawnDone = false; // Listen for 'running' notification. @@ -201,6 +209,8 @@ class Worker extends EnhancedEventEmitter_1.EnhancedEventEmitter { } // Close the Channel instance. this._channel.close(); + // Close the PayloadChannel instance. + this._payloadChannel.close(); // Close every Router. for (const router of this._routers) { router.workerClosed(); diff --git a/src/Channel.ts b/src/Channel.ts index 0639548c07..214d7affc5 100644 --- a/src/Channel.ts +++ b/src/Channel.ts @@ -118,7 +118,7 @@ export class Channel extends EnhancedEventEmitter { // 123 = '{' (a Channel JSON messsage). case 123: - this._processMessage(JSON.parse(nsPayload)); + this._processMessage(JSON.parse(nsPayload.toString('utf8'))); break; // 68 = 'D' (a debug log). diff --git a/src/PayloadChannel.ts b/src/PayloadChannel.ts new file mode 100644 index 0000000000..f2d07fd90d --- /dev/null +++ b/src/PayloadChannel.ts @@ -0,0 +1,265 @@ +import { Duplex } from 'stream'; +// @ts-ignore +import * as netstring from 'netstring'; +import { Logger } from './Logger'; +import { EnhancedEventEmitter } from './EnhancedEventEmitter'; +import { InvalidStateError } from './errors'; + +const logger = new Logger('PayloadChannel'); + +// netstring length for a 4194304 bytes payload. +const NS_MESSAGE_MAX_LEN = 4194313; +const NS_PAYLOAD_MAX_LEN = 4194304; + +export class PayloadChannel extends EnhancedEventEmitter +{ + // Closed flag. + private _closed = false; + + // Unix Socket instance for sending messages to the worker process. + private readonly _producerSocket: Duplex; + + // Unix Socket instance for receiving messages to the worker process. + private readonly _consumerSocket: Duplex; + + // Buffer for reading messages from the worker. + private _recvBuffer?: Buffer; + + // Ongoing notification (waiting for its payload). + private _ongoingNotification?: { targetId: string; event: string; data?: any }; + + /** + * @private + */ + constructor( + { + producerSocket, + consumerSocket + }: + { + producerSocket: any; + consumerSocket: any; + }) + { + super(); + + logger.debug('constructor()'); + + this._producerSocket = producerSocket as Duplex; + this._consumerSocket = consumerSocket as Duplex; + + // Read PayloadChannel notifications from the worker. + this._consumerSocket.on('data', (buffer) => + { + if (!this._recvBuffer) + { + this._recvBuffer = buffer; + } + else + { + this._recvBuffer = Buffer.concat( + [ this._recvBuffer, buffer ], + this._recvBuffer.length + buffer.length); + } + + if (this._recvBuffer.length > NS_PAYLOAD_MAX_LEN) + { + logger.error('receiving buffer is full, discarding all data into it'); + + // Reset the buffer and exit. + this._recvBuffer = null; + + return; + } + + while (true) // eslint-disable-line no-constant-condition + { + let nsPayload; + + try + { + nsPayload = netstring.nsPayload(this._recvBuffer); + } + catch (error) + { + logger.error( + 'invalid netstring data received from the worker process: %s', + String(error)); + + // Reset the buffer and exit. + this._recvBuffer = undefined; + + return; + } + + // Incomplete netstring message. + if (nsPayload === -1) + return; + + this._processData(nsPayload); + + // Remove the read payload from the buffer. + this._recvBuffer = + this._recvBuffer.slice(netstring.nsLength(this._recvBuffer)); + + if (!this._recvBuffer.length) + { + this._recvBuffer = undefined; + + return; + } + } + }); + + this._consumerSocket.on('end', () => ( + logger.debug('Consumer PayloadChannel ended by the worker process') + )); + + this._consumerSocket.on('error', (error) => ( + logger.error('Consumer PayloadChannel error: %s', String(error)) + )); + + this._producerSocket.on('end', () => ( + logger.debug('Producer PayloadChannel ended by the worker process') + )); + + this._producerSocket.on('error', (error) => ( + logger.error('Producer PayloadChannel error: %s', String(error)) + )); + } + + /** + * @private + */ + close(): void + { + if (this._closed) + return; + + logger.debug('close()'); + + this._closed = true; + + // Remove event listeners but leave a fake 'error' hander to avoid + // propagation. + this._consumerSocket.removeAllListeners('end'); + this._consumerSocket.removeAllListeners('error'); + this._consumerSocket.on('error', () => {}); + + this._producerSocket.removeAllListeners('end'); + this._producerSocket.removeAllListeners('error'); + this._producerSocket.on('error', () => {}); + + // Destroy the socket after a while to allow pending incoming messages. + setTimeout(() => + { + try { this._producerSocket.destroy(); } + catch (error) {} + try { this._consumerSocket.destroy(); } + catch (error) {} + }, 200); + } + + /** + * @private + */ + send( + event: string, + internal: object, + data: any | undefined, + payload: string | Buffer + ): void + { + logger.debug('send() [event:%s]', event); + + if (this._closed) + throw new InvalidStateError('PayloadChannel closed'); + + const notification = { event, internal, data }; + const ns1 = netstring.nsWrite(JSON.stringify(notification)); + const ns2 = netstring.nsWrite(payload); + + if (Buffer.byteLength(ns1) > NS_MESSAGE_MAX_LEN) + throw new Error('PayloadChannel notification too big'); + else if (Buffer.byteLength(ns2) > NS_MESSAGE_MAX_LEN) + throw new Error('PayloadChannel payload too big'); + + try + { + // This may throw if closed or remote side ended. + this._producerSocket.write(ns1); + } + catch (error) + { + logger.warn('send() | sending notification failed: %s', String(error)); + + return; + } + + try + { + // This may throw if closed or remote side ended. + this._producerSocket.write(ns2); + } + catch (error) + { + logger.warn('send() | sending payload failed: %s', String(error)); + + return; + } + } + + private _processData(data: Buffer): void + { + if (!this._ongoingNotification) + { + let msg; + + try + { + msg = JSON.parse(data.toString('utf8')); + } + catch (error) + { + logger.error( + 'received invalid data from the worker process: %s', + String(error)); + + return; + } + + if (!msg.targetId || !msg.event) + { + logger.error('received message is not a notification'); + + return; + } + + this._ongoingNotification = + { + targetId : msg.targetId, + event : msg.event, + data : msg.data + }; + } + else + { + const payload = data as Buffer; + + // Emit the corresponding event. + this.emit( + this._ongoingNotification.targetId, + this._ongoingNotification.event, + this._ongoingNotification.data, + payload); + + // TODO: REMOVE + logger.warn('<<<< NOTIFICATION RECEIVED IN NODE:', this._ongoingNotification); + logger.warn('- buffer: %o', payload); + logger.warn('- buffer.toString(): %s', payload.toString('utf-8')); + + // Unset ongoing notification. + this._ongoingNotification = undefined; + } + } +} diff --git a/src/Worker.ts b/src/Worker.ts index d9d8a8821c..65124d843a 100644 --- a/src/Worker.ts +++ b/src/Worker.ts @@ -6,6 +6,7 @@ import { Logger } from './Logger'; import { EnhancedEventEmitter } from './EnhancedEventEmitter'; import * as ortc from './ortc'; import { Channel } from './Channel'; +import { PayloadChannel } from './PayloadChannel'; import { Router, RouterOptions } from './Router'; export type WorkerLogLevel = 'debug' | 'warn' | 'error' | 'none'; @@ -171,6 +172,9 @@ export class Worker extends EnhancedEventEmitter // Channel instance. private readonly _channel: Channel; + // PayloadChannel instance. + private readonly _payloadChannel: PayloadChannel; + // Closed flag. private _closed = false; @@ -274,6 +278,15 @@ export class Worker extends EnhancedEventEmitter pid : this._pid }); + this._payloadChannel = new PayloadChannel( + { + // NOTE: TypeScript does not like more than 5 fds. + // @ts-ignore + producerSocket : this._child.stdio[5], + // @ts-ignore + consumerSocket : this._child.stdio[6] + }); + this._appData = appData; let spawnDone = false; @@ -444,6 +457,9 @@ export class Worker extends EnhancedEventEmitter // Close the Channel instance. this._channel.close(); + // Close the PayloadChannel instance. + this._payloadChannel.close(); + // Close every Router. for (const router of this._routers) { diff --git a/worker/include/Channel/UnixStreamSocket.hpp b/worker/include/Channel/UnixStreamSocket.hpp index 8b994c10a4..3835aee96d 100644 --- a/worker/include/Channel/UnixStreamSocket.hpp +++ b/worker/include/Channel/UnixStreamSocket.hpp @@ -14,8 +14,8 @@ namespace Channel class Listener { public: - virtual void OnConsumerSocketMessage(ConsumerSocket* consumerSocket, json& jsonMessage) = 0; - virtual void OnConsumerSocketClosed(ConsumerSocket* consumerSocket) = 0; + virtual void OnConsumerSocketMessage(ConsumerSocket* consumerSocket, char* msg, size_t msgLen) = 0; + virtual void OnConsumerSocketClosed(ConsumerSocket* consumerSocket) = 0; }; public: @@ -71,7 +71,7 @@ namespace Channel /* Pure virtual methods inherited from ConsumerSocket::Listener. */ public: - void OnConsumerSocketMessage(ConsumerSocket* consumerSocket, json& jsonMessage) override; + void OnConsumerSocketMessage(ConsumerSocket* consumerSocket, char* msg, size_t msgLen) override; void OnConsumerSocketClosed(ConsumerSocket* consumerSocket) override; private: diff --git a/worker/include/PayloadChannel/UnixStreamSocket.hpp b/worker/include/PayloadChannel/UnixStreamSocket.hpp index 9209936eee..25b2a76406 100644 --- a/worker/include/PayloadChannel/UnixStreamSocket.hpp +++ b/worker/include/PayloadChannel/UnixStreamSocket.hpp @@ -14,10 +14,8 @@ namespace PayloadChannel class Listener { public: - virtual void OnConsumerSocketMessage(ConsumerSocket* consumerSocket, json& jsonMessage) = 0; - virtual void OnConsumerSocketPayload( - ConsumerSocket* consumerSocket, const uint8_t* payload, size_t payloadLen) = 0; - virtual void OnConsumerSocketClosed(ConsumerSocket* consumerSocket) = 0; + virtual void OnConsumerSocketMessage(ConsumerSocket* consumerSocket, char* msg, size_t msgLen) = 0; + virtual void OnConsumerSocketClosed(ConsumerSocket* consumerSocket) = 0; }; public: @@ -75,9 +73,7 @@ namespace PayloadChannel /* Pure virtual methods inherited from ConsumerSocket::Listener. */ public: - void OnConsumerSocketMessage(ConsumerSocket* consumerSocket, json& jsonMessage) override; - void OnConsumerSocketPayload( - ConsumerSocket* consumerSocket, const uint8_t* payload, size_t payloadLen) override; + void OnConsumerSocketMessage(ConsumerSocket* consumerSocket, char* msg, size_t msgLen) override; void OnConsumerSocketClosed(ConsumerSocket* consumerSocket) override; private: diff --git a/worker/src/Channel/UnixStreamSocket.cpp b/worker/src/Channel/UnixStreamSocket.cpp index c5a43864b7..55c4905bbb 100644 --- a/worker/src/Channel/UnixStreamSocket.cpp +++ b/worker/src/Channel/UnixStreamSocket.cpp @@ -102,13 +102,15 @@ namespace Channel this->producerSocket.Write(WriteBuffer, nsLen); } - void UnixStreamSocket::OnConsumerSocketMessage(ConsumerSocket* /*consumerSocket*/, json& jsonMessage) + void UnixStreamSocket::OnConsumerSocketMessage( + ConsumerSocket* /*consumerSocket*/, char* msg, size_t msgLen) { MS_TRACE_STD(); try { - auto* request = new Channel::Request(this, jsonMessage); + json jsonMessage = json::parse(msg, msg + msgLen); + auto* request = new Channel::Request(this, jsonMessage); // Notify the listener. try @@ -127,6 +129,10 @@ namespace Channel // Delete the Request. delete request; } + catch (const json::parse_error& error) + { + MS_ERROR_STD("JSON parsing error: %s", error.what()); + } catch (const MediaSoupError& error) { MS_ERROR_STD("discarding wrong Channel request"); @@ -244,17 +250,7 @@ namespace Channel readLen = reinterpret_cast(msgStart) - (this->buffer + this->msgStart) + msgLen + 1; - try - { - json jsonMessage = json::parse(msgStart, msgStart + msgLen); - - // Notify the listener. - this->listener->OnConsumerSocketMessage(this, jsonMessage); - } - catch (const json::parse_error& error) - { - MS_ERROR_STD("JSON parsing error: %s", error.what()); - } + this->listener->OnConsumerSocketMessage(this, msgStart, msgLen); // If there is no more space available in the buffer and that is because // the latest parsed message filled it, then empty the full buffer. diff --git a/worker/src/PayloadChannel/Notification.cpp b/worker/src/PayloadChannel/Notification.cpp index 4d8a935de0..998275404b 100644 --- a/worker/src/PayloadChannel/Notification.cpp +++ b/worker/src/PayloadChannel/Notification.cpp @@ -55,8 +55,6 @@ namespace PayloadChannel Notification::~Notification() { MS_TRACE(); - - delete this->payload; } void Notification::SetPayload(const uint8_t* payload, size_t payloadLen) diff --git a/worker/src/PayloadChannel/UnixStreamSocket.cpp b/worker/src/PayloadChannel/UnixStreamSocket.cpp index 2da017f9dd..51371dc85d 100644 --- a/worker/src/PayloadChannel/UnixStreamSocket.cpp +++ b/worker/src/PayloadChannel/UnixStreamSocket.cpp @@ -94,54 +94,45 @@ namespace PayloadChannel this->producerSocket.Write(WriteBuffer, nsLen); } - void UnixStreamSocket::OnConsumerSocketMessage(ConsumerSocket* /*consumerSocket*/, json& jsonMessage) - { - MS_TRACE(); - - if (this->ongoingNotification) - { - MS_ERROR("ongoing notification exists, discarding received message"); - - return; - } - - try - { - this->ongoingNotification = new PayloadChannel::Notification(jsonMessage); - } - catch (const MediaSoupError& error) - { - MS_ERROR("discarding wrong Payload Channel notification"); - } - } - - void UnixStreamSocket::OnConsumerSocketPayload( - ConsumerSocket* /*consumerSocket*/, const uint8_t* payload, size_t payloadLen) + void UnixStreamSocket::OnConsumerSocketMessage( + ConsumerSocket* /*consumerSocket*/, char* msg, size_t msgLen) { MS_TRACE(); if (!this->ongoingNotification) { - MS_ERROR("no ongoing notification, discarding received payload"); - - return; + try + { + json jsonMessage = json::parse(msg, msg + msgLen); + this->ongoingNotification = new PayloadChannel::Notification(jsonMessage); + } + catch (const json::parse_error& error) + { + MS_ERROR_STD("JSON parsing error: %s", error.what()); + } + catch (const MediaSoupError& error) + { + MS_ERROR("discarding wrong Payload Channel notification"); + } } + else + { + this->ongoingNotification->SetPayload(reinterpret_cast(msg), msgLen); - this->ongoingNotification->SetPayload(payload, payloadLen); + // Notify the listener. + try + { + this->listener->OnPayloadChannelNotification(this, this->ongoingNotification); + } + catch (const MediaSoupError& error) + { + MS_ERROR("notification failed: %s", error.what()); + } - // Notify the listener. - try - { - this->listener->OnPayloadChannelNotification(this, this->ongoingNotification); - } - catch (const MediaSoupError& error) - { - MS_ERROR("notification error: %s", error.what()); + // Delete the Notification. + delete this->ongoingNotification; + this->ongoingNotification = nullptr; } - - // Delete the Notification. - delete this->ongoingNotification; - this->ongoingNotification = nullptr; } void UnixStreamSocket::OnConsumerSocketClosed(ConsumerSocket* /*consumerSocket*/) @@ -255,54 +246,7 @@ namespace PayloadChannel readLen = reinterpret_cast(msgStart) - (this->buffer + this->msgStart) + msgLen + 1; - if (msgLen > 0u) - { - // We can receive JSON messages or text/binary payloads. - switch (msgStart[0]) - { - // 'P' (a payload). - case 'P': - { - // Notify the listener. - this->listener->OnConsumerSocketPayload( - this, reinterpret_cast(msgStart + 1), msgLen - 1); - - break; - } - - // '{' (a Payload Channel JSON messsage). - case '{': - { - try - { - json jsonMessage = json::parse(msgStart, msgStart + msgLen); - - // Notify the listener. - this->listener->OnConsumerSocketMessage(this, jsonMessage); - } - catch (const json::parse_error& error) - { - MS_ERROR("JSON parsing error: %s", error.what()); - } - - break; - } - - default: - { - MS_ERROR("not a JSON message nor a payload"); - } - } - - return; - } - // Discard if msgLen is 0. - else - { - MS_ERROR("message length is 0, discarding"); - - return; - } + this->listener->OnConsumerSocketMessage(this, msgStart, msgLen); // If there is no more space available in the buffer and that is because // the latest parsed message filled it, then empty the full buffer. diff --git a/worker/src/Worker.cpp b/worker/src/Worker.cpp index 770f4935fb..f99cfbeaa0 100644 --- a/worker/src/Worker.cpp +++ b/worker/src/Worker.cpp @@ -8,6 +8,9 @@ #include "Settings.hpp" #include "Channel/Notifier.hpp" +// TODO: REMOVE +#include "PayloadChannel/Notifier.hpp" + /* Instance methods. */ Worker::Worker(::Channel::UnixStreamSocket* channel, PayloadChannel::UnixStreamSocket* payloadChannel) @@ -289,6 +292,16 @@ inline void Worker::OnPayloadChannelNotification( { MS_TRACE(); + // TODO: REMOVE + MS_DUMP( + ">>>> NOTIFICATION RECEIVED IN C++ [event:'%s'], SENDING IT BACK TO NODE !!!!", + notification->event.c_str()); + + // TODO: REMOVE + std::string targetId{ "1234" }; + + PayloadChannel::Notifier::Emit(targetId, notification->event.c_str(), notification->payload, notification->payloadLen); + // TODO } From f3936e53192589f425f9c0631df26841cea2ec74 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?I=C3=B1aki=20Baz=20Castillo?= Date: Thu, 28 May 2020 10:43:16 +0200 Subject: [PATCH 04/23] lint --- lib/PayloadChannel.d.ts.map | 2 +- lib/PayloadChannel.js | 4 ---- src/PayloadChannel.ts | 5 ----- worker/src/Worker.cpp | 12 +----------- 4 files changed, 2 insertions(+), 21 deletions(-) diff --git a/lib/PayloadChannel.d.ts.map b/lib/PayloadChannel.d.ts.map index 3bafca7558..2ba399dd56 100644 --- a/lib/PayloadChannel.d.ts.map +++ b/lib/PayloadChannel.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"PayloadChannel.d.ts","sourceRoot":"","sources":["../src/PayloadChannel.ts"],"names":[],"mappings":";AAIA,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAS9D,qBAAa,cAAe,SAAQ,oBAAoB;IAGvD,OAAO,CAAC,OAAO,CAAS;IAGxB,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAS;IAGzC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAS;IAGzC,OAAO,CAAC,WAAW,CAAC,CAAS;IAG7B,OAAO,CAAC,oBAAoB,CAAC,CAAkD;IAE/E;;OAEG;gBAEF,EACC,cAAc,EACd,cAAc,EACd,EACD;QACC,cAAc,EAAE,GAAG,CAAC;QACpB,cAAc,EAAE,GAAG,CAAC;KACpB;IAyFF;;OAEG;IACH,KAAK,IAAI,IAAI;IA6Bb;;OAEG;IACH,IAAI,CACH,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,GAAG,GAAG,SAAS,EACrB,OAAO,EAAE,MAAM,GAAG,MAAM,GACtB,IAAI;IAyCP,OAAO,CAAC,YAAY;CAqDpB"} \ No newline at end of file +{"version":3,"file":"PayloadChannel.d.ts","sourceRoot":"","sources":["../src/PayloadChannel.ts"],"names":[],"mappings":";AAIA,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAS9D,qBAAa,cAAe,SAAQ,oBAAoB;IAGvD,OAAO,CAAC,OAAO,CAAS;IAGxB,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAS;IAGzC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAS;IAGzC,OAAO,CAAC,WAAW,CAAC,CAAS;IAG7B,OAAO,CAAC,oBAAoB,CAAC,CAAkD;IAE/E;;OAEG;gBAEF,EACC,cAAc,EACd,cAAc,EACd,EACD;QACC,cAAc,EAAE,GAAG,CAAC;QACpB,cAAc,EAAE,GAAG,CAAC;KACpB;IAyFF;;OAEG;IACH,KAAK,IAAI,IAAI;IA6Bb;;OAEG;IACH,IAAI,CACH,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,GAAG,GAAG,SAAS,EACrB,OAAO,EAAE,MAAM,GAAG,MAAM,GACtB,IAAI;IAyCP,OAAO,CAAC,YAAY;CAgDpB"} \ No newline at end of file diff --git a/lib/PayloadChannel.js b/lib/PayloadChannel.js index 69fc10c162..732d45425e 100644 --- a/lib/PayloadChannel.js +++ b/lib/PayloadChannel.js @@ -155,10 +155,6 @@ class PayloadChannel extends EnhancedEventEmitter_1.EnhancedEventEmitter { const payload = data; // Emit the corresponding event. this.emit(this._ongoingNotification.targetId, this._ongoingNotification.event, this._ongoingNotification.data, payload); - // TODO: REMOVE - logger.warn('<<<< NOTIFICATION RECEIVED IN NODE:', this._ongoingNotification); - logger.warn('- buffer: %o', payload); - logger.warn('- buffer.toString(): %s', payload.toString('utf-8')); // Unset ongoing notification. this._ongoingNotification = undefined; } diff --git a/src/PayloadChannel.ts b/src/PayloadChannel.ts index f2d07fd90d..11b0afd679 100644 --- a/src/PayloadChannel.ts +++ b/src/PayloadChannel.ts @@ -253,11 +253,6 @@ export class PayloadChannel extends EnhancedEventEmitter this._ongoingNotification.data, payload); - // TODO: REMOVE - logger.warn('<<<< NOTIFICATION RECEIVED IN NODE:', this._ongoingNotification); - logger.warn('- buffer: %o', payload); - logger.warn('- buffer.toString(): %s', payload.toString('utf-8')); - // Unset ongoing notification. this._ongoingNotification = undefined; } diff --git a/worker/src/Worker.cpp b/worker/src/Worker.cpp index f99cfbeaa0..e0bd34b18d 100644 --- a/worker/src/Worker.cpp +++ b/worker/src/Worker.cpp @@ -292,17 +292,7 @@ inline void Worker::OnPayloadChannelNotification( { MS_TRACE(); - // TODO: REMOVE - MS_DUMP( - ">>>> NOTIFICATION RECEIVED IN C++ [event:'%s'], SENDING IT BACK TO NODE !!!!", - notification->event.c_str()); - - // TODO: REMOVE - std::string targetId{ "1234" }; - - PayloadChannel::Notifier::Emit(targetId, notification->event.c_str(), notification->payload, notification->payloadLen); - - // TODO + MS_DEBUG_DEV("PayloadChannel notification received [event:%s]", notification->event.c_str()); } inline void Worker::OnPayloadChannelClosed(PayloadChannel::UnixStreamSocket* /*payloadChannel*/) From 93b55a14e5f8e498d1225d85080f436cb49b0058 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?I=C3=B1aki=20Baz=20Castillo?= Date: Thu, 28 May 2020 11:41:30 +0200 Subject: [PATCH 05/23] Add DataTransport.ts and router.createDataTransport() --- TODO_DATACHANNEL_TERMINATION.md | 4 +- lib/DataTransport.d.ts | 115 +++++++++++++++ lib/DataTransport.d.ts.map | 1 + lib/DataTransport.js | 140 ++++++++++++++++++ lib/PipeTransport.d.ts | 3 +- lib/PipeTransport.d.ts.map | 2 +- lib/PlainTransport.d.ts | 3 +- lib/PlainTransport.d.ts.map | 2 +- lib/Router.d.ts | 10 +- lib/Router.d.ts.map | 2 +- lib/Router.js | 36 ++++- lib/RtpObserver.d.ts | 5 +- lib/RtpObserver.d.ts.map | 2 +- lib/RtpObserver.js | 3 +- lib/Transport.d.ts | 5 +- lib/Transport.d.ts.map | 2 +- lib/Transport.js | 3 +- lib/WebRtcTransport.d.ts | 3 +- lib/WebRtcTransport.d.ts.map | 2 +- lib/Worker.d.ts.map | 2 +- lib/Worker.js | 1 + lib/errors.d.ts | 7 + lib/errors.d.ts.map | 2 +- lib/errors.js | 15 ++ src/DataTransport.ts | 244 ++++++++++++++++++++++++++++++++ src/PipeTransport.ts | 3 +- src/PlainTransport.ts | 3 +- src/Router.ts | 64 +++++++++ src/RtpObserver.ts | 7 + src/Transport.ts | 7 + src/WebRtcTransport.ts | 3 +- src/Worker.ts | 3 +- src/errors.ts | 19 +++ 33 files changed, 693 insertions(+), 30 deletions(-) create mode 100644 lib/DataTransport.d.ts create mode 100644 lib/DataTransport.d.ts.map create mode 100644 lib/DataTransport.js create mode 100644 src/DataTransport.ts diff --git a/TODO_DATACHANNEL_TERMINATION.md b/TODO_DATACHANNEL_TERMINATION.md index 15c7e6d72b..a4e908e10f 100644 --- a/TODO_DATACHANNEL_TERMINATION.md +++ b/TODO_DATACHANNEL_TERMINATION.md @@ -1,6 +1,4 @@ # TODO DataChannel Termination -- Set proper max size for `netstring` messages in `PayloadChannel` (in JS and C++). - -- `payloadChannel.send()`: Assert that `payload` is given. +- Set proper max size for `netstring` messages in `PayloadChannel` (in JS and C++). It must match `maxSctpMessageSize` in `DataTransport.ts`. diff --git a/lib/DataTransport.d.ts b/lib/DataTransport.d.ts new file mode 100644 index 0000000000..50a2ebd542 --- /dev/null +++ b/lib/DataTransport.d.ts @@ -0,0 +1,115 @@ +import { EnhancedEventEmitter } from './EnhancedEventEmitter'; +import { Transport, SctpState } from './Transport'; +import { Producer, ProducerOptions } from './Producer'; +import { Consumer, ConsumerOptions } from './Consumer'; +import { SctpParameters } from './SctpParameters'; +export declare type DataTransportOptions = { + /** + * Create a SCTP association. Default true. + */ + enableSctp?: boolean; + /** + * Maximum size of data that can be passed to DataProducer's send() method. + * Default 262144. + */ + maxSctpMessageSize?: number; + /** + * Custom application data. + */ + appData?: any; +}; +export declare type DataTransportStat = { + type: string; + transportId: string; + timestamp: number; + sctpState?: SctpState; + bytesReceived: number; + recvBitrate: number; + bytesSent: number; + sendBitrate: number; + rtpBytesReceived: number; + rtpRecvBitrate: number; + rtpBytesSent: number; + rtpSendBitrate: number; + rtxBytesReceived: number; + rtxRecvBitrate: number; + rtxBytesSent: number; + rtxSendBitrate: number; + probationBytesReceived: number; + probationRecvBitrate: number; + probationBytesSent: number; + probationSendBitrate: number; + availableOutgoingBitrate?: number; + availableIncomingBitrate?: number; + maxIncomingBitrate?: number; +}; +export declare class DataTransport extends Transport { + protected readonly _data: { + sctpParameters?: SctpParameters; + sctpState?: SctpState; + }; + /** + * @private + * @emits sctpstatechange - (sctpState: SctpState) + * @emits trace - (trace: TransportTraceEventData) + */ + constructor(params: any); + /** + * SCTP parameters. + */ + get sctpParameters(): SctpParameters | undefined; + /** + * SCTP state. + */ + get sctpState(): SctpState | undefined; + /** + * Observer. + * + * @override + * @emits close + * @emits newdataproducer - (dataProducer: DataProducer) + * @emits newdataconsumer - (dataProducer: DataProducer) + * @emits sctpstatechange - (sctpState: SctpState) + * @emits trace - (trace: TransportTraceEventData) + */ + get observer(): EnhancedEventEmitter; + /** + * Close the DataTransport. + * + * @override + */ + close(): void; + /** + * Router was closed. + * + * @private + * @override + */ + routerClosed(): void; + /** + * Get DataTransport stats. + * + * @override + */ + getStats(): Promise; + /** + * NO-OP method in DataTransport. + * + * @override + */ + connect(): Promise; + /** + * @override + */ + setMaxIncomingBitrate(bitrate: number): Promise; + /** + * @override + */ + produce(options: ProducerOptions): Promise; + /** + * @override + */ + consumer(options: ConsumerOptions): Promise; + private _handleWorkerNotifications; +} +//# sourceMappingURL=DataTransport.d.ts.map \ No newline at end of file diff --git a/lib/DataTransport.d.ts.map b/lib/DataTransport.d.ts.map new file mode 100644 index 0000000000..0140e1b60a --- /dev/null +++ b/lib/DataTransport.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"DataTransport.d.ts","sourceRoot":"","sources":["../src/DataTransport.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAE9D,OAAO,EAAE,SAAS,EAA2B,SAAS,EAAE,MAAM,aAAa,CAAC;AAC5E,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AACvD,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElD,oBAAY,oBAAoB,GAChC;IACC;;OAEG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IAErB;;;OAGG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAE5B;;OAEG;IACH,OAAO,CAAC,EAAE,GAAG,CAAC;CACd,CAAA;AAED,oBAAY,iBAAiB,GAC7B;IAEC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,sBAAsB,EAAE,MAAM,CAAC;IAC/B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC5B,CAAA;AAID,qBAAa,aAAc,SAAQ,SAAS;IAG3C,SAAS,CAAC,QAAQ,CAAC,KAAK,EACxB;QACC,cAAc,CAAC,EAAE,cAAc,CAAC;QAChC,SAAS,CAAC,EAAE,SAAS,CAAC;KACtB,CAAC;IAEF;;;;OAIG;gBACS,MAAM,EAAE,GAAG;IAiBvB;;OAEG;IACH,IAAI,cAAc,IAAI,cAAc,GAAG,SAAS,CAG/C;IAED;;OAEG;IACH,IAAI,SAAS,IAAI,SAAS,GAAG,SAAS,CAGrC;IAED;;;;;;;;;OASG;IACH,IAAI,QAAQ,IAAI,oBAAoB,CAGnC;IAED;;;;OAIG;IACH,KAAK,IAAI,IAAI;IAWb;;;;;OAKG;IACH,YAAY,IAAI,IAAI;IAWpB;;;;OAIG;IACG,QAAQ,IAAI,OAAO,CAAC,iBAAiB,EAAE,CAAC;IAO9C;;;;OAIG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAK9B;;OAEG;IAEG,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAM3D;;OAEG;IAEG,OAAO,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,QAAQ,CAAC;IAM1D;;OAEG;IAEG,QAAQ,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,QAAQ,CAAC;IAM3D,OAAO,CAAC,0BAA0B;CAuClC"} \ No newline at end of file diff --git a/lib/DataTransport.js b/lib/DataTransport.js new file mode 100644 index 0000000000..f007d6b779 --- /dev/null +++ b/lib/DataTransport.js @@ -0,0 +1,140 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const Logger_1 = require("./Logger"); +const errors_1 = require("./errors"); +const Transport_1 = require("./Transport"); +const logger = new Logger_1.Logger('DataTransport'); +class DataTransport extends Transport_1.Transport { + /** + * @private + * @emits sctpstatechange - (sctpState: SctpState) + * @emits trace - (trace: TransportTraceEventData) + */ + constructor(params) { + super(params); + logger.debug('constructor()'); + const { data } = params; + this._data = + { + sctpParameters: data.sctpParameters, + sctpState: data.sctpState + }; + this._handleWorkerNotifications(); + } + /** + * SCTP parameters. + */ + get sctpParameters() { + return this._data.sctpParameters; + } + /** + * SCTP state. + */ + get sctpState() { + return this._data.sctpState; + } + /** + * Observer. + * + * @override + * @emits close + * @emits newdataproducer - (dataProducer: DataProducer) + * @emits newdataconsumer - (dataProducer: DataProducer) + * @emits sctpstatechange - (sctpState: SctpState) + * @emits trace - (trace: TransportTraceEventData) + */ + get observer() { + return this._observer; + } + /** + * Close the DataTransport. + * + * @override + */ + close() { + if (this._closed) + return; + if (this._data.sctpState) + this._data.sctpState = 'closed'; + super.close(); + } + /** + * Router was closed. + * + * @private + * @override + */ + routerClosed() { + if (this._closed) + return; + if (this._data.sctpState) + this._data.sctpState = 'closed'; + super.routerClosed(); + } + /** + * Get DataTransport stats. + * + * @override + */ + async getStats() { + logger.debug('getStats()'); + return this._channel.request('transport.getStats', this._internal); + } + /** + * NO-OP method in DataTransport. + * + * @override + */ + async connect() { + logger.debug('connect()'); + } + /** + * @override + */ + // eslint-disable-next-line @typescript-eslint/no-unused-vars + async setMaxIncomingBitrate(bitrate) { + throw new errors_1.NotImplementedError('setMaxIncomingBitrate() not implemented in DataTransport'); + } + /** + * @override + */ + // eslint-disable-next-line @typescript-eslint/no-unused-vars + async produce(options) { + throw new errors_1.NotImplementedError('produce() not implemented in DataTransport'); + } + /** + * @override + */ + // eslint-disable-next-line @typescript-eslint/no-unused-vars + async consumer(options) { + throw new errors_1.NotImplementedError('consumer() not implemented in DataTransport'); + } + _handleWorkerNotifications() { + this._channel.on(this._internal.transportId, (event, data) => { + switch (event) { + case 'sctpstatechange': + { + const sctpState = data.sctpState; + this._data.sctpState = sctpState; + this.safeEmit('sctpstatechange', sctpState); + // Emit observer event. + this._observer.safeEmit('sctpstatechange', sctpState); + break; + } + case 'trace': + { + const trace = data; + this.safeEmit('trace', trace); + // Emit observer event. + this._observer.safeEmit('trace', trace); + break; + } + default: + { + logger.error('ignoring unknown event "%s"', event); + } + } + }); + } +} +exports.DataTransport = DataTransport; diff --git a/lib/PipeTransport.d.ts b/lib/PipeTransport.d.ts index 6d93691f61..1477197542 100644 --- a/lib/PipeTransport.d.ts +++ b/lib/PipeTransport.d.ts @@ -17,8 +17,7 @@ export declare type PipeTransportOptions = { */ numSctpStreams?: NumSctpStreams; /** - * Maximum size of data that can be passed to DataProducer's send() method. - * Default 262144. + * Maximum allowed size for SCTP messages. Default 262144. */ maxSctpMessageSize?: number; /** diff --git a/lib/PipeTransport.d.ts.map b/lib/PipeTransport.d.ts.map index 54557fc9d0..237e82484d 100644 --- a/lib/PipeTransport.d.ts.map +++ b/lib/PipeTransport.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"PipeTransport.d.ts","sourceRoot":"","sources":["../src/PipeTransport.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"PipeTransport.d.ts","sourceRoot":"","sources":["../src/PipeTransport.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/lib/PlainTransport.d.ts b/lib/PlainTransport.d.ts index ca4f058574..71c65efde7 100644 --- a/lib/PlainTransport.d.ts +++ b/lib/PlainTransport.d.ts @@ -27,8 +27,7 @@ export declare type PlainTransportOptions = { */ numSctpStreams?: NumSctpStreams; /** - * Maximum size of data that can be passed to DataProducer's send() method. - * Default 262144. + * Maximum allowed size for SCTP messages. Default 262144. */ maxSctpMessageSize?: number; /** diff --git a/lib/PlainTransport.d.ts.map b/lib/PlainTransport.d.ts.map index 23ae7faaf2..09cd68a0a3 100644 --- a/lib/PlainTransport.d.ts.map +++ b/lib/PlainTransport.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"PlainTransport.d.ts","sourceRoot":"","sources":["../src/PlainTransport.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"PlainTransport.d.ts","sourceRoot":"","sources":["../src/PlainTransport.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/lib/Router.d.ts b/lib/Router.d.ts index 1655a8581f..a794523f0e 100644 --- a/lib/Router.d.ts +++ b/lib/Router.d.ts @@ -1,9 +1,11 @@ import { EnhancedEventEmitter } from './EnhancedEventEmitter'; import { Channel } from './Channel'; +import { PayloadChannel } from './PayloadChannel'; import { TransportListenIp } from './Transport'; import { WebRtcTransport, WebRtcTransportOptions } from './WebRtcTransport'; import { PlainTransport, PlainTransportOptions } from './PlainTransport'; import { PipeTransport, PipeTransportOptions } from './PipeTransport'; +import { DataTransport, DataTransportOptions } from './DataTransport'; import { Producer } from './Producer'; import { Consumer } from './Consumer'; import { DataProducer } from './DataProducer'; @@ -77,6 +79,7 @@ export declare class Router extends EnhancedEventEmitter { private readonly _internal; private readonly _data; private readonly _channel; + private readonly _payloadChannel; private _closed; private readonly _appData?; private readonly _transports; @@ -91,10 +94,11 @@ export declare class Router extends EnhancedEventEmitter { * @emits workerclose * @emits @close */ - constructor({ internal, data, channel, appData }: { + constructor({ internal, data, channel, payloadChannel, appData }: { internal: any; data: any; channel: Channel; + payloadChannel: PayloadChannel; appData?: any; }); /** @@ -155,6 +159,10 @@ export declare class Router extends EnhancedEventEmitter { * Create a PipeTransport. */ createPipeTransport({ listenIp, enableSctp, numSctpStreams, maxSctpMessageSize, enableRtx, enableSrtp, appData }: PipeTransportOptions): Promise; + /** + * Create a DataTransport. + */ + createDataTransport({ enableSctp, maxSctpMessageSize, appData }: DataTransportOptions): Promise; /** * Pipes the given Producer or DataProducer into another Router in same host. */ diff --git a/lib/Router.d.ts.map b/lib/Router.d.ts.map index 663a2664ca..c0e656e6a3 100644 --- a/lib/Router.d.ts.map +++ b/lib/Router.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"Router.d.ts","sourceRoot":"","sources":["../src/Router.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"Router.d.ts","sourceRoot":"","sources":["../src/Router.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/lib/Router.js b/lib/Router.js index 119812ea63..5be7a5a99f 100644 --- a/lib/Router.js +++ b/lib/Router.js @@ -16,6 +16,7 @@ const errors_1 = require("./errors"); const WebRtcTransport_1 = require("./WebRtcTransport"); const PlainTransport_1 = require("./PlainTransport"); const PipeTransport_1 = require("./PipeTransport"); +const DataTransport_1 = require("./DataTransport"); const AudioLevelObserver_1 = require("./AudioLevelObserver"); const logger = new Logger_1.Logger('Router'); class Router extends EnhancedEventEmitter_1.EnhancedEventEmitter { @@ -24,7 +25,7 @@ class Router extends EnhancedEventEmitter_1.EnhancedEventEmitter { * @emits workerclose * @emits @close */ - constructor({ internal, data, channel, appData }) { + constructor({ internal, data, channel, payloadChannel, appData }) { super(); // Closed flag. this._closed = false; @@ -46,6 +47,7 @@ class Router extends EnhancedEventEmitter_1.EnhancedEventEmitter { this._internal = internal; this._data = data; this._channel = channel; + this._payloadChannel = payloadChannel; this._appData = appData; } /** @@ -198,6 +200,7 @@ class Router extends EnhancedEventEmitter_1.EnhancedEventEmitter { internal, data, channel: this._channel, + payloadChannel: this._payloadChannel, appData, getRouterRtpCapabilities: () => this._data.rtpCapabilities, getProducerById: (producerId) => (this._producers.get(producerId)), @@ -252,6 +255,7 @@ class Router extends EnhancedEventEmitter_1.EnhancedEventEmitter { internal, data, channel: this._channel, + payloadChannel: this._payloadChannel, appData, getRouterRtpCapabilities: () => this._data.rtpCapabilities, getProducerById: (producerId) => (this._producers.get(producerId)), @@ -311,6 +315,35 @@ class Router extends EnhancedEventEmitter_1.EnhancedEventEmitter { internal, data, channel: this._channel, + payloadChannel: this._payloadChannel, + appData, + getRouterRtpCapabilities: () => this._data.rtpCapabilities, + getProducerById: (producerId) => (this._producers.get(producerId)), + getDataProducerById: (dataProducerId) => (this._dataProducers.get(dataProducerId)) + }); + this._transports.set(transport.id, transport); + transport.on('@close', () => this._transports.delete(transport.id)); + transport.on('@newproducer', (producer) => this._producers.set(producer.id, producer)); + transport.on('@producerclose', (producer) => this._producers.delete(producer.id)); + transport.on('@newdataproducer', (dataProducer) => (this._dataProducers.set(dataProducer.id, dataProducer))); + transport.on('@dataproducerclose', (dataProducer) => (this._dataProducers.delete(dataProducer.id))); + // Emit observer event. + this._observer.safeEmit('newtransport', transport); + return transport; + } + /** + * Create a DataTransport. + */ + async createDataTransport({ enableSctp = true, maxSctpMessageSize = 262144, appData = {} }) { + logger.debug('createDataTransport()'); + const internal = { ...this._internal, transportId: uuid_1.v4() }; + const reqData = { enableSctp, maxSctpMessageSize }; + const data = await this._channel.request('router.createDataTransport', internal, reqData); + const transport = new DataTransport_1.DataTransport({ + internal, + data, + channel: this._channel, + payloadChannel: this._payloadChannel, appData, getRouterRtpCapabilities: () => this._data.rtpCapabilities, getProducerById: (producerId) => (this._producers.get(producerId)), @@ -479,6 +512,7 @@ class Router extends EnhancedEventEmitter_1.EnhancedEventEmitter { const audioLevelObserver = new AudioLevelObserver_1.AudioLevelObserver({ internal, channel: this._channel, + payloadChannel: this._payloadChannel, appData, getProducerById: (producerId) => (this._producers.get(producerId)) }); diff --git a/lib/RtpObserver.d.ts b/lib/RtpObserver.d.ts index a30b61ebe3..2f81ba6e26 100644 --- a/lib/RtpObserver.d.ts +++ b/lib/RtpObserver.d.ts @@ -1,5 +1,6 @@ import { EnhancedEventEmitter } from './EnhancedEventEmitter'; import { Channel } from './Channel'; +import { PayloadChannel } from './PayloadChannel'; import { Producer } from './Producer'; export declare class RtpObserver extends EnhancedEventEmitter { protected readonly _internal: { @@ -7,6 +8,7 @@ export declare class RtpObserver extends EnhancedEventEmitter { rtpObserverId: string; }; protected readonly _channel: Channel; + protected readonly _payloadChannel: PayloadChannel; protected _closed: boolean; protected _paused: boolean; private readonly _appData?; @@ -18,9 +20,10 @@ export declare class RtpObserver extends EnhancedEventEmitter { * @emits routerclose * @emits @close */ - constructor({ internal, channel, appData, getProducerById }: { + constructor({ internal, channel, payloadChannel, appData, getProducerById }: { internal: any; channel: Channel; + payloadChannel: PayloadChannel; appData: any; getProducerById: (producerId: string) => Producer; }); diff --git a/lib/RtpObserver.d.ts.map b/lib/RtpObserver.d.ts.map index db660f8ae8..9f537f1727 100644 --- a/lib/RtpObserver.d.ts.map +++ b/lib/RtpObserver.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"RtpObserver.d.ts","sourceRoot":"","sources":["../src/RtpObserver.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAItC,qBAAa,WAAY,SAAQ,oBAAoB;IAGpD,SAAS,CAAC,QAAQ,CAAC,SAAS,EAC5B;QACC,QAAQ,EAAE,MAAM,CAAC;QACjB,aAAa,EAAE,MAAM,CAAC;KACtB,CAAC;IAGF,SAAS,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAGrC,SAAS,CAAC,OAAO,UAAS;IAG1B,SAAS,CAAC,OAAO,UAAS;IAG1B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAM;IAGhC,SAAS,CAAC,QAAQ,CAAC,gBAAgB,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,QAAQ,CAAC;IAGtE,SAAS,CAAC,QAAQ,CAAC,SAAS,uBAA8B;IAE1D;;;;;OAKG;gBAEF,EACC,QAAQ,EACR,OAAO,EACP,OAAO,EACP,eAAe,EACf,EACD;QACC,QAAQ,EAAE,GAAG,CAAC;QACd,OAAO,EAAE,OAAO,CAAC;QACjB,OAAO,EAAE,GAAG,CAAC;QACb,eAAe,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,QAAQ,CAAC;KAClD;IAaF;;OAEG;IACH,IAAI,EAAE,IAAI,MAAM,CAGf;IAED;;OAEG;IACH,IAAI,MAAM,IAAI,OAAO,CAGpB;IAED;;OAEG;IACH,IAAI,MAAM,IAAI,OAAO,CAGpB;IAED;;OAEG;IACH,IAAI,OAAO,IAAI,GAAG,CAGjB;IAED;;OAEG;IACH,IAAI,OAAO,CAAC,OAAO,EAAE,GAAG,EAGvB;IAED;;;;;;;;OAQG;IACH,IAAI,QAAQ,IAAI,oBAAoB,CAGnC;IAED;;OAEG;IACH,KAAK,IAAI,IAAI;IAqBb;;;;OAIG;IACH,YAAY,IAAI,IAAI;IAkBpB;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAe5B;;OAEG;IACG,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAe7B;;OAEG;IACG,WAAW,CAAC,EAAE,UAAU,EAAE,EAAE;QAAE,UAAU,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAaxE;;OAEG;IACG,cAAc,CAAC,EAAE,UAAU,EAAE,EAAE;QAAE,UAAU,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;CAY3E"} \ No newline at end of file +{"version":3,"file":"RtpObserver.d.ts","sourceRoot":"","sources":["../src/RtpObserver.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAItC,qBAAa,WAAY,SAAQ,oBAAoB;IAGpD,SAAS,CAAC,QAAQ,CAAC,SAAS,EAC5B;QACC,QAAQ,EAAE,MAAM,CAAC;QACjB,aAAa,EAAE,MAAM,CAAC;KACtB,CAAC;IAGF,SAAS,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAGrC,SAAS,CAAC,QAAQ,CAAC,eAAe,EAAE,cAAc,CAAC;IAGnD,SAAS,CAAC,OAAO,UAAS;IAG1B,SAAS,CAAC,OAAO,UAAS;IAG1B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAM;IAGhC,SAAS,CAAC,QAAQ,CAAC,gBAAgB,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,QAAQ,CAAC;IAGtE,SAAS,CAAC,QAAQ,CAAC,SAAS,uBAA8B;IAE1D;;;;;OAKG;gBAEF,EACC,QAAQ,EACR,OAAO,EACP,cAAc,EACd,OAAO,EACP,eAAe,EACf,EACD;QACC,QAAQ,EAAE,GAAG,CAAC;QACd,OAAO,EAAE,OAAO,CAAC;QACjB,cAAc,EAAE,cAAc,CAAC;QAC/B,OAAO,EAAE,GAAG,CAAC;QACb,eAAe,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,QAAQ,CAAC;KAClD;IAcF;;OAEG;IACH,IAAI,EAAE,IAAI,MAAM,CAGf;IAED;;OAEG;IACH,IAAI,MAAM,IAAI,OAAO,CAGpB;IAED;;OAEG;IACH,IAAI,MAAM,IAAI,OAAO,CAGpB;IAED;;OAEG;IACH,IAAI,OAAO,IAAI,GAAG,CAGjB;IAED;;OAEG;IACH,IAAI,OAAO,CAAC,OAAO,EAAE,GAAG,EAGvB;IAED;;;;;;;;OAQG;IACH,IAAI,QAAQ,IAAI,oBAAoB,CAGnC;IAED;;OAEG;IACH,KAAK,IAAI,IAAI;IAqBb;;;;OAIG;IACH,YAAY,IAAI,IAAI;IAkBpB;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAe5B;;OAEG;IACG,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAe7B;;OAEG;IACG,WAAW,CAAC,EAAE,UAAU,EAAE,EAAE;QAAE,UAAU,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAaxE;;OAEG;IACG,cAAc,CAAC,EAAE,UAAU,EAAE,EAAE;QAAE,UAAU,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;CAY3E"} \ No newline at end of file diff --git a/lib/RtpObserver.js b/lib/RtpObserver.js index 2469bf6858..8c24759c19 100644 --- a/lib/RtpObserver.js +++ b/lib/RtpObserver.js @@ -10,7 +10,7 @@ class RtpObserver extends EnhancedEventEmitter_1.EnhancedEventEmitter { * @emits routerclose * @emits @close */ - constructor({ internal, channel, appData, getProducerById }) { + constructor({ internal, channel, payloadChannel, appData, getProducerById }) { super(); // Closed flag. this._closed = false; @@ -21,6 +21,7 @@ class RtpObserver extends EnhancedEventEmitter_1.EnhancedEventEmitter { logger.debug('constructor()'); this._internal = internal; this._channel = channel; + this._payloadChannel = payloadChannel; this._appData = appData; this._getProducerById = getProducerById; } diff --git a/lib/Transport.d.ts b/lib/Transport.d.ts index e20fa3aa93..e44ee37b27 100644 --- a/lib/Transport.d.ts +++ b/lib/Transport.d.ts @@ -1,5 +1,6 @@ import { EnhancedEventEmitter } from './EnhancedEventEmitter'; import { Channel } from './Channel'; +import { PayloadChannel } from './PayloadChannel'; import { Producer, ProducerOptions } from './Producer'; import { Consumer, ConsumerOptions } from './Consumer'; import { DataProducer, DataProducerOptions } from './DataProducer'; @@ -64,6 +65,7 @@ export declare class Transport extends EnhancedEventEmitter { sctpState?: SctpState; }; protected readonly _channel: Channel; + protected readonly _payloadChannel: PayloadChannel; protected _closed: boolean; private readonly _appData?; protected readonly _getRouterRtpCapabilities: () => RtpCapabilities; @@ -88,10 +90,11 @@ export declare class Transport extends EnhancedEventEmitter { * @emits @newdataproducer - (dataProducer: DataProducer) * @emits @dataproducerclose - (dataProducer: DataProducer) */ - constructor({ internal, data, channel, appData, getRouterRtpCapabilities, getProducerById, getDataProducerById }: { + constructor({ internal, data, channel, payloadChannel, appData, getRouterRtpCapabilities, getProducerById, getDataProducerById }: { internal: any; data: any; channel: Channel; + payloadChannel: PayloadChannel; appData: any; getRouterRtpCapabilities: () => RtpCapabilities; getProducerById: (producerId: string) => Producer; diff --git a/lib/Transport.d.ts.map b/lib/Transport.d.ts.map index 6dad297add..8ea3a38151 100644 --- a/lib/Transport.d.ts.map +++ b/lib/Transport.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"Transport.d.ts","sourceRoot":"","sources":["../src/Transport.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"Transport.d.ts","sourceRoot":"","sources":["../src/Transport.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/lib/Transport.js b/lib/Transport.js index be54f201d4..c644f8ce02 100644 --- a/lib/Transport.js +++ b/lib/Transport.js @@ -28,7 +28,7 @@ class Transport extends EnhancedEventEmitter_1.EnhancedEventEmitter { * @emits @newdataproducer - (dataProducer: DataProducer) * @emits @dataproducerclose - (dataProducer: DataProducer) */ - constructor({ internal, data, channel, appData, getRouterRtpCapabilities, getProducerById, getDataProducerById }) { + constructor({ internal, data, channel, payloadChannel, appData, getRouterRtpCapabilities, getProducerById, getDataProducerById }) { super(); // Close flag. this._closed = false; @@ -50,6 +50,7 @@ class Transport extends EnhancedEventEmitter_1.EnhancedEventEmitter { this._internal = internal; this._data = data; this._channel = channel; + this._payloadChannel = payloadChannel; this._appData = appData; this._getRouterRtpCapabilities = getRouterRtpCapabilities; this._getProducerById = getProducerById; diff --git a/lib/WebRtcTransport.d.ts b/lib/WebRtcTransport.d.ts index baa71f16e9..8027ff0678 100644 --- a/lib/WebRtcTransport.d.ts +++ b/lib/WebRtcTransport.d.ts @@ -36,8 +36,7 @@ export declare type WebRtcTransportOptions = { */ numSctpStreams?: NumSctpStreams; /** - * Maximum size of data that can be passed to DataProducer's send() method. - * Default 262144. + * Maximum allowed size for SCTP messages. Default 262144. */ maxSctpMessageSize?: number; /** diff --git a/lib/WebRtcTransport.d.ts.map b/lib/WebRtcTransport.d.ts.map index 4975f2cbce..29d04f1d89 100644 --- a/lib/WebRtcTransport.d.ts.map +++ b/lib/WebRtcTransport.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"WebRtcTransport.d.ts","sourceRoot":"","sources":["../src/WebRtcTransport.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"WebRtcTransport.d.ts","sourceRoot":"","sources":["../src/WebRtcTransport.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/lib/Worker.d.ts.map b/lib/Worker.d.ts.map index e479e5d14c..d62cf2676c 100644 --- a/lib/Worker.d.ts.map +++ b/lib/Worker.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"Worker.d.ts","sourceRoot":"","sources":["../src/Worker.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"Worker.d.ts","sourceRoot":"","sources":["../src/Worker.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/lib/Worker.js b/lib/Worker.js index 37f880849c..6558572b43 100644 --- a/lib/Worker.js +++ b/lib/Worker.js @@ -257,6 +257,7 @@ class Worker extends EnhancedEventEmitter_1.EnhancedEventEmitter { internal, data, channel: this._channel, + payloadChannel: this._payloadChannel, appData }); this._routers.add(router); diff --git a/lib/errors.d.ts b/lib/errors.d.ts index 57b24c5380..2abd563895 100644 --- a/lib/errors.d.ts +++ b/lib/errors.d.ts @@ -10,4 +10,11 @@ export declare class UnsupportedError extends Error { export declare class InvalidStateError extends Error { constructor(message: string); } +/** + * Error produced when calling a method that is not implemented for a certain + * subclass. + */ +export declare class NotImplementedError extends Error { + constructor(message: string); +} //# sourceMappingURL=errors.d.ts.map \ No newline at end of file diff --git a/lib/errors.d.ts.map b/lib/errors.d.ts.map index a622738928..86b9f686e7 100644 --- a/lib/errors.d.ts.map +++ b/lib/errors.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,qBAAa,gBAAiB,SAAQ,KAAK;gBAE9B,OAAO,EAAE,MAAM;CAW3B;AAED;;GAEG;AACH,qBAAa,iBAAkB,SAAQ,KAAK;gBAE/B,OAAO,EAAE,MAAM;CAW3B"} \ No newline at end of file +{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,qBAAa,gBAAiB,SAAQ,KAAK;gBAE9B,OAAO,EAAE,MAAM;CAW3B;AAED;;GAEG;AACH,qBAAa,iBAAkB,SAAQ,KAAK;gBAE/B,OAAO,EAAE,MAAM;CAW3B;AAED;;;GAGG;AACH,qBAAa,mBAAoB,SAAQ,KAAK;gBAEjC,OAAO,EAAE,MAAM;CAW3B"} \ No newline at end of file diff --git a/lib/errors.js b/lib/errors.js index 0eaf287ff5..880475f60f 100644 --- a/lib/errors.js +++ b/lib/errors.js @@ -28,3 +28,18 @@ class InvalidStateError extends Error { } } exports.InvalidStateError = InvalidStateError; +/** + * Error produced when calling a method that is not implemented for a certain + * subclass. + */ +class NotImplementedError extends Error { + constructor(message) { + super(message); + this.name = 'NotImplementedError'; + if (Error.hasOwnProperty('captureStackTrace')) // Just in V8. + Error.captureStackTrace(this, NotImplementedError); + else + this.stack = (new Error(message)).stack; + } +} +exports.NotImplementedError = NotImplementedError; diff --git a/src/DataTransport.ts b/src/DataTransport.ts new file mode 100644 index 0000000000..6014a5d0df --- /dev/null +++ b/src/DataTransport.ts @@ -0,0 +1,244 @@ +import { Logger } from './Logger'; +import { EnhancedEventEmitter } from './EnhancedEventEmitter'; +import { NotImplementedError } from './errors'; +import { Transport, TransportTraceEventData, SctpState } from './Transport'; +import { Producer, ProducerOptions } from './Producer'; +import { Consumer, ConsumerOptions } from './Consumer'; +import { SctpParameters } from './SctpParameters'; + +export type DataTransportOptions = +{ + /** + * Create a SCTP association. Default true. + */ + enableSctp?: boolean; + + /** + * Maximum size of data that can be passed to DataProducer's send() method. + * Default 262144. + */ + maxSctpMessageSize?: number; + + /** + * Custom application data. + */ + appData?: any; +} + +export type DataTransportStat = +{ + // Common to all Transports. + type: string; + transportId: string; + timestamp: number; + sctpState?: SctpState; + bytesReceived: number; + recvBitrate: number; + bytesSent: number; + sendBitrate: number; + rtpBytesReceived: number; + rtpRecvBitrate: number; + rtpBytesSent: number; + rtpSendBitrate: number; + rtxBytesReceived: number; + rtxRecvBitrate: number; + rtxBytesSent: number; + rtxSendBitrate: number; + probationBytesReceived: number; + probationRecvBitrate: number; + probationBytesSent: number; + probationSendBitrate: number; + availableOutgoingBitrate?: number; + availableIncomingBitrate?: number; + maxIncomingBitrate?: number; +} + +const logger = new Logger('DataTransport'); + +export class DataTransport extends Transport +{ + // DataTransport data. + protected readonly _data: + { + sctpParameters?: SctpParameters; + sctpState?: SctpState; + }; + + /** + * @private + * @emits sctpstatechange - (sctpState: SctpState) + * @emits trace - (trace: TransportTraceEventData) + */ + constructor(params: any) + { + super(params); + + logger.debug('constructor()'); + + const { data } = params; + + this._data = + { + sctpParameters : data.sctpParameters, + sctpState : data.sctpState + }; + + this._handleWorkerNotifications(); + } + + /** + * SCTP parameters. + */ + get sctpParameters(): SctpParameters | undefined + { + return this._data.sctpParameters; + } + + /** + * SCTP state. + */ + get sctpState(): SctpState | undefined + { + return this._data.sctpState; + } + + /** + * Observer. + * + * @override + * @emits close + * @emits newdataproducer - (dataProducer: DataProducer) + * @emits newdataconsumer - (dataProducer: DataProducer) + * @emits sctpstatechange - (sctpState: SctpState) + * @emits trace - (trace: TransportTraceEventData) + */ + get observer(): EnhancedEventEmitter + { + return this._observer; + } + + /** + * Close the DataTransport. + * + * @override + */ + close(): void + { + if (this._closed) + return; + + if (this._data.sctpState) + this._data.sctpState = 'closed'; + + super.close(); + } + + /** + * Router was closed. + * + * @private + * @override + */ + routerClosed(): void + { + if (this._closed) + return; + + if (this._data.sctpState) + this._data.sctpState = 'closed'; + + super.routerClosed(); + } + + /** + * Get DataTransport stats. + * + * @override + */ + async getStats(): Promise + { + logger.debug('getStats()'); + + return this._channel.request('transport.getStats', this._internal); + } + + /** + * NO-OP method in DataTransport. + * + * @override + */ + async connect(): Promise + { + logger.debug('connect()'); + } + + /** + * @override + */ + // eslint-disable-next-line @typescript-eslint/no-unused-vars + async setMaxIncomingBitrate(bitrate: number): Promise + { + throw new NotImplementedError( + 'setMaxIncomingBitrate() not implemented in DataTransport'); + } + + /** + * @override + */ + // eslint-disable-next-line @typescript-eslint/no-unused-vars + async produce(options: ProducerOptions): Promise + { + throw new NotImplementedError( + 'produce() not implemented in DataTransport'); + } + + /** + * @override + */ + // eslint-disable-next-line @typescript-eslint/no-unused-vars + async consumer(options: ConsumerOptions): Promise + { + throw new NotImplementedError( + 'consumer() not implemented in DataTransport'); + } + + private _handleWorkerNotifications(): void + { + this._channel.on(this._internal.transportId, (event: string, data?: any) => + { + switch (event) + { + case 'sctpstatechange': + { + const sctpState = data.sctpState as SctpState; + + this._data.sctpState = sctpState; + + this.safeEmit('sctpstatechange', sctpState); + + // Emit observer event. + this._observer.safeEmit('sctpstatechange', sctpState); + + break; + } + + case 'trace': + { + const trace = data as TransportTraceEventData; + + this.safeEmit('trace', trace); + + // Emit observer event. + this._observer.safeEmit('trace', trace); + + break; + } + + default: + { + logger.error('ignoring unknown event "%s"', event); + } + } + }); + } +} diff --git a/src/PipeTransport.ts b/src/PipeTransport.ts index 2522e647fc..c7a3f9fdc8 100644 --- a/src/PipeTransport.ts +++ b/src/PipeTransport.ts @@ -31,8 +31,7 @@ export type PipeTransportOptions = numSctpStreams?: NumSctpStreams; /** - * Maximum size of data that can be passed to DataProducer's send() method. - * Default 262144. + * Maximum allowed size for SCTP messages. Default 262144. */ maxSctpMessageSize?: number; diff --git a/src/PlainTransport.ts b/src/PlainTransport.ts index d5cba2e79f..66a47da039 100644 --- a/src/PlainTransport.ts +++ b/src/PlainTransport.ts @@ -41,8 +41,7 @@ export type PlainTransportOptions = numSctpStreams?: NumSctpStreams; /** - * Maximum size of data that can be passed to DataProducer's send() method. - * Default 262144. + * Maximum allowed size for SCTP messages. Default 262144. */ maxSctpMessageSize?: number; diff --git a/src/Router.ts b/src/Router.ts index 40739e0dde..e7b9de072f 100644 --- a/src/Router.ts +++ b/src/Router.ts @@ -5,10 +5,12 @@ import { EnhancedEventEmitter } from './EnhancedEventEmitter'; import * as ortc from './ortc'; import { InvalidStateError } from './errors'; import { Channel } from './Channel'; +import { PayloadChannel } from './PayloadChannel'; import { Transport, TransportListenIp } from './Transport'; import { WebRtcTransport, WebRtcTransportOptions } from './WebRtcTransport'; import { PlainTransport, PlainTransportOptions } from './PlainTransport'; import { PipeTransport, PipeTransportOptions } from './PipeTransport'; +import { DataTransport, DataTransportOptions } from './DataTransport'; import { Producer } from './Producer'; import { Consumer } from './Consumer'; import { DataProducer } from './DataProducer'; @@ -116,6 +118,9 @@ export class Router extends EnhancedEventEmitter // Channel instance. private readonly _channel: Channel; + // PayloadChannel instance. + private readonly _payloadChannel: PayloadChannel; + // Closed flag. private _closed = false; @@ -154,12 +159,14 @@ export class Router extends EnhancedEventEmitter internal, data, channel, + payloadChannel, appData }: { internal: any; data: any; channel: Channel; + payloadChannel: PayloadChannel; appData?: any; } ) @@ -171,6 +178,7 @@ export class Router extends EnhancedEventEmitter this._internal = internal; this._data = data; this._channel = channel; + this._payloadChannel = payloadChannel; this._appData = appData; } @@ -392,6 +400,7 @@ export class Router extends EnhancedEventEmitter internal, data, channel : this._channel, + payloadChannel : this._payloadChannel, appData, getRouterRtpCapabilities : (): RtpCapabilities => this._data.rtpCapabilities, getProducerById : (producerId: string): Producer => ( @@ -481,6 +490,7 @@ export class Router extends EnhancedEventEmitter internal, data, channel : this._channel, + payloadChannel : this._payloadChannel, appData, getRouterRtpCapabilities : (): RtpCapabilities => this._data.rtpCapabilities, getProducerById : (producerId: string): Producer => ( @@ -579,6 +589,59 @@ export class Router extends EnhancedEventEmitter internal, data, channel : this._channel, + payloadChannel : this._payloadChannel, + appData, + getRouterRtpCapabilities : (): RtpCapabilities => this._data.rtpCapabilities, + getProducerById : (producerId: string): Producer => ( + this._producers.get(producerId) + ), + getDataProducerById : (dataProducerId: string): DataProducer => ( + this._dataProducers.get(dataProducerId) + ) + }); + + this._transports.set(transport.id, transport); + transport.on('@close', () => this._transports.delete(transport.id)); + transport.on('@newproducer', (producer: Producer) => this._producers.set(producer.id, producer)); + transport.on('@producerclose', (producer: Producer) => this._producers.delete(producer.id)); + transport.on('@newdataproducer', (dataProducer: DataProducer) => ( + this._dataProducers.set(dataProducer.id, dataProducer) + )); + transport.on('@dataproducerclose', (dataProducer: DataProducer) => ( + this._dataProducers.delete(dataProducer.id) + )); + + // Emit observer event. + this._observer.safeEmit('newtransport', transport); + + return transport; + } + + /** + * Create a DataTransport. + */ + async createDataTransport( + { + enableSctp = true, + maxSctpMessageSize = 262144, + appData = {} + }: DataTransportOptions + ): Promise + { + logger.debug('createDataTransport()'); + + const internal = { ...this._internal, transportId: uuidv4() }; + const reqData = { enableSctp, maxSctpMessageSize }; + + const data = + await this._channel.request('router.createDataTransport', internal, reqData); + + const transport = new DataTransport( + { + internal, + data, + channel : this._channel, + payloadChannel : this._payloadChannel, appData, getRouterRtpCapabilities : (): RtpCapabilities => this._data.rtpCapabilities, getProducerById : (producerId: string): Producer => ( @@ -852,6 +915,7 @@ export class Router extends EnhancedEventEmitter { internal, channel : this._channel, + payloadChannel : this._payloadChannel, appData, getProducerById : (producerId: string): Producer => ( this._producers.get(producerId) diff --git a/src/RtpObserver.ts b/src/RtpObserver.ts index ab9d4f1b44..0c324e0cf1 100644 --- a/src/RtpObserver.ts +++ b/src/RtpObserver.ts @@ -1,6 +1,7 @@ import { Logger } from './Logger'; import { EnhancedEventEmitter } from './EnhancedEventEmitter'; import { Channel } from './Channel'; +import { PayloadChannel } from './PayloadChannel'; import { Producer } from './Producer'; const logger = new Logger('RtpObserver'); @@ -17,6 +18,9 @@ export class RtpObserver extends EnhancedEventEmitter // Channel instance. protected readonly _channel: Channel; + // PayloadChannel instance. + protected readonly _payloadChannel: PayloadChannel; + // Closed flag. protected _closed = false; @@ -42,12 +46,14 @@ export class RtpObserver extends EnhancedEventEmitter { internal, channel, + payloadChannel, appData, getProducerById }: { internal: any; channel: Channel; + payloadChannel: PayloadChannel; appData: any; getProducerById: (producerId: string) => Producer; } @@ -59,6 +65,7 @@ export class RtpObserver extends EnhancedEventEmitter this._internal = internal; this._channel = channel; + this._payloadChannel = payloadChannel; this._appData = appData; this._getProducerById = getProducerById; } diff --git a/src/Transport.ts b/src/Transport.ts index 6c33536710..dbd2a2574d 100644 --- a/src/Transport.ts +++ b/src/Transport.ts @@ -4,6 +4,7 @@ import { EnhancedEventEmitter } from './EnhancedEventEmitter'; import * as utils from './utils'; import * as ortc from './ortc'; import { Channel } from './Channel'; +import { PayloadChannel } from './PayloadChannel'; import { Producer, ProducerOptions } from './Producer'; import { Consumer, ConsumerOptions } from './Consumer'; import { DataProducer, DataProducerOptions } from './DataProducer'; @@ -93,6 +94,9 @@ export class Transport extends EnhancedEventEmitter // Channel instance. protected readonly _channel: Channel; + // PayloadChannel instance. + protected readonly _payloadChannel: PayloadChannel; + // Close flag. protected _closed = false; @@ -150,6 +154,7 @@ export class Transport extends EnhancedEventEmitter internal, data, channel, + payloadChannel, appData, getRouterRtpCapabilities, getProducerById, @@ -159,6 +164,7 @@ export class Transport extends EnhancedEventEmitter internal: any; data: any; channel: Channel; + payloadChannel: PayloadChannel; appData: any; getRouterRtpCapabilities: () => RtpCapabilities; getProducerById: (producerId: string) => Producer; @@ -173,6 +179,7 @@ export class Transport extends EnhancedEventEmitter this._internal = internal; this._data = data; this._channel = channel; + this._payloadChannel = payloadChannel; this._appData = appData; this._getRouterRtpCapabilities = getRouterRtpCapabilities; this._getProducerById = getProducerById; diff --git a/src/WebRtcTransport.ts b/src/WebRtcTransport.ts index 9e8341e60a..3c65596ee4 100644 --- a/src/WebRtcTransport.ts +++ b/src/WebRtcTransport.ts @@ -54,8 +54,7 @@ export type WebRtcTransportOptions = numSctpStreams?: NumSctpStreams; /** - * Maximum size of data that can be passed to DataProducer's send() method. - * Default 262144. + * Maximum allowed size for SCTP messages. Default 262144. */ maxSctpMessageSize?: number; diff --git a/src/Worker.ts b/src/Worker.ts index 65124d843a..dd89aac21b 100644 --- a/src/Worker.ts +++ b/src/Worker.ts @@ -534,7 +534,8 @@ export class Worker extends EnhancedEventEmitter { internal, data, - channel : this._channel, + channel : this._channel, + payloadChannel : this._payloadChannel, appData }); diff --git a/src/errors.ts b/src/errors.ts index 0dff994d6e..7341cb8325 100644 --- a/src/errors.ts +++ b/src/errors.ts @@ -33,3 +33,22 @@ export class InvalidStateError extends Error this.stack = (new Error(message)).stack; } } + +/** + * Error produced when calling a method that is not implemented for a certain + * subclass. + */ +export class NotImplementedError extends Error +{ + constructor(message: string) + { + super(message); + + this.name = 'NotImplementedError'; + + if (Error.hasOwnProperty('captureStackTrace')) // Just in V8. + Error.captureStackTrace(this, NotImplementedError); + else + this.stack = (new Error(message)).stack; + } +} From bce3c56ff61a6cdfe0ec250f943b467d051e9984 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?I=C3=B1aki=20Baz=20Castillo?= Date: Thu, 28 May 2020 11:43:45 +0200 Subject: [PATCH 06/23] cosmetic --- lib/DataTransport.d.ts.map | 2 +- lib/DataTransport.js | 6 +++--- lib/errors.d.ts | 7 ------- lib/errors.d.ts.map | 2 +- lib/errors.js | 15 --------------- src/DataTransport.ts | 10 ++++------ src/errors.ts | 19 ------------------- 7 files changed, 9 insertions(+), 52 deletions(-) diff --git a/lib/DataTransport.d.ts.map b/lib/DataTransport.d.ts.map index 0140e1b60a..443253fc15 100644 --- a/lib/DataTransport.d.ts.map +++ b/lib/DataTransport.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"DataTransport.d.ts","sourceRoot":"","sources":["../src/DataTransport.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAE9D,OAAO,EAAE,SAAS,EAA2B,SAAS,EAAE,MAAM,aAAa,CAAC;AAC5E,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AACvD,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElD,oBAAY,oBAAoB,GAChC;IACC;;OAEG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IAErB;;;OAGG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAE5B;;OAEG;IACH,OAAO,CAAC,EAAE,GAAG,CAAC;CACd,CAAA;AAED,oBAAY,iBAAiB,GAC7B;IAEC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,sBAAsB,EAAE,MAAM,CAAC;IAC/B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC5B,CAAA;AAID,qBAAa,aAAc,SAAQ,SAAS;IAG3C,SAAS,CAAC,QAAQ,CAAC,KAAK,EACxB;QACC,cAAc,CAAC,EAAE,cAAc,CAAC;QAChC,SAAS,CAAC,EAAE,SAAS,CAAC;KACtB,CAAC;IAEF;;;;OAIG;gBACS,MAAM,EAAE,GAAG;IAiBvB;;OAEG;IACH,IAAI,cAAc,IAAI,cAAc,GAAG,SAAS,CAG/C;IAED;;OAEG;IACH,IAAI,SAAS,IAAI,SAAS,GAAG,SAAS,CAGrC;IAED;;;;;;;;;OASG;IACH,IAAI,QAAQ,IAAI,oBAAoB,CAGnC;IAED;;;;OAIG;IACH,KAAK,IAAI,IAAI;IAWb;;;;;OAKG;IACH,YAAY,IAAI,IAAI;IAWpB;;;;OAIG;IACG,QAAQ,IAAI,OAAO,CAAC,iBAAiB,EAAE,CAAC;IAO9C;;;;OAIG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAK9B;;OAEG;IAEG,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAM3D;;OAEG;IAEG,OAAO,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,QAAQ,CAAC;IAM1D;;OAEG;IAEG,QAAQ,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,QAAQ,CAAC;IAM3D,OAAO,CAAC,0BAA0B;CAuClC"} \ No newline at end of file +{"version":3,"file":"DataTransport.d.ts","sourceRoot":"","sources":["../src/DataTransport.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAE9D,OAAO,EAAE,SAAS,EAA2B,SAAS,EAAE,MAAM,aAAa,CAAC;AAC5E,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AACvD,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElD,oBAAY,oBAAoB,GAChC;IACC;;OAEG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IAErB;;;OAGG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAE5B;;OAEG;IACH,OAAO,CAAC,EAAE,GAAG,CAAC;CACd,CAAA;AAED,oBAAY,iBAAiB,GAC7B;IAEC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,sBAAsB,EAAE,MAAM,CAAC;IAC/B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC5B,CAAA;AAID,qBAAa,aAAc,SAAQ,SAAS;IAG3C,SAAS,CAAC,QAAQ,CAAC,KAAK,EACxB;QACC,cAAc,CAAC,EAAE,cAAc,CAAC;QAChC,SAAS,CAAC,EAAE,SAAS,CAAC;KACtB,CAAC;IAEF;;;;OAIG;gBACS,MAAM,EAAE,GAAG;IAiBvB;;OAEG;IACH,IAAI,cAAc,IAAI,cAAc,GAAG,SAAS,CAG/C;IAED;;OAEG;IACH,IAAI,SAAS,IAAI,SAAS,GAAG,SAAS,CAGrC;IAED;;;;;;;;;OASG;IACH,IAAI,QAAQ,IAAI,oBAAoB,CAGnC;IAED;;;;OAIG;IACH,KAAK,IAAI,IAAI;IAWb;;;;;OAKG;IACH,YAAY,IAAI,IAAI;IAWpB;;;;OAIG;IACG,QAAQ,IAAI,OAAO,CAAC,iBAAiB,EAAE,CAAC;IAO9C;;;;OAIG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAK9B;;OAEG;IAEG,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAM3D;;OAEG;IAEG,OAAO,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,QAAQ,CAAC;IAK1D;;OAEG;IAEG,QAAQ,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,QAAQ,CAAC;IAK3D,OAAO,CAAC,0BAA0B;CAuClC"} \ No newline at end of file diff --git a/lib/DataTransport.js b/lib/DataTransport.js index f007d6b779..1962f00e75 100644 --- a/lib/DataTransport.js +++ b/lib/DataTransport.js @@ -93,21 +93,21 @@ class DataTransport extends Transport_1.Transport { */ // eslint-disable-next-line @typescript-eslint/no-unused-vars async setMaxIncomingBitrate(bitrate) { - throw new errors_1.NotImplementedError('setMaxIncomingBitrate() not implemented in DataTransport'); + throw new errors_1.UnsupportedError('setMaxIncomingBitrate() not implemented in DataTransport'); } /** * @override */ // eslint-disable-next-line @typescript-eslint/no-unused-vars async produce(options) { - throw new errors_1.NotImplementedError('produce() not implemented in DataTransport'); + throw new errors_1.UnsupportedError('produce() not implemented in DataTransport'); } /** * @override */ // eslint-disable-next-line @typescript-eslint/no-unused-vars async consumer(options) { - throw new errors_1.NotImplementedError('consumer() not implemented in DataTransport'); + throw new errors_1.UnsupportedError('consumer() not implemented in DataTransport'); } _handleWorkerNotifications() { this._channel.on(this._internal.transportId, (event, data) => { diff --git a/lib/errors.d.ts b/lib/errors.d.ts index 2abd563895..57b24c5380 100644 --- a/lib/errors.d.ts +++ b/lib/errors.d.ts @@ -10,11 +10,4 @@ export declare class UnsupportedError extends Error { export declare class InvalidStateError extends Error { constructor(message: string); } -/** - * Error produced when calling a method that is not implemented for a certain - * subclass. - */ -export declare class NotImplementedError extends Error { - constructor(message: string); -} //# sourceMappingURL=errors.d.ts.map \ No newline at end of file diff --git a/lib/errors.d.ts.map b/lib/errors.d.ts.map index 86b9f686e7..a622738928 100644 --- a/lib/errors.d.ts.map +++ b/lib/errors.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,qBAAa,gBAAiB,SAAQ,KAAK;gBAE9B,OAAO,EAAE,MAAM;CAW3B;AAED;;GAEG;AACH,qBAAa,iBAAkB,SAAQ,KAAK;gBAE/B,OAAO,EAAE,MAAM;CAW3B;AAED;;;GAGG;AACH,qBAAa,mBAAoB,SAAQ,KAAK;gBAEjC,OAAO,EAAE,MAAM;CAW3B"} \ No newline at end of file +{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,qBAAa,gBAAiB,SAAQ,KAAK;gBAE9B,OAAO,EAAE,MAAM;CAW3B;AAED;;GAEG;AACH,qBAAa,iBAAkB,SAAQ,KAAK;gBAE/B,OAAO,EAAE,MAAM;CAW3B"} \ No newline at end of file diff --git a/lib/errors.js b/lib/errors.js index 880475f60f..0eaf287ff5 100644 --- a/lib/errors.js +++ b/lib/errors.js @@ -28,18 +28,3 @@ class InvalidStateError extends Error { } } exports.InvalidStateError = InvalidStateError; -/** - * Error produced when calling a method that is not implemented for a certain - * subclass. - */ -class NotImplementedError extends Error { - constructor(message) { - super(message); - this.name = 'NotImplementedError'; - if (Error.hasOwnProperty('captureStackTrace')) // Just in V8. - Error.captureStackTrace(this, NotImplementedError); - else - this.stack = (new Error(message)).stack; - } -} -exports.NotImplementedError = NotImplementedError; diff --git a/src/DataTransport.ts b/src/DataTransport.ts index 6014a5d0df..dae5316326 100644 --- a/src/DataTransport.ts +++ b/src/DataTransport.ts @@ -1,6 +1,6 @@ import { Logger } from './Logger'; import { EnhancedEventEmitter } from './EnhancedEventEmitter'; -import { NotImplementedError } from './errors'; +import { UnsupportedError } from './errors'; import { Transport, TransportTraceEventData, SctpState } from './Transport'; import { Producer, ProducerOptions } from './Producer'; import { Consumer, ConsumerOptions } from './Consumer'; @@ -178,7 +178,7 @@ export class DataTransport extends Transport // eslint-disable-next-line @typescript-eslint/no-unused-vars async setMaxIncomingBitrate(bitrate: number): Promise { - throw new NotImplementedError( + throw new UnsupportedError( 'setMaxIncomingBitrate() not implemented in DataTransport'); } @@ -188,8 +188,7 @@ export class DataTransport extends Transport // eslint-disable-next-line @typescript-eslint/no-unused-vars async produce(options: ProducerOptions): Promise { - throw new NotImplementedError( - 'produce() not implemented in DataTransport'); + throw new UnsupportedError('produce() not implemented in DataTransport'); } /** @@ -198,8 +197,7 @@ export class DataTransport extends Transport // eslint-disable-next-line @typescript-eslint/no-unused-vars async consumer(options: ConsumerOptions): Promise { - throw new NotImplementedError( - 'consumer() not implemented in DataTransport'); + throw new UnsupportedError('consumer() not implemented in DataTransport'); } private _handleWorkerNotifications(): void diff --git a/src/errors.ts b/src/errors.ts index 7341cb8325..0dff994d6e 100644 --- a/src/errors.ts +++ b/src/errors.ts @@ -33,22 +33,3 @@ export class InvalidStateError extends Error this.stack = (new Error(message)).stack; } } - -/** - * Error produced when calling a method that is not implemented for a certain - * subclass. - */ -export class NotImplementedError extends Error -{ - constructor(message: string) - { - super(message); - - this.name = 'NotImplementedError'; - - if (Error.hasOwnProperty('captureStackTrace')) // Just in V8. - Error.captureStackTrace(this, NotImplementedError); - else - this.stack = (new Error(message)).stack; - } -} From 654f99d0d4043678e1eba6ce073fb305e021424b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?I=C3=B1aki=20Baz=20Castillo?= Date: Thu, 28 May 2020 12:25:43 +0200 Subject: [PATCH 07/23] WIP --- TODO_DATACHANNEL_TERMINATION.md | 2 ++ lib/DataTransport.d.ts | 6 +++++- lib/DataTransport.d.ts.map | 2 +- lib/Router.d.ts | 2 +- lib/Router.d.ts.map | 2 +- lib/Router.js | 15 ++++++++++++--- src/DataTransport.ts | 7 ++++++- src/Router.ts | 14 ++++++++++++-- worker/include/RTC/Transport.hpp | 1 + worker/src/RTC/Transport.cpp | 23 ++++++++++++++++------- 10 files changed, 57 insertions(+), 17 deletions(-) diff --git a/TODO_DATACHANNEL_TERMINATION.md b/TODO_DATACHANNEL_TERMINATION.md index a4e908e10f..051d7ac619 100644 --- a/TODO_DATACHANNEL_TERMINATION.md +++ b/TODO_DATACHANNEL_TERMINATION.md @@ -2,3 +2,5 @@ - Set proper max size for `netstring` messages in `PayloadChannel` (in JS and C++). It must match `maxSctpMessageSize` in `DataTransport.ts`. +- In `Transport.cpp` how to deal with `this->useRealSctp` and `this->sctpAssociation` for stats/dump and so on? + diff --git a/lib/DataTransport.d.ts b/lib/DataTransport.d.ts index 50a2ebd542..56a7f6c1a2 100644 --- a/lib/DataTransport.d.ts +++ b/lib/DataTransport.d.ts @@ -2,12 +2,16 @@ import { EnhancedEventEmitter } from './EnhancedEventEmitter'; import { Transport, SctpState } from './Transport'; import { Producer, ProducerOptions } from './Producer'; import { Consumer, ConsumerOptions } from './Consumer'; -import { SctpParameters } from './SctpParameters'; +import { SctpParameters, NumSctpStreams } from './SctpParameters'; export declare type DataTransportOptions = { /** * Create a SCTP association. Default true. */ enableSctp?: boolean; + /** + * SCTP streams number. + */ + numSctpStreams?: NumSctpStreams; /** * Maximum size of data that can be passed to DataProducer's send() method. * Default 262144. diff --git a/lib/DataTransport.d.ts.map b/lib/DataTransport.d.ts.map index 443253fc15..9447aab7d3 100644 --- a/lib/DataTransport.d.ts.map +++ b/lib/DataTransport.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"DataTransport.d.ts","sourceRoot":"","sources":["../src/DataTransport.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAE9D,OAAO,EAAE,SAAS,EAA2B,SAAS,EAAE,MAAM,aAAa,CAAC;AAC5E,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AACvD,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElD,oBAAY,oBAAoB,GAChC;IACC;;OAEG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IAErB;;;OAGG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAE5B;;OAEG;IACH,OAAO,CAAC,EAAE,GAAG,CAAC;CACd,CAAA;AAED,oBAAY,iBAAiB,GAC7B;IAEC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,sBAAsB,EAAE,MAAM,CAAC;IAC/B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC5B,CAAA;AAID,qBAAa,aAAc,SAAQ,SAAS;IAG3C,SAAS,CAAC,QAAQ,CAAC,KAAK,EACxB;QACC,cAAc,CAAC,EAAE,cAAc,CAAC;QAChC,SAAS,CAAC,EAAE,SAAS,CAAC;KACtB,CAAC;IAEF;;;;OAIG;gBACS,MAAM,EAAE,GAAG;IAiBvB;;OAEG;IACH,IAAI,cAAc,IAAI,cAAc,GAAG,SAAS,CAG/C;IAED;;OAEG;IACH,IAAI,SAAS,IAAI,SAAS,GAAG,SAAS,CAGrC;IAED;;;;;;;;;OASG;IACH,IAAI,QAAQ,IAAI,oBAAoB,CAGnC;IAED;;;;OAIG;IACH,KAAK,IAAI,IAAI;IAWb;;;;;OAKG;IACH,YAAY,IAAI,IAAI;IAWpB;;;;OAIG;IACG,QAAQ,IAAI,OAAO,CAAC,iBAAiB,EAAE,CAAC;IAO9C;;;;OAIG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAK9B;;OAEG;IAEG,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAM3D;;OAEG;IAEG,OAAO,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,QAAQ,CAAC;IAK1D;;OAEG;IAEG,QAAQ,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,QAAQ,CAAC;IAK3D,OAAO,CAAC,0BAA0B;CAuClC"} \ No newline at end of file +{"version":3,"file":"DataTransport.d.ts","sourceRoot":"","sources":["../src/DataTransport.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAE9D,OAAO,EAAE,SAAS,EAA2B,SAAS,EAAE,MAAM,aAAa,CAAC;AAC5E,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AACvD,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElE,oBAAY,oBAAoB,GAChC;IACC;;OAEG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IAErB;;OAEG;IACH,cAAc,CAAC,EAAE,cAAc,CAAC;IAEhC;;;OAGG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAE5B;;OAEG;IACH,OAAO,CAAC,EAAE,GAAG,CAAC;CACd,CAAA;AAED,oBAAY,iBAAiB,GAC7B;IAEC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,sBAAsB,EAAE,MAAM,CAAC;IAC/B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC5B,CAAA;AAID,qBAAa,aAAc,SAAQ,SAAS;IAG3C,SAAS,CAAC,QAAQ,CAAC,KAAK,EACxB;QACC,cAAc,CAAC,EAAE,cAAc,CAAC;QAChC,SAAS,CAAC,EAAE,SAAS,CAAC;KACtB,CAAC;IAEF;;;;OAIG;gBACS,MAAM,EAAE,GAAG;IAiBvB;;OAEG;IACH,IAAI,cAAc,IAAI,cAAc,GAAG,SAAS,CAG/C;IAED;;OAEG;IACH,IAAI,SAAS,IAAI,SAAS,GAAG,SAAS,CAGrC;IAED;;;;;;;;;OASG;IACH,IAAI,QAAQ,IAAI,oBAAoB,CAGnC;IAED;;;;OAIG;IACH,KAAK,IAAI,IAAI;IAWb;;;;;OAKG;IACH,YAAY,IAAI,IAAI;IAWpB;;;;OAIG;IACG,QAAQ,IAAI,OAAO,CAAC,iBAAiB,EAAE,CAAC;IAO9C;;;;OAIG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAK9B;;OAEG;IAEG,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAM3D;;OAEG;IAEG,OAAO,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,QAAQ,CAAC;IAK1D;;OAEG;IAEG,QAAQ,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,QAAQ,CAAC;IAK3D,OAAO,CAAC,0BAA0B;CAuClC"} \ No newline at end of file diff --git a/lib/Router.d.ts b/lib/Router.d.ts index a794523f0e..d3943de25d 100644 --- a/lib/Router.d.ts +++ b/lib/Router.d.ts @@ -162,7 +162,7 @@ export declare class Router extends EnhancedEventEmitter { /** * Create a DataTransport. */ - createDataTransport({ enableSctp, maxSctpMessageSize, appData }: DataTransportOptions): Promise; + createDataTransport({ enableSctp, numSctpStreams, maxSctpMessageSize, appData }: DataTransportOptions): Promise; /** * Pipes the given Producer or DataProducer into another Router in same host. */ diff --git a/lib/Router.d.ts.map b/lib/Router.d.ts.map index c0e656e6a3..24f48ddeeb 100644 --- a/lib/Router.d.ts.map +++ b/lib/Router.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"Router.d.ts","sourceRoot":"","sources":["../src/Router.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"Router.d.ts","sourceRoot":"","sources":["../src/Router.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/lib/Router.js b/lib/Router.js index 5be7a5a99f..0d3cd0db3c 100644 --- a/lib/Router.js +++ b/lib/Router.js @@ -193,7 +193,8 @@ class Router extends EnhancedEventEmitter_1.EnhancedEventEmitter { enableSctp, numSctpStreams, maxSctpMessageSize, - isDataChannel: true + isDataChannel: true, + useRealSctp: true }; const data = await this._channel.request('router.createWebRtcTransport', internal, reqData); const transport = new WebRtcTransport_1.WebRtcTransport({ @@ -247,6 +248,7 @@ class Router extends EnhancedEventEmitter_1.EnhancedEventEmitter { numSctpStreams, maxSctpMessageSize, isDataChannel: false, + useRealSctp: true, enableSrtp, srtpCryptoSuite }; @@ -307,6 +309,7 @@ class Router extends EnhancedEventEmitter_1.EnhancedEventEmitter { numSctpStreams, maxSctpMessageSize, isDataChannel: false, + useRealSctp: true, enableRtx, enableSrtp }; @@ -334,10 +337,16 @@ class Router extends EnhancedEventEmitter_1.EnhancedEventEmitter { /** * Create a DataTransport. */ - async createDataTransport({ enableSctp = true, maxSctpMessageSize = 262144, appData = {} }) { + async createDataTransport({ enableSctp = true, numSctpStreams = { OS: 65535, MIS: 65535 }, maxSctpMessageSize = 262144, appData = {} }) { logger.debug('createDataTransport()'); const internal = { ...this._internal, transportId: uuid_1.v4() }; - const reqData = { enableSctp, maxSctpMessageSize }; + const reqData = { + enableSctp, + numSctpStreams, + maxSctpMessageSize, + isDataChannel: false, + useRealSctp: false + }; const data = await this._channel.request('router.createDataTransport', internal, reqData); const transport = new DataTransport_1.DataTransport({ internal, diff --git a/src/DataTransport.ts b/src/DataTransport.ts index dae5316326..41a6bb819a 100644 --- a/src/DataTransport.ts +++ b/src/DataTransport.ts @@ -4,7 +4,7 @@ import { UnsupportedError } from './errors'; import { Transport, TransportTraceEventData, SctpState } from './Transport'; import { Producer, ProducerOptions } from './Producer'; import { Consumer, ConsumerOptions } from './Consumer'; -import { SctpParameters } from './SctpParameters'; +import { SctpParameters, NumSctpStreams } from './SctpParameters'; export type DataTransportOptions = { @@ -13,6 +13,11 @@ export type DataTransportOptions = */ enableSctp?: boolean; + /** + * SCTP streams number. + */ + numSctpStreams?: NumSctpStreams; + /** * Maximum size of data that can be passed to DataProducer's send() method. * Default 262144. diff --git a/src/Router.ts b/src/Router.ts index e7b9de072f..b78191f5c1 100644 --- a/src/Router.ts +++ b/src/Router.ts @@ -389,7 +389,8 @@ export class Router extends EnhancedEventEmitter enableSctp, numSctpStreams, maxSctpMessageSize, - isDataChannel : true + isDataChannel : true, + useRealSctp : true }; const data = @@ -478,6 +479,7 @@ export class Router extends EnhancedEventEmitter numSctpStreams, maxSctpMessageSize, isDataChannel : false, + useRealSctp : true, enableSrtp, srtpCryptoSuite }; @@ -577,6 +579,7 @@ export class Router extends EnhancedEventEmitter numSctpStreams, maxSctpMessageSize, isDataChannel : false, + useRealSctp : true, enableRtx, enableSrtp }; @@ -623,6 +626,7 @@ export class Router extends EnhancedEventEmitter async createDataTransport( { enableSctp = true, + numSctpStreams = { OS: 65535, MIS: 65535 }, maxSctpMessageSize = 262144, appData = {} }: DataTransportOptions @@ -631,7 +635,13 @@ export class Router extends EnhancedEventEmitter logger.debug('createDataTransport()'); const internal = { ...this._internal, transportId: uuidv4() }; - const reqData = { enableSctp, maxSctpMessageSize }; + const reqData = { + enableSctp, + numSctpStreams, + maxSctpMessageSize, + isDataChannel : false, + useRealSctp : false + }; const data = await this._channel.request('router.createDataTransport', internal, reqData); diff --git a/worker/include/RTC/Transport.hpp b/worker/include/RTC/Transport.hpp index 6044b16ba4..61fa170a8c 100644 --- a/worker/include/RTC/Transport.hpp +++ b/worker/include/RTC/Transport.hpp @@ -252,6 +252,7 @@ namespace RTC std::unordered_map mapSsrcConsumer; std::unordered_map mapRtxSsrcConsumer; RTC::SctpAssociation* sctpAssociation{ nullptr }; + bool useRealSctp{ true }; Timer* rtcpTimer{ nullptr }; RTC::TransportCongestionControlClient* tccClient{ nullptr }; RTC::TransportCongestionControlServer* tccServer{ nullptr }; diff --git a/worker/src/RTC/Transport.cpp b/worker/src/RTC/Transport.cpp index 1d28f75fc5..c01a735437 100644 --- a/worker/src/RTC/Transport.cpp +++ b/worker/src/RTC/Transport.cpp @@ -57,6 +57,7 @@ namespace RTC auto jsonNumSctpStreamsIt = data.find("numSctpStreams"); auto jsonMaxSctpMessageSizeIt = data.find("maxSctpMessageSize"); auto jsonIsDataChannelIt = data.find("isDataChannel"); + auto jsonUseRealSctpIt = data.find("useRealSctp"); // numSctpStreams is mandatory. // clang-format off @@ -107,9 +108,15 @@ namespace RTC if (jsonIsDataChannelIt != data.end() && jsonIsDataChannelIt->is_boolean()) isDataChannel = jsonIsDataChannelIt->get(); - // This may throw. - this->sctpAssociation = - new RTC::SctpAssociation(this, os, mis, maxSctpMessageSize, isDataChannel); + if (jsonUseRealSctpIt != data.end() && jsonUseRealSctpIt->is_boolean()) + this->useRealSctp = jsonUseRealSctpIt->get(); + + if (this->useRealSctp) + { + // This may throw. + this->sctpAssociation = + new RTC::SctpAssociation(this, os, mis, maxSctpMessageSize, isDataChannel); + } } // Create the RTCP timer. @@ -345,7 +352,7 @@ namespace RTC // Add rtpListener. this->rtpListener.FillJson(jsonObject["rtpListener"]); - if (this->sctpAssociation) + if (this->useRealSctp && this->sctpAssociation) { // Add sctpParameters. this->sctpAssociation->FillJson(jsonObject["sctpParameters"]); @@ -410,7 +417,7 @@ namespace RTC // Add timestamp. jsonObject["timestamp"] = nowMs; - if (this->sctpAssociation) + if (this->useRealSctp && this->sctpAssociation) { // Add sctpState. switch (this->sctpAssociation->GetState()) @@ -947,7 +954,7 @@ namespace RTC case Channel::Request::MethodId::TRANSPORT_PRODUCE_DATA: { - if (!this->sctpAssociation) + if (this->useRealSctp && !this->sctpAssociation) MS_THROW_ERROR("SCTP not enabled"); std::string dataProducerId; @@ -1002,7 +1009,7 @@ namespace RTC case Channel::Request::MethodId::TRANSPORT_CONSUME_DATA: { - if (!this->sctpAssociation) + if (this->useRealSctp && !this->sctpAssociation) MS_THROW_ERROR("SCTP not enabled"); auto jsonDataProducerIdIt = request->internal.find("dataProducerId"); @@ -1024,6 +1031,8 @@ namespace RTC request->data, this->sctpAssociation->GetMaxSctpMessageSize()); + // TODO: Above line will throw because this->sctpAssocition does not exist. + // Notify the listener. // This may throw if no DataProducer is found. try From f8f1e61f879aa02119201fa7d9fe5a3a6f7f02bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?I=C3=B1aki=20Baz=20Castillo?= Date: Thu, 28 May 2020 15:55:13 +0200 Subject: [PATCH 08/23] WIP --- lib/DataTransport.d.ts.map | 1 - lib/DeviceChannel.d.ts | 28 --- lib/DeviceChannel.d.ts.map | 1 - lib/DeviceChannel.js | 180 ------------------ ...ataTransport.d.ts => DirectTransport.d.ts} | 16 +- lib/DirectTransport.d.ts.map | 1 + lib/{DataTransport.js => DirectTransport.js} | 18 +- lib/PlainTransport.d.ts | 2 +- lib/Router.d.ts | 6 +- lib/Router.d.ts.map | 2 +- lib/Router.js | 12 +- lib/Transport.d.ts | 16 +- lib/Transport.d.ts.map | 2 +- lib/Transport.js | 26 ++- src/{DataTransport.ts => DirectTransport.ts} | 24 +-- src/PlainTransport.ts | 2 +- src/Router.ts | 16 +- src/Transport.ts | 34 +++- worker/include/RTC/Transport.hpp | 1 - worker/src/RTC/Transport.cpp | 21 +- 20 files changed, 118 insertions(+), 291 deletions(-) delete mode 100644 lib/DataTransport.d.ts.map delete mode 100644 lib/DeviceChannel.d.ts delete mode 100644 lib/DeviceChannel.d.ts.map delete mode 100644 lib/DeviceChannel.js rename lib/{DataTransport.d.ts => DirectTransport.d.ts} (88%) create mode 100644 lib/DirectTransport.d.ts.map rename lib/{DataTransport.js => DirectTransport.js} (90%) rename src/{DataTransport.ts => DirectTransport.ts} (88%) diff --git a/lib/DataTransport.d.ts.map b/lib/DataTransport.d.ts.map deleted file mode 100644 index 9447aab7d3..0000000000 --- a/lib/DataTransport.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"DataTransport.d.ts","sourceRoot":"","sources":["../src/DataTransport.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAE9D,OAAO,EAAE,SAAS,EAA2B,SAAS,EAAE,MAAM,aAAa,CAAC;AAC5E,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AACvD,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElE,oBAAY,oBAAoB,GAChC;IACC;;OAEG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IAErB;;OAEG;IACH,cAAc,CAAC,EAAE,cAAc,CAAC;IAEhC;;;OAGG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAE5B;;OAEG;IACH,OAAO,CAAC,EAAE,GAAG,CAAC;CACd,CAAA;AAED,oBAAY,iBAAiB,GAC7B;IAEC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,sBAAsB,EAAE,MAAM,CAAC;IAC/B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC5B,CAAA;AAID,qBAAa,aAAc,SAAQ,SAAS;IAG3C,SAAS,CAAC,QAAQ,CAAC,KAAK,EACxB;QACC,cAAc,CAAC,EAAE,cAAc,CAAC;QAChC,SAAS,CAAC,EAAE,SAAS,CAAC;KACtB,CAAC;IAEF;;;;OAIG;gBACS,MAAM,EAAE,GAAG;IAiBvB;;OAEG;IACH,IAAI,cAAc,IAAI,cAAc,GAAG,SAAS,CAG/C;IAED;;OAEG;IACH,IAAI,SAAS,IAAI,SAAS,GAAG,SAAS,CAGrC;IAED;;;;;;;;;OASG;IACH,IAAI,QAAQ,IAAI,oBAAoB,CAGnC;IAED;;;;OAIG;IACH,KAAK,IAAI,IAAI;IAWb;;;;;OAKG;IACH,YAAY,IAAI,IAAI;IAWpB;;;;OAIG;IACG,QAAQ,IAAI,OAAO,CAAC,iBAAiB,EAAE,CAAC;IAO9C;;;;OAIG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAK9B;;OAEG;IAEG,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAM3D;;OAEG;IAEG,OAAO,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,QAAQ,CAAC;IAK1D;;OAEG;IAEG,QAAQ,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,QAAQ,CAAC;IAK3D,OAAO,CAAC,0BAA0B;CAuClC"} \ No newline at end of file diff --git a/lib/DeviceChannel.d.ts b/lib/DeviceChannel.d.ts deleted file mode 100644 index f121395f39..0000000000 --- a/lib/DeviceChannel.d.ts +++ /dev/null @@ -1,28 +0,0 @@ -/// -import { EnhancedEventEmitter } from './EnhancedEventEmitter'; -export declare class PayloadChannel extends EnhancedEventEmitter { - private _closed; - private readonly _producerSocket; - private readonly _consumerSocket; - private _recvBuffer?; - private _ongoingNotification?; - /** - * @private - */ - constructor({ producerSocket, consumerSocket, pid }: { - producerSocket: any; - consumerSocket: any; - pid: number; - }); - /** - * @private - */ - close(): void; - /** - * @private - */ - send(event: string, internal: object, data: any | undefined, payload: string | Buffer): void; - private _processMessage; - private _processPayload; -} -//# sourceMappingURL=DeviceChannel.d.ts.map \ No newline at end of file diff --git a/lib/DeviceChannel.d.ts.map b/lib/DeviceChannel.d.ts.map deleted file mode 100644 index 04968c6edf..0000000000 --- a/lib/DeviceChannel.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"DeviceChannel.d.ts","sourceRoot":"","sources":["../src/DeviceChannel.ts"],"names":[],"mappings":";AAIA,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAS9D,qBAAa,cAAe,SAAQ,oBAAoB;IAGvD,OAAO,CAAC,OAAO,CAAS;IAGxB,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAS;IAGzC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAS;IAGzC,OAAO,CAAC,WAAW,CAAC,CAAS;IAG7B,OAAO,CAAC,oBAAoB,CAAC,CAAkD;IAE/E;;OAEG;gBAEF,EACC,cAAc,EACd,cAAc,EACd,GAAG,EACH,EACD;QACC,cAAc,EAAE,GAAG,CAAC;QACpB,cAAc,EAAE,GAAG,CAAC;QACpB,GAAG,EAAE,MAAM,CAAC;KACZ;IAqHF;;OAEG;IACH,KAAK,IAAI,IAAI;IA6Bb;;OAEG;IACH,IAAI,CACH,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,GAAG,GAAG,SAAS,EACrB,OAAO,EAAE,MAAM,GAAG,MAAM,GACtB,IAAI;IAwCP,OAAO,CAAC,eAAe;IAyBvB,OAAO,CAAC,eAAe;CAoBvB"} \ No newline at end of file diff --git a/lib/DeviceChannel.js b/lib/DeviceChannel.js deleted file mode 100644 index 13404b1c9d..0000000000 --- a/lib/DeviceChannel.js +++ /dev/null @@ -1,180 +0,0 @@ -"use strict"; -var __importStar = (this && this.__importStar) || function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k]; - result["default"] = mod; - return result; -}; -Object.defineProperty(exports, "__esModule", { value: true }); -// @ts-ignore -const netstring = __importStar(require("netstring")); -const Logger_1 = require("./Logger"); -const EnhancedEventEmitter_1 = require("./EnhancedEventEmitter"); -const errors_1 = require("./errors"); -const logger = new Logger_1.Logger('PayloadChannel'); -// netstring length for a 4194304 bytes payload. -const NS_MESSAGE_MAX_LEN = 4194313; -const NS_PAYLOAD_MAX_LEN = 4194304; -class PayloadChannel extends EnhancedEventEmitter_1.EnhancedEventEmitter { - /** - * @private - */ - constructor({ producerSocket, consumerSocket, pid }) { - super(); - // Closed flag. - this._closed = false; - logger.debug('constructor()'); - this._producerSocket = producerSocket; - this._consumerSocket = consumerSocket; - // Read PayloadChannel notifications from the worker. - this._consumerSocket.on('data', (buffer) => { - if (!this._recvBuffer) { - this._recvBuffer = buffer; - } - else { - this._recvBuffer = Buffer.concat([this._recvBuffer, buffer], this._recvBuffer.length + buffer.length); - } - if (this._recvBuffer.length > NS_PAYLOAD_MAX_LEN) { - logger.error('receiving buffer is full, discarding all data into it'); - // Reset the buffer and exit. - this._recvBuffer = null; - return; - } - while (true) // eslint-disable-line no-constant-condition - { - let nsPayload; - try { - nsPayload = netstring.nsPayload(this._recvBuffer); - } - catch (error) { - logger.error('invalid netstring data received from the worker process: %s', String(error)); - // Reset the buffer and exit. - this._recvBuffer = undefined; - return; - } - // Incomplete netstring message. - if (nsPayload === -1) - return; - try { - // We can receive JSON messages (PayloadChannel messages) or - // text/binary payloads. - switch (nsPayload[0]) { - // 123 = '{' (a PayloadChannel JSON messsage). - case 123: - this._processMessage(JSON.parse(nsPayload)); - break; - // 80 = 'P' (a text/binary payload). - case 80: - this._processPayload(nsPayload.slice(1)); - break; - default: - // eslint-disable-next-line no-console - console.warn(`worker[pid:${pid}] unexpected data: %s`, nsPayload.toString('utf8', 1)); - } - } - catch (error) { - logger.error('received invalid message from the worker process: %s', String(error)); - } - // Remove the read payload from the buffer. - this._recvBuffer = - this._recvBuffer.slice(netstring.nsLength(this._recvBuffer)); - if (!this._recvBuffer.length) { - this._recvBuffer = undefined; - return; - } - } - }); - this._consumerSocket.on('end', () => (logger.debug('Consumer PayloadChannel ended by the worker process'))); - this._consumerSocket.on('error', (error) => (logger.error('Consumer PayloadChannel error: %s', String(error)))); - this._producerSocket.on('end', () => (logger.debug('Producer PayloadChannel ended by the worker process'))); - this._producerSocket.on('error', (error) => (logger.error('Producer PayloadChannel error: %s', String(error)))); - } - /** - * @private - */ - close() { - if (this._closed) - return; - logger.debug('close()'); - this._closed = true; - // Remove event listeners but leave a fake 'error' hander to avoid - // propagation. - this._consumerSocket.removeAllListeners('end'); - this._consumerSocket.removeAllListeners('error'); - this._consumerSocket.on('error', () => { }); - this._producerSocket.removeAllListeners('end'); - this._producerSocket.removeAllListeners('error'); - this._producerSocket.on('error', () => { }); - // Destroy the socket after a while to allow pending incoming messages. - setTimeout(() => { - try { - this._producerSocket.destroy(); - } - catch (error) { } - try { - this._consumerSocket.destroy(); - } - catch (error) { } - }, 200); - } - /** - * @private - */ - send(event, internal, data, payload) { - logger.debug('send() [event:%s]', event); - if (this._closed) - throw new errors_1.InvalidStateError('PayloadChannel closed'); - const notification = { event, internal, data }; - const ns = netstring.nsWrite(JSON.stringify(notification)); - if (Buffer.byteLength(ns) > NS_MESSAGE_MAX_LEN) - throw new Error('PayloadChannel notification too big'); - else if (Buffer.byteLength(payload) > NS_MESSAGE_MAX_LEN) - throw new Error('PayloadChannel payload too big'); - try { - // This may throw if closed or remote side ended. - this._producerSocket.write(ns); - } - catch (error) { - logger.warn('send() | sending notification failed: %s', String(error)); - return; - } - try { - // This may throw if closed or remote side ended. - this._producerSocket.write(payload); - } - catch (error) { - logger.warn('send() | sending payload failed: %s', String(error)); - return; - } - } - _processMessage(msg) { - if (!msg.targetId || !msg.event) { - logger.error('received message is not a notification'); - return; - } - // If we are not expecting a notification, warn and override ongoing - // notification. - if (this._ongoingNotification) { - logger.error('received a notification while expecting a payload, overriding ongoing notification'); - } - this._ongoingNotification = - { - targetId: msg.targetId, - event: msg.event, - data: msg.data - }; - } - _processPayload(payload) { - // If we are not expecting a payload, abort. - if (!this._ongoingNotification) { - logger.error('received a payload without previous notification'); - return; - } - // Emit the corresponding event. - this.emit(this._ongoingNotification.targetId, this._ongoingNotification.event, this._ongoingNotification.data, payload); - // Unset ongoing notification. - this._ongoingNotification = undefined; - } -} -exports.PayloadChannel = PayloadChannel; diff --git a/lib/DataTransport.d.ts b/lib/DirectTransport.d.ts similarity index 88% rename from lib/DataTransport.d.ts rename to lib/DirectTransport.d.ts index 56a7f6c1a2..df565e48ce 100644 --- a/lib/DataTransport.d.ts +++ b/lib/DirectTransport.d.ts @@ -3,7 +3,7 @@ import { Transport, SctpState } from './Transport'; import { Producer, ProducerOptions } from './Producer'; import { Consumer, ConsumerOptions } from './Consumer'; import { SctpParameters, NumSctpStreams } from './SctpParameters'; -export declare type DataTransportOptions = { +export declare type DirectTransportOptions = { /** * Create a SCTP association. Default true. */ @@ -22,7 +22,7 @@ export declare type DataTransportOptions = { */ appData?: any; }; -export declare type DataTransportStat = { +export declare type DirectTransportStat = { type: string; transportId: string; timestamp: number; @@ -47,7 +47,7 @@ export declare type DataTransportStat = { availableIncomingBitrate?: number; maxIncomingBitrate?: number; }; -export declare class DataTransport extends Transport { +export declare class DirectTransport extends Transport { protected readonly _data: { sctpParameters?: SctpParameters; sctpState?: SctpState; @@ -78,7 +78,7 @@ export declare class DataTransport extends Transport { */ get observer(): EnhancedEventEmitter; /** - * Close the DataTransport. + * Close the DirectTransport. * * @override */ @@ -91,13 +91,13 @@ export declare class DataTransport extends Transport { */ routerClosed(): void; /** - * Get DataTransport stats. + * Get DirectTransport stats. * * @override */ - getStats(): Promise; + getStats(): Promise; /** - * NO-OP method in DataTransport. + * NO-OP method in DirectTransport. * * @override */ @@ -116,4 +116,4 @@ export declare class DataTransport extends Transport { consumer(options: ConsumerOptions): Promise; private _handleWorkerNotifications; } -//# sourceMappingURL=DataTransport.d.ts.map \ No newline at end of file +//# sourceMappingURL=DirectTransport.d.ts.map \ No newline at end of file diff --git a/lib/DirectTransport.d.ts.map b/lib/DirectTransport.d.ts.map new file mode 100644 index 0000000000..7d8eb40370 --- /dev/null +++ b/lib/DirectTransport.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"DirectTransport.d.ts","sourceRoot":"","sources":["../src/DirectTransport.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAE9D,OAAO,EAAE,SAAS,EAA2B,SAAS,EAAE,MAAM,aAAa,CAAC;AAC5E,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AACvD,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElE,oBAAY,sBAAsB,GAClC;IACC;;OAEG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IAErB;;OAEG;IACH,cAAc,CAAC,EAAE,cAAc,CAAC;IAEhC;;;OAGG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAE5B;;OAEG;IACH,OAAO,CAAC,EAAE,GAAG,CAAC;CACd,CAAA;AAED,oBAAY,mBAAmB,GAC/B;IAEC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,sBAAsB,EAAE,MAAM,CAAC;IAC/B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC5B,CAAA;AAID,qBAAa,eAAgB,SAAQ,SAAS;IAG7C,SAAS,CAAC,QAAQ,CAAC,KAAK,EACxB;QACC,cAAc,CAAC,EAAE,cAAc,CAAC;QAChC,SAAS,CAAC,EAAE,SAAS,CAAC;KACtB,CAAC;IAEF;;;;OAIG;gBACS,MAAM,EAAE,GAAG;IAiBvB;;OAEG;IACH,IAAI,cAAc,IAAI,cAAc,GAAG,SAAS,CAG/C;IAED;;OAEG;IACH,IAAI,SAAS,IAAI,SAAS,GAAG,SAAS,CAGrC;IAED;;;;;;;;;OASG;IACH,IAAI,QAAQ,IAAI,oBAAoB,CAGnC;IAED;;;;OAIG;IACH,KAAK,IAAI,IAAI;IAWb;;;;;OAKG;IACH,YAAY,IAAI,IAAI;IAWpB;;;;OAIG;IACG,QAAQ,IAAI,OAAO,CAAC,mBAAmB,EAAE,CAAC;IAOhD;;;;OAIG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAK9B;;OAEG;IAEG,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAM3D;;OAEG;IAEG,OAAO,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,QAAQ,CAAC;IAK1D;;OAEG;IAEG,QAAQ,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,QAAQ,CAAC;IAK3D,OAAO,CAAC,0BAA0B;CAuClC"} \ No newline at end of file diff --git a/lib/DataTransport.js b/lib/DirectTransport.js similarity index 90% rename from lib/DataTransport.js rename to lib/DirectTransport.js index 1962f00e75..37a0e2c2e0 100644 --- a/lib/DataTransport.js +++ b/lib/DirectTransport.js @@ -3,8 +3,8 @@ Object.defineProperty(exports, "__esModule", { value: true }); const Logger_1 = require("./Logger"); const errors_1 = require("./errors"); const Transport_1 = require("./Transport"); -const logger = new Logger_1.Logger('DataTransport'); -class DataTransport extends Transport_1.Transport { +const logger = new Logger_1.Logger('DirectTransport'); +class DirectTransport extends Transport_1.Transport { /** * @private * @emits sctpstatechange - (sctpState: SctpState) @@ -47,7 +47,7 @@ class DataTransport extends Transport_1.Transport { return this._observer; } /** - * Close the DataTransport. + * Close the DirectTransport. * * @override */ @@ -72,7 +72,7 @@ class DataTransport extends Transport_1.Transport { super.routerClosed(); } /** - * Get DataTransport stats. + * Get DirectTransport stats. * * @override */ @@ -81,7 +81,7 @@ class DataTransport extends Transport_1.Transport { return this._channel.request('transport.getStats', this._internal); } /** - * NO-OP method in DataTransport. + * NO-OP method in DirectTransport. * * @override */ @@ -93,21 +93,21 @@ class DataTransport extends Transport_1.Transport { */ // eslint-disable-next-line @typescript-eslint/no-unused-vars async setMaxIncomingBitrate(bitrate) { - throw new errors_1.UnsupportedError('setMaxIncomingBitrate() not implemented in DataTransport'); + throw new errors_1.UnsupportedError('setMaxIncomingBitrate() not implemented in DirectTransport'); } /** * @override */ // eslint-disable-next-line @typescript-eslint/no-unused-vars async produce(options) { - throw new errors_1.UnsupportedError('produce() not implemented in DataTransport'); + throw new errors_1.UnsupportedError('produce() not implemented in DirectTransport'); } /** * @override */ // eslint-disable-next-line @typescript-eslint/no-unused-vars async consumer(options) { - throw new errors_1.UnsupportedError('consumer() not implemented in DataTransport'); + throw new errors_1.UnsupportedError('consumer() not implemented in DirectTransport'); } _handleWorkerNotifications() { this._channel.on(this._internal.transportId, (event, data) => { @@ -137,4 +137,4 @@ class DataTransport extends Transport_1.Transport { }); } } -exports.DataTransport = DataTransport; +exports.DirectTransport = DirectTransport; diff --git a/lib/PlainTransport.d.ts b/lib/PlainTransport.d.ts index 71c65efde7..e53324568f 100644 --- a/lib/PlainTransport.d.ts +++ b/lib/PlainTransport.d.ts @@ -79,7 +79,7 @@ export declare type PlainTransportStat = { rtcpTuple?: TransportTuple; }; /** - * DEPRECATED: Use PlainTransportOptions. + * DEPRECATED: Use PlainTransportStat. */ export declare type PlainRtpTransportStat = PlainTransportStat; export declare class PlainTransport extends Transport { diff --git a/lib/Router.d.ts b/lib/Router.d.ts index d3943de25d..2abc73518b 100644 --- a/lib/Router.d.ts +++ b/lib/Router.d.ts @@ -5,7 +5,7 @@ import { TransportListenIp } from './Transport'; import { WebRtcTransport, WebRtcTransportOptions } from './WebRtcTransport'; import { PlainTransport, PlainTransportOptions } from './PlainTransport'; import { PipeTransport, PipeTransportOptions } from './PipeTransport'; -import { DataTransport, DataTransportOptions } from './DataTransport'; +import { DirectTransport, DirectTransportOptions } from './DirectTransport'; import { Producer } from './Producer'; import { Consumer } from './Consumer'; import { DataProducer } from './DataProducer'; @@ -160,9 +160,9 @@ export declare class Router extends EnhancedEventEmitter { */ createPipeTransport({ listenIp, enableSctp, numSctpStreams, maxSctpMessageSize, enableRtx, enableSrtp, appData }: PipeTransportOptions): Promise; /** - * Create a DataTransport. + * Create a DirectTransport. */ - createDataTransport({ enableSctp, numSctpStreams, maxSctpMessageSize, appData }: DataTransportOptions): Promise; + createDirectTransport({ enableSctp, numSctpStreams, maxSctpMessageSize, appData }: DirectTransportOptions): Promise; /** * Pipes the given Producer or DataProducer into another Router in same host. */ diff --git a/lib/Router.d.ts.map b/lib/Router.d.ts.map index 24f48ddeeb..06c855f083 100644 --- a/lib/Router.d.ts.map +++ b/lib/Router.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"Router.d.ts","sourceRoot":"","sources":["../src/Router.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAG9D,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAa,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAC5E,OAAO,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AACzE,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AACtE,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AACtE,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,OAAO,EAAE,kBAAkB,EAAE,yBAAyB,EAAE,MAAM,sBAAsB,CAAC;AACrF,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACtE,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElD,oBAAY,aAAa,GACzB;IACC;;OAEG;IACH,WAAW,CAAC,EAAE,kBAAkB,EAAE,CAAC;IAEnC;;OAEG;IACH,OAAO,CAAC,EAAE,GAAG,CAAC;CACd,CAAA;AAED,oBAAY,mBAAmB,GAC/B;IACC;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB;;OAEG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB;;OAEG;IACH,MAAM,EAAE,MAAM,CAAC;IAEf;;OAEG;IACH,QAAQ,CAAC,EAAE,iBAAiB,GAAG,MAAM,CAAC;IAEtC;;OAEG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IAErB;;OAEG;IACH,cAAc,CAAC,EAAE,cAAc,CAAC;IAEhC;;OAEG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IAEpB;;OAEG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;CACrB,CAAA;AAED,oBAAY,kBAAkB,GAC9B;IACC;;OAEG;IACH,YAAY,CAAC,EAAE,QAAQ,CAAC;IAExB;;OAEG;IACH,YAAY,CAAC,EAAE,QAAQ,CAAC;IAExB;;OAEG;IACH,gBAAgB,CAAC,EAAE,YAAY,CAAC;IAEhC;;OAEG;IACH,gBAAgB,CAAC,EAAE,YAAY,CAAC;CAChC,CAAA;AAID,qBAAa,MAAO,SAAQ,oBAAoB;IAG/C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAGxB;IAGF,OAAO,CAAC,QAAQ,CAAC,KAAK,CAGrB;IAGD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAU;IAGnC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAiB;IAGjD,OAAO,CAAC,OAAO,CAAS;IAGxB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAM;IAGhC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAqC;IAGjE,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAoC;IAG/D,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAuC;IAGrE,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAwC;IAGvE,OAAO,CAAC,QAAQ,CAAC,wBAAwB,CAA2C;IAGpF,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CACsB;IAGzD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA8B;IAExD;;;;OAIG;gBAEF,EACC,QAAQ,EACR,IAAI,EACJ,OAAO,EACP,cAAc,EACd,OAAO,EACP,EACD;QACC,QAAQ,EAAE,GAAG,CAAC;QACd,IAAI,EAAE,GAAG,CAAC;QACV,OAAO,EAAE,OAAO,CAAC;QACjB,cAAc,EAAE,cAAc,CAAC;QAC/B,OAAO,CAAC,EAAE,GAAG,CAAC;KACd;IAcF;;OAEG;IACH,IAAI,EAAE,IAAI,MAAM,CAGf;IAED;;OAEG;IACH,IAAI,MAAM,IAAI,OAAO,CAGpB;IAED;;OAEG;IACH,IAAI,eAAe,IAAI,eAAe,CAGrC;IAED;;OAEG;IACH,IAAI,OAAO,IAAI,GAAG,CAGjB;IAED;;OAEG;IACH,IAAI,OAAO,CAAC,OAAO,EAAE,GAAG,EAGvB;IAED;;;;;;OAMG;IACH,IAAI,QAAQ,IAAI,oBAAoB,CAGnC;IAED;;OAEG;IACH,KAAK,IAAI,IAAI;IA4Cb;;;;OAIG;IACH,YAAY,IAAI,IAAI;IAsCpB;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC;IAO1B;;OAEG;IACG,qBAAqB,CAC1B,EACC,SAAS,EACT,SAAgB,EAChB,SAAiB,EACjB,SAAiB,EACjB,SAAiB,EACjB,+BAAwC,EACxC,UAAkB,EAClB,cAAwC,EACxC,kBAA2B,EAC3B,OAAY,EACZ,EAAE,sBAAsB,GACvB,OAAO,CAAC,eAAe,CAAC;IA+E3B;;OAEG;IACG,oBAAoB,CACzB,EACC,QAAQ,EACR,OAAc,EACd,OAAe,EACf,UAAkB,EAClB,cAAwC,EACxC,kBAA2B,EAC3B,UAAkB,EAClB,eAA2C,EAC3C,OAAY,EACZ,EAAE,qBAAqB,GACtB,OAAO,CAAC,cAAc,CAAC;IA4E1B;;OAEG;IACG,uBAAuB,CAC5B,OAAO,EAAE,qBAAqB,GAC5B,OAAO,CAAC,cAAc,CAAC;IAQ1B;;OAEG;IACG,mBAAmB,CACxB,EACC,QAAQ,EACR,UAAkB,EAClB,cAAwC,EACxC,kBAA+B,EAC/B,SAAiB,EACjB,UAAkB,EAClB,OAAY,EACZ,EAAE,oBAAoB,GACrB,OAAO,CAAC,aAAa,CAAC;IA0EzB;;OAEG;IACG,mBAAmB,CACxB,EACC,UAAiB,EACjB,cAA0C,EAC1C,kBAA2B,EAC3B,OAAY,EACZ,EAAE,oBAAoB,GACrB,OAAO,CAAC,aAAa,CAAC;IAiDzB;;OAEG;IACG,YAAY,CACjB,EACC,UAAU,EACV,cAAc,EACd,MAAM,EACN,QAAsB,EACtB,UAAiB,EACjB,cAAwC,EACxC,SAAiB,EACjB,UAAkB,EAClB,EAAE,mBAAmB,GACpB,OAAO,CAAC,kBAAkB,CAAC;IA8M9B;;OAEG;IACG,wBAAwB,CAC7B,EACC,UAAc,EACd,SAAe,EACf,QAAe,EACf,OAAY,EACZ,GAAE,yBAA8B,GAC/B,OAAO,CAAC,kBAAkB,CAAC;IAmC9B;;OAEG;IACH,UAAU,CACT,EACC,UAAU,EACV,eAAe,EACf,EACD;QACC,UAAU,EAAE,MAAM,CAAC;QACnB,eAAe,EAAE,eAAe,CAAC;KACjC,GACC,OAAO;CAuBV"} \ No newline at end of file +{"version":3,"file":"Router.d.ts","sourceRoot":"","sources":["../src/Router.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/lib/Router.js b/lib/Router.js index 0d3cd0db3c..b7f5b8b1a5 100644 --- a/lib/Router.js +++ b/lib/Router.js @@ -16,7 +16,7 @@ const errors_1 = require("./errors"); const WebRtcTransport_1 = require("./WebRtcTransport"); const PlainTransport_1 = require("./PlainTransport"); const PipeTransport_1 = require("./PipeTransport"); -const DataTransport_1 = require("./DataTransport"); +const DirectTransport_1 = require("./DirectTransport"); const AudioLevelObserver_1 = require("./AudioLevelObserver"); const logger = new Logger_1.Logger('Router'); class Router extends EnhancedEventEmitter_1.EnhancedEventEmitter { @@ -335,10 +335,10 @@ class Router extends EnhancedEventEmitter_1.EnhancedEventEmitter { return transport; } /** - * Create a DataTransport. + * Create a DirectTransport. */ - async createDataTransport({ enableSctp = true, numSctpStreams = { OS: 65535, MIS: 65535 }, maxSctpMessageSize = 262144, appData = {} }) { - logger.debug('createDataTransport()'); + async createDirectTransport({ enableSctp = true, numSctpStreams = { OS: 65535, MIS: 65535 }, maxSctpMessageSize = 262144, appData = {} }) { + logger.debug('createDirectTransport()'); const internal = { ...this._internal, transportId: uuid_1.v4() }; const reqData = { enableSctp, @@ -347,8 +347,8 @@ class Router extends EnhancedEventEmitter_1.EnhancedEventEmitter { isDataChannel: false, useRealSctp: false }; - const data = await this._channel.request('router.createDataTransport', internal, reqData); - const transport = new DataTransport_1.DataTransport({ + const data = await this._channel.request('router.createDirectTransport', internal, reqData); + const transport = new DirectTransport_1.DirectTransport({ internal, data, channel: this._channel, diff --git a/lib/Transport.d.ts b/lib/Transport.d.ts index e44ee37b27..0d52966862 100644 --- a/lib/Transport.d.ts +++ b/lib/Transport.d.ts @@ -168,13 +168,21 @@ export declare class Transport extends EnhancedEventEmitter { */ consume({ producerId, rtpCapabilities, paused, preferredLayers, appData }: ConsumerOptions): Promise; /** - * Create a DataProducer. + * Create a DataProducer that uses SCTP. */ - produceData({ id, sctpStreamParameters, label, protocol, appData }: DataProducerOptions): Promise; + produceSctpData({ id, sctpStreamParameters, label, protocol, appData }: DataProducerOptions): Promise; /** - * Create a DataConsumer. + * DEPRECATED: Use produceSctpData(). */ - consumeData({ dataProducerId, appData }: DataConsumerOptions): Promise; + produceData(options: DataProducerOptions): Promise; + /** + * Create a DataConsumer that uses SCTP. + */ + consumeSctpData({ dataProducerId, appData }: DataConsumerOptions): Promise; + /** + * DEPRECATED: Use consumeSctpData(). + */ + consumeData(options: DataConsumerOptions): Promise; /** * Enable 'trace' event. */ diff --git a/lib/Transport.d.ts.map b/lib/Transport.d.ts.map index 8ea3a38151..9be23839fd 100644 --- a/lib/Transport.d.ts.map +++ b/lib/Transport.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"Transport.d.ts","sourceRoot":"","sources":["../src/Transport.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"Transport.d.ts","sourceRoot":"","sources":["../src/Transport.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/lib/Transport.js b/lib/Transport.js index c644f8ce02..e810cc19ee 100644 --- a/lib/Transport.js +++ b/lib/Transport.js @@ -328,10 +328,10 @@ class Transport extends EnhancedEventEmitter_1.EnhancedEventEmitter { return consumer; } /** - * Create a DataProducer. + * Create a DataProducer that uses SCTP. */ - async produceData({ id = undefined, sctpStreamParameters, label = '', protocol = '', appData = {} }) { - logger.debug('produceData()'); + async produceSctpData({ id = undefined, sctpStreamParameters, label = '', protocol = '', appData = {} }) { + logger.debug('produceSctpData()'); if (id && this._dataProducers.has(id)) throw new TypeError(`a DataProducer with same id "${id}" already exists`); else if (appData && typeof appData !== 'object') @@ -358,10 +358,17 @@ class Transport extends EnhancedEventEmitter_1.EnhancedEventEmitter { return dataProducer; } /** - * Create a DataConsumer. + * DEPRECATED: Use produceSctpData(). */ - async consumeData({ dataProducerId, appData = {} }) { - logger.debug('consumeData()'); + async produceData(options) { + logger.warn('produceData() is DEPRECATED, use produceSctpData()'); + return this.produceSctpData(options); + } + /** + * Create a DataConsumer that uses SCTP. + */ + async consumeSctpData({ dataProducerId, appData = {} }) { + logger.debug('consumeSctpData()'); if (!dataProducerId || typeof dataProducerId !== 'string') throw new TypeError('missing dataProducerId'); else if (appData && typeof appData !== 'object') @@ -397,6 +404,13 @@ class Transport extends EnhancedEventEmitter_1.EnhancedEventEmitter { this._observer.safeEmit('newdataconsumer', dataConsumer); return dataConsumer; } + /** + * DEPRECATED: Use consumeSctpData(). + */ + async consumeData(options) { + logger.warn('consumeData() is DEPRECATED, use consumeSctpData()'); + return this.consumeSctpData(options); + } /** * Enable 'trace' event. */ diff --git a/src/DataTransport.ts b/src/DirectTransport.ts similarity index 88% rename from src/DataTransport.ts rename to src/DirectTransport.ts index 41a6bb819a..9c03627201 100644 --- a/src/DataTransport.ts +++ b/src/DirectTransport.ts @@ -6,7 +6,7 @@ import { Producer, ProducerOptions } from './Producer'; import { Consumer, ConsumerOptions } from './Consumer'; import { SctpParameters, NumSctpStreams } from './SctpParameters'; -export type DataTransportOptions = +export type DirectTransportOptions = { /** * Create a SCTP association. Default true. @@ -30,7 +30,7 @@ export type DataTransportOptions = appData?: any; } -export type DataTransportStat = +export type DirectTransportStat = { // Common to all Transports. type: string; @@ -58,11 +58,11 @@ export type DataTransportStat = maxIncomingBitrate?: number; } -const logger = new Logger('DataTransport'); +const logger = new Logger('DirectTransport'); -export class DataTransport extends Transport +export class DirectTransport extends Transport { - // DataTransport data. + // DirectTransport data. protected readonly _data: { sctpParameters?: SctpParameters; @@ -123,7 +123,7 @@ export class DataTransport extends Transport } /** - * Close the DataTransport. + * Close the DirectTransport. * * @override */ @@ -156,11 +156,11 @@ export class DataTransport extends Transport } /** - * Get DataTransport stats. + * Get DirectTransport stats. * * @override */ - async getStats(): Promise + async getStats(): Promise { logger.debug('getStats()'); @@ -168,7 +168,7 @@ export class DataTransport extends Transport } /** - * NO-OP method in DataTransport. + * NO-OP method in DirectTransport. * * @override */ @@ -184,7 +184,7 @@ export class DataTransport extends Transport async setMaxIncomingBitrate(bitrate: number): Promise { throw new UnsupportedError( - 'setMaxIncomingBitrate() not implemented in DataTransport'); + 'setMaxIncomingBitrate() not implemented in DirectTransport'); } /** @@ -193,7 +193,7 @@ export class DataTransport extends Transport // eslint-disable-next-line @typescript-eslint/no-unused-vars async produce(options: ProducerOptions): Promise { - throw new UnsupportedError('produce() not implemented in DataTransport'); + throw new UnsupportedError('produce() not implemented in DirectTransport'); } /** @@ -202,7 +202,7 @@ export class DataTransport extends Transport // eslint-disable-next-line @typescript-eslint/no-unused-vars async consumer(options: ConsumerOptions): Promise { - throw new UnsupportedError('consumer() not implemented in DataTransport'); + throw new UnsupportedError('consumer() not implemented in DirectTransport'); } private _handleWorkerNotifications(): void diff --git a/src/PlainTransport.ts b/src/PlainTransport.ts index 66a47da039..0ee5680e6d 100644 --- a/src/PlainTransport.ts +++ b/src/PlainTransport.ts @@ -102,7 +102,7 @@ export type PlainTransportStat = } /** - * DEPRECATED: Use PlainTransportOptions. + * DEPRECATED: Use PlainTransportStat. */ export type PlainRtpTransportStat = PlainTransportStat; diff --git a/src/Router.ts b/src/Router.ts index b78191f5c1..23f2248c6b 100644 --- a/src/Router.ts +++ b/src/Router.ts @@ -10,7 +10,7 @@ import { Transport, TransportListenIp } from './Transport'; import { WebRtcTransport, WebRtcTransportOptions } from './WebRtcTransport'; import { PlainTransport, PlainTransportOptions } from './PlainTransport'; import { PipeTransport, PipeTransportOptions } from './PipeTransport'; -import { DataTransport, DataTransportOptions } from './DataTransport'; +import { DirectTransport, DirectTransportOptions } from './DirectTransport'; import { Producer } from './Producer'; import { Consumer } from './Consumer'; import { DataProducer } from './DataProducer'; @@ -621,18 +621,18 @@ export class Router extends EnhancedEventEmitter } /** - * Create a DataTransport. + * Create a DirectTransport. */ - async createDataTransport( + async createDirectTransport( { enableSctp = true, numSctpStreams = { OS: 65535, MIS: 65535 }, maxSctpMessageSize = 262144, appData = {} - }: DataTransportOptions - ): Promise + }: DirectTransportOptions + ): Promise { - logger.debug('createDataTransport()'); + logger.debug('createDirectTransport()'); const internal = { ...this._internal, transportId: uuidv4() }; const reqData = { @@ -644,9 +644,9 @@ export class Router extends EnhancedEventEmitter }; const data = - await this._channel.request('router.createDataTransport', internal, reqData); + await this._channel.request('router.createDirectTransport', internal, reqData); - const transport = new DataTransport( + const transport = new DirectTransport( { internal, data, diff --git a/src/Transport.ts b/src/Transport.ts index dbd2a2574d..f0f70b71bd 100644 --- a/src/Transport.ts +++ b/src/Transport.ts @@ -585,9 +585,9 @@ export class Transport extends EnhancedEventEmitter } /** - * Create a DataProducer. + * Create a DataProducer that uses SCTP. */ - async produceData( + async produceSctpData( { id = undefined, sctpStreamParameters, @@ -597,7 +597,7 @@ export class Transport extends EnhancedEventEmitter }: DataProducerOptions ): Promise { - logger.debug('produceData()'); + logger.debug('produceSctpData()'); if (id && this._dataProducers.has(id)) throw new TypeError(`a DataProducer with same id "${id}" already exists`); @@ -637,16 +637,27 @@ export class Transport extends EnhancedEventEmitter } /** - * Create a DataConsumer. + * DEPRECATED: Use produceSctpData(). */ - async consumeData( + async produceData(options: DataProducerOptions): Promise + { + logger.warn( + 'produceData() is DEPRECATED, use produceSctpData()'); + + return this.produceSctpData(options); + } + + /** + * Create a DataConsumer that uses SCTP. + */ + async consumeSctpData( { dataProducerId, appData = {} }: DataConsumerOptions ): Promise { - logger.debug('consumeData()'); + logger.debug('consumeSctpData()'); if (!dataProducerId || typeof dataProducerId !== 'string') throw new TypeError('missing dataProducerId'); @@ -703,6 +714,17 @@ export class Transport extends EnhancedEventEmitter return dataConsumer; } + /** + * DEPRECATED: Use consumeSctpData(). + */ + async consumeData(options: DataConsumerOptions): Promise + { + logger.warn( + 'consumeData() is DEPRECATED, use consumeSctpData()'); + + return this.consumeSctpData(options); + } + /** * Enable 'trace' event. */ diff --git a/worker/include/RTC/Transport.hpp b/worker/include/RTC/Transport.hpp index 61fa170a8c..6044b16ba4 100644 --- a/worker/include/RTC/Transport.hpp +++ b/worker/include/RTC/Transport.hpp @@ -252,7 +252,6 @@ namespace RTC std::unordered_map mapSsrcConsumer; std::unordered_map mapRtxSsrcConsumer; RTC::SctpAssociation* sctpAssociation{ nullptr }; - bool useRealSctp{ true }; Timer* rtcpTimer{ nullptr }; RTC::TransportCongestionControlClient* tccClient{ nullptr }; RTC::TransportCongestionControlServer* tccServer{ nullptr }; diff --git a/worker/src/RTC/Transport.cpp b/worker/src/RTC/Transport.cpp index c01a735437..af05cdaf67 100644 --- a/worker/src/RTC/Transport.cpp +++ b/worker/src/RTC/Transport.cpp @@ -57,7 +57,6 @@ namespace RTC auto jsonNumSctpStreamsIt = data.find("numSctpStreams"); auto jsonMaxSctpMessageSizeIt = data.find("maxSctpMessageSize"); auto jsonIsDataChannelIt = data.find("isDataChannel"); - auto jsonUseRealSctpIt = data.find("useRealSctp"); // numSctpStreams is mandatory. // clang-format off @@ -108,15 +107,9 @@ namespace RTC if (jsonIsDataChannelIt != data.end() && jsonIsDataChannelIt->is_boolean()) isDataChannel = jsonIsDataChannelIt->get(); - if (jsonUseRealSctpIt != data.end() && jsonUseRealSctpIt->is_boolean()) - this->useRealSctp = jsonUseRealSctpIt->get(); - - if (this->useRealSctp) - { - // This may throw. - this->sctpAssociation = - new RTC::SctpAssociation(this, os, mis, maxSctpMessageSize, isDataChannel); - } + // This may throw. + this->sctpAssociation = + new RTC::SctpAssociation(this, os, mis, maxSctpMessageSize, isDataChannel); } // Create the RTCP timer. @@ -352,7 +345,7 @@ namespace RTC // Add rtpListener. this->rtpListener.FillJson(jsonObject["rtpListener"]); - if (this->useRealSctp && this->sctpAssociation) + if (this->sctpAssociation) { // Add sctpParameters. this->sctpAssociation->FillJson(jsonObject["sctpParameters"]); @@ -417,7 +410,7 @@ namespace RTC // Add timestamp. jsonObject["timestamp"] = nowMs; - if (this->useRealSctp && this->sctpAssociation) + if (this->sctpAssociation) { // Add sctpState. switch (this->sctpAssociation->GetState()) @@ -954,7 +947,7 @@ namespace RTC case Channel::Request::MethodId::TRANSPORT_PRODUCE_DATA: { - if (this->useRealSctp && !this->sctpAssociation) + if (!this->sctpAssociation) MS_THROW_ERROR("SCTP not enabled"); std::string dataProducerId; @@ -1009,7 +1002,7 @@ namespace RTC case Channel::Request::MethodId::TRANSPORT_CONSUME_DATA: { - if (this->useRealSctp && !this->sctpAssociation) + if (!this->sctpAssociation) MS_THROW_ERROR("SCTP not enabled"); auto jsonDataProducerIdIt = request->internal.find("dataProducerId"); From 76be21d5e162235ee6dfce9aa9254edaa952e25e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?I=C3=B1aki=20Baz=20Castillo?= Date: Thu, 28 May 2020 19:17:59 +0200 Subject: [PATCH 09/23] WIP --- TODO_DATACHANNEL_TERMINATION.md | 8 +++ lib/DataConsumer.d.ts | 15 +++++- lib/DataConsumer.d.ts.map | 2 +- lib/DataConsumer.js | 27 +++++++++- lib/DataProducer.d.ts | 21 +++++++- lib/DataProducer.d.ts.map | 2 +- lib/DataProducer.js | 46 +++++++++++++++- lib/DirectTransport.d.ts | 32 ++--------- lib/DirectTransport.d.ts.map | 2 +- lib/DirectTransport.js | 37 ++----------- lib/PayloadChannel.d.ts | 2 +- lib/PayloadChannel.d.ts.map | 2 +- lib/PayloadChannel.js | 8 +-- lib/Router.d.ts | 2 +- lib/Router.d.ts.map | 2 +- lib/Router.js | 15 ++---- lib/Transport.d.ts | 16 ++---- lib/Transport.d.ts.map | 2 +- lib/Transport.js | 53 ++++++++++--------- src/DataConsumer.ts | 53 ++++++++++++++++++- src/DataProducer.ts | 72 ++++++++++++++++++++++++- src/DirectTransport.ts | 70 ++++-------------------- src/PayloadChannel.ts | 8 +-- src/Router.ts | 17 ++---- src/Transport.ts | 77 +++++++++++++++------------ test/test-DataConsumer.js | 2 + test/test-DataProducer.js | 4 ++ test/test-PipeTransport.js | 3 ++ test/test-PlainTransport.js | 2 + test/test-WebRtcTransport.js | 1 + tsconfig.json | 2 +- worker/include/RTC/DataConsumer.hpp | 19 +++++-- worker/include/RTC/DataProducer.hpp | 15 +++++- worker/include/RTC/Router.hpp | 2 +- worker/include/RTC/Transport.hpp | 7 +-- worker/src/RTC/DataConsumer.cpp | 43 ++++++++++++--- worker/src/RTC/DataProducer.cpp | 41 ++++++++++++--- worker/src/RTC/Router.cpp | 4 +- worker/src/RTC/Transport.cpp | 82 ++++++++++++++++++++--------- 39 files changed, 527 insertions(+), 291 deletions(-) diff --git a/TODO_DATACHANNEL_TERMINATION.md b/TODO_DATACHANNEL_TERMINATION.md index 051d7ac619..10a610b710 100644 --- a/TODO_DATACHANNEL_TERMINATION.md +++ b/TODO_DATACHANNEL_TERMINATION.md @@ -4,3 +4,11 @@ - In `Transport.cpp` how to deal with `this->useRealSctp` and `this->sctpAssociation` for stats/dump and so on? +- En `DataProducerOptions` now `sctpStreamParameters` are optional. + +- `sctpStreamParameters` getter can now return `undefined` in `DataProducer/Consumer`. + +- Added `dataProducer/Consumer.type`: 'sctp' | 'direct'. + +- `DirectTransport.cpp` must set `this->direct = true` and call `Transport::Connected()` in its constructor. + diff --git a/lib/DataConsumer.d.ts b/lib/DataConsumer.d.ts index cdd687d869..0ce202e0e6 100644 --- a/lib/DataConsumer.d.ts +++ b/lib/DataConsumer.d.ts @@ -1,5 +1,6 @@ import { EnhancedEventEmitter } from './EnhancedEventEmitter'; import { Channel } from './Channel'; +import { PayloadChannel } from './PayloadChannel'; import { SctpStreamParameters } from './SctpParameters'; export declare type DataConsumerOptions = { /** @@ -19,10 +20,15 @@ export declare type DataConsumerStat = { messagesSent: number; bytesSent: number; }; +/** + * DataConsumer type. + */ +export declare type DataConsumerType = 'sctp' | 'direct'; export declare class DataConsumer extends EnhancedEventEmitter { private readonly _internal; private readonly _data; private readonly _channel; + private readonly _payloadChannel?; private _closed; private readonly _appData?; private readonly _observer; @@ -33,10 +39,11 @@ export declare class DataConsumer extends EnhancedEventEmitter { * @emits @close * @emits @dataproducerclose */ - constructor({ internal, data, channel, appData }: { + constructor({ internal, data, channel, payloadChannel, appData }: { internal: any; data: any; channel: Channel; + payloadChannel?: PayloadChannel; appData: any; }); /** @@ -51,10 +58,14 @@ export declare class DataConsumer extends EnhancedEventEmitter { * Whether the DataConsumer is closed. */ get closed(): boolean; + /** + * DataConsumer type. + */ + get type(): DataConsumerType; /** * SCTP stream parameters. */ - get sctpStreamParameters(): SctpStreamParameters; + get sctpStreamParameters(): SctpStreamParameters | undefined; /** * DataChannel label. */ diff --git a/lib/DataConsumer.d.ts.map b/lib/DataConsumer.d.ts.map index e61c1d04d0..890fa0d427 100644 --- a/lib/DataConsumer.d.ts.map +++ b/lib/DataConsumer.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"DataConsumer.d.ts","sourceRoot":"","sources":["../src/DataConsumer.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAExD,oBAAY,mBAAmB,GAC/B;IACC;;OAEG;IACH,cAAc,EAAE,MAAM,CAAC;IAEvB;;OAEG;IACH,OAAO,CAAC,EAAE,GAAG,CAAC;CACd,CAAA;AAED,oBAAY,gBAAgB,GAC5B;IACC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;CAClB,CAAA;AAID,qBAAa,YAAa,SAAQ,oBAAoB;IAGrD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAMxB;IAGF,OAAO,CAAC,QAAQ,CAAC,KAAK,CAKpB;IAGF,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAU;IAGnC,OAAO,CAAC,OAAO,CAAS;IAGxB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAM;IAGhC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA8B;IAExD;;;;;;OAMG;gBAEF,EACC,QAAQ,EACR,IAAI,EACJ,OAAO,EACP,OAAO,EACP,EACD;QACC,QAAQ,EAAE,GAAG,CAAC;QACd,IAAI,EAAE,GAAG,CAAC;QACV,OAAO,EAAE,OAAO,CAAC;QACjB,OAAO,EAAE,GAAG,CAAC;KACb;IAeF;;OAEG;IACH,IAAI,EAAE,IAAI,MAAM,CAGf;IAED;;OAEG;IACH,IAAI,cAAc,IAAI,MAAM,CAG3B;IAED;;OAEG;IACH,IAAI,MAAM,IAAI,OAAO,CAGpB;IAED;;OAEG;IACH,IAAI,oBAAoB,IAAI,oBAAoB,CAG/C;IAED;;OAEG;IACH,IAAI,KAAK,IAAI,MAAM,CAGlB;IAED;;OAEG;IACH,IAAI,QAAQ,IAAI,MAAM,CAGrB;IAED;;OAEG;IACH,IAAI,OAAO,IAAI,GAAG,CAGjB;IAED;;OAEG;IACH,IAAI,OAAO,CAAC,OAAO,EAAE,GAAG,EAGvB;IAED;;;;OAIG;IACH,IAAI,QAAQ,IAAI,oBAAoB,CAGnC;IAED;;OAEG;IACH,KAAK,IAAI,IAAI;IAqBb;;;;OAIG;IACH,eAAe,IAAI,IAAI;IAkBvB;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC;IAO1B;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAO7C,OAAO,CAAC,0BAA0B;CAgClC"} \ No newline at end of file +{"version":3,"file":"DataConsumer.d.ts","sourceRoot":"","sources":["../src/DataConsumer.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAExD,oBAAY,mBAAmB,GAC/B;IACC;;OAEG;IACH,cAAc,EAAE,MAAM,CAAC;IAEvB;;OAEG;IACH,OAAO,CAAC,EAAE,GAAG,CAAC;CACd,CAAA;AAED,oBAAY,gBAAgB,GAC5B;IACC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;CAClB,CAAA;AAED;;GAEG;AACH,oBAAY,gBAAgB,GAAG,MAAM,GAAG,QAAQ,CAAC;AAIjD,qBAAa,YAAa,SAAQ,oBAAoB;IAGrD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAMxB;IAGF,OAAO,CAAC,QAAQ,CAAC,KAAK,CAMpB;IAGF,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAU;IAGnC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAiB;IAGlD,OAAO,CAAC,OAAO,CAAS;IAGxB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAM;IAGhC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA8B;IAExD;;;;;;OAMG;gBAEF,EACC,QAAQ,EACR,IAAI,EACJ,OAAO,EACP,cAAc,EACd,OAAO,EACP,EACD;QACC,QAAQ,EAAE,GAAG,CAAC;QACd,IAAI,EAAE,GAAG,CAAC;QACV,OAAO,EAAE,OAAO,CAAC;QACjB,cAAc,CAAC,EAAE,cAAc,CAAC;QAChC,OAAO,EAAE,GAAG,CAAC;KACb;IAgBF;;OAEG;IACH,IAAI,EAAE,IAAI,MAAM,CAGf;IAED;;OAEG;IACH,IAAI,cAAc,IAAI,MAAM,CAG3B;IAED;;OAEG;IACH,IAAI,MAAM,IAAI,OAAO,CAGpB;IAED;;OAEG;IACH,IAAI,IAAI,IAAI,gBAAgB,CAG3B;IAED;;OAEG;IACH,IAAI,oBAAoB,IAAI,oBAAoB,GAAG,SAAS,CAG3D;IAED;;OAEG;IACH,IAAI,KAAK,IAAI,MAAM,CAGlB;IAED;;OAEG;IACH,IAAI,QAAQ,IAAI,MAAM,CAGrB;IAED;;OAEG;IACH,IAAI,OAAO,IAAI,GAAG,CAGjB;IAED;;OAEG;IACH,IAAI,OAAO,CAAC,OAAO,EAAE,GAAG,EAGvB;IAED;;;;OAIG;IACH,IAAI,QAAQ,IAAI,oBAAoB,CAGnC;IAED;;OAEG;IACH,KAAK,IAAI,IAAI;IAqBb;;;;OAIG;IACH,eAAe,IAAI,IAAI;IAkBvB;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC;IAO1B;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAO7C,OAAO,CAAC,0BAA0B;CA8DlC"} \ No newline at end of file diff --git a/lib/DataConsumer.js b/lib/DataConsumer.js index 502d073997..80aa9296c6 100644 --- a/lib/DataConsumer.js +++ b/lib/DataConsumer.js @@ -11,7 +11,7 @@ class DataConsumer extends EnhancedEventEmitter_1.EnhancedEventEmitter { * @emits @close * @emits @dataproducerclose */ - constructor({ internal, data, channel, appData }) { + constructor({ internal, data, channel, payloadChannel, appData }) { super(); // Closed flag. this._closed = false; @@ -21,6 +21,7 @@ class DataConsumer extends EnhancedEventEmitter_1.EnhancedEventEmitter { this._internal = internal; this._data = data; this._channel = channel; + this._payloadChannel = payloadChannel; this._appData = appData; this._handleWorkerNotifications(); } @@ -42,6 +43,12 @@ class DataConsumer extends EnhancedEventEmitter_1.EnhancedEventEmitter { get closed() { return this._closed; } + /** + * DataConsumer type. + */ + get type() { + return this._data.type; + } /** * SCTP stream parameters. */ @@ -148,6 +155,24 @@ class DataConsumer extends EnhancedEventEmitter_1.EnhancedEventEmitter { } } }); + if (this._payloadChannel) { + this._payloadChannel.on(this._internal.dataConsumerId, (event, data) => { + switch (event) { + case 'message': + { + if (this._closed) + break; + const { message, ppid } = data; + this.safeEmit('message', message, ppid); + break; + } + default: + { + logger.error('ignoring unknown event "%s"', event); + } + } + }); + } } } exports.DataConsumer = DataConsumer; diff --git a/lib/DataProducer.d.ts b/lib/DataProducer.d.ts index 127815a4f2..8a2a64786c 100644 --- a/lib/DataProducer.d.ts +++ b/lib/DataProducer.d.ts @@ -1,5 +1,7 @@ +/// import { EnhancedEventEmitter } from './EnhancedEventEmitter'; import { Channel } from './Channel'; +import { PayloadChannel } from './PayloadChannel'; import { SctpStreamParameters } from './SctpParameters'; export declare type DataProducerOptions = { /** @@ -8,8 +10,9 @@ export declare type DataProducerOptions = { id?: string; /** * SCTP parameters defining how the endpoint is sending the data. + * Just if messages are sent over SCTP. */ - sctpStreamParameters: SctpStreamParameters; + sctpStreamParameters?: SctpStreamParameters; /** * A label which can be used to distinguish this DataChannel from others. */ @@ -31,10 +34,15 @@ export declare type DataProducerStat = { messagesReceived: number; bytesReceived: number; }; +/** + * DataProducer type. + */ +export declare type DataProducerType = 'sctp' | 'direct'; export declare class DataProducer extends EnhancedEventEmitter { private readonly _internal; private readonly _data; private readonly _channel; + private readonly _payloadChannel?; private _closed; private readonly _appData?; private readonly _observer; @@ -43,10 +51,11 @@ export declare class DataProducer extends EnhancedEventEmitter { * @emits transportclose * @emits @close */ - constructor({ internal, data, channel, appData }: { + constructor({ internal, data, channel, payloadChannel, appData }: { internal: any; data: any; channel: Channel; + payloadChannel?: PayloadChannel; appData: any; }); /** @@ -57,6 +66,10 @@ export declare class DataProducer extends EnhancedEventEmitter { * Whether the DataProducer is closed. */ get closed(): boolean; + /** + * DataProducer type. + */ + get type(): DataProducerType; /** * SCTP stream parameters. */ @@ -101,6 +114,10 @@ export declare class DataProducer extends EnhancedEventEmitter { * Get DataProducer stats. */ getStats(): Promise; + /** + * Send data (just valid for DataProducers created on a DirectTransport). + */ + send(message: string | Buffer, ppid?: number): void; private _handleWorkerNotifications; } //# sourceMappingURL=DataProducer.d.ts.map \ No newline at end of file diff --git a/lib/DataProducer.d.ts.map b/lib/DataProducer.d.ts.map index 7356bf2101..97f24ad210 100644 --- a/lib/DataProducer.d.ts.map +++ b/lib/DataProducer.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"DataProducer.d.ts","sourceRoot":"","sources":["../src/DataProducer.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAExD,oBAAY,mBAAmB,GAC/B;IACC;;OAEG;IACH,EAAE,CAAC,EAAE,MAAM,CAAC;IAEZ;;OAEG;IACH,oBAAoB,EAAE,oBAAoB,CAAC;IAE3C;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;OAEG;IACH,OAAO,CAAC,EAAE,GAAG,CAAC;CACd,CAAA;AAED,oBAAY,gBAAgB,GAC5B;IACC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,EAAE,MAAM,CAAC;IACzB,aAAa,EAAE,MAAM,CAAC;CACtB,CAAA;AAID,qBAAa,YAAa,SAAQ,oBAAoB;IAGrD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAKxB;IAGF,OAAO,CAAC,QAAQ,CAAC,KAAK,CAKpB;IAGF,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAU;IAGnC,OAAO,CAAC,OAAO,CAAS;IAGxB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAM;IAGhC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA8B;IAExD;;;;OAIG;gBAEF,EACC,QAAQ,EACR,IAAI,EACJ,OAAO,EACP,OAAO,EACP,EACD;QACC,QAAQ,EAAE,GAAG,CAAC;QACd,IAAI,EAAE,GAAG,CAAC;QACV,OAAO,EAAE,OAAO,CAAC;QACjB,OAAO,EAAE,GAAG,CAAC;KACb;IAeF;;OAEG;IACH,IAAI,EAAE,IAAI,MAAM,CAGf;IAED;;OAEG;IACH,IAAI,MAAM,IAAI,OAAO,CAGpB;IAED;;OAEG;IACH,IAAI,oBAAoB,IAAI,oBAAoB,CAG/C;IAED;;OAEG;IACH,IAAI,KAAK,IAAI,MAAM,CAGlB;IAED;;OAEG;IACH,IAAI,QAAQ,IAAI,MAAM,CAGrB;IAED;;OAEG;IACH,IAAI,OAAO,IAAI,GAAG,CAGjB;IAED;;OAEG;IACH,IAAI,OAAO,CAAC,OAAO,EAAE,GAAG,EAGvB;IAED;;;;OAIG;IACH,IAAI,QAAQ,IAAI,oBAAoB,CAGnC;IAED;;OAEG;IACH,KAAK,IAAI,IAAI;IAqBb;;;;OAIG;IACH,eAAe,IAAI,IAAI;IAevB;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC;IAO1B;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAO7C,OAAO,CAAC,0BAA0B;CAIlC"} \ No newline at end of file +{"version":3,"file":"DataProducer.d.ts","sourceRoot":"","sources":["../src/DataProducer.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAE9D,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAExD,oBAAY,mBAAmB,GAC/B;IACC;;OAEG;IACH,EAAE,CAAC,EAAE,MAAM,CAAC;IAEZ;;;OAGG;IACH,oBAAoB,CAAC,EAAE,oBAAoB,CAAC;IAE5C;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;OAEG;IACH,OAAO,CAAC,EAAE,GAAG,CAAC;CACd,CAAA;AAED,oBAAY,gBAAgB,GAC5B;IACC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,EAAE,MAAM,CAAC;IACzB,aAAa,EAAE,MAAM,CAAC;CACtB,CAAA;AAED;;GAEG;AACH,oBAAY,gBAAgB,GAAG,MAAM,GAAG,QAAQ,CAAC;AAIjD,qBAAa,YAAa,SAAQ,oBAAoB;IAGrD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAKxB;IAGF,OAAO,CAAC,QAAQ,CAAC,KAAK,CAMpB;IAGF,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAU;IAGnC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAiB;IAGlD,OAAO,CAAC,OAAO,CAAS;IAGxB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAM;IAGhC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA8B;IAExD;;;;OAIG;gBAEF,EACC,QAAQ,EACR,IAAI,EACJ,OAAO,EACP,cAAc,EACd,OAAO,EACP,EACD;QACC,QAAQ,EAAE,GAAG,CAAC;QACd,IAAI,EAAE,GAAG,CAAC;QACV,OAAO,EAAE,OAAO,CAAC;QACjB,cAAc,CAAC,EAAE,cAAc,CAAC;QAChC,OAAO,EAAE,GAAG,CAAC;KACb;IAgBF;;OAEG;IACH,IAAI,EAAE,IAAI,MAAM,CAGf;IAED;;OAEG;IACH,IAAI,MAAM,IAAI,OAAO,CAGpB;IAED;;OAEG;IACH,IAAI,IAAI,IAAI,gBAAgB,CAG3B;IAED;;OAEG;IACH,IAAI,oBAAoB,IAAI,oBAAoB,CAG/C;IAED;;OAEG;IACH,IAAI,KAAK,IAAI,MAAM,CAGlB;IAED;;OAEG;IACH,IAAI,QAAQ,IAAI,MAAM,CAGrB;IAED;;OAEG;IACH,IAAI,OAAO,IAAI,GAAG,CAGjB;IAED;;OAEG;IACH,IAAI,OAAO,CAAC,OAAO,EAAE,GAAG,EAGvB;IAED;;;;OAIG;IACH,IAAI,QAAQ,IAAI,oBAAoB,CAGnC;IAED;;OAEG;IACH,KAAK,IAAI,IAAI;IAqBb;;;;OAIG;IACH,eAAe,IAAI,IAAI;IAevB;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC;IAO1B;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAO7C;;OAEG;IACH,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI;IA4CnD,OAAO,CAAC,0BAA0B;CAIlC"} \ No newline at end of file diff --git a/lib/DataProducer.js b/lib/DataProducer.js index 128a257766..25fded3b31 100644 --- a/lib/DataProducer.js +++ b/lib/DataProducer.js @@ -2,6 +2,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); const Logger_1 = require("./Logger"); const EnhancedEventEmitter_1 = require("./EnhancedEventEmitter"); +const errors_1 = require("./errors"); const logger = new Logger_1.Logger('DataProducer'); class DataProducer extends EnhancedEventEmitter_1.EnhancedEventEmitter { /** @@ -9,7 +10,7 @@ class DataProducer extends EnhancedEventEmitter_1.EnhancedEventEmitter { * @emits transportclose * @emits @close */ - constructor({ internal, data, channel, appData }) { + constructor({ internal, data, channel, payloadChannel, appData }) { super(); // Closed flag. this._closed = false; @@ -19,6 +20,7 @@ class DataProducer extends EnhancedEventEmitter_1.EnhancedEventEmitter { this._internal = internal; this._data = data; this._channel = channel; + this._payloadChannel = payloadChannel; this._appData = appData; this._handleWorkerNotifications(); } @@ -34,6 +36,12 @@ class DataProducer extends EnhancedEventEmitter_1.EnhancedEventEmitter { get closed() { return this._closed; } + /** + * DataProducer type. + */ + get type() { + return this._data.type; + } /** * SCTP stream parameters. */ @@ -116,6 +124,42 @@ class DataProducer extends EnhancedEventEmitter_1.EnhancedEventEmitter { logger.debug('getStats()'); return this._channel.request('dataProducer.getStats', this._internal); } + /** + * Send data (just valid for DataProducers created on a DirectTransport). + */ + send(message, ppid) { + logger.debug('send()'); + if (!this._payloadChannel) { + throw new errors_1.UnsupportedError('send() not supported for this DataProducer'); + } + /* + * +-------------------------------+----------+ + * | Value | SCTP | + * | | PPID | + * +-------------------------------+----------+ + * | WebRTC String | 51 | + * | WebRTC Binary Partial | 52 | + * | (Deprecated) | | + * | WebRTC Binary | 53 | + * | WebRTC String Partial | 54 | + * | (Deprecated) | | + * | WebRTC String Empty | 56 | + * | WebRTC Binary Empty | 57 | + * +-------------------------------+----------+ + */ + if (typeof ppid !== 'number') { + ppid = (typeof message === 'string') + ? message.length > 0 ? 51 : 56 + : message.length > 0 ? 53 : 57; + } + // Ensure we honor PPIDs. + if (ppid === 56) + message = ' '; + else if (ppid === 57) + message = Buffer.alloc(1); + const notifData = { ppid }; + this._payloadChannel.notify('dataProducer.send', this._internal, notifData, message); + } _handleWorkerNotifications() { // No need to subscribe to any event. } diff --git a/lib/DirectTransport.d.ts b/lib/DirectTransport.d.ts index df565e48ce..b11e8b1d21 100644 --- a/lib/DirectTransport.d.ts +++ b/lib/DirectTransport.d.ts @@ -1,22 +1,12 @@ import { EnhancedEventEmitter } from './EnhancedEventEmitter'; -import { Transport, SctpState } from './Transport'; +import { Transport } from './Transport'; import { Producer, ProducerOptions } from './Producer'; import { Consumer, ConsumerOptions } from './Consumer'; -import { SctpParameters, NumSctpStreams } from './SctpParameters'; export declare type DirectTransportOptions = { /** - * Create a SCTP association. Default true. + * Maximum allowed size for messages. Default 262144. */ - enableSctp?: boolean; - /** - * SCTP streams number. - */ - numSctpStreams?: NumSctpStreams; - /** - * Maximum size of data that can be passed to DataProducer's send() method. - * Default 262144. - */ - maxSctpMessageSize?: number; + maxMessageSize?: number; /** * Custom application data. */ @@ -26,7 +16,6 @@ export declare type DirectTransportStat = { type: string; transportId: string; timestamp: number; - sctpState?: SctpState; bytesReceived: number; recvBitrate: number; bytesSent: number; @@ -48,24 +37,12 @@ export declare type DirectTransportStat = { maxIncomingBitrate?: number; }; export declare class DirectTransport extends Transport { - protected readonly _data: { - sctpParameters?: SctpParameters; - sctpState?: SctpState; - }; + protected readonly _data: {}; /** * @private - * @emits sctpstatechange - (sctpState: SctpState) * @emits trace - (trace: TransportTraceEventData) */ constructor(params: any); - /** - * SCTP parameters. - */ - get sctpParameters(): SctpParameters | undefined; - /** - * SCTP state. - */ - get sctpState(): SctpState | undefined; /** * Observer. * @@ -73,7 +50,6 @@ export declare class DirectTransport extends Transport { * @emits close * @emits newdataproducer - (dataProducer: DataProducer) * @emits newdataconsumer - (dataProducer: DataProducer) - * @emits sctpstatechange - (sctpState: SctpState) * @emits trace - (trace: TransportTraceEventData) */ get observer(): EnhancedEventEmitter; diff --git a/lib/DirectTransport.d.ts.map b/lib/DirectTransport.d.ts.map index 7d8eb40370..384d37d3d1 100644 --- a/lib/DirectTransport.d.ts.map +++ b/lib/DirectTransport.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"DirectTransport.d.ts","sourceRoot":"","sources":["../src/DirectTransport.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAE9D,OAAO,EAAE,SAAS,EAA2B,SAAS,EAAE,MAAM,aAAa,CAAC;AAC5E,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AACvD,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElE,oBAAY,sBAAsB,GAClC;IACC;;OAEG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IAErB;;OAEG;IACH,cAAc,CAAC,EAAE,cAAc,CAAC;IAEhC;;;OAGG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAE5B;;OAEG;IACH,OAAO,CAAC,EAAE,GAAG,CAAC;CACd,CAAA;AAED,oBAAY,mBAAmB,GAC/B;IAEC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,sBAAsB,EAAE,MAAM,CAAC;IAC/B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC5B,CAAA;AAID,qBAAa,eAAgB,SAAQ,SAAS;IAG7C,SAAS,CAAC,QAAQ,CAAC,KAAK,EACxB;QACC,cAAc,CAAC,EAAE,cAAc,CAAC;QAChC,SAAS,CAAC,EAAE,SAAS,CAAC;KACtB,CAAC;IAEF;;;;OAIG;gBACS,MAAM,EAAE,GAAG;IAiBvB;;OAEG;IACH,IAAI,cAAc,IAAI,cAAc,GAAG,SAAS,CAG/C;IAED;;OAEG;IACH,IAAI,SAAS,IAAI,SAAS,GAAG,SAAS,CAGrC;IAED;;;;;;;;;OASG;IACH,IAAI,QAAQ,IAAI,oBAAoB,CAGnC;IAED;;;;OAIG;IACH,KAAK,IAAI,IAAI;IAWb;;;;;OAKG;IACH,YAAY,IAAI,IAAI;IAWpB;;;;OAIG;IACG,QAAQ,IAAI,OAAO,CAAC,mBAAmB,EAAE,CAAC;IAOhD;;;;OAIG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAK9B;;OAEG;IAEG,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAM3D;;OAEG;IAEG,OAAO,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,QAAQ,CAAC;IAK1D;;OAEG;IAEG,QAAQ,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,QAAQ,CAAC;IAK3D,OAAO,CAAC,0BAA0B;CAuClC"} \ No newline at end of file +{"version":3,"file":"DirectTransport.d.ts","sourceRoot":"","sources":["../src/DirectTransport.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAE9D,OAAO,EAAE,SAAS,EAA2B,MAAM,aAAa,CAAC;AACjE,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AACvD,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAEvD,oBAAY,sBAAsB,GAClC;IACC;;OAEG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB;;OAEG;IACH,OAAO,CAAC,EAAE,GAAG,CAAC;CACd,CAAA;AAED,oBAAY,mBAAmB,GAC/B;IAEC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,sBAAsB,EAAE,MAAM,CAAC;IAC/B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC5B,CAAA;AAID,qBAAa,eAAgB,SAAQ,SAAS;IAG7C,SAAS,CAAC,QAAQ,CAAC,KAAK,EACxB,EAEC,CAAC;IAEF;;;OAGG;gBACS,MAAM,EAAE,GAAG;IAiBvB;;;;;;;;OAQG;IACH,IAAI,QAAQ,IAAI,oBAAoB,CAGnC;IAED;;;;OAIG;IACH,KAAK,IAAI,IAAI;IAQb;;;;;OAKG;IACH,YAAY,IAAI,IAAI;IAQpB;;;;OAIG;IACG,QAAQ,IAAI,OAAO,CAAC,mBAAmB,EAAE,CAAC;IAOhD;;;;OAIG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAK9B;;OAEG;IAEG,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAM3D;;OAEG;IAEG,OAAO,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,QAAQ,CAAC;IAK1D;;OAEG;IAEG,QAAQ,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,QAAQ,CAAC;IAK3D,OAAO,CAAC,0BAA0B;CAyBlC"} \ No newline at end of file diff --git a/lib/DirectTransport.js b/lib/DirectTransport.js index 37a0e2c2e0..f58d5b0bcd 100644 --- a/lib/DirectTransport.js +++ b/lib/DirectTransport.js @@ -7,32 +7,19 @@ const logger = new Logger_1.Logger('DirectTransport'); class DirectTransport extends Transport_1.Transport { /** * @private - * @emits sctpstatechange - (sctpState: SctpState) * @emits trace - (trace: TransportTraceEventData) */ constructor(params) { super(params); logger.debug('constructor()'); const { data } = params; - this._data = - { - sctpParameters: data.sctpParameters, - sctpState: data.sctpState - }; + // TODO + this._data = data; + // { + // + // }; this._handleWorkerNotifications(); } - /** - * SCTP parameters. - */ - get sctpParameters() { - return this._data.sctpParameters; - } - /** - * SCTP state. - */ - get sctpState() { - return this._data.sctpState; - } /** * Observer. * @@ -40,7 +27,6 @@ class DirectTransport extends Transport_1.Transport { * @emits close * @emits newdataproducer - (dataProducer: DataProducer) * @emits newdataconsumer - (dataProducer: DataProducer) - * @emits sctpstatechange - (sctpState: SctpState) * @emits trace - (trace: TransportTraceEventData) */ get observer() { @@ -54,8 +40,6 @@ class DirectTransport extends Transport_1.Transport { close() { if (this._closed) return; - if (this._data.sctpState) - this._data.sctpState = 'closed'; super.close(); } /** @@ -67,8 +51,6 @@ class DirectTransport extends Transport_1.Transport { routerClosed() { if (this._closed) return; - if (this._data.sctpState) - this._data.sctpState = 'closed'; super.routerClosed(); } /** @@ -112,15 +94,6 @@ class DirectTransport extends Transport_1.Transport { _handleWorkerNotifications() { this._channel.on(this._internal.transportId, (event, data) => { switch (event) { - case 'sctpstatechange': - { - const sctpState = data.sctpState; - this._data.sctpState = sctpState; - this.safeEmit('sctpstatechange', sctpState); - // Emit observer event. - this._observer.safeEmit('sctpstatechange', sctpState); - break; - } case 'trace': { const trace = data; diff --git a/lib/PayloadChannel.d.ts b/lib/PayloadChannel.d.ts index 2b252fbe45..55bb084514 100644 --- a/lib/PayloadChannel.d.ts +++ b/lib/PayloadChannel.d.ts @@ -20,7 +20,7 @@ export declare class PayloadChannel extends EnhancedEventEmitter { /** * @private */ - send(event: string, internal: object, data: any | undefined, payload: string | Buffer): void; + notify(event: string, internal: object, data: any | undefined, payload: string | Buffer): void; private _processData; } //# sourceMappingURL=PayloadChannel.d.ts.map \ No newline at end of file diff --git a/lib/PayloadChannel.d.ts.map b/lib/PayloadChannel.d.ts.map index 2ba399dd56..3555f8d8be 100644 --- a/lib/PayloadChannel.d.ts.map +++ b/lib/PayloadChannel.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"PayloadChannel.d.ts","sourceRoot":"","sources":["../src/PayloadChannel.ts"],"names":[],"mappings":";AAIA,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAS9D,qBAAa,cAAe,SAAQ,oBAAoB;IAGvD,OAAO,CAAC,OAAO,CAAS;IAGxB,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAS;IAGzC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAS;IAGzC,OAAO,CAAC,WAAW,CAAC,CAAS;IAG7B,OAAO,CAAC,oBAAoB,CAAC,CAAkD;IAE/E;;OAEG;gBAEF,EACC,cAAc,EACd,cAAc,EACd,EACD;QACC,cAAc,EAAE,GAAG,CAAC;QACpB,cAAc,EAAE,GAAG,CAAC;KACpB;IAyFF;;OAEG;IACH,KAAK,IAAI,IAAI;IA6Bb;;OAEG;IACH,IAAI,CACH,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,GAAG,GAAG,SAAS,EACrB,OAAO,EAAE,MAAM,GAAG,MAAM,GACtB,IAAI;IAyCP,OAAO,CAAC,YAAY;CAgDpB"} \ No newline at end of file +{"version":3,"file":"PayloadChannel.d.ts","sourceRoot":"","sources":["../src/PayloadChannel.ts"],"names":[],"mappings":";AAIA,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAS9D,qBAAa,cAAe,SAAQ,oBAAoB;IAGvD,OAAO,CAAC,OAAO,CAAS;IAGxB,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAS;IAGzC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAS;IAGzC,OAAO,CAAC,WAAW,CAAC,CAAS;IAG7B,OAAO,CAAC,oBAAoB,CAAC,CAAkD;IAE/E;;OAEG;gBAEF,EACC,cAAc,EACd,cAAc,EACd,EACD;QACC,cAAc,EAAE,GAAG,CAAC;QACpB,cAAc,EAAE,GAAG,CAAC;KACpB;IAyFF;;OAEG;IACH,KAAK,IAAI,IAAI;IA6Bb;;OAEG;IACH,MAAM,CACL,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,GAAG,GAAG,SAAS,EACrB,OAAO,EAAE,MAAM,GAAG,MAAM,GACtB,IAAI;IAyCP,OAAO,CAAC,YAAY;CAgDpB"} \ No newline at end of file diff --git a/lib/PayloadChannel.js b/lib/PayloadChannel.js index 732d45425e..48b0939d94 100644 --- a/lib/PayloadChannel.js +++ b/lib/PayloadChannel.js @@ -102,8 +102,8 @@ class PayloadChannel extends EnhancedEventEmitter_1.EnhancedEventEmitter { /** * @private */ - send(event, internal, data, payload) { - logger.debug('send() [event:%s]', event); + notify(event, internal, data, payload) { + logger.debug('notify() [event:%s]', event); if (this._closed) throw new errors_1.InvalidStateError('PayloadChannel closed'); const notification = { event, internal, data }; @@ -118,7 +118,7 @@ class PayloadChannel extends EnhancedEventEmitter_1.EnhancedEventEmitter { this._producerSocket.write(ns1); } catch (error) { - logger.warn('send() | sending notification failed: %s', String(error)); + logger.warn('notify() | sending notification failed: %s', String(error)); return; } try { @@ -126,7 +126,7 @@ class PayloadChannel extends EnhancedEventEmitter_1.EnhancedEventEmitter { this._producerSocket.write(ns2); } catch (error) { - logger.warn('send() | sending payload failed: %s', String(error)); + logger.warn('notify() | sending payload failed: %s', String(error)); return; } } diff --git a/lib/Router.d.ts b/lib/Router.d.ts index 2abc73518b..0c71c4fce5 100644 --- a/lib/Router.d.ts +++ b/lib/Router.d.ts @@ -162,7 +162,7 @@ export declare class Router extends EnhancedEventEmitter { /** * Create a DirectTransport. */ - createDirectTransport({ enableSctp, numSctpStreams, maxSctpMessageSize, appData }: DirectTransportOptions): Promise; + createDirectTransport({ maxMessageSize, appData }: DirectTransportOptions): Promise; /** * Pipes the given Producer or DataProducer into another Router in same host. */ diff --git a/lib/Router.d.ts.map b/lib/Router.d.ts.map index 06c855f083..cdb6d334c7 100644 --- a/lib/Router.d.ts.map +++ b/lib/Router.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"Router.d.ts","sourceRoot":"","sources":["../src/Router.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"Router.d.ts","sourceRoot":"","sources":["../src/Router.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/lib/Router.js b/lib/Router.js index b7f5b8b1a5..2985b23ca8 100644 --- a/lib/Router.js +++ b/lib/Router.js @@ -193,8 +193,7 @@ class Router extends EnhancedEventEmitter_1.EnhancedEventEmitter { enableSctp, numSctpStreams, maxSctpMessageSize, - isDataChannel: true, - useRealSctp: true + isDataChannel: true }; const data = await this._channel.request('router.createWebRtcTransport', internal, reqData); const transport = new WebRtcTransport_1.WebRtcTransport({ @@ -248,7 +247,6 @@ class Router extends EnhancedEventEmitter_1.EnhancedEventEmitter { numSctpStreams, maxSctpMessageSize, isDataChannel: false, - useRealSctp: true, enableSrtp, srtpCryptoSuite }; @@ -309,7 +307,6 @@ class Router extends EnhancedEventEmitter_1.EnhancedEventEmitter { numSctpStreams, maxSctpMessageSize, isDataChannel: false, - useRealSctp: true, enableRtx, enableSrtp }; @@ -337,16 +334,10 @@ class Router extends EnhancedEventEmitter_1.EnhancedEventEmitter { /** * Create a DirectTransport. */ - async createDirectTransport({ enableSctp = true, numSctpStreams = { OS: 65535, MIS: 65535 }, maxSctpMessageSize = 262144, appData = {} }) { + async createDirectTransport({ maxMessageSize = 262144, appData = {} }) { logger.debug('createDirectTransport()'); const internal = { ...this._internal, transportId: uuid_1.v4() }; - const reqData = { - enableSctp, - numSctpStreams, - maxSctpMessageSize, - isDataChannel: false, - useRealSctp: false - }; + const reqData = { maxMessageSize }; const data = await this._channel.request('router.createDirectTransport', internal, reqData); const transport = new DirectTransport_1.DirectTransport({ internal, diff --git a/lib/Transport.d.ts b/lib/Transport.d.ts index 0d52966862..e44ee37b27 100644 --- a/lib/Transport.d.ts +++ b/lib/Transport.d.ts @@ -168,21 +168,13 @@ export declare class Transport extends EnhancedEventEmitter { */ consume({ producerId, rtpCapabilities, paused, preferredLayers, appData }: ConsumerOptions): Promise; /** - * Create a DataProducer that uses SCTP. + * Create a DataProducer. */ - produceSctpData({ id, sctpStreamParameters, label, protocol, appData }: DataProducerOptions): Promise; + produceData({ id, sctpStreamParameters, label, protocol, appData }: DataProducerOptions): Promise; /** - * DEPRECATED: Use produceSctpData(). + * Create a DataConsumer. */ - produceData(options: DataProducerOptions): Promise; - /** - * Create a DataConsumer that uses SCTP. - */ - consumeSctpData({ dataProducerId, appData }: DataConsumerOptions): Promise; - /** - * DEPRECATED: Use consumeSctpData(). - */ - consumeData(options: DataConsumerOptions): Promise; + consumeData({ dataProducerId, appData }: DataConsumerOptions): Promise; /** * Enable 'trace' event. */ diff --git a/lib/Transport.d.ts.map b/lib/Transport.d.ts.map index 9be23839fd..89d3f48fa0 100644 --- a/lib/Transport.d.ts.map +++ b/lib/Transport.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"Transport.d.ts","sourceRoot":"","sources":["../src/Transport.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"Transport.d.ts","sourceRoot":"","sources":["../src/Transport.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAG9D,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AACvD,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AACvD,OAAO,EACN,YAAY,EACZ,mBAAmB,EAEnB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACN,YAAY,EACZ,mBAAmB,EAEnB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAwB,MAAM,kBAAkB,CAAC;AAExE,MAAM,WAAW,iBAAiB;IAEjC;;OAEG;IACH,EAAE,EAAE,MAAM,CAAC;IAEX;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,oBAAY,iBAAiB,GAAG,KAAK,GAAG,KAAK,CAAC;AAE9C,MAAM,WAAW,cAAc;IAE9B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,iBAAiB,CAAC;CAC5B;AAED;;GAEG;AACH,oBAAY,uBAAuB,GAAG,WAAW,GAAG,KAAK,CAAC;AAE1D;;GAEG;AACH,MAAM,WAAW,uBAAuB;IAEvC;;OAEG;IACH,IAAI,EAAE,uBAAuB,CAAC;IAE9B;;OAEG;IACH,SAAS,EAAE,MAAM,CAAC;IAElB;;OAEG;IACH,SAAS,EAAE,IAAI,GAAG,KAAK,CAAC;IAExB;;OAEG;IACH,IAAI,EAAE,GAAG,CAAC;CACV;AAED,oBAAY,SAAS,GAAG,KAAK,GAAG,YAAY,GAAG,WAAW,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAIjF,qBAAa,SAAU,SAAQ,oBAAoB;IAGlD,SAAS,CAAC,QAAQ,CAAC,SAAS,EAC5B;QACC,QAAQ,EAAE,MAAM,CAAC;QACjB,WAAW,EAAE,MAAM,CAAC;KACpB,CAAC;IAGF,SAAS,CAAC,QAAQ,CAAC,KAAK,EACxB;QACC,cAAc,CAAC,EAAE,cAAc,CAAC;QAChC,SAAS,CAAC,EAAE,SAAS,CAAC;KACtB,CAAC;IAGF,SAAS,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAGrC,SAAS,CAAC,QAAQ,CAAC,eAAe,EAAE,cAAc,CAAC;IAGnD,SAAS,CAAC,OAAO,UAAS;IAG1B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAM;IAGhC,SAAS,CAAC,QAAQ,CAAC,yBAAyB,EAAE,MAAM,eAAe,CAAC;IAGpE,SAAS,CAAC,QAAQ,CAAC,gBAAgB,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,QAAQ,CAAC;IAGtE,SAAS,CAAC,QAAQ,CAAC,oBAAoB,EAAE,CAAC,cAAc,EAAE,MAAM,KAAK,YAAY,CAAC;IAGlF,SAAS,CAAC,QAAQ,CAAC,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAa;IAGjE,SAAS,CAAC,QAAQ,CAAC,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAa;IAGjE,SAAS,CAAC,QAAQ,CAAC,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAAa;IAGzE,SAAS,CAAC,QAAQ,CAAC,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAAa;IAGzE,OAAO,CAAC,kBAAkB,CAAC,CAAS;IAGpC,OAAO,CAAC,oBAAoB,CAAK;IAGjC,OAAO,CAAC,cAAc,CAAC,CAAS;IAGhC,OAAO,CAAC,iBAAiB,CAAK;IAG9B,SAAS,CAAC,QAAQ,CAAC,SAAS,uBAA8B;IAE1D;;;;;;;;;OASG;gBAEF,EACC,QAAQ,EACR,IAAI,EACJ,OAAO,EACP,cAAc,EACd,OAAO,EACP,wBAAwB,EACxB,eAAe,EACf,mBAAmB,EACnB,EACD;QACC,QAAQ,EAAE,GAAG,CAAC;QACd,IAAI,EAAE,GAAG,CAAC;QACV,OAAO,EAAE,OAAO,CAAC;QACjB,cAAc,EAAE,cAAc,CAAC;QAC/B,OAAO,EAAE,GAAG,CAAC;QACb,wBAAwB,EAAE,MAAM,eAAe,CAAC;QAChD,eAAe,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,QAAQ,CAAC;QAClD,mBAAmB,EAAE,CAAC,cAAc,EAAE,MAAM,KAAK,YAAY,CAAC;KAC9D;IAiBF;;OAEG;IACH,IAAI,EAAE,IAAI,MAAM,CAGf;IAED;;OAEG;IACH,IAAI,MAAM,IAAI,OAAO,CAGpB;IAED;;OAEG;IACH,IAAI,OAAO,IAAI,GAAG,CAGjB;IAED;;OAEG;IACH,IAAI,OAAO,CAAC,OAAO,EAAE,GAAG,EAGvB;IAED;;;;;;;;OAQG;IACH,IAAI,QAAQ,IAAI,oBAAoB,CAGnC;IAED;;OAEG;IACH,KAAK,IAAI,IAAI;IAuDb;;;;;OAKG;IACH,YAAY,IAAI,IAAI;IAoDpB;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC;IAO1B;;;;OAIG;IACG,QAAQ,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IAMhC;;;;OAIG;IAEG,OAAO,CAAC,MAAM,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;IAMzC;;OAEG;IACG,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAU3D;;OAEG;IACG,OAAO,CACZ,EACC,EAAc,EACd,IAAI,EACJ,aAAa,EACb,MAAc,EACd,oBAAoB,EACpB,OAAY,EACZ,EAAE,eAAe,GAChB,OAAO,CAAC,QAAQ,CAAC;IA8FpB;;;;OAIG;IACG,OAAO,CACZ,EACC,UAAU,EACV,eAAe,EACf,MAAc,EACd,eAAe,EACf,OAAY,EACZ,EAAE,eAAe,GAChB,OAAO,CAAC,QAAQ,CAAC;IAuEpB;;OAEG;IACG,WAAW,CAChB,EACC,EAAc,EACd,oBAAoB,EACpB,KAAU,EACV,QAAa,EACb,OAAY,EACZ,EAAE,mBAAmB,GACpB,OAAO,CAAC,YAAY,CAAC;IAyDxB;;OAEG;IACG,WAAW,CAChB,EACC,cAAc,EACd,OAAY,EAEZ,EAAE,mBAAmB,GACpB,OAAO,CAAC,YAAY,CAAC;IAiExB;;OAEG;IACG,gBAAgB,CAAC,KAAK,GAAE,uBAAuB,EAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAU5E,OAAO,CAAC,oBAAoB;CA+B5B"} \ No newline at end of file diff --git a/lib/Transport.js b/lib/Transport.js index e810cc19ee..d40a596083 100644 --- a/lib/Transport.js +++ b/lib/Transport.js @@ -328,18 +328,30 @@ class Transport extends EnhancedEventEmitter_1.EnhancedEventEmitter { return consumer; } /** - * Create a DataProducer that uses SCTP. + * Create a DataProducer. */ - async produceSctpData({ id = undefined, sctpStreamParameters, label = '', protocol = '', appData = {} }) { - logger.debug('produceSctpData()'); + async produceData({ id = undefined, sctpStreamParameters, label = '', protocol = '', appData = {} }) { + logger.debug('produceData()'); if (id && this._dataProducers.has(id)) throw new TypeError(`a DataProducer with same id "${id}" already exists`); else if (appData && typeof appData !== 'object') throw new TypeError('if given, appData must be an object'); - // This may throw. - ortc.validateSctpStreamParameters(sctpStreamParameters); + // If this is not a DirectTransport, sctpStreamParameters are required. + if (this.constructor.name !== 'DirectTransport') { + // This may throw. + ortc.validateSctpStreamParameters(sctpStreamParameters); + } + // If this is a DirectTransport, sctpStreamParameters must not be given. + else if (sctpStreamParameters) { + throw new TypeError('cannot create a DataProducer of type SCTP in this Transport'); + } const internal = { ...this._internal, dataProducerId: id || uuid_1.v4() }; - const reqData = { sctpStreamParameters, label, protocol }; + const reqData = { + type: 'sctp', + sctpStreamParameters, + label, + protocol + }; const data = await this._channel.request('transport.produceData', internal, reqData); const dataProducer = new DataProducer_1.DataProducer({ internal, @@ -358,17 +370,12 @@ class Transport extends EnhancedEventEmitter_1.EnhancedEventEmitter { return dataProducer; } /** - * DEPRECATED: Use produceSctpData(). + * Create a DataConsumer. */ - async produceData(options) { - logger.warn('produceData() is DEPRECATED, use produceSctpData()'); - return this.produceSctpData(options); - } - /** - * Create a DataConsumer that uses SCTP. - */ - async consumeSctpData({ dataProducerId, appData = {} }) { - logger.debug('consumeSctpData()'); + async consumeData({ dataProducerId, appData = {} + // TODO + }) { + logger.debug('consumeData()'); if (!dataProducerId || typeof dataProducerId !== 'string') throw new TypeError('missing dataProducerId'); else if (appData && typeof appData !== 'object') @@ -383,7 +390,12 @@ class Transport extends EnhancedEventEmitter_1.EnhancedEventEmitter { this._sctpStreamIds[sctpStreamId] = 1; sctpStreamParameters.streamId = sctpStreamId; const internal = { ...this._internal, dataConsumerId: uuid_1.v4(), dataProducerId }; - const reqData = { sctpStreamParameters, label, protocol }; + const reqData = { + type: 'sctp', + sctpStreamParameters, + label, + protocol + }; const data = await this._channel.request('transport.consumeData', internal, reqData); const dataConsumer = new DataConsumer_1.DataConsumer({ internal, @@ -404,13 +416,6 @@ class Transport extends EnhancedEventEmitter_1.EnhancedEventEmitter { this._observer.safeEmit('newdataconsumer', dataConsumer); return dataConsumer; } - /** - * DEPRECATED: Use consumeSctpData(). - */ - async consumeData(options) { - logger.warn('consumeData() is DEPRECATED, use consumeSctpData()'); - return this.consumeSctpData(options); - } /** * Enable 'trace' event. */ diff --git a/src/DataConsumer.ts b/src/DataConsumer.ts index 81d2bb061c..d736a5518b 100644 --- a/src/DataConsumer.ts +++ b/src/DataConsumer.ts @@ -1,6 +1,7 @@ import { Logger } from './Logger'; import { EnhancedEventEmitter } from './EnhancedEventEmitter'; import { Channel } from './Channel'; +import { PayloadChannel } from './PayloadChannel'; import { SctpStreamParameters } from './SctpParameters'; export type DataConsumerOptions = @@ -26,6 +27,11 @@ export type DataConsumerStat = bytesSent: number; } +/** + * DataConsumer type. + */ +export type DataConsumerType = 'sctp' | 'direct'; + const logger = new Logger('DataConsumer'); export class DataConsumer extends EnhancedEventEmitter @@ -42,6 +48,7 @@ export class DataConsumer extends EnhancedEventEmitter // DataConsumer data. private readonly _data: { + type: DataConsumerType; sctpStreamParameters: SctpStreamParameters; label: string; protocol: string; @@ -50,6 +57,9 @@ export class DataConsumer extends EnhancedEventEmitter // Channel instance. private readonly _channel: Channel; + // PayloadChannel instance. + private readonly _payloadChannel?: PayloadChannel; + // Closed flag. private _closed = false; @@ -71,12 +81,14 @@ export class DataConsumer extends EnhancedEventEmitter internal, data, channel, + payloadChannel, appData }: { internal: any; data: any; channel: Channel; + payloadChannel?: PayloadChannel; appData: any; } ) @@ -88,6 +100,7 @@ export class DataConsumer extends EnhancedEventEmitter this._internal = internal; this._data = data; this._channel = channel; + this._payloadChannel = payloadChannel; this._appData = appData; this._handleWorkerNotifications(); @@ -117,10 +130,18 @@ export class DataConsumer extends EnhancedEventEmitter return this._closed; } + /** + * DataConsumer type. + */ + get type(): DataConsumerType + { + return this._data.type; + } + /** * SCTP stream parameters. */ - get sctpStreamParameters(): SctpStreamParameters + get sctpStreamParameters(): SctpStreamParameters | undefined { return this._data.sctpStreamParameters; } @@ -265,5 +286,35 @@ export class DataConsumer extends EnhancedEventEmitter } } }); + + if (this._payloadChannel) + { + this._payloadChannel.on( + this._internal.dataConsumerId, (event: string, data?: any) => + { + switch (event) + { + case 'message': + { + if (this._closed) + break; + + const { message, ppid } = data as { + message: Buffer; + ppid: number; + }; + + this.safeEmit('message', message, ppid); + + break; + } + + default: + { + logger.error('ignoring unknown event "%s"', event); + } + } + }); + } } } diff --git a/src/DataProducer.ts b/src/DataProducer.ts index 70ed697c13..79a3eff9da 100644 --- a/src/DataProducer.ts +++ b/src/DataProducer.ts @@ -1,6 +1,8 @@ import { Logger } from './Logger'; import { EnhancedEventEmitter } from './EnhancedEventEmitter'; +import { UnsupportedError } from './errors'; import { Channel } from './Channel'; +import { PayloadChannel } from './PayloadChannel'; import { SctpStreamParameters } from './SctpParameters'; export type DataProducerOptions = @@ -12,8 +14,9 @@ export type DataProducerOptions = /** * SCTP parameters defining how the endpoint is sending the data. + * Just if messages are sent over SCTP. */ - sctpStreamParameters: SctpStreamParameters; + sctpStreamParameters?: SctpStreamParameters; /** * A label which can be used to distinguish this DataChannel from others. @@ -41,6 +44,11 @@ export type DataProducerStat = bytesReceived: number; } +/** + * DataProducer type. + */ +export type DataProducerType = 'sctp' | 'direct'; + const logger = new Logger('DataProducer'); export class DataProducer extends EnhancedEventEmitter @@ -56,6 +64,7 @@ export class DataProducer extends EnhancedEventEmitter // DataProducer data. private readonly _data: { + type: DataProducerType; sctpStreamParameters: SctpStreamParameters; label: string; protocol: string; @@ -64,6 +73,9 @@ export class DataProducer extends EnhancedEventEmitter // Channel instance. private readonly _channel: Channel; + // PayloadChannel instance. + private readonly _payloadChannel?: PayloadChannel; + // Closed flag. private _closed = false; @@ -83,12 +95,14 @@ export class DataProducer extends EnhancedEventEmitter internal, data, channel, + payloadChannel, appData }: { internal: any; data: any; channel: Channel; + payloadChannel?: PayloadChannel; appData: any; } ) @@ -100,6 +114,7 @@ export class DataProducer extends EnhancedEventEmitter this._internal = internal; this._data = data; this._channel = channel; + this._payloadChannel = payloadChannel; this._appData = appData; this._handleWorkerNotifications(); @@ -121,6 +136,14 @@ export class DataProducer extends EnhancedEventEmitter return this._closed; } + /** + * DataProducer type. + */ + get type(): DataProducerType + { + return this._data.type; + } + /** * SCTP stream parameters. */ @@ -235,6 +258,53 @@ export class DataProducer extends EnhancedEventEmitter return this._channel.request('dataProducer.getStats', this._internal); } + /** + * Send data (just valid for DataProducers created on a DirectTransport). + */ + send(message: string | Buffer, ppid?: number): void + { + logger.debug('send()'); + + if (!this._payloadChannel) + { + throw new UnsupportedError('send() not supported for this DataProducer'); + } + + /* + * +-------------------------------+----------+ + * | Value | SCTP | + * | | PPID | + * +-------------------------------+----------+ + * | WebRTC String | 51 | + * | WebRTC Binary Partial | 52 | + * | (Deprecated) | | + * | WebRTC Binary | 53 | + * | WebRTC String Partial | 54 | + * | (Deprecated) | | + * | WebRTC String Empty | 56 | + * | WebRTC Binary Empty | 57 | + * +-------------------------------+----------+ + */ + + if (typeof ppid !== 'number') + { + ppid = (typeof message === 'string') + ? message.length > 0 ? 51 : 56 + : message.length > 0 ? 53 : 57; + } + + // Ensure we honor PPIDs. + if (ppid === 56) + message = ' '; + else if (ppid === 57) + message = Buffer.alloc(1); + + const notifData = { ppid }; + + this._payloadChannel.notify( + 'dataProducer.send', this._internal, notifData, message); + } + private _handleWorkerNotifications(): void { // No need to subscribe to any event. diff --git a/src/DirectTransport.ts b/src/DirectTransport.ts index 9c03627201..392267406b 100644 --- a/src/DirectTransport.ts +++ b/src/DirectTransport.ts @@ -1,28 +1,16 @@ import { Logger } from './Logger'; import { EnhancedEventEmitter } from './EnhancedEventEmitter'; import { UnsupportedError } from './errors'; -import { Transport, TransportTraceEventData, SctpState } from './Transport'; +import { Transport, TransportTraceEventData } from './Transport'; import { Producer, ProducerOptions } from './Producer'; import { Consumer, ConsumerOptions } from './Consumer'; -import { SctpParameters, NumSctpStreams } from './SctpParameters'; export type DirectTransportOptions = { /** - * Create a SCTP association. Default true. + * Maximum allowed size for messages. Default 262144. */ - enableSctp?: boolean; - - /** - * SCTP streams number. - */ - numSctpStreams?: NumSctpStreams; - - /** - * Maximum size of data that can be passed to DataProducer's send() method. - * Default 262144. - */ - maxSctpMessageSize?: number; + maxMessageSize?: number; /** * Custom application data. @@ -36,7 +24,6 @@ export type DirectTransportStat = type: string; transportId: string; timestamp: number; - sctpState?: SctpState; bytesReceived: number; recvBitrate: number; bytesSent: number; @@ -65,13 +52,11 @@ export class DirectTransport extends Transport // DirectTransport data. protected readonly _data: { - sctpParameters?: SctpParameters; - sctpState?: SctpState; + // TODO }; /** * @private - * @emits sctpstatechange - (sctpState: SctpState) * @emits trace - (trace: TransportTraceEventData) */ constructor(params: any) @@ -82,31 +67,15 @@ export class DirectTransport extends Transport const { data } = params; - this._data = - { - sctpParameters : data.sctpParameters, - sctpState : data.sctpState - }; + // TODO + this._data = data; + // { + // + // }; this._handleWorkerNotifications(); } - /** - * SCTP parameters. - */ - get sctpParameters(): SctpParameters | undefined - { - return this._data.sctpParameters; - } - - /** - * SCTP state. - */ - get sctpState(): SctpState | undefined - { - return this._data.sctpState; - } - /** * Observer. * @@ -114,7 +83,6 @@ export class DirectTransport extends Transport * @emits close * @emits newdataproducer - (dataProducer: DataProducer) * @emits newdataconsumer - (dataProducer: DataProducer) - * @emits sctpstatechange - (sctpState: SctpState) * @emits trace - (trace: TransportTraceEventData) */ get observer(): EnhancedEventEmitter @@ -132,9 +100,6 @@ export class DirectTransport extends Transport if (this._closed) return; - if (this._data.sctpState) - this._data.sctpState = 'closed'; - super.close(); } @@ -149,9 +114,6 @@ export class DirectTransport extends Transport if (this._closed) return; - if (this._data.sctpState) - this._data.sctpState = 'closed'; - super.routerClosed(); } @@ -211,20 +173,6 @@ export class DirectTransport extends Transport { switch (event) { - case 'sctpstatechange': - { - const sctpState = data.sctpState as SctpState; - - this._data.sctpState = sctpState; - - this.safeEmit('sctpstatechange', sctpState); - - // Emit observer event. - this._observer.safeEmit('sctpstatechange', sctpState); - - break; - } - case 'trace': { const trace = data as TransportTraceEventData; diff --git a/src/PayloadChannel.ts b/src/PayloadChannel.ts index 11b0afd679..bece5123b5 100644 --- a/src/PayloadChannel.ts +++ b/src/PayloadChannel.ts @@ -163,14 +163,14 @@ export class PayloadChannel extends EnhancedEventEmitter /** * @private */ - send( + notify( event: string, internal: object, data: any | undefined, payload: string | Buffer ): void { - logger.debug('send() [event:%s]', event); + logger.debug('notify() [event:%s]', event); if (this._closed) throw new InvalidStateError('PayloadChannel closed'); @@ -191,7 +191,7 @@ export class PayloadChannel extends EnhancedEventEmitter } catch (error) { - logger.warn('send() | sending notification failed: %s', String(error)); + logger.warn('notify() | sending notification failed: %s', String(error)); return; } @@ -203,7 +203,7 @@ export class PayloadChannel extends EnhancedEventEmitter } catch (error) { - logger.warn('send() | sending payload failed: %s', String(error)); + logger.warn('notify() | sending payload failed: %s', String(error)); return; } diff --git a/src/Router.ts b/src/Router.ts index 23f2248c6b..effe13fd91 100644 --- a/src/Router.ts +++ b/src/Router.ts @@ -389,8 +389,7 @@ export class Router extends EnhancedEventEmitter enableSctp, numSctpStreams, maxSctpMessageSize, - isDataChannel : true, - useRealSctp : true + isDataChannel : true }; const data = @@ -479,7 +478,6 @@ export class Router extends EnhancedEventEmitter numSctpStreams, maxSctpMessageSize, isDataChannel : false, - useRealSctp : true, enableSrtp, srtpCryptoSuite }; @@ -579,7 +577,6 @@ export class Router extends EnhancedEventEmitter numSctpStreams, maxSctpMessageSize, isDataChannel : false, - useRealSctp : true, enableRtx, enableSrtp }; @@ -625,9 +622,7 @@ export class Router extends EnhancedEventEmitter */ async createDirectTransport( { - enableSctp = true, - numSctpStreams = { OS: 65535, MIS: 65535 }, - maxSctpMessageSize = 262144, + maxMessageSize = 262144, appData = {} }: DirectTransportOptions ): Promise @@ -635,13 +630,7 @@ export class Router extends EnhancedEventEmitter logger.debug('createDirectTransport()'); const internal = { ...this._internal, transportId: uuidv4() }; - const reqData = { - enableSctp, - numSctpStreams, - maxSctpMessageSize, - isDataChannel : false, - useRealSctp : false - }; + const reqData = { maxMessageSize }; const data = await this._channel.request('router.createDirectTransport', internal, reqData); diff --git a/src/Transport.ts b/src/Transport.ts index f0f70b71bd..bad7b5cf24 100644 --- a/src/Transport.ts +++ b/src/Transport.ts @@ -7,8 +7,16 @@ import { Channel } from './Channel'; import { PayloadChannel } from './PayloadChannel'; import { Producer, ProducerOptions } from './Producer'; import { Consumer, ConsumerOptions } from './Consumer'; -import { DataProducer, DataProducerOptions } from './DataProducer'; -import { DataConsumer, DataConsumerOptions } from './DataConsumer'; +import { + DataProducer, + DataProducerOptions, + DataProducerType +} from './DataProducer'; +import { + DataConsumer, + DataConsumerOptions, + DataConsumerType +} from './DataConsumer'; import { RtpCapabilities } from './RtpParameters'; import { SctpParameters, SctpStreamParameters } from './SctpParameters'; @@ -585,9 +593,9 @@ export class Transport extends EnhancedEventEmitter } /** - * Create a DataProducer that uses SCTP. + * Create a DataProducer. */ - async produceSctpData( + async produceData( { id = undefined, sctpStreamParameters, @@ -597,18 +605,34 @@ export class Transport extends EnhancedEventEmitter }: DataProducerOptions ): Promise { - logger.debug('produceSctpData()'); + logger.debug('produceData()'); if (id && this._dataProducers.has(id)) throw new TypeError(`a DataProducer with same id "${id}" already exists`); else if (appData && typeof appData !== 'object') throw new TypeError('if given, appData must be an object'); - // This may throw. - ortc.validateSctpStreamParameters(sctpStreamParameters); + // If this is not a DirectTransport, sctpStreamParameters are required. + if (this.constructor.name !== 'DirectTransport') + { + // This may throw. + ortc.validateSctpStreamParameters(sctpStreamParameters); + } + // If this is a DirectTransport, sctpStreamParameters must not be given. + else if (sctpStreamParameters) + { + throw new TypeError( + 'cannot create a DataProducer of type SCTP in this Transport'); + } const internal = { ...this._internal, dataProducerId: id || uuidv4() }; - const reqData = { sctpStreamParameters, label, protocol }; + const reqData = + { + type : 'sctp' as DataProducerType, + sctpStreamParameters, + label, + protocol + }; const data = await this._channel.request('transport.produceData', internal, reqData); @@ -637,27 +661,17 @@ export class Transport extends EnhancedEventEmitter } /** - * DEPRECATED: Use produceSctpData(). + * Create a DataConsumer. */ - async produceData(options: DataProducerOptions): Promise - { - logger.warn( - 'produceData() is DEPRECATED, use produceSctpData()'); - - return this.produceSctpData(options); - } - - /** - * Create a DataConsumer that uses SCTP. - */ - async consumeSctpData( + async consumeData( { dataProducerId, appData = {} + // TODO }: DataConsumerOptions ): Promise { - logger.debug('consumeSctpData()'); + logger.debug('consumeData()'); if (!dataProducerId || typeof dataProducerId !== 'string') throw new TypeError('missing dataProducerId'); @@ -681,7 +695,13 @@ export class Transport extends EnhancedEventEmitter sctpStreamParameters.streamId = sctpStreamId; const internal = { ...this._internal, dataConsumerId: uuidv4(), dataProducerId }; - const reqData = { sctpStreamParameters, label, protocol }; + const reqData = + { + type : 'sctp' as DataConsumerType, + sctpStreamParameters, + label, + protocol + }; const data = await this._channel.request('transport.consumeData', internal, reqData); @@ -714,17 +734,6 @@ export class Transport extends EnhancedEventEmitter return dataConsumer; } - /** - * DEPRECATED: Use consumeSctpData(). - */ - async consumeData(options: DataConsumerOptions): Promise - { - logger.warn( - 'consumeData() is DEPRECATED, use consumeSctpData()'); - - return this.consumeSctpData(options); - } - /** * Enable 'trace' event. */ diff --git a/test/test-DataConsumer.js b/test/test-DataConsumer.js index 4e7925bbea..82fc2bbe74 100644 --- a/test/test-DataConsumer.js +++ b/test/test-DataConsumer.js @@ -59,6 +59,7 @@ test('transport.consumeData() succeeds', async () => expect(dataConsumer.id).toBeType('string'); expect(dataConsumer.dataProducerId).toBe(dataProducer.id); expect(dataConsumer.closed).toBe(false); + expect(dataConsumer.type).toBe('sctp'); expect(dataConsumer.sctpStreamParameters).toBeType('object'); expect(dataConsumer.sctpStreamParameters.streamId).toBeType('number'); expect(dataConsumer.sctpStreamParameters.ordered).toBe(false); @@ -92,6 +93,7 @@ test('dataConsumer.dump() succeeds', async () => expect(data.id).toBe(dataConsumer.id); expect(data.dataProducerId).toBe(dataConsumer.dataProducerId); + expect(data.type).toBe('sctp'); expect(data.sctpStreamParameters).toBeType('object'); expect(data.sctpStreamParameters.streamId) .toBe(dataConsumer.sctpStreamParameters.streamId); diff --git a/test/test-DataProducer.js b/test/test-DataProducer.js index fc1794e5bf..cd7b827651 100644 --- a/test/test-DataProducer.js +++ b/test/test-DataProducer.js @@ -50,6 +50,7 @@ test('transport1.produceData() succeeds', async () => expect(onObserverNewDataProducer).toHaveBeenCalledWith(dataProducer1); expect(dataProducer1.id).toBeType('string'); expect(dataProducer1.closed).toBe(false); + expect(dataProducer1.type).toBe('sctp'); expect(dataProducer1.sctpStreamParameters).toBeType('object'); expect(dataProducer1.sctpStreamParameters.streamId).toBe(666); expect(dataProducer1.sctpStreamParameters.ordered).toBe(true); @@ -99,6 +100,7 @@ test('transport2.produceData() succeeds', async () => expect(onObserverNewDataProducer).toHaveBeenCalledWith(dataProducer2); expect(dataProducer2.id).toBeType('string'); expect(dataProducer2.closed).toBe(false); + expect(dataProducer2.type).toBe('sctp'); expect(dataProducer2.sctpStreamParameters).toBeType('object'); expect(dataProducer2.sctpStreamParameters.streamId).toBe(777); expect(dataProducer2.sctpStreamParameters.ordered).toBe(false); @@ -176,6 +178,7 @@ test('dataProducer.dump() succeeds', async () => data = await dataProducer1.dump(); expect(data.id).toBe(dataProducer1.id); + expect(data.type).toBe('sctp'); expect(data.sctpStreamParameters).toBeType('object'); expect(data.sctpStreamParameters.streamId).toBe(666); expect(data.sctpStreamParameters.ordered).toBe(true); @@ -187,6 +190,7 @@ test('dataProducer.dump() succeeds', async () => data = await dataProducer2.dump(); expect(data.id).toBe(dataProducer2.id); + expect(data.type).toBe('sctp'); expect(data.sctpStreamParameters).toBeType('object'); expect(data.sctpStreamParameters.streamId).toBe(777); expect(data.sctpStreamParameters.ordered).toBe(false); diff --git a/test/test-PipeTransport.js b/test/test-PipeTransport.js index ddd8a80e6c..a43ac74412 100644 --- a/test/test-PipeTransport.js +++ b/test/test-PipeTransport.js @@ -806,6 +806,7 @@ test('router.pipeToRouter() succeeds with data', async () => expect(pipeDataConsumer.id).toBeType('string'); expect(pipeDataConsumer.closed).toBe(false); + expect(pipeDataConsumer.type).toBe('sctp'); expect(pipeDataConsumer.sctpStreamParameters).toBeType('object'); expect(pipeDataConsumer.sctpStreamParameters.streamId).toBeType('number'); expect(pipeDataConsumer.sctpStreamParameters.ordered).toBe(false); @@ -816,6 +817,7 @@ test('router.pipeToRouter() succeeds with data', async () => expect(pipeDataProducer.id).toBe(dataProducer.id); expect(pipeDataProducer.closed).toBe(false); + expect(pipeDataProducer.type).toBe('sctp'); expect(pipeDataProducer.sctpStreamParameters).toBeType('object'); expect(pipeDataProducer.sctpStreamParameters.streamId).toBeType('number'); expect(pipeDataProducer.sctpStreamParameters.ordered).toBe(false); @@ -834,6 +836,7 @@ test('transport.dataConsume() for a pipe DataProducer succeeds', async () => expect(dataConsumer.id).toBeType('string'); expect(dataConsumer.closed).toBe(false); + expect(dataConsumer.type).toBe('sctp'); expect(dataConsumer.sctpStreamParameters).toBeType('object'); expect(dataConsumer.sctpStreamParameters.streamId).toBeType('number'); expect(dataConsumer.sctpStreamParameters.ordered).toBe(false); diff --git a/test/test-PlainTransport.js b/test/test-PlainTransport.js index 5625bccd56..b5f5d10242 100644 --- a/test/test-PlainTransport.js +++ b/test/test-PlainTransport.js @@ -103,6 +103,7 @@ test('router.createPlainTransport() succeeds', async () => const data1 = await transport1.dump(); expect(data1.id).toBe(transport1.id); + expect(data1.direct).toBe(false); expect(data1.producerIds).toEqual([]); expect(data1.consumerIds).toEqual([]); expect(data1.tuple).toEqual(transport1.tuple); @@ -142,6 +143,7 @@ test('router.createPlainTransport() succeeds', async () => const data2 = await transport2.dump(); expect(data2.id).toBe(transport2.id); + expect(data2.direct).toBe(false); expect(data2.tuple).toEqual(transport2.tuple); expect(data2.rtcpTuple).toEqual(transport2.rtcpTuple); expect(data2.sctpState).toBeUndefined(); diff --git a/test/test-WebRtcTransport.js b/test/test-WebRtcTransport.js index 5c16358fca..c37fba1a48 100644 --- a/test/test-WebRtcTransport.js +++ b/test/test-WebRtcTransport.js @@ -151,6 +151,7 @@ test('router.createWebRtcTransport() succeeds', async () => const data1 = await transport1.dump(); expect(data1.id).toBe(transport1.id); + expect(data1.direct).toBe(false); expect(data1.producerIds).toEqual([]); expect(data1.consumerIds).toEqual([]); expect(data1.iceRole).toBe(transport1.iceRole); diff --git a/tsconfig.json b/tsconfig.json index c792578208..353725ec72 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -2,7 +2,7 @@ "compileOnSave": true, "compilerOptions": { - "lib": [ "es6", "dom" ], + "lib": [ "es6" ], "target": "es2020", "module": "commonjs", "moduleResolution": "node", diff --git a/worker/include/RTC/DataConsumer.hpp b/worker/include/RTC/DataConsumer.hpp index 7d91c68058..e820827835 100644 --- a/worker/include/RTC/DataConsumer.hpp +++ b/worker/include/RTC/DataConsumer.hpp @@ -15,11 +15,18 @@ namespace RTC class Listener { public: - virtual void OnDataConsumerSendSctpMessage( + virtual void OnDataConsumerSendMessage( RTC::DataConsumer* dataConsumer, uint32_t ppid, const uint8_t* msg, size_t len) = 0; virtual void OnDataConsumerDataProducerClosed(RTC::DataConsumer* dataConsumer) = 0; }; + public: + enum class Type : uint8_t + { + SCTP = 0, + DIRECT + }; + public: DataConsumer( const std::string& id, @@ -33,6 +40,10 @@ namespace RTC void FillJson(json& jsonObject) const; void FillJsonStats(json& jsonArray) const; void HandleRequest(Channel::Request* request); + Type GetType() const + { + return this->type; + } const RTC::SctpStreamParameters& GetSctpStreamParameters() const { return this->sctpStreamParameters; @@ -42,7 +53,7 @@ namespace RTC // clang-format off return ( this->transportConnected && - this->sctpAssociationConnected && + (this->type == DataConsumer::Type::DIRECT || this->sctpAssociationConnected) && !this->dataProducerClosed ); // clang-format on @@ -52,7 +63,7 @@ namespace RTC void SctpAssociationConnected(); void SctpAssociationClosed(); void DataProducerClosed(); - void SendSctpMessage(uint32_t ppid, const uint8_t* msg, size_t len); + void SendMessage(uint32_t ppid, const uint8_t* msg, size_t len); public: // Passed by argument. @@ -64,6 +75,8 @@ namespace RTC RTC::DataConsumer::Listener* listener{ nullptr }; size_t maxSctpMessageSize{ 0u }; // Others. + Type type; + std::string typeString; RTC::SctpStreamParameters sctpStreamParameters; std::string label; std::string protocol; diff --git a/worker/include/RTC/DataProducer.hpp b/worker/include/RTC/DataProducer.hpp index 560229f24f..a22b06a525 100644 --- a/worker/include/RTC/DataProducer.hpp +++ b/worker/include/RTC/DataProducer.hpp @@ -15,10 +15,17 @@ namespace RTC class Listener { public: - virtual void OnDataProducerSctpMessageReceived( + virtual void OnDataProducerMessageReceived( RTC::DataProducer* dataProducer, uint32_t ppid, const uint8_t* msg, size_t len) = 0; }; + public: + enum class Type : uint8_t + { + SCTP = 0, + DIRECT + }; + public: DataProducer(const std::string& id, RTC::DataProducer::Listener* listener, json& data); virtual ~DataProducer(); @@ -27,6 +34,10 @@ namespace RTC void FillJson(json& jsonObject) const; void FillJsonStats(json& jsonArray) const; void HandleRequest(Channel::Request* request); + Type GetType() const + { + return this->type; + } const RTC::SctpStreamParameters& GetSctpStreamParameters() const { return this->sctpStreamParameters; @@ -41,6 +52,8 @@ namespace RTC // Passed by argument. RTC::DataProducer::Listener* listener{ nullptr }; // Others. + Type type; + std::string typeString; RTC::SctpStreamParameters sctpStreamParameters; std::string label; std::string protocol; diff --git a/worker/include/RTC/Router.hpp b/worker/include/RTC/Router.hpp index 231332670f..fd1a94e0d1 100644 --- a/worker/include/RTC/Router.hpp +++ b/worker/include/RTC/Router.hpp @@ -71,7 +71,7 @@ namespace RTC RTC::Transport* transport, RTC::Consumer* consumer, uint32_t mappedSsrc) override; void OnTransportNewDataProducer(RTC::Transport* transport, RTC::DataProducer* dataProducer) override; void OnTransportDataProducerClosed(RTC::Transport* transport, RTC::DataProducer* dataProducer) override; - void OnTransportDataProducerSctpMessageReceived( + void OnTransportDataProducerMessageReceived( RTC::Transport* transport, RTC::DataProducer* dataProducer, uint32_t ppid, diff --git a/worker/include/RTC/Transport.hpp b/worker/include/RTC/Transport.hpp index 6044b16ba4..6ee3d6c8da 100644 --- a/worker/include/RTC/Transport.hpp +++ b/worker/include/RTC/Transport.hpp @@ -86,7 +86,7 @@ namespace RTC RTC::Transport* transport, RTC::DataProducer* dataProducer) = 0; virtual void OnTransportDataProducerClosed( RTC::Transport* transport, RTC::DataProducer* dataProducer) = 0; - virtual void OnTransportDataProducerSctpMessageReceived( + virtual void OnTransportDataProducerMessageReceived( RTC::Transport* transport, RTC::DataProducer* dataProducer, uint32_t ppid, @@ -185,12 +185,12 @@ namespace RTC /* Pure virtual methods inherited from RTC::DataProducer::Listener. */ public: - void OnDataProducerSctpMessageReceived( + void OnDataProducerMessageReceived( RTC::DataProducer* dataProducer, uint32_t ppid, const uint8_t* msg, size_t len) override; /* Pure virtual methods inherited from RTC::DataConsumer::Listener. */ public: - void OnDataConsumerSendSctpMessage( + void OnDataConsumerSendMessage( RTC::DataConsumer* dataConsumer, uint32_t ppid, const uint8_t* msg, size_t len) override; void OnDataConsumerDataProducerClosed(RTC::DataConsumer* dataConsumer) override; @@ -259,6 +259,7 @@ namespace RTC RTC::SenderBandwidthEstimator* senderBwe{ nullptr }; #endif // Others. + bool direct{ false }; // Whether this Transport allows PayloadChannel comm. bool destroying{ false }; struct RTC::RtpHeaderExtensionIds recvRtpHeaderExtensionIds; RTC::RtpListener rtpListener; diff --git a/worker/src/RTC/DataConsumer.cpp b/worker/src/RTC/DataConsumer.cpp index 8111694dab..3a8bcf8ea4 100644 --- a/worker/src/RTC/DataConsumer.cpp +++ b/worker/src/RTC/DataConsumer.cpp @@ -22,17 +22,38 @@ namespace RTC { MS_TRACE(); + auto jsonTypeIt = data.find("type"); auto jsonSctpStreamParametersIt = data.find("sctpStreamParameters"); auto jsonLabelIt = data.find("label"); auto jsonProtocolIt = data.find("protocol"); - if (jsonSctpStreamParametersIt == data.end() || !jsonSctpStreamParametersIt->is_object()) + if (jsonTypeIt == data.end() || !jsonTypeIt->is_string()) + MS_THROW_TYPE_ERROR("missing type"); + + this->typeString = jsonTypeIt->get(); + + if (this->typeString == "sctp") + this->type = DataConsumer::Type::SCTP; + else if (this->typeString == "direct") + this->type = DataConsumer::Type::DIRECT; + else + MS_THROW_TYPE_ERROR("invalid type"); + + if (this->type == DataConsumer::Type::SCTP) { - MS_THROW_TYPE_ERROR("missing sctpStreamParameters"); - } + // clang-format off + if ( + jsonSctpStreamParametersIt == data.end() || + !jsonSctpStreamParametersIt->is_object() + ) + // clang-format on + { + MS_THROW_TYPE_ERROR("missing sctpStreamParameters"); + } - // This may throw. - this->sctpStreamParameters = RTC::SctpStreamParameters(*jsonSctpStreamParametersIt); + // This may throw. + this->sctpStreamParameters = RTC::SctpStreamParameters(*jsonSctpStreamParametersIt); + } if (jsonLabelIt != data.end() && jsonLabelIt->is_string()) this->label = jsonLabelIt->get(); @@ -53,11 +74,17 @@ namespace RTC // Add id. jsonObject["id"] = this->id; + // Add type. + jsonObject["type"] = this->typeString; + // Add dataProducerId. jsonObject["dataProducerId"] = this->dataProducerId; // Add sctpStreamParameters. - this->sctpStreamParameters.FillJson(jsonObject["sctpStreamParameters"]); + if (this->type == DataConsumer::Type::SCTP) + { + this->sctpStreamParameters.FillJson(jsonObject["sctpStreamParameters"]); + } // Add label. jsonObject["label"] = this->label; @@ -178,7 +205,7 @@ namespace RTC this->listener->OnDataConsumerDataProducerClosed(this); } - void DataConsumer::SendSctpMessage(uint32_t ppid, const uint8_t* msg, size_t len) + void DataConsumer::SendMessage(uint32_t ppid, const uint8_t* msg, size_t len) { MS_TRACE(); @@ -199,6 +226,6 @@ namespace RTC this->messagesSent++; this->bytesSent += len; - this->listener->OnDataConsumerSendSctpMessage(this, ppid, msg, len); + this->listener->OnDataConsumerSendMessage(this, ppid, msg, len); } } // namespace RTC diff --git a/worker/src/RTC/DataProducer.cpp b/worker/src/RTC/DataProducer.cpp index 1cdb32cce7..6afd144eef 100644 --- a/worker/src/RTC/DataProducer.cpp +++ b/worker/src/RTC/DataProducer.cpp @@ -15,17 +15,38 @@ namespace RTC { MS_TRACE(); + auto jsonTypeIt = data.find("type"); auto jsonSctpStreamParametersIt = data.find("sctpStreamParameters"); auto jsonLabelIt = data.find("label"); auto jsonProtocolIt = data.find("protocol"); - if (jsonSctpStreamParametersIt == data.end() || !jsonSctpStreamParametersIt->is_object()) + if (jsonTypeIt == data.end() || !jsonTypeIt->is_string()) + MS_THROW_TYPE_ERROR("missing type"); + + this->typeString = jsonTypeIt->get(); + + if (this->typeString == "sctp") + this->type = DataProducer::Type::SCTP; + else if (this->typeString == "direct") + this->type = DataProducer::Type::DIRECT; + else + MS_THROW_TYPE_ERROR("invalid type"); + + if (this->type == DataProducer::Type::SCTP) { - MS_THROW_TYPE_ERROR("missing sctpStreamParameters"); - } + // clang-format off + if ( + jsonSctpStreamParametersIt == data.end() || + !jsonSctpStreamParametersIt->is_object() + ) + // clang-format on + { + MS_THROW_TYPE_ERROR("missing sctpStreamParameters"); + } - // This may throw. - this->sctpStreamParameters = RTC::SctpStreamParameters(*jsonSctpStreamParametersIt); + // This may throw. + this->sctpStreamParameters = RTC::SctpStreamParameters(*jsonSctpStreamParametersIt); + } if (jsonLabelIt != data.end() && jsonLabelIt->is_string()) this->label = jsonLabelIt->get(); @@ -46,8 +67,14 @@ namespace RTC // Add id. jsonObject["id"] = this->id; + // Add type. + jsonObject["type"] = this->typeString; + // Add sctpStreamParameters. - this->sctpStreamParameters.FillJson(jsonObject["sctpStreamParameters"]); + if (this->type == DataProducer::Type::SCTP) + { + this->sctpStreamParameters.FillJson(jsonObject["sctpStreamParameters"]); + } // Add label. jsonObject["label"] = this->label; @@ -124,6 +151,6 @@ namespace RTC this->messagesReceived++; this->bytesReceived += len; - this->listener->OnDataProducerSctpMessageReceived(this, ppid, msg, len); + this->listener->OnDataProducerMessageReceived(this, ppid, msg, len); } } // namespace RTC diff --git a/worker/src/RTC/Router.cpp b/worker/src/RTC/Router.cpp index 0445fb1fac..fbb15dee1a 100644 --- a/worker/src/RTC/Router.cpp +++ b/worker/src/RTC/Router.cpp @@ -830,7 +830,7 @@ namespace RTC this->mapDataProducerDataConsumers.erase(mapDataProducerDataConsumersIt); } - inline void Router::OnTransportDataProducerSctpMessageReceived( + inline void Router::OnTransportDataProducerMessageReceived( RTC::Transport* /*transport*/, RTC::DataProducer* dataProducer, uint32_t ppid, @@ -843,7 +843,7 @@ namespace RTC for (auto* consumer : dataConsumers) { - consumer->SendSctpMessage(ppid, msg, len); + consumer->SendMessage(ppid, msg, len); } } diff --git a/worker/src/RTC/Transport.cpp b/worker/src/RTC/Transport.cpp index af05cdaf67..211dbdab3a 100644 --- a/worker/src/RTC/Transport.cpp +++ b/worker/src/RTC/Transport.cpp @@ -34,6 +34,19 @@ namespace RTC { MS_TRACE(); + auto jsonDirectIt = data.find("direct"); + + // clang-format off + if ( + jsonDirectIt != data.end() && + jsonDirectIt->is_boolean() && + jsonDirectIt->get() + ) + // clang-format on + { + this->direct = true; + } + auto jsonInitialAvailableOutgoingBitrateIt = data.find("initialAvailableOutgoingBitrate"); if (jsonInitialAvailableOutgoingBitrateIt != data.end()) @@ -54,6 +67,9 @@ namespace RTC ) // clang-format on { + if (this->direct) + MS_THROW_TYPE_ERROR("cannot enable SCTP in a DirectTransport"); + auto jsonNumSctpStreamsIt = data.find("numSctpStreams"); auto jsonMaxSctpMessageSizeIt = data.find("maxSctpMessageSize"); auto jsonIsDataChannelIt = data.find("isDataChannel"); @@ -254,6 +270,9 @@ namespace RTC // Add id. jsonObject["id"] = this->id; + // Add direct. + jsonObject["direct"] = this->direct; + // Add producerIds. jsonObject["producerIds"] = json::array(); auto jsonProducerIdsIt = jsonObject.find("producerIds"); @@ -947,7 +966,7 @@ namespace RTC case Channel::Request::MethodId::TRANSPORT_PRODUCE_DATA: { - if (!this->sctpAssociation) + if (!this->sctpAssociation && !this->direct) MS_THROW_ERROR("SCTP not enabled"); std::string dataProducerId; @@ -1002,7 +1021,7 @@ namespace RTC case Channel::Request::MethodId::TRANSPORT_CONSUME_DATA: { - if (!this->sctpAssociation) + if (!this->sctpAssociation && !this->direct) MS_THROW_ERROR("SCTP not enabled"); auto jsonDataProducerIdIt = request->internal.find("dataProducerId"); @@ -1022,9 +1041,7 @@ namespace RTC dataProducerId, this, request->data, - this->sctpAssociation->GetMaxSctpMessageSize()); - - // TODO: Above line will throw because this->sctpAssocition does not exist. + this->sctpAssociation ? this->sctpAssociation->GetMaxSctpMessageSize() : 0u); // Notify the listener. // This may throw if no DataProducer is found. @@ -1053,14 +1070,17 @@ namespace RTC request->Accept(data); - if (IsConnected()) - dataConsumer->TransportConnected(); + if (this->sctpAssociation) + { + if (IsConnected()) + dataConsumer->TransportConnected(); - if (this->sctpAssociation->GetState() == RTC::SctpAssociation::SctpState::CONNECTED) - dataConsumer->SctpAssociationConnected(); + if (this->sctpAssociation->GetState() == RTC::SctpAssociation::SctpState::CONNECTED) + dataConsumer->SctpAssociationConnected(); - // Tell to the SCTP association. - this->sctpAssociation->HandleDataConsumer(dataConsumer); + // Tell to the SCTP association. + this->sctpAssociation->HandleDataConsumer(dataConsumer); + } break; } @@ -1202,8 +1222,11 @@ namespace RTC MS_DEBUG_DEV("DataProducer closed [dataProducerId:%s]", dataProducer->id.c_str()); - // Tell the SctpAssociation so it can reset the SCTP stream. - this->sctpAssociation->DataProducerClosed(dataProducer); + if (this->sctpAssociation) + { + // Tell the SctpAssociation so it can reset the SCTP stream. + this->sctpAssociation->DataProducerClosed(dataProducer); + } // Delete it. delete dataProducer; @@ -1226,8 +1249,11 @@ namespace RTC MS_DEBUG_DEV("DataConsumer closed [dataConsumerId:%s]", dataConsumer->id.c_str()); - // Tell the SctpAssociation so it can reset the SCTP stream. - this->sctpAssociation->DataConsumerClosed(dataConsumer); + if (this->sctpAssociation) + { + // Tell the SctpAssociation so it can reset the SCTP stream. + this->sctpAssociation->DataConsumerClosed(dataConsumer); + } // Delete it. delete dataConsumer; @@ -1278,12 +1304,15 @@ namespace RTC consumer->TransportConnected(); } - // Tell all DataConsumers. - for (auto& kv : this->mapDataConsumers) + // Tell all DataConsumers of SCTP type. + if (this->sctpAssociation) { - auto* dataConsumer = kv.second; + for (auto& kv : this->mapDataConsumers) + { + auto* dataConsumer = kv.second; - dataConsumer->TransportConnected(); + dataConsumer->TransportConnected(); + } } // Tell the SctpAssociation. @@ -2415,19 +2444,21 @@ namespace RTC ComputeOutgoingDesiredBitrate(/*forceBitrate*/ true); } - inline void Transport::OnDataProducerSctpMessageReceived( + inline void Transport::OnDataProducerMessageReceived( RTC::DataProducer* dataProducer, uint32_t ppid, const uint8_t* msg, size_t len) { MS_TRACE(); - this->listener->OnTransportDataProducerSctpMessageReceived(this, dataProducer, ppid, msg, len); + this->listener->OnTransportDataProducerMessageReceived(this, dataProducer, ppid, msg, len); } - inline void Transport::OnDataConsumerSendSctpMessage( + inline void Transport::OnDataConsumerSendMessage( RTC::DataConsumer* dataConsumer, uint32_t ppid, const uint8_t* msg, size_t len) { MS_TRACE(); + MS_ASSERT(this->sctpAssociation, "no SCTP association"); + this->sctpAssociation->SendSctpMessage(dataConsumer, ppid, msg, len); } @@ -2441,8 +2472,11 @@ namespace RTC // Notify the listener. this->listener->OnTransportDataConsumerDataProducerClosed(this, dataConsumer); - // Tell the SctpAssociation so it can reset the SCTP stream. - this->sctpAssociation->DataConsumerClosed(dataConsumer); + if (this->sctpAssociation) + { + // Tell the SctpAssociation so it can reset the SCTP stream. + this->sctpAssociation->DataConsumerClosed(dataConsumer); + } // Delete it. delete dataConsumer; From 0eca1ca7d3c28499fd0ad22536cf437fbc50da0a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?I=C3=B1aki=20Baz=20Castillo?= Date: Thu, 28 May 2020 19:58:22 +0200 Subject: [PATCH 10/23] more --- TODO_DATACHANNEL_TERMINATION.md | 8 ++++ lib/DataConsumer.d.ts | 21 ++++++++++ lib/DataConsumer.d.ts.map | 2 +- lib/SctpParameters.d.ts.map | 2 +- lib/Transport.d.ts | 2 +- lib/Transport.d.ts.map | 2 +- lib/Transport.js | 52 ++++++++++++++++++------ src/DataConsumer.ts | 24 +++++++++++ src/SctpParameters.ts | 1 + src/Transport.ts | 72 +++++++++++++++++++++++++++------ 10 files changed, 157 insertions(+), 29 deletions(-) diff --git a/TODO_DATACHANNEL_TERMINATION.md b/TODO_DATACHANNEL_TERMINATION.md index 10a610b710..847c1fa5fc 100644 --- a/TODO_DATACHANNEL_TERMINATION.md +++ b/TODO_DATACHANNEL_TERMINATION.md @@ -12,3 +12,11 @@ - `DirectTransport.cpp` must set `this->direct = true` and call `Transport::Connected()` in its constructor. +- `transport.consumeData()` (when in SCTP) now accepts optional arguments: + +```ts +ordered?: boolean; +maxPacketLifeTime?: number; +maxRetransmits?: number; +``` + diff --git a/lib/DataConsumer.d.ts b/lib/DataConsumer.d.ts index 0ce202e0e6..4dd4dbe032 100644 --- a/lib/DataConsumer.d.ts +++ b/lib/DataConsumer.d.ts @@ -7,6 +7,27 @@ export declare type DataConsumerOptions = { * The id of the DataProducer to consume. */ dataProducerId: string; + /** + * Just if consuming over SCTP. + * Whether data messages must be received in order. If true the messages will + * be sent reliably. Defaults to the value in the DataProducer if it has type + * 'sctp' or to true if it has type 'direct'. + */ + ordered?: boolean; + /** + * Just if consuming over SCTP. + * When ordered is false indicates the time (in milliseconds) after which a + * SCTP packet will stop being retransmitted. Defaults to the value in the + * DataProducer if it has type 'sctp' or unset if it has type 'direct'. + */ + maxPacketLifeTime?: number; + /** + * Just if consuming over SCTP. + * When ordered is false indicates the maximum number of times a packet will + * be retransmitted. Defaults to the value in the DataProducer if it has type + * 'sctp' or unset if it has type 'direct'. + */ + maxRetransmits?: number; /** * Custom application data. */ diff --git a/lib/DataConsumer.d.ts.map b/lib/DataConsumer.d.ts.map index 890fa0d427..044b1f679f 100644 --- a/lib/DataConsumer.d.ts.map +++ b/lib/DataConsumer.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"DataConsumer.d.ts","sourceRoot":"","sources":["../src/DataConsumer.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAExD,oBAAY,mBAAmB,GAC/B;IACC;;OAEG;IACH,cAAc,EAAE,MAAM,CAAC;IAEvB;;OAEG;IACH,OAAO,CAAC,EAAE,GAAG,CAAC;CACd,CAAA;AAED,oBAAY,gBAAgB,GAC5B;IACC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;CAClB,CAAA;AAED;;GAEG;AACH,oBAAY,gBAAgB,GAAG,MAAM,GAAG,QAAQ,CAAC;AAIjD,qBAAa,YAAa,SAAQ,oBAAoB;IAGrD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAMxB;IAGF,OAAO,CAAC,QAAQ,CAAC,KAAK,CAMpB;IAGF,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAU;IAGnC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAiB;IAGlD,OAAO,CAAC,OAAO,CAAS;IAGxB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAM;IAGhC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA8B;IAExD;;;;;;OAMG;gBAEF,EACC,QAAQ,EACR,IAAI,EACJ,OAAO,EACP,cAAc,EACd,OAAO,EACP,EACD;QACC,QAAQ,EAAE,GAAG,CAAC;QACd,IAAI,EAAE,GAAG,CAAC;QACV,OAAO,EAAE,OAAO,CAAC;QACjB,cAAc,CAAC,EAAE,cAAc,CAAC;QAChC,OAAO,EAAE,GAAG,CAAC;KACb;IAgBF;;OAEG;IACH,IAAI,EAAE,IAAI,MAAM,CAGf;IAED;;OAEG;IACH,IAAI,cAAc,IAAI,MAAM,CAG3B;IAED;;OAEG;IACH,IAAI,MAAM,IAAI,OAAO,CAGpB;IAED;;OAEG;IACH,IAAI,IAAI,IAAI,gBAAgB,CAG3B;IAED;;OAEG;IACH,IAAI,oBAAoB,IAAI,oBAAoB,GAAG,SAAS,CAG3D;IAED;;OAEG;IACH,IAAI,KAAK,IAAI,MAAM,CAGlB;IAED;;OAEG;IACH,IAAI,QAAQ,IAAI,MAAM,CAGrB;IAED;;OAEG;IACH,IAAI,OAAO,IAAI,GAAG,CAGjB;IAED;;OAEG;IACH,IAAI,OAAO,CAAC,OAAO,EAAE,GAAG,EAGvB;IAED;;;;OAIG;IACH,IAAI,QAAQ,IAAI,oBAAoB,CAGnC;IAED;;OAEG;IACH,KAAK,IAAI,IAAI;IAqBb;;;;OAIG;IACH,eAAe,IAAI,IAAI;IAkBvB;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC;IAO1B;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAO7C,OAAO,CAAC,0BAA0B;CA8DlC"} \ No newline at end of file +{"version":3,"file":"DataConsumer.d.ts","sourceRoot":"","sources":["../src/DataConsumer.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAExD,oBAAY,mBAAmB,GAC/B;IACC;;OAEG;IACH,cAAc,EAAE,MAAM,CAAC;IAEvB;;;;;OAKG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAElB;;;;;OAKG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAE3B;;;;;OAKG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB;;OAEG;IACH,OAAO,CAAC,EAAE,GAAG,CAAC;CACd,CAAA;AAED,oBAAY,gBAAgB,GAC5B;IACC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;CAClB,CAAA;AAED;;GAEG;AACH,oBAAY,gBAAgB,GAAG,MAAM,GAAG,QAAQ,CAAC;AAIjD,qBAAa,YAAa,SAAQ,oBAAoB;IAGrD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAMxB;IAGF,OAAO,CAAC,QAAQ,CAAC,KAAK,CAMpB;IAGF,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAU;IAGnC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAiB;IAGlD,OAAO,CAAC,OAAO,CAAS;IAGxB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAM;IAGhC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA8B;IAExD;;;;;;OAMG;gBAEF,EACC,QAAQ,EACR,IAAI,EACJ,OAAO,EACP,cAAc,EACd,OAAO,EACP,EACD;QACC,QAAQ,EAAE,GAAG,CAAC;QACd,IAAI,EAAE,GAAG,CAAC;QACV,OAAO,EAAE,OAAO,CAAC;QACjB,cAAc,CAAC,EAAE,cAAc,CAAC;QAChC,OAAO,EAAE,GAAG,CAAC;KACb;IAgBF;;OAEG;IACH,IAAI,EAAE,IAAI,MAAM,CAGf;IAED;;OAEG;IACH,IAAI,cAAc,IAAI,MAAM,CAG3B;IAED;;OAEG;IACH,IAAI,MAAM,IAAI,OAAO,CAGpB;IAED;;OAEG;IACH,IAAI,IAAI,IAAI,gBAAgB,CAG3B;IAED;;OAEG;IACH,IAAI,oBAAoB,IAAI,oBAAoB,GAAG,SAAS,CAG3D;IAED;;OAEG;IACH,IAAI,KAAK,IAAI,MAAM,CAGlB;IAED;;OAEG;IACH,IAAI,QAAQ,IAAI,MAAM,CAGrB;IAED;;OAEG;IACH,IAAI,OAAO,IAAI,GAAG,CAGjB;IAED;;OAEG;IACH,IAAI,OAAO,CAAC,OAAO,EAAE,GAAG,EAGvB;IAED;;;;OAIG;IACH,IAAI,QAAQ,IAAI,oBAAoB,CAGnC;IAED;;OAEG;IACH,KAAK,IAAI,IAAI;IAqBb;;;;OAIG;IACH,eAAe,IAAI,IAAI;IAkBvB;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC;IAO1B;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAO7C,OAAO,CAAC,0BAA0B;CA8DlC"} \ No newline at end of file diff --git a/lib/SctpParameters.d.ts.map b/lib/SctpParameters.d.ts.map index 9c3a005a4b..6cf2430f29 100644 --- a/lib/SctpParameters.d.ts.map +++ b/lib/SctpParameters.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"SctpParameters.d.ts","sourceRoot":"","sources":["../src/SctpParameters.ts"],"names":[],"mappings":"AAAA,oBAAY,gBAAgB,GAC5B;IACE,UAAU,EAAE,cAAc,CAAC;CAC5B,CAAA;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,oBAAY,cAAc,GAC1B;IACC;;OAEG;IACH,EAAE,EAAE,MAAM,CAAC;IAEX;;OAEG;IACH,GAAG,EAAE,MAAM,CAAC;CACZ,CAAA;AAED,oBAAY,cAAc,GAC1B;IACC;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;IAEb;;OAEG;IACH,EAAE,EAAE,MAAM,CAAC;IAEX;;OAEG;IACH,GAAG,EAAE,MAAM,CAAC;IAEZ;;OAEG;IACH,cAAc,EAAE,MAAM,CAAC;CACvB,CAAA;AAED;;;;;;GAMG;AACH,oBAAY,oBAAoB,GAChC;IACC;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAC;IACjB;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAElB;;;OAGG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAE3B;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;CACxB,CAAA"} \ No newline at end of file +{"version":3,"file":"SctpParameters.d.ts","sourceRoot":"","sources":["../src/SctpParameters.ts"],"names":[],"mappings":"AAAA,oBAAY,gBAAgB,GAC5B;IACE,UAAU,EAAE,cAAc,CAAC;CAC5B,CAAA;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,oBAAY,cAAc,GAC1B;IACC;;OAEG;IACH,EAAE,EAAE,MAAM,CAAC;IAEX;;OAEG;IACH,GAAG,EAAE,MAAM,CAAC;CACZ,CAAA;AAED,oBAAY,cAAc,GAC1B;IACC;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;IAEb;;OAEG;IACH,EAAE,EAAE,MAAM,CAAC;IAEX;;OAEG;IACH,GAAG,EAAE,MAAM,CAAC;IAEZ;;OAEG;IACH,cAAc,EAAE,MAAM,CAAC;CACvB,CAAA;AAED;;;;;;GAMG;AACH,oBAAY,oBAAoB,GAChC;IACC;;OAEG;IACH,QAAQ,EAAE,MAAM,CAAC;IAEjB;;;OAGG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAElB;;;OAGG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAE3B;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;CACxB,CAAA"} \ No newline at end of file diff --git a/lib/Transport.d.ts b/lib/Transport.d.ts index e44ee37b27..87f91dd04d 100644 --- a/lib/Transport.d.ts +++ b/lib/Transport.d.ts @@ -174,7 +174,7 @@ export declare class Transport extends EnhancedEventEmitter { /** * Create a DataConsumer. */ - consumeData({ dataProducerId, appData }: DataConsumerOptions): Promise; + consumeData({ dataProducerId, ordered, maxPacketLifeTime, maxRetransmits, appData }: DataConsumerOptions): Promise; /** * Enable 'trace' event. */ diff --git a/lib/Transport.d.ts.map b/lib/Transport.d.ts.map index 89d3f48fa0..72e0d2fe43 100644 --- a/lib/Transport.d.ts.map +++ b/lib/Transport.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"Transport.d.ts","sourceRoot":"","sources":["../src/Transport.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"Transport.d.ts","sourceRoot":"","sources":["../src/Transport.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/lib/Transport.js b/lib/Transport.js index d40a596083..524457b94d 100644 --- a/lib/Transport.js +++ b/lib/Transport.js @@ -336,18 +336,23 @@ class Transport extends EnhancedEventEmitter_1.EnhancedEventEmitter { throw new TypeError(`a DataProducer with same id "${id}" already exists`); else if (appData && typeof appData !== 'object') throw new TypeError('if given, appData must be an object'); + let type; // If this is not a DirectTransport, sctpStreamParameters are required. if (this.constructor.name !== 'DirectTransport') { + type = 'sctp'; // This may throw. ortc.validateSctpStreamParameters(sctpStreamParameters); } // If this is a DirectTransport, sctpStreamParameters must not be given. - else if (sctpStreamParameters) { - throw new TypeError('cannot create a DataProducer of type SCTP in this Transport'); + else { + type = 'direct'; + if (sctpStreamParameters) { + logger.warn('produceData() | sctpStreamParameters are ignored when producing data on a DirectTransport'); + } } const internal = { ...this._internal, dataProducerId: id || uuid_1.v4() }; const reqData = { - type: 'sctp', + type, sctpStreamParameters, label, protocol @@ -372,9 +377,7 @@ class Transport extends EnhancedEventEmitter_1.EnhancedEventEmitter { /** * Create a DataConsumer. */ - async consumeData({ dataProducerId, appData = {} - // TODO - }) { + async consumeData({ dataProducerId, ordered, maxPacketLifeTime, maxRetransmits, appData = {} }) { logger.debug('consumeData()'); if (!dataProducerId || typeof dataProducerId !== 'string') throw new TypeError('missing dataProducerId'); @@ -383,15 +386,40 @@ class Transport extends EnhancedEventEmitter_1.EnhancedEventEmitter { const dataProducer = this._getDataProducerById(dataProducerId); if (!dataProducer) throw Error(`DataProducer with id "${dataProducerId}" not found`); - const sctpStreamParameters = utils.clone(dataProducer.sctpStreamParameters); + let type; + let sctpStreamParameters; + let sctpStreamId; + // If this is not a DirectTransport, use sctpStreamParameters from the + // DataProducer (if type 'sctp') unless they are given in method parameters. + if (this.constructor.name !== 'DirectTransport') { + type = 'sctp'; + sctpStreamParameters = + utils.clone(dataProducer.sctpStreamParameters); + // Override if given. + if (ordered !== undefined) + sctpStreamParameters.ordered = ordered; + if (maxPacketLifeTime !== undefined) + sctpStreamParameters.maxPacketLifeTime = maxPacketLifeTime; + if (maxRetransmits !== undefined) + sctpStreamParameters.maxRetransmits = maxRetransmits; + // This may throw. + sctpStreamId = this._getNextSctpStreamId(); + this._sctpStreamIds[sctpStreamId] = 1; + sctpStreamParameters.streamId = sctpStreamId; + } + // If this is a DirectTransport, sctpStreamParameters must not be used. + else { + type = 'direct'; + if (ordered !== undefined || + maxPacketLifeTime !== undefined || + maxRetransmits !== undefined) { + logger.warn('consumeData() | ordered, maxPacketLifeTime and maxRetransmits are ignored when consuming data on a DirectTransport'); + } + } const { label, protocol } = dataProducer; - // This may throw. - const sctpStreamId = this._getNextSctpStreamId(); - this._sctpStreamIds[sctpStreamId] = 1; - sctpStreamParameters.streamId = sctpStreamId; const internal = { ...this._internal, dataConsumerId: uuid_1.v4(), dataProducerId }; const reqData = { - type: 'sctp', + type, sctpStreamParameters, label, protocol diff --git a/src/DataConsumer.ts b/src/DataConsumer.ts index d736a5518b..7f51ee26c1 100644 --- a/src/DataConsumer.ts +++ b/src/DataConsumer.ts @@ -11,6 +11,30 @@ export type DataConsumerOptions = */ dataProducerId: string; + /** + * Just if consuming over SCTP. + * Whether data messages must be received in order. If true the messages will + * be sent reliably. Defaults to the value in the DataProducer if it has type + * 'sctp' or to true if it has type 'direct'. + */ + ordered?: boolean; + + /** + * Just if consuming over SCTP. + * When ordered is false indicates the time (in milliseconds) after which a + * SCTP packet will stop being retransmitted. Defaults to the value in the + * DataProducer if it has type 'sctp' or unset if it has type 'direct'. + */ + maxPacketLifeTime?: number; + + /** + * Just if consuming over SCTP. + * When ordered is false indicates the maximum number of times a packet will + * be retransmitted. Defaults to the value in the DataProducer if it has type + * 'sctp' or unset if it has type 'direct'. + */ + maxRetransmits?: number; + /** * Custom application data. */ diff --git a/src/SctpParameters.ts b/src/SctpParameters.ts index 324f149702..d4ea870471 100644 --- a/src/SctpParameters.ts +++ b/src/SctpParameters.ts @@ -74,6 +74,7 @@ export type SctpStreamParameters = * SCTP stream id. */ streamId: number; + /** * Whether data messages must be received in order. If true the messages will * be sent reliably. Default true. diff --git a/src/Transport.ts b/src/Transport.ts index bad7b5cf24..d2a6217b0c 100644 --- a/src/Transport.ts +++ b/src/Transport.ts @@ -612,23 +612,32 @@ export class Transport extends EnhancedEventEmitter else if (appData && typeof appData !== 'object') throw new TypeError('if given, appData must be an object'); + let type: DataProducerType; + // If this is not a DirectTransport, sctpStreamParameters are required. if (this.constructor.name !== 'DirectTransport') { + type = 'sctp'; + // This may throw. ortc.validateSctpStreamParameters(sctpStreamParameters); } // If this is a DirectTransport, sctpStreamParameters must not be given. - else if (sctpStreamParameters) + else { - throw new TypeError( - 'cannot create a DataProducer of type SCTP in this Transport'); + type = 'direct'; + + if (sctpStreamParameters) + { + logger.warn( + 'produceData() | sctpStreamParameters are ignored when producing data on a DirectTransport'); + } } const internal = { ...this._internal, dataProducerId: id || uuidv4() }; const reqData = { - type : 'sctp' as DataProducerType, + type, sctpStreamParameters, label, protocol @@ -666,8 +675,10 @@ export class Transport extends EnhancedEventEmitter async consumeData( { dataProducerId, + ordered, + maxPacketLifeTime, + maxRetransmits, appData = {} - // TODO }: DataConsumerOptions ): Promise { @@ -683,21 +694,56 @@ export class Transport extends EnhancedEventEmitter if (!dataProducer) throw Error(`DataProducer with id "${dataProducerId}" not found`); - const sctpStreamParameters = - utils.clone(dataProducer.sctpStreamParameters) as SctpStreamParameters; + let type: DataConsumerType; + let sctpStreamParameters: SctpStreamParameters | undefined; + let sctpStreamId: number; - const { label, protocol } = dataProducer; + // If this is not a DirectTransport, use sctpStreamParameters from the + // DataProducer (if type 'sctp') unless they are given in method parameters. + if (this.constructor.name !== 'DirectTransport') + { + type = 'sctp'; + sctpStreamParameters = + utils.clone(dataProducer.sctpStreamParameters) as SctpStreamParameters; - // This may throw. - const sctpStreamId = this._getNextSctpStreamId(); + // Override if given. + if (ordered !== undefined) + sctpStreamParameters.ordered = ordered; + + if (maxPacketLifeTime !== undefined) + sctpStreamParameters.maxPacketLifeTime = maxPacketLifeTime; + + if (maxRetransmits !== undefined) + sctpStreamParameters.maxRetransmits = maxRetransmits; - this._sctpStreamIds[sctpStreamId] = 1; - sctpStreamParameters.streamId = sctpStreamId; + // This may throw. + sctpStreamId = this._getNextSctpStreamId(); + + this._sctpStreamIds[sctpStreamId] = 1; + sctpStreamParameters.streamId = sctpStreamId; + } + // If this is a DirectTransport, sctpStreamParameters must not be used. + else + { + type = 'direct'; + + if ( + ordered !== undefined || + maxPacketLifeTime !== undefined || + maxRetransmits !== undefined + ) + { + logger.warn( + 'consumeData() | ordered, maxPacketLifeTime and maxRetransmits are ignored when consuming data on a DirectTransport'); + } + } + + const { label, protocol } = dataProducer; const internal = { ...this._internal, dataConsumerId: uuidv4(), dataProducerId }; const reqData = { - type : 'sctp' as DataConsumerType, + type, sctpStreamParameters, label, protocol From cc3ffed1a777614c53cf7d929b6c5e67d8f76b08 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?I=C3=B1aki=20Baz=20Castillo?= Date: Thu, 28 May 2020 20:58:39 +0200 Subject: [PATCH 11/23] more more more --- TODO_DATACHANNEL_TERMINATION.md | 11 +- lib/DataConsumer.d.ts | 5 +- lib/DataConsumer.d.ts.map | 2 +- lib/DataConsumer.js | 33 +++--- lib/DataProducer.d.ts | 4 +- lib/DataProducer.d.ts.map | 2 +- lib/DataProducer.js | 4 - lib/Transport.d.ts.map | 2 +- lib/Transport.js | 2 + src/DataConsumer.ts | 52 ++++----- src/DataProducer.ts | 10 +- src/Transport.ts | 6 +- worker/include/RTC/DataProducer.hpp | 2 +- worker/include/RTC/PipeTransport.hpp | 1 + worker/include/RTC/PlainTransport.hpp | 1 + worker/include/RTC/Router.hpp | 12 ++- worker/include/RTC/Transport.hpp | 20 ++-- worker/include/RTC/WebRtcTransport.hpp | 1 + worker/include/Worker.hpp | 5 +- worker/src/RTC/DataProducer.cpp | 3 +- worker/src/RTC/PipeTransport.cpp | 8 ++ worker/src/RTC/PlainTransport.cpp | 8 ++ worker/src/RTC/Router.cpp | 76 +++++++------ worker/src/RTC/Transport.cpp | 143 ++++++++++++++++--------- worker/src/RTC/WebRtcTransport.cpp | 8 ++ worker/src/Worker.cpp | 27 +++-- 26 files changed, 266 insertions(+), 182 deletions(-) diff --git a/TODO_DATACHANNEL_TERMINATION.md b/TODO_DATACHANNEL_TERMINATION.md index 847c1fa5fc..66d7f24726 100644 --- a/TODO_DATACHANNEL_TERMINATION.md +++ b/TODO_DATACHANNEL_TERMINATION.md @@ -2,15 +2,13 @@ - Set proper max size for `netstring` messages in `PayloadChannel` (in JS and C++). It must match `maxSctpMessageSize` in `DataTransport.ts`. -- In `Transport.cpp` how to deal with `this->useRealSctp` and `this->sctpAssociation` for stats/dump and so on? - -- En `DataProducerOptions` now `sctpStreamParameters` are optional. +- `sctpStreamParameters` are now optional in `DataProducerOptions`. - `sctpStreamParameters` getter can now return `undefined` in `DataProducer/Consumer`. - Added `dataProducer/Consumer.type`: 'sctp' | 'direct'. -- `DirectTransport.cpp` must set `this->direct = true` and call `Transport::Connected()` in its constructor. +- `DirectTransport.cpp` must call `Transport::Connected()` in its constructor. - `transport.consumeData()` (when in SCTP) now accepts optional arguments: @@ -20,3 +18,8 @@ maxPacketLifeTime?: number; maxRetransmits?: number; ``` +- How to increment bytes counter in `Transport` when `DATA_PRODUCER_SEND`? Ok, it must be done in `Transport::HandleNotification()`. It must verify the notification fields and call `DataReceived()`. + + DONE + +- Same for `DataSent()` when notifying a `message` to a direct `DataConsumer`. + diff --git a/lib/DataConsumer.d.ts b/lib/DataConsumer.d.ts index 4dd4dbe032..01add14de6 100644 --- a/lib/DataConsumer.d.ts +++ b/lib/DataConsumer.d.ts @@ -49,7 +49,7 @@ export declare class DataConsumer extends EnhancedEventEmitter { private readonly _internal; private readonly _data; private readonly _channel; - private readonly _payloadChannel?; + private readonly _payloadChannel; private _closed; private readonly _appData?; private readonly _observer; @@ -57,6 +57,7 @@ export declare class DataConsumer extends EnhancedEventEmitter { * @private * @emits transportclose * @emits dataproducerclose + * @emits message - (message: string | Buffer, ppid: number) * @emits @close * @emits @dataproducerclose */ @@ -64,7 +65,7 @@ export declare class DataConsumer extends EnhancedEventEmitter { internal: any; data: any; channel: Channel; - payloadChannel?: PayloadChannel; + payloadChannel: PayloadChannel; appData: any; }); /** diff --git a/lib/DataConsumer.d.ts.map b/lib/DataConsumer.d.ts.map index 044b1f679f..feba69b0c6 100644 --- a/lib/DataConsumer.d.ts.map +++ b/lib/DataConsumer.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"DataConsumer.d.ts","sourceRoot":"","sources":["../src/DataConsumer.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAExD,oBAAY,mBAAmB,GAC/B;IACC;;OAEG;IACH,cAAc,EAAE,MAAM,CAAC;IAEvB;;;;;OAKG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAElB;;;;;OAKG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAE3B;;;;;OAKG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB;;OAEG;IACH,OAAO,CAAC,EAAE,GAAG,CAAC;CACd,CAAA;AAED,oBAAY,gBAAgB,GAC5B;IACC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;CAClB,CAAA;AAED;;GAEG;AACH,oBAAY,gBAAgB,GAAG,MAAM,GAAG,QAAQ,CAAC;AAIjD,qBAAa,YAAa,SAAQ,oBAAoB;IAGrD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAMxB;IAGF,OAAO,CAAC,QAAQ,CAAC,KAAK,CAMpB;IAGF,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAU;IAGnC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAiB;IAGlD,OAAO,CAAC,OAAO,CAAS;IAGxB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAM;IAGhC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA8B;IAExD;;;;;;OAMG;gBAEF,EACC,QAAQ,EACR,IAAI,EACJ,OAAO,EACP,cAAc,EACd,OAAO,EACP,EACD;QACC,QAAQ,EAAE,GAAG,CAAC;QACd,IAAI,EAAE,GAAG,CAAC;QACV,OAAO,EAAE,OAAO,CAAC;QACjB,cAAc,CAAC,EAAE,cAAc,CAAC;QAChC,OAAO,EAAE,GAAG,CAAC;KACb;IAgBF;;OAEG;IACH,IAAI,EAAE,IAAI,MAAM,CAGf;IAED;;OAEG;IACH,IAAI,cAAc,IAAI,MAAM,CAG3B;IAED;;OAEG;IACH,IAAI,MAAM,IAAI,OAAO,CAGpB;IAED;;OAEG;IACH,IAAI,IAAI,IAAI,gBAAgB,CAG3B;IAED;;OAEG;IACH,IAAI,oBAAoB,IAAI,oBAAoB,GAAG,SAAS,CAG3D;IAED;;OAEG;IACH,IAAI,KAAK,IAAI,MAAM,CAGlB;IAED;;OAEG;IACH,IAAI,QAAQ,IAAI,MAAM,CAGrB;IAED;;OAEG;IACH,IAAI,OAAO,IAAI,GAAG,CAGjB;IAED;;OAEG;IACH,IAAI,OAAO,CAAC,OAAO,EAAE,GAAG,EAGvB;IAED;;;;OAIG;IACH,IAAI,QAAQ,IAAI,oBAAoB,CAGnC;IAED;;OAEG;IACH,KAAK,IAAI,IAAI;IAqBb;;;;OAIG;IACH,eAAe,IAAI,IAAI;IAkBvB;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC;IAO1B;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAO7C,OAAO,CAAC,0BAA0B;CA8DlC"} \ No newline at end of file +{"version":3,"file":"DataConsumer.d.ts","sourceRoot":"","sources":["../src/DataConsumer.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAExD,oBAAY,mBAAmB,GAC/B;IACC;;OAEG;IACH,cAAc,EAAE,MAAM,CAAC;IAEvB;;;;;OAKG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAElB;;;;;OAKG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAE3B;;;;;OAKG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB;;OAEG;IACH,OAAO,CAAC,EAAE,GAAG,CAAC;CACd,CAAA;AAED,oBAAY,gBAAgB,GAC5B;IACC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;CAClB,CAAA;AAED;;GAEG;AACH,oBAAY,gBAAgB,GAAG,MAAM,GAAG,QAAQ,CAAC;AAIjD,qBAAa,YAAa,SAAQ,oBAAoB;IAGrD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAMxB;IAGF,OAAO,CAAC,QAAQ,CAAC,KAAK,CAMpB;IAGF,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAU;IAGnC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAiB;IAGjD,OAAO,CAAC,OAAO,CAAS;IAGxB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAM;IAGhC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA8B;IAExD;;;;;;;OAOG;gBAEF,EACC,QAAQ,EACR,IAAI,EACJ,OAAO,EACP,cAAc,EACd,OAAO,EACP,EACD;QACC,QAAQ,EAAE,GAAG,CAAC;QACd,IAAI,EAAE,GAAG,CAAC;QACV,OAAO,EAAE,OAAO,CAAC;QACjB,cAAc,EAAE,cAAc,CAAC;QAC/B,OAAO,EAAE,GAAG,CAAC;KACb;IAgBF;;OAEG;IACH,IAAI,EAAE,IAAI,MAAM,CAGf;IAED;;OAEG;IACH,IAAI,cAAc,IAAI,MAAM,CAG3B;IAED;;OAEG;IACH,IAAI,MAAM,IAAI,OAAO,CAGpB;IAED;;OAEG;IACH,IAAI,IAAI,IAAI,gBAAgB,CAG3B;IAED;;OAEG;IACH,IAAI,oBAAoB,IAAI,oBAAoB,GAAG,SAAS,CAG3D;IAED;;OAEG;IACH,IAAI,KAAK,IAAI,MAAM,CAGlB;IAED;;OAEG;IACH,IAAI,QAAQ,IAAI,MAAM,CAGrB;IAED;;OAEG;IACH,IAAI,OAAO,IAAI,GAAG,CAGjB;IAED;;OAEG;IACH,IAAI,OAAO,CAAC,OAAO,EAAE,GAAG,EAGvB;IAED;;;;OAIG;IACH,IAAI,QAAQ,IAAI,oBAAoB,CAGnC;IAED;;OAEG;IACH,KAAK,IAAI,IAAI;IAqBb;;;;OAIG;IACH,eAAe,IAAI,IAAI;IAkBvB;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC;IAO1B;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAO7C,OAAO,CAAC,0BAA0B;CAuDlC"} \ No newline at end of file diff --git a/lib/DataConsumer.js b/lib/DataConsumer.js index 80aa9296c6..5b66d92287 100644 --- a/lib/DataConsumer.js +++ b/lib/DataConsumer.js @@ -8,6 +8,7 @@ class DataConsumer extends EnhancedEventEmitter_1.EnhancedEventEmitter { * @private * @emits transportclose * @emits dataproducerclose + * @emits message - (message: string | Buffer, ppid: number) * @emits @close * @emits @dataproducerclose */ @@ -155,24 +156,22 @@ class DataConsumer extends EnhancedEventEmitter_1.EnhancedEventEmitter { } } }); - if (this._payloadChannel) { - this._payloadChannel.on(this._internal.dataConsumerId, (event, data) => { - switch (event) { - case 'message': - { - if (this._closed) - break; - const { message, ppid } = data; - this.safeEmit('message', message, ppid); + this._payloadChannel.on(this._internal.dataConsumerId, (event, data) => { + switch (event) { + case 'message': + { + if (this._closed) break; - } - default: - { - logger.error('ignoring unknown event "%s"', event); - } - } - }); - } + const { message, ppid } = data; + this.safeEmit('message', message, ppid); + break; + } + default: + { + logger.error('ignoring unknown event "%s"', event); + } + } + }); } } exports.DataConsumer = DataConsumer; diff --git a/lib/DataProducer.d.ts b/lib/DataProducer.d.ts index 8a2a64786c..1ec039eeb6 100644 --- a/lib/DataProducer.d.ts +++ b/lib/DataProducer.d.ts @@ -42,7 +42,7 @@ export declare class DataProducer extends EnhancedEventEmitter { private readonly _internal; private readonly _data; private readonly _channel; - private readonly _payloadChannel?; + private readonly _payloadChannel; private _closed; private readonly _appData?; private readonly _observer; @@ -55,7 +55,7 @@ export declare class DataProducer extends EnhancedEventEmitter { internal: any; data: any; channel: Channel; - payloadChannel?: PayloadChannel; + payloadChannel: PayloadChannel; appData: any; }); /** diff --git a/lib/DataProducer.d.ts.map b/lib/DataProducer.d.ts.map index 97f24ad210..3d8027a4ef 100644 --- a/lib/DataProducer.d.ts.map +++ b/lib/DataProducer.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"DataProducer.d.ts","sourceRoot":"","sources":["../src/DataProducer.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAE9D,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAExD,oBAAY,mBAAmB,GAC/B;IACC;;OAEG;IACH,EAAE,CAAC,EAAE,MAAM,CAAC;IAEZ;;;OAGG;IACH,oBAAoB,CAAC,EAAE,oBAAoB,CAAC;IAE5C;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;OAEG;IACH,OAAO,CAAC,EAAE,GAAG,CAAC;CACd,CAAA;AAED,oBAAY,gBAAgB,GAC5B;IACC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,EAAE,MAAM,CAAC;IACzB,aAAa,EAAE,MAAM,CAAC;CACtB,CAAA;AAED;;GAEG;AACH,oBAAY,gBAAgB,GAAG,MAAM,GAAG,QAAQ,CAAC;AAIjD,qBAAa,YAAa,SAAQ,oBAAoB;IAGrD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAKxB;IAGF,OAAO,CAAC,QAAQ,CAAC,KAAK,CAMpB;IAGF,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAU;IAGnC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAiB;IAGlD,OAAO,CAAC,OAAO,CAAS;IAGxB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAM;IAGhC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA8B;IAExD;;;;OAIG;gBAEF,EACC,QAAQ,EACR,IAAI,EACJ,OAAO,EACP,cAAc,EACd,OAAO,EACP,EACD;QACC,QAAQ,EAAE,GAAG,CAAC;QACd,IAAI,EAAE,GAAG,CAAC;QACV,OAAO,EAAE,OAAO,CAAC;QACjB,cAAc,CAAC,EAAE,cAAc,CAAC;QAChC,OAAO,EAAE,GAAG,CAAC;KACb;IAgBF;;OAEG;IACH,IAAI,EAAE,IAAI,MAAM,CAGf;IAED;;OAEG;IACH,IAAI,MAAM,IAAI,OAAO,CAGpB;IAED;;OAEG;IACH,IAAI,IAAI,IAAI,gBAAgB,CAG3B;IAED;;OAEG;IACH,IAAI,oBAAoB,IAAI,oBAAoB,CAG/C;IAED;;OAEG;IACH,IAAI,KAAK,IAAI,MAAM,CAGlB;IAED;;OAEG;IACH,IAAI,QAAQ,IAAI,MAAM,CAGrB;IAED;;OAEG;IACH,IAAI,OAAO,IAAI,GAAG,CAGjB;IAED;;OAEG;IACH,IAAI,OAAO,CAAC,OAAO,EAAE,GAAG,EAGvB;IAED;;;;OAIG;IACH,IAAI,QAAQ,IAAI,oBAAoB,CAGnC;IAED;;OAEG;IACH,KAAK,IAAI,IAAI;IAqBb;;;;OAIG;IACH,eAAe,IAAI,IAAI;IAevB;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC;IAO1B;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAO7C;;OAEG;IACH,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI;IA4CnD,OAAO,CAAC,0BAA0B;CAIlC"} \ No newline at end of file +{"version":3,"file":"DataProducer.d.ts","sourceRoot":"","sources":["../src/DataProducer.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAExD,oBAAY,mBAAmB,GAC/B;IACC;;OAEG;IACH,EAAE,CAAC,EAAE,MAAM,CAAC;IAEZ;;;OAGG;IACH,oBAAoB,CAAC,EAAE,oBAAoB,CAAC;IAE5C;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;OAEG;IACH,OAAO,CAAC,EAAE,GAAG,CAAC;CACd,CAAA;AAED,oBAAY,gBAAgB,GAC5B;IACC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,EAAE,MAAM,CAAC;IACzB,aAAa,EAAE,MAAM,CAAC;CACtB,CAAA;AAED;;GAEG;AACH,oBAAY,gBAAgB,GAAG,MAAM,GAAG,QAAQ,CAAC;AAIjD,qBAAa,YAAa,SAAQ,oBAAoB;IAGrD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAKxB;IAGF,OAAO,CAAC,QAAQ,CAAC,KAAK,CAMpB;IAGF,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAU;IAGnC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAiB;IAGjD,OAAO,CAAC,OAAO,CAAS;IAGxB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAM;IAGhC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA8B;IAExD;;;;OAIG;gBAEF,EACC,QAAQ,EACR,IAAI,EACJ,OAAO,EACP,cAAc,EACd,OAAO,EACP,EACD;QACC,QAAQ,EAAE,GAAG,CAAC;QACd,IAAI,EAAE,GAAG,CAAC;QACV,OAAO,EAAE,OAAO,CAAC;QACjB,cAAc,EAAE,cAAc,CAAC;QAC/B,OAAO,EAAE,GAAG,CAAC;KACb;IAgBF;;OAEG;IACH,IAAI,EAAE,IAAI,MAAM,CAGf;IAED;;OAEG;IACH,IAAI,MAAM,IAAI,OAAO,CAGpB;IAED;;OAEG;IACH,IAAI,IAAI,IAAI,gBAAgB,CAG3B;IAED;;OAEG;IACH,IAAI,oBAAoB,IAAI,oBAAoB,CAG/C;IAED;;OAEG;IACH,IAAI,KAAK,IAAI,MAAM,CAGlB;IAED;;OAEG;IACH,IAAI,QAAQ,IAAI,MAAM,CAGrB;IAED;;OAEG;IACH,IAAI,OAAO,IAAI,GAAG,CAGjB;IAED;;OAEG;IACH,IAAI,OAAO,CAAC,OAAO,EAAE,GAAG,EAGvB;IAED;;;;OAIG;IACH,IAAI,QAAQ,IAAI,oBAAoB,CAGnC;IAED;;OAEG;IACH,KAAK,IAAI,IAAI;IAqBb;;;;OAIG;IACH,eAAe,IAAI,IAAI;IAevB;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC;IAO1B;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAO7C;;OAEG;IACH,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI;IAuCnD,OAAO,CAAC,0BAA0B;CAIlC"} \ No newline at end of file diff --git a/lib/DataProducer.js b/lib/DataProducer.js index 25fded3b31..8dac37d558 100644 --- a/lib/DataProducer.js +++ b/lib/DataProducer.js @@ -2,7 +2,6 @@ Object.defineProperty(exports, "__esModule", { value: true }); const Logger_1 = require("./Logger"); const EnhancedEventEmitter_1 = require("./EnhancedEventEmitter"); -const errors_1 = require("./errors"); const logger = new Logger_1.Logger('DataProducer'); class DataProducer extends EnhancedEventEmitter_1.EnhancedEventEmitter { /** @@ -129,9 +128,6 @@ class DataProducer extends EnhancedEventEmitter_1.EnhancedEventEmitter { */ send(message, ppid) { logger.debug('send()'); - if (!this._payloadChannel) { - throw new errors_1.UnsupportedError('send() not supported for this DataProducer'); - } /* * +-------------------------------+----------+ * | Value | SCTP | diff --git a/lib/Transport.d.ts.map b/lib/Transport.d.ts.map index 72e0d2fe43..9b599c0bec 100644 --- a/lib/Transport.d.ts.map +++ b/lib/Transport.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"Transport.d.ts","sourceRoot":"","sources":["../src/Transport.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"Transport.d.ts","sourceRoot":"","sources":["../src/Transport.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/lib/Transport.js b/lib/Transport.js index 524457b94d..8dd4d6da8f 100644 --- a/lib/Transport.js +++ b/lib/Transport.js @@ -362,6 +362,7 @@ class Transport extends EnhancedEventEmitter_1.EnhancedEventEmitter { internal, data, channel: this._channel, + payloadChannel: this._payloadChannel, appData }); this._dataProducers.set(dataProducer.id, dataProducer); @@ -429,6 +430,7 @@ class Transport extends EnhancedEventEmitter_1.EnhancedEventEmitter { internal, data, channel: this._channel, + payloadChannel: this._payloadChannel, appData }); this._dataConsumers.set(dataConsumer.id, dataConsumer); diff --git a/src/DataConsumer.ts b/src/DataConsumer.ts index 7f51ee26c1..d93f113581 100644 --- a/src/DataConsumer.ts +++ b/src/DataConsumer.ts @@ -82,7 +82,7 @@ export class DataConsumer extends EnhancedEventEmitter private readonly _channel: Channel; // PayloadChannel instance. - private readonly _payloadChannel?: PayloadChannel; + private readonly _payloadChannel: PayloadChannel; // Closed flag. private _closed = false; @@ -97,6 +97,7 @@ export class DataConsumer extends EnhancedEventEmitter * @private * @emits transportclose * @emits dataproducerclose + * @emits message - (message: string | Buffer, ppid: number) * @emits @close * @emits @dataproducerclose */ @@ -112,7 +113,7 @@ export class DataConsumer extends EnhancedEventEmitter internal: any; data: any; channel: Channel; - payloadChannel?: PayloadChannel; + payloadChannel: PayloadChannel; appData: any; } ) @@ -311,34 +312,27 @@ export class DataConsumer extends EnhancedEventEmitter } }); - if (this._payloadChannel) + this._payloadChannel.on(this._internal.dataConsumerId, (event: string, data?: any) => { - this._payloadChannel.on( - this._internal.dataConsumerId, (event: string, data?: any) => + switch (event) + { + case 'message': { - switch (event) - { - case 'message': - { - if (this._closed) - break; - - const { message, ppid } = data as { - message: Buffer; - ppid: number; - }; - - this.safeEmit('message', message, ppid); - - break; - } - - default: - { - logger.error('ignoring unknown event "%s"', event); - } - } - }); - } + if (this._closed) + break; + + const { message, ppid } = data as { message: Buffer; ppid: number }; + + this.safeEmit('message', message, ppid); + + break; + } + + default: + { + logger.error('ignoring unknown event "%s"', event); + } + } + }); } } diff --git a/src/DataProducer.ts b/src/DataProducer.ts index 79a3eff9da..cddc20ec84 100644 --- a/src/DataProducer.ts +++ b/src/DataProducer.ts @@ -1,6 +1,5 @@ import { Logger } from './Logger'; import { EnhancedEventEmitter } from './EnhancedEventEmitter'; -import { UnsupportedError } from './errors'; import { Channel } from './Channel'; import { PayloadChannel } from './PayloadChannel'; import { SctpStreamParameters } from './SctpParameters'; @@ -74,7 +73,7 @@ export class DataProducer extends EnhancedEventEmitter private readonly _channel: Channel; // PayloadChannel instance. - private readonly _payloadChannel?: PayloadChannel; + private readonly _payloadChannel: PayloadChannel; // Closed flag. private _closed = false; @@ -102,7 +101,7 @@ export class DataProducer extends EnhancedEventEmitter internal: any; data: any; channel: Channel; - payloadChannel?: PayloadChannel; + payloadChannel: PayloadChannel; appData: any; } ) @@ -265,11 +264,6 @@ export class DataProducer extends EnhancedEventEmitter { logger.debug('send()'); - if (!this._payloadChannel) - { - throw new UnsupportedError('send() not supported for this DataProducer'); - } - /* * +-------------------------------+----------+ * | Value | SCTP | diff --git a/src/Transport.ts b/src/Transport.ts index d2a6217b0c..d2b0d3b683 100644 --- a/src/Transport.ts +++ b/src/Transport.ts @@ -650,7 +650,8 @@ export class Transport extends EnhancedEventEmitter { internal, data, - channel : this._channel, + channel : this._channel, + payloadChannel : this._payloadChannel, appData }); @@ -756,7 +757,8 @@ export class Transport extends EnhancedEventEmitter { internal, data, - channel : this._channel, + channel : this._channel, + payloadChannel : this._payloadChannel, appData }); diff --git a/worker/include/RTC/DataProducer.hpp b/worker/include/RTC/DataProducer.hpp index a22b06a525..1036f6dca1 100644 --- a/worker/include/RTC/DataProducer.hpp +++ b/worker/include/RTC/DataProducer.hpp @@ -42,7 +42,7 @@ namespace RTC { return this->sctpStreamParameters; } - void ReceiveSctpMessage(uint32_t ppid, const uint8_t* msg, size_t len); + void ReceiveMessage(uint32_t ppid, const uint8_t* msg, size_t len); public: // Passed by argument. diff --git a/worker/include/RTC/PipeTransport.hpp b/worker/include/RTC/PipeTransport.hpp index 4bb1a3870e..8d0d600823 100644 --- a/worker/include/RTC/PipeTransport.hpp +++ b/worker/include/RTC/PipeTransport.hpp @@ -30,6 +30,7 @@ namespace RTC void FillJson(json& jsonObject) const override; void FillJsonStats(json& jsonArray) override; void HandleRequest(Channel::Request* request) override; + void HandleNotification(PayloadChannel::Notification* notification) override; private: bool IsConnected() const override; diff --git a/worker/include/RTC/PlainTransport.hpp b/worker/include/RTC/PlainTransport.hpp index 888b5622b8..3e68f1732f 100644 --- a/worker/include/RTC/PlainTransport.hpp +++ b/worker/include/RTC/PlainTransport.hpp @@ -31,6 +31,7 @@ namespace RTC void FillJson(json& jsonObject) const override; void FillJsonStats(json& jsonArray) override; void HandleRequest(Channel::Request* request) override; + void HandleNotification(PayloadChannel::Notification* notification) override; private: bool IsConnected() const override; diff --git a/worker/include/RTC/Router.hpp b/worker/include/RTC/Router.hpp index fd1a94e0d1..cb7806ab97 100644 --- a/worker/include/RTC/Router.hpp +++ b/worker/include/RTC/Router.hpp @@ -3,6 +3,7 @@ #include "common.hpp" #include "Channel/Request.hpp" +#include "PayloadChannel/Notification.hpp" #include "RTC/Consumer.hpp" #include "RTC/DataConsumer.hpp" #include "RTC/DataProducer.hpp" @@ -29,13 +30,14 @@ namespace RTC public: void FillJson(json& jsonObject) const; void HandleRequest(Channel::Request* request); + void HandleNotification(PayloadChannel::Notification* notification); private: - void SetNewTransportIdFromRequest(Channel::Request* request, std::string& transportId) const; - RTC::Transport* GetTransportFromRequest(Channel::Request* request) const; - void SetNewRtpObserverIdFromRequest(Channel::Request* request, std::string& rtpObserverId) const; - RTC::RtpObserver* GetRtpObserverFromRequest(Channel::Request* request) const; - RTC::Producer* GetProducerFromRequest(Channel::Request* request) const; + void SetNewTransportIdFromInternal(json& internal, std::string& transportId) const; + RTC::Transport* GetTransportFromInternal(json& internal) const; + void SetNewRtpObserverIdFromInternal(json& internal, std::string& rtpObserverId) const; + RTC::RtpObserver* GetRtpObserverFromInternal(json& internal) const; + RTC::Producer* GetProducerFromInternal(json& internal) const; /* Pure virtual methods inherited from RTC::Transport::Listener. */ public: diff --git a/worker/include/RTC/Transport.hpp b/worker/include/RTC/Transport.hpp index 6ee3d6c8da..c7a37618a9 100644 --- a/worker/include/RTC/Transport.hpp +++ b/worker/include/RTC/Transport.hpp @@ -5,6 +5,7 @@ #include "common.hpp" #include "DepLibUV.hpp" #include "Channel/Request.hpp" +#include "PayloadChannel/Notification.hpp" #include "RTC/Consumer.hpp" #include "RTC/DataConsumer.hpp" #include "RTC/DataProducer.hpp" @@ -116,9 +117,10 @@ namespace RTC // Subclasses must also invoke the parent Close(). virtual void FillJson(json& jsonObject) const; virtual void FillJsonStats(json& jsonArray); - // Subclasses must implement this method and call the parent's one to + // Subclasses must implement these method and call the parent's one to // handle common requests. virtual void HandleRequest(Channel::Request* request); + virtual void HandleNotification(PayloadChannel::Notification* notification); protected: // Must be called from the subclass. @@ -137,16 +139,16 @@ namespace RTC void ReceiveSctpData(const uint8_t* data, size_t len); private: - void SetNewProducerIdFromRequest(Channel::Request* request, std::string& producerId) const; - RTC::Producer* GetProducerFromRequest(Channel::Request* request) const; - void SetNewConsumerIdFromRequest(Channel::Request* request, std::string& consumerId) const; - RTC::Consumer* GetConsumerFromRequest(Channel::Request* request) const; + void SetNewProducerIdFromInternal(json& internal, std::string& producerId) const; + RTC::Producer* GetProducerFromInternal(json& internal) const; + void SetNewConsumerIdFromInternal(json& internal, std::string& consumerId) const; + RTC::Consumer* GetConsumerFromInternal(json& internal) const; RTC::Consumer* GetConsumerByMediaSsrc(uint32_t ssrc) const; RTC::Consumer* GetConsumerByRtxSsrc(uint32_t ssrc) const; - void SetNewDataProducerIdFromRequest(Channel::Request* request, std::string& dataProducerId) const; - RTC::DataProducer* GetDataProducerFromRequest(Channel::Request* request) const; - void SetNewDataConsumerIdFromRequest(Channel::Request* request, std::string& dataConsumerId) const; - RTC::DataConsumer* GetDataConsumerFromRequest(Channel::Request* request) const; + void SetNewDataProducerIdFromInternal(json& internal, std::string& dataProducerId) const; + RTC::DataProducer* GetDataProducerFromInternal(json& internal) const; + void SetNewDataConsumerIdFromInternal(json& internal, std::string& dataConsumerId) const; + RTC::DataConsumer* GetDataConsumerFromInternal(json& internal) const; virtual bool IsConnected() const = 0; virtual void SendRtpPacket(RTC::RtpPacket* packet, onSendCallback* cb = nullptr) = 0; void HandleRtcpPacket(RTC::RTCP::Packet* packet); diff --git a/worker/include/RTC/WebRtcTransport.hpp b/worker/include/RTC/WebRtcTransport.hpp index f83af16ce7..a11ce6000d 100644 --- a/worker/include/RTC/WebRtcTransport.hpp +++ b/worker/include/RTC/WebRtcTransport.hpp @@ -37,6 +37,7 @@ namespace RTC void FillJson(json& jsonObject) const override; void FillJsonStats(json& jsonArray) override; void HandleRequest(Channel::Request* request) override; + void HandleNotification(PayloadChannel::Notification* notification) override; private: bool IsConnected() const override; diff --git a/worker/include/Worker.hpp b/worker/include/Worker.hpp index 936ba8cb50..3499499124 100644 --- a/worker/include/Worker.hpp +++ b/worker/include/Worker.hpp @@ -4,6 +4,7 @@ #include "common.hpp" #include "Channel/Request.hpp" #include "Channel/UnixStreamSocket.hpp" +#include "PayloadChannel/Notification.hpp" #include "PayloadChannel/UnixStreamSocket.hpp" #include "RTC/Router.hpp" #include "handles/SignalsHandler.hpp" @@ -25,8 +26,8 @@ class Worker : public Channel::UnixStreamSocket::Listener, void Close(); void FillJson(json& jsonObject) const; void FillJsonResourceUsage(json& jsonObject) const; - void SetNewRouterIdFromRequest(Channel::Request* request, std::string& routerId) const; - RTC::Router* GetRouterFromRequest(Channel::Request* request) const; + void SetNewRouterIdFromInternal(json& internal, std::string& routerId) const; + RTC::Router* GetRouterFromInternal(json& internal) const; /* Methods inherited from Channel::lUnixStreamSocket::Listener. */ public: diff --git a/worker/src/RTC/DataProducer.cpp b/worker/src/RTC/DataProducer.cpp index 6afd144eef..55918689a3 100644 --- a/worker/src/RTC/DataProducer.cpp +++ b/worker/src/RTC/DataProducer.cpp @@ -5,6 +5,7 @@ #include "DepLibUV.hpp" #include "Logger.hpp" #include "MediaSoupErrors.hpp" +#include "Utils.hpp" namespace RTC { @@ -144,7 +145,7 @@ namespace RTC } } - void DataProducer::ReceiveSctpMessage(uint32_t ppid, const uint8_t* msg, size_t len) + void DataProducer::ReceiveMessage(uint32_t ppid, const uint8_t* msg, size_t len) { MS_TRACE(); diff --git a/worker/src/RTC/PipeTransport.cpp b/worker/src/RTC/PipeTransport.cpp index a0c56e96d9..5a68dcebfb 100644 --- a/worker/src/RTC/PipeTransport.cpp +++ b/worker/src/RTC/PipeTransport.cpp @@ -400,6 +400,14 @@ namespace RTC } } + void PipeTransport::HandleNotification(PayloadChannel::Notification* notification) + { + MS_TRACE(); + + // Pass it to the parent class. + RTC::Transport::HandleNotification(notification); + } + inline bool PipeTransport::IsConnected() const { return this->tuple; diff --git a/worker/src/RTC/PlainTransport.cpp b/worker/src/RTC/PlainTransport.cpp index 6b8e956956..282136e50c 100644 --- a/worker/src/RTC/PlainTransport.cpp +++ b/worker/src/RTC/PlainTransport.cpp @@ -579,6 +579,14 @@ namespace RTC } } + void PlainTransport::HandleNotification(PayloadChannel::Notification* notification) + { + MS_TRACE(); + + // Pass it to the parent class. + RTC::Transport::HandleNotification(notification); + } + inline bool PlainTransport::IsConnected() const { return this->tuple; diff --git a/worker/src/RTC/Router.cpp b/worker/src/RTC/Router.cpp index fbb15dee1a..ee206688f3 100644 --- a/worker/src/RTC/Router.cpp +++ b/worker/src/RTC/Router.cpp @@ -181,7 +181,7 @@ namespace RTC std::string transportId; // This may throw. - SetNewTransportIdFromRequest(request, transportId); + SetNewTransportIdFromInternal(request->internal, transportId); // This may throw. auto* webRtcTransport = new RTC::WebRtcTransport(transportId, this, request->data); @@ -205,7 +205,7 @@ namespace RTC std::string transportId; // This may throw - SetNewTransportIdFromRequest(request, transportId); + SetNewTransportIdFromInternal(request->internal, transportId); auto* plainTransport = new RTC::PlainTransport(transportId, this, request->data); @@ -228,7 +228,7 @@ namespace RTC std::string transportId; // This may throw - SetNewTransportIdFromRequest(request, transportId); + SetNewTransportIdFromInternal(request->internal, transportId); auto* pipeTransport = new RTC::PipeTransport(transportId, this, request->data); @@ -251,7 +251,7 @@ namespace RTC std::string rtpObserverId; // This may throw - SetNewRtpObserverIdFromRequest(request, rtpObserverId); + SetNewRtpObserverIdFromInternal(request->internal, rtpObserverId); auto* audioLevelObserver = new RTC::AudioLevelObserver(rtpObserverId, request->data); @@ -268,7 +268,7 @@ namespace RTC case Channel::Request::MethodId::TRANSPORT_CLOSE: { // This may throw. - RTC::Transport* transport = GetTransportFromRequest(request); + RTC::Transport* transport = GetTransportFromInternal(request->internal); // Tell the Transport to close all its Producers and Consumers so it will // notify us about their closures. @@ -290,7 +290,7 @@ namespace RTC case Channel::Request::MethodId::RTP_OBSERVER_CLOSE: { // This may throw. - RTC::RtpObserver* rtpObserver = GetRtpObserverFromRequest(request); + RTC::RtpObserver* rtpObserver = GetRtpObserverFromInternal(request->internal); // Remove it from the map. this->mapRtpObservers.erase(rtpObserver->id); @@ -316,7 +316,7 @@ namespace RTC case Channel::Request::MethodId::RTP_OBSERVER_PAUSE: { // This may throw. - RTC::RtpObserver* rtpObserver = GetRtpObserverFromRequest(request); + RTC::RtpObserver* rtpObserver = GetRtpObserverFromInternal(request->internal); rtpObserver->Pause(); @@ -328,7 +328,7 @@ namespace RTC case Channel::Request::MethodId::RTP_OBSERVER_RESUME: { // This may throw. - RTC::RtpObserver* rtpObserver = GetRtpObserverFromRequest(request); + RTC::RtpObserver* rtpObserver = GetRtpObserverFromInternal(request->internal); rtpObserver->Resume(); @@ -340,8 +340,8 @@ namespace RTC case Channel::Request::MethodId::RTP_OBSERVER_ADD_PRODUCER: { // This may throw. - RTC::RtpObserver* rtpObserver = GetRtpObserverFromRequest(request); - RTC::Producer* producer = GetProducerFromRequest(request); + RTC::RtpObserver* rtpObserver = GetRtpObserverFromInternal(request->internal); + RTC::Producer* producer = GetProducerFromInternal(request->internal); rtpObserver->AddProducer(producer); @@ -356,8 +356,8 @@ namespace RTC case Channel::Request::MethodId::RTP_OBSERVER_REMOVE_PRODUCER: { // This may throw. - RTC::RtpObserver* rtpObserver = GetRtpObserverFromRequest(request); - RTC::Producer* producer = GetProducerFromRequest(request); + RTC::RtpObserver* rtpObserver = GetRtpObserverFromInternal(request->internal); + RTC::Producer* producer = GetProducerFromInternal(request->internal); rtpObserver->RemoveProducer(producer); @@ -373,7 +373,7 @@ namespace RTC default: { // This may throw. - RTC::Transport* transport = GetTransportFromRequest(request); + RTC::Transport* transport = GetTransportFromInternal(request->internal); transport->HandleRequest(request); @@ -382,14 +382,24 @@ namespace RTC } } - void Router::SetNewTransportIdFromRequest(Channel::Request* request, std::string& transportId) const + void Router::HandleNotification(PayloadChannel::Notification* notification) { MS_TRACE(); - auto jsonTransportIdIt = request->internal.find("transportId"); + // This may throw. + RTC::Transport* transport = GetTransportFromInternal(notification->internal); - if (jsonTransportIdIt == request->internal.end() || !jsonTransportIdIt->is_string()) - MS_THROW_ERROR("request has no internal.transportId"); + transport->HandleNotification(notification); + } + + void Router::SetNewTransportIdFromInternal(json& internal, std::string& transportId) const + { + MS_TRACE(); + + auto jsonTransportIdIt = internal.find("transportId"); + + if (jsonTransportIdIt == internal.end() || !jsonTransportIdIt->is_string()) + MS_THROW_ERROR("missing internal.transportId"); transportId.assign(jsonTransportIdIt->get()); @@ -397,14 +407,14 @@ namespace RTC MS_THROW_ERROR("a Transport with same transportId already exists"); } - RTC::Transport* Router::GetTransportFromRequest(Channel::Request* request) const + RTC::Transport* Router::GetTransportFromInternal(json& internal) const { MS_TRACE(); - auto jsonTransportIdIt = request->internal.find("transportId"); + auto jsonTransportIdIt = internal.find("transportId"); - if (jsonTransportIdIt == request->internal.end() || !jsonTransportIdIt->is_string()) - MS_THROW_ERROR("request has no internal.transportId"); + if (jsonTransportIdIt == internal.end() || !jsonTransportIdIt->is_string()) + MS_THROW_ERROR("missing internal.transportId"); auto it = this->mapTransports.find(jsonTransportIdIt->get()); @@ -416,14 +426,14 @@ namespace RTC return transport; } - void Router::SetNewRtpObserverIdFromRequest(Channel::Request* request, std::string& rtpObserverId) const + void Router::SetNewRtpObserverIdFromInternal(json& internal, std::string& rtpObserverId) const { MS_TRACE(); - auto jsonRtpObserverIdIt = request->internal.find("rtpObserverId"); + auto jsonRtpObserverIdIt = internal.find("rtpObserverId"); - if (jsonRtpObserverIdIt == request->internal.end() || !jsonRtpObserverIdIt->is_string()) - MS_THROW_ERROR("request has no internal.rtpObserverId"); + if (jsonRtpObserverIdIt == internal.end() || !jsonRtpObserverIdIt->is_string()) + MS_THROW_ERROR("missing internal.rtpObserverId"); rtpObserverId.assign(jsonRtpObserverIdIt->get()); @@ -431,14 +441,14 @@ namespace RTC MS_THROW_ERROR("an RtpObserver with same rtpObserverId already exists"); } - RTC::RtpObserver* Router::GetRtpObserverFromRequest(Channel::Request* request) const + RTC::RtpObserver* Router::GetRtpObserverFromInternal(json& internal) const { MS_TRACE(); - auto jsonRtpObserverIdIt = request->internal.find("rtpObserverId"); + auto jsonRtpObserverIdIt = internal.find("rtpObserverId"); - if (jsonRtpObserverIdIt == request->internal.end() || !jsonRtpObserverIdIt->is_string()) - MS_THROW_ERROR("request has no internal.rtpObserverId"); + if (jsonRtpObserverIdIt == internal.end() || !jsonRtpObserverIdIt->is_string()) + MS_THROW_ERROR("missing internal.rtpObserverId"); auto it = this->mapRtpObservers.find(jsonRtpObserverIdIt->get()); @@ -450,14 +460,14 @@ namespace RTC return rtpObserver; } - RTC::Producer* Router::GetProducerFromRequest(Channel::Request* request) const + RTC::Producer* Router::GetProducerFromInternal(json& internal) const { MS_TRACE(); - auto jsonProducerIdIt = request->internal.find("producerId"); + auto jsonProducerIdIt = internal.find("producerId"); - if (jsonProducerIdIt == request->internal.end() || !jsonProducerIdIt->is_string()) - MS_THROW_ERROR("request has no internal.producerId"); + if (jsonProducerIdIt == internal.end() || !jsonProducerIdIt->is_string()) + MS_THROW_ERROR("missing internal.producerId"); auto it = this->mapProducers.find(jsonProducerIdIt->get()); diff --git a/worker/src/RTC/Transport.cpp b/worker/src/RTC/Transport.cpp index 211dbdab3a..69406575a9 100644 --- a/worker/src/RTC/Transport.cpp +++ b/worker/src/RTC/Transport.cpp @@ -566,7 +566,7 @@ namespace RTC std::string producerId; // This may throw. - SetNewProducerIdFromRequest(request, producerId); + SetNewProducerIdFromInternal(request->internal, producerId); // This may throw. auto* producer = new RTC::Producer(producerId, this, request->data); @@ -713,13 +713,13 @@ namespace RTC auto jsonProducerIdIt = request->internal.find("producerId"); if (jsonProducerIdIt == request->internal.end() || !jsonProducerIdIt->is_string()) - MS_THROW_ERROR("request has no internal.producerId"); + MS_THROW_ERROR("missing internal.producerId"); std::string producerId = jsonProducerIdIt->get(); std::string consumerId; // This may throw. - SetNewConsumerIdFromRequest(request, consumerId); + SetNewConsumerIdFromInternal(request->internal, consumerId); // Get type. auto jsonTypeIt = request->data.find("type"); @@ -972,7 +972,7 @@ namespace RTC std::string dataProducerId; // This may throw. - SetNewDataProducerIdFromRequest(request, dataProducerId); + SetNewDataProducerIdFromInternal(request->internal, dataProducerId); // This may throw. auto* dataProducer = new RTC::DataProducer(dataProducerId, this, request->data); @@ -1027,13 +1027,13 @@ namespace RTC auto jsonDataProducerIdIt = request->internal.find("dataProducerId"); if (jsonDataProducerIdIt == request->internal.end() || !jsonDataProducerIdIt->is_string()) - MS_THROW_ERROR("request has no internal.dataProducerId"); + MS_THROW_ERROR("missing internal.dataProducerId"); std::string dataProducerId = jsonDataProducerIdIt->get(); std::string dataConsumerId; // This may throw. - SetNewDataConsumerIdFromRequest(request, dataConsumerId); + SetNewDataConsumerIdFromInternal(request->internal, dataConsumerId); // This may throw. auto* dataConsumer = new RTC::DataConsumer( @@ -1119,7 +1119,7 @@ namespace RTC case Channel::Request::MethodId::PRODUCER_CLOSE: { // This may throw. - RTC::Producer* producer = GetProducerFromRequest(request); + RTC::Producer* producer = GetProducerFromInternal(request->internal); // Remove it from the RtpListener. this->rtpListener.RemoveProducer(producer); @@ -1143,7 +1143,7 @@ namespace RTC case Channel::Request::MethodId::CONSUMER_CLOSE: { // This may throw. - RTC::Consumer* consumer = GetConsumerFromRequest(request); + RTC::Consumer* consumer = GetConsumerFromInternal(request->internal); // Remove it from the maps. this->mapConsumers.erase(consumer->id); @@ -1182,7 +1182,7 @@ namespace RTC case Channel::Request::MethodId::PRODUCER_ENABLE_TRACE_EVENT: { // This may throw. - RTC::Producer* producer = GetProducerFromRequest(request); + RTC::Producer* producer = GetProducerFromInternal(request->internal); producer->HandleRequest(request); @@ -1199,7 +1199,7 @@ namespace RTC case Channel::Request::MethodId::CONSUMER_ENABLE_TRACE_EVENT: { // This may throw. - RTC::Consumer* consumer = GetConsumerFromRequest(request); + RTC::Consumer* consumer = GetConsumerFromInternal(request->internal); consumer->HandleRequest(request); @@ -1209,7 +1209,7 @@ namespace RTC case Channel::Request::MethodId::DATA_PRODUCER_CLOSE: { // This may throw. - RTC::DataProducer* dataProducer = GetDataProducerFromRequest(request); + RTC::DataProducer* dataProducer = GetDataProducerFromInternal(request->internal); // Remove it from the SctpListener. this->sctpListener.RemoveDataProducer(dataProducer); @@ -1239,7 +1239,7 @@ namespace RTC case Channel::Request::MethodId::DATA_CONSUMER_CLOSE: { // This may throw. - RTC::DataConsumer* dataConsumer = GetDataConsumerFromRequest(request); + RTC::DataConsumer* dataConsumer = GetDataConsumerFromInternal(request->internal); // Remove it from the maps. this->mapDataConsumers.erase(dataConsumer->id); @@ -1267,7 +1267,7 @@ namespace RTC case Channel::Request::MethodId::DATA_PRODUCER_GET_STATS: { // This may throw. - RTC::DataProducer* dataProducer = GetDataProducerFromRequest(request); + RTC::DataProducer* dataProducer = GetDataProducerFromInternal(request->internal); dataProducer->HandleRequest(request); @@ -1278,7 +1278,7 @@ namespace RTC case Channel::Request::MethodId::DATA_CONSUMER_GET_STATS: { // This may throw. - RTC::DataConsumer* dataConsumer = GetDataConsumerFromRequest(request); + RTC::DataConsumer* dataConsumer = GetDataConsumerFromInternal(request->internal); dataConsumer->HandleRequest(request); @@ -1292,6 +1292,53 @@ namespace RTC } } + void Transport::HandleNotification(PayloadChannel::Notification* notification) + { + MS_TRACE(); + + switch (notification->eventId) + { + case PayloadChannel::Notification::EventId::DATA_PRODUCER_SEND: + { + // This must be a direct Transport. + if (!this->direct) + { + MS_THROW_ERROR("cannot send direct messages on a non direct Transport"); + } + + // This may throw. + RTC::DataProducer* dataProducer = GetDataProducerFromInternal(notification->internal); + + auto jsonPpidIt = notification->data.find("ppid"); + + if (jsonPpidIt == notification->data.end() || !Utils::Json::IsPositiveInteger(*jsonPpidIt)) + { + MS_THROW_TYPE_ERROR("invalid ppid"); + } + + auto ppid = jsonPpidIt->get(); + auto* msg = notification->payload; + auto len = notification->payloadLen; + + // NOTE: If we had some maxMessageSize property in Transport, we may + // check it here. + + // Increase receive transmission. + RTC::Transport::DataReceived(len); + + // Pass the message to the DataProducer. + dataProducer->ReceiveMessage(ppid, msg, len); + + break; + } + + default: + { + MS_ERROR("unknown event '%s'", notification->event.c_str()); + } + } + } + void Transport::Connected() { MS_TRACE(); @@ -1463,14 +1510,14 @@ namespace RTC this->sctpAssociation->ProcessSctpData(data, len); } - void Transport::SetNewProducerIdFromRequest(Channel::Request* request, std::string& producerId) const + void Transport::SetNewProducerIdFromInternal(json& internal, std::string& producerId) const { MS_TRACE(); - auto jsonProducerIdIt = request->internal.find("producerId"); + auto jsonProducerIdIt = internal.find("producerId"); - if (jsonProducerIdIt == request->internal.end() || !jsonProducerIdIt->is_string()) - MS_THROW_ERROR("request has no internal.producerId"); + if (jsonProducerIdIt == internal.end() || !jsonProducerIdIt->is_string()) + MS_THROW_ERROR("missing internal.producerId"); producerId.assign(jsonProducerIdIt->get()); @@ -1478,14 +1525,14 @@ namespace RTC MS_THROW_ERROR("a Producer with same producerId already exists"); } - RTC::Producer* Transport::GetProducerFromRequest(Channel::Request* request) const + RTC::Producer* Transport::GetProducerFromInternal(json& internal) const { MS_TRACE(); - auto jsonProducerIdIt = request->internal.find("producerId"); + auto jsonProducerIdIt = internal.find("producerId"); - if (jsonProducerIdIt == request->internal.end() || !jsonProducerIdIt->is_string()) - MS_THROW_ERROR("request has no internal.producerId"); + if (jsonProducerIdIt == internal.end() || !jsonProducerIdIt->is_string()) + MS_THROW_ERROR("missing internal.producerId"); auto it = this->mapProducers.find(jsonProducerIdIt->get()); @@ -1497,14 +1544,14 @@ namespace RTC return producer; } - void Transport::SetNewConsumerIdFromRequest(Channel::Request* request, std::string& consumerId) const + void Transport::SetNewConsumerIdFromInternal(json& internal, std::string& consumerId) const { MS_TRACE(); - auto jsonConsumerIdIt = request->internal.find("consumerId"); + auto jsonConsumerIdIt = internal.find("consumerId"); - if (jsonConsumerIdIt == request->internal.end() || !jsonConsumerIdIt->is_string()) - MS_THROW_ERROR("request has no internal.consumerId"); + if (jsonConsumerIdIt == internal.end() || !jsonConsumerIdIt->is_string()) + MS_THROW_ERROR("missing internal.consumerId"); consumerId.assign(jsonConsumerIdIt->get()); @@ -1512,14 +1559,14 @@ namespace RTC MS_THROW_ERROR("a Consumer with same consumerId already exists"); } - RTC::Consumer* Transport::GetConsumerFromRequest(Channel::Request* request) const + RTC::Consumer* Transport::GetConsumerFromInternal(json& internal) const { MS_TRACE(); - auto jsonConsumerIdIt = request->internal.find("consumerId"); + auto jsonConsumerIdIt = internal.find("consumerId"); - if (jsonConsumerIdIt == request->internal.end() || !jsonConsumerIdIt->is_string()) - MS_THROW_ERROR("request has no internal.consumerId"); + if (jsonConsumerIdIt == internal.end() || !jsonConsumerIdIt->is_string()) + MS_THROW_ERROR("missing internal.consumerId"); auto it = this->mapConsumers.find(jsonConsumerIdIt->get()); @@ -1559,15 +1606,14 @@ namespace RTC return consumer; } - void Transport::SetNewDataProducerIdFromRequest( - Channel::Request* request, std::string& dataProducerId) const + void Transport::SetNewDataProducerIdFromInternal(json& internal, std::string& dataProducerId) const { MS_TRACE(); - auto jsonDataProducerIdIt = request->internal.find("dataProducerId"); + auto jsonDataProducerIdIt = internal.find("dataProducerId"); - if (jsonDataProducerIdIt == request->internal.end() || !jsonDataProducerIdIt->is_string()) - MS_THROW_ERROR("request has no internal.dataProducerId"); + if (jsonDataProducerIdIt == internal.end() || !jsonDataProducerIdIt->is_string()) + MS_THROW_ERROR("missing internal.dataProducerId"); dataProducerId.assign(jsonDataProducerIdIt->get()); @@ -1575,14 +1621,14 @@ namespace RTC MS_THROW_ERROR("a DataProducer with same dataProducerId already exists"); } - RTC::DataProducer* Transport::GetDataProducerFromRequest(Channel::Request* request) const + RTC::DataProducer* Transport::GetDataProducerFromInternal(json& internal) const { MS_TRACE(); - auto jsonDataProducerIdIt = request->internal.find("dataProducerId"); + auto jsonDataProducerIdIt = internal.find("dataProducerId"); - if (jsonDataProducerIdIt == request->internal.end() || !jsonDataProducerIdIt->is_string()) - MS_THROW_ERROR("request has no internal.dataProducerId"); + if (jsonDataProducerIdIt == internal.end() || !jsonDataProducerIdIt->is_string()) + MS_THROW_ERROR("missing internal.dataProducerId"); auto it = this->mapDataProducers.find(jsonDataProducerIdIt->get()); @@ -1594,15 +1640,14 @@ namespace RTC return dataProducer; } - void Transport::SetNewDataConsumerIdFromRequest( - Channel::Request* request, std::string& dataConsumerId) const + void Transport::SetNewDataConsumerIdFromInternal(json& internal, std::string& dataConsumerId) const { MS_TRACE(); - auto jsonDataConsumerIdIt = request->internal.find("dataConsumerId"); + auto jsonDataConsumerIdIt = internal.find("dataConsumerId"); - if (jsonDataConsumerIdIt == request->internal.end() || !jsonDataConsumerIdIt->is_string()) - MS_THROW_ERROR("request has no internal.dataConsumerId"); + if (jsonDataConsumerIdIt == internal.end() || !jsonDataConsumerIdIt->is_string()) + MS_THROW_ERROR("missing internal.dataConsumerId"); dataConsumerId.assign(jsonDataConsumerIdIt->get()); @@ -1610,14 +1655,14 @@ namespace RTC MS_THROW_ERROR("a DataConsumer with same dataConsumerId already exists"); } - RTC::DataConsumer* Transport::GetDataConsumerFromRequest(Channel::Request* request) const + RTC::DataConsumer* Transport::GetDataConsumerFromInternal(json& internal) const { MS_TRACE(); - auto jsonDataConsumerIdIt = request->internal.find("dataConsumerId"); + auto jsonDataConsumerIdIt = internal.find("dataConsumerId"); - if (jsonDataConsumerIdIt == request->internal.end() || !jsonDataConsumerIdIt->is_string()) - MS_THROW_ERROR("request has no internal.dataConsumerId"); + if (jsonDataConsumerIdIt == internal.end() || !jsonDataConsumerIdIt->is_string()) + MS_THROW_ERROR("missing internal.dataConsumerId"); auto it = this->mapDataConsumers.find(jsonDataConsumerIdIt->get()); @@ -2590,7 +2635,7 @@ namespace RTC } // Pass the SCTP message to the corresponding DataProducer. - dataProducer->ReceiveSctpMessage(ppid, msg, len); + dataProducer->ReceiveMessage(ppid, msg, len); } inline void Transport::OnTransportCongestionControlClientBitrates( diff --git a/worker/src/RTC/WebRtcTransport.cpp b/worker/src/RTC/WebRtcTransport.cpp index 80aabe791f..bccdfecdf5 100644 --- a/worker/src/RTC/WebRtcTransport.cpp +++ b/worker/src/RTC/WebRtcTransport.cpp @@ -592,6 +592,14 @@ namespace RTC } } + void WebRtcTransport::HandleNotification(PayloadChannel::Notification* notification) + { + MS_TRACE(); + + // Pass it to the parent class. + RTC::Transport::HandleNotification(notification); + } + inline bool WebRtcTransport::IsConnected() const { MS_TRACE(); diff --git a/worker/src/Worker.cpp b/worker/src/Worker.cpp index e0bd34b18d..607acfa712 100644 --- a/worker/src/Worker.cpp +++ b/worker/src/Worker.cpp @@ -157,14 +157,14 @@ void Worker::FillJsonResourceUsage(json& jsonObject) const jsonObject["ru_nivcsw"] = uvRusage.ru_nivcsw; } -void Worker::SetNewRouterIdFromRequest(Channel::Request* request, std::string& routerId) const +void Worker::SetNewRouterIdFromInternal(json& internal, std::string& routerId) const { MS_TRACE(); - auto jsonRouterIdIt = request->internal.find("routerId"); + auto jsonRouterIdIt = internal.find("routerId"); - if (jsonRouterIdIt == request->internal.end() || !jsonRouterIdIt->is_string()) - MS_THROW_ERROR("request has no internal.routerId"); + if (jsonRouterIdIt == internal.end() || !jsonRouterIdIt->is_string()) + MS_THROW_ERROR("missing internal.routerId"); routerId.assign(jsonRouterIdIt->get()); @@ -172,14 +172,14 @@ void Worker::SetNewRouterIdFromRequest(Channel::Request* request, std::string& r MS_THROW_ERROR("a Router with same routerId already exists"); } -RTC::Router* Worker::GetRouterFromRequest(Channel::Request* request) const +RTC::Router* Worker::GetRouterFromInternal(json& internal) const { MS_TRACE(); - auto jsonRouterIdIt = request->internal.find("routerId"); + auto jsonRouterIdIt = internal.find("routerId"); - if (jsonRouterIdIt == request->internal.end() || !jsonRouterIdIt->is_string()) - MS_THROW_ERROR("request has no internal.routerId"); + if (jsonRouterIdIt == internal.end() || !jsonRouterIdIt->is_string()) + MS_THROW_ERROR("missing internal.routerId"); auto it = this->mapRouters.find(jsonRouterIdIt->get()); @@ -234,7 +234,7 @@ inline void Worker::OnChannelRequest(Channel::UnixStreamSocket* /*channel*/, Cha std::string routerId; // This may throw. - SetNewRouterIdFromRequest(request, routerId); + SetNewRouterIdFromInternal(request->internal, routerId); auto* router = new RTC::Router(routerId); @@ -250,7 +250,7 @@ inline void Worker::OnChannelRequest(Channel::UnixStreamSocket* /*channel*/, Cha case Channel::Request::MethodId::ROUTER_CLOSE: { // This may throw. - RTC::Router* router = GetRouterFromRequest(request); + RTC::Router* router = GetRouterFromInternal(request->internal); // Remove it from the map and delete it. this->mapRouters.erase(router->id); @@ -267,7 +267,7 @@ inline void Worker::OnChannelRequest(Channel::UnixStreamSocket* /*channel*/, Cha default: { // This may throw. - RTC::Router* router = GetRouterFromRequest(request); + RTC::Router* router = GetRouterFromInternal(request->internal); router->HandleRequest(request); @@ -293,6 +293,11 @@ inline void Worker::OnPayloadChannelNotification( MS_TRACE(); MS_DEBUG_DEV("PayloadChannel notification received [event:%s]", notification->event.c_str()); + + // This may throw. + RTC::Router* router = GetRouterFromInternal(notification->internal); + + router->HandleNotification(notification); } inline void Worker::OnPayloadChannelClosed(PayloadChannel::UnixStreamSocket* /*payloadChannel*/) From 131719150f1d9c5996da2a906f2daf76f962f64a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?I=C3=B1aki=20Baz=20Castillo?= Date: Thu, 28 May 2020 22:37:47 +0200 Subject: [PATCH 12/23] It may work! --- TODO_DATACHANNEL_TERMINATION.md | 8 +- lib/DataProducer.d.ts | 2 +- lib/DataProducer.d.ts.map | 2 +- lib/DirectTransport.d.ts | 4 +- lib/DirectTransport.d.ts.map | 2 +- lib/Router.d.ts | 2 +- lib/Router.d.ts.map | 2 +- lib/Router.js | 6 +- src/DataConsumer.ts | 2 +- src/DataProducer.ts | 4 +- src/DirectTransport.ts | 4 +- src/Router.ts | 7 +- test/test-DataConsumer.js | 153 ++++++++++++++++++------- worker/include/Channel/Request.hpp | 1 + worker/include/RTC/DataConsumer.hpp | 4 +- worker/include/RTC/DirectTransport.hpp | 29 +++++ worker/include/RTC/SctpAssociation.hpp | 4 - worker/include/RTC/Transport.hpp | 1 + worker/include/Settings.hpp | 1 + worker/mediasoup-worker.gyp | 2 + worker/src/Channel/Request.cpp | 1 + worker/src/RTC/DataConsumer.cpp | 13 +-- worker/src/RTC/DirectTransport.cpp | 96 ++++++++++++++++ worker/src/RTC/Router.cpp | 24 ++++ worker/src/RTC/Transport.cpp | 64 +++++++++-- worker/src/RTC/WebRtcTransport.cpp | 6 + worker/src/Settings.cpp | 4 + 27 files changed, 356 insertions(+), 92 deletions(-) create mode 100644 worker/include/RTC/DirectTransport.hpp create mode 100644 worker/src/RTC/DirectTransport.cpp diff --git a/TODO_DATACHANNEL_TERMINATION.md b/TODO_DATACHANNEL_TERMINATION.md index 66d7f24726..c3d5c58689 100644 --- a/TODO_DATACHANNEL_TERMINATION.md +++ b/TODO_DATACHANNEL_TERMINATION.md @@ -8,8 +8,6 @@ - Added `dataProducer/Consumer.type`: 'sctp' | 'direct'. -- `DirectTransport.cpp` must call `Transport::Connected()` in its constructor. - - `transport.consumeData()` (when in SCTP) now accepts optional arguments: ```ts @@ -18,8 +16,4 @@ maxPacketLifeTime?: number; maxRetransmits?: number; ``` -- How to increment bytes counter in `Transport` when `DATA_PRODUCER_SEND`? Ok, it must be done in `Transport::HandleNotification()`. It must verify the notification fields and call `DataReceived()`. - + DONE - -- Same for `DataSent()` when notifying a `message` to a direct `DataConsumer`. - +- Added a new `direct` log tag. diff --git a/lib/DataProducer.d.ts b/lib/DataProducer.d.ts index 1ec039eeb6..7ef833f0e5 100644 --- a/lib/DataProducer.d.ts +++ b/lib/DataProducer.d.ts @@ -73,7 +73,7 @@ export declare class DataProducer extends EnhancedEventEmitter { /** * SCTP stream parameters. */ - get sctpStreamParameters(): SctpStreamParameters; + get sctpStreamParameters(): SctpStreamParameters | undefined; /** * DataChannel label. */ diff --git a/lib/DataProducer.d.ts.map b/lib/DataProducer.d.ts.map index 3d8027a4ef..c16c53165c 100644 --- a/lib/DataProducer.d.ts.map +++ b/lib/DataProducer.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"DataProducer.d.ts","sourceRoot":"","sources":["../src/DataProducer.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAExD,oBAAY,mBAAmB,GAC/B;IACC;;OAEG;IACH,EAAE,CAAC,EAAE,MAAM,CAAC;IAEZ;;;OAGG;IACH,oBAAoB,CAAC,EAAE,oBAAoB,CAAC;IAE5C;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;OAEG;IACH,OAAO,CAAC,EAAE,GAAG,CAAC;CACd,CAAA;AAED,oBAAY,gBAAgB,GAC5B;IACC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,EAAE,MAAM,CAAC;IACzB,aAAa,EAAE,MAAM,CAAC;CACtB,CAAA;AAED;;GAEG;AACH,oBAAY,gBAAgB,GAAG,MAAM,GAAG,QAAQ,CAAC;AAIjD,qBAAa,YAAa,SAAQ,oBAAoB;IAGrD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAKxB;IAGF,OAAO,CAAC,QAAQ,CAAC,KAAK,CAMpB;IAGF,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAU;IAGnC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAiB;IAGjD,OAAO,CAAC,OAAO,CAAS;IAGxB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAM;IAGhC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA8B;IAExD;;;;OAIG;gBAEF,EACC,QAAQ,EACR,IAAI,EACJ,OAAO,EACP,cAAc,EACd,OAAO,EACP,EACD;QACC,QAAQ,EAAE,GAAG,CAAC;QACd,IAAI,EAAE,GAAG,CAAC;QACV,OAAO,EAAE,OAAO,CAAC;QACjB,cAAc,EAAE,cAAc,CAAC;QAC/B,OAAO,EAAE,GAAG,CAAC;KACb;IAgBF;;OAEG;IACH,IAAI,EAAE,IAAI,MAAM,CAGf;IAED;;OAEG;IACH,IAAI,MAAM,IAAI,OAAO,CAGpB;IAED;;OAEG;IACH,IAAI,IAAI,IAAI,gBAAgB,CAG3B;IAED;;OAEG;IACH,IAAI,oBAAoB,IAAI,oBAAoB,CAG/C;IAED;;OAEG;IACH,IAAI,KAAK,IAAI,MAAM,CAGlB;IAED;;OAEG;IACH,IAAI,QAAQ,IAAI,MAAM,CAGrB;IAED;;OAEG;IACH,IAAI,OAAO,IAAI,GAAG,CAGjB;IAED;;OAEG;IACH,IAAI,OAAO,CAAC,OAAO,EAAE,GAAG,EAGvB;IAED;;;;OAIG;IACH,IAAI,QAAQ,IAAI,oBAAoB,CAGnC;IAED;;OAEG;IACH,KAAK,IAAI,IAAI;IAqBb;;;;OAIG;IACH,eAAe,IAAI,IAAI;IAevB;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC;IAO1B;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAO7C;;OAEG;IACH,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI;IAuCnD,OAAO,CAAC,0BAA0B;CAIlC"} \ No newline at end of file +{"version":3,"file":"DataProducer.d.ts","sourceRoot":"","sources":["../src/DataProducer.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAExD,oBAAY,mBAAmB,GAC/B;IACC;;OAEG;IACH,EAAE,CAAC,EAAE,MAAM,CAAC;IAEZ;;;OAGG;IACH,oBAAoB,CAAC,EAAE,oBAAoB,CAAC;IAE5C;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;OAEG;IACH,OAAO,CAAC,EAAE,GAAG,CAAC;CACd,CAAA;AAED,oBAAY,gBAAgB,GAC5B;IACC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,EAAE,MAAM,CAAC;IACzB,aAAa,EAAE,MAAM,CAAC;CACtB,CAAA;AAED;;GAEG;AACH,oBAAY,gBAAgB,GAAG,MAAM,GAAG,QAAQ,CAAC;AAIjD,qBAAa,YAAa,SAAQ,oBAAoB;IAGrD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAKxB;IAGF,OAAO,CAAC,QAAQ,CAAC,KAAK,CAMpB;IAGF,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAU;IAGnC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAiB;IAGjD,OAAO,CAAC,OAAO,CAAS;IAGxB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAM;IAGhC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA8B;IAExD;;;;OAIG;gBAEF,EACC,QAAQ,EACR,IAAI,EACJ,OAAO,EACP,cAAc,EACd,OAAO,EACP,EACD;QACC,QAAQ,EAAE,GAAG,CAAC;QACd,IAAI,EAAE,GAAG,CAAC;QACV,OAAO,EAAE,OAAO,CAAC;QACjB,cAAc,EAAE,cAAc,CAAC;QAC/B,OAAO,EAAE,GAAG,CAAC;KACb;IAgBF;;OAEG;IACH,IAAI,EAAE,IAAI,MAAM,CAGf;IAED;;OAEG;IACH,IAAI,MAAM,IAAI,OAAO,CAGpB;IAED;;OAEG;IACH,IAAI,IAAI,IAAI,gBAAgB,CAG3B;IAED;;OAEG;IACH,IAAI,oBAAoB,IAAI,oBAAoB,GAAG,SAAS,CAG3D;IAED;;OAEG;IACH,IAAI,KAAK,IAAI,MAAM,CAGlB;IAED;;OAEG;IACH,IAAI,QAAQ,IAAI,MAAM,CAGrB;IAED;;OAEG;IACH,IAAI,OAAO,IAAI,GAAG,CAGjB;IAED;;OAEG;IACH,IAAI,OAAO,CAAC,OAAO,EAAE,GAAG,EAGvB;IAED;;;;OAIG;IACH,IAAI,QAAQ,IAAI,oBAAoB,CAGnC;IAED;;OAEG;IACH,KAAK,IAAI,IAAI;IAqBb;;;;OAIG;IACH,eAAe,IAAI,IAAI;IAevB;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC;IAO1B;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAO7C;;OAEG;IACH,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI;IAuCnD,OAAO,CAAC,0BAA0B;CAIlC"} \ No newline at end of file diff --git a/lib/DirectTransport.d.ts b/lib/DirectTransport.d.ts index b11e8b1d21..f5c83c312f 100644 --- a/lib/DirectTransport.d.ts +++ b/lib/DirectTransport.d.ts @@ -4,9 +4,9 @@ import { Producer, ProducerOptions } from './Producer'; import { Consumer, ConsumerOptions } from './Consumer'; export declare type DirectTransportOptions = { /** - * Maximum allowed size for messages. Default 262144. + * Maximum allowed size for messages. */ - maxMessageSize?: number; + maxMessageSize: number; /** * Custom application data. */ diff --git a/lib/DirectTransport.d.ts.map b/lib/DirectTransport.d.ts.map index 384d37d3d1..b0a5d5a04b 100644 --- a/lib/DirectTransport.d.ts.map +++ b/lib/DirectTransport.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"DirectTransport.d.ts","sourceRoot":"","sources":["../src/DirectTransport.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAE9D,OAAO,EAAE,SAAS,EAA2B,MAAM,aAAa,CAAC;AACjE,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AACvD,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAEvD,oBAAY,sBAAsB,GAClC;IACC;;OAEG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB;;OAEG;IACH,OAAO,CAAC,EAAE,GAAG,CAAC;CACd,CAAA;AAED,oBAAY,mBAAmB,GAC/B;IAEC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,sBAAsB,EAAE,MAAM,CAAC;IAC/B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC5B,CAAA;AAID,qBAAa,eAAgB,SAAQ,SAAS;IAG7C,SAAS,CAAC,QAAQ,CAAC,KAAK,EACxB,EAEC,CAAC;IAEF;;;OAGG;gBACS,MAAM,EAAE,GAAG;IAiBvB;;;;;;;;OAQG;IACH,IAAI,QAAQ,IAAI,oBAAoB,CAGnC;IAED;;;;OAIG;IACH,KAAK,IAAI,IAAI;IAQb;;;;;OAKG;IACH,YAAY,IAAI,IAAI;IAQpB;;;;OAIG;IACG,QAAQ,IAAI,OAAO,CAAC,mBAAmB,EAAE,CAAC;IAOhD;;;;OAIG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAK9B;;OAEG;IAEG,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAM3D;;OAEG;IAEG,OAAO,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,QAAQ,CAAC;IAK1D;;OAEG;IAEG,QAAQ,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,QAAQ,CAAC;IAK3D,OAAO,CAAC,0BAA0B;CAyBlC"} \ No newline at end of file +{"version":3,"file":"DirectTransport.d.ts","sourceRoot":"","sources":["../src/DirectTransport.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAE9D,OAAO,EAAE,SAAS,EAA2B,MAAM,aAAa,CAAC;AACjE,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AACvD,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAEvD,oBAAY,sBAAsB,GAClC;IACC;;OAEG;IACH,cAAc,EAAE,MAAM,CAAC;IAEvB;;OAEG;IACH,OAAO,CAAC,EAAE,GAAG,CAAC;CACd,CAAA;AAED,oBAAY,mBAAmB,GAC/B;IAEC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,sBAAsB,EAAE,MAAM,CAAC;IAC/B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC5B,CAAA;AAID,qBAAa,eAAgB,SAAQ,SAAS;IAG7C,SAAS,CAAC,QAAQ,CAAC,KAAK,EACxB,EAEC,CAAC;IAEF;;;OAGG;gBACS,MAAM,EAAE,GAAG;IAiBvB;;;;;;;;OAQG;IACH,IAAI,QAAQ,IAAI,oBAAoB,CAGnC;IAED;;;;OAIG;IACH,KAAK,IAAI,IAAI;IAQb;;;;;OAKG;IACH,YAAY,IAAI,IAAI;IAQpB;;;;OAIG;IACG,QAAQ,IAAI,OAAO,CAAC,mBAAmB,EAAE,CAAC;IAOhD;;;;OAIG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAK9B;;OAEG;IAEG,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAM3D;;OAEG;IAEG,OAAO,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,QAAQ,CAAC;IAK1D;;OAEG;IAEG,QAAQ,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,QAAQ,CAAC;IAK3D,OAAO,CAAC,0BAA0B;CAyBlC"} \ No newline at end of file diff --git a/lib/Router.d.ts b/lib/Router.d.ts index 0c71c4fce5..2c16502a3d 100644 --- a/lib/Router.d.ts +++ b/lib/Router.d.ts @@ -162,7 +162,7 @@ export declare class Router extends EnhancedEventEmitter { /** * Create a DirectTransport. */ - createDirectTransport({ maxMessageSize, appData }: DirectTransportOptions): Promise; + createDirectTransport({ maxMessageSize, appData }?: DirectTransportOptions): Promise; /** * Pipes the given Producer or DataProducer into another Router in same host. */ diff --git a/lib/Router.d.ts.map b/lib/Router.d.ts.map index cdb6d334c7..b44db557b9 100644 --- a/lib/Router.d.ts.map +++ b/lib/Router.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"Router.d.ts","sourceRoot":"","sources":["../src/Router.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"Router.d.ts","sourceRoot":"","sources":["../src/Router.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/lib/Router.js b/lib/Router.js index 2985b23ca8..7d5dea5b7a 100644 --- a/lib/Router.js +++ b/lib/Router.js @@ -334,10 +334,12 @@ class Router extends EnhancedEventEmitter_1.EnhancedEventEmitter { /** * Create a DirectTransport. */ - async createDirectTransport({ maxMessageSize = 262144, appData = {} }) { + async createDirectTransport({ maxMessageSize = 262144, appData = {} } = { + maxMessageSize: 262144 + }) { logger.debug('createDirectTransport()'); const internal = { ...this._internal, transportId: uuid_1.v4() }; - const reqData = { maxMessageSize }; + const reqData = { direct: true, maxMessageSize }; const data = await this._channel.request('router.createDirectTransport', internal, reqData); const transport = new DirectTransport_1.DirectTransport({ internal, diff --git a/src/DataConsumer.ts b/src/DataConsumer.ts index d93f113581..c07e477fe8 100644 --- a/src/DataConsumer.ts +++ b/src/DataConsumer.ts @@ -73,7 +73,7 @@ export class DataConsumer extends EnhancedEventEmitter private readonly _data: { type: DataConsumerType; - sctpStreamParameters: SctpStreamParameters; + sctpStreamParameters?: SctpStreamParameters; label: string; protocol: string; }; diff --git a/src/DataProducer.ts b/src/DataProducer.ts index cddc20ec84..b8f5618cf0 100644 --- a/src/DataProducer.ts +++ b/src/DataProducer.ts @@ -64,7 +64,7 @@ export class DataProducer extends EnhancedEventEmitter private readonly _data: { type: DataProducerType; - sctpStreamParameters: SctpStreamParameters; + sctpStreamParameters?: SctpStreamParameters; label: string; protocol: string; }; @@ -146,7 +146,7 @@ export class DataProducer extends EnhancedEventEmitter /** * SCTP stream parameters. */ - get sctpStreamParameters(): SctpStreamParameters + get sctpStreamParameters(): SctpStreamParameters | undefined { return this._data.sctpStreamParameters; } diff --git a/src/DirectTransport.ts b/src/DirectTransport.ts index 392267406b..b3d75069ac 100644 --- a/src/DirectTransport.ts +++ b/src/DirectTransport.ts @@ -8,9 +8,9 @@ import { Consumer, ConsumerOptions } from './Consumer'; export type DirectTransportOptions = { /** - * Maximum allowed size for messages. Default 262144. + * Maximum allowed size for messages. */ - maxMessageSize?: number; + maxMessageSize: number; /** * Custom application data. diff --git a/src/Router.ts b/src/Router.ts index effe13fd91..b8e76e3538 100644 --- a/src/Router.ts +++ b/src/Router.ts @@ -624,13 +624,16 @@ export class Router extends EnhancedEventEmitter { maxMessageSize = 262144, appData = {} - }: DirectTransportOptions + }: DirectTransportOptions = + { + maxMessageSize : 262144 + } ): Promise { logger.debug('createDirectTransport()'); const internal = { ...this._internal, transportId: uuidv4() }; - const reqData = { maxMessageSize }; + const reqData = { direct: true, maxMessageSize }; const data = await this._channel.request('router.createDirectTransport', internal, reqData); diff --git a/test/test-DataConsumer.js b/test/test-DataConsumer.js index 82fc2bbe74..6193417055 100644 --- a/test/test-DataConsumer.js +++ b/test/test-DataConsumer.js @@ -8,8 +8,10 @@ let worker; let router; let transport1; let transport2; +let transport3; let dataProducer; -let dataConsumer; +let dataConsumer1; +let dataConsumer2; const dataProducerParameters = { @@ -37,6 +39,7 @@ beforeAll(async () => listenIp : '127.0.0.1', enableSctp : true }); + transport3 = await router.createDirectTransport(); dataProducer = await transport1.produceData(dataProducerParameters); }); @@ -48,33 +51,34 @@ test('transport.consumeData() succeeds', async () => transport2.observer.once('newdataconsumer', onObserverNewDataConsumer); - dataConsumer = await transport2.consumeData( + dataConsumer1 = await transport2.consumeData( { - dataProducerId : dataProducer.id, - appData : { baz: 'LOL' } + dataProducerId : dataProducer.id, + maxPacketLifeTime : 4000, + appData : { baz: 'LOL' } }); expect(onObserverNewDataConsumer).toHaveBeenCalledTimes(1); - expect(onObserverNewDataConsumer).toHaveBeenCalledWith(dataConsumer); - expect(dataConsumer.id).toBeType('string'); - expect(dataConsumer.dataProducerId).toBe(dataProducer.id); - expect(dataConsumer.closed).toBe(false); - expect(dataConsumer.type).toBe('sctp'); - expect(dataConsumer.sctpStreamParameters).toBeType('object'); - expect(dataConsumer.sctpStreamParameters.streamId).toBeType('number'); - expect(dataConsumer.sctpStreamParameters.ordered).toBe(false); - expect(dataConsumer.sctpStreamParameters.maxPacketLifeTime).toBe(5000); - expect(dataConsumer.sctpStreamParameters.maxRetransmits).toBeUndefined(); - expect(dataConsumer.label).toBe('foo'); - expect(dataConsumer.protocol).toBe('bar'); - expect(dataConsumer.appData).toEqual({ baz: 'LOL' }); + expect(onObserverNewDataConsumer).toHaveBeenCalledWith(dataConsumer1); + expect(dataConsumer1.id).toBeType('string'); + expect(dataConsumer1.dataProducerId).toBe(dataProducer.id); + expect(dataConsumer1.closed).toBe(false); + expect(dataConsumer1.type).toBe('sctp'); + expect(dataConsumer1.sctpStreamParameters).toBeType('object'); + expect(dataConsumer1.sctpStreamParameters.streamId).toBeType('number'); + expect(dataConsumer1.sctpStreamParameters.ordered).toBe(false); + expect(dataConsumer1.sctpStreamParameters.maxPacketLifeTime).toBe(4000); + expect(dataConsumer1.sctpStreamParameters.maxRetransmits).toBeUndefined(); + expect(dataConsumer1.label).toBe('foo'); + expect(dataConsumer1.protocol).toBe('bar'); + expect(dataConsumer1.appData).toEqual({ baz: 'LOL' }); await expect(router.dump()) .resolves .toMatchObject( { - mapDataProducerIdDataConsumerIds : { [dataProducer.id]: [ dataConsumer.id ] }, - mapDataConsumerIdDataProducerId : { [dataConsumer.id]: dataProducer.id } + mapDataProducerIdDataConsumerIds : { [dataProducer.id]: [ dataConsumer1.id ] }, + mapDataConsumerIdDataProducerId : { [dataConsumer1.id]: dataProducer.id } }); await expect(transport2.dump()) @@ -83,22 +87,22 @@ test('transport.consumeData() succeeds', async () => { id : transport2.id, dataProducerIds : [], - dataConsumerIds : [ dataConsumer.id ] + dataConsumerIds : [ dataConsumer1.id ] }); }, 2000); test('dataConsumer.dump() succeeds', async () => { - const data = await dataConsumer.dump(); + const data = await dataConsumer1.dump(); - expect(data.id).toBe(dataConsumer.id); - expect(data.dataProducerId).toBe(dataConsumer.dataProducerId); + expect(data.id).toBe(dataConsumer1.id); + expect(data.dataProducerId).toBe(dataConsumer1.dataProducerId); expect(data.type).toBe('sctp'); expect(data.sctpStreamParameters).toBeType('object'); expect(data.sctpStreamParameters.streamId) - .toBe(dataConsumer.sctpStreamParameters.streamId); + .toBe(dataConsumer1.sctpStreamParameters.streamId); expect(data.sctpStreamParameters.ordered).toBe(false); - expect(data.sctpStreamParameters.maxPacketLifeTime).toBe(5000); + expect(data.sctpStreamParameters.maxPacketLifeTime).toBe(4000); expect(data.sctpStreamParameters.maxRetransmits).toBeUndefined(); expect(data.label).toBe('foo'); expect(data.protocol).toBe('bar'); @@ -106,14 +110,75 @@ test('dataConsumer.dump() succeeds', async () => test('dataConsumer.getStats() succeeds', async () => { - await expect(dataConsumer.getStats()) + await expect(dataConsumer1.getStats()) + .resolves + .toMatchObject( + [ + { + type : 'data-consumer', + label : dataConsumer1.label, + protocol : dataConsumer1.protocol, + messagesSent : 0, + bytesSent : 0 + } + ]); +}, 2000); + +test('transport.consumeData() on a DirectTransport succeeds', async () => +{ + const onObserverNewDataConsumer = jest.fn(); + + transport3.observer.once('newdataconsumer', onObserverNewDataConsumer); + + dataConsumer2 = await transport3.consumeData( + { + dataProducerId : dataProducer.id, + appData : { hehe: 'HEHE' } + }); + + expect(onObserverNewDataConsumer).toHaveBeenCalledTimes(1); + expect(onObserverNewDataConsumer).toHaveBeenCalledWith(dataConsumer2); + expect(dataConsumer2.id).toBeType('string'); + expect(dataConsumer2.dataProducerId).toBe(dataProducer.id); + expect(dataConsumer2.closed).toBe(false); + expect(dataConsumer2.type).toBe('direct'); + expect(dataConsumer2.sctpStreamParameters).toBeUndefined(); + expect(dataConsumer2.label).toBe('foo'); + expect(dataConsumer2.protocol).toBe('bar'); + expect(dataConsumer2.appData).toEqual({ hehe: 'HEHE' }); + + await expect(transport3.dump()) + .resolves + .toMatchObject( + { + id : transport3.id, + dataProducerIds : [], + dataConsumerIds : [ dataConsumer2.id ] + }); +}, 2000); + +test('dataConsumer.dump() on a DirectTransport succeeds', async () => +{ + const data = await dataConsumer2.dump(); + + expect(data.id).toBe(dataConsumer2.id); + expect(data.dataProducerId).toBe(dataConsumer2.dataProducerId); + expect(data.type).toBe('direct'); + expect(data.sctpStreamParameters).toBeUndefined(); + expect(data.label).toBe('foo'); + expect(data.protocol).toBe('bar'); +}, 2000); + +test('dataConsumer.getStats() on a DirectTransport succeeds', async () => +{ + await expect(dataConsumer2.getStats()) .resolves .toMatchObject( [ { type : 'data-consumer', - label : dataConsumer.label, - protocol : dataConsumer.protocol, + label : dataConsumer2.label, + protocol : dataConsumer2.protocol, messagesSent : 0, bytesSent : 0 } @@ -124,18 +189,18 @@ test('dataConsumer.close() succeeds', async () => { const onObserverClose = jest.fn(); - dataConsumer.observer.once('close', onObserverClose); - dataConsumer.close(); + dataConsumer1.observer.once('close', onObserverClose); + dataConsumer1.close(); expect(onObserverClose).toHaveBeenCalledTimes(1); - expect(dataConsumer.closed).toBe(true); + expect(dataConsumer1.closed).toBe(true); await expect(router.dump()) .resolves .toMatchObject( { - mapDataProducerIdDataConsumerIds : { [dataProducer.id]: [] }, - mapDataConsumerIdDataProducerId : {} + mapDataProducerIdDataConsumerIds : { [dataProducer.id]: [ dataConsumer2.id ] }, + mapDataConsumerIdDataProducerId : { [dataConsumer2.id]: dataProducer.id } }); await expect(transport2.dump()) @@ -150,56 +215,56 @@ test('dataConsumer.close() succeeds', async () => test('Consumer methods reject if closed', async () => { - await expect(dataConsumer.dump()) + await expect(dataConsumer1.dump()) .rejects .toThrow(Error); - await expect(dataConsumer.getStats()) + await expect(dataConsumer1.getStats()) .rejects .toThrow(Error); }, 2000); test('DataConsumer emits "dataproducerclose" if DataProducer is closed', async () => { - dataConsumer = await transport2.consumeData( + dataConsumer1 = await transport2.consumeData( { dataProducerId : dataProducer.id }); const onObserverClose = jest.fn(); - dataConsumer.observer.once('close', onObserverClose); + dataConsumer1.observer.once('close', onObserverClose); await new Promise((resolve) => { - dataConsumer.on('dataproducerclose', resolve); + dataConsumer1.on('dataproducerclose', resolve); dataProducer.close(); }); expect(onObserverClose).toHaveBeenCalledTimes(1); - expect(dataConsumer.closed).toBe(true); + expect(dataConsumer1.closed).toBe(true); }, 2000); -test('Consumer emits "transportclose" if Transport is closed', async () => +test('DataConsumer emits "transportclose" if Transport is closed', async () => { dataProducer = await transport1.produceData(dataProducerParameters); - dataConsumer = await transport2.consumeData( + dataConsumer1 = await transport2.consumeData( { dataProducerId : dataProducer.id }); const onObserverClose = jest.fn(); - dataConsumer.observer.once('close', onObserverClose); + dataConsumer1.observer.once('close', onObserverClose); await new Promise((resolve) => { - dataConsumer.on('transportclose', resolve); + dataConsumer1.on('transportclose', resolve); transport2.close(); }); expect(onObserverClose).toHaveBeenCalledTimes(1); - expect(dataConsumer.closed).toBe(true); + expect(dataConsumer1.closed).toBe(true); await expect(router.dump()) .resolves diff --git a/worker/include/Channel/Request.hpp b/worker/include/Channel/Request.hpp index 8b5eae4d41..64d8ee39b6 100644 --- a/worker/include/Channel/Request.hpp +++ b/worker/include/Channel/Request.hpp @@ -28,6 +28,7 @@ namespace Channel ROUTER_CREATE_WEBRTC_TRANSPORT, ROUTER_CREATE_PLAIN_TRANSPORT, ROUTER_CREATE_PIPE_TRANSPORT, + ROUTER_CREATE_DIRECT_TRANSPORT, ROUTER_CREATE_AUDIO_LEVEL_OBSERVER, TRANSPORT_CLOSE, TRANSPORT_DUMP, diff --git a/worker/include/RTC/DataConsumer.hpp b/worker/include/RTC/DataConsumer.hpp index e820827835..5e65ca5aeb 100644 --- a/worker/include/RTC/DataConsumer.hpp +++ b/worker/include/RTC/DataConsumer.hpp @@ -33,7 +33,7 @@ namespace RTC const std::string& dataProducerId, RTC::DataConsumer::Listener* listener, json& data, - size_t maxSctpMessageSize); + size_t maxMessageSize); virtual ~DataConsumer(); public: @@ -73,7 +73,7 @@ namespace RTC private: // Passed by argument. RTC::DataConsumer::Listener* listener{ nullptr }; - size_t maxSctpMessageSize{ 0u }; + size_t maxMessageSize{ 0u }; // Others. Type type; std::string typeString; diff --git a/worker/include/RTC/DirectTransport.hpp b/worker/include/RTC/DirectTransport.hpp new file mode 100644 index 0000000000..70af3baa03 --- /dev/null +++ b/worker/include/RTC/DirectTransport.hpp @@ -0,0 +1,29 @@ +#ifndef MS_RTC_DIRECT_TRANSPORT_HPP +#define MS_RTC_DIRECT_TRANSPORT_HPP + +#include "RTC/Transport.hpp" + +namespace RTC +{ + class DirectTransport : public RTC::Transport + { + public: + DirectTransport(const std::string& id, RTC::Transport::Listener* listener, json& data); + ~DirectTransport() override; + + public: + void FillJson(json& jsonObject) const override; + void FillJsonStats(json& jsonArray) override; + void HandleRequest(Channel::Request* request) override; + void HandleNotification(PayloadChannel::Notification* notification) override; + + private: + bool IsConnected() const override; + void SendRtpPacket(RTC::RtpPacket* packet, RTC::Transport::onSendCallback* cb = nullptr) override; + void SendRtcpPacket(RTC::RTCP::Packet* packet) override; + void SendRtcpCompoundPacket(RTC::RTCP::CompoundPacket* packet) override; + void SendSctpData(const uint8_t* data, size_t len) override; + }; +} // namespace RTC + +#endif diff --git a/worker/include/RTC/SctpAssociation.hpp b/worker/include/RTC/SctpAssociation.hpp index b36a5e1dcc..563365a1fa 100644 --- a/worker/include/RTC/SctpAssociation.hpp +++ b/worker/include/RTC/SctpAssociation.hpp @@ -70,10 +70,6 @@ namespace RTC public: void FillJson(json& jsonObject) const; void TransportConnected(); - size_t GetMaxSctpMessageSize() const - { - return this->maxSctpMessageSize; - } SctpState GetState() const { return this->state; diff --git a/worker/include/RTC/Transport.hpp b/worker/include/RTC/Transport.hpp index c7a37618a9..7a1f7ac750 100644 --- a/worker/include/RTC/Transport.hpp +++ b/worker/include/RTC/Transport.hpp @@ -253,6 +253,7 @@ namespace RTC std::unordered_map mapDataConsumers; std::unordered_map mapSsrcConsumer; std::unordered_map mapRtxSsrcConsumer; + size_t maxMessageSize{ 262144u }; RTC::SctpAssociation* sctpAssociation{ nullptr }; Timer* rtcpTimer{ nullptr }; RTC::TransportCongestionControlClient* tccClient{ nullptr }; diff --git a/worker/include/Settings.hpp b/worker/include/Settings.hpp index 7b95c7c5ce..83633022ad 100644 --- a/worker/include/Settings.hpp +++ b/worker/include/Settings.hpp @@ -25,6 +25,7 @@ class Settings bool simulcast{ false }; bool svc{ false }; bool sctp{ false }; + bool message{ false }; }; public: diff --git a/worker/mediasoup-worker.gyp b/worker/mediasoup-worker.gyp index 6c88114c5d..ce7377e136 100644 --- a/worker/mediasoup-worker.gyp +++ b/worker/mediasoup-worker.gyp @@ -44,6 +44,7 @@ 'src/RTC/Consumer.cpp', 'src/RTC/DataConsumer.cpp', 'src/RTC/DataProducer.cpp', + 'src/RTC/DirectTransport.cpp', 'src/RTC/DtlsTransport.cpp', 'src/RTC/IceCandidate.cpp', 'src/RTC/IceServer.cpp', @@ -153,6 +154,7 @@ 'include/RTC/AudioLevelObserver.hpp', 'include/RTC/Consumer.hpp', 'include/RTC/DataConsumer.hpp', + 'include/RTC/DirectTransport.hpp', 'include/RTC/DataProducer.hpp', 'include/RTC/DtlsTransport.hpp', 'include/RTC/IceCandidate.hpp', diff --git a/worker/src/Channel/Request.cpp b/worker/src/Channel/Request.cpp index 17c0167496..53304b227c 100644 --- a/worker/src/Channel/Request.cpp +++ b/worker/src/Channel/Request.cpp @@ -22,6 +22,7 @@ namespace Channel { "router.createWebRtcTransport", Request::MethodId::ROUTER_CREATE_WEBRTC_TRANSPORT }, { "router.createPlainTransport", Request::MethodId::ROUTER_CREATE_PLAIN_TRANSPORT }, { "router.createPipeTransport", Request::MethodId::ROUTER_CREATE_PIPE_TRANSPORT }, + { "router.createDirectTransport", Request::MethodId::ROUTER_CREATE_DIRECT_TRANSPORT }, { "router.createAudioLevelObserver", Request::MethodId::ROUTER_CREATE_AUDIO_LEVEL_OBSERVER }, { "transport.close", Request::MethodId::TRANSPORT_CLOSE }, { "transport.dump", Request::MethodId::TRANSPORT_DUMP }, diff --git a/worker/src/RTC/DataConsumer.cpp b/worker/src/RTC/DataConsumer.cpp index 3a8bcf8ea4..fa89646d10 100644 --- a/worker/src/RTC/DataConsumer.cpp +++ b/worker/src/RTC/DataConsumer.cpp @@ -16,9 +16,8 @@ namespace RTC const std::string& dataProducerId, RTC::DataConsumer::Listener* listener, json& data, - size_t maxSctpMessageSize) - : id(id), dataProducerId(dataProducerId), listener(listener), - maxSctpMessageSize(maxSctpMessageSize) + size_t maxMessageSize) + : id(id), dataProducerId(dataProducerId), listener(listener), maxMessageSize(maxMessageSize) { MS_TRACE(); @@ -212,13 +211,13 @@ namespace RTC if (!IsActive()) return; - if (len > this->maxSctpMessageSize) + if (len > this->maxMessageSize) { MS_WARN_TAG( - sctp, - "given message exceeds maxSctpMessageSize value [maxSctpMessageSize:%zu, len:%zu]", + message, + "given message exceeds maxMessageSize value [maxMessageSize:%zu, len:%zu]", len, - this->maxSctpMessageSize); + this->maxMessageSize); return; } diff --git a/worker/src/RTC/DirectTransport.cpp b/worker/src/RTC/DirectTransport.cpp new file mode 100644 index 0000000000..8720d18fef --- /dev/null +++ b/worker/src/RTC/DirectTransport.cpp @@ -0,0 +1,96 @@ +#define MS_CLASS "RTC::DirectTransport" +// #define MS_LOG_DEV_LEVEL 3 + +#include "RTC/DirectTransport.hpp" +#include "Logger.hpp" +#include "MediaSoupErrors.hpp" + +namespace RTC +{ + /* Instance methods. */ + + // NOLINTNEXTLINE(cppcoreguidelines-pro-type-member-init) + DirectTransport::DirectTransport(const std::string& id, RTC::Transport::Listener* listener, json& data) + : RTC::Transport::Transport(id, listener, data) + { + MS_TRACE(); + + // A DirectTransport is always connected. + Transport::Connected(); + } + + DirectTransport::~DirectTransport() + { + MS_TRACE(); + } + + void DirectTransport::FillJson(json& jsonObject) const + { + MS_TRACE(); + + // Call the parent method. + RTC::Transport::FillJson(jsonObject); + } + + void DirectTransport::FillJsonStats(json& jsonArray) + { + MS_TRACE(); + + // Call the parent method. + RTC::Transport::FillJsonStats(jsonArray); + + auto& jsonObject = jsonArray[0]; + + // Add type. + jsonObject["type"] = "direct-transport"; + } + + void DirectTransport::HandleRequest(Channel::Request* request) + { + MS_TRACE(); + + // Pass it to the parent class. + RTC::Transport::HandleRequest(request); + } + + void DirectTransport::HandleNotification(PayloadChannel::Notification* notification) + { + MS_TRACE(); + + // Pass it to the parent class. + RTC::Transport::HandleNotification(notification); + } + + inline bool DirectTransport::IsConnected() const + { + return true; + } + + void DirectTransport::SendRtpPacket(RTC::RtpPacket* /*packet*/, RTC::Transport::onSendCallback* /*cb*/) + { + MS_TRACE(); + + // Do nothing. + } + + void DirectTransport::SendRtcpPacket(RTC::RTCP::Packet* /*packet*/) + { + MS_TRACE(); + + // Do nothing. + } + + void DirectTransport::SendRtcpCompoundPacket(RTC::RTCP::CompoundPacket* /*packet*/) + { + MS_TRACE(); + + // Do nothing. + } + + void DirectTransport::SendSctpData(const uint8_t* /*data*/, size_t /*len*/) + { + MS_TRACE(); + + // Do nothing. + } +} // namespace RTC diff --git a/worker/src/RTC/Router.cpp b/worker/src/RTC/Router.cpp index ee206688f3..0e5af5a55a 100644 --- a/worker/src/RTC/Router.cpp +++ b/worker/src/RTC/Router.cpp @@ -6,6 +6,7 @@ #include "MediaSoupErrors.hpp" #include "Utils.hpp" #include "RTC/AudioLevelObserver.hpp" +#include "RTC/DirectTransport.hpp" #include "RTC/PipeTransport.hpp" #include "RTC/PlainTransport.hpp" #include "RTC/WebRtcTransport.hpp" @@ -246,6 +247,29 @@ namespace RTC break; } + case Channel::Request::MethodId::ROUTER_CREATE_DIRECT_TRANSPORT: + { + std::string transportId; + + // This may throw + SetNewTransportIdFromInternal(request->internal, transportId); + + auto* directTransport = new RTC::DirectTransport(transportId, this, request->data); + + // Insert into the map. + this->mapTransports[transportId] = directTransport; + + MS_DEBUG_DEV("DirectTransport created [transportId:%s]", transportId.c_str()); + + json data = json::object(); + + directTransport->FillJson(data); + + request->Accept(data); + + break; + } + case Channel::Request::MethodId::ROUTER_CREATE_AUDIO_LEVEL_OBSERVER: { std::string rtpObserverId; diff --git a/worker/src/RTC/Transport.cpp b/worker/src/RTC/Transport.cpp index 69406575a9..ec73044989 100644 --- a/worker/src/RTC/Transport.cpp +++ b/worker/src/RTC/Transport.cpp @@ -6,6 +6,7 @@ #include "MediaSoupErrors.hpp" #include "Utils.hpp" #include "Channel/Notifier.hpp" +#include "PayloadChannel/Notifier.hpp" #include "RTC/BweType.hpp" #include "RTC/PipeConsumer.hpp" #include "RTC/RTCP/FeedbackPs.hpp" @@ -45,6 +46,21 @@ namespace RTC // clang-format on { this->direct = true; + + auto jsonMaxMessageSizeIt = data.find("maxMessageSize"); + + // maxSctpMessageSize is mandatory for direct Transports. + // clang-format off + if ( + jsonMaxMessageSizeIt == data.end() || + !Utils::Json::IsPositiveInteger(*jsonMaxMessageSizeIt) + ) + // clang-format on + { + MS_THROW_TYPE_ERROR("wrong maxMessageSize (not a number)"); + } + + this->maxMessageSize = jsonMaxMessageSizeIt->get(); } auto jsonInitialAvailableOutgoingBitrateIt = data.find("initialAvailableOutgoingBitrate"); @@ -115,7 +131,7 @@ namespace RTC MS_THROW_TYPE_ERROR("wrong maxSctpMessageSize (not a number)"); } - auto maxSctpMessageSize = jsonMaxSctpMessageSizeIt->get(); + this->maxMessageSize = jsonMaxSctpMessageSizeIt->get(); // isDataChannel is optional. bool isDataChannel{ false }; @@ -125,7 +141,7 @@ namespace RTC // This may throw. this->sctpAssociation = - new RTC::SctpAssociation(this, os, mis, maxSctpMessageSize, isDataChannel); + new RTC::SctpAssociation(this, os, mis, this->maxMessageSize, isDataChannel); } // Create the RTCP timer. @@ -364,6 +380,9 @@ namespace RTC // Add rtpListener. this->rtpListener.FillJson(jsonObject["rtpListener"]); + // Add maxMessageSize. + jsonObject["maxMessageSize"] = this->maxMessageSize; + if (this->sctpAssociation) { // Add sctpParameters. @@ -1037,11 +1056,7 @@ namespace RTC // This may throw. auto* dataConsumer = new RTC::DataConsumer( - dataConsumerId, - dataProducerId, - this, - request->data, - this->sctpAssociation ? this->sctpAssociation->GetMaxSctpMessageSize() : 0u); + dataConsumerId, dataProducerId, this, request->data, this->maxMessageSize); // Notify the listener. // This may throw if no DataProducer is found. @@ -1320,11 +1335,19 @@ namespace RTC auto* msg = notification->payload; auto len = notification->payloadLen; - // NOTE: If we had some maxMessageSize property in Transport, we may - // check it here. + if (len > this->maxMessageSize) + { + MS_WARN_TAG( + message, + "given message exceeds maxMessageSize value [maxMessageSize:%zu, len:%zu]", + len, + this->maxMessageSize); + + return; + } // Increase receive transmission. - RTC::Transport::DataReceived(len); + DataReceived(len); // Pass the message to the DataProducer. dataProducer->ReceiveMessage(ppid, msg, len); @@ -2502,9 +2525,26 @@ namespace RTC { MS_TRACE(); - MS_ASSERT(this->sctpAssociation, "no SCTP association"); + if (this->sctpAssociation) + { + this->sctpAssociation->SendSctpMessage(dataConsumer, ppid, msg, len); + } + else if (this->direct) + { + // Notify the Node DirectTransport. + json data = json::object(); + + data["ppid"] = ppid; - this->sctpAssociation->SendSctpMessage(dataConsumer, ppid, msg, len); + PayloadChannel::Notifier::Emit(dataConsumer->id, "message", data, msg, len); + + // Increase send transmission. + DataSent(len); + } + else + { + MS_ERROR("no SCTP association nor a direct Transport, cannot send messages"); + } } inline void Transport::OnDataConsumerDataProducerClosed(RTC::DataConsumer* dataConsumer) diff --git a/worker/src/RTC/WebRtcTransport.cpp b/worker/src/RTC/WebRtcTransport.cpp index bccdfecdf5..c4cffe2cbf 100644 --- a/worker/src/RTC/WebRtcTransport.cpp +++ b/worker/src/RTC/WebRtcTransport.cpp @@ -1103,7 +1103,9 @@ namespace RTC // If DTLS was already connected, notify the parent class. if (this->dtlsTransport->GetState() == RTC::DtlsTransport::DtlsState::CONNECTED) + { RTC::Transport::Connected(); + } } inline void WebRtcTransport::OnIceServerCompleted(const RTC::IceServer* /*iceServer*/) @@ -1124,7 +1126,9 @@ namespace RTC // If DTLS was already connected, notify the parent class. if (this->dtlsTransport->GetState() == RTC::DtlsTransport::DtlsState::CONNECTED) + { RTC::Transport::Connected(); + } } inline void WebRtcTransport::OnIceServerDisconnected(const RTC::IceServer* /*iceServer*/) @@ -1142,7 +1146,9 @@ namespace RTC // If DTLS was already connected, notify the parent class. if (this->dtlsTransport->GetState() == RTC::DtlsTransport::DtlsState::CONNECTED) + { RTC::Transport::Disconnected(); + } } inline void WebRtcTransport::OnDtlsTransportConnecting(const RTC::DtlsTransport* /*dtlsTransport*/) diff --git a/worker/src/Settings.cpp b/worker/src/Settings.cpp index 8774f3a66b..7c8a018c66 100644 --- a/worker/src/Settings.cpp +++ b/worker/src/Settings.cpp @@ -198,6 +198,8 @@ void Settings::PrintConfiguration() logTags.emplace_back("svc"); if (Settings::configuration.logTags.sctp) logTags.emplace_back("sctp"); + if (Settings::configuration.logTags.message) + logTags.emplace_back("message"); if (!logTags.empty()) { @@ -321,6 +323,8 @@ void Settings::SetLogTags(const std::vector& tags) newLogTags.svc = true; else if (tag == "sctp") newLogTags.sctp = true; + else if (tag == "message") + newLogTags.message = true; } Settings::configuration.logTags = newLogTags; From 06c614519fe951dd3433cefb49fe7c56d817087a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?I=C3=B1aki=20Baz=20Castillo?= Date: Fri, 29 May 2020 01:09:33 +0200 Subject: [PATCH 13/23] IT WORKS --- TODO_DATACHANNEL_TERMINATION.md | 8 + lib/DataConsumer.d.ts | 2 +- lib/DataConsumer.d.ts.map | 2 +- lib/DataConsumer.js | 7 +- src/DataConsumer.ts | 35 ++-- test/test-DirectTransport.js | 265 +++++++++++++++++++++++++++++ test/test-PlainTransport.js | 30 ++-- worker/src/RTC/DirectTransport.cpp | 3 - worker/src/RTC/Transport.cpp | 19 +-- 9 files changed, 322 insertions(+), 49 deletions(-) create mode 100644 test/test-DirectTransport.js diff --git a/TODO_DATACHANNEL_TERMINATION.md b/TODO_DATACHANNEL_TERMINATION.md index c3d5c58689..f3390bf6ac 100644 --- a/TODO_DATACHANNEL_TERMINATION.md +++ b/TODO_DATACHANNEL_TERMINATION.md @@ -1,5 +1,13 @@ # TODO DataChannel Termination + +## Implementation + +- Should we store somewhere a message received via `dataProducer.send()` when we deliver it to a `dataConsumer` (of type 'sctp' or 'direct')? + + +## Documentation + - Set proper max size for `netstring` messages in `PayloadChannel` (in JS and C++). It must match `maxSctpMessageSize` in `DataTransport.ts`. - `sctpStreamParameters` are now optional in `DataProducerOptions`. diff --git a/lib/DataConsumer.d.ts b/lib/DataConsumer.d.ts index 01add14de6..d2fa77b41e 100644 --- a/lib/DataConsumer.d.ts +++ b/lib/DataConsumer.d.ts @@ -57,7 +57,7 @@ export declare class DataConsumer extends EnhancedEventEmitter { * @private * @emits transportclose * @emits dataproducerclose - * @emits message - (message: string | Buffer, ppid: number) + * @emits message - (message: Buffer, ppid: number) * @emits @close * @emits @dataproducerclose */ diff --git a/lib/DataConsumer.d.ts.map b/lib/DataConsumer.d.ts.map index feba69b0c6..2b28e45440 100644 --- a/lib/DataConsumer.d.ts.map +++ b/lib/DataConsumer.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"DataConsumer.d.ts","sourceRoot":"","sources":["../src/DataConsumer.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAExD,oBAAY,mBAAmB,GAC/B;IACC;;OAEG;IACH,cAAc,EAAE,MAAM,CAAC;IAEvB;;;;;OAKG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAElB;;;;;OAKG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAE3B;;;;;OAKG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB;;OAEG;IACH,OAAO,CAAC,EAAE,GAAG,CAAC;CACd,CAAA;AAED,oBAAY,gBAAgB,GAC5B;IACC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;CAClB,CAAA;AAED;;GAEG;AACH,oBAAY,gBAAgB,GAAG,MAAM,GAAG,QAAQ,CAAC;AAIjD,qBAAa,YAAa,SAAQ,oBAAoB;IAGrD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAMxB;IAGF,OAAO,CAAC,QAAQ,CAAC,KAAK,CAMpB;IAGF,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAU;IAGnC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAiB;IAGjD,OAAO,CAAC,OAAO,CAAS;IAGxB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAM;IAGhC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA8B;IAExD;;;;;;;OAOG;gBAEF,EACC,QAAQ,EACR,IAAI,EACJ,OAAO,EACP,cAAc,EACd,OAAO,EACP,EACD;QACC,QAAQ,EAAE,GAAG,CAAC;QACd,IAAI,EAAE,GAAG,CAAC;QACV,OAAO,EAAE,OAAO,CAAC;QACjB,cAAc,EAAE,cAAc,CAAC;QAC/B,OAAO,EAAE,GAAG,CAAC;KACb;IAgBF;;OAEG;IACH,IAAI,EAAE,IAAI,MAAM,CAGf;IAED;;OAEG;IACH,IAAI,cAAc,IAAI,MAAM,CAG3B;IAED;;OAEG;IACH,IAAI,MAAM,IAAI,OAAO,CAGpB;IAED;;OAEG;IACH,IAAI,IAAI,IAAI,gBAAgB,CAG3B;IAED;;OAEG;IACH,IAAI,oBAAoB,IAAI,oBAAoB,GAAG,SAAS,CAG3D;IAED;;OAEG;IACH,IAAI,KAAK,IAAI,MAAM,CAGlB;IAED;;OAEG;IACH,IAAI,QAAQ,IAAI,MAAM,CAGrB;IAED;;OAEG;IACH,IAAI,OAAO,IAAI,GAAG,CAGjB;IAED;;OAEG;IACH,IAAI,OAAO,CAAC,OAAO,EAAE,GAAG,EAGvB;IAED;;;;OAIG;IACH,IAAI,QAAQ,IAAI,oBAAoB,CAGnC;IAED;;OAEG;IACH,KAAK,IAAI,IAAI;IAqBb;;;;OAIG;IACH,eAAe,IAAI,IAAI;IAkBvB;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC;IAO1B;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAO7C,OAAO,CAAC,0BAA0B;CAuDlC"} \ No newline at end of file +{"version":3,"file":"DataConsumer.d.ts","sourceRoot":"","sources":["../src/DataConsumer.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAExD,oBAAY,mBAAmB,GAC/B;IACC;;OAEG;IACH,cAAc,EAAE,MAAM,CAAC;IAEvB;;;;;OAKG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAElB;;;;;OAKG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAE3B;;;;;OAKG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB;;OAEG;IACH,OAAO,CAAC,EAAE,GAAG,CAAC;CACd,CAAA;AAED,oBAAY,gBAAgB,GAC5B;IACC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;CAClB,CAAA;AAED;;GAEG;AACH,oBAAY,gBAAgB,GAAG,MAAM,GAAG,QAAQ,CAAC;AAIjD,qBAAa,YAAa,SAAQ,oBAAoB;IAGrD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAMxB;IAGF,OAAO,CAAC,QAAQ,CAAC,KAAK,CAMpB;IAGF,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAU;IAGnC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAiB;IAGjD,OAAO,CAAC,OAAO,CAAS;IAGxB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAM;IAGhC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA8B;IAExD;;;;;;;OAOG;gBAEF,EACC,QAAQ,EACR,IAAI,EACJ,OAAO,EACP,cAAc,EACd,OAAO,EACP,EACD;QACC,QAAQ,EAAE,GAAG,CAAC;QACd,IAAI,EAAE,GAAG,CAAC;QACV,OAAO,EAAE,OAAO,CAAC;QACjB,cAAc,EAAE,cAAc,CAAC;QAC/B,OAAO,EAAE,GAAG,CAAC;KACb;IAgBF;;OAEG;IACH,IAAI,EAAE,IAAI,MAAM,CAGf;IAED;;OAEG;IACH,IAAI,cAAc,IAAI,MAAM,CAG3B;IAED;;OAEG;IACH,IAAI,MAAM,IAAI,OAAO,CAGpB;IAED;;OAEG;IACH,IAAI,IAAI,IAAI,gBAAgB,CAG3B;IAED;;OAEG;IACH,IAAI,oBAAoB,IAAI,oBAAoB,GAAG,SAAS,CAG3D;IAED;;OAEG;IACH,IAAI,KAAK,IAAI,MAAM,CAGlB;IAED;;OAEG;IACH,IAAI,QAAQ,IAAI,MAAM,CAGrB;IAED;;OAEG;IACH,IAAI,OAAO,IAAI,GAAG,CAGjB;IAED;;OAEG;IACH,IAAI,OAAO,CAAC,OAAO,EAAE,GAAG,EAGvB;IAED;;;;OAIG;IACH,IAAI,QAAQ,IAAI,oBAAoB,CAGnC;IAED;;OAEG;IACH,KAAK,IAAI,IAAI;IAqBb;;;;OAIG;IACH,eAAe,IAAI,IAAI;IAkBvB;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC;IAO1B;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAO7C,OAAO,CAAC,0BAA0B;CA0DlC"} \ No newline at end of file diff --git a/lib/DataConsumer.js b/lib/DataConsumer.js index 5b66d92287..c42760925b 100644 --- a/lib/DataConsumer.js +++ b/lib/DataConsumer.js @@ -8,7 +8,7 @@ class DataConsumer extends EnhancedEventEmitter_1.EnhancedEventEmitter { * @private * @emits transportclose * @emits dataproducerclose - * @emits message - (message: string | Buffer, ppid: number) + * @emits message - (message: Buffer, ppid: number) * @emits @close * @emits @dataproducerclose */ @@ -156,13 +156,14 @@ class DataConsumer extends EnhancedEventEmitter_1.EnhancedEventEmitter { } } }); - this._payloadChannel.on(this._internal.dataConsumerId, (event, data) => { + this._payloadChannel.on(this._internal.dataConsumerId, (event, data, payload) => { switch (event) { case 'message': { if (this._closed) break; - const { message, ppid } = data; + const ppid = data.ppid; + const message = payload; this.safeEmit('message', message, ppid); break; } diff --git a/src/DataConsumer.ts b/src/DataConsumer.ts index c07e477fe8..91f49224bc 100644 --- a/src/DataConsumer.ts +++ b/src/DataConsumer.ts @@ -97,7 +97,7 @@ export class DataConsumer extends EnhancedEventEmitter * @private * @emits transportclose * @emits dataproducerclose - * @emits message - (message: string | Buffer, ppid: number) + * @emits message - (message: Buffer, ppid: number) * @emits @close * @emits @dataproducerclose */ @@ -312,27 +312,30 @@ export class DataConsumer extends EnhancedEventEmitter } }); - this._payloadChannel.on(this._internal.dataConsumerId, (event: string, data?: any) => - { - switch (event) + this._payloadChannel.on( + this._internal.dataConsumerId, + (event: string, data: any | undefined, payload: Buffer) => { - case 'message': + switch (event) { - if (this._closed) - break; + case 'message': + { + if (this._closed) + break; - const { message, ppid } = data as { message: Buffer; ppid: number }; + const ppid = data.ppid as number; + const message = payload; - this.safeEmit('message', message, ppid); + this.safeEmit('message', message, ppid); - break; - } + break; + } - default: - { - logger.error('ignoring unknown event "%s"', event); + default: + { + logger.error('ignoring unknown event "%s"', event); + } } - } - }); + }); } } diff --git a/test/test-DirectTransport.js b/test/test-DirectTransport.js new file mode 100644 index 0000000000..f4d9edf709 --- /dev/null +++ b/test/test-DirectTransport.js @@ -0,0 +1,265 @@ +const { toBeType } = require('jest-tobetype'); +const mediasoup = require('../'); +const { createWorker } = mediasoup; + +expect.extend({ toBeType }); + +let worker; +let router; +let transport; + +beforeAll(async () => +{ + worker = await createWorker(); + router = await worker.createRouter(); +}); + +afterAll(() => worker.close()); + +beforeEach(async () => +{ + transport = await router.createDirectTransport(); +}); + +afterEach(() => transport.close()); + +test('router.createDirectTransport() succeeds', async () => +{ + await expect(router.dump()) + .resolves + .toMatchObject({ transportIds: [ transport.id ] }); + + const onObserverNewTransport = jest.fn(); + + router.observer.once('newtransport', onObserverNewTransport); + + // Create a separate transport here. + const transport1 = await router.createDirectTransport( + { + maxMessageSize : 1024, + appData : { foo: 'bar' } + }); + + expect(onObserverNewTransport).toHaveBeenCalledTimes(1); + expect(onObserverNewTransport).toHaveBeenCalledWith(transport1); + expect(transport1.id).toBeType('string'); + expect(transport1.closed).toBe(false); + expect(transport1.appData).toEqual({ foo: 'bar' }); + + const data1 = await transport1.dump(); + + expect(data1.id).toBe(transport1.id); + expect(data1.direct).toBe(true); + expect(data1.producerIds).toEqual([]); + expect(data1.consumerIds).toEqual([]); + expect(data1.dataProducerIds).toEqual([]); + expect(data1.dataConsumerIds).toEqual([]); + expect(data1.recvRtpHeaderExtensions).toBeType('object'); + expect(data1.rtpListener).toBeType('object'); + + transport1.close(); + expect(transport1.closed).toBe(true); + + await expect(router.createDirectTransport()) + .resolves + .toBeType('object'); +}, 2000); + +test('router.createDirectTransport() with wrong arguments rejects with TypeError', async () => +{ + await expect(router.createDirectTransport({ maxMessageSize: 'foo' })) + .rejects + .toThrow(TypeError); + + await expect(router.createDirectTransport({ maxMessageSize: -2000 })) + .rejects + .toThrow(TypeError); +}, 2000); + +test('directTransport.getStats() succeeds', async () => +{ + const data = await transport.getStats(); + + expect(data).toBeType('array'); + expect(data.length).toBe(1); + expect(data[0].type).toBe('direct-transport'); + expect(data[0].transportId).toBeType('string'); + expect(data[0].timestamp).toBeType('number'); + expect(data[0].bytesReceived).toBe(0); + expect(data[0].recvBitrate).toBe(0); + expect(data[0].bytesSent).toBe(0); + expect(data[0].sendBitrate).toBe(0); + expect(data[0].rtpBytesReceived).toBe(0); + expect(data[0].rtpRecvBitrate).toBe(0); + expect(data[0].rtpBytesSent).toBe(0); + expect(data[0].rtpSendBitrate).toBe(0); + expect(data[0].rtxBytesReceived).toBe(0); + expect(data[0].rtxRecvBitrate).toBe(0); + expect(data[0].rtxBytesSent).toBe(0); + expect(data[0].rtxSendBitrate).toBe(0); + expect(data[0].probationBytesSent).toBe(0); + expect(data[0].probationSendBitrate).toBe(0); + expect(data[0].recvBitrate).toBe(0); + expect(data[0].sendBitrate).toBe(0); +}, 2000); + +test('directTransport.connect() succeeds', async () => +{ + await expect(transport.connect()) + .resolves + .toBeUndefined(); +}, 2000); + +test('dataProducer.send() succeeds', async () => +{ + const transport2 = await router.createDirectTransport(); + const dataProducer = await transport2.produceData( + { + label : 'foo', + protocol : 'bar', + appData : { foo: 'bar' } + }); + const dataConsumer = await transport2.consumeData( + { + dataProducerId : dataProducer.id + }); + const numMessages = 200; + let sentMessageBytes = 0; + let recvMessageBytes = 0; + let lastSentMessageId = 0; + let lastRecvMessageId = 0; + + await new Promise((resolve) => + { + // Send messages over the sctpSendStream created above. + const interval = setInterval(() => + { + const id = ++lastSentMessageId; + let ppid; + let message; + + // Set ppid of type WebRTC DataChannel string or binary. + if (id < numMessages / 2) + { + ppid = 51; + message = String(id); + } + else + { + ppid = 53; + message = Buffer.from(String(id)); + } + + dataProducer.send(message, ppid); + sentMessageBytes += Buffer.from(message).byteLength; + + if (id === numMessages) + clearInterval(interval); + }, 0); + + dataConsumer.on('message', (message, ppid) => + { + // message is always a Buffer. + recvMessageBytes += message.byteLength; + + const id = Number(message.toString('utf8')); + + if (id === numMessages) + { + clearInterval(interval); + resolve(); + } + + if (id < numMessages / 2) + expect(ppid).toBe(51); + else + expect(ppid).toBe(53); + + expect(id).toBe(++lastRecvMessageId); + }); + }); + + expect(lastSentMessageId).toBe(numMessages); + expect(lastRecvMessageId).toBe(numMessages); + expect(recvMessageBytes).toBe(sentMessageBytes); + + await expect(dataProducer.getStats()) + .resolves + .toMatchObject( + [ + { + type : 'data-producer', + label : dataProducer.label, + protocol : dataProducer.protocol, + messagesReceived : numMessages, + bytesReceived : sentMessageBytes + } + ]); + + await expect(dataConsumer.getStats()) + .resolves + .toMatchObject( + [ + { + type : 'data-consumer', + label : dataConsumer.label, + protocol : dataConsumer.protocol, + messagesSent : numMessages, + bytesSent : recvMessageBytes + } + ]); +}, 5000); + +test('DirectTransport methods reject if closed', async () => +{ + const onObserverClose = jest.fn(); + + transport.observer.once('close', onObserverClose); + transport.close(); + + expect(onObserverClose).toHaveBeenCalledTimes(1); + expect(transport.closed).toBe(true); + + await expect(transport.dump()) + .rejects + .toThrow(Error); + + await expect(transport.getStats()) + .rejects + .toThrow(Error); +}, 2000); + +test('DirectTransport emits "routerclose" if Router is closed', async () => +{ + // We need different Router and DirectTransport instances here. + const router2 = await worker.createRouter(); + const transport2 = await router2.createDirectTransport(); + const onObserverClose = jest.fn(); + + transport2.observer.once('close', onObserverClose); + + await new Promise((resolve) => + { + transport2.on('routerclose', resolve); + router2.close(); + }); + + expect(onObserverClose).toHaveBeenCalledTimes(1); + expect(transport2.closed).toBe(true); +}, 2000); + +test('DirectTransport emits "routerclose" if Worker is closed', async () => +{ + const onObserverClose = jest.fn(); + + transport.observer.once('close', onObserverClose); + + await new Promise((resolve) => + { + transport.on('routerclose', resolve); + worker.close(); + }); + + expect(onObserverClose).toHaveBeenCalledTimes(1); + expect(transport.closed).toBe(true); +}, 2000); diff --git a/test/test-PlainTransport.js b/test/test-PlainTransport.js index b5f5d10242..d0078c973c 100644 --- a/test/test-PlainTransport.js +++ b/test/test-PlainTransport.js @@ -332,21 +332,6 @@ test('plainTransport.getStats() succeeds', async () => test('plainTransport.connect() succeeds', async () => { - // No SRTP enabled so passing srtpParameters must fail. - await expect(transport.connect( - { - ip : '127.0.0.2', - port : 9998, - rtcpPort : 9999, - srtpParameters : - { - cryptoSuite : 'AES_CM_128_HMAC_SHA1_80', - keyBase64 : 'ZnQ3eWJraDg0d3ZoYzM5cXN1Y2pnaHU5NWxrZTVv' - } - })) - .rejects - .toThrow(TypeError); - await expect(transport.connect({ ip: '1.2.3.4', port: 1234, rtcpPort: 1235 })) .resolves .toBeUndefined(); @@ -366,6 +351,21 @@ test('plainTransport.connect() succeeds', async () => test('plainTransport.connect() with wrong arguments rejects with TypeError', async () => { + // No SRTP enabled so passing srtpParameters must fail. + await expect(transport.connect( + { + ip : '127.0.0.2', + port : 9998, + rtcpPort : 9999, + srtpParameters : + { + cryptoSuite : 'AES_CM_128_HMAC_SHA1_80', + keyBase64 : 'ZnQ3eWJraDg0d3ZoYzM5cXN1Y2pnaHU5NWxrZTVv' + } + })) + .rejects + .toThrow(TypeError); + await expect(transport.connect({})) .rejects .toThrow(TypeError); diff --git a/worker/src/RTC/DirectTransport.cpp b/worker/src/RTC/DirectTransport.cpp index 8720d18fef..4d2266e263 100644 --- a/worker/src/RTC/DirectTransport.cpp +++ b/worker/src/RTC/DirectTransport.cpp @@ -14,9 +14,6 @@ namespace RTC : RTC::Transport::Transport(id, listener, data) { MS_TRACE(); - - // A DirectTransport is always connected. - Transport::Connected(); } DirectTransport::~DirectTransport() diff --git a/worker/src/RTC/Transport.cpp b/worker/src/RTC/Transport.cpp index ec73044989..dfd2c38bcc 100644 --- a/worker/src/RTC/Transport.cpp +++ b/worker/src/RTC/Transport.cpp @@ -1085,13 +1085,15 @@ namespace RTC request->Accept(data); + if (IsConnected()) + dataConsumer->TransportConnected(); + if (this->sctpAssociation) { - if (IsConnected()) - dataConsumer->TransportConnected(); - if (this->sctpAssociation->GetState() == RTC::SctpAssociation::SctpState::CONNECTED) + { dataConsumer->SctpAssociationConnected(); + } // Tell to the SCTP association. this->sctpAssociation->HandleDataConsumer(dataConsumer); @@ -1374,15 +1376,12 @@ namespace RTC consumer->TransportConnected(); } - // Tell all DataConsumers of SCTP type. - if (this->sctpAssociation) + // Tell all DataConsumers. + for (auto& kv : this->mapDataConsumers) { - for (auto& kv : this->mapDataConsumers) - { - auto* dataConsumer = kv.second; + auto* dataConsumer = kv.second; - dataConsumer->TransportConnected(); - } + dataConsumer->TransportConnected(); } // Tell the SctpAssociation. From 275aa144fb58bf6aa668b9f56c2138f8d21497fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?I=C3=B1aki=20Baz=20Castillo?= Date: Fri, 29 May 2020 01:46:46 +0200 Subject: [PATCH 14/23] Thanks Codacy --- lib/DataProducer.d.ts.map | 2 +- lib/DataProducer.js | 3 +++ src/DataProducer.ts | 5 +++++ worker/include/PayloadChannel/Notification.hpp | 2 +- 4 files changed, 10 insertions(+), 2 deletions(-) diff --git a/lib/DataProducer.d.ts.map b/lib/DataProducer.d.ts.map index c16c53165c..815ac45ef7 100644 --- a/lib/DataProducer.d.ts.map +++ b/lib/DataProducer.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"DataProducer.d.ts","sourceRoot":"","sources":["../src/DataProducer.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAExD,oBAAY,mBAAmB,GAC/B;IACC;;OAEG;IACH,EAAE,CAAC,EAAE,MAAM,CAAC;IAEZ;;;OAGG;IACH,oBAAoB,CAAC,EAAE,oBAAoB,CAAC;IAE5C;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;OAEG;IACH,OAAO,CAAC,EAAE,GAAG,CAAC;CACd,CAAA;AAED,oBAAY,gBAAgB,GAC5B;IACC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,EAAE,MAAM,CAAC;IACzB,aAAa,EAAE,MAAM,CAAC;CACtB,CAAA;AAED;;GAEG;AACH,oBAAY,gBAAgB,GAAG,MAAM,GAAG,QAAQ,CAAC;AAIjD,qBAAa,YAAa,SAAQ,oBAAoB;IAGrD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAKxB;IAGF,OAAO,CAAC,QAAQ,CAAC,KAAK,CAMpB;IAGF,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAU;IAGnC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAiB;IAGjD,OAAO,CAAC,OAAO,CAAS;IAGxB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAM;IAGhC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA8B;IAExD;;;;OAIG;gBAEF,EACC,QAAQ,EACR,IAAI,EACJ,OAAO,EACP,cAAc,EACd,OAAO,EACP,EACD;QACC,QAAQ,EAAE,GAAG,CAAC;QACd,IAAI,EAAE,GAAG,CAAC;QACV,OAAO,EAAE,OAAO,CAAC;QACjB,cAAc,EAAE,cAAc,CAAC;QAC/B,OAAO,EAAE,GAAG,CAAC;KACb;IAgBF;;OAEG;IACH,IAAI,EAAE,IAAI,MAAM,CAGf;IAED;;OAEG;IACH,IAAI,MAAM,IAAI,OAAO,CAGpB;IAED;;OAEG;IACH,IAAI,IAAI,IAAI,gBAAgB,CAG3B;IAED;;OAEG;IACH,IAAI,oBAAoB,IAAI,oBAAoB,GAAG,SAAS,CAG3D;IAED;;OAEG;IACH,IAAI,KAAK,IAAI,MAAM,CAGlB;IAED;;OAEG;IACH,IAAI,QAAQ,IAAI,MAAM,CAGrB;IAED;;OAEG;IACH,IAAI,OAAO,IAAI,GAAG,CAGjB;IAED;;OAEG;IACH,IAAI,OAAO,CAAC,OAAO,EAAE,GAAG,EAGvB;IAED;;;;OAIG;IACH,IAAI,QAAQ,IAAI,oBAAoB,CAGnC;IAED;;OAEG;IACH,KAAK,IAAI,IAAI;IAqBb;;;;OAIG;IACH,eAAe,IAAI,IAAI;IAevB;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC;IAO1B;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAO7C;;OAEG;IACH,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI;IAuCnD,OAAO,CAAC,0BAA0B;CAIlC"} \ No newline at end of file +{"version":3,"file":"DataProducer.d.ts","sourceRoot":"","sources":["../src/DataProducer.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAExD,oBAAY,mBAAmB,GAC/B;IACC;;OAEG;IACH,EAAE,CAAC,EAAE,MAAM,CAAC;IAEZ;;;OAGG;IACH,oBAAoB,CAAC,EAAE,oBAAoB,CAAC;IAE5C;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;OAEG;IACH,OAAO,CAAC,EAAE,GAAG,CAAC;CACd,CAAA;AAED,oBAAY,gBAAgB,GAC5B;IACC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,EAAE,MAAM,CAAC;IACzB,aAAa,EAAE,MAAM,CAAC;CACtB,CAAA;AAED;;GAEG;AACH,oBAAY,gBAAgB,GAAG,MAAM,GAAG,QAAQ,CAAC;AAIjD,qBAAa,YAAa,SAAQ,oBAAoB;IAGrD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAKxB;IAGF,OAAO,CAAC,QAAQ,CAAC,KAAK,CAMpB;IAGF,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAU;IAGnC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAiB;IAGjD,OAAO,CAAC,OAAO,CAAS;IAGxB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAM;IAGhC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA8B;IAExD;;;;OAIG;gBAEF,EACC,QAAQ,EACR,IAAI,EACJ,OAAO,EACP,cAAc,EACd,OAAO,EACP,EACD;QACC,QAAQ,EAAE,GAAG,CAAC;QACd,IAAI,EAAE,GAAG,CAAC;QACV,OAAO,EAAE,OAAO,CAAC;QACjB,cAAc,EAAE,cAAc,CAAC;QAC/B,OAAO,EAAE,GAAG,CAAC;KACb;IAgBF;;OAEG;IACH,IAAI,EAAE,IAAI,MAAM,CAGf;IAED;;OAEG;IACH,IAAI,MAAM,IAAI,OAAO,CAGpB;IAED;;OAEG;IACH,IAAI,IAAI,IAAI,gBAAgB,CAG3B;IAED;;OAEG;IACH,IAAI,oBAAoB,IAAI,oBAAoB,GAAG,SAAS,CAG3D;IAED;;OAEG;IACH,IAAI,KAAK,IAAI,MAAM,CAGlB;IAED;;OAEG;IACH,IAAI,QAAQ,IAAI,MAAM,CAGrB;IAED;;OAEG;IACH,IAAI,OAAO,IAAI,GAAG,CAGjB;IAED;;OAEG;IACH,IAAI,OAAO,CAAC,OAAO,EAAE,GAAG,EAGvB;IAED;;;;OAIG;IACH,IAAI,QAAQ,IAAI,oBAAoB,CAGnC;IAED;;OAEG;IACH,KAAK,IAAI,IAAI;IAqBb;;;;OAIG;IACH,eAAe,IAAI,IAAI;IAevB;;OAEG;IACG,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC;IAO1B;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAO7C;;OAEG;IACH,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI;IA4CnD,OAAO,CAAC,0BAA0B;CAIlC"} \ No newline at end of file diff --git a/lib/DataProducer.js b/lib/DataProducer.js index 8dac37d558..6d2f93e1a5 100644 --- a/lib/DataProducer.js +++ b/lib/DataProducer.js @@ -128,6 +128,9 @@ class DataProducer extends EnhancedEventEmitter_1.EnhancedEventEmitter { */ send(message, ppid) { logger.debug('send()'); + if (typeof message !== 'string' && !Buffer.isBuffer(message)) { + throw new TypeError('message must be a string or a Buffer'); + } /* * +-------------------------------+----------+ * | Value | SCTP | diff --git a/src/DataProducer.ts b/src/DataProducer.ts index b8f5618cf0..5a8dcbda3e 100644 --- a/src/DataProducer.ts +++ b/src/DataProducer.ts @@ -264,6 +264,11 @@ export class DataProducer extends EnhancedEventEmitter { logger.debug('send()'); + if (typeof message !== 'string' && !Buffer.isBuffer(message)) + { + throw new TypeError('message must be a string or a Buffer'); + } + /* * +-------------------------------+----------+ * | Value | SCTP | diff --git a/worker/include/PayloadChannel/Notification.hpp b/worker/include/PayloadChannel/Notification.hpp index 4a879501d8..a373c834d9 100644 --- a/worker/include/PayloadChannel/Notification.hpp +++ b/worker/include/PayloadChannel/Notification.hpp @@ -22,7 +22,7 @@ namespace PayloadChannel static std::unordered_map string2EventId; public: - Notification(json& jsonNotification); + explicit Notification(json& jsonNotification); virtual ~Notification(); public: From c45cf895ef15c15bbc5f3dba9135ec20a339fe85 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?I=C3=B1aki=20Baz=20Castillo?= Date: Fri, 29 May 2020 11:30:23 +0200 Subject: [PATCH 15/23] Update src/Worker.ts MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: José Luis Millán --- src/Worker.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Worker.ts b/src/Worker.ts index dd89aac21b..d4dd13f00f 100644 --- a/src/Worker.ts +++ b/src/Worker.ts @@ -264,7 +264,7 @@ export class Worker extends EnhancedEventEmitter // fd 2 (stderr) : Same as stdout. // fd 3 (channel) : Producer Channel fd. // fd 4 (channel) : Consumer Channel fd. - // fd 3 (channel) : Producer PayloadChannel fd. + // fd 5 (channel) : Producer PayloadChannel fd. // fd 4 (channel) : Consumer PayloadChannel fd. stdio : [ 'ignore', 'pipe', 'pipe', 'pipe', 'pipe', 'pipe', 'pipe' ] }); From f00fa2744a2ae2dc816a7de80d160faa7f405988 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?I=C3=B1aki=20Baz=20Castillo?= Date: Fri, 29 May 2020 11:30:44 +0200 Subject: [PATCH 16/23] Update src/Worker.ts MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: José Luis Millán --- src/Worker.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Worker.ts b/src/Worker.ts index d4dd13f00f..26520b0f0b 100644 --- a/src/Worker.ts +++ b/src/Worker.ts @@ -265,7 +265,7 @@ export class Worker extends EnhancedEventEmitter // fd 3 (channel) : Producer Channel fd. // fd 4 (channel) : Consumer Channel fd. // fd 5 (channel) : Producer PayloadChannel fd. - // fd 4 (channel) : Consumer PayloadChannel fd. + // fd 6 (channel) : Consumer PayloadChannel fd. stdio : [ 'ignore', 'pipe', 'pipe', 'pipe', 'pipe', 'pipe', 'pipe' ] }); From 6f6caf184b23b28c7e4b468ad9a5a36e2ce7b32b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?I=C3=B1aki=20Baz=20Castillo?= Date: Fri, 29 May 2020 11:31:03 +0200 Subject: [PATCH 17/23] Fix src/DirectTransport.ts MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: José Luis Millán --- src/DirectTransport.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/DirectTransport.ts b/src/DirectTransport.ts index b3d75069ac..7b4a315859 100644 --- a/src/DirectTransport.ts +++ b/src/DirectTransport.ts @@ -162,9 +162,9 @@ export class DirectTransport extends Transport * @override */ // eslint-disable-next-line @typescript-eslint/no-unused-vars - async consumer(options: ConsumerOptions): Promise + async consume(options: ConsumerOptions): Promise { - throw new UnsupportedError('consumer() not implemented in DirectTransport'); + throw new UnsupportedError('consume() not implemented in DirectTransport'); } private _handleWorkerNotifications(): void From 407c9e62369b1cc1a37d143ba8d906e1a376df64 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?I=C3=B1aki=20Baz=20Castillo?= Date: Fri, 29 May 2020 11:31:16 +0200 Subject: [PATCH 18/23] Update worker/include/RTC/Transport.hpp MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: José Luis Millán --- worker/include/RTC/Transport.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/worker/include/RTC/Transport.hpp b/worker/include/RTC/Transport.hpp index 7a1f7ac750..d7714557f8 100644 --- a/worker/include/RTC/Transport.hpp +++ b/worker/include/RTC/Transport.hpp @@ -117,7 +117,7 @@ namespace RTC // Subclasses must also invoke the parent Close(). virtual void FillJson(json& jsonObject) const; virtual void FillJsonStats(json& jsonArray); - // Subclasses must implement these method and call the parent's one to + // Subclasses must implement these methods and call the parent's ones to // handle common requests. virtual void HandleRequest(Channel::Request* request); virtual void HandleNotification(PayloadChannel::Notification* notification); From 0aef6893b8821a46ea2843087c9c7abb06fac92f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?I=C3=B1aki=20Baz=20Castillo?= Date: Fri, 29 May 2020 11:31:46 +0200 Subject: [PATCH 19/23] Update worker/src/PayloadChannel/Notification.cpp MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: José Luis Millán --- worker/src/PayloadChannel/Notification.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/worker/src/PayloadChannel/Notification.cpp b/worker/src/PayloadChannel/Notification.cpp index 998275404b..070187f712 100644 --- a/worker/src/PayloadChannel/Notification.cpp +++ b/worker/src/PayloadChannel/Notification.cpp @@ -11,10 +11,10 @@ namespace PayloadChannel /* Class variables. */ // clang-format off - std::unordered_map Notification::string2EventId = - { - { "dataProducer.send", Notification::EventId::DATA_PRODUCER_SEND } - }; + std::unordered_map Notification::string2EventId = + { + { "dataProducer.send", Notification::EventId::DATA_PRODUCER_SEND } + }; // clang-format on /* Instance methods. */ From cb949fa6e1460a2c7a20baa4c695d2bfc70dd10b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?I=C3=B1aki=20Baz=20Castillo?= Date: Fri, 29 May 2020 11:36:56 +0200 Subject: [PATCH 20/23] Cosmetic --- CHANGELOG.md | 4 ++++ test/test-DirectTransport.js | 9 ++++----- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1670673127..d9a0ccf549 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,10 @@ ### 3.5.16 (WIP) +* DataChannel termination: + - PR #409 + - Allow the Node application to directly send text/binary messages to mediasoup-worker C++ process so others can consume them using `DataConsumers`. + - And vice-versa: allow the Node application to directly consume in Node messages send by `DataProducers`. * Update `Catch2` to v2.12.2. diff --git a/test/test-DirectTransport.js b/test/test-DirectTransport.js index f4d9edf709..b65b605d42 100644 --- a/test/test-DirectTransport.js +++ b/test/test-DirectTransport.js @@ -138,15 +138,14 @@ test('dataProducer.send() succeeds', async () => let ppid; let message; - // Set ppid of type WebRTC DataChannel string or binary. + // Send string (WebRTC DataChannel string). if (id < numMessages / 2) { - ppid = 51; message = String(id); } + // Send string (WebRTC DataChannel binary). else { - ppid = 53; message = Buffer.from(String(id)); } @@ -171,9 +170,9 @@ test('dataProducer.send() succeeds', async () => } if (id < numMessages / 2) - expect(ppid).toBe(51); + expect(ppid).toBe(51); // PPID of WebRTC DataChannel string. else - expect(ppid).toBe(53); + expect(ppid).toBe(53); // PPID of WebRTC DataChannel binary. expect(id).toBe(++lastRecvMessageId); }); From bc432e496c93dfb450a12f1fb6de054db84b50cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?I=C3=B1aki=20Baz=20Castillo?= Date: Fri, 29 May 2020 11:38:31 +0200 Subject: [PATCH 21/23] Merge from remote --- lib/DirectTransport.d.ts | 2 +- lib/DirectTransport.d.ts.map | 2 +- lib/DirectTransport.js | 4 ++-- lib/Worker.js | 4 ++-- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/lib/DirectTransport.d.ts b/lib/DirectTransport.d.ts index f5c83c312f..f8fbf9af37 100644 --- a/lib/DirectTransport.d.ts +++ b/lib/DirectTransport.d.ts @@ -89,7 +89,7 @@ export declare class DirectTransport extends Transport { /** * @override */ - consumer(options: ConsumerOptions): Promise; + consume(options: ConsumerOptions): Promise; private _handleWorkerNotifications; } //# sourceMappingURL=DirectTransport.d.ts.map \ No newline at end of file diff --git a/lib/DirectTransport.d.ts.map b/lib/DirectTransport.d.ts.map index b0a5d5a04b..cd0f597c03 100644 --- a/lib/DirectTransport.d.ts.map +++ b/lib/DirectTransport.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"DirectTransport.d.ts","sourceRoot":"","sources":["../src/DirectTransport.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAE9D,OAAO,EAAE,SAAS,EAA2B,MAAM,aAAa,CAAC;AACjE,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AACvD,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAEvD,oBAAY,sBAAsB,GAClC;IACC;;OAEG;IACH,cAAc,EAAE,MAAM,CAAC;IAEvB;;OAEG;IACH,OAAO,CAAC,EAAE,GAAG,CAAC;CACd,CAAA;AAED,oBAAY,mBAAmB,GAC/B;IAEC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,sBAAsB,EAAE,MAAM,CAAC;IAC/B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC5B,CAAA;AAID,qBAAa,eAAgB,SAAQ,SAAS;IAG7C,SAAS,CAAC,QAAQ,CAAC,KAAK,EACxB,EAEC,CAAC;IAEF;;;OAGG;gBACS,MAAM,EAAE,GAAG;IAiBvB;;;;;;;;OAQG;IACH,IAAI,QAAQ,IAAI,oBAAoB,CAGnC;IAED;;;;OAIG;IACH,KAAK,IAAI,IAAI;IAQb;;;;;OAKG;IACH,YAAY,IAAI,IAAI;IAQpB;;;;OAIG;IACG,QAAQ,IAAI,OAAO,CAAC,mBAAmB,EAAE,CAAC;IAOhD;;;;OAIG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAK9B;;OAEG;IAEG,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAM3D;;OAEG;IAEG,OAAO,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,QAAQ,CAAC;IAK1D;;OAEG;IAEG,QAAQ,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,QAAQ,CAAC;IAK3D,OAAO,CAAC,0BAA0B;CAyBlC"} \ No newline at end of file +{"version":3,"file":"DirectTransport.d.ts","sourceRoot":"","sources":["../src/DirectTransport.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAE9D,OAAO,EAAE,SAAS,EAA2B,MAAM,aAAa,CAAC;AACjE,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AACvD,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAEvD,oBAAY,sBAAsB,GAClC;IACC;;OAEG;IACH,cAAc,EAAE,MAAM,CAAC;IAEvB;;OAEG;IACH,OAAO,CAAC,EAAE,GAAG,CAAC;CACd,CAAA;AAED,oBAAY,mBAAmB,GAC/B;IAEC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,sBAAsB,EAAE,MAAM,CAAC;IAC/B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,oBAAoB,EAAE,MAAM,CAAC;IAC7B,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC5B,CAAA;AAID,qBAAa,eAAgB,SAAQ,SAAS;IAG7C,SAAS,CAAC,QAAQ,CAAC,KAAK,EACxB,EAEC,CAAC;IAEF;;;OAGG;gBACS,MAAM,EAAE,GAAG;IAiBvB;;;;;;;;OAQG;IACH,IAAI,QAAQ,IAAI,oBAAoB,CAGnC;IAED;;;;OAIG;IACH,KAAK,IAAI,IAAI;IAQb;;;;;OAKG;IACH,YAAY,IAAI,IAAI;IAQpB;;;;OAIG;IACG,QAAQ,IAAI,OAAO,CAAC,mBAAmB,EAAE,CAAC;IAOhD;;;;OAIG;IACG,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAK9B;;OAEG;IAEG,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAM3D;;OAEG;IAEG,OAAO,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,QAAQ,CAAC;IAK1D;;OAEG;IAEG,OAAO,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,QAAQ,CAAC;IAK1D,OAAO,CAAC,0BAA0B;CAyBlC"} \ No newline at end of file diff --git a/lib/DirectTransport.js b/lib/DirectTransport.js index f58d5b0bcd..5cfd8a6bd1 100644 --- a/lib/DirectTransport.js +++ b/lib/DirectTransport.js @@ -88,8 +88,8 @@ class DirectTransport extends Transport_1.Transport { * @override */ // eslint-disable-next-line @typescript-eslint/no-unused-vars - async consumer(options) { - throw new errors_1.UnsupportedError('consumer() not implemented in DirectTransport'); + async consume(options) { + throw new errors_1.UnsupportedError('consume() not implemented in DirectTransport'); } _handleWorkerNotifications() { this._channel.on(this._internal.transportId, (event, data) => { diff --git a/lib/Worker.js b/lib/Worker.js index 6558572b43..4df566b13f 100644 --- a/lib/Worker.js +++ b/lib/Worker.js @@ -82,8 +82,8 @@ class Worker extends EnhancedEventEmitter_1.EnhancedEventEmitter { // fd 2 (stderr) : Same as stdout. // fd 3 (channel) : Producer Channel fd. // fd 4 (channel) : Consumer Channel fd. - // fd 3 (channel) : Producer PayloadChannel fd. - // fd 4 (channel) : Consumer PayloadChannel fd. + // fd 5 (channel) : Producer PayloadChannel fd. + // fd 6 (channel) : Consumer PayloadChannel fd. stdio: ['ignore', 'pipe', 'pipe', 'pipe', 'pipe', 'pipe', 'pipe'] }); this._pid = this._child.pid; From 22410e1d3874cfb308c0c1ce4b04309b3333afdd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?I=C3=B1aki=20Baz=20Castillo?= Date: Fri, 29 May 2020 11:39:01 +0200 Subject: [PATCH 22/23] Remove TODO_DATACHANNEL_TERMINATION.md --- TODO_DATACHANNEL_TERMINATION.md | 27 --------------------------- 1 file changed, 27 deletions(-) delete mode 100644 TODO_DATACHANNEL_TERMINATION.md diff --git a/TODO_DATACHANNEL_TERMINATION.md b/TODO_DATACHANNEL_TERMINATION.md deleted file mode 100644 index f3390bf6ac..0000000000 --- a/TODO_DATACHANNEL_TERMINATION.md +++ /dev/null @@ -1,27 +0,0 @@ -# TODO DataChannel Termination - - -## Implementation - -- Should we store somewhere a message received via `dataProducer.send()` when we deliver it to a `dataConsumer` (of type 'sctp' or 'direct')? - - -## Documentation - -- Set proper max size for `netstring` messages in `PayloadChannel` (in JS and C++). It must match `maxSctpMessageSize` in `DataTransport.ts`. - -- `sctpStreamParameters` are now optional in `DataProducerOptions`. - -- `sctpStreamParameters` getter can now return `undefined` in `DataProducer/Consumer`. - -- Added `dataProducer/Consumer.type`: 'sctp' | 'direct'. - -- `transport.consumeData()` (when in SCTP) now accepts optional arguments: - -```ts -ordered?: boolean; -maxPacketLifeTime?: number; -maxRetransmits?: number; -``` - -- Added a new `direct` log tag. From 4a2ea8d478f3f20bb1f124ddbdc8942df18241ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?I=C3=B1aki=20Baz=20Castillo?= Date: Fri, 29 May 2020 14:19:39 +0200 Subject: [PATCH 23/23] Transport.cpp: properly check dataProducer/Consumer.getType() always --- test/test-node-sctp.js | 16 ++- worker/src/RTC/Transport.cpp | 185 ++++++++++++++++++++++++++--------- 2 files changed, 154 insertions(+), 47 deletions(-) diff --git a/test/test-node-sctp.js b/test/test-node-sctp.js index 8239b435cd..f50c408cbf 100644 --- a/test/test-node-sctp.js +++ b/test/test-node-sctp.js @@ -144,7 +144,15 @@ test('ordered DataProducer delivers all SCTP messages to the DataConsumer', asyn const data = Buffer.from(String(id)); // Set ppid of type WebRTC DataChannel string. - data.ppid = sctp.PPID.WEBRTC_STRING; + if (id < numMessages / 2) + { + data.ppid = sctp.PPID.WEBRTC_STRING; + } + // Set ppid of type WebRTC DataChannel binary. + else + { + data.ppid = sctp.PPID.WEBRTC_BINARY; + } sctpSendStream.write(data); sentMessageBytes += data.byteLength; @@ -174,7 +182,11 @@ test('ordered DataProducer delivers all SCTP messages to the DataConsumer', asyn resolve(); } - expect(data.ppid).toBe(sctp.PPID.WEBRTC_STRING); + if (id < numMessages / 2) + expect(data.ppid).toBe(sctp.PPID.WEBRTC_STRING); + else + expect(data.ppid).toBe(sctp.PPID.WEBRTC_BINARY); + expect(id).toBe(++lastRecvMessageId); }); }); diff --git a/worker/src/RTC/Transport.cpp b/worker/src/RTC/Transport.cpp index dfd2c38bcc..18bd4166a8 100644 --- a/worker/src/RTC/Transport.cpp +++ b/worker/src/RTC/Transport.cpp @@ -49,7 +49,7 @@ namespace RTC auto jsonMaxMessageSizeIt = data.find("maxMessageSize"); - // maxSctpMessageSize is mandatory for direct Transports. + // maxMessageSize is mandatory for direct Transports. // clang-format off if ( jsonMaxMessageSizeIt == data.end() || @@ -84,7 +84,9 @@ namespace RTC // clang-format on { if (this->direct) - MS_THROW_TYPE_ERROR("cannot enable SCTP in a DirectTransport"); + { + MS_THROW_TYPE_ERROR("cannot enable SCTP in a direct Transport"); + } auto jsonNumSctpStreamsIt = data.find("numSctpStreams"); auto jsonMaxSctpMessageSizeIt = data.find("maxSctpMessageSize"); @@ -985,8 +987,11 @@ namespace RTC case Channel::Request::MethodId::TRANSPORT_PRODUCE_DATA: { + // Early check. The Transport must support SCTP or be direct. if (!this->sctpAssociation && !this->direct) - MS_THROW_ERROR("SCTP not enabled"); + { + MS_THROW_ERROR("SCTP not enabled and not a direct Transport"); + } std::string dataProducerId; @@ -996,17 +1001,52 @@ namespace RTC // This may throw. auto* dataProducer = new RTC::DataProducer(dataProducerId, this, request->data); - // Insert the DataProducer into the SctpListener. - // This may throw. If so, delete the DataProducer and throw. - try + // Verify the type of the DataProducer. + switch (dataProducer->GetType()) { - this->sctpListener.AddDataProducer(dataProducer); + case RTC::DataProducer::Type::SCTP: + { + if (!this->sctpAssociation) + { + delete dataProducer; + + MS_THROW_TYPE_ERROR( + "cannot create a DataProducer of type 'sctp', SCTP not enabled in this Transport"); + ; + } + + break; + } + + case RTC::DataProducer::Type::DIRECT: + { + if (!this->direct) + { + delete dataProducer; + + MS_THROW_TYPE_ERROR( + "cannot create a DataProducer of type 'direct', not a direct Transport"); + ; + } + + break; + } } - catch (const MediaSoupError& error) + + if (dataProducer->GetType() == RTC::DataProducer::Type::SCTP) { - delete dataProducer; + // Insert the DataProducer into the SctpListener. + // This may throw. If so, delete the DataProducer and throw. + try + { + this->sctpListener.AddDataProducer(dataProducer); + } + catch (const MediaSoupError& error) + { + delete dataProducer; - throw; + throw; + } } // Notify the listener. @@ -1017,7 +1057,10 @@ namespace RTC } catch (const MediaSoupError& error) { - this->sctpListener.RemoveDataProducer(dataProducer); + if (dataProducer->GetType() == RTC::DataProducer::Type::SCTP) + { + this->sctpListener.RemoveDataProducer(dataProducer); + } delete dataProducer; @@ -1040,13 +1083,18 @@ namespace RTC case Channel::Request::MethodId::TRANSPORT_CONSUME_DATA: { + // Early check. The Transport must support SCTP or be direct. if (!this->sctpAssociation && !this->direct) - MS_THROW_ERROR("SCTP not enabled"); + { + MS_THROW_ERROR("SCTP not enabled and not a direct Transport"); + } auto jsonDataProducerIdIt = request->internal.find("dataProducerId"); if (jsonDataProducerIdIt == request->internal.end() || !jsonDataProducerIdIt->is_string()) + { MS_THROW_ERROR("missing internal.dataProducerId"); + } std::string dataProducerId = jsonDataProducerIdIt->get(); std::string dataConsumerId; @@ -1058,6 +1106,38 @@ namespace RTC auto* dataConsumer = new RTC::DataConsumer( dataConsumerId, dataProducerId, this, request->data, this->maxMessageSize); + // Verify the type of the DataConsumer. + switch (dataConsumer->GetType()) + { + case RTC::DataConsumer::Type::SCTP: + { + if (!this->sctpAssociation) + { + delete dataConsumer; + + MS_THROW_TYPE_ERROR( + "cannot create a DataConsumer of type 'sctp', SCTP not enabled in this Transport"); + ; + } + + break; + } + + case RTC::DataConsumer::Type::DIRECT: + { + if (!this->direct) + { + delete dataConsumer; + + MS_THROW_TYPE_ERROR( + "cannot create a DataConsumer of type 'direct', not a direct Transport"); + ; + } + + break; + } + } + // Notify the listener. // This may throw if no DataProducer is found. try @@ -1088,7 +1168,7 @@ namespace RTC if (IsConnected()) dataConsumer->TransportConnected(); - if (this->sctpAssociation) + if (dataConsumer->GetType() == RTC::DataConsumer::Type::SCTP) { if (this->sctpAssociation->GetState() == RTC::SctpAssociation::SctpState::CONNECTED) { @@ -1228,8 +1308,11 @@ namespace RTC // This may throw. RTC::DataProducer* dataProducer = GetDataProducerFromInternal(request->internal); - // Remove it from the SctpListener. - this->sctpListener.RemoveDataProducer(dataProducer); + if (dataProducer->GetType() == RTC::DataProducer::Type::SCTP) + { + // Remove it from the SctpListener. + this->sctpListener.RemoveDataProducer(dataProducer); + } // Remove it from the map. this->mapDataProducers.erase(dataProducer->id); @@ -1239,7 +1322,7 @@ namespace RTC MS_DEBUG_DEV("DataProducer closed [dataProducerId:%s]", dataProducer->id.c_str()); - if (this->sctpAssociation) + if (dataProducer->GetType() == RTC::DataProducer::Type::SCTP) { // Tell the SctpAssociation so it can reset the SCTP stream. this->sctpAssociation->DataProducerClosed(dataProducer); @@ -1266,7 +1349,7 @@ namespace RTC MS_DEBUG_DEV("DataConsumer closed [dataConsumerId:%s]", dataConsumer->id.c_str()); - if (this->sctpAssociation) + if (dataConsumer->GetType() == RTC::DataConsumer::Type::SCTP) { // Tell the SctpAssociation so it can reset the SCTP stream. this->sctpAssociation->DataConsumerClosed(dataConsumer); @@ -1317,15 +1400,14 @@ namespace RTC { case PayloadChannel::Notification::EventId::DATA_PRODUCER_SEND: { - // This must be a direct Transport. - if (!this->direct) - { - MS_THROW_ERROR("cannot send direct messages on a non direct Transport"); - } - // This may throw. RTC::DataProducer* dataProducer = GetDataProducerFromInternal(notification->internal); + if (dataProducer->GetType() != RTC::DataProducer::Type::DIRECT) + { + MS_THROW_ERROR("cannot send direct messages on this DataProducer"); + } + auto jsonPpidIt = notification->data.find("ppid"); if (jsonPpidIt == notification->data.end() || !Utils::Json::IsPositiveInteger(*jsonPpidIt)) @@ -1348,12 +1430,12 @@ namespace RTC return; } - // Increase receive transmission. - DataReceived(len); - // Pass the message to the DataProducer. dataProducer->ReceiveMessage(ppid, msg, len); + // Increase receive transmission. + DataReceived(len); + break; } @@ -2524,25 +2606,29 @@ namespace RTC { MS_TRACE(); - if (this->sctpAssociation) + switch (dataConsumer->GetType()) { - this->sctpAssociation->SendSctpMessage(dataConsumer, ppid, msg, len); - } - else if (this->direct) - { - // Notify the Node DirectTransport. - json data = json::object(); + case RTC::DataConsumer::Type::SCTP: + { + this->sctpAssociation->SendSctpMessage(dataConsumer, ppid, msg, len); - data["ppid"] = ppid; + break; + } - PayloadChannel::Notifier::Emit(dataConsumer->id, "message", data, msg, len); + case RTC::DataConsumer::Type::DIRECT: + { + // Notify the Node DirectTransport. + json data = json::object(); - // Increase send transmission. - DataSent(len); - } - else - { - MS_ERROR("no SCTP association nor a direct Transport, cannot send messages"); + data["ppid"] = ppid; + + PayloadChannel::Notifier::Emit(dataConsumer->id, "message", data, msg, len); + + // Increase send transmission. + DataSent(len); + + break; + } } } @@ -2556,7 +2642,7 @@ namespace RTC // Notify the listener. this->listener->OnTransportDataConsumerDataProducerClosed(this, dataConsumer); - if (this->sctpAssociation) + if (dataConsumer->GetType() == RTC::DataConsumer::Type::SCTP) { // Tell the SctpAssociation so it can reset the SCTP stream. this->sctpAssociation->DataConsumerClosed(dataConsumer); @@ -2587,7 +2673,10 @@ namespace RTC { auto* dataConsumer = kv.second; - dataConsumer->SctpAssociationConnected(); + if (dataConsumer->GetType() == RTC::DataConsumer::Type::SCTP) + { + dataConsumer->SctpAssociationConnected(); + } } // Notify the Node Transport. @@ -2607,7 +2696,10 @@ namespace RTC { auto* dataConsumer = kv.second; - dataConsumer->SctpAssociationClosed(); + if (dataConsumer->GetType() == RTC::DataConsumer::Type::SCTP) + { + dataConsumer->SctpAssociationClosed(); + } } // Notify the Node Transport. @@ -2627,7 +2719,10 @@ namespace RTC { auto* dataConsumer = kv.second; - dataConsumer->SctpAssociationClosed(); + if (dataConsumer->GetType() == RTC::DataConsumer::Type::SCTP) + { + dataConsumer->SctpAssociationClosed(); + } } // Notify the Node Transport.