/**
* @param RuntimeContainerInterface $runtime
* @param ChannelCompositeInterface $composite
* @param ChannelInterface $console
*/
private function applyRootRouting(RuntimeContainerInterface $runtime, ChannelCompositeInterface $composite, ChannelInterface $console)
{
$master = $composite->getBus('master');
$slave = $composite->getBus('slave');
$router = $composite->getInput();
$router->addDefault(new RuleHandler(function ($params) {
return true;
}));
$router = $composite->getOutput();
$router->addDefault(function ($receiver, ProtocolInterface $protocol, $flags, callable $success = null, callable $failure = null, callable $cancel = null, $timeout = 0.0) use($runtime, $slave, $console) {
if ($receiver === Runtime::RESERVED_CONSOLE_CLIENT || $protocol->getDestination() === Runtime::RESERVED_CONSOLE_CLIENT) {
$console->push(Runtime::RESERVED_CONSOLE_CLIENT, $protocol, $flags, $success, $failure, $cancel, $timeout);
} else {
if ($runtime->getManager()->existsRuntime($receiver) || $slave->isConnected($receiver)) {
$slave->push($receiver, $protocol, $flags, $success, $failure, $cancel, $timeout);
} else {
$slave->push($slave->getConnected(), $protocol, $flags, $success, $failure, $cancel, $timeout);
}
}
});
$router = $master->getInput();
$router->addRule(new RuleMatchDestination($master->getName()), new RuleHandler(function ($params) use($runtime, $composite) {
$this->executeProtocol($runtime, $composite, $params['protocol']);
}));
$router->addDefault(new RuleHandler(function ($params) use($slave) {
$slave->push($slave->getConnected(), $params['protocol'], $params['flags']);
}));
$router = $slave->getInput();
$router->addRule(new RuleMatchDestination($slave->getName()), new RuleHandler(function ($params) use($runtime, $composite) {
$this->executeProtocol($runtime, $composite, $params['protocol']);
}));
$router->addDefault(new RuleHandler(function ($params) use($runtime, $slave, $console) {
$receiver = $params['alias'];
$protocol = $params['protocol'];
if ($receiver === Runtime::RESERVED_CONSOLE_CLIENT || $protocol->getDestination() === Runtime::RESERVED_CONSOLE_CLIENT) {
$console->push(Runtime::RESERVED_CONSOLE_CLIENT, $protocol, $params['flags']);
} else {
$slave->push($slave->getConnected(), $params['protocol'], $params['flags']);
}
}));
$router = $master->getOutput();
$router->addDefault(function ($sender, ProtocolInterface $protocol, $flags, callable $success = null, callable $failure = null, callable $cancel = null, $timeout = 0.0) use($master) {
$master->push($sender, $protocol, $flags, $success, $failure, $cancel, $timeout);
});
$router = $slave->getOutput();
$router->addDefault(function ($sender, ProtocolInterface $protocol, $flags, callable $success = null, callable $failure = null, callable $cancel = null, $timeout = 0.0) use($slave) {
$slave->push($sender, $protocol, $flags, $success, $failure, $cancel, $timeout);
});
}