diff --git a/weed/messaging/msg_broker_grpc_server.go b/weed/messaging/msg_broker_grpc_server.go index a29bc11b0..5b93b8f62 100644 --- a/weed/messaging/msg_broker_grpc_server.go +++ b/weed/messaging/msg_broker_grpc_server.go @@ -14,7 +14,7 @@ import ( "github.com/chrislusf/seaweedfs/weed/util/log_buffer" ) -func (broker *MessageBroker) Subscribe(request *messaging_pb.SubscribeRequest, server messaging_pb.SeaweedMessaging_SubscribeServer) error { +func (broker *MessageBroker) Subscribe(server messaging_pb.SeaweedMessaging_SubscribeServer) error { panic("implement me") } @@ -28,14 +28,16 @@ func (broker *MessageBroker) Publish(stream messaging_pb.SeaweedMessaging_Publis if err != nil { return err } - namespace, topic, partition := in.Namespace, in.Topic, in.Partition + namespace, topic, partition := in.Init.Namespace, in.Init.Topic, in.Init.Partition updatesChan := make(chan int32) go func() { for update := range updatesChan { if err := stream.Send(&messaging_pb.PublishResponse{ - PartitionCount: update, + Config: &messaging_pb.PublishResponse_ConfigMessage{ + PartitionCount: update, + }, }); err != nil { glog.V(0).Infof("err sending publish response: %v", err) return @@ -73,9 +75,9 @@ func (broker *MessageBroker) Publish(stream messaging_pb.SeaweedMessaging_Publis m := &messaging_pb.Message{ Timestamp: time.Now().UnixNano(), - Key: in.Key, - Value: in.Value, - Headers: in.Headers, + Key: in.Data.Key, + Value: in.Data.Value, + Headers: in.Data.Headers, } data, err := proto.Marshal(m) @@ -84,7 +86,7 @@ func (broker *MessageBroker) Publish(stream messaging_pb.SeaweedMessaging_Publis continue } - logBuffer.AddToBuffer(in.Key, data) + logBuffer.AddToBuffer(in.Data.Key, data) } } diff --git a/weed/pb/messaging.proto b/weed/pb/messaging.proto index 050c6fb17..10e317221 100644 --- a/weed/pb/messaging.proto +++ b/weed/pb/messaging.proto @@ -9,7 +9,7 @@ option java_outer_classname = "MessagingProto"; service SeaweedMessaging { - rpc Subscribe (SubscribeRequest) returns (stream Message) { + rpc Subscribe (stream SubscriberMessage) returns (stream BrokerMessage) { } rpc Publish (stream PublishRequest) returns (stream PublishResponse) { @@ -25,17 +25,25 @@ service SeaweedMessaging { ////////////////////////////////////////////////// -message SubscribeRequest { - string namespace = 1; - string topic = 2; - int32 partition = 3; - enum StartPosition { - LATEST = 0; // Start at the newest message - EARLIEST = 1; // Start at the oldest message - TIMESTAMP = 2; // Start after a specified timestamp, exclusive +message SubscriberMessage { + message InitMessage { + string namespace = 1; + string topic = 2; + int32 partition = 3; + enum StartPosition { + LATEST = 0; // Start at the newest message + EARLIEST = 1; // Start at the oldest message + TIMESTAMP = 2; // Start after a specified timestamp, exclusive + } + StartPosition startPosition = 4; // Where to begin consuming from + int64 timestampNs = 5; // timestamp in nano seconds + string subscriber_id = 6; // uniquely identify a subscriber to track consumption } - StartPosition startPosition = 4; // Where to begin consuming from - int64 timestampNs = 5; // timestamp in nano seconds + InitMessage init = 1; + message AckMessage { + int64 message_id = 1; + } + AckMessage ack = 2; } message Message { @@ -45,17 +53,38 @@ message Message { map headers = 4; // Message headers } +message BrokerMessage { + Message data = 1; + message RedirectMessage { + string new_broker = 1; + } + RedirectMessage redirect = 2; +} + message PublishRequest { - string namespace = 1; // only needed on the initial request - string topic = 2; // only needed on the initial request - int32 partition = 4; - bytes key = 5; // Message key - bytes value = 6; // Message payload - map headers = 7; // Message headers + message InitMessage { + string namespace = 1; // only needed on the initial request + string topic = 2; // only needed on the initial request + int32 partition = 3; + } + InitMessage init = 1; + message DataMessage { + bytes key = 1; // Message key + bytes value = 2; // Message payload + map headers = 3; // Message headers + } + DataMessage data = 2; } message PublishResponse { - int32 partition_count = 1; + message ConfigMessage { + int32 partition_count = 1; + } + ConfigMessage config = 1; + message RedirectMessage { + string new_broker = 1; + } + RedirectMessage redirect = 2; } message ConfigureTopicRequest { diff --git a/weed/pb/messaging_pb/messaging.pb.go b/weed/pb/messaging_pb/messaging.pb.go index 64fc7c20b..eb20e69d6 100644 --- a/weed/pb/messaging_pb/messaging.pb.go +++ b/weed/pb/messaging_pb/messaging.pb.go @@ -9,8 +9,9 @@ It is generated from these files: messaging.proto It has these top-level messages: - SubscribeRequest + SubscriberMessage Message + BrokerMessage PublishRequest PublishResponse ConfigureTopicRequest @@ -40,80 +41,130 @@ var _ = math.Inf // proto package needs to be updated. const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package -type SubscribeRequest_StartPosition int32 +type SubscriberMessage_InitMessage_StartPosition int32 const ( - SubscribeRequest_LATEST SubscribeRequest_StartPosition = 0 - SubscribeRequest_EARLIEST SubscribeRequest_StartPosition = 1 - SubscribeRequest_TIMESTAMP SubscribeRequest_StartPosition = 2 + SubscriberMessage_InitMessage_LATEST SubscriberMessage_InitMessage_StartPosition = 0 + SubscriberMessage_InitMessage_EARLIEST SubscriberMessage_InitMessage_StartPosition = 1 + SubscriberMessage_InitMessage_TIMESTAMP SubscriberMessage_InitMessage_StartPosition = 2 ) -var SubscribeRequest_StartPosition_name = map[int32]string{ +var SubscriberMessage_InitMessage_StartPosition_name = map[int32]string{ 0: "LATEST", 1: "EARLIEST", 2: "TIMESTAMP", } -var SubscribeRequest_StartPosition_value = map[string]int32{ +var SubscriberMessage_InitMessage_StartPosition_value = map[string]int32{ "LATEST": 0, "EARLIEST": 1, "TIMESTAMP": 2, } -func (x SubscribeRequest_StartPosition) String() string { - return proto.EnumName(SubscribeRequest_StartPosition_name, int32(x)) +func (x SubscriberMessage_InitMessage_StartPosition) String() string { + return proto.EnumName(SubscriberMessage_InitMessage_StartPosition_name, int32(x)) } -func (SubscribeRequest_StartPosition) EnumDescriptor() ([]byte, []int) { +func (SubscriberMessage_InitMessage_StartPosition) EnumDescriptor() ([]byte, []int) { + return fileDescriptor0, []int{0, 0, 0} +} + +type SubscriberMessage struct { + Init *SubscriberMessage_InitMessage `protobuf:"bytes,1,opt,name=init" json:"init,omitempty"` + Ack *SubscriberMessage_AckMessage `protobuf:"bytes,2,opt,name=ack" json:"ack,omitempty"` +} + +func (m *SubscriberMessage) Reset() { *m = SubscriberMessage{} } +func (m *SubscriberMessage) String() string { return proto.CompactTextString(m) } +func (*SubscriberMessage) ProtoMessage() {} +func (*SubscriberMessage) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{0} } + +func (m *SubscriberMessage) GetInit() *SubscriberMessage_InitMessage { + if m != nil { + return m.Init + } + return nil +} + +func (m *SubscriberMessage) GetAck() *SubscriberMessage_AckMessage { + if m != nil { + return m.Ack + } + return nil +} + +type SubscriberMessage_InitMessage struct { + Namespace string `protobuf:"bytes,1,opt,name=namespace" json:"namespace,omitempty"` + Topic string `protobuf:"bytes,2,opt,name=topic" json:"topic,omitempty"` + Partition int32 `protobuf:"varint,3,opt,name=partition" json:"partition,omitempty"` + StartPosition SubscriberMessage_InitMessage_StartPosition `protobuf:"varint,4,opt,name=startPosition,enum=messaging_pb.SubscriberMessage_InitMessage_StartPosition" json:"startPosition,omitempty"` + TimestampNs int64 `protobuf:"varint,5,opt,name=timestampNs" json:"timestampNs,omitempty"` + SubscriberId string `protobuf:"bytes,6,opt,name=subscriber_id,json=subscriberId" json:"subscriber_id,omitempty"` +} + +func (m *SubscriberMessage_InitMessage) Reset() { *m = SubscriberMessage_InitMessage{} } +func (m *SubscriberMessage_InitMessage) String() string { return proto.CompactTextString(m) } +func (*SubscriberMessage_InitMessage) ProtoMessage() {} +func (*SubscriberMessage_InitMessage) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{0, 0} } -type SubscribeRequest struct { - Namespace string `protobuf:"bytes,1,opt,name=namespace" json:"namespace,omitempty"` - Topic string `protobuf:"bytes,2,opt,name=topic" json:"topic,omitempty"` - Partition int32 `protobuf:"varint,3,opt,name=partition" json:"partition,omitempty"` - StartPosition SubscribeRequest_StartPosition `protobuf:"varint,4,opt,name=startPosition,enum=messaging_pb.SubscribeRequest_StartPosition" json:"startPosition,omitempty"` - TimestampNs int64 `protobuf:"varint,5,opt,name=timestampNs" json:"timestampNs,omitempty"` -} - -func (m *SubscribeRequest) Reset() { *m = SubscribeRequest{} } -func (m *SubscribeRequest) String() string { return proto.CompactTextString(m) } -func (*SubscribeRequest) ProtoMessage() {} -func (*SubscribeRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{0} } - -func (m *SubscribeRequest) GetNamespace() string { +func (m *SubscriberMessage_InitMessage) GetNamespace() string { if m != nil { return m.Namespace } return "" } -func (m *SubscribeRequest) GetTopic() string { +func (m *SubscriberMessage_InitMessage) GetTopic() string { if m != nil { return m.Topic } return "" } -func (m *SubscribeRequest) GetPartition() int32 { +func (m *SubscriberMessage_InitMessage) GetPartition() int32 { if m != nil { return m.Partition } return 0 } -func (m *SubscribeRequest) GetStartPosition() SubscribeRequest_StartPosition { +func (m *SubscriberMessage_InitMessage) GetStartPosition() SubscriberMessage_InitMessage_StartPosition { if m != nil { return m.StartPosition } - return SubscribeRequest_LATEST + return SubscriberMessage_InitMessage_LATEST } -func (m *SubscribeRequest) GetTimestampNs() int64 { +func (m *SubscriberMessage_InitMessage) GetTimestampNs() int64 { if m != nil { return m.TimestampNs } return 0 } +func (m *SubscriberMessage_InitMessage) GetSubscriberId() string { + if m != nil { + return m.SubscriberId + } + return "" +} + +type SubscriberMessage_AckMessage struct { + MessageId int64 `protobuf:"varint,1,opt,name=message_id,json=messageId" json:"message_id,omitempty"` +} + +func (m *SubscriberMessage_AckMessage) Reset() { *m = SubscriberMessage_AckMessage{} } +func (m *SubscriberMessage_AckMessage) String() string { return proto.CompactTextString(m) } +func (*SubscriberMessage_AckMessage) ProtoMessage() {} +func (*SubscriberMessage_AckMessage) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{0, 1} } + +func (m *SubscriberMessage_AckMessage) GetMessageId() int64 { + if m != nil { + return m.MessageId + } + return 0 +} + type Message struct { Timestamp int64 `protobuf:"varint,1,opt,name=timestamp" json:"timestamp,omitempty"` Key []byte `protobuf:"bytes,2,opt,name=key,proto3" json:"key,omitempty"` @@ -154,56 +205,130 @@ func (m *Message) GetHeaders() map[string][]byte { return nil } +type BrokerMessage struct { + Data *Message `protobuf:"bytes,1,opt,name=data" json:"data,omitempty"` + Redirect *BrokerMessage_RedirectMessage `protobuf:"bytes,2,opt,name=redirect" json:"redirect,omitempty"` +} + +func (m *BrokerMessage) Reset() { *m = BrokerMessage{} } +func (m *BrokerMessage) String() string { return proto.CompactTextString(m) } +func (*BrokerMessage) ProtoMessage() {} +func (*BrokerMessage) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{2} } + +func (m *BrokerMessage) GetData() *Message { + if m != nil { + return m.Data + } + return nil +} + +func (m *BrokerMessage) GetRedirect() *BrokerMessage_RedirectMessage { + if m != nil { + return m.Redirect + } + return nil +} + +type BrokerMessage_RedirectMessage struct { + NewBroker string `protobuf:"bytes,1,opt,name=new_broker,json=newBroker" json:"new_broker,omitempty"` +} + +func (m *BrokerMessage_RedirectMessage) Reset() { *m = BrokerMessage_RedirectMessage{} } +func (m *BrokerMessage_RedirectMessage) String() string { return proto.CompactTextString(m) } +func (*BrokerMessage_RedirectMessage) ProtoMessage() {} +func (*BrokerMessage_RedirectMessage) Descriptor() ([]byte, []int) { + return fileDescriptor0, []int{2, 0} +} + +func (m *BrokerMessage_RedirectMessage) GetNewBroker() string { + if m != nil { + return m.NewBroker + } + return "" +} + type PublishRequest struct { - Namespace string `protobuf:"bytes,1,opt,name=namespace" json:"namespace,omitempty"` - Topic string `protobuf:"bytes,2,opt,name=topic" json:"topic,omitempty"` - Partition int32 `protobuf:"varint,4,opt,name=partition" json:"partition,omitempty"` - Key []byte `protobuf:"bytes,5,opt,name=key,proto3" json:"key,omitempty"` - Value []byte `protobuf:"bytes,6,opt,name=value,proto3" json:"value,omitempty"` - Headers map[string][]byte `protobuf:"bytes,7,rep,name=headers" json:"headers,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value,proto3"` + Init *PublishRequest_InitMessage `protobuf:"bytes,1,opt,name=init" json:"init,omitempty"` + Data *PublishRequest_DataMessage `protobuf:"bytes,2,opt,name=data" json:"data,omitempty"` } func (m *PublishRequest) Reset() { *m = PublishRequest{} } func (m *PublishRequest) String() string { return proto.CompactTextString(m) } func (*PublishRequest) ProtoMessage() {} -func (*PublishRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{2} } +func (*PublishRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{3} } -func (m *PublishRequest) GetNamespace() string { +func (m *PublishRequest) GetInit() *PublishRequest_InitMessage { + if m != nil { + return m.Init + } + return nil +} + +func (m *PublishRequest) GetData() *PublishRequest_DataMessage { + if m != nil { + return m.Data + } + return nil +} + +type PublishRequest_InitMessage struct { + Namespace string `protobuf:"bytes,1,opt,name=namespace" json:"namespace,omitempty"` + Topic string `protobuf:"bytes,2,opt,name=topic" json:"topic,omitempty"` + Partition int32 `protobuf:"varint,3,opt,name=partition" json:"partition,omitempty"` +} + +func (m *PublishRequest_InitMessage) Reset() { *m = PublishRequest_InitMessage{} } +func (m *PublishRequest_InitMessage) String() string { return proto.CompactTextString(m) } +func (*PublishRequest_InitMessage) ProtoMessage() {} +func (*PublishRequest_InitMessage) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{3, 0} } + +func (m *PublishRequest_InitMessage) GetNamespace() string { if m != nil { return m.Namespace } return "" } -func (m *PublishRequest) GetTopic() string { +func (m *PublishRequest_InitMessage) GetTopic() string { if m != nil { return m.Topic } return "" } -func (m *PublishRequest) GetPartition() int32 { +func (m *PublishRequest_InitMessage) GetPartition() int32 { if m != nil { return m.Partition } return 0 } -func (m *PublishRequest) GetKey() []byte { +type PublishRequest_DataMessage struct { + Key []byte `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` + Value []byte `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` + Headers map[string][]byte `protobuf:"bytes,3,rep,name=headers" json:"headers,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value,proto3"` +} + +func (m *PublishRequest_DataMessage) Reset() { *m = PublishRequest_DataMessage{} } +func (m *PublishRequest_DataMessage) String() string { return proto.CompactTextString(m) } +func (*PublishRequest_DataMessage) ProtoMessage() {} +func (*PublishRequest_DataMessage) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{3, 1} } + +func (m *PublishRequest_DataMessage) GetKey() []byte { if m != nil { return m.Key } return nil } -func (m *PublishRequest) GetValue() []byte { +func (m *PublishRequest_DataMessage) GetValue() []byte { if m != nil { return m.Value } return nil } -func (m *PublishRequest) GetHeaders() map[string][]byte { +func (m *PublishRequest_DataMessage) GetHeaders() map[string][]byte { if m != nil { return m.Headers } @@ -211,21 +336,65 @@ func (m *PublishRequest) GetHeaders() map[string][]byte { } type PublishResponse struct { - PartitionCount int32 `protobuf:"varint,1,opt,name=partition_count,json=partitionCount" json:"partition_count,omitempty"` + Config *PublishResponse_ConfigMessage `protobuf:"bytes,1,opt,name=config" json:"config,omitempty"` + Redirect *PublishResponse_RedirectMessage `protobuf:"bytes,2,opt,name=redirect" json:"redirect,omitempty"` } func (m *PublishResponse) Reset() { *m = PublishResponse{} } func (m *PublishResponse) String() string { return proto.CompactTextString(m) } func (*PublishResponse) ProtoMessage() {} -func (*PublishResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{3} } +func (*PublishResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{4} } -func (m *PublishResponse) GetPartitionCount() int32 { +func (m *PublishResponse) GetConfig() *PublishResponse_ConfigMessage { + if m != nil { + return m.Config + } + return nil +} + +func (m *PublishResponse) GetRedirect() *PublishResponse_RedirectMessage { + if m != nil { + return m.Redirect + } + return nil +} + +type PublishResponse_ConfigMessage struct { + PartitionCount int32 `protobuf:"varint,1,opt,name=partition_count,json=partitionCount" json:"partition_count,omitempty"` +} + +func (m *PublishResponse_ConfigMessage) Reset() { *m = PublishResponse_ConfigMessage{} } +func (m *PublishResponse_ConfigMessage) String() string { return proto.CompactTextString(m) } +func (*PublishResponse_ConfigMessage) ProtoMessage() {} +func (*PublishResponse_ConfigMessage) Descriptor() ([]byte, []int) { + return fileDescriptor0, []int{4, 0} +} + +func (m *PublishResponse_ConfigMessage) GetPartitionCount() int32 { if m != nil { return m.PartitionCount } return 0 } +type PublishResponse_RedirectMessage struct { + NewBroker string `protobuf:"bytes,1,opt,name=new_broker,json=newBroker" json:"new_broker,omitempty"` +} + +func (m *PublishResponse_RedirectMessage) Reset() { *m = PublishResponse_RedirectMessage{} } +func (m *PublishResponse_RedirectMessage) String() string { return proto.CompactTextString(m) } +func (*PublishResponse_RedirectMessage) ProtoMessage() {} +func (*PublishResponse_RedirectMessage) Descriptor() ([]byte, []int) { + return fileDescriptor0, []int{4, 1} +} + +func (m *PublishResponse_RedirectMessage) GetNewBroker() string { + if m != nil { + return m.NewBroker + } + return "" +} + type ConfigureTopicRequest struct { Namespace string `protobuf:"bytes,1,opt,name=namespace" json:"namespace,omitempty"` Topic string `protobuf:"bytes,2,opt,name=topic" json:"topic,omitempty"` @@ -236,7 +405,7 @@ type ConfigureTopicRequest struct { func (m *ConfigureTopicRequest) Reset() { *m = ConfigureTopicRequest{} } func (m *ConfigureTopicRequest) String() string { return proto.CompactTextString(m) } func (*ConfigureTopicRequest) ProtoMessage() {} -func (*ConfigureTopicRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{4} } +func (*ConfigureTopicRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{5} } func (m *ConfigureTopicRequest) GetNamespace() string { if m != nil { @@ -272,7 +441,7 @@ type ConfigureTopicResponse struct { func (m *ConfigureTopicResponse) Reset() { *m = ConfigureTopicResponse{} } func (m *ConfigureTopicResponse) String() string { return proto.CompactTextString(m) } func (*ConfigureTopicResponse) ProtoMessage() {} -func (*ConfigureTopicResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{5} } +func (*ConfigureTopicResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{6} } type GetTopicConfigurationRequest struct { Namespace string `protobuf:"bytes,1,opt,name=namespace" json:"namespace,omitempty"` @@ -282,7 +451,7 @@ type GetTopicConfigurationRequest struct { func (m *GetTopicConfigurationRequest) Reset() { *m = GetTopicConfigurationRequest{} } func (m *GetTopicConfigurationRequest) String() string { return proto.CompactTextString(m) } func (*GetTopicConfigurationRequest) ProtoMessage() {} -func (*GetTopicConfigurationRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{6} } +func (*GetTopicConfigurationRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{7} } func (m *GetTopicConfigurationRequest) GetNamespace() string { if m != nil { @@ -305,7 +474,7 @@ type GetTopicConfigurationResponse struct { func (m *GetTopicConfigurationResponse) Reset() { *m = GetTopicConfigurationResponse{} } func (m *GetTopicConfigurationResponse) String() string { return proto.CompactTextString(m) } func (*GetTopicConfigurationResponse) ProtoMessage() {} -func (*GetTopicConfigurationResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{7} } +func (*GetTopicConfigurationResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{8} } func (m *GetTopicConfigurationResponse) GetPartitions() int32 { if m != nil { @@ -315,15 +484,23 @@ func (m *GetTopicConfigurationResponse) GetPartitions() int32 { } func init() { - proto.RegisterType((*SubscribeRequest)(nil), "messaging_pb.SubscribeRequest") + proto.RegisterType((*SubscriberMessage)(nil), "messaging_pb.SubscriberMessage") + proto.RegisterType((*SubscriberMessage_InitMessage)(nil), "messaging_pb.SubscriberMessage.InitMessage") + proto.RegisterType((*SubscriberMessage_AckMessage)(nil), "messaging_pb.SubscriberMessage.AckMessage") proto.RegisterType((*Message)(nil), "messaging_pb.Message") + proto.RegisterType((*BrokerMessage)(nil), "messaging_pb.BrokerMessage") + proto.RegisterType((*BrokerMessage_RedirectMessage)(nil), "messaging_pb.BrokerMessage.RedirectMessage") proto.RegisterType((*PublishRequest)(nil), "messaging_pb.PublishRequest") + proto.RegisterType((*PublishRequest_InitMessage)(nil), "messaging_pb.PublishRequest.InitMessage") + proto.RegisterType((*PublishRequest_DataMessage)(nil), "messaging_pb.PublishRequest.DataMessage") proto.RegisterType((*PublishResponse)(nil), "messaging_pb.PublishResponse") + proto.RegisterType((*PublishResponse_ConfigMessage)(nil), "messaging_pb.PublishResponse.ConfigMessage") + proto.RegisterType((*PublishResponse_RedirectMessage)(nil), "messaging_pb.PublishResponse.RedirectMessage") proto.RegisterType((*ConfigureTopicRequest)(nil), "messaging_pb.ConfigureTopicRequest") proto.RegisterType((*ConfigureTopicResponse)(nil), "messaging_pb.ConfigureTopicResponse") proto.RegisterType((*GetTopicConfigurationRequest)(nil), "messaging_pb.GetTopicConfigurationRequest") proto.RegisterType((*GetTopicConfigurationResponse)(nil), "messaging_pb.GetTopicConfigurationResponse") - proto.RegisterEnum("messaging_pb.SubscribeRequest_StartPosition", SubscribeRequest_StartPosition_name, SubscribeRequest_StartPosition_value) + proto.RegisterEnum("messaging_pb.SubscriberMessage_InitMessage_StartPosition", SubscriberMessage_InitMessage_StartPosition_name, SubscriberMessage_InitMessage_StartPosition_value) } // Reference imports to suppress errors if they are not otherwise used. @@ -337,7 +514,7 @@ const _ = grpc.SupportPackageIsVersion4 // Client API for SeaweedMessaging service type SeaweedMessagingClient interface { - Subscribe(ctx context.Context, in *SubscribeRequest, opts ...grpc.CallOption) (SeaweedMessaging_SubscribeClient, error) + Subscribe(ctx context.Context, opts ...grpc.CallOption) (SeaweedMessaging_SubscribeClient, error) Publish(ctx context.Context, opts ...grpc.CallOption) (SeaweedMessaging_PublishClient, error) ConfigureTopic(ctx context.Context, in *ConfigureTopicRequest, opts ...grpc.CallOption) (*ConfigureTopicResponse, error) GetTopicConfiguration(ctx context.Context, in *GetTopicConfigurationRequest, opts ...grpc.CallOption) (*GetTopicConfigurationResponse, error) @@ -351,23 +528,18 @@ func NewSeaweedMessagingClient(cc *grpc.ClientConn) SeaweedMessagingClient { return &seaweedMessagingClient{cc} } -func (c *seaweedMessagingClient) Subscribe(ctx context.Context, in *SubscribeRequest, opts ...grpc.CallOption) (SeaweedMessaging_SubscribeClient, error) { +func (c *seaweedMessagingClient) Subscribe(ctx context.Context, opts ...grpc.CallOption) (SeaweedMessaging_SubscribeClient, error) { stream, err := grpc.NewClientStream(ctx, &_SeaweedMessaging_serviceDesc.Streams[0], c.cc, "/messaging_pb.SeaweedMessaging/Subscribe", opts...) if err != nil { return nil, err } x := &seaweedMessagingSubscribeClient{stream} - if err := x.ClientStream.SendMsg(in); err != nil { - return nil, err - } - if err := x.ClientStream.CloseSend(); err != nil { - return nil, err - } return x, nil } type SeaweedMessaging_SubscribeClient interface { - Recv() (*Message, error) + Send(*SubscriberMessage) error + Recv() (*BrokerMessage, error) grpc.ClientStream } @@ -375,8 +547,12 @@ type seaweedMessagingSubscribeClient struct { grpc.ClientStream } -func (x *seaweedMessagingSubscribeClient) Recv() (*Message, error) { - m := new(Message) +func (x *seaweedMessagingSubscribeClient) Send(m *SubscriberMessage) error { + return x.ClientStream.SendMsg(m) +} + +func (x *seaweedMessagingSubscribeClient) Recv() (*BrokerMessage, error) { + m := new(BrokerMessage) if err := x.ClientStream.RecvMsg(m); err != nil { return nil, err } @@ -435,7 +611,7 @@ func (c *seaweedMessagingClient) GetTopicConfiguration(ctx context.Context, in * // Server API for SeaweedMessaging service type SeaweedMessagingServer interface { - Subscribe(*SubscribeRequest, SeaweedMessaging_SubscribeServer) error + Subscribe(SeaweedMessaging_SubscribeServer) error Publish(SeaweedMessaging_PublishServer) error ConfigureTopic(context.Context, *ConfigureTopicRequest) (*ConfigureTopicResponse, error) GetTopicConfiguration(context.Context, *GetTopicConfigurationRequest) (*GetTopicConfigurationResponse, error) @@ -446,15 +622,12 @@ func RegisterSeaweedMessagingServer(s *grpc.Server, srv SeaweedMessagingServer) } func _SeaweedMessaging_Subscribe_Handler(srv interface{}, stream grpc.ServerStream) error { - m := new(SubscribeRequest) - if err := stream.RecvMsg(m); err != nil { - return err - } - return srv.(SeaweedMessagingServer).Subscribe(m, &seaweedMessagingSubscribeServer{stream}) + return srv.(SeaweedMessagingServer).Subscribe(&seaweedMessagingSubscribeServer{stream}) } type SeaweedMessaging_SubscribeServer interface { - Send(*Message) error + Send(*BrokerMessage) error + Recv() (*SubscriberMessage, error) grpc.ServerStream } @@ -462,10 +635,18 @@ type seaweedMessagingSubscribeServer struct { grpc.ServerStream } -func (x *seaweedMessagingSubscribeServer) Send(m *Message) error { +func (x *seaweedMessagingSubscribeServer) Send(m *BrokerMessage) error { return x.ServerStream.SendMsg(m) } +func (x *seaweedMessagingSubscribeServer) Recv() (*SubscriberMessage, error) { + m := new(SubscriberMessage) + if err := x.ServerStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + func _SeaweedMessaging_Publish_Handler(srv interface{}, stream grpc.ServerStream) error { return srv.(SeaweedMessagingServer).Publish(&seaweedMessagingPublishServer{stream}) } @@ -546,6 +727,7 @@ var _SeaweedMessaging_serviceDesc = grpc.ServiceDesc{ StreamName: "Subscribe", Handler: _SeaweedMessaging_Subscribe_Handler, ServerStreams: true, + ClientStreams: true, }, { StreamName: "Publish", @@ -560,42 +742,56 @@ var _SeaweedMessaging_serviceDesc = grpc.ServiceDesc{ func init() { proto.RegisterFile("messaging.proto", fileDescriptor0) } var fileDescriptor0 = []byte{ - // 586 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xb4, 0x95, 0xdb, 0x8b, 0xda, 0x4e, - 0x14, 0xc7, 0x9d, 0xc4, 0xcb, 0x2f, 0x67, 0xbd, 0x31, 0xfc, 0x2c, 0x41, 0x5c, 0x09, 0x69, 0xa1, - 0xe9, 0x85, 0x20, 0xf6, 0x65, 0x91, 0x42, 0x51, 0xb1, 0xed, 0x82, 0x16, 0x19, 0x7d, 0x2d, 0x4b, - 0xcc, 0xce, 0xba, 0xa1, 0x9a, 0xa4, 0x99, 0x49, 0xcb, 0xfe, 0x0d, 0x7d, 0xdd, 0x7f, 0xab, 0x7f, - 0x51, 0x5f, 0x4a, 0xae, 0x26, 0x92, 0x95, 0xd2, 0xcb, 0x5b, 0xe6, 0x3b, 0x67, 0xce, 0xf7, 0x9c, - 0xcf, 0x49, 0x26, 0xd0, 0xda, 0x53, 0xc6, 0x8c, 0xad, 0x65, 0x6f, 0x75, 0xd7, 0x73, 0xb8, 0x83, - 0xeb, 0xa9, 0x70, 0xe5, 0x6e, 0xd4, 0x7b, 0x01, 0xda, 0x2b, 0x7f, 0xc3, 0x4c, 0xcf, 0xda, 0x50, - 0x42, 0x3f, 0xfb, 0x94, 0x71, 0xdc, 0x03, 0xc9, 0x36, 0xf6, 0x94, 0xb9, 0x86, 0x49, 0x65, 0xa4, - 0x20, 0x4d, 0x22, 0x07, 0x01, 0xff, 0x0f, 0x15, 0xee, 0xb8, 0x96, 0x29, 0x0b, 0xe1, 0x4e, 0xb4, - 0x08, 0xce, 0xb8, 0x86, 0xc7, 0x2d, 0x6e, 0x39, 0xb6, 0x2c, 0x2a, 0x48, 0xab, 0x90, 0x83, 0x80, - 0x09, 0x34, 0x18, 0x37, 0x3c, 0xbe, 0x74, 0x58, 0x14, 0x51, 0x56, 0x90, 0xd6, 0x1c, 0xbe, 0xd4, - 0xb3, 0xc5, 0xe8, 0xc7, 0x85, 0xe8, 0xab, 0xec, 0x19, 0x92, 0x4f, 0x81, 0x15, 0x38, 0xe3, 0xd6, - 0x9e, 0x32, 0x6e, 0xec, 0xdd, 0x0f, 0x4c, 0xae, 0x28, 0x48, 0x13, 0x49, 0x56, 0x52, 0x2f, 0xa0, - 0x91, 0xcb, 0x80, 0x01, 0xaa, 0xf3, 0xf1, 0x7a, 0xb6, 0x5a, 0xb7, 0x4b, 0xb8, 0x0e, 0xff, 0xcd, - 0xc6, 0x64, 0x7e, 0x19, 0xac, 0x10, 0x6e, 0x80, 0xb4, 0xbe, 0x5c, 0xcc, 0x56, 0xeb, 0xf1, 0x62, - 0xd9, 0x16, 0xd4, 0xef, 0x08, 0x6a, 0x8b, 0xb0, 0x34, 0x8a, 0x15, 0x90, 0xd2, 0xa4, 0x21, 0x0d, - 0x71, 0x22, 0x0c, 0x10, 0x39, 0x88, 0xb8, 0x0d, 0xe2, 0x27, 0x7a, 0x17, 0xf2, 0xa8, 0x93, 0xe0, - 0x31, 0x60, 0xf4, 0xc5, 0xd8, 0xf9, 0x34, 0x24, 0x51, 0x27, 0xd1, 0x02, 0xbf, 0x86, 0xda, 0x2d, - 0x35, 0xae, 0xa9, 0xc7, 0xe4, 0xb2, 0x22, 0x6a, 0x67, 0x43, 0x35, 0xdf, 0x7f, 0xec, 0xa8, 0xbf, - 0x8f, 0x82, 0x66, 0x36, 0xf7, 0xee, 0x48, 0x72, 0xa4, 0x3b, 0x82, 0x7a, 0x76, 0x23, 0x71, 0x8d, - 0xe6, 0x93, 0x77, 0x15, 0x32, 0xae, 0x23, 0xe1, 0x02, 0xa9, 0xdf, 0x04, 0x68, 0x2e, 0xfd, 0xcd, - 0xce, 0x62, 0xb7, 0x7f, 0x6d, 0xc8, 0xe5, 0xe3, 0x21, 0xc7, 0x05, 0x55, 0x0a, 0x30, 0x54, 0xb3, - 0x18, 0xa6, 0x07, 0x0c, 0xb5, 0x10, 0xc3, 0xb3, 0x3c, 0x86, 0x7c, 0xa1, 0xff, 0x80, 0xc6, 0x08, - 0x5a, 0xa9, 0x07, 0x73, 0x1d, 0x9b, 0x51, 0xfc, 0x14, 0x5a, 0x69, 0x23, 0x57, 0xa6, 0xe3, 0xdb, - 0x3c, 0x4c, 0x55, 0x21, 0xcd, 0x54, 0x9e, 0x06, 0xaa, 0x7a, 0x8f, 0xa0, 0x33, 0x75, 0xec, 0x1b, - 0x6b, 0xeb, 0x7b, 0x74, 0x1d, 0x50, 0xf9, 0x13, 0xa0, 0x05, 0xb6, 0x62, 0x91, 0x2d, 0xee, 0x03, - 0x98, 0xce, 0x6e, 0x47, 0xcd, 0x14, 0xbd, 0x44, 0x32, 0x8a, 0x2a, 0xc3, 0xa3, 0xe3, 0xaa, 0xa2, - 0xce, 0x54, 0x02, 0xbd, 0x77, 0x94, 0x87, 0x5a, 0x12, 0x61, 0x84, 0x9f, 0xd3, 0xef, 0x97, 0xad, - 0xbe, 0x81, 0xf3, 0x07, 0x72, 0xc6, 0x38, 0xfb, 0x00, 0x69, 0x03, 0x2c, 0x6e, 0x29, 0xa3, 0x0c, - 0x7f, 0x04, 0xd7, 0x0e, 0x35, 0xbe, 0x52, 0x7a, 0xbd, 0x48, 0x46, 0x8f, 0xdf, 0x82, 0x94, 0xde, - 0x00, 0xb8, 0x7f, 0xfa, 0x6a, 0xe8, 0x76, 0x0a, 0x3f, 0x1d, 0xb5, 0x34, 0x40, 0x78, 0x0e, 0xb5, - 0x78, 0xbc, 0xb8, 0x77, 0xea, 0xcd, 0xea, 0x9e, 0x3f, 0xb0, 0x1b, 0x93, 0x2b, 0x69, 0x68, 0x80, - 0xf0, 0x47, 0x68, 0xe6, 0xc9, 0xe2, 0xc7, 0xf9, 0x63, 0x85, 0x6f, 0x43, 0xf7, 0xc9, 0xe9, 0xa0, - 0xc4, 0x02, 0x7b, 0xd0, 0x29, 0x44, 0x89, 0x9f, 0xe7, 0x13, 0x9c, 0x9a, 0x61, 0xf7, 0xc5, 0x2f, - 0xc5, 0x26, 0x9e, 0x13, 0x15, 0xda, 0x2c, 0x82, 0x7f, 0xc3, 0x74, 0x73, 0x67, 0x51, 0x9b, 0x4f, - 0x9a, 0xe9, 0x1c, 0x96, 0xc1, 0x6f, 0x62, 0x53, 0x0d, 0xff, 0x16, 0xaf, 0x7e, 0x06, 0x00, 0x00, - 0xff, 0xff, 0x83, 0x4f, 0x5b, 0x91, 0x40, 0x06, 0x00, 0x00, + // 802 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xb4, 0x56, 0x5d, 0x4f, 0xdb, 0x48, + 0x14, 0xc5, 0x76, 0x12, 0xf0, 0xcd, 0xe7, 0x8e, 0x96, 0x55, 0xe4, 0x05, 0x36, 0x32, 0x2b, 0x6d, + 0xb6, 0xa8, 0x16, 0x4a, 0x55, 0x89, 0x22, 0x24, 0x94, 0xd0, 0x88, 0x46, 0x22, 0x25, 0x9a, 0xe4, + 0xb5, 0x8a, 0x26, 0xce, 0x00, 0x56, 0x12, 0x3b, 0xf5, 0x4c, 0x8a, 0x78, 0x6e, 0x5f, 0xfb, 0xd6, + 0x5f, 0x52, 0xa9, 0x3f, 0xa0, 0x7d, 0xef, 0x7f, 0xaa, 0x3c, 0xfe, 0x88, 0x1d, 0x42, 0xa0, 0x48, + 0xbc, 0xd9, 0xd7, 0xe7, 0xdc, 0x73, 0xe7, 0xde, 0x33, 0xe3, 0x81, 0xe2, 0x84, 0x32, 0x46, 0x2e, + 0x2d, 0xfb, 0xd2, 0x98, 0xba, 0x0e, 0x77, 0x50, 0x2e, 0x0a, 0xf4, 0xa7, 0x03, 0xfd, 0x63, 0x0a, + 0xfe, 0xe8, 0xce, 0x06, 0xcc, 0x74, 0xad, 0x01, 0x75, 0xdb, 0xe2, 0x13, 0x45, 0xc7, 0x90, 0xb2, + 0x6c, 0x8b, 0x97, 0xa5, 0x8a, 0x54, 0xcd, 0xd6, 0xf6, 0x8c, 0x38, 0xc5, 0xb8, 0x05, 0x37, 0x5a, + 0xb6, 0xc5, 0x83, 0x67, 0x2c, 0x88, 0xe8, 0x08, 0x14, 0x62, 0x8e, 0xca, 0xb2, 0xe0, 0x3f, 0xbb, + 0x8f, 0x5f, 0x37, 0x47, 0x21, 0xdd, 0xa3, 0x69, 0xdf, 0x65, 0xc8, 0xc6, 0x72, 0xa2, 0x2d, 0x50, + 0x6d, 0x32, 0xa1, 0x6c, 0x4a, 0x4c, 0x2a, 0x6a, 0x52, 0xf1, 0x3c, 0x80, 0xfe, 0x84, 0x34, 0x77, + 0xa6, 0x96, 0x29, 0xd4, 0x54, 0xec, 0xbf, 0x78, 0x9c, 0x29, 0x71, 0xb9, 0xc5, 0x2d, 0xc7, 0x2e, + 0x2b, 0x15, 0xa9, 0x9a, 0xc6, 0xf3, 0x00, 0xea, 0x43, 0x9e, 0x71, 0xe2, 0xf2, 0x8e, 0xc3, 0x7c, + 0x44, 0xaa, 0x22, 0x55, 0x0b, 0xb5, 0x57, 0xbf, 0xb1, 0x52, 0xa3, 0x1b, 0x4f, 0x80, 0x93, 0xf9, + 0x50, 0x05, 0xb2, 0xdc, 0x9a, 0x50, 0xc6, 0xc9, 0x64, 0xfa, 0x96, 0x95, 0xd3, 0x15, 0xa9, 0xaa, + 0xe0, 0x78, 0x08, 0xed, 0x42, 0x9e, 0x45, 0xf9, 0xfb, 0xd6, 0xb0, 0x9c, 0x11, 0xe5, 0xe7, 0xe6, + 0xc1, 0xd6, 0x50, 0x3f, 0x80, 0x7c, 0x42, 0x06, 0x01, 0x64, 0xce, 0xea, 0xbd, 0x66, 0xb7, 0x57, + 0x5a, 0x43, 0x39, 0xd8, 0x68, 0xd6, 0xf1, 0x59, 0xcb, 0x7b, 0x93, 0x50, 0x1e, 0xd4, 0x5e, 0xab, + 0xdd, 0xec, 0xf6, 0xea, 0xed, 0x4e, 0x49, 0xd6, 0xf6, 0x00, 0xe6, 0x6d, 0x45, 0xdb, 0x00, 0xfe, + 0xca, 0xa8, 0xa7, 0x24, 0x89, 0x6a, 0xd4, 0x20, 0xd2, 0x1a, 0xea, 0x3f, 0x25, 0x58, 0x0f, 0xa1, + 0x15, 0x50, 0xa3, 0x32, 0x7d, 0x64, 0x43, 0xde, 0x97, 0xf0, 0x3c, 0x88, 0x4a, 0xa0, 0x8c, 0xe8, + 0x8d, 0x68, 0x77, 0x0e, 0x7b, 0x8f, 0xde, 0x08, 0x3e, 0x90, 0xf1, 0x8c, 0x8a, 0x46, 0xe7, 0xb0, + 0xff, 0x82, 0x8e, 0x60, 0xfd, 0x8a, 0x92, 0x21, 0x75, 0x59, 0x39, 0x55, 0x51, 0xaa, 0xd9, 0x9a, + 0x9e, 0x6c, 0x6f, 0xd8, 0xc8, 0x37, 0x3e, 0xa8, 0x69, 0x73, 0xf7, 0x06, 0x87, 0x14, 0xed, 0x10, + 0x72, 0xf1, 0x0f, 0xa1, 0xaa, 0x3f, 0xfe, 0xa4, 0xaa, 0x1c, 0x53, 0x3d, 0x94, 0x0f, 0x24, 0xfd, + 0x9b, 0x04, 0xf9, 0x86, 0xeb, 0x8c, 0xe6, 0x8e, 0xfe, 0x1f, 0x52, 0x43, 0xc2, 0x49, 0xe0, 0xe8, + 0xcd, 0xa5, 0x85, 0x60, 0x01, 0x41, 0xa7, 0xb0, 0xe1, 0xd2, 0xa1, 0xe5, 0x52, 0x93, 0x07, 0x06, + 0x5e, 0xd8, 0x00, 0x89, 0xcc, 0x06, 0x0e, 0xb0, 0x61, 0x92, 0x88, 0xac, 0xed, 0x43, 0x71, 0xe1, + 0xa3, 0x37, 0x07, 0x9b, 0x5e, 0xf7, 0x07, 0x22, 0x43, 0x64, 0x65, 0x7a, 0xed, 0xa7, 0xd4, 0xbf, + 0x2a, 0x50, 0xe8, 0xcc, 0x06, 0x63, 0x8b, 0x5d, 0x61, 0xfa, 0x7e, 0x46, 0x99, 0xb7, 0x93, 0xe2, + 0x5b, 0xb1, 0x9a, 0xac, 0x24, 0x89, 0x5d, 0xba, 0x0f, 0xfd, 0x65, 0xcb, 0x0f, 0x60, 0xbf, 0x26, + 0x9c, 0x24, 0x3a, 0xa1, 0xf5, 0x9f, 0x78, 0x1b, 0x6a, 0x3f, 0x24, 0xc8, 0xc6, 0x64, 0xe3, 0x33, + 0xce, 0xad, 0x98, 0x31, 0x3a, 0x9f, 0x3b, 0x4b, 0x11, 0xce, 0x7a, 0xf9, 0xd0, 0x95, 0x3d, 0x81, + 0xd9, 0x3e, 0xcb, 0x50, 0x8c, 0x04, 0xd9, 0xd4, 0xb1, 0x19, 0x45, 0x27, 0x90, 0x31, 0x1d, 0xfb, + 0xc2, 0xba, 0x5c, 0x7e, 0x84, 0x2e, 0xc0, 0x8d, 0x13, 0x81, 0x0d, 0x9b, 0x1f, 0x50, 0x51, 0xeb, + 0x96, 0x11, 0x9f, 0xaf, 0x4e, 0x73, 0xb7, 0x15, 0x0f, 0x20, 0x9f, 0xd0, 0x40, 0xff, 0x41, 0x31, + 0x1a, 0x43, 0xdf, 0x74, 0x66, 0xb6, 0xef, 0xb0, 0x34, 0x2e, 0x44, 0xe1, 0x13, 0x2f, 0xfa, 0x08, + 0x13, 0x7f, 0x91, 0x60, 0xd3, 0x17, 0x9b, 0xb9, 0xb4, 0xe7, 0xb9, 0x20, 0xf4, 0xf2, 0x63, 0x0c, + 0xb4, 0xa4, 0x50, 0x65, 0x59, 0xa1, 0x68, 0x07, 0xc0, 0x74, 0xc6, 0x63, 0x6a, 0x46, 0xe7, 0xb9, + 0x8a, 0x63, 0x11, 0xbd, 0x0c, 0x7f, 0x2d, 0x56, 0xe5, 0xb7, 0x4d, 0xc7, 0xb0, 0x75, 0x4a, 0xb9, + 0x88, 0x85, 0x08, 0x22, 0xce, 0xf4, 0xc7, 0x97, 0xad, 0x1f, 0xc3, 0xf6, 0x1d, 0x39, 0x03, 0x87, + 0xec, 0x00, 0x44, 0x0b, 0x60, 0xc1, 0x92, 0x62, 0x91, 0xda, 0x27, 0x05, 0x4a, 0x5d, 0x4a, 0xae, + 0x29, 0x1d, 0xb6, 0xc3, 0x99, 0xa3, 0x73, 0x50, 0xa3, 0x7f, 0x12, 0xfa, 0xe7, 0x9e, 0x9f, 0x95, + 0xf6, 0xf7, 0x8a, 0x63, 0x4b, 0x5f, 0xab, 0x4a, 0xfb, 0x12, 0x3a, 0x83, 0xf5, 0xc0, 0x44, 0x68, + 0x6b, 0xd5, 0x16, 0xd2, 0xb6, 0x57, 0x3a, 0x2f, 0xc8, 0xf6, 0x0e, 0x0a, 0xc9, 0x16, 0xa3, 0xdd, + 0x24, 0x6d, 0xa9, 0x2d, 0xb4, 0x7f, 0x57, 0x83, 0x42, 0x09, 0xe4, 0xc2, 0xe6, 0xd2, 0x9e, 0xa2, + 0x85, 0x0b, 0xc6, 0xaa, 0x61, 0x6a, 0x7b, 0x0f, 0xc2, 0x86, 0x9a, 0x0d, 0x1d, 0x4a, 0xcc, 0x9f, + 0xc2, 0x05, 0x33, 0xcc, 0xb1, 0x45, 0x6d, 0xde, 0x28, 0x44, 0x03, 0xe9, 0x78, 0x37, 0xaa, 0x41, + 0x46, 0x5c, 0xac, 0x5e, 0xfc, 0x0a, 0x00, 0x00, 0xff, 0xff, 0x5f, 0x31, 0x28, 0xa2, 0x6b, 0x09, + 0x00, 0x00, }