/**

* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements.  See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership.  The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License.  You may obtain a copy of the License at
*
*   http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied.  See the License for the
* specific language governing permissions and limitations
* under the License.
*/

syntax = “proto2”;

package pulsar.proto; option java_package = “org.apache.pulsar.common.api.proto”; option optimize_for = LITE_RUNTIME;

message Schema {

enum Type {
    None = 0;
    String = 1;
    Json = 2;
    Protobuf = 3;
    Avro = 4;
    Bool = 5;
    Int8 = 6;
    Int16 = 7;
    Int32 = 8;
    Int64 = 9;
    Float = 10;
    Double = 11;
    Date = 12;
    Time = 13;
    Timestamp = 14;
    KeyValue = 15;
}

required string name = 1;
required bytes schema_data = 3;
required Type type = 4;
repeated KeyValue properties = 5;

}

message MessageIdData {

required uint64 ledgerId = 1;
required uint64 entryId  = 2;
optional int32 partition = 3 [default = -1];
optional int32 batch_index = 4 [default = -1];

}

message KeyValue {

required string key = 1;
required string value = 2;

}

message KeyLongValue {

required string key = 1;
required uint64 value = 2;

}

message IntRange {

required int32 start = 1;
required int32 end = 2;

}

message EncryptionKeys {

required string key = 1;
required bytes value = 2;
repeated KeyValue metadata = 3;

}

enum CompressionType {

NONE   = 0;
LZ4    = 1;
ZLIB   = 2;
ZSTD   = 3;
SNAPPY   = 4;

}

message MessageMetadata {

required string producer_name   = 1;
required uint64 sequence_id     = 2;
required uint64 publish_time    = 3;
repeated KeyValue properties    = 4;

// Property set on replicated message,
// includes the source cluster name
optional string replicated_from = 5;
//key to decide partition for the msg
optional string partition_key   = 6;
// Override namespace's replication
repeated string replicate_to    = 7;
optional CompressionType compression = 8 [default = NONE];
optional uint32 uncompressed_size = 9 [default = 0];
// Removed below checksum field from Metadata as
// it should be part of send-command which keeps checksum of header + payload
//optional sfixed64 checksum = 10;
// differentiate single and batch message metadata
optional int32 num_messages_in_batch = 11 [default = 1];

// the timestamp that this event occurs. it is typically set by applications.
// if this field is omitted, `publish_time` can be used for the purpose of `event_time`.
optional uint64 event_time = 12 [default = 0];
// Contains encryption key name, encrypted key and metadata to describe the key
repeated EncryptionKeys encryption_keys = 13;
// Algorithm used to encrypt data key
optional string encryption_algo = 14;
// Additional parameters required by encryption
optional bytes encryption_param = 15;
optional bytes schema_version = 16;

optional bool partition_key_b64_encoded = 17 [ default = false ];
// Specific a key to overwrite the message key which used for ordering dispatch in Key_Shared mode.
optional bytes ordering_key = 18;

// Mark the message to be delivered at or after the specified timestamp
optional int64 deliver_at_time = 19;

// Identify whether a message is a "marker" message used for
// internal metadata instead of application published data.
// Markers will generally not be propagated back to clients
optional int32 marker_type = 20;

// transaction related message info
optional uint64 txnid_least_bits = 22 [default = 0];
optional uint64 txnid_most_bits = 23 [default = 0];

/// Add highest sequence id to support batch message with external sequence id
optional uint64 highest_sequence_id = 24 [default = 0];

}

message SingleMessageMetadata {

repeated KeyValue properties    = 1;
optional string partition_key   = 2;
required int32 payload_size    = 3;
optional bool compacted_out     = 4 [default = false];

// the timestamp that this event occurs. it is typically set by applications.
// if this field is omitted, `publish_time` can be used for the purpose of `event_time`.
optional uint64 event_time = 5 [default = 0];
optional bool partition_key_b64_encoded = 6 [ default = false ];
// Specific a key to overwrite the message key which used for ordering dispatch in Key_Shared mode.
optional bytes ordering_key = 7;
// Allows consumer retrieve the sequence id that the producer set.
optional uint64 sequence_id = 8;

}

