matterbridge 3.4.5-dev-20251224-ea793b4 → 3.4.5-dev-20251225-2f72161

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.
package/CHANGELOG.md CHANGED
@@ -39,6 +39,9 @@ Advantages:
39
39
  - [mdns]: Added TXT/SRV/A/AAAA encoders into the Mdns class.
40
40
  - [mb_mdns]: Added broadcast parameter to allow advertising when multicast is not available.
41
41
  - [mb_mdns]: Added \_matterbridge.\_tcp.local to query and advertise.
42
+ - [mb_mdns]: Added localhost parameter to send unicast messages to localhost.
43
+ - [mb_mdns]: Added unicastIpv4 parameter to send unicast messages.
44
+ - [mb_mdns]: Added unicastIpv6 parameter to send unicast messages.
42
45
 
43
46
  ### Changed
44
47
 
@@ -1,6 +1,7 @@
1
1
  import { getIntParameter, getParameter, getStringArrayParameter, hasParameter } from '../utils/commandLine.js';
2
2
  import { MDNS_MULTICAST_IPV4_ADDRESS, MDNS_MULTICAST_IPV6_ADDRESS, MDNS_MULTICAST_PORT } from './multicast.js';
3
3
  import { Mdns } from './mdns.js';
4
+ import { Unicast } from './unicast.js';
4
5
  {
5
6
  if (hasParameter('h') || hasParameter('help')) {
6
7
  console.log(`Copyright (c) Matterbridge. All rights reserved.\n`);
@@ -15,6 +16,10 @@ Options:
15
16
  --ipv6InterfaceAddress <address> IPv6 address of the network interface to bind to (default: ::).
16
17
  --outgoingIpv4InterfaceAddress <address> Outgoing IPv4 address of the network interface (default first external address).
17
18
  --outgoingIpv6InterfaceAddress <address> Outgoing IPv6 address of the network interface (default first external address).
19
+ --unicastIpv4 <address> Unicast IPv4 address to send mDNS advertisements to (default: disabled).
20
+ --unicastIpv6 <address> Unicast IPv6 address to send mDNS advertisements to (default: disabled).
21
+ --broadcast Enable broadcasting of mDNS advertisements (default: disabled).
22
+ --localhost Enable sending mDNS advertisements to localhost (default: disabled).
18
23
  --advertise <interval> Enable matterbridge mDNS advertisement each ms (default interval: 10000ms).
19
24
  --query <interval> Enable common mDNS services query each ms (default interval: 10000ms).
20
25
  --filter <string...> Filter strings to match in the mDNS record name (default: no filter).
@@ -33,25 +38,31 @@ Examples:
33
38
  # Query for mDNS devices every 10s on a specific interface
34
39
  mb_mdns --interfaceName eth0 --query
35
40
 
36
- # Advertise matterbridge._http._tcp.local every 5s with filter
37
- mb_mdns --advertise 5000 --filter matterbridge._http._tcp.local
38
-
39
- # Query each 5s and listen for matterbridge._http._tcp.local service records
40
- mb_mdns --query 5000 --filter matterbridge._http._tcp.local
41
+ # Advertise _matterbridge._tcp.local every 5s with filter
42
+ mb_mdns --advertise 5000 --filter _matterbridge._tcp.local
41
43
 
44
+ # Query each 5s and listen for _matterbridge._tcp.local service records
45
+ mb_mdns --query 5000 --filter _matterbridge._tcp.local
42
46
  `);
43
47
  process.exit(0);
44
48
  }
45
49
  const { default: pkg } = await import('../../package.json', { with: { type: 'json' } });
50
+ let mdnsIpv4QueryInterval;
51
+ let mdnsIpv6QueryInterval;
52
+ let mdnsIpv4AdvertiseInterval;
53
+ let mdnsIpv6AdvertiseInterval;
46
54
  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'));
47
55
  const mdnsIpv6 = new Mdns('mDNS Server udp6', MDNS_MULTICAST_IPV6_ADDRESS, MDNS_MULTICAST_PORT, 'udp6', true, getParameter('interfaceName'), getParameter('ipv6InterfaceAddress') || '::', getParameter('outgoingIpv6InterfaceAddress'));
56
+ const unicast = new Unicast('mDNS Unicast Server', 'udp4', true, undefined, 'localhost', MDNS_MULTICAST_PORT);
48
57
  if (hasParameter('v') || hasParameter('verbose')) {
49
58
  mdnsIpv4.log.logLevel = "debug";
50
59
  mdnsIpv6.log.logLevel = "debug";
60
+ unicast.log.logLevel = "debug";
51
61
  }
52
62
  else {
53
63
  mdnsIpv4.log.logLevel = "info";
54
64
  mdnsIpv6.log.logLevel = "info";
65
+ unicast.log.logLevel = "info";
55
66
  }
56
67
  mdnsIpv4.listNetworkInterfaces();
57
68
  const filters = getStringArrayParameter('filter');
@@ -65,8 +76,13 @@ Examples:
65
76
  advertise(mdnsIpv6, 0);
66
77
  }
67
78
  await new Promise((resolve) => setTimeout(resolve, 250));
79
+ clearInterval(mdnsIpv4QueryInterval);
80
+ clearInterval(mdnsIpv6QueryInterval);
81
+ clearInterval(mdnsIpv4AdvertiseInterval);
82
+ clearInterval(mdnsIpv6AdvertiseInterval);
68
83
  mdnsIpv4.stop();
69
84
  mdnsIpv6.stop();
85
+ unicast.stop();
70
86
  await new Promise((resolve) => setTimeout(resolve, 250));
71
87
  mdnsIpv4.logDevices();
72
88
  mdnsIpv6.logDevices();
@@ -79,6 +95,7 @@ Examples:
79
95
  { name: '_matter._tcp.local', type: 12, class: 1, unicastResponse: true },
80
96
  { name: '_matterbridge._tcp.local', type: 12, class: 1, unicastResponse: true },
81
97
  { name: '_shelly._tcp.local', type: 12, class: 1, unicastResponse: true },
98
+ { name: '_mqtt._tcp.local', type: 12, class: 1, unicastResponse: true },
82
99
  { name: '_http._tcp.local', type: 12, class: 1, unicastResponse: true },
83
100
  { name: '_services._dns-sd._udp.local', type: 12, class: 1, unicastResponse: true },
84
101
  ]);
@@ -131,13 +148,13 @@ Examples:
131
148
  const address = mdns.socketType === 'udp4' ? mdns.getIpv4InterfaceAddress(mdns.interfaceName) : mdns.getIpv6InterfaceAddress(mdns.interfaceName);
132
149
  const mask = mdns.socketType === 'udp4' ? mdns.getNetmask(address) : undefined;
133
150
  const broadcastAddress = mdns.socketType === 'udp4' ? mdns.getIpv4BroadcastAddress(address, mask) : mdns.getIpv6BroadcastAddress();
134
- mdns.log.info(`Broadcasting mDNS advertisement for matterbridge service to ${broadcastAddress}...`);
135
- mdns.socket.send(response, 0, response.length, mdns.multicastPort, broadcastAddress, (error) => {
151
+ mdns.log.info(`***Broadcasting mDNS advertisement for matterbridge service to ${broadcastAddress}...`);
152
+ mdns.socket.send(response, 0, response.length, MDNS_MULTICAST_PORT, broadcastAddress, (error) => {
136
153
  if (error) {
137
- mdns.log.error(`Error broadcasting mDNS advertisement: ${error.message}`);
154
+ mdns.log.error(`Error broadcasting mDNS advertisement to ${broadcastAddress}: ${error.message}`);
138
155
  }
139
156
  else {
140
- mdns.log.info(`mDNS advertisement broadcasted successfully to ${broadcastAddress}`);
157
+ mdns.log.info(`**mDNS advertisement broadcasted successfully to ${broadcastAddress}`);
141
158
  }
142
159
  });
143
160
  }
@@ -145,6 +162,56 @@ Examples:
145
162
  mdns.log.error(`Error broadcasting mDNS advertisement: ${error.message}`);
146
163
  }
147
164
  }
165
+ if (mdns.socketType === 'udp4' && hasParameter('localhost')) {
166
+ try {
167
+ mdns.log.info(`**Sending mDNS advertisement for matterbridge service to localhost...`);
168
+ mdns.socket.send(response, 0, response.length, MDNS_MULTICAST_PORT, 'localhost', (error) => {
169
+ if (error) {
170
+ mdns.log.error(`**Error sending mDNS advertisement to localhost: ${error.message}`);
171
+ }
172
+ else {
173
+ mdns.log.info(`**mDNS advertisement sent successfully to localhost`);
174
+ }
175
+ });
176
+ }
177
+ catch (error) {
178
+ mdns.log.error(`**Error sending mDNS advertisement to localhost: ${error.message}`);
179
+ }
180
+ }
181
+ if (mdns.socketType === 'udp4' && getParameter('unicastIpv4')) {
182
+ const unicastAddress = getParameter('unicastIpv4');
183
+ try {
184
+ mdns.log.info(`**Sending mDNS advertisement for matterbridge service to unicast ${unicastAddress}...`);
185
+ mdns.socket.send(response, 0, response.length, MDNS_MULTICAST_PORT, unicastAddress, (error) => {
186
+ if (error) {
187
+ mdns.log.error(`Error sending mDNS advertisement to unicast ${unicastAddress}: ${error.message}`);
188
+ }
189
+ else {
190
+ mdns.log.info(`**mDNS advertisement sent successfully to unicast ${unicastAddress}`);
191
+ }
192
+ });
193
+ }
194
+ catch (error) {
195
+ mdns.log.error(`Error sending mDNS advertisement to unicast ${unicastAddress}: ${error.message}`);
196
+ }
197
+ }
198
+ if (mdns.socketType === 'udp6' && getParameter('unicastIpv6')) {
199
+ const unicastAddress = getParameter('unicastIpv6');
200
+ try {
201
+ mdns.log.info(`**Sending mDNS advertisement for matterbridge service to unicast ${unicastAddress}...`);
202
+ mdns.socket.send(response, 0, response.length, MDNS_MULTICAST_PORT, unicastAddress, (error) => {
203
+ if (error) {
204
+ mdns.log.error(`Error sending mDNS advertisement to unicast ${unicastAddress}: ${error.message}`);
205
+ }
206
+ else {
207
+ mdns.log.info(`**mDNS advertisement sent successfully to unicast ${unicastAddress}`);
208
+ }
209
+ });
210
+ }
211
+ catch (error) {
212
+ mdns.log.error(`Error sending mDNS advertisement to unicast ${unicastAddress}: ${error.message}`);
213
+ }
214
+ }
148
215
  };
149
216
  process.on('SIGINT', async () => {
150
217
  await cleanupAndLogAndExit();
@@ -154,13 +221,13 @@ Examples:
154
221
  mdnsIpv4.log.info(`mdnsIpv4 server ready on ${address.family} ${address.address}:${address.port}`);
155
222
  if (hasParameter('advertise')) {
156
223
  advertise(mdnsIpv4);
157
- setInterval(() => {
224
+ mdnsIpv4AdvertiseInterval = setInterval(() => {
158
225
  advertise(mdnsIpv4);
159
226
  }, getIntParameter('advertise') || 10000).unref();
160
227
  }
161
228
  if (hasParameter('query')) {
162
229
  query(mdnsIpv4);
163
- setInterval(() => {
230
+ mdnsIpv4QueryInterval = setInterval(() => {
164
231
  query(mdnsIpv4);
165
232
  }, getIntParameter('query') || 10000).unref();
166
233
  }
@@ -170,18 +237,25 @@ Examples:
170
237
  mdnsIpv6.log.info(`mdnsIpv6 server ready on ${address.family} ${address.address}:${address.port}`);
171
238
  if (hasParameter('advertise')) {
172
239
  advertise(mdnsIpv6);
173
- setInterval(() => {
240
+ mdnsIpv6AdvertiseInterval = setInterval(() => {
174
241
  advertise(mdnsIpv6);
175
242
  }, getIntParameter('advertise') || 10000).unref();
176
243
  }
177
244
  if (hasParameter('query')) {
178
245
  query(mdnsIpv6);
179
- setInterval(() => {
246
+ mdnsIpv6QueryInterval = setInterval(() => {
180
247
  query(mdnsIpv6);
181
248
  }, getIntParameter('query') || 10000).unref();
182
249
  }
183
250
  });
251
+ unicast.start();
252
+ unicast.on('ready', (address) => {
253
+ unicast.log.info(`**Ready on ${address.family} ${address.address}:${address.port}`);
254
+ });
255
+ unicast.on('message', (msg, rinfo) => {
256
+ unicast.log.info(`**Received message from ${rinfo.address}:${rinfo.port} - ${msg.length} bytes`);
257
+ });
184
258
  setTimeout(async () => {
185
259
  await cleanupAndLogAndExit();
186
- }, 600000);
260
+ }, 600000).unref();
187
261
  }
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "matterbridge",
3
- "version": "3.4.5-dev-20251224-ea793b4",
3
+ "version": "3.4.5-dev-20251225-2f72161",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "matterbridge",
9
- "version": "3.4.5-dev-20251224-ea793b4",
9
+ "version": "3.4.5-dev-20251225-2f72161",
10
10
  "license": "Apache-2.0",
11
11
  "dependencies": {
12
12
  "@matter/main": "0.15.6",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "matterbridge",
3
- "version": "3.4.5-dev-20251224-ea793b4",
3
+ "version": "3.4.5-dev-20251225-2f72161",
4
4
  "description": "Matterbridge plugin manager for Matter",
5
5
  "author": "https://github.com/Luligu",
6
6
  "license": "Apache-2.0",