homebridge 2.0.0-beta.35 → 2.0.0-beta.36

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 (280) hide show
  1. package/dist/api.d.ts +74 -32
  2. package/dist/api.d.ts.map +1 -1
  3. package/dist/api.js +48 -46
  4. package/dist/api.js.map +1 -1
  5. package/dist/api.spec.d.ts +2 -0
  6. package/dist/api.spec.d.ts.map +1 -0
  7. package/dist/api.spec.js +413 -0
  8. package/dist/api.spec.js.map +1 -0
  9. package/dist/childBridgeFork.d.ts +1 -18
  10. package/dist/childBridgeFork.d.ts.map +1 -1
  11. package/dist/childBridgeFork.js +21 -258
  12. package/dist/childBridgeFork.js.map +1 -1
  13. package/dist/index.d.ts +10 -10
  14. package/dist/index.d.ts.map +1 -1
  15. package/dist/index.js +3 -3
  16. package/dist/index.js.map +1 -1
  17. package/dist/logger.spec.d.ts +2 -0
  18. package/dist/logger.spec.d.ts.map +1 -0
  19. package/dist/logger.spec.js +95 -0
  20. package/dist/logger.spec.js.map +1 -0
  21. package/dist/matter/ChildBridgeMatterManager.d.ts +96 -0
  22. package/dist/matter/ChildBridgeMatterManager.d.ts.map +1 -0
  23. package/dist/matter/ChildBridgeMatterManager.js +397 -0
  24. package/dist/matter/ChildBridgeMatterManager.js.map +1 -0
  25. package/dist/matter/ExternalMatterAccessoryPublisher.d.ts +48 -0
  26. package/dist/matter/ExternalMatterAccessoryPublisher.d.ts.map +1 -0
  27. package/dist/matter/ExternalMatterAccessoryPublisher.js +73 -0
  28. package/dist/matter/ExternalMatterAccessoryPublisher.js.map +1 -0
  29. package/dist/matter/ExternalMatterAccessoryPublisher.spec.d.ts +2 -0
  30. package/dist/matter/ExternalMatterAccessoryPublisher.spec.d.ts.map +1 -0
  31. package/dist/matter/ExternalMatterAccessoryPublisher.spec.js +293 -0
  32. package/dist/matter/ExternalMatterAccessoryPublisher.spec.js.map +1 -0
  33. package/dist/matter/{matterServer.d.ts → MatterAPIImpl.d.ts} +203 -367
  34. package/dist/matter/MatterAPIImpl.d.ts.map +1 -0
  35. package/dist/matter/MatterAPIImpl.js +305 -0
  36. package/dist/matter/MatterAPIImpl.js.map +1 -0
  37. package/dist/matter/MatterBridgeManager.d.ts +91 -0
  38. package/dist/matter/MatterBridgeManager.d.ts.map +1 -0
  39. package/dist/matter/MatterBridgeManager.js +426 -0
  40. package/dist/matter/MatterBridgeManager.js.map +1 -0
  41. package/dist/matter/MatterConfigCollector.d.ts +26 -0
  42. package/dist/matter/MatterConfigCollector.d.ts.map +1 -0
  43. package/dist/matter/MatterConfigCollector.js +78 -0
  44. package/dist/matter/MatterConfigCollector.js.map +1 -0
  45. package/dist/matter/{matterAccessoryCache.d.ts → accessoryCache.d.ts} +12 -3
  46. package/dist/matter/accessoryCache.d.ts.map +1 -0
  47. package/dist/matter/{matterAccessoryCache.js → accessoryCache.js} +32 -10
  48. package/dist/matter/accessoryCache.js.map +1 -0
  49. package/dist/matter/accessoryCache.spec.d.ts +2 -0
  50. package/dist/matter/accessoryCache.spec.d.ts.map +1 -0
  51. package/dist/matter/accessoryCache.spec.js +452 -0
  52. package/dist/matter/accessoryCache.spec.js.map +1 -0
  53. package/dist/matter/behaviors/BehaviorRegistry.d.ts +65 -0
  54. package/dist/matter/behaviors/BehaviorRegistry.d.ts.map +1 -0
  55. package/dist/matter/behaviors/BehaviorRegistry.js +139 -0
  56. package/dist/matter/behaviors/BehaviorRegistry.js.map +1 -0
  57. package/dist/matter/behaviors/BehaviorRegistry.spec.d.ts +2 -0
  58. package/dist/matter/behaviors/BehaviorRegistry.spec.d.ts.map +1 -0
  59. package/dist/matter/behaviors/BehaviorRegistry.spec.js +307 -0
  60. package/dist/matter/behaviors/BehaviorRegistry.spec.js.map +1 -0
  61. package/dist/matter/behaviors/ColorControlBehavior.d.ts +64 -0
  62. package/dist/matter/behaviors/ColorControlBehavior.d.ts.map +1 -0
  63. package/dist/matter/behaviors/ColorControlBehavior.js +160 -0
  64. package/dist/matter/behaviors/ColorControlBehavior.js.map +1 -0
  65. package/dist/matter/behaviors/ColorControlBehavior.spec.d.ts +2 -0
  66. package/dist/matter/behaviors/ColorControlBehavior.spec.d.ts.map +1 -0
  67. package/dist/matter/behaviors/ColorControlBehavior.spec.js +29 -0
  68. package/dist/matter/behaviors/ColorControlBehavior.spec.js.map +1 -0
  69. package/dist/matter/behaviors/DoorLockBehavior.d.ts +21 -0
  70. package/dist/matter/behaviors/DoorLockBehavior.d.ts.map +1 -0
  71. package/dist/matter/behaviors/DoorLockBehavior.js +49 -0
  72. package/dist/matter/behaviors/DoorLockBehavior.js.map +1 -0
  73. package/dist/matter/behaviors/DoorLockBehavior.spec.d.ts +2 -0
  74. package/dist/matter/behaviors/DoorLockBehavior.spec.d.ts.map +1 -0
  75. package/dist/matter/behaviors/DoorLockBehavior.spec.js +108 -0
  76. package/dist/matter/behaviors/DoorLockBehavior.spec.js.map +1 -0
  77. package/dist/matter/behaviors/FanControlBehavior.d.ts +20 -0
  78. package/dist/matter/behaviors/FanControlBehavior.d.ts.map +1 -0
  79. package/dist/matter/behaviors/FanControlBehavior.js +45 -0
  80. package/dist/matter/behaviors/FanControlBehavior.js.map +1 -0
  81. package/dist/matter/behaviors/FanControlBehavior.spec.d.ts +2 -0
  82. package/dist/matter/behaviors/FanControlBehavior.spec.d.ts.map +1 -0
  83. package/dist/matter/behaviors/FanControlBehavior.spec.js +23 -0
  84. package/dist/matter/behaviors/FanControlBehavior.spec.js.map +1 -0
  85. package/dist/matter/behaviors/IdentifyBehavior.d.ts +21 -0
  86. package/dist/matter/behaviors/IdentifyBehavior.d.ts.map +1 -0
  87. package/dist/matter/behaviors/IdentifyBehavior.js +27 -0
  88. package/dist/matter/behaviors/IdentifyBehavior.js.map +1 -0
  89. package/dist/matter/behaviors/IdentifyBehavior.spec.d.ts +2 -0
  90. package/dist/matter/behaviors/IdentifyBehavior.spec.d.ts.map +1 -0
  91. package/dist/matter/behaviors/IdentifyBehavior.spec.js +64 -0
  92. package/dist/matter/behaviors/IdentifyBehavior.spec.js.map +1 -0
  93. package/dist/matter/behaviors/LevelControlBehavior.d.ts +34 -0
  94. package/dist/matter/behaviors/LevelControlBehavior.d.ts.map +1 -0
  95. package/dist/matter/behaviors/LevelControlBehavior.js +75 -0
  96. package/dist/matter/behaviors/LevelControlBehavior.js.map +1 -0
  97. package/dist/matter/behaviors/LevelControlBehavior.spec.d.ts +2 -0
  98. package/dist/matter/behaviors/LevelControlBehavior.spec.d.ts.map +1 -0
  99. package/dist/matter/behaviors/LevelControlBehavior.spec.js +140 -0
  100. package/dist/matter/behaviors/LevelControlBehavior.spec.js.map +1 -0
  101. package/dist/matter/behaviors/OnOffBehavior.d.ts +28 -0
  102. package/dist/matter/behaviors/OnOffBehavior.d.ts.map +1 -0
  103. package/dist/matter/behaviors/OnOffBehavior.js +63 -0
  104. package/dist/matter/behaviors/OnOffBehavior.js.map +1 -0
  105. package/dist/matter/behaviors/OnOffBehavior.spec.d.ts +2 -0
  106. package/dist/matter/behaviors/OnOffBehavior.spec.d.ts.map +1 -0
  107. package/dist/matter/behaviors/OnOffBehavior.spec.js +116 -0
  108. package/dist/matter/behaviors/OnOffBehavior.spec.js.map +1 -0
  109. package/dist/matter/behaviors/RvcCleanModeBehavior.d.ts +19 -0
  110. package/dist/matter/behaviors/RvcCleanModeBehavior.d.ts.map +1 -0
  111. package/dist/matter/behaviors/RvcCleanModeBehavior.js +27 -0
  112. package/dist/matter/behaviors/RvcCleanModeBehavior.js.map +1 -0
  113. package/dist/matter/behaviors/RvcCleanModeBehavior.spec.d.ts +2 -0
  114. package/dist/matter/behaviors/RvcCleanModeBehavior.spec.d.ts.map +1 -0
  115. package/dist/matter/behaviors/RvcCleanModeBehavior.spec.js +56 -0
  116. package/dist/matter/behaviors/RvcCleanModeBehavior.spec.js.map +1 -0
  117. package/dist/matter/behaviors/RvcOperationalStateBehavior.d.ts +23 -0
  118. package/dist/matter/behaviors/RvcOperationalStateBehavior.d.ts.map +1 -0
  119. package/dist/matter/behaviors/RvcOperationalStateBehavior.js +49 -0
  120. package/dist/matter/behaviors/RvcOperationalStateBehavior.js.map +1 -0
  121. package/dist/matter/behaviors/RvcOperationalStateBehavior.spec.d.ts +2 -0
  122. package/dist/matter/behaviors/RvcOperationalStateBehavior.spec.d.ts.map +1 -0
  123. package/dist/matter/behaviors/RvcOperationalStateBehavior.spec.js +55 -0
  124. package/dist/matter/behaviors/RvcOperationalStateBehavior.spec.js.map +1 -0
  125. package/dist/matter/behaviors/RvcRunModeBehavior.d.ts +19 -0
  126. package/dist/matter/behaviors/RvcRunModeBehavior.d.ts.map +1 -0
  127. package/dist/matter/behaviors/RvcRunModeBehavior.js +27 -0
  128. package/dist/matter/behaviors/RvcRunModeBehavior.js.map +1 -0
  129. package/dist/matter/behaviors/RvcRunModeBehavior.spec.d.ts +2 -0
  130. package/dist/matter/behaviors/RvcRunModeBehavior.spec.d.ts.map +1 -0
  131. package/dist/matter/behaviors/RvcRunModeBehavior.spec.js +56 -0
  132. package/dist/matter/behaviors/RvcRunModeBehavior.spec.js.map +1 -0
  133. package/dist/matter/behaviors/ServiceAreaBehavior.d.ts +22 -0
  134. package/dist/matter/behaviors/ServiceAreaBehavior.d.ts.map +1 -0
  135. package/dist/matter/behaviors/ServiceAreaBehavior.js +35 -0
  136. package/dist/matter/behaviors/ServiceAreaBehavior.js.map +1 -0
  137. package/dist/matter/behaviors/ServiceAreaBehavior.spec.d.ts +2 -0
  138. package/dist/matter/behaviors/ServiceAreaBehavior.spec.d.ts.map +1 -0
  139. package/dist/matter/behaviors/ServiceAreaBehavior.spec.js +52 -0
  140. package/dist/matter/behaviors/ServiceAreaBehavior.spec.js.map +1 -0
  141. package/dist/matter/behaviors/ThermostatBehavior.d.ts +23 -0
  142. package/dist/matter/behaviors/ThermostatBehavior.d.ts.map +1 -0
  143. package/dist/matter/behaviors/ThermostatBehavior.js +79 -0
  144. package/dist/matter/behaviors/ThermostatBehavior.js.map +1 -0
  145. package/dist/matter/behaviors/ThermostatBehavior.spec.d.ts +2 -0
  146. package/dist/matter/behaviors/ThermostatBehavior.spec.d.ts.map +1 -0
  147. package/dist/matter/behaviors/ThermostatBehavior.spec.js +23 -0
  148. package/dist/matter/behaviors/ThermostatBehavior.spec.js.map +1 -0
  149. package/dist/matter/behaviors/WindowCoveringBehavior.d.ts +32 -0
  150. package/dist/matter/behaviors/WindowCoveringBehavior.d.ts.map +1 -0
  151. package/dist/matter/behaviors/WindowCoveringBehavior.js +106 -0
  152. package/dist/matter/behaviors/WindowCoveringBehavior.js.map +1 -0
  153. package/dist/matter/behaviors/WindowCoveringBehavior.spec.d.ts +2 -0
  154. package/dist/matter/behaviors/WindowCoveringBehavior.spec.d.ts.map +1 -0
  155. package/dist/matter/behaviors/WindowCoveringBehavior.spec.js +27 -0
  156. package/dist/matter/behaviors/WindowCoveringBehavior.spec.js.map +1 -0
  157. package/dist/matter/behaviors/index.d.ts +20 -0
  158. package/dist/matter/behaviors/index.d.ts.map +1 -0
  159. package/dist/matter/behaviors/index.js +21 -0
  160. package/dist/matter/behaviors/index.js.map +1 -0
  161. package/dist/matter/{matterConfigValidator.d.ts → configValidator.d.ts} +1 -1
  162. package/dist/matter/configValidator.d.ts.map +1 -0
  163. package/dist/matter/{matterConfigValidator.js → configValidator.js} +1 -1
  164. package/dist/matter/configValidator.js.map +1 -0
  165. package/dist/matter/configValidator.spec.d.ts +2 -0
  166. package/dist/matter/configValidator.spec.d.ts.map +1 -0
  167. package/dist/matter/configValidator.spec.js +390 -0
  168. package/dist/matter/configValidator.spec.js.map +1 -0
  169. package/dist/matter/errorHandler.d.ts +33 -0
  170. package/dist/matter/errorHandler.d.ts.map +1 -0
  171. package/dist/matter/errorHandler.js +113 -0
  172. package/dist/matter/errorHandler.js.map +1 -0
  173. package/dist/matter/errorHandler.spec.d.ts +2 -0
  174. package/dist/matter/errorHandler.spec.d.ts.map +1 -0
  175. package/dist/matter/errorHandler.spec.js +159 -0
  176. package/dist/matter/errorHandler.spec.js.map +1 -0
  177. package/dist/matter/index.d.ts +7 -4
  178. package/dist/matter/index.d.ts.map +1 -1
  179. package/dist/matter/index.js +7 -4
  180. package/dist/matter/index.js.map +1 -1
  181. package/dist/matter/{matterLogFormatter.d.ts → logFormatter.d.ts} +1 -1
  182. package/dist/matter/logFormatter.d.ts.map +1 -0
  183. package/dist/matter/{matterLogFormatter.js → logFormatter.js} +33 -6
  184. package/dist/matter/logFormatter.js.map +1 -0
  185. package/dist/matter/logFormatter.spec.d.ts +2 -0
  186. package/dist/matter/logFormatter.spec.d.ts.map +1 -0
  187. package/dist/matter/logFormatter.spec.js +284 -0
  188. package/dist/matter/logFormatter.spec.js.map +1 -0
  189. package/dist/matter/server.d.ts +350 -0
  190. package/dist/matter/server.d.ts.map +1 -0
  191. package/dist/matter/{matterServer.js → server.js} +533 -352
  192. package/dist/matter/server.js.map +1 -0
  193. package/dist/matter/{matterServerHelpers.d.ts → serverHelpers.d.ts} +2 -2
  194. package/dist/matter/serverHelpers.d.ts.map +1 -0
  195. package/dist/matter/{matterServerHelpers.js → serverHelpers.js} +11 -8
  196. package/dist/matter/serverHelpers.js.map +1 -0
  197. package/dist/matter/serverHelpers.spec.d.ts +2 -0
  198. package/dist/matter/serverHelpers.spec.d.ts.map +1 -0
  199. package/dist/matter/serverHelpers.spec.js +521 -0
  200. package/dist/matter/serverHelpers.spec.js.map +1 -0
  201. package/dist/matter/{matterSharedTypes.d.ts → sharedTypes.d.ts} +4 -10
  202. package/dist/matter/sharedTypes.d.ts.map +1 -0
  203. package/dist/matter/{matterSharedTypes.js → sharedTypes.js} +4 -10
  204. package/dist/matter/sharedTypes.js.map +1 -0
  205. package/dist/matter/{matterStorage.d.ts → storage.d.ts} +9 -2
  206. package/dist/matter/storage.d.ts.map +1 -0
  207. package/dist/matter/{matterStorage.js → storage.js} +14 -5
  208. package/dist/matter/{matterStorage.js.map → storage.js.map} +1 -1
  209. package/dist/matter/storage.spec.d.ts +2 -0
  210. package/dist/matter/storage.spec.d.ts.map +1 -0
  211. package/dist/matter/storage.spec.js +570 -0
  212. package/dist/matter/storage.spec.js.map +1 -0
  213. package/dist/matter/typeHelpers.d.ts +45 -0
  214. package/dist/matter/typeHelpers.d.ts.map +1 -0
  215. package/dist/matter/typeHelpers.js +57 -0
  216. package/dist/matter/typeHelpers.js.map +1 -0
  217. package/dist/matter/typeHelpers.spec.d.ts +2 -0
  218. package/dist/matter/typeHelpers.spec.d.ts.map +1 -0
  219. package/dist/matter/typeHelpers.spec.js +127 -0
  220. package/dist/matter/typeHelpers.spec.js.map +1 -0
  221. package/dist/matter/{matterTypes.d.ts → types.d.ts} +2 -2
  222. package/dist/matter/types.d.ts.map +1 -0
  223. package/dist/matter/{matterTypes.js → types.js} +1 -2
  224. package/dist/matter/types.js.map +1 -0
  225. package/dist/platformAccessory.spec.d.ts +2 -0
  226. package/dist/platformAccessory.spec.d.ts.map +1 -0
  227. package/dist/platformAccessory.spec.js +126 -0
  228. package/dist/platformAccessory.spec.js.map +1 -0
  229. package/dist/pluginManager.spec.d.ts +2 -0
  230. package/dist/pluginManager.spec.d.ts.map +1 -0
  231. package/dist/pluginManager.spec.js +43 -0
  232. package/dist/pluginManager.spec.js.map +1 -0
  233. package/dist/server.d.ts +4 -13
  234. package/dist/server.d.ts.map +1 -1
  235. package/dist/server.js +43 -346
  236. package/dist/server.js.map +1 -1
  237. package/dist/server.spec.d.ts +2 -0
  238. package/dist/server.spec.d.ts.map +1 -0
  239. package/dist/server.spec.js +57 -0
  240. package/dist/server.spec.js.map +1 -0
  241. package/dist/user.spec.d.ts +2 -0
  242. package/dist/user.spec.d.ts.map +1 -0
  243. package/dist/user.spec.js +31 -0
  244. package/dist/user.spec.js.map +1 -0
  245. package/dist/util/mac.spec.d.ts +2 -0
  246. package/dist/util/mac.spec.d.ts.map +1 -0
  247. package/dist/util/mac.spec.js +36 -0
  248. package/dist/util/mac.spec.js.map +1 -0
  249. package/dist/version.spec.d.ts +2 -0
  250. package/dist/version.spec.d.ts.map +1 -0
  251. package/dist/version.spec.js +20 -0
  252. package/dist/version.spec.js.map +1 -0
  253. package/package.json +4 -4
  254. package/dist/matter/matterAccessoryCache.d.ts.map +0 -1
  255. package/dist/matter/matterAccessoryCache.js.map +0 -1
  256. package/dist/matter/matterBehaviors.d.ts +0 -194
  257. package/dist/matter/matterBehaviors.d.ts.map +0 -1
  258. package/dist/matter/matterBehaviors.js +0 -665
  259. package/dist/matter/matterBehaviors.js.map +0 -1
  260. package/dist/matter/matterConfigValidator.d.ts.map +0 -1
  261. package/dist/matter/matterConfigValidator.js.map +0 -1
  262. package/dist/matter/matterErrorHandler.d.ts +0 -106
  263. package/dist/matter/matterErrorHandler.d.ts.map +0 -1
  264. package/dist/matter/matterErrorHandler.js +0 -495
  265. package/dist/matter/matterErrorHandler.js.map +0 -1
  266. package/dist/matter/matterLogFormatter.d.ts.map +0 -1
  267. package/dist/matter/matterLogFormatter.js.map +0 -1
  268. package/dist/matter/matterNetworkMonitor.d.ts +0 -68
  269. package/dist/matter/matterNetworkMonitor.d.ts.map +0 -1
  270. package/dist/matter/matterNetworkMonitor.js +0 -249
  271. package/dist/matter/matterNetworkMonitor.js.map +0 -1
  272. package/dist/matter/matterServer.d.ts.map +0 -1
  273. package/dist/matter/matterServer.js.map +0 -1
  274. package/dist/matter/matterServerHelpers.d.ts.map +0 -1
  275. package/dist/matter/matterServerHelpers.js.map +0 -1
  276. package/dist/matter/matterSharedTypes.d.ts.map +0 -1
  277. package/dist/matter/matterSharedTypes.js.map +0 -1
  278. package/dist/matter/matterStorage.d.ts.map +0 -1
  279. package/dist/matter/matterTypes.d.ts.map +0 -1
  280. package/dist/matter/matterTypes.js.map +0 -1
