matterbridge 3.2.6 → 3.2.7-dev-20250908-3bb699e

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 (279) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/dist/cli.js +2 -91
  3. package/dist/cliEmitter.js +0 -30
  4. package/dist/clusters/export.js +0 -2
  5. package/dist/defaultConfigSchema.js +3 -24
  6. package/dist/deviceManager.js +1 -94
  7. package/dist/devices/airConditioner.js +0 -57
  8. package/dist/devices/batteryStorage.js +1 -48
  9. package/dist/devices/cooktop.js +0 -55
  10. package/dist/devices/dishwasher.js +0 -57
  11. package/dist/devices/evse.js +10 -74
  12. package/dist/devices/export.js +0 -5
  13. package/dist/devices/extractorHood.js +0 -42
  14. package/dist/devices/heatPump.js +2 -50
  15. package/dist/devices/laundryDryer.js +3 -62
  16. package/dist/devices/laundryWasher.js +4 -70
  17. package/dist/devices/microwaveOven.js +5 -88
  18. package/dist/devices/oven.js +0 -85
  19. package/dist/devices/refrigerator.js +0 -102
  20. package/dist/devices/roboticVacuumCleaner.js +9 -100
  21. package/dist/devices/solarPower.js +0 -38
  22. package/dist/devices/speaker.js +0 -80
  23. package/dist/devices/temperatureControl.js +3 -25
  24. package/dist/devices/waterHeater.js +2 -82
  25. package/dist/dgram/coap.js +13 -126
  26. package/dist/dgram/dgram.js +2 -114
  27. package/dist/dgram/mb_coap.js +3 -41
  28. package/dist/dgram/mb_mdns.js +15 -80
  29. package/dist/dgram/mdns.js +137 -299
  30. package/dist/dgram/multicast.js +1 -62
  31. package/dist/dgram/unicast.js +0 -54
  32. package/dist/frontend.js +24 -450
  33. package/dist/globalMatterbridge.js +0 -47
  34. package/dist/helpers.js +0 -53
  35. package/dist/index.js +1 -30
  36. package/dist/jest-utils/jestHelpers.js +2 -124
  37. package/dist/logger/export.js +0 -1
  38. package/dist/matter/behaviors.js +0 -2
  39. package/dist/matter/clusters.js +0 -2
  40. package/dist/matter/devices.js +0 -2
  41. package/dist/matter/endpoints.js +0 -2
  42. package/dist/matter/export.js +0 -3
  43. package/dist/matter/types.js +0 -3
  44. package/dist/matterbridge.js +49 -780
  45. package/dist/matterbridgeAccessoryPlatform.js +0 -36
  46. package/dist/matterbridgeBehaviors.js +5 -65
  47. package/dist/matterbridgeDeviceTypes.js +17 -630
  48. package/dist/matterbridgeDynamicPlatform.js +0 -36
  49. package/dist/matterbridgeEndpoint.js +54 -1301
  50. package/dist/matterbridgeEndpointHelpers.js +12 -345
  51. package/dist/matterbridgePlatform.js +1 -305
  52. package/dist/matterbridgeTypes.js +0 -25
  53. package/dist/pluginManager.js +5 -251
  54. package/dist/shelly.js +7 -168
  55. package/dist/storage/export.js +0 -1
  56. package/dist/update.js +0 -69
  57. package/dist/utils/colorUtils.js +2 -97
  58. package/dist/utils/commandLine.js +0 -54
  59. package/dist/utils/copyDirectory.js +1 -38
  60. package/dist/utils/createDirectory.js +0 -33
  61. package/dist/utils/createZip.js +2 -47
  62. package/dist/utils/deepCopy.js +0 -39
  63. package/dist/utils/deepEqual.js +1 -72
  64. package/dist/utils/error.js +0 -41
  65. package/dist/utils/export.js +0 -1
  66. package/dist/utils/hex.js +0 -124
  67. package/dist/utils/isvalid.js +0 -101
  68. package/dist/utils/network.js +6 -92
  69. package/dist/utils/spawn.js +0 -40
  70. package/dist/utils/wait.js +8 -60
  71. package/npm-shrinkwrap.json +2 -2
  72. package/package.json +1 -2
  73. package/dist/cli.d.ts +0 -26
  74. package/dist/cli.d.ts.map +0 -1
  75. package/dist/cli.js.map +0 -1
  76. package/dist/cliEmitter.d.ts +0 -34
  77. package/dist/cliEmitter.d.ts.map +0 -1
  78. package/dist/cliEmitter.js.map +0 -1
  79. package/dist/clusters/export.d.ts +0 -2
  80. package/dist/clusters/export.d.ts.map +0 -1
  81. package/dist/clusters/export.js.map +0 -1
  82. package/dist/defaultConfigSchema.d.ts +0 -28
  83. package/dist/defaultConfigSchema.d.ts.map +0 -1
  84. package/dist/defaultConfigSchema.js.map +0 -1
  85. package/dist/deviceManager.d.ts +0 -112
  86. package/dist/deviceManager.d.ts.map +0 -1
  87. package/dist/deviceManager.js.map +0 -1
  88. package/dist/devices/airConditioner.d.ts +0 -98
  89. package/dist/devices/airConditioner.d.ts.map +0 -1
  90. package/dist/devices/airConditioner.js.map +0 -1
  91. package/dist/devices/batteryStorage.d.ts +0 -48
  92. package/dist/devices/batteryStorage.d.ts.map +0 -1
  93. package/dist/devices/batteryStorage.js.map +0 -1
  94. package/dist/devices/cooktop.d.ts +0 -60
  95. package/dist/devices/cooktop.d.ts.map +0 -1
  96. package/dist/devices/cooktop.js.map +0 -1
  97. package/dist/devices/dishwasher.d.ts +0 -71
  98. package/dist/devices/dishwasher.d.ts.map +0 -1
  99. package/dist/devices/dishwasher.js.map +0 -1
  100. package/dist/devices/evse.d.ts +0 -75
  101. package/dist/devices/evse.d.ts.map +0 -1
  102. package/dist/devices/evse.js.map +0 -1
  103. package/dist/devices/export.d.ts +0 -17
  104. package/dist/devices/export.d.ts.map +0 -1
  105. package/dist/devices/export.js.map +0 -1
  106. package/dist/devices/extractorHood.d.ts +0 -46
  107. package/dist/devices/extractorHood.d.ts.map +0 -1
  108. package/dist/devices/extractorHood.js.map +0 -1
  109. package/dist/devices/heatPump.d.ts +0 -47
  110. package/dist/devices/heatPump.d.ts.map +0 -1
  111. package/dist/devices/heatPump.js.map +0 -1
  112. package/dist/devices/laundryDryer.d.ts +0 -67
  113. package/dist/devices/laundryDryer.d.ts.map +0 -1
  114. package/dist/devices/laundryDryer.js.map +0 -1
  115. package/dist/devices/laundryWasher.d.ts +0 -81
  116. package/dist/devices/laundryWasher.d.ts.map +0 -1
  117. package/dist/devices/laundryWasher.js.map +0 -1
  118. package/dist/devices/microwaveOven.d.ts +0 -168
  119. package/dist/devices/microwaveOven.d.ts.map +0 -1
  120. package/dist/devices/microwaveOven.js.map +0 -1
  121. package/dist/devices/oven.d.ts +0 -105
  122. package/dist/devices/oven.d.ts.map +0 -1
  123. package/dist/devices/oven.js.map +0 -1
  124. package/dist/devices/refrigerator.d.ts +0 -118
  125. package/dist/devices/refrigerator.d.ts.map +0 -1
  126. package/dist/devices/refrigerator.js.map +0 -1
  127. package/dist/devices/roboticVacuumCleaner.d.ts +0 -112
  128. package/dist/devices/roboticVacuumCleaner.d.ts.map +0 -1
  129. package/dist/devices/roboticVacuumCleaner.js.map +0 -1
  130. package/dist/devices/solarPower.d.ts +0 -40
  131. package/dist/devices/solarPower.d.ts.map +0 -1
  132. package/dist/devices/solarPower.js.map +0 -1
  133. package/dist/devices/speaker.d.ts +0 -83
  134. package/dist/devices/speaker.d.ts.map +0 -1
  135. package/dist/devices/speaker.js.map +0 -1
  136. package/dist/devices/temperatureControl.d.ts +0 -166
  137. package/dist/devices/temperatureControl.d.ts.map +0 -1
  138. package/dist/devices/temperatureControl.js.map +0 -1
  139. package/dist/devices/waterHeater.d.ts +0 -111
  140. package/dist/devices/waterHeater.d.ts.map +0 -1
  141. package/dist/devices/waterHeater.js.map +0 -1
  142. package/dist/dgram/coap.d.ts +0 -205
  143. package/dist/dgram/coap.d.ts.map +0 -1
  144. package/dist/dgram/coap.js.map +0 -1
  145. package/dist/dgram/dgram.d.ts +0 -141
  146. package/dist/dgram/dgram.d.ts.map +0 -1
  147. package/dist/dgram/dgram.js.map +0 -1
  148. package/dist/dgram/mb_coap.d.ts +0 -24
  149. package/dist/dgram/mb_coap.d.ts.map +0 -1
  150. package/dist/dgram/mb_coap.js.map +0 -1
  151. package/dist/dgram/mb_mdns.d.ts +0 -24
  152. package/dist/dgram/mb_mdns.d.ts.map +0 -1
  153. package/dist/dgram/mb_mdns.js.map +0 -1
  154. package/dist/dgram/mdns.d.ts +0 -290
  155. package/dist/dgram/mdns.d.ts.map +0 -1
  156. package/dist/dgram/mdns.js.map +0 -1
  157. package/dist/dgram/multicast.d.ts +0 -67
  158. package/dist/dgram/multicast.d.ts.map +0 -1
  159. package/dist/dgram/multicast.js.map +0 -1
  160. package/dist/dgram/unicast.d.ts +0 -56
  161. package/dist/dgram/unicast.d.ts.map +0 -1
  162. package/dist/dgram/unicast.js.map +0 -1
  163. package/dist/frontend.d.ts +0 -313
  164. package/dist/frontend.d.ts.map +0 -1
  165. package/dist/frontend.js.map +0 -1
  166. package/dist/globalMatterbridge.d.ts +0 -59
  167. package/dist/globalMatterbridge.d.ts.map +0 -1
  168. package/dist/globalMatterbridge.js.map +0 -1
  169. package/dist/helpers.d.ts +0 -48
  170. package/dist/helpers.d.ts.map +0 -1
  171. package/dist/helpers.js.map +0 -1
  172. package/dist/index.d.ts +0 -33
  173. package/dist/index.d.ts.map +0 -1
  174. package/dist/index.js.map +0 -1
  175. package/dist/jest-utils/jestHelpers.d.ts +0 -103
  176. package/dist/jest-utils/jestHelpers.d.ts.map +0 -1
  177. package/dist/jest-utils/jestHelpers.js.map +0 -1
  178. package/dist/logger/export.d.ts +0 -2
  179. package/dist/logger/export.d.ts.map +0 -1
  180. package/dist/logger/export.js.map +0 -1
  181. package/dist/matter/behaviors.d.ts +0 -2
  182. package/dist/matter/behaviors.d.ts.map +0 -1
  183. package/dist/matter/behaviors.js.map +0 -1
  184. package/dist/matter/clusters.d.ts +0 -2
  185. package/dist/matter/clusters.d.ts.map +0 -1
  186. package/dist/matter/clusters.js.map +0 -1
  187. package/dist/matter/devices.d.ts +0 -2
  188. package/dist/matter/devices.d.ts.map +0 -1
  189. package/dist/matter/devices.js.map +0 -1
  190. package/dist/matter/endpoints.d.ts +0 -2
  191. package/dist/matter/endpoints.d.ts.map +0 -1
  192. package/dist/matter/endpoints.js.map +0 -1
  193. package/dist/matter/export.d.ts +0 -5
  194. package/dist/matter/export.d.ts.map +0 -1
  195. package/dist/matter/export.js.map +0 -1
  196. package/dist/matter/types.d.ts +0 -3
  197. package/dist/matter/types.d.ts.map +0 -1
  198. package/dist/matter/types.js.map +0 -1
  199. package/dist/matterbridge.d.ts +0 -457
  200. package/dist/matterbridge.d.ts.map +0 -1
  201. package/dist/matterbridge.js.map +0 -1
  202. package/dist/matterbridgeAccessoryPlatform.d.ts +0 -42
  203. package/dist/matterbridgeAccessoryPlatform.d.ts.map +0 -1
  204. package/dist/matterbridgeAccessoryPlatform.js.map +0 -1
  205. package/dist/matterbridgeBehaviors.d.ts +0 -1351
  206. package/dist/matterbridgeBehaviors.d.ts.map +0 -1
  207. package/dist/matterbridgeBehaviors.js.map +0 -1
  208. package/dist/matterbridgeDeviceTypes.d.ts +0 -761
  209. package/dist/matterbridgeDeviceTypes.d.ts.map +0 -1
  210. package/dist/matterbridgeDeviceTypes.js.map +0 -1
  211. package/dist/matterbridgeDynamicPlatform.d.ts +0 -42
  212. package/dist/matterbridgeDynamicPlatform.d.ts.map +0 -1
  213. package/dist/matterbridgeDynamicPlatform.js.map +0 -1
  214. package/dist/matterbridgeEndpoint.d.ts +0 -1438
  215. package/dist/matterbridgeEndpoint.d.ts.map +0 -1
  216. package/dist/matterbridgeEndpoint.js.map +0 -1
  217. package/dist/matterbridgeEndpointHelpers.d.ts +0 -407
  218. package/dist/matterbridgeEndpointHelpers.d.ts.map +0 -1
  219. package/dist/matterbridgeEndpointHelpers.js.map +0 -1
  220. package/dist/matterbridgePlatform.d.ts +0 -379
  221. package/dist/matterbridgePlatform.d.ts.map +0 -1
  222. package/dist/matterbridgePlatform.js.map +0 -1
  223. package/dist/matterbridgeTypes.d.ts +0 -198
  224. package/dist/matterbridgeTypes.d.ts.map +0 -1
  225. package/dist/matterbridgeTypes.js.map +0 -1
  226. package/dist/pluginManager.d.ts +0 -270
  227. package/dist/pluginManager.d.ts.map +0 -1
  228. package/dist/pluginManager.js.map +0 -1
  229. package/dist/shelly.d.ts +0 -174
  230. package/dist/shelly.d.ts.map +0 -1
  231. package/dist/shelly.js.map +0 -1
  232. package/dist/storage/export.d.ts +0 -2
  233. package/dist/storage/export.d.ts.map +0 -1
  234. package/dist/storage/export.js.map +0 -1
  235. package/dist/update.d.ts +0 -75
  236. package/dist/update.d.ts.map +0 -1
  237. package/dist/update.js.map +0 -1
  238. package/dist/utils/colorUtils.d.ts +0 -99
  239. package/dist/utils/colorUtils.d.ts.map +0 -1
  240. package/dist/utils/colorUtils.js.map +0 -1
  241. package/dist/utils/commandLine.d.ts +0 -59
  242. package/dist/utils/commandLine.d.ts.map +0 -1
  243. package/dist/utils/commandLine.js.map +0 -1
  244. package/dist/utils/copyDirectory.d.ts +0 -33
  245. package/dist/utils/copyDirectory.d.ts.map +0 -1
  246. package/dist/utils/copyDirectory.js.map +0 -1
  247. package/dist/utils/createDirectory.d.ts +0 -34
  248. package/dist/utils/createDirectory.d.ts.map +0 -1
  249. package/dist/utils/createDirectory.js.map +0 -1
  250. package/dist/utils/createZip.d.ts +0 -39
  251. package/dist/utils/createZip.d.ts.map +0 -1
  252. package/dist/utils/createZip.js.map +0 -1
  253. package/dist/utils/deepCopy.d.ts +0 -32
  254. package/dist/utils/deepCopy.d.ts.map +0 -1
  255. package/dist/utils/deepCopy.js.map +0 -1
  256. package/dist/utils/deepEqual.d.ts +0 -54
  257. package/dist/utils/deepEqual.d.ts.map +0 -1
  258. package/dist/utils/deepEqual.js.map +0 -1
  259. package/dist/utils/error.d.ts +0 -44
  260. package/dist/utils/error.d.ts.map +0 -1
  261. package/dist/utils/error.js.map +0 -1
  262. package/dist/utils/export.d.ts +0 -13
  263. package/dist/utils/export.d.ts.map +0 -1
  264. package/dist/utils/export.js.map +0 -1
  265. package/dist/utils/hex.d.ts +0 -89
  266. package/dist/utils/hex.d.ts.map +0 -1
  267. package/dist/utils/hex.js.map +0 -1
  268. package/dist/utils/isvalid.d.ts +0 -103
  269. package/dist/utils/isvalid.d.ts.map +0 -1
  270. package/dist/utils/isvalid.js.map +0 -1
  271. package/dist/utils/network.d.ts +0 -84
  272. package/dist/utils/network.d.ts.map +0 -1
  273. package/dist/utils/network.js.map +0 -1
  274. package/dist/utils/spawn.d.ts +0 -33
  275. package/dist/utils/spawn.d.ts.map +0 -1
  276. package/dist/utils/spawn.js.map +0 -1
  277. package/dist/utils/wait.d.ts +0 -54
  278. package/dist/utils/wait.d.ts.map +0 -1
  279. package/dist/utils/wait.js.map +0 -1
