@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/InteractionClient.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 {\n Attribute,\n AttributeJsType,\n Command,\n Event,\n RequestType,\n ResponseType,\n TlvNoResponse,\n} from \"../../cluster/Cluster.js\";\nimport { resolveAttributeName, resolveCommandName, resolveEventName } from \"../../cluster/ClusterHelper.js\";\nimport { ImplementationError, MatterFlowError, UnexpectedDataError } from \"../../common/MatterError.js\";\nimport { AttributeId } from \"../../datatype/AttributeId.js\";\nimport { ClusterId } from \"../../datatype/ClusterId.js\";\nimport { EndpointNumber } from \"../../datatype/EndpointNumber.js\";\nimport { EventId } from \"../../datatype/EventId.js\";\nimport { EventNumber } from \"../../datatype/EventNumber.js\";\nimport { NodeId } from \"../../datatype/NodeId.js\";\nimport { Logger } from \"../../log/Logger.js\";\nimport { MessageExchange } from \"../../protocol/MessageExchange.js\";\nimport { ProtocolHandler } from \"../../protocol/ProtocolHandler.js\";\nimport { Time, Timer, TimerCallback } from \"../../time/Time.js\";\nimport { TypeFromSchema } from \"../../tlv/TlvSchema.js\";\nimport { ExchangeProvider } from \"../ExchangeManager.js\";\nimport { DecodedAttributeReportValue, normalizeAndDecodeReadAttributeReport } from \"./AttributeDataDecoder.js\";\nimport { DecodedEventData, DecodedEventReportValue, normalizeAndDecodeReadEventReport } from \"./EventDataDecoder.js\";\nimport {\n DataReport,\n IncomingInteractionClientMessenger,\n InteractionClientMessenger,\n ReadRequest,\n} from \"./InteractionMessenger.js\";\nimport { TlvAttributeReport, TlvEventFilter, TlvEventReport } from \"./InteractionProtocol.js\";\nimport {\n INTERACTION_MODEL_REVISION,\n INTERACTION_PROTOCOL_ID,\n attributePathToId,\n clusterPathToId,\n} from \"./InteractionServer.js\";\nimport { StatusCode, StatusResponseError } from \"./StatusCode.js\";\n\nconst logger = Logger.get(\"InteractionClient\");\n\nconst REQUEST_ALL = [{}];\nconst DEFAULT_TIMED_REQUEST_TIMEOUT_MS = 10_000; // 10 seconds\nconst DEFAULT_MINIMUM_RESPONSE_TIMEOUT_WITH_FAILSAFE_MS = 30_000; // 30 seconds\n\nexport interface AttributeStatus {\n path: {\n nodeId?: NodeId;\n endpointId?: EndpointNumber;\n clusterId?: ClusterId;\n attributeId?: AttributeId;\n };\n status: StatusCode;\n}\n\nexport class SubscriptionClient implements ProtocolHandler<MatterController> {\n private readonly subscriptionListeners = new Map<number, (dataReport: DataReport) => void>();\n private readonly subscriptionUpdateTimers = new Map<number, Timer>();\n\n constructor() {}\n\n getId() {\n return INTERACTION_PROTOCOL_ID;\n }\n\n registerSubscriptionListener(subscriptionId: number, listener: (dataReport: DataReport) => void) {\n this.subscriptionListeners.set(subscriptionId, listener);\n }\n\n removeSubscriptionListener(subscriptionId: number) {\n this.subscriptionListeners.delete(subscriptionId);\n }\n\n registerSubscriptionUpdateTimer(subscriptionId: number, timer: Timer) {\n this.subscriptionUpdateTimers.set(subscriptionId, timer);\n }\n\n removeSubscriptionUpdateTimer(subscriptionId: number) {\n this.subscriptionUpdateTimers.get(subscriptionId)?.stop();\n this.subscriptionUpdateTimers.delete(subscriptionId);\n }\n\n async onNewExchange(exchange: MessageExchange<MatterController>) {\n const messenger = new IncomingInteractionClientMessenger(exchange);\n const dataReport = await messenger.readDataReport();\n const subscriptionId = dataReport.subscriptionId;\n if (subscriptionId === undefined) {\n await messenger.sendStatus(StatusCode.InvalidSubscription);\n throw new UnexpectedDataError(\"Invalid Data report without Subscription ID\");\n }\n const listener = this.subscriptionListeners.get(subscriptionId);\n const timer = this.subscriptionUpdateTimers.get(subscriptionId);\n if (listener === undefined) {\n await messenger.sendStatus(StatusCode.InvalidSubscription);\n logger.info(`Received data for unknown subscription ID ${subscriptionId}. Cancel this subscription.`);\n if (timer !== undefined) {\n // Should not happen but let's make sure to clean up\n this.removeSubscriptionUpdateTimer(subscriptionId);\n }\n await messenger.close();\n return;\n }\n await messenger.sendStatus(StatusCode.Success);\n await messenger.close();\n\n if (timer !== undefined) {\n timer.stop().start(); // Restart timer because we received data\n }\n listener(dataReport);\n }\n\n async close() {\n this.subscriptionListeners.clear();\n this.subscriptionUpdateTimers.forEach(timer => timer.stop());\n this.subscriptionUpdateTimers.clear();\n }\n}\n\nexport class InteractionClient {\n // TODO Add storage for these data to be able to optimize follow up subscriptions by only request updated data\n private readonly subscribedLocalValues = new Map<string, any>();\n private readonly subscribedClusterDataVersions = new Map<string, number>();\n private readonly ownSubscriptionIds = new Set<number>();\n private readonly subscriptionClient: SubscriptionClient;\n\n constructor(\n private readonly exchangeProvider: ExchangeProvider,\n readonly nodeId: NodeId,\n ) {\n if (this.exchangeProvider.hasProtocolHandler(INTERACTION_PROTOCOL_ID)) {\n const client = this.exchangeProvider.getProtocolHandler(INTERACTION_PROTOCOL_ID);\n if (!(client instanceof SubscriptionClient)) {\n throw new ImplementationError(\n `Already existing protocol handler ${INTERACTION_PROTOCOL_ID} is not a SubscriptionClient.`,\n );\n }\n this.subscriptionClient = client;\n } else {\n this.subscriptionClient = new SubscriptionClient();\n this.exchangeProvider.addProtocolHandler(this.subscriptionClient);\n }\n }\n\n registerSubscriptionListener(subscriptionId: number, listener: (dataReport: DataReport) => void) {\n this.ownSubscriptionIds.add(subscriptionId);\n this.subscriptionClient.registerSubscriptionListener(subscriptionId, listener);\n }\n\n removeSubscription(subscriptionId: number) {\n this.ownSubscriptionIds.delete(subscriptionId);\n this.subscriptionClient.removeSubscriptionListener(subscriptionId);\n this.subscriptionClient.removeSubscriptionUpdateTimer(subscriptionId);\n }\n\n async getAllAttributes(\n options: {\n dataVersionFilters?: { endpointId: EndpointNumber; clusterId: ClusterId; dataVersion: number }[];\n isFabricFiltered?: boolean;\n } = {},\n ): Promise<DecodedAttributeReportValue<any>[]> {\n const { dataVersionFilters, isFabricFiltered } = options;\n return (\n await this.getMultipleAttributesAndEvents({\n attributes: REQUEST_ALL,\n dataVersionFilters,\n isFabricFiltered,\n })\n ).attributeReports;\n }\n\n async getAllEvents(\n options: {\n eventFilters?: TypeFromSchema<typeof TlvEventFilter>[];\n isFabricFiltered?: boolean;\n } = {},\n ): Promise<DecodedEventReportValue<any>[]> {\n const { eventFilters, isFabricFiltered } = options;\n return (await this.getMultipleAttributesAndEvents({ events: REQUEST_ALL, eventFilters, isFabricFiltered }))\n .eventReports;\n }\n\n async getAllAttributesAndEvents(\n options: {\n dataVersionFilters?: {\n endpointId: EndpointNumber;\n clusterId: ClusterId;\n dataVersion: number;\n }[];\n eventFilters?: TypeFromSchema<typeof TlvEventFilter>[];\n isFabricFiltered?: boolean;\n } = {},\n ): Promise<{\n attributeReports: DecodedAttributeReportValue<any>[];\n eventReports: DecodedEventReportValue<any>[];\n }> {\n const { dataVersionFilters, eventFilters, isFabricFiltered } = options;\n return this.getMultipleAttributesAndEvents({\n attributes: REQUEST_ALL,\n events: REQUEST_ALL,\n eventFilters,\n dataVersionFilters,\n isFabricFiltered,\n });\n }\n\n async getMultipleAttributes(\n options: {\n attributes?: { endpointId?: EndpointNumber; clusterId?: ClusterId; attributeId?: AttributeId }[];\n dataVersionFilters?: { endpointId: EndpointNumber; clusterId: ClusterId; dataVersion: number }[];\n isFabricFiltered?: boolean;\n } = {},\n ): Promise<DecodedAttributeReportValue<any>[]> {\n const { attributes, dataVersionFilters, isFabricFiltered } = options;\n return (await this.getMultipleAttributesAndEvents({ attributes, dataVersionFilters, isFabricFiltered }))\n .attributeReports;\n }\n\n async getMultipleEvents(\n options: {\n events?: { endpointId?: EndpointNumber; clusterId?: ClusterId; eventId?: EventId }[];\n eventFilters?: TypeFromSchema<typeof TlvEventFilter>[];\n isFabricFiltered?: boolean;\n } = {},\n ): Promise<DecodedEventReportValue<any>[]> {\n const { events, eventFilters, isFabricFiltered } = options;\n return (await this.getMultipleAttributesAndEvents({ events, eventFilters, isFabricFiltered })).eventReports;\n }\n\n async getMultipleAttributesAndEvents(\n options: {\n attributes?: { endpointId?: EndpointNumber; clusterId?: ClusterId; attributeId?: AttributeId }[];\n dataVersionFilters?: { endpointId: EndpointNumber; clusterId: ClusterId; dataVersion: number }[];\n events?: { endpointId?: EndpointNumber; clusterId?: ClusterId; eventId?: EventId }[];\n eventFilters?: TypeFromSchema<typeof TlvEventFilter>[];\n isFabricFiltered?: boolean;\n } = {},\n ): Promise<{\n attributeReports: DecodedAttributeReportValue<any>[];\n eventReports: DecodedEventReportValue<any>[];\n }> {\n const {\n attributes: attributeRequests,\n dataVersionFilters,\n events: eventRequests,\n eventFilters,\n isFabricFiltered = true,\n } = options;\n if (attributeRequests === undefined && eventRequests === undefined) {\n throw new ImplementationError(\"When reading attributes and events, at least one must be specified.\");\n }\n\n const readPathsCount = (attributeRequests?.length ?? 0) + (eventRequests?.length ?? 0);\n if (readPathsCount > 9) {\n logger.debug(\n \"Read interactions with more then 9 paths might be not allowed by the device. Consider splitting then into several read requests.\",\n );\n }\n\n return this.withMessenger<{\n attributeReports: DecodedAttributeReportValue<any>[];\n eventReports: DecodedEventReportValue<any>[];\n }>(async messenger => {\n return await this.processReadRequest(messenger, {\n attributeRequests,\n dataVersionFilters: dataVersionFilters?.map(({ endpointId, clusterId, dataVersion }) => ({\n path: { endpointId, clusterId },\n dataVersion,\n })),\n eventRequests,\n eventFilters,\n isFabricFiltered,\n interactionModelRevision: INTERACTION_MODEL_REVISION,\n });\n });\n }\n\n async getAttribute<A extends Attribute<any, any>>(options: {\n endpointId: EndpointNumber;\n clusterId: ClusterId;\n attribute: A;\n isFabricFiltered?: boolean;\n alwaysRequestFromRemote?: boolean;\n }): Promise<AttributeJsType<A> | undefined> {\n const { endpointId, clusterId, attribute, alwaysRequestFromRemote = false, isFabricFiltered } = options;\n const response = await this.getAttributeWithVersion({\n endpointId,\n clusterId,\n attribute,\n alwaysRequestFromRemote,\n isFabricFiltered,\n });\n return response?.value;\n }\n\n async getAttributeWithVersion<A extends Attribute<any, any>>(options: {\n endpointId: EndpointNumber;\n clusterId: ClusterId;\n attribute: A;\n isFabricFiltered?: boolean;\n alwaysRequestFromRemote?: boolean;\n }): Promise<{ value: AttributeJsType<A>; version: number } | undefined> {\n const { endpointId, clusterId, attribute, alwaysRequestFromRemote = false, isFabricFiltered } = options;\n const { id: attributeId } = attribute;\n if (!alwaysRequestFromRemote) {\n const value = this.subscribedLocalValues.get(attributePathToId({ endpointId, clusterId, attributeId }));\n const version = this.subscribedClusterDataVersions.get(clusterPathToId({ endpointId, clusterId }));\n if (value !== undefined && version !== undefined) {\n return { value, version } as { value: AttributeJsType<A>; version: number };\n }\n }\n\n const { attributeReports } = await this.getMultipleAttributesAndEvents({\n attributes: [{ endpointId, clusterId, attributeId }],\n isFabricFiltered,\n });\n\n if (attributeReports.length === 0) {\n return undefined;\n }\n if (attributeReports.length > 1) {\n throw new UnexpectedDataError(\"Unexpected response with more then one attribute\");\n }\n return { value: attributeReports[0].value, version: attributeReports[0].version };\n }\n\n async getEvent<T, E extends Event<T, any>>(options: {\n endpointId: EndpointNumber;\n clusterId: ClusterId;\n event: E;\n minimumEventNumber?: EventNumber;\n isFabricFiltered?: boolean;\n }): Promise<DecodedEventData<T>[] | undefined> {\n const { endpointId, clusterId, event, minimumEventNumber, isFabricFiltered = true } = options;\n const { id: eventId } = event;\n const response = await this.getMultipleAttributesAndEvents({\n events: [{ endpointId, clusterId, eventId }],\n eventFilters: minimumEventNumber !== undefined ? [{ eventMin: minimumEventNumber }] : undefined,\n isFabricFiltered,\n });\n return response?.eventReports[0]?.events;\n }\n\n private async processReadRequest(\n messenger: InteractionClientMessenger,\n request: ReadRequest,\n ): Promise<{ attributeReports: DecodedAttributeReportValue<any>[]; eventReports: DecodedEventReportValue<any>[] }> {\n const { attributeRequests, eventRequests } = request;\n logger.debug(\n `Sending read request to ${messenger.getExchangeChannelName()} for attributes ${attributeRequests\n ?.map(path => resolveAttributeName(path))\n .join(\", \")} and events ${eventRequests?.map(path => resolveEventName(path)).join(\", \")}`,\n );\n // Send read request and combine all (potentially chunked) responses\n let response = await messenger.sendReadRequest(request);\n const attributeReports = new Array<TypeFromSchema<typeof TlvAttributeReport>>();\n const eventReports = new Array<TypeFromSchema<typeof TlvEventReport>>();\n\n while (true) {\n if (response.attributeReports !== undefined) {\n attributeReports.push(...response.attributeReports);\n }\n if (response.eventReports !== undefined) {\n eventReports.push(...response.eventReports);\n }\n if (!response.suppressResponse) {\n await messenger.sendStatus(StatusCode.Success);\n }\n if (!response.moreChunkedMessages) break;\n response = await messenger.readDataReport();\n }\n\n // Normalize and decode the response\n const normalizedResult = {\n attributeReports: normalizeAndDecodeReadAttributeReport(attributeReports),\n eventReports: normalizeAndDecodeReadEventReport(eventReports),\n };\n logger.debug(\n `Received read response with attributes ${normalizedResult.attributeReports\n .map(({ path, value }) => `${resolveAttributeName(path)} = ${Logger.toJSON(value)}`)\n .join(\", \")} and events ${normalizedResult.eventReports\n .map(({ path, events }) => `${resolveEventName(path)} = ${Logger.toJSON(events)}`)\n .join(\", \")}`,\n );\n return normalizedResult;\n }\n\n async setAttribute<T>(options: {\n attributeData: {\n endpointId: EndpointNumber;\n clusterId: ClusterId;\n attribute: Attribute<T, any>;\n value: T;\n dataVersion?: number;\n };\n asTimedRequest?: boolean;\n timedRequestTimeoutMs?: number;\n suppressResponse?: boolean;\n }): Promise<void> {\n const { attributeData, asTimedRequest, timedRequestTimeoutMs, suppressResponse } = options;\n const { endpointId, clusterId, attribute, value, dataVersion } = attributeData;\n const response = await this.setMultipleAttributes({\n attributes: [{ endpointId, clusterId, attribute, value, dataVersion }],\n asTimedRequest,\n timedRequestTimeoutMs,\n suppressResponse,\n });\n\n // Response contains Status error if there was an error on write\n if (response.length) {\n const {\n path: { endpointId, clusterId, attributeId },\n status,\n } = response[0];\n if (status !== undefined && status !== StatusCode.Success) {\n throw new StatusResponseError(\n `Error setting attribute ${endpointId}/${clusterId}/${attributeId}`,\n status,\n );\n }\n }\n }\n\n async setMultipleAttributes(options: {\n attributes: {\n endpointId: EndpointNumber;\n clusterId: ClusterId;\n attribute: Attribute<any, any>;\n value: any;\n dataVersion?: number;\n }[];\n asTimedRequest?: boolean;\n timedRequestTimeoutMs?: number;\n suppressResponse?: boolean;\n }): Promise<AttributeStatus[]> {\n const {\n attributes,\n asTimedRequest,\n timedRequestTimeoutMs = DEFAULT_TIMED_REQUEST_TIMEOUT_MS,\n suppressResponse = false,\n } = options;\n return this.withMessenger<AttributeStatus[]>(async messenger => {\n logger.debug(\n `Sending write request: ${attributes\n .map(\n ({ endpointId, clusterId, attribute: { id }, value, dataVersion }) =>\n `${resolveAttributeName({ endpointId, clusterId, attributeId: id })} = ${Logger.toJSON(\n value,\n )} (version=${dataVersion})`,\n )\n .join(\", \")}`,\n );\n const writeRequests = attributes.map(\n ({ endpointId, clusterId, attribute: { id, schema }, value, dataVersion }) => ({\n path: { endpointId, clusterId, attributeId: id },\n data: schema.encodeTlv(value, true),\n dataVersion,\n }),\n );\n const timedRequest =\n attributes.some(({ attribute: { timed } }) => timed) ||\n asTimedRequest === true ||\n options.timedRequestTimeoutMs !== undefined;\n if (timedRequest) {\n await messenger.sendTimedRequest(timedRequestTimeoutMs);\n }\n const response = await messenger.sendWriteCommand({\n suppressResponse,\n timedRequest,\n writeRequests,\n moreChunkedMessages: false,\n interactionModelRevision: INTERACTION_MODEL_REVISION,\n });\n if (response === undefined) {\n if (!suppressResponse) {\n throw new MatterFlowError(`No response received from write interaction but expected.`);\n }\n return [];\n }\n return response.writeResponses\n .flatMap(\n ({ status: { status, clusterStatus }, path: { nodeId, endpointId, clusterId, attributeId } }) => {\n return {\n path: { nodeId, endpointId, clusterId, attributeId },\n status: status ?? clusterStatus ?? StatusCode.Failure,\n };\n },\n )\n .filter(({ status }) => status !== StatusCode.Success);\n });\n }\n\n async subscribeAttribute<A extends Attribute<any, any>>(options: {\n endpointId: EndpointNumber;\n clusterId: ClusterId;\n attribute: A;\n minIntervalFloorSeconds: number;\n maxIntervalCeilingSeconds: number;\n isFabricFiltered?: boolean;\n knownDataVersion?: number;\n keepSubscriptions?: boolean;\n listener?: (value: AttributeJsType<A>, version: number) => void;\n updateTimeoutHandler?: TimerCallback;\n }): Promise<void> {\n const {\n endpointId,\n clusterId,\n attribute,\n minIntervalFloorSeconds,\n maxIntervalCeilingSeconds,\n isFabricFiltered = true,\n listener,\n knownDataVersion,\n keepSubscriptions = true,\n updateTimeoutHandler,\n } = options;\n return this.withMessenger<void>(async messenger => {\n const { id: attributeId } = attribute;\n logger.debug(\n `Sending subscribe request for attribute: ${resolveAttributeName({\n endpointId,\n clusterId,\n attributeId,\n })}`,\n );\n const {\n report,\n subscribeResponse: { subscriptionId, maxInterval },\n } = await messenger.sendSubscribeRequest({\n interactionModelRevision: INTERACTION_MODEL_REVISION,\n attributeRequests: [{ endpointId, clusterId, attributeId }],\n dataVersionFilters:\n knownDataVersion !== undefined\n ? [{ path: { endpointId, clusterId }, dataVersion: knownDataVersion }]\n : undefined,\n keepSubscriptions,\n minIntervalFloorSeconds,\n maxIntervalCeilingSeconds,\n isFabricFiltered,\n });\n\n const subscriptionListener = (dataReport: DataReport) => {\n if (!Array.isArray(dataReport.attributeReports) || !dataReport.attributeReports.length) {\n logger.debug(\"Subscription result empty\");\n return;\n }\n\n const data = normalizeAndDecodeReadAttributeReport(dataReport.attributeReports);\n\n if (data.length === 0) {\n throw new MatterFlowError(\"Subscription result reporting undefined/no value not specified\");\n }\n if (data.length > 1) {\n throw new UnexpectedDataError(\"Unexpected response with more then one attribute\");\n }\n const {\n path: { endpointId, clusterId, attributeId },\n value,\n version,\n } = data[0];\n if (value === undefined)\n throw new MatterFlowError(\"Subscription result reporting undefined value not specified.\");\n\n this.subscribedLocalValues.set(attributePathToId({ endpointId, clusterId, attributeId }), value);\n this.subscribedClusterDataVersions.set(clusterPathToId({ endpointId, clusterId }), version);\n listener?.(value, version);\n };\n this.registerSubscriptionListener(subscriptionId, subscriptionListener);\n if (updateTimeoutHandler !== undefined) {\n this.registerSubscriptionUpdateTimer(subscriptionId, maxInterval, updateTimeoutHandler);\n }\n subscriptionListener(report);\n return;\n });\n }\n\n async subscribeEvent<T, E extends Event<T, any>>(options: {\n endpointId: EndpointNumber;\n clusterId: ClusterId;\n event: E;\n minIntervalFloorSeconds: number;\n maxIntervalCeilingSeconds: number;\n isUrgent?: boolean;\n minimumEventNumber?: EventNumber;\n isFabricFiltered?: boolean;\n listener?: (value: DecodedEventData<T>) => void;\n updateTimeoutHandler?: TimerCallback;\n }): Promise<void> {\n return this.withMessenger<void>(async messenger => {\n const {\n endpointId,\n clusterId,\n event,\n minIntervalFloorSeconds,\n maxIntervalCeilingSeconds,\n isUrgent,\n minimumEventNumber,\n isFabricFiltered = true,\n listener,\n updateTimeoutHandler,\n } = options;\n const { id: eventId } = event;\n logger.debug(\n `Sending subscribe request for event: ${resolveEventName({ endpointId, clusterId, eventId })}`,\n );\n const {\n report,\n subscribeResponse: { subscriptionId, maxInterval },\n } = await messenger.sendSubscribeRequest({\n interactionModelRevision: INTERACTION_MODEL_REVISION,\n eventRequests: [{ endpointId, clusterId, eventId, isUrgent }],\n eventFilters: minimumEventNumber !== undefined ? [{ eventMin: minimumEventNumber }] : undefined,\n keepSubscriptions: true,\n minIntervalFloorSeconds,\n maxIntervalCeilingSeconds,\n isFabricFiltered,\n });\n\n const subscriptionListener = (dataReport: DataReport) => {\n if (!Array.isArray(dataReport.eventReports) || !dataReport.eventReports.length) {\n logger.debug(\"Subscription result empty\");\n return;\n }\n\n const data = normalizeAndDecodeReadEventReport(dataReport.eventReports);\n\n if (data.length === 0) {\n throw new MatterFlowError(\"Received empty subscription result value.\");\n }\n if (data.length > 1) {\n throw new UnexpectedDataError(\"Unexpected response with more then one attribute.\");\n }\n const { events } = data[0];\n if (events === undefined)\n throw new MatterFlowError(\"Subscription result reporting undefined value not specified.\");\n\n events.forEach(event => listener?.(event));\n };\n this.registerSubscriptionListener(subscriptionId, subscriptionListener);\n if (updateTimeoutHandler !== undefined) {\n this.registerSubscriptionUpdateTimer(subscriptionId, maxInterval, updateTimeoutHandler);\n }\n subscriptionListener(report);\n return;\n });\n }\n\n async subscribeAllAttributesAndEvents(options: {\n minIntervalFloorSeconds: number;\n maxIntervalCeilingSeconds: number;\n attributeListener?: (data: DecodedAttributeReportValue<any>) => void;\n eventListener?: (data: DecodedEventReportValue<any>) => void;\n isUrgent?: boolean;\n keepSubscriptions?: boolean;\n isFabricFiltered?: boolean;\n eventFilters?: TypeFromSchema<typeof TlvEventFilter>[];\n dataVersionFilters?: { endpointId: EndpointNumber; clusterId: ClusterId; dataVersion: number }[];\n updateTimeoutHandler?: TimerCallback;\n }): Promise<{\n attributeReports?: DecodedAttributeReportValue<any>[];\n eventReports?: DecodedEventReportValue<any>[];\n }> {\n const {\n minIntervalFloorSeconds,\n maxIntervalCeilingSeconds,\n attributeListener,\n eventListener,\n isUrgent,\n keepSubscriptions = true,\n isFabricFiltered = true,\n eventFilters,\n dataVersionFilters,\n updateTimeoutHandler,\n } = options;\n return this.subscribeMultipleAttributesAndEvents({\n attributes: REQUEST_ALL,\n events: [{ isUrgent }],\n minIntervalFloorSeconds,\n maxIntervalCeilingSeconds,\n keepSubscriptions,\n isFabricFiltered,\n attributeListener,\n eventListener,\n eventFilters,\n dataVersionFilters,\n updateTimeoutHandler,\n });\n }\n\n async subscribeMultipleAttributesAndEvents(options: {\n attributes: { endpointId?: EndpointNumber; clusterId?: ClusterId; attributeId?: AttributeId }[];\n events: { endpointId?: EndpointNumber; clusterId?: ClusterId; eventId?: EventId; isUrgent?: boolean }[];\n minIntervalFloorSeconds: number;\n maxIntervalCeilingSeconds: number;\n keepSubscriptions?: boolean;\n isFabricFiltered?: boolean;\n attributeListener?: (data: DecodedAttributeReportValue<any>) => void;\n eventListener?: (data: DecodedEventReportValue<any>) => void;\n eventFilters?: TypeFromSchema<typeof TlvEventFilter>[];\n dataVersionFilters?: { endpointId: EndpointNumber; clusterId: ClusterId; dataVersion: number }[];\n updateTimeoutHandler?: TimerCallback;\n }): Promise<{\n attributeReports?: DecodedAttributeReportValue<any>[];\n eventReports?: DecodedEventReportValue<any>[];\n }> {\n const {\n attributes: attributeRequests,\n events: eventRequests,\n minIntervalFloorSeconds,\n maxIntervalCeilingSeconds,\n keepSubscriptions = true,\n isFabricFiltered = true,\n attributeListener,\n eventListener,\n eventFilters,\n dataVersionFilters,\n updateTimeoutHandler,\n } = options;\n\n const subscriptionPathsCount = (attributeRequests?.length ?? 0) + (eventRequests?.length ?? 0);\n if (subscriptionPathsCount > 3) {\n logger.debug(\"Subscribe interactions with more then 3 paths might be not allowed by the device.\");\n }\n\n return this.withMessenger<{\n attributeReports?: DecodedAttributeReportValue<any>[];\n eventReports?: DecodedEventReportValue<any>[];\n }>(async messenger => {\n logger.debug(\n `Sending subscribe request: attributes: ${attributeRequests\n .map(path => resolveAttributeName(path))\n .join(\", \")} and events: ${eventRequests.map(path => resolveEventName(path)).join(\", \")}`,\n );\n const {\n report,\n subscribeResponse: { subscriptionId, maxInterval },\n } = await messenger.sendSubscribeRequest({\n interactionModelRevision: INTERACTION_MODEL_REVISION,\n attributeRequests,\n eventRequests,\n keepSubscriptions,\n minIntervalFloorSeconds,\n maxIntervalCeilingSeconds,\n isFabricFiltered,\n eventFilters,\n dataVersionFilters: dataVersionFilters?.map(({ endpointId, clusterId, dataVersion }) => ({\n path: { endpointId, clusterId },\n dataVersion,\n })),\n });\n logger.info(\n `Subscription successfully initialized with ID ${subscriptionId} and maxInterval ${maxInterval}s.`,\n );\n\n const subscriptionListener = (dataReport: {\n attributeReports?: DecodedAttributeReportValue<any>[];\n eventReports?: DecodedEventReportValue<any>[];\n }) => {\n if (\n (!Array.isArray(dataReport.attributeReports) || !dataReport.attributeReports.length) &&\n (!Array.isArray(dataReport.eventReports) || !dataReport.eventReports.length)\n ) {\n logger.debug(\"Subscription result empty\");\n return;\n }\n const { attributeReports, eventReports } = dataReport;\n\n if (attributeReports !== undefined) {\n attributeReports.forEach(data => {\n const {\n path: { endpointId, clusterId, attributeId },\n value,\n version,\n } = data;\n logger.debug(\n `Received attribute update: ${resolveAttributeName({\n endpointId,\n clusterId,\n attributeId,\n })} = ${Logger.toJSON(value)} (version=${version})`,\n );\n if (value === undefined) throw new MatterFlowError(\"Received empty subscription result value.\");\n this.subscribedLocalValues.set(\n attributePathToId({ endpointId, clusterId, attributeId }),\n value,\n );\n this.subscribedClusterDataVersions.set(clusterPathToId({ endpointId, clusterId }), version);\n attributeListener?.(data);\n });\n }\n\n if (eventReports !== undefined) {\n eventReports.forEach(data => {\n logger.debug(\n `Received event update: ${resolveEventName(data.path)}: ${Logger.toJSON(data.events)}`,\n );\n eventListener?.(data);\n });\n }\n };\n this.registerSubscriptionListener(subscriptionId, dataReport => {\n subscriptionListener({\n attributeReports:\n dataReport.attributeReports !== undefined\n ? normalizeAndDecodeReadAttributeReport(dataReport.attributeReports)\n : undefined,\n eventReports:\n dataReport.eventReports !== undefined\n ? normalizeAndDecodeReadEventReport(dataReport.eventReports)\n : undefined,\n });\n });\n\n if (updateTimeoutHandler !== undefined) {\n this.registerSubscriptionUpdateTimer(subscriptionId, maxInterval, updateTimeoutHandler);\n }\n\n const seedReport = {\n attributeReports:\n report.attributeReports !== undefined\n ? normalizeAndDecodeReadAttributeReport(report.attributeReports)\n : undefined,\n eventReports:\n report.eventReports !== undefined\n ? normalizeAndDecodeReadEventReport(report.eventReports)\n : undefined,\n };\n subscriptionListener(seedReport);\n return seedReport;\n });\n }\n\n async invoke<C extends Command<any, any, any>>(options: {\n endpointId: EndpointNumber;\n clusterId: ClusterId;\n request: RequestType<C>;\n command: C;\n asTimedRequest?: boolean;\n timedRequestTimeoutMs?: number;\n useExtendedFailSafeMessageResponseTimeout?: boolean;\n }): Promise<ResponseType<C>> {\n const {\n endpointId,\n clusterId,\n request,\n command: { requestId, requestSchema, responseId, responseSchema, optional, timed },\n asTimedRequest,\n timedRequestTimeoutMs = DEFAULT_TIMED_REQUEST_TIMEOUT_MS,\n useExtendedFailSafeMessageResponseTimeout = false,\n } = options;\n const timedRequest = timed || asTimedRequest === true || options.timedRequestTimeoutMs !== undefined;\n\n return this.withMessenger<ResponseType<C>>(async messenger => {\n logger.debug(\n `Invoking command: ${resolveCommandName({\n endpointId,\n clusterId,\n commandId: requestId,\n })} with ${Logger.toJSON(request)}`,\n );\n\n requestSchema.validate(request);\n\n const commandFields = requestSchema.encodeTlv(request);\n\n if (timedRequest) {\n await messenger.sendTimedRequest(timedRequestTimeoutMs);\n }\n\n const invokeResponse = await messenger.sendInvokeCommand(\n {\n invokeRequests: [{ commandPath: { endpointId, clusterId, commandId: requestId }, commandFields }],\n timedRequest,\n suppressResponse: false,\n interactionModelRevision: INTERACTION_MODEL_REVISION,\n },\n useExtendedFailSafeMessageResponseTimeout\n ? DEFAULT_MINIMUM_RESPONSE_TIMEOUT_WITH_FAILSAFE_MS\n : undefined,\n );\n if (invokeResponse === undefined) {\n throw new MatterFlowError(\"No response received from invoke interaction but expected.\");\n }\n const { invokeResponses } = invokeResponse;\n if (invokeResponses.length === 0) {\n throw new MatterFlowError(\"Received invoke response with no invoke results.\");\n }\n const { command, status } = invokeResponses[0];\n if (status !== undefined) {\n const resultCode = status.status.status;\n if (resultCode !== StatusCode.Success)\n throw new StatusResponseError(\n `Received non-success result: ${resultCode}`,\n resultCode ?? StatusCode.Failure,\n status.status.clusterStatus,\n );\n if ((responseSchema as any) !== TlvNoResponse)\n throw new MatterFlowError(\"A response was expected for this command.\");\n return undefined as unknown as ResponseType<C>; // ResponseType is void, force casting the empty result\n }\n if (command !== undefined) {\n const {\n commandPath: { commandId },\n commandFields,\n } = command;\n if (commandId !== responseId) {\n throw new MatterFlowError(\n `Received invoke response with unexpected command ID ${commandId}, expected ${responseId}.`,\n );\n }\n if (commandFields === undefined) {\n if ((responseSchema as any) !== TlvNoResponse)\n throw new MatterFlowError(`A response was expected for command ${requestId}.`);\n return undefined as unknown as ResponseType<C>; // ResponseType is void, force casting the empty result\n }\n const response = responseSchema.decodeTlv(commandFields);\n logger.debug(\n `Received invoke response: ${resolveCommandName({\n endpointId,\n clusterId,\n commandId: requestId,\n })} with ${Logger.toJSON(response)})}`,\n );\n return response;\n }\n if (optional) {\n return undefined as ResponseType<C>; // ResponseType allows undefined for optional commands\n }\n throw new MatterFlowError(\"Received invoke response with no result nor response.\");\n });\n }\n\n // TODO Add to ClusterClient when needed/when Group communication is implemented\n async invokeWithSuppressedResponse<C extends Command<any, any, any>>(options: {\n endpointId: EndpointNumber;\n clusterId: ClusterId;\n request: RequestType<C>;\n command: C;\n asTimedRequest?: boolean;\n timedRequestTimeoutMs?: number;\n }): Promise<void> {\n const {\n endpointId,\n clusterId,\n request,\n command: { requestId, requestSchema, timed },\n asTimedRequest,\n timedRequestTimeoutMs = DEFAULT_TIMED_REQUEST_TIMEOUT_MS,\n } = options;\n const timedRequest = timed || asTimedRequest === true || options.timedRequestTimeoutMs !== undefined;\n\n return this.withMessenger<void>(async messenger => {\n logger.debug(\n `Invoking command with suppressedResponse: ${resolveCommandName({\n endpointId,\n clusterId,\n commandId: requestId,\n })} with ${Logger.toJSON(request)}`,\n );\n const commandFields = requestSchema.encodeTlv(request);\n\n if (timedRequest) {\n await messenger.sendTimedRequest(timedRequestTimeoutMs);\n }\n\n const invokeResponse = await messenger.sendInvokeCommand({\n invokeRequests: [{ commandPath: { endpointId, clusterId, commandId: requestId }, commandFields }],\n timedRequest,\n suppressResponse: true,\n interactionModelRevision: INTERACTION_MODEL_REVISION,\n });\n if (invokeResponse !== undefined) {\n throw new MatterFlowError(\n \"Response received from invoke interaction but none expected because response is suppressed.\",\n );\n }\n\n logger.debug(\n `Invoke successful: ${resolveCommandName({\n endpointId,\n clusterId,\n commandId: requestId,\n })}`,\n );\n });\n }\n\n private async withMessenger<T>(invoke: (messenger: InteractionClientMessenger) => Promise<T>): Promise<T> {\n const messenger = new InteractionClientMessenger(this.exchangeProvider);\n try {\n return await invoke(messenger);\n } finally {\n await messenger.close();\n }\n }\n\n private registerSubscriptionUpdateTimer(\n subscriptionId: number,\n maxInterval: number,\n updateTimeoutHandler: TimerCallback,\n ) {\n if (!this.ownSubscriptionIds.has(subscriptionId)) {\n throw new MatterFlowError(\n `Cannot register update timer for subscription ${subscriptionId} because it is not owned by this client.`,\n );\n }\n maxInterval += 5; // Add 5 seconds to the maxInterval to allow at least one full resubmission cycle before assuming the subscription is lost\n const timer = Time.getTimer(\"Subscription retry\", maxInterval * 1000, () => {\n logger.info(`Subscription ${subscriptionId} timed out ...`);\n this.removeSubscription(subscriptionId);\n // We remove all data because we don't know which data is still valid, so we better read from remote if needed\n this.subscribedLocalValues.clear();\n this.subscribedClusterDataVersions.clear();\n updateTimeoutHandler();\n }).start();\n this.subscriptionClient.registerSubscriptionUpdateTimer(subscriptionId, timer);\n }\n\n close() {\n for (const subscriptionId of this.ownSubscriptionIds) {\n this.removeSubscription(subscriptionId);\n }\n this.subscribedLocalValues.clear();\n this.subscribedClusterDataVersions.clear();\n }\n\n get session() {\n return this.exchangeProvider.session;\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 {\n Attribute,\n AttributeJsType,\n Command,\n Event,\n RequestType,\n ResponseType,\n TlvNoResponse,\n} from \"../../cluster/Cluster.js\";\nimport { resolveAttributeName, resolveCommandName, resolveEventName } from \"../../cluster/ClusterHelper.js\";\nimport { ImplementationError, MatterFlowError, UnexpectedDataError } from \"../../common/MatterError.js\";\nimport { AttributeId } from \"../../datatype/AttributeId.js\";\nimport { ClusterId } from \"../../datatype/ClusterId.js\";\nimport { EndpointNumber } from \"../../datatype/EndpointNumber.js\";\nimport { EventId } from \"../../datatype/EventId.js\";\nimport { EventNumber } from \"../../datatype/EventNumber.js\";\nimport { NodeId } from \"../../datatype/NodeId.js\";\nimport { Logger } from \"../../log/Logger.js\";\nimport { MessageExchange } from \"../../protocol/MessageExchange.js\";\nimport { ProtocolHandler } from \"../../protocol/ProtocolHandler.js\";\nimport { Time, Timer, TimerCallback } from \"../../time/Time.js\";\nimport { TypeFromSchema } from \"../../tlv/TlvSchema.js\";\nimport { ExchangeProvider } from \"../ExchangeManager.js\";\nimport { DecodedAttributeReportValue, normalizeAndDecodeReadAttributeReport } from \"./AttributeDataDecoder.js\";\nimport { DecodedEventData, DecodedEventReportValue, normalizeAndDecodeReadEventReport } from \"./EventDataDecoder.js\";\nimport {\n DataReport,\n IncomingInteractionClientMessenger,\n InteractionClientMessenger,\n ReadRequest,\n} from \"./InteractionMessenger.js\";\nimport { TlvAttributeReport, TlvEventFilter, TlvEventReport } from \"./InteractionProtocol.js\";\nimport {\n INTERACTION_MODEL_REVISION,\n INTERACTION_PROTOCOL_ID,\n attributePathToId,\n clusterPathToId,\n} from \"./InteractionServer.js\";\nimport { StatusCode, StatusResponseError } from \"./StatusCode.js\";\n\nconst logger = Logger.get(\"InteractionClient\");\n\nconst REQUEST_ALL = [{}];\nconst DEFAULT_TIMED_REQUEST_TIMEOUT_MS = 10_000; // 10 seconds\nconst DEFAULT_MINIMUM_RESPONSE_TIMEOUT_WITH_FAILSAFE_MS = 30_000; // 30 seconds\n\nexport interface AttributeStatus {\n path: {\n nodeId?: NodeId;\n endpointId?: EndpointNumber;\n clusterId?: ClusterId;\n attributeId?: AttributeId;\n };\n status: StatusCode;\n}\n\nexport class SubscriptionClient implements ProtocolHandler<MatterController> {\n private readonly subscriptionListeners = new Map<number, (dataReport: DataReport) => void>();\n private readonly subscriptionUpdateTimers = new Map<number, Timer>();\n\n constructor() {}\n\n getId() {\n return INTERACTION_PROTOCOL_ID;\n }\n\n registerSubscriptionListener(subscriptionId: number, listener: (dataReport: DataReport) => void) {\n this.subscriptionListeners.set(subscriptionId, listener);\n }\n\n removeSubscriptionListener(subscriptionId: number) {\n this.subscriptionListeners.delete(subscriptionId);\n }\n\n registerSubscriptionUpdateTimer(subscriptionId: number, timer: Timer) {\n this.subscriptionUpdateTimers.set(subscriptionId, timer);\n }\n\n removeSubscriptionUpdateTimer(subscriptionId: number) {\n this.subscriptionUpdateTimers.get(subscriptionId)?.stop();\n this.subscriptionUpdateTimers.delete(subscriptionId);\n }\n\n async onNewExchange(exchange: MessageExchange<MatterController>) {\n const messenger = new IncomingInteractionClientMessenger(exchange);\n const dataReport = await messenger.readDataReport();\n const subscriptionId = dataReport.subscriptionId;\n if (subscriptionId === undefined) {\n await messenger.sendStatus(StatusCode.InvalidSubscription);\n throw new UnexpectedDataError(\"Invalid Data report without Subscription ID\");\n }\n const listener = this.subscriptionListeners.get(subscriptionId);\n const timer = this.subscriptionUpdateTimers.get(subscriptionId);\n if (listener === undefined) {\n await messenger.sendStatus(StatusCode.InvalidSubscription);\n logger.info(`Received data for unknown subscription ID ${subscriptionId}. Cancel this subscription.`);\n if (timer !== undefined) {\n // Should not happen but let's make sure to clean up\n this.removeSubscriptionUpdateTimer(subscriptionId);\n }\n await messenger.close();\n return;\n }\n await messenger.sendStatus(StatusCode.Success);\n await messenger.close();\n\n if (timer !== undefined) {\n timer.stop().start(); // Restart timer because we received data\n }\n listener(dataReport);\n }\n\n async close() {\n this.subscriptionListeners.clear();\n this.subscriptionUpdateTimers.forEach(timer => timer.stop());\n this.subscriptionUpdateTimers.clear();\n }\n}\n\nexport class InteractionClient {\n // TODO Add storage for these data to be able to optimize follow up subscriptions by only request updated data\n private readonly subscribedLocalValues = new Map<string, any>();\n private readonly subscribedClusterDataVersions = new Map<string, number>();\n private readonly ownSubscriptionIds = new Set<number>();\n private readonly subscriptionClient: SubscriptionClient;\n\n constructor(\n private readonly exchangeProvider: ExchangeProvider,\n readonly nodeId: NodeId,\n ) {\n if (this.exchangeProvider.hasProtocolHandler(INTERACTION_PROTOCOL_ID)) {\n const client = this.exchangeProvider.getProtocolHandler(INTERACTION_PROTOCOL_ID);\n if (!(client instanceof SubscriptionClient)) {\n throw new ImplementationError(\n `Already existing protocol handler ${INTERACTION_PROTOCOL_ID} is not a SubscriptionClient.`,\n );\n }\n this.subscriptionClient = client;\n } else {\n this.subscriptionClient = new SubscriptionClient();\n this.exchangeProvider.addProtocolHandler(this.subscriptionClient);\n }\n }\n\n registerSubscriptionListener(subscriptionId: number, listener: (dataReport: DataReport) => void) {\n this.ownSubscriptionIds.add(subscriptionId);\n this.subscriptionClient.registerSubscriptionListener(subscriptionId, listener);\n }\n\n removeSubscription(subscriptionId: number) {\n this.ownSubscriptionIds.delete(subscriptionId);\n this.subscriptionClient.removeSubscriptionListener(subscriptionId);\n this.subscriptionClient.removeSubscriptionUpdateTimer(subscriptionId);\n }\n\n async getAllAttributes(\n options: {\n dataVersionFilters?: { endpointId: EndpointNumber; clusterId: ClusterId; dataVersion: number }[];\n isFabricFiltered?: boolean;\n } = {},\n ): Promise<DecodedAttributeReportValue<any>[]> {\n const { dataVersionFilters, isFabricFiltered } = options;\n return (\n await this.getMultipleAttributesAndEvents({\n attributes: REQUEST_ALL,\n dataVersionFilters,\n isFabricFiltered,\n })\n ).attributeReports;\n }\n\n async getAllEvents(\n options: {\n eventFilters?: TypeFromSchema<typeof TlvEventFilter>[];\n isFabricFiltered?: boolean;\n } = {},\n ): Promise<DecodedEventReportValue<any>[]> {\n const { eventFilters, isFabricFiltered } = options;\n return (await this.getMultipleAttributesAndEvents({ events: REQUEST_ALL, eventFilters, isFabricFiltered }))\n .eventReports;\n }\n\n async getAllAttributesAndEvents(\n options: {\n dataVersionFilters?: {\n endpointId: EndpointNumber;\n clusterId: ClusterId;\n dataVersion: number;\n }[];\n eventFilters?: TypeFromSchema<typeof TlvEventFilter>[];\n isFabricFiltered?: boolean;\n } = {},\n ): Promise<{\n attributeReports: DecodedAttributeReportValue<any>[];\n eventReports: DecodedEventReportValue<any>[];\n }> {\n const { dataVersionFilters, eventFilters, isFabricFiltered } = options;\n return this.getMultipleAttributesAndEvents({\n attributes: REQUEST_ALL,\n events: REQUEST_ALL,\n eventFilters,\n dataVersionFilters,\n isFabricFiltered,\n });\n }\n\n async getMultipleAttributes(\n options: {\n attributes?: { endpointId?: EndpointNumber; clusterId?: ClusterId; attributeId?: AttributeId }[];\n dataVersionFilters?: { endpointId: EndpointNumber; clusterId: ClusterId; dataVersion: number }[];\n isFabricFiltered?: boolean;\n } = {},\n ): Promise<DecodedAttributeReportValue<any>[]> {\n const { attributes, dataVersionFilters, isFabricFiltered } = options;\n return (await this.getMultipleAttributesAndEvents({ attributes, dataVersionFilters, isFabricFiltered }))\n .attributeReports;\n }\n\n async getMultipleEvents(\n options: {\n events?: { endpointId?: EndpointNumber; clusterId?: ClusterId; eventId?: EventId }[];\n eventFilters?: TypeFromSchema<typeof TlvEventFilter>[];\n isFabricFiltered?: boolean;\n } = {},\n ): Promise<DecodedEventReportValue<any>[]> {\n const { events, eventFilters, isFabricFiltered } = options;\n return (await this.getMultipleAttributesAndEvents({ events, eventFilters, isFabricFiltered })).eventReports;\n }\n\n async getMultipleAttributesAndEvents(\n options: {\n attributes?: { endpointId?: EndpointNumber; clusterId?: ClusterId; attributeId?: AttributeId }[];\n dataVersionFilters?: { endpointId: EndpointNumber; clusterId: ClusterId; dataVersion: number }[];\n events?: { endpointId?: EndpointNumber; clusterId?: ClusterId; eventId?: EventId }[];\n eventFilters?: TypeFromSchema<typeof TlvEventFilter>[];\n isFabricFiltered?: boolean;\n } = {},\n ): Promise<{\n attributeReports: DecodedAttributeReportValue<any>[];\n eventReports: DecodedEventReportValue<any>[];\n }> {\n const {\n attributes: attributeRequests,\n dataVersionFilters,\n events: eventRequests,\n eventFilters,\n isFabricFiltered = true,\n } = options;\n if (attributeRequests === undefined && eventRequests === undefined) {\n throw new ImplementationError(\"When reading attributes and events, at least one must be specified.\");\n }\n\n const readPathsCount = (attributeRequests?.length ?? 0) + (eventRequests?.length ?? 0);\n if (readPathsCount > 9) {\n logger.debug(\n \"Read interactions with more then 9 paths might be not allowed by the device. Consider splitting then into several read requests.\",\n );\n }\n\n return this.withMessenger<{\n attributeReports: DecodedAttributeReportValue<any>[];\n eventReports: DecodedEventReportValue<any>[];\n }>(async messenger => {\n return await this.processReadRequest(messenger, {\n attributeRequests,\n dataVersionFilters: dataVersionFilters?.map(({ endpointId, clusterId, dataVersion }) => ({\n path: { endpointId, clusterId },\n dataVersion,\n })),\n eventRequests,\n eventFilters,\n isFabricFiltered,\n interactionModelRevision: INTERACTION_MODEL_REVISION,\n });\n });\n }\n\n async getAttribute<A extends Attribute<any, any>>(options: {\n endpointId: EndpointNumber;\n clusterId: ClusterId;\n attribute: A;\n isFabricFiltered?: boolean;\n alwaysRequestFromRemote?: boolean;\n }): Promise<AttributeJsType<A> | undefined> {\n const { endpointId, clusterId, attribute, alwaysRequestFromRemote = false, isFabricFiltered } = options;\n const response = await this.getAttributeWithVersion({\n endpointId,\n clusterId,\n attribute,\n alwaysRequestFromRemote,\n isFabricFiltered,\n });\n return response?.value;\n }\n\n async getAttributeWithVersion<A extends Attribute<any, any>>(options: {\n endpointId: EndpointNumber;\n clusterId: ClusterId;\n attribute: A;\n isFabricFiltered?: boolean;\n alwaysRequestFromRemote?: boolean;\n }): Promise<{ value: AttributeJsType<A>; version: number } | undefined> {\n const { endpointId, clusterId, attribute, alwaysRequestFromRemote = false, isFabricFiltered } = options;\n const { id: attributeId } = attribute;\n if (!alwaysRequestFromRemote) {\n const value = this.subscribedLocalValues.get(attributePathToId({ endpointId, clusterId, attributeId }));\n const version = this.subscribedClusterDataVersions.get(clusterPathToId({ endpointId, clusterId }));\n if (value !== undefined && version !== undefined) {\n return { value, version } as { value: AttributeJsType<A>; version: number };\n }\n }\n\n const { attributeReports } = await this.getMultipleAttributesAndEvents({\n attributes: [{ endpointId, clusterId, attributeId }],\n isFabricFiltered,\n });\n\n if (attributeReports.length === 0) {\n return undefined;\n }\n if (attributeReports.length > 1) {\n throw new UnexpectedDataError(\"Unexpected response with more then one attribute\");\n }\n return { value: attributeReports[0].value, version: attributeReports[0].version };\n }\n\n async getEvent<T, E extends Event<T, any>>(options: {\n endpointId: EndpointNumber;\n clusterId: ClusterId;\n event: E;\n minimumEventNumber?: EventNumber;\n isFabricFiltered?: boolean;\n }): Promise<DecodedEventData<T>[] | undefined> {\n const { endpointId, clusterId, event, minimumEventNumber, isFabricFiltered = true } = options;\n const { id: eventId } = event;\n const response = await this.getMultipleAttributesAndEvents({\n events: [{ endpointId, clusterId, eventId }],\n eventFilters: minimumEventNumber !== undefined ? [{ eventMin: minimumEventNumber }] : undefined,\n isFabricFiltered,\n });\n return response?.eventReports[0]?.events;\n }\n\n private async processReadRequest(\n messenger: InteractionClientMessenger,\n request: ReadRequest,\n ): Promise<{ attributeReports: DecodedAttributeReportValue<any>[]; eventReports: DecodedEventReportValue<any>[] }> {\n const { attributeRequests, eventRequests } = request;\n logger.debug(\n `Sending read request to ${messenger.getExchangeChannelName()} for attributes ${attributeRequests\n ?.map(path => resolveAttributeName(path))\n .join(\", \")} and events ${eventRequests?.map(path => resolveEventName(path)).join(\", \")}`,\n );\n // Send read request and combine all (potentially chunked) responses\n let response = await messenger.sendReadRequest(request);\n const attributeReports = new Array<TypeFromSchema<typeof TlvAttributeReport>>();\n const eventReports = new Array<TypeFromSchema<typeof TlvEventReport>>();\n\n while (true) {\n if (response.attributeReports !== undefined) {\n attributeReports.push(...response.attributeReports);\n }\n if (response.eventReports !== undefined) {\n eventReports.push(...response.eventReports);\n }\n if (!response.suppressResponse) {\n await messenger.sendStatus(StatusCode.Success);\n }\n if (!response.moreChunkedMessages) break;\n response = await messenger.readDataReport();\n }\n\n // Normalize and decode the response\n const normalizedResult = {\n attributeReports: normalizeAndDecodeReadAttributeReport(attributeReports),\n eventReports: normalizeAndDecodeReadEventReport(eventReports),\n };\n logger.debug(\n `Received read response with attributes ${normalizedResult.attributeReports\n .map(({ path, value }) => `${resolveAttributeName(path)} = ${Logger.toJSON(value)}`)\n .join(\", \")} and events ${normalizedResult.eventReports\n .map(({ path, events }) => `${resolveEventName(path)} = ${Logger.toJSON(events)}`)\n .join(\", \")}`,\n );\n return normalizedResult;\n }\n\n async setAttribute<T>(options: {\n attributeData: {\n endpointId: EndpointNumber;\n clusterId: ClusterId;\n attribute: Attribute<T, any>;\n value: T;\n dataVersion?: number;\n };\n asTimedRequest?: boolean;\n timedRequestTimeoutMs?: number;\n suppressResponse?: boolean;\n }): Promise<void> {\n const { attributeData, asTimedRequest, timedRequestTimeoutMs, suppressResponse } = options;\n const { endpointId, clusterId, attribute, value, dataVersion } = attributeData;\n const response = await this.setMultipleAttributes({\n attributes: [{ endpointId, clusterId, attribute, value, dataVersion }],\n asTimedRequest,\n timedRequestTimeoutMs,\n suppressResponse,\n });\n\n // Response contains Status error if there was an error on write\n if (response.length) {\n const {\n path: { endpointId, clusterId, attributeId },\n status,\n } = response[0];\n if (status !== undefined && status !== StatusCode.Success) {\n throw new StatusResponseError(\n `Error setting attribute ${endpointId}/${clusterId}/${attributeId}`,\n status,\n );\n }\n }\n }\n\n async setMultipleAttributes(options: {\n attributes: {\n endpointId: EndpointNumber;\n clusterId: ClusterId;\n attribute: Attribute<any, any>;\n value: any;\n dataVersion?: number;\n }[];\n asTimedRequest?: boolean;\n timedRequestTimeoutMs?: number;\n suppressResponse?: boolean;\n }): Promise<AttributeStatus[]> {\n const {\n attributes,\n asTimedRequest,\n timedRequestTimeoutMs = DEFAULT_TIMED_REQUEST_TIMEOUT_MS,\n suppressResponse = false,\n } = options;\n return this.withMessenger<AttributeStatus[]>(async messenger => {\n logger.debug(\n `Sending write request: ${attributes\n .map(\n ({ endpointId, clusterId, attribute: { id }, value, dataVersion }) =>\n `${resolveAttributeName({ endpointId, clusterId, attributeId: id })} = ${Logger.toJSON(\n value,\n )} (version=${dataVersion})`,\n )\n .join(\", \")}`,\n );\n const writeRequests = attributes.map(\n ({ endpointId, clusterId, attribute: { id, schema }, value, dataVersion }) => ({\n path: { endpointId, clusterId, attributeId: id },\n data: schema.encodeTlv(value, { forWriteInteraction: true }),\n dataVersion,\n }),\n );\n const timedRequest =\n attributes.some(({ attribute: { timed } }) => timed) ||\n asTimedRequest === true ||\n options.timedRequestTimeoutMs !== undefined;\n if (timedRequest) {\n await messenger.sendTimedRequest(timedRequestTimeoutMs);\n }\n const response = await messenger.sendWriteCommand({\n suppressResponse,\n timedRequest,\n writeRequests,\n moreChunkedMessages: false,\n interactionModelRevision: INTERACTION_MODEL_REVISION,\n });\n if (response === undefined) {\n if (!suppressResponse) {\n throw new MatterFlowError(`No response received from write interaction but expected.`);\n }\n return [];\n }\n return response.writeResponses\n .flatMap(\n ({ status: { status, clusterStatus }, path: { nodeId, endpointId, clusterId, attributeId } }) => {\n return {\n path: { nodeId, endpointId, clusterId, attributeId },\n status: status ?? clusterStatus ?? StatusCode.Failure,\n };\n },\n )\n .filter(({ status }) => status !== StatusCode.Success);\n });\n }\n\n async subscribeAttribute<A extends Attribute<any, any>>(options: {\n endpointId: EndpointNumber;\n clusterId: ClusterId;\n attribute: A;\n minIntervalFloorSeconds: number;\n maxIntervalCeilingSeconds: number;\n isFabricFiltered?: boolean;\n knownDataVersion?: number;\n keepSubscriptions?: boolean;\n listener?: (value: AttributeJsType<A>, version: number) => void;\n updateTimeoutHandler?: TimerCallback;\n }): Promise<void> {\n const {\n endpointId,\n clusterId,\n attribute,\n minIntervalFloorSeconds,\n maxIntervalCeilingSeconds,\n isFabricFiltered = true,\n listener,\n knownDataVersion,\n keepSubscriptions = true,\n updateTimeoutHandler,\n } = options;\n return this.withMessenger<void>(async messenger => {\n const { id: attributeId } = attribute;\n logger.debug(\n `Sending subscribe request for attribute: ${resolveAttributeName({\n endpointId,\n clusterId,\n attributeId,\n })}`,\n );\n const {\n report,\n subscribeResponse: { subscriptionId, maxInterval },\n } = await messenger.sendSubscribeRequest({\n interactionModelRevision: INTERACTION_MODEL_REVISION,\n attributeRequests: [{ endpointId, clusterId, attributeId }],\n dataVersionFilters:\n knownDataVersion !== undefined\n ? [{ path: { endpointId, clusterId }, dataVersion: knownDataVersion }]\n : undefined,\n keepSubscriptions,\n minIntervalFloorSeconds,\n maxIntervalCeilingSeconds,\n isFabricFiltered,\n });\n\n const subscriptionListener = (dataReport: DataReport) => {\n if (!Array.isArray(dataReport.attributeReports) || !dataReport.attributeReports.length) {\n logger.debug(\"Subscription result empty\");\n return;\n }\n\n const data = normalizeAndDecodeReadAttributeReport(dataReport.attributeReports);\n\n if (data.length === 0) {\n throw new MatterFlowError(\"Subscription result reporting undefined/no value not specified\");\n }\n if (data.length > 1) {\n throw new UnexpectedDataError(\"Unexpected response with more then one attribute\");\n }\n const {\n path: { endpointId, clusterId, attributeId },\n value,\n version,\n } = data[0];\n if (value === undefined)\n throw new MatterFlowError(\"Subscription result reporting undefined value not specified.\");\n\n this.subscribedLocalValues.set(attributePathToId({ endpointId, clusterId, attributeId }), value);\n this.subscribedClusterDataVersions.set(clusterPathToId({ endpointId, clusterId }), version);\n listener?.(value, version);\n };\n this.registerSubscriptionListener(subscriptionId, subscriptionListener);\n if (updateTimeoutHandler !== undefined) {\n this.registerSubscriptionUpdateTimer(subscriptionId, maxInterval, updateTimeoutHandler);\n }\n subscriptionListener(report);\n return;\n });\n }\n\n async subscribeEvent<T, E extends Event<T, any>>(options: {\n endpointId: EndpointNumber;\n clusterId: ClusterId;\n event: E;\n minIntervalFloorSeconds: number;\n maxIntervalCeilingSeconds: number;\n isUrgent?: boolean;\n minimumEventNumber?: EventNumber;\n isFabricFiltered?: boolean;\n listener?: (value: DecodedEventData<T>) => void;\n updateTimeoutHandler?: TimerCallback;\n }): Promise<void> {\n return this.withMessenger<void>(async messenger => {\n const {\n endpointId,\n clusterId,\n event,\n minIntervalFloorSeconds,\n maxIntervalCeilingSeconds,\n isUrgent,\n minimumEventNumber,\n isFabricFiltered = true,\n listener,\n updateTimeoutHandler,\n } = options;\n const { id: eventId } = event;\n logger.debug(\n `Sending subscribe request for event: ${resolveEventName({ endpointId, clusterId, eventId })}`,\n );\n const {\n report,\n subscribeResponse: { subscriptionId, maxInterval },\n } = await messenger.sendSubscribeRequest({\n interactionModelRevision: INTERACTION_MODEL_REVISION,\n eventRequests: [{ endpointId, clusterId, eventId, isUrgent }],\n eventFilters: minimumEventNumber !== undefined ? [{ eventMin: minimumEventNumber }] : undefined,\n keepSubscriptions: true,\n minIntervalFloorSeconds,\n maxIntervalCeilingSeconds,\n isFabricFiltered,\n });\n\n const subscriptionListener = (dataReport: DataReport) => {\n if (!Array.isArray(dataReport.eventReports) || !dataReport.eventReports.length) {\n logger.debug(\"Subscription result empty\");\n return;\n }\n\n const data = normalizeAndDecodeReadEventReport(dataReport.eventReports);\n\n if (data.length === 0) {\n throw new MatterFlowError(\"Received empty subscription result value.\");\n }\n if (data.length > 1) {\n throw new UnexpectedDataError(\"Unexpected response with more then one attribute.\");\n }\n const { events } = data[0];\n if (events === undefined)\n throw new MatterFlowError(\"Subscription result reporting undefined value not specified.\");\n\n events.forEach(event => listener?.(event));\n };\n this.registerSubscriptionListener(subscriptionId, subscriptionListener);\n if (updateTimeoutHandler !== undefined) {\n this.registerSubscriptionUpdateTimer(subscriptionId, maxInterval, updateTimeoutHandler);\n }\n subscriptionListener(report);\n return;\n });\n }\n\n async subscribeAllAttributesAndEvents(options: {\n minIntervalFloorSeconds: number;\n maxIntervalCeilingSeconds: number;\n attributeListener?: (data: DecodedAttributeReportValue<any>) => void;\n eventListener?: (data: DecodedEventReportValue<any>) => void;\n isUrgent?: boolean;\n keepSubscriptions?: boolean;\n isFabricFiltered?: boolean;\n eventFilters?: TypeFromSchema<typeof TlvEventFilter>[];\n dataVersionFilters?: { endpointId: EndpointNumber; clusterId: ClusterId; dataVersion: number }[];\n updateTimeoutHandler?: TimerCallback;\n }): Promise<{\n attributeReports?: DecodedAttributeReportValue<any>[];\n eventReports?: DecodedEventReportValue<any>[];\n }> {\n const {\n minIntervalFloorSeconds,\n maxIntervalCeilingSeconds,\n attributeListener,\n eventListener,\n isUrgent,\n keepSubscriptions = true,\n isFabricFiltered = true,\n eventFilters,\n dataVersionFilters,\n updateTimeoutHandler,\n } = options;\n return this.subscribeMultipleAttributesAndEvents({\n attributes: REQUEST_ALL,\n events: [{ isUrgent }],\n minIntervalFloorSeconds,\n maxIntervalCeilingSeconds,\n keepSubscriptions,\n isFabricFiltered,\n attributeListener,\n eventListener,\n eventFilters,\n dataVersionFilters,\n updateTimeoutHandler,\n });\n }\n\n async subscribeMultipleAttributesAndEvents(options: {\n attributes: { endpointId?: EndpointNumber; clusterId?: ClusterId; attributeId?: AttributeId }[];\n events: { endpointId?: EndpointNumber; clusterId?: ClusterId; eventId?: EventId; isUrgent?: boolean }[];\n minIntervalFloorSeconds: number;\n maxIntervalCeilingSeconds: number;\n keepSubscriptions?: boolean;\n isFabricFiltered?: boolean;\n attributeListener?: (data: DecodedAttributeReportValue<any>) => void;\n eventListener?: (data: DecodedEventReportValue<any>) => void;\n eventFilters?: TypeFromSchema<typeof TlvEventFilter>[];\n dataVersionFilters?: { endpointId: EndpointNumber; clusterId: ClusterId; dataVersion: number }[];\n updateTimeoutHandler?: TimerCallback;\n }): Promise<{\n attributeReports?: DecodedAttributeReportValue<any>[];\n eventReports?: DecodedEventReportValue<any>[];\n }> {\n const {\n attributes: attributeRequests,\n events: eventRequests,\n minIntervalFloorSeconds,\n maxIntervalCeilingSeconds,\n keepSubscriptions = true,\n isFabricFiltered = true,\n attributeListener,\n eventListener,\n eventFilters,\n dataVersionFilters,\n updateTimeoutHandler,\n } = options;\n\n const subscriptionPathsCount = (attributeRequests?.length ?? 0) + (eventRequests?.length ?? 0);\n if (subscriptionPathsCount > 3) {\n logger.debug(\"Subscribe interactions with more then 3 paths might be not allowed by the device.\");\n }\n\n return this.withMessenger<{\n attributeReports?: DecodedAttributeReportValue<any>[];\n eventReports?: DecodedEventReportValue<any>[];\n }>(async messenger => {\n logger.debug(\n `Sending subscribe request: attributes: ${attributeRequests\n .map(path => resolveAttributeName(path))\n .join(\", \")} and events: ${eventRequests.map(path => resolveEventName(path)).join(\", \")}`,\n );\n const {\n report,\n subscribeResponse: { subscriptionId, maxInterval },\n } = await messenger.sendSubscribeRequest({\n interactionModelRevision: INTERACTION_MODEL_REVISION,\n attributeRequests,\n eventRequests,\n keepSubscriptions,\n minIntervalFloorSeconds,\n maxIntervalCeilingSeconds,\n isFabricFiltered,\n eventFilters,\n dataVersionFilters: dataVersionFilters?.map(({ endpointId, clusterId, dataVersion }) => ({\n path: { endpointId, clusterId },\n dataVersion,\n })),\n });\n logger.info(\n `Subscription successfully initialized with ID ${subscriptionId} and maxInterval ${maxInterval}s.`,\n );\n\n const subscriptionListener = (dataReport: {\n attributeReports?: DecodedAttributeReportValue<any>[];\n eventReports?: DecodedEventReportValue<any>[];\n }) => {\n if (\n (!Array.isArray(dataReport.attributeReports) || !dataReport.attributeReports.length) &&\n (!Array.isArray(dataReport.eventReports) || !dataReport.eventReports.length)\n ) {\n logger.debug(\"Subscription result empty\");\n return;\n }\n const { attributeReports, eventReports } = dataReport;\n\n if (attributeReports !== undefined) {\n attributeReports.forEach(data => {\n const {\n path: { endpointId, clusterId, attributeId },\n value,\n version,\n } = data;\n logger.debug(\n `Received attribute update: ${resolveAttributeName({\n endpointId,\n clusterId,\n attributeId,\n })} = ${Logger.toJSON(value)} (version=${version})`,\n );\n if (value === undefined) throw new MatterFlowError(\"Received empty subscription result value.\");\n this.subscribedLocalValues.set(\n attributePathToId({ endpointId, clusterId, attributeId }),\n value,\n );\n this.subscribedClusterDataVersions.set(clusterPathToId({ endpointId, clusterId }), version);\n attributeListener?.(data);\n });\n }\n\n if (eventReports !== undefined) {\n eventReports.forEach(data => {\n logger.debug(\n `Received event update: ${resolveEventName(data.path)}: ${Logger.toJSON(data.events)}`,\n );\n eventListener?.(data);\n });\n }\n };\n this.registerSubscriptionListener(subscriptionId, dataReport => {\n subscriptionListener({\n attributeReports:\n dataReport.attributeReports !== undefined\n ? normalizeAndDecodeReadAttributeReport(dataReport.attributeReports)\n : undefined,\n eventReports:\n dataReport.eventReports !== undefined\n ? normalizeAndDecodeReadEventReport(dataReport.eventReports)\n : undefined,\n });\n });\n\n if (updateTimeoutHandler !== undefined) {\n this.registerSubscriptionUpdateTimer(subscriptionId, maxInterval, updateTimeoutHandler);\n }\n\n const seedReport = {\n attributeReports:\n report.attributeReports !== undefined\n ? normalizeAndDecodeReadAttributeReport(report.attributeReports)\n : undefined,\n eventReports:\n report.eventReports !== undefined\n ? normalizeAndDecodeReadEventReport(report.eventReports)\n : undefined,\n };\n subscriptionListener(seedReport);\n return seedReport;\n });\n }\n\n async invoke<C extends Command<any, any, any>>(options: {\n endpointId: EndpointNumber;\n clusterId: ClusterId;\n request: RequestType<C>;\n command: C;\n asTimedRequest?: boolean;\n timedRequestTimeoutMs?: number;\n useExtendedFailSafeMessageResponseTimeout?: boolean;\n }): Promise<ResponseType<C>> {\n const {\n endpointId,\n clusterId,\n request,\n command: { requestId, requestSchema, responseId, responseSchema, optional, timed },\n asTimedRequest,\n timedRequestTimeoutMs = DEFAULT_TIMED_REQUEST_TIMEOUT_MS,\n useExtendedFailSafeMessageResponseTimeout = false,\n } = options;\n const timedRequest = timed || asTimedRequest === true || options.timedRequestTimeoutMs !== undefined;\n\n return this.withMessenger<ResponseType<C>>(async messenger => {\n logger.debug(\n `Invoking command: ${resolveCommandName({\n endpointId,\n clusterId,\n commandId: requestId,\n })} with ${Logger.toJSON(request)}`,\n );\n\n requestSchema.validate(request);\n\n const commandFields = requestSchema.encodeTlv(request);\n\n if (timedRequest) {\n await messenger.sendTimedRequest(timedRequestTimeoutMs);\n }\n\n const invokeResponse = await messenger.sendInvokeCommand(\n {\n invokeRequests: [{ commandPath: { endpointId, clusterId, commandId: requestId }, commandFields }],\n timedRequest,\n suppressResponse: false,\n interactionModelRevision: INTERACTION_MODEL_REVISION,\n },\n useExtendedFailSafeMessageResponseTimeout\n ? DEFAULT_MINIMUM_RESPONSE_TIMEOUT_WITH_FAILSAFE_MS\n : undefined,\n );\n if (invokeResponse === undefined) {\n throw new MatterFlowError(\"No response received from invoke interaction but expected.\");\n }\n const { invokeResponses } = invokeResponse;\n if (invokeResponses.length === 0) {\n throw new MatterFlowError(\"Received invoke response with no invoke results.\");\n }\n const { command, status } = invokeResponses[0];\n if (status !== undefined) {\n const resultCode = status.status.status;\n if (resultCode !== StatusCode.Success)\n throw new StatusResponseError(\n `Received non-success result: ${resultCode}`,\n resultCode ?? StatusCode.Failure,\n status.status.clusterStatus,\n );\n if ((responseSchema as any) !== TlvNoResponse)\n throw new MatterFlowError(\"A response was expected for this command.\");\n return undefined as unknown as ResponseType<C>; // ResponseType is void, force casting the empty result\n }\n if (command !== undefined) {\n const {\n commandPath: { commandId },\n commandFields,\n } = command;\n if (commandId !== responseId) {\n throw new MatterFlowError(\n `Received invoke response with unexpected command ID ${commandId}, expected ${responseId}.`,\n );\n }\n if (commandFields === undefined) {\n if ((responseSchema as any) !== TlvNoResponse)\n throw new MatterFlowError(`A response was expected for command ${requestId}.`);\n return undefined as unknown as ResponseType<C>; // ResponseType is void, force casting the empty result\n }\n const response = responseSchema.decodeTlv(commandFields);\n logger.debug(\n `Received invoke response: ${resolveCommandName({\n endpointId,\n clusterId,\n commandId: requestId,\n })} with ${Logger.toJSON(response)})}`,\n );\n return response;\n }\n if (optional) {\n return undefined as ResponseType<C>; // ResponseType allows undefined for optional commands\n }\n throw new MatterFlowError(\"Received invoke response with no result nor response.\");\n });\n }\n\n // TODO Add to ClusterClient when needed/when Group communication is implemented\n async invokeWithSuppressedResponse<C extends Command<any, any, any>>(options: {\n endpointId: EndpointNumber;\n clusterId: ClusterId;\n request: RequestType<C>;\n command: C;\n asTimedRequest?: boolean;\n timedRequestTimeoutMs?: number;\n }): Promise<void> {\n const {\n endpointId,\n clusterId,\n request,\n command: { requestId, requestSchema, timed },\n asTimedRequest,\n timedRequestTimeoutMs = DEFAULT_TIMED_REQUEST_TIMEOUT_MS,\n } = options;\n const timedRequest = timed || asTimedRequest === true || options.timedRequestTimeoutMs !== undefined;\n\n return this.withMessenger<void>(async messenger => {\n logger.debug(\n `Invoking command with suppressedResponse: ${resolveCommandName({\n endpointId,\n clusterId,\n commandId: requestId,\n })} with ${Logger.toJSON(request)}`,\n );\n const commandFields = requestSchema.encodeTlv(request);\n\n if (timedRequest) {\n await messenger.sendTimedRequest(timedRequestTimeoutMs);\n }\n\n const invokeResponse = await messenger.sendInvokeCommand({\n invokeRequests: [{ commandPath: { endpointId, clusterId, commandId: requestId }, commandFields }],\n timedRequest,\n suppressResponse: true,\n interactionModelRevision: INTERACTION_MODEL_REVISION,\n });\n if (invokeResponse !== undefined) {\n throw new MatterFlowError(\n \"Response received from invoke interaction but none expected because response is suppressed.\",\n );\n }\n\n logger.debug(\n `Invoke successful: ${resolveCommandName({\n endpointId,\n clusterId,\n commandId: requestId,\n })}`,\n );\n });\n }\n\n private async withMessenger<T>(invoke: (messenger: InteractionClientMessenger) => Promise<T>): Promise<T> {\n const messenger = new InteractionClientMessenger(this.exchangeProvider);\n try {\n return await invoke(messenger);\n } finally {\n await messenger.close();\n }\n }\n\n private registerSubscriptionUpdateTimer(\n subscriptionId: number,\n maxInterval: number,\n updateTimeoutHandler: TimerCallback,\n ) {\n if (!this.ownSubscriptionIds.has(subscriptionId)) {\n throw new MatterFlowError(\n `Cannot register update timer for subscription ${subscriptionId} because it is not owned by this client.`,\n );\n }\n maxInterval += 5; // Add 5 seconds to the maxInterval to allow at least one full resubmission cycle before assuming the subscription is lost\n const timer = Time.getTimer(\"Subscription retry\", maxInterval * 1000, () => {\n logger.info(`Subscription ${subscriptionId} timed out ...`);\n this.removeSubscription(subscriptionId);\n // We remove all data because we don't know which data is still valid, so we better read from remote if needed\n this.subscribedLocalValues.clear();\n this.subscribedClusterDataVersions.clear();\n updateTimeoutHandler();\n }).start();\n this.subscriptionClient.registerSubscriptionUpdateTimer(subscriptionId, timer);\n }\n\n close() {\n for (const subscriptionId of this.ownSubscriptionIds) {\n this.removeSubscription(subscriptionId);\n }\n this.subscribedLocalValues.clear();\n this.subscribedClusterDataVersions.clear();\n }\n\n get session() {\n return this.exchangeProvider.session;\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["endpointId", "clusterId", "attributeId", "event", "commandFields"]
|
|
7
7
|
}
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
import { AnyAttributeServer } from "../../cluster/server/AttributeServer.js";
|
|
7
7
|
import { ClusterServerObj } from "../../cluster/server/ClusterServerTypes.js";
|
|
8
8
|
import { CommandServer } from "../../cluster/server/CommandServer.js";
|
|
9
|
-
import {
|
|
9
|
+
import { AnyEventServer } from "../../cluster/server/EventServer.js";
|
|
10
10
|
import { AttributeId } from "../../datatype/AttributeId.js";
|
|
11
11
|
import { ClusterId } from "../../datatype/ClusterId.js";
|
|
12
12
|
import { CommandId } from "../../datatype/CommandId.js";
|
|
@@ -22,7 +22,7 @@ export declare class InteractionEndpointStructure {
|
|
|
22
22
|
endpoints: Map<EndpointNumber, EndpointInterface>;
|
|
23
23
|
attributes: Map<string, AnyAttributeServer<any>>;
|
|
24
24
|
attributePaths: AttributePath[];
|
|
25
|
-
events: Map<string,
|
|
25
|
+
events: Map<string, AnyEventServer<any, any>>;
|
|
26
26
|
eventPaths: EventPath[];
|
|
27
27
|
commands: Map<string, CommandServer<any, any>>;
|
|
28
28
|
commandPaths: CommandPath[];
|
|
@@ -44,7 +44,7 @@ export declare class InteractionEndpointStructure {
|
|
|
44
44
|
getAttribute(endpointId: EndpointNumber, clusterId: ClusterId, attributeId: AttributeId): AnyAttributeServer<any> | undefined;
|
|
45
45
|
hasAttribute(endpointId: EndpointNumber, clusterId: ClusterId, attributeId: AttributeId): boolean;
|
|
46
46
|
validateConcreteAttributePath(endpointId: EndpointNumber, clusterId: ClusterId, attributeId: AttributeId): boolean;
|
|
47
|
-
getEvent(endpointId: EndpointNumber, clusterId: ClusterId, eventId: EventId):
|
|
47
|
+
getEvent(endpointId: EndpointNumber, clusterId: ClusterId, eventId: EventId): AnyEventServer<any, any> | undefined;
|
|
48
48
|
hasEvent(endpointId: EndpointNumber, clusterId: ClusterId, eventId: EventId): boolean;
|
|
49
49
|
validateConcreteEventPath(endpointId: EndpointNumber, clusterId: ClusterId, eventId: EventId): boolean;
|
|
50
50
|
getCommand(endpointId: EndpointNumber, clusterId: ClusterId, commandId: CommandId): CommandServer<any, any> | undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"InteractionEndpointStructure.d.ts","sourceRoot":"","sources":["../../../../src/protocol/interaction/InteractionEndpointStructure.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,kBAAkB,EAAE,MAAM,yCAAyC,CAAC;AAC7E,OAAO,EAAE,gBAAgB,EAA2B,MAAM,4CAA4C,CAAC;AACvG,OAAO,EAAE,aAAa,EAAE,MAAM,uCAAuC,CAAC;AACtE,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"InteractionEndpointStructure.d.ts","sourceRoot":"","sources":["../../../../src/protocol/interaction/InteractionEndpointStructure.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/protocol/interaction/InteractionEndpointStructure.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * @license\n * Copyright 2022-2024 Matter.js Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { AnyAttributeServer } from \"../../cluster/server/AttributeServer.js\";\nimport { ClusterServerObj, asClusterServerInternal } from \"../../cluster/server/ClusterServerTypes.js\";\nimport { CommandServer } from \"../../cluster/server/CommandServer.js\";\nimport { EventServer } from \"../../cluster/server/EventServer.js\";\nimport { ImplementationError, InternalError } from \"../../common/MatterError.js\";\nimport { AttributeId } from \"../../datatype/AttributeId.js\";\nimport { ClusterId } from \"../../datatype/ClusterId.js\";\nimport { CommandId } from \"../../datatype/CommandId.js\";\nimport { EndpointNumber } from \"../../datatype/EndpointNumber.js\";\nimport { EventId } from \"../../datatype/EventId.js\";\nimport { NodeId } from \"../../datatype/NodeId.js\";\nimport { EndpointInterface } from \"../../endpoint/EndpointInterface.js\";\nimport { TypeFromSchema } from \"../../tlv/TlvSchema.js\";\nimport { Observable } from \"../../util/Observable.js\";\nimport { TlvAttributePath, TlvCommandPath, TlvEventPath } from \"./InteractionProtocol.js\";\nimport {\n AttributePath,\n AttributeWithPath,\n CommandPath,\n CommandWithPath,\n EventPath,\n EventWithPath,\n attributePathToId,\n commandPathToId,\n eventPathToId,\n genericElementPathToId,\n} from \"./InteractionServer.js\";\nimport { StatusCode, StatusResponseError } from \"./StatusCode.js\";\n\nexport class InteractionEndpointStructure {\n endpoints = new Map<EndpointNumber, EndpointInterface>();\n attributes = new Map<string, AnyAttributeServer<any>>();\n attributePaths = new Array<AttributePath>();\n events = new Map<string, EventServer<any, any>>();\n eventPaths = new Array<EventPath>();\n commands = new Map<string, CommandServer<any, any>>();\n commandPaths = new Array<CommandPath>();\n change = new Observable();\n\n public clear() {\n this.endpoints.clear();\n this.attributes.clear();\n this.attributePaths.length = 0;\n this.events.clear();\n this.eventPaths.length = 0;\n this.commands.clear();\n this.commandPaths.length = 0;\n }\n\n public close() {\n for (const endpoint of this.endpoints.values()) {\n endpoint.close();\n }\n }\n\n public initializeFromEndpoint(endpoint: EndpointInterface) {\n this.clear();\n\n this.verifyAndInitializeStructureElementsFromEndpoint(endpoint); // Initialize Data from Root Endpoint\n this.initializeStructureFromEndpoints(endpoint); // Initialize Data from Child Endpoints\n\n this.change.emit();\n }\n\n private initializeStructureFromEndpoints(endpoint: EndpointInterface) {\n const endpoints = endpoint.getChildEndpoints();\n for (let endpointIndex = 0; endpointIndex < endpoints.length; endpointIndex++) {\n this.verifyAndInitializeStructureElementsFromEndpoint(endpoints[endpointIndex]);\n this.initializeStructureFromEndpoints(endpoints[endpointIndex]);\n }\n }\n\n private verifyAndInitializeStructureElementsFromEndpoint(endpoint: EndpointInterface) {\n if (endpoint.number === undefined) {\n throw new InternalError(`Endpoint ID is undefined. It needs to be initialized first!`);\n }\n\n endpoint.verifyRequiredClusters();\n\n for (const cluster of endpoint.getAllClusterServers()) {\n const {\n id: clusterId,\n attributes: clusterAttributes,\n _events: clusterEvents,\n _commands: clusterCommands,\n } = asClusterServerInternal(cluster);\n\n // Add attributes\n for (const name in clusterAttributes) {\n const attribute = clusterAttributes[name];\n const path = { endpointId: endpoint.number, clusterId, attributeId: attribute.id };\n this.attributes.set(attributePathToId(path), attribute);\n this.attributePaths.push(path);\n }\n\n // Add events\n for (const name in clusterEvents) {\n const event = clusterEvents[name];\n const path = { endpointId: endpoint.number, clusterId, eventId: event.id };\n this.events.set(eventPathToId(path), event);\n this.eventPaths.push(path);\n }\n\n // Add commands\n for (const name in clusterCommands) {\n const command = clusterCommands[name];\n const path = { endpointId: endpoint.number, clusterId, commandId: command.invokeId };\n this.commands.set(commandPathToId(path), command);\n this.commandPaths.push(path);\n }\n }\n\n if (this.endpoints.has(endpoint.number))\n throw new ImplementationError(`Endpoint ID ${endpoint.number} exists twice`);\n\n this.endpoints.set(endpoint.number, endpoint);\n }\n\n toHex(value: number | bigint | undefined) {\n return value === undefined ? \"*\" : `0x${value.toString(16)}`;\n }\n\n resolveGenericElementName(\n nodeId: NodeId | undefined,\n endpointId: EndpointNumber | undefined,\n clusterId: ClusterId | undefined,\n elementId: number | undefined,\n elementMap: Map<string, any>,\n ) {\n const nodeIdPrefix = nodeId === undefined ? \"\" : `${this.toHex(nodeId)}/`;\n if (endpointId === undefined) {\n return `${nodeIdPrefix}*/${this.toHex(clusterId)}/${this.toHex(elementId)}`;\n }\n const endpoint = this.endpoints.get(endpointId);\n if (endpoint === undefined) {\n return `${nodeIdPrefix}unknown(${this.toHex(endpointId)})/${this.toHex(clusterId)}/${this.toHex(\n elementId,\n )}`;\n }\n const endpointName = `${endpoint.name}(${this.toHex(endpointId)})`;\n\n if (clusterId === undefined) {\n return `${nodeIdPrefix}${endpointName}/*/${this.toHex(elementId)}`;\n }\n const cluster = endpoint.getClusterServerById(clusterId);\n if (cluster === undefined) {\n return `${nodeIdPrefix}${endpointName}/unknown(${this.toHex(clusterId)})/${this.toHex(elementId)}`;\n }\n const clusterName = `${cluster.name}(${this.toHex(clusterId)})`;\n\n if (elementId === undefined) {\n return `${nodeIdPrefix}${endpointName}/${clusterName}/*`;\n }\n const element = elementMap.get(genericElementPathToId(endpointId, clusterId, elementId));\n const elementName = `${element?.name ?? \"unknown\"}(${this.toHex(elementId)})`;\n return `${nodeIdPrefix}${endpointName}/${clusterName}/${elementName}`;\n }\n\n resolveAttributeName({ nodeId, endpointId, clusterId, attributeId }: TypeFromSchema<typeof TlvAttributePath>) {\n return this.resolveGenericElementName(nodeId, endpointId, clusterId, attributeId, this.attributes);\n }\n\n resolveEventName({ nodeId, endpointId, clusterId, eventId, isUrgent }: TypeFromSchema<typeof TlvEventPath>) {\n return `${isUrgent ? \"!\" : \"\"}${this.resolveGenericElementName(\n nodeId,\n endpointId,\n clusterId,\n eventId,\n this.events,\n )}`;\n }\n\n resolveCommandName({ endpointId, clusterId, commandId }: TypeFromSchema<typeof TlvCommandPath>) {\n return this.resolveGenericElementName(undefined, endpointId, clusterId, commandId, this.commands);\n }\n\n getEndpoint(endpointId: EndpointNumber): EndpointInterface | undefined {\n return this.endpoints.get(endpointId);\n }\n\n hasEndpoint(endpointId: EndpointNumber): boolean {\n return this.endpoints.has(endpointId);\n }\n\n getClusterServer(endpointId: EndpointNumber, clusterId: ClusterId): ClusterServerObj<any, any> | undefined {\n return this.endpoints.get(endpointId)?.getClusterServerById(clusterId);\n }\n\n hasClusterServer(endpointId: EndpointNumber, clusterId: ClusterId): boolean {\n return !!this.getClusterServer(endpointId, clusterId);\n }\n\n getAttribute(\n endpointId: EndpointNumber,\n clusterId: ClusterId,\n attributeId: AttributeId,\n ): AnyAttributeServer<any> | undefined {\n return this.attributes.get(attributePathToId({ endpointId, clusterId, attributeId }));\n }\n\n hasAttribute(endpointId: EndpointNumber, clusterId: ClusterId, attributeId: AttributeId): boolean {\n return !!this.getAttribute(endpointId, clusterId, attributeId);\n }\n\n validateConcreteAttributePath(endpointId: EndpointNumber, clusterId: ClusterId, attributeId: AttributeId) {\n // TODO: Also hande the InvalidAction cases depending on the action for the check\n if (!this.hasEndpoint(endpointId)) {\n throw new StatusResponseError(`Endpoint ${endpointId} does not exist.`, StatusCode.UnsupportedEndpoint);\n }\n if (!this.hasClusterServer(endpointId, clusterId)) {\n throw new StatusResponseError(`Cluster ${clusterId} does not exist.`, StatusCode.UnsupportedCluster);\n }\n if (this.hasAttribute(endpointId, clusterId, attributeId)) return true;\n throw new StatusResponseError(`Attribute ${attributeId} does not exist`, StatusCode.UnsupportedAttribute);\n }\n\n getEvent(endpointId: EndpointNumber, clusterId: ClusterId, eventId: EventId): EventServer<any, any> | undefined {\n return this.events.get(eventPathToId({ endpointId, clusterId, eventId }));\n }\n\n hasEvent(endpointId: EndpointNumber, clusterId: ClusterId, eventId: EventId): boolean {\n return !!this.getEvent(endpointId, clusterId, eventId);\n }\n\n validateConcreteEventPath(endpointId: EndpointNumber, clusterId: ClusterId, eventId: EventId) {\n // TODO: Also hande the InvalidAction cases depending on the action for the check\n if (!this.hasEndpoint(endpointId)) {\n throw new StatusResponseError(`Endpoint ${endpointId} does not exist.`, StatusCode.UnsupportedEndpoint);\n }\n if (!this.hasClusterServer(endpointId, clusterId)) {\n throw new StatusResponseError(`Cluster ${clusterId} does not exist.`, StatusCode.UnsupportedCluster);\n }\n if (this.hasEvent(endpointId, clusterId, eventId)) return true;\n throw new StatusResponseError(`Event ${eventId} does not exist`, StatusCode.UnsupportedEvent);\n }\n\n getCommand(\n endpointId: EndpointNumber,\n clusterId: ClusterId,\n commandId: CommandId,\n ): CommandServer<any, any> | undefined {\n return this.commands.get(commandPathToId({ endpointId, clusterId, commandId }));\n }\n\n hasCommand(endpointId: EndpointNumber, clusterId: ClusterId, commandId: CommandId): boolean {\n return !!this.getCommand(endpointId, clusterId, commandId);\n }\n\n validateConcreteCommandPath(endpointId: EndpointNumber, clusterId: ClusterId, commandId: CommandId) {\n if (!this.hasEndpoint(endpointId)) {\n throw new StatusResponseError(`Endpoint ${endpointId} does not exist.`, StatusCode.UnsupportedEndpoint);\n }\n if (!this.hasClusterServer(endpointId, clusterId)) {\n throw new StatusResponseError(`Cluster ${clusterId} does not exist.`, StatusCode.UnsupportedCluster);\n }\n if (this.hasCommand(endpointId, clusterId, commandId)) return true;\n throw new StatusResponseError(`Command ${commandId} does not exist`, StatusCode.UnsupportedCommand);\n }\n\n getAttributes(filters: TypeFromSchema<typeof TlvAttributePath>[], onlyWritable = false): AttributeWithPath[] {\n const result = new Array<AttributeWithPath>();\n\n filters.forEach(({ endpointId, clusterId, attributeId }) => {\n this.validateAnyPathDataTypes({ endpointId, clusterId, attributeId });\n if (endpointId !== undefined && clusterId !== undefined && attributeId !== undefined) {\n const path = { endpointId, clusterId, attributeId };\n const attribute = this.attributes.get(attributePathToId(path));\n if (attribute === undefined) return;\n if (onlyWritable && !attribute.isWritable) return;\n result.push({ path, attribute });\n } else {\n this.attributePaths\n .filter(\n path =>\n (endpointId === undefined || endpointId === path.endpointId) &&\n (clusterId === undefined || clusterId === path.clusterId) &&\n (attributeId === undefined || attributeId === path.attributeId),\n )\n .forEach(path => {\n const attribute = this.attributes.get(attributePathToId(path));\n if (attribute === undefined) return;\n if (onlyWritable && !attribute.isWritable) return;\n result.push({ path, attribute });\n });\n }\n });\n\n return result;\n }\n\n getEvents(filters: TypeFromSchema<typeof TlvEventPath>[]): EventWithPath[] {\n const result = new Array<EventWithPath>();\n\n filters.forEach(({ endpointId, clusterId, eventId, isUrgent }) => {\n this.validateAnyPathDataTypes({ endpointId, clusterId, eventId });\n if (endpointId !== undefined && clusterId !== undefined && eventId !== undefined) {\n const path = { endpointId, clusterId, eventId, isUrgent };\n const event = this.events.get(eventPathToId(path));\n if (event === undefined) return;\n result.push({ path, event });\n } else {\n this.eventPaths\n .filter(\n path =>\n (endpointId === undefined || endpointId === path.endpointId) &&\n (clusterId === undefined || clusterId === path.clusterId) &&\n (eventId === undefined || eventId === path.eventId),\n )\n .forEach(({ endpointId, clusterId, eventId }) => {\n const path = { endpointId, clusterId, eventId, isUrgent };\n const event = this.events.get(eventPathToId(path));\n if (event === undefined) return;\n result.push({ path, event });\n });\n }\n });\n\n return result;\n }\n\n getCommands(filters: TypeFromSchema<typeof TlvCommandPath>[]): CommandWithPath[] {\n const result = new Array<CommandWithPath>();\n\n filters.forEach(({ endpointId, clusterId, commandId }) => {\n this.validateAnyPathDataTypes({ endpointId, clusterId, commandId });\n if (endpointId !== undefined && clusterId !== undefined && commandId !== undefined) {\n const path = { endpointId, clusterId, commandId };\n const command = this.commands.get(commandPathToId(path));\n if (command === undefined) return;\n result.push({ path, command });\n } else {\n this.commandPaths\n .filter(\n path =>\n (endpointId === undefined || endpointId === path.endpointId) &&\n (clusterId === undefined || clusterId === path.clusterId) &&\n (commandId === undefined || commandId === path.commandId),\n )\n .forEach(path => {\n const command = this.commands.get(commandPathToId(path));\n if (command === undefined) return;\n result.push({ path, command });\n });\n }\n });\n\n return result;\n }\n\n // ValidationError will return ConstraintError ... we need to see if this is correct always\n validateAnyPathDataTypes(data: {\n endpointId?: EndpointNumber;\n clusterId?: ClusterId;\n attributeId?: AttributeId;\n eventId?: EventId;\n commandId?: CommandId;\n }) {\n const { endpointId, clusterId, attributeId, eventId, commandId } = data;\n\n if (endpointId !== undefined) {\n EndpointNumber(endpointId);\n }\n if (clusterId !== undefined) {\n ClusterId(clusterId);\n }\n if (attributeId !== undefined) {\n AttributeId(attributeId);\n }\n if (eventId !== undefined) {\n EventId(eventId);\n }\n if (commandId !== undefined) {\n CommandId(commandId);\n }\n }\n}\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAOA,gCAA0D;AAG1D,yBAAmD;AACnD,yBAA4B;AAC5B,uBAA0B;AAC1B,uBAA0B;AAC1B,4BAA+B;AAC/B,qBAAwB;AAIxB,wBAA2B;AAE3B,+BAWO;AACP,wBAAgD;AAjChD;AAAA;AAAA;AAAA;AAAA;AAmCO,MAAM,6BAA6B;AAAA,EAAnC;AACH,qBAAY,oBAAI,IAAuC;AACvD,sBAAa,oBAAI,IAAqC;AACtD,0BAAiB,IAAI,MAAqB;AAC1C,kBAAS,oBAAI,
|
|
4
|
+
"sourcesContent": ["/**\n * @license\n * Copyright 2022-2024 Matter.js Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { AnyAttributeServer } from \"../../cluster/server/AttributeServer.js\";\nimport { ClusterServerObj, asClusterServerInternal } from \"../../cluster/server/ClusterServerTypes.js\";\nimport { CommandServer } from \"../../cluster/server/CommandServer.js\";\nimport { AnyEventServer } from \"../../cluster/server/EventServer.js\";\nimport { ImplementationError, InternalError } from \"../../common/MatterError.js\";\nimport { AttributeId } from \"../../datatype/AttributeId.js\";\nimport { ClusterId } from \"../../datatype/ClusterId.js\";\nimport { CommandId } from \"../../datatype/CommandId.js\";\nimport { EndpointNumber } from \"../../datatype/EndpointNumber.js\";\nimport { EventId } from \"../../datatype/EventId.js\";\nimport { NodeId } from \"../../datatype/NodeId.js\";\nimport { EndpointInterface } from \"../../endpoint/EndpointInterface.js\";\nimport { TypeFromSchema } from \"../../tlv/TlvSchema.js\";\nimport { Observable } from \"../../util/Observable.js\";\nimport { TlvAttributePath, TlvCommandPath, TlvEventPath } from \"./InteractionProtocol.js\";\nimport {\n AttributePath,\n AttributeWithPath,\n CommandPath,\n CommandWithPath,\n EventPath,\n EventWithPath,\n attributePathToId,\n commandPathToId,\n eventPathToId,\n genericElementPathToId,\n} from \"./InteractionServer.js\";\nimport { StatusCode, StatusResponseError } from \"./StatusCode.js\";\n\nexport class InteractionEndpointStructure {\n endpoints = new Map<EndpointNumber, EndpointInterface>();\n attributes = new Map<string, AnyAttributeServer<any>>();\n attributePaths = new Array<AttributePath>();\n events = new Map<string, AnyEventServer<any, any>>();\n eventPaths = new Array<EventPath>();\n commands = new Map<string, CommandServer<any, any>>();\n commandPaths = new Array<CommandPath>();\n change = new Observable(); // TODO adjust to AsyncObservable when we remove legacy API\n\n public clear() {\n this.endpoints.clear();\n this.attributes.clear();\n this.attributePaths.length = 0;\n this.events.clear();\n this.eventPaths.length = 0;\n this.commands.clear();\n this.commandPaths.length = 0;\n }\n\n public close() {\n for (const endpoint of this.endpoints.values()) {\n endpoint.close();\n }\n }\n\n public initializeFromEndpoint(endpoint: EndpointInterface) {\n this.clear();\n\n this.verifyAndInitializeStructureElementsFromEndpoint(endpoint); // Initialize Data from Root Endpoint\n this.initializeStructureFromEndpoints(endpoint); // Initialize Data from Child Endpoints\n\n this.change.emit();\n }\n\n private initializeStructureFromEndpoints(endpoint: EndpointInterface) {\n const endpoints = endpoint.getChildEndpoints();\n for (let endpointIndex = 0; endpointIndex < endpoints.length; endpointIndex++) {\n this.verifyAndInitializeStructureElementsFromEndpoint(endpoints[endpointIndex]);\n this.initializeStructureFromEndpoints(endpoints[endpointIndex]);\n }\n }\n\n private verifyAndInitializeStructureElementsFromEndpoint(endpoint: EndpointInterface) {\n if (endpoint.number === undefined) {\n throw new InternalError(`Endpoint ID is undefined. It needs to be initialized first!`);\n }\n\n endpoint.verifyRequiredClusters();\n\n for (const cluster of endpoint.getAllClusterServers()) {\n const {\n id: clusterId,\n attributes: clusterAttributes,\n _events: clusterEvents,\n _commands: clusterCommands,\n } = asClusterServerInternal(cluster);\n\n // Add attributes\n for (const name in clusterAttributes) {\n const attribute = clusterAttributes[name];\n const path = { endpointId: endpoint.number, clusterId, attributeId: attribute.id };\n this.attributes.set(attributePathToId(path), attribute);\n this.attributePaths.push(path);\n }\n\n // Add events\n for (const name in clusterEvents) {\n const event = clusterEvents[name];\n const path = { endpointId: endpoint.number, clusterId, eventId: event.id };\n this.events.set(eventPathToId(path), event);\n this.eventPaths.push(path);\n }\n\n // Add commands\n for (const name in clusterCommands) {\n const command = clusterCommands[name];\n const path = { endpointId: endpoint.number, clusterId, commandId: command.invokeId };\n this.commands.set(commandPathToId(path), command);\n this.commandPaths.push(path);\n }\n }\n\n if (this.endpoints.has(endpoint.number))\n throw new ImplementationError(`Endpoint ID ${endpoint.number} exists twice`);\n\n this.endpoints.set(endpoint.number, endpoint);\n }\n\n toHex(value: number | bigint | undefined) {\n return value === undefined ? \"*\" : `0x${value.toString(16)}`;\n }\n\n resolveGenericElementName(\n nodeId: NodeId | undefined,\n endpointId: EndpointNumber | undefined,\n clusterId: ClusterId | undefined,\n elementId: number | undefined,\n elementMap: Map<string, any>,\n ) {\n const nodeIdPrefix = nodeId === undefined ? \"\" : `${this.toHex(nodeId)}/`;\n if (endpointId === undefined) {\n return `${nodeIdPrefix}*/${this.toHex(clusterId)}/${this.toHex(elementId)}`;\n }\n const endpoint = this.endpoints.get(endpointId);\n if (endpoint === undefined) {\n return `${nodeIdPrefix}unknown(${this.toHex(endpointId)})/${this.toHex(clusterId)}/${this.toHex(\n elementId,\n )}`;\n }\n const endpointName = `${endpoint.name}(${this.toHex(endpointId)})`;\n\n if (clusterId === undefined) {\n return `${nodeIdPrefix}${endpointName}/*/${this.toHex(elementId)}`;\n }\n const cluster = endpoint.getClusterServerById(clusterId);\n if (cluster === undefined) {\n return `${nodeIdPrefix}${endpointName}/unknown(${this.toHex(clusterId)})/${this.toHex(elementId)}`;\n }\n const clusterName = `${cluster.name}(${this.toHex(clusterId)})`;\n\n if (elementId === undefined) {\n return `${nodeIdPrefix}${endpointName}/${clusterName}/*`;\n }\n const element = elementMap.get(genericElementPathToId(endpointId, clusterId, elementId));\n const elementName = `${element?.name ?? \"unknown\"}(${this.toHex(elementId)})`;\n return `${nodeIdPrefix}${endpointName}/${clusterName}/${elementName}`;\n }\n\n resolveAttributeName({ nodeId, endpointId, clusterId, attributeId }: TypeFromSchema<typeof TlvAttributePath>) {\n return this.resolveGenericElementName(nodeId, endpointId, clusterId, attributeId, this.attributes);\n }\n\n resolveEventName({ nodeId, endpointId, clusterId, eventId, isUrgent }: TypeFromSchema<typeof TlvEventPath>) {\n return `${isUrgent ? \"!\" : \"\"}${this.resolveGenericElementName(\n nodeId,\n endpointId,\n clusterId,\n eventId,\n this.events,\n )}`;\n }\n\n resolveCommandName({ endpointId, clusterId, commandId }: TypeFromSchema<typeof TlvCommandPath>) {\n return this.resolveGenericElementName(undefined, endpointId, clusterId, commandId, this.commands);\n }\n\n getEndpoint(endpointId: EndpointNumber): EndpointInterface | undefined {\n return this.endpoints.get(endpointId);\n }\n\n hasEndpoint(endpointId: EndpointNumber): boolean {\n return this.endpoints.has(endpointId);\n }\n\n getClusterServer(endpointId: EndpointNumber, clusterId: ClusterId): ClusterServerObj<any, any> | undefined {\n return this.endpoints.get(endpointId)?.getClusterServerById(clusterId);\n }\n\n hasClusterServer(endpointId: EndpointNumber, clusterId: ClusterId): boolean {\n return !!this.getClusterServer(endpointId, clusterId);\n }\n\n getAttribute(\n endpointId: EndpointNumber,\n clusterId: ClusterId,\n attributeId: AttributeId,\n ): AnyAttributeServer<any> | undefined {\n return this.attributes.get(attributePathToId({ endpointId, clusterId, attributeId }));\n }\n\n hasAttribute(endpointId: EndpointNumber, clusterId: ClusterId, attributeId: AttributeId): boolean {\n return !!this.getAttribute(endpointId, clusterId, attributeId);\n }\n\n validateConcreteAttributePath(endpointId: EndpointNumber, clusterId: ClusterId, attributeId: AttributeId) {\n // TODO: Also hande the InvalidAction cases depending on the action for the check\n if (!this.hasEndpoint(endpointId)) {\n throw new StatusResponseError(`Endpoint ${endpointId} does not exist.`, StatusCode.UnsupportedEndpoint);\n }\n if (!this.hasClusterServer(endpointId, clusterId)) {\n throw new StatusResponseError(`Cluster ${clusterId} does not exist.`, StatusCode.UnsupportedCluster);\n }\n if (this.hasAttribute(endpointId, clusterId, attributeId)) return true;\n throw new StatusResponseError(`Attribute ${attributeId} does not exist`, StatusCode.UnsupportedAttribute);\n }\n\n getEvent(endpointId: EndpointNumber, clusterId: ClusterId, eventId: EventId): AnyEventServer<any, any> | undefined {\n return this.events.get(eventPathToId({ endpointId, clusterId, eventId }));\n }\n\n hasEvent(endpointId: EndpointNumber, clusterId: ClusterId, eventId: EventId): boolean {\n return !!this.getEvent(endpointId, clusterId, eventId);\n }\n\n validateConcreteEventPath(endpointId: EndpointNumber, clusterId: ClusterId, eventId: EventId) {\n // TODO: Also hande the InvalidAction cases depending on the action for the check\n if (!this.hasEndpoint(endpointId)) {\n throw new StatusResponseError(`Endpoint ${endpointId} does not exist.`, StatusCode.UnsupportedEndpoint);\n }\n if (!this.hasClusterServer(endpointId, clusterId)) {\n throw new StatusResponseError(`Cluster ${clusterId} does not exist.`, StatusCode.UnsupportedCluster);\n }\n if (this.hasEvent(endpointId, clusterId, eventId)) return true;\n throw new StatusResponseError(`Event ${eventId} does not exist`, StatusCode.UnsupportedEvent);\n }\n\n getCommand(\n endpointId: EndpointNumber,\n clusterId: ClusterId,\n commandId: CommandId,\n ): CommandServer<any, any> | undefined {\n return this.commands.get(commandPathToId({ endpointId, clusterId, commandId }));\n }\n\n hasCommand(endpointId: EndpointNumber, clusterId: ClusterId, commandId: CommandId): boolean {\n return !!this.getCommand(endpointId, clusterId, commandId);\n }\n\n validateConcreteCommandPath(endpointId: EndpointNumber, clusterId: ClusterId, commandId: CommandId) {\n if (!this.hasEndpoint(endpointId)) {\n throw new StatusResponseError(`Endpoint ${endpointId} does not exist.`, StatusCode.UnsupportedEndpoint);\n }\n if (!this.hasClusterServer(endpointId, clusterId)) {\n throw new StatusResponseError(`Cluster ${clusterId} does not exist.`, StatusCode.UnsupportedCluster);\n }\n if (this.hasCommand(endpointId, clusterId, commandId)) return true;\n throw new StatusResponseError(`Command ${commandId} does not exist`, StatusCode.UnsupportedCommand);\n }\n\n getAttributes(filters: TypeFromSchema<typeof TlvAttributePath>[], onlyWritable = false): AttributeWithPath[] {\n const result = new Array<AttributeWithPath>();\n\n filters.forEach(({ endpointId, clusterId, attributeId }) => {\n this.validateAnyPathDataTypes({ endpointId, clusterId, attributeId });\n if (endpointId !== undefined && clusterId !== undefined && attributeId !== undefined) {\n const path = { endpointId, clusterId, attributeId };\n const attribute = this.attributes.get(attributePathToId(path));\n if (attribute === undefined) return;\n if (onlyWritable && !attribute.isWritable) return;\n result.push({ path, attribute });\n } else {\n this.attributePaths\n .filter(\n path =>\n (endpointId === undefined || endpointId === path.endpointId) &&\n (clusterId === undefined || clusterId === path.clusterId) &&\n (attributeId === undefined || attributeId === path.attributeId),\n )\n .forEach(path => {\n const attribute = this.attributes.get(attributePathToId(path));\n if (attribute === undefined) return;\n if (onlyWritable && !attribute.isWritable) return;\n result.push({ path, attribute });\n });\n }\n });\n\n return result;\n }\n\n getEvents(filters: TypeFromSchema<typeof TlvEventPath>[]): EventWithPath[] {\n const result = new Array<EventWithPath>();\n\n filters.forEach(({ endpointId, clusterId, eventId, isUrgent }) => {\n this.validateAnyPathDataTypes({ endpointId, clusterId, eventId });\n if (endpointId !== undefined && clusterId !== undefined && eventId !== undefined) {\n const path = { endpointId, clusterId, eventId, isUrgent };\n const event = this.events.get(eventPathToId(path));\n if (event === undefined) return;\n result.push({ path, event });\n } else {\n this.eventPaths\n .filter(\n path =>\n (endpointId === undefined || endpointId === path.endpointId) &&\n (clusterId === undefined || clusterId === path.clusterId) &&\n (eventId === undefined || eventId === path.eventId),\n )\n .forEach(({ endpointId, clusterId, eventId }) => {\n const path = { endpointId, clusterId, eventId, isUrgent };\n const event = this.events.get(eventPathToId(path));\n if (event === undefined) return;\n result.push({ path, event });\n });\n }\n });\n\n return result;\n }\n\n getCommands(filters: TypeFromSchema<typeof TlvCommandPath>[]): CommandWithPath[] {\n const result = new Array<CommandWithPath>();\n\n filters.forEach(({ endpointId, clusterId, commandId }) => {\n this.validateAnyPathDataTypes({ endpointId, clusterId, commandId });\n if (endpointId !== undefined && clusterId !== undefined && commandId !== undefined) {\n const path = { endpointId, clusterId, commandId };\n const command = this.commands.get(commandPathToId(path));\n if (command === undefined) return;\n result.push({ path, command });\n } else {\n this.commandPaths\n .filter(\n path =>\n (endpointId === undefined || endpointId === path.endpointId) &&\n (clusterId === undefined || clusterId === path.clusterId) &&\n (commandId === undefined || commandId === path.commandId),\n )\n .forEach(path => {\n const command = this.commands.get(commandPathToId(path));\n if (command === undefined) return;\n result.push({ path, command });\n });\n }\n });\n\n return result;\n }\n\n // ValidationError will return ConstraintError ... we need to see if this is correct always\n validateAnyPathDataTypes(data: {\n endpointId?: EndpointNumber;\n clusterId?: ClusterId;\n attributeId?: AttributeId;\n eventId?: EventId;\n commandId?: CommandId;\n }) {\n const { endpointId, clusterId, attributeId, eventId, commandId } = data;\n\n if (endpointId !== undefined) {\n EndpointNumber(endpointId);\n }\n if (clusterId !== undefined) {\n ClusterId(clusterId);\n }\n if (attributeId !== undefined) {\n AttributeId(attributeId);\n }\n if (eventId !== undefined) {\n EventId(eventId);\n }\n if (commandId !== undefined) {\n CommandId(commandId);\n }\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["endpointId", "clusterId", "eventId"]
|
|
7
7
|
}
|
|
@@ -58,7 +58,7 @@ export declare class InteractionServerMessenger extends InteractionMessenger<Mat
|
|
|
58
58
|
* Handle DataReportPayload with the content of a DataReport to send, split them into multiple DataReport
|
|
59
59
|
* messages and send them out based on the size.
|
|
60
60
|
*/
|
|
61
|
-
sendDataReport(dataReportPayload: DataReportPayload): Promise<void>;
|
|
61
|
+
sendDataReport(dataReportPayload: DataReportPayload, forFabricFilteredRead: boolean): Promise<void>;
|
|
62
62
|
sendDataReportMessage(dataReport: TypeFromSchema<typeof TlvDataReportForSend>): Promise<void>;
|
|
63
63
|
}
|
|
64
64
|
export declare class IncomingInteractionClientMessenger extends InteractionMessenger<MatterController> {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"InteractionMessenger.d.ts","sourceRoot":"","sources":["../../../../src/protocol/interaction/InteractionMessenger.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"InteractionMessenger.d.ts","sourceRoot":"","sources":["../../../../src/protocol/interaction/InteractionMessenger.ts"],"names":[],"mappings":"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"}
|
|
@@ -109,7 +109,8 @@ class InteractionServerMessenger extends InteractionMessenger {
|
|
|
109
109
|
case 2 /* ReadRequest */: {
|
|
110
110
|
const readRequest = import_InteractionProtocol.TlvReadRequest.decode(message.payload);
|
|
111
111
|
await this.sendDataReport(
|
|
112
|
-
await recipient.handleReadRequest(this.exchange, readRequest, message)
|
|
112
|
+
await recipient.handleReadRequest(this.exchange, readRequest, message),
|
|
113
|
+
readRequest.isFabricFiltered
|
|
113
114
|
);
|
|
114
115
|
break;
|
|
115
116
|
}
|
|
@@ -170,7 +171,7 @@ class InteractionServerMessenger extends InteractionMessenger {
|
|
|
170
171
|
* Handle DataReportPayload with the content of a DataReport to send, split them into multiple DataReport
|
|
171
172
|
* messages and send them out based on the size.
|
|
172
173
|
*/
|
|
173
|
-
async sendDataReport(dataReportPayload) {
|
|
174
|
+
async sendDataReport(dataReportPayload, forFabricFilteredRead) {
|
|
174
175
|
const {
|
|
175
176
|
subscriptionId,
|
|
176
177
|
attributeReportsPayload,
|
|
@@ -209,7 +210,10 @@ class InteractionServerMessenger extends InteractionMessenger {
|
|
|
209
210
|
firstAttributeAddedToReportMessage = true;
|
|
210
211
|
messageSize += 3;
|
|
211
212
|
}
|
|
212
|
-
const
|
|
213
|
+
const allowMissingFieldsForNonFabricFilteredRead = !forFabricFilteredRead && attributeReport.hasFabricSensitiveData;
|
|
214
|
+
const encodedAttribute = (0, import_AttributeDataEncoder.encodeAttributePayload)(attributeReport, {
|
|
215
|
+
allowMissingFieldsForNonFabricFilteredRead
|
|
216
|
+
});
|
|
213
217
|
const attributeReportBytes = import_TlvAny.TlvAny.getEncodedByteLength(encodedAttribute);
|
|
214
218
|
if (messageSize + attributeReportBytes > MAX_SPDU_LENGTH) {
|
|
215
219
|
if ((0, import_AttributeDataEncoder.canAttributePayloadBeChunked)(attributeReport)) {
|
|
@@ -232,7 +236,10 @@ class InteractionServerMessenger extends InteractionMessenger {
|
|
|
232
236
|
firstEventAddedToReportMessage = true;
|
|
233
237
|
messageSize += 3;
|
|
234
238
|
}
|
|
235
|
-
const
|
|
239
|
+
const allowMissingFieldsForNonFabricFilteredRead = !forFabricFilteredRead && eventReport.hasFabricSensitiveData;
|
|
240
|
+
const encodedEvent = (0, import_AttributeDataEncoder.encodeEventPayload)(eventReport, {
|
|
241
|
+
allowMissingFieldsForNonFabricFilteredRead
|
|
242
|
+
});
|
|
236
243
|
const eventReportBytes = import_TlvAny.TlvAny.getEncodedByteLength(encodedEvent);
|
|
237
244
|
if (messageSize + eventReportBytes > MAX_SPDU_LENGTH) {
|
|
238
245
|
await sendAndResetReport();
|