@matter/protocol 0.11.0-alpha.0-20241005-e3e4e4a7a

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 (853) hide show
  1. package/LICENSE +201 -0
  2. package/dist/cjs/MatterDevice.d.ts +79 -0
  3. package/dist/cjs/MatterDevice.d.ts.map +1 -0
  4. package/dist/cjs/MatterDevice.js +253 -0
  5. package/dist/cjs/MatterDevice.js.map +6 -0
  6. package/dist/cjs/ble/Ble.d.ts +29 -0
  7. package/dist/cjs/ble/Ble.d.ts.map +1 -0
  8. package/dist/cjs/ble/Ble.js +50 -0
  9. package/dist/cjs/ble/Ble.js.map +6 -0
  10. package/dist/cjs/ble/BleConsts.d.ts +32 -0
  11. package/dist/cjs/ble/BleConsts.d.ts.map +1 -0
  12. package/dist/cjs/ble/BleConsts.js +53 -0
  13. package/dist/cjs/ble/BleConsts.js.map +6 -0
  14. package/dist/cjs/ble/BtpSessionHandler.d.ts +87 -0
  15. package/dist/cjs/ble/BtpSessionHandler.d.ts.map +1 -0
  16. package/dist/cjs/ble/BtpSessionHandler.js +432 -0
  17. package/dist/cjs/ble/BtpSessionHandler.js.map +6 -0
  18. package/dist/cjs/ble/index.d.ts +9 -0
  19. package/dist/cjs/ble/index.d.ts.map +1 -0
  20. package/dist/cjs/ble/index.js +26 -0
  21. package/dist/cjs/ble/index.js.map +6 -0
  22. package/dist/cjs/certificate/AttestationCertificateManager.d.ts +28 -0
  23. package/dist/cjs/certificate/AttestationCertificateManager.d.ts.map +1 -0
  24. package/dist/cjs/certificate/AttestationCertificateManager.js +171 -0
  25. package/dist/cjs/certificate/AttestationCertificateManager.js.map +6 -0
  26. package/dist/cjs/certificate/CertificateManager.d.ts +575 -0
  27. package/dist/cjs/certificate/CertificateManager.d.ts.map +1 -0
  28. package/dist/cjs/certificate/CertificateManager.js +810 -0
  29. package/dist/cjs/certificate/CertificateManager.js.map +6 -0
  30. package/dist/cjs/certificate/CertificationDeclarationManager.d.ts +5 -0
  31. package/dist/cjs/certificate/CertificationDeclarationManager.d.ts.map +1 -0
  32. package/dist/cjs/certificate/CertificationDeclarationManager.js +54 -0
  33. package/dist/cjs/certificate/CertificationDeclarationManager.js.map +6 -0
  34. package/dist/cjs/certificate/ChipPAAuthorities.d.ts +14 -0
  35. package/dist/cjs/certificate/ChipPAAuthorities.d.ts.map +1 -0
  36. package/dist/cjs/certificate/ChipPAAuthorities.js +57 -0
  37. package/dist/cjs/certificate/ChipPAAuthorities.js.map +6 -0
  38. package/dist/cjs/certificate/DeviceCertification.d.ts +30 -0
  39. package/dist/cjs/certificate/DeviceCertification.d.ts.map +1 -0
  40. package/dist/cjs/certificate/DeviceCertification.js +103 -0
  41. package/dist/cjs/certificate/DeviceCertification.js.map +6 -0
  42. package/dist/cjs/certificate/RootCertificateManager.d.ts +33 -0
  43. package/dist/cjs/certificate/RootCertificateManager.d.ts.map +1 -0
  44. package/dist/cjs/certificate/RootCertificateManager.js +142 -0
  45. package/dist/cjs/certificate/RootCertificateManager.js.map +6 -0
  46. package/dist/cjs/certificate/index.d.ts +12 -0
  47. package/dist/cjs/certificate/index.d.ts.map +1 -0
  48. package/dist/cjs/certificate/index.js +29 -0
  49. package/dist/cjs/certificate/index.js.map +6 -0
  50. package/dist/cjs/cluster/client/AttributeClient.d.ts +61 -0
  51. package/dist/cjs/cluster/client/AttributeClient.d.ts.map +1 -0
  52. package/dist/cjs/cluster/client/AttributeClient.js +177 -0
  53. package/dist/cjs/cluster/client/AttributeClient.js.map +6 -0
  54. package/dist/cjs/cluster/client/ClusterClient.d.ts +10 -0
  55. package/dist/cjs/cluster/client/ClusterClient.d.ts.map +1 -0
  56. package/dist/cjs/cluster/client/ClusterClient.js +281 -0
  57. package/dist/cjs/cluster/client/ClusterClient.js.map +6 -0
  58. package/dist/cjs/cluster/client/ClusterClientTypes.d.ts +171 -0
  59. package/dist/cjs/cluster/client/ClusterClientTypes.d.ts.map +1 -0
  60. package/dist/cjs/cluster/client/ClusterClientTypes.js +22 -0
  61. package/dist/cjs/cluster/client/ClusterClientTypes.js.map +6 -0
  62. package/dist/cjs/cluster/client/EventClient.d.ts +41 -0
  63. package/dist/cjs/cluster/client/EventClient.d.ts.map +1 -0
  64. package/dist/cjs/cluster/client/EventClient.js +94 -0
  65. package/dist/cjs/cluster/client/EventClient.js.map +6 -0
  66. package/dist/cjs/cluster/client/index.d.ts +10 -0
  67. package/dist/cjs/cluster/client/index.d.ts.map +1 -0
  68. package/dist/cjs/cluster/client/index.js +27 -0
  69. package/dist/cjs/cluster/client/index.js.map +6 -0
  70. package/dist/cjs/cluster/index.d.ts +8 -0
  71. package/dist/cjs/cluster/index.d.ts.map +1 -0
  72. package/dist/cjs/cluster/index.js +25 -0
  73. package/dist/cjs/cluster/index.js.map +6 -0
  74. package/dist/cjs/cluster/server/AttributeServer.d.ts +307 -0
  75. package/dist/cjs/cluster/server/AttributeServer.d.ts.map +1 -0
  76. package/dist/cjs/cluster/server/AttributeServer.js +734 -0
  77. package/dist/cjs/cluster/server/AttributeServer.js.map +6 -0
  78. package/dist/cjs/cluster/server/ClusterDatasource.d.ts +16 -0
  79. package/dist/cjs/cluster/server/ClusterDatasource.d.ts.map +1 -0
  80. package/dist/cjs/cluster/server/ClusterDatasource.js +22 -0
  81. package/dist/cjs/cluster/server/ClusterDatasource.js.map +6 -0
  82. package/dist/cjs/cluster/server/ClusterServer.d.ts +40 -0
  83. package/dist/cjs/cluster/server/ClusterServer.d.ts.map +1 -0
  84. package/dist/cjs/cluster/server/ClusterServer.js +22 -0
  85. package/dist/cjs/cluster/server/ClusterServer.js.map +6 -0
  86. package/dist/cjs/cluster/server/CommandServer.d.ts +34 -0
  87. package/dist/cjs/cluster/server/CommandServer.d.ts.map +1 -0
  88. package/dist/cjs/cluster/server/CommandServer.js +76 -0
  89. package/dist/cjs/cluster/server/CommandServer.js.map +6 -0
  90. package/dist/cjs/cluster/server/EventServer.d.ts +41 -0
  91. package/dist/cjs/cluster/server/EventServer.d.ts.map +1 -0
  92. package/dist/cjs/cluster/server/EventServer.js +149 -0
  93. package/dist/cjs/cluster/server/EventServer.js.map +6 -0
  94. package/dist/cjs/cluster/server/index.d.ts +11 -0
  95. package/dist/cjs/cluster/server/index.d.ts.map +1 -0
  96. package/dist/cjs/cluster/server/index.js +28 -0
  97. package/dist/cjs/cluster/server/index.js.map +6 -0
  98. package/dist/cjs/codec/BtpCodec.d.ts +78 -0
  99. package/dist/cjs/codec/BtpCodec.d.ts.map +1 -0
  100. package/dist/cjs/codec/BtpCodec.js +254 -0
  101. package/dist/cjs/codec/BtpCodec.js.map +6 -0
  102. package/dist/cjs/codec/MessageCodec.d.ts +63 -0
  103. package/dist/cjs/codec/MessageCodec.d.ts.map +1 -0
  104. package/dist/cjs/codec/MessageCodec.js +220 -0
  105. package/dist/cjs/codec/MessageCodec.js.map +6 -0
  106. package/dist/cjs/codec/index.d.ts +9 -0
  107. package/dist/cjs/codec/index.d.ts.map +1 -0
  108. package/dist/cjs/codec/index.js +36 -0
  109. package/dist/cjs/codec/index.js.map +6 -0
  110. package/dist/cjs/common/FailsafeContext.d.ts +79 -0
  111. package/dist/cjs/common/FailsafeContext.d.ts.map +1 -0
  112. package/dist/cjs/common/FailsafeContext.js +237 -0
  113. package/dist/cjs/common/FailsafeContext.js.map +6 -0
  114. package/dist/cjs/common/FailsafeTimer.d.ts +25 -0
  115. package/dist/cjs/common/FailsafeTimer.d.ts.map +1 -0
  116. package/dist/cjs/common/FailsafeTimer.js +91 -0
  117. package/dist/cjs/common/FailsafeTimer.js.map +6 -0
  118. package/dist/cjs/common/InstanceBroadcaster.d.ts +273 -0
  119. package/dist/cjs/common/InstanceBroadcaster.d.ts.map +1 -0
  120. package/dist/cjs/common/InstanceBroadcaster.js +139 -0
  121. package/dist/cjs/common/InstanceBroadcaster.js.map +6 -0
  122. package/dist/cjs/common/OperationalCredentialsTypes.d.ts +21 -0
  123. package/dist/cjs/common/OperationalCredentialsTypes.d.ts.map +1 -0
  124. package/dist/cjs/common/OperationalCredentialsTypes.js +45 -0
  125. package/dist/cjs/common/OperationalCredentialsTypes.js.map +6 -0
  126. package/dist/cjs/common/Scanner.d.ts +121 -0
  127. package/dist/cjs/common/Scanner.d.ts.map +1 -0
  128. package/dist/cjs/common/Scanner.js +51 -0
  129. package/dist/cjs/common/Scanner.js.map +6 -0
  130. package/dist/cjs/common/index.d.ts +12 -0
  131. package/dist/cjs/common/index.d.ts.map +1 -0
  132. package/dist/cjs/common/index.js +29 -0
  133. package/dist/cjs/common/index.js.map +6 -0
  134. package/dist/cjs/endpoint/EndpointInterface.d.ts +37 -0
  135. package/dist/cjs/endpoint/EndpointInterface.d.ts.map +1 -0
  136. package/dist/cjs/endpoint/EndpointInterface.js +22 -0
  137. package/dist/cjs/endpoint/EndpointInterface.js.map +6 -0
  138. package/dist/cjs/endpoint/EndpointStructureLogger.d.ts +31 -0
  139. package/dist/cjs/endpoint/EndpointStructureLogger.d.ts.map +1 -0
  140. package/dist/cjs/endpoint/EndpointStructureLogger.js +236 -0
  141. package/dist/cjs/endpoint/EndpointStructureLogger.js.map +6 -0
  142. package/dist/cjs/endpoint/index.d.ts +8 -0
  143. package/dist/cjs/endpoint/index.d.ts.map +1 -0
  144. package/dist/cjs/endpoint/index.js +25 -0
  145. package/dist/cjs/endpoint/index.js.map +6 -0
  146. package/dist/cjs/fabric/Fabric.d.ts +121 -0
  147. package/dist/cjs/fabric/Fabric.d.ts.map +1 -0
  148. package/dist/cjs/fabric/Fabric.js +427 -0
  149. package/dist/cjs/fabric/Fabric.js.map +6 -0
  150. package/dist/cjs/fabric/FabricManager.d.ts +44 -0
  151. package/dist/cjs/fabric/FabricManager.d.ts.map +1 -0
  152. package/dist/cjs/fabric/FabricManager.js +209 -0
  153. package/dist/cjs/fabric/FabricManager.js.map +6 -0
  154. package/dist/cjs/fabric/index.d.ts +8 -0
  155. package/dist/cjs/fabric/index.d.ts.map +1 -0
  156. package/dist/cjs/fabric/index.js +25 -0
  157. package/dist/cjs/fabric/index.js.map +6 -0
  158. package/dist/cjs/index.d.ts +20 -0
  159. package/dist/cjs/index.d.ts.map +1 -0
  160. package/dist/cjs/index.js +37 -0
  161. package/dist/cjs/index.js.map +6 -0
  162. package/dist/cjs/interaction/AccessControlManager.d.ts +49 -0
  163. package/dist/cjs/interaction/AccessControlManager.d.ts.map +1 -0
  164. package/dist/cjs/interaction/AccessControlManager.js +248 -0
  165. package/dist/cjs/interaction/AccessControlManager.js.map +6 -0
  166. package/dist/cjs/interaction/AttributeDataDecoder.d.ts +52 -0
  167. package/dist/cjs/interaction/AttributeDataDecoder.d.ts.map +1 -0
  168. package/dist/cjs/interaction/AttributeDataDecoder.js +185 -0
  169. package/dist/cjs/interaction/AttributeDataDecoder.js.map +6 -0
  170. package/dist/cjs/interaction/AttributeDataEncoder.d.ts +71 -0
  171. package/dist/cjs/interaction/AttributeDataEncoder.d.ts.map +1 -0
  172. package/dist/cjs/interaction/AttributeDataEncoder.js +190 -0
  173. package/dist/cjs/interaction/AttributeDataEncoder.js.map +6 -0
  174. package/dist/cjs/interaction/EventDataDecoder.d.ts +30 -0
  175. package/dist/cjs/interaction/EventDataDecoder.d.ts.map +1 -0
  176. package/dist/cjs/interaction/EventDataDecoder.js +103 -0
  177. package/dist/cjs/interaction/EventDataDecoder.js.map +6 -0
  178. package/dist/cjs/interaction/EventHandler.d.ts +42 -0
  179. package/dist/cjs/interaction/EventHandler.d.ts.map +1 -0
  180. package/dist/cjs/interaction/EventHandler.js +112 -0
  181. package/dist/cjs/interaction/EventHandler.js.map +6 -0
  182. package/dist/cjs/interaction/InteractionClient.d.ts +294 -0
  183. package/dist/cjs/interaction/InteractionClient.d.ts.map +1 -0
  184. package/dist/cjs/interaction/InteractionClient.js +829 -0
  185. package/dist/cjs/interaction/InteractionClient.js.map +6 -0
  186. package/dist/cjs/interaction/InteractionEndpointStructure.d.ts +59 -0
  187. package/dist/cjs/interaction/InteractionEndpointStructure.d.ts.map +1 -0
  188. package/dist/cjs/interaction/InteractionEndpointStructure.js +341 -0
  189. package/dist/cjs/interaction/InteractionEndpointStructure.js.map +6 -0
  190. package/dist/cjs/interaction/InteractionMessenger.d.ts +315 -0
  191. package/dist/cjs/interaction/InteractionMessenger.d.ts.map +1 -0
  192. package/dist/cjs/interaction/InteractionMessenger.js +484 -0
  193. package/dist/cjs/interaction/InteractionMessenger.js.map +6 -0
  194. package/dist/cjs/interaction/InteractionServer.d.ts +97 -0
  195. package/dist/cjs/interaction/InteractionServer.d.ts.map +1 -0
  196. package/dist/cjs/interaction/InteractionServer.js +1026 -0
  197. package/dist/cjs/interaction/InteractionServer.js.map +6 -0
  198. package/dist/cjs/interaction/ServerSubscription.d.ts +121 -0
  199. package/dist/cjs/interaction/ServerSubscription.d.ts.map +1 -0
  200. package/dist/cjs/interaction/ServerSubscription.js +672 -0
  201. package/dist/cjs/interaction/ServerSubscription.js.map +6 -0
  202. package/dist/cjs/interaction/Subscription.d.ts +44 -0
  203. package/dist/cjs/interaction/Subscription.d.ts.map +1 -0
  204. package/dist/cjs/interaction/Subscription.js +85 -0
  205. package/dist/cjs/interaction/Subscription.js.map +6 -0
  206. package/dist/cjs/interaction/SubscriptionOptions.d.ts +43 -0
  207. package/dist/cjs/interaction/SubscriptionOptions.d.ts.map +1 -0
  208. package/dist/cjs/interaction/SubscriptionOptions.js +46 -0
  209. package/dist/cjs/interaction/SubscriptionOptions.js.map +6 -0
  210. package/dist/cjs/interaction/index.d.ts +17 -0
  211. package/dist/cjs/interaction/index.d.ts.map +1 -0
  212. package/dist/cjs/interaction/index.js +34 -0
  213. package/dist/cjs/interaction/index.js.map +6 -0
  214. package/dist/cjs/mdns/MdnsBroadcaster.d.ts +34 -0
  215. package/dist/cjs/mdns/MdnsBroadcaster.d.ts.map +1 -0
  216. package/dist/cjs/mdns/MdnsBroadcaster.js +338 -0
  217. package/dist/cjs/mdns/MdnsBroadcaster.js.map +6 -0
  218. package/dist/cjs/mdns/MdnsConsts.d.ts +19 -0
  219. package/dist/cjs/mdns/MdnsConsts.d.ts.map +1 -0
  220. package/dist/cjs/mdns/MdnsConsts.js +52 -0
  221. package/dist/cjs/mdns/MdnsConsts.js.map +6 -0
  222. package/dist/cjs/mdns/MdnsInstanceBroadcaster.d.ts +28 -0
  223. package/dist/cjs/mdns/MdnsInstanceBroadcaster.d.ts.map +1 -0
  224. package/dist/cjs/mdns/MdnsInstanceBroadcaster.js +87 -0
  225. package/dist/cjs/mdns/MdnsInstanceBroadcaster.js.map +6 -0
  226. package/dist/cjs/mdns/MdnsScanner.d.ts +79 -0
  227. package/dist/cjs/mdns/MdnsScanner.d.ts.map +1 -0
  228. package/dist/cjs/mdns/MdnsScanner.js +842 -0
  229. package/dist/cjs/mdns/MdnsScanner.js.map +6 -0
  230. package/dist/cjs/mdns/MdnsServer.d.ts +29 -0
  231. package/dist/cjs/mdns/MdnsServer.d.ts.map +1 -0
  232. package/dist/cjs/mdns/MdnsServer.js +275 -0
  233. package/dist/cjs/mdns/MdnsServer.js.map +6 -0
  234. package/dist/cjs/mdns/MdnsService.d.ts +28 -0
  235. package/dist/cjs/mdns/MdnsService.d.ts.map +1 -0
  236. package/dist/cjs/mdns/MdnsService.js +95 -0
  237. package/dist/cjs/mdns/MdnsService.js.map +6 -0
  238. package/dist/cjs/mdns/index.d.ts +12 -0
  239. package/dist/cjs/mdns/index.d.ts.map +1 -0
  240. package/dist/cjs/mdns/index.js +29 -0
  241. package/dist/cjs/mdns/index.js.map +6 -0
  242. package/dist/cjs/package.json +10 -0
  243. package/dist/cjs/peer/ControllerCommissioner.d.ts +82 -0
  244. package/dist/cjs/peer/ControllerCommissioner.d.ts.map +1 -0
  245. package/dist/cjs/peer/ControllerCommissioner.js +224 -0
  246. package/dist/cjs/peer/ControllerCommissioner.js.map +6 -0
  247. package/dist/cjs/peer/ControllerCommissioningFlow.d.ts +88 -0
  248. package/dist/cjs/peer/ControllerCommissioningFlow.d.ts.map +1 -0
  249. package/dist/cjs/peer/ControllerCommissioningFlow.js +849 -0
  250. package/dist/cjs/peer/ControllerCommissioningFlow.js.map +6 -0
  251. package/dist/cjs/peer/ControllerDiscovery.d.ts +43 -0
  252. package/dist/cjs/peer/ControllerDiscovery.d.ts.map +1 -0
  253. package/dist/cjs/peer/ControllerDiscovery.js +192 -0
  254. package/dist/cjs/peer/ControllerDiscovery.js.map +6 -0
  255. package/dist/cjs/peer/OperationalPeer.d.ts +28 -0
  256. package/dist/cjs/peer/OperationalPeer.d.ts.map +1 -0
  257. package/dist/cjs/peer/OperationalPeer.js +22 -0
  258. package/dist/cjs/peer/OperationalPeer.js.map +6 -0
  259. package/dist/cjs/peer/PeerAddress.d.ts +30 -0
  260. package/dist/cjs/peer/PeerAddress.d.ts.map +1 -0
  261. package/dist/cjs/peer/PeerAddress.js +71 -0
  262. package/dist/cjs/peer/PeerAddress.js.map +6 -0
  263. package/dist/cjs/peer/PeerSet.d.ts +98 -0
  264. package/dist/cjs/peer/PeerSet.d.ts.map +1 -0
  265. package/dist/cjs/peer/PeerSet.js +500 -0
  266. package/dist/cjs/peer/PeerSet.js.map +6 -0
  267. package/dist/cjs/peer/PeerStore.d.ts +17 -0
  268. package/dist/cjs/peer/PeerStore.d.ts.map +1 -0
  269. package/dist/cjs/peer/PeerStore.js +31 -0
  270. package/dist/cjs/peer/PeerStore.js.map +6 -0
  271. package/dist/cjs/peer/index.d.ts +13 -0
  272. package/dist/cjs/peer/index.d.ts.map +1 -0
  273. package/dist/cjs/peer/index.js +30 -0
  274. package/dist/cjs/peer/index.js.map +6 -0
  275. package/dist/cjs/protocol/ChannelManager.d.ts +30 -0
  276. package/dist/cjs/protocol/ChannelManager.d.ts.map +1 -0
  277. package/dist/cjs/protocol/ChannelManager.js +168 -0
  278. package/dist/cjs/protocol/ChannelManager.js.map +6 -0
  279. package/dist/cjs/protocol/DeviceAdvertiser.d.ts +43 -0
  280. package/dist/cjs/protocol/DeviceAdvertiser.d.ts.map +1 -0
  281. package/dist/cjs/protocol/DeviceAdvertiser.js +185 -0
  282. package/dist/cjs/protocol/DeviceAdvertiser.js.map +6 -0
  283. package/dist/cjs/protocol/DeviceCommissioner.d.ts +49 -0
  284. package/dist/cjs/protocol/DeviceCommissioner.d.ts.map +1 -0
  285. package/dist/cjs/protocol/DeviceCommissioner.js +198 -0
  286. package/dist/cjs/protocol/DeviceCommissioner.js.map +6 -0
  287. package/dist/cjs/protocol/ExchangeManager.d.ts +73 -0
  288. package/dist/cjs/protocol/ExchangeManager.d.ts.map +1 -0
  289. package/dist/cjs/protocol/ExchangeManager.js +407 -0
  290. package/dist/cjs/protocol/ExchangeManager.js.map +6 -0
  291. package/dist/cjs/protocol/MessageCounter.d.ts +57 -0
  292. package/dist/cjs/protocol/MessageCounter.d.ts.map +1 -0
  293. package/dist/cjs/protocol/MessageCounter.js +104 -0
  294. package/dist/cjs/protocol/MessageCounter.js.map +6 -0
  295. package/dist/cjs/protocol/MessageExchange.d.ts +84 -0
  296. package/dist/cjs/protocol/MessageExchange.d.ts.map +1 -0
  297. package/dist/cjs/protocol/MessageExchange.js +508 -0
  298. package/dist/cjs/protocol/MessageExchange.js.map +6 -0
  299. package/dist/cjs/protocol/MessageReceptionState.d.ts +65 -0
  300. package/dist/cjs/protocol/MessageReceptionState.d.ts.map +1 -0
  301. package/dist/cjs/protocol/MessageReceptionState.js +173 -0
  302. package/dist/cjs/protocol/MessageReceptionState.js.map +6 -0
  303. package/dist/cjs/protocol/ProtocolHandler.d.ts +13 -0
  304. package/dist/cjs/protocol/ProtocolHandler.d.ts.map +1 -0
  305. package/dist/cjs/protocol/ProtocolHandler.js +22 -0
  306. package/dist/cjs/protocol/ProtocolHandler.js.map +6 -0
  307. package/dist/cjs/protocol/index.d.ts +14 -0
  308. package/dist/cjs/protocol/index.d.ts.map +1 -0
  309. package/dist/cjs/protocol/index.js +31 -0
  310. package/dist/cjs/protocol/index.js.map +6 -0
  311. package/dist/cjs/securechannel/SecureChannelMessenger.d.ts +53 -0
  312. package/dist/cjs/securechannel/SecureChannelMessenger.d.ts.map +1 -0
  313. package/dist/cjs/securechannel/SecureChannelMessenger.js +143 -0
  314. package/dist/cjs/securechannel/SecureChannelMessenger.js.map +6 -0
  315. package/dist/cjs/securechannel/SecureChannelProtocol.d.ts +31 -0
  316. package/dist/cjs/securechannel/SecureChannelProtocol.d.ts.map +1 -0
  317. package/dist/cjs/securechannel/SecureChannelProtocol.js +140 -0
  318. package/dist/cjs/securechannel/SecureChannelProtocol.js.map +6 -0
  319. package/dist/cjs/securechannel/SecureChannelStatusMessageSchema.d.ts +23 -0
  320. package/dist/cjs/securechannel/SecureChannelStatusMessageSchema.d.ts.map +1 -0
  321. package/dist/cjs/securechannel/SecureChannelStatusMessageSchema.js +53 -0
  322. package/dist/cjs/securechannel/SecureChannelStatusMessageSchema.js.map +6 -0
  323. package/dist/cjs/securechannel/index.d.ts +9 -0
  324. package/dist/cjs/securechannel/index.d.ts.map +1 -0
  325. package/dist/cjs/securechannel/index.js +26 -0
  326. package/dist/cjs/securechannel/index.js.map +6 -0
  327. package/dist/cjs/session/InsecureSession.d.ts +38 -0
  328. package/dist/cjs/session/InsecureSession.d.ts.map +1 -0
  329. package/dist/cjs/session/InsecureSession.js +95 -0
  330. package/dist/cjs/session/InsecureSession.js.map +6 -0
  331. package/dist/cjs/session/SecureSession.d.ts +81 -0
  332. package/dist/cjs/session/SecureSession.d.ts.map +1 -0
  333. package/dist/cjs/session/SecureSession.js +291 -0
  334. package/dist/cjs/session/SecureSession.js.map +6 -0
  335. package/dist/cjs/session/Session.d.ts +102 -0
  336. package/dist/cjs/session/Session.d.ts.map +1 -0
  337. package/dist/cjs/session/Session.js +141 -0
  338. package/dist/cjs/session/Session.js.map +6 -0
  339. package/dist/cjs/session/SessionManager.d.ts +132 -0
  340. package/dist/cjs/session/SessionManager.d.ts.map +1 -0
  341. package/dist/cjs/session/SessionManager.js +410 -0
  342. package/dist/cjs/session/SessionManager.js.map +6 -0
  343. package/dist/cjs/session/case/CaseClient.d.ts +18 -0
  344. package/dist/cjs/session/case/CaseClient.d.ts.map +1 -0
  345. package/dist/cjs/session/case/CaseClient.js +216 -0
  346. package/dist/cjs/session/case/CaseClient.js.map +6 -0
  347. package/dist/cjs/session/case/CaseMessages.d.ts +82 -0
  348. package/dist/cjs/session/case/CaseMessages.d.ts.map +1 -0
  349. package/dist/cjs/session/case/CaseMessages.js +97 -0
  350. package/dist/cjs/session/case/CaseMessages.js.map +6 -0
  351. package/dist/cjs/session/case/CaseMessenger.d.ts +79 -0
  352. package/dist/cjs/session/case/CaseMessenger.d.ts.map +1 -0
  353. package/dist/cjs/session/case/CaseMessenger.js +74 -0
  354. package/dist/cjs/session/case/CaseMessenger.js.map +6 -0
  355. package/dist/cjs/session/case/CaseServer.d.ts +18 -0
  356. package/dist/cjs/session/case/CaseServer.d.ts.map +1 -0
  357. package/dist/cjs/session/case/CaseServer.js +232 -0
  358. package/dist/cjs/session/case/CaseServer.js.map +6 -0
  359. package/dist/cjs/session/index.d.ts +18 -0
  360. package/dist/cjs/session/index.d.ts.map +1 -0
  361. package/dist/cjs/session/index.js +35 -0
  362. package/dist/cjs/session/index.js.map +6 -0
  363. package/dist/cjs/session/pase/PaseClient.d.ts +18 -0
  364. package/dist/cjs/session/pase/PaseClient.d.ts.map +1 -0
  365. package/dist/cjs/session/pase/PaseClient.js +101 -0
  366. package/dist/cjs/session/pase/PaseClient.js.map +6 -0
  367. package/dist/cjs/session/pase/PaseMessages.d.ts +85 -0
  368. package/dist/cjs/session/pase/PaseMessages.d.ts.map +1 -0
  369. package/dist/cjs/session/pase/PaseMessages.js +88 -0
  370. package/dist/cjs/session/pase/PaseMessages.js.map +6 -0
  371. package/dist/cjs/session/pase/PaseMessenger.d.ts +75 -0
  372. package/dist/cjs/session/pase/PaseMessenger.d.ts.map +1 -0
  373. package/dist/cjs/session/pase/PaseMessenger.js +86 -0
  374. package/dist/cjs/session/pase/PaseMessenger.js.map +6 -0
  375. package/dist/cjs/session/pase/PaseServer.d.ts +29 -0
  376. package/dist/cjs/session/pase/PaseServer.d.ts.map +1 -0
  377. package/dist/cjs/session/pase/PaseServer.js +159 -0
  378. package/dist/cjs/session/pase/PaseServer.js.map +6 -0
  379. package/dist/cjs/tsconfig.tsbuildinfo +1 -0
  380. package/dist/esm/MatterDevice.d.ts +79 -0
  381. package/dist/esm/MatterDevice.d.ts.map +1 -0
  382. package/dist/esm/MatterDevice.js +239 -0
  383. package/dist/esm/MatterDevice.js.map +6 -0
  384. package/dist/esm/ble/Ble.d.ts +29 -0
  385. package/dist/esm/ble/Ble.d.ts.map +1 -0
  386. package/dist/esm/ble/Ble.js +30 -0
  387. package/dist/esm/ble/Ble.js.map +6 -0
  388. package/dist/esm/ble/BleConsts.d.ts +32 -0
  389. package/dist/esm/ble/BleConsts.d.ts.map +1 -0
  390. package/dist/esm/ble/BleConsts.js +33 -0
  391. package/dist/esm/ble/BleConsts.js.map +6 -0
  392. package/dist/esm/ble/BtpSessionHandler.d.ts +87 -0
  393. package/dist/esm/ble/BtpSessionHandler.d.ts.map +1 -0
  394. package/dist/esm/ble/BtpSessionHandler.js +419 -0
  395. package/dist/esm/ble/BtpSessionHandler.js.map +6 -0
  396. package/dist/esm/ble/index.d.ts +9 -0
  397. package/dist/esm/ble/index.d.ts.map +1 -0
  398. package/dist/esm/ble/index.js +9 -0
  399. package/dist/esm/ble/index.js.map +6 -0
  400. package/dist/esm/certificate/AttestationCertificateManager.d.ts +28 -0
  401. package/dist/esm/certificate/AttestationCertificateManager.d.ts.map +1 -0
  402. package/dist/esm/certificate/AttestationCertificateManager.js +155 -0
  403. package/dist/esm/certificate/AttestationCertificateManager.js.map +6 -0
  404. package/dist/esm/certificate/CertificateManager.d.ts +575 -0
  405. package/dist/esm/certificate/CertificateManager.d.ts.map +1 -0
  406. package/dist/esm/certificate/CertificateManager.js +837 -0
  407. package/dist/esm/certificate/CertificateManager.js.map +6 -0
  408. package/dist/esm/certificate/CertificationDeclarationManager.d.ts +5 -0
  409. package/dist/esm/certificate/CertificationDeclarationManager.d.ts.map +1 -0
  410. package/dist/esm/certificate/CertificationDeclarationManager.js +34 -0
  411. package/dist/esm/certificate/CertificationDeclarationManager.js.map +6 -0
  412. package/dist/esm/certificate/ChipPAAuthorities.d.ts +14 -0
  413. package/dist/esm/certificate/ChipPAAuthorities.d.ts.map +1 -0
  414. package/dist/esm/certificate/ChipPAAuthorities.js +37 -0
  415. package/dist/esm/certificate/ChipPAAuthorities.js.map +6 -0
  416. package/dist/esm/certificate/DeviceCertification.d.ts +30 -0
  417. package/dist/esm/certificate/DeviceCertification.d.ts.map +1 -0
  418. package/dist/esm/certificate/DeviceCertification.js +83 -0
  419. package/dist/esm/certificate/DeviceCertification.js.map +6 -0
  420. package/dist/esm/certificate/RootCertificateManager.d.ts +33 -0
  421. package/dist/esm/certificate/RootCertificateManager.d.ts.map +1 -0
  422. package/dist/esm/certificate/RootCertificateManager.js +139 -0
  423. package/dist/esm/certificate/RootCertificateManager.js.map +6 -0
  424. package/dist/esm/certificate/index.d.ts +12 -0
  425. package/dist/esm/certificate/index.d.ts.map +1 -0
  426. package/dist/esm/certificate/index.js +12 -0
  427. package/dist/esm/certificate/index.js.map +6 -0
  428. package/dist/esm/cluster/client/AttributeClient.d.ts +61 -0
  429. package/dist/esm/cluster/client/AttributeClient.d.ts.map +1 -0
  430. package/dist/esm/cluster/client/AttributeClient.js +157 -0
  431. package/dist/esm/cluster/client/AttributeClient.js.map +6 -0
  432. package/dist/esm/cluster/client/ClusterClient.d.ts +10 -0
  433. package/dist/esm/cluster/client/ClusterClient.d.ts.map +1 -0
  434. package/dist/esm/cluster/client/ClusterClient.js +267 -0
  435. package/dist/esm/cluster/client/ClusterClient.js.map +6 -0
  436. package/dist/esm/cluster/client/ClusterClientTypes.d.ts +171 -0
  437. package/dist/esm/cluster/client/ClusterClientTypes.d.ts.map +1 -0
  438. package/dist/esm/cluster/client/ClusterClientTypes.js +6 -0
  439. package/dist/esm/cluster/client/ClusterClientTypes.js.map +6 -0
  440. package/dist/esm/cluster/client/EventClient.d.ts +41 -0
  441. package/dist/esm/cluster/client/EventClient.d.ts.map +1 -0
  442. package/dist/esm/cluster/client/EventClient.js +74 -0
  443. package/dist/esm/cluster/client/EventClient.js.map +6 -0
  444. package/dist/esm/cluster/client/index.d.ts +10 -0
  445. package/dist/esm/cluster/client/index.d.ts.map +1 -0
  446. package/dist/esm/cluster/client/index.js +10 -0
  447. package/dist/esm/cluster/client/index.js.map +6 -0
  448. package/dist/esm/cluster/index.d.ts +8 -0
  449. package/dist/esm/cluster/index.d.ts.map +1 -0
  450. package/dist/esm/cluster/index.js +8 -0
  451. package/dist/esm/cluster/index.js.map +6 -0
  452. package/dist/esm/cluster/server/AttributeServer.d.ts +307 -0
  453. package/dist/esm/cluster/server/AttributeServer.d.ts.map +1 -0
  454. package/dist/esm/cluster/server/AttributeServer.js +718 -0
  455. package/dist/esm/cluster/server/AttributeServer.js.map +6 -0
  456. package/dist/esm/cluster/server/ClusterDatasource.d.ts +16 -0
  457. package/dist/esm/cluster/server/ClusterDatasource.d.ts.map +1 -0
  458. package/dist/esm/cluster/server/ClusterDatasource.js +6 -0
  459. package/dist/esm/cluster/server/ClusterDatasource.js.map +6 -0
  460. package/dist/esm/cluster/server/ClusterServer.d.ts +40 -0
  461. package/dist/esm/cluster/server/ClusterServer.d.ts.map +1 -0
  462. package/dist/esm/cluster/server/ClusterServer.js +6 -0
  463. package/dist/esm/cluster/server/ClusterServer.js.map +6 -0
  464. package/dist/esm/cluster/server/CommandServer.d.ts +34 -0
  465. package/dist/esm/cluster/server/CommandServer.d.ts.map +1 -0
  466. package/dist/esm/cluster/server/CommandServer.js +56 -0
  467. package/dist/esm/cluster/server/CommandServer.js.map +6 -0
  468. package/dist/esm/cluster/server/EventServer.d.ts +41 -0
  469. package/dist/esm/cluster/server/EventServer.d.ts.map +1 -0
  470. package/dist/esm/cluster/server/EventServer.js +137 -0
  471. package/dist/esm/cluster/server/EventServer.js.map +6 -0
  472. package/dist/esm/cluster/server/index.d.ts +11 -0
  473. package/dist/esm/cluster/server/index.d.ts.map +1 -0
  474. package/dist/esm/cluster/server/index.js +11 -0
  475. package/dist/esm/cluster/server/index.js.map +6 -0
  476. package/dist/esm/codec/BtpCodec.d.ts +78 -0
  477. package/dist/esm/codec/BtpCodec.d.ts.map +1 -0
  478. package/dist/esm/codec/BtpCodec.js +234 -0
  479. package/dist/esm/codec/BtpCodec.js.map +6 -0
  480. package/dist/esm/codec/MessageCodec.d.ts +63 -0
  481. package/dist/esm/codec/MessageCodec.d.ts.map +1 -0
  482. package/dist/esm/codec/MessageCodec.js +200 -0
  483. package/dist/esm/codec/MessageCodec.js.map +6 -0
  484. package/dist/esm/codec/index.d.ts +9 -0
  485. package/dist/esm/codec/index.d.ts.map +1 -0
  486. package/dist/esm/codec/index.js +15 -0
  487. package/dist/esm/codec/index.js.map +6 -0
  488. package/dist/esm/common/FailsafeContext.d.ts +79 -0
  489. package/dist/esm/common/FailsafeContext.d.ts.map +1 -0
  490. package/dist/esm/common/FailsafeContext.js +217 -0
  491. package/dist/esm/common/FailsafeContext.js.map +6 -0
  492. package/dist/esm/common/FailsafeTimer.d.ts +25 -0
  493. package/dist/esm/common/FailsafeTimer.d.ts.map +1 -0
  494. package/dist/esm/common/FailsafeTimer.js +71 -0
  495. package/dist/esm/common/FailsafeTimer.js.map +6 -0
  496. package/dist/esm/common/InstanceBroadcaster.d.ts +273 -0
  497. package/dist/esm/common/InstanceBroadcaster.d.ts.map +1 -0
  498. package/dist/esm/common/InstanceBroadcaster.js +119 -0
  499. package/dist/esm/common/InstanceBroadcaster.js.map +6 -0
  500. package/dist/esm/common/OperationalCredentialsTypes.d.ts +21 -0
  501. package/dist/esm/common/OperationalCredentialsTypes.d.ts.map +1 -0
  502. package/dist/esm/common/OperationalCredentialsTypes.js +25 -0
  503. package/dist/esm/common/OperationalCredentialsTypes.js.map +6 -0
  504. package/dist/esm/common/Scanner.d.ts +121 -0
  505. package/dist/esm/common/Scanner.d.ts.map +1 -0
  506. package/dist/esm/common/Scanner.js +31 -0
  507. package/dist/esm/common/Scanner.js.map +6 -0
  508. package/dist/esm/common/index.d.ts +12 -0
  509. package/dist/esm/common/index.d.ts.map +1 -0
  510. package/dist/esm/common/index.js +12 -0
  511. package/dist/esm/common/index.js.map +6 -0
  512. package/dist/esm/endpoint/EndpointInterface.d.ts +37 -0
  513. package/dist/esm/endpoint/EndpointInterface.d.ts.map +1 -0
  514. package/dist/esm/endpoint/EndpointInterface.js +6 -0
  515. package/dist/esm/endpoint/EndpointInterface.js.map +6 -0
  516. package/dist/esm/endpoint/EndpointStructureLogger.d.ts +31 -0
  517. package/dist/esm/endpoint/EndpointStructureLogger.d.ts.map +1 -0
  518. package/dist/esm/endpoint/EndpointStructureLogger.js +216 -0
  519. package/dist/esm/endpoint/EndpointStructureLogger.js.map +6 -0
  520. package/dist/esm/endpoint/index.d.ts +8 -0
  521. package/dist/esm/endpoint/index.d.ts.map +1 -0
  522. package/dist/esm/endpoint/index.js +8 -0
  523. package/dist/esm/endpoint/index.js.map +6 -0
  524. package/dist/esm/fabric/Fabric.d.ts +121 -0
  525. package/dist/esm/fabric/Fabric.d.ts.map +1 -0
  526. package/dist/esm/fabric/Fabric.js +422 -0
  527. package/dist/esm/fabric/Fabric.js.map +6 -0
  528. package/dist/esm/fabric/FabricManager.d.ts +44 -0
  529. package/dist/esm/fabric/FabricManager.d.ts.map +1 -0
  530. package/dist/esm/fabric/FabricManager.js +200 -0
  531. package/dist/esm/fabric/FabricManager.js.map +6 -0
  532. package/dist/esm/fabric/index.d.ts +8 -0
  533. package/dist/esm/fabric/index.d.ts.map +1 -0
  534. package/dist/esm/fabric/index.js +8 -0
  535. package/dist/esm/fabric/index.js.map +6 -0
  536. package/dist/esm/index.d.ts +20 -0
  537. package/dist/esm/index.d.ts.map +1 -0
  538. package/dist/esm/index.js +20 -0
  539. package/dist/esm/index.js.map +6 -0
  540. package/dist/esm/interaction/AccessControlManager.d.ts +49 -0
  541. package/dist/esm/interaction/AccessControlManager.d.ts.map +1 -0
  542. package/dist/esm/interaction/AccessControlManager.js +228 -0
  543. package/dist/esm/interaction/AccessControlManager.js.map +6 -0
  544. package/dist/esm/interaction/AttributeDataDecoder.d.ts +52 -0
  545. package/dist/esm/interaction/AttributeDataDecoder.d.ts.map +1 -0
  546. package/dist/esm/interaction/AttributeDataDecoder.js +171 -0
  547. package/dist/esm/interaction/AttributeDataDecoder.js.map +6 -0
  548. package/dist/esm/interaction/AttributeDataEncoder.d.ts +71 -0
  549. package/dist/esm/interaction/AttributeDataEncoder.d.ts.map +1 -0
  550. package/dist/esm/interaction/AttributeDataEncoder.js +174 -0
  551. package/dist/esm/interaction/AttributeDataEncoder.js.map +6 -0
  552. package/dist/esm/interaction/EventDataDecoder.d.ts +30 -0
  553. package/dist/esm/interaction/EventDataDecoder.d.ts.map +1 -0
  554. package/dist/esm/interaction/EventDataDecoder.js +87 -0
  555. package/dist/esm/interaction/EventDataDecoder.js.map +6 -0
  556. package/dist/esm/interaction/EventHandler.d.ts +42 -0
  557. package/dist/esm/interaction/EventHandler.d.ts.map +1 -0
  558. package/dist/esm/interaction/EventHandler.js +96 -0
  559. package/dist/esm/interaction/EventHandler.js.map +6 -0
  560. package/dist/esm/interaction/InteractionClient.d.ts +294 -0
  561. package/dist/esm/interaction/InteractionClient.d.ts.map +1 -0
  562. package/dist/esm/interaction/InteractionClient.js +827 -0
  563. package/dist/esm/interaction/InteractionClient.js.map +6 -0
  564. package/dist/esm/interaction/InteractionEndpointStructure.d.ts +59 -0
  565. package/dist/esm/interaction/InteractionEndpointStructure.d.ts.map +1 -0
  566. package/dist/esm/interaction/InteractionEndpointStructure.js +343 -0
  567. package/dist/esm/interaction/InteractionEndpointStructure.js.map +6 -0
  568. package/dist/esm/interaction/InteractionMessenger.d.ts +315 -0
  569. package/dist/esm/interaction/InteractionMessenger.d.ts.map +1 -0
  570. package/dist/esm/interaction/InteractionMessenger.js +489 -0
  571. package/dist/esm/interaction/InteractionMessenger.js.map +6 -0
  572. package/dist/esm/interaction/InteractionServer.d.ts +97 -0
  573. package/dist/esm/interaction/InteractionServer.d.ts.map +1 -0
  574. package/dist/esm/interaction/InteractionServer.js +1027 -0
  575. package/dist/esm/interaction/InteractionServer.js.map +6 -0
  576. package/dist/esm/interaction/ServerSubscription.d.ts +121 -0
  577. package/dist/esm/interaction/ServerSubscription.d.ts.map +1 -0
  578. package/dist/esm/interaction/ServerSubscription.js +669 -0
  579. package/dist/esm/interaction/ServerSubscription.js.map +6 -0
  580. package/dist/esm/interaction/Subscription.d.ts +44 -0
  581. package/dist/esm/interaction/Subscription.d.ts.map +1 -0
  582. package/dist/esm/interaction/Subscription.js +65 -0
  583. package/dist/esm/interaction/Subscription.js.map +6 -0
  584. package/dist/esm/interaction/SubscriptionOptions.d.ts +43 -0
  585. package/dist/esm/interaction/SubscriptionOptions.d.ts.map +1 -0
  586. package/dist/esm/interaction/SubscriptionOptions.js +26 -0
  587. package/dist/esm/interaction/SubscriptionOptions.js.map +6 -0
  588. package/dist/esm/interaction/index.d.ts +17 -0
  589. package/dist/esm/interaction/index.d.ts.map +1 -0
  590. package/dist/esm/interaction/index.js +17 -0
  591. package/dist/esm/interaction/index.js.map +6 -0
  592. package/dist/esm/mdns/MdnsBroadcaster.d.ts +34 -0
  593. package/dist/esm/mdns/MdnsBroadcaster.d.ts.map +1 -0
  594. package/dist/esm/mdns/MdnsBroadcaster.js +351 -0
  595. package/dist/esm/mdns/MdnsBroadcaster.js.map +6 -0
  596. package/dist/esm/mdns/MdnsConsts.d.ts +19 -0
  597. package/dist/esm/mdns/MdnsConsts.d.ts.map +1 -0
  598. package/dist/esm/mdns/MdnsConsts.js +32 -0
  599. package/dist/esm/mdns/MdnsConsts.js.map +6 -0
  600. package/dist/esm/mdns/MdnsInstanceBroadcaster.d.ts +28 -0
  601. package/dist/esm/mdns/MdnsInstanceBroadcaster.d.ts.map +1 -0
  602. package/dist/esm/mdns/MdnsInstanceBroadcaster.js +67 -0
  603. package/dist/esm/mdns/MdnsInstanceBroadcaster.js.map +6 -0
  604. package/dist/esm/mdns/MdnsScanner.d.ts +79 -0
  605. package/dist/esm/mdns/MdnsScanner.d.ts.map +1 -0
  606. package/dist/esm/mdns/MdnsScanner.js +847 -0
  607. package/dist/esm/mdns/MdnsScanner.js.map +6 -0
  608. package/dist/esm/mdns/MdnsServer.d.ts +29 -0
  609. package/dist/esm/mdns/MdnsServer.d.ts.map +1 -0
  610. package/dist/esm/mdns/MdnsServer.js +266 -0
  611. package/dist/esm/mdns/MdnsServer.js.map +6 -0
  612. package/dist/esm/mdns/MdnsService.d.ts +28 -0
  613. package/dist/esm/mdns/MdnsService.d.ts.map +1 -0
  614. package/dist/esm/mdns/MdnsService.js +83 -0
  615. package/dist/esm/mdns/MdnsService.js.map +6 -0
  616. package/dist/esm/mdns/index.d.ts +12 -0
  617. package/dist/esm/mdns/index.d.ts.map +1 -0
  618. package/dist/esm/mdns/index.js +12 -0
  619. package/dist/esm/mdns/index.js.map +6 -0
  620. package/dist/esm/package.json +10 -0
  621. package/dist/esm/peer/ControllerCommissioner.d.ts +82 -0
  622. package/dist/esm/peer/ControllerCommissioner.d.ts.map +1 -0
  623. package/dist/esm/peer/ControllerCommissioner.js +211 -0
  624. package/dist/esm/peer/ControllerCommissioner.js.map +6 -0
  625. package/dist/esm/peer/ControllerCommissioningFlow.d.ts +88 -0
  626. package/dist/esm/peer/ControllerCommissioningFlow.d.ts.map +1 -0
  627. package/dist/esm/peer/ControllerCommissioningFlow.js +832 -0
  628. package/dist/esm/peer/ControllerCommissioningFlow.js.map +6 -0
  629. package/dist/esm/peer/ControllerDiscovery.d.ts +43 -0
  630. package/dist/esm/peer/ControllerDiscovery.d.ts.map +1 -0
  631. package/dist/esm/peer/ControllerDiscovery.js +172 -0
  632. package/dist/esm/peer/ControllerDiscovery.js.map +6 -0
  633. package/dist/esm/peer/OperationalPeer.d.ts +28 -0
  634. package/dist/esm/peer/OperationalPeer.d.ts.map +1 -0
  635. package/dist/esm/peer/OperationalPeer.js +6 -0
  636. package/dist/esm/peer/OperationalPeer.js.map +6 -0
  637. package/dist/esm/peer/PeerAddress.d.ts +30 -0
  638. package/dist/esm/peer/PeerAddress.d.ts.map +1 -0
  639. package/dist/esm/peer/PeerAddress.js +51 -0
  640. package/dist/esm/peer/PeerAddress.js.map +6 -0
  641. package/dist/esm/peer/PeerSet.d.ts +98 -0
  642. package/dist/esm/peer/PeerSet.d.ts.map +1 -0
  643. package/dist/esm/peer/PeerSet.js +495 -0
  644. package/dist/esm/peer/PeerSet.js.map +6 -0
  645. package/dist/esm/peer/PeerStore.d.ts +17 -0
  646. package/dist/esm/peer/PeerStore.d.ts.map +1 -0
  647. package/dist/esm/peer/PeerStore.js +11 -0
  648. package/dist/esm/peer/PeerStore.js.map +6 -0
  649. package/dist/esm/peer/index.d.ts +13 -0
  650. package/dist/esm/peer/index.d.ts.map +1 -0
  651. package/dist/esm/peer/index.js +13 -0
  652. package/dist/esm/peer/index.js.map +6 -0
  653. package/dist/esm/protocol/ChannelManager.d.ts +30 -0
  654. package/dist/esm/protocol/ChannelManager.d.ts.map +1 -0
  655. package/dist/esm/protocol/ChannelManager.js +148 -0
  656. package/dist/esm/protocol/ChannelManager.js.map +6 -0
  657. package/dist/esm/protocol/DeviceAdvertiser.d.ts +43 -0
  658. package/dist/esm/protocol/DeviceAdvertiser.d.ts.map +1 -0
  659. package/dist/esm/protocol/DeviceAdvertiser.js +173 -0
  660. package/dist/esm/protocol/DeviceAdvertiser.js.map +6 -0
  661. package/dist/esm/protocol/DeviceCommissioner.d.ts +49 -0
  662. package/dist/esm/protocol/DeviceCommissioner.d.ts.map +1 -0
  663. package/dist/esm/protocol/DeviceCommissioner.js +187 -0
  664. package/dist/esm/protocol/DeviceCommissioner.js.map +6 -0
  665. package/dist/esm/protocol/ExchangeManager.d.ts +73 -0
  666. package/dist/esm/protocol/ExchangeManager.d.ts.map +1 -0
  667. package/dist/esm/protocol/ExchangeManager.js +398 -0
  668. package/dist/esm/protocol/ExchangeManager.js.map +6 -0
  669. package/dist/esm/protocol/MessageCounter.d.ts +57 -0
  670. package/dist/esm/protocol/MessageCounter.d.ts.map +1 -0
  671. package/dist/esm/protocol/MessageCounter.js +84 -0
  672. package/dist/esm/protocol/MessageCounter.js.map +6 -0
  673. package/dist/esm/protocol/MessageExchange.d.ts +84 -0
  674. package/dist/esm/protocol/MessageExchange.d.ts.map +1 -0
  675. package/dist/esm/protocol/MessageExchange.js +504 -0
  676. package/dist/esm/protocol/MessageExchange.js.map +6 -0
  677. package/dist/esm/protocol/MessageReceptionState.d.ts +65 -0
  678. package/dist/esm/protocol/MessageReceptionState.d.ts.map +1 -0
  679. package/dist/esm/protocol/MessageReceptionState.js +153 -0
  680. package/dist/esm/protocol/MessageReceptionState.js.map +6 -0
  681. package/dist/esm/protocol/ProtocolHandler.d.ts +13 -0
  682. package/dist/esm/protocol/ProtocolHandler.d.ts.map +1 -0
  683. package/dist/esm/protocol/ProtocolHandler.js +6 -0
  684. package/dist/esm/protocol/ProtocolHandler.js.map +6 -0
  685. package/dist/esm/protocol/index.d.ts +14 -0
  686. package/dist/esm/protocol/index.d.ts.map +1 -0
  687. package/dist/esm/protocol/index.js +14 -0
  688. package/dist/esm/protocol/index.js.map +6 -0
  689. package/dist/esm/securechannel/SecureChannelMessenger.d.ts +53 -0
  690. package/dist/esm/securechannel/SecureChannelMessenger.d.ts.map +1 -0
  691. package/dist/esm/securechannel/SecureChannelMessenger.js +128 -0
  692. package/dist/esm/securechannel/SecureChannelMessenger.js.map +6 -0
  693. package/dist/esm/securechannel/SecureChannelProtocol.d.ts +31 -0
  694. package/dist/esm/securechannel/SecureChannelProtocol.d.ts.map +1 -0
  695. package/dist/esm/securechannel/SecureChannelProtocol.js +127 -0
  696. package/dist/esm/securechannel/SecureChannelProtocol.js.map +6 -0
  697. package/dist/esm/securechannel/SecureChannelStatusMessageSchema.d.ts +23 -0
  698. package/dist/esm/securechannel/SecureChannelStatusMessageSchema.d.ts.map +1 -0
  699. package/dist/esm/securechannel/SecureChannelStatusMessageSchema.js +33 -0
  700. package/dist/esm/securechannel/SecureChannelStatusMessageSchema.js.map +6 -0
  701. package/dist/esm/securechannel/index.d.ts +9 -0
  702. package/dist/esm/securechannel/index.d.ts.map +1 -0
  703. package/dist/esm/securechannel/index.js +9 -0
  704. package/dist/esm/securechannel/index.js.map +6 -0
  705. package/dist/esm/session/InsecureSession.d.ts +38 -0
  706. package/dist/esm/session/InsecureSession.d.ts.map +1 -0
  707. package/dist/esm/session/InsecureSession.js +75 -0
  708. package/dist/esm/session/InsecureSession.js.map +6 -0
  709. package/dist/esm/session/SecureSession.d.ts +81 -0
  710. package/dist/esm/session/SecureSession.d.ts.map +1 -0
  711. package/dist/esm/session/SecureSession.js +281 -0
  712. package/dist/esm/session/SecureSession.js.map +6 -0
  713. package/dist/esm/session/Session.d.ts +102 -0
  714. package/dist/esm/session/Session.d.ts.map +1 -0
  715. package/dist/esm/session/Session.js +121 -0
  716. package/dist/esm/session/Session.js.map +6 -0
  717. package/dist/esm/session/SessionManager.d.ts +132 -0
  718. package/dist/esm/session/SessionManager.d.ts.map +1 -0
  719. package/dist/esm/session/SessionManager.js +411 -0
  720. package/dist/esm/session/SessionManager.js.map +6 -0
  721. package/dist/esm/session/case/CaseClient.d.ts +18 -0
  722. package/dist/esm/session/case/CaseClient.d.ts.map +1 -0
  723. package/dist/esm/session/case/CaseClient.js +208 -0
  724. package/dist/esm/session/case/CaseClient.js.map +6 -0
  725. package/dist/esm/session/case/CaseMessages.d.ts +82 -0
  726. package/dist/esm/session/case/CaseMessages.d.ts.map +1 -0
  727. package/dist/esm/session/case/CaseMessages.js +83 -0
  728. package/dist/esm/session/case/CaseMessages.js.map +6 -0
  729. package/dist/esm/session/case/CaseMessenger.d.ts +79 -0
  730. package/dist/esm/session/case/CaseMessenger.d.ts.map +1 -0
  731. package/dist/esm/session/case/CaseMessenger.js +54 -0
  732. package/dist/esm/session/case/CaseMessenger.js.map +6 -0
  733. package/dist/esm/session/case/CaseServer.d.ts +18 -0
  734. package/dist/esm/session/case/CaseServer.d.ts.map +1 -0
  735. package/dist/esm/session/case/CaseServer.js +224 -0
  736. package/dist/esm/session/case/CaseServer.js.map +6 -0
  737. package/dist/esm/session/index.d.ts +18 -0
  738. package/dist/esm/session/index.d.ts.map +1 -0
  739. package/dist/esm/session/index.js +18 -0
  740. package/dist/esm/session/index.js.map +6 -0
  741. package/dist/esm/session/pase/PaseClient.d.ts +18 -0
  742. package/dist/esm/session/pase/PaseClient.d.ts.map +1 -0
  743. package/dist/esm/session/pase/PaseClient.js +81 -0
  744. package/dist/esm/session/pase/PaseClient.js.map +6 -0
  745. package/dist/esm/session/pase/PaseMessages.d.ts +85 -0
  746. package/dist/esm/session/pase/PaseMessages.d.ts.map +1 -0
  747. package/dist/esm/session/pase/PaseMessages.js +68 -0
  748. package/dist/esm/session/pase/PaseMessages.js.map +6 -0
  749. package/dist/esm/session/pase/PaseMessenger.d.ts +75 -0
  750. package/dist/esm/session/pase/PaseMessenger.d.ts.map +1 -0
  751. package/dist/esm/session/pase/PaseMessenger.js +75 -0
  752. package/dist/esm/session/pase/PaseMessenger.js.map +6 -0
  753. package/dist/esm/session/pase/PaseServer.d.ts +29 -0
  754. package/dist/esm/session/pase/PaseServer.d.ts.map +1 -0
  755. package/dist/esm/session/pase/PaseServer.js +148 -0
  756. package/dist/esm/session/pase/PaseServer.js.map +6 -0
  757. package/dist/esm/tsconfig.tsbuildinfo +1 -0
  758. package/package.json +83 -0
  759. package/src/MatterDevice.ts +319 -0
  760. package/src/ble/Ble.ts +40 -0
  761. package/src/ble/BleConsts.ts +41 -0
  762. package/src/ble/BtpSessionHandler.ts +490 -0
  763. package/src/ble/index.ts +9 -0
  764. package/src/certificate/AttestationCertificateManager.ts +166 -0
  765. package/src/certificate/CertificateManager.ts +1136 -0
  766. package/src/certificate/CertificationDeclarationManager.ts +52 -0
  767. package/src/certificate/ChipPAAuthorities.ts +35 -0
  768. package/src/certificate/DeviceCertification.ts +116 -0
  769. package/src/certificate/RootCertificateManager.ts +179 -0
  770. package/src/certificate/index.ts +12 -0
  771. package/src/cluster/client/AttributeClient.ts +196 -0
  772. package/src/cluster/client/ClusterClient.ts +354 -0
  773. package/src/cluster/client/ClusterClientTypes.ts +257 -0
  774. package/src/cluster/client/EventClient.ts +110 -0
  775. package/src/cluster/client/index.ts +10 -0
  776. package/src/cluster/index.ts +8 -0
  777. package/src/cluster/server/AttributeServer.ts +986 -0
  778. package/src/cluster/server/ClusterDatasource.ts +17 -0
  779. package/src/cluster/server/ClusterServer.ts +46 -0
  780. package/src/cluster/server/CommandServer.ts +89 -0
  781. package/src/cluster/server/EventServer.ts +198 -0
  782. package/src/cluster/server/index.ts +11 -0
  783. package/src/codec/BtpCodec.ts +333 -0
  784. package/src/codec/MessageCodec.ts +276 -0
  785. package/src/codec/index.ts +9 -0
  786. package/src/common/FailsafeContext.ts +330 -0
  787. package/src/common/FailsafeTimer.ts +91 -0
  788. package/src/common/InstanceBroadcaster.ts +220 -0
  789. package/src/common/OperationalCredentialsTypes.ts +24 -0
  790. package/src/common/Scanner.ts +188 -0
  791. package/src/common/index.ts +12 -0
  792. package/src/endpoint/EndpointInterface.ts +41 -0
  793. package/src/endpoint/EndpointStructureLogger.ts +277 -0
  794. package/src/endpoint/index.ts +8 -0
  795. package/src/fabric/Fabric.ts +528 -0
  796. package/src/fabric/FabricManager.ts +231 -0
  797. package/src/fabric/index.ts +8 -0
  798. package/src/index.ts +20 -0
  799. package/src/interaction/AccessControlManager.ts +343 -0
  800. package/src/interaction/AttributeDataDecoder.ts +266 -0
  801. package/src/interaction/AttributeDataEncoder.ts +268 -0
  802. package/src/interaction/EventDataDecoder.ts +133 -0
  803. package/src/interaction/EventHandler.ts +141 -0
  804. package/src/interaction/InteractionClient.ts +1215 -0
  805. package/src/interaction/InteractionEndpointStructure.ts +462 -0
  806. package/src/interaction/InteractionMessenger.ts +592 -0
  807. package/src/interaction/InteractionServer.ts +1428 -0
  808. package/src/interaction/ServerSubscription.ts +908 -0
  809. package/src/interaction/Subscription.ts +89 -0
  810. package/src/interaction/SubscriptionOptions.ts +49 -0
  811. package/src/interaction/index.ts +17 -0
  812. package/src/mdns/MdnsBroadcaster.ts +415 -0
  813. package/src/mdns/MdnsConsts.ts +24 -0
  814. package/src/mdns/MdnsInstanceBroadcaster.ts +88 -0
  815. package/src/mdns/MdnsScanner.ts +1042 -0
  816. package/src/mdns/MdnsServer.ts +322 -0
  817. package/src/mdns/MdnsService.ts +102 -0
  818. package/src/mdns/index.ts +12 -0
  819. package/src/peer/ControllerCommissioner.ts +372 -0
  820. package/src/peer/ControllerCommissioningFlow.ts +1127 -0
  821. package/src/peer/ControllerDiscovery.ts +231 -0
  822. package/src/peer/OperationalPeer.ts +32 -0
  823. package/src/peer/PeerAddress.ts +78 -0
  824. package/src/peer/PeerSet.ts +684 -0
  825. package/src/peer/PeerStore.ts +19 -0
  826. package/src/peer/index.ts +13 -0
  827. package/src/protocol/ChannelManager.ts +168 -0
  828. package/src/protocol/DeviceAdvertiser.ts +208 -0
  829. package/src/protocol/DeviceCommissioner.ts +280 -0
  830. package/src/protocol/ExchangeManager.ts +493 -0
  831. package/src/protocol/MessageCounter.ts +128 -0
  832. package/src/protocol/MessageExchange.ts +662 -0
  833. package/src/protocol/MessageReceptionState.ts +207 -0
  834. package/src/protocol/ProtocolHandler.ts +14 -0
  835. package/src/protocol/index.ts +14 -0
  836. package/src/securechannel/SecureChannelMessenger.ts +166 -0
  837. package/src/securechannel/SecureChannelProtocol.ts +150 -0
  838. package/src/securechannel/SecureChannelStatusMessageSchema.ts +40 -0
  839. package/src/securechannel/index.ts +10 -0
  840. package/src/session/InsecureSession.ts +96 -0
  841. package/src/session/SecureSession.ts +349 -0
  842. package/src/session/Session.ts +188 -0
  843. package/src/session/SessionManager.ts +559 -0
  844. package/src/session/case/CaseClient.ts +235 -0
  845. package/src/session/case/CaseMessages.ts +81 -0
  846. package/src/session/case/CaseMessenger.ts +57 -0
  847. package/src/session/case/CaseServer.ts +269 -0
  848. package/src/session/index.ts +21 -0
  849. package/src/session/pase/PaseClient.ts +100 -0
  850. package/src/session/pase/PaseMessages.ts +72 -0
  851. package/src/session/pase/PaseMessenger.ts +86 -0
  852. package/src/session/pase/PaseServer.ts +187 -0
  853. package/src/tsconfig.json +20 -0
