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 +3 -0
- package/dist/dgram/mb_mdns.js +88 -14
- package/npm-shrinkwrap.json +2 -2
- package/package.json +1 -1
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
|
|
package/dist/dgram/mb_mdns.js
CHANGED
|
@@ -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
|
|
37
|
-
mb_mdns --advertise 5000 --filter
|
|
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(
|
|
135
|
-
mdns.socket.send(response, 0, response.length,
|
|
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(
|
|
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
|
}
|
package/npm-shrinkwrap.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "matterbridge",
|
|
3
|
-
"version": "3.4.5-dev-
|
|
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-
|
|
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