@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": "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
|
|
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": "AAAA;AAAA;AAAA;AAAA;AAAA;AAQA,SAAkB,mBAAmB;AACrC;AAAA,EACI;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACG;AACP,SAAS,qBAAqB;AAC9B,SAAS,cAAc;AAEvB;AAAA,EAGI;AAAA,EACA;AAAA,OACG;AACP,SAAS,cAAc;AAGvB;AAAA,EAEI;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACG;AACP;AAAA,EAEI;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACG;AACP,SAAS,kCAAkC;AAC3C,SAAS,YAAY,2BAA2B;AAEzC,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,OAAO,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,kBAAkB,OAAO,EAAE,QAAQ,0BAA0B,2BAA2B,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,kBAAkB,OAAO,OAAO;AACnD,QAAI,WAAW,WAAW,QAAS,OAAM,IAAI,oBAAoB,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,YAAY;AACxE,2BAAmB;AACnB,gBAAQ,QAAQ,cAAc,aAAa;AAAA,UACvC,KAAK,qBAAyB;AAC1B,kBAAM,cAAc,eAAe,OAAO,QAAQ,OAAO;AACzD,kBAAM,KAAK;AAAA,cACP,MAAM,UAAU,kBAAkB,KAAK,UAAU,aAAa,OAAO;AAAA,cACrE,YAAY;AAAA,YAChB;AACA;AAAA,UACJ;AAAA,UACA,KAAK,sBAA0B;AAC3B,kBAAM,eAAe,gBAAgB,OAAO,QAAQ,OAAO;AAC3D,kBAAM,EAAE,iBAAiB,IAAI;AAC7B,kBAAM,gBAAgB,MAAM,UAAU,mBAAmB,KAAK,UAAU,cAAc,OAAO;AAC7F,gBAAI,CAAC,oBAAoB,CAAC,gBAAgB;AACtC,oBAAM,KAAK,KAAK,uBAA2B,iBAAiB,OAAO,aAAa,CAAC;AAAA,YACrF;AACA;AAAA,UACJ;AAAA,UACA,KAAK,0BAA8B;AAC/B,kBAAM,mBAAmB,oBAAoB,OAAO,QAAQ,OAAO;AACnE,kBAAM,UAAU,uBAAuB,KAAK,UAAU,kBAAkB,MAAM,OAAO;AAErF;AAAA,UACJ;AAAA,UACA,KAAK,8BAAkC;AACnC,kBAAM,gBAAgB,iBAAiB,OAAO,QAAQ,OAAO;AAC7D,kBAAM,EAAE,iBAAiB,IAAI;AAC7B,kBAAM,iBAAiB,MAAM,UAAU;AAAA,cACnC,KAAK;AAAA,cACL;AAAA,cACA;AAAA,YACJ;AACA,gBAAI,CAAC,oBAAoB,CAAC,gBAAgB;AACtC,oBAAM,KAAK;AAAA,gBACP;AAAA,gBACA,kBAAkB,OAAO,cAAc;AAAA,cAC3C;AAAA,YACJ;AAEA;AAAA,UACJ;AAAA,UACA,KAAK,uBAA0B;AAC3B,kBAAM,eAAe,gBAAgB,OAAO,QAAQ,OAAO;AAC3D,sBAAU,mBAAmB,KAAK,UAAU,cAAc,OAAO;AACjE,kBAAM,KAAK,WAAW,WAAW,OAAO;AACxC,+BAAmB;AACnB;AAAA,UACJ;AAAA,UACA;AACI,kBAAM,IAAI,oBAAoB,4BAA4B,QAAQ,cAAc,WAAW,EAAE;AAAA,QACrG;AAAA,MACJ;AAAA,IACJ,SAAS,OAAY;AACjB,UAAI,iBAAiB,qBAAqB;AACtC,eAAO,KAAK,2BAA2B,MAAM,IAAI,2BAA2B,MAAM,OAAO,EAAE;AAC3F,cAAM,KAAK,WAAW,MAAM,IAAI;AAAA,MACpC,OAAO;AACH,eAAO,MAAM,KAAK;AAClB,cAAM,KAAK,WAAW,WAAW,OAAO;AAAA,MAC5C;AAAA,IACJ,UAAE;AACE,YAAM,KAAK,SAAS,MAAM;AAAA,IAC9B;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,eAAe,mBAAsC,uBAAgC;AACvF,UAAM;AAAA,MACF;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACJ,IAAI;AACJ,UAAM,aAA0D;AAAA,MAC5D;AAAA,MACA;AAAA,MACA;AAAA,MACA,kBAAkB;AAAA,MAClB,cAAc;AAAA,IAClB;AAEA,QAAI,4BAA4B,UAAa,wBAAwB,QAAW;AAC5E,YAAM,yBAAyB,CAAC,GAAI,2BAA2B,CAAC,CAAE;AAClE,YAAM,qBAAqB,CAAC,GAAI,uBAAuB,CAAC,CAAE;AAE1D,iBAAW,sBAAsB;AACjC,YAAM,uBAAuB,qBAAqB,OAAO,UAAU;AAEnE,UAAI,qCAAqC;AACzC,UAAI,iCAAiC;AACrC,YAAM,qBAAqB,YAAY;AACnC,cAAM,KAAK,sBAAsB,UAAU;AAC3C,mBAAW,mBAAmB;AAC9B,mBAAW,eAAe;AAC1B,sBAAc,qBAAqB;AACnC,6CAAqC;AACrC,yCAAiC;AAAA,MACrC;AAEA,UAAI,cAAc,qBAAqB;AACvC,aAAO,MAAM;AACT,YAAI,uBAAuB,SAAS,GAAG;AACnC,gBAAM,kBAAkB,uBAAuB,MAAM;AACrD,cAAI,oBAAoB,QAAW;AAC/B,gBAAI,CAAC,oCAAoC;AACrC,mDAAqC;AACrC,6BAAe;AAAA,YACnB;AACA,kBAAM,6CACF,CAAC,yBAAyB,gBAAgB;AAC9C,kBAAM,mBAAmB,uBAAuB,iBAAiB;AAAA,cAC7D;AAAA,YACJ,CAAC;AACD,kBAAM,uBAAuB,OAAO,qBAAqB,gBAAgB;AACzE,gBAAI,cAAc,uBAAuB,iBAAiB;AACtD,kBAAI,6BAA6B,eAAe,GAAG;AAE/C,uCAAuB,QAAQ,GAAG,sBAAsB,eAAe,CAAC;AACxE;AAAA,cACJ;AACA,oBAAM,mBAAmB;AAAA,YAC7B;AACA,2BAAe;AACf,gBAAI,WAAW,qBAAqB,OAAW,YAAW,mBAAmB,CAAC;AAC9E,uBAAW,iBAAiB,KAAK,gBAAgB;AAAA,UACrD;AAAA,QACJ,WAAW,mBAAmB,SAAS,GAAG;AACtC,gBAAM,cAAc,mBAAmB,MAAM;AAC7C,cAAI,gBAAgB,QAAW;AAE3B,uBAAW,sBAAsB;AACjC;AAAA,UACJ;AACA,cAAI,CAAC,gCAAgC;AACjC,6CAAiC;AACjC,2BAAe;AAAA,UACnB;AACA,gBAAM,6CACF,CAAC,yBAAyB,YAAY;AAC1C,gBAAM,eAAe,mBAAmB,aAAa;AAAA,YACjD;AAAA,UACJ,CAAC;AACD,gBAAM,mBAAmB,OAAO,qBAAqB,YAAY;AACjE,cAAI,cAAc,mBAAmB,iBAAiB;AAClD,kBAAM,mBAAmB;AAAA,UAC7B;AACA,yBAAe;AACf,cAAI,WAAW,iBAAiB,OAAW,YAAW,eAAe,CAAC;AACtE,qBAAW,aAAa,KAAK,YAAY;AAAA,QAC7C,OAAO;AAEH,qBAAW,sBAAsB;AACjC;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ;AAEA,UAAM,KAAK,sBAAsB,UAAU;AAAA,EAC/C;AAAA,EAEA,MAAM,sBAAsB,YAAyD;AACjF,UAAM,iBAAiB,qBAAqB,OAAO,UAAU;AAC7D,QAAI,eAAe,SAAS,iBAAiB;AACzC,YAAM,IAAI;AAAA,QACN,kFAAkF,OAAO;AAAA,UACrF;AAAA,QACJ,CAAC;AAAA,MACL;AAAA,IACJ;AACA,WAAO;AAAA,MACH,iCAAiC,WAAW,kBAAkB,UAAU,CAAC,mBACrE,WAAW,cAAc,UAAU,CACvC,YAAY,eAAe,MAAM;AAAA,IACrC;AAEA,QAAI,WAAW,kBAAkB;AAE7B,YAAM;AAAA,QACF,YACI,MAAM,KAAK,SAAS,KAAK,oBAAwB,gBAAgB;AAAA,UAC7D,eAAe;AAAA,QACnB,CAAC;AAAA,QACL;AAAA,QACA,OAAM,UAAS;AACX,gBAAM,EAAE,gBAAgB,IAAI;AAC5B,eAAK,0BAA0B,eAAe;AAAA,QAClD;AAAA,MACJ;AAAA,IACJ,OAAO;AACH,YAAM,KAAK,SAAS,KAAK,oBAAwB,cAAc;AAC/D,YAAM,KAAK,eAAe;AAAA,IAC9B;AAAA,EACJ;AACJ;AAEO,MAAM,2CAA2C,qBAAuC;AAAA,EAC3F,MAAM,iBAAsC;AACxC,QAAI;AACJ,UAAM,kBAA+D,CAAC;AACtE,UAAM,cAAuD,CAAC;AAE9D,WAAO,MAAM;AACT,YAAM,oBAAoB,MAAM,KAAK,SAAS,QAAQ,kBAAsB;AAC5E,YAAM,SAAS,cAAc,OAAO,kBAAkB,OAAO;AAC7D,UAAI,mBAAmB,UAAa,OAAO,mBAAmB,QAAW;AACrE,yBAAiB,OAAO;AAAA,MAC5B,YACK,mBAAmB,UAAa,OAAO,mBAAmB,WAC3D,OAAO,mBAAmB,gBAC5B;AACE,cAAM,IAAI,oBAAoB,2BAA2B,OAAO,cAAc,WAAW;AAAA,MAC7F;AAEA,UAAI,MAAM,QAAQ,OAAO,gBAAgB,KAAK,OAAO,iBAAiB,SAAS,GAAG;AAC9E,wBAAgB,KAAK,GAAG,OAAO,gBAAgB;AAAA,MACnD;AACA,UAAI,MAAM,QAAQ,OAAO,YAAY,KAAK,OAAO,aAAa,SAAS,GAAG;AACtE,oBAAY,KAAK,GAAG,OAAO,YAAY;AAAA,MAC3C;AACA,UAAI,CAAC,OAAO,qBAAqB;AAC7B,eAAO,mBAAmB;AAC1B,eAAO,eAAe;AACtB,eAAO;AAAA,MACX;AAEA,YAAM,KAAK,WAAW,WAAW,OAAO;AAAA,IAC5C;AAAA,EACJ;AACJ;AAEO,MAAM,mCAAmC,mCAAmC;AAAA,EAC/E,YAA6B,kBAAoC;AAC7D,UAAM,iBAAiB,iBAAiB,CAAC;AADhB;AAAA,EAE7B;AAAA;AAAA,EAGA,MAAe,KAAK,aAAqB,SAAoB,SAA+B;AACxF,QAAI,KAAK,SAAS,QAAQ,QAAQ;AAC9B,YAAM,IAAI,oBAAoB,kEAAkE;AAAA,IACpG;AACA,QAAI;AACA,aAAO,MAAM,KAAK,SAAS,KAAK,aAAa,SAAS,OAAO;AAAA,IACjE,SAAS,OAAO;AAGZ,UAAI,iBAAiB,iCAAiC;AAClD,cAAM,KAAK,SAAS,MAAM;AAC1B,YAAI,MAAM,KAAK,iBAAiB,iBAAiB,GAAG;AAChD,eAAK,WAAW,KAAK,iBAAiB,iBAAiB;AACvD,iBAAO,MAAM,KAAK,SAAS,KAAK,aAAa,OAAO;AAAA,QACxD;AAAA,MACJ;AACA,YAAM;AAAA,IACV;AAAA,EACJ;AAAA,EAEA,gBAAgB,aAA0B;AACtC,WAAO,KAAK;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACJ;AAAA,EACJ;AAAA,EAEA,MAAM,qBAAqB,kBAAoC;AAC3D,UAAM,KAAK,KAAK,0BAA8B,oBAAoB,OAAO,gBAAgB,CAAC;AAE1F,UAAM,SAAS,MAAM,KAAK,eAAe;AACzC,UAAM,EAAE,eAAe,IAAI;AAE3B,QAAI,mBAAmB,QAAW;AAC9B,YAAM,IAAI,oBAAoB,wCAAwC;AAAA,IAC1E;AAEA,UAAM,KAAK,WAAW,WAAW,OAAO;AAExC,UAAM,2BAA2B,MAAM,KAAK,YAAY,yBAA6B;AACrF,UAAM,oBAAoB,qBAAqB,OAAO,yBAAyB,OAAO;AAEtF,QAAI,kBAAkB,mBAAmB,gBAAgB;AACrD,YAAM,IAAI;AAAA,QACN,4BAA4B,kBAAkB,cAAc,eAAe,cAAc;AAAA,MAC7F;AAAA,IACJ;AAEA,WAAO;AAAA,MACH;AAAA,MACA;AAAA,IACJ;AAAA,EACJ;AAAA,EAEA,MAAM,kBAAkB,eAA8B,0BAAmC;AACrF,QAAI,cAAc,kBAAkB;AAChC,YAAM,KAAK;AAAA,QACP;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACJ;AAAA,IACJ,OAAO;AACH,aAAO,MAAM,KAAK;AAAA,QACd;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ;AAAA,EAEA,MAAM,iBAAiB,cAA4B;AAC/C,QAAI,aAAa,kBAAkB;AAC/B,YAAM,KAAK,8BAA8B,sBAA0B,iBAAiB,YAAY;AAAA,IACpG,OAAO;AACH,aAAO,MAAM,KAAK;AAAA,QACd;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACJ;AAAA,IACJ;AAAA,EACJ;AAAA,EAEA,iBAAiB,gBAAwB;AACrC,WAAO,KAAK,QAAQ,uBAA0B,iBAAiB,wBAA4B,mBAAmB;AAAA,MAC1G,SAAS;AAAA,MACT,0BAA0B;AAAA,IAC9B,CAAC;AAAA,EACL;AAAA,EAEA,MAAc,8BACV,oBACA,eACA,SACA,0BACa;AACb,UAAM,KAAK,KAAK,oBAAoB,cAAc,OAAO,OAAO,GAAG;AAAA,MAC/D,eAAe;AAAA,MACf;AAAA,IACJ,CAAC;AAAA,EACL;AAAA,EAEA,MAAc,QACV,oBACA,eACA,qBACA,gBACA,SACA,0BACkB;AAClB,UAAM,KAAK,KAAK,oBAAoB,cAAc,OAAO,OAAO,GAAG;AAAA,MAC/D,eAAe;AAAA,MACf;AAAA,IACJ,CAAC;AACD,UAAM,kBAAkB,MAAM,KAAK,YAAY,mBAAmB;AAClE,WAAO,eAAe,OAAO,gBAAgB,OAAO;AAAA,EACxD;AACJ;",
|
|
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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"}
|
|
@@ -119,14 +119,12 @@ class InteractionServer {
|
|
|
119
119
|
#subscriptionMap = /* @__PURE__ */ new Map();
|
|
120
120
|
#isClosing = false;
|
|
121
121
|
#subscriptionConfig;
|
|
122
|
-
|
|
123
|
-
constructor({ subscriptionOptions, eventHandler, endpointStructure }) {
|
|
122
|
+
constructor({ subscriptionOptions, endpointStructure }) {
|
|
124
123
|
this.#subscriptionConfig = SubscriptionOptions.configurationFor(subscriptionOptions);
|
|
125
|
-
this.#eventHandler = eventHandler;
|
|
126
124
|
this.#endpointStructure = endpointStructure;
|
|
127
|
-
this.#endpointStructure.change.on(() => {
|
|
125
|
+
this.#endpointStructure.change.on(async () => {
|
|
128
126
|
for (const subscription of this.#subscriptionMap.values()) {
|
|
129
|
-
subscription.updateSubscription();
|
|
127
|
+
await subscription.updateSubscription();
|
|
130
128
|
}
|
|
131
129
|
});
|
|
132
130
|
}
|
|
@@ -202,6 +200,7 @@ class InteractionServer {
|
|
|
202
200
|
`Error reading attribute from ${exchange.channel.name}: ${this.#endpointStructure.resolveAttributeName(requestPath)}: unsupported path: Status=${error.code}`
|
|
203
201
|
);
|
|
204
202
|
attributeReportsPayload.push({
|
|
203
|
+
hasFabricSensitiveData: false,
|
|
205
204
|
attributeStatus: { path: requestPath, status: { status: error.code } }
|
|
206
205
|
});
|
|
207
206
|
}
|
|
@@ -252,6 +251,7 @@ class InteractionServer {
|
|
|
252
251
|
);
|
|
253
252
|
const { schema } = attribute;
|
|
254
253
|
attributeReportsPayload.push({
|
|
254
|
+
hasFabricSensitiveData: attribute.hasFabricSensitiveData,
|
|
255
255
|
attributeData: { path, dataVersion: version, payload: value, schema }
|
|
256
256
|
});
|
|
257
257
|
} catch (error) {
|
|
@@ -261,7 +261,10 @@ class InteractionServer {
|
|
|
261
261
|
);
|
|
262
262
|
if (error instanceof StatusResponseError) {
|
|
263
263
|
if (isConcreteAttributePath(requestPath)) {
|
|
264
|
-
attributeReportsPayload.push({
|
|
264
|
+
attributeReportsPayload.push({
|
|
265
|
+
hasFabricSensitiveData: false,
|
|
266
|
+
attributeStatus: { path, status: { status: error.code } }
|
|
267
|
+
});
|
|
265
268
|
}
|
|
266
269
|
} else {
|
|
267
270
|
throw error;
|
|
@@ -297,6 +300,7 @@ class InteractionServer {
|
|
|
297
300
|
`Read event from ${exchange.channel.name}: ${this.#endpointStructure.resolveEventName(requestPath)}: unsupported path: Status=${error.code}`
|
|
298
301
|
);
|
|
299
302
|
eventReportsPayload?.push({
|
|
303
|
+
hasFabricSensitiveData: false,
|
|
300
304
|
eventStatus: { path: requestPath, status: { status: error.code } }
|
|
301
305
|
});
|
|
302
306
|
}
|
|
@@ -325,6 +329,7 @@ class InteractionServer {
|
|
|
325
329
|
const { schema } = event;
|
|
326
330
|
reportsForPath.push(
|
|
327
331
|
...matchingEvents.map(({ eventNumber, priority, epochTimestamp, data }) => ({
|
|
332
|
+
hasFabricSensitiveData: event.hasFabricSensitiveData,
|
|
328
333
|
eventData: {
|
|
329
334
|
path,
|
|
330
335
|
eventNumber,
|
|
@@ -342,7 +347,10 @@ class InteractionServer {
|
|
|
342
347
|
);
|
|
343
348
|
if (error instanceof StatusResponseError) {
|
|
344
349
|
if (isConcreteEventPath(requestPath)) {
|
|
345
|
-
eventReportsPayload?.push({
|
|
350
|
+
eventReportsPayload?.push({
|
|
351
|
+
hasFabricSensitiveData: false,
|
|
352
|
+
eventStatus: { path, status: { status: error.code } }
|
|
353
|
+
});
|
|
346
354
|
}
|
|
347
355
|
} else {
|
|
348
356
|
throw error;
|
|
@@ -681,42 +689,39 @@ class InteractionServer {
|
|
|
681
689
|
}
|
|
682
690
|
if (this.#nextSubscriptionId === 4294967295) this.#nextSubscriptionId = 0;
|
|
683
691
|
const subscriptionId = this.#nextSubscriptionId++;
|
|
684
|
-
const subscriptionHandler = new SubscriptionHandler(
|
|
692
|
+
const subscriptionHandler = new SubscriptionHandler({
|
|
685
693
|
subscriptionId,
|
|
686
694
|
session,
|
|
687
|
-
this.#endpointStructure,
|
|
695
|
+
endpointStructure: this.#endpointStructure,
|
|
688
696
|
attributeRequests,
|
|
689
697
|
dataVersionFilters,
|
|
690
698
|
eventRequests,
|
|
691
699
|
eventFilters,
|
|
692
|
-
this.#eventHandler,
|
|
693
700
|
isFabricFiltered,
|
|
694
|
-
minIntervalFloorSeconds,
|
|
695
|
-
maxIntervalCeilingSeconds,
|
|
696
|
-
() => this.#subscriptionMap.delete(subscriptionId),
|
|
697
|
-
this.#subscriptionConfig
|
|
698
|
-
|
|
701
|
+
minIntervalFloor: minIntervalFloorSeconds,
|
|
702
|
+
maxIntervalCeiling: maxIntervalCeilingSeconds,
|
|
703
|
+
cancelCallback: () => this.#subscriptionMap.delete(subscriptionId),
|
|
704
|
+
subscriptionOptions: this.#subscriptionConfig,
|
|
705
|
+
readAttribute: (path, attribute) => this.readAttribute(
|
|
706
|
+
path,
|
|
707
|
+
attribute,
|
|
708
|
+
exchange,
|
|
709
|
+
isFabricFiltered,
|
|
710
|
+
message,
|
|
711
|
+
this.#endpointStructure.getEndpoint(path.endpointId)
|
|
712
|
+
),
|
|
713
|
+
readEvent: (path, event, eventFilters2) => this.readEvent(
|
|
714
|
+
path,
|
|
715
|
+
eventFilters2,
|
|
716
|
+
event,
|
|
717
|
+
exchange,
|
|
718
|
+
isFabricFiltered,
|
|
719
|
+
message,
|
|
720
|
+
this.#endpointStructure.getEndpoint(path.endpointId)
|
|
721
|
+
)
|
|
722
|
+
});
|
|
699
723
|
try {
|
|
700
|
-
await subscriptionHandler.sendInitialReport(
|
|
701
|
-
messenger,
|
|
702
|
-
(path, attribute) => this.readAttribute(
|
|
703
|
-
path,
|
|
704
|
-
attribute,
|
|
705
|
-
exchange,
|
|
706
|
-
isFabricFiltered,
|
|
707
|
-
message,
|
|
708
|
-
this.#endpointStructure.getEndpoint(path.endpointId)
|
|
709
|
-
),
|
|
710
|
-
(path, event, eventFilters2) => this.readEvent(
|
|
711
|
-
path,
|
|
712
|
-
eventFilters2,
|
|
713
|
-
event,
|
|
714
|
-
exchange,
|
|
715
|
-
isFabricFiltered,
|
|
716
|
-
message,
|
|
717
|
-
this.#endpointStructure.getEndpoint(path.endpointId)
|
|
718
|
-
)
|
|
719
|
-
);
|
|
724
|
+
await subscriptionHandler.sendInitialReport(messenger);
|
|
720
725
|
} catch (error) {
|
|
721
726
|
logger.error(
|
|
722
727
|
`Subscription ${subscriptionId} for Session ${session.id}: Error while sending initial data reports`,
|
|
@@ -731,8 +736,10 @@ class InteractionServer {
|
|
|
731
736
|
return;
|
|
732
737
|
}
|
|
733
738
|
if (!keepSubscriptions) {
|
|
734
|
-
logger.debug(
|
|
735
|
-
|
|
739
|
+
logger.debug(
|
|
740
|
+
`Clear subscriptions for Subscriber node ${session.peerNodeId} because keepSubscriptions=false`
|
|
741
|
+
);
|
|
742
|
+
await session.context.clearSubscriptionsForNode(fabric.fabricIndex, session.peerNodeId, true);
|
|
736
743
|
}
|
|
737
744
|
const maxInterval = subscriptionHandler.getMaxInterval();
|
|
738
745
|
logger.info(
|