homebridge 2.0.0-beta.34 → 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 (284) 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/externalPortService.d.ts +2 -9
  14. package/dist/externalPortService.d.ts.map +1 -1
  15. package/dist/externalPortService.js +20 -40
  16. package/dist/externalPortService.js.map +1 -1
  17. package/dist/index.d.ts +10 -10
  18. package/dist/index.d.ts.map +1 -1
  19. package/dist/index.js +3 -3
  20. package/dist/index.js.map +1 -1
  21. package/dist/logger.spec.d.ts +2 -0
  22. package/dist/logger.spec.d.ts.map +1 -0
  23. package/dist/logger.spec.js +95 -0
  24. package/dist/logger.spec.js.map +1 -0
  25. package/dist/matter/ChildBridgeMatterManager.d.ts +96 -0
  26. package/dist/matter/ChildBridgeMatterManager.d.ts.map +1 -0
  27. package/dist/matter/ChildBridgeMatterManager.js +397 -0
  28. package/dist/matter/ChildBridgeMatterManager.js.map +1 -0
  29. package/dist/matter/ExternalMatterAccessoryPublisher.d.ts +48 -0
  30. package/dist/matter/ExternalMatterAccessoryPublisher.d.ts.map +1 -0
  31. package/dist/matter/ExternalMatterAccessoryPublisher.js +73 -0
  32. package/dist/matter/ExternalMatterAccessoryPublisher.js.map +1 -0
  33. package/dist/matter/ExternalMatterAccessoryPublisher.spec.d.ts +2 -0
  34. package/dist/matter/ExternalMatterAccessoryPublisher.spec.d.ts.map +1 -0
  35. package/dist/matter/ExternalMatterAccessoryPublisher.spec.js +293 -0
  36. package/dist/matter/ExternalMatterAccessoryPublisher.spec.js.map +1 -0
  37. package/dist/matter/{matterServer.d.ts → MatterAPIImpl.d.ts} +203 -367
  38. package/dist/matter/MatterAPIImpl.d.ts.map +1 -0
  39. package/dist/matter/MatterAPIImpl.js +305 -0
  40. package/dist/matter/MatterAPIImpl.js.map +1 -0
  41. package/dist/matter/MatterBridgeManager.d.ts +91 -0
  42. package/dist/matter/MatterBridgeManager.d.ts.map +1 -0
  43. package/dist/matter/MatterBridgeManager.js +426 -0
  44. package/dist/matter/MatterBridgeManager.js.map +1 -0
  45. package/dist/matter/MatterConfigCollector.d.ts +26 -0
  46. package/dist/matter/MatterConfigCollector.d.ts.map +1 -0
  47. package/dist/matter/MatterConfigCollector.js +78 -0
  48. package/dist/matter/MatterConfigCollector.js.map +1 -0
  49. package/dist/matter/{matterAccessoryCache.d.ts → accessoryCache.d.ts} +12 -3
  50. package/dist/matter/accessoryCache.d.ts.map +1 -0
  51. package/dist/matter/{matterAccessoryCache.js → accessoryCache.js} +32 -10
  52. package/dist/matter/accessoryCache.js.map +1 -0
  53. package/dist/matter/accessoryCache.spec.d.ts +2 -0
  54. package/dist/matter/accessoryCache.spec.d.ts.map +1 -0
  55. package/dist/matter/accessoryCache.spec.js +452 -0
  56. package/dist/matter/accessoryCache.spec.js.map +1 -0
  57. package/dist/matter/behaviors/BehaviorRegistry.d.ts +65 -0
  58. package/dist/matter/behaviors/BehaviorRegistry.d.ts.map +1 -0
  59. package/dist/matter/behaviors/BehaviorRegistry.js +139 -0
  60. package/dist/matter/behaviors/BehaviorRegistry.js.map +1 -0
  61. package/dist/matter/behaviors/BehaviorRegistry.spec.d.ts +2 -0
  62. package/dist/matter/behaviors/BehaviorRegistry.spec.d.ts.map +1 -0
  63. package/dist/matter/behaviors/BehaviorRegistry.spec.js +307 -0
  64. package/dist/matter/behaviors/BehaviorRegistry.spec.js.map +1 -0
  65. package/dist/matter/behaviors/ColorControlBehavior.d.ts +64 -0
  66. package/dist/matter/behaviors/ColorControlBehavior.d.ts.map +1 -0
  67. package/dist/matter/behaviors/ColorControlBehavior.js +160 -0
  68. package/dist/matter/behaviors/ColorControlBehavior.js.map +1 -0
  69. package/dist/matter/behaviors/ColorControlBehavior.spec.d.ts +2 -0
  70. package/dist/matter/behaviors/ColorControlBehavior.spec.d.ts.map +1 -0
  71. package/dist/matter/behaviors/ColorControlBehavior.spec.js +29 -0
  72. package/dist/matter/behaviors/ColorControlBehavior.spec.js.map +1 -0
  73. package/dist/matter/behaviors/DoorLockBehavior.d.ts +21 -0
  74. package/dist/matter/behaviors/DoorLockBehavior.d.ts.map +1 -0
  75. package/dist/matter/behaviors/DoorLockBehavior.js +49 -0
  76. package/dist/matter/behaviors/DoorLockBehavior.js.map +1 -0
  77. package/dist/matter/behaviors/DoorLockBehavior.spec.d.ts +2 -0
  78. package/dist/matter/behaviors/DoorLockBehavior.spec.d.ts.map +1 -0
  79. package/dist/matter/behaviors/DoorLockBehavior.spec.js +108 -0
  80. package/dist/matter/behaviors/DoorLockBehavior.spec.js.map +1 -0
  81. package/dist/matter/behaviors/FanControlBehavior.d.ts +20 -0
  82. package/dist/matter/behaviors/FanControlBehavior.d.ts.map +1 -0
  83. package/dist/matter/behaviors/FanControlBehavior.js +45 -0
  84. package/dist/matter/behaviors/FanControlBehavior.js.map +1 -0
  85. package/dist/matter/behaviors/FanControlBehavior.spec.d.ts +2 -0
  86. package/dist/matter/behaviors/FanControlBehavior.spec.d.ts.map +1 -0
  87. package/dist/matter/behaviors/FanControlBehavior.spec.js +23 -0
  88. package/dist/matter/behaviors/FanControlBehavior.spec.js.map +1 -0
  89. package/dist/matter/behaviors/IdentifyBehavior.d.ts +21 -0
  90. package/dist/matter/behaviors/IdentifyBehavior.d.ts.map +1 -0
  91. package/dist/matter/behaviors/IdentifyBehavior.js +27 -0
  92. package/dist/matter/behaviors/IdentifyBehavior.js.map +1 -0
  93. package/dist/matter/behaviors/IdentifyBehavior.spec.d.ts +2 -0
  94. package/dist/matter/behaviors/IdentifyBehavior.spec.d.ts.map +1 -0
  95. package/dist/matter/behaviors/IdentifyBehavior.spec.js +64 -0
  96. package/dist/matter/behaviors/IdentifyBehavior.spec.js.map +1 -0
  97. package/dist/matter/behaviors/LevelControlBehavior.d.ts +34 -0
  98. package/dist/matter/behaviors/LevelControlBehavior.d.ts.map +1 -0
  99. package/dist/matter/behaviors/LevelControlBehavior.js +75 -0
  100. package/dist/matter/behaviors/LevelControlBehavior.js.map +1 -0
  101. package/dist/matter/behaviors/LevelControlBehavior.spec.d.ts +2 -0
  102. package/dist/matter/behaviors/LevelControlBehavior.spec.d.ts.map +1 -0
  103. package/dist/matter/behaviors/LevelControlBehavior.spec.js +140 -0
  104. package/dist/matter/behaviors/LevelControlBehavior.spec.js.map +1 -0
  105. package/dist/matter/behaviors/OnOffBehavior.d.ts +28 -0
  106. package/dist/matter/behaviors/OnOffBehavior.d.ts.map +1 -0
  107. package/dist/matter/behaviors/OnOffBehavior.js +63 -0
  108. package/dist/matter/behaviors/OnOffBehavior.js.map +1 -0
  109. package/dist/matter/behaviors/OnOffBehavior.spec.d.ts +2 -0
  110. package/dist/matter/behaviors/OnOffBehavior.spec.d.ts.map +1 -0
  111. package/dist/matter/behaviors/OnOffBehavior.spec.js +116 -0
  112. package/dist/matter/behaviors/OnOffBehavior.spec.js.map +1 -0
  113. package/dist/matter/behaviors/RvcCleanModeBehavior.d.ts +19 -0
  114. package/dist/matter/behaviors/RvcCleanModeBehavior.d.ts.map +1 -0
  115. package/dist/matter/behaviors/RvcCleanModeBehavior.js +27 -0
  116. package/dist/matter/behaviors/RvcCleanModeBehavior.js.map +1 -0
  117. package/dist/matter/behaviors/RvcCleanModeBehavior.spec.d.ts +2 -0
  118. package/dist/matter/behaviors/RvcCleanModeBehavior.spec.d.ts.map +1 -0
  119. package/dist/matter/behaviors/RvcCleanModeBehavior.spec.js +56 -0
  120. package/dist/matter/behaviors/RvcCleanModeBehavior.spec.js.map +1 -0
  121. package/dist/matter/behaviors/RvcOperationalStateBehavior.d.ts +23 -0
  122. package/dist/matter/behaviors/RvcOperationalStateBehavior.d.ts.map +1 -0
  123. package/dist/matter/behaviors/RvcOperationalStateBehavior.js +49 -0
  124. package/dist/matter/behaviors/RvcOperationalStateBehavior.js.map +1 -0
  125. package/dist/matter/behaviors/RvcOperationalStateBehavior.spec.d.ts +2 -0
  126. package/dist/matter/behaviors/RvcOperationalStateBehavior.spec.d.ts.map +1 -0
  127. package/dist/matter/behaviors/RvcOperationalStateBehavior.spec.js +55 -0
  128. package/dist/matter/behaviors/RvcOperationalStateBehavior.spec.js.map +1 -0
  129. package/dist/matter/behaviors/RvcRunModeBehavior.d.ts +19 -0
  130. package/dist/matter/behaviors/RvcRunModeBehavior.d.ts.map +1 -0
  131. package/dist/matter/behaviors/RvcRunModeBehavior.js +27 -0
  132. package/dist/matter/behaviors/RvcRunModeBehavior.js.map +1 -0
  133. package/dist/matter/behaviors/RvcRunModeBehavior.spec.d.ts +2 -0
  134. package/dist/matter/behaviors/RvcRunModeBehavior.spec.d.ts.map +1 -0
  135. package/dist/matter/behaviors/RvcRunModeBehavior.spec.js +56 -0
  136. package/dist/matter/behaviors/RvcRunModeBehavior.spec.js.map +1 -0
  137. package/dist/matter/behaviors/ServiceAreaBehavior.d.ts +22 -0
  138. package/dist/matter/behaviors/ServiceAreaBehavior.d.ts.map +1 -0
  139. package/dist/matter/behaviors/ServiceAreaBehavior.js +35 -0
  140. package/dist/matter/behaviors/ServiceAreaBehavior.js.map +1 -0
  141. package/dist/matter/behaviors/ServiceAreaBehavior.spec.d.ts +2 -0
  142. package/dist/matter/behaviors/ServiceAreaBehavior.spec.d.ts.map +1 -0
  143. package/dist/matter/behaviors/ServiceAreaBehavior.spec.js +52 -0
  144. package/dist/matter/behaviors/ServiceAreaBehavior.spec.js.map +1 -0
  145. package/dist/matter/behaviors/ThermostatBehavior.d.ts +23 -0
  146. package/dist/matter/behaviors/ThermostatBehavior.d.ts.map +1 -0
  147. package/dist/matter/behaviors/ThermostatBehavior.js +79 -0
  148. package/dist/matter/behaviors/ThermostatBehavior.js.map +1 -0
  149. package/dist/matter/behaviors/ThermostatBehavior.spec.d.ts +2 -0
  150. package/dist/matter/behaviors/ThermostatBehavior.spec.d.ts.map +1 -0
  151. package/dist/matter/behaviors/ThermostatBehavior.spec.js +23 -0
  152. package/dist/matter/behaviors/ThermostatBehavior.spec.js.map +1 -0
  153. package/dist/matter/behaviors/WindowCoveringBehavior.d.ts +32 -0
  154. package/dist/matter/behaviors/WindowCoveringBehavior.d.ts.map +1 -0
  155. package/dist/matter/behaviors/WindowCoveringBehavior.js +106 -0
  156. package/dist/matter/behaviors/WindowCoveringBehavior.js.map +1 -0
  157. package/dist/matter/behaviors/WindowCoveringBehavior.spec.d.ts +2 -0
  158. package/dist/matter/behaviors/WindowCoveringBehavior.spec.d.ts.map +1 -0
  159. package/dist/matter/behaviors/WindowCoveringBehavior.spec.js +27 -0
  160. package/dist/matter/behaviors/WindowCoveringBehavior.spec.js.map +1 -0
  161. package/dist/matter/behaviors/index.d.ts +20 -0
  162. package/dist/matter/behaviors/index.d.ts.map +1 -0
  163. package/dist/matter/behaviors/index.js +21 -0
  164. package/dist/matter/behaviors/index.js.map +1 -0
  165. package/dist/matter/{matterConfigValidator.d.ts → configValidator.d.ts} +1 -1
  166. package/dist/matter/configValidator.d.ts.map +1 -0
  167. package/dist/matter/{matterConfigValidator.js → configValidator.js} +1 -1
  168. package/dist/matter/configValidator.js.map +1 -0
  169. package/dist/matter/configValidator.spec.d.ts +2 -0
  170. package/dist/matter/configValidator.spec.d.ts.map +1 -0
  171. package/dist/matter/configValidator.spec.js +390 -0
  172. package/dist/matter/configValidator.spec.js.map +1 -0
  173. package/dist/matter/errorHandler.d.ts +33 -0
  174. package/dist/matter/errorHandler.d.ts.map +1 -0
  175. package/dist/matter/errorHandler.js +113 -0
  176. package/dist/matter/errorHandler.js.map +1 -0
  177. package/dist/matter/errorHandler.spec.d.ts +2 -0
  178. package/dist/matter/errorHandler.spec.d.ts.map +1 -0
  179. package/dist/matter/errorHandler.spec.js +159 -0
  180. package/dist/matter/errorHandler.spec.js.map +1 -0
  181. package/dist/matter/index.d.ts +7 -4
  182. package/dist/matter/index.d.ts.map +1 -1
  183. package/dist/matter/index.js +7 -4
  184. package/dist/matter/index.js.map +1 -1
  185. package/dist/matter/{matterLogFormatter.d.ts → logFormatter.d.ts} +1 -1
  186. package/dist/matter/logFormatter.d.ts.map +1 -0
  187. package/dist/matter/{matterLogFormatter.js → logFormatter.js} +33 -6
  188. package/dist/matter/logFormatter.js.map +1 -0
  189. package/dist/matter/logFormatter.spec.d.ts +2 -0
  190. package/dist/matter/logFormatter.spec.d.ts.map +1 -0
  191. package/dist/matter/logFormatter.spec.js +284 -0
  192. package/dist/matter/logFormatter.spec.js.map +1 -0
  193. package/dist/matter/server.d.ts +350 -0
  194. package/dist/matter/server.d.ts.map +1 -0
  195. package/dist/matter/{matterServer.js → server.js} +533 -352
  196. package/dist/matter/server.js.map +1 -0
  197. package/dist/matter/{matterServerHelpers.d.ts → serverHelpers.d.ts} +2 -2
  198. package/dist/matter/serverHelpers.d.ts.map +1 -0
  199. package/dist/matter/{matterServerHelpers.js → serverHelpers.js} +11 -8
  200. package/dist/matter/serverHelpers.js.map +1 -0
  201. package/dist/matter/serverHelpers.spec.d.ts +2 -0
  202. package/dist/matter/serverHelpers.spec.d.ts.map +1 -0
  203. package/dist/matter/serverHelpers.spec.js +521 -0
  204. package/dist/matter/serverHelpers.spec.js.map +1 -0
  205. package/dist/matter/{matterSharedTypes.d.ts → sharedTypes.d.ts} +4 -10
  206. package/dist/matter/sharedTypes.d.ts.map +1 -0
  207. package/dist/matter/{matterSharedTypes.js → sharedTypes.js} +4 -10
  208. package/dist/matter/sharedTypes.js.map +1 -0
  209. package/dist/matter/{matterStorage.d.ts → storage.d.ts} +9 -2
  210. package/dist/matter/storage.d.ts.map +1 -0
  211. package/dist/matter/{matterStorage.js → storage.js} +14 -5
  212. package/dist/matter/{matterStorage.js.map → storage.js.map} +1 -1
  213. package/dist/matter/storage.spec.d.ts +2 -0
  214. package/dist/matter/storage.spec.d.ts.map +1 -0
  215. package/dist/matter/storage.spec.js +570 -0
  216. package/dist/matter/storage.spec.js.map +1 -0
  217. package/dist/matter/typeHelpers.d.ts +45 -0
  218. package/dist/matter/typeHelpers.d.ts.map +1 -0
  219. package/dist/matter/typeHelpers.js +57 -0
  220. package/dist/matter/typeHelpers.js.map +1 -0
  221. package/dist/matter/typeHelpers.spec.d.ts +2 -0
  222. package/dist/matter/typeHelpers.spec.d.ts.map +1 -0
  223. package/dist/matter/typeHelpers.spec.js +127 -0
  224. package/dist/matter/typeHelpers.spec.js.map +1 -0
  225. package/dist/matter/{matterTypes.d.ts → types.d.ts} +2 -2
  226. package/dist/matter/types.d.ts.map +1 -0
  227. package/dist/matter/{matterTypes.js → types.js} +1 -2
  228. package/dist/matter/types.js.map +1 -0
  229. package/dist/platformAccessory.spec.d.ts +2 -0
  230. package/dist/platformAccessory.spec.d.ts.map +1 -0
  231. package/dist/platformAccessory.spec.js +126 -0
  232. package/dist/platformAccessory.spec.js.map +1 -0
  233. package/dist/pluginManager.spec.d.ts +2 -0
  234. package/dist/pluginManager.spec.d.ts.map +1 -0
  235. package/dist/pluginManager.spec.js +43 -0
  236. package/dist/pluginManager.spec.js.map +1 -0
  237. package/dist/server.d.ts +4 -13
  238. package/dist/server.d.ts.map +1 -1
  239. package/dist/server.js +45 -333
  240. package/dist/server.js.map +1 -1
  241. package/dist/server.spec.d.ts +2 -0
  242. package/dist/server.spec.d.ts.map +1 -0
  243. package/dist/server.spec.js +57 -0
  244. package/dist/server.spec.js.map +1 -0
  245. package/dist/user.spec.d.ts +2 -0
  246. package/dist/user.spec.d.ts.map +1 -0
  247. package/dist/user.spec.js +31 -0
  248. package/dist/user.spec.js.map +1 -0
  249. package/dist/util/mac.spec.d.ts +2 -0
  250. package/dist/util/mac.spec.d.ts.map +1 -0
  251. package/dist/util/mac.spec.js +36 -0
  252. package/dist/util/mac.spec.js.map +1 -0
  253. package/dist/version.spec.d.ts +2 -0
  254. package/dist/version.spec.d.ts.map +1 -0
  255. package/dist/version.spec.js +20 -0
  256. package/dist/version.spec.js.map +1 -0
  257. package/package.json +4 -4
  258. package/dist/matter/matterAccessoryCache.d.ts.map +0 -1
  259. package/dist/matter/matterAccessoryCache.js.map +0 -1
  260. package/dist/matter/matterBehaviors.d.ts +0 -194
  261. package/dist/matter/matterBehaviors.d.ts.map +0 -1
  262. package/dist/matter/matterBehaviors.js +0 -665
  263. package/dist/matter/matterBehaviors.js.map +0 -1
  264. package/dist/matter/matterConfigValidator.d.ts.map +0 -1
  265. package/dist/matter/matterConfigValidator.js.map +0 -1
  266. package/dist/matter/matterErrorHandler.d.ts +0 -106
  267. package/dist/matter/matterErrorHandler.d.ts.map +0 -1
  268. package/dist/matter/matterErrorHandler.js +0 -495
  269. package/dist/matter/matterErrorHandler.js.map +0 -1
  270. package/dist/matter/matterLogFormatter.d.ts.map +0 -1
  271. package/dist/matter/matterLogFormatter.js.map +0 -1
  272. package/dist/matter/matterNetworkMonitor.d.ts +0 -68
  273. package/dist/matter/matterNetworkMonitor.d.ts.map +0 -1
  274. package/dist/matter/matterNetworkMonitor.js +0 -249
  275. package/dist/matter/matterNetworkMonitor.js.map +0 -1
  276. package/dist/matter/matterServer.d.ts.map +0 -1
  277. package/dist/matter/matterServer.js.map +0 -1
  278. package/dist/matter/matterServerHelpers.d.ts.map +0 -1
  279. package/dist/matter/matterServerHelpers.js.map +0 -1
  280. package/dist/matter/matterSharedTypes.d.ts.map +0 -1
  281. package/dist/matter/matterSharedTypes.js.map +0 -1
  282. package/dist/matter/matterStorage.d.ts.map +0 -1
  283. package/dist/matter/matterTypes.d.ts.map +0 -1
  284. package/dist/matter/matterTypes.js.map +0 -1
