mercureact/src/Daemon.php

72 lines
1.9 KiB
PHP

<?php
namespace NoccyLabs\Mercureact;
use Monolog\Handler\StreamHandler;
use Monolog\Level;
use Monolog\Logger;
use NoccyLabs\Mercureact\Http\Server;
use Psr\Log\LoggerInterface;
use React\EventLoop\Loop;
use React\EventLoop\LoopInterface;
use React\Socket\SocketServer;
class Daemon
{
private Configuration $config;
private LoopInterface $loop;
private Server $server;
private LoggerInterface $logger;
public function __construct(Configuration $config, bool $verbose=false, ?LoopInterface $loop=null)
{
$this->config = $config;
$this->loop = $loop??Loop::get();
$this->logger = $this->createLogger($verbose);
}
private function createLogger(bool $verbose): Logger
{
$handlers = [
new StreamHandler(STDOUT, $verbose?Level::Debug:Level::Info)
];
$logger = new Logger("main", $handlers);
return $logger;
}
public function start(): void
{
$this->server = new Server($this->config, $this->logger, $this->loop);
$this->logger->info("NoccyLabs Mercureact Daemon v".MERCUREACT_VERSION);
$listenAddress = $this->config->getListenAddress();
if (!$listenAddress) {
$this->logger->warning("Empty listening address. You won't make it far.");
return;
}
$socket = new SocketServer("tcp://".$listenAddress);
$this->server->listen($socket);
}
public function stop(): void
{
$this->loop->stop();
}
public function abort(int $exitcode, ?string $message=null): void
{
$bt = debug_backtrace(limit:2);
$bt = end($bt);
fprintf(STDERR, "Abort: %s\n at %s:%d\n in %s\n", $message??"Unknown reason", $bt['file'], $bt['line'], ($bt['class']??null).($bt['type']??null).$bt['function']);
$this->loop->stop();
register_shutdown_function(function () use ($exitcode) {
exit($exitcode);
});
}
}