*/ class NginxConfigGenerator { private const VHOST = "\t\tapplication %s { \t\t\tlive on; \t\t\tmeta copy; %s \t\t}"; private const NGINX_CONF = "worker_processes 1; pid /run/nginx-rtmp.pid; events { \tworker_connections 1024; } rtmp { \tserver { \t\tlisten 1935; %s \t} } "; /** * @var StreamsRepository */ private $repository; /** * @var ServiceManager */ private $manager; /** * @var string */ private $nginxFolder; /** * @var string */ private $appHost; /** * NginxConfigGenerator constructor. * @param StreamsRepository $repository * @param ServiceManager $manager * @param string $nginxFolder * @param string $appHost * @author Soner Sayakci */ public function __construct(StreamsRepository $repository, ServiceManager $manager, string $nginxFolder, string $appHost) { $this->repository = $repository; $this->manager = $manager; $this->nginxFolder = $nginxFolder; $this->appHost = $appHost; } /** * @author Soner Sayakci * @throws \Exception */ public function generate(): void { if (!file_exists($this->nginxFolder)) { if (!mkdir($this->nginxFolder, 7777, true) && !is_dir($this->nginxFolder)) { throw new \RuntimeException(sprintf('Directory "%s" was not created', $this->nginxFolder)); } } $vhost = ''; foreach ($this->getStreams() as $stream) { if ($stream->getEndpoints()->count()) { $configPush = []; $configPush[] = "\n\t\t\t# Events"; $configPush[] = "\t\t\ton_publish " . $this->appHost . '/events/onPublish;'; $configPush[] = "\t\t\ton_done " . $this->appHost . '/events/onDone;'; $configPush[] = "\n\t\t\t# Pushes"; foreach ($stream->getEndpoints() as $endpoint) { $configPush[] = "\t\t\tpush " . $this->buildUrl($endpoint) . ';'; } $applicationName = sprintf('%s/%s', $stream->getUser()->getUsername(), $stream->getName()); $vhost .= sprintf(self::VHOST, $applicationName, implode("\n", $configPush)); } } file_put_contents($this->nginxFolder . '/nginx.conf', sprintf(self::NGINX_CONF, $vhost)); } /** * @return \App\Entity\Streams[] * @author Soner Sayakci */ private function getStreams(): array { return $this->repository->getActiveStreams(); } /** * @param Endpoint $endpoint * @return string * @author Soner Sayakci */ private function buildUrl(Endpoint $endpoint): string { $service = $this->manager->getServiceByName($endpoint->getType()); return $service->buildStreamUrl($endpoint); } }