enum ServerError {

UnknownError        = 0;
MetadataError       = 1; // Error with ZK/metadata
PersistenceError    = 2; // Error writing reading from BK
AuthenticationError = 3; // Non valid authentication
AuthorizationError  = 4; // Not authorized to use resource

ConsumerBusy        = 5; // Unable to subscribe/unsubscribe because
                         // other consumers are connected
ServiceNotReady     = 6; // Any error that requires client retry operation with a fresh lookup
ProducerBlockedQuotaExceededError = 7; // Unable to create producer because backlog quota exceeded
ProducerBlockedQuotaExceededException = 8; // Exception while creating producer because quota exceeded
ChecksumError = 9; // Error while verifying message checksum
UnsupportedVersionError = 10; // Error when an older client/version doesn't support a required feature
TopicNotFound = 11; // Topic not found
SubscriptionNotFound = 12; // Subscription not found
ConsumerNotFound = 13; // Consumer not found
TooManyRequests = 14; // Error with too many simultaneously request
TopicTerminatedError = 15; // The topic has been terminated

ProducerBusy         = 16; // Producer with same name is already connected
InvalidTopicName = 17; // The topic name is not valid

IncompatibleSchema = 18; // Specified schema was incompatible with topic schema
ConsumerAssignError = 19; // Dispatcher assign consumer error

TransactionCoordinatorNotFound = 20; // Transaction coordinator not found error
InvalidTxnStatus = 21; // Invalid txn status error

}

enum AuthMethod {

AuthMethodNone   = 0;
AuthMethodYcaV1  = 1;
AuthMethodAthens = 2;

}

// Each protocol version identify new features that are // incrementally added to the protocol enum ProtocolVersion {

v0 = 0;  // Initial versioning
v1 = 1;  // Added application keep-alive
v2 = 2;  // Added RedeliverUnacknowledgedMessages Command
v3 = 3;  // Added compression with LZ4 and ZLib
v4 = 4;  // Added batch message support
v5 = 5;  // Added disconnect client w/o closing connection
v6 = 6;  // Added checksum computation for metadata + payload
v7 = 7;  // Added CommandLookupTopic - Binary Lookup
v8 = 8;  // Added CommandConsumerStats - Client fetches broker side consumer stats
v9 = 9;  // Added end of topic notification
v10 = 10;// Added proxy to broker
v11 = 11;// C++ consumers before this version are not correctly handling the checksum field
v12 = 12;// Added get topic's last messageId from broker
         // Added CommandActiveConsumerChange
         // Added CommandGetTopicsOfNamespace
v13 = 13; // Schema-registry : added avro schema format for json
v14 = 14; // Add CommandAuthChallenge and CommandAuthResponse for mutual auth
          // Added Key_Shared subscription
v15 = 15; // Add CommandGetOrCreateSchema and CommandGetOrCreateSchemaResponse

}

message CommandConnect {

required string client_version = 1;
optional AuthMethod auth_method = 2; // Deprecated. Use "auth_method_name" instead.
optional string auth_method_name = 5;
optional bytes auth_data = 3;
optional int32 protocol_version = 4 [default = 0];

// Client can ask to be proxyied to a specific broker
// This is only honored by a Pulsar proxy
optional string proxy_to_broker_url = 6;

// Original principal that was verified by
// a Pulsar proxy. In this case the auth info above
// will be the auth of the proxy itself
optional string original_principal = 7;

// Original auth role and auth Method that was passed
// to the proxy. In this case the auth info above
// will be the auth of the proxy itself
optional string original_auth_data = 8;
optional string original_auth_method = 9;

}

message CommandConnected {

required string server_version = 1;
optional int32 protocol_version = 2 [default = 0];
optional int32 max_message_size = 3;

}

message CommandAuthResponse {

optional string client_version = 1;
optional AuthData response = 2;
optional int32 protocol_version = 3 [default = 0];

}

