matterbridge 3.4.2 → 3.4.3-dev-20251207-3ce5a0e

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 (332) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/README-SERVICE-LOCAL.md +3 -3
  3. package/README-SERVICE-OPT.md +3 -5
  4. package/README.md +8 -14
  5. package/dist/broadcastServer.js +0 -119
  6. package/dist/broadcastServerTypes.js +0 -24
  7. package/dist/cli.js +3 -97
  8. package/dist/cliEmitter.js +0 -37
  9. package/dist/cliHistory.js +0 -38
  10. package/dist/clusters/export.js +0 -2
  11. package/dist/deviceManager.js +1 -113
  12. package/dist/devices/airConditioner.js +0 -57
  13. package/dist/devices/batteryStorage.js +1 -48
  14. package/dist/devices/cooktop.js +0 -56
  15. package/dist/devices/dishwasher.js +0 -57
  16. package/dist/devices/evse.js +10 -74
  17. package/dist/devices/export.js +0 -5
  18. package/dist/devices/extractorHood.js +0 -43
  19. package/dist/devices/heatPump.js +2 -50
  20. package/dist/devices/laundryDryer.js +3 -62
  21. package/dist/devices/laundryWasher.js +4 -70
  22. package/dist/devices/microwaveOven.js +5 -88
  23. package/dist/devices/oven.js +0 -85
  24. package/dist/devices/refrigerator.js +0 -102
  25. package/dist/devices/roboticVacuumCleaner.js +9 -100
  26. package/dist/devices/solarPower.js +0 -38
  27. package/dist/devices/speaker.js +0 -84
  28. package/dist/devices/temperatureControl.js +3 -24
  29. package/dist/devices/waterHeater.js +2 -82
  30. package/dist/dgram/coap.js +13 -126
  31. package/dist/dgram/dgram.js +2 -114
  32. package/dist/dgram/mb_coap.js +3 -41
  33. package/dist/dgram/mb_mdns.js +15 -80
  34. package/dist/dgram/mdns.js +137 -299
  35. package/dist/dgram/multicast.js +1 -62
  36. package/dist/dgram/unicast.js +0 -54
  37. package/dist/frontend.js +35 -455
  38. package/dist/frontendTypes.js +0 -45
  39. package/dist/helpers.js +0 -53
  40. package/dist/index.js +0 -25
  41. package/dist/jestutils/export.js +0 -1
  42. package/dist/jestutils/jestHelpers.js +14 -371
  43. package/dist/logger/export.js +0 -1
  44. package/dist/matter/behaviors.js +0 -2
  45. package/dist/matter/clusters.js +0 -2
  46. package/dist/matter/devices.js +0 -2
  47. package/dist/matter/endpoints.js +0 -2
  48. package/dist/matter/export.js +0 -3
  49. package/dist/matter/types.js +0 -3
  50. package/dist/matterNode.js +8 -369
  51. package/dist/matterbridge.js +54 -817
  52. package/dist/matterbridgeAccessoryPlatform.js +0 -38
  53. package/dist/matterbridgeBehaviors.js +5 -68
  54. package/dist/matterbridgeDeviceTypes.js +14 -635
  55. package/dist/matterbridgeDynamicPlatform.js +0 -38
  56. package/dist/matterbridgeEndpoint.js +53 -1444
  57. package/dist/matterbridgeEndpointHelpers.js +20 -483
  58. package/dist/matterbridgeEndpointTypes.js +0 -25
  59. package/dist/matterbridgePlatform.js +1 -451
  60. package/dist/matterbridgeTypes.js +0 -26
  61. package/dist/pluginManager.js +5 -341
  62. package/dist/shelly.js +7 -178
  63. package/dist/storage/export.js +0 -1
  64. package/dist/update.js +1 -93
  65. package/dist/utils/colorUtils.js +2 -97
  66. package/dist/utils/commandLine.js +0 -60
  67. package/dist/utils/copyDirectory.js +0 -37
  68. package/dist/utils/createDirectory.js +0 -33
  69. package/dist/utils/createZip.js +2 -47
  70. package/dist/utils/deepCopy.js +0 -39
  71. package/dist/utils/deepEqual.js +1 -72
  72. package/dist/utils/error.js +0 -42
  73. package/dist/utils/export.js +0 -1
  74. package/dist/utils/format.js +0 -49
  75. package/dist/utils/hex.js +0 -124
  76. package/dist/utils/inspector.js +1 -69
  77. package/dist/utils/isvalid.js +0 -101
  78. package/dist/utils/network.js +5 -96
  79. package/dist/utils/spawn.js +1 -71
  80. package/dist/utils/tracker.js +1 -64
  81. package/dist/utils/wait.js +8 -60
  82. package/dist/workerGlobalPrefix.js +5 -37
  83. package/dist/workerTypes.js +0 -24
  84. package/dist/workers.js +4 -68
  85. package/frontend/build/assets/index.js +4 -4
  86. package/frontend/build/assets/vendor_mui.js +1 -1
  87. package/frontend/package.json +1 -1
  88. package/npm-shrinkwrap.json +8 -7
  89. package/package.json +3 -4
  90. package/scripts/marked.mjs +132 -0
  91. package/scripts/markedFooter.html +42 -0
  92. package/scripts/markedHeader.html +78 -0
  93. package/dist/broadcastServer.d.ts +0 -144
  94. package/dist/broadcastServer.d.ts.map +0 -1
  95. package/dist/broadcastServer.js.map +0 -1
  96. package/dist/broadcastServerTypes.d.ts +0 -841
  97. package/dist/broadcastServerTypes.d.ts.map +0 -1
  98. package/dist/broadcastServerTypes.js.map +0 -1
  99. package/dist/cli.d.ts +0 -30
  100. package/dist/cli.d.ts.map +0 -1
  101. package/dist/cli.js.map +0 -1
  102. package/dist/cliEmitter.d.ts +0 -50
  103. package/dist/cliEmitter.d.ts.map +0 -1
  104. package/dist/cliEmitter.js.map +0 -1
  105. package/dist/cliHistory.d.ts +0 -48
  106. package/dist/cliHistory.d.ts.map +0 -1
  107. package/dist/cliHistory.js.map +0 -1
  108. package/dist/clusters/export.d.ts +0 -2
  109. package/dist/clusters/export.d.ts.map +0 -1
  110. package/dist/clusters/export.js.map +0 -1
  111. package/dist/deviceManager.d.ts +0 -135
  112. package/dist/deviceManager.d.ts.map +0 -1
  113. package/dist/deviceManager.js.map +0 -1
  114. package/dist/devices/airConditioner.d.ts +0 -98
  115. package/dist/devices/airConditioner.d.ts.map +0 -1
  116. package/dist/devices/airConditioner.js.map +0 -1
  117. package/dist/devices/batteryStorage.d.ts +0 -48
  118. package/dist/devices/batteryStorage.d.ts.map +0 -1
  119. package/dist/devices/batteryStorage.js.map +0 -1
  120. package/dist/devices/cooktop.d.ts +0 -61
  121. package/dist/devices/cooktop.d.ts.map +0 -1
  122. package/dist/devices/cooktop.js.map +0 -1
  123. package/dist/devices/dishwasher.d.ts +0 -71
  124. package/dist/devices/dishwasher.d.ts.map +0 -1
  125. package/dist/devices/dishwasher.js.map +0 -1
  126. package/dist/devices/evse.d.ts +0 -76
  127. package/dist/devices/evse.d.ts.map +0 -1
  128. package/dist/devices/evse.js.map +0 -1
  129. package/dist/devices/export.d.ts +0 -17
  130. package/dist/devices/export.d.ts.map +0 -1
  131. package/dist/devices/export.js.map +0 -1
  132. package/dist/devices/extractorHood.d.ts +0 -46
  133. package/dist/devices/extractorHood.d.ts.map +0 -1
  134. package/dist/devices/extractorHood.js.map +0 -1
  135. package/dist/devices/heatPump.d.ts +0 -47
  136. package/dist/devices/heatPump.d.ts.map +0 -1
  137. package/dist/devices/heatPump.js.map +0 -1
  138. package/dist/devices/laundryDryer.d.ts +0 -67
  139. package/dist/devices/laundryDryer.d.ts.map +0 -1
  140. package/dist/devices/laundryDryer.js.map +0 -1
  141. package/dist/devices/laundryWasher.d.ts +0 -81
  142. package/dist/devices/laundryWasher.d.ts.map +0 -1
  143. package/dist/devices/laundryWasher.js.map +0 -1
  144. package/dist/devices/microwaveOven.d.ts +0 -168
  145. package/dist/devices/microwaveOven.d.ts.map +0 -1
  146. package/dist/devices/microwaveOven.js.map +0 -1
  147. package/dist/devices/oven.d.ts +0 -105
  148. package/dist/devices/oven.d.ts.map +0 -1
  149. package/dist/devices/oven.js.map +0 -1
  150. package/dist/devices/refrigerator.d.ts +0 -118
  151. package/dist/devices/refrigerator.d.ts.map +0 -1
  152. package/dist/devices/refrigerator.js.map +0 -1
  153. package/dist/devices/roboticVacuumCleaner.d.ts +0 -112
  154. package/dist/devices/roboticVacuumCleaner.d.ts.map +0 -1
  155. package/dist/devices/roboticVacuumCleaner.js.map +0 -1
  156. package/dist/devices/solarPower.d.ts +0 -40
  157. package/dist/devices/solarPower.d.ts.map +0 -1
  158. package/dist/devices/solarPower.js.map +0 -1
  159. package/dist/devices/speaker.d.ts +0 -87
  160. package/dist/devices/speaker.d.ts.map +0 -1
  161. package/dist/devices/speaker.js.map +0 -1
  162. package/dist/devices/temperatureControl.d.ts +0 -166
  163. package/dist/devices/temperatureControl.d.ts.map +0 -1
  164. package/dist/devices/temperatureControl.js.map +0 -1
  165. package/dist/devices/waterHeater.d.ts +0 -111
  166. package/dist/devices/waterHeater.d.ts.map +0 -1
  167. package/dist/devices/waterHeater.js.map +0 -1
  168. package/dist/dgram/coap.d.ts +0 -205
  169. package/dist/dgram/coap.d.ts.map +0 -1
  170. package/dist/dgram/coap.js.map +0 -1
  171. package/dist/dgram/dgram.d.ts +0 -141
  172. package/dist/dgram/dgram.d.ts.map +0 -1
  173. package/dist/dgram/dgram.js.map +0 -1
  174. package/dist/dgram/mb_coap.d.ts +0 -24
  175. package/dist/dgram/mb_coap.d.ts.map +0 -1
  176. package/dist/dgram/mb_coap.js.map +0 -1
  177. package/dist/dgram/mb_mdns.d.ts +0 -24
  178. package/dist/dgram/mb_mdns.d.ts.map +0 -1
  179. package/dist/dgram/mb_mdns.js.map +0 -1
  180. package/dist/dgram/mdns.d.ts +0 -290
  181. package/dist/dgram/mdns.d.ts.map +0 -1
  182. package/dist/dgram/mdns.js.map +0 -1
  183. package/dist/dgram/multicast.d.ts +0 -67
  184. package/dist/dgram/multicast.d.ts.map +0 -1
  185. package/dist/dgram/multicast.js.map +0 -1
  186. package/dist/dgram/unicast.d.ts +0 -56
  187. package/dist/dgram/unicast.d.ts.map +0 -1
  188. package/dist/dgram/unicast.js.map +0 -1
  189. package/dist/frontend.d.ts +0 -238
  190. package/dist/frontend.d.ts.map +0 -1
  191. package/dist/frontend.js.map +0 -1
  192. package/dist/frontendTypes.d.ts +0 -529
  193. package/dist/frontendTypes.d.ts.map +0 -1
  194. package/dist/frontendTypes.js.map +0 -1
  195. package/dist/helpers.d.ts +0 -48
  196. package/dist/helpers.d.ts.map +0 -1
  197. package/dist/helpers.js.map +0 -1
  198. package/dist/index.d.ts +0 -34
  199. package/dist/index.d.ts.map +0 -1
  200. package/dist/index.js.map +0 -1
  201. package/dist/jestutils/export.d.ts +0 -2
  202. package/dist/jestutils/export.d.ts.map +0 -1
  203. package/dist/jestutils/export.js.map +0 -1
  204. package/dist/jestutils/jestHelpers.d.ts +0 -345
  205. package/dist/jestutils/jestHelpers.d.ts.map +0 -1
  206. package/dist/jestutils/jestHelpers.js.map +0 -1
  207. package/dist/logger/export.d.ts +0 -2
  208. package/dist/logger/export.d.ts.map +0 -1
  209. package/dist/logger/export.js.map +0 -1
  210. package/dist/matter/behaviors.d.ts +0 -2
  211. package/dist/matter/behaviors.d.ts.map +0 -1
  212. package/dist/matter/behaviors.js.map +0 -1
  213. package/dist/matter/clusters.d.ts +0 -2
  214. package/dist/matter/clusters.d.ts.map +0 -1
  215. package/dist/matter/clusters.js.map +0 -1
  216. package/dist/matter/devices.d.ts +0 -2
  217. package/dist/matter/devices.d.ts.map +0 -1
  218. package/dist/matter/devices.js.map +0 -1
  219. package/dist/matter/endpoints.d.ts +0 -2
  220. package/dist/matter/endpoints.d.ts.map +0 -1
  221. package/dist/matter/endpoints.js.map +0 -1
  222. package/dist/matter/export.d.ts +0 -5
  223. package/dist/matter/export.d.ts.map +0 -1
  224. package/dist/matter/export.js.map +0 -1
  225. package/dist/matter/types.d.ts +0 -3
  226. package/dist/matter/types.d.ts.map +0 -1
  227. package/dist/matter/types.js.map +0 -1
  228. package/dist/matterNode.d.ts +0 -342
  229. package/dist/matterNode.d.ts.map +0 -1
  230. package/dist/matterNode.js.map +0 -1
  231. package/dist/matterbridge.d.ts +0 -492
  232. package/dist/matterbridge.d.ts.map +0 -1
  233. package/dist/matterbridge.js.map +0 -1
  234. package/dist/matterbridgeAccessoryPlatform.d.ts +0 -41
  235. package/dist/matterbridgeAccessoryPlatform.d.ts.map +0 -1
  236. package/dist/matterbridgeAccessoryPlatform.js.map +0 -1
  237. package/dist/matterbridgeBehaviors.d.ts +0 -2404
  238. package/dist/matterbridgeBehaviors.d.ts.map +0 -1
  239. package/dist/matterbridgeBehaviors.js.map +0 -1
  240. package/dist/matterbridgeDeviceTypes.d.ts +0 -698
  241. package/dist/matterbridgeDeviceTypes.d.ts.map +0 -1
  242. package/dist/matterbridgeDeviceTypes.js.map +0 -1
  243. package/dist/matterbridgeDynamicPlatform.d.ts +0 -41
  244. package/dist/matterbridgeDynamicPlatform.d.ts.map +0 -1
  245. package/dist/matterbridgeDynamicPlatform.js.map +0 -1
  246. package/dist/matterbridgeEndpoint.d.ts +0 -1507
  247. package/dist/matterbridgeEndpoint.d.ts.map +0 -1
  248. package/dist/matterbridgeEndpoint.js.map +0 -1
  249. package/dist/matterbridgeEndpointHelpers.d.ts +0 -787
  250. package/dist/matterbridgeEndpointHelpers.d.ts.map +0 -1
  251. package/dist/matterbridgeEndpointHelpers.js.map +0 -1
  252. package/dist/matterbridgeEndpointTypes.d.ts +0 -166
  253. package/dist/matterbridgeEndpointTypes.d.ts.map +0 -1
  254. package/dist/matterbridgeEndpointTypes.js.map +0 -1
  255. package/dist/matterbridgePlatform.d.ts +0 -539
  256. package/dist/matterbridgePlatform.d.ts.map +0 -1
  257. package/dist/matterbridgePlatform.js.map +0 -1
  258. package/dist/matterbridgeTypes.d.ts +0 -251
  259. package/dist/matterbridgeTypes.d.ts.map +0 -1
  260. package/dist/matterbridgeTypes.js.map +0 -1
  261. package/dist/pluginManager.d.ts +0 -372
  262. package/dist/pluginManager.d.ts.map +0 -1
  263. package/dist/pluginManager.js.map +0 -1
  264. package/dist/shelly.d.ts +0 -181
  265. package/dist/shelly.d.ts.map +0 -1
  266. package/dist/shelly.js.map +0 -1
  267. package/dist/storage/export.d.ts +0 -2
  268. package/dist/storage/export.d.ts.map +0 -1
  269. package/dist/storage/export.js.map +0 -1
  270. package/dist/update.d.ts +0 -84
  271. package/dist/update.d.ts.map +0 -1
  272. package/dist/update.js.map +0 -1
  273. package/dist/utils/colorUtils.d.ts +0 -101
  274. package/dist/utils/colorUtils.d.ts.map +0 -1
  275. package/dist/utils/colorUtils.js.map +0 -1
  276. package/dist/utils/commandLine.d.ts +0 -66
  277. package/dist/utils/commandLine.d.ts.map +0 -1
  278. package/dist/utils/commandLine.js.map +0 -1
  279. package/dist/utils/copyDirectory.d.ts +0 -35
  280. package/dist/utils/copyDirectory.d.ts.map +0 -1
  281. package/dist/utils/copyDirectory.js.map +0 -1
  282. package/dist/utils/createDirectory.d.ts +0 -34
  283. package/dist/utils/createDirectory.d.ts.map +0 -1
  284. package/dist/utils/createDirectory.js.map +0 -1
  285. package/dist/utils/createZip.d.ts +0 -39
  286. package/dist/utils/createZip.d.ts.map +0 -1
  287. package/dist/utils/createZip.js.map +0 -1
  288. package/dist/utils/deepCopy.d.ts +0 -32
  289. package/dist/utils/deepCopy.d.ts.map +0 -1
  290. package/dist/utils/deepCopy.js.map +0 -1
  291. package/dist/utils/deepEqual.d.ts +0 -54
  292. package/dist/utils/deepEqual.d.ts.map +0 -1
  293. package/dist/utils/deepEqual.js.map +0 -1
  294. package/dist/utils/error.d.ts +0 -45
  295. package/dist/utils/error.d.ts.map +0 -1
  296. package/dist/utils/error.js.map +0 -1
  297. package/dist/utils/export.d.ts +0 -13
  298. package/dist/utils/export.d.ts.map +0 -1
  299. package/dist/utils/export.js.map +0 -1
  300. package/dist/utils/format.d.ts +0 -53
  301. package/dist/utils/format.d.ts.map +0 -1
  302. package/dist/utils/format.js.map +0 -1
  303. package/dist/utils/hex.d.ts +0 -89
  304. package/dist/utils/hex.d.ts.map +0 -1
  305. package/dist/utils/hex.js.map +0 -1
  306. package/dist/utils/inspector.d.ts +0 -87
  307. package/dist/utils/inspector.d.ts.map +0 -1
  308. package/dist/utils/inspector.js.map +0 -1
  309. package/dist/utils/isvalid.d.ts +0 -103
  310. package/dist/utils/isvalid.d.ts.map +0 -1
  311. package/dist/utils/isvalid.js.map +0 -1
  312. package/dist/utils/network.d.ts +0 -111
  313. package/dist/utils/network.d.ts.map +0 -1
  314. package/dist/utils/network.js.map +0 -1
  315. package/dist/utils/spawn.d.ts +0 -33
  316. package/dist/utils/spawn.d.ts.map +0 -1
  317. package/dist/utils/spawn.js.map +0 -1
  318. package/dist/utils/tracker.d.ts +0 -108
  319. package/dist/utils/tracker.d.ts.map +0 -1
  320. package/dist/utils/tracker.js.map +0 -1
  321. package/dist/utils/wait.d.ts +0 -54
  322. package/dist/utils/wait.d.ts.map +0 -1
  323. package/dist/utils/wait.js.map +0 -1
  324. package/dist/workerGlobalPrefix.d.ts +0 -25
  325. package/dist/workerGlobalPrefix.d.ts.map +0 -1
  326. package/dist/workerGlobalPrefix.js.map +0 -1
  327. package/dist/workerTypes.d.ts +0 -52
  328. package/dist/workerTypes.d.ts.map +0 -1
  329. package/dist/workerTypes.js.map +0 -1
  330. package/dist/workers.d.ts +0 -69
  331. package/dist/workers.d.ts.map +0 -1
  332. package/dist/workers.js.map +0 -1
