@matter/protocol 0.16.0-alpha.0-20251217-038f88085 → 0.16.0-alpha.0-20251221-21acf226d

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 (472) hide show
  1. package/dist/cjs/action/client/ClientBdx.d.ts +17 -0
  2. package/dist/cjs/action/client/ClientBdx.d.ts.map +1 -0
  3. package/dist/cjs/action/client/ClientBdx.js +22 -0
  4. package/dist/cjs/action/client/ClientBdx.js.map +6 -0
  5. package/dist/cjs/action/client/ClientInteraction.d.ts +10 -1
  6. package/dist/cjs/action/client/ClientInteraction.d.ts.map +1 -1
  7. package/dist/cjs/action/client/ClientInteraction.js +25 -2
  8. package/dist/cjs/action/client/ClientInteraction.js.map +1 -1
  9. package/dist/cjs/action/client/QueuedClientInteraction.d.ts +11 -3
  10. package/dist/cjs/action/client/QueuedClientInteraction.d.ts.map +1 -1
  11. package/dist/cjs/action/client/QueuedClientInteraction.js +6 -2
  12. package/dist/cjs/action/client/QueuedClientInteraction.js.map +1 -1
  13. package/dist/cjs/action/client/index.d.ts +1 -0
  14. package/dist/cjs/action/client/index.d.ts.map +1 -1
  15. package/dist/cjs/action/client/index.js +1 -0
  16. package/dist/cjs/action/client/index.js.map +1 -1
  17. package/dist/cjs/action/request/Read.d.ts.map +1 -1
  18. package/dist/cjs/action/request/Read.js +2 -2
  19. package/dist/cjs/action/request/Read.js.map +1 -1
  20. package/dist/cjs/action/request/Write.js +4 -3
  21. package/dist/cjs/action/request/Write.js.map +1 -1
  22. package/dist/cjs/advertisement/ble/BleAdvertisement.d.ts +1 -1
  23. package/dist/cjs/advertisement/ble/BleAdvertisement.d.ts.map +1 -1
  24. package/dist/cjs/advertisement/ble/BleAdvertisement.js +2 -2
  25. package/dist/cjs/advertisement/ble/BleAdvertisement.js.map +1 -1
  26. package/dist/cjs/advertisement/mdns/CommissionableMdnsAdvertisement.d.ts +1 -1
  27. package/dist/cjs/advertisement/mdns/CommissionableMdnsAdvertisement.js +1 -1
  28. package/dist/cjs/advertisement/mdns/CommissionableMdnsAdvertisement.js.map +1 -1
  29. package/dist/cjs/advertisement/mdns/OperationalMdnsAdvertisement.d.ts.map +1 -1
  30. package/dist/cjs/advertisement/mdns/OperationalMdnsAdvertisement.js +3 -5
  31. package/dist/cjs/advertisement/mdns/OperationalMdnsAdvertisement.js.map +1 -1
  32. package/dist/cjs/bdx/BdxClient.d.ts +2 -0
  33. package/dist/cjs/bdx/BdxClient.d.ts.map +1 -1
  34. package/dist/cjs/bdx/BdxClient.js +6 -0
  35. package/dist/cjs/bdx/BdxClient.js.map +1 -1
  36. package/dist/cjs/bdx/BdxError.d.ts +2 -0
  37. package/dist/cjs/bdx/BdxError.d.ts.map +1 -1
  38. package/dist/cjs/bdx/BdxError.js +2 -0
  39. package/dist/cjs/bdx/BdxError.js.map +1 -1
  40. package/dist/cjs/bdx/BdxMessenger.d.ts +5 -1
  41. package/dist/cjs/bdx/BdxMessenger.d.ts.map +1 -1
  42. package/dist/cjs/bdx/BdxMessenger.js +12 -4
  43. package/dist/cjs/bdx/BdxMessenger.js.map +1 -1
  44. package/dist/cjs/bdx/BdxProtocol.d.ts +14 -7
  45. package/dist/cjs/bdx/BdxProtocol.d.ts.map +1 -1
  46. package/dist/cjs/bdx/BdxProtocol.js +81 -19
  47. package/dist/cjs/bdx/BdxProtocol.js.map +1 -1
  48. package/dist/cjs/bdx/BdxSession.d.ts +10 -3
  49. package/dist/cjs/bdx/BdxSession.d.ts.map +1 -1
  50. package/dist/cjs/bdx/BdxSession.js +33 -8
  51. package/dist/cjs/bdx/BdxSession.js.map +1 -1
  52. package/dist/cjs/bdx/BdxSessionConfiguration.d.ts +16 -1
  53. package/dist/cjs/bdx/BdxSessionConfiguration.d.ts.map +1 -1
  54. package/dist/cjs/bdx/BdxSessionConfiguration.js +6 -1
  55. package/dist/cjs/bdx/BdxSessionConfiguration.js.map +1 -1
  56. package/dist/cjs/bdx/FileDesignator.d.ts +15 -1
  57. package/dist/cjs/bdx/FileDesignator.d.ts.map +1 -1
  58. package/dist/cjs/bdx/FileDesignator.js +28 -2
  59. package/dist/cjs/bdx/FileDesignator.js.map +1 -1
  60. package/dist/cjs/bdx/PersistedFileDesignator.d.ts +10 -2
  61. package/dist/cjs/bdx/PersistedFileDesignator.d.ts.map +1 -1
  62. package/dist/cjs/bdx/PersistedFileDesignator.js +23 -5
  63. package/dist/cjs/bdx/PersistedFileDesignator.js.map +1 -1
  64. package/dist/cjs/bdx/ScopedStorage.d.ts +18 -0
  65. package/dist/cjs/bdx/ScopedStorage.d.ts.map +1 -0
  66. package/dist/cjs/bdx/ScopedStorage.js +36 -0
  67. package/dist/cjs/bdx/ScopedStorage.js.map +6 -0
  68. package/dist/cjs/bdx/bdx-session-initiator.d.ts.map +1 -1
  69. package/dist/cjs/bdx/bdx-session-initiator.js +10 -2
  70. package/dist/cjs/bdx/bdx-session-initiator.js.map +1 -1
  71. package/dist/cjs/bdx/flow/DrivenSendingFlow.d.ts.map +1 -1
  72. package/dist/cjs/bdx/flow/DrivenSendingFlow.js +2 -0
  73. package/dist/cjs/bdx/flow/DrivenSendingFlow.js.map +1 -1
  74. package/dist/cjs/bdx/flow/DrivingReceivingFlow.d.ts.map +1 -1
  75. package/dist/cjs/bdx/flow/DrivingReceivingFlow.js +1 -0
  76. package/dist/cjs/bdx/flow/DrivingReceivingFlow.js.map +1 -1
  77. package/dist/cjs/bdx/flow/Flow.d.ts +7 -0
  78. package/dist/cjs/bdx/flow/Flow.d.ts.map +1 -1
  79. package/dist/cjs/bdx/flow/Flow.js +22 -1
  80. package/dist/cjs/bdx/flow/Flow.js.map +1 -1
  81. package/dist/cjs/bdx/flow/FollowingReceivingFlow.d.ts.map +1 -1
  82. package/dist/cjs/bdx/flow/FollowingReceivingFlow.js +3 -0
  83. package/dist/cjs/bdx/flow/FollowingReceivingFlow.js.map +1 -1
  84. package/dist/cjs/bdx/flow/FollowingSendingFlow.d.ts.map +1 -1
  85. package/dist/cjs/bdx/flow/FollowingSendingFlow.js +1 -0
  86. package/dist/cjs/bdx/flow/FollowingSendingFlow.js.map +1 -1
  87. package/dist/cjs/bdx/flow/OutboundFlow.d.ts.map +1 -1
  88. package/dist/cjs/bdx/flow/OutboundFlow.js +1 -0
  89. package/dist/cjs/bdx/flow/OutboundFlow.js.map +1 -1
  90. package/dist/cjs/bdx/index.d.ts +1 -0
  91. package/dist/cjs/bdx/index.d.ts.map +1 -1
  92. package/dist/cjs/bdx/index.js +1 -0
  93. package/dist/cjs/bdx/index.js.map +1 -1
  94. package/dist/cjs/certificate/kinds/Icac.d.ts.map +1 -1
  95. package/dist/cjs/certificate/kinds/Icac.js +1 -7
  96. package/dist/cjs/certificate/kinds/Icac.js.map +1 -1
  97. package/dist/cjs/certificate/kinds/Rcac.d.ts +1 -0
  98. package/dist/cjs/certificate/kinds/Rcac.d.ts.map +1 -1
  99. package/dist/cjs/certificate/kinds/Rcac.js +3 -0
  100. package/dist/cjs/certificate/kinds/Rcac.js.map +1 -1
  101. package/dist/cjs/certificate/kinds/definitions/operational.d.ts +1 -1
  102. package/dist/cjs/certificate/kinds/definitions/operational.js +1 -1
  103. package/dist/cjs/certificate/kinds/definitions/operational.js.map +1 -1
  104. package/dist/cjs/common/FailsafeContext.js +2 -2
  105. package/dist/cjs/common/FailsafeContext.js.map +1 -1
  106. package/dist/cjs/dcl/DclClient.d.ts.map +1 -1
  107. package/dist/cjs/dcl/DclClient.js +1 -2
  108. package/dist/cjs/dcl/DclClient.js.map +1 -1
  109. package/dist/cjs/dcl/DclOtaUpdateService.d.ts +30 -31
  110. package/dist/cjs/dcl/DclOtaUpdateService.d.ts.map +1 -1
  111. package/dist/cjs/dcl/DclOtaUpdateService.js +191 -92
  112. package/dist/cjs/dcl/DclOtaUpdateService.js.map +2 -2
  113. package/dist/cjs/dcl/index.d.ts +0 -3
  114. package/dist/cjs/dcl/index.d.ts.map +1 -1
  115. package/dist/cjs/dcl/index.js +0 -3
  116. package/dist/cjs/dcl/index.js.map +1 -1
  117. package/dist/cjs/fabric/Fabric.d.ts +53 -9
  118. package/dist/cjs/fabric/Fabric.d.ts.map +1 -1
  119. package/dist/cjs/fabric/Fabric.js +59 -32
  120. package/dist/cjs/fabric/Fabric.js.map +1 -1
  121. package/dist/cjs/fabric/FabricAuthority.js +1 -1
  122. package/dist/cjs/fabric/FabricAuthority.js.map +1 -1
  123. package/dist/cjs/fabric/FabricManager.d.ts +14 -5
  124. package/dist/cjs/fabric/FabricManager.d.ts.map +1 -1
  125. package/dist/cjs/fabric/FabricManager.js +63 -42
  126. package/dist/cjs/fabric/FabricManager.js.map +1 -1
  127. package/dist/cjs/groups/FabricGroups.d.ts.map +1 -1
  128. package/dist/cjs/groups/FabricGroups.js +4 -8
  129. package/dist/cjs/groups/FabricGroups.js.map +1 -1
  130. package/dist/cjs/index.d.ts +1 -0
  131. package/dist/cjs/index.d.ts.map +1 -1
  132. package/dist/cjs/index.js +1 -0
  133. package/dist/cjs/index.js.map +1 -1
  134. package/dist/cjs/interaction/InteractionMessenger.d.ts +1 -106
  135. package/dist/cjs/interaction/InteractionMessenger.d.ts.map +1 -1
  136. package/dist/cjs/interaction/InteractionMessenger.js +2 -143
  137. package/dist/cjs/interaction/InteractionMessenger.js.map +2 -2
  138. package/dist/cjs/interaction/index.d.ts +0 -1
  139. package/dist/cjs/interaction/index.d.ts.map +1 -1
  140. package/dist/cjs/interaction/index.js +0 -1
  141. package/dist/cjs/interaction/index.js.map +1 -1
  142. package/dist/cjs/mdns/MdnsClient.d.ts +4 -4
  143. package/dist/cjs/mdns/MdnsClient.d.ts.map +1 -1
  144. package/dist/cjs/mdns/MdnsClient.js +12 -15
  145. package/dist/cjs/mdns/MdnsClient.js.map +1 -1
  146. package/dist/cjs/mdns/MdnsConsts.d.ts +3 -3
  147. package/dist/cjs/mdns/MdnsConsts.d.ts.map +1 -1
  148. package/dist/cjs/mdns/MdnsConsts.js +3 -2
  149. package/dist/cjs/mdns/MdnsConsts.js.map +1 -1
  150. package/dist/{esm/dcl → cjs/ota}/OtaImageHeader.d.ts.map +1 -1
  151. package/dist/cjs/{dcl → ota}/OtaImageHeader.js.map +1 -1
  152. package/dist/cjs/{dcl → ota}/OtaImageReader.d.ts.map +1 -1
  153. package/dist/cjs/{dcl → ota}/OtaImageReader.js +0 -2
  154. package/dist/cjs/ota/OtaImageReader.js.map +6 -0
  155. package/dist/{esm/dcl → cjs/ota}/OtaImageWriter.d.ts +1 -1
  156. package/dist/cjs/{dcl → ota}/OtaImageWriter.d.ts.map +1 -1
  157. package/dist/cjs/{dcl → ota}/OtaImageWriter.js.map +1 -1
  158. package/dist/cjs/ota/index.d.ts +9 -0
  159. package/dist/cjs/ota/index.d.ts.map +1 -0
  160. package/dist/cjs/ota/index.js +26 -0
  161. package/dist/cjs/ota/index.js.map +6 -0
  162. package/dist/cjs/peer/ControllerCommissioner.d.ts.map +1 -1
  163. package/dist/cjs/peer/ControllerCommissioner.js +5 -0
  164. package/dist/cjs/peer/ControllerCommissioner.js.map +1 -1
  165. package/dist/cjs/peer/ControllerCommissioningFlow.d.ts +11 -3
  166. package/dist/cjs/peer/ControllerCommissioningFlow.d.ts.map +1 -1
  167. package/dist/cjs/peer/ControllerCommissioningFlow.js +119 -40
  168. package/dist/cjs/peer/ControllerCommissioningFlow.js.map +1 -1
  169. package/dist/cjs/peer/PeerSet.d.ts.map +1 -1
  170. package/dist/cjs/peer/PeerSet.js +17 -10
  171. package/dist/cjs/peer/PeerSet.js.map +1 -1
  172. package/dist/cjs/protocol/DeviceAdvertiser.js +3 -3
  173. package/dist/cjs/protocol/DeviceAdvertiser.js.map +1 -1
  174. package/dist/cjs/protocol/ExchangeProvider.d.ts +2 -2
  175. package/dist/cjs/protocol/ExchangeProvider.d.ts.map +1 -1
  176. package/dist/cjs/protocol/ExchangeProvider.js +2 -2
  177. package/dist/cjs/protocol/ExchangeProvider.js.map +1 -1
  178. package/dist/cjs/protocol/MessageExchange.js +3 -3
  179. package/dist/cjs/protocol/MessageExchange.js.map +1 -1
  180. package/dist/cjs/protocol/ProtocolMocks.d.ts +2 -2
  181. package/dist/cjs/protocol/ProtocolMocks.d.ts.map +1 -1
  182. package/dist/cjs/protocol/ProtocolMocks.js +1 -1
  183. package/dist/cjs/protocol/ProtocolMocks.js.map +1 -1
  184. package/dist/cjs/session/NodeSession.d.ts.map +1 -1
  185. package/dist/cjs/session/NodeSession.js +2 -2
  186. package/dist/cjs/session/NodeSession.js.map +1 -1
  187. package/dist/cjs/session/Session.d.ts.map +1 -1
  188. package/dist/cjs/session/Session.js +1 -0
  189. package/dist/cjs/session/Session.js.map +1 -1
  190. package/dist/cjs/session/SessionManager.js +2 -2
  191. package/dist/cjs/session/SessionManager.js.map +1 -1
  192. package/dist/cjs/session/SessionParameters.d.ts.map +1 -1
  193. package/dist/cjs/session/SessionParameters.js +7 -1
  194. package/dist/cjs/session/SessionParameters.js.map +1 -1
  195. package/dist/cjs/session/pase/PaseServer.d.ts.map +1 -1
  196. package/dist/cjs/session/pase/PaseServer.js +1 -0
  197. package/dist/cjs/session/pase/PaseServer.js.map +1 -1
  198. package/dist/esm/action/client/ClientBdx.d.ts +17 -0
  199. package/dist/esm/action/client/ClientBdx.d.ts.map +1 -0
  200. package/dist/esm/action/client/ClientBdx.js +6 -0
  201. package/dist/esm/action/client/ClientBdx.js.map +6 -0
  202. package/dist/esm/action/client/ClientInteraction.d.ts +10 -1
  203. package/dist/esm/action/client/ClientInteraction.d.ts.map +1 -1
  204. package/dist/esm/action/client/ClientInteraction.js +24 -1
  205. package/dist/esm/action/client/ClientInteraction.js.map +1 -1
  206. package/dist/esm/action/client/QueuedClientInteraction.d.ts +11 -3
  207. package/dist/esm/action/client/QueuedClientInteraction.d.ts.map +1 -1
  208. package/dist/esm/action/client/QueuedClientInteraction.js +5 -1
  209. package/dist/esm/action/client/QueuedClientInteraction.js.map +1 -1
  210. package/dist/esm/action/client/index.d.ts +1 -0
  211. package/dist/esm/action/client/index.d.ts.map +1 -1
  212. package/dist/esm/action/client/index.js +1 -0
  213. package/dist/esm/action/client/index.js.map +1 -1
  214. package/dist/esm/action/request/Read.d.ts.map +1 -1
  215. package/dist/esm/action/request/Read.js +2 -2
  216. package/dist/esm/action/request/Read.js.map +1 -1
  217. package/dist/esm/action/request/Write.js +4 -3
  218. package/dist/esm/action/request/Write.js.map +1 -1
  219. package/dist/esm/advertisement/ble/BleAdvertisement.d.ts +1 -1
  220. package/dist/esm/advertisement/ble/BleAdvertisement.d.ts.map +1 -1
  221. package/dist/esm/advertisement/ble/BleAdvertisement.js +2 -2
  222. package/dist/esm/advertisement/ble/BleAdvertisement.js.map +1 -1
  223. package/dist/esm/advertisement/mdns/CommissionableMdnsAdvertisement.d.ts +1 -1
  224. package/dist/esm/advertisement/mdns/CommissionableMdnsAdvertisement.js +1 -1
  225. package/dist/esm/advertisement/mdns/CommissionableMdnsAdvertisement.js.map +1 -1
  226. package/dist/esm/advertisement/mdns/OperationalMdnsAdvertisement.d.ts.map +1 -1
  227. package/dist/esm/advertisement/mdns/OperationalMdnsAdvertisement.js +4 -6
  228. package/dist/esm/advertisement/mdns/OperationalMdnsAdvertisement.js.map +1 -1
  229. package/dist/esm/bdx/BdxClient.d.ts +2 -0
  230. package/dist/esm/bdx/BdxClient.d.ts.map +1 -1
  231. package/dist/esm/bdx/BdxClient.js +6 -0
  232. package/dist/esm/bdx/BdxClient.js.map +1 -1
  233. package/dist/esm/bdx/BdxError.d.ts +2 -0
  234. package/dist/esm/bdx/BdxError.d.ts.map +1 -1
  235. package/dist/esm/bdx/BdxError.js +2 -0
  236. package/dist/esm/bdx/BdxError.js.map +1 -1
  237. package/dist/esm/bdx/BdxMessenger.d.ts +5 -1
  238. package/dist/esm/bdx/BdxMessenger.d.ts.map +1 -1
  239. package/dist/esm/bdx/BdxMessenger.js +14 -5
  240. package/dist/esm/bdx/BdxMessenger.js.map +1 -1
  241. package/dist/esm/bdx/BdxProtocol.d.ts +14 -7
  242. package/dist/esm/bdx/BdxProtocol.d.ts.map +1 -1
  243. package/dist/esm/bdx/BdxProtocol.js +82 -20
  244. package/dist/esm/bdx/BdxProtocol.js.map +1 -1
  245. package/dist/esm/bdx/BdxSession.d.ts +10 -3
  246. package/dist/esm/bdx/BdxSession.d.ts.map +1 -1
  247. package/dist/esm/bdx/BdxSession.js +34 -9
  248. package/dist/esm/bdx/BdxSession.js.map +1 -1
  249. package/dist/esm/bdx/BdxSessionConfiguration.d.ts +16 -1
  250. package/dist/esm/bdx/BdxSessionConfiguration.d.ts.map +1 -1
  251. package/dist/esm/bdx/BdxSessionConfiguration.js +6 -1
  252. package/dist/esm/bdx/BdxSessionConfiguration.js.map +1 -1
  253. package/dist/esm/bdx/FileDesignator.d.ts +15 -1
  254. package/dist/esm/bdx/FileDesignator.d.ts.map +1 -1
  255. package/dist/esm/bdx/FileDesignator.js +29 -3
  256. package/dist/esm/bdx/FileDesignator.js.map +1 -1
  257. package/dist/esm/bdx/PersistedFileDesignator.d.ts +10 -2
  258. package/dist/esm/bdx/PersistedFileDesignator.d.ts.map +1 -1
  259. package/dist/esm/bdx/PersistedFileDesignator.js +24 -6
  260. package/dist/esm/bdx/PersistedFileDesignator.js.map +1 -1
  261. package/dist/esm/bdx/ScopedStorage.d.ts +18 -0
  262. package/dist/esm/bdx/ScopedStorage.d.ts.map +1 -0
  263. package/dist/esm/bdx/ScopedStorage.js +16 -0
  264. package/dist/esm/bdx/ScopedStorage.js.map +6 -0
  265. package/dist/esm/bdx/bdx-session-initiator.d.ts.map +1 -1
  266. package/dist/esm/bdx/bdx-session-initiator.js +10 -2
  267. package/dist/esm/bdx/bdx-session-initiator.js.map +1 -1
  268. package/dist/esm/bdx/flow/DrivenSendingFlow.d.ts.map +1 -1
  269. package/dist/esm/bdx/flow/DrivenSendingFlow.js +2 -0
  270. package/dist/esm/bdx/flow/DrivenSendingFlow.js.map +1 -1
  271. package/dist/esm/bdx/flow/DrivingReceivingFlow.d.ts.map +1 -1
  272. package/dist/esm/bdx/flow/DrivingReceivingFlow.js +1 -0
  273. package/dist/esm/bdx/flow/DrivingReceivingFlow.js.map +1 -1
  274. package/dist/esm/bdx/flow/Flow.d.ts +7 -0
  275. package/dist/esm/bdx/flow/Flow.d.ts.map +1 -1
  276. package/dist/esm/bdx/flow/Flow.js +23 -2
  277. package/dist/esm/bdx/flow/Flow.js.map +1 -1
  278. package/dist/esm/bdx/flow/FollowingReceivingFlow.d.ts.map +1 -1
  279. package/dist/esm/bdx/flow/FollowingReceivingFlow.js +3 -0
  280. package/dist/esm/bdx/flow/FollowingReceivingFlow.js.map +1 -1
  281. package/dist/esm/bdx/flow/FollowingSendingFlow.d.ts.map +1 -1
  282. package/dist/esm/bdx/flow/FollowingSendingFlow.js +1 -0
  283. package/dist/esm/bdx/flow/FollowingSendingFlow.js.map +1 -1
  284. package/dist/esm/bdx/flow/OutboundFlow.d.ts.map +1 -1
  285. package/dist/esm/bdx/flow/OutboundFlow.js +1 -0
  286. package/dist/esm/bdx/flow/OutboundFlow.js.map +1 -1
  287. package/dist/esm/bdx/index.d.ts +1 -0
  288. package/dist/esm/bdx/index.d.ts.map +1 -1
  289. package/dist/esm/bdx/index.js +1 -0
  290. package/dist/esm/bdx/index.js.map +1 -1
  291. package/dist/esm/certificate/kinds/Icac.d.ts.map +1 -1
  292. package/dist/esm/certificate/kinds/Icac.js +1 -7
  293. package/dist/esm/certificate/kinds/Icac.js.map +1 -1
  294. package/dist/esm/certificate/kinds/Rcac.d.ts +1 -0
  295. package/dist/esm/certificate/kinds/Rcac.d.ts.map +1 -1
  296. package/dist/esm/certificate/kinds/Rcac.js +3 -0
  297. package/dist/esm/certificate/kinds/Rcac.js.map +1 -1
  298. package/dist/esm/certificate/kinds/definitions/operational.d.ts +1 -1
  299. package/dist/esm/certificate/kinds/definitions/operational.js +1 -1
  300. package/dist/esm/certificate/kinds/definitions/operational.js.map +1 -1
  301. package/dist/esm/common/FailsafeContext.js +2 -2
  302. package/dist/esm/common/FailsafeContext.js.map +1 -1
  303. package/dist/esm/dcl/DclClient.d.ts.map +1 -1
  304. package/dist/esm/dcl/DclClient.js +1 -2
  305. package/dist/esm/dcl/DclClient.js.map +1 -1
  306. package/dist/esm/dcl/DclOtaUpdateService.d.ts +30 -31
  307. package/dist/esm/dcl/DclOtaUpdateService.d.ts.map +1 -1
  308. package/dist/esm/dcl/DclOtaUpdateService.js +191 -93
  309. package/dist/esm/dcl/DclOtaUpdateService.js.map +2 -2
  310. package/dist/esm/dcl/index.d.ts +0 -3
  311. package/dist/esm/dcl/index.d.ts.map +1 -1
  312. package/dist/esm/dcl/index.js +0 -3
  313. package/dist/esm/dcl/index.js.map +1 -1
  314. package/dist/esm/fabric/Fabric.d.ts +53 -9
  315. package/dist/esm/fabric/Fabric.d.ts.map +1 -1
  316. package/dist/esm/fabric/Fabric.js +67 -33
  317. package/dist/esm/fabric/Fabric.js.map +1 -1
  318. package/dist/esm/fabric/FabricAuthority.js +1 -1
  319. package/dist/esm/fabric/FabricAuthority.js.map +1 -1
  320. package/dist/esm/fabric/FabricManager.d.ts +14 -5
  321. package/dist/esm/fabric/FabricManager.d.ts.map +1 -1
  322. package/dist/esm/fabric/FabricManager.js +66 -43
  323. package/dist/esm/fabric/FabricManager.js.map +1 -1
  324. package/dist/esm/groups/FabricGroups.d.ts.map +1 -1
  325. package/dist/esm/groups/FabricGroups.js +5 -9
  326. package/dist/esm/groups/FabricGroups.js.map +1 -1
  327. package/dist/esm/index.d.ts +1 -0
  328. package/dist/esm/index.d.ts.map +1 -1
  329. package/dist/esm/index.js +1 -0
  330. package/dist/esm/index.js.map +1 -1
  331. package/dist/esm/interaction/InteractionMessenger.d.ts +1 -106
  332. package/dist/esm/interaction/InteractionMessenger.d.ts.map +1 -1
  333. package/dist/esm/interaction/InteractionMessenger.js +2 -144
  334. package/dist/esm/interaction/InteractionMessenger.js.map +2 -2
  335. package/dist/esm/interaction/index.d.ts +0 -1
  336. package/dist/esm/interaction/index.d.ts.map +1 -1
  337. package/dist/esm/interaction/index.js +0 -1
  338. package/dist/esm/interaction/index.js.map +1 -1
  339. package/dist/esm/mdns/MdnsClient.d.ts +4 -4
  340. package/dist/esm/mdns/MdnsClient.d.ts.map +1 -1
  341. package/dist/esm/mdns/MdnsClient.js +13 -17
  342. package/dist/esm/mdns/MdnsClient.js.map +1 -1
  343. package/dist/esm/mdns/MdnsConsts.d.ts +3 -3
  344. package/dist/esm/mdns/MdnsConsts.d.ts.map +1 -1
  345. package/dist/esm/mdns/MdnsConsts.js +3 -2
  346. package/dist/esm/mdns/MdnsConsts.js.map +1 -1
  347. package/dist/{cjs/dcl → esm/ota}/OtaImageHeader.d.ts.map +1 -1
  348. package/dist/esm/{dcl → ota}/OtaImageHeader.js.map +1 -1
  349. package/dist/esm/{dcl → ota}/OtaImageReader.d.ts.map +1 -1
  350. package/dist/esm/{dcl → ota}/OtaImageReader.js +0 -3
  351. package/dist/esm/ota/OtaImageReader.js.map +6 -0
  352. package/dist/{cjs/dcl → esm/ota}/OtaImageWriter.d.ts +1 -1
  353. package/dist/esm/{dcl → ota}/OtaImageWriter.d.ts.map +1 -1
  354. package/dist/esm/{dcl → ota}/OtaImageWriter.js.map +1 -1
  355. package/dist/esm/ota/index.d.ts +9 -0
  356. package/dist/esm/ota/index.d.ts.map +1 -0
  357. package/dist/esm/ota/index.js +9 -0
  358. package/dist/esm/ota/index.js.map +6 -0
  359. package/dist/esm/peer/ControllerCommissioner.d.ts.map +1 -1
  360. package/dist/esm/peer/ControllerCommissioner.js +5 -0
  361. package/dist/esm/peer/ControllerCommissioner.js.map +1 -1
  362. package/dist/esm/peer/ControllerCommissioningFlow.d.ts +11 -3
  363. package/dist/esm/peer/ControllerCommissioningFlow.d.ts.map +1 -1
  364. package/dist/esm/peer/ControllerCommissioningFlow.js +119 -41
  365. package/dist/esm/peer/ControllerCommissioningFlow.js.map +1 -1
  366. package/dist/esm/peer/PeerSet.d.ts.map +1 -1
  367. package/dist/esm/peer/PeerSet.js +17 -10
  368. package/dist/esm/peer/PeerSet.js.map +1 -1
  369. package/dist/esm/protocol/DeviceAdvertiser.js +3 -3
  370. package/dist/esm/protocol/DeviceAdvertiser.js.map +1 -1
  371. package/dist/esm/protocol/ExchangeProvider.d.ts +2 -2
  372. package/dist/esm/protocol/ExchangeProvider.d.ts.map +1 -1
  373. package/dist/esm/protocol/ExchangeProvider.js +2 -2
  374. package/dist/esm/protocol/ExchangeProvider.js.map +1 -1
  375. package/dist/esm/protocol/MessageExchange.js +3 -3
  376. package/dist/esm/protocol/MessageExchange.js.map +1 -1
  377. package/dist/esm/protocol/ProtocolMocks.d.ts +2 -2
  378. package/dist/esm/protocol/ProtocolMocks.d.ts.map +1 -1
  379. package/dist/esm/protocol/ProtocolMocks.js +11 -2
  380. package/dist/esm/protocol/ProtocolMocks.js.map +1 -1
  381. package/dist/esm/session/NodeSession.d.ts.map +1 -1
  382. package/dist/esm/session/NodeSession.js +3 -3
  383. package/dist/esm/session/NodeSession.js.map +1 -1
  384. package/dist/esm/session/Session.d.ts.map +1 -1
  385. package/dist/esm/session/Session.js +1 -0
  386. package/dist/esm/session/Session.js.map +1 -1
  387. package/dist/esm/session/SessionManager.js +2 -2
  388. package/dist/esm/session/SessionManager.js.map +1 -1
  389. package/dist/esm/session/SessionParameters.d.ts.map +1 -1
  390. package/dist/esm/session/SessionParameters.js +7 -1
  391. package/dist/esm/session/SessionParameters.js.map +1 -1
  392. package/dist/esm/session/pase/PaseServer.d.ts.map +1 -1
  393. package/dist/esm/session/pase/PaseServer.js +1 -0
  394. package/dist/esm/session/pase/PaseServer.js.map +1 -1
  395. package/package.json +6 -6
  396. package/src/action/client/ClientBdx.ts +19 -0
  397. package/src/action/client/ClientInteraction.ts +34 -4
  398. package/src/action/client/QueuedClientInteraction.ts +16 -12
  399. package/src/action/client/index.ts +1 -0
  400. package/src/action/request/Read.ts +8 -2
  401. package/src/action/request/Write.ts +3 -3
  402. package/src/advertisement/ble/BleAdvertisement.ts +4 -4
  403. package/src/advertisement/mdns/CommissionableMdnsAdvertisement.ts +1 -1
  404. package/src/advertisement/mdns/OperationalMdnsAdvertisement.ts +4 -6
  405. package/src/bdx/BdxClient.ts +8 -0
  406. package/src/bdx/BdxError.ts +2 -0
  407. package/src/bdx/BdxMessenger.ts +16 -5
  408. package/src/bdx/BdxProtocol.ts +104 -22
  409. package/src/bdx/BdxSession.ts +38 -16
  410. package/src/bdx/BdxSessionConfiguration.ts +24 -2
  411. package/src/bdx/FileDesignator.ts +31 -2
  412. package/src/bdx/PersistedFileDesignator.ts +35 -8
  413. package/src/bdx/ScopedStorage.ts +25 -0
  414. package/src/bdx/bdx-session-initiator.ts +11 -2
  415. package/src/bdx/flow/DrivenSendingFlow.ts +3 -0
  416. package/src/bdx/flow/DrivingReceivingFlow.ts +1 -0
  417. package/src/bdx/flow/Flow.ts +29 -2
  418. package/src/bdx/flow/FollowingReceivingFlow.ts +3 -0
  419. package/src/bdx/flow/FollowingSendingFlow.ts +2 -0
  420. package/src/bdx/flow/OutboundFlow.ts +1 -0
  421. package/src/bdx/index.ts +1 -0
  422. package/src/certificate/kinds/Icac.ts +4 -1
  423. package/src/certificate/kinds/Rcac.ts +4 -0
  424. package/src/certificate/kinds/definitions/operational.ts +1 -1
  425. package/src/common/FailsafeContext.ts +2 -2
  426. package/src/dcl/DclClient.ts +1 -2
  427. package/src/dcl/DclOtaUpdateService.ts +266 -125
  428. package/src/dcl/index.ts +0 -3
  429. package/src/fabric/Fabric.ts +118 -39
  430. package/src/fabric/FabricAuthority.ts +1 -1
  431. package/src/fabric/FabricManager.ts +76 -49
  432. package/src/groups/FabricGroups.ts +5 -9
  433. package/src/index.ts +1 -0
  434. package/src/interaction/InteractionMessenger.ts +2 -186
  435. package/src/interaction/index.ts +0 -1
  436. package/src/mdns/MdnsClient.ts +14 -19
  437. package/src/mdns/MdnsConsts.ts +5 -4
  438. package/src/{dcl → ota}/OtaImageReader.ts +1 -5
  439. package/src/{dcl → ota}/OtaImageWriter.ts +1 -1
  440. package/src/ota/index.ts +9 -0
  441. package/src/peer/ControllerCommissioner.ts +7 -0
  442. package/src/peer/ControllerCommissioningFlow.ts +161 -54
  443. package/src/peer/PeerSet.ts +25 -12
  444. package/src/protocol/DeviceAdvertiser.ts +5 -5
  445. package/src/protocol/ExchangeProvider.ts +3 -3
  446. package/src/protocol/MessageExchange.ts +3 -3
  447. package/src/protocol/ProtocolMocks.ts +13 -4
  448. package/src/session/NodeSession.ts +3 -3
  449. package/src/session/Session.ts +1 -0
  450. package/src/session/SessionManager.ts +2 -2
  451. package/src/session/SessionParameters.ts +10 -2
  452. package/src/session/pase/PaseServer.ts +2 -1
  453. package/dist/cjs/dcl/OtaImageReader.js.map +0 -6
  454. package/dist/cjs/interaction/SubscriptionClient.d.ts +0 -39
  455. package/dist/cjs/interaction/SubscriptionClient.d.ts.map +0 -1
  456. package/dist/cjs/interaction/SubscriptionClient.js +0 -93
  457. package/dist/cjs/interaction/SubscriptionClient.js.map +0 -6
  458. package/dist/esm/dcl/OtaImageReader.js.map +0 -6
  459. package/dist/esm/interaction/SubscriptionClient.d.ts +0 -39
  460. package/dist/esm/interaction/SubscriptionClient.d.ts.map +0 -1
  461. package/dist/esm/interaction/SubscriptionClient.js +0 -73
  462. package/dist/esm/interaction/SubscriptionClient.js.map +0 -6
  463. package/src/interaction/SubscriptionClient.ts +0 -104
  464. /package/dist/cjs/{dcl → ota}/OtaImageHeader.d.ts +0 -0
  465. /package/dist/cjs/{dcl → ota}/OtaImageHeader.js +0 -0
  466. /package/dist/cjs/{dcl → ota}/OtaImageReader.d.ts +0 -0
  467. /package/dist/cjs/{dcl → ota}/OtaImageWriter.js +0 -0
  468. /package/dist/esm/{dcl → ota}/OtaImageHeader.d.ts +0 -0
  469. /package/dist/esm/{dcl → ota}/OtaImageHeader.js +0 -0
  470. /package/dist/esm/{dcl → ota}/OtaImageReader.d.ts +0 -0
  471. /package/dist/esm/{dcl → ota}/OtaImageWriter.js +0 -0
  472. /package/src/{dcl → ota}/OtaImageHeader.ts +0 -0
