@matter-server/ws-client 0.2.7-alpha.0-20260118-45c7af0 → 0.2.7-alpha.0-20260119-49e7237
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/README.md +90 -0
- package/dist/esm/client.d.ts +57 -27
- package/dist/esm/client.d.ts.map +1 -1
- package/dist/esm/client.js +215 -110
- package/dist/esm/client.js.map +1 -1
- package/dist/esm/exceptions.d.ts +14 -0
- package/dist/esm/exceptions.d.ts.map +1 -1
- package/dist/esm/exceptions.js +16 -0
- package/dist/esm/exceptions.js.map +1 -1
- package/dist/esm/models/model.d.ts +12 -0
- package/dist/esm/models/model.d.ts.map +1 -1
- package/dist/esm/models/model.js +8 -1
- package/dist/esm/models/model.js.map +1 -1
- package/package.json +1 -1
- package/src/client.ts +250 -104
- package/src/exceptions.ts +23 -0
- package/src/models/model.ts +17 -0
package/README.md
CHANGED
|
@@ -85,6 +85,7 @@ new MatterClient(url: string, wsFactory?: WebSocketFactory)
|
|
|
85
85
|
- `serverInfo`: Server information (fabric ID, SDK version, etc.)
|
|
86
86
|
- `serverBaseAddress`: The base address extracted from the URL
|
|
87
87
|
- `isProduction`: Whether connected to a production server (for UI purposes)
|
|
88
|
+
- `commandTimeout`: Default timeout for commands in milliseconds (default: 5 minutes). Set to `0` to disable timeouts.
|
|
88
89
|
|
|
89
90
|
#### Methods
|
|
90
91
|
|
|
@@ -114,6 +115,90 @@ new MatterClient(url: string, wsFactory?: WebSocketFactory)
|
|
|
114
115
|
- `server_info_updated`: Fired when server info changes
|
|
115
116
|
- `connection_lost`: Fired when connection is lost
|
|
116
117
|
|
|
118
|
+
### Server Info
|
|
119
|
+
|
|
120
|
+
The `serverInfo` property contains information about the connected Matter server:
|
|
121
|
+
|
|
122
|
+
```typescript
|
|
123
|
+
interface ServerInfoMessage {
|
|
124
|
+
fabric_id: bigint; // The fabric ID
|
|
125
|
+
compressed_fabric_id: bigint; // Compressed fabric ID (global ID)
|
|
126
|
+
fabric_index?: number; // The fabric index (OHF Matter Server only)
|
|
127
|
+
schema_version: number; // API schema version
|
|
128
|
+
min_supported_schema_version: number;
|
|
129
|
+
sdk_version: string; // Server SDK version string
|
|
130
|
+
wifi_credentials_set: boolean; // Whether WiFi credentials are configured
|
|
131
|
+
thread_credentials_set: boolean; // Whether Thread dataset is configured
|
|
132
|
+
bluetooth_enabled: boolean; // Whether BLE commissioning is available
|
|
133
|
+
}
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
**Note:** The `fabric_index` field is specific to OHF Matter Server and is not available in Python Matter Server. When connecting to Python Matter Server, this field will be undefined.
|
|
137
|
+
|
|
138
|
+
### Command Timeouts
|
|
139
|
+
|
|
140
|
+
All commands have a default timeout of 5 minutes (300,000ms) to prevent promises from hanging indefinitely if the server doesn't respond. You can configure this behavior globally or per-call:
|
|
141
|
+
|
|
142
|
+
```typescript
|
|
143
|
+
import { MatterClient, CommandTimeoutError, DEFAULT_COMMAND_TIMEOUT } from "@matter-server/ws-client";
|
|
144
|
+
|
|
145
|
+
const client = new MatterClient("ws://localhost:5580/ws");
|
|
146
|
+
|
|
147
|
+
// Check the default timeout (5 minutes)
|
|
148
|
+
console.log(DEFAULT_COMMAND_TIMEOUT); // 300000
|
|
149
|
+
|
|
150
|
+
// Change the default timeout for all commands (e.g., 1 minute)
|
|
151
|
+
client.commandTimeout = 60000;
|
|
152
|
+
|
|
153
|
+
// Disable timeouts entirely (not recommended)
|
|
154
|
+
client.commandTimeout = 0;
|
|
155
|
+
|
|
156
|
+
// Override timeout for a specific call (e.g., 30 seconds for a quick command)
|
|
157
|
+
await client.deviceCommand(nodeId, 1, 6, "toggle", {}, 30000);
|
|
158
|
+
|
|
159
|
+
// Use a longer timeout for operations that take time (e.g., 10 minutes for commissioning)
|
|
160
|
+
await client.commissionWithCode("MT:Y3.5UNQO100KA0648G00", false, 600000);
|
|
161
|
+
|
|
162
|
+
// Handle timeout errors
|
|
163
|
+
try {
|
|
164
|
+
await client.deviceCommand(nodeId, 1, 6, "toggle");
|
|
165
|
+
} catch (err) {
|
|
166
|
+
if (err instanceof CommandTimeoutError) {
|
|
167
|
+
console.log(`Command '${err.command}' timed out after ${err.timeoutMs}ms`);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
All client methods accept an optional `timeout` parameter as their last argument to override the default timeout for that specific call.
|
|
173
|
+
|
|
174
|
+
### Connection Handling
|
|
175
|
+
|
|
176
|
+
When the WebSocket connection is closed (either by calling `disconnect()` or due to connection loss), all pending commands are automatically rejected with a `ConnectionClosedError`:
|
|
177
|
+
|
|
178
|
+
```typescript
|
|
179
|
+
import { MatterClient, ConnectionClosedError } from "@matter-server/ws-client";
|
|
180
|
+
|
|
181
|
+
const client = new MatterClient("ws://localhost:5580/ws");
|
|
182
|
+
await client.connect();
|
|
183
|
+
|
|
184
|
+
// Start a long-running command
|
|
185
|
+
const commandPromise = client.commissionWithCode("MT:Y3.5UNQO100KA0648G00", false);
|
|
186
|
+
|
|
187
|
+
// If the connection is lost or disconnected while the command is pending:
|
|
188
|
+
try {
|
|
189
|
+
await commandPromise;
|
|
190
|
+
} catch (err) {
|
|
191
|
+
if (err instanceof ConnectionClosedError) {
|
|
192
|
+
console.log("Connection was closed while command was pending");
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
// Listen for connection loss events
|
|
197
|
+
client.addEventListener("connection_lost", () => {
|
|
198
|
+
console.log("Connection to server was lost");
|
|
199
|
+
});
|
|
200
|
+
```
|
|
201
|
+
|
|
117
202
|
### Other Exports
|
|
118
203
|
|
|
119
204
|
```typescript
|
|
@@ -126,6 +211,11 @@ import {
|
|
|
126
211
|
// Exceptions
|
|
127
212
|
MatterError,
|
|
128
213
|
InvalidServerVersion,
|
|
214
|
+
CommandTimeoutError,
|
|
215
|
+
ConnectionClosedError,
|
|
216
|
+
|
|
217
|
+
// Constants
|
|
218
|
+
DEFAULT_COMMAND_TIMEOUT,
|
|
129
219
|
|
|
130
220
|
// Types
|
|
131
221
|
ServerInfoMessage,
|
package/dist/esm/client.d.ts
CHANGED
|
@@ -6,6 +6,8 @@
|
|
|
6
6
|
import { Connection, WebSocketFactory } from "./connection.js";
|
|
7
7
|
import { AccessControlEntry, APICommands, BindingTarget, CommissionableNodeData, CommissioningParameters, EventMessage, LogLevelResponse, LogLevelString, MatterFabricData, MatterSoftwareVersion, NodePingResult } from "./models/model.js";
|
|
8
8
|
import { MatterNode } from "./models/node.js";
|
|
9
|
+
/** Default timeout for WebSocket commands in milliseconds (5 minutes) */
|
|
10
|
+
export declare const DEFAULT_COMMAND_TIMEOUT: number;
|
|
9
11
|
export declare class MatterClient {
|
|
10
12
|
url: string;
|
|
11
13
|
connection: Connection;
|
|
@@ -13,6 +15,8 @@ export declare class MatterClient {
|
|
|
13
15
|
serverBaseAddress: string;
|
|
14
16
|
/** Whether this client is connected to a production server (optional, for UI purposes) */
|
|
15
17
|
isProduction: boolean;
|
|
18
|
+
/** Default timeout for commands in milliseconds. Set to 0 to disable timeouts. */
|
|
19
|
+
commandTimeout: number;
|
|
16
20
|
private result_futures;
|
|
17
21
|
private msgId;
|
|
18
22
|
private eventListeners;
|
|
@@ -26,44 +30,70 @@ export declare class MatterClient {
|
|
|
26
30
|
constructor(url: string, wsFactory?: WebSocketFactory);
|
|
27
31
|
get serverInfo(): import("./models/model.js").ServerInfoMessage;
|
|
28
32
|
addEventListener(event: string, listener: () => void): () => void;
|
|
29
|
-
commissionWithCode(code: string, networkOnly?: boolean): Promise<MatterNode>;
|
|
30
|
-
setWifiCredentials(ssid: string, credentials: string): Promise<void>;
|
|
31
|
-
setThreadOperationalDataset(dataset: string): Promise<void>;
|
|
32
|
-
openCommissioningWindow(nodeId: number | bigint,
|
|
33
|
-
discoverCommissionableNodes(): Promise<CommissionableNodeData[]>;
|
|
34
|
-
getMatterFabrics(nodeId: number | bigint): Promise<MatterFabricData[]>;
|
|
35
|
-
removeMatterFabric(nodeId: number | bigint, fabricIndex: number): Promise<void>;
|
|
36
|
-
pingNode(nodeId: number | bigint, attempts?: number): Promise<NodePingResult>;
|
|
37
|
-
getNodeIPAddresses(nodeId: number | bigint, preferCache?: boolean, scoped?: boolean): Promise<string[]>;
|
|
38
|
-
removeNode(nodeId: number | bigint): Promise<void>;
|
|
39
|
-
interviewNode(nodeId: number | bigint): Promise<void>;
|
|
40
|
-
importTestNode(dump: string): Promise<void>;
|
|
41
|
-
readAttribute(nodeId: number | bigint, attributePath: string | string[]): Promise<Record<string, unknown>>;
|
|
42
|
-
writeAttribute(nodeId: number | bigint, attributePath: string, value: unknown): Promise<unknown>;
|
|
43
|
-
checkNodeUpdate(nodeId: number | bigint): Promise<MatterSoftwareVersion | null>;
|
|
44
|
-
updateNode(nodeId: number | bigint, softwareVersion: number | string): Promise<void>;
|
|
45
|
-
setACLEntry(nodeId: number | bigint, entry: AccessControlEntry[]): Promise<import("./models/model.js").AttributeWriteResult[] | null>;
|
|
46
|
-
setNodeBinding(nodeId: number | bigint, endpoint: number, bindings: BindingTarget[]): Promise<import("./models/model.js").AttributeWriteResult[] | null>;
|
|
47
|
-
deviceCommand(nodeId: number | bigint, endpointId: number, clusterId: number, commandName: string, payload?: Record<string, unknown
|
|
48
|
-
getNodes(onlyAvailable?: boolean): Promise<MatterNode[]>;
|
|
49
|
-
getNode(nodeId: number | bigint): Promise<MatterNode>;
|
|
50
|
-
getVendorNames(filterVendors?: number[]): Promise<Record<string, string>>;
|
|
51
|
-
fetchServerInfo(): Promise<import("./models/model.js").ServerInfoMessage>;
|
|
52
|
-
setDefaultFabricLabel(label: string | null): Promise<void>;
|
|
33
|
+
commissionWithCode(code: string, networkOnly?: boolean, timeout?: number): Promise<MatterNode>;
|
|
34
|
+
setWifiCredentials(ssid: string, credentials: string, timeout?: number): Promise<void>;
|
|
35
|
+
setThreadOperationalDataset(dataset: string, timeout?: number): Promise<void>;
|
|
36
|
+
openCommissioningWindow(nodeId: number | bigint, windowTimeout?: number, iteration?: number, option?: number, discriminator?: number, timeout?: number): Promise<CommissioningParameters>;
|
|
37
|
+
discoverCommissionableNodes(timeout?: number): Promise<CommissionableNodeData[]>;
|
|
38
|
+
getMatterFabrics(nodeId: number | bigint, timeout?: number): Promise<MatterFabricData[]>;
|
|
39
|
+
removeMatterFabric(nodeId: number | bigint, fabricIndex: number, timeout?: number): Promise<void>;
|
|
40
|
+
pingNode(nodeId: number | bigint, attempts?: number, timeout?: number): Promise<NodePingResult>;
|
|
41
|
+
getNodeIPAddresses(nodeId: number | bigint, preferCache?: boolean, scoped?: boolean, timeout?: number): Promise<string[]>;
|
|
42
|
+
removeNode(nodeId: number | bigint, timeout?: number): Promise<void>;
|
|
43
|
+
interviewNode(nodeId: number | bigint, timeout?: number): Promise<void>;
|
|
44
|
+
importTestNode(dump: string, timeout?: number): Promise<void>;
|
|
45
|
+
readAttribute(nodeId: number | bigint, attributePath: string | string[], timeout?: number): Promise<Record<string, unknown>>;
|
|
46
|
+
writeAttribute(nodeId: number | bigint, attributePath: string, value: unknown, timeout?: number): Promise<unknown>;
|
|
47
|
+
checkNodeUpdate(nodeId: number | bigint, timeout?: number): Promise<MatterSoftwareVersion | null>;
|
|
48
|
+
updateNode(nodeId: number | bigint, softwareVersion: number | string, timeout?: number): Promise<void>;
|
|
49
|
+
setACLEntry(nodeId: number | bigint, entry: AccessControlEntry[], timeout?: number): Promise<import("./models/model.js").AttributeWriteResult[] | null>;
|
|
50
|
+
setNodeBinding(nodeId: number | bigint, endpoint: number, bindings: BindingTarget[], timeout?: number): Promise<import("./models/model.js").AttributeWriteResult[] | null>;
|
|
51
|
+
deviceCommand(nodeId: number | bigint, endpointId: number, clusterId: number, commandName: string, payload?: Record<string, unknown>, timeout?: number): Promise<unknown>;
|
|
52
|
+
getNodes(onlyAvailable?: boolean, timeout?: number): Promise<MatterNode[]>;
|
|
53
|
+
getNode(nodeId: number | bigint, timeout?: number): Promise<MatterNode>;
|
|
54
|
+
getVendorNames(filterVendors?: number[], timeout?: number): Promise<Record<string, string>>;
|
|
55
|
+
fetchServerInfo(timeout?: number): Promise<import("./models/model.js").ServerInfoMessage>;
|
|
56
|
+
setDefaultFabricLabel(label: string | null, timeout?: number): Promise<void>;
|
|
53
57
|
/**
|
|
54
58
|
* Get the current log levels for console and file logging.
|
|
59
|
+
* @param timeout Optional command timeout in milliseconds
|
|
55
60
|
* @returns The current log level configuration
|
|
56
61
|
*/
|
|
57
|
-
getLogLevel(): Promise<LogLevelResponse>;
|
|
62
|
+
getLogLevel(timeout?: number): Promise<LogLevelResponse>;
|
|
58
63
|
/**
|
|
59
64
|
* Set the log level for console and/or file logging.
|
|
60
65
|
* Changes are temporary and will be reset when the server restarts.
|
|
61
66
|
* @param consoleLoglevel Console log level to set (optional)
|
|
62
67
|
* @param fileLoglevel File log level to set, only applied if file logging is enabled (optional)
|
|
68
|
+
* @param timeout Optional command timeout in milliseconds
|
|
63
69
|
* @returns The log level configuration after the change
|
|
64
70
|
*/
|
|
65
|
-
setLogLevel(consoleLoglevel?: LogLevelString, fileLoglevel?: LogLevelString): Promise<LogLevelResponse>;
|
|
66
|
-
|
|
71
|
+
setLogLevel(consoleLoglevel?: LogLevelString, fileLoglevel?: LogLevelString, timeout?: number): Promise<LogLevelResponse>;
|
|
72
|
+
/**
|
|
73
|
+
* Send a command to the Matter server.
|
|
74
|
+
* @param command The command name
|
|
75
|
+
* @param require_schema Minimum schema version required (0 for any version)
|
|
76
|
+
* @param args Command arguments
|
|
77
|
+
* @param timeout Optional timeout in milliseconds. Defaults to `commandTimeout`. Set to 0 to disable.
|
|
78
|
+
* @returns Promise that resolves with the command result
|
|
79
|
+
* @throws Error if the command times out or fails
|
|
80
|
+
*/
|
|
81
|
+
sendCommand<T extends keyof APICommands>(command: T, require_schema: number | undefined, args: APICommands[T]["requestArgs"], timeout?: number): Promise<APICommands[T]["response"]>;
|
|
82
|
+
/**
|
|
83
|
+
* Safely resolve a pending command, ensuring it's only resolved once.
|
|
84
|
+
* Clears timeout and removes from pending futures before resolving.
|
|
85
|
+
*/
|
|
86
|
+
private _resolvePendingCommand;
|
|
87
|
+
/**
|
|
88
|
+
* Safely reject a pending command, ensuring it's only rejected once.
|
|
89
|
+
* Clears timeout and removes from pending futures before rejecting.
|
|
90
|
+
*/
|
|
91
|
+
private _rejectPendingCommand;
|
|
92
|
+
/**
|
|
93
|
+
* Reject all pending commands with a ConnectionClosedError.
|
|
94
|
+
* Called when the connection is closed or lost.
|
|
95
|
+
*/
|
|
96
|
+
private _rejectAllPendingCommands;
|
|
67
97
|
connect(): Promise<void>;
|
|
68
98
|
disconnect(clearStorage?: boolean): void;
|
|
69
99
|
startListening(): Promise<void>;
|
package/dist/esm/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/client.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAE/D,OAAO,EACH,kBAAkB,EAClB,WAAW,EACX,aAAa,EACb,sBAAsB,EACtB,uBAAuB,EAEvB,YAAY,EACZ,gBAAgB,EAChB,cAAc,EACd,gBAAgB,EAChB,qBAAqB,EACrB,cAAc,EAEjB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAU9C,qBAAa,YAAY;
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/client.ts"],"names":[],"mappings":"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"}
|