@matter/protocol 0.12.0-alpha.0-20241229-9d9c99934 → 0.12.0-alpha.0-20241231-14ac774ba

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 (163) hide show
  1. package/dist/cjs/cluster/server/EventServer.d.ts.map +1 -1
  2. package/dist/cjs/cluster/server/EventServer.js +4 -1
  3. package/dist/cjs/cluster/server/EventServer.js.map +1 -1
  4. package/dist/cjs/codec/MessageCodec.d.ts +2 -1
  5. package/dist/cjs/codec/MessageCodec.d.ts.map +1 -1
  6. package/dist/cjs/codec/MessageCodec.js +39 -9
  7. package/dist/cjs/codec/MessageCodec.js.map +1 -1
  8. package/dist/cjs/events/NonvolatileEventStore.d.ts.map +1 -1
  9. package/dist/cjs/events/NonvolatileEventStore.js +2 -6
  10. package/dist/cjs/events/NonvolatileEventStore.js.map +1 -1
  11. package/dist/cjs/events/OccurrenceManager.d.ts.map +1 -1
  12. package/dist/cjs/events/OccurrenceManager.js +2 -2
  13. package/dist/cjs/events/OccurrenceManager.js.map +1 -1
  14. package/dist/cjs/interaction/InteractionClient.d.ts.map +1 -1
  15. package/dist/cjs/interaction/InteractionClient.js +0 -3
  16. package/dist/cjs/interaction/InteractionClient.js.map +1 -1
  17. package/dist/cjs/interaction/InteractionMessenger.d.ts +17 -6
  18. package/dist/cjs/interaction/InteractionMessenger.d.ts.map +1 -1
  19. package/dist/cjs/interaction/InteractionMessenger.js +88 -31
  20. package/dist/cjs/interaction/InteractionMessenger.js.map +1 -1
  21. package/dist/cjs/interaction/InteractionServer.d.ts.map +1 -1
  22. package/dist/cjs/interaction/InteractionServer.js +32 -7
  23. package/dist/cjs/interaction/InteractionServer.js.map +1 -1
  24. package/dist/cjs/interaction/ServerSubscription.d.ts.map +1 -1
  25. package/dist/cjs/interaction/ServerSubscription.js +28 -16
  26. package/dist/cjs/interaction/ServerSubscription.js.map +1 -1
  27. package/dist/cjs/mdns/MdnsScanner.d.ts +3 -3
  28. package/dist/cjs/mdns/MdnsScanner.d.ts.map +1 -1
  29. package/dist/cjs/mdns/MdnsScanner.js +18 -15
  30. package/dist/cjs/mdns/MdnsScanner.js.map +1 -1
  31. package/dist/cjs/mdns/MdnsServer.d.ts.map +1 -1
  32. package/dist/cjs/mdns/MdnsServer.js +8 -6
  33. package/dist/cjs/mdns/MdnsServer.js.map +1 -1
  34. package/dist/cjs/mdns/MdnsService.d.ts.map +1 -1
  35. package/dist/cjs/mdns/MdnsService.js +4 -1
  36. package/dist/cjs/mdns/MdnsService.js.map +1 -1
  37. package/dist/cjs/protocol/DeviceAdvertiser.d.ts.map +1 -1
  38. package/dist/cjs/protocol/DeviceAdvertiser.js +5 -5
  39. package/dist/cjs/protocol/DeviceAdvertiser.js.map +1 -1
  40. package/dist/cjs/protocol/ExchangeManager.d.ts +2 -2
  41. package/dist/cjs/protocol/ExchangeManager.d.ts.map +1 -1
  42. package/dist/cjs/protocol/ExchangeManager.js +8 -6
  43. package/dist/cjs/protocol/ExchangeManager.js.map +1 -1
  44. package/dist/cjs/protocol/MessageExchange.d.ts +12 -2
  45. package/dist/cjs/protocol/MessageExchange.d.ts.map +1 -1
  46. package/dist/cjs/protocol/MessageExchange.js +47 -36
  47. package/dist/cjs/protocol/MessageExchange.js.map +1 -1
  48. package/dist/cjs/securechannel/SecureChannelMessenger.d.ts +3 -6
  49. package/dist/cjs/securechannel/SecureChannelMessenger.d.ts.map +1 -1
  50. package/dist/cjs/securechannel/SecureChannelMessenger.js +21 -8
  51. package/dist/cjs/securechannel/SecureChannelMessenger.js.map +1 -1
  52. package/dist/cjs/session/SecureSession.d.ts +2 -1
  53. package/dist/cjs/session/SecureSession.d.ts.map +1 -1
  54. package/dist/cjs/session/SecureSession.js +16 -10
  55. package/dist/cjs/session/SecureSession.js.map +1 -1
  56. package/dist/cjs/session/SessionManager.d.ts +2 -1
  57. package/dist/cjs/session/SessionManager.d.ts.map +1 -1
  58. package/dist/cjs/session/SessionManager.js +10 -3
  59. package/dist/cjs/session/SessionManager.js.map +1 -1
  60. package/dist/cjs/session/case/CaseClient.js +4 -4
  61. package/dist/cjs/session/case/CaseClient.js.map +1 -1
  62. package/dist/cjs/session/case/CaseMessenger.js +3 -3
  63. package/dist/cjs/session/case/CaseMessenger.js.map +1 -1
  64. package/dist/cjs/session/case/CaseServer.js +2 -2
  65. package/dist/cjs/session/case/CaseServer.js.map +1 -1
  66. package/dist/cjs/session/pase/PaseClient.js +1 -1
  67. package/dist/cjs/session/pase/PaseClient.js.map +1 -1
  68. package/dist/cjs/session/pase/PaseMessenger.d.ts.map +1 -1
  69. package/dist/cjs/session/pase/PaseMessenger.js +3 -5
  70. package/dist/cjs/session/pase/PaseMessenger.js.map +1 -1
  71. package/dist/esm/cluster/server/EventServer.d.ts.map +1 -1
  72. package/dist/esm/cluster/server/EventServer.js +5 -1
  73. package/dist/esm/cluster/server/EventServer.js.map +1 -1
  74. package/dist/esm/codec/MessageCodec.d.ts +2 -1
  75. package/dist/esm/codec/MessageCodec.d.ts.map +1 -1
  76. package/dist/esm/codec/MessageCodec.js +40 -10
  77. package/dist/esm/codec/MessageCodec.js.map +1 -1
  78. package/dist/esm/events/NonvolatileEventStore.d.ts.map +1 -1
  79. package/dist/esm/events/NonvolatileEventStore.js +3 -7
  80. package/dist/esm/events/NonvolatileEventStore.js.map +1 -1
  81. package/dist/esm/events/OccurrenceManager.d.ts.map +1 -1
  82. package/dist/esm/events/OccurrenceManager.js +11 -3
  83. package/dist/esm/events/OccurrenceManager.js.map +1 -1
  84. package/dist/esm/interaction/InteractionClient.d.ts.map +1 -1
  85. package/dist/esm/interaction/InteractionClient.js +0 -3
  86. package/dist/esm/interaction/InteractionClient.js.map +1 -1
  87. package/dist/esm/interaction/InteractionMessenger.d.ts +17 -6
  88. package/dist/esm/interaction/InteractionMessenger.d.ts.map +1 -1
  89. package/dist/esm/interaction/InteractionMessenger.js +89 -32
  90. package/dist/esm/interaction/InteractionMessenger.js.map +1 -1
  91. package/dist/esm/interaction/InteractionServer.d.ts.map +1 -1
  92. package/dist/esm/interaction/InteractionServer.js +32 -7
  93. package/dist/esm/interaction/InteractionServer.js.map +1 -1
  94. package/dist/esm/interaction/ServerSubscription.d.ts.map +1 -1
  95. package/dist/esm/interaction/ServerSubscription.js +29 -17
  96. package/dist/esm/interaction/ServerSubscription.js.map +1 -1
  97. package/dist/esm/mdns/MdnsScanner.d.ts +3 -3
  98. package/dist/esm/mdns/MdnsScanner.d.ts.map +1 -1
  99. package/dist/esm/mdns/MdnsScanner.js +18 -15
  100. package/dist/esm/mdns/MdnsScanner.js.map +1 -1
  101. package/dist/esm/mdns/MdnsServer.d.ts.map +1 -1
  102. package/dist/esm/mdns/MdnsServer.js +9 -6
  103. package/dist/esm/mdns/MdnsServer.js.map +1 -1
  104. package/dist/esm/mdns/MdnsService.d.ts.map +1 -1
  105. package/dist/esm/mdns/MdnsService.js +5 -1
  106. package/dist/esm/mdns/MdnsService.js.map +1 -1
  107. package/dist/esm/protocol/DeviceAdvertiser.d.ts.map +1 -1
  108. package/dist/esm/protocol/DeviceAdvertiser.js +5 -5
  109. package/dist/esm/protocol/DeviceAdvertiser.js.map +1 -1
  110. package/dist/esm/protocol/ExchangeManager.d.ts +2 -2
  111. package/dist/esm/protocol/ExchangeManager.d.ts.map +1 -1
  112. package/dist/esm/protocol/ExchangeManager.js +9 -6
  113. package/dist/esm/protocol/ExchangeManager.js.map +1 -1
  114. package/dist/esm/protocol/MessageExchange.d.ts +12 -2
  115. package/dist/esm/protocol/MessageExchange.d.ts.map +1 -1
  116. package/dist/esm/protocol/MessageExchange.js +47 -36
  117. package/dist/esm/protocol/MessageExchange.js.map +1 -1
  118. package/dist/esm/securechannel/SecureChannelMessenger.d.ts +3 -6
  119. package/dist/esm/securechannel/SecureChannelMessenger.d.ts.map +1 -1
  120. package/dist/esm/securechannel/SecureChannelMessenger.js +22 -9
  121. package/dist/esm/securechannel/SecureChannelMessenger.js.map +1 -1
  122. package/dist/esm/session/SecureSession.d.ts +2 -1
  123. package/dist/esm/session/SecureSession.d.ts.map +1 -1
  124. package/dist/esm/session/SecureSession.js +16 -10
  125. package/dist/esm/session/SecureSession.js.map +1 -1
  126. package/dist/esm/session/SessionManager.d.ts +2 -1
  127. package/dist/esm/session/SessionManager.d.ts.map +1 -1
  128. package/dist/esm/session/SessionManager.js +11 -3
  129. package/dist/esm/session/SessionManager.js.map +1 -1
  130. package/dist/esm/session/case/CaseClient.js +5 -5
  131. package/dist/esm/session/case/CaseClient.js.map +1 -1
  132. package/dist/esm/session/case/CaseMessenger.js +3 -3
  133. package/dist/esm/session/case/CaseMessenger.js.map +1 -1
  134. package/dist/esm/session/case/CaseServer.js +2 -2
  135. package/dist/esm/session/case/CaseServer.js.map +1 -1
  136. package/dist/esm/session/pase/PaseClient.js +1 -1
  137. package/dist/esm/session/pase/PaseClient.js.map +1 -1
  138. package/dist/esm/session/pase/PaseMessenger.d.ts.map +1 -1
  139. package/dist/esm/session/pase/PaseMessenger.js +3 -5
  140. package/dist/esm/session/pase/PaseMessenger.js.map +1 -1
  141. package/package.json +6 -6
  142. package/src/cluster/server/EventServer.ts +4 -1
  143. package/src/codec/MessageCodec.ts +42 -10
  144. package/src/events/NonvolatileEventStore.ts +4 -5
  145. package/src/events/OccurrenceManager.ts +12 -2
  146. package/src/interaction/InteractionClient.ts +0 -3
  147. package/src/interaction/InteractionMessenger.ts +114 -32
  148. package/src/interaction/InteractionServer.ts +30 -5
  149. package/src/interaction/ServerSubscription.ts +23 -16
  150. package/src/mdns/MdnsScanner.ts +17 -14
  151. package/src/mdns/MdnsServer.ts +7 -4
  152. package/src/mdns/MdnsService.ts +5 -1
  153. package/src/protocol/DeviceAdvertiser.ts +5 -7
  154. package/src/protocol/ExchangeManager.ts +10 -7
  155. package/src/protocol/MessageExchange.ts +59 -38
  156. package/src/securechannel/SecureChannelMessenger.ts +31 -10
  157. package/src/session/SecureSession.ts +17 -10
  158. package/src/session/SessionManager.ts +11 -3
  159. package/src/session/case/CaseClient.ts +5 -5
  160. package/src/session/case/CaseMessenger.ts +3 -3
  161. package/src/session/case/CaseServer.ts +2 -2
  162. package/src/session/pase/PaseClient.ts +1 -1
  163. package/src/session/pase/PaseMessenger.ts +3 -5
