@matter-server/ws-controller 0.5.4 → 0.5.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/esm/controller/MatterController.d.ts +9 -12
- package/dist/esm/controller/MatterController.d.ts.map +1 -1
- package/dist/esm/controller/MatterController.js +40 -33
- package/dist/esm/controller/MatterController.js.map +1 -1
- package/package.json +5 -5
- package/src/controller/MatterController.ts +46 -39
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
* Copyright 2025-2026 Open Home Foundation
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
|
5
5
|
*/
|
|
6
|
-
import { Bytes, Crypto, Environment,
|
|
7
|
-
import {
|
|
6
|
+
import { Bytes, Crypto, Environment, Timestamp } from "@matter/main";
|
|
7
|
+
import { VendorInfo } from "@matter/main/protocol";
|
|
8
8
|
import { ConfigStorage } from "../server/ConfigStorage.js";
|
|
9
9
|
import { ControllerCommandHandler } from "./ControllerCommandHandler.js";
|
|
10
10
|
import { LegacyServerData } from "./LegacyDataInjector.js";
|
|
@@ -24,20 +24,21 @@ export declare class MatterController {
|
|
|
24
24
|
constructor(environment: Environment, config: ConfigStorage, options: MatterControllerOptions, serverId: string);
|
|
25
25
|
protected initialize(vendorId?: number, fabricId?: number | bigint, legacyCommissionedDates?: Map<string, Timestamp>): Promise<void>;
|
|
26
26
|
get commandHandler(): ControllerCommandHandler;
|
|
27
|
-
/**
|
|
28
|
-
* Get the shared environment services instance.
|
|
29
|
-
*/
|
|
30
|
-
get services(): SharedEnvironmentServices;
|
|
31
27
|
/**
|
|
32
28
|
* Get the DCL vendor info service instance.
|
|
33
29
|
* Lazily initializes the service if not already present.
|
|
34
30
|
*/
|
|
35
|
-
|
|
31
|
+
vendorInfoService(): Promise<import("@matter/main/protocol").DclVendorInfoService>;
|
|
36
32
|
/**
|
|
37
33
|
* Get the DCL certificate service instance
|
|
38
34
|
* Lazily initializes the service if not already present.
|
|
39
35
|
*/
|
|
40
|
-
|
|
36
|
+
certificateService(): Promise<import("@matter/main/protocol").DclCertificateService>;
|
|
37
|
+
/**
|
|
38
|
+
* Get the DCL OTA update service instance
|
|
39
|
+
* Lazily initializes the service if not already present.
|
|
40
|
+
*/
|
|
41
|
+
otaUpdateService(): Promise<import("@matter/main/protocol").DclOtaUpdateService>;
|
|
41
42
|
/**
|
|
42
43
|
* Get vendor information by vendor ID.
|
|
43
44
|
* Returns undefined if the vendor is not found.
|
|
@@ -55,9 +56,5 @@ export declare class MatterController {
|
|
|
55
56
|
* @returns true if stored successfully
|
|
56
57
|
*/
|
|
57
58
|
storeOtaImageFromFile(filePath: string): Promise<boolean>;
|
|
58
|
-
/**
|
|
59
|
-
* Close the services when shutting down.
|
|
60
|
-
*/
|
|
61
|
-
closeServices(): Promise<void>;
|
|
62
59
|
}
|
|
63
60
|
//# sourceMappingURL=MatterController.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MatterController.d.ts","sourceRoot":"","sources":["../../../src/controller/MatterController.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACH,KAAK,EAEL,MAAM,
|
|
1
|
+
{"version":3,"file":"MatterController.d.ts","sourceRoot":"","sources":["../../../src/controller/MatterController.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACH,KAAK,EAEL,MAAM,EAEN,WAAW,EAOX,SAAS,EACZ,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAInD,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AACzE,OAAO,EAAsB,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAG/E,OAAO,oBAAoB,CAAC;AAI5B,wBAAsB,uBAAuB,CACzC,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,GAAG,MAAM,EACzB,KAAK,EAAE,KAAK,GACb,OAAO,CAAC,MAAM,CAAC,CAEjB;AAED,MAAM,WAAW,uBAAuB;IACpC,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,+HAA+H;IAC/H,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,qGAAqG;IACrG,aAAa,CAAC,EAAE,MAAM,CAAC;CAC1B;AAmBD,qBAAa,gBAAgB;;WAWZ,MAAM,CACf,WAAW,EAAE,WAAW,EACxB,MAAM,EAAE,aAAa,EACrB,OAAO,EAAE,uBAAuB,EAChC,UAAU,CAAC,EAAE,gBAAgB;gBA2DrB,WAAW,EAAE,WAAW,EAAE,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE,uBAAuB,EAAE,QAAQ,EAAE,MAAM;cAS/F,UAAU,CACtB,QAAQ,CAAC,EAAE,MAAM,EACjB,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,EAC1B,uBAAuB,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC;IA0BpD,IAAI,cAAc,6BAuCjB;IAED;;;OAGG;IACG,iBAAiB;IASvB;;;OAGG;IACG,kBAAkB;IASxB;;;OAGG;IACG,gBAAgB;IAStB;;;OAGG;IACG,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC;IAItE;;OAEG;IACG,aAAa,IAAI,OAAO,CAAC,WAAW,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAIzD,uBAAuB;IAkBvB,IAAI;IAkBV;;;;OAIG;IACG,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAoBlE"}
|
|
@@ -6,14 +6,15 @@
|
|
|
6
6
|
import {
|
|
7
7
|
CommissioningClient,
|
|
8
8
|
Crypto,
|
|
9
|
+
DclBehavior,
|
|
9
10
|
FabricId,
|
|
10
11
|
GlobalFabricId,
|
|
11
12
|
Logger,
|
|
13
|
+
MatterAggregateError,
|
|
12
14
|
NodeId,
|
|
13
15
|
SoftwareUpdateManager,
|
|
14
16
|
Timestamp
|
|
15
17
|
} from "@matter/main";
|
|
16
|
-
import { DclCertificateService, DclOtaUpdateService, DclVendorInfoService } from "@matter/main/protocol";
|
|
17
18
|
import { VendorId } from "@matter/main/types";
|
|
18
19
|
import { CommissioningController } from "@project-chip/matter.js";
|
|
19
20
|
import { Readable } from "node:stream";
|
|
@@ -35,7 +36,6 @@ function parseVersionToNumber(version) {
|
|
|
35
36
|
}
|
|
36
37
|
class MatterController {
|
|
37
38
|
#env;
|
|
38
|
-
#services;
|
|
39
39
|
#controllerInstance;
|
|
40
40
|
#commandHandler;
|
|
41
41
|
#config;
|
|
@@ -125,8 +125,6 @@ class MatterController {
|
|
|
125
125
|
// Base version without alpha/beta suffix
|
|
126
126
|
}
|
|
127
127
|
});
|
|
128
|
-
this.vendorInfoService;
|
|
129
|
-
this.certificateService;
|
|
130
128
|
}
|
|
131
129
|
get commandHandler() {
|
|
132
130
|
if (this.#controllerInstance === void 0) {
|
|
@@ -139,59 +137,75 @@ class MatterController {
|
|
|
139
137
|
!this.#disableOtaProvider
|
|
140
138
|
);
|
|
141
139
|
this.#commandHandler.events.started.once(async () => {
|
|
140
|
+
this.#controllerInstance.node.behaviors.require(DclBehavior, {
|
|
141
|
+
fetchTestCertificates: this.#enableTestNetDcl
|
|
142
|
+
});
|
|
143
|
+
const initPromises = new Array();
|
|
142
144
|
if (this.#legacyCommissionedDates !== void 0) {
|
|
143
|
-
|
|
145
|
+
initPromises.push(this.injectCommissionedDates());
|
|
144
146
|
}
|
|
147
|
+
initPromises.push(this.vendorInfoService());
|
|
148
|
+
initPromises.push(this.certificateService());
|
|
145
149
|
if (!this.#disableOtaProvider && this.#enableTestNetDcl) {
|
|
146
|
-
|
|
150
|
+
initPromises.push(this.#enableTestOtaImages());
|
|
151
|
+
}
|
|
152
|
+
try {
|
|
153
|
+
await MatterAggregateError.allSettled(initPromises);
|
|
154
|
+
} catch (error) {
|
|
155
|
+
logger.error("Error initializing controller additional services", error);
|
|
147
156
|
}
|
|
148
157
|
});
|
|
149
158
|
}
|
|
150
159
|
return this.#commandHandler;
|
|
151
160
|
}
|
|
152
161
|
/**
|
|
153
|
-
* Get the
|
|
162
|
+
* Get the DCL vendor info service instance.
|
|
163
|
+
* Lazily initializes the service if not already present.
|
|
154
164
|
*/
|
|
155
|
-
|
|
156
|
-
if (this.#
|
|
157
|
-
|
|
165
|
+
async vendorInfoService() {
|
|
166
|
+
if (this.#controllerInstance === void 0) {
|
|
167
|
+
throw new Error("Controller not initialized");
|
|
158
168
|
}
|
|
159
|
-
|
|
169
|
+
const service = await this.#controllerInstance.node.act((agent) => agent.get(DclBehavior).vendorInfoService);
|
|
170
|
+
await service.construction;
|
|
171
|
+
return service;
|
|
160
172
|
}
|
|
161
173
|
/**
|
|
162
|
-
* Get the DCL
|
|
174
|
+
* Get the DCL certificate service instance
|
|
163
175
|
* Lazily initializes the service if not already present.
|
|
164
176
|
*/
|
|
165
|
-
|
|
166
|
-
if (
|
|
167
|
-
new
|
|
177
|
+
async certificateService() {
|
|
178
|
+
if (this.#controllerInstance === void 0) {
|
|
179
|
+
throw new Error("Controller not initialized");
|
|
168
180
|
}
|
|
169
|
-
|
|
181
|
+
const service = await this.#controllerInstance.node.act((agent) => agent.get(DclBehavior).certificateService);
|
|
182
|
+
await service.construction;
|
|
183
|
+
return service;
|
|
170
184
|
}
|
|
171
185
|
/**
|
|
172
|
-
* Get the DCL
|
|
186
|
+
* Get the DCL OTA update service instance
|
|
173
187
|
* Lazily initializes the service if not already present.
|
|
174
188
|
*/
|
|
175
|
-
|
|
176
|
-
if (
|
|
177
|
-
new
|
|
189
|
+
async otaUpdateService() {
|
|
190
|
+
if (this.#controllerInstance === void 0) {
|
|
191
|
+
throw new Error("Controller not initialized");
|
|
178
192
|
}
|
|
179
|
-
|
|
193
|
+
const service = await this.#controllerInstance.node.act((agent) => agent.get(DclBehavior).otaUpdateService);
|
|
194
|
+
await service.construction;
|
|
195
|
+
return service;
|
|
180
196
|
}
|
|
181
197
|
/**
|
|
182
198
|
* Get vendor information by vendor ID.
|
|
183
199
|
* Returns undefined if the vendor is not found.
|
|
184
200
|
*/
|
|
185
201
|
async getVendorInfo(vendorId) {
|
|
186
|
-
await this.vendorInfoService.
|
|
187
|
-
return this.vendorInfoService.infoFor(vendorId);
|
|
202
|
+
return (await this.vendorInfoService()).infoFor(vendorId);
|
|
188
203
|
}
|
|
189
204
|
/**
|
|
190
205
|
* Get all vendor information from the DCL service.
|
|
191
206
|
*/
|
|
192
207
|
async getAllVendors() {
|
|
193
|
-
await this.vendorInfoService.
|
|
194
|
-
return this.vendorInfoService.vendors;
|
|
208
|
+
return (await this.vendorInfoService()).vendors;
|
|
195
209
|
}
|
|
196
210
|
async injectCommissionedDates() {
|
|
197
211
|
if (this.#controllerInstance === void 0 || this.#legacyCommissionedDates === void 0) {
|
|
@@ -212,7 +226,6 @@ class MatterController {
|
|
|
212
226
|
}
|
|
213
227
|
async stop() {
|
|
214
228
|
await this.#commandHandler?.close();
|
|
215
|
-
await this.#services?.close();
|
|
216
229
|
}
|
|
217
230
|
/**
|
|
218
231
|
* Enable test OTA images (test-net DCL).
|
|
@@ -235,7 +248,7 @@ class MatterController {
|
|
|
235
248
|
async storeOtaImageFromFile(filePath) {
|
|
236
249
|
const { createReadStream } = await import("node:fs");
|
|
237
250
|
const { pathToFileURL } = await import("node:url");
|
|
238
|
-
const otaService = this.
|
|
251
|
+
const otaService = await this.otaUpdateService();
|
|
239
252
|
const fileUrl = pathToFileURL(filePath).href;
|
|
240
253
|
const infoStream = Readable.toWeb(createReadStream(filePath));
|
|
241
254
|
const updateInfo = await otaService.updateInfoFromStream(infoStream, fileUrl);
|
|
@@ -246,12 +259,6 @@ class MatterController {
|
|
|
246
259
|
await otaService.store(storeStream, updateInfo, "local");
|
|
247
260
|
return true;
|
|
248
261
|
}
|
|
249
|
-
/**
|
|
250
|
-
* Close the services when shutting down.
|
|
251
|
-
*/
|
|
252
|
-
async closeServices() {
|
|
253
|
-
await this.#services?.close();
|
|
254
|
-
}
|
|
255
262
|
}
|
|
256
263
|
export {
|
|
257
264
|
MatterController,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/controller/MatterController.ts"],
|
|
4
|
-
"mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;AAMA;AAAA,EAEI;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,
|
|
4
|
+
"mappings": "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",
|
|
5
5
|
"names": []
|
|
6
6
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@matter-server/ws-controller",
|
|
3
|
-
"version": "0.5.
|
|
3
|
+
"version": "0.5.5",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "matter.js based Matter controller library",
|
|
6
6
|
"bugs": {
|
|
@@ -22,15 +22,15 @@
|
|
|
22
22
|
"node": ">=20.19.0 <22.0.0 || >=22.13.0"
|
|
23
23
|
},
|
|
24
24
|
"optionalDependencies": {
|
|
25
|
-
"@matter/nodejs-ble": "0.17.0-alpha.0-
|
|
25
|
+
"@matter/nodejs-ble": "0.17.0-alpha.0-20260311-5fb2f183e"
|
|
26
26
|
},
|
|
27
27
|
"dependencies": {
|
|
28
|
-
"@matter/main": "0.17.0-alpha.0-
|
|
29
|
-
"@project-chip/matter.js": "0.17.0-alpha.0-
|
|
28
|
+
"@matter/main": "0.17.0-alpha.0-20260311-5fb2f183e",
|
|
29
|
+
"@project-chip/matter.js": "0.17.0-alpha.0-20260311-5fb2f183e",
|
|
30
30
|
"ws": "^8.19.0"
|
|
31
31
|
},
|
|
32
32
|
"devDependencies": {
|
|
33
|
-
"@types/node": "^25.
|
|
33
|
+
"@types/node": "^25.4.0",
|
|
34
34
|
"@types/ws": "^8.18.1"
|
|
35
35
|
},
|
|
36
36
|
"files": [
|
|
@@ -8,16 +8,17 @@ import {
|
|
|
8
8
|
Bytes,
|
|
9
9
|
CommissioningClient,
|
|
10
10
|
Crypto,
|
|
11
|
+
DclBehavior,
|
|
11
12
|
Environment,
|
|
12
13
|
FabricId,
|
|
13
14
|
GlobalFabricId,
|
|
14
15
|
Logger,
|
|
16
|
+
MatterAggregateError,
|
|
15
17
|
NodeId,
|
|
16
|
-
SharedEnvironmentServices,
|
|
17
18
|
SoftwareUpdateManager,
|
|
18
19
|
Timestamp,
|
|
19
20
|
} from "@matter/main";
|
|
20
|
-
import {
|
|
21
|
+
import { VendorInfo } from "@matter/main/protocol";
|
|
21
22
|
import { VendorId } from "@matter/main/types";
|
|
22
23
|
import { CommissioningController } from "@project-chip/matter.js";
|
|
23
24
|
import { Readable } from "node:stream";
|
|
@@ -66,7 +67,6 @@ function parseVersionToNumber(version: string): number {
|
|
|
66
67
|
|
|
67
68
|
export class MatterController {
|
|
68
69
|
#env: Environment;
|
|
69
|
-
#services?: SharedEnvironmentServices;
|
|
70
70
|
#controllerInstance?: CommissioningController;
|
|
71
71
|
#commandHandler?: ControllerCommandHandler;
|
|
72
72
|
#config: ConfigStorage;
|
|
@@ -175,12 +175,6 @@ export class MatterController {
|
|
|
175
175
|
softwareVersionString: this.#serverVersion.split("-")[0], // Base version without alpha/beta suffix
|
|
176
176
|
},
|
|
177
177
|
});
|
|
178
|
-
|
|
179
|
-
// Start loading and initialization of meta data
|
|
180
|
-
/* eslint-disable @typescript-eslint/no-unused-expressions */
|
|
181
|
-
this.vendorInfoService;
|
|
182
|
-
/* eslint-disable @typescript-eslint/no-unused-expressions */
|
|
183
|
-
this.certificateService;
|
|
184
178
|
}
|
|
185
179
|
|
|
186
180
|
get commandHandler() {
|
|
@@ -195,12 +189,28 @@ export class MatterController {
|
|
|
195
189
|
);
|
|
196
190
|
|
|
197
191
|
this.#commandHandler.events.started.once(async () => {
|
|
192
|
+
this.#controllerInstance!.node.behaviors.require(DclBehavior, {
|
|
193
|
+
fetchTestCertificates: this.#enableTestNetDcl,
|
|
194
|
+
});
|
|
195
|
+
|
|
196
|
+
const initPromises = new Array<Promise<unknown>>();
|
|
197
|
+
|
|
198
198
|
if (this.#legacyCommissionedDates !== undefined) {
|
|
199
|
-
|
|
199
|
+
initPromises.push(this.injectCommissionedDates());
|
|
200
200
|
}
|
|
201
201
|
|
|
202
|
+
// Start loading and initialization of meta data
|
|
203
|
+
initPromises.push(this.vendorInfoService());
|
|
204
|
+
initPromises.push(this.certificateService());
|
|
205
|
+
|
|
202
206
|
if (!this.#disableOtaProvider && this.#enableTestNetDcl) {
|
|
203
|
-
|
|
207
|
+
initPromises.push(this.#enableTestOtaImages());
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
try {
|
|
211
|
+
await MatterAggregateError.allSettled(initPromises);
|
|
212
|
+
} catch (error) {
|
|
213
|
+
logger.error("Error initializing controller additional services", error);
|
|
204
214
|
}
|
|
205
215
|
});
|
|
206
216
|
}
|
|
@@ -209,35 +219,42 @@ export class MatterController {
|
|
|
209
219
|
}
|
|
210
220
|
|
|
211
221
|
/**
|
|
212
|
-
* Get the
|
|
222
|
+
* Get the DCL vendor info service instance.
|
|
223
|
+
* Lazily initializes the service if not already present.
|
|
213
224
|
*/
|
|
214
|
-
|
|
215
|
-
if (this.#
|
|
216
|
-
|
|
225
|
+
async vendorInfoService() {
|
|
226
|
+
if (this.#controllerInstance === undefined) {
|
|
227
|
+
throw new Error("Controller not initialized");
|
|
217
228
|
}
|
|
218
|
-
|
|
229
|
+
const service = await this.#controllerInstance.node.act(agent => agent.get(DclBehavior).vendorInfoService);
|
|
230
|
+
await service.construction;
|
|
231
|
+
return service;
|
|
219
232
|
}
|
|
220
233
|
|
|
221
234
|
/**
|
|
222
|
-
* Get the DCL
|
|
235
|
+
* Get the DCL certificate service instance
|
|
223
236
|
* Lazily initializes the service if not already present.
|
|
224
237
|
*/
|
|
225
|
-
|
|
226
|
-
if (
|
|
227
|
-
new
|
|
238
|
+
async certificateService() {
|
|
239
|
+
if (this.#controllerInstance === undefined) {
|
|
240
|
+
throw new Error("Controller not initialized");
|
|
228
241
|
}
|
|
229
|
-
|
|
242
|
+
const service = await this.#controllerInstance.node.act(agent => agent.get(DclBehavior).certificateService);
|
|
243
|
+
await service.construction;
|
|
244
|
+
return service;
|
|
230
245
|
}
|
|
231
246
|
|
|
232
247
|
/**
|
|
233
|
-
* Get the DCL
|
|
248
|
+
* Get the DCL OTA update service instance
|
|
234
249
|
* Lazily initializes the service if not already present.
|
|
235
250
|
*/
|
|
236
|
-
|
|
237
|
-
if (
|
|
238
|
-
new
|
|
251
|
+
async otaUpdateService() {
|
|
252
|
+
if (this.#controllerInstance === undefined) {
|
|
253
|
+
throw new Error("Controller not initialized");
|
|
239
254
|
}
|
|
240
|
-
|
|
255
|
+
const service = await this.#controllerInstance.node.act(agent => agent.get(DclBehavior).otaUpdateService);
|
|
256
|
+
await service.construction;
|
|
257
|
+
return service;
|
|
241
258
|
}
|
|
242
259
|
|
|
243
260
|
/**
|
|
@@ -245,16 +262,14 @@ export class MatterController {
|
|
|
245
262
|
* Returns undefined if the vendor is not found.
|
|
246
263
|
*/
|
|
247
264
|
async getVendorInfo(vendorId: number): Promise<VendorInfo | undefined> {
|
|
248
|
-
await this.vendorInfoService.
|
|
249
|
-
return this.vendorInfoService.infoFor(vendorId);
|
|
265
|
+
return (await this.vendorInfoService()).infoFor(vendorId);
|
|
250
266
|
}
|
|
251
267
|
|
|
252
268
|
/**
|
|
253
269
|
* Get all vendor information from the DCL service.
|
|
254
270
|
*/
|
|
255
271
|
async getAllVendors(): Promise<ReadonlyMap<number, VendorInfo>> {
|
|
256
|
-
await this.vendorInfoService.
|
|
257
|
-
return this.vendorInfoService.vendors;
|
|
272
|
+
return (await this.vendorInfoService()).vendors;
|
|
258
273
|
}
|
|
259
274
|
|
|
260
275
|
async injectCommissionedDates() {
|
|
@@ -277,7 +292,6 @@ export class MatterController {
|
|
|
277
292
|
|
|
278
293
|
async stop() {
|
|
279
294
|
await this.#commandHandler?.close(); // This closes also the controller instance if started
|
|
280
|
-
await this.#services?.close();
|
|
281
295
|
}
|
|
282
296
|
|
|
283
297
|
/**
|
|
@@ -302,7 +316,7 @@ export class MatterController {
|
|
|
302
316
|
async storeOtaImageFromFile(filePath: string): Promise<boolean> {
|
|
303
317
|
const { createReadStream } = await import("node:fs");
|
|
304
318
|
const { pathToFileURL } = await import("node:url");
|
|
305
|
-
const otaService = this.
|
|
319
|
+
const otaService = await this.otaUpdateService();
|
|
306
320
|
|
|
307
321
|
// Convert file path to file:// URL for the OTA service
|
|
308
322
|
const fileUrl = pathToFileURL(filePath).href;
|
|
@@ -319,11 +333,4 @@ export class MatterController {
|
|
|
319
333
|
await otaService.store(storeStream, updateInfo, "local");
|
|
320
334
|
return true;
|
|
321
335
|
}
|
|
322
|
-
|
|
323
|
-
/**
|
|
324
|
-
* Close the services when shutting down.
|
|
325
|
-
*/
|
|
326
|
-
async closeServices() {
|
|
327
|
-
await this.#services?.close();
|
|
328
|
-
}
|
|
329
336
|
}
|