@@ -1,34 +1,7 @@
1
- /**
2
- * @description This file contains the class Dgram.
3
- * @file dgram.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
- // Node.js imports
24
1
  import dgram from 'node:dgram';
25
2
  import EventEmitter from 'node:events';
26
3
  import os from 'node:os';
27
- // AnsiLogger imports
28
4
  import { AnsiLogger, BLUE, db, idn, nf, rs } from 'node-ansi-logger';
29
- /**
30
- * This class implements a dgram socket.
31
- */
32
5
  export class Dgram extends EventEmitter {
33
6
  log;
34
7
  socket;
@@ -37,18 +10,9 @@ export class Dgram extends EventEmitter {
37
10
  interfaceName;
38
11
  interfaceAddress;
39
12
  interfaceNetmask;
40
- /**
41
- * Creates an instance of Dgram.
42
- *
43
- * @param {string} name - The name of the socket.
44
- * @param {'udp4' | 'udp6'} socketType - The type of the socket (IPv4 or IPv6).
45
- * @param {boolean | undefined} reuseAddr - Whether to allow address reuse.
46
- * @param {string} [interfaceName] - The name of the network interface to bind to.
47
- * @param {string} [interfaceAddress] - The address of the network interface to bind to.
48
- */
49
13
  constructor(name, socketType, reuseAddr = true, interfaceName, interfaceAddress) {
50
14
  super();
51
- this.log = new AnsiLogger({ logName: name, logTimestampFormat: 4 /* TimestampFormat.TIME_MILLIS */, logLevel: "debug" /* LogLevel.DEBUG */ });
15
+ this.log = new AnsiLogger({ logName: name, logTimestampFormat: 4, logLevel: "debug" });
52
16
  this.socket = dgram.createSocket({ type: socketType, reuseAddr });
53
17
  this.socketType = socketType;
54
18
  this.interfaceName = interfaceName;
@@ -82,13 +46,6 @@ export class Dgram extends EventEmitter {
82
46
  this.onListening(address);
83
47
  });
84
48
  }
85
- /**
86
- * Sends a message to the specified server.
87
- *
88
- * @param {Buffer} msg - The message buffer to send.
89
- * @param {string} serverAddress - The IPv4 address of the destination server.
90
- * @param {number} serverPort - The port of the destination server.
91
- */
92
49
  send(msg, serverAddress, serverPort) {
93
50
  this.socket.send(msg, 0, msg.length, serverPort, serverAddress, (error) => {
94
51
  if (error) {
@@ -126,30 +83,18 @@ export class Dgram extends EventEmitter {
126
83
  this.log.info(`Socket ready on ${BLUE}${address.family}${nf} ${BLUE}${address.address}${nf}:${BLUE}${address.port}${nf}`);
127
84
  this.emit('ready', address);
128
85
  }
129
- /**
130
- * Retrieves the IPv4 address of the specified network interface or the first external IPv4 interface if no interface is specified.
131
- * Throws an error if no suitable interface or address is found.
132
- *
133
- * @param {string} networkInterface - The name of the network interface to retrieve the IPv4 address from. If not specified, the first external IPv4 interface will be used.
134
- * @returns {string | undefined} The IPv4 address of the specified network interface or the first external IPv4 interface.
135
- * @throws {Error} if no suitable interface or address is found.
136
- */
137
86
  getIpv4InterfaceAddress(networkInterface) {
138
- // Normalize the interface name: treat an empty string as undefined.
139
87
  if (networkInterface === '')
140
88
  networkInterface = undefined;
141
89
  const interfaces = os.networkInterfaces();
142
- // If a specific interface is provided but not found, warn and fall back.
143
90
  if (networkInterface && !interfaces[networkInterface]) {
144
91
  this.log.warn(`Interface "${networkInterface}" not found. Using first external IPv4 interface.`);
145
92
  networkInterface = undefined;
146
93
  }
147
- // If no interface was specified or the provided one doesn't exist, find the first external IPv4 interface.
148
94
  if (!networkInterface) {
149
95
  for (const [interfaceName, interfaceDetails] of Object.entries(interfaces)) {
150
96
  if (!interfaceDetails)
151
97
  continue;
152
- // Check if at least one external IPv4 address exists on this interface.
153
98
  for (const detail of interfaceDetails) {
154
99
  if (detail.family === 'IPv4' && !detail.internal) {
155
100
  networkInterface = interfaceName;
@@ -163,7 +108,6 @@ export class Dgram extends EventEmitter {
163
108
  if (!networkInterface) {
164
109
  throw new Error(`Didn't find an external IPv4 network interface`);
165
110
  }
166
- // Select the first external IPv4 address from the interface.
167
111
  const addresses = interfaces[networkInterface];
168
112
  const ipv4Address = addresses?.find((addr) => addr.family === 'IPv4' && !addr.internal);
169
113
  if (!ipv4Address) {
@@ -171,25 +115,14 @@ export class Dgram extends EventEmitter {
171
115
  }
172
116
  return ipv4Address.address;
173
117
  }
174
- /**
175
- * Retrieves the IPv6 address of the specified network interface or the first external IPv6 interface if no interface is specified.
176
- * Throws an error if no suitable interface or address is found.
177
- *
178
- * @param {string} [networkInterface] - The name of the network interface to retrieve the IPv6 address from. If not specified, the first external IPv6 interface will be used.
179
- * @returns {string | undefined} The IPv6 address of the specified network interface or the first external IPv6 interface.
180
- * @throws {Error} If no suitable interface or address is found.
181
- */
182
118
  getIpv6InterfaceAddress(networkInterface) {
183
- // Normalize the interface name: treat an empty string as undefined.
184
119
  if (networkInterface === '')
185
120
  networkInterface = undefined;
186
121
  const interfaces = os.networkInterfaces();
187
- // If a specific interface is provided, verify it exists. Otherwise, warn and use the first external IPv6 interface.
188
122
  if (networkInterface && !interfaces[networkInterface]) {
189
123
  this.log.warn(`Interface "${networkInterface}" not found. Using first external IPv6 interface.`);
190
124
  networkInterface = undefined;
191
125
  }
192
- // If no network interface was specified, search for the first external IPv6 interface.
193
126
  if (!networkInterface) {
194
127
  for (const [interfaceName, interfaceDetails] of Object.entries(interfaces)) {
195
128
  if (!interfaceDetails)
@@ -208,21 +141,18 @@ export class Dgram extends EventEmitter {
208
141
  throw new Error(`Didn't find an external IPv6 network interface`);
209
142
  }
210
143
  const addresses = interfaces[networkInterface];
211
- // Try to find a link-local address and use scopeid
212
144
  const linkLocalAddress = addresses?.find((addr) => addr.family === 'IPv6' && !addr.internal && addr.address.startsWith('fe80'));
213
145
  if (linkLocalAddress) {
214
146
  this.log.debug('Found IPv6 link-local address');
215
147
  return linkLocalAddress.scopeid ? `${linkLocalAddress.address}%${process.platform !== 'win32' ? networkInterface : linkLocalAddress.scopeid}` : linkLocalAddress.address;
216
148
  }
217
149
  this.log.debug('No IPv6 link-local address found');
218
- // Try to find a unique local address
219
150
  const ulaAddress = addresses?.find((addr) => addr.family === 'IPv6' && !addr.internal && addr.address.startsWith('fd') && addr.netmask === 'ffff:ffff:ffff:ffff::');
220
151
  if (ulaAddress) {
221
152
  this.log.debug('Found IPv6 Unique Local Addresses (ULA) unicast address');
222
153
  return ulaAddress.address;
223
154
  }
224
155
  this.log.debug('No IPv6 Unique Local Addresses (ULA) unicast address found');
225
- // Try to find a unique local address
226
156
  const uniqueLocalAddress = addresses?.find((addr) => addr.family === 'IPv6' && !addr.internal && addr.address.startsWith('fd'));
227
157
  if (uniqueLocalAddress) {
228
158
  this.log.debug('Found IPv6 Unique Local Addresses (ULA) address');
@@ -231,11 +161,6 @@ export class Dgram extends EventEmitter {
231
161
  this.log.debug('No IPv6 Unique Local Addresses (ULA) address found');
232
162
  throw new Error(`Interface ${networkInterface} does not have a suitable external IPv6 address`);
233
163
  }
234
- /**
235
- * Retrieves the names of all available network interfaces.
236
- *
237
- * @returns {string[]} An array of network interface names.
238
- */
239
164
  getInterfacesNames() {
240
165
  const interfaces = os.networkInterfaces();
241
166
  const interfaceNames = [];
@@ -246,12 +171,6 @@ export class Dgram extends EventEmitter {
246
171
  }
247
172
  return interfaceNames;
248
173
  }
249
- /**
250
- * Retrieves the scope ID of the first found IPv6 address on the specified network interface or on any interface if none is specified.
251
- *
252
- * @param {string} [interfaceName] - The name of the network interface. If not provided, the first found IPv6 address will be used.
253
- * @returns {string} The scope ID of the first found IPv6 address or an empty string.
254
- */
255
174
  getIpv6ScopeId(interfaceName) {
256
175
  const interfaces = os.networkInterfaces();
257
176
  for (const name in interfaces) {
@@ -261,24 +180,17 @@ export class Dgram extends EventEmitter {
261
180
  if (iface) {
262
181
  const ipv6Address = iface.find((addr) => addr.family === 'IPv6' && !addr.internal && addr.scopeid);
263
182
  if (ipv6Address) {
264
- return process.platform === 'win32' ? '%' + String(ipv6Address.scopeid) : '%' + name; // Use the scope ID for Windows, or the interface name for non-Windows platforms
183
+ return process.platform === 'win32' ? '%' + String(ipv6Address.scopeid) : '%' + name;
265
184
  }
266
185
  }
267
186
  }
268
187
  return '';
269
188
  }
270
- /**
271
- * Retrieves the interface name from the scope id of an IPv6 address.
272
- *
273
- * @param {number} scopeId - The scope id of the IPv6 address.
274
- * @returns {string | undefined} The interface name or undefined if not found.
275
- */
276
189
  getInterfaceNameFromScopeId(scopeId) {
277
190
  const nets = os.networkInterfaces();
278
191
  for (const ifaceName in nets) {
279
192
  const addresses = nets[ifaceName] || [];
280
193
  for (const addr of addresses) {
281
- // Check for IPv6 addresses with a matching scope id.
282
194
  if (addr.family === 'IPv6' && addr.scopeid === scopeId) {
283
195
  return ifaceName;
284
196
  }
@@ -286,16 +198,8 @@ export class Dgram extends EventEmitter {
286
198
  }
287
199
  return undefined;
288
200
  }
289
- /**
290
- * Retrieves the netmask of the specified interface address.
291
- *
292
- * @param {string} interfaceAddress - The interface address for which to retrieve the netmask.
293
- * @returns {string | undefined} The netmask of the specified interface address or undefined if not found.
294
- */
295
201
  getNetmask(interfaceAddress) {
296
- // Remove zone index if present (e.g. for IPv6 "fe80::1%eth0")
297
202
  const cleanedAddress = interfaceAddress.includes('%') ? interfaceAddress.split('%')[0] : interfaceAddress;
298
- // Iterate over all interfaces.
299
203
  const nets = os.networkInterfaces();
300
204
  for (const ifaceName in nets) {
301
205
  const ifaceAddresses = nets[ifaceName];
@@ -309,13 +213,6 @@ export class Dgram extends EventEmitter {
309
213
  }
310
214
  return undefined;
311
215
  }
312
- /**
313
- * Computes the broadcast address given an IPv4 address and netmask.
314
- *
315
- * @param {string | undefined} [ipAddress] - The IPv4 address e.g. "192.168.1.20"
316
- * @param {string | undefined} [netmask] - The IPv4 netmask e.g. "255.255.255.0"
317
- * @returns {string | undefined} The computed broadcast address, e.g. "192.168.1.255"
318
- */
319
216
  getIpv4BroadcastAddress(ipAddress, netmask) {
320
217
  if (!ipAddress || !netmask) {
321
218
  return undefined;
@@ -325,17 +222,9 @@ export class Dgram extends EventEmitter {
325
222
  const broadcastParts = ipParts.map((octet, i) => (octet & maskParts[i]) | (255 - maskParts[i]));
326
223
  return broadcastParts.join('.');
327
224
  }
328
- /**
329
- * Returns the broadcast IPv6 address.
330
- *
331
- * @returns {string} The broadcast IPv6 address, e.g. "ff02::1"
332
- */
333
225
  getIpv6BroadcastAddress() {
334
226
  return 'ff02::1';
335
227
  }
336
- /**
337
- * Logs all available network interfaces and their details.
338
- */
339
228
  listNetworkInterfaces() {
340
229
  const interfaces = os.networkInterfaces();
341
230
  for (const [name, addresses] of Object.entries(interfaces)) {
@@ -348,4 +237,3 @@ export class Dgram extends EventEmitter {
348
237
  }
349
238
  }
350
239
  }
351
- //# sourceMappingURL=dgram.js.map
@@ -1,65 +1,28 @@
1
- /**
2
- * @description This file contains the bin mb_coap for the class Coap.
3
- * @file src/dgram/mb_coap.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
- */
23
- // Net imports
24
1
  import { COAP_MULTICAST_IPV4_ADDRESS, COAP_MULTICAST_IPV6_ADDRESS, COAP_MULTICAST_PORT } from './multicast.js';
25
2
  import { Coap, COAP_OPTION_URI_PATH } from './coap.js';
26
- // istanbul ignore next
27
3
  {
28
4
  const coapIpv4 = new Coap('CoAP Server udp4', COAP_MULTICAST_IPV4_ADDRESS, COAP_MULTICAST_PORT, 'udp4', true);
29
5
  const coapIpv6 = new Coap('CoAP Server udp6', COAP_MULTICAST_IPV6_ADDRESS, COAP_MULTICAST_PORT, 'udp6', true);
30
6
  coapIpv4.listNetworkInterfaces();
31
- /**
32
- * Cleanup and log device information before exiting.
33
- */
34
7
  function cleanupAndLogAndExit() {
35
8
  if (process.argv.includes('--coap-udp4'))
36
9
  coapIpv4.stop();
37
10
  if (process.argv.includes('--coap-udp6'))
38
11
  coapIpv6.stop();
39
- // eslint-disable-next-line n/no-process-exit
40
12
  process.exit(0);
41
13
  }
42
- /**
43
- * Queries mDNS services over UDP IPv4 and sends a response for a specific service instance.
44
- * This function sends a query for Shelly, HTTP, and services, and responds with the appropriate PTR records.
45
- */
46
14
  const requestUdp4 = () => {
47
15
  coapIpv4.sendRequest(32000, [
48
16
  { number: COAP_OPTION_URI_PATH, value: Buffer.from('cit') },
49
17
  { number: COAP_OPTION_URI_PATH, value: Buffer.from('d') },
50
18
  ], {}, undefined, COAP_MULTICAST_IPV4_ADDRESS, COAP_MULTICAST_PORT);
51
19
  };
52
- /**
53
- * Queries mDNS services over UDP IPv4 and sends a response for a specific service instance.
54
- * This function sends a query for Shelly, HTTP, and services, and responds with the appropriate PTR records.
55
- */
56
20
  const requestUdp6 = () => {
57
21
  coapIpv6.sendRequest(32000, [
58
22
  { number: COAP_OPTION_URI_PATH, value: Buffer.from('cit') },
59
23
  { number: COAP_OPTION_URI_PATH, value: Buffer.from('d') },
60
24
  ], {}, undefined, COAP_MULTICAST_IPV6_ADDRESS, COAP_MULTICAST_PORT);
61
25
  };
62
- // Handle Ctrl+C (SIGINT) to stop and log devices
63
26
  process.on('SIGINT', () => {
64
27
  cleanupAndLogAndExit();
65
28
  });
@@ -67,7 +30,7 @@ import { Coap, COAP_OPTION_URI_PATH } from './coap.js';
67
30
  coapIpv4.on('ready', (address) => {
68
31
  coapIpv4.log.info(`coapIpv4 server ready on ${address.family} ${address.address}:${address.port}`);
69
32
  if (!process.argv.includes('--coap-request'))
70
- return; // Skip querying if --coap-request is not specified
33
+ return;
71
34
  requestUdp4();
72
35
  setInterval(() => {
73
36
  requestUdp4();
@@ -77,7 +40,7 @@ import { Coap, COAP_OPTION_URI_PATH } from './coap.js';
77
40
  coapIpv6.on('ready', (address) => {
78
41
  coapIpv6.log.info(`coapIpv6 server ready on ${address.family} ${address.address}:${address.port}`);
79
42
  if (!process.argv.includes('--coap-request'))
80
- return; // Skip querying if --coap-request is not specified
43
+ return;
81
44
  requestUdp6();
82
45
  setInterval(() => {
83
46
  requestUdp6();
@@ -85,6 +48,5 @@ import { Coap, COAP_OPTION_URI_PATH } from './coap.js';
85
48
  });
86
49
  setTimeout(() => {
87
50
  cleanupAndLogAndExit();
88
- }, 600000); // 10 minutes timeout to exit if no activity
51
+ }, 600000);
89
52
  }
90
- //# sourceMappingURL=mb_coap.js.map
@@ -1,34 +1,8 @@
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
- */
23
- // Matterbridge
24
1
  import { getParameter, getStringArrayParameter, hasParameter } from '../utils/commandLine.js';
25
- // Net imports
26
2
  import { MDNS_MULTICAST_IPV4_ADDRESS, MDNS_MULTICAST_IPV6_ADDRESS, MDNS_MULTICAST_PORT } from './multicast.js';
27
3
  import { Mdns } from './mdns.js';
28
- // istanbul ignore next
29
4
  {
30
5
  if (hasParameter('h') || hasParameter('help')) {
31
- // eslint-disable-next-line no-console
32
6
  console.log(`Usage: mb_mdns [options]
33
7
 
34
8
  Options:
@@ -56,18 +30,17 @@ Examples:
56
30
  # Query for mDNS devices every 10s on a specific interface
57
31
  mb_mdns --interfaceName eth0 --query
58
32
  `);
59
- // eslint-disable-next-line n/no-process-exit
60
33
  process.exit(0);
61
34
  }
62
35
  const 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'));
63
36
  const mdnsIpv6 = new Mdns('mDNS Server udp6', MDNS_MULTICAST_IPV6_ADDRESS, MDNS_MULTICAST_PORT, 'udp6', true, getParameter('interfaceName'), getParameter('ipv6InterfaceAddress') || '::', getParameter('outgoingIpv6InterfaceAddress'));
64
37
  if (hasParameter('v') || hasParameter('verbose')) {
65
- mdnsIpv4.log.logLevel = "debug" /* LogLevel.DEBUG */;
66
- mdnsIpv6.log.logLevel = "debug" /* LogLevel.DEBUG */;
38
+ mdnsIpv4.log.logLevel = "debug";
39
+ mdnsIpv6.log.logLevel = "debug";
67
40
  }
68
41
  else {
69
- mdnsIpv4.log.logLevel = "info" /* LogLevel.INFO */;
70
- mdnsIpv6.log.logLevel = "info" /* LogLevel.INFO */;
42
+ mdnsIpv4.log.logLevel = "info";
43
+ mdnsIpv6.log.logLevel = "info";
71
44
  }
72
45
  mdnsIpv4.listNetworkInterfaces();
73
46
  const filters = getStringArrayParameter('filter');
@@ -75,56 +48,37 @@ Examples:
75
48
  mdnsIpv4.filters.push(...filters);
76
49
  mdnsIpv6.filters.push(...filters);
77
50
  }
78
- /**
79
- * Cleanup and log device information before exiting.
80
- */
81
51
  function cleanupAndLogAndExit() {
82
52
  mdnsIpv4.stop();
83
53
  mdnsIpv6.stop();
84
54
  mdnsIpv4.logDevices();
85
55
  mdnsIpv6.logDevices();
86
- // eslint-disable-next-line n/no-process-exit
87
56
  process.exit(0);
88
57
  }
89
- /**
90
- * Queries mDNS services over UDP IPv4 and sends a response for a specific service instance.
91
- * This function sends a query for Shelly, HTTP, and services, and responds with the appropriate PTR records.
92
- */
93
58
  const queryUdp4 = () => {
94
59
  mdnsIpv4.sendQuery([
95
- { name: '_matter._tcp.local', type: 12 /* DnsRecordType.PTR */, class: 1 /* DnsClass.IN */, unicastResponse: false },
96
- { name: '_shelly._tcp.local', type: 12 /* DnsRecordType.PTR */, class: 1 /* DnsClass.IN */, unicastResponse: false },
97
- { name: '_http._tcp.local', type: 12 /* DnsRecordType.PTR */, class: 1 /* DnsClass.IN */, unicastResponse: false },
98
- { name: '_services._dns-sd._udp.local', type: 12 /* DnsRecordType.PTR */, class: 1 /* DnsClass.IN */, unicastResponse: false },
60
+ { name: '_matter._tcp.local', type: 12, class: 1, unicastResponse: false },
61
+ { name: '_shelly._tcp.local', type: 12, class: 1, unicastResponse: false },
62
+ { name: '_http._tcp.local', type: 12, class: 1, unicastResponse: false },
63
+ { name: '_services._dns-sd._udp.local', type: 12, class: 1, unicastResponse: false },
99
64
  ]);
100
65
  };
101
- /**
102
- * Sends an mDNS advertisement for the HTTP service over UDP IPv4.
103
- */
104
66
  const advertiseUdp4 = () => {
105
67
  const ptrRdata = mdnsIpv4.encodeDnsName('matterbridge._http._tcp.local');
106
- mdnsIpv4.sendResponse('_http._tcp.local', 12 /* DnsRecordType.PTR */, 1 /* DnsClass.IN */, 120, ptrRdata);
68
+ mdnsIpv4.sendResponse('_http._tcp.local', 12, 1, 120, ptrRdata);
107
69
  };
108
- /**
109
- * Queries mDNS services over UDP IPv6 and sends a response for a specific service instance.
110
- * This function sends a query for Shelly, HTTP, and services, and responds with the appropriate PTR records.
111
- */
112
70
  const queryUdp6 = () => {
113
71
  mdnsIpv6.sendQuery([
114
- { name: '_matter._tcp.local', type: 12 /* DnsRecordType.PTR */, class: 1 /* DnsClass.IN */, unicastResponse: true },
115
- { name: '_shelly._tcp.local', type: 12 /* DnsRecordType.PTR */, class: 1 /* DnsClass.IN */, unicastResponse: true },
116
- { name: '_http._tcp.local', type: 12 /* DnsRecordType.PTR */, class: 1 /* DnsClass.IN */, unicastResponse: true },
117
- { name: '_services._dns-sd._udp.local', type: 12 /* DnsRecordType.PTR */, class: 1 /* DnsClass.IN */, unicastResponse: true },
72
+ { name: '_matter._tcp.local', type: 12, class: 1, unicastResponse: true },
73
+ { name: '_shelly._tcp.local', type: 12, class: 1, unicastResponse: true },
74
+ { name: '_http._tcp.local', type: 12, class: 1, unicastResponse: true },
75
+ { name: '_services._dns-sd._udp.local', type: 12, class: 1, unicastResponse: true },
118
76
  ]);
119
77
  };
120
- /**
121
- * Sends an mDNS advertisement for the HTTP service over UDP IPv6.
122
- */
123
78
  const advertiseUdp6 = () => {
124
79
  const ptrRdata = mdnsIpv6.encodeDnsName('matterbridge._http._tcp.local');
125
- mdnsIpv6.sendResponse('_http._tcp.local', 12 /* DnsRecordType.PTR */, 1 /* DnsClass.IN */, 120, ptrRdata);
80
+ mdnsIpv6.sendResponse('_http._tcp.local', 12, 1, 120, ptrRdata);
126
81
  };
127
- // Handle Ctrl+C (SIGINT) to stop and log devices
128
82
  process.on('SIGINT', () => {
129
83
  cleanupAndLogAndExit();
130
84
  });
@@ -162,24 +116,5 @@ Examples:
162
116
  });
163
117
  setTimeout(() => {
164
118
  cleanupAndLogAndExit();
165
- }, 600000); // 10 minutes timeout to exit if no activity
119
+ }, 600000);
166
120
  }
167
- /*
168
- avahi-browse -pr _matterc._udp for advertise
169
- avahi-browse -pr _matter._tcp for query
170
-
171
- avahi-browse -pr _matterc._udp | sed 's/^/[commissioner] /' &
172
- avahi-browse -pr _matter._tcp | sed 's/^/[device] /' &
173
- wait
174
-
175
- for advertise
176
- sudo tcpdump -i eth0 -nn -s0 udp port 5353 | grep _matterc._udp
177
- for query
178
- sudo tcpdump -i eth0 -nn -s0 udp port 5353 | grep _matter._tcp
179
- for matterbridge
180
- sudo tcpdump -i eth0 -nn -s0 udp port 5353 | grep matterbridge._http._tcp.local
181
-
182
- Example (filter commissioner service on specific Wi-Fi interface):
183
- mb_mdns --interfaceName "Wi-Fi" --filter _matterc._udp
184
- */
185
- //# sourceMappingURL=mb_mdns.js.map