@@ -42,6 +42,8 @@ export class UnexpectedMessageError extends MatterError {
42
42
  }
43
43
  }
44
44
 
45
+ export type ExchangeLogContext = Record<string, unknown>;
46
+
45
47
  export type ExchangeSendOptions = {
46
48
  /**
47
49
  * The response to this send should be an ack only and no StatusResponse or such. If a StatusResponse is returned
@@ -66,6 +68,14 @@ export type ExchangeSendOptions = {
66
68
 
67
69
  /** Use the provided acknowledge MessageId instead checking the latest to send one */
68
70
  includeAcknowledgeMessageId?: number;
71
+
72
+ /**
73
+ * Disables the MRP logic which means that no retransmissions are done and receiving an ack is not awaited.
74
+ */
75
+ disableMrpLogic?: boolean;
76
+
77
+ /** Additional context information for logging to be included at the beginning of the Message log. */
78
+ logContext?: ExchangeLogContext;
69
79
  };
70
80
 
71
81
  /**
@@ -214,14 +224,16 @@ export class MessageExchange {
214
224
  Diagnostic.dict({
215
225
  channel: channel.name,
216
226
  protocol: this.#protocolId,
217
- id: this.#exchangeId,
218
- session: session.name,
219
- peerSessionId: this.#peerSessionId,
220
- "active threshold ms": this.#activeThresholdMs,
221
- "active interval ms": this.#activeIntervalMs,
222
- "idle interval ms": this.#idleIntervalMs,
223
- maxTransmissions: this.#maxTransmissions,
224
- useMrp: this.#useMRP,
227
+ exId: this.#exchangeId,
228
+ sess: session.name,
229
+ peerSess: this.#peerSessionId,
230
+ SAT: this.#activeThresholdMs,
231
+ SAI: this.#activeIntervalMs,
232
+ SII: this.#idleIntervalMs,
233
+ maxTrans: this.#maxTransmissions,
234
+ exchangeFlags: Diagnostic.asFlags({
235
+ MRP: this.#useMRP,
236
+ }),
225
237
  }),
226
238
  );
227
239
  }
@@ -266,8 +278,8 @@ export class MessageExchange {
266
278
  await this.send(SecureMessageType.StandaloneAck, new Uint8Array(0), { includeAcknowledgeMessageId: messageId });
267
279
  }
268
280
 
269
- async onMessageReceived(message: Message, isDuplicate = false) {
270
- logger.debug("Message «", MessageCodec.messageDiagnostics(message, isDuplicate));
281
+ async onMessageReceived(message: Message, duplicate = false) {
282
+ logger.debug("Message «", MessageCodec.messageDiagnostics(message, { duplicate }));
271
283
 
272
284
  // Adjust the incoming message when ack was required but this exchange do not use it to skip all relevant logic
273
285
  if (message.payloadHeader.requiresAck && !this.#useMRP) {
@@ -289,7 +301,7 @@ export class MessageExchange {
289
301
 
290
302
  this.session.notifyActivity(true);
291
303
 
292
- if (isDuplicate) {
304
+ if (duplicate) {
293
305
  // Received a message retransmission but the reply is not ready yet, ignoring
294
306
  if (requiresAck) {
295
307
  await this.sendStandaloneAckForMessage(message);
@@ -354,9 +366,11 @@ export class MessageExchange {
354
366
 
355
367
  const {
356
368
  expectAckOnly = false,
369
+ disableMrpLogic,
357
370
  expectedProcessingTimeMs = DEFAULT_EXPECTED_PROCESSING_TIME_MS,
358
371
  requiresAck,
359
372
  includeAcknowledgeMessageId,
373
+ logContext,
360
374
  } = options ?? {};
361
375
  if (!this.#useMRP && includeAcknowledgeMessageId !== undefined) {
362
376
  throw new InternalError("Cannot include an acknowledge message ID when MRP is not used");
@@ -409,10 +423,10 @@ export class MessageExchange {
409
423
  };
410
424
 
411
425
  let ackPromise: Promise<Message> | undefined;
412
- if (this.#useMRP && message.payloadHeader.requiresAck) {
426
+ if (this.#useMRP && message.payloadHeader.requiresAck && !disableMrpLogic) {
413
427
  this.#sentMessageToAck = message;
414
428
  this.#retransmissionTimer = Time.getTimer(
415
- "Message retransmission",
429
+ `Message retransmission ${message.packetHeader.messageId}`,
416
430
  this.#getResubmissionBackOffTime(0),
417
431
  () => this.#retransmitMessage(message, expectedProcessingTimeMs),
418
432
  );
@@ -422,7 +436,7 @@ export class MessageExchange {
422
436
  this.#sentMessageAckFailure = rejecter;
423
437
  }
424
438
 
425
- await this.channel.send(message);
439
+ await this.channel.send(message, logContext);
426
440
 
427
441
  if (ackPromise !== undefined) {
428
442
  this.#retransmissionCounter = 0;
@@ -441,30 +455,37 @@ export class MessageExchange {
441
455
  }
442
456
  }
443
457
 
444
- nextMessage(expectedProcessingTimeMs?: number) {
458
+ nextMessage(options?: { expectedProcessingTimeMs?: number; timeoutMs?: number }) {
445
459
  let timeout: number;
446
- switch (this.channel.type) {
447
- case "tcp":
448
- // TCP uses 30s timeout according to chip sdk implementation, so do the same
449
- timeout = 30_000;
450
- break;
451
- case "udp":
452
- // UDP normally uses MRP, if not we have Group communication which normally have no responses
453
- if (!this.#useMRP) {
454
- throw new MatterFlowError("No response expected for this message exchange because UDP and no MRP.");
455
- }
456
- timeout = this.calculateMaximumPeerResponseTime(expectedProcessingTimeMs);
457
- break;
458
- case "ble":
459
- // chip sdk uses BTP_ACK_TIMEOUT_MS which is wrong in my eyes, so we use static 30s as like TCP here
460
- timeout = 30_000;
461
- break;
462
- default:
463
- throw new MatterFlowError(
464
- `Can not calculate expected timeout for unknown channel type: ${this.channel.type}`,
465
- );
460
+ if (options?.timeoutMs !== undefined) {
461
+ timeout = options.timeoutMs;
462
+ } else {
463
+ switch (this.channel.type) {
464
+ case "tcp":
465
+ // TCP uses 30s timeout according to chip sdk implementation, so do the same
466
+ timeout = 30_000;
467
+ break;
468
+ case "udp":
469
+ // UDP normally uses MRP, if not we have Group communication which normally have no responses
470
+ if (!this.#useMRP) {
471
+ throw new MatterFlowError(
472
+ "No response expected for this message exchange because UDP and no MRP.",
473
+ );
474
+ }
475
+ const { expectedProcessingTimeMs } = options ?? {};
476
+ timeout = this.calculateMaximumPeerResponseTime(expectedProcessingTimeMs);
477
+ break;
478
+ case "ble":
479
+ // chip sdk uses BTP_ACK_TIMEOUT_MS which is wrong in my eyes, so we use static 30s as like TCP here
480
+ timeout = 30_000;
481
+ break;
482
+ default:
483
+ throw new MatterFlowError(
484
+ `Can not calculate expected timeout for unknown channel type: ${this.channel.type}`,
485
+ );
486
+ }
487
+ timeout += PEER_RESPONSE_TIME_BUFFER_MS;
466
488
  }
467
- timeout += PEER_RESPONSE_TIME_BUFFER_MS;
468
489
  return this.#messagesQueue.read(timeout);
469
490
  }
470
491
 
@@ -517,10 +538,10 @@ export class MessageExchange {
517
538
  if (finalWaitTime > 0) {
518
539
  this.#retransmissionCounter--; // We will not resubmit the message again
519
540
  logger.debug(
520
- `Wait additional ${finalWaitTime}ms for processing time and peer resubmissions after all our resubmissions`,
541
+ `Message ${message.packetHeader.messageId}: Wait additional ${finalWaitTime}ms for processing time and peer resubmissions after all our resubmissions`,
521
542
  );
522
543
  this.#retransmissionTimer = Time.getTimer(
523
- "Message wait time after resubmissions",
544
+ `Message wait time after resubmissions ${message.packetHeader.messageId}`,
524
545
  finalWaitTime,
525
546
  () => this.#retransmitMessage(message),
526
547
  ).start();
@@ -4,7 +4,7 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
 
7
- import { MatterError, UnexpectedDataError } from "#general";
7
+ import { Diagnostic, MatterError, UnexpectedDataError } from "#general";
8
8
  import {
9
9
  GeneralStatusCode,
10
10
  ProtocolStatusCode,
@@ -43,17 +43,35 @@ export class SecureChannelMessenger {
43
43
  this.#defaultExpectedProcessingTimeMs = defaultExpectedProcessingTimeMs;
44
44
  }
45
45
 
46
+ async nextMessage(
47
+ expectedMessageType: number,
48
+ expectedProcessingTimeMs = this.#defaultExpectedProcessingTimeMs,
49
+ expectedMessageInfo?: string,
50
+ ) {
51
+ return this.#nextMessage(expectedMessageType, expectedProcessingTimeMs, expectedMessageInfo);
52
+ }
53
+
54
+ async anyNextMessage(
55
+ expectedMessageInfo: string,
56
+ expectedProcessingTimeMs = this.#defaultExpectedProcessingTimeMs,
57
+ ) {
58
+ return this.#nextMessage(undefined, expectedProcessingTimeMs, expectedMessageInfo);
59
+ }
60
+
46
61
  /**
47
62
  * Waits for the next message and returns it.
48
63
  * When no expectedProcessingTimeMs is provided, the default value of EXPECTED_CRYPTO_PROCESSING_TIME_MS is used.
49
64
  */
