一个Worker代表着一个运行在单核CPU上并处理Router实例的mediasoup C++子进程;
首先Worker继承了四个类,以支持以下功能
/*
1.`Channel::ChannelSocket::Listener`:负责与其他节点之间的通信,处理来自其他节点的消息并将本地消息发送给其他节点。
2.`PayloadChannel::PayloadChannelSocket::Listener`:负责传递用户层的数据负载,并提供数据加密和解密功能。
3.`SignalsHandler::Listener`:负责捕捉系统信号(比如SIGINT)并进行相应的处理,例如优雅地退出程序。
4.`RTC::Router::Listener`:负责处理WebRTC中的路由表,以便在不同的节点之间建立点对点连接。
*/
class Worker : public Channel::ChannelSocket::Listener,
public PayloadChannel::PayloadChannelSocket::Listener,
public SignalsHandler::Listener,
public RTC::Router::Listener
在构造函数中,主要启动了libuv,并且由于Worker是继承前四个类的。在构造函数内部进行了一系列的注册,把当前Worker作为了监听,有相应事件发生会回调到Worker中
/* Instance methods. */
Worker::Worker(::Channel::ChannelSocket* channel, PayloadChannel::PayloadChannelSocket* payloadChannel)
: channel(channel), payloadChannel(payloadChannel)
{
MS_TRACE();
// Set us as Channel's listener.把我们设为频道的听众。传入的this为对象
// 因为Worker继承Channel::ChannelSocket::Listener,所以可以作为子类传入
this->channel->SetListener(this);
// Set us as PayloadChannel's listener. 设置我们为PayloadChannel的监听器。
this->payloadChannel->SetListener(this);
// Set the SignalHandler. 设置SignalHandler。
this->signalsHandler = new SignalsHandler(this);
// Set up the RTC::Shared singleton.设置RTC::Shared单例。
this->shared = new RTC::Shared(
/*channelMessageRegistrator*/ new ChannelMessageRegistrator(),
/*channelNotifier*/ new Channel::ChannelNotifier(this->channel),
/*payloadChannelNotifier*/ new PayloadChannel::PayloadChannelNotifier(this->payloadChannel));
#ifdef MS_EXECUTABLE
{
// Add signals to handle.
this->signalsHandler->AddSignal(SIGINT, "INT");
this->signalsHandler->AddSignal(SIGTERM, "TERM");
}
#endif
// Create the Checker instance in DepUsrSCTP. 在DepUsrSCTP中创建Checker实例。
DepUsrSCTP::CreateChecker();
// Tell the Node process that we are running. 告诉我们正在运行的Node进程。
this->shared->channelNotifier->Emit(Logger::pid, "running");
MS_DEBUG_DEV("starting libuv loop"); // 启动libuv循环
DepLibUV::RunLoop();
MS_DEBUG_DEV("libuv loop ended");
}