@matter/protocol 0.13.1-alpha.0-20250508-047aa0277 → 0.13.1-alpha.0-20250511-74ef153aa

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 (118) hide show
  1. package/dist/cjs/action/protocols.d.ts +59 -2
  2. package/dist/cjs/action/protocols.d.ts.map +1 -1
  3. package/dist/cjs/action/request/Read.d.ts +2 -2
  4. package/dist/cjs/action/request/Read.d.ts.map +1 -1
  5. package/dist/cjs/action/request/Read.js +4 -4
  6. package/dist/cjs/action/request/Read.js.map +1 -1
  7. package/dist/cjs/action/response/ReadResult.d.ts +6 -2
  8. package/dist/cjs/action/response/ReadResult.d.ts.map +1 -1
  9. package/dist/cjs/action/server/AttributeResponse.d.ts +46 -17
  10. package/dist/cjs/action/server/AttributeResponse.d.ts.map +1 -1
  11. package/dist/cjs/action/server/AttributeResponse.js +128 -110
  12. package/dist/cjs/action/server/AttributeResponse.js.map +2 -2
  13. package/dist/cjs/action/server/AttributeSubscriptionResponse.d.ts +36 -0
  14. package/dist/cjs/action/server/AttributeSubscriptionResponse.d.ts.map +1 -0
  15. package/dist/cjs/action/server/AttributeSubscriptionResponse.js +86 -0
  16. package/dist/cjs/action/server/AttributeSubscriptionResponse.js.map +6 -0
  17. package/dist/cjs/action/server/DataResponse.d.ts +45 -0
  18. package/dist/cjs/action/server/DataResponse.d.ts.map +1 -0
  19. package/dist/cjs/action/server/DataResponse.js +69 -0
  20. package/dist/cjs/action/server/DataResponse.js.map +6 -0
  21. package/dist/cjs/action/server/EventResponse.d.ts +28 -0
  22. package/dist/cjs/action/server/EventResponse.d.ts.map +1 -0
  23. package/dist/cjs/action/server/EventResponse.js +318 -0
  24. package/dist/cjs/action/server/EventResponse.js.map +6 -0
  25. package/dist/cjs/action/server/ServerInteraction.d.ts.map +1 -1
  26. package/dist/cjs/action/server/ServerInteraction.js +15 -2
  27. package/dist/cjs/action/server/ServerInteraction.js.map +1 -1
  28. package/dist/cjs/action/server/index.d.ts +3 -0
  29. package/dist/cjs/action/server/index.d.ts.map +1 -1
  30. package/dist/cjs/action/server/index.js +3 -0
  31. package/dist/cjs/action/server/index.js.map +1 -1
  32. package/dist/cjs/events/OccurrenceManager.d.ts +20 -11
  33. package/dist/cjs/events/OccurrenceManager.d.ts.map +1 -1
  34. package/dist/cjs/events/OccurrenceManager.js +113 -74
  35. package/dist/cjs/events/OccurrenceManager.js.map +1 -1
  36. package/dist/cjs/interaction/InteractionMessenger.d.ts +14 -2
  37. package/dist/cjs/interaction/InteractionMessenger.d.ts.map +1 -1
  38. package/dist/cjs/interaction/InteractionMessenger.js +87 -3
  39. package/dist/cjs/interaction/InteractionMessenger.js.map +1 -1
  40. package/dist/cjs/interaction/index.d.ts +0 -1
  41. package/dist/cjs/interaction/index.d.ts.map +1 -1
  42. package/dist/cjs/interaction/index.js +0 -1
  43. package/dist/cjs/interaction/index.js.map +1 -1
  44. package/dist/cjs/peer/ControllerCommissioningFlow.js +1 -1
  45. package/dist/cjs/protocol/MessageExchange.d.ts.map +1 -1
  46. package/dist/cjs/protocol/MessageExchange.js +11 -1
  47. package/dist/cjs/protocol/MessageExchange.js.map +1 -1
  48. package/dist/esm/action/protocols.d.ts +59 -2
  49. package/dist/esm/action/protocols.d.ts.map +1 -1
  50. package/dist/esm/action/request/Read.d.ts +2 -2
  51. package/dist/esm/action/request/Read.d.ts.map +1 -1
  52. package/dist/esm/action/request/Read.js +4 -4
  53. package/dist/esm/action/request/Read.js.map +1 -1
  54. package/dist/esm/action/response/ReadResult.d.ts +6 -2
  55. package/dist/esm/action/response/ReadResult.d.ts.map +1 -1
  56. package/dist/esm/action/server/AttributeResponse.d.ts +46 -17
  57. package/dist/esm/action/server/AttributeResponse.d.ts.map +1 -1
  58. package/dist/esm/action/server/AttributeResponse.js +129 -113
  59. package/dist/esm/action/server/AttributeResponse.js.map +1 -1
  60. package/dist/esm/action/server/AttributeSubscriptionResponse.d.ts +36 -0
  61. package/dist/esm/action/server/AttributeSubscriptionResponse.d.ts.map +1 -0
  62. package/dist/esm/action/server/AttributeSubscriptionResponse.js +66 -0
  63. package/dist/esm/action/server/AttributeSubscriptionResponse.js.map +6 -0
  64. package/dist/esm/action/server/DataResponse.d.ts +45 -0
  65. package/dist/esm/action/server/DataResponse.d.ts.map +1 -0
  66. package/dist/esm/action/server/DataResponse.js +49 -0
  67. package/dist/esm/action/server/DataResponse.js.map +6 -0
  68. package/dist/esm/action/server/EventResponse.d.ts +28 -0
  69. package/dist/esm/action/server/EventResponse.d.ts.map +1 -0
  70. package/dist/esm/action/server/EventResponse.js +305 -0
  71. package/dist/esm/action/server/EventResponse.js.map +6 -0
  72. package/dist/esm/action/server/ServerInteraction.d.ts.map +1 -1
  73. package/dist/esm/action/server/ServerInteraction.js +16 -3
  74. package/dist/esm/action/server/ServerInteraction.js.map +1 -1
  75. package/dist/esm/action/server/index.d.ts +3 -0
  76. package/dist/esm/action/server/index.d.ts.map +1 -1
  77. package/dist/esm/action/server/index.js +3 -0
  78. package/dist/esm/action/server/index.js.map +1 -1
  79. package/dist/esm/events/OccurrenceManager.d.ts +20 -11
  80. package/dist/esm/events/OccurrenceManager.d.ts.map +1 -1
  81. package/dist/esm/events/OccurrenceManager.js +117 -80
  82. package/dist/esm/events/OccurrenceManager.js.map +1 -1
  83. package/dist/esm/interaction/InteractionMessenger.d.ts +14 -2
  84. package/dist/esm/interaction/InteractionMessenger.d.ts.map +1 -1
  85. package/dist/esm/interaction/InteractionMessenger.js +87 -3
  86. package/dist/esm/interaction/InteractionMessenger.js.map +1 -1
  87. package/dist/esm/interaction/index.d.ts +0 -1
  88. package/dist/esm/interaction/index.d.ts.map +1 -1
  89. package/dist/esm/interaction/index.js +0 -1
  90. package/dist/esm/interaction/index.js.map +1 -1
  91. package/dist/esm/peer/ControllerCommissioningFlow.js +1 -1
  92. package/dist/esm/protocol/MessageExchange.d.ts.map +1 -1
  93. package/dist/esm/protocol/MessageExchange.js +11 -1
  94. package/dist/esm/protocol/MessageExchange.js.map +1 -1
  95. package/package.json +6 -6
  96. package/src/action/protocols.ts +68 -2
  97. package/src/action/request/Read.ts +2 -2
  98. package/src/action/response/ReadResult.ts +8 -1
  99. package/src/action/server/AttributeResponse.ts +145 -118
  100. package/src/action/server/AttributeSubscriptionResponse.ts +90 -0
  101. package/src/action/server/DataResponse.ts +70 -0
  102. package/src/action/server/EventResponse.ts +381 -0
  103. package/src/action/server/ServerInteraction.ts +18 -4
  104. package/src/action/server/index.ts +3 -0
  105. package/src/events/OccurrenceManager.ts +126 -100
  106. package/src/interaction/InteractionMessenger.ts +93 -8
  107. package/src/interaction/index.ts +0 -1
  108. package/src/peer/ControllerCommissioningFlow.ts +1 -1
  109. package/src/protocol/MessageExchange.ts +13 -1
  110. package/dist/cjs/interaction/ServerSubscription.d.ts +0 -116
  111. package/dist/cjs/interaction/ServerSubscription.d.ts.map +0 -1
  112. package/dist/cjs/interaction/ServerSubscription.js +0 -778
  113. package/dist/cjs/interaction/ServerSubscription.js.map +0 -6
  114. package/dist/esm/interaction/ServerSubscription.d.ts +0 -116
  115. package/dist/esm/interaction/ServerSubscription.d.ts.map +0 -1
  116. package/dist/esm/interaction/ServerSubscription.js +0 -778
  117. package/dist/esm/interaction/ServerSubscription.js.map +0 -6
  118. package/src/interaction/ServerSubscription.ts +0 -1038
