@matter-server/ws-controller 0.2.0-alpha.0-00000000-000000000

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 (95) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +11 -0
  3. package/dist/esm/controller/AttributeDataCache.d.ts +49 -0
  4. package/dist/esm/controller/AttributeDataCache.d.ts.map +1 -0
  5. package/dist/esm/controller/AttributeDataCache.js +154 -0
  6. package/dist/esm/controller/AttributeDataCache.js.map +6 -0
  7. package/dist/esm/controller/ControllerCommandHandler.d.ts +118 -0
  8. package/dist/esm/controller/ControllerCommandHandler.d.ts.map +1 -0
  9. package/dist/esm/controller/ControllerCommandHandler.js +1015 -0
  10. package/dist/esm/controller/ControllerCommandHandler.js.map +6 -0
  11. package/dist/esm/controller/LegacyDataInjector.d.ts +95 -0
  12. package/dist/esm/controller/LegacyDataInjector.d.ts.map +1 -0
  13. package/dist/esm/controller/LegacyDataInjector.js +196 -0
  14. package/dist/esm/controller/LegacyDataInjector.js.map +6 -0
  15. package/dist/esm/controller/MatterController.d.ts +59 -0
  16. package/dist/esm/controller/MatterController.d.ts.map +1 -0
  17. package/dist/esm/controller/MatterController.js +212 -0
  18. package/dist/esm/controller/MatterController.js.map +6 -0
  19. package/dist/esm/controller/Nodes.d.ts +62 -0
  20. package/dist/esm/controller/Nodes.d.ts.map +1 -0
  21. package/dist/esm/controller/Nodes.js +85 -0
  22. package/dist/esm/controller/Nodes.js.map +6 -0
  23. package/dist/esm/controller/TestNodeCommandHandler.d.ts +84 -0
  24. package/dist/esm/controller/TestNodeCommandHandler.d.ts.map +1 -0
  25. package/dist/esm/controller/TestNodeCommandHandler.js +225 -0
  26. package/dist/esm/controller/TestNodeCommandHandler.js.map +6 -0
  27. package/dist/esm/data/VendorIDs.d.ts +7 -0
  28. package/dist/esm/data/VendorIDs.d.ts.map +1 -0
  29. package/dist/esm/data/VendorIDs.js +1237 -0
  30. package/dist/esm/data/VendorIDs.js.map +6 -0
  31. package/dist/esm/example/send-command.d.ts +7 -0
  32. package/dist/esm/example/send-command.d.ts.map +1 -0
  33. package/dist/esm/example/send-command.js +60 -0
  34. package/dist/esm/example/send-command.js.map +6 -0
  35. package/dist/esm/index.d.ts +21 -0
  36. package/dist/esm/index.d.ts.map +1 -0
  37. package/dist/esm/index.js +26 -0
  38. package/dist/esm/index.js.map +6 -0
  39. package/dist/esm/model/ModelMapper.d.ts +34 -0
  40. package/dist/esm/model/ModelMapper.d.ts.map +1 -0
  41. package/dist/esm/model/ModelMapper.js +62 -0
  42. package/dist/esm/model/ModelMapper.js.map +6 -0
  43. package/dist/esm/package.json +3 -0
  44. package/dist/esm/server/ConfigStorage.d.ts +29 -0
  45. package/dist/esm/server/ConfigStorage.d.ts.map +1 -0
  46. package/dist/esm/server/ConfigStorage.js +84 -0
  47. package/dist/esm/server/ConfigStorage.js.map +6 -0
  48. package/dist/esm/server/Converters.d.ts +53 -0
  49. package/dist/esm/server/Converters.d.ts.map +1 -0
  50. package/dist/esm/server/Converters.js +343 -0
  51. package/dist/esm/server/Converters.js.map +6 -0
  52. package/dist/esm/server/WebSocketControllerHandler.d.ts +21 -0
  53. package/dist/esm/server/WebSocketControllerHandler.d.ts.map +1 -0
  54. package/dist/esm/server/WebSocketControllerHandler.js +767 -0
  55. package/dist/esm/server/WebSocketControllerHandler.js.map +6 -0
  56. package/dist/esm/types/CommandHandler.d.ts +258 -0
  57. package/dist/esm/types/CommandHandler.d.ts.map +1 -0
  58. package/dist/esm/types/CommandHandler.js +6 -0
  59. package/dist/esm/types/CommandHandler.js.map +6 -0
  60. package/dist/esm/types/WebServer.d.ts +12 -0
  61. package/dist/esm/types/WebServer.d.ts.map +1 -0
  62. package/dist/esm/types/WebServer.js +6 -0
  63. package/dist/esm/types/WebServer.js.map +6 -0
  64. package/dist/esm/types/WebSocketMessageTypes.d.ts +478 -0
  65. package/dist/esm/types/WebSocketMessageTypes.d.ts.map +1 -0
  66. package/dist/esm/types/WebSocketMessageTypes.js +77 -0
  67. package/dist/esm/types/WebSocketMessageTypes.js.map +6 -0
  68. package/dist/esm/util/matterVersion.d.ts +12 -0
  69. package/dist/esm/util/matterVersion.d.ts.map +1 -0
  70. package/dist/esm/util/matterVersion.js +32 -0
  71. package/dist/esm/util/matterVersion.js.map +6 -0
  72. package/dist/esm/util/network.d.ts +14 -0
  73. package/dist/esm/util/network.d.ts.map +1 -0
  74. package/dist/esm/util/network.js +63 -0
  75. package/dist/esm/util/network.js.map +6 -0
  76. package/package.json +45 -0
  77. package/src/controller/AttributeDataCache.ts +194 -0
  78. package/src/controller/ControllerCommandHandler.ts +1256 -0
  79. package/src/controller/LegacyDataInjector.ts +314 -0
  80. package/src/controller/MatterController.ts +265 -0
  81. package/src/controller/Nodes.ts +115 -0
  82. package/src/controller/TestNodeCommandHandler.ts +305 -0
  83. package/src/data/VendorIDs.ts +1234 -0
  84. package/src/example/send-command.ts +82 -0
  85. package/src/index.ts +33 -0
  86. package/src/model/ModelMapper.ts +87 -0
  87. package/src/server/ConfigStorage.ts +112 -0
  88. package/src/server/Converters.ts +483 -0
  89. package/src/server/WebSocketControllerHandler.ts +917 -0
  90. package/src/tsconfig.json +7 -0
  91. package/src/types/CommandHandler.ts +270 -0
  92. package/src/types/WebServer.ts +14 -0
  93. package/src/types/WebSocketMessageTypes.ts +525 -0
  94. package/src/util/matterVersion.ts +45 -0
  95. package/src/util/network.ts +85 -0
