@matter/protocol 0.12.0-alpha.0-20250108-7ae2a767d → 0.12.0-alpha.0-20250112-2972cf298

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 (59) hide show
  1. package/dist/cjs/interaction/ServerSubscription.d.ts.map +1 -1
  2. package/dist/cjs/interaction/ServerSubscription.js +7 -3
  3. package/dist/cjs/interaction/ServerSubscription.js.map +1 -1
  4. package/dist/cjs/mdns/MdnsBroadcaster.d.ts +3 -3
  5. package/dist/cjs/mdns/MdnsBroadcaster.d.ts.map +1 -1
  6. package/dist/cjs/mdns/MdnsBroadcaster.js +55 -31
  7. package/dist/cjs/mdns/MdnsBroadcaster.js.map +1 -1
  8. package/dist/cjs/mdns/MdnsScanner.d.ts.map +1 -1
  9. package/dist/cjs/mdns/MdnsScanner.js +226 -28
  10. package/dist/cjs/mdns/MdnsScanner.js.map +1 -1
  11. package/dist/cjs/mdns/MdnsServer.d.ts +5 -1
  12. package/dist/cjs/mdns/MdnsServer.d.ts.map +1 -1
  13. package/dist/cjs/mdns/MdnsServer.js +12 -7
  14. package/dist/cjs/mdns/MdnsServer.js.map +1 -1
  15. package/dist/cjs/peer/ControllerCommissioningFlow.d.ts.map +1 -1
  16. package/dist/cjs/peer/ControllerCommissioningFlow.js +35 -2
  17. package/dist/cjs/peer/ControllerCommissioningFlow.js.map +1 -1
  18. package/dist/cjs/protocol/DeviceAdvertiser.d.ts.map +1 -1
  19. package/dist/cjs/protocol/DeviceAdvertiser.js +6 -1
  20. package/dist/cjs/protocol/DeviceAdvertiser.js.map +1 -1
  21. package/dist/cjs/protocol/DeviceCommissioner.d.ts.map +1 -1
  22. package/dist/cjs/protocol/DeviceCommissioner.js +5 -1
  23. package/dist/cjs/protocol/DeviceCommissioner.js.map +1 -1
  24. package/dist/cjs/protocol/ExchangeManager.js +1 -1
  25. package/dist/cjs/protocol/ExchangeManager.js.map +1 -1
  26. package/dist/esm/interaction/ServerSubscription.d.ts.map +1 -1
  27. package/dist/esm/interaction/ServerSubscription.js +7 -3
  28. package/dist/esm/interaction/ServerSubscription.js.map +1 -1
  29. package/dist/esm/mdns/MdnsBroadcaster.d.ts +3 -3
  30. package/dist/esm/mdns/MdnsBroadcaster.d.ts.map +1 -1
  31. package/dist/esm/mdns/MdnsBroadcaster.js +56 -31
  32. package/dist/esm/mdns/MdnsBroadcaster.js.map +1 -1
  33. package/dist/esm/mdns/MdnsScanner.d.ts.map +1 -1
  34. package/dist/esm/mdns/MdnsScanner.js +226 -28
  35. package/dist/esm/mdns/MdnsScanner.js.map +1 -1
  36. package/dist/esm/mdns/MdnsServer.d.ts +5 -1
  37. package/dist/esm/mdns/MdnsServer.d.ts.map +1 -1
  38. package/dist/esm/mdns/MdnsServer.js +12 -7
  39. package/dist/esm/mdns/MdnsServer.js.map +1 -1
  40. package/dist/esm/peer/ControllerCommissioningFlow.d.ts.map +1 -1
  41. package/dist/esm/peer/ControllerCommissioningFlow.js +36 -3
  42. package/dist/esm/peer/ControllerCommissioningFlow.js.map +1 -1
  43. package/dist/esm/protocol/DeviceAdvertiser.d.ts.map +1 -1
  44. package/dist/esm/protocol/DeviceAdvertiser.js +6 -1
  45. package/dist/esm/protocol/DeviceAdvertiser.js.map +1 -1
  46. package/dist/esm/protocol/DeviceCommissioner.d.ts.map +1 -1
  47. package/dist/esm/protocol/DeviceCommissioner.js +5 -1
  48. package/dist/esm/protocol/DeviceCommissioner.js.map +1 -1
  49. package/dist/esm/protocol/ExchangeManager.js +1 -1
  50. package/dist/esm/protocol/ExchangeManager.js.map +1 -1
  51. package/package.json +6 -6
  52. package/src/interaction/ServerSubscription.ts +7 -3
  53. package/src/mdns/MdnsBroadcaster.ts +63 -35
  54. package/src/mdns/MdnsScanner.ts +264 -43
  55. package/src/mdns/MdnsServer.ts +20 -7
  56. package/src/peer/ControllerCommissioningFlow.ts +48 -3
  57. package/src/protocol/DeviceAdvertiser.ts +7 -1
  58. package/src/protocol/DeviceCommissioner.ts +11 -2
  59. package/src/protocol/ExchangeManager.ts +1 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@matter/protocol",
