@matter/protocol 0.12.3-alpha.0-20250203-34ba45cae → 0.12.3-alpha.0-20250205-ad3416ca3

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 (42) hide show
  1. package/dist/cjs/certificate/CertificateManager.d.ts +1 -1
  2. package/dist/cjs/certificate/CertificateManager.d.ts.map +1 -1
  3. package/dist/cjs/certificate/CertificateManager.js +24 -17
  4. package/dist/cjs/certificate/CertificateManager.js.map +1 -1
  5. package/dist/cjs/fabric/Fabric.d.ts.map +1 -1
  6. package/dist/cjs/fabric/Fabric.js +12 -30
  7. package/dist/cjs/fabric/Fabric.js.map +1 -1
  8. package/dist/cjs/interaction/ServerSubscription.d.ts +4 -0
  9. package/dist/cjs/interaction/ServerSubscription.d.ts.map +1 -1
  10. package/dist/cjs/interaction/ServerSubscription.js +13 -4
  11. package/dist/cjs/interaction/ServerSubscription.js.map +1 -1
  12. package/dist/cjs/interaction/Subscription.d.ts +6 -7
  13. package/dist/cjs/interaction/Subscription.d.ts.map +1 -1
  14. package/dist/cjs/interaction/Subscription.js +3 -6
  15. package/dist/cjs/interaction/Subscription.js.map +1 -1
  16. package/dist/cjs/protocol/ExchangeManager.d.ts.map +1 -1
  17. package/dist/cjs/protocol/ExchangeManager.js +5 -0
  18. package/dist/cjs/protocol/ExchangeManager.js.map +1 -1
  19. package/dist/esm/certificate/CertificateManager.d.ts +1 -1
  20. package/dist/esm/certificate/CertificateManager.d.ts.map +1 -1
  21. package/dist/esm/certificate/CertificateManager.js +24 -17
  22. package/dist/esm/certificate/CertificateManager.js.map +1 -1
  23. package/dist/esm/fabric/Fabric.d.ts.map +1 -1
  24. package/dist/esm/fabric/Fabric.js +12 -30
  25. package/dist/esm/fabric/Fabric.js.map +1 -1
  26. package/dist/esm/interaction/ServerSubscription.d.ts +4 -0
  27. package/dist/esm/interaction/ServerSubscription.d.ts.map +1 -1
  28. package/dist/esm/interaction/ServerSubscription.js +13 -4
  29. package/dist/esm/interaction/ServerSubscription.js.map +1 -1
  30. package/dist/esm/interaction/Subscription.d.ts +6 -7
  31. package/dist/esm/interaction/Subscription.d.ts.map +1 -1
  32. package/dist/esm/interaction/Subscription.js +3 -6
  33. package/dist/esm/interaction/Subscription.js.map +1 -1
  34. package/dist/esm/protocol/ExchangeManager.d.ts.map +1 -1
  35. package/dist/esm/protocol/ExchangeManager.js +5 -0
  36. package/dist/esm/protocol/ExchangeManager.js.map +1 -1
  37. package/package.json +6 -6
  38. package/src/certificate/CertificateManager.ts +44 -27
  39. package/src/fabric/Fabric.ts +15 -33
  40. package/src/interaction/ServerSubscription.ts +15 -5
  41. package/src/interaction/Subscription.ts +7 -7
  42. package/src/protocol/ExchangeManager.ts +5 -0