@@ -4,32 +4,19 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
  import { AccessControl } from "#action/server/AccessControl.js";
7
- import { InternalError } from "#general";
8
- import { AccessLevel, ElementTag } from "#model";
7
+ import { DataResponse, FallbackLimits, WildcardPathFlagsCodec } from "#action/server/DataResponse.js";
8
+ import { Diagnostic, InternalError, Logger } from "#general";
9
+ import { DataModelPath, ElementTag } from "#model";
9
10
  import {
10
- BitmapSchema,
11
11
  GlobalAttributes,
12
12
  NodeId,
13
13
  Status,
14
- StatusResponseError,
15
- WildcardPathFlagsBitmap
14
+ StatusResponseError
16
15
  } from "#types";
17
- import { DataModelPath } from "@matter/model";
16
+ import { StatusCode } from "@matter/types";
17
+ const logger = Logger.get("AttributeResponse");
18
18
  const GlobalAttrIds = new Set(Object.values(GlobalAttributes({})).map((attr) => attr.id));
19
- const WildcardPathFlagsCodec = BitmapSchema(WildcardPathFlagsBitmap);
20
- const FallbackLimits = {
21
- fabricScoped: false,
22
- fabricSensitive: false,
23
- readable: true,
24
- readLevel: AccessLevel.View,
25
- timed: false,
26
- writable: true,
27
- writeLevel: AccessLevel.Administer
28
- };
29
- class AttributeResponse {
30
- // Configuration
31
- #session;
32
- #node;
19
+ class AttributeResponse extends DataResponse {
33
20
  #versions;
34
21
  // Each input AttributePathIB that does not have an error installs a producer. Producers run after validation and
35
22
  // generate actual attribute data
@@ -43,12 +30,15 @@ class AttributeResponse {
43
30
  #currentCluster;
44
31
  #currentState;
45
32
  #wildcardPathFlags = 0;
46
- // The node ID may be expensive to retrieve and is invariant so we cache it here
47
- #cachedNodeId;
48
- constructor(node, session, { dataVersionFilters, attributeRequests }) {
49
- this.#node = node;
50
- this.#session = session;
51
- const nodeId = session.fabric === void 0 ? NodeId.UNSPECIFIED_NODE_ID : this.#nodeId;
33
+ // Count how many attribute status (on error) and attribute values (on success) we have emitted
34
+ #statusCount = 0;
35
+ #valueCount = 0;
36
+ #filteredCount = 0;
37
+ constructor(node, session) {
38
+ super(node, session);
39
+ }
40
+ *process({ dataVersionFilters, attributeRequests }) {
41
+ const nodeId = this.session.fabric === void 0 ? NodeId.UNSPECIFIED_NODE_ID : this.nodeId;
52
42
  if (dataVersionFilters?.length) {
53
43
  this.#versions = {};
54
44
  for (const {
@@ -66,16 +56,11 @@ class AttributeResponse {
66
56
  }
67
57
  for (const path of attributeRequests) {
68
58
  if (path.endpointId === void 0 || path.clusterId === void 0 || path.attributeId === void 0) {
69
- this.#addWildcard(path);
59
+ this.addWildcard(path);
70
60
  } else {
71
- this.#addConcrete(path);
61
+ this.addConcrete(path);
72
62
  }
73
63
  }
74
- }
75
- /**
76
- * Emits chunks produced by paths added via {@link #addWildcard} and {@link #addConcrete}.
77
- */
78
- *[Symbol.iterator]() {
79
64
  if (this.#dataProducers) {
80
65
  for (const producer of this.#dataProducers) {
81
66
  yield* producer.apply(this);
@@ -85,52 +70,74 @@ class AttributeResponse {
85
70
  yield this.#chunk;
86
71
  }
87
72
  }
73
+ /** Guarded accessor for this.#currentEndpoint. This should never be undefined */
74
+ get #guardedCurrentEndpoint() {
75
+ if (this.#currentEndpoint === void 0) {
76
+ throw new InternalError("currentEndpoint is not set. Should never happen");
77
+ }
78
+ return this.#currentEndpoint;
79
+ }
80
+ /** Guarded accessor for this.#currentCluster. This should never be undefined */
81
+ get #guardedCurrentCluster() {
82
+ if (this.#currentCluster === void 0) {
83
+ throw new InternalError("currentCluster is not set. Should never happen");
84
+ }
85
+ return this.#currentCluster;
86
+ }
87
+ get counts() {
88
+ return {
89
+ status: this.#statusCount,
90
+ value: this.#valueCount,
91
+ existent: this.#valueCount + this.#filteredCount
92
+ };
93
+ }
88
94
  /**
89
95
  * Validate a wildcard path and update internal state.
90
96
  */
91
- #addWildcard(path) {
97
+ addWildcard(path) {
92
98
  const { nodeId, endpointId, clusterId, attributeId, wildcardPathFlags } = path;
93
- if (nodeId !== void 0 && nodeId !== this.#nodeId) {
94
- return;
95
- }
96
- const wpf = wildcardPathFlags ? WildcardPathFlagsCodec.encode(wildcardPathFlags) : 0;
97
99
  if (clusterId === void 0 && attributeId !== void 0 && !GlobalAttrIds.has(attributeId)) {
98
100
  throw new StatusResponseError(
99
101
  `Illegal read of wildcard cluster with non-global attribute #${attributeId}`,
100
102
  Status.InvalidAction
101
103
  );
102
104
  }
105
+ if (nodeId !== void 0 && nodeId !== this.nodeId) {
106
+ return;
107
+ }
108
+ const wpf = wildcardPathFlags ? WildcardPathFlagsCodec.encode(wildcardPathFlags) : 0;
103
109
  if (endpointId === void 0) {
104
110
  this.#addProducer(function* () {
105
111
  this.#wildcardPathFlags = wpf;
106
- for (const endpoint2 of this.#node) {
107
- yield* this.#readEndpointForWildcard(endpoint2, path);
112
+ for (const endpoint2 of this.node) {
113
+ yield* this.readEndpointForWildcard(endpoint2, path);
108
114
  }
109
115
  });
110
116
  return;
111
117
  }
112
- const endpoint = this.#node[endpointId];
118
+ const endpoint = this.node[endpointId];
113
119
  if (endpoint) {
114
120
  this.#addProducer(function() {
115
121
  this.#wildcardPathFlags = wpf;
116
- return this.#readEndpointForWildcard(endpoint, path);
122
+ return this.readEndpointForWildcard(endpoint, path);
117
123
  });
118
124
  }
119
125
  }
120
126
  /**
121
127
  * Validate a concrete path and update internal state.
122
128
  */
123
- #addConcrete(path) {
129
+ addConcrete(path) {
124
130
  const { nodeId, endpointId, clusterId, attributeId } = path;
125
- if (nodeId !== void 0 && this.#nodeId !== nodeId) {
126
- this.#addStatus(path, Status.UnsupportedNode);
131
+ if (nodeId !== void 0 && this.nodeId !== nodeId) {
132
+ this.addStatus(path, Status.UnsupportedNode);
133
+ return;
127
134
  }
128
- const endpoint = this.#node[endpointId];
135
+ const endpoint = this.node[endpointId];
129
136
  const cluster = endpoint?.[clusterId];
130
137
  const attribute = cluster?.type.attributes[attributeId];
131
138
  let limits;
132
139
  if (attribute === void 0) {
133
- const modelAttr = this.#node.matter.member(path.clusterId, [ElementTag.Cluster])?.member(path.attributeId, [ElementTag.Attribute]);
140
+ const modelAttr = this.node.matter.member(path.clusterId, [ElementTag.Cluster])?.member(path.attributeId, [ElementTag.Attribute]);
134
141
  if (modelAttr) {
135
142
  limits = AccessControl(modelAttr).limits;
136
143
  } else {
@@ -145,39 +152,40 @@ class AttributeResponse {
145
152
  endpoint: endpointId,
146
153
  cluster: clusterId
147
154
  },
148
- owningFabric: this.#session.fabric
155
+ owningFabric: this.session.fabric
149
156
  };
150
- const permission = this.#session.authorityAt(limits.readLevel, location);
157
+ const permission = this.session.authorityAt(limits.readLevel, location);
151
158
  switch (permission) {
152
159
  case AccessControl.Authority.Granted:
153
160
  break;
154
161
  case AccessControl.Authority.Unauthorized:
155
- this.#addStatus(path, Status.UnsupportedAccess);
162
+ this.addStatus(path, Status.UnsupportedAccess);
156
163
  return;
157
164
  case AccessControl.Authority.Restricted:
158
- this.#addStatus(path, Status.AccessRestricted);
165
+ this.addStatus(path, Status.AccessRestricted);
159
166
  return;
160
167
  default:
161
168
  throw new InternalError(`Unsupported authorization state ${permission}`);
162
169
  }
163
170
  if (endpoint === void 0) {
164
- this.#addStatus(path, Status.UnsupportedEndpoint);
171
+ this.addStatus(path, Status.UnsupportedEndpoint);
165
172
  return;
166
173
  }
167
174
  if (cluster === void 0) {
168
- this.#addStatus(path, Status.UnsupportedCluster);
175
+ this.addStatus(path, Status.UnsupportedCluster);
169
176
  return;
170
177
  }
171
- if (attribute === void 0) {
172
- this.#addStatus(path, Status.UnsupportedAttribute);
178
+ if (attribute === void 0 || !cluster.type.attributes[attribute.id]) {
179
+ this.addStatus(path, Status.UnsupportedAttribute);
173
180
  return;
174
181
  }
175
182
  if (!limits.readable) {
176
- this.#addStatus(path, Status.UnsupportedRead);
183
+ this.addStatus(path, Status.UnsupportedRead);
177
184
  return;
178
185
  }
179
186
  const skipVersion = this.#versions?.[path.endpointId]?.[path.clusterId];
180
187
  if (skipVersion !== void 0 && skipVersion === cluster.version) {
188
+ this.#filteredCount++;
181
189
  return;
182
190
  }
183
191
  this.#addProducer(function* () {
@@ -188,19 +196,19 @@ class AttributeResponse {
188
196
  }
189
197
  this.#currentEndpoint = endpoint;
190
198
  this.#currentCluster = cluster;
191
- this.#currentState = cluster.open(this.#session);
199
+ this.#currentState = cluster.open(this.session);
192
200
  } else if (this.#currentCluster !== cluster) {
193
201
  this.#currentCluster = cluster;
194
- this.#currentState = cluster.open(this.#session);
202
+ this.#currentState = cluster.open(this.session);
195
203
  } else if (this.#currentState === void 0) {
196
- this.#currentState = cluster.open(this.#session);
204
+ this.#currentState = cluster.open(this.session);
197
205
  }
198
- this.#addValue(
199
- path,
200
- this.#currentState[attributeId],
201
- cluster.version,
202
- this.#currentCluster.type.attributes[attributeId].tlv
206
+ const value = this.#currentState[attributeId];
207
+ const version = cluster.version;
208
+ logger.debug(
209
+ () => `Reading attribute ${this.node.inspectPath(path)}=${Diagnostic.json(value)} (version=${version})`
203
210
  );
211
+ this.#addValue(path, value, version, this.#currentCluster.type.attributes[attributeId].tlv);
204
212
  });
205
213
  }
206
214
  /**
@@ -211,9 +219,9 @@ class AttributeResponse {
211
219
  *
212
220
  * {@link this.#wildcardPathFlags} to numeric bitmap must be set prior to invocation.
213
221
  *
214
- * TODO - skip endpoints for which subject is unauthorized
222
+ * TODO - skip endpoints for which subject is unauthorized as optimization
215
223
  */
216
- *#readEndpointForWildcard(endpoint, path) {
224
+ *readEndpointForWildcard(endpoint, path) {
217
225
  if (endpoint.wildcardPathFlags & this.#wildcardPathFlags) {
218
226
  return;
219
227
  }
@@ -228,12 +236,12 @@ class AttributeResponse {
228
236
  const { clusterId } = path;
229
237
  if (clusterId === void 0) {
230
238
  for (const cluster of endpoint) {
231
- this.#readClusterForWildcard(cluster, path);
239
+ this.readClusterForWildcard(cluster, path);
232
240
  }
233
241
  } else {
234
242
  const cluster = endpoint[clusterId];
235
243
  if (cluster !== void 0) {
236
- this.#readClusterForWildcard(cluster, path);
244
+ this.readClusterForWildcard(cluster, path);
237
245
  }
238
246
  }
239
247
  }
@@ -244,7 +252,7 @@ class AttributeResponse {
244
252
  *
245
253
  * TODO - skip clusters for which subject is unauthorized
246
254
  */
247
- #readClusterForWildcard(cluster, path) {
255
+ readClusterForWildcard(cluster, path) {
248
256
  if (cluster.type.wildcardPathFlags & this.#wildcardPathFlags) {
249
257
  return;
250
258
  }
@@ -252,19 +260,29 @@ class AttributeResponse {
252
260
  this.#currentCluster = cluster;
253
261
  this.#currentState = void 0;
254
262
  }
255
- const skipVersion = this.#versions?.[this.#currentEndpoint.id]?.[cluster.type.id];
256
- if (skipVersion !== void 0 && skipVersion === cluster.version) {
257
- return;
258
- }
259
263
  const { attributeId } = path;
264
+ const skipVersion = this.#versions?.[this.#guardedCurrentEndpoint.id]?.[cluster.type.id];
265
+ const filteredByVersion = skipVersion !== void 0 && skipVersion === cluster.version;
260
266
  if (attributeId === void 0) {
267
+ if (filteredByVersion) {
268
+ for (const attribute of cluster.type.attributes) {
269
+ if (attribute.limits.readable) {
270
+ this.#filteredCount++;
271
+ }
272
+ }
273
+ return;
274
+ }
261
275
  for (const attribute of cluster.type.attributes) {
262
- this.#readAttributeForWildcard(attribute, path);
276
+ this.readAttributeForWildcard(attribute, path);
263
277
  }
264
278
  } else {
279
+ if (filteredByVersion) {
280
+ this.#filteredCount++;
281
+ return;
282
+ }
265
283
  const attribute = cluster.type.attributes[attributeId];
266
284
  if (attribute !== void 0) {
267
- this.#readAttributeForWildcard(attribute, path);
285
+ this.readAttributeForWildcard(attribute, path);
268
286
  }
269
287
  }
270
288
  }
@@ -273,30 +291,35 @@ class AttributeResponse {
273
291
  *
274
292
  * Depends on state initialized by {@link #readClusterForWildcard}.
275
293
  */
276
- #readAttributeForWildcard(attribute, path) {
294
+ readAttributeForWildcard(attribute, path) {
295
+ if (!this.#guardedCurrentCluster.type.attributes[attribute.id]) {
296
+ return;
297
+ }
277
298
  if (attribute.wildcardPathFlags & this.#wildcardPathFlags) {
278
299
  return;
279
300
  }
280
- if (!attribute.limits.readable || this.#session.authorityAt(attribute.limits.readLevel, this.#currentCluster.location) !== AccessControl.Authority.Granted) {
301
+ if (!attribute.limits.readable || this.session.authorityAt(attribute.limits.readLevel, this.#guardedCurrentCluster.location) !== AccessControl.Authority.Granted) {
281
302
  return;
282
303
  }
283
304
  if (this.#currentState === void 0) {
284
- this.#currentState = this.#currentCluster.open(this.#session);
305
+ this.#currentState = this.#guardedCurrentCluster.open(this.session);
285
306
  }
286
307
  const value = this.#currentState[attribute.id];
287
- if (value !== void 0) {
288
- this.#addValue(
289
- {
290
- ...path,
291
- endpointId: this.#currentEndpoint?.id,
292
- clusterId: this.#currentCluster?.type.id,
293
- attributeId: attribute.id
294
- },
295
- this.#currentState[attribute.id],
296
- this.#currentCluster.version,
297
- attribute.tlv
298
- );
308
+ if (value === void 0) {
309
+ logger.warn(`Attribute ${this.node.inspectPath(path)} defined and enabled but has no value.`);
310
+ return;
299
311
  }
312
+ this.#addValue(
313
+ {
314
+ ...path,
315
+ endpointId: this.#guardedCurrentEndpoint.id,
316
+ clusterId: this.#guardedCurrentCluster.type.id,
317
+ attributeId: attribute.id
318
+ },
319
+ this.#currentState[attribute.id],
320
+ this.#guardedCurrentCluster.version,
321
+ attribute.tlv
322
+ );
300
323
  }
301
324
  /**
302
325
  * Add a function that produces data. These functions are run after validation of input paths.
@@ -308,20 +331,27 @@ class AttributeResponse {
308
331
  this.#dataProducers = [producer];
309
332
  }
310
333
  }
334
+ #addReportData(report) {
335
+ if (this.#chunk) {
336
+ this.#chunk.push(report);
337
+ } else {
338
+ this.#chunk = [report];
339
+ }
340
+ }
311
341
  /**
312
342
  * Add a status value.
313
343
  */
314
- #addStatus(path, status) {
344
+ addStatus(path, status) {
345
+ logger.debug(
346
+ () => `Error reading attribute ${this.node.inspectPath(path)}: Status=${StatusCode[status]}(${status})`
347
+ );
315
348
  const report = {
316
349
  kind: "attr-status",
317
350
  path,
318
351
  status
319
352
  };
320
- if (this.#chunk) {
321
- this.#chunk.push(report);
322
- } else {
323
- this.#chunk = [report];
324
- }
353
+ this.#addReportData(report);
354
+ this.#statusCount++;
325
355
  }
326
356
  /**
327
357
  * Add an attribute value.
@@ -334,26 +364,12 @@ class AttributeResponse {
334
364
  version,
335
365
  tlv
336
366
  };
337
- if (this.#chunk) {
338
- this.#chunk.push(report);
339
- } else {
340
- this.#chunk = [report];
341
- }
342
- }
343
- /**
344
- * The node ID used to filter paths with node ID specified. Unsure if this is ever actually used.
345
- */
346
- get #nodeId() {
347
- if (this.#cachedNodeId === void 0) {
348
- this.#cachedNodeId = (this.#session.fabric && this.#node.nodeIdFor(this.#session.fabric)) ?? NodeId.UNSPECIFIED_NODE_ID;
349
- }
350
- return this.#cachedNodeId;
367
+ this.#addReportData(report);
368
+ this.#valueCount++;
351
369
  }
352
370
  }
353
371
  export {
354
372
  AttributeResponse,
355
- FallbackLimits,
356
- GlobalAttrIds,
357
- WildcardPathFlagsCodec
373
+ GlobalAttrIds
358
374
  };
359
375
  //# sourceMappingURL=AttributeResponse.js.map
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/action/server/AttributeResponse.ts"],
4
- "mappings": "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",
4
+ "mappings": "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",
5
5
  "names": ["endpoint"]
6
6
  }
@@ -0,0 +1,36 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2022-2025 Project CHIP Authors
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { AttributeTypeProtocol, ClusterProtocol, EndpointProtocol, NodeProtocol } from "#action/protocols.js";
7
+ import { ReadResult } from "#action/response/ReadResult.js";
8
+ import { AttributeId, AttributePath, ClusterId, EndpointNumber } from "#types";
9
+ import { AccessControl } from "./AccessControl.js";
10
+ import { AttributeResponse } from "./AttributeResponse.js";
11
+ type ClusterFilter = {
12
+ [clusterId: ClusterId]: Set<AttributeId>;
13
+ };
14
+ export type AttributeResponseFilter = {
15
+ [endpointId: EndpointNumber]: ClusterFilter;
16
+ };
17
+ /**
18
+ * AttributeSubscriptionResponse is a specialized version of AttributeResponse that processes a read/subscribe request
19
+ * with a filter applied to the attributes. Only the attributes that match the filter will be processed.
20
+ */
21
+ export declare class AttributeSubscriptionResponse<SessionT extends AccessControl.Session = AccessControl.Session> extends AttributeResponse<SessionT> {
22
+ #private;
23
+ constructor(node: NodeProtocol, session: SessionT, filter: AttributeResponseFilter);
24
+ get filter(): AttributeResponseFilter;
25
+ /** Guarded accessor for this.#currentEndpointFilter. This should never be undefined */
26
+ protected get currentEndpointFilter(): ClusterFilter;
27
+ /** Guarded accessor for this.#currentCLusterFilter. This should never be undefined */
28
+ protected get currentClusterFilter(): Set<number>;
29
+ protected addConcrete(path: ReadResult.ConcreteAttributePath): void;
30
+ protected readEndpointForWildcard(endpoint: EndpointProtocol, path: AttributePath): Generator<ReadResult.Report[], void, unknown>;
31
+ protected readClusterForWildcard(cluster: ClusterProtocol, path: AttributePath): void;
32
+ protected readAttributeForWildcard(attribute: AttributeTypeProtocol, path: AttributePath): void;
33
+ protected addStatus(): void;
34
+ }
35
+ export {};
36
+ //# sourceMappingURL=AttributeSubscriptionResponse.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AttributeSubscriptionResponse.d.ts","sourceRoot":"","sources":["../../../../src/action/server/AttributeSubscriptionResponse.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,qBAAqB,EAAE,eAAe,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAC9G,OAAO,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AAE5D,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,QAAQ,CAAC;AAC/E,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAE3D,KAAK,aAAa,GAAG;IACjB,CAAC,SAAS,EAAE,SAAS,GAAG,GAAG,CAAC,WAAW,CAAC,CAAC;CAC5C,CAAC;AACF,MAAM,MAAM,uBAAuB,GAAG;IAClC,CAAC,UAAU,EAAE,cAAc,GAAG,aAAa,CAAC;CAC/C,CAAC;AAEF;;;GAGG;AACH,qBAAa,6BAA6B,CACtC,QAAQ,SAAS,aAAa,CAAC,OAAO,GAAG,aAAa,CAAC,OAAO,CAChE,SAAQ,iBAAiB,CAAC,QAAQ,CAAC;;gBAKrB,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,uBAAuB;IAKlF,IAAI,MAAM,4BAET;IAED,wFAAwF;IACxF,SAAS,KAAK,qBAAqB,kBAKlC;IAED,uFAAuF;IACvF,SAAS,KAAK,oBAAoB,gBAKjC;cAEkB,WAAW,CAAC,IAAI,EAAE,UAAU,CAAC,qBAAqB;cAQjD,uBAAuB,CAAC,QAAQ,EAAE,gBAAgB,EAAE,IAAI,EAAE,aAAa;cAQxE,sBAAsB,CAAC,OAAO,EAAE,eAAe,EAAE,IAAI,EAAE,aAAa;cAQpE,wBAAwB,CAAC,SAAS,EAAE,qBAAqB,EAAE,IAAI,EAAE,aAAa;cAO9E,SAAS;CAG/B"}
@@ -0,0 +1,66 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2022-2025 Project CHIP Authors
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { InternalError } from "#general";
7
+ import { AttributeResponse } from "./AttributeResponse.js";
8
+ class AttributeSubscriptionResponse extends AttributeResponse {
9
+ #filter;
10
+ #currentEndpointFilter;
11
+ #currentClusterFilter;
12
+ constructor(node, session, filter) {
13
+ super(node, session);
14
+ this.#filter = filter;
15
+ }
16
+ get filter() {
17
+ return this.#filter;
18
+ }
19
+ /** Guarded accessor for this.#currentEndpointFilter. This should never be undefined */
20
+ get currentEndpointFilter() {
21
+ if (!this.#currentEndpointFilter) {
22
+ throw new InternalError("currentEndpointFilter is not set. Should never happen");
23
+ }
24
+ return this.#currentEndpointFilter;
25
+ }
26
+ /** Guarded accessor for this.#currentCLusterFilter. This should never be undefined */
27
+ get currentClusterFilter() {
28
+ if (!this.#currentClusterFilter) {
29
+ throw new InternalError("currentClusterFilter is not set. Should never happen");
30
+ }
31
+ return this.#currentClusterFilter;
32
+ }
33
+ addConcrete(path) {
34
+ const { endpointId, clusterId, attributeId } = path;
35
+ if (this.#filter[endpointId]?.[clusterId]?.has(attributeId) === void 0) {
36
+ return;
37
+ }
38
+ super.addConcrete(path);
39
+ }
40
+ *readEndpointForWildcard(endpoint, path) {
41
+ this.#currentEndpointFilter = this.#filter[endpoint.id];
42
+ if (this.#currentEndpointFilter === void 0) {
43
+ return;
44
+ }
45
+ yield* super.readEndpointForWildcard(endpoint, path);
46
+ }
47
+ readClusterForWildcard(cluster, path) {
48
+ this.#currentClusterFilter = this.currentEndpointFilter[cluster.type.id];
49
+ if (this.#currentClusterFilter === void 0) {
50
+ return;
51
+ }
52
+ super.readClusterForWildcard(cluster, path);
53
+ }
54
+ readAttributeForWildcard(attribute, path) {
55
+ if (!this.currentClusterFilter.has(attribute.id)) {
56
+ return;
57
+ }
58
+ super.readAttributeForWildcard(attribute, path);
59
+ }
60
+ addStatus() {
61
+ }
62
+ }
63
+ export {
64
+ AttributeSubscriptionResponse
65
+ };
66
+ //# sourceMappingURL=AttributeSubscriptionResponse.js.map
@@ -0,0 +1,6 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/action/server/AttributeSubscriptionResponse.ts"],
4
+ "mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;AAOA,SAAS,qBAAqB;AAG9B,SAAS,yBAAyB;AAa3B,MAAM,sCAEH,kBAA4B;AAAA,EAClC;AAAA,EACA;AAAA,EACA;AAAA,EAEA,YAAY,MAAoB,SAAmB,QAAiC;AAChF,UAAM,MAAM,OAAO;AACnB,SAAK,UAAU;AAAA,EACnB;AAAA,EAEA,IAAI,SAAS;AACT,WAAO,KAAK;AAAA,EAChB;AAAA;AAAA,EAGA,IAAc,wBAAwB;AAClC,QAAI,CAAC,KAAK,wBAAwB;AAC9B,YAAM,IAAI,cAAc,uDAAuD;AAAA,IACnF;AACA,WAAO,KAAK;AAAA,EAChB;AAAA;AAAA,EAGA,IAAc,uBAAuB;AACjC,QAAI,CAAC,KAAK,uBAAuB;AAC7B,YAAM,IAAI,cAAc,sDAAsD;AAAA,IAClF;AACA,WAAO,KAAK;AAAA,EAChB;AAAA,EAEmB,YAAY,MAAwC;AACnE,UAAM,EAAE,YAAY,WAAW,YAAY,IAAI;AAC/C,QAAI,KAAK,QAAQ,UAAU,IAAI,SAAS,GAAG,IAAI,WAAW,MAAM,QAAW;AACvE;AAAA,IACJ;AACA,UAAM,YAAY,IAAI;AAAA,EAC1B;AAAA,EAEA,CAAoB,wBAAwB,UAA4B,MAAqB;AACzF,SAAK,yBAAyB,KAAK,QAAQ,SAAS,EAAE;AACtD,QAAI,KAAK,2BAA2B,QAAW;AAC3C;AAAA,IACJ;AACA,WAAO,MAAM,wBAAwB,UAAU,IAAI;AAAA,EACvD;AAAA,EAEmB,uBAAuB,SAA0B,MAAqB;AACrF,SAAK,wBAAwB,KAAK,sBAAsB,QAAQ,KAAK,EAAE;AACvE,QAAI,KAAK,0BAA0B,QAAW;AAC1C;AAAA,IACJ;AACA,UAAM,uBAAuB,SAAS,IAAI;AAAA,EAC9C;AAAA,EAEmB,yBAAyB,WAAkC,MAAqB;AAC/F,QAAI,CAAC,KAAK,qBAAqB,IAAI,UAAU,EAAE,GAAG;AAC9C;AAAA,IACJ;AACA,UAAM,yBAAyB,WAAW,IAAI;AAAA,EAClD;AAAA,EAEmB,YAAY;AAAA,EAE/B;AACJ;",
5
+ "names": []
6
+ }
@@ -0,0 +1,45 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2022-2025 Project CHIP Authors
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { NodeProtocol } from "#action/protocols.js";
7
+ import { AccessControl } from "#action/server/AccessControl.js";
8
+ import { NodeId } from "#types";
9
+ export declare const WildcardPathFlagsCodec: import("#types").BitmapSchemaInternal<{
10
+ skipRootNode: import("#types").BitFlag;
11
+ skipGlobalAttributes: import("#types").BitFlag;
12
+ skipAttributeList: import("#types").BitFlag;
13
+ reserved1: import("#types").BitFlag;
14
+ skipCommandLists: import("#types").BitFlag;
15
+ skipCustomElements: import("#types").BitFlag;
16
+ skipFixedAttributes: import("#types").BitFlag;
17
+ skipChangesOmittedAttributes: import("#types").BitFlag;
18
+ skipDiagnosticsClusters: import("#types").BitFlag;
19
+ }>;
20
+ export declare const FallbackLimits: AccessControl.Limits;
21
+ export declare abstract class DataResponse<SessionT extends AccessControl.Session = AccessControl.Session> {
22
+ #private;
23
+ constructor(node: NodeProtocol, session: SessionT);
24
+ protected get node(): NodeProtocol;
25
+ protected get session(): SessionT;
26
+ /**
27
+ * The node ID used to filter paths with node ID specified. Unsure if this is ever actually used.
28
+ */
29
+ protected get nodeId(): NodeId;
30
+ abstract counts: {
31
+ /**
32
+ * Number of existent entries that were processed. Not all must have had data to send.
33
+ */
34
+ existent: number;
35
+ /**
36
+ * Number of status responses (aka errors we have sent)
37
+ */
38
+ status: number;
39
+ /**
40
+ * Number of value responses (aka success we have sent)
41
+ */
42
+ value: number;
43
+ };
44
+ }
45
+ //# sourceMappingURL=DataResponse.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DataResponse.d.ts","sourceRoot":"","sources":["../../../../src/action/server/DataResponse.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAEhE,OAAO,EAAgB,MAAM,EAA2B,MAAM,QAAQ,CAAC;AAEvE,eAAO,MAAM,sBAAsB;;;;;;;;;;EAAwC,CAAC;AAC5E,eAAO,MAAM,cAAc,EAAE,aAAa,CAAC,MAQ1C,CAAC;AAEF,8BAAsB,YAAY,CAAC,QAAQ,SAAS,aAAa,CAAC,OAAO,GAAG,aAAa,CAAC,OAAO;;gBAQjF,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,QAAQ;IAKjD,SAAS,KAAK,IAAI,iBAEjB;IAED,SAAS,KAAK,OAAO,aAEpB;IAED;;OAEG;IACH,SAAS,KAAK,MAAM,WAMnB;IAED,QAAQ,CAAC,MAAM,EAAE;QACb;;WAEG;QACH,QAAQ,EAAE,MAAM,CAAC;QAEjB;;WAEG;QACH,MAAM,EAAE,MAAM,CAAC;QAEf;;WAEG;QACH,KAAK,EAAE,MAAM,CAAC;KACjB,CAAC;CACL"}