3
- "version": "0.12.0-alpha.0-20250108-7ae2a767d",
3
+ "version": "0.12.0-alpha.0-20250112-2972cf298",
4
4
  "description": "Low-level APIs for Matter interaction",
5
5
  "keywords": [
6
6
  "iot",
@@ -40,14 +40,14 @@
40
40
  "#*": "./src/*"
41
41
  },
42
42
  "dependencies": {
43
- "@matter/general": "0.12.0-alpha.0-20250108-7ae2a767d",
44
- "@matter/model": "0.12.0-alpha.0-20250108-7ae2a767d",
45
- "@matter/types": "0.12.0-alpha.0-20250108-7ae2a767d",
43
+ "@matter/general": "0.12.0-alpha.0-20250112-2972cf298",
44
+ "@matter/model": "0.12.0-alpha.0-20250112-2972cf298",
45
+ "@matter/types": "0.12.0-alpha.0-20250112-2972cf298",
46
46
  "@noble/curves": "^1.8.0"
47
47
  },
48
48
  "devDependencies": {
49
- "@matter/tools": "0.12.0-alpha.0-20250108-7ae2a767d",
50
- "@matter/testing": "0.12.0-alpha.0-20250108-7ae2a767d"
49
+ "@matter/tools": "0.12.0-alpha.0-20250112-2972cf298",
50
+ "@matter/testing": "0.12.0-alpha.0-20250112-2972cf298"
51
51
  },
52
52
  "files": [
53
53
  "dist/**/*",
@@ -676,9 +676,9 @@ export class ServerSubscription extends Subscription {
676
676
  attributes.push({ path, value, version, schema: attribute.schema, attribute });
677
677
  } catch (error) {
678
678
  if (StatusResponseError.is(error, StatusCode.UnsupportedAccess)) {
679
- logger.error(`Permission denied reading attribute ${this.#structure.resolveAttributeName(path)}`);
679
+ logger.warn(`Permission denied reading attribute ${this.#structure.resolveAttributeName(path)}`);
680
680
  } else {
681
- logger.error(`Error reading attribute ${this.#structure.resolveAttributeName(path)}:`, error);
681
+ logger.warn(`Error reading attribute ${this.#structure.resolveAttributeName(path)}:`, error);
682
682
  }
683
683
  }
684
684
  }
@@ -726,7 +726,11 @@ export class ServerSubscription extends Subscription {
726
726
  });
727
727
  }
728
728
  } catch (error) {
729
- logger.error(`Error reading event ${this.#structure.resolveEventName(path)}:`, error);
729
+ if (StatusResponseError.is(error, StatusCode.UnsupportedAccess)) {
730
+ logger.warn(`Permission denied reading event ${this.#structure.resolveEventName(path)}`);
731
+ } else {
732
+ logger.warn(`Error reading event ${this.#structure.resolveEventName(path)}:`, error);
733
+ }
730
734
  }
731
735
  }
