matterbridge 3.4.6-dev-20260101-968b4ce → 3.4.6

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 (335) hide show
  1. package/CHANGELOG.md +1 -1
  2. package/dist/broadcastServer.d.ts +144 -0
  3. package/dist/broadcastServer.d.ts.map +1 -0
  4. package/dist/broadcastServer.js +117 -0
  5. package/dist/broadcastServer.js.map +1 -0
  6. package/dist/broadcastServerTypes.d.ts +841 -0
  7. package/dist/broadcastServerTypes.d.ts.map +1 -0
  8. package/dist/broadcastServerTypes.js +24 -0
  9. package/dist/broadcastServerTypes.js.map +1 -0
  10. package/dist/cli.d.ts +30 -0
  11. package/dist/cli.d.ts.map +1 -0
  12. package/dist/cli.js +97 -1
  13. package/dist/cli.js.map +1 -0
  14. package/dist/cliEmitter.d.ts +50 -0
  15. package/dist/cliEmitter.d.ts.map +1 -0
  16. package/dist/cliEmitter.js +37 -0
  17. package/dist/cliEmitter.js.map +1 -0
  18. package/dist/cliHistory.d.ts +48 -0
  19. package/dist/cliHistory.d.ts.map +1 -0
  20. package/dist/cliHistory.js +38 -0
  21. package/dist/cliHistory.js.map +1 -0
  22. package/dist/clusters/export.d.ts +2 -0
  23. package/dist/clusters/export.d.ts.map +1 -0
  24. package/dist/clusters/export.js +2 -0
  25. package/dist/clusters/export.js.map +1 -0
  26. package/dist/deviceManager.d.ts +135 -0
  27. package/dist/deviceManager.d.ts.map +1 -0
  28. package/dist/deviceManager.js +113 -1
  29. package/dist/deviceManager.js.map +1 -0
  30. package/dist/devices/airConditioner.d.ts +98 -0
  31. package/dist/devices/airConditioner.d.ts.map +1 -0
  32. package/dist/devices/airConditioner.js +57 -0
  33. package/dist/devices/airConditioner.js.map +1 -0
  34. package/dist/devices/batteryStorage.d.ts +48 -0
  35. package/dist/devices/batteryStorage.d.ts.map +1 -0
  36. package/dist/devices/batteryStorage.js +48 -1
  37. package/dist/devices/batteryStorage.js.map +1 -0
  38. package/dist/devices/cooktop.d.ts +61 -0
  39. package/dist/devices/cooktop.d.ts.map +1 -0
  40. package/dist/devices/cooktop.js +56 -0
  41. package/dist/devices/cooktop.js.map +1 -0
  42. package/dist/devices/dishwasher.d.ts +71 -0
  43. package/dist/devices/dishwasher.d.ts.map +1 -0
  44. package/dist/devices/dishwasher.js +57 -0
  45. package/dist/devices/dishwasher.js.map +1 -0
  46. package/dist/devices/evse.d.ts +76 -0
  47. package/dist/devices/evse.d.ts.map +1 -0
  48. package/dist/devices/evse.js +74 -10
  49. package/dist/devices/evse.js.map +1 -0
  50. package/dist/devices/export.d.ts +17 -0
  51. package/dist/devices/export.d.ts.map +1 -0
  52. package/dist/devices/export.js +5 -0
  53. package/dist/devices/export.js.map +1 -0
  54. package/dist/devices/extractorHood.d.ts +46 -0
  55. package/dist/devices/extractorHood.d.ts.map +1 -0
  56. package/dist/devices/extractorHood.js +43 -0
  57. package/dist/devices/extractorHood.js.map +1 -0
  58. package/dist/devices/heatPump.d.ts +47 -0
  59. package/dist/devices/heatPump.d.ts.map +1 -0
  60. package/dist/devices/heatPump.js +50 -2
  61. package/dist/devices/heatPump.js.map +1 -0
  62. package/dist/devices/laundryDryer.d.ts +67 -0
  63. package/dist/devices/laundryDryer.d.ts.map +1 -0
  64. package/dist/devices/laundryDryer.js +62 -3
  65. package/dist/devices/laundryDryer.js.map +1 -0
  66. package/dist/devices/laundryWasher.d.ts +81 -0
  67. package/dist/devices/laundryWasher.d.ts.map +1 -0
  68. package/dist/devices/laundryWasher.js +70 -4
  69. package/dist/devices/laundryWasher.js.map +1 -0
  70. package/dist/devices/microwaveOven.d.ts +168 -0
  71. package/dist/devices/microwaveOven.d.ts.map +1 -0
  72. package/dist/devices/microwaveOven.js +88 -5
  73. package/dist/devices/microwaveOven.js.map +1 -0
  74. package/dist/devices/oven.d.ts +105 -0
  75. package/dist/devices/oven.d.ts.map +1 -0
  76. package/dist/devices/oven.js +85 -0
  77. package/dist/devices/oven.js.map +1 -0
  78. package/dist/devices/refrigerator.d.ts +118 -0
  79. package/dist/devices/refrigerator.d.ts.map +1 -0
  80. package/dist/devices/refrigerator.js +102 -0
  81. package/dist/devices/refrigerator.js.map +1 -0
  82. package/dist/devices/roboticVacuumCleaner.d.ts +112 -0
  83. package/dist/devices/roboticVacuumCleaner.d.ts.map +1 -0
  84. package/dist/devices/roboticVacuumCleaner.js +100 -9
  85. package/dist/devices/roboticVacuumCleaner.js.map +1 -0
  86. package/dist/devices/solarPower.d.ts +40 -0
  87. package/dist/devices/solarPower.d.ts.map +1 -0
  88. package/dist/devices/solarPower.js +38 -0
  89. package/dist/devices/solarPower.js.map +1 -0
  90. package/dist/devices/speaker.d.ts +87 -0
  91. package/dist/devices/speaker.d.ts.map +1 -0
  92. package/dist/devices/speaker.js +84 -0
  93. package/dist/devices/speaker.js.map +1 -0
  94. package/dist/devices/temperatureControl.d.ts +166 -0
  95. package/dist/devices/temperatureControl.d.ts.map +1 -0
  96. package/dist/devices/temperatureControl.js +24 -3
  97. package/dist/devices/temperatureControl.js.map +1 -0
  98. package/dist/devices/waterHeater.d.ts +111 -0
  99. package/dist/devices/waterHeater.d.ts.map +1 -0
  100. package/dist/devices/waterHeater.js +82 -2
  101. package/dist/devices/waterHeater.js.map +1 -0
  102. package/dist/dgram/coap.d.ts +205 -0
  103. package/dist/dgram/coap.d.ts.map +1 -0
  104. package/dist/dgram/coap.js +126 -13
  105. package/dist/dgram/coap.js.map +1 -0
  106. package/dist/dgram/dgram.d.ts +143 -0
  107. package/dist/dgram/dgram.d.ts.map +1 -0
  108. package/dist/dgram/dgram.js +114 -2
  109. package/dist/dgram/dgram.js.map +1 -0
  110. package/dist/dgram/mb_coap.d.ts +24 -0
  111. package/dist/dgram/mb_coap.d.ts.map +1 -0
  112. package/dist/dgram/mb_coap.js +41 -3
  113. package/dist/dgram/mb_coap.js.map +1 -0
  114. package/dist/dgram/mb_mdns.d.ts +24 -0
  115. package/dist/dgram/mb_mdns.d.ts.map +1 -0
  116. package/dist/dgram/mb_mdns.js +77 -23
  117. package/dist/dgram/mb_mdns.js.map +1 -0
  118. package/dist/dgram/mdns.d.ts +371 -0
  119. package/dist/dgram/mdns.d.ts.map +1 -0
  120. package/dist/dgram/mdns.js +371 -139
  121. package/dist/dgram/mdns.js.map +1 -0
  122. package/dist/dgram/mdnsReflectorClient.d.ts +88 -0
  123. package/dist/dgram/mdnsReflectorClient.d.ts.map +1 -0
  124. package/dist/dgram/mdnsReflectorClient.js +71 -5
  125. package/dist/dgram/mdnsReflectorClient.js.map +1 -0
  126. package/dist/dgram/mdnsReflectorServer.d.ts +78 -0
  127. package/dist/dgram/mdnsReflectorServer.d.ts.map +1 -0
  128. package/dist/dgram/mdnsReflectorServer.js +73 -8
  129. package/dist/dgram/mdnsReflectorServer.js.map +1 -0
  130. package/dist/dgram/mdnsReflectorTypes.d.ts +28 -0
  131. package/dist/dgram/mdnsReflectorTypes.d.ts.map +1 -0
  132. package/dist/dgram/mdnsReflectorTypes.js +24 -1
  133. package/dist/dgram/mdnsReflectorTypes.js.map +1 -0
  134. package/dist/dgram/multicast.d.ts +67 -0
  135. package/dist/dgram/multicast.d.ts.map +1 -0
  136. package/dist/dgram/multicast.js +62 -1
  137. package/dist/dgram/multicast.js.map +1 -0
  138. package/dist/dgram/unicast.d.ts +64 -0
  139. package/dist/dgram/unicast.d.ts.map +1 -0
  140. package/dist/dgram/unicast.js +60 -0
  141. package/dist/dgram/unicast.js.map +1 -0
  142. package/dist/frontend.d.ts +245 -0
  143. package/dist/frontend.d.ts.map +1 -0
  144. package/dist/frontend.js +485 -38
  145. package/dist/frontend.js.map +1 -0
  146. package/dist/frontendTypes.d.ts +529 -0
  147. package/dist/frontendTypes.d.ts.map +1 -0
  148. package/dist/frontendTypes.js +45 -0
  149. package/dist/frontendTypes.js.map +1 -0
  150. package/dist/helpers.d.ts +48 -0
  151. package/dist/helpers.d.ts.map +1 -0
  152. package/dist/helpers.js +53 -0
  153. package/dist/helpers.js.map +1 -0
  154. package/dist/index.d.ts +34 -0
  155. package/dist/index.d.ts.map +1 -0
  156. package/dist/index.js +25 -0
  157. package/dist/index.js.map +1 -0
  158. package/dist/jestutils/export.d.ts +2 -0
  159. package/dist/jestutils/export.d.ts.map +1 -0
  160. package/dist/jestutils/export.js +1 -0
  161. package/dist/jestutils/export.js.map +1 -0
  162. package/dist/jestutils/jestHelpers.d.ts +345 -0
  163. package/dist/jestutils/jestHelpers.d.ts.map +1 -0
  164. package/dist/jestutils/jestHelpers.js +371 -14
  165. package/dist/jestutils/jestHelpers.js.map +1 -0
  166. package/dist/logger/export.d.ts +2 -0
  167. package/dist/logger/export.d.ts.map +1 -0
  168. package/dist/logger/export.js +1 -0
  169. package/dist/logger/export.js.map +1 -0
  170. package/dist/matter/behaviors.d.ts +2 -0
  171. package/dist/matter/behaviors.d.ts.map +1 -0
  172. package/dist/matter/behaviors.js +2 -0
  173. package/dist/matter/behaviors.js.map +1 -0
  174. package/dist/matter/clusters.d.ts +2 -0
  175. package/dist/matter/clusters.d.ts.map +1 -0
  176. package/dist/matter/clusters.js +2 -0
  177. package/dist/matter/clusters.js.map +1 -0
  178. package/dist/matter/devices.d.ts +2 -0
  179. package/dist/matter/devices.d.ts.map +1 -0
  180. package/dist/matter/devices.js +2 -0
  181. package/dist/matter/devices.js.map +1 -0
  182. package/dist/matter/endpoints.d.ts +2 -0
  183. package/dist/matter/endpoints.d.ts.map +1 -0
  184. package/dist/matter/endpoints.js +2 -0
  185. package/dist/matter/endpoints.js.map +1 -0
  186. package/dist/matter/export.d.ts +5 -0
  187. package/dist/matter/export.d.ts.map +1 -0
  188. package/dist/matter/export.js +3 -0
  189. package/dist/matter/export.js.map +1 -0
  190. package/dist/matter/types.d.ts +3 -0
  191. package/dist/matter/types.d.ts.map +1 -0
  192. package/dist/matter/types.js +3 -0
  193. package/dist/matter/types.js.map +1 -0
  194. package/dist/matterNode.d.ts +342 -0
  195. package/dist/matterNode.d.ts.map +1 -0
  196. package/dist/matterNode.js +369 -8
  197. package/dist/matterNode.js.map +1 -0
  198. package/dist/matterbridge.d.ts +505 -0
  199. package/dist/matterbridge.d.ts.map +1 -0
  200. package/dist/matterbridge.js +824 -46
  201. package/dist/matterbridge.js.map +1 -0
  202. package/dist/matterbridgeAccessoryPlatform.d.ts +41 -0
  203. package/dist/matterbridgeAccessoryPlatform.d.ts.map +1 -0
  204. package/dist/matterbridgeAccessoryPlatform.js +38 -0
  205. package/dist/matterbridgeAccessoryPlatform.js.map +1 -0
  206. package/dist/matterbridgeBehaviors.d.ts +2404 -0
  207. package/dist/matterbridgeBehaviors.d.ts.map +1 -0
  208. package/dist/matterbridgeBehaviors.js +68 -5
  209. package/dist/matterbridgeBehaviors.js.map +1 -0
  210. package/dist/matterbridgeDeviceTypes.d.ts +698 -0
  211. package/dist/matterbridgeDeviceTypes.d.ts.map +1 -0
  212. package/dist/matterbridgeDeviceTypes.js +635 -14
  213. package/dist/matterbridgeDeviceTypes.js.map +1 -0
  214. package/dist/matterbridgeDynamicPlatform.d.ts +41 -0
  215. package/dist/matterbridgeDynamicPlatform.d.ts.map +1 -0
  216. package/dist/matterbridgeDynamicPlatform.js +38 -0
  217. package/dist/matterbridgeDynamicPlatform.js.map +1 -0
  218. package/dist/matterbridgeEndpoint.d.ts +1507 -0
  219. package/dist/matterbridgeEndpoint.d.ts.map +1 -0
  220. package/dist/matterbridgeEndpoint.js +1457 -53
  221. package/dist/matterbridgeEndpoint.js.map +1 -0
  222. package/dist/matterbridgeEndpointHelpers.d.ts +787 -0
  223. package/dist/matterbridgeEndpointHelpers.d.ts.map +1 -0
  224. package/dist/matterbridgeEndpointHelpers.js +483 -20
  225. package/dist/matterbridgeEndpointHelpers.js.map +1 -0
  226. package/dist/matterbridgeEndpointTypes.d.ts +166 -0
  227. package/dist/matterbridgeEndpointTypes.d.ts.map +1 -0
  228. package/dist/matterbridgeEndpointTypes.js +25 -0
  229. package/dist/matterbridgeEndpointTypes.js.map +1 -0
  230. package/dist/matterbridgePlatform.d.ts +539 -0
  231. package/dist/matterbridgePlatform.d.ts.map +1 -0
  232. package/dist/matterbridgePlatform.js +451 -1
  233. package/dist/matterbridgePlatform.js.map +1 -0
  234. package/dist/matterbridgeTypes.d.ts +252 -0
  235. package/dist/matterbridgeTypes.d.ts.map +1 -0
  236. package/dist/matterbridgeTypes.js +26 -0
  237. package/dist/matterbridgeTypes.js.map +1 -0
  238. package/dist/pluginManager.d.ts +372 -0
  239. package/dist/pluginManager.d.ts.map +1 -0
  240. package/dist/pluginManager.js +341 -5
  241. package/dist/pluginManager.js.map +1 -0
  242. package/dist/shelly.d.ts +181 -0
  243. package/dist/shelly.d.ts.map +1 -0
  244. package/dist/shelly.js +178 -7
  245. package/dist/shelly.js.map +1 -0
  246. package/dist/storage/export.d.ts +2 -0
  247. package/dist/storage/export.d.ts.map +1 -0
  248. package/dist/storage/export.js +1 -0
  249. package/dist/storage/export.js.map +1 -0
  250. package/dist/update.d.ts +84 -0
  251. package/dist/update.d.ts.map +1 -0
  252. package/dist/update.js +93 -1
  253. package/dist/update.js.map +1 -0
  254. package/dist/utils/colorUtils.d.ts +101 -0
  255. package/dist/utils/colorUtils.d.ts.map +1 -0
  256. package/dist/utils/colorUtils.js +97 -2
  257. package/dist/utils/colorUtils.js.map +1 -0
  258. package/dist/utils/commandLine.d.ts +66 -0
  259. package/dist/utils/commandLine.d.ts.map +1 -0
  260. package/dist/utils/commandLine.js +60 -0
  261. package/dist/utils/commandLine.js.map +1 -0
  262. package/dist/utils/copyDirectory.d.ts +35 -0
  263. package/dist/utils/copyDirectory.d.ts.map +1 -0
  264. package/dist/utils/copyDirectory.js +37 -0
  265. package/dist/utils/copyDirectory.js.map +1 -0
  266. package/dist/utils/createDirectory.d.ts +34 -0
  267. package/dist/utils/createDirectory.d.ts.map +1 -0
  268. package/dist/utils/createDirectory.js +33 -0
  269. package/dist/utils/createDirectory.js.map +1 -0
  270. package/dist/utils/createZip.d.ts +39 -0
  271. package/dist/utils/createZip.d.ts.map +1 -0
  272. package/dist/utils/createZip.js +47 -2
  273. package/dist/utils/createZip.js.map +1 -0
  274. package/dist/utils/deepCopy.d.ts +32 -0
  275. package/dist/utils/deepCopy.d.ts.map +1 -0
  276. package/dist/utils/deepCopy.js +39 -0
  277. package/dist/utils/deepCopy.js.map +1 -0
  278. package/dist/utils/deepEqual.d.ts +54 -0
  279. package/dist/utils/deepEqual.d.ts.map +1 -0
  280. package/dist/utils/deepEqual.js +72 -1
  281. package/dist/utils/deepEqual.js.map +1 -0
  282. package/dist/utils/error.d.ts +45 -0
  283. package/dist/utils/error.d.ts.map +1 -0
  284. package/dist/utils/error.js +42 -0
  285. package/dist/utils/error.js.map +1 -0
  286. package/dist/utils/export.d.ts +13 -0
  287. package/dist/utils/export.d.ts.map +1 -0
  288. package/dist/utils/export.js +1 -0
  289. package/dist/utils/export.js.map +1 -0
  290. package/dist/utils/format.d.ts +53 -0
  291. package/dist/utils/format.d.ts.map +1 -0
  292. package/dist/utils/format.js +49 -0
  293. package/dist/utils/format.js.map +1 -0
  294. package/dist/utils/hex.d.ts +89 -0
  295. package/dist/utils/hex.d.ts.map +1 -0
  296. package/dist/utils/hex.js +124 -0
  297. package/dist/utils/hex.js.map +1 -0
  298. package/dist/utils/inspector.d.ts +87 -0
  299. package/dist/utils/inspector.d.ts.map +1 -0
  300. package/dist/utils/inspector.js +69 -1
  301. package/dist/utils/inspector.js.map +1 -0
  302. package/dist/utils/isValid.d.ts +103 -0
  303. package/dist/utils/isValid.d.ts.map +1 -0
  304. package/dist/utils/isValid.js +93 -0
  305. package/dist/utils/isValid.js.map +1 -0
  306. package/dist/utils/network.d.ts +140 -0
  307. package/dist/utils/network.d.ts.map +1 -0
  308. package/dist/utils/network.js +126 -6
  309. package/dist/utils/network.js.map +1 -0
  310. package/dist/utils/spawn.d.ts +33 -0
  311. package/dist/utils/spawn.d.ts.map +1 -0
  312. package/dist/utils/spawn.js +71 -1
  313. package/dist/utils/spawn.js.map +1 -0
  314. package/dist/utils/tracker.d.ts +108 -0
  315. package/dist/utils/tracker.d.ts.map +1 -0
  316. package/dist/utils/tracker.js +64 -1
  317. package/dist/utils/tracker.js.map +1 -0
  318. package/dist/utils/wait.d.ts +54 -0
  319. package/dist/utils/wait.d.ts.map +1 -0
  320. package/dist/utils/wait.js +60 -8
  321. package/dist/utils/wait.js.map +1 -0
  322. package/dist/workerGlobalPrefix.d.ts +25 -0
  323. package/dist/workerGlobalPrefix.d.ts.map +1 -0
  324. package/dist/workerGlobalPrefix.js +37 -5
  325. package/dist/workerGlobalPrefix.js.map +1 -0
  326. package/dist/workerTypes.d.ts +52 -0
  327. package/dist/workerTypes.d.ts.map +1 -0
  328. package/dist/workerTypes.js +24 -0
  329. package/dist/workerTypes.js.map +1 -0
  330. package/dist/workers.d.ts +69 -0
  331. package/dist/workers.d.ts.map +1 -0
  332. package/dist/workers.js +68 -4
  333. package/dist/workers.js.map +1 -0
  334. package/npm-shrinkwrap.json +2 -2
  335. package/package.json +2 -1