@@ -1,70 +1,23 @@
1
- /**
2
- * This file contains functions to set and get global instances of Matterbridge, Frontend, and Logger.
3
- *
4
- * @file globalMatterbridge.ts
5
- * @author Luca Liguori
6
- * @created 2025-06-01
7
- * @version 1.0.0
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
- /**
25
- * Store the Matterbridge instance globally for later retrieval.
26
- *
27
- * @param {Matterbridge} matterbridge An initialized Matterbridge instance
28
- */
29
1
  export function setGlobalMatterbridge(matterbridge) {
30
2
  globalThis.__matterbridge__ = matterbridge;
31
3
  globalThis.__frontend__ = matterbridge.frontend;
32
4
  globalThis.__log__ = matterbridge.log;
33
5
  }
34
- /**
35
- * Retrieve the globally stored Matterbridge instance.
36
- *
37
- * @returns {Matterbridge} The Matterbridge instance.
38
- * @throws {Error} If the Matterbridge instance is not set.
39
- */
40
6
  export function getGlobalMatterbridge() {
41
7
  if (!globalThis.__matterbridge__) {
42
8
  throw new Error('Global Matterbridge instance is not set.');
43
9
  }
44
10
  return globalThis.__matterbridge__;
45
11
  }
46
- /**
47
- * Retrieve the globally stored Frontend instance.
48
- *
49
- * @returns {Frontend} The Frontend instance.
50
- * @throws {Error} If the Frontend instance is not set.
51
- */
52
12
  export function getGlobalFrontend() {
53
13
  if (!globalThis.__frontend__) {
54
14
  throw new Error('Global Frontend instance is not set.');
55
15
  }
56
16
  return globalThis.__frontend__;
57
17
  }
