@matter-server/ws-client 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 +165 -0
- package/dist/esm/client.d.ts +67 -0
- package/dist/esm/client.d.ts.map +1 -0
- package/dist/esm/client.js +286 -0
- package/dist/esm/client.js.map +6 -0
- package/dist/esm/connection.d.ts +40 -0
- package/dist/esm/connection.d.ts.map +1 -0
- package/dist/esm/connection.js +75 -0
- package/dist/esm/connection.js.map +6 -0
- package/dist/esm/exceptions.d.ts +10 -0
- package/dist/esm/exceptions.d.ts.map +1 -0
- package/dist/esm/exceptions.js +14 -0
- package/dist/esm/exceptions.js.map +6 -0
- package/dist/esm/index.d.ts +15 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +12 -0
- package/dist/esm/index.js.map +6 -0
- package/dist/esm/json-utils.d.ts +19 -0
- package/dist/esm/json-utils.d.ts.map +1 -0
- package/dist/esm/json-utils.js +50 -0
- package/dist/esm/json-utils.js.map +6 -0
- package/dist/esm/models/model.d.ts +379 -0
- package/dist/esm/models/model.d.ts.map +1 -0
- package/dist/esm/models/model.js +15 -0
- package/dist/esm/models/model.js.map +6 -0
- package/dist/esm/models/node.d.ts +40 -0
- package/dist/esm/models/node.d.ts.map +1 -0
- package/dist/esm/models/node.js +59 -0
- package/dist/esm/models/node.js.map +6 -0
- package/dist/esm/package.json +3 -0
- package/package.json +38 -0
- package/src/client.ts +405 -0
- package/src/connection.ts +103 -0
- package/src/exceptions.ts +9 -0
- package/src/index.ts +25 -0
- package/src/json-utils.ts +75 -0
- package/src/models/model.ts +344 -0
- package/src/models/node.ts +75 -0
- package/src/tsconfig.json +7 -0
|
@@ -0,0 +1,286 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025-2026 Open Home Foundation
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import { Connection } from "./connection.js";
|
|
7
|
+
import { InvalidServerVersion } from "./exceptions.js";
|
|
8
|
+
import { MatterNode } from "./models/node.js";
|
|
9
|
+
function toNodeKey(nodeId) {
|
|
10
|
+
return String(nodeId);
|
|
11
|
+
}
|
|
12
|
+
class MatterClient {
|
|
13
|
+
/**
|
|
14
|
+
* Create a new MatterClient.
|
|
15
|
+
* @param url WebSocket URL to connect to
|
|
16
|
+
* @param wsFactory Optional factory function to create WebSocket instances.
|
|
17
|
+
* For Node.js, pass: (url) => new WebSocket(url) from the 'ws' package.
|
|
18
|
+
* For browser, leave undefined to use native WebSocket.
|
|
19
|
+
*/
|
|
20
|
+
constructor(url, wsFactory) {
|
|
21
|
+
this.url = url;
|
|
22
|
+
this.url = url;
|
|
23
|
+
this.connection = new Connection(this.url, wsFactory);
|
|
24
|
+
this.serverBaseAddress = this.url.split("://")[1].split(":")[0] || "";
|
|
25
|
+
}
|
|
26
|
+
connection;
|
|
27
|
+
nodes = {};
|
|
28
|
+
serverBaseAddress;
|
|
29
|
+
/** Whether this client is connected to a production server (optional, for UI purposes) */
|
|
30
|
+
isProduction = false;
|
|
31
|
+
// Using 'unknown' for resolve since the actual types vary by command
|
|
32
|
+
result_futures = {};
|
|
33
|
+
msgId = 0;
|
|
34
|
+
eventListeners = {};
|
|
35
|
+
get serverInfo() {
|
|
36
|
+
return this.connection.serverInfo;
|
|
37
|
+
}
|
|
38
|
+
addEventListener(event, listener) {
|
|
39
|
+
if (!this.eventListeners[event]) {
|
|
40
|
+
this.eventListeners[event] = [];
|
|
41
|
+
}
|
|
42
|
+
this.eventListeners[event].push(listener);
|
|
43
|
+
return () => {
|
|
44
|
+
this.eventListeners[event] = this.eventListeners[event].filter((l) => l !== listener);
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
async commissionWithCode(code, networkOnly = true) {
|
|
48
|
+
return await this.sendCommand("commission_with_code", 0, {
|
|
49
|
+
code,
|
|
50
|
+
network_only: networkOnly
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
async setWifiCredentials(ssid, credentials) {
|
|
54
|
+
await this.sendCommand("set_wifi_credentials", 0, { ssid, credentials });
|
|
55
|
+
}
|
|
56
|
+
async setThreadOperationalDataset(dataset) {
|
|
57
|
+
await this.sendCommand("set_thread_dataset", 0, { dataset });
|
|
58
|
+
}
|
|
59
|
+
async openCommissioningWindow(nodeId, timeout, iteration, option, discriminator) {
|
|
60
|
+
return await this.sendCommand("open_commissioning_window", 0, {
|
|
61
|
+
node_id: nodeId,
|
|
62
|
+
timeout,
|
|
63
|
+
iteration,
|
|
64
|
+
option,
|
|
65
|
+
discriminator
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
async discoverCommissionableNodes() {
|
|
69
|
+
return await this.sendCommand("discover_commissionable_nodes", 0, {});
|
|
70
|
+
}
|
|
71
|
+
async getMatterFabrics(nodeId) {
|
|
72
|
+
return await this.sendCommand("get_matter_fabrics", 3, { node_id: nodeId });
|
|
73
|
+
}
|
|
74
|
+
async removeMatterFabric(nodeId, fabricIndex) {
|
|
75
|
+
await this.sendCommand("remove_matter_fabric", 3, { node_id: nodeId, fabric_index: fabricIndex });
|
|
76
|
+
}
|
|
77
|
+
async pingNode(nodeId, attempts = 1) {
|
|
78
|
+
return await this.sendCommand("ping_node", 0, { node_id: nodeId, attempts });
|
|
79
|
+
}
|
|
80
|
+
async getNodeIPAddresses(nodeId, preferCache, scoped) {
|
|
81
|
+
return await this.sendCommand("get_node_ip_addresses", 8, {
|
|
82
|
+
node_id: nodeId,
|
|
83
|
+
prefer_cache: preferCache,
|
|
84
|
+
scoped
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
async removeNode(nodeId) {
|
|
88
|
+
await this.sendCommand("remove_node", 0, { node_id: nodeId });
|
|
89
|
+
}
|
|
90
|
+
async interviewNode(nodeId) {
|
|
91
|
+
await this.sendCommand("interview_node", 0, { node_id: nodeId });
|
|
92
|
+
}
|
|
93
|
+
async importTestNode(dump) {
|
|
94
|
+
await this.sendCommand("import_test_node", 0, { dump });
|
|
95
|
+
}
|
|
96
|
+
async readAttribute(nodeId, attributePath) {
|
|
97
|
+
return await this.sendCommand("read_attribute", 0, { node_id: nodeId, attribute_path: attributePath });
|
|
98
|
+
}
|
|
99
|
+
async writeAttribute(nodeId, attributePath, value) {
|
|
100
|
+
return await this.sendCommand("write_attribute", 0, {
|
|
101
|
+
node_id: nodeId,
|
|
102
|
+
attribute_path: attributePath,
|
|
103
|
+
value
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
async checkNodeUpdate(nodeId) {
|
|
107
|
+
return await this.sendCommand("check_node_update", 10, { node_id: nodeId });
|
|
108
|
+
}
|
|
109
|
+
async updateNode(nodeId, softwareVersion) {
|
|
110
|
+
await this.sendCommand("update_node", 10, { node_id: nodeId, software_version: softwareVersion });
|
|
111
|
+
}
|
|
112
|
+
async setACLEntry(nodeId, entry) {
|
|
113
|
+
return await this.sendCommand("set_acl_entry", 0, {
|
|
114
|
+
node_id: nodeId,
|
|
115
|
+
entry
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
async setNodeBinding(nodeId, endpoint, bindings) {
|
|
119
|
+
return await this.sendCommand("set_node_binding", 0, {
|
|
120
|
+
node_id: nodeId,
|
|
121
|
+
endpoint,
|
|
122
|
+
bindings
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
async deviceCommand(nodeId, endpointId, clusterId, commandName, payload = {}) {
|
|
126
|
+
return await this.sendCommand("device_command", 0, {
|
|
127
|
+
node_id: nodeId,
|
|
128
|
+
endpoint_id: endpointId,
|
|
129
|
+
cluster_id: clusterId,
|
|
130
|
+
command_name: commandName,
|
|
131
|
+
payload,
|
|
132
|
+
response_type: null
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
async getNodes(onlyAvailable = false) {
|
|
136
|
+
return await this.sendCommand("get_nodes", 0, { only_available: onlyAvailable });
|
|
137
|
+
}
|
|
138
|
+
async getNode(nodeId) {
|
|
139
|
+
return await this.sendCommand("get_node", 0, { node_id: nodeId });
|
|
140
|
+
}
|
|
141
|
+
async getVendorNames(filterVendors) {
|
|
142
|
+
return await this.sendCommand("get_vendor_names", 0, { filter_vendors: filterVendors });
|
|
143
|
+
}
|
|
144
|
+
async fetchServerInfo() {
|
|
145
|
+
return await this.sendCommand("server_info", 0, {});
|
|
146
|
+
}
|
|
147
|
+
async setDefaultFabricLabel(label) {
|
|
148
|
+
await this.sendCommand("set_default_fabric_label", 0, { label });
|
|
149
|
+
}
|
|
150
|
+
sendCommand(command, require_schema = void 0, args) {
|
|
151
|
+
if (require_schema && this.serverInfo.schema_version < require_schema) {
|
|
152
|
+
throw new InvalidServerVersion(
|
|
153
|
+
`Command not available due to incompatible server version. Update the Matter Server to a version that supports at least api schema ${require_schema}.`
|
|
154
|
+
);
|
|
155
|
+
}
|
|
156
|
+
const messageId = ++this.msgId;
|
|
157
|
+
const message = {
|
|
158
|
+
message_id: messageId.toString(),
|
|
159
|
+
command,
|
|
160
|
+
args
|
|
161
|
+
};
|
|
162
|
+
const messagePromise = new Promise((resolve, reject) => {
|
|
163
|
+
this.result_futures[messageId] = {
|
|
164
|
+
resolve,
|
|
165
|
+
reject
|
|
166
|
+
};
|
|
167
|
+
this.connection.sendMessage(message);
|
|
168
|
+
});
|
|
169
|
+
return messagePromise.finally(() => {
|
|
170
|
+
delete this.result_futures[messageId];
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
async connect() {
|
|
174
|
+
if (this.connection.connected) {
|
|
175
|
+
return;
|
|
176
|
+
}
|
|
177
|
+
await this.connection.connect(
|
|
178
|
+
(msg) => this._handleIncomingMessage(msg),
|
|
179
|
+
() => this.fireEvent("connection_lost")
|
|
180
|
+
);
|
|
181
|
+
}
|
|
182
|
+
disconnect(clearStorage = false) {
|
|
183
|
+
if (this.connection && this.connection.connected) {
|
|
184
|
+
this.connection.disconnect();
|
|
185
|
+
}
|
|
186
|
+
if (clearStorage && typeof localStorage !== "undefined") {
|
|
187
|
+
localStorage.removeItem("matterURL");
|
|
188
|
+
location.reload();
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
async startListening() {
|
|
192
|
+
await this.connect();
|
|
193
|
+
const nodesArray = await this.sendCommand("start_listening", 0, {});
|
|
194
|
+
const nodes = {};
|
|
195
|
+
for (const node of nodesArray) {
|
|
196
|
+
nodes[toNodeKey(node.node_id)] = new MatterNode(node);
|
|
197
|
+
}
|
|
198
|
+
this.nodes = nodes;
|
|
199
|
+
}
|
|
200
|
+
_handleIncomingMessage(msg) {
|
|
201
|
+
if ("event" in msg) {
|
|
202
|
+
this._handleEventMessage(msg);
|
|
203
|
+
return;
|
|
204
|
+
}
|
|
205
|
+
if ("error_code" in msg) {
|
|
206
|
+
const promise = this.result_futures[msg.message_id];
|
|
207
|
+
if (promise) {
|
|
208
|
+
promise.reject(new Error(msg.details));
|
|
209
|
+
delete this.result_futures[msg.message_id];
|
|
210
|
+
}
|
|
211
|
+
return;
|
|
212
|
+
}
|
|
213
|
+
if ("result" in msg) {
|
|
214
|
+
const promise = this.result_futures[msg.message_id];
|
|
215
|
+
if (promise) {
|
|
216
|
+
promise.resolve(msg.result);
|
|
217
|
+
delete this.result_futures[msg.message_id];
|
|
218
|
+
}
|
|
219
|
+
return;
|
|
220
|
+
}
|
|
221
|
+
console.warn("Received message with unknown format", msg);
|
|
222
|
+
}
|
|
223
|
+
_handleEventMessage(event) {
|
|
224
|
+
console.log("Incoming event", event);
|
|
225
|
+
this.onRawEvent(event);
|
|
226
|
+
if (event.event === "node_added") {
|
|
227
|
+
const node = new MatterNode(event.data);
|
|
228
|
+
this.nodes = { ...this.nodes, [toNodeKey(node.node_id)]: node };
|
|
229
|
+
this.fireEvent("nodes_changed");
|
|
230
|
+
return;
|
|
231
|
+
}
|
|
232
|
+
if (event.event === "node_removed") {
|
|
233
|
+
delete this.nodes[toNodeKey(event.data)];
|
|
234
|
+
this.nodes = { ...this.nodes };
|
|
235
|
+
this.fireEvent("nodes_changed");
|
|
236
|
+
return;
|
|
237
|
+
}
|
|
238
|
+
if (event.event === "node_updated") {
|
|
239
|
+
const node = new MatterNode(event.data);
|
|
240
|
+
this.nodes = { ...this.nodes, [toNodeKey(node.node_id)]: node };
|
|
241
|
+
this.fireEvent("nodes_changed");
|
|
242
|
+
return;
|
|
243
|
+
}
|
|
244
|
+
if (event.event === "attribute_updated") {
|
|
245
|
+
const [nodeId, attributeKey, attributeValue] = event.data;
|
|
246
|
+
const nodeKey = toNodeKey(nodeId);
|
|
247
|
+
const existingNode = this.nodes[nodeKey];
|
|
248
|
+
if (existingNode) {
|
|
249
|
+
const node = new MatterNode(existingNode.data);
|
|
250
|
+
node.attributes[attributeKey] = attributeValue;
|
|
251
|
+
this.nodes = { ...this.nodes, [nodeKey]: node };
|
|
252
|
+
this.fireEvent("nodes_changed");
|
|
253
|
+
}
|
|
254
|
+
return;
|
|
255
|
+
}
|
|
256
|
+
if (event.event === "server_info_updated") {
|
|
257
|
+
this.connection.serverInfo = event.data;
|
|
258
|
+
this.fireEvent("server_info_updated");
|
|
259
|
+
return;
|
|
260
|
+
}
|
|
261
|
+
if (event.event === "server_shutdown") {
|
|
262
|
+
this.fireEvent("server_shutdown");
|
|
263
|
+
this.disconnect();
|
|
264
|
+
return;
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
fireEvent(event) {
|
|
268
|
+
const listeners = this.eventListeners[event];
|
|
269
|
+
if (listeners) {
|
|
270
|
+
for (const listener of listeners) {
|
|
271
|
+
listener();
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
/**
|
|
276
|
+
* Hook for subclasses to receive raw events.
|
|
277
|
+
* Override this method to intercept all incoming events.
|
|
278
|
+
* @param event The raw event message
|
|
279
|
+
*/
|
|
280
|
+
onRawEvent(_event) {
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
export {
|
|
284
|
+
MatterClient
|
|
285
|
+
};
|
|
286
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/client.ts"],
|
|
4
|
+
"mappings": "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",
|
|
5
|
+
"names": []
|
|
6
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025-2026 Open Home Foundation
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import { CommandMessage, ServerInfoMessage } from "./models/model.js";
|
|
7
|
+
/**
|
|
8
|
+
* WebSocket interface that works with both browser WebSocket and Node.js ws library.
|
|
9
|
+
*/
|
|
10
|
+
export interface WebSocketLike {
|
|
11
|
+
readyState: number;
|
|
12
|
+
onopen: ((event: unknown) => void) | null;
|
|
13
|
+
onclose: ((event: unknown) => void) | null;
|
|
14
|
+
onerror: ((event: unknown) => void) | null;
|
|
15
|
+
onmessage: ((event: {
|
|
16
|
+
data: unknown;
|
|
17
|
+
}) => void) | null;
|
|
18
|
+
send(data: string): void;
|
|
19
|
+
close(): void;
|
|
20
|
+
}
|
|
21
|
+
export type WebSocketFactory = (url: string) => WebSocketLike;
|
|
22
|
+
export declare class Connection {
|
|
23
|
+
ws_server_url: string;
|
|
24
|
+
serverInfo?: ServerInfoMessage;
|
|
25
|
+
private socket?;
|
|
26
|
+
private wsFactory;
|
|
27
|
+
/**
|
|
28
|
+
* Create a new connection.
|
|
29
|
+
* @param ws_server_url WebSocket server URL
|
|
30
|
+
* @param wsFactory Optional factory function to create WebSocket instances.
|
|
31
|
+
* If not provided, uses the global WebSocket constructor.
|
|
32
|
+
*/
|
|
33
|
+
constructor(ws_server_url: string, wsFactory?: WebSocketFactory);
|
|
34
|
+
get connected(): boolean;
|
|
35
|
+
connect(onMessage: (msg: unknown) => void, onConnectionLost: () => void): Promise<void>;
|
|
36
|
+
disconnect(): void;
|
|
37
|
+
sendMessage(message: CommandMessage): void;
|
|
38
|
+
}
|
|
39
|
+
export default Connection;
|
|
40
|
+
//# sourceMappingURL=connection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connection.d.ts","sourceRoot":"","sources":["../../src/connection.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAEtE;;GAEG;AACH,MAAM,WAAW,aAAa;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,CAAC,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC;IAC1C,OAAO,EAAE,CAAC,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC;IAC3C,OAAO,EAAE,CAAC,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC;IAC3C,SAAS,EAAE,CAAC,CAAC,KAAK,EAAE;QAAE,IAAI,EAAE,OAAO,CAAA;KAAE,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC;IACvD,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,KAAK,IAAI,IAAI,CAAC;CACjB;AAED,MAAM,MAAM,gBAAgB,GAAG,CAAC,GAAG,EAAE,MAAM,KAAK,aAAa,CAAC;AAE9D,qBAAa,UAAU;IAaR,aAAa,EAAE,MAAM;IAZzB,UAAU,CAAC,EAAE,iBAAiB,CAAa;IAElD,OAAO,CAAC,MAAM,CAAC,CAAgB;IAC/B,OAAO,CAAC,SAAS,CAAmB;IAEpC;;;;;OAKG;gBAEQ,aAAa,EAAE,MAAM,EAC5B,SAAS,CAAC,EAAE,gBAAgB;IAMhC,IAAI,SAAS,YAEZ;IAEK,OAAO,CAAC,SAAS,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,IAAI,EAAE,gBAAgB,EAAE,MAAM,IAAI;IAsC7E,UAAU;IAOV,WAAW,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI;CAO7C;AAED,eAAe,UAAU,CAAC"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025-2026 Open Home Foundation
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import { parseBigIntAwareJson, toBigIntAwareJson } from "./json-utils.js";
|
|
7
|
+
class Connection {
|
|
8
|
+
/**
|
|
9
|
+
* Create a new connection.
|
|
10
|
+
* @param ws_server_url WebSocket server URL
|
|
11
|
+
* @param wsFactory Optional factory function to create WebSocket instances.
|
|
12
|
+
* If not provided, uses the global WebSocket constructor.
|
|
13
|
+
*/
|
|
14
|
+
constructor(ws_server_url, wsFactory) {
|
|
15
|
+
this.ws_server_url = ws_server_url;
|
|
16
|
+
this.ws_server_url = ws_server_url;
|
|
17
|
+
this.wsFactory = wsFactory ?? ((url) => new WebSocket(url));
|
|
18
|
+
}
|
|
19
|
+
serverInfo = void 0;
|
|
20
|
+
socket;
|
|
21
|
+
wsFactory;
|
|
22
|
+
get connected() {
|
|
23
|
+
return this.socket?.readyState === 1;
|
|
24
|
+
}
|
|
25
|
+
async connect(onMessage, onConnectionLost) {
|
|
26
|
+
if (this.socket) {
|
|
27
|
+
throw new Error("Already connected");
|
|
28
|
+
}
|
|
29
|
+
console.debug("Trying to connect");
|
|
30
|
+
return new Promise((resolve, reject) => {
|
|
31
|
+
this.socket = this.wsFactory(this.ws_server_url);
|
|
32
|
+
this.socket.onopen = () => {
|
|
33
|
+
console.log("WebSocket Connected");
|
|
34
|
+
};
|
|
35
|
+
this.socket.onclose = () => {
|
|
36
|
+
console.log("WebSocket Closed");
|
|
37
|
+
onConnectionLost();
|
|
38
|
+
};
|
|
39
|
+
this.socket.onerror = (error) => {
|
|
40
|
+
console.error("WebSocket Error: ", error);
|
|
41
|
+
reject(new Error("WebSocket Error"));
|
|
42
|
+
};
|
|
43
|
+
this.socket.onmessage = (event) => {
|
|
44
|
+
const dataStr = typeof event.data === "string" ? event.data : String(event.data);
|
|
45
|
+
const data = parseBigIntAwareJson(dataStr);
|
|
46
|
+
console.log("WebSocket OnMessage", data);
|
|
47
|
+
if (!this.serverInfo) {
|
|
48
|
+
this.serverInfo = data;
|
|
49
|
+
resolve();
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
onMessage(data);
|
|
53
|
+
};
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
disconnect() {
|
|
57
|
+
if (this.socket) {
|
|
58
|
+
this.socket.close();
|
|
59
|
+
this.socket = void 0;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
sendMessage(message) {
|
|
63
|
+
if (!this.socket) {
|
|
64
|
+
throw new Error("Not connected");
|
|
65
|
+
}
|
|
66
|
+
console.log("WebSocket send message", message);
|
|
67
|
+
this.socket.send(toBigIntAwareJson(message));
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
var connection_default = Connection;
|
|
71
|
+
export {
|
|
72
|
+
Connection,
|
|
73
|
+
connection_default as default
|
|
74
|
+
};
|
|
75
|
+
//# sourceMappingURL=connection.js.map
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/connection.ts"],
|
|
4
|
+
"mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;AAMA,SAAS,sBAAsB,yBAAyB;AAkBjD,MAAM,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYpB,YACW,eACP,WACF;AAFS;AAGP,SAAK,gBAAgB;AACrB,SAAK,YAAY,cAAc,SAAO,IAAI,UAAU,GAAG;AAAA,EAC3D;AAAA,EAjBO,aAAiC;AAAA,EAEhC;AAAA,EACA;AAAA,EAgBR,IAAI,YAAY;AACZ,WAAO,KAAK,QAAQ,eAAe;AAAA,EACvC;AAAA,EAEA,MAAM,QAAQ,WAAmC,kBAA8B;AAC3E,QAAI,KAAK,QAAQ;AACb,YAAM,IAAI,MAAM,mBAAmB;AAAA,IACvC;AAEA,YAAQ,MAAM,mBAAmB;AAEjC,WAAO,IAAI,QAAc,CAAC,SAAS,WAAW;AAC1C,WAAK,SAAS,KAAK,UAAU,KAAK,aAAa;AAE/C,WAAK,OAAO,SAAS,MAAM;AACvB,gBAAQ,IAAI,qBAAqB;AAAA,MACrC;AAEA,WAAK,OAAO,UAAU,MAAM;AACxB,gBAAQ,IAAI,kBAAkB;AAC9B,yBAAiB;AAAA,MACrB;AAEA,WAAK,OAAO,UAAU,WAAS;AAC3B,gBAAQ,MAAM,qBAAqB,KAAK;AACxC,eAAO,IAAI,MAAM,iBAAiB,CAAC;AAAA,MACvC;AAEA,WAAK,OAAO,YAAY,CAAC,UAA6B;AAClD,cAAM,UAAU,OAAO,MAAM,SAAS,WAAW,MAAM,OAAO,OAAO,MAAM,IAAI;AAC/E,cAAM,OAAO,qBAAqB,OAAO;AACzC,gBAAQ,IAAI,uBAAuB,IAAI;AACvC,YAAI,CAAC,KAAK,YAAY;AAClB,eAAK,aAAa;AAClB,kBAAQ;AACR;AAAA,QACJ;AACA,kBAAU,IAAI;AAAA,MAClB;AAAA,IACJ,CAAC;AAAA,EACL;AAAA,EAEA,aAAa;AACT,QAAI,KAAK,QAAQ;AACb,WAAK,OAAO,MAAM;AAClB,WAAK,SAAS;AAAA,IAClB;AAAA,EACJ;AAAA,EAEA,YAAY,SAA+B;AACvC,QAAI,CAAC,KAAK,QAAQ;AACd,YAAM,IAAI,MAAM,eAAe;AAAA,IACnC;AACA,YAAQ,IAAI,0BAA0B,OAAO;AAC7C,SAAK,OAAO,KAAK,kBAAkB,OAAO,CAAC;AAAA,EAC/C;AACJ;AAEA,IAAO,qBAAQ;",
|
|
5
|
+
"names": []
|
|
6
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025-2026 Open Home Foundation
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
export declare class MatterError extends Error {
|
|
7
|
+
}
|
|
8
|
+
export declare class InvalidServerVersion extends MatterError {
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=exceptions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exceptions.d.ts","sourceRoot":"","sources":["../../src/exceptions.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,qBAAa,WAAY,SAAQ,KAAK;CAAG;AAEzC,qBAAa,oBAAqB,SAAQ,WAAW;CAAG"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025-2026 Open Home Foundation
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
class MatterError extends Error {
|
|
7
|
+
}
|
|
8
|
+
class InvalidServerVersion extends MatterError {
|
|
9
|
+
}
|
|
10
|
+
export {
|
|
11
|
+
InvalidServerVersion,
|
|
12
|
+
MatterError
|
|
13
|
+
};
|
|
14
|
+
//# sourceMappingURL=exceptions.js.map
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025-2026 Open Home Foundation
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* @matter-server/ws-client - WebSocket client library for Matter server
|
|
8
|
+
*/
|
|
9
|
+
export * from "./client.js";
|
|
10
|
+
export * from "./connection.js";
|
|
11
|
+
export * from "./exceptions.js";
|
|
12
|
+
export * from "./json-utils.js";
|
|
13
|
+
export * from "./models/model.js";
|
|
14
|
+
export * from "./models/node.js";
|
|
15
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;GAEG;AAGH,cAAc,aAAa,CAAC;AAG5B,cAAc,iBAAiB,CAAC;AAGhC,cAAc,iBAAiB,CAAC;AAGhC,cAAc,iBAAiB,CAAC;AAGhC,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025-2026 Open Home Foundation
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
export * from "./client.js";
|
|
7
|
+
export * from "./connection.js";
|
|
8
|
+
export * from "./exceptions.js";
|
|
9
|
+
export * from "./json-utils.js";
|
|
10
|
+
export * from "./models/model.js";
|
|
11
|
+
export * from "./models/node.js";
|
|
12
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025-2026 Open Home Foundation
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Serialize to JSON with BigInt support.
|
|
8
|
+
* - BigInt values within safe integer range are converted to numbers
|
|
9
|
+
* - Large BigInt values are output as raw decimal numbers (not quoted strings)
|
|
10
|
+
* Use this for outgoing WebSocket messages and displaying values.
|
|
11
|
+
*/
|
|
12
|
+
export declare function toBigIntAwareJson(value: unknown, spaces?: number): string;
|
|
13
|
+
/**
|
|
14
|
+
* Parse JSON with BigInt support for large numbers that exceed JavaScript precision.
|
|
15
|
+
* Numbers with 15+ digits that exceed MAX_SAFE_INTEGER are converted to BigInt.
|
|
16
|
+
* Use this for incoming WebSocket messages.
|
|
17
|
+
*/
|
|
18
|
+
export declare function parseBigIntAwareJson(json: string): unknown;
|
|
19
|
+
//# sourceMappingURL=json-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json-utils.d.ts","sourceRoot":"","sources":["../../src/json-utils.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAWH;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CA2BzE;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAmB1D"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2025-2026 Open Home Foundation
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
const BIGINT_MARKER = "__BIGINT__";
|
|
7
|
+
function toBigIntAwareJson(value, spaces) {
|
|
8
|
+
const replacements = new Array();
|
|
9
|
+
let result = JSON.stringify(
|
|
10
|
+
value,
|
|
11
|
+
(_key, val) => {
|
|
12
|
+
if (typeof val === "bigint") {
|
|
13
|
+
if (val > Number.MAX_SAFE_INTEGER) {
|
|
14
|
+
replacements.push({ from: `"0x${val.toString(16)}"`, to: val.toString() });
|
|
15
|
+
return `0x${val.toString(16)}`;
|
|
16
|
+
} else {
|
|
17
|
+
return Number(val);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
return val;
|
|
21
|
+
},
|
|
22
|
+
spaces
|
|
23
|
+
);
|
|
24
|
+
if (replacements.length > 0) {
|
|
25
|
+
replacements.forEach(({ from, to }) => {
|
|
26
|
+
result = result.replaceAll(from, to);
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
return result;
|
|
30
|
+
}
|
|
31
|
+
function parseBigIntAwareJson(json) {
|
|
32
|
+
const processed = json.replace(/([:,[])\s*(\d{15,})(?=[,}\]\s])/g, (match, prefix, number) => {
|
|
33
|
+
const num = BigInt(number);
|
|
34
|
+
if (num > Number.MAX_SAFE_INTEGER) {
|
|
35
|
+
return `${prefix}"${BIGINT_MARKER}${number}"`;
|
|
36
|
+
}
|
|
37
|
+
return match;
|
|
38
|
+
});
|
|
39
|
+
return JSON.parse(processed, (_key, value) => {
|
|
40
|
+
if (typeof value === "string" && value.startsWith(BIGINT_MARKER)) {
|
|
41
|
+
return BigInt(value.slice(BIGINT_MARKER.length));
|
|
42
|
+
}
|
|
43
|
+
return value;
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
export {
|
|
47
|
+
parseBigIntAwareJson,
|
|
48
|
+
toBigIntAwareJson
|
|
49
|
+
};
|
|
50
|
+
//# sourceMappingURL=json-utils.js.map
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/json-utils.ts"],
|
|
4
|
+
"mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;AAaA,MAAM,gBAAgB;AAQf,SAAS,kBAAkB,OAAgB,QAAyB;AACvE,QAAM,eAAe,IAAI,MAAoC;AAC7D,MAAI,SAAS,KAAK;AAAA,IACd;AAAA,IACA,CAAC,MAAM,QAAQ;AACX,UAAI,OAAO,QAAQ,UAAU;AACzB,YAAI,MAAM,OAAO,kBAAkB;AAE/B,uBAAa,KAAK,EAAE,MAAM,MAAM,IAAI,SAAS,EAAE,CAAC,KAAK,IAAI,IAAI,SAAS,EAAE,CAAC;AACzE,iBAAO,KAAK,IAAI,SAAS,EAAE,CAAC;AAAA,QAChC,OAAO;AACH,iBAAO,OAAO,GAAG;AAAA,QACrB;AAAA,MACJ;AACA,aAAO;AAAA,IACX;AAAA,IACA;AAAA,EACJ;AAGA,MAAI,aAAa,SAAS,GAAG;AACzB,iBAAa,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM;AACnC,eAAS,OAAO,WAAW,MAAM,EAAE;AAAA,IACvC,CAAC;AAAA,EACL;AAEA,SAAO;AACX;AAOO,SAAS,qBAAqB,MAAuB;AAIxD,QAAM,YAAY,KAAK,QAAQ,oCAAoC,CAAC,OAAO,QAAQ,WAAW;AAC1F,UAAM,MAAM,OAAO,MAAM;AACzB,QAAI,MAAM,OAAO,kBAAkB;AAC/B,aAAO,GAAG,MAAM,IAAI,aAAa,GAAG,MAAM;AAAA,IAC9C;AACA,WAAO;AAAA,EACX,CAAC;AAGD,SAAO,KAAK,MAAM,WAAW,CAAC,MAAM,UAAU;AAC1C,QAAI,OAAO,UAAU,YAAY,MAAM,WAAW,aAAa,GAAG;AAC9D,aAAO,OAAO,MAAM,MAAM,cAAc,MAAM,CAAC;AAAA,IACnD;AACA,WAAO;AAAA,EACX,CAAC;AACL;",
|
|
5
|
+
"names": []
|
|
6
|
+
}
|