732
736
  eventReportsPayload.sort((a, b) => {
@@ -14,6 +14,7 @@ import {
14
14
  DnsRecord,
15
15
  ImplementationError,
16
16
  Logger,
17
+ MatterAggregateError,
17
18
  Network,
18
19
  PtrRecord,
19
20
  SrvRecord,
@@ -66,7 +67,7 @@ const DEFAULT_PAIRING_HINT = {
66
67
  */
67
68
  export class MdnsBroadcaster {
68
69
  readonly #activeCommissioningAnnouncements = new Set<number>();
69
- readonly #activeOperationalAnnouncements = new Map<number, FabricIndex[]>();
70
+ readonly #activeOperationalAnnouncements = new Map<number, { fabricIndex: FabricIndex; forInstance: string }[]>();
70
71
  readonly #network: Network;
71
72
  readonly #mdnsServer: MdnsServer;
72
73
  readonly #enableIpv4?: boolean;
@@ -255,20 +256,37 @@ export class MdnsBroadcaster {
255
256
  }: OperationalInstanceData = {},
256
257
  ) {
257
258
  const currentOperationalFabrics = this.#activeOperationalAnnouncements.get(announcedNetPort);
259
+
260
+ this.#activeOperationalAnnouncements.set(
261
+ announcedNetPort,
262
+ fabrics.map(f => ({
263
+ fabricIndex: f.fabricIndex,
264
+ forInstance: getDeviceMatterQname(
265
+ Bytes.toHex(f.operationalId).toUpperCase(),
266
+ NodeId.toHexString(f.nodeId),
267
+ ),
268
+ })),
269
+ );
270
+
271
+ const expires = new Array<Promise<void>>();
272
+
258
273
  if (currentOperationalFabrics !== undefined) {
259
274
  const fabricIndexesSet = new Set(fabrics.map(f => f.fabricIndex));
260
275
 
261
- // Expire Fabric announcements if any entry got removed
262
- if (!currentOperationalFabrics.every(fabricIndex => fabricIndexesSet.has(fabricIndex))) {
263
- await this.expireFabricAnnouncement(announcedNetPort);
276
+ // Expire Fabric announcements for instances that got removed
277
+ for (const { fabricIndex, forInstance } of currentOperationalFabrics) {
278
+ if (!fabricIndexesSet.has(fabricIndex)) {
279
+ expires.push(
280
+ this.#mdnsServer.expireAnnouncements({
281
+ announcedNetPort,
282
+ type: AnnouncementType.Operative,
283
+ forInstance,
284
+ }),
285
+ );
286
+ }
264
287
  }
265
288
  }
266
289
 
267
- this.#activeOperationalAnnouncements.set(
268
- announcedNetPort,
269
- fabrics.map(f => f.fabricIndex),
270
- );
271
-
272
290
  await this.#mdnsServer.setRecordsGenerator(announcedNetPort, AnnouncementType.Operative, async netInterface => {
273
291
  const ipMac = await this.#network.getIpMac(netInterface);
274
292
  if (ipMac === undefined) return [];
@@ -285,30 +303,40 @@ export class MdnsBroadcaster {
285
303
  logger.debug(
286
304
  "Announcement Generator: Fabric",
287
305
  Diagnostic.dict({
288
- id: `${Bytes.toHex(operationalId)}/${nodeId}`,
306
+ id: `${operationalIdString}-${NodeId.toHexString(nodeId)}`,
289
307
  qname: deviceMatterQname,
290
308
  port: announcedNetPort,
291
309
  interface: netInterface,
292
310
  }),
293
311
  );
294
312
  const fabricRecords = [
295
- PtrRecord(SERVICE_DISCOVERY_QNAME, fabricQname),
296
- PtrRecord(MATTER_SERVICE_QNAME, deviceMatterQname),
297
- PtrRecord(fabricQname, deviceMatterQname),
298
- SrvRecord(deviceMatterQname, { priority: 0, weight: 0, port: announcedNetPort, target: hostname }),
299
- TxtRecord(deviceMatterQname, [
300
- `SII=${sessionIdleInterval}` /* Session Idle Interval */,
301
- `SAI=${sessionActiveInterval}` /* Session Active Interval */,
302
- `SAT=${sessionActiveThreshold}` /* Session Active Threshold */,
303
- //`T=${TCP_SUPPORTED}` /* TCP not supported */,
304
- //`ICD=${ICD_SUPPORTED}` /* ICD not supported */,
305
- ]),
313
+ PtrRecord(SERVICE_DISCOVERY_QNAME, fabricQname, deviceMatterQname),
314
+ PtrRecord(MATTER_SERVICE_QNAME, deviceMatterQname, deviceMatterQname),
315
+ PtrRecord(fabricQname, deviceMatterQname, deviceMatterQname),
316
+ SrvRecord(
317
+ deviceMatterQname,
318
+ { priority: 0, weight: 0, port: announcedNetPort, target: hostname },
319
+ deviceMatterQname,
320
+ ),
321
+ TxtRecord(
322
+ deviceMatterQname,
323
+ [
324
+ `SII=${sessionIdleInterval}` /* Session Idle Interval */,
325
+ `SAI=${sessionActiveInterval}` /* Session Active Interval */,
326
+ `SAT=${sessionActiveThreshold}` /* Session Active Threshold */,
327
+ //`T=${TCP_SUPPORTED}` /* TCP not supported */,
328
+ //`ICD=${ICD_SUPPORTED}` /* ICD not supported */,
329
+ ],
330
+ deviceMatterQname,
331
+ ),
306
332
  ];
307
333
  records.push(...fabricRecords);
308
334
  });
309
335
  records.push(...this.#getIpRecords(hostname, [...ipV6, ...ipV4]));
310
336
  return records;
311
337
  });