@@ -16,7 +16,7 @@ export interface SubscriptionCriteria {
16
16
  /**
17
17
  * A single active subscription.
18
18
  */
19
- export declare class Subscription {
19
+ export declare abstract class Subscription {
20
20
  #private;
21
21
  constructor(session: SecureSession, id: SubscriptionId, criteria: SubscriptionCriteria);
22
22
  get id(): number;
@@ -25,7 +25,7 @@ export declare class Subscription {
25
25
  get isCanceledByPeer(): boolean;
26
26
  get session(): SecureSession;
27
27
  /**
28
- * Update session state. This probably is meaniningless except in a server context.
28
+ * Update session state. This probably is meaningless except in a server context.
29
29
  */
30
30
  update(): Promise<void>;
31
31
  /**
@@ -33,12 +33,11 @@ export declare class Subscription {
33
33
  */
34
34
  protected set isCanceledByPeer(value: boolean);
35
35
  protected set isClosed(value: boolean);
36
+ /** Close the subscription with the option to gracefully flush outstanding data. */
37
+ abstract close(graceful: boolean): Promise<void>;
36
38
  /**
37
- * Close the session.
38
- *
39
- * @param _graceful in a server context this means flush pending updates. Not sure if applies to client
40
- * subscriptions
39
+ * Destroy the subscription. Unsubscribe from all attributes and events and stop all timers.
41
40
  */
42
- close(_graceful?: boolean): Promise<void>;
41
+ protected destroy(): Promise<void>;
43
42
  }
44
43
  //# sourceMappingURL=Subscription.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Subscription.d.ts","sourceRoot":"","sources":["../../../src/interaction/Subscription.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,cAAc,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,QAAQ,CAAC;AAI9G,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC;AAEpC,MAAM,WAAW,oBAAoB;IACjC,iBAAiB,CAAC,EAAE,cAAc,CAAC,OAAO,gBAAgB,CAAC,EAAE,CAAC;IAC9D,kBAAkB,CAAC,EAAE,cAAc,CAAC,OAAO,oBAAoB,CAAC,EAAE,CAAC;IACnE,aAAa,CAAC,EAAE,cAAc,CAAC,OAAO,YAAY,CAAC,EAAE,CAAC;IACtD,YAAY,CAAC,EAAE,cAAc,CAAC,OAAO,cAAc,CAAC,EAAE,CAAC;IACvD,gBAAgB,EAAE,OAAO,CAAC;CAC7B;AAED;;GAEG;AACH,qBAAa,YAAY;;gBAOT,OAAO,EAAE,aAAa,EAAE,EAAE,EAAE,cAAc,EAAE,QAAQ,EAAE,oBAAoB;IAUtF,IAAI,EAAE,WAEL;IAED,IAAI,QAAQ,yBAEX;IAED,IAAI,QAAQ,IAwBkB,OAAO,CAtBpC;IAED,IAAI,gBAAgB,IAgBkB,OAAO,CAd5C;IAED,IAAI,OAAO,kBAEV;IAED;;OAEG;IACG,MAAM;IAEZ;;OAEG;IACH,SAAS,KAAK,gBAAgB,CAAC,KAAK,EAAE,OAAO,EAE5C;IAED,SAAS,KAAK,QAAQ,CAAC,KAAK,EAAE,OAAO,EAEpC;IAED;;;;;OAKG;IACG,KAAK,CAAC,SAAS,UAAO,GAAG,OAAO,CAAC,IAAI,CAAC;CAK/C"}
1
+ {"version":3,"file":"Subscription.d.ts","sourceRoot":"","sources":["../../../src/interaction/Subscription.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,cAAc,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,QAAQ,CAAC;AAI9G,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC;AAEpC,MAAM,WAAW,oBAAoB;IACjC,iBAAiB,CAAC,EAAE,cAAc,CAAC,OAAO,gBAAgB,CAAC,EAAE,CAAC;IAC9D,kBAAkB,CAAC,EAAE,cAAc,CAAC,OAAO,oBAAoB,CAAC,EAAE,CAAC;IACnE,aAAa,CAAC,EAAE,cAAc,CAAC,OAAO,YAAY,CAAC,EAAE,CAAC;IACtD,YAAY,CAAC,EAAE,cAAc,CAAC,OAAO,cAAc,CAAC,EAAE,CAAC;IACvD,gBAAgB,EAAE,OAAO,CAAC;CAC7B;AAED;;GAEG;AACH,8BAAsB,YAAY;;gBAOlB,OAAO,EAAE,aAAa,EAAE,EAAE,EAAE,cAAc,EAAE,QAAQ,EAAE,oBAAoB;IAUtF,IAAI,EAAE,WAEL;IAED,IAAI,QAAQ,yBAEX;IAED,IAAI,QAAQ,IAwBkB,OAAO,CAtBpC;IAED,IAAI,gBAAgB,IAgBkB,OAAO,CAd5C;IAED,IAAI,OAAO,kBAEV;IAED;;OAEG;IACG,MAAM;IAEZ;;OAEG;IACH,SAAS,KAAK,gBAAgB,CAAC,KAAK,EAAE,OAAO,EAE5C;IAED,SAAS,KAAK,QAAQ,CAAC,KAAK,EAAE,OAAO,EAEpC;IAED,mFAAmF;IACnF,QAAQ,CAAC,KAAK,CAAC,QAAQ,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAEhD;;OAEG;cACa,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAK3C"}
@@ -34,7 +34,7 @@ class Subscription {
34
34
  return this.#session;
35
35
  }
36
36
  /**
37
- * Update session state. This probably is meaniningless except in a server context.
37
+ * Update session state. This probably is meaningless except in a server context.
38
38
  */
39
39
  async update() {
40
40
  }
@@ -48,12 +48,9 @@ class Subscription {
48
48
  this.#isClosed = value;
49
49
  }
50
50
  /**
51
- * Close the session.
52
- *
53
- * @param _graceful in a server context this means flush pending updates. Not sure if applies to client
54
- * subscriptions
51
+ * Destroy the subscription. Unsubscribe from all attributes and events and stop all timers.
55
52
  */
56
- async close(_graceful = true) {
53
+ async destroy() {
57
54
  this.#isClosed = true;
58
55
  this.#session.subscriptions.delete(this);
59
56
  logger.debug(`Removed subscription ${this.id} from ${this.#session.name}`);
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/interaction/Subscription.ts"],
4
- "mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;AAMA,SAAS,cAAc;AAIvB,MAAM,SAAS,OAAO,IAAI,cAAc;AAejC,MAAM,aAAa;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA,YAAY,SAAwB,IAAoB,UAAgC;AACpF,SAAK,WAAW;AAChB,SAAK,MAAM;AACX,SAAK,YAAY;AAGjB,SAAK,SAAS,cAAc,IAAI,IAAI;AACpC,WAAO,MAAM,sBAAsB,KAAK,GAAG,OAAO,KAAK,SAAS,IAAI,EAAE;AAAA,EAC1E;AAAA,EAEA,IAAI,KAAK;AACL,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,IAAI,WAAW;AACX,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,IAAI,WAAW;AACX,WAAO,CAAC,CAAC,KAAK;AAAA,EAClB;AAAA,EAEA,IAAI,mBAAmB;AACnB,WAAO,CAAC,CAAC,KAAK;AAAA,EAClB;AAAA,EAEA,IAAI,UAAU;AACV,WAAO,KAAK;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,SAAS;AAAA,EAAC;AAAA;AAAA;AAAA;AAAA,EAKhB,IAAc,iBAAiB,OAAgB;AAC3C,SAAK,oBAAoB;AAAA,EAC7B;AAAA,EAEA,IAAc,SAAS,OAAgB;AACnC,SAAK,YAAY;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,MAAM,YAAY,MAAqB;AACzC,SAAK,YAAY;AACjB,SAAK,SAAS,cAAc,OAAO,IAAI;AACvC,WAAO,MAAM,wBAAwB,KAAK,EAAE,SAAS,KAAK,SAAS,IAAI,EAAE;AAAA,EAC7E;AACJ;",
4
+ "mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;AAMA,SAAS,cAAc;AAIvB,MAAM,SAAS,OAAO,IAAI,cAAc;AAejC,MAAe,aAAa;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA,YAAY,SAAwB,IAAoB,UAAgC;AACpF,SAAK,WAAW;AAChB,SAAK,MAAM;AACX,SAAK,YAAY;AAGjB,SAAK,SAAS,cAAc,IAAI,IAAI;AACpC,WAAO,MAAM,sBAAsB,KAAK,GAAG,OAAO,KAAK,SAAS,IAAI,EAAE;AAAA,EAC1E;AAAA,EAEA,IAAI,KAAK;AACL,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,IAAI,WAAW;AACX,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,IAAI,WAAW;AACX,WAAO,CAAC,CAAC,KAAK;AAAA,EAClB;AAAA,EAEA,IAAI,mBAAmB;AACnB,WAAO,CAAC,CAAC,KAAK;AAAA,EAClB;AAAA,EAEA,IAAI,UAAU;AACV,WAAO,KAAK;AAAA,EAChB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,SAAS;AAAA,EAAC;AAAA;AAAA;AAAA;AAAA,EAKhB,IAAc,iBAAiB,OAAgB;AAC3C,SAAK,oBAAoB;AAAA,EAC7B;AAAA,EAEA,IAAc,SAAS,OAAgB;AACnC,SAAK,YAAY;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA,EAQA,MAAgB,UAAyB;AACrC,SAAK,YAAY;AACjB,SAAK,SAAS,cAAc,OAAO,IAAI;AACvC,WAAO,MAAM,wBAAwB,KAAK,EAAE,SAAS,KAAK,SAAS,IAAI,EAAE;AAAA,EAC7E;AACJ;",
5
5
  "names": []
6
6
  }
@@ -1 +1 @@
1
- {"version":3,"file":"ExchangeManager.d.ts","sourceRoot":"","sources":["../../../src/protocol/ExchangeManager.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACH,OAAO,EAEP,WAAW,EACX,aAAa,EAIb,WAAW,EAKX,qBAAqB,EAExB,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAEnD,OAAO,EAAE,OAAO,EAA6B,MAAM,0BAA0B,CAAC;AAG9E,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAChD,OAAO,EAAE,cAAc,EAA+B,MAAM,8BAA8B,CAAC;AAC3F,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAA0B,MAAM,sBAAsB,CAAC;AAEnG,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAMvD,qBAAa,wBAAyB,SAAQ,WAAW;CAAG;AAE5D,qBAAa,cAAe,YAAW,OAAO,CAAC,OAAO,CAAC;;IAK/C,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,UAAU,CAAC;IACrC,QAAQ,CAAC,OAAO,EAAE,OAAO;IALtB,MAAM,UAAS;gBAIT,OAAO,EAAE,OAAO,CAAC,UAAU,CAAC,EAC5B,OAAO,EAAE,OAAO,EACzB,aAAa,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC;IAKvC,IAAI,aAAa,CAAC,QAAQ,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,EAE9C;IAED,4CAA4C;IAC5C,IAAI,UAAU,YAEb;IAED,IAAI,IAAI,mCAEP;IAED;;;OAGG;IACH,IAAI,cAAc,WAEjB;IAED,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,UAAU,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;IAatE,IAAI,IAAI,WAEP;IAEK,KAAK;CAQd;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACnC,mBAAmB,EAAE,qBAAqB,CAAC;IAC3C,cAAc,EAAE,cAAc,CAAC;IAC/B,cAAc,EAAE,cAAc,CAAC;CAClC;AAED,qBAAa,eAAe;;gBAWZ,OAAO,EAAE,sBAAsB;IAoB3C,MAAM,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,WAAW;IAU9C,kBAAkB,CAAC,UAAU,EAAE,MAAM;IAIrC,kBAAkB,CAAC,UAAU,EAAE,MAAM;IAIrC,kBAAkB,CAAC,QAAQ,EAAE,eAAe;IAO5C,gBAAgB,CAAC,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM;IAIzD,2BAA2B,CAAC,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM;IAQjE,KAAK;YAiBG,SAAS;IAwHjB,cAAc,CAAC,aAAa,EAAE,MAAM;CAyI7C;AAED,qBAAa,eAAe;IACxB,OAAO,CAAC,eAAe,CAA4B;IAEnD,qBAAqB;CAOxB"}
1
+ {"version":3,"file":"ExchangeManager.d.ts","sourceRoot":"","sources":["../../../src/protocol/ExchangeManager.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACH,OAAO,EAEP,WAAW,EACX,aAAa,EAIb,WAAW,EAKX,qBAAqB,EAExB,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAEnD,OAAO,EAAE,OAAO,EAA6B,MAAM,0BAA0B,CAAC;AAG9E,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAChD,OAAO,EAAE,cAAc,EAA+B,MAAM,8BAA8B,CAAC;AAC3F,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAA0B,MAAM,sBAAsB,CAAC;AAEnG,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAMvD,qBAAa,wBAAyB,SAAQ,WAAW;CAAG;AAE5D,qBAAa,cAAe,YAAW,OAAO,CAAC,OAAO,CAAC;;IAK/C,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,UAAU,CAAC;IACrC,QAAQ,CAAC,OAAO,EAAE,OAAO;IALtB,MAAM,UAAS;gBAIT,OAAO,EAAE,OAAO,CAAC,UAAU,CAAC,EAC5B,OAAO,EAAE,OAAO,EACzB,aAAa,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC;IAKvC,IAAI,aAAa,CAAC,QAAQ,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,EAE9C;IAED,4CAA4C;IAC5C,IAAI,UAAU,YAEb;IAED,IAAI,IAAI,mCAEP;IAED;;;OAGG;IACH,IAAI,cAAc,WAEjB;IAED,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,UAAU,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;IAatE,IAAI,IAAI,WAEP;IAEK,KAAK;CAQd;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACnC,mBAAmB,EAAE,qBAAqB,CAAC;IAC3C,cAAc,EAAE,cAAc,CAAC;IAC/B,cAAc,EAAE,cAAc,CAAC;CAClC;AAED,qBAAa,eAAe;;gBAYZ,OAAO,EAAE,sBAAsB;IAoB3C,MAAM,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,WAAW;IAU9C,kBAAkB,CAAC,UAAU,EAAE,MAAM;IAIrC,kBAAkB,CAAC,UAAU,EAAE,MAAM;IAIrC,kBAAkB,CAAC,QAAQ,EAAE,eAAe;IAO5C,gBAAgB,CAAC,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM;IAIzD,2BAA2B,CAAC,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM;IAQjE,KAAK;YAkBG,SAAS;IA2HjB,cAAc,CAAC,aAAa,EAAE,MAAM;CAyI7C;AAED,qBAAa,eAAe;IACxB,OAAO,CAAC,eAAe,CAA4B;IAEnD,qBAAqB;CAOxB"}
@@ -85,6 +85,7 @@ class ExchangeManager {
85
85
  #listeners = /* @__PURE__ */ new Map();
86
86
  #closers = /* @__PURE__ */ new Set();
87
87
  #observers = new ObserverGroup(this);
88
+ #closing = false;
88
89
  constructor(context) {
89
90
  this.#transportInterfaces = context.transportInterfaces;
90
91
  this.#sessionManager = context.sessionManager;
@@ -132,6 +133,7 @@ class ExchangeManager {
132
133
  return exchange;
133
134
  }
134
135
  async close() {
136
+ this.#closing = true;
135
137
  for (const protocol of this.#protocols.values()) {
136
138
  await protocol.close();
137
139
  }
@@ -154,6 +156,7 @@ class ExchangeManager {
154
156
  let session;
155
157
  if (packet.header.sessionType === SessionType.Unicast) {
156
158
  if (packet.header.sessionId === UNICAST_UNSECURE_SESSION_ID) {
159
+ if (this.#closing) return;
157
160
  const initiatorNodeId = packet.header.sourceNodeId ?? NodeId.UNSPECIFIED_NODE_ID;
158
161
  session = this.#sessionManager.getUnsecureSession(initiatorNodeId) ?? this.#sessionManager.createInsecureSession({
159
162
  initiatorNodeId
@@ -162,6 +165,7 @@ class ExchangeManager {
162
165
  session = this.#sessionManager.getSession(packet.header.sessionId);
163
166
  }
164
167
  } else if (packet.header.sessionType === SessionType.Group) {
168
+ if (this.#closing) return;
165
169
  if (packet.header.sourceNodeId !== void 0) {
166
170
  }
167
171
  }
@@ -189,6 +193,7 @@ class ExchangeManager {
189
193
  if (exchange !== void 0) {
190
194
  await exchange.onMessageReceived(message, isDuplicate);
191
195
  } else {
196
+ if (this.#closing) return;
192
197
  if (session.closingAfterExchangeFinished) {
193
198
  throw new MatterFlowError(
194
199
  `Session with ID ${packet.header.sessionId} marked for closure, decline new exchange creation.`
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/protocol/ExchangeManager.ts"],
4
- "mappings": "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",
4
+ "mappings": "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",
5
5
  "names": ["exchange"]
6
6
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@matter/protocol",
3
- "version": "0.12.3-alpha.0-20250203-34ba45cae",
3
+ "version": "0.12.3-alpha.0-20250205-ad3416ca3",
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.3-alpha.0-20250203-34ba45cae",
44
- "@matter/model": "0.12.3-alpha.0-20250203-34ba45cae",
45
- "@matter/types": "0.12.3-alpha.0-20250203-34ba45cae",
43
+ "@matter/general": "0.12.3-alpha.0-20250205-ad3416ca3",
44
+ "@matter/model": "0.12.3-alpha.0-20250205-ad3416ca3",
45
+ "@matter/types": "0.12.3-alpha.0-20250205-ad3416ca3",
46
46
  "@noble/curves": "^1.8.1"
47
47
  },
48
48
  "devDependencies": {
49
- "@matter/tools": "0.12.3-alpha.0-20250203-34ba45cae",
50
- "@matter/testing": "0.12.3-alpha.0-20250203-34ba45cae"
49
+ "@matter/tools": "0.12.3-alpha.0-20250205-ad3416ca3",
50
+ "@matter/testing": "0.12.3-alpha.0-20250205-ad3416ca3"
51
51
  },
52
52
  "files": [
53
53
  "dist/**/*",
@@ -819,12 +819,15 @@ export namespace CertificateManager {
819
819
  throw new CertificateError(`Root certificate must have isCa set to true.`);
820
820
  }
821
821
 
822
- // The key usage extension SHALL be encoded with exactly two flags: keyCertSign (0x0020) and CRLSign (0x0040).
823
- // Formally the check should be the following line but Amazon uses a wrong Root cert which also has
824
- // digitalCertificate set, so we just check the the two needed are set and ignore additionally set parameters.
825
- //if (ExtensionKeyUsageSchema.encode(rootCert.extensions.keyUsage) !== 0x0060) {
826
- if (!rootCert.extensions.keyUsage.keyCertSign || !rootCert.extensions.keyUsage.cRLSign) {
827
- throw new CertificateError(`Root certificate keyUsage must have keyCertSign and CRLSign set.`);
822
+ // The key usage extension SHALL be encoded with at least two flags: keyCertSign (0x0020) and CRLSign (0x0040)
823
+ // and optionally with digitalSignature (0x0001).
824
+ if (
825
+ ExtensionKeyUsageSchema.encode(rootCert.extensions.keyUsage) !== 0x0060 &&
826
+ ExtensionKeyUsageSchema.encode(rootCert.extensions.keyUsage) !== 0x0061
827
+ ) {
828
+ throw new CertificateError(
829
+ `Root certificate keyUsage must have keyCertSign and CRLSign and optionally digitalSignature set.`,
830
+ );
828
831
  }
829
832
 
830
833
  // The extended key usage extension SHALL NOT be present.
@@ -863,8 +866,9 @@ export namespace CertificateManager {
863
866
  * Rules for this are listed in @see {@link MatterSpecification.v12.Core} §6.5.x
864
867
  */
865
868
  export function verifyNodeOperationalCertificate(
866
- rootOrIcaCert: RootCertificate | IntermediateCertificate,
867
869
  nocCert: OperationalCertificate,
870
+ rootCert: RootCertificate,
871
+ icaCert?: IntermediateCertificate,
868
872
  ) {
869
873
  CertificateManager.validateGeneralCertificateFields(nocCert);
870
874
 
@@ -908,13 +912,21 @@ export namespace CertificateManager {
908
912
  // When any matter-fabric-id attributes are present in either the Matter Root CA Certificate or the Matter ICA
909
913
  // Certificate, the value SHALL match the one present in the Matter Node Operational Certificate (NOC) within
910
914
  // the same certificate chain.
915
+ if (rootCert.subject.fabricId !== undefined && rootCert.subject.fabricId !== nocCert.subject.fabricId) {
916
+ throw new CertificateError(
917
+ `FabricId in NoC certificate does not match the fabricId in the parent certificate. ${Logger.toJSON(
918
+ rootCert.subject.fabricId,
919
+ )} !== ${Logger.toJSON(nocCert.subject.fabricId)}`,
920
+ );
921
+ }
911
922
  if (
912
- rootOrIcaCert.subject.fabricId !== undefined &&
913
- rootOrIcaCert.subject.fabricId !== nocCert.subject.fabricId
923
+ icaCert !== undefined &&
924
+ icaCert.subject.fabricId !== undefined &&
925
+ icaCert.subject.fabricId !== nocCert.subject.fabricId
914
926
  ) {
915
927
  throw new CertificateError(
916
928
  `FabricId in NoC certificate does not match the fabricId in the parent certificate. ${Logger.toJSON(
917
- rootOrIcaCert.subject.fabricId,
929
+ icaCert.subject.fabricId,
918
930
  )} !== ${Logger.toJSON(nocCert.subject.fabricId)}`,
919
931
  );
920
932
  }
@@ -959,14 +971,19 @@ export namespace CertificateManager {
959
971
  }
960
972
 
961
973
  // Validate authority key identifier against subject key identifier
962
- if (!Bytes.areEqual(nocCert.extensions.authorityKeyIdentifier, rootOrIcaCert.extensions.subjectKeyIdentifier)) {
974
+ if (
975
+ !Bytes.areEqual(
976
+ nocCert.extensions.authorityKeyIdentifier,
977
+ (icaCert ?? rootCert).extensions.subjectKeyIdentifier,
978
+ )
979
+ ) {
963
980
  throw new CertificateError(
964
981
  `Noc certificate authorityKeyIdentifier must be equal to Root/Ica subjectKeyIdentifier.`,
965
982
  );
966
983
  }
967
984
 
968
985
  Crypto.verify(
969
- PublicKey(rootOrIcaCert.ellipticCurvePublicKey),
986
+ PublicKey((icaCert ?? rootCert).ellipticCurvePublicKey),
970
987
  nodeOperationalCertToAsn1(nocCert),
971
988
  nocCert.signature,
972
989
  );
@@ -997,14 +1014,6 @@ export namespace CertificateManager {
997
1014
  `Invalid fabricId in NoC certificate: ${Logger.toJSON(icaCert.subject.fabricId)}`,
998
1015
  );
999
1016
  }
1000
- // If present on root certificate fabric-id needs to match with Ica fabric Id
1001
- if (rootCert.subject.fabricId !== icaCert.subject.fabricId) {
1002
- throw new CertificateError(
1003
- `FabricId in Ica certificate does not match the fabricId in the parent certificate. ${Logger.toJSON(
1004
- rootCert.subject.fabricId,
1005
- )} !== ${Logger.toJSON(icaCert.subject.fabricId)}`,
1006
- );
1007
- }
1008
1017
  }
1009
1018
 
1010
1019
  // The subject DN SHALL encode exactly one matter-icac-id attribute.
@@ -1025,7 +1034,12 @@ export namespace CertificateManager {
1025
1034
  // When any matter-fabric-id attributes are present in either the Matter Root CA Certificate or the Matter ICA
1026
1035
  // Certificate, the value SHALL match the one present in the Matter Node Operational Certificate (NOC) within
1027
1036
  // the same certificate chain.
1028
- if (rootCert.subject.fabricId !== icaCert.subject.fabricId) {
1037
+ // Here means: When both are set, they must match
1038
+ if (
1039
+ rootCert.subject.fabricId !== undefined &&
1040
+ icaCert.subject.fabricId !== undefined &&
1041
+ rootCert.subject.fabricId !== icaCert.subject.fabricId
1042
+ ) {
1029
1043
  throw new CertificateError(
1030
1044
  `FabricId in Ica certificate does not match the fabricId in the parent certificate. ${Logger.toJSON(
1031
1045
  rootCert.subject.fabricId,
@@ -1047,12 +1061,15 @@ export namespace CertificateManager {
1047
1061
  throw new CertificateError(`Ica certificate must have isCa set to true.`);
1048
1062
  }
1049
1063
 
1050
- // The key usage extension SHALL be encoded with exactly two flags: keyCertSign (0x0020) and CRLSign (0x0040).
1051
- // Formally the check should be the following line but Amazon uses a wrong Root cert which also has
1052
- // digitalCertificate set, so we just check the the two needed are set and ignore additionally set parameters.
1053
- //if (ExtensionKeyUsageSchema.encode(icaCert.extensions.keyUsage) !== 0x0060) {
1054
- if (!icaCert.extensions.keyUsage.keyCertSign || !icaCert.extensions.keyUsage.cRLSign) {
1055
- throw new CertificateError(`Ica certificate must have keyUsage set to keyCertSign and CRLSign.`);
1064
+ // The key usage extension SHALL be encoded with at least two flags: keyCertSign (0x0020) and CRLSign (0x0040)
1065
+ // and optionally with digitalSignature (0x0001).
1066
+ if (
1067
+ ExtensionKeyUsageSchema.encode(rootCert.extensions.keyUsage) !== 0x0060 &&
1068
+ ExtensionKeyUsageSchema.encode(rootCert.extensions.keyUsage) !== 0x0061
1069
+ ) {
1070
+ throw new CertificateError(
1071
+ `Ica certificate keyUsage must have keyCertSign and CRLSign and optionally digitalSignature set.`,
1072
+ );
1056
1073
  }
1057
1074
 
1058
1075
  // The extended key usage extension SHALL NOT be present.
@@ -172,26 +172,16 @@ export class Fabric {
172
172
  }
173
173
 
174
174
  verifyCredentials(operationalCert: Uint8Array, intermediateCACert?: Uint8Array) {
175
- if (intermediateCACert === undefined) {
176
- // Validate NOC Certificate against Root Certificate
177
- CertificateManager.verifyNodeOperationalCertificate(
178
- TlvRootCertificate.decode(this.rootCert),
179
- TlvOperationalCertificate.decode(operationalCert),
180
- );
181
- } else {
182
- const decodedIcaCert = TlvIntermediateCertificate.decode(intermediateCACert);
183
- // Validate NOC Certificate against ICA Certificate
184
- CertificateManager.verifyNodeOperationalCertificate(
185
- decodedIcaCert,
186
- TlvOperationalCertificate.decode(operationalCert),
187
- );
188
-
175
+ const rootCert = TlvRootCertificate.decode(this.rootCert);
176
+ const nocCert = TlvOperationalCertificate.decode(operationalCert);
177
+ const icaCert =
178
+ intermediateCACert !== undefined ? TlvIntermediateCertificate.decode(intermediateCACert) : undefined;
179
+ if (icaCert !== undefined) {
189
180
  // Validate ICACertificate against Root Certificate
190
- CertificateManager.verifyIntermediateCaCertificate(
191
- TlvRootCertificate.decode(this.rootCert),
192
- decodedIcaCert,
193
- );
181
+ CertificateManager.verifyIntermediateCaCertificate(rootCert, icaCert);
194
182
  }
183
+ // Validate NOC Certificate against ICA Certificate
184
+ CertificateManager.verifyNodeOperationalCertificate(nocCert, rootCert, icaCert);
195
185
  }
196
186
 
197
187
  matchesFabricIdAndRootPublicKey(fabricId: FabricId, rootPublicKey: Uint8Array) {
@@ -402,22 +392,14 @@ export class FabricBuilder {
402
392
  throw new MatterFlowError("Root Certificate needs to be set first.");
403
393
  }
404
394
 
405
- if (intermediateCACert !== undefined) {
406
- const decodedIntermediateCACert = TlvIntermediateCertificate.decode(intermediateCACert);
407
- CertificateManager.verifyIntermediateCaCertificate(
408
- TlvRootCertificate.decode(this.#rootCert),
409
- decodedIntermediateCACert,
410
- );
411
- CertificateManager.verifyNodeOperationalCertificate(
412
- decodedIntermediateCACert,
413
- TlvOperationalCertificate.decode(operationalCert),
414
- );
415
- } else {
416
- CertificateManager.verifyNodeOperationalCertificate(
417
- TlvRootCertificate.decode(this.#rootCert),
418
- TlvOperationalCertificate.decode(operationalCert),
419
- );
395
+ const rootCert = TlvRootCertificate.decode(this.#rootCert);
396
+ const nocCert = TlvOperationalCertificate.decode(operationalCert);
397
+ const icaCert =
398
+ intermediateCACert !== undefined ? TlvIntermediateCertificate.decode(intermediateCACert) : undefined;
399
+ if (icaCert !== undefined) {
400
+ CertificateManager.verifyIntermediateCaCertificate(rootCert, icaCert);
420
401
  }
402
+ CertificateManager.verifyNodeOperationalCertificate(nocCert, rootCert, icaCert);
421
403
 
422
404
  this.#operationalCert = operationalCert;
423
405
  this.#intermediateCACert = intermediateCACert;
@@ -629,8 +629,9 @@ export class ServerSubscription extends Subscription {
629
629
  error instanceof NetworkError ||
630
630
  error instanceof NoChannelError
631
631
  ) {
632
- // We could not send at all, consider session as dead
633
- await this.session.destroy(false);
632
+ // Let's consider this subscription as dead and wait for a reconnect
633
+ await this.destroy();
634
+ return;
634
635
  } else {
635
636
  throw error;
636
637
  }
@@ -891,8 +892,7 @@ export class ServerSubscription extends Subscription {
891
892
  }
892
893
  }
893
894
 
894
- override async close(graceful = false) {
895
- this.isClosed = true;
895
+ protected override async destroy() {
896
896
  this.#sendUpdatesActivated = false;
897
897
  this.unregisterAttributeListeners(Array.from(this.#attributeListeners.keys()));
898
898
  this.unregisterEventListeners(Array.from(this.#eventListeners.keys()));
@@ -905,13 +905,23 @@ export class ServerSubscription extends Subscription {
905
905
  }
906
906
  this.#updateTimer.stop();
907
907
  this.#sendDelayTimer.stop();
908
+ await super.destroy();
909
+ }
910
+
911
+ /**
912
+ * Closes the subscription and flushes all outstanding data updates if requested.
913
+ */
914
+ override async close(graceful = false) {
915
+ if (this.isClosed) {
916
+ return;
917
+ }
918
+ await this.destroy();
908
919
  if (graceful) {
909
920
  await this.flush();
910
921
  }
911
922
  if (this.currentUpdatePromise) {
912
923
  await this.currentUpdatePromise;
913
924
  }
914
- await super.close();
915
925
  }
916
926
 
917
927
  /**
@@ -23,7 +23,7 @@ export interface SubscriptionCriteria {
23
23
  /**
24
24
  * A single active subscription.
25
25
  */
26
- export class Subscription {
26
+ export abstract class Subscription {
27
27
  #session: SecureSession;
28
28
  #id: SubscriptionId;
29
29
  #isClosed?: boolean;
@@ -61,7 +61,7 @@ export class Subscription {
61
61
  }
62
62
 
63
63
  /**
64
- * Update session state. This probably is meaniningless except in a server context.
64
+ * Update session state. This probably is meaningless except in a server context.
65
65
  */
66
66
  async update() {}
67
67
 
@@ -76,13 +76,13 @@ export class Subscription {
76
76
  this.#isClosed = value;
77
77
  }
78
78
 
79
+ /** Close the subscription with the option to gracefully flush outstanding data. */
80
+ abstract close(graceful: boolean): Promise<void>;
81
+
79
82
  /**
80
- * Close the session.
81
- *
82
- * @param _graceful in a server context this means flush pending updates. Not sure if applies to client
83
- * subscriptions
83
+ * Destroy the subscription. Unsubscribe from all attributes and events and stop all timers.
84
84
  */
85
- async close(_graceful = true): Promise<void> {
85
+ protected async destroy(): Promise<void> {
86
86
  this.#isClosed = true;
87
87
  this.#session.subscriptions.delete(this);
88
88
  logger.debug(`Removed subscription ${this.id} from ${this.#session.name}`);
@@ -117,6 +117,7 @@ export class ExchangeManager {
117
117
  readonly #listeners = new Map<TransportInterface, TransportInterface.Listener>();
118
118
  readonly #closers = new Set<Promise<void>>();
119
119
  readonly #observers = new ObserverGroup(this);
120
+ #closing = false;
120
121
 
121
122
  constructor(context: ExchangeManagerContext) {
122
123
  this.#transportInterfaces = context.transportInterfaces;
@@ -176,6 +177,7 @@ export class ExchangeManager {
176
177
  }
177
178
 
178
179
  async close() {
180
+ this.#closing = true;
179
181
  for (const protocol of this.#protocols.values()) {
180
182
  await protocol.close();
181
183
  }
@@ -201,6 +203,7 @@ export class ExchangeManager {
201
203
  let session: Session | undefined;
202
204
  if (packet.header.sessionType === SessionType.Unicast) {
203
205
  if (packet.header.sessionId === UNICAST_UNSECURE_SESSION_ID) {
206
+ if (this.#closing) return;
204
207
  const initiatorNodeId = packet.header.sourceNodeId ?? NodeId.UNSPECIFIED_NODE_ID;
205
208
  session =
206
209
  this.#sessionManager.getUnsecureSession(initiatorNodeId) ??
@@ -211,6 +214,7 @@ export class ExchangeManager {
211
214
  session = this.#sessionManager.getSession(packet.header.sessionId);
212
215
  }
213
216
  } else if (packet.header.sessionType === SessionType.Group) {
217
+ if (this.#closing) return;
214
218
  if (packet.header.sourceNodeId !== undefined) {
215
219
  //session = this.sessionManager.findGroupSession(packet.header.destGroupId, packet.header.sessionId);
216
220
  }
@@ -253,6 +257,7 @@ export class ExchangeManager {
253
257
  if (exchange !== undefined) {
254
258
  await exchange.onMessageReceived(message, isDuplicate);
255
259
  } else {
260
+ if (this.#closing) return;
256
261
  if (session.closingAfterExchangeFinished) {
257
262
  throw new MatterFlowError(
258
263
  `Session with ID ${packet.header.sessionId} marked for closure, decline new exchange creation.`,