message CommandAuthChallenge {

optional string server_version = 1;
optional AuthData challenge = 2;
optional int32 protocol_version = 3 [default = 0];

}

// To support mutual authentication type, such as Sasl, reuse this command to mutual auth. message AuthData {

optional string auth_method_name = 1;
optional bytes auth_data = 2;

}

enum KeySharedMode {

AUTO_SPLIT = 0;
STICKY = 1;

}

message KeySharedMeta {

required KeySharedMode keySharedMode = 1;
repeated IntRange hashRanges = 3;

}

message CommandSubscribe {

enum SubType {
    Exclusive = 0;
    Shared    = 1;
    Failover  = 2;
    Key_Shared = 3;
}
required string topic        = 1;
required string subscription = 2;
required SubType subType     = 3;

required uint64 consumer_id  = 4;
required uint64 request_id   = 5;
optional string consumer_name = 6;
optional int32 priority_level = 7;

// Signal wether the subscription should be backed by a
// durable cursor or not
optional bool durable = 8 [default = true];

// If specified, the subscription will position the cursor
// markd-delete position  on the particular message id and
// will send messages from that point
optional MessageIdData start_message_id = 9;

/// Add optional metadata key=value to this consumer
repeated KeyValue metadata = 10;

optional bool read_compacted = 11;

optional Schema schema = 12;
enum InitialPosition {
    Latest   = 0;
    Earliest = 1;
}
// Signal whether the subscription will initialize on latest
// or not -- earliest
optional InitialPosition initialPosition = 13 [default = Latest];

// Mark the subscription as "replicated". Pulsar will make sure
// to periodically sync the state of replicated subscriptions
// across different clusters (when using geo-replication).
optional bool replicate_subscription_state = 14;

// If true, the subscribe operation will cause a topic to be 
// created if it does not exist already (and if topic auto-creation
// is allowed by broker.
// If false, the subscribe operation will fail if the topic 
// does not exist.
optional bool force_topic_creation = 15 [default = true];

// If specified, the subscription will reset cursor's position back 
// to specified seconds and  will send messages from that point
optional uint64 start_message_rollback_duration_sec = 16 [default = 0];

optional KeySharedMeta keySharedMeta = 17;

}

message CommandPartitionedTopicMetadata {

required string topic            = 1;
required uint64 request_id       = 2;
// TODO - Remove original_principal, original_auth_data, original_auth_method
// Original principal that was verified by
// a Pulsar proxy.
optional string original_principal = 3;

// Original auth role and auth Method that was passed
// to the proxy.
optional string original_auth_data = 4;
optional string original_auth_method = 5;

}

message CommandPartitionedTopicMetadataResponse {

enum LookupType {
    Success  = 0;
    Failed   = 1;
}
optional uint32 partitions            = 1;  // Optional in case of error
required uint64 request_id            = 2;
optional LookupType response          = 3;
optional ServerError error            = 4;
optional string message               = 5;

}

message CommandLookupTopic {

required string topic            = 1;
required uint64 request_id       = 2;
optional bool authoritative      = 3 [default = false];

// TODO - Remove original_principal, original_auth_data, original_auth_method
// Original principal that was verified by
// a Pulsar proxy.
optional string original_principal = 4;

// Original auth role and auth Method that was passed
// to the proxy.
optional string original_auth_data = 5;
optional string original_auth_method = 6;

}

message CommandLookupTopicResponse {

enum LookupType {
    Redirect = 0;
    Connect  = 1;
    Failed   = 2;
}

optional string brokerServiceUrl      = 1; // Optional in case of error
optional string brokerServiceUrlTls   = 2;
optional LookupType response          = 3;
required uint64 request_id            = 4;
optional bool authoritative           = 5 [default = false];
optional ServerError error            = 6;
optional string message               = 7;

// If it's true, indicates to the client that it must
// always connect through the service url after the
// lookup has been completed.
optional bool proxy_through_service_url = 8 [default = false];

}

/// Create a new Producer on a topic, assigning the given producer_id, /// all messages sent with this producer_id will be persisted on the topic message CommandProducer {

