@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,1042 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2022-2024 Matter.js Authors
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+
7
+ import {
8
+ Bytes,
9
+ ChannelType,
10
+ Diagnostic,
11
+ DnsCodec,
12
+ DnsMessagePartiallyPreEncoded,
13
+ DnsMessageType,
14
+ DnsQuery,
15
+ DnsRecord,
16
+ DnsRecordClass,
17
+ DnsRecordType,
18
+ ImplementationError,
19
+ Logger,
20
+ MAX_MDNS_MESSAGE_SIZE,
21
+ Network,
22
+ ServerAddress,
23
+ ServerAddressIp,
24
+ SrvRecordValue,
25
+ Time,
26
+ Timer,
27
+ UdpMulticastServer,
28
+ createPromise,
29
+ isIPv6,
30
+ } from "#general";
31
+ import { NodeId, VendorId } from "#types";
32
+ import {
33
+ CommissionableDevice,
34
+ CommissionableDeviceIdentifiers,
35
+ DiscoveryData,
36
+ OperationalDevice,
37
+ Scanner,
38
+ } from "../common/Scanner.js";
39
+ import { Fabric } from "../fabric/Fabric.js";
40
+ import {
41
+ MATTER_COMMISSION_SERVICE_QNAME,
42
+ MATTER_SERVICE_QNAME,
43
+ getCommissioningModeQname,
44
+ getDeviceInstanceQname,
45
+ getDeviceMatterQname,
46
+ getDeviceTypeQname,
47
+ getLongDiscriminatorQname,
48
+ getShortDiscriminatorQname,
49
+ getVendorQname,
50
+ } from "./MdnsConsts.js";
51
+ import { MDNS_BROADCAST_IPV4, MDNS_BROADCAST_IPV6, MDNS_BROADCAST_PORT } from "./MdnsServer.js";
52
+
53
+ const logger = Logger.get("MdnsScanner");
54
+
55
+ type MatterServerRecordWithExpire = ServerAddressIp & {
56
+ expires: number;
57
+ };
58
+
59
+ type CommissionableDeviceRecordWithExpire = Omit<CommissionableDevice, "addresses"> & {
60
+ expires: number;
61
+ addresses: Map<string, MatterServerRecordWithExpire>; // Override addresses type to include expiration
62
+ instanceId: string; // instance ID
63
+ SD: number; // Additional Field for Short discriminator
64
+ V?: number; // Additional Field for Vendor ID
65
+ P?: number; // Additional Field for Product ID
66
+ };
67
+
68
+ type OperationalDeviceRecordWithExpire = Omit<OperationalDevice, "addresses"> & {
69
+ expires: number;
70
+ addresses: Map<string, MatterServerRecordWithExpire>; // Override addresses type to include expiration
71
+ };
72
+
73
+ /** The initial number of seconds between two announcements. MDNS specs require 1-2 seconds, so lets use the middle. */
74
+ const START_ANNOUNCE_INTERVAL_SECONDS = 1.5;
75
+
76
+ /**
77
+ * This class implements the Scanner interface for a MDNS scanner via UDP messages in a IP based network.
78
+ * It sends out queries to discover various types of Matter device types and listens for announcements.
79
+ */
80
+ export class MdnsScanner implements Scanner {
81
+ get type() {
82
+ return ChannelType.UDP;
83
+ }
84
+
85
+ static async create(network: Network, options?: { enableIpv4?: boolean; netInterface?: string }) {
86
+ const { enableIpv4, netInterface } = options ?? {};
87
+ return new MdnsScanner(
88
+ await UdpMulticastServer.create({
89
+ network,
90
+ netInterface: netInterface,
91
+ broadcastAddressIpv4: enableIpv4 ? MDNS_BROADCAST_IPV4 : undefined,
92
+ broadcastAddressIpv6: MDNS_BROADCAST_IPV6,
93
+ listeningPort: MDNS_BROADCAST_PORT,
94
+ }),
95
+ enableIpv4,
96
+ );
97
+ }
98
+
99
+ readonly #activeAnnounceQueries = new Map<string, { queries: DnsQuery[]; answers: DnsRecord<any>[] }>();
100
+ #queryTimer?: Timer;
101
+ #nextAnnounceIntervalSeconds = START_ANNOUNCE_INTERVAL_SECONDS;
102
+
103
+ readonly #operationalDeviceRecords = new Map<string, OperationalDeviceRecordWithExpire>();
104
+ readonly #commissionableDeviceRecords = new Map<string, CommissionableDeviceRecordWithExpire>();
105
+ readonly #recordWaiters = new Map<
106
+ string,
107
+ {
108
+ resolver: () => void;
109
+ timer?: Timer;
110
+ resolveOnUpdatedRecords: boolean;
111
+ }
112
+ >();
113
+ readonly #periodicTimer: Timer;
114
+ #closing = false;
115
+
116
+ readonly #multicastServer: UdpMulticastServer;
117
+ readonly #enableIpv4?: boolean;
118
+
119
+ constructor(multicastServer: UdpMulticastServer, enableIpv4?: boolean) {
120
+ multicastServer.onMessage((message, remoteIp, netInterface) =>
121
+ this.#handleDnsMessage(message, remoteIp, netInterface),
122
+ );
123
+ this.#multicastServer = multicastServer;
124
+ this.#enableIpv4 = enableIpv4;
125
+ this.#periodicTimer = Time.getPeriodicTimer("Discovered node expiration", 60 * 1000 /* 1 mn */, () =>
126
+ this.#expire(),
127
+ ).start();
128
+ }
129
+
130
+ /**
131
+ * Sends out one DNS-SD query for all collected announce records and start a timer for the next query with doubled
132
+ * interval, maximum 60min, as per MDNS specs. The already known answers are tried to be sent in the query as long
133
+ * as they fit into a maximum 1500 byte long packet (as defined in MDNS specs), else they are split into more
134
+ * packets and the query is sent as Truncated query.
135
+ */
136
+ async #sendQueries() {
137
+ this.#queryTimer?.stop();
138
+ const allQueries = Array.from(this.#activeAnnounceQueries.values());
139
+ const queries = allQueries.flatMap(({ queries }) => queries);
140
+ const answers = allQueries.flatMap(({ answers }) => answers);
141
+
142
+ this.#queryTimer = Time.getTimer("MDNS discovery", this.#nextAnnounceIntervalSeconds * 1000, () =>
143
+ this.#sendQueries(),
144
+ ).start();
145
+
146
+ logger.debug(
147
+ `Sending ${queries.length} query records for ${this.#activeAnnounceQueries.size} queries with ${answers.length} known answers. Re-Announce in ${this.#nextAnnounceIntervalSeconds} seconds`,
148
+ );
149
+
150
+ const nextAnnounceInterval = this.#nextAnnounceIntervalSeconds * 2;
151
+ this.#nextAnnounceIntervalSeconds = Math.min(nextAnnounceInterval, 60 * 60 /* 1 hour */);
152
+
153
+ const answersToSend = [...answers];
154
+
155
+ const dnsMessageDataToSend = {
156
+ messageType: DnsMessageType.TruncatedQuery,
157
+ transactionId: 0,
158
+ queries,
159
+ authorities: [],
160
+ answers: [],
161
+ additionalRecords: [],
162
+ } as DnsMessagePartiallyPreEncoded;
163
+
164
+ const emptyDnsMessage = DnsCodec.encode(dnsMessageDataToSend);
165
+ let dnsMessageSize = emptyDnsMessage.length;
166
+
167
+ while (true) {
168
+ if (answersToSend.length > 0) {
169
+ const nextAnswer = answersToSend.shift();
170
+ if (nextAnswer === undefined) {
171
+ break;
172
+ }
173
+
174
+ const nextAnswerEncoded = DnsCodec.encodeRecord(nextAnswer);
175
+ dnsMessageSize += nextAnswerEncoded.length; // Add additional record as long as size is ok
176
+
177
+ if (dnsMessageSize > MAX_MDNS_MESSAGE_SIZE) {
178
+ if (dnsMessageDataToSend.answers.length === 0) {
179
+ // The first answer is already too big, log at least a warning
180
+ logger.warn(
181
+ `MDNS Query with ${Logger.toJSON(
182
+ queries,
183
+ )} is too big to fit into a single MDNS message. Send anyway, but please report!`,
184
+ );
185
+ }
186
+ // New answer do not fit anymore, send out the message
187
+ await this.#multicastServer.send(DnsCodec.encode(dnsMessageDataToSend));
188
+
189
+ // Reset the message, length counter and included answers to count for next message
190
+ dnsMessageDataToSend.queries.length = 0;
191
+ dnsMessageDataToSend.answers.length = 0;
192
+ dnsMessageSize = emptyDnsMessage.length + nextAnswerEncoded.length;
193
+ }
194
+ dnsMessageDataToSend.answers.push(nextAnswerEncoded);
195
+ } else {
196
+ break;
197
+ }
198
+ }
199
+
200
+ await this.#multicastServer.send(
201
+ DnsCodec.encode({ ...dnsMessageDataToSend, messageType: DnsMessageType.Query }),
202
+ );
203
+ }
204
+
205
+ /**
206
+ * Set new DnsQuery records to the list of active queries to discover devices in the network and start sending them
207
+ * out. When entry already exists the query is overwritten and answers are always added.
208
+ */
209
+ #setQueryRecords(queryId: string, queries: DnsQuery[], answers: DnsRecord<any>[] = []) {
210
+ const activeExistingQuery = this.#activeAnnounceQueries.get(queryId);
211
+ if (activeExistingQuery) {
212
+ const { queries: existingQueries } = activeExistingQuery;
213
+ const newQueries = queries.filter(
214
+ query =>
215
+ !existingQueries.some(
216
+ existingQuery =>
217
+ existingQuery.name === query.name &&
218
+ existingQuery.recordType === query.recordType &&
219
+ existingQuery.recordClass === query.recordClass,
220
+ ),
221
+ );
222
+ if (newQueries.length === 0) {
223
+ // All queries already sent out
224
+ logger.debug(
225
+ `No new query records for query ${queryId}, keeping existing queries and do not re-announce.`,
226
+ );
227
+ return;
228
+ }
229
+ queries = [...newQueries, ...existingQueries];
230
+ answers = [...activeExistingQuery.answers, ...answers];
231
+ }
232
+ this.#activeAnnounceQueries.set(queryId, { queries, answers });
233
+ logger.debug(`Set ${queries.length} query records for query ${queryId}: ${Logger.toJSON(queries)}`);
234
+ this.#queryTimer?.stop();
235
+ this.#nextAnnounceIntervalSeconds = START_ANNOUNCE_INTERVAL_SECONDS; // Reset query interval
236
+ this.#queryTimer = Time.getTimer("MDNS discovery", 0, () => this.#sendQueries()).start();
237
+ }
238
+
239
+ #getActiveQueryEarlierAnswers() {
240
+ return Array.from(this.#activeAnnounceQueries.values()).flatMap(({ answers }) => answers);
241
+ }
242
+
243
+ /**
244
+ * Remove a query from the list of active queries because discovery has finished or timed out and stop sending it
245
+ * out. If it was the last query announcing will stop completely.
246
+ */
247
+ #removeQuery(queryId: string) {
248
+ this.#activeAnnounceQueries.delete(queryId);
249
+ if (this.#activeAnnounceQueries.size === 0) {
250
+ logger.debug(`Removing last query ${queryId} and stopping announce timer`);
251
+ this.#queryTimer?.stop();
252
+ this.#nextAnnounceIntervalSeconds = START_ANNOUNCE_INTERVAL_SECONDS;
253
+ } else {
254
+ logger.debug(`Removing query ${queryId}`);
255
+ }
256
+ }
257
+
258
+ /**
259
+ * Returns the list of all targets (IP/port) discovered for a queried operational device record.
260
+ */
261
+ #getOperationalDeviceRecords(deviceMatterQname: string): OperationalDevice | undefined {
262
+ const device = this.#operationalDeviceRecords.get(deviceMatterQname);
263
+ if (device === undefined) {
264
+ return undefined;
265
+ }
266
+ const { addresses } = device;
267
+ if (addresses.size === 0) {
268
+ return undefined;
269
+ }
270
+ return {
271
+ ...device,
272
+ addresses: this.#sortServerEntries(Array.from(addresses.values())).map(({ ip, port }) => ({
273
+ ip,
274
+ port,
275
+ type: "udp",
276
+ })) as ServerAddressIp[],
277
+ };
278
+ }
279
+
280
+ /**
281
+ * Sort the list of found IP/ports and make sure link-local IPv6 addresses come first, IPv6 next and IPv4 last.
282
+ *
283
+ * @param entries
284
+ */
285
+ #sortServerEntries(entries: MatterServerRecordWithExpire[]) {
286
+ return entries.sort((a, b) => {
287
+ const aIsIPv6 = isIPv6(a.ip);
288
+ const bIsIPv6 = isIPv6(b.ip);
289
+
290
+ if (aIsIPv6 && !bIsIPv6) {
291
+ return -1; // IPv6 comes first
292
+ } else if (!aIsIPv6 && bIsIPv6) {
293
+ return 1; // IPv4 comes after IPv6
294
+ } else if (aIsIPv6 && bIsIPv6) {
295
+ if (a.ip.startsWith("fd") && !b.ip.startsWith("fd")) {
296
+ return -1; // addresses starting with "fd" come before other IPv6 addresses
297
+ } else if (!a.ip.startsWith("fd") && b.ip.startsWith("fd")) {
298
+ return 1; // addresses starting with "fd" come after other IPv6 addresses
299
+ } else if (a.ip.startsWith("fe80:") && !b.ip.startsWith("fe80:")) {
300
+ return -1; // link-local IPv6 comes before other global IPv6 addresses
301
+ } else if (!a.ip.startsWith("fe80:") && b.ip.startsWith("fe80:")) {
302
+ return 1; // link-local IPv6 comes after other global IPv6 addresses
303
+ }
304
+ }
305
+ return 0; // no preference
306
+ });
307
+ }
308
+
309
+ /**
310
+ * Registers a deferred promise for a specific queryId together with a timeout and return the promise.
311
+ * The promise will be resolved when the timer runs out latest.
312
+ */
313
+ async #registerWaiterPromise(queryId: string, timeoutSeconds?: number, resolveOnUpdatedRecords = true) {
314
+ const { promise, resolver } = createPromise<void>();
315
+ const timer =
316
+ timeoutSeconds !== undefined
317
+ ? Time.getTimer("MDNS timeout", timeoutSeconds * 1000, () => this.#finishWaiter(queryId, true)).start()
318
+ : undefined;
319
+ this.#recordWaiters.set(queryId, { resolver, timer, resolveOnUpdatedRecords });
320
+ logger.debug(
321
+ `Registered waiter for query ${queryId} with ${
322
+ timeoutSeconds !== undefined ? `timeout ${timeoutSeconds} seconds` : "no timeout"
323
+ }${resolveOnUpdatedRecords ? "" : " (not resolving on updated records)"}`,
324
+ );
325
+ return { promise };
326
+ }
327
+
328
+ /**
329
+ * Remove a waiter promise for a specific queryId and stop the connected timer. If required also resolve the
330
+ * promise.
331
+ */
332
+ #finishWaiter(queryId: string, resolvePromise: boolean, isUpdatedRecord = false) {
333
+ const waiter = this.#recordWaiters.get(queryId);
334
+ if (waiter === undefined) return;
335
+ const { timer, resolver, resolveOnUpdatedRecords } = waiter;
336
+ if (isUpdatedRecord && !resolveOnUpdatedRecords) return;
337
+ logger.debug(`Finishing waiter for query ${queryId}, resolving: ${resolvePromise}`);
338
+ if (timer !== undefined) {
339
+ timer.stop();
340
+ }
341
+ if (resolvePromise) {
342
+ resolver();
343
+ }
344
+ this.#recordWaiters.delete(queryId);
345
+ }
346
+
347
+ /** Returns weather a waiter promise is registered for a specific queryId. */
348
+ #hasWaiter(queryId: string) {
349
+ return this.#recordWaiters.has(queryId);
350
+ }
351
+
352
+ #createOperationalMatterQName(operationalId: Uint8Array, nodeId: NodeId) {
353
+ const operationalIdString = Bytes.toHex(operationalId).toUpperCase();
354
+ return getDeviceMatterQname(operationalIdString, NodeId.toHexString(nodeId));
355
+ }
356
+
357
+ /**
358
+ * Method to find an operational device (already commissioned) and return a promise with the list of discovered
359
+ * IP/ports or an empty array if not found.
360
+ */
361
+ async findOperationalDevice(
362
+ { operationalId }: Fabric,
363
+ nodeId: NodeId,
364
+ timeoutSeconds?: number,
365
+ ignoreExistingRecords = false,
366
+ ): Promise<OperationalDevice | undefined> {
367
+ if (this.#closing) {
368
+ throw new ImplementationError("Cannot discover operational device because scanner is closing.");
369
+ }
370
+ const deviceMatterQname = this.#createOperationalMatterQName(operationalId, nodeId);
371
+
372
+ let storedDevice = ignoreExistingRecords ? undefined : this.#getOperationalDeviceRecords(deviceMatterQname);
373
+ if (storedDevice === undefined) {
374
+ const { promise } = await this.#registerWaiterPromise(deviceMatterQname, timeoutSeconds);
375
+
376
+ this.#setQueryRecords(deviceMatterQname, [
377
+ {
378
+ name: deviceMatterQname,
379
+ recordClass: DnsRecordClass.IN,
380
+ recordType: DnsRecordType.SRV,
381
+ },
382
+ ]);
383
+
384
+ await promise;
385
+ storedDevice = this.#getOperationalDeviceRecords(deviceMatterQname);
386
+ this.#removeQuery(deviceMatterQname);
387
+ }
388
+ return storedDevice;
389
+ }
390
+
391
+ cancelOperationalDeviceDiscovery(fabric: Fabric, nodeId: NodeId, resolvePromise = true) {
392
+ const deviceMatterQname = this.#createOperationalMatterQName(fabric.operationalId, nodeId);
393
+ this.#finishWaiter(deviceMatterQname, resolvePromise);
394
+ }
395
+
396
+ cancelCommissionableDeviceDiscovery(identifier: CommissionableDeviceIdentifiers, resolvePromise = true) {
397
+ const queryId = this.#buildCommissionableQueryIdentifier(identifier);
398
+ this.#finishWaiter(queryId, resolvePromise);
399
+ }
400
+
401
+ getDiscoveredOperationalDevice({ operationalId }: Fabric, nodeId: NodeId) {
402
+ return this.#getOperationalDeviceRecords(this.#createOperationalMatterQName(operationalId, nodeId));
403
+ }
404
+
405
+ /**
406
+ * Returns the metadata and list of all target addresses (IP/port) discovered for a queried commissionable device
407
+ * record.
408
+ */
409
+ #getCommissionableDeviceRecords(identifier: CommissionableDeviceIdentifiers) {
410
+ const storedRecords = Array.from(this.#commissionableDeviceRecords.values());
411
+
412
+ const foundRecords = new Array<CommissionableDeviceRecordWithExpire>();
413
+ if ("instanceId" in identifier) {
414
+ foundRecords.push(...storedRecords.filter(({ instanceId }) => instanceId === identifier.instanceId));
415
+ } else if ("longDiscriminator" in identifier) {
416
+ foundRecords.push(...storedRecords.filter(({ D }) => D === identifier.longDiscriminator));
417
+ } else if ("shortDiscriminator" in identifier) {
418
+ foundRecords.push(...storedRecords.filter(({ SD }) => SD === identifier.shortDiscriminator));
419
+ } else if ("vendorId" in identifier && "productId" in identifier) {
420
+ foundRecords.push(
421
+ ...storedRecords.filter(({ V, P }) => V === identifier.vendorId && P === identifier.productId),
422
+ );
423
+ } else if ("vendorId" in identifier) {
424
+ foundRecords.push(...storedRecords.filter(({ V }) => V === identifier.vendorId));
425
+ } else if ("deviceType" in identifier) {
426
+ foundRecords.push(...storedRecords.filter(({ DT }) => DT === identifier.deviceType));
427
+ } else if ("productId" in identifier) {
428
+ foundRecords.push(...storedRecords.filter(({ P }) => P === identifier.productId));
429
+ } else if (Object.keys(identifier).length === 0) {
430
+ foundRecords.push(...storedRecords.filter(({ CM }) => CM === 1 || CM === 2));
431
+ }
432
+
433
+ return foundRecords.map(record => {
434
+ return {
435
+ ...record,
436
+ addresses: this.#sortServerEntries(Array.from(record.addresses.values())).map(({ ip, port }) => ({
437
+ ip,
438
+ port,
439
+ type: "udp",
440
+ })) as ServerAddressIp[],
441
+ expires: undefined,
442
+ };
443
+ });
444
+ }
445
+
446
+ /**
447
+ * Builds an identifier string for commissionable queries based on the given identifier object.
448
+ * Some identifiers are identical to the official DNS-SD identifiers, others are custom.
449
+ */
450
+ #buildCommissionableQueryIdentifier(identifier: CommissionableDeviceIdentifiers) {
451
+ if ("instanceId" in identifier) {
452
+ return getDeviceInstanceQname(identifier.instanceId);
453
+ } else if ("longDiscriminator" in identifier) {
454
+ return getLongDiscriminatorQname(identifier.longDiscriminator);
455
+ } else if ("shortDiscriminator" in identifier) {
456
+ return getShortDiscriminatorQname(identifier.shortDiscriminator);
457
+ } else if ("vendorId" in identifier && "productId" in identifier) {
458
+ // Custom identifier because normally productId is only included in TXT record
459
+ return `_VP${identifier.vendorId}+${identifier.productId}`;
460
+ } else if ("vendorId" in identifier) {
461
+ return getVendorQname(identifier.vendorId);
462
+ } else if ("deviceType" in identifier) {
463
+ return getDeviceTypeQname(identifier.deviceType);
464
+ } else if ("productId" in identifier) {
465
+ // Custom identifier because normally productId is only included in TXT record
466
+ return `_P${identifier.productId}`;
467
+ } else if (Object.keys(identifier).length === 0) {
468
+ return getCommissioningModeQname();
469
+ }
470
+ throw new ImplementationError(`Invalid commissionable device identifier : ${Logger.toJSON(identifier)}`); // Should neven happen
471
+ }
472
+
473
+ #extractInstanceId(instanceName: string) {
474
+ const instanceNameSeparator = instanceName.indexOf(".");
475
+ if (instanceNameSeparator !== -1) {
476
+ return instanceName.substring(0, instanceNameSeparator);
477
+ }
478
+ return instanceName;
479
+ }
480
+
481
+ /**
482
+ * Check all options for a query identifier and return the most relevant one with an active query
483
+ */
484
+ #findCommissionableQueryIdentifier(instanceName: string, record: CommissionableDeviceRecordWithExpire) {
485
+ if (this.#closing) {
486
+ throw new ImplementationError("Cannot discover commissionable device because scanner is closing.");
487
+ }
488
+ const instanceQueryId = this.#buildCommissionableQueryIdentifier({
489
+ instanceId: this.#extractInstanceId(instanceName),
490
+ });
491
+ if (this.#activeAnnounceQueries.has(instanceQueryId)) {
492
+ return instanceQueryId;
493
+ }
494
+
495
+ const longDiscriminatorQueryId = this.#buildCommissionableQueryIdentifier({ longDiscriminator: record.D });
496
+ if (this.#activeAnnounceQueries.has(longDiscriminatorQueryId)) {
497
+ return longDiscriminatorQueryId;
498
+ }
499
+
500
+ const shortDiscriminatorQueryId = this.#buildCommissionableQueryIdentifier({ shortDiscriminator: record.SD });
501
+ if (this.#activeAnnounceQueries.has(shortDiscriminatorQueryId)) {
502
+ return shortDiscriminatorQueryId;
503
+ }
504
+
505
+ if (record.V !== undefined && record.P !== undefined) {
506
+ const vendorProductIdQueryId = this.#buildCommissionableQueryIdentifier({
507
+ vendorId: VendorId(record.V),
508
+ productId: record.P,
509
+ });
510
+ if (this.#activeAnnounceQueries.has(vendorProductIdQueryId)) {
511
+ return vendorProductIdQueryId;
512
+ }
513
+ }
514
+
515
+ if (record.V !== undefined) {
516
+ const vendorIdQueryId = this.#buildCommissionableQueryIdentifier({ vendorId: VendorId(record.V) });
517
+ if (this.#activeAnnounceQueries.has(vendorIdQueryId)) {
518
+ return vendorIdQueryId;
519
+ }
520
+ }
521
+
522
+ if (record.DT !== undefined) {
523
+ const deviceTypeQueryId = this.#buildCommissionableQueryIdentifier({ deviceType: record.DT });
524
+ if (this.#activeAnnounceQueries.has(deviceTypeQueryId)) {
525
+ return deviceTypeQueryId;
526
+ }
527
+ }
528
+
529
+ if (record.P !== undefined) {
530
+ const productIdQueryId = this.#buildCommissionableQueryIdentifier({ productId: record.P });
531
+ if (this.#activeAnnounceQueries.has(productIdQueryId)) {
532
+ return productIdQueryId;
533
+ }
534
+ }
535
+
536
+ const commissioningModeQueryId = this.#buildCommissionableQueryIdentifier({});
537
+ if (this.#activeAnnounceQueries.has(commissioningModeQueryId)) {
538
+ return commissioningModeQueryId;
539
+ }
540
+
541
+ return undefined;
542
+ }
543
+
544
+ #getCommissionableQueryRecords(identifier: CommissionableDeviceIdentifiers): DnsQuery[] {
545
+ const names = new Array<string>();
546
+
547
+ names.push(MATTER_COMMISSION_SERVICE_QNAME);
548
+
549
+ if ("instanceId" in identifier) {
550
+ names.push(getDeviceInstanceQname(identifier.instanceId));
551
+ } else if ("longDiscriminator" in identifier) {
552
+ names.push(getLongDiscriminatorQname(identifier.longDiscriminator));
553
+ } else if ("shortDiscriminator" in identifier) {
554
+ names.push(getShortDiscriminatorQname(identifier.shortDiscriminator));
555
+ } else if ("vendorId" in identifier) {
556
+ names.push(getVendorQname(identifier.vendorId));
557
+ } else if ("deviceType" in identifier) {
558
+ names.push(getDeviceTypeQname(identifier.deviceType));
559
+ } else {
560
+ // Other queries just scan for commissionable devices
561
+ names.push(getCommissioningModeQname());
562
+ }
563
+
564
+ return names.map(name => ({ name, recordClass: DnsRecordClass.IN, recordType: DnsRecordType.PTR }));
565
+ }
566
+
567
+ /**
568
+ * Discovers commissionable devices based on a defined identifier for maximal given timeout, but returns the
569
+ * first found entries. If already a discovered device matches in the cache the response is returned directly and
570
+ * no query is triggered. If no record exists a query is sent out and the promise gets fulfilled as soon as at least
571
+ * one device is found. If no device is discovered in the defined timeframe an empty array is returned. When the
572
+ * promise got fulfilled no more queries are send out, but more device entries might be added when discovered later.
573
+ * These can be requested by the getCommissionableDevices method.
574
+ */
575
+ async findCommissionableDevices(
576
+ identifier: CommissionableDeviceIdentifiers,
577
+ timeoutSeconds = 5,
578
+ ignoreExistingRecords = false,
579
+ ): Promise<CommissionableDevice[]> {
580
+ let storedRecords = ignoreExistingRecords
581
+ ? []
582
+ : this.#getCommissionableDeviceRecords(identifier).filter(({ addresses }) => addresses.length > 0);
583
+ if (storedRecords.length === 0) {
584
+ const queryId = this.#buildCommissionableQueryIdentifier(identifier);
585
+ const { promise } = await this.#registerWaiterPromise(queryId, timeoutSeconds);
586
+
587
+ this.#setQueryRecords(queryId, this.#getCommissionableQueryRecords(identifier));
588
+
589
+ await promise;
590
+ storedRecords = this.#getCommissionableDeviceRecords(identifier);
591
+ this.#removeQuery(queryId);
592
+ }
593
+
594
+ return storedRecords;
595
+ }
596
+
597
+ /**
598
+ * Discovers commissionable devices based on a defined identifier and returns the first found entries. If already a
599
+ * @param identifier
600
+ * @param callback
601
+ * @param timeoutSeconds
602
+ */
603
+ async findCommissionableDevicesContinuously(
604
+ identifier: CommissionableDeviceIdentifiers,
605
+ callback: (device: CommissionableDevice) => void,
606
+ timeoutSeconds = 900,
607
+ ): Promise<CommissionableDevice[]> {
608
+ const discoveredDevices = new Set<string>();
609
+
610
+ const discoveryEndTime = Time.nowMs() + timeoutSeconds * 1000;
611
+ const queryId = this.#buildCommissionableQueryIdentifier(identifier);
612
+ this.#setQueryRecords(queryId, this.#getCommissionableQueryRecords(identifier));
613
+
614
+ while (true) {
615
+ this.#getCommissionableDeviceRecords(identifier).forEach(device => {
616
+ const { deviceIdentifier } = device;
617
+ if (!discoveredDevices.has(deviceIdentifier)) {
618
+ discoveredDevices.add(deviceIdentifier);
619
+ callback(device);
620
+ }
621
+ });
622
+
623
+ const remainingTime = Math.ceil((discoveryEndTime - Time.nowMs()) / 1000);
624
+ if (remainingTime <= 0) {
625
+ break;
626
+ }
627
+ const { promise } = await this.#registerWaiterPromise(queryId, remainingTime, false);
628
+ await promise;
629
+ }
630
+ return this.#getCommissionableDeviceRecords(identifier);
631
+ }
632
+
633
+ getDiscoveredCommissionableDevices(identifier: CommissionableDeviceIdentifiers) {
634
+ return this.#getCommissionableDeviceRecords(identifier);
635
+ }
636
+
637
+ /**
638
+ * Close all connects, end all timers and resolve all pending promises.
639
+ */
640
+ async close() {
641
+ this.#closing = true;
642
+ this.#periodicTimer.stop();
643
+ this.#queryTimer?.stop();
644
+ await this.#multicastServer.close();
645
+ // Resolve all pending promises where logic waits for the response (aka: has a timer)
646
+ [...this.#recordWaiters.keys()].forEach(queryId =>
647
+ this.#finishWaiter(queryId, !!this.#recordWaiters.get(queryId)?.timer),
648
+ );
649
+ }
650
+
651
+ /**
652
+ * Main method to handle all incoming DNS messages.
653
+ * It will parse the message and check if it contains relevant discovery records.
654
+ */
655
+ #handleDnsMessage(messageBytes: Uint8Array, _remoteIp: string, netInterface: string) {
656
+ if (this.#closing) return;
657
+ const message = DnsCodec.decode(messageBytes);
658
+ if (message === undefined) return; // The message cannot be parsed
659
+ if (message.messageType !== DnsMessageType.Response && message.messageType !== DnsMessageType.TruncatedResponse)
660
+ return;
661
+
662
+ const answers = [...message.answers, ...message.additionalRecords];
663
+
664
+ // Check if we got operational discovery records and handle them
665
+ if (this.#handleOperationalRecords(answers, this.#getActiveQueryEarlierAnswers(), netInterface)) return;
666
+
667
+ // Else check if we got commissionable discovery records and handle them
668
+ this.#handleCommissionableRecords(answers, this.#getActiveQueryEarlierAnswers(), netInterface);
669
+ }
670
+
671
+ #handleIpRecords(
672
+ answers: DnsRecord<any>[],
673
+ target: string,
674
+ netInterface: string,
675
+ ): { value: string; ttl: number }[] {
676
+ const ipRecords = answers.filter(
677
+ ({ name, recordType }) =>
678
+ ((recordType === DnsRecordType.A && this.#enableIpv4) || recordType === DnsRecordType.AAAA) &&
679
+ name === target,
680
+ );
681
+ return (ipRecords as DnsRecord<string>[]).map(({ value, ttl }) => ({
682
+ value: value.startsWith("fe80::") ? `${value}%${netInterface}` : value,
683
+ ttl,
684
+ }));
685
+ }
686
+
687
+ #handleOperationalRecords(answers: DnsRecord<any>[], formerAnswers: DnsRecord<any>[], netInterface: string) {
688
+ let recordsHandled = false;
689
+ // Does the message contain data for an operational service?
690
+ const operationalTxtRecord = answers.find(
691
+ ({ name, recordType }) => recordType === DnsRecordType.TXT && name.endsWith(MATTER_SERVICE_QNAME),
692
+ );
693
+ if (operationalTxtRecord !== undefined) {
694
+ this.#handleOperationalTxtRecord(operationalTxtRecord, netInterface);
695
+ recordsHandled = true;
696
+ }
697
+
698
+ const operationalSrvRecord =
699
+ answers.find(
700
+ ({ name, recordType }) => recordType === DnsRecordType.SRV && name.endsWith(MATTER_SERVICE_QNAME),
701
+ ) ??
702
+ formerAnswers.find(
703
+ ({ name, recordType }) => recordType === DnsRecordType.SRV && name.endsWith(MATTER_SERVICE_QNAME),
704
+ );
705
+
706
+ if (operationalSrvRecord !== undefined) {
707
+ this.#handleOperationalSrvRecord(operationalSrvRecord, answers, formerAnswers, netInterface);
708
+ recordsHandled = true;
709
+ }
710
+ return recordsHandled;
711
+ }
712
+
713
+ #handleOperationalTxtRecord(record: DnsRecord<any>, netInterface: string) {
714
+ const { name: matterName, value, ttl } = record as DnsRecord<string[]>;
715
+
716
+ // we got an expiry info, so we can remove the record if we know it already and are done
717
+ if (ttl === 0) {
718
+ if (this.#operationalDeviceRecords.has(matterName)) {
719
+ logger.debug(
720
+ `Removing operational device ${matterName} from cache (interface ${netInterface}) because of ttl=0`,
721
+ );
722
+ this.#operationalDeviceRecords.delete(matterName);
723
+ }
724
+ return;
725
+ }
726
+ if (!Array.isArray(value)) return;
727
+
728
+ const txtData = this.#parseTxtRecord(record);
729
+ if (txtData === undefined) return;
730
+ let device = this.#operationalDeviceRecords.get(matterName);
731
+ if (device !== undefined) {
732
+ device = {
733
+ ...device,
734
+ expires: Time.nowMs() + ttl * 1000,
735
+ ...txtData,
736
+ };
737
+ } else {
738
+ logger.debug(
739
+ `Adding operational device ${matterName} in cache (interface ${netInterface}) with TXT data:`,
740
+ MdnsScanner.discoveryDataDiagnostics(txtData),
741
+ );
742
+ device = {
743
+ deviceIdentifier: matterName,
744
+ addresses: new Map<string, MatterServerRecordWithExpire>(),
745
+ expires: Time.nowMs() + ttl * 1000,
746
+ ...txtData,
747
+ };
748
+ }
749
+
750
+ this.#operationalDeviceRecords.set(matterName, device);
751
+ }
752
+
753
+ #handleOperationalSrvRecord(
754
+ record: DnsRecord<any>,
755
+ answers: DnsRecord<any>[],
756
+ formerAnswers: DnsRecord<any>[],
757
+ netInterface: string,
758
+ ) {
759
+ const {
760
+ name: matterName,
761
+ ttl,
762
+ value: { target, port },
763
+ } = record;
764
+
765
+ // we got an expiry info, so we can remove the record if we know it already and are done
766
+ if (ttl === 0) {
767
+ if (this.#operationalDeviceRecords.has(matterName)) {
768
+ logger.debug(
769
+ `Removing operational device ${matterName} from cache (interface ${netInterface}) because of ttl=0`,
770
+ );
771
+ this.#operationalDeviceRecords.delete(matterName);
772
+ }
773
+ return true;
774
+ }
775
+
776
+ const ips = this.#handleIpRecords([...answers, ...formerAnswers], target, netInterface);
777
+ const deviceExisted = this.#operationalDeviceRecords.has(matterName);
778
+ const device = this.#operationalDeviceRecords.get(matterName) ?? {
779
+ deviceIdentifier: matterName,
780
+ addresses: new Map<string, MatterServerRecordWithExpire>(),
781
+ expires: Time.nowMs() + ttl * 1000,
782
+ };
783
+ const { addresses } = device;
784
+ if (ips.length > 0) {
785
+ for (const { value: ip, ttl } of ips) {
786
+ if (ttl === 0) {
787
+ logger.debug(
788
+ `Removing IP ${ip} for operational device ${matterName} from cache (interface ${netInterface}) because of ttl=0`,
789
+ );
790
+ addresses.delete(ip);
791
+ continue;
792
+ }
793
+ const matterServer = addresses.get(ip) ?? { ip, port, type: "udp", expires: 0 };
794
+ matterServer.expires = Time.nowMs() + ttl * 1000;
795
+
796
+ addresses.set(matterServer.ip, matterServer);
797
+ }
798
+ device.addresses = addresses;
799
+ if (!this.#operationalDeviceRecords.has(matterName)) {
800
+ logger.debug(
801
+ `Added IPs for operational device ${matterName} to cache (interface ${netInterface}):`,
802
+ ...MdnsScanner.deviceAddressDiagnostics(addresses),
803
+ );
804
+ }
805
+ this.#operationalDeviceRecords.set(matterName, device);
806
+ }
807
+
808
+ if (addresses.size === 0 && this.#hasWaiter(matterName)) {
809
+ // We have no or no more (because expired) IPs, and we are interested in this particular service name, request them
810
+ const queries = [{ name: target, recordClass: DnsRecordClass.IN, recordType: DnsRecordType.AAAA }];
811
+ if (this.#enableIpv4) {
812
+ queries.push({ name: target, recordClass: DnsRecordClass.IN, recordType: DnsRecordType.A });
813
+ }
814
+ logger.debug(`Requesting IP addresses for operational device ${matterName} (interface ${netInterface}).`);
815
+ this.#setQueryRecords(matterName, queries, answers);
816
+ } else if (addresses.size > 0) {
817
+ this.#finishWaiter(matterName, true, deviceExisted);
818
+ }
819
+ return true;
820
+ }
821
+
822
+ #handleCommissionableRecords(answers: DnsRecord<any>[], formerAnswers: DnsRecord<any>[], netInterface: string) {
823
+ // Does the message contain a SRV record for an operational service we are interested in?
824
+ let commissionableRecords = answers.filter(({ name }) => name.endsWith(MATTER_COMMISSION_SERVICE_QNAME));
825
+ if (!commissionableRecords.length) {
826
+ commissionableRecords = formerAnswers.filter(({ name }) => name.endsWith(MATTER_COMMISSION_SERVICE_QNAME));
827
+ if (!commissionableRecords.length) return;
828
+ }
829
+
830
+ const queryMissingDataForInstances = new Set<string>();
831
+
832
+ // First process the TXT records
833
+ const txtRecords = commissionableRecords.filter(({ recordType }) => recordType === DnsRecordType.TXT);
834
+ for (const record of txtRecords) {
835
+ const { name, ttl } = record;
836
+ if (ttl === 0) {
837
+ if (this.#commissionableDeviceRecords.has(name)) {
838
+ logger.debug(
839
+ `Removing commissionable device ${name} from cache (interface ${netInterface}) because of ttl=0`,
840
+ );
841
+ this.#commissionableDeviceRecords.delete(name);
842
+ }
843
+ continue;
844
+ }
845
+ const parsedRecord = this.#parseCommissionableTxtRecord(record);
846
+ if (parsedRecord === undefined) continue;
847
+ parsedRecord.instanceId = this.#extractInstanceId(name);
848
+ parsedRecord.deviceIdentifier = parsedRecord.instanceId;
849
+ if (parsedRecord.D !== undefined && parsedRecord.SD === undefined) {
850
+ parsedRecord.SD = (parsedRecord.D >> 8) & 0x0f;
851
+ }
852
+ if (parsedRecord.VP !== undefined) {
853
+ const VpValueArr = parsedRecord.VP.split("+");
854
+ parsedRecord.V = VpValueArr[0] !== undefined ? parseInt(VpValueArr[0]) : undefined;
855
+ parsedRecord.P = VpValueArr[1] !== undefined ? parseInt(VpValueArr[1]) : undefined;
856
+ }
857
+
858
+ const storedRecord = this.#commissionableDeviceRecords.get(name);
859
+ if (storedRecord === undefined) {
860
+ queryMissingDataForInstances.add(name);
861
+
862
+ logger.debug(
863
+ `Found commissionable device ${name} with data:`,
864
+ MdnsScanner.discoveryDataDiagnostics(parsedRecord),
865
+ );
866
+ } else {
867
+ parsedRecord.addresses = storedRecord.addresses;
868
+ }
869
+ this.#commissionableDeviceRecords.set(name, parsedRecord);
870
+ }
871
+
872
+ // We got SRV records for the instance ID, so we know the host name now and can collect the IP addresses
873
+ const srvRecords = commissionableRecords.filter(({ recordType }) => recordType === DnsRecordType.SRV);
874
+ for (const record of srvRecords) {
875
+ const storedRecord = this.#commissionableDeviceRecords.get(record.name);
876
+ if (storedRecord === undefined) continue;
877
+ const {
878
+ value: { target, port },
879
+ ttl,
880
+ } = record as DnsRecord<SrvRecordValue>;
881
+ if (ttl === 0) {
882
+ logger.debug(
883
+ `Removing commissionable device ${record.name} from cache (interface ${netInterface}) because of ttl=0`,
884
+ );
885
+ this.#commissionableDeviceRecords.delete(record.name);
886
+ continue;
887
+ }
888
+
889
+ const recordExisting = storedRecord.addresses.size > 0;
890
+
891
+ const ips = this.#handleIpRecords([...answers, ...formerAnswers], target, netInterface);
892
+ if (ips.length > 0) {
893
+ for (const { value: ip, ttl } of ips) {
894
+ if (ttl === 0) {
895
+ logger.debug(
896
+ `Removing IP ${ip} for commissionable device ${record.name} from cache (interface ${netInterface}) because of ttl=0`,
897
+ );
898
+ storedRecord.addresses.delete(ip);
899
+ continue;
900
+ }
901
+ const matterServer = storedRecord.addresses.get(ip) ?? { ip, port, type: "udp", expires: 0 };
902
+ matterServer.expires = Time.nowMs() + ttl * 1000;
903
+
904
+ storedRecord.addresses.set(ip, matterServer);
905
+ }
906
+ }
907
+ this.#commissionableDeviceRecords.set(record.name, storedRecord);
908
+ if (storedRecord.addresses.size === 0) {
909
+ const queryId = this.#findCommissionableQueryIdentifier("", storedRecord);
910
+ if (queryId === undefined) continue;
911
+ // We have no or no more (because expired) IPs and we are interested in such a service name, request them
912
+ const queries = [{ name: target, recordClass: DnsRecordClass.IN, recordType: DnsRecordType.AAAA }];
913
+ if (this.#enableIpv4) {
914
+ queries.push({ name: target, recordClass: DnsRecordClass.IN, recordType: DnsRecordType.A });
915
+ }
916
+ logger.debug(
917
+ `Requesting IP addresses for commissionable device ${record.name} (interface ${netInterface}).`,
918
+ );
919
+ this.#setQueryRecords(queryId, queries, answers);
920
+ }
921
+ if (storedRecord.addresses.size === 0) continue;
922
+
923
+ const queryId = this.#findCommissionableQueryIdentifier(record.name, storedRecord);
924
+ if (queryId === undefined) continue;
925
+
926
+ queryMissingDataForInstances.delete(record.name); // No need to query anymore, we have anything we need
927
+ this.#finishWaiter(queryId, true, recordExisting);
928
+ }
929
+
930
+ // We have to query for the SRV records for the missing commissionable devices where we only had TXT records
931
+ if (queryMissingDataForInstances.size !== 0) {
932
+ for (const name of Array.from(queryMissingDataForInstances.values())) {
933
+ const storedRecord = this.#commissionableDeviceRecords.get(name);
934
+ if (storedRecord === undefined) continue;
935
+ const queryId = this.#findCommissionableQueryIdentifier("", storedRecord);
936
+ if (queryId === undefined) continue;
937
+ logger.debug(`Requesting more records for commissionable device ${name} (interface ${netInterface}).`);
938
+ this.#setQueryRecords(
939
+ queryId,
940
+ [{ name, recordClass: DnsRecordClass.IN, recordType: DnsRecordType.ANY }],
941
+ answers,
942
+ );
943
+ }
944
+ }
945
+ }
946
+
947
+ #parseTxtRecord(record: DnsRecord<any>): DiscoveryData | undefined {
948
+ const { value } = record as DnsRecord<string[]>;
949
+ const result = {} as any;
950
+ if (Array.isArray(value)) {
951
+ for (const item of value) {
952
+ const [key, value] = item.split("=");
953
+ if (key === undefined || value === undefined) continue;
954
+ if (["SII", "SAI", "SAT", "T", "D", "CM", "DT", "PH", "ICD"].includes(key)) {
955
+ const intValue = parseInt(value);
956
+ if (isNaN(intValue)) continue;
957
+ result[key] = intValue;
958
+ } else if (["VP", "DN", "RI", "PI"].includes(key)) {
959
+ result[key] = value;
960
+ }
961
+ }
962
+ }
963
+
964
+ // Fill in some defaults for convenience
965
+ if (result.T === undefined) {
966
+ result.T = 0; // TCP not supported
967
+ } else if (result.T === 1) {
968
+ // Value 1 is reserved and should be handled as 0 according to Matter spec
969
+ result.T = 0; // TCP not supported
970
+ }
971
+ if (result.ICD === undefined) {
972
+ result.ICD = 0; // Device is not operating as Long Idle Time ICD
973
+ }
974
+
975
+ return result;
976
+ }
977
+
978
+ #parseCommissionableTxtRecord(record: DnsRecord<any>): CommissionableDeviceRecordWithExpire | undefined {
979
+ const { value, ttl } = record as DnsRecord<string[]>;
980
+ if (!Array.isArray(value)) return undefined;
981
+ const result = {
982
+ addresses: new Map<string, ServerAddress>(),
983
+ expires: Time.nowMs() + ttl * 1000,
984
+ ...this.#parseTxtRecord(record),
985
+ } as any;
986
+ if (result.D === undefined || result.CM === undefined) return undefined; // Required data fields need to be existing
987
+ return result as CommissionableDeviceRecordWithExpire;
988
+ }
989
+
990
+ #expire() {
991
+ const now = Time.nowMs();
992
+ [...this.#operationalDeviceRecords.entries()].forEach(([recordKey, { addresses, expires }]) => {
993
+ if (now < expires) {
994
+ [...addresses.entries()].forEach(([key, { expires }]) => {
995
+ if (now < expires) return;
996
+ addresses.delete(key);
997
+ });
998
+ }
999
+ if (now >= expires || addresses.size === 0) {
1000
+ this.#operationalDeviceRecords.delete(recordKey);
1001
+ }
1002
+ });
1003
+ [...this.#commissionableDeviceRecords.entries()].forEach(([recordKey, { addresses, expires }]) => {
1004
+ if (now < expires) {
1005
+ // Entry still ok but check addresses for expiry
1006
+ [...addresses.entries()].forEach(([key, { expires }]) => {
1007
+ if (now < expires) return;
1008
+ addresses.delete(key);
1009
+ });
1010
+ }
1011
+ if (now >= expires || addresses.size === 0) {
1012
+ this.#commissionableDeviceRecords.delete(recordKey);
1013
+ }
1014
+ });
1015
+ }
1016
+
1017
+ static discoveryDataDiagnostics(data: DiscoveryData) {
1018
+ return Diagnostic.dict({
1019
+ SII: data.SII,
1020
+ SAI: data.SAI,
1021
+ SAT: data.SAT,
1022
+ T: data.T,
1023
+ DT: data.DT,
1024
+ PH: data.PH,
1025
+ ICD: data.ICD,
1026
+ VP: data.VP,
1027
+ DN: data.DN,
1028
+ RI: data.RI,
1029
+ PI: data.PI,
1030
+ });
1031
+ }
1032
+
1033
+ static deviceAddressDiagnostics(addresses: Map<string, MatterServerRecordWithExpire>) {
1034
+ return Array.from(addresses.values()).map(address =>
1035
+ Diagnostic.dict({
1036
+ ip: address.ip,
1037
+ port: address.port,
1038
+ type: address.type,
1039
+ }),
1040
+ );
1041
+ }
1042
+ }