From 9328c4f6577a7f8e3183aa0a6c535823a3118d28 Mon Sep 17 00:00:00 2001 From: Joseph Doherty Date: Thu, 21 May 2026 16:45:47 -0400 Subject: [PATCH] Point the Go client at the StreamAlarms alarm feed Regenerate the Go protobuf stubs and replace the session-scoped QueryActiveAlarms surface with the session-less StreamAlarms feed: snapshot-then-live AlarmFeedMessage fan-out served by the gateway's central alarm monitor. Drops session_id from the acknowledge surface. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../generated/galaxy_repository.pb.go | 38 +- .../internal/generated/mxaccess_gateway.pb.go | 500 +++++++++++------- .../generated/mxaccess_gateway_grpc.pb.go | 50 +- clients/go/mxgateway/alarms.go | 18 +- clients/go/mxgateway/alarms_test.go | 59 +-- clients/go/mxgateway/types.go | 15 +- 6 files changed, 411 insertions(+), 269 deletions(-) diff --git a/clients/go/internal/generated/galaxy_repository.pb.go b/clients/go/internal/generated/galaxy_repository.pb.go index ca3370c..af187d7 100644 --- a/clients/go/internal/generated/galaxy_repository.pb.go +++ b/clients/go/internal/generated/galaxy_repository.pb.go @@ -687,18 +687,32 @@ func (x *GalaxyObject) GetAttributes() []*GalaxyAttribute { } type GalaxyAttribute struct { - state protoimpl.MessageState `protogen:"open.v1"` - AttributeName string `protobuf:"bytes,1,opt,name=attribute_name,json=attributeName,proto3" json:"attribute_name,omitempty"` - FullTagReference string `protobuf:"bytes,2,opt,name=full_tag_reference,json=fullTagReference,proto3" json:"full_tag_reference,omitempty"` - MxDataType int32 `protobuf:"varint,3,opt,name=mx_data_type,json=mxDataType,proto3" json:"mx_data_type,omitempty"` - DataTypeName string `protobuf:"bytes,4,opt,name=data_type_name,json=dataTypeName,proto3" json:"data_type_name,omitempty"` - IsArray bool `protobuf:"varint,5,opt,name=is_array,json=isArray,proto3" json:"is_array,omitempty"` - ArrayDimension int32 `protobuf:"varint,6,opt,name=array_dimension,json=arrayDimension,proto3" json:"array_dimension,omitempty"` - ArrayDimensionPresent bool `protobuf:"varint,7,opt,name=array_dimension_present,json=arrayDimensionPresent,proto3" json:"array_dimension_present,omitempty"` - MxAttributeCategory int32 `protobuf:"varint,8,opt,name=mx_attribute_category,json=mxAttributeCategory,proto3" json:"mx_attribute_category,omitempty"` - SecurityClassification int32 `protobuf:"varint,9,opt,name=security_classification,json=securityClassification,proto3" json:"security_classification,omitempty"` - IsHistorized bool `protobuf:"varint,10,opt,name=is_historized,json=isHistorized,proto3" json:"is_historized,omitempty"` - IsAlarm bool `protobuf:"varint,11,opt,name=is_alarm,json=isAlarm,proto3" json:"is_alarm,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + AttributeName string `protobuf:"bytes,1,opt,name=attribute_name,json=attributeName,proto3" json:"attribute_name,omitempty"` + FullTagReference string `protobuf:"bytes,2,opt,name=full_tag_reference,json=fullTagReference,proto3" json:"full_tag_reference,omitempty"` + // Raw Galaxy SQL `dbo.data_type` identifier, passed through unchanged. + // This is NOT a member of `mxaccess_gateway.v1.MxDataType` — Galaxy's + // type enumeration is distinct from MXAccess's wire data-type enum and + // the two must not be cast or compared. The GalaxyRepository service is + // metadata-only and deliberately does not share types with + // mxaccess_gateway.proto. See docs/GalaxyRepository.md. + MxDataType int32 `protobuf:"varint,3,opt,name=mx_data_type,json=mxDataType,proto3" json:"mx_data_type,omitempty"` + // Human-readable name from Galaxy's `dbo.data_type` table (e.g. "Float", + // "Integer", "Boolean"). Free-form Galaxy text; not a stable enum. + DataTypeName string `protobuf:"bytes,4,opt,name=data_type_name,json=dataTypeName,proto3" json:"data_type_name,omitempty"` + IsArray bool `protobuf:"varint,5,opt,name=is_array,json=isArray,proto3" json:"is_array,omitempty"` + ArrayDimension int32 `protobuf:"varint,6,opt,name=array_dimension,json=arrayDimension,proto3" json:"array_dimension,omitempty"` + ArrayDimensionPresent bool `protobuf:"varint,7,opt,name=array_dimension_present,json=arrayDimensionPresent,proto3" json:"array_dimension_present,omitempty"` + // Raw Galaxy SQL attribute-category identifier, passed through unchanged. + // Galaxy-specific; not mapped to any gateway enum. See + // docs/GalaxyRepository.md. + MxAttributeCategory int32 `protobuf:"varint,8,opt,name=mx_attribute_category,json=mxAttributeCategory,proto3" json:"mx_attribute_category,omitempty"` + // Raw Galaxy SQL security-classification identifier, passed through + // unchanged. Galaxy-specific; not mapped to any gateway enum. See + // docs/GalaxyRepository.md. + SecurityClassification int32 `protobuf:"varint,9,opt,name=security_classification,json=securityClassification,proto3" json:"security_classification,omitempty"` + IsHistorized bool `protobuf:"varint,10,opt,name=is_historized,json=isHistorized,proto3" json:"is_historized,omitempty"` + IsAlarm bool `protobuf:"varint,11,opt,name=is_alarm,json=isAlarm,proto3" json:"is_alarm,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } diff --git a/clients/go/internal/generated/mxaccess_gateway.pb.go b/clients/go/internal/generated/mxaccess_gateway.pb.go index ca5bb70..5468c1a 100644 --- a/clients/go/internal/generated/mxaccess_gateway.pb.go +++ b/clients/go/internal/generated/mxaccess_gateway.pb.go @@ -3792,9 +3792,11 @@ type WriteSecuredBulkEntry struct { ItemHandle int32 `protobuf:"varint,1,opt,name=item_handle,json=itemHandle,proto3" json:"item_handle,omitempty"` CurrentUserId int32 `protobuf:"varint,2,opt,name=current_user_id,json=currentUserId,proto3" json:"current_user_id,omitempty"` VerifierUserId int32 `protobuf:"varint,3,opt,name=verifier_user_id,json=verifierUserId,proto3" json:"verifier_user_id,omitempty"` - Value *MxValue `protobuf:"bytes,4,opt,name=value,proto3" json:"value,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + // Credential-sensitive write value. Implementations must not log this field + // unless an explicit redacted value-logging path is enabled. + Value *MxValue `protobuf:"bytes,4,opt,name=value,proto3" json:"value,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *WriteSecuredBulkEntry) Reset() { @@ -3914,8 +3916,10 @@ type WriteSecured2BulkEntry struct { ItemHandle int32 `protobuf:"varint,1,opt,name=item_handle,json=itemHandle,proto3" json:"item_handle,omitempty"` CurrentUserId int32 `protobuf:"varint,2,opt,name=current_user_id,json=currentUserId,proto3" json:"current_user_id,omitempty"` VerifierUserId int32 `protobuf:"varint,3,opt,name=verifier_user_id,json=verifierUserId,proto3" json:"verifier_user_id,omitempty"` - Value *MxValue `protobuf:"bytes,4,opt,name=value,proto3" json:"value,omitempty"` - TimestampValue *MxValue `protobuf:"bytes,5,opt,name=timestamp_value,json=timestampValue,proto3" json:"timestamp_value,omitempty"` + // Credential-sensitive write value. Implementations must not log this field + // unless an explicit redacted value-logging path is enabled. + Value *MxValue `protobuf:"bytes,4,opt,name=value,proto3" json:"value,omitempty"` + TimestampValue *MxValue `protobuf:"bytes,5,opt,name=timestamp_value,json=timestampValue,proto3" json:"timestamp_value,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } @@ -3987,6 +3991,7 @@ func (x *WriteSecured2BulkEntry) GetTimestampValue() *MxValue { // Bulk Read — snapshot the current value for each requested tag. MXAccess COM // has no synchronous Read; the worker implements ReadBulk as: +// // - If the tag is already in the session's item registry AND that item is // currently advised AND the worker has a cached OnDataChange for it, the // reply returns the cached value WITHOUT modifying the existing @@ -5245,9 +5250,11 @@ func (x *BulkSubscribeReply) GetResults() []*SubscribeResult { // Per-item result for the four bulk write families. `item_handle` mirrors the // request entry's item_handle so callers can correlate inputs to outputs even -// when the gateway's tag-allowlist filter dropped some entries before reaching -// the worker. Per-item failures populate `error_message` + `hresult` and never -// raise — callers iterate and inspect each entry. +// when the gateway's per-entry `IConstraintEnforcer.CheckWriteHandleAsync` +// filter (see `MxAccessGatewayService.ReplaceWriteBulkEntries` and +// `docs/Authorization.md`) dropped some entries before reaching the worker. +// Per-item failures populate `error_message` + `hresult` and never raise — +// callers iterate and inspect each entry. type BulkWriteResult struct { state protoimpl.MessageState `protogen:"open.v1"` ServerHandle int32 `protobuf:"varint,1,opt,name=server_handle,json=serverHandle,proto3" json:"server_handle,omitempty"` @@ -5380,6 +5387,20 @@ func (x *BulkWriteReply) GetResults() []*BulkWriteResult { // an existing live subscription's last OnDataChange (the worker did not touch // the subscription); false when the worker took the AddItem + Advise + wait + // UnAdvise + RemoveItem snapshot lifecycle itself. +// +// On `was_successful = true`, `value`, `quality`, `source_timestamp`, and +// `statuses` carry the read data (from the cached subscription or the snapshot +// lifecycle, depending on `was_cached`) and `error_message` is empty. On +// `was_successful = false`, only `server_handle`, `tag_address`, `item_handle` +// (when allocated), `was_cached`, and `error_message` are populated; `value`, +// `quality`, `source_timestamp`, and `statuses` are left at their proto3 +// defaults (null / 0 / null / empty) and must not be read as data — they are +// wire-indistinguishable from "value is null with quality bad" data and serve +// only as absent markers. ReadBulk has no `hresult` field by design (its +// outcomes are timeout / cache / lifecycle states, not MXAccess COM return +// codes — see `docs/DesignDecisions.md` "Bulk Command Family"). Per-tag +// failures populate `error_message` and never raise — callers iterate and +// inspect each entry. type BulkReadResult struct { state protoimpl.MessageState `protogen:"open.v1"` ServerHandle int32 `protobuf:"varint,1,opt,name=server_handle,json=serverHandle,proto3" json:"server_handle,omitempty"` @@ -6528,7 +6549,6 @@ func (x *ActiveAlarmSnapshot) GetLimitValue() *MxValue { type AcknowledgeAlarmRequest struct { state protoimpl.MessageState `protogen:"open.v1"` - SessionId string `protobuf:"bytes,1,opt,name=session_id,json=sessionId,proto3" json:"session_id,omitempty"` ClientCorrelationId string `protobuf:"bytes,2,opt,name=client_correlation_id,json=clientCorrelationId,proto3" json:"client_correlation_id,omitempty"` // Fully-qualified alarm reference matching OnAlarmTransitionEvent.alarm_full_reference. AlarmFullReference string `protobuf:"bytes,3,opt,name=alarm_full_reference,json=alarmFullReference,proto3" json:"alarm_full_reference,omitempty"` @@ -6571,13 +6591,6 @@ func (*AcknowledgeAlarmRequest) Descriptor() ([]byte, []int) { return file_mxaccess_gateway_proto_rawDescGZIP(), []int{77} } -func (x *AcknowledgeAlarmRequest) GetSessionId() string { - if x != nil { - return x.SessionId - } - return "" -} - func (x *AcknowledgeAlarmRequest) GetClientCorrelationId() string { if x != nil { return x.ClientCorrelationId @@ -6608,7 +6621,6 @@ func (x *AcknowledgeAlarmRequest) GetOperatorUser() string { type AcknowledgeAlarmReply struct { state protoimpl.MessageState `protogen:"open.v1"` - SessionId string `protobuf:"bytes,1,opt,name=session_id,json=sessionId,proto3" json:"session_id,omitempty"` CorrelationId string `protobuf:"bytes,2,opt,name=correlation_id,json=correlationId,proto3" json:"correlation_id,omitempty"` ProtocolStatus *ProtocolStatus `protobuf:"bytes,3,opt,name=protocol_status,json=protocolStatus,proto3" json:"protocol_status,omitempty"` // Native ack return code echoed from the worker. The worker carries the @@ -6659,13 +6671,6 @@ func (*AcknowledgeAlarmReply) Descriptor() ([]byte, []int) { return file_mxaccess_gateway_proto_rawDescGZIP(), []int{78} } -func (x *AcknowledgeAlarmReply) GetSessionId() string { - if x != nil { - return x.SessionId - } - return "" -} - func (x *AcknowledgeAlarmReply) GetCorrelationId() string { if x != nil { return x.CorrelationId @@ -6701,31 +6706,31 @@ func (x *AcknowledgeAlarmReply) GetDiagnosticMessage() string { return "" } -type QueryActiveAlarmsRequest struct { +// Request to attach to the gateway's central alarm feed (StreamAlarms). +type StreamAlarmsRequest struct { state protoimpl.MessageState `protogen:"open.v1"` - SessionId string `protobuf:"bytes,1,opt,name=session_id,json=sessionId,proto3" json:"session_id,omitempty"` - ClientCorrelationId string `protobuf:"bytes,2,opt,name=client_correlation_id,json=clientCorrelationId,proto3" json:"client_correlation_id,omitempty"` - // Optional alarm-reference prefix used to scope a partial ConditionRefresh - // (e.g. equipment sub-tree). Empty means full refresh. - AlarmFilterPrefix string `protobuf:"bytes,3,opt,name=alarm_filter_prefix,json=alarmFilterPrefix,proto3" json:"alarm_filter_prefix,omitempty"` + ClientCorrelationId string `protobuf:"bytes,1,opt,name=client_correlation_id,json=clientCorrelationId,proto3" json:"client_correlation_id,omitempty"` + // Optional alarm-reference prefix scoping the feed to an equipment + // sub-tree. Empty streams every active alarm. + AlarmFilterPrefix string `protobuf:"bytes,2,opt,name=alarm_filter_prefix,json=alarmFilterPrefix,proto3" json:"alarm_filter_prefix,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } -func (x *QueryActiveAlarmsRequest) Reset() { - *x = QueryActiveAlarmsRequest{} +func (x *StreamAlarmsRequest) Reset() { + *x = StreamAlarmsRequest{} mi := &file_mxaccess_gateway_proto_msgTypes[79] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *QueryActiveAlarmsRequest) String() string { +func (x *StreamAlarmsRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*QueryActiveAlarmsRequest) ProtoMessage() {} +func (*StreamAlarmsRequest) ProtoMessage() {} -func (x *QueryActiveAlarmsRequest) ProtoReflect() protoreflect.Message { +func (x *StreamAlarmsRequest) ProtoReflect() protoreflect.Message { mi := &file_mxaccess_gateway_proto_msgTypes[79] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -6737,32 +6742,130 @@ func (x *QueryActiveAlarmsRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use QueryActiveAlarmsRequest.ProtoReflect.Descriptor instead. -func (*QueryActiveAlarmsRequest) Descriptor() ([]byte, []int) { +// Deprecated: Use StreamAlarmsRequest.ProtoReflect.Descriptor instead. +func (*StreamAlarmsRequest) Descriptor() ([]byte, []int) { return file_mxaccess_gateway_proto_rawDescGZIP(), []int{79} } -func (x *QueryActiveAlarmsRequest) GetSessionId() string { - if x != nil { - return x.SessionId - } - return "" -} - -func (x *QueryActiveAlarmsRequest) GetClientCorrelationId() string { +func (x *StreamAlarmsRequest) GetClientCorrelationId() string { if x != nil { return x.ClientCorrelationId } return "" } -func (x *QueryActiveAlarmsRequest) GetAlarmFilterPrefix() string { +func (x *StreamAlarmsRequest) GetAlarmFilterPrefix() string { if x != nil { return x.AlarmFilterPrefix } return "" } +// One message on the StreamAlarms feed. The stream opens with one +// `active_alarm` per currently-active alarm, then a single +// `snapshot_complete`, then a `transition` for every subsequent change. +type AlarmFeedMessage struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Types that are valid to be assigned to Payload: + // + // *AlarmFeedMessage_ActiveAlarm + // *AlarmFeedMessage_SnapshotComplete + // *AlarmFeedMessage_Transition + Payload isAlarmFeedMessage_Payload `protobuf_oneof:"payload"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *AlarmFeedMessage) Reset() { + *x = AlarmFeedMessage{} + mi := &file_mxaccess_gateway_proto_msgTypes[80] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *AlarmFeedMessage) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AlarmFeedMessage) ProtoMessage() {} + +func (x *AlarmFeedMessage) ProtoReflect() protoreflect.Message { + mi := &file_mxaccess_gateway_proto_msgTypes[80] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AlarmFeedMessage.ProtoReflect.Descriptor instead. +func (*AlarmFeedMessage) Descriptor() ([]byte, []int) { + return file_mxaccess_gateway_proto_rawDescGZIP(), []int{80} +} + +func (x *AlarmFeedMessage) GetPayload() isAlarmFeedMessage_Payload { + if x != nil { + return x.Payload + } + return nil +} + +func (x *AlarmFeedMessage) GetActiveAlarm() *ActiveAlarmSnapshot { + if x != nil { + if x, ok := x.Payload.(*AlarmFeedMessage_ActiveAlarm); ok { + return x.ActiveAlarm + } + } + return nil +} + +func (x *AlarmFeedMessage) GetSnapshotComplete() bool { + if x != nil { + if x, ok := x.Payload.(*AlarmFeedMessage_SnapshotComplete); ok { + return x.SnapshotComplete + } + } + return false +} + +func (x *AlarmFeedMessage) GetTransition() *OnAlarmTransitionEvent { + if x != nil { + if x, ok := x.Payload.(*AlarmFeedMessage_Transition); ok { + return x.Transition + } + } + return nil +} + +type isAlarmFeedMessage_Payload interface { + isAlarmFeedMessage_Payload() +} + +type AlarmFeedMessage_ActiveAlarm struct { + // Part of the initial active-alarm snapshot (ConditionRefresh). + ActiveAlarm *ActiveAlarmSnapshot `protobuf:"bytes,1,opt,name=active_alarm,json=activeAlarm,proto3,oneof"` +} + +type AlarmFeedMessage_SnapshotComplete struct { + // Sentinel: the initial snapshot is fully delivered and `transition` + // messages follow. Always true when present. + SnapshotComplete bool `protobuf:"varint,2,opt,name=snapshot_complete,json=snapshotComplete,proto3,oneof"` +} + +type AlarmFeedMessage_Transition struct { + // A live alarm state change (raise / acknowledge / clear). + Transition *OnAlarmTransitionEvent `protobuf:"bytes,3,opt,name=transition,proto3,oneof"` +} + +func (*AlarmFeedMessage_ActiveAlarm) isAlarmFeedMessage_Payload() {} + +func (*AlarmFeedMessage_SnapshotComplete) isAlarmFeedMessage_Payload() {} + +func (*AlarmFeedMessage_Transition) isAlarmFeedMessage_Payload() {} + type MxStatusProxy struct { state protoimpl.MessageState `protogen:"open.v1"` // Mirrors the `success` member of the MXAccess MXSTATUS_PROXY struct @@ -6787,7 +6890,7 @@ type MxStatusProxy struct { func (x *MxStatusProxy) Reset() { *x = MxStatusProxy{} - mi := &file_mxaccess_gateway_proto_msgTypes[80] + mi := &file_mxaccess_gateway_proto_msgTypes[81] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6799,7 +6902,7 @@ func (x *MxStatusProxy) String() string { func (*MxStatusProxy) ProtoMessage() {} func (x *MxStatusProxy) ProtoReflect() protoreflect.Message { - mi := &file_mxaccess_gateway_proto_msgTypes[80] + mi := &file_mxaccess_gateway_proto_msgTypes[81] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6812,7 +6915,7 @@ func (x *MxStatusProxy) ProtoReflect() protoreflect.Message { // Deprecated: Use MxStatusProxy.ProtoReflect.Descriptor instead. func (*MxStatusProxy) Descriptor() ([]byte, []int) { - return file_mxaccess_gateway_proto_rawDescGZIP(), []int{80} + return file_mxaccess_gateway_proto_rawDescGZIP(), []int{81} } func (x *MxStatusProxy) GetSuccess() int32 { @@ -6889,7 +6992,7 @@ type MxValue struct { func (x *MxValue) Reset() { *x = MxValue{} - mi := &file_mxaccess_gateway_proto_msgTypes[81] + mi := &file_mxaccess_gateway_proto_msgTypes[82] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6901,7 +7004,7 @@ func (x *MxValue) String() string { func (*MxValue) ProtoMessage() {} func (x *MxValue) ProtoReflect() protoreflect.Message { - mi := &file_mxaccess_gateway_proto_msgTypes[81] + mi := &file_mxaccess_gateway_proto_msgTypes[82] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6914,7 +7017,7 @@ func (x *MxValue) ProtoReflect() protoreflect.Message { // Deprecated: Use MxValue.ProtoReflect.Descriptor instead. func (*MxValue) Descriptor() ([]byte, []int) { - return file_mxaccess_gateway_proto_rawDescGZIP(), []int{81} + return file_mxaccess_gateway_proto_rawDescGZIP(), []int{82} } func (x *MxValue) GetDataType() MxDataType { @@ -7122,7 +7225,7 @@ type MxArray struct { func (x *MxArray) Reset() { *x = MxArray{} - mi := &file_mxaccess_gateway_proto_msgTypes[82] + mi := &file_mxaccess_gateway_proto_msgTypes[83] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7134,7 +7237,7 @@ func (x *MxArray) String() string { func (*MxArray) ProtoMessage() {} func (x *MxArray) ProtoReflect() protoreflect.Message { - mi := &file_mxaccess_gateway_proto_msgTypes[82] + mi := &file_mxaccess_gateway_proto_msgTypes[83] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7147,7 +7250,7 @@ func (x *MxArray) ProtoReflect() protoreflect.Message { // Deprecated: Use MxArray.ProtoReflect.Descriptor instead. func (*MxArray) Descriptor() ([]byte, []int) { - return file_mxaccess_gateway_proto_rawDescGZIP(), []int{82} + return file_mxaccess_gateway_proto_rawDescGZIP(), []int{83} } func (x *MxArray) GetElementDataType() MxDataType { @@ -7325,7 +7428,7 @@ type BoolArray struct { func (x *BoolArray) Reset() { *x = BoolArray{} - mi := &file_mxaccess_gateway_proto_msgTypes[83] + mi := &file_mxaccess_gateway_proto_msgTypes[84] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7337,7 +7440,7 @@ func (x *BoolArray) String() string { func (*BoolArray) ProtoMessage() {} func (x *BoolArray) ProtoReflect() protoreflect.Message { - mi := &file_mxaccess_gateway_proto_msgTypes[83] + mi := &file_mxaccess_gateway_proto_msgTypes[84] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7350,7 +7453,7 @@ func (x *BoolArray) ProtoReflect() protoreflect.Message { // Deprecated: Use BoolArray.ProtoReflect.Descriptor instead. func (*BoolArray) Descriptor() ([]byte, []int) { - return file_mxaccess_gateway_proto_rawDescGZIP(), []int{83} + return file_mxaccess_gateway_proto_rawDescGZIP(), []int{84} } func (x *BoolArray) GetValues() []bool { @@ -7369,7 +7472,7 @@ type Int32Array struct { func (x *Int32Array) Reset() { *x = Int32Array{} - mi := &file_mxaccess_gateway_proto_msgTypes[84] + mi := &file_mxaccess_gateway_proto_msgTypes[85] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7381,7 +7484,7 @@ func (x *Int32Array) String() string { func (*Int32Array) ProtoMessage() {} func (x *Int32Array) ProtoReflect() protoreflect.Message { - mi := &file_mxaccess_gateway_proto_msgTypes[84] + mi := &file_mxaccess_gateway_proto_msgTypes[85] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7394,7 +7497,7 @@ func (x *Int32Array) ProtoReflect() protoreflect.Message { // Deprecated: Use Int32Array.ProtoReflect.Descriptor instead. func (*Int32Array) Descriptor() ([]byte, []int) { - return file_mxaccess_gateway_proto_rawDescGZIP(), []int{84} + return file_mxaccess_gateway_proto_rawDescGZIP(), []int{85} } func (x *Int32Array) GetValues() []int32 { @@ -7413,7 +7516,7 @@ type Int64Array struct { func (x *Int64Array) Reset() { *x = Int64Array{} - mi := &file_mxaccess_gateway_proto_msgTypes[85] + mi := &file_mxaccess_gateway_proto_msgTypes[86] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7425,7 +7528,7 @@ func (x *Int64Array) String() string { func (*Int64Array) ProtoMessage() {} func (x *Int64Array) ProtoReflect() protoreflect.Message { - mi := &file_mxaccess_gateway_proto_msgTypes[85] + mi := &file_mxaccess_gateway_proto_msgTypes[86] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7438,7 +7541,7 @@ func (x *Int64Array) ProtoReflect() protoreflect.Message { // Deprecated: Use Int64Array.ProtoReflect.Descriptor instead. func (*Int64Array) Descriptor() ([]byte, []int) { - return file_mxaccess_gateway_proto_rawDescGZIP(), []int{85} + return file_mxaccess_gateway_proto_rawDescGZIP(), []int{86} } func (x *Int64Array) GetValues() []int64 { @@ -7457,7 +7560,7 @@ type FloatArray struct { func (x *FloatArray) Reset() { *x = FloatArray{} - mi := &file_mxaccess_gateway_proto_msgTypes[86] + mi := &file_mxaccess_gateway_proto_msgTypes[87] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7469,7 +7572,7 @@ func (x *FloatArray) String() string { func (*FloatArray) ProtoMessage() {} func (x *FloatArray) ProtoReflect() protoreflect.Message { - mi := &file_mxaccess_gateway_proto_msgTypes[86] + mi := &file_mxaccess_gateway_proto_msgTypes[87] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7482,7 +7585,7 @@ func (x *FloatArray) ProtoReflect() protoreflect.Message { // Deprecated: Use FloatArray.ProtoReflect.Descriptor instead. func (*FloatArray) Descriptor() ([]byte, []int) { - return file_mxaccess_gateway_proto_rawDescGZIP(), []int{86} + return file_mxaccess_gateway_proto_rawDescGZIP(), []int{87} } func (x *FloatArray) GetValues() []float32 { @@ -7501,7 +7604,7 @@ type DoubleArray struct { func (x *DoubleArray) Reset() { *x = DoubleArray{} - mi := &file_mxaccess_gateway_proto_msgTypes[87] + mi := &file_mxaccess_gateway_proto_msgTypes[88] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7513,7 +7616,7 @@ func (x *DoubleArray) String() string { func (*DoubleArray) ProtoMessage() {} func (x *DoubleArray) ProtoReflect() protoreflect.Message { - mi := &file_mxaccess_gateway_proto_msgTypes[87] + mi := &file_mxaccess_gateway_proto_msgTypes[88] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7526,7 +7629,7 @@ func (x *DoubleArray) ProtoReflect() protoreflect.Message { // Deprecated: Use DoubleArray.ProtoReflect.Descriptor instead. func (*DoubleArray) Descriptor() ([]byte, []int) { - return file_mxaccess_gateway_proto_rawDescGZIP(), []int{87} + return file_mxaccess_gateway_proto_rawDescGZIP(), []int{88} } func (x *DoubleArray) GetValues() []float64 { @@ -7545,7 +7648,7 @@ type StringArray struct { func (x *StringArray) Reset() { *x = StringArray{} - mi := &file_mxaccess_gateway_proto_msgTypes[88] + mi := &file_mxaccess_gateway_proto_msgTypes[89] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7557,7 +7660,7 @@ func (x *StringArray) String() string { func (*StringArray) ProtoMessage() {} func (x *StringArray) ProtoReflect() protoreflect.Message { - mi := &file_mxaccess_gateway_proto_msgTypes[88] + mi := &file_mxaccess_gateway_proto_msgTypes[89] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7570,7 +7673,7 @@ func (x *StringArray) ProtoReflect() protoreflect.Message { // Deprecated: Use StringArray.ProtoReflect.Descriptor instead. func (*StringArray) Descriptor() ([]byte, []int) { - return file_mxaccess_gateway_proto_rawDescGZIP(), []int{88} + return file_mxaccess_gateway_proto_rawDescGZIP(), []int{89} } func (x *StringArray) GetValues() []string { @@ -7589,7 +7692,7 @@ type TimestampArray struct { func (x *TimestampArray) Reset() { *x = TimestampArray{} - mi := &file_mxaccess_gateway_proto_msgTypes[89] + mi := &file_mxaccess_gateway_proto_msgTypes[90] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7601,7 +7704,7 @@ func (x *TimestampArray) String() string { func (*TimestampArray) ProtoMessage() {} func (x *TimestampArray) ProtoReflect() protoreflect.Message { - mi := &file_mxaccess_gateway_proto_msgTypes[89] + mi := &file_mxaccess_gateway_proto_msgTypes[90] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7614,7 +7717,7 @@ func (x *TimestampArray) ProtoReflect() protoreflect.Message { // Deprecated: Use TimestampArray.ProtoReflect.Descriptor instead. func (*TimestampArray) Descriptor() ([]byte, []int) { - return file_mxaccess_gateway_proto_rawDescGZIP(), []int{89} + return file_mxaccess_gateway_proto_rawDescGZIP(), []int{90} } func (x *TimestampArray) GetValues() []*timestamppb.Timestamp { @@ -7633,7 +7736,7 @@ type RawArray struct { func (x *RawArray) Reset() { *x = RawArray{} - mi := &file_mxaccess_gateway_proto_msgTypes[90] + mi := &file_mxaccess_gateway_proto_msgTypes[91] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7645,7 +7748,7 @@ func (x *RawArray) String() string { func (*RawArray) ProtoMessage() {} func (x *RawArray) ProtoReflect() protoreflect.Message { - mi := &file_mxaccess_gateway_proto_msgTypes[90] + mi := &file_mxaccess_gateway_proto_msgTypes[91] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7658,7 +7761,7 @@ func (x *RawArray) ProtoReflect() protoreflect.Message { // Deprecated: Use RawArray.ProtoReflect.Descriptor instead. func (*RawArray) Descriptor() ([]byte, []int) { - return file_mxaccess_gateway_proto_rawDescGZIP(), []int{90} + return file_mxaccess_gateway_proto_rawDescGZIP(), []int{91} } func (x *RawArray) GetValues() [][]byte { @@ -7678,7 +7781,7 @@ type ProtocolStatus struct { func (x *ProtocolStatus) Reset() { *x = ProtocolStatus{} - mi := &file_mxaccess_gateway_proto_msgTypes[91] + mi := &file_mxaccess_gateway_proto_msgTypes[92] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7690,7 +7793,7 @@ func (x *ProtocolStatus) String() string { func (*ProtocolStatus) ProtoMessage() {} func (x *ProtocolStatus) ProtoReflect() protoreflect.Message { - mi := &file_mxaccess_gateway_proto_msgTypes[91] + mi := &file_mxaccess_gateway_proto_msgTypes[92] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7703,7 +7806,7 @@ func (x *ProtocolStatus) ProtoReflect() protoreflect.Message { // Deprecated: Use ProtocolStatus.ProtoReflect.Descriptor instead. func (*ProtocolStatus) Descriptor() ([]byte, []int) { - return file_mxaccess_gateway_proto_rawDescGZIP(), []int{91} + return file_mxaccess_gateway_proto_rawDescGZIP(), []int{92} } func (x *ProtocolStatus) GetCode() ProtocolStatusCode { @@ -8155,29 +8258,32 @@ const file_mxaccess_gateway_proto_rawDesc = "" + "\x10operator_comment\x18\v \x01(\tR\x0foperatorComment\x12A\n" + "\rcurrent_value\x18\f \x01(\v2\x1c.mxaccess_gateway.v1.MxValueR\fcurrentValue\x12=\n" + "\vlimit_value\x18\r \x01(\v2\x1c.mxaccess_gateway.v1.MxValueR\n" + - "limitValue\"\xdd\x01\n" + - "\x17AcknowledgeAlarmRequest\x12\x1d\n" + - "\n" + - "session_id\x18\x01 \x01(\tR\tsessionId\x122\n" + + "limitValue\"\xd0\x01\n" + + "\x17AcknowledgeAlarmRequest\x122\n" + "\x15client_correlation_id\x18\x02 \x01(\tR\x13clientCorrelationId\x120\n" + "\x14alarm_full_reference\x18\x03 \x01(\tR\x12alarmFullReference\x12\x18\n" + "\acomment\x18\x04 \x01(\tR\acomment\x12#\n" + - "\roperator_user\x18\x05 \x01(\tR\foperatorUser\"\xc1\x02\n" + - "\x15AcknowledgeAlarmReply\x12\x1d\n" + - "\n" + - "session_id\x18\x01 \x01(\tR\tsessionId\x12%\n" + + "\roperator_user\x18\x05 \x01(\tR\foperatorUserJ\x04\b\x01\x10\x02R\n" + + "session_id\"\xb4\x02\n" + + "\x15AcknowledgeAlarmReply\x12%\n" + "\x0ecorrelation_id\x18\x02 \x01(\tR\rcorrelationId\x12L\n" + "\x0fprotocol_status\x18\x03 \x01(\v2#.mxaccess_gateway.v1.ProtocolStatusR\x0eprotocolStatus\x12\x1d\n" + "\ahresult\x18\x04 \x01(\x05H\x00R\ahresult\x88\x01\x01\x12:\n" + "\x06status\x18\x05 \x01(\v2\".mxaccess_gateway.v1.MxStatusProxyR\x06status\x12-\n" + "\x12diagnostic_message\x18\x06 \x01(\tR\x11diagnosticMessageB\n" + "\n" + - "\b_hresult\"\x9d\x01\n" + - "\x18QueryActiveAlarmsRequest\x12\x1d\n" + + "\b_hresultJ\x04\b\x01\x10\x02R\n" + + "session_id\"y\n" + + "\x13StreamAlarmsRequest\x122\n" + + "\x15client_correlation_id\x18\x01 \x01(\tR\x13clientCorrelationId\x12.\n" + + "\x13alarm_filter_prefix\x18\x02 \x01(\tR\x11alarmFilterPrefix\"\xea\x01\n" + + "\x10AlarmFeedMessage\x12M\n" + + "\factive_alarm\x18\x01 \x01(\v2(.mxaccess_gateway.v1.ActiveAlarmSnapshotH\x00R\vactiveAlarm\x12-\n" + + "\x11snapshot_complete\x18\x02 \x01(\bH\x00R\x10snapshotComplete\x12M\n" + "\n" + - "session_id\x18\x01 \x01(\tR\tsessionId\x122\n" + - "\x15client_correlation_id\x18\x02 \x01(\tR\x13clientCorrelationId\x12.\n" + - "\x13alarm_filter_prefix\x18\x03 \x01(\tR\x11alarmFilterPrefix\"\xbe\x02\n" + + "transition\x18\x03 \x01(\v2+.mxaccess_gateway.v1.OnAlarmTransitionEventH\x00R\n" + + "transitionB\t\n" + + "\apayload\"\xbe\x02\n" + "\rMxStatusProxy\x12\x18\n" + "\asuccess\x18\x01 \x01(\x05R\asuccess\x12A\n" + "\bcategory\x18\x02 \x01(\x0e2%.mxaccess_gateway.v1.MxStatusCategoryR\bcategory\x12D\n" + @@ -8377,14 +8483,14 @@ const file_mxaccess_gateway_proto_rawDesc = "" + "\x13SESSION_STATE_READY\x10\x06\x12\x19\n" + "\x15SESSION_STATE_CLOSING\x10\a\x12\x18\n" + "\x14SESSION_STATE_CLOSED\x10\b\x12\x19\n" + - "\x15SESSION_STATE_FAULTED\x10\t2\xe0\x04\n" + + "\x15SESSION_STATE_FAULTED\x10\t2\xd3\x04\n" + "\x0fMxAccessGateway\x12]\n" + "\vOpenSession\x12'.mxaccess_gateway.v1.OpenSessionRequest\x1a%.mxaccess_gateway.v1.OpenSessionReply\x12`\n" + "\fCloseSession\x12(.mxaccess_gateway.v1.CloseSessionRequest\x1a&.mxaccess_gateway.v1.CloseSessionReply\x12T\n" + "\x06Invoke\x12%.mxaccess_gateway.v1.MxCommandRequest\x1a#.mxaccess_gateway.v1.MxCommandReply\x12X\n" + "\fStreamEvents\x12(.mxaccess_gateway.v1.StreamEventsRequest\x1a\x1c.mxaccess_gateway.v1.MxEvent0\x01\x12l\n" + - "\x10AcknowledgeAlarm\x12,.mxaccess_gateway.v1.AcknowledgeAlarmRequest\x1a*.mxaccess_gateway.v1.AcknowledgeAlarmReply\x12n\n" + - "\x11QueryActiveAlarms\x12-.mxaccess_gateway.v1.QueryActiveAlarmsRequest\x1a(.mxaccess_gateway.v1.ActiveAlarmSnapshot0\x01B\x1c\xaa\x02\x19MxGateway.Contracts.Protob\x06proto3" + "\x10AcknowledgeAlarm\x12,.mxaccess_gateway.v1.AcknowledgeAlarmRequest\x1a*.mxaccess_gateway.v1.AcknowledgeAlarmReply\x12a\n" + + "\fStreamAlarms\x12(.mxaccess_gateway.v1.StreamAlarmsRequest\x1a%.mxaccess_gateway.v1.AlarmFeedMessage0\x01B\x1c\xaa\x02\x19MxGateway.Contracts.Protob\x06proto3" var ( file_mxaccess_gateway_proto_rawDescOnce sync.Once @@ -8399,7 +8505,7 @@ func file_mxaccess_gateway_proto_rawDescGZIP() []byte { } var file_mxaccess_gateway_proto_enumTypes = make([]protoimpl.EnumInfo, 9) -var file_mxaccess_gateway_proto_msgTypes = make([]protoimpl.MessageInfo, 92) +var file_mxaccess_gateway_proto_msgTypes = make([]protoimpl.MessageInfo, 93) var file_mxaccess_gateway_proto_goTypes = []any{ (MxCommandKind)(0), // 0: mxaccess_gateway.v1.MxCommandKind (MxEventFamily)(0), // 1: mxaccess_gateway.v1.MxEventFamily @@ -8489,28 +8595,29 @@ var file_mxaccess_gateway_proto_goTypes = []any{ (*ActiveAlarmSnapshot)(nil), // 85: mxaccess_gateway.v1.ActiveAlarmSnapshot (*AcknowledgeAlarmRequest)(nil), // 86: mxaccess_gateway.v1.AcknowledgeAlarmRequest (*AcknowledgeAlarmReply)(nil), // 87: mxaccess_gateway.v1.AcknowledgeAlarmReply - (*QueryActiveAlarmsRequest)(nil), // 88: mxaccess_gateway.v1.QueryActiveAlarmsRequest - (*MxStatusProxy)(nil), // 89: mxaccess_gateway.v1.MxStatusProxy - (*MxValue)(nil), // 90: mxaccess_gateway.v1.MxValue - (*MxArray)(nil), // 91: mxaccess_gateway.v1.MxArray - (*BoolArray)(nil), // 92: mxaccess_gateway.v1.BoolArray - (*Int32Array)(nil), // 93: mxaccess_gateway.v1.Int32Array - (*Int64Array)(nil), // 94: mxaccess_gateway.v1.Int64Array - (*FloatArray)(nil), // 95: mxaccess_gateway.v1.FloatArray - (*DoubleArray)(nil), // 96: mxaccess_gateway.v1.DoubleArray - (*StringArray)(nil), // 97: mxaccess_gateway.v1.StringArray - (*TimestampArray)(nil), // 98: mxaccess_gateway.v1.TimestampArray - (*RawArray)(nil), // 99: mxaccess_gateway.v1.RawArray - (*ProtocolStatus)(nil), // 100: mxaccess_gateway.v1.ProtocolStatus - (*durationpb.Duration)(nil), // 101: google.protobuf.Duration - (*timestamppb.Timestamp)(nil), // 102: google.protobuf.Timestamp + (*StreamAlarmsRequest)(nil), // 88: mxaccess_gateway.v1.StreamAlarmsRequest + (*AlarmFeedMessage)(nil), // 89: mxaccess_gateway.v1.AlarmFeedMessage + (*MxStatusProxy)(nil), // 90: mxaccess_gateway.v1.MxStatusProxy + (*MxValue)(nil), // 91: mxaccess_gateway.v1.MxValue + (*MxArray)(nil), // 92: mxaccess_gateway.v1.MxArray + (*BoolArray)(nil), // 93: mxaccess_gateway.v1.BoolArray + (*Int32Array)(nil), // 94: mxaccess_gateway.v1.Int32Array + (*Int64Array)(nil), // 95: mxaccess_gateway.v1.Int64Array + (*FloatArray)(nil), // 96: mxaccess_gateway.v1.FloatArray + (*DoubleArray)(nil), // 97: mxaccess_gateway.v1.DoubleArray + (*StringArray)(nil), // 98: mxaccess_gateway.v1.StringArray + (*TimestampArray)(nil), // 99: mxaccess_gateway.v1.TimestampArray + (*RawArray)(nil), // 100: mxaccess_gateway.v1.RawArray + (*ProtocolStatus)(nil), // 101: mxaccess_gateway.v1.ProtocolStatus + (*durationpb.Duration)(nil), // 102: google.protobuf.Duration + (*timestamppb.Timestamp)(nil), // 103: google.protobuf.Timestamp } var file_mxaccess_gateway_proto_depIdxs = []int32{ - 101, // 0: mxaccess_gateway.v1.OpenSessionRequest.command_timeout:type_name -> google.protobuf.Duration - 101, // 1: mxaccess_gateway.v1.OpenSessionReply.default_command_timeout:type_name -> google.protobuf.Duration - 100, // 2: mxaccess_gateway.v1.OpenSessionReply.protocol_status:type_name -> mxaccess_gateway.v1.ProtocolStatus + 102, // 0: mxaccess_gateway.v1.OpenSessionRequest.command_timeout:type_name -> google.protobuf.Duration + 102, // 1: mxaccess_gateway.v1.OpenSessionReply.default_command_timeout:type_name -> google.protobuf.Duration + 101, // 2: mxaccess_gateway.v1.OpenSessionReply.protocol_status:type_name -> mxaccess_gateway.v1.ProtocolStatus 8, // 3: mxaccess_gateway.v1.CloseSessionReply.final_state:type_name -> mxaccess_gateway.v1.SessionState - 100, // 4: mxaccess_gateway.v1.CloseSessionReply.protocol_status:type_name -> mxaccess_gateway.v1.ProtocolStatus + 101, // 4: mxaccess_gateway.v1.CloseSessionReply.protocol_status:type_name -> mxaccess_gateway.v1.ProtocolStatus 15, // 5: mxaccess_gateway.v1.MxCommandRequest.command:type_name -> mxaccess_gateway.v1.MxCommand 0, // 6: mxaccess_gateway.v1.MxCommand.kind:type_name -> mxaccess_gateway.v1.MxCommandKind 16, // 7: mxaccess_gateway.v1.MxCommand.register:type_name -> mxaccess_gateway.v1.RegisterCommand @@ -8552,27 +8659,27 @@ var file_mxaccess_gateway_proto_depIdxs = []int32{ 56, // 43: mxaccess_gateway.v1.MxCommand.get_worker_info:type_name -> mxaccess_gateway.v1.GetWorkerInfoCommand 57, // 44: mxaccess_gateway.v1.MxCommand.drain_events:type_name -> mxaccess_gateway.v1.DrainEventsCommand 58, // 45: mxaccess_gateway.v1.MxCommand.shutdown_worker:type_name -> mxaccess_gateway.v1.ShutdownWorkerCommand - 90, // 46: mxaccess_gateway.v1.WriteCommand.value:type_name -> mxaccess_gateway.v1.MxValue - 90, // 47: mxaccess_gateway.v1.Write2Command.value:type_name -> mxaccess_gateway.v1.MxValue - 90, // 48: mxaccess_gateway.v1.Write2Command.timestamp_value:type_name -> mxaccess_gateway.v1.MxValue - 90, // 49: mxaccess_gateway.v1.WriteSecuredCommand.value:type_name -> mxaccess_gateway.v1.MxValue - 90, // 50: mxaccess_gateway.v1.WriteSecured2Command.value:type_name -> mxaccess_gateway.v1.MxValue - 90, // 51: mxaccess_gateway.v1.WriteSecured2Command.timestamp_value:type_name -> mxaccess_gateway.v1.MxValue + 91, // 46: mxaccess_gateway.v1.WriteCommand.value:type_name -> mxaccess_gateway.v1.MxValue + 91, // 47: mxaccess_gateway.v1.Write2Command.value:type_name -> mxaccess_gateway.v1.MxValue + 91, // 48: mxaccess_gateway.v1.Write2Command.timestamp_value:type_name -> mxaccess_gateway.v1.MxValue + 91, // 49: mxaccess_gateway.v1.WriteSecuredCommand.value:type_name -> mxaccess_gateway.v1.MxValue + 91, // 50: mxaccess_gateway.v1.WriteSecured2Command.value:type_name -> mxaccess_gateway.v1.MxValue + 91, // 51: mxaccess_gateway.v1.WriteSecured2Command.timestamp_value:type_name -> mxaccess_gateway.v1.MxValue 46, // 52: mxaccess_gateway.v1.WriteBulkCommand.entries:type_name -> mxaccess_gateway.v1.WriteBulkEntry - 90, // 53: mxaccess_gateway.v1.WriteBulkEntry.value:type_name -> mxaccess_gateway.v1.MxValue + 91, // 53: mxaccess_gateway.v1.WriteBulkEntry.value:type_name -> mxaccess_gateway.v1.MxValue 48, // 54: mxaccess_gateway.v1.Write2BulkCommand.entries:type_name -> mxaccess_gateway.v1.Write2BulkEntry - 90, // 55: mxaccess_gateway.v1.Write2BulkEntry.value:type_name -> mxaccess_gateway.v1.MxValue - 90, // 56: mxaccess_gateway.v1.Write2BulkEntry.timestamp_value:type_name -> mxaccess_gateway.v1.MxValue + 91, // 55: mxaccess_gateway.v1.Write2BulkEntry.value:type_name -> mxaccess_gateway.v1.MxValue + 91, // 56: mxaccess_gateway.v1.Write2BulkEntry.timestamp_value:type_name -> mxaccess_gateway.v1.MxValue 50, // 57: mxaccess_gateway.v1.WriteSecuredBulkCommand.entries:type_name -> mxaccess_gateway.v1.WriteSecuredBulkEntry - 90, // 58: mxaccess_gateway.v1.WriteSecuredBulkEntry.value:type_name -> mxaccess_gateway.v1.MxValue + 91, // 58: mxaccess_gateway.v1.WriteSecuredBulkEntry.value:type_name -> mxaccess_gateway.v1.MxValue 52, // 59: mxaccess_gateway.v1.WriteSecured2BulkCommand.entries:type_name -> mxaccess_gateway.v1.WriteSecured2BulkEntry - 90, // 60: mxaccess_gateway.v1.WriteSecured2BulkEntry.value:type_name -> mxaccess_gateway.v1.MxValue - 90, // 61: mxaccess_gateway.v1.WriteSecured2BulkEntry.timestamp_value:type_name -> mxaccess_gateway.v1.MxValue - 101, // 62: mxaccess_gateway.v1.ShutdownWorkerCommand.grace_period:type_name -> google.protobuf.Duration + 91, // 60: mxaccess_gateway.v1.WriteSecured2BulkEntry.value:type_name -> mxaccess_gateway.v1.MxValue + 91, // 61: mxaccess_gateway.v1.WriteSecured2BulkEntry.timestamp_value:type_name -> mxaccess_gateway.v1.MxValue + 102, // 62: mxaccess_gateway.v1.ShutdownWorkerCommand.grace_period:type_name -> google.protobuf.Duration 0, // 63: mxaccess_gateway.v1.MxCommandReply.kind:type_name -> mxaccess_gateway.v1.MxCommandKind - 100, // 64: mxaccess_gateway.v1.MxCommandReply.protocol_status:type_name -> mxaccess_gateway.v1.ProtocolStatus - 90, // 65: mxaccess_gateway.v1.MxCommandReply.return_value:type_name -> mxaccess_gateway.v1.MxValue - 89, // 66: mxaccess_gateway.v1.MxCommandReply.statuses:type_name -> mxaccess_gateway.v1.MxStatusProxy + 101, // 64: mxaccess_gateway.v1.MxCommandReply.protocol_status:type_name -> mxaccess_gateway.v1.ProtocolStatus + 91, // 65: mxaccess_gateway.v1.MxCommandReply.return_value:type_name -> mxaccess_gateway.v1.MxValue + 90, // 66: mxaccess_gateway.v1.MxCommandReply.statuses:type_name -> mxaccess_gateway.v1.MxStatusProxy 60, // 67: mxaccess_gateway.v1.MxCommandReply.register:type_name -> mxaccess_gateway.v1.RegisterReply 61, // 68: mxaccess_gateway.v1.MxCommandReply.add_item:type_name -> mxaccess_gateway.v1.AddItemReply 62, // 69: mxaccess_gateway.v1.MxCommandReply.add_item2:type_name -> mxaccess_gateway.v1.AddItem2Reply @@ -8597,77 +8704,79 @@ var file_mxaccess_gateway_proto_depIdxs = []int32{ 74, // 88: mxaccess_gateway.v1.MxCommandReply.session_state:type_name -> mxaccess_gateway.v1.SessionStateReply 75, // 89: mxaccess_gateway.v1.MxCommandReply.worker_info:type_name -> mxaccess_gateway.v1.WorkerInfoReply 76, // 90: mxaccess_gateway.v1.MxCommandReply.drain_events:type_name -> mxaccess_gateway.v1.DrainEventsReply - 89, // 91: mxaccess_gateway.v1.SuspendReply.status:type_name -> mxaccess_gateway.v1.MxStatusProxy - 89, // 92: mxaccess_gateway.v1.ActivateReply.status:type_name -> mxaccess_gateway.v1.MxStatusProxy + 90, // 91: mxaccess_gateway.v1.SuspendReply.status:type_name -> mxaccess_gateway.v1.MxStatusProxy + 90, // 92: mxaccess_gateway.v1.ActivateReply.status:type_name -> mxaccess_gateway.v1.MxStatusProxy 68, // 93: mxaccess_gateway.v1.BulkSubscribeReply.results:type_name -> mxaccess_gateway.v1.SubscribeResult - 89, // 94: mxaccess_gateway.v1.BulkWriteResult.statuses:type_name -> mxaccess_gateway.v1.MxStatusProxy + 90, // 94: mxaccess_gateway.v1.BulkWriteResult.statuses:type_name -> mxaccess_gateway.v1.MxStatusProxy 70, // 95: mxaccess_gateway.v1.BulkWriteReply.results:type_name -> mxaccess_gateway.v1.BulkWriteResult - 90, // 96: mxaccess_gateway.v1.BulkReadResult.value:type_name -> mxaccess_gateway.v1.MxValue - 102, // 97: mxaccess_gateway.v1.BulkReadResult.source_timestamp:type_name -> google.protobuf.Timestamp - 89, // 98: mxaccess_gateway.v1.BulkReadResult.statuses:type_name -> mxaccess_gateway.v1.MxStatusProxy + 91, // 96: mxaccess_gateway.v1.BulkReadResult.value:type_name -> mxaccess_gateway.v1.MxValue + 103, // 97: mxaccess_gateway.v1.BulkReadResult.source_timestamp:type_name -> google.protobuf.Timestamp + 90, // 98: mxaccess_gateway.v1.BulkReadResult.statuses:type_name -> mxaccess_gateway.v1.MxStatusProxy 72, // 99: mxaccess_gateway.v1.BulkReadReply.results:type_name -> mxaccess_gateway.v1.BulkReadResult 8, // 100: mxaccess_gateway.v1.SessionStateReply.state:type_name -> mxaccess_gateway.v1.SessionState 79, // 101: mxaccess_gateway.v1.DrainEventsReply.events:type_name -> mxaccess_gateway.v1.MxEvent 85, // 102: mxaccess_gateway.v1.QueryActiveAlarmsReplyPayload.snapshots:type_name -> mxaccess_gateway.v1.ActiveAlarmSnapshot 1, // 103: mxaccess_gateway.v1.MxEvent.family:type_name -> mxaccess_gateway.v1.MxEventFamily - 90, // 104: mxaccess_gateway.v1.MxEvent.value:type_name -> mxaccess_gateway.v1.MxValue - 102, // 105: mxaccess_gateway.v1.MxEvent.source_timestamp:type_name -> google.protobuf.Timestamp - 89, // 106: mxaccess_gateway.v1.MxEvent.statuses:type_name -> mxaccess_gateway.v1.MxStatusProxy - 102, // 107: mxaccess_gateway.v1.MxEvent.worker_timestamp:type_name -> google.protobuf.Timestamp - 102, // 108: mxaccess_gateway.v1.MxEvent.gateway_receive_timestamp:type_name -> google.protobuf.Timestamp + 91, // 104: mxaccess_gateway.v1.MxEvent.value:type_name -> mxaccess_gateway.v1.MxValue + 103, // 105: mxaccess_gateway.v1.MxEvent.source_timestamp:type_name -> google.protobuf.Timestamp + 90, // 106: mxaccess_gateway.v1.MxEvent.statuses:type_name -> mxaccess_gateway.v1.MxStatusProxy + 103, // 107: mxaccess_gateway.v1.MxEvent.worker_timestamp:type_name -> google.protobuf.Timestamp + 103, // 108: mxaccess_gateway.v1.MxEvent.gateway_receive_timestamp:type_name -> google.protobuf.Timestamp 80, // 109: mxaccess_gateway.v1.MxEvent.on_data_change:type_name -> mxaccess_gateway.v1.OnDataChangeEvent 81, // 110: mxaccess_gateway.v1.MxEvent.on_write_complete:type_name -> mxaccess_gateway.v1.OnWriteCompleteEvent 82, // 111: mxaccess_gateway.v1.MxEvent.operation_complete:type_name -> mxaccess_gateway.v1.OperationCompleteEvent 83, // 112: mxaccess_gateway.v1.MxEvent.on_buffered_data_change:type_name -> mxaccess_gateway.v1.OnBufferedDataChangeEvent 84, // 113: mxaccess_gateway.v1.MxEvent.on_alarm_transition:type_name -> mxaccess_gateway.v1.OnAlarmTransitionEvent 6, // 114: mxaccess_gateway.v1.OnBufferedDataChangeEvent.data_type:type_name -> mxaccess_gateway.v1.MxDataType - 91, // 115: mxaccess_gateway.v1.OnBufferedDataChangeEvent.quality_values:type_name -> mxaccess_gateway.v1.MxArray - 91, // 116: mxaccess_gateway.v1.OnBufferedDataChangeEvent.timestamp_values:type_name -> mxaccess_gateway.v1.MxArray + 92, // 115: mxaccess_gateway.v1.OnBufferedDataChangeEvent.quality_values:type_name -> mxaccess_gateway.v1.MxArray + 92, // 116: mxaccess_gateway.v1.OnBufferedDataChangeEvent.timestamp_values:type_name -> mxaccess_gateway.v1.MxArray 2, // 117: mxaccess_gateway.v1.OnAlarmTransitionEvent.transition_kind:type_name -> mxaccess_gateway.v1.AlarmTransitionKind - 102, // 118: mxaccess_gateway.v1.OnAlarmTransitionEvent.original_raise_timestamp:type_name -> google.protobuf.Timestamp - 102, // 119: mxaccess_gateway.v1.OnAlarmTransitionEvent.transition_timestamp:type_name -> google.protobuf.Timestamp - 90, // 120: mxaccess_gateway.v1.OnAlarmTransitionEvent.current_value:type_name -> mxaccess_gateway.v1.MxValue - 90, // 121: mxaccess_gateway.v1.OnAlarmTransitionEvent.limit_value:type_name -> mxaccess_gateway.v1.MxValue - 102, // 122: mxaccess_gateway.v1.ActiveAlarmSnapshot.original_raise_timestamp:type_name -> google.protobuf.Timestamp + 103, // 118: mxaccess_gateway.v1.OnAlarmTransitionEvent.original_raise_timestamp:type_name -> google.protobuf.Timestamp + 103, // 119: mxaccess_gateway.v1.OnAlarmTransitionEvent.transition_timestamp:type_name -> google.protobuf.Timestamp + 91, // 120: mxaccess_gateway.v1.OnAlarmTransitionEvent.current_value:type_name -> mxaccess_gateway.v1.MxValue + 91, // 121: mxaccess_gateway.v1.OnAlarmTransitionEvent.limit_value:type_name -> mxaccess_gateway.v1.MxValue + 103, // 122: mxaccess_gateway.v1.ActiveAlarmSnapshot.original_raise_timestamp:type_name -> google.protobuf.Timestamp 3, // 123: mxaccess_gateway.v1.ActiveAlarmSnapshot.current_state:type_name -> mxaccess_gateway.v1.AlarmConditionState - 102, // 124: mxaccess_gateway.v1.ActiveAlarmSnapshot.last_transition_timestamp:type_name -> google.protobuf.Timestamp - 90, // 125: mxaccess_gateway.v1.ActiveAlarmSnapshot.current_value:type_name -> mxaccess_gateway.v1.MxValue - 90, // 126: mxaccess_gateway.v1.ActiveAlarmSnapshot.limit_value:type_name -> mxaccess_gateway.v1.MxValue - 100, // 127: mxaccess_gateway.v1.AcknowledgeAlarmReply.protocol_status:type_name -> mxaccess_gateway.v1.ProtocolStatus - 89, // 128: mxaccess_gateway.v1.AcknowledgeAlarmReply.status:type_name -> mxaccess_gateway.v1.MxStatusProxy - 4, // 129: mxaccess_gateway.v1.MxStatusProxy.category:type_name -> mxaccess_gateway.v1.MxStatusCategory - 5, // 130: mxaccess_gateway.v1.MxStatusProxy.detected_by:type_name -> mxaccess_gateway.v1.MxStatusSource - 6, // 131: mxaccess_gateway.v1.MxValue.data_type:type_name -> mxaccess_gateway.v1.MxDataType - 102, // 132: mxaccess_gateway.v1.MxValue.timestamp_value:type_name -> google.protobuf.Timestamp - 91, // 133: mxaccess_gateway.v1.MxValue.array_value:type_name -> mxaccess_gateway.v1.MxArray - 6, // 134: mxaccess_gateway.v1.MxArray.element_data_type:type_name -> mxaccess_gateway.v1.MxDataType - 92, // 135: mxaccess_gateway.v1.MxArray.bool_values:type_name -> mxaccess_gateway.v1.BoolArray - 93, // 136: mxaccess_gateway.v1.MxArray.int32_values:type_name -> mxaccess_gateway.v1.Int32Array - 94, // 137: mxaccess_gateway.v1.MxArray.int64_values:type_name -> mxaccess_gateway.v1.Int64Array - 95, // 138: mxaccess_gateway.v1.MxArray.float_values:type_name -> mxaccess_gateway.v1.FloatArray - 96, // 139: mxaccess_gateway.v1.MxArray.double_values:type_name -> mxaccess_gateway.v1.DoubleArray - 97, // 140: mxaccess_gateway.v1.MxArray.string_values:type_name -> mxaccess_gateway.v1.StringArray - 98, // 141: mxaccess_gateway.v1.MxArray.timestamp_values:type_name -> mxaccess_gateway.v1.TimestampArray - 99, // 142: mxaccess_gateway.v1.MxArray.raw_values:type_name -> mxaccess_gateway.v1.RawArray - 102, // 143: mxaccess_gateway.v1.TimestampArray.values:type_name -> google.protobuf.Timestamp - 7, // 144: mxaccess_gateway.v1.ProtocolStatus.code:type_name -> mxaccess_gateway.v1.ProtocolStatusCode - 9, // 145: mxaccess_gateway.v1.MxAccessGateway.OpenSession:input_type -> mxaccess_gateway.v1.OpenSessionRequest - 11, // 146: mxaccess_gateway.v1.MxAccessGateway.CloseSession:input_type -> mxaccess_gateway.v1.CloseSessionRequest - 14, // 147: mxaccess_gateway.v1.MxAccessGateway.Invoke:input_type -> mxaccess_gateway.v1.MxCommandRequest - 13, // 148: mxaccess_gateway.v1.MxAccessGateway.StreamEvents:input_type -> mxaccess_gateway.v1.StreamEventsRequest - 86, // 149: mxaccess_gateway.v1.MxAccessGateway.AcknowledgeAlarm:input_type -> mxaccess_gateway.v1.AcknowledgeAlarmRequest - 88, // 150: mxaccess_gateway.v1.MxAccessGateway.QueryActiveAlarms:input_type -> mxaccess_gateway.v1.QueryActiveAlarmsRequest - 10, // 151: mxaccess_gateway.v1.MxAccessGateway.OpenSession:output_type -> mxaccess_gateway.v1.OpenSessionReply - 12, // 152: mxaccess_gateway.v1.MxAccessGateway.CloseSession:output_type -> mxaccess_gateway.v1.CloseSessionReply - 59, // 153: mxaccess_gateway.v1.MxAccessGateway.Invoke:output_type -> mxaccess_gateway.v1.MxCommandReply - 79, // 154: mxaccess_gateway.v1.MxAccessGateway.StreamEvents:output_type -> mxaccess_gateway.v1.MxEvent - 87, // 155: mxaccess_gateway.v1.MxAccessGateway.AcknowledgeAlarm:output_type -> mxaccess_gateway.v1.AcknowledgeAlarmReply - 85, // 156: mxaccess_gateway.v1.MxAccessGateway.QueryActiveAlarms:output_type -> mxaccess_gateway.v1.ActiveAlarmSnapshot - 151, // [151:157] is the sub-list for method output_type - 145, // [145:151] is the sub-list for method input_type - 145, // [145:145] is the sub-list for extension type_name - 145, // [145:145] is the sub-list for extension extendee - 0, // [0:145] is the sub-list for field type_name + 103, // 124: mxaccess_gateway.v1.ActiveAlarmSnapshot.last_transition_timestamp:type_name -> google.protobuf.Timestamp + 91, // 125: mxaccess_gateway.v1.ActiveAlarmSnapshot.current_value:type_name -> mxaccess_gateway.v1.MxValue + 91, // 126: mxaccess_gateway.v1.ActiveAlarmSnapshot.limit_value:type_name -> mxaccess_gateway.v1.MxValue + 101, // 127: mxaccess_gateway.v1.AcknowledgeAlarmReply.protocol_status:type_name -> mxaccess_gateway.v1.ProtocolStatus + 90, // 128: mxaccess_gateway.v1.AcknowledgeAlarmReply.status:type_name -> mxaccess_gateway.v1.MxStatusProxy + 85, // 129: mxaccess_gateway.v1.AlarmFeedMessage.active_alarm:type_name -> mxaccess_gateway.v1.ActiveAlarmSnapshot + 84, // 130: mxaccess_gateway.v1.AlarmFeedMessage.transition:type_name -> mxaccess_gateway.v1.OnAlarmTransitionEvent + 4, // 131: mxaccess_gateway.v1.MxStatusProxy.category:type_name -> mxaccess_gateway.v1.MxStatusCategory + 5, // 132: mxaccess_gateway.v1.MxStatusProxy.detected_by:type_name -> mxaccess_gateway.v1.MxStatusSource + 6, // 133: mxaccess_gateway.v1.MxValue.data_type:type_name -> mxaccess_gateway.v1.MxDataType + 103, // 134: mxaccess_gateway.v1.MxValue.timestamp_value:type_name -> google.protobuf.Timestamp + 92, // 135: mxaccess_gateway.v1.MxValue.array_value:type_name -> mxaccess_gateway.v1.MxArray + 6, // 136: mxaccess_gateway.v1.MxArray.element_data_type:type_name -> mxaccess_gateway.v1.MxDataType + 93, // 137: mxaccess_gateway.v1.MxArray.bool_values:type_name -> mxaccess_gateway.v1.BoolArray + 94, // 138: mxaccess_gateway.v1.MxArray.int32_values:type_name -> mxaccess_gateway.v1.Int32Array + 95, // 139: mxaccess_gateway.v1.MxArray.int64_values:type_name -> mxaccess_gateway.v1.Int64Array + 96, // 140: mxaccess_gateway.v1.MxArray.float_values:type_name -> mxaccess_gateway.v1.FloatArray + 97, // 141: mxaccess_gateway.v1.MxArray.double_values:type_name -> mxaccess_gateway.v1.DoubleArray + 98, // 142: mxaccess_gateway.v1.MxArray.string_values:type_name -> mxaccess_gateway.v1.StringArray + 99, // 143: mxaccess_gateway.v1.MxArray.timestamp_values:type_name -> mxaccess_gateway.v1.TimestampArray + 100, // 144: mxaccess_gateway.v1.MxArray.raw_values:type_name -> mxaccess_gateway.v1.RawArray + 103, // 145: mxaccess_gateway.v1.TimestampArray.values:type_name -> google.protobuf.Timestamp + 7, // 146: mxaccess_gateway.v1.ProtocolStatus.code:type_name -> mxaccess_gateway.v1.ProtocolStatusCode + 9, // 147: mxaccess_gateway.v1.MxAccessGateway.OpenSession:input_type -> mxaccess_gateway.v1.OpenSessionRequest + 11, // 148: mxaccess_gateway.v1.MxAccessGateway.CloseSession:input_type -> mxaccess_gateway.v1.CloseSessionRequest + 14, // 149: mxaccess_gateway.v1.MxAccessGateway.Invoke:input_type -> mxaccess_gateway.v1.MxCommandRequest + 13, // 150: mxaccess_gateway.v1.MxAccessGateway.StreamEvents:input_type -> mxaccess_gateway.v1.StreamEventsRequest + 86, // 151: mxaccess_gateway.v1.MxAccessGateway.AcknowledgeAlarm:input_type -> mxaccess_gateway.v1.AcknowledgeAlarmRequest + 88, // 152: mxaccess_gateway.v1.MxAccessGateway.StreamAlarms:input_type -> mxaccess_gateway.v1.StreamAlarmsRequest + 10, // 153: mxaccess_gateway.v1.MxAccessGateway.OpenSession:output_type -> mxaccess_gateway.v1.OpenSessionReply + 12, // 154: mxaccess_gateway.v1.MxAccessGateway.CloseSession:output_type -> mxaccess_gateway.v1.CloseSessionReply + 59, // 155: mxaccess_gateway.v1.MxAccessGateway.Invoke:output_type -> mxaccess_gateway.v1.MxCommandReply + 79, // 156: mxaccess_gateway.v1.MxAccessGateway.StreamEvents:output_type -> mxaccess_gateway.v1.MxEvent + 87, // 157: mxaccess_gateway.v1.MxAccessGateway.AcknowledgeAlarm:output_type -> mxaccess_gateway.v1.AcknowledgeAlarmReply + 89, // 158: mxaccess_gateway.v1.MxAccessGateway.StreamAlarms:output_type -> mxaccess_gateway.v1.AlarmFeedMessage + 153, // [153:159] is the sub-list for method output_type + 147, // [147:153] is the sub-list for method input_type + 147, // [147:147] is the sub-list for extension type_name + 147, // [147:147] is the sub-list for extension extendee + 0, // [0:147] is the sub-list for field type_name } func init() { file_mxaccess_gateway_proto_init() } @@ -8751,7 +8860,12 @@ func file_mxaccess_gateway_proto_init() { (*MxEvent_OnAlarmTransition)(nil), } file_mxaccess_gateway_proto_msgTypes[78].OneofWrappers = []any{} - file_mxaccess_gateway_proto_msgTypes[81].OneofWrappers = []any{ + file_mxaccess_gateway_proto_msgTypes[80].OneofWrappers = []any{ + (*AlarmFeedMessage_ActiveAlarm)(nil), + (*AlarmFeedMessage_SnapshotComplete)(nil), + (*AlarmFeedMessage_Transition)(nil), + } + file_mxaccess_gateway_proto_msgTypes[82].OneofWrappers = []any{ (*MxValue_BoolValue)(nil), (*MxValue_Int32Value)(nil), (*MxValue_Int64Value)(nil), @@ -8762,7 +8876,7 @@ func file_mxaccess_gateway_proto_init() { (*MxValue_ArrayValue)(nil), (*MxValue_RawValue)(nil), } - file_mxaccess_gateway_proto_msgTypes[82].OneofWrappers = []any{ + file_mxaccess_gateway_proto_msgTypes[83].OneofWrappers = []any{ (*MxArray_BoolValues)(nil), (*MxArray_Int32Values)(nil), (*MxArray_Int64Values)(nil), @@ -8778,7 +8892,7 @@ func file_mxaccess_gateway_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: unsafe.Slice(unsafe.StringData(file_mxaccess_gateway_proto_rawDesc), len(file_mxaccess_gateway_proto_rawDesc)), NumEnums: 9, - NumMessages: 92, + NumMessages: 93, NumExtensions: 0, NumServices: 1, }, diff --git a/clients/go/internal/generated/mxaccess_gateway_grpc.pb.go b/clients/go/internal/generated/mxaccess_gateway_grpc.pb.go index 8417a93..eb01a54 100644 --- a/clients/go/internal/generated/mxaccess_gateway_grpc.pb.go +++ b/clients/go/internal/generated/mxaccess_gateway_grpc.pb.go @@ -19,12 +19,12 @@ import ( const _ = grpc.SupportPackageIsVersion9 const ( - MxAccessGateway_OpenSession_FullMethodName = "/mxaccess_gateway.v1.MxAccessGateway/OpenSession" - MxAccessGateway_CloseSession_FullMethodName = "/mxaccess_gateway.v1.MxAccessGateway/CloseSession" - MxAccessGateway_Invoke_FullMethodName = "/mxaccess_gateway.v1.MxAccessGateway/Invoke" - MxAccessGateway_StreamEvents_FullMethodName = "/mxaccess_gateway.v1.MxAccessGateway/StreamEvents" - MxAccessGateway_AcknowledgeAlarm_FullMethodName = "/mxaccess_gateway.v1.MxAccessGateway/AcknowledgeAlarm" - MxAccessGateway_QueryActiveAlarms_FullMethodName = "/mxaccess_gateway.v1.MxAccessGateway/QueryActiveAlarms" + MxAccessGateway_OpenSession_FullMethodName = "/mxaccess_gateway.v1.MxAccessGateway/OpenSession" + MxAccessGateway_CloseSession_FullMethodName = "/mxaccess_gateway.v1.MxAccessGateway/CloseSession" + MxAccessGateway_Invoke_FullMethodName = "/mxaccess_gateway.v1.MxAccessGateway/Invoke" + MxAccessGateway_StreamEvents_FullMethodName = "/mxaccess_gateway.v1.MxAccessGateway/StreamEvents" + MxAccessGateway_AcknowledgeAlarm_FullMethodName = "/mxaccess_gateway.v1.MxAccessGateway/AcknowledgeAlarm" + MxAccessGateway_StreamAlarms_FullMethodName = "/mxaccess_gateway.v1.MxAccessGateway/StreamAlarms" ) // MxAccessGatewayClient is the client API for MxAccessGateway service. @@ -38,7 +38,12 @@ type MxAccessGatewayClient interface { Invoke(ctx context.Context, in *MxCommandRequest, opts ...grpc.CallOption) (*MxCommandReply, error) StreamEvents(ctx context.Context, in *StreamEventsRequest, opts ...grpc.CallOption) (grpc.ServerStreamingClient[MxEvent], error) AcknowledgeAlarm(ctx context.Context, in *AcknowledgeAlarmRequest, opts ...grpc.CallOption) (*AcknowledgeAlarmReply, error) - QueryActiveAlarms(ctx context.Context, in *QueryActiveAlarmsRequest, opts ...grpc.CallOption) (grpc.ServerStreamingClient[ActiveAlarmSnapshot], error) + // Session-less central alarm feed. The stream opens with the current + // active-alarm snapshot (one `active_alarm` per alarm), then a single + // `snapshot_complete`, then a `transition` for every subsequent change. + // Served by the gateway's always-on alarm monitor; any number of clients + // fan out from the single monitor without opening a worker session. + StreamAlarms(ctx context.Context, in *StreamAlarmsRequest, opts ...grpc.CallOption) (grpc.ServerStreamingClient[AlarmFeedMessage], error) } type mxAccessGatewayClient struct { @@ -108,13 +113,13 @@ func (c *mxAccessGatewayClient) AcknowledgeAlarm(ctx context.Context, in *Acknow return out, nil } -func (c *mxAccessGatewayClient) QueryActiveAlarms(ctx context.Context, in *QueryActiveAlarmsRequest, opts ...grpc.CallOption) (grpc.ServerStreamingClient[ActiveAlarmSnapshot], error) { +func (c *mxAccessGatewayClient) StreamAlarms(ctx context.Context, in *StreamAlarmsRequest, opts ...grpc.CallOption) (grpc.ServerStreamingClient[AlarmFeedMessage], error) { cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) - stream, err := c.cc.NewStream(ctx, &MxAccessGateway_ServiceDesc.Streams[1], MxAccessGateway_QueryActiveAlarms_FullMethodName, cOpts...) + stream, err := c.cc.NewStream(ctx, &MxAccessGateway_ServiceDesc.Streams[1], MxAccessGateway_StreamAlarms_FullMethodName, cOpts...) if err != nil { return nil, err } - x := &grpc.GenericClientStream[QueryActiveAlarmsRequest, ActiveAlarmSnapshot]{ClientStream: stream} + x := &grpc.GenericClientStream[StreamAlarmsRequest, AlarmFeedMessage]{ClientStream: stream} if err := x.ClientStream.SendMsg(in); err != nil { return nil, err } @@ -125,7 +130,7 @@ func (c *mxAccessGatewayClient) QueryActiveAlarms(ctx context.Context, in *Query } // This type alias is provided for backwards compatibility with existing code that references the prior non-generic stream type by name. -type MxAccessGateway_QueryActiveAlarmsClient = grpc.ServerStreamingClient[ActiveAlarmSnapshot] +type MxAccessGateway_StreamAlarmsClient = grpc.ServerStreamingClient[AlarmFeedMessage] // MxAccessGatewayServer is the server API for MxAccessGateway service. // All implementations must embed UnimplementedMxAccessGatewayServer @@ -138,7 +143,12 @@ type MxAccessGatewayServer interface { Invoke(context.Context, *MxCommandRequest) (*MxCommandReply, error) StreamEvents(*StreamEventsRequest, grpc.ServerStreamingServer[MxEvent]) error AcknowledgeAlarm(context.Context, *AcknowledgeAlarmRequest) (*AcknowledgeAlarmReply, error) - QueryActiveAlarms(*QueryActiveAlarmsRequest, grpc.ServerStreamingServer[ActiveAlarmSnapshot]) error + // Session-less central alarm feed. The stream opens with the current + // active-alarm snapshot (one `active_alarm` per alarm), then a single + // `snapshot_complete`, then a `transition` for every subsequent change. + // Served by the gateway's always-on alarm monitor; any number of clients + // fan out from the single monitor without opening a worker session. + StreamAlarms(*StreamAlarmsRequest, grpc.ServerStreamingServer[AlarmFeedMessage]) error mustEmbedUnimplementedMxAccessGatewayServer() } @@ -164,8 +174,8 @@ func (UnimplementedMxAccessGatewayServer) StreamEvents(*StreamEventsRequest, grp func (UnimplementedMxAccessGatewayServer) AcknowledgeAlarm(context.Context, *AcknowledgeAlarmRequest) (*AcknowledgeAlarmReply, error) { return nil, status.Error(codes.Unimplemented, "method AcknowledgeAlarm not implemented") } -func (UnimplementedMxAccessGatewayServer) QueryActiveAlarms(*QueryActiveAlarmsRequest, grpc.ServerStreamingServer[ActiveAlarmSnapshot]) error { - return status.Error(codes.Unimplemented, "method QueryActiveAlarms not implemented") +func (UnimplementedMxAccessGatewayServer) StreamAlarms(*StreamAlarmsRequest, grpc.ServerStreamingServer[AlarmFeedMessage]) error { + return status.Error(codes.Unimplemented, "method StreamAlarms not implemented") } func (UnimplementedMxAccessGatewayServer) mustEmbedUnimplementedMxAccessGatewayServer() {} func (UnimplementedMxAccessGatewayServer) testEmbeddedByValue() {} @@ -271,16 +281,16 @@ func _MxAccessGateway_AcknowledgeAlarm_Handler(srv interface{}, ctx context.Cont return interceptor(ctx, in, info, handler) } -func _MxAccessGateway_QueryActiveAlarms_Handler(srv interface{}, stream grpc.ServerStream) error { - m := new(QueryActiveAlarmsRequest) +func _MxAccessGateway_StreamAlarms_Handler(srv interface{}, stream grpc.ServerStream) error { + m := new(StreamAlarmsRequest) if err := stream.RecvMsg(m); err != nil { return err } - return srv.(MxAccessGatewayServer).QueryActiveAlarms(m, &grpc.GenericServerStream[QueryActiveAlarmsRequest, ActiveAlarmSnapshot]{ServerStream: stream}) + return srv.(MxAccessGatewayServer).StreamAlarms(m, &grpc.GenericServerStream[StreamAlarmsRequest, AlarmFeedMessage]{ServerStream: stream}) } // This type alias is provided for backwards compatibility with existing code that references the prior non-generic stream type by name. -type MxAccessGateway_QueryActiveAlarmsServer = grpc.ServerStreamingServer[ActiveAlarmSnapshot] +type MxAccessGateway_StreamAlarmsServer = grpc.ServerStreamingServer[AlarmFeedMessage] // MxAccessGateway_ServiceDesc is the grpc.ServiceDesc for MxAccessGateway service. // It's only intended for direct use with grpc.RegisterService, @@ -313,8 +323,8 @@ var MxAccessGateway_ServiceDesc = grpc.ServiceDesc{ ServerStreams: true, }, { - StreamName: "QueryActiveAlarms", - Handler: _MxAccessGateway_QueryActiveAlarms_Handler, + StreamName: "StreamAlarms", + Handler: _MxAccessGateway_StreamAlarms_Handler, ServerStreams: true, }, }, diff --git a/clients/go/mxgateway/alarms.go b/clients/go/mxgateway/alarms.go index 9fbd911..d5f104f 100644 --- a/clients/go/mxgateway/alarms.go +++ b/clients/go/mxgateway/alarms.go @@ -31,22 +31,24 @@ func (c *Client) AcknowledgeAlarm(ctx context.Context, req *AcknowledgeAlarmRequ return reply, nil } -// QueryActiveAlarms streams a snapshot of all alarms currently Active or -// ActiveAcked — the gateway's ConditionRefresh equivalent. Used after reconnect -// to seed local Part 9 state, or to reconcile alarms that may have been missed -// during a transport blip. +// StreamAlarms attaches to the gateway's central alarm feed. The stream opens +// with one AlarmFeedMessage per currently-active alarm (the ConditionRefresh +// snapshot), then a single snapshot-complete sentinel, then a transition for +// every subsequent raise / acknowledge / clear. It is served by the gateway's +// always-on alarm monitor — no worker session is opened — so any number of +// clients may attach. // // The returned stream is owned by the caller; cancel ctx to release it. // Optional alarm-reference prefix scoping (req.AlarmFilterPrefix) limits the // stream to a sub-tree. -func (c *Client) QueryActiveAlarms(ctx context.Context, req *QueryActiveAlarmsRequest) (QueryActiveAlarmsClient, error) { +func (c *Client) StreamAlarms(ctx context.Context, req *StreamAlarmsRequest) (StreamAlarmsClient, error) { if req == nil { - return nil, errors.New("mxgateway: query active alarms request is required") + return nil, errors.New("mxgateway: stream alarms request is required") } - stream, err := c.raw.QueryActiveAlarms(ctx, req) + stream, err := c.raw.StreamAlarms(ctx, req) if err != nil { - return nil, &GatewayError{Op: "query active alarms", Err: err} + return nil, &GatewayError{Op: "stream alarms", Err: err} } return stream, nil diff --git a/clients/go/mxgateway/alarms_test.go b/clients/go/mxgateway/alarms_test.go index df5ecb1..ed4d742 100644 --- a/clients/go/mxgateway/alarms_test.go +++ b/clients/go/mxgateway/alarms_test.go @@ -14,13 +14,11 @@ import ( "google.golang.org/grpc/test/bufconn" ) -// PR E.4 — pins the Go SDK surface for the new alarm RPCs: -// AcknowledgeAlarm + QueryActiveAlarms. +// Pins the Go SDK surface for the alarm RPCs: AcknowledgeAlarm + StreamAlarms. func TestAcknowledgeAlarmSendsRequestAndReturnsReply(t *testing.T) { fake := &fakeGatewayWithAlarms{ acknowledgeReply: &pb.AcknowledgeAlarmReply{ - SessionId: "session-1", CorrelationId: "corr-1", ProtocolStatus: &pb.ProtocolStatus{ Code: pb.ProtocolStatusCode_PROTOCOL_STATUS_CODE_OK, @@ -35,7 +33,6 @@ func TestAcknowledgeAlarmSendsRequestAndReturnsReply(t *testing.T) { defer cleanup() reply, err := client.AcknowledgeAlarm(context.Background(), &pb.AcknowledgeAlarmRequest{ - SessionId: "session-1", ClientCorrelationId: "corr-1", AlarmFullReference: "Tank01.Level.HiHi", Comment: "investigating", @@ -77,7 +74,6 @@ func TestAcknowledgeAlarmMapsUnauthenticated(t *testing.T) { defer cleanup() _, err := client.AcknowledgeAlarm(context.Background(), &pb.AcknowledgeAlarmRequest{ - SessionId: "session-1", AlarmFullReference: "Tank01.Level.HiHi", OperatorUser: "alice", }) @@ -93,7 +89,7 @@ func TestAcknowledgeAlarmMapsUnauthenticated(t *testing.T) { } } -func TestQueryActiveAlarmsStreamsSnapshots(t *testing.T) { +func TestStreamAlarmsStreamsSnapshotThenSnapshotComplete(t *testing.T) { fake := &fakeGatewayWithAlarms{ activeSnapshots: []*pb.ActiveAlarmSnapshot{ { @@ -111,46 +107,46 @@ func TestQueryActiveAlarmsStreamsSnapshots(t *testing.T) { client, cleanup := newBufconnClientWithAlarms(t, fake) defer cleanup() - stream, err := client.QueryActiveAlarms(context.Background(), &pb.QueryActiveAlarmsRequest{ - SessionId: "session-1", - }) + stream, err := client.StreamAlarms(context.Background(), &pb.StreamAlarmsRequest{}) if err != nil { - t.Fatalf("QueryActiveAlarms() error = %v", err) + t.Fatalf("StreamAlarms() error = %v", err) } - var received []*pb.ActiveAlarmSnapshot + var received []*pb.AlarmFeedMessage for { - snap, err := stream.Recv() + msg, err := stream.Recv() if errors.Is(err, io.EOF) { break } if err != nil { t.Fatalf("stream.Recv() error = %v", err) } - received = append(received, snap) + received = append(received, msg) } - if len(received) != 2 { - t.Fatalf("snapshot count = %d, want 2", len(received)) + if len(received) != 3 { + t.Fatalf("message count = %d, want 3", len(received)) } - if received[0].GetAlarmFullReference() != "Tank01.Level.HiHi" { - t.Fatalf("snapshot[0] ref = %q", received[0].GetAlarmFullReference()) + if received[0].GetActiveAlarm().GetAlarmFullReference() != "Tank01.Level.HiHi" { + t.Fatalf("message[0] ref = %q", received[0].GetActiveAlarm().GetAlarmFullReference()) } - if received[1].GetCurrentState() != pb.AlarmConditionState_ALARM_CONDITION_STATE_ACTIVE_ACKED { - t.Fatalf("snapshot[1] state = %v", received[1].GetCurrentState()) + if received[1].GetActiveAlarm().GetCurrentState() != pb.AlarmConditionState_ALARM_CONDITION_STATE_ACTIVE_ACKED { + t.Fatalf("message[1] state = %v", received[1].GetActiveAlarm().GetCurrentState()) + } + if !received[2].GetSnapshotComplete() { + t.Fatalf("final message is not snapshot_complete") } } -func TestQueryActiveAlarmsPassesFilterPrefix(t *testing.T) { +func TestStreamAlarmsPassesFilterPrefix(t *testing.T) { fake := &fakeGatewayWithAlarms{} client, cleanup := newBufconnClientWithAlarms(t, fake) defer cleanup() - stream, err := client.QueryActiveAlarms(context.Background(), &pb.QueryActiveAlarmsRequest{ - SessionId: "session-1", + stream, err := client.StreamAlarms(context.Background(), &pb.StreamAlarmsRequest{ AlarmFilterPrefix: "Tank01.", }) if err != nil { - t.Fatalf("QueryActiveAlarms() error = %v", err) + t.Fatalf("StreamAlarms() error = %v", err) } for { _, err := stream.Recv() @@ -162,7 +158,7 @@ func TestQueryActiveAlarmsPassesFilterPrefix(t *testing.T) { } } - if got := fake.queryRequest.GetAlarmFilterPrefix(); got != "Tank01." { + if got := fake.streamRequest.GetAlarmFilterPrefix(); got != "Tank01." { t.Fatalf("captured filter prefix = %q", got) } } @@ -175,7 +171,7 @@ type fakeGatewayWithAlarms struct { acknowledgeError error acknowledgeAuth string - queryRequest *pb.QueryActiveAlarmsRequest + streamRequest *pb.StreamAlarmsRequest activeSnapshots []*pb.ActiveAlarmSnapshot } @@ -189,21 +185,24 @@ func (s *fakeGatewayWithAlarms) AcknowledgeAlarm(ctx context.Context, req *pb.Ac return s.acknowledgeReply, nil } return &pb.AcknowledgeAlarmReply{ - SessionId: req.GetSessionId(), ProtocolStatus: &pb.ProtocolStatus{ Code: pb.ProtocolStatusCode_PROTOCOL_STATUS_CODE_OK, }, }, nil } -func (s *fakeGatewayWithAlarms) QueryActiveAlarms(req *pb.QueryActiveAlarmsRequest, stream grpc.ServerStreamingServer[pb.ActiveAlarmSnapshot]) error { - s.queryRequest = req +func (s *fakeGatewayWithAlarms) StreamAlarms(req *pb.StreamAlarmsRequest, stream grpc.ServerStreamingServer[pb.AlarmFeedMessage]) error { + s.streamRequest = req for _, snap := range s.activeSnapshots { - if err := stream.Send(snap); err != nil { + if err := stream.Send(&pb.AlarmFeedMessage{ + Payload: &pb.AlarmFeedMessage_ActiveAlarm{ActiveAlarm: snap}, + }); err != nil { return err } } - return nil + return stream.Send(&pb.AlarmFeedMessage{ + Payload: &pb.AlarmFeedMessage_SnapshotComplete{SnapshotComplete: true}, + }) } func newBufconnClientWithAlarms(t *testing.T, fake *fakeGatewayWithAlarms) (*Client, func()) { diff --git a/clients/go/mxgateway/types.go b/clients/go/mxgateway/types.go index 05d2208..8b2b723 100644 --- a/clients/go/mxgateway/types.go +++ b/clients/go/mxgateway/types.go @@ -110,9 +110,12 @@ type ( AcknowledgeAlarmRequest = pb.AcknowledgeAlarmRequest // AcknowledgeAlarmReply is the gateway AcknowledgeAlarm reply message. AcknowledgeAlarmReply = pb.AcknowledgeAlarmReply - // QueryActiveAlarmsRequest is the gateway QueryActiveAlarms request message. - QueryActiveAlarmsRequest = pb.QueryActiveAlarmsRequest - // ActiveAlarmSnapshot is one row in a ConditionRefresh stream. + // StreamAlarmsRequest is the gateway StreamAlarms request message. + StreamAlarmsRequest = pb.StreamAlarmsRequest + // AlarmFeedMessage is one message on the StreamAlarms feed — an + // active-alarm snapshot row, a snapshot-complete sentinel, or a transition. + AlarmFeedMessage = pb.AlarmFeedMessage + // ActiveAlarmSnapshot is one currently-active alarm in the feed snapshot. ActiveAlarmSnapshot = pb.ActiveAlarmSnapshot // OnAlarmTransitionEvent is the body carried by alarm-transition MxEvents. OnAlarmTransitionEvent = pb.OnAlarmTransitionEvent @@ -126,9 +129,9 @@ type AlarmTransitionKind = pb.AlarmTransitionKind // ConditionRefresh snapshot. type AlarmConditionState = pb.AlarmConditionState -// QueryActiveAlarmsClient is the generated server-streaming client for the -// QueryActiveAlarms RPC. -type QueryActiveAlarmsClient = pb.MxAccessGateway_QueryActiveAlarmsClient +// StreamAlarmsClient is the generated server-streaming client for the +// StreamAlarms RPC. +type StreamAlarmsClient = pb.MxAccessGateway_StreamAlarmsClient // Enumerations from the generated contract re-exported for client callers. type (