@matter/nodejs-shell 0.17.9 → 0.18.0-alpha.0-20260807-335c3291b

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.
Files changed (52) hide show
  1. package/README.md +11 -1
  2. package/dist/esm/MatterNode.js +237 -134
  3. package/dist/esm/MatterNode.js.map +1 -1
  4. package/dist/esm/app.js +13 -7
  5. package/dist/esm/app.js.map +1 -1
  6. package/dist/esm/shell/cmd_cluster-attributes.js +64 -45
  7. package/dist/esm/shell/cmd_cluster-attributes.js.map +2 -2
  8. package/dist/esm/shell/cmd_cluster-commands.js +11 -9
  9. package/dist/esm/shell/cmd_cluster-commands.js.map +1 -1
  10. package/dist/esm/shell/cmd_cluster-events.js +36 -9
  11. package/dist/esm/shell/cmd_cluster-events.js.map +1 -1
  12. package/dist/esm/shell/cmd_commission.js +119 -93
  13. package/dist/esm/shell/cmd_commission.js.map +1 -1
  14. package/dist/esm/shell/cmd_discover.js +23 -21
  15. package/dist/esm/shell/cmd_discover.js.map +1 -1
  16. package/dist/esm/shell/cmd_icd.js +46 -30
  17. package/dist/esm/shell/cmd_icd.js.map +1 -1
  18. package/dist/esm/shell/cmd_identify.js +11 -7
  19. package/dist/esm/shell/cmd_identify.js.map +1 -1
  20. package/dist/esm/shell/cmd_nodes.js +189 -168
  21. package/dist/esm/shell/cmd_nodes.js.map +1 -1
  22. package/dist/esm/shell/cmd_session.js +3 -4
  23. package/dist/esm/shell/cmd_session.js.map +1 -1
  24. package/dist/esm/shell/cmd_subscribe.js +26 -12
  25. package/dist/esm/shell/cmd_subscribe.js.map +1 -1
  26. package/dist/esm/util/ClusterEndpoint.js +61 -0
  27. package/dist/esm/util/ClusterEndpoint.js.map +6 -0
  28. package/dist/esm/util/awaitSeeded.js +31 -0
  29. package/dist/esm/util/awaitSeeded.js.map +6 -0
  30. package/dist/esm/util/diagnosticLogging.js +99 -0
  31. package/dist/esm/util/diagnosticLogging.js.map +6 -0
  32. package/dist/esm/util/legacyStorageMigration.js +188 -0
  33. package/dist/esm/util/legacyStorageMigration.js.map +6 -0
  34. package/package.json +10 -11
  35. package/src/MatterNode.ts +298 -159
  36. package/src/app.ts +17 -9
  37. package/src/shell/cmd_cluster-attributes.ts +77 -53
  38. package/src/shell/cmd_cluster-commands.ts +12 -13
  39. package/src/shell/cmd_cluster-events.ts +38 -11
  40. package/src/shell/cmd_commission.ts +136 -113
  41. package/src/shell/cmd_discover.ts +36 -22
  42. package/src/shell/cmd_icd.ts +52 -32
  43. package/src/shell/cmd_identify.ts +11 -7
  44. package/src/shell/cmd_nodes.ts +226 -199
  45. package/src/shell/cmd_session.ts +3 -5
  46. package/src/shell/cmd_subscribe.ts +37 -14
  47. package/src/shell/webassets/index.html +1 -1
  48. package/src/tsconfig.json +0 -3
  49. package/src/util/ClusterEndpoint.ts +107 -0
  50. package/src/util/awaitSeeded.ts +43 -0
  51. package/src/util/diagnosticLogging.ts +117 -0
  52. package/src/util/legacyStorageMigration.ts +275 -0
package/README.md CHANGED
@@ -37,7 +37,7 @@ Please note the extra `--` to separate the npm parameters from the shell paramet
37
37
  ## matter.js v0.11 Storage adjustment!
38
38
  In matter.js 0.11 we adjusted the storage to the new environment based one. This means that by default the storage is in the user directory in .matter/shell-XX where XX is the nodeNum you provided as parameter. You can adjust the storage base location with "--storage-path=..." as parameter.
39
39
 