@@ -0,0 +1,426 @@
1
+ /**
2
+ * Matter Bridge Manager
3
+ *
4
+ * Manages Matter server lifecycle and accessories for the main Homebridge bridge.
5
+ * This class extracts Matter-specific logic from server.ts to minimize changes to core files.
6
+ */
7
+ import { rmSync } from 'node:fs';
8
+ import path from 'node:path';
9
+ import { Logger } from '../logger.js';
10
+ import { User } from '../user.js';
11
+ import { generate } from '../util/mac.js';
12
+ import { publishExternalMatterAccessory } from './ExternalMatterAccessoryPublisher.js';
13
+ import { MatterServer } from './server.js';
14
+ const log = Logger.internal;
15
+ /**
16
+ * Manages Matter server and accessories for the main bridge
17
+ */
18
+ export class MatterBridgeManager {
19
+ config;
20
+ api;
21
+ externalPortService;
22
+ pluginManager;
23
+ options;
24
+ // Matter server instance for main bridge (if enabled)
25
+ matterServer;
26
+ // External Matter servers for accessories that need their own bridge
27
+ // Key is accessory UUID, value is MatterServer instance
28
+ externalMatterServers = new Map();
29
+ constructor(config, api, externalPortService, pluginManager, options) {
30
+ this.config = config;
31
+ this.api = api;
32
+ this.externalPortService = externalPortService;
33
+ this.pluginManager = pluginManager;
34
+ this.options = options;
35
+ }
36
+ /**
37
+ * Collect all configured Matter ports from config to avoid conflicts
38
+ */
39
+ static collectConfiguredMatterPorts(config) {
40
+ const configuredMatterPorts = [];
41
+ if (config.bridge.matter?.port) {
42
+ configuredMatterPorts.push(config.bridge.matter.port);
43
+ }
44
+ for (const platform of config.platforms) {
45
+ if (platform._bridge?.matter?.port) {
46
+ configuredMatterPorts.push(platform._bridge.matter.port);
47
+ }
48
+ }
49
+ for (const accessory of config.accessories) {
50
+ if (accessory._bridge?.matter?.port) {
51
+ configuredMatterPorts.push(accessory._bridge.matter.port);
52
+ }
53
+ }
54
+ return configuredMatterPorts;
55
+ }
56
+ /**
57
+ * Initialize Matter server for main bridge if enabled
58
+ */
59
+ async initialize() {
60
+ // Check if main bridge has matter configuration
61
+ if (!this.config.bridge.matter) {
62
+ return;
63
+ }
64
+ // Declare matterPort outside try block so it's accessible in catch
65
+ let matterPort;
66
+ try {
67
+ log.info('Initializing Matter server for main bridge...');
68
+ // Allocate port from pool if not explicitly configured
69
+ matterPort = this.config.bridge.matter.port;
70
+ if (!matterPort) {
71
+ matterPort = await this.externalPortService.requestPort(`${this.config.bridge.username}:MATTER`);
72
+ if (!matterPort) {
73
+ matterPort = 5540; // Default Matter port
74
+ log.warn('No port available from pool for main Matter bridge, using default port 5540');
75
+ }
76
+ else {
77
+ log.info(`Allocated port ${matterPort} from pool for main Matter bridge`);
78
+ }
79
+ }
80
+ // Create Matter server instance with config inheritance from main bridge
81
+ const serialNumber = this.config.bridge.username.replace(/:/g, '');
82
+ // Normalize bind config to array format
83
+ const networkInterfaces = this.config.bridge.bind
84
+ ? Array.isArray(this.config.bridge.bind)
85
+ ? this.config.bridge.bind
86
+ : [this.config.bridge.bind]
87
+ : undefined;
88
+ this.matterServer = new MatterServer({
89
+ storagePath: User.matterPath(),
90
+ port: matterPort,
91
+ uniqueId: serialNumber,
92
+ manufacturer: this.config.bridge.manufacturer,
93
+ model: this.config.bridge.model,
94
+ firmwareRevision: this.config.bridge.firmwareRevision,
95
+ serialNumber,
96
+ debugModeEnabled: this.options.debugModeEnabled,
97
+ networkInterfaces,
98
+ });
99
+ // Start the Matter server
100
+ await this.matterServer.start();
101
+ log.info('Matter server initialized for main bridge');
102
+ // Inform the API that Matter is enabled
103
+ this.api._setMatterEnabled(true);
104
+ // Set the Matter server reference for API methods like getAccessoryState
105
+ this.api._setMatterServer(this.matterServer);
106
+ // Listen for Matter commissioning events to update status
107
+ this.matterServer.on('commissioning-changed', (commissioned, fabricCount) => {
108
+ // Status update is handled by server.ts via getMatterStatus()
109
+ log.info(`Matter commissioning state changed: commissioned=${commissioned}, fabricCount=${fabricCount}`);
110
+ });
111
+ }
112
+ catch (error) {
113
+ log.error('Failed to initialize Matter server for main bridge:', error);
114
+ // Provide user-friendly guidance for common errors
115
+ const errorMessage = error instanceof Error ? error.message : String(error);
116
+ const errorCode = error instanceof Error && 'code' in error ? error.code : undefined;
117
+ if (errorMessage.includes('corrupted')) {
118
+ log.error('');
119
+ log.error('╔════════════════════════════════════════════════════════════════════════════╗');
120
+ log.error('║ MATTER STORAGE CORRUPTED ║');
121
+ log.error('╠════════════════════════════════════════════════════════════════════════════╣');
122
+ log.error('║ Your Matter storage has become corrupted. This can happen when: ║');
123
+ log.error('║ • Matter.js library version changes ║');
124
+ log.error('║ • Storage format upgrades occur ║');
125
+ log.error('║ • Incomplete writes during shutdown ║');
126
+ log.error('║ ║');
127
+ log.error('║ To fix this, delete the corrupted storage directory: ║');
128
+ log.error(`║ rm -rf ~/.homebridge/matter/${this.config.bridge.username} ║`);
129
+ log.error('║ ║');
130
+ log.error('║ Note: You will need to re-pair your Matter devices after deletion. ║');
131
+ log.error('╚════════════════════════════════════════════════════════════════════════════╝');
132
+ log.error('');
133
+ }
134
+ else if (errorCode === 'EADDRINUSE' || errorMessage.includes('address already in use')) {
135
+ log.error('');
136
+ log.error('╔════════════════════════════════════════════════════════════════════════════╗');
137
+ log.error('║ MATTER PORT ALREADY IN USE ║');
138
+ log.error('╠════════════════════════════════════════════════════════════════════════════╣');
139
+ log.error(`║ Port ${matterPort} is already in use by another application. ║`);
140
+ log.error('║ ║');
141
+ log.error('║ To fix this: ║');
142
+ log.error('║ 1. Stop the application using this port, or ║');
143
+ log.error('║ 2. Configure a different port in your config.json: ║');
144
+ log.error('║ "bridge": { ║');
145
+ log.error('║ "matter": { ║');
146
+ log.error('║ "port": <different-port> ║');
147
+ log.error('║ } ║');
148
+ log.error('║ } ║');
149
+ log.error('╚════════════════════════════════════════════════════════════════════════════╝');
150
+ log.error('');
151
+ }
152
+ }
153
+ }
154
+ /**
155
+ * Handle external Matter accessories - each gets its own dedicated Matter server
156
+ * This is required for devices like Robotic Vacuum Cleaners that Apple Home
157
+ * requires to be on their own bridge.
158
+ */
159
+ async handlePublishExternalAccessories(accessories, registrationId) {
160
+ log.info(`Publishing ${accessories.length} external Matter accessor${accessories.length === 1 ? 'y' : 'ies'}`);
161
+ // Normalize bind config to array format (inherit from main bridge)
162
+ const networkInterfaces = this.config.bridge.bind
163
+ ? Array.isArray(this.config.bridge.bind)
164
+ ? this.config.bridge.bind
165
+ : [this.config.bridge.bind]
166
+ : undefined;
167
+ try {
168
+ for (const accessory of accessories) {
169
+ try {
170
+ // Check if already published
171
+ if (this.externalMatterServers.has(accessory.uuid)) {
172
+ log.warn(`External Matter accessory ${accessory.displayName} (${accessory.uuid}) is already published`);
173
+ continue;
174
+ }
175
+ // Publish the accessory using shared helper
176
+ const result = await publishExternalMatterAccessory(accessory, {
177
+ portService: this.externalPortService,
178
+ networkInterfaces,
179
+ debugModeEnabled: this.options.debugModeEnabled,
180
+ });
181
+ if (!result) {
182
+ // Validation or publishing failed (errors already logged by helper)
183
+ continue;
184
+ }
185
+ // Store the server instance
186
+ this.externalMatterServers.set(accessory.uuid, result.server);
187
+ // Emit the 'ready' event to notify plugins that the accessory is now available on the network
188
+ // This is similar to HAP's 'advertised' event and signals that the Matter server is running
189
+ // and the accessory can be commissioned by Matter controllers
190
+ if (accessory._eventEmitter) {
191
+ accessory._eventEmitter.emit('ready', result.port);
192
+ }
193
+ // Log commissioning info
194
+ if (result.commissioningInfo.qrCode && result.commissioningInfo.manualPairingCode) {
195
+ log.info(`📱 Commissioning codes for ${accessory.displayName}:`);
196
+ log.info(` QR Code: ${result.commissioningInfo.qrCode}`);
197
+ log.info(` Manual Code: ${result.commissioningInfo.manualPairingCode}`);
198
+ }
199
+ }
200
+ catch (error) {
201
+ log.error(`Failed to publish external Matter accessory ${accessory.displayName}:`, error);
202
+ }
203
+ }
204
+ }
205
+ finally {
206
+ // Notify that registration is complete (whether successful or not)
207
+ this.api._resolveExternalRegistration(registrationId);
208
+ }
209
+ }
210
+ /**
211
+ * Handle registration of Matter platform accessories
212
+ */
213
+ async handleRegisterPlatformAccessories(pluginIdentifier, platformName, accessories) {
214
+ if (!this.matterServer) {
215
+ log.warn('Cannot register Matter accessories - Matter server is not running');
216
+ return;
217
+ }
218
+ await this.matterServer.registerPlatformAccessories(pluginIdentifier, platformName, accessories);
219
+ }
220
+ /**
221
+ * Handle unregistration of Matter platform accessories
222
+ */
223
+ async handleUnregisterPlatformAccessories(pluginIdentifier, platformName, accessories) {
224
+ if (!this.matterServer) {
225
+ log.warn('Cannot unregister Matter accessories - Matter server is not running');
226
+ return;
227
+ }
228
+ await this.matterServer.unregisterPlatformAccessories(pluginIdentifier, platformName, accessories);
229
+ }
230
+ /**
231
+ * Handle unregistration of external Matter accessories
232
+ * Stops dedicated servers and cleans up storage
233
+ */
234
+ async handleUnregisterExternalAccessories(accessories) {
235
+ log.info(`Unregistering ${accessories.length} external Matter accessor${accessories.length === 1 ? 'y' : 'ies'}`);
236
+ for (const accessory of accessories) {
237
+ try {
238
+ // Check if this external server exists
239
+ const matterServer = this.externalMatterServers.get(accessory.uuid);
240
+ if (!matterServer) {
241
+ log.warn(`External Matter accessory ${accessory.displayName} (${accessory.uuid}) is not registered`);
242
+ continue;
243
+ }
244
+ log.info(`Stopping external Matter server for ${accessory.displayName}`);
245
+ // Stop the Matter server
246
+ await matterServer.stop();
247
+ // Remove from the map
248
+ this.externalMatterServers.delete(accessory.uuid);
249
+ // Clean up storage folder
250
+ // Generate the same uniqueId that was used when creating the server
251
+ const advertiseAddress = generate(accessory.uuid);
252
+ const uniqueId = advertiseAddress.replace(/:/g, '');
253
+ const storagePath = path.join(User.matterPath(), uniqueId);
254
+ try {
255
+ log.debug(`Removing Matter storage for external accessory at: ${storagePath}`);
256
+ rmSync(storagePath, { recursive: true, force: true });
257
+ log.info(`✓ Cleaned up storage for external Matter accessory: ${accessory.displayName}`);
258
+ }
259
+ catch (error) {
260
+ log.error(`Failed to clean up storage for external Matter accessory ${accessory.displayName}:`, error);
261
+ }
262
+ log.info(`✓ External Matter accessory unregistered: ${accessory.displayName}`);
263
+ }
264
+ catch (error) {
265
+ log.error(`Failed to unregister external Matter accessory ${accessory.displayName}:`, error);
266
+ }
267
+ }
268
+ }
269
+ /**
270
+ * Handle updating Matter platform accessories in the cache
271
+ * Checks both external servers and main bridge server
272
+ */
273
+ async handleUpdatePlatformAccessories(accessories) {
274
+ const bridgeAccessories = [];
275
+ // Route each accessory to the appropriate server
276
+ for (const accessory of accessories) {
277
+ const externalServer = this.externalMatterServers.get(accessory.uuid);
278
+ if (externalServer) {
279
+ // Update external accessory
280
+ await externalServer.updatePlatformAccessories([accessory]);
281
+ }
282
+ else {
283
+ // Collect accessories for main bridge
284
+ bridgeAccessories.push(accessory);
285
+ }
286
+ }
287
+ // Update accessories on main bridge server if any
288
+ if (bridgeAccessories.length > 0) {
289
+ if (!this.matterServer) {
290
+ log.warn('Cannot update Matter platform accessories - Matter server is not running');
291
+ return;
292
+ }
293
+ await this.matterServer.updatePlatformAccessories(bridgeAccessories);
294
+ }
295
+ }
296
+ /**
297
+ * Handle Matter accessory state updates
298
+ * Checks both external servers and main bridge server
299
+ */
300
+ async handleUpdateAccessoryState(uuid, cluster, attributes, partId) {
301
+ // Check if this is an external accessory first
302
+ const externalServer = this.externalMatterServers.get(uuid);
303
+ if (externalServer) {
304
+ await externalServer.updateAccessoryState(uuid, cluster, attributes, partId);
305
+ return;
306
+ }
307
+ // Otherwise, try the main bridge server
308
+ if (!this.matterServer) {
309
+ log.warn(`Cannot update Matter accessory state for ${uuid} - accessory not found in external servers and main Matter server is not running`);
310
+ return;
311
+ }
312
+ await this.matterServer.updateAccessoryState(uuid, cluster, attributes, partId);
313
+ }
314
+ /**
315
+ * Restore cached Matter accessories (matching HAP pattern)
316
+ */
317
+ restoreCachedAccessories(keepOrphaned) {
318
+ if (!this.matterServer) {
319
+ log.debug('Matter server not available for restoring cached accessories');
320
+ return;
321
+ }
322
+ const cachedAccessories = this.matterServer.getAllCachedAccessories();
323
+ log.debug(`Restoring ${cachedAccessories.length} cached Matter accessories`);
324
+ for (const cachedAccessory of cachedAccessories) {
325
+ let plugin = this.pluginManager.getPlugin(cachedAccessory.plugin);
326
+ if (!plugin) {
327
+ try {
328
+ // Try to find plugin by platform name (handles plugin renames)
329
+ plugin = this.pluginManager.getPluginByActiveDynamicPlatform(cachedAccessory.platform);
330
+ if (plugin) {
331
+ log.info(`When searching for the associated plugin of the Matter accessory '${cachedAccessory.displayName}' `
332
+ + `it seems like the plugin name changed from '${cachedAccessory.plugin}' to '${plugin.getPluginIdentifier()}'. Plugin association is now being transformed!`);
333
+ }
334
+ }
335
+ catch (error) {
336
+ const errorMessage = error instanceof Error ? error.message : String(error);
337
+ log.warn(`Could not find the associated plugin for the Matter accessory '${cachedAccessory.displayName}'. `
338
+ + `Tried to find the plugin by the platform name but ${errorMessage}`);
339
+ }
340
+ }
341
+ const platformPlugin = plugin && plugin.getActiveDynamicPlatform(cachedAccessory.platform);
342
+ if (!platformPlugin) {
343
+ log.warn(`Failed to find plugin to handle Matter accessory ${cachedAccessory.displayName} (plugin: ${cachedAccessory.plugin}, platform: ${cachedAccessory.platform})`);
344
+ if (!keepOrphaned) {
345
+ log.info(`Removing orphaned Matter accessory ${cachedAccessory.displayName}`);
346
+ this.matterServer.unregisterAccessory(cachedAccessory.uuid).catch((error) => {
347
+ log.warn(`Failed to unregister orphaned Matter accessory ${cachedAccessory.displayName}:`, error);
348
+ });
349
+ }
350
+ }
351
+ else {
352
+ // Call configureMatterAccessory if the plugin implements it
353
+ if (platformPlugin.configureMatterAccessory) {
354
+ log.debug(`Calling configureMatterAccessory for ${cachedAccessory.displayName}`);
355
+ platformPlugin.configureMatterAccessory(cachedAccessory);
356
+ }
357
+ else {
358
+ log.debug(`Platform ${cachedAccessory.platform} does not implement configureMatterAccessory`);
359
+ }
360
+ }
361
+ }
362
+ }
363
+ /**
364
+ * Get Matter server status information for IPC communication
365
+ */
366
+ getMatterStatus() {
367
+ // Include Matter commissioning info if Matter is enabled
368
+ if (this.matterServer) {
369
+ const commissioningInfo = this.matterServer.getCommissioningInfo();
370
+ return {
371
+ enabled: true,
372
+ port: this.config.bridge.matter?.port,
373
+ setupUri: commissioningInfo.qrCode,
374
+ pin: commissioningInfo.manualPairingCode,
375
+ serialNumber: commissioningInfo.serialNumber,
376
+ commissioned: commissioningInfo.commissioned || false,
377
+ deviceCount: this.matterServer.getAccessories().length,
378
+ };
379
+ }
380
+ else if (this.config.bridge.matter) {
381
+ // Matter is configured but not yet started (or failed to start)
382
+ return {
383
+ enabled: false,
384
+ port: this.config.bridge.matter?.port,
385
+ };
386
+ }
387
+ return {
388
+ enabled: false,
389
+ };
390
+ }
391
+ /**
392
+ * Trigger Matter status update (called when commissioning changes)
393
+ */
394
+ onCommissioningChanged(callback) {
395
+ if (this.matterServer) {
396
+ this.matterServer.on('commissioning-changed', callback);
397
+ }
398
+ }
399
+ /**
400
+ * Teardown Matter servers
401
+ */
402
+ async teardown() {
403
+ // Stop main Matter server if running
404
+ if (this.matterServer) {
405
+ try {
406
+ await this.matterServer.stop();
407
+ }
408
+ catch (error) {
409
+ log.error('Failed to stop Matter server:', error);
410
+ }
411
+ }
412
+ // Stop all external Matter servers
413
+ for (const [uuid, matterServer] of this.externalMatterServers) {
414
+ try {
415
+ await matterServer.stop();
416
+ log.debug(`Stopped external Matter server for ${uuid}`);
417
+ }
418
+ catch (error) {
419
+ log.error(`Failed to stop external Matter server for ${uuid}:`, error);
420
+ }
421
+ }
422
+ this.externalMatterServers.clear();
423
+ // Child bridge Matter servers are stopped by their own forked processes
424
+ }
425
+ }
426
+ //# sourceMappingURL=MatterBridgeManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MatterBridgeManager.js","sourceRoot":"","sources":["../../src/matter/MatterBridgeManager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Matter Config Collector
3
+ *
4
+ * Collects and validates Matter configuration from Homebridge config.
5
+ * This class extracts Matter config validation logic from server.ts to minimize changes to core files.
6
+ */
7
+ import type { HomebridgeConfig } from '../bridgeService.js';
8
+ /**
9
+ * Validates and processes Matter configuration from Homebridge config
10
+ */
11
+ export declare class MatterConfigCollector {
12
+ /**
13
+ * Validate all Matter configuration in the config
14
+ * Validates main bridge and child bridge Matter configs, checks for port conflicts
15
+ *
16
+ * @param config - The Homebridge configuration
17
+ */
18
+ static validateMatterConfig(config: HomebridgeConfig): void;
19
+ /**
20
+ * Check for port conflicts between main bridge and child bridges
21
+ *
22
+ * @param config - The Homebridge configuration
23
+ */
24
+ private static checkPortConflicts;
25
+ }
26
+ //# sourceMappingURL=MatterConfigCollector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MatterConfigCollector.d.ts","sourceRoot":"","sources":["../../src/matter/MatterConfigCollector.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAA;AAO3D;;GAEG;AACH,qBAAa,qBAAqB;IAChC;;;;;OAKG;IACH,MAAM,CAAC,oBAAoB,CAAC,MAAM,EAAE,gBAAgB,GAAG,IAAI;IAmC3D;;;;OAIG;IACH,OAAO,CAAC,MAAM,CAAC,kBAAkB;CA+BlC"}
@@ -0,0 +1,78 @@
1
+ /**
2
+ * Matter Config Collector
3
+ *
4
+ * Collects and validates Matter configuration from Homebridge config.
5
+ * This class extracts Matter config validation logic from server.ts to minimize changes to core files.
6
+ */
7
+ import { Logger } from '../logger.js';
8
+ import { MatterConfigValidator } from './configValidator.js';
9
+ const log = Logger.internal;
10
+ /**
11
+ * Validates and processes Matter configuration from Homebridge config
12
+ */
13
+ export class MatterConfigCollector {
14
+ /**
15
+ * Validate all Matter configuration in the config
16
+ * Validates main bridge and child bridge Matter configs, checks for port conflicts
17
+ *
18
+ * @param config - The Homebridge configuration
19
+ */
20
+ static validateMatterConfig(config) {
21
+ // Check if any Matter config exists
22
+ const hasMatterConfig = config.bridge.matter
23
+ || config.platforms.some((p) => p._bridge?.matter)
24
+ || config.accessories.some((a) => a._bridge?.matter);
25
+ if (!hasMatterConfig) {
26
+ return;
27
+ }
28
+ // Validate main bridge Matter config
29
+ if (config.bridge.matter) {
30
+ const validation = MatterConfigValidator.validate(config.bridge.matter);
31
+ if (!validation.isValid) {
32
+ log.error('Main bridge Matter configuration is invalid. Matter will not be enabled for the main bridge.');
33
+ delete config.bridge.matter;
34
+ }
35
+ }
36
+ // Validate all child bridge Matter configs and check for port conflicts
37
+ const childMatterValidation = MatterConfigValidator.validateAllChildMatterConfigs(config.platforms, config.accessories);
38
+ if (!childMatterValidation.isValid) {
39
+ log.error('Some child bridge Matter configurations are invalid. Check the errors above.');
40
+ }
41
+ // Check for conflicts between main bridge Matter port and child bridge ports
42
+ if (config.bridge.matter?.port) {
43
+ this.checkPortConflicts(config);
44
+ }
45
+ }
46
+ /**
47
+ * Check for port conflicts between main bridge and child bridges
48
+ *
49
+ * @param config - The Homebridge configuration
50
+ */
51
+ static checkPortConflicts(config) {
52
+ const mainMatterPort = config.bridge.matter?.port;
53
+ if (!mainMatterPort) {
54
+ return;
55
+ }
56
+ // Collect all child bridge Matter ports
57
+ const childMatterPorts = [];
58
+ for (const platform of config.platforms) {
59
+ if (platform._bridge?.matter?.port) {
60
+ childMatterPorts.push(platform._bridge.matter.port);
61
+ }
62
+ }
63
+ for (const accessory of config.accessories) {
64
+ if (accessory._bridge?.matter?.port) {
65
+ childMatterPorts.push(accessory._bridge.matter.port);
66
+ }
67
+ }
68
+ // Check for conflicts with child bridge Matter ports
69
+ if (childMatterPorts.includes(mainMatterPort)) {
70
+ log.error(`Main bridge Matter port ${mainMatterPort} conflicts with a child bridge Matter port. Please use unique ports.`);
71
+ }
72
+ // Check for conflict with main bridge HAP port
73
+ if (config.bridge.port && Math.abs(config.bridge.port - mainMatterPort) < 10) {
74
+ log.warn(`Main bridge HAP port ${config.bridge.port} and Matter port ${mainMatterPort} are very close. Consider spacing them further apart.`);
75
+ }
76
+ }
77
+ }
78
+ //# sourceMappingURL=MatterConfigCollector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MatterConfigCollector.js","sourceRoot":"","sources":["../../src/matter/MatterConfigCollector.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AACrC,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAA;AAE5D,MAAM,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAA;AAE3B;;GAEG;AACH,MAAM,OAAO,qBAAqB;IAChC;;;;;OAKG;IACH,MAAM,CAAC,oBAAoB,CAAC,MAAwB;QAClD,oCAAoC;QACpC,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM;eACvC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,MAAM,CAAC;eACpD,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;QAE3D,IAAI,CAAC,eAAe,EAAE,CAAC;YACrB,OAAM;QACR,CAAC;QAED,qCAAqC;QACrC,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YACzB,MAAM,UAAU,GAAG,qBAAqB,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;YACvE,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;gBACxB,GAAG,CAAC,KAAK,CAAC,8FAA8F,CAAC,CAAA;gBACzG,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,CAAA;YAC7B,CAAC;QACH,CAAC;QAED,wEAAwE;QACxE,MAAM,qBAAqB,GAAG,qBAAqB,CAAC,6BAA6B,CAC/E,MAAM,CAAC,SAAkB,EACzB,MAAM,CAAC,WAAoB,CAC5B,CAAA;QAED,IAAI,CAAC,qBAAqB,CAAC,OAAO,EAAE,CAAC;YACnC,GAAG,CAAC,KAAK,CAAC,8EAA8E,CAAC,CAAA;QAC3F,CAAC;QAED,6EAA6E;QAC7E,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC;YAC/B,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAA;QACjC,CAAC;IACH,CAAC;IAED;;;;OAIG;IACK,MAAM,CAAC,kBAAkB,CAAC,MAAwB;QACxD,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAA;QACjD,IAAI,CAAC,cAAc,EAAE,CAAC;YACpB,OAAM;QACR,CAAC;QAED,wCAAwC;QACxC,MAAM,gBAAgB,GAAa,EAAE,CAAA;QAErC,KAAK,MAAM,QAAQ,IAAI,MAAM,CAAC,SAAkB,EAAE,CAAC;YACjD,IAAI,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;gBACnC,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;YACrD,CAAC;QACH,CAAC;QAED,KAAK,MAAM,SAAS,IAAI,MAAM,CAAC,WAAoB,EAAE,CAAC;YACpD,IAAI,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;gBACpC,gBAAgB,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;YACtD,CAAC;QACH,CAAC;QAED,qDAAqD;QACrD,IAAI,gBAAgB,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;YAC9C,GAAG,CAAC,KAAK,CAAC,2BAA2B,cAAc,sEAAsE,CAAC,CAAA;QAC5H,CAAC;QAED,+CAA+C;QAC/C,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,GAAG,cAAc,CAAC,GAAG,EAAE,EAAE,CAAC;YAC7E,GAAG,CAAC,IAAI,CAAC,wBAAwB,MAAM,CAAC,MAAM,CAAC,IAAI,oBAAoB,cAAc,uDAAuD,CAAC,CAAA;QAC/I,CAAC;IACH,CAAC;CACF"}
@@ -4,7 +4,7 @@
4
4
  * Handles persistence of Matter accessories across Homebridge restarts.