50
- async nextMessage(
51
- expectedMessageInfo: string,
65
+ async #nextMessage(
52
66
  expectedMessageType?: number,
53
67
  expectedProcessingTimeMs = this.#defaultExpectedProcessingTimeMs,
68
+ expectedMessageInfo?: string,
54
69
  ) {
55
- const message = await this.exchange.nextMessage(expectedProcessingTimeMs);
70
+ const message = await this.exchange.nextMessage({ expectedProcessingTimeMs });
56
71
  const messageType = message.payloadHeader.messageType;
72
+ if (expectedMessageType !== undefined && expectedMessageInfo === undefined) {
73
+ expectedMessageInfo = SecureMessageType[expectedMessageType];
74
+ }
57
75
  this.throwIfErrorStatusReport(message, expectedMessageInfo);
58
76
  if (expectedMessageType !== undefined && messageType !== expectedMessageType)
59
77
  throw new UnexpectedDataError(
@@ -69,12 +87,9 @@ export class SecureChannelMessenger {
69
87
  async nextMessageDecoded<T>(
70
88
  expectedMessageType: number,
71
89
  schema: TlvSchema<T>,
72
- expectedMessageInfo: string,
73
90
  expectedProcessingTimeMs = this.#defaultExpectedProcessingTimeMs,
74
91
  ) {
75
- return schema.decode(
76
- (await this.nextMessage(expectedMessageInfo, expectedMessageType, expectedProcessingTimeMs)).payload,
77
- );
92
+ return schema.decode((await this.nextMessage(expectedMessageType, expectedProcessingTimeMs)).payload);
78
93
  }
79
94
 
80
95
  /**
@@ -86,7 +101,7 @@ export class SecureChannelMessenger {
86
101
  expectedProcessingTimeMs = this.#defaultExpectedProcessingTimeMs,
87
102
  ) {
88
103
  // If the status is not Success, this would throw an Error.
89
- await this.nextMessage(expectedMessageInfo, SecureMessageType.StatusReport, expectedProcessingTimeMs);
104
+ await this.nextMessage(SecureMessageType.StatusReport, expectedProcessingTimeMs, expectedMessageInfo);
90
105
  }
91
106
 
92
107
  /**
@@ -136,7 +151,13 @@ export class SecureChannelMessenger {
136
151
  protocolId: SECURE_CHANNEL_PROTOCOL_ID,
137
152
  protocolStatus,
138
153
  }),
139
- { requiresAck },
154
+ {
155
+ requiresAck,
156
+ logContext: {
157
+ generalStatus: GeneralStatusCode[generalStatus] ?? Diagnostic.hex(generalStatus),
158
+ protocolStatus: ProtocolStatusCode[protocolStatus] ?? Diagnostic.hex(protocolStatus),
159
+ },
160
+ },
140
161
  );
141
162
  }
142
163
 
@@ -156,16 +156,23 @@ export class SecureSession extends Session {
156
156
  logger.debug(
157
157
  `Created secure ${this.isPase ? "PASE" : "CASE"} session for fabric index ${fabric?.fabricIndex}`,
158
158
  this.name,
159
- Diagnostic.dict({
160
- idleIntervalMs: this.idleIntervalMs,
161
- activeIntervalMs: this.activeIntervalMs,
162
- activeThresholdMs: this.activeThresholdMs,
163
- dataModelRevision: this.dataModelRevision,
164
- interactionModelRevision: this.interactionModelRevision,
165
- specificationVersion: this.specificationVersion,
166
- maxPathsPerInvoke: this.maxPathsPerInvoke,
167
- caseAuthenticatedTags: this.#caseAuthenticatedTags,
168
- }),
159
+ this.parameterDiagnostics(),
160
+ );
161
+ }
162
+
163
+ parameterDiagnostics() {
164
+ return Diagnostic.dict(
165
+ {
166
+ SII: this.idleIntervalMs,
167
+ SAI: this.activeIntervalMs,
168
+ SAT: this.activeThresholdMs,
169
+ DMRev: this.dataModelRevision,
170
+ IMRev: this.interactionModelRevision,
171
+ spec: Diagnostic.hex(this.specificationVersion),
172
+ maxPaths: this.maxPathsPerInvoke,
173
+ CATs: this.#caseAuthenticatedTags,
174
+ },
175
+ true,
169
176
  );
170
177
  }
171
178
 
@@ -14,6 +14,7 @@ import {
14
14
  Environmental,
15
15
  Lifecycle,
16
16
  Logger,
17
+ MatterAggregateError,
17
18
  MatterFlowError,
18
19
  Mutex,
19
20
  Observable,
@@ -533,13 +534,16 @@ export class SessionManager {
533
534
 
534
535
  this.#observers.close();
535
536
  await this.#storeResumptionRecords();
536
- for (const session of this.#sessions) {
537
+ const closePromises = this.#sessions.map(async session => {
537
538
  await session?.end(false);
538
539
  this.#sessions.delete(session);
539
- }
540
+ });
540
541
  for (const session of this.#insecureSessions.values()) {
541
- await session?.end();
542
+ closePromises.push(session?.end());
542
543
  }
544
+ await MatterAggregateError.allSettled(closePromises, "Error closing sessions").catch(error =>
545
+ logger.error(error),
546
+ );
543
547
  }
544
548
 
545
549
  async clear() {
@@ -558,7 +562,9 @@ export class SessionManager {
558
562
  });
559
563
  }
560
564
 
565
+ /** Clears all subscriptions for a given node and returns how many were cleared. */
561
566
  async clearSubscriptionsForNode(fabricIndex: FabricIndex, nodeId: NodeId, flushSubscriptions?: boolean) {
567
+ let clearedCount = 0;
562
568
  for (const session of this.#sessions) {
563
569
  if (session.fabric?.fabricIndex !== fabricIndex) {
564
570
  continue;
@@ -567,7 +573,9 @@ export class SessionManager {
567
573
  continue;
568
574
  }
569
575
  await session.clearSubscriptions(flushSubscriptions);
576
+ clearedCount++;
570
577
  }
578
+ return clearedCount;
571
579
  }
572
580
  }
573
581
 
@@ -4,7 +4,7 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
 
7
- import { Bytes, Crypto, Diagnostic, Logger, PublicKey, UnexpectedDataError } from "#general";
7
+ import { Bytes, Crypto, Logger, PublicKey, UnexpectedDataError } from "#general";
8
8
  import { SessionManager } from "#session/SessionManager.js";
9
9
  import { NodeId } from "#types";
10
10
  import { TlvIntermediateCertificate, TlvOperationalCertificate } from "../../certificate/CertificateManager.js";
@@ -106,8 +106,8 @@ export class CaseClient {
106
106
  });
107
107
  await messenger.sendSuccess();
108
108
  logger.info(
109
- `Case client: session resumed with ${messenger.getChannelName()} and parameters`,
110
- Diagnostic.dict(secureSession.parameters),
109
+ `Case client: Session resumed with ${messenger.getChannelName()} and parameters`,
110
+ secureSession.parameterDiagnostics(),
111
111
  );
112
112
 
113
113
  resumptionRecord.resumptionId = resumptionId; /* update resumptionId */
@@ -196,7 +196,7 @@ export class CaseClient {
196
196
  const encryptedData = TlvEncryptedDataSigma3.encode({ nodeOpCert, intermediateCACert, signature });
197
197
  const encrypted = Crypto.encrypt(sigma3Key, encryptedData, TBE_DATA3_NONCE);
198
198
  const sigma3Bytes = await messenger.sendSigma3({ encrypted });
199
- await messenger.waitForSuccess("Success after CASE Sigma3");
199
+ await messenger.waitForSuccess("Sigma3-Success");
200
200
 
201
201
  // All good! Create secure session
202
202
  const secureSessionSalt = Bytes.concat(
@@ -216,7 +216,7 @@ export class CaseClient {
216
216
  });
217
217
  logger.info(
218
218
  `Case client: Paired successfully with ${messenger.getChannelName()} and parameters`,
219
- Diagnostic.dict(secureSession.parameters),
219
+ secureSession.parameterDiagnostics(),
220
220
  );
221
221
  resumptionRecord = {
222
222
  fabric,
@@ -11,7 +11,7 @@ import { TlvCaseSigma1, TlvCaseSigma2, TlvCaseSigma2Resume, TlvCaseSigma3 } from
11
11
 
12
12
  export class CaseServerMessenger extends SecureChannelMessenger {
13
13
  async readSigma1() {
14
- const { payload } = await this.nextMessage("CASE Sigma1", SecureMessageType.Sigma1);
14
+ const { payload } = await this.nextMessage(SecureMessageType.Sigma1);
15
15
  return { sigma1Bytes: payload, sigma1: TlvCaseSigma1.decode(payload) };
16
16
  }
17
17
 
@@ -24,7 +24,7 @@ export class CaseServerMessenger extends SecureChannelMessenger {
24
24
  }
25
25
 
26
26
  async readSigma3() {
27
- const { payload } = await this.nextMessage("CASE Sigma3", SecureMessageType.Sigma3);
27
+ const { payload } = await this.nextMessage(SecureMessageType.Sigma3);
28
28
  return { sigma3Bytes: payload, sigma3: TlvCaseSigma3.decode(payload) };
29
29
  }
30
30
  }
@@ -38,7 +38,7 @@ export class CaseClientMessenger extends SecureChannelMessenger {
38
38
  const {
39
39
  payload,
40
40
  payloadHeader: { messageType },
41
- } = await this.nextMessage("CASE Sigma2 or Sigma2Resume");
41
+ } = await this.anyNextMessage("Sigma2(Resume)");
42
42
  switch (messageType) {
43
43
  case SecureMessageType.Sigma2:
44
44
  return { sigma2Bytes: payload, sigma2: TlvCaseSigma2.decode(payload) };
@@ -130,7 +130,7 @@ export class CaseServer implements ProtocolHandler {
130
130
  }
131
131
 
132
132
  logger.info(
133
- `session ${secureSession.id} resumed with ${messenger.getChannelName()} for Fabric ${NodeId.toHexString(
133
+ `Session ${secureSession.id} resumed with ${messenger.getChannelName()} for Fabric ${NodeId.toHexString(
134
134
  fabric.nodeId,
135
135
  )}(index ${fabric.fabricIndex}) and PeerNode ${NodeId.toHexString(peerNodeId)}`,
136
136
  "with CATs",
@@ -139,7 +139,7 @@ export class CaseServer implements ProtocolHandler {
139
139
  resumptionRecord.resumptionId = resumptionId; /* Update the ID */
140
140
 
141
141
  // Wait for success on the peer side
142
- await messenger.waitForSuccess("Success after CASE Sigma2Resume");
142
+ await messenger.waitForSuccess("Sigma2Resume-Success");
143
143
 
144
144
  await messenger.close();
145
145
  await this.#sessions.saveResumptionRecord(resumptionRecord);
@@ -80,7 +80,7 @@ export class PaseClient {
80
80
  await messenger.sendPasePake3({ verifier: hAY });
81
81
 
82
82
  // All good! Creating the secure session
83
- await messenger.waitForSuccess("Success after PASE Pake3");
83
+ await messenger.waitForSuccess("PasePake3-Success");
84
84
  const secureSession = await this.#sessions.createSecureSession({
85
85
  sessionId: initiatorSessionId,
86
86
  fabric: undefined,
@@ -30,7 +30,6 @@ type PasePake3 = TypeFromSchema<typeof TlvPasePake3>;
30
30
  export class PaseServerMessenger extends SecureChannelMessenger {
31
31
  async readPbkdfParamRequest() {
32
32
  const { payload } = await this.nextMessage(
33
- "PASE PbkdfParamRequest",
34
33
  SecureMessageType.PbkdfParamRequest,
35
34
  DEFAULT_NORMAL_PROCESSING_TIME_MS,
36
35
  );
@@ -44,7 +43,7 @@ export class PaseServerMessenger extends SecureChannelMessenger {
44
43
  }
45
44
 
46
45
  readPasePake1() {
47
- return this.nextMessageDecoded(SecureMessageType.PasePake1, TlvPasePake1, "PASE Pake1");
46
+ return this.nextMessageDecoded(SecureMessageType.PasePake1, TlvPasePake1);
48
47
  }
49
48
 
50
49
  sendPasePake2(pasePake2: PasePake2) {
@@ -52,7 +51,7 @@ export class PaseServerMessenger extends SecureChannelMessenger {
52
51
  }
53
52
 
54
53
  readPasePake3() {
55
- return this.nextMessageDecoded(SecureMessageType.PasePake3, TlvPasePake3, "PASE Pake3");
54
+ return this.nextMessageDecoded(SecureMessageType.PasePake3, TlvPasePake3);
56
55
  }
57
56
  }
58
57
 
@@ -65,7 +64,6 @@ export class PaseClientMessenger extends SecureChannelMessenger {
65
64
 
66
65
  async readPbkdfParamResponse() {
67
66
  const { payload } = await this.nextMessage(
68
- "PASE PbkdfParamResponse",
69
67
  SecureMessageType.PbkdfParamResponse,
70
68
  DEFAULT_NORMAL_PROCESSING_TIME_MS,
71
69
  );
@@ -77,7 +75,7 @@ export class PaseClientMessenger extends SecureChannelMessenger {
77
75
  }
78
76
 
79
77
  readPasePake2() {
80
- return this.nextMessageDecoded(SecureMessageType.PasePake2, TlvPasePake2, "PASE Pake2");
78
+ return this.nextMessageDecoded(SecureMessageType.PasePake2, TlvPasePake2);
81
79
  }
82
80
 
83
81
  sendPasePake3(pasePake3: PasePake3) {