matterbridge 3.4.6 → 3.4.7-dev-20260103-3152357
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 +14 -0
- package/README-DOCKER.md +8 -0
- package/dist/broadcastServer.js +0 -117
- package/dist/broadcastServerTypes.js +0 -24
- package/dist/cli.js +1 -97
- package/dist/cliEmitter.js +0 -37
- package/dist/cliHistory.js +0 -38
- package/dist/clusters/export.js +0 -2
- package/dist/deviceManager.js +1 -113
- package/dist/devices/airConditioner.js +0 -57
- package/dist/devices/batteryStorage.js +1 -48
- package/dist/devices/cooktop.js +0 -56
- package/dist/devices/dishwasher.js +0 -57
- package/dist/devices/evse.js +10 -74
- package/dist/devices/export.js +0 -5
- package/dist/devices/extractorHood.js +0 -43
- package/dist/devices/heatPump.js +2 -50
- package/dist/devices/laundryDryer.js +3 -62
- package/dist/devices/laundryWasher.js +4 -70
- package/dist/devices/microwaveOven.js +5 -88
- package/dist/devices/oven.js +0 -85
- package/dist/devices/refrigerator.js +0 -102
- package/dist/devices/roboticVacuumCleaner.js +9 -100
- package/dist/devices/solarPower.js +0 -38
- package/dist/devices/speaker.js +0 -84
- package/dist/devices/temperatureControl.js +3 -24
- package/dist/devices/waterHeater.js +2 -82
- package/dist/dgram/coap.js +13 -126
- package/dist/dgram/dgram.js +2 -114
- package/dist/dgram/mb_coap.js +3 -41
- package/dist/dgram/mb_mdns.js +23 -77
- package/dist/dgram/mdns.js +139 -371
- package/dist/dgram/mdnsReflectorClient.js +5 -71
- package/dist/dgram/mdnsReflectorServer.js +8 -73
- package/dist/dgram/mdnsReflectorTypes.js +1 -24
- package/dist/dgram/multicast.js +1 -62
- package/dist/dgram/unicast.js +0 -60
- package/dist/frontend.js +38 -485
- package/dist/frontendTypes.js +0 -45
- package/dist/helpers.js +0 -53
- package/dist/index.js +0 -25
- package/dist/jestutils/export.js +0 -1
- package/dist/jestutils/jestHelpers.js +14 -371
- package/dist/logger/export.js +0 -1
- package/dist/matter/behaviors.js +0 -2
- package/dist/matter/clusters.js +0 -2
- package/dist/matter/devices.js +0 -2
- package/dist/matter/endpoints.js +0 -2
- package/dist/matter/export.js +0 -3
- package/dist/matter/types.js +0 -3
- package/dist/matterNode.js +8 -369
- package/dist/matterbridge.js +46 -824
- package/dist/matterbridgeAccessoryPlatform.js +0 -38
- package/dist/matterbridgeBehaviors.js +5 -68
- package/dist/matterbridgeDeviceTypes.js +14 -635
- package/dist/matterbridgeDynamicPlatform.js +0 -38
- package/dist/matterbridgeEndpoint.js +53 -1457
- package/dist/matterbridgeEndpointHelpers.js +20 -483
- package/dist/matterbridgeEndpointTypes.js +0 -25
- package/dist/matterbridgePlatform.js +1 -451
- package/dist/matterbridgeTypes.js +0 -26
- package/dist/pluginManager.js +5 -341
- package/dist/shelly.js +7 -178
- package/dist/storage/export.js +0 -1
- package/dist/update.js +1 -93
- package/dist/utils/colorUtils.js +2 -97
- package/dist/utils/commandLine.js +0 -60
- package/dist/utils/copyDirectory.js +0 -37
- package/dist/utils/createDirectory.js +0 -33
- package/dist/utils/createZip.js +2 -47
- package/dist/utils/deepCopy.js +0 -39
- package/dist/utils/deepEqual.js +1 -72
- package/dist/utils/error.js +0 -42
- package/dist/utils/export.js +0 -1
- package/dist/utils/format.js +0 -49
- package/dist/utils/hex.js +0 -124
- package/dist/utils/inspector.js +1 -69
- package/dist/utils/isValid.js +0 -93
- package/dist/utils/network.js +5 -125
- package/dist/utils/spawn.js +1 -71
- package/dist/utils/tracker.js +1 -64
- package/dist/utils/wait.js +8 -60
- package/dist/workerGlobalPrefix.js +5 -37
- package/dist/workerTypes.js +0 -24
- package/dist/workers.js +4 -68
- package/npm-shrinkwrap.json +25 -25
- package/package.json +1 -2
- package/packages/mb-lib-test/dist/jestutils/jestHelpers.js +77 -0
- package/packages/mb-lib-test/dist/module.js +2 -0
- package/packages/mb-lib-test/dist/vitestutils/vitestHelpers.js +77 -0
- package/packages/mb-lib-test/package.json +10 -9
- package/dist/broadcastServer.d.ts +0 -144
- package/dist/broadcastServer.d.ts.map +0 -1
- package/dist/broadcastServer.js.map +0 -1
- package/dist/broadcastServerTypes.d.ts +0 -841
- package/dist/broadcastServerTypes.d.ts.map +0 -1
- package/dist/broadcastServerTypes.js.map +0 -1
- package/dist/cli.d.ts +0 -30
- package/dist/cli.d.ts.map +0 -1
- package/dist/cli.js.map +0 -1
- package/dist/cliEmitter.d.ts +0 -50
- package/dist/cliEmitter.d.ts.map +0 -1
- package/dist/cliEmitter.js.map +0 -1
- package/dist/cliHistory.d.ts +0 -48
- package/dist/cliHistory.d.ts.map +0 -1
- package/dist/cliHistory.js.map +0 -1
- package/dist/clusters/export.d.ts +0 -2
- package/dist/clusters/export.d.ts.map +0 -1
- package/dist/clusters/export.js.map +0 -1
- package/dist/deviceManager.d.ts +0 -135
- package/dist/deviceManager.d.ts.map +0 -1
- package/dist/deviceManager.js.map +0 -1
- package/dist/devices/airConditioner.d.ts +0 -98
- package/dist/devices/airConditioner.d.ts.map +0 -1
- package/dist/devices/airConditioner.js.map +0 -1
- package/dist/devices/batteryStorage.d.ts +0 -48
- package/dist/devices/batteryStorage.d.ts.map +0 -1
- package/dist/devices/batteryStorage.js.map +0 -1
- package/dist/devices/cooktop.d.ts +0 -61
- package/dist/devices/cooktop.d.ts.map +0 -1
- package/dist/devices/cooktop.js.map +0 -1
- package/dist/devices/dishwasher.d.ts +0 -71
- package/dist/devices/dishwasher.d.ts.map +0 -1
- package/dist/devices/dishwasher.js.map +0 -1
- package/dist/devices/evse.d.ts +0 -76
- package/dist/devices/evse.d.ts.map +0 -1
- package/dist/devices/evse.js.map +0 -1
- package/dist/devices/export.d.ts +0 -17
- package/dist/devices/export.d.ts.map +0 -1
- package/dist/devices/export.js.map +0 -1
- package/dist/devices/extractorHood.d.ts +0 -46
- package/dist/devices/extractorHood.d.ts.map +0 -1
- package/dist/devices/extractorHood.js.map +0 -1
- package/dist/devices/heatPump.d.ts +0 -47
- package/dist/devices/heatPump.d.ts.map +0 -1
- package/dist/devices/heatPump.js.map +0 -1
- package/dist/devices/laundryDryer.d.ts +0 -67
- package/dist/devices/laundryDryer.d.ts.map +0 -1
- package/dist/devices/laundryDryer.js.map +0 -1
- package/dist/devices/laundryWasher.d.ts +0 -81
- package/dist/devices/laundryWasher.d.ts.map +0 -1
- package/dist/devices/laundryWasher.js.map +0 -1
- package/dist/devices/microwaveOven.d.ts +0 -168
- package/dist/devices/microwaveOven.d.ts.map +0 -1
- package/dist/devices/microwaveOven.js.map +0 -1
- package/dist/devices/oven.d.ts +0 -105
- package/dist/devices/oven.d.ts.map +0 -1
- package/dist/devices/oven.js.map +0 -1
- package/dist/devices/refrigerator.d.ts +0 -118
- package/dist/devices/refrigerator.d.ts.map +0 -1
- package/dist/devices/refrigerator.js.map +0 -1
- package/dist/devices/roboticVacuumCleaner.d.ts +0 -112
- package/dist/devices/roboticVacuumCleaner.d.ts.map +0 -1
- package/dist/devices/roboticVacuumCleaner.js.map +0 -1
- package/dist/devices/solarPower.d.ts +0 -40
- package/dist/devices/solarPower.d.ts.map +0 -1
- package/dist/devices/solarPower.js.map +0 -1
- package/dist/devices/speaker.d.ts +0 -87
- package/dist/devices/speaker.d.ts.map +0 -1
- package/dist/devices/speaker.js.map +0 -1
- package/dist/devices/temperatureControl.d.ts +0 -166
- package/dist/devices/temperatureControl.d.ts.map +0 -1
- package/dist/devices/temperatureControl.js.map +0 -1
- package/dist/devices/waterHeater.d.ts +0 -111
- package/dist/devices/waterHeater.d.ts.map +0 -1
- package/dist/devices/waterHeater.js.map +0 -1
- package/dist/dgram/coap.d.ts +0 -205
- package/dist/dgram/coap.d.ts.map +0 -1
- package/dist/dgram/coap.js.map +0 -1
- package/dist/dgram/dgram.d.ts +0 -143
- package/dist/dgram/dgram.d.ts.map +0 -1
- package/dist/dgram/dgram.js.map +0 -1
- package/dist/dgram/mb_coap.d.ts +0 -24
- package/dist/dgram/mb_coap.d.ts.map +0 -1
- package/dist/dgram/mb_coap.js.map +0 -1
- package/dist/dgram/mb_mdns.d.ts +0 -24
- package/dist/dgram/mb_mdns.d.ts.map +0 -1
- package/dist/dgram/mb_mdns.js.map +0 -1
- package/dist/dgram/mdns.d.ts +0 -371
- package/dist/dgram/mdns.d.ts.map +0 -1
- package/dist/dgram/mdns.js.map +0 -1
- package/dist/dgram/mdnsReflectorClient.d.ts +0 -88
- package/dist/dgram/mdnsReflectorClient.d.ts.map +0 -1
- package/dist/dgram/mdnsReflectorClient.js.map +0 -1
- package/dist/dgram/mdnsReflectorServer.d.ts +0 -78
- package/dist/dgram/mdnsReflectorServer.d.ts.map +0 -1
- package/dist/dgram/mdnsReflectorServer.js.map +0 -1
- package/dist/dgram/mdnsReflectorTypes.d.ts +0 -28
- package/dist/dgram/mdnsReflectorTypes.d.ts.map +0 -1
- package/dist/dgram/mdnsReflectorTypes.js.map +0 -1
- package/dist/dgram/multicast.d.ts +0 -67
- package/dist/dgram/multicast.d.ts.map +0 -1
- package/dist/dgram/multicast.js.map +0 -1
- package/dist/dgram/unicast.d.ts +0 -64
- package/dist/dgram/unicast.d.ts.map +0 -1
- package/dist/dgram/unicast.js.map +0 -1
- package/dist/frontend.d.ts +0 -245
- package/dist/frontend.d.ts.map +0 -1
- package/dist/frontend.js.map +0 -1
- package/dist/frontendTypes.d.ts +0 -529
- package/dist/frontendTypes.d.ts.map +0 -1
- package/dist/frontendTypes.js.map +0 -1
- package/dist/helpers.d.ts +0 -48
- package/dist/helpers.d.ts.map +0 -1
- package/dist/helpers.js.map +0 -1
- package/dist/index.d.ts +0 -34
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/jestutils/export.d.ts +0 -2
- package/dist/jestutils/export.d.ts.map +0 -1
- package/dist/jestutils/export.js.map +0 -1
- package/dist/jestutils/jestHelpers.d.ts +0 -345
- package/dist/jestutils/jestHelpers.d.ts.map +0 -1
- package/dist/jestutils/jestHelpers.js.map +0 -1
- package/dist/logger/export.d.ts +0 -2
- package/dist/logger/export.d.ts.map +0 -1
- package/dist/logger/export.js.map +0 -1
- package/dist/matter/behaviors.d.ts +0 -2
- package/dist/matter/behaviors.d.ts.map +0 -1
- package/dist/matter/behaviors.js.map +0 -1
- package/dist/matter/clusters.d.ts +0 -2
- package/dist/matter/clusters.d.ts.map +0 -1
- package/dist/matter/clusters.js.map +0 -1
- package/dist/matter/devices.d.ts +0 -2
- package/dist/matter/devices.d.ts.map +0 -1
- package/dist/matter/devices.js.map +0 -1
- package/dist/matter/endpoints.d.ts +0 -2
- package/dist/matter/endpoints.d.ts.map +0 -1
- package/dist/matter/endpoints.js.map +0 -1
- package/dist/matter/export.d.ts +0 -5
- package/dist/matter/export.d.ts.map +0 -1
- package/dist/matter/export.js.map +0 -1
- package/dist/matter/types.d.ts +0 -3
- package/dist/matter/types.d.ts.map +0 -1
- package/dist/matter/types.js.map +0 -1
- package/dist/matterNode.d.ts +0 -342
- package/dist/matterNode.d.ts.map +0 -1
- package/dist/matterNode.js.map +0 -1
- package/dist/matterbridge.d.ts +0 -505
- package/dist/matterbridge.d.ts.map +0 -1
- package/dist/matterbridge.js.map +0 -1
- package/dist/matterbridgeAccessoryPlatform.d.ts +0 -41
- package/dist/matterbridgeAccessoryPlatform.d.ts.map +0 -1
- package/dist/matterbridgeAccessoryPlatform.js.map +0 -1
- package/dist/matterbridgeBehaviors.d.ts +0 -2404
- package/dist/matterbridgeBehaviors.d.ts.map +0 -1
- package/dist/matterbridgeBehaviors.js.map +0 -1
- package/dist/matterbridgeDeviceTypes.d.ts +0 -698
- package/dist/matterbridgeDeviceTypes.d.ts.map +0 -1
- package/dist/matterbridgeDeviceTypes.js.map +0 -1
- package/dist/matterbridgeDynamicPlatform.d.ts +0 -41
- package/dist/matterbridgeDynamicPlatform.d.ts.map +0 -1
- package/dist/matterbridgeDynamicPlatform.js.map +0 -1
- package/dist/matterbridgeEndpoint.d.ts +0 -1507
- package/dist/matterbridgeEndpoint.d.ts.map +0 -1
- package/dist/matterbridgeEndpoint.js.map +0 -1
- package/dist/matterbridgeEndpointHelpers.d.ts +0 -787
- package/dist/matterbridgeEndpointHelpers.d.ts.map +0 -1
- package/dist/matterbridgeEndpointHelpers.js.map +0 -1
- package/dist/matterbridgeEndpointTypes.d.ts +0 -166
- package/dist/matterbridgeEndpointTypes.d.ts.map +0 -1
- package/dist/matterbridgeEndpointTypes.js.map +0 -1
- package/dist/matterbridgePlatform.d.ts +0 -539
- package/dist/matterbridgePlatform.d.ts.map +0 -1
- package/dist/matterbridgePlatform.js.map +0 -1
- package/dist/matterbridgeTypes.d.ts +0 -252
- package/dist/matterbridgeTypes.d.ts.map +0 -1
- package/dist/matterbridgeTypes.js.map +0 -1
- package/dist/pluginManager.d.ts +0 -372
- package/dist/pluginManager.d.ts.map +0 -1
- package/dist/pluginManager.js.map +0 -1
- package/dist/shelly.d.ts +0 -181
- package/dist/shelly.d.ts.map +0 -1
- package/dist/shelly.js.map +0 -1
- package/dist/storage/export.d.ts +0 -2
- package/dist/storage/export.d.ts.map +0 -1
- package/dist/storage/export.js.map +0 -1
- package/dist/update.d.ts +0 -84
- package/dist/update.d.ts.map +0 -1
- package/dist/update.js.map +0 -1
- package/dist/utils/colorUtils.d.ts +0 -101
- package/dist/utils/colorUtils.d.ts.map +0 -1
- package/dist/utils/colorUtils.js.map +0 -1
- package/dist/utils/commandLine.d.ts +0 -66
- package/dist/utils/commandLine.d.ts.map +0 -1
- package/dist/utils/commandLine.js.map +0 -1
- package/dist/utils/copyDirectory.d.ts +0 -35
- package/dist/utils/copyDirectory.d.ts.map +0 -1
- package/dist/utils/copyDirectory.js.map +0 -1
- package/dist/utils/createDirectory.d.ts +0 -34
- package/dist/utils/createDirectory.d.ts.map +0 -1
- package/dist/utils/createDirectory.js.map +0 -1
- package/dist/utils/createZip.d.ts +0 -39
- package/dist/utils/createZip.d.ts.map +0 -1
- package/dist/utils/createZip.js.map +0 -1
- package/dist/utils/deepCopy.d.ts +0 -32
- package/dist/utils/deepCopy.d.ts.map +0 -1
- package/dist/utils/deepCopy.js.map +0 -1
- package/dist/utils/deepEqual.d.ts +0 -54
- package/dist/utils/deepEqual.d.ts.map +0 -1
- package/dist/utils/deepEqual.js.map +0 -1
- package/dist/utils/error.d.ts +0 -45
- package/dist/utils/error.d.ts.map +0 -1
- package/dist/utils/error.js.map +0 -1
- package/dist/utils/export.d.ts +0 -13
- package/dist/utils/export.d.ts.map +0 -1
- package/dist/utils/export.js.map +0 -1
- package/dist/utils/format.d.ts +0 -53
- package/dist/utils/format.d.ts.map +0 -1
- package/dist/utils/format.js.map +0 -1
- package/dist/utils/hex.d.ts +0 -89
- package/dist/utils/hex.d.ts.map +0 -1
- package/dist/utils/hex.js.map +0 -1
- package/dist/utils/inspector.d.ts +0 -87
- package/dist/utils/inspector.d.ts.map +0 -1
- package/dist/utils/inspector.js.map +0 -1
- package/dist/utils/isValid.d.ts +0 -103
- package/dist/utils/isValid.d.ts.map +0 -1
- package/dist/utils/isValid.js.map +0 -1
- package/dist/utils/network.d.ts +0 -140
- package/dist/utils/network.d.ts.map +0 -1
- package/dist/utils/network.js.map +0 -1
- package/dist/utils/spawn.d.ts +0 -33
- package/dist/utils/spawn.d.ts.map +0 -1
- package/dist/utils/spawn.js.map +0 -1
- package/dist/utils/tracker.d.ts +0 -108
- package/dist/utils/tracker.d.ts.map +0 -1
- package/dist/utils/tracker.js.map +0 -1
- package/dist/utils/wait.d.ts +0 -54
- package/dist/utils/wait.d.ts.map +0 -1
- package/dist/utils/wait.js.map +0 -1
- package/dist/workerGlobalPrefix.d.ts +0 -25
- package/dist/workerGlobalPrefix.d.ts.map +0 -1
- package/dist/workerGlobalPrefix.js.map +0 -1
- package/dist/workerTypes.d.ts +0 -52
- package/dist/workerTypes.d.ts.map +0 -1
- package/dist/workerTypes.js.map +0 -1
- package/dist/workers.d.ts +0 -69
- package/dist/workers.d.ts.map +0 -1
- package/dist/workers.js.map +0 -1
- package/scripts/data_model.mjs +0 -2058
- package/scripts/fetch-chip.mjs +0 -102
- package/scripts/marked.mjs +0 -133
- package/scripts/markedFooter.html +0 -42
- package/scripts/markedHeader.html +0 -78
package/dist/dgram/dgram.js
CHANGED
|
@@ -1,35 +1,8 @@
|
|
|
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.1
|
|
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
5
|
import { hasParameter } from '../utils/commandLine.js';
|
|
30
|
-
/**
|
|
31
|
-
* This class implements a dgram socket.
|
|
32
|
-
*/
|
|
33
6
|
export class Dgram extends EventEmitter {
|
|
34
7
|
verbose = hasParameter('v') || hasParameter('verbose');
|
|
35
8
|
debug = hasParameter('d') || hasParameter('debug') || hasParameter('v') || hasParameter('verbose');
|
|
@@ -41,18 +14,9 @@ export class Dgram extends EventEmitter {
|
|
|
41
14
|
interfaceName;
|
|
42
15
|
interfaceAddress;
|
|
43
16
|
interfaceNetmask;
|
|
44
|
-
/**
|
|
45
|
-
* Creates an instance of Dgram.
|
|
46
|
-
*
|
|
47
|
-
* @param {string} name - The name of the socket.
|
|
48
|
-
* @param {'udp4' | 'udp6'} socketType - The type of the socket (IPv4 or IPv6).
|
|
49
|
-
* @param {boolean | undefined} reuseAddr - Whether to allow address reuse. Defaults to true.
|
|
50
|
-
* @param {string} [interfaceName] - The name of the network interface to bind to.
|
|
51
|
-
* @param {string} [interfaceAddress] - The address of the network interface to bind to.
|
|
52
|
-
*/
|
|
53
17
|
constructor(name, socketType, reuseAddr = true, interfaceName, interfaceAddress) {
|
|
54
18
|
super();
|
|
55
|
-
this.log = new AnsiLogger({ logName: name, logTimestampFormat: 4
|
|
19
|
+
this.log = new AnsiLogger({ logName: name, logTimestampFormat: 4, logLevel: this.debug ? "debug" : this.silent ? "notice" : "info" });
|
|
56
20
|
this.socket = dgram.createSocket({ type: socketType, reuseAddr });
|
|
57
21
|
this.socketType = socketType;
|
|
58
22
|
this.interfaceName = interfaceName;
|
|
@@ -87,13 +51,6 @@ export class Dgram extends EventEmitter {
|
|
|
87
51
|
this.onListening(address);
|
|
88
52
|
});
|
|
89
53
|
}
|
|
90
|
-
/**
|
|
91
|
-
* Sends a message to the specified server.
|
|
92
|
-
*
|
|
93
|
-
* @param {Buffer} msg - The message buffer to send.
|
|
94
|
-
* @param {string} serverAddress - The IPv4 address of the destination server.
|
|
95
|
-
* @param {number} serverPort - The port of the destination server.
|
|
96
|
-
*/
|
|
97
54
|
send(msg, serverAddress, serverPort) {
|
|
98
55
|
this.socket.send(msg, 0, msg.length, serverPort, serverAddress, (error) => {
|
|
99
56
|
if (error) {
|
|
@@ -131,30 +88,18 @@ export class Dgram extends EventEmitter {
|
|
|
131
88
|
this.log.info(`Socket ready on ${BLUE}${address.family}${nf} ${BLUE}${address.address}${nf}:${BLUE}${address.port}${nf}`);
|
|
132
89
|
this.emit('ready', address);
|
|
133
90
|
}
|
|
134
|
-
/**
|
|
135
|
-
* Retrieves the IPv4 address of the specified network interface or the first external IPv4 interface if no interface is specified.
|
|
136
|
-
* Throws an error if no suitable interface or address is found.
|
|
137
|
-
*
|
|
138
|
-
* @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.
|
|
139
|
-
* @returns {string | undefined} The IPv4 address of the specified network interface or the first external IPv4 interface.
|
|
140
|
-
* @throws {Error} if no suitable interface or address is found.
|
|
141
|
-
*/
|
|
142
91
|
getIpv4InterfaceAddress(networkInterface) {
|
|
143
|
-
// Normalize the interface name: treat an empty string as undefined.
|
|
144
92
|
if (networkInterface === '')
|
|
145
93
|
networkInterface = undefined;
|
|
146
94
|
const interfaces = os.networkInterfaces();
|
|
147
|
-
// If a specific interface is provided but not found, warn and fall back.
|
|
148
95
|
if (networkInterface && !interfaces[networkInterface]) {
|
|
149
96
|
this.log.warn(`Interface "${networkInterface}" not found. Using first external IPv4 interface.`);
|
|
150
97
|
networkInterface = undefined;
|
|
151
98
|
}
|
|
152
|
-
// If no interface was specified or the provided one doesn't exist, find the first external IPv4 interface.
|
|
153
99
|
if (!networkInterface) {
|
|
154
100
|
for (const [interfaceName, interfaceDetails] of Object.entries(interfaces)) {
|
|
155
101
|
if (!interfaceDetails)
|
|
156
102
|
continue;
|
|
157
|
-
// Check if at least one external IPv4 address exists on this interface.
|
|
158
103
|
for (const detail of interfaceDetails) {
|
|
159
104
|
if (detail.family === 'IPv4' && !detail.internal) {
|
|
160
105
|
networkInterface = interfaceName;
|
|
@@ -168,7 +113,6 @@ export class Dgram extends EventEmitter {
|
|
|
168
113
|
if (!networkInterface) {
|
|
169
114
|
throw new Error(`Didn't find an external IPv4 network interface`);
|
|
170
115
|
}
|
|
171
|
-
// Select the first external IPv4 address from the interface.
|
|
172
116
|
const addresses = interfaces[networkInterface];
|
|
173
117
|
const ipv4Address = addresses?.find((addr) => addr.family === 'IPv4' && !addr.internal);
|
|
174
118
|
if (!ipv4Address) {
|
|
@@ -176,25 +120,14 @@ export class Dgram extends EventEmitter {
|
|
|
176
120
|
}
|
|
177
121
|
return ipv4Address.address;
|
|
178
122
|
}
|
|
179
|
-
/**
|
|
180
|
-
* Retrieves the IPv6 address of the specified network interface or the first external IPv6 interface if no interface is specified.
|
|
181
|
-
* Throws an error if no suitable interface or address is found.
|
|
182
|
-
*
|
|
183
|
-
* @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.
|
|
184
|
-
* @returns {string | undefined} The IPv6 address of the specified network interface or the first external IPv6 interface.
|
|
185
|
-
* @throws {Error} If no suitable interface or address is found.
|
|
186
|
-
*/
|
|
187
123
|
getIpv6InterfaceAddress(networkInterface) {
|
|
188
|
-
// Normalize the interface name: treat an empty string as undefined.
|
|
189
124
|
if (networkInterface === '')
|
|
190
125
|
networkInterface = undefined;
|
|
191
126
|
const interfaces = os.networkInterfaces();
|
|
192
|
-
// If a specific interface is provided, verify it exists. Otherwise, warn and use the first external IPv6 interface.
|
|
193
127
|
if (networkInterface && !interfaces[networkInterface]) {
|
|
194
128
|
this.log.warn(`Interface "${networkInterface}" not found. Using first external IPv6 interface.`);
|
|
195
129
|
networkInterface = undefined;
|
|
196
130
|
}
|
|
197
|
-
// If no network interface was specified, search for the first external IPv6 interface.
|
|
198
131
|
if (!networkInterface) {
|
|
199
132
|
for (const [interfaceName, interfaceDetails] of Object.entries(interfaces)) {
|
|
200
133
|
if (!interfaceDetails)
|
|
@@ -213,21 +146,18 @@ export class Dgram extends EventEmitter {
|
|
|
213
146
|
throw new Error(`Didn't find an external IPv6 network interface`);
|
|
214
147
|
}
|
|
215
148
|
const addresses = interfaces[networkInterface];
|
|
216
|
-
// Try to find a link-local address and use scopeid
|
|
217
149
|
const linkLocalAddress = addresses?.find((addr) => addr.family === 'IPv6' && !addr.internal && addr.address.startsWith('fe80'));
|
|
218
150
|
if (linkLocalAddress) {
|
|
219
151
|
this.log.debug('Found IPv6 link-local address');
|
|
220
152
|
return linkLocalAddress.scopeid ? `${linkLocalAddress.address}%${process.platform !== 'win32' ? networkInterface : linkLocalAddress.scopeid}` : linkLocalAddress.address;
|
|
221
153
|
}
|
|
222
154
|
this.log.debug('No IPv6 link-local address found');
|
|
223
|
-
// Try to find a unique local address
|
|
224
155
|
const ulaAddress = addresses?.find((addr) => addr.family === 'IPv6' && !addr.internal && addr.address.startsWith('fd') && addr.netmask === 'ffff:ffff:ffff:ffff::');
|
|
225
156
|
if (ulaAddress) {
|
|
226
157
|
this.log.debug('Found IPv6 Unique Local Addresses (ULA) unicast address');
|
|
227
158
|
return ulaAddress.address;
|
|
228
159
|
}
|
|
229
160
|
this.log.debug('No IPv6 Unique Local Addresses (ULA) unicast address found');
|
|
230
|
-
// Try to find a unique local address
|
|
231
161
|
const uniqueLocalAddress = addresses?.find((addr) => addr.family === 'IPv6' && !addr.internal && addr.address.startsWith('fd'));
|
|
232
162
|
if (uniqueLocalAddress) {
|
|
233
163
|
this.log.debug('Found IPv6 Unique Local Addresses (ULA) address');
|
|
@@ -236,11 +166,6 @@ export class Dgram extends EventEmitter {
|
|
|
236
166
|
this.log.debug('No IPv6 Unique Local Addresses (ULA) address found');
|
|
237
167
|
throw new Error(`Interface ${networkInterface} does not have a suitable external IPv6 address`);
|
|
238
168
|
}
|
|
239
|
-
/**
|
|
240
|
-
* Retrieves the names of all available network interfaces.
|
|
241
|
-
*
|
|
242
|
-
* @returns {string[]} An array of network interface names.
|
|
243
|
-
*/
|
|
244
169
|
getInterfacesNames() {
|
|
245
170
|
const interfaces = os.networkInterfaces();
|
|
246
171
|
const interfaceNames = [];
|
|
@@ -251,12 +176,6 @@ export class Dgram extends EventEmitter {
|
|
|
251
176
|
}
|
|
252
177
|
return interfaceNames;
|
|
253
178
|
}
|
|
254
|
-
/**
|
|
255
|
-
* Retrieves the scope ID of the first found IPv6 address on the specified network interface or on any interface if none is specified.
|
|
256
|
-
*
|
|
257
|
-
* @param {string} [interfaceName] - The name of the network interface. If not provided, the first found IPv6 address will be used.
|
|
258
|
-
* @returns {string} The scope ID of the first found IPv6 address or an empty string.
|
|
259
|
-
*/
|
|
260
179
|
getIpv6ScopeId(interfaceName) {
|
|
261
180
|
const interfaces = os.networkInterfaces();
|
|
262
181
|
for (const name in interfaces) {
|
|
@@ -266,24 +185,17 @@ export class Dgram extends EventEmitter {
|
|
|
266
185
|
if (iface) {
|
|
267
186
|
const ipv6Address = iface.find((addr) => addr.family === 'IPv6' && !addr.internal && addr.scopeid);
|
|
268
187
|
if (ipv6Address) {
|
|
269
|
-
return process.platform === 'win32' ? '%' + String(ipv6Address.scopeid) : '%' + name;
|
|
188
|
+
return process.platform === 'win32' ? '%' + String(ipv6Address.scopeid) : '%' + name;
|
|
270
189
|
}
|
|
271
190
|
}
|
|
272
191
|
}
|
|
273
192
|
return '';
|
|
274
193
|
}
|
|
275
|
-
/**
|
|
276
|
-
* Retrieves the interface name from the scope id of an IPv6 address.
|
|
277
|
-
*
|
|
278
|
-
* @param {number} scopeId - The scope id of the IPv6 address.
|
|
279
|
-
* @returns {string | undefined} The interface name or undefined if not found.
|
|
280
|
-
*/
|
|
281
194
|
getInterfaceNameFromScopeId(scopeId) {
|
|
282
195
|
const nets = os.networkInterfaces();
|
|
283
196
|
for (const ifaceName in nets) {
|
|
284
197
|
const addresses = nets[ifaceName] || [];
|
|
285
198
|
for (const addr of addresses) {
|
|
286
|
-
// Check for IPv6 addresses with a matching scope id.
|
|
287
199
|
if (addr.family === 'IPv6' && addr.scopeid === scopeId) {
|
|
288
200
|
return ifaceName;
|
|
289
201
|
}
|
|
@@ -291,16 +203,8 @@ export class Dgram extends EventEmitter {
|
|
|
291
203
|
}
|
|
292
204
|
return undefined;
|
|
293
205
|
}
|
|
294
|
-
/**
|
|
295
|
-
* Retrieves the netmask of the specified interface address.
|
|
296
|
-
*
|
|
297
|
-
* @param {string} interfaceAddress - The interface address for which to retrieve the netmask.
|
|
298
|
-
* @returns {string | undefined} The netmask of the specified interface address or undefined if not found.
|
|
299
|
-
*/
|
|
300
206
|
getNetmask(interfaceAddress) {
|
|
301
|
-
// Remove zone index if present (e.g. for IPv6 "fe80::1%eth0")
|
|
302
207
|
const noZoneAddress = interfaceAddress.includes('%') ? interfaceAddress.split('%')[0] : interfaceAddress;
|
|
303
|
-
// Iterate over all interfaces.
|
|
304
208
|
const nets = os.networkInterfaces();
|
|
305
209
|
for (const ifaceName in nets) {
|
|
306
210
|
const ifaceAddresses = nets[ifaceName];
|
|
@@ -314,13 +218,6 @@ export class Dgram extends EventEmitter {
|
|
|
314
218
|
}
|
|
315
219
|
return undefined;
|
|
316
220
|
}
|
|
317
|
-
/**
|
|
318
|
-
* Computes the broadcast address given an IPv4 address and netmask.
|
|
319
|
-
*
|
|
320
|
-
* @param {string | undefined} [ipAddress] - The IPv4 address e.g. "192.168.1.20"
|
|
321
|
-
* @param {string | undefined} [netmask] - The IPv4 netmask e.g. "255.255.255.0"
|
|
322
|
-
* @returns {string | undefined} The computed broadcast address, e.g. "192.168.1.255"
|
|
323
|
-
*/
|
|
324
221
|
getIpv4BroadcastAddress(ipAddress, netmask) {
|
|
325
222
|
if (!ipAddress || !netmask) {
|
|
326
223
|
return undefined;
|
|
@@ -330,17 +227,9 @@ export class Dgram extends EventEmitter {
|
|
|
330
227
|
const broadcastParts = ipParts.map((octet, i) => (octet & maskParts[i]) | (255 - maskParts[i]));
|
|
331
228
|
return broadcastParts.join('.');
|
|
332
229
|
}
|
|
333
|
-
/**
|
|
334
|
-
* Returns the broadcast IPv6 address.
|
|
335
|
-
*
|
|
336
|
-
* @returns {string} The broadcast IPv6 address, e.g. "ff02::1"
|
|
337
|
-
*/
|
|
338
230
|
getIpv6BroadcastAddress() {
|
|
339
231
|
return 'ff02::1';
|
|
340
232
|
}
|
|
341
|
-
/**
|
|
342
|
-
* Logs all available network interfaces and their details.
|
|
343
|
-
*/
|
|
344
233
|
listNetworkInterfaces() {
|
|
345
234
|
const interfaces = os.networkInterfaces();
|
|
346
235
|
for (const [name, addresses] of Object.entries(interfaces)) {
|
|
@@ -353,4 +242,3 @@ export class Dgram extends EventEmitter {
|
|
|
353
242
|
}
|
|
354
243
|
}
|
|
355
244
|
}
|
|
356
|
-
//# sourceMappingURL=dgram.js.map
|
package/dist/dgram/mb_coap.js
CHANGED
|
@@ -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;
|
|
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;
|
|
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);
|
|
51
|
+
}, 600000);
|
|
89
52
|
}
|
|
90
|
-
//# sourceMappingURL=mb_coap.js.map
|
package/dist/dgram/mb_mdns.js
CHANGED
|
@@ -1,39 +1,12 @@
|
|
|
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
1
|
import os from 'node:os';
|
|
24
|
-
// Matterbridge
|
|
25
2
|
import { getIntParameter, getParameter, getStringArrayParameter, hasParameter } from '../utils/commandLine.js';
|
|
26
|
-
// Net imports
|
|
27
3
|
import { MDNS_MULTICAST_IPV4_ADDRESS, MDNS_MULTICAST_IPV6_ADDRESS, MDNS_MULTICAST_PORT } from './multicast.js';
|
|
28
4
|
import { Mdns } from './mdns.js';
|
|
29
5
|
import { MdnsReflectorClient } from './mdnsReflectorClient.js';
|
|
30
6
|
import { MdnsReflectorServer } from './mdnsReflectorServer.js';
|
|
31
|
-
// istanbul ignore next
|
|
32
7
|
{
|
|
33
8
|
if (hasParameter('h') || hasParameter('help')) {
|
|
34
|
-
// eslint-disable-next-line no-console
|
|
35
9
|
console.log(`Copyright (c) Matterbridge. All rights reserved. Version 1.0.0.\n`);
|
|
36
|
-
// eslint-disable-next-line no-console
|
|
37
10
|
console.log(`Usage: mb_mdns [options...]
|
|
38
11
|
|
|
39
12
|
If no command line is provided, mb_mdns shows all incoming mDNS records on all interfaces (0.0.0.0 and ::).
|
|
@@ -82,10 +55,8 @@ Examples:
|
|
|
82
55
|
# Query each 5s and listen for _matterbridge._tcp.local service records
|
|
83
56
|
mb_mdns --query 5000 --filter _matterbridge._tcp.local
|
|
84
57
|
`);
|
|
85
|
-
// eslint-disable-next-line n/no-process-exit
|
|
86
58
|
process.exit(0);
|
|
87
59
|
}
|
|
88
|
-
// Dynamic JSON import (Node >= 20) with import attributes
|
|
89
60
|
const { default: pkg } = await import('../../package.json', { with: { type: 'json' } });
|
|
90
61
|
let mdnsIpv4QueryInterval;
|
|
91
62
|
let mdnsIpv6QueryInterval;
|
|
@@ -95,9 +66,6 @@ Examples:
|
|
|
95
66
|
let mdnsIpv6 = undefined;
|
|
96
67
|
let reflectorClient = undefined;
|
|
97
68
|
let reflectorServer = undefined;
|
|
98
|
-
/**
|
|
99
|
-
* Cleanup and log device information before exiting.
|
|
100
|
-
*/
|
|
101
69
|
async function cleanupAndLogAndExit() {
|
|
102
70
|
clearInterval(mdnsIpv4QueryInterval);
|
|
103
71
|
clearInterval(mdnsIpv6QueryInterval);
|
|
@@ -105,38 +73,32 @@ Examples:
|
|
|
105
73
|
clearInterval(mdnsIpv6AdvertiseInterval);
|
|
106
74
|
if (hasParameter('advertise')) {
|
|
107
75
|
if (mdnsIpv4)
|
|
108
|
-
advertise(mdnsIpv4, 0);
|
|
76
|
+
advertise(mdnsIpv4, 0);
|
|
109
77
|
if (mdnsIpv6)
|
|
110
|
-
advertise(mdnsIpv6, 0);
|
|
78
|
+
advertise(mdnsIpv6, 0);
|
|
111
79
|
}
|
|
112
|
-
await new Promise((resolve) => setTimeout(resolve, 250));
|
|
80
|
+
await new Promise((resolve) => setTimeout(resolve, 250));
|
|
113
81
|
mdnsIpv4?.stop();
|
|
114
82
|
mdnsIpv6?.stop();
|
|
115
83
|
mdnsIpv4?.logDevices();
|
|
116
84
|
mdnsIpv6?.logDevices();
|
|
117
|
-
await new Promise((resolve) => setTimeout(resolve, 250));
|
|
85
|
+
await new Promise((resolve) => setTimeout(resolve, 250));
|
|
118
86
|
await reflectorClient?.stop();
|
|
119
87
|
await reflectorServer?.stop();
|
|
120
88
|
}
|
|
121
89
|
const query = (mdns) => {
|
|
122
90
|
mdns.log.info('Sending mDNS query for common services...');
|
|
123
91
|
mdns.sendQuery([
|
|
124
|
-
{ name: '_matterc._udp.local', type: 12
|
|
125
|
-
{ name: '_matter._tcp.local', type: 12
|
|
126
|
-
{ name: '_matterbridge._tcp.local', type: 12
|
|
127
|
-
{ name: '_home-assistant._tcp.local', type: 12
|
|
128
|
-
{ name: '_shelly._tcp.local', type: 12
|
|
129
|
-
{ name: '_mqtt._tcp.local', type: 12
|
|
130
|
-
{ name: '_http._tcp.local', type: 12
|
|
131
|
-
{ name: '_services._dns-sd._udp.local', type: 12
|
|
92
|
+
{ name: '_matterc._udp.local', type: 12, class: 1, unicastResponse: true },
|
|
93
|
+
{ name: '_matter._tcp.local', type: 12, class: 1, unicastResponse: true },
|
|
94
|
+
{ name: '_matterbridge._tcp.local', type: 12, class: 1, unicastResponse: true },
|
|
95
|
+
{ name: '_home-assistant._tcp.local', type: 12, class: 1, unicastResponse: true },
|
|
96
|
+
{ name: '_shelly._tcp.local', type: 12, class: 1, unicastResponse: true },
|
|
97
|
+
{ name: '_mqtt._tcp.local', type: 12, class: 1, unicastResponse: true },
|
|
98
|
+
{ name: '_http._tcp.local', type: 12, class: 1, unicastResponse: true },
|
|
99
|
+
{ name: '_services._dns-sd._udp.local', type: 12, class: 1, unicastResponse: true },
|
|
132
100
|
]);
|
|
133
101
|
};
|
|
134
|
-
/**
|
|
135
|
-
* Sends an mDNS advertisement for the HTTP service over UDP IPv4.
|
|
136
|
-
*
|
|
137
|
-
* @param {Mdns} mdns - The Mdns instance to use for sending the advertisement.
|
|
138
|
-
* @param {number} [ttl] - The time-to-live for the advertisement records. Defaults to 120 seconds. Send 0 for goodbye.
|
|
139
|
-
*/
|
|
140
102
|
const advertise = (mdns, ttl = 120) => {
|
|
141
103
|
mdns.log.info(`Sending mDNS advertisement for matterbridge service with TTL ${ttl ? ttl.toString() : 'goodbye'}...`);
|
|
142
104
|
const httpServiceType = '_http._tcp.local';
|
|
@@ -152,25 +114,17 @@ Examples:
|
|
|
152
114
|
const srvRdata = mdns.encodeSrvRdata(0, 0, port, hostName);
|
|
153
115
|
const txtRdata = mdns.encodeTxtRdata([`version=${pkg.version}`, 'path=/']);
|
|
154
116
|
const answers = [
|
|
155
|
-
|
|
156
|
-
{ name:
|
|
157
|
-
{ name:
|
|
158
|
-
{ name:
|
|
159
|
-
{ name:
|
|
160
|
-
|
|
161
|
-
{ name: httpInstanceName, rtype:
|
|
162
|
-
|
|
163
|
-
{ name: matterbridgeInstanceName, rtype: 33 /* DnsRecordType.SRV */, rclass: 1 /* DnsClass.IN */ | 32768 /* DnsClassFlag.FLUSH */, ttl, rdata: srvRdata },
|
|
164
|
-
// TXT record for the HTTP instance
|
|
165
|
-
{ name: httpInstanceName, rtype: 16 /* DnsRecordType.TXT */, rclass: 1 /* DnsClass.IN */ | 32768 /* DnsClassFlag.FLUSH */, ttl, rdata: txtRdata },
|
|
166
|
-
// TXT record for the matterbridge instance
|
|
167
|
-
{ name: matterbridgeInstanceName, rtype: 16 /* DnsRecordType.TXT */, rclass: 1 /* DnsClass.IN */ | 32768 /* DnsClassFlag.FLUSH */, ttl, rdata: txtRdata },
|
|
117
|
+
{ name: '_services._dns-sd._udp.local', rtype: 12, rclass: 1, ttl, rdata: ptrHttpServiceTypeRdata },
|
|
118
|
+
{ name: httpServiceType, rtype: 12, rclass: 1, ttl, rdata: ptrHttpInstanceRdata },
|
|
119
|
+
{ name: '_services._dns-sd._udp.local', rtype: 12, rclass: 1, ttl, rdata: ptrMatterbridgeServiceTypeRdata },
|
|
120
|
+
{ name: matterbridgeServiceType, rtype: 12, rclass: 1, ttl, rdata: ptrMatterbridgeInstanceRdata },
|
|
121
|
+
{ name: httpInstanceName, rtype: 33, rclass: 1 | 32768, ttl, rdata: srvRdata },
|
|
122
|
+
{ name: matterbridgeInstanceName, rtype: 33, rclass: 1 | 32768, ttl, rdata: srvRdata },
|
|
123
|
+
{ name: httpInstanceName, rtype: 16, rclass: 1 | 32768, ttl, rdata: txtRdata },
|
|
124
|
+
{ name: matterbridgeInstanceName, rtype: 16, rclass: 1 | 32768, ttl, rdata: txtRdata },
|
|
168
125
|
];
|
|
169
|
-
// Always attempt to add both A and all AAAA records (best effort), regardless of the socket family.
|
|
170
126
|
const interfaces = os.networkInterfaces();
|
|
171
|
-
// Use specified interface name if provided
|
|
172
127
|
let interfaceInfos = mdns.interfaceName ? interfaces[mdns.interfaceName] : undefined;
|
|
173
|
-
// Find the first non-internal IPv4 and IPv6 addresses if interface name is not provided or not found
|
|
174
128
|
if (!interfaceInfos) {
|
|
175
129
|
interfaceInfos = [];
|
|
176
130
|
for (const name of Object.keys(interfaces)) {
|
|
@@ -181,16 +135,15 @@ Examples:
|
|
|
181
135
|
}
|
|
182
136
|
}
|
|
183
137
|
}
|
|
184
|
-
// Encode A and AAAA records for all non-internal addresses of the selected interface
|
|
185
138
|
try {
|
|
186
139
|
for (const info of interfaceInfos) {
|
|
187
140
|
if (info.family === 'IPv4' && !info.internal) {
|
|
188
141
|
const ipv4 = info.address;
|
|
189
|
-
answers.push({ name: hostName, rtype: 1
|
|
142
|
+
answers.push({ name: hostName, rtype: 1, rclass: 1 | 32768, ttl, rdata: mdns.encodeA(ipv4) });
|
|
190
143
|
}
|
|
191
144
|
else if (info.family === 'IPv6' && !info.internal) {
|
|
192
145
|
const ipv6 = info.address;
|
|
193
|
-
answers.push({ name: hostName, rtype: 28
|
|
146
|
+
answers.push({ name: hostName, rtype: 28, rclass: 1 | 32768, ttl, rdata: mdns.encodeAAAA(ipv6) });
|
|
194
147
|
}
|
|
195
148
|
}
|
|
196
149
|
}
|
|
@@ -203,11 +156,9 @@ Examples:
|
|
|
203
156
|
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'));
|
|
204
157
|
if (hasParameter('v') || hasParameter('verbose'))
|
|
205
158
|
mdnsIpv4.listNetworkInterfaces();
|
|
206
|
-
// Apply filters if any
|
|
207
159
|
const filters = getStringArrayParameter('filter');
|
|
208
160
|
if (filters)
|
|
209
161
|
mdnsIpv4.filters.push(...filters);
|
|
210
|
-
// Start the IPv4 mDNS server
|
|
211
162
|
mdnsIpv4.start();
|
|
212
163
|
mdnsIpv4.on('ready', (address) => {
|
|
213
164
|
mdnsIpv4?.socket.setMulticastLoopback(false);
|
|
@@ -226,11 +177,9 @@ Examples:
|
|
|
226
177
|
mdnsIpv6 = new Mdns('mDNS Server udp6', MDNS_MULTICAST_IPV6_ADDRESS, MDNS_MULTICAST_PORT, 'udp6', true, getParameter('interfaceName'), getParameter('ipv6InterfaceAddress') || '::', getParameter('outgoingIpv6InterfaceAddress'));
|
|
227
178
|
if (hasParameter('v') || hasParameter('verbose'))
|
|
228
179
|
mdnsIpv6.listNetworkInterfaces();
|
|
229
|
-
// Apply filters if any
|
|
230
180
|
const filters = getStringArrayParameter('filter');
|
|
231
181
|
if (filters)
|
|
232
182
|
mdnsIpv6.filters.push(...filters);
|
|
233
|
-
// Start the IPv6 mDNS server
|
|
234
183
|
mdnsIpv6.start();
|
|
235
184
|
mdnsIpv6.on('ready', (address) => {
|
|
236
185
|
mdnsIpv6?.socket.setMulticastLoopback(false);
|
|
@@ -253,18 +202,15 @@ Examples:
|
|
|
253
202
|
reflectorServer = new MdnsReflectorServer();
|
|
254
203
|
await reflectorServer.start();
|
|
255
204
|
}
|
|
256
|
-
// Handle Ctrl+C (SIGINT) and SIGTERM to stop and log devices
|
|
257
205
|
process.on('SIGINT', async () => {
|
|
258
206
|
await cleanupAndLogAndExit();
|
|
259
207
|
});
|
|
260
208
|
process.on('SIGTERM', async () => {
|
|
261
209
|
await cleanupAndLogAndExit();
|
|
262
210
|
});
|
|
263
|
-
// Exit after a timeout to avoid running indefinitely in test environments
|
|
264
211
|
if (!hasParameter('no-timeout') && !hasParameter('reflector-server') && !hasParameter('reflector-client')) {
|
|
265
212
|
setTimeout(async () => {
|
|
266
213
|
await cleanupAndLogAndExit();
|
|
267
|
-
}, 600000).unref();
|
|
214
|
+
}, 600000).unref();
|
|
268
215
|
}
|
|
269
216
|
}
|
|
270
|
-
//# sourceMappingURL=mb_mdns.js.map
|