@matter/protocol 0.16.0-alpha.0-20250809-ee8375bcb → 0.16.0-alpha.0-20250812-285b75d83

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 (408) 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/ble/BleConsts.d.ts +2 -1
  65. package/dist/cjs/ble/BleConsts.d.ts.map +1 -1
  66. package/dist/cjs/ble/BleConsts.js +3 -1
  67. package/dist/cjs/ble/BleConsts.js.map +1 -1
  68. package/dist/cjs/codec/BtpCodec.d.ts +1 -1
  69. package/dist/cjs/codec/BtpCodec.d.ts.map +1 -1
  70. package/dist/cjs/codec/BtpCodec.js +4 -4
  71. package/dist/cjs/codec/BtpCodec.js.map +1 -1
  72. package/dist/cjs/common/Scanner.d.ts +1 -25
  73. package/dist/cjs/common/Scanner.d.ts.map +1 -1
  74. package/dist/cjs/common/Scanner.js +1 -18
  75. package/dist/cjs/common/Scanner.js.map +1 -1
  76. package/dist/cjs/common/SupportedTransportsBitmap.d.ts +33 -0
  77. package/dist/cjs/common/SupportedTransportsBitmap.d.ts.map +1 -0
  78. package/dist/cjs/common/SupportedTransportsBitmap.js +45 -0
  79. package/dist/cjs/common/SupportedTransportsBitmap.js.map +6 -0
  80. package/dist/cjs/common/index.d.ts +1 -1
  81. package/dist/cjs/common/index.d.ts.map +1 -1
  82. package/dist/cjs/common/index.js +1 -1
  83. package/dist/cjs/common/index.js.map +1 -1
  84. package/dist/cjs/fabric/Fabric.d.ts +1 -0
  85. package/dist/cjs/fabric/Fabric.d.ts.map +1 -1
  86. package/dist/cjs/fabric/Fabric.js +7 -0
  87. package/dist/cjs/fabric/Fabric.js.map +1 -1
  88. package/dist/cjs/index.d.ts +1 -0
  89. package/dist/cjs/index.d.ts.map +1 -1
  90. package/dist/cjs/index.js +1 -0
  91. package/dist/cjs/index.js.map +1 -1
  92. package/dist/{esm/mdns/MdnsScanner.d.ts → cjs/mdns/MdnsClient.d.ts} +11 -14
  93. package/dist/cjs/mdns/MdnsClient.d.ts.map +1 -0
  94. package/dist/cjs/mdns/{MdnsScanner.js → MdnsClient.js} +35 -90
  95. package/dist/cjs/mdns/MdnsClient.js.map +6 -0
  96. package/dist/cjs/mdns/MdnsConsts.d.ts +11 -2
  97. package/dist/cjs/mdns/MdnsConsts.d.ts.map +1 -1
  98. package/dist/cjs/mdns/MdnsConsts.js +31 -4
  99. package/dist/cjs/mdns/MdnsConsts.js.map +1 -1
  100. package/dist/cjs/mdns/MdnsServer.d.ts +13 -22
  101. package/dist/cjs/mdns/MdnsServer.d.ts.map +1 -1
  102. package/dist/cjs/mdns/MdnsServer.js +53 -150
  103. package/dist/cjs/mdns/MdnsServer.js.map +2 -2
  104. package/dist/cjs/mdns/MdnsService.d.ts +4 -5
  105. package/dist/cjs/mdns/MdnsService.d.ts.map +1 -1
  106. package/dist/cjs/mdns/MdnsService.js +22 -23
  107. package/dist/cjs/mdns/MdnsService.js.map +1 -1
  108. package/dist/cjs/mdns/MdnsSocket.d.ts +32 -0
  109. package/dist/cjs/mdns/MdnsSocket.d.ts.map +1 -0
  110. package/dist/cjs/mdns/MdnsSocket.js +144 -0
  111. package/dist/cjs/mdns/MdnsSocket.js.map +6 -0
  112. package/dist/cjs/mdns/index.d.ts +2 -3
  113. package/dist/cjs/mdns/index.d.ts.map +1 -1
  114. package/dist/cjs/mdns/index.js +2 -3
  115. package/dist/cjs/mdns/index.js.map +1 -1
  116. package/dist/cjs/peer/ControllerCommissioner.js +2 -2
  117. package/dist/cjs/peer/ControllerCommissioner.js.map +1 -1
  118. package/dist/cjs/peer/ControllerDiscovery.d.ts +3 -3
  119. package/dist/cjs/peer/ControllerDiscovery.d.ts.map +1 -1
  120. package/dist/cjs/peer/ControllerDiscovery.js.map +1 -1
  121. package/dist/cjs/peer/PeerSet.d.ts.map +1 -1
  122. package/dist/cjs/peer/PeerSet.js +10 -5
  123. package/dist/cjs/peer/PeerSet.js.map +1 -1
  124. package/dist/cjs/protocol/DeviceAdvertiser.d.ts +23 -18
  125. package/dist/cjs/protocol/DeviceAdvertiser.d.ts.map +1 -1
  126. package/dist/cjs/protocol/DeviceAdvertiser.js +130 -129
  127. package/dist/cjs/protocol/DeviceAdvertiser.js.map +1 -1
  128. package/dist/cjs/protocol/DeviceCommissioner.d.ts +0 -1
  129. package/dist/cjs/protocol/DeviceCommissioner.d.ts.map +1 -1
  130. package/dist/cjs/protocol/DeviceCommissioner.js +44 -44
  131. package/dist/cjs/protocol/DeviceCommissioner.js.map +1 -1
  132. package/dist/cjs/protocol/ExchangeManager.js +1 -1
  133. package/dist/cjs/protocol/ExchangeManager.js.map +1 -1
  134. package/dist/cjs/protocol/MessageExchange.d.ts +1 -1
  135. package/dist/cjs/protocol/MessageExchange.d.ts.map +1 -1
  136. package/dist/cjs/protocol/MessageExchange.js +6 -8
  137. package/dist/cjs/protocol/MessageExchange.js.map +1 -1
  138. package/dist/cjs/protocol/ProtocolHandler.d.ts +4 -0
  139. package/dist/cjs/protocol/ProtocolHandler.d.ts.map +1 -1
  140. package/dist/cjs/protocol/ProtocolStatusMessage.d.ts +8 -4
  141. package/dist/cjs/protocol/ProtocolStatusMessage.d.ts.map +1 -1
  142. package/dist/cjs/protocol/ProtocolStatusMessage.js +23 -8
  143. package/dist/cjs/protocol/ProtocolStatusMessage.js.map +1 -1
  144. package/dist/cjs/securechannel/SecureChannelMessenger.js +2 -2
  145. package/dist/cjs/securechannel/SecureChannelMessenger.js.map +1 -1
  146. package/dist/cjs/securechannel/SecureChannelProtocol.js +1 -1
  147. package/dist/cjs/securechannel/SecureChannelProtocol.js.map +1 -1
  148. package/dist/cjs/securechannel/SecureChannelStatusMessageSchema.d.ts +3 -3
  149. package/dist/cjs/securechannel/SecureChannelStatusMessageSchema.d.ts.map +1 -1
  150. package/dist/cjs/securechannel/SecureChannelStatusMessageSchema.js +3 -3
  151. package/dist/cjs/securechannel/SecureChannelStatusMessageSchema.js.map +1 -1
  152. package/dist/cjs/session/NodeSession.d.ts +1 -0
  153. package/dist/cjs/session/NodeSession.d.ts.map +1 -1
  154. package/dist/cjs/session/NodeSession.js +3 -0
  155. package/dist/cjs/session/NodeSession.js.map +1 -1
  156. package/dist/cjs/session/Session.d.ts +3 -33
  157. package/dist/cjs/session/Session.d.ts.map +1 -1
  158. package/dist/cjs/session/Session.js +4 -9
  159. package/dist/cjs/session/Session.js.map +1 -1
  160. package/dist/cjs/session/SessionIntervals.d.ts +36 -0
  161. package/dist/cjs/session/SessionIntervals.d.ts.map +1 -0
  162. package/dist/cjs/session/SessionIntervals.js +51 -0
  163. package/dist/cjs/session/SessionIntervals.js.map +6 -0
  164. package/dist/cjs/session/SessionManager.d.ts +1 -1
  165. package/dist/cjs/session/SessionManager.d.ts.map +1 -1
  166. package/dist/cjs/session/SessionManager.js +11 -12
  167. package/dist/cjs/session/SessionManager.js.map +1 -1
  168. package/dist/cjs/session/pase/PaseMessages.js +2 -2
  169. package/dist/cjs/session/pase/PaseMessages.js.map +1 -1
  170. package/dist/esm/advertisement/Advertisement.d.ts +119 -0
  171. package/dist/esm/advertisement/Advertisement.d.ts.map +1 -0
  172. package/dist/esm/advertisement/Advertisement.js +247 -0
  173. package/dist/esm/advertisement/Advertisement.js.map +6 -0
  174. package/dist/esm/advertisement/Advertiser.d.ts +50 -0
  175. package/dist/esm/advertisement/Advertiser.d.ts.map +1 -0
  176. package/dist/esm/advertisement/Advertiser.js +61 -0
  177. package/dist/esm/advertisement/Advertiser.js.map +6 -0
  178. package/dist/esm/advertisement/CommissioningMode.d.ts +11 -0
  179. package/dist/esm/advertisement/CommissioningMode.d.ts.map +1 -0
  180. package/dist/esm/advertisement/CommissioningMode.js +15 -0
  181. package/dist/esm/advertisement/CommissioningMode.js.map +6 -0
  182. package/dist/esm/{common/InstanceBroadcaster.d.ts → advertisement/PairingHintBitmap.d.ts} +3 -69
  183. package/dist/esm/advertisement/PairingHintBitmap.d.ts.map +1 -0
  184. package/dist/esm/{common/InstanceBroadcaster.js → advertisement/PairingHintBitmap.js} +2 -9
  185. package/dist/esm/{common/InstanceBroadcaster.js.map → advertisement/PairingHintBitmap.js.map} +3 -3
  186. package/dist/esm/advertisement/ServiceDescription.d.ts +70 -0
  187. package/dist/esm/advertisement/ServiceDescription.d.ts.map +1 -0
  188. package/dist/esm/advertisement/ServiceDescription.js +41 -0
  189. package/dist/esm/advertisement/ServiceDescription.js.map +6 -0
  190. package/dist/esm/advertisement/ble/BleAdvertisement.d.ts +16 -0
  191. package/dist/esm/advertisement/ble/BleAdvertisement.d.ts.map +1 -0
  192. package/dist/esm/advertisement/ble/BleAdvertisement.js +65 -0
  193. package/dist/esm/advertisement/ble/BleAdvertisement.js.map +6 -0
  194. package/dist/esm/advertisement/ble/BleAdvertiser.d.ts +66 -0
  195. package/dist/esm/advertisement/ble/BleAdvertiser.d.ts.map +1 -0
  196. package/dist/esm/advertisement/ble/BleAdvertiser.js +63 -0
  197. package/dist/esm/advertisement/ble/BleAdvertiser.js.map +6 -0
  198. package/dist/esm/advertisement/ble/index.d.ts +8 -0
  199. package/dist/esm/advertisement/ble/index.d.ts.map +1 -0
  200. package/dist/esm/advertisement/ble/index.js +8 -0
  201. package/dist/esm/advertisement/ble/index.js.map +6 -0
  202. package/dist/esm/advertisement/index.d.ts +13 -0
  203. package/dist/esm/advertisement/index.d.ts.map +1 -0
  204. package/dist/esm/advertisement/index.js +13 -0
  205. package/dist/esm/advertisement/index.js.map +6 -0
  206. package/dist/esm/advertisement/mdns/CommissionableMdnsAdvertisement.d.ts +21 -0
  207. package/dist/esm/advertisement/mdns/CommissionableMdnsAdvertisement.d.ts.map +1 -0
  208. package/dist/esm/advertisement/mdns/CommissionableMdnsAdvertisement.js +95 -0
  209. package/dist/esm/advertisement/mdns/CommissionableMdnsAdvertisement.js.map +6 -0
  210. package/dist/esm/advertisement/mdns/CommissionerMdnsAdvertisement.d.ts +20 -0
  211. package/dist/esm/advertisement/mdns/CommissionerMdnsAdvertisement.d.ts.map +1 -0
  212. package/dist/esm/advertisement/mdns/CommissionerMdnsAdvertisement.js +54 -0
  213. package/dist/esm/advertisement/mdns/CommissionerMdnsAdvertisement.js.map +6 -0
  214. package/dist/esm/advertisement/mdns/MdnsAdvertisement.d.ts +40 -0
  215. package/dist/esm/advertisement/mdns/MdnsAdvertisement.d.ts.map +1 -0
  216. package/dist/esm/advertisement/mdns/MdnsAdvertisement.js +125 -0
  217. package/dist/esm/advertisement/mdns/MdnsAdvertisement.js.map +6 -0
  218. package/dist/esm/advertisement/mdns/MdnsAdvertiser.d.ts +99 -0
  219. package/dist/esm/advertisement/mdns/MdnsAdvertiser.d.ts.map +1 -0
  220. package/dist/esm/advertisement/mdns/MdnsAdvertiser.js +146 -0
  221. package/dist/esm/advertisement/mdns/MdnsAdvertiser.js.map +6 -0
  222. package/dist/esm/advertisement/mdns/OperationalMdnsAdvertisement.d.ts +18 -0
  223. package/dist/esm/advertisement/mdns/OperationalMdnsAdvertisement.d.ts.map +1 -0
  224. package/dist/esm/advertisement/mdns/OperationalMdnsAdvertisement.js +40 -0
  225. package/dist/esm/advertisement/mdns/OperationalMdnsAdvertisement.js.map +6 -0
  226. package/dist/esm/advertisement/mdns/index.d.ts +11 -0
  227. package/dist/esm/advertisement/mdns/index.d.ts.map +1 -0
  228. package/dist/esm/advertisement/mdns/index.js +11 -0
  229. package/dist/esm/advertisement/mdns/index.js.map +6 -0
  230. package/dist/esm/ble/Ble.d.ts +7 -5
  231. package/dist/esm/ble/Ble.d.ts.map +1 -1
  232. package/dist/esm/ble/Ble.js.map +1 -1
  233. package/dist/esm/ble/BleConsts.d.ts +2 -1
  234. package/dist/esm/ble/BleConsts.d.ts.map +1 -1
  235. package/dist/esm/ble/BleConsts.js +3 -1
  236. package/dist/esm/ble/BleConsts.js.map +1 -1
  237. package/dist/esm/codec/BtpCodec.d.ts +1 -1
  238. package/dist/esm/codec/BtpCodec.d.ts.map +1 -1
  239. package/dist/esm/codec/BtpCodec.js +4 -4
  240. package/dist/esm/codec/BtpCodec.js.map +1 -1
  241. package/dist/esm/common/Scanner.d.ts +1 -25
  242. package/dist/esm/common/Scanner.d.ts.map +1 -1
  243. package/dist/esm/common/Scanner.js +1 -18
  244. package/dist/esm/common/Scanner.js.map +1 -1
  245. package/dist/esm/common/SupportedTransportsBitmap.d.ts +33 -0
  246. package/dist/esm/common/SupportedTransportsBitmap.d.ts.map +1 -0
  247. package/dist/esm/common/SupportedTransportsBitmap.js +25 -0
  248. package/dist/esm/common/SupportedTransportsBitmap.js.map +6 -0
  249. package/dist/esm/common/index.d.ts +1 -1
  250. package/dist/esm/common/index.d.ts.map +1 -1
  251. package/dist/esm/common/index.js +1 -1
  252. package/dist/esm/fabric/Fabric.d.ts +1 -0
  253. package/dist/esm/fabric/Fabric.d.ts.map +1 -1
  254. package/dist/esm/fabric/Fabric.js +7 -0
  255. package/dist/esm/fabric/Fabric.js.map +1 -1
  256. package/dist/esm/index.d.ts +1 -0
  257. package/dist/esm/index.d.ts.map +1 -1
  258. package/dist/esm/index.js +1 -0
  259. package/dist/esm/index.js.map +1 -1
  260. package/dist/{cjs/mdns/MdnsScanner.d.ts → esm/mdns/MdnsClient.d.ts} +11 -14
  261. package/dist/esm/mdns/MdnsClient.d.ts.map +1 -0
  262. package/dist/esm/mdns/{MdnsScanner.js → MdnsClient.js} +34 -92
  263. package/dist/esm/mdns/MdnsClient.js.map +6 -0
  264. package/dist/esm/mdns/MdnsConsts.d.ts +11 -2
  265. package/dist/esm/mdns/MdnsConsts.d.ts.map +1 -1
  266. package/dist/esm/mdns/MdnsConsts.js +31 -4
  267. package/dist/esm/mdns/MdnsConsts.js.map +1 -1
  268. package/dist/esm/mdns/MdnsServer.d.ts +13 -22
  269. package/dist/esm/mdns/MdnsServer.d.ts.map +1 -1
  270. package/dist/esm/mdns/MdnsServer.js +55 -155
  271. package/dist/esm/mdns/MdnsServer.js.map +2 -2
  272. package/dist/esm/mdns/MdnsService.d.ts +4 -5
  273. package/dist/esm/mdns/MdnsService.d.ts.map +1 -1
  274. package/dist/esm/mdns/MdnsService.js +22 -24
  275. package/dist/esm/mdns/MdnsService.js.map +1 -1
  276. package/dist/esm/mdns/MdnsSocket.d.ts +32 -0
  277. package/dist/esm/mdns/MdnsSocket.d.ts.map +1 -0
  278. package/dist/esm/mdns/MdnsSocket.js +133 -0
  279. package/dist/esm/mdns/MdnsSocket.js.map +6 -0
  280. package/dist/esm/mdns/index.d.ts +2 -3
  281. package/dist/esm/mdns/index.d.ts.map +1 -1
  282. package/dist/esm/mdns/index.js +2 -3
  283. package/dist/esm/mdns/index.js.map +1 -1
  284. package/dist/esm/peer/ControllerCommissioner.js +2 -2
  285. package/dist/esm/peer/ControllerCommissioner.js.map +1 -1
  286. package/dist/esm/peer/ControllerDiscovery.d.ts +3 -3
  287. package/dist/esm/peer/ControllerDiscovery.d.ts.map +1 -1
  288. package/dist/esm/peer/ControllerDiscovery.js.map +1 -1
  289. package/dist/esm/peer/PeerSet.d.ts.map +1 -1
  290. package/dist/esm/peer/PeerSet.js +10 -5
  291. package/dist/esm/peer/PeerSet.js.map +1 -1
  292. package/dist/esm/protocol/DeviceAdvertiser.d.ts +23 -18
  293. package/dist/esm/protocol/DeviceAdvertiser.d.ts.map +1 -1
  294. package/dist/esm/protocol/DeviceAdvertiser.js +131 -139
  295. package/dist/esm/protocol/DeviceAdvertiser.js.map +1 -1
  296. package/dist/esm/protocol/DeviceCommissioner.d.ts +0 -1
  297. package/dist/esm/protocol/DeviceCommissioner.d.ts.map +1 -1
  298. package/dist/esm/protocol/DeviceCommissioner.js +47 -47
  299. package/dist/esm/protocol/DeviceCommissioner.js.map +1 -1
  300. package/dist/esm/protocol/ExchangeManager.js +1 -1
  301. package/dist/esm/protocol/ExchangeManager.js.map +1 -1
  302. package/dist/esm/protocol/MessageExchange.d.ts +1 -1
  303. package/dist/esm/protocol/MessageExchange.d.ts.map +1 -1
  304. package/dist/esm/protocol/MessageExchange.js +6 -12
  305. package/dist/esm/protocol/MessageExchange.js.map +1 -1
  306. package/dist/esm/protocol/ProtocolHandler.d.ts +4 -0
  307. package/dist/esm/protocol/ProtocolHandler.d.ts.map +1 -1
  308. package/dist/esm/protocol/ProtocolStatusMessage.d.ts +8 -4
  309. package/dist/esm/protocol/ProtocolStatusMessage.d.ts.map +1 -1
  310. package/dist/esm/protocol/ProtocolStatusMessage.js +24 -9
  311. package/dist/esm/protocol/ProtocolStatusMessage.js.map +1 -1
  312. package/dist/esm/securechannel/SecureChannelMessenger.js +3 -3
  313. package/dist/esm/securechannel/SecureChannelMessenger.js.map +1 -1
  314. package/dist/esm/securechannel/SecureChannelProtocol.js +2 -2
  315. package/dist/esm/securechannel/SecureChannelProtocol.js.map +1 -1
  316. package/dist/esm/securechannel/SecureChannelStatusMessageSchema.d.ts +3 -3
  317. package/dist/esm/securechannel/SecureChannelStatusMessageSchema.d.ts.map +1 -1
  318. package/dist/esm/securechannel/SecureChannelStatusMessageSchema.js +3 -3
  319. package/dist/esm/securechannel/SecureChannelStatusMessageSchema.js.map +1 -1
  320. package/dist/esm/session/NodeSession.d.ts +1 -0
  321. package/dist/esm/session/NodeSession.d.ts.map +1 -1
  322. package/dist/esm/session/NodeSession.js +3 -0
  323. package/dist/esm/session/NodeSession.js.map +1 -1
  324. package/dist/esm/session/Session.d.ts +3 -33
  325. package/dist/esm/session/Session.d.ts.map +1 -1
  326. package/dist/esm/session/Session.js +4 -9
  327. package/dist/esm/session/Session.js.map +1 -1
  328. package/dist/esm/session/SessionIntervals.d.ts +36 -0
  329. package/dist/esm/session/SessionIntervals.d.ts.map +1 -0
  330. package/dist/esm/session/SessionIntervals.js +31 -0
  331. package/dist/esm/session/SessionIntervals.js.map +6 -0
  332. package/dist/esm/session/SessionManager.d.ts +1 -1
  333. package/dist/esm/session/SessionManager.d.ts.map +1 -1
  334. package/dist/esm/session/SessionManager.js +10 -14
  335. package/dist/esm/session/SessionManager.js.map +1 -1
  336. package/dist/esm/session/pase/PaseMessages.js +1 -1
  337. package/package.json +6 -6
  338. package/src/advertisement/Advertisement.ts +348 -0
  339. package/src/advertisement/Advertiser.ts +83 -0
  340. package/src/advertisement/CommissioningMode.ts +11 -0
  341. package/src/{common/InstanceBroadcaster.ts → advertisement/PairingHintBitmap.ts} +1 -92
  342. package/src/advertisement/ServiceDescription.ts +110 -0
  343. package/src/advertisement/ble/BleAdvertisement.ts +90 -0
  344. package/src/advertisement/ble/BleAdvertiser.ts +116 -0
  345. package/src/advertisement/ble/index.ts +8 -0
  346. package/src/advertisement/index.ts +13 -0
  347. package/src/advertisement/mdns/CommissionableMdnsAdvertisement.ts +118 -0
  348. package/src/advertisement/mdns/CommissionerMdnsAdvertisement.ts +73 -0
  349. package/src/advertisement/mdns/MdnsAdvertisement.ts +167 -0
  350. package/src/advertisement/mdns/MdnsAdvertiser.ts +248 -0
  351. package/src/advertisement/mdns/OperationalMdnsAdvertisement.ts +50 -0
  352. package/src/advertisement/mdns/index.ts +11 -0
  353. package/src/ble/Ble.ts +8 -5
  354. package/src/ble/BleConsts.ts +2 -1
  355. package/src/codec/BtpCodec.ts +4 -3
  356. package/src/common/Scanner.ts +1 -17
  357. package/src/common/SupportedTransportsBitmap.ts +25 -0
  358. package/src/common/index.ts +1 -1
  359. package/src/fabric/Fabric.ts +8 -0
  360. package/src/index.ts +1 -0
  361. package/src/mdns/{MdnsScanner.ts → MdnsClient.ts} +34 -103
  362. package/src/mdns/MdnsConsts.ts +27 -2
  363. package/src/mdns/MdnsServer.ts +76 -198
  364. package/src/mdns/MdnsService.ts +24 -27
  365. package/src/mdns/MdnsSocket.ts +179 -0
  366. package/src/mdns/index.ts +2 -3
  367. package/src/peer/ControllerCommissioner.ts +2 -2
  368. package/src/peer/ControllerDiscovery.ts +3 -3
  369. package/src/peer/PeerSet.ts +15 -9
  370. package/src/protocol/DeviceAdvertiser.ts +161 -151
  371. package/src/protocol/DeviceCommissioner.ts +65 -75
  372. package/src/protocol/ExchangeManager.ts +1 -1
  373. package/src/protocol/MessageExchange.ts +8 -14
  374. package/src/protocol/ProtocolHandler.ts +7 -0
  375. package/src/protocol/ProtocolStatusMessage.ts +26 -10
  376. package/src/securechannel/SecureChannelMessenger.ts +3 -3
  377. package/src/securechannel/SecureChannelProtocol.ts +2 -2
  378. package/src/securechannel/SecureChannelStatusMessageSchema.ts +3 -3
  379. package/src/session/NodeSession.ts +4 -0
  380. package/src/session/Session.ts +6 -42
  381. package/src/session/SessionIntervals.ts +57 -0
  382. package/src/session/SessionManager.ts +9 -13
  383. package/src/session/pase/PaseMessages.ts +1 -1
  384. package/dist/cjs/common/InstanceBroadcaster.d.ts.map +0 -1
  385. package/dist/cjs/common/InstanceBroadcaster.js.map +0 -6
  386. package/dist/cjs/mdns/MdnsBroadcaster.d.ts +0 -34
  387. package/dist/cjs/mdns/MdnsBroadcaster.d.ts.map +0 -1
  388. package/dist/cjs/mdns/MdnsBroadcaster.js +0 -365
  389. package/dist/cjs/mdns/MdnsBroadcaster.js.map +0 -6
  390. package/dist/cjs/mdns/MdnsInstanceBroadcaster.d.ts +0 -28
  391. package/dist/cjs/mdns/MdnsInstanceBroadcaster.d.ts.map +0 -1
  392. package/dist/cjs/mdns/MdnsInstanceBroadcaster.js +0 -87
  393. package/dist/cjs/mdns/MdnsInstanceBroadcaster.js.map +0 -6
  394. package/dist/cjs/mdns/MdnsScanner.d.ts.map +0 -1
  395. package/dist/cjs/mdns/MdnsScanner.js.map +0 -6
  396. package/dist/esm/common/InstanceBroadcaster.d.ts.map +0 -1
  397. package/dist/esm/mdns/MdnsBroadcaster.d.ts +0 -34
  398. package/dist/esm/mdns/MdnsBroadcaster.d.ts.map +0 -1
  399. package/dist/esm/mdns/MdnsBroadcaster.js +0 -378
  400. package/dist/esm/mdns/MdnsBroadcaster.js.map +0 -6
  401. package/dist/esm/mdns/MdnsInstanceBroadcaster.d.ts +0 -28
  402. package/dist/esm/mdns/MdnsInstanceBroadcaster.d.ts.map +0 -1
  403. package/dist/esm/mdns/MdnsInstanceBroadcaster.js +0 -67
  404. package/dist/esm/mdns/MdnsInstanceBroadcaster.js.map +0 -6
  405. package/dist/esm/mdns/MdnsScanner.d.ts.map +0 -1
  406. package/dist/esm/mdns/MdnsScanner.js.map +0 -6
  407. package/src/mdns/MdnsBroadcaster.ts +0 -451
  408. package/src/mdns/MdnsInstanceBroadcaster.ts +0 -88