@@ -1,12 +1,39 @@
1
+ /**
2
+ * @description This file contains the bin mb_mdns for the class Mdns.
3
+ * @file src/dgram/mb_mdns.ts
4
+ * @author Luca Liguori
5
+ * @created 2025-07-22
6
+ * @version 1.0.0
7
+ * @license Apache-2.0
8
+ *
9
+ * Copyright 2025, 2026, 2027 Luca Liguori.
10
+ *
11
+ * Licensed under the Apache License, Version 2.0 (the "License");
12
+ * you may not use this file except in compliance with the License.
13
+ * You may obtain a copy of the License at
14
+ *
15
+ * http://www.apache.org/licenses/LICENSE-2.0
16
+ *
17
+ * Unless required by applicable law or agreed to in writing, software
18
+ * distributed under the License is distributed on an "AS IS" BASIS,
19
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
20
+ * See the License for the specific language governing permissions and
21
+ * limitations under the License.
22
+ */
1
23
  import os from 'node:os';
24
+ // Matterbridge
2
25
  import { getIntParameter, getParameter, getStringArrayParameter, hasParameter } from '../utils/commandLine.js';
26
+ // Net imports
3
27
  import { MDNS_MULTICAST_IPV4_ADDRESS, MDNS_MULTICAST_IPV6_ADDRESS, MDNS_MULTICAST_PORT } from './multicast.js';
