@project-chip/matter.js 0.9.2 → 0.9.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/CommissioningServer.d.ts.map +1 -1
- package/dist/cjs/CommissioningServer.js +0 -1
- package/dist/cjs/CommissioningServer.js.map +2 -2
- package/dist/cjs/MatterDevice.d.ts +3 -0
- package/dist/cjs/MatterDevice.d.ts.map +1 -1
- package/dist/cjs/MatterDevice.js +21 -7
- package/dist/cjs/MatterDevice.js.map +2 -2
- package/dist/cjs/behavior/AccessControl.js +2 -2
- package/dist/cjs/behavior/AccessControl.js.map +2 -2
- package/dist/cjs/behavior/definitions/general-commissioning/ServerNodeFailsafeContext.d.ts +1 -0
- package/dist/cjs/behavior/definitions/general-commissioning/ServerNodeFailsafeContext.d.ts.map +1 -1
- package/dist/cjs/behavior/definitions/general-commissioning/ServerNodeFailsafeContext.js +14 -0
- package/dist/cjs/behavior/definitions/general-commissioning/ServerNodeFailsafeContext.js.map +2 -2
- package/dist/cjs/behavior/definitions/operational-credentials/OperationalCredentialsServer.d.ts.map +1 -1
- package/dist/cjs/behavior/definitions/operational-credentials/OperationalCredentialsServer.js +11 -2
- package/dist/cjs/behavior/definitions/operational-credentials/OperationalCredentialsServer.js.map +2 -2
- package/dist/cjs/behavior/state/transaction/Transaction.d.ts +18 -18
- package/dist/cjs/certificate/CertificateManager.d.ts.map +1 -1
- package/dist/cjs/certificate/CertificateManager.js +1 -0
- package/dist/cjs/certificate/CertificateManager.js.map +2 -2
- package/dist/cjs/certificate/CertificationDeclarationManager.d.ts +1 -1
- package/dist/cjs/certificate/CertificationDeclarationManager.d.ts.map +1 -1
- package/dist/cjs/certificate/CertificationDeclarationManager.js +3 -2
- package/dist/cjs/certificate/CertificationDeclarationManager.js.map +2 -2
- package/dist/cjs/cluster/server/AccessControlServer.js.map +1 -1
- package/dist/cjs/cluster/server/AttributeServer.d.ts +9 -0
- package/dist/cjs/cluster/server/AttributeServer.d.ts.map +1 -1
- package/dist/cjs/cluster/server/AttributeServer.js +62 -0
- package/dist/cjs/cluster/server/AttributeServer.js.map +3 -3
- package/dist/cjs/cluster/server/ClusterServer.d.ts.map +1 -1
- package/dist/cjs/cluster/server/ClusterServer.js +8 -1
- package/dist/cjs/cluster/server/ClusterServer.js.map +2 -2
- package/dist/cjs/cluster/server/ClusterServerTypes.d.ts +3 -3
- package/dist/cjs/cluster/server/ClusterServerTypes.d.ts.map +1 -1
- package/dist/cjs/cluster/server/ClusterServerTypes.js.map +1 -1
- package/dist/cjs/cluster/server/EventServer.d.ts +8 -2
- package/dist/cjs/cluster/server/EventServer.d.ts.map +1 -1
- package/dist/cjs/cluster/server/EventServer.js +33 -7
- package/dist/cjs/cluster/server/EventServer.js.map +2 -2
- package/dist/cjs/cluster/server/OperationalCredentialsServer.d.ts.map +1 -1
- package/dist/cjs/cluster/server/OperationalCredentialsServer.js +31 -8
- package/dist/cjs/cluster/server/OperationalCredentialsServer.js.map +2 -2
- package/dist/cjs/common/FailsafeContext.d.ts +1 -0
- package/dist/cjs/common/FailsafeContext.d.ts.map +1 -1
- package/dist/cjs/common/FailsafeContext.js +16 -2
- package/dist/cjs/common/FailsafeContext.js.map +2 -2
- package/dist/cjs/crypto/Crypto.d.ts +1 -1
- package/dist/cjs/crypto/Crypto.d.ts.map +1 -1
- package/dist/cjs/crypto/Crypto.js +2 -2
- package/dist/cjs/crypto/Crypto.js.map +2 -2
- package/dist/cjs/device/LegacyInteractionServer.d.ts +2 -2
- package/dist/cjs/device/LegacyInteractionServer.d.ts.map +1 -1
- package/dist/cjs/device/LegacyInteractionServer.js +13 -1
- package/dist/cjs/device/LegacyInteractionServer.js.map +2 -2
- package/dist/cjs/fabric/Fabric.d.ts +1 -0
- package/dist/cjs/fabric/Fabric.d.ts.map +1 -1
- package/dist/cjs/fabric/Fabric.js +5 -0
- package/dist/cjs/fabric/Fabric.js.map +2 -2
- package/dist/cjs/fabric/FabricManager.d.ts +1 -0
- package/dist/cjs/fabric/FabricManager.d.ts.map +1 -1
- package/dist/cjs/fabric/FabricManager.js +2 -1
- package/dist/cjs/fabric/FabricManager.js.map +2 -2
- package/dist/cjs/model/models/EventModel.d.ts +1 -0
- package/dist/cjs/model/models/EventModel.d.ts.map +1 -1
- package/dist/cjs/model/models/EventModel.js +3 -0
- package/dist/cjs/model/models/EventModel.js.map +2 -2
- package/dist/cjs/model/models/FieldModel.d.ts +1 -0
- package/dist/cjs/model/models/FieldModel.d.ts.map +1 -1
- package/dist/cjs/model/models/FieldModel.js +3 -0
- package/dist/cjs/model/models/FieldModel.js.map +2 -2
- package/dist/cjs/node/server/TransactionalInteractionServer.d.ts +2 -2
- package/dist/cjs/node/server/TransactionalInteractionServer.d.ts.map +1 -1
- package/dist/cjs/node/server/TransactionalInteractionServer.js +0 -2
- package/dist/cjs/node/server/TransactionalInteractionServer.js.map +2 -2
- package/dist/cjs/protocol/interaction/AttributeDataEncoder.d.ts +6 -3
- package/dist/cjs/protocol/interaction/AttributeDataEncoder.d.ts.map +1 -1
- package/dist/cjs/protocol/interaction/AttributeDataEncoder.js +14 -8
- package/dist/cjs/protocol/interaction/AttributeDataEncoder.js.map +2 -2
- package/dist/cjs/protocol/interaction/EventHandler.d.ts.map +1 -1
- package/dist/cjs/protocol/interaction/EventHandler.js +1 -3
- package/dist/cjs/protocol/interaction/EventHandler.js.map +2 -2
- package/dist/cjs/protocol/interaction/InteractionClient.js +1 -1
- package/dist/cjs/protocol/interaction/InteractionClient.js.map +2 -2
- package/dist/cjs/protocol/interaction/InteractionEndpointStructure.d.ts +3 -3
- package/dist/cjs/protocol/interaction/InteractionEndpointStructure.d.ts.map +1 -1
- package/dist/cjs/protocol/interaction/InteractionEndpointStructure.js +1 -0
- package/dist/cjs/protocol/interaction/InteractionEndpointStructure.js.map +2 -2
- package/dist/cjs/protocol/interaction/InteractionMessenger.d.ts +1 -1
- package/dist/cjs/protocol/interaction/InteractionMessenger.d.ts.map +1 -1
- package/dist/cjs/protocol/interaction/InteractionMessenger.js +11 -4
- package/dist/cjs/protocol/interaction/InteractionMessenger.js.map +2 -2
- package/dist/cjs/protocol/interaction/InteractionServer.d.ts +5 -6
- package/dist/cjs/protocol/interaction/InteractionServer.d.ts.map +1 -1
- package/dist/cjs/protocol/interaction/InteractionServer.js +44 -37
- package/dist/cjs/protocol/interaction/InteractionServer.js.map +2 -2
- package/dist/cjs/protocol/interaction/SubscriptionHandler.d.ts +31 -12
- package/dist/cjs/protocol/interaction/SubscriptionHandler.d.ts.map +1 -1
- package/dist/cjs/protocol/interaction/SubscriptionHandler.js +161 -69
- package/dist/cjs/protocol/interaction/SubscriptionHandler.js.map +3 -3
- package/dist/cjs/session/SecureSession.d.ts.map +1 -1
- package/dist/cjs/session/SecureSession.js +2 -1
- package/dist/cjs/session/SecureSession.js.map +2 -2
- package/dist/cjs/session/SessionManager.d.ts +2 -0
- package/dist/cjs/session/SessionManager.d.ts.map +1 -1
- package/dist/cjs/session/SessionManager.js +7 -0
- package/dist/cjs/session/SessionManager.js.map +2 -2
- package/dist/cjs/tlv/TlvArray.d.ts +2 -2
- package/dist/cjs/tlv/TlvArray.d.ts.map +1 -1
- package/dist/cjs/tlv/TlvArray.js +2 -2
- package/dist/cjs/tlv/TlvArray.js.map +2 -2
- package/dist/cjs/tlv/TlvNullable.d.ts +2 -2
- package/dist/cjs/tlv/TlvNullable.d.ts.map +1 -1
- package/dist/cjs/tlv/TlvNullable.js +2 -2
- package/dist/cjs/tlv/TlvNullable.js.map +2 -2
- package/dist/cjs/tlv/TlvObject.d.ts +2 -2
- package/dist/cjs/tlv/TlvObject.d.ts.map +1 -1
- package/dist/cjs/tlv/TlvObject.js +18 -12
- package/dist/cjs/tlv/TlvObject.js.map +2 -2
- package/dist/cjs/tlv/TlvSchema.d.ts +14 -2
- package/dist/cjs/tlv/TlvSchema.d.ts.map +1 -1
- package/dist/cjs/tlv/TlvSchema.js +2 -2
- package/dist/cjs/tlv/TlvSchema.js.map +2 -2
- package/dist/cjs/tlv/TlvWrapper.d.ts +2 -2
- package/dist/cjs/tlv/TlvWrapper.d.ts.map +1 -1
- package/dist/cjs/tlv/TlvWrapper.js +2 -2
- package/dist/cjs/tlv/TlvWrapper.js.map +2 -2
- package/dist/esm/CommissioningServer.d.ts.map +1 -1
- package/dist/esm/CommissioningServer.js +0 -1
- package/dist/esm/CommissioningServer.js.map +2 -2
- package/dist/esm/MatterDevice.d.ts +3 -0
- package/dist/esm/MatterDevice.d.ts.map +1 -1
- package/dist/esm/MatterDevice.js +21 -7
- package/dist/esm/MatterDevice.js.map +2 -2
- package/dist/esm/behavior/AccessControl.js +2 -2
- package/dist/esm/behavior/AccessControl.js.map +2 -2
- package/dist/esm/behavior/definitions/general-commissioning/ServerNodeFailsafeContext.d.ts +1 -0
- package/dist/esm/behavior/definitions/general-commissioning/ServerNodeFailsafeContext.d.ts.map +1 -1
- package/dist/esm/behavior/definitions/general-commissioning/ServerNodeFailsafeContext.js +15 -1
- package/dist/esm/behavior/definitions/general-commissioning/ServerNodeFailsafeContext.js.map +2 -2
- package/dist/esm/behavior/definitions/operational-credentials/OperationalCredentialsServer.d.ts.map +1 -1
- package/dist/esm/behavior/definitions/operational-credentials/OperationalCredentialsServer.js +11 -2
- package/dist/esm/behavior/definitions/operational-credentials/OperationalCredentialsServer.js.map +2 -2
- package/dist/esm/behavior/state/transaction/Transaction.d.ts +18 -18
- package/dist/esm/certificate/CertificateManager.d.ts.map +1 -1
- package/dist/esm/certificate/CertificateManager.js +1 -0
- package/dist/esm/certificate/CertificateManager.js.map +2 -2
- package/dist/esm/certificate/CertificationDeclarationManager.d.ts +1 -1
- package/dist/esm/certificate/CertificationDeclarationManager.d.ts.map +1 -1
- package/dist/esm/certificate/CertificationDeclarationManager.js +3 -2
- package/dist/esm/certificate/CertificationDeclarationManager.js.map +2 -2
- package/dist/esm/cluster/server/AccessControlServer.js.map +1 -1
- package/dist/esm/cluster/server/AttributeServer.d.ts +9 -0
- package/dist/esm/cluster/server/AttributeServer.d.ts.map +1 -1
- package/dist/esm/cluster/server/AttributeServer.js +69 -1
- package/dist/esm/cluster/server/AttributeServer.js.map +2 -2
- package/dist/esm/cluster/server/ClusterServer.d.ts.map +1 -1
- package/dist/esm/cluster/server/ClusterServer.js +9 -2
- package/dist/esm/cluster/server/ClusterServer.js.map +2 -2
- package/dist/esm/cluster/server/ClusterServerTypes.d.ts +3 -3
- package/dist/esm/cluster/server/ClusterServerTypes.d.ts.map +1 -1
- package/dist/esm/cluster/server/ClusterServerTypes.js.map +1 -1
- package/dist/esm/cluster/server/EventServer.d.ts +8 -2
- package/dist/esm/cluster/server/EventServer.d.ts.map +1 -1
- package/dist/esm/cluster/server/EventServer.js +33 -7
- package/dist/esm/cluster/server/EventServer.js.map +2 -2
- package/dist/esm/cluster/server/OperationalCredentialsServer.d.ts.map +1 -1
- package/dist/esm/cluster/server/OperationalCredentialsServer.js +31 -8
- package/dist/esm/cluster/server/OperationalCredentialsServer.js.map +2 -2
- package/dist/esm/common/FailsafeContext.d.ts +1 -0
- package/dist/esm/common/FailsafeContext.d.ts.map +1 -1
- package/dist/esm/common/FailsafeContext.js +17 -3
- package/dist/esm/common/FailsafeContext.js.map +2 -2
- package/dist/esm/crypto/Crypto.d.ts +1 -1
- package/dist/esm/crypto/Crypto.d.ts.map +1 -1
- package/dist/esm/crypto/Crypto.js +2 -2
- package/dist/esm/crypto/Crypto.js.map +2 -2
- package/dist/esm/device/LegacyInteractionServer.d.ts +2 -2
- package/dist/esm/device/LegacyInteractionServer.d.ts.map +1 -1
- package/dist/esm/device/LegacyInteractionServer.js +13 -1
- package/dist/esm/device/LegacyInteractionServer.js.map +2 -2
- package/dist/esm/fabric/Fabric.d.ts +1 -0
- package/dist/esm/fabric/Fabric.d.ts.map +1 -1
- package/dist/esm/fabric/Fabric.js +5 -0
- package/dist/esm/fabric/Fabric.js.map +2 -2
- package/dist/esm/fabric/FabricManager.d.ts +1 -0
- package/dist/esm/fabric/FabricManager.d.ts.map +1 -1
- package/dist/esm/fabric/FabricManager.js +2 -1
- package/dist/esm/fabric/FabricManager.js.map +2 -2
- package/dist/esm/model/models/EventModel.d.ts +1 -0
- package/dist/esm/model/models/EventModel.d.ts.map +1 -1
- package/dist/esm/model/models/EventModel.js +3 -0
- package/dist/esm/model/models/EventModel.js.map +2 -2
- package/dist/esm/model/models/FieldModel.d.ts +1 -0
- package/dist/esm/model/models/FieldModel.d.ts.map +1 -1
- package/dist/esm/model/models/FieldModel.js +3 -0
- package/dist/esm/model/models/FieldModel.js.map +2 -2
- package/dist/esm/node/server/TransactionalInteractionServer.d.ts +2 -2
- package/dist/esm/node/server/TransactionalInteractionServer.d.ts.map +1 -1
- package/dist/esm/node/server/TransactionalInteractionServer.js +0 -2
- package/dist/esm/node/server/TransactionalInteractionServer.js.map +2 -2
- package/dist/esm/protocol/interaction/AttributeDataEncoder.d.ts +6 -3
- package/dist/esm/protocol/interaction/AttributeDataEncoder.d.ts.map +1 -1
- package/dist/esm/protocol/interaction/AttributeDataEncoder.js +14 -8
- package/dist/esm/protocol/interaction/AttributeDataEncoder.js.map +2 -2
- package/dist/esm/protocol/interaction/EventHandler.d.ts.map +1 -1
- package/dist/esm/protocol/interaction/EventHandler.js +1 -3
- package/dist/esm/protocol/interaction/EventHandler.js.map +2 -2
- package/dist/esm/protocol/interaction/InteractionClient.js +1 -1
- package/dist/esm/protocol/interaction/InteractionClient.js.map +2 -2
- package/dist/esm/protocol/interaction/InteractionEndpointStructure.d.ts +3 -3
- package/dist/esm/protocol/interaction/InteractionEndpointStructure.d.ts.map +1 -1
- package/dist/esm/protocol/interaction/InteractionEndpointStructure.js +1 -0
- package/dist/esm/protocol/interaction/InteractionEndpointStructure.js.map +2 -2
- package/dist/esm/protocol/interaction/InteractionMessenger.d.ts +1 -1
- package/dist/esm/protocol/interaction/InteractionMessenger.d.ts.map +1 -1
- package/dist/esm/protocol/interaction/InteractionMessenger.js +11 -4
- package/dist/esm/protocol/interaction/InteractionMessenger.js.map +2 -2
- package/dist/esm/protocol/interaction/InteractionServer.d.ts +5 -6
- package/dist/esm/protocol/interaction/InteractionServer.d.ts.map +1 -1
- package/dist/esm/protocol/interaction/InteractionServer.js +44 -37
- package/dist/esm/protocol/interaction/InteractionServer.js.map +2 -2
- package/dist/esm/protocol/interaction/SubscriptionHandler.d.ts +31 -12
- package/dist/esm/protocol/interaction/SubscriptionHandler.d.ts.map +1 -1
- package/dist/esm/protocol/interaction/SubscriptionHandler.js +161 -69
- package/dist/esm/protocol/interaction/SubscriptionHandler.js.map +3 -3
- package/dist/esm/session/SecureSession.d.ts.map +1 -1
- package/dist/esm/session/SecureSession.js +2 -1
- package/dist/esm/session/SecureSession.js.map +2 -2
- package/dist/esm/session/SessionManager.d.ts +2 -0
- package/dist/esm/session/SessionManager.d.ts.map +1 -1
- package/dist/esm/session/SessionManager.js +7 -0
- package/dist/esm/session/SessionManager.js.map +2 -2
- package/dist/esm/tlv/TlvArray.d.ts +2 -2
- package/dist/esm/tlv/TlvArray.d.ts.map +1 -1
- package/dist/esm/tlv/TlvArray.js +2 -2
- package/dist/esm/tlv/TlvArray.js.map +2 -2
- package/dist/esm/tlv/TlvNullable.d.ts +2 -2
- package/dist/esm/tlv/TlvNullable.d.ts.map +1 -1
- package/dist/esm/tlv/TlvNullable.js +2 -2
- package/dist/esm/tlv/TlvNullable.js.map +2 -2
- package/dist/esm/tlv/TlvObject.d.ts +2 -2
- package/dist/esm/tlv/TlvObject.d.ts.map +1 -1
- package/dist/esm/tlv/TlvObject.js +19 -13
- package/dist/esm/tlv/TlvObject.js.map +2 -2
- package/dist/esm/tlv/TlvSchema.d.ts +14 -2
- package/dist/esm/tlv/TlvSchema.d.ts.map +1 -1
- package/dist/esm/tlv/TlvSchema.js +2 -2
- package/dist/esm/tlv/TlvSchema.js.map +2 -2
- package/dist/esm/tlv/TlvWrapper.d.ts +2 -2
- package/dist/esm/tlv/TlvWrapper.d.ts.map +1 -1
- package/dist/esm/tlv/TlvWrapper.js +2 -2
- package/dist/esm/tlv/TlvWrapper.js.map +2 -2
- package/package.json +3 -3
- package/src/CommissioningServer.ts +0 -1
- package/src/MatterDevice.ts +34 -7
- package/src/behavior/AccessControl.ts +2 -2
- package/src/behavior/definitions/general-commissioning/ServerNodeFailsafeContext.ts +21 -1
- package/src/behavior/definitions/operational-credentials/OperationalCredentialsServer.ts +13 -0
- package/src/certificate/CertificateManager.ts +1 -2
- package/src/certificate/CertificationDeclarationManager.ts +2 -2
- package/src/cluster/server/AccessControlServer.ts +3 -3
- package/src/cluster/server/AttributeServer.ts +79 -1
- package/src/cluster/server/ClusterServer.ts +9 -2
- package/src/cluster/server/ClusterServerTypes.ts +3 -3
- package/src/cluster/server/EventServer.ts +57 -10
- package/src/cluster/server/OperationalCredentialsServer.ts +35 -5
- package/src/common/FailsafeContext.ts +19 -7
- package/src/crypto/Crypto.ts +1 -1
- package/src/device/LegacyInteractionServer.ts +15 -4
- package/src/fabric/Fabric.ts +6 -0
- package/src/fabric/FabricManager.ts +1 -0
- package/src/model/models/EventModel.ts +4 -0
- package/src/model/models/FieldModel.ts +4 -0
- package/src/node/server/TransactionalInteractionServer.ts +2 -4
- package/src/protocol/interaction/AttributeDataEncoder.ts +20 -9
- package/src/protocol/interaction/EventHandler.ts +1 -3
- package/src/protocol/interaction/InteractionClient.ts +1 -1
- package/src/protocol/interaction/InteractionEndpointStructure.ts +4 -4
- package/src/protocol/interaction/InteractionMessenger.ts +12 -3
- package/src/protocol/interaction/InteractionServer.ts +53 -52
- package/src/protocol/interaction/SubscriptionHandler.ts +215 -92
- package/src/session/SecureSession.ts +2 -1
- package/src/session/SessionManager.ts +9 -0
- package/src/tlv/TlvArray.ts +3 -3
- package/src/tlv/TlvNullable.ts +3 -3
- package/src/tlv/TlvObject.ts +20 -14
- package/src/tlv/TlvSchema.ts +17 -3
- package/src/tlv/TlvWrapper.ts +3 -3
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/protocol/interaction/InteractionMessenger.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * @license\n * Copyright 2022-2024 Matter.js Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { MatterController } from \"../../MatterController.js\";\nimport { MatterDevice } from \"../../MatterDevice.js\";\nimport { Message, SessionType } from \"../../codec/MessageCodec.js\";\nimport {\n ImplementationError,\n MatterFlowError,\n NotImplementedError,\n UnexpectedDataError,\n} from \"../../common/MatterError.js\";\nimport { tryCatchAsync } from \"../../common/TryCatchHandler.js\";\nimport { Logger } from \"../../log/Logger.js\";\nimport { ExchangeProvider } from \"../../protocol/ExchangeManager.js\";\nimport {\n ExchangeSendOptions,\n MessageExchange,\n RetransmissionLimitReachedError,\n UnexpectedMessageError,\n} from \"../../protocol/MessageExchange.js\";\nimport { TlvAny } from \"../../tlv/TlvAny.js\";\nimport { TlvSchema, TypeFromSchema } from \"../../tlv/TlvSchema.js\";\nimport { ByteArray } from \"../../util/ByteArray.js\";\nimport {\n DataReportPayload,\n canAttributePayloadBeChunked,\n chunkAttributePayload,\n encodeAttributePayload,\n encodeEventPayload,\n} from \"./AttributeDataEncoder.js\";\nimport {\n TlvAttributeReport,\n TlvDataReport,\n TlvDataReportForSend,\n TlvEventReport,\n TlvInvokeRequest,\n TlvInvokeResponse,\n TlvReadRequest,\n TlvStatusResponse,\n TlvSubscribeRequest,\n TlvSubscribeResponse,\n TlvTimedRequest,\n TlvWriteRequest,\n TlvWriteResponse,\n} from \"./InteractionProtocol.js\";\nimport { INTERACTION_MODEL_REVISION } from \"./InteractionServer.js\";\nimport { StatusCode, StatusResponseError } from \"./StatusCode.js\";\n\nexport enum MessageType {\n StatusResponse = 0x01,\n ReadRequest = 0x02,\n SubscribeRequest = 0x03,\n SubscribeResponse = 0x04,\n ReportData = 0x05,\n WriteRequest = 0x06,\n WriteResponse = 0x07,\n InvokeCommandRequest = 0x08,\n InvokeCommandResponse = 0x09,\n TimedRequest = 0x0a,\n}\n\nexport type ReadRequest = TypeFromSchema<typeof TlvReadRequest>;\nexport type DataReport = TypeFromSchema<typeof TlvDataReport>;\nexport type SubscribeRequest = TypeFromSchema<typeof TlvSubscribeRequest>;\nexport type SubscribeResponse = TypeFromSchema<typeof TlvSubscribeResponse>;\nexport type InvokeRequest = TypeFromSchema<typeof TlvInvokeRequest>;\nexport type InvokeResponse = TypeFromSchema<typeof TlvInvokeResponse>;\nexport type TimedRequest = TypeFromSchema<typeof TlvTimedRequest>;\nexport type WriteRequest = TypeFromSchema<typeof TlvWriteRequest>;\nexport type WriteResponse = TypeFromSchema<typeof TlvWriteResponse>;\n\nconst MAX_SPDU_LENGTH = 1024;\n\nconst logger = Logger.get(\"InteractionMessenger\");\n\nclass InteractionMessenger<ContextT> {\n constructor(protected exchange: MessageExchange<ContextT>) {}\n\n async send(messageType: number, payload: ByteArray, options?: ExchangeSendOptions) {\n return this.exchange.send(messageType, payload, options);\n }\n\n sendStatus(status: StatusCode) {\n return this.send(\n MessageType.StatusResponse,\n TlvStatusResponse.encode({ status, interactionModelRevision: INTERACTION_MODEL_REVISION }),\n );\n }\n\n async waitForSuccess() {\n // If the status is not Success, this would throw an Error.\n await this.nextMessage(MessageType.StatusResponse);\n }\n\n async nextMessage(expectedMessageType?: number) {\n const message = await this.exchange.nextMessage();\n const messageType = message.payloadHeader.messageType;\n this.throwIfErrorStatusMessage(message);\n if (expectedMessageType !== undefined && messageType !== expectedMessageType) {\n throw new UnexpectedDataError(\n `Received unexpected message type: ${messageType}, expected: ${expectedMessageType}`,\n );\n }\n return message;\n }\n\n async close() {\n await this.exchange.close();\n }\n\n protected throwIfErrorStatusMessage(message: Message) {\n const {\n payloadHeader: { messageType },\n payload,\n } = message;\n\n if (messageType !== MessageType.StatusResponse) return;\n const { status } = TlvStatusResponse.decode(payload);\n if (status !== StatusCode.Success) throw new StatusResponseError(`Received error status: ${status}`, status);\n }\n\n getExchangeChannelName() {\n return this.exchange.channel.name;\n }\n}\n\nexport interface InteractionRecipient {\n handleReadRequest(\n exchange: MessageExchange<MatterDevice>,\n request: ReadRequest,\n message: Message,\n ): Promise<DataReport>;\n handleWriteRequest(\n exchange: MessageExchange<MatterDevice>,\n request: WriteRequest,\n message: Message,\n ): Promise<WriteResponse>;\n handleSubscribeRequest(\n exchange: MessageExchange<MatterDevice>,\n request: SubscribeRequest,\n messenger: InteractionServerMessenger,\n message: Message,\n ): Promise<void>;\n handleInvokeRequest(\n exchange: MessageExchange<MatterDevice>,\n request: InvokeRequest,\n message: Message,\n ): Promise<InvokeResponse>;\n handleTimedRequest(exchange: MessageExchange<MatterDevice>, request: TimedRequest, message: Message): void;\n}\n\nexport class InteractionServerMessenger extends InteractionMessenger<MatterDevice> {\n async handleRequest(recipient: InteractionRecipient) {\n let continueExchange = true; // are more messages expected in this \"transaction\"?\n try {\n while (continueExchange) {\n const message = await this.exchange.nextMessage();\n const isGroupSession = message.packetHeader.sessionType === SessionType.Group;\n continueExchange = false;\n switch (message.payloadHeader.messageType) {\n case MessageType.ReadRequest: {\n const readRequest = TlvReadRequest.decode(message.payload);\n await this.sendDataReport(\n await recipient.handleReadRequest(this.exchange, readRequest, message),\n );\n break;\n }\n case MessageType.WriteRequest: {\n const writeRequest = TlvWriteRequest.decode(message.payload);\n const { suppressResponse } = writeRequest;\n const writeResponse = await recipient.handleWriteRequest(this.exchange, writeRequest, message);\n if (!suppressResponse && !isGroupSession) {\n await this.send(MessageType.WriteResponse, TlvWriteResponse.encode(writeResponse));\n }\n break;\n }\n case MessageType.SubscribeRequest: {\n const subscribeRequest = TlvSubscribeRequest.decode(message.payload);\n await recipient.handleSubscribeRequest(this.exchange, subscribeRequest, this, message);\n // response is sent by handler\n break;\n }\n case MessageType.InvokeCommandRequest: {\n const invokeRequest = TlvInvokeRequest.decode(message.payload);\n const { suppressResponse } = invokeRequest;\n const invokeResponse = await recipient.handleInvokeRequest(\n this.exchange,\n invokeRequest,\n message,\n );\n if (!suppressResponse && !isGroupSession) {\n await this.send(\n MessageType.InvokeCommandResponse,\n TlvInvokeResponse.encode(invokeResponse),\n );\n }\n // TODO Also invoke could need continueExchange depending on requirements\n break;\n }\n case MessageType.TimedRequest: {\n const timedRequest = TlvTimedRequest.decode(message.payload);\n recipient.handleTimedRequest(this.exchange, timedRequest, message);\n await this.sendStatus(StatusCode.Success);\n continueExchange = true;\n break;\n }\n default:\n throw new NotImplementedError(`Unsupported message type ${message.payloadHeader.messageType}`);\n }\n }\n } catch (error: any) {\n if (error instanceof StatusResponseError) {\n logger.info(`Sending status response ${error.code} for interaction error: ${error.message}`);\n await this.sendStatus(error.code);\n } else {\n logger.error(error);\n await this.sendStatus(StatusCode.Failure);\n }\n } finally {\n await this.exchange.close();\n }\n }\n\n /**\n * Handle DataReportPayload with the content of a DataReport to send, split them into multiple DataReport\n * messages and send them out based on the size.\n */\n async sendDataReport(dataReportPayload: DataReportPayload) {\n const {\n subscriptionId,\n attributeReportsPayload,\n eventReportsPayload,\n suppressResponse,\n interactionModelRevision,\n } = dataReportPayload;\n const dataReport: TypeFromSchema<typeof TlvDataReportForSend> = {\n subscriptionId,\n suppressResponse,\n interactionModelRevision,\n attributeReports: undefined,\n eventReports: undefined,\n };\n\n if (attributeReportsPayload !== undefined || eventReportsPayload !== undefined) {\n const attributeReportsToSend = [...(attributeReportsPayload ?? [])];\n const eventReportsToSend = [...(eventReportsPayload ?? [])];\n\n dataReport.moreChunkedMessages = true; // Assume we have multiple chunks, also for size calculation\n const emptyDataReportBytes = TlvDataReportForSend.encode(dataReport);\n\n let firstAttributeAddedToReportMessage = false;\n let firstEventAddedToReportMessage = false;\n const sendAndResetReport = async () => {\n await this.sendDataReportMessage(dataReport);\n dataReport.attributeReports = undefined;\n dataReport.eventReports = undefined;\n messageSize = emptyDataReportBytes.length;\n firstAttributeAddedToReportMessage = false;\n firstEventAddedToReportMessage = false;\n };\n\n let messageSize = emptyDataReportBytes.length;\n while (true) {\n if (attributeReportsToSend.length > 0) {\n const attributeReport = attributeReportsToSend.shift();\n if (attributeReport !== undefined) {\n if (!firstAttributeAddedToReportMessage) {\n firstAttributeAddedToReportMessage = true;\n messageSize += 3; // Array element is added now which needs 3 bytes\n }\n const encodedAttribute = encodeAttributePayload(attributeReport);\n const attributeReportBytes = TlvAny.getEncodedByteLength(encodedAttribute);\n if (messageSize + attributeReportBytes > MAX_SPDU_LENGTH) {\n if (canAttributePayloadBeChunked(attributeReport)) {\n // Attribute is a non-empty array: chunk it and add the chunks to the beginning of the queue\n attributeReportsToSend.unshift(...chunkAttributePayload(attributeReport));\n continue;\n }\n await sendAndResetReport();\n }\n messageSize += attributeReportBytes;\n if (dataReport.attributeReports === undefined) dataReport.attributeReports = [];\n dataReport.attributeReports.push(encodedAttribute);\n }\n } else if (eventReportsToSend.length > 0) {\n const eventReport = eventReportsToSend.shift();\n if (eventReport === undefined) {\n // No more chunks to send\n dataReport.moreChunkedMessages = undefined;\n break;\n }\n if (!firstEventAddedToReportMessage) {\n firstEventAddedToReportMessage = true;\n messageSize += 3; // Array element is added now which needs 3 bytes\n }\n const encodedEvent = encodeEventPayload(eventReport);\n const eventReportBytes = TlvAny.getEncodedByteLength(encodedEvent);\n if (messageSize + eventReportBytes > MAX_SPDU_LENGTH) {\n await sendAndResetReport();\n }\n messageSize += eventReportBytes;\n if (dataReport.eventReports === undefined) dataReport.eventReports = [];\n dataReport.eventReports.push(encodedEvent);\n } else {\n // No more chunks to send\n dataReport.moreChunkedMessages = undefined;\n break;\n }\n }\n }\n\n await this.sendDataReportMessage(dataReport);\n }\n\n async sendDataReportMessage(dataReport: TypeFromSchema<typeof TlvDataReportForSend>) {\n const encodedMessage = TlvDataReportForSend.encode(dataReport);\n if (encodedMessage.length > MAX_SPDU_LENGTH) {\n throw new MatterFlowError(\n `DataReport is too long to fit in a single chunk, This should not happen! Data: ${Logger.toJSON(\n dataReport,\n )}`,\n );\n }\n logger.debug(\n `Sending DataReport chunk with ${dataReport.attributeReports?.length ?? 0} attributes and ${\n dataReport.eventReports?.length ?? 0\n } events: ${encodedMessage.length} bytes`,\n );\n\n if (dataReport.suppressResponse) {\n // We do not expect a response other than a Standalone Ack, so if we receive anything else, we throw an error\n await tryCatchAsync(\n async () =>\n await this.exchange.send(MessageType.ReportData, encodedMessage, {\n expectAckOnly: true,\n }),\n UnexpectedMessageError,\n async error => {\n const { receivedMessage } = error;\n this.throwIfErrorStatusMessage(receivedMessage);\n },\n );\n } else {\n await this.exchange.send(MessageType.ReportData, encodedMessage);\n await this.waitForSuccess();\n }\n }\n}\n\nexport class IncomingInteractionClientMessenger extends InteractionMessenger<MatterController> {\n async readDataReport(): Promise<DataReport> {\n let subscriptionId: number | undefined;\n const attributeValues: TypeFromSchema<typeof TlvAttributeReport>[] = [];\n const eventValues: TypeFromSchema<typeof TlvEventReport>[] = [];\n\n while (true) {\n const dataReportMessage = await this.exchange.waitFor(MessageType.ReportData);\n const report = TlvDataReport.decode(dataReportMessage.payload);\n if (subscriptionId === undefined && report.subscriptionId !== undefined) {\n subscriptionId = report.subscriptionId;\n } else if (\n (subscriptionId !== undefined || report.subscriptionId !== undefined) &&\n report.subscriptionId !== subscriptionId\n ) {\n throw new UnexpectedDataError(`Invalid subscription ID ${report.subscriptionId} received`);\n }\n\n if (Array.isArray(report.attributeReports) && report.attributeReports.length > 0) {\n attributeValues.push(...report.attributeReports);\n }\n if (Array.isArray(report.eventReports) && report.eventReports.length > 0) {\n eventValues.push(...report.eventReports);\n }\n if (!report.moreChunkedMessages) {\n report.attributeReports = attributeValues;\n report.eventReports = eventValues;\n return report;\n }\n\n await this.sendStatus(StatusCode.Success);\n }\n }\n}\n\nexport class InteractionClientMessenger extends IncomingInteractionClientMessenger {\n constructor(private readonly exchangeProvider: ExchangeProvider) {\n super(exchangeProvider.initiateExchange());\n }\n\n /** Implements a send method with an automatic reconnection mechanism */\n override async send(messageType: number, payload: ByteArray, options?: ExchangeSendOptions) {\n if (this.exchange.channel.closed) {\n throw new ImplementationError(\"The exchange channel is closed. Please connect the device first.\");\n }\n try {\n return await this.exchange.send(messageType, payload, options);\n } catch (error) {\n // When retransmission failed (most likely due to a lost connection or invalid session),\n // try to reconnect if possible and resend the message once\n if (error instanceof RetransmissionLimitReachedError) {\n await this.exchange.close();\n if (await this.exchangeProvider.reconnectChannel()) {\n this.exchange = this.exchangeProvider.initiateExchange();\n return await this.exchange.send(messageType, payload);\n }\n }\n throw error;\n }\n }\n\n sendReadRequest(readRequest: ReadRequest) {\n return this.request(\n MessageType.ReadRequest,\n TlvReadRequest,\n MessageType.ReportData,\n TlvDataReport,\n readRequest,\n );\n }\n\n async sendSubscribeRequest(subscribeRequest: SubscribeRequest) {\n await this.send(MessageType.SubscribeRequest, TlvSubscribeRequest.encode(subscribeRequest));\n\n const report = await this.readDataReport();\n const { subscriptionId } = report;\n\n if (subscriptionId === undefined) {\n throw new UnexpectedDataError(`Subscription ID not provided in report`);\n }\n\n await this.sendStatus(StatusCode.Success);\n\n const subscribeResponseMessage = await this.nextMessage(MessageType.SubscribeResponse);\n const subscribeResponse = TlvSubscribeResponse.decode(subscribeResponseMessage.payload);\n\n if (subscribeResponse.subscriptionId !== subscriptionId) {\n throw new MatterFlowError(\n `Received subscription ID ${subscribeResponse.subscriptionId} instead of ${subscriptionId}`,\n );\n }\n\n return {\n subscribeResponse,\n report,\n };\n }\n\n async sendInvokeCommand(invokeRequest: InvokeRequest, minimumResponseTimeoutMs?: number) {\n if (invokeRequest.suppressResponse) {\n await this.requestWithSuppressedResponse(\n MessageType.InvokeCommandRequest,\n TlvInvokeRequest,\n invokeRequest,\n minimumResponseTimeoutMs,\n );\n } else {\n return await this.request(\n MessageType.InvokeCommandRequest,\n TlvInvokeRequest,\n MessageType.InvokeCommandResponse,\n TlvInvokeResponse,\n invokeRequest,\n minimumResponseTimeoutMs,\n );\n }\n }\n\n async sendWriteCommand(writeRequest: WriteRequest) {\n if (writeRequest.suppressResponse) {\n await this.requestWithSuppressedResponse(MessageType.WriteRequest, TlvWriteRequest, writeRequest);\n } else {\n return await this.request(\n MessageType.WriteRequest,\n TlvWriteRequest,\n MessageType.WriteResponse,\n TlvWriteResponse,\n writeRequest,\n );\n }\n }\n\n sendTimedRequest(timeoutSeconds: number) {\n return this.request(MessageType.TimedRequest, TlvTimedRequest, MessageType.StatusResponse, TlvStatusResponse, {\n timeout: timeoutSeconds,\n interactionModelRevision: INTERACTION_MODEL_REVISION,\n });\n }\n\n private async requestWithSuppressedResponse<RequestT>(\n requestMessageType: number,\n requestSchema: TlvSchema<RequestT>,\n request: RequestT,\n minimumResponseTimeoutMs?: number,\n ): Promise<void> {\n await this.send(requestMessageType, requestSchema.encode(request), {\n expectAckOnly: true,\n minimumResponseTimeoutMs,\n });\n }\n\n private async request<RequestT, ResponseT>(\n requestMessageType: number,\n requestSchema: TlvSchema<RequestT>,\n responseMessageType: number,\n responseSchema: TlvSchema<ResponseT>,\n request: RequestT,\n minimumResponseTimeoutMs?: number,\n ): Promise<ResponseT> {\n await this.send(requestMessageType, requestSchema.encode(request), {\n expectAckOnly: false,\n minimumResponseTimeoutMs,\n });\n const responseMessage = await this.nextMessage(responseMessageType);\n return responseSchema.decode(responseMessage.payload);\n }\n}\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAQA,0BAAqC;AACrC,yBAKO;AACP,6BAA8B;AAC9B,oBAAuB;AAEvB,6BAKO;AACP,oBAAuB;AAGvB,kCAMO;AACP,iCAcO;AACP,+BAA2C;AAC3C,wBAAgD;AAlDhD;AAAA;AAAA;AAAA;AAAA;AAoDO,IAAK,cAAL,kBAAKA,iBAAL;AACH,EAAAA,0BAAA,oBAAiB,KAAjB;AACA,EAAAA,0BAAA,iBAAc,KAAd;AACA,EAAAA,0BAAA,sBAAmB,KAAnB;AACA,EAAAA,0BAAA,uBAAoB,KAApB;AACA,EAAAA,0BAAA,gBAAa,KAAb;AACA,EAAAA,0BAAA,kBAAe,KAAf;AACA,EAAAA,0BAAA,mBAAgB,KAAhB;AACA,EAAAA,0BAAA,0BAAuB,KAAvB;AACA,EAAAA,0BAAA,2BAAwB,KAAxB;AACA,EAAAA,0BAAA,kBAAe,MAAf;AAVQ,SAAAA;AAAA,GAAA;AAuBZ,MAAM,kBAAkB;AAExB,MAAM,SAAS,qBAAO,IAAI,sBAAsB;AAEhD,MAAM,qBAA+B;AAAA,EACjC,YAAsB,UAAqC;AAArC;AAAA,EAAsC;AAAA,EAE5D,MAAM,KAAK,aAAqB,SAAoB,SAA+B;AAC/E,WAAO,KAAK,SAAS,KAAK,aAAa,SAAS,OAAO;AAAA,EAC3D;AAAA,EAEA,WAAW,QAAoB;AAC3B,WAAO,KAAK;AAAA,MACR;AAAA,MACA,6CAAkB,OAAO,EAAE,QAAQ,0BAA0B,oDAA2B,CAAC;AAAA,IAC7F;AAAA,EACJ;AAAA,EAEA,MAAM,iBAAiB;AAEnB,UAAM,KAAK,YAAY,sBAA0B;AAAA,EACrD;AAAA,EAEA,MAAM,YAAY,qBAA8B;AAC5C,UAAM,UAAU,MAAM,KAAK,SAAS,YAAY;AAChD,UAAM,cAAc,QAAQ,cAAc;AAC1C,SAAK,0BAA0B,OAAO;AACtC,QAAI,wBAAwB,UAAa,gBAAgB,qBAAqB;AAC1E,YAAM,IAAI;AAAA,QACN,qCAAqC,WAAW,eAAe,mBAAmB;AAAA,MACtF;AAAA,IACJ;AACA,WAAO;AAAA,EACX;AAAA,EAEA,MAAM,QAAQ;AACV,UAAM,KAAK,SAAS,MAAM;AAAA,EAC9B;AAAA,EAEU,0BAA0B,SAAkB;AAClD,UAAM;AAAA,MACF,eAAe,EAAE,YAAY;AAAA,MAC7B;AAAA,IACJ,IAAI;AAEJ,QAAI,gBAAgB,uBAA4B;AAChD,UAAM,EAAE,OAAO,IAAI,6CAAkB,OAAO,OAAO;AACnD,QAAI,WAAW,6BAAW,QAAS,OAAM,IAAI,sCAAoB,0BAA0B,MAAM,IAAI,MAAM;AAAA,EAC/G;AAAA,EAEA,yBAAyB;AACrB,WAAO,KAAK,SAAS,QAAQ;AAAA,EACjC;AACJ;AA2BO,MAAM,mCAAmC,qBAAmC;AAAA,EAC/E,MAAM,cAAc,WAAiC;AACjD,QAAI,mBAAmB;AACvB,QAAI;AACA,aAAO,kBAAkB;AACrB,cAAM,UAAU,MAAM,KAAK,SAAS,YAAY;AAChD,cAAM,iBAAiB,QAAQ,aAAa,gBAAgB,gCAAY;AACxE,2BAAmB;AACnB,gBAAQ,QAAQ,cAAc,aAAa;AAAA,UACvC,KAAK,qBAAyB;AAC1B,kBAAM,cAAc,0CAAe,OAAO,QAAQ,OAAO;AACzD,kBAAM,KAAK;AAAA,cACP,MAAM,UAAU,kBAAkB,KAAK,UAAU,aAAa,OAAO;AAAA,
|
|
4
|
+
"sourcesContent": ["/**\n * @license\n * Copyright 2022-2024 Matter.js Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { MatterController } from \"../../MatterController.js\";\nimport { MatterDevice } from \"../../MatterDevice.js\";\nimport { Message, SessionType } from \"../../codec/MessageCodec.js\";\nimport {\n ImplementationError,\n MatterFlowError,\n NotImplementedError,\n UnexpectedDataError,\n} from \"../../common/MatterError.js\";\nimport { tryCatchAsync } from \"../../common/TryCatchHandler.js\";\nimport { Logger } from \"../../log/Logger.js\";\nimport { ExchangeProvider } from \"../../protocol/ExchangeManager.js\";\nimport {\n ExchangeSendOptions,\n MessageExchange,\n RetransmissionLimitReachedError,\n UnexpectedMessageError,\n} from \"../../protocol/MessageExchange.js\";\nimport { TlvAny } from \"../../tlv/TlvAny.js\";\nimport { TlvSchema, TypeFromSchema } from \"../../tlv/TlvSchema.js\";\nimport { ByteArray } from \"../../util/ByteArray.js\";\nimport {\n DataReportPayload,\n canAttributePayloadBeChunked,\n chunkAttributePayload,\n encodeAttributePayload,\n encodeEventPayload,\n} from \"./AttributeDataEncoder.js\";\nimport {\n TlvAttributeReport,\n TlvDataReport,\n TlvDataReportForSend,\n TlvEventReport,\n TlvInvokeRequest,\n TlvInvokeResponse,\n TlvReadRequest,\n TlvStatusResponse,\n TlvSubscribeRequest,\n TlvSubscribeResponse,\n TlvTimedRequest,\n TlvWriteRequest,\n TlvWriteResponse,\n} from \"./InteractionProtocol.js\";\nimport { INTERACTION_MODEL_REVISION } from \"./InteractionServer.js\";\nimport { StatusCode, StatusResponseError } from \"./StatusCode.js\";\n\nexport enum MessageType {\n StatusResponse = 0x01,\n ReadRequest = 0x02,\n SubscribeRequest = 0x03,\n SubscribeResponse = 0x04,\n ReportData = 0x05,\n WriteRequest = 0x06,\n WriteResponse = 0x07,\n InvokeCommandRequest = 0x08,\n InvokeCommandResponse = 0x09,\n TimedRequest = 0x0a,\n}\n\nexport type ReadRequest = TypeFromSchema<typeof TlvReadRequest>;\nexport type DataReport = TypeFromSchema<typeof TlvDataReport>;\nexport type SubscribeRequest = TypeFromSchema<typeof TlvSubscribeRequest>;\nexport type SubscribeResponse = TypeFromSchema<typeof TlvSubscribeResponse>;\nexport type InvokeRequest = TypeFromSchema<typeof TlvInvokeRequest>;\nexport type InvokeResponse = TypeFromSchema<typeof TlvInvokeResponse>;\nexport type TimedRequest = TypeFromSchema<typeof TlvTimedRequest>;\nexport type WriteRequest = TypeFromSchema<typeof TlvWriteRequest>;\nexport type WriteResponse = TypeFromSchema<typeof TlvWriteResponse>;\n\nconst MAX_SPDU_LENGTH = 1024;\n\nconst logger = Logger.get(\"InteractionMessenger\");\n\nclass InteractionMessenger<ContextT> {\n constructor(protected exchange: MessageExchange<ContextT>) {}\n\n async send(messageType: number, payload: ByteArray, options?: ExchangeSendOptions) {\n return this.exchange.send(messageType, payload, options);\n }\n\n sendStatus(status: StatusCode) {\n return this.send(\n MessageType.StatusResponse,\n TlvStatusResponse.encode({ status, interactionModelRevision: INTERACTION_MODEL_REVISION }),\n );\n }\n\n async waitForSuccess() {\n // If the status is not Success, this would throw an Error.\n await this.nextMessage(MessageType.StatusResponse);\n }\n\n async nextMessage(expectedMessageType?: number) {\n const message = await this.exchange.nextMessage();\n const messageType = message.payloadHeader.messageType;\n this.throwIfErrorStatusMessage(message);\n if (expectedMessageType !== undefined && messageType !== expectedMessageType) {\n throw new UnexpectedDataError(\n `Received unexpected message type: ${messageType}, expected: ${expectedMessageType}`,\n );\n }\n return message;\n }\n\n async close() {\n await this.exchange.close();\n }\n\n protected throwIfErrorStatusMessage(message: Message) {\n const {\n payloadHeader: { messageType },\n payload,\n } = message;\n\n if (messageType !== MessageType.StatusResponse) return;\n const { status } = TlvStatusResponse.decode(payload);\n if (status !== StatusCode.Success) throw new StatusResponseError(`Received error status: ${status}`, status);\n }\n\n getExchangeChannelName() {\n return this.exchange.channel.name;\n }\n}\n\nexport interface InteractionRecipient {\n handleReadRequest(\n exchange: MessageExchange<MatterDevice>,\n request: ReadRequest,\n message: Message,\n ): Promise<DataReport>;\n handleWriteRequest(\n exchange: MessageExchange<MatterDevice>,\n request: WriteRequest,\n message: Message,\n ): Promise<WriteResponse>;\n handleSubscribeRequest(\n exchange: MessageExchange<MatterDevice>,\n request: SubscribeRequest,\n messenger: InteractionServerMessenger,\n message: Message,\n ): Promise<void>;\n handleInvokeRequest(\n exchange: MessageExchange<MatterDevice>,\n request: InvokeRequest,\n message: Message,\n ): Promise<InvokeResponse>;\n handleTimedRequest(exchange: MessageExchange<MatterDevice>, request: TimedRequest, message: Message): void;\n}\n\nexport class InteractionServerMessenger extends InteractionMessenger<MatterDevice> {\n async handleRequest(recipient: InteractionRecipient) {\n let continueExchange = true; // are more messages expected in this \"transaction\"?\n try {\n while (continueExchange) {\n const message = await this.exchange.nextMessage();\n const isGroupSession = message.packetHeader.sessionType === SessionType.Group;\n continueExchange = false;\n switch (message.payloadHeader.messageType) {\n case MessageType.ReadRequest: {\n const readRequest = TlvReadRequest.decode(message.payload);\n await this.sendDataReport(\n await recipient.handleReadRequest(this.exchange, readRequest, message),\n readRequest.isFabricFiltered,\n );\n break;\n }\n case MessageType.WriteRequest: {\n const writeRequest = TlvWriteRequest.decode(message.payload);\n const { suppressResponse } = writeRequest;\n const writeResponse = await recipient.handleWriteRequest(this.exchange, writeRequest, message);\n if (!suppressResponse && !isGroupSession) {\n await this.send(MessageType.WriteResponse, TlvWriteResponse.encode(writeResponse));\n }\n break;\n }\n case MessageType.SubscribeRequest: {\n const subscribeRequest = TlvSubscribeRequest.decode(message.payload);\n await recipient.handleSubscribeRequest(this.exchange, subscribeRequest, this, message);\n // response is sent by handler\n break;\n }\n case MessageType.InvokeCommandRequest: {\n const invokeRequest = TlvInvokeRequest.decode(message.payload);\n const { suppressResponse } = invokeRequest;\n const invokeResponse = await recipient.handleInvokeRequest(\n this.exchange,\n invokeRequest,\n message,\n );\n if (!suppressResponse && !isGroupSession) {\n await this.send(\n MessageType.InvokeCommandResponse,\n TlvInvokeResponse.encode(invokeResponse),\n );\n }\n // TODO Also invoke could need continueExchange depending on requirements\n break;\n }\n case MessageType.TimedRequest: {\n const timedRequest = TlvTimedRequest.decode(message.payload);\n recipient.handleTimedRequest(this.exchange, timedRequest, message);\n await this.sendStatus(StatusCode.Success);\n continueExchange = true;\n break;\n }\n default:\n throw new NotImplementedError(`Unsupported message type ${message.payloadHeader.messageType}`);\n }\n }\n } catch (error: any) {\n if (error instanceof StatusResponseError) {\n logger.info(`Sending status response ${error.code} for interaction error: ${error.message}`);\n await this.sendStatus(error.code);\n } else {\n logger.error(error);\n await this.sendStatus(StatusCode.Failure);\n }\n } finally {\n await this.exchange.close();\n }\n }\n\n /**\n * Handle DataReportPayload with the content of a DataReport to send, split them into multiple DataReport\n * messages and send them out based on the size.\n */\n async sendDataReport(dataReportPayload: DataReportPayload, forFabricFilteredRead: boolean) {\n const {\n subscriptionId,\n attributeReportsPayload,\n eventReportsPayload,\n suppressResponse,\n interactionModelRevision,\n } = dataReportPayload;\n const dataReport: TypeFromSchema<typeof TlvDataReportForSend> = {\n subscriptionId,\n suppressResponse,\n interactionModelRevision,\n attributeReports: undefined,\n eventReports: undefined,\n };\n\n if (attributeReportsPayload !== undefined || eventReportsPayload !== undefined) {\n const attributeReportsToSend = [...(attributeReportsPayload ?? [])];\n const eventReportsToSend = [...(eventReportsPayload ?? [])];\n\n dataReport.moreChunkedMessages = true; // Assume we have multiple chunks, also for size calculation\n const emptyDataReportBytes = TlvDataReportForSend.encode(dataReport);\n\n let firstAttributeAddedToReportMessage = false;\n let firstEventAddedToReportMessage = false;\n const sendAndResetReport = async () => {\n await this.sendDataReportMessage(dataReport);\n dataReport.attributeReports = undefined;\n dataReport.eventReports = undefined;\n messageSize = emptyDataReportBytes.length;\n firstAttributeAddedToReportMessage = false;\n firstEventAddedToReportMessage = false;\n };\n\n let messageSize = emptyDataReportBytes.length;\n while (true) {\n if (attributeReportsToSend.length > 0) {\n const attributeReport = attributeReportsToSend.shift();\n if (attributeReport !== undefined) {\n if (!firstAttributeAddedToReportMessage) {\n firstAttributeAddedToReportMessage = true;\n messageSize += 3; // Array element is added now which needs 3 bytes\n }\n const allowMissingFieldsForNonFabricFilteredRead =\n !forFabricFilteredRead && attributeReport.hasFabricSensitiveData;\n const encodedAttribute = encodeAttributePayload(attributeReport, {\n allowMissingFieldsForNonFabricFilteredRead,\n });\n const attributeReportBytes = TlvAny.getEncodedByteLength(encodedAttribute);\n if (messageSize + attributeReportBytes > MAX_SPDU_LENGTH) {\n if (canAttributePayloadBeChunked(attributeReport)) {\n // Attribute is a non-empty array: chunk it and add the chunks to the beginning of the queue\n attributeReportsToSend.unshift(...chunkAttributePayload(attributeReport));\n continue;\n }\n await sendAndResetReport();\n }\n messageSize += attributeReportBytes;\n if (dataReport.attributeReports === undefined) dataReport.attributeReports = [];\n dataReport.attributeReports.push(encodedAttribute);\n }\n } else if (eventReportsToSend.length > 0) {\n const eventReport = eventReportsToSend.shift();\n if (eventReport === undefined) {\n // No more chunks to send\n dataReport.moreChunkedMessages = undefined;\n break;\n }\n if (!firstEventAddedToReportMessage) {\n firstEventAddedToReportMessage = true;\n messageSize += 3; // Array element is added now which needs 3 bytes\n }\n const allowMissingFieldsForNonFabricFilteredRead =\n !forFabricFilteredRead && eventReport.hasFabricSensitiveData;\n const encodedEvent = encodeEventPayload(eventReport, {\n allowMissingFieldsForNonFabricFilteredRead,\n });\n const eventReportBytes = TlvAny.getEncodedByteLength(encodedEvent);\n if (messageSize + eventReportBytes > MAX_SPDU_LENGTH) {\n await sendAndResetReport();\n }\n messageSize += eventReportBytes;\n if (dataReport.eventReports === undefined) dataReport.eventReports = [];\n dataReport.eventReports.push(encodedEvent);\n } else {\n // No more chunks to send\n dataReport.moreChunkedMessages = undefined;\n break;\n }\n }\n }\n\n await this.sendDataReportMessage(dataReport);\n }\n\n async sendDataReportMessage(dataReport: TypeFromSchema<typeof TlvDataReportForSend>) {\n const encodedMessage = TlvDataReportForSend.encode(dataReport);\n if (encodedMessage.length > MAX_SPDU_LENGTH) {\n throw new MatterFlowError(\n `DataReport is too long to fit in a single chunk, This should not happen! Data: ${Logger.toJSON(\n dataReport,\n )}`,\n );\n }\n logger.debug(\n `Sending DataReport chunk with ${dataReport.attributeReports?.length ?? 0} attributes and ${\n dataReport.eventReports?.length ?? 0\n } events: ${encodedMessage.length} bytes`,\n );\n\n if (dataReport.suppressResponse) {\n // We do not expect a response other than a Standalone Ack, so if we receive anything else, we throw an error\n await tryCatchAsync(\n async () =>\n await this.exchange.send(MessageType.ReportData, encodedMessage, {\n expectAckOnly: true,\n }),\n UnexpectedMessageError,\n async error => {\n const { receivedMessage } = error;\n this.throwIfErrorStatusMessage(receivedMessage);\n },\n );\n } else {\n await this.exchange.send(MessageType.ReportData, encodedMessage);\n await this.waitForSuccess();\n }\n }\n}\n\nexport class IncomingInteractionClientMessenger extends InteractionMessenger<MatterController> {\n async readDataReport(): Promise<DataReport> {\n let subscriptionId: number | undefined;\n const attributeValues: TypeFromSchema<typeof TlvAttributeReport>[] = [];\n const eventValues: TypeFromSchema<typeof TlvEventReport>[] = [];\n\n while (true) {\n const dataReportMessage = await this.exchange.waitFor(MessageType.ReportData);\n const report = TlvDataReport.decode(dataReportMessage.payload);\n if (subscriptionId === undefined && report.subscriptionId !== undefined) {\n subscriptionId = report.subscriptionId;\n } else if (\n (subscriptionId !== undefined || report.subscriptionId !== undefined) &&\n report.subscriptionId !== subscriptionId\n ) {\n throw new UnexpectedDataError(`Invalid subscription ID ${report.subscriptionId} received`);\n }\n\n if (Array.isArray(report.attributeReports) && report.attributeReports.length > 0) {\n attributeValues.push(...report.attributeReports);\n }\n if (Array.isArray(report.eventReports) && report.eventReports.length > 0) {\n eventValues.push(...report.eventReports);\n }\n if (!report.moreChunkedMessages) {\n report.attributeReports = attributeValues;\n report.eventReports = eventValues;\n return report;\n }\n\n await this.sendStatus(StatusCode.Success);\n }\n }\n}\n\nexport class InteractionClientMessenger extends IncomingInteractionClientMessenger {\n constructor(private readonly exchangeProvider: ExchangeProvider) {\n super(exchangeProvider.initiateExchange());\n }\n\n /** Implements a send method with an automatic reconnection mechanism */\n override async send(messageType: number, payload: ByteArray, options?: ExchangeSendOptions) {\n if (this.exchange.channel.closed) {\n throw new ImplementationError(\"The exchange channel is closed. Please connect the device first.\");\n }\n try {\n return await this.exchange.send(messageType, payload, options);\n } catch (error) {\n // When retransmission failed (most likely due to a lost connection or invalid session),\n // try to reconnect if possible and resend the message once\n if (error instanceof RetransmissionLimitReachedError) {\n await this.exchange.close();\n if (await this.exchangeProvider.reconnectChannel()) {\n this.exchange = this.exchangeProvider.initiateExchange();\n return await this.exchange.send(messageType, payload);\n }\n }\n throw error;\n }\n }\n\n sendReadRequest(readRequest: ReadRequest) {\n return this.request(\n MessageType.ReadRequest,\n TlvReadRequest,\n MessageType.ReportData,\n TlvDataReport,\n readRequest,\n );\n }\n\n async sendSubscribeRequest(subscribeRequest: SubscribeRequest) {\n await this.send(MessageType.SubscribeRequest, TlvSubscribeRequest.encode(subscribeRequest));\n\n const report = await this.readDataReport();\n const { subscriptionId } = report;\n\n if (subscriptionId === undefined) {\n throw new UnexpectedDataError(`Subscription ID not provided in report`);\n }\n\n await this.sendStatus(StatusCode.Success);\n\n const subscribeResponseMessage = await this.nextMessage(MessageType.SubscribeResponse);\n const subscribeResponse = TlvSubscribeResponse.decode(subscribeResponseMessage.payload);\n\n if (subscribeResponse.subscriptionId !== subscriptionId) {\n throw new MatterFlowError(\n `Received subscription ID ${subscribeResponse.subscriptionId} instead of ${subscriptionId}`,\n );\n }\n\n return {\n subscribeResponse,\n report,\n };\n }\n\n async sendInvokeCommand(invokeRequest: InvokeRequest, minimumResponseTimeoutMs?: number) {\n if (invokeRequest.suppressResponse) {\n await this.requestWithSuppressedResponse(\n MessageType.InvokeCommandRequest,\n TlvInvokeRequest,\n invokeRequest,\n minimumResponseTimeoutMs,\n );\n } else {\n return await this.request(\n MessageType.InvokeCommandRequest,\n TlvInvokeRequest,\n MessageType.InvokeCommandResponse,\n TlvInvokeResponse,\n invokeRequest,\n minimumResponseTimeoutMs,\n );\n }\n }\n\n async sendWriteCommand(writeRequest: WriteRequest) {\n if (writeRequest.suppressResponse) {\n await this.requestWithSuppressedResponse(MessageType.WriteRequest, TlvWriteRequest, writeRequest);\n } else {\n return await this.request(\n MessageType.WriteRequest,\n TlvWriteRequest,\n MessageType.WriteResponse,\n TlvWriteResponse,\n writeRequest,\n );\n }\n }\n\n sendTimedRequest(timeoutSeconds: number) {\n return this.request(MessageType.TimedRequest, TlvTimedRequest, MessageType.StatusResponse, TlvStatusResponse, {\n timeout: timeoutSeconds,\n interactionModelRevision: INTERACTION_MODEL_REVISION,\n });\n }\n\n private async requestWithSuppressedResponse<RequestT>(\n requestMessageType: number,\n requestSchema: TlvSchema<RequestT>,\n request: RequestT,\n minimumResponseTimeoutMs?: number,\n ): Promise<void> {\n await this.send(requestMessageType, requestSchema.encode(request), {\n expectAckOnly: true,\n minimumResponseTimeoutMs,\n });\n }\n\n private async request<RequestT, ResponseT>(\n requestMessageType: number,\n requestSchema: TlvSchema<RequestT>,\n responseMessageType: number,\n responseSchema: TlvSchema<ResponseT>,\n request: RequestT,\n minimumResponseTimeoutMs?: number,\n ): Promise<ResponseT> {\n await this.send(requestMessageType, requestSchema.encode(request), {\n expectAckOnly: false,\n minimumResponseTimeoutMs,\n });\n const responseMessage = await this.nextMessage(responseMessageType);\n return responseSchema.decode(responseMessage.payload);\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["MessageType"]
|
|
7
7
|
}
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
import { MatterDevice } from "../../MatterDevice.js";
|
|
7
7
|
import { AnyAttributeServer, AttributeServer } from "../../cluster/server/AttributeServer.js";
|
|
8
8
|
import { CommandServer } from "../../cluster/server/CommandServer.js";
|
|
9
|
-
import {
|
|
9
|
+
import { AnyEventServer } from "../../cluster/server/EventServer.js";
|
|
10
10
|
import { Message } from "../../codec/MessageCodec.js";
|
|
11
11
|
import { AttributeId } from "../../datatype/AttributeId.js";
|
|
12
12
|
import { ClusterId } from "../../datatype/ClusterId.js";
|
|
@@ -17,7 +17,6 @@ import { NodeId } from "../../datatype/NodeId.js";
|
|
|
17
17
|
import { EndpointInterface } from "../../endpoint/EndpointInterface.js";
|
|
18
18
|
import { MessageExchange } from "../../protocol/MessageExchange.js";
|
|
19
19
|
import { ProtocolHandler } from "../../protocol/ProtocolHandler.js";
|
|
20
|
-
import { EventHandler } from "../../protocol/interaction/EventHandler.js";
|
|
21
20
|
import { TypeFromSchema } from "../../tlv/TlvSchema.js";
|
|
22
21
|
import { DataReportPayload } from "./AttributeDataEncoder.js";
|
|
23
22
|
import { InteractionEndpointStructure } from "./InteractionEndpointStructure.js";
|
|
@@ -48,6 +47,7 @@ export interface EventPath {
|
|
|
48
47
|
endpointId: EndpointNumber;
|
|
49
48
|
clusterId: ClusterId;
|
|
50
49
|
eventId: EventId;
|
|
50
|
+
isUrgent?: boolean;
|
|
51
51
|
}
|
|
52
52
|
export interface AttributeWithPath {
|
|
53
53
|
path: AttributePath;
|
|
@@ -55,7 +55,7 @@ export interface AttributeWithPath {
|
|
|
55
55
|
}
|
|
56
56
|
export interface EventWithPath {
|
|
57
57
|
path: EventPath;
|
|
58
|
-
event:
|
|
58
|
+
event: AnyEventServer<any, any>;
|
|
59
59
|
}
|
|
60
60
|
export interface CommandWithPath {
|
|
61
61
|
path: CommandPath;
|
|
@@ -73,7 +73,7 @@ export declare function validateReadEventPath(path: TypeFromSchema<typeof TlvEve
|
|
|
73
73
|
*/
|
|
74
74
|
export declare class InteractionServer implements ProtocolHandler<MatterDevice>, InteractionRecipient {
|
|
75
75
|
#private;
|
|
76
|
-
constructor({ subscriptionOptions,
|
|
76
|
+
constructor({ subscriptionOptions, endpointStructure }: InteractionServer.Configuration);
|
|
77
77
|
getId(): number;
|
|
78
78
|
protected get isClosing(): boolean;
|
|
79
79
|
onNewExchange(exchange: MessageExchange<MatterDevice>): Promise<void>;
|
|
@@ -82,7 +82,7 @@ export declare class InteractionServer implements ProtocolHandler<MatterDevice>,
|
|
|
82
82
|
version: number;
|
|
83
83
|
value: any;
|
|
84
84
|
}>;
|
|
85
|
-
protected readEvent(_path: EventPath, eventFilters: TypeFromSchema<typeof TlvEventFilter>[] | undefined, event:
|
|
85
|
+
protected readEvent(_path: EventPath, eventFilters: TypeFromSchema<typeof TlvEventFilter>[] | undefined, event: AnyEventServer<any, any>, exchange: MessageExchange<MatterDevice>, isFabricFiltered: boolean, message: Message, _endpoint: EndpointInterface): Promise<import("./EventHandler.js").EventStorageData<any>[]>;
|
|
86
86
|
handleWriteRequest(exchange: MessageExchange<MatterDevice>, { suppressResponse, timedRequest, writeRequests, interactionModelRevision, moreChunkedMessages }: WriteRequest, message: Message): Promise<WriteResponse>;
|
|
87
87
|
protected writeAttribute(_path: AttributePath, attribute: AttributeServer<any>, value: any, exchange: MessageExchange<MatterDevice>, message: Message, _endpoint: EndpointInterface, _receivedWithinTimedInteraction?: boolean, isListWrite?: boolean): Promise<void>;
|
|
88
88
|
handleSubscribeRequest(exchange: MessageExchange<MatterDevice>, { minIntervalFloorSeconds, maxIntervalCeilingSeconds, attributeRequests, dataVersionFilters, eventRequests, eventFilters, keepSubscriptions, isFabricFiltered, interactionModelRevision, }: SubscribeRequest, messenger: InteractionServerMessenger, message: Message): Promise<void>;
|
|
@@ -99,7 +99,6 @@ export declare class InteractionServer implements ProtocolHandler<MatterDevice>,
|
|
|
99
99
|
export declare namespace InteractionServer {
|
|
100
100
|
interface Configuration {
|
|
101
101
|
readonly subscriptionOptions?: SubscriptionOptions;
|
|
102
|
-
readonly eventHandler: EventHandler;
|
|
103
102
|
readonly endpointStructure: InteractionEndpointStructure;
|
|
104
103
|
}
|
|
105
104
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"InteractionServer.d.ts","sourceRoot":"","sources":["../../../../src/protocol/interaction/InteractionServer.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAErD,OAAO,EACH,kBAAkB,EAClB,eAAe,EAElB,MAAM,yCAAyC,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,uCAAuC,CAAC;AACtE,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"InteractionServer.d.ts","sourceRoot":"","sources":["../../../../src/protocol/interaction/InteractionServer.ts"],"names":[],"mappings":"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"}
|
|
@@ -140,14 +140,12 @@ class InteractionServer {
|
|
|
140
140
|
#subscriptionMap = /* @__PURE__ */ new Map();
|
|
141
141
|
#isClosing = false;
|
|
142
142
|
#subscriptionConfig;
|
|
143
|
-
|
|
144
|
-
constructor({ subscriptionOptions, eventHandler, endpointStructure }) {
|
|
143
|
+
constructor({ subscriptionOptions, endpointStructure }) {
|
|
145
144
|
this.#subscriptionConfig = import_SubscriptionOptions.SubscriptionOptions.configurationFor(subscriptionOptions);
|
|
146
|
-
this.#eventHandler = eventHandler;
|
|
147
145
|
this.#endpointStructure = endpointStructure;
|
|
148
|
-
this.#endpointStructure.change.on(() => {
|
|
146
|
+
this.#endpointStructure.change.on(async () => {
|
|
149
147
|
for (const subscription of this.#subscriptionMap.values()) {
|
|
150
|
-
subscription.updateSubscription();
|
|
148
|
+
await subscription.updateSubscription();
|
|
151
149
|
}
|
|
152
150
|
});
|
|
153
151
|
}
|
|
@@ -223,6 +221,7 @@ class InteractionServer {
|
|
|
223
221
|
`Error reading attribute from ${exchange.channel.name}: ${this.#endpointStructure.resolveAttributeName(requestPath)}: unsupported path: Status=${error.code}`
|
|
224
222
|
);
|
|
225
223
|
attributeReportsPayload.push({
|
|
224
|
+
hasFabricSensitiveData: false,
|
|
226
225
|
attributeStatus: { path: requestPath, status: { status: error.code } }
|
|
227
226
|
});
|
|
228
227
|
}
|
|
@@ -273,6 +272,7 @@ class InteractionServer {
|
|
|
273
272
|
);
|
|
274
273
|
const { schema } = attribute;
|
|
275
274
|
attributeReportsPayload.push({
|
|
275
|
+
hasFabricSensitiveData: attribute.hasFabricSensitiveData,
|
|
276
276
|
attributeData: { path, dataVersion: version, payload: value, schema }
|
|
277
277
|
});
|
|
278
278
|
} catch (error) {
|
|
@@ -282,7 +282,10 @@ class InteractionServer {
|
|
|
282
282
|
);
|
|
283
283
|
if (error instanceof import_StatusCode.StatusResponseError) {
|
|
284
284
|
if (isConcreteAttributePath(requestPath)) {
|
|
285
|
-
attributeReportsPayload.push({
|
|
285
|
+
attributeReportsPayload.push({
|
|
286
|
+
hasFabricSensitiveData: false,
|
|
287
|
+
attributeStatus: { path, status: { status: error.code } }
|
|
288
|
+
});
|
|
286
289
|
}
|
|
287
290
|
} else {
|
|
288
291
|
throw error;
|
|
@@ -318,6 +321,7 @@ class InteractionServer {
|
|
|
318
321
|
`Read event from ${exchange.channel.name}: ${this.#endpointStructure.resolveEventName(requestPath)}: unsupported path: Status=${error.code}`
|
|
319
322
|
);
|
|
320
323
|
eventReportsPayload?.push({
|
|
324
|
+
hasFabricSensitiveData: false,
|
|
321
325
|
eventStatus: { path: requestPath, status: { status: error.code } }
|
|
322
326
|
});
|
|
323
327
|
}
|
|
@@ -346,6 +350,7 @@ class InteractionServer {
|
|
|
346
350
|
const { schema } = event;
|
|
347
351
|
reportsForPath.push(
|
|
348
352
|
...matchingEvents.map(({ eventNumber, priority, epochTimestamp, data }) => ({
|
|
353
|
+
hasFabricSensitiveData: event.hasFabricSensitiveData,
|
|
349
354
|
eventData: {
|
|
350
355
|
path,
|
|
351
356
|
eventNumber,
|
|
@@ -363,7 +368,10 @@ class InteractionServer {
|
|
|
363
368
|
);
|
|
364
369
|
if (error instanceof import_StatusCode.StatusResponseError) {
|
|
365
370
|
if (isConcreteEventPath(requestPath)) {
|
|
366
|
-
eventReportsPayload?.push({
|
|
371
|
+
eventReportsPayload?.push({
|
|
372
|
+
hasFabricSensitiveData: false,
|
|
373
|
+
eventStatus: { path, status: { status: error.code } }
|
|
374
|
+
});
|
|
367
375
|
}
|
|
368
376
|
} else {
|
|
369
377
|
throw error;
|
|
@@ -702,42 +710,39 @@ class InteractionServer {
|
|
|
702
710
|
}
|
|
703
711
|
if (this.#nextSubscriptionId === 4294967295) this.#nextSubscriptionId = 0;
|
|
704
712
|
const subscriptionId = this.#nextSubscriptionId++;
|
|
705
|
-
const subscriptionHandler = new import_SubscriptionHandler.SubscriptionHandler(
|
|
713
|
+
const subscriptionHandler = new import_SubscriptionHandler.SubscriptionHandler({
|
|
706
714
|
subscriptionId,
|
|
707
715
|
session,
|
|
708
|
-
this.#endpointStructure,
|
|
716
|
+
endpointStructure: this.#endpointStructure,
|
|
709
717
|
attributeRequests,
|
|
710
718
|
dataVersionFilters,
|
|
711
719
|
eventRequests,
|
|
712
720
|
eventFilters,
|
|
713
|
-
this.#eventHandler,
|
|
714
721
|
isFabricFiltered,
|
|
715
|
-
minIntervalFloorSeconds,
|
|
716
|
-
maxIntervalCeilingSeconds,
|
|
717
|
-
() => this.#subscriptionMap.delete(subscriptionId),
|
|
718
|
-
this.#subscriptionConfig
|
|
719
|
-
|
|
722
|
+
minIntervalFloor: minIntervalFloorSeconds,
|
|
723
|
+
maxIntervalCeiling: maxIntervalCeilingSeconds,
|
|
724
|
+
cancelCallback: () => this.#subscriptionMap.delete(subscriptionId),
|
|
725
|
+
subscriptionOptions: this.#subscriptionConfig,
|
|
726
|
+
readAttribute: (path, attribute) => this.readAttribute(
|
|
727
|
+
path,
|
|
728
|
+
attribute,
|
|
729
|
+
exchange,
|
|
730
|
+
isFabricFiltered,
|
|
731
|
+
message,
|
|
732
|
+
this.#endpointStructure.getEndpoint(path.endpointId)
|
|
733
|
+
),
|
|
734
|
+
readEvent: (path, event, eventFilters2) => this.readEvent(
|
|
735
|
+
path,
|
|
736
|
+
eventFilters2,
|
|
737
|
+
event,
|
|
738
|
+
exchange,
|
|
739
|
+
isFabricFiltered,
|
|
740
|
+
message,
|
|
741
|
+
this.#endpointStructure.getEndpoint(path.endpointId)
|
|
742
|
+
)
|
|
743
|
+
});
|
|
720
744
|
try {
|
|
721
|
-
await subscriptionHandler.sendInitialReport(
|
|
722
|
-
messenger,
|
|
723
|
-
(path, attribute) => this.readAttribute(
|
|
724
|
-
path,
|
|
725
|
-
attribute,
|
|
726
|
-
exchange,
|
|
727
|
-
isFabricFiltered,
|
|
728
|
-
message,
|
|
729
|
-
this.#endpointStructure.getEndpoint(path.endpointId)
|
|
730
|
-
),
|
|
731
|
-
(path, event, eventFilters2) => this.readEvent(
|
|
732
|
-
path,
|
|
733
|
-
eventFilters2,
|
|
734
|
-
event,
|
|
735
|
-
exchange,
|
|
736
|
-
isFabricFiltered,
|
|
737
|
-
message,
|
|
738
|
-
this.#endpointStructure.getEndpoint(path.endpointId)
|
|
739
|
-
)
|
|
740
|
-
);
|
|
745
|
+
await subscriptionHandler.sendInitialReport(messenger);
|
|
741
746
|
} catch (error) {
|
|
742
747
|
logger.error(
|
|
743
748
|
`Subscription ${subscriptionId} for Session ${session.id}: Error while sending initial data reports`,
|
|
@@ -752,8 +757,10 @@ class InteractionServer {
|
|
|
752
757
|
return;
|
|
753
758
|
}
|
|
754
759
|
if (!keepSubscriptions) {
|
|
755
|
-
logger.debug(
|
|
756
|
-
|
|
760
|
+
logger.debug(
|
|
761
|
+
`Clear subscriptions for Subscriber node ${session.peerNodeId} because keepSubscriptions=false`
|
|
762
|
+
);
|
|
763
|
+
await session.context.clearSubscriptionsForNode(fabric.fabricIndex, session.peerNodeId, true);
|
|
757
764
|
}
|
|
758
765
|
const maxInterval = subscriptionHandler.getMaxInterval();
|
|
759
766
|
logger.info(
|