@@ -6,100 +6,68 @@
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
- readonly #recordLastSentAsUnicastAnswer = new Map<string, number>();
66
44
 
67
- readonly #network: Network;
68
- readonly #multicastServer: UdpMulticastServer;
69
- readonly #netInterface: string | undefined;
45
+ readonly #socket: MdnsSocket;
70
46
 
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;
47
+ constructor(socket: MdnsSocket) {
48
+ this.#socket = socket;
49
+ this.#observers.on(this.#socket.receipt, this.#handleMessage.bind(this));
78
50
  }
79
51
 
80
- buildDnsRecordKey(record: DnsRecord<any>, netInterface?: string, unicastTarget?: string) {
81
- return `${record.name}-${record.recordClass}-${record.recordType}-${netInterface}-${unicastTarget}`;
52
+ get network() {
53
+ return this.#socket.network;
82
54
  }
83
55
 
84
- buildTypePortKey(type: AnnouncementType, port: number) {
85
- return `${port}-${type}`;
56
+ get supportsIpv4() {
57
+ return this.#socket.supportsIpv4;
86
58
  }
87
59
 
88
- isKeyForPort(key: string, port: number) {
89
- return key.startsWith(`${port}-`);
60
+ buildDnsRecordKey(record: DnsRecord<any>, netInterface?: string, unicastTarget?: string) {
61
+ return `${record.name}-${record.recordClass}-${record.recordType}-${netInterface}-${unicastTarget}`;
90
62
  }
91
63
 
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);
64
+ async #handleMessage(message: MdnsSocket.Message) {
65
+ const records = await this.#records.get(message.sourceIntf);
96
66
 
97
- // No need to process the DNS message if there are no records to serve
67
+ // Ignore if we have no records for interface
98
68
  if (records.size === 0) return;
99
69
 
100
- const message = DnsCodec.decode(messageBytes);
101
- if (message === undefined) return; // The message cannot be parsed
102
- const { transactionId, messageType, queries, answers: knownAnswers } = message;
70
+ const { sourceIntf, sourceIp, transactionId, messageType, queries, answers: knownAnswers } = message;
103
71
  if (messageType !== DnsMessageType.Query && messageType !== DnsMessageType.TruncatedQuery) return;
104
72
  if (queries.length === 0) return; // No queries to answer, can happen in a TruncatedQuery, let's ignore for now
105
73
  for (const portRecords of records.values()) {
@@ -132,54 +100,41 @@ export class MdnsServer {
132
100
  let uniCastResponse = queries.filter(query => !query.uniCastResponse).length === 0;
133
101
  const answersTimeSinceLastSent = answers.map(answer => ({
134
102
  timeSinceLastMultiCast:
135
- now -
136
- (this.#recordLastSentAsMulticastAnswer.get(this.buildDnsRecordKey(answer, netInterface)) ?? 0),
137
- timeSinceLastUniCast:
138
- now -
139
- (this.#recordLastSentAsUnicastAnswer.get(this.buildDnsRecordKey(answer, netInterface, remoteIp)) ??
140
- 0),
141
- ttl: answer.ttl,
103
+ now - (this.#recordLastSentAsMulticastAnswer.get(this.buildDnsRecordKey(answer, sourceIntf)) ?? 0),
104
+ ttl: answer.ttl * 1000,
142
105
  }));
143
106
  if (
144
107
  uniCastResponse &&
145
- answersTimeSinceLastSent.some(
146
- ({ timeSinceLastMultiCast, ttl }) => timeSinceLastMultiCast > (ttl / 4) * 1000,
147
- )
108
+ answersTimeSinceLastSent.some(({ timeSinceLastMultiCast, ttl }) => timeSinceLastMultiCast > ttl / 4)
148
109
  ) {
149
110
  // If the query is for unicast response, still send as multicast if they were last sent as multicast longer then 1/4 of their ttl
150
111
  uniCastResponse = false;
151
112
  }
152
113
  if (!uniCastResponse) {
153
- answers = answers.filter((_, index) => answersTimeSinceLastSent[index].timeSinceLastMultiCast > 1000);
154
- if (answers.length === 0) continue; // Nothing to send
155
-
156
- answers.forEach(answer =>
157
- this.#recordLastSentAsMulticastAnswer.set(this.buildDnsRecordKey(answer, netInterface), now),
114
+ answers = answers.filter(
115
+ (_, index) => answersTimeSinceLastSent[index].timeSinceLastMultiCast >= 900, // The last time sent as multicast was more than 900 ms ago
158
116
  );
159
- } else {
160
- answers = answers.filter((_, index) => answersTimeSinceLastSent[index].timeSinceLastUniCast > 1000);
161
117
  if (answers.length === 0) continue; // Nothing to send
162
118
 
163
119
  answers.forEach(answer =>
164
- this.#recordLastSentAsUnicastAnswer.set(
165
- this.buildDnsRecordKey(answer, netInterface, remoteIp),
166
- now,
167
- ),
120
+ this.#recordLastSentAsMulticastAnswer.set(this.buildDnsRecordKey(answer, sourceIntf), now),
168
121
  );
169
122
  }
170
123
 
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
- });
124
+ this.#socket
125
+ .send(
126
+ {
127
+ messageType: DnsMessageType.Response,
128
+ transactionId,
129
+ answers,
130
+ additionalRecords,
131
+ },
132
+ sourceIntf,
133
+ uniCastResponse ? sourceIp : undefined,
134
+ )
135
+ .catch(error => {
136
+ logger.warn(`Failed to send mDNS response to ${sourceIp}`, error);
137
+ });
183
138
  await Time.sleep("MDNS delay", 20 + Math.floor(Math.random() * 100)); // as per DNS-SD spec wait 20-120ms before sending more packets
184
139
  }
185
140
  }
@@ -188,7 +143,7 @@ export class MdnsServer {
188
143
  const answers = records.filter(({ recordType }) => recordType === DnsRecordType.PTR);
189
144
  const additionalRecords = records.filter(({ recordType }) => recordType !== DnsRecordType.PTR);
190
145
 
191
- await this.#sendRecords(
146
+ await this.#socket.send(
192
147
  {
193
148
  messageType: DnsMessageType.Response,
194
149
  answers,
@@ -198,150 +153,67 @@ export class MdnsServer {
198
153
  );
199
154
  }
200
155
 
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) {
156
+ async broadcast(...services: string[]) {
256
157
  await MatterAggregateError.allSettled(
257
158
  (await this.#getMulticastInterfacesForAnnounce()).map(async ({ name: netInterface }) => {
258
159
  const records = await this.#records.get(netInterface);
259
- for (const [portType, portTypeRecords] of records) {
260
- if (announcedNetPort !== undefined && !this.isKeyForPort(portType, announcedNetPort)) continue;
160
+ for (const [service, serviceRecords] of records) {
161
+ if (services.length && !services.includes(service)) continue;
261
162
 
262
163
  // TODO: try to combine the messages to avoid sending multiple messages but keep under 1500 bytes per message
263
- await this.#announceRecordsForInterface(netInterface, portTypeRecords);
164
+ await this.#announceRecordsForInterface(netInterface, serviceRecords);
264
165
  await Time.sleep("MDNS delay", 20 + Math.floor(Math.random() * 100)); // as per DNS-SD spec wait 20-120ms before sending more packets
265
166
  }
266
167
  }),
267
- "Error happened when announcing MDNS messages",
168
+ "Error announcing MDNS messages",
268
169
  ).catch(error => logger.error(error));
269
170
  }
270
171
 
271
- async expireAnnouncements(options?: { announcedNetPort?: number; type?: AnnouncementType; forInstance?: string }) {
272
- const { announcedNetPort, type, forInstance: instanceToExpire } = options ?? {};
172
+ async expireAnnouncements(...services: string[]) {
273
173
  await MatterAggregateError.allSettled(
274
174
  this.#records.keys().map(async netInterface => {
275
175
  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;
176
+ for (const [service, serviceRecords] of records) {
177
+ if (services.length && !services.includes(service)) continue;
290
178
  const instanceSet = new Set<string>();
291
- recordsToProcess.forEach(record => {
179
+ serviceRecords.forEach(record => {
292
180
  record.ttl = 0;
293
181
  if (record.recordType === DnsRecordType.TXT) {
294
182
  instanceSet.add(record.name);
295
183
  }
296
184
  });
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
185
 
312
186
  // 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);
187
+ await this.#announceRecordsForInterface(netInterface, serviceRecords);
188
+ this.#recordsGenerator.delete(service);
315
189
  await Time.sleep("MDNS delay", 20 + Math.floor(Math.random() * 100)); // as per DNS-SD spec wait 20-120ms before sending more packets
316
190
  }
317
191
  }),
318
192
  "Error happened when expiring MDNS announcements",
319
193
  ).catch(error => logger.error(error));
194
+ await this.#resetServices();
195
+ }
196
+
197
+ async setRecordsGenerator(service: string, generator: MdnsServer.RecordGenerator) {
320
198
  await this.#records.clear();
321
199
  this.#recordLastSentAsMulticastAnswer.clear();
322
- this.#recordLastSentAsUnicastAnswer.clear();
200
+ this.#recordsGenerator.set(service, generator);
323
201
  }
324
202
 
325
- async setRecordsGenerator(
326
- hostPort: number,
327
- type: AnnouncementType,
328
- generator: (netInterface: string) => Promise<DnsRecord<any>[]>,
329
- ) {
203
+ async #resetServices() {
330
204
  await this.#records.clear();
331
205
  this.#recordLastSentAsMulticastAnswer.clear();
332
- this.#recordLastSentAsUnicastAnswer.clear();
333
- this.#recordsGenerator.set(this.buildTypePortKey(type, hostPort), generator);
334
206
  }
335
207
 
336
208
  async close() {
209
+ this.#observers.close();
337
210
  await this.#records.close();
338
211
  this.#recordLastSentAsMulticastAnswer.clear();
339
- this.#recordLastSentAsUnicastAnswer.clear();
340
- await this.#multicastServer.close();
341
212
  }
342
213
 
343
214
  #getMulticastInterfacesForAnnounce() {
344
- return this.#netInterface === undefined ? this.#network.getNetInterfaces() : [{ name: this.#netInterface }];
215
+ const { netInterface } = this.#socket;
216
+ return netInterface === undefined ? this.network.getNetInterfaces() : [{ name: netInterface }];
345
217
  }
346
218
 
347
219
  #queryRecords({ name, recordType }: { name: string; recordType: DnsRecordType }, records: DnsRecord<any>[]) {
@@ -352,3 +224,9 @@ export class MdnsServer {
352
224
  }
353
225
  }
354
226
  }
227
+
228
+ export namespace MdnsServer {
229
+ export interface RecordGenerator {
230
+ (intf: string, addrs: NetworkInterfaceDetails): DnsRecord[];
231
+ }
232
+ }
@@ -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 does 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
+ }