@project-chip/matter.js 0.9.3 → 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 -1
- package/dist/cjs/MatterDevice.d.ts.map +1 -1
- package/dist/cjs/MatterDevice.js +20 -9
- 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 +41 -36
- 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/SessionManager.d.ts +2 -1
- package/dist/cjs/session/SessionManager.d.ts.map +1 -1
- package/dist/cjs/session/SessionManager.js +2 -2
- 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 -1
- package/dist/esm/MatterDevice.d.ts.map +1 -1
- package/dist/esm/MatterDevice.js +20 -9
- 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 +41 -36
- 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/SessionManager.d.ts +2 -1
- package/dist/esm/session/SessionManager.d.ts.map +1 -1
- package/dist/esm/session/SessionManager.js +2 -2
- 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 +32 -9
- 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 +50 -51
- package/src/protocol/interaction/SubscriptionHandler.ts +215 -92
- package/src/session/SessionManager.ts +3 -2
- 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/tlv/TlvSchema.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * @license\n * Copyright 2022-2024 Matter.js Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { Schema } from \"../schema/Schema.js\";\nimport { ByteArray, Endian } from \"../util/ByteArray.js\";\nimport { DataReader } from \"../util/DataReader.js\";\nimport { DataWriter } from \"../util/DataWriter.js\";\nimport { TlvCodec, TlvTag, TlvToPrimitive, TlvTypeLength } from \"./TlvCodec.js\";\n\nexport abstract class TlvSchema<T> extends Schema<T, ByteArray> implements TlvSchema<T> {\n override decodeInternal(encoded: ByteArray): T {\n return this.decodeTlvInternal(new TlvByteArrayReader(encoded)).value;\n }\n\n override encodeInternal(value: T): ByteArray {\n const writer = new TlvByteArrayWriter();\n this.encodeTlvInternal(writer, value);\n return writer.toByteArray();\n }\n\n encodeTlv(value: T,
|
|
5
|
-
"mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;AAMA,SAAS,cAAc;AACvB,SAAoB,cAAc;AAClC,SAAS,kBAAkB;AAC3B,SAAS,kBAAkB;AAC3B,SAAS,gBAAuD;
|
|
4
|
+
"sourcesContent": ["/**\n * @license\n * Copyright 2022-2024 Matter.js Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { Schema } from \"../schema/Schema.js\";\nimport { ByteArray, Endian } from \"../util/ByteArray.js\";\nimport { DataReader } from \"../util/DataReader.js\";\nimport { DataWriter } from \"../util/DataWriter.js\";\nimport { TlvCodec, TlvTag, TlvToPrimitive, TlvTypeLength } from \"./TlvCodec.js\";\n\nexport type TlvEncodingOptions = {\n /**\n * When true, the fabricIndex field will be excluded from the TLV encoding for list entries.\n * This flag must not be set together with the following flag.\n */\n forWriteInteraction?: boolean;\n\n /**\n * When true, mandatory field validation is skipped when encoding TLV for list entries.\n * This flag must not be set together with the former flag.\n */\n allowMissingFieldsForNonFabricFilteredRead?: boolean;\n};\n\nexport abstract class TlvSchema<T> extends Schema<T, ByteArray> implements TlvSchema<T> {\n override decodeInternal(encoded: ByteArray): T {\n return this.decodeTlvInternal(new TlvByteArrayReader(encoded)).value;\n }\n\n override encodeInternal(value: T): ByteArray {\n const writer = new TlvByteArrayWriter();\n this.encodeTlvInternal(writer, value);\n return writer.toByteArray();\n }\n\n encodeTlv(value: T, options?: TlvEncodingOptions): TlvStream {\n const writer = new TlvArrayWriter();\n this.encodeTlvInternal(writer, value, undefined, options);\n return writer.toTlvArray();\n }\n\n decodeTlv(encoded: TlvStream): T {\n return this.decodeTlvInternal(new TlvArrayReader(encoded)).value;\n }\n\n decodeTlvInternal(reader: TlvReader): { value: T; tag?: TlvTag } {\n const { tag, typeLength } = reader.readTagType();\n return { tag, value: this.decodeTlvInternalValue(reader, typeLength) };\n }\n\n abstract decodeTlvInternalValue(reader: TlvReader, typeLength: TlvTypeLength): T;\n\n abstract encodeTlvInternal(writer: TlvWriter, value: T, tag?: TlvTag, options?: TlvEncodingOptions): void;\n\n injectField(value: T, _fieldId: number, _fieldValue: any, _injectChecker: (fieldValue: any) => boolean): T {\n return value;\n }\n\n removeField(value: T, _fieldId: number, _removeChecker: (fieldValue: any) => boolean): T {\n return value;\n }\n}\n\nexport type TlvStream = TlvElement<any>[];\n\nexport type TlvElement<T extends TlvTypeLength> = {\n tag?: TlvTag;\n typeLength: T;\n value?: TlvToPrimitive[T[\"type\"]];\n};\n\nexport class TlvArrayWriter implements TlvWriter {\n private readonly tlvArray = new Array<TlvElement<any>>();\n\n writeTag(typeLength: TlvTypeLength, tag?: TlvTag) {\n this.tlvArray.push({ tag, typeLength });\n }\n\n writePrimitive<T extends TlvTypeLength>(_typeLength: T, value: TlvToPrimitive[T[\"type\"]]) {\n this.tlvArray[this.tlvArray.length - 1].value = value;\n }\n\n toTlvArray() {\n return this.tlvArray;\n }\n}\n\nexport class TlvArrayReader implements TlvReader {\n private index = -1;\n\n constructor(private readonly tlvElements: TlvElement<any>[]) {}\n\n readTagType() {\n this.index++;\n return this.tlvElements[this.index];\n }\n\n readPrimitive<T extends TlvTypeLength, V = TlvToPrimitive[T[\"type\"]]>(_typeLength: T): V {\n return this.tlvElements[this.index].value;\n }\n}\n\n/** Type defined by the TLV schema. */\nexport type TypeFromSchema<S extends TlvSchema<any>> = S extends TlvSchema<infer T> ? T : never;\n\nexport interface TlvReader {\n readTagType(): { tag?: TlvTag; typeLength: TlvTypeLength };\n\n readPrimitive<T extends TlvTypeLength, V = TlvToPrimitive[T[\"type\"]]>(typeLength: T): V;\n}\n\nexport interface TlvWriter {\n writeTag(typeLength: TlvTypeLength, tag?: TlvTag): void;\n\n writePrimitive<T extends TlvTypeLength>(typeLength: T, value: TlvToPrimitive[T[\"type\"]]): void;\n}\n\nexport class TlvByteArrayWriter implements TlvWriter {\n private readonly writer = new DataWriter(Endian.Little);\n\n writeTag(typeLength: TlvTypeLength, tag?: TlvTag) {\n TlvCodec.writeTag(this.writer, typeLength, tag);\n }\n\n writePrimitive<T extends TlvTypeLength>(typeLength: T, value: TlvToPrimitive[T[\"type\"]]) {\n TlvCodec.writePrimitive(this.writer, typeLength, value);\n }\n\n toByteArray() {\n return this.writer.toByteArray();\n }\n}\n\nexport class TlvByteArrayReader implements TlvReader {\n private readonly reader: DataReader<Endian.Little>;\n\n constructor(byteArray: ByteArray) {\n this.reader = new DataReader(byteArray, Endian.Little);\n }\n\n readTagType() {\n return TlvCodec.readTagType(this.reader);\n }\n\n readPrimitive<T extends TlvTypeLength, V = TlvToPrimitive[T[\"type\"]]>(typeLength: T): V {\n return TlvCodec.readPrimitive(this.reader, typeLength);\n }\n}\n"],
|
|
5
|
+
"mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;AAMA,SAAS,cAAc;AACvB,SAAoB,cAAc;AAClC,SAAS,kBAAkB;AAC3B,SAAS,kBAAkB;AAC3B,SAAS,gBAAuD;AAgBzD,MAAe,kBAAqB,OAA6C;AAAA,EAC3E,eAAe,SAAuB;AAC3C,WAAO,KAAK,kBAAkB,IAAI,mBAAmB,OAAO,CAAC,EAAE;AAAA,EACnE;AAAA,EAES,eAAe,OAAqB;AACzC,UAAM,SAAS,IAAI,mBAAmB;AACtC,SAAK,kBAAkB,QAAQ,KAAK;AACpC,WAAO,OAAO,YAAY;AAAA,EAC9B;AAAA,EAEA,UAAU,OAAU,SAAyC;AACzD,UAAM,SAAS,IAAI,eAAe;AAClC,SAAK,kBAAkB,QAAQ,OAAO,QAAW,OAAO;AACxD,WAAO,OAAO,WAAW;AAAA,EAC7B;AAAA,EAEA,UAAU,SAAuB;AAC7B,WAAO,KAAK,kBAAkB,IAAI,eAAe,OAAO,CAAC,EAAE;AAAA,EAC/D;AAAA,EAEA,kBAAkB,QAA+C;AAC7D,UAAM,EAAE,KAAK,WAAW,IAAI,OAAO,YAAY;AAC/C,WAAO,EAAE,KAAK,OAAO,KAAK,uBAAuB,QAAQ,UAAU,EAAE;AAAA,EACzE;AAAA,EAMA,YAAY,OAAU,UAAkB,aAAkB,gBAAiD;AACvG,WAAO;AAAA,EACX;AAAA,EAEA,YAAY,OAAU,UAAkB,gBAAiD;AACrF,WAAO;AAAA,EACX;AACJ;AAUO,MAAM,eAAoC;AAAA,EAA1C;AACH,SAAiB,WAAW,IAAI,MAAuB;AAAA;AAAA,EAEvD,SAAS,YAA2B,KAAc;AAC9C,SAAK,SAAS,KAAK,EAAE,KAAK,WAAW,CAAC;AAAA,EAC1C;AAAA,EAEA,eAAwC,aAAgB,OAAkC;AACtF,SAAK,SAAS,KAAK,SAAS,SAAS,CAAC,EAAE,QAAQ;AAAA,EACpD;AAAA,EAEA,aAAa;AACT,WAAO,KAAK;AAAA,EAChB;AACJ;AAEO,MAAM,eAAoC;AAAA,EAG7C,YAA6B,aAAgC;AAAhC;AAF7B,SAAQ,QAAQ;AAAA,EAE8C;AAAA,EAE9D,cAAc;AACV,SAAK;AACL,WAAO,KAAK,YAAY,KAAK,KAAK;AAAA,EACtC;AAAA,EAEA,cAAsE,aAAmB;AACrF,WAAO,KAAK,YAAY,KAAK,KAAK,EAAE;AAAA,EACxC;AACJ;AAiBO,MAAM,mBAAwC;AAAA,EAA9C;AACH,SAAiB,SAAS,IAAI,WAAW,OAAO,MAAM;AAAA;AAAA,EAEtD,SAAS,YAA2B,KAAc;AAC9C,aAAS,SAAS,KAAK,QAAQ,YAAY,GAAG;AAAA,EAClD;AAAA,EAEA,eAAwC,YAAe,OAAkC;AACrF,aAAS,eAAe,KAAK,QAAQ,YAAY,KAAK;AAAA,EAC1D;AAAA,EAEA,cAAc;AACV,WAAO,KAAK,OAAO,YAAY;AAAA,EACnC;AACJ;AAEO,MAAM,mBAAwC;AAAA,EAGjD,YAAY,WAAsB;AAC9B,SAAK,SAAS,IAAI,WAAW,WAAW,OAAO,MAAM;AAAA,EACzD;AAAA,EAEA,cAAc;AACV,WAAO,SAAS,YAAY,KAAK,MAAM;AAAA,EAC3C;AAAA,EAEA,cAAsE,YAAkB;AACpF,WAAO,SAAS,cAAc,KAAK,QAAQ,UAAU;AAAA,EACzD;AACJ;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -4,14 +4,14 @@
|
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
|
5
5
|
*/
|
|
6
6
|
import { TlvTag, TlvTypeLength } from "./TlvCodec.js";
|
|
7
|
-
import { TlvReader, TlvSchema, TlvWriter } from "./TlvSchema.js";
|
|
7
|
+
import { TlvEncodingOptions, TlvReader, TlvSchema, TlvWriter } from "./TlvSchema.js";
|
|
8
8
|
export declare class TlvWrapper<O, T> extends TlvSchema<O> {
|
|
9
9
|
protected readonly underlyingSchema: TlvSchema<T>;
|
|
10
10
|
protected readonly wrap: (object: O) => T;
|
|
11
11
|
private readonly unwrap;
|
|
12
12
|
constructor(underlyingSchema: TlvSchema<T>, wrap: (object: O) => T, unwrap: (value: T) => O);
|
|
13
13
|
decodeTlvInternalValue(reader: TlvReader, typeLength: TlvTypeLength): O;
|
|
14
|
-
encodeTlvInternal(writer: TlvWriter, value: O, tag?: TlvTag,
|
|
14
|
+
encodeTlvInternal(writer: TlvWriter, value: O, tag?: TlvTag, options?: TlvEncodingOptions): void;
|
|
15
15
|
validate(value: O): void;
|
|
16
16
|
}
|
|
17
17
|
//# sourceMappingURL=TlvWrapper.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TlvWrapper.d.ts","sourceRoot":"","sources":["../../../src/tlv/TlvWrapper.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"TlvWrapper.d.ts","sourceRoot":"","sources":["../../../src/tlv/TlvWrapper.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAErF,qBAAa,UAAU,CAAC,CAAC,EAAE,CAAC,CAAE,SAAQ,SAAS,CAAC,CAAC,CAAC;IAE1C,SAAS,CAAC,QAAQ,CAAC,gBAAgB,EAAE,SAAS,CAAC,CAAC,CAAC;IACjD,SAAS,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC;IACzC,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAFJ,gBAAgB,EAAE,SAAS,CAAC,CAAC,CAAC,EAC9B,IAAI,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,EACxB,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC;IAKnC,sBAAsB,CAAC,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,aAAa,GAAG,CAAC;IAIvE,iBAAiB,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,kBAAkB,GAAG,IAAI;IAIhG,QAAQ,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI;CAGpC"}
|
|
@@ -14,8 +14,8 @@ class TlvWrapper extends TlvSchema {
|
|
|
14
14
|
decodeTlvInternalValue(reader, typeLength) {
|
|
15
15
|
return this.unwrap(this.underlyingSchema.decodeTlvInternalValue(reader, typeLength));
|
|
16
16
|
}
|
|
17
|
-
encodeTlvInternal(writer, value, tag,
|
|
18
|
-
this.underlyingSchema.encodeTlvInternal(writer, this.wrap(value), tag,
|
|
17
|
+
encodeTlvInternal(writer, value, tag, options) {
|
|
18
|
+
this.underlyingSchema.encodeTlvInternal(writer, this.wrap(value), tag, options);
|
|
19
19
|
}
|
|
20
20
|
validate(value) {
|
|
21
21
|
this.underlyingSchema.validate(this.wrap(value));
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/tlv/TlvWrapper.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * @license\n * Copyright 2022-2024 Matter.js Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { TlvTag, TlvTypeLength } from \"./TlvCodec.js\";\nimport { TlvReader, TlvSchema, TlvWriter } from \"./TlvSchema.js\";\n\nexport class TlvWrapper<O, T> extends TlvSchema<O> {\n constructor(\n protected readonly underlyingSchema: TlvSchema<T>,\n protected readonly wrap: (object: O) => T,\n private readonly unwrap: (value: T) => O,\n ) {\n super();\n }\n\n override decodeTlvInternalValue(reader: TlvReader, typeLength: TlvTypeLength): O {\n return this.unwrap(this.underlyingSchema.decodeTlvInternalValue(reader, typeLength));\n }\n\n override encodeTlvInternal(writer: TlvWriter, value: O, tag?: TlvTag,
|
|
5
|
-
"mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;AAOA,
|
|
4
|
+
"sourcesContent": ["/**\n * @license\n * Copyright 2022-2024 Matter.js Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { TlvTag, TlvTypeLength } from \"./TlvCodec.js\";\nimport { TlvEncodingOptions, TlvReader, TlvSchema, TlvWriter } from \"./TlvSchema.js\";\n\nexport class TlvWrapper<O, T> extends TlvSchema<O> {\n constructor(\n protected readonly underlyingSchema: TlvSchema<T>,\n protected readonly wrap: (object: O) => T,\n private readonly unwrap: (value: T) => O,\n ) {\n super();\n }\n\n override decodeTlvInternalValue(reader: TlvReader, typeLength: TlvTypeLength): O {\n return this.unwrap(this.underlyingSchema.decodeTlvInternalValue(reader, typeLength));\n }\n\n override encodeTlvInternal(writer: TlvWriter, value: O, tag?: TlvTag, options?: TlvEncodingOptions): void {\n this.underlyingSchema.encodeTlvInternal(writer, this.wrap(value), tag, options);\n }\n\n override validate(value: O): void {\n this.underlyingSchema.validate(this.wrap(value));\n }\n}\n"],
|
|
5
|
+
"mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;AAOA,SAAwC,iBAA4B;AAE7D,MAAM,mBAAyB,UAAa;AAAA,EAC/C,YACuB,kBACA,MACF,QACnB;AACE,UAAM;AAJa;AACA;AACF;AAAA,EAGrB;AAAA,EAES,uBAAuB,QAAmB,YAA8B;AAC7E,WAAO,KAAK,OAAO,KAAK,iBAAiB,uBAAuB,QAAQ,UAAU,CAAC;AAAA,EACvF;AAAA,EAES,kBAAkB,QAAmB,OAAU,KAAc,SAAoC;AACtG,SAAK,iBAAiB,kBAAkB,QAAQ,KAAK,KAAK,KAAK,GAAG,KAAK,OAAO;AAAA,EAClF;AAAA,EAES,SAAS,OAAgB;AAC9B,SAAK,iBAAiB,SAAS,KAAK,KAAK,KAAK,CAAC;AAAA,EACnD;AACJ;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@project-chip/matter.js",
|
|
3
|
-
"version": "0.9.
|
|
3
|
+
"version": "0.9.4",
|
|
4
4
|
"description": "Matter protocol in pure js",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"iot",
|
|
@@ -36,7 +36,7 @@
|
|
|
36
36
|
"@noble/curves": "^1.4.0"
|
|
37
37
|
},
|
|
38
38
|
"devDependencies": {
|
|
39
|
-
"@project-chip/matter.js-tools": "0.9.
|
|
39
|
+
"@project-chip/matter.js-tools": "0.9.4",
|
|
40
40
|
"@types/chai": "^4.3.12",
|
|
41
41
|
"@types/mocha": "^10.0.6",
|
|
42
42
|
"@types/wtfnode": "^0.7.3",
|
|
@@ -169,5 +169,5 @@
|
|
|
169
169
|
"publishConfig": {
|
|
170
170
|
"access": "public"
|
|
171
171
|
},
|
|
172
|
-
"gitHead": "
|
|
172
|
+
"gitHead": "eb59507fb8188184dd65c593b093e8d21b813ce7"
|
|
173
173
|
}
|
|
@@ -549,7 +549,6 @@ export class CommissioningServer extends MatterNode {
|
|
|
549
549
|
|
|
550
550
|
this.interactionServer = new LegacyInteractionServer({
|
|
551
551
|
endpointStructure: this.endpointStructure,
|
|
552
|
-
eventHandler: this.eventHandler,
|
|
553
552
|
subscriptionOptions: {
|
|
554
553
|
maxIntervalSeconds: this.options.subscriptionMaxIntervalSeconds,
|
|
555
554
|
minIntervalSeconds: this.options.subscriptionMinIntervalSeconds,
|
package/src/MatterDevice.ts
CHANGED
|
@@ -56,6 +56,7 @@ export class MatterDevice {
|
|
|
56
56
|
private readonly channelManager: ChannelManager;
|
|
57
57
|
private readonly secureChannelProtocol = new SecureChannelProtocol(() => this.endCommissioning());
|
|
58
58
|
private activeCommissioningMode = AdministratorCommissioning.CommissioningWindowStatus.WindowNotOpen;
|
|
59
|
+
private activeCommissioningDiscriminator?: number;
|
|
59
60
|
private activeCommissioningEndCallback?: () => void;
|
|
60
61
|
private announceInterval: Timer;
|
|
61
62
|
private announcementStartedTime: number | null = null;
|
|
@@ -115,6 +116,8 @@ export class MatterDevice {
|
|
|
115
116
|
// Last fabric got removed, so expire all announcements
|
|
116
117
|
await this.expireAllFabricAnnouncements();
|
|
117
118
|
}
|
|
119
|
+
// If a commissioning window is open then we reannounce this because it was ended as fabric got added
|
|
120
|
+
this.reAnnounceAsCommissionable();
|
|
118
121
|
});
|
|
119
122
|
this.#fabricManager.events.updated.on(({ fabricIndex }) =>
|
|
120
123
|
this.commissioningChangedCallback(fabricIndex, FabricAction.Updated),
|
|
@@ -143,18 +146,25 @@ export class MatterDevice {
|
|
|
143
146
|
// Delayed closing is executed when exchange is closed
|
|
144
147
|
await this.exchangeManager.closeSession(session);
|
|
145
148
|
}
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
+
|
|
150
|
+
const currentFabricIndex = session.fabric?.fabricIndex;
|
|
151
|
+
if (currentFabricIndex !== undefined) {
|
|
152
|
+
this.sessionChangedCallback(currentFabricIndex);
|
|
149
153
|
}
|
|
154
|
+
|
|
150
155
|
if (this.isClosing) {
|
|
151
156
|
return;
|
|
152
157
|
}
|
|
158
|
+
|
|
159
|
+
// Verify if the session associated fabric still exists
|
|
160
|
+
const existingSessionFabric =
|
|
161
|
+
currentFabricIndex === undefined ? undefined : this.getFabricByIndex(currentFabricIndex)?.fabricIndex;
|
|
162
|
+
|
|
153
163
|
// When a session closes, announce existing fabrics again so that controller can detect the device again.
|
|
154
164
|
// When session was closed and no fabric exist anymore then this is triggering a factory reset in upper layer
|
|
155
165
|
// and it would be not good to announce a commissionable device and then reset that again with the factory reset
|
|
156
|
-
if (this.#fabricManager.getFabrics().length > 0 || !
|
|
157
|
-
|
|
166
|
+
if (this.#fabricManager.getFabrics().length > 0 || session.isPase || !existingSessionFabric) {
|
|
167
|
+
this.startAnnouncement().catch(error => logger.warn(`Error while announcing`, error));
|
|
158
168
|
}
|
|
159
169
|
});
|
|
160
170
|
|
|
@@ -293,7 +303,7 @@ export class MatterDevice {
|
|
|
293
303
|
|
|
294
304
|
async expireAllFabricAnnouncements() {
|
|
295
305
|
for (const broadcaster of this.broadcasters) {
|
|
296
|
-
await broadcaster.
|
|
306
|
+
await broadcaster.expireFabricAnnouncement();
|
|
297
307
|
}
|
|
298
308
|
}
|
|
299
309
|
|
|
@@ -328,7 +338,10 @@ export class MatterDevice {
|
|
|
328
338
|
}
|
|
329
339
|
for (const broadcaster of this.broadcasters) {
|
|
330
340
|
await broadcaster.setFabrics(fabrics);
|
|
331
|
-
if (
|
|
341
|
+
if (
|
|
342
|
+
fabricsWithoutSessions > 0 ||
|
|
343
|
+
this.activeCommissioningMode !== AdministratorCommissioning.CommissioningWindowStatus.WindowNotOpen
|
|
344
|
+
) {
|
|
332
345
|
await broadcaster.announce();
|
|
333
346
|
}
|
|
334
347
|
}
|
|
@@ -354,6 +367,7 @@ export class MatterDevice {
|
|
|
354
367
|
throw new InternalError("Commissioning window already open with different callback!");
|
|
355
368
|
}
|
|
356
369
|
this.activeCommissioningMode = mode;
|
|
370
|
+
this.activeCommissioningDiscriminator = discriminator;
|
|
357
371
|
if (activeCommissioningEndCallback !== undefined) {
|
|
358
372
|
this.activeCommissioningEndCallback = activeCommissioningEndCallback;
|
|
359
373
|
}
|
|
@@ -364,6 +378,15 @@ export class MatterDevice {
|
|
|
364
378
|
);
|
|
365
379
|
}
|
|
366
380
|
|
|
381
|
+
reAnnounceAsCommissionable() {
|
|
382
|
+
if (this.activeCommissioningMode === AdministratorCommissioning.CommissioningWindowStatus.WindowNotOpen) {
|
|
383
|
+
return;
|
|
384
|
+
}
|
|
385
|
+
this.sendCommissionableAnnouncement(this.activeCommissioningMode, this.activeCommissioningDiscriminator).catch(
|
|
386
|
+
error => logger.warn("Error sending announcement", error),
|
|
387
|
+
);
|
|
388
|
+
}
|
|
389
|
+
|
|
367
390
|
async sendCommissionableAnnouncement(
|
|
368
391
|
mode: AdministratorCommissioning.CommissioningWindowStatus,
|
|
369
392
|
discriminator?: number,
|
|
@@ -504,8 +527,8 @@ export class MatterDevice {
|
|
|
504
527
|
return { session, channel: await networkInterface.openChannel(device.addresses[0]) };
|
|
505
528
|
}
|
|
506
529
|
|
|
507
|
-
async clearSubscriptionsForNode(peerNodeId: NodeId, flushSubscriptions?: boolean) {
|
|
508
|
-
await this.#sessionManager.clearSubscriptionsForNode(peerNodeId, flushSubscriptions);
|
|
530
|
+
async clearSubscriptionsForNode(fabricIndex: FabricIndex, peerNodeId: NodeId, flushSubscriptions?: boolean) {
|
|
531
|
+
await this.#sessionManager.clearSubscriptionsForNode(fabricIndex, peerNodeId, flushSubscriptions);
|
|
509
532
|
}
|
|
510
533
|
|
|
511
534
|
async close() {
|
|
@@ -271,7 +271,7 @@ function dataEnforcerFor(schema: Schema): AccessControl {
|
|
|
271
271
|
}
|
|
272
272
|
|
|
273
273
|
if (location?.owningFabric && location.owningFabric !== session.fabric) {
|
|
274
|
-
throw new
|
|
274
|
+
throw new ReadError(
|
|
275
275
|
location,
|
|
276
276
|
"Permission denied: Owning/accessing fabric mismatch",
|
|
277
277
|
StatusCode.UnsupportedAccess,
|
|
@@ -291,7 +291,7 @@ function dataEnforcerFor(schema: Schema): AccessControl {
|
|
|
291
291
|
return false;
|
|
292
292
|
}
|
|
293
293
|
|
|
294
|
-
if (
|
|
294
|
+
if (location?.owningFabric && location.owningFabric !== session.fabric) {
|
|
295
295
|
return false;
|
|
296
296
|
}
|
|
297
297
|
|
|
@@ -5,9 +5,10 @@
|
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
7
|
import { FailsafeContext } from "../../../common/FailsafeContext.js";
|
|
8
|
-
import { Lifecycle } from "../../../common/Lifecycle.js";
|
|
8
|
+
import { Lifecycle, UnsupportedDependencyError } from "../../../common/Lifecycle.js";
|
|
9
9
|
import { Endpoint } from "../../../endpoint/Endpoint.js";
|
|
10
10
|
import { Fabric } from "../../../fabric/Fabric.js";
|
|
11
|
+
import { FabricManager } from "../../../fabric/FabricManager.js";
|
|
11
12
|
import { Node } from "../../../node/Node.js";
|
|
12
13
|
import { Immutable } from "../../../util/Type.js";
|
|
13
14
|
import { NetworkCommissioningBehavior } from "../network-commissioning/NetworkCommissioningBehavior.js";
|
|
@@ -101,6 +102,25 @@ export class ServerNodeFailsafeContext extends FailsafeContext {
|
|
|
101
102
|
});
|
|
102
103
|
}
|
|
103
104
|
|
|
105
|
+
override async rollback() {
|
|
106
|
+
if (!this.fabricIndex && this.hasRootCert) {
|
|
107
|
+
// Update the fabric details if needed (like Trusted Root certificates)
|
|
108
|
+
// Only if fabric was not added because else all data gets updated anyway
|
|
109
|
+
try {
|
|
110
|
+
const fabricManager = this.#node.env.get(FabricManager);
|
|
111
|
+
fabricManager.events.failsafeClosed.emit();
|
|
112
|
+
} catch (error) {
|
|
113
|
+
// UnsupportedDependencyError can happen when the node closes.
|
|
114
|
+
// Then data are refreshed on next start anyway, so ignore this case
|
|
115
|
+
if (!(error instanceof UnsupportedDependencyError)) {
|
|
116
|
+
throw error;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
return super.rollback();
|
|
122
|
+
}
|
|
123
|
+
|
|
104
124
|
/*
|
|
105
125
|
override async restoreFabric() {
|
|
106
126
|
await super.restoreFabric();
|
|
@@ -12,6 +12,7 @@ import { MatterFabricInvalidAdminSubjectError } from "../../../common/FailsafeCo
|
|
|
12
12
|
import { MatterFabricConflictError } from "../../../common/FailsafeTimer.js";
|
|
13
13
|
import { MatterFlowError, UnexpectedDataError } from "../../../common/MatterError.js";
|
|
14
14
|
import { ValidationError } from "../../../common/ValidationError.js";
|
|
15
|
+
import { CryptoVerifyError } from "../../../crypto/Crypto.js";
|
|
15
16
|
import { FabricIndex } from "../../../datatype/FabricIndex.js";
|
|
16
17
|
import { Endpoint } from "../../../endpoint/Endpoint.js";
|
|
17
18
|
import { Fabric, PublicKeyError } from "../../../fabric/Fabric.js";
|
|
@@ -169,6 +170,7 @@ export class OperationalCredentialsServer extends OperationalCredentialsBehavior
|
|
|
169
170
|
debugText: error.message,
|
|
170
171
|
};
|
|
171
172
|
} else if (
|
|
173
|
+
error instanceof CryptoVerifyError ||
|
|
172
174
|
error instanceof CertificateError ||
|
|
173
175
|
error instanceof ValidationError ||
|
|
174
176
|
error instanceof UnexpectedDataError
|
|
@@ -411,6 +413,7 @@ export class OperationalCredentialsServer extends OperationalCredentialsBehavior
|
|
|
411
413
|
} catch (error) {
|
|
412
414
|
logger.info("setting root certificate failed", error);
|
|
413
415
|
if (
|
|
416
|
+
error instanceof CryptoVerifyError ||
|
|
414
417
|
error instanceof CertificateError ||
|
|
415
418
|
error instanceof ValidationError ||
|
|
416
419
|
error instanceof UnexpectedDataError
|
|
@@ -419,6 +422,11 @@ export class OperationalCredentialsServer extends OperationalCredentialsBehavior
|
|
|
419
422
|
}
|
|
420
423
|
throw error;
|
|
421
424
|
}
|
|
425
|
+
|
|
426
|
+
const fabrics = this.endpoint.env.get(FabricManager).getFabrics();
|
|
427
|
+
const trustedRootCertificates = fabrics.map(fabric => fabric.rootCert);
|
|
428
|
+
trustedRootCertificates.push(rootCaCertificate);
|
|
429
|
+
this.state.trustedRootCertificates = trustedRootCertificates;
|
|
422
430
|
}
|
|
423
431
|
|
|
424
432
|
async #updateFabrics() {
|
|
@@ -474,11 +482,16 @@ export class OperationalCredentialsServer extends OperationalCredentialsBehavior
|
|
|
474
482
|
this.agent.get(CommissioningBehavior).handleFabricChange(fabricIndex, FabricAction.Removed);
|
|
475
483
|
}
|
|
476
484
|
|
|
485
|
+
async #handleFailsafeClosed() {
|
|
486
|
+
await this.#updateFabrics();
|
|
487
|
+
}
|
|
488
|
+
|
|
477
489
|
async #nodeOnline() {
|
|
478
490
|
const fabricManager = this.endpoint.env.get(FabricManager);
|
|
479
491
|
this.reactTo(fabricManager.events.added, this.#handleAddedFabric);
|
|
480
492
|
this.reactTo(fabricManager.events.updated, this.#handleUpdatedFabric);
|
|
481
493
|
this.reactTo(fabricManager.events.deleted, this.#handleRemovedFabric);
|
|
494
|
+
this.reactTo(fabricManager.events.failsafeClosed, this.#handleFailsafeClosed, { lock: true });
|
|
482
495
|
await this.#updateFabrics();
|
|
483
496
|
}
|
|
484
497
|
}
|
|
@@ -800,8 +800,7 @@ export class CertificateManager {
|
|
|
800
800
|
);
|
|
801
801
|
}
|
|
802
802
|
|
|
803
|
-
|
|
804
|
-
//Crypto.verify(PublicKey(rootCert.ellipticCurvePublicKey), this.rootCertToAsn1(rootCert), rootCert.signature);
|
|
803
|
+
Crypto.verify(PublicKey(rootCert.ellipticCurvePublicKey), this.rootCertToAsn1(rootCert), rootCert.signature);
|
|
805
804
|
}
|
|
806
805
|
|
|
807
806
|
/**
|
|
@@ -31,7 +31,7 @@ const TestCMS_SignerPrivateKey = ByteArray.fromHex("AEF3484116E9481EC57BE0472DF4
|
|
|
31
31
|
const TestCMS_SignerSubjectKeyIdentifier = ByteArray.fromHex("62FA823359ACFAA9963E1CFA140ADDF504F37160");
|
|
32
32
|
|
|
33
33
|
export class CertificationDeclarationManager {
|
|
34
|
-
static generate(vendorId: VendorId, productId: number) {
|
|
34
|
+
static generate(vendorId: VendorId, productId: number, provisional = false) {
|
|
35
35
|
const certificationElements = TlvCertificationDeclaration.encode({
|
|
36
36
|
formatVersion: 1,
|
|
37
37
|
vendorId,
|
|
@@ -41,7 +41,7 @@ export class CertificationDeclarationManager {
|
|
|
41
41
|
securityLevel: 0,
|
|
42
42
|
securityInformation: 0,
|
|
43
43
|
versionNumber: 1,
|
|
44
|
-
certificationType: 0,
|
|
44
|
+
certificationType: provisional ? 1 : 0, // 0 = Test, 1 = Provisional/In certification, 2 = official
|
|
45
45
|
});
|
|
46
46
|
|
|
47
47
|
return CertificateManager.CertificationDeclarationToAsn1(
|
|
@@ -28,16 +28,16 @@ import {
|
|
|
28
28
|
} from "./AttributeServer.js";
|
|
29
29
|
import { ClusterServer } from "./ClusterServer.js";
|
|
30
30
|
import { ClusterServerHandlers } from "./ClusterServerTypes.js";
|
|
31
|
-
import {
|
|
31
|
+
import { FabricSensitiveEventServer } from "./EventServer.js";
|
|
32
32
|
|
|
33
33
|
const logger = Logger.get("AccessControlClusterServer");
|
|
34
34
|
|
|
35
35
|
export const AccessControlClusterHandler: () => ClusterServerHandlers<typeof AccessControlCluster> = () => {
|
|
36
36
|
let accessControlEntryChangedEvent:
|
|
37
|
-
|
|
|
37
|
+
| FabricSensitiveEventServer<AccessControl.AccessControlEntryChangedEvent, SyncStorage>
|
|
38
38
|
| undefined = undefined;
|
|
39
39
|
let accessControlExtensionChangedEvent:
|
|
40
|
-
|
|
|
40
|
+
| FabricSensitiveEventServer<AccessControl.AccessControlExtensionChangedEvent, SyncStorage>
|
|
41
41
|
| undefined = undefined;
|
|
42
42
|
|
|
43
43
|
return {
|
|
@@ -13,7 +13,13 @@ import { AttributeId } from "../../datatype/AttributeId.js";
|
|
|
13
13
|
import { Endpoint as EndpointInterface } from "../../device/Endpoint.js";
|
|
14
14
|
import { Fabric } from "../../fabric/Fabric.js";
|
|
15
15
|
import { Logger } from "../../log/Logger.js";
|
|
16
|
-
import {
|
|
16
|
+
import {
|
|
17
|
+
AttributeModel,
|
|
18
|
+
ClusterModel,
|
|
19
|
+
DatatypeModel,
|
|
20
|
+
Globals,
|
|
21
|
+
MatterModel as MatterModelObj,
|
|
22
|
+
} from "../../model/index.js";
|
|
17
23
|
import { StatusCode, StatusResponseError } from "../../protocol/interaction/StatusCode.js";
|
|
18
24
|
import { BitSchema, TypeFromPartialBitSchema } from "../../schema/BitmapSchema.js";
|
|
19
25
|
import { NoAssociatedFabricError, SecureSession, assertSecureSession } from "../../session/SecureSession.js";
|
|
@@ -21,11 +27,15 @@ import { Session } from "../../session/Session.js";
|
|
|
21
27
|
import { TlvSchema } from "../../tlv/TlvSchema.js";
|
|
22
28
|
import { isDeepEqual } from "../../util/DeepEqual.js";
|
|
23
29
|
import { MaybePromise } from "../../util/Promises.js";
|
|
30
|
+
import { camelize } from "../../util/String.js";
|
|
24
31
|
import { AccessLevel, Attribute, Attributes, Cluster, Commands, Events } from "../Cluster.js";
|
|
25
32
|
import { ClusterDatasource } from "./ClusterServerTypes.js";
|
|
26
33
|
|
|
27
34
|
const logger = Logger.get("AttributeServer");
|
|
28
35
|
|
|
36
|
+
const FabricIndexName = "fabricIndex";
|
|
37
|
+
const MatterModel = new MatterModelObj();
|
|
38
|
+
|
|
29
39
|
/**
|
|
30
40
|
* Thrown when an operation cannot complete because fabric information is
|
|
31
41
|
* unavailable.
|
|
@@ -178,6 +188,10 @@ export abstract class BaseAttributeServer<T> {
|
|
|
178
188
|
this.defaultValue = this.value;
|
|
179
189
|
}
|
|
180
190
|
|
|
191
|
+
get hasFabricSensitiveData() {
|
|
192
|
+
return false;
|
|
193
|
+
}
|
|
194
|
+
|
|
181
195
|
validateWithSchema(value: T) {
|
|
182
196
|
try {
|
|
183
197
|
this.schema.validate(value);
|
|
@@ -727,6 +741,7 @@ export function genericFabricScopedAttributeSetter<T>(
|
|
|
727
741
|
export class FabricScopedAttributeServer<T> extends AttributeServer<T> {
|
|
728
742
|
private readonly isCustomGetter: boolean;
|
|
729
743
|
private readonly isCustomSetter: boolean;
|
|
744
|
+
private readonly fabricSensitiveElementsToRemove = new Array<string>();
|
|
730
745
|
|
|
731
746
|
constructor(
|
|
732
747
|
id: AttributeId,
|
|
@@ -814,6 +829,69 @@ export class FabricScopedAttributeServer<T> extends AttributeServer<T> {
|
|
|
814
829
|
);
|
|
815
830
|
this.isCustomGetter = isCustomGetter;
|
|
816
831
|
this.isCustomSetter = isCustomSetter;
|
|
832
|
+
|
|
833
|
+
this.#determineSensitiveFieldsToRemove();
|
|
834
|
+
}
|
|
835
|
+
|
|
836
|
+
#determineSensitiveFieldsToRemove() {
|
|
837
|
+
const clusterFromModel = MatterModel.get(ClusterModel, this.cluster.id);
|
|
838
|
+
if (clusterFromModel === undefined) {
|
|
839
|
+
logger.debug(`${this.cluster.name}: Cluster for Fabric scoped element not found in Model, ignore`);
|
|
840
|
+
return;
|
|
841
|
+
}
|
|
842
|
+
const attributeFromModel = clusterFromModel.get(AttributeModel, this.id);
|
|
843
|
+
if (attributeFromModel === undefined) {
|
|
844
|
+
logger.debug(
|
|
845
|
+
`${this.cluster.name}.${this.id}: Attribute for Fabric scoped element not found in Model, ignore`,
|
|
846
|
+
);
|
|
847
|
+
return;
|
|
848
|
+
}
|
|
849
|
+
if (!attributeFromModel.fabricScoped) {
|
|
850
|
+
logger.debug(`${this.cluster.name}.${this.id}: Attribute is not Fabric scoped in model, ignore`);
|
|
851
|
+
return;
|
|
852
|
+
}
|
|
853
|
+
if (attributeFromModel.children.length !== 1) {
|
|
854
|
+
logger.debug(`${this.cluster.name}.${this.id}: Attribute has not exactly one child, ignore`);
|
|
855
|
+
return;
|
|
856
|
+
}
|
|
857
|
+
const type = attributeFromModel.children[0].type;
|
|
858
|
+
if (type === undefined) {
|
|
859
|
+
logger.debug(`${this.cluster.name}.${this.id}: Attribute field has no type, ignore`);
|
|
860
|
+
return;
|
|
861
|
+
}
|
|
862
|
+
const dataType = clusterFromModel.get(DatatypeModel, type);
|
|
863
|
+
if (dataType === undefined) {
|
|
864
|
+
logger.debug(`${this.cluster.name}.${this.id}: DataType ${type} not found in model, ignore`);
|
|
865
|
+
return;
|
|
866
|
+
}
|
|
867
|
+
dataType.children
|
|
868
|
+
.filter(field => field.fabricSensitive)
|
|
869
|
+
.forEach(field => this.fabricSensitiveElementsToRemove.push(camelize(field.name)));
|
|
870
|
+
}
|
|
871
|
+
|
|
872
|
+
override get hasFabricSensitiveData() {
|
|
873
|
+
return this.fabricSensitiveElementsToRemove.length > 0;
|
|
874
|
+
}
|
|
875
|
+
|
|
876
|
+
/**
|
|
877
|
+
* Sanitize the value of the attribute by removing fabric sensitive fields that do not belong to the
|
|
878
|
+
* associated fabric
|
|
879
|
+
*/
|
|
880
|
+
sanitizeFabricSensitiveFields(value: T, associatedFabric?: Fabric) {
|
|
881
|
+
if (this.fabricSensitiveElementsToRemove.length && Array.isArray(value)) {
|
|
882
|
+
// Get the associated Fabric Index or uses -1 when no Fabric is associated because this value will
|
|
883
|
+
// never be in the struct
|
|
884
|
+
const associatedFabricIndex = associatedFabric?.fabricIndex ?? -1;
|
|
885
|
+
return value.map(data => {
|
|
886
|
+
if (data[FabricIndexName] !== associatedFabricIndex) {
|
|
887
|
+
const result = { ...data };
|
|
888
|
+
this.fabricSensitiveElementsToRemove.forEach(fieldName => delete result[fieldName]);
|
|
889
|
+
return result;
|
|
890
|
+
}
|
|
891
|
+
return data;
|
|
892
|
+
});
|
|
893
|
+
}
|
|
894
|
+
return value;
|
|
817
895
|
}
|
|
818
896
|
|
|
819
897
|
/**
|
|
@@ -37,7 +37,7 @@ import {
|
|
|
37
37
|
SupportedEventsList,
|
|
38
38
|
} from "./ClusterServerTypes.js";
|
|
39
39
|
import { CommandServer } from "./CommandServer.js";
|
|
40
|
-
import {
|
|
40
|
+
import { createEventServer } from "./EventServer.js";
|
|
41
41
|
|
|
42
42
|
const logger = Logger.get("ClusterServer");
|
|
43
43
|
|
|
@@ -508,7 +508,14 @@ export function ClusterServer<
|
|
|
508
508
|
}
|
|
509
509
|
|
|
510
510
|
if ((supportedEvents as any)[eventName] === true) {
|
|
511
|
-
(events as any)[eventName] =
|
|
511
|
+
(events as any)[eventName] = createEventServer(
|
|
512
|
+
clusterDef,
|
|
513
|
+
eventDef[eventName],
|
|
514
|
+
eventName,
|
|
515
|
+
schema,
|
|
516
|
+
priority,
|
|
517
|
+
readAcl,
|
|
518
|
+
);
|
|
512
519
|
const capitalizedEventName = capitalize(eventName);
|
|
513
520
|
result[`trigger${capitalizedEventName}Event`] = <T>(event: T) =>
|
|
514
521
|
(events as any)[eventName].triggerEvent(event);
|
|
@@ -49,7 +49,7 @@ import {
|
|
|
49
49
|
import { Scenes } from "../definitions/ScenesCluster.js";
|
|
50
50
|
import { AttributeServer, FabricScopedAttributeServer, FixedAttributeServer } from "./AttributeServer.js";
|
|
51
51
|
import { CommandServer } from "./CommandServer.js";
|
|
52
|
-
import {
|
|
52
|
+
import { AnyEventServer } from "./EventServer.js";
|
|
53
53
|
|
|
54
54
|
/** Cluster attributes accessible on the cluster server */
|
|
55
55
|
type MandatoryAttributeServers<A extends Attributes> = Omit<
|
|
@@ -243,8 +243,8 @@ type ServerAttributeSubscribers<A extends Attributes> = {
|
|
|
243
243
|
};
|
|
244
244
|
|
|
245
245
|
export type EventServers<E extends Events> = Merge<
|
|
246
|
-
{ [P in MandatoryEventNames<E>]:
|
|
247
|
-
{ [P in OptionalEventNames<E>]?:
|
|
246
|
+
{ [P in MandatoryEventNames<E>]: AnyEventServer<EventType<E[P]>, any> },
|
|
247
|
+
{ [P in OptionalEventNames<E>]?: AnyEventServer<EventType<E[P]>, any> }
|
|
248
248
|
>;
|
|
249
249
|
type ServerEventTriggers<E extends Events> = {
|
|
250
250
|
[P in MandatoryEventNames<E> as `trigger${Capitalize<string & P>}Event`]: (event: EventType<E[P]>) => void;
|