40
- Before matter.js 0.13 it was possible to use a former storage with "--legacyStorage" and the storage will be in the .matter-shell-XX directory in the local directory as before. This option was removed in matter,js 0.13.
40
+ Before matter.js 0.13 it was possible to use a former storage with "--legacyStorage" and the storage will be in the .matter-shell-XX directory in the local directory as before. This option was removed in matter.js 0.13.
41
41
  To manually convert a storage you can follow the following steps. The described steps assume ./.matter-shell-XX is the old storage and ~/.matter/shell-XX is the new storage location.
42
42
 
43
43
  * Stop the shell
@@ -49,6 +49,16 @@ To manually convert a storage you can follow the following steps. The described
49
49
 
50
50
  All "0.MatterController.node-*" files from the old storage are not needed to be copied, if existing. They are automatically regenerated on next start.
51
51
 
52
+ ## Migrating a pre-0.16 controller storage
53
+
54
+ On startup, the shell automatically migrates a pre-0.16 controller storage (predating the
55
+ `ServerNode`-based controller) to the current storage format. The old, now-unused data is left in
56
+ place, so the migration is non-destructive and can be repeated safely.
57
+
58
+ Once you are certain the migration succeeded and you will not downgrade this storage below 0.16,
59
+ run the shell with `--cleanup-legacy-storage` to delete the leftover legacy data. **This is
60
+ irreversible — once removed, there is no way back to the pre-0.16 layout.**
61
+
52
62
  ## General usage
53
63
 
54
64
  The shell offers and interactive prompt that can execute commands. If you just enter the command name that has sub commands (with or without followed by "help"), it will display the command options. If you enter the command name followed by the options, it will execute the command, with "help" after the command name it will show the detailed help for this command.
@@ -4,71 +4,53 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
  import {
7
- Diagnostic,
8
7
  Environment,
9
8
  Filesystem,
9
+ ImplementationError,
10
+ InternalError,
10
11
  Logger,
11
12
  ObserverGroup,
13
+ Seconds,
12
14
  StorageService
13
15
  } from "@matter/general";
14
- import { DclBehavior, SoftwareUpdateManager } from "@matter/node";
15
- import { NodeId } from "@matter/types";
16
- import { CommissioningController } from "@project-chip/matter.js";
17
16
  import {
18
- NodeStateInformation
19
- } from "@project-chip/matter.js/device";
17
+ ControllerBehavior,
18
+ DclBehavior,
19
+ Endpoint,
20
+ NetworkClient,
21
+ ServerNode,
22
+ SoftwareUpdateManager
23
+ } from "@matter/node";
24
+ import { OtaProviderEndpoint } from "@matter/node/endpoints/ota-provider";
25
+ import { Ble, FabricAuthority } from "@matter/protocol";
26
+ import { NodeId } from "@matter/types";
20
27
  import { join } from "node:path";
21
- function createDiagnosticCallbacks() {
22
- return {
23
- attributeChangedCallback: (peerNodeId, { path: { nodeId, clusterId, endpointId, attributeName }, value }) => console.log(
24
- `attributeChangedCallback ${peerNodeId}: Attribute ${nodeId}/${endpointId}/${clusterId}/${attributeName} changed to ${Diagnostic.json(
25
- value
26
- )}`
27
- ),
28
- eventTriggeredCallback: (peerNodeId, { path: { nodeId, clusterId, endpointId, eventName }, events }) => console.log(
29
- `eventTriggeredCallback ${peerNodeId}: Event ${nodeId}/${endpointId}/${clusterId}/${eventName} triggered with ${Diagnostic.json(
30
- events
31
- )}`
32
- ),
33
- stateInformationCallback: (peerNodeId, info) => {
34
- switch (info) {
35
- case NodeStateInformation.Connected:
36
- console.log(`stateInformationCallback Node ${peerNodeId} connected`);
37
- break;
38
- case NodeStateInformation.Disconnected:
39
- console.log(`stateInformationCallback Node ${peerNodeId} disconnected`);
40
- break;
41
- case NodeStateInformation.Reconnecting:
42
- console.log(`stateInformationCallback Node ${peerNodeId} reconnecting`);
43
- break;
44
- case NodeStateInformation.WaitingForDeviceDiscovery:
45
- console.log(
46
- `stateInformationCallback Node ${peerNodeId} waiting that device gets discovered again`
47
- );
48
- break;
49
- case NodeStateInformation.StructureChanged:
50
- console.log(`stateInformationCallback Node ${peerNodeId} structure changed`);
51
- break;
52
- case NodeStateInformation.Decommissioned:
53
- console.log(`stateInformationCallback Node ${peerNodeId} decommissioned`);
54
- break;
55
- }
56
- }
57
- };
58
- }
28
+ import { installDiagnosticLogging } from "./util/diagnosticLogging.js";
29
+ import {
30
+ cleanupLegacyStorage as purgeLegacyStorage,
31
+ eraseLegacyStorage,
32
+ migrateLegacyCommissionedNodes,
33
+ migrateLegacyControllerCredentials
34
+ } from "./util/legacyStorageMigration.js";
59
35
  const logger = Logger.get("Node");
