@matter/node 0.14.0 → 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.
Files changed (178) hide show
  1. package/dist/cjs/behavior/Behavior.d.ts +2 -1
  2. package/dist/cjs/behavior/Behavior.d.ts.map +1 -1
  3. package/dist/cjs/behavior/Behavior.js +1 -1
  4. package/dist/cjs/behavior/Behavior.js.map +1 -1
  5. package/dist/cjs/behavior/Transitions.js +2 -2
  6. package/dist/cjs/behavior/Transitions.js.map +1 -1
  7. package/dist/cjs/behavior/context/server/OnlineContext.d.ts +3 -3
  8. package/dist/cjs/behavior/context/server/OnlineContext.d.ts.map +1 -1
  9. package/dist/cjs/behavior/context/server/OnlineContext.js +12 -9
  10. package/dist/cjs/behavior/context/server/OnlineContext.js.map +1 -1
  11. package/dist/cjs/behavior/internal/ClientBehaviorBacking.d.ts +2 -1
  12. package/dist/cjs/behavior/internal/ClientBehaviorBacking.d.ts.map +1 -1
  13. package/dist/cjs/behavior/internal/ClientBehaviorBacking.js.map +1 -1
  14. package/dist/cjs/behavior/system/network/NetworkBehavior.d.ts.map +1 -1
  15. package/dist/cjs/behavior/system/network/NetworkBehavior.js +2 -1
  16. package/dist/cjs/behavior/system/network/NetworkBehavior.js.map +1 -1
  17. package/dist/cjs/behavior/system/network/ServerGroupNetworking.d.ts +18 -0
  18. package/dist/cjs/behavior/system/network/ServerGroupNetworking.d.ts.map +1 -0
  19. package/dist/cjs/behavior/system/network/ServerGroupNetworking.js +150 -0
  20. package/dist/cjs/behavior/system/network/ServerGroupNetworking.js.map +6 -0
  21. package/dist/cjs/behavior/system/network/ServerNetworkRuntime.d.ts.map +1 -1
  22. package/dist/cjs/behavior/system/network/ServerNetworkRuntime.js +25 -7
  23. package/dist/cjs/behavior/system/network/ServerNetworkRuntime.js.map +1 -1
  24. package/dist/cjs/behavior/system/sessions/SessionsBehavior.d.ts.map +1 -1
  25. package/dist/cjs/behavior/system/sessions/SessionsBehavior.js.map +1 -1
  26. package/dist/cjs/behaviors/access-control/AccessControlServer.d.ts.map +1 -1
  27. package/dist/cjs/behaviors/access-control/AccessControlServer.js +18 -12
  28. package/dist/cjs/behaviors/access-control/AccessControlServer.js.map +1 -1
  29. package/dist/cjs/behaviors/color-control/ColorControlServer.d.ts +4 -4
  30. package/dist/cjs/behaviors/color-control/ColorControlServer.d.ts.map +1 -1
  31. package/dist/cjs/behaviors/color-control/ColorControlServer.js +3 -3
  32. package/dist/cjs/behaviors/color-control/ColorControlServer.js.map +1 -1
  33. package/dist/cjs/behaviors/general-commissioning/GeneralCommissioningServer.d.ts.map +1 -1
  34. package/dist/cjs/behaviors/general-commissioning/GeneralCommissioningServer.js +5 -4
  35. package/dist/cjs/behaviors/general-commissioning/GeneralCommissioningServer.js.map +1 -1
  36. package/dist/cjs/behaviors/general-commissioning/ServerNodeFailsafeContext.d.ts +1 -1
  37. package/dist/cjs/behaviors/general-commissioning/ServerNodeFailsafeContext.d.ts.map +1 -1
  38. package/dist/cjs/behaviors/group-key-management/GroupKeyManagementServer.d.ts +27 -4
  39. package/dist/cjs/behaviors/group-key-management/GroupKeyManagementServer.d.ts.map +1 -1
  40. package/dist/cjs/behaviors/group-key-management/GroupKeyManagementServer.js +340 -21
  41. package/dist/cjs/behaviors/group-key-management/GroupKeyManagementServer.js.map +2 -2
  42. package/dist/cjs/behaviors/groups/GroupsServer.d.ts +19 -3
  43. package/dist/cjs/behaviors/groups/GroupsServer.d.ts.map +1 -1
  44. package/dist/cjs/behaviors/groups/GroupsServer.js +138 -1
  45. package/dist/cjs/behaviors/groups/GroupsServer.js.map +2 -2
  46. package/dist/cjs/behaviors/level-control/LevelControlServer.d.ts +5 -5
  47. package/dist/cjs/behaviors/level-control/LevelControlServer.d.ts.map +1 -1
  48. package/dist/cjs/behaviors/level-control/LevelControlServer.js +3 -3
  49. package/dist/cjs/behaviors/level-control/LevelControlServer.js.map +1 -1
  50. package/dist/cjs/behaviors/mode-select/ModeSelectServer.d.ts.map +1 -1
  51. package/dist/cjs/behaviors/mode-select/ModeSelectServer.js +3 -3
  52. package/dist/cjs/behaviors/mode-select/ModeSelectServer.js.map +1 -1
  53. package/dist/cjs/behaviors/on-off/OnOffServer.d.ts.map +1 -1
  54. package/dist/cjs/behaviors/on-off/OnOffServer.js +3 -3
  55. package/dist/cjs/behaviors/on-off/OnOffServer.js.map +1 -1
  56. package/dist/cjs/behaviors/operational-credentials/OperationalCredentialsServer.d.ts.map +1 -1
  57. package/dist/cjs/behaviors/operational-credentials/OperationalCredentialsServer.js +14 -8
  58. package/dist/cjs/behaviors/operational-credentials/OperationalCredentialsServer.js.map +1 -1
  59. package/dist/cjs/endpoint/Endpoint.js +1 -1
  60. package/dist/cjs/endpoint/Endpoint.js.map +1 -1
  61. package/dist/cjs/node/Node.d.ts +1 -1
  62. package/dist/cjs/node/Node.d.ts.map +1 -1
  63. package/dist/cjs/node/Node.js +2 -2
  64. package/dist/cjs/node/Node.js.map +1 -1
  65. package/dist/cjs/node/ServerNode.d.ts +1 -1
  66. package/dist/cjs/node/ServerNode.d.ts.map +1 -1
  67. package/dist/cjs/node/ServerNode.js +2 -2
  68. package/dist/cjs/node/ServerNode.js.map +1 -1
  69. package/dist/cjs/node/client/NodePeerAddressStore.d.ts +1 -1
  70. package/dist/cjs/node/client/NodePeerAddressStore.d.ts.map +1 -1
  71. package/dist/cjs/node/server/InteractionServer.d.ts +2 -2
  72. package/dist/cjs/node/server/InteractionServer.d.ts.map +1 -1
  73. package/dist/cjs/node/server/InteractionServer.js +1 -1
  74. package/dist/cjs/node/server/InteractionServer.js.map +1 -1
  75. package/dist/cjs/node/server/ServerSubscription.d.ts +4 -4
  76. package/dist/cjs/node/server/ServerSubscription.d.ts.map +1 -1
  77. package/dist/cjs/node/server/ServerSubscription.js.map +1 -1
  78. package/dist/esm/behavior/Behavior.d.ts +2 -1
  79. package/dist/esm/behavior/Behavior.d.ts.map +1 -1
  80. package/dist/esm/behavior/Behavior.js +2 -2
  81. package/dist/esm/behavior/Behavior.js.map +1 -1
  82. package/dist/esm/behavior/Transitions.js +1 -1
  83. package/dist/esm/behavior/context/server/OnlineContext.d.ts +3 -3
  84. package/dist/esm/behavior/context/server/OnlineContext.d.ts.map +1 -1
  85. package/dist/esm/behavior/context/server/OnlineContext.js +13 -10
  86. package/dist/esm/behavior/context/server/OnlineContext.js.map +1 -1
  87. package/dist/esm/behavior/internal/ClientBehaviorBacking.d.ts +2 -1
  88. package/dist/esm/behavior/internal/ClientBehaviorBacking.d.ts.map +1 -1
  89. package/dist/esm/behavior/internal/ClientBehaviorBacking.js.map +1 -1
  90. package/dist/esm/behavior/system/network/NetworkBehavior.d.ts.map +1 -1
  91. package/dist/esm/behavior/system/network/NetworkBehavior.js +2 -1
  92. package/dist/esm/behavior/system/network/NetworkBehavior.js.map +1 -1
  93. package/dist/esm/behavior/system/network/ServerGroupNetworking.d.ts +18 -0
  94. package/dist/esm/behavior/system/network/ServerGroupNetworking.d.ts.map +1 -0
  95. package/dist/esm/behavior/system/network/ServerGroupNetworking.js +130 -0
  96. package/dist/esm/behavior/system/network/ServerGroupNetworking.js.map +6 -0
  97. package/dist/esm/behavior/system/network/ServerNetworkRuntime.d.ts.map +1 -1
  98. package/dist/esm/behavior/system/network/ServerNetworkRuntime.js +23 -5
  99. package/dist/esm/behavior/system/network/ServerNetworkRuntime.js.map +1 -1
  100. package/dist/esm/behavior/system/sessions/SessionsBehavior.d.ts.map +1 -1
  101. package/dist/esm/behavior/system/sessions/SessionsBehavior.js.map +1 -1
  102. package/dist/esm/behaviors/access-control/AccessControlServer.d.ts.map +1 -1
  103. package/dist/esm/behaviors/access-control/AccessControlServer.js +20 -13
  104. package/dist/esm/behaviors/access-control/AccessControlServer.js.map +1 -1
  105. package/dist/esm/behaviors/color-control/ColorControlServer.d.ts +4 -4
  106. package/dist/esm/behaviors/color-control/ColorControlServer.d.ts.map +1 -1
  107. package/dist/esm/behaviors/color-control/ColorControlServer.js +3 -3
  108. package/dist/esm/behaviors/color-control/ColorControlServer.js.map +1 -1
  109. package/dist/esm/behaviors/general-commissioning/GeneralCommissioningServer.d.ts.map +1 -1
  110. package/dist/esm/behaviors/general-commissioning/GeneralCommissioningServer.js +6 -5
  111. package/dist/esm/behaviors/general-commissioning/GeneralCommissioningServer.js.map +1 -1
  112. package/dist/esm/behaviors/general-commissioning/ServerNodeFailsafeContext.d.ts +1 -1
  113. package/dist/esm/behaviors/general-commissioning/ServerNodeFailsafeContext.d.ts.map +1 -1
  114. package/dist/esm/behaviors/group-key-management/GroupKeyManagementServer.d.ts +27 -4
  115. package/dist/esm/behaviors/group-key-management/GroupKeyManagementServer.d.ts.map +1 -1
  116. package/dist/esm/behaviors/group-key-management/GroupKeyManagementServer.js +342 -23
  117. package/dist/esm/behaviors/group-key-management/GroupKeyManagementServer.js.map +2 -2
  118. package/dist/esm/behaviors/groups/GroupsServer.d.ts +19 -3
  119. package/dist/esm/behaviors/groups/GroupsServer.d.ts.map +1 -1
  120. package/dist/esm/behaviors/groups/GroupsServer.js +147 -1
  121. package/dist/esm/behaviors/groups/GroupsServer.js.map +1 -1
  122. package/dist/esm/behaviors/level-control/LevelControlServer.d.ts +5 -5
  123. package/dist/esm/behaviors/level-control/LevelControlServer.d.ts.map +1 -1
  124. package/dist/esm/behaviors/level-control/LevelControlServer.js +3 -3
  125. package/dist/esm/behaviors/level-control/LevelControlServer.js.map +1 -1
  126. package/dist/esm/behaviors/mode-select/ModeSelectServer.d.ts.map +1 -1
  127. package/dist/esm/behaviors/mode-select/ModeSelectServer.js +3 -3
  128. package/dist/esm/behaviors/mode-select/ModeSelectServer.js.map +1 -1
  129. package/dist/esm/behaviors/on-off/OnOffServer.d.ts.map +1 -1
  130. package/dist/esm/behaviors/on-off/OnOffServer.js +3 -3
  131. package/dist/esm/behaviors/on-off/OnOffServer.js.map +1 -1
  132. package/dist/esm/behaviors/operational-credentials/OperationalCredentialsServer.d.ts.map +1 -1
  133. package/dist/esm/behaviors/operational-credentials/OperationalCredentialsServer.js +15 -9
  134. package/dist/esm/behaviors/operational-credentials/OperationalCredentialsServer.js.map +1 -1
  135. package/dist/esm/endpoint/Endpoint.js +1 -1
  136. package/dist/esm/endpoint/Endpoint.js.map +1 -1
  137. package/dist/esm/node/Node.d.ts +1 -1
  138. package/dist/esm/node/Node.d.ts.map +1 -1
  139. package/dist/esm/node/Node.js +1 -1
  140. package/dist/esm/node/Node.js.map +1 -1
  141. package/dist/esm/node/ServerNode.d.ts +1 -1
  142. package/dist/esm/node/ServerNode.d.ts.map +1 -1
  143. package/dist/esm/node/ServerNode.js +1 -1
  144. package/dist/esm/node/client/NodePeerAddressStore.d.ts +1 -1
  145. package/dist/esm/node/client/NodePeerAddressStore.d.ts.map +1 -1
  146. package/dist/esm/node/server/InteractionServer.d.ts +2 -2
  147. package/dist/esm/node/server/InteractionServer.d.ts.map +1 -1
  148. package/dist/esm/node/server/InteractionServer.js +2 -2
  149. package/dist/esm/node/server/InteractionServer.js.map +1 -1
  150. package/dist/esm/node/server/ServerSubscription.d.ts +4 -4
  151. package/dist/esm/node/server/ServerSubscription.d.ts.map +1 -1
  152. package/dist/esm/node/server/ServerSubscription.js.map +1 -1
  153. package/package.json +7 -7
  154. package/src/behavior/Behavior.ts +2 -2
  155. package/src/behavior/Transitions.ts +1 -1
  156. package/src/behavior/context/server/OnlineContext.ts +21 -19
  157. package/src/behavior/internal/ClientBehaviorBacking.ts +2 -1
  158. package/src/behavior/system/commissioning/CommissioningClient.ts +1 -1
  159. package/src/behavior/system/network/NetworkBehavior.ts +2 -1
  160. package/src/behavior/system/network/ServerGroupNetworking.ts +150 -0
  161. package/src/behavior/system/network/ServerNetworkRuntime.ts +27 -5
  162. package/src/behavior/system/sessions/SessionsBehavior.ts +5 -5
  163. package/src/behaviors/access-control/AccessControlServer.ts +21 -14
  164. package/src/behaviors/color-control/ColorControlServer.ts +4 -4
  165. package/src/behaviors/general-commissioning/GeneralCommissioningServer.ts +8 -7
  166. package/src/behaviors/general-commissioning/ServerNodeFailsafeContext.ts +1 -1
  167. package/src/behaviors/group-key-management/GroupKeyManagementServer.ts +441 -26
  168. package/src/behaviors/groups/GroupsServer.ts +181 -3
  169. package/src/behaviors/level-control/LevelControlServer.ts +5 -5
  170. package/src/behaviors/mode-select/ModeSelectServer.ts +3 -3
  171. package/src/behaviors/on-off/OnOffServer.ts +3 -3
  172. package/src/behaviors/operational-credentials/OperationalCredentialsServer.ts +17 -9
  173. package/src/endpoint/Endpoint.ts +1 -1
  174. package/src/node/Node.ts +1 -1
  175. package/src/node/ServerNode.ts +1 -1
  176. package/src/node/client/NodePeerAddressStore.ts +1 -1
  177. package/src/node/server/InteractionServer.ts +5 -6
  178. package/src/node/server/ServerSubscription.ts +3 -4