required string topic         = 1;
required uint64 producer_id   = 2;
required uint64 request_id    = 3;

/// If a producer name is specified, the name will be used,
/// otherwise the broker will generate a unique name
optional string producer_name = 4;

optional bool encrypted       = 5 [default = false];

/// Add optional metadata key=value to this producer
repeated KeyValue metadata    = 6;

optional Schema schema = 7;

// If producer reconnect to broker, the epoch of this producer will +1
optional uint64 epoch = 8 [default = 0];

// Indicate the name of the producer is generated or user provided
// Use default true here is in order to be forward compatible with the client
optional bool user_provided_producer_name = 9 [default = true];

}

message CommandSend {

required uint64 producer_id = 1;
required uint64 sequence_id = 2;
optional int32 num_messages = 3 [default = 1];
optional uint64 txnid_least_bits = 4 [default = 0];
optional uint64 txnid_most_bits = 5 [default = 0];

/// Add highest sequence id to support batch message with external sequence id
optional uint64 highest_sequence_id = 6 [default = 0];

}

message CommandSendReceipt {

required uint64 producer_id = 1;
required uint64 sequence_id = 2;
optional MessageIdData message_id = 3;
optional uint64 highest_sequence_id = 4 [default = 0];

}

message CommandSendError {

required uint64 producer_id = 1;
required uint64 sequence_id = 2;
required ServerError error  = 3;
required string message     = 4;

}

message CommandMessage {

required uint64 consumer_id       = 1;
required MessageIdData message_id = 2;
optional uint32 redelivery_count  = 3 [default = 0];

}

message CommandAck {

enum AckType {
    Individual = 0;
    Cumulative = 1;
}

required uint64 consumer_id       = 1;
required AckType ack_type         = 2;

// In case of individual acks, the client can pass a list of message ids
repeated MessageIdData message_id = 3;

// Acks can contain a flag to indicate the consumer
// received an invalid message that got discarded
// before being passed on to the application.
enum ValidationError {
    UncompressedSizeCorruption = 0;
    DecompressionError = 1;
    ChecksumMismatch = 2;
    BatchDeSerializeError = 3;
    DecryptionError = 4;
}

optional ValidationError validation_error = 4;
repeated KeyLongValue properties = 5;

optional uint64 txnid_least_bits = 6 [default = 0];
optional uint64 txnid_most_bits = 7 [default = 0];

}

message CommandAckResponse {

required uint64 consumer_id = 1;
optional uint64 txnid_least_bits  = 2 [default = 0];
optional uint64 txnid_most_bits = 3 [default = 0];
optional ServerError error = 4;
optional string message = 5;

}

// changes on active consumer message CommandActiveConsumerChange {

required uint64 consumer_id    = 1;
optional bool is_active     = 2 [default = false];

}

message CommandFlow {

required uint64 consumer_id       = 1;

// Max number of messages to prefetch, in addition
// of any number previously specified
required uint32 messagePermits     = 2;

}

message CommandUnsubscribe {

required uint64 consumer_id = 1;
required uint64 request_id  = 2;

}

// Reset an existing consumer to a particular message id message CommandSeek {

required uint64 consumer_id = 1;
required uint64 request_id  = 2;

optional MessageIdData message_id = 3;
optional uint64 message_publish_time = 4;

}

// Message sent by broker to client when a topic // has been forcefully terminated and there are no more // messages left to consume message CommandReachedEndOfTopic {

required uint64 consumer_id = 1;

}

message CommandCloseProducer {

required uint64 producer_id = 1;
required uint64 request_id = 2;

}

message CommandCloseConsumer {

required uint64 consumer_id = 1;
required uint64 request_id = 2;

}

message CommandRedeliverUnacknowledgedMessages {

required uint64 consumer_id = 1;
repeated MessageIdData message_ids = 2;

}

message CommandSuccess {

required uint64 request_id = 1;
optional Schema schema = 2;

}

/// Response from CommandProducer message CommandProducerSuccess {

required uint64 request_id    = 1;
required string producer_name = 2;