58
- /**
59
- * Retrieve the globally stored Logger instance.
60
- *
61
- * @returns {AnsiLogger} The AnsiLogger instance.
62
- * @throws {Error} If the Logger instance is not set.
63
- */
64
18
  export function getGlobalLog() {
65
19
  if (!globalThis.__log__) {
66
20
  throw new Error('Global Logger instance is not set.');
67
21
  }
68
22
  return globalThis.__log__;
69
23
  }
70
- //# sourceMappingURL=globalMatterbridge.js.map
package/dist/helpers.js CHANGED
@@ -1,27 +1,3 @@
1
- /**
2
- * This file contains the helpers functions of Matterbridge.
3
- *
4
- * @file helpers.ts
5
- * @author Luca Liguori
6
- * @created 2025-05-12
7
- * @version 1.0.0
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
- // @matter module
25
1
  import { OnOff } from '@matter/main/clusters/on-off';
26
2
  import { Endpoint } from '@matter/node';
27
3
  import { BridgedDeviceBasicInformationServer } from '@matter/node/behaviors/bridged-device-basic-information';
@@ -30,24 +6,8 @@ import { OnOffPlugInUnitDevice } from '@matter/node/devices/on-off-plug-in-unit'
30
6
  import { MountedOnOffControlDevice } from '@matter/node/devices/mounted-on-off-control';
31
7
  import { OnOffLightDevice } from '@matter/node/devices/on-off-light';
32
8
  import { OnOffLightSwitchDevice } from '@matter/node/devices/on-off-light-switch';
33
- // Matterbridge
34
9
  import { hasParameter } from './utils/commandLine.js';
35
- /**
36
- * Adds a virtual device to the provided endpoint, sets up an event listener for device state changes,
37
- * and ensures the device is initialized in the off state.
38
- *
39
- * @param {Endpoint<AggregatorEndpoint>} aggregatorEndpoint - The aggragator endpoint to which the virtual device will be added.
40
- * @param {string} name - The name of the virtual device. Spaces in the name are removed to form the device ID.
41
- * @param {'light' | 'outlet' | 'switch' | 'mounted_switch'} type - The type of the virtual device. Can be 'light', 'outlet', 'switch', or 'mounted_switch'.
42
- * @param {() => Promise<void>} callback - A callback function that gets executed when the device's on/off state changes to true.
43
- * @returns {Promise<Endpoint>} A promise that resolves with the created virtual device.
44
- * @remarks The virtual device is created as an instance of `Endpoint` with the `OnOffPlugInUnitDevice` device type.
45
- * The onOff state always reverts to false when the device is turned on.
46
- */
47
10
  export async function addVirtualDevice(aggregatorEndpoint, name, type, callback) {
48
- // Create a new virtual device by instantiating `Endpoint` with device information.
49
- // The device ID is created by replacing all spaces in the name with an empty string.
50
- // The node label of the bridged device basic information is set to the given name.
51
11
  let deviceType;
52
12
  switch (type) {
53
13
  case 'light':
@@ -68,9 +28,7 @@ export async function addVirtualDevice(aggregatorEndpoint, name, type, callback)
68
28
  bridgedDeviceBasicInformation: { nodeLabel: name.slice(0, 32) },
69
29
  onOff: { onOff: false, startUpOnOff: OnOff.StartUpOnOff.Off },
70
30
  });
