homebridge 2.0.0-beta.44 → 2.0.0-beta.46

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 (321) hide show
  1. package/dist/api.d.ts +3 -365
  2. package/dist/api.d.ts.map +1 -1
  3. package/dist/api.js +13 -85
  4. package/dist/api.js.map +1 -1
  5. package/dist/bridgeService.d.ts +0 -25
  6. package/dist/bridgeService.d.ts.map +1 -1
  7. package/dist/bridgeService.js +32 -85
  8. package/dist/bridgeService.js.map +1 -1
  9. package/dist/childBridgeFork.d.ts +12 -15
  10. package/dist/childBridgeFork.d.ts.map +1 -1
  11. package/dist/childBridgeFork.js +152 -83
  12. package/dist/childBridgeFork.js.map +1 -1
  13. package/dist/childBridgeService.d.ts +21 -105
  14. package/dist/childBridgeService.d.ts.map +1 -1
  15. package/dist/childBridgeService.js +57 -134
  16. package/dist/childBridgeService.js.map +1 -1
  17. package/dist/cli.js +0 -2
  18. package/dist/cli.js.map +1 -1
  19. package/dist/externalPortService.d.ts +0 -21
  20. package/dist/externalPortService.d.ts.map +1 -1
  21. package/dist/externalPortService.js +0 -28
  22. package/dist/externalPortService.js.map +1 -1
  23. package/dist/index.d.ts +0 -112
  24. package/dist/index.d.ts.map +1 -1
  25. package/dist/index.js +0 -44
  26. package/dist/index.js.map +1 -1
  27. package/dist/ipcService.d.ts +23 -15
  28. package/dist/ipcService.d.ts.map +1 -1
  29. package/dist/ipcService.js +6 -12
  30. package/dist/ipcService.js.map +1 -1
  31. package/dist/logger.d.ts +0 -46
  32. package/dist/logger.d.ts.map +1 -1
  33. package/dist/logger.js +13 -57
  34. package/dist/logger.js.map +1 -1
  35. package/dist/matter/BaseMatterManager.d.ts +19 -0
  36. package/dist/matter/BaseMatterManager.d.ts.map +1 -0
  37. package/dist/matter/BaseMatterManager.js +170 -0
  38. package/dist/matter/BaseMatterManager.js.map +1 -0
  39. package/dist/matter/ChildBridgeMatterManager.d.ts +7 -69
  40. package/dist/matter/ChildBridgeMatterManager.d.ts.map +1 -1
  41. package/dist/matter/ChildBridgeMatterManager.js +51 -234
  42. package/dist/matter/ChildBridgeMatterManager.js.map +1 -1
  43. package/dist/matter/ClusterCommandMapper.d.ts +5 -0
  44. package/dist/matter/ClusterCommandMapper.d.ts.map +1 -0
  45. package/dist/matter/ClusterCommandMapper.js +203 -0
  46. package/dist/matter/ClusterCommandMapper.js.map +1 -0
  47. package/dist/matter/ExternalMatterAccessoryPublisher.d.ts +0 -27
  48. package/dist/matter/ExternalMatterAccessoryPublisher.d.ts.map +1 -1
  49. package/dist/matter/ExternalMatterAccessoryPublisher.js +3 -28
  50. package/dist/matter/ExternalMatterAccessoryPublisher.js.map +1 -1
  51. package/dist/matter/MatterAPIImpl.d.ts +0 -68
  52. package/dist/matter/MatterAPIImpl.d.ts.map +1 -1
  53. package/dist/matter/MatterAPIImpl.js +7 -107
  54. package/dist/matter/MatterAPIImpl.js.map +1 -1
  55. package/dist/matter/MatterBridgeManager.d.ts +9 -60
  56. package/dist/matter/MatterBridgeManager.d.ts.map +1 -1
  57. package/dist/matter/MatterBridgeManager.js +140 -216
  58. package/dist/matter/MatterBridgeManager.js.map +1 -1
  59. package/dist/matter/MatterConfigCollector.d.ts +1 -20
  60. package/dist/matter/MatterConfigCollector.d.ts.map +1 -1
  61. package/dist/matter/MatterConfigCollector.js +15 -28
  62. package/dist/matter/MatterConfigCollector.js.map +1 -1
  63. package/dist/matter/accessoryCache.d.ts +0 -48
  64. package/dist/matter/accessoryCache.d.ts.map +1 -1
  65. package/dist/matter/accessoryCache.js +1 -60
  66. package/dist/matter/accessoryCache.js.map +1 -1
  67. package/dist/matter/behaviors/AirQualityBehavior.d.ts +0 -42
  68. package/dist/matter/behaviors/AirQualityBehavior.d.ts.map +1 -1
  69. package/dist/matter/behaviors/AirQualityBehavior.js +0 -44
  70. package/dist/matter/behaviors/AirQualityBehavior.js.map +1 -1
  71. package/dist/matter/behaviors/BehaviorRegistry.d.ts +4 -42
  72. package/dist/matter/behaviors/BehaviorRegistry.d.ts.map +1 -1
  73. package/dist/matter/behaviors/BehaviorRegistry.js +12 -42
  74. package/dist/matter/behaviors/BehaviorRegistry.js.map +1 -1
  75. package/dist/matter/behaviors/ColorControlBehavior.d.ts +0 -49
  76. package/dist/matter/behaviors/ColorControlBehavior.d.ts.map +1 -1
  77. package/dist/matter/behaviors/ColorControlBehavior.js +0 -90
  78. package/dist/matter/behaviors/ColorControlBehavior.js.map +1 -1
  79. package/dist/matter/behaviors/ConcentrationMeasurementBehavior.d.ts +0 -91
  80. package/dist/matter/behaviors/ConcentrationMeasurementBehavior.d.ts.map +1 -1
  81. package/dist/matter/behaviors/ConcentrationMeasurementBehavior.js +0 -96
  82. package/dist/matter/behaviors/ConcentrationMeasurementBehavior.js.map +1 -1
  83. package/dist/matter/behaviors/DoorLockBehavior.d.ts +0 -11
  84. package/dist/matter/behaviors/DoorLockBehavior.d.ts.map +1 -1
  85. package/dist/matter/behaviors/DoorLockBehavior.js +0 -25
  86. package/dist/matter/behaviors/DoorLockBehavior.js.map +1 -1
  87. package/dist/matter/behaviors/FanControlBehavior.d.ts +0 -11
  88. package/dist/matter/behaviors/FanControlBehavior.d.ts.map +1 -1
  89. package/dist/matter/behaviors/FanControlBehavior.js +0 -25
  90. package/dist/matter/behaviors/FanControlBehavior.js.map +1 -1
  91. package/dist/matter/behaviors/IdentifyBehavior.d.ts +0 -11
  92. package/dist/matter/behaviors/IdentifyBehavior.d.ts.map +1 -1
  93. package/dist/matter/behaviors/IdentifyBehavior.js +0 -17
  94. package/dist/matter/behaviors/IdentifyBehavior.js.map +1 -1
  95. package/dist/matter/behaviors/LevelControlBehavior.d.ts +0 -20
  96. package/dist/matter/behaviors/LevelControlBehavior.d.ts.map +1 -1
  97. package/dist/matter/behaviors/LevelControlBehavior.js +0 -52
  98. package/dist/matter/behaviors/LevelControlBehavior.js.map +1 -1
  99. package/dist/matter/behaviors/OnOffBehavior.d.ts +0 -17
  100. package/dist/matter/behaviors/OnOffBehavior.d.ts.map +1 -1
  101. package/dist/matter/behaviors/OnOffBehavior.js +0 -38
  102. package/dist/matter/behaviors/OnOffBehavior.js.map +1 -1
  103. package/dist/matter/behaviors/RvcCleanModeBehavior.d.ts +0 -11
  104. package/dist/matter/behaviors/RvcCleanModeBehavior.d.ts.map +1 -1
  105. package/dist/matter/behaviors/RvcCleanModeBehavior.js +0 -17
  106. package/dist/matter/behaviors/RvcCleanModeBehavior.js.map +1 -1
  107. package/dist/matter/behaviors/RvcOperationalStateBehavior.d.ts +0 -11
  108. package/dist/matter/behaviors/RvcOperationalStateBehavior.d.ts.map +1 -1
  109. package/dist/matter/behaviors/RvcOperationalStateBehavior.js +0 -29
  110. package/dist/matter/behaviors/RvcOperationalStateBehavior.js.map +1 -1
  111. package/dist/matter/behaviors/RvcRunModeBehavior.d.ts +0 -11
  112. package/dist/matter/behaviors/RvcRunModeBehavior.d.ts.map +1 -1
  113. package/dist/matter/behaviors/RvcRunModeBehavior.js +0 -17
  114. package/dist/matter/behaviors/RvcRunModeBehavior.js.map +1 -1
  115. package/dist/matter/behaviors/ServiceAreaBehavior.d.ts +0 -11
  116. package/dist/matter/behaviors/ServiceAreaBehavior.d.ts.map +1 -1
  117. package/dist/matter/behaviors/ServiceAreaBehavior.js +0 -23
  118. package/dist/matter/behaviors/ServiceAreaBehavior.js.map +1 -1
  119. package/dist/matter/behaviors/ThermostatBehavior.d.ts +0 -11
  120. package/dist/matter/behaviors/ThermostatBehavior.d.ts.map +1 -1
  121. package/dist/matter/behaviors/ThermostatBehavior.js +0 -39
  122. package/dist/matter/behaviors/ThermostatBehavior.js.map +1 -1
  123. package/dist/matter/behaviors/WindowCoveringBehavior.d.ts +0 -17
  124. package/dist/matter/behaviors/WindowCoveringBehavior.d.ts.map +1 -1
  125. package/dist/matter/behaviors/WindowCoveringBehavior.js +0 -56
  126. package/dist/matter/behaviors/WindowCoveringBehavior.js.map +1 -1
  127. package/dist/matter/behaviors/index.d.ts +0 -5
  128. package/dist/matter/behaviors/index.d.ts.map +1 -1
  129. package/dist/matter/behaviors/index.js +0 -5
  130. package/dist/matter/behaviors/index.js.map +1 -1
  131. package/dist/matter/configValidator.d.ts +0 -55
  132. package/dist/matter/configValidator.d.ts.map +1 -1
  133. package/dist/matter/configValidator.js +1 -68
  134. package/dist/matter/configValidator.js.map +1 -1
  135. package/dist/matter/errorHandler.d.ts +0 -22
  136. package/dist/matter/errorHandler.d.ts.map +1 -1
  137. package/dist/matter/errorHandler.js +0 -32
  138. package/dist/matter/errorHandler.js.map +1 -1
  139. package/dist/matter/errors.d.ts +0 -132
  140. package/dist/matter/errors.d.ts.map +1 -1
  141. package/dist/matter/errors.js +0 -132
  142. package/dist/matter/errors.js.map +1 -1
  143. package/dist/matter/index.d.ts +0 -30
  144. package/dist/matter/index.d.ts.map +1 -1
  145. package/dist/matter/index.js +0 -13
  146. package/dist/matter/index.js.map +1 -1
  147. package/dist/matter/logFormatter.d.ts +0 -17
  148. package/dist/matter/logFormatter.d.ts.map +1 -1
  149. package/dist/matter/logFormatter.js +5 -63
  150. package/dist/matter/logFormatter.js.map +1 -1
  151. package/dist/matter/server.d.ts +12 -236
  152. package/dist/matter/server.d.ts.map +1 -1
  153. package/dist/matter/server.js +177 -488
  154. package/dist/matter/server.js.map +1 -1
  155. package/dist/matter/serverHelpers.d.ts +0 -56
  156. package/dist/matter/serverHelpers.d.ts.map +1 -1
  157. package/dist/matter/serverHelpers.js +1 -66
  158. package/dist/matter/serverHelpers.js.map +1 -1
  159. package/dist/matter/sharedTypes.d.ts +0 -83
  160. package/dist/matter/sharedTypes.d.ts.map +1 -1
  161. package/dist/matter/sharedTypes.js +0 -26
  162. package/dist/matter/sharedTypes.js.map +1 -1
  163. package/dist/matter/storage.d.ts +0 -90
  164. package/dist/matter/storage.d.ts.map +1 -1
  165. package/dist/matter/storage.js +2 -130
  166. package/dist/matter/storage.js.map +1 -1
  167. package/dist/matter/typeHelpers.d.ts +0 -30
  168. package/dist/matter/typeHelpers.d.ts.map +1 -1
  169. package/dist/matter/typeHelpers.js +0 -24
  170. package/dist/matter/typeHelpers.js.map +1 -1
  171. package/dist/matter/types.d.ts +0 -273
  172. package/dist/matter/types.d.ts.map +1 -1
  173. package/dist/matter/types.js +0 -83
  174. package/dist/matter/types.js.map +1 -1
  175. package/dist/platformAccessory.d.ts +0 -15
  176. package/dist/platformAccessory.d.ts.map +1 -1
  177. package/dist/platformAccessory.js +6 -32
  178. package/dist/platformAccessory.js.map +1 -1
  179. package/dist/plugin.d.ts +0 -3
  180. package/dist/plugin.d.ts.map +1 -1
  181. package/dist/plugin.js +6 -29
  182. package/dist/plugin.js.map +1 -1
  183. package/dist/pluginManager.d.ts +0 -22
  184. package/dist/pluginManager.d.ts.map +1 -1
  185. package/dist/pluginManager.js +18 -41
  186. package/dist/pluginManager.js.map +1 -1
  187. package/dist/server.d.ts +9 -29
  188. package/dist/server.d.ts.map +1 -1
  189. package/dist/server.js +308 -157
  190. package/dist/server.js.map +1 -1
  191. package/dist/user.d.ts +0 -3
  192. package/dist/user.d.ts.map +1 -1
  193. package/dist/user.js +2 -5
  194. package/dist/user.js.map +1 -1
  195. package/dist/util/mac.js +0 -1
  196. package/dist/util/mac.js.map +1 -1
  197. package/package.json +4 -4
  198. package/dist/api.spec.d.ts +0 -2
  199. package/dist/api.spec.d.ts.map +0 -1
  200. package/dist/api.spec.js +0 -413
  201. package/dist/api.spec.js.map +0 -1
  202. package/dist/logger.spec.d.ts +0 -2
  203. package/dist/logger.spec.d.ts.map +0 -1
  204. package/dist/logger.spec.js +0 -95
  205. package/dist/logger.spec.js.map +0 -1
  206. package/dist/matter/ExternalMatterAccessoryPublisher.spec.d.ts +0 -2
  207. package/dist/matter/ExternalMatterAccessoryPublisher.spec.d.ts.map +0 -1
  208. package/dist/matter/ExternalMatterAccessoryPublisher.spec.js +0 -293
  209. package/dist/matter/ExternalMatterAccessoryPublisher.spec.js.map +0 -1
  210. package/dist/matter/accessoryCache.spec.d.ts +0 -2
  211. package/dist/matter/accessoryCache.spec.d.ts.map +0 -1
  212. package/dist/matter/accessoryCache.spec.js +0 -452
  213. package/dist/matter/accessoryCache.spec.js.map +0 -1
  214. package/dist/matter/behaviors/AirQualityBehavior.spec.d.ts +0 -5
  215. package/dist/matter/behaviors/AirQualityBehavior.spec.d.ts.map +0 -1
  216. package/dist/matter/behaviors/AirQualityBehavior.spec.js +0 -46
  217. package/dist/matter/behaviors/AirQualityBehavior.spec.js.map +0 -1
  218. package/dist/matter/behaviors/BehaviorRegistry.spec.d.ts +0 -2
  219. package/dist/matter/behaviors/BehaviorRegistry.spec.d.ts.map +0 -1
  220. package/dist/matter/behaviors/BehaviorRegistry.spec.js +0 -307
  221. package/dist/matter/behaviors/BehaviorRegistry.spec.js.map +0 -1
  222. package/dist/matter/behaviors/ColorControlBehavior.spec.d.ts +0 -2
  223. package/dist/matter/behaviors/ColorControlBehavior.spec.d.ts.map +0 -1
  224. package/dist/matter/behaviors/ColorControlBehavior.spec.js +0 -29
  225. package/dist/matter/behaviors/ColorControlBehavior.spec.js.map +0 -1
  226. package/dist/matter/behaviors/ConcentrationMeasurementBehavior.spec.d.ts +0 -5
  227. package/dist/matter/behaviors/ConcentrationMeasurementBehavior.spec.d.ts.map +0 -1
  228. package/dist/matter/behaviors/ConcentrationMeasurementBehavior.spec.js +0 -95
  229. package/dist/matter/behaviors/ConcentrationMeasurementBehavior.spec.js.map +0 -1
  230. package/dist/matter/behaviors/DoorLockBehavior.spec.d.ts +0 -2
  231. package/dist/matter/behaviors/DoorLockBehavior.spec.d.ts.map +0 -1
  232. package/dist/matter/behaviors/DoorLockBehavior.spec.js +0 -120
  233. package/dist/matter/behaviors/DoorLockBehavior.spec.js.map +0 -1
  234. package/dist/matter/behaviors/FanControlBehavior.spec.d.ts +0 -2
  235. package/dist/matter/behaviors/FanControlBehavior.spec.d.ts.map +0 -1
  236. package/dist/matter/behaviors/FanControlBehavior.spec.js +0 -23
  237. package/dist/matter/behaviors/FanControlBehavior.spec.js.map +0 -1
  238. package/dist/matter/behaviors/IdentifyBehavior.spec.d.ts +0 -2
  239. package/dist/matter/behaviors/IdentifyBehavior.spec.d.ts.map +0 -1
  240. package/dist/matter/behaviors/IdentifyBehavior.spec.js +0 -64
  241. package/dist/matter/behaviors/IdentifyBehavior.spec.js.map +0 -1
  242. package/dist/matter/behaviors/LevelControlBehavior.spec.d.ts +0 -2
  243. package/dist/matter/behaviors/LevelControlBehavior.spec.d.ts.map +0 -1
  244. package/dist/matter/behaviors/LevelControlBehavior.spec.js +0 -145
  245. package/dist/matter/behaviors/LevelControlBehavior.spec.js.map +0 -1
  246. package/dist/matter/behaviors/OnOffBehavior.spec.d.ts +0 -2
  247. package/dist/matter/behaviors/OnOffBehavior.spec.d.ts.map +0 -1
  248. package/dist/matter/behaviors/OnOffBehavior.spec.js +0 -128
  249. package/dist/matter/behaviors/OnOffBehavior.spec.js.map +0 -1
  250. package/dist/matter/behaviors/RvcCleanModeBehavior.spec.d.ts +0 -2
  251. package/dist/matter/behaviors/RvcCleanModeBehavior.spec.d.ts.map +0 -1
  252. package/dist/matter/behaviors/RvcCleanModeBehavior.spec.js +0 -57
  253. package/dist/matter/behaviors/RvcCleanModeBehavior.spec.js.map +0 -1
  254. package/dist/matter/behaviors/RvcOperationalStateBehavior.spec.d.ts +0 -2
  255. package/dist/matter/behaviors/RvcOperationalStateBehavior.spec.d.ts.map +0 -1
  256. package/dist/matter/behaviors/RvcOperationalStateBehavior.spec.js +0 -55
  257. package/dist/matter/behaviors/RvcOperationalStateBehavior.spec.js.map +0 -1
  258. package/dist/matter/behaviors/RvcRunModeBehavior.spec.d.ts +0 -2
  259. package/dist/matter/behaviors/RvcRunModeBehavior.spec.d.ts.map +0 -1
  260. package/dist/matter/behaviors/RvcRunModeBehavior.spec.js +0 -57
  261. package/dist/matter/behaviors/RvcRunModeBehavior.spec.js.map +0 -1
  262. package/dist/matter/behaviors/ServiceAreaBehavior.spec.d.ts +0 -2
  263. package/dist/matter/behaviors/ServiceAreaBehavior.spec.d.ts.map +0 -1
  264. package/dist/matter/behaviors/ServiceAreaBehavior.spec.js +0 -53
  265. package/dist/matter/behaviors/ServiceAreaBehavior.spec.js.map +0 -1
  266. package/dist/matter/behaviors/ThermostatBehavior.spec.d.ts +0 -2
  267. package/dist/matter/behaviors/ThermostatBehavior.spec.d.ts.map +0 -1
  268. package/dist/matter/behaviors/ThermostatBehavior.spec.js +0 -23
  269. package/dist/matter/behaviors/ThermostatBehavior.spec.js.map +0 -1
  270. package/dist/matter/behaviors/WindowCoveringBehavior.spec.d.ts +0 -2
  271. package/dist/matter/behaviors/WindowCoveringBehavior.spec.d.ts.map +0 -1
  272. package/dist/matter/behaviors/WindowCoveringBehavior.spec.js +0 -27
  273. package/dist/matter/behaviors/WindowCoveringBehavior.spec.js.map +0 -1
  274. package/dist/matter/configValidator.spec.d.ts +0 -2
  275. package/dist/matter/configValidator.spec.d.ts.map +0 -1
  276. package/dist/matter/configValidator.spec.js +0 -390
  277. package/dist/matter/configValidator.spec.js.map +0 -1
  278. package/dist/matter/errorHandler.spec.d.ts +0 -2
  279. package/dist/matter/errorHandler.spec.d.ts.map +0 -1
  280. package/dist/matter/errorHandler.spec.js +0 -159
  281. package/dist/matter/errorHandler.spec.js.map +0 -1
  282. package/dist/matter/logFormatter.spec.d.ts +0 -2
  283. package/dist/matter/logFormatter.spec.d.ts.map +0 -1
  284. package/dist/matter/logFormatter.spec.js +0 -252
  285. package/dist/matter/logFormatter.spec.js.map +0 -1
  286. package/dist/matter/serverHelpers.spec.d.ts +0 -2
  287. package/dist/matter/serverHelpers.spec.d.ts.map +0 -1
  288. package/dist/matter/serverHelpers.spec.js +0 -527
  289. package/dist/matter/serverHelpers.spec.js.map +0 -1
  290. package/dist/matter/storage.spec.d.ts +0 -2
  291. package/dist/matter/storage.spec.d.ts.map +0 -1
  292. package/dist/matter/storage.spec.js +0 -570
  293. package/dist/matter/storage.spec.js.map +0 -1
  294. package/dist/matter/typeHelpers.spec.d.ts +0 -2
  295. package/dist/matter/typeHelpers.spec.d.ts.map +0 -1
  296. package/dist/matter/typeHelpers.spec.js +0 -127
  297. package/dist/matter/typeHelpers.spec.js.map +0 -1
  298. package/dist/platformAccessory.spec.d.ts +0 -2
  299. package/dist/platformAccessory.spec.d.ts.map +0 -1
  300. package/dist/platformAccessory.spec.js +0 -126
  301. package/dist/platformAccessory.spec.js.map +0 -1
  302. package/dist/pluginManager.spec.d.ts +0 -2
  303. package/dist/pluginManager.spec.d.ts.map +0 -1
  304. package/dist/pluginManager.spec.js +0 -43
  305. package/dist/pluginManager.spec.js.map +0 -1
  306. package/dist/server.spec.d.ts +0 -2
  307. package/dist/server.spec.d.ts.map +0 -1
  308. package/dist/server.spec.js +0 -57
  309. package/dist/server.spec.js.map +0 -1
  310. package/dist/user.spec.d.ts +0 -2
  311. package/dist/user.spec.d.ts.map +0 -1
  312. package/dist/user.spec.js +0 -31
  313. package/dist/user.spec.js.map +0 -1
  314. package/dist/util/mac.spec.d.ts +0 -2
  315. package/dist/util/mac.spec.d.ts.map +0 -1
  316. package/dist/util/mac.spec.js +0 -36
  317. package/dist/util/mac.spec.js.map +0 -1
  318. package/dist/version.spec.d.ts +0 -2
  319. package/dist/version.spec.d.ts.map +0 -1
  320. package/dist/version.spec.js +0 -20
  321. package/dist/version.spec.js.map +0 -1
