@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
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
|
|
7
7
|
import { MatterDevice } from "../../MatterDevice.js";
|
|
8
8
|
import { AnyAttributeServer, FabricScopedAttributeServer } from "../../cluster/server/AttributeServer.js";
|
|
9
|
-
import {
|
|
9
|
+
import { AnyEventServer, FabricSensitiveEventServer } from "../../cluster/server/EventServer.js";
|
|
10
10
|
import { InternalError } from "../../common/MatterError.js";
|
|
11
11
|
import { tryCatch, tryCatchAsync } from "../../common/TryCatchHandler.js";
|
|
12
12
|
import { EventNumber } from "../../datatype/EventNumber.js";
|
|
@@ -17,9 +17,11 @@ import { NetworkError } from "../../net/Network.js";
|
|
|
17
17
|
import { SecureSession } from "../../session/SecureSession.js";
|
|
18
18
|
import { Time, Timer } from "../../time/Time.js";
|
|
19
19
|
import { TlvSchema, TypeFromSchema } from "../../tlv/TlvSchema.js";
|
|
20
|
+
import { MaybePromise } from "../../util/Promises.js";
|
|
21
|
+
import { isObject } from "../../util/Type.js";
|
|
20
22
|
import { RetransmissionLimitReachedError } from "../MessageExchange.js";
|
|
21
23
|
import { AttributeReportPayload, EventReportPayload } from "./AttributeDataEncoder.js";
|
|
22
|
-
import {
|
|
24
|
+
import { EventStorageData } from "./EventHandler.js";
|
|
23
25
|
import { InteractionEndpointStructure } from "./InteractionEndpointStructure.js";
|
|
24
26
|
import { InteractionServerMessenger } from "./InteractionMessenger.js";
|
|
25
27
|
import {
|
|
@@ -48,6 +50,7 @@ const logger = Logger.get("SubscriptionHandler");
|
|
|
48
50
|
|
|
49
51
|
interface AttributePathWithValueVersion<T> {
|
|
50
52
|
path: TypeFromSchema<typeof TlvAttributePath>;
|
|
53
|
+
attribute: AnyAttributeServer<T>;
|
|
51
54
|
schema: TlvSchema<T>;
|
|
52
55
|
value: T;
|
|
53
56
|
version: number;
|
|
@@ -55,11 +58,28 @@ interface AttributePathWithValueVersion<T> {
|
|
|
55
58
|
|
|
56
59
|
interface EventPathWithEventData<T> {
|
|
57
60
|
path: TypeFromSchema<typeof TlvEventPath>;
|
|
61
|
+
event: AnyEventServer<any, any>;
|
|
58
62
|
schema: TlvSchema<T>;
|
|
59
|
-
|
|
63
|
+
data: EventStorageData<T>;
|
|
60
64
|
}
|
|
61
65
|
|
|
62
66
|
export class SubscriptionHandler {
|
|
67
|
+
readonly subscriptionId: number;
|
|
68
|
+
private readonly session: SecureSession<any>;
|
|
69
|
+
private readonly endpointStructure: InteractionEndpointStructure;
|
|
70
|
+
private readonly attributeRequests?: TypeFromSchema<typeof TlvAttributePath>[];
|
|
71
|
+
private readonly dataVersionFilters?: TypeFromSchema<typeof TlvDataVersionFilter>[];
|
|
72
|
+
private readonly eventRequests?: TypeFromSchema<typeof TlvEventPath>[];
|
|
73
|
+
private readonly eventFilters?: TypeFromSchema<typeof TlvEventFilter>[];
|
|
74
|
+
private readonly isFabricFiltered: boolean;
|
|
75
|
+
private readonly cancelCallback: () => void;
|
|
76
|
+
private readonly readAttribute: (path: AttributePath, attribute: AnyAttributeServer<any>) => Promise<any>;
|
|
77
|
+
private readonly readEvent: (
|
|
78
|
+
path: EventPath,
|
|
79
|
+
event: AnyEventServer<any, any>,
|
|
80
|
+
eventFilters: TypeFromSchema<typeof TlvEventFilter>[] | undefined,
|
|
81
|
+
) => Promise<EventStorageData<any>[]>;
|
|
82
|
+
|
|
63
83
|
private lastUpdateTimeMs = 0;
|
|
64
84
|
private updateTimer: Timer;
|
|
65
85
|
private readonly sendDelayTimer: Timer;
|
|
@@ -75,7 +95,7 @@ export class SubscriptionHandler {
|
|
|
75
95
|
private readonly eventListeners = new Map<
|
|
76
96
|
string,
|
|
77
97
|
{
|
|
78
|
-
event:
|
|
98
|
+
event: AnyEventServer<any, any>;
|
|
79
99
|
listener?: (newEvent: EventStorageData<any>) => void;
|
|
80
100
|
}
|
|
81
101
|
>();
|
|
@@ -91,22 +111,54 @@ export class SubscriptionHandler {
|
|
|
91
111
|
private sendingUpdateInProgress = false;
|
|
92
112
|
private sendNextUpdateImmediately = false;
|
|
93
113
|
private sendUpdateErrorCounter = 0;
|
|
114
|
+
private attributeUpdatePromises = new Set<PromiseLike<void>>();
|
|
115
|
+
|
|
116
|
+
constructor(options: {
|
|
117
|
+
subscriptionId: number;
|
|
118
|
+
session: SecureSession<any>;
|
|
119
|
+
endpointStructure: InteractionEndpointStructure;
|
|
120
|
+
attributeRequests?: TypeFromSchema<typeof TlvAttributePath>[];
|
|
121
|
+
dataVersionFilters?: TypeFromSchema<typeof TlvDataVersionFilter>[];
|
|
122
|
+
eventRequests?: TypeFromSchema<typeof TlvEventPath>[];
|
|
123
|
+
eventFilters?: TypeFromSchema<typeof TlvEventFilter>[];
|
|
124
|
+
isFabricFiltered: boolean;
|
|
125
|
+
minIntervalFloor: number;
|
|
126
|
+
maxIntervalCeiling: number;
|
|
127
|
+
cancelCallback: () => void;
|
|
128
|
+
subscriptionOptions: SubscriptionOptions.Configuration;
|
|
129
|
+
readAttribute: (path: AttributePath, attribute: AnyAttributeServer<any>) => Promise<any>;
|
|
130
|
+
readEvent: (
|
|
131
|
+
path: EventPath,
|
|
132
|
+
event: AnyEventServer<any, any>,
|
|
133
|
+
eventFilters: TypeFromSchema<typeof TlvEventFilter>[] | undefined,
|
|
134
|
+
) => Promise<EventStorageData<any>[]>;
|
|
135
|
+
}) {
|
|
136
|
+
const {
|
|
137
|
+
subscriptionId,
|
|
138
|
+
session,
|
|
139
|
+
endpointStructure,
|
|
140
|
+
attributeRequests,
|
|
141
|
+
dataVersionFilters,
|
|
142
|
+
eventRequests,
|
|
143
|
+
eventFilters,
|
|
144
|
+
isFabricFiltered,
|
|
145
|
+
minIntervalFloor,
|
|
146
|
+
maxIntervalCeiling,
|
|
147
|
+
cancelCallback,
|
|
148
|
+
subscriptionOptions,
|
|
149
|
+
} = options;
|
|
150
|
+
this.subscriptionId = subscriptionId;
|
|
151
|
+
this.session = session;
|
|
152
|
+
this.endpointStructure = endpointStructure;
|
|
153
|
+
this.attributeRequests = attributeRequests;
|
|
154
|
+
this.dataVersionFilters = dataVersionFilters;
|
|
155
|
+
this.eventRequests = eventRequests;
|
|
156
|
+
this.eventFilters = eventFilters;
|
|
157
|
+
this.isFabricFiltered = isFabricFiltered;
|
|
158
|
+
this.cancelCallback = cancelCallback;
|
|
159
|
+
this.readAttribute = options.readAttribute;
|
|
160
|
+
this.readEvent = options.readEvent;
|
|
94
161
|
|
|
95
|
-
constructor(
|
|
96
|
-
readonly subscriptionId: number,
|
|
97
|
-
private readonly session: SecureSession<any>,
|
|
98
|
-
private readonly endpointStructure: InteractionEndpointStructure,
|
|
99
|
-
private readonly attributeRequests: TypeFromSchema<typeof TlvAttributePath>[] | undefined,
|
|
100
|
-
private readonly dataVersionFilters: TypeFromSchema<typeof TlvDataVersionFilter>[] | undefined,
|
|
101
|
-
private readonly eventRequests: TypeFromSchema<typeof TlvEventPath>[] | undefined,
|
|
102
|
-
private readonly eventFilters: TypeFromSchema<typeof TlvEventFilter>[] | undefined,
|
|
103
|
-
private readonly eventHandler: EventHandler,
|
|
104
|
-
private readonly isFabricFiltered: boolean,
|
|
105
|
-
minIntervalFloor: number,
|
|
106
|
-
maxIntervalCeiling: number,
|
|
107
|
-
private readonly cancelCallback: () => void,
|
|
108
|
-
subscriptionOptions: SubscriptionOptions.Configuration,
|
|
109
|
-
) {
|
|
110
162
|
this.server = this.session.context;
|
|
111
163
|
this.fabric = this.session.associatedFabric;
|
|
112
164
|
this.peerNodeId = this.session.peerNodeId;
|
|
@@ -229,6 +281,7 @@ export class SubscriptionHandler {
|
|
|
229
281
|
}
|
|
230
282
|
if (attribute.isSubscribable) {
|
|
231
283
|
// If subscribable register listener
|
|
284
|
+
// TODO: Move to state change listeners from behaviors to remove the dangling promise here
|
|
232
285
|
const listener = (value: any, version: number) =>
|
|
233
286
|
this.attributeChangeListener(path, attribute.schema, version, value);
|
|
234
287
|
attribute.addValueChangeListener(listener);
|
|
@@ -349,16 +402,17 @@ export class SubscriptionHandler {
|
|
|
349
402
|
* Newly added attributes are then treated ad "changed values" and will be sent as subscription data update to the
|
|
350
403
|
* controller. The data of newly added events are not sent automatically.
|
|
351
404
|
*/
|
|
352
|
-
updateSubscription() {
|
|
405
|
+
async updateSubscription() {
|
|
353
406
|
const { newAttributes } = this.registerNewAttributes();
|
|
354
407
|
|
|
355
408
|
for (const { path, attribute } of newAttributes) {
|
|
356
|
-
const { version, value } =
|
|
409
|
+
const { version, value } = await this.readAttribute(path, attribute);
|
|
357
410
|
|
|
358
411
|
// We do not do any version filtering for attributes that are newly added to make sure controller gets
|
|
359
412
|
// most current state
|
|
360
413
|
|
|
361
414
|
this.outstandingAttributeUpdates.set(attributePathToId(path), {
|
|
415
|
+
attribute,
|
|
362
416
|
path,
|
|
363
417
|
schema: attribute.schema,
|
|
364
418
|
version,
|
|
@@ -368,18 +422,20 @@ export class SubscriptionHandler {
|
|
|
368
422
|
|
|
369
423
|
const { newEvents } = this.registerNewEvents();
|
|
370
424
|
newEvents
|
|
371
|
-
.flatMap(({ path, event
|
|
425
|
+
.flatMap(({ path, event }): EventPathWithEventData<any>[] => {
|
|
372
426
|
// But we use eventFilters because we do not want to send all events to the controller
|
|
373
|
-
const
|
|
374
|
-
|
|
427
|
+
const { schema } = event;
|
|
428
|
+
const matchingEvents = event.get(this.session, this.isFabricFiltered, undefined, this.eventFilters);
|
|
429
|
+
return matchingEvents.map(data => ({
|
|
430
|
+
event,
|
|
375
431
|
schema,
|
|
376
432
|
path,
|
|
377
|
-
|
|
433
|
+
data,
|
|
378
434
|
}));
|
|
379
435
|
})
|
|
380
436
|
.sort((a, b) => {
|
|
381
|
-
const eventNumberA = a.
|
|
382
|
-
const eventNumberB = b.
|
|
437
|
+
const eventNumberA = a.data?.eventNumber ?? EventNumber(0);
|
|
438
|
+
const eventNumberB = b.data?.eventNumber ?? EventNumber(0);
|
|
383
439
|
if (eventNumberA > eventNumberB) {
|
|
384
440
|
return 1;
|
|
385
441
|
} else if (eventNumberA < eventNumberB) {
|
|
@@ -457,8 +513,25 @@ export class SubscriptionHandler {
|
|
|
457
513
|
this.sendNextUpdateImmediately = true;
|
|
458
514
|
return;
|
|
459
515
|
}
|
|
460
|
-
|
|
516
|
+
|
|
517
|
+
// Get all outstanding updates, make sure the order is correct per endpoint and cluster
|
|
518
|
+
const attributeUpdatesToSend = new Array<AttributePathWithValueVersion<any>>();
|
|
519
|
+
const attributeUpdates: Record<string, AttributePathWithValueVersion<any>[]> = {};
|
|
520
|
+
Array.from(this.outstandingAttributeUpdates.values()).forEach(entry => {
|
|
521
|
+
const {
|
|
522
|
+
path: { nodeId, endpointId, clusterId },
|
|
523
|
+
} = entry;
|
|
524
|
+
const pathId = `${nodeId}-${endpointId}-${clusterId}`;
|
|
525
|
+
attributeUpdates[pathId] = attributeUpdates[pathId] ?? [];
|
|
526
|
+
attributeUpdates[pathId].push(entry);
|
|
527
|
+
});
|
|
461
528
|
this.outstandingAttributeUpdates.clear();
|
|
529
|
+
Object.values(attributeUpdates).forEach(data =>
|
|
530
|
+
attributeUpdatesToSend.push(
|
|
531
|
+
...data.sort(({ version: versionA }, { version: versionB }) => versionA - versionB),
|
|
532
|
+
),
|
|
533
|
+
);
|
|
534
|
+
|
|
462
535
|
const eventUpdatesToSend = Array.from(this.outstandingEventUpdates.values());
|
|
463
536
|
this.outstandingEventUpdates.clear();
|
|
464
537
|
this.lastUpdateTimeMs = Time.nowMs();
|
|
@@ -500,15 +573,7 @@ export class SubscriptionHandler {
|
|
|
500
573
|
}
|
|
501
574
|
}
|
|
502
575
|
|
|
503
|
-
async sendInitialReport(
|
|
504
|
-
messenger: InteractionServerMessenger,
|
|
505
|
-
readAttribute: (path: AttributePath, attribute: AnyAttributeServer<any>) => Promise<any>,
|
|
506
|
-
readEvent: (
|
|
507
|
-
path: EventPath,
|
|
508
|
-
event: EventServer<any, any>,
|
|
509
|
-
eventFilters: TypeFromSchema<typeof TlvEventFilter>[] | undefined,
|
|
510
|
-
) => Promise<EventStorageData<any>[]>,
|
|
511
|
-
) {
|
|
576
|
+
async sendInitialReport(messenger: InteractionServerMessenger) {
|
|
512
577
|
this.updateTimer.stop();
|
|
513
578
|
|
|
514
579
|
const { newAttributes, attributeErrors } = this.registerNewAttributes();
|
|
@@ -523,10 +588,11 @@ export class SubscriptionHandler {
|
|
|
523
588
|
value: any;
|
|
524
589
|
version: number;
|
|
525
590
|
schema: TlvSchema<any>;
|
|
591
|
+
attribute: AnyAttributeServer<any>;
|
|
526
592
|
}>();
|
|
527
593
|
for (const { path, attribute } of newAttributes) {
|
|
528
594
|
try {
|
|
529
|
-
const { value, version } = await readAttribute(path, attribute);
|
|
595
|
+
const { value, version } = await this.readAttribute(path, attribute);
|
|
530
596
|
if (value === undefined) continue;
|
|
531
597
|
|
|
532
598
|
const { nodeId, endpointId, clusterId } = path;
|
|
@@ -540,13 +606,14 @@ export class SubscriptionHandler {
|
|
|
540
606
|
continue;
|
|
541
607
|
}
|
|
542
608
|
|
|
543
|
-
attributes.push({ path, value, version, schema: attribute.schema });
|
|
609
|
+
attributes.push({ path, value, version, schema: attribute.schema, attribute });
|
|
544
610
|
} catch (error) {
|
|
545
611
|
logger.error(`Error reading attribute ${this.endpointStructure.resolveAttributeName(path)}:`, error);
|
|
546
612
|
}
|
|
547
613
|
}
|
|
548
614
|
const attributeReportsPayload: AttributeReportPayload[] = attributes.map(
|
|
549
|
-
({ path, schema, value, version }) => ({
|
|
615
|
+
({ path, schema, value, version, attribute }) => ({
|
|
616
|
+
hasFabricSensitiveData: attribute.hasFabricSensitiveData,
|
|
550
617
|
attributeData: {
|
|
551
618
|
path,
|
|
552
619
|
dataVersion: version,
|
|
@@ -555,7 +622,12 @@ export class SubscriptionHandler {
|
|
|
555
622
|
},
|
|
556
623
|
}),
|
|
557
624
|
);
|
|
558
|
-
attributeErrors.forEach(attributeStatus =>
|
|
625
|
+
attributeErrors.forEach(attributeStatus =>
|
|
626
|
+
attributeReportsPayload.push({
|
|
627
|
+
hasFabricSensitiveData: false,
|
|
628
|
+
attributeStatus,
|
|
629
|
+
}),
|
|
630
|
+
);
|
|
559
631
|
|
|
560
632
|
const { newEvents, eventErrors } = this.registerNewEvents();
|
|
561
633
|
|
|
@@ -564,12 +636,13 @@ export class SubscriptionHandler {
|
|
|
564
636
|
for (const { path, event } of newEvents) {
|
|
565
637
|
const { schema } = event;
|
|
566
638
|
try {
|
|
567
|
-
const matchingEvents = await readEvent(path, event, this.eventFilters);
|
|
639
|
+
const matchingEvents = await this.readEvent(path, event, this.eventFilters);
|
|
568
640
|
if (matchingEvents.length === 0) {
|
|
569
641
|
eventsFiltered = true;
|
|
570
642
|
} else {
|
|
571
643
|
matchingEvents.forEach(({ eventNumber, priority, epochTimestamp, data }) => {
|
|
572
644
|
eventReportsPayload.push({
|
|
645
|
+
hasFabricSensitiveData: event.hasFabricSensitiveData,
|
|
573
646
|
eventData: {
|
|
574
647
|
path,
|
|
575
648
|
eventNumber,
|
|
@@ -609,48 +682,82 @@ export class SubscriptionHandler {
|
|
|
609
682
|
);
|
|
610
683
|
}
|
|
611
684
|
|
|
612
|
-
eventErrors.forEach(eventStatus =>
|
|
685
|
+
eventErrors.forEach(eventStatus =>
|
|
686
|
+
eventReportsPayload.push({
|
|
687
|
+
hasFabricSensitiveData: false,
|
|
688
|
+
eventStatus,
|
|
689
|
+
}),
|
|
690
|
+
);
|
|
613
691
|
|
|
614
692
|
logger.debug(
|
|
615
693
|
`Initialize Subscription with ${attributes.length} attributes and ${eventReportsPayload.length} events.`,
|
|
616
694
|
);
|
|
617
695
|
this.lastUpdateTimeMs = Time.nowMs();
|
|
618
696
|
|
|
619
|
-
await messenger.sendDataReport(
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
697
|
+
await messenger.sendDataReport(
|
|
698
|
+
{
|
|
699
|
+
suppressResponse: false,
|
|
700
|
+
subscriptionId: this.subscriptionId,
|
|
701
|
+
interactionModelRevision: INTERACTION_MODEL_REVISION,
|
|
702
|
+
attributeReportsPayload, // TODO Return compressed response once https://github.com/project-chip/connectedhomeip/issues/29359 is solved
|
|
703
|
+
eventReportsPayload,
|
|
704
|
+
},
|
|
705
|
+
this.isFabricFiltered,
|
|
706
|
+
);
|
|
626
707
|
}
|
|
627
708
|
|
|
628
|
-
attributeChangeListener<T>(
|
|
629
|
-
path
|
|
709
|
+
attributeChangeListener<T>(path: AttributePath, schema: TlvSchema<T>, version: number, value: T) {
|
|
710
|
+
const changeResult = this.attributeChangeHandler(path, schema, version, value);
|
|
711
|
+
if (MaybePromise.is(changeResult)) {
|
|
712
|
+
const resolver = Promise.resolve(changeResult)
|
|
713
|
+
.catch(error => logger.error(`Error handling attribute change:`, error))
|
|
714
|
+
.finally(() => this.attributeUpdatePromises.delete(resolver));
|
|
715
|
+
this.attributeUpdatePromises.add(resolver);
|
|
716
|
+
}
|
|
717
|
+
}
|
|
718
|
+
|
|
719
|
+
attributeChangeHandler<T>(
|
|
720
|
+
path: AttributePath,
|
|
630
721
|
schema: TlvSchema<T>,
|
|
631
722
|
version: number,
|
|
632
723
|
value: T,
|
|
633
|
-
) {
|
|
724
|
+
): MaybePromise<void> {
|
|
634
725
|
const attributeListenerData = this.attributeListeners.get(attributePathToId(path));
|
|
635
726
|
if (attributeListenerData === undefined) return; // Ignore changes to attributes that are not subscribed to
|
|
636
727
|
|
|
637
728
|
const { attribute } = attributeListenerData;
|
|
638
729
|
if (attribute instanceof FabricScopedAttributeServer) {
|
|
639
730
|
// We can not be sure what value we got for fabric filtered attributes (and from which fabric),
|
|
640
|
-
// so get it again for this relevant fabric
|
|
731
|
+
// so get it again for this relevant fabric. This also makes sure that fabric sensitive fields are filtered
|
|
641
732
|
// TODO: Maybe add try/catch when we add ACL handling and ignore the update if we can not get the value?
|
|
642
|
-
|
|
733
|
+
return this.readAttribute(path, attribute).then(({ value }) => {
|
|
734
|
+
this.outstandingAttributeUpdates.set(attributePathToId(path), {
|
|
735
|
+
attribute,
|
|
736
|
+
path,
|
|
737
|
+
schema,
|
|
738
|
+
version,
|
|
739
|
+
value,
|
|
740
|
+
});
|
|
741
|
+
this.prepareDataUpdate();
|
|
742
|
+
});
|
|
643
743
|
}
|
|
644
|
-
this.outstandingAttributeUpdates.set(attributePathToId(path), { path, schema, version, value });
|
|
744
|
+
this.outstandingAttributeUpdates.set(attributePathToId(path), { attribute, path, schema, version, value });
|
|
645
745
|
this.prepareDataUpdate();
|
|
646
746
|
}
|
|
647
747
|
|
|
648
|
-
eventChangeListener<T>(
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
748
|
+
eventChangeListener<T>(path: EventPath, schema: TlvSchema<T>, newEvent: EventStorageData<T>) {
|
|
749
|
+
const eventListenerData = this.eventListeners.get(eventPathToId(path));
|
|
750
|
+
if (eventListenerData === undefined) return; // Ignore changes to attributes that are not subscribed to
|
|
751
|
+
|
|
752
|
+
const { event } = eventListenerData;
|
|
753
|
+
if (event instanceof FabricSensitiveEventServer) {
|
|
754
|
+
const { data } = newEvent;
|
|
755
|
+
if (isObject(data) && "fabricIndex" in data && data.fabricIndex !== this.session.fabric?.fabricIndex) {
|
|
756
|
+
// Ignore events from different fabrics because events are kind of always fabric filtered
|
|
757
|
+
return;
|
|
758
|
+
}
|
|
759
|
+
}
|
|
760
|
+
this.outstandingEventUpdates.add({ event, path, schema, data: newEvent });
|
|
654
761
|
if (path.isUrgent) {
|
|
655
762
|
this.prepareDataUpdate();
|
|
656
763
|
}
|
|
@@ -668,6 +775,11 @@ export class SubscriptionHandler {
|
|
|
668
775
|
|
|
669
776
|
async cancel(flush = false, cancelledByPeer = false) {
|
|
670
777
|
this.sendUpdatesActivated = false;
|
|
778
|
+
if (this.attributeUpdatePromises.size) {
|
|
779
|
+
const resolvers = [...this.attributeUpdatePromises.values()];
|
|
780
|
+
this.attributeUpdatePromises.clear();
|
|
781
|
+
await Promise.all(resolvers);
|
|
782
|
+
}
|
|
671
783
|
this.updateTimer.stop();
|
|
672
784
|
this.sendDelayTimer.stop();
|
|
673
785
|
this.unregisterAttributeListeners(Array.from(this.attributeListeners.keys()));
|
|
@@ -705,38 +817,49 @@ export class SubscriptionHandler {
|
|
|
705
817
|
await tryCatchAsync(
|
|
706
818
|
async () => {
|
|
707
819
|
if (attributes.length === 0 && events.length === 0) {
|
|
708
|
-
await messenger.sendDataReport(
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
820
|
+
await messenger.sendDataReport(
|
|
821
|
+
{
|
|
822
|
+
suppressResponse: true, // suppressResponse ok for empty DataReports
|
|
823
|
+
subscriptionId: this.subscriptionId,
|
|
824
|
+
interactionModelRevision: INTERACTION_MODEL_REVISION,
|
|
825
|
+
},
|
|
826
|
+
this.isFabricFiltered,
|
|
827
|
+
);
|
|
713
828
|
} else {
|
|
714
|
-
await messenger.sendDataReport(
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
path,
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
|
|
829
|
+
await messenger.sendDataReport(
|
|
830
|
+
{
|
|
831
|
+
suppressResponse: false,
|
|
832
|
+
subscriptionId: this.subscriptionId,
|
|
833
|
+
interactionModelRevision: INTERACTION_MODEL_REVISION,
|
|
834
|
+
// TODO Return compressed response once https://github.com/project-chip/connectedhomeip/issues/29359 is solved
|
|
835
|
+
attributeReportsPayload: attributes.map(
|
|
836
|
+
({ path, schema, value, version, attribute }) => ({
|
|
837
|
+
hasFabricSensitiveData: attribute.hasFabricSensitiveData,
|
|
838
|
+
attributeData: {
|
|
839
|
+
path,
|
|
840
|
+
dataVersion: version,
|
|
841
|
+
schema,
|
|
842
|
+
payload: value,
|
|
843
|
+
},
|
|
844
|
+
}),
|
|
845
|
+
),
|
|
846
|
+
eventReportsPayload: events.map(({ path, schema, event, data }) => {
|
|
847
|
+
const { eventNumber, priority, epochTimestamp, data: payload } = data;
|
|
848
|
+
return {
|
|
849
|
+
hasFabricSensitiveData: event.hasFabricSensitiveData,
|
|
850
|
+
eventData: {
|
|
851
|
+
path,
|
|
852
|
+
eventNumber,
|
|
853
|
+
priority,
|
|
854
|
+
epochTimestamp,
|
|
855
|
+
schema,
|
|
856
|
+
payload,
|
|
857
|
+
},
|
|
858
|
+
};
|
|
737
859
|
}),
|
|
738
|
-
|
|
739
|
-
|
|
860
|
+
},
|
|
861
|
+
this.isFabricFiltered,
|
|
862
|
+
);
|
|
740
863
|
}
|
|
741
864
|
},
|
|
742
865
|
StatusResponseError,
|
|
@@ -290,7 +290,8 @@ export class SecureSession<T> extends Session<T> {
|
|
|
290
290
|
}
|
|
291
291
|
|
|
292
292
|
async clearSubscriptions(flushSubscriptions = false) {
|
|
293
|
-
|
|
293
|
+
const subscriptions = [...this.#subscriptions]; // get all values because subscriptions will remove themselves when cancelled
|
|
294
|
+
for (const subscription of subscriptions) {
|
|
294
295
|
await subscription.cancel(flushSubscriptions);
|
|
295
296
|
}
|
|
296
297
|
this.#subscriptions.length = 0;
|
|
@@ -8,6 +8,7 @@ import { MatterFlowError } from "../common/MatterError.js";
|
|
|
8
8
|
import { Crypto } from "../crypto/Crypto.js";
|
|
9
9
|
import { CaseAuthenticatedTag } from "../datatype/CaseAuthenticatedTag.js";
|
|
10
10
|
import { FabricId } from "../datatype/FabricId.js";
|
|
11
|
+
import { FabricIndex } from "../datatype/FabricIndex.js";
|
|
11
12
|
import { NodeId } from "../datatype/NodeId.js";
|
|
12
13
|
import { Fabric } from "../fabric/Fabric.js";
|
|
13
14
|
import { Logger } from "../log/Logger.js";
|
|
@@ -343,6 +344,14 @@ export class SessionManager<ContextT> {
|
|
|
343
344
|
}));
|
|
344
345
|
}
|
|
345
346
|
|
|
347
|
+
async clearSubscriptionsForNode(fabricIndex: FabricIndex, nodeId: NodeId, flushSubscriptions?: boolean) {
|
|
348
|
+
for (const session of this.#sessions) {
|
|
349
|
+
if (session.fabric?.fabricIndex === fabricIndex && session.peerNodeId === nodeId) {
|
|
350
|
+
await session.clearSubscriptions(flushSubscriptions);
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
|
|
346
355
|
async close() {
|
|
347
356
|
await this.storeResumptionRecords();
|
|
348
357
|
for (const session of this.#sessions) {
|
package/src/tlv/TlvArray.ts
CHANGED
|
@@ -10,7 +10,7 @@ import { ValidationError } from "../common/ValidationError.js";
|
|
|
10
10
|
import { deepCopy } from "../util/DeepCopy.js";
|
|
11
11
|
import { serialize } from "../util/String.js";
|
|
12
12
|
import { TlvTag, TlvType, TlvTypeLength } from "./TlvCodec.js";
|
|
13
|
-
import { TlvReader, TlvSchema, TlvStream, TlvWriter } from "./TlvSchema.js";
|
|
13
|
+
import { TlvEncodingOptions, TlvReader, TlvSchema, TlvStream, TlvWriter } from "./TlvSchema.js";
|
|
14
14
|
|
|
15
15
|
export type LengthConstraints = {
|
|
16
16
|
minLength?: number;
|
|
@@ -38,9 +38,9 @@ export class ArraySchema<T> extends TlvSchema<T[]> {
|
|
|
38
38
|
super();
|
|
39
39
|
}
|
|
40
40
|
|
|
41
|
-
override encodeTlvInternal(writer: TlvWriter, value: T[], tag?: TlvTag,
|
|
41
|
+
override encodeTlvInternal(writer: TlvWriter, value: T[], tag?: TlvTag, options?: TlvEncodingOptions): void {
|
|
42
42
|
writer.writeTag({ type: TlvType.Array }, tag);
|
|
43
|
-
value.forEach(element => this.elementSchema.encodeTlvInternal(writer, element, undefined,
|
|
43
|
+
value.forEach(element => this.elementSchema.encodeTlvInternal(writer, element, undefined, options));
|
|
44
44
|
writer.writeTag({ type: TlvType.EndOfContainer });
|
|
45
45
|
}
|
|
46
46
|
|
package/src/tlv/TlvNullable.ts
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
|
|
7
7
|
import { ArraySchema } from "./TlvArray.js";
|
|
8
8
|
import { TlvTag, TlvType, TlvTypeLength } from "./TlvCodec.js";
|
|
9
|
-
import { TlvReader, TlvSchema, TlvWriter } from "./TlvSchema.js";
|
|
9
|
+
import { TlvEncodingOptions, TlvReader, TlvSchema, TlvWriter } from "./TlvSchema.js";
|
|
10
10
|
import { StringSchema } from "./TlvString.js";
|
|
11
11
|
|
|
12
12
|
/**
|
|
@@ -19,11 +19,11 @@ export class NullableSchema<T> extends TlvSchema<T | null> {
|
|
|
19
19
|
super();
|
|
20
20
|
}
|
|
21
21
|
|
|
22
|
-
override encodeTlvInternal(writer: TlvWriter, value: T | null, tag?: TlvTag,
|
|
22
|
+
override encodeTlvInternal(writer: TlvWriter, value: T | null, tag?: TlvTag, options?: TlvEncodingOptions): void {
|
|
23
23
|
if (value === null) {
|
|
24
24
|
writer.writeTag({ type: TlvType.Null }, tag);
|
|
25
25
|
} else {
|
|
26
|
-
this.schema.encodeTlvInternal(writer, value, tag,
|
|
26
|
+
this.schema.encodeTlvInternal(writer, value, tag, options);
|
|
27
27
|
}
|
|
28
28
|
}
|
|
29
29
|
|