71
- // Set up an event listener for when the `onOff` state changes.
72
31
  device.events.onOff.onOff$Changed.on((value) => {
73
- // If the `onOff` state becomes true, turn off the virtual device and execute the callback.
74
32
  if (value) {
75
33
  callback();
76
34
  process.nextTick(async () => {
@@ -78,24 +36,14 @@ export async function addVirtualDevice(aggregatorEndpoint, name, type, callback)
78
36
  await device.setStateOf(OnOffBaseServer, { onOff: false });
79
37
  }
80
38
  catch (_error) {
81
- // Not necessary to handle the error
82
39
  }
83
40
  });
84
41
  }
85
42
  });
86
- // Add the created device to the given endpoint.
87
43
  await aggregatorEndpoint.add(device);
88
- // Initially set the state of the virtual device's `OnOffBaseServer` to false (off).
89
44
  await device.setStateOf(OnOffBaseServer, { onOff: false });
90
45
  return device;
91
46
  }
92
- /**
93
- * Creates and add the virtual devices to the aggregator.
94
- *
95
- * @param {Matterbridge} matterbridge - The Matterbridge instance.
96
- * @param {Endpoint<AggregatorEndpoint>} aggregatorEndpoint - The aggregator node to add the virtual devices to.
97
- * @returns {Promise<void>} A promise that resolves when the virtual devices are added.
98
- */
99
47
  export async function addVirtualDevices(matterbridge, aggregatorEndpoint) {
100
48
  if (matterbridge.matterbridgeInformation.virtualMode !== 'disabled' && matterbridge.bridgeMode === 'bridge' && aggregatorEndpoint) {
101
49
  matterbridge.log.notice(`Creating virtual devices for Matterbridge server node...`);
@@ -144,4 +92,3 @@ export async function addVirtualDevices(matterbridge, aggregatorEndpoint) {
144
92
  }
145
93
  }
146
94
  }