package/dist/server.js CHANGED
@@ -13,20 +13,11 @@ import { PluginManager } from './pluginManager.js';
13
13
  import { User } from './user.js';
14
14
  import { validMacAddress } from './util/mac.js';
15
15
  const log = Logger.internal;
16
- // eslint-disable-next-line no-restricted-syntax
16
+ const matterLogger = Logger.withPrefix('Matter/MainManager');
17
17
  export var ServerStatus;
18
18
  (function (ServerStatus) {
19
- /**
20
- * When the server is starting up
21
- */
22
19
  ServerStatus["PENDING"] = "pending";
23
- /**
24
- * When the server is online and has published the main bridge
25
- */
26
20
  ServerStatus["OK"] = "ok";
27
- /**
28
- * When the server is shutting down
29
- */
30
21
  ServerStatus["DOWN"] = "down";
31
22
  })(ServerStatus || (ServerStatus = {}));
32
23
  export class Server {
@@ -37,26 +28,19 @@ export class Server {
37
28
  ipcService;
38
29
  externalPortService;
39
30
  config;
40
- // used to keep track of child bridges
41
- // Key is HAP username (MAC address)
42
31
  childBridges = new Map();
43
- // Matter bridge manager (handles Matter server lifecycle)
44
- // Made optional to handle initialization order - gets created in constructor after first setServerStatus call
45
32
  matterManager;
46
- // current server status
47
- serverStatus = "pending" /* ServerStatus.PENDING */;
33
+ matterMonitoringActive = false;
34
+ matterMonitoringClients = 0;
35
+ serverStatus = "pending";
48
36
  constructor(options = {}) {
49
37
  this.options = options;
50
38
  this.config = Server.loadConfig();
51
- // object we feed to Plugins and BridgeService
52
39
  this.api = new HomebridgeAPI();
53
40
  this.ipcService = new IpcService();
54
- // Collect all configured Matter ports to avoid conflicts
55
41
  const configuredMatterPorts = MatterBridgeManager.collectConfiguredMatterPorts(this.config);
56
42
  this.externalPortService = new ExternalPortService(this.config.ports, this.config.matterPorts, configuredMatterPorts);
57
- // set status to pending
58
- this.setServerStatus("pending" /* ServerStatus.PENDING */);
59
- // create new plugin manager
43
+ this.setServerStatus("pending");
60
44
  const pluginManagerOptions = {
61
45
  activePlugins: this.config.plugins,
62
46
  disabledPlugins: this.config.disabledPlugins,
@@ -64,47 +48,27 @@ export class Server {
64
48
  strictPluginResolution: options.strictPluginResolution,
65
49
  };
66
50
  this.pluginManager = new PluginManager(this.api, pluginManagerOptions);
67
- // create new bridge service
68
51
  const bridgeConfig = {
69
52
  cachedAccessoriesDir: User.cachedAccessoryPath(),
70
53
  cachedAccessoriesItemName: 'cachedAccessories',
71
54
  };
72
- // shallow copy the homebridge options to the bridge options object
73
55
  Object.assign(bridgeConfig, this.options);
74
56
  this.bridgeService = new BridgeService(this.api, this.pluginManager, this.externalPortService, bridgeConfig, this.config.bridge);
75
- // Create Matter bridge manager
76
57
  this.matterManager = new MatterBridgeManager(this.config, this.api, this.externalPortService, this.pluginManager, this.options);
77
- // Set manager reference on API for getAccessoryState
78
58
  this.api._setMatterManager(this.matterManager);
79
- // Handle platform accessory registration
80
- this.api.on("registerPlatformAccessories" /* InternalAPIEvent.REGISTER_PLATFORM_ACCESSORIES */, this.handleRegisterPlatformAccessories.bind(this));
81
- this.api.on("unregisterPlatformAccessories" /* InternalAPIEvent.UNREGISTER_PLATFORM_ACCESSORIES */, this.handleUnregisterPlatformAccessories.bind(this));
82
- // Handle external accessories (cameras, etc.)
83
- this.api.on("publishExternalAccessories" /* InternalAPIEvent.PUBLISH_EXTERNAL_ACCESSORIES */, this.handlePublishExternalAccessories.bind(this));
84
- // Handle Matter accessory registration (matching HAP pattern)
85
- this.api.on("publishExternalMatterAccessories" /* InternalAPIEvent.PUBLISH_EXTERNAL_MATTER_ACCESSORIES */, this.handlePublishExternalMatterAccessories.bind(this));
86
- this.api.on("registerMatterPlatformAccessories" /* InternalAPIEvent.REGISTER_MATTER_PLATFORM_ACCESSORIES */, this.handleRegisterMatterPlatformAccessories.bind(this));
87
- this.api.on("updateMatterPlatformAccessories" /* InternalAPIEvent.UPDATE_MATTER_PLATFORM_ACCESSORIES */, this.handleUpdateMatterPlatformAccessories.bind(this));
88
- this.api.on("unregisterMatterPlatformAccessories" /* InternalAPIEvent.UNREGISTER_MATTER_PLATFORM_ACCESSORIES */, this.handleUnregisterMatterPlatformAccessories.bind(this));
89
- this.api.on("unregisterExternalMatterAccessories" /* InternalAPIEvent.UNREGISTER_EXTERNAL_MATTER_ACCESSORIES */, this.handleUnregisterExternalMatterAccessories.bind(this));
90
- this.api.on("updateMatterAccessoryState" /* InternalAPIEvent.UPDATE_MATTER_ACCESSORY_STATE */, this.handleUpdateMatterAccessoryState.bind(this));
91
- // watch bridge events to check when server is online
92
- this.bridgeService.bridge.on("advertised" /* AccessoryEventTypes.ADVERTISED */, () => {
93
- this.setServerStatus("ok" /* ServerStatus.OK */);
59
+ this.api.on("registerPlatformAccessories", this.handleRegisterPlatformAccessories.bind(this));
60
+ this.api.on("unregisterPlatformAccessories", this.handleUnregisterPlatformAccessories.bind(this));
61
+ this.api.on("publishExternalAccessories", this.handlePublishExternalAccessories.bind(this));
62
+ this.bridgeService.bridge.on("advertised", () => {
63
+ this.setServerStatus("ok");
94
64
  });
95
- // watch for the paired event to update the server status
96
- this.bridgeService.bridge.on("paired" /* AccessoryEventTypes.PAIRED */, () => {
65
+ this.bridgeService.bridge.on("paired", () => {
97
66
  this.setServerStatus(this.serverStatus);
98
67
  });
99
- // watch for the unpaired event to update the server status
100
- this.bridgeService.bridge.on("unpaired" /* AccessoryEventTypes.UNPAIRED */, () => {
68
+ this.bridgeService.bridge.on("unpaired", () => {
101
69
  this.setServerStatus(this.serverStatus);
102
70
  });
103
71
  }
104
- /**
105
- * Set the current server status and update parent via IPC
106
- * @param status
107
- */
108
72
  setServerStatus(status) {
109
73
  this.serverStatus = status;
110
74
  const statusUpdate = {
@@ -116,18 +80,15 @@ export class Server {
116
80
  pin: this.config.bridge.pin,
117
81
  matter: this.matterManager?.getMatterStatus() ?? { enabled: false },
118
82
  };
119
- this.ipcService.sendMessage("serverStatusUpdate" /* IpcOutgoingEvent.SERVER_STATUS_UPDATE */, statusUpdate);
83
+ this.ipcService.sendMessage("serverStatusUpdate", statusUpdate);
120
84
  }
121
85
  async start() {
122
86
  if (this.config.bridge.disableIpc !== true) {
123
87
  this.initializeIpcEventHandlers();
124
88
  }
125
89
  const promises = [];
126
- // load the cached accessories
127
90
  await this.bridgeService.loadCachedPlatformAccessoriesFromDisk();
128
- // initialize plugins
129
91
  await this.pluginManager.initializeInstalledPlugins();
130
- // Initialize Matter server for main bridge if enabled
131
92
  await this.matterManager?.initialize();
132
93
  if (this.config.platforms.length > 0) {
133
94
  promises.push(...this.loadPlatforms());
@@ -135,78 +96,40 @@ export class Server {
135
96
  if (this.config.accessories.length > 0) {
136
97
  this.loadAccessories();
137
98
  }
138
- // start child bridges
139
99
  for (const childBridge of this.childBridges.values()) {
140
100
  childBridge.start();
141
101
  }
142
- // restore cached accessories
143
102
  this.bridgeService.restoreCachedPlatformAccessories();
144
103
  this.matterManager?.restoreCachedAccessories(this.options.keepOrphanedCachedAccessories ?? false);
145
104
  this.api.signalFinished();
146
- // wait for all platforms to publish their accessories before we publish the bridge
147
105
  await Promise.all(promises)
148
106
  .then(() => this.publishBridge());
149
107
  }
150
108
  async teardown() {
151
109
  this.bridgeService.teardown();
152
- // Teardown Matter servers (main bridge and external accessories)
153
110
  await this.matterManager?.teardown();
154
- this.setServerStatus("down" /* ServerStatus.DOWN */);
111
+ this.setServerStatus("down");
155
112
  }
156
113
  publishBridge() {
157
114
  this.bridgeService.publishBridge();
158
115
  this.printSetupInfo(this.config.bridge.pin);
159
116
  }
160
117
  handlePublishExternalAccessories(accessories) {
161
- // External accessories are published via HAP
162
- // Plugins should use api.matter to register Matter accessories explicitly
163
118
  log.info(`Publishing ${accessories.length} external accessories`);
164
119
  }
165
- /**
166
- * Handle external Matter accessories - delegates to MatterBridgeManager
167
- */
168
- handlePublishExternalMatterAccessories(accessories, registrationId) {
169
- this.matterManager?.handlePublishExternalAccessories(accessories, registrationId).catch((error) => {
170
- log.error('Failed to publish external Matter accessories:', error);
171
- // Make sure to resolve the registration even on error
172
- this.api._resolveExternalRegistration(registrationId);
173
- });
174
- }
175
120
  handleRegisterPlatformAccessories(accessories) {
176
- // Route to HAP bridge
177
121
  this.bridgeService.handleRegisterPlatformAccessories(accessories);
178
122
  }
179
123
  handleUnregisterPlatformAccessories(accessories) {
180
- // Route to HAP bridge
181
124
  this.bridgeService.handleUnregisterPlatformAccessories(accessories);
182
125
  }
183
- handleRegisterMatterPlatformAccessories(pluginIdentifier, platformName, accessories) {
184
- this.matterManager?.handleRegisterPlatformAccessories(pluginIdentifier, platformName, accessories).catch((error) => {
185
- log.error(`Failed to register Matter accessories for ${pluginIdentifier}:`, error);
186
- });
187
- }
188
- handleUpdateMatterPlatformAccessories(accessories) {
189
- this.matterManager?.handleUpdatePlatformAccessories(accessories).catch((error) => {
190
- log.error('Failed to update Matter platform accessories:', error);
191
- });
192
- }
193
- handleUnregisterMatterPlatformAccessories(pluginIdentifier, platformName, accessories) {
194
- this.matterManager?.handleUnregisterPlatformAccessories(pluginIdentifier, platformName, accessories).catch((error) => {
195
- log.error(`Failed to unregister Matter accessories for ${pluginIdentifier}:`, error);
196
- });
197
- }
198
- handleUnregisterExternalMatterAccessories(accessories) {
199
- this.matterManager?.handleUnregisterExternalAccessories(accessories).catch((error) => {
200
- log.error('Failed to unregister external Matter accessories:', error);
201
- });
202
- }
203
- handleUpdateMatterAccessoryState(uuid, cluster, attributes, partId) {
204
- this.matterManager?.handleUpdateAccessoryState(uuid, cluster, attributes, partId).catch((error) => {
205
- log.error(`Failed to update Matter accessory state for ${uuid}:`, error);
206
- });
126
+ async handleTriggerMatterCommand(uuid, cluster, attributes, partId) {
127
+ if (!this.matterManager) {
128
+ throw new Error('Matter manager not initialized');
129
+ }
130
+ await this.matterManager.handleTriggerCommand(uuid, cluster, attributes, partId);
207
131
  }
208
132
  static loadConfig() {
209
- // Look for the configuration file
210
133
  const configPath = User.configPath();
211
134
  const defaultBridge = {
212
135
  name: 'Homebridge',
@@ -243,18 +166,7 @@ export class Server {
243
166
  config.ports = undefined;
244
167
  }
245
168
  }
246
- if (config.matterPorts !== undefined) {
247
- if (config.matterPorts.start && config.matterPorts.end) {
248
- if (config.matterPorts.start > config.matterPorts.end) {
249
- log.error('Invalid Matter port pool configuration. End should be greater than or equal to start.');
250
- config.matterPorts = undefined;
251
- }
252
- }
253
- else {
254
- log.error('Invalid configuration for \'matterPorts\'. Missing \'start\' and \'end\' properties! Ignoring it!');
255
- config.matterPorts = undefined;
256
- }
257
- }
169
+ MatterConfigCollector.validateMatterPortsPool(config);
258
170
  const bridge = config.bridge || defaultBridge;
259
171
  bridge.name = bridge.name || defaultBridge.name;
260
172
  bridge.username = bridge.username || defaultBridge.username;
@@ -275,14 +187,13 @@ export class Server {
275
187
  config.platforms = [];
276
188
  }
277
189
  log.info('Loaded config.json with %s accessories and %s platforms.', config.accessories.length, config.platforms.length);
278
- // Validate Matter configuration for port conflicts
279
190
  MatterConfigCollector.validateMatterConfig(config);
280
191
  if (config.bridge.advertiser) {
281
192
  if (![
282
- "bonjour-hap" /* MDNSAdvertiser.BONJOUR */,
283
- "ciao" /* MDNSAdvertiser.CIAO */,
284
- "avahi" /* MDNSAdvertiser.AVAHI */,
285
- "resolved" /* MDNSAdvertiser.RESOLVED */,
193
+ "bonjour-hap",
194
+ "ciao",
195
+ "avahi",
196
+ "resolved",
286
197
  ].includes(config.bridge.advertiser)) {
287
198
  config.bridge.advertiser = undefined;
288
199
  log.error('Value provided in bridge.advertiser is not valid, reverting to platform default.');
@@ -298,7 +209,7 @@ export class Server {
298
209
  this.config.accessories.forEach((accessoryConfig, index) => {
299
210
  if (!accessoryConfig.accessory) {
300
211
  log.warn('Your config.json contains an illegal accessory configuration object at position %d. '
301
- + 'Missing property \'accessory\'. Skipping entry...', index + 1); // we rather count from 1 for the normal people?
212
+ + 'Missing property \'accessory\'. Skipping entry...', index + 1);
302
213
  return;
303
214
  }
304
215
  const accessoryIdentifier = accessoryConfig.accessory;
@@ -316,7 +227,6 @@ export class Server {
316
227
  log.error(error.message);
317
228
  return;
318
229
  }
319
- // check the plugin is not disabled
320
230
  if (plugin.disabled) {
321
231
  log.warn(`Ignoring config for the accessory "${accessoryIdentifier}" in your config.json as the plugin "${plugin.getPluginIdentifier()}" has been disabled.`);
322
232
  return;
@@ -326,16 +236,15 @@ export class Server {
326
236
  }
327
237
  catch (error) {
328
238
  log.error(`Error loading the accessory "${accessoryIdentifier}" requested in your config.json at position ${index + 1} - this is likely an issue with the "${plugin.getPluginIdentifier()}" plugin.`);
329
- log.error(error); // error message contains more information and full stack trace
239
+ log.error(error);
330
240
  return;
331
241
  }
332
242
  const logger = Logger.withPrefix(displayName);
333
243
  logger('Initializing %s accessory...', accessoryIdentifier);
334
244
  if (accessoryConfig._bridge) {
335
- // ensure the username is always uppercase
336
245
  accessoryConfig._bridge.username = accessoryConfig._bridge.username.toUpperCase();
337
246
  try {
338
- this.validateChildBridgeConfig("accessory" /* PluginType.ACCESSORY */, accessoryIdentifier, accessoryConfig._bridge);
247
+ this.validateChildBridgeConfig("accessory", accessoryIdentifier, accessoryConfig._bridge);
339
248
  }
340
249
  catch (error) {
341
250
  log.error(error.message);
@@ -348,15 +257,13 @@ export class Server {
348
257
  }
349
258
  else {
350
259
  logger(`Initializing child bridge ${accessoryConfig._bridge.username}`);
351
- childBridge = new ChildBridgeService("accessory" /* PluginType.ACCESSORY */, accessoryIdentifier, plugin, accessoryConfig._bridge, this.config, this.options, this.api, this.ipcService, this.externalPortService);
260
+ childBridge = new ChildBridgeService("accessory", accessoryIdentifier, plugin, accessoryConfig._bridge, this.config, this.options, this.api, this.ipcService, this.externalPortService);
352
261
  this.childBridges.set(accessoryConfig._bridge.username, childBridge);
353
262
  }
354
- // add config to child bridge service
355
263
  childBridge.addConfig(accessoryConfig);
356
264
  return;
357
265
  }
358
266
  const accessoryInstance = new constructor(logger, accessoryConfig, this.api);
359
- // pass accessoryIdentifier for UUID generation, and optional parameter uuid_base which can be used instead of displayName for UUID generation
360
267
  const accessory = this.bridgeService.createHAPAccessory(plugin, accessoryInstance, displayName, accessoryIdentifier, accessoryConfig.uuid_base);
361
268
  if (accessory) {
362
269
  try {
@@ -377,14 +284,13 @@ export class Server {
377
284
  this.config.platforms.forEach((platformConfig, index) => {
378
285
  if (!platformConfig.platform) {
379
286
  log.warn('Your config.json contains an illegal platform configuration object at position %d. '
380
- + 'Missing property \'platform\'. Skipping entry...', index + 1); // we rather count from 1 for the normal people?
287
+ + 'Missing property \'platform\'. Skipping entry...', index + 1);
381
288
  return;
382
289
  }
383
290
  const platformIdentifier = platformConfig.platform;
384
291
  const displayName = platformConfig.name || platformIdentifier;
385
292
  let plugin;
386
293
  let constructor;
387
- // do not load homebridge-config-ui-x when running in service mode
388
294
  if (platformIdentifier === 'config' && process.env.UIX_SERVICE_MODE === '1') {
389
295
  return;
390
296
  }
@@ -395,7 +301,6 @@ export class Server {
395
301
  log.error(error.message);
396
302
  return;
397
303
  }
398
- // check the plugin is not disabled
399
304
  if (plugin.disabled) {
400
305
  log.warn(`Ignoring config for the platform "${platformIdentifier}" in your config.json as the plugin "${plugin.getPluginIdentifier()}" has been disabled.`);
401
306
  return;
@@ -405,25 +310,23 @@ export class Server {
405
310
  }
406
311
  catch (error) {
407
312
  log.error(`Error loading the platform "${platformIdentifier}" requested in your config.json at position ${index + 1} - this is likely an issue with the "${plugin.getPluginIdentifier()}" plugin.`);
408
- log.error(error); // error message contains more information and full stack trace
313
+ log.error(error);
409
314
  return;
410
315
  }
411
316
  const logger = Logger.withPrefix(displayName);
412
317
  logger('Initializing %s platform...', platformIdentifier);
413
318
  if (platformConfig._bridge) {
414
- // ensure the username is always uppercase
415
319
  platformConfig._bridge.username = platformConfig._bridge.username.toUpperCase();
416
320
  try {
417
- this.validateChildBridgeConfig("platform" /* PluginType.PLATFORM */, platformIdentifier, platformConfig._bridge);
321
+ this.validateChildBridgeConfig("platform", platformIdentifier, platformConfig._bridge);
418
322
  }
419
323
  catch (error) {
420
324
  log.error(error.message);
421
325
  return;
422
326
  }
423
327
  logger(`Initializing child bridge ${platformConfig._bridge.username}`);
424
- const childBridge = new ChildBridgeService("platform" /* PluginType.PLATFORM */, platformIdentifier, plugin, platformConfig._bridge, this.config, this.options, this.api, this.ipcService, this.externalPortService);
328
+ const childBridge = new ChildBridgeService("platform", platformIdentifier, plugin, platformConfig._bridge, this.config, this.options, this.api, this.ipcService, this.externalPortService);
425
329
  this.childBridges.set(platformConfig._bridge.username, childBridge);
426
- // add config to child bridge service
427
330
  childBridge.addConfig(platformConfig);
428
331
  return;
429
332
  }
@@ -431,21 +334,15 @@ export class Server {
431
334
  if (HomebridgeAPI.isDynamicPlatformPlugin(platform)) {
432
335
  plugin.assignDynamicPlatform(platformIdentifier, platform);
433
336
  }
434
- else if (HomebridgeAPI.isStaticPlatformPlugin(platform)) { // Plugin 1.0, load accessories
337
+ else if (HomebridgeAPI.isStaticPlatformPlugin(platform)) {
435
338
  promises.push(this.bridgeService.loadPlatformAccessories(plugin, platform, platformIdentifier, logger));
436
339
  }
437
340
  else {
438
- // otherwise it's a IndependentPlatformPlugin which doesn't expose any methods at all.
439
- // We just call the constructor and let it be enabled.
440
341
  }
441
342
  });
442
343
  return promises;
443
344
  }
444
- /**
445
- * Validate an external bridge config
446
- */
447
345
  validateChildBridgeConfig(type, identifier, bridgeConfig) {
448
- // All child bridges require username
449
346
  if (!bridgeConfig.username) {
450
347
  throw new Error(`Error loading the ${type} "${identifier}" requested in your config.json - `
451
348
  + 'Missing required field "_bridge.username".');
@@ -456,13 +353,11 @@ export class Server {
456
353
  }
457
354
  if (this.childBridges.has(bridgeConfig.username)) {
458
355
  const childBridge = this.childBridges.get(bridgeConfig.username);
459
- if (type === "platform" /* PluginType.PLATFORM */) {
460
- // only a single platform can exist on one child bridge
356
+ if (type === "platform") {
461
357
  throw new Error(`Error loading the ${type} "${identifier}" requested in your config.json - `
462
358
  + `Duplicate username found in _bridge.username: "${bridgeConfig.username}". Each platform child bridge must have it's own unique username.`);
463
359
  }
464
360
  else if (childBridge?.identifier !== identifier) {
465
- // only accessories of the same type can be added to the same child bridge
466
361
  throw new Error(`Error loading the ${type} "${identifier}" requested in your config.json - `
467
362
  + `Duplicate username found in _bridge.username: "${bridgeConfig.username}". You can only group accessories of the same type in a child bridge.`);
468
363
  }
@@ -472,47 +367,304 @@ export class Server {
472
367
  + `Username found in _bridge.username: "${bridgeConfig.username}" is the same as the main bridge. Each child bridge platform/accessory must have it's own unique username.`);
473
368
  }
474
369
  }
475
- /**
476
- * Takes care of the IPC Events sent to Homebridge
477
- */
478
370
  initializeIpcEventHandlers() {
479
- // start ipc service
480
371
  this.ipcService.start();
481
- // handle restart child bridge event
482
- this.ipcService.on("restartChildBridge" /* IpcIncomingEvent.RESTART_CHILD_BRIDGE */, (username) => {
483
- // noinspection SuspiciousTypeOfGuard
372
+ this.ipcService.on("restartChildBridge", (username) => {
484
373
  if (typeof username === 'string') {
485
374
  const childBridge = this.childBridges.get(username.toUpperCase());
486
375
  childBridge?.restartChildBridge();
487
376
  }
488
377
  });
489
- // handle stop child bridge event
490
- this.ipcService.on("stopChildBridge" /* IpcIncomingEvent.STOP_CHILD_BRIDGE */, (username) => {
491
- // noinspection SuspiciousTypeOfGuard
378
+ this.ipcService.on("stopChildBridge", (username) => {
492
379
  if (typeof username === 'string') {
493
380
  const childBridge = this.childBridges.get(username.toUpperCase());
494
381
  childBridge?.stopChildBridge();
495
382
  }
496
383
  });
497
- // handle start child bridge event
498
- this.ipcService.on("startChildBridge" /* IpcIncomingEvent.START_CHILD_BRIDGE */, (username) => {
499
- // noinspection SuspiciousTypeOfGuard
384
+ this.ipcService.on("startChildBridge", (username) => {
500
385
  if (typeof username === 'string') {
501
386
  const childBridge = this.childBridges.get(username.toUpperCase());
502
387
  childBridge?.startChildBridge();
503
388
  }
504
389
  });
505
- this.ipcService.on("childBridgeMetadataRequest" /* IpcIncomingEvent.CHILD_BRIDGE_METADATA_REQUEST */, () => {
506
- this.ipcService.sendMessage("childBridgeMetadataResponse" /* IpcOutgoingEvent.CHILD_BRIDGE_METADATA_RESPONSE */, Array.from(this.childBridges.values()).map(x => x.getMetadata()));
390
+ this.ipcService.on("childBridgeMetadataRequest", () => {
391
+ this.ipcService.sendMessage("childBridgeMetadataResponse", Array.from(this.childBridges.values()).map(x => x.getMetadata()));
392
+ });
393
+ this.ipcService.on("startMatterMonitoring", () => {
394
+ this.handleStartMatterMonitoring();
395
+ });
396
+ this.ipcService.on("stopMatterMonitoring", () => {
397
+ this.handleStopMatterMonitoring();
398
+ });
399
+ this.ipcService.on("getMatterAccessories", (data) => {
400
+ this.handleGetMatterAccessories(data?.bridgeUsername);
401
+ });
402
+ this.ipcService.on("getMatterAccessoryInfo", (data) => {
403
+ this.handleGetMatterAccessoryInfo(data?.uuid);
404
+ });
405
+ this.ipcService.on("matterAccessoryControl", (data) => {
406
+ this.handleMatterAccessoryControl(data);
407
+ });
408
+ }
409
+ handleStartMatterMonitoring() {
410
+ this.matterMonitoringClients++;
411
+ if (this.matterMonitoringClients === 1) {
412
+ matterLogger.debug('Starting Matter accessory monitoring');
413
+ this.matterMonitoringActive = true;
414
+ this.matterManager?.enableStateMonitoring();
415
+ for (const childBridge of this.childBridges.values()) {
416
+ childBridge.startMatterMonitoring();
417
+ }
418
+ const event = {
419
+ type: 'monitoringStarted',
420
+ data: { success: true },
421
+ };
422
+ this.ipcService.sendMessage("matterEvent", event);
423
+ }
424
+ else {
425
+ const event = {
426
+ type: 'monitoringStarted',
427
+ data: { success: true, alreadyActive: true },
428
+ };
429
+ this.ipcService.sendMessage("matterEvent", event);
430
+ }
431
+ }
432
+ handleStopMatterMonitoring() {
433
+ this.matterMonitoringClients--;
434
+ if (this.matterMonitoringClients <= 0) {
435
+ matterLogger.debug('Stopping Matter accessory monitoring');
436
+ this.matterMonitoringClients = 0;
437
+ this.matterMonitoringActive = false;
438
+ this.matterManager?.disableStateMonitoring();
439
+ for (const childBridge of this.childBridges.values()) {
440
+ childBridge.stopMatterMonitoring();
441
+ }
442
+ const event = {
443
+ type: 'monitoringStopped',
444
+ data: { success: true },
445
+ };
446
+ this.ipcService.sendMessage("matterEvent", event);
447
+ }
448
+ else {
449
+ const event = {
450
+ type: 'monitoringStopped',
451
+ data: { success: true, othersActive: true },
452
+ };
453
+ this.ipcService.sendMessage("matterEvent", event);
454
+ }
455
+ }
456
+ async handleGetMatterAccessories(bridgeUsername) {
457
+ matterLogger.debug(`Getting Matter accessories${bridgeUsername ? ` for bridge ${bridgeUsername}` : ' for all bridges'}`);
458
+ if (!this.matterMonitoringActive) {
459
+ matterLogger.warn('Matter monitoring not active - cannot get accessories');
460
+ const event = {
461
+ type: 'accessoriesData',
462
+ data: {
463
+ bridgeUsername,
464
+ error: 'Matter monitoring not active',
465
+ },
466
+ };
467
+ this.ipcService.sendMessage("matterEvent", event);
468
+ return;
469
+ }
470
+ if (!this.api.isMatterEnabled() && this.childBridges.size === 0) {
471
+ matterLogger.debug('Matter not enabled and no child bridges');
472
+ const event = {
473
+ type: 'accessoriesData',
474
+ data: {
475
+ bridgeUsername,
476
+ accessories: [],
477
+ },
478
+ };
479
+ this.ipcService.sendMessage("matterEvent", event);
480
+ return;
481
+ }
482
+ try {
483
+ const allAccessories = this.matterManager?.collectAllAccessories(bridgeUsername) || [];
484
+ matterLogger.debug(`Collected ${allAccessories.length} accessories from main bridge`);
485
+ if (this.childBridges.size > 0) {
486
+ matterLogger.debug(`Requesting accessories from ${this.childBridges.size} child bridge(s)`);
487
+ for (const childBridge of this.childBridges.values()) {
488
+ childBridge.lastMatterAccessoriesResponse = undefined;
489
+ }
490
+ for (const childBridge of this.childBridges.values()) {
491
+ childBridge.getMatterAccessories();
492
+ }
493
+ await new Promise(resolve => setTimeout(resolve, 500));
494
+ let responsesCollected = 0;
495
+ for (const childBridge of this.childBridges.values()) {
496
+ if (childBridge.lastMatterAccessoriesResponse?.accessories) {
497
+ const accessories = childBridge.lastMatterAccessoriesResponse.accessories;
498
+ allAccessories.push(...accessories);
499
+ responsesCollected++;
500
+ }
501
+ }
502
+ matterLogger.debug(`Collected responses from ${responsesCollected} of ${this.childBridges.size} child bridge(s)`);
503
+ }
504
+ matterLogger.debug(`Sending ${allAccessories.length} total Matter accessories`);
505
+ const event = {
506
+ type: 'accessoriesData',
507
+ data: {
508
+ bridgeUsername: bridgeUsername || 'all',
509
+ accessories: allAccessories,
510
+ },
511
+ };
512
+ this.ipcService.sendMessage("matterEvent", event);
513
+ }
514
+ catch (error) {
515
+ matterLogger.error('Failed to get Matter accessories:', error);
516
+ const event = {
517
+ type: 'accessoriesData',
518
+ data: {
519
+ bridgeUsername,
520
+ error: error instanceof Error ? error.message : 'Unknown error',
521
+ },
522
+ };
523
+ this.ipcService.sendMessage("matterEvent", event);
524
+ }
525
+ }
526
+ handleGetMatterAccessoryInfo(uuid) {
527
+ if (!uuid) {
528
+ const event = {
529
+ type: 'accessoryInfoData',
530
+ data: {
531
+ error: 'UUID is required',
532
+ },
533
+ };
534
+ this.ipcService.sendMessage("matterEvent", event);
535
+ return;
536
+ }
537
+ try {
538
+ const accessoryInfo = this.matterManager?.getAccessoryInfo(uuid);
539
+ if (accessoryInfo) {
540
+ const event = {
541
+ type: 'accessoryInfoData',
542
+ data: accessoryInfo,
543
+ };
544
+ this.ipcService.sendMessage("matterEvent", event);
545
+ return;
546
+ }
547
+ for (const childBridge of this.childBridges.values()) {
548
+ if (childBridge.getMetadata().matterConfig) {
549
+ childBridge.getMatterAccessoryInfo(uuid);
550
+ }
551
+ }
552
+ }
553
+ catch (error) {
554
+ matterLogger.error('Failed to get Matter accessory info:', error);
555
+ const event = {
556
+ type: 'accessoryInfoData',
557
+ data: {
558
+ error: error instanceof Error ? error.message : 'Unknown error',
559
+ },
560
+ };
561
+ this.ipcService.sendMessage("matterEvent", event);
562
+ }
563
+ }
564
+ handleMatterAccessoryControl(data) {
565
+ matterLogger.debug(`Matter control request: uuid=${data?.uuid}, cluster=${data?.cluster}, bridge=${data?.bridgeUsername || 'auto'}, part=${data?.partId || 'main'}`);
566
+ if (!data?.uuid || !data?.cluster || !data?.attributes) {
567
+ matterLogger.error('Missing required parameters for Matter control');
568
+ const event = {
569
+ type: 'accessoryControlResponse',
570
+ data: {
571
+ success: false,
572
+ error: 'Missing required parameters',
573
+ },
574
+ };
575
+ this.ipcService.sendMessage("matterEvent", event);
576
+ return;
577
+ }
578
+ if (data.bridgeUsername) {
579
+ const targetUsername = data.bridgeUsername.toUpperCase();
580
+ if (targetUsername === this.config.bridge.username.toUpperCase()) {
581
+ matterLogger.debug(`Routing to main bridge (${targetUsername})`);
582
+ this.handleTriggerMatterCommand(data.uuid, data.cluster, data.attributes, data.partId)
583
+ .then(() => {
584
+ matterLogger.debug(`Main bridge successfully controlled accessory ${data.uuid}`);
585
+ const event = {
586
+ type: 'accessoryControlResponse',
587
+ data: {
588
+ success: true,
589
+ uuid: data.uuid,
590
+ },
591
+ };
592
+ this.ipcService.sendMessage("matterEvent", event);
593
+ })
594
+ .catch((error) => {
595
+ matterLogger.error(`Main bridge failed to control ${data.uuid}: ${error.message}`);
596
+ const event = {
597
+ type: 'accessoryControlResponse',
598
+ data: {
599
+ success: false,
600
+ error: error.message,
601
+ uuid: data.uuid,
602
+ },
603
+ };
604
+ this.ipcService.sendMessage("matterEvent", event);
605
+ });
606
+ return;
607
+ }
608
+ for (const childBridge of this.childBridges.values()) {
609
+ if (childBridge.getMetadata().username.toUpperCase() === targetUsername) {
610
+ matterLogger.debug(`Routing to child bridge ${childBridge.identifier} (${targetUsername})`);
611
+ childBridge.controlMatterAccessory(data);
612
+ return;
613
+ }
614
+ }
615
+ matterLogger.warn(`Bridge ${targetUsername} not found`);
616
+ const event = {
617
+ type: 'accessoryControlResponse',
618
+ data: {
619
+ success: false,
620
+ error: `Bridge ${targetUsername} not found`,
621
+ uuid: data.uuid,
622
+ },
623
+ };
624
+ this.ipcService.sendMessage("matterEvent", event);
625
+ return;
626
+ }
627
+ matterLogger.debug(`Broadcast mode: trying main bridge for accessory ${data.uuid}`);
628
+ this.handleTriggerMatterCommand(data.uuid, data.cluster, data.attributes, data.partId)
629
+ .then(() => {
630
+ matterLogger.debug(`Main bridge successfully controlled accessory ${data.uuid}`);
631
+ const event = {
632
+ type: 'accessoryControlResponse',
633
+ data: {
634
+ success: true,
635
+ uuid: data.uuid,
636
+ },
637
+ };
638
+ this.ipcService.sendMessage("matterEvent", event);
639
+ })
640
+ .catch(() => {
641
+ const matterChildBridges = Array.from(this.childBridges.values()).filter(bridge => bridge.getMetadata().matterConfig);
642
+ if (matterChildBridges.length > 0) {
643
+ matterLogger.debug(`Main bridge doesn't have accessory ${data.uuid}, forwarding to ${matterChildBridges.length} child bridge(s) with Matter enabled`);
644
+ for (const childBridge of matterChildBridges) {
645
+ childBridge.controlMatterAccessory(data);
646
+ }
647
+ }
648
+ else {
649
+ matterLogger.warn(`Accessory ${data.uuid} not found - not on main bridge and no child bridges with Matter available`);
650
+ const event = {
651
+ type: 'accessoryControlResponse',
652
+ data: {
653
+ success: false,
654
+ error: 'Accessory not found',
655
+ uuid: data.uuid,
656
+ },
657
+ };
658
+ this.ipcService.sendMessage("matterEvent", event);
659
+ }
507
660
  });
508
661
  }
509
662
  printSetupInfo(pin) {
510
- /* eslint-disable no-console */
511
663
  console.log('Setup Payload:');
512
664
  console.log(this.bridgeService.bridge.setupURI());
513
665
  if (!this.options.hideQRCode) {
514
666
  console.log('Scan this code with your HomeKit app on your iOS device to pair with Homebridge:');
515
- qrcode.setErrorLevel('M'); // HAP specifies level M or higher for ECC
667
+ qrcode.setErrorLevel('M');
516
668
  qrcode.generate(this.bridgeService.bridge.setupURI());
517
669
  console.log('Or enter this code with your HomeKit app on your iOS device to pair with Homebridge:');
518
670
  }
@@ -524,7 +676,6 @@ export class Server {
524
676
  console.log(chalk.black.bgWhite(` │ ${pin} │ `));
525
677
  console.log(chalk.black.bgWhite(' └────────────┘ '));
526
678
  console.log(chalk.black.bgWhite(' '));
527
- /* eslint-enable no-console */
528
679
  }
529
680
  }
530
681
  //# sourceMappingURL=server.js.map