diff --git a/connect-go/gen/proto/wg/cosmo/node/v1/node.pb.go b/connect-go/gen/proto/wg/cosmo/node/v1/node.pb.go index 30527dc201..6258be376b 100644 --- a/connect-go/gen/proto/wg/cosmo/node/v1/node.pb.go +++ b/connect-go/gen/proto/wg/cosmo/node/v1/node.pb.go @@ -2713,6 +2713,8 @@ type EntityMapping struct { Request string `protobuf:"bytes,5,opt,name=request,proto3" json:"request,omitempty"` // gRPC response message type name Response string `protobuf:"bytes,6,opt,name=response,proto3" json:"response,omitempty"` + // Mappings for required fields + RequiredFieldMappings []*RequiredFieldMapping `protobuf:"bytes,7,rep,name=required_field_mappings,json=requiredFieldMappings,proto3" json:"required_field_mappings,omitempty"` } func (x *EntityMapping) Reset() { @@ -2789,6 +2791,88 @@ func (x *EntityMapping) GetResponse() string { return "" } +func (x *EntityMapping) GetRequiredFieldMappings() []*RequiredFieldMapping { + if x != nil { + return x.RequiredFieldMappings + } + return nil +} + +// Defines mapping for required fields +type RequiredFieldMapping struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + FieldMapping *FieldMapping `protobuf:"bytes,1,opt,name=field_mapping,json=fieldMapping,proto3" json:"field_mapping,omitempty"` + // Mapped gRPC method name + Rpc string `protobuf:"bytes,2,opt,name=rpc,proto3" json:"rpc,omitempty"` + // gRPC request message type name + Request string `protobuf:"bytes,3,opt,name=request,proto3" json:"request,omitempty"` + // gRPC response message type name + Response string `protobuf:"bytes,4,opt,name=response,proto3" json:"response,omitempty"` +} + +func (x *RequiredFieldMapping) Reset() { + *x = RequiredFieldMapping{} + if protoimpl.UnsafeEnabled { + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[34] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RequiredFieldMapping) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RequiredFieldMapping) ProtoMessage() {} + +func (x *RequiredFieldMapping) ProtoReflect() protoreflect.Message { + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[34] + 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 RequiredFieldMapping.ProtoReflect.Descriptor instead. +func (*RequiredFieldMapping) Descriptor() ([]byte, []int) { + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{34} +} + +func (x *RequiredFieldMapping) GetFieldMapping() *FieldMapping { + if x != nil { + return x.FieldMapping + } + return nil +} + +func (x *RequiredFieldMapping) GetRpc() string { + if x != nil { + return x.Rpc + } + return "" +} + +func (x *RequiredFieldMapping) GetRequest() string { + if x != nil { + return x.Request + } + return "" +} + +func (x *RequiredFieldMapping) GetResponse() string { + if x != nil { + return x.Response + } + return "" +} + // Defines mapping between GraphQL type fields and gRPC message fields type TypeFieldMapping struct { state protoimpl.MessageState @@ -2804,7 +2888,7 @@ type TypeFieldMapping struct { func (x *TypeFieldMapping) Reset() { *x = TypeFieldMapping{} if protoimpl.UnsafeEnabled { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[34] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[35] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2817,7 +2901,7 @@ func (x *TypeFieldMapping) String() string { func (*TypeFieldMapping) ProtoMessage() {} func (x *TypeFieldMapping) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[34] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[35] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2830,7 +2914,7 @@ func (x *TypeFieldMapping) ProtoReflect() protoreflect.Message { // Deprecated: Use TypeFieldMapping.ProtoReflect.Descriptor instead. func (*TypeFieldMapping) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{34} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{35} } func (x *TypeFieldMapping) GetType() string { @@ -2864,7 +2948,7 @@ type FieldMapping struct { func (x *FieldMapping) Reset() { *x = FieldMapping{} if protoimpl.UnsafeEnabled { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[35] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[36] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2877,7 +2961,7 @@ func (x *FieldMapping) String() string { func (*FieldMapping) ProtoMessage() {} func (x *FieldMapping) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[35] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[36] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2890,7 +2974,7 @@ func (x *FieldMapping) ProtoReflect() protoreflect.Message { // Deprecated: Use FieldMapping.ProtoReflect.Descriptor instead. func (*FieldMapping) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{35} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{36} } func (x *FieldMapping) GetOriginal() string { @@ -2929,7 +3013,7 @@ type ArgumentMapping struct { func (x *ArgumentMapping) Reset() { *x = ArgumentMapping{} if protoimpl.UnsafeEnabled { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[36] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[37] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2942,7 +3026,7 @@ func (x *ArgumentMapping) String() string { func (*ArgumentMapping) ProtoMessage() {} func (x *ArgumentMapping) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[36] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[37] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2955,7 +3039,7 @@ func (x *ArgumentMapping) ProtoReflect() protoreflect.Message { // Deprecated: Use ArgumentMapping.ProtoReflect.Descriptor instead. func (*ArgumentMapping) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{36} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{37} } func (x *ArgumentMapping) GetOriginal() string { @@ -2984,7 +3068,7 @@ type EnumMapping struct { func (x *EnumMapping) Reset() { *x = EnumMapping{} if protoimpl.UnsafeEnabled { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[37] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[38] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2997,7 +3081,7 @@ func (x *EnumMapping) String() string { func (*EnumMapping) ProtoMessage() {} func (x *EnumMapping) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[37] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[38] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3010,7 +3094,7 @@ func (x *EnumMapping) ProtoReflect() protoreflect.Message { // Deprecated: Use EnumMapping.ProtoReflect.Descriptor instead. func (*EnumMapping) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{37} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{38} } func (x *EnumMapping) GetType() string { @@ -3039,7 +3123,7 @@ type EnumValueMapping struct { func (x *EnumValueMapping) Reset() { *x = EnumValueMapping{} if protoimpl.UnsafeEnabled { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[38] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[39] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3052,7 +3136,7 @@ func (x *EnumValueMapping) String() string { func (*EnumValueMapping) ProtoMessage() {} func (x *EnumValueMapping) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[38] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[39] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3065,7 +3149,7 @@ func (x *EnumValueMapping) ProtoReflect() protoreflect.Message { // Deprecated: Use EnumValueMapping.ProtoReflect.Descriptor instead. func (*EnumValueMapping) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{38} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{39} } func (x *EnumValueMapping) GetOriginal() string { @@ -3095,7 +3179,7 @@ type NatsStreamConfiguration struct { func (x *NatsStreamConfiguration) Reset() { *x = NatsStreamConfiguration{} if protoimpl.UnsafeEnabled { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[39] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[40] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3108,7 +3192,7 @@ func (x *NatsStreamConfiguration) String() string { func (*NatsStreamConfiguration) ProtoMessage() {} func (x *NatsStreamConfiguration) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[39] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[40] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3121,7 +3205,7 @@ func (x *NatsStreamConfiguration) ProtoReflect() protoreflect.Message { // Deprecated: Use NatsStreamConfiguration.ProtoReflect.Descriptor instead. func (*NatsStreamConfiguration) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{39} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{40} } func (x *NatsStreamConfiguration) GetConsumerName() string { @@ -3158,7 +3242,7 @@ type NatsEventConfiguration struct { func (x *NatsEventConfiguration) Reset() { *x = NatsEventConfiguration{} if protoimpl.UnsafeEnabled { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[40] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[41] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3171,7 +3255,7 @@ func (x *NatsEventConfiguration) String() string { func (*NatsEventConfiguration) ProtoMessage() {} func (x *NatsEventConfiguration) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[40] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[41] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3184,7 +3268,7 @@ func (x *NatsEventConfiguration) ProtoReflect() protoreflect.Message { // Deprecated: Use NatsEventConfiguration.ProtoReflect.Descriptor instead. func (*NatsEventConfiguration) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{40} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{41} } func (x *NatsEventConfiguration) GetEngineEventConfiguration() *EngineEventConfiguration { @@ -3220,7 +3304,7 @@ type KafkaEventConfiguration struct { func (x *KafkaEventConfiguration) Reset() { *x = KafkaEventConfiguration{} if protoimpl.UnsafeEnabled { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[41] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[42] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3233,7 +3317,7 @@ func (x *KafkaEventConfiguration) String() string { func (*KafkaEventConfiguration) ProtoMessage() {} func (x *KafkaEventConfiguration) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[41] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[42] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3246,7 +3330,7 @@ func (x *KafkaEventConfiguration) ProtoReflect() protoreflect.Message { // Deprecated: Use KafkaEventConfiguration.ProtoReflect.Descriptor instead. func (*KafkaEventConfiguration) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{41} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{42} } func (x *KafkaEventConfiguration) GetEngineEventConfiguration() *EngineEventConfiguration { @@ -3275,7 +3359,7 @@ type RedisEventConfiguration struct { func (x *RedisEventConfiguration) Reset() { *x = RedisEventConfiguration{} if protoimpl.UnsafeEnabled { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[42] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[43] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3288,7 +3372,7 @@ func (x *RedisEventConfiguration) String() string { func (*RedisEventConfiguration) ProtoMessage() {} func (x *RedisEventConfiguration) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[42] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[43] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3301,7 +3385,7 @@ func (x *RedisEventConfiguration) ProtoReflect() protoreflect.Message { // Deprecated: Use RedisEventConfiguration.ProtoReflect.Descriptor instead. func (*RedisEventConfiguration) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{42} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{43} } func (x *RedisEventConfiguration) GetEngineEventConfiguration() *EngineEventConfiguration { @@ -3332,7 +3416,7 @@ type EngineEventConfiguration struct { func (x *EngineEventConfiguration) Reset() { *x = EngineEventConfiguration{} if protoimpl.UnsafeEnabled { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[43] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[44] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3345,7 +3429,7 @@ func (x *EngineEventConfiguration) String() string { func (*EngineEventConfiguration) ProtoMessage() {} func (x *EngineEventConfiguration) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[43] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[44] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3358,7 +3442,7 @@ func (x *EngineEventConfiguration) ProtoReflect() protoreflect.Message { // Deprecated: Use EngineEventConfiguration.ProtoReflect.Descriptor instead. func (*EngineEventConfiguration) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{43} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{44} } func (x *EngineEventConfiguration) GetProviderId() string { @@ -3402,7 +3486,7 @@ type DataSourceCustomEvents struct { func (x *DataSourceCustomEvents) Reset() { *x = DataSourceCustomEvents{} if protoimpl.UnsafeEnabled { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[44] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[45] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3415,7 +3499,7 @@ func (x *DataSourceCustomEvents) String() string { func (*DataSourceCustomEvents) ProtoMessage() {} func (x *DataSourceCustomEvents) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[44] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[45] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3428,7 +3512,7 @@ func (x *DataSourceCustomEvents) ProtoReflect() protoreflect.Message { // Deprecated: Use DataSourceCustomEvents.ProtoReflect.Descriptor instead. func (*DataSourceCustomEvents) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{44} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{45} } func (x *DataSourceCustomEvents) GetNats() []*NatsEventConfiguration { @@ -3463,7 +3547,7 @@ type DataSourceCustom_Static struct { func (x *DataSourceCustom_Static) Reset() { *x = DataSourceCustom_Static{} if protoimpl.UnsafeEnabled { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[45] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[46] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3476,7 +3560,7 @@ func (x *DataSourceCustom_Static) String() string { func (*DataSourceCustom_Static) ProtoMessage() {} func (x *DataSourceCustom_Static) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[45] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[46] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3489,7 +3573,7 @@ func (x *DataSourceCustom_Static) ProtoReflect() protoreflect.Message { // Deprecated: Use DataSourceCustom_Static.ProtoReflect.Descriptor instead. func (*DataSourceCustom_Static) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{45} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{46} } func (x *DataSourceCustom_Static) GetData() *ConfigurationVariable { @@ -3514,7 +3598,7 @@ type ConfigurationVariable struct { func (x *ConfigurationVariable) Reset() { *x = ConfigurationVariable{} if protoimpl.UnsafeEnabled { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[46] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[47] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3527,7 +3611,7 @@ func (x *ConfigurationVariable) String() string { func (*ConfigurationVariable) ProtoMessage() {} func (x *ConfigurationVariable) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[46] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[47] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3540,7 +3624,7 @@ func (x *ConfigurationVariable) ProtoReflect() protoreflect.Message { // Deprecated: Use ConfigurationVariable.ProtoReflect.Descriptor instead. func (*ConfigurationVariable) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{46} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{47} } func (x *ConfigurationVariable) GetKind() ConfigurationVariableKind { @@ -3590,7 +3674,7 @@ type DirectiveConfiguration struct { func (x *DirectiveConfiguration) Reset() { *x = DirectiveConfiguration{} if protoimpl.UnsafeEnabled { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[47] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[48] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3603,7 +3687,7 @@ func (x *DirectiveConfiguration) String() string { func (*DirectiveConfiguration) ProtoMessage() {} func (x *DirectiveConfiguration) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[47] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[48] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3616,7 +3700,7 @@ func (x *DirectiveConfiguration) ProtoReflect() protoreflect.Message { // Deprecated: Use DirectiveConfiguration.ProtoReflect.Descriptor instead. func (*DirectiveConfiguration) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{47} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{48} } func (x *DirectiveConfiguration) GetDirectiveName() string { @@ -3645,7 +3729,7 @@ type URLQueryConfiguration struct { func (x *URLQueryConfiguration) Reset() { *x = URLQueryConfiguration{} if protoimpl.UnsafeEnabled { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[48] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[49] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3658,7 +3742,7 @@ func (x *URLQueryConfiguration) String() string { func (*URLQueryConfiguration) ProtoMessage() {} func (x *URLQueryConfiguration) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[48] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[49] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3671,7 +3755,7 @@ func (x *URLQueryConfiguration) ProtoReflect() protoreflect.Message { // Deprecated: Use URLQueryConfiguration.ProtoReflect.Descriptor instead. func (*URLQueryConfiguration) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{48} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{49} } func (x *URLQueryConfiguration) GetName() string { @@ -3699,7 +3783,7 @@ type HTTPHeader struct { func (x *HTTPHeader) Reset() { *x = HTTPHeader{} if protoimpl.UnsafeEnabled { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[49] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[50] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3712,7 +3796,7 @@ func (x *HTTPHeader) String() string { func (*HTTPHeader) ProtoMessage() {} func (x *HTTPHeader) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[49] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[50] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3725,7 +3809,7 @@ func (x *HTTPHeader) ProtoReflect() protoreflect.Message { // Deprecated: Use HTTPHeader.ProtoReflect.Descriptor instead. func (*HTTPHeader) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{49} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{50} } func (x *HTTPHeader) GetValues() []*ConfigurationVariable { @@ -3748,7 +3832,7 @@ type MTLSConfiguration struct { func (x *MTLSConfiguration) Reset() { *x = MTLSConfiguration{} if protoimpl.UnsafeEnabled { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[50] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[51] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3761,7 +3845,7 @@ func (x *MTLSConfiguration) String() string { func (*MTLSConfiguration) ProtoMessage() {} func (x *MTLSConfiguration) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[50] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[51] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3774,7 +3858,7 @@ func (x *MTLSConfiguration) ProtoReflect() protoreflect.Message { // Deprecated: Use MTLSConfiguration.ProtoReflect.Descriptor instead. func (*MTLSConfiguration) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{50} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{51} } func (x *MTLSConfiguration) GetKey() *ConfigurationVariable { @@ -3814,7 +3898,7 @@ type GraphQLSubscriptionConfiguration struct { func (x *GraphQLSubscriptionConfiguration) Reset() { *x = GraphQLSubscriptionConfiguration{} if protoimpl.UnsafeEnabled { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[51] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[52] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3827,7 +3911,7 @@ func (x *GraphQLSubscriptionConfiguration) String() string { func (*GraphQLSubscriptionConfiguration) ProtoMessage() {} func (x *GraphQLSubscriptionConfiguration) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[51] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[52] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3840,7 +3924,7 @@ func (x *GraphQLSubscriptionConfiguration) ProtoReflect() protoreflect.Message { // Deprecated: Use GraphQLSubscriptionConfiguration.ProtoReflect.Descriptor instead. func (*GraphQLSubscriptionConfiguration) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{51} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{52} } func (x *GraphQLSubscriptionConfiguration) GetEnabled() bool { @@ -3890,7 +3974,7 @@ type GraphQLFederationConfiguration struct { func (x *GraphQLFederationConfiguration) Reset() { *x = GraphQLFederationConfiguration{} if protoimpl.UnsafeEnabled { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[52] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[53] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3903,7 +3987,7 @@ func (x *GraphQLFederationConfiguration) String() string { func (*GraphQLFederationConfiguration) ProtoMessage() {} func (x *GraphQLFederationConfiguration) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[52] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[53] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3916,7 +4000,7 @@ func (x *GraphQLFederationConfiguration) ProtoReflect() protoreflect.Message { // Deprecated: Use GraphQLFederationConfiguration.ProtoReflect.Descriptor instead. func (*GraphQLFederationConfiguration) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{52} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{53} } func (x *GraphQLFederationConfiguration) GetEnabled() bool { @@ -3945,7 +4029,7 @@ type InternedString struct { func (x *InternedString) Reset() { *x = InternedString{} if protoimpl.UnsafeEnabled { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[53] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[54] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3958,7 +4042,7 @@ func (x *InternedString) String() string { func (*InternedString) ProtoMessage() {} func (x *InternedString) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[53] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[54] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3971,7 +4055,7 @@ func (x *InternedString) ProtoReflect() protoreflect.Message { // Deprecated: Use InternedString.ProtoReflect.Descriptor instead. func (*InternedString) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{53} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{54} } func (x *InternedString) GetKey() string { @@ -3993,7 +4077,7 @@ type SingleTypeField struct { func (x *SingleTypeField) Reset() { *x = SingleTypeField{} if protoimpl.UnsafeEnabled { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[54] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[55] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4006,7 +4090,7 @@ func (x *SingleTypeField) String() string { func (*SingleTypeField) ProtoMessage() {} func (x *SingleTypeField) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[54] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[55] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4019,7 +4103,7 @@ func (x *SingleTypeField) ProtoReflect() protoreflect.Message { // Deprecated: Use SingleTypeField.ProtoReflect.Descriptor instead. func (*SingleTypeField) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{54} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{55} } func (x *SingleTypeField) GetTypeName() string { @@ -4048,7 +4132,7 @@ type SubscriptionFieldCondition struct { func (x *SubscriptionFieldCondition) Reset() { *x = SubscriptionFieldCondition{} if protoimpl.UnsafeEnabled { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[55] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[56] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4061,7 +4145,7 @@ func (x *SubscriptionFieldCondition) String() string { func (*SubscriptionFieldCondition) ProtoMessage() {} func (x *SubscriptionFieldCondition) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[55] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[56] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4074,7 +4158,7 @@ func (x *SubscriptionFieldCondition) ProtoReflect() protoreflect.Message { // Deprecated: Use SubscriptionFieldCondition.ProtoReflect.Descriptor instead. func (*SubscriptionFieldCondition) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{55} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{56} } func (x *SubscriptionFieldCondition) GetFieldPath() []string { @@ -4105,7 +4189,7 @@ type SubscriptionFilterCondition struct { func (x *SubscriptionFilterCondition) Reset() { *x = SubscriptionFilterCondition{} if protoimpl.UnsafeEnabled { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[56] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[57] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4118,7 +4202,7 @@ func (x *SubscriptionFilterCondition) String() string { func (*SubscriptionFilterCondition) ProtoMessage() {} func (x *SubscriptionFilterCondition) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[56] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[57] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4131,7 +4215,7 @@ func (x *SubscriptionFilterCondition) ProtoReflect() protoreflect.Message { // Deprecated: Use SubscriptionFilterCondition.ProtoReflect.Descriptor instead. func (*SubscriptionFilterCondition) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{56} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{57} } func (x *SubscriptionFilterCondition) GetAnd() []*SubscriptionFilterCondition { @@ -4173,7 +4257,7 @@ type CacheWarmerOperations struct { func (x *CacheWarmerOperations) Reset() { *x = CacheWarmerOperations{} if protoimpl.UnsafeEnabled { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[57] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[58] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4186,7 +4270,7 @@ func (x *CacheWarmerOperations) String() string { func (*CacheWarmerOperations) ProtoMessage() {} func (x *CacheWarmerOperations) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[57] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[58] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4199,7 +4283,7 @@ func (x *CacheWarmerOperations) ProtoReflect() protoreflect.Message { // Deprecated: Use CacheWarmerOperations.ProtoReflect.Descriptor instead. func (*CacheWarmerOperations) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{57} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{58} } func (x *CacheWarmerOperations) GetOperations() []*Operation { @@ -4221,7 +4305,7 @@ type Operation struct { func (x *Operation) Reset() { *x = Operation{} if protoimpl.UnsafeEnabled { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[58] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[59] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4234,7 +4318,7 @@ func (x *Operation) String() string { func (*Operation) ProtoMessage() {} func (x *Operation) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[58] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[59] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4247,7 +4331,7 @@ func (x *Operation) ProtoReflect() protoreflect.Message { // Deprecated: Use Operation.ProtoReflect.Descriptor instead. func (*Operation) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{58} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{59} } func (x *Operation) GetRequest() *OperationRequest { @@ -4277,7 +4361,7 @@ type OperationRequest struct { func (x *OperationRequest) Reset() { *x = OperationRequest{} if protoimpl.UnsafeEnabled { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[59] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[60] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4290,7 +4374,7 @@ func (x *OperationRequest) String() string { func (*OperationRequest) ProtoMessage() {} func (x *OperationRequest) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[59] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[60] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4303,7 +4387,7 @@ func (x *OperationRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use OperationRequest.ProtoReflect.Descriptor instead. func (*OperationRequest) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{59} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{60} } func (x *OperationRequest) GetOperationName() string { @@ -4338,7 +4422,7 @@ type Extension struct { func (x *Extension) Reset() { *x = Extension{} if protoimpl.UnsafeEnabled { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[60] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[61] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4351,7 +4435,7 @@ func (x *Extension) String() string { func (*Extension) ProtoMessage() {} func (x *Extension) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[60] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[61] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4364,7 +4448,7 @@ func (x *Extension) ProtoReflect() protoreflect.Message { // Deprecated: Use Extension.ProtoReflect.Descriptor instead. func (*Extension) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{60} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{61} } func (x *Extension) GetPersistedQuery() *PersistedQuery { @@ -4386,7 +4470,7 @@ type PersistedQuery struct { func (x *PersistedQuery) Reset() { *x = PersistedQuery{} if protoimpl.UnsafeEnabled { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[61] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[62] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4399,7 +4483,7 @@ func (x *PersistedQuery) String() string { func (*PersistedQuery) ProtoMessage() {} func (x *PersistedQuery) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[61] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[62] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4412,7 +4496,7 @@ func (x *PersistedQuery) ProtoReflect() protoreflect.Message { // Deprecated: Use PersistedQuery.ProtoReflect.Descriptor instead. func (*PersistedQuery) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{61} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{62} } func (x *PersistedQuery) GetSha256Hash() string { @@ -4441,7 +4525,7 @@ type ClientInfo struct { func (x *ClientInfo) Reset() { *x = ClientInfo{} if protoimpl.UnsafeEnabled { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[62] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[63] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4454,7 +4538,7 @@ func (x *ClientInfo) String() string { func (*ClientInfo) ProtoMessage() {} func (x *ClientInfo) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[62] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[63] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4467,7 +4551,7 @@ func (x *ClientInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use ClientInfo.ProtoReflect.Descriptor instead. func (*ClientInfo) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{62} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{63} } func (x *ClientInfo) GetName() string { @@ -4975,7 +5059,7 @@ var file_wg_cosmo_node_v1_node_proto_rawDesc = []byte{ 0x52, 0x06, 0x6d, 0x61, 0x70, 0x70, 0x65, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x9a, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xfa, 0x01, 0x0a, 0x0d, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x79, 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, @@ -4985,327 +5069,343 @@ var file_wg_cosmo_node_v1_node_proto_rawDesc = []byte{ 0x52, 0x03, 0x72, 0x70, 0x63, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x6d, 0x0a, 0x10, 0x54, - 0x79, 0x70, 0x65, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x12, - 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, - 0x79, 0x70, 0x65, 0x12, 0x45, 0x0a, 0x0e, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x6d, 0x61, 0x70, - 0x70, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x77, 0x67, + 0x09, 0x52, 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5e, 0x0a, 0x17, 0x72, + 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x6d, 0x61, + 0x70, 0x70, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x77, + 0x67, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x76, 0x31, 0x2e, + 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4d, 0x61, 0x70, + 0x70, 0x69, 0x6e, 0x67, 0x52, 0x15, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x46, 0x69, + 0x65, 0x6c, 0x64, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x73, 0x22, 0xa3, 0x01, 0x0a, 0x14, + 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4d, 0x61, 0x70, + 0x70, 0x69, 0x6e, 0x67, 0x12, 0x43, 0x0a, 0x0d, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x6d, 0x61, + 0x70, 0x70, 0x69, 0x6e, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x77, 0x67, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x46, - 0x69, 0x65, 0x6c, 0x64, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x52, 0x0d, 0x66, 0x69, 0x65, - 0x6c, 0x64, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x73, 0x22, 0x92, 0x01, 0x0a, 0x0c, 0x46, - 0x69, 0x65, 0x6c, 0x64, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x12, 0x1a, 0x0a, 0x08, 0x6f, - 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6f, - 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x61, 0x70, 0x70, 0x65, - 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6d, 0x61, 0x70, 0x70, 0x65, 0x64, 0x12, - 0x4e, 0x0a, 0x11, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x6d, 0x61, 0x70, 0x70, - 0x69, 0x6e, 0x67, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x77, 0x67, 0x2e, - 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x72, - 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x52, 0x10, 0x61, - 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x73, 0x22, - 0x45, 0x0a, 0x0f, 0x41, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x61, 0x70, 0x70, 0x69, - 0x6e, 0x67, 0x12, 0x1a, 0x0a, 0x08, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x12, 0x16, - 0x0a, 0x06, 0x6d, 0x61, 0x70, 0x70, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, - 0x6d, 0x61, 0x70, 0x70, 0x65, 0x64, 0x22, 0x5d, 0x0a, 0x0b, 0x45, 0x6e, 0x75, 0x6d, 0x4d, 0x61, + 0x69, 0x65, 0x6c, 0x64, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x52, 0x0c, 0x66, 0x69, 0x65, + 0x6c, 0x64, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x12, 0x10, 0x0a, 0x03, 0x72, 0x70, 0x63, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x72, 0x70, 0x63, 0x12, 0x18, 0x0a, 0x07, 0x72, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x72, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x6d, 0x0a, 0x10, 0x54, 0x79, 0x70, 0x65, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x3a, 0x0a, 0x06, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x77, 0x67, 0x2e, 0x63, - 0x6f, 0x73, 0x6d, 0x6f, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x6e, 0x75, - 0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x52, 0x06, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x73, 0x22, 0x46, 0x0a, 0x10, 0x45, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c, - 0x75, 0x65, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x12, 0x1a, 0x0a, 0x08, 0x6f, 0x72, 0x69, - 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6f, 0x72, 0x69, - 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x61, 0x70, 0x70, 0x65, 0x64, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6d, 0x61, 0x70, 0x70, 0x65, 0x64, 0x22, 0x9f, 0x01, - 0x0a, 0x17, 0x4e, 0x61, 0x74, 0x73, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x23, 0x0a, 0x0d, 0x63, 0x6f, 0x6e, - 0x73, 0x75, 0x6d, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0c, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6d, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1f, - 0x0a, 0x0b, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4e, 0x61, 0x6d, 0x65, 0x12, - 0x3e, 0x0a, 0x1b, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6d, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x61, 0x63, - 0x74, 0x69, 0x76, 0x65, 0x5f, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x19, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6d, 0x65, 0x72, 0x49, 0x6e, - 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x22, - 0xfc, 0x01, 0x0a, 0x16, 0x4e, 0x61, 0x74, 0x73, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x68, 0x0a, 0x1a, 0x65, 0x6e, - 0x67, 0x69, 0x6e, 0x65, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, - 0x2e, 0x77, 0x67, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x76, - 0x31, 0x2e, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x18, 0x65, 0x6e, 0x67, 0x69, - 0x6e, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, - 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x73, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, - 0x12, 0x5c, 0x0a, 0x14, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, - 0x2e, 0x77, 0x67, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x76, - 0x31, 0x2e, 0x4e, 0x61, 0x74, 0x73, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x13, 0x73, 0x74, 0x72, 0x65, 0x61, - 0x6d, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x9b, - 0x01, 0x0a, 0x17, 0x4b, 0x61, 0x66, 0x6b, 0x61, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x68, 0x0a, 0x1a, 0x65, 0x6e, - 0x67, 0x69, 0x6e, 0x65, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, - 0x2e, 0x77, 0x67, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x76, - 0x31, 0x2e, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x18, 0x65, 0x6e, 0x67, 0x69, - 0x6e, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x6f, 0x70, 0x69, 0x63, 0x73, 0x18, 0x02, - 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x74, 0x6f, 0x70, 0x69, 0x63, 0x73, 0x22, 0x9f, 0x01, 0x0a, - 0x17, 0x52, 0x65, 0x64, 0x69, 0x73, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x68, 0x0a, 0x1a, 0x65, 0x6e, 0x67, 0x69, - 0x6e, 0x65, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x77, - 0x67, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x76, 0x31, 0x2e, - 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x18, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x45, 0x0a, 0x0e, 0x66, 0x69, 0x65, + 0x6c, 0x64, 0x5f, 0x6d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x1e, 0x2e, 0x77, 0x67, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x2e, 0x6e, 0x6f, 0x64, + 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, + 0x67, 0x52, 0x0d, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x73, + 0x22, 0x92, 0x01, 0x0a, 0x0c, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, + 0x67, 0x12, 0x1a, 0x0a, 0x08, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x12, 0x16, 0x0a, + 0x06, 0x6d, 0x61, 0x70, 0x70, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6d, + 0x61, 0x70, 0x70, 0x65, 0x64, 0x12, 0x4e, 0x0a, 0x11, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x5f, 0x6d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x21, 0x2e, 0x77, 0x67, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x2e, 0x6e, 0x6f, 0x64, 0x65, + 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x61, 0x70, 0x70, + 0x69, 0x6e, 0x67, 0x52, 0x10, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x61, 0x70, + 0x70, 0x69, 0x6e, 0x67, 0x73, 0x22, 0x45, 0x0a, 0x0f, 0x41, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x12, 0x1a, 0x0a, 0x08, 0x6f, 0x72, 0x69, 0x67, + 0x69, 0x6e, 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6f, 0x72, 0x69, 0x67, + 0x69, 0x6e, 0x61, 0x6c, 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x61, 0x70, 0x70, 0x65, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6d, 0x61, 0x70, 0x70, 0x65, 0x64, 0x22, 0x5d, 0x0a, 0x0b, + 0x45, 0x6e, 0x75, 0x6d, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x12, 0x12, 0x0a, 0x04, 0x74, + 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, + 0x3a, 0x0a, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x22, 0x2e, 0x77, 0x67, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, + 0x76, 0x31, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4d, 0x61, 0x70, 0x70, + 0x69, 0x6e, 0x67, 0x52, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x22, 0x46, 0x0a, 0x10, 0x45, + 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x12, + 0x1a, 0x0a, 0x08, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x12, 0x16, 0x0a, 0x06, 0x6d, + 0x61, 0x70, 0x70, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6d, 0x61, 0x70, + 0x70, 0x65, 0x64, 0x22, 0x9f, 0x01, 0x0a, 0x17, 0x4e, 0x61, 0x74, 0x73, 0x53, 0x74, 0x72, 0x65, + 0x61, 0x6d, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x23, 0x0a, 0x0d, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6d, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6d, 0x65, 0x72, + 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x74, 0x72, 0x65, 0x61, + 0x6d, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x3e, 0x0a, 0x1b, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6d, 0x65, + 0x72, 0x5f, 0x69, 0x6e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x74, 0x68, 0x72, 0x65, 0x73, + 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x19, 0x63, 0x6f, 0x6e, 0x73, + 0x75, 0x6d, 0x65, 0x72, 0x49, 0x6e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x54, 0x68, 0x72, 0x65, + 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x22, 0xfc, 0x01, 0x0a, 0x16, 0x4e, 0x61, 0x74, 0x73, 0x45, 0x76, + 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x68, 0x0a, 0x1a, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x77, 0x67, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x2e, + 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x45, 0x76, + 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x18, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x75, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x73, 0x75, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x12, 0x5c, 0x0a, 0x14, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, + 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x77, 0x67, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x2e, + 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x61, 0x74, 0x73, 0x53, 0x74, 0x72, 0x65, + 0x61, 0x6d, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x13, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x9b, 0x01, 0x0a, 0x17, 0x4b, 0x61, 0x66, 0x6b, 0x61, 0x45, 0x76, + 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x68, 0x0a, 0x1a, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x77, 0x67, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x2e, + 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x45, 0x76, + 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x18, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x6f, + 0x70, 0x69, 0x63, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x74, 0x6f, 0x70, 0x69, + 0x63, 0x73, 0x22, 0x9f, 0x01, 0x0a, 0x17, 0x52, 0x65, 0x64, 0x69, 0x73, 0x45, 0x76, 0x65, 0x6e, + 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x68, + 0x0a, 0x1a, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x63, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x77, 0x67, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x2e, 0x6e, 0x6f, + 0x64, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x45, 0x76, 0x65, 0x6e, + 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x18, + 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x68, 0x61, 0x6e, + 0x6e, 0x65, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x63, 0x68, 0x61, 0x6e, + 0x6e, 0x65, 0x6c, 0x73, 0x22, 0xa8, 0x01, 0x0a, 0x18, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x45, + 0x76, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, + 0x49, 0x64, 0x12, 0x2f, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x1b, 0x2e, 0x77, 0x67, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x2e, 0x6e, 0x6f, 0x64, 0x65, + 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, + 0x79, 0x70, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x79, 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, + 0x12, 0x1d, 0x0a, 0x0a, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x22, + 0xd8, 0x01, 0x0a, 0x16, 0x44, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x75, + 0x73, 0x74, 0x6f, 0x6d, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x3c, 0x0a, 0x04, 0x6e, 0x61, + 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x77, 0x67, 0x2e, 0x63, 0x6f, + 0x73, 0x6d, 0x6f, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x61, 0x74, 0x73, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x18, 0x02, - 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x22, 0xa8, - 0x01, 0x0a, 0x18, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x43, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1f, 0x0a, 0x0b, 0x70, - 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x49, 0x64, 0x12, 0x2f, 0x0a, 0x04, - 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1b, 0x2e, 0x77, 0x67, 0x2e, - 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x76, - 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x1b, 0x0a, - 0x09, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x74, 0x79, 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x66, 0x69, - 0x65, 0x6c, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, - 0x66, 0x69, 0x65, 0x6c, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0xd8, 0x01, 0x0a, 0x16, 0x44, 0x61, - 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x45, 0x76, - 0x65, 0x6e, 0x74, 0x73, 0x12, 0x3c, 0x0a, 0x04, 0x6e, 0x61, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x77, 0x67, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x2e, 0x6e, 0x6f, - 0x64, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x61, 0x74, 0x73, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x04, 0x6e, 0x61, - 0x74, 0x73, 0x12, 0x3f, 0x0a, 0x05, 0x6b, 0x61, 0x66, 0x6b, 0x61, 0x18, 0x02, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x29, 0x2e, 0x77, 0x67, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x2e, 0x6e, 0x6f, 0x64, - 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x61, 0x66, 0x6b, 0x61, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x05, 0x6b, 0x61, - 0x66, 0x6b, 0x61, 0x12, 0x3f, 0x0a, 0x05, 0x72, 0x65, 0x64, 0x69, 0x73, 0x18, 0x03, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x77, 0x67, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x2e, 0x6e, 0x6f, - 0x64, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x64, 0x69, 0x73, 0x45, 0x76, 0x65, 0x6e, 0x74, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x05, 0x72, - 0x65, 0x64, 0x69, 0x73, 0x22, 0x56, 0x0a, 0x17, 0x44, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x53, 0x74, 0x61, 0x74, 0x69, 0x63, 0x12, - 0x3b, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, - 0x77, 0x67, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x76, 0x31, - 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x61, - 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0xd5, 0x02, 0x0a, - 0x15, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x61, - 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x3f, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2b, 0x2e, 0x77, 0x67, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x2e, - 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x4b, 0x69, 0x6e, - 0x64, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x36, 0x0a, 0x17, 0x73, 0x74, 0x61, 0x74, 0x69, - 0x63, 0x5f, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, - 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, - 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, - 0x3a, 0x0a, 0x19, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x76, - 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x17, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x56, - 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x4b, 0x0a, 0x22, 0x65, - 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x76, 0x61, 0x72, 0x69, 0x61, - 0x62, 0x6c, 0x65, 0x5f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x1f, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x66, 0x61, - 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x3a, 0x0a, 0x19, 0x70, 0x6c, 0x61, 0x63, - 0x65, 0x68, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x5f, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, - 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x17, 0x70, 0x6c, 0x61, - 0x63, 0x65, 0x68, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, - 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x5c, 0x0a, 0x16, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x76, - 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x25, - 0x0a, 0x0e, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x76, - 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x72, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x5f, - 0x74, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x6e, 0x61, 0x6d, 0x65, - 0x54, 0x6f, 0x22, 0x41, 0x0a, 0x15, 0x55, 0x52, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x43, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, - 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x4d, 0x0a, 0x0a, 0x48, 0x54, 0x54, 0x50, 0x48, 0x65, 0x61, - 0x64, 0x65, 0x72, 0x12, 0x3f, 0x0a, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x77, 0x67, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x2e, 0x6e, - 0x6f, 0x64, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x06, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x73, 0x22, 0xbb, 0x01, 0x0a, 0x11, 0x4d, 0x54, 0x4c, 0x53, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x39, 0x0a, 0x03, 0x6b, 0x65, - 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x77, 0x67, 0x2e, 0x63, 0x6f, 0x73, - 0x6d, 0x6f, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, - 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x3b, 0x0a, 0x04, 0x63, 0x65, 0x72, 0x74, 0x18, 0x02, 0x20, + 0x6f, 0x6e, 0x52, 0x04, 0x6e, 0x61, 0x74, 0x73, 0x12, 0x3f, 0x0a, 0x05, 0x6b, 0x61, 0x66, 0x6b, + 0x61, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x77, 0x67, 0x2e, 0x63, 0x6f, 0x73, + 0x6d, 0x6f, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x61, 0x66, 0x6b, 0x61, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x05, 0x6b, 0x61, 0x66, 0x6b, 0x61, 0x12, 0x3f, 0x0a, 0x05, 0x72, 0x65, 0x64, + 0x69, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x77, 0x67, 0x2e, 0x63, 0x6f, + 0x73, 0x6d, 0x6f, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x64, 0x69, + 0x73, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x05, 0x72, 0x65, 0x64, 0x69, 0x73, 0x22, 0x56, 0x0a, 0x17, 0x44, 0x61, + 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x53, + 0x74, 0x61, 0x74, 0x69, 0x63, 0x12, 0x3b, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x77, 0x67, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x04, 0x63, 0x65, - 0x72, 0x74, 0x12, 0x2e, 0x0a, 0x12, 0x69, 0x6e, 0x73, 0x65, 0x63, 0x75, 0x72, 0x65, 0x53, 0x6b, - 0x69, 0x70, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, - 0x69, 0x6e, 0x73, 0x65, 0x63, 0x75, 0x72, 0x65, 0x53, 0x6b, 0x69, 0x70, 0x56, 0x65, 0x72, 0x69, - 0x66, 0x79, 0x22, 0xfb, 0x02, 0x0a, 0x20, 0x47, 0x72, 0x61, 0x70, 0x68, 0x51, 0x4c, 0x53, 0x75, - 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, - 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, - 0x64, 0x12, 0x39, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, - 0x2e, 0x77, 0x67, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x76, - 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, - 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x12, 0x1b, 0x0a, 0x06, - 0x75, 0x73, 0x65, 0x53, 0x53, 0x45, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x06, - 0x75, 0x73, 0x65, 0x53, 0x53, 0x45, 0x88, 0x01, 0x01, 0x12, 0x4d, 0x0a, 0x08, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2c, 0x2e, 0x77, 0x67, - 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x47, 0x72, - 0x61, 0x70, 0x68, 0x51, 0x4c, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x48, 0x01, 0x52, 0x08, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x88, 0x01, 0x01, 0x12, 0x65, 0x0a, 0x14, 0x77, 0x65, 0x62, 0x73, - 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x53, 0x75, 0x62, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2c, 0x2e, 0x77, 0x67, 0x2e, 0x63, 0x6f, 0x73, 0x6d, - 0x6f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x47, 0x72, 0x61, 0x70, 0x68, 0x51, 0x4c, - 0x57, 0x65, 0x62, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x53, 0x75, 0x62, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x63, 0x6f, 0x6c, 0x48, 0x02, 0x52, 0x14, 0x77, 0x65, 0x62, 0x73, 0x6f, 0x63, 0x6b, 0x65, - 0x74, 0x53, 0x75, 0x62, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x88, 0x01, 0x01, 0x42, - 0x09, 0x0a, 0x07, 0x5f, 0x75, 0x73, 0x65, 0x53, 0x53, 0x45, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x42, 0x17, 0x0a, 0x15, 0x5f, 0x77, 0x65, 0x62, 0x73, - 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x53, 0x75, 0x62, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, - 0x22, 0x5a, 0x0a, 0x1e, 0x47, 0x72, 0x61, 0x70, 0x68, 0x51, 0x4c, 0x46, 0x65, 0x64, 0x65, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x1e, 0x0a, 0x0a, - 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x64, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x64, 0x6c, 0x22, 0x22, 0x0a, 0x0e, - 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x64, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x10, - 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, - 0x22, 0x4d, 0x0a, 0x0f, 0x53, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x46, 0x69, - 0x65, 0x6c, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x79, 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, - 0x12, 0x1d, 0x0a, 0x0a, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x22, - 0x4f, 0x0a, 0x1a, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x46, - 0x69, 0x65, 0x6c, 0x64, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1d, 0x0a, - 0x0a, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x09, 0x52, 0x09, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x50, 0x61, 0x74, 0x68, 0x12, 0x12, 0x0a, 0x04, - 0x6a, 0x73, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6a, 0x73, 0x6f, 0x6e, - 0x22, 0xb5, 0x02, 0x0a, 0x1b, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, - 0x12, 0x3f, 0x0a, 0x03, 0x61, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, - 0x77, 0x67, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x76, 0x31, - 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x69, 0x6c, - 0x74, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x03, 0x61, 0x6e, - 0x64, 0x12, 0x41, 0x0a, 0x02, 0x69, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, + 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x04, 0x64, 0x61, + 0x74, 0x61, 0x22, 0xd5, 0x02, 0x0a, 0x15, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x3f, 0x0a, 0x04, + 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2b, 0x2e, 0x77, 0x67, 0x2e, + 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x61, 0x72, 0x69, 0x61, + 0x62, 0x6c, 0x65, 0x4b, 0x69, 0x6e, 0x64, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x36, 0x0a, + 0x17, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x5f, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, + 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, + 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x3a, 0x0a, 0x19, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x17, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x61, 0x6d, + 0x65, 0x12, 0x4b, 0x0a, 0x22, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x5f, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x1f, 0x65, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, + 0x6c, 0x65, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x3a, + 0x0a, 0x19, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x68, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x5f, 0x76, 0x61, + 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x17, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x68, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x56, 0x61, + 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x5c, 0x0a, 0x16, 0x44, 0x69, + 0x72, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x25, 0x0a, 0x0e, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x76, + 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x64, 0x69, + 0x72, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x72, + 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x74, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x72, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x54, 0x6f, 0x22, 0x41, 0x0a, 0x15, 0x55, 0x52, 0x4c, 0x51, + 0x75, 0x65, 0x72, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x4d, 0x0a, 0x0a, 0x48, + 0x54, 0x54, 0x50, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x3f, 0x0a, 0x06, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x77, 0x67, 0x2e, 0x63, + 0x6f, 0x73, 0x6d, 0x6f, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, + 0x6c, 0x65, 0x52, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x22, 0xbb, 0x01, 0x0a, 0x11, 0x4d, + 0x54, 0x4c, 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x39, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x77, 0x67, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x76, 0x31, - 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x69, 0x65, - 0x6c, 0x64, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x02, 0x69, - 0x6e, 0x88, 0x01, 0x01, 0x12, 0x44, 0x0a, 0x03, 0x6e, 0x6f, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x2d, 0x2e, 0x77, 0x67, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x2e, 0x6e, 0x6f, 0x64, - 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, - 0x48, 0x01, 0x52, 0x03, 0x6e, 0x6f, 0x74, 0x88, 0x01, 0x01, 0x12, 0x3d, 0x0a, 0x02, 0x6f, 0x72, - 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x77, 0x67, 0x2e, 0x63, 0x6f, 0x73, 0x6d, - 0x6f, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, - 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x64, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x02, 0x6f, 0x72, 0x42, 0x05, 0x0a, 0x03, 0x5f, 0x69, 0x6e, - 0x42, 0x06, 0x0a, 0x04, 0x5f, 0x6e, 0x6f, 0x74, 0x22, 0x54, 0x0a, 0x15, 0x43, 0x61, 0x63, 0x68, - 0x65, 0x57, 0x61, 0x72, 0x6d, 0x65, 0x72, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x12, 0x3b, 0x0a, 0x0a, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x77, 0x67, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, - 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x52, 0x0a, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x7f, - 0x0a, 0x09, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3c, 0x0a, 0x07, 0x72, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x77, - 0x67, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x76, 0x31, 0x2e, - 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x52, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x34, 0x0a, 0x06, 0x63, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x77, 0x67, 0x2e, 0x63, - 0x6f, 0x73, 0x6d, 0x6f, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x06, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x22, - 0x8c, 0x01, 0x0a, 0x10, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6f, 0x70, - 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x71, - 0x75, 0x65, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, - 0x79, 0x12, 0x3b, 0x0a, 0x0a, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x77, 0x67, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, - 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, - 0x6f, 0x6e, 0x52, 0x0a, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x56, - 0x0a, 0x09, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x49, 0x0a, 0x0f, 0x70, - 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x64, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x77, 0x67, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x2e, - 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, - 0x64, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x0e, 0x70, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, - 0x64, 0x51, 0x75, 0x65, 0x72, 0x79, 0x22, 0x4b, 0x0a, 0x0e, 0x50, 0x65, 0x72, 0x73, 0x69, 0x73, - 0x74, 0x65, 0x64, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x68, 0x61, 0x32, - 0x35, 0x36, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, - 0x68, 0x61, 0x32, 0x35, 0x36, 0x48, 0x61, 0x73, 0x68, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, - 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x0a, 0x0a, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, - 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x2a, - 0x82, 0x01, 0x0a, 0x1b, 0x41, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x6e, 0x64, - 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x1b, 0x0a, 0x17, 0x52, 0x45, 0x4e, 0x44, 0x45, 0x52, 0x5f, 0x41, 0x52, 0x47, 0x55, 0x4d, 0x45, - 0x4e, 0x54, 0x5f, 0x44, 0x45, 0x46, 0x41, 0x55, 0x4c, 0x54, 0x10, 0x00, 0x12, 0x24, 0x0a, 0x20, - 0x52, 0x45, 0x4e, 0x44, 0x45, 0x52, 0x5f, 0x41, 0x52, 0x47, 0x55, 0x4d, 0x45, 0x4e, 0x54, 0x5f, - 0x41, 0x53, 0x5f, 0x47, 0x52, 0x41, 0x50, 0x48, 0x51, 0x4c, 0x5f, 0x56, 0x41, 0x4c, 0x55, 0x45, - 0x10, 0x01, 0x12, 0x20, 0x0a, 0x1c, 0x52, 0x45, 0x4e, 0x44, 0x45, 0x52, 0x5f, 0x41, 0x52, 0x47, - 0x55, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x41, 0x53, 0x5f, 0x41, 0x52, 0x52, 0x41, 0x59, 0x5f, 0x43, - 0x53, 0x56, 0x10, 0x02, 0x2a, 0x36, 0x0a, 0x0e, 0x41, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x10, 0x0a, 0x0c, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, - 0x5f, 0x46, 0x49, 0x45, 0x4c, 0x44, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x46, 0x49, 0x45, 0x4c, - 0x44, 0x5f, 0x41, 0x52, 0x47, 0x55, 0x4d, 0x45, 0x4e, 0x54, 0x10, 0x01, 0x2a, 0x35, 0x0a, 0x0e, - 0x44, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x0a, - 0x0a, 0x06, 0x53, 0x54, 0x41, 0x54, 0x49, 0x43, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x47, 0x52, - 0x41, 0x50, 0x48, 0x51, 0x4c, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x50, 0x55, 0x42, 0x53, 0x55, - 0x42, 0x10, 0x02, 0x2a, 0x5c, 0x0a, 0x0a, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x54, 0x79, 0x70, - 0x65, 0x12, 0x1b, 0x0a, 0x17, 0x4c, 0x4f, 0x4f, 0x4b, 0x55, 0x50, 0x5f, 0x54, 0x59, 0x50, 0x45, - 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x17, - 0x0a, 0x13, 0x4c, 0x4f, 0x4f, 0x4b, 0x55, 0x50, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x52, 0x45, - 0x53, 0x4f, 0x4c, 0x56, 0x45, 0x10, 0x01, 0x12, 0x18, 0x0a, 0x14, 0x4c, 0x4f, 0x4f, 0x4b, 0x55, - 0x50, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x52, 0x45, 0x51, 0x55, 0x49, 0x52, 0x45, 0x53, 0x10, - 0x02, 0x2a, 0x87, 0x01, 0x0a, 0x0d, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, - 0x79, 0x70, 0x65, 0x12, 0x1e, 0x0a, 0x1a, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, - 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, - 0x44, 0x10, 0x00, 0x12, 0x18, 0x0a, 0x14, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, - 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x51, 0x55, 0x45, 0x52, 0x59, 0x10, 0x01, 0x12, 0x1b, 0x0a, - 0x17, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, - 0x4d, 0x55, 0x54, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x02, 0x12, 0x1f, 0x0a, 0x1b, 0x4f, 0x50, - 0x45, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x55, 0x42, - 0x53, 0x43, 0x52, 0x49, 0x50, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x03, 0x2a, 0x34, 0x0a, 0x09, 0x45, - 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x50, 0x55, 0x42, 0x4c, - 0x49, 0x53, 0x48, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x52, 0x45, 0x51, 0x55, 0x45, 0x53, 0x54, - 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x53, 0x55, 0x42, 0x53, 0x43, 0x52, 0x49, 0x42, 0x45, 0x10, - 0x02, 0x2a, 0x86, 0x01, 0x0a, 0x19, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x4b, 0x69, 0x6e, 0x64, 0x12, - 0x21, 0x0a, 0x1d, 0x53, 0x54, 0x41, 0x54, 0x49, 0x43, 0x5f, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, - 0x55, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x56, 0x41, 0x52, 0x49, 0x41, 0x42, 0x4c, 0x45, - 0x10, 0x00, 0x12, 0x1e, 0x0a, 0x1a, 0x45, 0x4e, 0x56, 0x5f, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, - 0x55, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x56, 0x41, 0x52, 0x49, 0x41, 0x42, 0x4c, 0x45, - 0x10, 0x01, 0x12, 0x26, 0x0a, 0x22, 0x50, 0x4c, 0x41, 0x43, 0x45, 0x48, 0x4f, 0x4c, 0x44, 0x45, - 0x52, 0x5f, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x55, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, - 0x56, 0x41, 0x52, 0x49, 0x41, 0x42, 0x4c, 0x45, 0x10, 0x02, 0x2a, 0x41, 0x0a, 0x0a, 0x48, 0x54, - 0x54, 0x50, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x07, 0x0a, 0x03, 0x47, 0x45, 0x54, 0x10, - 0x00, 0x12, 0x08, 0x0a, 0x04, 0x50, 0x4f, 0x53, 0x54, 0x10, 0x01, 0x12, 0x07, 0x0a, 0x03, 0x50, - 0x55, 0x54, 0x10, 0x02, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, 0x10, 0x03, - 0x12, 0x0b, 0x0a, 0x07, 0x4f, 0x50, 0x54, 0x49, 0x4f, 0x4e, 0x53, 0x10, 0x04, 0x32, 0x6e, 0x0a, - 0x0b, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x5f, 0x0a, 0x0c, - 0x53, 0x65, 0x6c, 0x66, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0x25, 0x2e, 0x77, + 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x61, + 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x3b, 0x0a, 0x04, 0x63, + 0x65, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x77, 0x67, 0x2e, 0x63, + 0x6f, 0x73, 0x6d, 0x6f, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, + 0x6c, 0x65, 0x52, 0x04, 0x63, 0x65, 0x72, 0x74, 0x12, 0x2e, 0x0a, 0x12, 0x69, 0x6e, 0x73, 0x65, + 0x63, 0x75, 0x72, 0x65, 0x53, 0x6b, 0x69, 0x70, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x69, 0x6e, 0x73, 0x65, 0x63, 0x75, 0x72, 0x65, 0x53, 0x6b, + 0x69, 0x70, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x22, 0xfb, 0x02, 0x0a, 0x20, 0x47, 0x72, 0x61, + 0x70, 0x68, 0x51, 0x4c, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, + 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, + 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x39, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x77, 0x67, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x2e, + 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x03, 0x75, + 0x72, 0x6c, 0x12, 0x1b, 0x0a, 0x06, 0x75, 0x73, 0x65, 0x53, 0x53, 0x45, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x08, 0x48, 0x00, 0x52, 0x06, 0x75, 0x73, 0x65, 0x53, 0x53, 0x45, 0x88, 0x01, 0x01, 0x12, + 0x4d, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x2c, 0x2e, 0x77, 0x67, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x2e, 0x63, 0x6f, 0x6d, + 0x6d, 0x6f, 0x6e, 0x2e, 0x47, 0x72, 0x61, 0x70, 0x68, 0x51, 0x4c, 0x53, 0x75, 0x62, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x48, + 0x01, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x88, 0x01, 0x01, 0x12, 0x65, + 0x0a, 0x14, 0x77, 0x65, 0x62, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x53, 0x75, 0x62, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2c, 0x2e, 0x77, + 0x67, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x47, + 0x72, 0x61, 0x70, 0x68, 0x51, 0x4c, 0x57, 0x65, 0x62, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x53, + 0x75, 0x62, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x48, 0x02, 0x52, 0x14, 0x77, 0x65, + 0x62, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x53, 0x75, 0x62, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, + 0x6f, 0x6c, 0x88, 0x01, 0x01, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x75, 0x73, 0x65, 0x53, 0x53, 0x45, + 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x42, 0x17, 0x0a, + 0x15, 0x5f, 0x77, 0x65, 0x62, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x53, 0x75, 0x62, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x22, 0x5a, 0x0a, 0x1e, 0x47, 0x72, 0x61, 0x70, 0x68, 0x51, + 0x4c, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, + 0x6c, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, + 0x65, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x64, 0x6c, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, + 0x64, 0x6c, 0x22, 0x22, 0x0a, 0x0e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x64, 0x53, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x22, 0x4d, 0x0a, 0x0f, 0x53, 0x69, 0x6e, 0x67, 0x6c, 0x65, + 0x54, 0x79, 0x70, 0x65, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x79, 0x70, + 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x79, + 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x66, 0x69, 0x65, 0x6c, + 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x4f, 0x0a, 0x1a, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x70, 0x61, 0x74, + 0x68, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x50, 0x61, + 0x74, 0x68, 0x12, 0x12, 0x0a, 0x04, 0x6a, 0x73, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0xb5, 0x02, 0x0a, 0x1b, 0x53, 0x75, 0x62, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x43, 0x6f, 0x6e, + 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3f, 0x0a, 0x03, 0x61, 0x6e, 0x64, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x77, 0x67, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x2e, 0x6e, + 0x6f, 0x64, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x03, 0x61, 0x6e, 0x64, 0x12, 0x41, 0x0a, 0x02, 0x69, 0x6e, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x77, 0x67, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x2e, 0x6e, + 0x6f, 0x64, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x48, 0x00, 0x52, 0x02, 0x69, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x44, 0x0a, 0x03, 0x6e, 0x6f, + 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x77, 0x67, 0x2e, 0x63, 0x6f, 0x73, + 0x6d, 0x6f, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x43, 0x6f, 0x6e, + 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x01, 0x52, 0x03, 0x6e, 0x6f, 0x74, 0x88, 0x01, 0x01, + 0x12, 0x3d, 0x0a, 0x02, 0x6f, 0x72, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x77, 0x67, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x76, 0x31, 0x2e, - 0x53, 0x65, 0x6c, 0x66, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x77, 0x67, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x2e, 0x6e, - 0x6f, 0x64, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x6c, 0x66, 0x52, 0x65, 0x67, 0x69, 0x73, - 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0xcf, 0x01, - 0x0a, 0x14, 0x63, 0x6f, 0x6d, 0x2e, 0x77, 0x67, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x2e, 0x6e, - 0x6f, 0x64, 0x65, 0x2e, 0x76, 0x31, 0x42, 0x09, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x72, 0x6f, 0x74, - 0x6f, 0x50, 0x01, 0x5a, 0x49, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, - 0x77, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2f, 0x63, 0x6f, 0x73, 0x6d, - 0x6f, 0x2f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x2d, 0x67, 0x6f, 0x2f, 0x67, 0x65, 0x6e, - 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x77, 0x67, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x2f, - 0x6e, 0x6f, 0x64, 0x65, 0x2f, 0x76, 0x31, 0x3b, 0x6e, 0x6f, 0x64, 0x65, 0x76, 0x31, 0xa2, 0x02, - 0x03, 0x57, 0x43, 0x4e, 0xaa, 0x02, 0x10, 0x57, 0x67, 0x2e, 0x43, 0x6f, 0x73, 0x6d, 0x6f, 0x2e, - 0x4e, 0x6f, 0x64, 0x65, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x10, 0x57, 0x67, 0x5c, 0x43, 0x6f, 0x73, - 0x6d, 0x6f, 0x5c, 0x4e, 0x6f, 0x64, 0x65, 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x1c, 0x57, 0x67, 0x5c, - 0x43, 0x6f, 0x73, 0x6d, 0x6f, 0x5c, 0x4e, 0x6f, 0x64, 0x65, 0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50, - 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x13, 0x57, 0x67, 0x3a, 0x3a, - 0x43, 0x6f, 0x73, 0x6d, 0x6f, 0x3a, 0x3a, 0x4e, 0x6f, 0x64, 0x65, 0x3a, 0x3a, 0x56, 0x31, 0x62, - 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x69, 0x6c, 0x74, + 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x02, 0x6f, 0x72, 0x42, + 0x05, 0x0a, 0x03, 0x5f, 0x69, 0x6e, 0x42, 0x06, 0x0a, 0x04, 0x5f, 0x6e, 0x6f, 0x74, 0x22, 0x54, + 0x0a, 0x15, 0x43, 0x61, 0x63, 0x68, 0x65, 0x57, 0x61, 0x72, 0x6d, 0x65, 0x72, 0x4f, 0x70, 0x65, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x3b, 0x0a, 0x0a, 0x6f, 0x70, 0x65, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x77, 0x67, + 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4f, + 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x7f, 0x0a, 0x09, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x3c, 0x0a, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x77, 0x67, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x2e, 0x6e, 0x6f, + 0x64, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x34, 0x0a, 0x06, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1c, 0x2e, 0x77, 0x67, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, + 0x76, 0x31, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x06, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x22, 0x8c, 0x01, 0x0a, 0x10, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x6f, 0x70, + 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0d, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, + 0x65, 0x12, 0x14, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x3b, 0x0a, 0x0a, 0x65, 0x78, 0x74, 0x65, 0x6e, + 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x77, 0x67, + 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, + 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, + 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x56, 0x0a, 0x09, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, + 0x6e, 0x12, 0x49, 0x0a, 0x0f, 0x70, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x64, 0x5f, 0x71, + 0x75, 0x65, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x77, 0x67, 0x2e, + 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x65, + 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x64, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x0e, 0x70, 0x65, + 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x64, 0x51, 0x75, 0x65, 0x72, 0x79, 0x22, 0x4b, 0x0a, 0x0e, + 0x50, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x64, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x1f, + 0x0a, 0x0b, 0x73, 0x68, 0x61, 0x32, 0x35, 0x36, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x68, 0x61, 0x32, 0x35, 0x36, 0x48, 0x61, 0x73, 0x68, 0x12, + 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x0a, 0x0a, 0x43, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x76, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x2a, 0x82, 0x01, 0x0a, 0x1b, 0x41, 0x72, 0x67, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x52, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1b, 0x0a, 0x17, 0x52, 0x45, 0x4e, 0x44, 0x45, 0x52, 0x5f, + 0x41, 0x52, 0x47, 0x55, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x44, 0x45, 0x46, 0x41, 0x55, 0x4c, 0x54, + 0x10, 0x00, 0x12, 0x24, 0x0a, 0x20, 0x52, 0x45, 0x4e, 0x44, 0x45, 0x52, 0x5f, 0x41, 0x52, 0x47, + 0x55, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x41, 0x53, 0x5f, 0x47, 0x52, 0x41, 0x50, 0x48, 0x51, 0x4c, + 0x5f, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x10, 0x01, 0x12, 0x20, 0x0a, 0x1c, 0x52, 0x45, 0x4e, 0x44, + 0x45, 0x52, 0x5f, 0x41, 0x52, 0x47, 0x55, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x41, 0x53, 0x5f, 0x41, + 0x52, 0x52, 0x41, 0x59, 0x5f, 0x43, 0x53, 0x56, 0x10, 0x02, 0x2a, 0x36, 0x0a, 0x0e, 0x41, 0x72, + 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x10, 0x0a, 0x0c, + 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x46, 0x49, 0x45, 0x4c, 0x44, 0x10, 0x00, 0x12, 0x12, + 0x0a, 0x0e, 0x46, 0x49, 0x45, 0x4c, 0x44, 0x5f, 0x41, 0x52, 0x47, 0x55, 0x4d, 0x45, 0x4e, 0x54, + 0x10, 0x01, 0x2a, 0x35, 0x0a, 0x0e, 0x44, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x54, 0x41, 0x54, 0x49, 0x43, 0x10, 0x00, + 0x12, 0x0b, 0x0a, 0x07, 0x47, 0x52, 0x41, 0x50, 0x48, 0x51, 0x4c, 0x10, 0x01, 0x12, 0x0a, 0x0a, + 0x06, 0x50, 0x55, 0x42, 0x53, 0x55, 0x42, 0x10, 0x02, 0x2a, 0x5c, 0x0a, 0x0a, 0x4c, 0x6f, 0x6f, + 0x6b, 0x75, 0x70, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1b, 0x0a, 0x17, 0x4c, 0x4f, 0x4f, 0x4b, 0x55, + 0x50, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, + 0x45, 0x44, 0x10, 0x00, 0x12, 0x17, 0x0a, 0x13, 0x4c, 0x4f, 0x4f, 0x4b, 0x55, 0x50, 0x5f, 0x54, + 0x59, 0x50, 0x45, 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x4c, 0x56, 0x45, 0x10, 0x01, 0x12, 0x18, 0x0a, + 0x14, 0x4c, 0x4f, 0x4f, 0x4b, 0x55, 0x50, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x52, 0x45, 0x51, + 0x55, 0x49, 0x52, 0x45, 0x53, 0x10, 0x02, 0x2a, 0x87, 0x01, 0x0a, 0x0d, 0x4f, 0x70, 0x65, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1e, 0x0a, 0x1a, 0x4f, 0x50, 0x45, + 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, + 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x18, 0x0a, 0x14, 0x4f, 0x50, 0x45, + 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x51, 0x55, 0x45, 0x52, + 0x59, 0x10, 0x01, 0x12, 0x1b, 0x0a, 0x17, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, + 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4d, 0x55, 0x54, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x02, + 0x12, 0x1f, 0x0a, 0x1b, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x59, + 0x50, 0x45, 0x5f, 0x53, 0x55, 0x42, 0x53, 0x43, 0x52, 0x49, 0x50, 0x54, 0x49, 0x4f, 0x4e, 0x10, + 0x03, 0x2a, 0x34, 0x0a, 0x09, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0b, + 0x0a, 0x07, 0x50, 0x55, 0x42, 0x4c, 0x49, 0x53, 0x48, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x52, + 0x45, 0x51, 0x55, 0x45, 0x53, 0x54, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x53, 0x55, 0x42, 0x53, + 0x43, 0x52, 0x49, 0x42, 0x45, 0x10, 0x02, 0x2a, 0x86, 0x01, 0x0a, 0x19, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, + 0x65, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x21, 0x0a, 0x1d, 0x53, 0x54, 0x41, 0x54, 0x49, 0x43, 0x5f, + 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x55, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x56, 0x41, + 0x52, 0x49, 0x41, 0x42, 0x4c, 0x45, 0x10, 0x00, 0x12, 0x1e, 0x0a, 0x1a, 0x45, 0x4e, 0x56, 0x5f, + 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x55, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x56, 0x41, + 0x52, 0x49, 0x41, 0x42, 0x4c, 0x45, 0x10, 0x01, 0x12, 0x26, 0x0a, 0x22, 0x50, 0x4c, 0x41, 0x43, + 0x45, 0x48, 0x4f, 0x4c, 0x44, 0x45, 0x52, 0x5f, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x55, 0x52, + 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x56, 0x41, 0x52, 0x49, 0x41, 0x42, 0x4c, 0x45, 0x10, 0x02, + 0x2a, 0x41, 0x0a, 0x0a, 0x48, 0x54, 0x54, 0x50, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x07, + 0x0a, 0x03, 0x47, 0x45, 0x54, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x50, 0x4f, 0x53, 0x54, 0x10, + 0x01, 0x12, 0x07, 0x0a, 0x03, 0x50, 0x55, 0x54, 0x10, 0x02, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x45, + 0x4c, 0x45, 0x54, 0x45, 0x10, 0x03, 0x12, 0x0b, 0x0a, 0x07, 0x4f, 0x50, 0x54, 0x49, 0x4f, 0x4e, + 0x53, 0x10, 0x04, 0x32, 0x6e, 0x0a, 0x0b, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x12, 0x5f, 0x0a, 0x0c, 0x53, 0x65, 0x6c, 0x66, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, + 0x65, 0x72, 0x12, 0x25, 0x2e, 0x77, 0x67, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x2e, 0x6e, 0x6f, + 0x64, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x6c, 0x66, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, + 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x77, 0x67, 0x2e, 0x63, + 0x6f, 0x73, 0x6d, 0x6f, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x6c, + 0x66, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x00, 0x42, 0xcf, 0x01, 0x0a, 0x14, 0x63, 0x6f, 0x6d, 0x2e, 0x77, 0x67, 0x2e, 0x63, + 0x6f, 0x73, 0x6d, 0x6f, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x76, 0x31, 0x42, 0x09, 0x4e, 0x6f, + 0x64, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x49, 0x67, 0x69, 0x74, 0x68, 0x75, + 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x77, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x67, 0x72, 0x61, 0x70, + 0x68, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x2f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x2d, + 0x67, 0x6f, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x77, 0x67, 0x2f, + 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x2f, 0x6e, 0x6f, 0x64, 0x65, 0x2f, 0x76, 0x31, 0x3b, 0x6e, 0x6f, + 0x64, 0x65, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x57, 0x43, 0x4e, 0xaa, 0x02, 0x10, 0x57, 0x67, 0x2e, + 0x43, 0x6f, 0x73, 0x6d, 0x6f, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x10, + 0x57, 0x67, 0x5c, 0x43, 0x6f, 0x73, 0x6d, 0x6f, 0x5c, 0x4e, 0x6f, 0x64, 0x65, 0x5c, 0x56, 0x31, + 0xe2, 0x02, 0x1c, 0x57, 0x67, 0x5c, 0x43, 0x6f, 0x73, 0x6d, 0x6f, 0x5c, 0x4e, 0x6f, 0x64, 0x65, + 0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, + 0x02, 0x13, 0x57, 0x67, 0x3a, 0x3a, 0x43, 0x6f, 0x73, 0x6d, 0x6f, 0x3a, 0x3a, 0x4e, 0x6f, 0x64, + 0x65, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -5321,7 +5421,7 @@ func file_wg_cosmo_node_v1_node_proto_rawDescGZIP() []byte { } var file_wg_cosmo_node_v1_node_proto_enumTypes = make([]protoimpl.EnumInfo, 8) -var file_wg_cosmo_node_v1_node_proto_msgTypes = make([]protoimpl.MessageInfo, 66) +var file_wg_cosmo_node_v1_node_proto_msgTypes = make([]protoimpl.MessageInfo, 67) var file_wg_cosmo_node_v1_node_proto_goTypes = []any{ (ArgumentRenderConfiguration)(0), // 0: wg.cosmo.node.v1.ArgumentRenderConfiguration (ArgumentSource)(0), // 1: wg.cosmo.node.v1.ArgumentSource @@ -5365,67 +5465,68 @@ var file_wg_cosmo_node_v1_node_proto_goTypes = []any{ (*LookupFieldMapping)(nil), // 39: wg.cosmo.node.v1.LookupFieldMapping (*OperationMapping)(nil), // 40: wg.cosmo.node.v1.OperationMapping (*EntityMapping)(nil), // 41: wg.cosmo.node.v1.EntityMapping - (*TypeFieldMapping)(nil), // 42: wg.cosmo.node.v1.TypeFieldMapping - (*FieldMapping)(nil), // 43: wg.cosmo.node.v1.FieldMapping - (*ArgumentMapping)(nil), // 44: wg.cosmo.node.v1.ArgumentMapping - (*EnumMapping)(nil), // 45: wg.cosmo.node.v1.EnumMapping - (*EnumValueMapping)(nil), // 46: wg.cosmo.node.v1.EnumValueMapping - (*NatsStreamConfiguration)(nil), // 47: wg.cosmo.node.v1.NatsStreamConfiguration - (*NatsEventConfiguration)(nil), // 48: wg.cosmo.node.v1.NatsEventConfiguration - (*KafkaEventConfiguration)(nil), // 49: wg.cosmo.node.v1.KafkaEventConfiguration - (*RedisEventConfiguration)(nil), // 50: wg.cosmo.node.v1.RedisEventConfiguration - (*EngineEventConfiguration)(nil), // 51: wg.cosmo.node.v1.EngineEventConfiguration - (*DataSourceCustomEvents)(nil), // 52: wg.cosmo.node.v1.DataSourceCustomEvents - (*DataSourceCustom_Static)(nil), // 53: wg.cosmo.node.v1.DataSourceCustom_Static - (*ConfigurationVariable)(nil), // 54: wg.cosmo.node.v1.ConfigurationVariable - (*DirectiveConfiguration)(nil), // 55: wg.cosmo.node.v1.DirectiveConfiguration - (*URLQueryConfiguration)(nil), // 56: wg.cosmo.node.v1.URLQueryConfiguration - (*HTTPHeader)(nil), // 57: wg.cosmo.node.v1.HTTPHeader - (*MTLSConfiguration)(nil), // 58: wg.cosmo.node.v1.MTLSConfiguration - (*GraphQLSubscriptionConfiguration)(nil), // 59: wg.cosmo.node.v1.GraphQLSubscriptionConfiguration - (*GraphQLFederationConfiguration)(nil), // 60: wg.cosmo.node.v1.GraphQLFederationConfiguration - (*InternedString)(nil), // 61: wg.cosmo.node.v1.InternedString - (*SingleTypeField)(nil), // 62: wg.cosmo.node.v1.SingleTypeField - (*SubscriptionFieldCondition)(nil), // 63: wg.cosmo.node.v1.SubscriptionFieldCondition - (*SubscriptionFilterCondition)(nil), // 64: wg.cosmo.node.v1.SubscriptionFilterCondition - (*CacheWarmerOperations)(nil), // 65: wg.cosmo.node.v1.CacheWarmerOperations - (*Operation)(nil), // 66: wg.cosmo.node.v1.Operation - (*OperationRequest)(nil), // 67: wg.cosmo.node.v1.OperationRequest - (*Extension)(nil), // 68: wg.cosmo.node.v1.Extension - (*PersistedQuery)(nil), // 69: wg.cosmo.node.v1.PersistedQuery - (*ClientInfo)(nil), // 70: wg.cosmo.node.v1.ClientInfo - nil, // 71: wg.cosmo.node.v1.FeatureFlagRouterExecutionConfigs.ConfigByFeatureFlagNameEntry - nil, // 72: wg.cosmo.node.v1.EngineConfiguration.StringStorageEntry - nil, // 73: wg.cosmo.node.v1.FetchConfiguration.HeaderEntry - (common.EnumStatusCode)(0), // 74: wg.cosmo.common.EnumStatusCode - (common.GraphQLSubscriptionProtocol)(0), // 75: wg.cosmo.common.GraphQLSubscriptionProtocol - (common.GraphQLWebsocketSubprotocol)(0), // 76: wg.cosmo.common.GraphQLWebsocketSubprotocol + (*RequiredFieldMapping)(nil), // 42: wg.cosmo.node.v1.RequiredFieldMapping + (*TypeFieldMapping)(nil), // 43: wg.cosmo.node.v1.TypeFieldMapping + (*FieldMapping)(nil), // 44: wg.cosmo.node.v1.FieldMapping + (*ArgumentMapping)(nil), // 45: wg.cosmo.node.v1.ArgumentMapping + (*EnumMapping)(nil), // 46: wg.cosmo.node.v1.EnumMapping + (*EnumValueMapping)(nil), // 47: wg.cosmo.node.v1.EnumValueMapping + (*NatsStreamConfiguration)(nil), // 48: wg.cosmo.node.v1.NatsStreamConfiguration + (*NatsEventConfiguration)(nil), // 49: wg.cosmo.node.v1.NatsEventConfiguration + (*KafkaEventConfiguration)(nil), // 50: wg.cosmo.node.v1.KafkaEventConfiguration + (*RedisEventConfiguration)(nil), // 51: wg.cosmo.node.v1.RedisEventConfiguration + (*EngineEventConfiguration)(nil), // 52: wg.cosmo.node.v1.EngineEventConfiguration + (*DataSourceCustomEvents)(nil), // 53: wg.cosmo.node.v1.DataSourceCustomEvents + (*DataSourceCustom_Static)(nil), // 54: wg.cosmo.node.v1.DataSourceCustom_Static + (*ConfigurationVariable)(nil), // 55: wg.cosmo.node.v1.ConfigurationVariable + (*DirectiveConfiguration)(nil), // 56: wg.cosmo.node.v1.DirectiveConfiguration + (*URLQueryConfiguration)(nil), // 57: wg.cosmo.node.v1.URLQueryConfiguration + (*HTTPHeader)(nil), // 58: wg.cosmo.node.v1.HTTPHeader + (*MTLSConfiguration)(nil), // 59: wg.cosmo.node.v1.MTLSConfiguration + (*GraphQLSubscriptionConfiguration)(nil), // 60: wg.cosmo.node.v1.GraphQLSubscriptionConfiguration + (*GraphQLFederationConfiguration)(nil), // 61: wg.cosmo.node.v1.GraphQLFederationConfiguration + (*InternedString)(nil), // 62: wg.cosmo.node.v1.InternedString + (*SingleTypeField)(nil), // 63: wg.cosmo.node.v1.SingleTypeField + (*SubscriptionFieldCondition)(nil), // 64: wg.cosmo.node.v1.SubscriptionFieldCondition + (*SubscriptionFilterCondition)(nil), // 65: wg.cosmo.node.v1.SubscriptionFilterCondition + (*CacheWarmerOperations)(nil), // 66: wg.cosmo.node.v1.CacheWarmerOperations + (*Operation)(nil), // 67: wg.cosmo.node.v1.Operation + (*OperationRequest)(nil), // 68: wg.cosmo.node.v1.OperationRequest + (*Extension)(nil), // 69: wg.cosmo.node.v1.Extension + (*PersistedQuery)(nil), // 70: wg.cosmo.node.v1.PersistedQuery + (*ClientInfo)(nil), // 71: wg.cosmo.node.v1.ClientInfo + nil, // 72: wg.cosmo.node.v1.FeatureFlagRouterExecutionConfigs.ConfigByFeatureFlagNameEntry + nil, // 73: wg.cosmo.node.v1.EngineConfiguration.StringStorageEntry + nil, // 74: wg.cosmo.node.v1.FetchConfiguration.HeaderEntry + (common.EnumStatusCode)(0), // 75: wg.cosmo.common.EnumStatusCode + (common.GraphQLSubscriptionProtocol)(0), // 76: wg.cosmo.common.GraphQLSubscriptionProtocol + (common.GraphQLWebsocketSubprotocol)(0), // 77: wg.cosmo.common.GraphQLWebsocketSubprotocol } var file_wg_cosmo_node_v1_node_proto_depIdxs = []int32{ - 71, // 0: wg.cosmo.node.v1.FeatureFlagRouterExecutionConfigs.config_by_feature_flag_name:type_name -> wg.cosmo.node.v1.FeatureFlagRouterExecutionConfigs.ConfigByFeatureFlagNameEntry + 72, // 0: wg.cosmo.node.v1.FeatureFlagRouterExecutionConfigs.config_by_feature_flag_name:type_name -> wg.cosmo.node.v1.FeatureFlagRouterExecutionConfigs.ConfigByFeatureFlagNameEntry 18, // 1: wg.cosmo.node.v1.FeatureFlagRouterExecutionConfig.engine_config:type_name -> wg.cosmo.node.v1.EngineConfiguration 8, // 2: wg.cosmo.node.v1.FeatureFlagRouterExecutionConfig.subgraphs:type_name -> wg.cosmo.node.v1.Subgraph 18, // 3: wg.cosmo.node.v1.RouterConfig.engine_config:type_name -> wg.cosmo.node.v1.EngineConfiguration 8, // 4: wg.cosmo.node.v1.RouterConfig.subgraphs:type_name -> wg.cosmo.node.v1.Subgraph 9, // 5: wg.cosmo.node.v1.RouterConfig.feature_flag_configs:type_name -> wg.cosmo.node.v1.FeatureFlagRouterExecutionConfigs - 74, // 6: wg.cosmo.node.v1.Response.code:type_name -> wg.cosmo.common.EnumStatusCode + 75, // 6: wg.cosmo.node.v1.Response.code:type_name -> wg.cosmo.common.EnumStatusCode 15, // 7: wg.cosmo.node.v1.RegistrationInfo.account_limits:type_name -> wg.cosmo.node.v1.AccountLimits 12, // 8: wg.cosmo.node.v1.SelfRegisterResponse.response:type_name -> wg.cosmo.node.v1.Response 14, // 9: wg.cosmo.node.v1.SelfRegisterResponse.registrationInfo:type_name -> wg.cosmo.node.v1.RegistrationInfo 19, // 10: wg.cosmo.node.v1.EngineConfiguration.datasource_configurations:type_name -> wg.cosmo.node.v1.DataSourceConfiguration 23, // 11: wg.cosmo.node.v1.EngineConfiguration.field_configurations:type_name -> wg.cosmo.node.v1.FieldConfiguration 24, // 12: wg.cosmo.node.v1.EngineConfiguration.type_configurations:type_name -> wg.cosmo.node.v1.TypeConfiguration - 72, // 13: wg.cosmo.node.v1.EngineConfiguration.string_storage:type_name -> wg.cosmo.node.v1.EngineConfiguration.StringStorageEntry + 73, // 13: wg.cosmo.node.v1.EngineConfiguration.string_storage:type_name -> wg.cosmo.node.v1.EngineConfiguration.StringStorageEntry 2, // 14: wg.cosmo.node.v1.DataSourceConfiguration.kind:type_name -> wg.cosmo.node.v1.DataSourceKind 25, // 15: wg.cosmo.node.v1.DataSourceConfiguration.root_nodes:type_name -> wg.cosmo.node.v1.TypeField 25, // 16: wg.cosmo.node.v1.DataSourceConfiguration.child_nodes:type_name -> wg.cosmo.node.v1.TypeField 32, // 17: wg.cosmo.node.v1.DataSourceConfiguration.custom_graphql:type_name -> wg.cosmo.node.v1.DataSourceCustom_GraphQL - 53, // 18: wg.cosmo.node.v1.DataSourceConfiguration.custom_static:type_name -> wg.cosmo.node.v1.DataSourceCustom_Static - 55, // 19: wg.cosmo.node.v1.DataSourceConfiguration.directives:type_name -> wg.cosmo.node.v1.DirectiveConfiguration + 54, // 18: wg.cosmo.node.v1.DataSourceConfiguration.custom_static:type_name -> wg.cosmo.node.v1.DataSourceCustom_Static + 56, // 19: wg.cosmo.node.v1.DataSourceConfiguration.directives:type_name -> wg.cosmo.node.v1.DirectiveConfiguration 28, // 20: wg.cosmo.node.v1.DataSourceConfiguration.keys:type_name -> wg.cosmo.node.v1.RequiredField 28, // 21: wg.cosmo.node.v1.DataSourceConfiguration.provides:type_name -> wg.cosmo.node.v1.RequiredField 28, // 22: wg.cosmo.node.v1.DataSourceConfiguration.requires:type_name -> wg.cosmo.node.v1.RequiredField - 52, // 23: wg.cosmo.node.v1.DataSourceConfiguration.custom_events:type_name -> wg.cosmo.node.v1.DataSourceCustomEvents + 53, // 23: wg.cosmo.node.v1.DataSourceConfiguration.custom_events:type_name -> wg.cosmo.node.v1.DataSourceCustomEvents 29, // 24: wg.cosmo.node.v1.DataSourceConfiguration.entity_interfaces:type_name -> wg.cosmo.node.v1.EntityInterfaceConfiguration 29, // 25: wg.cosmo.node.v1.DataSourceConfiguration.interface_objects:type_name -> wg.cosmo.node.v1.EntityInterfaceConfiguration 1, // 26: wg.cosmo.node.v1.ArgumentConfiguration.source_type:type_name -> wg.cosmo.node.v1.ArgumentSource @@ -5433,73 +5534,75 @@ var file_wg_cosmo_node_v1_node_proto_depIdxs = []int32{ 21, // 28: wg.cosmo.node.v1.AuthorizationConfiguration.required_or_scopes_by_or:type_name -> wg.cosmo.node.v1.Scopes 20, // 29: wg.cosmo.node.v1.FieldConfiguration.arguments_configuration:type_name -> wg.cosmo.node.v1.ArgumentConfiguration 22, // 30: wg.cosmo.node.v1.FieldConfiguration.authorization_configuration:type_name -> wg.cosmo.node.v1.AuthorizationConfiguration - 64, // 31: wg.cosmo.node.v1.FieldConfiguration.subscription_filter_condition:type_name -> wg.cosmo.node.v1.SubscriptionFilterCondition + 65, // 31: wg.cosmo.node.v1.FieldConfiguration.subscription_filter_condition:type_name -> wg.cosmo.node.v1.SubscriptionFilterCondition 26, // 32: wg.cosmo.node.v1.FieldSetCondition.field_coordinates_path:type_name -> wg.cosmo.node.v1.FieldCoordinates 27, // 33: wg.cosmo.node.v1.RequiredField.conditions:type_name -> wg.cosmo.node.v1.FieldSetCondition - 54, // 34: wg.cosmo.node.v1.FetchConfiguration.url:type_name -> wg.cosmo.node.v1.ConfigurationVariable + 55, // 34: wg.cosmo.node.v1.FetchConfiguration.url:type_name -> wg.cosmo.node.v1.ConfigurationVariable 7, // 35: wg.cosmo.node.v1.FetchConfiguration.method:type_name -> wg.cosmo.node.v1.HTTPMethod - 73, // 36: wg.cosmo.node.v1.FetchConfiguration.header:type_name -> wg.cosmo.node.v1.FetchConfiguration.HeaderEntry - 54, // 37: wg.cosmo.node.v1.FetchConfiguration.body:type_name -> wg.cosmo.node.v1.ConfigurationVariable - 56, // 38: wg.cosmo.node.v1.FetchConfiguration.query:type_name -> wg.cosmo.node.v1.URLQueryConfiguration - 58, // 39: wg.cosmo.node.v1.FetchConfiguration.mtls:type_name -> wg.cosmo.node.v1.MTLSConfiguration - 54, // 40: wg.cosmo.node.v1.FetchConfiguration.base_url:type_name -> wg.cosmo.node.v1.ConfigurationVariable - 54, // 41: wg.cosmo.node.v1.FetchConfiguration.path:type_name -> wg.cosmo.node.v1.ConfigurationVariable - 54, // 42: wg.cosmo.node.v1.FetchConfiguration.http_proxy_url:type_name -> wg.cosmo.node.v1.ConfigurationVariable + 74, // 36: wg.cosmo.node.v1.FetchConfiguration.header:type_name -> wg.cosmo.node.v1.FetchConfiguration.HeaderEntry + 55, // 37: wg.cosmo.node.v1.FetchConfiguration.body:type_name -> wg.cosmo.node.v1.ConfigurationVariable + 57, // 38: wg.cosmo.node.v1.FetchConfiguration.query:type_name -> wg.cosmo.node.v1.URLQueryConfiguration + 59, // 39: wg.cosmo.node.v1.FetchConfiguration.mtls:type_name -> wg.cosmo.node.v1.MTLSConfiguration + 55, // 40: wg.cosmo.node.v1.FetchConfiguration.base_url:type_name -> wg.cosmo.node.v1.ConfigurationVariable + 55, // 41: wg.cosmo.node.v1.FetchConfiguration.path:type_name -> wg.cosmo.node.v1.ConfigurationVariable + 55, // 42: wg.cosmo.node.v1.FetchConfiguration.http_proxy_url:type_name -> wg.cosmo.node.v1.ConfigurationVariable 30, // 43: wg.cosmo.node.v1.DataSourceCustom_GraphQL.fetch:type_name -> wg.cosmo.node.v1.FetchConfiguration - 59, // 44: wg.cosmo.node.v1.DataSourceCustom_GraphQL.subscription:type_name -> wg.cosmo.node.v1.GraphQLSubscriptionConfiguration - 60, // 45: wg.cosmo.node.v1.DataSourceCustom_GraphQL.federation:type_name -> wg.cosmo.node.v1.GraphQLFederationConfiguration - 61, // 46: wg.cosmo.node.v1.DataSourceCustom_GraphQL.upstream_schema:type_name -> wg.cosmo.node.v1.InternedString - 62, // 47: wg.cosmo.node.v1.DataSourceCustom_GraphQL.custom_scalar_type_fields:type_name -> wg.cosmo.node.v1.SingleTypeField + 60, // 44: wg.cosmo.node.v1.DataSourceCustom_GraphQL.subscription:type_name -> wg.cosmo.node.v1.GraphQLSubscriptionConfiguration + 61, // 45: wg.cosmo.node.v1.DataSourceCustom_GraphQL.federation:type_name -> wg.cosmo.node.v1.GraphQLFederationConfiguration + 62, // 46: wg.cosmo.node.v1.DataSourceCustom_GraphQL.upstream_schema:type_name -> wg.cosmo.node.v1.InternedString + 63, // 47: wg.cosmo.node.v1.DataSourceCustom_GraphQL.custom_scalar_type_fields:type_name -> wg.cosmo.node.v1.SingleTypeField 33, // 48: wg.cosmo.node.v1.DataSourceCustom_GraphQL.grpc:type_name -> wg.cosmo.node.v1.GRPCConfiguration 37, // 49: wg.cosmo.node.v1.GRPCConfiguration.mapping:type_name -> wg.cosmo.node.v1.GRPCMapping 35, // 50: wg.cosmo.node.v1.GRPCConfiguration.plugin:type_name -> wg.cosmo.node.v1.PluginConfiguration 34, // 51: wg.cosmo.node.v1.PluginConfiguration.image_reference:type_name -> wg.cosmo.node.v1.ImageReference 40, // 52: wg.cosmo.node.v1.GRPCMapping.operation_mappings:type_name -> wg.cosmo.node.v1.OperationMapping 41, // 53: wg.cosmo.node.v1.GRPCMapping.entity_mappings:type_name -> wg.cosmo.node.v1.EntityMapping - 42, // 54: wg.cosmo.node.v1.GRPCMapping.type_field_mappings:type_name -> wg.cosmo.node.v1.TypeFieldMapping - 45, // 55: wg.cosmo.node.v1.GRPCMapping.enum_mappings:type_name -> wg.cosmo.node.v1.EnumMapping + 43, // 54: wg.cosmo.node.v1.GRPCMapping.type_field_mappings:type_name -> wg.cosmo.node.v1.TypeFieldMapping + 46, // 55: wg.cosmo.node.v1.GRPCMapping.enum_mappings:type_name -> wg.cosmo.node.v1.EnumMapping 38, // 56: wg.cosmo.node.v1.GRPCMapping.resolve_mappings:type_name -> wg.cosmo.node.v1.LookupMapping 3, // 57: wg.cosmo.node.v1.LookupMapping.type:type_name -> wg.cosmo.node.v1.LookupType 39, // 58: wg.cosmo.node.v1.LookupMapping.lookup_mapping:type_name -> wg.cosmo.node.v1.LookupFieldMapping - 43, // 59: wg.cosmo.node.v1.LookupFieldMapping.field_mapping:type_name -> wg.cosmo.node.v1.FieldMapping + 44, // 59: wg.cosmo.node.v1.LookupFieldMapping.field_mapping:type_name -> wg.cosmo.node.v1.FieldMapping 4, // 60: wg.cosmo.node.v1.OperationMapping.type:type_name -> wg.cosmo.node.v1.OperationType - 43, // 61: wg.cosmo.node.v1.TypeFieldMapping.field_mappings:type_name -> wg.cosmo.node.v1.FieldMapping - 44, // 62: wg.cosmo.node.v1.FieldMapping.argument_mappings:type_name -> wg.cosmo.node.v1.ArgumentMapping - 46, // 63: wg.cosmo.node.v1.EnumMapping.values:type_name -> wg.cosmo.node.v1.EnumValueMapping - 51, // 64: wg.cosmo.node.v1.NatsEventConfiguration.engine_event_configuration:type_name -> wg.cosmo.node.v1.EngineEventConfiguration - 47, // 65: wg.cosmo.node.v1.NatsEventConfiguration.stream_configuration:type_name -> wg.cosmo.node.v1.NatsStreamConfiguration - 51, // 66: wg.cosmo.node.v1.KafkaEventConfiguration.engine_event_configuration:type_name -> wg.cosmo.node.v1.EngineEventConfiguration - 51, // 67: wg.cosmo.node.v1.RedisEventConfiguration.engine_event_configuration:type_name -> wg.cosmo.node.v1.EngineEventConfiguration - 5, // 68: wg.cosmo.node.v1.EngineEventConfiguration.type:type_name -> wg.cosmo.node.v1.EventType - 48, // 69: wg.cosmo.node.v1.DataSourceCustomEvents.nats:type_name -> wg.cosmo.node.v1.NatsEventConfiguration - 49, // 70: wg.cosmo.node.v1.DataSourceCustomEvents.kafka:type_name -> wg.cosmo.node.v1.KafkaEventConfiguration - 50, // 71: wg.cosmo.node.v1.DataSourceCustomEvents.redis:type_name -> wg.cosmo.node.v1.RedisEventConfiguration - 54, // 72: wg.cosmo.node.v1.DataSourceCustom_Static.data:type_name -> wg.cosmo.node.v1.ConfigurationVariable - 6, // 73: wg.cosmo.node.v1.ConfigurationVariable.kind:type_name -> wg.cosmo.node.v1.ConfigurationVariableKind - 54, // 74: wg.cosmo.node.v1.HTTPHeader.values:type_name -> wg.cosmo.node.v1.ConfigurationVariable - 54, // 75: wg.cosmo.node.v1.MTLSConfiguration.key:type_name -> wg.cosmo.node.v1.ConfigurationVariable - 54, // 76: wg.cosmo.node.v1.MTLSConfiguration.cert:type_name -> wg.cosmo.node.v1.ConfigurationVariable - 54, // 77: wg.cosmo.node.v1.GraphQLSubscriptionConfiguration.url:type_name -> wg.cosmo.node.v1.ConfigurationVariable - 75, // 78: wg.cosmo.node.v1.GraphQLSubscriptionConfiguration.protocol:type_name -> wg.cosmo.common.GraphQLSubscriptionProtocol - 76, // 79: wg.cosmo.node.v1.GraphQLSubscriptionConfiguration.websocketSubprotocol:type_name -> wg.cosmo.common.GraphQLWebsocketSubprotocol - 64, // 80: wg.cosmo.node.v1.SubscriptionFilterCondition.and:type_name -> wg.cosmo.node.v1.SubscriptionFilterCondition - 63, // 81: wg.cosmo.node.v1.SubscriptionFilterCondition.in:type_name -> wg.cosmo.node.v1.SubscriptionFieldCondition - 64, // 82: wg.cosmo.node.v1.SubscriptionFilterCondition.not:type_name -> wg.cosmo.node.v1.SubscriptionFilterCondition - 64, // 83: wg.cosmo.node.v1.SubscriptionFilterCondition.or:type_name -> wg.cosmo.node.v1.SubscriptionFilterCondition - 66, // 84: wg.cosmo.node.v1.CacheWarmerOperations.operations:type_name -> wg.cosmo.node.v1.Operation - 67, // 85: wg.cosmo.node.v1.Operation.request:type_name -> wg.cosmo.node.v1.OperationRequest - 70, // 86: wg.cosmo.node.v1.Operation.client:type_name -> wg.cosmo.node.v1.ClientInfo - 68, // 87: wg.cosmo.node.v1.OperationRequest.extensions:type_name -> wg.cosmo.node.v1.Extension - 69, // 88: wg.cosmo.node.v1.Extension.persisted_query:type_name -> wg.cosmo.node.v1.PersistedQuery - 10, // 89: wg.cosmo.node.v1.FeatureFlagRouterExecutionConfigs.ConfigByFeatureFlagNameEntry.value:type_name -> wg.cosmo.node.v1.FeatureFlagRouterExecutionConfig - 57, // 90: wg.cosmo.node.v1.FetchConfiguration.HeaderEntry.value:type_name -> wg.cosmo.node.v1.HTTPHeader - 16, // 91: wg.cosmo.node.v1.NodeService.SelfRegister:input_type -> wg.cosmo.node.v1.SelfRegisterRequest - 17, // 92: wg.cosmo.node.v1.NodeService.SelfRegister:output_type -> wg.cosmo.node.v1.SelfRegisterResponse - 92, // [92:93] is the sub-list for method output_type - 91, // [91:92] is the sub-list for method input_type - 91, // [91:91] is the sub-list for extension type_name - 91, // [91:91] is the sub-list for extension extendee - 0, // [0:91] is the sub-list for field type_name + 42, // 61: wg.cosmo.node.v1.EntityMapping.required_field_mappings:type_name -> wg.cosmo.node.v1.RequiredFieldMapping + 44, // 62: wg.cosmo.node.v1.RequiredFieldMapping.field_mapping:type_name -> wg.cosmo.node.v1.FieldMapping + 44, // 63: wg.cosmo.node.v1.TypeFieldMapping.field_mappings:type_name -> wg.cosmo.node.v1.FieldMapping + 45, // 64: wg.cosmo.node.v1.FieldMapping.argument_mappings:type_name -> wg.cosmo.node.v1.ArgumentMapping + 47, // 65: wg.cosmo.node.v1.EnumMapping.values:type_name -> wg.cosmo.node.v1.EnumValueMapping + 52, // 66: wg.cosmo.node.v1.NatsEventConfiguration.engine_event_configuration:type_name -> wg.cosmo.node.v1.EngineEventConfiguration + 48, // 67: wg.cosmo.node.v1.NatsEventConfiguration.stream_configuration:type_name -> wg.cosmo.node.v1.NatsStreamConfiguration + 52, // 68: wg.cosmo.node.v1.KafkaEventConfiguration.engine_event_configuration:type_name -> wg.cosmo.node.v1.EngineEventConfiguration + 52, // 69: wg.cosmo.node.v1.RedisEventConfiguration.engine_event_configuration:type_name -> wg.cosmo.node.v1.EngineEventConfiguration + 5, // 70: wg.cosmo.node.v1.EngineEventConfiguration.type:type_name -> wg.cosmo.node.v1.EventType + 49, // 71: wg.cosmo.node.v1.DataSourceCustomEvents.nats:type_name -> wg.cosmo.node.v1.NatsEventConfiguration + 50, // 72: wg.cosmo.node.v1.DataSourceCustomEvents.kafka:type_name -> wg.cosmo.node.v1.KafkaEventConfiguration + 51, // 73: wg.cosmo.node.v1.DataSourceCustomEvents.redis:type_name -> wg.cosmo.node.v1.RedisEventConfiguration + 55, // 74: wg.cosmo.node.v1.DataSourceCustom_Static.data:type_name -> wg.cosmo.node.v1.ConfigurationVariable + 6, // 75: wg.cosmo.node.v1.ConfigurationVariable.kind:type_name -> wg.cosmo.node.v1.ConfigurationVariableKind + 55, // 76: wg.cosmo.node.v1.HTTPHeader.values:type_name -> wg.cosmo.node.v1.ConfigurationVariable + 55, // 77: wg.cosmo.node.v1.MTLSConfiguration.key:type_name -> wg.cosmo.node.v1.ConfigurationVariable + 55, // 78: wg.cosmo.node.v1.MTLSConfiguration.cert:type_name -> wg.cosmo.node.v1.ConfigurationVariable + 55, // 79: wg.cosmo.node.v1.GraphQLSubscriptionConfiguration.url:type_name -> wg.cosmo.node.v1.ConfigurationVariable + 76, // 80: wg.cosmo.node.v1.GraphQLSubscriptionConfiguration.protocol:type_name -> wg.cosmo.common.GraphQLSubscriptionProtocol + 77, // 81: wg.cosmo.node.v1.GraphQLSubscriptionConfiguration.websocketSubprotocol:type_name -> wg.cosmo.common.GraphQLWebsocketSubprotocol + 65, // 82: wg.cosmo.node.v1.SubscriptionFilterCondition.and:type_name -> wg.cosmo.node.v1.SubscriptionFilterCondition + 64, // 83: wg.cosmo.node.v1.SubscriptionFilterCondition.in:type_name -> wg.cosmo.node.v1.SubscriptionFieldCondition + 65, // 84: wg.cosmo.node.v1.SubscriptionFilterCondition.not:type_name -> wg.cosmo.node.v1.SubscriptionFilterCondition + 65, // 85: wg.cosmo.node.v1.SubscriptionFilterCondition.or:type_name -> wg.cosmo.node.v1.SubscriptionFilterCondition + 67, // 86: wg.cosmo.node.v1.CacheWarmerOperations.operations:type_name -> wg.cosmo.node.v1.Operation + 68, // 87: wg.cosmo.node.v1.Operation.request:type_name -> wg.cosmo.node.v1.OperationRequest + 71, // 88: wg.cosmo.node.v1.Operation.client:type_name -> wg.cosmo.node.v1.ClientInfo + 69, // 89: wg.cosmo.node.v1.OperationRequest.extensions:type_name -> wg.cosmo.node.v1.Extension + 70, // 90: wg.cosmo.node.v1.Extension.persisted_query:type_name -> wg.cosmo.node.v1.PersistedQuery + 10, // 91: wg.cosmo.node.v1.FeatureFlagRouterExecutionConfigs.ConfigByFeatureFlagNameEntry.value:type_name -> wg.cosmo.node.v1.FeatureFlagRouterExecutionConfig + 58, // 92: wg.cosmo.node.v1.FetchConfiguration.HeaderEntry.value:type_name -> wg.cosmo.node.v1.HTTPHeader + 16, // 93: wg.cosmo.node.v1.NodeService.SelfRegister:input_type -> wg.cosmo.node.v1.SelfRegisterRequest + 17, // 94: wg.cosmo.node.v1.NodeService.SelfRegister:output_type -> wg.cosmo.node.v1.SelfRegisterResponse + 94, // [94:95] is the sub-list for method output_type + 93, // [93:94] is the sub-list for method input_type + 93, // [93:93] is the sub-list for extension type_name + 93, // [93:93] is the sub-list for extension extendee + 0, // [0:93] is the sub-list for field type_name } func init() { file_wg_cosmo_node_v1_node_proto_init() } @@ -5917,7 +6020,7 @@ func file_wg_cosmo_node_v1_node_proto_init() { } } file_wg_cosmo_node_v1_node_proto_msgTypes[34].Exporter = func(v any, i int) any { - switch v := v.(*TypeFieldMapping); i { + switch v := v.(*RequiredFieldMapping); i { case 0: return &v.state case 1: @@ -5929,7 +6032,7 @@ func file_wg_cosmo_node_v1_node_proto_init() { } } file_wg_cosmo_node_v1_node_proto_msgTypes[35].Exporter = func(v any, i int) any { - switch v := v.(*FieldMapping); i { + switch v := v.(*TypeFieldMapping); i { case 0: return &v.state case 1: @@ -5941,7 +6044,7 @@ func file_wg_cosmo_node_v1_node_proto_init() { } } file_wg_cosmo_node_v1_node_proto_msgTypes[36].Exporter = func(v any, i int) any { - switch v := v.(*ArgumentMapping); i { + switch v := v.(*FieldMapping); i { case 0: return &v.state case 1: @@ -5953,7 +6056,7 @@ func file_wg_cosmo_node_v1_node_proto_init() { } } file_wg_cosmo_node_v1_node_proto_msgTypes[37].Exporter = func(v any, i int) any { - switch v := v.(*EnumMapping); i { + switch v := v.(*ArgumentMapping); i { case 0: return &v.state case 1: @@ -5965,7 +6068,7 @@ func file_wg_cosmo_node_v1_node_proto_init() { } } file_wg_cosmo_node_v1_node_proto_msgTypes[38].Exporter = func(v any, i int) any { - switch v := v.(*EnumValueMapping); i { + switch v := v.(*EnumMapping); i { case 0: return &v.state case 1: @@ -5977,7 +6080,7 @@ func file_wg_cosmo_node_v1_node_proto_init() { } } file_wg_cosmo_node_v1_node_proto_msgTypes[39].Exporter = func(v any, i int) any { - switch v := v.(*NatsStreamConfiguration); i { + switch v := v.(*EnumValueMapping); i { case 0: return &v.state case 1: @@ -5989,7 +6092,7 @@ func file_wg_cosmo_node_v1_node_proto_init() { } } file_wg_cosmo_node_v1_node_proto_msgTypes[40].Exporter = func(v any, i int) any { - switch v := v.(*NatsEventConfiguration); i { + switch v := v.(*NatsStreamConfiguration); i { case 0: return &v.state case 1: @@ -6001,7 +6104,7 @@ func file_wg_cosmo_node_v1_node_proto_init() { } } file_wg_cosmo_node_v1_node_proto_msgTypes[41].Exporter = func(v any, i int) any { - switch v := v.(*KafkaEventConfiguration); i { + switch v := v.(*NatsEventConfiguration); i { case 0: return &v.state case 1: @@ -6013,7 +6116,7 @@ func file_wg_cosmo_node_v1_node_proto_init() { } } file_wg_cosmo_node_v1_node_proto_msgTypes[42].Exporter = func(v any, i int) any { - switch v := v.(*RedisEventConfiguration); i { + switch v := v.(*KafkaEventConfiguration); i { case 0: return &v.state case 1: @@ -6025,7 +6128,7 @@ func file_wg_cosmo_node_v1_node_proto_init() { } } file_wg_cosmo_node_v1_node_proto_msgTypes[43].Exporter = func(v any, i int) any { - switch v := v.(*EngineEventConfiguration); i { + switch v := v.(*RedisEventConfiguration); i { case 0: return &v.state case 1: @@ -6037,7 +6140,7 @@ func file_wg_cosmo_node_v1_node_proto_init() { } } file_wg_cosmo_node_v1_node_proto_msgTypes[44].Exporter = func(v any, i int) any { - switch v := v.(*DataSourceCustomEvents); i { + switch v := v.(*EngineEventConfiguration); i { case 0: return &v.state case 1: @@ -6049,7 +6152,7 @@ func file_wg_cosmo_node_v1_node_proto_init() { } } file_wg_cosmo_node_v1_node_proto_msgTypes[45].Exporter = func(v any, i int) any { - switch v := v.(*DataSourceCustom_Static); i { + switch v := v.(*DataSourceCustomEvents); i { case 0: return &v.state case 1: @@ -6061,7 +6164,7 @@ func file_wg_cosmo_node_v1_node_proto_init() { } } file_wg_cosmo_node_v1_node_proto_msgTypes[46].Exporter = func(v any, i int) any { - switch v := v.(*ConfigurationVariable); i { + switch v := v.(*DataSourceCustom_Static); i { case 0: return &v.state case 1: @@ -6073,7 +6176,7 @@ func file_wg_cosmo_node_v1_node_proto_init() { } } file_wg_cosmo_node_v1_node_proto_msgTypes[47].Exporter = func(v any, i int) any { - switch v := v.(*DirectiveConfiguration); i { + switch v := v.(*ConfigurationVariable); i { case 0: return &v.state case 1: @@ -6085,7 +6188,7 @@ func file_wg_cosmo_node_v1_node_proto_init() { } } file_wg_cosmo_node_v1_node_proto_msgTypes[48].Exporter = func(v any, i int) any { - switch v := v.(*URLQueryConfiguration); i { + switch v := v.(*DirectiveConfiguration); i { case 0: return &v.state case 1: @@ -6097,7 +6200,7 @@ func file_wg_cosmo_node_v1_node_proto_init() { } } file_wg_cosmo_node_v1_node_proto_msgTypes[49].Exporter = func(v any, i int) any { - switch v := v.(*HTTPHeader); i { + switch v := v.(*URLQueryConfiguration); i { case 0: return &v.state case 1: @@ -6109,7 +6212,7 @@ func file_wg_cosmo_node_v1_node_proto_init() { } } file_wg_cosmo_node_v1_node_proto_msgTypes[50].Exporter = func(v any, i int) any { - switch v := v.(*MTLSConfiguration); i { + switch v := v.(*HTTPHeader); i { case 0: return &v.state case 1: @@ -6121,7 +6224,7 @@ func file_wg_cosmo_node_v1_node_proto_init() { } } file_wg_cosmo_node_v1_node_proto_msgTypes[51].Exporter = func(v any, i int) any { - switch v := v.(*GraphQLSubscriptionConfiguration); i { + switch v := v.(*MTLSConfiguration); i { case 0: return &v.state case 1: @@ -6133,7 +6236,7 @@ func file_wg_cosmo_node_v1_node_proto_init() { } } file_wg_cosmo_node_v1_node_proto_msgTypes[52].Exporter = func(v any, i int) any { - switch v := v.(*GraphQLFederationConfiguration); i { + switch v := v.(*GraphQLSubscriptionConfiguration); i { case 0: return &v.state case 1: @@ -6145,7 +6248,7 @@ func file_wg_cosmo_node_v1_node_proto_init() { } } file_wg_cosmo_node_v1_node_proto_msgTypes[53].Exporter = func(v any, i int) any { - switch v := v.(*InternedString); i { + switch v := v.(*GraphQLFederationConfiguration); i { case 0: return &v.state case 1: @@ -6157,7 +6260,7 @@ func file_wg_cosmo_node_v1_node_proto_init() { } } file_wg_cosmo_node_v1_node_proto_msgTypes[54].Exporter = func(v any, i int) any { - switch v := v.(*SingleTypeField); i { + switch v := v.(*InternedString); i { case 0: return &v.state case 1: @@ -6169,7 +6272,7 @@ func file_wg_cosmo_node_v1_node_proto_init() { } } file_wg_cosmo_node_v1_node_proto_msgTypes[55].Exporter = func(v any, i int) any { - switch v := v.(*SubscriptionFieldCondition); i { + switch v := v.(*SingleTypeField); i { case 0: return &v.state case 1: @@ -6181,7 +6284,7 @@ func file_wg_cosmo_node_v1_node_proto_init() { } } file_wg_cosmo_node_v1_node_proto_msgTypes[56].Exporter = func(v any, i int) any { - switch v := v.(*SubscriptionFilterCondition); i { + switch v := v.(*SubscriptionFieldCondition); i { case 0: return &v.state case 1: @@ -6193,7 +6296,7 @@ func file_wg_cosmo_node_v1_node_proto_init() { } } file_wg_cosmo_node_v1_node_proto_msgTypes[57].Exporter = func(v any, i int) any { - switch v := v.(*CacheWarmerOperations); i { + switch v := v.(*SubscriptionFilterCondition); i { case 0: return &v.state case 1: @@ -6205,7 +6308,7 @@ func file_wg_cosmo_node_v1_node_proto_init() { } } file_wg_cosmo_node_v1_node_proto_msgTypes[58].Exporter = func(v any, i int) any { - switch v := v.(*Operation); i { + switch v := v.(*CacheWarmerOperations); i { case 0: return &v.state case 1: @@ -6217,7 +6320,7 @@ func file_wg_cosmo_node_v1_node_proto_init() { } } file_wg_cosmo_node_v1_node_proto_msgTypes[59].Exporter = func(v any, i int) any { - switch v := v.(*OperationRequest); i { + switch v := v.(*Operation); i { case 0: return &v.state case 1: @@ -6229,7 +6332,7 @@ func file_wg_cosmo_node_v1_node_proto_init() { } } file_wg_cosmo_node_v1_node_proto_msgTypes[60].Exporter = func(v any, i int) any { - switch v := v.(*Extension); i { + switch v := v.(*OperationRequest); i { case 0: return &v.state case 1: @@ -6241,7 +6344,7 @@ func file_wg_cosmo_node_v1_node_proto_init() { } } file_wg_cosmo_node_v1_node_proto_msgTypes[61].Exporter = func(v any, i int) any { - switch v := v.(*PersistedQuery); i { + switch v := v.(*Extension); i { case 0: return &v.state case 1: @@ -6253,6 +6356,18 @@ func file_wg_cosmo_node_v1_node_proto_init() { } } file_wg_cosmo_node_v1_node_proto_msgTypes[62].Exporter = func(v any, i int) any { + switch v := v.(*PersistedQuery); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_wg_cosmo_node_v1_node_proto_msgTypes[63].Exporter = func(v any, i int) any { switch v := v.(*ClientInfo); i { case 0: return &v.state @@ -6272,15 +6387,15 @@ func file_wg_cosmo_node_v1_node_proto_init() { file_wg_cosmo_node_v1_node_proto_msgTypes[15].OneofWrappers = []any{} file_wg_cosmo_node_v1_node_proto_msgTypes[22].OneofWrappers = []any{} file_wg_cosmo_node_v1_node_proto_msgTypes[27].OneofWrappers = []any{} - file_wg_cosmo_node_v1_node_proto_msgTypes[51].OneofWrappers = []any{} - file_wg_cosmo_node_v1_node_proto_msgTypes[56].OneofWrappers = []any{} + file_wg_cosmo_node_v1_node_proto_msgTypes[52].OneofWrappers = []any{} + file_wg_cosmo_node_v1_node_proto_msgTypes[57].OneofWrappers = []any{} type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_wg_cosmo_node_v1_node_proto_rawDesc, NumEnums: 8, - NumMessages: 66, + NumMessages: 67, NumExtensions: 0, NumServices: 1, }, diff --git a/connect/src/wg/cosmo/node/v1/node_pb.ts b/connect/src/wg/cosmo/node/v1/node_pb.ts index c13e62f9b8..8639a63a48 100644 --- a/connect/src/wg/cosmo/node/v1/node_pb.ts +++ b/connect/src/wg/cosmo/node/v1/node_pb.ts @@ -2095,6 +2095,13 @@ export class EntityMapping extends Message { */ response = ""; + /** + * Mappings for required fields + * + * @generated from field: repeated wg.cosmo.node.v1.RequiredFieldMapping required_field_mappings = 7; + */ + requiredFieldMappings: RequiredFieldMapping[] = []; + constructor(data?: PartialMessage) { super(); proto3.util.initPartial(data, this); @@ -2109,6 +2116,7 @@ export class EntityMapping extends Message { { no: 4, name: "rpc", kind: "scalar", T: 9 /* ScalarType.STRING */ }, { no: 5, name: "request", kind: "scalar", T: 9 /* ScalarType.STRING */ }, { no: 6, name: "response", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + { no: 7, name: "required_field_mappings", kind: "message", T: RequiredFieldMapping, repeated: true }, ]); static fromBinary(bytes: Uint8Array, options?: Partial): EntityMapping { @@ -2128,6 +2136,69 @@ export class EntityMapping extends Message { } } +/** + * Defines mapping for required fields + * + * @generated from message wg.cosmo.node.v1.RequiredFieldMapping + */ +export class RequiredFieldMapping extends Message { + /** + * @generated from field: wg.cosmo.node.v1.FieldMapping field_mapping = 1; + */ + fieldMapping?: FieldMapping; + + /** + * Mapped gRPC method name + * + * @generated from field: string rpc = 2; + */ + rpc = ""; + + /** + * gRPC request message type name + * + * @generated from field: string request = 3; + */ + request = ""; + + /** + * gRPC response message type name + * + * @generated from field: string response = 4; + */ + response = ""; + + constructor(data?: PartialMessage) { + super(); + proto3.util.initPartial(data, this); + } + + static readonly runtime: typeof proto3 = proto3; + static readonly typeName = "wg.cosmo.node.v1.RequiredFieldMapping"; + static readonly fields: FieldList = proto3.util.newFieldList(() => [ + { no: 1, name: "field_mapping", kind: "message", T: FieldMapping }, + { no: 2, name: "rpc", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + { no: 3, name: "request", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + { no: 4, name: "response", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + ]); + + static fromBinary(bytes: Uint8Array, options?: Partial): RequiredFieldMapping { + return new RequiredFieldMapping().fromBinary(bytes, options); + } + + static fromJson(jsonValue: JsonValue, options?: Partial): RequiredFieldMapping { + return new RequiredFieldMapping().fromJson(jsonValue, options); + } + + static fromJsonString(jsonString: string, options?: Partial): RequiredFieldMapping { + return new RequiredFieldMapping().fromJsonString(jsonString, options); + } + + static equals(a: RequiredFieldMapping | PlainMessage | undefined, b: RequiredFieldMapping | PlainMessage | undefined): boolean { + return proto3.util.equals(RequiredFieldMapping, a, b); + } +} + /** * Defines mapping between GraphQL type fields and gRPC message fields * diff --git a/proto/wg/cosmo/node/v1/node.proto b/proto/wg/cosmo/node/v1/node.proto index 45c5ff0d8b..c94315281f 100644 --- a/proto/wg/cosmo/node/v1/node.proto +++ b/proto/wg/cosmo/node/v1/node.proto @@ -316,6 +316,19 @@ message EntityMapping { string request = 5; // gRPC response message type name string response = 6; + // Mappings for required fields + repeated RequiredFieldMapping required_field_mappings = 7; +} + +// Defines mapping for required fields +message RequiredFieldMapping { + FieldMapping field_mapping = 1; + // Mapped gRPC method name + string rpc = 2; + // gRPC request message type name + string request = 3; + // gRPC response message type name + string response = 4; } // Defines mapping between GraphQL type fields and gRPC message fields diff --git a/protographic/src/abstract-selection-rewriter.ts b/protographic/src/abstract-selection-rewriter.ts new file mode 100644 index 0000000000..59d8b79de6 --- /dev/null +++ b/protographic/src/abstract-selection-rewriter.ts @@ -0,0 +1,108 @@ +import { + ASTVisitor, + DocumentNode, + GraphQLSchema, + GraphQLObjectType, + visit, + SelectionSetNode, + isInterfaceType, + Kind, + FieldNode, + ASTNode, + GraphQLField, + GraphQLType, + getNamedType, +} from 'graphql'; +import { VisitContext } from './types'; + +// TODO: The full functionality will be implemented in the second iteration. +/** + * AbstractSelectionRewriter is a visitor implementation that normalizes an operation document + * by rewriting abstract type selections for interfaces to the concrete types. + * + * This normalizes the operation and allows us to determine the proper types needed to generate proto messages. + * + */ +export class AbstractSelectionRewriter { + private readonly visitor: ASTVisitor; + private readonly fieldSetDoc: DocumentNode; + public readonly schema: GraphQLSchema; + private normalizedFiedSetDoc: DocumentNode | undefined; + + private ancestors: GraphQLObjectType[] = []; + private currentType: GraphQLObjectType; + + constructor(fieldSetDoc: DocumentNode, schema: GraphQLSchema, objectType: GraphQLObjectType) { + this.fieldSetDoc = fieldSetDoc; + this.schema = schema; + this.currentType = objectType; + this.visitor = this.createASTVisitor(); + } + + private createASTVisitor(): ASTVisitor { + return { + SelectionSet: { + enter: (node, key, parent, path, ancestors) => { + this.onEnterSelectionSet({ node, key, parent, path, ancestors }); + }, + }, + }; + } + + public normalize(): void { + visit(this.fieldSetDoc, this.visitor); + } + + private onEnterSelectionSet(ctx: VisitContext): void { + if (!ctx.parent) return; + if (!this.isFieldNode(ctx.parent)) return; + + const currentType = this.findNamedTypeForField(ctx.parent.name.value); + if (!currentType) return; + + if (!isInterfaceType(currentType)) { + return; + } + + const fields = ctx.node.selections.filter((s) => s.kind === Kind.FIELD); + const inlineFragments = ctx.node.selections.filter((s) => s.kind === Kind.INLINE_FRAGMENT); + + // remove the fields from the selection set. + ctx.node.selections = [...inlineFragments]; + + for (const fragment of inlineFragments) { + const normalizedFields = fragment.selectionSet.selections.filter((s) => s.kind === Kind.FIELD) ?? []; + + for (const field of fields) { + if (this.hasField(normalizedFields, field.name.value)) { + continue; + } + + normalizedFields.unshift(field); + } + + fragment.selectionSet.selections = [...normalizedFields]; + } + } + + private hasField(fields: FieldNode[], fieldName: string): boolean { + return fields.some((f) => f.name.value === fieldName); + } + + private isFieldNode(node: ASTNode | ReadonlyArray): node is FieldNode { + if (Array.isArray(node)) return false; + return (node as ASTNode).kind === Kind.FIELD; + } + + private fieldDefinition(fieldName: string): GraphQLField | undefined { + return this.currentType.getFields()[fieldName]; + } + + private findNamedTypeForField(fieldName: string): GraphQLType | undefined { + const fields = this.currentType.getFields(); + const field = fields[fieldName]; + if (!field) return undefined; + + return getNamedType(field.type); + } +} diff --git a/protographic/src/index.ts b/protographic/src/index.ts index bfeffb6b04..2101cc85c6 100644 --- a/protographic/src/index.ts +++ b/protographic/src/index.ts @@ -92,6 +92,7 @@ export function validateGraphQLSDL(sdl: string): ValidationResult { export * from './sdl-to-mapping-visitor.js'; export { GraphQLToProtoTextVisitor } from './sdl-to-proto-visitor.js'; +export { RequiredFieldsVisitor } from './required-fields-visitor.js'; export { ProtoLockManager } from './proto-lock.js'; export { SDLValidationVisitor } from './sdl-validation-visitor.js'; diff --git a/protographic/src/naming-conventions.ts b/protographic/src/naming-conventions.ts index 5715449a5d..0dc3ecd914 100644 --- a/protographic/src/naming-conventions.ts +++ b/protographic/src/naming-conventions.ts @@ -63,6 +63,43 @@ export function createResponseMessageName(methodName: string): string { * Creates an entity lookup method name for an entity type */ export function createEntityLookupMethodName(typeName: string, keyString: string = 'id'): string { + const normalizedKey = createMethodSuffixFromEntityKey(keyString); + return `Lookup${typeName}${normalizedKey}`; +} + +/** + * Creates a key message name for an entity lookup request + * @param typeName - The name of the entity type + * @param keyString - The key string + * @returns The name of the key message + */ +export function createEntityLookupRequestKeyMessageName(typeName: string, keyString: string = 'id'): string { + const requestName = createRequestMessageName(createEntityLookupMethodName(typeName, keyString)); + return `${requestName}Key`; +} + +/** + * Creates a required fields method name for an entity type + * @param typeName - The name of the entity type + * @param fieldName - The name of the field that is required + * @param keyString - The key string + * @returns The name of the required fields method + * @example + * createRequiredFieldsMethodName('User', 'post', 'id') // => 'RequireUserPostById' + * createRequiredFieldsMethodName('User', 'post', 'id name') // => 'RequireUserPostByIdAndName' + * createRequiredFieldsMethodName('User', 'post', 'name,id') // => 'RequireUserPostByNameAndId' + */ +export function createRequiredFieldsMethodName(typeName: string, fieldName: string, keyString: string = 'id'): string { + const normalizedKey = createMethodSuffixFromEntityKey(keyString); + return `Require${typeName}${upperFirst(camelCase(fieldName))}${normalizedKey}`; +} + +/** + * Creates a method suffix from an entity key string + * @param keyString - The key string + * @returns The method suffix + */ +export function createMethodSuffixFromEntityKey(keyString: string = 'id'): string { const normalizedKey = keyString .split(/[,\s]+/) .filter((field) => field.length > 0) @@ -70,7 +107,7 @@ export function createEntityLookupMethodName(typeName: string, keyString: string .sort() .join('And'); - return `Lookup${typeName}By${normalizedKey}`; + return `By${normalizedKey}`; } /** diff --git a/protographic/src/proto-utils.ts b/protographic/src/proto-utils.ts new file mode 100644 index 0000000000..c4bd42a47b --- /dev/null +++ b/protographic/src/proto-utils.ts @@ -0,0 +1,362 @@ +import { + GraphQLType, + isListType, + isNonNullType, + isScalarType, + isEnumType, + GraphQLNamedType, + getNamedType, + GraphQLList, + GraphQLNonNull, +} from 'graphql'; +import { + CompositeMessageDefinition, + isUnionMessageDefinition, + ProtoFieldType, + ProtoMessage, + RPCMethod, + SCALAR_TYPE_MAP, + SCALAR_WRAPPER_TYPE_MAP, +} from './types'; +import { unwrapNonNullType, isNestedListType, calculateNestingLevel } from './operations/list-type-utils'; +import { graphqlFieldToProtoField } from './naming-conventions'; + +const SPACE_INDENT = ' '; // 2 spaces +const LINE_COMMENT_PREFIX = '// '; +const BLOCK_COMMENT_START = '/*'; +const BLOCK_COMMENT_END = '*/'; + +/** + * Builds a message definition from a ProtoMessage object + * @param message - The ProtoMessage object + * @returns The message definition + */ +export function buildProtoMessage(includeComments: boolean, message: ProtoMessage): string[] { + return buildProtoMessageWithIndent(includeComments, message, 0); +} + +/** + * Builds a message definition from a ProtoMessage object with an indent level + * @param includeComments - Whether to include comments + * @param message - The ProtoMessage object + * @param indent - The indent level + * @returns The message lines + */ +function buildProtoMessageWithIndent(includeComments: boolean, message: ProtoMessage, indent: number): string[] { + const messageLines = formatComment(includeComments, message.description, indent); + messageLines.push(indentContent(indent, `message ${message.messageName} {`)); + + // if we have nested messages, we need to build them first + if (message.nestedMessages && message.nestedMessages.length > 0) { + message.nestedMessages.forEach((nestedMessage) => { + messageLines.push(...buildProtoMessageWithIndent(includeComments, nestedMessage, indent + 1)); + }); + } + + if (message.compositeType) { + messageLines.push(...buildCompositeTypeMessage(includeComments, message.compositeType, indent + 1)); + } + + if (message.reservedNumbers && message.reservedNumbers.length > 0) { + messageLines.push(indentContent(indent + 1, `reserved ${message.reservedNumbers};`)); + } + + message.fields.forEach((field) => { + if (field.description) { + messageLines.push(...formatComment(includeComments, field.description, indent + 1)); + } + + let repeated = field.isRepeated ? 'repeated ' : ''; + + messageLines.push( + indentContent(indent + 1, `${repeated}${field.typeName} ${field.fieldName} = ${field.fieldNumber};`), + ); + }); + messageLines.push(indentContent(indent, '}'), ''); + return messageLines; +} + +/** + * Builds a composite type message + * @param includeComments - Whether to include comments + * @param compositeType - The composite type definition + * @param indent - The indent level + * @returns The message lines + * @example + * ```proto + * // A union type uses `value` + * message Animal { + * oneof value { + * Cat cat = 1; + * Dog dog = 2; + * } + * } + * + * // An interface type uses `instance` + * message Animal { + * oneof instance { + * Cat cat = 1; + * Dog dog = 2; + * } + * } + * ``` + */ +function buildCompositeTypeMessage( + includeComments: boolean, + compositeType: CompositeMessageDefinition, + indent: number, +): string[] { + const lines: string[] = []; + + if (includeComments && compositeType.description) { + lines.push(...formatComment(includeComments, compositeType.description, indent)); + } + + let oneOfName = ''; + let compositeTypes: string[] = []; + + if (isUnionMessageDefinition(compositeType)) { + oneOfName = 'value'; + compositeTypes = compositeType.memberTypes; + } else { + oneOfName = 'instance'; + compositeTypes = compositeType.implementingTypes; + } + + lines.push( + indentContent(indent, `message ${compositeType.typeName} {`), + indentContent(indent + 1, `oneof ${oneOfName} {`), + ); + + compositeTypes.forEach((compositeType, index) => { + lines.push( + indentContent(indent + 2, `${compositeType} ${graphqlFieldToProtoField(compositeType)} = ${index + 1};`), + ); + }); + + lines.push(indentContent(indent + 1, '}')); + lines.push(indentContent(indent, '}')); + + return lines; +} + +/** + * Convert a GraphQL description to Protocol Buffer comment + * @param description - The GraphQL description text + * @param indentLevel - The level of indentation for the comment (in number of 2-space blocks) + * @returns Array of comment lines with proper indentation + */ +export function formatComment( + includeComments: boolean, + description: string | undefined | null, + indentLevel: number = 0, +): string[] { + if (!includeComments || !description) { + return []; + } + + // Use 2-space indentation consistently + const indent = SPACE_INDENT.repeat(indentLevel); + const lines = description.trim().split('\n'); + + if (lines.length === 1) { + return [`${indent}${LINE_COMMENT_PREFIX}${lines[0]}`]; + } else { + return [ + `${indent}${BLOCK_COMMENT_START}`, + ...lines.map((line) => `${indent} * ${line}`), + `${indent} ${BLOCK_COMMENT_END}`, + ]; + } +} + +export function renderRPCMethod(includeComments: boolean, rpcMethod: RPCMethod): string[] { + const lines: string[] = []; + + if (includeComments && rpcMethod.description) { + lines.push(...formatComment(includeComments, rpcMethod.description, 1)); + } + + lines.push(indentContent(1, `rpc ${rpcMethod.name}(${rpcMethod.request}) returns (${rpcMethod.response}) {}`)); + return lines; +} + +/** + * Map GraphQL type to Protocol Buffer type + * + * Determines the appropriate Protocol Buffer type for a given GraphQL type, + * including the use of wrapper types for nullable scalar fields to distinguish + * between unset fields and zero values. + * + * @param graphqlType - The GraphQL type to convert + * @param ignoreWrapperTypes - If true, do not use wrapper types for nullable scalar fields + * @returns The corresponding Protocol Buffer type name + */ +export function getProtoTypeFromGraphQL( + includeComments: boolean, + graphqlType: GraphQLType, + ignoreWrapperTypes: boolean = false, +): ProtoFieldType { + // Nullable lists need to be handled first, otherwise they will be treated as scalar types + if (isListType(graphqlType) || (isNonNullType(graphqlType) && isListType(graphqlType.ofType))) { + return handleListType(includeComments, graphqlType); + } + // For nullable scalar types, use wrapper types + if (isScalarType(graphqlType)) { + if (ignoreWrapperTypes) { + return { typeName: SCALAR_TYPE_MAP[graphqlType.name] || 'string', isRepeated: false, isWrapper: false }; + } + return { + typeName: SCALAR_WRAPPER_TYPE_MAP[graphqlType.name] || 'google.protobuf.StringValue', + isRepeated: false, + isWrapper: true, + }; + } + + if (isEnumType(graphqlType)) { + return { typeName: graphqlType.name, isRepeated: false, isWrapper: false }; + } + + if (isNonNullType(graphqlType)) { + // For non-null scalar types, use the base type + if (isScalarType(graphqlType.ofType)) { + return { typeName: SCALAR_TYPE_MAP[graphqlType.ofType.name] || 'string', isRepeated: false, isWrapper: false }; + } + + return getProtoTypeFromGraphQL(includeComments, graphqlType.ofType); + } + // Named types (object, interface, union, input) + const namedType = graphqlType as GraphQLNamedType; + if (namedType && typeof namedType.name === 'string') { + return { typeName: namedType.name, isRepeated: false, isWrapper: false }; + } + + return { typeName: 'string', isRepeated: false, isWrapper: false }; // Default fallback +} + +/** + * Converts GraphQL list types to appropriate Protocol Buffer representations. + * + * For non-nullable, single-level lists (e.g., [String!]!), generates simple repeated fields. + * For nullable lists (e.g., [String]) or nested lists (e.g., [[String]]), creates wrapper + * messages to properly handle nullability in proto3. + * + * Examples: + * - [String!]! → repeated string field_name = 1; + * - [String] → ListOfString field_name = 1; (with wrapper message) + * - [[String!]!]! → ListOfListOfString field_name = 1; (with nested wrapper messages) + * - [[String]] → ListOfListOfString field_name = 1; (with nested wrapper messages) + * + * @param graphqlType - The GraphQL list type to convert + * @returns ProtoType object containing the type name and whether it should be repeated + */ +export function handleListType( + includeComments: boolean, + graphqlType: GraphQLList | GraphQLNonNull>, +): ProtoFieldType { + const listType = unwrapNonNullType(graphqlType); + const isNullableList = !isNonNullType(graphqlType); + const isNested = isNestedListType(listType); + + // Simple non-nullable lists can use repeated fields directly + if (!isNullableList && !isNested) { + return { ...getProtoTypeFromGraphQL(includeComments, getNamedType(listType), true), isRepeated: true }; + } + + // Nullable or nested lists need wrapper messages + const baseType = getNamedType(listType); + const nestingLevel = calculateNestingLevel(listType); + + // For nested lists, always use full nesting level to preserve inner list nullability + // For single-level nullable lists, use nesting level 1 + const wrapperNestingLevel = isNested ? nestingLevel : 1; + + // Generate all required wrapper messages + let wrapperName = listNameByNestingLevel(wrapperNestingLevel, baseType); + + // For nested lists, never use repeated at field level to preserve nullability + return { + typeName: wrapperName, + isWrapper: false, + isRepeated: false, + listWrapper: { baseType, nestingLevel: wrapperNestingLevel }, + }; +} + +export function listNameByNestingLevel(nestingLevel: number, baseType: GraphQLNamedType): string { + return `${'ListOf'.repeat(nestingLevel)}${baseType.name}`; +} +/** + * Creates wrapper messages for nullable or nested GraphQL lists. + * + * Generates Protocol Buffer message definitions to handle list nullability and nesting. + * The wrapper messages are stored and later included in the final proto output. + * + * For level 1: Creates simple wrapper like: + * message ListOfString { + * repeated string items = 1; + * } + * + * For level > 1: Creates nested wrapper structures like: + * message ListOfListOfString { + * message List { + * repeated ListOfString items = 1; + * } + * List list = 1; + * } + * + * @param level - The nesting level (1 for simple wrapper, >1 for nested structures) + * @param baseType - The GraphQL base type being wrapped (e.g., String, User, etc.) + * @returns The generated wrapper message name (e.g., "ListOfString", "ListOfListOfUser") + */ +export function createNestedListWrapper(includeComments: boolean, level: number, baseType: GraphQLNamedType): string { + const wrapperName = `${'ListOf'.repeat(level)}${baseType.name}`; + return buildWrapperMessage(includeComments, wrapperName, level, baseType).join('\n'); +} + +/** + * Builds the message lines for a wrapper message + */ +function buildWrapperMessage( + includeComments: boolean, + wrapperName: string, + level: number, + baseType: GraphQLNamedType, +): string[] { + const lines: string[] = []; + + // Add comment if enabled + if (includeComments) { + lines.push(...formatComment(includeComments, `Wrapper message for a list of ${baseType.name}.`, 0)); + } + + const formatIndent = (indent: number, content: string) => { + return ' '.repeat(indent) + content; + }; + + lines.push(`message ${wrapperName} {`); + let innerWrapperName = ''; + if (level > 1) { + innerWrapperName = `${'ListOf'.repeat(level - 1)}${baseType.name}`; + } else { + innerWrapperName = getProtoTypeFromGraphQL(includeComments, baseType, true).typeName; + } + + lines.push( + formatIndent(1, `message List {`), + formatIndent(2, `repeated ${innerWrapperName} items = 1;`), + formatIndent(1, `}`), + formatIndent(1, `List list = 1;`), + formatIndent(0, `}`), + ); + + return lines; +} + +/** + * Indents the content by the given indent level + * @param indentLevel - The indent level + * @param content - The content to indent + * @returns The indented content + */ +const indentContent = (indentLevel: number, content: string): string => SPACE_INDENT.repeat(indentLevel) + content; diff --git a/protographic/src/required-fields-visitor.ts b/protographic/src/required-fields-visitor.ts new file mode 100644 index 0000000000..06249bf9aa --- /dev/null +++ b/protographic/src/required-fields-visitor.ts @@ -0,0 +1,644 @@ +import { + ASTNode, + ASTVisitor, + DirectiveNode, + DocumentNode, + FieldNode, + getNamedType, + GraphQLField, + GraphQLObjectType, + GraphQLSchema, + GraphQLType, + InlineFragmentNode, + isInterfaceType, + isObjectType, + isUnionType, + Kind, + parse, + SelectionSetNode, + visit, +} from 'graphql'; +import { CompositeMessageKind, ProtoMessage, ProtoMessageField, RPCMethod, VisitContext } from './types'; +import { KEY_DIRECTIVE_NAME } from './string-constants'; +import { + createEntityLookupRequestKeyMessageName, + createRequestMessageName, + createRequiredFieldsMethodName, + createResponseMessageName, + graphqlFieldToProtoField, +} from './naming-conventions'; +import { getProtoTypeFromGraphQL } from './proto-utils'; +import { AbstractSelectionRewriter } from './abstract-selection-rewriter'; +import { FieldMapping, TypeFieldMapping } from '@wundergraph/cosmo-connect/dist/node/v1/node_pb'; + +/** + * Configuration options for the RequiredFieldsVisitor. + */ +type RequiredFieldsVisitorOptions = { + includeComments: boolean; +}; + +/** + * A record mapping key directive strings to their corresponding RequiredFieldMapping. + * Each entity can have multiple @key directives, and each key needs its own RPC mapping. + */ +type RequiredFieldMappings = Record; + +/** + * Represents the mapping configuration for a single @requires field. + * This mapping is keyed by the @key directive fields string. + */ +export type RequiredFieldMapping = { + /** The RPC method configuration for resolving this required field */ + rpc?: RPCMethod; + /** The field mapping between GraphQL and proto field names */ + requiredFieldMapping?: FieldMapping; + /** Type field mappings for nested types in the required fields selection */ + typeFieldMappings?: TypeFieldMapping[]; +}; + +/** + * Generates protobuf messages and RPC methods for @requires directive field sets. + * + * This visitor processes the field set defined in a @requires directive and generates: + * - RPC method definitions for fetching required fields + * - Request/response message definitions + * - Field mappings between GraphQL and protobuf + * + * The visitor handles each @key directive on the entity separately, creating + * distinct RPC methods for each key since required fields may need to be + * fetched using different entity keys. + * + * @example + * ```typescript + * const visitor = new RequiredFieldsVisitor( + * schema, + * ProductType, + * weightField, + * 'dimensions { width height }' + * ); + * visitor.visit(); + * + * const messages = visitor.getMessageDefinitions(); + * const rpcs = visitor.getRPCMethods(); + * const mappings = visitor.getMapping(); + * ``` + */ +export class RequiredFieldsVisitor { + private readonly visitor: ASTVisitor; + private readonly fieldSetDoc: DocumentNode; + + private ancestors: GraphQLObjectType[] = []; + private currentType: GraphQLObjectType | undefined = this.objectType; + private keyDirectives: DirectiveNode[] = []; + private currentKeyFieldsString: string = ''; + + /** Collected RPC methods for the required fields */ + private rpcMethods: RPCMethod[] = []; + /** All generated protobuf message definitions */ + private messageDefinitions: ProtoMessage[] = []; + /** The current required field message being built */ + private requiredFieldMessage: ProtoMessage | undefined; + /** The current message context during traversal */ + private current: ProtoMessage | undefined; + /** Stack for tracking nested message contexts */ + private stack: ProtoMessage[] = []; + + private currentInlineFragment?: InlineFragmentNode; + private inlineFragmentStack: InlineFragmentNode[] = []; + + /** Mappings keyed by @key directive fields string */ + private mapping: RequiredFieldMappings = {}; + + /** + * Creates a new RequiredFieldsVisitor. + * + * @param schema - The GraphQL schema containing type definitions + * @param objectType - The entity type that has the @requires directive + * @param requiredField - The field with the @requires directive + * @param fieldSet - The field set string from the @requires directive (e.g., "dimensions { width height }") + * @param options - Optional configuration options + * @throws Error if the object type is not an entity (has no @key directive) + */ + constructor( + private readonly schema: GraphQLSchema, + private readonly objectType: GraphQLObjectType, + private readonly requiredField: GraphQLField, + fieldSet: string, + options: RequiredFieldsVisitorOptions = { + includeComments: false, + }, + ) { + this.resolveKeyDirectives(); + this.fieldSetDoc = parse(`{ ${fieldSet} }`); + this.normalizeOperation(); + this.visitor = this.createASTVisitor(); + this.mapping = {}; + } + + /** + * Executes the visitor, processing the field set for each @key directive. + * Creates separate RPC methods and mappings for each entity key. + */ + public visit(): void { + for (const keyDirective of this.keyDirectives) { + this.currentKeyFieldsString = this.getKeyFieldsString(keyDirective); + + this.mapping[this.currentKeyFieldsString] = { + requiredFieldMapping: new FieldMapping({ + original: this.requiredField.name, + mapped: graphqlFieldToProtoField(this.requiredField.name), + }), + typeFieldMappings: [], + }; + visit(this.fieldSetDoc, this.visitor); + } + } + + /** + * Normalizes the parsed field set operation by rewriting abstract selections. + * This ensures consistent handling of interface and union type selections. + */ + private normalizeOperation(): void { + const visitor = new AbstractSelectionRewriter(this.fieldSetDoc, this.schema, this.objectType); + visitor.normalize(); + } + + /** + * Returns all generated protobuf message definitions. + * + * @returns Array of ProtoMessage definitions for request, response, and nested messages + */ + public getMessageDefinitions(): ProtoMessage[] { + return this.messageDefinitions; + } + + /** + * Returns the generated RPC method definitions. + * + * @returns Array of RPCMethod definitions for fetching required fields + */ + public getRPCMethods(): RPCMethod[] { + return this.rpcMethods; + } + + /** + * Returns the field mappings keyed by @key directive fields string. + * + * @returns Record mapping key strings to their RequiredFieldMapping configurations + */ + public getMapping(): RequiredFieldMappings { + return this.mapping; + } + + /** + * Resolves all @key directives from the object type. + * Each key directive will result in a separate RPC method. + * + * @throws Error if the object type has no @key directives + */ + private resolveKeyDirectives(): void { + this.keyDirectives = this.objectType.astNode?.directives?.filter((d) => d.name.value === KEY_DIRECTIVE_NAME) ?? []; + if (this.keyDirectives.length === 0) { + throw new Error('Object type has to be an entity type to make use of the @requires directive'); + } + } + + /** + * Creates the AST visitor configuration for traversing the field set document. + * + * @returns An ASTVisitor with handlers for Document, Field, InlineFragment, and SelectionSet nodes + */ + private createASTVisitor(): ASTVisitor { + return { + Document: { + enter: (node) => { + this.onEnterDocument(node); + }, + leave: () => { + this.onLeaveDocument(); + }, + }, + Field: { + enter: (node, key, parent, path, ancestors) => { + this.onEnterField({ node, key, parent, path, ancestors }); + }, + }, + InlineFragment: { + enter: (node, key, parent, path, ancestors) => { + this.onEnterInlineFragment({ node, key, parent, path, ancestors }); + }, + leave: (node, key, parent, path, ancestors) => { + this.onLeaveInlineFragment({ node, key, parent, path, ancestors }); + }, + }, + SelectionSet: { + enter: (node, key, parent, path, ancestors) => { + this.onEnterSelectionSet({ node, key, parent, path, ancestors }); + }, + leave: (node, key, parent, path, ancestors) => { + this.onLeaveSelectionSet({ node, key, parent, path, ancestors }); + }, + }, + }; + } + + /** + * Handles leaving the document node. + * Finalizes the required field message and generates type field mappings. + */ + private onLeaveDocument(): void { + if (this.requiredFieldMessage) { + this.messageDefinitions.push(this.requiredFieldMessage); + this.createTypeFieldMappings(this.requiredFieldMessage, []); + } + } + + /** + * Recursively creates type field mappings for a message and its nested messages. + * Builds the path-qualified type names for nested message mappings. + * + * @param message - The protobuf message to create mappings for + * @param path - The current path of parent message names for qualification + */ + private createTypeFieldMappings(message: ProtoMessage, path: string[]): void { + if (!message) return; + + let pathPrefix = path.length > 0 ? `${path.join('.')}.` : ''; + + const typeFieldMapping = new TypeFieldMapping({ + type: `${pathPrefix}${message.messageName}`, + fieldMappings: [], + }); + + for (const field of message.fields) { + typeFieldMapping.fieldMappings.push(this.createFieldMappingForRequiredField(field)); + } + + path.push(message.messageName); + for (const nested of message.nestedMessages ?? []) { + this.createTypeFieldMappings(nested, path); + } + + path.pop(); + + this.mapping[this.currentKeyFieldsString!].typeFieldMappings?.push(typeFieldMapping); + } + + /** + * Creates a FieldMapping for a required field's proto message field. + * + * @param field - The proto message field to create a mapping for + * @returns A FieldMapping with original GraphQL name and mapped proto name + */ + private createFieldMappingForRequiredField(field: ProtoMessageField): FieldMapping { + return new FieldMapping({ + original: field.graphqlName ?? field.fieldName, + mapped: field.fieldName, + argumentMappings: [], // TODO: add argument mappings. + }); + } + + /** + * Handles entering the document node. + * Creates the RPC method definition and all request/response message structures + * for fetching the required fields. + * + * @param node - The document node being entered + */ + private onEnterDocument(node: DocumentNode): void { + const requiredFieldsMethodName = createRequiredFieldsMethodName( + this.objectType.name, + this.requiredField.name, + this.currentKeyFieldsString, + ); + + const requestMessageName = createRequestMessageName(requiredFieldsMethodName); + const responseMessageName = createResponseMessageName(requiredFieldsMethodName); + + this.mapping[this.currentKeyFieldsString].rpc = { + name: requiredFieldsMethodName, + request: requestMessageName, + response: responseMessageName, + }; + + this.rpcMethods.push({ + name: requiredFieldsMethodName, + request: requestMessageName, + response: responseMessageName, + }); + + // Request messages + const contextMessageName = `${requiredFieldsMethodName}Context`; + this.messageDefinitions.push({ + messageName: requestMessageName, + fields: [ + { + fieldName: 'context', + typeName: contextMessageName, + fieldNumber: 1, + isRepeated: true, + description: `${contextMessageName} provides the context for the required fields method ${requiredFieldsMethodName}.`, + }, + ], + }); + + const fieldsMessageName = `${requiredFieldsMethodName}Fields`; + const entityKeyRequestMessageName = createEntityLookupRequestKeyMessageName( + this.objectType.name, + this.currentKeyFieldsString, + ); + + this.messageDefinitions.push({ + messageName: contextMessageName, + fields: [ + { + fieldName: 'key', + typeName: entityKeyRequestMessageName, + fieldNumber: 1, + }, + { + fieldName: 'fields', + typeName: fieldsMessageName, + fieldNumber: 2, + }, + ], + }); + + // Define the prototype for the required fields message. + // This will be added to the message definitions when the document is left. + this.requiredFieldMessage = { + messageName: fieldsMessageName, + fields: [], + }; + + // Response messages + const resultMessageName = `${requiredFieldsMethodName}Result`; + this.messageDefinitions.push({ + messageName: responseMessageName, + fields: [ + { + fieldName: 'result', + typeName: resultMessageName, + fieldNumber: 1, + isRepeated: true, + description: `${resultMessageName} provides the result for the required fields method ${requiredFieldsMethodName}.`, + }, + ], + }); + + // Get the type name from the required field + const typeInfo = getProtoTypeFromGraphQL(false, this.requiredField.type); + + this.messageDefinitions.push({ + messageName: resultMessageName, + fields: [ + { + fieldName: graphqlFieldToProtoField(this.requiredField.name), + typeName: typeInfo.typeName, + fieldNumber: 1, + isRepeated: typeInfo.isRepeated, + }, + ], + }); + + this.stack.push(this.requiredFieldMessage); + this.current = this.requiredFieldMessage; + } + + /** + * Handles entering a field node during traversal. + * Adds the field to the current proto message with appropriate type mapping. + * + * @param ctx - The visit context containing the field node and its ancestors + * @throws Error if the field definition is not found on the current type + */ + private onEnterField(ctx: VisitContext): void { + if (!this.current) return; + + const fieldDefinition = this.fieldDefinition(ctx.node.name.value); + if (!fieldDefinition) throw new Error(`Field definition not found for field ${ctx.node.name.value}`); + + if (this.isCompositeType(fieldDefinition.type)) { + this.handleCompositeType(fieldDefinition); + } + + const typeInfo = getProtoTypeFromGraphQL(false, fieldDefinition.type); + this.current.fields.push({ + fieldName: graphqlFieldToProtoField(fieldDefinition.name), + typeName: typeInfo.typeName, + fieldNumber: this.current?.fields.length + 1, + isRepeated: typeInfo.isRepeated, + graphqlName: fieldDefinition.name, + }); + } + + /** + * Handles entering an inline fragment node. + * Pushes the current inline fragment onto the stack for nested fragment handling. + * + * @param ctx - The visit context containing the inline fragment node + */ + private onEnterInlineFragment(ctx: VisitContext): void { + if (this.currentInlineFragment) { + this.inlineFragmentStack.push(this.currentInlineFragment); + } + + this.currentInlineFragment = ctx.node; + } + + /** + * Handles leaving an inline fragment node. + * Records union member types when processing union type fragments. + * + * @param ctx - The visit context containing the inline fragment node + */ + private onLeaveInlineFragment(ctx: VisitContext): void { + const currentInlineFragment = this.currentInlineFragment; + this.currentInlineFragment = this.inlineFragmentStack.pop() ?? undefined; + + if (!this.current || !this.current.compositeType) return; + + if (this.current.compositeType.kind === CompositeMessageKind.UNION) { + this.current.compositeType.memberTypes.push(currentInlineFragment?.typeCondition?.name.value ?? ''); + } + } + + /** + * Handles entering a selection set node. + * Creates a new nested proto message for object type selections and updates + * the current type context for proper field resolution. + * + * @param ctx - The visit context containing the selection set node and its parent + */ + private onEnterSelectionSet(ctx: VisitContext): void { + if (!ctx.parent || !this.current) return; + + let currentType: GraphQLType | undefined; + if (this.isFieldNode(ctx.parent)) { + currentType = this.findObjectTypeForField(ctx.parent.name.value) ?? undefined; + if (!currentType) { + // TODO: handle this case. Could be a union or interface type. + return; + } + } else if (this.isInlineFragmentNode(ctx.parent)) { + const typeName = ctx.parent.typeCondition?.name.value; + if (!typeName) return; + + currentType = this.findObjectType(typeName) ?? undefined; + } else { + return; + } + + if (!this.currentType) return; + + this.ancestors.push(this.currentType); + this.currentType = currentType; + + // Create a new nested message for the current type. + let nested: ProtoMessage = { + messageName: this.currentType?.name ?? '', + fields: [], + }; + + if (!this.current.nestedMessages) { + this.current.nestedMessages = []; + } + + this.current.nestedMessages.push(nested); + + this.stack.push(this.current); + this.current = nested; + } + + /** + * Handles leaving a selection set node. + * Restores the previous type and message context when ascending the tree. + * + * @param ctx - The visit context containing the selection set node + */ + private onLeaveSelectionSet(ctx: VisitContext): void { + this.currentType = this.ancestors.pop() ?? this.currentType; + this.current = this.stack.pop(); + } + + /** + * Handles composite types (interfaces and unions) by setting up the + * appropriate composite type metadata on the current message. + * + * @param fieldDefinition - The field definition with a composite type + */ + private handleCompositeType(fieldDefinition: GraphQLField): void { + if (!this.current) return; + const compositeType = getNamedType(fieldDefinition.type); + + if (isInterfaceType(compositeType)) { + this.current.compositeType = { + kind: CompositeMessageKind.INTERFACE, + implementingTypes: this.schema.getImplementations(compositeType).objects.map((o) => o.name), + typeName: compositeType.name, + }; + + return; + } + + if (isUnionType(compositeType)) { + this.current.compositeType = { + kind: CompositeMessageKind.UNION, + memberTypes: [], + typeName: compositeType.name, + }; + + return; + } + } + + /** + * Type guard to check if a node is a FieldNode. + * + * @param node - The AST node or array of nodes to check + * @returns True if the node is a FieldNode + */ + private isFieldNode(node: ASTNode | ReadonlyArray): node is FieldNode { + if (Array.isArray(node)) return false; + return (node as ASTNode).kind === Kind.FIELD; + } + + /** + * Type guard to check if a node is an InlineFragmentNode. + * + * @param node - The AST node or array of nodes to check + * @returns True if the node is an InlineFragmentNode + */ + private isInlineFragmentNode(node: ASTNode | ReadonlyArray): node is InlineFragmentNode { + if (Array.isArray(node)) return false; + return (node as ASTNode).kind === Kind.INLINE_FRAGMENT; + } + + /** + * Finds the GraphQL object type for a field by looking up the field's return type. + * + * @param fieldName - The name of the field to look up + * @returns The GraphQL object type if the field returns an object type, undefined otherwise + */ + private findObjectTypeForField(fieldName: string): GraphQLObjectType | undefined { + const fields = this.currentType?.getFields() ?? {}; + const field = fields[fieldName]; + if (!field) return undefined; + + const namedType = getNamedType(field.type); + if (isObjectType(namedType)) { + return namedType; + } + + return undefined; + } + + /** + * Retrieves the field definition for a field name from the current type. + * + * @param fieldName - The name of the field to look up + * @returns The GraphQL field definition, or undefined if not found + */ + private fieldDefinition(fieldName: string): GraphQLField | undefined { + return this.currentType?.getFields()[fieldName]; + } + + /** + * Finds a GraphQL object type by name from the schema's type map. + * + * @param typeName - The name of the type to find + * @returns The GraphQL object type if found and is an object type, undefined otherwise + */ + private findObjectType(typeName: string): GraphQLObjectType | undefined { + const type = this.schema.getTypeMap()[typeName]; + if (!type) return undefined; + + if (!isObjectType(type)) return undefined; + return type; + } + + /** + * Extracts the fields string from a @key directive's fields argument. + * + * @param directive - The @key directive node + * @returns The fields string value, or empty string if not found + */ + private getKeyFieldsString(directive: DirectiveNode): string { + const fieldsArg = directive.arguments?.find((arg) => arg.name.value === 'fields'); + if (!fieldsArg) return ''; + + return fieldsArg.value.kind === Kind.STRING ? fieldsArg.value.value : ''; + } + + /** + * Checks if a GraphQL type is a composite type (interface or union). + * + * @param type - The GraphQL type to check + * @returns True if the type is an interface or union type + */ + private isCompositeType(type: GraphQLType): boolean { + const namedType = getNamedType(type); + return isInterfaceType(namedType) || isUnionType(namedType); + } +} diff --git a/protographic/src/sdl-to-mapping-visitor.ts b/protographic/src/sdl-to-mapping-visitor.ts index fe4ac3798f..6baea7a1aa 100644 --- a/protographic/src/sdl-to-mapping-visitor.ts +++ b/protographic/src/sdl-to-mapping-visitor.ts @@ -1,4 +1,5 @@ import { + ArgumentNode, DirectiveNode, GraphQLEnumType, GraphQLField, @@ -10,11 +11,13 @@ import { isInputObjectType, isObjectType, Kind, + StringValueNode, } from 'graphql'; import { createEntityLookupMethodName, createOperationMethodName, createRequestMessageName, + createRequiredFieldsMethodName, createResolverMethodName, createResponseMessageName, graphqlArgumentToProtoField, @@ -34,10 +37,12 @@ import { LookupType, OperationMapping, OperationType, + RequiredFieldMapping, TypeFieldMapping, } from '@wundergraph/cosmo-connect/dist/node/v1/node_pb'; import { Maybe } from 'graphql/jsutils/Maybe.js'; - +import { EXTERNAL_DIRECTIVE_NAME, REQUIRES_DIRECTIVE_NAME } from './string-constants'; +import { RequiredFieldsVisitor } from './required-fields-visitor.js'; /** * Visitor that converts a GraphQL schema to gRPC mapping definitions * @@ -128,12 +133,66 @@ export class GraphQLToProtoVisitor { if (key) { // Create entity mapping for each key combination this.createEntityMapping(typeName, key); + // todo: add required fields mapping } } + + this.createRequiredFieldsMapping(type); + } + } + } + + private createRequiredFieldsMapping(type: GraphQLObjectType): void { + const fields = Object.values(type.getFields()).filter((field) => + field.astNode?.directives?.some((d) => d.name.value === REQUIRES_DIRECTIVE_NAME), + ); + if (fields.length === 0) return; + + for (const field of fields) { + const visitor = new RequiredFieldsVisitor(this.schema, type, field, this.getRequiredFieldSet(field)); + visitor.visit(); + const mapping = visitor.getMapping(); + + for (const [key, value] of Object.entries(mapping)) { + value.typeFieldMappings?.forEach((t) => { + if (t.fieldMappings?.length === 0) return; + + const typeFieldMapping = this.mapping.typeFieldMappings.find((tfm) => tfm.type === t.type); + if (!typeFieldMapping) { + this.mapping.typeFieldMappings.push(t); + } + + typeFieldMapping?.fieldMappings.push(...t.fieldMappings); + }); + + const em = this.mapping.entityMappings.find((em) => em.typeName === type.name && em.key === key); + if (!em) { + throw new Error(`Entity mapping not found for type ${type.name} and key ${key}`); + } + + em.requiredFieldMappings.push( + new RequiredFieldMapping({ + fieldMapping: value.requiredFieldMapping, + request: value.rpc?.request ?? '', + response: value.rpc?.response ?? '', + rpc: value.rpc?.name ?? '', + }), + ); } } } + private getRequiredFieldSet(field: GraphQLField): string { + const node = field.astNode?.directives + ?.find((d) => d.name.value === REQUIRES_DIRECTIVE_NAME) + ?.arguments?.find((arg) => arg.name.value === 'fields')?.value as StringValueNode; + if (!node) { + throw new Error(`Required field set not found for field ${field.name}`); + } + + return node.value; + } + /** * Extract all key directives from a GraphQL object type * @@ -163,6 +222,7 @@ export class GraphQLToProtoVisitor { rpc: rpc, request: createRequestMessageName(rpc), response: createResponseMessageName(rpc), + requiredFieldMappings: [], }); this.mapping.entityMappings.push(entityMapping); @@ -373,6 +433,9 @@ export class GraphQLToProtoVisitor { for (const fieldName in fields) { const field = fields[fieldName]; + + if (this.shouldSkipField(field)) continue; + const fieldMapping = this.createFieldMapping(field); typeFieldMapping.fieldMappings.push(fieldMapping); } @@ -383,6 +446,20 @@ export class GraphQLToProtoVisitor { } } + /** + * Determines if a field should be skipped during processing + * + * @param field - The GraphQL field to check + * @returns True if the field should be skipped, false otherwise + */ + private shouldSkipField(field: GraphQLField): boolean { + return ( + field.astNode?.directives?.some( + (d) => d.name.value === REQUIRES_DIRECTIVE_NAME || d.name.value === EXTERNAL_DIRECTIVE_NAME, + ) ?? false + ); + } + /** * Process a GraphQL input object type to generate field mappings * diff --git a/protographic/src/sdl-to-proto-visitor.ts b/protographic/src/sdl-to-proto-visitor.ts index 2c0bca586f..85a92654fa 100644 --- a/protographic/src/sdl-to-proto-visitor.ts +++ b/protographic/src/sdl-to-proto-visitor.ts @@ -10,9 +10,7 @@ import { GraphQLInputField, GraphQLInputObjectType, GraphQLInterfaceType, - GraphQLList, GraphQLNamedType, - GraphQLNonNull, GraphQLObjectType, GraphQLSchema, GraphQLType, @@ -20,9 +18,7 @@ import { isEnumType, isInputObjectType, isInterfaceType, - isListType, isNamedType, - isNonNullType, isObjectType, isScalarType, isUnionType, @@ -44,37 +40,26 @@ import { } from './naming-conventions.js'; import { camelCase } from 'lodash-es'; import { ProtoLock, ProtoLockManager } from './proto-lock.js'; -import { CONNECT_FIELD_RESOLVER, CONTEXT, FIELD_ARGS, RESULT } from './string-constants.js'; -import { unwrapNonNullType, isNestedListType, calculateNestingLevel } from './operations/list-type-utils.js'; +import { + CONNECT_FIELD_RESOLVER, + CONTEXT, + EXTERNAL_DIRECTIVE_NAME, + FIELD_ARGS, + KEY_DIRECTIVE_NAME, + REQUIRES_DIRECTIVE_NAME, + RESULT, +} from './string-constants.js'; import { buildProtoOptions, type ProtoOptions } from './proto-options.js'; - -/** - * Maps GraphQL scalar types to Protocol Buffer types - * - * GraphQL has a smaller set of primitive types compared to Protocol Buffers. - * This mapping ensures consistent representation between the two type systems. - */ -const SCALAR_TYPE_MAP: Record = { - ID: 'string', // GraphQL IDs map to Proto strings - String: 'string', // Direct mapping - Int: 'int32', // GraphQL Int is 32-bit signed - Float: 'double', // Using double for GraphQL Float gives better precision - Boolean: 'bool', // Direct mapping -}; - -/** - * Maps GraphQL scalar types to Protocol Buffer wrapper types for nullable fields - * - * These wrapper types allow distinguishing between unset fields and zero values - * in Protocol Buffers, which is important for GraphQL nullable semantics. - */ -const SCALAR_WRAPPER_TYPE_MAP: Record = { - ID: 'google.protobuf.StringValue', - String: 'google.protobuf.StringValue', - Int: 'google.protobuf.Int32Value', - Float: 'google.protobuf.DoubleValue', - Boolean: 'google.protobuf.BoolValue', -}; +import { ProtoFieldType, ProtoMessage, ProtoMessageField } from './types.js'; +import { + buildProtoMessage, + createNestedListWrapper, + formatComment, + getProtoTypeFromGraphQL, + listNameByNestingLevel, + renderRPCMethod, +} from './proto-utils.js'; +import { RequiredFieldsVisitor } from './required-fields-visitor.js'; /** * Generic structure for returning RPC and message definitions @@ -106,14 +91,6 @@ export interface ProtoOption { constant: string; } -/** - * Data structure for formatting message fields - */ -interface ProtoType { - typeName: string; - isRepeated: boolean; -} - /** * Data structure for key directive */ @@ -122,21 +99,6 @@ interface KeyDirective { resolvable: boolean; } -interface ProtoMessageField { - fieldName: string; - typeName: string; - fieldNumber: number; - isRepeated?: boolean; - description?: string; -} - -interface ProtoMessage { - messageName: string; - reservedNumbers?: string; - description?: string; - fields: ProtoMessageField[]; -} - /** * Visitor that converts GraphQL SDL to Protocol Buffer text definition * @@ -250,6 +212,124 @@ export class GraphQLToProtoTextVisitor { } } + /** + * Visit the GraphQL schema to generate Proto buffer definition + * + * @returns The complete Protocol Buffer definition as a string + */ + public visit(): string { + // Collect RPC methods and message definitions from all sources + const resolverResult = this.collectResolverRpcMethods(); + const requiredFieldResult = this.collectRequiredFieldRpcMethods(); + const entityResult = this.collectEntityRpcMethods(); + const queryResult = this.collectQueryRpcMethods(); + const mutationResult = this.collectMutationRpcMethods(); + + // Combine all RPC methods and message definitions + const allRpcMethods = [ + ...entityResult.rpcMethods, + ...queryResult.rpcMethods, + ...mutationResult.rpcMethods, + ...resolverResult.rpcMethods, + ...requiredFieldResult.rpcMethods, + ]; + const allMethodNames = [ + ...entityResult.methodNames, + ...queryResult.methodNames, + ...mutationResult.methodNames, + ...resolverResult.methodNames, + ...requiredFieldResult.methodNames, + ]; + + const allMessageDefinitions = [ + ...entityResult.messageDefinitions, + ...queryResult.messageDefinitions, + ...mutationResult.messageDefinitions, + ...resolverResult.messageDefinitions, + ...requiredFieldResult.messageDefinitions, + ]; + + // Add all types from the schema to the queue that weren't already queued + this.queueAllSchemaTypes(); + + // Process all complex types from the message queue to determine if wrapper types are needed + this.processMessageQueue(); + + // Add wrapper import if needed + if (this.usesWrapperTypes) { + this.addImport('google/protobuf/wrappers.proto'); + } + + // Build the complete proto file + let protoContent: string[] = []; + + // Add the header (syntax, package, imports, options) + protoContent.push(...this.buildProtoHeader()); + + // Add a service description comment + if (this.includeComments) { + const serviceComment = `Service definition for ${this.serviceName}`; + protoContent.push(...this.formatComment(serviceComment, 0)); // Top-level comment, no indent + } + + // Add service block containing RPC methods + protoContent.push(`service ${this.serviceName} {`); + this.indent++; + + // Sort method names deterministically by alphabetical order + const orderedMethodNames = [...allMethodNames].sort(); + + // Add RPC methods in the ordered sequence + for (const methodName of orderedMethodNames) { + const methodIndex = allMethodNames.indexOf(methodName); + if (methodIndex !== -1) { + // Handle multi-line RPC definitions that include comments + const rpcMethodText = allRpcMethods[methodIndex]; + if (rpcMethodText.includes('\n')) { + // For multi-line RPC method definitions (with comments), add each line separately + const lines = rpcMethodText.split('\n'); + protoContent.push(...lines); + } else { + protoContent.push(`${rpcMethodText}`); + } + } + } + + // Close service definition + this.indent--; + protoContent.push('}'); + protoContent.push(''); + + // Add all wrapper messages first since they might be referenced by other messages + if (this.nestedListWrappers.size > 0) { + // Sort the wrappers by name for deterministic output + const sortedWrapperNames = Array.from(this.nestedListWrappers.keys()).sort(); + for (const wrapperName of sortedWrapperNames) { + protoContent.push(this.nestedListWrappers.get(wrapperName)!); + } + } + + // Add all message definitions + for (const messageDef of allMessageDefinitions) { + protoContent.push(messageDef); + } + + protoContent = this.trimEmptyLines(protoContent); + this.protoText = this.trimEmptyLines(this.protoText); + + if (this.protoText.length > 0) { + protoContent.push(''); + } + + // Add all processed types from protoText (populated by processMessageQueue) + protoContent.push(...this.protoText); + + // Store the generated lock data for retrieval + this.generatedLockData = this.lockManager.getLockData(); + + return protoContent.join('\n'); + } + /** * Initialize the field numbers map from the lock data to preserve field numbers * even when fields are removed and later re-added @@ -476,121 +556,6 @@ export class GraphQLToProtoTextVisitor { return header; } - /** - * Visit the GraphQL schema to generate Proto buffer definition - * - * @returns The complete Protocol Buffer definition as a string - */ - public visit(): string { - // Collect RPC methods and message definitions from all sources - const resolverResult = this.collectResolverRpcMethods(); - const entityResult = this.collectEntityRpcMethods(); - const queryResult = this.collectQueryRpcMethods(); - const mutationResult = this.collectMutationRpcMethods(); - - // Combine all RPC methods and message definitions - const allRpcMethods = [ - ...entityResult.rpcMethods, - ...queryResult.rpcMethods, - ...mutationResult.rpcMethods, - ...resolverResult.rpcMethods, - ]; - const allMethodNames = [ - ...entityResult.methodNames, - ...queryResult.methodNames, - ...mutationResult.methodNames, - ...resolverResult.methodNames, - ]; - - const allMessageDefinitions = [ - ...entityResult.messageDefinitions, - ...queryResult.messageDefinitions, - ...mutationResult.messageDefinitions, - ...resolverResult.messageDefinitions, - ]; - - // Add all types from the schema to the queue that weren't already queued - this.queueAllSchemaTypes(); - - // Process all complex types from the message queue to determine if wrapper types are needed - this.processMessageQueue(); - - // Add wrapper import if needed - if (this.usesWrapperTypes) { - this.addImport('google/protobuf/wrappers.proto'); - } - - // Build the complete proto file - let protoContent: string[] = []; - - // Add the header (syntax, package, imports, options) - protoContent.push(...this.buildProtoHeader()); - - // Add a service description comment - if (this.includeComments) { - const serviceComment = `Service definition for ${this.serviceName}`; - protoContent.push(...this.formatComment(serviceComment, 0)); // Top-level comment, no indent - } - - // Add service block containing RPC methods - protoContent.push(`service ${this.serviceName} {`); - this.indent++; - - // Sort method names deterministically by alphabetical order - const orderedMethodNames = [...allMethodNames].sort(); - - // Add RPC methods in the ordered sequence - for (const methodName of orderedMethodNames) { - const methodIndex = allMethodNames.indexOf(methodName); - if (methodIndex !== -1) { - // Handle multi-line RPC definitions that include comments - const rpcMethodText = allRpcMethods[methodIndex]; - if (rpcMethodText.includes('\n')) { - // For multi-line RPC method definitions (with comments), add each line separately - const lines = rpcMethodText.split('\n'); - protoContent.push(...lines); - } else { - // For simple one-line RPC method definitions (ensure 2-space indentation) - protoContent.push(` ${rpcMethodText}`); - } - } - } - - // Close service definition - this.indent--; - protoContent.push('}'); - protoContent.push(''); - - // Add all wrapper messages first since they might be referenced by other messages - if (this.nestedListWrappers.size > 0) { - // Sort the wrappers by name for deterministic output - const sortedWrapperNames = Array.from(this.nestedListWrappers.keys()).sort(); - for (const wrapperName of sortedWrapperNames) { - protoContent.push(this.nestedListWrappers.get(wrapperName)!); - } - } - - // Add all message definitions - for (const messageDef of allMessageDefinitions) { - protoContent.push(messageDef); - } - - protoContent = this.trimEmptyLines(protoContent); - this.protoText = this.trimEmptyLines(this.protoText); - - if (this.protoText.length > 0) { - protoContent.push(''); - } - - // Add all processed types from protoText (populated by processMessageQueue) - protoContent.push(...this.protoText); - - // Store the generated lock data for retrieval - this.generatedLockData = this.lockManager.getLockData(); - - return protoContent.join('\n'); - } - /** * Trim empty lines from the beginning and end of the array */ @@ -638,56 +603,55 @@ export class GraphQLToProtoTextVisitor { continue; } - // Check if this is an entity type (has @key directive) - if (isObjectType(type)) { - const keyDirectives = this.getKeyDirectives(type); - - if (keyDirectives.length > 0) { - // Queue this type for message generation (only once) - this.queueTypeForProcessing(type); - - // Normalize keys by sorting fields alphabetically and deduplicating - - const normalizedKeysSet = new Set(); - for (const keyDirective of keyDirectives) { - const keyInfo = this.getKeyInfoFromDirective(keyDirective); - if (!keyInfo) continue; - - const { keyString, resolvable } = keyInfo; - if (!resolvable) continue; - - const normalizedKey = keyString - .split(/[,\s]+/) - .filter((field) => field.length > 0) - .sort() - .join(' '); - - normalizedKeysSet.add(normalizedKey); - } - - // Process each normalized key - for (const normalizedKeyString of normalizedKeysSet) { - const methodName = createEntityLookupMethodName(typeName, normalizedKeyString); - - const requestName = createRequestMessageName(methodName); - const responseName = createResponseMessageName(methodName); - - // Add method name and RPC method with description from the entity type - result.methodNames.push(methodName); - const keyFields = normalizedKeyString.split(' '); - const keyDescription = keyFields.length === 1 ? keyFields[0] : keyFields.join(' and '); - const description = `Lookup ${typeName} entity by ${keyDescription}${ - type.description ? ': ' + type.description : '' - }`; - result.rpcMethods.push(this.createRpcMethod(methodName, requestName, responseName, description)); - - // Create request and response messages for this key combination - result.messageDefinitions.push( - ...this.createKeyRequestMessage(typeName, requestName, normalizedKeyString, responseName), - ); - result.messageDefinitions.push(...this.createKeyResponseMessage(typeName, responseName, requestName)); - } - } + // Skip non-object types + if (!isObjectType(type)) continue; + const keyDirectives = this.getKeyDirectives(type); + // Skip types that don't have @key directives + if (keyDirectives.length === 0) continue; + + // Queue this type for message generation (only once) + this.queueTypeForProcessing(type); + + // Normalize keys by sorting fields alphabetically and deduplicating + + const normalizedKeysSet = new Set(); + for (const keyDirective of keyDirectives) { + const keyInfo = this.getKeyInfoFromDirective(keyDirective); + if (!keyInfo) continue; + + const { keyString, resolvable } = keyInfo; + if (!resolvable) continue; + + const normalizedKey = keyString + .split(/[,\s]+/) + .filter((field) => field.length > 0) + .sort() + .join(' '); + + normalizedKeysSet.add(normalizedKey); + } + + // Process each normalized key + for (const normalizedKeyString of normalizedKeysSet) { + const methodName = createEntityLookupMethodName(typeName, normalizedKeyString); + + const requestName = createRequestMessageName(methodName); + const responseName = createResponseMessageName(methodName); + + // Add method name and RPC method with description from the entity type + result.methodNames.push(methodName); + const keyFields = normalizedKeyString.split(' '); + const keyDescription = keyFields.length === 1 ? keyFields[0] : keyFields.join(' and '); + const description = `Lookup ${typeName} entity by ${keyDescription}${ + type.description ? ': ' + type.description : '' + }`; + result.rpcMethods.push(this.createRpcMethod(methodName, requestName, responseName, description)); + + // Create request and response messages for this key combination + result.messageDefinitions.push( + ...this.createKeyRequestMessage(typeName, requestName, normalizedKeyString, responseName), + ); + result.messageDefinitions.push(...this.createKeyResponseMessage(typeName, responseName, requestName)); } } @@ -789,15 +753,14 @@ export class GraphQLToProtoTextVisitor { responseName: string, description?: string | null, ): string { - if (!this.includeComments || !description) { - return `rpc ${methodName}(${requestName}) returns (${responseName}) {}`; - } - - // RPC method comments should be indented 1 level (2 spaces) - const commentLines = this.formatComment(description, 1); - const methodLine = ` rpc ${methodName}(${requestName}) returns (${responseName}) {}`; + const rpcLines = renderRPCMethod(this.includeComments, { + name: methodName, + request: requestName, + response: responseName, + description: description, + }); - return [...commentLines, methodLine].join('\n'); + return rpcLines.join('\n'); } /** @@ -1096,7 +1059,16 @@ Example: * @returns Array of all key directives found */ private getKeyDirectives(type: GraphQLObjectType): DirectiveNode[] { - return type.astNode?.directives?.filter((d) => d.name.value === 'key') || []; + return type.astNode?.directives?.filter((d) => d.name.value === KEY_DIRECTIVE_NAME) || []; + } + + /** + * Checks if a type has a @key directive + * @param type - The type to check + * @returns True if the type has a @key directive, false otherwise + */ + private hasKeyDirective(type: GraphQLObjectType): boolean { + return type.astNode?.directives?.some((d) => d.name.value === KEY_DIRECTIVE_NAME) ?? false; } /** @@ -1165,6 +1137,50 @@ Example: return result; } + private collectRequiredFieldRpcMethods(): CollectionResult { + const typeMap = this.schema.getTypeMap(); + const result: CollectionResult = { rpcMethods: [], methodNames: [], messageDefinitions: [] }; + + const entityTypes = Object.values(typeMap).filter((type) => this.isEntityType(type)); + + for (const entity of entityTypes) { + const requiredFields = Object.values(entity.getFields()).filter((field) => + field.astNode?.directives?.some((d) => d.name.value === REQUIRES_DIRECTIVE_NAME), + ); + + if (requiredFields.length === 0) { + continue; + } + + for (const requiredField of requiredFields) { + const fieldSet = this.getRequiredFieldSet(requiredField); + const visitor = new RequiredFieldsVisitor(this.schema, entity, requiredField, fieldSet); + visitor.visit(); + + const rpcMethods = visitor.getRPCMethods(); + const messageDefinitions = visitor.getMessageDefinitions(); + + result.rpcMethods.push(...rpcMethods.map((m) => renderRPCMethod(this.includeComments, m).join('\n'))); + result.methodNames.push(...rpcMethods.map((m) => m.name)); + let messageLines = messageDefinitions.map((m) => buildProtoMessage(this.includeComments, m)).flat(); + result.messageDefinitions.push(...messageLines); + } + } + + return result; + } + + private getRequiredFieldSet(field: GraphQLField): string { + const node = field.astNode?.directives + ?.find((d) => d.name.value === REQUIRES_DIRECTIVE_NAME) + ?.arguments?.find((arg: ArgumentNode) => arg.name.value === 'fields')?.value as StringValueNode; + if (!node) { + throw new Error(`Required field set not found for field ${field.name}`); + } + + return node.value; + } + private getFieldContext( parent: GraphQLObjectType, field: GraphQLField, @@ -1405,6 +1421,15 @@ Example: return type.name === 'Query' || type.name === 'Mutation' || type.name === 'Subscription'; } + /** + * Checks if a type is an entity type + * @param type - The type to check + * @returns True if the type is an entity type, false otherwise + */ + private isEntityType(type: GraphQLNamedType): type is GraphQLObjectType { + return isObjectType(type) && !this.isOperationType(type) && this.hasKeyDirective(type); + } + /** * Queue all types from the schema that need processing */ @@ -1492,13 +1517,23 @@ Example: return; } - const fieldsWithoutArguments = Object.values(type.getFields()).filter((field) => field.args.length === 0); + const allFields = Object.values(type.getFields()); + // Filter out fields that have arguments as those are handled in separate resolver rpcs + const validFields = allFields + .filter((field) => field.args.length === 0) + .filter( + (field) => + !field.astNode?.directives?.some( + (directive) => + directive.name.value === EXTERNAL_DIRECTIVE_NAME || directive.name.value === REQUIRES_DIRECTIVE_NAME, + ), + ); // Check for field removals if lock data exists for this type const lockData = this.lockManager.getLockData(); if (lockData.messages[type.name]) { const originalFieldNames = Object.keys(lockData.messages[type.name].fields); - const currentFieldNames = fieldsWithoutArguments.map((field) => field.name); + const currentFieldNames = validFields.map((field) => field.name); this.trackRemovedFields(type.name, originalFieldNames, currentFieldNames); } @@ -1521,7 +1556,7 @@ Example: const fields = type.getFields(); // Get field names and order them using the lock manager - const fieldNames = Object.keys(fields); + const fieldNames = Object.keys(fields).filter((fieldName) => validFields.some((field) => field.name === fieldName)); const orderedFieldNames = this.lockManager.reconcileMessageFieldOrder(type.name, fieldNames); for (const fieldName of orderedFieldNames) { @@ -1932,170 +1967,27 @@ Example: * @param ignoreWrapperTypes - If true, do not use wrapper types for nullable scalar fields * @returns The corresponding Protocol Buffer type name */ - private getProtoTypeFromGraphQL(graphqlType: GraphQLType, ignoreWrapperTypes: boolean = false): ProtoType { - // Nullable lists need to be handled first, otherwise they will be treated as scalar types - if (isListType(graphqlType) || (isNonNullType(graphqlType) && isListType(graphqlType.ofType))) { - return this.handleListType(graphqlType); - } - // For nullable scalar types, use wrapper types - if (isScalarType(graphqlType)) { - if (ignoreWrapperTypes) { - return { typeName: SCALAR_TYPE_MAP[graphqlType.name] || 'string', isRepeated: false }; - } - this.usesWrapperTypes = true; // Track that we're using wrapper types - return { - typeName: SCALAR_WRAPPER_TYPE_MAP[graphqlType.name] || 'google.protobuf.StringValue', - isRepeated: false, - }; - } - - if (isEnumType(graphqlType)) { - return { typeName: graphqlType.name, isRepeated: false }; - } + private getProtoTypeFromGraphQL(graphqlType: GraphQLType, ignoreWrapperTypes: boolean = false): ProtoFieldType { + const protoFieldType = getProtoTypeFromGraphQL(this.includeComments, graphqlType, ignoreWrapperTypes); + if (!ignoreWrapperTypes && protoFieldType.isWrapper) { + this.usesWrapperTypes = true; + } + + const listWrapper = protoFieldType.listWrapper; + if (listWrapper) { + for (let i = 1; i <= listWrapper.nestingLevel; i++) { + const wrapperName = listNameByNestingLevel(i, listWrapper.baseType); + if (this.processedTypes.has(wrapperName) || this.nestedListWrappers.has(wrapperName)) { + continue; + } - if (isNonNullType(graphqlType)) { - // For non-null scalar types, use the base type - if (isScalarType(graphqlType.ofType)) { - return { typeName: SCALAR_TYPE_MAP[graphqlType.ofType.name] || 'string', isRepeated: false }; + const wrapperMessage = createNestedListWrapper(this.includeComments, i, listWrapper.baseType); + this.nestedListWrappers.set(wrapperName, wrapperMessage); + this.processedTypes.add(wrapperName); } - - return this.getProtoTypeFromGraphQL(graphqlType.ofType); - } - // Named types (object, interface, union, input) - const namedType = graphqlType as GraphQLNamedType; - if (namedType && typeof namedType.name === 'string') { - return { typeName: namedType.name, isRepeated: false }; - } - - return { typeName: 'string', isRepeated: false }; // Default fallback - } - - /** - * Converts GraphQL list types to appropriate Protocol Buffer representations. - * - * For non-nullable, single-level lists (e.g., [String!]!), generates simple repeated fields. - * For nullable lists (e.g., [String]) or nested lists (e.g., [[String]]), creates wrapper - * messages to properly handle nullability in proto3. - * - * Examples: - * - [String!]! → repeated string field_name = 1; - * - [String] → ListOfString field_name = 1; (with wrapper message) - * - [[String!]!]! → ListOfListOfString field_name = 1; (with nested wrapper messages) - * - [[String]] → ListOfListOfString field_name = 1; (with nested wrapper messages) - * - * @param graphqlType - The GraphQL list type to convert - * @returns ProtoType object containing the type name and whether it should be repeated - */ - private handleListType(graphqlType: GraphQLList | GraphQLNonNull>): ProtoType { - const listType = unwrapNonNullType(graphqlType); - const isNullableList = !isNonNullType(graphqlType); - const isNested = isNestedListType(listType); - - // Simple non-nullable lists can use repeated fields directly - if (!isNullableList && !isNested) { - return { ...this.getProtoTypeFromGraphQL(getNamedType(listType), true), isRepeated: true }; - } - - // Nullable or nested lists need wrapper messages - const baseType = getNamedType(listType); - const nestingLevel = calculateNestingLevel(listType); - - // For nested lists, always use full nesting level to preserve inner list nullability - // For single-level nullable lists, use nesting level 1 - const wrapperNestingLevel = isNested ? nestingLevel : 1; - - // Generate all required wrapper messages - let wrapperName = ''; - for (let i = 1; i <= wrapperNestingLevel; i++) { - wrapperName = this.createNestedListWrapper(i, baseType); - } - - // For nested lists, never use repeated at field level to preserve nullability - return { typeName: wrapperName, isRepeated: false }; - } - - /** - * Creates wrapper messages for nullable or nested GraphQL lists. - * - * Generates Protocol Buffer message definitions to handle list nullability and nesting. - * The wrapper messages are stored and later included in the final proto output. - * - * For level 1: Creates simple wrapper like: - * message ListOfString { - * repeated string items = 1; - * } - * - * For level > 1: Creates nested wrapper structures like: - * message ListOfListOfString { - * message List { - * repeated ListOfString items = 1; - * } - * List list = 1; - * } - * - * @param level - The nesting level (1 for simple wrapper, >1 for nested structures) - * @param baseType - The GraphQL base type being wrapped (e.g., String, User, etc.) - * @returns The generated wrapper message name (e.g., "ListOfString", "ListOfListOfUser") - */ - private createNestedListWrapper(level: number, baseType: GraphQLNamedType): string { - const wrapperName = `${'ListOf'.repeat(level)}${baseType.name}`; - - // Return existing wrapper if already created - if (this.processedTypes.has(wrapperName) || this.nestedListWrappers.has(wrapperName)) { - return wrapperName; } - this.processedTypes.add(wrapperName); - - const messageLines = this.buildWrapperMessage(wrapperName, level, baseType); - this.nestedListWrappers.set(wrapperName, messageLines.join('\n')); - - return wrapperName; - } - - /** - * Builds the message lines for a wrapper message - */ - private buildWrapperMessage(wrapperName: string, level: number, baseType: GraphQLNamedType): string[] { - const lines: string[] = []; - - // Add comment if enabled - if (this.includeComments) { - lines.push(...this.formatComment(`Wrapper message for a list of ${baseType.name}.`, 0)); - } - - const formatIndent = (indent: number, content: string) => { - return ' '.repeat(indent) + content; - }; - - lines.push(`message ${wrapperName} {`); - let innerWrapperName = ''; - if (level > 1) { - innerWrapperName = `${'ListOf'.repeat(level - 1)}${baseType.name}`; - } else { - innerWrapperName = this.getProtoTypeFromGraphQL(baseType, true).typeName; - } - - lines.push( - formatIndent(1, `message List {`), - formatIndent(2, `repeated ${innerWrapperName} items = 1;`), - formatIndent(1, `}`), - formatIndent(1, `List list = 1;`), - formatIndent(0, `}`), - ); - - return lines; - } - - /** - * Get indentation based on the current level - * - * Helper method to maintain consistent indentation in the output. - * - * @returns String with spaces for the current indentation level - */ - private getIndent(): string { - return ' '.repeat(this.indent); + return protoFieldType; } /** @@ -2166,19 +2058,7 @@ Example: * @returns Array of comment lines with proper indentation */ private formatComment(description: string | undefined | null, indentLevel: number = 0): string[] { - if (!this.includeComments || !description) { - return []; - } - - // Use 2-space indentation consistently - const indent = ' '.repeat(indentLevel); - const lines = description.trim().split('\n'); - - if (lines.length === 1) { - return [`${indent}// ${lines[0]}`]; - } else { - return [`${indent}/*`, ...lines.map((line) => `${indent} * ${line}`), `${indent} */`]; - } + return formatComment(this.includeComments, description, indentLevel); } /** @@ -2187,34 +2067,6 @@ Example: * @returns The message definition */ private buildMessage(message: ProtoMessage): string[] { - const messageLines = this.formatComment(message.description, 0); - messageLines.push(`message ${message.messageName} {`); - if (message.reservedNumbers && message.reservedNumbers.length > 0) { - messageLines.push(this.formatIndent(1, `reserved ${message.reservedNumbers};`)); - } - - message.fields.forEach((field) => { - if (field.description) { - messageLines.push(...this.formatComment(field.description, 1)); - } - - let repeated = field.isRepeated ? 'repeated ' : ''; - - messageLines.push( - this.formatIndent(1, `${repeated}${field.typeName} ${field.fieldName} = ${field.fieldNumber};`), - ); - }); - messageLines.push('}', ''); - return messageLines; - } - - /** - * Formats the indent for the content - * @param indent - The indent level - * @param content - The content to format - * @returns The formatted content - */ - private formatIndent(indent: number, content: string): string { - return ' '.repeat(indent) + content; + return buildProtoMessage(this.includeComments, message); } } diff --git a/protographic/src/sdl-validation-visitor.ts b/protographic/src/sdl-validation-visitor.ts index 5a66efb9c3..26fa853e41 100644 --- a/protographic/src/sdl-validation-visitor.ts +++ b/protographic/src/sdl-validation-visitor.ts @@ -13,8 +13,12 @@ import { NamedTypeNode, GraphQLID, ConstArgumentNode, + GraphQLObjectType, + GraphQLSchema, + buildSchema, } from 'graphql'; -import { CONNECT_FIELD_RESOLVER, CONTEXT } from './string-constants.js'; +import { CONNECT_FIELD_RESOLVER, CONTEXT, FIELDS, REQUIRES_DIRECTIVE_NAME } from './string-constants.js'; +import { SelectionSetValidationVisitor } from './selection-set-validation-visitor.js'; /** * Type mapping from Kind enum values to their corresponding AST node types @@ -86,6 +90,7 @@ interface MessageContext { */ export class SDLValidationVisitor { private readonly schema: string; + private readonly schemaObject: GraphQLSchema; private readonly validationResult: ValidationResult; private lintingRules: LintingRule[] = []; private visitor: ASTVisitor; @@ -96,6 +101,7 @@ export class SDLValidationVisitor { */ constructor(schema: string) { this.schema = schema; + this.schemaObject = buildSchema(schema, { assumeValid: true, assumeValidSDL: true }); this.validationResult = { errors: [], warnings: [], @@ -127,10 +133,11 @@ export class SDLValidationVisitor { validationFunction: (ctx) => this.validateListTypeNullability(ctx), }; + // Requires directive support will currently be added. This rule will be removed in the future. const requiresRule: LintingRule = { name: 'use-of-requires', description: 'Validates usage of @requires directive which is not yet supported', - enabled: true, + enabled: false, nodeKind: Kind.FIELD_DEFINITION, validationFunction: (ctx) => this.validateRequiresDirective(ctx), }; @@ -151,7 +158,22 @@ export class SDLValidationVisitor { validationFunction: (ctx) => this.validateInvalidResolverContext(ctx), }; - this.lintingRules = [objectTypeRule, listTypeRule, requiresRule, providesRule, resolverContextRule]; + const disallowAbstractTypesForRequiresRule: LintingRule = { + name: 'disallow-abstract-types-for-requires', + description: 'Validates that abstract types are not used in requires directives', + enabled: true, + nodeKind: Kind.FIELD_DEFINITION, + validationFunction: (ctx) => this.validateDisallowAbstractTypesForRequires(ctx), + }; + + this.lintingRules = [ + objectTypeRule, + listTypeRule, + requiresRule, + providesRule, + resolverContextRule, + disallowAbstractTypesForRequiresRule, + ]; } /** @@ -304,7 +326,9 @@ export class SDLValidationVisitor { * @private */ private validateRequiresDirective(ctx: VisitContext): void { - const hasRequiresDirective = ctx.node.directives?.some((directive) => directive.name.value === 'requires'); + const hasRequiresDirective = ctx.node.directives?.some( + (directive) => directive.name.value === REQUIRES_DIRECTIVE_NAME, + ); if (hasRequiresDirective) { this.addWarning('Use of requires is not supported yet', ctx.node.loc); @@ -370,6 +394,35 @@ export class SDLValidationVisitor { } } + private validateDisallowAbstractTypesForRequires(ctx: VisitContext): void { + const requiredDirective = ctx.node.directives?.find( + (directive) => directive.name.value === REQUIRES_DIRECTIVE_NAME, + ); + if (!requiredDirective) return; + + const fieldSelections = requiredDirective.arguments?.find((arg) => arg.name.value === FIELDS)?.value; + if (!fieldSelections || fieldSelections.kind !== Kind.STRING) return; + + const parentType = ctx.ancestors[ctx.ancestors.length - 1]; + + if (!this.isASTObjectTypeNode(parentType)) return; + + const operationDoc = parse(`{ ${fieldSelections.value} }`); + + const selectionSetValidationVisitor = new SelectionSetValidationVisitor( + operationDoc, + this.schemaObject.getType(parentType.name.value) as GraphQLObjectType, + ); + selectionSetValidationVisitor.visit(); + for (const error of selectionSetValidationVisitor.getValidationResult().errors) { + this.addError(error, ctx.node.loc); + } + + for (const warning of selectionSetValidationVisitor.getValidationResult().warnings) { + this.addWarning(warning, ctx.node.loc); + } + } + private getResolverContext(node: FieldDefinitionNode): ConstArgumentNode | undefined { return node.directives ?.find((directive) => directive.name.value === CONNECT_FIELD_RESOLVER) diff --git a/protographic/src/selection-set-validation-visitor.ts b/protographic/src/selection-set-validation-visitor.ts new file mode 100644 index 0000000000..dd9d2cc6cf --- /dev/null +++ b/protographic/src/selection-set-validation-visitor.ts @@ -0,0 +1,233 @@ +import { + ASTNode, + ASTVisitor, + BREAK, + DocumentNode, + FieldNode, + GraphQLField, + GraphQLNamedType, + GraphQLObjectType, + GraphQLType, + InlineFragmentNode, + isInterfaceType, + isNamedType, + isObjectType, + isUnionType, + Kind, + SelectionSetNode, + visit, +} from 'graphql'; +import { VisitContext } from './types'; +import { ValidationResult } from './sdl-validation-visitor'; + +/** + * Validates selection sets within @requires directive field sets. + * + * This visitor traverses a parsed field set document and enforces constraints + * specific to @requires directives: + * - Abstract types (interfaces, unions) are not allowed + * - Inline fragments are not allowed + * + * @example + * ```typescript + * const doc = parse('{ address { street city } }'); + * const visitor = new SelectionSetValidationVisitor(doc, ProductType); + * visitor.visit(); + * const result = visitor.getValidationResult(); + * if (result.errors.length > 0) { + * console.error('Validation failed:', result.errors); + * } + * ``` + */ +export class SelectionSetValidationVisitor { + private currentType: GraphQLObjectType; + private ancestors: GraphQLObjectType[] = []; + private readonly operationDocument: DocumentNode; + + private validationResult: ValidationResult = { + errors: [], + warnings: [], + }; + + /** + * Creates a new SelectionSetValidationVisitor. + * + * @param operationDocument - The parsed GraphQL document representing the field set + * @param objectType - The root GraphQL object type to validate against + */ + constructor(operationDocument: DocumentNode, objectType: GraphQLObjectType) { + this.operationDocument = operationDocument; + this.currentType = objectType; + } + + /** + * Executes the validation by traversing the operation document. + * After calling this method, use `getValidationResult()` to retrieve any errors or warnings. + */ + public visit(): void { + visit(this.operationDocument, this.createASTVisitor()); + } + + /** + * Returns the validation result containing any errors and warnings found during traversal. + * + * @returns The validation result with errors and warnings arrays + */ + public getValidationResult(): ValidationResult { + return this.validationResult; + } + + /** + * Creates the AST visitor configuration for traversing the document. + * + * @returns An ASTVisitor object with handlers for Field and SelectionSet nodes + */ + private createASTVisitor(): ASTVisitor { + return { + Field: { + enter: (node, key, parent, path, ancestors) => { + return this.onEnterField({ node, key, parent, path, ancestors }); + }, + }, + SelectionSet: { + enter: (node, key, parent, path, ancestors) => { + return this.onEnterSelectionSet({ node, key, parent, path, ancestors }); + }, + leave: (node, key, parent, path, ancestors) => { + this.onLeaveSelectionSet({ node, key, parent, path, ancestors }); + }, + }, + }; + } + + /** + * Handles entering a field node during traversal. + * Validates that the field's type is not an abstract type (interface or union). + * + * @param ctx - The visit context containing the field node and its ancestors + * @returns BREAK if validation fails to stop traversal, undefined otherwise + */ + private onEnterField(ctx: VisitContext): any { + const fieldDefitinion = this.getFieldDefinition(ctx.node); + const namedType = this.getUnderlyingType(fieldDefitinion.type); + + if (this.isAbstractType(namedType)) { + this.validationResult.errors.push( + `Abstract types are not allowed in requires directives. Found ${namedType.name} in ${this.currentType.name}.${ctx.node.name.value}`, + ); + return BREAK; + } + } + + /** + * Unwraps a GraphQL type to get its underlying named type. + * Strips NonNull and List wrappers to get the base type. + * + * @param type - The GraphQL type to unwrap + * @returns The underlying named type + */ + private getUnderlyingType(type: GraphQLType): GraphQLNamedType { + while (!isNamedType(type)) { + type = type.ofType; + } + + return type; + } + + /** + * Retrieves the field definition for a field node from the current type. + * + * @param node - The field node to look up + * @returns The GraphQL field definition + * @throws Error if the field definition is not found on the current type + */ + private getFieldDefinition(node: FieldNode): GraphQLField { + const fieldDef = this.currentType.getFields()[node.name.value]; + if (!fieldDef) throw new Error(`Field definition not found for field ${node.name.value}`); + return fieldDef; + } + + /** + * Handles entering a selection set node during traversal. + * Validates that inline fragments are not used and updates the current type + * context when descending into nested object types. + * + * @param ctx - The visit context containing the selection set node and its parent + * @returns BREAK if validation fails to stop traversal, undefined otherwise + */ + private onEnterSelectionSet(ctx: VisitContext): any { + if (!ctx.parent) return; + + if (this.isInlineFragment(ctx.parent)) { + this.validationResult.errors.push('Inline fragments are not allowed in requires directives'); + return BREAK; + } + + if (!this.isFieldNode(ctx.parent)) { + return; + } + + const fieldDefinition = this.getFieldDefinition(ctx.parent); + if (!fieldDefinition) { + return; + } + + const namedType = this.getUnderlyingType(fieldDefinition.type); + if (isObjectType(namedType)) { + this.ancestors.push(this.currentType); + this.currentType = namedType; + return; + } + } + + /** + * Handles leaving a selection set node during traversal. + * Restores the previous type context when ascending back up the tree. + * + * @param ctx - The visit context containing the selection set node and its parent + */ + private onLeaveSelectionSet(ctx: VisitContext): void { + if (!ctx.parent) return; + + if (!this.isFieldNode(ctx.parent)) { + return; + } + + this.currentType = this.ancestors.pop() ?? this.currentType; + } + + /** + * Type guard to check if a node is an InlineFragmentNode. + * + * @param node - The AST node or array of nodes to check + * @returns True if the node is an InlineFragmentNode + */ + private isInlineFragment(node: ASTNode | readonly ASTNode[]): node is InlineFragmentNode { + if (Array.isArray(node)) { + return false; + } + + return (node as ASTNode).kind === Kind.INLINE_FRAGMENT; + } + + /** + * Type guard to check if a node is a FieldNode. + * + * @param node - The AST node or array of nodes to check + * @returns True if the node is a FieldNode + */ + private isFieldNode(node: ASTNode | ReadonlyArray): node is FieldNode { + if (Array.isArray(node)) return false; + return (node as ASTNode).kind === Kind.FIELD; + } + + /** + * Checks if a named type is an abstract type (interface or union). + * + * @param node - The GraphQL named type to check + * @returns True if the type is an interface or union type + */ + private isAbstractType(node: GraphQLNamedType): boolean { + return isInterfaceType(node) || isUnionType(node); + } +} diff --git a/protographic/src/string-constants.ts b/protographic/src/string-constants.ts index 8f5af6760f..6218c0fa64 100644 --- a/protographic/src/string-constants.ts +++ b/protographic/src/string-constants.ts @@ -1,3 +1,7 @@ +export const KEY_DIRECTIVE_NAME = 'key'; +export const EXTERNAL_DIRECTIVE_NAME = 'external'; +export const REQUIRES_DIRECTIVE_NAME = 'requires'; +export const FIELDS = 'fields'; export const CONNECT_FIELD_RESOLVER = 'connect__fieldResolver'; export const CONTEXT = 'context'; export const FIELD_ARGS = 'field_args'; diff --git a/protographic/src/types.ts b/protographic/src/types.ts index cb36fa64ae..282ea0718f 100644 --- a/protographic/src/types.ts +++ b/protographic/src/types.ts @@ -1,5 +1,42 @@ +import { ASTNode, GraphQLNamedType } from 'graphql'; import protobuf from 'protobufjs'; +export type VisitContext = { + node: T; + key: string | number | undefined; + parent: ASTNode | ReadonlyArray | undefined; + path: ReadonlyArray; + ancestors: ReadonlyArray>; +}; + +/** + * Maps GraphQL scalar types to Protocol Buffer types + * + * GraphQL has a smaller set of primitive types compared to Protocol Buffers. + * This mapping ensures consistent representation between the two type systems. + */ +export const SCALAR_TYPE_MAP: Record = { + ID: 'string', // GraphQL IDs map to Proto strings + String: 'string', // Direct mapping + Int: 'int32', // GraphQL Int is 32-bit signed + Float: 'double', // Using double for GraphQL Float gives better precision + Boolean: 'bool', // Direct mapping +}; + +/** + * Maps GraphQL scalar types to Protocol Buffer wrapper types for nullable fields + * + * These wrapper types allow distinguishing between unset fields and zero values + * in Protocol Buffers, which is important for GraphQL nullable semantics. + */ +export const SCALAR_WRAPPER_TYPE_MAP: Record = { + ID: 'google.protobuf.StringValue', + String: 'google.protobuf.StringValue', + Int: 'google.protobuf.Int32Value', + Float: 'google.protobuf.DoubleValue', + Boolean: 'google.protobuf.BoolValue', +}; + /** * Protocol Buffer idempotency levels for RPC methods * @see https://protobuf.dev/reference/protobuf/google.protobuf/#idempotency-level @@ -12,3 +49,98 @@ export type IdempotencyLevel = 'NO_SIDE_EFFECTS' | 'DEFAULT'; export interface MethodWithIdempotency extends protobuf.Method { idempotencyLevel?: IdempotencyLevel; } + +/** + * Represents a gRPC method definition + * + * example: rpc GetUser(GetUserRequest) returns (GetUserResponse) {} + */ +export type RPCMethod = { + name: string; + request: string; + response: string; + description?: string | null; +}; + +/** + * Represents a field in a proto message + */ +export interface ProtoMessageField { + fieldName: string; + typeName: string; + fieldNumber: number; + isRepeated?: boolean; + description?: string; + // The original name of the field in the GraphQL schema + graphqlName?: string; +} + +/** + * Represents a proto message + */ +export interface ProtoMessage { + messageName: string; + reservedNumbers?: string; + description?: string; + fields: ProtoMessageField[]; + + /** + * Nested messages within this message (if any) + * Example: message User { + * message Address { + * string street = 1; + * string city = 2; + * string state = 3; + * string zip = 4; + * } + * Address address = 1; + */ + nestedMessages?: ProtoMessage[]; + compositeType?: CompositeMessageDefinition; +} + +export interface ListWrapper { + baseType: GraphQLNamedType; + nestingLevel: number; +} + +/** + * Data structure for formatting message fields + */ +export type ProtoFieldType = { + typeName: string; + isWrapper: boolean; + isRepeated: boolean; + listWrapper?: ListWrapper; +}; + +export enum CompositeMessageKind { + INTERFACE, + UNION, +} + +export type CompositeMessageDefinition = InterfaceMessageDefinition | UnionMessageDefinition; + +export type InterfaceMessageDefinition = { + kind: CompositeMessageKind.INTERFACE; + description?: string; + typeName: string; + implementingTypes: string[]; +}; + +export type UnionMessageDefinition = { + kind: CompositeMessageKind.UNION; + description?: string; + typeName: string; + memberTypes: string[]; +}; + +export function isInterfaceMessageDefinition( + message: CompositeMessageDefinition, +): message is InterfaceMessageDefinition { + return message.kind === CompositeMessageKind.INTERFACE; +} + +export function isUnionMessageDefinition(message: CompositeMessageDefinition): message is UnionMessageDefinition { + return message.kind === CompositeMessageKind.UNION; +} diff --git a/protographic/tests/field-set/01-basics.test.ts b/protographic/tests/field-set/01-basics.test.ts new file mode 100644 index 0000000000..9fde4f8a8f --- /dev/null +++ b/protographic/tests/field-set/01-basics.test.ts @@ -0,0 +1,1151 @@ +import { describe, expect, it } from 'vitest'; +import { RequiredFieldsVisitor } from '../../src'; +import { buildSchema, GraphQLObjectType, StringValueNode, visit } from 'graphql'; +import { buildProtoMessage } from '../../src/proto-utils'; +import { + CompositeMessageKind, + InterfaceMessageDefinition, + isInterfaceMessageDefinition, + isUnionMessageDefinition, + ProtoMessageField, + UnionMessageDefinition, +} from '../../src/types'; + +describe('Field Set Visitor', () => { + it('should visit a field set for a scalar type', () => { + const sdl = ` + type User @key(fields: "id") { + id: ID! + name: String! @external + age: Int @requires(fields: "name") + } + `; + + const schema = buildSchema(sdl, { + assumeValid: true, + assumeValidSDL: true, + }); + + const typeMap = schema.getTypeMap(); + const entity = typeMap['User'] as GraphQLObjectType | undefined; + if (!entity) { + throw new Error('Entity not found'); + } + + const requiredField = entity.getFields()['age']; + expect(requiredField).toBeDefined(); + + const fieldSet = ( + requiredField.astNode?.directives?.find((d) => d.name.value === 'requires')?.arguments?.[0] + .value as StringValueNode + ).value; + + const visitor = new RequiredFieldsVisitor(schema, entity, requiredField, fieldSet); + visitor.visit(); + const rpcMethods = visitor.getRPCMethods(); + const messageDefinitions = visitor.getMessageDefinitions(); + + expect(rpcMethods).toHaveLength(1); + expect(rpcMethods[0].name).toBe('RequireUserAgeById'); + expect(messageDefinitions).toHaveLength(5); + expect(messageDefinitions).toEqual( + expect.arrayContaining([ + expect.objectContaining({ messageName: 'RequireUserAgeByIdRequest' }), + expect.objectContaining({ messageName: 'RequireUserAgeByIdContext' }), + expect.objectContaining({ messageName: 'RequireUserAgeByIdResponse' }), + expect.objectContaining({ messageName: 'RequireUserAgeByIdResult' }), + expect.objectContaining({ messageName: 'RequireUserAgeByIdFields' }), + ]), + ); + + let fieldMessage = messageDefinitions.find((message) => message.messageName === 'RequireUserAgeByIdFields'); + expect(fieldMessage).toBeDefined(); + expect(fieldMessage?.fields).toHaveLength(1); + expect(fieldMessage?.fields?.[0].fieldName).toBe('name'); + expect(fieldMessage?.fields?.[0].typeName).toBe('string'); + expect(fieldMessage?.fields?.[0].fieldNumber).toBe(1); + expect(fieldMessage?.fields?.[0].isRepeated).toBe(false); + }); + it('should visit a field set for a scalar type and deduplicate fields', () => { + const sdl = ` + type User @key(fields: "id") { + id: ID! + name: String! @external + age: Int @requires(fields: "name") + } + `; + + const schema = buildSchema(sdl, { + assumeValid: true, + assumeValidSDL: true, + }); + + const typeMap = schema.getTypeMap(); + const entity = typeMap['User'] as GraphQLObjectType | undefined; + if (!entity) { + throw new Error('Entity not found'); + } + + const requiredField = entity.getFields()['age']; + expect(requiredField).toBeDefined(); + + const fieldSet = ( + requiredField.astNode?.directives?.find((d) => d.name.value === 'requires')?.arguments?.[0] + .value as StringValueNode + ).value; + + const visitor = new RequiredFieldsVisitor(schema, entity, requiredField, fieldSet); + visitor.visit(); + const rpcMethods = visitor.getRPCMethods(); + const messageDefinitions = visitor.getMessageDefinitions(); + + expect(rpcMethods).toHaveLength(1); + expect(rpcMethods[0].name).toBe('RequireUserAgeById'); + expect(messageDefinitions).toHaveLength(5); + expect(messageDefinitions).toEqual( + expect.arrayContaining([ + expect.objectContaining({ messageName: 'RequireUserAgeByIdRequest' }), + expect.objectContaining({ messageName: 'RequireUserAgeByIdContext' }), + expect.objectContaining({ messageName: 'RequireUserAgeByIdResponse' }), + expect.objectContaining({ messageName: 'RequireUserAgeByIdResult' }), + expect.objectContaining({ messageName: 'RequireUserAgeByIdFields' }), + ]), + ); + + let fieldMessage = messageDefinitions.find((message) => message.messageName === 'RequireUserAgeByIdFields'); + expect(fieldMessage).toBeDefined(); + expect(fieldMessage?.fields).toHaveLength(1); + expect(fieldMessage?.fields?.[0].fieldName).toBe('name'); + expect(fieldMessage?.fields?.[0].typeName).toBe('string'); + expect(fieldMessage?.fields?.[0].fieldNumber).toBe(1); + expect(fieldMessage?.fields?.[0].isRepeated).toBe(false); + }); + it('should visit a field set for an object type', () => { + const sdl = ` + type User @key(fields: "id") { + id: ID! + description: String! @external + details: Details! @requires(fields: "description") + } + + type Details { + firstName: String! + lastName: String! + } + `; + + const schema = buildSchema(sdl, { + assumeValid: true, + assumeValidSDL: true, + }); + + const typeMap = schema.getTypeMap(); + const entity = typeMap['User'] as GraphQLObjectType | undefined; + if (!entity) { + throw new Error('Entity not found'); + } + + const requiredField = entity.getFields()['details']; + expect(requiredField).toBeDefined(); + + const fieldSet = `description`; + + const visitor = new RequiredFieldsVisitor(schema, entity, requiredField, fieldSet); + visitor.visit(); + const rpcMethods = visitor.getRPCMethods(); + const messageDefinitions = visitor.getMessageDefinitions(); + + expect(rpcMethods).toHaveLength(1); + expect(rpcMethods[0].name).toBe('RequireUserDetailsById'); + expect(messageDefinitions).toHaveLength(5); + expect(messageDefinitions).toEqual( + expect.arrayContaining([ + expect.objectContaining({ messageName: 'RequireUserDetailsByIdRequest' }), + expect.objectContaining({ messageName: 'RequireUserDetailsByIdContext' }), + expect.objectContaining({ messageName: 'RequireUserDetailsByIdResponse' }), + expect.objectContaining({ messageName: 'RequireUserDetailsByIdResult' }), + expect.objectContaining({ messageName: 'RequireUserDetailsByIdFields' }), + ]), + ); + + let fieldMessage = messageDefinitions.find((message) => message.messageName === 'RequireUserDetailsByIdFields'); + expect(fieldMessage).toBeDefined(); + expect(fieldMessage?.fields).toHaveLength(1); + assertFieldMessage(fieldMessage?.fields[0], { + fieldName: 'description', + typeName: 'string', + fieldNumber: 1, + isRepeated: false, + }); + + let resultMessage = messageDefinitions.find((message) => message.messageName === 'RequireUserDetailsByIdResult'); + expect(resultMessage).toBeDefined(); + expect(resultMessage?.fields).toHaveLength(1); + assertFieldMessage(resultMessage?.fields[0], { + fieldName: 'details', + typeName: 'Details', + fieldNumber: 1, + isRepeated: false, + }); + }); + + it('should visit a field set for a list type', () => { + const sdl = ` + type User @key(fields: "id") { + id: ID! + descriptions: [String!]! @external + details: [Details!]! @requires(fields: "descriptions") + } + + type Details { + firstName: String! + lastName: String! + } + `; + + const schema = buildSchema(sdl, { + assumeValid: true, + assumeValidSDL: true, + }); + + const typeMap = schema.getTypeMap(); + const entity = typeMap['User'] as GraphQLObjectType | undefined; + if (!entity) { + throw new Error('Entity not found'); + } + + const requiredField = entity.getFields()['details']; + expect(requiredField).toBeDefined(); + + const fieldSet = ( + requiredField.astNode?.directives?.find((d) => d.name.value === 'requires')?.arguments?.[0] + .value as StringValueNode + ).value; + + const visitor = new RequiredFieldsVisitor(schema, entity, requiredField, fieldSet); + visitor.visit(); + const rpcMethods = visitor.getRPCMethods(); + const messageDefinitions = visitor.getMessageDefinitions(); + + expect(rpcMethods).toHaveLength(1); + expect(rpcMethods[0].name).toBe('RequireUserDetailsById'); + expect(messageDefinitions).toHaveLength(5); + expect(messageDefinitions).toEqual( + expect.arrayContaining([ + expect.objectContaining({ messageName: 'RequireUserDetailsByIdRequest' }), + expect.objectContaining({ messageName: 'RequireUserDetailsByIdContext' }), + expect.objectContaining({ messageName: 'RequireUserDetailsByIdResponse' }), + expect.objectContaining({ messageName: 'RequireUserDetailsByIdResult' }), + expect.objectContaining({ messageName: 'RequireUserDetailsByIdFields' }), + ]), + ); + + let fieldMessage = messageDefinitions.find((message) => message.messageName === 'RequireUserDetailsByIdFields'); + expect(fieldMessage).toBeDefined(); + expect(fieldMessage?.fields).toHaveLength(1); + assertFieldMessage(fieldMessage?.fields[0], { + fieldName: 'descriptions', + typeName: 'string', + fieldNumber: 1, + isRepeated: true, + }); + + let resultMessage = messageDefinitions.find((message) => message.messageName === 'RequireUserDetailsByIdResult'); + expect(resultMessage).toBeDefined(); + expect(resultMessage?.fields).toHaveLength(1); + assertFieldMessage(resultMessage?.fields[0], { + fieldName: 'details', + typeName: 'Details', + fieldNumber: 1, + isRepeated: true, + }); + }); + + it('should visit a field set for nullable list types', () => { + const sdl = ` + type User @key(fields: "id") { + id: ID! + descriptions: [String!] @external + details: [Details!] @requires(fields: "descriptions") + } + + type Details { + firstName: String! + lastName: String! + } + `; + + const schema = buildSchema(sdl, { + assumeValid: true, + assumeValidSDL: true, + }); + + const typeMap = schema.getTypeMap(); + const entity = typeMap['User'] as GraphQLObjectType | undefined; + if (!entity) { + throw new Error('Entity not found'); + } + + const requiredField = entity.getFields()['details']; + expect(requiredField).toBeDefined(); + + const fieldSet = `descriptions`; + + const visitor = new RequiredFieldsVisitor(schema, entity, requiredField, fieldSet); + visitor.visit(); + const rpcMethods = visitor.getRPCMethods(); + const messageDefinitions = visitor.getMessageDefinitions(); + + expect(rpcMethods).toHaveLength(1); + expect(rpcMethods[0].name).toBe('RequireUserDetailsById'); + expect(messageDefinitions).toHaveLength(5); + expect(messageDefinitions).toEqual( + expect.arrayContaining([ + expect.objectContaining({ messageName: 'RequireUserDetailsByIdRequest' }), + expect.objectContaining({ messageName: 'RequireUserDetailsByIdContext' }), + expect.objectContaining({ messageName: 'RequireUserDetailsByIdResponse' }), + expect.objectContaining({ messageName: 'RequireUserDetailsByIdResult' }), + expect.objectContaining({ messageName: 'RequireUserDetailsByIdFields' }), + ]), + ); + + let fieldMessage = messageDefinitions.find((message) => message.messageName === 'RequireUserDetailsByIdFields'); + expect(fieldMessage).toBeDefined(); + expect(fieldMessage?.fields).toHaveLength(1); + assertFieldMessage(fieldMessage?.fields[0], { + fieldName: 'descriptions', + typeName: 'ListOfString', + fieldNumber: 1, + isRepeated: false, + }); + + let resultMessage = messageDefinitions.find((message) => message.messageName === 'RequireUserDetailsByIdResult'); + expect(resultMessage).toBeDefined(); + expect(resultMessage?.fields).toHaveLength(1); + assertFieldMessage(resultMessage?.fields[0], { + fieldName: 'details', + typeName: 'ListOfDetails', + fieldNumber: 1, + isRepeated: false, + }); + }); + + it('should visit a field set for multiple field selections', () => { + const sdl = ` + type User @key(fields: "id") { + id: ID! + descriptions: [String!] @external + field: String! @external + otherField: String! @external + details: [Details!] @requires(fields: "descriptions field otherField") + } + + type Details { + firstName: String! + lastName: String! + } + `; + + const schema = buildSchema(sdl, { + assumeValid: true, + assumeValidSDL: true, + }); + + const typeMap = schema.getTypeMap(); + const entity = typeMap['User'] as GraphQLObjectType | undefined; + if (!entity) { + throw new Error('Entity not found'); + } + + const requiredField = entity.getFields()['details']; + expect(requiredField).toBeDefined(); + + const fieldSet = ( + requiredField.astNode?.directives?.find((d) => d.name.value === 'requires')?.arguments?.[0] + .value as StringValueNode + ).value; + + const visitor = new RequiredFieldsVisitor(schema, entity, requiredField, fieldSet); + visitor.visit(); + const rpcMethods = visitor.getRPCMethods(); + const messageDefinitions = visitor.getMessageDefinitions(); + + expect(rpcMethods).toHaveLength(1); + expect(rpcMethods[0].name).toBe('RequireUserDetailsById'); + expect(messageDefinitions).toHaveLength(5); + expect(messageDefinitions).toEqual( + expect.arrayContaining([ + expect.objectContaining({ messageName: 'RequireUserDetailsByIdRequest' }), + expect.objectContaining({ messageName: 'RequireUserDetailsByIdContext' }), + expect.objectContaining({ messageName: 'RequireUserDetailsByIdResponse' }), + expect.objectContaining({ messageName: 'RequireUserDetailsByIdResult' }), + expect.objectContaining({ messageName: 'RequireUserDetailsByIdFields' }), + ]), + ); + + let fieldMessage = messageDefinitions.find((message) => message.messageName === 'RequireUserDetailsByIdFields'); + expect(fieldMessage).toBeDefined(); + expect(fieldMessage?.fields).toHaveLength(3); + assertFieldMessage(fieldMessage?.fields[0], { + fieldName: 'descriptions', + typeName: 'ListOfString', + fieldNumber: 1, + isRepeated: false, + }); + assertFieldMessage(fieldMessage?.fields[1], { + fieldName: 'field', + typeName: 'string', + fieldNumber: 2, + isRepeated: false, + }); + assertFieldMessage(fieldMessage?.fields[2], { + fieldName: 'other_field', + typeName: 'string', + fieldNumber: 3, + isRepeated: false, + }); + + let resultMessage = messageDefinitions.find((message) => message.messageName === 'RequireUserDetailsByIdResult'); + expect(resultMessage).toBeDefined(); + expect(resultMessage?.fields).toHaveLength(1); + assertFieldMessage(resultMessage?.fields[0], { + fieldName: 'details', + typeName: 'ListOfDetails', + fieldNumber: 1, + isRepeated: false, + }); + }); + + it('should visit a field set with nested field selections', () => { + const sdl = ` + type User @key(fields: "id") { + id: ID! + description: Description! @external + details: Details! @requires(fields: "description { title score }") + } + + type Description { + title: String! + score: Int! + } + + type Details { + firstName: String! + lastName: String! + } + `; + + const schema = buildSchema(sdl, { + assumeValid: true, + assumeValidSDL: true, + }); + + const typeMap = schema.getTypeMap(); + const entity = typeMap['User'] as GraphQLObjectType | undefined; + if (!entity) { + throw new Error('Entity not found'); + } + + const requiredField = entity.getFields()['details']; + expect(requiredField).toBeDefined(); + + const fieldSet = ( + requiredField.astNode?.directives?.find((d) => d.name.value === 'requires')?.arguments?.[0] + .value as StringValueNode + ).value; + + const visitor = new RequiredFieldsVisitor(schema, entity, requiredField, fieldSet); + visitor.visit(); + const rpcMethods = visitor.getRPCMethods(); + const messageDefinitions = visitor.getMessageDefinitions(); + + expect(rpcMethods).toHaveLength(1); + expect(rpcMethods[0].name).toBe('RequireUserDetailsById'); + expect(messageDefinitions).toHaveLength(5); + expect(messageDefinitions).toEqual( + expect.arrayContaining([ + expect.objectContaining({ messageName: 'RequireUserDetailsByIdRequest' }), + expect.objectContaining({ messageName: 'RequireUserDetailsByIdContext' }), + expect.objectContaining({ messageName: 'RequireUserDetailsByIdResponse' }), + expect.objectContaining({ messageName: 'RequireUserDetailsByIdResult' }), + expect.objectContaining({ messageName: 'RequireUserDetailsByIdFields' }), + ]), + ); + + let fieldMessage = messageDefinitions.find((message) => message.messageName === 'RequireUserDetailsByIdFields'); + expect(fieldMessage).toBeDefined(); + expect(fieldMessage?.fields).toHaveLength(1); + assertFieldMessage(fieldMessage?.fields[0], { + fieldName: 'description', + typeName: 'Description', + fieldNumber: 1, + isRepeated: false, + }); + expect(fieldMessage?.nestedMessages).toHaveLength(1); + expect(fieldMessage?.nestedMessages?.[0].messageName).toBe('Description'); + expect(fieldMessage?.nestedMessages?.[0].fields).toHaveLength(2); + assertFieldMessage(fieldMessage?.nestedMessages?.[0].fields[0], { + fieldName: 'title', + typeName: 'string', + fieldNumber: 1, + isRepeated: false, + }); + assertFieldMessage(fieldMessage?.nestedMessages?.[0].fields[1], { + fieldName: 'score', + typeName: 'int32', + fieldNumber: 2, + isRepeated: false, + }); + + let resultMessage = messageDefinitions.find((message) => message.messageName === 'RequireUserDetailsByIdResult'); + expect(resultMessage).toBeDefined(); + expect(resultMessage?.fields).toHaveLength(1); + assertFieldMessage(resultMessage?.fields[0], { + fieldName: 'details', + typeName: 'Details', + fieldNumber: 1, + isRepeated: false, + }); + }); + + it('should visit a field set with multiple nested field selections', () => { + const sdl = ` + type User @key(fields: "id") { + id: ID! + description: Description! @external + details: Details! @requires(fields: "description { title score address { street city state zip } }") + } + + type Description { + title: String! + score: Int! + address: Address! + } + + type Address { + street: String! + city: String! + state: String! + zip: String! + } + + type Details { + firstName: String! + lastName: String! + } + `; + + const schema = buildSchema(sdl, { + assumeValid: true, + assumeValidSDL: true, + }); + + const typeMap = schema.getTypeMap(); + const entity = typeMap['User'] as GraphQLObjectType | undefined; + if (!entity) { + throw new Error('Entity not found'); + } + + const requiredField = entity.getFields()['details']; + expect(requiredField).toBeDefined(); + + const fieldSet = ( + requiredField.astNode?.directives?.find((d) => d.name.value === 'requires')?.arguments?.[0] + .value as StringValueNode + ).value; + + const visitor = new RequiredFieldsVisitor(schema, entity, requiredField, fieldSet); + visitor.visit(); + const rpcMethods = visitor.getRPCMethods(); + const messageDefinitions = visitor.getMessageDefinitions(); + + expect(rpcMethods).toHaveLength(1); + expect(rpcMethods[0].name).toBe('RequireUserDetailsById'); + expect(messageDefinitions).toHaveLength(5); + expect(messageDefinitions).toEqual( + expect.arrayContaining([ + expect.objectContaining({ messageName: 'RequireUserDetailsByIdRequest' }), + expect.objectContaining({ messageName: 'RequireUserDetailsByIdContext' }), + expect.objectContaining({ messageName: 'RequireUserDetailsByIdResponse' }), + expect.objectContaining({ messageName: 'RequireUserDetailsByIdResult' }), + expect.objectContaining({ messageName: 'RequireUserDetailsByIdFields' }), + ]), + ); + + let fieldMessage = messageDefinitions.find((message) => message.messageName === 'RequireUserDetailsByIdFields'); + expect(fieldMessage).toBeDefined(); + expect(fieldMessage?.fields).toHaveLength(1); + assertFieldMessage(fieldMessage?.fields[0], { + fieldName: 'description', + typeName: 'Description', + fieldNumber: 1, + isRepeated: false, + }); + expect(fieldMessage?.nestedMessages).toHaveLength(1); + expect(fieldMessage?.nestedMessages?.[0].messageName).toBe('Description'); + expect(fieldMessage?.nestedMessages?.[0].fields).toHaveLength(3); + assertFieldMessage(fieldMessage?.nestedMessages?.[0].fields[0], { + fieldName: 'title', + typeName: 'string', + fieldNumber: 1, + isRepeated: false, + }); + assertFieldMessage(fieldMessage?.nestedMessages?.[0].fields[1], { + fieldName: 'score', + typeName: 'int32', + fieldNumber: 2, + isRepeated: false, + }); + assertFieldMessage(fieldMessage?.nestedMessages?.[0].fields[2], { + fieldName: 'address', + typeName: 'Address', + fieldNumber: 3, + isRepeated: false, + }); + expect(fieldMessage?.nestedMessages?.[0].nestedMessages).toHaveLength(1); + expect(fieldMessage?.nestedMessages?.[0].nestedMessages?.[0].messageName).toBe('Address'); + expect(fieldMessage?.nestedMessages?.[0].nestedMessages?.[0].fields).toHaveLength(4); + assertFieldMessage(fieldMessage?.nestedMessages?.[0].nestedMessages?.[0].fields[0], { + fieldName: 'street', + typeName: 'string', + fieldNumber: 1, + isRepeated: false, + }); + assertFieldMessage(fieldMessage?.nestedMessages?.[0].nestedMessages?.[0].fields[1], { + fieldName: 'city', + typeName: 'string', + fieldNumber: 2, + isRepeated: false, + }); + assertFieldMessage(fieldMessage?.nestedMessages?.[0].nestedMessages?.[0].fields[2], { + fieldName: 'state', + typeName: 'string', + fieldNumber: 3, + isRepeated: false, + }); + assertFieldMessage(fieldMessage?.nestedMessages?.[0].nestedMessages?.[0].fields[3], { + fieldName: 'zip', + typeName: 'string', + fieldNumber: 4, + isRepeated: false, + }); + + let resultMessage = messageDefinitions.find((message) => message.messageName === 'RequireUserDetailsByIdResult'); + expect(resultMessage).toBeDefined(); + expect(resultMessage?.fields).toHaveLength(1); + assertFieldMessage(resultMessage?.fields[0], { + fieldName: 'details', + typeName: 'Details', + fieldNumber: 1, + isRepeated: false, + }); + }); + + it('should visit a field set for a union type', () => { + const sdl = ` + type User @key(fields: "id") { + id: ID! + pet: Animal! @external + name: String! @external + details: Details! @requires(fields: "pet { ... on Cat { name catBreed } ... on Dog { name dogBreed } } name") + } + + union Animal = Cat | Dog + + type Cat { + name: String! + catBreed: String! + } + + type Dog { + name: String! + dogBreed: String! + } + + type Details { + firstName: String! + lastName: String! + } + `; + + const schema = buildSchema(sdl, { + assumeValid: true, + assumeValidSDL: true, + }); + + const typeMap = schema.getTypeMap(); + const entity = typeMap['User'] as GraphQLObjectType | undefined; + if (!entity) { + throw new Error('Entity not found'); + } + + const requiredField = entity.getFields()['details']; + expect(requiredField).toBeDefined(); + + const fieldSet = ( + requiredField.astNode?.directives?.find((d) => d.name.value === 'requires')?.arguments?.[0] + .value as StringValueNode + ).value; + + const visitor = new RequiredFieldsVisitor(schema, entity, requiredField, fieldSet); + visitor.visit(); + const rpcMethods = visitor.getRPCMethods(); + const messageDefinitions = visitor.getMessageDefinitions(); + + expect(rpcMethods).toHaveLength(1); + expect(rpcMethods[0].name).toBe('RequireUserDetailsById'); + expect(messageDefinitions).toHaveLength(5); + expect(messageDefinitions).toEqual( + expect.arrayContaining([ + expect.objectContaining({ messageName: 'RequireUserDetailsByIdRequest' }), + expect.objectContaining({ messageName: 'RequireUserDetailsByIdContext' }), + expect.objectContaining({ messageName: 'RequireUserDetailsByIdResponse' }), + expect.objectContaining({ messageName: 'RequireUserDetailsByIdResult' }), + expect.objectContaining({ messageName: 'RequireUserDetailsByIdFields' }), + ]), + ); + + let fieldMessage = messageDefinitions.find((message) => message.messageName === 'RequireUserDetailsByIdFields'); + expect(fieldMessage).toBeDefined(); + expect(fieldMessage?.fields).toHaveLength(2); + assertFieldMessage(fieldMessage?.fields[0], { + fieldName: 'pet', + typeName: 'Animal', + fieldNumber: 1, + isRepeated: false, + }); + assertFieldMessage(fieldMessage?.fields[1], { + fieldName: 'name', + typeName: 'string', + fieldNumber: 2, + isRepeated: false, + }); + + const compositeType = fieldMessage?.compositeType; + expect(compositeType).toBeDefined(); + expect(compositeType?.kind).toBe(CompositeMessageKind.UNION); + expect(compositeType?.typeName).toBe('Animal'); + expect(isUnionMessageDefinition(compositeType!)).toBe(true); + const unionMessageDefinition = compositeType! as UnionMessageDefinition; + expect(unionMessageDefinition.memberTypes).toHaveLength(2); + expect(unionMessageDefinition.memberTypes[0]).toBe('Cat'); + expect(unionMessageDefinition.memberTypes[1]).toBe('Dog'); + + let resultMessage = messageDefinitions.find((message) => message.messageName === 'RequireUserDetailsByIdResult'); + expect(resultMessage).toBeDefined(); + expect(resultMessage?.fields).toHaveLength(1); + assertFieldMessage(resultMessage?.fields[0], { + fieldName: 'details', + typeName: 'Details', + fieldNumber: 1, + isRepeated: false, + }); + + const messageLines = buildProtoMessage(true, fieldMessage!).join('\n'); + expect(messageLines).toMatchInlineSnapshot(` + "message RequireUserDetailsByIdFields { + message Cat { + string name = 1; + string cat_breed = 2; + } + + message Dog { + string name = 1; + string dog_breed = 2; + } + + message Animal { + oneof value { + Cat cat = 1; + Dog dog = 2; + } + } + Animal pet = 1; + string name = 2; + } + " + `); + }); + it('should visit a field set for an interface type', () => { + const sdl = ` + type User @key(fields: "id") { + id: ID! + pet: Animal! @external + name: String! @external + details: Details! @requires(fields: "pet { ... on Cat { name catBreed } ... on Dog { name dogBreed } } name") + } + + interface Animal { + name: String! + } + + type Cat implements Animal { + name: String! + catBreed: String! + } + + type Dog implements Animal { + name: String! + dogBreed: String! + } + + type Details { + firstName: String! + lastName: String! + } + `; + + const schema = buildSchema(sdl, { + assumeValid: true, + assumeValidSDL: true, + }); + + const typeMap = schema.getTypeMap(); + const entity = typeMap['User'] as GraphQLObjectType | undefined; + if (!entity) { + throw new Error('Entity not found'); + } + + const requiredField = entity.getFields()['details']; + expect(requiredField).toBeDefined(); + + const fieldSet = ( + requiredField.astNode?.directives?.find((d) => d.name.value === 'requires')?.arguments?.[0] + .value as StringValueNode + ).value; + + const visitor = new RequiredFieldsVisitor(schema, entity, requiredField, fieldSet); + visitor.visit(); + const rpcMethods = visitor.getRPCMethods(); + const messageDefinitions = visitor.getMessageDefinitions(); + + expect(rpcMethods).toHaveLength(1); + expect(rpcMethods[0].name).toBe('RequireUserDetailsById'); + expect(messageDefinitions).toHaveLength(5); + expect(messageDefinitions).toEqual( + expect.arrayContaining([ + expect.objectContaining({ messageName: 'RequireUserDetailsByIdRequest' }), + expect.objectContaining({ messageName: 'RequireUserDetailsByIdContext' }), + expect.objectContaining({ messageName: 'RequireUserDetailsByIdResponse' }), + expect.objectContaining({ messageName: 'RequireUserDetailsByIdResult' }), + expect.objectContaining({ messageName: 'RequireUserDetailsByIdFields' }), + ]), + ); + + let fieldMessage = messageDefinitions.find((message) => message.messageName === 'RequireUserDetailsByIdFields'); + expect(fieldMessage).toBeDefined(); + expect(fieldMessage?.fields).toHaveLength(2); + assertFieldMessage(fieldMessage?.fields[0], { + fieldName: 'pet', + typeName: 'Animal', + fieldNumber: 1, + isRepeated: false, + }); + assertFieldMessage(fieldMessage?.fields[1], { + fieldName: 'name', + typeName: 'string', + fieldNumber: 2, + isRepeated: false, + }); + + const compositeType = fieldMessage?.compositeType; + expect(compositeType).toBeDefined(); + expect(compositeType?.kind).toBe(CompositeMessageKind.INTERFACE); + expect(compositeType?.typeName).toBe('Animal'); + expect(isInterfaceMessageDefinition(compositeType!)).toBe(true); + const interfaceMessageDefinition = compositeType! as InterfaceMessageDefinition; + expect(interfaceMessageDefinition.implementingTypes).toHaveLength(2); + expect(interfaceMessageDefinition.implementingTypes[0]).toBe('Cat'); + expect(interfaceMessageDefinition.implementingTypes[1]).toBe('Dog'); + + let resultMessage = messageDefinitions.find((message) => message.messageName === 'RequireUserDetailsByIdResult'); + expect(resultMessage).toBeDefined(); + expect(resultMessage?.fields).toHaveLength(1); + assertFieldMessage(resultMessage?.fields[0], { + fieldName: 'details', + typeName: 'Details', + fieldNumber: 1, + isRepeated: false, + }); + + const messageLines = buildProtoMessage(true, fieldMessage!).join('\n'); + expect(messageLines).toMatchInlineSnapshot(` + "message RequireUserDetailsByIdFields { + message Cat { + string name = 1; + string cat_breed = 2; + } + + message Dog { + string name = 1; + string dog_breed = 2; + } + + message Animal { + oneof instance { + Cat cat = 1; + Dog dog = 2; + } + } + Animal pet = 1; + string name = 2; + } + " + `); + }); + it('should visit a field set for an interface type with extraced interface field', () => { + const sdl = ` + type User @key(fields: "id") { + id: ID! + pet: Animal! @external + name: String! @external + details: Details! @requires(fields: "pet { name ... on Cat { catBreed } ... on Dog { dogBreed } } name") + } + + interface Animal { + name: String! + } + + type Cat implements Animal { + name: String! + catBreed: String! + } + + type Dog implements Animal { + name: String! + dogBreed: String! + } + + type Details { + firstName: String! + lastName: String! + } + `; + + const schema = buildSchema(sdl, { + assumeValid: true, + assumeValidSDL: true, + }); + + const typeMap = schema.getTypeMap(); + const entity = typeMap['User'] as GraphQLObjectType | undefined; + if (!entity) { + throw new Error('Entity not found'); + } + + const requiredField = entity.getFields()['details']; + expect(requiredField).toBeDefined(); + + const fieldSet = ( + requiredField.astNode?.directives?.find((d) => d.name.value === 'requires')?.arguments?.[0] + .value as StringValueNode + ).value; + + const visitor = new RequiredFieldsVisitor(schema, entity, requiredField, fieldSet); + visitor.visit(); + const rpcMethods = visitor.getRPCMethods(); + const messageDefinitions = visitor.getMessageDefinitions(); + + expect(rpcMethods).toHaveLength(1); + expect(rpcMethods[0].name).toBe('RequireUserDetailsById'); + expect(messageDefinitions).toHaveLength(5); + expect(messageDefinitions).toEqual( + expect.arrayContaining([ + expect.objectContaining({ messageName: 'RequireUserDetailsByIdRequest' }), + expect.objectContaining({ messageName: 'RequireUserDetailsByIdContext' }), + expect.objectContaining({ messageName: 'RequireUserDetailsByIdResponse' }), + expect.objectContaining({ messageName: 'RequireUserDetailsByIdResult' }), + expect.objectContaining({ messageName: 'RequireUserDetailsByIdFields' }), + ]), + ); + + let fieldMessage = messageDefinitions.find((message) => message.messageName === 'RequireUserDetailsByIdFields'); + expect(fieldMessage).toBeDefined(); + expect(fieldMessage?.fields).toHaveLength(2); + assertFieldMessage(fieldMessage?.fields[0], { + fieldName: 'pet', + typeName: 'Animal', + fieldNumber: 1, + isRepeated: false, + }); + assertFieldMessage(fieldMessage?.fields[1], { + fieldName: 'name', + typeName: 'string', + fieldNumber: 2, + isRepeated: false, + }); + + const compositeType = fieldMessage?.compositeType; + expect(compositeType).toBeDefined(); + expect(compositeType?.kind).toBe(CompositeMessageKind.INTERFACE); + expect(compositeType?.typeName).toBe('Animal'); + expect(isInterfaceMessageDefinition(compositeType!)).toBe(true); + const interfaceMessageDefinition = compositeType! as InterfaceMessageDefinition; + expect(interfaceMessageDefinition.implementingTypes).toHaveLength(2); + expect(interfaceMessageDefinition.implementingTypes[0]).toBe('Cat'); + expect(interfaceMessageDefinition.implementingTypes[1]).toBe('Dog'); + + let resultMessage = messageDefinitions.find((message) => message.messageName === 'RequireUserDetailsByIdResult'); + expect(resultMessage).toBeDefined(); + expect(resultMessage?.fields).toHaveLength(1); + assertFieldMessage(resultMessage?.fields[0], { + fieldName: 'details', + typeName: 'Details', + fieldNumber: 1, + isRepeated: false, + }); + + const messageLines = buildProtoMessage(true, fieldMessage!).join('\n'); + expect(messageLines).toMatchInlineSnapshot(` + "message RequireUserDetailsByIdFields { + message Cat { + string name = 1; + string cat_breed = 2; + } + + message Dog { + string name = 1; + string dog_breed = 2; + } + + message Animal { + oneof instance { + Cat cat = 1; + Dog dog = 2; + } + } + Animal pet = 1; + string name = 2; + } + " + `); + }); + it('should visit a field set with nested field selections and a union type', () => { + const sdl = ` + type User @key(fields: "id") { + id: ID! + description: Description! @external + details: Details! @requires(fields: "description { title score pet { ... on Cat { name catBreed } ... on Dog { name dogBreed } } }") + } + + type Description { + title: String! + score: Int! + pet: Animal! + } + + union Animal = Cat | Dog + + type Cat { + name: String! + catBreed: String! + } + + type Dog { + name: String! + dogBreed: String! + } + + type Details { + firstName: String! + lastName: String! + } + `; + + const schema = buildSchema(sdl, { + assumeValid: true, + assumeValidSDL: true, + }); + + const typeMap = schema.getTypeMap(); + const entity = typeMap['User'] as GraphQLObjectType | undefined; + if (!entity) { + throw new Error('Entity not found'); + } + + const requiredField = entity.getFields()['details']; + expect(requiredField).toBeDefined(); + + const fieldSet = ( + requiredField.astNode?.directives?.find((d) => d.name.value === 'requires')?.arguments?.[0] + .value as StringValueNode + ).value; + + const visitor = new RequiredFieldsVisitor(schema, entity, requiredField, fieldSet); + visitor.visit(); + const rpcMethods = visitor.getRPCMethods(); + const messageDefinitions = visitor.getMessageDefinitions(); + + expect(rpcMethods).toHaveLength(1); + expect(rpcMethods[0].name).toBe('RequireUserDetailsById'); + expect(messageDefinitions).toHaveLength(5); + expect(messageDefinitions).toEqual( + expect.arrayContaining([ + expect.objectContaining({ messageName: 'RequireUserDetailsByIdRequest' }), + expect.objectContaining({ messageName: 'RequireUserDetailsByIdContext' }), + expect.objectContaining({ messageName: 'RequireUserDetailsByIdResponse' }), + expect.objectContaining({ messageName: 'RequireUserDetailsByIdResult' }), + expect.objectContaining({ messageName: 'RequireUserDetailsByIdFields' }), + ]), + ); + + let fieldMessage = messageDefinitions.find((message) => message.messageName === 'RequireUserDetailsByIdFields'); + expect(fieldMessage).toBeDefined(); + expect(fieldMessage?.fields).toHaveLength(1); + expect(fieldMessage?.fields[0].fieldName).toBe('description'); + expect(fieldMessage?.fields[0].typeName).toBe('Description'); + expect(fieldMessage?.fields[0].fieldNumber).toBe(1); + expect(fieldMessage?.fields[0].isRepeated).toBe(false); + + // Check for nested Description message + expect(fieldMessage?.nestedMessages).toHaveLength(1); + const descriptionMessage = fieldMessage?.nestedMessages?.[0]; + expect(descriptionMessage?.messageName).toBe('Description'); + expect(descriptionMessage?.fields).toHaveLength(3); + + // Check Description fields + expect(descriptionMessage?.fields[0].fieldName).toBe('title'); + expect(descriptionMessage?.fields[0].typeName).toBe('string'); + expect(descriptionMessage?.fields[0].fieldNumber).toBe(1); + expect(descriptionMessage?.fields[0].isRepeated).toBe(false); + + expect(descriptionMessage?.fields[1].fieldName).toBe('score'); + expect(descriptionMessage?.fields[1].typeName).toBe('int32'); + expect(descriptionMessage?.fields[1].fieldNumber).toBe(2); + expect(descriptionMessage?.fields[1].isRepeated).toBe(false); + + expect(descriptionMessage?.fields[2].fieldName).toBe('pet'); + expect(descriptionMessage?.fields[2].typeName).toBe('Animal'); + expect(descriptionMessage?.fields[2].fieldNumber).toBe(3); + expect(descriptionMessage?.fields[2].isRepeated).toBe(false); + + // Check for union composite type on Description message + const compositeType = descriptionMessage?.compositeType; + expect(compositeType).toBeDefined(); + expect(compositeType?.kind).toBe(CompositeMessageKind.UNION); + expect(compositeType?.typeName).toBe('Animal'); + expect(isUnionMessageDefinition(compositeType!)).toBe(true); + const unionMessageDefinition = compositeType! as UnionMessageDefinition; + expect(unionMessageDefinition.memberTypes).toHaveLength(2); + expect(unionMessageDefinition.memberTypes).toEqual(expect.arrayContaining(['Cat', 'Dog'])); + + let resultMessage = messageDefinitions.find((message) => message.messageName === 'RequireUserDetailsByIdResult'); + expect(resultMessage).toBeDefined(); + expect(resultMessage?.fields).toHaveLength(1); + expect(resultMessage?.fields[0].fieldName).toBe('details'); + expect(resultMessage?.fields[0].typeName).toBe('Details'); + expect(resultMessage?.fields[0].fieldNumber).toBe(1); + expect(resultMessage?.fields[0].isRepeated).toBe(false); + }); +}); + +const assertFieldMessage = ( + field: ProtoMessageField | undefined, + expected: { fieldName: string; typeName: string; fieldNumber: number; isRepeated: boolean }, +) => { + expect(field).toBeDefined(); + expect(field?.fieldName).toBe(expected.fieldName); + expect(field?.typeName).toBe(expected.typeName); + expect(field?.fieldNumber).toBe(expected.fieldNumber); + expect(field?.isRepeated).toBe(expected.isRepeated); +}; diff --git a/protographic/tests/sdl-to-mapping/03-federation.test.ts b/protographic/tests/sdl-to-mapping/03-federation.test.ts index c07a92519d..958f527664 100644 --- a/protographic/tests/sdl-to-mapping/03-federation.test.ts +++ b/protographic/tests/sdl-to-mapping/03-federation.test.ts @@ -986,4 +986,205 @@ describe('GraphQL Federation to Proto Mapping', () => { } `); }); + + it('maps entity with required and external fields', () => { + const sdl = ` + directive @key(fields: String!) on OBJECT + + type Product @key(fields: "id") { + id: ID! + price: Float! @external + itemCount: Int! @external + stockHealthScore: Float! @requires(fields: "itemCount price") + } + + type Query { + products: [Product!]! + } + `; + + const mapping = compileGraphQLToMapping(sdl, 'ProductService'); + + // RequireWarehouseStockHealthScoreByIdFields.RestockData + expect(mapping.toJson()).toMatchInlineSnapshot(` + { + "entityMappings": [ + { + "key": "id", + "kind": "entity", + "request": "LookupProductByIdRequest", + "response": "LookupProductByIdResponse", + "rpc": "LookupProductById", + "typeName": "Product", + }, + ], + "operationMappings": [ + { + "mapped": "QueryProducts", + "original": "products", + "request": "QueryProductsRequest", + "response": "QueryProductsResponse", + "type": "OPERATION_TYPE_QUERY", + }, + ], + "service": "ProductService", + "typeFieldMappings": [ + { + "fieldMappings": [ + { + "mapped": "item_count", + "original": "itemCount", + }, + { + "mapped": "price", + "original": "price", + }, + ], + "type": "RequireProductStockHealthScoreByIdFields", + }, + { + "fieldMappings": [ + { + "mapped": "products", + "original": "products", + }, + ], + "type": "Query", + }, + { + "fieldMappings": [ + { + "mapped": "id", + "original": "id", + }, + ], + "type": "Product", + }, + ], + "version": 1, + } + `); + }); + + it('maps entity with required and external fields with nested fields', () => { + const sdl = ` + directive @key(fields: String!) on OBJECT + + type Product @key(fields: "id") { + id: ID! + name: String! + price: Float! @external + itemCount: Int! @external + restockData: RestockData! @external + stockHealthScore: Float! @requires(fields: "itemCount restockData { lastRestockDate } price") + } + + type RestockData { + lastRestockDate: String! + } + + type Query { + products: [Product!]! + } + `; + + const mapping = compileGraphQLToMapping(sdl, 'ProductService'); + + // RequireWarehouseStockHealthScoreByIdFields.RestockData + expect(mapping.toJson()).toMatchInlineSnapshot(` + { + "entityMappings": [ + { + "key": "id", + "kind": "entity", + "request": "LookupProductByIdRequest", + "requiredFieldMappings": [ + { + "fieldMapping": { + "mapped": "stock_health_score", + "original": "stockHealthScore", + }, + "request": "RequireProductStockHealthScoreByIdRequest", + "response": "RequireProductStockHealthScoreByIdResponse", + "rpc": "RequireProductStockHealthScoreById", + }, + ], + "response": "LookupProductByIdResponse", + "rpc": "LookupProductById", + "typeName": "Product", + }, + ], + "operationMappings": [ + { + "mapped": "QueryProducts", + "original": "products", + "request": "QueryProductsRequest", + "response": "QueryProductsResponse", + "type": "OPERATION_TYPE_QUERY", + }, + ], + "service": "ProductService", + "typeFieldMappings": [ + { + "fieldMappings": [ + { + "mapped": "last_restock_date", + "original": "lastRestockDate", + }, + ], + "type": "RequireProductStockHealthScoreByIdFields.RestockData", + }, + { + "fieldMappings": [ + { + "mapped": "item_count", + "original": "itemCount", + }, + { + "mapped": "restock_data", + "original": "restockData", + }, + { + "mapped": "price", + "original": "price", + }, + ], + "type": "RequireProductStockHealthScoreByIdFields", + }, + { + "fieldMappings": [ + { + "mapped": "products", + "original": "products", + }, + ], + "type": "Query", + }, + { + "fieldMappings": [ + { + "mapped": "id", + "original": "id", + }, + { + "mapped": "name", + "original": "name", + }, + ], + "type": "Product", + }, + { + "fieldMappings": [ + { + "mapped": "last_restock_date", + "original": "lastRestockDate", + }, + ], + "type": "RestockData", + }, + ], + "version": 1, + } + `); + }); }); diff --git a/protographic/tests/sdl-to-proto/01-basic-types.test.ts b/protographic/tests/sdl-to-proto/01-basic-types.test.ts index d637d8b17a..daa2772350 100644 --- a/protographic/tests/sdl-to-proto/01-basic-types.test.ts +++ b/protographic/tests/sdl-to-proto/01-basic-types.test.ts @@ -1,4 +1,4 @@ -import { describe, expect, test } from 'vitest'; +import { describe, expect, it, test } from 'vitest'; import { compileGraphQLToProto } from '../../src'; import { expectValidProto } from '../util'; diff --git a/protographic/tests/sdl-to-proto/04-federation.test.ts b/protographic/tests/sdl-to-proto/04-federation.test.ts index fc9a1d9d88..3fd5ffe6e2 100644 --- a/protographic/tests/sdl-to-proto/04-federation.test.ts +++ b/protographic/tests/sdl-to-proto/04-federation.test.ts @@ -1077,4 +1077,345 @@ describe('SDL to Proto - Federation and Special Types', () => { }" `); }); + test('should generate rpc method for required field', () => { + const sdl = ` + type Product @key(fields: "id") { + id: ID! + manufacturerId: ID! @external + productCode: String! @external + name: String! @requires(fields: "manufacturerId productCode") + price: Float! + } + `; + + const { proto: protoText } = compileGraphQLToProto(sdl); + + // Validate Proto definition + expectValidProto(protoText); + + expect(protoText).toMatchInlineSnapshot(` + "syntax = "proto3"; + package service.v1; + + // Service definition for DefaultService + service DefaultService { + // Lookup Product entity by id + rpc LookupProductById(LookupProductByIdRequest) returns (LookupProductByIdResponse) {} + rpc RequireProductNameById(RequireProductNameByIdRequest) returns (RequireProductNameByIdResponse) {} + } + + // Key message for Product entity lookup + message LookupProductByIdRequestKey { + // Key field for Product entity lookup. + string id = 1; + } + + // Request message for Product entity lookup. + message LookupProductByIdRequest { + /* + * List of keys to look up Product entities. + * Order matters - each key maps to one entity in LookupProductByIdResponse. + */ + repeated LookupProductByIdRequestKey keys = 1; + } + + // Response message for Product entity lookup. + message LookupProductByIdResponse { + /* + * List of Product entities in the same order as the keys in LookupProductByIdRequest. + * Always return the same number of entities as keys. Use null for entities that cannot be found. + * + * Example: + * LookupUserByIdRequest: + * keys: + * - id: 1 + * - id: 2 + * LookupUserByIdResponse: + * result: + * - id: 1 # User with id 1 found + * - null # User with id 2 not found + */ + repeated Product result = 1; + } + + message RequireProductNameByIdRequest { + // RequireProductNameByIdContext provides the context for the required fields method RequireProductNameById. + repeated RequireProductNameByIdContext context = 1; + } + + message RequireProductNameByIdContext { + LookupProductByIdRequestKey key = 1; + RequireProductNameByIdFields fields = 2; + } + + message RequireProductNameByIdResponse { + // RequireProductNameByIdResult provides the result for the required fields method RequireProductNameById. + repeated RequireProductNameByIdResult result = 1; + } + + message RequireProductNameByIdResult { + string name = 1; + } + + message RequireProductNameByIdFields { + string manufacturer_id = 1; + string product_code = 2; + } + + message Product { + string id = 1; + double price = 2; + }" + `); + }); + test('should generate rpc method for required field with nested fields', () => { + const sdl = ` + type Product @key(fields: "id") { + id: ID! + manufacturerId: ID! @external + details: ProductDetails! @external + name: String! @requires(fields: "manufacturerId details { description reviewSummary { status message } }") + price: Float! + } + + type ProductDetails { + id: ID! + description: String! + title: String! + reviewSummary: ActionResult! + } + + type ActionResult { + status: String! + message: String! + } + `; + + const { proto: protoText } = compileGraphQLToProto(sdl); + + // Validate Proto definition + expectValidProto(protoText); + + expect(protoText).toMatchInlineSnapshot(` + "syntax = "proto3"; + package service.v1; + + // Service definition for DefaultService + service DefaultService { + // Lookup Product entity by id + rpc LookupProductById(LookupProductByIdRequest) returns (LookupProductByIdResponse) {} + rpc RequireProductNameById(RequireProductNameByIdRequest) returns (RequireProductNameByIdResponse) {} + } + + // Key message for Product entity lookup + message LookupProductByIdRequestKey { + // Key field for Product entity lookup. + string id = 1; + } + + // Request message for Product entity lookup. + message LookupProductByIdRequest { + /* + * List of keys to look up Product entities. + * Order matters - each key maps to one entity in LookupProductByIdResponse. + */ + repeated LookupProductByIdRequestKey keys = 1; + } + + // Response message for Product entity lookup. + message LookupProductByIdResponse { + /* + * List of Product entities in the same order as the keys in LookupProductByIdRequest. + * Always return the same number of entities as keys. Use null for entities that cannot be found. + * + * Example: + * LookupUserByIdRequest: + * keys: + * - id: 1 + * - id: 2 + * LookupUserByIdResponse: + * result: + * - id: 1 # User with id 1 found + * - null # User with id 2 not found + */ + repeated Product result = 1; + } + + message RequireProductNameByIdRequest { + // RequireProductNameByIdContext provides the context for the required fields method RequireProductNameById. + repeated RequireProductNameByIdContext context = 1; + } + + message RequireProductNameByIdContext { + LookupProductByIdRequestKey key = 1; + RequireProductNameByIdFields fields = 2; + } + + message RequireProductNameByIdResponse { + // RequireProductNameByIdResult provides the result for the required fields method RequireProductNameById. + repeated RequireProductNameByIdResult result = 1; + } + + message RequireProductNameByIdResult { + string name = 1; + } + + message RequireProductNameByIdFields { + message ProductDetails { + message ActionResult { + string status = 1; + string message = 2; + } + + string description = 1; + ActionResult review_summary = 2; + } + + string manufacturer_id = 1; + ProductDetails details = 2; + } + + message Product { + string id = 1; + double price = 2; + } + + message ProductDetails { + string id = 1; + string description = 2; + string title = 3; + ActionResult review_summary = 4; + } + + message ActionResult { + string status = 1; + string message = 2; + }" + `); + }); + test('should generate rpc method for required field with randomly ordered fields', () => { + const sdl = ` + type Product @key(fields: "id") { + id: ID! + manufacturerId: ID! @external + details: ProductDetails! @external + name: String! @requires(fields: "details { description reviewSummary { message status } } manufacturerId") + price: Float! + } + + type ProductDetails { + id: ID! + description: String! + title: String! + reviewSummary: ActionResult! + } + + type ActionResult { + status: String! + message: String! + } + `; + + const { proto: protoText } = compileGraphQLToProto(sdl); + + // Validate Proto definition + expectValidProto(protoText); + + expect(protoText).toMatchInlineSnapshot(` + "syntax = "proto3"; + package service.v1; + + // Service definition for DefaultService + service DefaultService { + // Lookup Product entity by id + rpc LookupProductById(LookupProductByIdRequest) returns (LookupProductByIdResponse) {} + rpc RequireProductNameById(RequireProductNameByIdRequest) returns (RequireProductNameByIdResponse) {} + } + + // Key message for Product entity lookup + message LookupProductByIdRequestKey { + // Key field for Product entity lookup. + string id = 1; + } + + // Request message for Product entity lookup. + message LookupProductByIdRequest { + /* + * List of keys to look up Product entities. + * Order matters - each key maps to one entity in LookupProductByIdResponse. + */ + repeated LookupProductByIdRequestKey keys = 1; + } + + // Response message for Product entity lookup. + message LookupProductByIdResponse { + /* + * List of Product entities in the same order as the keys in LookupProductByIdRequest. + * Always return the same number of entities as keys. Use null for entities that cannot be found. + * + * Example: + * LookupUserByIdRequest: + * keys: + * - id: 1 + * - id: 2 + * LookupUserByIdResponse: + * result: + * - id: 1 # User with id 1 found + * - null # User with id 2 not found + */ + repeated Product result = 1; + } + + message RequireProductNameByIdRequest { + // RequireProductNameByIdContext provides the context for the required fields method RequireProductNameById. + repeated RequireProductNameByIdContext context = 1; + } + + message RequireProductNameByIdContext { + LookupProductByIdRequestKey key = 1; + RequireProductNameByIdFields fields = 2; + } + + message RequireProductNameByIdResponse { + // RequireProductNameByIdResult provides the result for the required fields method RequireProductNameById. + repeated RequireProductNameByIdResult result = 1; + } + + message RequireProductNameByIdResult { + string name = 1; + } + + message RequireProductNameByIdFields { + message ProductDetails { + message ActionResult { + string message = 1; + string status = 2; + } + + string description = 1; + ActionResult review_summary = 2; + } + + ProductDetails details = 1; + string manufacturer_id = 2; + } + + message Product { + string id = 1; + double price = 2; + } + + message ProductDetails { + string id = 1; + string description = 2; + string title = 3; + ActionResult review_summary = 4; + } + + message ActionResult { + string status = 1; + string message = 2; + }" + `); + }); }); diff --git a/protographic/tests/sdl-validation/01-basic-validation.test.ts b/protographic/tests/sdl-validation/01-basic-validation.test.ts index 2af2a8b936..3e2354e743 100644 --- a/protographic/tests/sdl-validation/01-basic-validation.test.ts +++ b/protographic/tests/sdl-validation/01-basic-validation.test.ts @@ -47,6 +47,11 @@ describe('SDL Validation', () => { matrix: [[Matrix!]]! tags: [[String!]] } + + type Matrix { + id: ID! + name: String! + } `; const visitor = new SDLValidationVisitor(sdl); @@ -110,7 +115,7 @@ describe('SDL Validation', () => { expect(result.errors[0]).toContain('Nested key directives are not supported'); }); - test('should return a warning if a field has a requires directive', () => { + test('should not return a warning if a field has a requires directive', () => { const sdl = ` type Query { user: User! @@ -127,8 +132,7 @@ describe('SDL Validation', () => { const result = visitor.visit(); expect(result.errors).toHaveLength(0); - expect(result.warnings).toHaveLength(1); - expect(result.warnings[0]).toContain('Use of requires is not supported yet'); + expect(result.warnings).toHaveLength(0); }); test('should return an error if a field has an invalid resolver context', () => { @@ -171,6 +175,10 @@ describe('SDL Validation', () => { id: ID! name: String! } + + input UserInput { + name: String! + } `; const visitor = new SDLValidationVisitor(sdl); @@ -475,4 +483,60 @@ describe('SDL Validation', () => { '[Error] Cycle detected in context: field "baz" is referenced in the following path: "baz.bar.foo"', ); }); + + test('should return an error if an abstract type is used in a requires directive', () => { + const sdl = ` + type Query { + user: User! + } + + type User @key(fields: "id name") { + id: ID! + pet: Animal! @external + name: String! @requires(fields: "pet { ... on Cat { name } }") + } + + type Cat { + name: String! + } + + type Dog { + name: String! + } + + union Animal = Cat | Dog + `; + + const visitor = new SDLValidationVisitor(sdl); + const result = visitor.visit(); + + expect(result.errors).toHaveLength(1); + expect(result.warnings).toHaveLength(0); + expect(result.errors[0]).toContain( + '[Error] Abstract types are not allowed in requires directives. Found Animal in User.pet at', + ); + }); + + test('should correctly handle nested fields in requires directives', () => { + const sdl = ` + type Warehouse @key(fields: "id") { + id: ID! + name: String! + location: String! + inventoryCount: Int! @external + restockData: RestockData! @external + stockHealthScore: Float! @requires(fields: "inventoryCount restockData { lastRestockDate }") + } + + type RestockData { + lastRestockDate: String! + } +`; + + const visitor = new SDLValidationVisitor(sdl); + const result = visitor.visit(); + + expect(result.errors).toHaveLength(0); + expect(result.warnings).toHaveLength(0); + }); }); diff --git a/router/gen/proto/wg/cosmo/node/v1/node.pb.go b/router/gen/proto/wg/cosmo/node/v1/node.pb.go index 7ee7456e27..05a273055e 100644 --- a/router/gen/proto/wg/cosmo/node/v1/node.pb.go +++ b/router/gen/proto/wg/cosmo/node/v1/node.pb.go @@ -2713,6 +2713,8 @@ type EntityMapping struct { Request string `protobuf:"bytes,5,opt,name=request,proto3" json:"request,omitempty"` // gRPC response message type name Response string `protobuf:"bytes,6,opt,name=response,proto3" json:"response,omitempty"` + // Mappings for required fields + RequiredFieldMappings []*RequiredFieldMapping `protobuf:"bytes,7,rep,name=required_field_mappings,json=requiredFieldMappings,proto3" json:"required_field_mappings,omitempty"` } func (x *EntityMapping) Reset() { @@ -2789,6 +2791,88 @@ func (x *EntityMapping) GetResponse() string { return "" } +func (x *EntityMapping) GetRequiredFieldMappings() []*RequiredFieldMapping { + if x != nil { + return x.RequiredFieldMappings + } + return nil +} + +// Defines mapping for required fields +type RequiredFieldMapping struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + FieldMapping *FieldMapping `protobuf:"bytes,1,opt,name=field_mapping,json=fieldMapping,proto3" json:"field_mapping,omitempty"` + // Mapped gRPC method name + Rpc string `protobuf:"bytes,2,opt,name=rpc,proto3" json:"rpc,omitempty"` + // gRPC request message type name + Request string `protobuf:"bytes,3,opt,name=request,proto3" json:"request,omitempty"` + // gRPC response message type name + Response string `protobuf:"bytes,4,opt,name=response,proto3" json:"response,omitempty"` +} + +func (x *RequiredFieldMapping) Reset() { + *x = RequiredFieldMapping{} + if protoimpl.UnsafeEnabled { + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[34] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RequiredFieldMapping) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RequiredFieldMapping) ProtoMessage() {} + +func (x *RequiredFieldMapping) ProtoReflect() protoreflect.Message { + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[34] + 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 RequiredFieldMapping.ProtoReflect.Descriptor instead. +func (*RequiredFieldMapping) Descriptor() ([]byte, []int) { + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{34} +} + +func (x *RequiredFieldMapping) GetFieldMapping() *FieldMapping { + if x != nil { + return x.FieldMapping + } + return nil +} + +func (x *RequiredFieldMapping) GetRpc() string { + if x != nil { + return x.Rpc + } + return "" +} + +func (x *RequiredFieldMapping) GetRequest() string { + if x != nil { + return x.Request + } + return "" +} + +func (x *RequiredFieldMapping) GetResponse() string { + if x != nil { + return x.Response + } + return "" +} + // Defines mapping between GraphQL type fields and gRPC message fields type TypeFieldMapping struct { state protoimpl.MessageState @@ -2804,7 +2888,7 @@ type TypeFieldMapping struct { func (x *TypeFieldMapping) Reset() { *x = TypeFieldMapping{} if protoimpl.UnsafeEnabled { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[34] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[35] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2817,7 +2901,7 @@ func (x *TypeFieldMapping) String() string { func (*TypeFieldMapping) ProtoMessage() {} func (x *TypeFieldMapping) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[34] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[35] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2830,7 +2914,7 @@ func (x *TypeFieldMapping) ProtoReflect() protoreflect.Message { // Deprecated: Use TypeFieldMapping.ProtoReflect.Descriptor instead. func (*TypeFieldMapping) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{34} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{35} } func (x *TypeFieldMapping) GetType() string { @@ -2864,7 +2948,7 @@ type FieldMapping struct { func (x *FieldMapping) Reset() { *x = FieldMapping{} if protoimpl.UnsafeEnabled { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[35] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[36] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2877,7 +2961,7 @@ func (x *FieldMapping) String() string { func (*FieldMapping) ProtoMessage() {} func (x *FieldMapping) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[35] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[36] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2890,7 +2974,7 @@ func (x *FieldMapping) ProtoReflect() protoreflect.Message { // Deprecated: Use FieldMapping.ProtoReflect.Descriptor instead. func (*FieldMapping) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{35} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{36} } func (x *FieldMapping) GetOriginal() string { @@ -2929,7 +3013,7 @@ type ArgumentMapping struct { func (x *ArgumentMapping) Reset() { *x = ArgumentMapping{} if protoimpl.UnsafeEnabled { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[36] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[37] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2942,7 +3026,7 @@ func (x *ArgumentMapping) String() string { func (*ArgumentMapping) ProtoMessage() {} func (x *ArgumentMapping) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[36] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[37] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2955,7 +3039,7 @@ func (x *ArgumentMapping) ProtoReflect() protoreflect.Message { // Deprecated: Use ArgumentMapping.ProtoReflect.Descriptor instead. func (*ArgumentMapping) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{36} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{37} } func (x *ArgumentMapping) GetOriginal() string { @@ -2984,7 +3068,7 @@ type EnumMapping struct { func (x *EnumMapping) Reset() { *x = EnumMapping{} if protoimpl.UnsafeEnabled { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[37] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[38] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2997,7 +3081,7 @@ func (x *EnumMapping) String() string { func (*EnumMapping) ProtoMessage() {} func (x *EnumMapping) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[37] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[38] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3010,7 +3094,7 @@ func (x *EnumMapping) ProtoReflect() protoreflect.Message { // Deprecated: Use EnumMapping.ProtoReflect.Descriptor instead. func (*EnumMapping) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{37} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{38} } func (x *EnumMapping) GetType() string { @@ -3039,7 +3123,7 @@ type EnumValueMapping struct { func (x *EnumValueMapping) Reset() { *x = EnumValueMapping{} if protoimpl.UnsafeEnabled { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[38] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[39] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3052,7 +3136,7 @@ func (x *EnumValueMapping) String() string { func (*EnumValueMapping) ProtoMessage() {} func (x *EnumValueMapping) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[38] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[39] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3065,7 +3149,7 @@ func (x *EnumValueMapping) ProtoReflect() protoreflect.Message { // Deprecated: Use EnumValueMapping.ProtoReflect.Descriptor instead. func (*EnumValueMapping) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{38} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{39} } func (x *EnumValueMapping) GetOriginal() string { @@ -3095,7 +3179,7 @@ type NatsStreamConfiguration struct { func (x *NatsStreamConfiguration) Reset() { *x = NatsStreamConfiguration{} if protoimpl.UnsafeEnabled { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[39] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[40] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3108,7 +3192,7 @@ func (x *NatsStreamConfiguration) String() string { func (*NatsStreamConfiguration) ProtoMessage() {} func (x *NatsStreamConfiguration) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[39] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[40] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3121,7 +3205,7 @@ func (x *NatsStreamConfiguration) ProtoReflect() protoreflect.Message { // Deprecated: Use NatsStreamConfiguration.ProtoReflect.Descriptor instead. func (*NatsStreamConfiguration) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{39} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{40} } func (x *NatsStreamConfiguration) GetConsumerName() string { @@ -3158,7 +3242,7 @@ type NatsEventConfiguration struct { func (x *NatsEventConfiguration) Reset() { *x = NatsEventConfiguration{} if protoimpl.UnsafeEnabled { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[40] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[41] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3171,7 +3255,7 @@ func (x *NatsEventConfiguration) String() string { func (*NatsEventConfiguration) ProtoMessage() {} func (x *NatsEventConfiguration) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[40] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[41] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3184,7 +3268,7 @@ func (x *NatsEventConfiguration) ProtoReflect() protoreflect.Message { // Deprecated: Use NatsEventConfiguration.ProtoReflect.Descriptor instead. func (*NatsEventConfiguration) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{40} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{41} } func (x *NatsEventConfiguration) GetEngineEventConfiguration() *EngineEventConfiguration { @@ -3220,7 +3304,7 @@ type KafkaEventConfiguration struct { func (x *KafkaEventConfiguration) Reset() { *x = KafkaEventConfiguration{} if protoimpl.UnsafeEnabled { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[41] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[42] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3233,7 +3317,7 @@ func (x *KafkaEventConfiguration) String() string { func (*KafkaEventConfiguration) ProtoMessage() {} func (x *KafkaEventConfiguration) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[41] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[42] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3246,7 +3330,7 @@ func (x *KafkaEventConfiguration) ProtoReflect() protoreflect.Message { // Deprecated: Use KafkaEventConfiguration.ProtoReflect.Descriptor instead. func (*KafkaEventConfiguration) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{41} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{42} } func (x *KafkaEventConfiguration) GetEngineEventConfiguration() *EngineEventConfiguration { @@ -3275,7 +3359,7 @@ type RedisEventConfiguration struct { func (x *RedisEventConfiguration) Reset() { *x = RedisEventConfiguration{} if protoimpl.UnsafeEnabled { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[42] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[43] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3288,7 +3372,7 @@ func (x *RedisEventConfiguration) String() string { func (*RedisEventConfiguration) ProtoMessage() {} func (x *RedisEventConfiguration) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[42] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[43] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3301,7 +3385,7 @@ func (x *RedisEventConfiguration) ProtoReflect() protoreflect.Message { // Deprecated: Use RedisEventConfiguration.ProtoReflect.Descriptor instead. func (*RedisEventConfiguration) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{42} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{43} } func (x *RedisEventConfiguration) GetEngineEventConfiguration() *EngineEventConfiguration { @@ -3332,7 +3416,7 @@ type EngineEventConfiguration struct { func (x *EngineEventConfiguration) Reset() { *x = EngineEventConfiguration{} if protoimpl.UnsafeEnabled { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[43] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[44] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3345,7 +3429,7 @@ func (x *EngineEventConfiguration) String() string { func (*EngineEventConfiguration) ProtoMessage() {} func (x *EngineEventConfiguration) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[43] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[44] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3358,7 +3442,7 @@ func (x *EngineEventConfiguration) ProtoReflect() protoreflect.Message { // Deprecated: Use EngineEventConfiguration.ProtoReflect.Descriptor instead. func (*EngineEventConfiguration) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{43} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{44} } func (x *EngineEventConfiguration) GetProviderId() string { @@ -3402,7 +3486,7 @@ type DataSourceCustomEvents struct { func (x *DataSourceCustomEvents) Reset() { *x = DataSourceCustomEvents{} if protoimpl.UnsafeEnabled { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[44] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[45] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3415,7 +3499,7 @@ func (x *DataSourceCustomEvents) String() string { func (*DataSourceCustomEvents) ProtoMessage() {} func (x *DataSourceCustomEvents) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[44] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[45] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3428,7 +3512,7 @@ func (x *DataSourceCustomEvents) ProtoReflect() protoreflect.Message { // Deprecated: Use DataSourceCustomEvents.ProtoReflect.Descriptor instead. func (*DataSourceCustomEvents) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{44} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{45} } func (x *DataSourceCustomEvents) GetNats() []*NatsEventConfiguration { @@ -3463,7 +3547,7 @@ type DataSourceCustom_Static struct { func (x *DataSourceCustom_Static) Reset() { *x = DataSourceCustom_Static{} if protoimpl.UnsafeEnabled { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[45] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[46] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3476,7 +3560,7 @@ func (x *DataSourceCustom_Static) String() string { func (*DataSourceCustom_Static) ProtoMessage() {} func (x *DataSourceCustom_Static) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[45] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[46] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3489,7 +3573,7 @@ func (x *DataSourceCustom_Static) ProtoReflect() protoreflect.Message { // Deprecated: Use DataSourceCustom_Static.ProtoReflect.Descriptor instead. func (*DataSourceCustom_Static) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{45} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{46} } func (x *DataSourceCustom_Static) GetData() *ConfigurationVariable { @@ -3514,7 +3598,7 @@ type ConfigurationVariable struct { func (x *ConfigurationVariable) Reset() { *x = ConfigurationVariable{} if protoimpl.UnsafeEnabled { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[46] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[47] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3527,7 +3611,7 @@ func (x *ConfigurationVariable) String() string { func (*ConfigurationVariable) ProtoMessage() {} func (x *ConfigurationVariable) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[46] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[47] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3540,7 +3624,7 @@ func (x *ConfigurationVariable) ProtoReflect() protoreflect.Message { // Deprecated: Use ConfigurationVariable.ProtoReflect.Descriptor instead. func (*ConfigurationVariable) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{46} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{47} } func (x *ConfigurationVariable) GetKind() ConfigurationVariableKind { @@ -3590,7 +3674,7 @@ type DirectiveConfiguration struct { func (x *DirectiveConfiguration) Reset() { *x = DirectiveConfiguration{} if protoimpl.UnsafeEnabled { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[47] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[48] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3603,7 +3687,7 @@ func (x *DirectiveConfiguration) String() string { func (*DirectiveConfiguration) ProtoMessage() {} func (x *DirectiveConfiguration) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[47] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[48] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3616,7 +3700,7 @@ func (x *DirectiveConfiguration) ProtoReflect() protoreflect.Message { // Deprecated: Use DirectiveConfiguration.ProtoReflect.Descriptor instead. func (*DirectiveConfiguration) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{47} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{48} } func (x *DirectiveConfiguration) GetDirectiveName() string { @@ -3645,7 +3729,7 @@ type URLQueryConfiguration struct { func (x *URLQueryConfiguration) Reset() { *x = URLQueryConfiguration{} if protoimpl.UnsafeEnabled { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[48] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[49] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3658,7 +3742,7 @@ func (x *URLQueryConfiguration) String() string { func (*URLQueryConfiguration) ProtoMessage() {} func (x *URLQueryConfiguration) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[48] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[49] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3671,7 +3755,7 @@ func (x *URLQueryConfiguration) ProtoReflect() protoreflect.Message { // Deprecated: Use URLQueryConfiguration.ProtoReflect.Descriptor instead. func (*URLQueryConfiguration) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{48} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{49} } func (x *URLQueryConfiguration) GetName() string { @@ -3699,7 +3783,7 @@ type HTTPHeader struct { func (x *HTTPHeader) Reset() { *x = HTTPHeader{} if protoimpl.UnsafeEnabled { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[49] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[50] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3712,7 +3796,7 @@ func (x *HTTPHeader) String() string { func (*HTTPHeader) ProtoMessage() {} func (x *HTTPHeader) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[49] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[50] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3725,7 +3809,7 @@ func (x *HTTPHeader) ProtoReflect() protoreflect.Message { // Deprecated: Use HTTPHeader.ProtoReflect.Descriptor instead. func (*HTTPHeader) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{49} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{50} } func (x *HTTPHeader) GetValues() []*ConfigurationVariable { @@ -3748,7 +3832,7 @@ type MTLSConfiguration struct { func (x *MTLSConfiguration) Reset() { *x = MTLSConfiguration{} if protoimpl.UnsafeEnabled { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[50] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[51] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3761,7 +3845,7 @@ func (x *MTLSConfiguration) String() string { func (*MTLSConfiguration) ProtoMessage() {} func (x *MTLSConfiguration) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[50] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[51] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3774,7 +3858,7 @@ func (x *MTLSConfiguration) ProtoReflect() protoreflect.Message { // Deprecated: Use MTLSConfiguration.ProtoReflect.Descriptor instead. func (*MTLSConfiguration) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{50} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{51} } func (x *MTLSConfiguration) GetKey() *ConfigurationVariable { @@ -3814,7 +3898,7 @@ type GraphQLSubscriptionConfiguration struct { func (x *GraphQLSubscriptionConfiguration) Reset() { *x = GraphQLSubscriptionConfiguration{} if protoimpl.UnsafeEnabled { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[51] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[52] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3827,7 +3911,7 @@ func (x *GraphQLSubscriptionConfiguration) String() string { func (*GraphQLSubscriptionConfiguration) ProtoMessage() {} func (x *GraphQLSubscriptionConfiguration) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[51] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[52] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3840,7 +3924,7 @@ func (x *GraphQLSubscriptionConfiguration) ProtoReflect() protoreflect.Message { // Deprecated: Use GraphQLSubscriptionConfiguration.ProtoReflect.Descriptor instead. func (*GraphQLSubscriptionConfiguration) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{51} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{52} } func (x *GraphQLSubscriptionConfiguration) GetEnabled() bool { @@ -3890,7 +3974,7 @@ type GraphQLFederationConfiguration struct { func (x *GraphQLFederationConfiguration) Reset() { *x = GraphQLFederationConfiguration{} if protoimpl.UnsafeEnabled { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[52] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[53] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3903,7 +3987,7 @@ func (x *GraphQLFederationConfiguration) String() string { func (*GraphQLFederationConfiguration) ProtoMessage() {} func (x *GraphQLFederationConfiguration) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[52] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[53] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3916,7 +4000,7 @@ func (x *GraphQLFederationConfiguration) ProtoReflect() protoreflect.Message { // Deprecated: Use GraphQLFederationConfiguration.ProtoReflect.Descriptor instead. func (*GraphQLFederationConfiguration) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{52} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{53} } func (x *GraphQLFederationConfiguration) GetEnabled() bool { @@ -3945,7 +4029,7 @@ type InternedString struct { func (x *InternedString) Reset() { *x = InternedString{} if protoimpl.UnsafeEnabled { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[53] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[54] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3958,7 +4042,7 @@ func (x *InternedString) String() string { func (*InternedString) ProtoMessage() {} func (x *InternedString) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[53] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[54] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3971,7 +4055,7 @@ func (x *InternedString) ProtoReflect() protoreflect.Message { // Deprecated: Use InternedString.ProtoReflect.Descriptor instead. func (*InternedString) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{53} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{54} } func (x *InternedString) GetKey() string { @@ -3993,7 +4077,7 @@ type SingleTypeField struct { func (x *SingleTypeField) Reset() { *x = SingleTypeField{} if protoimpl.UnsafeEnabled { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[54] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[55] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4006,7 +4090,7 @@ func (x *SingleTypeField) String() string { func (*SingleTypeField) ProtoMessage() {} func (x *SingleTypeField) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[54] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[55] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4019,7 +4103,7 @@ func (x *SingleTypeField) ProtoReflect() protoreflect.Message { // Deprecated: Use SingleTypeField.ProtoReflect.Descriptor instead. func (*SingleTypeField) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{54} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{55} } func (x *SingleTypeField) GetTypeName() string { @@ -4048,7 +4132,7 @@ type SubscriptionFieldCondition struct { func (x *SubscriptionFieldCondition) Reset() { *x = SubscriptionFieldCondition{} if protoimpl.UnsafeEnabled { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[55] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[56] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4061,7 +4145,7 @@ func (x *SubscriptionFieldCondition) String() string { func (*SubscriptionFieldCondition) ProtoMessage() {} func (x *SubscriptionFieldCondition) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[55] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[56] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4074,7 +4158,7 @@ func (x *SubscriptionFieldCondition) ProtoReflect() protoreflect.Message { // Deprecated: Use SubscriptionFieldCondition.ProtoReflect.Descriptor instead. func (*SubscriptionFieldCondition) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{55} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{56} } func (x *SubscriptionFieldCondition) GetFieldPath() []string { @@ -4105,7 +4189,7 @@ type SubscriptionFilterCondition struct { func (x *SubscriptionFilterCondition) Reset() { *x = SubscriptionFilterCondition{} if protoimpl.UnsafeEnabled { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[56] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[57] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4118,7 +4202,7 @@ func (x *SubscriptionFilterCondition) String() string { func (*SubscriptionFilterCondition) ProtoMessage() {} func (x *SubscriptionFilterCondition) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[56] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[57] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4131,7 +4215,7 @@ func (x *SubscriptionFilterCondition) ProtoReflect() protoreflect.Message { // Deprecated: Use SubscriptionFilterCondition.ProtoReflect.Descriptor instead. func (*SubscriptionFilterCondition) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{56} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{57} } func (x *SubscriptionFilterCondition) GetAnd() []*SubscriptionFilterCondition { @@ -4173,7 +4257,7 @@ type CacheWarmerOperations struct { func (x *CacheWarmerOperations) Reset() { *x = CacheWarmerOperations{} if protoimpl.UnsafeEnabled { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[57] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[58] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4186,7 +4270,7 @@ func (x *CacheWarmerOperations) String() string { func (*CacheWarmerOperations) ProtoMessage() {} func (x *CacheWarmerOperations) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[57] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[58] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4199,7 +4283,7 @@ func (x *CacheWarmerOperations) ProtoReflect() protoreflect.Message { // Deprecated: Use CacheWarmerOperations.ProtoReflect.Descriptor instead. func (*CacheWarmerOperations) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{57} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{58} } func (x *CacheWarmerOperations) GetOperations() []*Operation { @@ -4221,7 +4305,7 @@ type Operation struct { func (x *Operation) Reset() { *x = Operation{} if protoimpl.UnsafeEnabled { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[58] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[59] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4234,7 +4318,7 @@ func (x *Operation) String() string { func (*Operation) ProtoMessage() {} func (x *Operation) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[58] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[59] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4247,7 +4331,7 @@ func (x *Operation) ProtoReflect() protoreflect.Message { // Deprecated: Use Operation.ProtoReflect.Descriptor instead. func (*Operation) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{58} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{59} } func (x *Operation) GetRequest() *OperationRequest { @@ -4277,7 +4361,7 @@ type OperationRequest struct { func (x *OperationRequest) Reset() { *x = OperationRequest{} if protoimpl.UnsafeEnabled { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[59] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[60] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4290,7 +4374,7 @@ func (x *OperationRequest) String() string { func (*OperationRequest) ProtoMessage() {} func (x *OperationRequest) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[59] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[60] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4303,7 +4387,7 @@ func (x *OperationRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use OperationRequest.ProtoReflect.Descriptor instead. func (*OperationRequest) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{59} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{60} } func (x *OperationRequest) GetOperationName() string { @@ -4338,7 +4422,7 @@ type Extension struct { func (x *Extension) Reset() { *x = Extension{} if protoimpl.UnsafeEnabled { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[60] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[61] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4351,7 +4435,7 @@ func (x *Extension) String() string { func (*Extension) ProtoMessage() {} func (x *Extension) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[60] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[61] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4364,7 +4448,7 @@ func (x *Extension) ProtoReflect() protoreflect.Message { // Deprecated: Use Extension.ProtoReflect.Descriptor instead. func (*Extension) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{60} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{61} } func (x *Extension) GetPersistedQuery() *PersistedQuery { @@ -4386,7 +4470,7 @@ type PersistedQuery struct { func (x *PersistedQuery) Reset() { *x = PersistedQuery{} if protoimpl.UnsafeEnabled { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[61] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[62] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4399,7 +4483,7 @@ func (x *PersistedQuery) String() string { func (*PersistedQuery) ProtoMessage() {} func (x *PersistedQuery) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[61] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[62] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4412,7 +4496,7 @@ func (x *PersistedQuery) ProtoReflect() protoreflect.Message { // Deprecated: Use PersistedQuery.ProtoReflect.Descriptor instead. func (*PersistedQuery) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{61} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{62} } func (x *PersistedQuery) GetSha256Hash() string { @@ -4441,7 +4525,7 @@ type ClientInfo struct { func (x *ClientInfo) Reset() { *x = ClientInfo{} if protoimpl.UnsafeEnabled { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[62] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[63] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4454,7 +4538,7 @@ func (x *ClientInfo) String() string { func (*ClientInfo) ProtoMessage() {} func (x *ClientInfo) ProtoReflect() protoreflect.Message { - mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[62] + mi := &file_wg_cosmo_node_v1_node_proto_msgTypes[63] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4467,7 +4551,7 @@ func (x *ClientInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use ClientInfo.ProtoReflect.Descriptor instead. func (*ClientInfo) Descriptor() ([]byte, []int) { - return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{62} + return file_wg_cosmo_node_v1_node_proto_rawDescGZIP(), []int{63} } func (x *ClientInfo) GetName() string { @@ -4975,7 +5059,7 @@ var file_wg_cosmo_node_v1_node_proto_rawDesc = []byte{ 0x52, 0x06, 0x6d, 0x61, 0x70, 0x70, 0x65, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x9a, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xfa, 0x01, 0x0a, 0x0d, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x79, 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, @@ -4985,327 +5069,343 @@ var file_wg_cosmo_node_v1_node_proto_rawDesc = []byte{ 0x52, 0x03, 0x72, 0x70, 0x63, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x6d, 0x0a, 0x10, 0x54, - 0x79, 0x70, 0x65, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x12, - 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, - 0x79, 0x70, 0x65, 0x12, 0x45, 0x0a, 0x0e, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x6d, 0x61, 0x70, - 0x70, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x77, 0x67, + 0x09, 0x52, 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5e, 0x0a, 0x17, 0x72, + 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x6d, 0x61, + 0x70, 0x70, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x77, + 0x67, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x76, 0x31, 0x2e, + 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4d, 0x61, 0x70, + 0x70, 0x69, 0x6e, 0x67, 0x52, 0x15, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x46, 0x69, + 0x65, 0x6c, 0x64, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x73, 0x22, 0xa3, 0x01, 0x0a, 0x14, + 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4d, 0x61, 0x70, + 0x70, 0x69, 0x6e, 0x67, 0x12, 0x43, 0x0a, 0x0d, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x6d, 0x61, + 0x70, 0x70, 0x69, 0x6e, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x77, 0x67, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x46, - 0x69, 0x65, 0x6c, 0x64, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x52, 0x0d, 0x66, 0x69, 0x65, - 0x6c, 0x64, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x73, 0x22, 0x92, 0x01, 0x0a, 0x0c, 0x46, - 0x69, 0x65, 0x6c, 0x64, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x12, 0x1a, 0x0a, 0x08, 0x6f, - 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6f, - 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x61, 0x70, 0x70, 0x65, - 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6d, 0x61, 0x70, 0x70, 0x65, 0x64, 0x12, - 0x4e, 0x0a, 0x11, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x6d, 0x61, 0x70, 0x70, - 0x69, 0x6e, 0x67, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x77, 0x67, 0x2e, - 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x72, - 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x52, 0x10, 0x61, - 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x73, 0x22, - 0x45, 0x0a, 0x0f, 0x41, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x61, 0x70, 0x70, 0x69, - 0x6e, 0x67, 0x12, 0x1a, 0x0a, 0x08, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x12, 0x16, - 0x0a, 0x06, 0x6d, 0x61, 0x70, 0x70, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, - 0x6d, 0x61, 0x70, 0x70, 0x65, 0x64, 0x22, 0x5d, 0x0a, 0x0b, 0x45, 0x6e, 0x75, 0x6d, 0x4d, 0x61, + 0x69, 0x65, 0x6c, 0x64, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x52, 0x0c, 0x66, 0x69, 0x65, + 0x6c, 0x64, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x12, 0x10, 0x0a, 0x03, 0x72, 0x70, 0x63, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x72, 0x70, 0x63, 0x12, 0x18, 0x0a, 0x07, 0x72, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x72, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x6d, 0x0a, 0x10, 0x54, 0x79, 0x70, 0x65, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x3a, 0x0a, 0x06, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x77, 0x67, 0x2e, 0x63, - 0x6f, 0x73, 0x6d, 0x6f, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x6e, 0x75, - 0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x52, 0x06, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x73, 0x22, 0x46, 0x0a, 0x10, 0x45, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c, - 0x75, 0x65, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x12, 0x1a, 0x0a, 0x08, 0x6f, 0x72, 0x69, - 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6f, 0x72, 0x69, - 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x61, 0x70, 0x70, 0x65, 0x64, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6d, 0x61, 0x70, 0x70, 0x65, 0x64, 0x22, 0x9f, 0x01, - 0x0a, 0x17, 0x4e, 0x61, 0x74, 0x73, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x23, 0x0a, 0x0d, 0x63, 0x6f, 0x6e, - 0x73, 0x75, 0x6d, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0c, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6d, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1f, - 0x0a, 0x0b, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4e, 0x61, 0x6d, 0x65, 0x12, - 0x3e, 0x0a, 0x1b, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6d, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x61, 0x63, - 0x74, 0x69, 0x76, 0x65, 0x5f, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x19, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6d, 0x65, 0x72, 0x49, 0x6e, - 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x22, - 0xfc, 0x01, 0x0a, 0x16, 0x4e, 0x61, 0x74, 0x73, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x68, 0x0a, 0x1a, 0x65, 0x6e, - 0x67, 0x69, 0x6e, 0x65, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, - 0x2e, 0x77, 0x67, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x76, - 0x31, 0x2e, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x18, 0x65, 0x6e, 0x67, 0x69, - 0x6e, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, - 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x73, 0x75, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, - 0x12, 0x5c, 0x0a, 0x14, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, - 0x2e, 0x77, 0x67, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x76, - 0x31, 0x2e, 0x4e, 0x61, 0x74, 0x73, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x13, 0x73, 0x74, 0x72, 0x65, 0x61, - 0x6d, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x9b, - 0x01, 0x0a, 0x17, 0x4b, 0x61, 0x66, 0x6b, 0x61, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x68, 0x0a, 0x1a, 0x65, 0x6e, - 0x67, 0x69, 0x6e, 0x65, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, - 0x2e, 0x77, 0x67, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x76, - 0x31, 0x2e, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x18, 0x65, 0x6e, 0x67, 0x69, - 0x6e, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x6f, 0x70, 0x69, 0x63, 0x73, 0x18, 0x02, - 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x74, 0x6f, 0x70, 0x69, 0x63, 0x73, 0x22, 0x9f, 0x01, 0x0a, - 0x17, 0x52, 0x65, 0x64, 0x69, 0x73, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x68, 0x0a, 0x1a, 0x65, 0x6e, 0x67, 0x69, - 0x6e, 0x65, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x77, - 0x67, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x76, 0x31, 0x2e, - 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x18, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x45, 0x0a, 0x0e, 0x66, 0x69, 0x65, + 0x6c, 0x64, 0x5f, 0x6d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x1e, 0x2e, 0x77, 0x67, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x2e, 0x6e, 0x6f, 0x64, + 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, + 0x67, 0x52, 0x0d, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x73, + 0x22, 0x92, 0x01, 0x0a, 0x0c, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, + 0x67, 0x12, 0x1a, 0x0a, 0x08, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x12, 0x16, 0x0a, + 0x06, 0x6d, 0x61, 0x70, 0x70, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6d, + 0x61, 0x70, 0x70, 0x65, 0x64, 0x12, 0x4e, 0x0a, 0x11, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x5f, 0x6d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x21, 0x2e, 0x77, 0x67, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x2e, 0x6e, 0x6f, 0x64, 0x65, + 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x61, 0x70, 0x70, + 0x69, 0x6e, 0x67, 0x52, 0x10, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x61, 0x70, + 0x70, 0x69, 0x6e, 0x67, 0x73, 0x22, 0x45, 0x0a, 0x0f, 0x41, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x12, 0x1a, 0x0a, 0x08, 0x6f, 0x72, 0x69, 0x67, + 0x69, 0x6e, 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6f, 0x72, 0x69, 0x67, + 0x69, 0x6e, 0x61, 0x6c, 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x61, 0x70, 0x70, 0x65, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6d, 0x61, 0x70, 0x70, 0x65, 0x64, 0x22, 0x5d, 0x0a, 0x0b, + 0x45, 0x6e, 0x75, 0x6d, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x12, 0x12, 0x0a, 0x04, 0x74, + 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, + 0x3a, 0x0a, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x22, 0x2e, 0x77, 0x67, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, + 0x76, 0x31, 0x2e, 0x45, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4d, 0x61, 0x70, 0x70, + 0x69, 0x6e, 0x67, 0x52, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x22, 0x46, 0x0a, 0x10, 0x45, + 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x12, + 0x1a, 0x0a, 0x08, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x12, 0x16, 0x0a, 0x06, 0x6d, + 0x61, 0x70, 0x70, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6d, 0x61, 0x70, + 0x70, 0x65, 0x64, 0x22, 0x9f, 0x01, 0x0a, 0x17, 0x4e, 0x61, 0x74, 0x73, 0x53, 0x74, 0x72, 0x65, + 0x61, 0x6d, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x23, 0x0a, 0x0d, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6d, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6d, 0x65, 0x72, + 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x74, 0x72, 0x65, 0x61, + 0x6d, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x3e, 0x0a, 0x1b, 0x63, 0x6f, 0x6e, 0x73, 0x75, 0x6d, 0x65, + 0x72, 0x5f, 0x69, 0x6e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x74, 0x68, 0x72, 0x65, 0x73, + 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x19, 0x63, 0x6f, 0x6e, 0x73, + 0x75, 0x6d, 0x65, 0x72, 0x49, 0x6e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x54, 0x68, 0x72, 0x65, + 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x22, 0xfc, 0x01, 0x0a, 0x16, 0x4e, 0x61, 0x74, 0x73, 0x45, 0x76, + 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x68, 0x0a, 0x1a, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x77, 0x67, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x2e, + 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x45, 0x76, + 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x18, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x75, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x73, 0x75, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x12, 0x5c, 0x0a, 0x14, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, + 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x77, 0x67, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x2e, + 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x61, 0x74, 0x73, 0x53, 0x74, 0x72, 0x65, + 0x61, 0x6d, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x13, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x9b, 0x01, 0x0a, 0x17, 0x4b, 0x61, 0x66, 0x6b, 0x61, 0x45, 0x76, + 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x68, 0x0a, 0x1a, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, + 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x77, 0x67, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x2e, + 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x45, 0x76, + 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x18, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x6f, + 0x70, 0x69, 0x63, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x74, 0x6f, 0x70, 0x69, + 0x63, 0x73, 0x22, 0x9f, 0x01, 0x0a, 0x17, 0x52, 0x65, 0x64, 0x69, 0x73, 0x45, 0x76, 0x65, 0x6e, + 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x68, + 0x0a, 0x1a, 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x63, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x77, 0x67, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x2e, 0x6e, 0x6f, + 0x64, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x45, 0x76, 0x65, 0x6e, + 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x18, + 0x65, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x68, 0x61, 0x6e, + 0x6e, 0x65, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x63, 0x68, 0x61, 0x6e, + 0x6e, 0x65, 0x6c, 0x73, 0x22, 0xa8, 0x01, 0x0a, 0x18, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x45, + 0x76, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, + 0x49, 0x64, 0x12, 0x2f, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x1b, 0x2e, 0x77, 0x67, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x2e, 0x6e, 0x6f, 0x64, 0x65, + 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, + 0x79, 0x70, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x79, 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, + 0x12, 0x1d, 0x0a, 0x0a, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x22, + 0xd8, 0x01, 0x0a, 0x16, 0x44, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x75, + 0x73, 0x74, 0x6f, 0x6d, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x3c, 0x0a, 0x04, 0x6e, 0x61, + 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x77, 0x67, 0x2e, 0x63, 0x6f, + 0x73, 0x6d, 0x6f, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x61, 0x74, 0x73, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x18, 0x02, - 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x73, 0x22, 0xa8, - 0x01, 0x0a, 0x18, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x43, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1f, 0x0a, 0x0b, 0x70, - 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0a, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x49, 0x64, 0x12, 0x2f, 0x0a, 0x04, - 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1b, 0x2e, 0x77, 0x67, 0x2e, - 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x76, - 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x1b, 0x0a, - 0x09, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x74, 0x79, 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x66, 0x69, - 0x65, 0x6c, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, - 0x66, 0x69, 0x65, 0x6c, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0xd8, 0x01, 0x0a, 0x16, 0x44, 0x61, - 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x45, 0x76, - 0x65, 0x6e, 0x74, 0x73, 0x12, 0x3c, 0x0a, 0x04, 0x6e, 0x61, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x77, 0x67, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x2e, 0x6e, 0x6f, - 0x64, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4e, 0x61, 0x74, 0x73, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x04, 0x6e, 0x61, - 0x74, 0x73, 0x12, 0x3f, 0x0a, 0x05, 0x6b, 0x61, 0x66, 0x6b, 0x61, 0x18, 0x02, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x29, 0x2e, 0x77, 0x67, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x2e, 0x6e, 0x6f, 0x64, - 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x61, 0x66, 0x6b, 0x61, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x05, 0x6b, 0x61, - 0x66, 0x6b, 0x61, 0x12, 0x3f, 0x0a, 0x05, 0x72, 0x65, 0x64, 0x69, 0x73, 0x18, 0x03, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x77, 0x67, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x2e, 0x6e, 0x6f, - 0x64, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x64, 0x69, 0x73, 0x45, 0x76, 0x65, 0x6e, 0x74, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x05, 0x72, - 0x65, 0x64, 0x69, 0x73, 0x22, 0x56, 0x0a, 0x17, 0x44, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x53, 0x74, 0x61, 0x74, 0x69, 0x63, 0x12, - 0x3b, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, - 0x77, 0x67, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x76, 0x31, - 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x61, - 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0xd5, 0x02, 0x0a, - 0x15, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x61, - 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x3f, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2b, 0x2e, 0x77, 0x67, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x2e, - 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x4b, 0x69, 0x6e, - 0x64, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x36, 0x0a, 0x17, 0x73, 0x74, 0x61, 0x74, 0x69, - 0x63, 0x5f, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, - 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, - 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, - 0x3a, 0x0a, 0x19, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x76, - 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x17, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x56, - 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x4b, 0x0a, 0x22, 0x65, - 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x76, 0x61, 0x72, 0x69, 0x61, - 0x62, 0x6c, 0x65, 0x5f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x1f, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x65, 0x66, 0x61, - 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x3a, 0x0a, 0x19, 0x70, 0x6c, 0x61, 0x63, - 0x65, 0x68, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x5f, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, - 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x17, 0x70, 0x6c, 0x61, - 0x63, 0x65, 0x68, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, - 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x5c, 0x0a, 0x16, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x76, - 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x25, - 0x0a, 0x0e, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x76, - 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x72, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x5f, - 0x74, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x6e, 0x61, 0x6d, 0x65, - 0x54, 0x6f, 0x22, 0x41, 0x0a, 0x15, 0x55, 0x52, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x43, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, - 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x4d, 0x0a, 0x0a, 0x48, 0x54, 0x54, 0x50, 0x48, 0x65, 0x61, - 0x64, 0x65, 0x72, 0x12, 0x3f, 0x0a, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x77, 0x67, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x2e, 0x6e, - 0x6f, 0x64, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x06, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x73, 0x22, 0xbb, 0x01, 0x0a, 0x11, 0x4d, 0x54, 0x4c, 0x53, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x39, 0x0a, 0x03, 0x6b, 0x65, - 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x77, 0x67, 0x2e, 0x63, 0x6f, 0x73, - 0x6d, 0x6f, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, - 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x3b, 0x0a, 0x04, 0x63, 0x65, 0x72, 0x74, 0x18, 0x02, 0x20, + 0x6f, 0x6e, 0x52, 0x04, 0x6e, 0x61, 0x74, 0x73, 0x12, 0x3f, 0x0a, 0x05, 0x6b, 0x61, 0x66, 0x6b, + 0x61, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x77, 0x67, 0x2e, 0x63, 0x6f, 0x73, + 0x6d, 0x6f, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4b, 0x61, 0x66, 0x6b, 0x61, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x05, 0x6b, 0x61, 0x66, 0x6b, 0x61, 0x12, 0x3f, 0x0a, 0x05, 0x72, 0x65, 0x64, + 0x69, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x77, 0x67, 0x2e, 0x63, 0x6f, + 0x73, 0x6d, 0x6f, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x64, 0x69, + 0x73, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x05, 0x72, 0x65, 0x64, 0x69, 0x73, 0x22, 0x56, 0x0a, 0x17, 0x44, 0x61, + 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x53, + 0x74, 0x61, 0x74, 0x69, 0x63, 0x12, 0x3b, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x77, 0x67, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x04, 0x63, 0x65, - 0x72, 0x74, 0x12, 0x2e, 0x0a, 0x12, 0x69, 0x6e, 0x73, 0x65, 0x63, 0x75, 0x72, 0x65, 0x53, 0x6b, - 0x69, 0x70, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, - 0x69, 0x6e, 0x73, 0x65, 0x63, 0x75, 0x72, 0x65, 0x53, 0x6b, 0x69, 0x70, 0x56, 0x65, 0x72, 0x69, - 0x66, 0x79, 0x22, 0xfb, 0x02, 0x0a, 0x20, 0x47, 0x72, 0x61, 0x70, 0x68, 0x51, 0x4c, 0x53, 0x75, - 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, - 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, - 0x64, 0x12, 0x39, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, - 0x2e, 0x77, 0x67, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x76, - 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, - 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x12, 0x1b, 0x0a, 0x06, - 0x75, 0x73, 0x65, 0x53, 0x53, 0x45, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x06, - 0x75, 0x73, 0x65, 0x53, 0x53, 0x45, 0x88, 0x01, 0x01, 0x12, 0x4d, 0x0a, 0x08, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2c, 0x2e, 0x77, 0x67, - 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x47, 0x72, - 0x61, 0x70, 0x68, 0x51, 0x4c, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x48, 0x01, 0x52, 0x08, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x88, 0x01, 0x01, 0x12, 0x65, 0x0a, 0x14, 0x77, 0x65, 0x62, 0x73, - 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x53, 0x75, 0x62, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2c, 0x2e, 0x77, 0x67, 0x2e, 0x63, 0x6f, 0x73, 0x6d, - 0x6f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x47, 0x72, 0x61, 0x70, 0x68, 0x51, 0x4c, - 0x57, 0x65, 0x62, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x53, 0x75, 0x62, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x63, 0x6f, 0x6c, 0x48, 0x02, 0x52, 0x14, 0x77, 0x65, 0x62, 0x73, 0x6f, 0x63, 0x6b, 0x65, - 0x74, 0x53, 0x75, 0x62, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x88, 0x01, 0x01, 0x42, - 0x09, 0x0a, 0x07, 0x5f, 0x75, 0x73, 0x65, 0x53, 0x53, 0x45, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x42, 0x17, 0x0a, 0x15, 0x5f, 0x77, 0x65, 0x62, 0x73, - 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x53, 0x75, 0x62, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, - 0x22, 0x5a, 0x0a, 0x1e, 0x47, 0x72, 0x61, 0x70, 0x68, 0x51, 0x4c, 0x46, 0x65, 0x64, 0x65, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x1e, 0x0a, 0x0a, - 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x64, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x64, 0x6c, 0x22, 0x22, 0x0a, 0x0e, - 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x64, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x10, - 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, - 0x22, 0x4d, 0x0a, 0x0f, 0x53, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x46, 0x69, - 0x65, 0x6c, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x79, 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, - 0x12, 0x1d, 0x0a, 0x0a, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x22, - 0x4f, 0x0a, 0x1a, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x46, - 0x69, 0x65, 0x6c, 0x64, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1d, 0x0a, - 0x0a, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x09, 0x52, 0x09, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x50, 0x61, 0x74, 0x68, 0x12, 0x12, 0x0a, 0x04, - 0x6a, 0x73, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6a, 0x73, 0x6f, 0x6e, - 0x22, 0xb5, 0x02, 0x0a, 0x1b, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, - 0x12, 0x3f, 0x0a, 0x03, 0x61, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, - 0x77, 0x67, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x76, 0x31, - 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x69, 0x6c, - 0x74, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x03, 0x61, 0x6e, - 0x64, 0x12, 0x41, 0x0a, 0x02, 0x69, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, + 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x04, 0x64, 0x61, + 0x74, 0x61, 0x22, 0xd5, 0x02, 0x0a, 0x15, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x3f, 0x0a, 0x04, + 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2b, 0x2e, 0x77, 0x67, 0x2e, + 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x61, 0x72, 0x69, 0x61, + 0x62, 0x6c, 0x65, 0x4b, 0x69, 0x6e, 0x64, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x36, 0x0a, + 0x17, 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x5f, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, + 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, + 0x73, 0x74, 0x61, 0x74, 0x69, 0x63, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x3a, 0x0a, 0x19, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x17, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x61, 0x6d, + 0x65, 0x12, 0x4b, 0x0a, 0x22, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, + 0x5f, 0x76, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x1f, 0x65, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, + 0x6c, 0x65, 0x44, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x3a, + 0x0a, 0x19, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x68, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x5f, 0x76, 0x61, + 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x17, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x68, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x56, 0x61, + 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x5c, 0x0a, 0x16, 0x44, 0x69, + 0x72, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x25, 0x0a, 0x0e, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x76, + 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x64, 0x69, + 0x72, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x72, + 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x74, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x72, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x54, 0x6f, 0x22, 0x41, 0x0a, 0x15, 0x55, 0x52, 0x4c, 0x51, + 0x75, 0x65, 0x72, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x4d, 0x0a, 0x0a, 0x48, + 0x54, 0x54, 0x50, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x3f, 0x0a, 0x06, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x77, 0x67, 0x2e, 0x63, + 0x6f, 0x73, 0x6d, 0x6f, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, + 0x6c, 0x65, 0x52, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x22, 0xbb, 0x01, 0x0a, 0x11, 0x4d, + 0x54, 0x4c, 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x39, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x77, 0x67, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x76, 0x31, - 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x69, 0x65, - 0x6c, 0x64, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x02, 0x69, - 0x6e, 0x88, 0x01, 0x01, 0x12, 0x44, 0x0a, 0x03, 0x6e, 0x6f, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x2d, 0x2e, 0x77, 0x67, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x2e, 0x6e, 0x6f, 0x64, - 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, - 0x48, 0x01, 0x52, 0x03, 0x6e, 0x6f, 0x74, 0x88, 0x01, 0x01, 0x12, 0x3d, 0x0a, 0x02, 0x6f, 0x72, - 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x77, 0x67, 0x2e, 0x63, 0x6f, 0x73, 0x6d, - 0x6f, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, - 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x64, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x02, 0x6f, 0x72, 0x42, 0x05, 0x0a, 0x03, 0x5f, 0x69, 0x6e, - 0x42, 0x06, 0x0a, 0x04, 0x5f, 0x6e, 0x6f, 0x74, 0x22, 0x54, 0x0a, 0x15, 0x43, 0x61, 0x63, 0x68, - 0x65, 0x57, 0x61, 0x72, 0x6d, 0x65, 0x72, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x12, 0x3b, 0x0a, 0x0a, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x77, 0x67, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, - 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x52, 0x0a, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x7f, - 0x0a, 0x09, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3c, 0x0a, 0x07, 0x72, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x77, - 0x67, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x76, 0x31, 0x2e, - 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x52, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x34, 0x0a, 0x06, 0x63, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x77, 0x67, 0x2e, 0x63, - 0x6f, 0x73, 0x6d, 0x6f, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x06, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x22, - 0x8c, 0x01, 0x0a, 0x10, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6f, 0x70, - 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x71, - 0x75, 0x65, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, - 0x79, 0x12, 0x3b, 0x0a, 0x0a, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x77, 0x67, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, - 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, - 0x6f, 0x6e, 0x52, 0x0a, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x56, - 0x0a, 0x09, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x49, 0x0a, 0x0f, 0x70, - 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x64, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x77, 0x67, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x2e, - 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, - 0x64, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x0e, 0x70, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, - 0x64, 0x51, 0x75, 0x65, 0x72, 0x79, 0x22, 0x4b, 0x0a, 0x0e, 0x50, 0x65, 0x72, 0x73, 0x69, 0x73, - 0x74, 0x65, 0x64, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x68, 0x61, 0x32, - 0x35, 0x36, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, - 0x68, 0x61, 0x32, 0x35, 0x36, 0x48, 0x61, 0x73, 0x68, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, - 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x0a, 0x0a, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, - 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x2a, - 0x82, 0x01, 0x0a, 0x1b, 0x41, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x6e, 0x64, - 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x1b, 0x0a, 0x17, 0x52, 0x45, 0x4e, 0x44, 0x45, 0x52, 0x5f, 0x41, 0x52, 0x47, 0x55, 0x4d, 0x45, - 0x4e, 0x54, 0x5f, 0x44, 0x45, 0x46, 0x41, 0x55, 0x4c, 0x54, 0x10, 0x00, 0x12, 0x24, 0x0a, 0x20, - 0x52, 0x45, 0x4e, 0x44, 0x45, 0x52, 0x5f, 0x41, 0x52, 0x47, 0x55, 0x4d, 0x45, 0x4e, 0x54, 0x5f, - 0x41, 0x53, 0x5f, 0x47, 0x52, 0x41, 0x50, 0x48, 0x51, 0x4c, 0x5f, 0x56, 0x41, 0x4c, 0x55, 0x45, - 0x10, 0x01, 0x12, 0x20, 0x0a, 0x1c, 0x52, 0x45, 0x4e, 0x44, 0x45, 0x52, 0x5f, 0x41, 0x52, 0x47, - 0x55, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x41, 0x53, 0x5f, 0x41, 0x52, 0x52, 0x41, 0x59, 0x5f, 0x43, - 0x53, 0x56, 0x10, 0x02, 0x2a, 0x36, 0x0a, 0x0e, 0x41, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x10, 0x0a, 0x0c, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, - 0x5f, 0x46, 0x49, 0x45, 0x4c, 0x44, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x46, 0x49, 0x45, 0x4c, - 0x44, 0x5f, 0x41, 0x52, 0x47, 0x55, 0x4d, 0x45, 0x4e, 0x54, 0x10, 0x01, 0x2a, 0x35, 0x0a, 0x0e, - 0x44, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x0a, - 0x0a, 0x06, 0x53, 0x54, 0x41, 0x54, 0x49, 0x43, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x47, 0x52, - 0x41, 0x50, 0x48, 0x51, 0x4c, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x50, 0x55, 0x42, 0x53, 0x55, - 0x42, 0x10, 0x02, 0x2a, 0x5c, 0x0a, 0x0a, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x54, 0x79, 0x70, - 0x65, 0x12, 0x1b, 0x0a, 0x17, 0x4c, 0x4f, 0x4f, 0x4b, 0x55, 0x50, 0x5f, 0x54, 0x59, 0x50, 0x45, - 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x17, - 0x0a, 0x13, 0x4c, 0x4f, 0x4f, 0x4b, 0x55, 0x50, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x52, 0x45, - 0x53, 0x4f, 0x4c, 0x56, 0x45, 0x10, 0x01, 0x12, 0x18, 0x0a, 0x14, 0x4c, 0x4f, 0x4f, 0x4b, 0x55, - 0x50, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x52, 0x45, 0x51, 0x55, 0x49, 0x52, 0x45, 0x53, 0x10, - 0x02, 0x2a, 0x87, 0x01, 0x0a, 0x0d, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, - 0x79, 0x70, 0x65, 0x12, 0x1e, 0x0a, 0x1a, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, - 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, - 0x44, 0x10, 0x00, 0x12, 0x18, 0x0a, 0x14, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, - 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x51, 0x55, 0x45, 0x52, 0x59, 0x10, 0x01, 0x12, 0x1b, 0x0a, - 0x17, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, - 0x4d, 0x55, 0x54, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x02, 0x12, 0x1f, 0x0a, 0x1b, 0x4f, 0x50, - 0x45, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x55, 0x42, - 0x53, 0x43, 0x52, 0x49, 0x50, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x03, 0x2a, 0x34, 0x0a, 0x09, 0x45, - 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x50, 0x55, 0x42, 0x4c, - 0x49, 0x53, 0x48, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x52, 0x45, 0x51, 0x55, 0x45, 0x53, 0x54, - 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x53, 0x55, 0x42, 0x53, 0x43, 0x52, 0x49, 0x42, 0x45, 0x10, - 0x02, 0x2a, 0x86, 0x01, 0x0a, 0x19, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x4b, 0x69, 0x6e, 0x64, 0x12, - 0x21, 0x0a, 0x1d, 0x53, 0x54, 0x41, 0x54, 0x49, 0x43, 0x5f, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, - 0x55, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x56, 0x41, 0x52, 0x49, 0x41, 0x42, 0x4c, 0x45, - 0x10, 0x00, 0x12, 0x1e, 0x0a, 0x1a, 0x45, 0x4e, 0x56, 0x5f, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, - 0x55, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x56, 0x41, 0x52, 0x49, 0x41, 0x42, 0x4c, 0x45, - 0x10, 0x01, 0x12, 0x26, 0x0a, 0x22, 0x50, 0x4c, 0x41, 0x43, 0x45, 0x48, 0x4f, 0x4c, 0x44, 0x45, - 0x52, 0x5f, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x55, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, - 0x56, 0x41, 0x52, 0x49, 0x41, 0x42, 0x4c, 0x45, 0x10, 0x02, 0x2a, 0x41, 0x0a, 0x0a, 0x48, 0x54, - 0x54, 0x50, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x07, 0x0a, 0x03, 0x47, 0x45, 0x54, 0x10, - 0x00, 0x12, 0x08, 0x0a, 0x04, 0x50, 0x4f, 0x53, 0x54, 0x10, 0x01, 0x12, 0x07, 0x0a, 0x03, 0x50, - 0x55, 0x54, 0x10, 0x02, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, 0x10, 0x03, - 0x12, 0x0b, 0x0a, 0x07, 0x4f, 0x50, 0x54, 0x49, 0x4f, 0x4e, 0x53, 0x10, 0x04, 0x32, 0x6e, 0x0a, - 0x0b, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x5f, 0x0a, 0x0c, - 0x53, 0x65, 0x6c, 0x66, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0x25, 0x2e, 0x77, + 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x61, + 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x3b, 0x0a, 0x04, 0x63, + 0x65, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x77, 0x67, 0x2e, 0x63, + 0x6f, 0x73, 0x6d, 0x6f, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, + 0x6c, 0x65, 0x52, 0x04, 0x63, 0x65, 0x72, 0x74, 0x12, 0x2e, 0x0a, 0x12, 0x69, 0x6e, 0x73, 0x65, + 0x63, 0x75, 0x72, 0x65, 0x53, 0x6b, 0x69, 0x70, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x69, 0x6e, 0x73, 0x65, 0x63, 0x75, 0x72, 0x65, 0x53, 0x6b, + 0x69, 0x70, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x22, 0xfb, 0x02, 0x0a, 0x20, 0x47, 0x72, 0x61, + 0x70, 0x68, 0x51, 0x4c, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, + 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, + 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x39, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x77, 0x67, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x2e, + 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, 0x65, 0x52, 0x03, 0x75, + 0x72, 0x6c, 0x12, 0x1b, 0x0a, 0x06, 0x75, 0x73, 0x65, 0x53, 0x53, 0x45, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x08, 0x48, 0x00, 0x52, 0x06, 0x75, 0x73, 0x65, 0x53, 0x53, 0x45, 0x88, 0x01, 0x01, 0x12, + 0x4d, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x2c, 0x2e, 0x77, 0x67, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x2e, 0x63, 0x6f, 0x6d, + 0x6d, 0x6f, 0x6e, 0x2e, 0x47, 0x72, 0x61, 0x70, 0x68, 0x51, 0x4c, 0x53, 0x75, 0x62, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x48, + 0x01, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x88, 0x01, 0x01, 0x12, 0x65, + 0x0a, 0x14, 0x77, 0x65, 0x62, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x53, 0x75, 0x62, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2c, 0x2e, 0x77, + 0x67, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x47, + 0x72, 0x61, 0x70, 0x68, 0x51, 0x4c, 0x57, 0x65, 0x62, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x53, + 0x75, 0x62, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x48, 0x02, 0x52, 0x14, 0x77, 0x65, + 0x62, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x53, 0x75, 0x62, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, + 0x6f, 0x6c, 0x88, 0x01, 0x01, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x75, 0x73, 0x65, 0x53, 0x53, 0x45, + 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x42, 0x17, 0x0a, + 0x15, 0x5f, 0x77, 0x65, 0x62, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x53, 0x75, 0x62, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x22, 0x5a, 0x0a, 0x1e, 0x47, 0x72, 0x61, 0x70, 0x68, 0x51, + 0x4c, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, + 0x6c, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, + 0x65, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x64, 0x6c, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, + 0x64, 0x6c, 0x22, 0x22, 0x0a, 0x0e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x65, 0x64, 0x53, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x22, 0x4d, 0x0a, 0x0f, 0x53, 0x69, 0x6e, 0x67, 0x6c, 0x65, + 0x54, 0x79, 0x70, 0x65, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x79, 0x70, + 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x79, + 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x66, 0x69, 0x65, 0x6c, + 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x4f, 0x0a, 0x1a, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x70, 0x61, 0x74, + 0x68, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x50, 0x61, + 0x74, 0x68, 0x12, 0x12, 0x0a, 0x04, 0x6a, 0x73, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0xb5, 0x02, 0x0a, 0x1b, 0x53, 0x75, 0x62, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x43, 0x6f, 0x6e, + 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3f, 0x0a, 0x03, 0x61, 0x6e, 0x64, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x77, 0x67, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x2e, 0x6e, + 0x6f, 0x64, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x03, 0x61, 0x6e, 0x64, 0x12, 0x41, 0x0a, 0x02, 0x69, 0x6e, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x77, 0x67, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x2e, 0x6e, + 0x6f, 0x64, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x48, 0x00, 0x52, 0x02, 0x69, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x44, 0x0a, 0x03, 0x6e, 0x6f, + 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x77, 0x67, 0x2e, 0x63, 0x6f, 0x73, + 0x6d, 0x6f, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x43, 0x6f, 0x6e, + 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x01, 0x52, 0x03, 0x6e, 0x6f, 0x74, 0x88, 0x01, 0x01, + 0x12, 0x3d, 0x0a, 0x02, 0x6f, 0x72, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x77, 0x67, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x76, 0x31, 0x2e, - 0x53, 0x65, 0x6c, 0x66, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x77, 0x67, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x2e, 0x6e, - 0x6f, 0x64, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x6c, 0x66, 0x52, 0x65, 0x67, 0x69, 0x73, - 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0xcb, 0x01, - 0x0a, 0x14, 0x63, 0x6f, 0x6d, 0x2e, 0x77, 0x67, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x2e, 0x6e, - 0x6f, 0x64, 0x65, 0x2e, 0x76, 0x31, 0x42, 0x09, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x72, 0x6f, 0x74, - 0x6f, 0x50, 0x01, 0x5a, 0x45, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, - 0x77, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x67, 0x72, 0x61, 0x70, 0x68, 0x2f, 0x63, 0x6f, 0x73, 0x6d, - 0x6f, 0x2f, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x2f, 0x77, 0x67, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x2f, 0x6e, 0x6f, 0x64, 0x65, - 0x2f, 0x76, 0x31, 0x3b, 0x6e, 0x6f, 0x64, 0x65, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x57, 0x43, 0x4e, - 0xaa, 0x02, 0x10, 0x57, 0x67, 0x2e, 0x43, 0x6f, 0x73, 0x6d, 0x6f, 0x2e, 0x4e, 0x6f, 0x64, 0x65, - 0x2e, 0x56, 0x31, 0xca, 0x02, 0x10, 0x57, 0x67, 0x5c, 0x43, 0x6f, 0x73, 0x6d, 0x6f, 0x5c, 0x4e, - 0x6f, 0x64, 0x65, 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x1c, 0x57, 0x67, 0x5c, 0x43, 0x6f, 0x73, 0x6d, - 0x6f, 0x5c, 0x4e, 0x6f, 0x64, 0x65, 0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, - 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x13, 0x57, 0x67, 0x3a, 0x3a, 0x43, 0x6f, 0x73, 0x6d, - 0x6f, 0x3a, 0x3a, 0x4e, 0x6f, 0x64, 0x65, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x33, + 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x69, 0x6c, 0x74, + 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x02, 0x6f, 0x72, 0x42, + 0x05, 0x0a, 0x03, 0x5f, 0x69, 0x6e, 0x42, 0x06, 0x0a, 0x04, 0x5f, 0x6e, 0x6f, 0x74, 0x22, 0x54, + 0x0a, 0x15, 0x43, 0x61, 0x63, 0x68, 0x65, 0x57, 0x61, 0x72, 0x6d, 0x65, 0x72, 0x4f, 0x70, 0x65, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x3b, 0x0a, 0x0a, 0x6f, 0x70, 0x65, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x77, 0x67, + 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4f, + 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x7f, 0x0a, 0x09, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x3c, 0x0a, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x77, 0x67, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x2e, 0x6e, 0x6f, + 0x64, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x34, 0x0a, 0x06, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1c, 0x2e, 0x77, 0x67, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, + 0x76, 0x31, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x06, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x22, 0x8c, 0x01, 0x0a, 0x10, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x6f, 0x70, + 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0d, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, + 0x65, 0x12, 0x14, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x3b, 0x0a, 0x0a, 0x65, 0x78, 0x74, 0x65, 0x6e, + 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x77, 0x67, + 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x45, + 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, + 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x56, 0x0a, 0x09, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, + 0x6e, 0x12, 0x49, 0x0a, 0x0f, 0x70, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x64, 0x5f, 0x71, + 0x75, 0x65, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x77, 0x67, 0x2e, + 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x65, + 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x64, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x0e, 0x70, 0x65, + 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x64, 0x51, 0x75, 0x65, 0x72, 0x79, 0x22, 0x4b, 0x0a, 0x0e, + 0x50, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x64, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x1f, + 0x0a, 0x0b, 0x73, 0x68, 0x61, 0x32, 0x35, 0x36, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x68, 0x61, 0x32, 0x35, 0x36, 0x48, 0x61, 0x73, 0x68, 0x12, + 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x0a, 0x0a, 0x43, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x76, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x2a, 0x82, 0x01, 0x0a, 0x1b, 0x41, 0x72, 0x67, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x52, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1b, 0x0a, 0x17, 0x52, 0x45, 0x4e, 0x44, 0x45, 0x52, 0x5f, + 0x41, 0x52, 0x47, 0x55, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x44, 0x45, 0x46, 0x41, 0x55, 0x4c, 0x54, + 0x10, 0x00, 0x12, 0x24, 0x0a, 0x20, 0x52, 0x45, 0x4e, 0x44, 0x45, 0x52, 0x5f, 0x41, 0x52, 0x47, + 0x55, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x41, 0x53, 0x5f, 0x47, 0x52, 0x41, 0x50, 0x48, 0x51, 0x4c, + 0x5f, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x10, 0x01, 0x12, 0x20, 0x0a, 0x1c, 0x52, 0x45, 0x4e, 0x44, + 0x45, 0x52, 0x5f, 0x41, 0x52, 0x47, 0x55, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x41, 0x53, 0x5f, 0x41, + 0x52, 0x52, 0x41, 0x59, 0x5f, 0x43, 0x53, 0x56, 0x10, 0x02, 0x2a, 0x36, 0x0a, 0x0e, 0x41, 0x72, + 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x10, 0x0a, 0x0c, + 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x5f, 0x46, 0x49, 0x45, 0x4c, 0x44, 0x10, 0x00, 0x12, 0x12, + 0x0a, 0x0e, 0x46, 0x49, 0x45, 0x4c, 0x44, 0x5f, 0x41, 0x52, 0x47, 0x55, 0x4d, 0x45, 0x4e, 0x54, + 0x10, 0x01, 0x2a, 0x35, 0x0a, 0x0e, 0x44, 0x61, 0x74, 0x61, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x54, 0x41, 0x54, 0x49, 0x43, 0x10, 0x00, + 0x12, 0x0b, 0x0a, 0x07, 0x47, 0x52, 0x41, 0x50, 0x48, 0x51, 0x4c, 0x10, 0x01, 0x12, 0x0a, 0x0a, + 0x06, 0x50, 0x55, 0x42, 0x53, 0x55, 0x42, 0x10, 0x02, 0x2a, 0x5c, 0x0a, 0x0a, 0x4c, 0x6f, 0x6f, + 0x6b, 0x75, 0x70, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1b, 0x0a, 0x17, 0x4c, 0x4f, 0x4f, 0x4b, 0x55, + 0x50, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, + 0x45, 0x44, 0x10, 0x00, 0x12, 0x17, 0x0a, 0x13, 0x4c, 0x4f, 0x4f, 0x4b, 0x55, 0x50, 0x5f, 0x54, + 0x59, 0x50, 0x45, 0x5f, 0x52, 0x45, 0x53, 0x4f, 0x4c, 0x56, 0x45, 0x10, 0x01, 0x12, 0x18, 0x0a, + 0x14, 0x4c, 0x4f, 0x4f, 0x4b, 0x55, 0x50, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x52, 0x45, 0x51, + 0x55, 0x49, 0x52, 0x45, 0x53, 0x10, 0x02, 0x2a, 0x87, 0x01, 0x0a, 0x0d, 0x4f, 0x70, 0x65, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1e, 0x0a, 0x1a, 0x4f, 0x50, 0x45, + 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, + 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x18, 0x0a, 0x14, 0x4f, 0x50, 0x45, + 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x51, 0x55, 0x45, 0x52, + 0x59, 0x10, 0x01, 0x12, 0x1b, 0x0a, 0x17, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, + 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4d, 0x55, 0x54, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x02, + 0x12, 0x1f, 0x0a, 0x1b, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x54, 0x59, + 0x50, 0x45, 0x5f, 0x53, 0x55, 0x42, 0x53, 0x43, 0x52, 0x49, 0x50, 0x54, 0x49, 0x4f, 0x4e, 0x10, + 0x03, 0x2a, 0x34, 0x0a, 0x09, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0b, + 0x0a, 0x07, 0x50, 0x55, 0x42, 0x4c, 0x49, 0x53, 0x48, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x52, + 0x45, 0x51, 0x55, 0x45, 0x53, 0x54, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x53, 0x55, 0x42, 0x53, + 0x43, 0x52, 0x49, 0x42, 0x45, 0x10, 0x02, 0x2a, 0x86, 0x01, 0x0a, 0x19, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x62, 0x6c, + 0x65, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x21, 0x0a, 0x1d, 0x53, 0x54, 0x41, 0x54, 0x49, 0x43, 0x5f, + 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x55, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x56, 0x41, + 0x52, 0x49, 0x41, 0x42, 0x4c, 0x45, 0x10, 0x00, 0x12, 0x1e, 0x0a, 0x1a, 0x45, 0x4e, 0x56, 0x5f, + 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x55, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x56, 0x41, + 0x52, 0x49, 0x41, 0x42, 0x4c, 0x45, 0x10, 0x01, 0x12, 0x26, 0x0a, 0x22, 0x50, 0x4c, 0x41, 0x43, + 0x45, 0x48, 0x4f, 0x4c, 0x44, 0x45, 0x52, 0x5f, 0x43, 0x4f, 0x4e, 0x46, 0x49, 0x47, 0x55, 0x52, + 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x56, 0x41, 0x52, 0x49, 0x41, 0x42, 0x4c, 0x45, 0x10, 0x02, + 0x2a, 0x41, 0x0a, 0x0a, 0x48, 0x54, 0x54, 0x50, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x07, + 0x0a, 0x03, 0x47, 0x45, 0x54, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x50, 0x4f, 0x53, 0x54, 0x10, + 0x01, 0x12, 0x07, 0x0a, 0x03, 0x50, 0x55, 0x54, 0x10, 0x02, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x45, + 0x4c, 0x45, 0x54, 0x45, 0x10, 0x03, 0x12, 0x0b, 0x0a, 0x07, 0x4f, 0x50, 0x54, 0x49, 0x4f, 0x4e, + 0x53, 0x10, 0x04, 0x32, 0x6e, 0x0a, 0x0b, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x12, 0x5f, 0x0a, 0x0c, 0x53, 0x65, 0x6c, 0x66, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, + 0x65, 0x72, 0x12, 0x25, 0x2e, 0x77, 0x67, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x2e, 0x6e, 0x6f, + 0x64, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x6c, 0x66, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, + 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x77, 0x67, 0x2e, 0x63, + 0x6f, 0x73, 0x6d, 0x6f, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x6c, + 0x66, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x00, 0x42, 0xcb, 0x01, 0x0a, 0x14, 0x63, 0x6f, 0x6d, 0x2e, 0x77, 0x67, 0x2e, 0x63, + 0x6f, 0x73, 0x6d, 0x6f, 0x2e, 0x6e, 0x6f, 0x64, 0x65, 0x2e, 0x76, 0x31, 0x42, 0x09, 0x4e, 0x6f, + 0x64, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x45, 0x67, 0x69, 0x74, 0x68, 0x75, + 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x77, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x67, 0x72, 0x61, 0x70, + 0x68, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x2f, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x2f, 0x67, + 0x65, 0x6e, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x77, 0x67, 0x2f, 0x63, 0x6f, 0x73, 0x6d, + 0x6f, 0x2f, 0x6e, 0x6f, 0x64, 0x65, 0x2f, 0x76, 0x31, 0x3b, 0x6e, 0x6f, 0x64, 0x65, 0x76, 0x31, + 0xa2, 0x02, 0x03, 0x57, 0x43, 0x4e, 0xaa, 0x02, 0x10, 0x57, 0x67, 0x2e, 0x43, 0x6f, 0x73, 0x6d, + 0x6f, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x10, 0x57, 0x67, 0x5c, 0x43, + 0x6f, 0x73, 0x6d, 0x6f, 0x5c, 0x4e, 0x6f, 0x64, 0x65, 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x1c, 0x57, + 0x67, 0x5c, 0x43, 0x6f, 0x73, 0x6d, 0x6f, 0x5c, 0x4e, 0x6f, 0x64, 0x65, 0x5c, 0x56, 0x31, 0x5c, + 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x13, 0x57, 0x67, + 0x3a, 0x3a, 0x43, 0x6f, 0x73, 0x6d, 0x6f, 0x3a, 0x3a, 0x4e, 0x6f, 0x64, 0x65, 0x3a, 0x3a, 0x56, + 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -5321,7 +5421,7 @@ func file_wg_cosmo_node_v1_node_proto_rawDescGZIP() []byte { } var file_wg_cosmo_node_v1_node_proto_enumTypes = make([]protoimpl.EnumInfo, 8) -var file_wg_cosmo_node_v1_node_proto_msgTypes = make([]protoimpl.MessageInfo, 66) +var file_wg_cosmo_node_v1_node_proto_msgTypes = make([]protoimpl.MessageInfo, 67) var file_wg_cosmo_node_v1_node_proto_goTypes = []any{ (ArgumentRenderConfiguration)(0), // 0: wg.cosmo.node.v1.ArgumentRenderConfiguration (ArgumentSource)(0), // 1: wg.cosmo.node.v1.ArgumentSource @@ -5365,67 +5465,68 @@ var file_wg_cosmo_node_v1_node_proto_goTypes = []any{ (*LookupFieldMapping)(nil), // 39: wg.cosmo.node.v1.LookupFieldMapping (*OperationMapping)(nil), // 40: wg.cosmo.node.v1.OperationMapping (*EntityMapping)(nil), // 41: wg.cosmo.node.v1.EntityMapping - (*TypeFieldMapping)(nil), // 42: wg.cosmo.node.v1.TypeFieldMapping - (*FieldMapping)(nil), // 43: wg.cosmo.node.v1.FieldMapping - (*ArgumentMapping)(nil), // 44: wg.cosmo.node.v1.ArgumentMapping - (*EnumMapping)(nil), // 45: wg.cosmo.node.v1.EnumMapping - (*EnumValueMapping)(nil), // 46: wg.cosmo.node.v1.EnumValueMapping - (*NatsStreamConfiguration)(nil), // 47: wg.cosmo.node.v1.NatsStreamConfiguration - (*NatsEventConfiguration)(nil), // 48: wg.cosmo.node.v1.NatsEventConfiguration - (*KafkaEventConfiguration)(nil), // 49: wg.cosmo.node.v1.KafkaEventConfiguration - (*RedisEventConfiguration)(nil), // 50: wg.cosmo.node.v1.RedisEventConfiguration - (*EngineEventConfiguration)(nil), // 51: wg.cosmo.node.v1.EngineEventConfiguration - (*DataSourceCustomEvents)(nil), // 52: wg.cosmo.node.v1.DataSourceCustomEvents - (*DataSourceCustom_Static)(nil), // 53: wg.cosmo.node.v1.DataSourceCustom_Static - (*ConfigurationVariable)(nil), // 54: wg.cosmo.node.v1.ConfigurationVariable - (*DirectiveConfiguration)(nil), // 55: wg.cosmo.node.v1.DirectiveConfiguration - (*URLQueryConfiguration)(nil), // 56: wg.cosmo.node.v1.URLQueryConfiguration - (*HTTPHeader)(nil), // 57: wg.cosmo.node.v1.HTTPHeader - (*MTLSConfiguration)(nil), // 58: wg.cosmo.node.v1.MTLSConfiguration - (*GraphQLSubscriptionConfiguration)(nil), // 59: wg.cosmo.node.v1.GraphQLSubscriptionConfiguration - (*GraphQLFederationConfiguration)(nil), // 60: wg.cosmo.node.v1.GraphQLFederationConfiguration - (*InternedString)(nil), // 61: wg.cosmo.node.v1.InternedString - (*SingleTypeField)(nil), // 62: wg.cosmo.node.v1.SingleTypeField - (*SubscriptionFieldCondition)(nil), // 63: wg.cosmo.node.v1.SubscriptionFieldCondition - (*SubscriptionFilterCondition)(nil), // 64: wg.cosmo.node.v1.SubscriptionFilterCondition - (*CacheWarmerOperations)(nil), // 65: wg.cosmo.node.v1.CacheWarmerOperations - (*Operation)(nil), // 66: wg.cosmo.node.v1.Operation - (*OperationRequest)(nil), // 67: wg.cosmo.node.v1.OperationRequest - (*Extension)(nil), // 68: wg.cosmo.node.v1.Extension - (*PersistedQuery)(nil), // 69: wg.cosmo.node.v1.PersistedQuery - (*ClientInfo)(nil), // 70: wg.cosmo.node.v1.ClientInfo - nil, // 71: wg.cosmo.node.v1.FeatureFlagRouterExecutionConfigs.ConfigByFeatureFlagNameEntry - nil, // 72: wg.cosmo.node.v1.EngineConfiguration.StringStorageEntry - nil, // 73: wg.cosmo.node.v1.FetchConfiguration.HeaderEntry - (common.EnumStatusCode)(0), // 74: wg.cosmo.common.EnumStatusCode - (common.GraphQLSubscriptionProtocol)(0), // 75: wg.cosmo.common.GraphQLSubscriptionProtocol - (common.GraphQLWebsocketSubprotocol)(0), // 76: wg.cosmo.common.GraphQLWebsocketSubprotocol + (*RequiredFieldMapping)(nil), // 42: wg.cosmo.node.v1.RequiredFieldMapping + (*TypeFieldMapping)(nil), // 43: wg.cosmo.node.v1.TypeFieldMapping + (*FieldMapping)(nil), // 44: wg.cosmo.node.v1.FieldMapping + (*ArgumentMapping)(nil), // 45: wg.cosmo.node.v1.ArgumentMapping + (*EnumMapping)(nil), // 46: wg.cosmo.node.v1.EnumMapping + (*EnumValueMapping)(nil), // 47: wg.cosmo.node.v1.EnumValueMapping + (*NatsStreamConfiguration)(nil), // 48: wg.cosmo.node.v1.NatsStreamConfiguration + (*NatsEventConfiguration)(nil), // 49: wg.cosmo.node.v1.NatsEventConfiguration + (*KafkaEventConfiguration)(nil), // 50: wg.cosmo.node.v1.KafkaEventConfiguration + (*RedisEventConfiguration)(nil), // 51: wg.cosmo.node.v1.RedisEventConfiguration + (*EngineEventConfiguration)(nil), // 52: wg.cosmo.node.v1.EngineEventConfiguration + (*DataSourceCustomEvents)(nil), // 53: wg.cosmo.node.v1.DataSourceCustomEvents + (*DataSourceCustom_Static)(nil), // 54: wg.cosmo.node.v1.DataSourceCustom_Static + (*ConfigurationVariable)(nil), // 55: wg.cosmo.node.v1.ConfigurationVariable + (*DirectiveConfiguration)(nil), // 56: wg.cosmo.node.v1.DirectiveConfiguration + (*URLQueryConfiguration)(nil), // 57: wg.cosmo.node.v1.URLQueryConfiguration + (*HTTPHeader)(nil), // 58: wg.cosmo.node.v1.HTTPHeader + (*MTLSConfiguration)(nil), // 59: wg.cosmo.node.v1.MTLSConfiguration + (*GraphQLSubscriptionConfiguration)(nil), // 60: wg.cosmo.node.v1.GraphQLSubscriptionConfiguration + (*GraphQLFederationConfiguration)(nil), // 61: wg.cosmo.node.v1.GraphQLFederationConfiguration + (*InternedString)(nil), // 62: wg.cosmo.node.v1.InternedString + (*SingleTypeField)(nil), // 63: wg.cosmo.node.v1.SingleTypeField + (*SubscriptionFieldCondition)(nil), // 64: wg.cosmo.node.v1.SubscriptionFieldCondition + (*SubscriptionFilterCondition)(nil), // 65: wg.cosmo.node.v1.SubscriptionFilterCondition + (*CacheWarmerOperations)(nil), // 66: wg.cosmo.node.v1.CacheWarmerOperations + (*Operation)(nil), // 67: wg.cosmo.node.v1.Operation + (*OperationRequest)(nil), // 68: wg.cosmo.node.v1.OperationRequest + (*Extension)(nil), // 69: wg.cosmo.node.v1.Extension + (*PersistedQuery)(nil), // 70: wg.cosmo.node.v1.PersistedQuery + (*ClientInfo)(nil), // 71: wg.cosmo.node.v1.ClientInfo + nil, // 72: wg.cosmo.node.v1.FeatureFlagRouterExecutionConfigs.ConfigByFeatureFlagNameEntry + nil, // 73: wg.cosmo.node.v1.EngineConfiguration.StringStorageEntry + nil, // 74: wg.cosmo.node.v1.FetchConfiguration.HeaderEntry + (common.EnumStatusCode)(0), // 75: wg.cosmo.common.EnumStatusCode + (common.GraphQLSubscriptionProtocol)(0), // 76: wg.cosmo.common.GraphQLSubscriptionProtocol + (common.GraphQLWebsocketSubprotocol)(0), // 77: wg.cosmo.common.GraphQLWebsocketSubprotocol } var file_wg_cosmo_node_v1_node_proto_depIdxs = []int32{ - 71, // 0: wg.cosmo.node.v1.FeatureFlagRouterExecutionConfigs.config_by_feature_flag_name:type_name -> wg.cosmo.node.v1.FeatureFlagRouterExecutionConfigs.ConfigByFeatureFlagNameEntry + 72, // 0: wg.cosmo.node.v1.FeatureFlagRouterExecutionConfigs.config_by_feature_flag_name:type_name -> wg.cosmo.node.v1.FeatureFlagRouterExecutionConfigs.ConfigByFeatureFlagNameEntry 18, // 1: wg.cosmo.node.v1.FeatureFlagRouterExecutionConfig.engine_config:type_name -> wg.cosmo.node.v1.EngineConfiguration 8, // 2: wg.cosmo.node.v1.FeatureFlagRouterExecutionConfig.subgraphs:type_name -> wg.cosmo.node.v1.Subgraph 18, // 3: wg.cosmo.node.v1.RouterConfig.engine_config:type_name -> wg.cosmo.node.v1.EngineConfiguration 8, // 4: wg.cosmo.node.v1.RouterConfig.subgraphs:type_name -> wg.cosmo.node.v1.Subgraph 9, // 5: wg.cosmo.node.v1.RouterConfig.feature_flag_configs:type_name -> wg.cosmo.node.v1.FeatureFlagRouterExecutionConfigs - 74, // 6: wg.cosmo.node.v1.Response.code:type_name -> wg.cosmo.common.EnumStatusCode + 75, // 6: wg.cosmo.node.v1.Response.code:type_name -> wg.cosmo.common.EnumStatusCode 15, // 7: wg.cosmo.node.v1.RegistrationInfo.account_limits:type_name -> wg.cosmo.node.v1.AccountLimits 12, // 8: wg.cosmo.node.v1.SelfRegisterResponse.response:type_name -> wg.cosmo.node.v1.Response 14, // 9: wg.cosmo.node.v1.SelfRegisterResponse.registrationInfo:type_name -> wg.cosmo.node.v1.RegistrationInfo 19, // 10: wg.cosmo.node.v1.EngineConfiguration.datasource_configurations:type_name -> wg.cosmo.node.v1.DataSourceConfiguration 23, // 11: wg.cosmo.node.v1.EngineConfiguration.field_configurations:type_name -> wg.cosmo.node.v1.FieldConfiguration 24, // 12: wg.cosmo.node.v1.EngineConfiguration.type_configurations:type_name -> wg.cosmo.node.v1.TypeConfiguration - 72, // 13: wg.cosmo.node.v1.EngineConfiguration.string_storage:type_name -> wg.cosmo.node.v1.EngineConfiguration.StringStorageEntry + 73, // 13: wg.cosmo.node.v1.EngineConfiguration.string_storage:type_name -> wg.cosmo.node.v1.EngineConfiguration.StringStorageEntry 2, // 14: wg.cosmo.node.v1.DataSourceConfiguration.kind:type_name -> wg.cosmo.node.v1.DataSourceKind 25, // 15: wg.cosmo.node.v1.DataSourceConfiguration.root_nodes:type_name -> wg.cosmo.node.v1.TypeField 25, // 16: wg.cosmo.node.v1.DataSourceConfiguration.child_nodes:type_name -> wg.cosmo.node.v1.TypeField 32, // 17: wg.cosmo.node.v1.DataSourceConfiguration.custom_graphql:type_name -> wg.cosmo.node.v1.DataSourceCustom_GraphQL - 53, // 18: wg.cosmo.node.v1.DataSourceConfiguration.custom_static:type_name -> wg.cosmo.node.v1.DataSourceCustom_Static - 55, // 19: wg.cosmo.node.v1.DataSourceConfiguration.directives:type_name -> wg.cosmo.node.v1.DirectiveConfiguration + 54, // 18: wg.cosmo.node.v1.DataSourceConfiguration.custom_static:type_name -> wg.cosmo.node.v1.DataSourceCustom_Static + 56, // 19: wg.cosmo.node.v1.DataSourceConfiguration.directives:type_name -> wg.cosmo.node.v1.DirectiveConfiguration 28, // 20: wg.cosmo.node.v1.DataSourceConfiguration.keys:type_name -> wg.cosmo.node.v1.RequiredField 28, // 21: wg.cosmo.node.v1.DataSourceConfiguration.provides:type_name -> wg.cosmo.node.v1.RequiredField 28, // 22: wg.cosmo.node.v1.DataSourceConfiguration.requires:type_name -> wg.cosmo.node.v1.RequiredField - 52, // 23: wg.cosmo.node.v1.DataSourceConfiguration.custom_events:type_name -> wg.cosmo.node.v1.DataSourceCustomEvents + 53, // 23: wg.cosmo.node.v1.DataSourceConfiguration.custom_events:type_name -> wg.cosmo.node.v1.DataSourceCustomEvents 29, // 24: wg.cosmo.node.v1.DataSourceConfiguration.entity_interfaces:type_name -> wg.cosmo.node.v1.EntityInterfaceConfiguration 29, // 25: wg.cosmo.node.v1.DataSourceConfiguration.interface_objects:type_name -> wg.cosmo.node.v1.EntityInterfaceConfiguration 1, // 26: wg.cosmo.node.v1.ArgumentConfiguration.source_type:type_name -> wg.cosmo.node.v1.ArgumentSource @@ -5433,73 +5534,75 @@ var file_wg_cosmo_node_v1_node_proto_depIdxs = []int32{ 21, // 28: wg.cosmo.node.v1.AuthorizationConfiguration.required_or_scopes_by_or:type_name -> wg.cosmo.node.v1.Scopes 20, // 29: wg.cosmo.node.v1.FieldConfiguration.arguments_configuration:type_name -> wg.cosmo.node.v1.ArgumentConfiguration 22, // 30: wg.cosmo.node.v1.FieldConfiguration.authorization_configuration:type_name -> wg.cosmo.node.v1.AuthorizationConfiguration - 64, // 31: wg.cosmo.node.v1.FieldConfiguration.subscription_filter_condition:type_name -> wg.cosmo.node.v1.SubscriptionFilterCondition + 65, // 31: wg.cosmo.node.v1.FieldConfiguration.subscription_filter_condition:type_name -> wg.cosmo.node.v1.SubscriptionFilterCondition 26, // 32: wg.cosmo.node.v1.FieldSetCondition.field_coordinates_path:type_name -> wg.cosmo.node.v1.FieldCoordinates 27, // 33: wg.cosmo.node.v1.RequiredField.conditions:type_name -> wg.cosmo.node.v1.FieldSetCondition - 54, // 34: wg.cosmo.node.v1.FetchConfiguration.url:type_name -> wg.cosmo.node.v1.ConfigurationVariable + 55, // 34: wg.cosmo.node.v1.FetchConfiguration.url:type_name -> wg.cosmo.node.v1.ConfigurationVariable 7, // 35: wg.cosmo.node.v1.FetchConfiguration.method:type_name -> wg.cosmo.node.v1.HTTPMethod - 73, // 36: wg.cosmo.node.v1.FetchConfiguration.header:type_name -> wg.cosmo.node.v1.FetchConfiguration.HeaderEntry - 54, // 37: wg.cosmo.node.v1.FetchConfiguration.body:type_name -> wg.cosmo.node.v1.ConfigurationVariable - 56, // 38: wg.cosmo.node.v1.FetchConfiguration.query:type_name -> wg.cosmo.node.v1.URLQueryConfiguration - 58, // 39: wg.cosmo.node.v1.FetchConfiguration.mtls:type_name -> wg.cosmo.node.v1.MTLSConfiguration - 54, // 40: wg.cosmo.node.v1.FetchConfiguration.base_url:type_name -> wg.cosmo.node.v1.ConfigurationVariable - 54, // 41: wg.cosmo.node.v1.FetchConfiguration.path:type_name -> wg.cosmo.node.v1.ConfigurationVariable - 54, // 42: wg.cosmo.node.v1.FetchConfiguration.http_proxy_url:type_name -> wg.cosmo.node.v1.ConfigurationVariable + 74, // 36: wg.cosmo.node.v1.FetchConfiguration.header:type_name -> wg.cosmo.node.v1.FetchConfiguration.HeaderEntry + 55, // 37: wg.cosmo.node.v1.FetchConfiguration.body:type_name -> wg.cosmo.node.v1.ConfigurationVariable + 57, // 38: wg.cosmo.node.v1.FetchConfiguration.query:type_name -> wg.cosmo.node.v1.URLQueryConfiguration + 59, // 39: wg.cosmo.node.v1.FetchConfiguration.mtls:type_name -> wg.cosmo.node.v1.MTLSConfiguration + 55, // 40: wg.cosmo.node.v1.FetchConfiguration.base_url:type_name -> wg.cosmo.node.v1.ConfigurationVariable + 55, // 41: wg.cosmo.node.v1.FetchConfiguration.path:type_name -> wg.cosmo.node.v1.ConfigurationVariable + 55, // 42: wg.cosmo.node.v1.FetchConfiguration.http_proxy_url:type_name -> wg.cosmo.node.v1.ConfigurationVariable 30, // 43: wg.cosmo.node.v1.DataSourceCustom_GraphQL.fetch:type_name -> wg.cosmo.node.v1.FetchConfiguration - 59, // 44: wg.cosmo.node.v1.DataSourceCustom_GraphQL.subscription:type_name -> wg.cosmo.node.v1.GraphQLSubscriptionConfiguration - 60, // 45: wg.cosmo.node.v1.DataSourceCustom_GraphQL.federation:type_name -> wg.cosmo.node.v1.GraphQLFederationConfiguration - 61, // 46: wg.cosmo.node.v1.DataSourceCustom_GraphQL.upstream_schema:type_name -> wg.cosmo.node.v1.InternedString - 62, // 47: wg.cosmo.node.v1.DataSourceCustom_GraphQL.custom_scalar_type_fields:type_name -> wg.cosmo.node.v1.SingleTypeField + 60, // 44: wg.cosmo.node.v1.DataSourceCustom_GraphQL.subscription:type_name -> wg.cosmo.node.v1.GraphQLSubscriptionConfiguration + 61, // 45: wg.cosmo.node.v1.DataSourceCustom_GraphQL.federation:type_name -> wg.cosmo.node.v1.GraphQLFederationConfiguration + 62, // 46: wg.cosmo.node.v1.DataSourceCustom_GraphQL.upstream_schema:type_name -> wg.cosmo.node.v1.InternedString + 63, // 47: wg.cosmo.node.v1.DataSourceCustom_GraphQL.custom_scalar_type_fields:type_name -> wg.cosmo.node.v1.SingleTypeField 33, // 48: wg.cosmo.node.v1.DataSourceCustom_GraphQL.grpc:type_name -> wg.cosmo.node.v1.GRPCConfiguration 37, // 49: wg.cosmo.node.v1.GRPCConfiguration.mapping:type_name -> wg.cosmo.node.v1.GRPCMapping 35, // 50: wg.cosmo.node.v1.GRPCConfiguration.plugin:type_name -> wg.cosmo.node.v1.PluginConfiguration 34, // 51: wg.cosmo.node.v1.PluginConfiguration.image_reference:type_name -> wg.cosmo.node.v1.ImageReference 40, // 52: wg.cosmo.node.v1.GRPCMapping.operation_mappings:type_name -> wg.cosmo.node.v1.OperationMapping 41, // 53: wg.cosmo.node.v1.GRPCMapping.entity_mappings:type_name -> wg.cosmo.node.v1.EntityMapping - 42, // 54: wg.cosmo.node.v1.GRPCMapping.type_field_mappings:type_name -> wg.cosmo.node.v1.TypeFieldMapping - 45, // 55: wg.cosmo.node.v1.GRPCMapping.enum_mappings:type_name -> wg.cosmo.node.v1.EnumMapping + 43, // 54: wg.cosmo.node.v1.GRPCMapping.type_field_mappings:type_name -> wg.cosmo.node.v1.TypeFieldMapping + 46, // 55: wg.cosmo.node.v1.GRPCMapping.enum_mappings:type_name -> wg.cosmo.node.v1.EnumMapping 38, // 56: wg.cosmo.node.v1.GRPCMapping.resolve_mappings:type_name -> wg.cosmo.node.v1.LookupMapping 3, // 57: wg.cosmo.node.v1.LookupMapping.type:type_name -> wg.cosmo.node.v1.LookupType 39, // 58: wg.cosmo.node.v1.LookupMapping.lookup_mapping:type_name -> wg.cosmo.node.v1.LookupFieldMapping - 43, // 59: wg.cosmo.node.v1.LookupFieldMapping.field_mapping:type_name -> wg.cosmo.node.v1.FieldMapping + 44, // 59: wg.cosmo.node.v1.LookupFieldMapping.field_mapping:type_name -> wg.cosmo.node.v1.FieldMapping 4, // 60: wg.cosmo.node.v1.OperationMapping.type:type_name -> wg.cosmo.node.v1.OperationType - 43, // 61: wg.cosmo.node.v1.TypeFieldMapping.field_mappings:type_name -> wg.cosmo.node.v1.FieldMapping - 44, // 62: wg.cosmo.node.v1.FieldMapping.argument_mappings:type_name -> wg.cosmo.node.v1.ArgumentMapping - 46, // 63: wg.cosmo.node.v1.EnumMapping.values:type_name -> wg.cosmo.node.v1.EnumValueMapping - 51, // 64: wg.cosmo.node.v1.NatsEventConfiguration.engine_event_configuration:type_name -> wg.cosmo.node.v1.EngineEventConfiguration - 47, // 65: wg.cosmo.node.v1.NatsEventConfiguration.stream_configuration:type_name -> wg.cosmo.node.v1.NatsStreamConfiguration - 51, // 66: wg.cosmo.node.v1.KafkaEventConfiguration.engine_event_configuration:type_name -> wg.cosmo.node.v1.EngineEventConfiguration - 51, // 67: wg.cosmo.node.v1.RedisEventConfiguration.engine_event_configuration:type_name -> wg.cosmo.node.v1.EngineEventConfiguration - 5, // 68: wg.cosmo.node.v1.EngineEventConfiguration.type:type_name -> wg.cosmo.node.v1.EventType - 48, // 69: wg.cosmo.node.v1.DataSourceCustomEvents.nats:type_name -> wg.cosmo.node.v1.NatsEventConfiguration - 49, // 70: wg.cosmo.node.v1.DataSourceCustomEvents.kafka:type_name -> wg.cosmo.node.v1.KafkaEventConfiguration - 50, // 71: wg.cosmo.node.v1.DataSourceCustomEvents.redis:type_name -> wg.cosmo.node.v1.RedisEventConfiguration - 54, // 72: wg.cosmo.node.v1.DataSourceCustom_Static.data:type_name -> wg.cosmo.node.v1.ConfigurationVariable - 6, // 73: wg.cosmo.node.v1.ConfigurationVariable.kind:type_name -> wg.cosmo.node.v1.ConfigurationVariableKind - 54, // 74: wg.cosmo.node.v1.HTTPHeader.values:type_name -> wg.cosmo.node.v1.ConfigurationVariable - 54, // 75: wg.cosmo.node.v1.MTLSConfiguration.key:type_name -> wg.cosmo.node.v1.ConfigurationVariable - 54, // 76: wg.cosmo.node.v1.MTLSConfiguration.cert:type_name -> wg.cosmo.node.v1.ConfigurationVariable - 54, // 77: wg.cosmo.node.v1.GraphQLSubscriptionConfiguration.url:type_name -> wg.cosmo.node.v1.ConfigurationVariable - 75, // 78: wg.cosmo.node.v1.GraphQLSubscriptionConfiguration.protocol:type_name -> wg.cosmo.common.GraphQLSubscriptionProtocol - 76, // 79: wg.cosmo.node.v1.GraphQLSubscriptionConfiguration.websocketSubprotocol:type_name -> wg.cosmo.common.GraphQLWebsocketSubprotocol - 64, // 80: wg.cosmo.node.v1.SubscriptionFilterCondition.and:type_name -> wg.cosmo.node.v1.SubscriptionFilterCondition - 63, // 81: wg.cosmo.node.v1.SubscriptionFilterCondition.in:type_name -> wg.cosmo.node.v1.SubscriptionFieldCondition - 64, // 82: wg.cosmo.node.v1.SubscriptionFilterCondition.not:type_name -> wg.cosmo.node.v1.SubscriptionFilterCondition - 64, // 83: wg.cosmo.node.v1.SubscriptionFilterCondition.or:type_name -> wg.cosmo.node.v1.SubscriptionFilterCondition - 66, // 84: wg.cosmo.node.v1.CacheWarmerOperations.operations:type_name -> wg.cosmo.node.v1.Operation - 67, // 85: wg.cosmo.node.v1.Operation.request:type_name -> wg.cosmo.node.v1.OperationRequest - 70, // 86: wg.cosmo.node.v1.Operation.client:type_name -> wg.cosmo.node.v1.ClientInfo - 68, // 87: wg.cosmo.node.v1.OperationRequest.extensions:type_name -> wg.cosmo.node.v1.Extension - 69, // 88: wg.cosmo.node.v1.Extension.persisted_query:type_name -> wg.cosmo.node.v1.PersistedQuery - 10, // 89: wg.cosmo.node.v1.FeatureFlagRouterExecutionConfigs.ConfigByFeatureFlagNameEntry.value:type_name -> wg.cosmo.node.v1.FeatureFlagRouterExecutionConfig - 57, // 90: wg.cosmo.node.v1.FetchConfiguration.HeaderEntry.value:type_name -> wg.cosmo.node.v1.HTTPHeader - 16, // 91: wg.cosmo.node.v1.NodeService.SelfRegister:input_type -> wg.cosmo.node.v1.SelfRegisterRequest - 17, // 92: wg.cosmo.node.v1.NodeService.SelfRegister:output_type -> wg.cosmo.node.v1.SelfRegisterResponse - 92, // [92:93] is the sub-list for method output_type - 91, // [91:92] is the sub-list for method input_type - 91, // [91:91] is the sub-list for extension type_name - 91, // [91:91] is the sub-list for extension extendee - 0, // [0:91] is the sub-list for field type_name + 42, // 61: wg.cosmo.node.v1.EntityMapping.required_field_mappings:type_name -> wg.cosmo.node.v1.RequiredFieldMapping + 44, // 62: wg.cosmo.node.v1.RequiredFieldMapping.field_mapping:type_name -> wg.cosmo.node.v1.FieldMapping + 44, // 63: wg.cosmo.node.v1.TypeFieldMapping.field_mappings:type_name -> wg.cosmo.node.v1.FieldMapping + 45, // 64: wg.cosmo.node.v1.FieldMapping.argument_mappings:type_name -> wg.cosmo.node.v1.ArgumentMapping + 47, // 65: wg.cosmo.node.v1.EnumMapping.values:type_name -> wg.cosmo.node.v1.EnumValueMapping + 52, // 66: wg.cosmo.node.v1.NatsEventConfiguration.engine_event_configuration:type_name -> wg.cosmo.node.v1.EngineEventConfiguration + 48, // 67: wg.cosmo.node.v1.NatsEventConfiguration.stream_configuration:type_name -> wg.cosmo.node.v1.NatsStreamConfiguration + 52, // 68: wg.cosmo.node.v1.KafkaEventConfiguration.engine_event_configuration:type_name -> wg.cosmo.node.v1.EngineEventConfiguration + 52, // 69: wg.cosmo.node.v1.RedisEventConfiguration.engine_event_configuration:type_name -> wg.cosmo.node.v1.EngineEventConfiguration + 5, // 70: wg.cosmo.node.v1.EngineEventConfiguration.type:type_name -> wg.cosmo.node.v1.EventType + 49, // 71: wg.cosmo.node.v1.DataSourceCustomEvents.nats:type_name -> wg.cosmo.node.v1.NatsEventConfiguration + 50, // 72: wg.cosmo.node.v1.DataSourceCustomEvents.kafka:type_name -> wg.cosmo.node.v1.KafkaEventConfiguration + 51, // 73: wg.cosmo.node.v1.DataSourceCustomEvents.redis:type_name -> wg.cosmo.node.v1.RedisEventConfiguration + 55, // 74: wg.cosmo.node.v1.DataSourceCustom_Static.data:type_name -> wg.cosmo.node.v1.ConfigurationVariable + 6, // 75: wg.cosmo.node.v1.ConfigurationVariable.kind:type_name -> wg.cosmo.node.v1.ConfigurationVariableKind + 55, // 76: wg.cosmo.node.v1.HTTPHeader.values:type_name -> wg.cosmo.node.v1.ConfigurationVariable + 55, // 77: wg.cosmo.node.v1.MTLSConfiguration.key:type_name -> wg.cosmo.node.v1.ConfigurationVariable + 55, // 78: wg.cosmo.node.v1.MTLSConfiguration.cert:type_name -> wg.cosmo.node.v1.ConfigurationVariable + 55, // 79: wg.cosmo.node.v1.GraphQLSubscriptionConfiguration.url:type_name -> wg.cosmo.node.v1.ConfigurationVariable + 76, // 80: wg.cosmo.node.v1.GraphQLSubscriptionConfiguration.protocol:type_name -> wg.cosmo.common.GraphQLSubscriptionProtocol + 77, // 81: wg.cosmo.node.v1.GraphQLSubscriptionConfiguration.websocketSubprotocol:type_name -> wg.cosmo.common.GraphQLWebsocketSubprotocol + 65, // 82: wg.cosmo.node.v1.SubscriptionFilterCondition.and:type_name -> wg.cosmo.node.v1.SubscriptionFilterCondition + 64, // 83: wg.cosmo.node.v1.SubscriptionFilterCondition.in:type_name -> wg.cosmo.node.v1.SubscriptionFieldCondition + 65, // 84: wg.cosmo.node.v1.SubscriptionFilterCondition.not:type_name -> wg.cosmo.node.v1.SubscriptionFilterCondition + 65, // 85: wg.cosmo.node.v1.SubscriptionFilterCondition.or:type_name -> wg.cosmo.node.v1.SubscriptionFilterCondition + 67, // 86: wg.cosmo.node.v1.CacheWarmerOperations.operations:type_name -> wg.cosmo.node.v1.Operation + 68, // 87: wg.cosmo.node.v1.Operation.request:type_name -> wg.cosmo.node.v1.OperationRequest + 71, // 88: wg.cosmo.node.v1.Operation.client:type_name -> wg.cosmo.node.v1.ClientInfo + 69, // 89: wg.cosmo.node.v1.OperationRequest.extensions:type_name -> wg.cosmo.node.v1.Extension + 70, // 90: wg.cosmo.node.v1.Extension.persisted_query:type_name -> wg.cosmo.node.v1.PersistedQuery + 10, // 91: wg.cosmo.node.v1.FeatureFlagRouterExecutionConfigs.ConfigByFeatureFlagNameEntry.value:type_name -> wg.cosmo.node.v1.FeatureFlagRouterExecutionConfig + 58, // 92: wg.cosmo.node.v1.FetchConfiguration.HeaderEntry.value:type_name -> wg.cosmo.node.v1.HTTPHeader + 16, // 93: wg.cosmo.node.v1.NodeService.SelfRegister:input_type -> wg.cosmo.node.v1.SelfRegisterRequest + 17, // 94: wg.cosmo.node.v1.NodeService.SelfRegister:output_type -> wg.cosmo.node.v1.SelfRegisterResponse + 94, // [94:95] is the sub-list for method output_type + 93, // [93:94] is the sub-list for method input_type + 93, // [93:93] is the sub-list for extension type_name + 93, // [93:93] is the sub-list for extension extendee + 0, // [0:93] is the sub-list for field type_name } func init() { file_wg_cosmo_node_v1_node_proto_init() } @@ -5917,7 +6020,7 @@ func file_wg_cosmo_node_v1_node_proto_init() { } } file_wg_cosmo_node_v1_node_proto_msgTypes[34].Exporter = func(v any, i int) any { - switch v := v.(*TypeFieldMapping); i { + switch v := v.(*RequiredFieldMapping); i { case 0: return &v.state case 1: @@ -5929,7 +6032,7 @@ func file_wg_cosmo_node_v1_node_proto_init() { } } file_wg_cosmo_node_v1_node_proto_msgTypes[35].Exporter = func(v any, i int) any { - switch v := v.(*FieldMapping); i { + switch v := v.(*TypeFieldMapping); i { case 0: return &v.state case 1: @@ -5941,7 +6044,7 @@ func file_wg_cosmo_node_v1_node_proto_init() { } } file_wg_cosmo_node_v1_node_proto_msgTypes[36].Exporter = func(v any, i int) any { - switch v := v.(*ArgumentMapping); i { + switch v := v.(*FieldMapping); i { case 0: return &v.state case 1: @@ -5953,7 +6056,7 @@ func file_wg_cosmo_node_v1_node_proto_init() { } } file_wg_cosmo_node_v1_node_proto_msgTypes[37].Exporter = func(v any, i int) any { - switch v := v.(*EnumMapping); i { + switch v := v.(*ArgumentMapping); i { case 0: return &v.state case 1: @@ -5965,7 +6068,7 @@ func file_wg_cosmo_node_v1_node_proto_init() { } } file_wg_cosmo_node_v1_node_proto_msgTypes[38].Exporter = func(v any, i int) any { - switch v := v.(*EnumValueMapping); i { + switch v := v.(*EnumMapping); i { case 0: return &v.state case 1: @@ -5977,7 +6080,7 @@ func file_wg_cosmo_node_v1_node_proto_init() { } } file_wg_cosmo_node_v1_node_proto_msgTypes[39].Exporter = func(v any, i int) any { - switch v := v.(*NatsStreamConfiguration); i { + switch v := v.(*EnumValueMapping); i { case 0: return &v.state case 1: @@ -5989,7 +6092,7 @@ func file_wg_cosmo_node_v1_node_proto_init() { } } file_wg_cosmo_node_v1_node_proto_msgTypes[40].Exporter = func(v any, i int) any { - switch v := v.(*NatsEventConfiguration); i { + switch v := v.(*NatsStreamConfiguration); i { case 0: return &v.state case 1: @@ -6001,7 +6104,7 @@ func file_wg_cosmo_node_v1_node_proto_init() { } } file_wg_cosmo_node_v1_node_proto_msgTypes[41].Exporter = func(v any, i int) any { - switch v := v.(*KafkaEventConfiguration); i { + switch v := v.(*NatsEventConfiguration); i { case 0: return &v.state case 1: @@ -6013,7 +6116,7 @@ func file_wg_cosmo_node_v1_node_proto_init() { } } file_wg_cosmo_node_v1_node_proto_msgTypes[42].Exporter = func(v any, i int) any { - switch v := v.(*RedisEventConfiguration); i { + switch v := v.(*KafkaEventConfiguration); i { case 0: return &v.state case 1: @@ -6025,7 +6128,7 @@ func file_wg_cosmo_node_v1_node_proto_init() { } } file_wg_cosmo_node_v1_node_proto_msgTypes[43].Exporter = func(v any, i int) any { - switch v := v.(*EngineEventConfiguration); i { + switch v := v.(*RedisEventConfiguration); i { case 0: return &v.state case 1: @@ -6037,7 +6140,7 @@ func file_wg_cosmo_node_v1_node_proto_init() { } } file_wg_cosmo_node_v1_node_proto_msgTypes[44].Exporter = func(v any, i int) any { - switch v := v.(*DataSourceCustomEvents); i { + switch v := v.(*EngineEventConfiguration); i { case 0: return &v.state case 1: @@ -6049,7 +6152,7 @@ func file_wg_cosmo_node_v1_node_proto_init() { } } file_wg_cosmo_node_v1_node_proto_msgTypes[45].Exporter = func(v any, i int) any { - switch v := v.(*DataSourceCustom_Static); i { + switch v := v.(*DataSourceCustomEvents); i { case 0: return &v.state case 1: @@ -6061,7 +6164,7 @@ func file_wg_cosmo_node_v1_node_proto_init() { } } file_wg_cosmo_node_v1_node_proto_msgTypes[46].Exporter = func(v any, i int) any { - switch v := v.(*ConfigurationVariable); i { + switch v := v.(*DataSourceCustom_Static); i { case 0: return &v.state case 1: @@ -6073,7 +6176,7 @@ func file_wg_cosmo_node_v1_node_proto_init() { } } file_wg_cosmo_node_v1_node_proto_msgTypes[47].Exporter = func(v any, i int) any { - switch v := v.(*DirectiveConfiguration); i { + switch v := v.(*ConfigurationVariable); i { case 0: return &v.state case 1: @@ -6085,7 +6188,7 @@ func file_wg_cosmo_node_v1_node_proto_init() { } } file_wg_cosmo_node_v1_node_proto_msgTypes[48].Exporter = func(v any, i int) any { - switch v := v.(*URLQueryConfiguration); i { + switch v := v.(*DirectiveConfiguration); i { case 0: return &v.state case 1: @@ -6097,7 +6200,7 @@ func file_wg_cosmo_node_v1_node_proto_init() { } } file_wg_cosmo_node_v1_node_proto_msgTypes[49].Exporter = func(v any, i int) any { - switch v := v.(*HTTPHeader); i { + switch v := v.(*URLQueryConfiguration); i { case 0: return &v.state case 1: @@ -6109,7 +6212,7 @@ func file_wg_cosmo_node_v1_node_proto_init() { } } file_wg_cosmo_node_v1_node_proto_msgTypes[50].Exporter = func(v any, i int) any { - switch v := v.(*MTLSConfiguration); i { + switch v := v.(*HTTPHeader); i { case 0: return &v.state case 1: @@ -6121,7 +6224,7 @@ func file_wg_cosmo_node_v1_node_proto_init() { } } file_wg_cosmo_node_v1_node_proto_msgTypes[51].Exporter = func(v any, i int) any { - switch v := v.(*GraphQLSubscriptionConfiguration); i { + switch v := v.(*MTLSConfiguration); i { case 0: return &v.state case 1: @@ -6133,7 +6236,7 @@ func file_wg_cosmo_node_v1_node_proto_init() { } } file_wg_cosmo_node_v1_node_proto_msgTypes[52].Exporter = func(v any, i int) any { - switch v := v.(*GraphQLFederationConfiguration); i { + switch v := v.(*GraphQLSubscriptionConfiguration); i { case 0: return &v.state case 1: @@ -6145,7 +6248,7 @@ func file_wg_cosmo_node_v1_node_proto_init() { } } file_wg_cosmo_node_v1_node_proto_msgTypes[53].Exporter = func(v any, i int) any { - switch v := v.(*InternedString); i { + switch v := v.(*GraphQLFederationConfiguration); i { case 0: return &v.state case 1: @@ -6157,7 +6260,7 @@ func file_wg_cosmo_node_v1_node_proto_init() { } } file_wg_cosmo_node_v1_node_proto_msgTypes[54].Exporter = func(v any, i int) any { - switch v := v.(*SingleTypeField); i { + switch v := v.(*InternedString); i { case 0: return &v.state case 1: @@ -6169,7 +6272,7 @@ func file_wg_cosmo_node_v1_node_proto_init() { } } file_wg_cosmo_node_v1_node_proto_msgTypes[55].Exporter = func(v any, i int) any { - switch v := v.(*SubscriptionFieldCondition); i { + switch v := v.(*SingleTypeField); i { case 0: return &v.state case 1: @@ -6181,7 +6284,7 @@ func file_wg_cosmo_node_v1_node_proto_init() { } } file_wg_cosmo_node_v1_node_proto_msgTypes[56].Exporter = func(v any, i int) any { - switch v := v.(*SubscriptionFilterCondition); i { + switch v := v.(*SubscriptionFieldCondition); i { case 0: return &v.state case 1: @@ -6193,7 +6296,7 @@ func file_wg_cosmo_node_v1_node_proto_init() { } } file_wg_cosmo_node_v1_node_proto_msgTypes[57].Exporter = func(v any, i int) any { - switch v := v.(*CacheWarmerOperations); i { + switch v := v.(*SubscriptionFilterCondition); i { case 0: return &v.state case 1: @@ -6205,7 +6308,7 @@ func file_wg_cosmo_node_v1_node_proto_init() { } } file_wg_cosmo_node_v1_node_proto_msgTypes[58].Exporter = func(v any, i int) any { - switch v := v.(*Operation); i { + switch v := v.(*CacheWarmerOperations); i { case 0: return &v.state case 1: @@ -6217,7 +6320,7 @@ func file_wg_cosmo_node_v1_node_proto_init() { } } file_wg_cosmo_node_v1_node_proto_msgTypes[59].Exporter = func(v any, i int) any { - switch v := v.(*OperationRequest); i { + switch v := v.(*Operation); i { case 0: return &v.state case 1: @@ -6229,7 +6332,7 @@ func file_wg_cosmo_node_v1_node_proto_init() { } } file_wg_cosmo_node_v1_node_proto_msgTypes[60].Exporter = func(v any, i int) any { - switch v := v.(*Extension); i { + switch v := v.(*OperationRequest); i { case 0: return &v.state case 1: @@ -6241,7 +6344,7 @@ func file_wg_cosmo_node_v1_node_proto_init() { } } file_wg_cosmo_node_v1_node_proto_msgTypes[61].Exporter = func(v any, i int) any { - switch v := v.(*PersistedQuery); i { + switch v := v.(*Extension); i { case 0: return &v.state case 1: @@ -6253,6 +6356,18 @@ func file_wg_cosmo_node_v1_node_proto_init() { } } file_wg_cosmo_node_v1_node_proto_msgTypes[62].Exporter = func(v any, i int) any { + switch v := v.(*PersistedQuery); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_wg_cosmo_node_v1_node_proto_msgTypes[63].Exporter = func(v any, i int) any { switch v := v.(*ClientInfo); i { case 0: return &v.state @@ -6272,15 +6387,15 @@ func file_wg_cosmo_node_v1_node_proto_init() { file_wg_cosmo_node_v1_node_proto_msgTypes[15].OneofWrappers = []any{} file_wg_cosmo_node_v1_node_proto_msgTypes[22].OneofWrappers = []any{} file_wg_cosmo_node_v1_node_proto_msgTypes[27].OneofWrappers = []any{} - file_wg_cosmo_node_v1_node_proto_msgTypes[51].OneofWrappers = []any{} - file_wg_cosmo_node_v1_node_proto_msgTypes[56].OneofWrappers = []any{} + file_wg_cosmo_node_v1_node_proto_msgTypes[52].OneofWrappers = []any{} + file_wg_cosmo_node_v1_node_proto_msgTypes[57].OneofWrappers = []any{} type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_wg_cosmo_node_v1_node_proto_rawDesc, NumEnums: 8, - NumMessages: 66, + NumMessages: 67, NumExtensions: 0, NumServices: 1, },