@matter/protocol 0.14.1-alpha.0-20250605-9fc134af0 → 0.14.1-alpha.0-20250606-a9bcd03f9
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/action/server/AccessControl.d.ts +5 -7
- package/dist/cjs/action/server/AccessControl.d.ts.map +1 -1
- package/dist/cjs/action/server/AccessControl.js.map +1 -1
- package/dist/cjs/action/server/AttributeWriteResponse.d.ts.map +1 -1
- package/dist/cjs/action/server/AttributeWriteResponse.js +23 -0
- package/dist/cjs/action/server/AttributeWriteResponse.js.map +1 -1
- package/dist/cjs/action/server/CommandInvokeResponse.d.ts.map +1 -1
- package/dist/cjs/action/server/CommandInvokeResponse.js +24 -1
- package/dist/cjs/action/server/CommandInvokeResponse.js.map +1 -1
- package/dist/cjs/action/server/DataResponse.d.ts +1 -1
- package/dist/cjs/action/server/DataResponse.d.ts.map +1 -1
- package/dist/cjs/action/server/Subject.d.ts +25 -0
- package/dist/cjs/action/server/Subject.d.ts.map +1 -0
- package/dist/cjs/action/server/Subject.js +54 -0
- package/dist/cjs/action/server/Subject.js.map +6 -0
- package/dist/cjs/action/server/index.d.ts +1 -0
- package/dist/cjs/action/server/index.d.ts.map +1 -1
- package/dist/cjs/action/server/index.js +1 -0
- package/dist/cjs/action/server/index.js.map +1 -1
- package/dist/cjs/certificate/DeviceCertification.d.ts +2 -2
- package/dist/cjs/certificate/DeviceCertification.d.ts.map +1 -1
- package/dist/cjs/certificate/DeviceCertification.js.map +1 -1
- package/dist/cjs/cluster/client/AttributeClient.d.ts +3 -3
- package/dist/cjs/cluster/client/AttributeClient.d.ts.map +1 -1
- package/dist/cjs/cluster/client/AttributeClient.js +14 -2
- package/dist/cjs/cluster/client/AttributeClient.js.map +1 -1
- package/dist/cjs/cluster/client/ClusterClient.d.ts +3 -2
- package/dist/cjs/cluster/client/ClusterClient.d.ts.map +1 -1
- package/dist/cjs/cluster/client/ClusterClient.js +60 -1
- package/dist/cjs/cluster/client/ClusterClient.js.map +1 -1
- package/dist/cjs/cluster/client/ClusterClientTypes.d.ts +33 -8
- package/dist/cjs/cluster/client/ClusterClientTypes.d.ts.map +1 -1
- package/dist/cjs/cluster/client/EventClient.d.ts +3 -3
- package/dist/cjs/cluster/client/EventClient.d.ts.map +1 -1
- package/dist/cjs/cluster/client/EventClient.js +7 -0
- package/dist/cjs/cluster/client/EventClient.js.map +1 -1
- package/dist/cjs/codec/MessageCodec.d.ts.map +1 -1
- package/dist/cjs/codec/MessageCodec.js +31 -6
- package/dist/cjs/codec/MessageCodec.js.map +1 -1
- package/dist/cjs/fabric/Fabric.d.ts +20 -30
- package/dist/cjs/fabric/Fabric.d.ts.map +1 -1
- package/dist/cjs/fabric/Fabric.js +38 -62
- package/dist/cjs/fabric/Fabric.js.map +2 -2
- package/dist/cjs/fabric/FabricManager.d.ts.map +1 -1
- package/dist/cjs/fabric/FabricManager.js +10 -4
- package/dist/cjs/fabric/FabricManager.js.map +1 -1
- package/dist/cjs/groups/FabricGroupsManager.d.ts +46 -0
- package/dist/cjs/groups/FabricGroupsManager.d.ts.map +1 -0
- package/dist/cjs/groups/FabricGroupsManager.js +155 -0
- package/dist/cjs/groups/FabricGroupsManager.js.map +6 -0
- package/dist/cjs/groups/Groups.d.ts +34 -0
- package/dist/cjs/groups/Groups.d.ts.map +1 -0
- package/dist/cjs/groups/Groups.js +89 -0
- package/dist/cjs/groups/Groups.js.map +6 -0
- package/dist/cjs/groups/KeySets.d.ts +64 -0
- package/dist/cjs/groups/KeySets.d.ts.map +1 -0
- package/dist/cjs/groups/KeySets.js +179 -0
- package/dist/cjs/groups/KeySets.js.map +6 -0
- package/dist/cjs/groups/MessagingState.d.ts +24 -0
- package/dist/cjs/groups/MessagingState.d.ts.map +1 -0
- package/dist/cjs/groups/MessagingState.js +91 -0
- package/dist/cjs/groups/MessagingState.js.map +6 -0
- package/dist/cjs/groups/index.d.ts +8 -0
- package/dist/cjs/groups/index.d.ts.map +1 -0
- package/dist/cjs/groups/index.js +25 -0
- package/dist/cjs/groups/index.js.map +6 -0
- package/dist/cjs/index.d.ts +1 -0
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +1 -0
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/interaction/AccessControlManager.d.ts +4 -13
- package/dist/cjs/interaction/AccessControlManager.d.ts.map +1 -1
- package/dist/cjs/interaction/AccessControlManager.js +38 -47
- package/dist/cjs/interaction/AccessControlManager.js.map +1 -1
- package/dist/cjs/interaction/InteractionClient.d.ts +5 -4
- package/dist/cjs/interaction/InteractionClient.d.ts.map +1 -1
- package/dist/cjs/interaction/InteractionClient.js +53 -3
- package/dist/cjs/interaction/InteractionClient.js.map +1 -1
- package/dist/cjs/interaction/InteractionMessenger.d.ts.map +1 -1
- package/dist/cjs/interaction/InteractionMessenger.js +15 -0
- package/dist/cjs/interaction/InteractionMessenger.js.map +1 -1
- package/dist/cjs/interaction/Subscription.d.ts +3 -3
- package/dist/cjs/interaction/Subscription.d.ts.map +1 -1
- package/dist/cjs/interaction/Subscription.js.map +1 -1
- package/dist/cjs/peer/PeerAddress.d.ts +1 -0
- package/dist/cjs/peer/PeerAddress.d.ts.map +1 -1
- package/dist/cjs/peer/PeerAddress.js +5 -0
- package/dist/cjs/peer/PeerAddress.js.map +1 -1
- package/dist/cjs/peer/PeerSet.d.ts.map +1 -1
- package/dist/cjs/peer/PeerSet.js +31 -2
- package/dist/cjs/peer/PeerSet.js.map +1 -1
- package/dist/cjs/protocol/ChannelManager.d.ts.map +1 -1
- package/dist/cjs/protocol/ChannelManager.js +7 -8
- package/dist/cjs/protocol/ChannelManager.js.map +1 -1
- package/dist/cjs/protocol/ExchangeManager.d.ts.map +1 -1
- package/dist/cjs/protocol/ExchangeManager.js +39 -25
- package/dist/cjs/protocol/ExchangeManager.js.map +1 -1
- package/dist/cjs/protocol/MessageExchange.d.ts +1 -1
- package/dist/cjs/protocol/MessageExchange.d.ts.map +1 -1
- package/dist/cjs/protocol/MessageExchange.js +32 -4
- package/dist/cjs/protocol/MessageExchange.js.map +1 -1
- package/dist/cjs/protocol/MessageReceptionState.d.ts +1 -1
- package/dist/cjs/securechannel/SecureChannelProtocol.js +1 -1
- package/dist/cjs/securechannel/SecureChannelProtocol.js.map +1 -1
- package/dist/cjs/session/GroupSession.d.ts +56 -0
- package/dist/cjs/session/GroupSession.d.ts.map +1 -0
- package/dist/cjs/session/GroupSession.js +188 -0
- package/dist/cjs/session/GroupSession.js.map +6 -0
- package/dist/cjs/session/InsecureSession.d.ts +2 -1
- package/dist/cjs/session/InsecureSession.d.ts.map +1 -1
- package/dist/cjs/session/InsecureSession.js +3 -2
- package/dist/cjs/session/InsecureSession.js.map +1 -1
- package/dist/cjs/session/NodeSession.d.ts +88 -0
- package/dist/cjs/session/NodeSession.d.ts.map +1 -0
- package/dist/cjs/session/NodeSession.js +318 -0
- package/dist/cjs/session/NodeSession.js.map +6 -0
- package/dist/cjs/session/SecureSession.d.ts +10 -75
- package/dist/cjs/session/SecureSession.d.ts.map +1 -1
- package/dist/cjs/session/SecureSession.js +9 -280
- package/dist/cjs/session/SecureSession.js.map +2 -2
- package/dist/cjs/session/Session.d.ts +6 -5
- package/dist/cjs/session/Session.d.ts.map +1 -1
- package/dist/cjs/session/Session.js +11 -1
- package/dist/cjs/session/Session.js.map +1 -1
- package/dist/cjs/session/SessionManager.d.ts +27 -9
- package/dist/cjs/session/SessionManager.d.ts.map +1 -1
- package/dist/cjs/session/SessionManager.js +83 -5
- package/dist/cjs/session/SessionManager.js.map +2 -2
- package/dist/cjs/session/case/CaseClient.d.ts +1 -1
- package/dist/cjs/session/case/CaseClient.js +2 -2
- package/dist/cjs/session/case/CaseClient.js.map +1 -1
- package/dist/cjs/session/index.d.ts +2 -0
- package/dist/cjs/session/index.d.ts.map +1 -1
- package/dist/cjs/session/index.js +2 -0
- package/dist/cjs/session/index.js.map +1 -1
- package/dist/cjs/session/pase/PaseClient.d.ts +1 -1
- package/dist/esm/action/server/AccessControl.d.ts +5 -7
- package/dist/esm/action/server/AccessControl.d.ts.map +1 -1
- package/dist/esm/action/server/AccessControl.js.map +1 -1
- package/dist/esm/action/server/AttributeWriteResponse.d.ts.map +1 -1
- package/dist/esm/action/server/AttributeWriteResponse.js +23 -0
- package/dist/esm/action/server/AttributeWriteResponse.js.map +1 -1
- package/dist/esm/action/server/CommandInvokeResponse.d.ts.map +1 -1
- package/dist/esm/action/server/CommandInvokeResponse.js +24 -1
- package/dist/esm/action/server/CommandInvokeResponse.js.map +1 -1
- package/dist/esm/action/server/DataResponse.d.ts +1 -1
- package/dist/esm/action/server/DataResponse.d.ts.map +1 -1
- package/dist/esm/action/server/Subject.d.ts +25 -0
- package/dist/esm/action/server/Subject.d.ts.map +1 -0
- package/dist/esm/action/server/Subject.js +34 -0
- package/dist/esm/action/server/Subject.js.map +6 -0
- package/dist/esm/action/server/index.d.ts +1 -0
- package/dist/esm/action/server/index.d.ts.map +1 -1
- package/dist/esm/action/server/index.js +1 -0
- package/dist/esm/action/server/index.js.map +1 -1
- package/dist/esm/certificate/DeviceCertification.d.ts +2 -2
- package/dist/esm/certificate/DeviceCertification.d.ts.map +1 -1
- package/dist/esm/certificate/DeviceCertification.js.map +1 -1
- package/dist/esm/cluster/client/AttributeClient.d.ts +3 -3
- package/dist/esm/cluster/client/AttributeClient.d.ts.map +1 -1
- package/dist/esm/cluster/client/AttributeClient.js +13 -1
- package/dist/esm/cluster/client/AttributeClient.js.map +1 -1
- package/dist/esm/cluster/client/ClusterClient.d.ts +3 -2
- package/dist/esm/cluster/client/ClusterClient.d.ts.map +1 -1
- package/dist/esm/cluster/client/ClusterClient.js +61 -2
- package/dist/esm/cluster/client/ClusterClient.js.map +1 -1
- package/dist/esm/cluster/client/ClusterClientTypes.d.ts +33 -8
- package/dist/esm/cluster/client/ClusterClientTypes.d.ts.map +1 -1
- package/dist/esm/cluster/client/EventClient.d.ts +3 -3
- package/dist/esm/cluster/client/EventClient.d.ts.map +1 -1
- package/dist/esm/cluster/client/EventClient.js +7 -0
- package/dist/esm/cluster/client/EventClient.js.map +1 -1
- package/dist/esm/codec/MessageCodec.d.ts.map +1 -1
- package/dist/esm/codec/MessageCodec.js +41 -7
- package/dist/esm/codec/MessageCodec.js.map +1 -1
- package/dist/esm/fabric/Fabric.d.ts +20 -30
- package/dist/esm/fabric/Fabric.d.ts.map +1 -1
- package/dist/esm/fabric/Fabric.js +38 -62
- package/dist/esm/fabric/Fabric.js.map +2 -2
- package/dist/esm/fabric/FabricManager.d.ts.map +1 -1
- package/dist/esm/fabric/FabricManager.js +10 -4
- package/dist/esm/fabric/FabricManager.js.map +1 -1
- package/dist/esm/groups/FabricGroupsManager.d.ts +46 -0
- package/dist/esm/groups/FabricGroupsManager.d.ts.map +1 -0
- package/dist/esm/groups/FabricGroupsManager.js +135 -0
- package/dist/esm/groups/FabricGroupsManager.js.map +6 -0
- package/dist/esm/groups/Groups.d.ts +34 -0
- package/dist/esm/groups/Groups.d.ts.map +1 -0
- package/dist/esm/groups/Groups.js +69 -0
- package/dist/esm/groups/Groups.js.map +6 -0
- package/dist/esm/groups/KeySets.d.ts +64 -0
- package/dist/esm/groups/KeySets.d.ts.map +1 -0
- package/dist/esm/groups/KeySets.js +159 -0
- package/dist/esm/groups/KeySets.js.map +6 -0
- package/dist/esm/groups/MessagingState.d.ts +24 -0
- package/dist/esm/groups/MessagingState.d.ts.map +1 -0
- package/dist/esm/groups/MessagingState.js +71 -0
- package/dist/esm/groups/MessagingState.js.map +6 -0
- package/dist/esm/groups/index.d.ts +8 -0
- package/dist/esm/groups/index.d.ts.map +1 -0
- package/dist/esm/groups/index.js +8 -0
- package/dist/esm/groups/index.js.map +6 -0
- package/dist/esm/index.d.ts +1 -0
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +1 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/interaction/AccessControlManager.d.ts +4 -13
- package/dist/esm/interaction/AccessControlManager.d.ts.map +1 -1
- package/dist/esm/interaction/AccessControlManager.js +39 -48
- package/dist/esm/interaction/AccessControlManager.js.map +1 -1
- package/dist/esm/interaction/InteractionClient.d.ts +5 -4
- package/dist/esm/interaction/InteractionClient.d.ts.map +1 -1
- package/dist/esm/interaction/InteractionClient.js +54 -4
- package/dist/esm/interaction/InteractionClient.js.map +1 -1
- package/dist/esm/interaction/InteractionMessenger.d.ts.map +1 -1
- package/dist/esm/interaction/InteractionMessenger.js +15 -0
- package/dist/esm/interaction/InteractionMessenger.js.map +1 -1
- package/dist/esm/interaction/Subscription.d.ts +3 -3
- package/dist/esm/interaction/Subscription.d.ts.map +1 -1
- package/dist/esm/interaction/Subscription.js.map +1 -1
- package/dist/esm/peer/PeerAddress.d.ts +1 -0
- package/dist/esm/peer/PeerAddress.d.ts.map +1 -1
- package/dist/esm/peer/PeerAddress.js +5 -0
- package/dist/esm/peer/PeerAddress.js.map +1 -1
- package/dist/esm/peer/PeerSet.d.ts.map +1 -1
- package/dist/esm/peer/PeerSet.js +33 -3
- package/dist/esm/peer/PeerSet.js.map +1 -1
- package/dist/esm/protocol/ChannelManager.d.ts.map +1 -1
- package/dist/esm/protocol/ChannelManager.js +7 -8
- package/dist/esm/protocol/ChannelManager.js.map +1 -1
- package/dist/esm/protocol/ExchangeManager.d.ts.map +1 -1
- package/dist/esm/protocol/ExchangeManager.js +41 -27
- package/dist/esm/protocol/ExchangeManager.js.map +1 -1
- package/dist/esm/protocol/MessageExchange.d.ts +1 -1
- package/dist/esm/protocol/MessageExchange.d.ts.map +1 -1
- package/dist/esm/protocol/MessageExchange.js +39 -5
- package/dist/esm/protocol/MessageExchange.js.map +1 -1
- package/dist/esm/protocol/MessageReceptionState.d.ts +1 -1
- package/dist/esm/securechannel/SecureChannelProtocol.js +2 -2
- package/dist/esm/securechannel/SecureChannelProtocol.js.map +1 -1
- package/dist/esm/session/GroupSession.d.ts +56 -0
- package/dist/esm/session/GroupSession.d.ts.map +1 -0
- package/dist/esm/session/GroupSession.js +177 -0
- package/dist/esm/session/GroupSession.js.map +6 -0
- package/dist/esm/session/InsecureSession.d.ts +2 -1
- package/dist/esm/session/InsecureSession.d.ts.map +1 -1
- package/dist/esm/session/InsecureSession.js +3 -2
- package/dist/esm/session/InsecureSession.js.map +1 -1
- package/dist/esm/session/NodeSession.d.ts +88 -0
- package/dist/esm/session/NodeSession.d.ts.map +1 -0
- package/dist/esm/session/NodeSession.js +298 -0
- package/dist/esm/session/NodeSession.js.map +6 -0
- package/dist/esm/session/SecureSession.d.ts +10 -75
- package/dist/esm/session/SecureSession.d.ts.map +1 -1
- package/dist/esm/session/SecureSession.js +10 -291
- package/dist/esm/session/SecureSession.js.map +2 -2
- package/dist/esm/session/Session.d.ts +6 -5
- package/dist/esm/session/Session.d.ts.map +1 -1
- package/dist/esm/session/Session.js +12 -2
- package/dist/esm/session/Session.js.map +1 -1
- package/dist/esm/session/SessionManager.d.ts +27 -9
- package/dist/esm/session/SessionManager.d.ts.map +1 -1
- package/dist/esm/session/SessionManager.js +84 -6
- package/dist/esm/session/SessionManager.js.map +1 -1
- package/dist/esm/session/case/CaseClient.d.ts +1 -1
- package/dist/esm/session/case/CaseClient.js +2 -2
- package/dist/esm/session/case/CaseClient.js.map +1 -1
- package/dist/esm/session/index.d.ts +2 -0
- package/dist/esm/session/index.d.ts.map +1 -1
- package/dist/esm/session/index.js +2 -0
- package/dist/esm/session/index.js.map +1 -1
- package/dist/esm/session/pase/PaseClient.d.ts +1 -1
- package/package.json +6 -6
- package/src/action/server/AccessControl.ts +4 -7
- package/src/action/server/AttributeWriteResponse.ts +29 -7
- package/src/action/server/CommandInvokeResponse.ts +28 -7
- package/src/action/server/DataResponse.ts +1 -1
- package/src/action/server/Subject.ts +45 -0
- package/src/action/server/index.ts +1 -0
- package/src/certificate/DeviceCertification.ts +2 -2
- package/src/cluster/client/AttributeClient.ts +15 -3
- package/src/cluster/client/ClusterClient.ts +90 -4
- package/src/cluster/client/ClusterClientTypes.ts +38 -9
- package/src/cluster/client/EventClient.ts +9 -2
- package/src/codec/MessageCodec.ts +49 -8
- package/src/fabric/Fabric.ts +51 -85
- package/src/fabric/FabricManager.ts +11 -4
- package/src/groups/FabricGroupsManager.ts +164 -0
- package/src/groups/Groups.ts +81 -0
- package/src/groups/KeySets.ts +194 -0
- package/src/groups/MessagingState.ts +76 -0
- package/src/groups/index.ts +8 -0
- package/src/index.ts +1 -0
- package/src/interaction/AccessControlManager.ts +49 -81
- package/src/interaction/InteractionClient.ts +66 -6
- package/src/interaction/InteractionMessenger.ts +15 -0
- package/src/interaction/Subscription.ts +3 -3
- package/src/peer/PeerAddress.ts +4 -0
- package/src/peer/PeerSet.ts +39 -4
- package/src/protocol/ChannelManager.ts +7 -9
- package/src/protocol/ExchangeManager.ts +51 -35
- package/src/protocol/MessageExchange.ts +42 -7
- package/src/protocol/MessageReceptionState.ts +2 -2
- package/src/securechannel/SecureChannelProtocol.ts +2 -2
- package/src/session/GroupSession.ts +223 -0
- package/src/session/InsecureSession.ts +3 -2
- package/src/session/NodeSession.ts +367 -0
- package/src/session/SecureSession.ts +14 -363
- package/src/session/Session.ts +17 -6
- package/src/session/SessionManager.ts +94 -14
- package/src/session/case/CaseClient.ts +2 -2
- package/src/session/index.ts +2 -3
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2022-2025 Matter.js Authors
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import { Subject } from "#action/index.js";
|
|
7
|
+
import { Fabric } from "#fabric/Fabric.js";
|
|
8
|
+
import { BasicMap } from "#general";
|
|
9
|
+
import { EndpointNumber, GroupId } from "#types";
|
|
10
|
+
import { KeySets, OperationalKeySet } from "./KeySets.js";
|
|
11
|
+
export declare class Groups {
|
|
12
|
+
#private;
|
|
13
|
+
/** Operational variant of the group table, maps group Ids to a list of enabled endpoints. */
|
|
14
|
+
readonly endpointMap: Map<GroupId, EndpointNumber[]>;
|
|
15
|
+
constructor(fabric: Fabric, keySets: KeySets<OperationalKeySet>);
|
|
16
|
+
/** Operative lookup of the group key sets by a group id and to react on added removed groups. */
|
|
17
|
+
get idMap(): BasicMap<GroupId, number>;
|
|
18
|
+
/** Updates the group key id map when changed in Group Key Management Cluster. Only changes are taken over. */
|
|
19
|
+
set idMap(map: Map<GroupId, number>);
|
|
20
|
+
subjectForGroup(id: GroupId, keySetId: number): Subject;
|
|
21
|
+
/** Returns the multicast address for a given group id for this fabric. */
|
|
22
|
+
multicastAddress(groupId: GroupId): string;
|
|
23
|
+
/**
|
|
24
|
+
* Returns the current operational group key for a given group id and returns the keys, start time and
|
|
25
|
+
* their session IDs.
|
|
26
|
+
*/
|
|
27
|
+
currentKeyForId(groupId: GroupId): {
|
|
28
|
+
keySetId: number;
|
|
29
|
+
key: Uint8Array;
|
|
30
|
+
sessionId?: number;
|
|
31
|
+
startTime: number | bigint;
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=Groups.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Groups.d.ts","sourceRoot":"","sources":["../../../src/groups/Groups.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,QAAQ,EAAsD,MAAM,UAAU,CAAC;AACxF,OAAO,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AACjD,OAAO,EAAE,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAE1D,qBAAa,MAAM;;IAOf,6FAA6F;IAC7F,QAAQ,CAAC,WAAW,iCAAwC;gBAEhD,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,iBAAiB,CAAC;IAK/D,iGAAiG;IACjG,IAAI,KAAK,IAAI,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,CAErC;IAED,8GAA8G;IAC9G,IAAI,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,EAUlC;IAED,eAAe,CAAC,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM;IAQ7C,0EAA0E;IAC1E,gBAAgB,CAAC,OAAO,EAAE,OAAO;IAgBjC;;;OAGG;IACH,eAAe,CAAC,OAAO,EAAE,OAAO;;;;;;CAOnC"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2022-2025 Matter.js Authors
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import { Subject } from "#action/index.js";
|
|
7
|
+
import { BasicMap, DataWriter, ImplementationError, ipv6BytesToString } from "#general";
|
|
8
|
+
import { GroupId } from "#types";
|
|
9
|
+
class Groups {
|
|
10
|
+
#fabric;
|
|
11
|
+
#keySets;
|
|
12
|
+
/** Operational variant of the group key map attribute from Group Key Management cluster, maps group Ids to key sets. */
|
|
13
|
+
#groupKeyIdMap = new BasicMap();
|
|
14
|
+
/** Operational variant of the group table, maps group Ids to a list of enabled endpoints. */
|
|
15
|
+
endpointMap = /* @__PURE__ */ new Map();
|
|
16
|
+
constructor(fabric, keySets) {
|
|
17
|
+
this.#fabric = fabric;
|
|
18
|
+
this.#keySets = keySets;
|
|
19
|
+
}
|
|
20
|
+
/** Operative lookup of the group key sets by a group id and to react on added removed groups. */
|
|
21
|
+
get idMap() {
|
|
22
|
+
return this.#groupKeyIdMap;
|
|
23
|
+
}
|
|
24
|
+
/** Updates the group key id map when changed in Group Key Management Cluster. Only changes are taken over. */
|
|
25
|
+
set idMap(map) {
|
|
26
|
+
for (const [groupId, keySetId] of map.entries()) {
|
|
27
|
+
this.#groupKeyIdMap.set(groupId, keySetId);
|
|
28
|
+
}
|
|
29
|
+
for (const groupId of this.#groupKeyIdMap.keys()) {
|
|
30
|
+
if (!map.has(groupId)) {
|
|
31
|
+
this.#groupKeyIdMap.delete(groupId);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
subjectForGroup(id, keySetId) {
|
|
36
|
+
return Subject.Group({
|
|
37
|
+
id,
|
|
38
|
+
hasValidMapping: this.idMap.get(id) === keySetId,
|
|
39
|
+
endpoints: this.endpointMap.get(id) ?? []
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
/** Returns the multicast address for a given group id for this fabric. */
|
|
43
|
+
multicastAddress(groupId) {
|
|
44
|
+
GroupId.assertGroupId(groupId);
|
|
45
|
+
const writer = new DataWriter();
|
|
46
|
+
writer.writeUInt16(65333);
|
|
47
|
+
writer.writeUInt16(64);
|
|
48
|
+
writer.writeUInt8(253);
|
|
49
|
+
writer.writeUInt64(this.#fabric.fabricId);
|
|
50
|
+
writer.writeUInt8(0);
|
|
51
|
+
writer.writeUInt16(GroupId(groupId));
|
|
52
|
+
return ipv6BytesToString(writer.toByteArray());
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Returns the current operational group key for a given group id and returns the keys, start time and
|
|
56
|
+
* their session IDs.
|
|
57
|
+
*/
|
|
58
|
+
currentKeyForId(groupId) {
|
|
59
|
+
const keySetId = this.#groupKeyIdMap.get(groupId);
|
|
60
|
+
if (keySetId === void 0) {
|
|
61
|
+
throw new ImplementationError(`No group key set found for groupId ${groupId}.`);
|
|
62
|
+
}
|
|
63
|
+
return { ...this.#keySets.currentKeyForId(keySetId), keySetId };
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
export {
|
|
67
|
+
Groups
|
|
68
|
+
};
|
|
69
|
+
//# sourceMappingURL=Groups.js.map
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/groups/Groups.ts"],
|
|
4
|
+
"mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;AAKA,SAAS,eAAe;AAExB,SAAS,UAAU,YAAY,qBAAqB,yBAAyB;AAC7E,SAAyB,eAAe;AAGjC,MAAM,OAAO;AAAA,EAChB;AAAA,EACA;AAAA;AAAA,EAGS,iBAAiB,IAAI,SAA0B;AAAA;AAAA,EAG/C,cAAc,oBAAI,IAA+B;AAAA,EAE1D,YAAY,QAAgB,SAAqC;AAC7D,SAAK,UAAU;AACf,SAAK,WAAW;AAAA,EACpB;AAAA;AAAA,EAGA,IAAI,QAAmC;AACnC,WAAO,KAAK;AAAA,EAChB;AAAA;AAAA,EAGA,IAAI,MAAM,KAA2B;AACjC,eAAW,CAAC,SAAS,QAAQ,KAAK,IAAI,QAAQ,GAAG;AAC7C,WAAK,eAAe,IAAI,SAAS,QAAQ;AAAA,IAC7C;AACA,eAAW,WAAW,KAAK,eAAe,KAAK,GAAG;AAC9C,UAAI,CAAC,IAAI,IAAI,OAAO,GAAG;AAEnB,aAAK,eAAe,OAAO,OAAO;AAAA,MACtC;AAAA,IACJ;AAAA,EACJ;AAAA,EAEA,gBAAgB,IAAa,UAAkB;AAC3C,WAAO,QAAQ,MAAM;AAAA,MACjB;AAAA,MACA,iBAAiB,KAAK,MAAM,IAAI,EAAE,MAAM;AAAA,MACxC,WAAW,KAAK,YAAY,IAAI,EAAE,KAAK,CAAC;AAAA,IAC5C,CAAC;AAAA,EACL;AAAA;AAAA,EAGA,iBAAiB,SAAkB;AAC/B,YAAQ,cAAc,OAAO;AAK7B,UAAM,SAAS,IAAI,WAAW;AAC9B,WAAO,YAAY,KAAM;AACzB,WAAO,YAAY,EAAM;AACzB,WAAO,WAAW,GAAI;AACtB,WAAO,YAAY,KAAK,QAAQ,QAAQ;AACxC,WAAO,WAAW,CAAI;AACtB,WAAO,YAAY,QAAQ,OAAO,CAAC;AACnC,WAAO,kBAAkB,OAAO,YAAY,CAAC;AAAA,EACjD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,gBAAgB,SAAkB;AAC9B,UAAM,WAAW,KAAK,eAAe,IAAI,OAAO;AAChD,QAAI,aAAa,QAAW;AACxB,YAAM,IAAI,oBAAoB,sCAAsC,OAAO,GAAG;AAAA,IAClF;AACA,WAAO,EAAE,GAAG,KAAK,SAAS,gBAAgB,QAAQ,GAAG,SAAS;AAAA,EAClE;AACJ;",
|
|
5
|
+
"names": []
|
|
6
|
+
}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2022-2025 Matter.js Authors
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import type { GroupKeyManagement } from "#clusters/group-key-management";
|
|
7
|
+
import { BasicSet } from "#general";
|
|
8
|
+
export declare const GROUP_KEY_INFO: Uint8Array<ArrayBufferLike>;
|
|
9
|
+
export declare class KeySets<T extends OperationalKeySet> extends BasicSet<T> {
|
|
10
|
+
#private;
|
|
11
|
+
get sessions(): Map<number, {
|
|
12
|
+
keySetId: number;
|
|
13
|
+
key: Uint8Array;
|
|
14
|
+
}[]>;
|
|
15
|
+
add(item: T): void;
|
|
16
|
+
delete<F extends keyof T>(itemOrField: T | F, value?: T[F]): boolean;
|
|
17
|
+
forId(groupKeySetId: number): OperationalKeySet | undefined;
|
|
18
|
+
/**
|
|
19
|
+
* Return an operative list of operational keys, start time and their session IDs for a specified
|
|
20
|
+
* group key set id. This is mainly used for receiving messages.
|
|
21
|
+
*/
|
|
22
|
+
allKeysForId(keySetId: number): {
|
|
23
|
+
key: Uint8Array;
|
|
24
|
+
sessionId?: number;
|
|
25
|
+
startTime: number | bigint;
|
|
26
|
+
}[];
|
|
27
|
+
/**
|
|
28
|
+
* Returns the current operational group key for a given group KeySet Id and returns the keys, start time and
|
|
29
|
+
* their session IDs. This is mainly used for sending messages.
|
|
30
|
+
*/
|
|
31
|
+
currentKeyForId(keySetId: number): {
|
|
32
|
+
key: Uint8Array;
|
|
33
|
+
sessionId?: number;
|
|
34
|
+
startTime: number | bigint;
|
|
35
|
+
};
|
|
36
|
+
/**
|
|
37
|
+
* Returns the group key set for a given group key set id in the official data format from the Group key Management
|
|
38
|
+
* cluster.
|
|
39
|
+
*/
|
|
40
|
+
asGroupKeySet(groupKeySetId: number): {
|
|
41
|
+
groupKeySetId: number;
|
|
42
|
+
epochKey0: Uint8Array<ArrayBufferLike> | null;
|
|
43
|
+
epochStartTime0: number | bigint | null;
|
|
44
|
+
epochKey1: Uint8Array<ArrayBufferLike> | null;
|
|
45
|
+
epochStartTime1: number | bigint | null;
|
|
46
|
+
epochKey2: Uint8Array<ArrayBufferLike> | null;
|
|
47
|
+
epochStartTime2: number | bigint | null;
|
|
48
|
+
groupKeySecurityPolicy: GroupKeyManagement.GroupKeySecurityPolicy;
|
|
49
|
+
groupKeyMulticastPolicy: GroupKeyManagement.GroupKeyMulticastPolicy | undefined;
|
|
50
|
+
} | undefined;
|
|
51
|
+
/** Calculates a group session id based on the operational group key. */
|
|
52
|
+
sessionIdFromKey(operationalGroupKey: Uint8Array): Promise<number>;
|
|
53
|
+
}
|
|
54
|
+
export type GroupKeySet = GroupKeyManagement.GroupKeySet;
|
|
55
|
+
/** Enhanced structure of GroupKeySet to include operational data for easier operational processing. */
|
|
56
|
+
export type OperationalKeySet = GroupKeySet & {
|
|
57
|
+
operationalEpochKey0: Uint8Array;
|
|
58
|
+
groupSessionId0: number | null;
|
|
59
|
+
operationalEpochKey1: Uint8Array | null;
|
|
60
|
+
groupSessionId1: number | null;
|
|
61
|
+
operationalEpochKey2: Uint8Array | null;
|
|
62
|
+
groupSessionId2: number | null;
|
|
63
|
+
};
|
|
64
|
+
//# sourceMappingURL=KeySets.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"KeySets.d.ts","sourceRoot":"","sources":["../../../src/groups/KeySets.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AACzE,OAAO,EAAE,QAAQ,EAAyE,MAAM,UAAU,CAAC;AAE3G,eAAO,MAAM,cAAc,6BAAmC,CAAC;AAE/D,qBAAa,OAAO,CAAC,CAAC,SAAS,iBAAiB,CAAE,SAAQ,QAAQ,CAAC,CAAC,CAAC;;IAIjE,IAAI,QAAQ;kBAFqC,MAAM;aAAO,UAAU;SAIvE;IAEQ,GAAG,CAAC,IAAI,EAAE,CAAC,GAAG,IAAI;IAMlB,MAAM,CAAC,CAAC,SAAS,MAAM,CAAC,EAAE,WAAW,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO;IAQ7E,KAAK,CAAC,aAAa,EAAE,MAAM,GAAG,iBAAiB,GAAG,SAAS;IAI3D;;;OAGG;IACH,YAAY,CAAC,QAAQ,EAAE,MAAM;aAKY,UAAU;oBAAc,MAAM;mBAAa,MAAM,GAAG,MAAM;;IA8BnG;;;OAGG;IACH,eAAe,CAAC,QAAQ,EAAE,MAAM;aAlCS,UAAU;oBAAc,MAAM;mBAAa,MAAM,GAAG,MAAM;;IA+DnG;;;OAGG;IACH,aAAa,CAAC,aAAa,EAAE,MAAM;;;;;;;;;;;IA6BnC,wEAAwE;IAClE,gBAAgB,CAAC,mBAAmB,EAAE,UAAU;CAsCzD;AAED,MAAM,MAAM,WAAW,GAAG,kBAAkB,CAAC,WAAW,CAAC;AAEzD,uGAAuG;AACvG,MAAM,MAAM,iBAAiB,GAAG,WAAW,GAAG;IAC1C,oBAAoB,EAAE,UAAU,CAAC;IACjC,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,oBAAoB,EAAE,UAAU,GAAG,IAAI,CAAC;IACxC,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,oBAAoB,EAAE,UAAU,GAAG,IAAI,CAAC;IACxC,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;CAClC,CAAC"}
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2022-2025 Matter.js Authors
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import { BasicSet, Bytes, Crypto, DataReader, ImplementationError, MatterFlowError, Time } from "#general";
|
|
7
|
+
const GROUP_KEY_INFO = Bytes.fromString("GroupKeyHash");
|
|
8
|
+
class KeySets extends BasicSet {
|
|
9
|
+
/** Operational enhanced structure for fast access based on the group session id. */
|
|
10
|
+
#sessions = /* @__PURE__ */ new Map();
|
|
11
|
+
get sessions() {
|
|
12
|
+
return this.#sessions;
|
|
13
|
+
}
|
|
14
|
+
add(item) {
|
|
15
|
+
this.delete("groupKeySetId", item.groupKeySetId);
|
|
16
|
+
super.add(item);
|
|
17
|
+
this.#updateSessions();
|
|
18
|
+
}
|
|
19
|
+
delete(itemOrField, value) {
|
|
20
|
+
const deleted = super.delete(itemOrField, value);
|
|
21
|
+
if (deleted) {
|
|
22
|
+
this.#updateSessions();
|
|
23
|
+
}
|
|
24
|
+
return deleted;
|
|
25
|
+
}
|
|
26
|
+
forId(groupKeySetId) {
|
|
27
|
+
return this.get("groupKeySetId", groupKeySetId);
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Return an operative list of operational keys, start time and their session IDs for a specified
|
|
31
|
+
* group key set id. This is mainly used for receiving messages.
|
|
32
|
+
*/
|
|
33
|
+
allKeysForId(keySetId) {
|
|
34
|
+
const groupKeySet = this.forId(keySetId);
|
|
35
|
+
if (groupKeySet === void 0) {
|
|
36
|
+
throw new MatterFlowError(`GroupKeySet for groupKeySet ${keySetId} not found.`);
|
|
37
|
+
}
|
|
38
|
+
const operationalKeys = Array();
|
|
39
|
+
const {
|
|
40
|
+
operationalEpochKey0,
|
|
41
|
+
groupSessionId0,
|
|
42
|
+
epochStartTime0,
|
|
43
|
+
operationalEpochKey1,
|
|
44
|
+
groupSessionId1,
|
|
45
|
+
epochStartTime1,
|
|
46
|
+
operationalEpochKey2,
|
|
47
|
+
groupSessionId2,
|
|
48
|
+
epochStartTime2
|
|
49
|
+
} = groupKeySet;
|
|
50
|
+
if (operationalEpochKey0 === null || epochStartTime0 === null || keySetId !== 0 && groupSessionId0 === null) {
|
|
51
|
+
throw new MatterFlowError(`EpochKey0 for groupKeySet ${keySetId} not found.`);
|
|
52
|
+
}
|
|
53
|
+
operationalKeys.push({
|
|
54
|
+
key: operationalEpochKey0,
|
|
55
|
+
sessionId: groupSessionId0 !== null ? groupSessionId0 : void 0,
|
|
56
|
+
startTime: epochStartTime0
|
|
57
|
+
});
|
|
58
|
+
if (operationalEpochKey1 !== null && groupSessionId1 !== null && epochStartTime1 !== null) {
|
|
59
|
+
operationalKeys.push({ key: operationalEpochKey1, sessionId: groupSessionId1, startTime: epochStartTime1 });
|
|
60
|
+
}
|
|
61
|
+
if (operationalEpochKey2 !== null && groupSessionId2 !== null && epochStartTime2 !== null) {
|
|
62
|
+
operationalKeys.push({ key: operationalEpochKey2, sessionId: groupSessionId2, startTime: epochStartTime2 });
|
|
63
|
+
}
|
|
64
|
+
return operationalKeys;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Returns the current operational group key for a given group KeySet Id and returns the keys, start time and
|
|
68
|
+
* their session IDs. This is mainly used for sending messages.
|
|
69
|
+
*/
|
|
70
|
+
currentKeyForId(keySetId) {
|
|
71
|
+
const operationalKeys = this.allKeysForId(keySetId);
|
|
72
|
+
if (operationalKeys.length === 0) {
|
|
73
|
+
throw new MatterFlowError(`No operational keys found for groupKeySet ${keySetId}.`);
|
|
74
|
+
}
|
|
75
|
+
if (keySetId === 0) {
|
|
76
|
+
if (operationalKeys.length > 2) {
|
|
77
|
+
return operationalKeys[1];
|
|
78
|
+
}
|
|
79
|
+
return operationalKeys[0];
|
|
80
|
+
} else {
|
|
81
|
+
const now = Time.nowUs();
|
|
82
|
+
const relevantKeys = operationalKeys.filter(({ startTime }) => startTime <= now);
|
|
83
|
+
if (relevantKeys.length === 0) {
|
|
84
|
+
throw new ImplementationError(
|
|
85
|
+
`No operational keys found for groupKeySet ${keySetId} that are not in the future.`
|
|
86
|
+
);
|
|
87
|
+
}
|
|
88
|
+
return relevantKeys[operationalKeys.length - 1];
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Returns the group key set for a given group key set id in the official data format from the Group key Management
|
|
93
|
+
* cluster.
|
|
94
|
+
*/
|
|
95
|
+
asGroupKeySet(groupKeySetId) {
|
|
96
|
+
const groupKeySet = this.forId(groupKeySetId);
|
|
97
|
+
if (groupKeySet === void 0) {
|
|
98
|
+
return void 0;
|
|
99
|
+
}
|
|
100
|
+
const {
|
|
101
|
+
epochKey0,
|
|
102
|
+
epochStartTime0,
|
|
103
|
+
epochKey1,
|
|
104
|
+
epochStartTime1,
|
|
105
|
+
epochKey2,
|
|
106
|
+
epochStartTime2,
|
|
107
|
+
groupKeySecurityPolicy,
|
|
108
|
+
groupKeyMulticastPolicy
|
|
109
|
+
} = groupKeySet;
|
|
110
|
+
return {
|
|
111
|
+
groupKeySetId,
|
|
112
|
+
epochKey0,
|
|
113
|
+
epochStartTime0,
|
|
114
|
+
epochKey1,
|
|
115
|
+
epochStartTime1,
|
|
116
|
+
epochKey2,
|
|
117
|
+
epochStartTime2,
|
|
118
|
+
groupKeySecurityPolicy,
|
|
119
|
+
groupKeyMulticastPolicy
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
/** Calculates a group session id based on the operational group key. */
|
|
123
|
+
async sessionIdFromKey(operationalGroupKey) {
|
|
124
|
+
const groupKeyHash = await Crypto.hkdf(operationalGroupKey, new Uint8Array(), GROUP_KEY_INFO, 2);
|
|
125
|
+
return new DataReader(groupKeyHash).readUInt16();
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Updates the group session map based on the current group key sets.
|
|
129
|
+
* This is used to quickly find the operational keys by their group session id.
|
|
130
|
+
*/
|
|
131
|
+
#updateSessions() {
|
|
132
|
+
this.#sessions.clear();
|
|
133
|
+
for (const [id, keySet] of this.mapOf("groupKeySetId").entries()) {
|
|
134
|
+
if (id === 0) {
|
|
135
|
+
continue;
|
|
136
|
+
}
|
|
137
|
+
if (keySet.groupSessionId0 !== null) {
|
|
138
|
+
const list = this.#sessions.get(keySet.groupSessionId0) ?? [];
|
|
139
|
+
list.push({ key: keySet.operationalEpochKey0, keySetId: id });
|
|
140
|
+
this.#sessions.set(keySet.groupSessionId0, list);
|
|
141
|
+
}
|
|
142
|
+
if (keySet.groupSessionId1 !== null && keySet.operationalEpochKey1 !== null) {
|
|
143
|
+
const list = this.#sessions.get(keySet.groupSessionId1) ?? [];
|
|
144
|
+
list.push({ key: keySet.operationalEpochKey1, keySetId: id });
|
|
145
|
+
this.#sessions.set(keySet.groupSessionId1, list);
|
|
146
|
+
}
|
|
147
|
+
if (keySet.groupSessionId2 !== null && keySet.operationalEpochKey2 !== null) {
|
|
148
|
+
const list = this.#sessions.get(keySet.groupSessionId2) ?? [];
|
|
149
|
+
list.push({ key: keySet.operationalEpochKey2, keySetId: id });
|
|
150
|
+
this.#sessions.set(keySet.groupSessionId2, list);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
export {
|
|
156
|
+
GROUP_KEY_INFO,
|
|
157
|
+
KeySets
|
|
158
|
+
};
|
|
159
|
+
//# sourceMappingURL=KeySets.js.map
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/groups/KeySets.ts"],
|
|
4
|
+
"mappings": "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",
|
|
5
|
+
"names": []
|
|
6
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2022-2025 Matter.js Authors
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import { StorageContext } from "#general";
|
|
7
|
+
import { PersistedMessageCounter } from "#protocol/MessageCounter.js";
|
|
8
|
+
import { MessageReceptionStateEncryptedWithRollover } from "#protocol/MessageReceptionState.js";
|
|
9
|
+
import { NodeId } from "#types";
|
|
10
|
+
export declare class MessagingState {
|
|
11
|
+
#private;
|
|
12
|
+
constructor(storage?: StorageContext);
|
|
13
|
+
set storage(storage: StorageContext);
|
|
14
|
+
/**
|
|
15
|
+
* Return the message counter for sending messages to a group with the given operational key.
|
|
16
|
+
*/
|
|
17
|
+
counterFor(operationalKey: Uint8Array): PersistedMessageCounter;
|
|
18
|
+
removeCounter(key: Uint8Array, forDelete?: boolean): Promise<void>;
|
|
19
|
+
/**
|
|
20
|
+
* Returns the message reception state for a given source node id and operational key.
|
|
21
|
+
*/
|
|
22
|
+
receptionStateFor(sourceNodeId: NodeId, operationalKey: Uint8Array): MessageReceptionStateEncryptedWithRollover;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=MessagingState.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MessagingState.d.ts","sourceRoot":"","sources":["../../../src/groups/MessagingState.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAA6C,cAAc,EAAE,MAAM,UAAU,CAAC;AACrF,OAAO,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AACtE,OAAO,EAAE,0CAA0C,EAAE,MAAM,oCAAoC,CAAC;AAChG,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC,qBAAa,cAAc;;gBAaX,OAAO,CAAC,EAAE,cAAc;IAMpC,IAAI,OAAO,CAAC,OAAO,EAAE,cAAc,EAKlC;IAED;;OAEG;IACH,UAAU,CAAC,cAAc,EAAE,UAAU;IAa/B,aAAa,CAAC,GAAG,EAAE,UAAU,EAAE,SAAS,UAAQ;IAStD;;OAEG;IACH,iBAAiB,CAAC,YAAY,EAAE,MAAM,EAAE,cAAc,EAAE,UAAU;CAWrE"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2022-2025 Matter.js Authors
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import { Bytes, ImplementationError, InternalError } from "#general";
|
|
7
|
+
import { PersistedMessageCounter } from "#protocol/MessageCounter.js";
|
|
8
|
+
import { MessageReceptionStateEncryptedWithRollover } from "#protocol/MessageReceptionState.js";
|
|
9
|
+
class MessagingState {
|
|
10
|
+
/**
|
|
11
|
+
* Message counter for sending data messages to a group per Operational key. No need to scope to a source node
|
|
12
|
+
* because we are the sending node
|
|
13
|
+
* TODO: For management: Make sure to start rotating the key early enough that a former counter-value is not used
|
|
14
|
+
* again for the same key.
|
|
15
|
+
*/
|
|
16
|
+
#groupDataCounters = /* @__PURE__ */ new Map();
|
|
17
|
+
/** Message reception state for data messages per Operational key and source node. */
|
|
18
|
+
#messageDataReceptionState = /* @__PURE__ */ new Map();
|
|
19
|
+
#storage;
|
|
20
|
+
constructor(storage) {
|
|
21
|
+
if (storage !== void 0) {
|
|
22
|
+
this.#storage = storage;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
set storage(storage) {
|
|
26
|
+
if (this.#storage !== void 0) {
|
|
27
|
+
throw new InternalError("Storage context can only be set once.");
|
|
28
|
+
}
|
|
29
|
+
this.#storage = storage;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Return the message counter for sending messages to a group with the given operational key.
|
|
33
|
+
*/
|
|
34
|
+
counterFor(operationalKey) {
|
|
35
|
+
if (!this.#storage) {
|
|
36
|
+
throw new ImplementationError("Group session cannot be created without storage context.");
|
|
37
|
+
}
|
|
38
|
+
const operationalKeyHex = Bytes.toHex(operationalKey);
|
|
39
|
+
let counter = this.#groupDataCounters.get(operationalKeyHex);
|
|
40
|
+
if (counter === void 0) {
|
|
41
|
+
counter = new PersistedMessageCounter(this.#storage, `${operationalKeyHex}-data`);
|
|
42
|
+
this.#groupDataCounters.set(operationalKeyHex, counter);
|
|
43
|
+
}
|
|
44
|
+
return counter;
|
|
45
|
+
}
|
|
46
|
+
async removeCounter(key, forDelete = false) {
|
|
47
|
+
const operationalKeyHex = Bytes.toHex(key);
|
|
48
|
+
this.#groupDataCounters.delete(operationalKeyHex);
|
|
49
|
+
if (forDelete) {
|
|
50
|
+
await this.#storage?.delete(`${operationalKeyHex}-data`);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Returns the message reception state for a given source node id and operational key.
|
|
55
|
+
*/
|
|
56
|
+
receptionStateFor(sourceNodeId, operationalKey) {
|
|
57
|
+
const operationalKeyHex = Bytes.toHex(operationalKey);
|
|
58
|
+
let receptionState = this.#messageDataReceptionState.get(operationalKeyHex)?.get(sourceNodeId);
|
|
59
|
+
if (receptionState === void 0) {
|
|
60
|
+
receptionState = new MessageReceptionStateEncryptedWithRollover();
|
|
61
|
+
const keyMap = this.#messageDataReceptionState.get(operationalKeyHex) ?? /* @__PURE__ */ new Map();
|
|
62
|
+
keyMap.set(sourceNodeId, receptionState);
|
|
63
|
+
this.#messageDataReceptionState.set(operationalKeyHex, keyMap);
|
|
64
|
+
}
|
|
65
|
+
return receptionState;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
export {
|
|
69
|
+
MessagingState
|
|
70
|
+
};
|
|
71
|
+
//# sourceMappingURL=MessagingState.js.map
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/groups/MessagingState.ts"],
|
|
4
|
+
"mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;AAKA,SAAS,OAAO,qBAAqB,qBAAqC;AAC1E,SAAS,+BAA+B;AACxC,SAAS,kDAAkD;AAGpD,MAAM,eAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOf,qBAAqB,oBAAI,IAAqC;AAAA;AAAA,EAG9D,6BAA6B,oBAAI,IAAqE;AAAA,EAC/G;AAAA,EAEA,YAAY,SAA0B;AAClC,QAAI,YAAY,QAAW;AACvB,WAAK,WAAW;AAAA,IACpB;AAAA,EACJ;AAAA,EAEA,IAAI,QAAQ,SAAyB;AACjC,QAAI,KAAK,aAAa,QAAW;AAC7B,YAAM,IAAI,cAAc,uCAAuC;AAAA,IACnE;AACA,SAAK,WAAW;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,gBAA4B;AACnC,QAAI,CAAC,KAAK,UAAU;AAChB,YAAM,IAAI,oBAAoB,0DAA0D;AAAA,IAC5F;AACA,UAAM,oBAAoB,MAAM,MAAM,cAAc;AACpD,QAAI,UAAU,KAAK,mBAAmB,IAAI,iBAAiB;AAC3D,QAAI,YAAY,QAAW;AACvB,gBAAU,IAAI,wBAAwB,KAAK,UAAU,GAAG,iBAAiB,OAAO;AAChF,WAAK,mBAAmB,IAAI,mBAAmB,OAAO;AAAA,IAC1D;AACA,WAAO;AAAA,EACX;AAAA,EAEA,MAAM,cAAc,KAAiB,YAAY,OAAO;AACpD,UAAM,oBAAoB,MAAM,MAAM,GAAG;AACzC,SAAK,mBAAmB,OAAO,iBAAiB;AAChD,QAAI,WAAW;AAEX,YAAM,KAAK,UAAU,OAAO,GAAG,iBAAiB,OAAO;AAAA,IAC3D;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAkB,cAAsB,gBAA4B;AAChE,UAAM,oBAAoB,MAAM,MAAM,cAAc;AACpD,QAAI,iBAAiB,KAAK,2BAA2B,IAAI,iBAAiB,GAAG,IAAI,YAAY;AAC7F,QAAI,mBAAmB,QAAW;AAC9B,uBAAiB,IAAI,2CAA2C;AAChE,YAAM,SAAS,KAAK,2BAA2B,IAAI,iBAAiB,KAAK,oBAAI,IAAI;AACjF,aAAO,IAAI,cAAc,cAAc;AACvC,WAAK,2BAA2B,IAAI,mBAAmB,MAAM;AAAA,IACjE;AACA,WAAO;AAAA,EACX;AACJ;",
|
|
5
|
+
"names": []
|
|
6
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/groups/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,0BAA0B,CAAC;AACzC,cAAc,cAAc,CAAC"}
|
package/dist/esm/index.d.ts
CHANGED
|
@@ -11,6 +11,7 @@ export * from "./codec/index.js";
|
|
|
11
11
|
export * from "./common/index.js";
|
|
12
12
|
export * from "./events/index.js";
|
|
13
13
|
export * from "./fabric/index.js";
|
|
14
|
+
export * from "./groups/index.js";
|
|
14
15
|
export * from "./interaction/index.js";
|
|
15
16
|
export * from "./mdns/index.js";
|
|
16
17
|
export * from "./peer/index.js";
|
package/dist/esm/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,mBAAmB,CAAC;AAClC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,wBAAwB,CAAC;AACvC,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,wBAAwB,CAAC;AACvC,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,qBAAqB,CAAC;AACpC,cAAc,0BAA0B,CAAC;AACzC,cAAc,oBAAoB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,mBAAmB,CAAC;AAClC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,wBAAwB,CAAC;AACvC,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,wBAAwB,CAAC;AACvC,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,qBAAqB,CAAC;AACpC,cAAc,0BAA0B,CAAC;AACzC,cAAc,oBAAoB,CAAC"}
|
package/dist/esm/index.js
CHANGED
|
@@ -11,6 +11,7 @@ export * from "./codec/index.js";
|
|
|
11
11
|
export * from "./common/index.js";
|
|
12
12
|
export * from "./events/index.js";
|
|
13
13
|
export * from "./fabric/index.js";
|
|
14
|
+
export * from "./groups/index.js";
|
|
14
15
|
export * from "./interaction/index.js";
|
|
15
16
|
export * from "./mdns/index.js";
|
|
16
17
|
export * from "./peer/index.js";
|
package/dist/esm/index.js.map
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/index.ts"],
|
|
4
|
-
"mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;AAMA,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;",
|
|
4
|
+
"mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;AAMA,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;",
|
|
5
5
|
"names": []
|
|
6
6
|
}
|
|
@@ -1,12 +1,7 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @license
|
|
3
|
-
* Copyright 2022-2023 Project CHIP Authors
|
|
4
|
-
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
-
*/
|
|
6
1
|
import { AccessControl } from "#clusters/access-control";
|
|
7
2
|
import { AccessLevel } from "#model";
|
|
8
|
-
import { ClusterId, DeviceTypeId, EndpointNumber, FabricIndex,
|
|
9
|
-
import {
|
|
3
|
+
import { ClusterId, DeviceTypeId, EndpointNumber, FabricIndex, StatusResponseError, SubjectId } from "#types";
|
|
4
|
+
import { AccessControl as AccessControlContext } from "../action/server/AccessControl.js";
|
|
10
5
|
export type AclEntry = Omit<AccessControl.AccessControlEntry, "privilege"> & {
|
|
11
6
|
privilege: AccessLevel;
|
|
12
7
|
};
|
|
@@ -23,7 +18,7 @@ declare enum AuthModeNone {
|
|
|
23
18
|
export type IncomingSubjectDescriptor = {
|
|
24
19
|
isCommissioning: boolean;
|
|
25
20
|
authMode: AccessControl.AccessControlEntryAuthMode | AuthModeNone;
|
|
26
|
-
subjects:
|
|
21
|
+
subjects: SubjectId[];
|
|
27
22
|
fabricIndex: FabricIndex;
|
|
28
23
|
};
|
|
29
24
|
export declare class AccessDeniedError extends StatusResponseError {
|
|
@@ -39,14 +34,10 @@ export declare class AccessControlManager {
|
|
|
39
34
|
* Public method used to update the Access Control List on changes.
|
|
40
35
|
*/
|
|
41
36
|
updateAccessControlList(aclList?: AccessControl.AccessControlEntry[]): void;
|
|
42
|
-
/**
|
|
43
|
-
* Check if the given ACL entry is allowed to be used for the given subject descriptor, endpoint, and cluster ID.
|
|
44
|
-
*/
|
|
45
|
-
allowsPrivilege(session: SecureSession, endpoint: AclEndpointContext, clusterId: ClusterId, privilege: AccessLevel): boolean;
|
|
46
37
|
/**
|
|
47
38
|
* Determines the granted privileges for the given session, endpoint, and cluster ID and returns them.
|
|
48
39
|
*/
|
|
49
|
-
getGrantedPrivileges(
|
|
40
|
+
getGrantedPrivileges(context: AccessControlContext.Session, endpoint: AclEndpointContext, clusterId: ClusterId): AccessLevel[];
|
|
50
41
|
}
|
|
51
42
|
export {};
|
|
52
43
|
//# sourceMappingURL=AccessControlManager.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AccessControlManager.d.ts","sourceRoot":"","sources":["../../../src/interaction/AccessControlManager.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"AccessControlManager.d.ts","sourceRoot":"","sources":["../../../src/interaction/AccessControlManager.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAEzD,OAAO,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AACrC,OAAO,EAEH,SAAS,EACT,YAAY,EACZ,cAAc,EACd,WAAW,EAGX,mBAAmB,EACnB,SAAS,EACZ,MAAM,QAAQ,CAAC;AAChB,OAAO,EAAE,aAAa,IAAI,oBAAoB,EAAE,MAAM,mCAAmC,CAAC;AAE1F,MAAM,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,kBAAkB,EAAE,WAAW,CAAC,GAAG;IACzE,SAAS,EAAE,WAAW,CAAC;CAC1B,CAAC;AACF,MAAM,MAAM,OAAO,GAAG,QAAQ,EAAE,CAAC;AAEjC,MAAM,MAAM,iBAAiB,GAAG,aAAa,CAAC,sBAAsB,CAAC;AACrE,MAAM,MAAM,gBAAgB,GAAG,iBAAiB,EAAE,CAAC;AAEnD,MAAM,MAAM,kBAAkB,GAAG;IAC7B,EAAE,EAAE,cAAc,CAAC;IACnB,WAAW,EAAE,YAAY,EAAE,CAAC;CAC/B,CAAC;AAUF,aAAK,YAAY;IACb,IAAI,IAAI;CACX;AAED,MAAM,MAAM,yBAAyB,GAAG;IACpC,eAAe,EAAE,OAAO,CAAC;IACzB,QAAQ,EAAE,aAAa,CAAC,0BAA0B,GAAG,YAAY,CAAC;IAClE,QAAQ,EAAE,SAAS,EAAE,CAAC;IACtB,WAAW,EAAE,WAAW,CAAC;CAC5B,CAAC;AAEF,qBAAa,iBAAkB,SAAQ,mBAAmB;gBAC1C,OAAO,CAAC,EAAE,MAAM;CAG/B;AAED;;GAEG;AACH,qBAAa,oBAAoB;;gBAWzB,OAAO,GAAE,aAAa,CAAC,kBAAkB,EAAO,EAChD,yBAAyB,CAAC,EAAE,CACxB,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,QAAQ,EAClB,WAAW,EAAE,yBAAyB,EACtC,QAAQ,EAAE,kBAAkB,EAC5B,SAAS,EAAE,SAAS,KACnB,OAAO;IAQhB;;OAEG;IACH,uBAAuB,CAAC,OAAO,GAAE,aAAa,CAAC,kBAAkB,EAAO,GAAG,IAAI;IA2D/E;;OAEG;IACH,oBAAoB,CAChB,OAAO,EAAE,oBAAoB,CAAC,OAAO,EACrC,QAAQ,EAAE,kBAAkB,EAC5B,SAAS,EAAE,SAAS,GACrB,WAAW,EAAE;CAoKnB"}
|