matterbridge 3.3.2 → 3.3.3-dev-20251012-feda0f1

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 (291) hide show
  1. package/CHANGELOG.md +21 -7
  2. package/dist/broadcastServer.js +1 -86
  3. package/dist/broadcastServerTypes.js +0 -24
  4. package/dist/cli.js +5 -135
  5. package/dist/cliEmitter.js +0 -37
  6. package/dist/cliHistory.js +0 -44
  7. package/dist/clusters/export.js +0 -2
  8. package/dist/defaultConfigSchema.js +0 -24
  9. package/dist/deviceManager.js +1 -124
  10. package/dist/devices/airConditioner.js +0 -57
  11. package/dist/devices/batteryStorage.js +1 -48
  12. package/dist/devices/cooktop.js +0 -55
  13. package/dist/devices/dishwasher.js +0 -57
  14. package/dist/devices/evse.js +10 -74
  15. package/dist/devices/export.js +0 -5
  16. package/dist/devices/extractorHood.js +0 -42
  17. package/dist/devices/heatPump.js +2 -50
  18. package/dist/devices/laundryDryer.js +3 -62
  19. package/dist/devices/laundryWasher.js +4 -70
  20. package/dist/devices/microwaveOven.js +5 -88
  21. package/dist/devices/oven.js +0 -85
  22. package/dist/devices/refrigerator.js +0 -102
  23. package/dist/devices/roboticVacuumCleaner.js +9 -100
  24. package/dist/devices/solarPower.js +0 -38
  25. package/dist/devices/speaker.js +0 -84
  26. package/dist/devices/temperatureControl.js +3 -25
  27. package/dist/devices/waterHeater.js +2 -82
  28. package/dist/dgram/coap.js +13 -126
  29. package/dist/dgram/dgram.js +2 -114
  30. package/dist/dgram/mb_coap.js +3 -41
  31. package/dist/dgram/mb_mdns.js +15 -80
  32. package/dist/dgram/mdns.js +137 -299
  33. package/dist/dgram/multicast.js +1 -62
  34. package/dist/dgram/unicast.js +0 -54
  35. package/dist/frontend.js +29 -402
  36. package/dist/frontendTypes.js +0 -45
  37. package/dist/helpers.js +0 -53
  38. package/dist/index.js +0 -25
  39. package/dist/logger/export.js +0 -1
  40. package/dist/matter/behaviors.js +0 -2
  41. package/dist/matter/clusters.js +0 -2
  42. package/dist/matter/devices.js +0 -2
  43. package/dist/matter/endpoints.js +0 -2
  44. package/dist/matter/export.js +0 -3
  45. package/dist/matter/types.js +0 -3
  46. package/dist/matterbridge.js +45 -795
  47. package/dist/matterbridgeAccessoryPlatform.js +0 -36
  48. package/dist/matterbridgeBehaviors.js +5 -65
  49. package/dist/matterbridgeDeviceTypes.js +17 -630
  50. package/dist/matterbridgeDynamicPlatform.js +0 -36
  51. package/dist/matterbridgeEndpoint.js +58 -1398
  52. package/dist/matterbridgeEndpointHelpers.js +12 -345
  53. package/dist/matterbridgePlatform.js +1 -341
  54. package/dist/matterbridgeTypes.js +0 -26
  55. package/dist/pluginManager.js +3 -325
  56. package/dist/shelly.js +7 -168
  57. package/dist/storage/export.js +0 -1
  58. package/dist/update.js +0 -69
  59. package/dist/utils/colorUtils.js +2 -97
  60. package/dist/utils/commandLine.js +0 -54
  61. package/dist/utils/copyDirectory.js +1 -38
  62. package/dist/utils/createDirectory.js +0 -33
  63. package/dist/utils/createZip.js +2 -47
  64. package/dist/utils/deepCopy.js +0 -39
  65. package/dist/utils/deepEqual.js +1 -72
  66. package/dist/utils/error.js +0 -41
  67. package/dist/utils/export.js +0 -1
  68. package/dist/utils/hex.js +0 -124
  69. package/dist/utils/isvalid.js +0 -101
  70. package/dist/utils/jestHelpers.js +3 -153
  71. package/dist/utils/network.js +5 -108
  72. package/dist/utils/spawn.js +0 -71
  73. package/dist/utils/wait.js +8 -60
  74. package/npm-shrinkwrap.json +2 -2
  75. package/package.json +1 -2
  76. package/dist/broadcastServer.d.ts +0 -105
  77. package/dist/broadcastServer.d.ts.map +0 -1
  78. package/dist/broadcastServer.js.map +0 -1
  79. package/dist/broadcastServerTypes.d.ts +0 -717
  80. package/dist/broadcastServerTypes.d.ts.map +0 -1
  81. package/dist/broadcastServerTypes.js.map +0 -1
  82. package/dist/cli.d.ts +0 -26
  83. package/dist/cli.d.ts.map +0 -1
  84. package/dist/cli.js.map +0 -1
  85. package/dist/cliEmitter.d.ts +0 -50
  86. package/dist/cliEmitter.d.ts.map +0 -1
  87. package/dist/cliEmitter.js.map +0 -1
  88. package/dist/cliHistory.d.ts +0 -70
  89. package/dist/cliHistory.d.ts.map +0 -1
  90. package/dist/cliHistory.js.map +0 -1
  91. package/dist/clusters/export.d.ts +0 -2
  92. package/dist/clusters/export.d.ts.map +0 -1
  93. package/dist/clusters/export.js.map +0 -1
  94. package/dist/defaultConfigSchema.d.ts +0 -28
  95. package/dist/defaultConfigSchema.d.ts.map +0 -1
  96. package/dist/defaultConfigSchema.js.map +0 -1
  97. package/dist/deviceManager.d.ts +0 -117
  98. package/dist/deviceManager.d.ts.map +0 -1
  99. package/dist/deviceManager.js.map +0 -1
  100. package/dist/devices/airConditioner.d.ts +0 -98
  101. package/dist/devices/airConditioner.d.ts.map +0 -1
  102. package/dist/devices/airConditioner.js.map +0 -1
  103. package/dist/devices/batteryStorage.d.ts +0 -48
  104. package/dist/devices/batteryStorage.d.ts.map +0 -1
  105. package/dist/devices/batteryStorage.js.map +0 -1
  106. package/dist/devices/cooktop.d.ts +0 -60
  107. package/dist/devices/cooktop.d.ts.map +0 -1
  108. package/dist/devices/cooktop.js.map +0 -1
  109. package/dist/devices/dishwasher.d.ts +0 -71
  110. package/dist/devices/dishwasher.d.ts.map +0 -1
  111. package/dist/devices/dishwasher.js.map +0 -1
  112. package/dist/devices/evse.d.ts +0 -75
  113. package/dist/devices/evse.d.ts.map +0 -1
  114. package/dist/devices/evse.js.map +0 -1
  115. package/dist/devices/export.d.ts +0 -17
  116. package/dist/devices/export.d.ts.map +0 -1
  117. package/dist/devices/export.js.map +0 -1
  118. package/dist/devices/extractorHood.d.ts +0 -46
  119. package/dist/devices/extractorHood.d.ts.map +0 -1
  120. package/dist/devices/extractorHood.js.map +0 -1
  121. package/dist/devices/heatPump.d.ts +0 -47
  122. package/dist/devices/heatPump.d.ts.map +0 -1
  123. package/dist/devices/heatPump.js.map +0 -1
  124. package/dist/devices/laundryDryer.d.ts +0 -67
  125. package/dist/devices/laundryDryer.d.ts.map +0 -1
  126. package/dist/devices/laundryDryer.js.map +0 -1
  127. package/dist/devices/laundryWasher.d.ts +0 -81
  128. package/dist/devices/laundryWasher.d.ts.map +0 -1
  129. package/dist/devices/laundryWasher.js.map +0 -1
  130. package/dist/devices/microwaveOven.d.ts +0 -168
  131. package/dist/devices/microwaveOven.d.ts.map +0 -1
  132. package/dist/devices/microwaveOven.js.map +0 -1
  133. package/dist/devices/oven.d.ts +0 -105
  134. package/dist/devices/oven.d.ts.map +0 -1
  135. package/dist/devices/oven.js.map +0 -1
  136. package/dist/devices/refrigerator.d.ts +0 -118
  137. package/dist/devices/refrigerator.d.ts.map +0 -1
  138. package/dist/devices/refrigerator.js.map +0 -1
  139. package/dist/devices/roboticVacuumCleaner.d.ts +0 -112
  140. package/dist/devices/roboticVacuumCleaner.d.ts.map +0 -1
  141. package/dist/devices/roboticVacuumCleaner.js.map +0 -1
  142. package/dist/devices/solarPower.d.ts +0 -40
  143. package/dist/devices/solarPower.d.ts.map +0 -1
  144. package/dist/devices/solarPower.js.map +0 -1
  145. package/dist/devices/speaker.d.ts +0 -87
  146. package/dist/devices/speaker.d.ts.map +0 -1
  147. package/dist/devices/speaker.js.map +0 -1
  148. package/dist/devices/temperatureControl.d.ts +0 -166
  149. package/dist/devices/temperatureControl.d.ts.map +0 -1
  150. package/dist/devices/temperatureControl.js.map +0 -1
  151. package/dist/devices/waterHeater.d.ts +0 -111
  152. package/dist/devices/waterHeater.d.ts.map +0 -1
  153. package/dist/devices/waterHeater.js.map +0 -1
  154. package/dist/dgram/coap.d.ts +0 -205
  155. package/dist/dgram/coap.d.ts.map +0 -1
  156. package/dist/dgram/coap.js.map +0 -1
  157. package/dist/dgram/dgram.d.ts +0 -141
  158. package/dist/dgram/dgram.d.ts.map +0 -1
  159. package/dist/dgram/dgram.js.map +0 -1
  160. package/dist/dgram/mb_coap.d.ts +0 -24
  161. package/dist/dgram/mb_coap.d.ts.map +0 -1
  162. package/dist/dgram/mb_coap.js.map +0 -1
  163. package/dist/dgram/mb_mdns.d.ts +0 -24
  164. package/dist/dgram/mb_mdns.d.ts.map +0 -1
  165. package/dist/dgram/mb_mdns.js.map +0 -1
  166. package/dist/dgram/mdns.d.ts +0 -290
  167. package/dist/dgram/mdns.d.ts.map +0 -1
  168. package/dist/dgram/mdns.js.map +0 -1
  169. package/dist/dgram/multicast.d.ts +0 -67
  170. package/dist/dgram/multicast.d.ts.map +0 -1
  171. package/dist/dgram/multicast.js.map +0 -1
  172. package/dist/dgram/unicast.d.ts +0 -56
  173. package/dist/dgram/unicast.d.ts.map +0 -1
  174. package/dist/dgram/unicast.js.map +0 -1
  175. package/dist/frontend.d.ts +0 -234
  176. package/dist/frontend.d.ts.map +0 -1
  177. package/dist/frontend.js.map +0 -1
  178. package/dist/frontendTypes.d.ts +0 -522
  179. package/dist/frontendTypes.d.ts.map +0 -1
  180. package/dist/frontendTypes.js.map +0 -1
  181. package/dist/helpers.d.ts +0 -48
  182. package/dist/helpers.d.ts.map +0 -1
  183. package/dist/helpers.js.map +0 -1
  184. package/dist/index.d.ts +0 -33
  185. package/dist/index.d.ts.map +0 -1
  186. package/dist/index.js.map +0 -1
  187. package/dist/logger/export.d.ts +0 -2
  188. package/dist/logger/export.d.ts.map +0 -1
  189. package/dist/logger/export.js.map +0 -1
  190. package/dist/matter/behaviors.d.ts +0 -2
  191. package/dist/matter/behaviors.d.ts.map +0 -1
  192. package/dist/matter/behaviors.js.map +0 -1
  193. package/dist/matter/clusters.d.ts +0 -2
  194. package/dist/matter/clusters.d.ts.map +0 -1
  195. package/dist/matter/clusters.js.map +0 -1
  196. package/dist/matter/devices.d.ts +0 -2
  197. package/dist/matter/devices.d.ts.map +0 -1
  198. package/dist/matter/devices.js.map +0 -1
  199. package/dist/matter/endpoints.d.ts +0 -2
  200. package/dist/matter/endpoints.d.ts.map +0 -1
  201. package/dist/matter/endpoints.js.map +0 -1
  202. package/dist/matter/export.d.ts +0 -5
  203. package/dist/matter/export.d.ts.map +0 -1
  204. package/dist/matter/export.js.map +0 -1
  205. package/dist/matter/types.d.ts +0 -3
  206. package/dist/matter/types.d.ts.map +0 -1
  207. package/dist/matter/types.js.map +0 -1
  208. package/dist/matterbridge.d.ts +0 -469
  209. package/dist/matterbridge.d.ts.map +0 -1
  210. package/dist/matterbridge.js.map +0 -1
  211. package/dist/matterbridgeAccessoryPlatform.d.ts +0 -42
  212. package/dist/matterbridgeAccessoryPlatform.d.ts.map +0 -1
  213. package/dist/matterbridgeAccessoryPlatform.js.map +0 -1
  214. package/dist/matterbridgeBehaviors.d.ts +0 -1747
  215. package/dist/matterbridgeBehaviors.d.ts.map +0 -1
  216. package/dist/matterbridgeBehaviors.js.map +0 -1
  217. package/dist/matterbridgeDeviceTypes.d.ts +0 -761
  218. package/dist/matterbridgeDeviceTypes.d.ts.map +0 -1
  219. package/dist/matterbridgeDeviceTypes.js.map +0 -1
  220. package/dist/matterbridgeDynamicPlatform.d.ts +0 -42
  221. package/dist/matterbridgeDynamicPlatform.d.ts.map +0 -1
  222. package/dist/matterbridgeDynamicPlatform.js.map +0 -1
  223. package/dist/matterbridgeEndpoint.d.ts +0 -1534
  224. package/dist/matterbridgeEndpoint.d.ts.map +0 -1
  225. package/dist/matterbridgeEndpoint.js.map +0 -1
  226. package/dist/matterbridgeEndpointHelpers.d.ts +0 -407
  227. package/dist/matterbridgeEndpointHelpers.d.ts.map +0 -1
  228. package/dist/matterbridgeEndpointHelpers.js.map +0 -1
  229. package/dist/matterbridgePlatform.d.ts +0 -402
  230. package/dist/matterbridgePlatform.d.ts.map +0 -1
  231. package/dist/matterbridgePlatform.js.map +0 -1
  232. package/dist/matterbridgeTypes.d.ts +0 -209
  233. package/dist/matterbridgeTypes.d.ts.map +0 -1
  234. package/dist/matterbridgeTypes.js.map +0 -1
  235. package/dist/pluginManager.d.ts +0 -353
  236. package/dist/pluginManager.d.ts.map +0 -1
  237. package/dist/pluginManager.js.map +0 -1
  238. package/dist/shelly.d.ts +0 -174
  239. package/dist/shelly.d.ts.map +0 -1
  240. package/dist/shelly.js.map +0 -1
  241. package/dist/storage/export.d.ts +0 -2
  242. package/dist/storage/export.d.ts.map +0 -1
  243. package/dist/storage/export.js.map +0 -1
  244. package/dist/update.d.ts +0 -75
  245. package/dist/update.d.ts.map +0 -1
  246. package/dist/update.js.map +0 -1
  247. package/dist/utils/colorUtils.d.ts +0 -99
  248. package/dist/utils/colorUtils.d.ts.map +0 -1
  249. package/dist/utils/colorUtils.js.map +0 -1
  250. package/dist/utils/commandLine.d.ts +0 -59
  251. package/dist/utils/commandLine.d.ts.map +0 -1
  252. package/dist/utils/commandLine.js.map +0 -1
  253. package/dist/utils/copyDirectory.d.ts +0 -33
  254. package/dist/utils/copyDirectory.d.ts.map +0 -1
  255. package/dist/utils/copyDirectory.js.map +0 -1
  256. package/dist/utils/createDirectory.d.ts +0 -34
  257. package/dist/utils/createDirectory.d.ts.map +0 -1
  258. package/dist/utils/createDirectory.js.map +0 -1
  259. package/dist/utils/createZip.d.ts +0 -39
  260. package/dist/utils/createZip.d.ts.map +0 -1
  261. package/dist/utils/createZip.js.map +0 -1
  262. package/dist/utils/deepCopy.d.ts +0 -32
  263. package/dist/utils/deepCopy.d.ts.map +0 -1
  264. package/dist/utils/deepCopy.js.map +0 -1
  265. package/dist/utils/deepEqual.d.ts +0 -54
  266. package/dist/utils/deepEqual.d.ts.map +0 -1
  267. package/dist/utils/deepEqual.js.map +0 -1
  268. package/dist/utils/error.d.ts +0 -44
  269. package/dist/utils/error.d.ts.map +0 -1
  270. package/dist/utils/error.js.map +0 -1
  271. package/dist/utils/export.d.ts +0 -13
  272. package/dist/utils/export.d.ts.map +0 -1
  273. package/dist/utils/export.js.map +0 -1
  274. package/dist/utils/hex.d.ts +0 -89
  275. package/dist/utils/hex.d.ts.map +0 -1
  276. package/dist/utils/hex.js.map +0 -1
  277. package/dist/utils/isvalid.d.ts +0 -103
  278. package/dist/utils/isvalid.d.ts.map +0 -1
  279. package/dist/utils/isvalid.js.map +0 -1
  280. package/dist/utils/jestHelpers.d.ts +0 -137
  281. package/dist/utils/jestHelpers.d.ts.map +0 -1
  282. package/dist/utils/jestHelpers.js.map +0 -1
  283. package/dist/utils/network.d.ts +0 -115
  284. package/dist/utils/network.d.ts.map +0 -1
  285. package/dist/utils/network.js.map +0 -1
  286. package/dist/utils/spawn.d.ts +0 -35
  287. package/dist/utils/spawn.d.ts.map +0 -1
  288. package/dist/utils/spawn.js.map +0 -1
  289. package/dist/utils/wait.d.ts +0 -54
  290. package/dist/utils/wait.d.ts.map +0 -1
  291. package/dist/utils/wait.js.map +0 -1
