@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.
- package/dist/cjs/cluster/server/EventServer.d.ts.map +1 -1
- package/dist/cjs/cluster/server/EventServer.js +4 -1
- package/dist/cjs/cluster/server/EventServer.js.map +1 -1
- package/dist/cjs/codec/MessageCodec.d.ts +2 -1
- package/dist/cjs/codec/MessageCodec.d.ts.map +1 -1
- package/dist/cjs/codec/MessageCodec.js +39 -9
- package/dist/cjs/codec/MessageCodec.js.map +1 -1
- package/dist/cjs/events/NonvolatileEventStore.d.ts.map +1 -1
- package/dist/cjs/events/NonvolatileEventStore.js +2 -6
- package/dist/cjs/events/NonvolatileEventStore.js.map +1 -1
- package/dist/cjs/events/OccurrenceManager.d.ts.map +1 -1
- package/dist/cjs/events/OccurrenceManager.js +2 -2
- package/dist/cjs/events/OccurrenceManager.js.map +1 -1
- package/dist/cjs/interaction/InteractionClient.d.ts.map +1 -1
- package/dist/cjs/interaction/InteractionClient.js +0 -3
- package/dist/cjs/interaction/InteractionClient.js.map +1 -1
- package/dist/cjs/interaction/InteractionMessenger.d.ts +17 -6
- package/dist/cjs/interaction/InteractionMessenger.d.ts.map +1 -1
- package/dist/cjs/interaction/InteractionMessenger.js +88 -31
- package/dist/cjs/interaction/InteractionMessenger.js.map +1 -1
- package/dist/cjs/interaction/InteractionServer.d.ts.map +1 -1
- package/dist/cjs/interaction/InteractionServer.js +32 -7
- package/dist/cjs/interaction/InteractionServer.js.map +1 -1
- package/dist/cjs/interaction/ServerSubscription.d.ts.map +1 -1
- package/dist/cjs/interaction/ServerSubscription.js +28 -16
- package/dist/cjs/interaction/ServerSubscription.js.map +1 -1
- package/dist/cjs/mdns/MdnsScanner.d.ts +3 -3
- package/dist/cjs/mdns/MdnsScanner.d.ts.map +1 -1
- package/dist/cjs/mdns/MdnsScanner.js +18 -15
- package/dist/cjs/mdns/MdnsScanner.js.map +1 -1
- package/dist/cjs/mdns/MdnsServer.d.ts.map +1 -1
- package/dist/cjs/mdns/MdnsServer.js +8 -6
- package/dist/cjs/mdns/MdnsServer.js.map +1 -1
- package/dist/cjs/mdns/MdnsService.d.ts.map +1 -1
- package/dist/cjs/mdns/MdnsService.js +4 -1
- package/dist/cjs/mdns/MdnsService.js.map +1 -1
- package/dist/cjs/protocol/DeviceAdvertiser.d.ts.map +1 -1
- package/dist/cjs/protocol/DeviceAdvertiser.js +5 -5
- package/dist/cjs/protocol/DeviceAdvertiser.js.map +1 -1
- package/dist/cjs/protocol/ExchangeManager.d.ts +2 -2
- package/dist/cjs/protocol/ExchangeManager.d.ts.map +1 -1
- package/dist/cjs/protocol/ExchangeManager.js +8 -6
- package/dist/cjs/protocol/ExchangeManager.js.map +1 -1
- package/dist/cjs/protocol/MessageExchange.d.ts +12 -2
- package/dist/cjs/protocol/MessageExchange.d.ts.map +1 -1
- package/dist/cjs/protocol/MessageExchange.js +47 -36
- package/dist/cjs/protocol/MessageExchange.js.map +1 -1
- package/dist/cjs/securechannel/SecureChannelMessenger.d.ts +3 -6
- package/dist/cjs/securechannel/SecureChannelMessenger.d.ts.map +1 -1
- package/dist/cjs/securechannel/SecureChannelMessenger.js +21 -8
- package/dist/cjs/securechannel/SecureChannelMessenger.js.map +1 -1
- package/dist/cjs/session/SecureSession.d.ts +2 -1
- package/dist/cjs/session/SecureSession.d.ts.map +1 -1
- package/dist/cjs/session/SecureSession.js +16 -10
- package/dist/cjs/session/SecureSession.js.map +1 -1
- package/dist/cjs/session/SessionManager.d.ts +2 -1
- package/dist/cjs/session/SessionManager.d.ts.map +1 -1
- package/dist/cjs/session/SessionManager.js +10 -3
- package/dist/cjs/session/SessionManager.js.map +1 -1
- package/dist/cjs/session/case/CaseClient.js +4 -4
- package/dist/cjs/session/case/CaseClient.js.map +1 -1
- package/dist/cjs/session/case/CaseMessenger.js +3 -3
- package/dist/cjs/session/case/CaseMessenger.js.map +1 -1
- package/dist/cjs/session/case/CaseServer.js +2 -2
- package/dist/cjs/session/case/CaseServer.js.map +1 -1
- package/dist/cjs/session/pase/PaseClient.js +1 -1
- package/dist/cjs/session/pase/PaseClient.js.map +1 -1
- package/dist/cjs/session/pase/PaseMessenger.d.ts.map +1 -1
- package/dist/cjs/session/pase/PaseMessenger.js +3 -5
- package/dist/cjs/session/pase/PaseMessenger.js.map +1 -1
- package/dist/esm/cluster/server/EventServer.d.ts.map +1 -1
- package/dist/esm/cluster/server/EventServer.js +5 -1
- package/dist/esm/cluster/server/EventServer.js.map +1 -1
- package/dist/esm/codec/MessageCodec.d.ts +2 -1
- package/dist/esm/codec/MessageCodec.d.ts.map +1 -1
- package/dist/esm/codec/MessageCodec.js +40 -10
- package/dist/esm/codec/MessageCodec.js.map +1 -1
- package/dist/esm/events/NonvolatileEventStore.d.ts.map +1 -1
- package/dist/esm/events/NonvolatileEventStore.js +3 -7
- package/dist/esm/events/NonvolatileEventStore.js.map +1 -1
- package/dist/esm/events/OccurrenceManager.d.ts.map +1 -1
- package/dist/esm/events/OccurrenceManager.js +11 -3
- package/dist/esm/events/OccurrenceManager.js.map +1 -1
- package/dist/esm/interaction/InteractionClient.d.ts.map +1 -1
- package/dist/esm/interaction/InteractionClient.js +0 -3
- package/dist/esm/interaction/InteractionClient.js.map +1 -1
- package/dist/esm/interaction/InteractionMessenger.d.ts +17 -6
- package/dist/esm/interaction/InteractionMessenger.d.ts.map +1 -1
- package/dist/esm/interaction/InteractionMessenger.js +89 -32
- package/dist/esm/interaction/InteractionMessenger.js.map +1 -1
- package/dist/esm/interaction/InteractionServer.d.ts.map +1 -1
- package/dist/esm/interaction/InteractionServer.js +32 -7
- package/dist/esm/interaction/InteractionServer.js.map +1 -1
- package/dist/esm/interaction/ServerSubscription.d.ts.map +1 -1
- package/dist/esm/interaction/ServerSubscription.js +29 -17
- package/dist/esm/interaction/ServerSubscription.js.map +1 -1
- package/dist/esm/mdns/MdnsScanner.d.ts +3 -3
- package/dist/esm/mdns/MdnsScanner.d.ts.map +1 -1
- package/dist/esm/mdns/MdnsScanner.js +18 -15
- package/dist/esm/mdns/MdnsScanner.js.map +1 -1
- package/dist/esm/mdns/MdnsServer.d.ts.map +1 -1
- package/dist/esm/mdns/MdnsServer.js +9 -6
- package/dist/esm/mdns/MdnsServer.js.map +1 -1
- package/dist/esm/mdns/MdnsService.d.ts.map +1 -1
- package/dist/esm/mdns/MdnsService.js +5 -1
- package/dist/esm/mdns/MdnsService.js.map +1 -1
- package/dist/esm/protocol/DeviceAdvertiser.d.ts.map +1 -1
- package/dist/esm/protocol/DeviceAdvertiser.js +5 -5
- package/dist/esm/protocol/DeviceAdvertiser.js.map +1 -1
- package/dist/esm/protocol/ExchangeManager.d.ts +2 -2
- package/dist/esm/protocol/ExchangeManager.d.ts.map +1 -1
- package/dist/esm/protocol/ExchangeManager.js +9 -6
- package/dist/esm/protocol/ExchangeManager.js.map +1 -1
- package/dist/esm/protocol/MessageExchange.d.ts +12 -2
- package/dist/esm/protocol/MessageExchange.d.ts.map +1 -1
- package/dist/esm/protocol/MessageExchange.js +47 -36
- package/dist/esm/protocol/MessageExchange.js.map +1 -1
- package/dist/esm/securechannel/SecureChannelMessenger.d.ts +3 -6
- package/dist/esm/securechannel/SecureChannelMessenger.d.ts.map +1 -1
- package/dist/esm/securechannel/SecureChannelMessenger.js +22 -9
- package/dist/esm/securechannel/SecureChannelMessenger.js.map +1 -1
- package/dist/esm/session/SecureSession.d.ts +2 -1
- package/dist/esm/session/SecureSession.d.ts.map +1 -1
- package/dist/esm/session/SecureSession.js +16 -10
- package/dist/esm/session/SecureSession.js.map +1 -1
- package/dist/esm/session/SessionManager.d.ts +2 -1
- package/dist/esm/session/SessionManager.d.ts.map +1 -1
- package/dist/esm/session/SessionManager.js +11 -3
- package/dist/esm/session/SessionManager.js.map +1 -1
- package/dist/esm/session/case/CaseClient.js +5 -5
- package/dist/esm/session/case/CaseClient.js.map +1 -1
- package/dist/esm/session/case/CaseMessenger.js +3 -3
- package/dist/esm/session/case/CaseMessenger.js.map +1 -1
- package/dist/esm/session/case/CaseServer.js +2 -2
- package/dist/esm/session/case/CaseServer.js.map +1 -1
- package/dist/esm/session/pase/PaseClient.js +1 -1
- package/dist/esm/session/pase/PaseClient.js.map +1 -1
- package/dist/esm/session/pase/PaseMessenger.d.ts.map +1 -1
- package/dist/esm/session/pase/PaseMessenger.js +3 -5
- package/dist/esm/session/pase/PaseMessenger.js.map +1 -1
- package/package.json +6 -6
- package/src/cluster/server/EventServer.ts +4 -1
- package/src/codec/MessageCodec.ts +42 -10
- package/src/events/NonvolatileEventStore.ts +4 -5
- package/src/events/OccurrenceManager.ts +12 -2
- package/src/interaction/InteractionClient.ts +0 -3
- package/src/interaction/InteractionMessenger.ts +114 -32
- package/src/interaction/InteractionServer.ts +30 -5
- package/src/interaction/ServerSubscription.ts +23 -16
- package/src/mdns/MdnsScanner.ts +17 -14
- package/src/mdns/MdnsServer.ts +7 -4
- package/src/mdns/MdnsService.ts +5 -1
- package/src/protocol/DeviceAdvertiser.ts +5 -7
- package/src/protocol/ExchangeManager.ts +10 -7
- package/src/protocol/MessageExchange.ts +59 -38
- package/src/securechannel/SecureChannelMessenger.ts +31 -10
- package/src/session/SecureSession.ts +17 -10
- package/src/session/SessionManager.ts +11 -3
- package/src/session/case/CaseClient.ts +5 -5
- package/src/session/case/CaseMessenger.ts +3 -3
- package/src/session/case/CaseServer.ts +2 -2
- package/src/session/pase/PaseClient.ts +1 -1
- 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
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
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,
|
|
270
|
-
logger.debug("Message «", MessageCodec.messageDiagnostics(message,
|
|
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 (
|
|
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
|
-
|
|
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
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
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
|
-
|
|
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(
|
|
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
|
-
{
|
|
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
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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,
|
|
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:
|
|
110
|
-
|
|
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
|
|
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
|
-
|
|
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(
|
|
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(
|
|
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.
|
|
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
|
-
`
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
78
|
+
return this.nextMessageDecoded(SecureMessageType.PasePake2, TlvPasePake2);
|
|
81
79
|
}
|
|
82
80
|
|
|
83
81
|
sendPasePake3(pasePake3: PasePake3) {
|