@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/CommissioningServer.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * @license\n * Copyright 2022-2024 Matter.js Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { MatterDevice } from \"./MatterDevice.js\";\nimport { MatterNode } from \"./MatterNode.js\";\nimport { DeviceCertification } from \"./behavior/definitions/operational-credentials/DeviceCertification.js\";\nimport { ProductDescription } from \"./behavior/system/product-description/ProductDescription.js\";\nimport { Ble } from \"./ble/Ble.js\";\nimport { AttestationCertificateManager } from \"./certificate/AttestationCertificateManager.js\";\nimport { CertificationDeclarationManager } from \"./certificate/CertificationDeclarationManager.js\";\nimport { Attributes, Cluster, Commands, Events } from \"./cluster/Cluster.js\";\nimport { ClusterClientObj } from \"./cluster/client/ClusterClientTypes.js\";\nimport { AccessControl } from \"./cluster/definitions/AccessControlCluster.js\";\nimport {\n AdministratorCommissioning,\n AdministratorCommissioningCluster,\n} from \"./cluster/definitions/AdministratorCommissioningCluster.js\";\nimport { BasicInformationCluster } from \"./cluster/definitions/BasicInformationCluster.js\";\nimport {\n GeneralCommissioning,\n GeneralCommissioningCluster,\n} from \"./cluster/definitions/GeneralCommissioningCluster.js\";\nimport { GeneralDiagnostics, GeneralDiagnosticsCluster } from \"./cluster/definitions/GeneralDiagnosticsCluster.js\";\nimport { GroupKeyManagementCluster } from \"./cluster/definitions/GroupKeyManagementCluster.js\";\nimport { OperationalCredentialsCluster } from \"./cluster/definitions/OperationalCredentialsCluster.js\";\nimport { createDefaultAccessControlClusterServer } from \"./cluster/server/AccessControlServer.js\";\nimport { AdministratorCommissioningHandler } from \"./cluster/server/AdministratorCommissioningServer.js\";\nimport {\n genericFabricScopedAttributeGetterFromFabric,\n genericFabricScopedAttributeSetterForFabric,\n} from \"./cluster/server/AttributeServer.js\";\nimport { ClusterServer } from \"./cluster/server/ClusterServer.js\";\nimport {\n AttributeInitialValues,\n ClusterDatasource,\n ClusterServerHandlers,\n ClusterServerObj,\n} from \"./cluster/server/ClusterServerTypes.js\";\nimport { GeneralCommissioningClusterHandler } from \"./cluster/server/GeneralCommissioningServer.js\";\nimport { createDefaultGeneralDiagnosticsClusterServer } from \"./cluster/server/GeneralDiagnosticsServer.js\";\nimport { GroupKeyManagementClusterHandler } from \"./cluster/server/GroupKeyManagementServer.js\";\nimport { OperationalCredentialsClusterHandler } from \"./cluster/server/OperationalCredentialsServer.js\";\nimport { ImplementationError, InternalError, NoProviderError } from \"./common/MatterError.js\";\nimport { Crypto } from \"./crypto/Crypto.js\";\nimport { EndpointNumber } from \"./datatype/EndpointNumber.js\";\nimport { FabricIndex } from \"./datatype/FabricIndex.js\";\nimport { VendorId } from \"./datatype/VendorId.js\";\nimport { Aggregator } from \"./device/Aggregator.js\";\nimport { Device, RootEndpoint } from \"./device/Device.js\";\nimport { Endpoint } from \"./device/Endpoint.js\";\nimport { LegacyInteractionServer } from \"./device/LegacyInteractionServer.js\";\nimport { EndpointInterface } from \"./endpoint/EndpointInterface.js\";\nimport { Fabric } from \"./fabric/Fabric.js\";\nimport { Logger } from \"./log/Logger.js\";\nimport { MdnsBroadcaster } from \"./mdns/MdnsBroadcaster.js\";\nimport { MdnsInstanceBroadcaster } from \"./mdns/MdnsInstanceBroadcaster.js\";\nimport { MdnsScanner } from \"./mdns/MdnsScanner.js\";\nimport { Network } from \"./net/Network.js\";\nimport { UdpInterface } from \"./net/UdpInterface.js\";\nimport { EventHandler } from \"./protocol/interaction/EventHandler.js\";\nimport { InteractionEndpointStructure } from \"./protocol/interaction/InteractionEndpointStructure.js\";\nimport { BitSchema, TypeFromBitSchema, TypeFromPartialBitSchema } from \"./schema/BitmapSchema.js\";\nimport {\n CommissioningFlowType,\n DiscoveryCapabilitiesBitmap,\n DiscoveryCapabilitiesSchema,\n ManualPairingCodeCodec,\n QrPairingCodeCodec,\n} from \"./schema/PairingCodeSchema.js\";\nimport { PaseClient } from \"./session/pase/PaseClient.js\";\nimport { SyncStorage } from \"./storage/Storage.js\";\nimport { StorageContext } from \"./storage/StorageContext.js\";\nimport { SupportedStorageTypes } from \"./storage/StringifyTools.js\";\nimport { ByteArray } from \"./util/ByteArray.js\";\nimport { NamedHandler } from \"./util/NamedHandler.js\";\n\nconst logger = Logger.get(\"CommissioningServer\");\n\nexport const FORBIDDEN_PASSCODES = [\n 0, 11111111, 22222222, 33333333, 44444444, 55555555, 66666666, 77777777, 88888888, 99999999, 12345678, 87654321,\n];\n\n/**\n * Data model revision used by this implementation\n * Value of 16 means \"Matter 1.0/1.1\"\n *\n * @see {@link MatterSpecification.v11.Core} \u00A7 7.1.1\n */\nexport const MATTER_DATAMODEL_VERSION = 16;\n\n/**\n * Represents device pairing information.\n */\nexport interface DevicePairingInformation {\n manualPairingCode: string;\n qrPairingCode: string;\n}\n\n/**\n * Constructor options for a CommissioningServer device\n * Beside the general options it also contains the data for the BasicInformation cluster which is added automatically\n * and allows to override the certificates used for the OperationalCredentials cluster\n */\nexport interface CommissioningServerOptions {\n /** Port of the server, normally automatically managed. */\n port?: number;\n\n /** IPv4 listener address, defaults to all interfaces.*/\n listeningAddressIpv4?: string;\n\n /** IPv6 listener address, defaults to all interfaces.*/\n listeningAddressIpv6?: string;\n\n /** The device name to be used for the BasicInformation cluster. */\n deviceName: string;\n\n /** The device type to be used for the BasicInformation cluster. */\n deviceType: number;\n\n /** The next endpoint ID to be assigned to a new endpoint. */\n nextEndpointId?: number;\n\n /** The passcode/pin of the device to use for initial commissioning. */\n passcode?: number;\n\n /** The Discriminator to use for initial commissioning. */\n discriminator?: number;\n\n /** The Flow type of the Commissioning flow used in announcements. */\n flowType?: CommissioningFlowType;\n\n /** Optional Vendor specific additional BLE Advertisement data. */\n additionalBleAdvertisementData?: ByteArray;\n\n /** Should the device directly be announced automatically by the MatterServer of manually via announce(). */\n delayedAnnouncement?: boolean;\n\n /**\n * Optional maximum subscription interval to use for sending subscription reports. It will be used if not too low\n * and inside the range requested by the connected controller.\n */\n subscriptionMaxIntervalSeconds?: number;\n\n /**\n * Optional minimum subscription interval to use for sending subscription reports. It will be used when other\n * calculated values are smaller than it. Use this to make sure your device hardware can handle the load and to set\n * limits.\n */\n subscriptionMinIntervalSeconds?: number;\n\n /**\n * Optional subscription randomization window to use for sending subscription reports. This specifies a window in\n * seconds from which a random part is added to the calculated maximum interval to make sure that devices that get\n * powered on in parallel not all send at the same timepoint.\n */\n subscriptionRandomizationWindowSeconds?: number;\n\n /**\n * Device details to be used for the BasicInformation cluster. Some of the values are initialized with defaults if\n * not set here.\n */\n basicInformation:\n | {\n vendorId: number;\n vendorName: string;\n productId: number;\n productName: string;\n }\n | AttributeInitialValues<typeof BasicInformationCluster.attributes>;\n\n /**\n * Vendor specific certificates to be used for the OperationalCredentials cluster. If not set Test certificates\n * (official Chip tool test Root certificate is used) are generated automatically.\n */\n certificates?: DeviceCertification.Definition;\n\n /**\n * Optional configuration for the GeneralCommissioning cluster. If not set the default values are used.\n * Use these options to limit the allowed countries for regulatory configuration.\n */\n generalCommissioning?: Partial<AttributeInitialValues<typeof GeneralCommissioningCluster.attributes>> & {\n allowCountryCodeChange?: boolean; // Default true if not set\n countryCodeWhitelist?: string[]; // Default all countries are allowed\n };\n\n /**\n * This callback is called when the device is commissioned or decommissioned to a fabric/controller. The provided\n * fabricIndex can be used together with getCommissionedFabricInformation() to get more details about the fabric\n * (or if this fabricIndex is missing it was deleted).\n */\n commissioningChangedCallback?: (fabricIndex: FabricIndex) => void;\n\n /**\n * This callback is called when sessions to the device are established, closed or subscriptions get added or\n * removed. The provided fabricIndex can be used together with getActiveSessionInformation() to get more details\n * about the open sessions and their status.\n */\n activeSessionsChangedCallback?: (fabricIndex: FabricIndex) => void;\n}\n\n/**\n * Commands exposed by the CommissioningServer\n */\nexport type CommissioningServerCommands = {\n /** Provide a means for certification tests to trigger some test-plan-specific events. */\n testEventTrigger: ClusterServerHandlers<typeof GeneralDiagnosticsCluster>[\"testEventTrigger\"];\n};\n\n// TODO decline using set/getRootClusterClient\n// TODO Decline cluster access after announced/paired\n\n/**\n * A CommissioningServer node represent a matter node that can be paired with a controller and runs on a defined port on the\n * host\n */\nexport class CommissioningServer extends MatterNode {\n private ipv4Disabled?: boolean;\n private port?: number;\n private readonly passcode: number;\n private readonly discriminator: number;\n private readonly flowType: CommissioningFlowType;\n private readonly productDescription: ProductDescription;\n\n private storage?: StorageContext<SyncStorage>;\n private endpointStructureStorage?: StorageContext<SyncStorage>;\n private mdnsScanner?: MdnsScanner;\n private mdnsBroadcaster?: MdnsBroadcaster;\n private mdnsInstanceBroadcaster?: MdnsInstanceBroadcaster;\n\n private deviceInstance?: MatterDevice;\n private eventHandler?: EventHandler;\n private endpointStructure: InteractionEndpointStructure;\n private interactionServer?: LegacyInteractionServer;\n\n protected readonly rootEndpoint = new RootEndpoint();\n\n private nextEndpointId: EndpointNumber;\n\n readonly delayedAnnouncement?: boolean;\n\n private readonly commandHandler = new NamedHandler<CommissioningServerCommands>();\n\n /**\n * Creates a new CommissioningServer node and add all needed Root clusters\n *\n * @param options The options for the CommissioningServer node\n */\n constructor(private readonly options: CommissioningServerOptions) {\n super();\n const {\n port,\n passcode,\n discriminator,\n flowType,\n nextEndpointId,\n delayedAnnouncement,\n basicInformation: { vendorId: vendorIdNumber, productId },\n generalCommissioning,\n } = options;\n this.port = port;\n if (passcode !== undefined && FORBIDDEN_PASSCODES.includes(passcode)) {\n throw new ImplementationError(`Passcode ${passcode} is not allowed.`);\n }\n this.passcode = passcode ?? PaseClient.generateRandomPasscode();\n this.discriminator = discriminator ?? PaseClient.generateRandomDiscriminator();\n this.flowType = flowType ?? CommissioningFlowType.Standard;\n this.nextEndpointId = EndpointNumber(nextEndpointId ?? 1);\n this.delayedAnnouncement = delayedAnnouncement;\n\n const vendorId = VendorId(vendorIdNumber);\n\n // Set the required basicInformation and respect the provided values\n // TODO Get the defaults from the cluster meta details\n const basicInformationAttributes = Object.assign(\n {\n dataModelRevision: MATTER_DATAMODEL_VERSION,\n nodeLabel: \"\",\n hardwareVersion: 0,\n hardwareVersionString: \"0\",\n location: \"XX\",\n localConfigDisabled: false,\n softwareVersion: 1,\n softwareVersionString: \"v1\",\n capabilityMinima: {\n caseSessionsPerFabric: 3, // TODO get that limit from Sessionmanager or such or sync with it, add limit? Just a minima?\n subscriptionsPerFabric: 3, // TODO get that limit from Interactionserver? Respect it? It is just a minima?\n },\n serialNumber: `node-matter-${Crypto.get().getRandomData(4).toHex()}`,\n },\n options.basicInformation,\n ) as AttributeInitialValues<typeof BasicInformationCluster.attributes>;\n\n const reachabilitySupported = basicInformationAttributes.reachable !== undefined;\n // Add basic Information cluster to root directly because it is not allowed to be changed afterward\n const basicInformationCluster = ClusterServer(\n BasicInformationCluster,\n basicInformationAttributes,\n {},\n {\n startUp: true,\n shutDown: true,\n reachableChanged: reachabilitySupported,\n leave: true,\n },\n );\n this.rootEndpoint.addClusterServer(basicInformationCluster);\n\n if (reachabilitySupported) {\n basicInformationCluster.subscribeReachableAttribute(newValue =>\n basicInformationCluster.triggerReachableChangedEvent?.({ reachableNewValue: newValue }),\n );\n }\n\n // Use provided certificates for OperationalCredentialsCluster or generate own ones\n let { certificates } = options;\n if (certificates == undefined) {\n const paa = new AttestationCertificateManager(vendorId);\n const { keyPair: dacKeyPair, dac } = paa.getDACert(productId);\n const declaration = CertificationDeclarationManager.generate(vendorId, productId);\n\n certificates = {\n privateKey: dacKeyPair.privateKey,\n certificate: dac,\n intermediateCertificate: paa.getPAICert(),\n declaration,\n };\n }\n\n this.productDescription = {\n name: options.deviceName,\n deviceType: options.deviceType,\n vendorId: vendorId,\n productId: productId,\n };\n\n // Add Operational credentials cluster to root directly because it is not allowed to be changed afterward\n // TODO Get the defaults from the cluster meta details\n this.rootEndpoint.addClusterServer(\n ClusterServer(\n OperationalCredentialsCluster,\n {\n nocs: [],\n fabrics: [],\n supportedFabrics: 254, // maximum number of fabrics. Also FabricBuilder uses 254 as max!\n commissionedFabrics: 0,\n trustedRootCertificates: [],\n currentFabricIndex: FabricIndex.NO_FABRIC,\n },\n OperationalCredentialsClusterHandler(certificates, this.productDescription),\n ),\n );\n\n // TODO Get the defaults from the cluster meta details\n this.rootEndpoint.addClusterServer(\n ClusterServer(\n GeneralCommissioningCluster,\n {\n breadcrumb: generalCommissioning?.breadcrumb ?? BigInt(0),\n basicCommissioningInfo: generalCommissioning?.basicCommissioningInfo ?? {\n failSafeExpiryLengthSeconds: 60 /* 1min */,\n maxCumulativeFailsafeSeconds: 900 /* Recommended according to Specs */,\n },\n regulatoryConfig:\n generalCommissioning?.regulatoryConfig ?? GeneralCommissioning.RegulatoryLocationType.Outdoor, // Default is the most restrictive one\n locationCapability:\n generalCommissioning?.locationCapability ??\n GeneralCommissioning.RegulatoryLocationType.IndoorOutdoor,\n supportsConcurrentConnection: generalCommissioning?.supportsConcurrentConnection ?? true,\n },\n GeneralCommissioningClusterHandler({\n allowCountryCodeChange: generalCommissioning?.allowCountryCodeChange ?? true,\n countryCodeWhitelist: generalCommissioning?.countryCodeWhitelist ?? undefined,\n }),\n ),\n );\n\n // TODO Get the defaults from the cluster meta details\n this.rootEndpoint.addClusterServer(createDefaultAccessControlClusterServer());\n\n // TODO Get the defaults from the cluster meta details\n this.rootEndpoint.addClusterServer(\n ClusterServer(\n GroupKeyManagementCluster,\n {\n groupKeyMap: [],\n groupTable: [],\n maxGroupsPerFabric: 0, // TODO: Increase once we add group support, for now only IPK is supported\n maxGroupKeysPerFabric: 1,\n },\n GroupKeyManagementClusterHandler(),\n ),\n );\n\n // TODO Get the defaults from the cluster meta details\n this.rootEndpoint.addClusterServer(createDefaultGeneralDiagnosticsClusterServer(this.commandHandler));\n\n this.rootEndpoint.addClusterServer(\n ClusterServer(\n AdministratorCommissioningCluster,\n {\n windowStatus: AdministratorCommissioning.CommissioningWindowStatus.WindowNotOpen,\n adminFabricIndex: null,\n adminVendorId: null,\n },\n AdministratorCommissioningHandler(),\n ),\n );\n\n this.endpointStructure = new InteractionEndpointStructure();\n\n // We must register this event before creating an InteractionServer so\n // we initialize endpoint datasources before the InteractionServer\n // processes events\n this.endpointStructure.change.on(() => {\n if (this.storage === undefined || this.eventHandler === undefined) {\n throw new InternalError(\"Endpoint structure reports change prior to server initialization\");\n }\n\n for (const endpoint of this.endpointStructure.endpoints.values()) {\n for (const cluster of endpoint.getAllClusterServers()) {\n new CommissioningServerClusterDatasource(endpoint, cluster, this.storage, this.eventHandler);\n }\n }\n });\n }\n\n /**\n * Get a cluster server from the root endpoint. This is mainly used internally and not needed to be called by the user.\n *\n * @param cluster ClusterServer to get or undefined if not existing\n */\n getRootClusterServer<\n F extends BitSchema,\n SF extends TypeFromPartialBitSchema<F>,\n A extends Attributes,\n C extends Commands,\n E extends Events,\n >(cluster: Cluster<F, SF, A, C, E>): ClusterServerObj<A, E> | undefined {\n return this.rootEndpoint.getClusterServer(cluster);\n }\n\n /**\n * Add a cluster client to the root endpoint. This is mainly used internally and not needed to be called by the user.\n *\n * @param cluster ClusterClient object to add\n */\n addRootClusterClient<F extends BitSchema, A extends Attributes, C extends Commands, E extends Events>(\n cluster: ClusterClientObj<F, A, C, E>,\n ) {\n this.rootEndpoint.addClusterClient(cluster);\n }\n\n /**\n * Get a cluster client from the root endpoint. This is mainly used internally and not needed to be called by the user.\n *\n * @param cluster ClusterClient to get or undefined if not existing\n */\n getRootClusterClient<\n F extends BitSchema,\n SF extends TypeFromPartialBitSchema<F>,\n A extends Attributes,\n C extends Commands,\n E extends Events,\n >(cluster: Cluster<F, SF, A, C, E>): ClusterClientObj<F, A, C, E> | undefined {\n return this.rootEndpoint.getClusterClient(cluster);\n }\n\n /**\n * Get the root endpoint of the node.\n */\n getRootEndpoint() {\n return this.rootEndpoint;\n }\n\n /**\n * Add a child endpoint to the root endpoint. This is mainly used internally and not needed to be called by the user.\n *\n * @param endpoint Endpoint to add\n * @protected\n */\n protected addEndpoint(endpoint: Endpoint) {\n this.rootEndpoint.addChildEndpoint(endpoint);\n }\n\n /**\n * Get a child endpoint from the root endpoint. This is mainly used internally and not needed to be called by the user.\n *\n * @param endpointId Endpoint ID of the child endpoint to get\n * @protected\n */\n protected getChildEndpoint(endpointId: EndpointNumber): Endpoint | undefined {\n return this.rootEndpoint.getChildEndpoint(endpointId);\n }\n\n /**\n * Add a new cluster server to the root endpoint\n * BasicInformationCluster and OperationalCredentialsCluster can not be added via this method because they are\n * added in the constructor\n *\n * @param cluster\n */\n addRootClusterServer<A extends Attributes, E extends Events>(cluster: ClusterServerObj<A, E>) {\n if (cluster.id === BasicInformationCluster.id) {\n throw new ImplementationError(\n \"BasicInformationCluster can not be modified, provide all details in constructor options!\",\n );\n }\n if (cluster.id === OperationalCredentialsCluster.id) {\n throw new ImplementationError(\n \"OperationalCredentialsCluster can not be modified, provide the certificates in constructor options!\",\n );\n }\n this.rootEndpoint.addClusterServer(cluster);\n }\n\n /**\n * Advertise the node via all available interfaces (Ethernet/MDNS, BLE, ...) and start the commissioning process\n *\n * @param limitTo Limit the advertisement to the given discovery capabilities. Default is to advertise on ethernet\n * and BLE if configured\n */\n async advertise(limitTo?: TypeFromPartialBitSchema<typeof DiscoveryCapabilitiesBitmap>) {\n if (\n this.mdnsBroadcaster === undefined ||\n this.mdnsScanner === undefined ||\n this.storage === undefined ||\n this.eventHandler === undefined ||\n this.endpointStructureStorage === undefined ||\n this.port === undefined\n ) {\n throw new ImplementationError(\"Add the node to the Matter instance before!\");\n }\n\n if (this.interactionServer !== undefined && this.deviceInstance !== undefined) {\n logger.debug(\"Device already initialized, just advertise the instance again ...\");\n await this.deviceInstance.announce();\n return;\n }\n\n this.mdnsInstanceBroadcaster = this.mdnsBroadcaster.createInstanceBroadcaster(this.port);\n\n const basicInformation = this.getRootClusterServer(BasicInformationCluster);\n if (basicInformation == undefined) {\n throw new ImplementationError(\"BasicInformationCluster needs to be set!\");\n }\n\n this.interactionServer = new LegacyInteractionServer({\n endpointStructure: this.endpointStructure,\n eventHandler: this.eventHandler,\n subscriptionOptions: {\n maxIntervalSeconds: this.options.subscriptionMaxIntervalSeconds,\n minIntervalSeconds: this.options.subscriptionMinIntervalSeconds,\n randomizationWindowSeconds: this.options.subscriptionRandomizationWindowSeconds,\n },\n });\n\n this.nextEndpointId = this.endpointStructureStorage.get(\"nextEndpointId\", this.nextEndpointId);\n\n this.assignEndpointIds(); // Make sure to have unique endpoint ids\n this.rootEndpoint.updatePartsList(); // initialize parts list of all Endpoint objects with final IDs\n this.rootEndpoint.setStructureChangedCallback(() => this.updateStructure()); // Make sure we get structure changes\n\n this.endpointStructure.initializeFromEndpoint(this.rootEndpoint);\n\n // TODO adjust later and refactor MatterDevice\n const deviceInstance = await MatterDevice.create(\n this.storage.createContext(\"SessionManager\"),\n this.storage.createContext(\"FabricManager\"),\n () => ({\n productDescription: this.productDescription,\n passcode: this.passcode,\n discriminator: this.discriminator,\n flowType: this.flowType,\n additionalBleAdvertisementData: this.options.additionalBleAdvertisementData,\n\n // We don't use this\n ble: false,\n }),\n basicInformation.getCapabilityMinimaAttribute().caseSessionsPerFabric, // Internally it is \"Session and Node\", so we support even more\n (fabricIndex: FabricIndex) => {\n const fabricsCount = this.deviceInstance?.getFabrics().length ?? 0;\n if (fabricsCount === 1) {\n // When first Fabric is added (aka initial commissioning) and we did not advertised on MDNS before, add broadcaster now\n // TODO Refactor this out when we remove MatterDevice class\n if (\n this.mdnsInstanceBroadcaster !== undefined &&\n !this.deviceInstance?.hasBroadcaster(this.mdnsInstanceBroadcaster)\n ) {\n this.deviceInstance?.addBroadcaster(this.mdnsInstanceBroadcaster);\n }\n }\n if (fabricsCount === 0) {\n // When last fabric gets deleted we do a factory reset\n this.factoryReset()\n .then(() => this.options.commissioningChangedCallback?.(fabricIndex))\n .catch(error => logger.error(\"Error while doing factory reset of the device\", error));\n } else {\n this.options.commissioningChangedCallback?.(fabricIndex);\n }\n },\n (fabricIndex: FabricIndex) => this.options.activeSessionsChangedCallback?.(fabricIndex),\n );\n deviceInstance.addTransportInterface(\n await UdpInterface.create(Network.get(), \"udp6\", this.port, this.options.listeningAddressIpv6),\n );\n deviceInstance.addScanner(this.mdnsScanner);\n deviceInstance.addProtocolHandler(this.interactionServer);\n this.deviceInstance = deviceInstance;\n if (!this.ipv4Disabled) {\n deviceInstance.addTransportInterface(\n await UdpInterface.create(Network.get(), \"udp4\", this.port, this.options.listeningAddressIpv4),\n );\n }\n\n if (this.isCommissioned()) {\n // Handle Backward compatibility to Matter.js before 0.9.1 and add the missing ACL entry if no entry was set\n // so far by the controller\n const fabrics = deviceInstance.getFabrics();\n for (const fabric of fabrics) {\n if (\n genericFabricScopedAttributeGetterFromFabric<AccessControl.AccessControlEntryStruct[] | undefined>(\n fabric,\n AccessControl.Cluster,\n \"acl\",\n undefined,\n ) === undefined\n ) {\n genericFabricScopedAttributeSetterForFabric(fabric, AccessControl.Cluster, \"acl\", [\n {\n fabricIndex: fabric.fabricIndex,\n privilege: AccessControl.AccessControlEntryPrivilege.Administer,\n authMode: AccessControl.AccessControlEntryAuthMode.Case,\n subjects: [fabric.rootNodeId],\n targets: null, // entire node\n },\n ]);\n logger.warn(\n \"Added missing ACL entry for fabric\",\n fabric.fabricIndex,\n \"for Node ID\",\n fabric.rootNodeId,\n \". This should only happen once after upgrading to matter.js 0.9.1\",\n );\n }\n }\n\n limitTo = { onIpNetwork: true }; // If already commissioned the device is on network already\n } else {\n // BLE or SoftAP only relevant when not commissioned yet\n try {\n const ble = Ble.get();\n deviceInstance.addTransportInterface(ble.getBlePeripheralInterface());\n if (limitTo === undefined || limitTo.ble) {\n deviceInstance.addBroadcaster(ble.getBleBroadcaster(this.options.additionalBleAdvertisementData));\n }\n } catch (error) {\n if (error instanceof NoProviderError) {\n logger.debug(\"Ble not enabled\");\n } else {\n throw error;\n }\n }\n\n if (limitTo?.softAccessPoint) {\n logger.error(\"Advertising as SoftAP not implemented yet. Ignoring ...\");\n }\n }\n\n if (limitTo === undefined || limitTo.onIpNetwork) {\n deviceInstance.addBroadcaster(this.mdnsInstanceBroadcaster);\n }\n\n await deviceInstance.start();\n\n // Send required events\n basicInformation.triggerStartUpEvent({ softwareVersion: basicInformation.getSoftwareVersionAttribute() });\n\n const generalDiagnostics = this.getRootClusterServer(GeneralDiagnosticsCluster);\n if (generalDiagnostics !== undefined) {\n this.getRootClusterServer(GeneralDiagnosticsCluster)?.triggerBootReasonEvent({\n bootReason: generalDiagnostics.getBootReasonAttribute?.() ?? GeneralDiagnostics.BootReason.Unspecified,\n });\n }\n }\n\n updateStructure() {\n logger.debug(\"Endpoint structure got updated ...\");\n this.assignEndpointIds(); // Make sure to have unique endpoint ids\n this.rootEndpoint.updatePartsList(); // update parts list of all Endpoint objects with final IDs\n this.endpointStructure.initializeFromEndpoint(this.rootEndpoint); // Reinitialize the interaction server structure\n }\n\n getNextEndpointId(increase = true) {\n if (increase) {\n this.nextEndpointId++;\n }\n return this.nextEndpointId;\n }\n\n assignEndpointIds() {\n const rootUniqueIdPrefix = this.rootEndpoint.determineUniqueID();\n this.initializeEndpointIdsFromStorage(this.rootEndpoint, rootUniqueIdPrefix);\n this.fillAndStoreEndpointIds(this.rootEndpoint, rootUniqueIdPrefix);\n this.endpointStructureStorage?.set(\"nextEndpointId\", this.nextEndpointId);\n }\n\n private initializeEndpointIdsFromStorage(endpoint: Endpoint, parentUniquePrefix = \"\") {\n if (this.endpointStructureStorage === undefined) {\n throw new ImplementationError(\"Storage manager must be initialized to enable initialization from storage.\");\n }\n const endpoints = endpoint.getChildEndpoints();\n for (let endpointIndex = 0; endpointIndex < endpoints.length; endpointIndex++) {\n let endpointUniquePrefix = parentUniquePrefix;\n const endpoint = endpoints[endpointIndex];\n const thisUniqueId = endpoint.determineUniqueID();\n if (thisUniqueId === undefined) {\n if (endpoint.number === undefined) {\n logger.debug(\n `No unique id found for endpoint on index ${endpointIndex} / device ${endpoint.name} - using index as unique identifier!`,\n );\n }\n endpointUniquePrefix += `${endpointUniquePrefix === \"\" ? \"\" : \"-\"}index_${endpointIndex}`;\n } else {\n endpointUniquePrefix += `${endpointUniquePrefix === \"\" ? \"\" : \"-\"}${thisUniqueId}`;\n }\n\n if (endpoint.number === undefined) {\n if (this.endpointStructureStorage.has(endpointUniquePrefix)) {\n endpoint.number = this.endpointStructureStorage.get<EndpointNumber>(endpointUniquePrefix);\n logger.debug(\n `Restored endpoint id ${endpoint.number} for endpoint with ${endpointUniquePrefix} / device ${endpoint.name} from storage`,\n );\n }\n }\n if (endpoint.number !== undefined && endpoint.number > this.nextEndpointId) {\n this.nextEndpointId = EndpointNumber(endpoint.number + 1);\n }\n this.initializeEndpointIdsFromStorage(endpoint, endpointUniquePrefix);\n }\n }\n\n private fillAndStoreEndpointIds(endpoint: Endpoint, parentUniquePrefix = \"\") {\n if (this.endpointStructureStorage === undefined) {\n throw new ImplementationError(\"endpointStructureStorage not set!\");\n }\n const endpoints = endpoint.getChildEndpoints();\n for (let endpointIndex = 0; endpointIndex < endpoints.length; endpointIndex++) {\n let endpointUniquePrefix = parentUniquePrefix;\n endpoint = endpoints[endpointIndex];\n const thisUniqueId = endpoint.determineUniqueID();\n if (thisUniqueId === undefined) {\n endpointUniquePrefix += `${endpointUniquePrefix === \"\" ? \"\" : \"-\"}index_${endpointIndex}`;\n } else {\n endpointUniquePrefix += `${endpointUniquePrefix === \"\" ? \"\" : \"-\"}${thisUniqueId}`;\n }\n\n if (endpoint.number === undefined) {\n endpoint.number = EndpointNumber(this.nextEndpointId++);\n this.endpointStructureStorage.set(endpointUniquePrefix, endpoint.number);\n logger.debug(\n `Assigned endpoint id ${endpoint.number} for endpoint with ${endpointUniquePrefix} / device ${endpoint.name} and stored it`,\n );\n }\n this.fillAndStoreEndpointIds(endpoint, endpointUniquePrefix);\n }\n }\n\n /**\n * Return info if the device is paired with at least one controller\n */\n isCommissioned(): boolean {\n return this.deviceInstance?.isCommissioned() ?? false;\n }\n\n /**\n * Return the pairing information for the device\n */\n getPairingCode(\n discoveryCapabilities?: TypeFromBitSchema<typeof DiscoveryCapabilitiesBitmap>,\n ): DevicePairingInformation {\n const basicInformation = this.getRootClusterServer(BasicInformationCluster);\n if (basicInformation == undefined) {\n throw new ImplementationError(\"BasicInformationCluster needs to be set!\");\n }\n\n const vendorId = basicInformation.attributes.vendorId.getLocal();\n const productId = basicInformation.attributes.productId.getLocal();\n\n let bleEnabled = false;\n try {\n bleEnabled = !!Ble.get();\n } catch (error) {\n if (!(error instanceof NoProviderError)) {\n // only ignore NoProviderError cases\n throw error;\n }\n }\n\n const qrPairingCode = QrPairingCodeCodec.encode({\n version: 0,\n vendorId: vendorId,\n productId,\n flowType: this.flowType,\n discriminator: this.discriminator,\n passcode: this.passcode,\n discoveryCapabilities: DiscoveryCapabilitiesSchema.encode(\n discoveryCapabilities ?? {\n ble: bleEnabled,\n softAccessPoint: false,\n onIpNetwork: true,\n },\n ),\n });\n\n return {\n manualPairingCode: ManualPairingCodeCodec.encode({\n discriminator: this.discriminator,\n passcode: this.passcode,\n }),\n qrPairingCode,\n };\n }\n\n /**\n * Set the MDNS Scanner instance. Should be only used internally\n *\n * @param mdnsScanner MdnsScanner instance\n */\n setMdnsScanner(mdnsScanner: MdnsScanner) {\n this.mdnsScanner = mdnsScanner;\n }\n\n /**\n * Set the MDNS Broadcaster instance. Should be only used internally\n *\n * @param mdnsBroadcaster MdnsBroadcaster instance\n */\n setMdnsBroadcaster(mdnsBroadcaster: MdnsBroadcaster) {\n if (this.port === undefined) {\n throw new ImplementationError(\"Port must be set before setting the MDNS broadcaster!\");\n }\n this.mdnsBroadcaster = mdnsBroadcaster;\n }\n\n /**\n * Set the StorageManager instance. Should be only used internally\n * @param storage\n */\n async setStorage(storage: StorageContext<SyncStorage>) {\n this.storage = storage;\n this.endpointStructureStorage = this.storage.createContext(\"EndpointStructure\");\n this.eventHandler = await EventHandler.create(this.storage.createContext(\"EventHandler\"));\n }\n\n /**\n * Add a new device to the node\n *\n * @param device Device or Aggregator instance to add\n */\n addDevice(device: Device | Aggregator) {\n this.addEndpoint(device);\n }\n\n /**\n * Return the port the device is listening on\n */\n getPort(): number | undefined {\n return this.port;\n }\n\n /** Set the port the device is listening on. Can only be called before the device is initialized. */\n setPort(port: number) {\n if (port === this.port) return;\n if (this.deviceInstance !== undefined || this.mdnsInstanceBroadcaster !== undefined) {\n throw new ImplementationError(\"Port can not be changed after device is initialized!\");\n }\n this.port = port;\n }\n\n /**\n * Close network connections of the device and stop responding to requests\n */\n async close() {\n this.rootEndpoint.getClusterServer(BasicInformationCluster)?.triggerShutDownEvent?.();\n await this.interactionServer?.close();\n this.interactionServer = undefined;\n this.endpointStructure.close();\n await this.deviceInstance?.close();\n this.deviceInstance = undefined;\n await this.mdnsInstanceBroadcaster?.close();\n this.mdnsInstanceBroadcaster = undefined;\n }\n\n async factoryReset() {\n if (this.storage === undefined) {\n throw new ImplementationError(\n \"Storage not initialized. The instance was not added to a Matter instance yet.\",\n );\n }\n const wasStarted = this.interactionServer !== undefined || this.deviceInstance !== undefined;\n let fabrics = new Array<Fabric>();\n if (wasStarted) {\n fabrics = this.isCommissioned() ? this.deviceInstance?.getFabrics() ?? [] : [];\n await this.close();\n }\n\n this.storage.clearAll();\n\n if (wasStarted) {\n await this.advertise();\n fabrics.forEach(fabric => this.options.commissioningChangedCallback?.(fabric.fabricIndex));\n }\n logger.info(`The device was factory reset${wasStarted ? \" and restarted\" : \"\"}.`);\n }\n\n /**\n * Add a new command handler for the given command\n *\n * @param command Command to add the handler for\n * @param handler Handler function to add\n */\n addCommandHandler<K extends keyof CommissioningServerCommands>(\n command: K,\n handler: CommissioningServerCommands[K],\n ) {\n this.commandHandler.addHandler(command, handler);\n }\n\n /**\n * Remove a command handler for the given command\n *\n * @param command Command to remove the handler for\n * @param handler Handler function to remove\n */\n removeCommandHandler<K extends keyof CommissioningServerCommands>(\n command: K,\n handler: CommissioningServerCommands[K],\n ) {\n this.commandHandler.removeHandler(command, handler);\n }\n\n /**\n * Set the reachability of the commissioning server aka \"the main matter device\". This call only has effect when\n * the reachability flag was set in the BasicInformationCluster or in the BasicInformation data in the constructor!\n *\n * @param reachable true if reachable, false otherwise\n */\n setReachability(reachable: boolean) {\n const basicInformationCluster = this.getRootClusterServer(BasicInformationCluster);\n if (basicInformationCluster === undefined) {\n throw new ImplementationError(\"BasicInformationCluster needs to be set!\");\n }\n if (basicInformationCluster.attributes.reachable !== undefined) {\n basicInformationCluster.setReachableAttribute(reachable);\n }\n }\n\n /** used internally by MatterServer to initialize the state of the device. */\n initialize(ipv4Disabled: boolean) {\n if (this.ipv4Disabled !== undefined && this.ipv4Disabled !== ipv4Disabled) {\n throw new ImplementationError(\n \"Changing the IPv4 disabled flag after starting the device is not supported.\",\n );\n }\n this.ipv4Disabled = ipv4Disabled;\n }\n\n /** Starts the Matter device and advertises it. */\n async start() {\n if (this.ipv4Disabled === undefined) {\n throw new ImplementationError(\"Add the device to the MatterServer first.\");\n }\n if (this.delayedAnnouncement !== true) {\n return this.advertise();\n }\n }\n\n /**\n * Get some basic details of all Fabrics the server is commissioned to.\n *\n * @param fabricIndex Optional fabric index to filter for. If not set all fabrics are returned.\n */\n getCommissionedFabricInformation(fabricIndex?: FabricIndex) {\n if (!this.isCommissioned()) return [];\n const allFabrics = this.deviceInstance?.getFabrics() ?? [];\n const fabrics = fabricIndex === undefined ? allFabrics : allFabrics.filter(f => f.fabricIndex === fabricIndex);\n return fabrics.map(fabric => fabric.externalInformation) ?? [];\n }\n\n /**\n * Get some basic details of all currently active sessions.\n *\n * @param fabricIndex Optional fabric index to filter for. If not set all sessions are returned.\n */\n getActiveSessionInformation(fabricIndex?: FabricIndex) {\n if (!this.isCommissioned()) return [];\n const allSessions = this.deviceInstance?.getActiveSessionInformation() ?? [];\n return allSessions.filter(({ fabric }) => fabricIndex === undefined || fabric?.fabricIndex === fabricIndex);\n }\n}\n\nclass CommissioningServerClusterDatasource implements ClusterDatasource<SyncStorage> {\n #version: number;\n #clusterDescription: string;\n #storage: StorageContext<SyncStorage>;\n #eventHandler: EventHandler;\n\n constructor(\n endpoint: EndpointInterface,\n cluster: ClusterServerObj<any, any>,\n storage: StorageContext<SyncStorage>,\n eventHandler: EventHandler<SyncStorage>,\n ) {\n this.#eventHandler = eventHandler;\n this.#clusterDescription = `cluster ${cluster.name} (${cluster.id})`;\n this.#storage = storage = storage.createContext(`Cluster-${endpoint.number}-${cluster.id}`);\n\n this.#version = cluster.datasource?.version ?? Crypto.getRandomUInt32();\n\n for (const attributeName in cluster.attributes) {\n const attribute = cluster.attributes[attributeName];\n if (!attribute) {\n // Shouldn't be possible\n continue;\n }\n if (!this.#storage.has(attributeName)) continue;\n try {\n const value = storage.get<any>(attributeName);\n logger.debug(`Restoring attribute ${attributeName} (${attribute.id}) in ${this.#clusterDescription}`);\n attribute.init(value);\n } catch (error) {\n logger.warn(\n `Failed to restore attribute ${attributeName} (${attribute.id}) in ${this.#clusterDescription}`,\n error,\n );\n storage.delete(attribute.name); // Storage broken so we should delete it\n }\n }\n\n cluster.datasource = this;\n }\n\n get version() {\n return this.#version;\n }\n\n get eventHandler() {\n return this.#eventHandler;\n }\n\n increaseVersion(): number {\n if (this.#version === 0xffffffff) {\n this.#version = -1;\n }\n return ++this.#version;\n }\n\n changed(attributeName: string, value: SupportedStorageTypes) {\n if (value === undefined) return;\n logger.debug(`Storing attribute ${attributeName} in ${this.#clusterDescription}`);\n this.#storage?.set(attributeName, value);\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 { MatterDevice } from \"./MatterDevice.js\";\nimport { MatterNode } from \"./MatterNode.js\";\nimport { DeviceCertification } from \"./behavior/definitions/operational-credentials/DeviceCertification.js\";\nimport { ProductDescription } from \"./behavior/system/product-description/ProductDescription.js\";\nimport { Ble } from \"./ble/Ble.js\";\nimport { AttestationCertificateManager } from \"./certificate/AttestationCertificateManager.js\";\nimport { CertificationDeclarationManager } from \"./certificate/CertificationDeclarationManager.js\";\nimport { Attributes, Cluster, Commands, Events } from \"./cluster/Cluster.js\";\nimport { ClusterClientObj } from \"./cluster/client/ClusterClientTypes.js\";\nimport { AccessControl } from \"./cluster/definitions/AccessControlCluster.js\";\nimport {\n AdministratorCommissioning,\n AdministratorCommissioningCluster,\n} from \"./cluster/definitions/AdministratorCommissioningCluster.js\";\nimport { BasicInformationCluster } from \"./cluster/definitions/BasicInformationCluster.js\";\nimport {\n GeneralCommissioning,\n GeneralCommissioningCluster,\n} from \"./cluster/definitions/GeneralCommissioningCluster.js\";\nimport { GeneralDiagnostics, GeneralDiagnosticsCluster } from \"./cluster/definitions/GeneralDiagnosticsCluster.js\";\nimport { GroupKeyManagementCluster } from \"./cluster/definitions/GroupKeyManagementCluster.js\";\nimport { OperationalCredentialsCluster } from \"./cluster/definitions/OperationalCredentialsCluster.js\";\nimport { createDefaultAccessControlClusterServer } from \"./cluster/server/AccessControlServer.js\";\nimport { AdministratorCommissioningHandler } from \"./cluster/server/AdministratorCommissioningServer.js\";\nimport {\n genericFabricScopedAttributeGetterFromFabric,\n genericFabricScopedAttributeSetterForFabric,\n} from \"./cluster/server/AttributeServer.js\";\nimport { ClusterServer } from \"./cluster/server/ClusterServer.js\";\nimport {\n AttributeInitialValues,\n ClusterDatasource,\n ClusterServerHandlers,\n ClusterServerObj,\n} from \"./cluster/server/ClusterServerTypes.js\";\nimport { GeneralCommissioningClusterHandler } from \"./cluster/server/GeneralCommissioningServer.js\";\nimport { createDefaultGeneralDiagnosticsClusterServer } from \"./cluster/server/GeneralDiagnosticsServer.js\";\nimport { GroupKeyManagementClusterHandler } from \"./cluster/server/GroupKeyManagementServer.js\";\nimport { OperationalCredentialsClusterHandler } from \"./cluster/server/OperationalCredentialsServer.js\";\nimport { ImplementationError, InternalError, NoProviderError } from \"./common/MatterError.js\";\nimport { Crypto } from \"./crypto/Crypto.js\";\nimport { EndpointNumber } from \"./datatype/EndpointNumber.js\";\nimport { FabricIndex } from \"./datatype/FabricIndex.js\";\nimport { VendorId } from \"./datatype/VendorId.js\";\nimport { Aggregator } from \"./device/Aggregator.js\";\nimport { Device, RootEndpoint } from \"./device/Device.js\";\nimport { Endpoint } from \"./device/Endpoint.js\";\nimport { LegacyInteractionServer } from \"./device/LegacyInteractionServer.js\";\nimport { EndpointInterface } from \"./endpoint/EndpointInterface.js\";\nimport { Fabric } from \"./fabric/Fabric.js\";\nimport { Logger } from \"./log/Logger.js\";\nimport { MdnsBroadcaster } from \"./mdns/MdnsBroadcaster.js\";\nimport { MdnsInstanceBroadcaster } from \"./mdns/MdnsInstanceBroadcaster.js\";\nimport { MdnsScanner } from \"./mdns/MdnsScanner.js\";\nimport { Network } from \"./net/Network.js\";\nimport { UdpInterface } from \"./net/UdpInterface.js\";\nimport { EventHandler } from \"./protocol/interaction/EventHandler.js\";\nimport { InteractionEndpointStructure } from \"./protocol/interaction/InteractionEndpointStructure.js\";\nimport { BitSchema, TypeFromBitSchema, TypeFromPartialBitSchema } from \"./schema/BitmapSchema.js\";\nimport {\n CommissioningFlowType,\n DiscoveryCapabilitiesBitmap,\n DiscoveryCapabilitiesSchema,\n ManualPairingCodeCodec,\n QrPairingCodeCodec,\n} from \"./schema/PairingCodeSchema.js\";\nimport { PaseClient } from \"./session/pase/PaseClient.js\";\nimport { SyncStorage } from \"./storage/Storage.js\";\nimport { StorageContext } from \"./storage/StorageContext.js\";\nimport { SupportedStorageTypes } from \"./storage/StringifyTools.js\";\nimport { ByteArray } from \"./util/ByteArray.js\";\nimport { NamedHandler } from \"./util/NamedHandler.js\";\n\nconst logger = Logger.get(\"CommissioningServer\");\n\nexport const FORBIDDEN_PASSCODES = [\n 0, 11111111, 22222222, 33333333, 44444444, 55555555, 66666666, 77777777, 88888888, 99999999, 12345678, 87654321,\n];\n\n/**\n * Data model revision used by this implementation\n * Value of 16 means \"Matter 1.0/1.1\"\n *\n * @see {@link MatterSpecification.v11.Core} \u00A7 7.1.1\n */\nexport const MATTER_DATAMODEL_VERSION = 16;\n\n/**\n * Represents device pairing information.\n */\nexport interface DevicePairingInformation {\n manualPairingCode: string;\n qrPairingCode: string;\n}\n\n/**\n * Constructor options for a CommissioningServer device\n * Beside the general options it also contains the data for the BasicInformation cluster which is added automatically\n * and allows to override the certificates used for the OperationalCredentials cluster\n */\nexport interface CommissioningServerOptions {\n /** Port of the server, normally automatically managed. */\n port?: number;\n\n /** IPv4 listener address, defaults to all interfaces.*/\n listeningAddressIpv4?: string;\n\n /** IPv6 listener address, defaults to all interfaces.*/\n listeningAddressIpv6?: string;\n\n /** The device name to be used for the BasicInformation cluster. */\n deviceName: string;\n\n /** The device type to be used for the BasicInformation cluster. */\n deviceType: number;\n\n /** The next endpoint ID to be assigned to a new endpoint. */\n nextEndpointId?: number;\n\n /** The passcode/pin of the device to use for initial commissioning. */\n passcode?: number;\n\n /** The Discriminator to use for initial commissioning. */\n discriminator?: number;\n\n /** The Flow type of the Commissioning flow used in announcements. */\n flowType?: CommissioningFlowType;\n\n /** Optional Vendor specific additional BLE Advertisement data. */\n additionalBleAdvertisementData?: ByteArray;\n\n /** Should the device directly be announced automatically by the MatterServer of manually via announce(). */\n delayedAnnouncement?: boolean;\n\n /**\n * Optional maximum subscription interval to use for sending subscription reports. It will be used if not too low\n * and inside the range requested by the connected controller.\n */\n subscriptionMaxIntervalSeconds?: number;\n\n /**\n * Optional minimum subscription interval to use for sending subscription reports. It will be used when other\n * calculated values are smaller than it. Use this to make sure your device hardware can handle the load and to set\n * limits.\n */\n subscriptionMinIntervalSeconds?: number;\n\n /**\n * Optional subscription randomization window to use for sending subscription reports. This specifies a window in\n * seconds from which a random part is added to the calculated maximum interval to make sure that devices that get\n * powered on in parallel not all send at the same timepoint.\n */\n subscriptionRandomizationWindowSeconds?: number;\n\n /**\n * Device details to be used for the BasicInformation cluster. Some of the values are initialized with defaults if\n * not set here.\n */\n basicInformation:\n | {\n vendorId: number;\n vendorName: string;\n productId: number;\n productName: string;\n }\n | AttributeInitialValues<typeof BasicInformationCluster.attributes>;\n\n /**\n * Vendor specific certificates to be used for the OperationalCredentials cluster. If not set Test certificates\n * (official Chip tool test Root certificate is used) are generated automatically.\n */\n certificates?: DeviceCertification.Definition;\n\n /**\n * Optional configuration for the GeneralCommissioning cluster. If not set the default values are used.\n * Use these options to limit the allowed countries for regulatory configuration.\n */\n generalCommissioning?: Partial<AttributeInitialValues<typeof GeneralCommissioningCluster.attributes>> & {\n allowCountryCodeChange?: boolean; // Default true if not set\n countryCodeWhitelist?: string[]; // Default all countries are allowed\n };\n\n /**\n * This callback is called when the device is commissioned or decommissioned to a fabric/controller. The provided\n * fabricIndex can be used together with getCommissionedFabricInformation() to get more details about the fabric\n * (or if this fabricIndex is missing it was deleted).\n */\n commissioningChangedCallback?: (fabricIndex: FabricIndex) => void;\n\n /**\n * This callback is called when sessions to the device are established, closed or subscriptions get added or\n * removed. The provided fabricIndex can be used together with getActiveSessionInformation() to get more details\n * about the open sessions and their status.\n */\n activeSessionsChangedCallback?: (fabricIndex: FabricIndex) => void;\n}\n\n/**\n * Commands exposed by the CommissioningServer\n */\nexport type CommissioningServerCommands = {\n /** Provide a means for certification tests to trigger some test-plan-specific events. */\n testEventTrigger: ClusterServerHandlers<typeof GeneralDiagnosticsCluster>[\"testEventTrigger\"];\n};\n\n// TODO decline using set/getRootClusterClient\n// TODO Decline cluster access after announced/paired\n\n/**\n * A CommissioningServer node represent a matter node that can be paired with a controller and runs on a defined port on the\n * host\n */\nexport class CommissioningServer extends MatterNode {\n private ipv4Disabled?: boolean;\n private port?: number;\n private readonly passcode: number;\n private readonly discriminator: number;\n private readonly flowType: CommissioningFlowType;\n private readonly productDescription: ProductDescription;\n\n private storage?: StorageContext<SyncStorage>;\n private endpointStructureStorage?: StorageContext<SyncStorage>;\n private mdnsScanner?: MdnsScanner;\n private mdnsBroadcaster?: MdnsBroadcaster;\n private mdnsInstanceBroadcaster?: MdnsInstanceBroadcaster;\n\n private deviceInstance?: MatterDevice;\n private eventHandler?: EventHandler;\n private endpointStructure: InteractionEndpointStructure;\n private interactionServer?: LegacyInteractionServer;\n\n protected readonly rootEndpoint = new RootEndpoint();\n\n private nextEndpointId: EndpointNumber;\n\n readonly delayedAnnouncement?: boolean;\n\n private readonly commandHandler = new NamedHandler<CommissioningServerCommands>();\n\n /**\n * Creates a new CommissioningServer node and add all needed Root clusters\n *\n * @param options The options for the CommissioningServer node\n */\n constructor(private readonly options: CommissioningServerOptions) {\n super();\n const {\n port,\n passcode,\n discriminator,\n flowType,\n nextEndpointId,\n delayedAnnouncement,\n basicInformation: { vendorId: vendorIdNumber, productId },\n generalCommissioning,\n } = options;\n this.port = port;\n if (passcode !== undefined && FORBIDDEN_PASSCODES.includes(passcode)) {\n throw new ImplementationError(`Passcode ${passcode} is not allowed.`);\n }\n this.passcode = passcode ?? PaseClient.generateRandomPasscode();\n this.discriminator = discriminator ?? PaseClient.generateRandomDiscriminator();\n this.flowType = flowType ?? CommissioningFlowType.Standard;\n this.nextEndpointId = EndpointNumber(nextEndpointId ?? 1);\n this.delayedAnnouncement = delayedAnnouncement;\n\n const vendorId = VendorId(vendorIdNumber);\n\n // Set the required basicInformation and respect the provided values\n // TODO Get the defaults from the cluster meta details\n const basicInformationAttributes = Object.assign(\n {\n dataModelRevision: MATTER_DATAMODEL_VERSION,\n nodeLabel: \"\",\n hardwareVersion: 0,\n hardwareVersionString: \"0\",\n location: \"XX\",\n localConfigDisabled: false,\n softwareVersion: 1,\n softwareVersionString: \"v1\",\n capabilityMinima: {\n caseSessionsPerFabric: 3, // TODO get that limit from Sessionmanager or such or sync with it, add limit? Just a minima?\n subscriptionsPerFabric: 3, // TODO get that limit from Interactionserver? Respect it? It is just a minima?\n },\n serialNumber: `node-matter-${Crypto.get().getRandomData(4).toHex()}`,\n },\n options.basicInformation,\n ) as AttributeInitialValues<typeof BasicInformationCluster.attributes>;\n\n const reachabilitySupported = basicInformationAttributes.reachable !== undefined;\n // Add basic Information cluster to root directly because it is not allowed to be changed afterward\n const basicInformationCluster = ClusterServer(\n BasicInformationCluster,\n basicInformationAttributes,\n {},\n {\n startUp: true,\n shutDown: true,\n reachableChanged: reachabilitySupported,\n leave: true,\n },\n );\n this.rootEndpoint.addClusterServer(basicInformationCluster);\n\n if (reachabilitySupported) {\n basicInformationCluster.subscribeReachableAttribute(newValue =>\n basicInformationCluster.triggerReachableChangedEvent?.({ reachableNewValue: newValue }),\n );\n }\n\n // Use provided certificates for OperationalCredentialsCluster or generate own ones\n let { certificates } = options;\n if (certificates == undefined) {\n const paa = new AttestationCertificateManager(vendorId);\n const { keyPair: dacKeyPair, dac } = paa.getDACert(productId);\n const declaration = CertificationDeclarationManager.generate(vendorId, productId);\n\n certificates = {\n privateKey: dacKeyPair.privateKey,\n certificate: dac,\n intermediateCertificate: paa.getPAICert(),\n declaration,\n };\n }\n\n this.productDescription = {\n name: options.deviceName,\n deviceType: options.deviceType,\n vendorId: vendorId,\n productId: productId,\n };\n\n // Add Operational credentials cluster to root directly because it is not allowed to be changed afterward\n // TODO Get the defaults from the cluster meta details\n this.rootEndpoint.addClusterServer(\n ClusterServer(\n OperationalCredentialsCluster,\n {\n nocs: [],\n fabrics: [],\n supportedFabrics: 254, // maximum number of fabrics. Also FabricBuilder uses 254 as max!\n commissionedFabrics: 0,\n trustedRootCertificates: [],\n currentFabricIndex: FabricIndex.NO_FABRIC,\n },\n OperationalCredentialsClusterHandler(certificates, this.productDescription),\n ),\n );\n\n // TODO Get the defaults from the cluster meta details\n this.rootEndpoint.addClusterServer(\n ClusterServer(\n GeneralCommissioningCluster,\n {\n breadcrumb: generalCommissioning?.breadcrumb ?? BigInt(0),\n basicCommissioningInfo: generalCommissioning?.basicCommissioningInfo ?? {\n failSafeExpiryLengthSeconds: 60 /* 1min */,\n maxCumulativeFailsafeSeconds: 900 /* Recommended according to Specs */,\n },\n regulatoryConfig:\n generalCommissioning?.regulatoryConfig ?? GeneralCommissioning.RegulatoryLocationType.Outdoor, // Default is the most restrictive one\n locationCapability:\n generalCommissioning?.locationCapability ??\n GeneralCommissioning.RegulatoryLocationType.IndoorOutdoor,\n supportsConcurrentConnection: generalCommissioning?.supportsConcurrentConnection ?? true,\n },\n GeneralCommissioningClusterHandler({\n allowCountryCodeChange: generalCommissioning?.allowCountryCodeChange ?? true,\n countryCodeWhitelist: generalCommissioning?.countryCodeWhitelist ?? undefined,\n }),\n ),\n );\n\n // TODO Get the defaults from the cluster meta details\n this.rootEndpoint.addClusterServer(createDefaultAccessControlClusterServer());\n\n // TODO Get the defaults from the cluster meta details\n this.rootEndpoint.addClusterServer(\n ClusterServer(\n GroupKeyManagementCluster,\n {\n groupKeyMap: [],\n groupTable: [],\n maxGroupsPerFabric: 0, // TODO: Increase once we add group support, for now only IPK is supported\n maxGroupKeysPerFabric: 1,\n },\n GroupKeyManagementClusterHandler(),\n ),\n );\n\n // TODO Get the defaults from the cluster meta details\n this.rootEndpoint.addClusterServer(createDefaultGeneralDiagnosticsClusterServer(this.commandHandler));\n\n this.rootEndpoint.addClusterServer(\n ClusterServer(\n AdministratorCommissioningCluster,\n {\n windowStatus: AdministratorCommissioning.CommissioningWindowStatus.WindowNotOpen,\n adminFabricIndex: null,\n adminVendorId: null,\n },\n AdministratorCommissioningHandler(),\n ),\n );\n\n this.endpointStructure = new InteractionEndpointStructure();\n\n // We must register this event before creating an InteractionServer so\n // we initialize endpoint datasources before the InteractionServer\n // processes events\n this.endpointStructure.change.on(() => {\n if (this.storage === undefined || this.eventHandler === undefined) {\n throw new InternalError(\"Endpoint structure reports change prior to server initialization\");\n }\n\n for (const endpoint of this.endpointStructure.endpoints.values()) {\n for (const cluster of endpoint.getAllClusterServers()) {\n new CommissioningServerClusterDatasource(endpoint, cluster, this.storage, this.eventHandler);\n }\n }\n });\n }\n\n /**\n * Get a cluster server from the root endpoint. This is mainly used internally and not needed to be called by the user.\n *\n * @param cluster ClusterServer to get or undefined if not existing\n */\n getRootClusterServer<\n F extends BitSchema,\n SF extends TypeFromPartialBitSchema<F>,\n A extends Attributes,\n C extends Commands,\n E extends Events,\n >(cluster: Cluster<F, SF, A, C, E>): ClusterServerObj<A, E> | undefined {\n return this.rootEndpoint.getClusterServer(cluster);\n }\n\n /**\n * Add a cluster client to the root endpoint. This is mainly used internally and not needed to be called by the user.\n *\n * @param cluster ClusterClient object to add\n */\n addRootClusterClient<F extends BitSchema, A extends Attributes, C extends Commands, E extends Events>(\n cluster: ClusterClientObj<F, A, C, E>,\n ) {\n this.rootEndpoint.addClusterClient(cluster);\n }\n\n /**\n * Get a cluster client from the root endpoint. This is mainly used internally and not needed to be called by the user.\n *\n * @param cluster ClusterClient to get or undefined if not existing\n */\n getRootClusterClient<\n F extends BitSchema,\n SF extends TypeFromPartialBitSchema<F>,\n A extends Attributes,\n C extends Commands,\n E extends Events,\n >(cluster: Cluster<F, SF, A, C, E>): ClusterClientObj<F, A, C, E> | undefined {\n return this.rootEndpoint.getClusterClient(cluster);\n }\n\n /**\n * Get the root endpoint of the node.\n */\n getRootEndpoint() {\n return this.rootEndpoint;\n }\n\n /**\n * Add a child endpoint to the root endpoint. This is mainly used internally and not needed to be called by the user.\n *\n * @param endpoint Endpoint to add\n * @protected\n */\n protected addEndpoint(endpoint: Endpoint) {\n this.rootEndpoint.addChildEndpoint(endpoint);\n }\n\n /**\n * Get a child endpoint from the root endpoint. This is mainly used internally and not needed to be called by the user.\n *\n * @param endpointId Endpoint ID of the child endpoint to get\n * @protected\n */\n protected getChildEndpoint(endpointId: EndpointNumber): Endpoint | undefined {\n return this.rootEndpoint.getChildEndpoint(endpointId);\n }\n\n /**\n * Add a new cluster server to the root endpoint\n * BasicInformationCluster and OperationalCredentialsCluster can not be added via this method because they are\n * added in the constructor\n *\n * @param cluster\n */\n addRootClusterServer<A extends Attributes, E extends Events>(cluster: ClusterServerObj<A, E>) {\n if (cluster.id === BasicInformationCluster.id) {\n throw new ImplementationError(\n \"BasicInformationCluster can not be modified, provide all details in constructor options!\",\n );\n }\n if (cluster.id === OperationalCredentialsCluster.id) {\n throw new ImplementationError(\n \"OperationalCredentialsCluster can not be modified, provide the certificates in constructor options!\",\n );\n }\n this.rootEndpoint.addClusterServer(cluster);\n }\n\n /**\n * Advertise the node via all available interfaces (Ethernet/MDNS, BLE, ...) and start the commissioning process\n *\n * @param limitTo Limit the advertisement to the given discovery capabilities. Default is to advertise on ethernet\n * and BLE if configured\n */\n async advertise(limitTo?: TypeFromPartialBitSchema<typeof DiscoveryCapabilitiesBitmap>) {\n if (\n this.mdnsBroadcaster === undefined ||\n this.mdnsScanner === undefined ||\n this.storage === undefined ||\n this.eventHandler === undefined ||\n this.endpointStructureStorage === undefined ||\n this.port === undefined\n ) {\n throw new ImplementationError(\"Add the node to the Matter instance before!\");\n }\n\n if (this.interactionServer !== undefined && this.deviceInstance !== undefined) {\n logger.debug(\"Device already initialized, just advertise the instance again ...\");\n await this.deviceInstance.announce();\n return;\n }\n\n this.mdnsInstanceBroadcaster = this.mdnsBroadcaster.createInstanceBroadcaster(this.port);\n\n const basicInformation = this.getRootClusterServer(BasicInformationCluster);\n if (basicInformation == undefined) {\n throw new ImplementationError(\"BasicInformationCluster needs to be set!\");\n }\n\n this.interactionServer = new LegacyInteractionServer({\n endpointStructure: this.endpointStructure,\n subscriptionOptions: {\n maxIntervalSeconds: this.options.subscriptionMaxIntervalSeconds,\n minIntervalSeconds: this.options.subscriptionMinIntervalSeconds,\n randomizationWindowSeconds: this.options.subscriptionRandomizationWindowSeconds,\n },\n });\n\n this.nextEndpointId = this.endpointStructureStorage.get(\"nextEndpointId\", this.nextEndpointId);\n\n this.assignEndpointIds(); // Make sure to have unique endpoint ids\n this.rootEndpoint.updatePartsList(); // initialize parts list of all Endpoint objects with final IDs\n this.rootEndpoint.setStructureChangedCallback(() => this.updateStructure()); // Make sure we get structure changes\n\n this.endpointStructure.initializeFromEndpoint(this.rootEndpoint);\n\n // TODO adjust later and refactor MatterDevice\n const deviceInstance = await MatterDevice.create(\n this.storage.createContext(\"SessionManager\"),\n this.storage.createContext(\"FabricManager\"),\n () => ({\n productDescription: this.productDescription,\n passcode: this.passcode,\n discriminator: this.discriminator,\n flowType: this.flowType,\n additionalBleAdvertisementData: this.options.additionalBleAdvertisementData,\n\n // We don't use this\n ble: false,\n }),\n basicInformation.getCapabilityMinimaAttribute().caseSessionsPerFabric, // Internally it is \"Session and Node\", so we support even more\n (fabricIndex: FabricIndex) => {\n const fabricsCount = this.deviceInstance?.getFabrics().length ?? 0;\n if (fabricsCount === 1) {\n // When first Fabric is added (aka initial commissioning) and we did not advertised on MDNS before, add broadcaster now\n // TODO Refactor this out when we remove MatterDevice class\n if (\n this.mdnsInstanceBroadcaster !== undefined &&\n !this.deviceInstance?.hasBroadcaster(this.mdnsInstanceBroadcaster)\n ) {\n this.deviceInstance?.addBroadcaster(this.mdnsInstanceBroadcaster);\n }\n }\n if (fabricsCount === 0) {\n // When last fabric gets deleted we do a factory reset\n this.factoryReset()\n .then(() => this.options.commissioningChangedCallback?.(fabricIndex))\n .catch(error => logger.error(\"Error while doing factory reset of the device\", error));\n } else {\n this.options.commissioningChangedCallback?.(fabricIndex);\n }\n },\n (fabricIndex: FabricIndex) => this.options.activeSessionsChangedCallback?.(fabricIndex),\n );\n deviceInstance.addTransportInterface(\n await UdpInterface.create(Network.get(), \"udp6\", this.port, this.options.listeningAddressIpv6),\n );\n deviceInstance.addScanner(this.mdnsScanner);\n deviceInstance.addProtocolHandler(this.interactionServer);\n this.deviceInstance = deviceInstance;\n if (!this.ipv4Disabled) {\n deviceInstance.addTransportInterface(\n await UdpInterface.create(Network.get(), \"udp4\", this.port, this.options.listeningAddressIpv4),\n );\n }\n\n if (this.isCommissioned()) {\n // Handle Backward compatibility to Matter.js before 0.9.1 and add the missing ACL entry if no entry was set\n // so far by the controller\n const fabrics = deviceInstance.getFabrics();\n for (const fabric of fabrics) {\n if (\n genericFabricScopedAttributeGetterFromFabric<AccessControl.AccessControlEntryStruct[] | undefined>(\n fabric,\n AccessControl.Cluster,\n \"acl\",\n undefined,\n ) === undefined\n ) {\n genericFabricScopedAttributeSetterForFabric(fabric, AccessControl.Cluster, \"acl\", [\n {\n fabricIndex: fabric.fabricIndex,\n privilege: AccessControl.AccessControlEntryPrivilege.Administer,\n authMode: AccessControl.AccessControlEntryAuthMode.Case,\n subjects: [fabric.rootNodeId],\n targets: null, // entire node\n },\n ]);\n logger.warn(\n \"Added missing ACL entry for fabric\",\n fabric.fabricIndex,\n \"for Node ID\",\n fabric.rootNodeId,\n \". This should only happen once after upgrading to matter.js 0.9.1\",\n );\n }\n }\n\n limitTo = { onIpNetwork: true }; // If already commissioned the device is on network already\n } else {\n // BLE or SoftAP only relevant when not commissioned yet\n try {\n const ble = Ble.get();\n deviceInstance.addTransportInterface(ble.getBlePeripheralInterface());\n if (limitTo === undefined || limitTo.ble) {\n deviceInstance.addBroadcaster(ble.getBleBroadcaster(this.options.additionalBleAdvertisementData));\n }\n } catch (error) {\n if (error instanceof NoProviderError) {\n logger.debug(\"Ble not enabled\");\n } else {\n throw error;\n }\n }\n\n if (limitTo?.softAccessPoint) {\n logger.error(\"Advertising as SoftAP not implemented yet. Ignoring ...\");\n }\n }\n\n if (limitTo === undefined || limitTo.onIpNetwork) {\n deviceInstance.addBroadcaster(this.mdnsInstanceBroadcaster);\n }\n\n await deviceInstance.start();\n\n // Send required events\n basicInformation.triggerStartUpEvent({ softwareVersion: basicInformation.getSoftwareVersionAttribute() });\n\n const generalDiagnostics = this.getRootClusterServer(GeneralDiagnosticsCluster);\n if (generalDiagnostics !== undefined) {\n this.getRootClusterServer(GeneralDiagnosticsCluster)?.triggerBootReasonEvent({\n bootReason: generalDiagnostics.getBootReasonAttribute?.() ?? GeneralDiagnostics.BootReason.Unspecified,\n });\n }\n }\n\n updateStructure() {\n logger.debug(\"Endpoint structure got updated ...\");\n this.assignEndpointIds(); // Make sure to have unique endpoint ids\n this.rootEndpoint.updatePartsList(); // update parts list of all Endpoint objects with final IDs\n this.endpointStructure.initializeFromEndpoint(this.rootEndpoint); // Reinitialize the interaction server structure\n }\n\n getNextEndpointId(increase = true) {\n if (increase) {\n this.nextEndpointId++;\n }\n return this.nextEndpointId;\n }\n\n assignEndpointIds() {\n const rootUniqueIdPrefix = this.rootEndpoint.determineUniqueID();\n this.initializeEndpointIdsFromStorage(this.rootEndpoint, rootUniqueIdPrefix);\n this.fillAndStoreEndpointIds(this.rootEndpoint, rootUniqueIdPrefix);\n this.endpointStructureStorage?.set(\"nextEndpointId\", this.nextEndpointId);\n }\n\n private initializeEndpointIdsFromStorage(endpoint: Endpoint, parentUniquePrefix = \"\") {\n if (this.endpointStructureStorage === undefined) {\n throw new ImplementationError(\"Storage manager must be initialized to enable initialization from storage.\");\n }\n const endpoints = endpoint.getChildEndpoints();\n for (let endpointIndex = 0; endpointIndex < endpoints.length; endpointIndex++) {\n let endpointUniquePrefix = parentUniquePrefix;\n const endpoint = endpoints[endpointIndex];\n const thisUniqueId = endpoint.determineUniqueID();\n if (thisUniqueId === undefined) {\n if (endpoint.number === undefined) {\n logger.debug(\n `No unique id found for endpoint on index ${endpointIndex} / device ${endpoint.name} - using index as unique identifier!`,\n );\n }\n endpointUniquePrefix += `${endpointUniquePrefix === \"\" ? \"\" : \"-\"}index_${endpointIndex}`;\n } else {\n endpointUniquePrefix += `${endpointUniquePrefix === \"\" ? \"\" : \"-\"}${thisUniqueId}`;\n }\n\n if (endpoint.number === undefined) {\n if (this.endpointStructureStorage.has(endpointUniquePrefix)) {\n endpoint.number = this.endpointStructureStorage.get<EndpointNumber>(endpointUniquePrefix);\n logger.debug(\n `Restored endpoint id ${endpoint.number} for endpoint with ${endpointUniquePrefix} / device ${endpoint.name} from storage`,\n );\n }\n }\n if (endpoint.number !== undefined && endpoint.number > this.nextEndpointId) {\n this.nextEndpointId = EndpointNumber(endpoint.number + 1);\n }\n this.initializeEndpointIdsFromStorage(endpoint, endpointUniquePrefix);\n }\n }\n\n private fillAndStoreEndpointIds(endpoint: Endpoint, parentUniquePrefix = \"\") {\n if (this.endpointStructureStorage === undefined) {\n throw new ImplementationError(\"endpointStructureStorage not set!\");\n }\n const endpoints = endpoint.getChildEndpoints();\n for (let endpointIndex = 0; endpointIndex < endpoints.length; endpointIndex++) {\n let endpointUniquePrefix = parentUniquePrefix;\n endpoint = endpoints[endpointIndex];\n const thisUniqueId = endpoint.determineUniqueID();\n if (thisUniqueId === undefined) {\n endpointUniquePrefix += `${endpointUniquePrefix === \"\" ? \"\" : \"-\"}index_${endpointIndex}`;\n } else {\n endpointUniquePrefix += `${endpointUniquePrefix === \"\" ? \"\" : \"-\"}${thisUniqueId}`;\n }\n\n if (endpoint.number === undefined) {\n endpoint.number = EndpointNumber(this.nextEndpointId++);\n this.endpointStructureStorage.set(endpointUniquePrefix, endpoint.number);\n logger.debug(\n `Assigned endpoint id ${endpoint.number} for endpoint with ${endpointUniquePrefix} / device ${endpoint.name} and stored it`,\n );\n }\n this.fillAndStoreEndpointIds(endpoint, endpointUniquePrefix);\n }\n }\n\n /**\n * Return info if the device is paired with at least one controller\n */\n isCommissioned(): boolean {\n return this.deviceInstance?.isCommissioned() ?? false;\n }\n\n /**\n * Return the pairing information for the device\n */\n getPairingCode(\n discoveryCapabilities?: TypeFromBitSchema<typeof DiscoveryCapabilitiesBitmap>,\n ): DevicePairingInformation {\n const basicInformation = this.getRootClusterServer(BasicInformationCluster);\n if (basicInformation == undefined) {\n throw new ImplementationError(\"BasicInformationCluster needs to be set!\");\n }\n\n const vendorId = basicInformation.attributes.vendorId.getLocal();\n const productId = basicInformation.attributes.productId.getLocal();\n\n let bleEnabled = false;\n try {\n bleEnabled = !!Ble.get();\n } catch (error) {\n if (!(error instanceof NoProviderError)) {\n // only ignore NoProviderError cases\n throw error;\n }\n }\n\n const qrPairingCode = QrPairingCodeCodec.encode({\n version: 0,\n vendorId: vendorId,\n productId,\n flowType: this.flowType,\n discriminator: this.discriminator,\n passcode: this.passcode,\n discoveryCapabilities: DiscoveryCapabilitiesSchema.encode(\n discoveryCapabilities ?? {\n ble: bleEnabled,\n softAccessPoint: false,\n onIpNetwork: true,\n },\n ),\n });\n\n return {\n manualPairingCode: ManualPairingCodeCodec.encode({\n discriminator: this.discriminator,\n passcode: this.passcode,\n }),\n qrPairingCode,\n };\n }\n\n /**\n * Set the MDNS Scanner instance. Should be only used internally\n *\n * @param mdnsScanner MdnsScanner instance\n */\n setMdnsScanner(mdnsScanner: MdnsScanner) {\n this.mdnsScanner = mdnsScanner;\n }\n\n /**\n * Set the MDNS Broadcaster instance. Should be only used internally\n *\n * @param mdnsBroadcaster MdnsBroadcaster instance\n */\n setMdnsBroadcaster(mdnsBroadcaster: MdnsBroadcaster) {\n if (this.port === undefined) {\n throw new ImplementationError(\"Port must be set before setting the MDNS broadcaster!\");\n }\n this.mdnsBroadcaster = mdnsBroadcaster;\n }\n\n /**\n * Set the StorageManager instance. Should be only used internally\n * @param storage\n */\n async setStorage(storage: StorageContext<SyncStorage>) {\n this.storage = storage;\n this.endpointStructureStorage = this.storage.createContext(\"EndpointStructure\");\n this.eventHandler = await EventHandler.create(this.storage.createContext(\"EventHandler\"));\n }\n\n /**\n * Add a new device to the node\n *\n * @param device Device or Aggregator instance to add\n */\n addDevice(device: Device | Aggregator) {\n this.addEndpoint(device);\n }\n\n /**\n * Return the port the device is listening on\n */\n getPort(): number | undefined {\n return this.port;\n }\n\n /** Set the port the device is listening on. Can only be called before the device is initialized. */\n setPort(port: number) {\n if (port === this.port) return;\n if (this.deviceInstance !== undefined || this.mdnsInstanceBroadcaster !== undefined) {\n throw new ImplementationError(\"Port can not be changed after device is initialized!\");\n }\n this.port = port;\n }\n\n /**\n * Close network connections of the device and stop responding to requests\n */\n async close() {\n this.rootEndpoint.getClusterServer(BasicInformationCluster)?.triggerShutDownEvent?.();\n await this.interactionServer?.close();\n this.interactionServer = undefined;\n this.endpointStructure.close();\n await this.deviceInstance?.close();\n this.deviceInstance = undefined;\n await this.mdnsInstanceBroadcaster?.close();\n this.mdnsInstanceBroadcaster = undefined;\n }\n\n async factoryReset() {\n if (this.storage === undefined) {\n throw new ImplementationError(\n \"Storage not initialized. The instance was not added to a Matter instance yet.\",\n );\n }\n const wasStarted = this.interactionServer !== undefined || this.deviceInstance !== undefined;\n let fabrics = new Array<Fabric>();\n if (wasStarted) {\n fabrics = this.isCommissioned() ? this.deviceInstance?.getFabrics() ?? [] : [];\n await this.close();\n }\n\n this.storage.clearAll();\n\n if (wasStarted) {\n await this.advertise();\n fabrics.forEach(fabric => this.options.commissioningChangedCallback?.(fabric.fabricIndex));\n }\n logger.info(`The device was factory reset${wasStarted ? \" and restarted\" : \"\"}.`);\n }\n\n /**\n * Add a new command handler for the given command\n *\n * @param command Command to add the handler for\n * @param handler Handler function to add\n */\n addCommandHandler<K extends keyof CommissioningServerCommands>(\n command: K,\n handler: CommissioningServerCommands[K],\n ) {\n this.commandHandler.addHandler(command, handler);\n }\n\n /**\n * Remove a command handler for the given command\n *\n * @param command Command to remove the handler for\n * @param handler Handler function to remove\n */\n removeCommandHandler<K extends keyof CommissioningServerCommands>(\n command: K,\n handler: CommissioningServerCommands[K],\n ) {\n this.commandHandler.removeHandler(command, handler);\n }\n\n /**\n * Set the reachability of the commissioning server aka \"the main matter device\". This call only has effect when\n * the reachability flag was set in the BasicInformationCluster or in the BasicInformation data in the constructor!\n *\n * @param reachable true if reachable, false otherwise\n */\n setReachability(reachable: boolean) {\n const basicInformationCluster = this.getRootClusterServer(BasicInformationCluster);\n if (basicInformationCluster === undefined) {\n throw new ImplementationError(\"BasicInformationCluster needs to be set!\");\n }\n if (basicInformationCluster.attributes.reachable !== undefined) {\n basicInformationCluster.setReachableAttribute(reachable);\n }\n }\n\n /** used internally by MatterServer to initialize the state of the device. */\n initialize(ipv4Disabled: boolean) {\n if (this.ipv4Disabled !== undefined && this.ipv4Disabled !== ipv4Disabled) {\n throw new ImplementationError(\n \"Changing the IPv4 disabled flag after starting the device is not supported.\",\n );\n }\n this.ipv4Disabled = ipv4Disabled;\n }\n\n /** Starts the Matter device and advertises it. */\n async start() {\n if (this.ipv4Disabled === undefined) {\n throw new ImplementationError(\"Add the device to the MatterServer first.\");\n }\n if (this.delayedAnnouncement !== true) {\n return this.advertise();\n }\n }\n\n /**\n * Get some basic details of all Fabrics the server is commissioned to.\n *\n * @param fabricIndex Optional fabric index to filter for. If not set all fabrics are returned.\n */\n getCommissionedFabricInformation(fabricIndex?: FabricIndex) {\n if (!this.isCommissioned()) return [];\n const allFabrics = this.deviceInstance?.getFabrics() ?? [];\n const fabrics = fabricIndex === undefined ? allFabrics : allFabrics.filter(f => f.fabricIndex === fabricIndex);\n return fabrics.map(fabric => fabric.externalInformation) ?? [];\n }\n\n /**\n * Get some basic details of all currently active sessions.\n *\n * @param fabricIndex Optional fabric index to filter for. If not set all sessions are returned.\n */\n getActiveSessionInformation(fabricIndex?: FabricIndex) {\n if (!this.isCommissioned()) return [];\n const allSessions = this.deviceInstance?.getActiveSessionInformation() ?? [];\n return allSessions.filter(({ fabric }) => fabricIndex === undefined || fabric?.fabricIndex === fabricIndex);\n }\n}\n\nclass CommissioningServerClusterDatasource implements ClusterDatasource<SyncStorage> {\n #version: number;\n #clusterDescription: string;\n #storage: StorageContext<SyncStorage>;\n #eventHandler: EventHandler;\n\n constructor(\n endpoint: EndpointInterface,\n cluster: ClusterServerObj<any, any>,\n storage: StorageContext<SyncStorage>,\n eventHandler: EventHandler<SyncStorage>,\n ) {\n this.#eventHandler = eventHandler;\n this.#clusterDescription = `cluster ${cluster.name} (${cluster.id})`;\n this.#storage = storage = storage.createContext(`Cluster-${endpoint.number}-${cluster.id}`);\n\n this.#version = cluster.datasource?.version ?? Crypto.getRandomUInt32();\n\n for (const attributeName in cluster.attributes) {\n const attribute = cluster.attributes[attributeName];\n if (!attribute) {\n // Shouldn't be possible\n continue;\n }\n if (!this.#storage.has(attributeName)) continue;\n try {\n const value = storage.get<any>(attributeName);\n logger.debug(`Restoring attribute ${attributeName} (${attribute.id}) in ${this.#clusterDescription}`);\n attribute.init(value);\n } catch (error) {\n logger.warn(\n `Failed to restore attribute ${attributeName} (${attribute.id}) in ${this.#clusterDescription}`,\n error,\n );\n storage.delete(attribute.name); // Storage broken so we should delete it\n }\n }\n\n cluster.datasource = this;\n }\n\n get version() {\n return this.#version;\n }\n\n get eventHandler() {\n return this.#eventHandler;\n }\n\n increaseVersion(): number {\n if (this.#version === 0xffffffff) {\n this.#version = -1;\n }\n return ++this.#version;\n }\n\n changed(attributeName: string, value: SupportedStorageTypes) {\n if (value === undefined) return;\n logger.debug(`Storing attribute ${attributeName} in ${this.#clusterDescription}`);\n this.#storage?.set(attributeName, value);\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["endpoint"]
|
|
7
7
|
}
|
|
@@ -35,6 +35,7 @@ export declare class MatterDevice {
|
|
|
35
35
|
private readonly channelManager;
|
|
36
36
|
private readonly secureChannelProtocol;
|
|
37
37
|
private activeCommissioningMode;
|
|
38
|
+
private activeCommissioningDiscriminator?;
|
|
38
39
|
private activeCommissioningEndCallback?;
|
|
39
40
|
private announceInterval;
|
|
40
41
|
private announcementStartedTime;
|
|
@@ -62,6 +63,7 @@ export declare class MatterDevice {
|
|
|
62
63
|
expireAllFabricAnnouncements(): Promise<void>;
|
|
63
64
|
announce(announceOnce?: boolean): Promise<void>;
|
|
64
65
|
private announceAsCommissionable;
|
|
66
|
+
reAnnounceAsCommissionable(): void;
|
|
65
67
|
sendCommissionableAnnouncement(mode: AdministratorCommissioning.CommissioningWindowStatus, discriminator?: number): Promise<void>;
|
|
66
68
|
getNextAvailableSessionId(): Promise<number>;
|
|
67
69
|
findFabricFromDestinationId(destinationId: ByteArray, peerRandom: ByteArray): Fabric;
|
|
@@ -80,6 +82,7 @@ export declare class MatterDevice {
|
|
|
80
82
|
session: Session<MatterDevice>;
|
|
81
83
|
channel: Channel<ByteArray>;
|
|
82
84
|
}>;
|
|
85
|
+
clearSubscriptionsForNode(fabricIndex: FabricIndex, peerNodeId: NodeId, flushSubscriptions?: boolean): Promise<void>;
|
|
83
86
|
close(): Promise<void>;
|
|
84
87
|
getActiveSessionInformation(): {
|
|
85
88
|
name: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MatterDevice.d.ts","sourceRoot":"","sources":["../../src/MatterDevice.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAYH,OAAO,EAAE,oBAAoB,EAAE,MAAM,yDAAyD,CAAC;AAC/F,OAAO,EAAE,0BAA0B,EAAE,MAAM,4DAA4D,CAAC;AAExG,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AAGtE,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AAEpE,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAMxE,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAGhE,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC/E,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAE7D,OAAO,EAAE,iBAAiB,EAAY,MAAM,6BAA6B,CAAC;AAC1E,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAKhD,qBAAa,YAAY;;
|
|
1
|
+
{"version":3,"file":"MatterDevice.d.ts","sourceRoot":"","sources":["../../src/MatterDevice.ts"],"names":[],"mappings":"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"}
|
package/dist/esm/MatterDevice.js
CHANGED
|
@@ -53,6 +53,7 @@ class MatterDevice {
|
|
|
53
53
|
if (this.#fabricManager.getFabrics().length === 0) {
|
|
54
54
|
await this.expireAllFabricAnnouncements();
|
|
55
55
|
}
|
|
56
|
+
this.reAnnounceAsCommissionable();
|
|
56
57
|
});
|
|
57
58
|
this.#fabricManager.events.updated.on(
|
|
58
59
|
({ fabricIndex }) => this.commissioningChangedCallback(fabricIndex, FabricAction.Updated)
|
|
@@ -78,15 +79,16 @@ class MatterDevice {
|
|
|
78
79
|
if (!session.closingAfterExchangeFinished) {
|
|
79
80
|
await this.exchangeManager.closeSession(session);
|
|
80
81
|
}
|
|
81
|
-
const
|
|
82
|
-
if (
|
|
83
|
-
this.sessionChangedCallback(
|
|
82
|
+
const currentFabricIndex = session.fabric?.fabricIndex;
|
|
83
|
+
if (currentFabricIndex !== void 0) {
|
|
84
|
+
this.sessionChangedCallback(currentFabricIndex);
|
|
84
85
|
}
|
|
85
86
|
if (this.isClosing) {
|
|
86
87
|
return;
|
|
87
88
|
}
|
|
88
|
-
|
|
89
|
-
|
|
89
|
+
const existingSessionFabric = currentFabricIndex === void 0 ? void 0 : this.getFabricByIndex(currentFabricIndex)?.fabricIndex;
|
|
90
|
+
if (this.#fabricManager.getFabrics().length > 0 || session.isPase || !existingSessionFabric) {
|
|
91
|
+
this.startAnnouncement().catch((error) => logger.warn(`Error while announcing`, error));
|
|
90
92
|
}
|
|
91
93
|
});
|
|
92
94
|
this.#sessionManager.subscriptionsChanged.on((session) => {
|
|
@@ -218,7 +220,7 @@ class MatterDevice {
|
|
|
218
220
|
}
|
|
219
221
|
async expireAllFabricAnnouncements() {
|
|
220
222
|
for (const broadcaster of this.broadcasters) {
|
|
221
|
-
await broadcaster.
|
|
223
|
+
await broadcaster.expireFabricAnnouncement();
|
|
222
224
|
}
|
|
223
225
|
}
|
|
224
226
|
async announce(announceOnce = false) {
|
|
@@ -247,7 +249,7 @@ class MatterDevice {
|
|
|
247
249
|
}
|
|
248
250
|
for (const broadcaster of this.broadcasters) {
|
|
249
251
|
await broadcaster.setFabrics(fabrics);
|
|
250
|
-
if (fabricsWithoutSessions > 0) {
|
|
252
|
+
if (fabricsWithoutSessions > 0 || this.activeCommissioningMode !== AdministratorCommissioning.CommissioningWindowStatus.WindowNotOpen) {
|
|
251
253
|
await broadcaster.announce();
|
|
252
254
|
}
|
|
253
255
|
}
|
|
@@ -266,6 +268,7 @@ class MatterDevice {
|
|
|
266
268
|
throw new InternalError("Commissioning window already open with different callback!");
|
|
267
269
|
}
|
|
268
270
|
this.activeCommissioningMode = mode;
|
|
271
|
+
this.activeCommissioningDiscriminator = discriminator;
|
|
269
272
|
if (activeCommissioningEndCallback !== void 0) {
|
|
270
273
|
this.activeCommissioningEndCallback = activeCommissioningEndCallback;
|
|
271
274
|
}
|
|
@@ -273,6 +276,14 @@ class MatterDevice {
|
|
|
273
276
|
(error) => logger.warn("Error sending announcement", error)
|
|
274
277
|
);
|
|
275
278
|
}
|
|
279
|
+
reAnnounceAsCommissionable() {
|
|
280
|
+
if (this.activeCommissioningMode === AdministratorCommissioning.CommissioningWindowStatus.WindowNotOpen) {
|
|
281
|
+
return;
|
|
282
|
+
}
|
|
283
|
+
this.sendCommissionableAnnouncement(this.activeCommissioningMode, this.activeCommissioningDiscriminator).catch(
|
|
284
|
+
(error) => logger.warn("Error sending announcement", error)
|
|
285
|
+
);
|
|
286
|
+
}
|
|
276
287
|
async sendCommissionableAnnouncement(mode, discriminator) {
|
|
277
288
|
const commissioningConfig = this.getCommissioningConfig();
|
|
278
289
|
for (const broadcaster of this.broadcasters) {
|
|
@@ -378,6 +389,9 @@ class MatterDevice {
|
|
|
378
389
|
}
|
|
379
390
|
return { session, channel: await networkInterface.openChannel(device.addresses[0]) };
|
|
380
391
|
}
|
|
392
|
+
async clearSubscriptionsForNode(fabricIndex, peerNodeId, flushSubscriptions) {
|
|
393
|
+
await this.#sessionManager.clearSubscriptionsForNode(fabricIndex, peerNodeId, flushSubscriptions);
|
|
394
|
+
}
|
|
381
395
|
async close() {
|
|
382
396
|
this.#isClosing = true;
|
|
383
397
|
await this.endCommissioning();
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/MatterDevice.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * @license\n * Copyright 2022-2024 Matter.js Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * Important note: This file is part of the legacy matter-node (internal) API and should not be used anymore directly!\n * Please use the new API classes!\n * @deprecated\n */\n\nimport {\n DEVICE_ANNOUNCEMENT_DURATION_MS,\n DEVICE_ANNOUNCEMENT_INTERVAL_MS,\n} from \"./behavior/definitions/administrator-commissioning/AdministratorCommissioningConstants.js\";\nimport { CommissioningOptions } from \"./behavior/system/commissioning/CommissioningOptions.js\";\nimport { AdministratorCommissioning } from \"./cluster/definitions/AdministratorCommissioningCluster.js\";\n\nimport { Channel } from \"./common/Channel.js\";\nimport { FailsafeContext } from \"./common/FailsafeContext.js\";\nimport { InstanceBroadcaster } from \"./common/InstanceBroadcaster.js\";\nimport { Lifecycle } from \"./common/Lifecycle.js\";\nimport { InternalError, MatterFlowError } from \"./common/MatterError.js\";\nimport { Scanner } from \"./common/Scanner.js\";\nimport { TransportInterface } from \"./common/TransportInterface.js\";\nimport { Crypto } from \"./crypto/Crypto.js\";\nimport { FabricIndex } from \"./datatype/FabricIndex.js\";\nimport { NodeId } from \"./datatype/NodeId.js\";\nimport { Fabric } from \"./fabric/Fabric.js\";\nimport { FabricAction, FabricManager } from \"./fabric/FabricManager.js\";\nimport { Diagnostic } from \"./log/Diagnostic.js\";\nimport { Logger } from \"./log/Logger.js\";\nimport { NetInterface, isNetworkInterface } from \"./net/NetInterface.js\";\nimport { NetworkError } from \"./net/Network.js\";\nimport { ChannelManager } from \"./protocol/ChannelManager.js\";\nimport { ExchangeManager } from \"./protocol/ExchangeManager.js\";\nimport { ProtocolHandler } from \"./protocol/ProtocolHandler.js\";\nimport { StatusCode, StatusResponseError } from \"./protocol/interaction/StatusCode.js\";\nimport { SecureChannelProtocol } from \"./protocol/securechannel/SecureChannelProtocol.js\";\nimport { Session } from \"./session/Session.js\";\nimport { ResumptionRecord, SessionManager } from \"./session/SessionManager.js\";\nimport { PaseServer } from \"./session/pase/PaseServer.js\";\nimport { StorageContext } from \"./storage/StorageContext.js\";\nimport { Time, Timer } from \"./time/Time.js\";\nimport { AsyncConstruction, asyncNew } from \"./util/AsyncConstruction.js\";\nimport { ByteArray } from \"./util/ByteArray.js\";\nimport { Mutex } from \"./util/Mutex.js\";\n\nconst logger = Logger.get(\"MatterDevice\");\n\nexport class MatterDevice {\n private readonly scanners = new Array<Scanner>();\n private readonly broadcasters = new Array<InstanceBroadcaster>();\n private readonly transportInterfaces = new Array<TransportInterface | NetInterface>();\n private readonly channelManager: ChannelManager;\n private readonly secureChannelProtocol = new SecureChannelProtocol(() => this.endCommissioning());\n private activeCommissioningMode = AdministratorCommissioning.CommissioningWindowStatus.WindowNotOpen;\n private activeCommissioningEndCallback?: () => void;\n private announceInterval: Timer;\n private announcementStartedTime: number | null = null;\n #isClosing = false;\n readonly #exchangeManager;\n readonly #fabricManager: FabricManager;\n readonly #sessionManager: SessionManager<MatterDevice>;\n #failsafeContext?: FailsafeContext;\n\n // Currently we do not put much effort into synchronizing announcements as it probably isn't really necessary. But\n // this mutex prevents automated announcements from piling up and allows us to ensure announcements are complete\n // on close\n #announcementMutex = new Mutex(this);\n #construction: AsyncConstruction<MatterDevice>;\n\n get construction() {\n return this.#construction;\n }\n\n static async create(\n sessionStorage: StorageContext,\n fabricStorage: StorageContext,\n getCommissioningConfig: () => CommissioningOptions.Configuration,\n minimumCaseSessionsPerFabricAndNode = 3,\n commissioningChangedCallback: (fabricIndex: FabricIndex, fabricAction: FabricAction) => void,\n sessionChangedCallback: (fabricIndex: FabricIndex) => void,\n ) {\n return asyncNew(\n MatterDevice,\n sessionStorage,\n fabricStorage,\n getCommissioningConfig,\n minimumCaseSessionsPerFabricAndNode,\n commissioningChangedCallback,\n sessionChangedCallback,\n );\n }\n\n constructor(\n readonly sessionStorage: StorageContext,\n readonly fabricStorage: StorageContext,\n private readonly getCommissioningConfig: () => CommissioningOptions.Configuration,\n minimumCaseSessionsPerFabricAndNode: number,\n private readonly commissioningChangedCallback: (fabricIndex: FabricIndex, fabricAction: FabricAction) => void,\n private readonly sessionChangedCallback: (fabricIndex: FabricIndex) => void,\n ) {\n this.channelManager = new ChannelManager(minimumCaseSessionsPerFabricAndNode);\n\n this.#fabricManager = new FabricManager(fabricStorage);\n\n this.#fabricManager.events.deleted.on(async fabric => {\n const { fabricIndex, rootNodeId } = fabric;\n // When fabric is removed, also remove the resumption record\n await this.#sessionManager.removeResumptionRecord(rootNodeId);\n this.commissioningChangedCallback(fabricIndex, FabricAction.Removed);\n if (this.#fabricManager.getFabrics().length === 0) {\n // Last fabric got removed, so expire all announcements\n await this.expireAllFabricAnnouncements();\n }\n });\n this.#fabricManager.events.updated.on(({ fabricIndex }) =>\n this.commissioningChangedCallback(fabricIndex, FabricAction.Updated),\n );\n\n this.#sessionManager = new SessionManager(this, sessionStorage);\n\n this.#exchangeManager = new ExchangeManager<MatterDevice>(this.#sessionManager, this.channelManager);\n\n this.addProtocolHandler(this.secureChannelProtocol);\n\n this.announceInterval = Time.getPeriodicTimer(\"Server node announcement\", DEVICE_ANNOUNCEMENT_INTERVAL_MS, () =>\n // Announcement needs to await a previous announcement because otherwise in testing at least announcement\n // may crash if started simultaneously\n this.#announcementMutex.run(() => this.announce()),\n );\n\n this.#sessionManager.sessionOpened.on(session => {\n if (session.fabric) {\n this.sessionChangedCallback(session.fabric.fabricIndex);\n }\n });\n\n this.#sessionManager.sessionClosed.on(async session => {\n if (!session.closingAfterExchangeFinished) {\n // Delayed closing is executed when exchange is closed\n await this.exchangeManager.closeSession(session);\n }\n const currentFabric = session.fabric;\n if (currentFabric !== undefined) {\n this.sessionChangedCallback(currentFabric.fabricIndex);\n }\n if (this.isClosing) {\n return;\n }\n // When a session closes, announce existing fabrics again so that controller can detect the device again.\n // When session was closed and no fabric exist anymore then this is triggering a factory reset in upper layer\n // and it would be not good to announce a commissionable device and then reset that again with the factory reset\n if (this.#fabricManager.getFabrics().length > 0 || !currentFabric) {\n await this.startAnnouncement();\n }\n });\n\n this.#sessionManager.subscriptionsChanged.on(session => {\n const currentFabric = session.fabric;\n if (currentFabric !== undefined) {\n this.sessionChangedCallback(currentFabric.fabricIndex);\n }\n });\n\n this.#construction = AsyncConstruction(this, async () => {\n await this.#fabricManager.initFromStorage();\n\n // Attach added events delayed because initialization from storage would else trigger it\n this.#fabricManager.events.added.on(({ fabricIndex }) =>\n this.commissioningChangedCallback(fabricIndex, FabricAction.Added),\n );\n\n await this.#sessionManager.initFromStorage(this.#fabricManager.getFabrics());\n });\n }\n\n get fabricManager() {\n return this.#fabricManager;\n }\n\n get sessionManager() {\n return this.#sessionManager;\n }\n\n get exchangeManager() {\n return this.#exchangeManager;\n }\n\n get failsafeContext() {\n this.assertFailSafeArmed();\n return this.#failsafeContext as FailsafeContext;\n }\n\n get isClosing() {\n return this.#isClosing;\n }\n\n async beginTimed(failsafeContext: FailsafeContext) {\n await failsafeContext.construction;\n\n this.#failsafeContext = failsafeContext;\n\n this.#fabricManager.events.added.on(fabric => {\n const fabrics = this.#fabricManager.getFabrics();\n this.sendFabricAnnouncements(fabrics, true).catch(error =>\n logger.warn(`Error sending Fabric announcement for Index ${fabric.fabricIndex}`, error),\n );\n logger.info(\"Announce done\", Diagnostic.dict({ fabric: fabric.fabricId, fabricIndex: fabric.fabricIndex }));\n });\n\n failsafeContext.commissioned.on(async () => await this.endCommissioning());\n\n failsafeContext.construction.change.on(status => {\n if (status === Lifecycle.Status.Destroyed) {\n this.#failsafeContext = undefined;\n }\n });\n }\n\n assertFailSafeArmed(message?: string) {\n if (this.isFailsafeArmed()) return;\n throw new StatusResponseError(\n message ?? \"Failsafe timer needs to be armed to execute this action.\",\n StatusCode.FailsafeRequired,\n );\n }\n\n isFailsafeArmed() {\n return this.#failsafeContext !== undefined;\n }\n\n addScanner(scanner: Scanner) {\n this.scanners.push(scanner);\n return this;\n }\n\n hasBroadcaster(broadcaster: InstanceBroadcaster) {\n return this.broadcasters.includes(broadcaster);\n }\n\n addBroadcaster(broadcaster: InstanceBroadcaster) {\n this.broadcasters.push(broadcaster);\n return this;\n }\n\n async deleteBroadcaster(broadcaster: InstanceBroadcaster) {\n const pos = this.broadcasters.findIndex(b => b === broadcaster);\n if (pos !== -1) {\n this.broadcasters.splice(pos, 1);\n await broadcaster.expireAllAnnouncements();\n }\n }\n\n addTransportInterface(transport: TransportInterface) {\n this.exchangeManager.addTransportInterface(transport);\n this.transportInterfaces.push(transport);\n return this;\n }\n\n async deleteTransportInterface(transport: TransportInterface) {\n const pos = this.transportInterfaces.findIndex(t => t === transport);\n if (pos !== -1) {\n this.transportInterfaces.splice(pos, 1);\n await transport.close();\n }\n }\n\n hasProtocolHandler(protocolId: number) {\n return this.exchangeManager.hasProtocolHandler(protocolId);\n }\n\n addProtocolHandler(protocol: ProtocolHandler<MatterDevice>) {\n this.exchangeManager.addProtocolHandler(protocol);\n return this;\n }\n\n async start() {\n await this.startAnnouncement();\n }\n\n async startAnnouncement() {\n if (this.isClosing) return;\n if (this.announceInterval.isRunning) {\n this.announceInterval.stop();\n }\n this.announcementStartedTime = Time.nowMs();\n this.announceInterval.start();\n await this.announce();\n }\n\n async expireAllFabricAnnouncements() {\n for (const broadcaster of this.broadcasters) {\n await broadcaster.expireAllAnnouncements();\n }\n }\n\n async announce(announceOnce = false) {\n if (!announceOnce) {\n // Stop announcement if duration is reached\n if (\n this.announcementStartedTime !== null &&\n Time.nowMs() - this.announcementStartedTime > DEVICE_ANNOUNCEMENT_DURATION_MS\n ) {\n await this.endCommissioning();\n logger.debug(\"Announcement duration reached, stop announcing\");\n return;\n }\n if (this.activeCommissioningMode !== AdministratorCommissioning.CommissioningWindowStatus.WindowNotOpen) {\n // Re-Announce but do not re-set Fabrics\n for (const broadcaster of this.broadcasters) {\n await broadcaster.announce();\n }\n return;\n }\n }\n const fabrics = this.#fabricManager.getFabrics();\n if (fabrics.length) {\n let fabricsWithoutSessions = 0;\n for (const fabric of fabrics) {\n const session = this.#sessionManager.getSessionForNode(fabric, fabric.rootNodeId);\n if (session === undefined || !session.isSecure || session.numberOfActiveSubscriptions === 0) {\n fabricsWithoutSessions++;\n logger.debug(\"Announcing\", Diagnostic.dict({ fabric: fabric.fabricId }));\n }\n }\n for (const broadcaster of this.broadcasters) {\n await broadcaster.setFabrics(fabrics);\n if (fabricsWithoutSessions > 0) {\n await broadcaster.announce();\n }\n }\n } else {\n // No fabric paired yet, so announce as \"ready for commissioning\"\n // And expire operational Fabric announcements (if fabric got just deleted)\n await this.expireAllFabricAnnouncements();\n await this.allowBasicCommissioning();\n }\n }\n\n private async announceAsCommissionable(\n mode: AdministratorCommissioning.CommissioningWindowStatus,\n activeCommissioningEndCallback?: () => void,\n discriminator?: number,\n ) {\n if (this.activeCommissioningMode !== AdministratorCommissioning.CommissioningWindowStatus.WindowNotOpen) {\n throw new InternalError(\n `Commissioning window already open with different mode (${this.activeCommissioningMode})!`,\n );\n }\n if (this.activeCommissioningEndCallback !== undefined) {\n throw new InternalError(\"Commissioning window already open with different callback!\");\n }\n this.activeCommissioningMode = mode;\n if (activeCommissioningEndCallback !== undefined) {\n this.activeCommissioningEndCallback = activeCommissioningEndCallback;\n }\n // MDNS is sent in parallel\n // TODO - untracked promise\n this.sendCommissionableAnnouncement(mode, discriminator).catch(error =>\n logger.warn(\"Error sending announcement\", error),\n );\n }\n\n async sendCommissionableAnnouncement(\n mode: AdministratorCommissioning.CommissioningWindowStatus,\n discriminator?: number,\n ) {\n const commissioningConfig = this.getCommissioningConfig();\n for (const broadcaster of this.broadcasters) {\n await broadcaster.setCommissionMode(\n mode === AdministratorCommissioning.CommissioningWindowStatus.EnhancedWindowOpen ? 2 : 1,\n {\n ...commissioningConfig.productDescription,\n discriminator: discriminator ?? commissioningConfig.discriminator,\n },\n );\n }\n await this.startAnnouncement();\n }\n\n async getNextAvailableSessionId() {\n return this.#sessionManager.getNextAvailableSessionId();\n }\n\n findFabricFromDestinationId(destinationId: ByteArray, peerRandom: ByteArray) {\n return this.#fabricManager.findFabricFromDestinationId(destinationId, peerRandom);\n }\n\n async sendFabricAnnouncements(fabrics: Fabric[], expireCommissioningAnnouncement = false) {\n for (const broadcaster of this.broadcasters) {\n await broadcaster.setFabrics(fabrics, expireCommissioningAnnouncement);\n await broadcaster.announce();\n }\n }\n\n getFabricByIndex(fabricIndex: FabricIndex) {\n return this.#fabricManager.getFabrics().find(fabric => fabric.fabricIndex === fabricIndex);\n }\n\n initiateExchange(fabric: Fabric, nodeId: NodeId, protocolId: number) {\n return this.exchangeManager.initiateExchange(fabric, nodeId, protocolId);\n }\n\n findResumptionRecordById(resumptionId: ByteArray) {\n return this.#sessionManager.findResumptionRecordById(resumptionId);\n }\n\n async saveResumptionRecord(resumptionRecord: ResumptionRecord) {\n return this.#sessionManager.saveResumptionRecord(resumptionRecord);\n }\n\n getFabrics() {\n return this.#fabricManager.getFabrics();\n }\n\n isCommissioned() {\n return !!this.#fabricManager.getFabrics().length;\n }\n\n async allowEnhancedCommissioning(\n discriminator: number,\n paseServer: PaseServer,\n commissioningEndCallback: () => void,\n ) {\n if (this.activeCommissioningMode === AdministratorCommissioning.CommissioningWindowStatus.BasicWindowOpen) {\n throw new MatterFlowError(\n \"Basic commissioning window is already open! Can not set Enhanced commissioning mode.\",\n );\n }\n\n this.secureChannelProtocol.setPaseCommissioner(paseServer);\n await this.announceAsCommissionable(\n AdministratorCommissioning.CommissioningWindowStatus.EnhancedWindowOpen,\n commissioningEndCallback,\n discriminator,\n );\n }\n\n async allowBasicCommissioning(commissioningEndCallback?: () => void) {\n if (this.activeCommissioningMode === AdministratorCommissioning.CommissioningWindowStatus.EnhancedWindowOpen) {\n throw new MatterFlowError(\n \"Enhanced commissioning window is already open! Can not set Basic commissioning mode.\",\n );\n }\n\n this.secureChannelProtocol.setPaseCommissioner(\n await PaseServer.fromPin(this.getCommissioningConfig().passcode, {\n iterations: 1000,\n salt: Crypto.get().getRandomData(32),\n }),\n );\n\n await this.announceAsCommissionable(\n AdministratorCommissioning.CommissioningWindowStatus.BasicWindowOpen,\n commissioningEndCallback,\n );\n }\n\n async endCommissioning() {\n logger.debug(\"Commissioning mode ended, stop announcements.\");\n // Remove PASE responder when we close enhanced commissioning window or node is commissioned\n if (\n this.activeCommissioningMode === AdministratorCommissioning.CommissioningWindowStatus.EnhancedWindowOpen ||\n this.isCommissioned()\n ) {\n this.secureChannelProtocol.removePaseCommissioner();\n }\n this.activeCommissioningMode = AdministratorCommissioning.CommissioningWindowStatus.WindowNotOpen;\n this.announceInterval.stop();\n this.announcementStartedTime = null;\n if (this.activeCommissioningEndCallback !== undefined) {\n const activeCommissioningEndCallback = this.activeCommissioningEndCallback;\n this.activeCommissioningEndCallback = undefined;\n activeCommissioningEndCallback();\n }\n for (const broadcaster of this.broadcasters) {\n await broadcaster.expireCommissioningAnnouncement();\n }\n logger.info(\"All announcements expired\");\n }\n\n existsOpenPaseSession() {\n return !!this.#sessionManager.getPaseSession();\n }\n\n async findDevice(\n fabric: Fabric,\n nodeId: NodeId,\n timeOutSeconds = 5,\n ): Promise<undefined | { session: Session<MatterDevice>; channel: Channel<ByteArray> }> {\n // TODO: return the first not undefined answer or undefined\n const device = await this.scanners[0].findOperationalDevice(fabric, nodeId, timeOutSeconds);\n if (device === undefined) return undefined;\n const session = this.#sessionManager.getSessionForNode(fabric, nodeId);\n if (session === undefined) return undefined;\n // TODO: have the interface and scanner linked\n const networkInterface = this.transportInterfaces.find(netInterface => isNetworkInterface(netInterface));\n if (networkInterface === undefined || !isNetworkInterface(networkInterface)) {\n throw new NetworkError(\"No network interface found\");\n } // TODO meeehhh\n return { session, channel: await networkInterface.openChannel(device.addresses[0]) };\n }\n\n async close() {\n this.#isClosing = true;\n await this.endCommissioning();\n await this.#announcementMutex;\n for (const broadcaster of this.broadcasters) {\n await broadcaster.close();\n }\n if (this.#failsafeContext) {\n await this.#failsafeContext.close();\n this.#failsafeContext = undefined;\n }\n await this.exchangeManager.close();\n await this.#sessionManager.close();\n await this.channelManager.close();\n for (const transportInterface of this.transportInterfaces) {\n await transportInterface.close();\n }\n }\n\n getActiveSessionInformation() {\n return this.#sessionManager.getActiveSessionInformation();\n }\n}\n"],
|
|
5
|
-
"mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;AAYA;AAAA,EACI;AAAA,EACA;AAAA,OACG;AAEP,SAAS,kCAAkC;AAK3C,SAAS,iBAAiB;AAC1B,SAAS,eAAe,uBAAuB;AAG/C,SAAS,cAAc;AAIvB,SAAS,cAAc,qBAAqB;AAC5C,SAAS,kBAAkB;AAC3B,SAAS,cAAc;AACvB,SAAuB,0BAA0B;AACjD,SAAS,oBAAoB;AAC7B,SAAS,sBAAsB;AAC/B,SAAS,uBAAuB;AAEhC,SAAS,YAAY,2BAA2B;AAChD,SAAS,6BAA6B;AAEtC,SAA2B,sBAAsB;AACjD,SAAS,kBAAkB;AAE3B,SAAS,YAAmB;AAC5B,SAAS,mBAAmB,gBAAgB;AAE5C,SAAS,aAAa;AAEtB,MAAM,SAAS,OAAO,IAAI,cAAc;AAEjC,MAAM,aAAa;AAAA,
|
|
4
|
+
"sourcesContent": ["/**\n * @license\n * Copyright 2022-2024 Matter.js Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/**\n * Important note: This file is part of the legacy matter-node (internal) API and should not be used anymore directly!\n * Please use the new API classes!\n * @deprecated\n */\n\nimport {\n DEVICE_ANNOUNCEMENT_DURATION_MS,\n DEVICE_ANNOUNCEMENT_INTERVAL_MS,\n} from \"./behavior/definitions/administrator-commissioning/AdministratorCommissioningConstants.js\";\nimport { CommissioningOptions } from \"./behavior/system/commissioning/CommissioningOptions.js\";\nimport { AdministratorCommissioning } from \"./cluster/definitions/AdministratorCommissioningCluster.js\";\n\nimport { Channel } from \"./common/Channel.js\";\nimport { FailsafeContext } from \"./common/FailsafeContext.js\";\nimport { InstanceBroadcaster } from \"./common/InstanceBroadcaster.js\";\nimport { Lifecycle } from \"./common/Lifecycle.js\";\nimport { InternalError, MatterFlowError } from \"./common/MatterError.js\";\nimport { Scanner } from \"./common/Scanner.js\";\nimport { TransportInterface } from \"./common/TransportInterface.js\";\nimport { Crypto } from \"./crypto/Crypto.js\";\nimport { FabricIndex } from \"./datatype/FabricIndex.js\";\nimport { NodeId } from \"./datatype/NodeId.js\";\nimport { Fabric } from \"./fabric/Fabric.js\";\nimport { FabricAction, FabricManager } from \"./fabric/FabricManager.js\";\nimport { Diagnostic } from \"./log/Diagnostic.js\";\nimport { Logger } from \"./log/Logger.js\";\nimport { NetInterface, isNetworkInterface } from \"./net/NetInterface.js\";\nimport { NetworkError } from \"./net/Network.js\";\nimport { ChannelManager } from \"./protocol/ChannelManager.js\";\nimport { ExchangeManager } from \"./protocol/ExchangeManager.js\";\nimport { ProtocolHandler } from \"./protocol/ProtocolHandler.js\";\nimport { StatusCode, StatusResponseError } from \"./protocol/interaction/StatusCode.js\";\nimport { SecureChannelProtocol } from \"./protocol/securechannel/SecureChannelProtocol.js\";\nimport { Session } from \"./session/Session.js\";\nimport { ResumptionRecord, SessionManager } from \"./session/SessionManager.js\";\nimport { PaseServer } from \"./session/pase/PaseServer.js\";\nimport { StorageContext } from \"./storage/StorageContext.js\";\nimport { Time, Timer } from \"./time/Time.js\";\nimport { AsyncConstruction, asyncNew } from \"./util/AsyncConstruction.js\";\nimport { ByteArray } from \"./util/ByteArray.js\";\nimport { Mutex } from \"./util/Mutex.js\";\n\nconst logger = Logger.get(\"MatterDevice\");\n\nexport class MatterDevice {\n private readonly scanners = new Array<Scanner>();\n private readonly broadcasters = new Array<InstanceBroadcaster>();\n private readonly transportInterfaces = new Array<TransportInterface | NetInterface>();\n private readonly channelManager: ChannelManager;\n private readonly secureChannelProtocol = new SecureChannelProtocol(() => this.endCommissioning());\n private activeCommissioningMode = AdministratorCommissioning.CommissioningWindowStatus.WindowNotOpen;\n private activeCommissioningDiscriminator?: number;\n private activeCommissioningEndCallback?: () => void;\n private announceInterval: Timer;\n private announcementStartedTime: number | null = null;\n #isClosing = false;\n readonly #exchangeManager;\n readonly #fabricManager: FabricManager;\n readonly #sessionManager: SessionManager<MatterDevice>;\n #failsafeContext?: FailsafeContext;\n\n // Currently we do not put much effort into synchronizing announcements as it probably isn't really necessary. But\n // this mutex prevents automated announcements from piling up and allows us to ensure announcements are complete\n // on close\n #announcementMutex = new Mutex(this);\n #construction: AsyncConstruction<MatterDevice>;\n\n get construction() {\n return this.#construction;\n }\n\n static async create(\n sessionStorage: StorageContext,\n fabricStorage: StorageContext,\n getCommissioningConfig: () => CommissioningOptions.Configuration,\n minimumCaseSessionsPerFabricAndNode = 3,\n commissioningChangedCallback: (fabricIndex: FabricIndex, fabricAction: FabricAction) => void,\n sessionChangedCallback: (fabricIndex: FabricIndex) => void,\n ) {\n return asyncNew(\n MatterDevice,\n sessionStorage,\n fabricStorage,\n getCommissioningConfig,\n minimumCaseSessionsPerFabricAndNode,\n commissioningChangedCallback,\n sessionChangedCallback,\n );\n }\n\n constructor(\n readonly sessionStorage: StorageContext,\n readonly fabricStorage: StorageContext,\n private readonly getCommissioningConfig: () => CommissioningOptions.Configuration,\n minimumCaseSessionsPerFabricAndNode: number,\n private readonly commissioningChangedCallback: (fabricIndex: FabricIndex, fabricAction: FabricAction) => void,\n private readonly sessionChangedCallback: (fabricIndex: FabricIndex) => void,\n ) {\n this.channelManager = new ChannelManager(minimumCaseSessionsPerFabricAndNode);\n\n this.#fabricManager = new FabricManager(fabricStorage);\n\n this.#fabricManager.events.deleted.on(async fabric => {\n const { fabricIndex, rootNodeId } = fabric;\n // When fabric is removed, also remove the resumption record\n await this.#sessionManager.removeResumptionRecord(rootNodeId);\n this.commissioningChangedCallback(fabricIndex, FabricAction.Removed);\n if (this.#fabricManager.getFabrics().length === 0) {\n // Last fabric got removed, so expire all announcements\n await this.expireAllFabricAnnouncements();\n }\n // If a commissioning window is open then we reannounce this because it was ended as fabric got added\n this.reAnnounceAsCommissionable();\n });\n this.#fabricManager.events.updated.on(({ fabricIndex }) =>\n this.commissioningChangedCallback(fabricIndex, FabricAction.Updated),\n );\n\n this.#sessionManager = new SessionManager(this, sessionStorage);\n\n this.#exchangeManager = new ExchangeManager<MatterDevice>(this.#sessionManager, this.channelManager);\n\n this.addProtocolHandler(this.secureChannelProtocol);\n\n this.announceInterval = Time.getPeriodicTimer(\"Server node announcement\", DEVICE_ANNOUNCEMENT_INTERVAL_MS, () =>\n // Announcement needs to await a previous announcement because otherwise in testing at least announcement\n // may crash if started simultaneously\n this.#announcementMutex.run(() => this.announce()),\n );\n\n this.#sessionManager.sessionOpened.on(session => {\n if (session.fabric) {\n this.sessionChangedCallback(session.fabric.fabricIndex);\n }\n });\n\n this.#sessionManager.sessionClosed.on(async session => {\n if (!session.closingAfterExchangeFinished) {\n // Delayed closing is executed when exchange is closed\n await this.exchangeManager.closeSession(session);\n }\n\n const currentFabricIndex = session.fabric?.fabricIndex;\n if (currentFabricIndex !== undefined) {\n this.sessionChangedCallback(currentFabricIndex);\n }\n\n if (this.isClosing) {\n return;\n }\n\n // Verify if the session associated fabric still exists\n const existingSessionFabric =\n currentFabricIndex === undefined ? undefined : this.getFabricByIndex(currentFabricIndex)?.fabricIndex;\n\n // When a session closes, announce existing fabrics again so that controller can detect the device again.\n // When session was closed and no fabric exist anymore then this is triggering a factory reset in upper layer\n // and it would be not good to announce a commissionable device and then reset that again with the factory reset\n if (this.#fabricManager.getFabrics().length > 0 || session.isPase || !existingSessionFabric) {\n this.startAnnouncement().catch(error => logger.warn(`Error while announcing`, error));\n }\n });\n\n this.#sessionManager.subscriptionsChanged.on(session => {\n const currentFabric = session.fabric;\n if (currentFabric !== undefined) {\n this.sessionChangedCallback(currentFabric.fabricIndex);\n }\n });\n\n this.#construction = AsyncConstruction(this, async () => {\n await this.#fabricManager.initFromStorage();\n\n // Attach added events delayed because initialization from storage would else trigger it\n this.#fabricManager.events.added.on(({ fabricIndex }) =>\n this.commissioningChangedCallback(fabricIndex, FabricAction.Added),\n );\n\n await this.#sessionManager.initFromStorage(this.#fabricManager.getFabrics());\n });\n }\n\n get fabricManager() {\n return this.#fabricManager;\n }\n\n get sessionManager() {\n return this.#sessionManager;\n }\n\n get exchangeManager() {\n return this.#exchangeManager;\n }\n\n get failsafeContext() {\n this.assertFailSafeArmed();\n return this.#failsafeContext as FailsafeContext;\n }\n\n get isClosing() {\n return this.#isClosing;\n }\n\n async beginTimed(failsafeContext: FailsafeContext) {\n await failsafeContext.construction;\n\n this.#failsafeContext = failsafeContext;\n\n this.#fabricManager.events.added.on(fabric => {\n const fabrics = this.#fabricManager.getFabrics();\n this.sendFabricAnnouncements(fabrics, true).catch(error =>\n logger.warn(`Error sending Fabric announcement for Index ${fabric.fabricIndex}`, error),\n );\n logger.info(\"Announce done\", Diagnostic.dict({ fabric: fabric.fabricId, fabricIndex: fabric.fabricIndex }));\n });\n\n failsafeContext.commissioned.on(async () => await this.endCommissioning());\n\n failsafeContext.construction.change.on(status => {\n if (status === Lifecycle.Status.Destroyed) {\n this.#failsafeContext = undefined;\n }\n });\n }\n\n assertFailSafeArmed(message?: string) {\n if (this.isFailsafeArmed()) return;\n throw new StatusResponseError(\n message ?? \"Failsafe timer needs to be armed to execute this action.\",\n StatusCode.FailsafeRequired,\n );\n }\n\n isFailsafeArmed() {\n return this.#failsafeContext !== undefined;\n }\n\n addScanner(scanner: Scanner) {\n this.scanners.push(scanner);\n return this;\n }\n\n hasBroadcaster(broadcaster: InstanceBroadcaster) {\n return this.broadcasters.includes(broadcaster);\n }\n\n addBroadcaster(broadcaster: InstanceBroadcaster) {\n this.broadcasters.push(broadcaster);\n return this;\n }\n\n async deleteBroadcaster(broadcaster: InstanceBroadcaster) {\n const pos = this.broadcasters.findIndex(b => b === broadcaster);\n if (pos !== -1) {\n this.broadcasters.splice(pos, 1);\n await broadcaster.expireAllAnnouncements();\n }\n }\n\n addTransportInterface(transport: TransportInterface) {\n this.exchangeManager.addTransportInterface(transport);\n this.transportInterfaces.push(transport);\n return this;\n }\n\n async deleteTransportInterface(transport: TransportInterface) {\n const pos = this.transportInterfaces.findIndex(t => t === transport);\n if (pos !== -1) {\n this.transportInterfaces.splice(pos, 1);\n await transport.close();\n }\n }\n\n hasProtocolHandler(protocolId: number) {\n return this.exchangeManager.hasProtocolHandler(protocolId);\n }\n\n addProtocolHandler(protocol: ProtocolHandler<MatterDevice>) {\n this.exchangeManager.addProtocolHandler(protocol);\n return this;\n }\n\n async start() {\n await this.startAnnouncement();\n }\n\n async startAnnouncement() {\n if (this.isClosing) return;\n if (this.announceInterval.isRunning) {\n this.announceInterval.stop();\n }\n this.announcementStartedTime = Time.nowMs();\n this.announceInterval.start();\n await this.announce();\n }\n\n async expireAllFabricAnnouncements() {\n for (const broadcaster of this.broadcasters) {\n await broadcaster.expireFabricAnnouncement();\n }\n }\n\n async announce(announceOnce = false) {\n if (!announceOnce) {\n // Stop announcement if duration is reached\n if (\n this.announcementStartedTime !== null &&\n Time.nowMs() - this.announcementStartedTime > DEVICE_ANNOUNCEMENT_DURATION_MS\n ) {\n await this.endCommissioning();\n logger.debug(\"Announcement duration reached, stop announcing\");\n return;\n }\n if (this.activeCommissioningMode !== AdministratorCommissioning.CommissioningWindowStatus.WindowNotOpen) {\n // Re-Announce but do not re-set Fabrics\n for (const broadcaster of this.broadcasters) {\n await broadcaster.announce();\n }\n return;\n }\n }\n const fabrics = this.#fabricManager.getFabrics();\n if (fabrics.length) {\n let fabricsWithoutSessions = 0;\n for (const fabric of fabrics) {\n const session = this.#sessionManager.getSessionForNode(fabric, fabric.rootNodeId);\n if (session === undefined || !session.isSecure || session.numberOfActiveSubscriptions === 0) {\n fabricsWithoutSessions++;\n logger.debug(\"Announcing\", Diagnostic.dict({ fabric: fabric.fabricId }));\n }\n }\n for (const broadcaster of this.broadcasters) {\n await broadcaster.setFabrics(fabrics);\n if (\n fabricsWithoutSessions > 0 ||\n this.activeCommissioningMode !== AdministratorCommissioning.CommissioningWindowStatus.WindowNotOpen\n ) {\n await broadcaster.announce();\n }\n }\n } else {\n // No fabric paired yet, so announce as \"ready for commissioning\"\n // And expire operational Fabric announcements (if fabric got just deleted)\n await this.expireAllFabricAnnouncements();\n await this.allowBasicCommissioning();\n }\n }\n\n private async announceAsCommissionable(\n mode: AdministratorCommissioning.CommissioningWindowStatus,\n activeCommissioningEndCallback?: () => void,\n discriminator?: number,\n ) {\n if (this.activeCommissioningMode !== AdministratorCommissioning.CommissioningWindowStatus.WindowNotOpen) {\n throw new InternalError(\n `Commissioning window already open with different mode (${this.activeCommissioningMode})!`,\n );\n }\n if (this.activeCommissioningEndCallback !== undefined) {\n throw new InternalError(\"Commissioning window already open with different callback!\");\n }\n this.activeCommissioningMode = mode;\n this.activeCommissioningDiscriminator = discriminator;\n if (activeCommissioningEndCallback !== undefined) {\n this.activeCommissioningEndCallback = activeCommissioningEndCallback;\n }\n // MDNS is sent in parallel\n // TODO - untracked promise\n this.sendCommissionableAnnouncement(mode, discriminator).catch(error =>\n logger.warn(\"Error sending announcement\", error),\n );\n }\n\n reAnnounceAsCommissionable() {\n if (this.activeCommissioningMode === AdministratorCommissioning.CommissioningWindowStatus.WindowNotOpen) {\n return;\n }\n this.sendCommissionableAnnouncement(this.activeCommissioningMode, this.activeCommissioningDiscriminator).catch(\n error => logger.warn(\"Error sending announcement\", error),\n );\n }\n\n async sendCommissionableAnnouncement(\n mode: AdministratorCommissioning.CommissioningWindowStatus,\n discriminator?: number,\n ) {\n const commissioningConfig = this.getCommissioningConfig();\n for (const broadcaster of this.broadcasters) {\n await broadcaster.setCommissionMode(\n mode === AdministratorCommissioning.CommissioningWindowStatus.EnhancedWindowOpen ? 2 : 1,\n {\n ...commissioningConfig.productDescription,\n discriminator: discriminator ?? commissioningConfig.discriminator,\n },\n );\n }\n await this.startAnnouncement();\n }\n\n async getNextAvailableSessionId() {\n return this.#sessionManager.getNextAvailableSessionId();\n }\n\n findFabricFromDestinationId(destinationId: ByteArray, peerRandom: ByteArray) {\n return this.#fabricManager.findFabricFromDestinationId(destinationId, peerRandom);\n }\n\n async sendFabricAnnouncements(fabrics: Fabric[], expireCommissioningAnnouncement = false) {\n for (const broadcaster of this.broadcasters) {\n await broadcaster.setFabrics(fabrics, expireCommissioningAnnouncement);\n await broadcaster.announce();\n }\n }\n\n getFabricByIndex(fabricIndex: FabricIndex) {\n return this.#fabricManager.getFabrics().find(fabric => fabric.fabricIndex === fabricIndex);\n }\n\n initiateExchange(fabric: Fabric, nodeId: NodeId, protocolId: number) {\n return this.exchangeManager.initiateExchange(fabric, nodeId, protocolId);\n }\n\n findResumptionRecordById(resumptionId: ByteArray) {\n return this.#sessionManager.findResumptionRecordById(resumptionId);\n }\n\n async saveResumptionRecord(resumptionRecord: ResumptionRecord) {\n return this.#sessionManager.saveResumptionRecord(resumptionRecord);\n }\n\n getFabrics() {\n return this.#fabricManager.getFabrics();\n }\n\n isCommissioned() {\n return !!this.#fabricManager.getFabrics().length;\n }\n\n async allowEnhancedCommissioning(\n discriminator: number,\n paseServer: PaseServer,\n commissioningEndCallback: () => void,\n ) {\n if (this.activeCommissioningMode === AdministratorCommissioning.CommissioningWindowStatus.BasicWindowOpen) {\n throw new MatterFlowError(\n \"Basic commissioning window is already open! Can not set Enhanced commissioning mode.\",\n );\n }\n\n this.secureChannelProtocol.setPaseCommissioner(paseServer);\n await this.announceAsCommissionable(\n AdministratorCommissioning.CommissioningWindowStatus.EnhancedWindowOpen,\n commissioningEndCallback,\n discriminator,\n );\n }\n\n async allowBasicCommissioning(commissioningEndCallback?: () => void) {\n if (this.activeCommissioningMode === AdministratorCommissioning.CommissioningWindowStatus.EnhancedWindowOpen) {\n throw new MatterFlowError(\n \"Enhanced commissioning window is already open! Can not set Basic commissioning mode.\",\n );\n }\n\n this.secureChannelProtocol.setPaseCommissioner(\n await PaseServer.fromPin(this.getCommissioningConfig().passcode, {\n iterations: 1000,\n salt: Crypto.get().getRandomData(32),\n }),\n );\n\n await this.announceAsCommissionable(\n AdministratorCommissioning.CommissioningWindowStatus.BasicWindowOpen,\n commissioningEndCallback,\n );\n }\n\n async endCommissioning() {\n logger.debug(\"Commissioning mode ended, stop announcements.\");\n // Remove PASE responder when we close enhanced commissioning window or node is commissioned\n if (\n this.activeCommissioningMode === AdministratorCommissioning.CommissioningWindowStatus.EnhancedWindowOpen ||\n this.isCommissioned()\n ) {\n this.secureChannelProtocol.removePaseCommissioner();\n }\n this.activeCommissioningMode = AdministratorCommissioning.CommissioningWindowStatus.WindowNotOpen;\n this.announceInterval.stop();\n this.announcementStartedTime = null;\n if (this.activeCommissioningEndCallback !== undefined) {\n const activeCommissioningEndCallback = this.activeCommissioningEndCallback;\n this.activeCommissioningEndCallback = undefined;\n activeCommissioningEndCallback();\n }\n for (const broadcaster of this.broadcasters) {\n await broadcaster.expireCommissioningAnnouncement();\n }\n logger.info(\"All announcements expired\");\n }\n\n existsOpenPaseSession() {\n return !!this.#sessionManager.getPaseSession();\n }\n\n async findDevice(\n fabric: Fabric,\n nodeId: NodeId,\n timeOutSeconds = 5,\n ): Promise<undefined | { session: Session<MatterDevice>; channel: Channel<ByteArray> }> {\n // TODO: return the first not undefined answer or undefined\n const device = await this.scanners[0].findOperationalDevice(fabric, nodeId, timeOutSeconds);\n if (device === undefined) return undefined;\n const session = this.#sessionManager.getSessionForNode(fabric, nodeId);\n if (session === undefined) return undefined;\n // TODO: have the interface and scanner linked\n const networkInterface = this.transportInterfaces.find(netInterface => isNetworkInterface(netInterface));\n if (networkInterface === undefined || !isNetworkInterface(networkInterface)) {\n throw new NetworkError(\"No network interface found\");\n } // TODO meeehhh\n return { session, channel: await networkInterface.openChannel(device.addresses[0]) };\n }\n\n async clearSubscriptionsForNode(fabricIndex: FabricIndex, peerNodeId: NodeId, flushSubscriptions?: boolean) {\n await this.#sessionManager.clearSubscriptionsForNode(fabricIndex, peerNodeId, flushSubscriptions);\n }\n\n async close() {\n this.#isClosing = true;\n await this.endCommissioning();\n await this.#announcementMutex;\n for (const broadcaster of this.broadcasters) {\n await broadcaster.close();\n }\n if (this.#failsafeContext) {\n await this.#failsafeContext.close();\n this.#failsafeContext = undefined;\n }\n await this.exchangeManager.close();\n await this.#sessionManager.close();\n await this.channelManager.close();\n for (const transportInterface of this.transportInterfaces) {\n await transportInterface.close();\n }\n }\n\n getActiveSessionInformation() {\n return this.#sessionManager.getActiveSessionInformation();\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -94,7 +94,7 @@ function dataEnforcerFor(schema) {
|
|
|
94
94
|
);
|
|
95
95
|
}
|
|
96
96
|
if (location?.owningFabric && location.owningFabric !== session.fabric) {
|
|
97
|
-
throw new
|
|
97
|
+
throw new ReadError(
|
|
98
98
|
location,
|
|
99
99
|
"Permission denied: Owning/accessing fabric mismatch",
|
|
100
100
|
StatusCode.UnsupportedAccess
|
|
@@ -110,7 +110,7 @@ function dataEnforcerFor(schema) {
|
|
|
110
110
|
if (session.fabric === void 0) {
|
|
111
111
|
return false;
|
|
112
112
|
}
|
|
113
|
-
if (
|
|
113
|
+
if (location?.owningFabric && location.owningFabric !== session.fabric) {
|
|
114
114
|
return false;
|
|
115
115
|
}
|
|
116
116
|
return wrappedMayRead(session, location);
|