@matter/protocol 0.16.0-alpha.0-20251213-e83db3732 → 0.16.0-alpha.0-20251217-038f88085

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 (309) hide show
  1. package/LICENSE +1 -1
  2. package/dist/cjs/action/client/ClientInteraction.d.ts +12 -5
  3. package/dist/cjs/action/client/ClientInteraction.d.ts.map +1 -1
  4. package/dist/cjs/action/client/ClientInteraction.js +39 -15
  5. package/dist/cjs/action/client/ClientInteraction.js.map +1 -1
  6. package/dist/cjs/action/client/ClientRead.d.ts +10 -0
  7. package/dist/cjs/action/client/ClientRead.d.ts.map +1 -0
  8. package/dist/cjs/action/client/ClientRead.js +22 -0
  9. package/dist/cjs/action/client/ClientRead.js.map +6 -0
  10. package/dist/cjs/action/client/ClientRequest.d.ts +20 -0
  11. package/dist/cjs/action/client/ClientRequest.d.ts.map +1 -0
  12. package/dist/cjs/action/client/ClientRequest.js +22 -0
  13. package/dist/cjs/action/client/ClientRequest.js.map +6 -0
  14. package/dist/cjs/action/client/ClientWrite.d.ts +10 -0
  15. package/dist/cjs/action/client/ClientWrite.d.ts.map +1 -0
  16. package/dist/cjs/action/client/ClientWrite.js +22 -0
  17. package/dist/cjs/action/client/ClientWrite.js.map +6 -0
  18. package/dist/cjs/action/client/QueuedClientInteraction.d.ts +49 -0
  19. package/dist/cjs/action/client/QueuedClientInteraction.d.ts.map +1 -0
  20. package/dist/cjs/action/client/QueuedClientInteraction.js +160 -0
  21. package/dist/cjs/action/client/QueuedClientInteraction.js.map +6 -0
  22. package/dist/cjs/action/client/index.d.ts +4 -0
  23. package/dist/cjs/action/client/index.d.ts.map +1 -1
  24. package/dist/cjs/action/client/index.js +4 -0
  25. package/dist/cjs/action/client/index.js.map +1 -1
  26. package/dist/cjs/action/client/subscription/ClientSubscribe.d.ts +2 -1
  27. package/dist/cjs/action/client/subscription/ClientSubscribe.d.ts.map +1 -1
  28. package/dist/cjs/action/client/subscription/ClientSubscriptionHandler.d.ts.map +1 -1
  29. package/dist/cjs/action/client/subscription/ClientSubscriptionHandler.js +14 -3
  30. package/dist/cjs/action/client/subscription/ClientSubscriptionHandler.js.map +1 -1
  31. package/dist/cjs/action/client/subscription/SustainedSubscription.d.ts +1 -1
  32. package/dist/cjs/action/client/subscription/SustainedSubscription.d.ts.map +1 -1
  33. package/dist/cjs/action/client/subscription/SustainedSubscription.js +1 -4
  34. package/dist/cjs/action/client/subscription/SustainedSubscription.js.map +1 -1
  35. package/dist/cjs/action/request/Invoke.d.ts +7 -1
  36. package/dist/cjs/action/request/Invoke.d.ts.map +1 -1
  37. package/dist/cjs/action/request/Invoke.js +0 -3
  38. package/dist/cjs/action/request/Invoke.js.map +1 -1
  39. package/dist/cjs/action/request/Read.d.ts.map +1 -1
  40. package/dist/cjs/action/request/Read.js +3 -2
  41. package/dist/cjs/action/request/Read.js.map +1 -1
  42. package/dist/cjs/action/request/Specifier.d.ts +1 -1
  43. package/dist/cjs/action/request/Specifier.d.ts.map +1 -1
  44. package/dist/cjs/action/request/Specifier.js +3 -0
  45. package/dist/cjs/action/request/Specifier.js.map +1 -1
  46. package/dist/cjs/action/request/Write.d.ts +1 -0
  47. package/dist/cjs/action/request/Write.d.ts.map +1 -1
  48. package/dist/cjs/action/request/Write.js +10 -2
  49. package/dist/cjs/action/request/Write.js.map +1 -1
  50. package/dist/cjs/action/response/ReadResult.d.ts +1 -1
  51. package/dist/cjs/action/response/ReadResult.d.ts.map +1 -1
  52. package/dist/cjs/cluster/client/ClusterClientTypes.d.ts +37 -8
  53. package/dist/cjs/cluster/client/ClusterClientTypes.d.ts.map +1 -1
  54. package/dist/cjs/cluster/client/index.d.ts +0 -3
  55. package/dist/cjs/cluster/client/index.d.ts.map +1 -1
  56. package/dist/cjs/cluster/client/index.js +0 -3
  57. package/dist/cjs/cluster/client/index.js.map +1 -1
  58. package/dist/cjs/interaction/InteractionMessenger.d.ts.map +1 -1
  59. package/dist/cjs/interaction/InteractionMessenger.js +3 -2
  60. package/dist/cjs/interaction/InteractionMessenger.js.map +1 -1
  61. package/dist/cjs/interaction/SubscriptionClient.d.ts.map +1 -1
  62. package/dist/cjs/interaction/SubscriptionClient.js +2 -1
  63. package/dist/cjs/interaction/SubscriptionClient.js.map +1 -1
  64. package/dist/cjs/interaction/index.d.ts +1 -1
  65. package/dist/cjs/interaction/index.d.ts.map +1 -1
  66. package/dist/cjs/interaction/index.js +1 -1
  67. package/dist/cjs/interaction/index.js.map +1 -1
  68. package/dist/cjs/peer/CommissioningError.d.ts +13 -0
  69. package/dist/cjs/peer/CommissioningError.d.ts.map +1 -0
  70. package/dist/cjs/peer/CommissioningError.js +32 -0
  71. package/dist/cjs/peer/CommissioningError.js.map +6 -0
  72. package/dist/cjs/peer/ControllerCommissioner.d.ts +2 -3
  73. package/dist/cjs/peer/ControllerCommissioner.d.ts.map +1 -1
  74. package/dist/cjs/peer/ControllerCommissioner.js +20 -13
  75. package/dist/cjs/peer/ControllerCommissioner.js.map +2 -2
  76. package/dist/cjs/peer/ControllerCommissioningFlow.d.ts +7 -16
  77. package/dist/cjs/peer/ControllerCommissioningFlow.d.ts.map +1 -1
  78. package/dist/cjs/peer/ControllerCommissioningFlow.js +395 -178
  79. package/dist/cjs/peer/ControllerCommissioningFlow.js.map +1 -1
  80. package/dist/cjs/peer/ControllerDiscovery.d.ts +4 -0
  81. package/dist/cjs/peer/ControllerDiscovery.d.ts.map +1 -1
  82. package/dist/cjs/peer/ControllerDiscovery.js +6 -3
  83. package/dist/cjs/peer/ControllerDiscovery.js.map +1 -1
  84. package/dist/cjs/peer/InteractionQueue.d.ts +2 -2
  85. package/dist/cjs/peer/InteractionQueue.d.ts.map +1 -1
  86. package/dist/cjs/peer/InteractionQueue.js +1 -1
  87. package/dist/cjs/peer/InteractionQueue.js.map +1 -1
  88. package/dist/cjs/peer/PeerAddressStore.d.ts +0 -9
  89. package/dist/cjs/peer/PeerAddressStore.d.ts.map +1 -1
  90. package/dist/cjs/peer/PeerAddressStore.js.map +1 -1
  91. package/dist/cjs/peer/PeerSet.d.ts +0 -2
  92. package/dist/cjs/peer/PeerSet.d.ts.map +1 -1
  93. package/dist/cjs/peer/PeerSet.js +32 -18
  94. package/dist/cjs/peer/PeerSet.js.map +1 -1
  95. package/dist/cjs/peer/PhysicalDeviceProperties.js +1 -1
  96. package/dist/cjs/peer/PhysicalDeviceProperties.js.map +1 -1
  97. package/dist/cjs/peer/index.d.ts +1 -0
  98. package/dist/cjs/peer/index.d.ts.map +1 -1
  99. package/dist/cjs/peer/index.js +1 -0
  100. package/dist/cjs/peer/index.js.map +1 -1
  101. package/dist/cjs/protocol/DeviceCommissioner.d.ts.map +1 -1
  102. package/dist/cjs/protocol/DeviceCommissioner.js.map +1 -1
  103. package/dist/cjs/protocol/ExchangeManager.js +2 -2
  104. package/dist/cjs/protocol/ExchangeManager.js.map +1 -1
  105. package/dist/cjs/protocol/ExchangeProvider.d.ts +13 -4
  106. package/dist/cjs/protocol/ExchangeProvider.d.ts.map +1 -1
  107. package/dist/cjs/protocol/ExchangeProvider.js +5 -3
  108. package/dist/cjs/protocol/ExchangeProvider.js.map +1 -1
  109. package/dist/cjs/session/NodeSession.d.ts +5 -2
  110. package/dist/cjs/session/NodeSession.d.ts.map +1 -1
  111. package/dist/cjs/session/NodeSession.js +5 -4
  112. package/dist/cjs/session/NodeSession.js.map +1 -1
  113. package/dist/cjs/session/Session.d.ts +5 -3
  114. package/dist/cjs/session/Session.d.ts.map +1 -1
  115. package/dist/cjs/session/Session.js +8 -4
  116. package/dist/cjs/session/Session.js.map +1 -1
  117. package/dist/cjs/session/SessionManager.d.ts +8 -0
  118. package/dist/cjs/session/SessionManager.d.ts.map +1 -1
  119. package/dist/cjs/session/SessionManager.js +16 -2
  120. package/dist/cjs/session/SessionManager.js.map +1 -1
  121. package/dist/esm/action/client/ClientInteraction.d.ts +12 -5
  122. package/dist/esm/action/client/ClientInteraction.d.ts.map +1 -1
  123. package/dist/esm/action/client/ClientInteraction.js +42 -16
  124. package/dist/esm/action/client/ClientInteraction.js.map +1 -1
  125. package/dist/esm/action/client/ClientRead.d.ts +10 -0
  126. package/dist/esm/action/client/ClientRead.d.ts.map +1 -0
  127. package/dist/esm/action/client/ClientRead.js +6 -0
  128. package/dist/esm/action/client/ClientRead.js.map +6 -0
  129. package/dist/esm/action/client/ClientRequest.d.ts +20 -0
  130. package/dist/esm/action/client/ClientRequest.d.ts.map +1 -0
  131. package/dist/esm/action/client/ClientRequest.js +6 -0
  132. package/dist/esm/action/client/ClientRequest.js.map +6 -0
  133. package/dist/esm/action/client/ClientWrite.d.ts +10 -0
  134. package/dist/esm/action/client/ClientWrite.d.ts.map +1 -0
  135. package/dist/esm/action/client/ClientWrite.js +6 -0
  136. package/dist/esm/action/client/ClientWrite.js.map +6 -0
  137. package/dist/esm/action/client/QueuedClientInteraction.d.ts +49 -0
  138. package/dist/esm/action/client/QueuedClientInteraction.d.ts.map +1 -0
  139. package/dist/esm/action/client/QueuedClientInteraction.js +140 -0
  140. package/dist/esm/action/client/QueuedClientInteraction.js.map +6 -0
  141. package/dist/esm/action/client/index.d.ts +4 -0
  142. package/dist/esm/action/client/index.d.ts.map +1 -1
  143. package/dist/esm/action/client/index.js +4 -0
  144. package/dist/esm/action/client/index.js.map +1 -1
  145. package/dist/esm/action/client/subscription/ClientSubscribe.d.ts +2 -1
  146. package/dist/esm/action/client/subscription/ClientSubscribe.d.ts.map +1 -1
  147. package/dist/esm/action/client/subscription/ClientSubscriptionHandler.d.ts.map +1 -1
  148. package/dist/esm/action/client/subscription/ClientSubscriptionHandler.js +14 -3
  149. package/dist/esm/action/client/subscription/ClientSubscriptionHandler.js.map +1 -1
  150. package/dist/esm/action/client/subscription/SustainedSubscription.d.ts +1 -1
  151. package/dist/esm/action/client/subscription/SustainedSubscription.d.ts.map +1 -1
  152. package/dist/esm/action/client/subscription/SustainedSubscription.js +1 -4
  153. package/dist/esm/action/client/subscription/SustainedSubscription.js.map +1 -1
  154. package/dist/esm/action/request/Invoke.d.ts +7 -1
  155. package/dist/esm/action/request/Invoke.d.ts.map +1 -1
  156. package/dist/esm/action/request/Invoke.js +0 -3
  157. package/dist/esm/action/request/Invoke.js.map +1 -1
  158. package/dist/esm/action/request/Read.d.ts.map +1 -1
  159. package/dist/esm/action/request/Read.js +3 -2
  160. package/dist/esm/action/request/Read.js.map +1 -1
  161. package/dist/esm/action/request/Specifier.d.ts +1 -1
  162. package/dist/esm/action/request/Specifier.d.ts.map +1 -1
  163. package/dist/esm/action/request/Specifier.js +3 -0
  164. package/dist/esm/action/request/Specifier.js.map +1 -1
  165. package/dist/esm/action/request/Write.d.ts +1 -0
  166. package/dist/esm/action/request/Write.d.ts.map +1 -1
  167. package/dist/esm/action/request/Write.js +10 -2
  168. package/dist/esm/action/request/Write.js.map +1 -1
  169. package/dist/esm/action/response/ReadResult.d.ts +1 -1
  170. package/dist/esm/action/response/ReadResult.d.ts.map +1 -1
  171. package/dist/esm/cluster/client/ClusterClientTypes.d.ts +37 -8
  172. package/dist/esm/cluster/client/ClusterClientTypes.d.ts.map +1 -1
  173. package/dist/esm/cluster/client/index.d.ts +0 -3
  174. package/dist/esm/cluster/client/index.d.ts.map +1 -1
  175. package/dist/esm/cluster/client/index.js +0 -3
  176. package/dist/esm/cluster/client/index.js.map +1 -1
  177. package/dist/esm/interaction/InteractionMessenger.d.ts.map +1 -1
  178. package/dist/esm/interaction/InteractionMessenger.js +4 -3
  179. package/dist/esm/interaction/InteractionMessenger.js.map +1 -1
  180. package/dist/esm/interaction/SubscriptionClient.d.ts.map +1 -1
  181. package/dist/esm/interaction/SubscriptionClient.js +2 -1
  182. package/dist/esm/interaction/SubscriptionClient.js.map +1 -1
  183. package/dist/esm/interaction/index.d.ts +1 -1
  184. package/dist/esm/interaction/index.d.ts.map +1 -1
  185. package/dist/esm/interaction/index.js +1 -1
  186. package/dist/esm/peer/CommissioningError.d.ts +13 -0
  187. package/dist/esm/peer/CommissioningError.d.ts.map +1 -0
  188. package/dist/esm/peer/CommissioningError.js +12 -0
  189. package/dist/esm/peer/CommissioningError.js.map +6 -0
  190. package/dist/esm/peer/ControllerCommissioner.d.ts +2 -3
  191. package/dist/esm/peer/ControllerCommissioner.d.ts.map +1 -1
  192. package/dist/esm/peer/ControllerCommissioner.js +19 -13
  193. package/dist/esm/peer/ControllerCommissioner.js.map +2 -2
  194. package/dist/esm/peer/ControllerCommissioningFlow.d.ts +7 -16
  195. package/dist/esm/peer/ControllerCommissioningFlow.d.ts.map +1 -1
  196. package/dist/esm/peer/ControllerCommissioningFlow.js +380 -162
  197. package/dist/esm/peer/ControllerCommissioningFlow.js.map +1 -1
  198. package/dist/esm/peer/ControllerDiscovery.d.ts +4 -0
  199. package/dist/esm/peer/ControllerDiscovery.d.ts.map +1 -1
  200. package/dist/esm/peer/ControllerDiscovery.js +4 -1
  201. package/dist/esm/peer/ControllerDiscovery.js.map +1 -1
  202. package/dist/esm/peer/InteractionQueue.d.ts +2 -2
  203. package/dist/esm/peer/InteractionQueue.d.ts.map +1 -1
  204. package/dist/esm/peer/InteractionQueue.js +2 -2
  205. package/dist/esm/peer/InteractionQueue.js.map +1 -1
  206. package/dist/esm/peer/PeerAddressStore.d.ts +0 -9
  207. package/dist/esm/peer/PeerAddressStore.d.ts.map +1 -1
  208. package/dist/esm/peer/PeerAddressStore.js.map +1 -1
  209. package/dist/esm/peer/PeerSet.d.ts +0 -2
  210. package/dist/esm/peer/PeerSet.d.ts.map +1 -1
  211. package/dist/esm/peer/PeerSet.js +32 -18
  212. package/dist/esm/peer/PeerSet.js.map +1 -1
  213. package/dist/esm/peer/PhysicalDeviceProperties.js +1 -1
  214. package/dist/esm/peer/PhysicalDeviceProperties.js.map +1 -1
  215. package/dist/esm/peer/index.d.ts +1 -0
  216. package/dist/esm/peer/index.d.ts.map +1 -1
  217. package/dist/esm/peer/index.js +1 -0
  218. package/dist/esm/peer/index.js.map +1 -1
  219. package/dist/esm/protocol/DeviceCommissioner.d.ts.map +1 -1
  220. package/dist/esm/protocol/DeviceCommissioner.js.map +1 -1
  221. package/dist/esm/protocol/ExchangeManager.js +2 -2
  222. package/dist/esm/protocol/ExchangeManager.js.map +1 -1
  223. package/dist/esm/protocol/ExchangeProvider.d.ts +13 -4
  224. package/dist/esm/protocol/ExchangeProvider.d.ts.map +1 -1
  225. package/dist/esm/protocol/ExchangeProvider.js +5 -3
  226. package/dist/esm/protocol/ExchangeProvider.js.map +1 -1
  227. package/dist/esm/session/NodeSession.d.ts +5 -2
  228. package/dist/esm/session/NodeSession.d.ts.map +1 -1
  229. package/dist/esm/session/NodeSession.js +5 -4
  230. package/dist/esm/session/NodeSession.js.map +1 -1
  231. package/dist/esm/session/Session.d.ts +5 -3
  232. package/dist/esm/session/Session.d.ts.map +1 -1
  233. package/dist/esm/session/Session.js +8 -4
  234. package/dist/esm/session/Session.js.map +1 -1
  235. package/dist/esm/session/SessionManager.d.ts +8 -0
  236. package/dist/esm/session/SessionManager.d.ts.map +1 -1
  237. package/dist/esm/session/SessionManager.js +17 -2
  238. package/dist/esm/session/SessionManager.js.map +1 -1
  239. package/package.json +6 -6
  240. package/src/action/client/ClientInteraction.ts +58 -19
  241. package/src/action/client/ClientRead.ts +10 -0
  242. package/src/action/client/ClientRequest.ts +20 -0
  243. package/src/action/client/ClientWrite.ts +10 -0
  244. package/src/action/client/QueuedClientInteraction.ts +91 -0
  245. package/src/action/client/index.ts +4 -0
  246. package/src/action/client/subscription/ClientSubscribe.ts +2 -1
  247. package/src/action/client/subscription/ClientSubscriptionHandler.ts +14 -3
  248. package/src/action/client/subscription/SustainedSubscription.ts +6 -9
  249. package/src/action/request/Invoke.ts +11 -4
  250. package/src/action/request/Read.ts +3 -2
  251. package/src/action/request/Specifier.ts +4 -1
  252. package/src/action/request/Write.ts +11 -2
  253. package/src/action/response/ReadResult.ts +1 -1
  254. package/src/cluster/client/ClusterClientTypes.ts +47 -7
  255. package/src/cluster/client/index.ts +0 -3
  256. package/src/interaction/InteractionMessenger.ts +5 -4
  257. package/src/interaction/SubscriptionClient.ts +2 -1
  258. package/src/interaction/index.ts +1 -1
  259. package/src/peer/CommissioningError.ts +13 -0
  260. package/src/peer/ControllerCommissioner.ts +21 -13
  261. package/src/peer/ControllerCommissioningFlow.ts +418 -186
  262. package/src/peer/ControllerDiscovery.ts +4 -1
  263. package/src/peer/InteractionQueue.ts +2 -2
  264. package/src/peer/PeerAddressStore.ts +0 -9
  265. package/src/peer/PeerSet.ts +56 -23
  266. package/src/peer/PhysicalDeviceProperties.ts +1 -1
  267. package/src/peer/index.ts +1 -0
  268. package/src/protocol/DeviceCommissioner.ts +0 -1
  269. package/src/protocol/ExchangeManager.ts +2 -2
  270. package/src/protocol/ExchangeProvider.ts +9 -7
  271. package/src/session/NodeSession.ts +5 -4
  272. package/src/session/Session.ts +8 -4
  273. package/src/session/SessionManager.ts +19 -2
  274. package/dist/cjs/cluster/client/AttributeClient.d.ts +0 -75
  275. package/dist/cjs/cluster/client/AttributeClient.d.ts.map +0 -1
  276. package/dist/cjs/cluster/client/AttributeClient.js +0 -209
  277. package/dist/cjs/cluster/client/AttributeClient.js.map +0 -6
  278. package/dist/cjs/cluster/client/ClusterClient.d.ts +0 -11
  279. package/dist/cjs/cluster/client/ClusterClient.d.ts.map +0 -1
  280. package/dist/cjs/cluster/client/ClusterClient.js +0 -335
  281. package/dist/cjs/cluster/client/ClusterClient.js.map +0 -6
  282. package/dist/cjs/cluster/client/EventClient.d.ts +0 -33
  283. package/dist/cjs/cluster/client/EventClient.d.ts.map +0 -1
  284. package/dist/cjs/cluster/client/EventClient.js +0 -89
  285. package/dist/cjs/cluster/client/EventClient.js.map +0 -6
  286. package/dist/cjs/interaction/InteractionClient.d.ts +0 -375
  287. package/dist/cjs/interaction/InteractionClient.d.ts.map +0 -1
  288. package/dist/cjs/interaction/InteractionClient.js +0 -1046
  289. package/dist/cjs/interaction/InteractionClient.js.map +0 -6
  290. package/dist/esm/cluster/client/AttributeClient.d.ts +0 -75
  291. package/dist/esm/cluster/client/AttributeClient.d.ts.map +0 -1
  292. package/dist/esm/cluster/client/AttributeClient.js +0 -189
  293. package/dist/esm/cluster/client/AttributeClient.js.map +0 -6
  294. package/dist/esm/cluster/client/ClusterClient.d.ts +0 -11
  295. package/dist/esm/cluster/client/ClusterClient.d.ts.map +0 -1
  296. package/dist/esm/cluster/client/ClusterClient.js +0 -320
  297. package/dist/esm/cluster/client/ClusterClient.js.map +0 -6
  298. package/dist/esm/cluster/client/EventClient.d.ts +0 -33
  299. package/dist/esm/cluster/client/EventClient.d.ts.map +0 -1
  300. package/dist/esm/cluster/client/EventClient.js +0 -69
  301. package/dist/esm/cluster/client/EventClient.js.map +0 -6
  302. package/dist/esm/interaction/InteractionClient.d.ts +0 -375
  303. package/dist/esm/interaction/InteractionClient.d.ts.map +0 -1
  304. package/dist/esm/interaction/InteractionClient.js +0 -1047
  305. package/dist/esm/interaction/InteractionClient.js.map +0 -6
  306. package/src/cluster/client/AttributeClient.ts +0 -230
  307. package/src/cluster/client/ClusterClient.ts +0 -433
  308. package/src/cluster/client/EventClient.ts +0 -99
  309. package/src/interaction/InteractionClient.ts +0 -1614
