From f98b86ae4dd353a9df94d1cbaae1bb0ff852f3fd Mon Sep 17 00:00:00 2001 From: Yuri Kuznetsov Date: Thu, 27 Aug 2020 17:29:41 +0300 Subject: [PATCH] websocket app runner --- .../Core/ApplicationRunners/WebSocket.php | 139 ++++++++++++++++++ websocket.php | 57 +------ 2 files changed, 144 insertions(+), 52 deletions(-) create mode 100644 application/Espo/Core/ApplicationRunners/WebSocket.php diff --git a/application/Espo/Core/ApplicationRunners/WebSocket.php b/application/Espo/Core/ApplicationRunners/WebSocket.php new file mode 100644 index 0000000000..f69e761736 --- /dev/null +++ b/application/Espo/Core/ApplicationRunners/WebSocket.php @@ -0,0 +1,139 @@ +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() + { + $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; + } +} diff --git a/websocket.php b/websocket.php index 29c6e6578e..c054e422bc 100644 --- a/websocket.php +++ b/websocket.php @@ -27,58 +27,11 @@ * these Appropriate Legal Notices must retain the display of the "EspoCRM" word. ************************************************************************/ -if (substr(php_sapi_name(), 0, 3) != 'cli') die('WebSocket can be run only via CLI.'); - include "bootstrap.php"; -$app = new \Espo\Core\Application(); -$config = $app->getContainer()->get('config'); +use Espo\Core\{ + Application, + ApplicationRunners\WebSocket, +}; -$categoriesData = $app->getContainer()->get('metadata')->get(['app', 'webSocket', 'categories'], []); - -$phpExecutablePath = $config->get('phpExecutablePath'); -$isDebugMode = (bool) $config->get('webSocketDebugMode'); - -$loop = \React\EventLoop\Factory::create(); -$pusher = new \Espo\Core\WebSocket\Pusher($categoriesData, $phpExecutablePath, $isDebugMode); - -$context = new \React\ZMQ\Context($loop); -$pull = $context->getSocket(\ZMQ::SOCKET_PULL); -$pull->bind('tcp://127.0.0.1:5555'); -$pull->on('message', [$pusher, 'onMessageReceive']); - - -$useSecureServer = $config->get('webSocketUseSecureServer'); - -$port = $config->get('webSocketPort'); -if (!$port) { - $port = $useSecureServer ? '8443' : '8080'; -} - -$webSocket = new \React\Socket\Server('0.0.0.0:'.$port, $loop); - -if ($useSecureServer) { - $sslParams = [ - 'local_cert' => $config->get('webSocketSslCertificateFile'), - 'allow_self_signed' => $config->get('webSocketSslAllowSelfSigned', false), - 'verify_peer' => false, - ]; - if ($config->get('webSocketSslCertificatePassphrase')) { - $sslParams['passphrase'] = $config->get('webSocketSslCertificatePassphrase'); - } - if ($config->get('webSocketSslCertificateLocalPrivateKey')) { - $sslParams['local_pk'] = $config->get('webSocketSslCertificateLocalPrivateKey'); - } - $webSocket = new \React\Socket\SecureServer($webSocket, $loop, $sslParams); -} - -$webServer = new \Ratchet\Server\IoServer( - new \Ratchet\Http\HttpServer( - new \Ratchet\WebSocket\WsServer( - new \Ratchet\Wamp\WampServer($pusher) - ) - ), - $webSocket -); - -$loop->run(); +(new Application())->run(WebSocket::class);