338
+
339
+ await MatterAggregateError.allSettled(expires);
312
340
  }
313
341
 
314
342
  /** Set the Broadcaster data to announce a Commissioner (aka Commissioner discovery) */
@@ -378,29 +406,29 @@ export class MdnsBroadcaster {
378
406
  this.#mdnsServer.announce(announcementPort).catch(error => logger.error(error));
379
407
  }
380
408
 
381
- async expireFabricAnnouncement(announcementPort: number) {
382
- if (this.#activeOperationalAnnouncements.has(announcementPort)) {
383
- await this.#mdnsServer.expireAnnouncements(announcementPort, AnnouncementType.Operative);
384
- this.#activeOperationalAnnouncements.delete(announcementPort);
409
+ async expireFabricAnnouncement(announcedNetPort: number) {
410
+ if (this.#activeOperationalAnnouncements.has(announcedNetPort)) {
411
+ await this.#mdnsServer.expireAnnouncements({ announcedNetPort, type: AnnouncementType.Operative });
412
+ this.#activeOperationalAnnouncements.delete(announcedNetPort);
385
413
  }
386
414
  }
387
415
 
388
- async expireCommissioningAnnouncement(announcementPort: number) {
389
- if (this.#activeCommissioningAnnouncements.has(announcementPort)) {
390
- await this.#mdnsServer.expireAnnouncements(announcementPort, AnnouncementType.Commissionable);
391
- this.#activeCommissioningAnnouncements.delete(announcementPort);
416
+ async expireCommissioningAnnouncement(announcedNetPort: number) {
417
+ if (this.#activeCommissioningAnnouncements.has(announcedNetPort)) {
418
+ await this.#mdnsServer.expireAnnouncements({ announcedNetPort, type: AnnouncementType.Commissionable });
419
+ this.#activeCommissioningAnnouncements.delete(announcedNetPort);
392
420
  }
393
421
  }
394
422
 
395
- async expireAllAnnouncements(announcementPort: number) {
423
+ async expireAllAnnouncements(announcedNetPort: number) {
396
424
  if (
397
- !this.#activeCommissioningAnnouncements.has(announcementPort) &&
398
- !this.#activeOperationalAnnouncements.has(announcementPort)
425
+ !this.#activeCommissioningAnnouncements.has(announcedNetPort) &&
426
+ !this.#activeOperationalAnnouncements.has(announcedNetPort)
399
427
  )
400
428
  return;
401
- await this.#mdnsServer.expireAnnouncements(announcementPort);
402
- this.#activeCommissioningAnnouncements.delete(announcementPort);
403
- this.#activeOperationalAnnouncements.delete(announcementPort);
429
+ await this.#mdnsServer.expireAnnouncements({ announcedNetPort });
430
+ this.#activeCommissioningAnnouncements.delete(announcedNetPort);
431
+ this.#activeOperationalAnnouncements.delete(announcedNetPort);
404
432
  }
405
433
 
406
434
  async close() {