@matter/nodejs-shell 0.17.0-alpha.0-20260507-059f7763b → 0.17.0-alpha.0-20260508-29ff5ae9e
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/package.json +9 -9
- package/src/MatterNode.ts +13 -12
- package/src/shell/cmd_cert.ts +34 -0
- package/src/shell/cmd_commission.ts +24 -1
- package/src/shell/cmd_config.ts +140 -0
- package/src/shell/cmd_nodes.ts +1 -3
- package/dist/esm/MatterNode.js +0 -189
- package/dist/esm/MatterNode.js.map +0 -6
- package/dist/esm/app.js +0 -167
- package/dist/esm/app.js.map +0 -6
- package/dist/esm/package.json +0 -3
- package/dist/esm/shell/Shell.js +0 -201
- package/dist/esm/shell/Shell.js.map +0 -6
- package/dist/esm/shell/cmd_cert.js +0 -134
- package/dist/esm/shell/cmd_cert.js.map +0 -6
- package/dist/esm/shell/cmd_cluster-attributes.js +0 -295
- package/dist/esm/shell/cmd_cluster-attributes.js.map +0 -6
- package/dist/esm/shell/cmd_cluster-commands.js +0 -137
- package/dist/esm/shell/cmd_cluster-commands.js.map +0 -6
- package/dist/esm/shell/cmd_cluster-events.js +0 -77
- package/dist/esm/shell/cmd_cluster-events.js.map +0 -6
- package/dist/esm/shell/cmd_commission.js +0 -269
- package/dist/esm/shell/cmd_commission.js.map +0 -6
- package/dist/esm/shell/cmd_config.js +0 -462
- package/dist/esm/shell/cmd_config.js.map +0 -6
- package/dist/esm/shell/cmd_dcl.js +0 -178
- package/dist/esm/shell/cmd_dcl.js.map +0 -6
- package/dist/esm/shell/cmd_discover.js +0 -115
- package/dist/esm/shell/cmd_discover.js.map +0 -6
- package/dist/esm/shell/cmd_identify.js +0 -46
- package/dist/esm/shell/cmd_identify.js.map +0 -6
- package/dist/esm/shell/cmd_nodes.js +0 -688
- package/dist/esm/shell/cmd_nodes.js.map +0 -6
- package/dist/esm/shell/cmd_ota.js +0 -493
- package/dist/esm/shell/cmd_ota.js.map +0 -6
- package/dist/esm/shell/cmd_session.js +0 -23
- package/dist/esm/shell/cmd_session.js.map +0 -6
- package/dist/esm/shell/cmd_subscribe.js +0 -39
- package/dist/esm/shell/cmd_subscribe.js.map +0 -6
- package/dist/esm/shell/cmd_tlv.js +0 -167
- package/dist/esm/shell/cmd_tlv.js.map +0 -6
- package/dist/esm/shell/cmd_vendor.js +0 -135
- package/dist/esm/shell/cmd_vendor.js.map +0 -6
- package/dist/esm/util/CommandlineParser.js +0 -87
- package/dist/esm/util/CommandlineParser.js.map +0 -6
- package/dist/esm/util/Json.js +0 -45
- package/dist/esm/util/Json.js.map +0 -6
- package/dist/esm/web_plumbing.js +0 -140
- package/dist/esm/web_plumbing.js.map +0 -6
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@matter/nodejs-shell",
|
|
3
|
-
"version": "0.17.0-alpha.0-
|
|
3
|
+
"version": "0.17.0-alpha.0-20260508-29ff5ae9e",
|
|
4
4
|
"description": "Shell app for Matter controller",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"iot",
|
|
@@ -34,14 +34,14 @@
|
|
|
34
34
|
"matter-shell": "dist/cjs/app.js"
|
|
35
35
|
},
|
|
36
36
|
"dependencies": {
|
|
37
|
-
"@matter/general": "0.17.0-alpha.0-
|
|
38
|
-
"@matter/model": "0.17.0-alpha.0-
|
|
39
|
-
"@matter/node": "0.17.0-alpha.0-
|
|
40
|
-
"@matter/nodejs": "0.17.0-alpha.0-
|
|
41
|
-
"@matter/nodejs-ble": "0.17.0-alpha.0-
|
|
42
|
-
"@matter/protocol": "0.17.0-alpha.0-
|
|
43
|
-
"@matter/types": "0.17.0-alpha.0-
|
|
44
|
-
"@project-chip/matter.js": "0.17.0-alpha.0-
|
|
37
|
+
"@matter/general": "0.17.0-alpha.0-20260508-29ff5ae9e",
|
|
38
|
+
"@matter/model": "0.17.0-alpha.0-20260508-29ff5ae9e",
|
|
39
|
+
"@matter/node": "0.17.0-alpha.0-20260508-29ff5ae9e",
|
|
40
|
+
"@matter/nodejs": "0.17.0-alpha.0-20260508-29ff5ae9e",
|
|
41
|
+
"@matter/nodejs-ble": "0.17.0-alpha.0-20260508-29ff5ae9e",
|
|
42
|
+
"@matter/protocol": "0.17.0-alpha.0-20260508-29ff5ae9e",
|
|
43
|
+
"@matter/types": "0.17.0-alpha.0-20260508-29ff5ae9e",
|
|
44
|
+
"@project-chip/matter.js": "0.17.0-alpha.0-20260508-29ff5ae9e",
|
|
45
45
|
"ws": "^8.20.0",
|
|
46
46
|
"yargs": "^18.0.0"
|
|
47
47
|
},
|
package/src/MatterNode.ts
CHANGED
|
@@ -33,6 +33,7 @@ export class MatterNode {
|
|
|
33
33
|
readonly #netInterface?: string;
|
|
34
34
|
#dclFetchTestCertificates = false;
|
|
35
35
|
#allowTestOtaImages = false;
|
|
36
|
+
#transportPreference?: "tcp" | "udp";
|
|
36
37
|
#observers?: ObserverGroup;
|
|
37
38
|
|
|
38
39
|
constructor(nodeNum: number, netInterface?: string) {
|
|
@@ -88,8 +89,18 @@ export class MatterNode {
|
|
|
88
89
|
this.#environment.vars.set("mdns.networkinterface", this.#netInterface);
|
|
89
90
|
}
|
|
90
91
|
|
|
91
|
-
// Build up the "Not-so-legacy" Controller
|
|
92
92
|
const id = `shell-${this.#nodeNum.toString()}`;
|
|
93
|
+
|
|
94
|
+
// Open storage up front so persisted settings can flow into the CommissioningController constructor.
|
|
95
|
+
this.#storageManager = await this.#environment.get(StorageService).open(id);
|
|
96
|
+
this.#storageContext = this.#storageManager.createContext("Node");
|
|
97
|
+
|
|
98
|
+
this.#dclFetchTestCertificates = await this.#storageContext.get<boolean>("DclFetchTestCertificates", false);
|
|
99
|
+
this.#allowTestOtaImages = await this.#storageContext.get<boolean>("AllowTestOtaImages", false);
|
|
100
|
+
const storedPref = await this.#storageContext.get<string>("TransportPreference", "");
|
|
101
|
+
this.#transportPreference = storedPref === "tcp" || storedPref === "udp" ? storedPref : undefined;
|
|
102
|
+
|
|
103
|
+
// Build up the "Not-so-legacy" Controller
|
|
93
104
|
this.commissioningController = new CommissioningController({
|
|
94
105
|
environment: {
|
|
95
106
|
environment: this.#environment,
|
|
@@ -99,6 +110,7 @@ export class MatterNode {
|
|
|
99
110
|
adminFabricLabel: "matter.js Shell",
|
|
100
111
|
enableOtaProvider: true,
|
|
101
112
|
tcp: true,
|
|
113
|
+
transportPreference: this.#transportPreference,
|
|
102
114
|
basicInformation: {
|
|
103
115
|
productName: "matter.js Shell",
|
|
104
116
|
},
|
|
@@ -112,17 +124,6 @@ export class MatterNode {
|
|
|
112
124
|
if (resetStorage) {
|
|
113
125
|
await this.commissioningController.node.erase();
|
|
114
126
|
}
|
|
115
|
-
|
|
116
|
-
// We side open a storage with the same ID as the ServerNode but only care about the "Node" sub context which
|
|
117
|
-
// is consistent.
|
|
118
|
-
this.#storageManager = await env.get(StorageService).open(id);
|
|
119
|
-
this.#storageContext = this.#storageManager.createContext("Node");
|
|
120
|
-
|
|
121
|
-
// Read DCL test certificates setting
|
|
122
|
-
this.#dclFetchTestCertificates = await this.#storageContext.get<boolean>("DclFetchTestCertificates", false);
|
|
123
|
-
|
|
124
|
-
// Read OTA test images setting
|
|
125
|
-
this.#allowTestOtaImages = await this.#storageContext.get<boolean>("AllowTestOtaImages", false);
|
|
126
127
|
} else {
|
|
127
128
|
console.log(
|
|
128
129
|
"Legacy support was removed in Matter.js 0.13. Please downgrade or migrate the storage manually",
|
package/src/shell/cmd_cert.ts
CHANGED
|
@@ -148,6 +148,40 @@ export default function commands(theNode: MatterNode) {
|
|
|
148
148
|
const count = (await theNode.certificateService()).certificates.length;
|
|
149
149
|
console.log(`Total certificates in storage: ${count}`);
|
|
150
150
|
},
|
|
151
|
+
)
|
|
152
|
+
.command(
|
|
153
|
+
"check-revoked <issuer-key-id> <serial-number>",
|
|
154
|
+
"Check if a certificate is revoked (fetches from DCL on demand)",
|
|
155
|
+
yargs => {
|
|
156
|
+
return yargs
|
|
157
|
+
.positional("issuer-key-id", {
|
|
158
|
+
describe: "Authority Key Identifier of the issuer (hex, with or without colons)",
|
|
159
|
+
type: "string",
|
|
160
|
+
demandOption: true,
|
|
161
|
+
})
|
|
162
|
+
.positional("serial-number", {
|
|
163
|
+
describe: "Serial number of the certificate to check (hex)",
|
|
164
|
+
type: "string",
|
|
165
|
+
demandOption: true,
|
|
166
|
+
});
|
|
167
|
+
},
|
|
168
|
+
async argv => {
|
|
169
|
+
const { issuerKeyId, serialNumber } = argv;
|
|
170
|
+
await theNode.start();
|
|
171
|
+
const service = await theNode.certificateService();
|
|
172
|
+
|
|
173
|
+
console.log("Checking revocation status against DCL...");
|
|
174
|
+
const revoked = await service.isRevoked(issuerKeyId, serialNumber);
|
|
175
|
+
if (revoked) {
|
|
176
|
+
console.log(
|
|
177
|
+
`REVOKED: Certificate with serial ${serialNumber} (issuer ${issuerKeyId}) is revoked.`,
|
|
178
|
+
);
|
|
179
|
+
} else {
|
|
180
|
+
console.log(
|
|
181
|
+
`OK: Certificate with serial ${serialNumber} (issuer ${issuerKeyId}) is not revoked.`,
|
|
182
|
+
);
|
|
183
|
+
}
|
|
184
|
+
},
|
|
151
185
|
),
|
|
152
186
|
handler: async (argv: any) => {
|
|
153
187
|
argv.unhandled = true;
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
|
-
import { Diagnostic, MatterError } from "@matter/general";
|
|
7
|
+
import { Diagnostic, Logger, MatterError } from "@matter/general";
|
|
8
8
|
import { DiscoveryCapabilitiesSchema, ManualPairingCodeCodec, NodeId, QrCode, QrPairingCodeCodec } from "@matter/types";
|
|
9
9
|
import { BasicInformationCluster, DescriptorCluster, GeneralCommissioning } from "@matter/types/clusters";
|
|
10
10
|
import { NodeCommissioningOptions } from "@project-chip/matter.js";
|
|
@@ -12,6 +12,8 @@ import type { Argv } from "yargs";
|
|
|
12
12
|
import { MatterNode } from "../MatterNode.js";
|
|
13
13
|
import { createDiagnosticCallbacks } from "./cmd_nodes.js";
|
|
14
14
|
|
|
15
|
+
const logger = Logger.get("Commission");
|
|
16
|
+
|
|
15
17
|
export default function commands(theNode: MatterNode) {
|
|
16
18
|
return {
|
|
17
19
|
command: "commission",
|
|
@@ -130,14 +132,35 @@ export default function commands(theNode: MatterNode) {
|
|
|
130
132
|
...createDiagnosticCallbacks(),
|
|
131
133
|
} as NodeCommissioningOptions;
|
|
132
134
|
|
|
135
|
+
// Attestation policy: strict rejects errors but allows warnings/info
|
|
136
|
+
const strictAttestation = await theNode.Store.get<boolean>(
|
|
137
|
+
"StrictAttestationValidation",
|
|
138
|
+
false,
|
|
139
|
+
);
|
|
140
|
+
|
|
133
141
|
options.commissioning = {
|
|
134
142
|
nodeId: nodeId !== undefined ? NodeId(nodeId) : undefined,
|
|
135
143
|
regulatoryLocation: GeneralCommissioning.RegulatoryLocationType.Outdoor, // Set to the most restrictive if relevant
|
|
136
144
|
regulatoryCountryCode: "XX",
|
|
145
|
+
onAttestationFailure: findings => {
|
|
146
|
+
const accept = strictAttestation
|
|
147
|
+
? findings.every(f => f.level !== "error")
|
|
148
|
+
: true;
|
|
149
|
+
for (const f of findings) {
|
|
150
|
+
logger.info(
|
|
151
|
+
`Attestation finding ${accept ? "accepted" : "rejected"} (${f.level}):`,
|
|
152
|
+
f.type,
|
|
153
|
+
f.message,
|
|
154
|
+
);
|
|
155
|
+
}
|
|
156
|
+
return accept;
|
|
157
|
+
},
|
|
137
158
|
};
|
|
138
159
|
|
|
139
160
|
console.log(Diagnostic.json(options));
|
|
140
161
|
|
|
162
|
+
await theNode.certificateService();
|
|
163
|
+
|
|
141
164
|
if (theNode.Store.has("WiFiSsid") && theNode.Store.has("WiFiPassword")) {
|
|
142
165
|
options.commissioning.wifiNetwork = {
|
|
143
166
|
wifiSsid: await theNode.Store.get<string>("WiFiSsid", ""),
|
package/src/shell/cmd_config.ts
CHANGED
|
@@ -291,6 +291,76 @@ export default function commands(theNode: MatterNode) {
|
|
|
291
291
|
async argv => doDclTestCertificates(theNode, { action: "set", ...argv }),
|
|
292
292
|
);
|
|
293
293
|
},
|
|
294
|
+
)
|
|
295
|
+
|
|
296
|
+
// Strict Certificate Validation
|
|
297
|
+
.command(
|
|
298
|
+
"strict-attestation",
|
|
299
|
+
"Manage strict device attestation validation during commissioning",
|
|
300
|
+
yargs => {
|
|
301
|
+
return yargs
|
|
302
|
+
.command(
|
|
303
|
+
"* [action]",
|
|
304
|
+
"Get, set, or delete the strict attestation setting",
|
|
305
|
+
yargs => {
|
|
306
|
+
return yargs.positional("action", {
|
|
307
|
+
describe: "get/delete",
|
|
308
|
+
choices: ["get", "delete"] as const,
|
|
309
|
+
default: "get",
|
|
310
|
+
type: "string",
|
|
311
|
+
});
|
|
312
|
+
},
|
|
313
|
+
async argv => doStrictAttestation(theNode, argv),
|
|
314
|
+
)
|
|
315
|
+
.command(
|
|
316
|
+
"set <value>",
|
|
317
|
+
"Enable or disable strict attestation validation",
|
|
318
|
+
yargs => {
|
|
319
|
+
return yargs.positional("value", {
|
|
320
|
+
describe: "Enable strict attestation (true/false)",
|
|
321
|
+
type: "string",
|
|
322
|
+
choices: ["true", "false"] as const,
|
|
323
|
+
demandOption: true,
|
|
324
|
+
});
|
|
325
|
+
},
|
|
326
|
+
async argv => doStrictAttestation(theNode, { action: "set", ...argv }),
|
|
327
|
+
);
|
|
328
|
+
},
|
|
329
|
+
)
|
|
330
|
+
|
|
331
|
+
// Transport Preference (TCP vs UDP) for outgoing connections
|
|
332
|
+
.command(
|
|
333
|
+
"transport-preference",
|
|
334
|
+
"Manage preferred transport (TCP/UDP) for outgoing connections from this controller",
|
|
335
|
+
yargs => {
|
|
336
|
+
return yargs
|
|
337
|
+
.command(
|
|
338
|
+
"* [action]",
|
|
339
|
+
"Get or delete the transport preference",
|
|
340
|
+
yargs => {
|
|
341
|
+
return yargs.positional("action", {
|
|
342
|
+
describe: "get/delete",
|
|
343
|
+
choices: ["get", "delete"] as const,
|
|
344
|
+
default: "get",
|
|
345
|
+
type: "string",
|
|
346
|
+
});
|
|
347
|
+
},
|
|
348
|
+
async argv => doTransportPreference(theNode, argv),
|
|
349
|
+
)
|
|
350
|
+
.command(
|
|
351
|
+
"set <value>",
|
|
352
|
+
"Set transport preference for outgoing connections",
|
|
353
|
+
yargs => {
|
|
354
|
+
return yargs.positional("value", {
|
|
355
|
+
describe: "Preferred transport",
|
|
356
|
+
type: "string",
|
|
357
|
+
choices: ["tcp", "udp"] as const,
|
|
358
|
+
demandOption: true,
|
|
359
|
+
});
|
|
360
|
+
},
|
|
361
|
+
async argv => doTransportPreference(theNode, { action: "set", ...argv }),
|
|
362
|
+
);
|
|
363
|
+
},
|
|
294
364
|
),
|
|
295
365
|
handler: async (argv: any) => {
|
|
296
366
|
argv.unhandled = true;
|
|
@@ -573,3 +643,73 @@ async function doDclTestCertificates(
|
|
|
573
643
|
break;
|
|
574
644
|
}
|
|
575
645
|
}
|
|
646
|
+
|
|
647
|
+
async function doStrictAttestation(
|
|
648
|
+
theNode: MatterNode,
|
|
649
|
+
args: {
|
|
650
|
+
action: string;
|
|
651
|
+
value?: string;
|
|
652
|
+
},
|
|
653
|
+
) {
|
|
654
|
+
const { action, value } = args;
|
|
655
|
+
switch (action) {
|
|
656
|
+
case "get": {
|
|
657
|
+
const strict = await theNode.Store.get<boolean>("StrictAttestationValidation", false);
|
|
658
|
+
console.log(
|
|
659
|
+
`Strict attestation: ${strict ? "enabled (reject on errors, allow warnings/info)" : "disabled (accept all findings)"}`,
|
|
660
|
+
);
|
|
661
|
+
break;
|
|
662
|
+
}
|
|
663
|
+
case "set": {
|
|
664
|
+
if (value === undefined) {
|
|
665
|
+
console.log(`Cannot change strict attestation setting: New value not provided`);
|
|
666
|
+
return;
|
|
667
|
+
}
|
|
668
|
+
const newValue = value === "true";
|
|
669
|
+
await theNode.Store.set("StrictAttestationValidation", newValue);
|
|
670
|
+
console.log(
|
|
671
|
+
`Strict attestation: ${newValue ? "enabled (reject on errors, allow warnings/info)" : "disabled (accept all findings)"}`,
|
|
672
|
+
);
|
|
673
|
+
break;
|
|
674
|
+
}
|
|
675
|
+
case "delete":
|
|
676
|
+
await theNode.Store.delete("StrictAttestationValidation");
|
|
677
|
+
console.log(`Strict attestation setting reset to default (disabled).`);
|
|
678
|
+
break;
|
|
679
|
+
}
|
|
680
|
+
}
|
|
681
|
+
|
|
682
|
+
async function doTransportPreference(
|
|
683
|
+
theNode: MatterNode,
|
|
684
|
+
args: {
|
|
685
|
+
action: string;
|
|
686
|
+
value?: string;
|
|
687
|
+
},
|
|
688
|
+
) {
|
|
689
|
+
const { action, value } = args;
|
|
690
|
+
switch (action) {
|
|
691
|
+
case "get": {
|
|
692
|
+
const stored = await theNode.Store.get<string>("TransportPreference", "");
|
|
693
|
+
const pref = stored === "tcp" || stored === "udp" ? stored : undefined;
|
|
694
|
+
console.log(`Transport preference: ${pref === undefined ? "default (UDP-preferred)" : pref.toUpperCase()}`);
|
|
695
|
+
break;
|
|
696
|
+
}
|
|
697
|
+
case "set": {
|
|
698
|
+
if (value !== "tcp" && value !== "udp") {
|
|
699
|
+
console.log(`Cannot change transport preference: value must be tcp or udp`);
|
|
700
|
+
return;
|
|
701
|
+
}
|
|
702
|
+
await theNode.Store.set("TransportPreference", value);
|
|
703
|
+
console.log(
|
|
704
|
+
`Transport preference: ${value.toUpperCase()}. Please restart the shell for the change to take effect.`,
|
|
705
|
+
);
|
|
706
|
+
break;
|
|
707
|
+
}
|
|
708
|
+
case "delete":
|
|
709
|
+
await theNode.Store.delete("TransportPreference");
|
|
710
|
+
console.log(
|
|
711
|
+
`Transport preference reset to default (UDP-preferred). Please restart the shell for the change to take effect.`,
|
|
712
|
+
);
|
|
713
|
+
break;
|
|
714
|
+
}
|
|
715
|
+
}
|
package/src/shell/cmd_nodes.ts
CHANGED
|
@@ -162,9 +162,7 @@ export default function commands(theNode: MatterNode) {
|
|
|
162
162
|
if (dd.VP) console.log(` Vendor/Prod: ${dd.VP}`);
|
|
163
163
|
if (dd.DT !== undefined) console.log(` Device Type: ${dd.DT}`);
|
|
164
164
|
if (dd.T !== undefined) {
|
|
165
|
-
|
|
166
|
-
const tcpServer = !!(dd.T & 0x04);
|
|
167
|
-
console.log(` TCP Support: T=${dd.T} (client=${tcpClient}, server=${tcpServer})`);
|
|
165
|
+
console.log(` TCP Support: client=${dd.T.tcpClient}, server=${dd.T.tcpServer}`);
|
|
168
166
|
} else {
|
|
169
167
|
console.log(` TCP Support: not advertised`);
|
|
170
168
|
}
|
package/dist/esm/MatterNode.js
DELETED
|
@@ -1,189 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @license
|
|
3
|
-
* Copyright 2022-2026 Matter.js Authors
|
|
4
|
-
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
-
*/
|
|
6
|
-
import {
|
|
7
|
-
Environment,
|
|
8
|
-
Filesystem,
|
|
9
|
-
Logger,
|
|
10
|
-
ObserverGroup,
|
|
11
|
-
StorageService
|
|
12
|
-
} from "@matter/general";
|
|
13
|
-
import { DclBehavior, SoftwareUpdateManager } from "@matter/node";
|
|
14
|
-
import { NodeId } from "@matter/types";
|
|
15
|
-
import { CommissioningController } from "@project-chip/matter.js";
|
|
16
|
-
import { join } from "node:path";
|
|
17
|
-
const logger = Logger.get("Node");
|
|
18
|
-
class MatterNode {
|
|
19
|
-
#storageLocation;
|
|
20
|
-
#storageManager;
|
|
21
|
-
#storageContext;
|
|
22
|
-
#environment;
|
|
23
|
-
commissioningController;
|
|
24
|
-
#started = false;
|
|
25
|
-
#nodeNum;
|
|
26
|
-
#netInterface;
|
|
27
|
-
#dclFetchTestCertificates = false;
|
|
28
|
-
#allowTestOtaImages = false;
|
|
29
|
-
#observers;
|
|
30
|
-
constructor(nodeNum, netInterface) {
|
|
31
|
-
this.#environment = Environment.default;
|
|
32
|
-
this.#environment.runtime.add(this);
|
|
33
|
-
this.#nodeNum = nodeNum;
|
|
34
|
-
this.#netInterface = netInterface;
|
|
35
|
-
}
|
|
36
|
-
get storageLocation() {
|
|
37
|
-
return this.#storageLocation;
|
|
38
|
-
}
|
|
39
|
-
get environment() {
|
|
40
|
-
return this.#environment;
|
|
41
|
-
}
|
|
42
|
-
get node() {
|
|
43
|
-
if (this.commissioningController === void 0) {
|
|
44
|
-
throw new Error("CommissioningController not initialized. Start first");
|
|
45
|
-
}
|
|
46
|
-
return this.commissioningController.node;
|
|
47
|
-
}
|
|
48
|
-
async otaService() {
|
|
49
|
-
const service = await this.node.act((agent) => agent.get(DclBehavior).otaUpdateService);
|
|
50
|
-
await service.construction;
|
|
51
|
-
return service;
|
|
52
|
-
}
|
|
53
|
-
async certificateService() {
|
|
54
|
-
const service = await this.node.act((agent) => agent.get(DclBehavior).certificateService);
|
|
55
|
-
await service.construction;
|
|
56
|
-
return service;
|
|
57
|
-
}
|
|
58
|
-
async vendorInfoService() {
|
|
59
|
-
const service = await this.node.act((agent) => agent.get(DclBehavior).vendorInfoService);
|
|
60
|
-
await service.construction;
|
|
61
|
-
return service;
|
|
62
|
-
}
|
|
63
|
-
async initialize(resetStorage) {
|
|
64
|
-
if (this.#environment) {
|
|
65
|
-
if (this.#netInterface !== void 0) {
|
|
66
|
-
this.#environment.vars.set("mdns.networkinterface", this.#netInterface);
|
|
67
|
-
}
|
|
68
|
-
const id = `shell-${this.#nodeNum.toString()}`;
|
|
69
|
-
this.commissioningController = new CommissioningController({
|
|
70
|
-
environment: {
|
|
71
|
-
environment: this.#environment,
|
|
72
|
-
id
|
|
73
|
-
},
|
|
74
|
-
autoConnect: false,
|
|
75
|
-
adminFabricLabel: "matter.js Shell",
|
|
76
|
-
enableOtaProvider: true,
|
|
77
|
-
tcp: true,
|
|
78
|
-
basicInformation: {
|
|
79
|
-
productName: "matter.js Shell"
|
|
80
|
-
}
|
|
81
|
-
});
|
|
82
|
-
const env = this.commissioningController.env;
|
|
83
|
-
if (env.has(Filesystem)) {
|
|
84
|
-
this.#storageLocation = join(env.get(Filesystem).path, id);
|
|
85
|
-
}
|
|
86
|
-
if (resetStorage) {
|
|
87
|
-
await this.commissioningController.node.erase();
|
|
88
|
-
}
|
|
89
|
-
this.#storageManager = await env.get(StorageService).open(id);
|
|
90
|
-
this.#storageContext = this.#storageManager.createContext("Node");
|
|
91
|
-
this.#dclFetchTestCertificates = await this.#storageContext.get("DclFetchTestCertificates", false);
|
|
92
|
-
this.#allowTestOtaImages = await this.#storageContext.get("AllowTestOtaImages", false);
|
|
93
|
-
} else {
|
|
94
|
-
console.log(
|
|
95
|
-
"Legacy support was removed in Matter.js 0.13. Please downgrade or migrate the storage manually"
|
|
96
|
-
);
|
|
97
|
-
process.exit(1);
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
get Store() {
|
|
101
|
-
if (!this.#storageContext) {
|
|
102
|
-
throw new Error("Storage uninitialized");
|
|
103
|
-
}
|
|
104
|
-
return this.#storageContext;
|
|
105
|
-
}
|
|
106
|
-
async close() {
|
|
107
|
-
try {
|
|
108
|
-
await this.commissioningController?.close();
|
|
109
|
-
} finally {
|
|
110
|
-
this.#observers?.close();
|
|
111
|
-
await this.#storageManager?.close();
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
async start() {
|
|
115
|
-
if (this.#started) {
|
|
116
|
-
return;
|
|
117
|
-
}
|
|
118
|
-
logger.info(`matter.js shell controller started for node ${this.#nodeNum}`);
|
|
119
|
-
if (this.commissioningController !== void 0) {
|
|
120
|
-
await this.commissioningController.start();
|
|
121
|
-
await this.commissioningController.node.setStateOf(DclBehavior, {
|
|
122
|
-
fetchTestCertificates: this.#dclFetchTestCertificates
|
|
123
|
-
});
|
|
124
|
-
await this.commissioningController.otaProvider.setStateOf(SoftwareUpdateManager, {
|
|
125
|
-
allowTestOtaImages: this.#allowTestOtaImages
|
|
126
|
-
});
|
|
127
|
-
if (await this.Store.has("ControllerFabricLabel")) {
|
|
128
|
-
await this.commissioningController.updateFabricLabel(
|
|
129
|
-
await this.Store.get("ControllerFabricLabel", "matter.js Shell")
|
|
130
|
-
);
|
|
131
|
-
}
|
|
132
|
-
} else {
|
|
133
|
-
throw new Error("No controller initialized");
|
|
134
|
-
}
|
|
135
|
-
this.#observers = this.#observers ?? new ObserverGroup(this.#environment.runtime);
|
|
136
|
-
const updateManagerEvents = this.commissioningController.otaProvider.eventsOf(SoftwareUpdateManager);
|
|
137
|
-
this.#observers.on(updateManagerEvents.updateAvailable, (peer, details) => {
|
|
138
|
-
logger.info(`Update available for peer`, peer, `:`, details);
|
|
139
|
-
});
|
|
140
|
-
this.#observers.on(updateManagerEvents.updateDone, (peer) => {
|
|
141
|
-
logger.info(`Update done for peer`, peer);
|
|
142
|
-
});
|
|
143
|
-
this.#observers.on(updateManagerEvents.updateFailed, (peer) => {
|
|
144
|
-
logger.info(`Update failed for peer`, peer);
|
|
145
|
-
});
|
|
146
|
-
this.#started = true;
|
|
147
|
-
}
|
|
148
|
-
async connectAndGetNodes(nodeIdStr, connectOptions) {
|
|
149
|
-
await this.start();
|
|
150
|
-
const nodeId = nodeIdStr !== void 0 ? NodeId(BigInt(nodeIdStr)) : void 0;
|
|
151
|
-
if (this.commissioningController === void 0) {
|
|
152
|
-
throw new Error("CommissioningController not initialized");
|
|
153
|
-
}
|
|
154
|
-
if (nodeId === void 0) {
|
|
155
|
-
return await this.commissioningController.connect(connectOptions);
|
|
156
|
-
}
|
|
157
|
-
const node = await this.commissioningController.connectNode(nodeId, {
|
|
158
|
-
...connectOptions
|
|
159
|
-
});
|
|
160
|
-
if (!node.initialized) {
|
|
161
|
-
await node.events.initialized;
|
|
162
|
-
}
|
|
163
|
-
return [node];
|
|
164
|
-
}
|
|
165
|
-
get controller() {
|
|
166
|
-
if (this.commissioningController === void 0) {
|
|
167
|
-
throw new Error("CommissioningController not initialized. Start first");
|
|
168
|
-
}
|
|
169
|
-
return this.commissioningController;
|
|
170
|
-
}
|
|
171
|
-
async iterateNodeDevices(nodes, callback, endpointId) {
|
|
172
|
-
for (const node of nodes) {
|
|
173
|
-
let devices = node.getDevices();
|
|
174
|
-
if (endpointId !== void 0) {
|
|
175
|
-
devices = devices.filter((device) => device.number === endpointId);
|
|
176
|
-
}
|
|
177
|
-
for (const device of devices) {
|
|
178
|
-
await callback(device, node);
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
updateFabricLabel(label) {
|
|
183
|
-
return this.commissioningController?.updateFabricLabel(label);
|
|
184
|
-
}
|
|
185
|
-
}
|
|
186
|
-
export {
|
|
187
|
-
MatterNode
|
|
188
|
-
};
|
|
189
|
-
//# sourceMappingURL=MatterNode.js.map
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../src/MatterNode.ts"],
|
|
4
|
-
"mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;AAOA;AAAA,EACI;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAGA;AAAA,OACG;AACP,SAAS,aAAyB,6BAA6B;AAC/D,SAAS,cAAc;AACvB,SAAS,+BAA+B;AAExC,SAAS,YAAY;AAErB,MAAM,SAAS,OAAO,IAAI,MAAM;AAEzB,MAAM,WAAW;AAAA,EACpB;AAAA,EACA;AAAA,EACA;AAAA,EACS;AAAA,EACT;AAAA,EACA,WAAW;AAAA,EACF;AAAA,EACA;AAAA,EACT,4BAA4B;AAAA,EAC5B,sBAAsB;AAAA,EACtB;AAAA,EAEA,YAAY,SAAiB,cAAuB;AAChD,SAAK,eAAe,YAAY;AAChC,SAAK,aAAa,QAAQ,IAAI,IAAI;AAClC,SAAK,WAAW;AAChB,SAAK,gBAAgB;AAAA,EACzB;AAAA,EAEA,IAAI,kBAAkB;AAClB,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,IAAI,cAAc;AACd,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,IAAI,OAAmB;AACnB,QAAI,KAAK,4BAA4B,QAAW;AAC5C,YAAM,IAAI,MAAM,sDAAsD;AAAA,IAC1E;AACA,WAAO,KAAK,wBAAwB;AAAA,EACxC;AAAA,EAEA,MAAM,aAAa;AACf,UAAM,UAAU,MAAM,KAAK,KAAK,IAAI,WAAS,MAAM,IAAI,WAAW,EAAE,gBAAgB;AACpF,UAAM,QAAQ;AACd,WAAO;AAAA,EACX;AAAA,EAEA,MAAM,qBAAqB;AACvB,UAAM,UAAU,MAAM,KAAK,KAAK,IAAI,WAAS,MAAM,IAAI,WAAW,EAAE,kBAAkB;AACtF,UAAM,QAAQ;AACd,WAAO;AAAA,EACX;AAAA,EAEA,MAAM,oBAAoB;AACtB,UAAM,UAAU,MAAM,KAAK,KAAK,IAAI,WAAS,MAAM,IAAI,WAAW,EAAE,iBAAiB;AACrF,UAAM,QAAQ;AACd,WAAO;AAAA,EACX;AAAA,EAEA,MAAM,WAAW,cAAuB;AAQpC,QAAI,KAAK,cAAc;AACnB,UAAI,KAAK,kBAAkB,QAAW;AAClC,aAAK,aAAa,KAAK,IAAI,yBAAyB,KAAK,aAAa;AAAA,MAC1E;AAGA,YAAM,KAAK,SAAS,KAAK,SAAS,SAAS,CAAC;AAC5C,WAAK,0BAA0B,IAAI,wBAAwB;AAAA,QACvD,aAAa;AAAA,UACT,aAAa,KAAK;AAAA,UAClB;AAAA,QACJ;AAAA,QACA,aAAa;AAAA,QACb,kBAAkB;AAAA,QAClB,mBAAmB;AAAA,QACnB,KAAK;AAAA,QACL,kBAAkB;AAAA,UACd,aAAa;AAAA,QACjB;AAAA,MACJ,CAAC;AAED,YAAM,MAAM,KAAK,wBAAwB;AACzC,UAAI,IAAI,IAAI,UAAU,GAAG;AACrB,aAAK,mBAAmB,KAAK,IAAI,IAAI,UAAU,EAAE,MAAM,EAAE;AAAA,MAC7D;AAEA,UAAI,cAAc;AACd,cAAM,KAAK,wBAAwB,KAAK,MAAM;AAAA,MAClD;AAIA,WAAK,kBAAkB,MAAM,IAAI,IAAI,cAAc,EAAE,KAAK,EAAE;AAC5D,WAAK,kBAAkB,KAAK,gBAAgB,cAAc,MAAM;AAGhE,WAAK,4BAA4B,MAAM,KAAK,gBAAgB,IAAa,4BAA4B,KAAK;AAG1G,WAAK,sBAAsB,MAAM,KAAK,gBAAgB,IAAa,sBAAsB,KAAK;AAAA,IAClG,OAAO;AACH,cAAQ;AAAA,QACJ;AAAA,MACJ;AACA,cAAQ,KAAK,CAAC;AAAA,IAClB;AAAA,EACJ;AAAA,EAEA,IAAI,QAAQ;AACR,QAAI,CAAC,KAAK,iBAAiB;AACvB,YAAM,IAAI,MAAM,uBAAuB;AAAA,IAC3C;AACA,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,MAAM,QAAQ;AACV,QAAI;AACA,YAAM,KAAK,yBAAyB,MAAM;AAAA,IAC9C,UAAE;AACE,WAAK,YAAY,MAAM;AACvB,YAAM,KAAK,iBAAiB,MAAM;AAAA,IACtC;AAAA,EACJ;AAAA,EAEA,MAAM,QAAQ;AACV,QAAI,KAAK,UAAU;AACf;AAAA,IACJ;AACA,WAAO,KAAK,+CAA+C,KAAK,QAAQ,EAAE;AAE1E,QAAI,KAAK,4BAA4B,QAAW;AAC5C,YAAM,KAAK,wBAAwB,MAAM;AAEzC,YAAM,KAAK,wBAAwB,KAAK,WAAW,aAAa;AAAA,QAC5D,uBAAuB,KAAK;AAAA,MAChC,CAAC;AAED,YAAM,KAAK,wBAAwB,YAAY,WAAW,uBAAuB;AAAA,QAC7E,oBAAoB,KAAK;AAAA,MAC7B,CAAC;AAED,UAAI,MAAM,KAAK,MAAM,IAAI,uBAAuB,GAAG;AAC/C,cAAM,KAAK,wBAAwB;AAAA,UAC/B,MAAM,KAAK,MAAM,IAAY,yBAAyB,iBAAiB;AAAA,QAC3E;AAAA,MACJ;AAAA,IACJ,OAAO;AACH,YAAM,IAAI,MAAM,2BAA2B;AAAA,IAC/C;AAEA,SAAK,aAAa,KAAK,cAAc,IAAI,cAAc,KAAK,aAAa,OAAO;AAChF,UAAM,sBAAsB,KAAK,wBAAwB,YAAY,SAAS,qBAAqB;AACnG,SAAK,WAAW,GAAG,oBAAoB,iBAAiB,CAAC,MAAM,YAAY;AACvE,aAAO,KAAK,6BAA6B,MAAM,KAAK,OAAO;AAAA,IAC/D,CAAC;AACD,SAAK,WAAW,GAAG,oBAAoB,YAAY,UAAQ;AACvD,aAAO,KAAK,wBAAwB,IAAI;AAAA,IAC5C,CAAC;AACD,SAAK,WAAW,GAAG,oBAAoB,cAAc,UAAQ;AACzD,aAAO,KAAK,0BAA0B,IAAI;AAAA,IAC9C,CAAC;AAED,SAAK,WAAW;AAAA,EACpB;AAAA,EAEA,MAAM,mBAAmB,WAAoB,gBAAqD;AAC9F,UAAM,KAAK,MAAM;AACjB,UAAM,SAAS,cAAc,SAAY,OAAO,OAAO,SAAS,CAAC,IAAI;AAErE,QAAI,KAAK,4BAA4B,QAAW;AAC5C,YAAM,IAAI,MAAM,yCAAyC;AAAA,IAC7D;AAEA,QAAI,WAAW,QAAW;AACtB,aAAO,MAAM,KAAK,wBAAwB,QAAQ,cAAc;AAAA,IACpE;AAEA,UAAM,OAAO,MAAM,KAAK,wBAAwB,YAAY,QAAQ;AAAA,MAChE,GAAG;AAAA,IACP,CAAC;AACD,QAAI,CAAC,KAAK,aAAa;AACnB,YAAM,KAAK,OAAO;AAAA,IACtB;AACA,WAAO,CAAC,IAAI;AAAA,EAChB;AAAA,EAEA,IAAI,aAAa;AACb,QAAI,KAAK,4BAA4B,QAAW;AAC5C,YAAM,IAAI,MAAM,sDAAsD;AAAA,IAC1E;AACA,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,MAAM,mBACF,OACA,UACA,YACF;AACE,eAAW,QAAQ,OAAO;AACtB,UAAI,UAAU,KAAK,WAAW;AAC9B,UAAI,eAAe,QAAW;AAC1B,kBAAU,QAAQ,OAAO,YAAU,OAAO,WAAW,UAAU;AAAA,MACnE;AAEA,iBAAW,UAAU,SAAS;AAC1B,cAAM,SAAS,QAAQ,IAAI;AAAA,MAC/B;AAAA,IACJ;AAAA,EACJ;AAAA,EAEA,kBAAkB,OAAe;AAC7B,WAAO,KAAK,yBAAyB,kBAAkB,KAAK;AAAA,EAChE;AACJ;",
|
|
5
|
-
"names": []
|
|
6
|
-
}
|