@@ -4,9 +4,16 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
 
7
- import { Logger, MatterError, StorageContext } from "#general";
7
+ import { BdxError } from "#bdx/BdxError.js";
8
+ import { FileDesignator } from "#bdx/FileDesignator.js";
9
+ import { PersistedFileDesignator } from "#bdx/PersistedFileDesignator.js";
10
+ import { ScopedStorage } from "#bdx/ScopedStorage.js";
11
+ import { Duration, Environment, Environmental, isDeepEqual, Logger, MatterError, Observable } from "#general";
12
+ import { PeerAddress } from "#peer/PeerAddress.js";
13
+ import { ExchangeManager } from "#protocol/ExchangeManager.js";
8
14
  import { MessageExchange } from "#protocol/MessageExchange.js";
9
15
  import { ProtocolHandler } from "#protocol/ProtocolHandler.js";
16
+ import { SecureSession } from "#session/SecureSession.js";
10
17
  import { BDX_PROTOCOL_ID, BdxMessageType, BdxStatusCode } from "#types";
11
18
  import { Message } from "../codec/MessageCodec.js";
12
19
  import { BdxMessenger } from "./BdxMessenger.js";
@@ -20,23 +27,68 @@ const logger = Logger.get("BdxProtocol");
20
27
  export class BdxProtocol implements ProtocolHandler {
21
28
  readonly id = BDX_PROTOCOL_ID;
22
29
  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;
30
+ readonly #activeBdxSessions = new Map<MessageExchange, { session: BdxSession; scope: string }>();
31
+ #peerScopes = new Map<string, { peer: PeerAddress; storage: ScopedStorage; config?: BdxProtocol.Config }>();
32
+ #sessionStarted = Observable<[session: BdxSession, scope: string]>();
33
+ #sessionClosed = Observable<[session: BdxSession, scope: string]>();
34
+
35
+ static [Environmental.create](env: Environment) {
36
+ const instance = new BdxProtocol();
37
+ env.get(ExchangeManager).addProtocolHandler(instance);
38
+ env.set(BdxProtocol, instance);
39
+ return instance;
40
+ }
41
+
42
+ get sessionStarted() {
43
+ return this.#sessionStarted;
44
+ }
45
+
46
+ get sessionClosed() {
47
+ return this.#sessionClosed;
48
+ }
49
+
50
+ #peerScopeKey(peer: PeerAddress, scope?: string) {
51
+ if (scope === undefined) {
52
+ throw new MatterError("StorageContext must have a defined scope to be used with enableScope");
53
+ }
54
+ return `${peer.toString()}-${scope}`;
55
+ }
56
+
57
+ enablePeerForScope(peer: PeerAddress, storage: ScopedStorage, config?: BdxProtocol.Config) {
58
+ const peerScopeStr = this.#peerScopeKey(peer, storage.scope);
59
+ const peerDetails = this.#peerScopes.get(peerScopeStr);
60
+ if (peerDetails !== undefined) {
61
+ const { storage: existingStorage, config: existingConfig } = peerDetails;
62
+ logger.warn(config, "vs", existingConfig);
63
+ if (existingStorage !== storage || isDeepEqual(config, existingConfig)) {
64
+ return false;
65
+ }
66
+ } else {
67
+ this.#peerScopes.set(peerScopeStr, { peer, storage, config });
68
+ }
69
+ return true;
70
+ }
71
+
72
+ async disablePeerForScope(peer: PeerAddress, storage: ScopedStorage, force = false) {
73
+ if (this.#activeBdxSessions.size > 0) {
74
+ for (const { session, scope } of this.#activeBdxSessions.values()) {
75
+ if (storage.scope === scope && PeerAddress.is(peer, session.peerAddress)) {
76
+ if (force) {
77
+ await session.close(new MatterError("BDX protocol scope disabled"));
78
+ break;
79
+ }
80
+ throw new MatterError(
81
+ `Cannot disable BDX for peer "${peer}" (scope: ${scope}) because there are active BDX sessions using it`,
82
+ );
83
+ }
84
+ }
85
+ }
86
+ this.#peerScopes.delete(this.#peerScopeKey(peer, storage.scope));
35
87
  }
