matterbridge 3.2.3 → 3.2.4-dev-20250828-cf98212

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 (267) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/dist/cli.js +2 -91
  3. package/dist/cliEmitter.js +0 -30
  4. package/dist/clusters/export.js +0 -2
  5. package/dist/defaultConfigSchema.js +0 -24
  6. package/dist/deviceManager.js +1 -94
  7. package/dist/devices/batteryStorage.js +1 -48
  8. package/dist/devices/cooktop.js +0 -55
  9. package/dist/devices/dishwasher.js +0 -57
  10. package/dist/devices/evse.js +10 -74
  11. package/dist/devices/export.js +0 -4
  12. package/dist/devices/extractorHood.js +0 -42
  13. package/dist/devices/heatPump.js +2 -50
  14. package/dist/devices/laundryDryer.js +3 -62
  15. package/dist/devices/laundryWasher.js +4 -70
  16. package/dist/devices/microwaveOven.js +5 -88
  17. package/dist/devices/oven.js +0 -85
  18. package/dist/devices/refrigerator.js +0 -80
  19. package/dist/devices/roboticVacuumCleaner.js +7 -93
  20. package/dist/devices/solarPower.js +0 -38
  21. package/dist/devices/temperatureControl.js +3 -25
  22. package/dist/devices/waterHeater.js +2 -82
  23. package/dist/dgram/coap.js +13 -126
  24. package/dist/dgram/dgram.js +2 -113
  25. package/dist/dgram/mb_coap.js +3 -41
  26. package/dist/dgram/mb_mdns.js +13 -51
  27. package/dist/dgram/mdns.js +137 -298
  28. package/dist/dgram/multicast.js +1 -60
  29. package/dist/dgram/unicast.js +0 -54
  30. package/dist/frontend.js +24 -451
  31. package/dist/globalMatterbridge.js +0 -47
  32. package/dist/helpers.js +0 -53
  33. package/dist/index.js +1 -30
  34. package/dist/logger/export.js +0 -1
  35. package/dist/matter/behaviors.js +0 -2
  36. package/dist/matter/clusters.js +0 -2
  37. package/dist/matter/devices.js +0 -2
  38. package/dist/matter/endpoints.js +0 -2
  39. package/dist/matter/export.js +0 -3
  40. package/dist/matter/types.js +0 -3
  41. package/dist/matterbridge.js +50 -789
  42. package/dist/matterbridgeAccessoryPlatform.js +0 -36
  43. package/dist/matterbridgeBehaviors.js +5 -65
  44. package/dist/matterbridgeDeviceTypes.js +15 -579
  45. package/dist/matterbridgeDynamicPlatform.js +0 -36
  46. package/dist/matterbridgeEndpoint.js +54 -1220
  47. package/dist/matterbridgeEndpointHelpers.js +12 -345
  48. package/dist/matterbridgePlatform.js +4 -250
  49. package/dist/matterbridgeTypes.js +0 -25
  50. package/dist/pluginManager.js +3 -249
  51. package/dist/shelly.js +7 -168
  52. package/dist/storage/export.js +0 -1
  53. package/dist/update.js +0 -69
  54. package/dist/utils/colorUtils.js +2 -97
  55. package/dist/utils/commandLine.js +0 -54
  56. package/dist/utils/copyDirectory.js +1 -38
  57. package/dist/utils/createDirectory.js +0 -33
  58. package/dist/utils/createZip.js +2 -47
  59. package/dist/utils/deepCopy.js +0 -39
  60. package/dist/utils/deepEqual.js +1 -72
  61. package/dist/utils/error.js +0 -41
  62. package/dist/utils/export.js +0 -1
  63. package/dist/utils/hex.js +0 -124
  64. package/dist/utils/isvalid.js +0 -101
  65. package/dist/utils/network.js +5 -91
  66. package/dist/utils/spawn.js +0 -40
  67. package/dist/utils/wait.js +8 -60
  68. package/npm-shrinkwrap.json +2 -2
  69. package/package.json +1 -2
  70. package/dist/cli.d.ts +0 -26
  71. package/dist/cli.d.ts.map +0 -1
  72. package/dist/cli.js.map +0 -1
  73. package/dist/cliEmitter.d.ts +0 -34
  74. package/dist/cliEmitter.d.ts.map +0 -1
  75. package/dist/cliEmitter.js.map +0 -1
  76. package/dist/clusters/export.d.ts +0 -2
  77. package/dist/clusters/export.d.ts.map +0 -1
  78. package/dist/clusters/export.js.map +0 -1
  79. package/dist/defaultConfigSchema.d.ts +0 -28
  80. package/dist/defaultConfigSchema.d.ts.map +0 -1
  81. package/dist/defaultConfigSchema.js.map +0 -1
  82. package/dist/deviceManager.d.ts +0 -112
  83. package/dist/deviceManager.d.ts.map +0 -1
  84. package/dist/deviceManager.js.map +0 -1
  85. package/dist/devices/batteryStorage.d.ts +0 -48
  86. package/dist/devices/batteryStorage.d.ts.map +0 -1
  87. package/dist/devices/batteryStorage.js.map +0 -1
  88. package/dist/devices/cooktop.d.ts +0 -60
  89. package/dist/devices/cooktop.d.ts.map +0 -1
  90. package/dist/devices/cooktop.js.map +0 -1
  91. package/dist/devices/dishwasher.d.ts +0 -71
  92. package/dist/devices/dishwasher.d.ts.map +0 -1
  93. package/dist/devices/dishwasher.js.map +0 -1
  94. package/dist/devices/evse.d.ts +0 -75
  95. package/dist/devices/evse.d.ts.map +0 -1
  96. package/dist/devices/evse.js.map +0 -1
  97. package/dist/devices/export.d.ts +0 -15
  98. package/dist/devices/export.d.ts.map +0 -1
  99. package/dist/devices/export.js.map +0 -1
  100. package/dist/devices/extractorHood.d.ts +0 -46
  101. package/dist/devices/extractorHood.d.ts.map +0 -1
  102. package/dist/devices/extractorHood.js.map +0 -1
  103. package/dist/devices/heatPump.d.ts +0 -47
  104. package/dist/devices/heatPump.d.ts.map +0 -1
  105. package/dist/devices/heatPump.js.map +0 -1
  106. package/dist/devices/laundryDryer.d.ts +0 -67
  107. package/dist/devices/laundryDryer.d.ts.map +0 -1
  108. package/dist/devices/laundryDryer.js.map +0 -1
  109. package/dist/devices/laundryWasher.d.ts +0 -81
  110. package/dist/devices/laundryWasher.d.ts.map +0 -1
  111. package/dist/devices/laundryWasher.js.map +0 -1
  112. package/dist/devices/microwaveOven.d.ts +0 -168
  113. package/dist/devices/microwaveOven.d.ts.map +0 -1
  114. package/dist/devices/microwaveOven.js.map +0 -1
  115. package/dist/devices/oven.d.ts +0 -105
  116. package/dist/devices/oven.d.ts.map +0 -1
  117. package/dist/devices/oven.js.map +0 -1
  118. package/dist/devices/refrigerator.d.ts +0 -93
  119. package/dist/devices/refrigerator.d.ts.map +0 -1
  120. package/dist/devices/refrigerator.js.map +0 -1
  121. package/dist/devices/roboticVacuumCleaner.d.ts +0 -112
  122. package/dist/devices/roboticVacuumCleaner.d.ts.map +0 -1
  123. package/dist/devices/roboticVacuumCleaner.js.map +0 -1
  124. package/dist/devices/solarPower.d.ts +0 -40
  125. package/dist/devices/solarPower.d.ts.map +0 -1
  126. package/dist/devices/solarPower.js.map +0 -1
  127. package/dist/devices/temperatureControl.d.ts +0 -166
  128. package/dist/devices/temperatureControl.d.ts.map +0 -1
  129. package/dist/devices/temperatureControl.js.map +0 -1
  130. package/dist/devices/waterHeater.d.ts +0 -111
  131. package/dist/devices/waterHeater.d.ts.map +0 -1
  132. package/dist/devices/waterHeater.js.map +0 -1
  133. package/dist/dgram/coap.d.ts +0 -205
  134. package/dist/dgram/coap.d.ts.map +0 -1
  135. package/dist/dgram/coap.js.map +0 -1
  136. package/dist/dgram/dgram.d.ts +0 -140
  137. package/dist/dgram/dgram.d.ts.map +0 -1
  138. package/dist/dgram/dgram.js.map +0 -1
  139. package/dist/dgram/mb_coap.d.ts +0 -24
  140. package/dist/dgram/mb_coap.d.ts.map +0 -1
  141. package/dist/dgram/mb_coap.js.map +0 -1
  142. package/dist/dgram/mb_mdns.d.ts +0 -24
  143. package/dist/dgram/mb_mdns.d.ts.map +0 -1
  144. package/dist/dgram/mb_mdns.js.map +0 -1
  145. package/dist/dgram/mdns.d.ts +0 -288
  146. package/dist/dgram/mdns.d.ts.map +0 -1
  147. package/dist/dgram/mdns.js.map +0 -1
  148. package/dist/dgram/multicast.d.ts +0 -65
  149. package/dist/dgram/multicast.d.ts.map +0 -1
  150. package/dist/dgram/multicast.js.map +0 -1
  151. package/dist/dgram/unicast.d.ts +0 -56
  152. package/dist/dgram/unicast.d.ts.map +0 -1
  153. package/dist/dgram/unicast.js.map +0 -1
  154. package/dist/frontend.d.ts +0 -313
  155. package/dist/frontend.d.ts.map +0 -1
  156. package/dist/frontend.js.map +0 -1
  157. package/dist/globalMatterbridge.d.ts +0 -59
  158. package/dist/globalMatterbridge.d.ts.map +0 -1
  159. package/dist/globalMatterbridge.js.map +0 -1
  160. package/dist/helpers.d.ts +0 -48
  161. package/dist/helpers.d.ts.map +0 -1
  162. package/dist/helpers.js.map +0 -1
  163. package/dist/index.d.ts +0 -33
  164. package/dist/index.d.ts.map +0 -1
  165. package/dist/index.js.map +0 -1
  166. package/dist/logger/export.d.ts +0 -2
  167. package/dist/logger/export.d.ts.map +0 -1
  168. package/dist/logger/export.js.map +0 -1
  169. package/dist/matter/behaviors.d.ts +0 -2
  170. package/dist/matter/behaviors.d.ts.map +0 -1
  171. package/dist/matter/behaviors.js.map +0 -1
  172. package/dist/matter/clusters.d.ts +0 -2
  173. package/dist/matter/clusters.d.ts.map +0 -1
  174. package/dist/matter/clusters.js.map +0 -1
  175. package/dist/matter/devices.d.ts +0 -2
  176. package/dist/matter/devices.d.ts.map +0 -1
  177. package/dist/matter/devices.js.map +0 -1
  178. package/dist/matter/endpoints.d.ts +0 -2
  179. package/dist/matter/endpoints.d.ts.map +0 -1
  180. package/dist/matter/endpoints.js.map +0 -1
  181. package/dist/matter/export.d.ts +0 -5
  182. package/dist/matter/export.d.ts.map +0 -1
  183. package/dist/matter/export.js.map +0 -1
  184. package/dist/matter/types.d.ts +0 -3
  185. package/dist/matter/types.d.ts.map +0 -1
  186. package/dist/matter/types.js.map +0 -1
  187. package/dist/matterbridge.d.ts +0 -462
  188. package/dist/matterbridge.d.ts.map +0 -1
  189. package/dist/matterbridge.js.map +0 -1
  190. package/dist/matterbridgeAccessoryPlatform.d.ts +0 -42
  191. package/dist/matterbridgeAccessoryPlatform.d.ts.map +0 -1
  192. package/dist/matterbridgeAccessoryPlatform.js.map +0 -1
  193. package/dist/matterbridgeBehaviors.d.ts +0 -1351
  194. package/dist/matterbridgeBehaviors.d.ts.map +0 -1
  195. package/dist/matterbridgeBehaviors.js.map +0 -1
  196. package/dist/matterbridgeDeviceTypes.d.ts +0 -709
  197. package/dist/matterbridgeDeviceTypes.d.ts.map +0 -1
  198. package/dist/matterbridgeDeviceTypes.js.map +0 -1
  199. package/dist/matterbridgeDynamicPlatform.d.ts +0 -42
  200. package/dist/matterbridgeDynamicPlatform.d.ts.map +0 -1
  201. package/dist/matterbridgeDynamicPlatform.js.map +0 -1
  202. package/dist/matterbridgeEndpoint.d.ts +0 -1356
  203. package/dist/matterbridgeEndpoint.d.ts.map +0 -1
  204. package/dist/matterbridgeEndpoint.js.map +0 -1
  205. package/dist/matterbridgeEndpointHelpers.d.ts +0 -407
  206. package/dist/matterbridgeEndpointHelpers.d.ts.map +0 -1
  207. package/dist/matterbridgeEndpointHelpers.js.map +0 -1
  208. package/dist/matterbridgePlatform.d.ts +0 -324
  209. package/dist/matterbridgePlatform.d.ts.map +0 -1
  210. package/dist/matterbridgePlatform.js.map +0 -1
  211. package/dist/matterbridgeTypes.d.ts +0 -198
  212. package/dist/matterbridgeTypes.d.ts.map +0 -1
  213. package/dist/matterbridgeTypes.js.map +0 -1
  214. package/dist/pluginManager.d.ts +0 -270
  215. package/dist/pluginManager.d.ts.map +0 -1
  216. package/dist/pluginManager.js.map +0 -1
  217. package/dist/shelly.d.ts +0 -174
  218. package/dist/shelly.d.ts.map +0 -1
  219. package/dist/shelly.js.map +0 -1
  220. package/dist/storage/export.d.ts +0 -2
  221. package/dist/storage/export.d.ts.map +0 -1
  222. package/dist/storage/export.js.map +0 -1
  223. package/dist/update.d.ts +0 -75
  224. package/dist/update.d.ts.map +0 -1
  225. package/dist/update.js.map +0 -1
  226. package/dist/utils/colorUtils.d.ts +0 -99
  227. package/dist/utils/colorUtils.d.ts.map +0 -1
  228. package/dist/utils/colorUtils.js.map +0 -1
  229. package/dist/utils/commandLine.d.ts +0 -59
  230. package/dist/utils/commandLine.d.ts.map +0 -1
  231. package/dist/utils/commandLine.js.map +0 -1
  232. package/dist/utils/copyDirectory.d.ts +0 -33
  233. package/dist/utils/copyDirectory.d.ts.map +0 -1
  234. package/dist/utils/copyDirectory.js.map +0 -1
  235. package/dist/utils/createDirectory.d.ts +0 -34
  236. package/dist/utils/createDirectory.d.ts.map +0 -1
  237. package/dist/utils/createDirectory.js.map +0 -1
  238. package/dist/utils/createZip.d.ts +0 -39
  239. package/dist/utils/createZip.d.ts.map +0 -1
  240. package/dist/utils/createZip.js.map +0 -1
  241. package/dist/utils/deepCopy.d.ts +0 -32
  242. package/dist/utils/deepCopy.d.ts.map +0 -1
  243. package/dist/utils/deepCopy.js.map +0 -1
  244. package/dist/utils/deepEqual.d.ts +0 -54
  245. package/dist/utils/deepEqual.d.ts.map +0 -1
  246. package/dist/utils/deepEqual.js.map +0 -1
  247. package/dist/utils/error.d.ts +0 -44
  248. package/dist/utils/error.d.ts.map +0 -1
  249. package/dist/utils/error.js.map +0 -1
  250. package/dist/utils/export.d.ts +0 -12
  251. package/dist/utils/export.d.ts.map +0 -1
  252. package/dist/utils/export.js.map +0 -1
  253. package/dist/utils/hex.d.ts +0 -89
  254. package/dist/utils/hex.d.ts.map +0 -1
  255. package/dist/utils/hex.js.map +0 -1
  256. package/dist/utils/isvalid.d.ts +0 -103
  257. package/dist/utils/isvalid.d.ts.map +0 -1
  258. package/dist/utils/isvalid.js.map +0 -1
  259. package/dist/utils/network.d.ts +0 -84
  260. package/dist/utils/network.d.ts.map +0 -1
  261. package/dist/utils/network.js.map +0 -1
  262. package/dist/utils/spawn.d.ts +0 -33
  263. package/dist/utils/spawn.d.ts.map +0 -1
  264. package/dist/utils/spawn.js.map +0 -1
  265. package/dist/utils/wait.d.ts +0 -54
  266. package/dist/utils/wait.d.ts.map +0 -1
  267. package/dist/utils/wait.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,11 +171,6 @@ export class Dgram extends EventEmitter {
246
171
  }
