@matter/protocol 0.16.0-alpha.0-20251203-aaf94bca8 → 0.16.0-alpha.0-20251207-37e501b18

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 (570) hide show
  1. package/dist/cjs/action/client/ClientInteraction.d.ts.map +1 -1
  2. package/dist/cjs/action/client/ClientInteraction.js +82 -34
  3. package/dist/cjs/action/client/ClientInteraction.js.map +2 -2
  4. package/dist/cjs/action/client/subscription/ClientSubscription.d.ts +10 -5
  5. package/dist/cjs/action/client/subscription/ClientSubscription.d.ts.map +1 -1
  6. package/dist/cjs/action/client/subscription/ClientSubscription.js +21 -1
  7. package/dist/cjs/action/client/subscription/ClientSubscription.js.map +2 -2
  8. package/dist/cjs/action/client/subscription/ClientSubscriptionHandler.js +2 -3
  9. package/dist/cjs/action/client/subscription/ClientSubscriptionHandler.js.map +1 -1
  10. package/dist/cjs/action/client/subscription/ClientSubscriptions.d.ts +4 -2
  11. package/dist/cjs/action/client/subscription/ClientSubscriptions.d.ts.map +1 -1
  12. package/dist/cjs/action/client/subscription/ClientSubscriptions.js +68 -8
  13. package/dist/cjs/action/client/subscription/ClientSubscriptions.js.map +1 -1
  14. package/dist/cjs/action/client/subscription/PeerSubscription.d.ts +0 -1
  15. package/dist/cjs/action/client/subscription/PeerSubscription.d.ts.map +1 -1
  16. package/dist/cjs/action/client/subscription/PeerSubscription.js +1 -2
  17. package/dist/cjs/action/client/subscription/PeerSubscription.js.map +1 -1
  18. package/dist/cjs/action/client/subscription/SustainedSubscription.d.ts +0 -2
  19. package/dist/cjs/action/client/subscription/SustainedSubscription.d.ts.map +1 -1
  20. package/dist/cjs/action/client/subscription/SustainedSubscription.js +2 -4
  21. package/dist/cjs/action/client/subscription/SustainedSubscription.js.map +1 -1
  22. package/dist/cjs/action/request/Invoke.js +2 -2
  23. package/dist/cjs/action/request/Invoke.js.map +1 -1
  24. package/dist/cjs/action/server/AttributeReadResponse.d.ts.map +1 -1
  25. package/dist/cjs/action/server/AttributeReadResponse.js +78 -25
  26. package/dist/cjs/action/server/AttributeReadResponse.js.map +1 -1
  27. package/dist/cjs/action/server/AttributeWriteResponse.d.ts.map +1 -1
  28. package/dist/cjs/action/server/AttributeWriteResponse.js +70 -17
  29. package/dist/cjs/action/server/AttributeWriteResponse.js.map +1 -1
  30. package/dist/cjs/action/server/CommandInvokeResponse.d.ts.map +1 -1
  31. package/dist/cjs/action/server/CommandInvokeResponse.js +83 -30
  32. package/dist/cjs/action/server/CommandInvokeResponse.js.map +1 -1
  33. package/dist/cjs/action/server/DataResponse.d.ts +1 -0
  34. package/dist/cjs/action/server/DataResponse.d.ts.map +1 -1
  35. package/dist/cjs/action/server/DataResponse.js +3 -0
  36. package/dist/cjs/action/server/DataResponse.js.map +1 -1
  37. package/dist/cjs/action/server/ServerInteraction.d.ts.map +1 -1
  38. package/dist/cjs/action/server/ServerInteraction.js +4 -4
  39. package/dist/cjs/action/server/ServerInteraction.js.map +1 -1
  40. package/dist/cjs/advertisement/Advertisement.d.ts.map +1 -1
  41. package/dist/cjs/advertisement/Advertisement.js +66 -14
  42. package/dist/cjs/advertisement/Advertisement.js.map +1 -1
  43. package/dist/cjs/advertisement/Advertiser.d.ts +4 -1
  44. package/dist/cjs/advertisement/Advertiser.d.ts.map +1 -1
  45. package/dist/cjs/advertisement/Advertiser.js +63 -2
  46. package/dist/cjs/advertisement/Advertiser.js.map +1 -1
  47. package/dist/cjs/advertisement/ble/BleAdvertiser.d.ts +6 -1
  48. package/dist/cjs/advertisement/ble/BleAdvertiser.d.ts.map +1 -1
  49. package/dist/cjs/advertisement/ble/BleAdvertiser.js +1 -1
  50. package/dist/cjs/advertisement/ble/BleAdvertiser.js.map +1 -1
  51. package/dist/cjs/advertisement/mdns/MdnsAdvertiser.d.ts +5 -1
  52. package/dist/cjs/advertisement/mdns/MdnsAdvertiser.d.ts.map +1 -1
  53. package/dist/cjs/advertisement/mdns/MdnsAdvertiser.js +1 -1
  54. package/dist/cjs/advertisement/mdns/MdnsAdvertiser.js.map +1 -1
  55. package/dist/cjs/certificate/kinds/definitions/asn.js +1 -1
  56. package/dist/cjs/certificate/kinds/definitions/asn.js.map +1 -1
  57. package/dist/cjs/certificate/kinds/definitions/attestation.d.ts.map +1 -1
  58. package/dist/cjs/cluster/client/AttributeClient.d.ts.map +1 -1
  59. package/dist/cjs/cluster/client/AttributeClient.js +2 -2
  60. package/dist/cjs/cluster/client/AttributeClient.js.map +1 -1
  61. package/dist/cjs/codec/MessageCodec.d.ts +8 -1
  62. package/dist/cjs/codec/MessageCodec.d.ts.map +1 -1
  63. package/dist/cjs/codec/MessageCodec.js +38 -28
  64. package/dist/cjs/codec/MessageCodec.js.map +2 -2
  65. package/dist/cjs/common/FailsafeContext.d.ts +8 -9
  66. package/dist/cjs/common/FailsafeContext.d.ts.map +1 -1
  67. package/dist/cjs/common/FailsafeContext.js +27 -33
  68. package/dist/cjs/common/FailsafeContext.js.map +1 -1
  69. package/dist/cjs/common/FailsafeTimer.d.ts +4 -3
  70. package/dist/cjs/common/FailsafeTimer.d.ts.map +1 -1
  71. package/dist/cjs/common/FailsafeTimer.js +4 -4
  72. package/dist/cjs/common/FailsafeTimer.js.map +1 -1
  73. package/dist/cjs/common/Mark.d.ts +17 -0
  74. package/dist/cjs/common/Mark.d.ts.map +1 -0
  75. package/dist/cjs/{peer/OperationalPeer.js → common/Mark.js} +19 -3
  76. package/dist/cjs/common/Mark.js.map +6 -0
  77. package/dist/cjs/common/index.d.ts +1 -0
  78. package/dist/cjs/common/index.d.ts.map +1 -1
  79. package/dist/cjs/common/index.js +1 -0
  80. package/dist/cjs/common/index.js.map +1 -1
  81. package/dist/cjs/fabric/Fabric.d.ts +16 -8
  82. package/dist/cjs/fabric/Fabric.d.ts.map +1 -1
  83. package/dist/cjs/fabric/Fabric.js +35 -18
  84. package/dist/cjs/fabric/Fabric.js.map +1 -1
  85. package/dist/cjs/fabric/FabricAuthority.d.ts +2 -2
  86. package/dist/cjs/fabric/FabricAuthority.d.ts.map +1 -1
  87. package/dist/cjs/fabric/FabricAuthority.js +3 -3
  88. package/dist/cjs/fabric/FabricAuthority.js.map +1 -1
  89. package/dist/cjs/fabric/FabricManager.d.ts +10 -14
  90. package/dist/cjs/fabric/FabricManager.d.ts.map +1 -1
  91. package/dist/cjs/fabric/FabricManager.js +44 -40
  92. package/dist/cjs/fabric/FabricManager.js.map +2 -2
  93. package/dist/cjs/index.d.ts +1 -1
  94. package/dist/cjs/index.d.ts.map +1 -1
  95. package/dist/cjs/index.js +1 -1
  96. package/dist/cjs/index.js.map +1 -1
  97. package/dist/cjs/interaction/AttributeDataEncoder.d.ts +1 -1
  98. package/dist/cjs/interaction/InteractionClient.d.ts +2 -2
  99. package/dist/cjs/interaction/InteractionClient.d.ts.map +1 -1
  100. package/dist/cjs/interaction/InteractionClient.js +39 -22
  101. package/dist/cjs/interaction/InteractionClient.js.map +1 -1
  102. package/dist/cjs/interaction/InteractionMessenger.d.ts +2 -2
  103. package/dist/cjs/interaction/InteractionMessenger.d.ts.map +1 -1
  104. package/dist/cjs/interaction/InteractionMessenger.js +35 -27
  105. package/dist/cjs/interaction/InteractionMessenger.js.map +1 -1
  106. package/dist/cjs/interaction/Subscription.d.ts +16 -37
  107. package/dist/cjs/interaction/Subscription.d.ts.map +1 -1
  108. package/dist/cjs/interaction/Subscription.js +15 -68
  109. package/dist/cjs/interaction/Subscription.js.map +2 -2
  110. package/dist/cjs/interaction/SubscriptionClient.d.ts +2 -2
  111. package/dist/cjs/interaction/SubscriptionClient.d.ts.map +1 -1
  112. package/dist/cjs/interaction/SubscriptionClient.js +2 -2
  113. package/dist/cjs/interaction/SubscriptionClient.js.map +1 -1
  114. package/dist/cjs/mdns/MdnsClient.d.ts +10 -10
  115. package/dist/cjs/mdns/MdnsClient.d.ts.map +1 -1
  116. package/dist/cjs/mdns/MdnsClient.js +165 -80
  117. package/dist/cjs/mdns/MdnsClient.js.map +1 -1
  118. package/dist/cjs/mdns/MdnsServer.d.ts +2 -2
  119. package/dist/cjs/mdns/MdnsServer.d.ts.map +1 -1
  120. package/dist/cjs/mdns/MdnsServer.js +173 -94
  121. package/dist/cjs/mdns/MdnsServer.js.map +2 -2
  122. package/dist/cjs/mdns/MdnsService.d.ts.map +1 -1
  123. package/dist/cjs/mdns/MdnsService.js +3 -2
  124. package/dist/cjs/mdns/MdnsService.js.map +1 -1
  125. package/dist/cjs/mdns/MdnsSocket.d.ts +3 -2
  126. package/dist/cjs/mdns/MdnsSocket.d.ts.map +1 -1
  127. package/dist/cjs/mdns/MdnsSocket.js +2 -1
  128. package/dist/cjs/mdns/MdnsSocket.js.map +1 -1
  129. package/dist/cjs/peer/ControllerCommissioner.d.ts +2 -2
  130. package/dist/cjs/peer/ControllerCommissioner.d.ts.map +1 -1
  131. package/dist/cjs/peer/ControllerCommissioner.js +26 -28
  132. package/dist/cjs/peer/ControllerCommissioner.js.map +1 -1
  133. package/dist/cjs/peer/ControllerDiscovery.d.ts +1 -1
  134. package/dist/cjs/peer/ControllerDiscovery.d.ts.map +1 -1
  135. package/dist/cjs/peer/ControllerDiscovery.js +3 -3
  136. package/dist/cjs/peer/ControllerDiscovery.js.map +1 -1
  137. package/dist/cjs/peer/Peer.d.ts +57 -0
  138. package/dist/cjs/peer/Peer.d.ts.map +1 -0
  139. package/dist/cjs/peer/Peer.js +182 -0
  140. package/dist/cjs/peer/Peer.js.map +6 -0
  141. package/dist/cjs/peer/PeerAddress.d.ts.map +1 -1
  142. package/dist/cjs/peer/PeerAddress.js +5 -2
  143. package/dist/cjs/peer/PeerAddress.js.map +1 -1
  144. package/dist/cjs/peer/PeerAddressStore.d.ts +3 -3
  145. package/dist/cjs/peer/PeerAddressStore.d.ts.map +1 -1
  146. package/{src/peer/OperationalPeer.ts → dist/cjs/peer/PeerDescriptor.d.ts} +14 -12
  147. package/dist/cjs/peer/PeerDescriptor.d.ts.map +1 -0
  148. package/dist/cjs/peer/PeerDescriptor.js +71 -0
  149. package/dist/cjs/peer/PeerDescriptor.js.map +6 -0
  150. package/dist/cjs/peer/PeerSet.d.ts +23 -26
  151. package/dist/cjs/peer/PeerSet.d.ts.map +1 -1
  152. package/dist/cjs/peer/PeerSet.js +173 -173
  153. package/dist/cjs/peer/PeerSet.js.map +2 -2
  154. package/dist/cjs/peer/index.d.ts +1 -1
  155. package/dist/cjs/peer/index.d.ts.map +1 -1
  156. package/dist/cjs/peer/index.js +1 -1
  157. package/dist/cjs/peer/index.js.map +1 -1
  158. package/dist/cjs/protocol/DeviceAdvertiser.js +4 -4
  159. package/dist/cjs/protocol/DeviceAdvertiser.js.map +1 -1
  160. package/dist/cjs/protocol/ExchangeManager.d.ts +6 -9
  161. package/dist/cjs/protocol/ExchangeManager.d.ts.map +1 -1
  162. package/dist/cjs/protocol/ExchangeManager.js +306 -246
  163. package/dist/cjs/protocol/ExchangeManager.js.map +2 -2
  164. package/dist/cjs/protocol/ExchangeProvider.d.ts +9 -11
  165. package/dist/cjs/protocol/ExchangeProvider.d.ts.map +1 -1
  166. package/dist/cjs/protocol/ExchangeProvider.js +79 -32
  167. package/dist/cjs/protocol/ExchangeProvider.js.map +2 -2
  168. package/dist/cjs/protocol/MessageChannel.d.ts +6 -7
  169. package/dist/cjs/protocol/MessageChannel.d.ts.map +1 -1
  170. package/dist/cjs/protocol/MessageChannel.js +14 -16
  171. package/dist/cjs/protocol/MessageChannel.js.map +1 -1
  172. package/dist/cjs/protocol/MessageCounter.d.ts +4 -4
  173. package/dist/cjs/protocol/MessageCounter.d.ts.map +1 -1
  174. package/dist/cjs/protocol/MessageCounter.js +7 -7
  175. package/dist/cjs/protocol/MessageCounter.js.map +1 -1
  176. package/dist/cjs/protocol/MessageExchange.d.ts +31 -20
  177. package/dist/cjs/protocol/MessageExchange.d.ts.map +1 -1
  178. package/dist/cjs/protocol/MessageExchange.js +316 -231
  179. package/dist/cjs/protocol/MessageExchange.js.map +2 -2
  180. package/dist/cjs/protocol/ProtocolMocks.d.ts +100 -0
  181. package/dist/cjs/protocol/ProtocolMocks.d.ts.map +1 -0
  182. package/dist/cjs/protocol/ProtocolMocks.js +237 -0
  183. package/dist/cjs/protocol/ProtocolMocks.js.map +6 -0
  184. package/dist/cjs/protocol/errors.d.ts +35 -0
  185. package/dist/cjs/protocol/errors.d.ts.map +1 -0
  186. package/dist/cjs/protocol/errors.js +50 -0
  187. package/dist/cjs/protocol/errors.js.map +6 -0
  188. package/dist/cjs/protocol/index.d.ts +2 -1
  189. package/dist/cjs/protocol/index.d.ts.map +1 -1
  190. package/dist/cjs/protocol/index.js +2 -1
  191. package/dist/cjs/protocol/index.js.map +1 -1
  192. package/dist/cjs/securechannel/SecureChannelMessenger.d.ts +1 -0
  193. package/dist/cjs/securechannel/SecureChannelMessenger.d.ts.map +1 -1
  194. package/dist/cjs/securechannel/SecureChannelMessenger.js +3 -0
  195. package/dist/cjs/securechannel/SecureChannelMessenger.js.map +1 -1
  196. package/dist/cjs/securechannel/SecureChannelProtocol.js +2 -2
  197. package/dist/cjs/securechannel/SecureChannelProtocol.js.map +1 -1
  198. package/dist/cjs/session/GroupSession.d.ts +21 -10
  199. package/dist/cjs/session/GroupSession.d.ts.map +1 -1
  200. package/dist/cjs/session/GroupSession.js +37 -12
  201. package/dist/cjs/session/GroupSession.js.map +1 -1
  202. package/dist/cjs/session/NodeSession.d.ts +56 -50
  203. package/dist/cjs/session/NodeSession.d.ts.map +1 -1
  204. package/dist/cjs/session/NodeSession.js +95 -103
  205. package/dist/cjs/session/NodeSession.js.map +1 -1
  206. package/dist/cjs/session/SecureSession.d.ts +4 -4
  207. package/dist/cjs/session/SecureSession.d.ts.map +1 -1
  208. package/dist/cjs/session/SecureSession.js +1 -1
  209. package/dist/cjs/session/SecureSession.js.map +1 -1
  210. package/dist/cjs/session/Session.d.ts +82 -66
  211. package/dist/cjs/session/Session.d.ts.map +1 -1
  212. package/dist/cjs/session/Session.js +218 -45
  213. package/dist/cjs/session/Session.js.map +1 -1
  214. package/dist/cjs/session/SessionManager.d.ts +33 -36
  215. package/dist/cjs/session/SessionManager.d.ts.map +1 -1
  216. package/dist/cjs/session/SessionManager.js +112 -150
  217. package/dist/cjs/session/SessionManager.js.map +1 -1
  218. package/dist/cjs/session/SessionParameters.d.ts +87 -0
  219. package/dist/cjs/session/SessionParameters.d.ts.map +1 -0
  220. package/dist/cjs/session/SessionParameters.js +81 -0
  221. package/dist/cjs/session/SessionParameters.js.map +6 -0
  222. package/dist/{esm/session/InsecureSession.d.ts → cjs/session/UnsecuredSession.d.ts} +18 -16
  223. package/dist/cjs/session/UnsecuredSession.d.ts.map +1 -0
  224. package/dist/cjs/session/{InsecureSession.js → UnsecuredSession.js} +21 -21
  225. package/dist/cjs/session/UnsecuredSession.js.map +6 -0
  226. package/dist/cjs/session/case/CaseClient.d.ts.map +1 -1
  227. package/dist/cjs/session/case/CaseClient.js +6 -4
  228. package/dist/cjs/session/case/CaseClient.js.map +1 -1
  229. package/dist/cjs/session/case/CaseServer.d.ts.map +1 -1
  230. package/dist/cjs/session/case/CaseServer.js +14 -10
  231. package/dist/cjs/session/case/CaseServer.js.map +1 -1
  232. package/dist/cjs/session/index.d.ts +2 -1
  233. package/dist/cjs/session/index.d.ts.map +1 -1
  234. package/dist/cjs/session/index.js +2 -1
  235. package/dist/cjs/session/index.js.map +1 -1
  236. package/dist/cjs/session/pase/PaseClient.d.ts +3 -3
  237. package/dist/cjs/session/pase/PaseClient.d.ts.map +1 -1
  238. package/dist/cjs/session/pase/PaseClient.js +5 -3
  239. package/dist/cjs/session/pase/PaseClient.js.map +1 -1
  240. package/dist/cjs/session/pase/PaseServer.d.ts.map +1 -1
  241. package/dist/cjs/session/pase/PaseServer.js +13 -13
  242. package/dist/cjs/session/pase/PaseServer.js.map +1 -1
  243. package/dist/esm/action/client/ClientInteraction.d.ts.map +1 -1
  244. package/dist/esm/action/client/ClientInteraction.js +82 -34
  245. package/dist/esm/action/client/ClientInteraction.js.map +2 -2
  246. package/dist/esm/action/client/subscription/ClientSubscription.d.ts +10 -5
  247. package/dist/esm/action/client/subscription/ClientSubscription.d.ts.map +1 -1
  248. package/dist/esm/action/client/subscription/ClientSubscription.js +22 -2
  249. package/dist/esm/action/client/subscription/ClientSubscription.js.map +2 -2
  250. package/dist/esm/action/client/subscription/ClientSubscriptionHandler.js +2 -3
  251. package/dist/esm/action/client/subscription/ClientSubscriptionHandler.js.map +1 -1
  252. package/dist/esm/action/client/subscription/ClientSubscriptions.d.ts +4 -2
  253. package/dist/esm/action/client/subscription/ClientSubscriptions.d.ts.map +1 -1
  254. package/dist/esm/action/client/subscription/ClientSubscriptions.js +68 -8
  255. package/dist/esm/action/client/subscription/ClientSubscriptions.js.map +1 -1
  256. package/dist/esm/action/client/subscription/PeerSubscription.d.ts +0 -1
  257. package/dist/esm/action/client/subscription/PeerSubscription.d.ts.map +1 -1
  258. package/dist/esm/action/client/subscription/PeerSubscription.js +1 -2
  259. package/dist/esm/action/client/subscription/PeerSubscription.js.map +1 -1
  260. package/dist/esm/action/client/subscription/SustainedSubscription.d.ts +0 -2
  261. package/dist/esm/action/client/subscription/SustainedSubscription.d.ts.map +1 -1
  262. package/dist/esm/action/client/subscription/SustainedSubscription.js +2 -4
  263. package/dist/esm/action/client/subscription/SustainedSubscription.js.map +1 -1
  264. package/dist/esm/action/request/Invoke.js +2 -2
  265. package/dist/esm/action/request/Invoke.js.map +1 -1
  266. package/dist/esm/action/server/AttributeReadResponse.d.ts.map +1 -1
  267. package/dist/esm/action/server/AttributeReadResponse.js +78 -25
  268. package/dist/esm/action/server/AttributeReadResponse.js.map +1 -1
  269. package/dist/esm/action/server/AttributeWriteResponse.d.ts.map +1 -1
  270. package/dist/esm/action/server/AttributeWriteResponse.js +70 -17
  271. package/dist/esm/action/server/AttributeWriteResponse.js.map +1 -1
  272. package/dist/esm/action/server/CommandInvokeResponse.d.ts.map +1 -1
  273. package/dist/esm/action/server/CommandInvokeResponse.js +83 -30
  274. package/dist/esm/action/server/CommandInvokeResponse.js.map +1 -1
  275. package/dist/esm/action/server/DataResponse.d.ts +1 -0
  276. package/dist/esm/action/server/DataResponse.d.ts.map +1 -1
  277. package/dist/esm/action/server/DataResponse.js +3 -0
  278. package/dist/esm/action/server/DataResponse.js.map +1 -1
  279. package/dist/esm/action/server/ServerInteraction.d.ts.map +1 -1
  280. package/dist/esm/action/server/ServerInteraction.js +4 -4
  281. package/dist/esm/action/server/ServerInteraction.js.map +1 -1
  282. package/dist/esm/advertisement/Advertisement.d.ts.map +1 -1
  283. package/dist/esm/advertisement/Advertisement.js +66 -14
  284. package/dist/esm/advertisement/Advertisement.js.map +1 -1
  285. package/dist/esm/advertisement/Advertiser.d.ts +4 -1
  286. package/dist/esm/advertisement/Advertiser.d.ts.map +1 -1
  287. package/dist/esm/advertisement/Advertiser.js +63 -2
  288. package/dist/esm/advertisement/Advertiser.js.map +1 -1
  289. package/dist/esm/advertisement/ble/BleAdvertiser.d.ts +6 -1
  290. package/dist/esm/advertisement/ble/BleAdvertiser.d.ts.map +1 -1
  291. package/dist/esm/advertisement/ble/BleAdvertiser.js +1 -1
  292. package/dist/esm/advertisement/ble/BleAdvertiser.js.map +1 -1
  293. package/dist/esm/advertisement/mdns/MdnsAdvertiser.d.ts +5 -1
  294. package/dist/esm/advertisement/mdns/MdnsAdvertiser.d.ts.map +1 -1
  295. package/dist/esm/advertisement/mdns/MdnsAdvertiser.js +1 -1
  296. package/dist/esm/advertisement/mdns/MdnsAdvertiser.js.map +1 -1
  297. package/dist/esm/certificate/kinds/definitions/asn.js +2 -2
  298. package/dist/esm/certificate/kinds/definitions/asn.js.map +1 -1
  299. package/dist/esm/certificate/kinds/definitions/attestation.d.ts.map +1 -1
  300. package/dist/esm/cluster/client/AttributeClient.d.ts.map +1 -1
  301. package/dist/esm/cluster/client/AttributeClient.js +1 -1
  302. package/dist/esm/cluster/client/AttributeClient.js.map +1 -1
  303. package/dist/esm/codec/MessageCodec.d.ts +8 -1
  304. package/dist/esm/codec/MessageCodec.d.ts.map +1 -1
  305. package/dist/esm/codec/MessageCodec.js +39 -28
  306. package/dist/esm/codec/MessageCodec.js.map +2 -2
  307. package/dist/esm/common/FailsafeContext.d.ts +8 -9
  308. package/dist/esm/common/FailsafeContext.d.ts.map +1 -1
  309. package/dist/esm/common/FailsafeContext.js +27 -33
  310. package/dist/esm/common/FailsafeContext.js.map +1 -1
  311. package/dist/esm/common/FailsafeTimer.d.ts +4 -3
  312. package/dist/esm/common/FailsafeTimer.d.ts.map +1 -1
  313. package/dist/esm/common/FailsafeTimer.js +4 -4
  314. package/dist/esm/common/FailsafeTimer.js.map +1 -1
  315. package/dist/esm/common/Mark.d.ts +17 -0
  316. package/dist/esm/common/Mark.d.ts.map +1 -0
  317. package/dist/esm/common/Mark.js +18 -0
  318. package/dist/esm/common/Mark.js.map +6 -0
  319. package/dist/esm/common/index.d.ts +1 -0
  320. package/dist/esm/common/index.d.ts.map +1 -1
  321. package/dist/esm/common/index.js +1 -0
  322. package/dist/esm/common/index.js.map +1 -1
  323. package/dist/esm/fabric/Fabric.d.ts +16 -8
  324. package/dist/esm/fabric/Fabric.d.ts.map +1 -1
  325. package/dist/esm/fabric/Fabric.js +36 -18
  326. package/dist/esm/fabric/Fabric.js.map +1 -1
  327. package/dist/esm/fabric/FabricAuthority.d.ts +2 -2
  328. package/dist/esm/fabric/FabricAuthority.d.ts.map +1 -1
  329. package/dist/esm/fabric/FabricAuthority.js +5 -5
  330. package/dist/esm/fabric/FabricAuthority.js.map +1 -1
  331. package/dist/esm/fabric/FabricManager.d.ts +10 -14
  332. package/dist/esm/fabric/FabricManager.d.ts.map +1 -1
  333. package/dist/esm/fabric/FabricManager.js +45 -40
  334. package/dist/esm/fabric/FabricManager.js.map +2 -2
  335. package/dist/esm/index.d.ts +1 -1
  336. package/dist/esm/index.d.ts.map +1 -1
  337. package/dist/esm/index.js +1 -1
  338. package/dist/esm/index.js.map +1 -1
  339. package/dist/esm/interaction/AttributeDataEncoder.d.ts +1 -1
  340. package/dist/esm/interaction/InteractionClient.d.ts +2 -2
  341. package/dist/esm/interaction/InteractionClient.d.ts.map +1 -1
  342. package/dist/esm/interaction/InteractionClient.js +39 -22
  343. package/dist/esm/interaction/InteractionClient.js.map +1 -1
  344. package/dist/esm/interaction/InteractionMessenger.d.ts +2 -2
  345. package/dist/esm/interaction/InteractionMessenger.d.ts.map +1 -1
  346. package/dist/esm/interaction/InteractionMessenger.js +33 -28
  347. package/dist/esm/interaction/InteractionMessenger.js.map +1 -1
  348. package/dist/esm/interaction/Subscription.d.ts +16 -37
  349. package/dist/esm/interaction/Subscription.d.ts.map +1 -1
  350. package/dist/esm/interaction/Subscription.js +16 -69
  351. package/dist/esm/interaction/Subscription.js.map +2 -2
  352. package/dist/esm/interaction/SubscriptionClient.d.ts +2 -2
  353. package/dist/esm/interaction/SubscriptionClient.d.ts.map +1 -1
  354. package/dist/esm/interaction/SubscriptionClient.js +2 -2
  355. package/dist/esm/interaction/SubscriptionClient.js.map +1 -1
  356. package/dist/esm/mdns/MdnsClient.d.ts +10 -10
  357. package/dist/esm/mdns/MdnsClient.d.ts.map +1 -1
  358. package/dist/esm/mdns/MdnsClient.js +166 -80
  359. package/dist/esm/mdns/MdnsClient.js.map +1 -1
  360. package/dist/esm/mdns/MdnsServer.d.ts +2 -2
  361. package/dist/esm/mdns/MdnsServer.d.ts.map +1 -1
  362. package/dist/esm/mdns/MdnsServer.js +176 -94
  363. package/dist/esm/mdns/MdnsServer.js.map +2 -2
  364. package/dist/esm/mdns/MdnsService.d.ts.map +1 -1
  365. package/dist/esm/mdns/MdnsService.js +3 -2
  366. package/dist/esm/mdns/MdnsService.js.map +1 -1
  367. package/dist/esm/mdns/MdnsSocket.d.ts +3 -2
  368. package/dist/esm/mdns/MdnsSocket.d.ts.map +1 -1
  369. package/dist/esm/mdns/MdnsSocket.js +2 -1
  370. package/dist/esm/mdns/MdnsSocket.js.map +1 -1
  371. package/dist/esm/peer/ControllerCommissioner.d.ts +2 -2
  372. package/dist/esm/peer/ControllerCommissioner.d.ts.map +1 -1
  373. package/dist/esm/peer/ControllerCommissioner.js +26 -28
  374. package/dist/esm/peer/ControllerCommissioner.js.map +1 -1
  375. package/dist/esm/peer/ControllerDiscovery.d.ts +1 -1
  376. package/dist/esm/peer/ControllerDiscovery.d.ts.map +1 -1
  377. package/dist/esm/peer/ControllerDiscovery.js +1 -1
  378. package/dist/esm/peer/ControllerDiscovery.js.map +1 -1
  379. package/dist/esm/peer/Peer.d.ts +57 -0
  380. package/dist/esm/peer/Peer.d.ts.map +1 -0
  381. package/dist/esm/peer/Peer.js +162 -0
  382. package/dist/esm/peer/Peer.js.map +6 -0
  383. package/dist/esm/peer/PeerAddress.d.ts.map +1 -1
  384. package/dist/esm/peer/PeerAddress.js +5 -2
  385. package/dist/esm/peer/PeerAddress.js.map +1 -1
  386. package/dist/esm/peer/PeerAddressStore.d.ts +3 -3
  387. package/dist/esm/peer/PeerAddressStore.d.ts.map +1 -1
  388. package/dist/{cjs/peer/OperationalPeer.d.ts → esm/peer/PeerDescriptor.d.ts} +14 -7
  389. package/dist/esm/peer/PeerDescriptor.d.ts.map +1 -0
  390. package/dist/esm/peer/PeerDescriptor.js +51 -0
  391. package/dist/esm/peer/PeerDescriptor.js.map +6 -0
  392. package/dist/esm/peer/PeerSet.d.ts +23 -26
  393. package/dist/esm/peer/PeerSet.d.ts.map +1 -1
  394. package/dist/esm/peer/PeerSet.js +173 -175
  395. package/dist/esm/peer/PeerSet.js.map +2 -2
  396. package/dist/esm/peer/index.d.ts +1 -1
  397. package/dist/esm/peer/index.d.ts.map +1 -1
  398. package/dist/esm/peer/index.js +1 -1
  399. package/dist/esm/protocol/DeviceAdvertiser.js +4 -4
  400. package/dist/esm/protocol/DeviceAdvertiser.js.map +1 -1
  401. package/dist/esm/protocol/ExchangeManager.d.ts +6 -9
  402. package/dist/esm/protocol/ExchangeManager.d.ts.map +1 -1
  403. package/dist/esm/protocol/ExchangeManager.js +308 -251
  404. package/dist/esm/protocol/ExchangeManager.js.map +2 -2
  405. package/dist/esm/protocol/ExchangeProvider.d.ts +9 -11
  406. package/dist/esm/protocol/ExchangeProvider.d.ts.map +1 -1
  407. package/dist/esm/protocol/ExchangeProvider.js +81 -37
  408. package/dist/esm/protocol/ExchangeProvider.js.map +2 -2
  409. package/dist/esm/protocol/MessageChannel.d.ts +6 -7
  410. package/dist/esm/protocol/MessageChannel.d.ts.map +1 -1
  411. package/dist/esm/protocol/MessageChannel.js +22 -18
  412. package/dist/esm/protocol/MessageChannel.js.map +1 -1
  413. package/dist/esm/protocol/MessageCounter.d.ts +4 -4
  414. package/dist/esm/protocol/MessageCounter.d.ts.map +1 -1
  415. package/dist/esm/protocol/MessageCounter.js +7 -7
  416. package/dist/esm/protocol/MessageCounter.js.map +1 -1
  417. package/dist/esm/protocol/MessageExchange.d.ts +31 -20
  418. package/dist/esm/protocol/MessageExchange.d.ts.map +1 -1
  419. package/dist/esm/protocol/MessageExchange.js +318 -238
  420. package/dist/esm/protocol/MessageExchange.js.map +2 -2
  421. package/dist/esm/protocol/ProtocolMocks.d.ts +100 -0
  422. package/dist/esm/protocol/ProtocolMocks.d.ts.map +1 -0
  423. package/dist/esm/protocol/ProtocolMocks.js +230 -0
  424. package/dist/esm/protocol/ProtocolMocks.js.map +6 -0
  425. package/dist/esm/protocol/errors.d.ts +35 -0
  426. package/dist/esm/protocol/errors.d.ts.map +1 -0
  427. package/dist/esm/protocol/errors.js +30 -0
  428. package/dist/esm/protocol/errors.js.map +6 -0
  429. package/dist/esm/protocol/index.d.ts +2 -1
  430. package/dist/esm/protocol/index.d.ts.map +1 -1
  431. package/dist/esm/protocol/index.js +2 -1
  432. package/dist/esm/protocol/index.js.map +1 -1
  433. package/dist/esm/securechannel/SecureChannelMessenger.d.ts +1 -0
  434. package/dist/esm/securechannel/SecureChannelMessenger.d.ts.map +1 -1
  435. package/dist/esm/securechannel/SecureChannelMessenger.js +3 -0
  436. package/dist/esm/securechannel/SecureChannelMessenger.js.map +1 -1
  437. package/dist/esm/securechannel/SecureChannelProtocol.js +2 -2
  438. package/dist/esm/securechannel/SecureChannelProtocol.js.map +1 -1
  439. package/dist/esm/session/GroupSession.d.ts +21 -10
  440. package/dist/esm/session/GroupSession.d.ts.map +1 -1
  441. package/dist/esm/session/GroupSession.js +41 -12
  442. package/dist/esm/session/GroupSession.js.map +1 -1
  443. package/dist/esm/session/NodeSession.d.ts +56 -50
  444. package/dist/esm/session/NodeSession.d.ts.map +1 -1
  445. package/dist/esm/session/NodeSession.js +99 -105
  446. package/dist/esm/session/NodeSession.js.map +1 -1
  447. package/dist/esm/session/SecureSession.d.ts +4 -4
  448. package/dist/esm/session/SecureSession.d.ts.map +1 -1
  449. package/dist/esm/session/SecureSession.js +1 -1
  450. package/dist/esm/session/SecureSession.js.map +1 -1
  451. package/dist/esm/session/Session.d.ts +82 -66
  452. package/dist/esm/session/Session.d.ts.map +1 -1
  453. package/dist/esm/session/Session.js +223 -45
  454. package/dist/esm/session/Session.js.map +1 -1
  455. package/dist/esm/session/SessionManager.d.ts +33 -36
  456. package/dist/esm/session/SessionManager.d.ts.map +1 -1
  457. package/dist/esm/session/SessionManager.js +113 -157
  458. package/dist/esm/session/SessionManager.js.map +1 -1
  459. package/dist/esm/session/SessionParameters.d.ts +87 -0
  460. package/dist/esm/session/SessionParameters.d.ts.map +1 -0
  461. package/dist/esm/session/SessionParameters.js +61 -0
  462. package/dist/esm/session/SessionParameters.js.map +6 -0
  463. package/dist/{cjs/session/InsecureSession.d.ts → esm/session/UnsecuredSession.d.ts} +18 -16
  464. package/dist/esm/session/UnsecuredSession.d.ts.map +1 -0
  465. package/dist/esm/session/{InsecureSession.js → UnsecuredSession.js} +18 -18
  466. package/dist/esm/session/UnsecuredSession.js.map +6 -0
  467. package/dist/esm/session/case/CaseClient.d.ts.map +1 -1
  468. package/dist/esm/session/case/CaseClient.js +5 -3
  469. package/dist/esm/session/case/CaseClient.js.map +1 -1
  470. package/dist/esm/session/case/CaseServer.d.ts.map +1 -1
  471. package/dist/esm/session/case/CaseServer.js +14 -10
  472. package/dist/esm/session/case/CaseServer.js.map +1 -1
  473. package/dist/esm/session/index.d.ts +2 -1
  474. package/dist/esm/session/index.d.ts.map +1 -1
  475. package/dist/esm/session/index.js +2 -1
  476. package/dist/esm/session/index.js.map +1 -1
  477. package/dist/esm/session/pase/PaseClient.d.ts +3 -3
  478. package/dist/esm/session/pase/PaseClient.d.ts.map +1 -1
  479. package/dist/esm/session/pase/PaseClient.js +5 -3
  480. package/dist/esm/session/pase/PaseClient.js.map +1 -1
  481. package/dist/esm/session/pase/PaseServer.d.ts.map +1 -1
  482. package/dist/esm/session/pase/PaseServer.js +13 -13
  483. package/dist/esm/session/pase/PaseServer.js.map +1 -1
  484. package/package.json +6 -6
  485. package/src/action/client/ClientInteraction.ts +47 -13
  486. package/src/action/client/subscription/ClientSubscription.ts +30 -5
  487. package/src/action/client/subscription/ClientSubscriptionHandler.ts +2 -4
  488. package/src/action/client/subscription/ClientSubscriptions.ts +14 -3
  489. package/src/action/client/subscription/PeerSubscription.ts +2 -2
  490. package/src/action/client/subscription/SustainedSubscription.ts +2 -6
  491. package/src/action/request/Invoke.ts +2 -2
  492. package/src/action/server/AttributeReadResponse.ts +2 -0
  493. package/src/action/server/AttributeWriteResponse.ts +2 -0
  494. package/src/action/server/CommandInvokeResponse.ts +1 -0
  495. package/src/action/server/DataResponse.ts +4 -0
  496. package/src/action/server/ServerInteraction.ts +4 -4
  497. package/src/advertisement/Advertisement.ts +6 -7
  498. package/src/advertisement/Advertiser.ts +12 -1
  499. package/src/advertisement/ble/BleAdvertiser.ts +7 -2
  500. package/src/advertisement/mdns/MdnsAdvertiser.ts +7 -1
  501. package/src/certificate/kinds/definitions/asn.ts +2 -2
  502. package/src/certificate/kinds/definitions/attestation.ts +1 -0
  503. package/src/cluster/client/AttributeClient.ts +1 -1
  504. package/src/codec/MessageCodec.ts +39 -32
  505. package/src/common/FailsafeContext.ts +36 -39
  506. package/src/common/FailsafeTimer.ts +7 -6
  507. package/src/common/Mark.ts +17 -0
  508. package/src/common/index.ts +1 -0
  509. package/src/fabric/Fabric.ts +51 -23
  510. package/src/fabric/FabricAuthority.ts +4 -4
  511. package/src/fabric/FabricManager.ts +53 -40
  512. package/src/index.ts +3 -1
  513. package/src/interaction/InteractionClient.ts +40 -23
  514. package/src/interaction/InteractionMessenger.ts +38 -32
  515. package/src/interaction/Subscription.ts +20 -92
  516. package/src/interaction/SubscriptionClient.ts +3 -3
  517. package/src/mdns/MdnsClient.ts +20 -3
  518. package/src/mdns/MdnsServer.ts +13 -1
  519. package/src/mdns/MdnsService.ts +3 -2
  520. package/src/mdns/MdnsSocket.ts +9 -3
  521. package/src/peer/ControllerCommissioner.ts +35 -37
  522. package/src/peer/ControllerDiscovery.ts +1 -1
  523. package/src/peer/Peer.ts +161 -0
  524. package/src/peer/PeerAddress.ts +6 -2
  525. package/src/peer/PeerAddressStore.ts +3 -3
  526. package/src/peer/PeerDescriptor.ts +89 -0
  527. package/src/peer/PeerSet.ts +145 -213
  528. package/src/peer/index.ts +1 -1
  529. package/src/protocol/DeviceAdvertiser.ts +4 -4
  530. package/src/protocol/ExchangeManager.ts +161 -181
  531. package/src/protocol/ExchangeProvider.ts +31 -40
  532. package/src/protocol/MessageChannel.ts +29 -18
  533. package/src/protocol/MessageCounter.ts +8 -8
  534. package/src/protocol/MessageExchange.ts +181 -144
  535. package/src/protocol/ProtocolMocks.ts +302 -0
  536. package/src/protocol/errors.ts +44 -0
  537. package/src/protocol/index.ts +2 -1
  538. package/src/securechannel/SecureChannelMessenger.ts +4 -0
  539. package/src/securechannel/SecureChannelProtocol.ts +2 -2
  540. package/src/session/GroupSession.ts +67 -23
  541. package/src/session/NodeSession.ts +140 -136
  542. package/src/session/SecureSession.ts +6 -5
  543. package/src/session/Session.ts +234 -101
  544. package/src/session/SessionManager.ts +148 -187
  545. package/src/session/SessionParameters.ts +108 -0
  546. package/src/session/{InsecureSession.ts → UnsecuredSession.ts} +28 -26
  547. package/src/session/case/CaseClient.ts +6 -3
  548. package/src/session/case/CaseServer.ts +15 -11
  549. package/src/session/index.ts +2 -1
  550. package/src/session/pase/PaseClient.ts +12 -5
  551. package/src/session/pase/PaseServer.ts +14 -13
  552. package/dist/cjs/peer/OperationalPeer.d.ts.map +0 -1
  553. package/dist/cjs/peer/OperationalPeer.js.map +0 -6
  554. package/dist/cjs/protocol/ChannelManager.d.ts +0 -29
  555. package/dist/cjs/protocol/ChannelManager.d.ts.map +0 -1
  556. package/dist/cjs/protocol/ChannelManager.js +0 -178
  557. package/dist/cjs/protocol/ChannelManager.js.map +0 -6
  558. package/dist/cjs/session/InsecureSession.d.ts.map +0 -1
  559. package/dist/cjs/session/InsecureSession.js.map +0 -6
  560. package/dist/esm/peer/OperationalPeer.d.ts +0 -38
  561. package/dist/esm/peer/OperationalPeer.d.ts.map +0 -1
  562. package/dist/esm/peer/OperationalPeer.js +0 -6
  563. package/dist/esm/peer/OperationalPeer.js.map +0 -6
  564. package/dist/esm/protocol/ChannelManager.d.ts +0 -29
  565. package/dist/esm/protocol/ChannelManager.d.ts.map +0 -1
  566. package/dist/esm/protocol/ChannelManager.js +0 -158
  567. package/dist/esm/protocol/ChannelManager.js.map +0 -6
  568. package/dist/esm/session/InsecureSession.d.ts.map +0 -1
  569. package/dist/esm/session/InsecureSession.js.map +0 -6
  570. package/src/protocol/ChannelManager.ts +0 -180