36
+ const ADMIN_FABRIC_LABEL = "matter.js Shell";
60
37
  class MatterNode {
61
38
  #storageLocation;
62
39
  #storageManager;
63
40
  #storageContext;
64
41
  #environment;
65
- commissioningController;
42
+ #nodeEnvironment;
43
+ #node;
44
+ #nodePromise;
45
+ #fabric;
66
46
  #started = false;
47
+ #startPromise;
67
48
  #nodeNum;
68
49
  #netInterface;
69
50
  #dclFetchTestCertificates = false;
70
51
  #allowTestOtaImages = false;
71
52
  #transportPreference;
53
+ #bleEnabled = false;
72
54
  #observers;
73
55
  constructor(nodeNum, netInterface) {
74
56
  this.#environment = Environment.default;
@@ -83,64 +65,129 @@ class MatterNode {
83
65
  return this.#environment;
84
66
  }
85
67
  get node() {
86
- if (this.commissioningController === void 0) {
87
- throw new Error("CommissioningController not initialized. Start first");
68
+ if (this.#node === void 0) {
69
+ throw new ImplementationError("Controller node not initialized. Call initialize() first.");
88
70
  }
89
- return this.commissioningController.node;
71
+ return this.#node;
72
+ }
73
+ /**
74
+ * The OTA provider endpoint on the controller node. The cast is unavoidable: `endpoints.for(id)` resolves by
75
+ * runtime id lookup, so it cannot statically know which endpoint type lives at "ota-provider".
76
+ */
77
+ get otaProviderEndpoint() {
78
+ return this.node.endpoints.for("ota-provider");
90
79
  }
91
80
  async otaService() {
81
+ await this.start();
92
82
  const service = await this.node.act((agent) => agent.get(DclBehavior).otaUpdateService);
93
83
  await service.construction;
94
84
  return service;
95
85
  }
96
86
  async certificateService() {
87
+ await this.start();
97
88
  const service = await this.node.act((agent) => agent.get(DclBehavior).certificateService);
98
89
  await service.construction;
99
90
  return service;
100
91
  }
101
92
  async vendorInfoService() {
93
+ await this.start();
102
94
  const service = await this.node.act((agent) => agent.get(DclBehavior).vendorInfoService);
103
95
  await service.construction;
104
96
  return service;
105
97
  }
106
- async initialize(resetStorage) {
107
- if (this.#environment) {
108
- if (this.#netInterface !== void 0) {
109
- this.#environment.vars.set("mdns.networkinterface", this.#netInterface);
98
+ async initialize(resetStorage, cleanupLegacyStorage = false) {
99
+ if (this.#netInterface !== void 0) {
100
+ this.#environment.vars.set("mdns.networkinterface", this.#netInterface);
101
+ }
102
+ const id = `shell-${this.#nodeNum.toString()}`;
103
+ const nodeEnvironment = new Environment(id, this.#environment);
104
+ this.#nodeEnvironment = nodeEnvironment;
105
+ this.#storageManager = await nodeEnvironment.get(StorageService).open(id);
106
+ this.#storageContext = this.#storageManager.createContext("Node");
107
+ this.#dclFetchTestCertificates = await this.#storageContext.get("DclFetchTestCertificates", false);
108
+ this.#allowTestOtaImages = await this.#storageContext.get("AllowTestOtaImages", false);
109
+ const storedPref = await this.#storageContext.get("TransportPreference", "");
110
+ this.#transportPreference = storedPref === "tcp" || storedPref === "udp" ? storedPref : void 0;
111
+ this.#bleEnabled = (nodeEnvironment.maybeGet(Ble) ?? Environment.default.maybeGet(Ble)) !== void 0;
112
+ if (nodeEnvironment.has(Filesystem)) {
113
+ this.#storageLocation = join(nodeEnvironment.get(Filesystem).path, id);
114
+ }
115
+ if (resetStorage) {
116
+ await (await this.#ensureNode()).erase();
117
+ await eraseLegacyStorage(nodeEnvironment, id);
118
+ return;
119
+ }
120
+ await migrateLegacyControllerCredentials(nodeEnvironment, id);
121
+ const node = await this.#ensureNode();
122
+ const { nodes, endpoints, failed } = await migrateLegacyCommissionedNodes(node);
123
+ if (nodes > 0) {
124
+ logger.info(`Legacy storage migration: ${nodes} node(s), ${endpoints} endpoint(s) migrated`);
125
+ }
126
+ if (failed > 0) {
127
+ logger.warn(`${failed} peer(s) failed to migrate; do not run --cleanup-legacy-storage until resolved`);
128
+ }
129
+ if (cleanupLegacyStorage) {
130
+ if (failed > 0) {
131
+ logger.warn(`Skipping --cleanup-legacy-storage this run: ${failed} peer(s) failed to migrate`);
132
+ } else {
133
+ await purgeLegacyStorage(nodeEnvironment, id);
110
134
  }
135
+ }
136
+ }
137
+ /**
138
+ * Lazily creates the controller {@link ServerNode} on first real use. Creation runs the controller behaviors
139
+ * (binding the mDNS socket), which is why boot defers it until {@link start}.
140
+ *
141
+ * Concurrent callers (e.g. two websocket requests) share one creation via {@link #nodePromise}, so the node is
142
+ * never built twice. A failed creation clears the cached promise so a subsequent call can retry.
143
+ */
144
+ async #ensureNode() {
145
+ if (this.#node !== void 0) {
146
+ return this.#node;
147
+ }
148
+ if (this.#nodePromise !== void 0) {
149
+ return this.#nodePromise;
150
+ }
151
+ if (this.#nodeEnvironment === void 0) {
152
+ throw new ImplementationError("Controller node accessed before initialize()");
153
+ }
154
+ this.#nodePromise = (async () => {
111
155
  const id = `shell-${this.#nodeNum.toString()}`;
112
- this.#storageManager = await this.#environment.get(StorageService).open(id);
113
- this.#storageContext = this.#storageManager.createContext("Node");
114
- this.#dclFetchTestCertificates = await this.#storageContext.get("DclFetchTestCertificates", false);
115
- this.#allowTestOtaImages = await this.#storageContext.get("AllowTestOtaImages", false);
116
- const storedPref = await this.#storageContext.get("TransportPreference", "");
117
- this.#transportPreference = storedPref === "tcp" || storedPref === "udp" ? storedPref : void 0;
118
- this.commissioningController = new CommissioningController({
119
- environment: {
120
- environment: this.#environment,
121
- id
156
+ const node = await ServerNode.create(ServerNode.RootEndpoint.with(ControllerBehavior), {
157
+ environment: this.#nodeEnvironment,
158
+ id,
159
+ network: {
160
+ ble: false,
161
+ tcp: true,
162
+ transportPreference: this.#transportPreference,
163
+ // The shell connects peers strictly on demand, so opt out of the online-time bulk connect.
164
+ autoStartCommissionedPeers: false
122
165
  },
123
- autoConnect: false,
124
- adminFabricLabel: "matter.js Shell",
125
- enableOtaProvider: true,
126
- tcp: true,
127
- transportPreference: this.#transportPreference,
128
166
  basicInformation: {
129
- productName: "matter.js Shell"
167
+ productName: ADMIN_FABRIC_LABEL
168
+ },
169
+ controller: {
170
+ adminFabricLabel: ADMIN_FABRIC_LABEL,
171
+ ble: this.#bleEnabled
172
+ },
173
+ commissioning: {
174
+ enabled: false
175
+ // The controller node is never commissionable itself.
176
+ },
177
+ subscriptions: {
178
+ persistenceEnabled: false
179
+ // Subscription persistence is a device feature, not a controller one.
130
180
  }
131
181
  });
132
- const env = this.commissioningController.env;
133
- if (env.has(Filesystem)) {
134
- this.#storageLocation = join(env.get(Filesystem).path, id);
135
- }
136
- if (resetStorage) {
137
- await this.commissioningController.node.erase();
138
- }
139
- } else {
140
- console.log(
141
- "Legacy support was removed in Matter.js 0.13. Please downgrade or migrate the storage manually"
142
- );
143
- process.exit(1);
182
+ await node.add(new Endpoint(OtaProviderEndpoint, { id: "ota-provider" }));
183
+ this.#node = node;
184
+ return node;
185
+ })();
186
+ try {
187
+ return await this.#nodePromise;
188
+ } catch (e) {
189
+ this.#nodePromise = void 0;
190
+ throw e;
144
191
  }
145
192
  }
146
193
  /** Whether OTA updates from the test DCL are offered in addition to production ones. */
@@ -155,101 +202,157 @@ class MatterNode {
155
202
  await this.Store.set("AllowTestOtaImages", value);
156
203
  }
157
204
  this.#allowTestOtaImages = value ?? false;
158
- if (this.#started && this.commissioningController !== void 0) {
159
- await this.commissioningController.otaProvider.setStateOf(SoftwareUpdateManager, {
205
+ if (this.#started && this.#node !== void 0) {
206
+ await this.otaProviderEndpoint.setStateOf(SoftwareUpdateManager, {
160
207
  allowTestOtaImages: this.#allowTestOtaImages
161
208
  });
162
209
  }
163
210
  }
164
211
  get Store() {
165
212
  if (!this.#storageContext) {
166
- throw new Error("Storage uninitialized");
213
+ throw new ImplementationError("Storage uninitialized");
167
214
  }
168
215
  return this.#storageContext;
169
216
  }
170
217
  async close() {
171
218
  try {
172
- await this.commissioningController?.close();
219
+ await this.#node?.close();
173
220
  } finally {
174
221
  this.#observers?.close();
175
222
  await this.#storageManager?.close();
176
223
  }
177
224
  }
225
+ /** Concurrent callers share one in-flight run via {@link #startPromise} so the setup below executes exactly once. */
178
226
  async start() {
179
227
  if (this.#started) {
180
228
  return;
181
229
  }
182
- logger.info(`matter.js shell controller started for node ${this.#nodeNum}`);
183
- if (this.commissioningController !== void 0) {
184
- await this.commissioningController.start();
185
- await this.commissioningController.node.setStateOf(DclBehavior, {
230
+ if (this.#startPromise !== void 0) {
231
+ return this.#startPromise;
232
+ }
233
+ this.#startPromise = (async () => {
234
+ logger.info(`matter.js shell controller started for node ${this.#nodeNum}`);
235
+ const node = await this.#ensureNode();
236
+ const fabricAuthority = await node.env.load(FabricAuthority);
237
+ this.#fabric = await fabricAuthority.defaultFabric({ adminFabricLabel: ADMIN_FABRIC_LABEL });
238
+ await node.start();
239
+ for (const peer of node.peers.commissioned) {
240
+ if (peer.stateOf(NetworkClient).autoSubscribe) {
241
+ await peer.setStateOf(NetworkClient, { autoSubscribe: false });
242
+ }
243
+ }
244
+ await node.setStateOf(DclBehavior, {
186
245
  fetchTestCertificates: this.#dclFetchTestCertificates
187
246
  });
188
- await this.commissioningController.otaProvider.setStateOf(SoftwareUpdateManager, {
247
+ await this.otaProviderEndpoint.setStateOf(SoftwareUpdateManager, {
189
248
  allowTestOtaImages: this.#allowTestOtaImages
190
249
  });
191
250
  if (await this.Store.has("ControllerFabricLabel")) {
192
- await this.commissioningController.updateFabricLabel(
193
- await this.Store.get("ControllerFabricLabel", "matter.js Shell")
194
- );
251
+ await this.#fabric.setLabel(await this.Store.get("ControllerFabricLabel", ADMIN_FABRIC_LABEL));
195
252
  }
196
- } else {
197
- throw new Error("No controller initialized");
198
- }
199
- this.#observers = this.#observers ?? new ObserverGroup(this.#environment.runtime);
200
- const updateManagerEvents = this.commissioningController.otaProvider.eventsOf(SoftwareUpdateManager);
201
- this.#observers.on(updateManagerEvents.updateAvailable, (peer, details) => {
202
- logger.info(`Update available for peer`, peer, `:`, details);
203
- });
204
- this.#observers.on(updateManagerEvents.updateDone, (peer) => {
205
- logger.info(`Update done for peer`, peer);
206
- });
207
- this.#observers.on(updateManagerEvents.updateFailed, (peer) => {
208
- logger.info(`Update failed for peer`, peer);
209
- });
210
- this.#started = true;
253
+ this.#observers = this.#observers ?? new ObserverGroup(this.#environment.runtime);
254
+ const updateManagerEvents = this.otaProviderEndpoint.eventsOf(SoftwareUpdateManager);
255
+ this.#observers.on(updateManagerEvents.updateAvailable, (peer, details) => {
256
+ logger.info(`Update available for peer`, peer, `:`, details);
257
+ });
258
+ this.#observers.on(updateManagerEvents.updateDone, (peer) => {
259
+ logger.info(`Update done for peer`, peer);
260
+ });
261
+ this.#observers.on(updateManagerEvents.updateFailed, (peer) => {
262
+ logger.info(`Update failed for peer`, peer);
263
+ });
264
+ installDiagnosticLogging(node, this.#observers);
265
+ this.#started = true;
266
+ })();
267
+ try {
268
+ await this.#startPromise;
269
+ } finally {
270
+ this.#startPromise = void 0;
271
+ }
211
272
  }
273
+ /**
274
+ * Returns the {@link ClientNode}s for the commissioned peers, connecting them (unless `autoConnect: false`).
275
+ * Nodes connect asynchronously; use {@link awaitSeeded} before relying on the endpoint structure.
276
+ */
212
277
  async connectAndGetNodes(nodeIdStr, connectOptions) {
213
278
  await this.start();
214
- const nodeId = nodeIdStr !== void 0 ? NodeId(BigInt(nodeIdStr)) : void 0;
215
- if (this.commissioningController === void 0) {
216
- throw new Error("CommissioningController not initialized");
217
- }
218
- const options = { ...createDiagnosticCallbacks(), ...connectOptions };
219
- if (nodeId === void 0) {
220
- return await this.commissioningController.connect(options);
279
+ const commissioned = this.node.peers.commissioned;
280
+ const singleNodeRequested = nodeIdStr !== void 0;
281
+ let nodes;
282
+ if (nodeIdStr !== void 0) {
283
+ const nodeId = NodeId(BigInt(nodeIdStr));
284
+ const node = commissioned.find((peer) => peer.peerAddress?.nodeId === nodeId);
285
+ if (node === void 0) {
286
+ throw new ImplementationError(`Node ${nodeId} is not commissioned!`);
287
+ }
288
+ nodes = [node];
289
+ } else {
290
+ nodes = commissioned;
221
291
  }
222
- const node = await this.commissioningController.connectNode(nodeId, {
223
- ...options
224
- });
225
- if (!node.initialized) {
226
- await node.events.initialized;
292
+ for (const node of nodes) {
293
+ try {
294
+ await this.#applyClientNodeNetworkOptions(node, connectOptions);
295
+ if (connectOptions?.autoConnect === false) {
296
+ continue;
297
+ }
298
+ if (node.stateOf(NetworkClient).isDisabled) {
299
+ await node.enable();
300
+ } else {
301
+ await node.start();
302
+ }
303
+ } catch (e) {
304
+ if (singleNodeRequested) {
305
+ throw e;
306
+ }
307
+ logger.warn(`Node ${node.peerAddress?.nodeId} failed to connect:`, e);
308
+ }
227
309
  }
228
- return [node];
310
+ return nodes;
229
311
  }
230
- get controller() {
231
- if (this.commissioningController === void 0) {
232
- throw new Error("CommissioningController not initialized. Start first");
312
+ async #applyClientNodeNetworkOptions(node, options) {
313
+ if (options?.autoSubscribe !== void 0) {
314
+ await node.setStateOf(NetworkClient, { autoSubscribe: options.autoSubscribe });
315
+ }
316
+ const { subscribeMinIntervalFloorSeconds, subscribeMaxIntervalCeilingSeconds } = options ?? {};
317
+ if (subscribeMinIntervalFloorSeconds !== void 0 || subscribeMaxIntervalCeilingSeconds !== void 0) {
318
+ const defaultSubscription = {};
319
+ if (subscribeMinIntervalFloorSeconds !== void 0) {
320
+ defaultSubscription.minIntervalFloor = Seconds(subscribeMinIntervalFloorSeconds);
321
+ }
322
+ if (subscribeMaxIntervalCeilingSeconds !== void 0) {
323
+ defaultSubscription.maxIntervalCeiling = Seconds(subscribeMaxIntervalCeilingSeconds);
324
+ }
325
+ await node.setStateOf(NetworkClient, { defaultSubscription });
233
326
  }
234
- return this.commissioningController;
235
327
  }
236
- async iterateNodeDevices(nodes, callback, endpointId) {
328
+ /**
329
+ * Iterates the endpoints of each {@link ClientNode}, including the root endpoint (number 0); pass
330
+ * {@link endpointIds} to restrict iteration.
331
+ */
332
+ async iterateNodeDevices(nodes, callback, endpointIds) {
237
333
  for (const node of nodes) {
238
- let devices = node.getDevices();
239
- if (endpointId !== void 0) {
240
- devices = devices.filter((device) => device.number === endpointId);
241
- }
242
- for (const device of devices) {
334
+ for (const device of node.endpoints) {
335
+ if (endpointIds !== void 0 && !endpointIds.includes(device.number)) {
336
+ continue;
337
+ }
243
338
  await callback(device, node);
244
339
  }
245
340
  }
246
341
  }
247
- updateFabricLabel(label) {
248
- return this.commissioningController?.updateFabricLabel(label);
342
+ /**
343
+ * Updates the controller's admin fabric label on the local fabric. Propagation to already-connected peers is not
344
+ * reproduced and moves to the node-management layer per docs/MIGRATION_CONTROLLER_018.md.
345
+ * MIGRATION-GAP: updatefabriclabel-note.
346
+ */
347
+ async updateFabricLabel(label) {
348
+ await this.start();
349
+ if (this.#fabric === void 0) {
350
+ throw new InternalError("Controller fabric not initialized");
351
+ }
352
+ await this.#fabric.setLabel(label);
249
353
  }
250
354
  }
251
355
  export {
252
- MatterNode,
253
- createDiagnosticCallbacks
356
+ MatterNode
254
357
  };
255
358
  //# sourceMappingURL=MatterNode.js.map
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/MatterNode.ts"],
4
- "mappings": "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",
4
+ "mappings": "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",
5
5
  "names": []
6
6
  }
package/dist/esm/app.js CHANGED
@@ -67,6 +67,11 @@ async function main() {
67
67
  default: false,
68
68
  type: "boolean"
69
69
  },
70
+ "cleanup-legacy-storage": {
71
+ description: "Irreversibly delete pre-0.16 storage artifacts after migration. Only use this once you are certain the migration succeeded and you will not downgrade below 0.16.",
72
+ default: false,
73
+ type: "boolean"
74
+ },
70
75
  netInterface: {
71
76
  description: "Network interface to use for MDNS announcements and scanning.",
72
77
  type: "string",
@@ -109,6 +114,7 @@ async function main() {
109
114
  bleHciId,
110
115
  nodeType,
111
116
  factoryReset,
117
+ cleanupLegacyStorage,
112
118
  netInterface,
113
119
  logfile,
114
120
  webSocketInterface,
@@ -116,8 +122,14 @@ async function main() {
116
122
  webServer,
117
123
  webAddress
118
124
  } = argv;
125
+ if (bleEnable) {
126
+ Environment.default.vars.set("ble.enable", true);
127
+ }
128
+ if (bleHciId !== void 0) {
129
+ Environment.default.vars.set("ble.hci.id", bleHciId);
130
+ }
119
131
  theNode = new MatterNode(nodeNum, netInterface);
120
- await theNode.initialize(factoryReset);
132
+ await theNode.initialize(factoryReset, cleanupLegacyStorage);
121
133
  if (logfile !== void 0) {
122
134
  await theNode.Store.set("LogFile", logfile);
123
135
  }
@@ -138,12 +150,6 @@ async function main() {
138
150
  } else {
139
151
  theShell = new Shell(theNode, nodeNum, PROMPT, process.stdin, process.stdout);
140
152
  }
141
- if (bleEnable) {
142
- Environment.default.vars.set("ble.enable", true);
143
- }
144
- if (bleHciId !== void 0) {
145
- Environment.default.vars.set("ble.hci.id", bleHciId);
146
- }
147
153
  console.log(`Started Node #${nodeNum} (Type: ${nodeType}) ${bleEnable ? "with" : "without"} BLE`);
148
154
  if (!webSocketInterface) {
149
155
  theShell.start(theNode.storageLocation);
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/app.ts"],
4
- "mappings": "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",
4
+ "mappings": "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",
5
5
  "names": ["yargs"]
6
6
  }