5
5
  * Similar to HAP's cached accessories, but designed for Matter's simpler API.
6
6
  */
7
- import type { InternalMatterAccessory } from './matterTypes.js';
7
+ import type { InternalMatterAccessory } from './types.js';
8
8
  /**
9
9
  * Serializable Matter accessory part (excludes functions and runtime state)
10
10
  */
@@ -56,6 +56,8 @@ export declare class MatterAccessoryCache {
56
56
  private cacheLoaded;
57
57
  private saveQueue;
58
58
  private directoryEnsured;
59
+ private saveDebounceTimer;
60
+ private readonly SAVE_DEBOUNCE_MS;
59
61
  constructor(storagePath: string, bridgeId: string);
60
62
  /**
61
63
  * Load cached accessories from disk
@@ -63,8 +65,15 @@ export declare class MatterAccessoryCache {
63
65
  */
64
66
  load(): Promise<Map<string, SerializedMatterAccessory>>;
65
67
  /**
66
- * Save accessories to cache (serialized to prevent concurrent write conflicts)
68
+ * Request a debounced save to cache
69
+ * Multiple rapid calls within the debounce window will only result in one disk write
70
+ * Use this for normal operations to reduce disk I/O
71
+ */
72
+ requestSave(accessories: Map<string, InternalMatterAccessory>): void;
73
+ /**
74
+ * Save accessories to cache immediately (serialized to prevent concurrent write conflicts)
67
75
  * Uses a queue pattern to ensure saves are truly serialized even when called concurrently
76
+ * Use this for shutdown/critical operations that need immediate persistence
68
77
  */
69
78
  save(accessories: Map<string, InternalMatterAccessory>): Promise<void>;
70
79
  /**
@@ -93,4 +102,4 @@ export declare class MatterAccessoryCache {
93
102
  */
94
103
  private serializeAccessory;
95
104
  }
