@matter/protocol 0.17.4-alpha.0-20260629-e2d2715b7 → 0.17.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/action/client/InputChunk.d.ts.map +1 -1
- package/dist/cjs/action/client/InputChunk.js +84 -21
- package/dist/cjs/action/client/InputChunk.js.map +1 -1
- package/dist/esm/action/client/InputChunk.d.ts.map +1 -1
- package/dist/esm/action/client/InputChunk.js +93 -22
- package/dist/esm/action/client/InputChunk.js.map +1 -1
- package/package.json +5 -5
- package/src/action/client/InputChunk.ts +119 -28
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"InputChunk.d.ts","sourceRoot":"","sources":["../../../../src/action/client/InputChunk.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;
|
|
1
|
+
{"version":3,"file":"InputChunk.d.ts","sourceRoot":"","sources":["../../../../src/action/client/InputChunk.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AAc5D,OAAO,EAGH,UAAU,EAMV,kBAAkB,EAQlB,cAAc,EACjB,MAAM,eAAe,CAAC;AAuHvB;;;;;;;GAOG;AACH,wBAAuB,UAAU,CAC7B,KAAK,EAAE,UAAU,EACjB,wBAAwB,CAAC,EAAE,cAAc,CAAC,OAAO,kBAAkB,CAAC,EAAE,GACvE,cAAc,CAAC,UAAU,CAAC,MAAM,CAAC,CAGnC"}
|
|
@@ -33,6 +33,79 @@ var import_types = require("@matter/types");
|
|
|
33
33
|
*/
|
|
34
34
|
const logger = import_general.Logger.get("InputChunk");
|
|
35
35
|
const DATA_REPORT_DECODE_OPTIONS = { relaxNumberTypeChecks: true };
|
|
36
|
+
function schemaOfModel(model) {
|
|
37
|
+
try {
|
|
38
|
+
return (0, import_types.TlvOfModel)(model);
|
|
39
|
+
} catch {
|
|
40
|
+
return void 0;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
const globalAttributeSchemas = /* @__PURE__ */ new Map();
|
|
44
|
+
for (const id of [
|
|
45
|
+
import_model.ClusterRevision.id,
|
|
46
|
+
import_model.FeatureMap.id,
|
|
47
|
+
import_model.AttributeList.id,
|
|
48
|
+
import_model.EventList.id,
|
|
49
|
+
import_model.AcceptedCommandList.id,
|
|
50
|
+
import_model.GeneratedCommandList.id
|
|
51
|
+
]) {
|
|
52
|
+
const model = import_model.Matter.attributes(id);
|
|
53
|
+
const schema = model === void 0 ? void 0 : schemaOfModel(model);
|
|
54
|
+
if (schema !== void 0) {
|
|
55
|
+
globalAttributeSchemas.set(id, schema);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
const seededGlobalAttributeSchemas = new Map(globalAttributeSchemas);
|
|
59
|
+
seededGlobalAttributeSchemas.delete(import_model.FeatureMap.id);
|
|
60
|
+
const clusterCache = /* @__PURE__ */ new Map();
|
|
61
|
+
function clusterCacheOf(clusterId) {
|
|
62
|
+
let cache = clusterCache.get(clusterId);
|
|
63
|
+
if (cache === void 0) {
|
|
64
|
+
const model = import_model.Matter.clusters(clusterId);
|
|
65
|
+
if (model === void 0) {
|
|
66
|
+
return void 0;
|
|
67
|
+
}
|
|
68
|
+
cache = { model, attributes: new Map(seededGlobalAttributeSchemas), events: /* @__PURE__ */ new Map() };
|
|
69
|
+
clusterCache.set(clusterId, cache);
|
|
70
|
+
}
|
|
71
|
+
return cache;
|
|
72
|
+
}
|
|
73
|
+
function attributeSchemaOf(clusterId, attributeId) {
|
|
74
|
+
const cache = clusterCacheOf(clusterId);
|
|
75
|
+
if (cache === void 0) {
|
|
76
|
+
return globalAttributeSchemas.get(attributeId);
|
|
77
|
+
}
|
|
78
|
+
const cached = cache.attributes.get(attributeId);
|
|
79
|
+
if (cached !== void 0) {
|
|
80
|
+
return cached;
|
|
81
|
+
}
|
|
82
|
+
const attributeModel = cache.model.attributes(attributeId);
|
|
83
|
+
if (attributeModel === void 0) {
|
|
84
|
+
return void 0;
|
|
85
|
+
}
|
|
86
|
+
const schema = schemaOfModel(attributeModel);
|
|
87
|
+
if (schema !== void 0) {
|
|
88
|
+
cache.attributes.set(attributeId, schema);
|
|
89
|
+
}
|
|
90
|
+
return schema;
|
|
91
|
+
}
|
|
92
|
+
function eventSchemaOf(clusterId, eventId) {
|
|
93
|
+
const cache = clusterCacheOf(clusterId);
|
|
94
|
+
if (cache === void 0) {
|
|
95
|
+
return void 0;
|
|
96
|
+
}
|
|
97
|
+
const cached = cache.events.get(eventId);
|
|
98
|
+
if (cached !== void 0) {
|
|
99
|
+
return cached;
|
|
100
|
+
}
|
|
101
|
+
const eventModel = cache.model.events(eventId);
|
|
102
|
+
if (eventModel === void 0) {
|
|
103
|
+
return void 0;
|
|
104
|
+
}
|
|
105
|
+
const schema = (0, import_types.TlvOfModel)(eventModel);
|
|
106
|
+
cache.events.set(eventId, schema);
|
|
107
|
+
return schema;
|
|
108
|
+
}
|
|
36
109
|
async function* InputChunk(input, leftoverAttributeReports) {
|
|
37
110
|
yield* emitAttributes(input, leftoverAttributeReports);
|
|
38
111
|
yield* emitEvents(input);
|
|
@@ -128,20 +201,8 @@ function mayContinueInNextReport(data) {
|
|
|
128
201
|
function decodeAttributeGroup(path, dataVersion, entries) {
|
|
129
202
|
const { nodeId, endpointId, clusterId, attributeId } = path;
|
|
130
203
|
try {
|
|
131
|
-
const
|
|
132
|
-
const
|
|
133
|
-
let value;
|
|
134
|
-
if (attributeModel === void 0) {
|
|
135
|
-
value = (0, import_AttributeDataDecoder.decodeUnknownAttributeValue)(entries);
|
|
136
|
-
} else {
|
|
137
|
-
let schema;
|
|
138
|
-
try {
|
|
139
|
-
schema = (0, import_types.TlvOfModel)(attributeModel);
|
|
140
|
-
} catch {
|
|
141
|
-
schema = void 0;
|
|
142
|
-
}
|
|
143
|
-
value = schema === void 0 ? (0, import_AttributeDataDecoder.decodeUnknownAttributeValue)(entries) : (0, import_AttributeDataDecoder.decodeAttributeValueWithSchema)(schema, entries, void 0, DATA_REPORT_DECODE_OPTIONS);
|
|
144
|
-
}
|
|
204
|
+
const schema = attributeSchemaOf(clusterId, attributeId);
|
|
205
|
+
const value = schema === void 0 ? (0, import_AttributeDataDecoder.decodeUnknownAttributeValue)(entries) : (0, import_AttributeDataDecoder.decodeAttributeValueWithSchema)(schema, entries, void 0, DATA_REPORT_DECODE_OPTIONS);
|
|
145
206
|
return {
|
|
146
207
|
kind: "attr-value",
|
|
147
208
|
path: { nodeId, endpointId, clusterId, attributeId },
|
|
@@ -201,17 +262,19 @@ function decodeEventValue(eventData) {
|
|
|
201
262
|
throw new import_general.UnexpectedDataError(`Invalid event path ${endpointId}/${clusterId}/${eventId}`);
|
|
202
263
|
}
|
|
203
264
|
try {
|
|
204
|
-
const
|
|
205
|
-
|
|
206
|
-
let value;
|
|
207
|
-
if (eventModel === void 0) {
|
|
265
|
+
const schema = eventSchemaOf(clusterId, eventId);
|
|
266
|
+
if (schema === void 0) {
|
|
208
267
|
logger.debug(
|
|
209
268
|
`Decode unknown event ${import_general.Diagnostic.hex(clusterId)}/${import_general.Diagnostic.hex(eventId)} via the AnySchema.`
|
|
210
269
|
);
|
|
211
|
-
|
|
270
|
+
}
|
|
271
|
+
let value;
|
|
272
|
+
if (data === void 0) {
|
|
273
|
+
value = void 0;
|
|
274
|
+
} else if (schema === void 0) {
|
|
275
|
+
value = (0, import_EventDataDecoder.decodeUnknownEventValue)(data);
|
|
212
276
|
} else {
|
|
213
|
-
|
|
214
|
-
value = data === void 0 ? void 0 : schema.decodeTlv(data, DATA_REPORT_DECODE_OPTIONS);
|
|
277
|
+
value = schema.decodeTlv(data, DATA_REPORT_DECODE_OPTIONS);
|
|
215
278
|
}
|
|
216
279
|
const timestamp = Number(epochTimestamp ?? systemTimestamp ?? deltaEpochTimestamp ?? deltaSystemTimestamp ?? 0);
|
|
217
280
|
return {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/action/client/InputChunk.ts"],
|
|
4
|
-
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAOA,kCAA4E;AAC5E,8BAAwC;AACxC,qBAAwD;AACxD,
|
|
4
|
+
"mappings": "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",
|
|
5
5
|
"names": []
|
|
6
6
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"InputChunk.d.ts","sourceRoot":"","sources":["../../../../src/action/client/InputChunk.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;
|
|
1
|
+
{"version":3,"file":"InputChunk.d.ts","sourceRoot":"","sources":["../../../../src/action/client/InputChunk.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AAc5D,OAAO,EAGH,UAAU,EAMV,kBAAkB,EAQlB,cAAc,EACjB,MAAM,eAAe,CAAC;AAuHvB;;;;;;;GAOG;AACH,wBAAuB,UAAU,CAC7B,KAAK,EAAE,UAAU,EACjB,wBAAwB,CAAC,EAAE,cAAc,CAAC,OAAO,kBAAkB,CAAC,EAAE,GACvE,cAAc,CAAC,UAAU,CAAC,MAAM,CAAC,CAGnC"}
|
|
@@ -6,7 +6,15 @@
|
|
|
6
6
|
import { decodeAttributeValueWithSchema, decodeUnknownAttributeValue } from "#interaction/AttributeDataDecoder.js";
|
|
7
7
|
import { decodeUnknownEventValue } from "#interaction/EventDataDecoder.js";
|
|
8
8
|
import { Diagnostic, Logger, UnexpectedDataError } from "@matter/general";
|
|
9
|
-
import {
|
|
9
|
+
import {
|
|
10
|
+
AcceptedCommandList,
|
|
11
|
+
AttributeList,
|
|
12
|
+
ClusterRevision,
|
|
13
|
+
EventList,
|
|
14
|
+
FeatureMap,
|
|
15
|
+
GeneratedCommandList,
|
|
16
|
+
Matter
|
|
17
|
+
} from "@matter/model";
|
|
10
18
|
import {
|
|
11
19
|
Status,
|
|
12
20
|
TlvAny,
|
|
@@ -15,6 +23,79 @@ import {
|
|
|
15
23
|
} from "@matter/types";
|
|
16
24
|
const logger = Logger.get("InputChunk");
|
|
17
25
|
const DATA_REPORT_DECODE_OPTIONS = { relaxNumberTypeChecks: true };
|
|
26
|
+
function schemaOfModel(model) {
|
|
27
|
+
try {
|
|
28
|
+
return TlvOfModel(model);
|
|
29
|
+
} catch {
|
|
30
|
+
return void 0;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
const globalAttributeSchemas = /* @__PURE__ */ new Map();
|
|
34
|
+
for (const id of [
|
|
35
|
+
ClusterRevision.id,
|
|
36
|
+
FeatureMap.id,
|
|
37
|
+
AttributeList.id,
|
|
38
|
+
EventList.id,
|
|
39
|
+
AcceptedCommandList.id,
|
|
40
|
+
GeneratedCommandList.id
|
|
41
|
+
]) {
|
|
42
|
+
const model = Matter.attributes(id);
|
|
43
|
+
const schema = model === void 0 ? void 0 : schemaOfModel(model);
|
|
44
|
+
if (schema !== void 0) {
|
|
45
|
+
globalAttributeSchemas.set(id, schema);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
const seededGlobalAttributeSchemas = new Map(globalAttributeSchemas);
|
|
49
|
+
seededGlobalAttributeSchemas.delete(FeatureMap.id);
|
|
50
|
+
const clusterCache = /* @__PURE__ */ new Map();
|
|
51
|
+
function clusterCacheOf(clusterId) {
|
|
52
|
+
let cache = clusterCache.get(clusterId);
|
|
53
|
+
if (cache === void 0) {
|
|
54
|
+
const model = Matter.clusters(clusterId);
|
|
55
|
+
if (model === void 0) {
|
|
56
|
+
return void 0;
|
|
57
|
+
}
|
|
58
|
+
cache = { model, attributes: new Map(seededGlobalAttributeSchemas), events: /* @__PURE__ */ new Map() };
|
|
59
|
+
clusterCache.set(clusterId, cache);
|
|
60
|
+
}
|
|
61
|
+
return cache;
|
|
62
|
+
}
|
|
63
|
+
function attributeSchemaOf(clusterId, attributeId) {
|
|
64
|
+
const cache = clusterCacheOf(clusterId);
|
|
65
|
+
if (cache === void 0) {
|
|
66
|
+
return globalAttributeSchemas.get(attributeId);
|
|
67
|
+
}
|
|
68
|
+
const cached = cache.attributes.get(attributeId);
|
|
69
|
+
if (cached !== void 0) {
|
|
70
|
+
return cached;
|
|
71
|
+
}
|
|
72
|
+
const attributeModel = cache.model.attributes(attributeId);
|
|
73
|
+
if (attributeModel === void 0) {
|
|
74
|
+
return void 0;
|
|
75
|
+
}
|
|
76
|
+
const schema = schemaOfModel(attributeModel);
|
|
77
|
+
if (schema !== void 0) {
|
|
78
|
+
cache.attributes.set(attributeId, schema);
|
|
79
|
+
}
|
|
80
|
+
return schema;
|
|
81
|
+
}
|
|
82
|
+
function eventSchemaOf(clusterId, eventId) {
|
|
83
|
+
const cache = clusterCacheOf(clusterId);
|
|
84
|
+
if (cache === void 0) {
|
|
85
|
+
return void 0;
|
|
86
|
+
}
|
|
87
|
+
const cached = cache.events.get(eventId);
|
|
88
|
+
if (cached !== void 0) {
|
|
89
|
+
return cached;
|
|
90
|
+
}
|
|
91
|
+
const eventModel = cache.model.events(eventId);
|
|
92
|
+
if (eventModel === void 0) {
|
|
93
|
+
return void 0;
|
|
94
|
+
}
|
|
95
|
+
const schema = TlvOfModel(eventModel);
|
|
96
|
+
cache.events.set(eventId, schema);
|
|
97
|
+
return schema;
|
|
98
|
+
}
|
|
18
99
|
async function* InputChunk(input, leftoverAttributeReports) {
|
|
19
100
|
yield* emitAttributes(input, leftoverAttributeReports);
|
|
20
101
|
yield* emitEvents(input);
|
|
@@ -110,20 +191,8 @@ function mayContinueInNextReport(data) {
|
|
|
110
191
|
function decodeAttributeGroup(path, dataVersion, entries) {
|
|
111
192
|
const { nodeId, endpointId, clusterId, attributeId } = path;
|
|
112
193
|
try {
|
|
113
|
-
const
|
|
114
|
-
const
|
|
115
|
-
let value;
|
|
116
|
-
if (attributeModel === void 0) {
|
|
117
|
-
value = decodeUnknownAttributeValue(entries);
|
|
118
|
-
} else {
|
|
119
|
-
let schema;
|
|
120
|
-
try {
|
|
121
|
-
schema = TlvOfModel(attributeModel);
|
|
122
|
-
} catch {
|
|
123
|
-
schema = void 0;
|
|
124
|
-
}
|
|
125
|
-
value = schema === void 0 ? decodeUnknownAttributeValue(entries) : decodeAttributeValueWithSchema(schema, entries, void 0, DATA_REPORT_DECODE_OPTIONS);
|
|
126
|
-
}
|
|
194
|
+
const schema = attributeSchemaOf(clusterId, attributeId);
|
|
195
|
+
const value = schema === void 0 ? decodeUnknownAttributeValue(entries) : decodeAttributeValueWithSchema(schema, entries, void 0, DATA_REPORT_DECODE_OPTIONS);
|
|
127
196
|
return {
|
|
128
197
|
kind: "attr-value",
|
|
129
198
|
path: { nodeId, endpointId, clusterId, attributeId },
|
|
@@ -183,17 +252,19 @@ function decodeEventValue(eventData) {
|
|
|
183
252
|
throw new UnexpectedDataError(`Invalid event path ${endpointId}/${clusterId}/${eventId}`);
|
|
184
253
|
}
|
|
185
254
|
try {
|
|
186
|
-
const
|
|
187
|
-
|
|
188
|
-
let value;
|
|
189
|
-
if (eventModel === void 0) {
|
|
255
|
+
const schema = eventSchemaOf(clusterId, eventId);
|
|
256
|
+
if (schema === void 0) {
|
|
190
257
|
logger.debug(
|
|
191
258
|
`Decode unknown event ${Diagnostic.hex(clusterId)}/${Diagnostic.hex(eventId)} via the AnySchema.`
|
|
192
259
|
);
|
|
193
|
-
|
|
260
|
+
}
|
|
261
|
+
let value;
|
|
262
|
+
if (data === void 0) {
|
|
263
|
+
value = void 0;
|
|
264
|
+
} else if (schema === void 0) {
|
|
265
|
+
value = decodeUnknownEventValue(data);
|
|
194
266
|
} else {
|
|
195
|
-
|
|
196
|
-
value = data === void 0 ? void 0 : schema.decodeTlv(data, DATA_REPORT_DECODE_OPTIONS);
|
|
267
|
+
value = schema.decodeTlv(data, DATA_REPORT_DECODE_OPTIONS);
|
|
197
268
|
}
|
|
198
269
|
const timestamp = Number(epochTimestamp ?? systemTimestamp ?? deltaEpochTimestamp ?? deltaSystemTimestamp ?? 0);
|
|
199
270
|
return {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/action/client/InputChunk.ts"],
|
|
4
|
-
"mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;AAOA,SAAS,gCAAgC,mCAAmC;AAC5E,SAAS,+BAA+B;AACxC,SAAS,YAAY,QAAQ,2BAA2B;AACxD,
|
|
4
|
+
"mappings": "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",
|
|
5
5
|
"names": []
|
|
6
6
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@matter/protocol",
|
|
3
|
-
"version": "0.17.4
|
|
3
|
+
"version": "0.17.4",
|
|
4
4
|
"description": "Low-level APIs for Matter interaction",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"iot",
|
|
@@ -35,12 +35,12 @@
|
|
|
35
35
|
"#*": "./src/*"
|
|
36
36
|
},
|
|
37
37
|
"dependencies": {
|
|
38
|
-
"@matter/general": "0.17.4
|
|
39
|
-
"@matter/model": "0.17.4
|
|
40
|
-
"@matter/types": "0.17.4
|
|
38
|
+
"@matter/general": "0.17.4",
|
|
39
|
+
"@matter/model": "0.17.4",
|
|
40
|
+
"@matter/types": "0.17.4"
|
|
41
41
|
},
|
|
42
42
|
"devDependencies": {
|
|
43
|
-
"@matter/testing": "0.17.4
|
|
43
|
+
"@matter/testing": "0.17.4"
|
|
44
44
|
},
|
|
45
45
|
"files": [
|
|
46
46
|
"dist/**/*",
|
|
@@ -8,7 +8,16 @@ import { ReadResult } from "#action/response/ReadResult.js";
|
|
|
8
8
|
import { decodeAttributeValueWithSchema, decodeUnknownAttributeValue } from "#interaction/AttributeDataDecoder.js";
|
|
9
9
|
import { decodeUnknownEventValue } from "#interaction/EventDataDecoder.js";
|
|
10
10
|
import { Diagnostic, Logger, UnexpectedDataError } from "@matter/general";
|
|
11
|
-
import {
|
|
11
|
+
import {
|
|
12
|
+
AcceptedCommandList,
|
|
13
|
+
AttributeList,
|
|
14
|
+
ClusterModel,
|
|
15
|
+
ClusterRevision,
|
|
16
|
+
EventList,
|
|
17
|
+
FeatureMap,
|
|
18
|
+
GeneratedCommandList,
|
|
19
|
+
Matter,
|
|
20
|
+
} from "@matter/model";
|
|
12
21
|
import {
|
|
13
22
|
AttributeId,
|
|
14
23
|
ClusterId,
|
|
@@ -24,6 +33,7 @@ import {
|
|
|
24
33
|
TlvEventData,
|
|
25
34
|
TlvEventStatus,
|
|
26
35
|
TlvOfModel,
|
|
36
|
+
TlvSchema,
|
|
27
37
|
TlvType,
|
|
28
38
|
TypeFromSchema,
|
|
29
39
|
} from "@matter/types";
|
|
@@ -37,6 +47,100 @@ const logger = Logger.get("InputChunk");
|
|
|
37
47
|
*/
|
|
38
48
|
const DATA_REPORT_DECODE_OPTIONS: TlvDecodingOptions = { relaxNumberTypeChecks: true };
|
|
39
49
|
|
|
50
|
+
function schemaOfModel(model: Parameters<typeof TlvOfModel>[0]): TlvSchema<unknown> | undefined {
|
|
51
|
+
try {
|
|
52
|
+
return TlvOfModel(model);
|
|
53
|
+
} catch {
|
|
54
|
+
return undefined; // modeled but has no schema (e.g. deprecated global) — decode as unknown
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
// Global attributes resolved generically (cluster-independent). Used to decode globals on an unknown cluster — including
|
|
59
|
+
// FeatureMap, which decodes to a bitmap object via its generic schema there (no cluster to name its bits).
|
|
60
|
+
const globalAttributeSchemas = new Map<number, TlvSchema<unknown>>();
|
|
61
|
+
for (const id of [
|
|
62
|
+
ClusterRevision.id,
|
|
63
|
+
FeatureMap.id,
|
|
64
|
+
AttributeList.id,
|
|
65
|
+
EventList.id,
|
|
66
|
+
AcceptedCommandList.id,
|
|
67
|
+
GeneratedCommandList.id,
|
|
68
|
+
]) {
|
|
69
|
+
const model = Matter.attributes(id);
|
|
70
|
+
const schema = model === undefined ? undefined : schemaOfModel(model);
|
|
71
|
+
if (schema !== undefined) {
|
|
72
|
+
globalAttributeSchemas.set(id, schema);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// Seeded into each known cluster's attribute cache. FeatureMap is excluded — its schema is cluster-specialized (bits
|
|
77
|
+
// named per cluster), so a known cluster resolves it per-cluster on demand rather than from the generic schema.
|
|
78
|
+
const seededGlobalAttributeSchemas = new Map(globalAttributeSchemas);
|
|
79
|
+
seededGlobalAttributeSchemas.delete(FeatureMap.id);
|
|
80
|
+
|
|
81
|
+
interface ClusterSchemaCache {
|
|
82
|
+
model: ClusterModel;
|
|
83
|
+
attributes: Map<number, TlvSchema<unknown>>;
|
|
84
|
+
events: Map<number, TlvSchema<unknown>>;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
// Resolved schemas cached across reports, per known cluster. Report paths come from untrusted peers, so unknown
|
|
88
|
+
// clusters and unresolved elements are never cached — keeping these maps bounded by the (immutable) standard model.
|
|
89
|
+
const clusterCache = new Map<number, ClusterSchemaCache>();
|
|
90
|
+
|
|
91
|
+
function clusterCacheOf(clusterId: number): ClusterSchemaCache | undefined {
|
|
92
|
+
let cache = clusterCache.get(clusterId);
|
|
93
|
+
if (cache === undefined) {
|
|
94
|
+
const model = Matter.clusters(clusterId);
|
|
95
|
+
if (model === undefined) {
|
|
96
|
+
return undefined;
|
|
97
|
+
}
|
|
98
|
+
// New cluster: pre-fill its attributes with the shared global schemas, then resolve the rest on demand.
|
|
99
|
+
cache = { model, attributes: new Map(seededGlobalAttributeSchemas), events: new Map() };
|
|
100
|
+
clusterCache.set(clusterId, cache);
|
|
101
|
+
}
|
|
102
|
+
return cache;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
function attributeSchemaOf(clusterId: number, attributeId: number): TlvSchema<unknown> | undefined {
|
|
106
|
+
const cache = clusterCacheOf(clusterId);
|
|
107
|
+
if (cache === undefined) {
|
|
108
|
+
// Unknown cluster (e.g. vendor): still decode standard global attributes with their cluster-independent schema.
|
|
109
|
+
return globalAttributeSchemas.get(attributeId);
|
|
110
|
+
}
|
|
111
|
+
const cached = cache.attributes.get(attributeId);
|
|
112
|
+
if (cached !== undefined) {
|
|
113
|
+
return cached;
|
|
114
|
+
}
|
|
115
|
+
const attributeModel = cache.model.attributes(attributeId);
|
|
116
|
+
if (attributeModel === undefined) {
|
|
117
|
+
return undefined;
|
|
118
|
+
}
|
|
119
|
+
const schema = schemaOfModel(attributeModel);
|
|
120
|
+
if (schema !== undefined) {
|
|
121
|
+
cache.attributes.set(attributeId, schema);
|
|
122
|
+
}
|
|
123
|
+
return schema;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
function eventSchemaOf(clusterId: number, eventId: number): TlvSchema<unknown> | undefined {
|
|
127
|
+
const cache = clusterCacheOf(clusterId);
|
|
128
|
+
if (cache === undefined) {
|
|
129
|
+
return undefined;
|
|
130
|
+
}
|
|
131
|
+
const cached = cache.events.get(eventId);
|
|
132
|
+
if (cached !== undefined) {
|
|
133
|
+
return cached;
|
|
134
|
+
}
|
|
135
|
+
const eventModel = cache.model.events(eventId);
|
|
136
|
+
if (eventModel === undefined) {
|
|
137
|
+
return undefined;
|
|
138
|
+
}
|
|
139
|
+
const schema = TlvOfModel(eventModel);
|
|
140
|
+
cache.events.set(eventId, schema);
|
|
141
|
+
return schema;
|
|
142
|
+
}
|
|
143
|
+
|
|
40
144
|
interface ResolvedAttributePath {
|
|
41
145
|
nodeId?: NodeId;
|
|
42
146
|
endpointId: EndpointNumber;
|
|
@@ -192,25 +296,11 @@ function decodeAttributeGroup(
|
|
|
192
296
|
const { nodeId, endpointId, clusterId, attributeId } = path;
|
|
193
297
|
|
|
194
298
|
try {
|
|
195
|
-
const
|
|
196
|
-
const
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
value = decodeUnknownAttributeValue(entries);
|
|
201
|
-
} else {
|
|
202
|
-
let schema;
|
|
203
|
-
try {
|
|
204
|
-
schema = TlvOfModel(attributeModel);
|
|
205
|
-
} catch {
|
|
206
|
-
// Attribute is known but has no schema (e.g. deprecated global attributes) — decode as unknown
|
|
207
|
-
schema = undefined;
|
|
208
|
-
}
|
|
209
|
-
value =
|
|
210
|
-
schema === undefined
|
|
211
|
-
? decodeUnknownAttributeValue(entries)
|
|
212
|
-
: decodeAttributeValueWithSchema(schema, entries, undefined, DATA_REPORT_DECODE_OPTIONS);
|
|
213
|
-
}
|
|
299
|
+
const schema = attributeSchemaOf(clusterId, attributeId);
|
|
300
|
+
const value =
|
|
301
|
+
schema === undefined
|
|
302
|
+
? decodeUnknownAttributeValue(entries)
|
|
303
|
+
: decodeAttributeValueWithSchema(schema, entries, undefined, DATA_REPORT_DECODE_OPTIONS);
|
|
214
304
|
return {
|
|
215
305
|
kind: "attr-value",
|
|
216
306
|
path: { nodeId, endpointId, clusterId, attributeId },
|
|
@@ -280,18 +370,19 @@ function decodeEventValue(eventData: TypeFromSchema<typeof TlvEventData>): ReadR
|
|
|
280
370
|
}
|
|
281
371
|
|
|
282
372
|
try {
|
|
283
|
-
const
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
let value: unknown;
|
|
287
|
-
if (eventModel === undefined) {
|
|
373
|
+
const schema = eventSchemaOf(clusterId, eventId);
|
|
374
|
+
if (schema === undefined) {
|
|
288
375
|
logger.debug(
|
|
289
376
|
`Decode unknown event ${Diagnostic.hex(clusterId)}/${Diagnostic.hex(eventId)} via the AnySchema.`,
|
|
290
377
|
);
|
|
291
|
-
|
|
378
|
+
}
|
|
379
|
+
let value: unknown;
|
|
380
|
+
if (data === undefined) {
|
|
381
|
+
value = undefined;
|
|
382
|
+
} else if (schema === undefined) {
|
|
383
|
+
value = decodeUnknownEventValue(data);
|
|
292
384
|
} else {
|
|
293
|
-
|
|
294
|
-
value = data === undefined ? undefined : schema.decodeTlv(data, DATA_REPORT_DECODE_OPTIONS);
|
|
385
|
+
value = schema.decodeTlv(data, DATA_REPORT_DECODE_OPTIONS);
|
|
295
386
|
}
|
|
296
387
|
|
|
297
388
|
// `timestamp` is a lossy convenience: callers needing the specific wire variant read the explicit field below.
|