@matter/protocol 0.16.0-alpha.0-20250809-ee8375bcb → 0.16.0-alpha.0-20250810-5c91a95d2

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 (366) hide show
  1. package/dist/cjs/advertisement/Advertisement.d.ts +119 -0
  2. package/dist/cjs/advertisement/Advertisement.d.ts.map +1 -0
  3. package/dist/cjs/advertisement/Advertisement.js +267 -0
  4. package/dist/cjs/advertisement/Advertisement.js.map +6 -0
  5. package/dist/cjs/advertisement/Advertiser.d.ts +50 -0
  6. package/dist/cjs/advertisement/Advertiser.d.ts.map +1 -0
  7. package/dist/cjs/advertisement/Advertiser.js +81 -0
  8. package/dist/cjs/advertisement/Advertiser.js.map +6 -0
  9. package/dist/cjs/advertisement/CommissioningMode.d.ts +11 -0
  10. package/dist/cjs/advertisement/CommissioningMode.d.ts.map +1 -0
  11. package/dist/cjs/advertisement/CommissioningMode.js +35 -0
  12. package/dist/cjs/advertisement/CommissioningMode.js.map +6 -0
  13. package/dist/cjs/{common/InstanceBroadcaster.d.ts → advertisement/PairingHintBitmap.d.ts} +3 -69
  14. package/dist/cjs/advertisement/PairingHintBitmap.d.ts.map +1 -0
  15. package/dist/cjs/{common/InstanceBroadcaster.js → advertisement/PairingHintBitmap.js} +5 -12
  16. package/dist/cjs/advertisement/PairingHintBitmap.js.map +6 -0
  17. package/dist/cjs/advertisement/ServiceDescription.d.ts +70 -0
  18. package/dist/cjs/advertisement/ServiceDescription.d.ts.map +1 -0
  19. package/dist/cjs/advertisement/ServiceDescription.js +61 -0
  20. package/dist/cjs/advertisement/ServiceDescription.js.map +6 -0
  21. package/dist/cjs/advertisement/ble/BleAdvertisement.d.ts +16 -0
  22. package/dist/cjs/advertisement/ble/BleAdvertisement.d.ts.map +1 -0
  23. package/dist/cjs/advertisement/ble/BleAdvertisement.js +85 -0
  24. package/dist/cjs/advertisement/ble/BleAdvertisement.js.map +6 -0
  25. package/dist/cjs/advertisement/ble/BleAdvertiser.d.ts +66 -0
  26. package/dist/cjs/advertisement/ble/BleAdvertiser.d.ts.map +1 -0
  27. package/dist/cjs/advertisement/ble/BleAdvertiser.js +83 -0
  28. package/dist/cjs/advertisement/ble/BleAdvertiser.js.map +6 -0
  29. package/dist/cjs/advertisement/ble/index.d.ts +8 -0
  30. package/dist/cjs/advertisement/ble/index.d.ts.map +1 -0
  31. package/dist/cjs/advertisement/ble/index.js +25 -0
  32. package/dist/cjs/advertisement/ble/index.js.map +6 -0
  33. package/dist/cjs/advertisement/index.d.ts +13 -0
  34. package/dist/cjs/advertisement/index.d.ts.map +1 -0
  35. package/dist/cjs/advertisement/index.js +30 -0
  36. package/dist/cjs/advertisement/index.js.map +6 -0
  37. package/dist/cjs/advertisement/mdns/CommissionableMdnsAdvertisement.d.ts +21 -0
  38. package/dist/cjs/advertisement/mdns/CommissionableMdnsAdvertisement.d.ts.map +1 -0
  39. package/dist/cjs/advertisement/mdns/CommissionableMdnsAdvertisement.js +104 -0
  40. package/dist/cjs/advertisement/mdns/CommissionableMdnsAdvertisement.js.map +6 -0
  41. package/dist/cjs/advertisement/mdns/CommissionerMdnsAdvertisement.d.ts +20 -0
  42. package/dist/cjs/advertisement/mdns/CommissionerMdnsAdvertisement.d.ts.map +1 -0
  43. package/dist/cjs/advertisement/mdns/CommissionerMdnsAdvertisement.js +70 -0
  44. package/dist/cjs/advertisement/mdns/CommissionerMdnsAdvertisement.js.map +6 -0
  45. package/dist/cjs/advertisement/mdns/MdnsAdvertisement.d.ts +40 -0
  46. package/dist/cjs/advertisement/mdns/MdnsAdvertisement.d.ts.map +1 -0
  47. package/dist/cjs/advertisement/mdns/MdnsAdvertisement.js +145 -0
  48. package/dist/cjs/advertisement/mdns/MdnsAdvertisement.js.map +6 -0
  49. package/dist/cjs/advertisement/mdns/MdnsAdvertiser.d.ts +99 -0
  50. package/dist/cjs/advertisement/mdns/MdnsAdvertiser.d.ts.map +1 -0
  51. package/dist/cjs/advertisement/mdns/MdnsAdvertiser.js +166 -0
  52. package/dist/cjs/advertisement/mdns/MdnsAdvertiser.js.map +6 -0
  53. package/dist/cjs/advertisement/mdns/OperationalMdnsAdvertisement.d.ts +18 -0
  54. package/dist/cjs/advertisement/mdns/OperationalMdnsAdvertisement.d.ts.map +1 -0
  55. package/dist/cjs/advertisement/mdns/OperationalMdnsAdvertisement.js +55 -0
  56. package/dist/cjs/advertisement/mdns/OperationalMdnsAdvertisement.js.map +6 -0
  57. package/dist/cjs/advertisement/mdns/index.d.ts +11 -0
  58. package/dist/cjs/advertisement/mdns/index.d.ts.map +1 -0
  59. package/dist/cjs/advertisement/mdns/index.js +28 -0
  60. package/dist/cjs/advertisement/mdns/index.js.map +6 -0
  61. package/dist/cjs/ble/Ble.d.ts +7 -5
  62. package/dist/cjs/ble/Ble.d.ts.map +1 -1
  63. package/dist/cjs/ble/Ble.js.map +1 -1
  64. package/dist/cjs/codec/BtpCodec.d.ts +1 -1
  65. package/dist/cjs/codec/BtpCodec.d.ts.map +1 -1
  66. package/dist/cjs/codec/BtpCodec.js +4 -4
  67. package/dist/cjs/codec/BtpCodec.js.map +1 -1
  68. package/dist/cjs/common/Scanner.d.ts +1 -25
  69. package/dist/cjs/common/Scanner.d.ts.map +1 -1
  70. package/dist/cjs/common/Scanner.js +1 -18
  71. package/dist/cjs/common/Scanner.js.map +1 -1
  72. package/dist/cjs/common/SupportedTransportsBitmap.d.ts +33 -0
  73. package/dist/cjs/common/SupportedTransportsBitmap.d.ts.map +1 -0
  74. package/dist/cjs/common/SupportedTransportsBitmap.js +45 -0
  75. package/dist/cjs/common/SupportedTransportsBitmap.js.map +6 -0
  76. package/dist/cjs/common/index.d.ts +1 -1
  77. package/dist/cjs/common/index.d.ts.map +1 -1
  78. package/dist/cjs/common/index.js +1 -1
  79. package/dist/cjs/common/index.js.map +1 -1
  80. package/dist/cjs/fabric/Fabric.d.ts +1 -0
  81. package/dist/cjs/fabric/Fabric.d.ts.map +1 -1
  82. package/dist/cjs/fabric/Fabric.js +7 -0
  83. package/dist/cjs/fabric/Fabric.js.map +1 -1
  84. package/dist/cjs/index.d.ts +1 -0
  85. package/dist/cjs/index.d.ts.map +1 -1
  86. package/dist/cjs/index.js +1 -0
  87. package/dist/cjs/index.js.map +1 -1
  88. package/dist/{esm/mdns/MdnsScanner.d.ts → cjs/mdns/MdnsClient.d.ts} +11 -14
  89. package/dist/cjs/mdns/MdnsClient.d.ts.map +1 -0
  90. package/dist/cjs/mdns/{MdnsScanner.js → MdnsClient.js} +35 -90
  91. package/dist/cjs/mdns/MdnsClient.js.map +6 -0
  92. package/dist/cjs/mdns/MdnsConsts.d.ts +11 -2
  93. package/dist/cjs/mdns/MdnsConsts.d.ts.map +1 -1
  94. package/dist/cjs/mdns/MdnsConsts.js +31 -4
  95. package/dist/cjs/mdns/MdnsConsts.js.map +1 -1
  96. package/dist/cjs/mdns/MdnsServer.d.ts +13 -22
  97. package/dist/cjs/mdns/MdnsServer.d.ts.map +1 -1
  98. package/dist/cjs/mdns/MdnsServer.js +55 -140
  99. package/dist/cjs/mdns/MdnsServer.js.map +2 -2
  100. package/dist/cjs/mdns/MdnsService.d.ts +4 -5
  101. package/dist/cjs/mdns/MdnsService.d.ts.map +1 -1
  102. package/dist/cjs/mdns/MdnsService.js +22 -23
  103. package/dist/cjs/mdns/MdnsService.js.map +1 -1
  104. package/dist/cjs/mdns/MdnsSocket.d.ts +32 -0
  105. package/dist/cjs/mdns/MdnsSocket.d.ts.map +1 -0
  106. package/dist/cjs/mdns/MdnsSocket.js +144 -0
  107. package/dist/cjs/mdns/MdnsSocket.js.map +6 -0
  108. package/dist/cjs/mdns/index.d.ts +2 -3
  109. package/dist/cjs/mdns/index.d.ts.map +1 -1
  110. package/dist/cjs/mdns/index.js +2 -3
  111. package/dist/cjs/mdns/index.js.map +1 -1
  112. package/dist/cjs/peer/ControllerCommissioner.js +2 -2
  113. package/dist/cjs/peer/ControllerCommissioner.js.map +1 -1
  114. package/dist/cjs/peer/ControllerDiscovery.d.ts +3 -3
  115. package/dist/cjs/peer/ControllerDiscovery.d.ts.map +1 -1
  116. package/dist/cjs/peer/ControllerDiscovery.js.map +1 -1
  117. package/dist/cjs/peer/PeerSet.d.ts.map +1 -1
  118. package/dist/cjs/peer/PeerSet.js +10 -5
  119. package/dist/cjs/peer/PeerSet.js.map +1 -1
  120. package/dist/cjs/protocol/DeviceAdvertiser.d.ts +23 -18
  121. package/dist/cjs/protocol/DeviceAdvertiser.d.ts.map +1 -1
  122. package/dist/cjs/protocol/DeviceAdvertiser.js +130 -129
  123. package/dist/cjs/protocol/DeviceAdvertiser.js.map +1 -1
  124. package/dist/cjs/protocol/DeviceCommissioner.d.ts +0 -1
  125. package/dist/cjs/protocol/DeviceCommissioner.d.ts.map +1 -1
  126. package/dist/cjs/protocol/DeviceCommissioner.js +44 -44
  127. package/dist/cjs/protocol/DeviceCommissioner.js.map +1 -1
  128. package/dist/cjs/protocol/ExchangeManager.js +1 -1
  129. package/dist/cjs/protocol/ExchangeManager.js.map +1 -1
  130. package/dist/cjs/protocol/MessageExchange.d.ts +1 -1
  131. package/dist/cjs/protocol/MessageExchange.d.ts.map +1 -1
  132. package/dist/cjs/protocol/MessageExchange.js +6 -8
  133. package/dist/cjs/protocol/MessageExchange.js.map +1 -1
  134. package/dist/cjs/session/NodeSession.d.ts +1 -0
  135. package/dist/cjs/session/NodeSession.d.ts.map +1 -1
  136. package/dist/cjs/session/NodeSession.js +3 -0
  137. package/dist/cjs/session/NodeSession.js.map +1 -1
  138. package/dist/cjs/session/Session.d.ts +3 -33
  139. package/dist/cjs/session/Session.d.ts.map +1 -1
  140. package/dist/cjs/session/Session.js +4 -9
  141. package/dist/cjs/session/Session.js.map +1 -1
  142. package/dist/cjs/session/SessionIntervals.d.ts +36 -0
  143. package/dist/cjs/session/SessionIntervals.d.ts.map +1 -0
  144. package/dist/cjs/session/SessionIntervals.js +51 -0
  145. package/dist/cjs/session/SessionIntervals.js.map +6 -0
  146. package/dist/cjs/session/SessionManager.d.ts +1 -1
  147. package/dist/cjs/session/SessionManager.d.ts.map +1 -1
  148. package/dist/cjs/session/SessionManager.js +11 -12
  149. package/dist/cjs/session/SessionManager.js.map +1 -1
  150. package/dist/cjs/session/pase/PaseMessages.js +2 -2
  151. package/dist/cjs/session/pase/PaseMessages.js.map +1 -1
  152. package/dist/esm/advertisement/Advertisement.d.ts +119 -0
  153. package/dist/esm/advertisement/Advertisement.d.ts.map +1 -0
  154. package/dist/esm/advertisement/Advertisement.js +247 -0
  155. package/dist/esm/advertisement/Advertisement.js.map +6 -0
  156. package/dist/esm/advertisement/Advertiser.d.ts +50 -0
  157. package/dist/esm/advertisement/Advertiser.d.ts.map +1 -0
  158. package/dist/esm/advertisement/Advertiser.js +61 -0
  159. package/dist/esm/advertisement/Advertiser.js.map +6 -0
  160. package/dist/esm/advertisement/CommissioningMode.d.ts +11 -0
  161. package/dist/esm/advertisement/CommissioningMode.d.ts.map +1 -0
  162. package/dist/esm/advertisement/CommissioningMode.js +15 -0
  163. package/dist/esm/advertisement/CommissioningMode.js.map +6 -0
  164. package/dist/esm/{common/InstanceBroadcaster.d.ts → advertisement/PairingHintBitmap.d.ts} +3 -69
  165. package/dist/esm/advertisement/PairingHintBitmap.d.ts.map +1 -0
  166. package/dist/esm/{common/InstanceBroadcaster.js → advertisement/PairingHintBitmap.js} +2 -9
  167. package/dist/esm/{common/InstanceBroadcaster.js.map → advertisement/PairingHintBitmap.js.map} +3 -3
  168. package/dist/esm/advertisement/ServiceDescription.d.ts +70 -0
  169. package/dist/esm/advertisement/ServiceDescription.d.ts.map +1 -0
  170. package/dist/esm/advertisement/ServiceDescription.js +41 -0
  171. package/dist/esm/advertisement/ServiceDescription.js.map +6 -0
  172. package/dist/esm/advertisement/ble/BleAdvertisement.d.ts +16 -0
  173. package/dist/esm/advertisement/ble/BleAdvertisement.d.ts.map +1 -0
  174. package/dist/esm/advertisement/ble/BleAdvertisement.js +65 -0
  175. package/dist/esm/advertisement/ble/BleAdvertisement.js.map +6 -0
  176. package/dist/esm/advertisement/ble/BleAdvertiser.d.ts +66 -0
  177. package/dist/esm/advertisement/ble/BleAdvertiser.d.ts.map +1 -0
  178. package/dist/esm/advertisement/ble/BleAdvertiser.js +63 -0
  179. package/dist/esm/advertisement/ble/BleAdvertiser.js.map +6 -0
  180. package/dist/esm/advertisement/ble/index.d.ts +8 -0
  181. package/dist/esm/advertisement/ble/index.d.ts.map +1 -0
  182. package/dist/esm/advertisement/ble/index.js +8 -0
  183. package/dist/esm/advertisement/ble/index.js.map +6 -0
  184. package/dist/esm/advertisement/index.d.ts +13 -0
  185. package/dist/esm/advertisement/index.d.ts.map +1 -0
  186. package/dist/esm/advertisement/index.js +13 -0
  187. package/dist/esm/advertisement/index.js.map +6 -0
  188. package/dist/esm/advertisement/mdns/CommissionableMdnsAdvertisement.d.ts +21 -0
  189. package/dist/esm/advertisement/mdns/CommissionableMdnsAdvertisement.d.ts.map +1 -0
  190. package/dist/esm/advertisement/mdns/CommissionableMdnsAdvertisement.js +95 -0
  191. package/dist/esm/advertisement/mdns/CommissionableMdnsAdvertisement.js.map +6 -0
  192. package/dist/esm/advertisement/mdns/CommissionerMdnsAdvertisement.d.ts +20 -0
  193. package/dist/esm/advertisement/mdns/CommissionerMdnsAdvertisement.d.ts.map +1 -0
  194. package/dist/esm/advertisement/mdns/CommissionerMdnsAdvertisement.js +54 -0
  195. package/dist/esm/advertisement/mdns/CommissionerMdnsAdvertisement.js.map +6 -0
  196. package/dist/esm/advertisement/mdns/MdnsAdvertisement.d.ts +40 -0
  197. package/dist/esm/advertisement/mdns/MdnsAdvertisement.d.ts.map +1 -0
  198. package/dist/esm/advertisement/mdns/MdnsAdvertisement.js +125 -0
  199. package/dist/esm/advertisement/mdns/MdnsAdvertisement.js.map +6 -0
  200. package/dist/esm/advertisement/mdns/MdnsAdvertiser.d.ts +99 -0
  201. package/dist/esm/advertisement/mdns/MdnsAdvertiser.d.ts.map +1 -0
  202. package/dist/esm/advertisement/mdns/MdnsAdvertiser.js +146 -0
  203. package/dist/esm/advertisement/mdns/MdnsAdvertiser.js.map +6 -0
  204. package/dist/esm/advertisement/mdns/OperationalMdnsAdvertisement.d.ts +18 -0
  205. package/dist/esm/advertisement/mdns/OperationalMdnsAdvertisement.d.ts.map +1 -0
  206. package/dist/esm/advertisement/mdns/OperationalMdnsAdvertisement.js +40 -0
  207. package/dist/esm/advertisement/mdns/OperationalMdnsAdvertisement.js.map +6 -0
  208. package/dist/esm/advertisement/mdns/index.d.ts +11 -0
  209. package/dist/esm/advertisement/mdns/index.d.ts.map +1 -0
  210. package/dist/esm/advertisement/mdns/index.js +11 -0
  211. package/dist/esm/advertisement/mdns/index.js.map +6 -0
  212. package/dist/esm/ble/Ble.d.ts +7 -5
  213. package/dist/esm/ble/Ble.d.ts.map +1 -1
  214. package/dist/esm/ble/Ble.js.map +1 -1
  215. package/dist/esm/codec/BtpCodec.d.ts +1 -1
  216. package/dist/esm/codec/BtpCodec.d.ts.map +1 -1
  217. package/dist/esm/codec/BtpCodec.js +4 -4
  218. package/dist/esm/codec/BtpCodec.js.map +1 -1
  219. package/dist/esm/common/Scanner.d.ts +1 -25
  220. package/dist/esm/common/Scanner.d.ts.map +1 -1
  221. package/dist/esm/common/Scanner.js +1 -18
  222. package/dist/esm/common/Scanner.js.map +1 -1
  223. package/dist/esm/common/SupportedTransportsBitmap.d.ts +33 -0
  224. package/dist/esm/common/SupportedTransportsBitmap.d.ts.map +1 -0
  225. package/dist/esm/common/SupportedTransportsBitmap.js +25 -0
  226. package/dist/esm/common/SupportedTransportsBitmap.js.map +6 -0
  227. package/dist/esm/common/index.d.ts +1 -1
  228. package/dist/esm/common/index.d.ts.map +1 -1
  229. package/dist/esm/common/index.js +1 -1
  230. package/dist/esm/fabric/Fabric.d.ts +1 -0
  231. package/dist/esm/fabric/Fabric.d.ts.map +1 -1
  232. package/dist/esm/fabric/Fabric.js +7 -0
  233. package/dist/esm/fabric/Fabric.js.map +1 -1
  234. package/dist/esm/index.d.ts +1 -0
  235. package/dist/esm/index.d.ts.map +1 -1
  236. package/dist/esm/index.js +1 -0
  237. package/dist/esm/index.js.map +1 -1
  238. package/dist/{cjs/mdns/MdnsScanner.d.ts → esm/mdns/MdnsClient.d.ts} +11 -14
  239. package/dist/esm/mdns/MdnsClient.d.ts.map +1 -0
  240. package/dist/esm/mdns/{MdnsScanner.js → MdnsClient.js} +34 -92
  241. package/dist/esm/mdns/MdnsClient.js.map +6 -0
  242. package/dist/esm/mdns/MdnsConsts.d.ts +11 -2
  243. package/dist/esm/mdns/MdnsConsts.d.ts.map +1 -1
  244. package/dist/esm/mdns/MdnsConsts.js +31 -4
  245. package/dist/esm/mdns/MdnsConsts.js.map +1 -1
  246. package/dist/esm/mdns/MdnsServer.d.ts +13 -22
  247. package/dist/esm/mdns/MdnsServer.d.ts.map +1 -1
  248. package/dist/esm/mdns/MdnsServer.js +57 -145
  249. package/dist/esm/mdns/MdnsServer.js.map +2 -2
  250. package/dist/esm/mdns/MdnsService.d.ts +4 -5
  251. package/dist/esm/mdns/MdnsService.d.ts.map +1 -1
  252. package/dist/esm/mdns/MdnsService.js +22 -24
  253. package/dist/esm/mdns/MdnsService.js.map +1 -1
  254. package/dist/esm/mdns/MdnsSocket.d.ts +32 -0
  255. package/dist/esm/mdns/MdnsSocket.d.ts.map +1 -0
  256. package/dist/esm/mdns/MdnsSocket.js +133 -0
  257. package/dist/esm/mdns/MdnsSocket.js.map +6 -0
  258. package/dist/esm/mdns/index.d.ts +2 -3
  259. package/dist/esm/mdns/index.d.ts.map +1 -1
  260. package/dist/esm/mdns/index.js +2 -3
  261. package/dist/esm/mdns/index.js.map +1 -1
  262. package/dist/esm/peer/ControllerCommissioner.js +2 -2
  263. package/dist/esm/peer/ControllerCommissioner.js.map +1 -1
  264. package/dist/esm/peer/ControllerDiscovery.d.ts +3 -3
  265. package/dist/esm/peer/ControllerDiscovery.d.ts.map +1 -1
  266. package/dist/esm/peer/ControllerDiscovery.js.map +1 -1
  267. package/dist/esm/peer/PeerSet.d.ts.map +1 -1
  268. package/dist/esm/peer/PeerSet.js +10 -5
  269. package/dist/esm/peer/PeerSet.js.map +1 -1
  270. package/dist/esm/protocol/DeviceAdvertiser.d.ts +23 -18
  271. package/dist/esm/protocol/DeviceAdvertiser.d.ts.map +1 -1
  272. package/dist/esm/protocol/DeviceAdvertiser.js +131 -139
  273. package/dist/esm/protocol/DeviceAdvertiser.js.map +1 -1
  274. package/dist/esm/protocol/DeviceCommissioner.d.ts +0 -1
  275. package/dist/esm/protocol/DeviceCommissioner.d.ts.map +1 -1
  276. package/dist/esm/protocol/DeviceCommissioner.js +47 -47
  277. package/dist/esm/protocol/DeviceCommissioner.js.map +1 -1
  278. package/dist/esm/protocol/ExchangeManager.js +1 -1
  279. package/dist/esm/protocol/ExchangeManager.js.map +1 -1
  280. package/dist/esm/protocol/MessageExchange.d.ts +1 -1
  281. package/dist/esm/protocol/MessageExchange.d.ts.map +1 -1
  282. package/dist/esm/protocol/MessageExchange.js +6 -12
  283. package/dist/esm/protocol/MessageExchange.js.map +1 -1
  284. package/dist/esm/session/NodeSession.d.ts +1 -0
  285. package/dist/esm/session/NodeSession.d.ts.map +1 -1
  286. package/dist/esm/session/NodeSession.js +3 -0
  287. package/dist/esm/session/NodeSession.js.map +1 -1
  288. package/dist/esm/session/Session.d.ts +3 -33
  289. package/dist/esm/session/Session.d.ts.map +1 -1
  290. package/dist/esm/session/Session.js +4 -9
  291. package/dist/esm/session/Session.js.map +1 -1
  292. package/dist/esm/session/SessionIntervals.d.ts +36 -0
  293. package/dist/esm/session/SessionIntervals.d.ts.map +1 -0
  294. package/dist/esm/session/SessionIntervals.js +31 -0
  295. package/dist/esm/session/SessionIntervals.js.map +6 -0
  296. package/dist/esm/session/SessionManager.d.ts +1 -1
  297. package/dist/esm/session/SessionManager.d.ts.map +1 -1
  298. package/dist/esm/session/SessionManager.js +10 -14
  299. package/dist/esm/session/SessionManager.js.map +1 -1
  300. package/dist/esm/session/pase/PaseMessages.js +1 -1
  301. package/package.json +6 -6
  302. package/src/advertisement/Advertisement.ts +348 -0
  303. package/src/advertisement/Advertiser.ts +83 -0
  304. package/src/advertisement/CommissioningMode.ts +11 -0
  305. package/src/{common/InstanceBroadcaster.ts → advertisement/PairingHintBitmap.ts} +1 -92
  306. package/src/advertisement/ServiceDescription.ts +110 -0
  307. package/src/advertisement/ble/BleAdvertisement.ts +90 -0
  308. package/src/advertisement/ble/BleAdvertiser.ts +116 -0
  309. package/src/advertisement/ble/index.ts +8 -0
  310. package/src/advertisement/index.ts +13 -0
  311. package/src/advertisement/mdns/CommissionableMdnsAdvertisement.ts +118 -0
  312. package/src/advertisement/mdns/CommissionerMdnsAdvertisement.ts +73 -0
  313. package/src/advertisement/mdns/MdnsAdvertisement.ts +167 -0
  314. package/src/advertisement/mdns/MdnsAdvertiser.ts +248 -0
  315. package/src/advertisement/mdns/OperationalMdnsAdvertisement.ts +50 -0
  316. package/src/advertisement/mdns/index.ts +11 -0
  317. package/src/ble/Ble.ts +8 -5
  318. package/src/codec/BtpCodec.ts +4 -3
  319. package/src/common/Scanner.ts +1 -17
  320. package/src/common/SupportedTransportsBitmap.ts +25 -0
  321. package/src/common/index.ts +1 -1
  322. package/src/fabric/Fabric.ts +8 -0
  323. package/src/index.ts +1 -0
  324. package/src/mdns/{MdnsScanner.ts → MdnsClient.ts} +34 -103
  325. package/src/mdns/MdnsConsts.ts +27 -2
  326. package/src/mdns/MdnsServer.ts +79 -184
  327. package/src/mdns/MdnsService.ts +24 -27
  328. package/src/mdns/MdnsSocket.ts +179 -0
  329. package/src/mdns/index.ts +2 -3
  330. package/src/peer/ControllerCommissioner.ts +2 -2
  331. package/src/peer/ControllerDiscovery.ts +3 -3
  332. package/src/peer/PeerSet.ts +15 -9
  333. package/src/protocol/DeviceAdvertiser.ts +161 -151
  334. package/src/protocol/DeviceCommissioner.ts +65 -75
  335. package/src/protocol/ExchangeManager.ts +1 -1
  336. package/src/protocol/MessageExchange.ts +8 -14
  337. package/src/session/NodeSession.ts +4 -0
  338. package/src/session/Session.ts +6 -42
  339. package/src/session/SessionIntervals.ts +57 -0
  340. package/src/session/SessionManager.ts +9 -13
  341. package/src/session/pase/PaseMessages.ts +1 -1
  342. package/dist/cjs/common/InstanceBroadcaster.d.ts.map +0 -1
  343. package/dist/cjs/common/InstanceBroadcaster.js.map +0 -6
  344. package/dist/cjs/mdns/MdnsBroadcaster.d.ts +0 -34
  345. package/dist/cjs/mdns/MdnsBroadcaster.d.ts.map +0 -1
  346. package/dist/cjs/mdns/MdnsBroadcaster.js +0 -365
  347. package/dist/cjs/mdns/MdnsBroadcaster.js.map +0 -6
  348. package/dist/cjs/mdns/MdnsInstanceBroadcaster.d.ts +0 -28
  349. package/dist/cjs/mdns/MdnsInstanceBroadcaster.d.ts.map +0 -1
  350. package/dist/cjs/mdns/MdnsInstanceBroadcaster.js +0 -87
  351. package/dist/cjs/mdns/MdnsInstanceBroadcaster.js.map +0 -6
  352. package/dist/cjs/mdns/MdnsScanner.d.ts.map +0 -1
  353. package/dist/cjs/mdns/MdnsScanner.js.map +0 -6
  354. package/dist/esm/common/InstanceBroadcaster.d.ts.map +0 -1
  355. package/dist/esm/mdns/MdnsBroadcaster.d.ts +0 -34
  356. package/dist/esm/mdns/MdnsBroadcaster.d.ts.map +0 -1
  357. package/dist/esm/mdns/MdnsBroadcaster.js +0 -378
  358. package/dist/esm/mdns/MdnsBroadcaster.js.map +0 -6
  359. package/dist/esm/mdns/MdnsInstanceBroadcaster.d.ts +0 -28
  360. package/dist/esm/mdns/MdnsInstanceBroadcaster.d.ts.map +0 -1
  361. package/dist/esm/mdns/MdnsInstanceBroadcaster.js +0 -67
  362. package/dist/esm/mdns/MdnsInstanceBroadcaster.js.map +0 -6
  363. package/dist/esm/mdns/MdnsScanner.d.ts.map +0 -1
  364. package/dist/esm/mdns/MdnsScanner.js.map +0 -6
  365. package/src/mdns/MdnsBroadcaster.ts +0 -451
  366. package/src/mdns/MdnsInstanceBroadcaster.ts +0 -88