4
28
  import { Mdns } from './mdns.js';
5
29
  import { MdnsReflectorClient } from './mdnsReflectorClient.js';
6
30
  import { MdnsReflectorServer } from './mdnsReflectorServer.js';
31
+ // istanbul ignore next
7
32
  {
8
33
  if (hasParameter('h') || hasParameter('help')) {
34
+ // eslint-disable-next-line no-console
9
35
  console.log(`Copyright (c) Matterbridge. All rights reserved. Version 1.0.0.\n`);
36
+ // eslint-disable-next-line no-console
10
37
  console.log(`Usage: mb_mdns [options...]
11
38
 
12
39
  If no command line is provided, mb_mdns shows all incoming mDNS records on all interfaces (0.0.0.0 and ::).
@@ -55,8 +82,10 @@ Examples:
55
82
  # Query each 5s and listen for _matterbridge._tcp.local service records
56
83
  mb_mdns --query 5000 --filter _matterbridge._tcp.local
57
84
  `);
85
+ // eslint-disable-next-line n/no-process-exit
58
86
  process.exit(0);
59
87
  }
88
+ // Dynamic JSON import (Node >= 20) with import attributes
60
89
  const { default: pkg } = await import('../../package.json', { with: { type: 'json' } });
61
90
  let mdnsIpv4QueryInterval;
62
91
  let mdnsIpv6QueryInterval;
@@ -66,6 +95,9 @@ Examples:
66
95
  let mdnsIpv6 = undefined;
67
96
  let reflectorClient = undefined;
68
97
  let reflectorServer = undefined;
98
+ /**
99
+ * Cleanup and log device information before exiting.
100
+ */
69
101
  async function cleanupAndLogAndExit() {
70
102
  clearInterval(mdnsIpv4QueryInterval);
71
103
  clearInterval(mdnsIpv6QueryInterval);
@@ -73,32 +105,38 @@ Examples:
73
105
  clearInterval(mdnsIpv6AdvertiseInterval);
74
106
  if (hasParameter('advertise')) {
75
107
  if (mdnsIpv4)
76
- advertise(mdnsIpv4, 0);
108
+ advertise(mdnsIpv4, 0); // Send goodbye with TTL 0
77
109
  if (mdnsIpv6)
78
- advertise(mdnsIpv6, 0);
110
+ advertise(mdnsIpv6, 0); // Send goodbye with TTL 0
79
111
  }
80
- await new Promise((resolve) => setTimeout(resolve, 250));
112
+ await new Promise((resolve) => setTimeout(resolve, 250)); // Wait for 250ms to allow goodbye messages to be sent
81
113
  mdnsIpv4?.stop();
82
114
  mdnsIpv6?.stop();
83
115
  mdnsIpv4?.logDevices();
84
116
  mdnsIpv6?.logDevices();
85
- await new Promise((resolve) => setTimeout(resolve, 250));
117
+ await new Promise((resolve) => setTimeout(resolve, 250)); // Wait for 250ms to allow sockets to close
86
118
  await reflectorClient?.stop();
87
119
  await reflectorServer?.stop();
88
120
  }
89
121
  const query = (mdns) => {
90
122
  mdns.log.info('Sending mDNS query for common services...');
91
123
  mdns.sendQuery([
92
- { name: '_matterc._udp.local', type: 12, class: 1, unicastResponse: true },
93
- { name: '_matter._tcp.local', type: 12, class: 1, unicastResponse: true },
94
- { name: '_matterbridge._tcp.local', type: 12, class: 1, unicastResponse: true },
95
- { name: '_home-assistant._tcp.local', type: 12, class: 1, unicastResponse: true },
96
- { name: '_shelly._tcp.local', type: 12, class: 1, unicastResponse: true },
97
- { name: '_mqtt._tcp.local', type: 12, class: 1, unicastResponse: true },
98
- { name: '_http._tcp.local', type: 12, class: 1, unicastResponse: true },
99
- { name: '_services._dns-sd._udp.local', type: 12, class: 1, unicastResponse: true },
124
+ { name: '_matterc._udp.local', type: 12 /* DnsRecordType.PTR */, class: 1 /* DnsClass.IN */, unicastResponse: true },
125
+ { name: '_matter._tcp.local', type: 12 /* DnsRecordType.PTR */, class: 1 /* DnsClass.IN */, unicastResponse: true },
126
+ { name: '_matterbridge._tcp.local', type: 12 /* DnsRecordType.PTR */, class: 1 /* DnsClass.IN */, unicastResponse: true },
127
+ { name: '_home-assistant._tcp.local', type: 12 /* DnsRecordType.PTR */, class: 1 /* DnsClass.IN */, unicastResponse: true },
128
+ { name: '_shelly._tcp.local', type: 12 /* DnsRecordType.PTR */, class: 1 /* DnsClass.IN */, unicastResponse: true },
129
+ { name: '_mqtt._tcp.local', type: 12 /* DnsRecordType.PTR */, class: 1 /* DnsClass.IN */, unicastResponse: true },
130
+ { name: '_http._tcp.local', type: 12 /* DnsRecordType.PTR */, class: 1 /* DnsClass.IN */, unicastResponse: true },
131
+ { name: '_services._dns-sd._udp.local', type: 12 /* DnsRecordType.PTR */, class: 1 /* DnsClass.IN */, unicastResponse: true },
100
132
  ]);
101
133
  };
134
+ /**
135
+ * Sends an mDNS advertisement for the HTTP service over UDP IPv4.
136
+ *
137
+ * @param {Mdns} mdns - The Mdns instance to use for sending the advertisement.
138
+ * @param {number} [ttl] - The time-to-live for the advertisement records. Defaults to 120 seconds. Send 0 for goodbye.
139
+ */
102
140
  const advertise = (mdns, ttl = 120) => {
103
141
  mdns.log.info(`Sending mDNS advertisement for matterbridge service with TTL ${ttl ? ttl.toString() : 'goodbye'}...`);
104
142
  const httpServiceType = '_http._tcp.local';
@@ -114,17 +152,25 @@ Examples:
114
152
  const srvRdata = mdns.encodeSrvRdata(0, 0, port, hostName);
115
153
  const txtRdata = mdns.encodeTxtRdata([`version=${pkg.version}`, 'path=/']);
116
154
  const answers = [
117
- { name: '_services._dns-sd._udp.local', rtype: 12, rclass: 1, ttl, rdata: ptrHttpServiceTypeRdata },
118
- { name: httpServiceType, rtype: 12, rclass: 1, ttl, rdata: ptrHttpInstanceRdata },
119
- { name: '_services._dns-sd._udp.local', rtype: 12, rclass: 1, ttl, rdata: ptrMatterbridgeServiceTypeRdata },
120
- { name: matterbridgeServiceType, rtype: 12, rclass: 1, ttl, rdata: ptrMatterbridgeInstanceRdata },
121
- { name: httpInstanceName, rtype: 33, rclass: 1 | 32768, ttl, rdata: srvRdata },
122
- { name: matterbridgeInstanceName, rtype: 33, rclass: 1 | 32768, ttl, rdata: srvRdata },
123
- { name: httpInstanceName, rtype: 16, rclass: 1 | 32768, ttl, rdata: txtRdata },
124
- { name: matterbridgeInstanceName, rtype: 16, rclass: 1 | 32768, ttl, rdata: txtRdata },
155
+ // PTR records for service types and instances
156
+ { name: '_services._dns-sd._udp.local', rtype: 12 /* DnsRecordType.PTR */, rclass: 1 /* DnsClass.IN */, ttl, rdata: ptrHttpServiceTypeRdata },
157
+ { name: httpServiceType, rtype: 12 /* DnsRecordType.PTR */, rclass: 1 /* DnsClass.IN */, ttl, rdata: ptrHttpInstanceRdata },
158
+ { name: '_services._dns-sd._udp.local', rtype: 12 /* DnsRecordType.PTR */, rclass: 1 /* DnsClass.IN */, ttl, rdata: ptrMatterbridgeServiceTypeRdata },
159
+ { name: matterbridgeServiceType, rtype: 12 /* DnsRecordType.PTR */, rclass: 1 /* DnsClass.IN */, ttl, rdata: ptrMatterbridgeInstanceRdata },
160
+ // SRV record for the HTTP instance
161
+ { name: httpInstanceName, rtype: 33 /* DnsRecordType.SRV */, rclass: 1 /* DnsClass.IN */ | 32768 /* DnsClassFlag.FLUSH */, ttl, rdata: srvRdata },
162
+ // SRV record for the matterbridge instance
163
+ { name: matterbridgeInstanceName, rtype: 33 /* DnsRecordType.SRV */, rclass: 1 /* DnsClass.IN */ | 32768 /* DnsClassFlag.FLUSH */, ttl, rdata: srvRdata },
164
+ // TXT record for the HTTP instance
165
+ { name: httpInstanceName, rtype: 16 /* DnsRecordType.TXT */, rclass: 1 /* DnsClass.IN */ | 32768 /* DnsClassFlag.FLUSH */, ttl, rdata: txtRdata },
166
+ // TXT record for the matterbridge instance
167
+ { name: matterbridgeInstanceName, rtype: 16 /* DnsRecordType.TXT */, rclass: 1 /* DnsClass.IN */ | 32768 /* DnsClassFlag.FLUSH */, ttl, rdata: txtRdata },
125
168
  ];
169
+ // Always attempt to add both A and all AAAA records (best effort), regardless of the socket family.
126
170
  const interfaces = os.networkInterfaces();
171
+ // Use specified interface name if provided
127
172
  let interfaceInfos = mdns.interfaceName ? interfaces[mdns.interfaceName] : undefined;
173
+ // Find the first non-internal IPv4 and IPv6 addresses if interface name is not provided or not found
128
174
  if (!interfaceInfos) {
129
175
  interfaceInfos = [];
130
176
  for (const name of Object.keys(interfaces)) {
@@ -135,15 +181,16 @@ Examples:
135
181
  }
136
182
  }
137
183
  }
184
+ // Encode A and AAAA records for all non-internal addresses of the selected interface
138
185
  try {
139
186
  for (const info of interfaceInfos) {
140
187
  if (info.family === 'IPv4' && !info.internal) {
141
188
  const ipv4 = info.address;
142
- answers.push({ name: hostName, rtype: 1, rclass: 1 | 32768, ttl, rdata: mdns.encodeA(ipv4) });
189
+ answers.push({ name: hostName, rtype: 1 /* DnsRecordType.A */, rclass: 1 /* DnsClass.IN */ | 32768 /* DnsClassFlag.FLUSH */, ttl, rdata: mdns.encodeA(ipv4) });
143
190
  }
144
191
  else if (info.family === 'IPv6' && !info.internal) {
145
192
  const ipv6 = info.address;
146
- answers.push({ name: hostName, rtype: 28, rclass: 1 | 32768, ttl, rdata: mdns.encodeAAAA(ipv6) });
193
+ answers.push({ name: hostName, rtype: 28 /* DnsRecordType.AAAA */, rclass: 1 /* DnsClass.IN */ | 32768 /* DnsClassFlag.FLUSH */, ttl, rdata: mdns.encodeAAAA(ipv6) });
147
194
  }
148
195
  }
149
196
  }
@@ -156,9 +203,11 @@ Examples:
156
203
  mdnsIpv4 = new Mdns('mDNS Server udp4', MDNS_MULTICAST_IPV4_ADDRESS, MDNS_MULTICAST_PORT, 'udp4', true, getParameter('interfaceName'), getParameter('ipv4InterfaceAddress') || '0.0.0.0', getParameter('outgoingIpv4InterfaceAddress'));
157
204
  if (hasParameter('v') || hasParameter('verbose'))
158
205
  mdnsIpv4.listNetworkInterfaces();
206
+ // Apply filters if any
159
207
  const filters = getStringArrayParameter('filter');
160
208
  if (filters)
161
209
  mdnsIpv4.filters.push(...filters);
210
+ // Start the IPv4 mDNS server
162
211
  mdnsIpv4.start();
163
212
  mdnsIpv4.on('ready', (address) => {
164
213
  mdnsIpv4?.socket.setMulticastLoopback(false);
@@ -177,9 +226,11 @@ Examples:
177
226
  mdnsIpv6 = new Mdns('mDNS Server udp6', MDNS_MULTICAST_IPV6_ADDRESS, MDNS_MULTICAST_PORT, 'udp6', true, getParameter('interfaceName'), getParameter('ipv6InterfaceAddress') || '::', getParameter('outgoingIpv6InterfaceAddress'));
178
227
  if (hasParameter('v') || hasParameter('verbose'))
179
228
  mdnsIpv6.listNetworkInterfaces();
229
+ // Apply filters if any
180
230
  const filters = getStringArrayParameter('filter');
181
231
  if (filters)
182
232
  mdnsIpv6.filters.push(...filters);
233
+ // Start the IPv6 mDNS server
183
234
  mdnsIpv6.start();
184
235
  mdnsIpv6.on('ready', (address) => {
185
236
  mdnsIpv6?.socket.setMulticastLoopback(false);
@@ -202,15 +253,18 @@ Examples:
202
253
  reflectorServer = new MdnsReflectorServer();
203
254
  await reflectorServer.start();
204
255
  }
256
+ // Handle Ctrl+C (SIGINT) and SIGTERM to stop and log devices
205
257
  process.on('SIGINT', async () => {
206
258
  await cleanupAndLogAndExit();
207
259
  });
208
260
  process.on('SIGTERM', async () => {
209
261
  await cleanupAndLogAndExit();
210
262
  });
263
+ // Exit after a timeout to avoid running indefinitely in test environments
211
264
  if (!hasParameter('no-timeout') && !hasParameter('reflector-server') && !hasParameter('reflector-client')) {
212
265
  setTimeout(async () => {
213
266
  await cleanupAndLogAndExit();
214
- }, 600000).unref();
267
+ }, 600000).unref(); // 10 minutes timeout to exit if no activity
215
268
  }
216
269
  }
270
+ //# sourceMappingURL=mb_mdns.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mb_mdns.js","sourceRoot":"","sources":["../../src/dgram/mb_mdns.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,371 @@
1
+ /**
2
+ * @description This file contains the class Mdns.
3
+ * @file mdns.ts
4
+ * @author Luca Liguori
5
+ * @created 2025-03-22
6
+ * @version 1.0.0
7
+ * @license Apache-2.0
8
+ *
9
+ * Copyright 2025, 2026, 2027 Luca Liguori.
10
+ *
11
+ * Licensed under the Apache License, Version 2.0 (the "License");
12
+ * you may not use this file except in compliance with the License.
13
+ * You may obtain a copy of the License at
14
+ *
15
+ * http://www.apache.org/licenses/LICENSE-2.0
16
+ *
17
+ * Unless required by applicable law or agreed to in writing, software
18
+ * distributed under the License is distributed on an "AS IS" BASIS,
19
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
20
+ * See the License for the specific language governing permissions and
21
+ * limitations under the License.
22
+ */
23
+ import dgram from 'node:dgram';
24
+ import { AnsiLogger } from 'node-ansi-logger';
25
+ import { Multicast } from './multicast.js';
26
+ export declare const enum DnsRecordType {
27
+ A = 1,
28
+ NS = 2,
29
+ MD = 3,
30
+ MF = 4,
31
+ CNAME = 5,
32
+ SOA = 6,
33
+ MB = 7,
34
+ MG = 8,
35
+ MR = 9,
36
+ NULL = 10,
37
+ WKS = 11,
38
+ PTR = 12,
39
+ HINFO = 13,
40
+ MINFO = 14,
41
+ MX = 15,
42
+ TXT = 16,
43
+ RP = 17,
44
+ AFSDB = 18,
45
+ X25 = 19,
46
+ ISDN = 20,
47
+ RT = 21,
48
+ NSAP = 22,
49
+ NSAP_PTR = 23,
50
+ SIG = 24,
51
+ KEY = 25,
52
+ PX = 26,
53
+ GPOS = 27,
54
+ AAAA = 28,
55
+ LOC = 29,
56
+ NXT = 30,
57
+ EID = 31,
58
+ NIMLOC = 32,
59
+ SRV = 33,
60
+ ATMA = 34,
61
+ NAPTR = 35,
62
+ KX = 36,
63
+ CERT = 37,
64
+ A6 = 38,
65
+ DNAME = 39,
66
+ SINK = 40,
67
+ OPT = 41,
68
+ APL = 42,
69
+ DS = 43,
70
+ SSHFP = 44,
71
+ IPSECKEY = 45,
72
+ RRSIG = 46,
73
+ NSEC = 47,
74
+ DNSKEY = 48,
75
+ DHCID = 49,
76
+ NSEC3 = 50,
77
+ NSEC3PARAM = 51,
78
+ TLSA = 52,
79
+ SMIMEA = 53,
80
+ HIP = 55,
81
+ NINFO = 56,
82
+ RKEY = 57,
83
+ TALINK = 58,
84
+ CDS = 59,
85
+ CDNSKEY = 60,
86
+ OPENPGPKEY = 61,
87
+ CSYNC = 62,
88
+ ZONEMD = 63,
89
+ SVCB = 64,
90
+ HTTPS = 65,
91
+ SPF = 99,
92
+ UINFO = 100,
93
+ UID = 101,
94
+ GID = 102,
95
+ UNSPEC = 103,
96
+ NID = 104,
97
+ L32 = 105,
98
+ L64 = 106,
99
+ LP = 107,
100
+ EUI48 = 108,
101
+ EUI64 = 109,
102
+ TKEY = 249,
103
+ TSIG = 250,
104
+ IXFR = 251,
105
+ AXFR = 252,
106
+ MAILB = 253,
107
+ MAILA = 254,
108
+ ANY = 255,
109
+ URI = 256,
110
+ CAA = 257,
111
+ AVC = 258,
112
+ DOA = 259,
113
+ AMTRELAY = 260,
114
+ ZONEVERSION = 261,
115
+ TA = 32768,
116
+ DLV = 32769
117
+ }
118
+ export declare const enum DnsClass {
119
+ IN = 1,// Internet
120
+ CH = 3,// Chaos
121
+ HS = 4,// Hesiod
122
+ ANY = 255
123
+ }
124
+ export declare const enum DnsClassFlag {
125
+ FLUSH = 32768,// For answers (resource records)
126
+ QU = 32768
127
+ }
128
+ export interface MdnsMessage {
129
+ id: number;
130
+ qr: number;
131
+ opcode: number;
132
+ aa: boolean;
133
+ tc: boolean;
134
+ rd: boolean;
135
+ ra: boolean;
136
+ z: number;
137
+ rcode: number;
138
+ qdCount: number;
139
+ anCount: number;
140
+ nsCount: number;
141
+ arCount: number;
142
+ questions?: DnsQuestion[];
143
+ answers?: MdnsRecord[];
144
+ authorities?: MdnsRecord[];
145
+ additionals?: MdnsRecord[];
146
+ }
147
+ interface DnsQuestion {
148
+ name: string;
149
+ type: number;
150
+ class: number;
151
+ }
152
+ interface MdnsRecord {
153
+ name: string;
154
+ type: number;
155
+ class: number;
156
+ ttl: number;
157
+ data: string;
158
+ }
159
+ /**
160
+ * Checks if a given message is an mDNS message.
161
+ *
162
+ * @param {Buffer} message - The message buffer to check.
163
+ * @returns {boolean} True if the message is an mDNS message, false otherwise.
164
+ */
165
+ export declare function isMdns(message: Buffer): boolean;
166
+ /**
167
+ * Checks if a given mDNS message is a query.
168
+ *
169
+ * @param {Buffer} message - The mDNS message buffer to check.
170
+ * @returns {boolean} True if the message is a query, false otherwise.
171
+ */
172
+ export declare function isMdnsQuery(message: Buffer): boolean;
173
+ /**
174
+ * Checks if a given mDNS message is a query.
175
+ *
176
+ * @param {Buffer} message - The mDNS message buffer to check.
177
+ * @returns {boolean} True if the message is a query, false otherwise.
178
+ */
179
+ export declare function isMdnsResponse(message: Buffer): boolean;
180
+ export declare class Mdns extends Multicast {
181
+ deviceQueries: Map<string, {
182
+ rinfo: dgram.RemoteInfo;
183
+ query: MdnsMessage;
184
+ }>;
185
+ deviceResponses: Map<string, {
186
+ rinfo: dgram.RemoteInfo;
187
+ response: MdnsMessage;
188
+ dataPTR?: string;
189
+ }>;
190
+ filters: string[];
191
+ /**
192
+ * Creates an instance of the Mdns class.
193
+ *
194
+ * @param {string} name - The internal name of the mDNS server for the logs.
195
+ * @param {string} multicastAddress - The multicast address for mDNS (i.e. 224.0.0.251 for udp4 or ff02::fb for udp6).
196
+ * @param {number} multicastPort - The port for mDNS (i.e. 5353).
197
+ * @param {('udp4' | 'udp6')} socketType - The type of socket to create (either 'udp4' or 'udp6').
198
+ * @param {boolean} [reuseAddr] - Whether to reuse the address. Defaults to true.
199
+ * @param {string} [interfaceName] - The optional name of the network interface to use.
200
+ * @param {string} [interfaceAddress] - The optional IP address of the network interface to use.
201
+ * @param {string} [outgoingInterfaceAddress] - The address of the outgoing network interface.
202
+ */
203
+ constructor(name: string, multicastAddress: string, multicastPort: number, socketType: 'udp4' | 'udp6', reuseAddr?: boolean | undefined, interfaceName?: string, interfaceAddress?: string, outgoingInterfaceAddress?: string);
204
+ onQuery(rinfo: dgram.RemoteInfo, _query: MdnsMessage): void;
205
+ onResponse(rinfo: dgram.RemoteInfo, _response: MdnsMessage): void;
206
+ onMessage(msg: Buffer, rinfo: dgram.RemoteInfo): void;
207
+ /**
208
+ * Decodes an mDNS message, including the header, question section, answer section,
209
+ * authority section, and additional section.
210
+ *
211
+ * @param {Buffer} msg - The raw mDNS message buffer.
212
+ * @returns {MdnsMessage} An object representing the decoded mDNS message.
213
+ * @throws {Error} if the message is too short.
214
+ */
215
+ decodeMdnsMessage(msg: Buffer): MdnsMessage;
216
+ /**
217
+ * Decodes a DNS name from a buffer, handling compression.
218
+ *
219
+ * @param {Buffer} msg - The full mDNS message buffer.
220
+ * @param {number} offset - The offset at which the DNS name starts.
221
+ * @returns {{ name: string; newOffset: number }} An object with the decoded name and the new offset.
222
+ * @throws {Error} if the offset exceeds the buffer length or too many iterations are performed.
223
+ */
224
+ decodeDnsName(msg: Buffer, offset: number): {
225
+ name: string;
226
+ newOffset: number;
227
+ };
228
+ /**
229
+ * Encodes a domain name into the DNS label format.
230
+ *
231
+ * For example, "example.local" becomes:
232
+ * [7] "example" [5] "local" [0]
233
+ *
234
+ * @param {string} name - The domain name to encode.
235
+ * @returns {Buffer} The encoded domain name as a Buffer.
236
+ */
237
+ encodeDnsName(name: string): Buffer;
238
+ /**
239
+ * Encodes TXT record RDATA.
240
+ *
241
+ * In DNS/mDNS, TXT RDATA is a sequence of one or more <character-string>,
242
+ * each encoded as: [length byte][UTF-8 bytes].
243
+ *
244
+ * @param {string[]} txt - Array of TXT entries, e.g. ["key=value", "path=/"].
245
+ * @returns {Buffer} Encoded TXT RDATA.
246
+ * @throws {Error} If any entry exceeds 255 bytes.
247
+ *
248
+ * @example
249
+ * const txtRdata = mdns.encodeTxtRdata(['txtvers=1', 'path=/']);
250
+ * mdns.sendResponse([
251
+ * { name: 'example._http._tcp.local', rtype: DnsRecordType.TXT, rclass: DnsClass.IN | DnsClassFlag.FLUSH, ttl: 120, rdata: txtRdata },
252
+ * ]);
253
+ */
254
+ encodeTxtRdata(txt: string[]): Buffer;
255
+ /**
256
+ * Encodes SRV record RDATA.
257
+ *
258
+ * SRV RDATA layout (RFC 2782):
259
+ * - priority (2 bytes)
260
+ * - weight (2 bytes)
261
+ * - port (2 bytes)
262
+ * - target (DNS name)
263
+ *
264
+ * @param {number} priority - SRV priority.
265
+ * @param {number} weight - SRV weight.
266
+ * @param {number} port - Service port.
267
+ * @param {string} target - Target hostname (e.g. "matterbridge.local").
268
+ * @returns {Buffer} Encoded SRV RDATA.
269
+ */
270
+ encodeSrvRdata(priority: number, weight: number, port: number, target: string): Buffer;
271
+ /**
272
+ * Encodes an IPv4 address for an A record RDATA (4 bytes).
273
+ *
274
+ * @param {string} ipv4 - IPv4 address, e.g. "192.168.1.10".
275
+ * @returns {Buffer} 4-byte buffer.
276
+ * @throws {Error} If the address is not a valid dotted-quad.
277
+ */
278
+ encodeA(ipv4: string): Buffer;
279
+ /**
280
+ * Encodes an IPv6 address for an AAAA record RDATA (16 bytes).
281
+ *
282
+ * Supports the "::" zero-compression form and ignores an optional scope id
283
+ * suffix (e.g. "fe80::1%12" or "fe80::1%eth0").
284
+ *
285
+ * @param {string} ipv6WithOptionalScope - IPv6 address (optionally with scope id).
286
+ * @returns {Buffer} 16-byte buffer.
287
+ * @throws {Error} If the address is not a valid IPv6 literal.
288
+ */
289
+ encodeAAAA(ipv6WithOptionalScope: string): Buffer;
290
+ /**
291
+ * Decodes a DNS resource record.
292
+ *
293
+ * @param {Buffer} msg - The full mDNS message buffer.
294
+ * @param {number} offset - The offset at which the resource record starts.
295
+ * @returns {{ record: MdnsRecord; newOffset: number }} An object containing the decoded record and the new offset.
296
+ */
297
+ decodeResourceRecord(msg: Buffer, offset: number): {
298
+ record: MdnsRecord;
299
+ newOffset: number;
300
+ };
301
+ /**
302
+ * Sends a DNS query with multiple questions.
303
+ *
304
+ * @param {Array<{ name: string; type: number; class: number; unicastResponse?: boolean }>} questions - Array of questions
305
+ * to include in the query.
306
+ * @returns {Buffer<ArrayBuffer>} The constructed query buffer.
307
+ *
308
+ * @remarks
309
+ * Each question should have a name (e.g., "_http._tcp.local"), type (e.g., DnsRecordType.PTR), class (e.g., DnsClass.IN),
310
+ * and an optional unicastResponse flag (this will add the DnsClassFlag.QU flag to the query).
311
+ */
312
+ sendQuery(questions: {
313
+ name: string;
314
+ type: number;
315
+ class: number;
316
+ unicastResponse?: boolean;
317
+ }[]): Buffer<ArrayBuffer>;
318
+ /**
319
+ * Constructs an mDNS response packet and sends it to the multicast address and port.
320
+ *
321
+ * @param {Array<{ name: string; rtype: number; rclass: number; ttl: number; rdata: Buffer }>} answers - Array of answer records.
322
+ * @returns {Buffer<ArrayBuffer>} The constructed response buffer.
323
+ *
324
+ * @example
325
+ * const ptrRdata = mdnsIpv4.encodeDnsName('matterbridge._http._tcp.local');
326
+ * mdnsIpv4.sendResponse([{ name: '_http._tcp.local', rtype: DnsRecordType.PTR, rclass: DnsClass.IN, ttl: 120, rdata: ptrRdata }]);
327
+ */
328
+ sendResponse(answers: {
329
+ name: string;
330
+ rtype: number;
331
+ rclass: number;
332
+ ttl: number;
333
+ rdata: Buffer;
334
+ }[]): Buffer<ArrayBuffer>;
335
+ /**
336
+ * Converts a DNS record type numeric value to its string representation.
337
+ *
338
+ * @param {number} type - The numeric DNS record type.
339
+ * @returns {string} The string representation of the record type.
340
+ */
341
+ dnsTypeToString(type: number): string;
342
+ /**
343
+ * Converts a DNS response class numeric value to its string representation.
344
+ *
345
+ * @param {number} cls - The numeric DNS class.
346
+ * @returns {string} The string representation of the DNS class.
347
+ */
348
+ dnsResponseClassToString(cls: number): string;
349
+ /**
350
+ * Converts a DNS question class to a human-readable string.
351
+ * Adds support for mDNS QU (unicast-response) bit.
352
+ *
353
+ * @param {number} cls - The numeric question class.
354
+ * @returns {string} The string representation, e.g. "IN|QU"
355
+ */
356
+ dnsQuestionClassToString(cls: number): string;
357
+ /**
358
+ * Logs the decoded mDNS message header.
359
+ *
360
+ * @param {MdnsMessage} msg - The mDNS message header object.
361
+ * @param {AnsiLogger} [log] - The logger to use (defaults to this.log).
362
+ * @param {string} [text] - Optional additional text to include in the log.
363
+ */
364
+ logMdnsMessage(msg: MdnsMessage, log?: AnsiLogger, text?: string): void;
365
+ /**
366
+ * Logs the discovered devices from the mDNS queries and responses.
367
+ */
368
+ logDevices(): void;
369
+ }
370
+ export {};
371
+ //# sourceMappingURL=mdns.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mdns.d.ts","sourceRoot":"","sources":["../../src/dgram/mdns.ts"],"names":[],"mappings":"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"}