/**
  * Waits for a frame from the server
  *
  * @param int $timeout
  * @return array
  * @throws \Exception
  * @throws \PhpAmqpLib\Exception\AMQPTimeoutException
  * @throws \PhpAmqpLib\Exception\AMQPRuntimeException
  */
 protected function wait_frame($timeout = 0)
 {
     if (is_null($this->input)) {
         $this->setIsConnected(false);
         throw new AMQPRuntimeException('Broken pipe or closed connection');
     }
     $currentTimeout = $this->input->getTimeout();
     $this->input->setTimeout($timeout);
     try {
         // frame_type + channel_id + size
         $this->wait_frame_reader->reuse($this->input->read(AMQPReader::OCTET + AMQPReader::SHORT + AMQPReader::LONG));
         $frame_type = $this->wait_frame_reader->read_octet();
         $channel = $this->wait_frame_reader->read_short();
         $size = $this->wait_frame_reader->read_long();
         // payload + ch
         $this->wait_frame_reader->reuse($this->input->read(AMQPReader::OCTET + (int) $size));
         $payload = $this->wait_frame_reader->read($size);
         $ch = $this->wait_frame_reader->read_octet();
     } catch (AMQPTimeoutException $e) {
         $this->input->setTimeout($currentTimeout);
         throw $e;
     }
     $this->input->setTimeout($currentTimeout);
     if ($ch != 0xce) {
         throw new AMQPRuntimeException(sprintf('Framing error, unexpected byte: %x', $ch));
     }
     return array($frame_type, $channel, $payload);
 }