vendor/gos/web-socket-bundle/DependencyInjection/GosWebSocketExtension.php line 22

Open in your IDE?
  1. <?php
  2. namespace Gos\Bundle\WebSocketBundle\DependencyInjection;
  3. use Monolog\Logger;
  4. use Symfony\Component\Config\FileLocator;
  5. use Symfony\Component\DependencyInjection\ContainerBuilder;
  6. use Symfony\Component\DependencyInjection\Definition;
  7. use Symfony\Component\DependencyInjection\Extension\PrependExtensionInterface;
  8. use Symfony\Component\DependencyInjection\Loader;
  9. use Symfony\Component\DependencyInjection\Reference;
  10. use Symfony\Component\HttpKernel\DependencyInjection\Extension;
  11. /**
  12.  * @author Johann Saunier <johann_27@hotmail.fr>
  13.  */
  14. class GosWebSocketExtension extends Extension implements PrependExtensionInterface
  15. {
  16.     /**
  17.      * {@inheritdoc}
  18.      */
  19.     public function load(array $configsContainerBuilder $container)
  20.     {
  21.         $loader = new Loader\YamlFileLoader(
  22.             $container,
  23.             new FileLocator(__DIR__ '/../Resources/config/services')
  24.         );
  25.         $loader->load('services.yml');
  26.         $loader->load('aliases.yml');
  27.         $configuration = new Configuration();
  28.         $configs $this->processConfiguration($configuration$configs);
  29.         // Mark services deprecated if the API supports it
  30.         if (method_exists(Definition::class, 'setDeprecated')) {
  31.             $container->getDefinition('gos_web_socket.server_command')
  32.                 ->setDeprecated(true'The "%service_id%" service is deprecated. Use the "gos_web_socket.websocket_server.command" service instead.');
  33.             $container->getDefinition('gos_web_socket.twig.extension')
  34.                 ->setDeprecated(true'The "%service_id%" service is deprecated. Support for Assetic will be removed.');
  35.             $container->getDefinition('gos_web_socket.zmq.pusher')
  36.                 ->setDeprecated(true'The "%service_id%" service is deprecated. Support for ZMQ as a pusher will be removed.');
  37.             $container->getDefinition('gos_web_socket.zmq.server_push_handler')
  38.                 ->setDeprecated(true'The "%service_id%" service is deprecated. Support for ZMQ as a server push handler will be removed.');
  39.         }
  40.         $container->setParameter(
  41.             'web_socket_server.port',
  42.             $configs['server']['port']
  43.         );
  44.         $container->setParameter(
  45.             'web_socket_server.host',
  46.             $configs['server']['host']
  47.         );
  48.         $originsRegistryDef $container->getDefinition('gos_web_socket.origins.registry');
  49.         $container->setParameter('web_socket_origin_check'$configs['server']['origin_check']);
  50.         if (!empty($configs['origins'])) {
  51.             foreach ($configs['origins'] as $origin) {
  52.                 $originsRegistryDef->addMethodCall('addOrigin', [
  53.                     $origin,
  54.                 ]);
  55.             }
  56.         }
  57.         $container->setParameter('web_socket_server.client_storage.ttl'$configs['client']['storage']['ttl']);
  58.         $container->setParameter('web_socket_server.client_storage.prefix'$configs['client']['storage']['prefix']);
  59.         //client
  60.         if (isset($configs['client'])) {
  61.             $clientConf $configs['client'];
  62.             $container->setParameter('gos_web_socket.firewall', (array) $clientConf['firewall']);
  63.             if (isset($clientConf['session_handler'])) {
  64.                 $def $container->getDefinition('gos_web_socket.ws.server');
  65.                 $def->addMethodCall('setSessionHandler', [
  66.                     new Reference(ltrim($clientConf['session_handler'], '@')),
  67.                 ]);
  68.                 $container->setAlias('gos_web_socket.session_handler'ltrim($clientConf['session_handler'], '@'));
  69.             }
  70.             if (isset($clientConf['storage']['driver'])) {
  71.                 $driverRef ltrim($clientConf['storage']['driver'], '@');
  72.                 $clientStorageDef $container->getDefinition('gos_web_socket.client_storage');
  73.                 if (isset($clientConf['storage']['decorator'])) {
  74.                     $decoratorRef ltrim($clientConf['storage']['decorator'], '@');
  75.                     $decoratorDef $container->getDefinition($decoratorRef);
  76.                     $decoratorDef->addArgument(new Reference($driverRef));
  77.                     $clientStorageDef->addMethodCall('setStorageDriver', [
  78.                         new Reference($decoratorRef),
  79.                     ]);
  80.                 } else {
  81.                     $clientStorageDef->addMethodCall('setStorageDriver', [
  82.                         new Reference($driverRef),
  83.                     ]);
  84.                 }
  85.             }
  86.         }
  87.         //rpc
  88.         if (!empty($configs['rpc'])) {
  89.             @trigger_error(
  90.                 'Configuring RPC handlers with the `gos_web_socket.rpc` config node is deprecated and will be removed in 2.0. Add the `gos_web_socket.rpc` tag to your service definitions instead.',
  91.                 E_USER_DEPRECATED
  92.             );
  93.             $def $container->getDefinition('gos_web_socket.rpc.registry');
  94.             foreach ($configs['rpc'] as $rpc) {
  95.                 $def->addMethodCall('addRpc', [
  96.                     new Reference(ltrim($rpc'@')),
  97.                 ]);
  98.             }
  99.         }
  100.         //topic
  101.         if (!empty($configs['topics'])) {
  102.             @trigger_error(
  103.                 'Configuring topic handlers with the `gos_web_socket.topics` config node is deprecated and will be removed in 2.0. Add the `gos_web_socket.topic` tag to your service definitions instead.',
  104.                 E_USER_DEPRECATED
  105.             );
  106.             $def $container->getDefinition('gos_web_socket.topic.registry');
  107.             foreach ($configs['topics'] as $topic) {
  108.                 $def->addMethodCall('addTopic', [
  109.                     new Reference(ltrim($topic'@')),
  110.                 ]);
  111.             }
  112.         }
  113.         //periodic
  114.         if (!empty($configs['periodic'])) {
  115.             @trigger_error(
  116.                 'Configuring periodic handlers with the `gos_web_socket.periodic` config node is deprecated and will be removed in 2.0. Add the `gos_web_socket.periodic` tag to your service definitions instead.',
  117.                 E_USER_DEPRECATED
  118.             );
  119.             $def $container->getDefinition('gos_web_socket.periodic.registry');
  120.             foreach ($configs['periodic'] as $periodic) {
  121.                 $def->addMethodCall('addPeriodic', [
  122.                     new Reference(ltrim($periodic'@')),
  123.                 ]);
  124.             }
  125.         }
  126.         //server
  127.         if (!empty($configs['servers'])) {
  128.             @trigger_error(
  129.                 'Configuring servers with the `gos_web_socket.servers` config node is deprecated and will be removed in 2.0. Add the `gos_web_socket.server` tag to your service definitions instead.',
  130.                 E_USER_DEPRECATED
  131.             );
  132.             $def $container->getDefinition('gos_web_socket.server.registry');
  133.             foreach ($configs['servers'] as $server) {
  134.                 $def->addMethodCall('addServer', [
  135.                     new Reference(ltrim($server'@')),
  136.                 ]);
  137.             }
  138.         }
  139.         //PubSub router
  140.         $pubsubConfig = isset($configs['server']['router'])
  141.             ? $configs['server']['router']
  142.             : [];
  143.         if (!empty($pubsubConfig)) {
  144.             $container->getDefinition('gos_web_socket.router.wamp')
  145.                 ->replaceArgument(0, new Reference('gos_pubsub_router.websocket'));
  146.         }
  147.         // Pusher Configuration
  148.         if (isset($configs['pushers'])) {
  149.             // Validate WAMP configuration
  150.             if (isset($configs['pushers']['wamp'])) {
  151.                 if (!is_bool($configs['pushers']['wamp']['ssl'])) {
  152.                     throw new \InvalidArgumentException(
  153.                         sprintf('The ssl node under wamp pusher configuration must be a boolean value')
  154.                     );
  155.                 }
  156.             }
  157.             // Deprecate ZMQ pusher
  158.             if (isset($configs['pushers']['zmq'])) {
  159.                 @trigger_error(
  160.                     'Support for the ZMQ pusher is deprecated and will be removed in 2.0.',
  161.                     E_USER_DEPRECATED
  162.                 );
  163.             }
  164.         }
  165.     }
  166.     /**
  167.      * @param ContainerBuilder $container
  168.      *
  169.      * @throws \Exception
  170.      */
  171.     public function prepend(ContainerBuilder $container)
  172.     {
  173.         $bundles $container->getParameter('kernel.bundles');
  174.         $configs $container->getExtensionConfig($this->getAlias());
  175.         $config $this->processConfiguration(new Configuration(), $configs);
  176.         if (!isset($config['server'])) {
  177.             $config['server'] = array();
  178.         }
  179.         //PubSubRouter
  180.         $pubsubConfig = isset($config['server']['router']) ? $config['server']['router'] : [];
  181.         if (!empty($pubsubConfig)) {
  182.             if (!isset($pubsubConfig['context']['tokenSeparator'])) {
  183.                 $pubsubConfig['context']['tokenSeparator'] = Configuration::DEFAULT_TOKEN_SEPARATOR;
  184.             }
  185.             $container->prependExtensionConfig('gos_pubsub_router', [
  186.                     'routers' => [
  187.                         'websocket' => $pubsubConfig,
  188.                     ],
  189.                 ]
  190.             );
  191.         }
  192.         //assetic
  193.         if (isset($bundles['AsseticBundle']) && true === $config['assetic']) {
  194.             $asseticConfig = array(
  195.                 'bundles' => array('GosWebSocketBundle'),
  196.             );
  197.             $container->prependExtensionConfig('assetic'$asseticConfig);
  198.         }
  199.         //twig
  200.         if (isset($config['shared_config']) && true === $config['shared_config']) {
  201.             if (!isset($bundles['TwigBundle'])) {
  202.                 throw new \RuntimeException('Shared configuration required Twig Bundle');
  203.             }
  204.             $twigConfig = array('globals' => array());
  205.             if (isset($config['server']['host'])) {
  206.                 $twigConfig['globals']['gos_web_socket_server_host'] = $config['server']['host'];
  207.             }
  208.             if (isset($config['server']['port'])) {
  209.                 $twigConfig['globals']['gos_web_socket_server_port'] = $config['server']['port'];
  210.             }
  211.             if (!empty($twigConfig['globals'])) {
  212.                 $container->prependExtensionConfig('twig'$twigConfig);
  213.             }
  214.             $container->prependExtensionConfig('twig'$twigConfig);
  215.         }
  216.         //monolog
  217.         if (isset($bundles['MonologBundle'])) {
  218.             $monologConfig = array(
  219.                 'channels' => array('websocket'),
  220.                 'handlers' => array(
  221.                     'websocket' => array(
  222.                         'type' => 'console',
  223.                         'verbosity_levels' => array(
  224.                             'VERBOSITY_NORMAL' => true === $container->getParameter('kernel.debug') ? Logger::DEBUG Logger::INFO,
  225.                         ),
  226.                         'channels' => array(
  227.                             'type' => 'inclusive',
  228.                             'elements' => array('websocket'),
  229.                         ),
  230.                     ),
  231.                 ),
  232.             );
  233.             $container->prependExtensionConfig('monolog'$monologConfig);
  234.         }
  235.     }
  236. }