// The last sequence id that was stored by this producer in the previous session
// This will only be meaningful if deduplication has been enabled.
optional int64  last_sequence_id = 3 [default = -1];
optional bytes schema_version = 4;

}

message CommandError {

required uint64 request_id  = 1;
required ServerError error = 2;
required string message    = 3;

}

// Commands to probe the state of connection. // When either client or broker doesn't receive commands for certain // amount of time, they will send a Ping probe. message CommandPing { } message CommandPong { }

message CommandConsumerStats {

required uint64 request_id         = 1;
// required string topic_name         = 2;
// required string subscription_name  = 3;
required uint64 consumer_id        = 4;

}

message CommandConsumerStatsResponse {

required uint64 request_id              = 1;
optional ServerError error_code         = 2;
optional string error_message           = 3;

/// Total rate of messages delivered to the consumer. msg/s
optional double msgRateOut                  = 4;

/// Total throughput delivered to the consumer. bytes/s
optional double msgThroughputOut            = 5;

/// Total rate of messages redelivered by this consumer. msg/s
optional double msgRateRedeliver            = 6;

/// Name of the consumer
optional string consumerName                = 7;

/// Number of available message permits for the consumer
optional uint64 availablePermits            = 8;

/// Number of unacknowledged messages for the consumer
optional uint64 unackedMessages             = 9;

/// Flag to verify if consumer is blocked due to reaching threshold of unacked messages
optional bool blockedConsumerOnUnackedMsgs  = 10;

/// Address of this consumer
optional string address                     = 11;

/// Timestamp of connection
optional string connectedSince              = 12;

/// Whether this subscription is Exclusive or Shared or Failover
optional string type                        = 13;

/// Total rate of messages expired on this subscription. msg/s
optional double msgRateExpired              = 14;

/// Number of messages in the subscription backlog
optional uint64 msgBacklog                  = 15;

}

message CommandGetLastMessageId {

required uint64 consumer_id = 1;
required uint64 request_id  = 2;

}

message CommandGetLastMessageIdResponse {

required MessageIdData last_message_id = 1;
required uint64 request_id  = 2;

}

message CommandGetTopicsOfNamespace {

enum Mode {
    PERSISTENT = 0;
    NON_PERSISTENT = 1;
    ALL = 2;
}
required uint64 request_id    = 1;
required string namespace    = 2;
optional Mode mode = 3 [default = PERSISTENT];

}

message CommandGetTopicsOfNamespaceResponse {

required uint64 request_id    = 1;
repeated string topics         = 2;

}

message CommandGetSchema {

required uint64 request_id = 1;
required string topic      = 2;

optional bytes schema_version = 3;

}

message CommandGetSchemaResponse {

required uint64 request_id      = 1;
optional ServerError error_code = 2;
optional string error_message   = 3;

optional Schema schema          = 4;
optional bytes schema_version   = 5;

}

message CommandGetOrCreateSchema {

required uint64 request_id = 1;
required string topic      = 2;
required Schema schema     = 3;

}

message CommandGetOrCreateSchemaResponse {

required uint64 request_id      = 1;
optional ServerError error_code = 2;
optional string error_message   = 3;

optional bytes schema_version   = 4;

}

/// — transaction related —

enum TxnAction {

COMMIT = 0;
ABORT = 1;

}

message CommandNewTxn {

required uint64 request_id = 1;
optional uint64 txn_ttl_seconds = 2 [default = 0];
optional uint64 tc_id = 3 [default = 0];

}

message CommandNewTxnResponse {

required uint64 request_id = 1;
optional uint64 txnid_least_bits = 2 [default = 0];
optional uint64 txnid_most_bits = 3 [default = 0];
optional ServerError error = 4;
optional string message = 5;

}

message CommandAddPartitionToTxn {

required uint64 request_id = 1;
optional uint64 txnid_least_bits = 2 [default = 0];
optional uint64 txnid_most_bits = 3 [default = 0];
repeated string partitions = 4;

}