package/src/peer/index.ts CHANGED
@@ -7,8 +7,8 @@
7
7
  export * from "./ControllerCommissioner.js";
8
8
  export * from "./ControllerCommissioningFlow.js";
9
9
  export * from "./ControllerDiscovery.js";
10
- export * from "./OperationalPeer.js";
11
10
  export * from "./PeerAddress.js";
12
11
  export * from "./PeerAddressStore.js";
12
+ export * from "./PeerDescriptor.js";
13
13
  export * from "./PeerSet.js";
14
14
  export * from "./PhysicalDeviceProperties.js";
@@ -48,7 +48,7 @@ export class DeviceAdvertiser {
48
48
  });
49
49
 
50
50
  // When a fabric is updated we might need to adjust announcements
51
- this.#observers.on(fabrics.events.updated, async fabric => {
51
+ this.#observers.on(fabrics.events.replaced, async fabric => {
52
52
  if (!this.#isOperational) {
53
53
  return;
54
54
  }
@@ -78,7 +78,7 @@ export class DeviceAdvertiser {
78
78
  });
79
79
 
80
80
  // When a fabric is deleted, cancel any active advertisement
81
- this.#observers.on(fabrics.events.deleted, fabric => {
81
+ this.#observers.on(fabrics.events.deleting, fabric => {
82
82
  Advertisement.cancelAll(this.#advertisements(ad => ad.isOperational() && ad.description.fabric === fabric));
83
83
  });