@@ -0,0 +1,343 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025-2026 Open Home Foundation
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { AttributeId, Bytes, camelize, ClusterId, isObject, Logger } from "@matter/main";
7
+ import { FieldValue } from "@matter/main/model";
8
+ import { EndpointNumber, MATTER_EPOCH_OFFSET_S, MATTER_EPOCH_OFFSET_US } from "@matter/main/types";
9
+ const logger = new Logger("ChipToolWebSocketHandler");
10
+ function parseNumber(number) {
11
+ const parsed = number.startsWith("0x") ? BigInt(number) : parseInt(number);
12
+ if (typeof parsed === "number" && isNaN(parsed)) {
13
+ throw new Error(`Failed to parse number: ${number}`);
14
+ }
15
+ return parsed;
16
+ }
17
+ function convertWebSocketGenericToMatter(value, model, clusterModel) {
18
+ if (typeof value === "number" && model.metabase?.metatype === "bitmap") {
19
+ const bitmapValue = {};
20
+ for (const member of clusterModel.scope.membersOf(model)) {
21
+ const memberName = member.name !== void 0 && model.name !== "FeatureMap" ? camelize(member.name) : member.title !== void 0 ? camelize(member.title) : void 0;
22
+ if (memberName === void 0) {
23
+ continue;
24
+ }
25
+ const constraintValue = FieldValue.numericValue(member.constraint.value);
26
+ if (constraintValue !== void 0) {
27
+ bitmapValue[memberName] = (value & 1 << constraintValue) !== 0;
28
+ } else {
29
+ const minBit = FieldValue.numericValue(member.constraint.min) ?? 0;
30
+ const maxBit = FieldValue.numericValue(member.constraint.max);
31
+ if (maxBit !== void 0) {
32
+ const mask = (1 << maxBit - minBit + 1) - 1 << minBit;
33
+ bitmapValue[memberName] = (value & mask) >> minBit;
34
+ } else {
35
+ bitmapValue[memberName] = (value & 1 << minBit) !== 0;
36
+ }
37
+ }
38
+ }
39
+ return bitmapValue;
40
+ }
41
+ if (typeof value === "string" && model.metabase?.metatype === "bytes") {
42
+ return Bytes.fromBase64(value);
43
+ }
44
+ if (model.metabase?.metatype === "integer") {
45
+ if (model.type === "epoch-s" && typeof value === "number") {
46
+ return value + MATTER_EPOCH_OFFSET_S;
47
+ } else if (model.type === "epoch-us" && (typeof value === "number" || typeof value === "bigint")) {
48
+ return BigInt(value) + MATTER_EPOCH_OFFSET_US;
49
+ }
50
+ }
51
+ return value;
52
+ }
53
+ function convertWebSocketTagBasedToMatter(value, model, clusterModel) {
54
+ if (model === void 0 || value === null) {
55
+ return value;
56
+ }
57
+ if (Array.isArray(value) && model.type === "list") {
58
+ return value.map((v) => convertWebSocketTagBasedToMatter(v, model.members[0], clusterModel));
59
+ }
60
+ if (isObject(value) && model.metabase?.name === "struct") {
61
+ const valueKeys = Object.keys(value);
62
+ const result = {};
63
+ const memberById = {};
64
+ for (const member of model.members) {
65
+ if (member.id !== void 0) {
66
+ memberById[member.id] = member;
67
+ }
68
+ }
69
+ for (const key of valueKeys) {
70
+ const memberId = parseInt(key);
71
+ if (!isNaN(memberId) && memberById[memberId]) {
72
+ const member = memberById[memberId];
73
+ result[camelize(member.name)] = convertWebSocketTagBasedToMatter(value[key], member, clusterModel);
74
+ } else {
75
+ result[key] = value[key];
76
+ }
77
+ }
78
+ return result;
79
+ }
80
+ return convertWebSocketGenericToMatter(value, model, clusterModel);
81
+ }
82
+ function convertCommandDataToMatter(value, model, clusterModel) {
83
+ if (model === void 0 || value === null) {
84
+ return value;
85
+ }
86
+ if (Array.isArray(value) && model.type === "list") {
87
+ return value.map((v) => convertCommandDataToMatter(v, model.members[0], clusterModel));
88
+ }
89
+ if (isObject(value) && model.metabase?.name === "struct") {
90
+ const valueKeys = Object.keys(value);
91
+ const result = {};
92
+ const memberByName = {};
93
+ for (const member of model.members) {
94
+ if (member.name !== void 0) {
95
+ memberByName[camelize(member.name)] = member;
96
+ }
97
+ }
98
+ for (const key of valueKeys) {
99
+ if (memberByName[key]) {
100
+ const member = memberByName[key];
101
+ result[key] = convertCommandDataToMatter(value[key], member, clusterModel);
102
+ } else {
103
+ result[key] = value[key];
104
+ }
105
+ }
106
+ return result;
107
+ }
108
+ return convertWebSocketGenericToMatter(value, model, clusterModel);
109
+ }
110
+ function convertMatterToWebSocketTagBased(value, model, clusterModel) {
111
+ if (value === null) {
112
+ return null;
113
+ }
114
+ if (model === void 0) {
115
+ if (Bytes.isBytes(value)) {
116
+ return `${Bytes.toBase64(value)}`;
117
+ }
118
+ if (isObject(value) || !["string", "number", "bigint", "boolean", "undefined"].includes(typeof value)) {
119
+ return null;
120
+ }
121
+ return value;
122
+ }
123
+ if (Array.isArray(value) && model.type === "list") {
124
+ return value.map((v) => convertMatterToWebSocketTagBased(v, model.members[0], clusterModel));
125
+ }
126
+ if (isObject(value) && model.metabase?.name === "struct") {
127
+ const valueKeys = Object.keys(value);
128
+ const result = {};
129
+ for (const member of model.members) {
130
+ const name = camelize(member.name);
131
+ if (member.name !== void 0 && member.id !== void 0 && valueKeys.includes(name)) {
132
+ result[member.id] = convertMatterToWebSocketTagBased(value[name], member, clusterModel);
133
+ }
134
+ }
135
+ return result;
136
+ }
137
+ if (isObject(value) && model.metabase?.metatype === "bitmap") {
138
+ if (clusterModel !== void 0) {
139
+ let numberValue = 0;
140
+ for (const member of clusterModel.scope.membersOf(model)) {
141
+ const memberValue = member.name !== void 0 && value[camelize(member.name)] ? value[camelize(member.name)] : member.title !== void 0 && value[camelize(member.title)] ? value[camelize(member.title)] : void 0;
142
+ if (!memberValue) {
143
+ continue;
144
+ }
145
+ if (typeof memberValue !== "boolean" && typeof memberValue !== "number") {
146
+ throw new Error("Invalid bitmap value", memberValue);
147
+ }
148
+ const constraintValue = FieldValue.numericValue(member.constraint.value);
149
+ if (constraintValue !== void 0) {
150
+ numberValue |= 1 << constraintValue;
151
+ } else {
152
+ const minBit = FieldValue.numericValue(member.constraint.min) ?? 0;
153
+ numberValue |= typeof memberValue === "boolean" ? 1 : memberValue << minBit;
154
+ }
155
+ }
156
+ return numberValue;
157
+ }
158
+ }
159
+ if (value instanceof Uint8Array && model.metabase?.metatype === "bytes") {
160
+ value = `${Bytes.toBase64(value)}`;
161
+ }
162
+ if (model.metabase?.metatype === "integer") {
163
+ if (model.type === "epoch-s" && typeof value === "number") {
164
+ value -= MATTER_EPOCH_OFFSET_S;
165
+ } else if (model.type === "epoch-us" && (typeof value === "number" || typeof value === "bigint")) {
166
+ value = BigInt(value) - MATTER_EPOCH_OFFSET_US;
167
+ }
168
+ return value;
169
+ }
170
+ return value;
171
+ }
172
+ function toBigIntAwareJson(object, spaces) {
173
+ const replacements = new Array();
174
+ let result = JSON.stringify(
175
+ object,
176
+ (_key, value) => {
177
+ if (typeof value === "bigint") {
178
+ if (value > Number.MAX_SAFE_INTEGER) {
179
+ replacements.push({ from: `"0x${value.toString(16)}"`, to: value.toString() });
180
+ return `0x${value.toString(16)}`;
181
+ } else {
182
+ return Number(value);
183
+ }
184
+ }
185
+ return value;
186
+ },
187
+ spaces
188
+ );
189
+ if (replacements.length > 0) {
190
+ replacements.forEach(({ from, to }) => {
191
+ result = result.replaceAll(from, to);
192
+ });
193
+ }
194
+ return result;
195
+ }
196
+ const BIGINT_MARKER = "__BIGINT__";
197
+ function parseBigIntAwareJson(json) {
198
+ const processed = json.replace(/([:,[])\s*(\d{15,})(?=[,}\]\s])/g, (match, prefix, number) => {
199
+ const num = BigInt(number);
200
+ if (num > Number.MAX_SAFE_INTEGER) {
201
+ return `${prefix}"${BIGINT_MARKER}${number}"`;
202
+ }
203
+ return match;
204
+ });
205
+ return JSON.parse(processed, (_key, value) => {
206
+ if (typeof value === "string" && value.startsWith(BIGINT_MARKER)) {
207
+ return BigInt(value.slice(BIGINT_MARKER.length));
208
+ }
209
+ return value;
210
+ });
211
+ }
212
+ function parseChipJSON(json) {
213
+ json = json.replace(/: (\d{15,})[,}]/g, (match, number) => {
214
+ const num = BigInt(number);
215
+ if (num > Number.MAX_SAFE_INTEGER) {
216
+ return match.replace(number, `"0x${num.toString(16)}"`);
217
+ }
218
+ return match;
219
+ });
220
+ return JSON.parse(json);
221
+ }
222
+ function convertWebsocketDataToMatter(value, model) {
223
+ if (value === void 0) {
224
+ return void 0;
225
+ }
226
+ if (value === "null" || value === null) {
227
+ return null;
228
+ }
229
+ if (model.type === "list") {
230
+ if (typeof value === "string") {
231
+ value = parseChipJSON(value);
232
+ }
233
+ if (Array.isArray(value)) {
234
+ return value.map((v) => convertWebsocketDataToMatter(v, model.members[0]));
235
+ }
236
+ }
237
+ if (model.metabase?.name === "struct") {
238
+ if (typeof value === "string") {
239
+ value = parseChipJSON(value);
240
+ }
241
+ if (typeof value === "object") {
242
+ const members = model.members.reduce(
243
+ (acc, member) => {
244
+ if (member.name !== void 0) {
245
+ acc[member.name.toLowerCase()] = member;
246
+ }
247
+ return acc;
248
+ },
249
+ {}
250
+ );
251
+ const valueKeys = Object.keys(value);
252
+ const result = {};
253
+ valueKeys.forEach((key) => {
254
+ const member = members[camelize(key).toLowerCase()];
255
+ if (member !== void 0) {
256
+ result[camelize(member.name)] = convertWebsocketDataToMatter(value[key], member);
257
+ }
258
+ });
259
+ return result;
260
+ }
261
+ }
262
+ if ((typeof value === "number" || typeof value === "bigint") && (model.metabase?.metatype === "integer" || model.metabase?.metatype === "enum")) {
263
+ if (model.type === "epoch-s" && typeof value === "number") {
264
+ value += MATTER_EPOCH_OFFSET_S;
265
+ } else if (model.type === "epoch-us") {
266
+ value = BigInt(value) + MATTER_EPOCH_OFFSET_US;
267
+ }
268
+ return value;
269
+ }
270
+ if (typeof value === "string") {
271
+ if (model.metabase?.metatype === "bytes" && value.startsWith("hex:")) {
272
+ return Bytes.fromHex(value.slice(4));
273
+ }
274
+ if (model.metabase?.metatype === "bitmap") {
275
+ const numberValue = parseInt(value);
276
+ if (isNaN(numberValue)) {
277
+ throw new Error("Invalid bitmap value");
278
+ }
279
+ const bitmapValue = {};
280
+ model.members.forEach((member) => {
281
+ if (member.constraint !== void 0 && member.name !== void 0 && numberValue & 1 << parseInt(member.constraint)) {
282
+ bitmapValue[camelize(member.name)] = true;
283
+ }
284
+ });
285
+ return bitmapValue;
286
+ }
287
+ if ((model.metabase?.metatype === "integer" || model.metabase?.metatype === "enum") && value.startsWith("0x") && value.match(/^0x[\da-fA-F]+$/) || value.match(/^-?[1-9]\d*$/) || value === "0") {
288
+ let numberValue = parseNumber(value);
289
+ if (model.type === "epoch-s" && typeof numberValue === "number") {
290
+ numberValue += MATTER_EPOCH_OFFSET_S;
291
+ } else if (model.type === "epoch-us") {
292
+ numberValue = BigInt(value) + MATTER_EPOCH_OFFSET_US;
293
+ }
294
+ return numberValue;
295
+ }
296
+ if (model.metabase?.metatype === "boolean") {
297
+ return value === "true" || value === "1" || value === "True";
298
+ }
299
+ if (model.metabase?.metatype === "string") {
300
+ return value;
301
+ }
302
+ }
303
+ logger.warn("UNHANDLED value ...", value, model.type, model.metatype, model.metabase?.metatype);
304
+ return value;
305
+ }
306
+ function getDateAsString(date) {
307
+ const year = date.getFullYear();
308
+ const month = String(date.getMonth() + 1).padStart(2, "0");
309
+ const day = String(date.getDate()).padStart(2, "0");
310
+ const hours = String(date.getHours()).padStart(2, "0");
311
+ const minutes = String(date.getMinutes()).padStart(2, "0");
312
+ const seconds = String(date.getSeconds()).padStart(2, "0");
313
+ const milliseconds = String(date.getMilliseconds()).padStart(3, "0");
314
+ const microseconds = "000";
315
+ return `${year}-${month}-${day}T${hours}:${minutes}:${seconds}.${milliseconds}${microseconds}`;
316
+ }
317
+ function buildAttributePath(endpointId, clusterId, attributeId) {
318
+ return `${endpointId}/${clusterId}/${attributeId}`;
319
+ }
320
+ function splitAttributePath(path) {
321
+ const [endpointStr, clusterStr, attributeStr] = path.split("/");
322
+ const endpointNum = /^\d+$/.test(endpointStr) ? parseInt(endpointStr, 10) : void 0;
323
+ const clusterNum = /^\d+$/.test(clusterStr) ? parseInt(clusterStr, 10) : void 0;
324
+ const attributeNum = /^\d+$/.test(attributeStr) ? parseInt(attributeStr, 10) : void 0;
325
+ return {
326
+ endpointId: endpointNum !== void 0 ? EndpointNumber(endpointNum) : void 0,
327
+ clusterId: clusterNum !== void 0 ? ClusterId(clusterNum) : void 0,
328
+ attributeId: attributeNum !== void 0 ? AttributeId(attributeNum) : void 0
329
+ };
330
+ }
331
+ export {
332
+ buildAttributePath,
333
+ convertCommandDataToMatter,
334
+ convertMatterToWebSocketTagBased,
335
+ convertWebSocketTagBasedToMatter,
336
+ convertWebsocketDataToMatter,
337
+ getDateAsString,
338
+ parseBigIntAwareJson,
339
+ parseNumber,
340
+ splitAttributePath,
341
+ toBigIntAwareJson
342
+ };
343
+ //# sourceMappingURL=Converters.js.map
@@ -0,0 +1,6 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/server/Converters.ts"],
4
+ "mappings": "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",
5
+ "names": []
6
+ }
@@ -0,0 +1,21 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2025-2026 Open Home Foundation
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { MatterController } from "../controller/MatterController.js";
7
+ import { HttpServer, WebServerHandler } from "../types/WebServer.js";
8
+ import { MatterNodeEvent } from "../types/WebSocketMessageTypes.js";
9
+ import { ConfigStorage } from "./ConfigStorage.js";
10
+ /** WebSocket Server compatible with Schema version 11 */
11
+ export declare class WebSocketControllerHandler implements WebServerHandler {
12
+ #private;
13
+ constructor(controller: MatterController, config: ConfigStorage);
14
+ /**
15
+ * Get the event history (last 25 events).
16
+ */
17
+ getEventHistory(): MatterNodeEvent[];
18
+ register(server: HttpServer): Promise<void>;
19
+ unregister(): Promise<void>;
20
+ }
21
+ //# sourceMappingURL=WebSocketControllerHandler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WebSocketControllerHandler.d.ts","sourceRoot":"","sources":["../../../src/server/WebSocketControllerHandler.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AASH,OAAO,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AAKrE,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACrE,OAAO,EAKH,eAAe,EAMlB,MAAM,mCAAmC,CAAC;AAE3C,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAenD,yDAAyD;AACzD,qBAAa,0BAA2B,YAAW,gBAAgB;;gBAYnD,UAAU,EAAE,gBAAgB,EAAE,MAAM,EAAE,aAAa;IAyB/D;;OAEG;IACH,eAAe,IAAI,eAAe,EAAE;IAI9B,QAAQ,CAAC,MAAM,EAAE,UAAU;IA4KjC,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;CA4oB9B"}