@matter/protocol 0.13.0-alpha.0-20250424-4760af1f3 → 0.13.0-alpha.0-20250425-94b33ff98
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/peer/ControllerCommissioner.d.ts +2 -0
- package/dist/cjs/peer/ControllerCommissioner.d.ts.map +1 -1
- package/dist/cjs/peer/ControllerCommissioner.js +36 -7
- package/dist/cjs/peer/ControllerCommissioner.js.map +1 -1
- package/dist/esm/peer/ControllerCommissioner.d.ts +2 -0
- package/dist/esm/peer/ControllerCommissioner.d.ts.map +1 -1
- package/dist/esm/peer/ControllerCommissioner.js +41 -9
- package/dist/esm/peer/ControllerCommissioner.js.map +1 -1
- package/package.json +6 -6
- package/src/peer/ControllerCommissioner.ts +50 -10
|
@@ -13,6 +13,7 @@ import { DiscoveryCapabilitiesBitmap, NodeId, TypeFromPartialBitSchema } from "#
|
|
|
13
13
|
import { InteractionClientProvider } from "../interaction/InteractionClient.js";
|
|
14
14
|
import { ExchangeManager, MessageChannel } from "../protocol/ExchangeManager.js";
|
|
15
15
|
import { PeerAddress } from "./PeerAddress.js";
|
|
16
|
+
import { PeerSet } from "./PeerSet.js";
|
|
16
17
|
/**
|
|
17
18
|
* General commissioning options.
|
|
18
19
|
*/
|
|
@@ -80,6 +81,7 @@ export interface DiscoveryAndCommissioningOptions extends CommissioningOptions {
|
|
|
80
81
|
* Interfaces {@link ControllerCommissioner} with other components.
|
|
81
82
|
*/
|
|
82
83
|
export interface ControllerCommissionerContext {
|
|
84
|
+
peers: PeerSet;
|
|
83
85
|
clients: InteractionClientProvider;
|
|
84
86
|
scanners: ScannerSet;
|
|
85
87
|
netInterfaces: NetInterfaceSet;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ControllerCommissioner.d.ts","sourceRoot":"","sources":["../../../src/peer/ControllerCommissioner.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,sCAAsC,CAAC;AAE5E,OAAO,EAAE,oBAAoB,EAAE,+BAA+B,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACtH,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAGH,YAAY,EAEZ,WAAW,EACX,aAAa,EAGb,eAAe,EAEf,aAAa,EAEhB,MAAM,UAAU,CAAC;AAElB,OAAO,
|
|
1
|
+
{"version":3,"file":"ControllerCommissioner.d.ts","sourceRoot":"","sources":["../../../src/peer/ControllerCommissioner.ts"],"names":[],"mappings":"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"}
|
|
@@ -51,6 +51,7 @@ class ControllerCommissioner {
|
|
|
51
51
|
}
|
|
52
52
|
static [import_general.Environmental.create](env) {
|
|
53
53
|
const instance = new ControllerCommissioner({
|
|
54
|
+
peers: env.get(import_PeerSet.PeerSet),
|
|
54
55
|
clients: env.get(import_InteractionClient.InteractionClientProvider),
|
|
55
56
|
scanners: env.get(import_Scanner.ScannerSet),
|
|
56
57
|
netInterfaces: env.get(import_general.NetInterfaceSet),
|
|
@@ -65,7 +66,10 @@ class ControllerCommissioner {
|
|
|
65
66
|
* Commmission a previously discovered node.
|
|
66
67
|
*/
|
|
67
68
|
async commission(options) {
|
|
68
|
-
const { passcode, addresses, discoveryData } = options;
|
|
69
|
+
const { passcode, addresses, discoveryData, fabric, nodeId } = options;
|
|
70
|
+
if (nodeId !== void 0) {
|
|
71
|
+
this.#assertPeerAddress(fabric.addressOf(nodeId));
|
|
72
|
+
}
|
|
69
73
|
addresses.sort((a) => a.type === "udp" ? -1 : 1);
|
|
70
74
|
let channel;
|
|
71
75
|
for (const address of addresses) {
|
|
@@ -149,6 +153,10 @@ class ControllerCommissioner {
|
|
|
149
153
|
* Commission a node with discovery.
|
|
150
154
|
*/
|
|
151
155
|
async commissionWithDiscovery(options) {
|
|
156
|
+
const { fabric, nodeId } = options;
|
|
157
|
+
if (nodeId !== void 0) {
|
|
158
|
+
this.#assertPeerAddress(fabric.addressOf(nodeId));
|
|
159
|
+
}
|
|
152
160
|
const { paseSecureChannel, discoveryData } = await this.discoverAndEstablishPase(options);
|
|
153
161
|
return await this.#commissionConnectedNode(paseSecureChannel, options, discoveryData);
|
|
154
162
|
}
|
|
@@ -217,23 +225,44 @@ class ControllerCommissioner {
|
|
|
217
225
|
await unsecureSession.destroy();
|
|
218
226
|
return new import_ExchangeManager.MessageChannel(paseChannel, paseSecureSession);
|
|
219
227
|
}
|
|
228
|
+
/** Validate if a Peert Address is already known and commissioned */
|
|
229
|
+
#assertPeerAddress(address) {
|
|
230
|
+
if (this.#context.peers.has(address)) {
|
|
231
|
+
throw new import_ControllerCommissioningFlow.CommissioningError(`Node ID ${address.nodeId} is already commissioned and can not be reused.`);
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
/** Finds an unused random Node-ID to use for commissioning if not already provided. */
|
|
235
|
+
#determineAddress(fabric, nodeId) {
|
|
236
|
+
while (true) {
|
|
237
|
+
const address = fabric.addressOf(nodeId ?? import_types.NodeId.randomOperationalNodeId());
|
|
238
|
+
try {
|
|
239
|
+
this.#assertPeerAddress(address);
|
|
240
|
+
} catch (error) {
|
|
241
|
+
if (error instanceof import_ControllerCommissioningFlow.CommissioningError && nodeId !== void 0) {
|
|
242
|
+
throw error;
|
|
243
|
+
}
|
|
244
|
+
continue;
|
|
245
|
+
}
|
|
246
|
+
return address;
|
|
247
|
+
}
|
|
248
|
+
}
|
|
220
249
|
/**
|
|
221
250
|
* Method to commission a device with a PASE secure channel. It returns the NodeId of the commissioned device on
|
|
222
251
|
* success.
|
|
223
252
|
*/
|
|
224
253
|
async #commissionConnectedNode(paseSecureMessageChannel, options, discoveryData) {
|
|
254
|
+
const {
|
|
255
|
+
fabric,
|
|
256
|
+
finalizeCommissioning: performCaseCommissioning,
|
|
257
|
+
commissioningFlowImpl = import_ControllerCommissioningFlow.ControllerCommissioningFlow
|
|
258
|
+
} = options;
|
|
225
259
|
const commissioningOptions = {
|
|
226
260
|
regulatoryLocation: import_general_commissioning.GeneralCommissioning.RegulatoryLocationType.Outdoor,
|
|
227
261
|
// Set to the most restrictive if relevant
|
|
228
262
|
regulatoryCountryCode: "XX",
|
|
229
263
|
...options
|
|
230
264
|
};
|
|
231
|
-
const
|
|
232
|
-
fabric,
|
|
233
|
-
finalizeCommissioning: performCaseCommissioning,
|
|
234
|
-
commissioningFlowImpl = import_ControllerCommissioningFlow.ControllerCommissioningFlow
|
|
235
|
-
} = commissioningOptions;
|
|
236
|
-
const address = fabric.addressOf(commissioningOptions.nodeId ?? import_types.NodeId.randomOperationalNodeId());
|
|
265
|
+
const address = this.#determineAddress(fabric, commissioningOptions.nodeId);
|
|
237
266
|
logger.info(
|
|
238
267
|
`Start commissioning of node ${address.nodeId} into fabric ${fabric.fabricId} (index ${address.fabricIndex})`
|
|
239
268
|
);
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/peer/ControllerCommissioner.ts"],
|
|
4
|
-
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAMA,kCAAqC;AACrC,mCAAqC;AACrC,qBAAiG;AAEjG,qBAaO;AACP,yBAA4B;AAC5B,
|
|
4
|
+
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAMA,kCAAqC;AACrC,mCAAqC;AACrC,qBAAiG;AAEjG,qBAaO;AACP,yBAA4B;AAC5B,yCAIO;AACP,iCAAyE;AACzE,2BAA2C;AAC3C,qBAA2B;AAC3B,4BAA+B;AAC/B,mBAA0G;AAC1G,+BAA6D;AAC7D,6BAAgD;AAChD,8BAAiD;AAEjD,qBAA2C;AAvC3C;AAAA;AAAA;AAAA;AAAA;AAyCA,MAAM,SAAS,sBAAO,IAAI,kBAAkB;AA6FrC,MAAM,uBAAuB;AAAA,EAChC;AAAA,EACA;AAAA,EAEA,YAAY,SAAwC;AAChD,SAAK,WAAW;AAChB,SAAK,cAAc,IAAI,0BAAW,QAAQ,QAAQ;AAAA,EACtD;AAAA,EAEA,QAAQ,6BAAc,MAAM,EAAE,KAAkB;AAC5C,UAAM,WAAW,IAAI,uBAAuB;AAAA,MACxC,OAAO,IAAI,IAAI,sBAAO;AAAA,MACtB,SAAS,IAAI,IAAI,kDAAyB;AAAA,MAC1C,UAAU,IAAI,IAAI,yBAAU;AAAA,MAC5B,eAAe,IAAI,IAAI,8BAAe;AAAA,MACtC,UAAU,IAAI,IAAI,oCAAc;AAAA,MAChC,WAAW,IAAI,IAAI,sCAAe;AAAA,MAClC,IAAI,IAAI,IAAI,gDAAoB;AAAA,IACpC,CAAC;AACD,QAAI,IAAI,wBAAwB,QAAQ;AACxC,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAW,SAAgE;AAC7E,UAAM,EAAE,UAAU,WAAW,eAAe,QAAQ,OAAO,IAAI;AAG/D,QAAI,WAAW,QAAW;AACtB,WAAK,mBAAmB,OAAO,UAAU,MAAM,CAAC;AAAA,IACpD;AAGA,cAAU,KAAK,OAAM,EAAE,SAAS,QAAQ,KAAK,CAAE;AAG/C,QAAI;AACJ,eAAW,WAAW,WAAW;AAC7B,UAAI;AACA,kBAAU,MAAM,KAAK,6BAA6B,SAAS,UAAU,aAAa;AAAA,MACtF,SAAS,GAAG;AACR,8CAAuB,OAAO,CAAC;AAC/B,eAAO,KAAK,4BAAwB,sCAAsB,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE;AAAA,MACtF;AAAA,IACJ;AAEA,QAAI,YAAY,QAAW;AACvB,YAAM,IAAI,sCAAuB,6BAA6B;AAAA,IAClE;AAEA,WAAO,MAAM,KAAK,yBAAyB,SAAS,SAAS,aAAa;AAAA,EAC9E;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,yBACF,SAC6E;AAC7E,UAAM;AAAA,MACF,WAAW,EAAE,iBAAiB,GAAG;AAAA,MACjC;AAAA,IACJ,IAAI;AAEJ,UAAM,uBACF,0BAA0B,QAAQ,YAAY,QAAQ,UAAU,uBAAuB;AAC3F,QAAI;AAAA,MACA,WAAW,EAAE,wBAAwB,CAAC,GAAG,aAAa;AAAA,IAC1D,IAAI;AACJ,QAAI,iBAAiB,oBAAoB,QAAQ,YAAY,QAAQ,UAAU,iBAAiB,CAAC;AAEjG,QACI,KAAK,SAAS,SAAS,cAAc,2BAAY,GAAG,KACpD,KAAK,SAAS,cAAc,gBAAgB,2BAAY,KAAK,IAAI,MAAM,QACzE;AACE,4BAAsB,cAAc;AAAA,IACxC;AACA,QAAI,yBAAyB,QAAW;AACpC,UAAI,EAAE,UAAU,IAAI;AACpB,UAAI,sBAAsB,QAAQ,MAAM;AACpC,gCAAwB,EAAE,aAAa,MAAM,KAAK,UAAU,KAAK,aAAW,QAAQ,SAAS,KAAK,EAAE;AAAA,MACxG,WAAW,sBAAsB,gBAAgB,MAAM;AAEnD,oBAAY,UAAU,OAAO,aAAW,QAAQ,SAAS,KAAK;AAAA,MAClE;AACA,gBAAU,KAAK,OAAM,EAAE,SAAS,QAAQ,KAAK,CAAE;AAC/C,qBAAe,UAAU,CAAC;AAC1B,UAAI,gBAAgB,wBAAwB,qBAAqB,eAAe,QAAW;AAEvF,yBAAiB,EAAE,YAAY,qBAAqB,WAAqB;AAAA,MAC7E,OAAO;AACH,yBAAiB,EAAE,mBAAmB,qBAAqB,EAAE;AAAA,MACjE;AAAA,IACJ;AAEA,UAAM,gBAAgB,KAAK,SAAS,SAAS,OAAO,qBAAqB;AAEzE,WAAO;AAAA,MACH,wCAAwC,0BAAW,KAAK,cAAc,CAAC,QACnE,cAAc,MAClB,8BAA8B,0BAAW,KAAK,YAAY,CAAC;AAAA,IAC/D;AAGA,QAAI;AACJ,QAAI;AAGJ,QAAI,iBAAiB,QAAW;AAC5B,UAAI;AACA,4BAAoB,MAAM,KAAK,6BAA6B,cAAc,QAAQ;AAAA,MACtF,SAAS,OAAO;AACZ,8CAAuB,OAAO,KAAK;AAAA,MACvC;AAAA,IACJ;AACA,QAAI,sBAAsB,QAAW;AACjC,YAAM,oBAAoB,MAAM,+CAAoB;AAAA,QAChD;AAAA,QACA;AAAA,QACA;AAAA,MACJ;AAEA,YAAM,EAAE,OAAO,IAAI,MAAM,+CAAoB;AAAA,QACzC;AAAA,QACA;AAAA,QACA,YACI,cAAc,QAAQ,aAAW,QAAQ,mCAAmC,cAAc,CAAC;AAAA,QAC/F,OAAO,SAAS,WAAW;AACvB,gBAAM,UAAU,MAAM,KAAK,6BAA6B,SAAS,UAAU,MAAM;AACjF,0BAAgB;AAChB,iBAAO;AAAA,QACX;AAAA,MACJ;AAGA,0BAAoB;AAAA,IACxB;AAEA,WAAO,EAAE,mBAAmB,cAAc;AAAA,EAC9C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,wBAAwB,SAAiE;AAC3F,UAAM,EAAE,QAAQ,OAAO,IAAI;AAE3B,QAAI,WAAW,QAAW;AACtB,WAAK,mBAAmB,OAAO,UAAU,MAAM,CAAC;AAAA,IACpD;AAGA,UAAM,EAAE,mBAAmB,cAAc,IAAI,MAAM,KAAK,yBAAyB,OAAO;AAGxF,WAAO,MAAM,KAAK,yBAAyB,mBAAmB,SAAS,aAAa;AAAA,EACxF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,6BACF,SACA,UACA,QACuB;AACvB,QAAI;AACJ,QAAI,WAAW,QAAW;AACtB,aAAO,KAAK,4BAA4B,+BAAY,yBAAyB,MAAM,CAAC;AAAA,IACxF;AACA,QAAI,QAAQ,SAAS,OAAO;AACxB,YAAM,EAAE,GAAG,IAAI;AAEf,YAAM,oBAAgB,uBAAO,EAAE;AAC/B,YAAM,gBAAgB,KAAK,SAAS,cAAc;AAAA,QAC9C,2BAAY;AAAA,QACZ,gBAAgB,OAAO;AAAA,MAC3B;AACA,UAAI,kBAAkB,QAAW;AAE7B,cAAM,IAAI;AAAA,UACN,MAAM,gBAAgB,MAAM,GAAG,0CAA0C,EAAE;AAAA,QAC/E;AAAA,MACJ;AACA,oBAAc,MAAM,cAAc,YAAY,OAAO;AAAA,IACzD,OAAO;AACH,YAAM,MAAM,KAAK,SAAS,cAAc,aAAa,2BAAY,GAAG;AACpE,UAAI,CAAC,KAAK;AACN,cAAM,IAAI;AAAA,UACN,6CAA6C,QAAQ,iBAAiB;AAAA,QAC1E;AAAA,MACJ;AAEA,oBAAc,MAAM,IAAI,YAAY,OAAO;AAAA,IAC/C;AAGA,UAAM,kBAAkB,KAAK,SAAS,SAAS,sBAAsB;AAAA;AAAA,MAEjE,mBAAmB;AAAA,QACf,gBAAgB,QAAQ;AAAA,QACxB,kBAAkB,QAAQ;AAAA,QAC1B,mBAAmB,QAAQ;AAAA,MAC/B;AAAA,MACA,aAAa;AAAA,IACjB,CAAC;AACD,UAAM,6BAA6B,IAAI,sCAAe,aAAa,eAAe;AAClF,UAAM,eAAe,KAAK,SAAS,UAAU;AAAA,MACzC;AAAA,MACA;AAAA,IACJ;AAEA,QAAI;AACJ,QAAI;AACA,0BAAoB,MAAM,KAAK,YAAY;AAAA,QACvC,KAAK,SAAS,SAAS;AAAA,QACvB;AAAA,QACA;AAAA,MACJ;AAAA,IACJ,SAAS,GAAG;AAER,YAAM,aAAa,MAAM;AACzB,UAAI,aAAa,iDAA4B;AACzC,cAAM,IAAI;AAAA,UACN,uEAAuE,EAAE,OAAO;AAAA,QACpF;AAAA,MACJ;AACA,YAAM;AAAA,IACV;AAEA,UAAM,gBAAgB,QAAQ;AAC9B,WAAO,IAAI,sCAAe,aAAa,iBAAiB;AAAA,EAC5D;AAAA;AAAA,EAGA,mBAAmB,SAAsB;AACrC,QAAI,KAAK,SAAS,MAAM,IAAI,OAAO,GAAG;AAClC,YAAM,IAAI,sDAAmB,WAAW,QAAQ,MAAM,iDAAiD;AAAA,IAC3G;AAAA,EACJ;AAAA;AAAA,EAGA,kBAAkB,QAAgB,QAAiB;AAC/C,WAAO,MAAM;AACT,YAAM,UAAU,OAAO,UAAU,UAAU,oBAAO,wBAAwB,CAAC;AAC3E,UAAI;AACA,aAAK,mBAAmB,OAAO;AAAA,MACnC,SAAS,OAAO;AACZ,YAAI,iBAAiB,yDAAsB,WAAW,QAAW;AAC7D,gBAAM;AAAA,QACV;AACA;AAAA,MACJ;AACA,aAAO;AAAA,IACX;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,yBACF,0BACA,SACA,eACoB;AACpB,UAAM;AAAA,MACF;AAAA,MACA,uBAAuB;AAAA,MACvB,wBAAwB;AAAA,IAC5B,IAAI;AAEJ,UAAM,uBAAuB;AAAA,MACzB,oBAAoB,kDAAqB,uBAAuB;AAAA;AAAA,MAChE,uBAAuB;AAAA,MACvB,GAAG;AAAA,IACP;AA8BA,UAAM,UAAU,KAAK,kBAAkB,QAAQ,qBAAqB,MAAM;AAC1E,WAAO;AAAA,MACH,+BAA+B,QAAQ,MAAM,gBAAgB,OAAO,QAAQ,WAAW,QAAQ,WAAW;AAAA,IAC9G;AACA,UAAM,uBAAuB,IAAI;AAAA;AAAA,MAE7B,IAAI;AAAA,QACA,IAAI,yDAAiC,KAAK,SAAS,WAAW,wBAAwB;AAAA,QACtF,KAAK,SAAS,QAAQ,MAAM;AAAA,QAC5B;AAAA,MACJ;AAAA,MACA,KAAK,SAAS;AAAA,MACd;AAAA,MACA;AAAA,MACA,OAAOA,UAAS,kCAAkC;AAC9C,YAAI,CAAC,+BAA+B;AAMhC,gBAAM,yBAAyB,MAAM;AAAA,QACzC;AAEA,YAAI,6BAA6B,QAAW;AACxC,gBAAM,yBAAyBA,UAAS,aAAa;AACrD;AAAA,QACJ;AAGA,eAAO,MAAM,KAAK,SAAS,QAAQ,QAAQA,UAAS;AAAA,UAChD,kBAAkB;AAAA,YACd,eAAe,iCAAkB;AAAA,YACjC,gBAAgB;AAAA,YAChB;AAAA,UACJ;AAAA,UACA,kBAAkB;AAAA,QACtB,CAAC;AAAA,MACL;AAAA,IACJ;AAEA,QAAI;AACA,YAAM,qBAAqB,qBAAqB;AAAA,IACpD,SAAS,OAAO;AAEZ,YAAM,KAAK,SAAS,QAAQ,MAAM,OAAO,OAAO;AAChD,YAAM;AAAA,IACV,UAAE;AACE,UAAI,CAAC,yBAAyB,QAAQ;AAMlC,cAAM,yBAAyB,MAAM;AAAA,MACzC;AAAA,IACJ;AAEA,WAAO;AAAA,EACX;AACJ;",
|
|
5
5
|
"names": ["address"]
|
|
6
6
|
}
|
|
@@ -13,6 +13,7 @@ import { DiscoveryCapabilitiesBitmap, NodeId, TypeFromPartialBitSchema } from "#
|
|
|
13
13
|
import { InteractionClientProvider } from "../interaction/InteractionClient.js";
|
|
14
14
|
import { ExchangeManager, MessageChannel } from "../protocol/ExchangeManager.js";
|
|
15
15
|
import { PeerAddress } from "./PeerAddress.js";
|
|
16
|
+
import { PeerSet } from "./PeerSet.js";
|
|
16
17
|
/**
|
|
17
18
|
* General commissioning options.
|
|
18
19
|
*/
|
|
@@ -80,6 +81,7 @@ export interface DiscoveryAndCommissioningOptions extends CommissioningOptions {
|
|
|
80
81
|
* Interfaces {@link ControllerCommissioner} with other components.
|
|
81
82
|
*/
|
|
82
83
|
export interface ControllerCommissionerContext {
|
|
84
|
+
peers: PeerSet;
|
|
83
85
|
clients: InteractionClientProvider;
|
|
84
86
|
scanners: ScannerSet;
|
|
85
87
|
netInterfaces: NetInterfaceSet;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ControllerCommissioner.d.ts","sourceRoot":"","sources":["../../../src/peer/ControllerCommissioner.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,sCAAsC,CAAC;AAE5E,OAAO,EAAE,oBAAoB,EAAE,+BAA+B,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACtH,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAGH,YAAY,EAEZ,WAAW,EACX,aAAa,EAGb,eAAe,EAEf,aAAa,EAEhB,MAAM,UAAU,CAAC;AAElB,OAAO,
|
|
1
|
+
{"version":3,"file":"ControllerCommissioner.d.ts","sourceRoot":"","sources":["../../../src/peer/ControllerCommissioner.ts"],"names":[],"mappings":"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"}
|
|
@@ -17,7 +17,10 @@ import {
|
|
|
17
17
|
serverAddressToString
|
|
18
18
|
} from "#general";
|
|
19
19
|
import { MdnsScanner } from "#mdns/MdnsScanner.js";
|
|
20
|
-
import {
|
|
20
|
+
import {
|
|
21
|
+
CommissioningError,
|
|
22
|
+
ControllerCommissioningFlow
|
|
23
|
+
} from "#peer/ControllerCommissioningFlow.js";
|
|
21
24
|
import { ControllerDiscovery, PairRetransmissionLimitReachedError } from "#peer/ControllerDiscovery.js";
|
|
22
25
|
import { ChannelStatusResponseError } from "#securechannel/index.js";
|
|
23
26
|
import { PaseClient } from "#session/index.js";
|
|
@@ -26,7 +29,7 @@ import { NodeId, SECURE_CHANNEL_PROTOCOL_ID } from "#types";
|
|
|
26
29
|
import { InteractionClient, InteractionClientProvider } from "../interaction/InteractionClient.js";
|
|
27
30
|
import { ExchangeManager, MessageChannel } from "../protocol/ExchangeManager.js";
|
|
28
31
|
import { DedicatedChannelExchangeProvider } from "../protocol/ExchangeProvider.js";
|
|
29
|
-
import { NodeDiscoveryType } from "./PeerSet.js";
|
|
32
|
+
import { NodeDiscoveryType, PeerSet } from "./PeerSet.js";
|
|
30
33
|
const logger = Logger.get("PeerCommissioner");
|
|
31
34
|
class ControllerCommissioner {
|
|
32
35
|
#context;
|
|
@@ -37,6 +40,7 @@ class ControllerCommissioner {
|
|
|
37
40
|
}
|
|
38
41
|
static [Environmental.create](env) {
|
|
39
42
|
const instance = new ControllerCommissioner({
|
|
43
|
+
peers: env.get(PeerSet),
|
|
40
44
|
clients: env.get(InteractionClientProvider),
|
|
41
45
|
scanners: env.get(ScannerSet),
|
|
42
46
|
netInterfaces: env.get(NetInterfaceSet),
|
|
@@ -51,7 +55,10 @@ class ControllerCommissioner {
|
|
|
51
55
|
* Commmission a previously discovered node.
|
|
52
56
|
*/
|
|
53
57
|
async commission(options) {
|
|
54
|
-
const { passcode, addresses, discoveryData } = options;
|
|
58
|
+
const { passcode, addresses, discoveryData, fabric, nodeId } = options;
|
|
59
|
+
if (nodeId !== void 0) {
|
|
60
|
+
this.#assertPeerAddress(fabric.addressOf(nodeId));
|
|
61
|
+
}
|
|
55
62
|
addresses.sort((a) => a.type === "udp" ? -1 : 1);
|
|
56
63
|
let channel;
|
|
57
64
|
for (const address of addresses) {
|
|
@@ -135,6 +142,10 @@ class ControllerCommissioner {
|
|
|
135
142
|
* Commission a node with discovery.
|
|
136
143
|
*/
|
|
137
144
|
async commissionWithDiscovery(options) {
|
|
145
|
+
const { fabric, nodeId } = options;
|
|
146
|
+
if (nodeId !== void 0) {
|
|
147
|
+
this.#assertPeerAddress(fabric.addressOf(nodeId));
|
|
148
|
+
}
|
|
138
149
|
const { paseSecureChannel, discoveryData } = await this.discoverAndEstablishPase(options);
|
|
139
150
|
return await this.#commissionConnectedNode(paseSecureChannel, options, discoveryData);
|
|
140
151
|
}
|
|
@@ -203,23 +214,44 @@ class ControllerCommissioner {
|
|
|
203
214
|
await unsecureSession.destroy();
|
|
204
215
|
return new MessageChannel(paseChannel, paseSecureSession);
|
|
205
216
|
}
|
|
217
|
+
/** Validate if a Peert Address is already known and commissioned */
|
|
218
|
+
#assertPeerAddress(address) {
|
|
219
|
+
if (this.#context.peers.has(address)) {
|
|
220
|
+
throw new CommissioningError(`Node ID ${address.nodeId} is already commissioned and can not be reused.`);
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
/** Finds an unused random Node-ID to use for commissioning if not already provided. */
|
|
224
|
+
#determineAddress(fabric, nodeId) {
|
|
225
|
+
while (true) {
|
|
226
|
+
const address = fabric.addressOf(nodeId ?? NodeId.randomOperationalNodeId());
|
|
227
|
+
try {
|
|
228
|
+
this.#assertPeerAddress(address);
|
|
229
|
+
} catch (error) {
|
|
230
|
+
if (error instanceof CommissioningError && nodeId !== void 0) {
|
|
231
|
+
throw error;
|
|
232
|
+
}
|
|
233
|
+
continue;
|
|
234
|
+
}
|
|
235
|
+
return address;
|
|
236
|
+
}
|
|
237
|
+
}
|
|
206
238
|
/**
|
|
207
239
|
* Method to commission a device with a PASE secure channel. It returns the NodeId of the commissioned device on
|
|
208
240
|
* success.
|
|
209
241
|
*/
|
|
210
242
|
async #commissionConnectedNode(paseSecureMessageChannel, options, discoveryData) {
|
|
243
|
+
const {
|
|
244
|
+
fabric,
|
|
245
|
+
finalizeCommissioning: performCaseCommissioning,
|
|
246
|
+
commissioningFlowImpl = ControllerCommissioningFlow
|
|
247
|
+
} = options;
|
|
211
248
|
const commissioningOptions = {
|
|
212
249
|
regulatoryLocation: GeneralCommissioning.RegulatoryLocationType.Outdoor,
|
|
213
250
|
// Set to the most restrictive if relevant
|
|
214
251
|
regulatoryCountryCode: "XX",
|
|
215
252
|
...options
|
|
216
253
|
};
|
|
217
|
-
const
|
|
218
|
-
fabric,
|
|
219
|
-
finalizeCommissioning: performCaseCommissioning,
|
|
220
|
-
commissioningFlowImpl = ControllerCommissioningFlow
|
|
221
|
-
} = commissioningOptions;
|
|
222
|
-
const address = fabric.addressOf(commissioningOptions.nodeId ?? NodeId.randomOperationalNodeId());
|
|
254
|
+
const address = this.#determineAddress(fabric, commissioningOptions.nodeId);
|
|
223
255
|
logger.info(
|
|
224
256
|
`Start commissioning of node ${address.nodeId} into fabric ${fabric.fabricId} (index ${address.fabricIndex})`
|
|
225
257
|
);
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/peer/ControllerCommissioner.ts"],
|
|
4
|
-
"mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;AAMA,SAAS,4BAA4B;AACrC,SAAS,4BAA4B;AACrC,SAA+E,kBAAkB;AAEjG;AAAA,EAEI;AAAA,EAEA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,OACG;AACP,SAAS,mBAAmB;AAC5B,
|
|
4
|
+
"mappings": "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",
|
|
5
5
|
"names": ["address"]
|
|
6
6
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@matter/protocol",
|
|
3
|
-
"version": "0.13.0-alpha.0-
|
|
3
|
+
"version": "0.13.0-alpha.0-20250425-94b33ff98",
|
|
4
4
|
"description": "Low-level APIs for Matter interaction",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"iot",
|
|
@@ -40,13 +40,13 @@
|
|
|
40
40
|
"#*": "./src/*"
|
|
41
41
|
},
|
|
42
42
|
"dependencies": {
|
|
43
|
-
"@matter/general": "0.13.0-alpha.0-
|
|
44
|
-
"@matter/model": "0.13.0-alpha.0-
|
|
45
|
-
"@matter/types": "0.13.0-alpha.0-
|
|
43
|
+
"@matter/general": "0.13.0-alpha.0-20250425-94b33ff98",
|
|
44
|
+
"@matter/model": "0.13.0-alpha.0-20250425-94b33ff98",
|
|
45
|
+
"@matter/types": "0.13.0-alpha.0-20250425-94b33ff98"
|
|
46
46
|
},
|
|
47
47
|
"devDependencies": {
|
|
48
|
-
"@matter/tools": "0.13.0-alpha.0-
|
|
49
|
-
"@matter/testing": "0.13.0-alpha.0-
|
|
48
|
+
"@matter/tools": "0.13.0-alpha.0-20250425-94b33ff98",
|
|
49
|
+
"@matter/testing": "0.13.0-alpha.0-20250425-94b33ff98"
|
|
50
50
|
},
|
|
51
51
|
"files": [
|
|
52
52
|
"dist/**/*",
|
|
@@ -23,7 +23,11 @@ import {
|
|
|
23
23
|
serverAddressToString,
|
|
24
24
|
} from "#general";
|
|
25
25
|
import { MdnsScanner } from "#mdns/MdnsScanner.js";
|
|
26
|
-
import {
|
|
26
|
+
import {
|
|
27
|
+
CommissioningError,
|
|
28
|
+
ControllerCommissioningFlow,
|
|
29
|
+
ControllerCommissioningFlowOptions,
|
|
30
|
+
} from "#peer/ControllerCommissioningFlow.js";
|
|
27
31
|
import { ControllerDiscovery, PairRetransmissionLimitReachedError } from "#peer/ControllerDiscovery.js";
|
|
28
32
|
import { ChannelStatusResponseError } from "#securechannel/index.js";
|
|
29
33
|
import { PaseClient } from "#session/index.js";
|
|
@@ -33,7 +37,7 @@ import { InteractionClient, InteractionClientProvider } from "../interaction/Int
|
|
|
33
37
|
import { ExchangeManager, MessageChannel } from "../protocol/ExchangeManager.js";
|
|
34
38
|
import { DedicatedChannelExchangeProvider } from "../protocol/ExchangeProvider.js";
|
|
35
39
|
import { PeerAddress } from "./PeerAddress.js";
|
|
36
|
-
import { NodeDiscoveryType } from "./PeerSet.js";
|
|
40
|
+
import { NodeDiscoveryType, PeerSet } from "./PeerSet.js";
|
|
37
41
|
|
|
38
42
|
const logger = Logger.get("PeerCommissioner");
|
|
39
43
|
|
|
@@ -116,6 +120,7 @@ export interface DiscoveryAndCommissioningOptions extends CommissioningOptions {
|
|
|
116
120
|
* Interfaces {@link ControllerCommissioner} with other components.
|
|
117
121
|
*/
|
|
118
122
|
export interface ControllerCommissionerContext {
|
|
123
|
+
peers: PeerSet;
|
|
119
124
|
clients: InteractionClientProvider;
|
|
120
125
|
scanners: ScannerSet;
|
|
121
126
|
netInterfaces: NetInterfaceSet;
|
|
@@ -138,6 +143,7 @@ export class ControllerCommissioner {
|
|
|
138
143
|
|
|
139
144
|
static [Environmental.create](env: Environment) {
|
|
140
145
|
const instance = new ControllerCommissioner({
|
|
146
|
+
peers: env.get(PeerSet),
|
|
141
147
|
clients: env.get(InteractionClientProvider),
|
|
142
148
|
scanners: env.get(ScannerSet),
|
|
143
149
|
netInterfaces: env.get(NetInterfaceSet),
|
|
@@ -153,7 +159,12 @@ export class ControllerCommissioner {
|
|
|
153
159
|
* Commmission a previously discovered node.
|
|
154
160
|
*/
|
|
155
161
|
async commission(options: LocatedNodeCommissioningOptions): Promise<PeerAddress> {
|
|
156
|
-
const { passcode, addresses, discoveryData } = options;
|
|
162
|
+
const { passcode, addresses, discoveryData, fabric, nodeId } = options;
|
|
163
|
+
|
|
164
|
+
// If a NodeId is set verify that this nodeId is not already used
|
|
165
|
+
if (nodeId !== undefined) {
|
|
166
|
+
this.#assertPeerAddress(fabric.addressOf(nodeId));
|
|
167
|
+
}
|
|
157
168
|
|
|
158
169
|
// Prioritize UDP
|
|
159
170
|
addresses.sort(a => (a.type === "udp" ? -1 : 1));
|
|
@@ -268,6 +279,12 @@ export class ControllerCommissioner {
|
|
|
268
279
|
* Commission a node with discovery.
|
|
269
280
|
*/
|
|
270
281
|
async commissionWithDiscovery(options: DiscoveryAndCommissioningOptions): Promise<PeerAddress> {
|
|
282
|
+
const { fabric, nodeId } = options;
|
|
283
|
+
// If a NodeId is set verify that this nodeId is not already used
|
|
284
|
+
if (nodeId !== undefined) {
|
|
285
|
+
this.#assertPeerAddress(fabric.addressOf(nodeId));
|
|
286
|
+
}
|
|
287
|
+
|
|
271
288
|
// Establish PASE channel
|
|
272
289
|
const { paseSecureChannel, discoveryData } = await this.discoverAndEstablishPase(options);
|
|
273
290
|
|
|
@@ -353,6 +370,29 @@ export class ControllerCommissioner {
|
|
|
353
370
|
return new MessageChannel(paseChannel, paseSecureSession);
|
|
354
371
|
}
|
|
355
372
|
|
|
373
|
+
/** Validate if a Peert Address is already known and commissioned */
|
|
374
|
+
#assertPeerAddress(address: PeerAddress) {
|
|
375
|
+
if (this.#context.peers.has(address)) {
|
|
376
|
+
throw new CommissioningError(`Node ID ${address.nodeId} is already commissioned and can not be reused.`);
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
/** Finds an unused random Node-ID to use for commissioning if not already provided. */
|
|
381
|
+
#determineAddress(fabric: Fabric, nodeId?: NodeId) {
|
|
382
|
+
while (true) {
|
|
383
|
+
const address = fabric.addressOf(nodeId ?? NodeId.randomOperationalNodeId());
|
|
384
|
+
try {
|
|
385
|
+
this.#assertPeerAddress(address);
|
|
386
|
+
} catch (error) {
|
|
387
|
+
if (error instanceof CommissioningError && nodeId !== undefined) {
|
|
388
|
+
throw error;
|
|
389
|
+
}
|
|
390
|
+
continue;
|
|
391
|
+
}
|
|
392
|
+
return address;
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
|
|
356
396
|
/**
|
|
357
397
|
* Method to commission a device with a PASE secure channel. It returns the NodeId of the commissioned device on
|
|
358
398
|
* success.
|
|
@@ -362,18 +402,18 @@ export class ControllerCommissioner {
|
|
|
362
402
|
options: CommissioningOptions,
|
|
363
403
|
discoveryData?: DiscoveryData,
|
|
364
404
|
): Promise<PeerAddress> {
|
|
405
|
+
const {
|
|
406
|
+
fabric,
|
|
407
|
+
finalizeCommissioning: performCaseCommissioning,
|
|
408
|
+
commissioningFlowImpl = ControllerCommissioningFlow,
|
|
409
|
+
} = options;
|
|
410
|
+
|
|
365
411
|
const commissioningOptions = {
|
|
366
412
|
regulatoryLocation: GeneralCommissioning.RegulatoryLocationType.Outdoor, // Set to the most restrictive if relevant
|
|
367
413
|
regulatoryCountryCode: "XX",
|
|
368
414
|
...options,
|
|
369
415
|
};
|
|
370
416
|
|
|
371
|
-
const {
|
|
372
|
-
fabric,
|
|
373
|
-
finalizeCommissioning: performCaseCommissioning,
|
|
374
|
-
commissioningFlowImpl = ControllerCommissioningFlow,
|
|
375
|
-
} = commissioningOptions;
|
|
376
|
-
|
|
377
417
|
// TODO: Create the fabric only when needed before commissioning (to do when refactoring MatterController away)
|
|
378
418
|
// TODO also move certificateManager and other parts into that class to get rid of them here
|
|
379
419
|
// TODO Depending on the Error type during commissioning we can do a retry ...
|
|
@@ -402,7 +442,7 @@ export class ControllerCommissioner {
|
|
|
402
442
|
Commissionee SHALL exit Commissioning Mode after 20 failed attempts.
|
|
403
443
|
*/
|
|
404
444
|
|
|
405
|
-
const address = fabric
|
|
445
|
+
const address = this.#determineAddress(fabric, commissioningOptions.nodeId);
|
|
406
446
|
logger.info(
|
|
407
447
|
`Start commissioning of node ${address.nodeId} into fabric ${fabric.fabricId} (index ${address.fabricIndex})`,
|
|
408
448
|
);
|