diff --git a/cmd/server/server.go b/cmd/server/server.go index 1f87124..f0ad3be 100644 --- a/cmd/server/server.go +++ b/cmd/server/server.go @@ -12,11 +12,10 @@ import ( "github.com/aws/aws-sdk-go-v2/service/sqs" _ "github.com/lib/pq" "github.com/pentops/dante/dynamictype" + "github.com/pentops/dante/gen/o5/dante/v1/dante_spb" + "github.com/pentops/dante/gen/o5/dante/v1/dante_tpb" "github.com/pentops/dante/service" - "github.com/pentops/log.go/grpc_log" "github.com/pentops/log.go/log" - "github.com/pentops/o5-go/dante/v1/dante_spb" - "github.com/pentops/o5-go/dante/v1/dante_tpb" "github.com/pressly/goose" "golang.org/x/sync/errgroup" @@ -140,7 +139,17 @@ func runServe(ctx context.Context) error { return err } - deadletterService, err := service.NewDeadletterServiceService(db, types, sqsClient, cfg.SlackUrl) + statemachine, err := service.NewDeadmessagePSM() + if err != nil { + return err + } + + deadletterService, err := service.NewDeadletterServiceService(db, statemachine, sqsClient) + if err != nil { + return err + } + + deadletterWorker, err := service.NewDeadLetterWorker(db, types, statemachine, cfg.SlackUrl) if err != nil { return err } @@ -149,13 +158,11 @@ func runServe(ctx context.Context) error { eg, ctx := errgroup.WithContext(ctx) eg.Go(func() error { - grpcServer := grpc.NewServer(grpc.ChainUnaryInterceptor( - grpc_log.UnaryServerInterceptor(log.DefaultContext, log.DefaultTrace, log.DefaultLogger), - )) + grpcServer := grpc.NewServer(grpc.ChainUnaryInterceptor(service.GRPCMiddleware()...)) reflection.Register(grpcServer) - dante_tpb.RegisterDeadMessageTopicServer(grpcServer, deadletterService) + dante_tpb.RegisterDeadMessageTopicServer(grpcServer, deadletterWorker) dante_spb.RegisterDeadMessageCommandServiceServer(grpcServer, deadletterService) dante_spb.RegisterDeadMessageQueryServiceServer(grpcServer, deadletterService) diff --git a/dynamictype/registry_test.go b/dynamictype/registry_test.go index 01cbdee..2271f15 100644 --- a/dynamictype/registry_test.go +++ b/dynamictype/registry_test.go @@ -5,8 +5,8 @@ import ( "encoding/json" "testing" - "github.com/pentops/o5-go/dante/v1/dante_pb" - "github.com/pentops/o5-go/dante/v1/dante_tpb" + "github.com/pentops/dante/gen/o5/dante/v1/dante_pb" + "github.com/pentops/dante/gen/o5/dante/v1/dante_tpb" "google.golang.org/protobuf/encoding/protojson" "google.golang.org/protobuf/proto" "google.golang.org/protobuf/types/descriptorpb" diff --git a/ext/db/20231206153030_init.sql b/ext/db/20231206153030_init.sql index 7dc8ecc..ce90597 100644 --- a/ext/db/20231206153030_init.sql +++ b/ext/db/20231206153030_init.sql @@ -10,7 +10,8 @@ CREATE TABLE deadmessage_event ( id UUID PRIMARY KEY, message_id UUID REFERENCES deadmessage(message_id) NOT NULL, timestamp TIMESTAMPTZ NOT NULL DEFAULT now(), - actor jsonb NOT NULL, + sequence int NOT NULL, + cause jsonb NOT NULL, data jsonb NOT NULL ); diff --git a/gen/o5/dante/v1/dante_pb/dead_message.pb.go b/gen/o5/dante/v1/dante_pb/dead_message.pb.go index cd1c979..d406858 100644 --- a/gen/o5/dante/v1/dante_pb/dead_message.pb.go +++ b/gen/o5/dante/v1/dante_pb/dead_message.pb.go @@ -10,7 +10,7 @@ import ( _ "buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go/buf/validate" auth_pb "github.com/pentops/o5-go/auth/v1/auth_pb" _ "github.com/pentops/protostate/gen/list/v1/psml_pb" - _ "github.com/pentops/protostate/gen/state/v1/psm_pb" + psm_pb "github.com/pentops/protostate/gen/state/v1/psm_pb" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" anypb "google.golang.org/protobuf/types/known/anypb" @@ -133,20 +133,68 @@ func (Urgency) EnumDescriptor() ([]byte, []int) { return file_o5_dante_v1_dead_message_proto_rawDescGZIP(), []int{1} } +type DeadMessageKeys struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + MessageId string `protobuf:"bytes,1,opt,name=message_id,json=messageId,proto3" json:"message_id,omitempty"` +} + +func (x *DeadMessageKeys) Reset() { + *x = DeadMessageKeys{} + if protoimpl.UnsafeEnabled { + mi := &file_o5_dante_v1_dead_message_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DeadMessageKeys) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeadMessageKeys) ProtoMessage() {} + +func (x *DeadMessageKeys) ProtoReflect() protoreflect.Message { + mi := &file_o5_dante_v1_dead_message_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DeadMessageKeys.ProtoReflect.Descriptor instead. +func (*DeadMessageKeys) Descriptor() ([]byte, []int) { + return file_o5_dante_v1_dead_message_proto_rawDescGZIP(), []int{0} +} + +func (x *DeadMessageKeys) GetMessageId() string { + if x != nil { + return x.MessageId + } + return "" +} + type DeadMessageState struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - MessageId string `protobuf:"bytes,1,opt,name=message_id,json=messageId,proto3" json:"message_id,omitempty"` - Status MessageStatus `protobuf:"varint,2,opt,name=status,proto3,enum=o5.dante.v1.MessageStatus" json:"status,omitempty"` - CurrentSpec *DeadMessageSpec `protobuf:"bytes,3,opt,name=current_spec,json=currentSpec,proto3" json:"current_spec,omitempty"` + Metadata *psm_pb.StateMetadata `protobuf:"bytes,1,opt,name=metadata,proto3" json:"metadata,omitempty"` + Keys *DeadMessageKeys `protobuf:"bytes,2,opt,name=keys,proto3" json:"keys,omitempty"` + Status MessageStatus `protobuf:"varint,3,opt,name=status,proto3,enum=o5.dante.v1.MessageStatus" json:"status,omitempty"` + Data *DeadMessageData `protobuf:"bytes,4,opt,name=data,proto3" json:"data,omitempty"` } func (x *DeadMessageState) Reset() { *x = DeadMessageState{} if protoimpl.UnsafeEnabled { - mi := &file_o5_dante_v1_dead_message_proto_msgTypes[0] + mi := &file_o5_dante_v1_dead_message_proto_msgTypes[1] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -159,7 +207,7 @@ func (x *DeadMessageState) String() string { func (*DeadMessageState) ProtoMessage() {} func (x *DeadMessageState) ProtoReflect() protoreflect.Message { - mi := &file_o5_dante_v1_dead_message_proto_msgTypes[0] + mi := &file_o5_dante_v1_dead_message_proto_msgTypes[1] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -172,14 +220,21 @@ func (x *DeadMessageState) ProtoReflect() protoreflect.Message { // Deprecated: Use DeadMessageState.ProtoReflect.Descriptor instead. func (*DeadMessageState) Descriptor() ([]byte, []int) { - return file_o5_dante_v1_dead_message_proto_rawDescGZIP(), []int{0} + return file_o5_dante_v1_dead_message_proto_rawDescGZIP(), []int{1} } -func (x *DeadMessageState) GetMessageId() string { +func (x *DeadMessageState) GetMetadata() *psm_pb.StateMetadata { if x != nil { - return x.MessageId + return x.Metadata } - return "" + return nil +} + +func (x *DeadMessageState) GetKeys() *DeadMessageKeys { + if x != nil { + return x.Keys + } + return nil } func (x *DeadMessageState) GetStatus() MessageStatus { @@ -189,7 +244,54 @@ func (x *DeadMessageState) GetStatus() MessageStatus { return MessageStatus_MESSAGE_STATUS_UNSPECIFIED } -func (x *DeadMessageState) GetCurrentSpec() *DeadMessageSpec { +func (x *DeadMessageState) GetData() *DeadMessageData { + if x != nil { + return x.Data + } + return nil +} + +type DeadMessageData struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + CurrentSpec *DeadMessageSpec `protobuf:"bytes,3,opt,name=current_spec,json=currentSpec,proto3" json:"current_spec,omitempty"` +} + +func (x *DeadMessageData) Reset() { + *x = DeadMessageData{} + if protoimpl.UnsafeEnabled { + mi := &file_o5_dante_v1_dead_message_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DeadMessageData) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeadMessageData) ProtoMessage() {} + +func (x *DeadMessageData) ProtoReflect() protoreflect.Message { + mi := &file_o5_dante_v1_dead_message_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DeadMessageData.ProtoReflect.Descriptor instead. +func (*DeadMessageData) Descriptor() ([]byte, []int) { + return file_o5_dante_v1_dead_message_proto_rawDescGZIP(), []int{2} +} + +func (x *DeadMessageData) GetCurrentSpec() *DeadMessageSpec { if x != nil { return x.CurrentSpec } @@ -214,7 +316,7 @@ type DeadMessageSpec struct { func (x *DeadMessageSpec) Reset() { *x = DeadMessageSpec{} if protoimpl.UnsafeEnabled { - mi := &file_o5_dante_v1_dead_message_proto_msgTypes[1] + mi := &file_o5_dante_v1_dead_message_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -227,7 +329,7 @@ func (x *DeadMessageSpec) String() string { func (*DeadMessageSpec) ProtoMessage() {} func (x *DeadMessageSpec) ProtoReflect() protoreflect.Message { - mi := &file_o5_dante_v1_dead_message_proto_msgTypes[1] + mi := &file_o5_dante_v1_dead_message_proto_msgTypes[3] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -240,7 +342,7 @@ func (x *DeadMessageSpec) ProtoReflect() protoreflect.Message { // Deprecated: Use DeadMessageSpec.ProtoReflect.Descriptor instead. func (*DeadMessageSpec) Descriptor() ([]byte, []int) { - return file_o5_dante_v1_dead_message_proto_rawDescGZIP(), []int{1} + return file_o5_dante_v1_dead_message_proto_rawDescGZIP(), []int{3} } func (x *DeadMessageSpec) GetVersionId() string { @@ -307,7 +409,7 @@ type Problem struct { func (x *Problem) Reset() { *x = Problem{} if protoimpl.UnsafeEnabled { - mi := &file_o5_dante_v1_dead_message_proto_msgTypes[2] + mi := &file_o5_dante_v1_dead_message_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -320,7 +422,7 @@ func (x *Problem) String() string { func (*Problem) ProtoMessage() {} func (x *Problem) ProtoReflect() protoreflect.Message { - mi := &file_o5_dante_v1_dead_message_proto_msgTypes[2] + mi := &file_o5_dante_v1_dead_message_proto_msgTypes[4] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -333,7 +435,7 @@ func (x *Problem) ProtoReflect() protoreflect.Message { // Deprecated: Use Problem.ProtoReflect.Descriptor instead. func (*Problem) Descriptor() ([]byte, []int) { - return file_o5_dante_v1_dead_message_proto_rawDescGZIP(), []int{2} + return file_o5_dante_v1_dead_message_proto_rawDescGZIP(), []int{4} } func (m *Problem) GetType() isProblem_Type { @@ -386,7 +488,7 @@ type InvariantViolation struct { func (x *InvariantViolation) Reset() { *x = InvariantViolation{} if protoimpl.UnsafeEnabled { - mi := &file_o5_dante_v1_dead_message_proto_msgTypes[3] + mi := &file_o5_dante_v1_dead_message_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -399,7 +501,7 @@ func (x *InvariantViolation) String() string { func (*InvariantViolation) ProtoMessage() {} func (x *InvariantViolation) ProtoReflect() protoreflect.Message { - mi := &file_o5_dante_v1_dead_message_proto_msgTypes[3] + mi := &file_o5_dante_v1_dead_message_proto_msgTypes[5] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -412,7 +514,7 @@ func (x *InvariantViolation) ProtoReflect() protoreflect.Message { // Deprecated: Use InvariantViolation.ProtoReflect.Descriptor instead. func (*InvariantViolation) Descriptor() ([]byte, []int) { - return file_o5_dante_v1_dead_message_proto_rawDescGZIP(), []int{3} + return file_o5_dante_v1_dead_message_proto_rawDescGZIP(), []int{5} } func (x *InvariantViolation) GetDescription() string { @@ -447,7 +549,7 @@ type UnhandledError struct { func (x *UnhandledError) Reset() { *x = UnhandledError{} if protoimpl.UnsafeEnabled { - mi := &file_o5_dante_v1_dead_message_proto_msgTypes[4] + mi := &file_o5_dante_v1_dead_message_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -460,7 +562,7 @@ func (x *UnhandledError) String() string { func (*UnhandledError) ProtoMessage() {} func (x *UnhandledError) ProtoReflect() protoreflect.Message { - mi := &file_o5_dante_v1_dead_message_proto_msgTypes[4] + mi := &file_o5_dante_v1_dead_message_proto_msgTypes[6] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -473,7 +575,7 @@ func (x *UnhandledError) ProtoReflect() protoreflect.Message { // Deprecated: Use UnhandledError.ProtoReflect.Descriptor instead. func (*UnhandledError) Descriptor() ([]byte, []int) { - return file_o5_dante_v1_dead_message_proto_rawDescGZIP(), []int{4} + return file_o5_dante_v1_dead_message_proto_rawDescGZIP(), []int{6} } func (x *UnhandledError) GetError() string { @@ -496,7 +598,7 @@ type Any struct { func (x *Any) Reset() { *x = Any{} if protoimpl.UnsafeEnabled { - mi := &file_o5_dante_v1_dead_message_proto_msgTypes[5] + mi := &file_o5_dante_v1_dead_message_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -509,7 +611,7 @@ func (x *Any) String() string { func (*Any) ProtoMessage() {} func (x *Any) ProtoReflect() protoreflect.Message { - mi := &file_o5_dante_v1_dead_message_proto_msgTypes[5] + mi := &file_o5_dante_v1_dead_message_proto_msgTypes[7] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -522,7 +624,7 @@ func (x *Any) ProtoReflect() protoreflect.Message { // Deprecated: Use Any.ProtoReflect.Descriptor instead. func (*Any) Descriptor() ([]byte, []int) { - return file_o5_dante_v1_dead_message_proto_rawDescGZIP(), []int{5} + return file_o5_dante_v1_dead_message_proto_rawDescGZIP(), []int{7} } func (x *Any) GetProto() *anypb.Any { @@ -544,15 +646,15 @@ type DeadMessageEvent struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Metadata *Metadata `protobuf:"bytes,1,opt,name=metadata,proto3" json:"metadata,omitempty"` - MessageId string `protobuf:"bytes,2,opt,name=message_id,json=messageId,proto3" json:"message_id,omitempty"` - Event *DeadMessageEventType `protobuf:"bytes,3,opt,name=event,proto3" json:"event,omitempty"` + Metadata *psm_pb.EventMetadata `protobuf:"bytes,1,opt,name=metadata,proto3" json:"metadata,omitempty"` + Keys *DeadMessageKeys `protobuf:"bytes,2,opt,name=keys,proto3" json:"keys,omitempty"` + Event *DeadMessageEventType `protobuf:"bytes,3,opt,name=event,proto3" json:"event,omitempty"` } func (x *DeadMessageEvent) Reset() { *x = DeadMessageEvent{} if protoimpl.UnsafeEnabled { - mi := &file_o5_dante_v1_dead_message_proto_msgTypes[6] + mi := &file_o5_dante_v1_dead_message_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -565,7 +667,7 @@ func (x *DeadMessageEvent) String() string { func (*DeadMessageEvent) ProtoMessage() {} func (x *DeadMessageEvent) ProtoReflect() protoreflect.Message { - mi := &file_o5_dante_v1_dead_message_proto_msgTypes[6] + mi := &file_o5_dante_v1_dead_message_proto_msgTypes[8] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -578,21 +680,21 @@ func (x *DeadMessageEvent) ProtoReflect() protoreflect.Message { // Deprecated: Use DeadMessageEvent.ProtoReflect.Descriptor instead. func (*DeadMessageEvent) Descriptor() ([]byte, []int) { - return file_o5_dante_v1_dead_message_proto_rawDescGZIP(), []int{6} + return file_o5_dante_v1_dead_message_proto_rawDescGZIP(), []int{8} } -func (x *DeadMessageEvent) GetMetadata() *Metadata { +func (x *DeadMessageEvent) GetMetadata() *psm_pb.EventMetadata { if x != nil { return x.Metadata } return nil } -func (x *DeadMessageEvent) GetMessageId() string { +func (x *DeadMessageEvent) GetKeys() *DeadMessageKeys { if x != nil { - return x.MessageId + return x.Keys } - return "" + return nil } func (x *DeadMessageEvent) GetEvent() *DeadMessageEventType { @@ -619,7 +721,7 @@ type DeadMessageEventType struct { func (x *DeadMessageEventType) Reset() { *x = DeadMessageEventType{} if protoimpl.UnsafeEnabled { - mi := &file_o5_dante_v1_dead_message_proto_msgTypes[7] + mi := &file_o5_dante_v1_dead_message_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -632,7 +734,7 @@ func (x *DeadMessageEventType) String() string { func (*DeadMessageEventType) ProtoMessage() {} func (x *DeadMessageEventType) ProtoReflect() protoreflect.Message { - mi := &file_o5_dante_v1_dead_message_proto_msgTypes[7] + mi := &file_o5_dante_v1_dead_message_proto_msgTypes[9] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -645,7 +747,7 @@ func (x *DeadMessageEventType) ProtoReflect() protoreflect.Message { // Deprecated: Use DeadMessageEventType.ProtoReflect.Descriptor instead. func (*DeadMessageEventType) Descriptor() ([]byte, []int) { - return file_o5_dante_v1_dead_message_proto_rawDescGZIP(), []int{7} + return file_o5_dante_v1_dead_message_proto_rawDescGZIP(), []int{9} } func (m *DeadMessageEventType) GetType() isDeadMessageEventType_Type { @@ -724,7 +826,7 @@ type Metadata struct { func (x *Metadata) Reset() { *x = Metadata{} if protoimpl.UnsafeEnabled { - mi := &file_o5_dante_v1_dead_message_proto_msgTypes[8] + mi := &file_o5_dante_v1_dead_message_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -737,7 +839,7 @@ func (x *Metadata) String() string { func (*Metadata) ProtoMessage() {} func (x *Metadata) ProtoReflect() protoreflect.Message { - mi := &file_o5_dante_v1_dead_message_proto_msgTypes[8] + mi := &file_o5_dante_v1_dead_message_proto_msgTypes[10] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -750,7 +852,7 @@ func (x *Metadata) ProtoReflect() protoreflect.Message { // Deprecated: Use Metadata.ProtoReflect.Descriptor instead. func (*Metadata) Descriptor() ([]byte, []int) { - return file_o5_dante_v1_dead_message_proto_rawDescGZIP(), []int{8} + return file_o5_dante_v1_dead_message_proto_rawDescGZIP(), []int{10} } func (x *Metadata) GetEventId() string { @@ -785,7 +887,7 @@ type DeadMessageEventType_Created struct { func (x *DeadMessageEventType_Created) Reset() { *x = DeadMessageEventType_Created{} if protoimpl.UnsafeEnabled { - mi := &file_o5_dante_v1_dead_message_proto_msgTypes[9] + mi := &file_o5_dante_v1_dead_message_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -798,7 +900,7 @@ func (x *DeadMessageEventType_Created) String() string { func (*DeadMessageEventType_Created) ProtoMessage() {} func (x *DeadMessageEventType_Created) ProtoReflect() protoreflect.Message { - mi := &file_o5_dante_v1_dead_message_proto_msgTypes[9] + mi := &file_o5_dante_v1_dead_message_proto_msgTypes[11] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -811,7 +913,7 @@ func (x *DeadMessageEventType_Created) ProtoReflect() protoreflect.Message { // Deprecated: Use DeadMessageEventType_Created.ProtoReflect.Descriptor instead. func (*DeadMessageEventType_Created) Descriptor() ([]byte, []int) { - return file_o5_dante_v1_dead_message_proto_rawDescGZIP(), []int{7, 0} + return file_o5_dante_v1_dead_message_proto_rawDescGZIP(), []int{9, 0} } func (x *DeadMessageEventType_Created) GetSpec() *DeadMessageSpec { @@ -832,7 +934,7 @@ type DeadMessageEventType_Updated struct { func (x *DeadMessageEventType_Updated) Reset() { *x = DeadMessageEventType_Updated{} if protoimpl.UnsafeEnabled { - mi := &file_o5_dante_v1_dead_message_proto_msgTypes[10] + mi := &file_o5_dante_v1_dead_message_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -845,7 +947,7 @@ func (x *DeadMessageEventType_Updated) String() string { func (*DeadMessageEventType_Updated) ProtoMessage() {} func (x *DeadMessageEventType_Updated) ProtoReflect() protoreflect.Message { - mi := &file_o5_dante_v1_dead_message_proto_msgTypes[10] + mi := &file_o5_dante_v1_dead_message_proto_msgTypes[12] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -858,7 +960,7 @@ func (x *DeadMessageEventType_Updated) ProtoReflect() protoreflect.Message { // Deprecated: Use DeadMessageEventType_Updated.ProtoReflect.Descriptor instead. func (*DeadMessageEventType_Updated) Descriptor() ([]byte, []int) { - return file_o5_dante_v1_dead_message_proto_rawDescGZIP(), []int{7, 1} + return file_o5_dante_v1_dead_message_proto_rawDescGZIP(), []int{9, 1} } func (x *DeadMessageEventType_Updated) GetSpec() *DeadMessageSpec { @@ -877,7 +979,7 @@ type DeadMessageEventType_Replayed struct { func (x *DeadMessageEventType_Replayed) Reset() { *x = DeadMessageEventType_Replayed{} if protoimpl.UnsafeEnabled { - mi := &file_o5_dante_v1_dead_message_proto_msgTypes[11] + mi := &file_o5_dante_v1_dead_message_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -890,7 +992,7 @@ func (x *DeadMessageEventType_Replayed) String() string { func (*DeadMessageEventType_Replayed) ProtoMessage() {} func (x *DeadMessageEventType_Replayed) ProtoReflect() protoreflect.Message { - mi := &file_o5_dante_v1_dead_message_proto_msgTypes[11] + mi := &file_o5_dante_v1_dead_message_proto_msgTypes[13] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -903,7 +1005,7 @@ func (x *DeadMessageEventType_Replayed) ProtoReflect() protoreflect.Message { // Deprecated: Use DeadMessageEventType_Replayed.ProtoReflect.Descriptor instead. func (*DeadMessageEventType_Replayed) Descriptor() ([]byte, []int) { - return file_o5_dante_v1_dead_message_proto_rawDescGZIP(), []int{7, 2} + return file_o5_dante_v1_dead_message_proto_rawDescGZIP(), []int{9, 2} } type DeadMessageEventType_Rejected struct { @@ -917,7 +1019,7 @@ type DeadMessageEventType_Rejected struct { func (x *DeadMessageEventType_Rejected) Reset() { *x = DeadMessageEventType_Rejected{} if protoimpl.UnsafeEnabled { - mi := &file_o5_dante_v1_dead_message_proto_msgTypes[12] + mi := &file_o5_dante_v1_dead_message_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -930,7 +1032,7 @@ func (x *DeadMessageEventType_Rejected) String() string { func (*DeadMessageEventType_Rejected) ProtoMessage() {} func (x *DeadMessageEventType_Rejected) ProtoReflect() protoreflect.Message { - mi := &file_o5_dante_v1_dead_message_proto_msgTypes[12] + mi := &file_o5_dante_v1_dead_message_proto_msgTypes[14] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -943,7 +1045,7 @@ func (x *DeadMessageEventType_Rejected) ProtoReflect() protoreflect.Message { // Deprecated: Use DeadMessageEventType_Rejected.ProtoReflect.Descriptor instead. func (*DeadMessageEventType_Rejected) Descriptor() ([]byte, []int) { - return file_o5_dante_v1_dead_message_proto_rawDescGZIP(), []int{7, 3} + return file_o5_dante_v1_dead_message_proto_rawDescGZIP(), []int{9, 3} } func (x *DeadMessageEventType_Rejected) GetReason() string { @@ -969,154 +1071,169 @@ var file_o5_dante_v1_dead_message_proto_rawDesc = []byte{ 0x70, 0x73, 0x6d, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x2f, 0x76, 0x31, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1e, 0x70, 0x73, 0x6d, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, - 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xec, 0x01, - 0x0a, 0x10, 0x44, 0x65, 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x53, 0x74, 0x61, - 0x74, 0x65, 0x12, 0x27, 0x0a, 0x0a, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xba, 0x48, 0x05, 0x72, 0x03, 0xb0, 0x01, 0x01, - 0x52, 0x09, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x49, 0x64, 0x12, 0x59, 0x0a, 0x06, 0x73, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x6f, 0x35, - 0x2e, 0x64, 0x61, 0x6e, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x42, 0x25, 0x8a, 0x9b, 0x81, 0xca, 0x02, 0x1f, 0xa2, - 0x01, 0x1c, 0x52, 0x1a, 0x08, 0x01, 0x12, 0x16, 0x4d, 0x45, 0x53, 0x53, 0x41, 0x47, 0x45, 0x5f, - 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x43, 0x52, 0x45, 0x41, 0x54, 0x45, 0x44, 0x52, 0x06, - 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x3f, 0x0a, 0x0c, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, - 0x74, 0x5f, 0x73, 0x70, 0x65, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6f, - 0x35, 0x2e, 0x64, 0x61, 0x6e, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x61, 0x64, 0x4d, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x53, 0x70, 0x65, 0x63, 0x52, 0x0b, 0x63, 0x75, 0x72, 0x72, - 0x65, 0x6e, 0x74, 0x53, 0x70, 0x65, 0x63, 0x3a, 0x13, 0xc2, 0xe8, 0x81, 0xd9, 0x02, 0x0d, 0x0a, - 0x0b, 0x64, 0x65, 0x61, 0x64, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x89, 0x03, 0x0a, - 0x0f, 0x44, 0x65, 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x53, 0x70, 0x65, 0x63, - 0x12, 0x27, 0x0a, 0x0a, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xba, 0x48, 0x05, 0x72, 0x03, 0xb0, 0x01, 0x01, 0x52, 0x09, - 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x28, 0x0a, 0x10, 0x69, 0x6e, 0x66, - 0x72, 0x61, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0e, 0x69, 0x6e, 0x66, 0x72, 0x61, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x49, 0x64, 0x12, 0x39, 0x0a, 0x0a, 0x71, 0x75, 0x65, 0x75, 0x65, 0x5f, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x1a, 0x8a, 0x9b, 0x81, 0xca, 0x02, 0x14, 0x72, - 0x12, 0x0a, 0x10, 0x52, 0x0e, 0x08, 0x01, 0x12, 0x0a, 0x71, 0x75, 0x65, 0x75, 0x65, 0x5f, 0x6e, - 0x61, 0x6d, 0x65, 0x52, 0x09, 0x71, 0x75, 0x65, 0x75, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x36, - 0x0a, 0x09, 0x67, 0x72, 0x70, 0x63, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x09, 0x42, 0x19, 0x8a, 0x9b, 0x81, 0xca, 0x02, 0x13, 0x72, 0x11, 0x0a, 0x0f, 0x52, 0x0d, 0x08, - 0x01, 0x12, 0x09, 0x67, 0x72, 0x70, 0x63, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x52, 0x08, 0x67, 0x72, - 0x70, 0x63, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x54, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x64, 0x5f, 0x61, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x42, 0x19, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x8a, 0x9b, - 0x81, 0xca, 0x02, 0x0d, 0xf2, 0x01, 0x0a, 0x52, 0x02, 0x08, 0x01, 0x5a, 0x04, 0x08, 0x01, 0x10, - 0x01, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x2a, 0x0a, 0x07, - 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, - 0x6f, 0x35, 0x2e, 0x64, 0x61, 0x6e, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x6e, 0x79, 0x52, - 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x2e, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x62, - 0x6c, 0x65, 0x6d, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x6f, 0x35, 0x2e, 0x64, - 0x61, 0x6e, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x62, 0x6c, 0x65, 0x6d, 0x52, - 0x07, 0x70, 0x72, 0x6f, 0x62, 0x6c, 0x65, 0x6d, 0x22, 0xb9, 0x01, 0x0a, 0x07, 0x50, 0x72, 0x6f, - 0x62, 0x6c, 0x65, 0x6d, 0x12, 0x52, 0x0a, 0x13, 0x69, 0x6e, 0x76, 0x61, 0x72, 0x69, 0x61, 0x6e, - 0x74, 0x5f, 0x76, 0x69, 0x6f, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x35, 0x2e, 0x64, 0x61, 0x6e, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, - 0x49, 0x6e, 0x76, 0x61, 0x72, 0x69, 0x61, 0x6e, 0x74, 0x56, 0x69, 0x6f, 0x6c, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x12, 0x69, 0x6e, 0x76, 0x61, 0x72, 0x69, 0x61, 0x6e, 0x74, 0x56, - 0x69, 0x6f, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x46, 0x0a, 0x0f, 0x75, 0x6e, 0x68, 0x61, - 0x6e, 0x64, 0x6c, 0x65, 0x64, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1b, 0x2e, 0x6f, 0x35, 0x2e, 0x64, 0x61, 0x6e, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, - 0x55, 0x6e, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x64, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x48, 0x00, - 0x52, 0x0e, 0x75, 0x6e, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x64, 0x45, 0x72, 0x72, 0x6f, 0x72, - 0x42, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x92, 0x9b, 0x81, 0xca, 0x02, 0x04, - 0x52, 0x02, 0x08, 0x01, 0x22, 0xba, 0x01, 0x0a, 0x12, 0x49, 0x6e, 0x76, 0x61, 0x72, 0x69, 0x61, - 0x6e, 0x74, 0x56, 0x69, 0x6f, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3d, 0x0a, 0x0b, 0x64, - 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x42, 0x1b, 0x8a, 0x9b, 0x81, 0xca, 0x02, 0x15, 0x72, 0x13, 0x0a, 0x11, 0x52, 0x0f, 0x08, 0x01, - 0x12, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x64, - 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x26, 0x0a, 0x05, 0x65, 0x72, - 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x6f, 0x35, 0x2e, 0x64, - 0x61, 0x6e, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x6e, 0x79, 0x52, 0x05, 0x65, 0x72, 0x72, - 0x6f, 0x72, 0x12, 0x3d, 0x0a, 0x07, 0x75, 0x72, 0x67, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x6f, 0x35, 0x2e, 0x64, 0x61, 0x6e, 0x74, 0x65, 0x2e, 0x76, - 0x31, 0x2e, 0x55, 0x72, 0x67, 0x65, 0x6e, 0x63, 0x79, 0x42, 0x0d, 0x8a, 0x9b, 0x81, 0xca, 0x02, - 0x07, 0xa2, 0x01, 0x04, 0x52, 0x02, 0x08, 0x01, 0x52, 0x07, 0x75, 0x72, 0x67, 0x65, 0x6e, 0x63, - 0x79, 0x22, 0x3d, 0x0a, 0x0e, 0x55, 0x6e, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x64, 0x45, 0x72, - 0x72, 0x6f, 0x72, 0x12, 0x2b, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x42, 0x15, 0x8a, 0x9b, 0x81, 0xca, 0x02, 0x0f, 0x72, 0x0d, 0x0a, 0x0b, 0x52, 0x09, - 0x08, 0x01, 0x12, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, - 0x22, 0x45, 0x0a, 0x03, 0x41, 0x6e, 0x79, 0x12, 0x2a, 0x0a, 0x05, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, 0x79, 0x52, 0x05, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6a, 0x73, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0xe4, 0x01, 0x0a, 0x10, 0x44, 0x65, 0x61, 0x64, - 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x41, 0x0a, 0x08, - 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, - 0x2e, 0x6f, 0x35, 0x2e, 0x64, 0x61, 0x6e, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, - 0x61, 0x64, 0x61, 0x74, 0x61, 0x42, 0x0e, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0xda, 0xe8, 0x81, - 0xd9, 0x02, 0x02, 0x10, 0x01, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, - 0x2f, 0x0a, 0x0a, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x42, 0x10, 0xba, 0x48, 0x05, 0x72, 0x03, 0xb0, 0x01, 0x01, 0xda, 0xe8, 0x81, - 0xd9, 0x02, 0x02, 0x18, 0x01, 0x52, 0x09, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x49, 0x64, - 0x12, 0x47, 0x0a, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x21, 0x2e, 0x6f, 0x35, 0x2e, 0x64, 0x61, 0x6e, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, - 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, - 0x70, 0x65, 0x42, 0x0e, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0xda, 0xe8, 0x81, 0xd9, 0x02, 0x02, - 0x08, 0x01, 0x52, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x3a, 0x13, 0xca, 0xe8, 0x81, 0xd9, 0x02, - 0x0d, 0x0a, 0x0b, 0x64, 0x65, 0x61, 0x64, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0xf6, - 0x03, 0x0a, 0x14, 0x44, 0x65, 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x45, 0x76, - 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x45, 0x0a, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x6f, 0x35, 0x2e, 0x64, 0x61, - 0x6e, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x2e, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x64, 0x48, 0x00, 0x52, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x45, - 0x0a, 0x07, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x29, 0x2e, 0x6f, 0x35, 0x2e, 0x64, 0x61, 0x6e, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, - 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, - 0x70, 0x65, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x48, 0x00, 0x52, 0x07, 0x75, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x64, 0x12, 0x48, 0x0a, 0x08, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x79, 0x65, - 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6f, 0x35, 0x2e, 0x64, 0x61, 0x6e, + 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1b, 0x70, + 0x73, 0x6d, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x6d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x57, 0x0a, 0x0f, 0x44, 0x65, + 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x2f, 0x0a, + 0x0a, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x42, 0x10, 0xba, 0x48, 0x05, 0x72, 0x03, 0xb0, 0x01, 0x01, 0xea, 0xe8, 0x81, 0xd9, 0x02, + 0x02, 0x08, 0x01, 0x52, 0x09, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x49, 0x64, 0x3a, 0x13, + 0xc2, 0xe8, 0x81, 0xd9, 0x02, 0x0d, 0x0a, 0x0b, 0x64, 0x65, 0x61, 0x64, 0x6d, 0x65, 0x73, 0x73, + 0x61, 0x67, 0x65, 0x22, 0x9a, 0x02, 0x0a, 0x10, 0x44, 0x65, 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73, + 0x61, 0x67, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x3f, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x70, 0x73, 0x6d, + 0x2e, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x4d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x42, 0x06, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x52, + 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x38, 0x0a, 0x04, 0x6b, 0x65, 0x79, + 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6f, 0x35, 0x2e, 0x64, 0x61, 0x6e, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x61, - 0x79, 0x65, 0x64, 0x48, 0x00, 0x52, 0x08, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x64, 0x12, - 0x48, 0x0a, 0x08, 0x72, 0x65, 0x6a, 0x65, 0x63, 0x74, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x2a, 0x2e, 0x6f, 0x35, 0x2e, 0x64, 0x61, 0x6e, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, + 0x65, 0x4b, 0x65, 0x79, 0x73, 0x42, 0x06, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x52, 0x04, 0x6b, + 0x65, 0x79, 0x73, 0x12, 0x59, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x6f, 0x35, 0x2e, 0x64, 0x61, 0x6e, 0x74, 0x65, 0x2e, 0x76, + 0x31, 0x2e, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x42, + 0x25, 0x8a, 0x9b, 0x81, 0xca, 0x02, 0x1f, 0xa2, 0x01, 0x1c, 0x52, 0x1a, 0x08, 0x01, 0x12, 0x16, + 0x4d, 0x45, 0x53, 0x53, 0x41, 0x47, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x43, + 0x52, 0x45, 0x41, 0x54, 0x45, 0x44, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x30, + 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6f, + 0x35, 0x2e, 0x64, 0x61, 0x6e, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x61, 0x64, 0x4d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x44, 0x61, 0x74, 0x61, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, + 0x22, 0x52, 0x0a, 0x0f, 0x44, 0x65, 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x44, + 0x61, 0x74, 0x61, 0x12, 0x3f, 0x0a, 0x0c, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x73, + 0x70, 0x65, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6f, 0x35, 0x2e, 0x64, + 0x61, 0x6e, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73, + 0x61, 0x67, 0x65, 0x53, 0x70, 0x65, 0x63, 0x52, 0x0b, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, + 0x53, 0x70, 0x65, 0x63, 0x22, 0x89, 0x03, 0x0a, 0x0f, 0x44, 0x65, 0x61, 0x64, 0x4d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x53, 0x70, 0x65, 0x63, 0x12, 0x27, 0x0a, 0x0a, 0x76, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xba, 0x48, + 0x05, 0x72, 0x03, 0xb0, 0x01, 0x01, 0x52, 0x09, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x49, + 0x64, 0x12, 0x28, 0x0a, 0x10, 0x69, 0x6e, 0x66, 0x72, 0x61, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x69, 0x6e, 0x66, + 0x72, 0x61, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x49, 0x64, 0x12, 0x39, 0x0a, 0x0a, 0x71, + 0x75, 0x65, 0x75, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, + 0x1a, 0x8a, 0x9b, 0x81, 0xca, 0x02, 0x14, 0x72, 0x12, 0x0a, 0x10, 0x52, 0x0e, 0x08, 0x01, 0x12, + 0x0a, 0x71, 0x75, 0x65, 0x75, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x52, 0x09, 0x71, 0x75, 0x65, + 0x75, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x36, 0x0a, 0x09, 0x67, 0x72, 0x70, 0x63, 0x5f, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x19, 0x8a, 0x9b, 0x81, 0xca, 0x02, + 0x13, 0x72, 0x11, 0x0a, 0x0f, 0x52, 0x0d, 0x08, 0x01, 0x12, 0x09, 0x67, 0x72, 0x70, 0x63, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x52, 0x08, 0x67, 0x72, 0x70, 0x63, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x54, + 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x42, 0x19, + 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x8a, 0x9b, 0x81, 0xca, 0x02, 0x0d, 0xf2, 0x01, 0x0a, 0x52, + 0x02, 0x08, 0x01, 0x5a, 0x04, 0x08, 0x01, 0x10, 0x01, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x64, 0x41, 0x74, 0x12, 0x2a, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, + 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x6f, 0x35, 0x2e, 0x64, 0x61, 0x6e, 0x74, 0x65, + 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x6e, 0x79, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, + 0x12, 0x2e, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x62, 0x6c, 0x65, 0x6d, 0x18, 0x08, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x14, 0x2e, 0x6f, 0x35, 0x2e, 0x64, 0x61, 0x6e, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, + 0x50, 0x72, 0x6f, 0x62, 0x6c, 0x65, 0x6d, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x62, 0x6c, 0x65, 0x6d, + 0x22, 0xb9, 0x01, 0x0a, 0x07, 0x50, 0x72, 0x6f, 0x62, 0x6c, 0x65, 0x6d, 0x12, 0x52, 0x0a, 0x13, + 0x69, 0x6e, 0x76, 0x61, 0x72, 0x69, 0x61, 0x6e, 0x74, 0x5f, 0x76, 0x69, 0x6f, 0x6c, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x35, 0x2e, 0x64, + 0x61, 0x6e, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x76, 0x61, 0x72, 0x69, 0x61, 0x6e, + 0x74, 0x56, 0x69, 0x6f, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x12, 0x69, 0x6e, + 0x76, 0x61, 0x72, 0x69, 0x61, 0x6e, 0x74, 0x56, 0x69, 0x6f, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x46, 0x0a, 0x0f, 0x75, 0x6e, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x64, 0x5f, 0x65, 0x72, + 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x6f, 0x35, 0x2e, 0x64, + 0x61, 0x6e, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x6e, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, + 0x64, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x48, 0x00, 0x52, 0x0e, 0x75, 0x6e, 0x68, 0x61, 0x6e, 0x64, + 0x6c, 0x65, 0x64, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x42, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, + 0x12, 0x0a, 0x92, 0x9b, 0x81, 0xca, 0x02, 0x04, 0x52, 0x02, 0x08, 0x01, 0x22, 0xba, 0x01, 0x0a, + 0x12, 0x49, 0x6e, 0x76, 0x61, 0x72, 0x69, 0x61, 0x6e, 0x74, 0x56, 0x69, 0x6f, 0x6c, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x3d, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x1b, 0x8a, 0x9b, 0x81, 0xca, 0x02, 0x15, + 0x72, 0x13, 0x0a, 0x11, 0x52, 0x0f, 0x08, 0x01, 0x12, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x26, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x10, 0x2e, 0x6f, 0x35, 0x2e, 0x64, 0x61, 0x6e, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, + 0x41, 0x6e, 0x79, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x3d, 0x0a, 0x07, 0x75, 0x72, + 0x67, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x6f, 0x35, + 0x2e, 0x64, 0x61, 0x6e, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x72, 0x67, 0x65, 0x6e, 0x63, + 0x79, 0x42, 0x0d, 0x8a, 0x9b, 0x81, 0xca, 0x02, 0x07, 0xa2, 0x01, 0x04, 0x52, 0x02, 0x08, 0x01, + 0x52, 0x07, 0x75, 0x72, 0x67, 0x65, 0x6e, 0x63, 0x79, 0x22, 0x3d, 0x0a, 0x0e, 0x55, 0x6e, 0x68, + 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x64, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x2b, 0x0a, 0x05, 0x65, + 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x15, 0x8a, 0x9b, 0x81, 0xca, + 0x02, 0x0f, 0x72, 0x0d, 0x0a, 0x0b, 0x52, 0x09, 0x08, 0x01, 0x12, 0x05, 0x65, 0x72, 0x72, 0x6f, + 0x72, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x45, 0x0a, 0x03, 0x41, 0x6e, 0x79, 0x12, + 0x2a, 0x0a, 0x05, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x41, 0x6e, 0x79, 0x52, 0x05, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6a, + 0x73, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6a, 0x73, 0x6f, 0x6e, 0x22, + 0xce, 0x01, 0x0a, 0x10, 0x44, 0x65, 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x45, + 0x76, 0x65, 0x6e, 0x74, 0x12, 0x3f, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x70, 0x73, 0x6d, 0x2e, 0x73, 0x74, 0x61, + 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 0x42, 0x06, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x52, 0x08, 0x6d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x38, 0x0a, 0x04, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6f, 0x35, 0x2e, 0x64, 0x61, 0x6e, 0x74, 0x65, 0x2e, 0x76, + 0x31, 0x2e, 0x44, 0x65, 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x4b, 0x65, 0x79, + 0x73, 0x42, 0x06, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x52, 0x04, 0x6b, 0x65, 0x79, 0x73, 0x12, + 0x3f, 0x0a, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, + 0x2e, 0x6f, 0x35, 0x2e, 0x64, 0x61, 0x6e, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x61, + 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, + 0x65, 0x42, 0x06, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, 0x52, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x22, 0xf6, 0x03, 0x0a, 0x14, 0x44, 0x65, 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x45, 0x0a, 0x07, 0x63, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x6f, 0x35, 0x2e, + 0x64, 0x61, 0x6e, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x61, 0x64, 0x4d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x2e, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x64, 0x48, 0x00, 0x52, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, + 0x12, 0x45, 0x0a, 0x07, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x29, 0x2e, 0x6f, 0x35, 0x2e, 0x64, 0x61, 0x6e, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, - 0x54, 0x79, 0x70, 0x65, 0x2e, 0x52, 0x65, 0x6a, 0x65, 0x63, 0x74, 0x65, 0x64, 0x48, 0x00, 0x52, - 0x08, 0x72, 0x65, 0x6a, 0x65, 0x63, 0x74, 0x65, 0x64, 0x1a, 0x3b, 0x0a, 0x07, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x64, 0x12, 0x30, 0x0a, 0x04, 0x73, 0x70, 0x65, 0x63, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6f, 0x35, 0x2e, 0x64, 0x61, 0x6e, 0x74, 0x65, 0x2e, 0x76, 0x31, - 0x2e, 0x44, 0x65, 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x53, 0x70, 0x65, 0x63, - 0x52, 0x04, 0x73, 0x70, 0x65, 0x63, 0x1a, 0x3b, 0x0a, 0x07, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x64, 0x12, 0x30, 0x0a, 0x04, 0x73, 0x70, 0x65, 0x63, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1c, 0x2e, 0x6f, 0x35, 0x2e, 0x64, 0x61, 0x6e, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, - 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x53, 0x70, 0x65, 0x63, 0x52, 0x04, 0x73, - 0x70, 0x65, 0x63, 0x1a, 0x0a, 0x0a, 0x08, 0x52, 0x65, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x64, 0x1a, - 0x22, 0x0a, 0x08, 0x52, 0x65, 0x6a, 0x65, 0x63, 0x74, 0x65, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x72, - 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x61, - 0x73, 0x6f, 0x6e, 0x42, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x92, 0x9b, 0x81, - 0xca, 0x02, 0x04, 0x52, 0x02, 0x08, 0x01, 0x22, 0x9a, 0x01, 0x0a, 0x08, 0x4d, 0x65, 0x74, 0x61, - 0x64, 0x61, 0x74, 0x61, 0x12, 0x23, 0x0a, 0x08, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xba, 0x48, 0x05, 0x72, 0x03, 0xb0, 0x01, 0x01, - 0x52, 0x07, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x40, 0x0a, 0x09, 0x74, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, - 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x42, 0x06, 0xba, 0x48, 0x03, 0xc8, 0x01, 0x01, - 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x27, 0x0a, 0x05, 0x61, - 0x63, 0x74, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x6f, 0x35, 0x2e, - 0x61, 0x75, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x05, 0x61, - 0x63, 0x74, 0x6f, 0x72, 0x2a, 0xa1, 0x01, 0x0a, 0x0d, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1e, 0x0a, 0x1a, 0x4d, 0x45, 0x53, 0x53, 0x41, 0x47, - 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, - 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x1a, 0x0a, 0x16, 0x4d, 0x45, 0x53, 0x53, 0x41, 0x47, - 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x43, 0x52, 0x45, 0x41, 0x54, 0x45, 0x44, - 0x10, 0x01, 0x12, 0x1a, 0x0a, 0x16, 0x4d, 0x45, 0x53, 0x53, 0x41, 0x47, 0x45, 0x5f, 0x53, 0x54, - 0x41, 0x54, 0x55, 0x53, 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x44, 0x10, 0x02, 0x12, 0x1b, - 0x0a, 0x17, 0x4d, 0x45, 0x53, 0x53, 0x41, 0x47, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, - 0x5f, 0x52, 0x45, 0x50, 0x4c, 0x41, 0x59, 0x45, 0x44, 0x10, 0x03, 0x12, 0x1b, 0x0a, 0x17, 0x4d, - 0x45, 0x53, 0x53, 0x41, 0x47, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x52, 0x45, - 0x4a, 0x45, 0x43, 0x54, 0x45, 0x44, 0x10, 0x04, 0x2a, 0x59, 0x0a, 0x07, 0x55, 0x72, 0x67, 0x65, - 0x6e, 0x63, 0x79, 0x12, 0x17, 0x0a, 0x13, 0x55, 0x52, 0x47, 0x45, 0x4e, 0x43, 0x59, 0x5f, 0x55, - 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, - 0x55, 0x52, 0x47, 0x45, 0x4e, 0x43, 0x59, 0x5f, 0x4c, 0x4f, 0x57, 0x10, 0x01, 0x12, 0x12, 0x0a, - 0x0e, 0x55, 0x52, 0x47, 0x45, 0x4e, 0x43, 0x59, 0x5f, 0x4d, 0x45, 0x44, 0x49, 0x55, 0x4d, 0x10, - 0x02, 0x12, 0x10, 0x0a, 0x0c, 0x55, 0x52, 0x47, 0x45, 0x4e, 0x43, 0x59, 0x5f, 0x48, 0x49, 0x47, - 0x48, 0x10, 0x03, 0x42, 0x33, 0x5a, 0x31, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, - 0x6d, 0x2f, 0x70, 0x65, 0x6e, 0x74, 0x6f, 0x70, 0x73, 0x2f, 0x64, 0x61, 0x6e, 0x74, 0x65, 0x2f, - 0x67, 0x65, 0x6e, 0x2f, 0x6f, 0x35, 0x2f, 0x64, 0x61, 0x6e, 0x74, 0x65, 0x2f, 0x76, 0x31, 0x2f, - 0x64, 0x61, 0x6e, 0x74, 0x65, 0x5f, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x54, 0x79, 0x70, 0x65, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x48, 0x00, 0x52, 0x07, + 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x12, 0x48, 0x0a, 0x08, 0x72, 0x65, 0x70, 0x6c, 0x61, + 0x79, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6f, 0x35, 0x2e, 0x64, + 0x61, 0x6e, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73, + 0x61, 0x67, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x2e, 0x52, 0x65, 0x70, + 0x6c, 0x61, 0x79, 0x65, 0x64, 0x48, 0x00, 0x52, 0x08, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x79, 0x65, + 0x64, 0x12, 0x48, 0x0a, 0x08, 0x72, 0x65, 0x6a, 0x65, 0x63, 0x74, 0x65, 0x64, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6f, 0x35, 0x2e, 0x64, 0x61, 0x6e, 0x74, 0x65, 0x2e, 0x76, + 0x31, 0x2e, 0x44, 0x65, 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x2e, 0x52, 0x65, 0x6a, 0x65, 0x63, 0x74, 0x65, 0x64, 0x48, + 0x00, 0x52, 0x08, 0x72, 0x65, 0x6a, 0x65, 0x63, 0x74, 0x65, 0x64, 0x1a, 0x3b, 0x0a, 0x07, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x30, 0x0a, 0x04, 0x73, 0x70, 0x65, 0x63, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6f, 0x35, 0x2e, 0x64, 0x61, 0x6e, 0x74, 0x65, 0x2e, + 0x76, 0x31, 0x2e, 0x44, 0x65, 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x53, 0x70, + 0x65, 0x63, 0x52, 0x04, 0x73, 0x70, 0x65, 0x63, 0x1a, 0x3b, 0x0a, 0x07, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x64, 0x12, 0x30, 0x0a, 0x04, 0x73, 0x70, 0x65, 0x63, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1c, 0x2e, 0x6f, 0x35, 0x2e, 0x64, 0x61, 0x6e, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, + 0x44, 0x65, 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x53, 0x70, 0x65, 0x63, 0x52, + 0x04, 0x73, 0x70, 0x65, 0x63, 0x1a, 0x0a, 0x0a, 0x08, 0x52, 0x65, 0x70, 0x6c, 0x61, 0x79, 0x65, + 0x64, 0x1a, 0x22, 0x0a, 0x08, 0x52, 0x65, 0x6a, 0x65, 0x63, 0x74, 0x65, 0x64, 0x12, 0x16, 0x0a, + 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, + 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x42, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x92, + 0x9b, 0x81, 0xca, 0x02, 0x04, 0x52, 0x02, 0x08, 0x01, 0x22, 0x9a, 0x01, 0x0a, 0x08, 0x4d, 0x65, + 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x23, 0x0a, 0x08, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xba, 0x48, 0x05, 0x72, 0x03, 0xb0, + 0x01, 0x01, 0x52, 0x07, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x40, 0x0a, 0x09, 0x74, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x42, 0x06, 0xba, 0x48, 0x03, 0xc8, + 0x01, 0x01, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x27, 0x0a, + 0x05, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x6f, + 0x35, 0x2e, 0x61, 0x75, 0x74, 0x68, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x63, 0x74, 0x6f, 0x72, 0x52, + 0x05, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x2a, 0xa1, 0x01, 0x0a, 0x0d, 0x4d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1e, 0x0a, 0x1a, 0x4d, 0x45, 0x53, 0x53, + 0x41, 0x47, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, + 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x1a, 0x0a, 0x16, 0x4d, 0x45, 0x53, 0x53, + 0x41, 0x47, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x43, 0x52, 0x45, 0x41, 0x54, + 0x45, 0x44, 0x10, 0x01, 0x12, 0x1a, 0x0a, 0x16, 0x4d, 0x45, 0x53, 0x53, 0x41, 0x47, 0x45, 0x5f, + 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x44, 0x10, 0x02, + 0x12, 0x1b, 0x0a, 0x17, 0x4d, 0x45, 0x53, 0x53, 0x41, 0x47, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, + 0x55, 0x53, 0x5f, 0x52, 0x45, 0x50, 0x4c, 0x41, 0x59, 0x45, 0x44, 0x10, 0x03, 0x12, 0x1b, 0x0a, + 0x17, 0x4d, 0x45, 0x53, 0x53, 0x41, 0x47, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, + 0x52, 0x45, 0x4a, 0x45, 0x43, 0x54, 0x45, 0x44, 0x10, 0x04, 0x2a, 0x59, 0x0a, 0x07, 0x55, 0x72, + 0x67, 0x65, 0x6e, 0x63, 0x79, 0x12, 0x17, 0x0a, 0x13, 0x55, 0x52, 0x47, 0x45, 0x4e, 0x43, 0x59, + 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0f, + 0x0a, 0x0b, 0x55, 0x52, 0x47, 0x45, 0x4e, 0x43, 0x59, 0x5f, 0x4c, 0x4f, 0x57, 0x10, 0x01, 0x12, + 0x12, 0x0a, 0x0e, 0x55, 0x52, 0x47, 0x45, 0x4e, 0x43, 0x59, 0x5f, 0x4d, 0x45, 0x44, 0x49, 0x55, + 0x4d, 0x10, 0x02, 0x12, 0x10, 0x0a, 0x0c, 0x55, 0x52, 0x47, 0x45, 0x4e, 0x43, 0x59, 0x5f, 0x48, + 0x49, 0x47, 0x48, 0x10, 0x03, 0x42, 0x33, 0x5a, 0x31, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, + 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x65, 0x6e, 0x74, 0x6f, 0x70, 0x73, 0x2f, 0x64, 0x61, 0x6e, 0x74, + 0x65, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x6f, 0x35, 0x2f, 0x64, 0x61, 0x6e, 0x74, 0x65, 0x2f, 0x76, + 0x31, 0x2f, 0x64, 0x61, 0x6e, 0x74, 0x65, 0x5f, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x33, } var ( @@ -1132,53 +1249,61 @@ func file_o5_dante_v1_dead_message_proto_rawDescGZIP() []byte { } var file_o5_dante_v1_dead_message_proto_enumTypes = make([]protoimpl.EnumInfo, 2) -var file_o5_dante_v1_dead_message_proto_msgTypes = make([]protoimpl.MessageInfo, 13) +var file_o5_dante_v1_dead_message_proto_msgTypes = make([]protoimpl.MessageInfo, 15) var file_o5_dante_v1_dead_message_proto_goTypes = []interface{}{ (MessageStatus)(0), // 0: o5.dante.v1.MessageStatus (Urgency)(0), // 1: o5.dante.v1.Urgency - (*DeadMessageState)(nil), // 2: o5.dante.v1.DeadMessageState - (*DeadMessageSpec)(nil), // 3: o5.dante.v1.DeadMessageSpec - (*Problem)(nil), // 4: o5.dante.v1.Problem - (*InvariantViolation)(nil), // 5: o5.dante.v1.InvariantViolation - (*UnhandledError)(nil), // 6: o5.dante.v1.UnhandledError - (*Any)(nil), // 7: o5.dante.v1.Any - (*DeadMessageEvent)(nil), // 8: o5.dante.v1.DeadMessageEvent - (*DeadMessageEventType)(nil), // 9: o5.dante.v1.DeadMessageEventType - (*Metadata)(nil), // 10: o5.dante.v1.Metadata - (*DeadMessageEventType_Created)(nil), // 11: o5.dante.v1.DeadMessageEventType.Created - (*DeadMessageEventType_Updated)(nil), // 12: o5.dante.v1.DeadMessageEventType.Updated - (*DeadMessageEventType_Replayed)(nil), // 13: o5.dante.v1.DeadMessageEventType.Replayed - (*DeadMessageEventType_Rejected)(nil), // 14: o5.dante.v1.DeadMessageEventType.Rejected - (*timestamppb.Timestamp)(nil), // 15: google.protobuf.Timestamp - (*anypb.Any)(nil), // 16: google.protobuf.Any - (*auth_pb.Actor)(nil), // 17: o5.auth.v1.Actor + (*DeadMessageKeys)(nil), // 2: o5.dante.v1.DeadMessageKeys + (*DeadMessageState)(nil), // 3: o5.dante.v1.DeadMessageState + (*DeadMessageData)(nil), // 4: o5.dante.v1.DeadMessageData + (*DeadMessageSpec)(nil), // 5: o5.dante.v1.DeadMessageSpec + (*Problem)(nil), // 6: o5.dante.v1.Problem + (*InvariantViolation)(nil), // 7: o5.dante.v1.InvariantViolation + (*UnhandledError)(nil), // 8: o5.dante.v1.UnhandledError + (*Any)(nil), // 9: o5.dante.v1.Any + (*DeadMessageEvent)(nil), // 10: o5.dante.v1.DeadMessageEvent + (*DeadMessageEventType)(nil), // 11: o5.dante.v1.DeadMessageEventType + (*Metadata)(nil), // 12: o5.dante.v1.Metadata + (*DeadMessageEventType_Created)(nil), // 13: o5.dante.v1.DeadMessageEventType.Created + (*DeadMessageEventType_Updated)(nil), // 14: o5.dante.v1.DeadMessageEventType.Updated + (*DeadMessageEventType_Replayed)(nil), // 15: o5.dante.v1.DeadMessageEventType.Replayed + (*DeadMessageEventType_Rejected)(nil), // 16: o5.dante.v1.DeadMessageEventType.Rejected + (*psm_pb.StateMetadata)(nil), // 17: psm.state.v1.StateMetadata + (*timestamppb.Timestamp)(nil), // 18: google.protobuf.Timestamp + (*anypb.Any)(nil), // 19: google.protobuf.Any + (*psm_pb.EventMetadata)(nil), // 20: psm.state.v1.EventMetadata + (*auth_pb.Actor)(nil), // 21: o5.auth.v1.Actor } var file_o5_dante_v1_dead_message_proto_depIdxs = []int32{ - 0, // 0: o5.dante.v1.DeadMessageState.status:type_name -> o5.dante.v1.MessageStatus - 3, // 1: o5.dante.v1.DeadMessageState.current_spec:type_name -> o5.dante.v1.DeadMessageSpec - 15, // 2: o5.dante.v1.DeadMessageSpec.created_at:type_name -> google.protobuf.Timestamp - 7, // 3: o5.dante.v1.DeadMessageSpec.payload:type_name -> o5.dante.v1.Any - 4, // 4: o5.dante.v1.DeadMessageSpec.problem:type_name -> o5.dante.v1.Problem - 5, // 5: o5.dante.v1.Problem.invariant_violation:type_name -> o5.dante.v1.InvariantViolation - 6, // 6: o5.dante.v1.Problem.unhandled_error:type_name -> o5.dante.v1.UnhandledError - 7, // 7: o5.dante.v1.InvariantViolation.error:type_name -> o5.dante.v1.Any - 1, // 8: o5.dante.v1.InvariantViolation.urgency:type_name -> o5.dante.v1.Urgency - 16, // 9: o5.dante.v1.Any.proto:type_name -> google.protobuf.Any - 10, // 10: o5.dante.v1.DeadMessageEvent.metadata:type_name -> o5.dante.v1.Metadata - 9, // 11: o5.dante.v1.DeadMessageEvent.event:type_name -> o5.dante.v1.DeadMessageEventType - 11, // 12: o5.dante.v1.DeadMessageEventType.created:type_name -> o5.dante.v1.DeadMessageEventType.Created - 12, // 13: o5.dante.v1.DeadMessageEventType.updated:type_name -> o5.dante.v1.DeadMessageEventType.Updated - 13, // 14: o5.dante.v1.DeadMessageEventType.replayed:type_name -> o5.dante.v1.DeadMessageEventType.Replayed - 14, // 15: o5.dante.v1.DeadMessageEventType.rejected:type_name -> o5.dante.v1.DeadMessageEventType.Rejected - 15, // 16: o5.dante.v1.Metadata.timestamp:type_name -> google.protobuf.Timestamp - 17, // 17: o5.dante.v1.Metadata.actor:type_name -> o5.auth.v1.Actor - 3, // 18: o5.dante.v1.DeadMessageEventType.Created.spec:type_name -> o5.dante.v1.DeadMessageSpec - 3, // 19: o5.dante.v1.DeadMessageEventType.Updated.spec:type_name -> o5.dante.v1.DeadMessageSpec - 20, // [20:20] is the sub-list for method output_type - 20, // [20:20] is the sub-list for method input_type - 20, // [20:20] is the sub-list for extension type_name - 20, // [20:20] is the sub-list for extension extendee - 0, // [0:20] is the sub-list for field type_name + 17, // 0: o5.dante.v1.DeadMessageState.metadata:type_name -> psm.state.v1.StateMetadata + 2, // 1: o5.dante.v1.DeadMessageState.keys:type_name -> o5.dante.v1.DeadMessageKeys + 0, // 2: o5.dante.v1.DeadMessageState.status:type_name -> o5.dante.v1.MessageStatus + 4, // 3: o5.dante.v1.DeadMessageState.data:type_name -> o5.dante.v1.DeadMessageData + 5, // 4: o5.dante.v1.DeadMessageData.current_spec:type_name -> o5.dante.v1.DeadMessageSpec + 18, // 5: o5.dante.v1.DeadMessageSpec.created_at:type_name -> google.protobuf.Timestamp + 9, // 6: o5.dante.v1.DeadMessageSpec.payload:type_name -> o5.dante.v1.Any + 6, // 7: o5.dante.v1.DeadMessageSpec.problem:type_name -> o5.dante.v1.Problem + 7, // 8: o5.dante.v1.Problem.invariant_violation:type_name -> o5.dante.v1.InvariantViolation + 8, // 9: o5.dante.v1.Problem.unhandled_error:type_name -> o5.dante.v1.UnhandledError + 9, // 10: o5.dante.v1.InvariantViolation.error:type_name -> o5.dante.v1.Any + 1, // 11: o5.dante.v1.InvariantViolation.urgency:type_name -> o5.dante.v1.Urgency + 19, // 12: o5.dante.v1.Any.proto:type_name -> google.protobuf.Any + 20, // 13: o5.dante.v1.DeadMessageEvent.metadata:type_name -> psm.state.v1.EventMetadata + 2, // 14: o5.dante.v1.DeadMessageEvent.keys:type_name -> o5.dante.v1.DeadMessageKeys + 11, // 15: o5.dante.v1.DeadMessageEvent.event:type_name -> o5.dante.v1.DeadMessageEventType + 13, // 16: o5.dante.v1.DeadMessageEventType.created:type_name -> o5.dante.v1.DeadMessageEventType.Created + 14, // 17: o5.dante.v1.DeadMessageEventType.updated:type_name -> o5.dante.v1.DeadMessageEventType.Updated + 15, // 18: o5.dante.v1.DeadMessageEventType.replayed:type_name -> o5.dante.v1.DeadMessageEventType.Replayed + 16, // 19: o5.dante.v1.DeadMessageEventType.rejected:type_name -> o5.dante.v1.DeadMessageEventType.Rejected + 18, // 20: o5.dante.v1.Metadata.timestamp:type_name -> google.protobuf.Timestamp + 21, // 21: o5.dante.v1.Metadata.actor:type_name -> o5.auth.v1.Actor + 5, // 22: o5.dante.v1.DeadMessageEventType.Created.spec:type_name -> o5.dante.v1.DeadMessageSpec + 5, // 23: o5.dante.v1.DeadMessageEventType.Updated.spec:type_name -> o5.dante.v1.DeadMessageSpec + 24, // [24:24] is the sub-list for method output_type + 24, // [24:24] is the sub-list for method input_type + 24, // [24:24] is the sub-list for extension type_name + 24, // [24:24] is the sub-list for extension extendee + 0, // [0:24] is the sub-list for field type_name } func init() { file_o5_dante_v1_dead_message_proto_init() } @@ -1188,7 +1313,7 @@ func file_o5_dante_v1_dead_message_proto_init() { } if !protoimpl.UnsafeEnabled { file_o5_dante_v1_dead_message_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeadMessageState); i { + switch v := v.(*DeadMessageKeys); i { case 0: return &v.state case 1: @@ -1200,7 +1325,7 @@ func file_o5_dante_v1_dead_message_proto_init() { } } file_o5_dante_v1_dead_message_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeadMessageSpec); i { + switch v := v.(*DeadMessageState); i { case 0: return &v.state case 1: @@ -1212,7 +1337,7 @@ func file_o5_dante_v1_dead_message_proto_init() { } } file_o5_dante_v1_dead_message_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Problem); i { + switch v := v.(*DeadMessageData); i { case 0: return &v.state case 1: @@ -1224,7 +1349,7 @@ func file_o5_dante_v1_dead_message_proto_init() { } } file_o5_dante_v1_dead_message_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*InvariantViolation); i { + switch v := v.(*DeadMessageSpec); i { case 0: return &v.state case 1: @@ -1236,7 +1361,7 @@ func file_o5_dante_v1_dead_message_proto_init() { } } file_o5_dante_v1_dead_message_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UnhandledError); i { + switch v := v.(*Problem); i { case 0: return &v.state case 1: @@ -1248,7 +1373,7 @@ func file_o5_dante_v1_dead_message_proto_init() { } } file_o5_dante_v1_dead_message_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Any); i { + switch v := v.(*InvariantViolation); i { case 0: return &v.state case 1: @@ -1260,7 +1385,7 @@ func file_o5_dante_v1_dead_message_proto_init() { } } file_o5_dante_v1_dead_message_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeadMessageEvent); i { + switch v := v.(*UnhandledError); i { case 0: return &v.state case 1: @@ -1272,7 +1397,7 @@ func file_o5_dante_v1_dead_message_proto_init() { } } file_o5_dante_v1_dead_message_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeadMessageEventType); i { + switch v := v.(*Any); i { case 0: return &v.state case 1: @@ -1284,7 +1409,7 @@ func file_o5_dante_v1_dead_message_proto_init() { } } file_o5_dante_v1_dead_message_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Metadata); i { + switch v := v.(*DeadMessageEvent); i { case 0: return &v.state case 1: @@ -1296,7 +1421,7 @@ func file_o5_dante_v1_dead_message_proto_init() { } } file_o5_dante_v1_dead_message_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeadMessageEventType_Created); i { + switch v := v.(*DeadMessageEventType); i { case 0: return &v.state case 1: @@ -1308,7 +1433,7 @@ func file_o5_dante_v1_dead_message_proto_init() { } } file_o5_dante_v1_dead_message_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeadMessageEventType_Updated); i { + switch v := v.(*Metadata); i { case 0: return &v.state case 1: @@ -1320,7 +1445,7 @@ func file_o5_dante_v1_dead_message_proto_init() { } } file_o5_dante_v1_dead_message_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeadMessageEventType_Replayed); i { + switch v := v.(*DeadMessageEventType_Created); i { case 0: return &v.state case 1: @@ -1332,6 +1457,30 @@ func file_o5_dante_v1_dead_message_proto_init() { } } file_o5_dante_v1_dead_message_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DeadMessageEventType_Updated); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_o5_dante_v1_dead_message_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*DeadMessageEventType_Replayed); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_o5_dante_v1_dead_message_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*DeadMessageEventType_Rejected); i { case 0: return &v.state @@ -1344,11 +1493,11 @@ func file_o5_dante_v1_dead_message_proto_init() { } } } - file_o5_dante_v1_dead_message_proto_msgTypes[2].OneofWrappers = []interface{}{ + file_o5_dante_v1_dead_message_proto_msgTypes[4].OneofWrappers = []interface{}{ (*Problem_InvariantViolation)(nil), (*Problem_UnhandledError)(nil), } - file_o5_dante_v1_dead_message_proto_msgTypes[7].OneofWrappers = []interface{}{ + file_o5_dante_v1_dead_message_proto_msgTypes[9].OneofWrappers = []interface{}{ (*DeadMessageEventType_Created_)(nil), (*DeadMessageEventType_Updated_)(nil), (*DeadMessageEventType_Replayed_)(nil), @@ -1360,7 +1509,7 @@ func file_o5_dante_v1_dead_message_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_o5_dante_v1_dead_message_proto_rawDesc, NumEnums: 2, - NumMessages: 13, + NumMessages: 15, NumExtensions: 0, NumServices: 0, }, diff --git a/gen/o5/dante/v1/dante_pb/dead_message_psm.pb.go b/gen/o5/dante/v1/dante_pb/dead_message_psm.pb.go index 05d7183..7625272 100644 --- a/gen/o5/dante/v1/dante_pb/dead_message_psm.pb.go +++ b/gen/o5/dante/v1/dante_pb/dead_message_psm.pb.go @@ -5,170 +5,49 @@ package dante_pb import ( context "context" fmt "fmt" + psm_pb "github.com/pentops/protostate/gen/state/v1/psm_pb" psm "github.com/pentops/protostate/psm" sqrlx "github.com/pentops/sqrlx.go/sqrlx" - proto "google.golang.org/protobuf/proto" - timestamppb "google.golang.org/protobuf/types/known/timestamppb" ) -// StateObjectOptions: DeadmessagePSM +// PSM DeadmessagePSM + type DeadmessagePSM = psm.StateMachine[ - *DeadMessageState, - MessageStatus, - *DeadMessageEvent, - DeadmessagePSMEvent, + *DeadMessageKeys, // implements psm.IKeyset + *DeadMessageState, // implements psm.IState + MessageStatus, // implements psm.IStatusEnum + *DeadMessageData, // implements psm.IStateData + *DeadMessageEvent, // implements psm.IEvent + DeadmessagePSMEvent, // implements psm.IInnerEvent ] type DeadmessagePSMDB = psm.DBStateMachine[ - *DeadMessageState, - MessageStatus, - *DeadMessageEvent, - DeadmessagePSMEvent, + *DeadMessageKeys, // implements psm.IKeyset + *DeadMessageState, // implements psm.IState + MessageStatus, // implements psm.IStatusEnum + *DeadMessageData, // implements psm.IStateData + *DeadMessageEvent, // implements psm.IEvent + DeadmessagePSMEvent, // implements psm.IInnerEvent ] type DeadmessagePSMEventer = psm.Eventer[ - *DeadMessageState, - MessageStatus, - *DeadMessageEvent, - DeadmessagePSMEvent, + *DeadMessageKeys, // implements psm.IKeyset + *DeadMessageState, // implements psm.IState + MessageStatus, // implements psm.IStatusEnum + *DeadMessageData, // implements psm.IStateData + *DeadMessageEvent, // implements psm.IEvent + DeadmessagePSMEvent, // implements psm.IInnerEvent ] -func DefaultDeadmessagePSMConfig() *psm.StateMachineConfig[ - *DeadMessageState, - MessageStatus, - *DeadMessageEvent, - DeadmessagePSMEvent, -] { - return psm.NewStateMachineConfig[ - *DeadMessageState, - MessageStatus, - *DeadMessageEvent, - DeadmessagePSMEvent, - ](DeadmessagePSMConverter{}, DefaultDeadmessagePSMTableSpec) -} - -func NewDeadmessagePSM(config *psm.StateMachineConfig[ - *DeadMessageState, - MessageStatus, - *DeadMessageEvent, - DeadmessagePSMEvent, -]) (*DeadmessagePSM, error) { - return psm.NewStateMachine[ - *DeadMessageState, - MessageStatus, - *DeadMessageEvent, - DeadmessagePSMEvent, - ](config) -} - -type DeadmessagePSMTableSpec = psm.PSMTableSpec[ - *DeadMessageState, - MessageStatus, - *DeadMessageEvent, - DeadmessagePSMEvent, +type DeadmessagePSMEventSpec = psm.EventSpec[ + *DeadMessageKeys, // implements psm.IKeyset + *DeadMessageState, // implements psm.IState + MessageStatus, // implements psm.IStatusEnum + *DeadMessageData, // implements psm.IStateData + *DeadMessageEvent, // implements psm.IEvent + DeadmessagePSMEvent, // implements psm.IInnerEvent ] -var DefaultDeadmessagePSMTableSpec = DeadmessagePSMTableSpec{ - State: psm.TableSpec[*DeadMessageState]{ - TableName: "deadmessage", - DataColumn: "state", - StoreExtraColumns: func(state *DeadMessageState) (map[string]interface{}, error) { - return map[string]interface{}{}, nil - }, - PKFieldPaths: []string{ - "message_id", - }, - }, - Event: psm.TableSpec[*DeadMessageEvent]{ - TableName: "deadmessage_event", - DataColumn: "data", - StoreExtraColumns: func(event *DeadMessageEvent) (map[string]interface{}, error) { - metadata := event.Metadata - return map[string]interface{}{ - "id": metadata.EventId, - "timestamp": metadata.Timestamp, - "actor": metadata.Actor, - "message_id": event.MessageId, - }, nil - }, - PKFieldPaths: []string{ - "metadata.event_id", - }, - PK: func(event *DeadMessageEvent) (map[string]interface{}, error) { - return map[string]interface{}{ - "id": event.Metadata.EventId, - }, nil - }, - }, - PrimaryKey: func(event *DeadMessageEvent) (map[string]interface{}, error) { - return map[string]interface{}{ - "message_id": event.MessageId, - }, nil - }, -} - -type DeadmessagePSMTransitionBaton = psm.TransitionBaton[*DeadMessageEvent, DeadmessagePSMEvent] -type DeadmessagePSMHookBaton = psm.StateHookBaton[*DeadMessageEvent, DeadmessagePSMEvent] - -func DeadmessagePSMFunc[SE DeadmessagePSMEvent](cb func(context.Context, DeadmessagePSMTransitionBaton, *DeadMessageState, SE) error) psm.PSMCombinedFunc[ - *DeadMessageState, - MessageStatus, - *DeadMessageEvent, - DeadmessagePSMEvent, - SE, -] { - return psm.PSMCombinedFunc[ - *DeadMessageState, - MessageStatus, - *DeadMessageEvent, - DeadmessagePSMEvent, - SE, - ](cb) -} -func DeadmessagePSMTransition[SE DeadmessagePSMEvent](cb func(context.Context, *DeadMessageState, SE) error) psm.PSMTransitionFunc[ - *DeadMessageState, - MessageStatus, - *DeadMessageEvent, - DeadmessagePSMEvent, - SE, -] { - return psm.PSMTransitionFunc[ - *DeadMessageState, - MessageStatus, - *DeadMessageEvent, - DeadmessagePSMEvent, - SE, - ](cb) -} -func DeadmessagePSMHook[SE DeadmessagePSMEvent](cb func(context.Context, sqrlx.Transaction, DeadmessagePSMHookBaton, *DeadMessageState, SE) error) psm.PSMHookFunc[ - *DeadMessageState, - MessageStatus, - *DeadMessageEvent, - DeadmessagePSMEvent, - SE, -] { - return psm.PSMHookFunc[ - *DeadMessageState, - MessageStatus, - *DeadMessageEvent, - DeadmessagePSMEvent, - SE, - ](cb) -} -func DeadmessagePSMGeneralHook(cb func(context.Context, sqrlx.Transaction, *DeadMessageState, *DeadMessageEvent) error) psm.GeneralStateHook[ - *DeadMessageState, - MessageStatus, - *DeadMessageEvent, - DeadmessagePSMEvent, -] { - return psm.GeneralStateHook[ - *DeadMessageState, - MessageStatus, - *DeadMessageEvent, - DeadmessagePSMEvent, - ](cb) -} - type DeadmessagePSMEventKey = string const ( @@ -179,45 +58,98 @@ const ( DeadmessagePSMEventRejected DeadmessagePSMEventKey = "rejected" ) -type DeadmessagePSMEvent interface { - proto.Message - PSMEventKey() DeadmessagePSMEventKey +// EXTEND DeadMessageKeys with the psm.IKeyset interface + +// PSMIsSet is a helper for != nil, which does not work with generic parameters +func (msg *DeadMessageKeys) PSMIsSet() bool { + return msg != nil +} + +// PSMFullName returns the full name of state machine with package prefix +func (msg *DeadMessageKeys) PSMFullName() string { + return "o5.dante.v1.deadmessage" } -type DeadmessagePSMConverter struct{} +// EXTEND DeadMessageState with the psm.IState interface -func (c DeadmessagePSMConverter) EmptyState(e *DeadMessageEvent) *DeadMessageState { - return &DeadMessageState{ - MessageId: e.MessageId, +// PSMIsSet is a helper for != nil, which does not work with generic parameters +func (msg *DeadMessageState) PSMIsSet() bool { + return msg != nil +} + +func (msg *DeadMessageState) PSMMetadata() *psm_pb.StateMetadata { + if msg.Metadata == nil { + msg.Metadata = &psm_pb.StateMetadata{} } + return msg.Metadata +} + +func (msg *DeadMessageState) PSMKeys() *DeadMessageKeys { + return msg.Keys +} + +func (msg *DeadMessageState) SetStatus(status MessageStatus) { + msg.Status = status } -func (c DeadmessagePSMConverter) DeriveChainEvent(e *DeadMessageEvent, systemActor psm.SystemActor, eventKey string) *DeadMessageEvent { - metadata := &Metadata{ - EventId: systemActor.NewEventID(e.Metadata.EventId, eventKey), - Timestamp: timestamppb.Now(), +func (msg *DeadMessageState) SetPSMKeys(inner *DeadMessageKeys) { + msg.Keys = inner +} + +func (msg *DeadMessageState) PSMData() *DeadMessageData { + if msg.Data == nil { + msg.Data = &DeadMessageData{} } - actorProto := systemActor.ActorProto() - refl := metadata.ProtoReflect() - refl.Set(refl.Descriptor().Fields().ByName("actor"), actorProto) - return &DeadMessageEvent{ - Metadata: metadata, - MessageId: e.MessageId, + return msg.Data +} + +// EXTEND DeadMessageData with the psm.IStateData interface + +// PSMIsSet is a helper for != nil, which does not work with generic parameters +func (msg *DeadMessageData) PSMIsSet() bool { + return msg != nil +} + +// EXTEND DeadMessageEvent with the psm.IEvent interface + +// PSMIsSet is a helper for != nil, which does not work with generic parameters +func (msg *DeadMessageEvent) PSMIsSet() bool { + return msg != nil +} + +func (msg *DeadMessageEvent) PSMMetadata() *psm_pb.EventMetadata { + if msg.Metadata == nil { + msg.Metadata = &psm_pb.EventMetadata{} } + return msg.Metadata } -func (c DeadmessagePSMConverter) CheckStateKeys(s *DeadMessageState, e *DeadMessageEvent) error { - if s.MessageId != e.MessageId { - return fmt.Errorf("state field 'MessageId' %q does not match event field %q", s.MessageId, e.MessageId) +func (msg *DeadMessageEvent) PSMKeys() *DeadMessageKeys { + return msg.Keys +} + +func (msg *DeadMessageEvent) SetPSMKeys(inner *DeadMessageKeys) { + msg.Keys = inner +} + +// PSMEventKey returns the DeadmessagePSMEventPSMEventKey for the event, implementing psm.IEvent +func (msg *DeadMessageEvent) PSMEventKey() DeadmessagePSMEventKey { + tt := msg.UnwrapPSMEvent() + if tt == nil { + return DeadmessagePSMEventNil } - return nil + return tt.PSMEventKey() } -func (etw *DeadMessageEventType) UnwrapPSMEvent() DeadmessagePSMEvent { - if etw == nil { +// UnwrapPSMEvent implements psm.IEvent, returning the inner event message +func (msg *DeadMessageEvent) UnwrapPSMEvent() DeadmessagePSMEvent { + if msg == nil { + return nil + } + if msg.Event == nil { return nil } - switch v := etw.Type.(type) { + switch v := msg.Event.Type.(type) { case *DeadMessageEventType_Created_: return v.Created case *DeadMessageEventType_Updated_: @@ -230,52 +162,223 @@ func (etw *DeadMessageEventType) UnwrapPSMEvent() DeadmessagePSMEvent { return nil } } -func (etw *DeadMessageEventType) PSMEventKey() DeadmessagePSMEventKey { - tt := etw.UnwrapPSMEvent() - if tt == nil { - return DeadmessagePSMEventNil + +// SetPSMEvent sets the inner event message from a concrete type, implementing psm.IEvent +func (msg *DeadMessageEvent) SetPSMEvent(inner DeadmessagePSMEvent) error { + if msg.Event == nil { + msg.Event = &DeadMessageEventType{} } - return tt.PSMEventKey() -} -func (etw *DeadMessageEventType) SetPSMEvent(inner DeadmessagePSMEvent) { switch v := inner.(type) { case *DeadMessageEventType_Created: - etw.Type = &DeadMessageEventType_Created_{Created: v} + msg.Event.Type = &DeadMessageEventType_Created_{Created: v} case *DeadMessageEventType_Updated: - etw.Type = &DeadMessageEventType_Updated_{Updated: v} + msg.Event.Type = &DeadMessageEventType_Updated_{Updated: v} case *DeadMessageEventType_Replayed: - etw.Type = &DeadMessageEventType_Replayed_{Replayed: v} + msg.Event.Type = &DeadMessageEventType_Replayed_{Replayed: v} case *DeadMessageEventType_Rejected: - etw.Type = &DeadMessageEventType_Rejected_{Rejected: v} + msg.Event.Type = &DeadMessageEventType_Rejected_{Rejected: v} default: - panic("invalid type") + return fmt.Errorf("invalid type %T for DeadMessageEventType", v) } + return nil } -func (ee *DeadMessageEvent) PSMEventKey() DeadmessagePSMEventKey { - return ee.Event.PSMEventKey() +type DeadmessagePSMEvent interface { + psm.IInnerEvent + PSMEventKey() DeadmessagePSMEventKey } -func (ee *DeadMessageEvent) UnwrapPSMEvent() DeadmessagePSMEvent { - return ee.Event.UnwrapPSMEvent() -} +// EXTEND DeadMessageEventType_Created with the DeadmessagePSMEvent interface -func (ee *DeadMessageEvent) SetPSMEvent(inner DeadmessagePSMEvent) { - if ee.Event == nil { - ee.Event = &DeadMessageEventType{} - } - ee.Event.SetPSMEvent(inner) +// PSMIsSet is a helper for != nil, which does not work with generic parameters +func (msg *DeadMessageEventType_Created) PSMIsSet() bool { + return msg != nil } func (*DeadMessageEventType_Created) PSMEventKey() DeadmessagePSMEventKey { return DeadmessagePSMEventCreated } + +// EXTEND DeadMessageEventType_Updated with the DeadmessagePSMEvent interface + +// PSMIsSet is a helper for != nil, which does not work with generic parameters +func (msg *DeadMessageEventType_Updated) PSMIsSet() bool { + return msg != nil +} + func (*DeadMessageEventType_Updated) PSMEventKey() DeadmessagePSMEventKey { return DeadmessagePSMEventUpdated } + +// EXTEND DeadMessageEventType_Replayed with the DeadmessagePSMEvent interface + +// PSMIsSet is a helper for != nil, which does not work with generic parameters +func (msg *DeadMessageEventType_Replayed) PSMIsSet() bool { + return msg != nil +} + func (*DeadMessageEventType_Replayed) PSMEventKey() DeadmessagePSMEventKey { return DeadmessagePSMEventReplayed } + +// EXTEND DeadMessageEventType_Rejected with the DeadmessagePSMEvent interface + +// PSMIsSet is a helper for != nil, which does not work with generic parameters +func (msg *DeadMessageEventType_Rejected) PSMIsSet() bool { + return msg != nil +} + func (*DeadMessageEventType_Rejected) PSMEventKey() DeadmessagePSMEventKey { return DeadmessagePSMEventRejected } + +type DeadmessagePSMTableSpec = psm.PSMTableSpec[ + *DeadMessageKeys, // implements psm.IKeyset + *DeadMessageState, // implements psm.IState + MessageStatus, // implements psm.IStatusEnum + *DeadMessageData, // implements psm.IStateData + *DeadMessageEvent, // implements psm.IEvent + DeadmessagePSMEvent, // implements psm.IInnerEvent +] + +var DefaultDeadmessagePSMTableSpec = DeadmessagePSMTableSpec{ + State: psm.TableSpec[*DeadMessageState]{ + TableName: "deadmessage", + DataColumn: "state", + StoreExtraColumns: func(state *DeadMessageState) (map[string]interface{}, error) { + return map[string]interface{}{}, nil + }, + PKFieldPaths: []string{ + "keys.message_id", + }, + }, + Event: psm.TableSpec[*DeadMessageEvent]{ + TableName: "deadmessage_event", + DataColumn: "data", + StoreExtraColumns: func(event *DeadMessageEvent) (map[string]interface{}, error) { + metadata := event.Metadata + return map[string]interface{}{ + "id": metadata.EventId, + "timestamp": metadata.Timestamp, + "cause": metadata.Cause, + "sequence": metadata.Sequence, + "message_id": event.Keys.MessageId, + }, nil + }, + PKFieldPaths: []string{ + "metadata.EventId", + }, + }, + EventPrimaryKey: func(id string, keys *DeadMessageKeys) (map[string]interface{}, error) { + return map[string]interface{}{ + "id": id, + }, nil + }, + PrimaryKey: func(keys *DeadMessageKeys) (map[string]interface{}, error) { + return map[string]interface{}{ + "message_id": keys.MessageId, + }, nil + }, +} + +func DefaultDeadmessagePSMConfig() *psm.StateMachineConfig[ + *DeadMessageKeys, // implements psm.IKeyset + *DeadMessageState, // implements psm.IState + MessageStatus, // implements psm.IStatusEnum + *DeadMessageData, // implements psm.IStateData + *DeadMessageEvent, // implements psm.IEvent + DeadmessagePSMEvent, // implements psm.IInnerEvent +] { + return psm.NewStateMachineConfig[ + *DeadMessageKeys, // implements psm.IKeyset + *DeadMessageState, // implements psm.IState + MessageStatus, // implements psm.IStatusEnum + *DeadMessageData, // implements psm.IStateData + *DeadMessageEvent, // implements psm.IEvent + DeadmessagePSMEvent, // implements psm.IInnerEvent + ](DefaultDeadmessagePSMTableSpec) +} + +func NewDeadmessagePSM(config *psm.StateMachineConfig[ + *DeadMessageKeys, // implements psm.IKeyset + *DeadMessageState, // implements psm.IState + MessageStatus, // implements psm.IStatusEnum + *DeadMessageData, // implements psm.IStateData + *DeadMessageEvent, // implements psm.IEvent + DeadmessagePSMEvent, // implements psm.IInnerEvent +]) (*DeadmessagePSM, error) { + return psm.NewStateMachine[ + *DeadMessageKeys, // implements psm.IKeyset + *DeadMessageState, // implements psm.IState + MessageStatus, // implements psm.IStatusEnum + *DeadMessageData, // implements psm.IStateData + *DeadMessageEvent, // implements psm.IEvent + DeadmessagePSMEvent, // implements psm.IInnerEvent + ](config) +} + +func DeadmessagePSMMutation[SE DeadmessagePSMEvent](cb func(*DeadMessageData, SE) error) psm.PSMMutationFunc[ + *DeadMessageKeys, // implements psm.IKeyset + *DeadMessageState, // implements psm.IState + MessageStatus, // implements psm.IStatusEnum + *DeadMessageData, // implements psm.IStateData + *DeadMessageEvent, // implements psm.IEvent + DeadmessagePSMEvent, // implements psm.IInnerEvent + SE, // Specific event type for the transition +] { + return psm.PSMMutationFunc[ + *DeadMessageKeys, // implements psm.IKeyset + *DeadMessageState, // implements psm.IState + MessageStatus, // implements psm.IStatusEnum + *DeadMessageData, // implements psm.IStateData + *DeadMessageEvent, // implements psm.IEvent + DeadmessagePSMEvent, // implements psm.IInnerEvent + SE, // Specific event type for the transition + ](cb) +} + +type DeadmessagePSMHookBaton = psm.HookBaton[ + *DeadMessageKeys, // implements psm.IKeyset + *DeadMessageState, // implements psm.IState + MessageStatus, // implements psm.IStatusEnum + *DeadMessageData, // implements psm.IStateData + *DeadMessageEvent, // implements psm.IEvent + DeadmessagePSMEvent, // implements psm.IInnerEvent +] + +func DeadmessagePSMHook[SE DeadmessagePSMEvent](cb func(context.Context, sqrlx.Transaction, DeadmessagePSMHookBaton, *DeadMessageState, SE) error) psm.PSMHookFunc[ + *DeadMessageKeys, // implements psm.IKeyset + *DeadMessageState, // implements psm.IState + MessageStatus, // implements psm.IStatusEnum + *DeadMessageData, // implements psm.IStateData + *DeadMessageEvent, // implements psm.IEvent + DeadmessagePSMEvent, // implements psm.IInnerEvent + SE, // Specific event type for the transition +] { + return psm.PSMHookFunc[ + *DeadMessageKeys, // implements psm.IKeyset + *DeadMessageState, // implements psm.IState + MessageStatus, // implements psm.IStatusEnum + *DeadMessageData, // implements psm.IStateData + *DeadMessageEvent, // implements psm.IEvent + DeadmessagePSMEvent, // implements psm.IInnerEvent + SE, // Specific event type for the transition + ](cb) +} +func DeadmessagePSMGeneralHook(cb func(context.Context, sqrlx.Transaction, DeadmessagePSMHookBaton, *DeadMessageState, *DeadMessageEvent) error) psm.GeneralStateHook[ + *DeadMessageKeys, // implements psm.IKeyset + *DeadMessageState, // implements psm.IState + MessageStatus, // implements psm.IStatusEnum + *DeadMessageData, // implements psm.IStateData + *DeadMessageEvent, // implements psm.IEvent + DeadmessagePSMEvent, // implements psm.IInnerEvent +] { + return psm.GeneralStateHook[ + *DeadMessageKeys, // implements psm.IKeyset + *DeadMessageState, // implements psm.IState + MessageStatus, // implements psm.IStatusEnum + *DeadMessageData, // implements psm.IStateData + *DeadMessageEvent, // implements psm.IEvent + DeadmessagePSMEvent, // implements psm.IInnerEvent + ](cb) +} diff --git a/gen/o5/dante/v1/dante_spb/dead_message_query.pb.go b/gen/o5/dante/v1/dante_spb/dead_message_query.pb.go index 58d2d5e..2cdcdbe 100644 --- a/gen/o5/dante/v1/dante_spb/dead_message_query.pb.go +++ b/gen/o5/dante/v1/dante_spb/dead_message_query.pb.go @@ -367,11 +367,11 @@ var file_o5_dante_v1_service_dead_message_query_proto_rawDesc = []byte{ 0x69, 0x63, 0x65, 0x1a, 0x1b, 0x62, 0x75, 0x66, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x6e, 0x6e, - 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1e, - 0x6f, 0x35, 0x2f, 0x64, 0x61, 0x6e, 0x74, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x64, 0x65, 0x61, 0x64, - 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1c, + 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1c, 0x6f, 0x35, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x76, 0x31, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x16, 0x70, 0x73, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1e, 0x6f, 0x35, + 0x2f, 0x64, 0x61, 0x6e, 0x74, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x64, 0x65, 0x61, 0x64, 0x5f, 0x6d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x16, 0x70, 0x73, 0x6d, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x2f, 0x76, 0x31, 0x2f, 0x70, 0x61, 0x67, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x17, 0x70, 0x73, 0x6d, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x2f, 0x76, 0x31, 0x2f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1e, 0x70, @@ -426,46 +426,47 @@ var file_o5_dante_v1_service_dead_message_query_proto_rawDesc = []byte{ 0x74, 0x52, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x2d, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, 0x64, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x70, 0x73, 0x6d, 0x2e, 0x6c, 0x69, 0x73, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x32, 0xae, 0x04, 0x0a, 0x17, 0x44, 0x65, 0x61, + 0x73, 0x65, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x32, 0xba, 0x04, 0x0a, 0x17, 0x44, 0x65, 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x12, 0xa4, 0x01, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x44, 0x65, 0x61, 0x64, + 0x76, 0x69, 0x63, 0x65, 0x12, 0xa8, 0x01, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x44, 0x65, 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x2a, 0x2e, 0x6f, 0x35, 0x2e, 0x64, 0x61, 0x6e, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x44, 0x65, 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x6f, 0x35, 0x2e, 0x64, 0x61, 0x6e, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x44, 0x65, 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x39, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x22, 0x12, 0x20, 0x2f, 0x64, 0x61, 0x6e, 0x74, 0x65, + 0x22, 0x3d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x22, 0x12, 0x20, 0x2f, 0x64, 0x61, 0x6e, 0x74, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x71, 0x2f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2f, 0x7b, 0x6d, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0xf2, 0xe8, 0x81, 0xd9, 0x02, 0x0b, - 0x08, 0x01, 0x22, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x9e, 0x01, 0x0a, 0x10, - 0x4c, 0x69, 0x73, 0x74, 0x44, 0x65, 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, - 0x12, 0x2c, 0x2e, 0x6f, 0x35, 0x2e, 0x64, 0x61, 0x6e, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x73, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x65, 0x61, 0x64, 0x4d, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0xf2, 0xe8, 0x81, 0xd9, 0x02, 0x0f, + 0x08, 0x01, 0x22, 0x0b, 0x64, 0x65, 0x61, 0x64, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, + 0xa2, 0x01, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x65, 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73, + 0x61, 0x67, 0x65, 0x73, 0x12, 0x2c, 0x2e, 0x6f, 0x35, 0x2e, 0x64, 0x61, 0x6e, 0x74, 0x65, 0x2e, + 0x76, 0x31, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x44, + 0x65, 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x6f, 0x35, 0x2e, 0x64, 0x61, 0x6e, 0x74, 0x65, 0x2e, 0x76, 0x31, + 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x65, 0x61, + 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x31, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x12, 0x14, 0x2f, 0x64, 0x61, 0x6e, 0x74, + 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x71, 0x2f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0xf2, + 0xe8, 0x81, 0xd9, 0x02, 0x0f, 0x10, 0x01, 0x22, 0x0b, 0x64, 0x65, 0x61, 0x64, 0x6d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x12, 0xc4, 0x01, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x65, 0x61, + 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x31, 0x2e, 0x6f, 0x35, 0x2e, 0x64, 0x61, 0x6e, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x65, 0x61, 0x64, 0x4d, 0x65, 0x73, - 0x73, 0x61, 0x67, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2d, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x12, 0x14, 0x2f, 0x64, 0x61, 0x6e, 0x74, 0x65, 0x2f, 0x76, 0x31, - 0x2f, 0x71, 0x2f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0xf2, 0xe8, 0x81, 0xd9, 0x02, - 0x0b, 0x10, 0x01, 0x22, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0xc0, 0x01, 0x0a, - 0x15, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x65, 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, - 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x31, 0x2e, 0x6f, 0x35, 0x2e, 0x64, 0x61, 0x6e, 0x74, - 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x4c, 0x69, 0x73, - 0x74, 0x44, 0x65, 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x45, 0x76, 0x65, 0x6e, - 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x32, 0x2e, 0x6f, 0x35, 0x2e, 0x64, - 0x61, 0x6e, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, - 0x4c, 0x69, 0x73, 0x74, 0x44, 0x65, 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x45, - 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x40, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x29, 0x12, 0x27, 0x2f, 0x64, 0x61, 0x6e, 0x74, 0x65, 0x2f, 0x76, 0x31, - 0x2f, 0x71, 0x2f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2f, 0x7b, 0x6d, 0x65, 0x73, 0x73, - 0x61, 0x67, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0xf2, 0xe8, - 0x81, 0xd9, 0x02, 0x0b, 0x18, 0x01, 0x22, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x1a, - 0x08, 0xaa, 0xb7, 0xf5, 0xe0, 0x01, 0x02, 0x5a, 0x00, 0x42, 0x34, 0x5a, 0x32, 0x67, 0x69, 0x74, - 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x65, 0x6e, 0x74, 0x6f, 0x70, 0x73, 0x2f, - 0x64, 0x61, 0x6e, 0x74, 0x65, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x6f, 0x35, 0x2f, 0x64, 0x61, 0x6e, - 0x74, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x64, 0x61, 0x6e, 0x74, 0x65, 0x5f, 0x73, 0x70, 0x62, 0x62, - 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x73, 0x61, 0x67, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x32, 0x2e, 0x6f, 0x35, 0x2e, 0x64, 0x61, 0x6e, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, + 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x44, 0x65, 0x61, 0x64, + 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x44, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x29, 0x12, 0x27, 0x2f, + 0x64, 0x61, 0x6e, 0x74, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x71, 0x2f, 0x6d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x65, 0x2f, 0x7b, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x2f, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0xf2, 0xe8, 0x81, 0xd9, 0x02, 0x0f, 0x18, 0x01, 0x22, 0x0b, + 0x64, 0x65, 0x61, 0x64, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x1a, 0x08, 0xaa, 0xb7, 0xf5, + 0xe0, 0x01, 0x02, 0x5a, 0x00, 0x42, 0x34, 0x5a, 0x32, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, + 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x65, 0x6e, 0x74, 0x6f, 0x70, 0x73, 0x2f, 0x64, 0x61, 0x6e, 0x74, + 0x65, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x6f, 0x35, 0x2f, 0x64, 0x61, 0x6e, 0x74, 0x65, 0x2f, 0x76, + 0x31, 0x2f, 0x64, 0x61, 0x6e, 0x74, 0x65, 0x5f, 0x73, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x33, } var ( diff --git a/gen/o5/dante/v1/dante_spb/dead_message_query_psm_query.pb.go b/gen/o5/dante/v1/dante_spb/dead_message_query_psm_query.pb.go new file mode 100644 index 0000000..fcc38bd --- /dev/null +++ b/gen/o5/dante/v1/dante_spb/dead_message_query_psm_query.pb.go @@ -0,0 +1,71 @@ +// Code generated by protoc-gen-go-psm. DO NOT EDIT. + +package dante_spb + +import ( + psm "github.com/pentops/protostate/psm" +) + +// State Query Service for %sDeadmessage +// QuerySet is the query set for the Deadmessage service. + +type DeadmessagePSMQuerySet = psm.StateQuerySet[ + *GetDeadMessageRequest, + *GetDeadMessageResponse, + *ListDeadMessagesRequest, + *ListDeadMessagesResponse, + *ListDeadMessageEventsRequest, + *ListDeadMessageEventsResponse, +] + +func NewDeadmessagePSMQuerySet( + smSpec psm.QuerySpec[ + *GetDeadMessageRequest, + *GetDeadMessageResponse, + *ListDeadMessagesRequest, + *ListDeadMessagesResponse, + *ListDeadMessageEventsRequest, + *ListDeadMessageEventsResponse, + ], + options psm.StateQueryOptions, +) (*DeadmessagePSMQuerySet, error) { + return psm.BuildStateQuerySet[ + *GetDeadMessageRequest, + *GetDeadMessageResponse, + *ListDeadMessagesRequest, + *ListDeadMessagesResponse, + *ListDeadMessageEventsRequest, + *ListDeadMessageEventsResponse, + ](smSpec, options) +} + +type DeadmessagePSMQuerySpec = psm.QuerySpec[ + *GetDeadMessageRequest, + *GetDeadMessageResponse, + *ListDeadMessagesRequest, + *ListDeadMessagesResponse, + *ListDeadMessageEventsRequest, + *ListDeadMessageEventsResponse, +] + +func DefaultDeadmessagePSMQuerySpec(tableSpec psm.QueryTableSpec) DeadmessagePSMQuerySpec { + return psm.QuerySpec[ + *GetDeadMessageRequest, + *GetDeadMessageResponse, + *ListDeadMessagesRequest, + *ListDeadMessagesResponse, + *ListDeadMessageEventsRequest, + *ListDeadMessageEventsResponse, + ]{ + QueryTableSpec: tableSpec, + ListRequestFilter: func(req *ListDeadMessagesRequest) (map[string]interface{}, error) { + filter := map[string]interface{}{} + return filter, nil + }, + ListEventsRequestFilter: func(req *ListDeadMessageEventsRequest) (map[string]interface{}, error) { + filter := map[string]interface{}{} + filter["message_id"] = req.MessageId + return filter, nil + }, + } +} diff --git a/go.mod b/go.mod index 827e5ce..035d385 100644 --- a/go.mod +++ b/go.mod @@ -3,29 +3,31 @@ module github.com/pentops/dante go 1.21.5 require ( + buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.34.1-20240508200655-46a4cf4ba109.1 github.com/aws/aws-sdk-go-v2 v1.25.3 github.com/aws/aws-sdk-go-v2/config v1.27.0 github.com/aws/aws-sdk-go-v2/service/sqs v1.30.0 github.com/elgris/sqrl v0.0.0-20210727210741-7e0198b30236 github.com/google/uuid v1.6.0 github.com/lib/pq v1.10.9 - github.com/pentops/flowtest v0.0.0-20240222224419-c36885c5b6f6 - github.com/pentops/jsonapi v0.0.0-20240501170241-5a5f63f07418 + github.com/pentops/flowtest v0.0.0-20240510221023-0114d43723cb + github.com/pentops/go-grpc-helpers v0.0.0-20230815045451-2524ee695ebb github.com/pentops/log.go v0.0.0-20231218074934-67aedcab3fa4 - github.com/pentops/o5-go v0.0.0-20240430213737-0b7c2d1f1971 + github.com/pentops/o5-deploy-aws v0.0.0-20240523004302-deb95651414f + github.com/pentops/o5-go v0.0.0-20240522235906-43476a9e56ca github.com/pentops/pgtest.go v0.0.0-20231220005207-f01c870bad2e - github.com/pentops/protostate v0.0.0-20240507224927-061bebbb51da + github.com/pentops/protostate v0.0.0-20240522235950-fe9b5da179f8 github.com/pentops/sqrlx.go v0.0.0-20240108202916-8687fdf983c0 github.com/pressly/goose v2.7.0+incompatible golang.org/x/sync v0.7.0 + google.golang.org/genproto/googleapis/api v0.0.0-20240509183442-62759503f434 google.golang.org/grpc v1.63.2 - google.golang.org/protobuf v1.33.0 + google.golang.org/protobuf v1.34.1 gopkg.daemonl.com/envconf v0.0.0-20220909014755-d65ec77bd452 gopkg.daemonl.com/log v0.0.13 ) require ( - buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.33.0-20240401165935-b983156c5e99.1 // indirect github.com/antlr4-go/antlr/v4 v4.13.0 // indirect github.com/aws/aws-sdk-go-v2/credentials v1.17.0 // indirect github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.15.0 // indirect @@ -38,22 +40,22 @@ require ( github.com/aws/aws-sdk-go-v2/service/ssooidc v1.22.0 // indirect github.com/aws/aws-sdk-go-v2/service/sts v1.27.0 // indirect github.com/aws/smithy-go v1.20.1 // indirect - github.com/bufbuild/protocompile v0.8.0 // indirect - github.com/bufbuild/protovalidate-go v0.6.1 // indirect - github.com/fatih/color v1.15.0 // indirect + github.com/bufbuild/protocompile v0.13.0 // indirect + github.com/bufbuild/protovalidate-go v0.6.2 // indirect + github.com/fatih/color v1.16.0 // indirect github.com/golang/protobuf v1.5.4 // indirect github.com/google/cel-go v0.20.1 // indirect github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 // indirect - github.com/jhump/protoreflect v1.15.5 // indirect + github.com/jhump/protoreflect v1.16.0 // indirect github.com/mattn/go-colorable v0.1.13 // indirect - github.com/mattn/go-isatty v0.0.17 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect + github.com/pentops/jsonapi v0.0.0-20240523004818-24c4981f04da // indirect github.com/pentops/outbox.pg.go v0.0.0-20231222014950-493c01cfbcc7 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/stoewer/go-strcase v1.3.0 // indirect - golang.org/x/exp v0.0.0-20240409090435-93d18d7e34b8 // indirect - golang.org/x/net v0.24.0 // indirect - golang.org/x/sys v0.19.0 // indirect - golang.org/x/text v0.14.0 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20240401170217-c3f982113cda // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda // indirect + golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 // indirect + golang.org/x/net v0.25.0 // indirect + golang.org/x/sys v0.20.0 // indirect + golang.org/x/text v0.15.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240509183442-62759503f434 // indirect ) diff --git a/go.sum b/go.sum index e5f7827..1c37977 100644 --- a/go.sum +++ b/go.sum @@ -1,5 +1,5 @@ -buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.33.0-20240401165935-b983156c5e99.1 h1:2IGhRovxlsOIQgx2ekZWo4wTPAYpck41+18ICxs37is= -buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.33.0-20240401165935-b983156c5e99.1/go.mod h1:Tgn5bgL220vkFOI0KPStlcClPeOJzAv4uT+V8JXGUnw= +buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.34.1-20240508200655-46a4cf4ba109.1 h1:LEXWFH/xZ5oOWrC3oOtHbUyBdzRWMCPpAQmKC9v05mA= +buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.34.1-20240508200655-46a4cf4ba109.1/go.mod h1:XF+P8+RmfdufmIYpGUC+6bF7S+IlmHDEnCrO3OXaUAQ= cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/DATA-DOG/go-sqlmock v1.5.0 h1:Shsta01QNfFxHCfpW6YH2STWB0MudeXXEWMr20OEh60= @@ -35,10 +35,10 @@ github.com/aws/aws-sdk-go-v2/service/sts v1.27.0/go.mod h1:nXfOBMWPokIbOY+Gi7a1p github.com/aws/smithy-go v1.20.1 h1:4SZlSlMr36UEqC7XOyRVb27XMeZubNcBNN+9IgEPIQw= github.com/aws/smithy-go v1.20.1/go.mod h1:krry+ya/rV9RDcV/Q16kpu6ypI4K2czasz0NC3qS14E= github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= -github.com/bufbuild/protocompile v0.8.0 h1:9Kp1q6OkS9L4nM3FYbr8vlJnEwtbpDPQlQOVXfR+78s= -github.com/bufbuild/protocompile v0.8.0/go.mod h1:+Etjg4guZoAqzVk2czwEQP12yaxLJ8DxuqCJ9qHdH94= -github.com/bufbuild/protovalidate-go v0.6.1 h1:uzW8r0CDvqApUChNj87VzZVoQSKhcVdw5UWOE605UIw= -github.com/bufbuild/protovalidate-go v0.6.1/go.mod h1:4BR3rKEJiUiTy+sqsusFn2ladOf0kYmA2Reo6BHSBgQ= +github.com/bufbuild/protocompile v0.13.0 h1:6cwUB0Y2tSvmNxsbunwzmIto3xOlJOV7ALALuVOs92M= +github.com/bufbuild/protocompile v0.13.0/go.mod h1:dr++fGGeMPWHv7jPeT06ZKukm45NJscd7rUxQVzEKRk= +github.com/bufbuild/protovalidate-go v0.6.2 h1:U/V3CGF0kPlR12v41rjO4DrYZtLcS4ZONLmWN+rJVCQ= +github.com/bufbuild/protovalidate-go v0.6.2/go.mod h1:4BR3rKEJiUiTy+sqsusFn2ladOf0kYmA2Reo6BHSBgQ= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= @@ -53,8 +53,8 @@ github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1m github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/envoyproxy/protoc-gen-validate v1.0.4 h1:gVPz/FMfvh57HdSJQyvBtF00j8JU4zdyUgIUNhlgg0A= github.com/envoyproxy/protoc-gen-validate v1.0.4/go.mod h1:qys6tmnRsYrQqIhm2bvKZH4Blx/1gTIZ2UKVY1M+Yew= -github.com/fatih/color v1.15.0 h1:kOqh6YHBtK8aywxGerMG2Eq3H6Qgoqeo13Bk2Mv/nBs= -github.com/fatih/color v1.15.0/go.mod h1:0h5ZqXfHYED7Bhv2ZJamyIOUej9KtShiJESRwBDUSsw= +github.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM= +github.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE= github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= @@ -77,8 +77,8 @@ github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 h1:UH//fgunKIs4JdUbpDl1VZCDaL56wXCB/5+wF6uHfaI= github.com/grpc-ecosystem/go-grpc-middleware v1.4.0/go.mod h1:g5qyo/la0ALbONm6Vbp88Yd8NsDy6rZz+RcrMPxvld8= -github.com/jhump/protoreflect v1.15.5 h1:Y9eEjV3vwdX57VV3uuxtknBRxA2vQ3LOifKOOC2n5ec= -github.com/jhump/protoreflect v1.15.5/go.mod h1:jCHoyYQIJnaabEYnbGwyo9hUqfyUMTbJw/tAut5t97E= +github.com/jhump/protoreflect v1.16.0 h1:54fZg+49widqXYQ0b+usAFHbMkBGR4PpXrsHc8+TBDg= +github.com/jhump/protoreflect v1.16.0/go.mod h1:oYPd7nPvcBw/5wlDfm/AVmU9zH9BgqGCI469pGxfj/8= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= @@ -90,23 +90,27 @@ github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng= -github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/pentops/flowtest v0.0.0-20240222224419-c36885c5b6f6 h1:ExaDyZX83CIoo4XiPJkRRYHriF/FdYZG4nmxp8QmjgY= -github.com/pentops/flowtest v0.0.0-20240222224419-c36885c5b6f6/go.mod h1:FNquTq/mafLEDD+w/yiiQKIuAuQycFD9zhZ+pbAivc0= -github.com/pentops/jsonapi v0.0.0-20240501170241-5a5f63f07418 h1:2Zt3IBp4cT5Jp0k2mGHicK0C/DAQ9Gc83HaWtVveFFY= -github.com/pentops/jsonapi v0.0.0-20240501170241-5a5f63f07418/go.mod h1:0BEiIktK5SxBa6IjaJBn7RmhDnuDEK+w4AB5jqL7l9A= +github.com/pentops/flowtest v0.0.0-20240510221023-0114d43723cb h1:moW5Y1EMe1WpDzrNXY9Nw9to9JXmWqqP4moHuOaMBG8= +github.com/pentops/flowtest v0.0.0-20240510221023-0114d43723cb/go.mod h1:L6WwU74mYu5XB33w+fH3dVCqUMb+JpOxCQZf4HJtUxw= +github.com/pentops/go-grpc-helpers v0.0.0-20230815045451-2524ee695ebb h1:wuswjiI9CzLUGmLXCjwyXDNCFim4iz1IU0GmTmEerMQ= +github.com/pentops/go-grpc-helpers v0.0.0-20230815045451-2524ee695ebb/go.mod h1:F3N1VgUmEky7it5iOBkyBbyuXu9Mqb9mfhFGR8FhZVQ= +github.com/pentops/jsonapi v0.0.0-20240523004818-24c4981f04da h1:XYQV9EIlSOxOUAbEPGRHYH77nZWTI1jrUtkBVDcECxs= +github.com/pentops/jsonapi v0.0.0-20240523004818-24c4981f04da/go.mod h1:JOfo4xYH7Fo1kS6ysWJM6t/S9Dz/hcsqY3Slk8UK3/A= github.com/pentops/log.go v0.0.0-20231218074934-67aedcab3fa4 h1:7kPDmBAQxMxcFIYt1rEco/AipZmm1CUoND3wSDmIOeI= github.com/pentops/log.go v0.0.0-20231218074934-67aedcab3fa4/go.mod h1:UXhrs+VZ6cWZ7b/v8AtuvBZc5nwS5WFHP94JoFrZQA8= -github.com/pentops/o5-go v0.0.0-20240430213737-0b7c2d1f1971 h1:0ppEB9IKD9w+m0Lf3sxFDB1rKUbsfz0I0qx+cA7p7oQ= -github.com/pentops/o5-go v0.0.0-20240430213737-0b7c2d1f1971/go.mod h1:6p4zfvR4nHucw9y4PxPV3NFmteoQrvkk0xHL9mSepmU= +github.com/pentops/o5-deploy-aws v0.0.0-20240523004302-deb95651414f h1:DwushqLC+8A7C4akhPfuAr0Hd6bn2PQ4vqfuvDyc+kE= +github.com/pentops/o5-deploy-aws v0.0.0-20240523004302-deb95651414f/go.mod h1:JIf9+QbRYXKv8bTa9mlD2cnvLhC0HAaSC9wysM1fYK8= +github.com/pentops/o5-go v0.0.0-20240522235906-43476a9e56ca h1:8ywqfXlun7quQT7mWeTAEJd5jhPbCz6w+4ofnuV68YQ= +github.com/pentops/o5-go v0.0.0-20240522235906-43476a9e56ca/go.mod h1:6p4zfvR4nHucw9y4PxPV3NFmteoQrvkk0xHL9mSepmU= github.com/pentops/outbox.pg.go v0.0.0-20231222014950-493c01cfbcc7 h1:rBLoeUeI1acxd6GbJjJbK6CeVF/q/Xab+xqQYePvNSw= github.com/pentops/outbox.pg.go v0.0.0-20231222014950-493c01cfbcc7/go.mod h1:yMefMPLP0eBAxdELkAgjTtnhWFfc0Wk2H2kePByDHRo= github.com/pentops/pgtest.go v0.0.0-20231220005207-f01c870bad2e h1:yvHE4gTqT6dvaPiOqvs/uiybF3NdK+4yEn4eKAEOXDg= github.com/pentops/pgtest.go v0.0.0-20231220005207-f01c870bad2e/go.mod h1:BgX0+UvohWaq7Vr3McsBWt8FpzerKaNRsmG2uH7L1FE= -github.com/pentops/protostate v0.0.0-20240507224927-061bebbb51da h1:+54yw0uEEEHPKBQ4rEYXSOFNWumPCcOoSA1cdhZMDdM= -github.com/pentops/protostate v0.0.0-20240507224927-061bebbb51da/go.mod h1:OR/JNZv/KtAIgBDJ6e5tSeK7iAUMXhXlMZzj2tvvi4I= +github.com/pentops/protostate v0.0.0-20240522235950-fe9b5da179f8 h1:xfMXFL9riwnMz8QHL885TryO1Ktm1u/pv589JUAU1mM= +github.com/pentops/protostate v0.0.0-20240522235950-fe9b5da179f8/go.mod h1:KM2wgvz8/H4HZSet2al4+rDa0Oyfv3Lb4avhREmWkVA= github.com/pentops/sqrlx.go v0.0.0-20240108202916-8687fdf983c0 h1:JQrYHxaxEYwjdFjqOr3TnS5fxBr4l3Nw6Wgvr/hVl+Y= github.com/pentops/sqrlx.go v0.0.0-20240108202916-8687fdf983c0/go.mod h1:Zfb/6O+9jxKfO8ujfNbArrCAO9MbFKYiczAewnMozbs= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= @@ -143,8 +147,8 @@ golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACk golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20240409090435-93d18d7e34b8 h1:ESSUROHIBHg7USnszlcdmjBEwdMj9VUvU+OPk4yl2mc= -golang.org/x/exp v0.0.0-20240409090435-93d18d7e34b8/go.mod h1:/lliqkxwWAhPjf5oSOIJup2XcqJaw8RGS6k3TGEc7GI= +golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 h1:vr/HnozRka3pE4EsMEg1lgkXJkTFJCVUX+S/ZT6wYzM= +golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842/go.mod h1:XtvwrStGgqGPLc4cjQfWqZHG1YFdYs6swckp8vpsjnc= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= @@ -159,8 +163,8 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.24.0 h1:1PcaxkF854Fu3+lvBIx5SYn9wRlBzzcnHZSiaFFAb0w= -golang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8= +golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= +golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -176,12 +180,13 @@ golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.19.0 h1:q5f1RH2jigJ1MoAWp2KTp3gm5zAGFUTarQZ5U386+4o= -golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= +golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= -golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= +golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= @@ -200,10 +205,10 @@ google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7 google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto/googleapis/api v0.0.0-20240401170217-c3f982113cda h1:b6F6WIV4xHHD0FA4oIyzU6mHWg2WI2X1RBehwa5QN38= -google.golang.org/genproto/googleapis/api v0.0.0-20240401170217-c3f982113cda/go.mod h1:AHcE/gZH76Bk/ROZhQphlRoWo5xKDEtz3eVEO1LfA8c= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda h1:LI5DOvAxUPMv/50agcLLoo+AdWc1irS9Rzz4vPuD1V4= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240401170217-c3f982113cda/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY= +google.golang.org/genproto/googleapis/api v0.0.0-20240509183442-62759503f434 h1:OpXbo8JnN8+jZGPrL4SSfaDjSCjupr8lXyBAbexEm/U= +google.golang.org/genproto/googleapis/api v0.0.0-20240509183442-62759503f434/go.mod h1:FfiGhwUm6CJviekPrc0oJ+7h29e+DmWU6UtjX0ZvI7Y= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240509183442-62759503f434 h1:umK/Ey0QEzurTNlsV3R+MfxHAb78HCEX/IkuR+zH4WQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240509183442-62759503f434/go.mod h1:I7Y+G38R2bu5j1aLzfFmQfTcU/WnFuqDwLZAbvKTKpM= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= @@ -212,8 +217,8 @@ google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3Iji google.golang.org/grpc v1.63.2 h1:MUeiw1B2maTVZthpU5xvASfTh3LDbxHd6IJ6QQVU+xM= google.golang.org/grpc v1.63.2/go.mod h1:WAX/8DgncnokcFUldAxq7GeB5DXHDbMF+lLvDomNkRA= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= -google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= +google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.daemonl.com/envconf v0.0.0-20220909014755-d65ec77bd452 h1:o3GxEB2X2+IpUsC70ld3vWv68UVARMC/ygUPQ5MFD+k= gopkg.daemonl.com/envconf v0.0.0-20220909014755-d65ec77bd452/go.mod h1:bVXSKkePHHubtEgvoVrjuRAQOeie9ITEFm0moC/gpc0= gopkg.daemonl.com/log v0.0.13 h1:y15F+/WF/XojS1iS2ky9f1KcU5dC4DBIuUcEn458jPY= diff --git a/integration/dead_test.go b/integration/dead_test.go index 92edebe..95718d3 100644 --- a/integration/dead_test.go +++ b/integration/dead_test.go @@ -5,11 +5,11 @@ import ( "testing" "github.com/google/uuid" + "github.com/pentops/dante/gen/o5/dante/v1/dante_pb" + "github.com/pentops/dante/gen/o5/dante/v1/dante_spb" + "github.com/pentops/dante/gen/o5/dante/v1/dante_tpb" "github.com/pentops/flowtest" - "github.com/pentops/jsonapi/prototest" - "github.com/pentops/o5-go/dante/v1/dante_pb" - "github.com/pentops/o5-go/dante/v1/dante_spb" - "github.com/pentops/o5-go/dante/v1/dante_tpb" + "github.com/pentops/flowtest/prototest" "github.com/pentops/protostate/gen/list/v1/psml_pb" "google.golang.org/protobuf/encoding/protojson" "google.golang.org/protobuf/proto" @@ -123,8 +123,9 @@ func TestUpdate(tt *testing.T) { CreatedAt: timestamppb.Now(), } req := &dante_spb.UpdateDeadMessageRequest{ - MessageId: msg.MessageId, - Message: &newVersion, + MessageId: msg.MessageId, + ReplacesVersionId: msg.MessageId, + Message: &newVersion, } resp, err := uu.DeadMessageCommand.UpdateDeadMessage(ctx, req) @@ -149,7 +150,7 @@ func TestUpdate(tt *testing.T) { } m := res.Message - t.Equal(msg.MessageId, m.MessageId) + t.Equal(msg.MessageId, m.Keys.MessageId) t.Equal(m.Status, dante_pb.MessageStatus_MESSAGE_STATUS_UPDATED) if len(res.Events) != 2 { @@ -260,7 +261,7 @@ func TestShelve(tt *testing.T) { } m := res.Message - t.Equal(msg.MessageId, m.MessageId) + t.Equal(msg.MessageId, m.Keys.MessageId) t.Equal(m.Status, dante_pb.MessageStatus_MESSAGE_STATUS_REJECTED) if len(res.Events) != 2 { @@ -385,7 +386,7 @@ func TestFieldPath(tt *testing.T) { req := &dante_spb.ListDeadMessagesRequest{ Query: &psml_pb.QueryRequest{ Sorts: []*psml_pb.Sort{ - {Field: "currentSpec.createdAt"}, + {Field: "data.currentSpec.createdAt"}, }, }, } @@ -411,14 +412,14 @@ func TestFieldPath(tt *testing.T) { m := resp.Message - t.Equal(msg.MessageId, m.MessageId) + t.Equal(msg.MessageId, m.Keys.MessageId) t.Equal(m.Status, dante_pb.MessageStatus_CREATED) - if m.CurrentSpec == nil { + if m.Data.CurrentSpec == nil { t.Fatal("CurrentSpec is nil") } - c := m.CurrentSpec + c := m.Data.CurrentSpec t.Equal(msg.InfraMessageId, c.InfraMessageId) t.Equal(msg.QueueName, c.QueueName) diff --git a/integration/universe.go b/integration/universe.go index ee83366..2a6641c 100644 --- a/integration/universe.go +++ b/integration/universe.go @@ -6,11 +6,11 @@ import ( "github.com/aws/aws-sdk-go-v2/service/sqs" "github.com/pentops/dante/dynamictype" + "github.com/pentops/dante/gen/o5/dante/v1/dante_spb" + "github.com/pentops/dante/gen/o5/dante/v1/dante_tpb" "github.com/pentops/dante/service" "github.com/pentops/flowtest" "github.com/pentops/log.go/log" - "github.com/pentops/o5-go/dante/v1/dante_spb" - "github.com/pentops/o5-go/dante/v1/dante_tpb" "github.com/pentops/pgtest.go/pgtest" ) @@ -51,11 +51,22 @@ func (uu *Universe) RunSteps(t *testing.T) { log.DefaultLogger = log.NewCallbackLogger(uu.Stepper.Log) - grpcPair := flowtest.NewGRPCPair(t) - topicPair := flowtest.NewGRPCPair(t) + grpcPair := flowtest.NewGRPCPair(t, service.GRPCMiddleware()...) + topicPair := flowtest.NewGRPCPair(t, service.GRPCMiddleware()...) + + q, err := service.NewDeadmessagePSM() + if err != nil { + t.Fatal(err) + } types := dynamictype.NewTypeRegistry() - service, err := service.NewDeadletterServiceService(conn, types, &uu.FakeSqs, "") + + worker, err := service.NewDeadLetterWorker(conn, types, q, "") + if err != nil { + t.Fatal(err) + } + + service, err := service.NewDeadletterServiceService(conn, q, &uu.FakeSqs) if err != nil { t.Fatal(err) } @@ -66,7 +77,7 @@ func (uu *Universe) RunSteps(t *testing.T) { dante_spb.RegisterDeadMessageCommandServiceServer(grpcPair.Server, service) uu.DeadMessageCommand = dante_spb.NewDeadMessageCommandServiceClient(grpcPair.Client) - dante_tpb.RegisterDeadMessageTopicServer(topicPair.Server, service) + dante_tpb.RegisterDeadMessageTopicServer(topicPair.Server, worker) uu.DeadMessageWorker = dante_tpb.NewDeadMessageTopicClient(topicPair.Client) grpcPair.ServeUntilDone(t, ctx) diff --git a/proto/buf.lock b/proto/buf.lock index 7223bee..97133cf 100644 --- a/proto/buf.lock +++ b/proto/buf.lock @@ -4,30 +4,30 @@ deps: - remote: buf.build owner: bufbuild repository: protovalidate - commit: b983156c5e994cc9892e0ce3e64e17e0 - digest: shake256:fb47a62989d38c2529bcc5cd86ded43d800eb84cee82b42b9e8a9e815d4ee8134a0fb9d0ce8299b27c2d2bbb7d6ade0c4ad5a8a4d467e1e2c7ca619ae9f634e2 + commit: 46a4cf4ba1094a34bcd89a6c67163b4b + digest: shake256:436ce453801917c11bc7b21d66bcfae87da2aceb804a041487be1e51dc9fbc219e61ea6a552db7a7aa6d63bb5efd0f3ed5fe3d4c42d4f750d0eb35f14144e3b6 - remote: buf.build owner: googleapis repository: googleapis - commit: 1f6ed065c9f04b5cb843d6e7603d6454 - digest: shake256:7149cf5e9955c692d381e557830555d4e93f205a0f1b8e2dfdae46d029369aa3fc1980e35df0d310f7cc3b622f93e19ad276769a283a967dd3065ddfd3a40e13 + commit: 4383c33e6c714f8bb30a26a6d838e217 + digest: shake256:de26a277fc28b8b411ecf58729d78d32fcf15090ffd998a4469225b17889bfb51442eaab04bb7a8d88d203ecdf0a9febd4ffd52c18ed1c2229160c7bd353ca95 - remote: buf.build owner: pentops repository: j5 - commit: 0aad3f18b7b048f39a026e8130703885 - digest: shake256:42207ccae61f211f55547d5c1dc231b01d048b15b86a87b7873bdf061bf6a3483b617e1de241becb064552cab0231713ffbbbe4c23c0b2ae6b00b83792c971ba + commit: 8e5d046024af4b44983c49c3e7b5d7ef + digest: shake256:80f7c2df04eca9a2439694bed66d9791a8f7b3aedcba70976591735c746813158ee9753ba7c060dcca2006ea81cae0616f2d919184b63bf19472973b6c87522d - remote: buf.build owner: pentops repository: listify - commit: f8340e85a19c464ca909db89a45b9b57 - digest: shake256:fe3921bb77acb2e244d32a3f3c4c423ab02f92cacf9b914edce78aecd89d52446adb9e1d62bd4a80d49bbfe517a8b6f0382aaa15ede9dd7f55329a45fd16a187 + commit: 88fbd382a3e34ecfb80f8e35c19126c3 + digest: shake256:832cd76e75747f5a073a97d50f6562fe2fd7e96f5fbd4950b5291d623da486409aabf2a09e06c1d26df1692f0301b40b880cbf800dd7ba7f794c764bd53aa15d - remote: buf.build owner: pentops repository: o5 - commit: a72643543e9546c69752ce2b28846d58 - digest: shake256:5d3bf69822e61e359c3d179fc9b4923689fd8584ef6a834d7dd6347edcbf0f8474adb93ce7f26f559902066fc562b49c6de64de33557a42a9a4a1fc62ad9280f + commit: e3c2a17d45d0438dbb88bfb110311aae + digest: shake256:d822e3a6b4d4905d288918061e4506fdffca0200ca98d5ccf20b9ef26b57b4541f4328a61799a82af8e6381beec5e684b8e9db30b7d0dec2817be9d8f24df875 - remote: buf.build owner: pentops repository: protostate - commit: 52cbcf611b054d64b66a9856d25084d1 - digest: shake256:dac4ae74c396975b0f8af30aa91e43cd4bb79e4750e12d08b42a42286081c6dbe2c350c63a0067a997dee57db115eeccdd342851f6472c27fdb1e0bf79f69f93 + commit: 39c4be3b54e241e19c56d63e51d98881 + digest: shake256:4c07d77a22d09cff1fc094170d7fc5934c6792e48a2b72f17cff3ff1d95b27dbc1ce82d001cc2664e234b20fb54926e0a472af4fc9d245308754a551b5309d3d diff --git a/proto/o5/dante/v1/dead_message.proto b/proto/o5/dante/v1/dead_message.proto index 80e050c..bcc0692 100644 --- a/proto/o5/dante/v1/dead_message.proto +++ b/proto/o5/dante/v1/dead_message.proto @@ -8,18 +8,32 @@ import "google/protobuf/timestamp.proto"; import "o5/auth/v1/actor.proto"; import "psm/list/v1/annotations.proto"; import "psm/state/v1/annotations.proto"; +import "psm/state/v1/metadata.proto"; option go_package = "github.com/pentops/dante/gen/o5/dante/v1/dante_pb"; +message DeadMessageKeys { + option (psm.state.v1.psm).name = "deadmessage"; + string message_id = 1 [ + (psm.state.v1.field).primary_key = true, + (buf.validate.field).string.uuid = true + ]; +} + message DeadMessageState { - option (psm.state.v1.state).name = "deadmessage"; - string message_id = 1 [(buf.validate.field).string.uuid = true]; + psm.state.v1.StateMetadata metadata = 1 [(buf.validate.field).required = true]; - MessageStatus status = 2 [(psm.list.v1.field).enum.filtering = { + DeadMessageKeys keys = 2 [(buf.validate.field).required = true]; + + MessageStatus status = 3 [(psm.list.v1.field).enum.filtering = { filterable: true, default_filters: ["MESSAGE_STATUS_CREATED"] }]; + DeadMessageData data = 4; +} + +message DeadMessageData { DeadMessageSpec current_spec = 3; } @@ -100,21 +114,11 @@ message Any { } message DeadMessageEvent { - option (psm.state.v1.event).name = "deadmessage"; - Metadata metadata = 1 [ - (buf.validate.field).required = true, - (psm.state.v1.event_field).metadata = true - ]; + psm.state.v1.EventMetadata metadata = 1 [(buf.validate.field).required = true]; - string message_id = 2 [ - (buf.validate.field).string.uuid = true, - (psm.state.v1.event_field).state_key = true - ]; + DeadMessageKeys keys = 2 [(buf.validate.field).required = true]; - DeadMessageEventType event = 3 [ - (psm.state.v1.event_field).event_type = true, - (buf.validate.field).required = true - ]; + DeadMessageEventType event = 3 [(buf.validate.field).required = true]; } message DeadMessageEventType { diff --git a/proto/o5/dante/v1/service/dead_message_query.proto b/proto/o5/dante/v1/service/dead_message_query.proto index 00bafbe..219d31f 100644 --- a/proto/o5/dante/v1/service/dead_message_query.proto +++ b/proto/o5/dante/v1/service/dead_message_query.proto @@ -1,15 +1,15 @@ syntax = "proto3"; +package o5.dante.v1.service; + import "buf/validate/validate.proto"; import "google/api/annotations.proto"; -import "o5/dante/v1/dead_message.proto"; import "o5/auth/v1/annotations.proto"; +import "o5/dante/v1/dead_message.proto"; import "psm/list/v1/page.proto"; import "psm/list/v1/query.proto"; import "psm/state/v1/annotations.proto"; -package o5.dante.v1.service; - option go_package = "github.com/pentops/dante/gen/o5/dante/v1/dante_spb"; service DeadMessageQueryService { @@ -17,28 +17,25 @@ service DeadMessageQueryService { rpc GetDeadMessage(GetDeadMessageRequest) returns (GetDeadMessageResponse) { option (google.api.http) = {get: "/dante/v1/q/message/{message_id}"}; option (psm.state.v1.state_query_method).get = true; - option (psm.state.v1.state_query_method).name = "message"; + option (psm.state.v1.state_query_method).name = "deadmessage"; } rpc ListDeadMessages(ListDeadMessagesRequest) returns (ListDeadMessagesResponse) { option (google.api.http) = {get: "/dante/v1/q/messages"}; option (psm.state.v1.state_query_method).list = true; - option (psm.state.v1.state_query_method).name = "message"; + option (psm.state.v1.state_query_method).name = "deadmessage"; } rpc ListDeadMessageEvents(ListDeadMessageEventsRequest) returns (ListDeadMessageEventsResponse) { option (google.api.http) = {get: "/dante/v1/q/message/{message_id}/events"}; option (psm.state.v1.state_query_method).list_events = true; - option (psm.state.v1.state_query_method).name = "message"; + option (psm.state.v1.state_query_method).name = "deadmessage"; } } message GetDeadMessageRequest { // when not set, returns the next unhandled message - optional string message_id = 1 [ - (buf.validate.field).string.uuid = true - ]; - + optional string message_id = 1 [(buf.validate.field).string.uuid = true]; } message GetDeadMessageResponse { @@ -58,9 +55,7 @@ message ListDeadMessagesResponse { } message ListDeadMessageEventsRequest { - string message_id = 1 [ - (buf.validate.field).string.uuid = true - ]; + string message_id = 1 [(buf.validate.field).string.uuid = true]; psm.list.v1.PageRequest page = 100; psm.list.v1.QueryRequest query = 101; diff --git a/service/grpc.go b/service/grpc.go new file mode 100644 index 0000000..42c89d4 --- /dev/null +++ b/service/grpc.go @@ -0,0 +1,73 @@ +package service + +import ( + "context" + + "github.com/pentops/go-grpc-helpers/grpcerror" + "github.com/pentops/go-grpc-helpers/protovalidatemw" + "github.com/pentops/log.go/grpc_log" + "github.com/pentops/log.go/log" + "github.com/pentops/o5-go/auth/v1/auth_pb" + "github.com/pentops/protostate/gen/state/v1/psm_pb" + "google.golang.org/grpc" +) + +func GRPCMiddleware() []grpc.UnaryServerInterceptor { + return []grpc.UnaryServerInterceptor{ + grpc_log.UnaryServerInterceptor(log.DefaultContext, log.DefaultTrace, log.DefaultLogger), + grpcerror.UnaryServerInterceptor(log.DefaultLogger), + protovalidatemw.UnaryServerInterceptor(), + PSMActionMiddleware(actorExtractor), + } +} + +func actorExtractor(ctx context.Context) *auth_pb.Actor { + return &auth_pb.Actor{ + Type: &auth_pb.Actor_Named{ + Named: &auth_pb.Actor_NamedActor{ + Name: "Unauthenticated Client", + }, + }, + } +} + +type actionContextKey struct{} + +type PSMAction struct { + Method string + Actor *auth_pb.Actor +} + +// PSMCause is a gRPC middleware that injects the PSM cause into t he context. +func PSMActionMiddleware(actorExtractor func(context.Context) *auth_pb.Actor) grpc.UnaryServerInterceptor { + return func(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (interface{}, error) { + actor := actorExtractor(ctx) + cause := PSMAction{ + Method: info.FullMethod, + Actor: actor, + } + ctx = context.WithValue(ctx, actionContextKey{}, cause) + return handler(ctx, req) + } +} + +func WithPSMAction(ctx context.Context, action PSMAction) context.Context { + return context.WithValue(ctx, actionContextKey{}, action) +} + +func CommandCause(ctx context.Context) *psm_pb.Cause { + + cause, ok := ctx.Value(actionContextKey{}).(PSMAction) + if !ok { + return nil + } + + return &psm_pb.Cause{ + Type: &psm_pb.Cause_Command{ + Command: &psm_pb.CommandCause{ + MethodName: cause.Method, + Actor: cause.Actor, + }, + }, + } +} diff --git a/service/main.go b/service/main.go index 5c51231..7865fee 100644 --- a/service/main.go +++ b/service/main.go @@ -1,12 +1,10 @@ package service import ( - "bytes" "context" "database/sql" - "encoding/json" "fmt" - "net/http" + "time" "github.com/aws/aws-sdk-go-v2/aws" "github.com/aws/aws-sdk-go-v2/service/sqs" @@ -14,17 +12,12 @@ import ( sq "github.com/elgris/sqrl" "github.com/google/uuid" _ "github.com/lib/pq" - "github.com/pentops/dante/dynamictype" - "github.com/pentops/o5-go/dante/v1/dante_pb" - "github.com/pentops/o5-go/dante/v1/dante_spb" - "github.com/pentops/o5-go/dante/v1/dante_tpb" + "github.com/pentops/dante/gen/o5/dante/v1/dante_pb" + "github.com/pentops/dante/gen/o5/dante/v1/dante_spb" "github.com/pentops/protostate/psm" - "github.com/pentops/o5-go/auth/v1/auth_pb" "github.com/pentops/sqrlx.go/sqrlx" "google.golang.org/protobuf/proto" - "google.golang.org/protobuf/types/known/emptypb" - "google.golang.org/protobuf/types/known/timestamppb" "gopkg.daemonl.com/log" ) @@ -39,85 +32,88 @@ type SqsSender interface { type DeadletterService struct { db *sqrlx.Wrapper - protojson ProtoJSON sqsClient SqsSender - slackUrl string sm *dante_pb.DeadmessagePSM messageQuerySet dante_spb.MessagePSMQuerySet - dante_tpb.UnimplementedDeadMessageTopicServer dante_spb.UnimplementedDeadMessageQueryServiceServer dante_spb.UnimplementedDeadMessageCommandServiceServer } +func NewDeadletterServiceService(conn sqrlx.Connection, statemachine *dante_pb.DeadmessagePSM, sqsClient SqsSender) (*DeadletterService, error) { + db, err := sqrlx.New(conn, sq.Dollar) + if err != nil { + return nil, err + } + + b := dante_spb.DefaultMessagePSMQuerySpec(statemachine.StateTableSpec()) + + qset, err := dante_spb.NewMessagePSMQuerySet(b, psm.StateQueryOptions{}) + if err != nil { + return nil, fmt.Errorf("couldn't make new PSM query set: %w", err) + } + + return &DeadletterService{ + db: db, + sqsClient: sqsClient, + messageQuerySet: *qset, + sm: statemachine, + }, nil + +} + func (ds *DeadletterService) UpdateDeadMessage(ctx context.Context, req *dante_spb.UpdateDeadMessageRequest) (*dante_spb.UpdateDeadMessageResponse, error) { res := &dante_spb.UpdateDeadMessageResponse{} - if err := ds.db.Transact(ctx, &sqrlx.TxOptions{ - Isolation: sql.LevelReadCommitted, - ReadOnly: false, - Retryable: true, - }, func(ctx context.Context, tx sqrlx.Transaction) error { - event := dante_pb.DeadMessageEvent{ - Metadata: &dante_pb.Metadata{ - EventId: uuid.NewString(), - Timestamp: timestamppb.Now(), - Actor: &auth_pb.Actor{}, - }, + event := &dante_pb.DeadmessagePSMEventSpec{ + Cause: CommandCause(ctx), + EventID: uuid.NewString(), + Timestamp: time.Now(), + Keys: &dante_pb.DeadMessageKeys{ MessageId: req.MessageId, - Event: &dante_pb.DeadMessageEventType{ - Type: &dante_pb.DeadMessageEventType_Updated_{ - Updated: &dante_pb.DeadMessageEventType_Updated{ - Spec: req.Message, - }, - }, - }, - } - - newState, err := ds.sm.TransitionInTx(ctx, tx, &event) - if err != nil { - log.Infof(ctx, "update PSM error: %v", err.Error()) - return err - } - res.Message = newState + }, + Event: &dante_pb.DeadMessageEventType_Updated{ + Spec: req.Message, + }, + } - return nil - }); err != nil { - log.WithError(ctx, err).Error("Couldn't save dead letter change to database") + newState, err := ds.sm.Transition(ctx, ds.db, event) + if err != nil { + log.Infof(ctx, "update PSM error: %v", err.Error()) return nil, err } + res.Message = newState return res, nil } func (ds *DeadletterService) ReplayDeadMessage(ctx context.Context, req *dante_spb.ReplayDeadMessageRequest) (*dante_spb.ReplayDeadMessageResponse, error) { res := dante_spb.ReplayDeadMessageResponse{} - + event := &dante_pb.DeadmessagePSMEventSpec{ + Cause: CommandCause(ctx), + Keys: &dante_pb.DeadMessageKeys{ + MessageId: req.MessageId, + }, + EventID: uuid.NewString(), + Timestamp: time.Now(), + Event: &dante_pb.DeadMessageEventType_Replayed{}, + } if err := ds.db.Transact(ctx, &sqrlx.TxOptions{ Isolation: sql.LevelReadCommitted, ReadOnly: false, Retryable: true, }, func(ctx context.Context, tx sqrlx.Transaction) error { - event := dante_pb.DeadMessageEvent{ - Metadata: &dante_pb.Metadata{ - EventId: uuid.NewString(), - Timestamp: timestamppb.Now(), - Actor: &auth_pb.Actor{}, - }, - MessageId: req.MessageId, - Event: &dante_pb.DeadMessageEventType{ - Type: &dante_pb.DeadMessageEventType_Replayed_{ - Replayed: &dante_pb.DeadMessageEventType_Replayed{}, - }, - }, - } - s, err := ds.sm.TransitionInTx(ctx, tx, &event) + + newState, err := ds.sm.TransitionInTx(ctx, tx, event) if err != nil { log.Infof(ctx, "state machine transition error: %v", err.Error()) return err } - res.Message = s + res.Message = newState + + // TODO: This belongs in a hook. + s := newState.Data log.Infof(ctx, "s currentspec is %+v, grpc-service is '%v'", s.CurrentSpec, s.CurrentSpec.GrpcName) @@ -155,44 +151,28 @@ func (ds *DeadletterService) ReplayDeadMessage(ctx context.Context, req *dante_s } func (ds *DeadletterService) RejectDeadMessage(ctx context.Context, req *dante_spb.RejectDeadMessageRequest) (*dante_spb.RejectDeadMessageResponse, error) { - res := dante_spb.RejectDeadMessageResponse{} + res := &dante_spb.RejectDeadMessageResponse{} - if err := ds.db.Transact(ctx, &sqrlx.TxOptions{ - Isolation: sql.LevelReadCommitted, - ReadOnly: false, - Retryable: true, - }, func(ctx context.Context, tx sqrlx.Transaction) error { - - event := dante_pb.DeadMessageEvent{ - Metadata: &dante_pb.Metadata{ - EventId: uuid.NewString(), - Timestamp: timestamppb.Now(), - Actor: &auth_pb.Actor{}, - }, + event := &dante_pb.DeadmessagePSMEventSpec{ + Cause: CommandCause(ctx), + EventID: uuid.NewString(), + Timestamp: time.Now(), + Keys: &dante_pb.DeadMessageKeys{ MessageId: req.MessageId, - Event: &dante_pb.DeadMessageEventType{ - Type: &dante_pb.DeadMessageEventType_Rejected_{ - Rejected: &dante_pb.DeadMessageEventType_Rejected{ - Reason: req.Reason, - }, - }, - }, - } - - s, err := ds.sm.TransitionInTx(ctx, tx, &event) - if err != nil { - log.Infof(ctx, "state machine transition error: %v", err.Error()) - return err - } - res.Message = s + }, + Event: &dante_pb.DeadMessageEventType_Rejected{ + Reason: req.Reason, + }, + } - return nil - }); err != nil { - log.WithError(ctx, err).Error("Couldn't save dead letter change to database") + newState, err := ds.sm.Transition(ctx, ds.db, event) + if err != nil { + log.Infof(ctx, "update PSM error: %v", err.Error()) return nil, err } + res.Message = newState - return &res, nil + return res, nil } func (ds *DeadletterService) ListDeadMessageEvents(ctx context.Context, req *dante_spb.ListDeadMessageEventsRequest) (*dante_spb.ListDeadMessageEventsResponse, error) { @@ -207,213 +187,8 @@ func (ds *DeadletterService) GetDeadMessage(ctx context.Context, req *dante_spb. return res, ds.messageQuerySet.Get(ctx, ds.db, req, res) } -func newPsm() (*dante_pb.DeadmessagePSM, error) { - config := dante_pb.DefaultDeadmessagePSMConfig() - sm, err := config.NewStateMachine() - if err != nil { - return nil, err - } - - // new message - sm.From(dante_pb.MessageStatus_UNSPECIFIED).Transition( - dante_pb.DeadmessagePSMTransition(func(ctx context.Context, - state *dante_pb.DeadMessageState, - event *dante_pb.DeadMessageEventType_Created) error { - - state.Status = dante_pb.MessageStatus_MESSAGE_STATUS_CREATED - state.CurrentSpec = event.Spec - return nil - })) - - // created to rejected - sm.From(dante_pb.MessageStatus_MESSAGE_STATUS_CREATED).Transition( - dante_pb.DeadmessagePSMTransition(func(ctx context.Context, - state *dante_pb.DeadMessageState, - event *dante_pb.DeadMessageEventType_Rejected) error { - state.Status = dante_pb.MessageStatus_MESSAGE_STATUS_REJECTED - // how do we store the reason? - - return nil - })) - - // created to updated - sm.From(dante_pb.MessageStatus_MESSAGE_STATUS_CREATED).Transition( - dante_pb.DeadmessagePSMTransition(func(ctx context.Context, - state *dante_pb.DeadMessageState, - event *dante_pb.DeadMessageEventType_Updated) error { - state.Status = dante_pb.MessageStatus_MESSAGE_STATUS_UPDATED - state.CurrentSpec = event.Spec - - return nil - })) - - // created to replayed - sm.From(dante_pb.MessageStatus_MESSAGE_STATUS_CREATED).Transition( - dante_pb.DeadmessagePSMTransition(func(ctx context.Context, - state *dante_pb.DeadMessageState, - event *dante_pb.DeadMessageEventType_Replayed) error { - state.Status = dante_pb.MessageStatus_MESSAGE_STATUS_REPLAYED - - return nil - })) - - // updated to updated - sm.From(dante_pb.MessageStatus_MESSAGE_STATUS_UPDATED).Transition( - dante_pb.DeadmessagePSMTransition(func(ctx context.Context, - state *dante_pb.DeadMessageState, - event *dante_pb.DeadMessageEventType_Updated) error { - state.Status = dante_pb.MessageStatus_MESSAGE_STATUS_UPDATED - state.CurrentSpec = event.Spec - - return nil - })) - - // updated to rejected - sm.From(dante_pb.MessageStatus_MESSAGE_STATUS_UPDATED).Transition( - dante_pb.DeadmessagePSMTransition(func(ctx context.Context, - state *dante_pb.DeadMessageState, - event *dante_pb.DeadMessageEventType_Rejected) error { - state.Status = dante_pb.MessageStatus_MESSAGE_STATUS_REJECTED - // how do we store the reason? - - return nil - })) - - // updated to replayed - sm.From(dante_pb.MessageStatus_MESSAGE_STATUS_UPDATED).Transition( - dante_pb.DeadmessagePSMTransition(func(ctx context.Context, - state *dante_pb.DeadMessageState, - event *dante_pb.DeadMessageEventType_Replayed) error { - state.Status = dante_pb.MessageStatus_MESSAGE_STATUS_REPLAYED - - return nil - })) - - return sm, nil -} - func (ds *DeadletterService) ListDeadMessages(ctx context.Context, req *dante_spb.ListDeadMessagesRequest) (*dante_spb.ListDeadMessagesResponse, error) { res := &dante_spb.ListDeadMessagesResponse{} return res, ds.messageQuerySet.List(ctx, ds.db, req, res) } - -type SlackMessage struct { - Text string `json:"text"` -} - -func (ds *DeadletterService) Dead(ctx context.Context, req *dante_tpb.DeadMessage) (*emptypb.Empty, error) { - s := dante_pb.DeadMessageSpec{ - VersionId: uuid.NewString(), - InfraMessageId: req.InfraMessageId, - QueueName: req.QueueName, - GrpcName: req.GrpcName, - CreatedAt: req.Timestamp, - Payload: req.Payload, - Problem: req.GetProblem(), - } - - dms := dante_pb.DeadMessageState{ - MessageId: req.MessageId, - CurrentSpec: &s, - Status: dante_pb.MessageStatus_CREATED, - } - - // While Dante has access to the proto definitions needed to convert the proto to json, - // the protostate machine does not and will throw an error when trying to convert to json - // to save to the database. - // Dump the proto portion of the payload. - dms.CurrentSpec.Payload.Proto = nil - - _, err := ds.protojson.Marshal(&dms) - if err != nil { - log.Infof(ctx, "couldn't turn dead letter into json after removing payload: %v", err.Error()) - return nil, err - } - - event := dante_pb.DeadMessageEvent{ - Metadata: &dante_pb.Metadata{ - EventId: uuid.NewString(), - Timestamp: timestamppb.Now(), - Actor: &auth_pb.Actor{}, - }, - MessageId: dms.MessageId, - Event: &dante_pb.DeadMessageEventType{ - Type: &dante_pb.DeadMessageEventType_Created_{ - Created: &dante_pb.DeadMessageEventType_Created{ - Spec: &s, - }, - }, - }, - } - - if err := ds.db.Transact(ctx, &sqrlx.TxOptions{ - Isolation: sql.LevelReadCommitted, - ReadOnly: false, - Retryable: true, - }, func(ctx context.Context, tx sqrlx.Transaction) error { - - _, err := ds.sm.TransitionInTx(ctx, tx, &event) - if err != nil { - log.Infof(ctx, "create PSM error: %v", err.Error()) - return err - } - - return nil - }); err != nil { - log.WithError(ctx, err).Error("Couldn't save dead letter to database") - return nil, err - } - - // if we got here, no error occurred so we inserted a new dead letter, let slack know - if len(ds.slackUrl) > 0 { - msg := SlackMessage{} - wrapper := `*Deadletter on*: -%v -*Error*: -%v}` - - msg.Text = fmt.Sprintf(wrapper, req.QueueName, req.Problem.String()) - json, err := json.Marshal(msg) - if err != nil { - log.WithError(ctx, err).Error("Couldn't convert dead letter to slack message") - msg.Text = "(Dante error converting to slack message)" - } - res, err := http.Post(ds.slackUrl, "application/json", bytes.NewReader([]byte(json))) - if err != nil { - log.WithError(ctx, err).Error("Couldn't send deadletter notice to slack") - } - defer res.Body.Close() - } - - return &emptypb.Empty{}, nil -} - -func NewDeadletterServiceService(conn sqrlx.Connection, resolver dynamictype.Resolver, sqsClient SqsSender, slack string) (*DeadletterService, error) { - db, err := sqrlx.New(conn, sq.Dollar) - if err != nil { - return nil, err - } - - q, err := newPsm() - if err != nil { - return nil, fmt.Errorf("couldn't make new PSM: %w", err) - } - - b := dante_spb.DefaultMessagePSMQuerySpec(q.StateTableSpec()) - - qset, err := dante_spb.NewMessagePSMQuerySet(b, psm.StateQueryOptions{}) - if err != nil { - return nil, fmt.Errorf("couldn't make new PSM query set: %w", err) - } - - return &DeadletterService{ - db: db, - protojson: dynamictype.NewProtoJSON(resolver), - sqsClient: sqsClient, - slackUrl: slack, - messageQuerySet: *qset, - sm: q, - }, nil - -} diff --git a/service/state.go b/service/state.go new file mode 100644 index 0000000..8920d11 --- /dev/null +++ b/service/state.go @@ -0,0 +1,82 @@ +package service + +import ( + "github.com/pentops/dante/gen/o5/dante/v1/dante_pb" +) + +func NewDeadmessagePSM() (*dante_pb.DeadmessagePSM, error) { + config := dante_pb.DefaultDeadmessagePSMConfig() + sm, err := config.NewStateMachine() + if err != nil { + return nil, err + } + + // new message + sm.From(0).Mutate(dante_pb.DeadmessagePSMMutation( + func(state *dante_pb.DeadMessageData, + event *dante_pb.DeadMessageEventType_Created) error { + state.CurrentSpec = event.Spec + return nil + })). + SetStatus(dante_pb.MessageStatus_CREATED) + + // created to rejected + sm.From(dante_pb.MessageStatus_CREATED).Mutate( + dante_pb.DeadmessagePSMMutation(func( + state *dante_pb.DeadMessageData, + event *dante_pb.DeadMessageEventType_Rejected) error { + // how do we store the reason? + + return nil + })).SetStatus(dante_pb.MessageStatus_REJECTED) + + // created to updated + sm.From(dante_pb.MessageStatus_CREATED).Mutate( + dante_pb.DeadmessagePSMMutation(func( + state *dante_pb.DeadMessageData, + event *dante_pb.DeadMessageEventType_Updated) error { + state.CurrentSpec = event.Spec + + return nil + })).SetStatus(dante_pb.MessageStatus_UPDATED) + + // created to replayed + sm.From(dante_pb.MessageStatus_CREATED).Mutate( + dante_pb.DeadmessagePSMMutation(func( + state *dante_pb.DeadMessageData, + event *dante_pb.DeadMessageEventType_Replayed) error { + + return nil + })).SetStatus(dante_pb.MessageStatus_REPLAYED) + + // updated to updated + sm.From(dante_pb.MessageStatus_UPDATED).Mutate( + dante_pb.DeadmessagePSMMutation(func( + state *dante_pb.DeadMessageData, + event *dante_pb.DeadMessageEventType_Updated) error { + state.CurrentSpec = event.Spec + + return nil + })).SetStatus(dante_pb.MessageStatus_UPDATED) + + // updated to rejected + sm.From(dante_pb.MessageStatus_UPDATED).Mutate( + dante_pb.DeadmessagePSMMutation(func( + state *dante_pb.DeadMessageData, + event *dante_pb.DeadMessageEventType_Rejected) error { + // how do we store the reason? + + return nil + })).SetStatus(dante_pb.MessageStatus_REJECTED) + + // updated to replayed + sm.From(dante_pb.MessageStatus_UPDATED).Mutate( + dante_pb.DeadmessagePSMMutation(func( + state *dante_pb.DeadMessageData, + event *dante_pb.DeadMessageEventType_Replayed) error { + + return nil + })).SetStatus(dante_pb.MessageStatus_REPLAYED) + + return sm, nil +} diff --git a/service/worker.go b/service/worker.go new file mode 100644 index 0000000..147a4e8 --- /dev/null +++ b/service/worker.go @@ -0,0 +1,120 @@ +package service + +import ( + "bytes" + "context" + "encoding/json" + "fmt" + "net/http" + "time" + + "github.com/google/uuid" + "github.com/pentops/dante/dynamictype" + "github.com/pentops/dante/gen/o5/dante/v1/dante_pb" + "github.com/pentops/dante/gen/o5/dante/v1/dante_tpb" + "github.com/pentops/protostate/gen/state/v1/psm_pb" + "github.com/pentops/sqrlx.go/sqrlx" + "google.golang.org/protobuf/types/known/emptypb" + "gopkg.daemonl.com/log" +) + +type DeadLetterWorker struct { + db *sqrlx.Wrapper + sm *dante_pb.DeadmessagePSM + slackUrl string + protojson ProtoJSON + + dante_tpb.UnimplementedDeadMessageTopicServer +} + +func NewDeadLetterWorker(conn sqrlx.Connection, resolver dynamictype.Resolver, stateMachine *dante_pb.DeadmessagePSM, slack string) (*DeadLetterWorker, error) { + db, err := sqrlx.New(conn, sqrlx.Dollar) + if err != nil { + return nil, err + } + + return &DeadLetterWorker{ + db: db, + sm: stateMachine, + slackUrl: slack, + protojson: dynamictype.NewProtoJSON(resolver), + }, nil + +} + +type SlackMessage struct { + Text string `json:"text"` +} + +func (ds *DeadLetterWorker) Dead(ctx context.Context, req *dante_tpb.DeadMessage) (*emptypb.Empty, error) { + s := dante_pb.DeadMessageSpec{ + VersionId: uuid.NewString(), + InfraMessageId: req.InfraMessageId, + QueueName: req.QueueName, + GrpcName: req.GrpcName, + CreatedAt: req.Timestamp, + Payload: req.Payload, + Problem: req.GetProblem(), + } + + // While Dante has access to the proto definitions needed to convert the proto to json, + // the protostate machine does not and will throw an error when trying to convert to json + // to save to the database. + // Dump the proto portion of the payload. + s.Payload.Proto = nil + + _, err := ds.protojson.Marshal(&s) + if err != nil { + log.Infof(ctx, "couldn't turn dead letter into json after removing payload: %v", err.Error()) + return nil, err + } + + event := &dante_pb.DeadmessagePSMEventSpec{ + Cause: &psm_pb.Cause{ + Type: &psm_pb.Cause_ExternalEvent{ + ExternalEvent: &psm_pb.ExternalEventCause{ + SystemName: "Dante", + EventName: "Dead", + ExternalId: &req.MessageId, + }, + }, + }, + Keys: &dante_pb.DeadMessageKeys{ + MessageId: req.MessageId, + }, + EventID: uuid.NewString(), + Timestamp: time.Now(), + Event: &dante_pb.DeadMessageEventType_Created{ + Spec: &s, + }, + } + + _, err = ds.sm.Transition(ctx, ds.db, event) + if err != nil { + log.WithError(ctx, err).Error("Couldn't save dead letter to database") + return nil, err + } + + // if we got here, no error occurred so we inserted a new dead letter, let slack know + if len(ds.slackUrl) > 0 { + msg := SlackMessage{} + wrapper := `*Deadletter on*: +%v +*Error*: +%v}` + + msg.Text = fmt.Sprintf(wrapper, req.QueueName, req.Problem.String()) + json, err := json.Marshal(msg) + if err != nil { + log.WithError(ctx, err).Error("Couldn't convert dead letter to slack message") + msg.Text = "(Dante error converting to slack message)" + } + res, err := http.Post(ds.slackUrl, "application/json", bytes.NewReader([]byte(json))) + if err != nil { + log.WithError(ctx, err).Error("Couldn't send deadletter notice to slack") + } + defer res.Body.Close() + } + + return &emptypb.Empty{}, nil +}