247
172
  return interfaceNames;
248
173
  }
249
- /**
250
- * Retrieves the scope ID for all interfaces address '::'.
251
- *
252
- * @returns {string} The scope ID of the first found IPv6 address or an empty string.
253
- */
254
174
  getIpv6ScopeIdForAllInterfacesAddress() {
255
175
  const interfaces = os.networkInterfaces();
256
176
  for (const name in interfaces) {
@@ -258,24 +178,17 @@ export class Dgram extends EventEmitter {
258
178
  if (iface) {
259
179
  const ipv6Address = iface.find((addr) => addr.family === 'IPv6' && !addr.internal && addr.scopeid);
260
180
  if (ipv6Address) {
261
- return process.platform === 'win32' ? '%' + String(ipv6Address.scopeid) : '%' + name; // Use the scope ID for Windows, or the interface name for non-Windows platforms
181
+ return process.platform === 'win32' ? '%' + String(ipv6Address.scopeid) : '%' + name;
262
182
  }
263
183
  }
264
184
  }
265
185
  return '';
266
186
  }
267
- /**
268
- * Retrieves the interface name from the scope id of an IPv6 address.
269
- *
270
- * @param {number} scopeId - The scope id of the IPv6 address.
271
- * @returns {string | undefined} The interface name or undefined if not found.
272
- */
273
187
  getInterfaceNameFromScopeId(scopeId) {
274
188
  const nets = os.networkInterfaces();
275
189
  for (const ifaceName in nets) {
276
190
  const addresses = nets[ifaceName] || [];
277
191
  for (const addr of addresses) {
278
- // Check for IPv6 addresses with a matching scope id.
279
192
  if (addr.family === 'IPv6' && addr.scopeid === scopeId) {
280
193
  return ifaceName;
281
194
  }
@@ -283,16 +196,8 @@ export class Dgram extends EventEmitter {
283
196
  }
284
197
  return undefined;
285
198
  }
286
- /**
287
- * Retrieves the netmask of the specified interface address.
288
- *
289
- * @param {string} interfaceAddress - The interface address for which to retrieve the netmask.
290
- * @returns {string | undefined} The netmask of the specified interface address or undefined if not found.
291
- */
292
199
  getNetmask(interfaceAddress) {
293
- // Remove zone index if present (e.g. for IPv6 "fe80::1%eth0")
294
200
  const cleanedAddress = interfaceAddress.includes('%') ? interfaceAddress.split('%')[0] : interfaceAddress;
295
- // Iterate over all interfaces.
296
201
  const nets = os.networkInterfaces();
297
202
  for (const ifaceName in nets) {
298
203
  const ifaceAddresses = nets[ifaceName];
@@ -306,13 +211,6 @@ export class Dgram extends EventEmitter {
306
211
  }
307
212
  return undefined;
308
213
  }
309
- /**
310
- * Computes the broadcast address given an IPv4 address and netmask.
311
- *
312
- * @param {string | undefined} [ipAddress] - The IPv4 address e.g. "192.168.1.20"
313
- * @param {string | undefined} [netmask] - The IPv4 netmask e.g. "255.255.255.0"
314
- * @returns {string | undefined} The computed broadcast address, e.g. "192.168.1.255"
315
- */
316
214
  getIpv4BroadcastAddress(ipAddress, netmask) {
317
215
  if (!ipAddress || !netmask) {
318
216
  return undefined;
@@ -322,17 +220,9 @@ export class Dgram extends EventEmitter {
322
220
  const broadcastParts = ipParts.map((octet, i) => (octet & maskParts[i]) | (255 - maskParts[i]));
323
221
  return broadcastParts.join('.');
324
222
  }
325
- /**
326
- * Returns the broadcast IPv6 address.
327
- *
328
- * @returns {string} The broadcast IPv6 address, e.g. "ff02::1"
329
- */
330
223
  getIpv6BroadcastAddress() {
331
224
  return 'ff02::1';
332
225
  }
333
- /**
334
- * Logs all available network interfaces and their details.
335
- */
336
226
  listNetworkInterfaces() {
337
227
  const interfaces = os.networkInterfaces();
338
228
  for (const [name, addresses] of Object.entries(interfaces)) {
@@ -345,4 +235,3 @@ export class Dgram extends EventEmitter {
345
235
  }
346
236
  }
347
237
  }
348
- //# 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,73 +1,36 @@
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
- // Net imports
24
1
  import { MDNS_MULTICAST_IPV4_ADDRESS, MDNS_MULTICAST_IPV6_ADDRESS, MDNS_MULTICAST_PORT } from './multicast.js';
25
2
  import { Mdns } from './mdns.js';
26
- // istanbul ignore next
27
3
  {
28
4
  const mdnsIpv4 = new Mdns('mDNS Server udp4', MDNS_MULTICAST_IPV4_ADDRESS, MDNS_MULTICAST_PORT, 'udp4', true, undefined, '0.0.0.0');
29
5
  const mdnsIpv6 = new Mdns('mDNS Server udp6', MDNS_MULTICAST_IPV6_ADDRESS, MDNS_MULTICAST_PORT, 'udp6', true, undefined, '::');
30
6
  mdnsIpv4.listNetworkInterfaces();
31
- /**
32
- * Cleanup and log device information before exiting.
33
- */
34
7
  function cleanupAndLogAndExit() {
35
8
  mdnsIpv4.stop();
36
9
  mdnsIpv6.stop();
37
10
  mdnsIpv4.logDevices();
38
11
  mdnsIpv6.logDevices();
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 queryUdp4 = () => {
47
15
  mdnsIpv4.sendQuery([
48
- { name: '_matter._tcp.local', type: 12 /* DnsRecordType.PTR */, class: 1 /* DnsClass.IN */, unicastResponse: false },
49
- { name: '_shelly._tcp.local', type: 12 /* DnsRecordType.PTR */, class: 1 /* DnsClass.IN */, unicastResponse: false },
50
- { name: '_http._tcp.local', type: 12 /* DnsRecordType.PTR */, class: 1 /* DnsClass.IN */, unicastResponse: false },
51
- { name: '_services._dns-sd._udp.local', type: 12 /* DnsRecordType.PTR */, class: 1 /* DnsClass.IN */, unicastResponse: false },
16
+ { name: '_matter._tcp.local', type: 12, class: 1, unicastResponse: false },
17
+ { name: '_shelly._tcp.local', type: 12, class: 1, unicastResponse: false },
18
+ { name: '_http._tcp.local', type: 12, class: 1, unicastResponse: false },
19
+ { name: '_services._dns-sd._udp.local', type: 12, class: 1, unicastResponse: false },
52
20
  ]);
53
21
  const ptrRdata = mdnsIpv4.encodeDnsName('matterbridge._http._tcp.local');
54
- mdnsIpv4.sendResponse('_http._tcp.local', 12 /* DnsRecordType.PTR */, 1 /* DnsClass.IN */, 120, ptrRdata);
22
+ mdnsIpv4.sendResponse('_http._tcp.local', 12, 1, 120, ptrRdata);
55
23
  };
56
- /**
57
- * Queries mDNS services over UDP IPv6 and sends a response for a specific service instance.
58
- * This function sends a query for Shelly, HTTP, and services, and responds with the appropriate PTR records.
59
- */
60
24
  const queryUdp6 = () => {
61
25
  mdnsIpv6.sendQuery([
62
- { name: '_matter._tcp.local', type: 12 /* DnsRecordType.PTR */, class: 1 /* DnsClass.IN */, unicastResponse: true },
63
- { name: '_shelly._tcp.local', type: 12 /* DnsRecordType.PTR */, class: 1 /* DnsClass.IN */, unicastResponse: true },
64
- { name: '_http._tcp.local', type: 12 /* DnsRecordType.PTR */, class: 1 /* DnsClass.IN */, unicastResponse: true },
65
- { name: '_services._dns-sd._udp.local', type: 12 /* DnsRecordType.PTR */, class: 1 /* DnsClass.IN */, unicastResponse: true },
26
+ { name: '_matter._tcp.local', type: 12, class: 1, unicastResponse: true },
27
+ { name: '_shelly._tcp.local', type: 12, class: 1, unicastResponse: true },
28
+ { name: '_http._tcp.local', type: 12, class: 1, unicastResponse: true },
29
+ { name: '_services._dns-sd._udp.local', type: 12, class: 1, unicastResponse: true },
66
30
  ]);
67
31
  const ptrRdata = mdnsIpv6.encodeDnsName('matterbridge._http._tcp.local');
68
- mdnsIpv6.sendResponse('_http._tcp.local', 12 /* DnsRecordType.PTR */, 1 /* DnsClass.IN */, 120, ptrRdata);
32
+ mdnsIpv6.sendResponse('_http._tcp.local', 12, 1, 120, ptrRdata);
69
33
  };
70
- // Handle Ctrl+C (SIGINT) to stop and log devices
71
34
  process.on('SIGINT', () => {
72
35
  cleanupAndLogAndExit();
73
36
  });
@@ -75,7 +38,7 @@ import { Mdns } from './mdns.js';
75
38
  mdnsIpv4.on('ready', (address) => {
76
39
  mdnsIpv4.log.info(`mdnsIpv4 server ready on ${address.family} ${address.address}:${address.port}`);
77
40
  if (!process.argv.includes('--query'))
78
- return; // Skip querying if --query is not specified
41
+ return;
79
42
  queryUdp4();
80
43
  setInterval(() => {
81
44
  queryUdp4();
@@ -85,7 +48,7 @@ import { Mdns } from './mdns.js';
85
48
  mdnsIpv6.on('ready', (address) => {
86
49
  mdnsIpv6.log.info(`mdnsIpv6 server ready on ${address.family} ${address.address}:${address.port}`);
87
50
  if (!process.argv.includes('--query'))
88
- return; // Skip querying if --query is not specified
51
+ return;
89
52
  queryUdp6();
90
53
  setInterval(() => {
91
54
  queryUdp6();
@@ -93,6 +56,5 @@ import { Mdns } from './mdns.js';
93
56
  });
94
57
  setTimeout(() => {
95
58
  cleanupAndLogAndExit();
96
- }, 600000); // 10 minutes timeout to exit if no activity
59
+ }, 600000);
97
60
  }
98
- //# sourceMappingURL=mb_mdns.js.map