message CommandAddPartitionToTxnResponse {

required uint64 request_id = 1;
optional uint64 txnid_least_bits = 2 [default = 0];
optional uint64 txnid_most_bits = 3 [default = 0];
optional ServerError error = 4;
optional string message = 5;

}

message Subscription {

required string topic = 1;
required string subscription = 2;

} message CommandAddSubscriptionToTxn {

required uint64 request_id = 1;
optional uint64 txnid_least_bits = 2 [default = 0];
optional uint64 txnid_most_bits = 3 [default = 0];
repeated Subscription subscription = 4;

}

message CommandAddSubscriptionToTxnResponse {

required uint64 request_id = 1;
optional uint64 txnid_least_bits = 2 [default = 0];
optional uint64 txnid_most_bits = 3 [default = 0];
optional ServerError error = 4;
optional string message = 5;

}

message CommandEndTxn {

required uint64 request_id = 1;
optional uint64 txnid_least_bits = 2 [default = 0];
optional uint64 txnid_most_bits = 3 [default = 0];
optional TxnAction txn_action = 4;

}

message CommandEndTxnResponse {

required uint64 request_id = 1;
optional uint64 txnid_least_bits = 2 [default = 0];
optional uint64 txnid_most_bits = 3 [default = 0];
optional ServerError error = 4;
optional string message = 5;

}

message CommandEndTxnOnPartition {

required uint64 request_id = 1;
optional uint64 txnid_least_bits = 2 [default = 0];
optional uint64 txnid_most_bits = 3 [default = 0];
optional string topic = 4;
optional TxnAction txn_action = 5;

}

message CommandEndTxnOnPartitionResponse {

required uint64 request_id = 1;
optional uint64 txnid_least_bits = 2 [default = 0];
optional uint64 txnid_most_bits = 3 [default = 0];
optional ServerError error = 4;
optional string message = 5;

}

message CommandEndTxnOnSubscription {

required uint64 request_id = 1;
optional uint64 txnid_least_bits = 2 [default = 0];
optional uint64 txnid_most_bits = 3 [default = 0];
optional Subscription subscription= 4;
optional TxnAction txn_action = 5;

}

message CommandEndTxnOnSubscriptionResponse {

required uint64 request_id = 1;
optional uint64 txnid_least_bits = 2 [default = 0];
optional uint64 txnid_most_bits = 3 [default = 0];
optional ServerError error = 4;
optional string message = 5;

}