package/CHANGELOG.md CHANGED
@@ -23,6 +23,16 @@ Advantages:
23
23
  - isolation between threads;
24
24
  - individual plugin isolation in childbridge mode;
25
25
 
26
+ ## [3.3.3] - Not released
27
+
28
+ ### Changed
29
+
30
+ - [package]: Updated dependencies.
31
+
32
+ <a href="https://www.buymeacoffee.com/luligugithub">
33
+ <img src="bmc-button.svg" alt="Buy me a coffee" width="80">
34
+ </a>
35
+
26
36
  ## [3.3.2] - 2025-10-13
27
37
 
28
38
  ### Fixed
@@ -94,11 +104,15 @@ This change, necessary to achieve plugin isolation, will require all plugins to
94
104
  - require matterbridge 3.3.0:
95
105
 
96
106
  ```typescript
97
- if (this.verifyMatterbridgeVersion === undefined || typeof this.verifyMatterbridgeVersion !== 'function' || !this.verifyMatterbridgeVersion('3.3.0')) {
98
- throw new Error(
99
- `This plugin requires Matterbridge version >= "3.3.0". Please update Matterbridge from ${this.matterbridge.matterbridgeVersion} to the latest version."`,
100
- );
101
- }
107
+ if (
108
+ this.verifyMatterbridgeVersion === undefined ||
109
+ typeof this.verifyMatterbridgeVersion !== "function" ||
110
+ !this.verifyMatterbridgeVersion("3.3.0")
111
+ ) {
112
+ throw new Error(
113
+ `This plugin requires Matterbridge version >= "3.3.0". Please update Matterbridge from ${this.matterbridge.matterbridgeVersion} to the latest version."`
114
+ );
115
+ }
102
116
  ```
103
117
 
104
118
  - check that you are not using any matterbridge calls directly (this should not be the case).
@@ -118,8 +132,8 @@ export type PlatformMatterbridge = {
118
132
  readonly matterbridgeVersion: string;
119
133
  readonly matterbridgeLatestVersion: string;
120
134
  readonly matterbridgeDevVersion: string;
121
- readonly bridgeMode: 'bridge' | 'childbridge' | 'controller' | '';
122
- readonly restartMode: 'service' | 'docker' | '';
135
+ readonly bridgeMode: "bridge" | "childbridge" | "controller" | "";
136
+ readonly restartMode: "service" | "docker" | "";
123
137
  readonly aggregatorVendorId: VendorId;
124
138
  readonly aggregatorVendorName: string;
125
139
  readonly aggregatorProductId: number;
@@ -1,47 +1,13 @@
1
- /**
2
- * This file contains the BroadcastServer class.
3
- *
4
- * @file broadcastServer.ts
5
- * @author Luca Liguori
6
- * @created 2025-10-05
7
- * @version 1.0.0
8
- * @license Apache-2.0
9
- *
10
- * Copyright 2024, 2025, 2026 Luca Liguori.
11
- *
12
- * Licensed under the Apache License, Version 2.0 (the "License");
13
- * you may not use this file except in compliance with the License.
14
- * You may obtain a copy of the License at
15
- *
16
- * http://www.apache.org/licenses/LICENSE-2.0
17
- *
18
- * Unless required by applicable law or agreed to in writing, software
19
- * distributed under the License is distributed on an "AS IS" BASIS,
20
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
21
- * See the License for the specific language governing permissions and
22
- * limitations under the License.
23
- */
24
- // eslint-disable-next-line no-console
25
1
  if (process.argv.includes('--loader') || process.argv.includes('-loader'))
26
2
  console.log('\u001B[32mBroadcastServer loaded.\u001B[40;0m');
27
3
  import { EventEmitter } from 'node:events';
28
4
  import { BroadcastChannel } from 'node:worker_threads';
29
5
  import { debugStringify } from 'node-ansi-logger';
30
- /**
31
- * BroadcastServer class to handle broadcast messages between workers with BroadcastChannel.
32
- */
33
6
  export class BroadcastServer extends EventEmitter {
34
7
  name;
35
8
  log;
36
9
  channel;
37
10
  broadcastChannel;
38
- /**
39
- * Creates an instance of BroadcastServer.
40
- *
41
- * @param {string} name - The name of the broadcast server.
42
- * @param {AnsiLogger} log - The logger instance to use for logging.
43
- * @param {string} channel - The channel name for the broadcast. Default is 'broadcast-channel'.
44
- */
45
11
  constructor(name, log, channel = 'broadcast-channel') {
46
12
  super();
47
13
  this.name = name;
@@ -50,61 +16,24 @@ export class BroadcastServer extends EventEmitter {
50
16
  this.broadcastChannel = new BroadcastChannel(this.channel);
51
17
  this.broadcastChannel.onmessage = this.broadcastMessageHandler.bind(this);
52
18
  }
53
- /**
54
- * Closes the broadcast channel.
55
- *
56
- * @returns {void}
57
- */
58
19
  close() {
59
- // @ts-expect-error: wrong type definition in node.d.ts
60
20
  this.broadcastChannel.onmessage = null;
61
21
  this.broadcastChannel.close();
62
22
  }
63
- /**
64
- * Generates a unique ID with range 100000-999999.
65
- *
66
- * @returns {number} - A unique ID between 100000 and 999999
67
- */
68
23
  getUniqueId() {
69
- return Math.floor(Math.random() * (999999 - 100000 + 1)) + 100000; // random int between 100000 and 999999
24
+ return Math.floor(Math.random() * (999999 - 100000 + 1)) + 100000;
70
25
  }
71
- /**
72
- * Type guard to check if a message is a request of a specific type.
73
- *
74
- * @param {unknown} msg - The message to check.
75
- * @param {T} type - The type to check against.
76
- * @returns {msg is WorkerRequest<T>} True if the message is a request of the specified type.
77
- */
78
26
  isWorkerRequest(msg, type) {
79
27
  return typeof msg === 'object' && msg !== null && 'id' in msg && 'type' in msg && msg.type === type && !('response' in msg) && 'src' in msg && 'dst' in msg;
80
28
  }
81
- /**
82
- * Type guard to check if a message is a response of a specific type.
83
- *
84
- * @param {unknown} msg - The message to check.
85
- * @param {T} type - The type to check against.
86
- * @returns {msg is WorkerResponse<T>} True if the message is a response of the specified type.
87
- */
88
29
  isWorkerResponse(msg, type) {
89
30
  return typeof msg === 'object' && msg !== null && 'id' in msg && 'type' in msg && msg.type === type && 'response' in msg && 'src' in msg && 'dst' in msg;
90
31
  }
91
- /**
92
- * Handles incoming broadcast messages.
93
- *
94
- * @param {MessageEvent} event - The message event containing the broadcast message.
95
- * @returns {void}
96
- */
97
32
  broadcastMessageHandler(event) {
98
33
  const data = event.data;
99
34
  this.log.debug(`*Received broadcast message: ${debugStringify(data)}`);
100
35
  this.emit('broadcast_message', data);
101
36
  }
102
- /**
103
- * Broadcast a request message to all workers.
104
- *
105
- * @param {WorkerRequest<T>} message - The typed request message to broadcast.
106
- * @returns {void}
107
- */
108
37
  request(message) {
109
38
  if (message.id === undefined) {
110
39
  message.id = this.getUniqueId();
@@ -116,12 +45,6 @@ export class BroadcastServer extends EventEmitter {
116
45
  this.log.debug(`*Broadcasting message: ${debugStringify(message)}`);
117
46
  this.broadcastChannel.postMessage(message);
118
47
  }
119
- /**
120
- * Broadcast a response message to all workers.
121
- *
122
- * @param {WorkerResponse<T>} message - The typed response message to broadcast.
123
- * @returns {void}
124
- */
125
48
  respond(message) {
126
49
  if (!this.isWorkerResponse(message, message.type)) {
127
50
  this.log.error(`Invalid response message format for broadcast: ${debugStringify(message)}`);
@@ -130,13 +53,6 @@ export class BroadcastServer extends EventEmitter {
130
53
  this.log.debug(`*Broadcasting message: ${debugStringify(message)}`);
131
54
  this.broadcastChannel.postMessage(message);
132
55
  }
133
- /**
134
- * Fetch data from a worker.
135
- * It broadcasts a request message and waits for a response with the same id.
136
- *
137
- * @param {WorkerRequest<T>} message - The typed request message to broadcast.
138
- * @returns {Promise<WorkerResponse<T>>} A promise that resolves with the response from the worker or rejects on timeout.
139
- */
140
56
  async fetch(message) {
141
57
  this.log.debug(`*Fetching message: ${debugStringify(message)}`);
142
58
  return new Promise((resolve, reject) => {
@@ -157,4 +73,3 @@ export class BroadcastServer extends EventEmitter {
157
73
  });
158
74
  }
159
75
  }
160
- //# sourceMappingURL=broadcastServer.js.map
@@ -1,25 +1 @@
1
- /**
2
- * This file contains the BroadcastServer types.
3
- *
4
- * @file broadcastServerTypes.ts
5
- * @author Luca Liguori
6
- * @created 2025-10-05
7
- * @version 1.0.0
8
- * @license Apache-2.0
9
- *
10
- * Copyright 2024, 2025, 2026 Luca Liguori.
11
- *
12
- * Licensed under the Apache License, Version 2.0 (the "License");
13
- * you may not use this file except in compliance with the License.
14
- * You may obtain a copy of the License at
15
- *
16
- * http://www.apache.org/licenses/LICENSE-2.0
17
- *
18
- * Unless required by applicable law or agreed to in writing, software
19
- * distributed under the License is distributed on an "AS IS" BASIS,
20
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
21
- * See the License for the specific language governing permissions and
22
- * limitations under the License.
23
- */
24
1
  export {};
25
- //# sourceMappingURL=broadcastServerTypes.js.map
package/dist/cli.js CHANGED
@@ -1,44 +1,15 @@
1
- /**
2
- * This file contains the CLI entry point of Matterbridge.
3
- *
4
- * @file cli.ts
5
- * @author Luca Liguori
6
- * @created 2023-12-29
7
- * @version 2.1.1
8
- * @license Apache-2.0
9
- *
10
- * Copyright 2023, 2024, 2025 Luca Liguori.
11
- *
12
- * Licensed under the Apache License, Version 2.0 (the "License");
13
- * you may not use this file except in compliance with the License.
14
- * You may obtain a copy of the License at
15
- *
16
- * http://www.apache.org/licenses/LICENSE-2.0
17
- *
18
- * Unless required by applicable law or agreed to in writing, software
19
- * distributed under the License is distributed on an "AS IS" BASIS,
20
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
21
- * See the License for the specific language governing permissions and
22
- * limitations under the License.
23
- */
24
- // eslint-disable-next-line no-console
25
1
  if (process.argv.includes('--loader') || process.argv.includes('-loader'))
26
2
  console.log('\u001B[32mCLI loaded.\u001B[40;0m');
27
3
  import os from 'node:os';
28
4
  import { inspect } from 'node:util';
29
- // AnsiLogger module
30
5
  import { AnsiLogger, BRIGHT, CYAN, db, RED, YELLOW } from 'node-ansi-logger';
31
- // Cli
32
6
  import { cliEmitter, setLastOsCpuUsage, setLastProcessCpuUsage } from './cliEmitter.js';
33
7
  import { history, historyIndex, historySize, setHistoryIndex } from './cliHistory.js';
34
- // Matterbridge
35
8
  import { getIntParameter, hasParameter } from './utils/commandLine.js';
36
9
  import { Matterbridge } from './matterbridge.js';
37
10
  export let instance;
38
- // Inspectop
39
11
  let session;
40
12
  let snapshotInterval;
41
- // Cpu and memory check
42
13
  const trace = hasParameter('trace');
43
14
  let memoryCheckInterval;
44
15
  const memoryCheckIntervalMs = getIntParameter('memoryinterval') ?? 10 * 1000;
@@ -52,7 +23,7 @@ let peakHeapUsed = 0;
52
23
  let peakHeapTotal = 0;
53
24
  let peakExternal = 0;
54
25
  let peakArrayBuffers = 0;
55
- const log = new AnsiLogger({ logName: 'Cli', logTimestampFormat: 4 /* TimestampFormat.TIME_MILLIS */, logLevel: hasParameter('debug') ? "debug" /* LogLevel.DEBUG */ : "info" /* LogLevel.INFO */ });
26
+ const log = new AnsiLogger({ logName: 'Cli', logTimestampFormat: 4, logLevel: hasParameter('debug') ? "debug" : "info" });
56
27
  const formatCpuUsage = (percent) => {
57
28
  return `${percent.toFixed(2).padStart(5, ' ')} %`;
58
29
  };
@@ -82,28 +53,16 @@ const formatOsUpTime = (seconds) => {
82
53
  }
83
54
  return `${seconds} second${seconds !== 1 ? 's' : ''}`;
84
55
  };
85
- /**
86
- * Starts the CPU and memory check interval.
87
- *
88
- * @remarks
89
- * Debug parameter
90
- *
91
- * -memoryinterval <milliseconds> can be used to set the interval. Default is 10 seconds.
92
- */
93
56
  async function startCpuMemoryCheck() {
94
- // const os = await import('node:os');
95
57
  log.debug(`Cpu memory check started`);
96
58
  prevCpus = os.cpus();
97
59
  prevProcessCpu = process.cpuUsage();
98
60
  const interval = () => {
99
- // Get the os uptime
100
61
  const systemUptime = formatOsUpTime(Math.floor(os.uptime()));
101
62
  const processUptime = formatOsUpTime(Math.floor(process.uptime()));
102
63
  cliEmitter.emit('uptime', systemUptime, processUptime);
103
- // Get the free and total memory
104
64
  const totalMemory = formatMemoryUsage(os.totalmem());
105
65
  const freeMemory = formatMemoryUsage(os.freemem());
106
- // Get the memory usage
107
66
  const memoryUsageRaw = process.memoryUsage();
108
67
  const rss = formatMemoryUsage(memoryUsageRaw.rss);
109
68
  const heapTotal = formatMemoryUsage(memoryUsageRaw.heapTotal);
@@ -136,11 +95,9 @@ async function startCpuMemoryCheck() {
136
95
  peakArrayBuffers = memoryUsageRaw.arrayBuffers;
137
96
  }
138
97
  cliEmitter.emit('memory', totalMemory, freeMemory, rss, heapTotal, heapUsed, external, arrayBuffers);
139
- // Get the host cpu usage
140
98
  const currCpus = os.cpus();
141
- // log.debug(`Cpus: ${JSON.stringify(currCpus)}`);
142
99
  if (currCpus.length !== prevCpus.length) {
143
- prevCpus = currCpus; // Reset the previous cpus
100
+ prevCpus = currCpus;
144
101
  log.debug(`Cpu check length failed, resetting previous cpus`);
145
102
  return;
146
103
  }
@@ -157,9 +114,7 @@ async function startCpuMemoryCheck() {
157
114
  log.debug(`Cpu check failed, using previous cpus`);
158
115
  }
159
116
  else {
160
- // istanbul ignore next
161
117
  setLastOsCpuUsage(osCpuUsage);
162
- // istanbul ignore next if
163
118
  if (osCpuUsage > peakCpu) {
164
119
  peakCpu = osCpuUsage;
165
120
  if (peakCpu && trace)
@@ -167,13 +122,11 @@ async function startCpuMemoryCheck() {
167
122
  }
168
123
  }
169
124
  prevCpus = currCpus;
170
- // Get the process cpu usage https://cdn.jsdelivr.net/npm/chart.js
171
125
  const diff = process.cpuUsage(prevProcessCpu);
172
126
  const userMs = diff.user / 1000;
173
127
  const systemMs = diff.system / 1000;
174
128
  const totalMs = userMs + systemMs;
175
129
  const processCpuUsage = Number((((totalMs / memoryCheckIntervalMs) * 100) / currCpus.length).toFixed(2));
176
- // istanbul ignore next if
177
130
  if (processCpuUsage > peakProcessCpu) {
178
131
  peakProcessCpu = processCpuUsage;
179
132
  if (peakProcessCpu && trace)
@@ -182,7 +135,6 @@ async function startCpuMemoryCheck() {
182
135
  prevProcessCpu = process.cpuUsage();
183
136
  setLastProcessCpuUsage(processCpuUsage);
184
137
  cliEmitter.emit('cpu', osCpuUsage, processCpuUsage);
185
- // Update preallocated history entry in place to avoid per-interval allocations. Keep the same object reference.
186
138
  const entry = history[historyIndex];
187
139
  entry.timestamp = Date.now();
188
140
  entry.cpu = osCpuUsage;
@@ -200,7 +152,6 @@ async function startCpuMemoryCheck() {
200
152
  entry.arrayBuffers = memoryUsageRaw.arrayBuffers;
201
153
  entry.peakArrayBuffers = peakArrayBuffers;
202
154
  setHistoryIndex((historyIndex + 1) % historySize);
203
- // Show the cpu and memory usage
204
155
  if (trace)
205
156
  log.debug(`***${YELLOW}${BRIGHT}Host cpu:${db} ` +
206
157
  `${CYAN}${formatCpuUsage(osCpuUsage)}${db} (peak ${formatCpuUsage(peakCpu)}) ` +
@@ -216,7 +167,6 @@ async function startCpuMemoryCheck() {
216
167
  clearInterval(memoryCheckInterval);
217
168
  memoryCheckInterval = setInterval(interval, memoryCheckIntervalMs).unref();
218
169
  clearTimeout(memoryPeakResetTimeout);
219
- // istanbul ignore next
220
170
  memoryPeakResetTimeout = setTimeout(() => {
221
171
  if (trace)
222
172
  log.debug(`****${RED}${BRIGHT}Cpu and memory peaks reset after first 5 minutes.${db}`);
@@ -225,11 +175,8 @@ async function startCpuMemoryCheck() {
225
175
  peakRss = 0;
226
176
  peakHeapUsed = 0;
227
177
  peakHeapTotal = 0;
228
- }, 5 * 60 * 1000).unref(); // Reset peaks every 5 minutes
178
+ }, 5 * 60 * 1000).unref();
229
179
  }
230
- /**
231
- * Stops the CPU and memory check interval.
232
- */
233
180
  async function stopCpuMemoryCheck() {
234
181
  if (trace) {
235
182
  log.debug(`***Cpu memory check stopped. ` +
@@ -243,20 +190,10 @@ async function stopCpuMemoryCheck() {
243
190
  clearInterval(memoryCheckInterval);
244
191
  clearTimeout(memoryPeakResetTimeout);
245
192
  }
246
- /**
247
- * Starts the inspector for heap sampling.
248
- * This function is called when the -inspect parameter is passed.
249
- * The -snapshotinterval parameter can be used to set the heap snapshot interval. Default is undefined. Minimum is 30000 ms.
250
- * The snapshot is saved in the heap_profile directory that is created in the current working directory.
251
- * The snapshot can be analyzed using vscode or Chrome DevTools or other tools that support heap snapshots.
252
- *
253
- * @remarks To use the inspector, Node.js must be started with --inspect.
254
- */
255
193
  async function startInspector() {
256
194
  const { Session } = await import('node:inspector');
257
195
  const { mkdirSync } = await import('node:fs');
258
196
  log.debug(`***Starting heap sampling...`);
259
- // Create the heap snapshots directory if it doesn't exist
260
197
  mkdirSync('heap_profile', { recursive: true });
261
198
  try {
262
199
  session = new Session();
@@ -265,7 +202,6 @@ async function startInspector() {
265
202
  session?.post('HeapProfiler.startSampling', (err) => (err ? reject(err) : resolve()));
266
203
  });
267
204
  log.debug(`***Started heap sampling`);
268
- // Set an interval to take heap snapshots
269
205
  const interval = getIntParameter('snapshotinterval');
270
206
  if (interval && interval >= 30000) {
271
207
  log.debug(`***Started heap snapshot interval of ${CYAN}${interval}${db} ms`);
@@ -283,19 +219,13 @@ async function startInspector() {
283
219
  return;
284
220
  }
285
221
  }
286
- /**
287
- * Stops the heap sampling and saves the profile to a file.
288
- * This function is called when the inspector is stopped.
289
- */
290
222
  async function stopInspector() {
291
223
  const { writeFileSync } = await import('node:fs');
292
224
  const path = await import('node:path');
293
225
  log.debug(`***Stopping heap sampling...`);
294
226
  if (snapshotInterval) {
295
227
  log.debug(`***Clearing heap snapshot interval...`);
296
- // Clear the snapshot interval if it exists
297
228
  clearInterval(snapshotInterval);
298
- // Take a final heap snapshot before stopping
299
229
  await takeHeapSnapshot();
300
230
  }
301
231
  if (!session) {
@@ -303,7 +233,6 @@ async function stopInspector() {
303
233
  return;
304
234
  }
305
235
  try {
306
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
307
236
  const result = await new Promise((resolve, reject) => {
308
237
  session?.post('HeapProfiler.stopSampling', (err, result) => (err ? reject(err) : resolve(result)));
309
238
  });
@@ -321,13 +250,6 @@ async function stopInspector() {
321
250
  log.debug(`***Stopped heap sampling`);
322
251
  }
323
252
  }
324
- /**
325
- * Takes a heap snapshot and saves it to the file name Heap-snapshot-<timestamp>.heapsnapshot.
326
- * This function is called periodically based on the -snapshotinterval parameter.
327
- * The -snapshotinterval parameter must at least 30000 ms.
328
- * The snapshot is saved in the heap_profile directory that is created in the current working directory.
329
- * The snapshot can be analyzed using vscode or Chrome DevTools or other tools that support heap snapshots.
330
- */
331
253
  async function takeHeapSnapshot() {
332
254
  const { writeFileSync } = await import('node:fs');
333
255
  const path = await import('node:path');
@@ -336,7 +258,6 @@ async function takeHeapSnapshot() {
336
258
  log.error('No active inspector session.');
337
259
  return;
338
260
  }
339
- // Trigger a garbage collection before taking the snapshot to reduce noise
340
261
  triggerGarbageCollection();
341
262
  log.debug(`Taking heap snapshot...`);
342
263
  const chunks = [];
@@ -349,36 +270,27 @@ async function takeHeapSnapshot() {
349
270
  if (!err) {
350
271
  session?.off('HeapProfiler.addHeapSnapshotChunk', chunksListener);
351
272
  writeFileSync(filename, Buffer.concat(chunks));
352
- chunks.length = 0; // Clear the chunks array
273
+ chunks.length = 0;
353
274
  log.debug(`***Heap sampling snapshot saved to ${CYAN}${filename}${db}`);
354
- // Trigger a garbage collection after the snapshot to clean up
355
275
  triggerGarbageCollection();
356
276
  resolve();
357
277
  }
358
278
  else {
359
279
  session?.off('HeapProfiler.addHeapSnapshotChunk', chunksListener);
360
- chunks.length = 0; // Clear the chunks array
280
+ chunks.length = 0;
361
281
  log.error(`***Failed to take heap snapshot: ${err instanceof Error ? err.message : err}`);
362
- // Trigger a garbage collection after the snapshot to clean up
363
282
  triggerGarbageCollection();
364
283
  resolve();
365
284
  }
366
285
  });
367
286
  });
368
287
  }
369
- /**
370
- * Triggers a manual garbage collection.
371
- * This function is working only if the process is started with --expose_gc.
372
- *
373
- * @remarks To check the effect of the garbage collection, add --trace_gc or --trace_gc_verbose.
374
- */
375
288
  function triggerGarbageCollection() {
376
289
  if (global.gc && typeof global.gc === 'function') {
377
290
  try {
378
291
  global.gc({ type: 'major', execution: 'sync' });
379
292
  }
380
293
  catch {
381
- // istanbul ignore next
382
294
  global.gc();
383
295
  }
384
296
  log.debug('Manual garbage collection triggered via global.gc().');
@@ -387,9 +299,6 @@ function triggerGarbageCollection() {
387
299
  log.debug('Garbage collection is not exposed. Start Node.js with --expose-gc to enable manual GC.');
388
300
  }
389
301
  }
390
- /**
391
- * Registers event handlers for the Matterbridge instance.
392
- */
393
302
  function registerHandlers() {
394
303
  log.debug('Registering event handlers...');
395
304
  if (instance)
@@ -412,68 +321,32 @@ function registerHandlers() {
412
321
  instance.on('triggergarbagecollection', async () => triggerGarbageCollection());
413
322
  log.debug('Registered event handlers');
414
323
  }
415
- /**
416
- * Shuts down the Matterbridge instance and exits the process.
417
- */
418
324
  async function shutdown() {
419
325
  log.debug('Received shutdown event, exiting...');
420
326
  if (hasParameter('inspect'))
421
327
  await stopInspector();
422
328
  await stopCpuMemoryCheck();
423
329
  cliEmitter.emit('shutdown');
424
- // eslint-disable-next-line n/no-process-exit
425
330
  process.exit(0);
426
331
  }
427
- /**
428
- * Restarts the Matterbridge instance.
429
- */
430
332
  async function restart() {
431
333
  log.debug('Received restart event, loading...');
432
334
  instance = await Matterbridge.loadInstance(true);
433
335
  registerHandlers();
434
336
  }
435
- /**
436
- * Updates the Matterbridge instance.
437
- */
438
337
  async function update() {
439
338
  log.debug('Received update event, updating...');
440
- // TODO: Implement update logic outside of matterbridge
441
339
  instance = await Matterbridge.loadInstance(true);
442
340
  registerHandlers();
443
341
  }
444
- /**
445
- * Starts the CPU and memory check when the -startmemorycheck parameter is passed.
446
- */
447
342
  async function start() {
448
343
  log.debug('Received start memory check event');
449
344
  await startCpuMemoryCheck();
450
345
  }
451
- /**
452
- * Stops the CPU and memory check when the -stopmemorycheck parameter is passed.
453
- */
454
346
  async function stop() {
455
347
  log.debug('Received stop memory check event');
456
348
  await stopCpuMemoryCheck();
457
349
  }
458
- /**
459
- * Main function that initializes the Matterbridge instance and starts the CLI.
460
- *
461
- * @remarks
462
- *
463
- * Debug parameters:
464
- *
465
- * --debug enables debug logging.
466
- *
467
- * --loader enables loader logging.
468
- *
469
- * --trace enables cpu and memory logging and history logging on shutdown.
470
- *
471
- * --memoryinterval <milliseconds> can be used to set the CPU and memory check interval. Default is 10 seconds.
472
- *
473
- * --inspect enables the inspector for heap sampling.
474
- *
475
- * --snapshotinterval <milliseconds> can be used to set the heap snapshot interval. Default is undefined. Minimum is 30000 ms.
476
- */
477
350
  async function main() {
478
351
  log.debug(`Cli main() started`);
479
352
  await startCpuMemoryCheck();
@@ -482,7 +355,6 @@ async function main() {
482
355
  log.debug(`***Matterbridge.loadInstance(true) called`);
483
356
  instance = await Matterbridge.loadInstance(true);
484
357
  log.debug(`***Matterbridge.loadInstance(true) exited`);
485
- // Check if the instance needs to shut down from parseCommandLine()
486
358
  if (!instance || instance.shutdown) {
487
359
  shutdown();
488
360
  }
@@ -491,11 +363,9 @@ async function main() {
491
363
  cliEmitter.emit('ready');
492
364
  }
493
365
  }
494
- // Run the main function
495
366
  process.title = 'matterbridge';
496
367
  main().catch((error) => {
497
368
  const errorMessage = error instanceof Error ? error.message : error;
498
369
  const errorInspect = inspect(error, { depth: 10 });
499
370
  log.error(`Matterbridge.loadInstance() failed with error: ${errorMessage}\nstack: ${errorInspect}`);
500
371
  });
501
- //# sourceMappingURL=cli.js.map
@@ -1,49 +1,12 @@
1
- /**
2
- * This file contains the CLI emitter.
3
- *
4
- * @file cliEmitter.ts
5
- * @author Luca Liguori
6
- * @created 2025-07-04
7
- * @version 1.0.2
8
- * @license Apache-2.0
9
- *
10
- * Copyright 2025, 2026, 2027 Luca Liguori.
11
- *
12
- * Licensed under the Apache License, Version 2.0 (the "License");
13
- * you may not use this file except in compliance with the License.
14
- * You may obtain a copy of the License at
15
- *
16
- * http://www.apache.org/licenses/LICENSE-2.0
17
- *
18
- * Unless required by applicable law or agreed to in writing, software
19
- * distributed under the License is distributed on an "AS IS" BASIS,
20
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
21
- * See the License for the specific language governing permissions and
22
- * limitations under the License.
23
- */
24
- // eslint-disable-next-line no-console
25
1
  if (process.argv.includes('--loader') || process.argv.includes('-loader'))
26
2
  console.log('\u001B[32mCli emitter loaded.\u001B[40;0m');
27
3
  import { EventEmitter } from 'node:events';
28
4
  export const cliEmitter = new EventEmitter();
29
5
  export let lastOsCpuUsage = 0;
30
6
  export let lastProcessCpuUsage = 0;
31
- /**
32
- * Sets the last os CPU usage.
33
- *
34
- * @param {number} val - The os CPU usage percentage to set.
35
- * @returns {void}
36
- */
37
7
  export function setLastOsCpuUsage(val) {
38
8
  lastOsCpuUsage = val;
39
9
  }
40
- /**
41
- * Sets the last process CPU usage.
42
- *
43
- * @param {number} val - The process CPU usage percentage to set.
44
- * @returns {void}
45
- */
46
10
  export function setLastProcessCpuUsage(val) {
47
11
  lastProcessCpuUsage = val;
48
12
  }
49
- //# sourceMappingURL=cliEmitter.js.map