public function write($data) { if (!$this->writeable) { return; } $this->buffer .= $data; while (strlen($this->buffer) >= 8) { $header = Header::decode(substr($this->buffer, 0, 8)); if (strlen($this->buffer) < $header->getPayloadLength() + 8) { return; } $record = Record::decode($header, substr($this->buffer, 8, $header->getLength()) ?: ''); $this->buffer = substr($this->buffer, 8 + $header->getPayloadLength()) ?: ''; if ($record->getType()->isBeginRequest()) { if (isset($this->requestParser[$record->getRequestId()])) { throw new \Exception('RequestID already in use!'); } $this->requestParser[$record->getRequestId()] = new RequestParser(); } if ($request = $this->requestParser[$record->getRequestId()]->pushRecord($record)) { unset($this->requestParser[$record->getRequestId()]); $receiver = $this->requestReceiver; $receiver($request); } } }
private function read($data) { $this->data .= $data; while (strlen($this->data) >= 8) { $header = Header::decode(substr($this->data, 0, 8)); if (strlen($this->data) < $header->getPayloadLength() + 8) { return; } $rawRecord = substr($this->data, 8, $header->getLength()); $record = Record::decode($header, $rawRecord); $this->data = substr($this->data, 8 + $header->getPayloadLength()); if ($response = $this->responseBuilders[$header->getRequestId()]->pushRecord($record)) { $this->promises[$header->getRequestId()]->resolve($response); } } }
/** * @return RecordType */ public function getType() { return $this->header->getType(); }