@@ -6,100 +6,69 @@
6
6
 
7
7
  import {
8
8
  AsyncCache,
9
- Diagnostic,
10
- DnsCodec,
11
- DnsMessage,
12
- DnsMessagePartiallyPreEncoded,
13
9
  DnsMessageType,
14
10
  DnsRecord,
15
11
  DnsRecordType,
16
12
  isDeepEqual,
17
13
  Logger,
18
14
  MatterAggregateError,
19
- MAX_MDNS_MESSAGE_SIZE,
20
- Network,
15
+ NetworkInterfaceDetails,
16
+ ObserverGroup,
21
17
  Time,
22
- UdpMulticastServer,
23
18
  } from "#general";
19
+ import { MdnsSocket } from "./MdnsSocket.js";
24
20
 
25
21
  const logger = Logger.get("MdnsServer");
26
22
 
27
- export const MDNS_BROADCAST_IPV4 = "224.0.0.251";
28
- export const MDNS_BROADCAST_IPV6 = "ff02::fb";
29
- export const MDNS_BROADCAST_PORT = 5353;
30
-
31
- export enum AnnouncementType {
32
- Commissionable,
33
- Operative,
34
- }
35
-
36
23
  export class MdnsServer {
37
- static async create(network: Network, options?: { enableIpv4?: boolean; netInterface?: string }) {
38
- const { enableIpv4 = true, netInterface } = options ?? {};
39
- return new MdnsServer(
40
- network,
41
- await UdpMulticastServer.create({
42
- network,
43
- netInterface,
44
- broadcastAddressIpv4: enableIpv4 ? MDNS_BROADCAST_IPV4 : undefined,
45
- broadcastAddressIpv6: MDNS_BROADCAST_IPV6,
46
- listeningPort: MDNS_BROADCAST_PORT,
47
- }),
48
- netInterface,
49
- );
50
- }
51
-
52
- #recordsGenerator = new Map<string, (netInterface: string) => Promise<DnsRecord<any>[]>>();
24
+ #observers = new ObserverGroup();
25
+ #recordsGenerator = new Map<string, MdnsServer.RecordGenerator>();
53
26
  readonly #records = new AsyncCache<Map<string, DnsRecord<any>[]>>(
54
27
  "MDNS discovery",
55
28
  async (multicastInterface: string) => {
56
- const portTypeMap = new Map<string, DnsRecord<any>[]>();
57
- for (const [announceTypePort, generator] of this.#recordsGenerator) {
58
- portTypeMap.set(announceTypePort, await generator(multicastInterface));
29
+ const serviceRecords = new Map<string, DnsRecord<any>[]>();
30
+ const addrs = await this.network.getIpMac(multicastInterface);
31
+ if (addrs === undefined) {
32
+ return serviceRecords;
59
33
  }
60
- return portTypeMap;
34
+
35
+ for (const [service, generator] of this.#recordsGenerator) {
36
+ serviceRecords.set(service, generator(multicastInterface, addrs));
37
+ }
38
+
39
+ return serviceRecords;
61
40
  },
62
41
  15 * 60 * 1000 /* 15mn - also matches maximum commissioning window time. */,
63
42
  );
64
43
  readonly #recordLastSentAsMulticastAnswer = new Map<string, number>();
65
44
  readonly #recordLastSentAsUnicastAnswer = new Map<string, number>();
66
45
 
67
- readonly #network: Network;
68
- readonly #multicastServer: UdpMulticastServer;
69
- readonly #netInterface: string | undefined;
46
+ readonly #socket: MdnsSocket;
70
47
 
71
- constructor(network: Network, multicastServer: UdpMulticastServer, netInterface: string | undefined) {
72
- multicastServer.onMessage(
73
- (message, remoteIp, netInterface) => void this.#handleDnsMessage(message, remoteIp, netInterface),
74
- );
75
- this.#network = network;
76
- this.#multicastServer = multicastServer;
77
- this.#netInterface = netInterface;
48
+ constructor(socket: MdnsSocket) {
49
+ this.#socket = socket;
50
+ this.#observers.on(this.#socket.receipt, this.#handleMessage.bind(this));
78
51
  }
79
52
 
80
- buildDnsRecordKey(record: DnsRecord<any>, netInterface?: string, unicastTarget?: string) {
81
- return `${record.name}-${record.recordClass}-${record.recordType}-${netInterface}-${unicastTarget}`;
53
+ get network() {
54
+ return this.#socket.network;
82
55
  }
83
56
 
84
- buildTypePortKey(type: AnnouncementType, port: number) {
85
- return `${port}-${type}`;
57
+ get supportsIpv4() {
58
+ return this.#socket.supportsIpv4;
86
59
  }
87
60
 
88
- isKeyForPort(key: string, port: number) {
89
- return key.startsWith(`${port}-`);
61
+ buildDnsRecordKey(record: DnsRecord<any>, netInterface?: string, unicastTarget?: string) {
62
+ return `${record.name}-${record.recordClass}-${record.recordType}-${netInterface}-${unicastTarget}`;
90
63
  }
91
64
 
92
- async #handleDnsMessage(messageBytes: Uint8Array, remoteIp: string, netInterface: string) {
93
- // This message was on a subnet not supported by this device
94
- if (netInterface === undefined) return;
95
- const records = await this.#records.get(netInterface);
65
+ async #handleMessage(message: MdnsSocket.Message) {
66
+ const records = await this.#records.get(message.sourceIntf);
96
67
 
97
- // No need to process the DNS message if there are no records to serve
68
+ // Ignore if we have no records for interface
98
69
  if (records.size === 0) return;
99
70
 
100
- const message = DnsCodec.decode(messageBytes);
101
- if (message === undefined) return; // The message cannot be parsed
102
- const { transactionId, messageType, queries, answers: knownAnswers } = message;
71
+ const { sourceIntf, sourceIp, transactionId, messageType, queries, answers: knownAnswers } = message;
103
72
  if (messageType !== DnsMessageType.Query && messageType !== DnsMessageType.TruncatedQuery) return;
104
73
  if (queries.length === 0) return; // No queries to answer, can happen in a TruncatedQuery, let's ignore for now
105
74
  for (const portRecords of records.values()) {
@@ -132,11 +101,10 @@ export class MdnsServer {
132
101
  let uniCastResponse = queries.filter(query => !query.uniCastResponse).length === 0;
133
102
  const answersTimeSinceLastSent = answers.map(answer => ({
134
103
  timeSinceLastMultiCast:
135
- now -
136
- (this.#recordLastSentAsMulticastAnswer.get(this.buildDnsRecordKey(answer, netInterface)) ?? 0),
104
+ now - (this.#recordLastSentAsMulticastAnswer.get(this.buildDnsRecordKey(answer, sourceIntf)) ?? 0),
137
105
  timeSinceLastUniCast:
138
106
  now -
139
- (this.#recordLastSentAsUnicastAnswer.get(this.buildDnsRecordKey(answer, netInterface, remoteIp)) ??
107
+ (this.#recordLastSentAsUnicastAnswer.get(this.buildDnsRecordKey(answer, sourceIntf, sourceIp)) ??
140
108
  0),
141
109
  ttl: answer.ttl,
142
110
  }));
@@ -154,32 +122,31 @@ export class MdnsServer {
154
122
  if (answers.length === 0) continue; // Nothing to send
155
123
 
156
124
  answers.forEach(answer =>
157
- this.#recordLastSentAsMulticastAnswer.set(this.buildDnsRecordKey(answer, netInterface), now),
125
+ this.#recordLastSentAsMulticastAnswer.set(this.buildDnsRecordKey(answer, sourceIntf), now),
158
126
  );
159
127
  } else {
160
128
  answers = answers.filter((_, index) => answersTimeSinceLastSent[index].timeSinceLastUniCast > 1000);
161
129
  if (answers.length === 0) continue; // Nothing to send
162
130
 
163
131
  answers.forEach(answer =>
164
- this.#recordLastSentAsUnicastAnswer.set(
165
- this.buildDnsRecordKey(answer, netInterface, remoteIp),
166
- now,
167
- ),
132
+ this.#recordLastSentAsUnicastAnswer.set(this.buildDnsRecordKey(answer, sourceIntf, sourceIp), now),
168
133
  );
169
134
  }
170
135
 
171
- this.#sendRecords(
172
- {
173
- messageType: DnsMessageType.Response,
174
- transactionId,
175
- answers,
176
- additionalRecords,
177
- },
178
- netInterface,
179
- uniCastResponse ? remoteIp : undefined,
180
- ).catch(error => {
181
- logger.warn(`Failed to send mDNS response to ${remoteIp}`, error);
182
- });
136
+ this.#socket
137
+ .send(
138
+ {
139
+ messageType: DnsMessageType.Response,
140
+ transactionId,
141
+ answers,
142
+ additionalRecords,
143
+ },
144
+ sourceIntf,
145
+ uniCastResponse ? sourceIp : undefined,
146
+ )
147
+ .catch(error => {
148
+ logger.warn(`Failed to send mDNS response to ${sourceIp}`, error);
149
+ });
183
150
  await Time.sleep("MDNS delay", 20 + Math.floor(Math.random() * 100)); // as per DNS-SD spec wait 20-120ms before sending more packets
184
151
  }
185
152
  }
@@ -188,7 +155,7 @@ export class MdnsServer {
188
155
  const answers = records.filter(({ recordType }) => recordType === DnsRecordType.PTR);
189
156
  const additionalRecords = records.filter(({ recordType }) => recordType !== DnsRecordType.PTR);
190
157
 
191
- await this.#sendRecords(
158
+ await this.#socket.send(
192
159
  {
193
160
  messageType: DnsMessageType.Response,
194
161
  answers,
@@ -198,150 +165,72 @@ export class MdnsServer {
198
165
  );
199
166
  }
200
167
 
201
- async #sendRecords(dnsMessageData: Partial<DnsMessage>, netInterface: string, unicastTarget?: string) {
202
- const { answers = [], additionalRecords = [] } = dnsMessageData;
203
- const answersToSend = [...answers];
204
- const additionalRecordsToSend = [...additionalRecords];
205
-
206
- const dnsMessageDataToSend = {
207
- ...dnsMessageData,
208
- answers: [],
209
- additionalRecords: [],
210
- } as DnsMessagePartiallyPreEncoded;
211
-
212
- const emptyDnsMessage = DnsCodec.encode(dnsMessageDataToSend);
213
- let dnsMessageSize = emptyDnsMessage.length;
214
-
215
- while (true) {
216
- if (answersToSend.length > 0) {
217
- const nextAnswer = answersToSend.shift();
218
- if (nextAnswer === undefined) {
219
- break;
220
- }
221
-
222
- const nextAnswerEncoded = DnsCodec.encodeRecord(nextAnswer);
223
- dnsMessageSize += nextAnswerEncoded.length; // Add additional record as long as size is ok
224
-
225
- if (dnsMessageSize > MAX_MDNS_MESSAGE_SIZE) {
226
- // New answer do not fit anymore, send out the message
227
- await this.#multicastServer.send(
228
- DnsCodec.encode(dnsMessageDataToSend),
229
- netInterface,
230
- unicastTarget,
231
- );
232
-
233
- // Reset the message, length counter and included answers to count for next message
234
- dnsMessageDataToSend.answers.length = 0;
235
- dnsMessageSize = emptyDnsMessage.length + nextAnswerEncoded.length;
236
- }
237
- dnsMessageDataToSend.answers.push(nextAnswerEncoded);
238
- } else {
239
- break;
240
- }
241
- }
242
-
243
- for (const additionalRecord of additionalRecordsToSend) {
244
- const additionalRecordEncoded = DnsCodec.encodeRecord(additionalRecord);
245
- dnsMessageSize += additionalRecordEncoded.length; // Add additional record as long as size is ok
246
- if (dnsMessageSize > MAX_MDNS_MESSAGE_SIZE) {
247
- break;
248
- }
249
- dnsMessageDataToSend.additionalRecords.push(additionalRecordEncoded);
250
- }
251
-
252
- await this.#multicastServer.send(DnsCodec.encode(dnsMessageDataToSend), netInterface, unicastTarget);
253
- }
254
-
255
- async announce(announcedNetPort?: number) {
168
+ async broadcast(...services: string[]) {
256
169
  await MatterAggregateError.allSettled(
257
170
  (await this.#getMulticastInterfacesForAnnounce()).map(async ({ name: netInterface }) => {
258
171
  const records = await this.#records.get(netInterface);
259
- for (const [portType, portTypeRecords] of records) {
260
- if (announcedNetPort !== undefined && !this.isKeyForPort(portType, announcedNetPort)) continue;
172
+ for (const [service, serviceRecords] of records) {
173
+ if (services.length && !services.includes(service)) continue;
261
174
 
262
175
  // TODO: try to combine the messages to avoid sending multiple messages but keep under 1500 bytes per message
263
- await this.#announceRecordsForInterface(netInterface, portTypeRecords);
176
+ await this.#announceRecordsForInterface(netInterface, serviceRecords);
264
177
  await Time.sleep("MDNS delay", 20 + Math.floor(Math.random() * 100)); // as per DNS-SD spec wait 20-120ms before sending more packets
265
178
  }
266
179
  }),
267
- "Error happened when announcing MDNS messages",
180
+ "Error announcing MDNS messages",
268
181
  ).catch(error => logger.error(error));
269
182
  }
270
183
 
271
- async expireAnnouncements(options?: { announcedNetPort?: number; type?: AnnouncementType; forInstance?: string }) {
272
- const { announcedNetPort, type, forInstance: instanceToExpire } = options ?? {};
184
+ async expireAnnouncements(...services: string[]) {
273
185
  await MatterAggregateError.allSettled(
274
186
  this.#records.keys().map(async netInterface => {
275
187
  const records = await this.#records.get(netInterface);
276
- for (const [portType, portTypeRecords] of records) {
277
- if (announcedNetPort !== undefined && !this.isKeyForPort(portType, announcedNetPort)) continue;
278
- if (
279
- announcedNetPort !== undefined &&
280
- type !== undefined &&
281
- portType !== this.buildTypePortKey(type, announcedNetPort)
282
- )
283
- continue;
284
- const recordsToProcess =
285
- instanceToExpire !== undefined
286
- ? portTypeRecords.filter(
287
- ({ forInstance }) => forInstance !== undefined && instanceToExpire === forInstance,
288
- )
289
- : portTypeRecords;
188
+ for (const [service, serviceRecords] of records) {
189
+ if (services.length && !services.includes(service)) continue;
290
190
  const instanceSet = new Set<string>();
291
- recordsToProcess.forEach(record => {
191
+ serviceRecords.forEach(record => {
292
192
  record.ttl = 0;
293
193
  if (record.recordType === DnsRecordType.TXT) {
294
194
  instanceSet.add(record.name);
295
195
  }
296
196
  });
297
- const instanceName =
298
- instanceSet.size > 1
299
- ? "multiple"
300
- : instanceSet.size === 1
301
- ? Array.from(instanceSet.values())[0]
302
- : "";
303
- logger.debug(
304
- `Expiring records`,
305
- Diagnostic.dict({
306
- instanceName,
307
- port: announcedNetPort,
308
- netInterface,
309
- }),
310
- );
311
197
 
312
198
  // TODO: try to combine the messages to avoid sending multiple messages but keep under 1500 bytes per message
313
- await this.#announceRecordsForInterface(netInterface, portTypeRecords);
314
- this.#recordsGenerator.delete(portType);
199
+ await this.#announceRecordsForInterface(netInterface, serviceRecords);
200
+ this.#recordsGenerator.delete(service);
315
201
  await Time.sleep("MDNS delay", 20 + Math.floor(Math.random() * 100)); // as per DNS-SD spec wait 20-120ms before sending more packets
316
202
  }
317
203
  }),
318
204
  "Error happened when expiring MDNS announcements",
319
205
  ).catch(error => logger.error(error));
320
- await this.#records.clear();
321
- this.#recordLastSentAsMulticastAnswer.clear();
322
- this.#recordLastSentAsUnicastAnswer.clear();
206
+ await this.#resetServices(services);
323
207
  }
324
208
 
325
- async setRecordsGenerator(
326
- hostPort: number,
327
- type: AnnouncementType,
328
- generator: (netInterface: string) => Promise<DnsRecord<any>[]>,
329
- ) {
209
+ async setRecordsGenerator(service: string, generator: MdnsServer.RecordGenerator) {
330
210
  await this.#records.clear();
331
211
  this.#recordLastSentAsMulticastAnswer.clear();
332
212
  this.#recordLastSentAsUnicastAnswer.clear();
333
- this.#recordsGenerator.set(this.buildTypePortKey(type, hostPort), generator);
213
+ this.#recordsGenerator.set(service, generator);
214
+ }
215
+
216
+ async #resetServices(services: string[]) {
217
+ for (const service of services) {
218
+ await this.#records.delete(service);
219
+ this.#recordLastSentAsMulticastAnswer.delete(service);
220
+ this.#recordLastSentAsUnicastAnswer.delete(service);
221
+ }
334
222
  }
335
223
 
336
224
  async close() {
225
+ this.#observers.close();
337
226
  await this.#records.close();
338
227
  this.#recordLastSentAsMulticastAnswer.clear();
339
228
  this.#recordLastSentAsUnicastAnswer.clear();
340
- await this.#multicastServer.close();
341
229
  }
342
230
 
343
231
  #getMulticastInterfacesForAnnounce() {
344
- return this.#netInterface === undefined ? this.#network.getNetInterfaces() : [{ name: this.#netInterface }];
232
+ const { netInterface } = this.#socket;
233
+ return netInterface === undefined ? this.network.getNetInterfaces() : [{ name: netInterface }];
345
234
  }
346
235
 
347
236
  #queryRecords({ name, recordType }: { name: string; recordType: DnsRecordType }, records: DnsRecord<any>[]) {
@@ -352,3 +241,9 @@ export class MdnsServer {
352
241
  }
353
242
  }
354
243
  }
244
+
245
+ export namespace MdnsServer {
246
+ export interface RecordGenerator {
247
+ (intf: string, addrs: NetworkInterfaceDetails): DnsRecord[];
248
+ }
249
+ }
@@ -6,7 +6,6 @@
6
6
 
7
7
  import {
8
8
  Construction,
9
- Crypto,
10
9
  Diagnostic,
11
10
  Environment,
12
11
  Environmental,
@@ -16,14 +15,16 @@ import {
16
15
  Network,
17
16
  VariableService,
18
17
  } from "#general";
19
- import { MdnsBroadcaster } from "../mdns/MdnsBroadcaster.js";
20
- import { MdnsScanner } from "../mdns/MdnsScanner.js";
18
+ import { MdnsServer } from "../mdns/MdnsServer.js";
19
+ import { MdnsClient } from "./MdnsClient.js";
20
+ import { MdnsSocket } from "./MdnsSocket.js";
21
21
 
22
22
  const logger = Logger.get("MDNS");
23
23
 
24
24
  export class MdnsService {
25
- #broadcaster?: MdnsBroadcaster;
26
- #scanner?: MdnsScanner;
25
+ #socket?: MdnsSocket;
26
+ #server?: MdnsServer;
27
+ #client?: MdnsClient;
27
28
  #env: Environment;
28
29
  readonly #construction: Construction<MdnsService>;
29
30
  readonly #enableIpv4: boolean;
@@ -35,6 +36,7 @@ export class MdnsService {
35
36
 
36
37
  constructor(environment: Environment, options?: MdnsService.Options) {
37
38
  this.#env = environment;
39
+ const network = environment.get(Network);
38
40
  const rootEnvironment = environment.root;
39
41
  rootEnvironment.set(MdnsService, this);
40
42
  rootEnvironment.runtime.add(this);
@@ -44,18 +46,13 @@ export class MdnsService {
44
46
  this.limitedToNetInterface = vars.get("mdns.networkInterface", options?.networkInterface);
45
47
 
46
48
  this.#construction = Construction(this, async () => {
47
- const crypto = environment.get(Crypto);
48
- const network = environment.get(Network);
49
-
50
- this.#broadcaster = await MdnsBroadcaster.create(crypto, network, {
51
- enableIpv4: this.enableIpv4,
52
- multicastInterface: this.limitedToNetInterface,
53
- });
54
-
55
- this.#scanner = await MdnsScanner.create(network, {
49
+ this.#socket = await MdnsSocket.create(network, {
56
50
  enableIpv4: this.enableIpv4,
57
51
  netInterface: this.limitedToNetInterface,
58
52
  });
53
+
54
+ this.#server = new MdnsServer(this.#socket);
55
+ this.#client = new MdnsClient(this.#socket);
59
56
  });
60
57
  }
61
58
 
@@ -63,16 +60,12 @@ export class MdnsService {
63
60
  return new this(environment);
64
61
  }
65
62
 
66
- createInstanceBroadcaster(port: number) {
67
- return this.broadcaster.createInstanceBroadcaster(port);
68
- }
69
-
70
- get broadcaster() {
71
- return this.#construction.assert("MDNS service", this.#broadcaster);
63
+ get server() {
64
+ return this.#construction.assert("MDNS service", this.#server);
72
65
  }
73
66
 
74
- get scanner() {
75
- return this.#construction.assert("MDNS service", this.#scanner);
67
+ get client() {
68
+ return this.#construction.assert("MDNS service", this.#client);
76
69
  }
77
70
 
78
71
  get [Diagnostic.value]() {
@@ -87,12 +80,12 @@ export class MdnsService {
87
80
  this.#env.delete(MdnsService, this);
88
81
 
89
82
  await this.#construction.close(async () => {
90
- const broadcasterDisposal = MaybePromise.then(this.#broadcaster?.close(), undefined, e =>
91
- logger.error("Error disposing of MDNS broadcaster", e),
83
+ const broadcasterDisposal = MaybePromise.then(this.#server?.close(), undefined, e =>
84
+ logger.error("Error disposing of MDNS server", e),
92
85
  );
93
86
 
94
- const scannerDisposal = MaybePromise.then(this.#scanner?.close(), undefined, e =>
95
- logger.error("Error disposing of MDNS scanner", e),
87
+ const scannerDisposal = MaybePromise.then(this.#client?.close(), undefined, e =>
88
+ logger.error("Error disposing of MDNS client", e),
96
89
  );
97
90
 
98
91
  await MatterAggregateError.allSettled(
@@ -100,7 +93,11 @@ export class MdnsService {
100
93
  "Error disposing MDNS services",
101
94
  ).catch(error => logger.error(error));
102
95
 
103
- this.#broadcaster = this.#scanner = undefined;
96
+ if (this.#socket) {
97
+ await this.#socket?.close();
98
+ }
99
+
100
+ this.#server = this.#client = undefined;
104
101
  });
105
102
  }
106
103
  }
@@ -0,0 +1,179 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2022-2025 Matter.js Authors
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+
7
+ import {
8
+ BasicObservable,
9
+ Diagnostic,
10
+ DnsCodec,
11
+ DnsMessage,
12
+ DnsMessagePartiallyPreEncoded,
13
+ DnsMessageType,
14
+ Logger,
15
+ MatterAggregateError,
16
+ MAX_MDNS_MESSAGE_SIZE,
17
+ MaybePromise,
18
+ Network,
19
+ UdpMulticastServer,
20
+ } from "#general";
21
+ import { MDNS_BROADCAST_IPV4, MDNS_BROADCAST_IPV6, MDNS_BROADCAST_PORT } from "./MdnsConsts.js";
22
+
23
+ const logger = Logger.get("MdnsListener");
24
+
25
+ /**
26
+ * Manages the UDP socket for {@link MdnsServer} and {@link MdnsClient}.
27
+ */
28
+ export class MdnsSocket {
29
+ #socket: UdpMulticastServer;
30
+ #handlers?: Set<PromiseLike<void>>;
31
+ #isClosed = false;
32
+ #receipt = new BasicObservable<[message: MdnsSocket.Message]>(
33
+ error => logger.error("Unhandled error in MDNS listener", error),
34
+ true,
35
+ );
36
+
37
+ static async create(network: Network, options?: { enableIpv4?: boolean; netInterface?: string }) {
38
+ const { enableIpv4 = true, netInterface } = options ?? {};
39
+ const socket = new MdnsSocket(
40
+ await UdpMulticastServer.create({
41
+ network,
42
+ netInterface,
43
+ broadcastAddressIpv4: enableIpv4 ? MDNS_BROADCAST_IPV4 : undefined,
44
+ broadcastAddressIpv6: MDNS_BROADCAST_IPV6,
45
+ listeningPort: MDNS_BROADCAST_PORT,
46
+ }),
47
+ );
48
+ return socket;
49
+ }
50
+
51
+ constructor(socket: UdpMulticastServer) {
52
+ this.#socket = socket;
53
+ socket.onMessage(this.#handleMessage.bind(this));
54
+ }
55
+
56
+ get network() {
57
+ return this.#socket.network;
58
+ }
59
+
60
+ get supportsIpv4() {
61
+ return this.#socket.supportsIpv4;
62
+ }
63
+
64
+ get netInterface() {
65
+ return this.#socket.netInterface;
66
+ }
67
+
68
+ get receipt() {
69
+ return this.#receipt;
70
+ }
71
+
72
+ async send(message: Partial<DnsMessage> & { messageType: DnsMessageType }, intf?: string, unicastDest?: string) {
73
+ const chunk: DnsMessagePartiallyPreEncoded = {
74
+ transactionId: 0,
75
+ queries: [],
76
+ authorities: [],
77
+
78
+ ...message,
79
+
80
+ answers: [],
81
+ additionalRecords: [],
82
+ };
83
+
84
+ // Note - for size calculations we assume queries are relatively small. We only split answers across messages
85
+ let encodedChunkWithoutAnswers = DnsCodec.encode(chunk);
86
+ let chunkSize = encodedChunkWithoutAnswers.length;
87
+
88
+ // Add answers, splitting message as necessary
89
+ for (const answer of message.answers ?? []) {
90
+ const answerEncoded = DnsCodec.encodeRecord(answer);
91
+
92
+ if (chunkSize + answerEncoded.length > MAX_MDNS_MESSAGE_SIZE) {
93
+ if (chunk.answers.length === 0) {
94
+ // The first answer is already too big, log at least a warning
95
+ logger.warn(
96
+ `MDNS message with ${Diagnostic.json(
97
+ chunk.queries,
98
+ )} is too big to fit into a single MDNS message. Send anyway, but please report!`,
99
+ );
100
+ }
101
+
102
+ // New answer do not fit anymore, send out the message
103
+ await this.#send(chunk, intf, unicastDest);
104
+
105
+ // Reset the message, length counter and included answers to count for next message
106
+ if (chunk.queries.length) {
107
+ chunk.queries.length = 0;
108
+ encodedChunkWithoutAnswers = DnsCodec.encode(chunk);
109
+ }
110
+ chunk.answers.length = 0;
111
+ chunkSize = encodedChunkWithoutAnswers.length + answerEncoded.length;
112
+ } else {
113
+ chunkSize += answerEncoded.length;
114
+ }
115
+
116
+ chunk.answers.push(answerEncoded);
117
+ }
118
+
119
+ // Add "additional records"... We include these but only if they fit
120
+ const additionalRecords = message.additionalRecords ?? [];
121
+ for (const additionalRecord of additionalRecords) {
122
+ const additionalRecordEncoded = DnsCodec.encodeRecord(additionalRecord);
123
+ chunkSize += additionalRecordEncoded.length;
124
+ if (chunkSize > MAX_MDNS_MESSAGE_SIZE) {
125
+ break;
126
+ }
127
+ chunk.additionalRecords.push(additionalRecordEncoded);
128
+ }
129
+
130
+ await this.#send(chunk, intf, unicastDest);
131
+ }
132
+
133
+ async #send(message: DnsMessagePartiallyPreEncoded, intf?: string, unicastDest?: string) {
134
+ await this.#socket.send(DnsCodec.encode(message), intf, unicastDest);
135
+ }
136
+
137
+ async close() {
138
+ this.#isClosed = true;
139
+ await this.#socket.close();
140
+ if (this.#handlers) {
141
+ await MatterAggregateError.allSettled(this.#handlers);
142
+ }
143
+ }
144
+
145
+ #handleMessage(bytes: Uint8Array, sourceIp: string, sourceIntf: string) {
146
+ // Ignore if closed
147
+ if (this.#isClosed) {
148
+ return;
149
+ }
150
+
151
+ // Parse
152
+ const parsed = DnsCodec.decode(bytes);
153
+
154
+ // Skip unparseable
155
+ if (parsed === undefined) {
156
+ return;
157
+ }
158
+
159
+ let promise = this.#receipt.emit({
160
+ ...parsed,
161
+ sourceIp,
162
+ sourceIntf,
163
+ }) as MaybePromise;
164
+
165
+ if (MaybePromise.is(promise)) {
166
+ if (this.#handlers === undefined) {
167
+ this.#handlers = new Set();
168
+ }
169
+ promise = Promise.resolve(promise).finally(() => this.#handlers?.delete(promise as PromiseLike<void>));
170
+ }
171
+ }
172
+ }
173
+
174
+ export namespace MdnsSocket {
175
+ export interface Message extends DnsMessage {
176
+ sourceIp: string;
177
+ sourceIntf: string;
178
+ }
179
+ }