147
- //# sourceMappingURL=helpers.js.map
package/dist/index.js CHANGED
@@ -1,31 +1,6 @@
1
- /**
2
- * @description This file contains the entry point of Matterbridge.
3
- * @file index.ts
4
- * @author Luca Liguori
5
- * @created 2023-12-29
6
- * @version 1.0.7
7
- * @license Apache-2.0
8
- *
9
- * Copyright 2023, 2024, 2025 Luca Liguori.
10
- *
11
- * Licensed under the Apache License, Version 2.0 (the "License");
12
- * you may not use this file except in compliance with the License.
13
- * You may obtain a copy of the License at
14
- *
15
- * http://www.apache.org/licenses/LICENSE-2.0
16
- *
17
- * Unless required by applicable law or agreed to in writing, software
18
- * distributed under the License is distributed on an "AS IS" BASIS,
19
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
20
- * See the License for the specific language governing permissions and
21
- * limitations under the License.
22
- */
23
- // AnsiLogger module
24
1
  import { AnsiLogger } from 'node-ansi-logger';
25
- // Matterbridge
26
2
  import { Matterbridge } from './matterbridge.js';
27
3
  import { hasParameter } from './utils/export.js';
28
- // Matterbridge
29
4
  export * from './matterbridge.js';
30
5
  export * from './matterbridgeTypes.js';
31
6
  export * from './matterbridgeEndpoint.js';
@@ -36,10 +11,7 @@ export * from './matterbridgePlatform.js';
36
11
  export * from './matterbridgeAccessoryPlatform.js';
37
12
  export * from './matterbridgeDynamicPlatform.js';
38
13
  export { addVirtualDevice } from './helpers.js';
