public function testMinSignedInt16() { $minSignedInt16 = -0x8000; $packedMinSignedInt16 = Packer::packSignedInt16($minSignedInt16); $unpackedMinSignedInt16 = Packer::unpackSignedInt16($packedMinSignedInt16); $this->assertSame($minSignedInt16, $unpackedMinSignedInt16); }
/** * Build request header * @param array $options [description] * @return [type] [description] */ protected function buildHeader($options = []) { // Set API version if passed, else default to DEFAULT_API_VERSION $apiVersion = isset($options['api_version']) ? $options['api_version'] : self::DEFAULT_API_VERSION; // Set correlation ID if passed, else generate a random one $correlationId = isset($this->correlationId) ? $this->correlationId : mt_rand(); // Set client if passed, else default to DEFAULT_CLIENT $clientId = isset($options['client_id']) ? $options['client_id'] : self::DEFAULT_CLIENT; $header = Packer::packSignedInt16(static::API_KEY) . Packer::packSignedInt16($apiVersion) . Packer::packSignedInt32($correlationId) . Packer::packStringSignedInt16($clientId); return $header; }
public function send($requiredAcks, $timeout, $topics) { // Add header (ApiKey, ApiVersion, CorrelationId, ClientId) $data = $this->buildHeader(); // Add RequiredAcks $data .= Packer::packSignedInt16($requiredAcks); // Add Timeout $data .= Packer::packSignedInt32($timeout); // Add Topic count $data .= Packer::packSignedInt32(count($topics)); // Add Topics foreach ($topics as $topic => $partitions) { // Add Topic $data .= Packer::packStringSignedInt16($topic); // Add Partition count $data .= Packer::packSignedInt32(count($partitions)); // Add Partitions foreach ($partitions as $partition => $messages) { $data .= Packer::packSignedInt32($partition); $packedMessageSet = ''; foreach ($messages as $message) { if (!is_array($message)) { $offset = 0; // Producer does not know message offset, so we can fill with any value (we choose 0) $magicByte = 0; // Used to ensure backwards compatibility. Currently set to 0; $attributes = 0; $key = null; } else { $offset = array_key_exists('Offset', $message) ? $message['Offset'] : 0; $magicByte = array_key_exists('MagicByte', $message) ? $message['MagicByte'] : 0; $attributes = array_key_exists('Attributes', $message) ? $message['Attributes'] : 0; $attributes = 0; // TODO: handle compression $key = array_key_exists('Key', $message) ? $message['Key'] : null; } $packedMessage = Packer::packSignedInt8($magicByte); $packedMessage .= Packer::packSignedInt8($attributes); $packedMessage .= Packer::packStringSignedInt32($key); $packedMessage .= Packer::packStringSignedInt32($message); $packedMessage = Packer::packSignedInt32(crc32($packedMessage)) . $packedMessage; $packedMessageSet .= Packer::packSignedInt64($offset) . Packer::packStringSignedInt32($packedMessage); } // Add MessageSet $data .= Packer::packStringSignedInt32($packedMessageSet); } } // Concat data length (32 bits) and data $data = Packer::packStringSignedInt32($data); // Send data return $this->client->write($data); }
public function sendV2($consumerGroup, $consumerGroupGenerationId, $consumerId, $retentionTime, $topics) { // Add header (ApiKey, ApiVersion, CorrelationId, ClientId) $data = $this->buildHeader(['api_version' => 2]); // Add ConsumerGroup Logger::log('> Packing ConsumerGroup: %s', var_export($consumerGroup, true)); $data .= Packer::packSignedInt16(strlen($consumerGroup)) . $consumerGroup; // Add ConsumerGroupGenerationId Logger::log('> Packing ConsumerGroupGenerationId: %s', var_export($consumerGroupGenerationId, true)); $data .= Packer::packSignedInt32($consumerGroupGenerationId); // Add ConsumerId Logger::log('> Packing ConsumerId: %s', var_export($consumerId, true)); $data .= Packer::packSignedInt16(strlen($consumerId)) . $consumerId; // Add RetentionTime Logger::log('> Packing RetentionTime: %s', var_export($retentionTime, true)); $data .= Packer::packSignedInt64($retentionTime); // Add Topic count Logger::log('> Packing Topic count: %s', var_export(count($topics), true)); $data .= Packer::packSignedInt32(count($topics)); // Add Topics foreach ($topics as $topic => $partitions) { // Add Topic Logger::log('> Packing Topic: %s', var_export($topic, true)); $data .= Packer::packSignedInt16(strlen($topic)) . $topic; // Add Partition count Logger::log('> Packing Partition count: %s', var_export(count($partitions), true)); $data .= Packer::packSignedInt32(count($partitions)); // Add Partitions foreach ($partitions as $partition => $partitionParams) { // Add Partition Logger::log('> Packing Partition: %s', var_export(count($partition), true)); $data .= Packer::packSignedInt32($partition); // Add Offset Logger::log('> Packing Offset: %s', var_export($partitionParams['Offset'], true)); $data .= Packer::packSignedInt64($partitionParams['Offset']); // Add Metadata Logger::log('> Packing Metadata: %s', var_export($partitionParams['Metadata'], true)); $data .= Packer::packSignedInt16(strlen($partitionParams['Metadata'])) . $partitionParams['Metadata']; } } // Concat data length (32 bits) and data $data = Packer::packSignedInt32(strlen($data)) . $data; // Send data return $this->client->write($data); }