@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,291 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2022-2025 Matter.js Authors
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+
7
+ import { Message } from "#codec/MessageCodec.js";
8
+ import {
9
+ Bytes,
10
+ Diagnostic,
11
+ Duration,
12
+ ImplementationError,
13
+ InternalError,
14
+ Logger,
15
+ Minutes,
16
+ UnexpectedDataError,
17
+ } from "#general";
18
+ import { MessageExchange } from "#protocol/MessageExchange.js";
19
+ import { BdxMessageType, BdxStatusCode, GeneralStatusCode, SecureMessageType } from "#types";
20
+ import { BdxError, BdxStatusResponseError } from "./BdxError.js";
21
+ import { BdxReceiveAccept, BdxSendAccept } from "./schema/BdxAcceptMessagesSchema.js";
22
+ import {
23
+ BdxBlock,
24
+ BdxBlockAck,
25
+ BdxBlockAckEof,
26
+ BdxBlockEof,
27
+ BdxBlockQuery,
28
+ BdxBlockQueryWithSkip,
29
+ } from "./schema/BdxBlockMessagesSchema.js";
30
+ import { BdxInit } from "./schema/BdxInitMessagesSchema.js";
31
+ import { BdxMessage } from "./schema/BdxMessage.js";
32
+ import { BdxStatusMessage } from "./schema/BdxStatusMessageSchema.js";
33
+
34
+ const logger = Logger.get("BdxMessenger");
35
+
36
+ export const BDX_TRANSFER_IDLE_TIMEOUT = Minutes(5); // Minimum time according to Matter spec
37
+
38
+ /** Messenger class that contains all Bdx Messages */
39
+ export class BdxMessenger {
40
+ #exchange: MessageExchange;
41
+ #messageTimeout: Duration;
42
+
43
+ /**
44
+ * Creates a new BdxMessenger instance.
45
+ * @param exchange Exchange to use for the messaging
46
+ * @param messageTimeout Communication Timeout for the Bdx Messages, defaults to 5 minutes as defined for Matter OTA transfers
47
+ */
48
+ constructor(exchange: MessageExchange, messageTimeout = BDX_TRANSFER_IDLE_TIMEOUT) {
49
+ if (!exchange.channel.isReliable) {
50
+ throw new ImplementationError("Bdx Protocol requires a reliable channel for message exchange");
51
+ }
52
+ this.#messageTimeout = messageTimeout;
53
+ this.#exchange = exchange;
54
+ }
55
+
56
+ get channel() {
57
+ return this.#exchange.channel;
58
+ }
59
+
60
+ get exchange() {
61
+ return this.#exchange;
62
+ }
63
+
64
+ get maxPayloadSize() {
65
+ return this.#exchange.maxPayloadSize;
66
+ }
67
+
68
+ /**
69
+ * Waits for the next message and returns it.
70
+ * A List of allowed expected message types can be provided.
71
+ * If the message type is not in the list, an error will be thrown.
72
+ */
73
+ async nextMessage(
74
+ expectedMessageTypes: BdxMessageType[],
75
+ timeout = this.#messageTimeout,
76
+ expectedMessageInfo?: string,
77
+ ): Promise<BdxMessage<any>> {
78
+ logger.debug(
79
+ `Waiting for Bdx ${expectedMessageTypes.map(t => BdxMessageType[t]).join("/")} message with timeout ${timeout}ms`,
80
+ );
81
+
82
+ const message = await this.exchange.nextMessage({ timeout });
83
+ const messageType = message.payloadHeader.messageType as BdxMessageType;
84
+ if (expectedMessageInfo === undefined) {
85
+ expectedMessageInfo = expectedMessageTypes.map(t => `${t} (${BdxMessageType[t]})`).join(",");
86
+ }
87
+ this.throwIfErrorStatusReport(message, expectedMessageInfo);
88
+ if (!expectedMessageTypes.includes(messageType))
89
+ throw new UnexpectedDataError(
90
+ `Received unexpected message type: ${BdxMessageType[messageType] ?? "unknown"}#${messageType}, expected: ${expectedMessageInfo}`,
91
+ );
92
+
93
+ logger.debug(
94
+ `Received Bdx ${BdxMessageType[messageType]}${message.payload.byteLength > 0 ? ` with ${message.payload.byteLength}bytes` : ""}`,
95
+ message,
96
+ );
97
+ return BdxMessage.decode(messageType, message.payload);
98
+ }
99
+
100
+ async send(bdxMessage: BdxMessage<any>) {
101
+ const { kind: messageType, message } = bdxMessage;
102
+ logger.debug(
103
+ `Sending Bdx ${BdxMessageType[messageType]}${"data" in message && Bytes.isBytes(message.data) ? ` with ${message.data.byteLength}bytes` : ""}`,
104
+ message,
105
+ );
106
+ await this.exchange.send(messageType, BdxMessage.encode(bdxMessage));
107
+ }
108
+
109
+ /** Sends a Bdx SendInit message and waits for the SendAccept message as a response and returns it decoded. */
110
+ async sendSendInit(message: BdxInit): Promise<BdxSendAccept> {
111
+ await this.send({ kind: BdxMessageType.SendInit, message });
112
+
113
+ const response = await this.nextMessage([BdxMessageType.SendAccept]);
114
+ BdxMessage.assert(response, BdxMessageType.SendAccept);
115
+ return response.message;
116
+ }
117
+
118
+ /** Sends a ReceiveInit message and waits for the ReceiveAccept message as a response and returns it decoded. */
119
+ async sendReceiveInit(message: BdxInit): Promise<BdxReceiveAccept> {
120
+ await this.send({ kind: BdxMessageType.ReceiveInit, message });
121
+
122
+ const response = await this.nextMessage([BdxMessageType.ReceiveAccept]);
123
+ BdxMessage.assert(response, BdxMessageType.ReceiveAccept);
124
+ return response.message;
125
+ }
126
+
127
+ /** Encodes and sends a Bdx SendAccept message. */
128
+ async sendSendAccept(message: BdxSendAccept) {
129
+ await this.send({ kind: BdxMessageType.SendAccept, message });
130
+ }
131
+
132
+ /** Encodes and sends a Bdx ReceiveAccept message. */
133
+ async sendReceiveAccept(message: BdxReceiveAccept) {
134
+ await this.send({ kind: BdxMessageType.ReceiveAccept, message });
135
+ }
136
+
137
+ /** Encodes and sends a Bdx Block message. */
138
+ async sendBlock(message: BdxBlock) {
139
+ await this.send({ kind: BdxMessageType.Block, message });
140
+ }
141
+
142
+ /** Encodes and sends a Bdx BlockQuery message. */
143
+ async sendBlockQuery(message: BdxBlockQuery) {
144
+ await this.send({ kind: BdxMessageType.BlockQuery, message });
145
+ }
146
+
147
+ /** Encodes and sends a Bdx BlockQueryWithSkip message. */
148
+ async sendBlockQueryWithSkip(message: BdxBlockQueryWithSkip) {
149
+ await this.send({ kind: BdxMessageType.BlockQueryWithSkip, message });
150
+ }
151
+
152
+ /** Encodes and sends a Bdx BlockEof message. */
153
+ async sendBlockEof(message: BdxBlockEof) {
154
+ await this.send({ kind: BdxMessageType.BlockEof, message });
155
+ }
156
+
157
+ /** Encodes and sends a Bdx BlockAck message. */
158
+ async sendBlockAck(message: BdxBlockAck) {
159
+ await this.send({ kind: BdxMessageType.BlockAck, message });
160
+ }
161
+
162
+ /** Encodes and sends a Bdx BlockAckEof message */
163
+ async sendBlockAckEof(message: BdxBlockAckEof) {
164
+ await this.send({ kind: BdxMessageType.BlockAckEof, message });
165
+ }
166
+
167
+ /** Read the next Block message, accepts Block and BlockEof messages. Returns the decoded message and it's type. */
168
+ async readBlock(): Promise<BdxMessage<BdxMessageType.Block | BdxMessageType.BlockEof>> {
169
+ const block = await this.nextMessage([BdxMessageType.Block, BdxMessageType.BlockEof]);
170
+ if (BdxMessage.is(block, BdxMessageType.Block) && block.message.data.byteLength === 0) {
171
+ // a Block message must not have empty data
172
+ throw new BdxError("Received empty data in Block message", BdxStatusCode.BadMessageContent);
173
+ }
174
+ return block;
175
+ }
176
+
177
+ /**
178
+ * Read the next BlockQuery message, accepts BlockQuery and BlockQueryWithSkip and BlockAck messages.
179
+ * When a BlockAck is received, it will be validated and the next BlockQuery message will be read.
180
+ * Returns the decoded message and it's type.
181
+ */
182
+ async readBlockQuery(): Promise<BdxMessage<BdxMessageType.BlockQuery | BdxMessageType.BlockQueryWithSkip>> {
183
+ let response = await this.nextMessage([
184
+ BdxMessageType.BlockQuery,
185
+ BdxMessageType.BlockQueryWithSkip,
186
+ BdxMessageType.BlockAck,
187
+ ]);
188
+ let expectedBlockMessageCounter: number | undefined = undefined;
189
+ if (BdxMessage.is(response, BdxMessageType.BlockAck)) {
190
+ expectedBlockMessageCounter = (response.message.blockCounter + 1) % 0x100000000; // wrap around at 2^32
191
+ response = await this.nextMessage([BdxMessageType.BlockQuery, BdxMessageType.BlockQueryWithSkip]);
192
+ }
193
+
194
+ // Ensure that if we got an Ack Message that the blockCounter is as expected because this cannot be done outside
195
+ if (
196
+ expectedBlockMessageCounter !== undefined &&
197
+ response.message.blockCounter !== expectedBlockMessageCounter
198
+ ) {
199
+ throw new BdxError(
200
+ `Received BlockQuery with unexpected block counter: ${response.message.blockCounter}, expected: ${expectedBlockMessageCounter}`,
201
+ BdxStatusCode.BadBlockCounter,
202
+ );
203
+ }
204
+
205
+ return response;
206
+ }
207
+
208
+ /** Reads the next BlockAckEof message and returns the decoded message. */
209
+ async readBlockAckEof(): Promise<BdxBlockAckEof> {
210
+ const response = await this.nextMessage([BdxMessageType.BlockAckEof]);
211
+ BdxMessage.assert(response, BdxMessageType.BlockAckEof);
212
+ return response.message;
213
+ }
214
+
215
+ /** Reads the next BlockAck message and returns the decoded message. */
216
+ async readBlockAck(): Promise<BdxBlockAck> {
217
+ const response = await this.nextMessage([BdxMessageType.BlockAck]);
218
+ BdxMessage.assert(response, BdxMessageType.BlockAck);
219
+ return response.message;
220
+ }
221
+
222
+ /** Sends a Bdx Error StatusReport message with the given protocol status. */
223
+ sendError(code: BdxStatusCode) {
224
+ return this.#sendStatusReport(GeneralStatusCode.Failure, code);
225
+ }
226
+
227
+ /** Encodes and sends a Bdx StatusReport message with the given general and protocol status. */
228
+ async #sendStatusReport(generalStatus: GeneralStatusCode, protocolStatus: BdxStatusCode, requiresAck?: boolean) {
229
+ await this.#exchange.send(
230
+ SecureMessageType.StatusReport,
231
+ BdxStatusMessage.encode({
232
+ generalStatus,
233
+ protocolStatus,
234
+ }),
235
+ {
236
+ requiresAck,
237
+ logContext: {
238
+ generalStatus: GeneralStatusCode[generalStatus] ?? Diagnostic.hex(generalStatus),
239
+ protocolStatus: BdxStatusCode[protocolStatus] ?? Diagnostic.hex(protocolStatus),
240
+ },
241
+ },
242
+ );
243
+ }
244
+
245
+ protected throwIfErrorStatusReport(message: Message, logHint?: string) {
246
+ const {
247
+ payloadHeader: { messageType },
248
+ payload,
249
+ } = message;
250
+ if (messageType !== SecureMessageType.StatusReport) return;
251
+
252
+ const { generalStatus, protocolId, protocolStatus } = BdxStatusMessage.decode(payload);
253
+ if (generalStatus !== GeneralStatusCode.Success) {
254
+ throw new BdxStatusResponseError(
255
+ `Received general error status for protocol ${protocolId}${logHint ? ` (${logHint})` : ""}`,
256
+ generalStatus,
257
+ protocolStatus,
258
+ );
259
+ }
260
+ if (protocolStatus !== BdxStatusCode.Success) {
261
+ throw new BdxStatusResponseError(
262
+ `Received general success status, but protocol status is not Success${logHint ? ` (${logHint})` : ""}`,
263
+ generalStatus,
264
+ protocolStatus,
265
+ );
266
+ }
267
+ }
268
+
269
+ close() {
270
+ return this.#exchange.close();
271
+ }
272
+
273
+ /**
274
+ * Ensure that the value is a safe JavaScript "number" type and that it is not too large. Matter spec allows also
275
+ * 64bit values, but they make little sense for now, so make sure we handle them as too large. MAX_SAFE_INTEGER is
276
+ * 2^53-1 and is enough for now.
277
+ */
278
+ static asSafeNumber(
279
+ value: number | bigint | undefined,
280
+ context = "",
281
+ bdxErrorCode = BdxStatusCode.Unknown,
282
+ ): number {
283
+ if (typeof value !== "number" && typeof value !== "bigint") {
284
+ throw new InternalError(`${context} ${value} is not a number`); // Should not happen
285
+ }
286
+ if (value > Number.MAX_SAFE_INTEGER) {
287
+ throw new BdxError(`${context} ${value} exceeds maximum safe integer value`, bdxErrorCode);
288
+ }
289
+ return Number(value);
290
+ }
291
+ }
@@ -0,0 +1,93 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2022-2025 Matter.js Authors
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+
7
+ import { Logger, MatterError, StorageContext } from "#general";
8
+ import { MessageExchange } from "#protocol/MessageExchange.js";
9
+ import { ProtocolHandler } from "#protocol/ProtocolHandler.js";
10
+ import { BDX_PROTOCOL_ID, BdxMessageType, BdxStatusCode } from "#types";
11
+ import { Message } from "../codec/MessageCodec.js";
12
+ import { BdxMessenger } from "./BdxMessenger.js";
13
+ import { BdxSession } from "./BdxSession.js";
14
+ import { BdxSessionConfiguration } from "./BdxSessionConfiguration.js";
15
+ import { BdxInitMessageSchema } from "./schema/BdxInitMessagesSchema.js";
16
+
17
+ const logger = Logger.get("BdxProtocol");
18
+
19
+ /** BDX protocol handler. */
20
+ export class BdxProtocol implements ProtocolHandler {
21
+ readonly id = BDX_PROTOCOL_ID;
22
+ readonly requiresSecureSession = true;
23
+ readonly #activeBdxSessions = new Map<MessageExchange, BdxSession>();
24
+ #storage: StorageContext;
25
+ #bdxLimits?: BdxSessionConfiguration.Config;
26
+
27
+ /**
28
+ * Create a new BDX protocol handler.
29
+ * @param storage StorageContext to read or write files from/to.
30
+ * @param options BDX options/limits to use for this session. us this to control how the transfer should behave.
31
+ */
32
+ constructor(storage: StorageContext, options?: BdxSessionConfiguration.Config) {
33
+ this.#storage = storage;
34
+ this.#bdxLimits = options;
35
+ }
36
+
37
+ async onNewExchange(exchange: MessageExchange, message: Message) {
38
+ const initMessageType = message.payloadHeader.messageType;
39
+ const messenger = new BdxMessenger(exchange);
40
+
41
+ switch (initMessageType) {
42
+ case BdxMessageType.SendInit:
43
+ case BdxMessageType.ReceiveInit:
44
+ logger.debug(
45
+ `Initialize Session for ${BdxMessageType[initMessageType]} message on BDX protocol for exchange ${exchange.id}`,
46
+ );
47
+ const { payload } = message;
48
+ const bdxSession = BdxSession.fromMessage(this.#storage, messenger, {
49
+ initMessageType,
50
+ initMessage: new BdxInitMessageSchema().decode(payload),
51
+ ...this.#bdxLimits,
52
+ });
53
+ await this.#registerSession(messenger, bdxSession);
54
+
55
+ try {
56
+ await bdxSession.processTransfer();
57
+ } catch (error) {
58
+ logger.error(`Error processing BDX transfer:`, error);
59
+ }
60
+
61
+ break;
62
+ default:
63
+ logger.warn(
64
+ `Unexpected BDX message type ${BdxMessageType[initMessageType]} on new exchange ${exchange.id}`,
65
+ );
66
+ await messenger.sendError(BdxStatusCode.UnexpectedMessage);
67
+ }
68
+ }
69
+
70
+ /** Make sure only one BDX session can be active per exchange and that the exchange is closed with the BDX session. */
71
+ async #registerSession(messenger: BdxMessenger, bdxSession: BdxSession) {
72
+ const exchange = messenger.exchange;
73
+ if (this.#activeBdxSessions.has(exchange)) {
74
+ logger.warn(`BDX session for exchange ${exchange.id} already exists, sending error`);
75
+ await messenger.sendError(BdxStatusCode.UnexpectedMessage);
76
+ return;
77
+ }
78
+ this.#activeBdxSessions.set(exchange, bdxSession);
79
+ bdxSession.closed.on(async () => {
80
+ logger.debug(`BDX session for exchange ${exchange.id} closed`);
81
+ this.#activeBdxSessions.delete(exchange);
82
+ await exchange.close();
83
+ });
84
+ }
85
+
86
+ async close() {
87
+ logger.debug(`Closing BDX protocol handler with ${this.#activeBdxSessions.size} active sessions`);
88
+ for (const session of this.#activeBdxSessions.values()) {
89
+ await session.close(new MatterError("BDX protocol handler closed"));
90
+ }
91
+ this.#activeBdxSessions.clear();
92
+ }
93
+ }
@@ -0,0 +1,174 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2022-2025 Matter.js Authors
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+
7
+ import { AsyncObservable, ClassExtends, Diagnostic, Logger, StorageContext } from "#general";
8
+ import { BdxMessageType, BdxStatusCode } from "#types";
9
+ import { bdxSessionInitiator } from "./bdx-session-initiator.js";
10
+ import { BdxError } from "./BdxError.js";
11
+ import { BdxMessenger } from "./BdxMessenger.js";
12
+ import { BdxSessionConfiguration } from "./BdxSessionConfiguration.js";
13
+ import { DrivenSendingFlow } from "./flow/DrivenSendingFlow.js";
14
+ import { DrivingReceivingFlow } from "./flow/DrivingReceivingFlow.js";
15
+ import { Flow } from "./flow/Flow.js";
16
+ import { FollowingReceivingFlow } from "./flow/FollowingReceivingFlow.js";
17
+ import { FollowingSendingFlow } from "./flow/FollowingSendingFlow.js";
18
+ import { PersistedFileDesignator } from "./PersistedFileDesignator.js";
19
+
20
+ const logger = Logger.get("BdxSession");
21
+
22
+ /**
23
+ * Class to manage one BDX session.
24
+ *
25
+ * Matter BDX protocol is used to transfer files between devices.
26
+ *
27
+ * Notes:
28
+ * * Even though Matter allows 64bit values for size and offset, we do not use them, as they make no sense for now.
29
+ * We support up to MAX_SAFE_INTEGER for size and offset (which basically is 2^53 - 1 and so far enough for us).
30
+ * * We support partial transfers (startOffset or shorter dataLength) only when we act as the sender. As a receiver,
31
+ * only full transfers are supported.
32
+ * * We do not use BlockQueryWithSkip when requesting data ourselves
33
+ */
34
+ export class BdxSession {
35
+ #messenger: BdxMessenger;
36
+ #started = false;
37
+ #closed = AsyncObservable();
38
+ #isClosed = false;
39
+
40
+ #config: BdxSessionConfiguration;
41
+
42
+ #transferFlow?: Flow;
43
+
44
+ /** Initializes a BdxSession as a sender, means that we upload data to the peer. */
45
+ static asSender(messenger: BdxMessenger, options: BdxSessionConfiguration.SenderInitiatorOptions): BdxSession {
46
+ return new BdxSession(messenger, { isSender: true, ...options });
47
+ }
48
+
49
+ /** Initializes a BdxSession as a receiver, means that we download data from the peer. */
50
+ static asReceiver(messenger: BdxMessenger, options: BdxSessionConfiguration.InitiatorOptions): BdxSession {
51
+ return new BdxSession(messenger, { isSender: false, ...options });
52
+ }
53
+
54
+ /** Initializes a BdxSession from an incoming *Init message. The message determines the direction of the transfer. */
55
+ static fromMessage(
56
+ storage: StorageContext,
57
+ messenger: BdxMessenger,
58
+ options: BdxSessionConfiguration.ReceiverOptions,
59
+ ): BdxSession {
60
+ const { initMessageType, initMessage } = options;
61
+ if (initMessageType !== BdxMessageType.SendInit && initMessageType !== BdxMessageType.ReceiveInit) {
62
+ throw new BdxError(
63
+ `Invalid message type for BDX session initialization: ${BdxMessageType[initMessageType]} (${initMessageType})`,
64
+ BdxStatusCode.UnexpectedMessage,
65
+ );
66
+ }
67
+
68
+ const { fileDesignator } = initMessage;
69
+
70
+ return new BdxSession(messenger, {
71
+ isSender: initMessageType === BdxMessageType.ReceiveInit,
72
+ fileDesignator: new PersistedFileDesignator(fileDesignator, storage),
73
+ ...options,
74
+ });
75
+ }
76
+
77
+ private constructor(messenger: BdxMessenger, options: BdxSessionConfiguration.Options) {
78
+ this.#messenger = messenger;
79
+
80
+ this.#config = new BdxSessionConfiguration(options);
81
+
82
+ const exchange = messenger.exchange;
83
+ if (!exchange.channel.isReliable) {
84
+ throw new BdxError("Bdx Protocol requires a reliable channel for message exchange");
85
+ }
86
+ exchange.closed.on(async () => {
87
+ logger.debug(`Closing BDX session for exchange ${exchange.id}`);
88
+ await this.close();
89
+ });
90
+ }
91
+
92
+ /** Method called to start the session. It will end with a successful Transfer or with an error */
93
+ async processTransfer() {
94
+ if (this.#started) {
95
+ throw new BdxError("BDX session already started", BdxStatusCode.UnexpectedMessage);
96
+ }
97
+ if (this.#isClosed) {
98
+ throw new BdxError("BDX session already closed", BdxStatusCode.UnexpectedMessage);
99
+ }
100
+
101
+ const { isSender, isInitiator, fileDesignator } = this.#config;
102
+ logger.info(
103
+ `Starting BDX session`,
104
+ Diagnostic.dict({
105
+ exId: this.#messenger.exchange.id,
106
+ isSender,
107
+ isInitiator,
108
+ blobName: fileDesignator?.text,
109
+ }),
110
+ );
111
+
112
+ this.#started = true;
113
+ try {
114
+ this.#transferFlow = this.#initializeFlow(await bdxSessionInitiator(this.#messenger, this.#config));
115
+
116
+ await this.#transferFlow.processTransfer();
117
+
118
+ await this.close();
119
+ } catch (error) {
120
+ BdxError.accept(error);
121
+ await this.#messenger.sendError(error.code);
122
+
123
+ logger.warn(`BDX session failed with error:`, error);
124
+
125
+ await this.close(error);
126
+ throw error;
127
+ }
128
+ }
129
+
130
+ #initializeFlow(transferParameters: Flow.TransferOptions): Flow {
131
+ const { transferMode, asynchronousTransfer, dataLength, isDriver, fileDesignator } = transferParameters;
132
+ const isSenderDrive = transferMode === Flow.DriverMode.SenderDrive;
133
+
134
+ const role = `${isSenderDrive ? `${asynchronousTransfer ? "async " : ""}sending` : "receiving"} ${isDriver ? "driver" : "follower"}`;
135
+ logger.debug(
136
+ `Starting transfer flow as ${role}`,
137
+ Diagnostic.dict({
138
+ exId: this.#messenger.exchange.id,
139
+ dataLength,
140
+ blobName: fileDesignator.text,
141
+ }),
142
+ );
143
+
144
+ let FlowImpl: ClassExtends<Flow>;
145
+ if (isDriver) {
146
+ if (isSenderDrive || asynchronousTransfer) {
147
+ FlowImpl = DrivenSendingFlow;
148
+ } else {
149
+ FlowImpl = DrivingReceivingFlow;
150
+ }
151
+ } else if (isSenderDrive || asynchronousTransfer) {
152
+ FlowImpl = FollowingSendingFlow;
153
+ } else {
154
+ FlowImpl = FollowingReceivingFlow;
155
+ }
156
+
157
+ return new FlowImpl(this.#messenger, transferParameters);
158
+ }
159
+
160
+ get closed() {
161
+ return this.#closed;
162
+ }
163
+
164
+ async close(error?: unknown) {
165
+ if (this.#isClosed) {
166
+ return;
167
+ }
168
+ this.#isClosed = true;
169
+ await this.#transferFlow?.close(error);
170
+ await this.#closed.emit();
171
+ }
172
+ }
173
+
174
+ export namespace BdxSession {}
@@ -0,0 +1,134 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2022-2025 Matter.js Authors
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+
7
+ import { ImplementationError } from "#general";
8
+ import { BdxMessageType } from "#types";
9
+ import { Flow } from "./flow/Flow.js";
10
+ import { PersistedFileDesignator } from "./PersistedFileDesignator.js";
11
+ import { BdxInit } from "./schema/BdxInitMessagesSchema.js";
12
+
13
+ export class BdxSessionConfiguration {
14
+ #isSender: boolean;
15
+ #initMessage?: BdxInit;
16
+ #transferConfig: BdxSessionConfiguration.Config;
17
+ #fileDesignator: PersistedFileDesignator;
18
+
19
+ constructor(options: BdxSessionConfiguration.Options) {
20
+ const { isSender, fileDesignator, initMessage } = options;
21
+ this.#fileDesignator = fileDesignator;
22
+ this.#isSender = isSender;
23
+ this.#initMessage = initMessage;
24
+ this.#transferConfig = { ...BdxSessionConfiguration.DefaultConfig, ...options };
25
+
26
+ // Validate Config
27
+ const {
28
+ preferredDriverModes = [],
29
+ maxBlockSize,
30
+ maxTransferSize,
31
+ asynchronousTransferAllowed,
32
+ senderStartOffset,
33
+ senderMaxLength,
34
+ } = this.#transferConfig;
35
+ if (preferredDriverModes.length === 0) {
36
+ throw new ImplementationError("At least one preferred driver mode must be set.");
37
+ }
38
+ if (maxBlockSize !== undefined && maxBlockSize <= 0) {
39
+ throw new ImplementationError("Max block size must be greater than 0");
40
+ }
41
+ if (maxTransferSize !== undefined && maxTransferSize <= 0) {
42
+ throw new ImplementationError("Max transfer size must be greater than 0");
43
+ }
44
+ if (asynchronousTransferAllowed) {
45
+ throw new ImplementationError("Asynchronous transfer is not supported");
46
+ }
47
+ if (!isSender && (senderStartOffset !== undefined || senderMaxLength !== undefined)) {
48
+ throw new ImplementationError("Sender start offset and sender max length are only supported for senders");
49
+ }
50
+ }
51
+
52
+ get isSender(): boolean {
53
+ return this.#isSender;
54
+ }
55
+
56
+ get initMessage(): BdxInit | undefined {
57
+ return this.#initMessage;
58
+ }
59
+
60
+ get isInitiator(): boolean {
61
+ return this.#initMessage === undefined;
62
+ }
63
+
64
+ get fileDesignator(): PersistedFileDesignator {
65
+ return this.#fileDesignator;
66
+ }
67
+
68
+ get transferConfig(): BdxSessionConfiguration.Config {
69
+ return this.#transferConfig;
70
+ }
71
+ }
72
+
73
+ export namespace BdxSessionConfiguration {
74
+ export interface Config {
75
+ /**
76
+ * Array of preferred transfer driver modes, in order of preference. Use this to configure the proposed behavior.
77
+ * Default is [SenderDrive, ReceiverDrive]
78
+ */
79
+ preferredDriverModes?: Flow.DriverMode[];
80
+
81
+ /** Asynchronous transfer is not supported right now because provisional. */
82
+ asynchronousTransferAllowed?: false; // not supported right now, so must be false
83
+
84
+ /** Maximum block size to use for the session. This value is ignored if the transport only supports smaller blocks. */
85
+ maxBlockSize?: number;
86
+
87
+ /** Maximum transfer size to use for the session. Defaults to 100MB */
88
+ maxTransferSize?: number;
89
+
90
+ /** The start offset of the data to send. When using this, you need to know what you are doing. */
91
+ senderStartOffset?: number;
92
+
93
+ /** The maximum length of the data to send. When using this, you need to know what you are doing. */
94
+ senderMaxLength?: number;
95
+ }
96
+
97
+ export const DefaultConfig: BdxSessionConfiguration.Config = {
98
+ preferredDriverModes: [
99
+ Flow.DriverMode.SenderDrive, // Default if multiple is supported, so lets use this
100
+ Flow.DriverMode.ReceiverDrive,
101
+ ],
102
+ asynchronousTransferAllowed: false, // Provisional, not supported
103
+ maxTransferSize: 1_024 * 100_000, // 100 MB, lets use that as maximum transfer filesize for now just to protect
104
+ };
105
+
106
+ export interface InitiatorOptions extends BdxSessionConfiguration.Config {
107
+ /** FileDesignator to use for the session. The value is usually pre-determined with the peer. */
108
+ fileDesignator: PersistedFileDesignator;
109
+ }
110
+
111
+ export interface SenderInitiatorOptions extends InitiatorOptions {
112
+ /** The start offset of the data to send. When using this, you need to know what you are doing. */
113
+ senderStartOffset?: number;
114
+
115
+ /** The maximum length of the data to send. When using this, you need to know what you are doing. */
116
+ senderMaxLength?: number;
117
+ }
118
+
119
+ export interface ReceiverOptions extends BdxSessionConfiguration.Config {
120
+ initMessageType: BdxMessageType;
121
+ initMessage: BdxInit; // The initial message received to start the session
122
+ }
123
+
124
+ export interface Options extends BdxSessionConfiguration.Config {
125
+ /** True if the session is initiated as a sender, false for receiver */
126
+ isSender: boolean;
127
+
128
+ /** File designator to use for the session */
129
+ fileDesignator: PersistedFileDesignator;
130
+
131
+ /** The initial message received to start the session */
132
+ initMessage?: BdxInit;
133
+ }
134
+ }