homebridge 2.0.0-beta.4 → 2.0.0-beta.40
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.
- package/README.md +16 -17
- package/bin/homebridge.js +22 -0
- package/config-sample.json +3 -3
- package/dist/api.d.ts +499 -0
- package/dist/api.d.ts.map +1 -0
- package/dist/api.js +223 -0
- package/dist/api.js.map +1 -0
- package/dist/api.spec.d.ts +2 -0
- package/dist/api.spec.d.ts.map +1 -0
- package/dist/api.spec.js +413 -0
- package/dist/api.spec.js.map +1 -0
- package/{lib → dist}/bridgeService.d.ts +19 -10
- package/dist/bridgeService.d.ts.map +1 -0
- package/{lib → dist}/bridgeService.js +85 -117
- package/dist/bridgeService.js.map +1 -0
- package/{lib → dist}/childBridgeFork.d.ts +11 -5
- package/dist/childBridgeFork.d.ts.map +1 -0
- package/{lib → dist}/childBridgeFork.js +93 -44
- package/dist/childBridgeFork.js.map +1 -0
- package/{lib → dist}/childBridgeService.d.ts +37 -7
- package/dist/childBridgeService.d.ts.map +1 -0
- package/{lib → dist}/childBridgeService.js +127 -69
- package/dist/childBridgeService.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +90 -0
- package/dist/cli.js.map +1 -0
- package/dist/externalPortService.d.ts +47 -0
- package/dist/externalPortService.d.ts.map +1 -0
- package/dist/externalPortService.js +105 -0
- package/dist/externalPortService.js.map +1 -0
- package/dist/index.d.ts +141 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +53 -0
- package/dist/index.js.map +1 -0
- package/dist/ipcService.d.ts +48 -0
- package/dist/ipcService.d.ts.map +1 -0
- package/{lib → dist}/ipcService.js +12 -14
- package/dist/ipcService.js.map +1 -0
- package/{lib → dist}/logger.d.ts +12 -6
- package/dist/logger.d.ts.map +1 -0
- package/{lib → dist}/logger.js +27 -28
- package/dist/logger.js.map +1 -0
- package/dist/logger.spec.d.ts +2 -0
- package/dist/logger.spec.d.ts.map +1 -0
- package/dist/logger.spec.js +95 -0
- package/dist/logger.spec.js.map +1 -0
- package/dist/matter/ChildBridgeMatterManager.d.ts +96 -0
- package/dist/matter/ChildBridgeMatterManager.d.ts.map +1 -0
- package/dist/matter/ChildBridgeMatterManager.js +399 -0
- package/dist/matter/ChildBridgeMatterManager.js.map +1 -0
- package/dist/matter/ExternalMatterAccessoryPublisher.d.ts +48 -0
- package/dist/matter/ExternalMatterAccessoryPublisher.d.ts.map +1 -0
- package/dist/matter/ExternalMatterAccessoryPublisher.js +73 -0
- package/dist/matter/ExternalMatterAccessoryPublisher.js.map +1 -0
- package/dist/matter/ExternalMatterAccessoryPublisher.spec.d.ts +2 -0
- package/dist/matter/ExternalMatterAccessoryPublisher.spec.d.ts.map +1 -0
- package/dist/matter/ExternalMatterAccessoryPublisher.spec.js +293 -0
- package/dist/matter/ExternalMatterAccessoryPublisher.spec.js.map +1 -0
- package/dist/matter/MatterAPIImpl.d.ts +504 -0
- package/dist/matter/MatterAPIImpl.d.ts.map +1 -0
- package/dist/matter/MatterAPIImpl.js +305 -0
- package/dist/matter/MatterAPIImpl.js.map +1 -0
- package/dist/matter/MatterBridgeManager.d.ts +87 -0
- package/dist/matter/MatterBridgeManager.d.ts.map +1 -0
- package/dist/matter/MatterBridgeManager.js +413 -0
- package/dist/matter/MatterBridgeManager.js.map +1 -0
- package/dist/matter/MatterConfigCollector.d.ts +26 -0
- package/dist/matter/MatterConfigCollector.d.ts.map +1 -0
- package/dist/matter/MatterConfigCollector.js +78 -0
- package/dist/matter/MatterConfigCollector.js.map +1 -0
- package/dist/matter/accessoryCache.d.ts +105 -0
- package/dist/matter/accessoryCache.d.ts.map +1 -0
- package/dist/matter/accessoryCache.js +214 -0
- package/dist/matter/accessoryCache.js.map +1 -0
- package/dist/matter/accessoryCache.spec.d.ts +2 -0
- package/dist/matter/accessoryCache.spec.d.ts.map +1 -0
- package/dist/matter/accessoryCache.spec.js +452 -0
- package/dist/matter/accessoryCache.spec.js.map +1 -0
- package/dist/matter/behaviors/BehaviorRegistry.d.ts +65 -0
- package/dist/matter/behaviors/BehaviorRegistry.d.ts.map +1 -0
- package/dist/matter/behaviors/BehaviorRegistry.js +139 -0
- package/dist/matter/behaviors/BehaviorRegistry.js.map +1 -0
- package/dist/matter/behaviors/BehaviorRegistry.spec.d.ts +2 -0
- package/dist/matter/behaviors/BehaviorRegistry.spec.d.ts.map +1 -0
- package/dist/matter/behaviors/BehaviorRegistry.spec.js +307 -0
- package/dist/matter/behaviors/BehaviorRegistry.spec.js.map +1 -0
- package/dist/matter/behaviors/ColorControlBehavior.d.ts +63 -0
- package/dist/matter/behaviors/ColorControlBehavior.d.ts.map +1 -0
- package/dist/matter/behaviors/ColorControlBehavior.js +223 -0
- package/dist/matter/behaviors/ColorControlBehavior.js.map +1 -0
- package/dist/matter/behaviors/ColorControlBehavior.spec.d.ts +2 -0
- package/dist/matter/behaviors/ColorControlBehavior.spec.d.ts.map +1 -0
- package/dist/matter/behaviors/ColorControlBehavior.spec.js +29 -0
- package/dist/matter/behaviors/ColorControlBehavior.spec.js.map +1 -0
- package/dist/matter/behaviors/DoorLockBehavior.d.ts +20 -0
- package/dist/matter/behaviors/DoorLockBehavior.d.ts.map +1 -0
- package/dist/matter/behaviors/DoorLockBehavior.js +71 -0
- package/dist/matter/behaviors/DoorLockBehavior.js.map +1 -0
- package/dist/matter/behaviors/DoorLockBehavior.spec.d.ts +2 -0
- package/dist/matter/behaviors/DoorLockBehavior.spec.d.ts.map +1 -0
- package/dist/matter/behaviors/DoorLockBehavior.spec.js +120 -0
- package/dist/matter/behaviors/DoorLockBehavior.spec.js.map +1 -0
- package/dist/matter/behaviors/FanControlBehavior.d.ts +20 -0
- package/dist/matter/behaviors/FanControlBehavior.d.ts.map +1 -0
- package/dist/matter/behaviors/FanControlBehavior.js +71 -0
- package/dist/matter/behaviors/FanControlBehavior.js.map +1 -0
- package/dist/matter/behaviors/FanControlBehavior.spec.d.ts +2 -0
- package/dist/matter/behaviors/FanControlBehavior.spec.d.ts.map +1 -0
- package/dist/matter/behaviors/FanControlBehavior.spec.js +23 -0
- package/dist/matter/behaviors/FanControlBehavior.spec.js.map +1 -0
- package/dist/matter/behaviors/IdentifyBehavior.d.ts +20 -0
- package/dist/matter/behaviors/IdentifyBehavior.d.ts.map +1 -0
- package/dist/matter/behaviors/IdentifyBehavior.js +41 -0
- package/dist/matter/behaviors/IdentifyBehavior.js.map +1 -0
- package/dist/matter/behaviors/IdentifyBehavior.spec.d.ts +2 -0
- package/dist/matter/behaviors/IdentifyBehavior.spec.d.ts.map +1 -0
- package/dist/matter/behaviors/IdentifyBehavior.spec.js +64 -0
- package/dist/matter/behaviors/IdentifyBehavior.spec.js.map +1 -0
- package/dist/matter/behaviors/LevelControlBehavior.d.ts +33 -0
- package/dist/matter/behaviors/LevelControlBehavior.d.ts.map +1 -0
- package/dist/matter/behaviors/LevelControlBehavior.js +138 -0
- package/dist/matter/behaviors/LevelControlBehavior.js.map +1 -0
- package/dist/matter/behaviors/LevelControlBehavior.spec.d.ts +2 -0
- package/dist/matter/behaviors/LevelControlBehavior.spec.d.ts.map +1 -0
- package/dist/matter/behaviors/LevelControlBehavior.spec.js +145 -0
- package/dist/matter/behaviors/LevelControlBehavior.spec.js.map +1 -0
- package/dist/matter/behaviors/OnOffBehavior.d.ts +27 -0
- package/dist/matter/behaviors/OnOffBehavior.d.ts.map +1 -0
- package/dist/matter/behaviors/OnOffBehavior.js +95 -0
- package/dist/matter/behaviors/OnOffBehavior.js.map +1 -0
- package/dist/matter/behaviors/OnOffBehavior.spec.d.ts +2 -0
- package/dist/matter/behaviors/OnOffBehavior.spec.d.ts.map +1 -0
- package/dist/matter/behaviors/OnOffBehavior.spec.js +128 -0
- package/dist/matter/behaviors/OnOffBehavior.spec.js.map +1 -0
- package/dist/matter/behaviors/RvcCleanModeBehavior.d.ts +19 -0
- package/dist/matter/behaviors/RvcCleanModeBehavior.d.ts.map +1 -0
- package/dist/matter/behaviors/RvcCleanModeBehavior.js +41 -0
- package/dist/matter/behaviors/RvcCleanModeBehavior.js.map +1 -0
- package/dist/matter/behaviors/RvcCleanModeBehavior.spec.d.ts +2 -0
- package/dist/matter/behaviors/RvcCleanModeBehavior.spec.d.ts.map +1 -0
- package/dist/matter/behaviors/RvcCleanModeBehavior.spec.js +57 -0
- package/dist/matter/behaviors/RvcCleanModeBehavior.spec.js.map +1 -0
- package/dist/matter/behaviors/RvcOperationalStateBehavior.d.ts +22 -0
- package/dist/matter/behaviors/RvcOperationalStateBehavior.d.ts.map +1 -0
- package/dist/matter/behaviors/RvcOperationalStateBehavior.js +86 -0
- package/dist/matter/behaviors/RvcOperationalStateBehavior.js.map +1 -0
- package/dist/matter/behaviors/RvcOperationalStateBehavior.spec.d.ts +2 -0
- package/dist/matter/behaviors/RvcOperationalStateBehavior.spec.d.ts.map +1 -0
- package/dist/matter/behaviors/RvcOperationalStateBehavior.spec.js +55 -0
- package/dist/matter/behaviors/RvcOperationalStateBehavior.spec.js.map +1 -0
- package/dist/matter/behaviors/RvcRunModeBehavior.d.ts +19 -0
- package/dist/matter/behaviors/RvcRunModeBehavior.d.ts.map +1 -0
- package/dist/matter/behaviors/RvcRunModeBehavior.js +41 -0
- package/dist/matter/behaviors/RvcRunModeBehavior.js.map +1 -0
- package/dist/matter/behaviors/RvcRunModeBehavior.spec.d.ts +2 -0
- package/dist/matter/behaviors/RvcRunModeBehavior.spec.d.ts.map +1 -0
- package/dist/matter/behaviors/RvcRunModeBehavior.spec.js +57 -0
- package/dist/matter/behaviors/RvcRunModeBehavior.spec.js.map +1 -0
- package/dist/matter/behaviors/ServiceAreaBehavior.d.ts +21 -0
- package/dist/matter/behaviors/ServiceAreaBehavior.d.ts.map +1 -0
- package/dist/matter/behaviors/ServiceAreaBehavior.js +61 -0
- package/dist/matter/behaviors/ServiceAreaBehavior.js.map +1 -0
- package/dist/matter/behaviors/ServiceAreaBehavior.spec.d.ts +2 -0
- package/dist/matter/behaviors/ServiceAreaBehavior.spec.d.ts.map +1 -0
- package/dist/matter/behaviors/ServiceAreaBehavior.spec.js +53 -0
- package/dist/matter/behaviors/ServiceAreaBehavior.spec.js.map +1 -0
- package/dist/matter/behaviors/ThermostatBehavior.d.ts +22 -0
- package/dist/matter/behaviors/ThermostatBehavior.d.ts.map +1 -0
- package/dist/matter/behaviors/ThermostatBehavior.js +127 -0
- package/dist/matter/behaviors/ThermostatBehavior.js.map +1 -0
- package/dist/matter/behaviors/ThermostatBehavior.spec.d.ts +2 -0
- package/dist/matter/behaviors/ThermostatBehavior.spec.d.ts.map +1 -0
- package/dist/matter/behaviors/ThermostatBehavior.spec.js +23 -0
- package/dist/matter/behaviors/ThermostatBehavior.spec.js.map +1 -0
- package/dist/matter/behaviors/WindowCoveringBehavior.d.ts +31 -0
- package/dist/matter/behaviors/WindowCoveringBehavior.d.ts.map +1 -0
- package/dist/matter/behaviors/WindowCoveringBehavior.js +158 -0
- package/dist/matter/behaviors/WindowCoveringBehavior.js.map +1 -0
- package/dist/matter/behaviors/WindowCoveringBehavior.spec.d.ts +2 -0
- package/dist/matter/behaviors/WindowCoveringBehavior.spec.d.ts.map +1 -0
- package/dist/matter/behaviors/WindowCoveringBehavior.spec.js +27 -0
- package/dist/matter/behaviors/WindowCoveringBehavior.spec.js.map +1 -0
- package/dist/matter/behaviors/index.d.ts +20 -0
- package/dist/matter/behaviors/index.d.ts.map +1 -0
- package/dist/matter/behaviors/index.js +21 -0
- package/dist/matter/behaviors/index.js.map +1 -0
- package/dist/matter/configValidator.d.ts +81 -0
- package/dist/matter/configValidator.d.ts.map +1 -0
- package/dist/matter/configValidator.js +240 -0
- package/dist/matter/configValidator.js.map +1 -0
- package/dist/matter/configValidator.spec.d.ts +2 -0
- package/dist/matter/configValidator.spec.d.ts.map +1 -0
- package/dist/matter/configValidator.spec.js +390 -0
- package/dist/matter/configValidator.spec.js.map +1 -0
- package/dist/matter/errorHandler.d.ts +33 -0
- package/dist/matter/errorHandler.d.ts.map +1 -0
- package/dist/matter/errorHandler.js +113 -0
- package/dist/matter/errorHandler.js.map +1 -0
- package/dist/matter/errorHandler.spec.d.ts +2 -0
- package/dist/matter/errorHandler.spec.d.ts.map +1 -0
- package/dist/matter/errorHandler.spec.js +159 -0
- package/dist/matter/errorHandler.spec.js.map +1 -0
- package/dist/matter/errors.d.ts +178 -0
- package/dist/matter/errors.d.ts.map +1 -0
- package/dist/matter/errors.js +200 -0
- package/dist/matter/errors.js.map +1 -0
- package/dist/matter/index.d.ts +127 -0
- package/dist/matter/index.d.ts.map +1 -0
- package/dist/matter/index.js +23 -0
- package/dist/matter/index.js.map +1 -0
- package/dist/matter/logFormatter.d.ts +19 -0
- package/dist/matter/logFormatter.d.ts.map +1 -0
- package/dist/matter/logFormatter.js +158 -0
- package/dist/matter/logFormatter.js.map +1 -0
- package/dist/matter/logFormatter.spec.d.ts +2 -0
- package/dist/matter/logFormatter.spec.d.ts.map +1 -0
- package/dist/matter/logFormatter.spec.js +252 -0
- package/dist/matter/logFormatter.spec.js.map +1 -0
- package/dist/matter/server.d.ts +336 -0
- package/dist/matter/server.d.ts.map +1 -0
- package/dist/matter/server.js +1810 -0
- package/dist/matter/server.js.map +1 -0
- package/dist/matter/serverHelpers.d.ts +81 -0
- package/dist/matter/serverHelpers.d.ts.map +1 -0
- package/dist/matter/serverHelpers.js +326 -0
- package/dist/matter/serverHelpers.js.map +1 -0
- package/dist/matter/serverHelpers.spec.d.ts +2 -0
- package/dist/matter/serverHelpers.spec.d.ts.map +1 -0
- package/dist/matter/serverHelpers.spec.js +521 -0
- package/dist/matter/serverHelpers.spec.js.map +1 -0
- package/dist/matter/sharedTypes.d.ts +164 -0
- package/dist/matter/sharedTypes.d.ts.map +1 -0
- package/dist/matter/sharedTypes.js +46 -0
- package/dist/matter/sharedTypes.js.map +1 -0
- package/dist/matter/storage.d.ts +135 -0
- package/dist/matter/storage.d.ts.map +1 -0
- package/dist/matter/storage.js +424 -0
- package/dist/matter/storage.js.map +1 -0
- package/dist/matter/storage.spec.d.ts +2 -0
- package/dist/matter/storage.spec.d.ts.map +1 -0
- package/dist/matter/storage.spec.js +570 -0
- package/dist/matter/storage.spec.js.map +1 -0
- package/dist/matter/typeHelpers.d.ts +45 -0
- package/dist/matter/typeHelpers.d.ts.map +1 -0
- package/dist/matter/typeHelpers.js +57 -0
- package/dist/matter/typeHelpers.js.map +1 -0
- package/dist/matter/typeHelpers.spec.d.ts +2 -0
- package/dist/matter/typeHelpers.spec.d.ts.map +1 -0
- package/dist/matter/typeHelpers.spec.js +127 -0
- package/dist/matter/typeHelpers.spec.js.map +1 -0
- package/dist/matter/types.d.ts +826 -0
- package/dist/matter/types.d.ts.map +1 -0
- package/dist/matter/types.js +204 -0
- package/dist/matter/types.js.map +1 -0
- package/{lib → dist}/platformAccessory.d.ts +8 -6
- package/dist/platformAccessory.d.ts.map +1 -0
- package/{lib → dist}/platformAccessory.js +19 -16
- package/dist/platformAccessory.js.map +1 -0
- package/dist/platformAccessory.spec.d.ts +2 -0
- package/dist/platformAccessory.spec.d.ts.map +1 -0
- package/dist/platformAccessory.spec.js +126 -0
- package/dist/platformAccessory.spec.js.map +1 -0
- package/{lib → dist}/plugin.d.ts +2 -3
- package/dist/plugin.d.ts.map +1 -0
- package/{lib → dist}/plugin.js +39 -51
- package/dist/plugin.js.map +1 -0
- package/{lib → dist}/pluginManager.d.ts +3 -3
- package/dist/pluginManager.d.ts.map +1 -0
- package/{lib → dist}/pluginManager.js +76 -81
- package/dist/pluginManager.js.map +1 -0
- package/dist/pluginManager.spec.d.ts +2 -0
- package/dist/pluginManager.spec.d.ts.map +1 -0
- package/dist/pluginManager.spec.js +43 -0
- package/dist/pluginManager.spec.js.map +1 -0
- package/{lib → dist}/server.d.ts +14 -1
- package/dist/server.d.ts.map +1 -0
- package/{lib → dist}/server.js +193 -123
- package/dist/server.js.map +1 -0
- package/dist/server.spec.d.ts +2 -0
- package/dist/server.spec.d.ts.map +1 -0
- package/dist/server.spec.js +57 -0
- package/dist/server.spec.js.map +1 -0
- package/{lib → dist}/storageService.d.ts.map +1 -1
- package/dist/storageService.js +41 -0
- package/dist/storageService.js.map +1 -0
- package/{lib → dist}/user.d.ts +1 -0
- package/dist/user.d.ts.map +1 -0
- package/dist/user.js +32 -0
- package/dist/user.js.map +1 -0
- package/dist/user.spec.d.ts +2 -0
- package/dist/user.spec.d.ts.map +1 -0
- package/dist/user.spec.js +31 -0
- package/dist/user.spec.js.map +1 -0
- package/{lib → dist}/util/mac.d.ts +1 -0
- package/dist/util/mac.d.ts.map +1 -0
- package/dist/util/mac.js +14 -0
- package/dist/util/mac.js.map +1 -0
- package/dist/util/mac.spec.d.ts +2 -0
- package/dist/util/mac.spec.d.ts.map +1 -0
- package/dist/util/mac.spec.js +36 -0
- package/dist/util/mac.spec.js.map +1 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +16 -0
- package/dist/version.js.map +1 -0
- package/dist/version.spec.d.ts +2 -0
- package/dist/version.spec.d.ts.map +1 -0
- package/dist/version.spec.js +20 -0
- package/dist/version.spec.js.map +1 -0
- package/package.json +49 -50
- package/bin/homebridge +0 -17
- package/lib/api.d.ts +0 -210
- package/lib/api.d.ts.map +0 -1
- package/lib/api.js +0 -155
- package/lib/api.js.map +0 -1
- package/lib/bridgeService.d.ts.map +0 -1
- package/lib/bridgeService.js.map +0 -1
- package/lib/childBridgeFork.d.ts.map +0 -1
- package/lib/childBridgeFork.js.map +0 -1
- package/lib/childBridgeService.d.ts.map +0 -1
- package/lib/childBridgeService.js.map +0 -1
- package/lib/cli.d.ts +0 -4
- package/lib/cli.d.ts.map +0 -1
- package/lib/cli.js +0 -111
- package/lib/cli.js.map +0 -1
- package/lib/externalPortService.d.ts +0 -33
- package/lib/externalPortService.d.ts.map +0 -1
- package/lib/externalPortService.js +0 -64
- package/lib/externalPortService.js.map +0 -1
- package/lib/index.d.ts +0 -76
- package/lib/index.d.ts.map +0 -1
- package/lib/index.js +0 -72
- package/lib/index.js.map +0 -1
- package/lib/ipcService.d.ts +0 -33
- package/lib/ipcService.d.ts.map +0 -1
- package/lib/ipcService.js.map +0 -1
- package/lib/logger.d.ts.map +0 -1
- package/lib/logger.js.map +0 -1
- package/lib/platformAccessory.d.ts.map +0 -1
- package/lib/platformAccessory.js.map +0 -1
- package/lib/plugin.d.ts.map +0 -1
- package/lib/plugin.js.map +0 -1
- package/lib/pluginManager.d.ts.map +0 -1
- package/lib/pluginManager.js.map +0 -1
- package/lib/server.d.ts.map +0 -1
- package/lib/server.js.map +0 -1
- package/lib/storageService.js +0 -70
- package/lib/storageService.js.map +0 -1
- package/lib/user.d.ts.map +0 -1
- package/lib/user.js +0 -36
- package/lib/user.js.map +0 -1
- package/lib/util/mac.d.ts.map +0 -1
- package/lib/util/mac.js +0 -20
- package/lib/util/mac.js.map +0 -1
- package/lib/version.d.ts.map +0 -1
- package/lib/version.js +0 -21
- package/lib/version.js.map +0 -1
- /package/{lib → dist}/storageService.d.ts +0 -0
- /package/{lib → dist}/version.d.ts +0 -0
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest';
|
|
2
|
+
import { HomebridgeFanControlServer } from './FanControlBehavior.js';
|
|
3
|
+
describe('homebridgeFanControlServer', () => {
|
|
4
|
+
describe('setRegistry', () => {
|
|
5
|
+
it('should set the registry', () => {
|
|
6
|
+
const newRegistry = {};
|
|
7
|
+
HomebridgeFanControlServer.setRegistry(newRegistry);
|
|
8
|
+
expect(true).toBe(true);
|
|
9
|
+
});
|
|
10
|
+
});
|
|
11
|
+
describe('behavior structure', () => {
|
|
12
|
+
it('should extend FanControlServer', () => {
|
|
13
|
+
expect(HomebridgeFanControlServer.prototype).toBeDefined();
|
|
14
|
+
});
|
|
15
|
+
it('should have initialize method', () => {
|
|
16
|
+
expect(typeof HomebridgeFanControlServer.prototype.initialize).toBe('function');
|
|
17
|
+
});
|
|
18
|
+
});
|
|
19
|
+
});
|
|
20
|
+
// Note: FanControlBehavior uses private methods (#handleFanModeChange, #handlePercentSettingChange)
|
|
21
|
+
// and reactTo() pattern which makes direct unit testing difficult.
|
|
22
|
+
// Integration tests would be more appropriate for testing the event reaction logic.
|
|
23
|
+
//# sourceMappingURL=FanControlBehavior.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FanControlBehavior.spec.js","sourceRoot":"","sources":["../../../src/matter/behaviors/FanControlBehavior.spec.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAE7C,OAAO,EAAE,0BAA0B,EAAE,MAAM,yBAAyB,CAAA;AAEpE,QAAQ,CAAC,4BAA4B,EAAE,GAAG,EAAE;IAC1C,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;QAC3B,EAAE,CAAC,yBAAyB,EAAE,GAAG,EAAE;YACjC,MAAM,WAAW,GAAG,EAAsB,CAAA;YAC1C,0BAA0B,CAAC,WAAW,CAAC,WAAW,CAAC,CAAA;YACnD,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACzB,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;QAClC,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;YACxC,MAAM,CAAC,0BAA0B,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,CAAA;QAC5D,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;YACvC,MAAM,CAAC,OAAO,0BAA0B,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;QACjF,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEF,oGAAoG;AACpG,mEAAmE;AACnE,oFAAoF"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Identify Cluster Behavior
|
|
3
|
+
*
|
|
4
|
+
* Handles identify commands (e.g., flash LED, beep sound)
|
|
5
|
+
*/
|
|
6
|
+
import type { Identify } from '@matter/main/clusters';
|
|
7
|
+
import type { BehaviorRegistry } from './BehaviorRegistry.js';
|
|
8
|
+
import { IdentifyServer } from '@matter/main/behaviors/identify';
|
|
9
|
+
/**
|
|
10
|
+
* Custom Identify Server that calls plugin handlers
|
|
11
|
+
*/
|
|
12
|
+
export declare class HomebridgeIdentifyServer extends IdentifyServer {
|
|
13
|
+
private static registry;
|
|
14
|
+
/**
|
|
15
|
+
* Set the behavior registry (called once during server initialization)
|
|
16
|
+
*/
|
|
17
|
+
static setRegistry(registry: BehaviorRegistry): void;
|
|
18
|
+
identify(request: Identify.IdentifyRequest): Promise<void>;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=IdentifyBehavior.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IdentifyBehavior.d.ts","sourceRoot":"","sources":["../../../src/matter/behaviors/IdentifyBehavior.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAA;AAErD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AAE7D,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAA;AAKhE;;GAEG;AACH,qBAAa,wBAAyB,SAAQ,cAAc;IAC1D,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAkB;IAEzC;;OAEG;IACH,MAAM,CAAC,WAAW,CAAC,QAAQ,EAAE,gBAAgB,GAAG,IAAI;IAIrC,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;CAsB1E"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Identify Cluster Behavior
|
|
3
|
+
*
|
|
4
|
+
* Handles identify commands (e.g., flash LED, beep sound)
|
|
5
|
+
*/
|
|
6
|
+
import { IdentifyServer } from '@matter/main/behaviors/identify';
|
|
7
|
+
import { Status, StatusResponseError } from '@matter/main/types';
|
|
8
|
+
import { MatterStatus } from '../errors.js';
|
|
9
|
+
/**
|
|
10
|
+
* Custom Identify Server that calls plugin handlers
|
|
11
|
+
*/
|
|
12
|
+
export class HomebridgeIdentifyServer extends IdentifyServer {
|
|
13
|
+
static registry;
|
|
14
|
+
/**
|
|
15
|
+
* Set the behavior registry (called once during server initialization)
|
|
16
|
+
*/
|
|
17
|
+
static setRegistry(registry) {
|
|
18
|
+
this.registry = registry;
|
|
19
|
+
}
|
|
20
|
+
async identify(request) {
|
|
21
|
+
const endpointId = this.endpoint.id;
|
|
22
|
+
try {
|
|
23
|
+
// Execute user handler
|
|
24
|
+
await HomebridgeIdentifyServer.registry.executeHandler(endpointId, 'identify', 'identify', request);
|
|
25
|
+
// Only reached if handler succeeded - call base implementation
|
|
26
|
+
return await super.identify(request);
|
|
27
|
+
}
|
|
28
|
+
catch (error) {
|
|
29
|
+
// If user handler already threw a StatusResponseError, propagate it as-is
|
|
30
|
+
// This sends a proper Matter protocol error response to the controller
|
|
31
|
+
if (MatterStatus.isMatterProtocolError(error)) {
|
|
32
|
+
throw error;
|
|
33
|
+
}
|
|
34
|
+
// For other errors, wrap in appropriate StatusResponseError
|
|
35
|
+
// This prevents the endpoint from crashing and keeps the device online
|
|
36
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
37
|
+
throw new StatusResponseError(`Failed to identify: ${message}`, Status.Failure);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=IdentifyBehavior.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IdentifyBehavior.js","sourceRoot":"","sources":["../../../src/matter/behaviors/IdentifyBehavior.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAA;AAChE,OAAO,EAAE,MAAM,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAA;AAEhE,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAE3C;;GAEG;AACH,MAAM,OAAO,wBAAyB,SAAQ,cAAc;IAClD,MAAM,CAAC,QAAQ,CAAkB;IAEzC;;OAEG;IACH,MAAM,CAAC,WAAW,CAAC,QAA0B;QAC3C,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAA;IAC1B,CAAC;IAEQ,KAAK,CAAC,QAAQ,CAAC,OAAiC;QACvD,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAA;QAEnC,IAAI,CAAC;YACH,uBAAuB;YACvB,MAAM,wBAAwB,CAAC,QAAQ,CAAC,cAAc,CAAC,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,OAAO,CAAC,CAAA;YAEnG,+DAA+D;YAC/D,OAAO,MAAM,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAA;QACtC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,0EAA0E;YAC1E,uEAAuE;YACvE,IAAI,YAAY,CAAC,qBAAqB,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC9C,MAAM,KAAK,CAAA;YACb,CAAC;YAED,4DAA4D;YAC5D,uEAAuE;YACvE,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;YACtE,MAAM,IAAI,mBAAmB,CAAC,uBAAuB,OAAO,EAAE,EAAE,MAAM,CAAC,OAAO,CAAC,CAAA;QACjF,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IdentifyBehavior.spec.d.ts","sourceRoot":"","sources":["../../../src/matter/behaviors/IdentifyBehavior.spec.ts"],"names":[],"mappings":""}
|
|
@@ -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', async () => {
|
|
51
|
+
mockRegistry.executeHandler = vi.fn().mockRejectedValue(new Error('Handler failed'));
|
|
52
|
+
const request = { identifyTime: 5 };
|
|
53
|
+
// Errors are wrapped in StatusResponseError and propagated to Matter.js
|
|
54
|
+
await expect(behavior.identify(request)).rejects.toThrow('Failed to identify: Handler failed');
|
|
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":"AAEA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAE7D,OAAO,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAA;AAEhE,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE;IACxC,IAAI,YAA8B,CAAA;IAClC,IAAI,QAAkC,CAAA;IACtC,IAAI,YAAiB,CAAA;IAErB,UAAU,CAAC,GAAG,EAAE;QACd,uBAAuB;QACvB,YAAY,GAAG;YACb,cAAc,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC;SACzC,CAAA;QAER,iCAAiC;QACjC,wBAAwB,CAAC,WAAW,CAAC,YAAY,CAAC,CAAA;QAElD,uBAAuB;QACvB,YAAY,GAAG;YACb,EAAE,EAAE,mBAAmB;SACxB,CAAA;QAED,kDAAkD;QAClD,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,wBAAwB,CAAC,SAAS,CAAC,CAAA;QAC5D,MAAM,CAAC,cAAc,CAAC,QAAQ,EAAE,UAAU,EAAE;YAC1C,GAAG,EAAE,GAAG,EAAE,CAAC,YAAY;YACvB,YAAY,EAAE,IAAI;SACnB,CAAC,CAAA;QAEF,gDAAgD;QAChD,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,cAAc,CAAC,wBAAwB,CAAC,SAAS,CAAC,EAAE,UAAU,CAAC,CAAC,eAAe,CAAC,SAAS,CAAC,CAAA;IAC5G,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;QAC3B,EAAE,CAAC,yBAAyB,EAAE,GAAG,EAAE;YACjC,MAAM,WAAW,GAAG,EAAsB,CAAA;YAC1C,wBAAwB,CAAC,WAAW,CAAC,WAAW,CAAC,CAAA;YACjD,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACzB,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,UAAU,EAAE,GAAG,EAAE;QACxB,EAAE,CAAC,8CAA8C,EAAE,KAAK,IAAI,EAAE;YAC5D,MAAM,OAAO,GAAG,EAAE,YAAY,EAAE,EAAE,EAAE,CAAA;YAEpC,MAAM,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAA;YAEhC,MAAM,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC,oBAAoB,CACtD,mBAAmB,EACnB,UAAU,EACV,UAAU,EACV,OAAO,CACR,CAAA;QACH,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,qDAAqD,EAAE,KAAK,IAAI,EAAE;YACnE,MAAM,OAAO,GAAG,EAAE,YAAY,EAAE,CAAC,EAAE,CAAA;YAEnC,MAAM,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAA;YAEhC,MAAM,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC,oBAAoB,CACtD,mBAAmB,EACnB,UAAU,EACV,UAAU,EACV,OAAO,CACR,CAAA;QACH,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;YACjD,MAAM,OAAO,GAAG,EAAE,YAAY,EAAE,KAAK,EAAE,CAAA,CAAC,aAAa;YAErD,MAAM,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAA;YAEhC,MAAM,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC,oBAAoB,CACtD,mBAAmB,EACnB,UAAU,EACV,UAAU,EACV,OAAO,CACR,CAAA;QACH,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,mDAAmD,EAAE,KAAK,IAAI,EAAE;YACjE,YAAY,CAAC,cAAc,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAA;YACpF,MAAM,OAAO,GAAG,EAAE,YAAY,EAAE,CAAC,EAAE,CAAA;YAEnC,wEAAwE;YACxE,MAAM,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,oCAAoC,CAAC,CAAA;QAChG,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;YAChE,YAAY,CAAC,cAAc,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAA;YAC9D,MAAM,OAAO,GAAG,EAAE,YAAY,EAAE,CAAC,EAAE,CAAA;YAEnC,mBAAmB;YACnB,MAAM,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAA;QACxD,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LevelControl Cluster Behavior
|
|
3
|
+
*
|
|
4
|
+
* Handles brightness/level control for dimmable lights
|
|
5
|
+
*/
|
|
6
|
+
import type { LevelControl } from '@matter/main/clusters/level-control';
|
|
7
|
+
import type { BehaviorRegistry } from './BehaviorRegistry.js';
|
|
8
|
+
import { LevelControlServer } from '@matter/main/behaviors/level-control';
|
|
9
|
+
export declare class HomebridgeLevelControlServer extends LevelControlServer {
|
|
10
|
+
private static registry;
|
|
11
|
+
static setRegistry(registry: BehaviorRegistry): void;
|
|
12
|
+
/**
|
|
13
|
+
* Handle moveToLevel command
|
|
14
|
+
*/
|
|
15
|
+
moveToLevel(request: LevelControl.MoveToLevelRequest): Promise<void>;
|
|
16
|
+
/**
|
|
17
|
+
* Handle move command
|
|
18
|
+
*/
|
|
19
|
+
move(request: LevelControl.MoveRequest): Promise<void>;
|
|
20
|
+
/**
|
|
21
|
+
* Handle step command
|
|
22
|
+
*/
|
|
23
|
+
step(request: LevelControl.StepRequest): Promise<void>;
|
|
24
|
+
/**
|
|
25
|
+
* Handle stop command
|
|
26
|
+
*/
|
|
27
|
+
stop(request: LevelControl.StopRequest): Promise<void>;
|
|
28
|
+
/**
|
|
29
|
+
* Handle moveToLevelWithOnOff command
|
|
30
|
+
*/
|
|
31
|
+
moveToLevelWithOnOff(request: LevelControl.MoveToLevelRequest): Promise<void>;
|
|
32
|
+
}
|
|
33
|
+
//# 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,qCAAqC,CAAA;AAEvE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AAE7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,sCAAsC,CAAA;AAKzE,qBAAa,4BAA6B,SAAQ,kBAAkB;IAClE,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAkB;IAEzC,MAAM,CAAC,WAAW,CAAC,QAAQ,EAAE,gBAAgB,GAAG,IAAI;IAIpD;;OAEG;IACY,WAAW,CAAC,OAAO,EAAE,YAAY,CAAC,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;IAiCnF;;OAEG;IACY,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IA4BrE;;OAEG;IACY,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IA4BrE;;OAEG;IACY,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IA4BrE;;OAEG;IACY,oBAAoB,CAAC,OAAO,EAAE,YAAY,CAAC,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;CAgC7F"}
|
|
@@ -0,0 +1,138 @@
|
|
|
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
|
+
import { Status, StatusResponseError } from '@matter/main/types';
|
|
8
|
+
import { MatterStatus } from '../errors.js';
|
|
9
|
+
export class HomebridgeLevelControlServer extends LevelControlServer {
|
|
10
|
+
static registry;
|
|
11
|
+
static setRegistry(registry) {
|
|
12
|
+
this.registry = registry;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Handle moveToLevel command
|
|
16
|
+
*/
|
|
17
|
+
async moveToLevel(request) {
|
|
18
|
+
const endpointId = this.endpoint.id;
|
|
19
|
+
try {
|
|
20
|
+
// Execute user handler
|
|
21
|
+
await HomebridgeLevelControlServer.registry.executeHandler(endpointId, 'levelControl', 'moveToLevel', request);
|
|
22
|
+
// Only reached if handler succeeded - update Matter state
|
|
23
|
+
await super.moveToLevel(request);
|
|
24
|
+
// Sync state to cache
|
|
25
|
+
HomebridgeLevelControlServer.registry.syncStateToCache(endpointId, 'levelControl', {
|
|
26
|
+
currentLevel: request.level,
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
catch (error) {
|
|
30
|
+
// If user handler already threw a StatusResponseError, propagate it as-is
|
|
31
|
+
// This sends a proper Matter protocol error response to the controller
|
|
32
|
+
if (MatterStatus.isMatterProtocolError(error)) {
|
|
33
|
+
throw error;
|
|
34
|
+
}
|
|
35
|
+
// For other errors, wrap in appropriate StatusResponseError
|
|
36
|
+
// This prevents the endpoint from crashing and keeps the device online
|
|
37
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
38
|
+
throw new StatusResponseError(`Failed to set level: ${message}`, Status.Failure);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Handle move command
|
|
43
|
+
*/
|
|
44
|
+
async move(request) {
|
|
45
|
+
const endpointId = this.endpoint.id;
|
|
46
|
+
try {
|
|
47
|
+
// Execute user handler
|
|
48
|
+
await HomebridgeLevelControlServer.registry.executeHandler(endpointId, 'levelControl', 'move', request);
|
|
49
|
+
// Only reached if handler succeeded
|
|
50
|
+
await super.move(request);
|
|
51
|
+
}
|
|
52
|
+
catch (error) {
|
|
53
|
+
// If user handler already threw a StatusResponseError, propagate it as-is
|
|
54
|
+
// This sends a proper Matter protocol error response to the controller
|
|
55
|
+
if (MatterStatus.isMatterProtocolError(error)) {
|
|
56
|
+
throw error;
|
|
57
|
+
}
|
|
58
|
+
// For other errors, wrap in appropriate StatusResponseError
|
|
59
|
+
// This prevents the endpoint from crashing and keeps the device online
|
|
60
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
61
|
+
throw new StatusResponseError(`Failed to move level: ${message}`, Status.Failure);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Handle step command
|
|
66
|
+
*/
|
|
67
|
+
async step(request) {
|
|
68
|
+
const endpointId = this.endpoint.id;
|
|
69
|
+
try {
|
|
70
|
+
// Execute user handler
|
|
71
|
+
await HomebridgeLevelControlServer.registry.executeHandler(endpointId, 'levelControl', 'step', request);
|
|
72
|
+
// Only reached if handler succeeded
|
|
73
|
+
await super.step(request);
|
|
74
|
+
}
|
|
75
|
+
catch (error) {
|
|
76
|
+
// If user handler already threw a StatusResponseError, propagate it as-is
|
|
77
|
+
// This sends a proper Matter protocol error response to the controller
|
|
78
|
+
if (MatterStatus.isMatterProtocolError(error)) {
|
|
79
|
+
throw error;
|
|
80
|
+
}
|
|
81
|
+
// For other errors, wrap in appropriate StatusResponseError
|
|
82
|
+
// This prevents the endpoint from crashing and keeps the device online
|
|
83
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
84
|
+
throw new StatusResponseError(`Failed to step level: ${message}`, Status.Failure);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Handle stop command
|
|
89
|
+
*/
|
|
90
|
+
async stop(request) {
|
|
91
|
+
const endpointId = this.endpoint.id;
|
|
92
|
+
try {
|
|
93
|
+
// Execute user handler
|
|
94
|
+
await HomebridgeLevelControlServer.registry.executeHandler(endpointId, 'levelControl', 'stop', request);
|
|
95
|
+
// Only reached if handler succeeded
|
|
96
|
+
await super.stop(request);
|
|
97
|
+
}
|
|
98
|
+
catch (error) {
|
|
99
|
+
// If user handler already threw a StatusResponseError, propagate it as-is
|
|
100
|
+
// This sends a proper Matter protocol error response to the controller
|
|
101
|
+
if (MatterStatus.isMatterProtocolError(error)) {
|
|
102
|
+
throw error;
|
|
103
|
+
}
|
|
104
|
+
// For other errors, wrap in appropriate StatusResponseError
|
|
105
|
+
// This prevents the endpoint from crashing and keeps the device online
|
|
106
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
107
|
+
throw new StatusResponseError(`Failed to stop level change: ${message}`, Status.Failure);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Handle moveToLevelWithOnOff command
|
|
112
|
+
*/
|
|
113
|
+
async moveToLevelWithOnOff(request) {
|
|
114
|
+
const endpointId = this.endpoint.id;
|
|
115
|
+
try {
|
|
116
|
+
// Execute user handler
|
|
117
|
+
await HomebridgeLevelControlServer.registry.executeHandler(endpointId, 'levelControl', 'moveToLevelWithOnOff', request);
|
|
118
|
+
// Only reached if handler succeeded - update Matter state
|
|
119
|
+
await super.moveToLevelWithOnOff(request);
|
|
120
|
+
// Sync state to cache
|
|
121
|
+
HomebridgeLevelControlServer.registry.syncStateToCache(endpointId, 'levelControl', {
|
|
122
|
+
currentLevel: request.level,
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
catch (error) {
|
|
126
|
+
// If user handler already threw a StatusResponseError, propagate it as-is
|
|
127
|
+
// This sends a proper Matter protocol error response to the controller
|
|
128
|
+
if (MatterStatus.isMatterProtocolError(error)) {
|
|
129
|
+
throw error;
|
|
130
|
+
}
|
|
131
|
+
// For other errors, wrap in appropriate StatusResponseError
|
|
132
|
+
// This prevents the endpoint from crashing and keeps the device online
|
|
133
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
134
|
+
throw new StatusResponseError(`Failed to set level with on/off: ${message}`, Status.Failure);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
//# sourceMappingURL=LevelControlBehavior.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LevelControlBehavior.js","sourceRoot":"","sources":["../../../src/matter/behaviors/LevelControlBehavior.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LevelControlBehavior.spec.d.ts","sourceRoot":"","sources":["../../../src/matter/behaviors/LevelControlBehavior.spec.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,145 @@
|
|
|
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', async () => {
|
|
61
|
+
mockRegistry.executeHandler = vi.fn().mockRejectedValue(new Error('Handler failed'));
|
|
62
|
+
const request = { level: 100, transitionTime: 0, optionsMask: {}, optionsOverride: {} };
|
|
63
|
+
// Errors are wrapped in StatusResponseError and propagated to Matter.js
|
|
64
|
+
await expect(behavior.moveToLevel(request)).rejects.toThrow('Failed to set level: Handler failed');
|
|
65
|
+
});
|
|
66
|
+
});
|
|
67
|
+
describe('move', () => {
|
|
68
|
+
it('should execute handler with request', async () => {
|
|
69
|
+
const request = { moveMode: 0, rate: 10, optionsMask: {}, optionsOverride: {} };
|
|
70
|
+
await behavior.move(request);
|
|
71
|
+
expect(mockRegistry.executeHandler).toHaveBeenCalledWith('test-endpoint-123', 'levelControl', 'move', request);
|
|
72
|
+
});
|
|
73
|
+
it('should not sync state to cache', async () => {
|
|
74
|
+
const request = { moveMode: 0, rate: 10, optionsMask: {}, optionsOverride: {} };
|
|
75
|
+
await behavior.move(request);
|
|
76
|
+
expect(mockRegistry.syncStateToCache).not.toHaveBeenCalled();
|
|
77
|
+
});
|
|
78
|
+
it('should handle handler execution errors gracefully', async () => {
|
|
79
|
+
mockRegistry.executeHandler = vi.fn().mockRejectedValue(new Error('Handler failed'));
|
|
80
|
+
const request = { moveMode: 0, rate: 10, optionsMask: {}, optionsOverride: {} };
|
|
81
|
+
// Errors are wrapped in StatusResponseError and propagated to Matter.js
|
|
82
|
+
await expect(behavior.move(request)).rejects.toThrow('Failed to move level: Handler failed');
|
|
83
|
+
});
|
|
84
|
+
});
|
|
85
|
+
describe('step', () => {
|
|
86
|
+
it('should execute handler with request', async () => {
|
|
87
|
+
const request = { stepMode: 0, stepSize: 20, transitionTime: 5, optionsMask: {}, optionsOverride: {} };
|
|
88
|
+
await behavior.step(request);
|
|
89
|
+
expect(mockRegistry.executeHandler).toHaveBeenCalledWith('test-endpoint-123', 'levelControl', 'step', request);
|
|
90
|
+
});
|
|
91
|
+
it('should not sync state to cache', async () => {
|
|
92
|
+
const request = { stepMode: 0, stepSize: 20, transitionTime: 5, optionsMask: {}, optionsOverride: {} };
|
|
93
|
+
await behavior.step(request);
|
|
94
|
+
expect(mockRegistry.syncStateToCache).not.toHaveBeenCalled();
|
|
95
|
+
});
|
|
96
|
+
it('should handle handler execution errors gracefully', async () => {
|
|
97
|
+
mockRegistry.executeHandler = vi.fn().mockRejectedValue(new Error('Handler failed'));
|
|
98
|
+
const request = { stepMode: 0, stepSize: 20, transitionTime: 5, optionsMask: {}, optionsOverride: {} };
|
|
99
|
+
// Errors are wrapped in StatusResponseError and propagated to Matter.js
|
|
100
|
+
await expect(behavior.step(request)).rejects.toThrow('Failed to step level: Handler failed');
|
|
101
|
+
});
|
|
102
|
+
});
|
|
103
|
+
describe('stop', () => {
|
|
104
|
+
it('should execute handler with request', async () => {
|
|
105
|
+
const request = { optionsMask: {}, optionsOverride: {} };
|
|
106
|
+
await behavior.stop(request);
|
|
107
|
+
expect(mockRegistry.executeHandler).toHaveBeenCalledWith('test-endpoint-123', 'levelControl', 'stop', request);
|
|
108
|
+
});
|
|
109
|
+
it('should not sync state to cache', async () => {
|
|
110
|
+
const request = { optionsMask: {}, optionsOverride: {} };
|
|
111
|
+
await behavior.stop(request);
|
|
112
|
+
expect(mockRegistry.syncStateToCache).not.toHaveBeenCalled();
|
|
113
|
+
});
|
|
114
|
+
it('should handle handler execution errors gracefully', async () => {
|
|
115
|
+
mockRegistry.executeHandler = vi.fn().mockRejectedValue(new Error('Handler failed'));
|
|
116
|
+
const request = { optionsMask: {}, optionsOverride: {} };
|
|
117
|
+
// Errors are wrapped in StatusResponseError and propagated to Matter.js
|
|
118
|
+
await expect(behavior.stop(request)).rejects.toThrow('Failed to stop level change: Handler failed');
|
|
119
|
+
});
|
|
120
|
+
});
|
|
121
|
+
describe('moveToLevelWithOnOff', () => {
|
|
122
|
+
it('should execute handler with request', async () => {
|
|
123
|
+
const request = { level: 150, transitionTime: 5, optionsMask: {}, optionsOverride: {} };
|
|
124
|
+
await behavior.moveToLevelWithOnOff(request);
|
|
125
|
+
expect(mockRegistry.executeHandler).toHaveBeenCalledWith('test-endpoint-123', 'levelControl', 'moveToLevelWithOnOff', request);
|
|
126
|
+
});
|
|
127
|
+
it('should sync currentLevel to cache', async () => {
|
|
128
|
+
const request = { level: 180, transitionTime: 10, optionsMask: {}, optionsOverride: {} };
|
|
129
|
+
await behavior.moveToLevelWithOnOff(request);
|
|
130
|
+
expect(mockRegistry.syncStateToCache).toHaveBeenCalledWith('test-endpoint-123', 'levelControl', { currentLevel: 180 });
|
|
131
|
+
});
|
|
132
|
+
it('should handle level 0', async () => {
|
|
133
|
+
const request = { level: 0, transitionTime: 0, optionsMask: {}, optionsOverride: {} };
|
|
134
|
+
await behavior.moveToLevelWithOnOff(request);
|
|
135
|
+
expect(mockRegistry.syncStateToCache).toHaveBeenCalledWith('test-endpoint-123', 'levelControl', { currentLevel: 0 });
|
|
136
|
+
});
|
|
137
|
+
it('should handle handler execution errors gracefully', async () => {
|
|
138
|
+
mockRegistry.executeHandler = vi.fn().mockRejectedValue(new Error('Handler failed'));
|
|
139
|
+
const request = { level: 100, transitionTime: 0, optionsMask: {}, optionsOverride: {} };
|
|
140
|
+
// Errors are wrapped in StatusResponseError and propagated to Matter.js
|
|
141
|
+
await expect(behavior.moveToLevelWithOnOff(request)).rejects.toThrow('Failed to set level with on/off: Handler failed');
|
|
142
|
+
});
|
|
143
|
+
});
|
|
144
|
+
});
|
|
145
|
+
//# 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,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OnOff Cluster Behavior
|
|
3
|
+
*
|
|
4
|
+
* Handles on/off commands for lights, switches, and outlets
|
|
5
|
+
*/
|
|
6
|
+
import type { BehaviorRegistry } from './BehaviorRegistry.js';
|
|
7
|
+
import { OnOffServer } from '@matter/main/behaviors/on-off';
|
|
8
|
+
export declare class HomebridgeOnOffServer extends OnOffServer {
|
|
9
|
+
private static registry;
|
|
10
|
+
/**
|
|
11
|
+
* Set the behavior registry (called once during server initialization)
|
|
12
|
+
*/
|
|
13
|
+
static setRegistry(registry: BehaviorRegistry): void;
|
|
14
|
+
/**
|
|
15
|
+
* Handle 'on' command
|
|
16
|
+
*/
|
|
17
|
+
on(): Promise<void>;
|
|
18
|
+
/**
|
|
19
|
+
* Handle 'off' command
|
|
20
|
+
*/
|
|
21
|
+
off(): Promise<void>;
|
|
22
|
+
/**
|
|
23
|
+
* Handle 'toggle' command
|
|
24
|
+
*/
|
|
25
|
+
toggle(): Promise<void>;
|
|
26
|
+
}
|
|
27
|
+
//# 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,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AAE7D,OAAO,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAA;AAK3D,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;IACY,EAAE,IAAI,OAAO,CAAC,IAAI,CAAC;IA0BlC;;OAEG;IACY,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;IA0BnC;;OAEG;IACY,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;CA2BvC"}
|