size() < self::SIZE) { return null; } $size = $buffer->readInt32(); if ($buffer->size() < $size + self::SIZE) { return null; } $buffer->discard(self::SIZE); $type = $buffer->consumeInt32(); return match ($type) { Frame::TYPE_RESPONSE => new Frame\Response($buffer->consume($size - self::TYPE)), Frame::TYPE_ERROR => new Frame\Error($buffer->consume($size - self::TYPE)), Frame::TYPE_MESSAGE => new Frame\Message( timestamp: $buffer->consumeTimestamp(), attempts: $buffer->consumeAttempts(), id: $buffer->consumeMessageID(), body: $buffer->consume($size - self::MESSAGE_HEADER_SIZE), ), default => throw new NsqException(sprintf('Unexpected frame type: "%s"', $type)), }; } }