message BaseCommand {

enum Type {
    CONNECT     = 2;
    CONNECTED   = 3;
    SUBSCRIBE   = 4;

    PRODUCER    = 5;

    SEND        = 6;
    SEND_RECEIPT= 7;
    SEND_ERROR  = 8;

    MESSAGE     = 9;
    ACK         = 10;
    FLOW        = 11;

    UNSUBSCRIBE = 12;

    SUCCESS     = 13;
    ERROR       = 14;

    CLOSE_PRODUCER = 15;
    CLOSE_CONSUMER = 16;

    PRODUCER_SUCCESS = 17;

    PING = 18;
    PONG = 19;

    REDELIVER_UNACKNOWLEDGED_MESSAGES = 20;

    PARTITIONED_METADATA           = 21;
    PARTITIONED_METADATA_RESPONSE  = 22;

    LOOKUP           = 23;
    LOOKUP_RESPONSE  = 24;

    CONSUMER_STATS        = 25;
    CONSUMER_STATS_RESPONSE    = 26;

    REACHED_END_OF_TOPIC = 27;

    SEEK = 28;

    GET_LAST_MESSAGE_ID = 29;
    GET_LAST_MESSAGE_ID_RESPONSE = 30;

    ACTIVE_CONSUMER_CHANGE = 31;

    GET_TOPICS_OF_NAMESPACE             = 32;
    GET_TOPICS_OF_NAMESPACE_RESPONSE     = 33;

    GET_SCHEMA = 34;
    GET_SCHEMA_RESPONSE = 35;

    AUTH_CHALLENGE = 36;
    AUTH_RESPONSE = 37;

    ACK_RESPONSE = 38;

    GET_OR_CREATE_SCHEMA = 39;
    GET_OR_CREATE_SCHEMA_RESPONSE = 40;

    // transaction related
    NEW_TXN = 50;
    NEW_TXN_RESPONSE = 51;

    ADD_PARTITION_TO_TXN = 52;
    ADD_PARTITION_TO_TXN_RESPONSE = 53;

    ADD_SUBSCRIPTION_TO_TXN = 54;
    ADD_SUBSCRIPTION_TO_TXN_RESPONSE = 55;

    END_TXN = 56;
    END_TXN_RESPONSE = 57;

    END_TXN_ON_PARTITION = 58;
    END_TXN_ON_PARTITION_RESPONSE = 59;

    END_TXN_ON_SUBSCRIPTION = 60;
    END_TXN_ON_SUBSCRIPTION_RESPONSE = 61;

}

required Type type = 1;

optional CommandConnect connect          = 2;
optional CommandConnected connected      = 3;

optional CommandSubscribe subscribe      = 4;
optional CommandProducer producer        = 5;
optional CommandSend send                = 6;
optional CommandSendReceipt send_receipt = 7;
optional CommandSendError send_error     = 8;
optional CommandMessage message          = 9;
optional CommandAck ack                  = 10;
optional CommandFlow flow                = 11;
optional CommandUnsubscribe unsubscribe  = 12;

optional CommandSuccess success          = 13;
optional CommandError error              = 14;

optional CommandCloseProducer close_producer = 15;
optional CommandCloseConsumer close_consumer = 16;

optional CommandProducerSuccess producer_success = 17;
optional CommandPing ping = 18;
optional CommandPong pong = 19;
optional CommandRedeliverUnacknowledgedMessages redeliverUnacknowledgedMessages = 20;

optional CommandPartitionedTopicMetadata  partitionMetadata                 = 21;
optional CommandPartitionedTopicMetadataResponse partitionMetadataResponse  = 22;

optional CommandLookupTopic lookupTopic                    = 23;
optional CommandLookupTopicResponse lookupTopicResponse    = 24;

optional CommandConsumerStats consumerStats                         = 25;
optional CommandConsumerStatsResponse consumerStatsResponse         = 26;

optional CommandReachedEndOfTopic reachedEndOfTopic  = 27;

optional CommandSeek seek = 28;

optional CommandGetLastMessageId getLastMessageId = 29;
optional CommandGetLastMessageIdResponse getLastMessageIdResponse = 30;

optional CommandActiveConsumerChange active_consumer_change = 31;

optional CommandGetTopicsOfNamespace getTopicsOfNamespace = 32;
optional CommandGetTopicsOfNamespaceResponse getTopicsOfNamespaceResponse = 33;

optional CommandGetSchema getSchema = 34;
optional CommandGetSchemaResponse getSchemaResponse = 35;

optional CommandAuthChallenge authChallenge = 36;
optional CommandAuthResponse authResponse = 37;

optional CommandAckResponse ackResponse = 38;

optional CommandGetOrCreateSchema getOrCreateSchema = 39;
optional CommandGetOrCreateSchemaResponse getOrCreateSchemaResponse = 40;

// transaction related
optional CommandNewTxn newTxn = 50;
optional CommandNewTxnResponse newTxnResponse = 51;
optional CommandAddPartitionToTxn addPartitionToTxn= 52;
optional CommandAddPartitionToTxnResponse addPartitionToTxnResponse = 53;
optional CommandAddSubscriptionToTxn addSubscriptionToTxn = 54;
optional CommandAddSubscriptionToTxnResponse addSubscriptionToTxnResponse = 55;
optional CommandEndTxn endTxn = 56;
optional CommandEndTxnResponse endTxnResponse = 57;
optional CommandEndTxnOnPartition endTxnOnPartition = 58;
optional CommandEndTxnOnPartitionResponse endTxnOnPartitionResponse = 59;
optional CommandEndTxnOnSubscription endTxnOnSubscription = 60;
optional CommandEndTxnOnSubscriptionResponse endTxnOnSubscriptionResponse = 61;

}