@@ -0,0 +1,908 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2022-2024 Matter.js Authors
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+
7
+ import {
8
+ InternalError,
9
+ Logger,
10
+ MaybePromise,
11
+ NetworkError,
12
+ NoResponseTimeoutError,
13
+ Time,
14
+ Timer,
15
+ isObject,
16
+ } from "#general";
17
+ import { Specification } from "#model";
18
+ import { PeerAddress } from "#peer/PeerAddress.js";
19
+ import type { MessageExchange } from "#protocol/MessageExchange.js";
20
+ import { SecureSession } from "#session/SecureSession.js";
21
+ import {
22
+ EventNumber,
23
+ INTERACTION_PROTOCOL_ID,
24
+ StatusCode,
25
+ StatusResponseError,
26
+ TlvAttributePath,
27
+ TlvAttributeStatus,
28
+ TlvEventFilter,
29
+ TlvEventPath,
30
+ TlvEventStatus,
31
+ TlvSchema,
32
+ TypeFromSchema,
33
+ } from "#types";
34
+ import { AnyAttributeServer, FabricScopedAttributeServer } from "../cluster/server/AttributeServer.js";
35
+ import { AnyEventServer, FabricSensitiveEventServer } from "../cluster/server/EventServer.js";
36
+ import { NoChannelError } from "../protocol/ChannelManager.js";
37
+ import { AttributeReportPayload, EventReportPayload } from "./AttributeDataEncoder.js";
38
+ import { EventStorageData } from "./EventHandler.js";
39
+ import { InteractionEndpointStructure } from "./InteractionEndpointStructure.js";
40
+ import { InteractionServerMessenger } from "./InteractionMessenger.js";
41
+ import {
42
+ AttributePath,
43
+ AttributeWithPath,
44
+ EventPath,
45
+ EventWithPath,
46
+ attributePathToId,
47
+ clusterPathToId,
48
+ eventPathToId,
49
+ } from "./InteractionServer.js";
50
+ import { Subscription, SubscriptionCriteria } from "./Subscription.js";
51
+
52
+ const logger = Logger.get("ServerSubscription");
53
+
54
+ // We use 3 minutes as global max interval because with 60 min as defined by spec the timeframe until the controller
55
+ // establishes a new subscription after e.g a reboot can be up to 60 min and the controller would assume that the value
56
+ // is unchanged. This is too long.
57
+ //
58
+ // chip-tool is not using the option to choose an appropriate interval and respect the 60 min for that and only uses the
59
+ // max sent by the controller which can lead to spamming the network with unneeded packages. So I decided for 3 minutes
60
+ // for now as a compromise until we have something better. This value is fine for non-battery devices and might be
61
+ // overridden for otherwise.
62
+ //
63
+ // To officially match the specs the developer needs to set these 60Minutes in the Subscription options!
64
+ export const MAX_INTERVAL_PUBLISHER_LIMIT_S = 60 * 60; /** 1 hour */
65
+ export const INTERNAL_INTERVAL_PUBLISHER_LIMIT_S = 3 * 60; /** 3 min */
66
+ export const MIN_INTERVAL_S = 2; // We do not send faster than 2 seconds
67
+ export const DEFAULT_RANDOMIZATION_WINDOW_S = 10; // 10 seconds
68
+
69
+ /**
70
+ * Server options that control subscription handling.
71
+ */
72
+ export interface ServerSubscriptionConfig {
73
+ /**
74
+ * Optional maximum subscription interval to use for sending subscription reports. It will be used if not too
75
+ * low and inside the range requested by the connected controller.
76
+ */
77
+ maxIntervalSeconds: number;
78
+
79
+ /**
80
+ * Optional minimum subscription interval to use for sending subscription reports. It will be used when other
81
+ * calculated values are smaller than it. Use this to make sure your device hardware can handle the load and to
82
+ * set limits.
83
+ */
84
+ minIntervalSeconds: number;
85
+
86
+ /**
87
+ * Optional subscription randomization window to use for sending subscription reports. This specifies a window
88
+ * in seconds from which a random part is added to the calculated maximum interval to make sure that devices
89
+ * that get powered on in parallel not all send at the same timepoint.
90
+ */
91
+ randomizationWindowSeconds: number;
92
+ }
93
+
94
+ export namespace ServerSubscriptionConfig {
95
+ /**
96
+ * Validate options and set defaults.
97
+ *
98
+ * @returns the resulting options
99
+ */
100
+ export function of(options?: Partial<ServerSubscriptionConfig>) {
101
+ return {
102
+ maxIntervalSeconds: options?.maxIntervalSeconds ?? INTERNAL_INTERVAL_PUBLISHER_LIMIT_S,
103
+ minIntervalSeconds: Math.max(options?.minIntervalSeconds ?? MIN_INTERVAL_S, MIN_INTERVAL_S),
104
+ randomizationWindowSeconds: options?.randomizationWindowSeconds ?? DEFAULT_RANDOMIZATION_WINDOW_S,
105
+ };
106
+ }
107
+ }
108
+
109
+ interface AttributePathWithValueVersion<T> {
110
+ path: TypeFromSchema<typeof TlvAttributePath>;
111
+ attribute: AnyAttributeServer<T>;
112
+ schema: TlvSchema<T>;
113
+ value: T;
114
+ version: number;
115
+ }
116
+
117
+ interface EventPathWithEventData<T> {
118
+ path: TypeFromSchema<typeof TlvEventPath>;
119
+ event: AnyEventServer<any, any>;
120
+ schema: TlvSchema<T>;
121
+ data: EventStorageData<T>;
122
+ }
123
+
124
+ /**
125
+ * Interface between {@link ServerSubscription} and the local Matter environment.
126
+ */
127
+ export interface ServerSubscriptionContext {
128
+ session: SecureSession;
129
+ structure: InteractionEndpointStructure;
130
+ readAttribute(
131
+ path: AttributePath,
132
+ attribute: AnyAttributeServer<unknown>,
133
+ offline?: boolean,
134
+ ): Promise<{ version: number; value: unknown }>;
135
+ readEvent(
136
+ path: EventPath,
137
+ event: AnyEventServer<any, any>,
138
+ eventFilters: TypeFromSchema<typeof TlvEventFilter>[] | undefined,
139
+ ): Promise<EventStorageData<unknown>[]>;
140
+ initiateExchange(address: PeerAddress, protocolId: number): MessageExchange;
141
+ }
142
+
143
+ /**
144
+ * Implements the server side of a single subscription.
145
+ */
146
+ export class ServerSubscription extends Subscription {
147
+ readonly #context: ServerSubscriptionContext;
148
+ readonly #structure: InteractionEndpointStructure;
149
+
150
+ #lastUpdateTimeMs = 0;
151
+ #updateTimer: Timer;
152
+ readonly #sendDelayTimer: Timer;
153
+ readonly #outstandingAttributeUpdates = new Map<string, AttributePathWithValueVersion<any>>();
154
+ readonly #outstandingEventUpdates = new Set<EventPathWithEventData<any>>();
155
+ readonly #attributeListeners = new Map<
156
+ string,
157
+ {
158
+ attribute: AnyAttributeServer<any>;
159
+ listener?: (value: any, version: number) => void;
160
+ }
161
+ >();
162
+ readonly #eventListeners = new Map<
163
+ string,
164
+ {
165
+ event: AnyEventServer<any, any>;
166
+ listener?: (newEvent: EventStorageData<any>) => void;
167
+ }
168
+ >();
169
+ #sendUpdatesActivated = false;
170
+ readonly #maxIntervalMs: number;
171
+ readonly #sendIntervalMs: number;
172
+ private readonly minIntervalFloorMs: number;
173
+ private readonly maxIntervalCeilingMs: number;
174
+ private readonly peerAddress: PeerAddress;
175
+
176
+ private sendingUpdateInProgress = false;
177
+ private sendNextUpdateImmediately = false;
178
+ private sendUpdateErrorCounter = 0;
179
+ private attributeUpdatePromises = new Set<PromiseLike<void>>();
180
+
181
+ constructor(options: {
182
+ id: number;
183
+ context: ServerSubscriptionContext;
184
+ criteria: SubscriptionCriteria;
185
+ minIntervalFloor: number;
186
+ maxIntervalCeiling: number;
187
+ subscriptionOptions: ServerSubscriptionConfig;
188
+ }) {
189
+ const { id, context, criteria, minIntervalFloor, maxIntervalCeiling, subscriptionOptions } = options;
190
+
191
+ super(context.session, id, criteria);
192
+ this.#context = context;
193
+ this.#structure = context.structure;
194
+
195
+ this.peerAddress = this.session.peerAddress;
196
+ this.minIntervalFloorMs = minIntervalFloor * 1000;
197
+ this.maxIntervalCeilingMs = maxIntervalCeiling * 1000;
198
+
199
+ const { maxInterval, sendInterval } = this.determineSendingIntervals(
200
+ subscriptionOptions.minIntervalSeconds * 1000,
201
+ subscriptionOptions.maxIntervalSeconds * 1000,
202
+ subscriptionOptions.randomizationWindowSeconds * 1000,
203
+ );
204
+ this.#maxIntervalMs = maxInterval;
205
+ this.#sendIntervalMs = sendInterval;
206
+
207
+ this.#updateTimer = Time.getTimer("Subscription update", this.#sendIntervalMs, () => this.prepareDataUpdate()); // will be started later
208
+ this.#sendDelayTimer = Time.getTimer("Subscription delay", 50, () =>
209
+ this.sendUpdate().catch(error => logger.warn("Sending subscription update failed:", error)),
210
+ ); // will be started later
211
+ }
212
+
213
+ private determineSendingIntervals(
214
+ subscriptionMinIntervalMs: number,
215
+ subscriptionMaxIntervalMs: number,
216
+ subscriptionRandomizationWindowMs: number,
217
+ ): { maxInterval: number; sendInterval: number } {
218
+ // Max Interval is the Max interval that the controller request, unless the configured one from the developer
219
+ // is lower. In that case we use the configured one. But we make sure to not be smaller than the requested
220
+ // controller minimum. But in general never faster than minimum interval configured or 2 seconds
221
+ // (SUBSCRIPTION_MIN_INTERVAL_S). Additionally, we add a randomization window to the max interval to avoid all
222
+ // devices sending at the same time. But we make sure not to exceed the global max interval.
223
+ const maxInterval = Math.min(
224
+ Math.max(
225
+ subscriptionMinIntervalMs,
226
+ Math.max(this.minIntervalFloorMs, Math.min(subscriptionMaxIntervalMs, this.maxIntervalCeilingMs)),
227
+ ) + Math.floor(subscriptionRandomizationWindowMs * Math.random()),
228
+ MAX_INTERVAL_PUBLISHER_LIMIT_S * 1000,
229
+ );
230
+ let sendInterval = Math.floor(maxInterval / 2); // Ideally we send at half the max interval
231
+ if (sendInterval < 60_000) {
232
+ // But if we have no chance of at least one full resubmission process we do like chip-tool.
233
+ // One full resubmission process takes 33-45 seconds. So 60s means we reach at least first 2 retries of a
234
+ // second subscription report after first failed.
235
+ sendInterval = Math.max(this.minIntervalFloorMs, Math.floor(maxInterval * 0.8));
236
+ }
237
+ if (sendInterval < subscriptionMinIntervalMs) {
238
+ // But not faster than once every 2s
239
+ logger.warn(
240
+ `Determined subscription send interval of ${sendInterval}ms is too low. Using maxInterval (${maxInterval}ms) instead.`,
241
+ );
242
+ sendInterval = subscriptionMinIntervalMs;
243
+ }
244
+ return { maxInterval, sendInterval };
245
+ }
246
+
247
+ private registerNewAttributes() {
248
+ const newAttributes = new Array<AttributeWithPath>();
249
+ const attributeErrors = new Array<TypeFromSchema<typeof TlvAttributeStatus>>();
250
+ const formerAttributes = new Set<string>(this.#attributeListeners.keys());
251
+
252
+ if (this.criteria.attributeRequests !== undefined) {
253
+ this.criteria.attributeRequests.forEach(path => {
254
+ const attributes = this.#structure.getAttributes([path]);
255
+
256
+ if (attributes.length === 0) {
257
+ // TODO: Also check nodeId
258
+ const { endpointId, clusterId, attributeId } = path;
259
+ if (endpointId === undefined || clusterId === undefined || attributeId === undefined) {
260
+ // Wildcard path: Just leave out values
261
+ logger.debug(
262
+ `Subscription attribute ${this.#structure.resolveAttributeName(
263
+ path,
264
+ )}: ignore non-existing attribute`,
265
+ );
266
+ } else {
267
+ // was a concrete path
268
+ try {
269
+ this.#structure.validateConcreteAttributePath(endpointId, clusterId, attributeId);
270
+ throw new InternalError(
271
+ "validateConcreteAttributePath check should throw StatusResponseError but did not.",
272
+ );
273
+ } catch (e) {
274
+ StatusResponseError.accept(e);
275
+
276
+ logger.debug(
277
+ `Subscription attribute ${this.#structure.resolveAttributeName(
278
+ path,
279
+ )}: unsupported path: Status=${e.code}`,
280
+ );
281
+
282
+ attributeErrors.push({ path, status: { status: e.code } });
283
+ }
284
+ }
285
+ return;
286
+ }
287
+
288
+ attributes.forEach(({ path, attribute }) => {
289
+ formerAttributes.delete(attributePathToId(path));
290
+
291
+ const existingAttributeListener = this.#attributeListeners.get(attributePathToId(path));
292
+ if (existingAttributeListener !== undefined) {
293
+ const { attribute: existingAttribute, listener: existingListener } = existingAttributeListener;
294
+ if (existingAttribute !== attribute) {
295
+ if (existingListener !== undefined) {
296
+ existingAttribute.removeValueChangeListener(existingListener);
297
+ }
298
+ this.#attributeListeners.delete(attributePathToId(path));
299
+ } else {
300
+ return; // Attribute is already registered and unchanged
301
+ }
302
+ }
303
+ if (attribute.isSubscribable) {
304
+ // If subscribable register listener
305
+ // TODO: Move to state change listeners from behaviors to remove the dangling promise here
306
+ const listener = (value: any, version: number) =>
307
+ this.attributeChangeListener(path, attribute.schema, version, value);
308
+ attribute.addValueChangeListener(listener);
309
+ this.#attributeListeners.set(attributePathToId(path), { attribute, listener });
310
+ } else {
311
+ this.#attributeListeners.set(attributePathToId(path), { attribute });
312
+ }
313
+ newAttributes.push({ path, attribute });
314
+ });
315
+ });
316
+ }
317
+
318
+ // Remove all listeners to attributes that no longer match the subscription
319
+ this.unregisterAttributeListeners(Array.from(formerAttributes.values()));
320
+ return { newAttributes, attributeErrors };
321
+ }
322
+
323
+ unregisterAttributeListeners(list: Array<string>) {
324
+ for (const pathId of list) {
325
+ const existingAttributeListener = this.#attributeListeners.get(pathId);
326
+ if (existingAttributeListener !== undefined) {
327
+ const { attribute, listener } = existingAttributeListener;
328
+ if (listener !== undefined) {
329
+ attribute.removeValueChangeListener(listener);
330
+ }
331
+ this.#attributeListeners.delete(pathId);
332
+ }
333
+ }
334
+ }
335
+
336
+ private registerNewEvents() {
337
+ const newEvents = new Array<EventWithPath>();
338
+ const eventErrors = new Array<TypeFromSchema<typeof TlvEventStatus>>();
339
+ const formerEvents = new Set<string>(this.#eventListeners.keys());
340
+
341
+ if (this.criteria.eventRequests !== undefined) {
342
+ this.criteria.eventRequests.forEach(path => {
343
+ const events = this.#structure.getEvents([path]);
344
+ if (events.length === 0) {
345
+ const { endpointId, clusterId, eventId } = path;
346
+ if (endpointId === undefined || clusterId === undefined || eventId === undefined) {
347
+ // Wildcard path: Just leave out values
348
+ logger.debug(
349
+ `Subscription event ${this.#structure.resolveEventName(path)}: ignore non-existing event`,
350
+ );
351
+ } else {
352
+ try {
353
+ this.#structure.validateConcreteEventPath(endpointId, clusterId, eventId);
354
+ throw new InternalError(
355
+ "validateConcreteEventPath should throw StatusResponseError but did not.",
356
+ );
357
+ } catch (e) {
358
+ StatusResponseError.accept(e);
359
+
360
+ logger.debug(
361
+ `Subscription event ${this.#structure.resolveEventName(
362
+ path,
363
+ )}: unsupported path: Status=${e.code}`,
364
+ );
365
+
366
+ eventErrors.push({ path, status: { status: e.code } });
367
+ }
368
+ }
369
+ return;
370
+ }
371
+
372
+ events.forEach(({ path, event }) => {
373
+ formerEvents.delete(eventPathToId(path));
374
+
375
+ const existingEventListener = this.#eventListeners.get(eventPathToId(path));
376
+ if (existingEventListener !== undefined) {
377
+ const { event: existingEvent, listener: existingListener } = existingEventListener;
378
+ if (existingEvent !== event) {
379
+ if (existingListener !== undefined) {
380
+ existingEvent.removeListener(existingListener);
381
+ }
382
+ this.#eventListeners.delete(eventPathToId(path));
383
+ } else {
384
+ return; // Event is already registered and unchanged
385
+ }
386
+ }
387
+ const listener = (newEvent: EventStorageData<any>) =>
388
+ this.eventChangeListener(path, event.schema, newEvent);
389
+ event.addListener(listener);
390
+ newEvents.push({ path, event });
391
+ this.#eventListeners.set(eventPathToId(path), { event, listener });
392
+ });
393
+ });
394
+ }
395
+
396
+ // Remove all listeners to events that no longer match the subscription
397
+ this.unregisterEventListeners(Array.from(formerEvents.values()));
398
+
399
+ return { newEvents, eventErrors };
400
+ }
401
+
402
+ unregisterEventListeners(list: Array<string>) {
403
+ for (const pathId of list) {
404
+ const existingEventListener = this.#eventListeners.get(pathId);
405
+ if (existingEventListener !== undefined) {
406
+ const { event, listener } = existingEventListener;
407
+ if (listener !== undefined) {
408
+ event.removeListener(listener);
409
+ }
410
+ this.#eventListeners.delete(pathId);
411
+ }
412
+ }
413
+ }
414
+
415
+ /**
416
+ * Update the session after an endpoint structure change. The method will initialize all missing new attributes and
417
+ * events and will remove listeners no longer needed.
418
+ * Newly added attributes are then treated ad "changed values" and will be sent as subscription data update to the
419
+ * controller. The data of newly added events are not sent automatically.
420
+ */
421
+ async updateSubscription() {
422
+ const { newAttributes } = this.registerNewAttributes();
423
+
424
+ for (const { path, attribute } of newAttributes) {
425
+ const { version, value } = await this.#context.readAttribute(path, attribute);
426
+
427
+ // We do not do any version filtering for attributes that are newly added to make sure controller gets
428
+ // most current state
429
+
430
+ this.#outstandingAttributeUpdates.set(attributePathToId(path), {
431
+ attribute,
432
+ path,
433
+ schema: attribute.schema,
434
+ version,
435
+ value,
436
+ });
437
+ }
438
+
439
+ const { newEvents } = this.registerNewEvents();
440
+ newEvents
441
+ .flatMap(({ path, event }): EventPathWithEventData<any>[] => {
442
+ // But we use eventFilters because we do not want to send all events to the controller
443
+ const { schema } = event;
444
+ const matchingEvents = event.get(
445
+ this.session,
446
+ this.criteria.isFabricFiltered,
447
+ undefined,
448
+ this.criteria.eventFilters,
449
+ );
450
+ return matchingEvents.map(data => ({
451
+ event,
452
+ schema,
453
+ path,
454
+ data,
455
+ }));
456
+ })
457
+ .sort((a, b) => {
458
+ const eventNumberA = a.data?.eventNumber ?? EventNumber(0);
459
+ const eventNumberB = b.data?.eventNumber ?? EventNumber(0);
460
+ if (eventNumberA > eventNumberB) {
461
+ return 1;
462
+ } else if (eventNumberA < eventNumberB) {
463
+ return -1;
464
+ } else {
465
+ return 0;
466
+ }
467
+ })
468
+ .forEach(event => this.#outstandingEventUpdates.add(event));
469
+
470
+ this.prepareDataUpdate();
471
+ }
472
+
473
+ get maxInterval(): number {
474
+ return Math.ceil(this.#maxIntervalMs / 1000);
475
+ }
476
+
477
+ get sendInterval(): number {
478
+ return Math.ceil(this.#sendIntervalMs / 1000);
479
+ }
480
+
481
+ activateSendingUpdates() {
482
+ // We do not need these data anymore, so we can free some memory
483
+ if (this.criteria.eventFilters !== undefined) this.criteria.eventFilters.length = 0;
484
+ if (this.criteria.dataVersionFilters !== undefined) this.criteria.dataVersionFilters.length = 0;
485
+
486
+ this.#sendUpdatesActivated = true;
487
+ if (this.#outstandingAttributeUpdates.size > 0 || this.#outstandingEventUpdates.size > 0) {
488
+ void this.sendUpdate();
489
+ }
490
+ this.#updateTimer = Time.getTimer("Subscription update", this.#sendIntervalMs, () =>
491
+ this.prepareDataUpdate(),
492
+ ).start();
493
+ }
494
+
495
+ /**
496
+ * Check if data should be sent straight away or delayed because the minimum interval is not reached. Delay real
497
+ * sending by 50ms in any case to mke sure to catch all updates.
498
+ */
499
+ prepareDataUpdate() {
500
+ if (this.#sendDelayTimer.isRunning) {
501
+ // sending data is already scheduled, data updates go in there
502
+ return;
503
+ }
504
+
505
+ if (!this.#sendUpdatesActivated) {
506
+ return;
507
+ }
508
+
509
+ this.#updateTimer.stop();
510
+ const now = Time.nowMs();
511
+ const timeSinceLastUpdateMs = now - this.#lastUpdateTimeMs;
512
+ if (timeSinceLastUpdateMs < this.minIntervalFloorMs) {
513
+ // Respect minimum delay time between updates
514
+ this.#updateTimer = Time.getTimer(
515
+ "Subscription update",
516
+ this.minIntervalFloorMs - timeSinceLastUpdateMs,
517
+ () => this.prepareDataUpdate(),
518
+ ).start();
519
+ return;
520
+ }
521
+
522
+ this.#sendDelayTimer.start();
523
+ this.#updateTimer = Time.getTimer("Subscription update", this.#sendIntervalMs, () =>
524
+ this.prepareDataUpdate(),
525
+ ).start();
526
+ }
527
+
528
+ /**
529
+ * Determine all attributes that have changed since the last update and send them tout to the subscriber.
530
+ */
531
+ async sendUpdate() {
532
+ if (this.sendingUpdateInProgress) {
533
+ logger.debug("Sending update already in progress, delaying update ...");
534
+ this.sendNextUpdateImmediately = true;
535
+ return;
536
+ }
537
+
538
+ // Get all outstanding updates, make sure the order is correct per endpoint and cluster
539
+ const attributeUpdatesToSend = new Array<AttributePathWithValueVersion<any>>();
540
+ const attributeUpdates: Record<string, AttributePathWithValueVersion<any>[]> = {};
541
+ Array.from(this.#outstandingAttributeUpdates.values()).forEach(entry => {
542
+ const {
543
+ path: { nodeId, endpointId, clusterId },
544
+ } = entry;
545
+ const pathId = `${nodeId}-${endpointId}-${clusterId}`;
546
+ attributeUpdates[pathId] = attributeUpdates[pathId] ?? [];
547
+ attributeUpdates[pathId].push(entry);
548
+ });
549
+ this.#outstandingAttributeUpdates.clear();
550
+ Object.values(attributeUpdates).forEach(data =>
551
+ attributeUpdatesToSend.push(
552
+ ...data.sort(({ version: versionA }, { version: versionB }) => versionA - versionB),
553
+ ),
554
+ );
555
+
556
+ const eventUpdatesToSend = Array.from(this.#outstandingEventUpdates.values());
557
+ this.#outstandingEventUpdates.clear();
558
+ this.#lastUpdateTimeMs = Time.nowMs();
559
+
560
+ this.sendingUpdateInProgress = true;
561
+ try {
562
+ await this.sendUpdateMessage(attributeUpdatesToSend, eventUpdatesToSend);
563
+ this.sendUpdateErrorCounter = 0;
564
+ } catch (error) {
565
+ if (this.isClosed) {
566
+ // No need to care about resubmissions when the server is closing
567
+ return;
568
+ }
569
+
570
+ this.sendUpdateErrorCounter++;
571
+ logger.error(
572
+ `Error sending subscription update message (error count=${this.sendUpdateErrorCounter}):`,
573
+ error,
574
+ );
575
+ if (this.sendUpdateErrorCounter <= 2) {
576
+ // fill the data back in the queue to resend with next try
577
+ const newAttributeUpdatesToSend = Array.from(this.#outstandingAttributeUpdates.values());
578
+ this.#outstandingAttributeUpdates.clear();
579
+ const newEventUpdatesToSend = Array.from(this.#outstandingEventUpdates.values());
580
+ this.#outstandingEventUpdates.clear();
581
+ [...attributeUpdatesToSend, ...newAttributeUpdatesToSend].forEach(update =>
582
+ this.#outstandingAttributeUpdates.set(attributePathToId(update.path), update),
583
+ );
584
+ [...eventUpdatesToSend, ...newEventUpdatesToSend].forEach(update =>
585
+ this.#outstandingEventUpdates.add(update),
586
+ );
587
+ } else {
588
+ logger.error(
589
+ `Sending update failed 3 times in a row, canceling subscription ${this.id} and let controller subscribe again.`,
590
+ );
591
+ this.sendNextUpdateImmediately = false;
592
+ if (
593
+ error instanceof NoResponseTimeoutError ||
594
+ error instanceof NetworkError ||
595
+ error instanceof NoChannelError
596
+ ) {
597
+ // We could not send at all, consider session as dead
598
+ await this.session.destroy(false);
599
+ } else {
600
+ throw error;
601
+ }
602
+ }
603
+ }
604
+ this.sendingUpdateInProgress = false;
605
+
606
+ if (this.sendNextUpdateImmediately) {
607
+ logger.debug("Sending delayed update immediately after last one was sent.");
608
+ this.sendNextUpdateImmediately = false;
609
+ await this.sendUpdate();
610
+ }
611
+ }
612
+
613
+ async sendInitialReport(messenger: InteractionServerMessenger) {
614
+ this.#updateTimer.stop();
615
+
616
+ const { newAttributes, attributeErrors } = this.registerNewAttributes();
617
+
618
+ const dataVersionFilterMap = new Map<string, number>(
619
+ this.criteria.dataVersionFilters?.map(({ path, dataVersion }) => [clusterPathToId(path), dataVersion]) ??
620
+ [],
621
+ );
622
+
623
+ let attributesFilteredWithVersion = false;
624
+ const attributes = new Array<{
625
+ path: TypeFromSchema<typeof TlvAttributePath>;
626
+ value: any;
627
+ version: number;
628
+ schema: TlvSchema<any>;
629
+ attribute: AnyAttributeServer<any>;
630
+ }>();
631
+ for (const { path, attribute } of newAttributes) {
632
+ try {
633
+ const { value, version } = await this.#context.readAttribute(path, attribute);
634
+ if (value === undefined) continue;
635
+
636
+ const { nodeId, endpointId, clusterId } = path;
637
+
638
+ const versionFilterValue =
639
+ endpointId !== undefined && clusterId !== undefined
640
+ ? dataVersionFilterMap.get(clusterPathToId({ nodeId, endpointId, clusterId }))
641
+ : undefined;
642
+ if (versionFilterValue !== undefined && versionFilterValue === version) {
643
+ attributesFilteredWithVersion = true;
644
+ continue;
645
+ }
646
+
647
+ attributes.push({ path, value, version, schema: attribute.schema, attribute });
648
+ } catch (error) {
649
+ logger.error(`Error reading attribute ${this.#structure.resolveAttributeName(path)}:`, error);
650
+ }
651
+ }
652
+ const attributeReportsPayload: AttributeReportPayload[] = attributes.map(
653
+ ({ path, schema, value, version, attribute }) => ({
654
+ hasFabricSensitiveData: attribute.hasFabricSensitiveData,
655
+ attributeData: {
656
+ path,
657
+ dataVersion: version,
658
+ payload: value,
659
+ schema,
660
+ },
661
+ }),
662
+ );
663
+ attributeErrors.forEach(attributeStatus =>
664
+ attributeReportsPayload.push({
665
+ hasFabricSensitiveData: false,
666
+ attributeStatus,
667
+ }),
668
+ );
669
+
670
+ const { newEvents, eventErrors } = this.registerNewEvents();
671
+
672
+ let eventsFiltered = false;
673
+ const eventReportsPayload = new Array<EventReportPayload>();
674
+ for (const { path, event } of newEvents) {
675
+ const { schema } = event;
676
+ try {
677
+ const matchingEvents = await this.#context.readEvent(path, event, this.criteria.eventFilters);
678
+ if (matchingEvents.length === 0) {
679
+ eventsFiltered = true;
680
+ } else {
681
+ matchingEvents.forEach(({ eventNumber, priority, epochTimestamp, data }) => {
682
+ eventReportsPayload.push({
683
+ hasFabricSensitiveData: event.hasFabricSensitiveData,
684
+ eventData: {
685
+ path,
686
+ eventNumber,
687
+ priority,
688
+ epochTimestamp,
689
+ payload: data,
690
+ schema,
691
+ },
692
+ });
693
+ });
694
+ }
695
+ } catch (error) {
696
+ logger.error(`Error reading event ${this.#structure.resolveEventName(path)}:`, error);
697
+ }
698
+ }
699
+ eventReportsPayload.sort((a, b) => {
700
+ const eventNumberA = a.eventData?.eventNumber ?? 0;
701
+ const eventNumberB = b.eventData?.eventNumber ?? 0;
702
+ if (eventNumberA > eventNumberB) {
703
+ return 1;
704
+ } else if (eventNumberA < eventNumberB) {
705
+ return -1;
706
+ } else {
707
+ return 0;
708
+ }
709
+ });
710
+
711
+ if (
712
+ attributes.length === 0 &&
713
+ !attributesFilteredWithVersion &&
714
+ eventReportsPayload.length === 0 &&
715
+ !eventsFiltered
716
+ ) {
717
+ throw new StatusResponseError(
718
+ "Subscription failed because no attributes or events are matching the query",
719
+ StatusCode.InvalidAction,
720
+ );
721
+ }
722
+
723
+ eventErrors.forEach(eventStatus =>
724
+ eventReportsPayload.push({
725
+ hasFabricSensitiveData: false,
726
+ eventStatus,
727
+ }),
728
+ );
729
+
730
+ logger.debug(
731
+ `Initialize Subscription with ${attributes.length} attributes and ${eventReportsPayload.length} events.`,
732
+ );
733
+ this.#lastUpdateTimeMs = Time.nowMs();
734
+
735
+ await messenger.sendDataReport(
736
+ {
737
+ suppressResponse: false, // we always need proper response for initial report
738
+ subscriptionId: this.id,
739
+ interactionModelRevision: Specification.INTERACTION_MODEL_REVISION,
740
+ attributeReportsPayload,
741
+ eventReportsPayload,
742
+ },
743
+ this.criteria.isFabricFiltered,
744
+ );
745
+ }
746
+
747
+ attributeChangeListener<T>(path: AttributePath, schema: TlvSchema<T>, version: number, value: T) {
748
+ const changeResult = this.attributeChangeHandler(path, schema, version, value);
749
+ if (MaybePromise.is(changeResult)) {
750
+ const resolver = Promise.resolve(changeResult)
751
+ .catch(error => logger.error(`Error handling attribute change:`, error))
752
+ .finally(() => this.attributeUpdatePromises.delete(resolver));
753
+ this.attributeUpdatePromises.add(resolver);
754
+ }
755
+ }
756
+
757
+ attributeChangeHandler<T>(
758
+ path: AttributePath,
759
+ schema: TlvSchema<T>,
760
+ version: number,
761
+ value: T,
762
+ ): MaybePromise<void> {
763
+ const attributeListenerData = this.#attributeListeners.get(attributePathToId(path));
764
+ if (attributeListenerData === undefined) return; // Ignore changes to attributes that are not subscribed to
765
+
766
+ const { attribute } = attributeListenerData;
767
+ if (attribute instanceof FabricScopedAttributeServer) {
768
+ // We cannot be sure what value we got for fabric filtered attributes (and from which fabric),
769
+ // so get it again for this relevant fabric. This also makes sure that fabric sensitive fields are filtered
770
+ // TODO: Remove this once we remove the legacy API and go away from using AttributeServers in the background
771
+ return this.#context.readAttribute(path, attribute, true).then(({ value }) => {
772
+ this.#outstandingAttributeUpdates.set(attributePathToId(path), {
773
+ attribute,
774
+ path,
775
+ schema,
776
+ version,
777
+ value,
778
+ });
779
+ this.prepareDataUpdate();
780
+ });
781
+ }
782
+ this.#outstandingAttributeUpdates.set(attributePathToId(path), { attribute, path, schema, version, value });
783
+ this.prepareDataUpdate();
784
+ }
785
+
786
+ eventChangeListener<T>(path: EventPath, schema: TlvSchema<T>, newEvent: EventStorageData<T>) {
787
+ const eventListenerData = this.#eventListeners.get(eventPathToId(path));
788
+ if (eventListenerData === undefined) return; // Ignore changes to attributes that are not subscribed to
789
+
790
+ const { event } = eventListenerData;
791
+ if (event instanceof FabricSensitiveEventServer) {
792
+ const { data } = newEvent;
793
+ if (isObject(data) && "fabricIndex" in data && data.fabricIndex !== this.session.fabric?.fabricIndex) {
794
+ // Ignore events from different fabrics because events are kind of always fabric filtered
795
+ return;
796
+ }
797
+ }
798
+ this.#outstandingEventUpdates.add({ event, path, schema, data: newEvent });
799
+ if (path.isUrgent) {
800
+ this.prepareDataUpdate();
801
+ }
802
+ }
803
+
804
+ async flush() {
805
+ this.#sendDelayTimer.stop();
806
+ logger.debug(
807
+ `Flushing subscription ${this.id} with ${this.#outstandingAttributeUpdates.size} attributes and ${this.#outstandingEventUpdates.size} events`,
808
+ );
809
+ if (this.#outstandingAttributeUpdates.size > 0 || this.#outstandingEventUpdates.size > 0) {
810
+ void this.sendUpdate();
811
+ }
812
+ }
813
+
814
+ override async close(graceful = false) {
815
+ this.isClosed = true;
816
+ this.#sendUpdatesActivated = false;
817
+ if (this.attributeUpdatePromises.size) {
818
+ const resolvers = [...this.attributeUpdatePromises.values()];
819
+ this.attributeUpdatePromises.clear();
820
+ await Promise.all(resolvers);
821
+ }
822
+ this.#updateTimer.stop();
823
+ this.#sendDelayTimer.stop();
824
+ this.unregisterAttributeListeners(Array.from(this.#attributeListeners.keys()));
825
+ this.unregisterEventListeners(Array.from(this.#eventListeners.keys()));
826
+ if (graceful) {
827
+ await this.flush();
828
+ }
829
+ await super.close();
830
+ }
831
+
832
+ private async sendUpdateMessage(
833
+ attributes: AttributePathWithValueVersion<any>[],
834
+ events: EventPathWithEventData<any>[],
835
+ ) {
836
+ logger.debug(
837
+ `Sending subscription update message for ID ${this.id} with ${attributes.length} attributes and ${events.length} events`,
838
+ );
839
+ const exchange = this.#context.initiateExchange(this.peerAddress, INTERACTION_PROTOCOL_ID);
840
+ if (exchange === undefined) return;
841
+ logger.debug(
842
+ `Sending subscription changes for ID ${this.id}: ${attributes
843
+ .map(
844
+ ({ path, value, version }) =>
845
+ `${this.#structure.resolveAttributeName(path)}=${Logger.toJSON(value)} (${version})`,
846
+ )
847
+ .join(", ")}`,
848
+ ); // TODO Format path better using endpoint structure
849
+ const messenger = new InteractionServerMessenger(exchange);
850
+
851
+ try {
852
+ if (attributes.length === 0 && events.length === 0) {
853
+ await messenger.sendDataReport(
854
+ {
855
+ suppressResponse: true, // suppressResponse true for empty DataReports
856
+ subscriptionId: this.id,
857
+ interactionModelRevision: Specification.INTERACTION_MODEL_REVISION,
858
+ },
859
+ this.criteria.isFabricFiltered,
860
+ );
861
+ } else {
862
+ await messenger.sendDataReport(
863
+ {
864
+ suppressResponse: false, // Non empty data reports always need to send response
865
+ subscriptionId: this.id,
866
+ interactionModelRevision: Specification.INTERACTION_MODEL_REVISION,
867
+ attributeReportsPayload: attributes.map(({ path, schema, value, version, attribute }) => ({
868
+ hasFabricSensitiveData: attribute.hasFabricSensitiveData,
869
+ attributeData: {
870
+ path,
871
+ dataVersion: version,
872
+ schema,
873
+ payload: value,
874
+ },
875
+ })),
876
+ eventReportsPayload: events.map(({ path, schema, event, data }) => {
877
+ const { eventNumber, priority, epochTimestamp, data: payload } = data;
878
+ return {
879
+ hasFabricSensitiveData: event.hasFabricSensitiveData,
880
+ eventData: {
881
+ path,
882
+ eventNumber,
883
+ priority,
884
+ epochTimestamp,
885
+ schema,
886
+ payload,
887
+ },
888
+ };
889
+ }),
890
+ },
891
+ this.criteria.isFabricFiltered,
892
+ );
893
+ }
894
+ } catch (error) {
895
+ if (StatusResponseError.is(error, StatusCode.InvalidSubscription, StatusCode.Failure)) {
896
+ logger.info(`Subscription ${this.id} cancelled by peer.`);
897
+ this.isCanceledByPeer = true;
898
+ await this.close(false);
899
+ } else {
900
+ StatusResponseError.accept(error);
901
+ logger.info(`Subscription ${this.id} update failed:`, error);
902
+ await this.close(false);
903
+ }
904
+ } finally {
905
+ await messenger.close();
906
+ }
907
+ }
908
+ }