matterbridge 3.4.7-dev-20260104-6b10cee → 3.4.7-dev-20260112-a00b2bf
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 +6 -1
- package/README.md +5 -1
- package/dist/broadcastServer.d.ts +29 -0
- package/dist/broadcastServerTypes.d.ts +798 -0
- package/dist/cli.d.ts +6 -0
- package/dist/cliEmitter.d.ts +14 -0
- package/dist/cliHistory.d.ts +6 -0
- package/dist/clusters/export.d.ts +1 -0
- package/dist/deviceManager.d.ts +27 -0
- package/dist/devices/airConditioner.d.ts +23 -0
- package/dist/devices/batteryStorage.d.ts +5 -0
- package/dist/devices/cooktop.d.ts +6 -0
- package/dist/devices/dishwasher.d.ts +16 -0
- package/dist/devices/evse.d.ts +19 -0
- package/dist/devices/export.d.ts +16 -0
- package/dist/devices/extractorHood.d.ts +5 -0
- package/dist/devices/heatPump.d.ts +4 -0
- package/dist/devices/laundryDryer.d.ts +9 -0
- package/dist/devices/laundryWasher.d.ts +17 -0
- package/dist/devices/microwaveOven.d.ts +92 -0
- package/dist/devices/oven.d.ts +23 -0
- package/dist/devices/refrigerator.d.ts +18 -0
- package/dist/devices/roboticVacuumCleaner.d.ts +29 -0
- package/dist/devices/solarPower.d.ts +4 -0
- package/dist/devices/speaker.d.ts +8 -0
- package/dist/devices/temperatureControl.d.ts +145 -0
- package/dist/devices/waterHeater.d.ts +37 -0
- package/dist/dgram/coap.d.ts +34 -0
- package/dist/dgram/dgram.d.ts +45 -0
- package/dist/dgram/dgram.js +4 -1
- package/dist/dgram/mb_coap.d.ts +1 -0
- package/dist/dgram/mb_coap.js +1 -2
- package/dist/dgram/mb_mdns.d.ts +1 -0
- package/dist/dgram/mb_mdns.js +39 -50
- package/dist/dgram/mdns.d.ts +188 -0
- package/dist/dgram/multicast.d.ts +18 -0
- package/dist/dgram/unicast.d.ts +11 -0
- package/dist/frontend.d.ts +58 -0
- package/dist/frontendTypes.d.ts +472 -0
- package/dist/helpers.d.ts +5 -0
- package/dist/index.d.ts +11 -0
- package/dist/jestutils/export.d.ts +1 -0
- package/dist/jestutils/jestHelpers.d.ts +90 -0
- package/dist/logger/export.d.ts +1 -0
- package/dist/matter/behaviors.d.ts +1 -0
- package/dist/matter/clusters.d.ts +1 -0
- package/dist/matter/devices.d.ts +1 -0
- package/dist/matter/endpoints.d.ts +1 -0
- package/dist/matter/export.d.ts +4 -0
- package/dist/matter/types.d.ts +2 -0
- package/dist/matterNode.d.ts +84 -0
- package/dist/matterbridge.d.ts +152 -0
- package/dist/matterbridgeAccessoryPlatform.d.ts +5 -0
- package/dist/matterbridgeBehaviors.d.ts +2380 -0
- package/dist/matterbridgeDeviceTypes.d.ts +95 -0
- package/dist/matterbridgeDynamicPlatform.d.ts +5 -0
- package/dist/matterbridgeEndpoint.d.ts +175 -0
- package/dist/matterbridgeEndpointHelpers.d.ts +362 -0
- package/dist/matterbridgeEndpointTypes.d.ts +96 -0
- package/dist/matterbridgePlatform.d.ts +114 -0
- package/dist/matterbridgeTypes.d.ts +206 -0
- package/dist/pluginManager.d.ts +67 -0
- package/dist/shelly.d.ts +24 -0
- package/dist/storage/export.d.ts +1 -0
- package/dist/update.d.ts +9 -0
- package/dist/utils/colorUtils.d.ts +24 -0
- package/dist/utils/commandLine.d.ts +6 -0
- package/dist/utils/copyDirectory.d.ts +2 -0
- package/dist/utils/createDirectory.d.ts +2 -0
- package/dist/utils/createZip.d.ts +1 -0
- package/dist/utils/deepCopy.d.ts +1 -0
- package/dist/utils/deepEqual.d.ts +1 -0
- package/dist/utils/error.d.ts +3 -0
- package/dist/utils/export.d.ts +12 -0
- package/dist/utils/format.d.ts +4 -0
- package/dist/utils/hex.d.ts +4 -0
- package/dist/utils/inspector.d.ts +24 -0
- package/dist/utils/isValid.d.ts +10 -0
- package/dist/utils/network.d.ts +25 -0
- package/dist/utils/spawn.d.ts +1 -0
- package/dist/utils/tracker.d.ts +52 -0
- package/dist/utils/wait.d.ts +3 -0
- package/dist/workerGlobalPrefix.d.ts +1 -0
- package/dist/workerTypes.d.ts +27 -0
- package/dist/workers.d.ts +8 -0
- package/npm-shrinkwrap.json +904 -131
- package/package.json +9 -2
- package/packages/dgram/dist/coap.d.ts +34 -0
- package/packages/dgram/dist/coap.js +252 -0
- package/packages/dgram/dist/dgram.d.ts +45 -0
- package/packages/dgram/dist/dgram.js +255 -0
- package/packages/dgram/dist/export.d.ts +5 -0
- package/packages/dgram/dist/export.js +5 -0
- package/packages/dgram/dist/mdns.d.ts +188 -0
- package/packages/dgram/dist/mdns.js +702 -0
- package/packages/dgram/dist/multicast.d.ts +18 -0
- package/packages/dgram/dist/multicast.js +119 -0
- package/packages/dgram/dist/unicast.d.ts +11 -0
- package/packages/dgram/dist/unicast.js +40 -0
- package/packages/dgram/package.json +106 -0
- package/packages/jest-utils/LICENSE +202 -0
- package/packages/jest-utils/bmc-button.svg +22 -0
- package/packages/jest-utils/dist/export.d.ts +1 -0
- package/packages/jest-utils/dist/export.js +1 -0
- package/packages/jest-utils/matterbridge.svg +50 -0
- package/packages/{mb-lib-test → jest-utils}/package.json +12 -10
- package/packages/utils/LICENSE +202 -0
- package/packages/utils/bmc-button.svg +22 -0
- package/packages/utils/dist/colorUtils.d.ts +24 -0
- package/packages/utils/dist/colorUtils.js +187 -0
- package/packages/utils/dist/commandLine.d.ts +6 -0
- package/packages/utils/dist/commandLine.js +63 -0
- package/packages/utils/dist/copyDirectory.d.ts +2 -0
- package/packages/utils/dist/copyDirectory.js +39 -0
- package/packages/utils/dist/createDirectory.d.ts +2 -0
- package/packages/utils/dist/createDirectory.js +21 -0
- package/packages/utils/dist/createZip.d.ts +1 -0
- package/packages/utils/dist/createZip.js +69 -0
- package/packages/utils/dist/deepCopy.d.ts +1 -0
- package/packages/utils/dist/deepCopy.js +40 -0
- package/packages/utils/dist/deepEqual.d.ts +1 -0
- package/packages/utils/dist/deepEqual.js +58 -0
- package/packages/utils/dist/error.d.ts +3 -0
- package/packages/utils/dist/error.js +12 -0
- package/packages/utils/dist/export.d.ts +15 -0
- package/packages/utils/dist/export.js +15 -0
- package/packages/utils/dist/format.d.ts +4 -0
- package/packages/utils/dist/format.js +29 -0
- package/packages/utils/dist/githubVersion.d.ts +11 -0
- package/packages/utils/dist/githubVersion.js +37 -0
- package/packages/utils/dist/hex.d.ts +4 -0
- package/packages/utils/dist/hex.js +118 -0
- package/packages/utils/dist/inspector.d.ts +24 -0
- package/packages/utils/dist/inspector.js +200 -0
- package/packages/utils/dist/isValid.d.ts +10 -0
- package/packages/utils/dist/isValid.js +69 -0
- package/packages/utils/dist/network.d.ts +12 -0
- package/packages/utils/dist/network.js +105 -0
- package/packages/utils/dist/npmRoot.d.ts +1 -0
- package/packages/utils/dist/npmRoot.js +13 -0
- package/packages/utils/dist/npmVersion.d.ts +1 -0
- package/packages/utils/dist/npmVersion.js +43 -0
- package/packages/utils/dist/tracker.d.ts +52 -0
- package/packages/utils/dist/tracker.js +201 -0
- package/packages/utils/dist/wait.d.ts +3 -0
- package/packages/utils/dist/wait.js +73 -0
- package/packages/utils/matterbridge.svg +50 -0
- package/packages/utils/package.json +106 -0
- package/packages/vitest-utils/LICENSE +202 -0
- package/packages/vitest-utils/bmc-button.svg +22 -0
- package/packages/vitest-utils/dist/export.d.ts +1 -0
- package/packages/vitest-utils/dist/export.js +1 -0
- package/packages/vitest-utils/matterbridge.svg +50 -0
- package/packages/vitest-utils/package.json +108 -0
- package/reflector/Reflector.md +17 -8
- package/dist/dgram/mdnsReflectorClient.js +0 -176
- package/dist/dgram/mdnsReflectorServer.js +0 -301
- package/dist/dgram/mdnsReflectorTypes.js +0 -5
- package/packages/mb-lib-test/dist/module.d.ts +0 -2
- package/packages/mb-lib-test/dist/module.js +0 -2
- /package/packages/{mb-lib-test → dgram}/LICENSE +0 -0
- /package/packages/{mb-lib-test → dgram}/bmc-button.svg +0 -0
- /package/packages/{mb-lib-test → dgram}/matterbridge.svg +0 -0
- /package/packages/{mb-lib-test/dist/jestutils → jest-utils/dist}/jestHelpers.d.ts +0 -0
- /package/packages/{mb-lib-test/dist/jestutils → jest-utils/dist}/jestHelpers.js +0 -0
- /package/packages/{mb-lib-test/dist/vitestutils → vitest-utils/dist}/vitestHelpers.d.ts +0 -0
- /package/packages/{mb-lib-test/dist/vitestutils → vitest-utils/dist}/vitestHelpers.js +0 -0
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import dgram from 'node:dgram';
|
|
2
|
+
import EventEmitter from 'node:events';
|
|
3
|
+
import { AddressInfo } from 'node:net';
|
|
4
|
+
import { AnsiLogger } from 'node-ansi-logger';
|
|
5
|
+
export interface DgramEvents {
|
|
6
|
+
error: [error: Error];
|
|
7
|
+
close: [];
|
|
8
|
+
connect: [];
|
|
9
|
+
message: [msg: Buffer, rinfo: dgram.RemoteInfo];
|
|
10
|
+
listening: [address: AddressInfo];
|
|
11
|
+
sent: [msg: Buffer, serverAddress: string, serverPort: number];
|
|
12
|
+
ready: [address: AddressInfo];
|
|
13
|
+
bound: [address: AddressInfo];
|
|
14
|
+
}
|
|
15
|
+
export declare class Dgram extends EventEmitter<DgramEvents> {
|
|
16
|
+
verbose: boolean;
|
|
17
|
+
debug: boolean;
|
|
18
|
+
silent: boolean;
|
|
19
|
+
log: AnsiLogger;
|
|
20
|
+
socket: dgram.Socket;
|
|
21
|
+
bound: boolean;
|
|
22
|
+
socketType: 'udp4' | 'udp6';
|
|
23
|
+
interfaceName?: string;
|
|
24
|
+
interfaceAddress?: string;
|
|
25
|
+
interfaceNetmask?: string;
|
|
26
|
+
excludedInterfaceNamePattern: RegExp;
|
|
27
|
+
constructor(name: string, socketType: 'udp4' | 'udp6', reuseAddr?: boolean | undefined, interfaceName?: string, interfaceAddress?: string);
|
|
28
|
+
send(msg: Buffer, serverAddress: string, serverPort: number): void;
|
|
29
|
+
onError(error: Error): void;
|
|
30
|
+
onClose(): void;
|
|
31
|
+
onConnect(): void;
|
|
32
|
+
onSent(msg: Buffer, serverAddress: string, serverPort: number): void;
|
|
33
|
+
onMessage(msg: Buffer, rinfo: dgram.RemoteInfo): void;
|
|
34
|
+
onListening(address: AddressInfo): void;
|
|
35
|
+
onReady(address: AddressInfo): void;
|
|
36
|
+
getIpv4InterfaceAddress(networkInterface?: string): string | undefined;
|
|
37
|
+
getIpv6InterfaceAddress(networkInterface?: string): string | undefined;
|
|
38
|
+
getInterfacesNames(): string[];
|
|
39
|
+
getIpv6ScopeId(interfaceName?: string): string;
|
|
40
|
+
getInterfaceNameFromScopeId(scopeId: number): string | undefined;
|
|
41
|
+
getNetmask(interfaceAddress: string): string | undefined;
|
|
42
|
+
getIpv4BroadcastAddress(ipAddress: string | undefined, netmask: string | undefined): string | undefined;
|
|
43
|
+
getIpv6BroadcastAddress(): string;
|
|
44
|
+
listNetworkInterfaces(): void;
|
|
45
|
+
}
|
package/dist/dgram/dgram.js
CHANGED
|
@@ -14,6 +14,7 @@ export class Dgram extends EventEmitter {
|
|
|
14
14
|
interfaceName;
|
|
15
15
|
interfaceAddress;
|
|
16
16
|
interfaceNetmask;
|
|
17
|
+
excludedInterfaceNamePattern = /(tailscale|wireguard|wintun|openvpn|\bwg\d*\b|\btun\d*\b|\btap\d*\b|\butun\d*\b|zerotier|hamachi|hyper-?v|v\s*ethernet|wsl|default switch|vmware|vmnet|vbox|virtualbox|virbr|docker|podman|\bveth\b|\bbr-\b|cni|kube|flannel|calico|teredo|isatap)/i;
|
|
17
18
|
constructor(name, socketType, reuseAddr = true, interfaceName, interfaceAddress) {
|
|
18
19
|
super();
|
|
19
20
|
this.log = new AnsiLogger({ logName: name, logTimestampFormat: 4, logLevel: this.debug ? "debug" : this.silent ? "notice" : "info" });
|
|
@@ -98,7 +99,7 @@ export class Dgram extends EventEmitter {
|
|
|
98
99
|
}
|
|
99
100
|
if (!networkInterface) {
|
|
100
101
|
for (const [interfaceName, interfaceDetails] of Object.entries(interfaces)) {
|
|
101
|
-
if (
|
|
102
|
+
if (!networkInterface && this.excludedInterfaceNamePattern.test(interfaceName))
|
|
102
103
|
continue;
|
|
103
104
|
if (!interfaceDetails)
|
|
104
105
|
continue;
|
|
@@ -185,6 +186,8 @@ export class Dgram extends EventEmitter {
|
|
|
185
186
|
for (const name in interfaces) {
|
|
186
187
|
if (interfaceName && name !== interfaceName)
|
|
187
188
|
continue;
|
|
189
|
+
if (!interfaceName && this.excludedInterfaceNamePattern.test(name))
|
|
190
|
+
continue;
|
|
188
191
|
const iface = interfaces[name];
|
|
189
192
|
if (iface) {
|
|
190
193
|
const ipv6Address = iface.find((addr) => addr.family === 'IPv6' && !addr.internal && addr.scopeid);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
package/dist/dgram/mb_coap.js
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import { COAP_MULTICAST_IPV4_ADDRESS, COAP_MULTICAST_IPV6_ADDRESS, COAP_MULTICAST_PORT } from '
|
|
2
|
-
import { Coap, COAP_OPTION_URI_PATH } from './coap.js';
|
|
1
|
+
import { COAP_MULTICAST_IPV4_ADDRESS, COAP_MULTICAST_IPV6_ADDRESS, COAP_MULTICAST_PORT, Coap, COAP_OPTION_URI_PATH } from '@matterbridge/dgram';
|
|
3
2
|
{
|
|
4
3
|
const coapIpv4 = new Coap('CoAP Server udp4', COAP_MULTICAST_IPV4_ADDRESS, COAP_MULTICAST_PORT, 'udp4', true);
|
|
5
4
|
const coapIpv6 = new Coap('CoAP Server udp6', COAP_MULTICAST_IPV6_ADDRESS, COAP_MULTICAST_PORT, 'udp6', true);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
package/dist/dgram/mb_mdns.js
CHANGED
|
@@ -1,9 +1,6 @@
|
|
|
1
1
|
import os from 'node:os';
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import { Mdns } from './mdns.js';
|
|
5
|
-
import { MdnsReflectorClient } from './mdnsReflectorClient.js';
|
|
6
|
-
import { MdnsReflectorServer } from './mdnsReflectorServer.js';
|
|
2
|
+
import { MDNS_MULTICAST_IPV4_ADDRESS, MDNS_MULTICAST_IPV6_ADDRESS, MDNS_MULTICAST_PORT, Mdns } from '@matterbridge/dgram';
|
|
3
|
+
import { getIntParameter, getParameter, getStringArrayParameter, hasParameter } from '@matterbridge/utils';
|
|
7
4
|
{
|
|
8
5
|
if (hasParameter('h') || hasParameter('help')) {
|
|
9
6
|
console.log(`Copyright (c) Matterbridge. All rights reserved. Version 1.0.0.\n`);
|
|
@@ -24,14 +21,6 @@ Options:
|
|
|
24
21
|
--noIpv4 Disable IPv4 mDNS server (default: enabled).
|
|
25
22
|
--noIpv6 Disable IPv6 mDNS server (default: enabled).
|
|
26
23
|
--no-timeout Disable automatic timeout of 10 minutes. Reflector mode disables timeout automatically.
|
|
27
|
-
--reflector-client Enable mDNS reflector client (default: disabled).
|
|
28
|
-
--filter <string[]> Filters to apply to incoming mDNS messages.
|
|
29
|
-
--localhost Use localhost addresses to send messages to the container.
|
|
30
|
-
--reflector-server Enable mDNS reflector server (default: disabled).
|
|
31
|
-
--filter <string[]> Filters to apply to incoming mDNS messages.
|
|
32
|
-
--broadcast Use broadcast addresses to reflect messages to the lan.
|
|
33
|
-
--localhost Use localhost addresses to reflect messages to the lan.
|
|
34
|
-
--share-with-clients Share messages between reflector clients.
|
|
35
24
|
-d, --debug Enable debug logging (default: disabled).
|
|
36
25
|
-v, --verbose Enable verbose logging (default: disabled).
|
|
37
26
|
-s, --silent Enable silent mode, only log notices, warnings and errors.
|
|
@@ -64,8 +53,6 @@ Examples:
|
|
|
64
53
|
let mdnsIpv6AdvertiseInterval;
|
|
65
54
|
let mdnsIpv4 = undefined;
|
|
66
55
|
let mdnsIpv6 = undefined;
|
|
67
|
-
let reflectorClient = undefined;
|
|
68
|
-
let reflectorServer = undefined;
|
|
69
56
|
async function cleanupAndLogAndExit() {
|
|
70
57
|
clearInterval(mdnsIpv4QueryInterval);
|
|
71
58
|
clearInterval(mdnsIpv6QueryInterval);
|
|
@@ -83,21 +70,25 @@ Examples:
|
|
|
83
70
|
mdnsIpv4?.logDevices();
|
|
84
71
|
mdnsIpv6?.logDevices();
|
|
85
72
|
await new Promise((resolve) => setTimeout(resolve, 250));
|
|
86
|
-
await reflectorClient?.stop();
|
|
87
|
-
await reflectorServer?.stop();
|
|
88
73
|
}
|
|
89
74
|
const query = (mdns) => {
|
|
90
75
|
mdns.log.info('Sending mDNS query for common services...');
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
76
|
+
try {
|
|
77
|
+
mdns.sendQuery([
|
|
78
|
+
{ name: '_matterc._udp.local', type: 12, class: 1, unicastResponse: true },
|
|
79
|
+
{ name: '_matter._tcp.local', type: 12, class: 1, unicastResponse: true },
|
|
80
|
+
{ name: '_matterbridge._tcp.local', type: 12, class: 1, unicastResponse: true },
|
|
81
|
+
{ name: '_home-assistant._tcp.local', type: 12, class: 1, unicastResponse: true },
|
|
82
|
+
{ name: '_shelly._tcp.local', type: 12, class: 1, unicastResponse: true },
|
|
83
|
+
{ name: '_mqtt._tcp.local', type: 12, class: 1, unicastResponse: true },
|
|
84
|
+
{ name: '_http._tcp.local', type: 12, class: 1, unicastResponse: true },
|
|
85
|
+
{ name: '_googlecast._tcp.local', type: 12, class: 1, unicastResponse: true },
|
|
86
|
+
{ name: '_services._dns-sd._udp.local', type: 12, class: 1, unicastResponse: true },
|
|
87
|
+
]);
|
|
88
|
+
}
|
|
89
|
+
catch (error) {
|
|
90
|
+
mdns.log.error(`Error sending mDNS query: ${error.message}`);
|
|
91
|
+
}
|
|
101
92
|
};
|
|
102
93
|
const advertise = (mdns, ttl = 120) => {
|
|
103
94
|
mdns.log.info(`Sending mDNS advertisement for matterbridge service with TTL ${ttl ? ttl.toString() : 'goodbye'}...`);
|
|
@@ -135,30 +126,33 @@ Examples:
|
|
|
135
126
|
}
|
|
136
127
|
}
|
|
137
128
|
}
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
answers.push({ name: hostName, rtype: 1, rclass: 1 | 32768, ttl, rdata: mdns.encodeA(ipv4) });
|
|
143
|
-
}
|
|
144
|
-
else if (info.family === 'IPv6' && !info.internal) {
|
|
145
|
-
const ipv6 = info.address;
|
|
146
|
-
answers.push({ name: hostName, rtype: 28, rclass: 1 | 32768, ttl, rdata: mdns.encodeAAAA(ipv6) });
|
|
147
|
-
}
|
|
129
|
+
for (const info of interfaceInfos) {
|
|
130
|
+
if (info.family === 'IPv4' && !info.internal) {
|
|
131
|
+
const ipv4 = info.address;
|
|
132
|
+
answers.push({ name: hostName, rtype: 1, rclass: 1 | 32768, ttl, rdata: mdns.encodeA(ipv4) });
|
|
148
133
|
}
|
|
134
|
+
else if (info.family === 'IPv6' && !info.internal) {
|
|
135
|
+
const ipv6 = info.address;
|
|
136
|
+
answers.push({ name: hostName, rtype: 28, rclass: 1 | 32768, ttl, rdata: mdns.encodeAAAA(ipv6) });
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
try {
|
|
140
|
+
mdns.sendResponse(answers);
|
|
149
141
|
}
|
|
150
142
|
catch (error) {
|
|
151
|
-
mdns.log.error(`Error
|
|
143
|
+
mdns.log.error(`Error sending mDNS advertisement: ${error.message}`);
|
|
152
144
|
}
|
|
153
|
-
const _response = mdns.sendResponse(answers);
|
|
154
145
|
};
|
|
155
|
-
if (!hasParameter('noIpv4')
|
|
146
|
+
if (!hasParameter('noIpv4')) {
|
|
156
147
|
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'));
|
|
157
148
|
if (hasParameter('v') || hasParameter('verbose'))
|
|
158
149
|
mdnsIpv4.listNetworkInterfaces();
|
|
159
150
|
const filters = getStringArrayParameter('filter');
|
|
160
151
|
if (filters)
|
|
161
152
|
mdnsIpv4.filters.push(...filters);
|
|
153
|
+
mdnsIpv4.on('error', (err) => {
|
|
154
|
+
mdnsIpv4?.log.error(`mDNS udp4 Server error: ${err.message}\n${err.stack}`);
|
|
155
|
+
});
|
|
162
156
|
mdnsIpv4.start();
|
|
163
157
|
mdnsIpv4.on('ready', (address) => {
|
|
164
158
|
mdnsIpv4?.socket.setMulticastLoopback(false);
|
|
@@ -173,13 +167,16 @@ Examples:
|
|
|
173
167
|
}
|
|
174
168
|
});
|
|
175
169
|
}
|
|
176
|
-
if (!hasParameter('noIpv6')
|
|
170
|
+
if (!hasParameter('noIpv6')) {
|
|
177
171
|
mdnsIpv6 = new Mdns('mDNS Server udp6', MDNS_MULTICAST_IPV6_ADDRESS, MDNS_MULTICAST_PORT, 'udp6', true, getParameter('interfaceName'), getParameter('ipv6InterfaceAddress') || '::', getParameter('outgoingIpv6InterfaceAddress'));
|
|
178
172
|
if (hasParameter('v') || hasParameter('verbose'))
|
|
179
173
|
mdnsIpv6.listNetworkInterfaces();
|
|
180
174
|
const filters = getStringArrayParameter('filter');
|
|
181
175
|
if (filters)
|
|
182
176
|
mdnsIpv6.filters.push(...filters);
|
|
177
|
+
mdnsIpv6.on('error', (err) => {
|
|
178
|
+
mdnsIpv6?.log.error(`mDNS udp6 Server error: ${err.message}\n${err.stack}`);
|
|
179
|
+
});
|
|
183
180
|
mdnsIpv6.start();
|
|
184
181
|
mdnsIpv6.on('ready', (address) => {
|
|
185
182
|
mdnsIpv6?.socket.setMulticastLoopback(false);
|
|
@@ -194,21 +191,13 @@ Examples:
|
|
|
194
191
|
}
|
|
195
192
|
});
|
|
196
193
|
}
|
|
197
|
-
if (hasParameter('reflector-client')) {
|
|
198
|
-
reflectorClient = new MdnsReflectorClient();
|
|
199
|
-
await reflectorClient.start();
|
|
200
|
-
}
|
|
201
|
-
if (hasParameter('reflector-server')) {
|
|
202
|
-
reflectorServer = new MdnsReflectorServer();
|
|
203
|
-
await reflectorServer.start();
|
|
204
|
-
}
|
|
205
194
|
process.on('SIGINT', async () => {
|
|
206
195
|
await cleanupAndLogAndExit();
|
|
207
196
|
});
|
|
208
197
|
process.on('SIGTERM', async () => {
|
|
209
198
|
await cleanupAndLogAndExit();
|
|
210
199
|
});
|
|
211
|
-
if (!hasParameter('no-timeout')
|
|
200
|
+
if (!hasParameter('no-timeout')) {
|
|
212
201
|
setTimeout(async () => {
|
|
213
202
|
await cleanupAndLogAndExit();
|
|
214
203
|
}, 600000).unref();
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
import dgram from 'node:dgram';
|
|
2
|
+
import { AnsiLogger } from 'node-ansi-logger';
|
|
3
|
+
import { Multicast } from './multicast.js';
|
|
4
|
+
export declare const enum DnsRecordType {
|
|
5
|
+
A = 1,
|
|
6
|
+
NS = 2,
|
|
7
|
+
MD = 3,
|
|
8
|
+
MF = 4,
|
|
9
|
+
CNAME = 5,
|
|
10
|
+
SOA = 6,
|
|
11
|
+
MB = 7,
|
|
12
|
+
MG = 8,
|
|
13
|
+
MR = 9,
|
|
14
|
+
NULL = 10,
|
|
15
|
+
WKS = 11,
|
|
16
|
+
PTR = 12,
|
|
17
|
+
HINFO = 13,
|
|
18
|
+
MINFO = 14,
|
|
19
|
+
MX = 15,
|
|
20
|
+
TXT = 16,
|
|
21
|
+
RP = 17,
|
|
22
|
+
AFSDB = 18,
|
|
23
|
+
X25 = 19,
|
|
24
|
+
ISDN = 20,
|
|
25
|
+
RT = 21,
|
|
26
|
+
NSAP = 22,
|
|
27
|
+
NSAP_PTR = 23,
|
|
28
|
+
SIG = 24,
|
|
29
|
+
KEY = 25,
|
|
30
|
+
PX = 26,
|
|
31
|
+
GPOS = 27,
|
|
32
|
+
AAAA = 28,
|
|
33
|
+
LOC = 29,
|
|
34
|
+
NXT = 30,
|
|
35
|
+
EID = 31,
|
|
36
|
+
NIMLOC = 32,
|
|
37
|
+
SRV = 33,
|
|
38
|
+
ATMA = 34,
|
|
39
|
+
NAPTR = 35,
|
|
40
|
+
KX = 36,
|
|
41
|
+
CERT = 37,
|
|
42
|
+
A6 = 38,
|
|
43
|
+
DNAME = 39,
|
|
44
|
+
SINK = 40,
|
|
45
|
+
OPT = 41,
|
|
46
|
+
APL = 42,
|
|
47
|
+
DS = 43,
|
|
48
|
+
SSHFP = 44,
|
|
49
|
+
IPSECKEY = 45,
|
|
50
|
+
RRSIG = 46,
|
|
51
|
+
NSEC = 47,
|
|
52
|
+
DNSKEY = 48,
|
|
53
|
+
DHCID = 49,
|
|
54
|
+
NSEC3 = 50,
|
|
55
|
+
NSEC3PARAM = 51,
|
|
56
|
+
TLSA = 52,
|
|
57
|
+
SMIMEA = 53,
|
|
58
|
+
HIP = 55,
|
|
59
|
+
NINFO = 56,
|
|
60
|
+
RKEY = 57,
|
|
61
|
+
TALINK = 58,
|
|
62
|
+
CDS = 59,
|
|
63
|
+
CDNSKEY = 60,
|
|
64
|
+
OPENPGPKEY = 61,
|
|
65
|
+
CSYNC = 62,
|
|
66
|
+
ZONEMD = 63,
|
|
67
|
+
SVCB = 64,
|
|
68
|
+
HTTPS = 65,
|
|
69
|
+
SPF = 99,
|
|
70
|
+
UINFO = 100,
|
|
71
|
+
UID = 101,
|
|
72
|
+
GID = 102,
|
|
73
|
+
UNSPEC = 103,
|
|
74
|
+
NID = 104,
|
|
75
|
+
L32 = 105,
|
|
76
|
+
L64 = 106,
|
|
77
|
+
LP = 107,
|
|
78
|
+
EUI48 = 108,
|
|
79
|
+
EUI64 = 109,
|
|
80
|
+
TKEY = 249,
|
|
81
|
+
TSIG = 250,
|
|
82
|
+
IXFR = 251,
|
|
83
|
+
AXFR = 252,
|
|
84
|
+
MAILB = 253,
|
|
85
|
+
MAILA = 254,
|
|
86
|
+
ANY = 255,
|
|
87
|
+
URI = 256,
|
|
88
|
+
CAA = 257,
|
|
89
|
+
AVC = 258,
|
|
90
|
+
DOA = 259,
|
|
91
|
+
AMTRELAY = 260,
|
|
92
|
+
ZONEVERSION = 261,
|
|
93
|
+
TA = 32768,
|
|
94
|
+
DLV = 32769
|
|
95
|
+
}
|
|
96
|
+
export declare const enum DnsClass {
|
|
97
|
+
IN = 1,
|
|
98
|
+
CH = 3,
|
|
99
|
+
HS = 4,
|
|
100
|
+
ANY = 255
|
|
101
|
+
}
|
|
102
|
+
export declare const enum DnsClassFlag {
|
|
103
|
+
FLUSH = 32768,
|
|
104
|
+
QU = 32768
|
|
105
|
+
}
|
|
106
|
+
export interface MdnsMessage {
|
|
107
|
+
id: number;
|
|
108
|
+
qr: number;
|
|
109
|
+
opcode: number;
|
|
110
|
+
aa: boolean;
|
|
111
|
+
tc: boolean;
|
|
112
|
+
rd: boolean;
|
|
113
|
+
ra: boolean;
|
|
114
|
+
z: number;
|
|
115
|
+
rcode: number;
|
|
116
|
+
qdCount: number;
|
|
117
|
+
anCount: number;
|
|
118
|
+
nsCount: number;
|
|
119
|
+
arCount: number;
|
|
120
|
+
questions?: DnsQuestion[];
|
|
121
|
+
answers?: MdnsRecord[];
|
|
122
|
+
authorities?: MdnsRecord[];
|
|
123
|
+
additionals?: MdnsRecord[];
|
|
124
|
+
}
|
|
125
|
+
interface DnsQuestion {
|
|
126
|
+
name: string;
|
|
127
|
+
type: number;
|
|
128
|
+
class: number;
|
|
129
|
+
}
|
|
130
|
+
interface MdnsRecord {
|
|
131
|
+
name: string;
|
|
132
|
+
type: number;
|
|
133
|
+
class: number;
|
|
134
|
+
ttl: number;
|
|
135
|
+
data: string;
|
|
136
|
+
}
|
|
137
|
+
export declare function isMdns(message: Buffer): boolean;
|
|
138
|
+
export declare function isMdnsQuery(message: Buffer): boolean;
|
|
139
|
+
export declare function isMdnsResponse(message: Buffer): boolean;
|
|
140
|
+
export declare class Mdns extends Multicast {
|
|
141
|
+
deviceQueries: Map<string, {
|
|
142
|
+
rinfo: dgram.RemoteInfo;
|
|
143
|
+
query: MdnsMessage;
|
|
144
|
+
}>;
|
|
145
|
+
deviceResponses: Map<string, {
|
|
146
|
+
rinfo: dgram.RemoteInfo;
|
|
147
|
+
response: MdnsMessage;
|
|
148
|
+
dataPTR?: string;
|
|
149
|
+
}>;
|
|
150
|
+
filters: string[];
|
|
151
|
+
constructor(name: string, multicastAddress: string, multicastPort: number, socketType: 'udp4' | 'udp6', reuseAddr?: boolean | undefined, interfaceName?: string, interfaceAddress?: string, outgoingInterfaceAddress?: string);
|
|
152
|
+
onQuery(rinfo: dgram.RemoteInfo, _query: MdnsMessage): void;
|
|
153
|
+
onResponse(rinfo: dgram.RemoteInfo, _response: MdnsMessage): void;
|
|
154
|
+
onMessage(msg: Buffer, rinfo: dgram.RemoteInfo): void;
|
|
155
|
+
decodeMdnsMessage(msg: Buffer): MdnsMessage;
|
|
156
|
+
decodeDnsName(msg: Buffer, offset: number): {
|
|
157
|
+
name: string;
|
|
158
|
+
newOffset: number;
|
|
159
|
+
};
|
|
160
|
+
encodeDnsName(name: string): Buffer;
|
|
161
|
+
encodeTxtRdata(txt: string[]): Buffer;
|
|
162
|
+
encodeSrvRdata(priority: number, weight: number, port: number, target: string): Buffer;
|
|
163
|
+
encodeA(ipv4: string): Buffer;
|
|
164
|
+
encodeAAAA(ipv6WithOptionalScope: string): Buffer;
|
|
165
|
+
decodeResourceRecord(msg: Buffer, offset: number): {
|
|
166
|
+
record: MdnsRecord;
|
|
167
|
+
newOffset: number;
|
|
168
|
+
};
|
|
169
|
+
sendQuery(questions: {
|
|
170
|
+
name: string;
|
|
171
|
+
type: number;
|
|
172
|
+
class: number;
|
|
173
|
+
unicastResponse?: boolean;
|
|
174
|
+
}[]): Buffer<ArrayBuffer>;
|
|
175
|
+
sendResponse(answers: {
|
|
176
|
+
name: string;
|
|
177
|
+
rtype: number;
|
|
178
|
+
rclass: number;
|
|
179
|
+
ttl: number;
|
|
180
|
+
rdata: Buffer;
|
|
181
|
+
}[]): Buffer<ArrayBuffer>;
|
|
182
|
+
dnsTypeToString(type: number): string;
|
|
183
|
+
dnsResponseClassToString(cls: number): string;
|
|
184
|
+
dnsQuestionClassToString(cls: number): string;
|
|
185
|
+
logMdnsMessage(msg: MdnsMessage, log?: AnsiLogger, text?: string): void;
|
|
186
|
+
logDevices(): void;
|
|
187
|
+
}
|
|
188
|
+
export {};
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { AddressInfo } from 'node:net';
|
|
2
|
+
import { Dgram } from './dgram.js';
|
|
3
|
+
export declare const MDNS_MULTICAST_IPV4_ADDRESS = "224.0.0.251";
|
|
4
|
+
export declare const MDNS_MULTICAST_IPV6_ADDRESS = "ff02::fb";
|
|
5
|
+
export declare const MDNS_MULTICAST_PORT = 5353;
|
|
6
|
+
export declare const COAP_MULTICAST_IPV4_ADDRESS = "224.0.1.187";
|
|
7
|
+
export declare const COAP_MULTICAST_IPV6_ADDRESS = "ff02::fd";
|
|
8
|
+
export declare const COAP_MULTICAST_PORT = 5683;
|
|
9
|
+
export declare class Multicast extends Dgram {
|
|
10
|
+
multicastAddress: string;
|
|
11
|
+
multicastPort: number;
|
|
12
|
+
outgoingInterfaceAddress: string | undefined;
|
|
13
|
+
joinedInterfaces: string[];
|
|
14
|
+
constructor(name: string, multicastAddress: string, multicastPort: number, socketType: 'udp4' | 'udp6', reuseAddr?: boolean | undefined, interfaceName?: string, interfaceAddress?: string, outgoingInterfaceAddress?: string);
|
|
15
|
+
start(): void;
|
|
16
|
+
onListening(address: AddressInfo): void;
|
|
17
|
+
stop(): void;
|
|
18
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { AddressInfo } from 'node:net';
|
|
2
|
+
import { RemoteInfo } from 'node:dgram';
|
|
3
|
+
import { Dgram } from './dgram.js';
|
|
4
|
+
export declare class Unicast extends Dgram {
|
|
5
|
+
port: number | undefined;
|
|
6
|
+
constructor(name: string, socketType: 'udp4' | 'udp6', reuseAddr?: boolean | undefined, interfaceName?: string, interfaceAddress?: string, port?: number);
|
|
7
|
+
start(): void;
|
|
8
|
+
onListening(address: AddressInfo): void;
|
|
9
|
+
onMessage(msg: Buffer, rinfo: RemoteInfo): void;
|
|
10
|
+
stop(): void;
|
|
11
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import EventEmitter from 'node:events';
|
|
2
|
+
import { LogLevel } from 'node-ansi-logger';
|
|
3
|
+
import { EndpointNumber } from '@matter/types/datatype';
|
|
4
|
+
import type { ApiMatter } from './matterbridgeTypes.js';
|
|
5
|
+
import type { Matterbridge } from './matterbridge.js';
|
|
6
|
+
import type { RefreshRequiredChanged, WsMessageBroadcast } from './frontendTypes.js';
|
|
7
|
+
interface FrontendEvents {
|
|
8
|
+
server_listening: [protocol: string, port: number, address?: string];
|
|
9
|
+
server_error: [error: Error];
|
|
10
|
+
server_stopped: [];
|
|
11
|
+
websocket_server_listening: [protocol: string];
|
|
12
|
+
websocket_server_stopped: [];
|
|
13
|
+
}
|
|
14
|
+
export declare class Frontend extends EventEmitter<FrontendEvents> {
|
|
15
|
+
private matterbridge;
|
|
16
|
+
private log;
|
|
17
|
+
private port;
|
|
18
|
+
private listening;
|
|
19
|
+
private storedPassword;
|
|
20
|
+
private expressApp;
|
|
21
|
+
private httpServer;
|
|
22
|
+
private httpsServer;
|
|
23
|
+
private webSocketServer;
|
|
24
|
+
private readonly server;
|
|
25
|
+
private readonly debug;
|
|
26
|
+
private readonly verbose;
|
|
27
|
+
constructor(matterbridge: Matterbridge);
|
|
28
|
+
destroy(): void;
|
|
29
|
+
private msgHandler;
|
|
30
|
+
set logLevel(logLevel: LogLevel);
|
|
31
|
+
start(port?: number): Promise<void>;
|
|
32
|
+
stop(): Promise<void>;
|
|
33
|
+
private getApiSettings;
|
|
34
|
+
private getReachability;
|
|
35
|
+
private getPowerSource;
|
|
36
|
+
private getBatteryLevel;
|
|
37
|
+
private getClusterTextFromDevice;
|
|
38
|
+
private getPlugins;
|
|
39
|
+
private getDevices;
|
|
40
|
+
private getClusters;
|
|
41
|
+
private generateDiagnostic;
|
|
42
|
+
private wsMessageHandler;
|
|
43
|
+
wssSendLogMessage(level: string, time: string, name: string, message: string): void;
|
|
44
|
+
wssSendRefreshRequired(changed: RefreshRequiredChanged, params?: {
|
|
45
|
+
matter: ApiMatter;
|
|
46
|
+
}): void;
|
|
47
|
+
wssSendRestartRequired(snackbar?: boolean, fixed?: boolean): void;
|
|
48
|
+
wssSendRestartNotRequired(snackbar?: boolean): void;
|
|
49
|
+
wssSendUpdateRequired(devVersion?: boolean): void;
|
|
50
|
+
wssSendCpuUpdate(cpuUsage: number, processCpuUsage: number): void;
|
|
51
|
+
wssSendMemoryUpdate(totalMemory: string, freeMemory: string, rss: string, heapTotal: string, heapUsed: string, external: string, arrayBuffers: string): void;
|
|
52
|
+
wssSendUptimeUpdate(systemUptime: string, processUptime: string): void;
|
|
53
|
+
wssSendSnackbarMessage(message: string, timeout?: number, severity?: 'info' | 'warning' | 'error' | 'success'): void;
|
|
54
|
+
wssSendCloseSnackbarMessage(message: string): void;
|
|
55
|
+
wssSendAttributeChangedMessage(plugin: string, serialNumber: string, uniqueId: string, number: EndpointNumber, id: string, cluster: string, attribute: string, value: number | string | boolean | null): void;
|
|
56
|
+
wssBroadcastMessage(msg: WsMessageBroadcast): void;
|
|
57
|
+
}
|
|
58
|
+
export {};
|