96
- //# sourceMappingURL=matterAccessoryCache.d.ts.map
105
+ //# sourceMappingURL=accessoryCache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"accessoryCache.d.ts","sourceRoot":"","sources":["../../src/matter/accessoryCache.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAA;AAUzD;;GAEG;AACH,MAAM,WAAW,6BAA6B;IAC5C,EAAE,EAAE,MAAM,CAAA;IACV,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,UAAU,EAAE;QACV,IAAI,CAAC,EAAE,MAAM,CAAA;QACb,IAAI,CAAC,EAAE,MAAM,CAAA;KACd,CAAA;IACD,QAAQ,EAAE;QACR,CAAC,WAAW,EAAE,MAAM,GAAG;YACrB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAA;SACjC,CAAA;KACF,CAAA;CACF;AAED;;GAEG;AACH,MAAM,WAAW,yBAAyB;IACxC,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,CAAA;IACnB,UAAU,EAAE;QACV,IAAI,CAAC,EAAE,MAAM,CAAA;QACb,IAAI,CAAC,EAAE,MAAM,CAAA;KACd,CAAA;IACD,YAAY,EAAE,MAAM,CAAA;IACpB,YAAY,EAAE,MAAM,CAAA;IACpB,KAAK,EAAE,MAAM,CAAA;IACb,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACjC,QAAQ,CAAC,EAAE;QACT,CAAC,WAAW,EAAE,MAAM,GAAG;YACrB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAA;SACjC,CAAA;KACF,CAAA;IACD,KAAK,CAAC,EAAE,6BAA6B,EAAE,CAAA;CACxC;AAED;;GAEG;AACH,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAQ;IACtC,OAAO,CAAC,iBAAiB,CAAoD;IAC7E,OAAO,CAAC,WAAW,CAAQ;IAC3B,OAAO,CAAC,SAAS,CAAmC;IACpD,OAAO,CAAC,gBAAgB,CAAQ;IAChC,OAAO,CAAC,iBAAiB,CAA8B;IACvD,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAO;gBAE5B,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM;IAIjD;;;OAGG;IACG,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,yBAAyB,CAAC,CAAC;IAoD7D;;;;OAIG;IACH,WAAW,CAAC,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,uBAAuB,CAAC,GAAG,IAAI;IAcpE;;;;OAIG;IACG,IAAI,CAAC,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,uBAAuB,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAe5E;;;OAGG;YACW,WAAW;IA+CzB;;OAEG;IACH,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,yBAAyB,GAAG,SAAS;IAI9D;;OAEG;IACH,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAIhC;;OAEG;IACH,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAIhC;;OAEG;IACH,YAAY,IAAI,GAAG,CAAC,MAAM,EAAE,yBAAyB,CAAC;IAItD;;OAEG;IACH,OAAO,CAAC,kBAAkB;CA0C3B"}