@project-chip/matter.js 0.12.4-alpha.0-20250209-00d44975c → 0.12.4-alpha.0-20250211-56b2c53a0
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/cjs/CommissioningController.d.ts +52 -30
- package/dist/cjs/CommissioningController.d.ts.map +1 -1
- package/dist/cjs/CommissioningController.js +154 -109
- package/dist/cjs/CommissioningController.js.map +1 -1
- package/dist/cjs/device/PairedNode.d.ts +22 -9
- package/dist/cjs/device/PairedNode.d.ts.map +1 -1
- package/dist/cjs/device/PairedNode.js +43 -31
- package/dist/cjs/device/PairedNode.js.map +1 -1
- package/dist/esm/CommissioningController.d.ts +52 -30
- package/dist/esm/CommissioningController.d.ts.map +1 -1
- package/dist/esm/CommissioningController.js +154 -109
- package/dist/esm/CommissioningController.js.map +1 -1
- package/dist/esm/device/PairedNode.d.ts +22 -9
- package/dist/esm/device/PairedNode.d.ts.map +1 -1
- package/dist/esm/device/PairedNode.js +43 -31
- package/dist/esm/device/PairedNode.js.map +1 -1
- package/package.json +8 -8
- package/src/CommissioningController.ts +155 -108
- package/src/device/PairedNode.ts +48 -35
|
@@ -37,6 +37,20 @@ var import_MatterNode = require("./MatterNode.js");
|
|
|
37
37
|
*/
|
|
38
38
|
const logger = new import_general.Logger("CommissioningController");
|
|
39
39
|
class CommissioningController extends import_MatterNode.MatterNode {
|
|
40
|
+
#started = false;
|
|
41
|
+
#ipv4Disabled;
|
|
42
|
+
#listeningAddressIpv4;
|
|
43
|
+
#listeningAddressIpv6;
|
|
44
|
+
#options;
|
|
45
|
+
#environment;
|
|
46
|
+
// Set when new API was initialized correctly
|
|
47
|
+
#storage;
|
|
48
|
+
#mdnsScanner;
|
|
49
|
+
#mdnsBroadcaster;
|
|
50
|
+
#controllerInstance;
|
|
51
|
+
#initializedNodes = /* @__PURE__ */ new Map();
|
|
52
|
+
#nodeUpdateLabelHandlers = /* @__PURE__ */ new Map();
|
|
53
|
+
#sessionDisconnectedHandler = /* @__PURE__ */ new Map();
|
|
40
54
|
/**
|
|
41
55
|
* Creates a new CommissioningController instance
|
|
42
56
|
*
|
|
@@ -44,26 +58,14 @@ class CommissioningController extends import_MatterNode.MatterNode {
|
|
|
44
58
|
*/
|
|
45
59
|
constructor(options) {
|
|
46
60
|
super();
|
|
47
|
-
this
|
|
61
|
+
this.#options = options;
|
|
48
62
|
}
|
|
49
|
-
started = false;
|
|
50
|
-
ipv4Disabled;
|
|
51
|
-
listeningAddressIpv4;
|
|
52
|
-
listeningAddressIpv6;
|
|
53
|
-
environment;
|
|
54
|
-
// Set when new API was initialized correctly
|
|
55
|
-
storage;
|
|
56
|
-
mdnsScanner;
|
|
57
|
-
mdnsBroadcaster;
|
|
58
|
-
controllerInstance;
|
|
59
|
-
initializedNodes = /* @__PURE__ */ new Map();
|
|
60
|
-
nodeUpdateLabelHandlers = /* @__PURE__ */ new Map();
|
|
61
|
-
sessionDisconnectedHandler = /* @__PURE__ */ new Map();
|
|
62
63
|
get nodeId() {
|
|
63
|
-
return this
|
|
64
|
+
return this.#controllerInstance?.nodeId;
|
|
64
65
|
}
|
|
66
|
+
/** Returns the configuration data needed to create a PASE commissioner, e.g. in a mobile app. */
|
|
65
67
|
get paseCommissionerConfig() {
|
|
66
|
-
const controller = this
|
|
68
|
+
const controller = this.#assertControllerIsStarted(
|
|
67
69
|
"The CommissioningController needs to be started to get the PASE commissioner data."
|
|
68
70
|
);
|
|
69
71
|
const { caConfig, fabricConfig: fabricData } = controller;
|
|
@@ -72,40 +74,40 @@ class CommissioningController extends import_MatterNode.MatterNode {
|
|
|
72
74
|
fabricData
|
|
73
75
|
};
|
|
74
76
|
}
|
|
75
|
-
assertIsAddedToMatterServer() {
|
|
76
|
-
if (this
|
|
77
|
+
#assertIsAddedToMatterServer() {
|
|
78
|
+
if (this.#mdnsScanner === void 0 || this.#storage === void 0 && this.#environment === void 0) {
|
|
77
79
|
throw new import_general.ImplementationError("Add the node to the Matter instance before.");
|
|
78
80
|
}
|
|
79
|
-
if (!this
|
|
81
|
+
if (!this.#started) {
|
|
80
82
|
throw new import_general.ImplementationError("The node needs to be started before interacting with the controller.");
|
|
81
83
|
}
|
|
82
|
-
return { mdnsScanner: this
|
|
84
|
+
return { mdnsScanner: this.#mdnsScanner, storage: this.#storage, environment: this.#environment };
|
|
83
85
|
}
|
|
84
|
-
assertControllerIsStarted(errorText) {
|
|
85
|
-
if (this
|
|
86
|
+
#assertControllerIsStarted(errorText) {
|
|
87
|
+
if (this.#controllerInstance === void 0) {
|
|
86
88
|
throw new import_general.ImplementationError(
|
|
87
89
|
errorText ?? "Controller instance not yet started. Please call start() first."
|
|
88
90
|
);
|
|
89
91
|
}
|
|
90
|
-
return this
|
|
92
|
+
return this.#controllerInstance;
|
|
91
93
|
}
|
|
92
94
|
/** Internal method to initialize a MatterController instance. */
|
|
93
|
-
async initializeController() {
|
|
94
|
-
const { mdnsScanner, storage, environment } = this
|
|
95
|
-
if (this
|
|
96
|
-
return this
|
|
95
|
+
async #initializeController() {
|
|
96
|
+
const { mdnsScanner, storage, environment } = this.#assertIsAddedToMatterServer();
|
|
97
|
+
if (this.#controllerInstance !== void 0) {
|
|
98
|
+
return this.#controllerInstance;
|
|
97
99
|
}
|
|
98
|
-
const { localPort, adminFabricId, adminVendorId, adminFabricIndex, caseAuthenticatedTags, adminFabricLabel } = this
|
|
100
|
+
const { localPort, adminFabricId, adminVendorId, adminFabricIndex, caseAuthenticatedTags, adminFabricLabel } = this.#options;
|
|
99
101
|
if (environment === void 0 && storage === void 0) {
|
|
100
102
|
throw new import_general.ImplementationError("Storage not initialized correctly.");
|
|
101
103
|
}
|
|
102
104
|
const controllerStore = environment?.has(import_node.ControllerStore) ? environment.get(import_node.ControllerStore) : new import_LegacyControllerStore.LegacyControllerStore(storage);
|
|
103
105
|
const { netInterfaces, scanners, port } = await configureNetwork({
|
|
104
|
-
ipv4Disabled: this
|
|
106
|
+
ipv4Disabled: this.#ipv4Disabled,
|
|
105
107
|
mdnsScanner,
|
|
106
108
|
localPort,
|
|
107
|
-
listeningAddressIpv4: this
|
|
108
|
-
listeningAddressIpv6: this
|
|
109
|
+
listeningAddressIpv4: this.#listeningAddressIpv4,
|
|
110
|
+
listeningAddressIpv6: this.#listeningAddressIpv6
|
|
109
111
|
});
|
|
110
112
|
const controller = await import_MatterController.MatterController.create({
|
|
111
113
|
controllerStore,
|
|
@@ -113,7 +115,7 @@ class CommissioningController extends import_MatterNode.MatterNode {
|
|
|
113
115
|
netInterfaces,
|
|
114
116
|
sessionClosedCallback: (peerNodeId) => {
|
|
115
117
|
logger.info(`Session for peer node ${peerNodeId} disconnected ...`);
|
|
116
|
-
const handler = this
|
|
118
|
+
const handler = this.#sessionDisconnectedHandler.get(peerNodeId);
|
|
117
119
|
if (handler !== void 0) {
|
|
118
120
|
handler().catch((error) => logger.warn(`Error while handling session disconnect: ${error}`));
|
|
119
121
|
}
|
|
@@ -124,25 +126,25 @@ class CommissioningController extends import_MatterNode.MatterNode {
|
|
|
124
126
|
caseAuthenticatedTags,
|
|
125
127
|
adminFabricLabel
|
|
126
128
|
});
|
|
127
|
-
if (this
|
|
128
|
-
controller.addBroadcaster(this
|
|
129
|
+
if (this.#mdnsBroadcaster) {
|
|
130
|
+
controller.addBroadcaster(this.#mdnsBroadcaster.createInstanceBroadcaster(port));
|
|
129
131
|
}
|
|
130
132
|
return controller;
|
|
131
133
|
}
|
|
132
134
|
/**
|
|
133
135
|
* Commissions/Pairs a new device into the controller fabric. The method returns the NodeId of the commissioned
|
|
134
|
-
* node.
|
|
136
|
+
* node on success.
|
|
135
137
|
*/
|
|
136
138
|
async commissionNode(nodeOptions, connectNodeAfterCommissioning = true) {
|
|
137
|
-
this
|
|
138
|
-
const controller = this
|
|
139
|
+
this.#assertIsAddedToMatterServer();
|
|
140
|
+
const controller = this.#assertControllerIsStarted();
|
|
139
141
|
const nodeId = await controller.commission(nodeOptions);
|
|
140
142
|
if (connectNodeAfterCommissioning) {
|
|
141
143
|
const node = await this.connectNode(nodeId, {
|
|
142
144
|
...nodeOptions,
|
|
143
|
-
autoSubscribe: nodeOptions.autoSubscribe ?? this
|
|
144
|
-
subscribeMinIntervalFloorSeconds: nodeOptions.subscribeMinIntervalFloorSeconds ?? this
|
|
145
|
-
subscribeMaxIntervalCeilingSeconds: nodeOptions.subscribeMaxIntervalCeilingSeconds ?? this
|
|
145
|
+
autoSubscribe: nodeOptions.autoSubscribe ?? this.#options.autoSubscribe,
|
|
146
|
+
subscribeMinIntervalFloorSeconds: nodeOptions.subscribeMinIntervalFloorSeconds ?? this.#options.subscribeMinIntervalFloorSeconds,
|
|
147
|
+
subscribeMaxIntervalCeilingSeconds: nodeOptions.subscribeMaxIntervalCeilingSeconds ?? this.#options.subscribeMaxIntervalCeilingSeconds
|
|
146
148
|
});
|
|
147
149
|
await node.events.initialized;
|
|
148
150
|
}
|
|
@@ -154,24 +156,26 @@ class CommissioningController extends import_MatterNode.MatterNode {
|
|
|
154
156
|
* process.
|
|
155
157
|
*/
|
|
156
158
|
completeCommissioningForNode(peerNodeId, discoveryData) {
|
|
157
|
-
this
|
|
158
|
-
const controller = this
|
|
159
|
+
this.#assertIsAddedToMatterServer();
|
|
160
|
+
const controller = this.#assertControllerIsStarted();
|
|
159
161
|
return controller.completeCommissioning(peerNodeId, discoveryData);
|
|
160
162
|
}
|
|
161
163
|
/** Check if a given node id is commissioned on this controller. */
|
|
162
164
|
isNodeCommissioned(nodeId) {
|
|
163
|
-
const controller = this
|
|
165
|
+
const controller = this.#assertControllerIsStarted();
|
|
164
166
|
return controller.getCommissionedNodes().includes(nodeId) ?? false;
|
|
165
167
|
}
|
|
166
168
|
/**
|
|
167
169
|
* Remove a Node id from the controller. This method should only be used if the decommission method on the
|
|
168
170
|
* PairedNode instance returns an error. By default, it tries to decommission the node from the controller but will
|
|
169
171
|
* remove it also in case of an error during decommissioning. Ideally try to decommission the node before and only
|
|
170
|
-
* use this in case of an error.
|
|
172
|
+
* use this in case of an error as last option.
|
|
173
|
+
* If this method is used the state of the PairedNode instance might be out of sync, so the PairedNode instance
|
|
174
|
+
* should be disconnected first.
|
|
171
175
|
*/
|
|
172
176
|
async removeNode(nodeId, tryDecommissioning = true) {
|
|
173
|
-
const controller = this
|
|
174
|
-
const node = this
|
|
177
|
+
const controller = this.#assertControllerIsStarted();
|
|
178
|
+
const node = this.#initializedNodes.get(nodeId);
|
|
175
179
|
let decommissionSuccess = false;
|
|
176
180
|
if (tryDecommissioning) {
|
|
177
181
|
try {
|
|
@@ -188,17 +192,22 @@ class CommissioningController extends import_MatterNode.MatterNode {
|
|
|
188
192
|
node.close(!decommissionSuccess);
|
|
189
193
|
}
|
|
190
194
|
await controller.removeNode(nodeId);
|
|
191
|
-
this
|
|
195
|
+
this.#initializedNodes.delete(nodeId);
|
|
192
196
|
}
|
|
197
|
+
/** @deprecated Use PairedNode.disconnect() instead */
|
|
193
198
|
async disconnectNode(nodeId) {
|
|
194
|
-
const node = this
|
|
199
|
+
const node = this.#initializedNodes.get(nodeId);
|
|
195
200
|
if (node === void 0) {
|
|
196
201
|
throw new import_general.ImplementationError(`Node ${nodeId} is not connected!`);
|
|
197
202
|
}
|
|
198
|
-
await this
|
|
203
|
+
await this.#controllerInstance?.disconnect(nodeId);
|
|
199
204
|
}
|
|
205
|
+
/**
|
|
206
|
+
* Returns the PairedNode instance for a given NodeId. The instance is initialized without auto connect if not yet
|
|
207
|
+
* created.
|
|
208
|
+
*/
|
|
200
209
|
async getNode(nodeId) {
|
|
201
|
-
const existingNode = this
|
|
210
|
+
const existingNode = this.#initializedNodes.get(nodeId);
|
|
202
211
|
if (existingNode !== void 0) {
|
|
203
212
|
return existingNode;
|
|
204
213
|
}
|
|
@@ -209,13 +218,15 @@ class CommissioningController extends import_MatterNode.MatterNode {
|
|
|
209
218
|
* After connection the endpoint data of the device is analyzed and an object structure is created.
|
|
210
219
|
* This call is not blocking and returns an initialized PairedNode instance. The connection or reconnection
|
|
211
220
|
* happens in the background. Please monitor the state of the node to see if the connection was successful.
|
|
221
|
+
*
|
|
222
|
+
* @deprecated Use getNode() instead and call PairedNode.connect() or PairedNode.disconnect() as needed.
|
|
212
223
|
*/
|
|
213
224
|
async connectNode(nodeId, connectOptions) {
|
|
214
|
-
const controller = this
|
|
225
|
+
const controller = this.#assertControllerIsStarted();
|
|
215
226
|
if (!controller.getCommissionedNodes().includes(nodeId)) {
|
|
216
227
|
throw new import_general.ImplementationError(`Node ${nodeId} is not commissioned!`);
|
|
217
228
|
}
|
|
218
|
-
const existingNode = this
|
|
229
|
+
const existingNode = this.#initializedNodes.get(nodeId);
|
|
219
230
|
if (existingNode !== void 0) {
|
|
220
231
|
if (!existingNode.initialized) {
|
|
221
232
|
existingNode.connect(connectOptions);
|
|
@@ -226,22 +237,22 @@ class CommissioningController extends import_MatterNode.MatterNode {
|
|
|
226
237
|
nodeId,
|
|
227
238
|
this,
|
|
228
239
|
connectOptions,
|
|
229
|
-
this
|
|
240
|
+
this.#controllerInstance?.getCommissionedNodeDetails(nodeId)?.deviceData ?? {},
|
|
230
241
|
await this.createInteractionClient(nodeId, import_protocol.NodeDiscoveryType.None, false),
|
|
231
242
|
// First connect without discovery to last known address
|
|
232
243
|
async (discoveryType) => void await controller.connect(nodeId, { discoveryType }),
|
|
233
|
-
(handler) => this
|
|
244
|
+
(handler) => this.#sessionDisconnectedHandler.set(nodeId, handler),
|
|
234
245
|
controller.sessions,
|
|
235
|
-
await this
|
|
246
|
+
await this.#collectStoredAttributeData(nodeId)
|
|
236
247
|
);
|
|
237
|
-
this
|
|
248
|
+
this.#initializedNodes.set(nodeId, pairedNode);
|
|
238
249
|
pairedNode.events.initializedFromRemote.on(
|
|
239
250
|
async (deviceData) => await controller.enhanceCommissionedNodeDetails(nodeId, deviceData)
|
|
240
251
|
);
|
|
241
252
|
return pairedNode;
|
|
242
253
|
}
|
|
243
|
-
async collectStoredAttributeData(nodeId) {
|
|
244
|
-
const controller = this
|
|
254
|
+
async #collectStoredAttributeData(nodeId) {
|
|
255
|
+
const controller = this.#assertControllerIsStarted();
|
|
245
256
|
const storedDataVersions = await controller.getStoredClusterDataVersions(nodeId);
|
|
246
257
|
const result = new Array();
|
|
247
258
|
for (const { endpointId, clusterId } of storedDataVersions) {
|
|
@@ -252,9 +263,11 @@ class CommissioningController extends import_MatterNode.MatterNode {
|
|
|
252
263
|
/**
|
|
253
264
|
* Connects to all paired nodes.
|
|
254
265
|
* After connection the endpoint data of the device is analyzed and an object structure is created.
|
|
266
|
+
*
|
|
267
|
+
* @deprecated Use getCommissionedNodes() to get the list of nodes and getNode(nodeId) instead and call PairedNode.connect() or PairedNode.disconnect() as needed.
|
|
255
268
|
*/
|
|
256
269
|
async connect(connectOptions) {
|
|
257
|
-
const controller = this
|
|
270
|
+
const controller = this.#assertControllerIsStarted();
|
|
258
271
|
if (!controller.isCommissioned()) {
|
|
259
272
|
throw new import_general.ImplementationError(
|
|
260
273
|
"Controller instance not yet paired with any device, so nothing to connect to."
|
|
@@ -263,36 +276,39 @@ class CommissioningController extends import_MatterNode.MatterNode {
|
|
|
263
276
|
for (const nodeId of controller.getCommissionedNodes()) {
|
|
264
277
|
await this.connectNode(nodeId, connectOptions);
|
|
265
278
|
}
|
|
266
|
-
return Array.from(this
|
|
279
|
+
return Array.from(this.#initializedNodes.values());
|
|
267
280
|
}
|
|
268
281
|
/**
|
|
269
282
|
* Set the MDNS Scanner instance. Should be only used internally
|
|
270
283
|
*
|
|
271
284
|
* @param mdnsScanner MdnsScanner instance
|
|
285
|
+
* @private
|
|
272
286
|
*/
|
|
273
287
|
setMdnsScanner(mdnsScanner) {
|
|
274
|
-
this
|
|
288
|
+
this.#mdnsScanner = mdnsScanner;
|
|
275
289
|
}
|
|
276
290
|
/**
|
|
277
291
|
* Set the MDNS Broadcaster instance. Should be only used internally
|
|
278
292
|
*
|
|
279
293
|
* @param mdnsBroadcaster MdnsBroadcaster instance
|
|
294
|
+
* @private
|
|
280
295
|
*/
|
|
281
296
|
setMdnsBroadcaster(mdnsBroadcaster) {
|
|
282
|
-
this
|
|
297
|
+
this.#mdnsBroadcaster = mdnsBroadcaster;
|
|
283
298
|
}
|
|
284
299
|
/**
|
|
285
300
|
* Set the Storage instance. Should be only used internally
|
|
286
301
|
*
|
|
287
302
|
* @param storage storage context to use
|
|
303
|
+
* @private
|
|
288
304
|
*/
|
|
289
305
|
setStorage(storage) {
|
|
290
|
-
this
|
|
291
|
-
this
|
|
306
|
+
this.#storage = storage;
|
|
307
|
+
this.#environment = void 0;
|
|
292
308
|
}
|
|
293
309
|
/** Returns true if t least one node is commissioned/paired with this controller instance. */
|
|
294
310
|
isCommissioned() {
|
|
295
|
-
const controller = this
|
|
311
|
+
const controller = this.#assertControllerIsStarted();
|
|
296
312
|
return controller.isCommissioned();
|
|
297
313
|
}
|
|
298
314
|
/**
|
|
@@ -300,93 +316,113 @@ class CommissioningController extends import_MatterNode.MatterNode {
|
|
|
300
316
|
* not be used directly. See the PairedNode class for the public API.
|
|
301
317
|
*/
|
|
302
318
|
async createInteractionClient(nodeId, discoveryType, forcedConnection = true) {
|
|
303
|
-
const controller = this
|
|
319
|
+
const controller = this.#assertControllerIsStarted();
|
|
304
320
|
if (!forcedConnection) {
|
|
305
321
|
return controller.createInteractionClient(nodeId, { discoveryType });
|
|
306
322
|
}
|
|
307
323
|
return controller.connect(nodeId, { discoveryType });
|
|
308
324
|
}
|
|
309
|
-
/**
|
|
325
|
+
/**
|
|
326
|
+
* Returns the PairedNode instance for a given node id, if this node is connected.
|
|
327
|
+
* @deprecated Use getNode() instead
|
|
328
|
+
*/
|
|
310
329
|
getPairedNode(nodeId) {
|
|
311
|
-
return this
|
|
330
|
+
return this.#initializedNodes.get(nodeId);
|
|
312
331
|
}
|
|
313
|
-
/** Returns an array with the
|
|
332
|
+
/** Returns an array with the NodeIds of all commissioned nodes. */
|
|
314
333
|
getCommissionedNodes() {
|
|
315
|
-
const controller = this
|
|
334
|
+
const controller = this.#assertControllerIsStarted();
|
|
316
335
|
return controller.getCommissionedNodes() ?? [];
|
|
317
336
|
}
|
|
337
|
+
/** Returns an arra with all commissioned NodeIds and their metadata. */
|
|
318
338
|
getCommissionedNodesDetails() {
|
|
319
|
-
const controller = this
|
|
339
|
+
const controller = this.#assertControllerIsStarted();
|
|
320
340
|
return controller.getCommissionedNodesDetails() ?? [];
|
|
321
341
|
}
|
|
322
|
-
/**
|
|
342
|
+
/**
|
|
343
|
+
* Disconnects all connected nodes and closes the network connections and other resources of the controller.
|
|
344
|
+
* You can use "start()" to restart the controller after closing it.
|
|
345
|
+
*/
|
|
323
346
|
async close() {
|
|
324
|
-
for (const node of this
|
|
347
|
+
for (const node of this.#initializedNodes.values()) {
|
|
325
348
|
node.close();
|
|
326
349
|
}
|
|
327
|
-
await this
|
|
328
|
-
this
|
|
329
|
-
this
|
|
330
|
-
this
|
|
331
|
-
this
|
|
350
|
+
await this.#controllerInstance?.close();
|
|
351
|
+
this.#controllerInstance = void 0;
|
|
352
|
+
this.#initializedNodes.clear();
|
|
353
|
+
this.#ipv4Disabled = void 0;
|
|
354
|
+
this.#started = false;
|
|
332
355
|
}
|
|
356
|
+
/** Return the port used by the controller for the UDP interface. */
|
|
333
357
|
getPort() {
|
|
334
|
-
return this
|
|
358
|
+
return this.#options.localPort;
|
|
335
359
|
}
|
|
360
|
+
/** @private */
|
|
336
361
|
initialize(ipv4Disabled) {
|
|
337
|
-
if (this
|
|
362
|
+
if (this.#started) {
|
|
338
363
|
throw new import_general.ImplementationError("Controller instance already started.");
|
|
339
364
|
}
|
|
340
|
-
if (this
|
|
365
|
+
if (this.#ipv4Disabled !== void 0 && this.#ipv4Disabled !== ipv4Disabled) {
|
|
341
366
|
throw new import_general.ImplementationError(
|
|
342
367
|
"Changing the IPv4 disabled flag after starting the controller is not supported."
|
|
343
368
|
);
|
|
344
369
|
}
|
|
345
|
-
this
|
|
370
|
+
this.#ipv4Disabled = ipv4Disabled;
|
|
346
371
|
}
|
|
372
|
+
/** @private */
|
|
347
373
|
async initializeControllerStore() {
|
|
348
|
-
if (this
|
|
374
|
+
if (this.#options.environment === void 0) {
|
|
349
375
|
throw new import_general.ImplementationError("Initialization not done. Add the controller to the MatterServer first.");
|
|
350
376
|
}
|
|
351
|
-
const { environment, id } = this
|
|
377
|
+
const { environment, id } = this.#options.environment;
|
|
352
378
|
const controllerStore = await import_node.ControllerStore.create(id, environment);
|
|
353
379
|
environment.set(import_node.ControllerStore, controllerStore);
|
|
354
380
|
}
|
|
355
|
-
/**
|
|
381
|
+
/**
|
|
382
|
+
* Initialize the controller and initialize and connect to all commissioned nodes if autoConnect is not set to false.
|
|
383
|
+
*/
|
|
356
384
|
async start() {
|
|
357
|
-
if (this
|
|
358
|
-
if (this
|
|
385
|
+
if (this.#ipv4Disabled === void 0) {
|
|
386
|
+
if (this.#options.environment === void 0) {
|
|
359
387
|
throw new import_general.ImplementationError("Initialization not done. Add the controller to the MatterServer first.");
|
|
360
388
|
}
|
|
361
|
-
const { environment } = this
|
|
389
|
+
const { environment } = this.#options.environment;
|
|
362
390
|
if (!environment.has(import_node.ControllerStore)) {
|
|
363
391
|
await this.initializeControllerStore();
|
|
364
392
|
}
|
|
365
393
|
const mdnsService = await environment.load(import_protocol.MdnsService);
|
|
366
|
-
this
|
|
394
|
+
this.#ipv4Disabled = !mdnsService.enableIpv4;
|
|
367
395
|
this.setMdnsBroadcaster(mdnsService.broadcaster);
|
|
368
396
|
this.setMdnsScanner(mdnsService.scanner);
|
|
369
|
-
this
|
|
370
|
-
const runtime = this
|
|
397
|
+
this.#environment = environment;
|
|
398
|
+
const runtime = this.#environment.runtime;
|
|
371
399
|
runtime.add(this);
|
|
372
400
|
}
|
|
373
|
-
this
|
|
374
|
-
if (this
|
|
375
|
-
this
|
|
401
|
+
this.#started = true;
|
|
402
|
+
if (this.#controllerInstance === void 0) {
|
|
403
|
+
this.#controllerInstance = await this.#initializeController();
|
|
376
404
|
}
|
|
377
|
-
await this
|
|
378
|
-
if (this
|
|
405
|
+
await this.#controllerInstance.announce();
|
|
406
|
+
if (this.#options.autoConnect !== false && this.#controllerInstance.isCommissioned()) {
|
|
379
407
|
await this.connect();
|
|
380
408
|
}
|
|
381
409
|
}
|
|
410
|
+
/**
|
|
411
|
+
* Cancels the discovery process for commissionable devices started with discoverCommissionableDevices().
|
|
412
|
+
*/
|
|
382
413
|
cancelCommissionableDeviceDiscovery(identifierData, discoveryCapabilities) {
|
|
383
|
-
this
|
|
384
|
-
const controller = this
|
|
414
|
+
this.#assertIsAddedToMatterServer();
|
|
415
|
+
const controller = this.#assertControllerIsStarted();
|
|
385
416
|
controller.collectScanners(discoveryCapabilities).forEach((scanner) => import_protocol.ControllerDiscovery.cancelCommissionableDeviceDiscovery(scanner, identifierData));
|
|
386
417
|
}
|
|
418
|
+
/**
|
|
419
|
+
* Starts to discover commissionable devices.
|
|
420
|
+
* The promise will be fulfilled after the provided timeout or when the discovery is stopped via
|
|
421
|
+
* cancelCommissionableDeviceDiscovery(). The discoveredCallback will be called for each discovered device.
|
|
422
|
+
*/
|
|
387
423
|
async discoverCommissionableDevices(identifierData, discoveryCapabilities, discoveredCallback, timeoutSeconds = 900) {
|
|
388
|
-
this
|
|
389
|
-
const controller = this
|
|
424
|
+
this.#assertIsAddedToMatterServer();
|
|
425
|
+
const controller = this.#assertControllerIsStarted();
|
|
390
426
|
return await import_protocol.ControllerDiscovery.discoverCommissionableDevices(
|
|
391
427
|
controller.collectScanners(discoveryCapabilities),
|
|
392
428
|
timeoutSeconds,
|
|
@@ -394,11 +430,15 @@ class CommissioningController extends import_MatterNode.MatterNode {
|
|
|
394
430
|
discoveredCallback
|
|
395
431
|
);
|
|
396
432
|
}
|
|
433
|
+
/**
|
|
434
|
+
* Use this method to reset the Controller storage. The method can only be called if the controller is stopped and
|
|
435
|
+
* will remove all commissioning data and paired nodes from the controller.
|
|
436
|
+
*/
|
|
397
437
|
async resetStorage() {
|
|
398
|
-
this
|
|
438
|
+
this.#assertControllerIsStarted(
|
|
399
439
|
"Storage cannot be reset while the controller is operating! Please close the controller first."
|
|
400
440
|
);
|
|
401
|
-
const { storage, environment } = this
|
|
441
|
+
const { storage, environment } = this.#assertIsAddedToMatterServer();
|
|
402
442
|
if (environment !== void 0) {
|
|
403
443
|
const controllerStore = environment.get(import_node.ControllerStore);
|
|
404
444
|
await controllerStore.erase();
|
|
@@ -410,11 +450,12 @@ class CommissioningController extends import_MatterNode.MatterNode {
|
|
|
410
450
|
}
|
|
411
451
|
/** Returns active session information for all connected nodes. */
|
|
412
452
|
getActiveSessionInformation() {
|
|
413
|
-
return this
|
|
453
|
+
return this.#controllerInstance?.getActiveSessionInformation() ?? [];
|
|
414
454
|
}
|
|
455
|
+
/** @private */
|
|
415
456
|
async validateAndUpdateFabricLabel(nodeId) {
|
|
416
|
-
const controller = this
|
|
417
|
-
const node = this
|
|
457
|
+
const controller = this.#assertControllerIsStarted();
|
|
458
|
+
const node = this.#initializedNodes.get(nodeId);
|
|
418
459
|
if (node === void 0) {
|
|
419
460
|
throw new import_general.ImplementationError(`Node ${nodeId} is not connected!`);
|
|
420
461
|
}
|
|
@@ -439,13 +480,17 @@ class CommissioningController extends import_MatterNode.MatterNode {
|
|
|
439
480
|
});
|
|
440
481
|
}
|
|
441
482
|
}
|
|
483
|
+
/**
|
|
484
|
+
* Updates the fabric label for the controller and all connected nodes.
|
|
485
|
+
* The label is used to identify the controller and all connected nodes in the fabric.
|
|
486
|
+
*/
|
|
442
487
|
async updateFabricLabel(label) {
|
|
443
|
-
const controller = this
|
|
488
|
+
const controller = this.#assertControllerIsStarted();
|
|
444
489
|
if (controller.fabricConfig.label === label) {
|
|
445
490
|
return;
|
|
446
491
|
}
|
|
447
492
|
await controller.updateFabricLabel(label);
|
|
448
|
-
for (const node of this
|
|
493
|
+
for (const node of this.#initializedNodes.values()) {
|
|
449
494
|
if (node.isConnected) {
|
|
450
495
|
try {
|
|
451
496
|
await this.validateAndUpdateFabricLabel(node.nodeId);
|
|
@@ -461,12 +506,12 @@ class CommissioningController extends import_MatterNode.MatterNode {
|
|
|
461
506
|
logger.info(
|
|
462
507
|
`Node ${node.nodeId} is reconnecting. Delaying fabric label update to when node is back online.`
|
|
463
508
|
);
|
|
464
|
-
if (!this
|
|
509
|
+
if (!this.#nodeUpdateLabelHandlers.has(node.nodeId)) {
|
|
465
510
|
const updateOnReconnect = (nodeState) => {
|
|
466
511
|
if (nodeState === import_PairedNode.NodeStates.Connected) {
|
|
467
512
|
this.validateAndUpdateFabricLabel(node.nodeId).catch((error) => logger.warn(`Error updating fabric label on node ${node.nodeId}:`, error)).finally(() => {
|
|
468
513
|
node.events.stateChanged.off(updateOnReconnect);
|
|
469
|
-
this
|
|
514
|
+
this.#nodeUpdateLabelHandlers.delete(node.nodeId);
|
|
470
515
|
});
|
|
471
516
|
}
|
|
472
517
|
};
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/CommissioningController.ts"],
|
|
4
|
-
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAMA,sBAAuC;AACvC,qBAYO;AACP,mCAAsC;AACtC,kBAAgC;AAChC,sBAcO;AAUP,wBAA2E;AAC3E,8BAAiC;AACjC,wBAA2B;AAhD3B;AAAA;AAAA;AAAA;AAAA;AAkDA,MAAM,SAAS,IAAI,sBAAO,yBAAyB;AAoF5C,MAAM,gCAAgC,6BAAW;AAAA
|
|
4
|
+
"mappings": "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",
|
|
5
5
|
"names": []
|
|
6
6
|
}
|