matterbridge 3.4.6 → 3.4.7-dev-20260104-6b10cee
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 +17 -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 +6 -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.d.ts +21 -0
- package/packages/mb-lib-test/dist/jestutils/jestHelpers.js +77 -0
- package/packages/mb-lib-test/dist/module.d.ts +2 -0
- package/packages/mb-lib-test/dist/module.js +2 -0
- package/packages/mb-lib-test/dist/vitestutils/vitestHelpers.d.ts +21 -0
- package/packages/mb-lib-test/dist/vitestutils/vitestHelpers.js +77 -0
- package/packages/mb-lib-test/package.json +12 -11
- package/reflector/DockerDesktopSetup.png +0 -0
- package/reflector/Reflector.md +158 -0
- package/reflector/ReflectorClient.png +0 -0
- package/reflector/ReflectorServer.png +0 -0
- package/reflector/docker-compose.yml +32 -0
- package/reflector/mDnsPacket.png +0 -0
- 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,20 @@ 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)) {
|
|
101
|
+
if (interfaceName.toLowerCase().includes('tailscale'))
|
|
102
|
+
continue;
|
|
155
103
|
if (!interfaceDetails)
|
|
156
104
|
continue;
|
|
157
|
-
// Check if at least one external IPv4 address exists on this interface.
|
|
158
105
|
for (const detail of interfaceDetails) {
|
|
159
106
|
if (detail.family === 'IPv4' && !detail.internal) {
|
|
160
107
|
networkInterface = interfaceName;
|
|
@@ -168,7 +115,6 @@ export class Dgram extends EventEmitter {
|
|
|
168
115
|
if (!networkInterface) {
|
|
169
116
|
throw new Error(`Didn't find an external IPv4 network interface`);
|
|
170
117
|
}
|
|
171
|
-
// Select the first external IPv4 address from the interface.
|
|
172
118
|
const addresses = interfaces[networkInterface];
|
|
173
119
|
const ipv4Address = addresses?.find((addr) => addr.family === 'IPv4' && !addr.internal);
|
|
174
120
|
if (!ipv4Address) {
|
|
@@ -176,27 +122,18 @@ export class Dgram extends EventEmitter {
|
|
|
176
122
|
}
|
|
177
123
|
return ipv4Address.address;
|
|
178
124
|
}
|
|
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
125
|
getIpv6InterfaceAddress(networkInterface) {
|
|
188
|
-
// Normalize the interface name: treat an empty string as undefined.
|
|
189
126
|
if (networkInterface === '')
|
|
190
127
|
networkInterface = undefined;
|
|
191
128
|
const interfaces = os.networkInterfaces();
|
|
192
|
-
// If a specific interface is provided, verify it exists. Otherwise, warn and use the first external IPv6 interface.
|
|
193
129
|
if (networkInterface && !interfaces[networkInterface]) {
|
|
194
130
|
this.log.warn(`Interface "${networkInterface}" not found. Using first external IPv6 interface.`);
|
|
195
131
|
networkInterface = undefined;
|
|
196
132
|
}
|
|
197
|
-
// If no network interface was specified, search for the first external IPv6 interface.
|
|
198
133
|
if (!networkInterface) {
|
|
199
134
|
for (const [interfaceName, interfaceDetails] of Object.entries(interfaces)) {
|
|
135
|
+
if (interfaceName.toLowerCase().includes('tailscale'))
|
|
136
|
+
continue;
|
|
200
137
|
if (!interfaceDetails)
|
|
201
138
|
continue;
|
|
202
139
|
for (const detail of interfaceDetails) {
|
|
@@ -213,21 +150,18 @@ export class Dgram extends EventEmitter {
|
|
|
213
150
|
throw new Error(`Didn't find an external IPv6 network interface`);
|
|
214
151
|
}
|
|
215
152
|
const addresses = interfaces[networkInterface];
|
|
216
|
-
// Try to find a link-local address and use scopeid
|
|
217
153
|
const linkLocalAddress = addresses?.find((addr) => addr.family === 'IPv6' && !addr.internal && addr.address.startsWith('fe80'));
|
|
218
154
|
if (linkLocalAddress) {
|
|
219
155
|
this.log.debug('Found IPv6 link-local address');
|
|
220
156
|
return linkLocalAddress.scopeid ? `${linkLocalAddress.address}%${process.platform !== 'win32' ? networkInterface : linkLocalAddress.scopeid}` : linkLocalAddress.address;
|
|
221
157
|
}
|
|
222
158
|
this.log.debug('No IPv6 link-local address found');
|
|
223
|
-
// Try to find a unique local address
|
|
224
159
|
const ulaAddress = addresses?.find((addr) => addr.family === 'IPv6' && !addr.internal && addr.address.startsWith('fd') && addr.netmask === 'ffff:ffff:ffff:ffff::');
|
|
225
160
|
if (ulaAddress) {
|
|
226
161
|
this.log.debug('Found IPv6 Unique Local Addresses (ULA) unicast address');
|
|
227
162
|
return ulaAddress.address;
|
|
228
163
|
}
|
|
229
164
|
this.log.debug('No IPv6 Unique Local Addresses (ULA) unicast address found');
|
|
230
|
-
// Try to find a unique local address
|
|
231
165
|
const uniqueLocalAddress = addresses?.find((addr) => addr.family === 'IPv6' && !addr.internal && addr.address.startsWith('fd'));
|
|
232
166
|
if (uniqueLocalAddress) {
|
|
233
167
|
this.log.debug('Found IPv6 Unique Local Addresses (ULA) address');
|
|
@@ -236,11 +170,6 @@ export class Dgram extends EventEmitter {
|
|
|
236
170
|
this.log.debug('No IPv6 Unique Local Addresses (ULA) address found');
|
|
237
171
|
throw new Error(`Interface ${networkInterface} does not have a suitable external IPv6 address`);
|
|
238
172
|
}
|
|
239
|
-
/**
|
|
240
|
-
* Retrieves the names of all available network interfaces.
|
|
241
|
-
*
|
|
242
|
-
* @returns {string[]} An array of network interface names.
|
|
243
|
-
*/
|
|
244
173
|
getInterfacesNames() {
|
|
245
174
|
const interfaces = os.networkInterfaces();
|
|
246
175
|
const interfaceNames = [];
|
|
@@ -251,12 +180,6 @@ export class Dgram extends EventEmitter {
|
|
|
251
180
|
}
|
|
252
181
|
return interfaceNames;
|
|
253
182
|
}
|
|
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
183
|
getIpv6ScopeId(interfaceName) {
|
|
261
184
|
const interfaces = os.networkInterfaces();
|
|
262
185
|
for (const name in interfaces) {
|
|
@@ -266,24 +189,17 @@ export class Dgram extends EventEmitter {
|
|
|
266
189
|
if (iface) {
|
|
267
190
|
const ipv6Address = iface.find((addr) => addr.family === 'IPv6' && !addr.internal && addr.scopeid);
|
|
268
191
|
if (ipv6Address) {
|
|
269
|
-
return process.platform === 'win32' ? '%' + String(ipv6Address.scopeid) : '%' + name;
|
|
192
|
+
return process.platform === 'win32' ? '%' + String(ipv6Address.scopeid) : '%' + name;
|
|
270
193
|
}
|
|
271
194
|
}
|
|
272
195
|
}
|
|
273
196
|
return '';
|
|
274
197
|
}
|
|
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
198
|
getInterfaceNameFromScopeId(scopeId) {
|
|
282
199
|
const nets = os.networkInterfaces();
|
|
283
200
|
for (const ifaceName in nets) {
|
|
284
201
|
const addresses = nets[ifaceName] || [];
|
|
285
202
|
for (const addr of addresses) {
|
|
286
|
-
// Check for IPv6 addresses with a matching scope id.
|
|
287
203
|
if (addr.family === 'IPv6' && addr.scopeid === scopeId) {
|
|
288
204
|
return ifaceName;
|
|
289
205
|
}
|
|
@@ -291,16 +207,8 @@ export class Dgram extends EventEmitter {
|
|
|
291
207
|
}
|
|
292
208
|
return undefined;
|
|
293
209
|
}
|
|
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
210
|
getNetmask(interfaceAddress) {
|
|
301
|
-
// Remove zone index if present (e.g. for IPv6 "fe80::1%eth0")
|
|
302
211
|
const noZoneAddress = interfaceAddress.includes('%') ? interfaceAddress.split('%')[0] : interfaceAddress;
|
|
303
|
-
// Iterate over all interfaces.
|
|
304
212
|
const nets = os.networkInterfaces();
|
|
305
213
|
for (const ifaceName in nets) {
|
|
306
214
|
const ifaceAddresses = nets[ifaceName];
|
|
@@ -314,13 +222,6 @@ export class Dgram extends EventEmitter {
|
|
|
314
222
|
}
|
|
315
223
|
return undefined;
|
|
316
224
|
}
|
|
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
225
|
getIpv4BroadcastAddress(ipAddress, netmask) {
|
|
325
226
|
if (!ipAddress || !netmask) {
|
|
326
227
|
return undefined;
|
|
@@ -330,17 +231,9 @@ export class Dgram extends EventEmitter {
|
|
|
330
231
|
const broadcastParts = ipParts.map((octet, i) => (octet & maskParts[i]) | (255 - maskParts[i]));
|
|
331
232
|
return broadcastParts.join('.');
|
|
332
233
|
}
|
|
333
|
-
/**
|
|
334
|
-
* Returns the broadcast IPv6 address.
|
|
335
|
-
*
|
|
336
|
-
* @returns {string} The broadcast IPv6 address, e.g. "ff02::1"
|
|
337
|
-
*/
|
|
338
234
|
getIpv6BroadcastAddress() {
|
|
339
235
|
return 'ff02::1';
|
|
340
236
|
}
|
|
341
|
-
/**
|
|
342
|
-
* Logs all available network interfaces and their details.
|
|
343
|
-
*/
|
|
344
237
|
listNetworkInterfaces() {
|
|
345
238
|
const interfaces = os.networkInterfaces();
|
|
346
239
|
for (const [name, addresses] of Object.entries(interfaces)) {
|
|
@@ -353,4 +246,3 @@ export class Dgram extends EventEmitter {
|
|
|
353
246
|
}
|
|
354
247
|
}
|
|
355
248
|
}
|
|
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
|