/**
  * Start transport provider
  *
  * @param \Thruway\Peer\AbstractPeer $peer
  * @param \React\EventLoop\LoopInterface $loop
  */
 public function startTransportProvider(AbstractPeer $peer, LoopInterface $loop)
 {
     Logger::info($this, "Starting Transport");
     $this->peer = $peer;
     $this->loop = $loop;
     $this->connector = new \Ratchet\Client\Factory($this->loop);
     $this->connector->__invoke($this->URL, ['wamp.2.json'])->then(function (WebSocket $conn) {
         Logger::info($this, "Pawl has connected");
         $transport = new PawlTransport($conn, $this->loop);
         $transport->setSerializer(new JsonSerializer());
         $transport->setTrusted($this->trusted);
         $this->peer->onOpen($transport);
         $conn->on('message', function ($msg) use($transport) {
             Logger::debug($this, "Received: {$msg}");
             try {
                 $this->peer->onMessage($transport, $transport->getSerializer()->deserialize($msg));
             } catch (DeserializationException $e) {
                 Logger::warning($this, "Deserialization exception occurred.");
             } catch (\Exception $e) {
                 Logger::warning($this, "Exception occurred during onMessage: " . $e->getMessage());
             }
         });
         $conn->on('close', function ($conn) {
             Logger::info($this, "Pawl has closed");
             $this->peer->onClose('close');
         });
         $conn->on('pong', function ($frame, $ws) use($transport) {
             $transport->onPong($frame, $ws);
         });
     }, function ($e) {
         $this->peer->onClose('unreachable');
         Logger::info($this, "Could not connect: {$e->getMessage()}");
         // $this->loop->stop();
     });
 }
 /**
  *
  */
 public function startTransportProvider(AbstractPeer $peer, LoopInterface $loop)
 {
     $this->manager->info("Starting Transport\n");
     $this->peer = $peer;
     $this->loop = $loop;
     $this->connector = new \Ratchet\Client\Factory($this->loop);
     $this->connector->__invoke($this->URL, ['wamp.2.json'])->then(function (WebSocket $conn) {
         $this->manager->info("Pawl has connected\n");
         $transport = new PawlTransport($conn, $this->loop);
         $transport->setSerializer(new JsonSerializer());
         $this->peer->onOpen($transport);
         $conn->on('message', function ($msg) use($transport) {
             $this->manager->info("Received: {$msg}\n");
             $this->peer->onMessage($transport, $transport->getSerializer()->deserialize($msg));
         });
         $conn->on('close', function ($conn) {
             $this->manager->info("Pawl has closed\n");
             $this->peer->onClose('close');
         });
         $conn->on('pong', function ($frame, $ws) use($transport) {
             $transport->onPong($frame, $ws);
         });
     }, function ($e) {
         $this->peer->onClose('unreachable');
         $this->manager->info("Could not connect: {$e->getMessage()}\n");
         // $this->loop->stop();
     });
 }
 /**
  * Send message
  *
  * @param \Thruway\Message\Message $msg
  * @throws \Exception
  */
 public function sendMessage(Message $msg)
 {
     if ($this->getFarPeerTransport() === null) {
         throw new \Exception("You must set the farPeerTransport on internal client transports");
     }
     $this->farPeer->onMessage($this->getFarPeerTransport(), $msg);
 }
 /**
  * Triggered when a client sends data through the socket
  * @param  \Ratchet\ConnectionInterface $from The socket/connection that sent the message to your application
  * @param  string $msg The message received
  * @throws \Exception
  */
 function onMessage(ConnectionInterface $from, $msg)
 {
     $this->manager->debug("onMessage...({$msg})");
     /** @var TransportInterface $transport */
     $transport = $this->transports[$from];
     $this->peer->onMessage($transport, $transport->getSerializer()->deserialize($msg));
 }
 /**
  * Handle process on close transport
  *
  * @param \React\Socket\Connection $conn
  */
 public function handleClose(Connection $conn)
 {
     Logger::debug($this, "Raw socket closed " . $conn->getRemoteAddress());
     $transport = $this->transports[$conn];
     $this->transports->detach($conn);
     $this->peer->onClose($transport);
 }
 public function startTransportProvider(AbstractPeer $peer, LoopInterface $loop)
 {
     // the peer that is passed into here is the server that our internal client connects to
     $this->peer = $peer;
     // create a new transport for the router side to use
     $transport = new InternalClientTransport($this->internalClient, $loop);
     // create a new transport for the client side to use
     $clientTransport = new InternalClientTransport($this->peer, $loop);
     // give the transports each other because they are going to call directly into the
     // other side
     $transport->setFarPeerTransport($clientTransport);
     $clientTransport->setFarPeerTransport($transport);
     // connect the transport to the Router/Peer
     $this->peer->onOpen($transport);
     // open the client side
     $this->internalClient->onOpen($clientTransport);
     // tell the internal client to start up
     $this->internalClient->start();
 }
 /**
  * Triggered when a client sends data through the socket
  *
  * @param  \Ratchet\ConnectionInterface $from The socket/connection that sent the message to your application
  * @param  string $msg The message received
  * @throws \Exception
  */
 public function onMessage(ConnectionInterface $from, $msg)
 {
     Logger::debug($this, "onMessage: ({$msg})");
     /** @var TransportInterface $transport */
     $transport = $this->transports[$from];
     try {
         $this->peer->onMessage($transport, $transport->getSerializer()->deserialize($msg));
     } catch (DeserializationException $e) {
         Logger::alert($this, "Deserialization exception occurred.");
     } catch (\Exception $e) {
         Logger::alert($this, "Exception occurred during onMessage: " . $e->getMessage());
     }
 }
 /**
  * Handle process reveived data
  *
  * @param mixed $data
  * @return void
  */
 public function handleData($data)
 {
     //        if ($this->handshakeByte == 0) {
     //            $this->handshakeByte = $data[0];
     //            $data = substr($data, 1);
     //        }
     $this->buffer = $this->buffer . $data;
     $bufferLen = strlen($this->buffer);
     while ($bufferLen > 0 && $bufferLen >= $this->msgLen) {
         if ($this->msgLen == 0) {
             // the next 4 bytes are going to be the msglen
             if ($bufferLen >= 4) {
                 $this->msgLen = array_values(unpack("N", $this->buffer))[0];
                 if ($this->msgLen <= 0) {
                     Logger::error("Invalid message size sent");
                     $this->close();
                 }
                 // shift off the first 4 bytes
                 $bufferLen = $bufferLen - 4;
                 $this->buffer = substr($this->buffer, 4, $bufferLen);
             } else {
                 // we don't have enough to get the message length
                 return;
             }
         }
         if ($bufferLen >= $this->msgLen) {
             $msg = $this->getSerializer()->deserialize(substr($this->buffer, 0, $this->msgLen));
             $this->peer->onMessage($this, $msg);
             if ($bufferLen == $this->msgLen) {
                 $this->buffer = "";
                 $this->msgLen = 0;
                 $bufferLen = 0;
             } else {
                 $bufferLen = $bufferLen - $this->msgLen;
                 $this->buffer = substr($this->buffer, $this->msgLen, $bufferLen);
                 $this->msgLen = 0;
             }
         }
     }
 }
 /**
  * Handle process on close connection
  * 
  * @param \React\Stream\Stream $conn
  */
 public function handleClose(Stream $conn)
 {
     //$this->getManager()->debug("Raw socket closed " . $conn->getRemoteAddress());
     $this->peer->onClose($this->transport);
 }