@@ -21,7 +21,11 @@ __export(GroupKeyManagementServer_exports, {
21
21
  GroupKeyManagementServer: () => GroupKeyManagementServer
22
22
  });
23
23
  module.exports = __toCommonJS(GroupKeyManagementServer_exports);
24
+ var import_groups = require("#behaviors/groups");
25
+ var import_group_key_management = require("#clusters/group-key-management");
24
26
  var import_general = require("#general");
27
+ var import_model = require("#model");
28
+ var import_protocol = require("#protocol");
25
29
  var import_types = require("#types");
26
30
  var import_GroupKeyManagementBehavior = require("./GroupKeyManagementBehavior.js");
27
31
  /**
@@ -29,30 +33,269 @@ var import_GroupKeyManagementBehavior = require("./GroupKeyManagementBehavior.js
29
33
  * Copyright 2022-2025 Matter.js Authors
30
34
  * SPDX-License-Identifier: Apache-2.0
31
35
  */
36
+ const logger = import_general.Logger.get("GroupKeyManagementServer");
37
+ const MAX_64BIT_TIME = BigInt("0xffffffffffffffff");
38
+ const groupKeySetStruct = import_GroupKeyManagementBehavior.GroupKeyManagementBehavior.schema.get(import_model.DatatypeModel, "GroupKeySetStruct");
39
+ const groupKeySetStructFS = groupKeySetStruct.extend({
40
+ name: "GroupKeySetStructFS",
41
+ children: [(0, import_model.FieldElement)({ name: "FabricIndex", id: 254, type: "FabricIndex" })]
42
+ });
43
+ const schema = import_GroupKeyManagementBehavior.GroupKeyManagementBehavior.schema.extend({
44
+ children: [
45
+ groupKeySetStructFS,
46
+ (0, import_model.FieldElement)({ name: "groupKeySets", type: "GroupKeySetStructFS", quality: "N", access: "RW VM F" })
47
+ ]
48
+ });
32
49
  class GroupKeyManagementServer extends import_GroupKeyManagementBehavior.GroupKeyManagementBehavior {
50
+ schema = schema;
33
51
  initialize() {
34
- if (this.state.maxGroupKeysPerFabric !== 1) {
35
- throw new import_general.ImplementationError("maxGroupKeysPerFabric must be 1 for now.");
52
+ if (this.features.cacheAndSync) {
53
+ throw new import_general.ImplementationError("The CacheAndSync feature is provisional. Do not use it.");
54
+ }
55
+ if (this.state.groupKeySets === void 0) {
56
+ this.state.groupKeySets = [];
57
+ }
58
+ this.reactTo(this.events.groupKeyMap$Changing, this.#validateGroupKeyMap);
59
+ this.reactTo(this.events.groupTable$Changing, this.#validateGroupTable);
60
+ this.reactTo(this.events.groupKeyMap$Changed, this.#updateGroupKeyMap);
61
+ const lifecycle = this.endpoint.lifecycle;
62
+ this.reactTo(lifecycle.online, this.#online);
63
+ }
64
+ async #online() {
65
+ if (this.state.maxGroupKeysPerFabric === 0 && this.state.maxGroupsPerFabric === 1) {
66
+ let groupsFound = false;
67
+ this.endpoint.visit((endpoint) => {
68
+ if (!groupsFound && endpoint.behaviors.has(import_groups.GroupsBehavior)) {
69
+ groupsFound = true;
70
+ }
71
+ });
72
+ if (groupsFound) {
73
+ throw new import_general.ImplementationError(
74
+ "One of the device types you use has a Groups cluster. Please adjust the Group Key Management cluster maximum defaults. You need to support groups management."
75
+ );
76
+ }
77
+ }
78
+ const fabrics = this.env.get(import_protocol.FabricManager);
79
+ this.reactTo(fabrics.events.updated, this.#handleFabricUpdate);
80
+ if (this.state.groupKeySets.length) {
81
+ const groupKeysForFabric = /* @__PURE__ */ new Map();
82
+ for (const groupKeySet of this.state.groupKeySets) {
83
+ const fabricIndex = groupKeySet.fabricIndex;
84
+ const keys = groupKeysForFabric.get(fabricIndex) ?? [];
85
+ keys.push(groupKeySet);
86
+ groupKeysForFabric.set(fabricIndex, keys);
87
+ }
88
+ for (const [fabricIndex, keys] of groupKeysForFabric.entries()) {
89
+ const fabric = fabrics.for(fabricIndex);
90
+ for (const groupKeySet of keys) {
91
+ await fabric.groups.setFromGroupKeySet(groupKeySet);
92
+ }
93
+ }
94
+ }
95
+ if (this.state.groupKeyMap.length) {
96
+ this.#updateGroupKeyMap(this.state.groupKeyMap);
97
+ }
98
+ }
99
+ /** Handle the recreation (update) of a fabric, so we need to reinitialize the group key sets */
100
+ async #handleFabricUpdate(fabric) {
101
+ if (this.state.groupKeySets.length === 0) {
102
+ return;
103
+ }
104
+ const fabricIndex = fabric.fabricIndex;
105
+ const groupKeysForFabric = this.state.groupKeySets.filter(
106
+ ({ fabricIndex: entryIndex }) => entryIndex === fabricIndex
107
+ );
108
+ for (const groupKeySet of groupKeysForFabric) {
109
+ await fabric.groups.setFromGroupKeySet(groupKeySet);
110
+ }
111
+ if (this.state.groupKeyMap.length) {
112
+ fabric.groups.groupKeyIdMap = new Map(
113
+ this.state.groupKeyMap.filter(({ fabricIndex: entryIndex }) => entryIndex === fabricIndex).map(({ groupId, groupKeySetId }) => [groupId, groupKeySetId])
114
+ );
115
+ }
116
+ if (this.state.groupTable.length) {
117
+ const groupTable = this.state.groupTable.filter(
118
+ ({ fabricIndex: entryIndex }) => entryIndex === fabricIndex
119
+ );
120
+ fabric.groups.endpoints.clear();
121
+ for (const entry of groupTable) {
122
+ fabric.groups.endpoints.set(entry.groupId, entry.endpoints);
123
+ }
124
+ }
125
+ }
126
+ #validateGroupKeyMap(groupKeyMap) {
127
+ const knownGroupKeys = /* @__PURE__ */ new Set();
128
+ for (const keySetId of this.state.groupKeySets) {
129
+ const { groupKeySetId, fabricIndex } = keySetId;
130
+ const id = `${fabricIndex}-${groupKeySetId}`;
131
+ knownGroupKeys.add(id);
132
+ }
133
+ const knownGroupIds = /* @__PURE__ */ new Set();
134
+ const groupIdsPerFabric = new Array();
135
+ for (const entry of groupKeyMap) {
136
+ const { groupId, fabricIndex } = entry;
137
+ if (!import_types.GroupId.isApplicationGroupId(groupId)) {
138
+ throw new import_types.StatusResponseError(
139
+ "Only operational GroupIds are allowed in GroupKeyMap",
140
+ import_types.StatusCode.InvalidAction
141
+ );
142
+ }
143
+ groupIdsPerFabric[fabricIndex] = (groupIdsPerFabric[fabricIndex] ?? 0) + 1;
144
+ const id = `${fabricIndex}-${groupId}`;
145
+ if (knownGroupIds.has(id)) {
146
+ throw new import_types.StatusResponseError(
147
+ `Duplicate GroupId ${groupId} for FabricIndex ${fabricIndex}`,
148
+ import_types.StatusCode.ConstraintError
149
+ );
150
+ }
151
+ knownGroupIds.add(id);
152
+ }
153
+ if (groupIdsPerFabric.some((count) => count > this.state.maxGroupsPerFabric)) {
154
+ throw new import_types.StatusResponseError(
155
+ `Too many groups per fabric, maximum is ${this.state.maxGroupsPerFabric}`,
156
+ import_types.StatusCode.ResourceExhausted
157
+ );
158
+ }
159
+ }
160
+ #validateGroupTable(groupTable) {
161
+ const knownGroupIds = /* @__PURE__ */ new Set();
162
+ for (const entry of groupTable) {
163
+ const { groupId, fabricIndex, endpoints } = entry;
164
+ if (groupId === 0) {
165
+ throw new import_types.StatusResponseError(
166
+ "GroupId 0 can not be used as operational group id",
167
+ import_types.StatusCode.ConstraintError
168
+ );
169
+ }
170
+ const id = `${fabricIndex}-${groupId}`;
171
+ if (knownGroupIds.has(id)) {
172
+ throw new import_types.StatusResponseError(
173
+ `Duplicate GroupId ${groupId} for FabricIndex ${fabricIndex}`,
174
+ import_types.StatusCode.ConstraintError
175
+ );
176
+ }
177
+ knownGroupIds.add(id);
178
+ const endpointIds = new Set(endpoints);
179
+ if (endpointIds.size !== endpoints.length) {
180
+ throw new import_types.StatusResponseError(
181
+ `Duplicate endpoint IDs in GroupId ${groupId} for FabricIndex ${fabricIndex}`,
182
+ import_types.StatusCode.ConstraintError
183
+ );
184
+ }
185
+ }
186
+ }
187
+ #updateGroupKeyMap(groupKeyMap, _oldMap, context) {
188
+ if (context !== void 0 && !context?.offline) {
189
+ const fabric = context.session?.associatedFabric;
190
+ const fabricIndex = fabric?.fabricIndex;
191
+ if (fabric !== void 0 && fabricIndex !== void 0) {
192
+ fabric.groups.groupKeyIdMap = new Map(
193
+ groupKeyMap.filter(({ fabricIndex: entryIndex }) => entryIndex === fabricIndex).map(({ groupId, groupKeySetId }) => [groupId, groupKeySetId])
194
+ );
195
+ return;
196
+ }
36
197
  }
37
- if (this.state.maxGroupsPerFabric !== 0) {
38
- throw new import_general.ImplementationError("maxGroupsPerFabric must be 0 for now.");
198
+ const fabrics = this.env.get(import_protocol.FabricManager);
199
+ const fabricMaps = /* @__PURE__ */ new Map();
200
+ for (const entry of groupKeyMap) {
201
+ const { fabricIndex, groupId, groupKeySetId } = entry;
202
+ const fabricMap = fabricMaps.get(fabricIndex) ?? /* @__PURE__ */ new Map();
203
+ fabricMap.set(groupId, groupKeySetId);
204
+ fabricMaps.set(fabricIndex, fabricMap);
205
+ }
206
+ for (const fabric of fabrics) {
207
+ const fabricIndex = fabric.fabricIndex;
208
+ const map = fabricMaps.get(fabricIndex);
209
+ if (map === void 0) {
210
+ continue;
211
+ }
212
+ fabric.groups.groupKeyIdMap = map;
39
213
  }
40
- this.state.groupTable = [];
41
214
  }
42
- keySetWrite() {
43
- throw new import_types.StatusResponseError(
44
- "We do not support additional groups beyond the IPK",
45
- import_types.StatusCode.ResourceExhausted
215
+ async keySetWrite({ groupKeySet }) {
216
+ import_protocol.SecureSession.assert(this.session);
217
+ const {
218
+ groupKeySetId,
219
+ epochKey0,
220
+ epochKey1,
221
+ epochKey2,
222
+ epochStartTime0,
223
+ epochStartTime1,
224
+ epochStartTime2,
225
+ groupKeySecurityPolicy,
226
+ groupKeyMulticastPolicy = import_group_key_management.GroupKeyManagement.GroupKeyMulticastPolicy.PerGroupId
227
+ } = groupKeySet;
228
+ if (groupKeySet.epochStartTime0 === MAX_64BIT_TIME) {
229
+ groupKeySet.epochStartTime0 = null;
230
+ groupKeySet.epochKey0 = null;
231
+ }
232
+ if (groupKeySet.epochStartTime1 === MAX_64BIT_TIME) {
233
+ groupKeySet.epochStartTime1 = null;
234
+ groupKeySet.epochKey1 = null;
235
+ }
236
+ if (groupKeySet.epochStartTime2 === MAX_64BIT_TIME) {
237
+ groupKeySet.epochStartTime2 = null;
238
+ groupKeySet.epochKey2 = null;
239
+ }
240
+ if (epochKey0 === null || epochStartTime0 === null) {
241
+ throw new import_types.StatusResponseError("EpochKey0 and EpochStartTime0 must be set", import_types.StatusCode.InvalidCommand);
242
+ }
243
+ if (epochStartTime0 === 0) {
244
+ throw new import_types.StatusResponseError("EpochStartTime0 must not be 0", import_types.StatusCode.InvalidCommand);
245
+ }
246
+ if (epochKey1 !== null && (epochStartTime1 === null || epochStartTime1 <= epochStartTime0)) {
247
+ throw new import_types.StatusResponseError(
248
+ "EpochStartTime1 must be set and greater than EpochStartTime0",
249
+ import_types.StatusCode.InvalidCommand
250
+ );
251
+ }
252
+ if (epochKey1 === null && epochStartTime1 !== null) {
253
+ throw new import_types.StatusResponseError("EpochKey1 must be set if EpochStartTime1 is set", import_types.StatusCode.InvalidCommand);
254
+ }
255
+ if (epochKey2 !== null && epochKey1 === null) {
256
+ throw new import_types.StatusResponseError("EpochKey1 must be set if EpochKey2 is set", import_types.StatusCode.InvalidCommand);
257
+ }
258
+ if (epochKey2 !== null && (epochStartTime2 === null || epochStartTime1 === null || epochStartTime2 <= epochStartTime1)) {
259
+ throw new import_types.StatusResponseError(
260
+ "EpochStartTime2 must be set and greater than EpochStartTime1",
261
+ import_types.StatusCode.InvalidCommand
262
+ );
263
+ }
264
+ if (epochKey2 === null && epochStartTime2 !== null) {
265
+ throw new import_types.StatusResponseError("EpochKey2 must be set if EpochStartTime2 is set", import_types.StatusCode.InvalidCommand);
266
+ }
267
+ if (groupKeySecurityPolicy !== import_group_key_management.GroupKeyManagement.GroupKeySecurityPolicy.TrustFirst) {
268
+ throw new import_types.StatusResponseError("GroupKeySecurityPolicy must be TrustFirst", import_types.StatusCode.InvalidCommand);
269
+ }
270
+ if (groupKeyMulticastPolicy !== import_group_key_management.GroupKeyManagement.GroupKeyMulticastPolicy.PerGroupId) {
271
+ throw new import_types.StatusResponseError("GroupKeyMulticastPolicy must be PerGroupId", import_types.StatusCode.InvalidCommand);
272
+ }
273
+ const fabric = this.session.associatedFabric;
274
+ const fabricIndex = fabric.fabricIndex;
275
+ const existingIndex = this.state.groupKeySets.findIndex(
276
+ ({ groupKeySetId: entryId, fabricIndex: entryIndex }) => entryIndex === fabricIndex && entryId === groupKeySetId
46
277
  );
278
+ if (existingIndex !== -1) {
279
+ this.state.groupKeySets[existingIndex] = { ...groupKeySet, fabricIndex };
280
+ } else {
281
+ const keySetsOfFabric = this.state.groupKeySets.filter(
282
+ ({ fabricIndex: entryIndex }) => entryIndex === fabricIndex
283
+ ).length;
284
+ if (keySetsOfFabric >= this.state.maxGroupKeysPerFabric) {
285
+ throw new import_types.StatusResponseError(
286
+ `Too many group key sets for fabric ${fabricIndex}, maximum is ${this.state.maxGroupKeysPerFabric}`,
287
+ import_types.StatusCode.ResourceExhausted
288
+ );
289
+ }
290
+ this.state.groupKeySets.push({ ...groupKeySet, fabricIndex });
291
+ }
292
+ await fabric.groups.setFromGroupKeySet(groupKeySet);
47
293
  }
48
294
  keySetRead({
49
295
  groupKeySetId
50
296
  }) {
51
- if (this.context.session === void 0) {
52
- throw new import_general.ImplementationError("Session must be defined");
53
- }
54
- const fabric = this.context.session.associatedFabric;
55
- const groupKeySet = fabric.getGroupKeySet(groupKeySetId);
297
+ const fabric = this.session.associatedFabric;
298
+ const groupKeySet = fabric.groups.keySets.asGroupKeySet(groupKeySetId);
56
299
  if (groupKeySet === void 0) {
57
300
  throw new import_types.StatusResponseError(`GroupKeySet ${groupKeySetId} not found`, import_types.StatusCode.NotFound);
58
301
  }
@@ -65,21 +308,97 @@ class GroupKeyManagementServer extends import_GroupKeyManagementBehavior.GroupKe
65
308
  }
66
309
  };
67
310
  }
68
- keySetRemove({ groupKeySetId }) {
311
+ async keySetRemove({ groupKeySetId }) {
69
312
  if (groupKeySetId === 0) {
70
313
  throw new import_types.StatusResponseError(`GroupKeySet ${groupKeySetId} cannot be removed`, import_types.StatusCode.InvalidCommand);
71
314
  }
72
- throw new import_types.StatusResponseError(`GroupKeySet ${groupKeySetId} not found`, import_types.StatusCode.NotFound);
315
+ const fabric = this.session.associatedFabric;
316
+ const fabricIndex = fabric.fabricIndex;
317
+ const existingIndex = this.state.groupKeySets.findIndex(
318
+ ({ groupKeySetId: entryId, fabricIndex: entryIndex }) => entryIndex === fabricIndex && entryId === groupKeySetId
319
+ );
320
+ if (existingIndex === -1) {
321
+ throw new import_types.StatusResponseError(`GroupKeySet ${groupKeySetId} not found`, import_types.StatusCode.NotFound);
322
+ }
323
+ this.state.groupKeySets.splice(existingIndex, 1);
324
+ const groupKeyMap = (0, import_general.deepCopy)(this.state.groupKeyMap);
325
+ this.state.groupKeyMap = groupKeyMap.filter(({ groupKeySetId: entryId }) => groupKeySetId !== entryId);
326
+ await fabric.groups.removeGroupKeySet(groupKeySetId);
73
327
  }
74
328
  keySetReadAllIndices() {
75
- if (this.context.session === void 0) {
76
- throw new import_general.ImplementationError("Session must be defined");
77
- }
78
- const fabric = this.context.session.associatedFabric;
79
- const groupKeySetIDs = fabric.getAllGroupKeySets().map(({ groupKeySetId }) => groupKeySetId);
329
+ const fabric = this.session.associatedFabric;
330
+ const fabricIndex = fabric.fabricIndex;
331
+ const groupKeySetIDs = this.state.groupKeySets.filter(({ fabricIndex: entryIndex }) => entryIndex === fabricIndex).map(({ groupKeySetId }) => groupKeySetId);
332
+ groupKeySetIDs.unshift(0);
80
333
  return {
81
334
  groupKeySetIDs
82
335
  };
83
336
  }
337
+ addEndpointForGroup(fabric, groupId, endpointId, groupName) {
338
+ const fabricIndex = fabric.fabricIndex;
339
+ const existingGroupIndex = this.state.groupTable.findIndex(
340
+ (entry) => entry.groupId === groupId && entry.fabricIndex === fabricIndex
341
+ );
342
+ if (existingGroupIndex !== -1) {
343
+ if (!this.state.groupTable[existingGroupIndex].endpoints.includes(endpointId)) {
344
+ this.state.groupTable[existingGroupIndex].endpoints.push(endpointId);
345
+ fabric.groups.endpoints.set(groupId, this.state.groupTable[existingGroupIndex].endpoints);
346
+ }
347
+ this.state.groupTable[existingGroupIndex].groupName = groupName;
348
+ } else {
349
+ this.state.groupTable.push({
350
+ groupId,
351
+ endpoints: [endpointId],
352
+ groupName,
353
+ fabricIndex
354
+ });
355
+ fabric.groups.endpoints.set(groupId, [endpointId]);
356
+ }
357
+ logger.info(
358
+ `Added endpoint ${endpointId} to group ${groupId} on fabric ${fabricIndex} with name "${groupName}"`
359
+ );
360
+ }
361
+ /**
362
+ * Remove endpoint from the provided group, or all groups if no groupId is provided.
363
+ */
364
+ removeEndpoint(fabric, endpointId, groupId) {
365
+ let existing = false;
366
+ const groupTable = this.state.groupTable;
367
+ const fabricIndex = fabric.fabricIndex;
368
+ for (const entry of groupTable) {
369
+ if (entry.fabricIndex !== fabricIndex || groupId !== void 0 && entry.groupId !== groupId) {
370
+ continue;
371
+ }
372
+ const endpointExists = entry.endpoints.includes(endpointId);
373
+ if (endpointExists) {
374
+ if (entry.endpoints.length === 1 && entry.endpoints[0] === endpointId) {
375
+ const groupId2 = entry.groupId;
376
+ const index = groupTable.indexOf(entry);
377
+ groupTable.splice(index, 1);
378
+ fabric.groups.endpoints.delete(groupId2);
379
+ } else {
380
+ entry.endpoints = entry.endpoints.filter((id) => id !== endpointId);
381
+ fabric.groups.endpoints.set(entry.groupId, entry.endpoints);
382
+ }
383
+ existing = true;
384
+ }
385
+ }
386
+ return existing;
387
+ }
84
388
  }
389
+ ((GroupKeyManagementServer2) => {
390
+ class State extends import_GroupKeyManagementBehavior.GroupKeyManagementBehavior.State {
391
+ /**
392
+ * Extended state to hold and persist the group key sets for this server. This structure contains all
393
+ * GroupKeySet entries for all fabrics beside the fabric specific entries of the groupKeyset 0
394
+ */
395
+ groupKeySets = [];
396
+ // Overwrite defaults to allow more than 3 group keys and 4 groups per fabric, because we can
397
+ maxGroupKeysPerFabric = 20;
398
+ // The Minimum would be 3;
399
+ maxGroupsPerFabric = 21;
400
+ // The Minimum would be 4;
401
+ }
402
+ GroupKeyManagementServer2.State = State;
403
+ })(GroupKeyManagementServer || (GroupKeyManagementServer = {}));
85
404
  //# sourceMappingURL=GroupKeyManagementServer.js.map
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/behaviors/group-key-management/GroupKeyManagementServer.ts"],
4
- "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAOA,qBAAkD;AAClD,mBAAgD;AAChD,wCAA2C;AAT3C;AAAA;AAAA;AAAA;AAAA;AAcO,MAAM,iCAAiC,6DAA2B;AAAA,EAC5D,aAA2B;AAChC,QAAI,KAAK,MAAM,0BAA0B,GAAG;AACxC,YAAM,IAAI,mCAAoB,0CAA0C;AAAA,IAC5E;AACA,QAAI,KAAK,MAAM,uBAAuB,GAAG;AACrC,YAAM,IAAI,mCAAoB,uCAAuC;AAAA,IACzE;AACA,SAAK,MAAM,aAAa,CAAC;AAAA,EAC7B;AAAA,EAES,cAA4B;AACjC,UAAM,IAAI;AAAA,MACN;AAAA,MACA,wBAAW;AAAA,IACf;AAAA,EACJ;AAAA,EAES,WAAW;AAAA,IAChB;AAAA,EACJ,GAA8F;AAC1F,QAAI,KAAK,QAAQ,YAAY,QAAW;AACpC,YAAM,IAAI,mCAAoB,yBAAyB;AAAA,IAC3D;AACA,UAAM,SAAS,KAAK,QAAQ,QAAQ;AAEpC,UAAM,cAAc,OAAO,eAAe,aAAa;AACvD,QAAI,gBAAgB,QAAW;AAC3B,YAAM,IAAI,iCAAoB,eAAe,aAAa,cAAc,wBAAW,QAAQ;AAAA,IAC/F;AAEA,WAAO;AAAA,MACH,aAAa;AAAA,QACT,GAAG;AAAA,QACH,WAAW;AAAA,QACX,WAAW;AAAA,QACX,WAAW;AAAA,MACf;AAAA,IACJ;AAAA,EACJ;AAAA,EAES,aAAa,EAAE,cAAc,GAAyD;AAC3F,QAAI,kBAAkB,GAAG;AACrB,YAAM,IAAI,iCAAoB,eAAe,aAAa,sBAAsB,wBAAW,cAAc;AAAA,IAC7G;AAGA,UAAM,IAAI,iCAAoB,eAAe,aAAa,cAAc,wBAAW,QAAQ;AAAA,EAC/F;AAAA,EAES,uBAAsF;AAC3F,QAAI,KAAK,QAAQ,YAAY,QAAW;AACpC,YAAM,IAAI,mCAAoB,yBAAyB;AAAA,IAC3D;AACA,UAAM,SAAS,KAAK,QAAQ,QAAQ;AAEpC,UAAM,iBAAiB,OAAO,mBAAmB,EAAE,IAAI,CAAC,EAAE,cAAc,MAAM,aAAa;AAE3F,WAAO;AAAA,MACH;AAAA,IACJ;AAAA,EACJ;AACJ;",
5
- "names": []
4
+ "mappings": "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",
5
+ "names": ["groupId", "GroupKeyManagementServer"]
6
6
  }
@@ -3,11 +3,27 @@
3
3
  * Copyright 2022-2025 Matter.js Authors
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
- /*** THIS FILE WILL BE REGENERATED IF YOU DO NOT REMOVE THIS MESSAGE ***/
7
- import { GroupsBehavior } from "./GroupsBehavior.js";
6
+ import { Groups } from "#clusters/groups";
7
+ declare const GroupsBase: import("../../index.js").ClusterBehavior.Type<import("#types").ClusterComposer.WithFeatures<Groups.Cluster, readonly [Groups.Feature]>, import("../../index.js").ClusterBehavior.Type<Groups.Cluster, import("../../index.js").ClusterBehavior.Type<import("#types").ClusterType.Of<{
8
+ readonly id: 0;
9
+ readonly revision: 0;
10
+ readonly name: "Unknown";
11
+ readonly attributes: {};
12
+ readonly commands: {};
13
+ readonly events: {};
14
+ }>, typeof import("../../index.js").ClusterBehavior, import("./GroupsInterface.js").GroupsInterface>, import("./GroupsInterface.js").GroupsInterface>, import("./GroupsInterface.js").GroupsInterface>;
8
15
  /**
9
16
  * This is the default server implementation of {@link GroupsBehavior}.
10
17
  */
11
- export declare class GroupsServer extends GroupsBehavior {
18
+ export declare class GroupsServer extends GroupsBase {
19
+ #private;
20
+ initialize(): void;
21
+ addGroup({ groupId, groupName }: Groups.AddGroupRequest): Promise<Groups.AddGroupResponse>;
22
+ viewGroup({ groupId }: Groups.ViewGroupRequest): Groups.ViewGroupResponse;
23
+ getGroupMembership({ groupList, }: Groups.GetGroupMembershipRequest): Promise<Groups.GetGroupMembershipResponse>;
24
+ removeGroup({ groupId }: Groups.RemoveGroupRequest): Promise<Groups.RemoveGroupResponse>;
25
+ removeAllGroups(): Promise<void>;
26
+ addGroupIfIdentifying({ groupId, groupName }: Groups.AddGroupIfIdentifyingRequest): Promise<void>;
12
27
  }
28
+ export {};
13
29
  //# sourceMappingURL=GroupsServer.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"GroupsServer.d.ts","sourceRoot":"","sources":["../../../../src/behaviors/groups/GroupsServer.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,yEAAyE;AAEzE,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD;;GAEG;AACH,qBAAa,YAAa,SAAQ,cAAc;CAAG"}
1
+ {"version":3,"file":"GroupsServer.d.ts","sourceRoot":"","sources":["../../../../src/behaviors/groups/GroupsServer.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAqB1C,QAAA,MAAM,UAAU;;;;;;;sMAAiD,CAAC;AA+BlE;;GAEG;AACH,qBAAa,YAAa,SAAQ,UAAU;;IAC/B,UAAU;IAkBJ,QAAQ,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,CAAC,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,gBAAgB,CAAC;IA6BhG,SAAS,CAAC,EAAE,OAAO,EAAE,EAAE,MAAM,CAAC,gBAAgB,GAAG,MAAM,CAAC,iBAAiB;IAkBnE,kBAAkB,CAAC,EAC9B,SAAS,GACZ,EAAE,MAAM,CAAC,yBAAyB,GAAG,OAAO,CAAC,MAAM,CAAC,0BAA0B,CAAC;IAmBjE,WAAW,CAAC,EAAE,OAAO,EAAE,EAAE,MAAM,CAAC,kBAAkB,GAAG,OAAO,CAAC,MAAM,CAAC,mBAAmB,CAAC;IAqBxF,eAAe;IAWf,qBAAqB,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,CAAC,4BAA4B;CASnG"}
@@ -21,12 +21,149 @@ __export(GroupsServer_exports, {
21
21
  GroupsServer: () => GroupsServer
22
22
  });
23
23
  module.exports = __toCommonJS(GroupsServer_exports);
24
+ var import_group_key_management = require("#behaviors/group-key-management");
25
+ var import_identify = require("#behaviors/identify");
26
+ var import_groups = require("#clusters/groups");
27
+ var import_root = require("#endpoints/root");
28
+ var import_general = require("#general");
29
+ var import_model = require("#model");
30
+ var import_types = require("#types");
31
+ var import_general2 = require("@matter/general");
24
32
  var import_GroupsBehavior = require("./GroupsBehavior.js");
25
33
  /**
26
34
  * @license
27
35
  * Copyright 2022-2025 Matter.js Authors
28
36
  * SPDX-License-Identifier: Apache-2.0
29
37
  */
30
- class GroupsServer extends import_GroupsBehavior.GroupsBehavior {
38
+ const logger = import_general.Logger.get("GroupsServer");
39
+ const GroupsBase = import_GroupsBehavior.GroupsBehavior.with(import_groups.Groups.Feature.GroupNames);
40
+ import_groups.Groups.Cluster.commands = {
41
+ ...import_groups.Groups.Cluster.commands,
42
+ addGroup: (0, import_types.Command)(
43
+ 0,
44
+ (0, import_types.TlvObject)({
45
+ groupId: (0, import_types.TlvField)(0, import_types.TlvGroupId),
46
+ groupName: (0, import_types.TlvField)(1, import_types.TlvString)
47
+ }),
48
+ 0,
49
+ import_groups.Groups.TlvAddGroupResponse,
50
+ { invokeAcl: import_model.AccessLevel.Manage }
51
+ ),
52
+ addGroupIfIdentifying: (0, import_types.Command)(
53
+ 5,
54
+ (0, import_types.TlvObject)({
55
+ groupId: (0, import_types.TlvField)(0, import_types.TlvGroupId),
56
+ groupName: (0, import_types.TlvField)(1, import_types.TlvString)
57
+ }),
58
+ 5,
59
+ import_types.TlvNoResponse,
60
+ { invokeAcl: import_model.AccessLevel.Manage }
61
+ )
62
+ };
63
+ class GroupsServer extends GroupsBase {
64
+ initialize() {
65
+ this.state.nameSupport.groupNames = this.features.groupNames;
66
+ }
67
+ // We need to search the root here ourselves because we cannot include ServerNode because else we generate a
68
+ // circular dependency
69
+ #rootEndpoint() {
70
+ const rootEndpoint = this.endpoint.ownerOfType(import_root.RootEndpoint);
71
+ if (rootEndpoint === void 0) {
72
+ throw new import_general2.InternalError("RootEndpoint not found");
73
+ }
74
+ return rootEndpoint;
75
+ }
76
+ #actOnGroupKeyManagement(act) {
77
+ return this.#rootEndpoint().act((agent) => act(agent.get(import_group_key_management.GroupKeyManagementServer)));
78
+ }
79
+ async addGroup({ groupId, groupName }) {
80
+ const fabric = this.session.associatedFabric;
81
+ if (groupId < 1) {
82
+ return { status: import_types.StatusCode.ConstraintError, groupId };
83
+ }
84
+ if (groupName.length > 16) {
85
+ return { status: import_types.StatusCode.ConstraintError, groupId };
86
+ }
87
+ if (!fabric.groups.groupKeyIdMap.has(groupId)) {
88
+ return { status: import_types.StatusCode.UnsupportedAccess, groupId };
89
+ }
90
+ const endpointNumber = this.endpoint.number;
91
+ try {
92
+ await this.#actOnGroupKeyManagement(
93
+ (gkm) => gkm.addEndpointForGroup(fabric, groupId, endpointNumber, groupName)
94
+ );
95
+ } catch (error) {
96
+ logger.error(error);
97
+ import_types.StatusResponseError.accept(error);
98
+ return { status: error.code, groupId };
99
+ }
100
+ return { status: import_types.StatusCode.Success, groupId };
101
+ }
102
+ viewGroup({ groupId }) {
103
+ const fabric = this.session.associatedFabric;
104
+ if (groupId < 1) {
105
+ return { status: import_types.StatusCode.ConstraintError, groupId, groupName: "" };
106
+ }
107
+ const fabricIndex = fabric.fabricIndex;
108
+ const endpointNumber = this.endpoint.number;
109
+ const { groupTable } = this.#rootEndpoint().stateOf(import_group_key_management.GroupKeyManagementServer);
110
+ const groupEntry = groupTable.find((entry) => entry.groupId === groupId && entry.fabricIndex === fabricIndex);
111
+ if (groupEntry === void 0 || !groupEntry.endpoints.includes(endpointNumber)) {
112
+ return { status: import_types.StatusCode.NotFound, groupId, groupName: "" };
113
+ }
114
+ return { status: import_types.StatusCode.Success, groupId, groupName: groupEntry.groupName ?? "" };
115
+ }
116
+ async getGroupMembership({
117
+ groupList
118
+ }) {
119
+ const fabric = this.session.associatedFabric;
120
+ const fabricIndex = fabric.fabricIndex;
121
+ const endpointNumber = this.endpoint.number;
122
+ const { groupTable } = this.#rootEndpoint().stateOf(import_group_key_management.GroupKeyManagementServer);
123
+ const endpointGroups = groupTable.filter(
124
+ (entry) => entry.endpoints.includes(endpointNumber) && entry.fabricIndex === fabricIndex
125
+ );
126
+ const fabricGroupsList = endpointGroups.map((entry) => entry.groupId);
127
+ if (groupList.length === 0) {
128
+ return { capacity: 254 - fabricGroupsList.length, groupList: fabricGroupsList };
129
+ }
130
+ const filteredGroupsList = groupList.filter((groupId) => fabricGroupsList.includes(groupId));
131
+ return { capacity: 254 - fabricGroupsList.length, groupList: filteredGroupsList };
132
+ }
133
+ async removeGroup({ groupId }) {
134
+ if (groupId < 1) {
135
+ return { status: import_types.StatusCode.ConstraintError, groupId };
136
+ }
137
+ try {
138
+ if (await this.#actOnGroupKeyManagement(
139
+ (gkm) => gkm.removeEndpoint(this.session.associatedFabric, this.endpoint.number, groupId)
140
+ )) {
141
+ return { status: import_types.StatusCode.Success, groupId };
142
+ }
143
+ return { status: import_types.StatusCode.NotFound, groupId };
144
+ } catch (error) {
145
+ import_types.StatusResponseError.accept(error);
146
+ return { status: error.code, groupId };
147
+ }
148
+ }
149
+ // TODO ScenesManagement cluster is also affected by this command
150
+ async removeAllGroups() {
151
+ try {
152
+ await this.#actOnGroupKeyManagement(
153
+ (gkm) => gkm.removeEndpoint(this.session.associatedFabric, this.endpoint.number)
154
+ );
155
+ } catch (error) {
156
+ import_types.StatusResponseError.accept(error);
157
+ throw error;
158
+ }
159
+ }
160
+ async addGroupIfIdentifying({ groupId, groupName }) {
161
+ if (this.endpoint.stateOf(import_identify.IdentifyBehavior).identifyTime > 0) {
162
+ const { status } = await this.addGroup({ groupId, groupName });
163
+ if (status !== import_types.StatusCode.Success) {
164
+ throw new import_types.StatusResponseError(`Failed to add group ${groupId}`, status);
165
+ }
166
+ }
167
+ }
31
168
  }
32
169
  //# sourceMappingURL=GroupsServer.js.map
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/behaviors/groups/GroupsServer.ts"],
4
- "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAQA,4BAA+B;AAR/B;AAAA;AAAA;AAAA;AAAA;AAaO,MAAM,qBAAqB,qCAAe;AAAC;",
5
- "names": []
4
+ "mappings": "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",
5
+ "names": ["import_general"]
6
6
  }