@@ -0,0 +1,64 @@
1
+ import { beforeEach, describe, expect, it, vi } from 'vitest';
2
+ import { HomebridgeIdentifyServer } from './IdentifyBehavior.js';
3
+ describe('homebridgeIdentifyServer', () => {
4
+ let mockRegistry;
5
+ let behavior;
6
+ let mockEndpoint;
7
+ beforeEach(() => {
8
+ // Create mock registry
9
+ mockRegistry = {
10
+ executeHandler: vi.fn().mockResolvedValue(true),
11
+ };
12
+ // Set registry on behavior class
13
+ HomebridgeIdentifyServer.setRegistry(mockRegistry);
14
+ // Create mock endpoint
15
+ mockEndpoint = {
16
+ id: 'test-endpoint-123',
17
+ };
18
+ // Create behavior instance with mocked properties
19
+ behavior = Object.create(HomebridgeIdentifyServer.prototype);
20
+ Object.defineProperty(behavior, 'endpoint', {
21
+ get: () => mockEndpoint,
22
+ configurable: true,
23
+ });
24
+ // Mock super method to prevent actual execution
25
+ vi.spyOn(Object.getPrototypeOf(HomebridgeIdentifyServer.prototype), 'identify').mockReturnValue(undefined);
26
+ });
27
+ describe('setRegistry', () => {
28
+ it('should set the registry', () => {
29
+ const newRegistry = {};
30
+ HomebridgeIdentifyServer.setRegistry(newRegistry);
31
+ expect(true).toBe(true);
32
+ });
33
+ });
34
+ describe('identify', () => {
35
+ it('should execute handler with identify request', async () => {
36
+ const request = { identifyTime: 10 };
37
+ await behavior.identify(request);
38
+ expect(mockRegistry.executeHandler).toHaveBeenCalledWith('test-endpoint-123', 'identify', 'identify', request);
39
+ });
40
+ it('should handle identify time of 0 (stop identifying)', async () => {
41
+ const request = { identifyTime: 0 };
42
+ await behavior.identify(request);
43
+ expect(mockRegistry.executeHandler).toHaveBeenCalledWith('test-endpoint-123', 'identify', 'identify', request);
44
+ });
45
+ it('should handle long identify times', async () => {
46
+ const request = { identifyTime: 65535 }; // Max uint16
47
+ await behavior.identify(request);
48
+ expect(mockRegistry.executeHandler).toHaveBeenCalledWith('test-endpoint-123', 'identify', 'identify', request);
49
+ });
50
+ it('should handle handler execution errors gracefully', () => {
51
+ mockRegistry.executeHandler = vi.fn().mockRejectedValue(new Error('Handler failed'));
52
+ const request = { identifyTime: 5 };
53
+ // Should not throw
54
+ expect(() => behavior.identify(request)).not.toThrow();
55
+ });
56
+ it('should call identify even if handler is not registered', () => {
57
+ mockRegistry.executeHandler = vi.fn().mockResolvedValue(false);
58
+ const request = { identifyTime: 5 };
59
+ // Should not throw
60
+ expect(() => behavior.identify(request)).not.toThrow();
61
+ });
62
+ });
63
+ });
64
+ //# sourceMappingURL=IdentifyBehavior.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IdentifyBehavior.spec.js","sourceRoot":"","sources":["../../../src/matter/behaviors/IdentifyBehavior.spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * LevelControl Cluster Behavior
3
+ *
4
+ * Handles brightness/level control for dimmable lights
5
+ */
6
+ import type { MaybePromise } from '@matter/main';
7
+ import type { LevelControl } from '@matter/main/clusters/level-control';
8
+ import type { BehaviorRegistry } from './BehaviorRegistry.js';
9
+ import { LevelControlServer } from '@matter/main/behaviors/level-control';
10
+ export declare class HomebridgeLevelControlServer extends LevelControlServer {
11
+ private static registry;
12
+ static setRegistry(registry: BehaviorRegistry): void;
13
+ /**
14
+ * Handle moveToLevel command
15
+ */
16
+ moveToLevel(request: LevelControl.MoveToLevelRequest): MaybePromise<void>;
17
+ /**
18
+ * Handle move command
19
+ */
20
+ move(request: LevelControl.MoveRequest): MaybePromise<void>;
21
+ /**
22
+ * Handle step command
23
+ */
24
+ step(request: LevelControl.StepRequest): MaybePromise<void>;
25
+ /**
26
+ * Handle stop command
27
+ */
28
+ stop(request: LevelControl.StopRequest): MaybePromise<void>;
29
+ /**
30
+ * Handle moveToLevelWithOnOff command
31
+ */
32
+ moveToLevelWithOnOff(request: LevelControl.MoveToLevelRequest): MaybePromise<void>;
33
+ }
34
+ //# sourceMappingURL=LevelControlBehavior.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LevelControlBehavior.d.ts","sourceRoot":"","sources":["../../../src/matter/behaviors/LevelControlBehavior.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAChD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qCAAqC,CAAA;AAEvE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AAE7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,sCAAsC,CAAA;AAEzE,qBAAa,4BAA6B,SAAQ,kBAAkB;IAClE,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAkB;IAEzC,MAAM,CAAC,WAAW,CAAC,QAAQ,EAAE,gBAAgB,GAAG,IAAI;IAIpD;;OAEG;IACM,WAAW,CAAC,OAAO,EAAE,YAAY,CAAC,kBAAkB,GAAG,YAAY,CAAC,IAAI,CAAC;IAwBlF;;OAEG;IACM,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,WAAW,GAAG,YAAY,CAAC,IAAI,CAAC;IAepE;;OAEG;IACM,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,WAAW,GAAG,YAAY,CAAC,IAAI,CAAC;IAepE;;OAEG;IACM,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,WAAW,GAAG,YAAY,CAAC,IAAI,CAAC;IAepE;;OAEG;IACM,oBAAoB,CAAC,OAAO,EAAE,YAAY,CAAC,kBAAkB,GAAG,YAAY,CAAC,IAAI,CAAC;CAqB5F"}
@@ -0,0 +1,75 @@
1
+ /**
2
+ * LevelControl Cluster Behavior
3
+ *
4
+ * Handles brightness/level control for dimmable lights
5
+ */
6
+ import { LevelControlServer } from '@matter/main/behaviors/level-control';
7
+ export class HomebridgeLevelControlServer extends LevelControlServer {
8
+ static registry;
9
+ static setRegistry(registry) {
10
+ this.registry = registry;
11
+ }
12
+ /**
13
+ * Handle moveToLevel command
14
+ */
15
+ moveToLevel(request) {
16
+ const endpointId = this.endpoint.id;
17
+ // Execute user handler (errors are logged by registry)
18
+ HomebridgeLevelControlServer.registry.executeHandler(endpointId, 'levelControl', 'moveToLevel', request).catch(() => {
19
+ // Error already logged by registry
20
+ });
21
+ // Call base implementation
22
+ const result = super.moveToLevel(request);
23
+ // Sync state to cache
24
+ HomebridgeLevelControlServer.registry.syncStateToCache(endpointId, 'levelControl', {
25
+ currentLevel: request.level,
26
+ });
27
+ return result;
28
+ }
29
+ /**
30
+ * Handle move command
31
+ */
32
+ move(request) {
33
+ const endpointId = this.endpoint.id;
34
+ HomebridgeLevelControlServer.registry.executeHandler(endpointId, 'levelControl', 'move', request).catch(() => {
35
+ // Error already logged by registry
36
+ });
37
+ return super.move(request);
38
+ }
39
+ /**
40
+ * Handle step command
41
+ */
42
+ step(request) {
43
+ const endpointId = this.endpoint.id;
44
+ HomebridgeLevelControlServer.registry.executeHandler(endpointId, 'levelControl', 'step', request).catch(() => {
45
+ // Error already logged by registry
46
+ });
47
+ return super.step(request);
48
+ }
49
+ /**
50
+ * Handle stop command
51
+ */
52
+ stop(request) {
53
+ const endpointId = this.endpoint.id;
54
+ HomebridgeLevelControlServer.registry.executeHandler(endpointId, 'levelControl', 'stop', request).catch(() => {
55
+ // Error already logged by registry
56
+ });
57
+ return super.stop(request);
58
+ }
59
+ /**
60
+ * Handle moveToLevelWithOnOff command
61
+ */
62
+ moveToLevelWithOnOff(request) {
63
+ const endpointId = this.endpoint.id;
64
+ HomebridgeLevelControlServer.registry.executeHandler(endpointId, 'levelControl', 'moveToLevelWithOnOff', request).catch(() => {
65
+ // Error already logged by registry
66
+ });
67
+ const result = super.moveToLevelWithOnOff(request);
68
+ // Sync state to cache
69
+ HomebridgeLevelControlServer.registry.syncStateToCache(endpointId, 'levelControl', {
70
+ currentLevel: request.level,
71
+ });
72
+ return result;
73
+ }
74
+ }
75
+ //# sourceMappingURL=LevelControlBehavior.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LevelControlBehavior.js","sourceRoot":"","sources":["../../../src/matter/behaviors/LevelControlBehavior.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAOH,OAAO,EAAE,kBAAkB,EAAE,MAAM,sCAAsC,CAAA;AAEzE,MAAM,OAAO,4BAA6B,SAAQ,kBAAkB;IAC1D,MAAM,CAAC,QAAQ,CAAkB;IAEzC,MAAM,CAAC,WAAW,CAAC,QAA0B;QAC3C,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAA;IAC1B,CAAC;IAED;;OAEG;IACM,WAAW,CAAC,OAAwC;QAC3D,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAA;QAEnC,uDAAuD;QACvD,4BAA4B,CAAC,QAAQ,CAAC,cAAc,CAClD,UAAU,EACV,cAAc,EACd,aAAa,EACb,OAAO,CACR,CAAC,KAAK,CAAC,GAAG,EAAE;YACX,mCAAmC;QACrC,CAAC,CAAC,CAAA;QAEF,2BAA2B;QAC3B,MAAM,MAAM,GAAG,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC,CAAA;QAEzC,sBAAsB;QACtB,4BAA4B,CAAC,QAAQ,CAAC,gBAAgB,CAAC,UAAU,EAAE,cAAc,EAAE;YACjF,YAAY,EAAE,OAAO,CAAC,KAAK;SAC5B,CAAC,CAAA;QAEF,OAAO,MAAM,CAAA;IACf,CAAC;IAED;;OAEG;IACM,IAAI,CAAC,OAAiC;QAC7C,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAA;QAEnC,4BAA4B,CAAC,QAAQ,CAAC,cAAc,CAClD,UAAU,EACV,cAAc,EACd,MAAM,EACN,OAAO,CACR,CAAC,KAAK,CAAC,GAAG,EAAE;YACX,mCAAmC;QACrC,CAAC,CAAC,CAAA;QAEF,OAAO,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IAC5B,CAAC;IAED;;OAEG;IACM,IAAI,CAAC,OAAiC;QAC7C,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAA;QAEnC,4BAA4B,CAAC,QAAQ,CAAC,cAAc,CAClD,UAAU,EACV,cAAc,EACd,MAAM,EACN,OAAO,CACR,CAAC,KAAK,CAAC,GAAG,EAAE;YACX,mCAAmC;QACrC,CAAC,CAAC,CAAA;QAEF,OAAO,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IAC5B,CAAC;IAED;;OAEG;IACM,IAAI,CAAC,OAAiC;QAC7C,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAA;QAEnC,4BAA4B,CAAC,QAAQ,CAAC,cAAc,CAClD,UAAU,EACV,cAAc,EACd,MAAM,EACN,OAAO,CACR,CAAC,KAAK,CAAC,GAAG,EAAE;YACX,mCAAmC;QACrC,CAAC,CAAC,CAAA;QAEF,OAAO,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IAC5B,CAAC;IAED;;OAEG;IACM,oBAAoB,CAAC,OAAwC;QACpE,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAA;QAEnC,4BAA4B,CAAC,QAAQ,CAAC,cAAc,CAClD,UAAU,EACV,cAAc,EACd,sBAAsB,EACtB,OAAO,CACR,CAAC,KAAK,CAAC,GAAG,EAAE;YACX,mCAAmC;QACrC,CAAC,CAAC,CAAA;QAEF,MAAM,MAAM,GAAG,KAAK,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAA;QAElD,sBAAsB;QACtB,4BAA4B,CAAC,QAAQ,CAAC,gBAAgB,CAAC,UAAU,EAAE,cAAc,EAAE;YACjF,YAAY,EAAE,OAAO,CAAC,KAAK;SAC5B,CAAC,CAAA;QAEF,OAAO,MAAM,CAAA;IACf,CAAC;CACF"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=LevelControlBehavior.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LevelControlBehavior.spec.d.ts","sourceRoot":"","sources":["../../../src/matter/behaviors/LevelControlBehavior.spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,140 @@
1
+ import { beforeEach, describe, expect, it, vi } from 'vitest';
2
+ import { HomebridgeLevelControlServer } from './LevelControlBehavior.js';
3
+ describe('homebridgeLevelControlServer', () => {
4
+ let mockRegistry;
5
+ let behavior;
6
+ let mockEndpoint;
7
+ beforeEach(() => {
8
+ // Create mock registry
9
+ mockRegistry = {
10
+ executeHandler: vi.fn().mockResolvedValue(true),
11
+ syncStateToCache: vi.fn(),
12
+ };
13
+ // Set registry on behavior class
14
+ HomebridgeLevelControlServer.setRegistry(mockRegistry);
15
+ // Create mock endpoint
16
+ mockEndpoint = {
17
+ id: 'test-endpoint-123',
18
+ };
19
+ // Create behavior instance with mocked properties
20
+ behavior = Object.create(HomebridgeLevelControlServer.prototype);
21
+ Object.defineProperty(behavior, 'endpoint', {
22
+ get: () => mockEndpoint,
23
+ configurable: true,
24
+ });
25
+ // Mock super methods to prevent actual execution
26
+ vi.spyOn(Object.getPrototypeOf(HomebridgeLevelControlServer.prototype), 'moveToLevel').mockReturnValue(undefined);
27
+ vi.spyOn(Object.getPrototypeOf(HomebridgeLevelControlServer.prototype), 'move').mockReturnValue(undefined);
28
+ vi.spyOn(Object.getPrototypeOf(HomebridgeLevelControlServer.prototype), 'step').mockReturnValue(undefined);
29
+ vi.spyOn(Object.getPrototypeOf(HomebridgeLevelControlServer.prototype), 'stop').mockReturnValue(undefined);
30
+ vi.spyOn(Object.getPrototypeOf(HomebridgeLevelControlServer.prototype), 'moveToLevelWithOnOff').mockReturnValue(undefined);
31
+ });
32
+ describe('setRegistry', () => {
33
+ it('should set the registry', () => {
34
+ const newRegistry = {};
35
+ HomebridgeLevelControlServer.setRegistry(newRegistry);
36
+ expect(true).toBe(true);
37
+ });
38
+ });
39
+ describe('moveToLevel', () => {
40
+ it('should execute handler with request', async () => {
41
+ const request = { level: 128, transitionTime: 0, optionsMask: {}, optionsOverride: {} };
42
+ await behavior.moveToLevel(request);
43
+ expect(mockRegistry.executeHandler).toHaveBeenCalledWith('test-endpoint-123', 'levelControl', 'moveToLevel', request);
44
+ });
45
+ it('should sync currentLevel to cache', async () => {
46
+ const request = { level: 200, transitionTime: 10, optionsMask: {}, optionsOverride: {} };
47
+ await behavior.moveToLevel(request);
48
+ expect(mockRegistry.syncStateToCache).toHaveBeenCalledWith('test-endpoint-123', 'levelControl', { currentLevel: 200 });
49
+ });
50
+ it('should handle level 0', async () => {
51
+ const request = { level: 0, transitionTime: 0, optionsMask: {}, optionsOverride: {} };
52
+ await behavior.moveToLevel(request);
53
+ expect(mockRegistry.syncStateToCache).toHaveBeenCalledWith('test-endpoint-123', 'levelControl', { currentLevel: 0 });
54
+ });
55
+ it('should handle level 254 (max)', async () => {
56
+ const request = { level: 254, transitionTime: 0, optionsMask: {}, optionsOverride: {} };
57
+ await behavior.moveToLevel(request);
58
+ expect(mockRegistry.syncStateToCache).toHaveBeenCalledWith('test-endpoint-123', 'levelControl', { currentLevel: 254 });
59
+ });
60
+ it('should handle handler execution errors gracefully', () => {
61
+ mockRegistry.executeHandler = vi.fn().mockRejectedValue(new Error('Handler failed'));
62
+ const request = { level: 100, transitionTime: 0, optionsMask: {}, optionsOverride: {} };
63
+ expect(() => behavior.moveToLevel(request)).not.toThrow();
64
+ });
65
+ });
66
+ describe('move', () => {
67
+ it('should execute handler with request', async () => {
68
+ const request = { moveMode: 0, rate: 10, optionsMask: {}, optionsOverride: {} };
69
+ await behavior.move(request);
70
+ expect(mockRegistry.executeHandler).toHaveBeenCalledWith('test-endpoint-123', 'levelControl', 'move', request);
71
+ });
72
+ it('should not sync state to cache', async () => {
73
+ const request = { moveMode: 0, rate: 10, optionsMask: {}, optionsOverride: {} };
74
+ await behavior.move(request);
75
+ expect(mockRegistry.syncStateToCache).not.toHaveBeenCalled();
76
+ });
77
+ it('should handle handler execution errors gracefully', () => {
78
+ mockRegistry.executeHandler = vi.fn().mockRejectedValue(new Error('Handler failed'));
79
+ const request = { moveMode: 0, rate: 10, optionsMask: {}, optionsOverride: {} };
80
+ expect(() => behavior.move(request)).not.toThrow();
81
+ });
82
+ });
83
+ describe('step', () => {
84
+ it('should execute handler with request', async () => {
85
+ const request = { stepMode: 0, stepSize: 20, transitionTime: 5, optionsMask: {}, optionsOverride: {} };
86
+ await behavior.step(request);
87
+ expect(mockRegistry.executeHandler).toHaveBeenCalledWith('test-endpoint-123', 'levelControl', 'step', request);
88
+ });
89
+ it('should not sync state to cache', async () => {
90
+ const request = { stepMode: 0, stepSize: 20, transitionTime: 5, optionsMask: {}, optionsOverride: {} };
91
+ await behavior.step(request);
92
+ expect(mockRegistry.syncStateToCache).not.toHaveBeenCalled();
93
+ });
94
+ it('should handle handler execution errors gracefully', () => {
95
+ mockRegistry.executeHandler = vi.fn().mockRejectedValue(new Error('Handler failed'));
96
+ const request = { stepMode: 0, stepSize: 20, transitionTime: 5, optionsMask: {}, optionsOverride: {} };
97
+ expect(() => behavior.step(request)).not.toThrow();
98
+ });
99
+ });
100
+ describe('stop', () => {
101
+ it('should execute handler with request', async () => {
102
+ const request = { optionsMask: {}, optionsOverride: {} };
103
+ await behavior.stop(request);
104
+ expect(mockRegistry.executeHandler).toHaveBeenCalledWith('test-endpoint-123', 'levelControl', 'stop', request);
105
+ });
106
+ it('should not sync state to cache', async () => {
107
+ const request = { optionsMask: {}, optionsOverride: {} };
108
+ await behavior.stop(request);
109
+ expect(mockRegistry.syncStateToCache).not.toHaveBeenCalled();
110
+ });
111
+ it('should handle handler execution errors gracefully', () => {
112
+ mockRegistry.executeHandler = vi.fn().mockRejectedValue(new Error('Handler failed'));
113
+ const request = { optionsMask: {}, optionsOverride: {} };
114
+ expect(() => behavior.stop(request)).not.toThrow();
115
+ });
116
+ });
117
+ describe('moveToLevelWithOnOff', () => {
118
+ it('should execute handler with request', async () => {
119
+ const request = { level: 150, transitionTime: 5, optionsMask: {}, optionsOverride: {} };
120
+ await behavior.moveToLevelWithOnOff(request);
121
+ expect(mockRegistry.executeHandler).toHaveBeenCalledWith('test-endpoint-123', 'levelControl', 'moveToLevelWithOnOff', request);
122
+ });
123
+ it('should sync currentLevel to cache', async () => {
124
+ const request = { level: 180, transitionTime: 10, optionsMask: {}, optionsOverride: {} };
125
+ await behavior.moveToLevelWithOnOff(request);
126
+ expect(mockRegistry.syncStateToCache).toHaveBeenCalledWith('test-endpoint-123', 'levelControl', { currentLevel: 180 });
127
+ });
128
+ it('should handle level 0', async () => {
129
+ const request = { level: 0, transitionTime: 0, optionsMask: {}, optionsOverride: {} };
130
+ await behavior.moveToLevelWithOnOff(request);
131
+ expect(mockRegistry.syncStateToCache).toHaveBeenCalledWith('test-endpoint-123', 'levelControl', { currentLevel: 0 });
132
+ });
133
+ it('should handle handler execution errors gracefully', () => {
134
+ mockRegistry.executeHandler = vi.fn().mockRejectedValue(new Error('Handler failed'));
135
+ const request = { level: 100, transitionTime: 0, optionsMask: {}, optionsOverride: {} };
136
+ expect(() => behavior.moveToLevelWithOnOff(request)).not.toThrow();
137
+ });
138
+ });
139
+ });
140
+ //# sourceMappingURL=LevelControlBehavior.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LevelControlBehavior.spec.js","sourceRoot":"","sources":["../../../src/matter/behaviors/LevelControlBehavior.spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * OnOff Cluster Behavior
3
+ *
4
+ * Handles on/off commands for lights, switches, and outlets
5
+ */
6
+ import type { MaybePromise } from '@matter/main';
7
+ import type { BehaviorRegistry } from './BehaviorRegistry.js';
8
+ import { OnOffServer } from '@matter/main/behaviors/on-off';
9
+ export declare class HomebridgeOnOffServer extends OnOffServer {
10
+ private static registry;
11
+ /**
12
+ * Set the behavior registry (called once during server initialization)
13
+ */
14
+ static setRegistry(registry: BehaviorRegistry): void;
15
+ /**
16
+ * Handle 'on' command
17
+ */
18
+ on(): MaybePromise<void>;
19
+ /**
20
+ * Handle 'off' command
21
+ */
22
+ off(): MaybePromise<void>;
23
+ /**
24
+ * Handle 'toggle' command
25
+ */
26
+ toggle(): MaybePromise<void>;
27
+ }
28
+ //# sourceMappingURL=OnOffBehavior.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OnOffBehavior.d.ts","sourceRoot":"","sources":["../../../src/matter/behaviors/OnOffBehavior.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAEhD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AAE7D,OAAO,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAA;AAE3D,qBAAa,qBAAsB,SAAQ,WAAW;IACpD,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAkB;IAEzC;;OAEG;IACH,MAAM,CAAC,WAAW,CAAC,QAAQ,EAAE,gBAAgB,GAAG,IAAI;IAIpD;;OAEG;IACM,EAAE,IAAI,YAAY,CAAC,IAAI,CAAC;IAiBjC;;OAEG;IACM,GAAG,IAAI,YAAY,CAAC,IAAI,CAAC;IAiBlC;;OAEG;IACM,MAAM,IAAI,YAAY,CAAC,IAAI,CAAC;CAkBtC"}
@@ -0,0 +1,63 @@
1
+ /**
2
+ * OnOff Cluster Behavior
3
+ *
4
+ * Handles on/off commands for lights, switches, and outlets
5
+ */
6
+ import { OnOffServer } from '@matter/main/behaviors/on-off';
7
+ export class HomebridgeOnOffServer extends OnOffServer {
8
+ static registry;
9
+ /**
10
+ * Set the behavior registry (called once during server initialization)
11
+ */
12
+ static setRegistry(registry) {
13
+ this.registry = registry;
14
+ }
15
+ /**
16
+ * Handle 'on' command
17
+ */
18
+ on() {
19
+ const endpointId = this.endpoint.id;
20
+ // Execute user handler (errors are logged by registry)
21
+ HomebridgeOnOffServer.registry.executeHandler(endpointId, 'onOff', 'on').catch(() => {
22
+ // Error already logged by registry
23
+ });
24
+ // Call base implementation
25
+ const result = super.on();
26
+ // Sync state to cache
27
+ HomebridgeOnOffServer.registry.syncStateToCache(endpointId, 'onOff', { onOff: true });
28
+ return result;
29
+ }
30
+ /**
31
+ * Handle 'off' command
32
+ */
33
+ off() {
34
+ const endpointId = this.endpoint.id;
35
+ // Execute user handler (errors are logged by registry)
36
+ HomebridgeOnOffServer.registry.executeHandler(endpointId, 'onOff', 'off').catch(() => {
37
+ // Error already logged by registry
38
+ });
39
+ // Call base implementation
40
+ const result = super.off();
41
+ // Sync state to cache
42
+ HomebridgeOnOffServer.registry.syncStateToCache(endpointId, 'onOff', { onOff: false });
43
+ return result;
44
+ }
45
+ /**
46
+ * Handle 'toggle' command
47
+ */
48
+ toggle() {
49
+ const endpointId = this.endpoint.id;
50
+ // Execute user handler (errors are logged by registry)
51
+ HomebridgeOnOffServer.registry.executeHandler(endpointId, 'onOff', 'toggle').catch(() => {
52
+ // Error already logged by registry
53
+ });
54
+ // Call base implementation
55
+ const result = super.toggle();
56
+ // Sync state to cache (toggle changes the value)
57
+ const currentState = this.state;
58
+ const newState = !currentState.onOff;
59
+ HomebridgeOnOffServer.registry.syncStateToCache(endpointId, 'onOff', { onOff: newState });
60
+ return result;
61
+ }
62
+ }
63
+ //# sourceMappingURL=OnOffBehavior.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OnOffBehavior.js","sourceRoot":"","sources":["../../../src/matter/behaviors/OnOffBehavior.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,OAAO,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAA;AAE3D,MAAM,OAAO,qBAAsB,SAAQ,WAAW;IAC5C,MAAM,CAAC,QAAQ,CAAkB;IAEzC;;OAEG;IACH,MAAM,CAAC,WAAW,CAAC,QAA0B;QAC3C,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAA;IAC1B,CAAC;IAED;;OAEG;IACM,EAAE;QACT,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAA;QAEnC,uDAAuD;QACvD,qBAAqB,CAAC,QAAQ,CAAC,cAAc,CAAC,UAAU,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE;YAClF,mCAAmC;QACrC,CAAC,CAAC,CAAA;QAEF,2BAA2B;QAC3B,MAAM,MAAM,GAAG,KAAK,CAAC,EAAE,EAAE,CAAA;QAEzB,sBAAsB;QACtB,qBAAqB,CAAC,QAAQ,CAAC,gBAAgB,CAAC,UAAU,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;QAErF,OAAO,MAAM,CAAA;IACf,CAAC;IAED;;OAEG;IACM,GAAG;QACV,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAA;QAEnC,uDAAuD;QACvD,qBAAqB,CAAC,QAAQ,CAAC,cAAc,CAAC,UAAU,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE;YACnF,mCAAmC;QACrC,CAAC,CAAC,CAAA;QAEF,2BAA2B;QAC3B,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,EAAE,CAAA;QAE1B,sBAAsB;QACtB,qBAAqB,CAAC,QAAQ,CAAC,gBAAgB,CAAC,UAAU,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAA;QAEtF,OAAO,MAAM,CAAA;IACf,CAAC;IAED;;OAEG;IACM,MAAM;QACb,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAA;QAEnC,uDAAuD;QACvD,qBAAqB,CAAC,QAAQ,CAAC,cAAc,CAAC,UAAU,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE;YACtF,mCAAmC;QACrC,CAAC,CAAC,CAAA;QAEF,2BAA2B;QAC3B,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,EAAE,CAAA;QAE7B,iDAAiD;QACjD,MAAM,YAAY,GAAG,IAAI,CAAC,KAA4B,CAAA;QACtD,MAAM,QAAQ,GAAG,CAAC,YAAY,CAAC,KAAK,CAAA;QACpC,qBAAqB,CAAC,QAAQ,CAAC,gBAAgB,CAAC,UAAU,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAA;QAEzF,OAAO,MAAM,CAAA;IACf,CAAC;CACF"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=OnOffBehavior.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OnOffBehavior.spec.d.ts","sourceRoot":"","sources":["../../../src/matter/behaviors/OnOffBehavior.spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,116 @@
1
+ import { beforeEach, describe, expect, it, vi } from 'vitest';
2
+ import { HomebridgeOnOffServer } from './OnOffBehavior.js';
3
+ describe('homebridgeOnOffServer', () => {
4
+ let mockRegistry;
5
+ let behavior;
6
+ let mockEndpoint;
7
+ let mockState;
8
+ beforeEach(() => {
9
+ // Create mock registry
10
+ mockRegistry = {
11
+ executeHandler: vi.fn().mockResolvedValue(true),
12
+ syncStateToCache: vi.fn(),
13
+ };
14
+ // Set registry on behavior class
15
+ HomebridgeOnOffServer.setRegistry(mockRegistry);
16
+ // Create mock state
17
+ mockState = { onOff: false };
18
+ // Create mock endpoint
19
+ mockEndpoint = {
20
+ id: 'test-endpoint-123',
21
+ };
22
+ // Create behavior instance with mocked properties
23
+ behavior = Object.create(HomebridgeOnOffServer.prototype);
24
+ Object.defineProperty(behavior, 'endpoint', {
25
+ get: () => mockEndpoint,
26
+ configurable: true,
27
+ });
28
+ Object.defineProperty(behavior, 'state', {
29
+ get: () => mockState,
30
+ set: (value) => {
31
+ mockState = value;
32
+ },
33
+ configurable: true,
34
+ });
35
+ // Mock super methods to prevent actual execution
36
+ vi.spyOn(Object.getPrototypeOf(HomebridgeOnOffServer.prototype), 'on').mockReturnValue(undefined);
37
+ vi.spyOn(Object.getPrototypeOf(HomebridgeOnOffServer.prototype), 'off').mockReturnValue(undefined);
38
+ vi.spyOn(Object.getPrototypeOf(HomebridgeOnOffServer.prototype), 'toggle').mockReturnValue(undefined);
39
+ });
40
+ describe('setRegistry', () => {
41
+ it('should set the registry', () => {
42
+ const newRegistry = {};
43
+ HomebridgeOnOffServer.setRegistry(newRegistry);
44
+ // Registry is set (can't directly verify private static, but method doesn't throw)
45
+ expect(true).toBe(true);
46
+ });
47
+ });
48
+ describe('on', () => {
49
+ it('should execute handler for on command', async () => {
50
+ await behavior.on();
51
+ expect(mockRegistry.executeHandler).toHaveBeenCalledWith('test-endpoint-123', 'onOff', 'on');
52
+ });
53
+ it('should sync onOff:true to cache', async () => {
54
+ await behavior.on();
55
+ expect(mockRegistry.syncStateToCache).toHaveBeenCalledWith('test-endpoint-123', 'onOff', { onOff: true });
56
+ });
57
+ it('should handle handler execution errors gracefully', () => {
58
+ mockRegistry.executeHandler = vi.fn().mockRejectedValue(new Error('Handler failed'));
59
+ // Should not throw
60
+ expect(() => behavior.on()).not.toThrow();
61
+ });
62
+ it('should sync state even if handler fails', async () => {
63
+ mockRegistry.executeHandler = vi.fn().mockRejectedValue(new Error('Handler failed'));
64
+ await behavior.on();
65
+ expect(mockRegistry.syncStateToCache).toHaveBeenCalledWith('test-endpoint-123', 'onOff', { onOff: true });
66
+ });
67
+ });
68
+ describe('off', () => {
69
+ it('should execute handler for off command', async () => {
70
+ await behavior.off();
71
+ expect(mockRegistry.executeHandler).toHaveBeenCalledWith('test-endpoint-123', 'onOff', 'off');
72
+ });
73
+ it('should sync onOff:false to cache', async () => {
74
+ await behavior.off();
75
+ expect(mockRegistry.syncStateToCache).toHaveBeenCalledWith('test-endpoint-123', 'onOff', { onOff: false });
76
+ });
77
+ it('should handle handler execution errors gracefully', () => {
78
+ mockRegistry.executeHandler = vi.fn().mockRejectedValue(new Error('Handler failed'));
79
+ // Should not throw
80
+ expect(() => behavior.off()).not.toThrow();
81
+ });
82
+ it('should sync state even if handler fails', async () => {
83
+ mockRegistry.executeHandler = vi.fn().mockRejectedValue(new Error('Handler failed'));
84
+ await behavior.off();
85
+ expect(mockRegistry.syncStateToCache).toHaveBeenCalledWith('test-endpoint-123', 'onOff', { onOff: false });
86
+ });
87
+ });
88
+ describe('toggle', () => {
89
+ it('should execute handler for toggle command', async () => {
90
+ await behavior.toggle();
91
+ expect(mockRegistry.executeHandler).toHaveBeenCalledWith('test-endpoint-123', 'onOff', 'toggle');
92
+ });
93
+ it('should sync toggled state (false -> true) to cache', async () => {
94
+ mockState.onOff = false;
95
+ await behavior.toggle();
96
+ expect(mockRegistry.syncStateToCache).toHaveBeenCalledWith('test-endpoint-123', 'onOff', { onOff: true });
97
+ });
98
+ it('should sync toggled state (true -> false) to cache', async () => {
99
+ mockState.onOff = true;
100
+ await behavior.toggle();
101
+ expect(mockRegistry.syncStateToCache).toHaveBeenCalledWith('test-endpoint-123', 'onOff', { onOff: false });
102
+ });
103
+ it('should handle undefined initial state', async () => {
104
+ mockState.onOff = undefined;
105
+ await behavior.toggle();
106
+ // undefined -> true (! undefined = true)
107
+ expect(mockRegistry.syncStateToCache).toHaveBeenCalledWith('test-endpoint-123', 'onOff', { onOff: true });
108
+ });
109
+ it('should handle handler execution errors gracefully', () => {
110
+ mockRegistry.executeHandler = vi.fn().mockRejectedValue(new Error('Handler failed'));
111
+ // Should not throw
112
+ expect(() => behavior.toggle()).not.toThrow();
113
+ });
114
+ });
115
+ });
116
+ //# sourceMappingURL=OnOffBehavior.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OnOffBehavior.spec.js","sourceRoot":"","sources":["../../../src/matter/behaviors/OnOffBehavior.spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * RvcCleanMode Cluster Behavior
3
+ *
4
+ * Handles robotic vacuum cleaner cleaning mode changes
5
+ */
6
+ import type { BehaviorRegistry } from './BehaviorRegistry.js';
7
+ import { RvcCleanModeServer } from '@matter/main/behaviors/rvc-clean-mode';
8
+ /**
9
+ * Custom RvcCleanMode Server that calls plugin handlers
10
+ */
11
+ export declare class HomebridgeRvcCleanModeServer extends RvcCleanModeServer {
12
+ private static registry;
13
+ /**
14
+ * Set the behavior registry (called once during server initialization)
15
+ */
16
+ static setRegistry(registry: BehaviorRegistry): void;
17
+ changeToMode(request: any): any;
18
+ }
19
+ //# sourceMappingURL=RvcCleanModeBehavior.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RvcCleanModeBehavior.d.ts","sourceRoot":"","sources":["../../../src/matter/behaviors/RvcCleanModeBehavior.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AAE7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,uCAAuC,CAAA;AAE1E;;GAEG;AACH,qBAAa,4BAA6B,SAAQ,kBAAkB;IAClE,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAkB;IAEzC;;OAEG;IACH,MAAM,CAAC,WAAW,CAAC,QAAQ,EAAE,gBAAgB,GAAG,IAAI;IAI3C,YAAY,CAAC,OAAO,EAAE,GAAG,GAAG,GAAG;CAUzC"}