84
84
 
@@ -86,7 +86,7 @@ export class DeviceAdvertiser {
86
86
  // configured
87
87
  this.#observers.on(sessions.sessions.added, session => {
88
88
  const fabricIndex = session.fabric?.fabricIndex;
89
- const fabric = fabricIndex ? fabrics.findByIndex(fabricIndex) : undefined;
89
+ const fabric = fabricIndex ? fabrics.maybeForIndex(fabricIndex) : undefined;
90
90
  if (!fabric) {
91
91
  return;
92
92
  }
@@ -102,7 +102,7 @@ export class DeviceAdvertiser {
102
102
  // When a session is closed, conditionally resume broadcast
103
103
  this.#observers.on(sessions.sessions.deleted, session => {
104
104
  const fabricIndex = session.fabric?.fabricIndex;
105
- const fabric = fabricIndex ? fabrics.findByIndex(fabricIndex) : undefined;
105
+ const fabric = fabricIndex ? fabrics.maybeForIndex(fabricIndex) : undefined;
106
106
 
107
107
  // If this was an operational connection, readvertise if we're no longer connected to the peer
108
108
  if (fabric) {
@@ -5,7 +5,9 @@
5
5
  */
6
6
 
7
7
  import { DecodedMessage, MessageCodec, SessionType } from "#codec/MessageCodec.js";
8
+ import { Mark } from "#common/Mark.js";
8
9
  import {
10
+ BasicMultiplex,
9
11
  Bytes,
10
12
  Channel,
11
13
  ConnectionlessTransport,
@@ -14,94 +16,88 @@ import {
14
16
  Entropy,
15
17
  Environment,
16
18
  Environmental,
19
+ hex,
17
20
  ImplementationError,
21
+ Lifetime,
18
22
  Logger,
19
- MatterAggregateError,
20
- MatterError,
21
23
  MatterFlowError,
22
24
  ObserverGroup,
23
25
  UdpInterface,
24
26
  UnexpectedDataError,
25
27
  } from "#general";
26
28
  import { PeerAddress } from "#peer/PeerAddress.js";
27
- import {
28
- ChannelNotConnectedError,
29
- DEFAULT_EXPECTED_PROCESSING_TIME,
30
- MessageChannel,
31
- } from "#protocol/MessageChannel.js";
29
+ import { DEFAULT_EXPECTED_PROCESSING_TIME } from "#protocol/MessageChannel.js";
32
30
  import { SecureChannelMessenger } from "#securechannel/SecureChannelMessenger.js";
33
- import { UNICAST_UNSECURE_SESSION_ID } from "#session/InsecureSession.js";
34
31
  import { NodeSession } from "#session/NodeSession.js";
35
32
  import { Session } from "#session/Session.js";
36
33
  import { SessionManager } from "#session/SessionManager.js";
34
+ import { UNICAST_UNSECURE_SESSION_ID } from "#session/UnsecuredSession.js";
37
35
  import { NodeId, SECURE_CHANNEL_PROTOCOL_ID, SecureMessageType } from "#types";
38
- import { ChannelManager } from "./ChannelManager.js";
39
36
  import { MessageExchange, MessageExchangeContext } from "./MessageExchange.js";
40
37
  import { DuplicateMessageError } from "./MessageReceptionState.js";
41
38
  import { ProtocolHandler } from "./ProtocolHandler.js";
42
39
 
43
40
  const logger = Logger.get("ExchangeManager");
44
41
 
45
- const MAXIMUM_CONCURRENT_EXCHANGES_PER_SESSION = 5;
42
+ /**
43
+ * Maximum number of concurrent outgoing exchanges per session.
44
+ * We chose 30 under the assumption that each exchange has one message in flight and the usual SecureSession message
45
+ * counter window tracks 32 messages. So we have "2 spare messages" if really someone uses that many parallel exchanges.
46
+ * TODO: Change this into an exchange creation queue instead of hard limiting it.
47
+ */
48
+ const MAXIMUM_CONCURRENT_OUTGOING_EXCHANGES_PER_SESSION = 30;
46
49
 
47
50
  /**
48
51
  * Interfaces {@link ExchangeManager} with other components.
49
52
  */
50
53
  export interface ExchangeManagerContext {
54
+ lifetime: Lifetime.Owner;
51
55
  entropy: Entropy;
52
56
  netInterface: ConnectionlessTransportSet;
53
- sessionManager: SessionManager;
54
- channelManager: ChannelManager;
57
+ sessions: SessionManager;
55
58
  }
56
59
 
57
60
  export class ExchangeManager {
61
+ readonly #lifetime: Lifetime;
58
62
  readonly #transports: ConnectionlessTransportSet;
59
- readonly #sessionManager: SessionManager;
60
- readonly #channelManager: ChannelManager;
63
+ readonly #sessions: SessionManager;
61
64
  readonly #exchangeCounter: ExchangeCounter;
62
65
  readonly #exchanges = new Map<number, MessageExchange>();
63
66
  readonly #protocols = new Map<number, ProtocolHandler>();
64
67
  readonly #listeners = new Map<ConnectionlessTransport, ConnectionlessTransport.Listener>();
65
- readonly #closers = new Set<Promise<void>>();
68
+ readonly #workers: BasicMultiplex;
66
69
  readonly #observers = new ObserverGroup(this);
67
- #closing = false;
70
+ readonly #sessionObservers = new Map<Session, ObserverGroup>();
71
+ #isClosing = false;
68
72
 
69
73
  constructor(context: ExchangeManagerContext) {
74
+ this.#lifetime = context.lifetime.join("exchanges");
75
+ this.#workers = new BasicMultiplex();
70
76
  this.#transports = context.netInterface;
71
- this.#sessionManager = context.sessionManager;
72
- this.#channelManager = context.channelManager;
77
+ this.#sessions = context.sessions;
73
78
  this.#exchangeCounter = new ExchangeCounter(context.entropy);
74
79
 
75
80
  for (const netInterface of this.#transports) {
76
- this.#addListener(netInterface);
81
+ this.#addTransport(netInterface);
77
82
  }
78
83
 
79
- this.#observers.on(this.#transports.added, this.#addListener);
80
- this.#observers.on(this.#transports.deleted, this.#deleteListener);
81
-
82
- this.#observers.on(this.#sessionManager.sessions.deleted, session => {
83
- if (!session.closingAfterExchangeFinished) {
84
- // Delayed closing is executed when exchange is closed
85
- session.closer = this.#closeSession(session);
86
- }
87
- });
84
+ this.#observers.on(this.#transports.added, this.#addTransport);
85
+ this.#observers.on(this.#transports.deleted, this.#deleteTransport);
86
+ this.#observers.on(this.#sessions.sessions.added, this.#addSession);
87
+ this.#observers.on(this.#sessions.sessions.deleted, this.#deleteSession);
88
88
  }
89
89
 
90
90
  static [Environmental.create](env: Environment) {
91
91
  const instance = new ExchangeManager({
92
+ lifetime: env,
92
93
  entropy: env.get(Entropy),
93
94
  netInterface: env.get(ConnectionlessTransportSet),
94
- sessionManager: env.get(SessionManager),
95
- channelManager: env.get(ChannelManager),
95
+ sessions: env.get(SessionManager),
96
96
  });
97
97
  env.set(ExchangeManager, instance);
98
98
  return instance;
99
99
  }
100
100
 
101
- get channels() {
102
- return this.#channelManager;
103
- }
104
-
105
101
  hasProtocolHandler(protocolId: number) {
106
102
  return this.#protocols.has(protocolId);
107
103
  }
@@ -118,36 +114,57 @@ export class ExchangeManager {
118
114
  }
119
115
 
120
116
  initiateExchange(address: PeerAddress, protocolId: number) {
121
- return this.initiateExchangeWithChannel(this.#channelManager.getChannel(address), protocolId);
117
+ return this.initiateExchangeForSession(this.#sessions.sessionFor(address), protocolId);
122
118
  }
123
119
 
124
- initiateExchangeWithChannel(channel: MessageChannel, protocolId: number) {
120
+ initiateExchangeForSession(session: Session, protocolId: number) {
125
121
  const exchangeId = this.#exchangeCounter.getIncrementedCounter();
126
122
  const exchangeIndex = exchangeId | 0x10000; // Ensure initiated and received exchange index are different, since the exchangeID can be the same
127
- const exchange = MessageExchange.initiate(this.#messageExchangeContextFor(channel), exchangeId, protocolId);
123
+ const exchange = MessageExchange.initiate(this.#messageExchangeContextFor(session), exchangeId, protocolId);
128
124
  this.#addExchange(exchangeIndex, exchange);
129
125
  return exchange;
130
126
  }
131
127
 
132
128
  async close() {
133
- this.#closing = true;
129
+ if (this.#isClosing) {
130
+ return;
131
+ }
132
+
133
+ using closing = this.#lifetime.closing();
134
+
135
+ this.#isClosing = true;
136
+
137
+ const exchangesClosed = new BasicMultiplex();
138
+
139
+ for (const exchange of this.#exchanges.values()) {
140
+ exchangesClosed.add(exchange.close(true));
141
+ }
142
+
143
+ {
144
+ using _closing = closing.join("exchanges");
145
+ await exchangesClosed;
146
+ }
147
+
148
+ for (const listener of this.#listeners.keys()) {
149
+ this.#deleteTransport(listener);
150
+ }
151
+
134
152
  for (const protocol of this.#protocols.values()) {
135
- await protocol.close();
153
+ this.#workers.add(protocol.close());
136
154
  }
137
- for (const listeners of this.#listeners.keys()) {
138
- this.#deleteListener(listeners);
155
+
156
+ {
157
+ using _closing = closing.join("workers");
158
+ await this.#workers;
139
159
  }
140
- await MatterAggregateError.allSettled(this.#closers, "Error closing exchanges").catch(error =>
141
- logger.error(error),
142
- );
143
- await MatterAggregateError.allSettled(
144
- Array.from(this.#exchanges.values()).map(exchange => exchange.close(true)),
145
- "Error closing exchanges",
146
- ).catch(error => logger.error(error));
160
+
147
161
  this.#exchanges.clear();
162
+ this.#observers.close();
148
163
  }
149
164
 
150
- private async onMessage(channel: Channel<Bytes>, messageBytes: Bytes) {
165
+ async #onMessage(channel: Channel<Bytes>, messageBytes: Bytes) {
166
+ using _lifetime = this.#lifetime.join("receiving from", Diagnostic.strong(channel.name));
167
+
151
168
  const packet = MessageCodec.decodePacket(messageBytes);
152
169
  const bytes = Bytes.of(messageBytes);
153
170
  const aad = bytes.slice(0, bytes.length - packet.applicationPayload.byteLength); // Header+Extensions
@@ -159,25 +176,27 @@ export class ExchangeManager {
159
176
  let message: DecodedMessage | undefined;
160
177
  if (packet.header.sessionType === SessionType.Unicast) {
161
178
  if (packet.header.sessionId === UNICAST_UNSECURE_SESSION_ID) {
162
- if (this.#closing) return;
179
+ if (this.#isClosing) return;
163
180
  const initiatorNodeId = packet.header.sourceNodeId ?? NodeId.UNSPECIFIED_NODE_ID;
164
181
  session =
165
- this.#sessionManager.getUnsecureSession(initiatorNodeId) ??
166
- this.#sessionManager.createInsecureSession({
182
+ this.#sessions.getUnsecuredSession(initiatorNodeId) ??
183
+ this.#sessions.createUnsecuredSession({
184
+ channel,
167
185
  initiatorNodeId,
168
186
  });
169
187
  } else {
170
- session = this.#sessionManager.getSession(packet.header.sessionId);
188
+ session = this.#sessions.getSession(packet.header.sessionId);
171
189
  }
172
190
 
173
191
  if (session === undefined) {
174
- throw new MatterFlowError(
175
- `Cannot find a session for ID ${packet.header.sessionId}${
192
+ logger.warn(
193
+ `Ignoring message for unknown session ${Session.idStrOf(packet)}${
176
194
  packet.header.sourceNodeId !== undefined
177
- ? ` and source NodeId ${packet.header.sourceNodeId}`
195
+ ? ` from node ${hex.fixed(packet.header.sourceNodeId, 16)}`
178
196
  : ""
179
197
  }`,
180
198
  );
199
+ return;
181
200
  }
182
201
 
183
202
  message = session.decode(packet, aad);
@@ -190,13 +209,13 @@ export class ExchangeManager {
190
209
  isDuplicate = true;
191
210
  }
192
211
  } else if (packet.header.sessionType === SessionType.Group) {
193
- if (this.#closing) return;
212
+ if (this.#isClosing) return;
194
213
  if (packet.header.sourceNodeId === undefined) {
195
214
  throw new UnexpectedDataError("Group session message must include a source NodeId");
196
215
  }
197
216
 
198
217
  let key: Bytes;
199
- ({ session, message, key } = this.#sessionManager.groupSessionFromPacket(packet, aad));
218
+ ({ session, message, key } = this.#sessions.groupSessionFromPacket(packet, aad));
200
219
 
201
220
  try {
202
221
  session.updateMessageCounter(messageId, packet.header.sourceNodeId, key);
@@ -231,19 +250,18 @@ export class ExchangeManager {
231
250
  exId: message.payloadHeader.exchangeId,
232
251
  via: channel.name,
233
252
  });
253
+
234
254
  if (exchange !== undefined) {
235
- if (
236
- exchange.requiresSecureSession !== session.isSecure ||
237
- exchange.session.id !== packet.header.sessionId ||
238
- (exchange.isClosing && !isStandaloneAck)
239
- ) {
255
+ this.#lifetime.details.exchange = exchange.idStr;
256
+ if (exchange.session.id !== packet.header.sessionId || (exchange.isClosing && !isStandaloneAck)) {
240
257
  logger.debug(
241
- "Ignore « message because",
258
+ exchange.via,
259
+ "Ignore",
260
+ Mark.INBOUND,
261
+ "message because",
242
262
  exchange.isClosing
243
263
  ? "exchange is closing"
244
- : exchange.session.id !== packet.header.sessionId
245
- ? `session ID mismatch ${exchange.session.id} vs ${packet.header.sessionId}`
246
- : `session security requirements (${exchange.requiresSecureSession}) not fulfilled`,
264
+ : `session ID mismatch (header session is ${Session.idStrOf(packet)}`,
247
265
  messageDiagnostics,
248
266
  );
249
267
 
@@ -257,10 +275,10 @@ export class ExchangeManager {
257
275
 
258
276
  await exchange.onMessageReceived(message, isDuplicate);
259
277
  } else {
260
- if (this.#closing) return;
261
- if (session.closingAfterExchangeFinished) {
278
+ if (this.#isClosing) return;
279
+ if (session.isClosing) {
262
280
  throw new MatterFlowError(
263
- `Session with ID ${packet.header.sessionId} marked for closure, decline new exchange creation.`,
281
+ `Declining new exchange because session ${Session.idStrOf(packet)} is closing`,
264
282
  );
265
283
  }
266
284
 
@@ -273,7 +291,9 @@ export class ExchangeManager {
273
291
  // TODO When adding Group sessions, we need to check how to adjust that handling
274
292
  if (handlerSecurityMismatch) {
275
293
  logger.debug(
276
- `Ignore « message because not matching the security requirements (${protocolHandler.requiresSecureSession} vs. ${session.isSecure})`,
294
+ "Ignore",
295
+ Mark.INBOUND,
296
+ `message because not matching the security requirements (${protocolHandler.requiresSecureSession} vs. ${session.isSecure})`,
277
297
  messageDiagnostics,
278
298
  );
279
299
  }
@@ -285,29 +305,25 @@ export class ExchangeManager {
285
305
  !handlerSecurityMismatch
286
306
  ) {
287
307
  if (isStandaloneAck && !message.payloadHeader.requiresAck) {
288
- logger.debug("Ignore « unsolicited standalone ack message", messageDiagnostics);
308
+ logger.debug("Ignore", Mark.INBOUND, "unsolicited standalone ack message", messageDiagnostics);
289
309
  return;
290
310
  }
291
311
 
292
- const exchange = MessageExchange.fromInitialMessage(
293
- this.#messageExchangeContextFor(await this.#channelManager.getOrCreateChannel(channel, session)),
294
- message,
295
- );
312
+ const exchange = MessageExchange.fromInitialMessage(this.#messageExchangeContextFor(session), message);
313
+ this.#lifetime.details.exchange = exchange.idStr;
296
314
  this.#addExchange(exchangeIndex, exchange);
297
315
  await exchange.onMessageReceived(message);
298
316
  await protocolHandler.onNewExchange(exchange, message);
299
317
  } else if (message.payloadHeader.requiresAck) {
300
- const exchange = MessageExchange.fromInitialMessage(
301
- this.#messageExchangeContextFor(await this.#channelManager.getOrCreateChannel(channel, session)),
302
- message,
303
- );
318
+ const exchange = MessageExchange.fromInitialMessage(this.#messageExchangeContextFor(session), message);
319
+ this.#lifetime.details.exchange = exchange.idStr;
304
320
  this.#addExchange(exchangeIndex, exchange);
305
321
  await exchange.send(SecureMessageType.StandaloneAck, new Uint8Array(0), {
306
322
  includeAcknowledgeMessageId: message.packetHeader.messageId,
307
323
  protocolId: SECURE_CHANNEL_PROTOCOL_ID,
308
324
  });
309
325
  await exchange.close();
310
- logger.debug("Ignore « unsolicited message", messageDiagnostics);
326
+ logger.debug("Ignore", Mark.INBOUND, "unsolicited message", messageDiagnostics);
311
327
  } else {
312
328
  if (protocolHandler === undefined) {
313
329
  throw new MatterFlowError(`Unsupported protocol ${message.payloadHeader.protocolId}`);
@@ -315,82 +331,25 @@ export class ExchangeManager {
315
331
  if (isDuplicate) {
316
332
  if (message.packetHeader.destGroupId === undefined) {
317
333
  // Duplicate Non-Group messages are still interesting to log to know them
318
- logger.debug("Ignore « duplicate message", messageDiagnostics);
334
+ logger.debug("Ignore", Mark.INBOUND, "duplicate message", messageDiagnostics);
319
335
  }
320
336
  return;
321
337
  }
322
338
  if (!isStandaloneAck) {
323
- logger.info("Discard « unexpected message", messageDiagnostics, Diagnostic.json(message));
339
+ logger.info(
340
+ "Discard",
341
+ Mark.INBOUND,
342
+ "unexpected message",
343
+ messageDiagnostics,
344
+ Diagnostic.json(message),
345
+ );
324
346
  }
325
347
  }
326
348
  }
327
349
  }
328
350
 
329
351
  async deleteExchange(exchangeIndex: number) {
330
- const exchange = this.#exchanges.get(exchangeIndex);
331
- if (exchange === undefined) {
332
- logger.info(`Exchange with index ${exchangeIndex} to delete not found or already deleted.`);
333
- return;
334
- }
335
- const { session } = exchange;
336
352
  this.#exchanges.delete(exchangeIndex);
337
- if (NodeSession.is(session) && session.closingAfterExchangeFinished) {
338
- logger.debug(
339
- `Exchange index ${exchangeIndex} on Session ${session.name} is already marked for closure. Close session now.`,
340
- );
341
- try {
342
- await this.#closeSession(session);
343
- } catch (error) {
344
- logger.error(`Error closing session ${session.name}. Ignoring.`, error);
345
- }
346
- }
347
- }
348
-
349
- async #closeSession(session: NodeSession) {
350
- const sessionId = session.id;
351
- const sessionName = session.name;
352
-
353
- const asExchangeSession = session as { closedByExchange?: boolean };
354
- if (asExchangeSession.closedByExchange) {
355
- // Session already removed, so we do not need to close again
356
- return;
357
- }
358
- asExchangeSession.closedByExchange = true;
359
-
360
- for (const [_exchangeIndex, exchange] of this.#exchanges.entries()) {
361
- if (exchange.session.id === sessionId) {
362
- await exchange.destroy();
363
- }
364
- }
365
- if (session.sendCloseMessageWhenClosing) {
366
- let channel;
367
- try {
368
- channel = this.#channelManager.getChannelForSession(session);
369
- } catch (e) {
370
- logger.debug(`Not sending close for session ${sessionName}:`, e);
371
- return;
372
- }
373
- logger.debug(`Channel for session ${sessionName} is ${channel?.name}`);
374
- if (channel !== undefined) {
375
- const exchange = this.initiateExchangeWithChannel(channel, SECURE_CHANNEL_PROTOCOL_ID);
376
- logger.debug(`Initiated exchange ${exchange.id} to close session ${sessionName}`);
377
- try {
378
- const messenger = new SecureChannelMessenger(exchange);
379
- await messenger.sendCloseSession();
380
- await messenger.close();
381
- } catch (error) {
382
- if (error instanceof ChannelNotConnectedError) {
383
- logger.debug("Session already closed because channel is disconnected.");
384
- } else {
385
- logger.error("Error closing session", error);
386
- }
387
- }
388
- await exchange.destroy();
389
- }
390
- }
391
- if (session.closingAfterExchangeFinished) {
392
- await session.destroy(false, false);
393
- }
394
353
  }
395
354
 
396
355
  #addExchange(exchangeIndex: number, exchange: MessageExchange) {
@@ -409,37 +368,39 @@ export class ExchangeManager {
409
368
  return;
410
369
  }
411
370
  const sessionExchanges = Array.from(this.#exchanges.values()).filter(
412
- exchange => exchange.session.id === sessionId && !exchange.isClosing,
371
+ exchange => exchange.session.id === sessionId && !exchange.isClosing && exchange.isInitiator,
413
372
  );
414
- if (sessionExchanges.length <= MAXIMUM_CONCURRENT_EXCHANGES_PER_SESSION) {
373
+ if (sessionExchanges.length <= MAXIMUM_CONCURRENT_OUTGOING_EXCHANGES_PER_SESSION) {
415
374
  return;
416
375
  }
417
376
  // let's use the first entry in the Map as the oldest exchange and close it
377
+ // TODO: Adjust this logic into a Exchange creation queue instead of hard closing
418
378
  const exchangeToClose = sessionExchanges[0];
419
- logger.debug(`Closing oldest exchange ${exchangeToClose.id} for session ${sessionId}`);
420
- exchangeToClose.close().catch(error => logger.error("Error closing exchange", error)); // TODO Promise??
379
+ logger.info(
380
+ exchangeToClose.via,
381
+ `Closing oldest exchange for session because of too many concurrent outgoing exchanges. Ensure to not send that many parallel messages to one peer.`,
382
+ );
383
+ logger.debug(exchangeToClose.via, "Closing oldest exchange");
384
+ this.#workers.add(exchangeToClose.close());
421
385
  }
422
386
 
423
- calculateMaximumPeerResponseTimeMsFor(
424
- channel: MessageChannel,
425
- expectedProcessingTime = DEFAULT_EXPECTED_PROCESSING_TIME,
426
- ) {
427
- return channel.calculateMaximumPeerResponseTime(
428
- channel.session.parameters,
429
- this.#sessionManager.sessionParameters,
387
+ calculateMaximumPeerResponseTimeMsFor(session: Session, expectedProcessingTime = DEFAULT_EXPECTED_PROCESSING_TIME) {
388
+ return session.channel.calculateMaximumPeerResponseTime(
389
+ session.parameters,
390
+ this.#sessions.sessionParameters,
430
391
  expectedProcessingTime,
431
392
  );
432
393
  }
433
394
 
434
- #messageExchangeContextFor(channel: MessageChannel): MessageExchangeContext {
395
+ #messageExchangeContextFor(session: Session): MessageExchangeContext {
435
396
  return {
436
- channel,
437
- localSessionParameters: this.#sessionManager.sessionParameters,
438
- retry: number => this.#sessionManager.retry.emit(channel.session, number),
397
+ session,
398
+ localSessionParameters: this.#sessions.sessionParameters,
399
+ retry: number => this.#sessions.retry.emit(session, number),
439
400
  };
440
401
  }
441
402
 
442
- #addListener(netInterface: ConnectionlessTransport) {
403
+ #addTransport(netInterface: ConnectionlessTransport) {
443
404
  const udpInterface = netInterface instanceof UdpInterface;
444
405
  this.#listeners.set(
445
406
  netInterface,
@@ -451,35 +412,54 @@ export class ExchangeManager {
451
412
  return;
452
413
  }
453
414
 
454
- try {
455
- this.onMessage(socket, data).catch(error =>
456
- logger.info(
457
- `Error on channel ${socket.name}:`,
458
- error instanceof MatterError ? error.message : error,
459
- ),
460
- );
461
- } catch (error) {
462
- logger.info(
463
- `Ignoring UDP message on channel ${socket.name} with error`,
464
- error instanceof MatterError ? error.message : error,
465
- );
466
- }
415
+ this.#workers.add(this.#onMessage(socket, data));
467
416
  }),
468
417
  );
469
418
  }
470
419
 
471
- #deleteListener(netInterface: ConnectionlessTransport) {
420
+ #deleteTransport(netInterface: ConnectionlessTransport) {
472
421
  const listener = this.#listeners.get(netInterface);
473
422
  if (listener === undefined) {
474
423
  return;
475
424
  }
476
425
  this.#listeners.delete(netInterface);
477
426
 
478
- const closer = listener
479
- .close()
480
- .catch(e => logger.error("Error closing network listener", e))
481
- .finally(() => this.#closers.delete(closer));
482
- this.#closers.add(closer);
427
+ this.#workers.add(listener.close());
428
+ }
429
+
430
+ #addSession(session: Session) {
431
+ if (!(session instanceof NodeSession)) {
432
+ return;
433
+ }
434
+
435
+ let observers = this.#sessionObservers.get(session);
436
+ if (!observers) {
437
+ this.#sessionObservers.set(session, (observers = new ObserverGroup()));
438
+ }
439
+
440
+ observers.on(session.gracefulClose, () => this.#sendCloseSession(session));
441
+ }
442
+
443
+ #deleteSession(session: Session) {
444
+ const observers = this.#sessionObservers.get(session);
445
+ if (!observers) {
446
+ return;
447
+ }
448
+
449
+ observers.close();
450
+ this.#sessionObservers.delete(session);
451
+ }
452
+
453
+ async #sendCloseSession(session: NodeSession) {
454
+ await using exchange = this.initiateExchangeForSession(session, SECURE_CHANNEL_PROTOCOL_ID);
455
+ logger.debug(exchange.via, "Closing session");
456
+ try {
457
+ const messenger = new SecureChannelMessenger(exchange);
458
+ await messenger.sendCloseSession();
459
+ await messenger.close();
460
+ } catch (error) {
461
+ logger.error(exchange.via, "Error closing session:", error);
462
+ }
483
463
  }
484
464
  }
485
465