@matter/protocol 0.16.0-alpha.0-20250913-0bc2515df → 0.16.0-alpha.0-20250920-809524dba
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/bdx/BdxClient.d.ts +31 -0
- package/dist/cjs/bdx/BdxClient.d.ts.map +1 -0
- package/dist/cjs/bdx/BdxClient.js +57 -0
- package/dist/cjs/bdx/BdxClient.js.map +6 -0
- package/dist/cjs/bdx/BdxError.d.ts +21 -0
- package/dist/cjs/bdx/BdxError.d.ts.map +1 -0
- package/dist/cjs/bdx/BdxError.js +54 -0
- package/dist/cjs/bdx/BdxError.js.map +6 -0
- package/dist/cjs/bdx/BdxMessenger.d.ts +77 -0
- package/dist/cjs/bdx/BdxMessenger.d.ts.map +1 -0
- package/dist/cjs/bdx/BdxMessenger.js +245 -0
- package/dist/cjs/bdx/BdxMessenger.js.map +6 -0
- package/dist/cjs/bdx/BdxProtocol.d.ts +25 -0
- package/dist/cjs/bdx/BdxProtocol.d.ts.map +1 -0
- package/dist/cjs/bdx/BdxProtocol.js +102 -0
- package/dist/cjs/bdx/BdxProtocol.js.map +6 -0
- package/dist/cjs/bdx/BdxSession.d.ts +36 -0
- package/dist/cjs/bdx/BdxSession.d.ts.map +1 -0
- package/dist/cjs/bdx/BdxSession.js +153 -0
- package/dist/cjs/bdx/BdxSession.js.map +6 -0
- package/dist/cjs/bdx/BdxSessionConfiguration.d.ts +61 -0
- package/dist/cjs/bdx/BdxSessionConfiguration.d.ts.map +1 -0
- package/dist/cjs/bdx/BdxSessionConfiguration.js +95 -0
- package/dist/cjs/bdx/BdxSessionConfiguration.js.map +6 -0
- package/dist/cjs/bdx/FileDesignator.d.ts +21 -0
- package/dist/cjs/bdx/FileDesignator.d.ts.map +1 -0
- package/dist/cjs/bdx/FileDesignator.js +62 -0
- package/dist/cjs/bdx/FileDesignator.js.map +6 -0
- package/dist/cjs/bdx/PersistedFileDesignator.d.ts +16 -0
- package/dist/cjs/bdx/PersistedFileDesignator.d.ts.map +1 -0
- package/dist/cjs/bdx/PersistedFileDesignator.js +57 -0
- package/dist/cjs/bdx/PersistedFileDesignator.js.map +6 -0
- package/dist/cjs/bdx/bdx-session-initiator.d.ts +14 -0
- package/dist/cjs/bdx/bdx-session-initiator.d.ts.map +1 -0
- package/dist/cjs/bdx/bdx-session-initiator.js +218 -0
- package/dist/cjs/bdx/bdx-session-initiator.js.map +6 -0
- package/dist/cjs/bdx/flow/DrivenSendingFlow.d.ts +15 -0
- package/dist/cjs/bdx/flow/DrivenSendingFlow.d.ts.map +1 -0
- package/dist/cjs/bdx/flow/DrivenSendingFlow.js +49 -0
- package/dist/cjs/bdx/flow/DrivenSendingFlow.js.map +6 -0
- package/dist/cjs/bdx/flow/DrivingReceivingFlow.d.ts +15 -0
- package/dist/cjs/bdx/flow/DrivingReceivingFlow.d.ts.map +1 -0
- package/dist/cjs/bdx/flow/DrivingReceivingFlow.js +47 -0
- package/dist/cjs/bdx/flow/DrivingReceivingFlow.js.map +6 -0
- package/dist/cjs/bdx/flow/Flow.d.ts +48 -0
- package/dist/cjs/bdx/flow/Flow.d.ts.map +1 -0
- package/dist/cjs/bdx/flow/Flow.js +112 -0
- package/dist/cjs/bdx/flow/Flow.js.map +6 -0
- package/dist/cjs/bdx/flow/FollowingReceivingFlow.d.ts +16 -0
- package/dist/cjs/bdx/flow/FollowingReceivingFlow.d.ts.map +1 -0
- package/dist/cjs/bdx/flow/FollowingReceivingFlow.js +60 -0
- package/dist/cjs/bdx/flow/FollowingReceivingFlow.js.map +6 -0
- package/dist/cjs/bdx/flow/FollowingSendingFlow.d.ts +15 -0
- package/dist/cjs/bdx/flow/FollowingSendingFlow.d.ts.map +1 -0
- package/dist/cjs/bdx/flow/FollowingSendingFlow.js +49 -0
- package/dist/cjs/bdx/flow/FollowingSendingFlow.js.map +6 -0
- package/dist/cjs/bdx/flow/InboundFlow.d.ts +26 -0
- package/dist/cjs/bdx/flow/InboundFlow.d.ts.map +1 -0
- package/dist/cjs/bdx/flow/InboundFlow.js +101 -0
- package/dist/cjs/bdx/flow/InboundFlow.js.map +6 -0
- package/dist/cjs/bdx/flow/OutboundFlow.d.ts +31 -0
- package/dist/cjs/bdx/flow/OutboundFlow.d.ts.map +1 -0
- package/dist/cjs/bdx/flow/OutboundFlow.js +124 -0
- package/dist/cjs/bdx/flow/OutboundFlow.js.map +6 -0
- package/dist/cjs/bdx/index.d.ts +16 -0
- package/dist/cjs/bdx/index.d.ts.map +1 -0
- package/dist/cjs/bdx/index.js +33 -0
- package/dist/cjs/bdx/index.js.map +6 -0
- package/dist/cjs/bdx/schema/BdxAcceptMessagesSchema.d.ts +50 -0
- package/dist/cjs/bdx/schema/BdxAcceptMessagesSchema.d.ts.map +1 -0
- package/dist/cjs/bdx/schema/BdxAcceptMessagesSchema.js +125 -0
- package/dist/cjs/bdx/schema/BdxAcceptMessagesSchema.js.map +6 -0
- package/dist/cjs/bdx/schema/BdxBlockMessagesSchema.d.ts +53 -0
- package/dist/cjs/bdx/schema/BdxBlockMessagesSchema.d.ts.map +1 -0
- package/dist/cjs/bdx/schema/BdxBlockMessagesSchema.js +92 -0
- package/dist/cjs/bdx/schema/BdxBlockMessagesSchema.js.map +6 -0
- package/dist/cjs/bdx/schema/BdxInitMessagesSchema.d.ts +117 -0
- package/dist/cjs/bdx/schema/BdxInitMessagesSchema.d.ts.map +1 -0
- package/dist/cjs/bdx/schema/BdxInitMessagesSchema.js +153 -0
- package/dist/cjs/bdx/schema/BdxInitMessagesSchema.js.map +6 -0
- package/dist/cjs/bdx/schema/BdxMessage.d.ts +23 -0
- package/dist/cjs/bdx/schema/BdxMessage.d.ts.map +1 -0
- package/dist/cjs/bdx/schema/BdxMessage.js +75 -0
- package/dist/cjs/bdx/schema/BdxMessage.js.map +6 -0
- package/dist/cjs/bdx/schema/BdxStatusMessageSchema.d.ts +12 -0
- package/dist/cjs/bdx/schema/BdxStatusMessageSchema.d.ts.map +1 -0
- package/dist/cjs/bdx/schema/BdxStatusMessageSchema.js +35 -0
- package/dist/cjs/bdx/schema/BdxStatusMessageSchema.js.map +6 -0
- package/dist/cjs/bdx/schema/index.d.ts +11 -0
- package/dist/cjs/bdx/schema/index.d.ts.map +1 -0
- package/dist/cjs/bdx/schema/index.js +28 -0
- package/dist/cjs/bdx/schema/index.js.map +6 -0
- package/dist/cjs/index.d.ts +1 -0
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +1 -0
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/mdns/MdnsClient.js +2 -2
- package/dist/cjs/mdns/MdnsClient.js.map +1 -1
- package/dist/cjs/protocol/ExchangeManager.d.ts.map +1 -1
- package/dist/cjs/protocol/ExchangeManager.js +4 -2
- package/dist/cjs/protocol/ExchangeManager.js.map +1 -1
- package/dist/cjs/protocol/MessageExchange.d.ts +2 -0
- package/dist/cjs/protocol/MessageExchange.d.ts.map +1 -1
- package/dist/cjs/protocol/MessageExchange.js +14 -8
- package/dist/cjs/protocol/MessageExchange.js.map +2 -2
- package/dist/cjs/protocol/ProtocolStatusMessage.d.ts +1 -1
- package/dist/cjs/protocol/ProtocolStatusMessage.d.ts.map +1 -1
- package/dist/cjs/protocol/ProtocolStatusMessage.js.map +1 -1
- package/dist/esm/bdx/BdxClient.d.ts +31 -0
- package/dist/esm/bdx/BdxClient.d.ts.map +1 -0
- package/dist/esm/bdx/BdxClient.js +37 -0
- package/dist/esm/bdx/BdxClient.js.map +6 -0
- package/dist/esm/bdx/BdxError.d.ts +21 -0
- package/dist/esm/bdx/BdxError.d.ts.map +1 -0
- package/dist/esm/bdx/BdxError.js +34 -0
- package/dist/esm/bdx/BdxError.js.map +6 -0
- package/dist/esm/bdx/BdxMessenger.d.ts +77 -0
- package/dist/esm/bdx/BdxMessenger.d.ts.map +1 -0
- package/dist/esm/bdx/BdxMessenger.js +233 -0
- package/dist/esm/bdx/BdxMessenger.js.map +6 -0
- package/dist/esm/bdx/BdxProtocol.d.ts +25 -0
- package/dist/esm/bdx/BdxProtocol.d.ts.map +1 -0
- package/dist/esm/bdx/BdxProtocol.js +82 -0
- package/dist/esm/bdx/BdxProtocol.js.map +6 -0
- package/dist/esm/bdx/BdxSession.d.ts +36 -0
- package/dist/esm/bdx/BdxSession.d.ts.map +1 -0
- package/dist/esm/bdx/BdxSession.js +133 -0
- package/dist/esm/bdx/BdxSession.js.map +6 -0
- package/dist/esm/bdx/BdxSessionConfiguration.d.ts +61 -0
- package/dist/esm/bdx/BdxSessionConfiguration.d.ts.map +1 -0
- package/dist/esm/bdx/BdxSessionConfiguration.js +75 -0
- package/dist/esm/bdx/BdxSessionConfiguration.js.map +6 -0
- package/dist/esm/bdx/FileDesignator.d.ts +21 -0
- package/dist/esm/bdx/FileDesignator.d.ts.map +1 -0
- package/dist/esm/bdx/FileDesignator.js +42 -0
- package/dist/esm/bdx/FileDesignator.js.map +6 -0
- package/dist/esm/bdx/PersistedFileDesignator.d.ts +16 -0
- package/dist/esm/bdx/PersistedFileDesignator.d.ts.map +1 -0
- package/dist/esm/bdx/PersistedFileDesignator.js +37 -0
- package/dist/esm/bdx/PersistedFileDesignator.js.map +6 -0
- package/dist/esm/bdx/bdx-session-initiator.d.ts +14 -0
- package/dist/esm/bdx/bdx-session-initiator.d.ts.map +1 -0
- package/dist/esm/bdx/bdx-session-initiator.js +198 -0
- package/dist/esm/bdx/bdx-session-initiator.js.map +6 -0
- package/dist/esm/bdx/flow/DrivenSendingFlow.d.ts +15 -0
- package/dist/esm/bdx/flow/DrivenSendingFlow.d.ts.map +1 -0
- package/dist/esm/bdx/flow/DrivenSendingFlow.js +29 -0
- package/dist/esm/bdx/flow/DrivenSendingFlow.js.map +6 -0
- package/dist/esm/bdx/flow/DrivingReceivingFlow.d.ts +15 -0
- package/dist/esm/bdx/flow/DrivingReceivingFlow.d.ts.map +1 -0
- package/dist/esm/bdx/flow/DrivingReceivingFlow.js +27 -0
- package/dist/esm/bdx/flow/DrivingReceivingFlow.js.map +6 -0
- package/dist/esm/bdx/flow/Flow.d.ts +48 -0
- package/dist/esm/bdx/flow/Flow.d.ts.map +1 -0
- package/dist/esm/bdx/flow/Flow.js +92 -0
- package/dist/esm/bdx/flow/Flow.js.map +6 -0
- package/dist/esm/bdx/flow/FollowingReceivingFlow.d.ts +16 -0
- package/dist/esm/bdx/flow/FollowingReceivingFlow.d.ts.map +1 -0
- package/dist/esm/bdx/flow/FollowingReceivingFlow.js +40 -0
- package/dist/esm/bdx/flow/FollowingReceivingFlow.js.map +6 -0
- package/dist/esm/bdx/flow/FollowingSendingFlow.d.ts +15 -0
- package/dist/esm/bdx/flow/FollowingSendingFlow.d.ts.map +1 -0
- package/dist/esm/bdx/flow/FollowingSendingFlow.js +29 -0
- package/dist/esm/bdx/flow/FollowingSendingFlow.js.map +6 -0
- package/dist/esm/bdx/flow/InboundFlow.d.ts +26 -0
- package/dist/esm/bdx/flow/InboundFlow.d.ts.map +1 -0
- package/dist/esm/bdx/flow/InboundFlow.js +81 -0
- package/dist/esm/bdx/flow/InboundFlow.js.map +6 -0
- package/dist/esm/bdx/flow/OutboundFlow.d.ts +31 -0
- package/dist/esm/bdx/flow/OutboundFlow.d.ts.map +1 -0
- package/dist/esm/bdx/flow/OutboundFlow.js +104 -0
- package/dist/esm/bdx/flow/OutboundFlow.js.map +6 -0
- package/dist/esm/bdx/index.d.ts +16 -0
- package/dist/esm/bdx/index.d.ts.map +1 -0
- package/dist/esm/bdx/index.js +16 -0
- package/dist/esm/bdx/index.js.map +6 -0
- package/dist/esm/bdx/schema/BdxAcceptMessagesSchema.d.ts +50 -0
- package/dist/esm/bdx/schema/BdxAcceptMessagesSchema.d.ts.map +1 -0
- package/dist/esm/bdx/schema/BdxAcceptMessagesSchema.js +109 -0
- package/dist/esm/bdx/schema/BdxAcceptMessagesSchema.js.map +6 -0
- package/dist/esm/bdx/schema/BdxBlockMessagesSchema.d.ts +53 -0
- package/dist/esm/bdx/schema/BdxBlockMessagesSchema.d.ts.map +1 -0
- package/dist/esm/bdx/schema/BdxBlockMessagesSchema.js +72 -0
- package/dist/esm/bdx/schema/BdxBlockMessagesSchema.js.map +6 -0
- package/dist/esm/bdx/schema/BdxInitMessagesSchema.d.ts +117 -0
- package/dist/esm/bdx/schema/BdxInitMessagesSchema.d.ts.map +1 -0
- package/dist/esm/bdx/schema/BdxInitMessagesSchema.js +133 -0
- package/dist/esm/bdx/schema/BdxInitMessagesSchema.js.map +6 -0
- package/dist/esm/bdx/schema/BdxMessage.d.ts +23 -0
- package/dist/esm/bdx/schema/BdxMessage.d.ts.map +1 -0
- package/dist/esm/bdx/schema/BdxMessage.js +62 -0
- package/dist/esm/bdx/schema/BdxMessage.js.map +6 -0
- package/dist/esm/bdx/schema/BdxStatusMessageSchema.d.ts +12 -0
- package/dist/esm/bdx/schema/BdxStatusMessageSchema.d.ts.map +1 -0
- package/dist/esm/bdx/schema/BdxStatusMessageSchema.js +15 -0
- package/dist/esm/bdx/schema/BdxStatusMessageSchema.js.map +6 -0
- package/dist/esm/bdx/schema/index.d.ts +11 -0
- package/dist/esm/bdx/schema/index.d.ts.map +1 -0
- package/dist/esm/bdx/schema/index.js +11 -0
- package/dist/esm/bdx/schema/index.js.map +6 -0
- package/dist/esm/index.d.ts +1 -0
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +1 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/mdns/MdnsClient.js +2 -2
- package/dist/esm/mdns/MdnsClient.js.map +1 -1
- package/dist/esm/protocol/ExchangeManager.d.ts.map +1 -1
- package/dist/esm/protocol/ExchangeManager.js +4 -2
- package/dist/esm/protocol/ExchangeManager.js.map +1 -1
- package/dist/esm/protocol/MessageExchange.d.ts +2 -0
- package/dist/esm/protocol/MessageExchange.d.ts.map +1 -1
- package/dist/esm/protocol/MessageExchange.js +14 -8
- package/dist/esm/protocol/MessageExchange.js.map +2 -2
- package/dist/esm/protocol/ProtocolStatusMessage.d.ts +1 -1
- package/dist/esm/protocol/ProtocolStatusMessage.d.ts.map +1 -1
- package/dist/esm/protocol/ProtocolStatusMessage.js.map +1 -1
- package/package.json +6 -6
- package/src/bdx/BdxClient.ts +47 -0
- package/src/bdx/BdxError.ts +39 -0
- package/src/bdx/BdxMessenger.ts +291 -0
- package/src/bdx/BdxProtocol.ts +93 -0
- package/src/bdx/BdxSession.ts +174 -0
- package/src/bdx/BdxSessionConfiguration.ts +134 -0
- package/src/bdx/FileDesignator.ts +49 -0
- package/src/bdx/PersistedFileDesignator.ts +40 -0
- package/src/bdx/bdx-session-initiator.ts +246 -0
- package/src/bdx/flow/DrivenSendingFlow.ts +40 -0
- package/src/bdx/flow/DrivingReceivingFlow.ts +39 -0
- package/src/bdx/flow/Flow.ts +124 -0
- package/src/bdx/flow/FollowingReceivingFlow.ts +53 -0
- package/src/bdx/flow/FollowingSendingFlow.ts +38 -0
- package/src/bdx/flow/InboundFlow.ts +104 -0
- package/src/bdx/flow/OutboundFlow.ts +124 -0
- package/src/bdx/index.ts +16 -0
- package/src/bdx/schema/BdxAcceptMessagesSchema.ts +159 -0
- package/src/bdx/schema/BdxBlockMessagesSchema.ts +99 -0
- package/src/bdx/schema/BdxInitMessagesSchema.ts +213 -0
- package/src/bdx/schema/BdxMessage.ts +70 -0
- package/src/bdx/schema/BdxStatusMessageSchema.ts +14 -0
- package/src/bdx/schema/index.ts +11 -0
- package/src/index.ts +1 -0
- package/src/mdns/MdnsClient.ts +2 -2
- package/src/protocol/ExchangeManager.ts +2 -0
- package/src/protocol/MessageExchange.ts +17 -6
- package/src/protocol/ProtocolStatusMessage.ts +1 -1
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2022-2025 Matter.js Authors
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import { Bytes, DataReader, DataWriter, Endian } from "#general";
|
|
8
|
+
import { BdxStatusCode, BitField, BitFlag, BitmapSchema, Schema, TypeFromPartialBitSchema } from "#types";
|
|
9
|
+
import { BdxError } from "../BdxError.js";
|
|
10
|
+
|
|
11
|
+
export const BDX_VERSION = 0;
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* BDX Transfer protocol bitmap definition
|
|
15
|
+
* Bit 7 is reserved for future use
|
|
16
|
+
*
|
|
17
|
+
* @see {@link MatterSpecification.v141.Core}, section 11.22.5.1
|
|
18
|
+
*/
|
|
19
|
+
export const BdxTransferControlBitmap = {
|
|
20
|
+
/** Protocol Version, Only allowed version is 0.0 for now */
|
|
21
|
+
version: BitField(0, 4),
|
|
22
|
+
|
|
23
|
+
/** Indicates if Sender drive is supported by Initiator */
|
|
24
|
+
senderDrive: BitFlag(4),
|
|
25
|
+
|
|
26
|
+
/** Indicates if Receiver drive is supported by Initiator */
|
|
27
|
+
receiverDrive: BitFlag(5),
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Indicates if Asynchronous Transfer is supported by Initiator
|
|
31
|
+
* Synchronous mode is always implicitly supported.
|
|
32
|
+
*/
|
|
33
|
+
asynchronousTransfer: BitFlag(6),
|
|
34
|
+
};
|
|
35
|
+
export const BdxTransferControlSchema = BitmapSchema(BdxTransferControlBitmap);
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* BDX Range control bitmap definition
|
|
39
|
+
* Bits 2-3 and 5-7 is reserved for future use
|
|
40
|
+
*
|
|
41
|
+
* @see {@link MatterSpecification.v141.Core}, section 11.22.5.1
|
|
42
|
+
*/
|
|
43
|
+
export const BdxRangeControlBitmap = {
|
|
44
|
+
/** Indicates if the transfer has a definite length */
|
|
45
|
+
definiteLength: BitFlag(0),
|
|
46
|
+
|
|
47
|
+
/** Indicates if the transfer has a start offset */
|
|
48
|
+
startOffset: BitFlag(1),
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Indicates if wide (64-bit) range enabled for values
|
|
52
|
+
* Offset (STARTFOFS) and length (DEFLEN) are 4 octets (32-bit) little-endian unsigned quantities.
|
|
53
|
+
*/
|
|
54
|
+
wideRange: BitFlag(4),
|
|
55
|
+
};
|
|
56
|
+
export const BdxRangeControlSchema = BitmapSchema(BdxRangeControlBitmap);
|
|
57
|
+
|
|
58
|
+
/** @see {@link MatterSpecification.v141.Core}, section 11.22.5.1 */
|
|
59
|
+
export type BdxInit = {
|
|
60
|
+
/**
|
|
61
|
+
* Transfer protocol details
|
|
62
|
+
* PTC
|
|
63
|
+
* 1 octet
|
|
64
|
+
*/
|
|
65
|
+
transferProtocol: TypeFromPartialBitSchema<typeof BdxTransferControlBitmap>;
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Range Control details - Removed because it is used by encoding/decoding implicitly
|
|
69
|
+
* RTC, 1 octet
|
|
70
|
+
*/
|
|
71
|
+
//rangeControl: TypeFromPartialBitSchema<typeof BdxRangeControlBitmap>;
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Specifies the maximum data size (in bytes) of the block that the Initiator supports, exclusive of block header
|
|
75
|
+
* fields, such as a block counter.
|
|
76
|
+
* PMBS, 2 octets
|
|
77
|
+
*/
|
|
78
|
+
maxBlockSize: number;
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* Optional 32-bit/64-bit length that specifies the offset in bytes from start of the file from which the Sender
|
|
82
|
+
* would start the transfer.
|
|
83
|
+
* STARTOFS, 4/8 octets
|
|
84
|
+
*/
|
|
85
|
+
startOffset?: number | bigint;
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Specifies a predetermined definite length for the transfer
|
|
89
|
+
* DEFLEN, 4/8 octets
|
|
90
|
+
*/
|
|
91
|
+
maxLength?: number | bigint;
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* Identifier chosen by the Initiator to identify the payload to be transferred.
|
|
95
|
+
* FD, 2 octets + Variable length
|
|
96
|
+
*/
|
|
97
|
+
fileDesignator: Bytes;
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* Allows the Initiator to send additional application-specific information about the file to be transferred
|
|
101
|
+
* MD, Variable length, TLV
|
|
102
|
+
*/
|
|
103
|
+
metaData?: Bytes;
|
|
104
|
+
};
|
|
105
|
+
|
|
106
|
+
/** Schema for BDX SendInit and ReceiveInit messages. */
|
|
107
|
+
export class BdxInitMessageSchema extends Schema<BdxInit> {
|
|
108
|
+
encodeInternal(message: BdxInit) {
|
|
109
|
+
this.validate(message);
|
|
110
|
+
const { transferProtocol, maxBlockSize, startOffset, maxLength, fileDesignator, metaData } = message;
|
|
111
|
+
|
|
112
|
+
const rangeControl = {
|
|
113
|
+
startOffset: startOffset !== undefined,
|
|
114
|
+
definiteLength: maxLength !== undefined && maxLength !== 0,
|
|
115
|
+
wideRange: typeof startOffset === "bigint" || typeof maxLength === "bigint",
|
|
116
|
+
};
|
|
117
|
+
|
|
118
|
+
const writer = new DataWriter(Endian.Little);
|
|
119
|
+
writer.writeUInt8(BdxTransferControlSchema.encode(transferProtocol));
|
|
120
|
+
writer.writeUInt8(BdxRangeControlSchema.encode(rangeControl));
|
|
121
|
+
writer.writeUInt16(maxBlockSize);
|
|
122
|
+
|
|
123
|
+
if (startOffset !== undefined) {
|
|
124
|
+
if (rangeControl.wideRange) {
|
|
125
|
+
writer.writeUInt64(startOffset);
|
|
126
|
+
} else {
|
|
127
|
+
writer.writeUInt32(startOffset);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
if (maxLength !== undefined && maxLength !== 0) {
|
|
131
|
+
if (rangeControl.wideRange) {
|
|
132
|
+
writer.writeUInt64(maxLength);
|
|
133
|
+
} else {
|
|
134
|
+
writer.writeUInt32(maxLength);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
writer.writeUInt16(fileDesignator.byteLength);
|
|
139
|
+
writer.writeByteArray(fileDesignator);
|
|
140
|
+
|
|
141
|
+
if (metaData && metaData.byteLength > 0) {
|
|
142
|
+
writer.writeByteArray(metaData);
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
return writer.toByteArray();
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
decodeInternal(bytes: Bytes): BdxInit {
|
|
149
|
+
const reader = new DataReader(bytes, Endian.Little);
|
|
150
|
+
const transferProtocol = BdxTransferControlSchema.decode(reader.readUInt8());
|
|
151
|
+
const rangeControl = BdxRangeControlSchema.decode(reader.readUInt8());
|
|
152
|
+
const maxBlockSize = reader.readUInt16();
|
|
153
|
+
|
|
154
|
+
const startOffset = rangeControl.startOffset
|
|
155
|
+
? rangeControl.wideRange
|
|
156
|
+
? reader.readUInt64()
|
|
157
|
+
: reader.readUInt32()
|
|
158
|
+
: undefined;
|
|
159
|
+
let maxLength = rangeControl.definiteLength
|
|
160
|
+
? rangeControl.wideRange
|
|
161
|
+
? reader.readUInt64()
|
|
162
|
+
: reader.readUInt32()
|
|
163
|
+
: undefined;
|
|
164
|
+
if (maxLength === 0) {
|
|
165
|
+
maxLength = undefined; // 0 also means indefinite length
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
const fileDesignatorLength = reader.readUInt16();
|
|
169
|
+
const fileDesignator = reader.readByteArray(fileDesignatorLength);
|
|
170
|
+
|
|
171
|
+
const metaData = reader.remainingBytesCount > 0 ? reader.remainingBytes : undefined;
|
|
172
|
+
|
|
173
|
+
const result = {
|
|
174
|
+
transferProtocol,
|
|
175
|
+
maxBlockSize,
|
|
176
|
+
startOffset,
|
|
177
|
+
maxLength,
|
|
178
|
+
fileDesignator,
|
|
179
|
+
metaData,
|
|
180
|
+
};
|
|
181
|
+
this.validate(result);
|
|
182
|
+
return result;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
override validate({ transferProtocol, maxBlockSize, fileDesignator }: BdxInit) {
|
|
186
|
+
if (transferProtocol.version !== BDX_VERSION) {
|
|
187
|
+
throw new BdxError(
|
|
188
|
+
`Unsupported BDX version: ${transferProtocol.version}`,
|
|
189
|
+
BdxStatusCode.VersionNotSupported,
|
|
190
|
+
);
|
|
191
|
+
}
|
|
192
|
+
if (!transferProtocol.senderDrive && !transferProtocol.receiverDrive) {
|
|
193
|
+
throw new BdxError(
|
|
194
|
+
"BDX transfer protocol needs to allow either sender or receiver drive",
|
|
195
|
+
BdxStatusCode.BadMessageContent,
|
|
196
|
+
);
|
|
197
|
+
}
|
|
198
|
+
if (fileDesignator.byteLength === 0) {
|
|
199
|
+
throw new BdxError("File Designator cannot be empty", BdxStatusCode.BadMessageContent);
|
|
200
|
+
}
|
|
201
|
+
if (fileDesignator.byteLength > 0xffff) {
|
|
202
|
+
throw new BdxError(
|
|
203
|
+
"File Designator length exceeds maximum allowed size of 65535bytes",
|
|
204
|
+
BdxStatusCode.BadMessageContent,
|
|
205
|
+
);
|
|
206
|
+
}
|
|
207
|
+
if (maxBlockSize < 1 || maxBlockSize > 0xffff) {
|
|
208
|
+
throw new BdxError("Max Block Size must be between 1 and 65535bytes", BdxStatusCode.BadMessageContent);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
export const BdxSendInitMessage = new BdxInitMessageSchema();
|
|
213
|
+
export const BdxReceiveInitMessage = BdxSendInitMessage;
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2022-2025 Matter.js Authors
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import { Bytes, InternalError } from "#general";
|
|
8
|
+
import { BdxMessageType, Schema, SchemaType } from "#types";
|
|
9
|
+
import { BdxReceiveAcceptMessage, BdxSendAcceptMessage } from "./BdxAcceptMessagesSchema.js";
|
|
10
|
+
import {
|
|
11
|
+
BdxBlockAckEofMessage,
|
|
12
|
+
BdxBlockAckMessage,
|
|
13
|
+
BdxBlockEofMessage,
|
|
14
|
+
BdxBlockMessage,
|
|
15
|
+
BdxBlockQueryMessage,
|
|
16
|
+
BdxBlockQueryWithSkipMessage,
|
|
17
|
+
} from "./BdxBlockMessagesSchema.js";
|
|
18
|
+
import { BdxReceiveInitMessage, BdxSendInitMessage } from "./BdxInitMessagesSchema.js";
|
|
19
|
+
|
|
20
|
+
export interface BdxMessage<T extends BdxMessageType> {
|
|
21
|
+
kind: T;
|
|
22
|
+
message: SchemaType<BdxMessage.Kinds[T]>;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/** Convenient wrapper around BDX message encoding/decoding and type guards. */
|
|
26
|
+
export namespace BdxMessage {
|
|
27
|
+
export function encode<T extends BdxMessageType>({ kind, message }: BdxMessage<T>) {
|
|
28
|
+
if (!(kind in Kinds)) {
|
|
29
|
+
throw new InternalError(`Can not encode unknown BDX message type: ${kind}`);
|
|
30
|
+
}
|
|
31
|
+
return Kinds[kind].encode(message);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export function decode<T extends BdxMessageType>(kind: T, payload: Bytes): BdxMessage<T> {
|
|
35
|
+
if (!(kind in Kinds)) {
|
|
36
|
+
throw new InternalError(`Can not decode unknown BDX message type: ${kind}`);
|
|
37
|
+
}
|
|
38
|
+
return { kind, message: Kinds[kind].decode(payload) };
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export function is<T extends BdxMessageType>(message: BdxMessage<any>, kind: T): message is BdxMessage<T> {
|
|
42
|
+
return message.kind === kind;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export function assert<T extends BdxMessageType>(
|
|
46
|
+
message: BdxMessage<any>,
|
|
47
|
+
kind: T,
|
|
48
|
+
): asserts message is BdxMessage<T> {
|
|
49
|
+
if (message.kind !== kind) {
|
|
50
|
+
throw new InternalError(
|
|
51
|
+
`Expected BDX message of type ${BdxMessageType[kind]}, but got ${BdxMessageType[message.kind]}(${message.kind})`,
|
|
52
|
+
);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export const Kinds: { [key: number]: Schema<any> } = {
|
|
57
|
+
[BdxMessageType.SendInit]: BdxSendInitMessage,
|
|
58
|
+
[BdxMessageType.ReceiveInit]: BdxReceiveInitMessage,
|
|
59
|
+
[BdxMessageType.SendAccept]: BdxSendAcceptMessage,
|
|
60
|
+
[BdxMessageType.ReceiveAccept]: BdxReceiveAcceptMessage,
|
|
61
|
+
[BdxMessageType.BlockQuery]: BdxBlockQueryMessage,
|
|
62
|
+
[BdxMessageType.BlockQueryWithSkip]: BdxBlockQueryWithSkipMessage,
|
|
63
|
+
[BdxMessageType.Block]: BdxBlockMessage,
|
|
64
|
+
[BdxMessageType.BlockEof]: BdxBlockEofMessage,
|
|
65
|
+
[BdxMessageType.BlockAck]: BdxBlockAckMessage,
|
|
66
|
+
[BdxMessageType.BlockAckEof]: BdxBlockAckEofMessage,
|
|
67
|
+
} as const;
|
|
68
|
+
|
|
69
|
+
export type Kinds = typeof Kinds;
|
|
70
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2022-2025 Matter.js Authors
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import { ProtocolStatusMessage, ProtocolStatusMessageSchema } from "#protocol/ProtocolStatusMessage.js";
|
|
8
|
+
import { BDX_PROTOCOL_ID, BdxStatusCode } from "#types";
|
|
9
|
+
|
|
10
|
+
export type BdxStatus = Omit<ProtocolStatusMessage<BdxStatusCode>, "protocolData">;
|
|
11
|
+
|
|
12
|
+
export class BdxStatusMessageSchema extends ProtocolStatusMessageSchema<BdxStatus> {}
|
|
13
|
+
|
|
14
|
+
export const BdxStatusMessage = new BdxStatusMessageSchema(BDX_PROTOCOL_ID, false);
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2022-2025 Matter.js Authors
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
export * from "./BdxAcceptMessagesSchema.js";
|
|
8
|
+
export * from "./BdxBlockMessagesSchema.js";
|
|
9
|
+
export * from "./BdxInitMessagesSchema.js";
|
|
10
|
+
export * from "./BdxMessage.js";
|
|
11
|
+
export * from "./BdxStatusMessageSchema.js";
|
package/src/index.ts
CHANGED
package/src/mdns/MdnsClient.ts
CHANGED
|
@@ -1402,13 +1402,13 @@ export class MdnsClient implements Scanner {
|
|
|
1402
1402
|
if (key === undefined || value === undefined) continue;
|
|
1403
1403
|
if (["T", "D", "CM", "DT", "PH", "ICD"].includes(key)) {
|
|
1404
1404
|
const intValue = parseInt(value);
|
|
1405
|
-
if (
|
|
1405
|
+
if (!Number.isFinite(intValue)) continue;
|
|
1406
1406
|
result[key] = intValue;
|
|
1407
1407
|
} else if (["VP", "DN", "RI", "PI"].includes(key)) {
|
|
1408
1408
|
result[key] = value;
|
|
1409
1409
|
} else if (["SII", "SAI", "SAT"].includes(key)) {
|
|
1410
1410
|
const intValue = parseInt(value);
|
|
1411
|
-
if (
|
|
1411
|
+
if (!Number.isFinite(intValue)) continue;
|
|
1412
1412
|
result[key] = intValue;
|
|
1413
1413
|
result[key] = Millis(intValue);
|
|
1414
1414
|
}
|
|
@@ -242,6 +242,7 @@ export class ExchangeManager {
|
|
|
242
242
|
);
|
|
243
243
|
await exchange.send(SecureMessageType.StandaloneAck, new Uint8Array(0), {
|
|
244
244
|
includeAcknowledgeMessageId: message.packetHeader.messageId,
|
|
245
|
+
protocolId: SECURE_CHANNEL_PROTOCOL_ID,
|
|
245
246
|
});
|
|
246
247
|
await exchange.close();
|
|
247
248
|
return;
|
|
@@ -294,6 +295,7 @@ export class ExchangeManager {
|
|
|
294
295
|
this.#addExchange(exchangeIndex, exchange);
|
|
295
296
|
await exchange.send(SecureMessageType.StandaloneAck, new Uint8Array(0), {
|
|
296
297
|
includeAcknowledgeMessageId: message.packetHeader.messageId,
|
|
298
|
+
protocolId: SECURE_CHANNEL_PROTOCOL_ID,
|
|
297
299
|
});
|
|
298
300
|
await exchange.close();
|
|
299
301
|
logger.debug(
|
|
@@ -88,6 +88,11 @@ export type ExchangeSendOptions = {
|
|
|
88
88
|
|
|
89
89
|
/** Additional context information for logging to be included at the beginning of the Message log. */
|
|
90
90
|
logContext?: ExchangeLogContext;
|
|
91
|
+
|
|
92
|
+
// TODO Restructure exchange logic to not be protocol bound like now. The Protocol binding should move to the
|
|
93
|
+
// messages itself
|
|
94
|
+
/** Allows to override the protocol ID of the message, mainly used for standalone acks. */
|
|
95
|
+
protocolId?: number;
|
|
91
96
|
};
|
|
92
97
|
|
|
93
98
|
/**
|
|
@@ -264,7 +269,10 @@ export class MessageExchange {
|
|
|
264
269
|
} = message;
|
|
265
270
|
if (!requiresAck || !this.channel.usesMrp) return;
|
|
266
271
|
|
|
267
|
-
await this.send(SecureMessageType.StandaloneAck, new Uint8Array(0), {
|
|
272
|
+
await this.send(SecureMessageType.StandaloneAck, new Uint8Array(0), {
|
|
273
|
+
includeAcknowledgeMessageId: messageId,
|
|
274
|
+
protocolId: SECURE_CHANNEL_PROTOCOL_ID,
|
|
275
|
+
});
|
|
268
276
|
}
|
|
269
277
|
|
|
270
278
|
async onMessageReceived(message: Message, duplicate = false) {
|
|
@@ -360,11 +368,14 @@ export class MessageExchange {
|
|
|
360
368
|
requiresAck,
|
|
361
369
|
includeAcknowledgeMessageId,
|
|
362
370
|
logContext,
|
|
371
|
+
protocolId = this.#protocolId,
|
|
363
372
|
} = options ?? {};
|
|
364
373
|
if (!this.channel.usesMrp && includeAcknowledgeMessageId !== undefined) {
|
|
365
374
|
throw new InternalError("Cannot include an acknowledge message ID when MRP is not used");
|
|
366
375
|
}
|
|
367
|
-
|
|
376
|
+
const isStandaloneAck = SecureMessageType.isStandaloneAck(protocolId, messageType);
|
|
377
|
+
|
|
378
|
+
if (isStandaloneAck) {
|
|
368
379
|
if (!this.channel.usesMrp) {
|
|
369
380
|
return;
|
|
370
381
|
}
|
|
@@ -372,8 +383,9 @@ export class MessageExchange {
|
|
|
372
383
|
throw new MatterFlowError("A standalone ack may not require acknowledgement.");
|
|
373
384
|
}
|
|
374
385
|
}
|
|
375
|
-
if (this.#sentMessageToAck !== undefined &&
|
|
386
|
+
if (this.#sentMessageToAck !== undefined && !isStandaloneAck) {
|
|
376
387
|
throw new MatterFlowError("The previous message has not been acked yet, cannot send a new message.");
|
|
388
|
+
}
|
|
377
389
|
|
|
378
390
|
this.#used = true;
|
|
379
391
|
this.session.notifyActivity(false);
|
|
@@ -426,11 +438,10 @@ export class MessageExchange {
|
|
|
426
438
|
packetHeader,
|
|
427
439
|
payloadHeader: {
|
|
428
440
|
exchangeId: this.#exchangeId,
|
|
429
|
-
protocolId
|
|
430
|
-
messageType === SecureMessageType.StandaloneAck ? SECURE_CHANNEL_PROTOCOL_ID : this.#protocolId,
|
|
441
|
+
protocolId,
|
|
431
442
|
messageType,
|
|
432
443
|
isInitiatorMessage: this.isInitiator,
|
|
433
|
-
requiresAck: requiresAck ?? (this.channel.usesMrp &&
|
|
444
|
+
requiresAck: requiresAck ?? (this.channel.usesMrp && !isStandaloneAck),
|
|
434
445
|
ackedMessageId,
|
|
435
446
|
hasSecuredExtension: false,
|
|
436
447
|
},
|
|
@@ -15,7 +15,7 @@ export type ProtocolStatusMessage<T> = {
|
|
|
15
15
|
protocolData?: Bytes;
|
|
16
16
|
};
|
|
17
17
|
|
|
18
|
-
export abstract class ProtocolStatusMessageSchema<T extends ProtocolStatusMessage<any>> extends Schema<T
|
|
18
|
+
export abstract class ProtocolStatusMessageSchema<T extends ProtocolStatusMessage<any>> extends Schema<T> {
|
|
19
19
|
#protocolId: number;
|
|
20
20
|
#vendorId: number;
|
|
21
21
|
#protocolSpecificDataAllowed: boolean;
|