[WAMP] Topic manager
Separated functionality of Ratchet component and topic manager
This commit is contained in:
		
							parent
							
								
									5a80a67f03
								
							
						
					
					
						commit
						c5cdd68cef
					
				| @ -37,14 +37,14 @@ class Topic implements \IteratorAggregate, \Countable { | |||||||
|     /** |     /** | ||||||
|      * @param WampConnection |      * @param WampConnection | ||||||
|      */ |      */ | ||||||
|     public function subscribed(WampConnection $conn) { |     public function add(WampConnection $conn) { | ||||||
|         $this->subscribers->attach($conn); |         $this->subscribers->attach($conn); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     /** |     /** | ||||||
|      * @param WampConnection |      * @param WampConnection | ||||||
|      */ |      */ | ||||||
|     public function unsubscribed(WampConnection $conn) { |     public function remove(WampConnection $conn) { | ||||||
|         if ($this->subscribers->contains($conn)) { |         if ($this->subscribers->contains($conn)) { | ||||||
|             $this->subscribers->detach($conn); |             $this->subscribers->detach($conn); | ||||||
|         } |         } | ||||||
|  | |||||||
							
								
								
									
										103
									
								
								src/Ratchet/Wamp/TopicManager.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										103
									
								
								src/Ratchet/Wamp/TopicManager.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,103 @@ | |||||||
|  | <?php | ||||||
|  | namespace Ratchet\Wamp; | ||||||
|  | use Ratchet\ConnectionInterface; | ||||||
|  | use Ratchet\WebSocket\WsServerInterface; | ||||||
|  | 
 | ||||||
|  | class TopicManager implements WsServerInterface, WampServerInterface { | ||||||
|  |     /** | ||||||
|  |      * @var WampServerInterface | ||||||
|  |      */ | ||||||
|  |     protected $app; | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * @var array | ||||||
|  |      */ | ||||||
|  |     protected $topicLookup = array(); | ||||||
|  | 
 | ||||||
|  |     public function __construct(WampServerInterface $app) { | ||||||
|  |         $this->app = $app; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * {@inheritdoc} | ||||||
|  |      */ | ||||||
|  |     public function onOpen(ConnectionInterface $conn) { | ||||||
|  |         $conn->WAMP->topics = new \SplObjectStorage; | ||||||
|  |         $this->app->onOpen($conn); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * {@inheritdoc} | ||||||
|  |      */ | ||||||
|  |     public function onCall(ConnectionInterface $conn, $id, $topic, array $params) { | ||||||
|  |         $this->app->onCall($conn, $id, $this->getTopic($topic), $params); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * {@inheritdoc} | ||||||
|  |      */ | ||||||
|  |     public function onSubscribe(ConnectionInterface $conn, $topic) { | ||||||
|  |         $topicObj = $this->getTopic($topic); | ||||||
|  | 
 | ||||||
|  |         $conn->WAMP->topics->attach($topicObj); | ||||||
|  |         $this->app->onSubscribe($conn, $topicObj); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * {@inheritdoc} | ||||||
|  |      */ | ||||||
|  |     public function onUnsubscribe(ConnectionInterface $conn, $topic) { | ||||||
|  |         $topicObj = $this->getTopic($topic); | ||||||
|  | 
 | ||||||
|  |         if ($conn->WAMP->topics->contains($topicobj) { | ||||||
|  |             $conn->WAMP->topics->remove($topicObj); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         $this->topicLookup[$topic]->remove($conn); | ||||||
|  |         $this->app->onUnsubscribe($conn, $topicObj); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * {@inheritdoc} | ||||||
|  |      */ | ||||||
|  |     public function onPublish(ConnectionInterface $conn, $topic, $event, array $exclude = array(), array $eligible = array()) { | ||||||
|  |         $this->app->onPublish($conn, $this->getTopic($topic), $event, $exclude, $eligible); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * {@inheritdoc} | ||||||
|  |      */ | ||||||
|  |     public function onClose(ConnectionInterface $conn) { | ||||||
|  |         $this->app->onClose($conn); | ||||||
|  | 
 | ||||||
|  |         foreach ($this->topicLookup as $topic) { | ||||||
|  |             $topic->remove($conn); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * {@inheritdoc} | ||||||
|  |      */ | ||||||
|  |     public function onError(ConnectionInterface $conn, \Exception $e) { | ||||||
|  |         $this->app->onError($conn, $e); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * {@inheritdoc} | ||||||
|  |      */ | ||||||
|  |     public function getSubProtocols() { | ||||||
|  |         if ($this->app instanceof WsServerInterface) { | ||||||
|  |             return $this->app->getSubProtocols(); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         return array(); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     protected function getTopic($topic) { | ||||||
|  |         if (!array_key_exists($topic, $this->topicLookup)) { | ||||||
|  |             $this->topicLookup[$topic] = new Topic($topic); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         return $this->topicLookup[$topic]; | ||||||
|  |     } | ||||||
|  | } | ||||||
| @ -1,100 +1,54 @@ | |||||||
| <?php | <?php | ||||||
| namespace Ratchet\Wamp; | namespace Ratchet\Wamp; | ||||||
|  | use Ratchet\MessageComponentInterface; | ||||||
|  | use Ratchet\WebSocket\WsServerInterface; | ||||||
| use Ratchet\ConnectionInterface; | use Ratchet\ConnectionInterface; | ||||||
| 
 | 
 | ||||||
| class WampServer implements MessageComponentInterface, WsServerInterface, WampServerInterface { | class WampServer implements MessageComponentInterface, WsServerInterface { | ||||||
|     /** |     /** | ||||||
|      * @var ServerProtocol |      * @var ServerProtocol | ||||||
|      */ |      */ | ||||||
|     protected $protocol; |     private $wampProtocol; | ||||||
| 
 | 
 | ||||||
|     /** |     /** | ||||||
|      * @var WampServerInterface |      * {@inheritdoc} | ||||||
|      */ |      */ | ||||||
|     protected $app; |  | ||||||
| 
 |  | ||||||
|     /** |  | ||||||
|      * @var array |  | ||||||
|      */ |  | ||||||
|     protected $topicLookup = array(); |  | ||||||
| 
 |  | ||||||
|     public function __construct(WampServerInterface $app) { |     public function __construct(WampServerInterface $app) { | ||||||
|         $this->protocol = new ServerProtocol($this); |         $this->wampProtocol = new ServerProtocol(new TopicManager($app)); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     /** |     /** | ||||||
|      * {@inheritdoc} |      * {@inheritdoc} | ||||||
|      */ |      */ | ||||||
|     public function onOpen(ConnectionInterface $conn) { |     public function onOpen(ConnectionInterface $conn) { | ||||||
|         if ($conn instanceof WampConnection) { |         $this->wampProtocol->onOpen($conn); | ||||||
|             $this->app->onOpen($conn); |  | ||||||
|         } else { |  | ||||||
|             $conn->WAMP->topics = new \SplObjectStorage; |  | ||||||
|             $this->protocol->onOpen($conn); |  | ||||||
|         } |  | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     /** |     /** | ||||||
|      * {@inheritdoc} |      * {@inheritdoc} | ||||||
|      */ |      */ | ||||||
|     public function onCall(ConnectionInterface $conn, $id, $topic, array $params) { |     public function onMessage(ConnectionInterface $conn, $msg) { | ||||||
|         $this->app->onCall($conn, $id, $this->getTopic($topic), $params); |         $this->wampProtocol->onMessage($conn, $msg); | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     /** |  | ||||||
|      * {@inheritdoc} |  | ||||||
|      */ |  | ||||||
|     public function onSubscribe(ConnectionInterface $conn, $topic) { |  | ||||||
|         $topicObj = $this->getTopic($topic); |  | ||||||
| 
 |  | ||||||
|         $conn->WAMP->topics->attach($topicObj); |  | ||||||
|         $this->app->onSubscribe($conn, $topicObj); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     /** |  | ||||||
|      * {@inheritdoc} |  | ||||||
|      */ |  | ||||||
|     public function onUnsubscribe(ConnectionInterface $conn, $topic) { |  | ||||||
|         $topicObj = $this->getTopic($topic); |  | ||||||
| 
 |  | ||||||
|         if ($conn->WAMP->topics->contains($topicobj) { |  | ||||||
|             $conn->WAMP->topics->detach($topicObj); |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         $this->topicLookup[$topic]->remove($conn); |  | ||||||
|         $this->app->onUnsubscribe($conn, $topicObj); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     /** |  | ||||||
|      * {@inheritdoc} |  | ||||||
|      */ |  | ||||||
|     public function onPublish(ConnectionInterface $conn, $topic, $event, array $exclude = array(), array $eligible = array()) { |  | ||||||
|         $this->app->onPublish($conn, $this->getTopic($topic), $event, $exclude, $eligible); |  | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     /** |     /** | ||||||
|      * {@inheritdoc} |      * {@inheritdoc} | ||||||
|      */ |      */ | ||||||
|     public function onClose(ConnectionInterface $conn) { |     public function onClose(ConnectionInterface $conn) { | ||||||
|         $this->app->onClose($conn); |         $this->wampProtocol->onClose($conn); | ||||||
| 
 |  | ||||||
|         foreach ($this->topicLookup as $topic) { |  | ||||||
|             $topic->remove($conn); |  | ||||||
|         } |  | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     /** |     /** | ||||||
|      * {@inheritdoc} |      * {@inheritdoc} | ||||||
|      */ |      */ | ||||||
|     public function onError(ConnectionInterface $conn, \Exception $e) { |     public function onError(ConnectionInterface $conn, \Exception $e) { | ||||||
|         $this->app->onError($conn, $e); |         $this->wampProtocol->onError($conn, $e); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     protected function getTopic($topic) { |     /** | ||||||
|         if (!array_key_exists($topic, $this->topicLookup)) { |      * {@inheritdoc} | ||||||
|             $this->topicLookup[$topic] = new Topic($topic); |      */ | ||||||
|         } |     public function getSubProtocols() { | ||||||
| 
 |         return $this->wampProtocol->getSubProtocols(); | ||||||
|         return $this->topicLookup[$topic]; |  | ||||||
|     } |     } | ||||||
| } | } | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Chris Boden
						Chris Boden