39
- const log = new AnsiLogger({ logName: 'Main', logTimestampFormat: 4 /* TimestampFormat.TIME_MILLIS */, logLevel: hasParameter('debug') ? "debug" /* LogLevel.DEBUG */ : "info" /* LogLevel.INFO */ });
40
- /**
41
- * Main function to load the Matterbridge instance.
42
- */
14
+ const log = new AnsiLogger({ logName: 'Main', logTimestampFormat: 4, logLevel: hasParameter('debug') ? "debug" : "info" });
43
15
  async function main() {
44
16
  log.debug('***Matterbridge.loadInstance() called');
45
17
  await Matterbridge.loadInstance();
@@ -48,4 +20,3 @@ async function main() {
48
20
  main().catch((error) => {
49
21
  log.error(`Matterbridge.loadInstance() failed with error: ${error instanceof Error ? error.message : error}`);
50
22
  });
51
- //# sourceMappingURL=index.js.map
@@ -1,48 +1,8 @@
1
- /**
2
- * @description This file contains the Jest helpers.
3
- * @file src/jest/helpers.test.ts
4
- * @author Luca Liguori
5
- * @created 2025-09-03
6
- * @version 1.0.1
7
- * @license Apache-2.0
8
- *
9
- * Copyright 2025, 2026, 2027 Luca Liguori.
10
- *
11
- * Licensed under the Apache License, Version 2.0 (the "License");
12
- * you may not use this file except in compliance with the License.
13
- * You may obtain a copy of the License at
14
- *
15
- * http://www.apache.org/licenses/LICENSE-2.0
16
- *
17
- * Unless required by applicable law or agreed to in writing, software
18
- * distributed under the License is distributed on an "AS IS" BASIS,
19
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
20
- * See the License for the specific language governing permissions and
21
- * limitations under the License.
22
- */
23
1
  import { rmSync } from 'node:fs';
24
2
  import { inspect } from 'node:util';
25
- // Matterbridge imports
26
3
  import { DeviceTypeId, Endpoint, Environment, ServerNode, ServerNodeStore, VendorId, LogFormat as MatterLogFormat, LogLevel as MatterLogLevel, Lifecycle } from '@matter/main';
27
4
  import { AggregatorEndpoint, RootEndpoint } from '@matter/main/endpoints';
28
5
  import { MdnsService } from '@matter/main/protocol';
29
- // Plugins imports
30
- /*
31
- import { DeviceTypeId, Endpoint, Environment, MdnsService, ServerNode, ServerNodeStore, VendorId, LogFormat as MatterLogFormat, LogLevel as MatterLogLevel } from 'matterbridge/matter';
32
- import { RootEndpoint, AggregatorEndpoint } from 'matterbridge/matter/endpoints';
33
- */
34
- /**
35
- * Advance the Node.js event loop deterministically to allow chained asynchronous work (Promises scheduled in
36
- * microtasks and follow‑up macrotasks) to complete inside tests without adding arbitrary long timeouts.
37
- *
38
- * NOTE: This does not guarantee OS level network IO completion—only JavaScript task queue progression inside the
39
- * current process.
40
- *
41
- * @param {number} ticks Number of macrotask (setImmediate) turns to yield (default 3).
42
- * @param {number} microTurns Number of microtask drains (Promise.resolve chains) after macrotask yielding (default 10).
43
- * @param {number} pause Final timer delay in ms; set 0 to disable (default 100ms).
44
- * @returns {Promise<void>} Resolves after the requested event loop advancement has completed.
45
- */
46
6
  export async function flushAsync(ticks = 3, microTurns = 10, pause = 100) {
47
7
  for (let i = 0; i < ticks; i++)
48
8
  await new Promise((resolve) => setImmediate(resolve));
@@ -51,19 +11,6 @@ export async function flushAsync(ticks = 3, microTurns = 10, pause = 100) {
51
11
  if (pause)
52
12
  await new Promise((resolve) => setTimeout(resolve, pause));
53
13
  }
54
- /**
55
- * Flush (await) the lazy endpoint number persistence mechanism used by matter.js.
56
- *
57
- * Background:
58
- * assignNumber() batches persistence (store.saveNumber + updating __nextNumber__) via an internal promise (#numbersPersisted).
59
- * Calling endpointStores.close() waits for the current batch only. If new endpoints were added in the same macrotask
60
- * cycle additional micro/macro turns might be needed to ensure the batch started. We defensively yield macrotasks
61
- * (setImmediate) and then await close() multiple rounds.
62
- *
63
- * @param {ServerNode} targetServer The server whose endpoint numbering persistence should be flushed.
64
- * @param {number} rounds Number of macrotask + close cycles to run (2 is usually sufficient; 1 often works).
65
- * @returns {Promise<void>} Resolves when pending number persistence batches have completed.
66
- */
67
14
  export async function flushAllEndpointNumberPersistence(targetServer, rounds = 2) {
68
15
  const nodeStore = targetServer.env.get(ServerNodeStore);
69
16
  for (let i = 0; i < rounds; i++) {
@@ -71,12 +18,6 @@ export async function flushAllEndpointNumberPersistence(targetServer, rounds = 2
71
18
  await nodeStore.endpointStores.close();
72
19
  }
73
20
  }
74
- /**
75
- * Collect all endpoints in the server endpoint tree (root -> descendants).
76
- *
77
- * @param {Endpoint} root Root endpoint (typically the ServerNode root endpoint cast as Endpoint).
78
- * @returns {Endpoint[]} Flat array including the root and every descendant once.
79
- */
80
21
  function collectAllEndpoints(root) {
81
22
  const list = [];
82
23
  const walk = (ep) => {
@@ -90,26 +31,14 @@ function collectAllEndpoints(root) {
90
31
  walk(root);
91
32
  return list;
92
33
  }
93
- /**
94
- * Assert that every endpoint attached to the server has an assigned and (batch-)persisted endpoint number.
95
- *
96
- * This waits for any outstanding number persistence batch (endpointStores.close()), then traverses the endpoint
97
- * graph and asserts:
98
- * - Root endpoint: number is 0 (allowing undefined to coerce to 0 via nullish coalescing check).
99
- * - All other endpoints: number > 0.
100
- *
101
- * @param {ServerNode} targetServer The server whose endpoint numbers are verified.
102
- * @returns {Promise<void>} Resolves when assertions complete.
103
- */
104
34
  export async function assertAllEndpointNumbersPersisted(targetServer) {
105
35
  const nodeStore = targetServer.env.get(ServerNodeStore);
106
- // Ensure any pending persistence finished (flush any in-flight batch promise)
107
36
  await nodeStore.endpointStores.close();
108
37
  const all = collectAllEndpoints(targetServer);
109
38
  for (const ep of all) {
110
39
  const store = nodeStore.storeForEndpoint(ep);
111
40
  if (ep.maybeNumber === 0) {
112
- expect(store.number ?? 0).toBe(0); // root
41
+ expect(store.number ?? 0).toBe(0);
113
42
  }
114
43
  else {
115
44
  expect(store.number).toBeGreaterThan(0);
@@ -117,20 +46,11 @@ export async function assertAllEndpointNumbersPersisted(targetServer) {
117
46
  }
118
47
  return all.length;
119
48
  }
120
- /**
121
- * Create a Matterbridge Environment for testing.
122
- * It will remove any existing home directory.
123
- *
124
- * @param {string} homeDir Home directory for the environment.
125
- * @returns {Environment} The created environment.
126
- */
127
49
  export function createTestEnvironment(homeDir) {
128
50
  expect(homeDir).toBeDefined();
129
51
  expect(typeof homeDir).toBe('string');
130
- expect(homeDir.length).toBeGreaterThan(5); // avoid accidental deletion of short paths like "/" or "C:\"
131
- // Cleanup any existing home directory
52
+ expect(homeDir.length).toBeGreaterThan(5);
132
53
  rmSync(homeDir, { recursive: true, force: true });
133
- // Setup the matter environment
134
54
  const environment = Environment.default;
135
55
  environment.vars.set('log.level', MatterLogLevel.DEBUG);
136
56
  environment.vars.set('log.format', MatterLogFormat.ANSI);
@@ -139,15 +59,7 @@ export function createTestEnvironment(homeDir) {
139
59
  environment.vars.set('runtime.exitcode', false);
140
60
  return environment;
141
61
  }
142
- /**
143
- * Start a Matterbridge ServerNode for testing.
144
- *
145
- * @param {string} name Name of the server (used for logging and product description).
146
- * @param {number} port TCP port to listen on.
147
- * @returns {Promise<[ServerNode<ServerNode.RootEndpoint>, Endpoint<AggregatorEndpoint>]>} Resolves to an array containing the created ServerNode and its AggregatorNode.
148
- */
149
62
  export async function startServerNode(name, port) {
150
- // Create the server node
151
63
  const server = await ServerNode.create({
152
64
  id: name + 'ServerNode',
153
65
  productDescription: {
@@ -156,7 +68,6 @@ export async function startServerNode(name, port) {
156
68
  vendorId: VendorId(0xfff1),
157
69
  productId: 0x8000,
158
70
  },
159
- // Provide defaults for the BasicInformation cluster on the Root endpoint
160
71
  basicInformation: {
161
72
  vendorId: VendorId(0xfff1),
162
73
  vendorName: 'Matterbridge',
@@ -173,26 +84,21 @@ export async function startServerNode(name, port) {
173
84
  });
174
85
  expect(server).toBeDefined();
175
86
  expect(server.lifecycle.isReady).toBeTruthy();
176
- // Create the aggregator node
177
87
  const aggregator = new Endpoint(AggregatorEndpoint, {
178
88
  id: name + 'AggregatorNode',
179
89
  });
180
90
  expect(aggregator).toBeDefined();
181
- // Add the aggregator to the server
182
91
  await server.add(aggregator);
183
92
  expect(server.parts.has(aggregator.id)).toBeTruthy();
184
93
  expect(server.parts.has(aggregator)).toBeTruthy();
185
94
  expect(aggregator.lifecycle.isReady).toBeTruthy();
186
- // Run the server
187
95
  expect(server.lifecycle.isOnline).toBeFalsy();
188
- // Wait for the server to be online
189
96
  await new Promise((resolve) => {
190
97
  server.lifecycle.online.on(async () => {
191
98
  resolve();
192
99
  });
193
100
  server.start();
194
101
  });
195
- // Check if the server is online
196
102
  expect(server.lifecycle.isReady).toBeTruthy();
197
103
  expect(server.lifecycle.isOnline).toBeTruthy();
198
104
  expect(server.lifecycle.isCommissioned).toBeFalsy();
@@ -206,36 +112,18 @@ export async function startServerNode(name, port) {
206
112
  expect(aggregator.lifecycle.hasNumber).toBeTruthy();
207
113
  return [server, aggregator];
208
114
  }
209
- /**
210
- * Stop a Matterbridge ServerNode.
211
- *
212
- * @param {ServerNode<ServerNode.RootEndpoint>} server The server to stop.
213
- * @returns {Promise<void>} Resolves when the server has stopped.
214
- */
215
115
  export async function stopServerNode(server) {
216
- // Flush any pending endpoint number persistence
217
116
  await flushAllEndpointNumberPersistence(server);
218
- // Ensure all endpoint numbers are persisted
219
117
  await assertAllEndpointNumbersPersisted(server);
220
- // Stop the server
221
118
  expect(server).toBeDefined();
222
119
  expect(server.lifecycle.isReady).toBeTruthy();
223
120
  expect(server.lifecycle.isOnline).toBeTruthy();
224
121
  await server.close();
225
122
  expect(server.lifecycle.isReady).toBeTruthy();
226
123
  expect(server.lifecycle.isOnline).toBeFalsy();
227
- // stop the mDNS service
228
124
  await server.env.get(MdnsService)[Symbol.asyncDispose]();
229
- // Ensure the queue is empty and pause 100ms
230
125
  await flushAsync();
231
126
  }
232
- /**
233
- * Add a device (endpoint) to a server or aggregator.
234
- *
235
- * @param {ServerNode<ServerNode.RootEndpoint> | Endpoint<AggregatorEndpoint>} owner The server or aggregator to add the device to.
236
- * @param {Endpoint} device The device to add.
237
- * @returns {Promise<void>} Resolves when the device has been added and is ready.
238
- */
239
127
  export async function addDevice(owner, device) {
240
128
  expect(owner).toBeDefined();
241
129
  expect(device).toBeDefined();
@@ -248,7 +136,6 @@ export async function addDevice(owner, device) {
248
136
  catch (error) {
249
137
  const errorMessage = error instanceof Error ? error.message : error;
250
138
  const errorInspect = inspect(error, { depth: 10 });
251
- // eslint-disable-next-line no-console
252
139
  console.error(`Error adding device ${device.maybeId}.${device.maybeNumber}: ${errorMessage}\nstack: ${errorInspect}`);
253
140
  return false;
254
141
  }
@@ -261,13 +148,6 @@ export async function addDevice(owner, device) {
261
148
  expect(device.construction.status).toBe(Lifecycle.Status.Active);
262
149
  return true;
263
150
  }
264
- /**
265
- * Add a device (endpoint) to a server or aggregator.
266
- *
267
- * @param {ServerNode<ServerNode.RootEndpoint> | Endpoint<AggregatorEndpoint>} owner The server or aggregator to add the device to.
268
- * @param {Endpoint} device The device to add.
269
- * @returns {Promise<void>} Resolves when the device has been added and is ready.
270
- */
271
151
  export async function deleteDevice(owner, device) {
272
152
  expect(owner).toBeDefined();
273
153
  expect(device).toBeDefined();
@@ -280,7 +160,6 @@ export async function deleteDevice(owner, device) {
280
160
  catch (error) {
281
161
  const errorMessage = error instanceof Error ? error.message : error;
282
162
  const errorInspect = inspect(error, { depth: 10 });
283
- // eslint-disable-next-line no-console
284
163
  console.error(`Error deleting device ${device.maybeId}.${device.maybeNumber}: ${errorMessage}\nstack: ${errorInspect}`);
285
164
  return false;
286
165
  }
@@ -293,4 +172,3 @@ export async function deleteDevice(owner, device) {
293
172
  expect(device.construction.status).toBe(Lifecycle.Status.Destroyed);
294
173
  return true;
295
174
  }
296
- //# sourceMappingURL=jestHelpers.js.map
@@ -1,2 +1 @@
1
1
  export * from 'node-ansi-logger';
2
- //# sourceMappingURL=export.js.map
@@ -1,3 +1 @@
1
- // @matter
2
1
  export * from '@matter/node/behaviors';
3
- //# sourceMappingURL=behaviors.js.map
@@ -1,3 +1 @@
1
- // @matter
2
1
  export * from '@matter/types/clusters';
3
- //# sourceMappingURL=clusters.js.map
@@ -1,3 +1 @@
1
- // @matter
2
1
  export * from '@matter/node/devices';
3
- //# sourceMappingURL=devices.js.map
@@ -1,3 +1 @@
1
- // @matter
2
1
  export { AggregatorEndpoint, ElectricalSensorEndpoint, PowerSourceEndpoint, BridgedNodeEndpoint, RootEndpoint, DeviceEnergyManagementEndpoint, OtaProviderEndpoint, OtaRequestorEndpoint } from '@matter/node/endpoints';
3
- //# sourceMappingURL=endpoints.js.map
@@ -1,7 +1,4 @@
1
- /* eslint-disable import/export */
2
- // @matter
3
1
  export * from '@matter/main';
4
2
  export { SemanticNamespace, ClosureTag, CompassDirectionTag, CompassLocationTag, DirectionTag, ElectricalMeasurementTag, LaundryTag, LevelTag, LocationTag, NumberTag, PositionTag, PowerSourceTag, RefrigeratorTag, RoomAirConditionerTag, SwitchesTag, } from '@matter/main';
5
3
  export { AttributeElement, ClusterElement, ClusterModel, CommandElement, EventElement, FieldElement } from '@matter/main/model';
6
4
  export { MdnsService, Val } from '@matter/main/protocol';
7
- //# sourceMappingURL=export.js.map
@@ -1,5 +1,2 @@
1
- /* eslint-disable import/export */
2
- // @matter
3
1
  export * from '@matter/types';
4
2
  export { ClusterRegistry } from '@matter/types';
5
- //# sourceMappingURL=types.js.map