matterbridge 3.4.7-dev-20260104-6b10cee → 3.4.7-dev-20260112-bd9e311

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.
Files changed (172) hide show
  1. package/CHANGELOG.md +11 -4
  2. package/README.md +5 -1
  3. package/dist/broadcastServer.d.ts +29 -0
  4. package/dist/broadcastServerTypes.d.ts +798 -0
  5. package/dist/cli.d.ts +6 -0
  6. package/dist/cliEmitter.d.ts +14 -0
  7. package/dist/cliHistory.d.ts +6 -0
  8. package/dist/clusters/export.d.ts +1 -0
  9. package/dist/deviceManager.d.ts +27 -0
  10. package/dist/devices/airConditioner.d.ts +23 -0
  11. package/dist/devices/batteryStorage.d.ts +5 -0
  12. package/dist/devices/cooktop.d.ts +6 -0
  13. package/dist/devices/dishwasher.d.ts +16 -0
  14. package/dist/devices/evse.d.ts +19 -0
  15. package/dist/devices/export.d.ts +16 -0
  16. package/dist/devices/extractorHood.d.ts +5 -0
  17. package/dist/devices/heatPump.d.ts +4 -0
  18. package/dist/devices/laundryDryer.d.ts +9 -0
  19. package/dist/devices/laundryWasher.d.ts +17 -0
  20. package/dist/devices/microwaveOven.d.ts +92 -0
  21. package/dist/devices/oven.d.ts +23 -0
  22. package/dist/devices/refrigerator.d.ts +18 -0
  23. package/dist/devices/roboticVacuumCleaner.d.ts +29 -0
  24. package/dist/devices/solarPower.d.ts +4 -0
  25. package/dist/devices/speaker.d.ts +8 -0
  26. package/dist/devices/temperatureControl.d.ts +145 -0
  27. package/dist/devices/waterHeater.d.ts +37 -0
  28. package/dist/dgram/coap.d.ts +34 -0
  29. package/dist/dgram/dgram.d.ts +45 -0
  30. package/dist/dgram/dgram.js +5 -2
  31. package/dist/dgram/mb_coap.d.ts +1 -0
  32. package/dist/dgram/mb_coap.js +1 -2
  33. package/dist/dgram/mb_mdns.d.ts +1 -0
  34. package/dist/dgram/mb_mdns.js +39 -50
  35. package/dist/dgram/mdns.d.ts +188 -0
  36. package/dist/dgram/multicast.d.ts +18 -0
  37. package/dist/dgram/unicast.d.ts +11 -0
  38. package/dist/frontend.d.ts +58 -0
  39. package/dist/frontendTypes.d.ts +472 -0
  40. package/dist/helpers.d.ts +5 -0
  41. package/dist/index.d.ts +11 -0
  42. package/dist/jestutils/export.d.ts +1 -0
  43. package/dist/jestutils/jestHelpers.d.ts +90 -0
  44. package/dist/logger/export.d.ts +1 -0
  45. package/dist/matter/behaviors.d.ts +1 -0
  46. package/dist/matter/clusters.d.ts +1 -0
  47. package/dist/matter/devices.d.ts +1 -0
  48. package/dist/matter/endpoints.d.ts +1 -0
  49. package/dist/matter/export.d.ts +4 -0
  50. package/dist/matter/types.d.ts +2 -0
  51. package/dist/matterNode.d.ts +84 -0
  52. package/dist/matterbridge.d.ts +152 -0
  53. package/dist/matterbridgeAccessoryPlatform.d.ts +5 -0
  54. package/dist/matterbridgeBehaviors.d.ts +2380 -0
  55. package/dist/matterbridgeDeviceTypes.d.ts +95 -0
  56. package/dist/matterbridgeDynamicPlatform.d.ts +5 -0
  57. package/dist/matterbridgeEndpoint.d.ts +175 -0
  58. package/dist/matterbridgeEndpointHelpers.d.ts +362 -0
  59. package/dist/matterbridgeEndpointTypes.d.ts +96 -0
  60. package/dist/matterbridgePlatform.d.ts +114 -0
  61. package/dist/matterbridgeTypes.d.ts +206 -0
  62. package/dist/pluginManager.d.ts +67 -0
  63. package/dist/shelly.d.ts +24 -0
  64. package/dist/storage/export.d.ts +1 -0
  65. package/dist/update.d.ts +9 -0
  66. package/dist/utils/colorUtils.d.ts +24 -0
  67. package/dist/utils/commandLine.d.ts +6 -0
  68. package/dist/utils/copyDirectory.d.ts +2 -0
  69. package/dist/utils/createDirectory.d.ts +2 -0
  70. package/dist/utils/createZip.d.ts +1 -0
  71. package/dist/utils/deepCopy.d.ts +1 -0
  72. package/dist/utils/deepEqual.d.ts +1 -0
  73. package/dist/utils/error.d.ts +3 -0
  74. package/dist/utils/export.d.ts +12 -0
  75. package/dist/utils/format.d.ts +4 -0
  76. package/dist/utils/hex.d.ts +4 -0
  77. package/dist/utils/inspector.d.ts +24 -0
  78. package/dist/utils/isValid.d.ts +10 -0
  79. package/dist/utils/network.d.ts +25 -0
  80. package/dist/utils/spawn.d.ts +1 -0
  81. package/dist/utils/tracker.d.ts +52 -0
  82. package/dist/utils/wait.d.ts +3 -0
  83. package/dist/workerGlobalPrefix.d.ts +1 -0
  84. package/dist/workerTypes.d.ts +27 -0
  85. package/dist/workers.d.ts +8 -0
  86. package/npm-shrinkwrap.json +1109 -330
  87. package/package.json +9 -2
  88. package/packages/dgram/dist/coap.d.ts +34 -0
  89. package/packages/dgram/dist/coap.js +252 -0
  90. package/packages/dgram/dist/dgram.d.ts +45 -0
  91. package/packages/dgram/dist/dgram.js +255 -0
  92. package/packages/dgram/dist/export.d.ts +5 -0
  93. package/packages/dgram/dist/export.js +5 -0
  94. package/packages/dgram/dist/mdns.d.ts +188 -0
  95. package/packages/dgram/dist/mdns.js +702 -0
  96. package/packages/dgram/dist/multicast.d.ts +18 -0
  97. package/packages/dgram/dist/multicast.js +119 -0
  98. package/packages/dgram/dist/unicast.d.ts +11 -0
  99. package/packages/dgram/dist/unicast.js +40 -0
  100. package/packages/dgram/package.json +110 -0
  101. package/packages/jest-utils/LICENSE +202 -0
  102. package/packages/jest-utils/bmc-button.svg +22 -0
  103. package/packages/jest-utils/dist/export.d.ts +1 -0
  104. package/packages/jest-utils/dist/export.js +1 -0
  105. package/packages/jest-utils/matterbridge.svg +50 -0
  106. package/packages/{mb-lib-test → jest-utils}/package.json +18 -15
  107. package/packages/utils/LICENSE +202 -0
  108. package/packages/utils/bmc-button.svg +22 -0
  109. package/packages/utils/dist/colorUtils.d.ts +24 -0
  110. package/packages/utils/dist/colorUtils.js +187 -0
  111. package/packages/utils/dist/commandLine.d.ts +6 -0
  112. package/packages/utils/dist/commandLine.js +63 -0
  113. package/packages/utils/dist/copyDirectory.d.ts +2 -0
  114. package/packages/utils/dist/copyDirectory.js +39 -0
  115. package/packages/utils/dist/createDirectory.d.ts +2 -0
  116. package/packages/utils/dist/createDirectory.js +21 -0
  117. package/packages/utils/dist/createZip.d.ts +1 -0
  118. package/packages/utils/dist/createZip.js +69 -0
  119. package/packages/utils/dist/deepCopy.d.ts +1 -0
  120. package/packages/utils/dist/deepCopy.js +40 -0
  121. package/packages/utils/dist/deepEqual.d.ts +1 -0
  122. package/packages/utils/dist/deepEqual.js +58 -0
  123. package/packages/utils/dist/error.d.ts +3 -0
  124. package/packages/utils/dist/error.js +12 -0
  125. package/packages/utils/dist/export.d.ts +15 -0
  126. package/packages/utils/dist/export.js +15 -0
  127. package/packages/utils/dist/format.d.ts +4 -0
  128. package/packages/utils/dist/format.js +29 -0
  129. package/packages/utils/dist/githubVersion.d.ts +11 -0
  130. package/packages/utils/dist/githubVersion.js +37 -0
  131. package/packages/utils/dist/hex.d.ts +4 -0
  132. package/packages/utils/dist/hex.js +118 -0
  133. package/packages/utils/dist/inspector.d.ts +24 -0
  134. package/packages/utils/dist/inspector.js +200 -0
  135. package/packages/utils/dist/isValid.d.ts +10 -0
  136. package/packages/utils/dist/isValid.js +69 -0
  137. package/packages/utils/dist/network.d.ts +12 -0
  138. package/packages/utils/dist/network.js +105 -0
  139. package/packages/utils/dist/npmRoot.d.ts +1 -0
  140. package/packages/utils/dist/npmRoot.js +13 -0
  141. package/packages/utils/dist/npmVersion.d.ts +1 -0
  142. package/packages/utils/dist/npmVersion.js +43 -0
  143. package/packages/utils/dist/tracker.d.ts +52 -0
  144. package/packages/utils/dist/tracker.js +201 -0
  145. package/packages/utils/dist/wait.d.ts +3 -0
  146. package/packages/utils/dist/wait.js +73 -0
  147. package/packages/utils/matterbridge.svg +50 -0
  148. package/packages/utils/package.json +110 -0
  149. package/packages/vitest-utils/LICENSE +202 -0
  150. package/packages/vitest-utils/bmc-button.svg +22 -0
  151. package/packages/vitest-utils/dist/export.d.ts +1 -0
  152. package/packages/vitest-utils/dist/export.js +1 -0
  153. package/packages/vitest-utils/matterbridge.svg +50 -0
  154. package/packages/vitest-utils/package.json +109 -0
  155. package/dist/dgram/mdnsReflectorClient.js +0 -176
  156. package/dist/dgram/mdnsReflectorServer.js +0 -301
  157. package/dist/dgram/mdnsReflectorTypes.js +0 -5
  158. package/packages/mb-lib-test/dist/module.d.ts +0 -2
  159. package/packages/mb-lib-test/dist/module.js +0 -2
  160. package/reflector/DockerDesktopSetup.png +0 -0
  161. package/reflector/Reflector.md +0 -158
  162. package/reflector/ReflectorClient.png +0 -0
  163. package/reflector/ReflectorServer.png +0 -0
  164. package/reflector/docker-compose.yml +0 -32
  165. package/reflector/mDnsPacket.png +0 -0
  166. /package/packages/{mb-lib-test → dgram}/LICENSE +0 -0
  167. /package/packages/{mb-lib-test → dgram}/bmc-button.svg +0 -0
  168. /package/packages/{mb-lib-test → dgram}/matterbridge.svg +0 -0
  169. /package/packages/{mb-lib-test/dist/jestutils → jest-utils/dist}/jestHelpers.d.ts +0 -0
  170. /package/packages/{mb-lib-test/dist/jestutils → jest-utils/dist}/jestHelpers.js +0 -0
  171. /package/packages/{mb-lib-test/dist/vitestutils → vitest-utils/dist}/vitestHelpers.d.ts +0 -0
  172. /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
