![]() System : Linux absol.cf 5.4.0-198-generic #218-Ubuntu SMP Fri Sep 27 20:18:53 UTC 2024 x86_64 User : www-data ( 33) PHP Version : 7.4.33 Disable Function : pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,pcntl_unshare, Directory : /usr/local/lib/node_modules/mediasoup/worker/src/PayloadChannel/ |
Upload File : |
#define MS_CLASS "PayloadChannel::Request" // #define MS_LOG_DEV_LEVEL 3 #include "PayloadChannel/Request.hpp" #include "Logger.hpp" #include "MediaSoupErrors.hpp" #include "Utils.hpp" #include "PayloadChannel/UnixStreamSocket.hpp" namespace PayloadChannel { /* Class variables. */ // clang-format off std::unordered_map<std::string, Request::MethodId> Request::string2MethodId = { { "dataConsumer.send", Request::MethodId::DATA_CONSUMER_SEND }, }; // clang-format on /* Class methods. */ bool Request::IsRequest(json& jsonRequest) { MS_TRACE(); auto jsonIdIt = jsonRequest.find("id"); if (jsonIdIt == jsonRequest.end() || !Utils::Json::IsPositiveInteger(*jsonIdIt)) return false; auto jsonMethodIt = jsonRequest.find("method"); if (jsonMethodIt == jsonRequest.end() || !jsonMethodIt->is_string()) return false; return true; } /* Instance methods. */ Request::Request(PayloadChannel::UnixStreamSocket* channel, json& jsonRequest) : channel(channel) { MS_TRACE(); auto jsonIdIt = jsonRequest.find("id"); if (jsonIdIt == jsonRequest.end() || !Utils::Json::IsPositiveInteger(*jsonIdIt)) MS_THROW_ERROR("missing id"); this->id = jsonIdIt->get<uint32_t>(); auto jsonMethodIt = jsonRequest.find("method"); if (jsonMethodIt == jsonRequest.end() || !jsonMethodIt->is_string()) MS_THROW_ERROR("missing method"); this->method = jsonMethodIt->get<std::string>(); auto methodIdIt = Request::string2MethodId.find(this->method); if (methodIdIt == Request::string2MethodId.end()) { Error("unknown method"); MS_THROW_ERROR("unknown method '%s'", this->method.c_str()); } this->methodId = methodIdIt->second; auto jsonInternalIt = jsonRequest.find("internal"); if (jsonInternalIt != jsonRequest.end() && jsonInternalIt->is_object()) this->internal = *jsonInternalIt; else this->internal = json::object(); auto jsonDataIt = jsonRequest.find("data"); if (jsonDataIt != jsonRequest.end() && jsonDataIt->is_object()) this->data = *jsonDataIt; else this->data = json::object(); } Request::~Request() { MS_TRACE(); } void Request::Accept() { MS_TRACE(); MS_ASSERT(!this->replied, "request already replied"); this->replied = true; json jsonResponse = json::object(); jsonResponse["id"] = this->id; jsonResponse["accepted"] = true; this->channel->Send(jsonResponse); } void Request::Accept(json& data) { MS_TRACE(); MS_ASSERT(!this->replied, "request already replied"); this->replied = true; json jsonResponse = json::object(); jsonResponse["id"] = this->id; jsonResponse["accepted"] = true; if (data.is_structured()) jsonResponse["data"] = data; this->channel->Send(jsonResponse); } void Request::Error(const char* reason) { MS_TRACE(); MS_ASSERT(!this->replied, "request already replied"); this->replied = true; json jsonResponse = json::object(); jsonResponse["id"] = this->id; jsonResponse["error"] = "Error"; if (reason != nullptr) jsonResponse["reason"] = reason; this->channel->Send(jsonResponse); } void Request::TypeError(const char* reason) { MS_TRACE(); MS_ASSERT(!this->replied, "request already replied"); this->replied = true; json jsonResponse = json::object(); jsonResponse["id"] = this->id; jsonResponse["error"] = "TypeError"; if (reason != nullptr) jsonResponse["reason"] = reason; this->channel->Send(jsonResponse); } void Request::SetPayload(const uint8_t* payload, size_t payloadLen) { MS_TRACE(); this->payload = payload; this->payloadLen = payloadLen; } } // namespace PayloadChannel