@matter-server/ws-controller 0.5.7 → 0.5.8
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/esm/controller/ControllerCommandHandler.d.ts +3 -3
- package/dist/esm/controller/ControllerCommandHandler.d.ts.map +1 -1
- package/dist/esm/controller/ControllerCommandHandler.js +2 -2
- package/dist/esm/controller/ControllerCommandHandler.js.map +1 -1
- package/dist/esm/controller/CustomClusterPoller.d.ts +2 -2
- package/dist/esm/controller/CustomClusterPoller.d.ts.map +1 -1
- package/dist/esm/controller/CustomClusterPoller.js +21 -5
- package/dist/esm/controller/CustomClusterPoller.js.map +1 -1
- package/dist/esm/controller/LegacyDataInjector.d.ts +2 -2
- package/dist/esm/controller/LegacyDataInjector.d.ts.map +1 -1
- package/dist/esm/controller/LegacyDataInjector.js +5 -1
- package/dist/esm/controller/LegacyDataInjector.js.map +1 -1
- package/dist/esm/controller/MatterController.d.ts.map +1 -1
- package/dist/esm/controller/MatterController.js +3 -3
- package/dist/esm/controller/MatterController.js.map +1 -1
- package/dist/esm/controller/TestNodeCommandHandler.d.ts +1 -1
- package/dist/esm/controller/TestNodeCommandHandler.d.ts.map +1 -1
- package/dist/esm/model/ModelMapper.js +2 -2
- package/dist/esm/model/ModelMapper.js.map +1 -1
- package/dist/esm/server/ConfigStorage.d.ts +2 -2
- package/dist/esm/server/ConfigStorage.d.ts.map +1 -1
- package/dist/esm/server/ConfigStorage.js.map +1 -1
- package/dist/esm/server/Converters.js +4 -4
- package/dist/esm/server/Converters.js.map +1 -1
- package/dist/esm/server/WebSocketControllerHandler.d.ts.map +1 -1
- package/dist/esm/server/WebSocketControllerHandler.js +6 -3
- package/dist/esm/server/WebSocketControllerHandler.js.map +1 -1
- package/dist/esm/types/CommandHandler.d.ts +2 -4
- package/dist/esm/types/CommandHandler.d.ts.map +1 -1
- package/dist/esm/types/WebSocketMessageTypes.d.ts +6 -453
- package/dist/esm/types/WebSocketMessageTypes.d.ts.map +1 -1
- package/dist/esm/types/WebSocketMessageTypes.js +4 -7
- package/dist/esm/types/WebSocketMessageTypes.js.map +2 -2
- package/package.json +7 -6
- package/src/controller/ControllerCommandHandler.ts +2 -2
- package/src/controller/CustomClusterPoller.ts +21 -7
- package/src/controller/LegacyDataInjector.ts +7 -3
- package/src/controller/MatterController.ts +4 -3
- package/src/model/ModelMapper.ts +2 -2
- package/src/server/ConfigStorage.ts +2 -2
- package/src/server/Converters.ts +4 -4
- package/src/server/WebSocketControllerHandler.ts +7 -4
- package/src/tsconfig.json +9 -3
- package/src/types/CommandHandler.ts +2 -4
- package/src/types/WebSocketMessageTypes.ts +38 -456
|
@@ -122,9 +122,10 @@ export class MatterController {
|
|
|
122
122
|
|
|
123
123
|
// Check if the nextNodeId needs to be updated based on legacy data
|
|
124
124
|
const lastNodeId = legacyData.nodeData?.last_node_id;
|
|
125
|
-
if (typeof lastNodeId === "number") {
|
|
126
|
-
|
|
127
|
-
|
|
125
|
+
if (typeof lastNodeId === "number" || typeof lastNodeId === "bigint") {
|
|
126
|
+
// Compare as BigInt to safely handle both number and bigint types
|
|
127
|
+
if (BigInt(config.nextNodeId) <= BigInt(lastNodeId)) {
|
|
128
|
+
const newNextNodeId = BigInt(lastNodeId) + 10n;
|
|
128
129
|
logger.info(
|
|
129
130
|
`Updating nextNodeId from ${config.nextNodeId} to ${newNextNodeId} (legacy last_node_id: ${lastNodeId})`,
|
|
130
131
|
);
|
package/src/model/ModelMapper.ts
CHANGED
|
@@ -15,7 +15,7 @@ import {
|
|
|
15
15
|
EventModel,
|
|
16
16
|
FeatureMap,
|
|
17
17
|
GeneratedCommandList,
|
|
18
|
-
|
|
18
|
+
Matter,
|
|
19
19
|
} from "@matter/main/model";
|
|
20
20
|
|
|
21
21
|
type AttributeDetails = { readonly [key: string]: AttributeModel | undefined };
|
|
@@ -53,7 +53,7 @@ export type ClusterMapType = {
|
|
|
53
53
|
// Build the cluster map at module load time
|
|
54
54
|
const clusterMapBuilder: { [key: string]: ClusterMapEntry | undefined } = {};
|
|
55
55
|
|
|
56
|
-
|
|
56
|
+
Matter.clusters.forEach(cluster => {
|
|
57
57
|
if (cluster.id === undefined) {
|
|
58
58
|
return;
|
|
59
59
|
} // Skip clusters without an ID
|
|
@@ -20,7 +20,7 @@ function sanitizeForLog(key: string, value: unknown): string {
|
|
|
20
20
|
|
|
21
21
|
interface ConfigData {
|
|
22
22
|
fabricLabel: string;
|
|
23
|
-
nextNodeId: number
|
|
23
|
+
nextNodeId: number | bigint;
|
|
24
24
|
wifiSsid?: string;
|
|
25
25
|
wifiCredentials?: string;
|
|
26
26
|
threadDataset?: string;
|
|
@@ -68,7 +68,7 @@ export class ConfigStorage {
|
|
|
68
68
|
const fabricLabel = (await this.#configStore.has("fabricLabel"))
|
|
69
69
|
? await this.#configStore.get<string>("fabricLabel")
|
|
70
70
|
: (this.#env.vars.string("fabricLabel") ?? this.#data.fabricLabel);
|
|
71
|
-
const nextNodeId = await this.#configStore.get<number>("nextNodeId", this.#data.nextNodeId);
|
|
71
|
+
const nextNodeId = await this.#configStore.get<number | bigint>("nextNodeId", this.#data.nextNodeId);
|
|
72
72
|
|
|
73
73
|
const wifiSsid = (await this.#configStore.has("wifiSsid"))
|
|
74
74
|
? await this.#configStore.get<string>("wifiSsid", "")
|
package/src/server/Converters.ts
CHANGED
|
@@ -90,7 +90,7 @@ export function convertWebSocketTagBasedToMatter(
|
|
|
90
90
|
|
|
91
91
|
// Handle lists
|
|
92
92
|
if (Array.isArray(value) && model.type === "list") {
|
|
93
|
-
return value.map(v => convertWebSocketTagBasedToMatter(v, model.members
|
|
93
|
+
return value.map(v => convertWebSocketTagBasedToMatter(v, model.members.at(0), clusterModel));
|
|
94
94
|
}
|
|
95
95
|
|
|
96
96
|
// Handle structs - convert numeric keys to camelCased member names
|
|
@@ -136,7 +136,7 @@ export function convertCommandDataToMatter(
|
|
|
136
136
|
|
|
137
137
|
// Handle lists
|
|
138
138
|
if (Array.isArray(value) && model.type === "list") {
|
|
139
|
-
return value.map(v => convertCommandDataToMatter(v, model.members
|
|
139
|
+
return value.map(v => convertCommandDataToMatter(v, model.members.at(0), clusterModel));
|
|
140
140
|
}
|
|
141
141
|
|
|
142
142
|
// Handle structs - convert numeric keys to camelCased member names
|
|
@@ -303,7 +303,7 @@ function convertMatterToWebSocket(
|
|
|
303
303
|
|
|
304
304
|
case ConvKind.List:
|
|
305
305
|
return Array.isArray(value)
|
|
306
|
-
? value.map(v => convertMatterToWebSocket(v, model.members
|
|
306
|
+
? value.map(v => convertMatterToWebSocket(v, model.members.at(0), clusterModel, tagBased))
|
|
307
307
|
: value;
|
|
308
308
|
|
|
309
309
|
case ConvKind.Struct: {
|
|
@@ -527,7 +527,7 @@ export function convertWebsocketDataToMatter(value: any, model: ValueModel): any
|
|
|
527
527
|
value = parseChipJSON(value);
|
|
528
528
|
}
|
|
529
529
|
if (Array.isArray(value)) {
|
|
530
|
-
return value.map(v => convertWebsocketDataToMatter(v, model.members
|
|
530
|
+
return value.map(v => convertWebsocketDataToMatter(v, model.members.at(0)!));
|
|
531
531
|
}
|
|
532
532
|
}
|
|
533
533
|
|
|
@@ -361,7 +361,6 @@ export class WebSocketControllerHandler implements WebServerHandler {
|
|
|
361
361
|
}
|
|
362
362
|
}
|
|
363
363
|
});
|
|
364
|
-
console.log("send close to clients");
|
|
365
364
|
|
|
366
365
|
const wss = this.#wss;
|
|
367
366
|
// Wait for the WebSocket server to close properly
|
|
@@ -379,7 +378,7 @@ export class WebSocketControllerHandler implements WebServerHandler {
|
|
|
379
378
|
async #handleWebSocketRequest(
|
|
380
379
|
connId: string,
|
|
381
380
|
data: string,
|
|
382
|
-
): Promise<{ response: ErrorResultMessage | SuccessResultMessage
|
|
381
|
+
): Promise<{ response: ErrorResultMessage | SuccessResultMessage; enableListeners?: boolean }> {
|
|
383
382
|
let messageId: string | undefined;
|
|
384
383
|
try {
|
|
385
384
|
logger.debug(`[${connId}] WebSocket request`, () => data);
|
|
@@ -603,7 +602,9 @@ export class WebSocketControllerHandler implements WebServerHandler {
|
|
|
603
602
|
}
|
|
604
603
|
}
|
|
605
604
|
|
|
606
|
-
await this.#config.set({
|
|
605
|
+
await this.#config.set({
|
|
606
|
+
nextNodeId: typeof nextNodeId === "bigint" ? nextNodeId + 1n : nextNodeId + 1,
|
|
607
|
+
});
|
|
607
608
|
|
|
608
609
|
const { nodeId } = await this.#commandHandler.commissionNode({
|
|
609
610
|
nodeId: NodeId(nextNodeId),
|
|
@@ -657,7 +658,9 @@ export class WebSocketControllerHandler implements WebServerHandler {
|
|
|
657
658
|
break;
|
|
658
659
|
}
|
|
659
660
|
|
|
660
|
-
await this.#config.set({
|
|
661
|
+
await this.#config.set({
|
|
662
|
+
nextNodeId: typeof nextNodeId === "bigint" ? nextNodeId + 1n : nextNodeId + 1,
|
|
663
|
+
});
|
|
661
664
|
|
|
662
665
|
const { nodeId } = await this.#commandHandler.commissionNode(commissionRequest);
|
|
663
666
|
|
package/src/tsconfig.json
CHANGED
|
@@ -211,11 +211,9 @@ export type OpenCommissioningWindowResponse = {
|
|
|
211
211
|
qrCode: string;
|
|
212
212
|
};
|
|
213
213
|
|
|
214
|
-
import { AttributesData,
|
|
214
|
+
import type { AttributesData, MatterNodeData } from "@matter-server/ws-client";
|
|
215
215
|
|
|
216
|
-
|
|
217
|
-
export type { AttributesData };
|
|
218
|
-
export type MatterNodeData = MatterNode;
|
|
216
|
+
export type { AttributesData, MatterNodeData };
|
|
219
217
|
|
|
220
218
|
/**
|
|
221
219
|
* Interface for node command handlers.
|
|
@@ -4,465 +4,47 @@
|
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
|
-
export type AttributesData = { [key: string]: unknown };
|
|
8
|
-
|
|
9
|
-
export interface MatterNode {
|
|
10
|
-
node_id: number | bigint;
|
|
11
|
-
date_commissioned: string;
|
|
12
|
-
last_interview: string;
|
|
13
|
-
interview_version: number;
|
|
14
|
-
available: boolean;
|
|
15
|
-
is_bridge: boolean;
|
|
16
|
-
attributes: AttributesData;
|
|
17
|
-
attribute_subscriptions: []; // ???
|
|
18
|
-
/**
|
|
19
|
-
* Matter specification version of the node (e.g., "1.2.0", "1.3.0", "1.4.0").
|
|
20
|
-
* Determined from the SpecificationVersion attribute (0x15) if available,
|
|
21
|
-
* otherwise estimated from DataModelRevision (0x0) on BasicInformation cluster.
|
|
22
|
-
* Optional - not available in Python Matter Server.
|
|
23
|
-
*/
|
|
24
|
-
matter_version?: string;
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
export interface APICommands {
|
|
28
|
-
start_listening: {
|
|
29
|
-
requestArgs: void;
|
|
30
|
-
response: Array<MatterNode>;
|
|
31
|
-
};
|
|
32
|
-
set_default_fabric_label: {
|
|
33
|
-
requestArgs: {
|
|
34
|
-
/** Fabric label (null to clear) */
|
|
35
|
-
label: string | null;
|
|
36
|
-
};
|
|
37
|
-
response: null;
|
|
38
|
-
};
|
|
39
|
-
diagnostics: {
|
|
40
|
-
requestArgs: {};
|
|
41
|
-
response: {
|
|
42
|
-
info: ServerInfoMessage;
|
|
43
|
-
nodes: Array<MatterNode>;
|
|
44
|
-
/** Last 25 node events */
|
|
45
|
-
events: Array<MatterNodeEvent>;
|
|
46
|
-
};
|
|
47
|
-
};
|
|
48
|
-
server_info: {
|
|
49
|
-
requestArgs: {};
|
|
50
|
-
response: ServerInfoMessage;
|
|
51
|
-
};
|
|
52
|
-
get_nodes: {
|
|
53
|
-
requestArgs: {
|
|
54
|
-
only_available?: boolean;
|
|
55
|
-
};
|
|
56
|
-
response: Array<MatterNode>;
|
|
57
|
-
};
|
|
58
|
-
get_node: {
|
|
59
|
-
requestArgs: {
|
|
60
|
-
node_id: number | bigint; // ????
|
|
61
|
-
};
|
|
62
|
-
response: MatterNode; // ????
|
|
63
|
-
};
|
|
64
|
-
commission_with_code: {
|
|
65
|
-
requestArgs: {
|
|
66
|
-
code: string;
|
|
67
|
-
network_only?: boolean;
|
|
68
|
-
};
|
|
69
|
-
response: MatterNode;
|
|
70
|
-
};
|
|
71
|
-
commission_on_network: {
|
|
72
|
-
requestArgs: {
|
|
73
|
-
setup_pin_code: number;
|
|
74
|
-
/** Discovery filter type: 0=None, 1=ShortDiscriminator, 2=LongDiscriminator, 3=VendorId, 4=DeviceType */
|
|
75
|
-
filter_type?: number;
|
|
76
|
-
/** Filter value (discriminator, vendor ID, or device type depending on filter_type) */
|
|
77
|
-
filter?: number;
|
|
78
|
-
/** Direct IP address for commissioning */
|
|
79
|
-
ip_addr?: string;
|
|
80
|
-
};
|
|
81
|
-
response: MatterNode;
|
|
82
|
-
};
|
|
83
|
-
set_wifi_credentials: {
|
|
84
|
-
requestArgs: {
|
|
85
|
-
ssid: string;
|
|
86
|
-
credentials: string;
|
|
87
|
-
};
|
|
88
|
-
response: {};
|
|
89
|
-
};
|
|
90
|
-
set_thread_dataset: {
|
|
91
|
-
requestArgs: {
|
|
92
|
-
dataset: string;
|
|
93
|
-
};
|
|
94
|
-
response: {};
|
|
95
|
-
};
|
|
96
|
-
open_commissioning_window: {
|
|
97
|
-
requestArgs: {
|
|
98
|
-
node_id: number | bigint; //????
|
|
99
|
-
timeout: number; // seconds
|
|
100
|
-
iteration?: number; // 1000
|
|
101
|
-
option?: number; // 1??
|
|
102
|
-
discriminator?: number | null; // ???
|
|
103
|
-
};
|
|
104
|
-
response: {
|
|
105
|
-
setup_pin_code: number;
|
|
106
|
-
setup_manual_code: string;
|
|
107
|
-
setup_qr_code: string;
|
|
108
|
-
};
|
|
109
|
-
};
|
|
110
|
-
discover: {
|
|
111
|
-
requestArgs: {};
|
|
112
|
-
response: CommissionableNodeData[];
|
|
113
|
-
};
|
|
114
|
-
interview_node: {
|
|
115
|
-
requestArgs: {
|
|
116
|
-
node_id: number | bigint; // ???
|
|
117
|
-
};
|
|
118
|
-
response: null;
|
|
119
|
-
};
|
|
120
|
-
device_command: {
|
|
121
|
-
requestArgs: {
|
|
122
|
-
node_id: number | bigint; // ??
|
|
123
|
-
endpoint_id: number;
|
|
124
|
-
cluster_id: number;
|
|
125
|
-
command_name: string;
|
|
126
|
-
payload: unknown;
|
|
127
|
-
response_type: unknown; // ????
|
|
128
|
-
timed_request_timeout_ms?: number | null;
|
|
129
|
-
interaction_timeout_ms?: number | null;
|
|
130
|
-
};
|
|
131
|
-
response: unknown;
|
|
132
|
-
};
|
|
133
|
-
remove_node: {
|
|
134
|
-
requestArgs: {
|
|
135
|
-
node_id: number | bigint; // ???
|
|
136
|
-
};
|
|
137
|
-
response: null;
|
|
138
|
-
};
|
|
139
|
-
get_vendor_names: {
|
|
140
|
-
requestArgs: {
|
|
141
|
-
filter_vendors?: Array<number>;
|
|
142
|
-
};
|
|
143
|
-
response: { [key: string]: string };
|
|
144
|
-
};
|
|
145
|
-
subscribe_attribute: {
|
|
146
|
-
requestArgs: {};
|
|
147
|
-
response: {};
|
|
148
|
-
};
|
|
149
|
-
read_attribute: {
|
|
150
|
-
requestArgs: {
|
|
151
|
-
node_id: number | bigint;
|
|
152
|
-
/** Single attribute path or array of paths. Supports wildcards (*) for cluster and attribute IDs. */
|
|
153
|
-
attribute_path: string | string[];
|
|
154
|
-
/** Filter by fabric (default: false) */
|
|
155
|
-
fabric_filtered?: boolean;
|
|
156
|
-
};
|
|
157
|
-
response: AttributesData;
|
|
158
|
-
};
|
|
159
|
-
write_attribute: {
|
|
160
|
-
requestArgs: {
|
|
161
|
-
node_id: number | bigint; //???,
|
|
162
|
-
attribute_path: string;
|
|
163
|
-
value: unknown;
|
|
164
|
-
};
|
|
165
|
-
response: Array<{
|
|
166
|
-
Path: {
|
|
167
|
-
EndpointId: number;
|
|
168
|
-
ClusterId: number;
|
|
169
|
-
AttributeId: number;
|
|
170
|
-
};
|
|
171
|
-
Status: number;
|
|
172
|
-
}>;
|
|
173
|
-
};
|
|
174
|
-
ping_node: {
|
|
175
|
-
requestArgs: {
|
|
176
|
-
node_id: number | bigint;
|
|
177
|
-
/** Number of ping attempts per IP address (default: 1) */
|
|
178
|
-
attempts?: number;
|
|
179
|
-
};
|
|
180
|
-
response: { [key: string]: boolean };
|
|
181
|
-
};
|
|
182
|
-
import_test_node: {
|
|
183
|
-
requestArgs: {
|
|
184
|
-
dump: string;
|
|
185
|
-
};
|
|
186
|
-
response: null;
|
|
187
|
-
};
|
|
188
|
-
get_node_ip_addresses: {
|
|
189
|
-
requestArgs: {
|
|
190
|
-
node_id: number | bigint; // ????
|
|
191
|
-
prefer_cache: boolean;
|
|
192
|
-
scoped: boolean;
|
|
193
|
-
};
|
|
194
|
-
response: Array<string>;
|
|
195
|
-
};
|
|
196
|
-
check_node_update: {
|
|
197
|
-
requestArgs: { node_id: number | bigint };
|
|
198
|
-
response: MatterSoftwareVersion | null;
|
|
199
|
-
};
|
|
200
|
-
update_node: {
|
|
201
|
-
requestArgs: { node_id: number | bigint; software_version: number | string };
|
|
202
|
-
response: MatterSoftwareVersion | null;
|
|
203
|
-
};
|
|
204
|
-
discover_commissionable_nodes: {
|
|
205
|
-
requestArgs: {};
|
|
206
|
-
response: CommissionableNodeData[];
|
|
207
|
-
};
|
|
208
|
-
get_matter_fabrics: {
|
|
209
|
-
requestArgs: { node_id: number | bigint };
|
|
210
|
-
response: MatterFabricData[];
|
|
211
|
-
};
|
|
212
|
-
remove_matter_fabric: {
|
|
213
|
-
requestArgs: {
|
|
214
|
-
node_id: number | bigint;
|
|
215
|
-
fabric_index: number;
|
|
216
|
-
};
|
|
217
|
-
response: {};
|
|
218
|
-
};
|
|
219
|
-
set_acl_entry: {
|
|
220
|
-
requestArgs: {
|
|
221
|
-
node_id: number | bigint;
|
|
222
|
-
entry: AccessControlEntry[];
|
|
223
|
-
};
|
|
224
|
-
response: AttributeWriteResult[] | null;
|
|
225
|
-
};
|
|
226
|
-
set_node_binding: {
|
|
227
|
-
requestArgs: {
|
|
228
|
-
node_id: number | bigint;
|
|
229
|
-
endpoint: number;
|
|
230
|
-
bindings: BindingTarget[];
|
|
231
|
-
};
|
|
232
|
-
response: AttributeWriteResult[] | null;
|
|
233
|
-
};
|
|
234
|
-
get_loglevel: {
|
|
235
|
-
requestArgs: {};
|
|
236
|
-
response: {
|
|
237
|
-
/** Console log level */
|
|
238
|
-
console_loglevel: LogLevelString;
|
|
239
|
-
/** File log level (null if file logging not enabled) */
|
|
240
|
-
file_loglevel: LogLevelString | null;
|
|
241
|
-
};
|
|
242
|
-
};
|
|
243
|
-
set_loglevel: {
|
|
244
|
-
requestArgs: {
|
|
245
|
-
/** Console log level to set */
|
|
246
|
-
console_loglevel?: LogLevelString;
|
|
247
|
-
/** File log level to set (only applied if file logging is enabled) */
|
|
248
|
-
file_loglevel?: LogLevelString;
|
|
249
|
-
};
|
|
250
|
-
response: {
|
|
251
|
-
/** Console log level after change */
|
|
252
|
-
console_loglevel: LogLevelString;
|
|
253
|
-
/** File log level after change (null if file logging not enabled) */
|
|
254
|
-
file_loglevel: LogLevelString | null;
|
|
255
|
-
};
|
|
256
|
-
};
|
|
257
|
-
}
|
|
258
|
-
|
|
259
|
-
/** Log level string values matching CLI options */
|
|
260
|
-
export type LogLevelString = "critical" | "error" | "warning" | "info" | "debug";
|
|
261
|
-
|
|
262
|
-
/**
|
|
263
|
-
* Access Control Entry structure for set_acl_entry command.
|
|
264
|
-
* Uses snake_case field names matching our API convention.
|
|
265
|
-
*/
|
|
266
|
-
export interface AccessControlEntry {
|
|
267
|
-
/** 1=View, 3=Operate, 4=Manage, 5=Administer */
|
|
268
|
-
privilege: number;
|
|
269
|
-
/** 1=PASE, 2=CASE, 3=Group */
|
|
270
|
-
auth_mode: number;
|
|
271
|
-
/** List of subject NodeIds or GroupIds */
|
|
272
|
-
subjects: Array<number | bigint> | null;
|
|
273
|
-
/** Optional target restrictions */
|
|
274
|
-
targets: AccessControlTarget[] | null;
|
|
275
|
-
}
|
|
276
|
-
|
|
277
|
-
export interface AccessControlTarget {
|
|
278
|
-
cluster: number | null;
|
|
279
|
-
endpoint: number | null;
|
|
280
|
-
device_type: number | null;
|
|
281
|
-
}
|
|
282
|
-
|
|
283
|
-
/**
|
|
284
|
-
* Binding target structure for set_node_binding command.
|
|
285
|
-
* Matches Python Matter Server's TargetStruct.
|
|
286
|
-
*/
|
|
287
|
-
export interface BindingTarget {
|
|
288
|
-
/** Target node ID */
|
|
289
|
-
node: number | bigint | null;
|
|
290
|
-
/** Target group ID */
|
|
291
|
-
group: number | null;
|
|
292
|
-
/** Target endpoint */
|
|
293
|
-
endpoint: number | null;
|
|
294
|
-
/** Target cluster */
|
|
295
|
-
cluster: number | null;
|
|
296
|
-
}
|
|
297
|
-
|
|
298
|
-
/** Attribute write result for set_acl_entry and set_node_binding responses */
|
|
299
|
-
export interface AttributeWriteResult {
|
|
300
|
-
path: {
|
|
301
|
-
endpoint_id: number;
|
|
302
|
-
cluster_id: number;
|
|
303
|
-
attribute_id: number;
|
|
304
|
-
};
|
|
305
|
-
status: number;
|
|
306
|
-
}
|
|
307
|
-
|
|
308
|
-
export interface ServerInfoMessage {
|
|
309
|
-
fabric_id: bigint; // not number
|
|
310
|
-
compressed_fabric_id: bigint; // not number
|
|
311
|
-
fabric_index: number;
|
|
312
|
-
schema_version: number;
|
|
313
|
-
min_supported_schema_version: number;
|
|
314
|
-
sdk_version: string;
|
|
315
|
-
wifi_credentials_set: boolean;
|
|
316
|
-
thread_credentials_set: boolean;
|
|
317
|
-
bluetooth_enabled: boolean;
|
|
318
|
-
}
|
|
319
|
-
|
|
320
|
-
/**
|
|
321
|
-
* Matter node event structure for node_event WebSocket event.
|
|
322
|
-
* Matches Python Matter Server's MatterNodeEvent.
|
|
323
|
-
*/
|
|
324
|
-
export interface MatterNodeEvent {
|
|
325
|
-
node_id: number | bigint;
|
|
326
|
-
endpoint_id: number;
|
|
327
|
-
cluster_id: number;
|
|
328
|
-
event_id: number;
|
|
329
|
-
event_number: number | bigint;
|
|
330
|
-
priority: number; // 0=Debug, 1=Info, 2=Critical
|
|
331
|
-
timestamp: number | bigint;
|
|
332
|
-
timestamp_type: number; // 0=System, 1=Epoch, 2=POSIX
|
|
333
|
-
data: unknown | null;
|
|
334
|
-
}
|
|
335
|
-
|
|
336
|
-
interface APIEvents {
|
|
337
|
-
node_added: {
|
|
338
|
-
data: MatterNode;
|
|
339
|
-
};
|
|
340
|
-
node_updated: {
|
|
341
|
-
data: MatterNode;
|
|
342
|
-
};
|
|
343
|
-
node_removed: {
|
|
344
|
-
data: number | bigint;
|
|
345
|
-
};
|
|
346
|
-
node_event: {
|
|
347
|
-
data: MatterNodeEvent;
|
|
348
|
-
};
|
|
349
|
-
attribute_updated: {
|
|
350
|
-
data: [node_id: number | bigint, attribute_path: string, value: unknown];
|
|
351
|
-
};
|
|
352
|
-
server_shutdown: {
|
|
353
|
-
data: Record<string, never>;
|
|
354
|
-
};
|
|
355
|
-
endpoint_added: {
|
|
356
|
-
data: { node_id: number | bigint; endpoint_id: number };
|
|
357
|
-
};
|
|
358
|
-
endpoint_removed: {
|
|
359
|
-
data: { node_id: number | bigint; endpoint_id: number };
|
|
360
|
-
};
|
|
361
|
-
server_info_updated: {
|
|
362
|
-
data: ServerInfoMessage;
|
|
363
|
-
};
|
|
364
|
-
}
|
|
365
|
-
|
|
366
|
-
export type EventMessage<E extends keyof APIEvents> = {
|
|
367
|
-
event: E;
|
|
368
|
-
data: APIEvents[E]["data"];
|
|
369
|
-
};
|
|
370
|
-
export type EventTypes = keyof APIEvents;
|
|
371
|
-
|
|
372
|
-
export interface WebSocketConfig {
|
|
373
|
-
host: string;
|
|
374
|
-
port: string;
|
|
375
|
-
scheme: string;
|
|
376
|
-
path: string;
|
|
377
|
-
}
|
|
378
|
-
|
|
379
|
-
export enum UpdateSource {
|
|
380
|
-
MAIN_NET_DCL = "main-net-dcl",
|
|
381
|
-
TEST_NET_DCL = "test-net-dcl",
|
|
382
|
-
LOCAL = "local",
|
|
383
|
-
}
|
|
384
|
-
|
|
385
|
-
export interface MatterSoftwareVersion {
|
|
386
|
-
vid: number;
|
|
387
|
-
pid: number;
|
|
388
|
-
software_version: number;
|
|
389
|
-
software_version_string: string;
|
|
390
|
-
firmware_information?: string;
|
|
391
|
-
min_applicable_software_version: number;
|
|
392
|
-
max_applicable_software_version: number;
|
|
393
|
-
release_notes_url?: string;
|
|
394
|
-
update_source: UpdateSource;
|
|
395
|
-
}
|
|
396
|
-
|
|
397
|
-
export interface CommissioningParameters {
|
|
398
|
-
setup_pin_code: number;
|
|
399
|
-
setup_manual_code: string;
|
|
400
|
-
setup_qr_code: string;
|
|
401
|
-
}
|
|
402
|
-
|
|
403
|
-
export interface CommissionableNodeData {
|
|
404
|
-
instance_name?: string;
|
|
405
|
-
host_name?: string;
|
|
406
|
-
port?: number;
|
|
407
|
-
long_discriminator?: number;
|
|
408
|
-
vendor_id?: number;
|
|
409
|
-
product_id?: number;
|
|
410
|
-
commissioning_mode?: number;
|
|
411
|
-
device_type?: number;
|
|
412
|
-
device_name?: string;
|
|
413
|
-
pairing_instruction?: string;
|
|
414
|
-
pairing_hint?: number;
|
|
415
|
-
mrp_retry_interval_idle?: number;
|
|
416
|
-
mrp_retry_interval_active?: number;
|
|
417
|
-
supports_tcp?: boolean;
|
|
418
|
-
addresses?: string[];
|
|
419
|
-
rotating_id?: string;
|
|
420
|
-
}
|
|
421
|
-
|
|
422
|
-
export interface MatterFabricData {
|
|
423
|
-
fabric_id?: number | bigint;
|
|
424
|
-
vendor_id?: number;
|
|
425
|
-
fabric_index?: number;
|
|
426
|
-
fabric_label?: string;
|
|
427
|
-
vendor_name?: string;
|
|
428
|
-
}
|
|
429
|
-
|
|
430
|
-
export type NotificationType = "success" | "info" | "warning" | "error";
|
|
431
|
-
export type NodePingResult = Record<string, boolean>;
|
|
432
|
-
|
|
433
7
|
/**
|
|
434
|
-
* WebSocket
|
|
8
|
+
* WebSocket protocol types.
|
|
9
|
+
*
|
|
10
|
+
* Canonical type definitions live in @matter-server/ws-client.
|
|
11
|
+
* This module re-exports them for backward compatibility and adds server-only types.
|
|
435
12
|
*/
|
|
436
|
-
export interface CommandMessage {
|
|
437
|
-
message_id: string;
|
|
438
|
-
command: keyof APICommands;
|
|
439
|
-
args?: APICommands[keyof APICommands]["requestArgs"];
|
|
440
|
-
}
|
|
441
|
-
|
|
442
|
-
/** WebSocket Result Message base fields type */
|
|
443
|
-
interface ResultMessageBase {
|
|
444
|
-
message_id: string;
|
|
445
|
-
}
|
|
446
|
-
|
|
447
|
-
/** WebSocket Error Result Message type */
|
|
448
|
-
export interface ErrorResultMessage extends ResultMessageBase {
|
|
449
|
-
error_code: number;
|
|
450
|
-
details?: string;
|
|
451
|
-
}
|
|
452
|
-
|
|
453
|
-
/** WebSocket Success Result Message type */
|
|
454
|
-
export interface SuccessResultMessage<T extends keyof APICommands> extends ResultMessageBase {
|
|
455
|
-
result: APICommands[T]["response"];
|
|
456
|
-
}
|
|
457
13
|
|
|
458
|
-
export
|
|
459
|
-
export
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
14
|
+
// Re-export all shared protocol types from ws-client
|
|
15
|
+
export {
|
|
16
|
+
type AccessControlEntry,
|
|
17
|
+
type AccessControlTarget,
|
|
18
|
+
type APICommands,
|
|
19
|
+
type APIEvents,
|
|
20
|
+
type ArgsOf,
|
|
21
|
+
type AttributesData,
|
|
22
|
+
type AttributeWriteResult,
|
|
23
|
+
type BindingTarget,
|
|
24
|
+
type CommandMessage,
|
|
25
|
+
type CommissionableNodeData,
|
|
26
|
+
type CommissioningParameters,
|
|
27
|
+
type ErrorResultMessage,
|
|
28
|
+
type EventMessage,
|
|
29
|
+
type EventTypes,
|
|
30
|
+
type LogLevelResponse,
|
|
31
|
+
type LogLevelString,
|
|
32
|
+
type MatterFabricData,
|
|
33
|
+
type MatterNodeEvent,
|
|
34
|
+
type NodePingResult,
|
|
35
|
+
type NotificationType,
|
|
36
|
+
type ResponseOf,
|
|
37
|
+
type ResultMessageBase,
|
|
38
|
+
type ServerInfoMessage,
|
|
39
|
+
type SuccessResultMessage,
|
|
40
|
+
type MatterSoftwareVersion,
|
|
41
|
+
type WebSocketConfig,
|
|
42
|
+
TEST_NODE_START,
|
|
43
|
+
UpdateSource,
|
|
44
|
+
} from "@matter-server/ws-client";
|
|
45
|
+
|
|
46
|
+
// Re-export MatterNodeData as MatterNode for backward compatibility within ws-controller
|
|
47
|
+
export type { MatterNodeData as MatterNode } from "@matter-server/ws-client";
|
|
466
48
|
|
|
467
49
|
/**
|
|
468
50
|
* Error codes matching Python Matter Server for API compatibility.
|