36
88
 
37
89
  async onNewExchange(exchange: MessageExchange, message: Message) {
38
90
  const initMessageType = message.payloadHeader.messageType;
39
- const messenger = new BdxMessenger(exchange);
91
+ SecureSession.assert(exchange.session);
40
92
 
41
93
  switch (initMessageType) {
42
94
  case BdxMessageType.SendInit:
@@ -44,13 +96,32 @@ export class BdxProtocol implements ProtocolHandler {
44
96
  logger.debug(
45
97
  `Initialize Session for ${BdxMessageType[initMessageType]} message on BDX protocol for exchange ${exchange.id}`,
46
98
  );
99
+ await exchange.nextMessage(); // Read the message we just know
100
+
47
101
  const { payload } = message;
48
- const bdxSession = BdxSession.fromMessage(this.#storage, messenger, {
102
+
103
+ const initMessage = new BdxInitMessageSchema().decode(payload);
104
+ const { fileDesignator: messageFileDesignator } = initMessage;
105
+ const fd = new FileDesignator(messageFileDesignator);
106
+ const [storageScope, fileDesignator] = fd.text.split("/");
107
+ const { storage, config } =
108
+ this.#peerScopes.get(this.#peerScopeKey(exchange.session.peerAddress, storageScope)) ?? {};
109
+ if (storage === undefined || fileDesignator === undefined) {
110
+ throw new BdxError(
111
+ `No storage context found for BDX file designator "${fd.text}"`,
112
+ BdxStatusCode.FileDesignatorUnknown,
113
+ );
114
+ }
115
+
116
+ const messenger = new BdxMessenger(exchange, config?.messageTimeout);
117
+
118
+ const bdxSession = BdxSession.fromMessage(messenger, {
49
119
  initMessageType,
50
- initMessage: new BdxInitMessageSchema().decode(payload),
51
- ...this.#bdxLimits,
120
+ initMessage,
121
+ fileDesignator: new PersistedFileDesignator(fileDesignator, storage),
122
+ ...config,
52
123
  });
53
- await this.#registerSession(messenger, bdxSession);
124
+ await this.#registerSession(messenger, bdxSession, storageScope);
54
125
 
55
126
  try {
56
127
  await bdxSession.processTransfer();
@@ -63,31 +134,42 @@ export class BdxProtocol implements ProtocolHandler {
63
134
  logger.warn(
64
135
  `Unexpected BDX message type ${BdxMessageType[initMessageType]} on new exchange ${exchange.id}`,
65
136
  );
66
- await messenger.sendError(BdxStatusCode.UnexpectedMessage);
137
+ await new BdxMessenger(exchange).sendError(BdxStatusCode.UnexpectedMessage);
67
138
  }
68
139
  }
69
140
 
70
141
  /** 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) {
142
+ async #registerSession(messenger: BdxMessenger, bdxSession: BdxSession, scope: string) {
72
143
  const exchange = messenger.exchange;
73
144
  if (this.#activeBdxSessions.has(exchange)) {
74
145
  logger.warn(`BDX session for exchange ${exchange.id} already exists, sending error`);
75
146
  await messenger.sendError(BdxStatusCode.UnexpectedMessage);
76
147
  return;
77
148
  }
78
- this.#activeBdxSessions.set(exchange, bdxSession);
149
+ this.#activeBdxSessions.set(exchange, { session: bdxSession, scope });
150
+
151
+ this.#sessionStarted.emit(bdxSession, scope);
152
+
79
153
  bdxSession.closed.on(async () => {
80
154
  logger.debug(`BDX session for exchange ${exchange.id} closed`);
81
155
  this.#activeBdxSessions.delete(exchange);
82
156
  await exchange.close();
157
+
158
+ this.#sessionClosed.emit(bdxSession, scope);
83
159
  });
84
160
  }
85
161
 
86
162
  async close() {
87
163
  logger.debug(`Closing BDX protocol handler with ${this.#activeBdxSessions.size} active sessions`);
88
- for (const session of this.#activeBdxSessions.values()) {
164
+ for (const { session } of this.#activeBdxSessions.values()) {
89
165
  await session.close(new MatterError("BDX protocol handler closed"));
90
166
  }
91
167
  this.#activeBdxSessions.clear();
92
168
  }
93
169
  }
170
+
171
+ export namespace BdxProtocol {
172
+ export interface Config extends BdxSessionConfiguration.Config {
173
+ messageTimeout?: Duration;
174
+ }
175
+ }
@@ -4,7 +4,8 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
 
7
- import { AsyncObservable, ClassExtends, Diagnostic, Logger, StorageContext } from "#general";
7
+ import { AsyncObservable, ClassExtends, Diagnostic, Logger, Observable } from "#general";
8
+ import { SecureSession } from "#session/SecureSession.js";
8
9
  import { BdxMessageType, BdxStatusCode } from "#types";
9
10
  import { bdxSessionInitiator } from "./bdx-session-initiator.js";
10
11
  import { BdxError } from "./BdxError.js";
@@ -15,7 +16,6 @@ import { DrivingReceivingFlow } from "./flow/DrivingReceivingFlow.js";
15
16
  import { Flow } from "./flow/Flow.js";
16
17
  import { FollowingReceivingFlow } from "./flow/FollowingReceivingFlow.js";
17
18
  import { FollowingSendingFlow } from "./flow/FollowingSendingFlow.js";
18
- import { PersistedFileDesignator } from "./PersistedFileDesignator.js";
19
19
 
20
20
  const logger = Logger.get("BdxSession");
21
21
 
@@ -36,10 +36,10 @@ export class BdxSession {
36
36
  #started = false;
37
37
  #closed = AsyncObservable();
38
38
  #isClosed = false;
39
-
40
39
  #config: BdxSessionConfiguration;
41
-
42
40
  #transferFlow?: Flow;
41
+ #progressInfo = Observable<[bytesTransferred: number, totalBytesLength: number | undefined]>();
42
+ #progressFinished = Observable<[totalBytesTransferred: number]>();
43
43
 
44
44
  /** Initializes a BdxSession as a sender, means that we upload data to the peer. */
45
45
  static asSender(messenger: BdxMessenger, options: BdxSessionConfiguration.SenderInitiatorOptions): BdxSession {
@@ -51,13 +51,13 @@ export class BdxSession {
51
51
  return new BdxSession(messenger, { isSender: false, ...options });
52
52
  }
53
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;
54
+ /**
55
+ * Initializes a BdxSession from an incoming *Init message. The message determines the direction of the transfer.
56
+ * The provided storages allow to map the file designator to a storage context depending on the path prefix in the
57
+ * file designator.
58
+ */
59
+ static fromMessage(messenger: BdxMessenger, options: BdxSessionConfiguration.ReceiverOptions): BdxSession {
60
+ const { initMessageType } = options;
61
61
  if (initMessageType !== BdxMessageType.SendInit && initMessageType !== BdxMessageType.ReceiveInit) {
62
62
  throw new BdxError(
63
63
  `Invalid message type for BDX session initialization: ${BdxMessageType[initMessageType]} (${initMessageType})`,
@@ -65,11 +65,8 @@ export class BdxSession {
65
65
  );
66
66
  }
67
67
 
68
- const { fileDesignator } = initMessage;
69
-
70
68
  return new BdxSession(messenger, {
71
69
  isSender: initMessageType === BdxMessageType.ReceiveInit,
72
- fileDesignator: new PersistedFileDesignator(fileDesignator, storage),
73
70
  ...options,
74
71
  });
75
72
  }
@@ -80,15 +77,26 @@ export class BdxSession {
80
77
  this.#config = new BdxSessionConfiguration(options);
81
78
 
82
79
  const exchange = messenger.exchange;
83
- if (!exchange.channel.isReliable) {
84
- throw new BdxError("Bdx Protocol requires a reliable channel for message exchange");
80
+ if (!exchange.session.isSecure) {
81
+ throw new BdxError("Bdx Protocol requires a secure session.");
85
82
  }
86
83
  exchange.closed.on(async () => {
84
+ if (this.#isClosed) {
85
+ return;
86
+ }
87
87
  logger.debug(`Closing BDX session for exchange ${exchange.id}`);
88
88
  await this.close();
89
89
  });
90
90
  }
91
91
 
92
+ get progressInfo() {
93
+ return this.#progressInfo;
94
+ }
95
+
96
+ get progressFinished() {
97
+ return this.#progressFinished;
98
+ }
99
+
92
100
  /** Method called to start the session. It will end with a successful Transfer or with an error */
93
101
  async processTransfer() {
94
102
  if (this.#started) {
@@ -112,6 +120,12 @@ export class BdxSession {
112
120
  this.#started = true;
113
121
  try {
114
122
  this.#transferFlow = this.#initializeFlow(await bdxSessionInitiator(this.#messenger, this.#config));
123
+ this.#transferFlow.progressInfo.on((bytesTransferred, totalBytesLength) =>
124
+ this.#progressInfo.emit(bytesTransferred, totalBytesLength),
125
+ );
126
+ this.#transferFlow.progressFinished.on(totalBytesTransferred =>
127
+ this.#progressFinished.emit(totalBytesTransferred),
128
+ );
115
129
 
116
130
  await this.#transferFlow.processTransfer();
117
131
 
@@ -123,6 +137,9 @@ export class BdxSession {
123
137
  logger.warn(`BDX session failed with error:`, error);
124
138
 
125
139
  await this.close(error);
140
+
141
+ error.bytesTransferred = this.#transferFlow?.transferredBytes ?? 0;
142
+ error.totalBytesLength = this.#transferFlow?.dataLength;
126
143
  throw error;
127
144
  }
128
145
  }
@@ -161,6 +178,11 @@ export class BdxSession {
161
178
  return this.#closed;
162
179
  }
163
180
 
181
+ get peerAddress() {
182
+ SecureSession.assert(this.#messenger.exchange.session);
183
+ return this.#messenger.exchange.session.peerAddress;
184
+ }
185
+
164
186
  async close(error?: unknown) {
165
187
  if (this.#isClosed) {
166
188
  return;
@@ -4,6 +4,7 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
 
7
+ import { FileDesignator } from "#bdx/FileDesignator.js";
7
8
  import { ImplementationError } from "#general";
8
9
  import { BdxMessageType } from "#types";
9
10
  import { Flow } from "./flow/Flow.js";
@@ -15,10 +16,12 @@ export class BdxSessionConfiguration {
15
16
  #initMessage?: BdxInit;
16
17
  #transferConfig: BdxSessionConfiguration.Config;
17
18
  #fileDesignator: PersistedFileDesignator;
19
+ #transferFileDesignator: FileDesignator;
18
20
 
19
21
  constructor(options: BdxSessionConfiguration.Options) {
20
- const { isSender, fileDesignator, initMessage } = options;
22
+ const { isSender, fileDesignator, transferFileDesignator, initMessage } = options;
21
23
  this.#fileDesignator = fileDesignator;
24
+ this.#transferFileDesignator = transferFileDesignator ?? fileDesignator;
22
25
  this.#isSender = isSender;
23
26
  this.#initMessage = initMessage;
24
27
  this.#transferConfig = { ...BdxSessionConfiguration.DefaultConfig, ...options };
@@ -65,6 +68,10 @@ export class BdxSessionConfiguration {
65
68
  return this.#fileDesignator;
66
69
  }
67
70
 
71
+ get transferFileDesignator(): FileDesignator {
72
+ return this.#transferFileDesignator;
73
+ }
74
+
68
75
  get transferConfig(): BdxSessionConfiguration.Config {
69
76
  return this.#transferConfig;
70
77
  }
@@ -106,6 +113,11 @@ export namespace BdxSessionConfiguration {
106
113
  export interface InitiatorOptions extends BdxSessionConfiguration.Config {
107
114
  /** FileDesignator to use for the session. The value is usually pre-determined with the peer. */
108
115
  fileDesignator: PersistedFileDesignator;
116
+
117
+ /**
118
+ * Optional file designator to use for the transfer. This can be used to separate the file designator used
119
+ * in BDX messages from the persisted file. */
120
+ transferFileDesignator?: FileDesignator;
109
121
  }
110
122
 
111
123
  export interface SenderInitiatorOptions extends InitiatorOptions {
@@ -119,15 +131,25 @@ export namespace BdxSessionConfiguration {
119
131
  export interface ReceiverOptions extends BdxSessionConfiguration.Config {
120
132
  initMessageType: BdxMessageType;
121
133
  initMessage: BdxInit; // The initial message received to start the session
134
+ fileDesignator: PersistedFileDesignator;
122
135
  }
123
136
 
124
137
  export interface Options extends BdxSessionConfiguration.Config {
125
138
  /** True if the session is initiated as a sender, false for receiver */
126
139
  isSender: boolean;
127
140
 
128
- /** File designator to use for the session */
141
+ /**
142
+ * File designator to use for the session and read from or write to. It points to the persisted blob storage.
143
+ */
129
144
  fileDesignator: PersistedFileDesignator;
130
145
 
146
+ /**
147
+ * Optional Transfer FileDesignator to use for the transfer, if different from the fileDesignator. This is
148
+ * mainly useful when receiving data where the fileDesignator used in the BDX messages is defined by the file
149
+ * sender and when the persisted file is stored under a different designator.
150
+ */
151
+ transferFileDesignator?: FileDesignator;
152
+
131
153
  /** The initial message received to start the session */
132
154
  initMessage?: BdxInit;
133
155
  }
@@ -4,7 +4,8 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
 
7
- import { Bytes } from "#general";
7
+ import { Bytes, Diagnostic, ImplementationError } from "#general";
8
+ import { NodeId } from "#types";
8
9
 
9
10
  /**
10
11
  * Class to represent a File designator from Matter.
@@ -14,6 +15,20 @@ import { Bytes } from "#general";
14
15
  export class FileDesignator {
15
16
  #fd: Bytes;
16
17
 
18
+ /**
19
+ * Initialize a FileDesignator from a BDX URI string. Also returns the source node ID of the owner of the file.
20
+ */
21
+ static fromBdxUri(uri: string) {
22
+ const bdxParts = uri.match(/^bdx:\/\/([0-9A-F]{16})\/(\S+)$/);
23
+ if (!bdxParts) {
24
+ throw new ImplementationError(`Invalid OTA URI "${uri}"`);
25
+ }
26
+ return {
27
+ fileDesignator: new FileDesignator(bdxParts[2]),
28
+ sourceNodeId: NodeId(BigInt(`0x${bdxParts[1]}`)),
29
+ };
30
+ }
31
+
17
32
  /** Create a FileDesignator from a string or bytes object. */
18
33
  constructor(fd: string | Bytes) {
19
34
  if (typeof fd === "string") {
@@ -38,7 +53,9 @@ export class FileDesignator {
38
53
  (byte >= 0x61 && byte <= 0x7a) || // a-z
39
54
  (byte >= 0x30 && byte <= 0x39) || // 0..9
40
55
  byte === 0x2e || // "."
41
- byte === 0x2d, // "-"
56
+ byte === 0x2d || // "-"
57
+ byte === 0x5f || // "_"
58
+ byte === 0x2f, // "/"
42
59
  );
43
60
  if (isValidName) {
44
61
  return fileDesignatorData.reduce((name, byte) => name + String.fromCharCode(byte), "");
@@ -46,4 +63,16 @@ export class FileDesignator {
46
63
  return `0x${Bytes.toHex(fileDesignatorData)}`;
47
64
  }
48
65
  }
66
+
67
+ /**
68
+ * Return the FileDesignator as a BDX URI string. The source node ID of the owner of the file is required to
69
+ * generate a valid URI.
70
+ */
71
+ asBdxUri(sourceNode: NodeId) {
72
+ return `bdx://${NodeId.strOf(sourceNode).toUpperCase()}/${this.text}`;
73
+ }
74
+
75
+ get [Diagnostic.value](): string {
76
+ return this.text;
77
+ }
49
78
  }
@@ -4,32 +4,57 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
 
7
- import { Bytes, ImplementationError, StorageContext } from "#general";
7
+ import { ScopedStorage } from "#bdx/ScopedStorage.js";
8
+ import { Bytes, ImplementationError, Logger, StorageContext } from "#general";
8
9
  import { FileDesignator } from "./FileDesignator.js";
9
10
 
10
- /** A FileDesignator that points to a persisted file in a given StorageContext. */
11
+ const logger = Logger.get("PersistedFileDesignator");
12
+
13
+ /**
14
+ * A FileDesignator that points to a persisted file in a given StorageContext.
15
+ * If the file is supposed to be used for Bdx transfers where it could be requested by a client and is not actively
16
+ * sent or the location to store a received file, you need to pass a ScopedStorage to allow automatic target detection
17
+ * for BDX.
18
+ * The logic supports providing names separated by "." to automatically create sub contexts
19
+ */
11
20
  export class PersistedFileDesignator extends FileDesignator {
12
21
  #storage: StorageContext;
13
22
  #blob?: Blob;
23
+ #blobName: string;
14
24
 
15
- constructor(fd: string | Bytes | FileDesignator, storage: StorageContext) {
25
+ constructor(fd: string | Bytes | FileDesignator, storage: StorageContext | ScopedStorage) {
16
26
  if (fd instanceof FileDesignator) {
17
27
  fd = fd.bytes;
18
28
  }
29
+ const blobName = Bytes.isBytes(fd) ? Bytes.toString(fd) : fd;
30
+ if (storage instanceof ScopedStorage) {
31
+ fd = Bytes.fromString(`${storage.scope}/${blobName}`);
32
+ storage = storage.context;
33
+ }
19
34
  super(fd);
35
+ const subContext = blobName.split(".");
36
+ this.#blobName = subContext.pop()!;
37
+ for (const parts of subContext) {
38
+ storage = storage.createContext(parts);
39
+ }
40
+
20
41
  this.#storage = storage;
21
42
  }
22
43
 
23
44
  exists() {
24
- return this.#storage.has(this.text);
45
+ return this.#storage.has(this.#blobName);
46
+ }
47
+
48
+ get blobName() {
49
+ return this.#blobName;
25
50
  }
26
51
 
27
52
  async openBlob() {
28
53
  if (this.#blob === undefined) {
29
- const blobName = this.text;
54
+ const blobName = this.#blobName;
30
55
  if (!this.#storage.has(blobName)) {
31
56
  throw new ImplementationError(
32
- "File designator must point to an existing file in the storage to send data",
57
+ `File designator must point to an existing blob "${blobName}" in the storage to send data`,
33
58
  );
34
59
  }
35
60
  this.#blob = await this.#storage.openBlob(blobName);
@@ -38,10 +63,12 @@ export class PersistedFileDesignator extends FileDesignator {
38
63
  }
39
64
 
40
65
  writeFromStream(stream: ReadableStream<Bytes>) {
41
- return this.#storage.writeBlobFromStream(this.text, stream);
66
+ logger.debug(`Writing blob "${this.text}" (${this.#blobName}) to storage`);
67
+ return this.#storage.writeBlobFromStream(this.#blobName, stream);
42
68
  }
43
69
 
44
70
  delete() {
45
- return this.#storage.delete(this.text);
71
+ logger.debug(`Deleting blob "${this.text}" (${this.#blobName}) from storage`);
72
+ return this.#storage.delete(this.#blobName);
46
73
  }
47
74
  }
@@ -0,0 +1,25 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2022-2025 Matter.js Authors
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+
7
+ import { StorageContext } from "#general";
8
+
9
+ /**
10
+ * Storage Scopes allow flagging a context for a specific usage.
11
+ * This is mainly used for BDX transfers currently to allow separating OTA related storage from log related storage
12
+ * and to automatically choose the right one based on the incoming file designator.
13
+ */
14
+ export type StorageScope = "ota" | "log";
15
+
16
+ export class ScopedStorage {
17
+ readonly scope: StorageScope;
18
+
19
+ constructor(
20
+ public readonly context: StorageContext,
21
+ scope: StorageScope,
22
+ ) {
23
+ this.scope = scope;
24
+ }
25
+ }
@@ -4,6 +4,7 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
 
7
+ import { FileDesignator } from "#bdx/FileDesignator.js";
7
8
  import { ImplementationError, InternalError, Logger } from "#general";
8
9
  import { BdxStatusCode, TypeFromPartialBitSchema } from "#types";
9
10
  import { BdxError } from "./BdxError.js";
@@ -45,6 +46,14 @@ export async function bdxSessionInitiator(messenger: BdxMessenger, config: BdxSe
45
46
  }
46
47
  logger.debug(`Initialize BDX ${config.isSender ? "ReceiveInit" : "SendInit"} from incoming Message`, initMessage);
47
48
 
49
+ const incomingFileDesignator = new FileDesignator(initMessage.fileDesignator);
50
+ if (incomingFileDesignator.text !== config.transferFileDesignator.text) {
51
+ throw new BdxError(
52
+ `File designator in Init message (${incomingFileDesignator.text}) does not match the configured transfer file designator (${config.transferFileDesignator.text})`,
53
+ BdxStatusCode.FileDesignatorUnknown,
54
+ );
55
+ }
56
+
48
57
  if (config.isSender) {
49
58
  // We are Sender and Responder
50
59
  if (!config.fileDesignator.exists()) {
@@ -100,7 +109,7 @@ export async function bdxSessionInitiator(messenger: BdxMessenger, config: BdxSe
100
109
  preferredDriverModes,
101
110
  asynchronousTransferAllowed,
102
111
  } = config.transferConfig;
103
- const { isSender, fileDesignator } = config;
112
+ const { isSender, fileDesignator, transferFileDesignator } = config;
104
113
 
105
114
  let startOffset: number | undefined;
106
115
  let maxLength: number | undefined;
@@ -153,7 +162,7 @@ export async function bdxSessionInitiator(messenger: BdxMessenger, config: BdxSe
153
162
  asynchronousTransfer: asynchronousTransferAllowed, // always false for now
154
163
  },
155
164
  maxBlockSize,
156
- fileDesignator: fileDesignator.bytes,
165
+ fileDesignator: transferFileDesignator.bytes,
157
166
  startOffset,
158
167
  maxLength,
159
168
  };
@@ -23,12 +23,15 @@ export class DrivenSendingFlow extends OutboundFlow {
23
23
  if (done) {
24
24
  // Send the last Block and wait for AckEof and close down
25
25
  await this.messenger.sendBlockEof({ data: data ?? new Uint8Array(), blockCounter });
26
+ this.transferredBytes += data?.byteLength ?? 0;
27
+
26
28
  this.finalBlockCounter = blockCounter;
27
29
  return true;
28
30
  }
29
31
 
30
32
  // Send the next Block
31
33
  await this.messenger.sendBlock({ data, blockCounter });
34
+ this.transferredBytes += data.byteLength;
32
35
 
33
36
  // Sync transfer just continues when the Ack is received
34
37
  if (!asynchronousTransfer) {
@@ -27,6 +27,7 @@ export class DrivingReceivingFlow extends InboundFlow {
27
27
  message: { blockCounter: dataBlockCounter, data },
28
28
  } = await this.messenger.readBlock();
29
29
  this.validateCounter(dataBlockCounter, blockCounter);
30
+ this.transferredBytes += data.byteLength;
30
31
 
31
32
  // Write the received data chunk into the writing stream
32
33
  if (this.writeDataChunk(writeController, data, messageType)) {