channel 是用于nodejs 与C++交互的,也就是nodejs 可以通过channel 想c++发送指令,同理C++也可以通过该channel 向nodejs 发响应消息。
medisoup/lib/Worker.js
通过socket就可以跟C++那一端通信了。
new的Channel来自Channel.js。
C++部分
mediasoup\worker\src\handles\UnixStreamSocket.cpp
UnixStreamSocket构造函数
inline static void onRead(uv_stream_t* handle, ssize_t nread, const uv_buf_t* buf){auto* socket = static_cast<UnixStreamSocket*>(handle->data);if (socket)socket->OnUvRead(nread, buf);}UnixStreamSocket::UnixStreamSocket(int fd, size_t bufferSize, UnixStreamSocket::Role role): bufferSize(bufferSize), role(role){MS_TRACE_STD();int err;this->uvHandle = new uv_pipe_t;this->uvHandle->data = static_cast<void*>(this);err = uv_pipe_init(DepLibUV::GetLoop(), this->uvHandle, 0);if (err != 0){delete this->uvHandle;this->uvHandle = nullptr;MS_THROW_ERROR_STD("uv_pipe_init() failed: %s", uv_strerror(err));}err = uv_pipe_open(this->uvHandle, fd);if (err != 0){uv_close(reinterpret_cast<uv_handle_t*>(this->uvHandle), static_cast<uv_close_cb>(onClose));MS_THROW_ERROR_STD("uv_pipe_open() failed: %s", uv_strerror(err));}if (this->role == UnixStreamSocket::Role::CONSUMER){// Start reading.err = uv_read_start(reinterpret_cast<uv_stream_t*>(this->uvHandle),static_cast<uv_alloc_cb>(onAlloc),//数据来时会调用该回调static_cast<uv_read_cb>(onRead));if (err != 0){uv_close(reinterpret_cast<uv_handle_t*>(this->uvHandle), static_cast<uv_close_cb>(onClose));MS_THROW_ERROR_STD("uv_read_start() failed: %s", uv_strerror(err));}}// NOTE: Don't allocate the buffer here. Instead wait for the first uv_alloc_cb().}
读取数据后,将数据转为json格式
inline void UnixStreamSocket::OnUvRead(ssize_t nread, const uv_buf_t /buf*/)
Worker::OnChannelRequest