+ }
@@ -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 (interfaceName.toLowerCase().includes('tailscale'))
102
+ if (!networkInterface && this.excludedInterfaceNamePattern.test(interfaceName))
102
103
  continue;
103
104
  if (!interfaceDetails)
104
105
  continue;
@@ -132,7 +133,7 @@ export class Dgram extends EventEmitter {
132
133
  }
133
134
  if (!networkInterface) {
134
135
  for (const [interfaceName, interfaceDetails] of Object.entries(interfaces)) {
135
- if (interfaceName.toLowerCase().includes('tailscale'))
136
+ if (!networkInterface && this.excludedInterfaceNamePattern.test(interfaceName))
136
137
  continue;
137
138
  if (!interfaceDetails)
138
139
  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 {};
@@ -1,5 +1,4 @@
1
- import { COAP_MULTICAST_IPV4_ADDRESS, COAP_MULTICAST_IPV6_ADDRESS, COAP_MULTICAST_PORT } from './multicast.js';
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 {};
@@ -1,9 +1,6 @@
1
1
  import os from 'node:os';
2
- import { getIntParameter, getParameter, getStringArrayParameter, hasParameter } from '../utils/commandLine.js';
3
- import { MDNS_MULTICAST_IPV4_ADDRESS, MDNS_MULTICAST_IPV6_ADDRESS, MDNS_MULTICAST_PORT } from './multicast.js';
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
- mdns.sendQuery([
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 },
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
- try {
139
- for (const info of interfaceInfos) {
140
- if (info.family === 'IPv4' && !info.internal) {
141
- const ipv4 = info.address;
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 encoding network interface addresses: ${error.message}`);
143
+ mdns.log.error(`Error sending mDNS advertisement: ${error.message}`);
152
144
  }
153
- const _response = mdns.sendResponse(answers);
154
145
  };
155
- if (!hasParameter('noIpv4') && !hasParameter('reflector-server') && !hasParameter('reflector-client')) {
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') && !hasParameter('reflector-server') && !hasParameter('reflector-client')) {
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') && !hasParameter('reflector-server') && !hasParameter('reflector-client')) {
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 {};