@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.
Files changed (245) hide show
  1. package/dist/cjs/bdx/BdxClient.d.ts +31 -0
  2. package/dist/cjs/bdx/BdxClient.d.ts.map +1 -0
  3. package/dist/cjs/bdx/BdxClient.js +57 -0
  4. package/dist/cjs/bdx/BdxClient.js.map +6 -0
  5. package/dist/cjs/bdx/BdxError.d.ts +21 -0
  6. package/dist/cjs/bdx/BdxError.d.ts.map +1 -0
  7. package/dist/cjs/bdx/BdxError.js +54 -0
  8. package/dist/cjs/bdx/BdxError.js.map +6 -0
  9. package/dist/cjs/bdx/BdxMessenger.d.ts +77 -0
  10. package/dist/cjs/bdx/BdxMessenger.d.ts.map +1 -0
  11. package/dist/cjs/bdx/BdxMessenger.js +245 -0
  12. package/dist/cjs/bdx/BdxMessenger.js.map +6 -0
  13. package/dist/cjs/bdx/BdxProtocol.d.ts +25 -0
  14. package/dist/cjs/bdx/BdxProtocol.d.ts.map +1 -0
  15. package/dist/cjs/bdx/BdxProtocol.js +102 -0
  16. package/dist/cjs/bdx/BdxProtocol.js.map +6 -0
  17. package/dist/cjs/bdx/BdxSession.d.ts +36 -0
  18. package/dist/cjs/bdx/BdxSession.d.ts.map +1 -0
  19. package/dist/cjs/bdx/BdxSession.js +153 -0
  20. package/dist/cjs/bdx/BdxSession.js.map +6 -0
  21. package/dist/cjs/bdx/BdxSessionConfiguration.d.ts +61 -0
  22. package/dist/cjs/bdx/BdxSessionConfiguration.d.ts.map +1 -0
  23. package/dist/cjs/bdx/BdxSessionConfiguration.js +95 -0
  24. package/dist/cjs/bdx/BdxSessionConfiguration.js.map +6 -0
  25. package/dist/cjs/bdx/FileDesignator.d.ts +21 -0
  26. package/dist/cjs/bdx/FileDesignator.d.ts.map +1 -0
  27. package/dist/cjs/bdx/FileDesignator.js +62 -0
  28. package/dist/cjs/bdx/FileDesignator.js.map +6 -0
  29. package/dist/cjs/bdx/PersistedFileDesignator.d.ts +16 -0
  30. package/dist/cjs/bdx/PersistedFileDesignator.d.ts.map +1 -0
  31. package/dist/cjs/bdx/PersistedFileDesignator.js +57 -0
  32. package/dist/cjs/bdx/PersistedFileDesignator.js.map +6 -0
  33. package/dist/cjs/bdx/bdx-session-initiator.d.ts +14 -0
  34. package/dist/cjs/bdx/bdx-session-initiator.d.ts.map +1 -0
  35. package/dist/cjs/bdx/bdx-session-initiator.js +218 -0
  36. package/dist/cjs/bdx/bdx-session-initiator.js.map +6 -0
  37. package/dist/cjs/bdx/flow/DrivenSendingFlow.d.ts +15 -0
  38. package/dist/cjs/bdx/flow/DrivenSendingFlow.d.ts.map +1 -0
  39. package/dist/cjs/bdx/flow/DrivenSendingFlow.js +49 -0
  40. package/dist/cjs/bdx/flow/DrivenSendingFlow.js.map +6 -0
  41. package/dist/cjs/bdx/flow/DrivingReceivingFlow.d.ts +15 -0
  42. package/dist/cjs/bdx/flow/DrivingReceivingFlow.d.ts.map +1 -0
  43. package/dist/cjs/bdx/flow/DrivingReceivingFlow.js +47 -0
  44. package/dist/cjs/bdx/flow/DrivingReceivingFlow.js.map +6 -0
  45. package/dist/cjs/bdx/flow/Flow.d.ts +48 -0
  46. package/dist/cjs/bdx/flow/Flow.d.ts.map +1 -0
  47. package/dist/cjs/bdx/flow/Flow.js +112 -0
  48. package/dist/cjs/bdx/flow/Flow.js.map +6 -0
  49. package/dist/cjs/bdx/flow/FollowingReceivingFlow.d.ts +16 -0
  50. package/dist/cjs/bdx/flow/FollowingReceivingFlow.d.ts.map +1 -0
  51. package/dist/cjs/bdx/flow/FollowingReceivingFlow.js +60 -0
  52. package/dist/cjs/bdx/flow/FollowingReceivingFlow.js.map +6 -0
  53. package/dist/cjs/bdx/flow/FollowingSendingFlow.d.ts +15 -0
  54. package/dist/cjs/bdx/flow/FollowingSendingFlow.d.ts.map +1 -0
  55. package/dist/cjs/bdx/flow/FollowingSendingFlow.js +49 -0
  56. package/dist/cjs/bdx/flow/FollowingSendingFlow.js.map +6 -0
  57. package/dist/cjs/bdx/flow/InboundFlow.d.ts +26 -0
  58. package/dist/cjs/bdx/flow/InboundFlow.d.ts.map +1 -0
  59. package/dist/cjs/bdx/flow/InboundFlow.js +101 -0
  60. package/dist/cjs/bdx/flow/InboundFlow.js.map +6 -0
  61. package/dist/cjs/bdx/flow/OutboundFlow.d.ts +31 -0
  62. package/dist/cjs/bdx/flow/OutboundFlow.d.ts.map +1 -0
  63. package/dist/cjs/bdx/flow/OutboundFlow.js +124 -0
  64. package/dist/cjs/bdx/flow/OutboundFlow.js.map +6 -0
  65. package/dist/cjs/bdx/index.d.ts +16 -0
  66. package/dist/cjs/bdx/index.d.ts.map +1 -0
  67. package/dist/cjs/bdx/index.js +33 -0
  68. package/dist/cjs/bdx/index.js.map +6 -0
  69. package/dist/cjs/bdx/schema/BdxAcceptMessagesSchema.d.ts +50 -0
  70. package/dist/cjs/bdx/schema/BdxAcceptMessagesSchema.d.ts.map +1 -0
  71. package/dist/cjs/bdx/schema/BdxAcceptMessagesSchema.js +125 -0
  72. package/dist/cjs/bdx/schema/BdxAcceptMessagesSchema.js.map +6 -0
  73. package/dist/cjs/bdx/schema/BdxBlockMessagesSchema.d.ts +53 -0
  74. package/dist/cjs/bdx/schema/BdxBlockMessagesSchema.d.ts.map +1 -0
  75. package/dist/cjs/bdx/schema/BdxBlockMessagesSchema.js +92 -0
  76. package/dist/cjs/bdx/schema/BdxBlockMessagesSchema.js.map +6 -0
  77. package/dist/cjs/bdx/schema/BdxInitMessagesSchema.d.ts +117 -0
  78. package/dist/cjs/bdx/schema/BdxInitMessagesSchema.d.ts.map +1 -0
  79. package/dist/cjs/bdx/schema/BdxInitMessagesSchema.js +153 -0
  80. package/dist/cjs/bdx/schema/BdxInitMessagesSchema.js.map +6 -0
  81. package/dist/cjs/bdx/schema/BdxMessage.d.ts +23 -0
  82. package/dist/cjs/bdx/schema/BdxMessage.d.ts.map +1 -0
  83. package/dist/cjs/bdx/schema/BdxMessage.js +75 -0
  84. package/dist/cjs/bdx/schema/BdxMessage.js.map +6 -0
  85. package/dist/cjs/bdx/schema/BdxStatusMessageSchema.d.ts +12 -0
  86. package/dist/cjs/bdx/schema/BdxStatusMessageSchema.d.ts.map +1 -0
  87. package/dist/cjs/bdx/schema/BdxStatusMessageSchema.js +35 -0
  88. package/dist/cjs/bdx/schema/BdxStatusMessageSchema.js.map +6 -0
  89. package/dist/cjs/bdx/schema/index.d.ts +11 -0
  90. package/dist/cjs/bdx/schema/index.d.ts.map +1 -0
  91. package/dist/cjs/bdx/schema/index.js +28 -0
  92. package/dist/cjs/bdx/schema/index.js.map +6 -0
  93. package/dist/cjs/index.d.ts +1 -0
  94. package/dist/cjs/index.d.ts.map +1 -1
  95. package/dist/cjs/index.js +1 -0
  96. package/dist/cjs/index.js.map +1 -1
  97. package/dist/cjs/mdns/MdnsClient.js +2 -2
  98. package/dist/cjs/mdns/MdnsClient.js.map +1 -1
  99. package/dist/cjs/protocol/ExchangeManager.d.ts.map +1 -1
  100. package/dist/cjs/protocol/ExchangeManager.js +4 -2
  101. package/dist/cjs/protocol/ExchangeManager.js.map +1 -1
  102. package/dist/cjs/protocol/MessageExchange.d.ts +2 -0
  103. package/dist/cjs/protocol/MessageExchange.d.ts.map +1 -1
  104. package/dist/cjs/protocol/MessageExchange.js +14 -8
  105. package/dist/cjs/protocol/MessageExchange.js.map +2 -2
  106. package/dist/cjs/protocol/ProtocolStatusMessage.d.ts +1 -1
  107. package/dist/cjs/protocol/ProtocolStatusMessage.d.ts.map +1 -1
  108. package/dist/cjs/protocol/ProtocolStatusMessage.js.map +1 -1
  109. package/dist/esm/bdx/BdxClient.d.ts +31 -0
  110. package/dist/esm/bdx/BdxClient.d.ts.map +1 -0
  111. package/dist/esm/bdx/BdxClient.js +37 -0
  112. package/dist/esm/bdx/BdxClient.js.map +6 -0
  113. package/dist/esm/bdx/BdxError.d.ts +21 -0
  114. package/dist/esm/bdx/BdxError.d.ts.map +1 -0
  115. package/dist/esm/bdx/BdxError.js +34 -0
  116. package/dist/esm/bdx/BdxError.js.map +6 -0
  117. package/dist/esm/bdx/BdxMessenger.d.ts +77 -0
  118. package/dist/esm/bdx/BdxMessenger.d.ts.map +1 -0
  119. package/dist/esm/bdx/BdxMessenger.js +233 -0
  120. package/dist/esm/bdx/BdxMessenger.js.map +6 -0
  121. package/dist/esm/bdx/BdxProtocol.d.ts +25 -0
  122. package/dist/esm/bdx/BdxProtocol.d.ts.map +1 -0
  123. package/dist/esm/bdx/BdxProtocol.js +82 -0
  124. package/dist/esm/bdx/BdxProtocol.js.map +6 -0
  125. package/dist/esm/bdx/BdxSession.d.ts +36 -0
  126. package/dist/esm/bdx/BdxSession.d.ts.map +1 -0
  127. package/dist/esm/bdx/BdxSession.js +133 -0
  128. package/dist/esm/bdx/BdxSession.js.map +6 -0
  129. package/dist/esm/bdx/BdxSessionConfiguration.d.ts +61 -0
  130. package/dist/esm/bdx/BdxSessionConfiguration.d.ts.map +1 -0
  131. package/dist/esm/bdx/BdxSessionConfiguration.js +75 -0
  132. package/dist/esm/bdx/BdxSessionConfiguration.js.map +6 -0
  133. package/dist/esm/bdx/FileDesignator.d.ts +21 -0
  134. package/dist/esm/bdx/FileDesignator.d.ts.map +1 -0
  135. package/dist/esm/bdx/FileDesignator.js +42 -0
  136. package/dist/esm/bdx/FileDesignator.js.map +6 -0
  137. package/dist/esm/bdx/PersistedFileDesignator.d.ts +16 -0
  138. package/dist/esm/bdx/PersistedFileDesignator.d.ts.map +1 -0
  139. package/dist/esm/bdx/PersistedFileDesignator.js +37 -0
  140. package/dist/esm/bdx/PersistedFileDesignator.js.map +6 -0
  141. package/dist/esm/bdx/bdx-session-initiator.d.ts +14 -0
  142. package/dist/esm/bdx/bdx-session-initiator.d.ts.map +1 -0
  143. package/dist/esm/bdx/bdx-session-initiator.js +198 -0
  144. package/dist/esm/bdx/bdx-session-initiator.js.map +6 -0
  145. package/dist/esm/bdx/flow/DrivenSendingFlow.d.ts +15 -0
  146. package/dist/esm/bdx/flow/DrivenSendingFlow.d.ts.map +1 -0
  147. package/dist/esm/bdx/flow/DrivenSendingFlow.js +29 -0
  148. package/dist/esm/bdx/flow/DrivenSendingFlow.js.map +6 -0
  149. package/dist/esm/bdx/flow/DrivingReceivingFlow.d.ts +15 -0
  150. package/dist/esm/bdx/flow/DrivingReceivingFlow.d.ts.map +1 -0
  151. package/dist/esm/bdx/flow/DrivingReceivingFlow.js +27 -0
  152. package/dist/esm/bdx/flow/DrivingReceivingFlow.js.map +6 -0
  153. package/dist/esm/bdx/flow/Flow.d.ts +48 -0
  154. package/dist/esm/bdx/flow/Flow.d.ts.map +1 -0
  155. package/dist/esm/bdx/flow/Flow.js +92 -0
  156. package/dist/esm/bdx/flow/Flow.js.map +6 -0
  157. package/dist/esm/bdx/flow/FollowingReceivingFlow.d.ts +16 -0
  158. package/dist/esm/bdx/flow/FollowingReceivingFlow.d.ts.map +1 -0
  159. package/dist/esm/bdx/flow/FollowingReceivingFlow.js +40 -0
  160. package/dist/esm/bdx/flow/FollowingReceivingFlow.js.map +6 -0
  161. package/dist/esm/bdx/flow/FollowingSendingFlow.d.ts +15 -0
  162. package/dist/esm/bdx/flow/FollowingSendingFlow.d.ts.map +1 -0
  163. package/dist/esm/bdx/flow/FollowingSendingFlow.js +29 -0
  164. package/dist/esm/bdx/flow/FollowingSendingFlow.js.map +6 -0
  165. package/dist/esm/bdx/flow/InboundFlow.d.ts +26 -0
  166. package/dist/esm/bdx/flow/InboundFlow.d.ts.map +1 -0
  167. package/dist/esm/bdx/flow/InboundFlow.js +81 -0
  168. package/dist/esm/bdx/flow/InboundFlow.js.map +6 -0
  169. package/dist/esm/bdx/flow/OutboundFlow.d.ts +31 -0
  170. package/dist/esm/bdx/flow/OutboundFlow.d.ts.map +1 -0
  171. package/dist/esm/bdx/flow/OutboundFlow.js +104 -0
  172. package/dist/esm/bdx/flow/OutboundFlow.js.map +6 -0
  173. package/dist/esm/bdx/index.d.ts +16 -0
  174. package/dist/esm/bdx/index.d.ts.map +1 -0
  175. package/dist/esm/bdx/index.js +16 -0
  176. package/dist/esm/bdx/index.js.map +6 -0
  177. package/dist/esm/bdx/schema/BdxAcceptMessagesSchema.d.ts +50 -0
  178. package/dist/esm/bdx/schema/BdxAcceptMessagesSchema.d.ts.map +1 -0
  179. package/dist/esm/bdx/schema/BdxAcceptMessagesSchema.js +109 -0
  180. package/dist/esm/bdx/schema/BdxAcceptMessagesSchema.js.map +6 -0
  181. package/dist/esm/bdx/schema/BdxBlockMessagesSchema.d.ts +53 -0
  182. package/dist/esm/bdx/schema/BdxBlockMessagesSchema.d.ts.map +1 -0
  183. package/dist/esm/bdx/schema/BdxBlockMessagesSchema.js +72 -0
  184. package/dist/esm/bdx/schema/BdxBlockMessagesSchema.js.map +6 -0
  185. package/dist/esm/bdx/schema/BdxInitMessagesSchema.d.ts +117 -0
  186. package/dist/esm/bdx/schema/BdxInitMessagesSchema.d.ts.map +1 -0
  187. package/dist/esm/bdx/schema/BdxInitMessagesSchema.js +133 -0
  188. package/dist/esm/bdx/schema/BdxInitMessagesSchema.js.map +6 -0
  189. package/dist/esm/bdx/schema/BdxMessage.d.ts +23 -0
  190. package/dist/esm/bdx/schema/BdxMessage.d.ts.map +1 -0
  191. package/dist/esm/bdx/schema/BdxMessage.js +62 -0
  192. package/dist/esm/bdx/schema/BdxMessage.js.map +6 -0
  193. package/dist/esm/bdx/schema/BdxStatusMessageSchema.d.ts +12 -0
  194. package/dist/esm/bdx/schema/BdxStatusMessageSchema.d.ts.map +1 -0
  195. package/dist/esm/bdx/schema/BdxStatusMessageSchema.js +15 -0
  196. package/dist/esm/bdx/schema/BdxStatusMessageSchema.js.map +6 -0
  197. package/dist/esm/bdx/schema/index.d.ts +11 -0
  198. package/dist/esm/bdx/schema/index.d.ts.map +1 -0
  199. package/dist/esm/bdx/schema/index.js +11 -0
  200. package/dist/esm/bdx/schema/index.js.map +6 -0
  201. package/dist/esm/index.d.ts +1 -0
  202. package/dist/esm/index.d.ts.map +1 -1
  203. package/dist/esm/index.js +1 -0
  204. package/dist/esm/index.js.map +1 -1
  205. package/dist/esm/mdns/MdnsClient.js +2 -2
  206. package/dist/esm/mdns/MdnsClient.js.map +1 -1
  207. package/dist/esm/protocol/ExchangeManager.d.ts.map +1 -1
  208. package/dist/esm/protocol/ExchangeManager.js +4 -2
  209. package/dist/esm/protocol/ExchangeManager.js.map +1 -1
  210. package/dist/esm/protocol/MessageExchange.d.ts +2 -0
  211. package/dist/esm/protocol/MessageExchange.d.ts.map +1 -1
  212. package/dist/esm/protocol/MessageExchange.js +14 -8
  213. package/dist/esm/protocol/MessageExchange.js.map +2 -2
  214. package/dist/esm/protocol/ProtocolStatusMessage.d.ts +1 -1
  215. package/dist/esm/protocol/ProtocolStatusMessage.d.ts.map +1 -1
  216. package/dist/esm/protocol/ProtocolStatusMessage.js.map +1 -1
  217. package/package.json +6 -6
  218. package/src/bdx/BdxClient.ts +47 -0
  219. package/src/bdx/BdxError.ts +39 -0
  220. package/src/bdx/BdxMessenger.ts +291 -0
  221. package/src/bdx/BdxProtocol.ts +93 -0
  222. package/src/bdx/BdxSession.ts +174 -0
  223. package/src/bdx/BdxSessionConfiguration.ts +134 -0
  224. package/src/bdx/FileDesignator.ts +49 -0
  225. package/src/bdx/PersistedFileDesignator.ts +40 -0
  226. package/src/bdx/bdx-session-initiator.ts +246 -0
  227. package/src/bdx/flow/DrivenSendingFlow.ts +40 -0
  228. package/src/bdx/flow/DrivingReceivingFlow.ts +39 -0
  229. package/src/bdx/flow/Flow.ts +124 -0
  230. package/src/bdx/flow/FollowingReceivingFlow.ts +53 -0
  231. package/src/bdx/flow/FollowingSendingFlow.ts +38 -0
  232. package/src/bdx/flow/InboundFlow.ts +104 -0
  233. package/src/bdx/flow/OutboundFlow.ts +124 -0
  234. package/src/bdx/index.ts +16 -0
  235. package/src/bdx/schema/BdxAcceptMessagesSchema.ts +159 -0
  236. package/src/bdx/schema/BdxBlockMessagesSchema.ts +99 -0
  237. package/src/bdx/schema/BdxInitMessagesSchema.ts +213 -0
  238. package/src/bdx/schema/BdxMessage.ts +70 -0
  239. package/src/bdx/schema/BdxStatusMessageSchema.ts +14 -0
  240. package/src/bdx/schema/index.ts +11 -0
  241. package/src/index.ts +1 -0
  242. package/src/mdns/MdnsClient.ts +2 -2
  243. package/src/protocol/ExchangeManager.ts +2 -0
  244. package/src/protocol/MessageExchange.ts +17 -6
  245. 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
@@ -6,6 +6,7 @@
6
6
 
7
7
  export * from "./action/index.js";
8
8
  export * from "./advertisement/index.js";
9
+ export * from "./bdx/index.js";
9
10
  export * from "./ble/index.js";
10
11
  export * from "./certificate/index.js";
11
12
  export * from "./cluster/index.js";
@@ -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 (isNaN(intValue)) continue;
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 (isNaN(intValue)) continue;
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), { includeAcknowledgeMessageId: messageId });
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
- if (messageType === SecureMessageType.StandaloneAck) {
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 && messageType !== SecureMessageType.StandaloneAck)
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 && messageType !== SecureMessageType.StandaloneAck),
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, Bytes> {
18
+ export abstract class ProtocolStatusMessageSchema<T extends ProtocolStatusMessage<any>> extends Schema<T> {
19
19
  #protocolId: number;
20
20
  #vendorId: number;
21
21
  #protocolSpecificDataAllowed: boolean;