@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.
- package/LICENSE +201 -0
- package/README.md +11 -0
- package/dist/esm/controller/AttributeDataCache.d.ts +49 -0
- package/dist/esm/controller/AttributeDataCache.d.ts.map +1 -0
- package/dist/esm/controller/AttributeDataCache.js +154 -0
- package/dist/esm/controller/AttributeDataCache.js.map +6 -0
- package/dist/esm/controller/ControllerCommandHandler.d.ts +118 -0
- package/dist/esm/controller/ControllerCommandHandler.d.ts.map +1 -0
- package/dist/esm/controller/ControllerCommandHandler.js +1015 -0
- package/dist/esm/controller/ControllerCommandHandler.js.map +6 -0
- package/dist/esm/controller/LegacyDataInjector.d.ts +95 -0
- package/dist/esm/controller/LegacyDataInjector.d.ts.map +1 -0
- package/dist/esm/controller/LegacyDataInjector.js +196 -0
- package/dist/esm/controller/LegacyDataInjector.js.map +6 -0
- package/dist/esm/controller/MatterController.d.ts +59 -0
- package/dist/esm/controller/MatterController.d.ts.map +1 -0
- package/dist/esm/controller/MatterController.js +212 -0
- package/dist/esm/controller/MatterController.js.map +6 -0
- package/dist/esm/controller/Nodes.d.ts +62 -0
- package/dist/esm/controller/Nodes.d.ts.map +1 -0
- package/dist/esm/controller/Nodes.js +85 -0
- package/dist/esm/controller/Nodes.js.map +6 -0
- package/dist/esm/controller/TestNodeCommandHandler.d.ts +84 -0
- package/dist/esm/controller/TestNodeCommandHandler.d.ts.map +1 -0
- package/dist/esm/controller/TestNodeCommandHandler.js +225 -0
- package/dist/esm/controller/TestNodeCommandHandler.js.map +6 -0
- package/dist/esm/data/VendorIDs.d.ts +7 -0
- package/dist/esm/data/VendorIDs.d.ts.map +1 -0
- package/dist/esm/data/VendorIDs.js +1237 -0
- package/dist/esm/data/VendorIDs.js.map +6 -0
- package/dist/esm/example/send-command.d.ts +7 -0
- package/dist/esm/example/send-command.d.ts.map +1 -0
- package/dist/esm/example/send-command.js +60 -0
- package/dist/esm/example/send-command.js.map +6 -0
- package/dist/esm/index.d.ts +21 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +26 -0
- package/dist/esm/index.js.map +6 -0
- package/dist/esm/model/ModelMapper.d.ts +34 -0
- package/dist/esm/model/ModelMapper.d.ts.map +1 -0
- package/dist/esm/model/ModelMapper.js +62 -0
- package/dist/esm/model/ModelMapper.js.map +6 -0
- package/dist/esm/package.json +3 -0
- package/dist/esm/server/ConfigStorage.d.ts +29 -0
- package/dist/esm/server/ConfigStorage.d.ts.map +1 -0
- package/dist/esm/server/ConfigStorage.js +84 -0
- package/dist/esm/server/ConfigStorage.js.map +6 -0
- package/dist/esm/server/Converters.d.ts +53 -0
- package/dist/esm/server/Converters.d.ts.map +1 -0
- package/dist/esm/server/Converters.js +343 -0
- package/dist/esm/server/Converters.js.map +6 -0
- package/dist/esm/server/WebSocketControllerHandler.d.ts +21 -0
- package/dist/esm/server/WebSocketControllerHandler.d.ts.map +1 -0
- package/dist/esm/server/WebSocketControllerHandler.js +767 -0
- package/dist/esm/server/WebSocketControllerHandler.js.map +6 -0
- package/dist/esm/types/CommandHandler.d.ts +258 -0
- package/dist/esm/types/CommandHandler.d.ts.map +1 -0
- package/dist/esm/types/CommandHandler.js +6 -0
- package/dist/esm/types/CommandHandler.js.map +6 -0
- package/dist/esm/types/WebServer.d.ts +12 -0
- package/dist/esm/types/WebServer.d.ts.map +1 -0
- package/dist/esm/types/WebServer.js +6 -0
- package/dist/esm/types/WebServer.js.map +6 -0
- package/dist/esm/types/WebSocketMessageTypes.d.ts +478 -0
- package/dist/esm/types/WebSocketMessageTypes.d.ts.map +1 -0
- package/dist/esm/types/WebSocketMessageTypes.js +77 -0
- package/dist/esm/types/WebSocketMessageTypes.js.map +6 -0
- package/dist/esm/util/matterVersion.d.ts +12 -0
- package/dist/esm/util/matterVersion.d.ts.map +1 -0
- package/dist/esm/util/matterVersion.js +32 -0
- package/dist/esm/util/matterVersion.js.map +6 -0
- package/dist/esm/util/network.d.ts +14 -0
- package/dist/esm/util/network.d.ts.map +1 -0
- package/dist/esm/util/network.js +63 -0
- package/dist/esm/util/network.js.map +6 -0
- package/package.json +45 -0
- package/src/controller/AttributeDataCache.ts +194 -0
- package/src/controller/ControllerCommandHandler.ts +1256 -0
- package/src/controller/LegacyDataInjector.ts +314 -0
- package/src/controller/MatterController.ts +265 -0
- package/src/controller/Nodes.ts +115 -0
- package/src/controller/TestNodeCommandHandler.ts +305 -0
- package/src/data/VendorIDs.ts +1234 -0
- package/src/example/send-command.ts +82 -0
- package/src/index.ts +33 -0
- package/src/model/ModelMapper.ts +87 -0
- package/src/server/ConfigStorage.ts +112 -0
- package/src/server/Converters.ts +483 -0
- package/src/server/WebSocketControllerHandler.ts +917 -0
- package/src/tsconfig.json +7 -0
- package/src/types/CommandHandler.ts +270 -0
- package/src/types/WebServer.ts +14 -0
- package/src/types/WebSocketMessageTypes.ts +525 -0
- package/src/util/matterVersion.ts +45 -0
- 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"}
|