config = $config; $this->metadata = $metadata; $this->categoriesData = $metadata->get(['app', 'webSocket', 'categories'], []); $this->phpExecutablePath = $config->get('phpExecutablePath'); $this->isDebugMode = (bool) $config->get('webSocketDebugMode'); $this->useSecureServer = (bool) $config->get('webSocketUseSecureServer'); $this->port = $this->config->get('webSocketPort'); if (!$this->port) { $this->port = $this->useSecureServer ? '8443' : '8080'; } } public function run() : void { $loop = EventLoopFactory::create(); $pusher = new Pusher($this->categoriesData, $this->phpExecutablePath, $this->isDebugMode); $context = new ZMQContext($loop); $pull = $context->getSocket(ZMQ::SOCKET_PULL); $pull->bind('tcp://127.0.0.1:5555'); $pull->on('message', [$pusher, 'onMessageReceive']); $socketServer = new SocketServer('0.0.0.0:' . $this->port, $loop); if ($this->useSecureServer) { $sslParams = $this->getSslParams(); $socketServer = new SocketSecureServer($socketServer, $loop, $sslParams); } $webServer = new IoServer( new HttpServer( new WsServer( new WampServer($pusher) ) ), $socketServer ); $loop->run(); } protected function getSslParams() : array { $sslParams = [ 'local_cert' => $this->config->get('webSocketSslCertificateFile'), 'allow_self_signed' => $this->config->get('webSocketSslAllowSelfSigned', false), 'verify_peer' => false, ]; if ($this->config->get('webSocketSslCertificatePassphrase')) { $sslParams['passphrase'] = $this->config->get('webSocketSslCertificatePassphrase'); } if ($this->config->get('webSocketSslCertificateLocalPrivateKey')) { $sslParams['local_pk'] = $this->config->get('webSocketSslCertificateLocalPrivateKey'); } return $sslParams; } }