@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/tlv/TlvObject.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * @license\n * Copyright 2022-2024 Matter.js Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { UnexpectedDataError } from \"../common/MatterError.js\";\nimport { tryCatch } from \"../common/TryCatchHandler.js\";\nimport { ValidationError } from \"../common/ValidationError.js\";\nimport { Globals } from \"../model/index.js\";\nimport { Merge } from \"../util/Type.js\";\nimport { TlvAny } from \"./TlvAny.js\";\nimport { LengthConstraints } from \"./TlvArray.js\";\nimport { TlvTag, TlvType, TlvTypeLength } from \"./TlvCodec.js\";\nimport { TlvReader, TlvSchema, TlvWriter } from \"./TlvSchema.js\";\n\nexport interface FieldType<T> {\n id: number;\n schema: TlvSchema<T>;\n optional?: boolean;\n repeated?: boolean;\n fallback?: T;\n}\n\nexport interface RepeatedFieldType<T> extends FieldType<T> {\n repeated: true;\n minLength?: number;\n maxLength?: number;\n}\n\nexport interface OptionalFieldType<T> extends FieldType<T> {\n optional: true;\n}\n\nexport interface OptionalRepeatedFieldType<T> extends OptionalFieldType<T> {\n repeated: true;\n maxLength?: number;\n}\n\nexport type TlvFields = { [field: string]: FieldType<any> };\n\ntype MandatoryFieldNames<F extends TlvFields> = {\n [K in keyof F]: F[K] extends OptionalFieldType<any> ? never : K;\n}[keyof F];\ntype OptionalFieldNames<F extends TlvFields> = {\n [K in keyof F]: F[K] extends OptionalFieldType<any> ? K : never;\n}[keyof F];\ntype TypeFromField<F extends FieldType<any>> = F extends FieldType<infer T> ? T : never;\ntype TypeForMandatoryFields<F extends TlvFields, MF extends keyof F> = { [K in MF]: TypeFromField<F[K]> };\ntype TypeForOptionalFields<F extends TlvFields, MF extends keyof F> = { [K in MF]?: TypeFromField<F[K]> };\nexport type TypeFromFields<F extends TlvFields> = Merge<\n TypeForMandatoryFields<F, MandatoryFieldNames<F>>,\n TypeForOptionalFields<F, OptionalFieldNames<F>>\n>;\n\n/**\n * Schema to encode an object in TLV.\n *\n * @see {@link MatterSpecification.v10.Core} \u00A7 A.5.1 and \u00A7 A.11.4\n */\nexport class ObjectSchema<F extends TlvFields> extends TlvSchema<TypeFromFields<F>> {\n private readonly fieldById = new Array<{ name: string; field: FieldType<any> }>();\n\n constructor(\n private readonly fieldDefinitions: F,\n private readonly type: TlvType.Structure | TlvType.List = TlvType.Structure,\n private readonly allowProtocolSpecificTags = false,\n ) {\n super();\n\n // TODO Add sorting option to enforce order of fields in encoded TLV If Ty is Structure\n // Requirements @see {@link MatterSpecification.Core.v12} \u00A7 A.2.4\n for (const name in this.fieldDefinitions) {\n const field = this.fieldDefinitions[name];\n if (field.repeated && type !== TlvType.List) {\n throw new Error(\"Repeated fields are only allowed in TLV List.\");\n }\n this.fieldById[field.id] = { name, field };\n }\n }\n\n #encodeEntryToTlv(writer: TlvWriter, name: string, value: TypeFromFields<F>, forWriteInteraction?: boolean) {\n const { id, schema, optional: isOptional, repeated: isRepeated } = this.fieldDefinitions[name];\n const fieldValue = (value as any)[name];\n if (fieldValue === undefined) {\n if (!isOptional) {\n if (forWriteInteraction && id === <number>Globals.FabricIndex.id) {\n // FabricIndex field should not be included in encoded data for write interactions\n return;\n }\n throw new ValidationError(`Missing mandatory field ${name}`, name);\n }\n return;\n }\n if (isRepeated) {\n if (!Array.isArray(fieldValue)) {\n throw new ValidationError(`Repeated field ${name} should be an array.`, name);\n }\n for (const element of fieldValue) {\n schema.encodeTlvInternal(writer, element, { id }, forWriteInteraction);\n }\n } else {\n schema.encodeTlvInternal(writer, fieldValue, { id }, forWriteInteraction);\n }\n }\n\n /**\n * Encode the object as Structure, by the order of field definitions.\n */\n #encodeStructure(writer: TlvWriter, value: TypeFromFields<F>, forWriteInteraction?: boolean) {\n for (const name in this.fieldDefinitions) {\n this.#encodeEntryToTlv(writer, name, value, forWriteInteraction);\n }\n }\n\n /**\n * Encode the object as List, by the order of the fields in the object.\n */\n #encodeList(writer: TlvWriter, value: TypeFromFields<F>, forWriteInteraction?: boolean) {\n const encodedFields = new Set<string>();\n // Encode object fields\n for (const name of Object.keys(value)) {\n this.#encodeEntryToTlv(writer, name, value, forWriteInteraction);\n encodedFields.add(name);\n }\n // Verify the potentially missing fields\n for (const name in this.fieldDefinitions) {\n if (encodedFields.has(name)) continue;\n this.#encodeEntryToTlv(writer, name, value, forWriteInteraction);\n }\n }\n\n override encodeTlvInternal(\n writer: TlvWriter,\n value: TypeFromFields<F>,\n tag?: TlvTag,\n forWriteInteraction?: boolean,\n ): void {\n writer.writeTag({ type: this.type }, tag);\n\n if (this.type === TlvType.Structure) {\n // Encode in order of field definitions\n this.#encodeStructure(writer, value, forWriteInteraction);\n } else {\n this.#encodeList(writer, value, forWriteInteraction);\n }\n\n writer.writeTag({ type: TlvType.EndOfContainer });\n }\n\n override decodeTlvInternalValue(reader: TlvReader, typeLength: TlvTypeLength): TypeFromFields<F> {\n if (typeLength.type !== this.type)\n throw new UnexpectedDataError(`Unexpected type ${typeLength.type} (expected ${this.type}).`);\n const result: any = {};\n while (true) {\n const { tag: { profile, id } = {}, typeLength: elementTypeLength } = reader.readTagType();\n if (elementTypeLength.type === TlvType.EndOfContainer) break;\n if (profile !== undefined && !this.allowProtocolSpecificTags)\n throw new UnexpectedDataError(\"Structure element tags should be context-specific.\");\n if (id === undefined) throw new UnexpectedDataError(\"Structure element tags should have an id.\");\n const fieldName = this.fieldById[id];\n if (fieldName === undefined) {\n // Ignore unknown field by decoding it as raw TLV so we skip forward the proper length.\n TlvAny.decodeTlvInternalValue(reader, elementTypeLength);\n continue;\n }\n const { field, name } = fieldName;\n const decoded = field.schema.decodeTlvInternalValue(reader, elementTypeLength);\n if (field.repeated) {\n if (result[name] === undefined) {\n result[name] = [decoded];\n } else {\n result[name].push(decoded);\n }\n } else {\n result[name] = decoded;\n }\n }\n // Check mandatory fields and, if missing, populate with fallback value if defined.\n for (const name in this.fieldDefinitions) {\n const { optional, fallback, repeated } = this.fieldDefinitions[name];\n if (optional) continue;\n const value = result[name];\n if (value !== undefined) continue;\n if (fallback !== undefined) {\n if (repeated) {\n result[name] = [fallback];\n } else {\n result[name] = fallback;\n }\n }\n }\n return result as TypeFromFields<F>;\n }\n\n override validate(value: TypeFromFields<F>): void {\n for (const name in this.fieldDefinitions) {\n const { optional, schema, repeated: isRepeated } = this.fieldDefinitions[name];\n const data = (value as any)[name];\n if (data === undefined) {\n if (optional) {\n continue;\n }\n throw new ValidationError(`Missing mandatory field ${name}`, name);\n }\n if (isRepeated) {\n const { minLength = 2, maxLength = 65535 } = this.fieldDefinitions[name] as RepeatedFieldType<any>;\n if (!Array.isArray(data)) {\n throw new ValidationError(`Repeated field ${name} should be an array.`, name);\n }\n if (data.length > maxLength)\n throw new ValidationError(\n `Repeated field list for ${name} is too long: ${data.length}, max ${maxLength}.`,\n name,\n );\n if (data.length < minLength)\n throw new ValidationError(\n `Repeated field list for ${name} is too short: ${data.length}, min ${minLength}.`,\n name,\n );\n for (const element of data) {\n tryCatch(\n () => schema.validate(element),\n ValidationError,\n error => {\n error.fieldName = `${name}${error.fieldName !== undefined ? `.${error.fieldName}` : \"\"}`;\n throw error;\n },\n );\n }\n } else {\n tryCatch(\n () => schema.validate(data),\n ValidationError,\n error => {\n error.fieldName = `${name}${error.fieldName !== undefined ? `.${error.fieldName}` : \"\"}`;\n throw error;\n },\n );\n }\n }\n }\n\n override injectField(\n value: TypeFromFields<F>,\n fieldId: number,\n fieldValue: any,\n injectChecker: (fieldValue: any) => boolean,\n ): TypeFromFields<F> {\n for (const k in this.fieldDefinitions) {\n const field = this.fieldDefinitions[k] as FieldType<any>;\n\n if (field.id === fieldId) {\n if (injectChecker((value as any)[k])) {\n field.schema.validate(fieldValue); // Make sure type matches\n (value as any)[k] = fieldValue;\n }\n } else {\n (value as any)[k] = field.schema.injectField((value as any)[k], fieldId, fieldValue, injectChecker);\n }\n }\n return value;\n }\n\n override removeField(\n value: TypeFromFields<F>,\n fieldId: number,\n removeChecker: (fieldValue: any) => boolean,\n ): TypeFromFields<F> {\n for (const k in this.fieldDefinitions) {\n const field = this.fieldDefinitions[k] as FieldType<any>;\n\n if (field.id === fieldId) {\n if ((value as any)[k] !== undefined && removeChecker((value as any)[k])) {\n delete (value as any)[k];\n }\n } else {\n (value as any)[k] = field.schema.removeField((value as any)[k], fieldId, removeChecker);\n }\n }\n return value;\n }\n}\n\n/** Object TLV schema. */\nexport const TlvObject = <F extends TlvFields>(fields: F) => new ObjectSchema(fields, TlvType.Structure);\n\n/**\n * List TLV schema with all tagged entries.\n * List entries that can appear multiple times can be defined using TlvRepeatedField/TlvOptionalRepeatedField and are\n * represented as Arrays.\n * TODO: We represent Tlv Lists right now as named object properties. This formally does not match the spec, which\n * defines a list as a sequence of TLV elements with optional tag where the order matters. That's ok for now\n * (also with the help of \"Repeated Fields\") because it not makes any real difference for now for the current\n * existing data structures. We need to change once this changes.\n */\nexport const TlvTaggedList = <F extends TlvFields>(fields: F, allowProtocolSpecificTags = false) =>\n new ObjectSchema(fields, TlvType.List, allowProtocolSpecificTags);\n\n// TODO Implement a real TlvList schema that matches the spec to represent a ordered list of TLV elements with optional\n// tag.\n\n/**\n * Object TLV mandatory field. Optionally provide a fallback value to initialize the field value when devices omit\n * providing a value against the specifications or in special use cases. Make sure to use a value that is an equivalent\n * to the value being empty.\n */\nexport const TlvField = <T>(id: number, schema: TlvSchema<T>, fallback?: T) =>\n ({ id, schema, fallback, optional: false }) as FieldType<T>;\n\n/** Object TLV optional field. */\nexport const TlvOptionalField = <T>(id: number, schema: TlvSchema<T>) =>\n ({ id, schema, optional: true }) as OptionalFieldType<T>;\n\n/**\n * Object TLV mandatory field that can exist repeated in a TLV List structure. The order is preserved on encoding and\n * decoding.\n */\nexport const TlvRepeatedField = <T>(id: number, schema: TlvSchema<T>, lengthOptions?: LengthConstraints) => {\n const { minLength, maxLength, length } = lengthOptions ?? {};\n return {\n id,\n schema,\n optional: false,\n repeated: true,\n minLength: length ?? minLength,\n maxLength: length ?? maxLength,\n } as RepeatedFieldType<T[]>;\n};\n\n/**\n * Object TLV optional field that can exist repeated in a TLV List structure. The order is preserved on encoding and\n * decoding.\n */\nexport const TlvOptionalRepeatedField = <T>(\n id: number,\n schema: TlvSchema<T>,\n lengthOptions?: { maxLength: number },\n) => {\n const { maxLength } = lengthOptions ?? {};\n return {\n id,\n schema,\n optional: true,\n repeated: true,\n minLength: 0,\n maxLength,\n } as OptionalRepeatedFieldType<T[]>;\n};\n"],
|
|
5
|
-
"mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;AAMA,SAAS,2BAA2B;
|
|
4
|
+
"sourcesContent": ["/**\n * @license\n * Copyright 2022-2024 Matter.js Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { InternalError, UnexpectedDataError } from \"../common/MatterError.js\";\nimport { tryCatch } from \"../common/TryCatchHandler.js\";\nimport { ValidationError } from \"../common/ValidationError.js\";\nimport { Globals } from \"../model/index.js\";\nimport { Merge } from \"../util/Type.js\";\nimport { TlvAny } from \"./TlvAny.js\";\nimport { LengthConstraints } from \"./TlvArray.js\";\nimport { TlvTag, TlvType, TlvTypeLength } from \"./TlvCodec.js\";\nimport { TlvEncodingOptions, TlvReader, TlvSchema, TlvWriter } from \"./TlvSchema.js\";\n\nexport interface FieldType<T> {\n id: number;\n schema: TlvSchema<T>;\n optional?: boolean;\n repeated?: boolean;\n fallback?: T;\n}\n\nexport interface RepeatedFieldType<T> extends FieldType<T> {\n repeated: true;\n minLength?: number;\n maxLength?: number;\n}\n\nexport interface OptionalFieldType<T> extends FieldType<T> {\n optional: true;\n}\n\nexport interface OptionalRepeatedFieldType<T> extends OptionalFieldType<T> {\n repeated: true;\n maxLength?: number;\n}\n\nexport type TlvFields = { [field: string]: FieldType<any> };\n\ntype MandatoryFieldNames<F extends TlvFields> = {\n [K in keyof F]: F[K] extends OptionalFieldType<any> ? never : K;\n}[keyof F];\ntype OptionalFieldNames<F extends TlvFields> = {\n [K in keyof F]: F[K] extends OptionalFieldType<any> ? K : never;\n}[keyof F];\ntype TypeFromField<F extends FieldType<any>> = F extends FieldType<infer T> ? T : never;\ntype TypeForMandatoryFields<F extends TlvFields, MF extends keyof F> = { [K in MF]: TypeFromField<F[K]> };\ntype TypeForOptionalFields<F extends TlvFields, MF extends keyof F> = { [K in MF]?: TypeFromField<F[K]> };\nexport type TypeFromFields<F extends TlvFields> = Merge<\n TypeForMandatoryFields<F, MandatoryFieldNames<F>>,\n TypeForOptionalFields<F, OptionalFieldNames<F>>\n>;\n\n/**\n * Schema to encode an object in TLV.\n *\n * @see {@link MatterSpecification.v10.Core} \u00A7 A.5.1 and \u00A7 A.11.4\n */\nexport class ObjectSchema<F extends TlvFields> extends TlvSchema<TypeFromFields<F>> {\n private readonly fieldById = new Array<{ name: string; field: FieldType<any> }>();\n\n constructor(\n private readonly fieldDefinitions: F,\n private readonly type: TlvType.Structure | TlvType.List = TlvType.Structure,\n private readonly allowProtocolSpecificTags = false,\n ) {\n super();\n\n // TODO Add sorting option to enforce order of fields in encoded TLV If Ty is Structure\n // Requirements @see {@link MatterSpecification.Core.v12} \u00A7 A.2.4\n for (const name in this.fieldDefinitions) {\n const field = this.fieldDefinitions[name];\n if (field.repeated && type !== TlvType.List) {\n throw new Error(\"Repeated fields are only allowed in TLV List.\");\n }\n this.fieldById[field.id] = { name, field };\n }\n }\n\n #encodeEntryToTlv(writer: TlvWriter, name: string, value: TypeFromFields<F>, options?: TlvEncodingOptions) {\n const { id, schema, optional: isOptional, repeated: isRepeated } = this.fieldDefinitions[name];\n const { forWriteInteraction = false, allowMissingFieldsForNonFabricFilteredRead = false } = options ?? {};\n if (forWriteInteraction && allowMissingFieldsForNonFabricFilteredRead) {\n throw new InternalError(\n \"Encode options can not indicate a write interaction and a fabric filtered read interaction at the same time.\",\n );\n }\n const fieldValue = (value as any)[name];\n if (fieldValue === undefined) {\n if (!isOptional && !allowMissingFieldsForNonFabricFilteredRead) {\n if (forWriteInteraction && id === <number>Globals.FabricIndex.id) {\n // FabricIndex field should not be included in encoded data for write interactions\n return;\n }\n throw new ValidationError(`Missing mandatory field ${name}`, name);\n }\n return;\n }\n if (isRepeated) {\n if (!Array.isArray(fieldValue)) {\n throw new ValidationError(`Repeated field ${name} should be an array.`, name);\n }\n for (const element of fieldValue) {\n schema.encodeTlvInternal(writer, element, { id }, options);\n }\n } else {\n schema.encodeTlvInternal(writer, fieldValue, { id }, options);\n }\n }\n\n /**\n * Encode the object as Structure, by the order of field definitions.\n */\n #encodeStructure(writer: TlvWriter, value: TypeFromFields<F>, options?: TlvEncodingOptions) {\n for (const name in this.fieldDefinitions) {\n this.#encodeEntryToTlv(writer, name, value, options);\n }\n }\n\n /**\n * Encode the object as List, by the order of the fields in the object.\n */\n #encodeList(writer: TlvWriter, value: TypeFromFields<F>, options?: TlvEncodingOptions) {\n const encodedFields = new Set<string>();\n // Encode object fields\n for (const name of Object.keys(value)) {\n this.#encodeEntryToTlv(writer, name, value, options);\n encodedFields.add(name);\n }\n // Verify the potentially missing fields\n for (const name in this.fieldDefinitions) {\n if (encodedFields.has(name)) continue;\n this.#encodeEntryToTlv(writer, name, value, options);\n }\n }\n\n override encodeTlvInternal(\n writer: TlvWriter,\n value: TypeFromFields<F>,\n tag?: TlvTag,\n options?: TlvEncodingOptions,\n ): void {\n writer.writeTag({ type: this.type }, tag);\n\n if (this.type === TlvType.Structure) {\n // Encode in order of field definitions\n this.#encodeStructure(writer, value, options);\n } else {\n this.#encodeList(writer, value, options);\n }\n\n writer.writeTag({ type: TlvType.EndOfContainer });\n }\n\n override decodeTlvInternalValue(reader: TlvReader, typeLength: TlvTypeLength): TypeFromFields<F> {\n if (typeLength.type !== this.type)\n throw new UnexpectedDataError(`Unexpected type ${typeLength.type} (expected ${this.type}).`);\n const result: any = {};\n while (true) {\n const { tag: { profile, id } = {}, typeLength: elementTypeLength } = reader.readTagType();\n if (elementTypeLength.type === TlvType.EndOfContainer) break;\n if (profile !== undefined && !this.allowProtocolSpecificTags)\n throw new UnexpectedDataError(\"Structure element tags should be context-specific.\");\n if (id === undefined) throw new UnexpectedDataError(\"Structure element tags should have an id.\");\n const fieldName = this.fieldById[id];\n if (fieldName === undefined) {\n // Ignore unknown field by decoding it as raw TLV so we skip forward the proper length.\n TlvAny.decodeTlvInternalValue(reader, elementTypeLength);\n continue;\n }\n const { field, name } = fieldName;\n const decoded = field.schema.decodeTlvInternalValue(reader, elementTypeLength);\n if (field.repeated) {\n if (result[name] === undefined) {\n result[name] = [decoded];\n } else {\n result[name].push(decoded);\n }\n } else {\n result[name] = decoded;\n }\n }\n // Check mandatory fields and, if missing, populate with fallback value if defined.\n for (const name in this.fieldDefinitions) {\n const { optional, fallback, repeated } = this.fieldDefinitions[name];\n if (optional) continue;\n const value = result[name];\n if (value !== undefined) continue;\n if (fallback !== undefined) {\n if (repeated) {\n result[name] = [fallback];\n } else {\n result[name] = fallback;\n }\n }\n }\n return result as TypeFromFields<F>;\n }\n\n override validate(value: TypeFromFields<F>): void {\n for (const name in this.fieldDefinitions) {\n const { optional, schema, repeated: isRepeated } = this.fieldDefinitions[name];\n const data = (value as any)[name];\n if (data === undefined) {\n if (optional) {\n continue;\n }\n throw new ValidationError(`Missing mandatory field ${name}`, name);\n }\n if (isRepeated) {\n const { minLength = 2, maxLength = 65535 } = this.fieldDefinitions[name] as RepeatedFieldType<any>;\n if (!Array.isArray(data)) {\n throw new ValidationError(`Repeated field ${name} should be an array.`, name);\n }\n if (data.length > maxLength)\n throw new ValidationError(\n `Repeated field list for ${name} is too long: ${data.length}, max ${maxLength}.`,\n name,\n );\n if (data.length < minLength)\n throw new ValidationError(\n `Repeated field list for ${name} is too short: ${data.length}, min ${minLength}.`,\n name,\n );\n for (const element of data) {\n tryCatch(\n () => schema.validate(element),\n ValidationError,\n error => {\n error.fieldName = `${name}${error.fieldName !== undefined ? `.${error.fieldName}` : \"\"}`;\n throw error;\n },\n );\n }\n } else {\n tryCatch(\n () => schema.validate(data),\n ValidationError,\n error => {\n error.fieldName = `${name}${error.fieldName !== undefined ? `.${error.fieldName}` : \"\"}`;\n throw error;\n },\n );\n }\n }\n }\n\n override injectField(\n value: TypeFromFields<F>,\n fieldId: number,\n fieldValue: any,\n injectChecker: (fieldValue: any) => boolean,\n ): TypeFromFields<F> {\n for (const k in this.fieldDefinitions) {\n const field = this.fieldDefinitions[k] as FieldType<any>;\n\n if (field.id === fieldId) {\n if (injectChecker((value as any)[k])) {\n field.schema.validate(fieldValue); // Make sure type matches\n (value as any)[k] = fieldValue;\n }\n } else {\n (value as any)[k] = field.schema.injectField((value as any)[k], fieldId, fieldValue, injectChecker);\n }\n }\n return value;\n }\n\n override removeField(\n value: TypeFromFields<F>,\n fieldId: number,\n removeChecker: (fieldValue: any) => boolean,\n ): TypeFromFields<F> {\n for (const k in this.fieldDefinitions) {\n const field = this.fieldDefinitions[k] as FieldType<any>;\n\n if (field.id === fieldId) {\n if ((value as any)[k] !== undefined && removeChecker((value as any)[k])) {\n delete (value as any)[k];\n }\n } else {\n (value as any)[k] = field.schema.removeField((value as any)[k], fieldId, removeChecker);\n }\n }\n return value;\n }\n}\n\n/** Object TLV schema. */\nexport const TlvObject = <F extends TlvFields>(fields: F) => new ObjectSchema(fields, TlvType.Structure);\n\n/**\n * List TLV schema with all tagged entries.\n * List entries that can appear multiple times can be defined using TlvRepeatedField/TlvOptionalRepeatedField and are\n * represented as Arrays.\n * TODO: We represent Tlv Lists right now as named object properties. This formally does not match the spec, which\n * defines a list as a sequence of TLV elements with optional tag where the order matters. That's ok for now\n * (also with the help of \"Repeated Fields\") because it not makes any real difference for now for the current\n * existing data structures. We need to change once this changes.\n */\nexport const TlvTaggedList = <F extends TlvFields>(fields: F, allowProtocolSpecificTags = false) =>\n new ObjectSchema(fields, TlvType.List, allowProtocolSpecificTags);\n\n// TODO Implement a real TlvList schema that matches the spec to represent a ordered list of TLV elements with optional\n// tag.\n\n/**\n * Object TLV mandatory field. Optionally provide a fallback value to initialize the field value when devices omit\n * providing a value against the specifications or in special use cases. Make sure to use a value that is an equivalent\n * to the value being empty.\n */\nexport const TlvField = <T>(id: number, schema: TlvSchema<T>, fallback?: T) =>\n ({ id, schema, fallback, optional: false }) as FieldType<T>;\n\n/** Object TLV optional field. */\nexport const TlvOptionalField = <T>(id: number, schema: TlvSchema<T>) =>\n ({ id, schema, optional: true }) as OptionalFieldType<T>;\n\n/**\n * Object TLV mandatory field that can exist repeated in a TLV List structure. The order is preserved on encoding and\n * decoding.\n */\nexport const TlvRepeatedField = <T>(id: number, schema: TlvSchema<T>, lengthOptions?: LengthConstraints) => {\n const { minLength, maxLength, length } = lengthOptions ?? {};\n return {\n id,\n schema,\n optional: false,\n repeated: true,\n minLength: length ?? minLength,\n maxLength: length ?? maxLength,\n } as RepeatedFieldType<T[]>;\n};\n\n/**\n * Object TLV optional field that can exist repeated in a TLV List structure. The order is preserved on encoding and\n * decoding.\n */\nexport const TlvOptionalRepeatedField = <T>(\n id: number,\n schema: TlvSchema<T>,\n lengthOptions?: { maxLength: number },\n) => {\n const { maxLength } = lengthOptions ?? {};\n return {\n id,\n schema,\n optional: true,\n repeated: true,\n minLength: 0,\n maxLength,\n } as OptionalRepeatedFieldType<T[]>;\n};\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -6,17 +6,29 @@
|
|
|
6
6
|
import { Schema } from "../schema/Schema.js";
|
|
7
7
|
import { ByteArray } from "../util/ByteArray.js";
|
|
8
8
|
import { TlvTag, TlvToPrimitive, TlvTypeLength } from "./TlvCodec.js";
|
|
9
|
+
export type TlvEncodingOptions = {
|
|
10
|
+
/**
|
|
11
|
+
* When true, the fabricIndex field will be excluded from the TLV encoding for list entries.
|
|
12
|
+
* This flag must not be set together with the following flag.
|
|
13
|
+
*/
|
|
14
|
+
forWriteInteraction?: boolean;
|
|
15
|
+
/**
|
|
16
|
+
* When true, mandatory field validation is skipped when encoding TLV for list entries.
|
|
17
|
+
* This flag must not be set together with the former flag.
|
|
18
|
+
*/
|
|
19
|
+
allowMissingFieldsForNonFabricFilteredRead?: boolean;
|
|
20
|
+
};
|
|
9
21
|
export declare abstract class TlvSchema<T> extends Schema<T, ByteArray> implements TlvSchema<T> {
|
|
10
22
|
decodeInternal(encoded: ByteArray): T;
|
|
11
23
|
encodeInternal(value: T): ByteArray;
|
|
12
|
-
encodeTlv(value: T,
|
|
24
|
+
encodeTlv(value: T, options?: TlvEncodingOptions): TlvStream;
|
|
13
25
|
decodeTlv(encoded: TlvStream): T;
|
|
14
26
|
decodeTlvInternal(reader: TlvReader): {
|
|
15
27
|
value: T;
|
|
16
28
|
tag?: TlvTag;
|
|
17
29
|
};
|
|
18
30
|
abstract decodeTlvInternalValue(reader: TlvReader, typeLength: TlvTypeLength): T;
|
|
19
|
-
abstract encodeTlvInternal(writer: TlvWriter, value: T, tag?: TlvTag,
|
|
31
|
+
abstract encodeTlvInternal(writer: TlvWriter, value: T, tag?: TlvTag, options?: TlvEncodingOptions): void;
|
|
20
32
|
injectField(value: T, _fieldId: number, _fieldValue: any, _injectChecker: (fieldValue: any) => boolean): T;
|
|
21
33
|
removeField(value: T, _fieldId: number, _removeChecker: (fieldValue: any) => boolean): T;
|
|
22
34
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TlvSchema.d.ts","sourceRoot":"","sources":["../../../src/tlv/TlvSchema.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAU,MAAM,sBAAsB,CAAC;AAGzD,OAAO,EAAY,MAAM,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAEhF,8BAAsB,SAAS,CAAC,CAAC,CAAE,SAAQ,MAAM,CAAC,CAAC,EAAE,SAAS,CAAE,YAAW,SAAS,CAAC,CAAC,CAAC;IAC1E,cAAc,CAAC,OAAO,EAAE,SAAS,GAAG,CAAC;IAIrC,cAAc,CAAC,KAAK,EAAE,CAAC,GAAG,SAAS;IAM5C,SAAS,CAAC,KAAK,EAAE,CAAC,EAAE,
|
|
1
|
+
{"version":3,"file":"TlvSchema.d.ts","sourceRoot":"","sources":["../../../src/tlv/TlvSchema.ts"],"names":[],"mappings":"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"}
|
|
@@ -17,9 +17,9 @@ class TlvSchema extends Schema {
|
|
|
17
17
|
this.encodeTlvInternal(writer, value);
|
|
18
18
|
return writer.toByteArray();
|
|
19
19
|
}
|
|
20
|
-
encodeTlv(value,
|
|
20
|
+
encodeTlv(value, options) {
|
|
21
21
|
const writer = new TlvArrayWriter();
|
|
22
|
-
this.encodeTlvInternal(writer, value, void 0,
|
|
22
|
+
this.encodeTlvInternal(writer, value, void 0, options);
|
|
23
23
|
return writer.toTlvArray();
|
|
24
24
|
}
|
|
25
25
|
decodeTlv(encoded) {
|
|
@@ -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,6 +527,10 @@ export class MatterDevice {
|
|
|
504
527
|
return { session, channel: await networkInterface.openChannel(device.addresses[0]) };
|
|
505
528
|
}
|
|
506
529
|
|
|
530
|
+
async clearSubscriptionsForNode(fabricIndex: FabricIndex, peerNodeId: NodeId, flushSubscriptions?: boolean) {
|
|
531
|
+
await this.#sessionManager.clearSubscriptionsForNode(fabricIndex, peerNodeId, flushSubscriptions);
|
|
532
|
+
}
|
|
533
|
+
|
|
507
534
|
async close() {
|
|
508
535
|
this.#isClosing = true;
|
|
509
536
|
await this.endCommissioning();
|
|
@@ -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 {
|