@@ -14,7 +14,6 @@ import {
14
14
  Seconds,
15
15
  ServerAddress,
16
16
  } from "#general";
17
- import { CommissionableDeviceDiscoveryFailedError } from "#peer/ControllerCommissioningFlow.js";
18
17
  import { RetransmissionLimitReachedError } from "#protocol/errors.js";
19
18
  import { NodeId } from "#types";
20
19
  import {
@@ -27,9 +26,13 @@ import {
27
26
  } from "../common/Scanner.js";
28
27
  import { Fabric } from "../fabric/Fabric.js";
29
28
  import { MdnsClient } from "../mdns/MdnsClient.js";
29
+ import { CommissioningError } from "./CommissioningError.js";
30
30
 
31
31
  const logger = Logger.get("ControllerDiscovery");
32
32
 
33
+ /** Error that throws when the device could not be discovered using the provided details. */
34
+ export class CommissionableDeviceDiscoveryFailedError extends CommissioningError {}
35
+
33
36
  export class DiscoveryError extends RetransmissionLimitReachedError {}
34
37
 
35
38
  /**
@@ -4,12 +4,12 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
 
7
- import { Environment, Environmental, Millis, PromiseQueue } from "#general";
7
+ import { Environment, Environmental, Millis, Semaphore } from "#general";
8
8
 
9
9
  const CONCURRENT_QUEUED_INTERACTIONS = 4;
10
10
  const INTERACTION_QUEUE_DELAY = Millis(100);
11
11
 
12
- export class InteractionQueue extends PromiseQueue {
12
+ export class InteractionQueue extends Semaphore {
13
13
  constructor() {
14
14
  super(CONCURRENT_QUEUED_INTERACTIONS, INTERACTION_QUEUE_DELAY);
15
15
  }
@@ -4,7 +4,6 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
 
7
- import { ReadScope } from "#action/client/ReadScope.js";
8
7
  import { Construction, MaybePromise } from "#general";
9
8
  import { DecodedAttributeReportValue } from "#interaction/AttributeDataDecoder.js";
10
9
  import { AttributeId, ClusterId, EndpointNumber, EventNumber } from "#types";
@@ -28,8 +27,6 @@ export abstract class PeerDataStore {
28
27
  abstract maxEventNumber: EventNumber;
29
28
  abstract updateLastEventNumber(eventNumber: EventNumber): MaybePromise<void>;
30
29
 
31
- abstract persistAttributes(attributes: DecodedAttributeReportValue<any>[], scope: ReadScope): MaybePromise<void>;
32
-
33
30
  // TODO: Find a maybe better way to achieve this without functions
34
31
  abstract retrieveAttribute(
35
32
  endpointId: EndpointNumber,
@@ -37,10 +34,4 @@ export abstract class PeerDataStore {
37
34
  attributeId: AttributeId,
38
35
  ): DecodedAttributeReportValue<any> | undefined;
39
36
  abstract retrieveAttributes(endpointId: EndpointNumber, clusterId: ClusterId): DecodedAttributeReportValue<any>[];
40
- abstract getClusterDataVersion(endpointId: EndpointNumber, clusterId: ClusterId): number | undefined;
41
- abstract getClusterDataVersions(
42
- filterEndpointId?: EndpointNumber,
43
- filterClusterId?: ClusterId,
44
- ): { endpointId: EndpointNumber; clusterId: ClusterId; dataVersion: number }[];
45
- abstract cleanupAttributeData(endpointId: EndpointNumber, clusterIds?: ClusterId[]): MaybePromise<void>;
46
37
  }
@@ -44,7 +44,6 @@ import { Session } from "#session/Session.js";
44
44
  import { SessionManager } from "#session/SessionManager.js";
45
45
  import { CaseAuthenticatedTag, NodeId, SECURE_CHANNEL_PROTOCOL_ID, SecureChannelStatusCode } from "#types";
46
46
  import { ControllerDiscovery, DiscoveryError, PairRetransmissionLimitReachedError } from "./ControllerDiscovery.js";
47
- import { InteractionQueue } from "./InteractionQueue.js";
48
47
  import { Peer } from "./Peer.js";
49
48
  import { PeerAddressStore, PeerDataStore } from "./PeerAddressStore.js";
50
49
  import { PeerDescriptor } from "./PeerDescriptor.js";
@@ -116,7 +115,6 @@ export class PeerSet implements ImmutableSet<Peer>, ObservableSet<Peer> {
116
115
  readonly #peers = new BasicSet<Peer>();
117
116
  readonly #construction: Construction<PeerSet>;
118
117
  readonly #store: PeerAddressStore;
119
- readonly #interactionQueue = new InteractionQueue();
120
118
  readonly #nodeCachedData = new PeerAddressMap<PeerDataStore>(); // Temporarily until we store it in new API
121
119
  readonly #disconnected = AsyncObservable<[peer: Peer]>();
122
120
  readonly #peerContext: Peer.Context;
@@ -241,10 +239,6 @@ export class PeerSet implements ImmutableSet<Peer>, ObservableSet<Peer> {
241
239
  return this.#peers;
242
240
  }
243
241
 
244
- get interactionQueue() {
245
- return this.#interactionQueue;
246
- }
247
-
248
242
  async connect(address: PeerAddress, options: PeerConnectionOptions & { operationalAddress?: ServerAddressUdp }) {
249
243
  await this.#ensureConnection(address, { ...options, allowUnknownPeer: true });
250
244
  }
@@ -272,13 +266,26 @@ export class PeerSet implements ImmutableSet<Peer>, ObservableSet<Peer> {
272
266
 
273
267
  const peer = this.for(address);
274
268
 
275
- if (this.#sessions.maybeSessionFor(address) || peer.activeDiscovery?.type === NodeDiscoveryType.FullDiscovery) {
269
+ // We have a session, so we assume we have connection
270
+ if (this.#sessions.maybeSessionFor(address)) {
271
+ return;
272
+ }
273
+
274
+ // There is an active discovery running for Full discovery, we can not do more than that, do not block the call
275
+ // because it will error in the next step
276
+ if (peer.activeDiscovery?.type === NodeDiscoveryType.FullDiscovery) {
276
277
  return;
277
278
  }
278
279
 
279
280
  const { promise: existingReconnectPromise } = peer.activeReconnection ?? {};
280
281
  if (existingReconnectPromise !== undefined) {
281
- return existingReconnectPromise;
282
+ // There is an active timed reconnection running and we also do not want a Full discovery here, so return
283
+ // the existing promise
284
+ if (options.discoveryOptions?.discoveryType !== NodeDiscoveryType.FullDiscovery) {
285
+ return existingReconnectPromise;
286
+ } else {
287
+ return;
288
+ }
282
289
  }
283
290
 
284
291
  const { promise, resolver, rejecter } = createPromise<SecureSession>();
@@ -294,9 +301,7 @@ export class PeerSet implements ImmutableSet<Peer>, ObservableSet<Peer> {
294
301
  rejecter(error);
295
302
  });
296
303
 
297
- if (options.discoveryOptions?.discoveryType !== NodeDiscoveryType.FullDiscovery) {
298
- return promise;
299
- }
304
+ return promise;
300
305
  }
301
306
 
302
307
  /**
@@ -312,34 +317,62 @@ export class PeerSet implements ImmutableSet<Peer>, ObservableSet<Peer> {
312
317
  const session = await this.#sessions.groupSessionForAddress(address, this.#transports);
313
318
  return new DedicatedChannelExchangeProvider(this.#exchanges, session);
314
319
  }
320
+ const peer = this.for(address);
315
321
  let initiallyConnected = !!this.#sessions.maybeSessionFor(address);
316
- return new ReconnectableExchangeProvider(this.#exchanges, this.#sessions, address, async () => {
322
+ return new ReconnectableExchangeProvider(this.#exchanges, this.#sessions, address, async reconnOptions => {
323
+ const { asOf, resetInitialState } = reconnOptions ?? {};
317
324
  const { caseAuthenticatedTags, discoveryOptions } = options;
318
325
 
319
- if (!initiallyConnected && !this.#sessions.maybeSessionFor(address)) {
326
+ const fullDiscoveryRunning = peer.activeDiscovery?.type === NodeDiscoveryType.FullDiscovery;
327
+
328
+ if (resetInitialState && !fullDiscoveryRunning) {
329
+ initiallyConnected = !!this.#sessions.maybeSessionFor(address);
330
+ }
331
+
332
+ if (!initiallyConnected && !this.#sessions.maybeSessionFor(address) && !fullDiscoveryRunning) {
333
+ // When we know that we have no operational address, do a 10s discovery initially, else we use the last known address
334
+ const discoveryType =
335
+ this.#getLastOperationalAddress(address) === undefined
336
+ ? NodeDiscoveryType.TimedDiscovery
337
+ : NodeDiscoveryType.None;
320
338
  // We got an uninitialized node, so do the first connection as usual
321
339
  await this.#ensureConnection(address, {
322
- discoveryOptions: { discoveryType: NodeDiscoveryType.None },
340
+ discoveryOptions: {
341
+ discoveryType,
342
+ timeout:
343
+ discoveryType === NodeDiscoveryType.TimedDiscovery
344
+ ? RETRANSMISSION_DISCOVERY_TIMEOUT
345
+ : undefined,
346
+ },
323
347
  caseAuthenticatedTags,
324
348
  });
325
- initiallyConnected = true; // We only do this connection once, rest is handled in following code
349
+ initiallyConnected = true; // We only do this connection once, the rest is handled in the following code
326
350
  if (this.#sessions.maybeSessionFor(address)) {
327
351
  return;
328
352
  }
329
353
  }
330
354
 
331
- if (!this.#sessions.maybeSessionFor(address)) {
355
+ if (
356
+ !this.#sessions.maybeSessionFor(address) &&
357
+ discoveryOptions?.discoveryType !== NodeDiscoveryType.FullDiscovery &&
358
+ (!peer.activeDiscovery || peer.activeDiscovery.type === NodeDiscoveryType.FullDiscovery) // The above value might be outdated
359
+ ) {
332
360
  throw new RetransmissionLimitReachedError(`Device ${PeerAddress(address)} is unreachable`);
333
361
  }
334
362
 
335
363
  // Close all sessions
336
- await this.#sessions.handlePeerLoss(address);
364
+ await this.#sessions.handlePeerLoss(address, asOf);
365
+
366
+ if (this.#sessions.maybeSessionFor(address)) {
367
+ // Ok, it seems we got a new session after provided Timestamp, so use this
368
+ return;
369
+ }
337
370
 
338
371
  // Enrich discoveryData with data from the node store when not provided
339
372
  const { discoveryData } = discoveryOptions ?? {
340
- discoveryData: this.get(address)?.descriptor.discoveryData,
373
+ discoveryData: peer.descriptor.discoveryData,
341
374
  };
342
- // Try to use first result for one last try before we need to reconnect
375
+ // Try to use the first result for one last try before we need to reconnect
343
376
  const operationalAddress = this.#knownOperationalAddressFor(address, true);
344
377
  if (operationalAddress === undefined) {
345
378
  logger.info(
@@ -349,7 +382,7 @@ export class PeerSet implements ImmutableSet<Peer>, ObservableSet<Peer> {
349
382
  throw new RetransmissionLimitReachedError(`No operational address found for ${PeerAddress(address)}`);
350
383
  }
351
384
 
352
- // Try to reconnect to last known address
385
+ // Try to reconnect to the last known address
353
386
  if (
354
387
  (await this.#reconnectKnownAddress(address, operationalAddress, discoveryData, {
355
388
  expectedProcessingTime: Seconds(2),
@@ -376,8 +409,6 @@ export class PeerSet implements ImmutableSet<Peer>, ObservableSet<Peer> {
376
409
  for (const peer of this.#peers) {
377
410
  await peer.close();
378
411
  }
379
-
380
- this.#interactionQueue.close();
381
412
  }
382
413
 
383
414
  /**
@@ -755,7 +786,9 @@ export class PeerSet implements ImmutableSet<Peer>, ObservableSet<Peer> {
755
786
  peer = new Peer({ address, dataStore: await this.#store.createNodeStore(address) }, this.#peerContext);
756
787
  this.#peers.add(peer);
757
788
  }
758
- peer.descriptor.operationalAddress = operationalServerAddress ?? peer.descriptor.operationalAddress;
789
+ if (operationalServerAddress !== undefined) {
790
+ peer.descriptor.operationalAddress = operationalServerAddress;
791
+ }
759
792
  if (discoveryData !== undefined) {
760
793
  peer.descriptor.discoveryData = {
761
794
  ...peer.descriptor.discoveryData,
@@ -78,7 +78,7 @@ export namespace PhysicalDeviceProperties {
78
78
  }
79
79
  if (maxIntervalCeiling < defaultCeiling) {
80
80
  logger.debug(
81
- `${description}: maxIntervalCeilingSeconds ideally is ${defaultCeiling}s instead of ${maxIntervalCeiling}s due to device type`,
81
+ `${description}: maxIntervalCeilingSeconds ideally is ${Duration.format(defaultCeiling)} instead of ${Duration.format(maxIntervalCeiling)} due to device type`,
82
82
  );
83
83
  }
84
84
 
package/src/peer/index.ts CHANGED
@@ -4,6 +4,7 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
 
7
+ export * from "./CommissioningError.js";
7
8
  export * from "./ControllerCommissioner.js";
8
9
  export * from "./ControllerCommissioningFlow.js";
9
10
  export * from "./ControllerDiscovery.js";
@@ -25,7 +25,6 @@ import { SecureChannelProtocol } from "#securechannel/SecureChannelProtocol.js";
25
25
  import { PaseServer } from "#session/pase/PaseServer.js";
26
26
  import { SessionManager } from "#session/SessionManager.js";
27
27
  import { CommissioningOptions, STANDARD_COMMISSIONING_TIMEOUT, StatusCode, StatusResponseError } from "#types";
28
- import type { ControllerCommissioner } from "../peer/ControllerCommissioner.js";
29
28
  import { DeviceAdvertiser } from "./DeviceAdvertiser.js";
30
29
 
31
30
  const logger = Logger.get("DeviceCommissioner");
@@ -245,9 +245,9 @@ export class ExchangeManager {
245
245
  message.payloadHeader.messageType,
246
246
  );
247
247
  const messageDiagnostics = Diagnostic.dict({
248
- message: messageId,
248
+ message: hex.fixed(messageId, 8),
249
249
  protocol: message.payloadHeader.protocolId,
250
- exId: message.payloadHeader.exchangeId,
250
+ exId: hex.word(message.payloadHeader.exchangeId),
251
251
  via: channel.name,
252
252
  });
253
253
 
@@ -3,7 +3,7 @@
3
3
  * Copyright 2022-2025 Matter.js Authors
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
- import { Diagnostic, Duration, Observable } from "#general";
6
+ import { Diagnostic, Duration, Observable, Timestamp } from "#general";
7
7
  import { PeerAddress } from "#peer/PeerAddress.js";
8
8
  import { ExchangeManager } from "#protocol/ExchangeManager.js";
9
9
  import { DEFAULT_EXPECTED_PROCESSING_TIME } from "#protocol/MessageChannel.js";
@@ -37,7 +37,7 @@ export abstract class ExchangeProvider {
37
37
 
38
38
  abstract maximumPeerResponseTime(expectedProcessingTime?: Duration): Duration;
39
39
  abstract initiateExchange(): Promise<MessageExchange>;
40
- abstract reconnectChannel(): Promise<boolean>;
40
+ abstract reconnectChannel(options: { asOf?: Timestamp; resetInitialState?: boolean }): Promise<boolean>;
41
41
  abstract session: Session;
42
42
 
43
43
  get channelType() {
@@ -80,14 +80,14 @@ export class DedicatedChannelExchangeProvider extends ExchangeProvider {
80
80
  export class ReconnectableExchangeProvider extends ExchangeProvider {
81
81
  readonly supportsReconnect = true;
82
82
  readonly #address: PeerAddress;
83
- readonly #reconnectChannelFunc: () => Promise<void>;
83
+ readonly #reconnectChannelFunc: (options?: { asOf?: Timestamp; resetInitialState?: boolean }) => Promise<void>;
84
84
  readonly #channelUpdated = Observable<[void]>();
85
85
 
86
86
  constructor(
87
87
  exchangeManager: ExchangeManager,
88
88
  protected readonly sessions: SessionManager,
89
89
  address: PeerAddress,
90
- reconnectChannelFunc: () => Promise<void>,
90
+ reconnectChannelFunc: (options?: { asOf?: Timestamp; resetInitialState?: boolean }) => Promise<void>,
91
91
  ) {
92
92
  super(exchangeManager);
93
93
  this.#address = address;
@@ -118,9 +118,11 @@ export class ReconnectableExchangeProvider extends ExchangeProvider {
118
118
  return this.exchangeManager.initiateExchange(this.#address, INTERACTION_PROTOCOL_ID);
119
119
  }
120
120
 
121
- async reconnectChannel() {
122
- if (this.#reconnectChannelFunc === undefined) return false;
123
- await this.#reconnectChannelFunc();
121
+ async reconnectChannel(options: { asOf?: Timestamp; resetInitialState?: boolean } = {}) {
122
+ if (this.#reconnectChannelFunc === undefined) {
123
+ return false;
124
+ }
125
+ await this.#reconnectChannelFunc(options);
124
126
  return true;
125
127
  }
126
128
 
@@ -277,9 +277,10 @@ export class NodeSession extends SecureSession {
277
277
  await this.handlePeerLoss();
278
278
  }
279
279
 
280
- async handlePeerLoss(currentExchange?: MessageExchange) {
280
+ async handlePeerLoss(data: { currentExchange?: MessageExchange; keepSubscriptions?: boolean } = {}) {
281
281
  this.#isPeerLost = true;
282
- await this.initiateForceClose(currentExchange);
282
+ const { currentExchange, keepSubscriptions } = data;
283
+ await this.initiateForceClose(currentExchange, keepSubscriptions);
283
284
  }
284
285
 
285
286
  get isPeerLost() {
@@ -311,9 +312,9 @@ export class NodeSession extends SecureSession {
311
312
  });
312
313
  }
313
314
 
314
- override async initiateForceClose(currentExchange?: MessageExchange) {
315
+ override async initiateForceClose(currentExchange?: MessageExchange, keepSubscriptions = false) {
315
316
  this.#isPeerLost = true;
316
- await super.initiateForceClose(currentExchange);
317
+ await super.initiateForceClose(currentExchange, keepSubscriptions);
317
318
  }
318
319
 
319
320
  override addExchange(exchange: MessageExchange) {
@@ -254,14 +254,18 @@ export abstract class Session {
254
254
  /**
255
255
  * Force-close the session.
256
256
  *
257
- * This terminates subscriptions and exchanges without notifying peers. It places the session in a closing state
258
- * so no further exchanges are accepted.
257
+ * This terminates (potentially) subscriptions and exchanges without notifying peers. It places the session in a
258
+ * closing state so no further exchanges are accepted.
259
259
  *
260
260
  * @param except an exchange that should not be forced close; this allows the current exchange to remain open
261
+ * @param keepSubscriptions whether to keep the subscriptions open after force-closing the session.
262
+ * TODO refactor when moving subscriptions away from sessions
261
263
  */
262
- async initiateForceClose(except?: MessageExchange) {
264
+ async initiateForceClose(except?: MessageExchange, keepSubscriptions = false) {
263
265
  await this.initiateClose(async () => {
264
- await this.closeSubscriptions();
266
+ if (!keepSubscriptions) {
267
+ await this.closeSubscriptions();
268
+ }
265
269
  for (const exchange of this.#exchanges) {
266
270
  if (exchange === except) {
267
271
  continue;
@@ -26,6 +26,7 @@ import {
26
26
  ObserverGroup,
27
27
  StorageContext,
28
28
  StorageManager,
29
+ Time,
29
30
  Timestamp,
30
31
  toHex,
31
32
  } from "#general";
@@ -424,9 +425,25 @@ export class SessionManager {
424
425
  return this.#sessions.filter(session => session.fabric?.fabricIndex === fabricIndex);
425
426
  }
426
427
 
427
- async handlePeerLoss(address: PeerAddress, asOf?: Timestamp) {
428
+ /**
429
+ * Removes all Peer sessions but keeps subscriptions intact because they could be refreshed on restart when the
430
+ * device supports persistent subscriptions.
431
+ */
432
+ handlePeerShutdown(address: PeerAddress, asOf?: Timestamp) {
433
+ return this.#handlePeerLoss({ address, asOf: asOf ?? Time.nowMs, keepSubscriptions: true });
434
+ }
435
+
436
+ /**
437
+ * Removes all Peer sessions and closes subscriptions.
438
+ */
439
+ handlePeerLoss(address: PeerAddress, asOf?: Timestamp) {
440
+ return this.#handlePeerLoss({ address, asOf: asOf ?? Time.nowMs });
441
+ }
442
+
443
+ async #handlePeerLoss(options: { address: PeerAddress; asOf?: Timestamp; keepSubscriptions?: boolean }) {
428
444
  await this.#construction;
429
445
 
446
+ const { address, asOf, keepSubscriptions } = options;
430
447
  for (const session of this.#sessions) {
431
448
  if (!session.peerIs(address)) {
432
449
  continue;
@@ -436,7 +453,7 @@ export class SessionManager {
436
453
  continue;
437
454
  }
438
455
 
439
- await session.handlePeerLoss();
456
+ await session.handlePeerLoss({ keepSubscriptions });
440
457
  }
441
458
  }
442
459
 
@@ -1,75 +0,0 @@
1
- /**
2
- * @license
3
- * Copyright 2022-2025 Matter.js Authors
4
- * SPDX-License-Identifier: Apache-2.0
5
- */
6
- import { Attribute, AttributeId, ClusterId, EndpointNumber, TlvSchema } from "#types";
7
- import { InteractionClient } from "../../interaction/InteractionClient.js";
8
- /**
9
- * Factory function to create an AttributeClient for a given attribute.
10
- */
11
- export declare function createAttributeClient<T>(attribute: Attribute<T, any>, name: string, endpointId: EndpointNumber | undefined, clusterId: ClusterId, interactionClient: InteractionClient, present?: boolean): AttributeClient<T>;
12
- /**
13
- * General class for AttributeClients
14
- */
15
- export declare class AttributeClient<T = any> {
16
- #private;
17
- readonly attribute: Attribute<T, any>;
18
- readonly name: string;
19
- readonly endpointId: EndpointNumber | undefined;
20
- readonly clusterId: ClusterId;
21
- protected readonly schema: TlvSchema<any>;
22
- readonly id: AttributeId;
23
- constructor(attribute: Attribute<T, any>, name: string, endpointId: EndpointNumber | undefined, clusterId: ClusterId, interactionClient: InteractionClient);
24
- /**
25
- * Set the value of the attribute. When dataVersion parameter is provided the value is only set when the
26
- * cluster dataVersion of the server matches. If it does not match it is rejected with an Error.
27
- */
28
- set(value: T, dataVersion?: number): Promise<void>;
29
- get fabricScoped(): boolean;
30
- getLocal(): T | undefined;
31
- /**
32
- * Get the value of the attribute. Fabric scoped reads are always done with the remote.
33
- * The `requestFromRemote` parameter allowed to force or prevent remote reads:
34
- * - `true` forces a remote read
35
- * - `false` forces a local read, return undefined if no value is available
36
- * - `undefined` returns local values if available or if the read is fabric filtered, otherwise remote read
37
- */
38
- get(requestFromRemote?: boolean, isFabricFiltered?: boolean): Promise<T | undefined>;
39
- /**
40
- * Get the value with version of the attribute. Fabric scoped reads are always done with the remote.
41
- * The `requestFromRemote` parameter allowed to force or prevent remote reads:
42
- * - `true` forces a remote read
43
- * - `false` forces a local read, return undefined if no value is available
44
- * - `undefined` returns local values if available or if the read is fabric filtered, otherwise remote read
45
- */
46
- getWithVersion(requestFromRemote?: boolean, isFabricFiltered?: boolean): Promise<{
47
- value: T;
48
- version: number;
49
- } | undefined>;
50
- /** Subscribe to the attribute. */
51
- subscribe(minIntervalFloorSeconds: number, maxIntervalCeilingSeconds: number, knownDataVersion?: number, isFabricFiltered?: boolean): Promise<{
52
- maxInterval: number;
53
- }>;
54
- /**
55
- * Update the value of the attribute. Just internally used!
56
- * @private
57
- */
58
- update(value: T): void;
59
- /** Add a listener to the attribute. */
60
- addListener(listener: (newValue: T) => void): void;
61
- /** Remove a listener from the attribute. */
62
- removeListener(listener: (newValue: T) => void): void;
63
- }
64
- /**
65
- * Special AttributeClient class to allow identifying attributes that are supported because reported by the Devices.
66
- */
67
- export declare class SupportedAttributeClient<T> extends AttributeClient<T> {
68
- }
69
- /**
70
- * Special AttributeClient class to allow identifying attributes that are supported because reported by the Devices,
71
- * but the contained attribute is unknown.
72
- */
73
- export declare class UnknownSupportedAttributeClient extends SupportedAttributeClient<any> {
74
- }
75
- //# sourceMappingURL=AttributeClient.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"AttributeClient.d.ts","sourceRoot":"","sources":["../../../../src/cluster/client/AttributeClient.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,EAAE,SAAS,EAAkB,WAAW,EAAE,SAAS,EAAE,cAAc,EAAe,SAAS,EAAE,MAAM,QAAQ,CAAC;AACnH,OAAO,EAAE,iBAAiB,EAAE,MAAM,wCAAwC,CAAC;AAE3E;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,CAAC,EACnC,SAAS,EAAE,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,EAC5B,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,cAAc,GAAG,SAAS,EACtC,SAAS,EAAE,SAAS,EACpB,iBAAiB,EAAE,iBAAiB,EACpC,OAAO,UAAQ,GAChB,eAAe,CAAC,CAAC,CAAC,CAQpB;AAED;;GAEG;AACH,qBAAa,eAAe,CAAC,CAAC,GAAG,GAAG;;IAU5B,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC;IACrC,QAAQ,CAAC,IAAI,EAAE,MAAM;IACrB,QAAQ,CAAC,UAAU,EAAE,cAAc,GAAG,SAAS;IAC/C,QAAQ,CAAC,SAAS,EAAE,SAAS;IATjC,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC;IAE1C,QAAQ,CAAC,EAAE,EAAE,WAAW,CAAC;gBAIZ,SAAS,EAAE,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,EAC5B,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,cAAc,GAAG,SAAS,EACtC,SAAS,EAAE,SAAS,EAC7B,iBAAiB,EAAE,iBAAiB;IAWxC;;;OAGG;IACG,GAAG,CAAC,KAAK,EAAE,CAAC,EAAE,WAAW,CAAC,EAAE,MAAM;IA4CxC,IAAI,YAAY,YAEf;IAED,QAAQ;IAWR;;;;;;OAMG;IACG,GAAG,CAAC,iBAAiB,CAAC,EAAE,OAAO,EAAE,gBAAgB,UAAO;IAkB9D;;;;;;OAMG;IACG,cAAc,CAAC,iBAAiB,CAAC,EAAE,OAAO,EAAE,gBAAgB,UAAO;;;;IAkBzE,kCAAkC;IAC5B,SAAS,CACX,uBAAuB,EAAE,MAAM,EAC/B,yBAAyB,EAAE,MAAM,EACjC,gBAAgB,CAAC,EAAE,MAAM,EACzB,gBAAgB,UAAO;;;IAoB3B;;;OAGG;IACH,MAAM,CAAC,KAAK,EAAE,CAAC;IAIf,uCAAuC;IACvC,WAAW,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,IAAI;IAI3C,4CAA4C;IAC5C,cAAc,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,IAAI;CAMjD;AAED;;GAEG;AACH,qBAAa,wBAAwB,CAAC,CAAC,CAAE,SAAQ,eAAe,CAAC,CAAC,CAAC;CAAG;AAEtE;;;GAGG;AACH,qBAAa,+BAAgC,SAAQ,wBAAwB,CAAC,GAAG,CAAC;CAAG"}