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,158 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WindowCovering Cluster Behavior
|
|
3
|
+
*
|
|
4
|
+
* Handles window covering commands for blinds, shades, and curtains
|
|
5
|
+
*/
|
|
6
|
+
import { WindowCoveringBaseServer } from '@matter/main/behaviors/window-covering';
|
|
7
|
+
import { Status, StatusResponseError } from '@matter/main/types';
|
|
8
|
+
import { MatterStatus } from '../errors.js';
|
|
9
|
+
/**
|
|
10
|
+
* WindowCovering state property names
|
|
11
|
+
* These correspond to the Matter.js WindowCovering cluster attribute names
|
|
12
|
+
*/
|
|
13
|
+
const WindowCoveringStateProps = {
|
|
14
|
+
targetPositionLiftPercent100ths: 'targetPositionLiftPercent100ths',
|
|
15
|
+
currentPositionLiftPercent100ths: 'currentPositionLiftPercent100ths',
|
|
16
|
+
targetPositionTiltPercent100ths: 'targetPositionTiltPercent100ths',
|
|
17
|
+
currentPositionTiltPercent100ths: 'currentPositionTiltPercent100ths',
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
20
|
+
* Custom WindowCovering Server that calls plugin handlers
|
|
21
|
+
*/
|
|
22
|
+
export class HomebridgeWindowCoveringServer extends WindowCoveringBaseServer {
|
|
23
|
+
static registry;
|
|
24
|
+
/**
|
|
25
|
+
* Set the behavior registry (called once during server initialization)
|
|
26
|
+
*/
|
|
27
|
+
static setRegistry(registry) {
|
|
28
|
+
this.registry = registry;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Sync window covering position state to cache
|
|
32
|
+
* @param endpointId - The endpoint ID
|
|
33
|
+
* @param targetProperty - Target position property name (e.g., 'targetPositionLiftPercent100ths')
|
|
34
|
+
* @param currentProperty - Current position property name (e.g., 'currentPositionLiftPercent100ths')
|
|
35
|
+
*/
|
|
36
|
+
syncPositionStateToCache(endpointId, targetProperty, currentProperty) {
|
|
37
|
+
const currentState = this.state;
|
|
38
|
+
const stateUpdate = {};
|
|
39
|
+
if (currentState[targetProperty] !== undefined) {
|
|
40
|
+
stateUpdate[targetProperty] = currentState[targetProperty];
|
|
41
|
+
}
|
|
42
|
+
if (currentState[currentProperty] !== undefined) {
|
|
43
|
+
stateUpdate[currentProperty] = currentState[currentProperty];
|
|
44
|
+
}
|
|
45
|
+
HomebridgeWindowCoveringServer.registry.syncStateToCache(endpointId, 'windowCovering', stateUpdate);
|
|
46
|
+
}
|
|
47
|
+
async upOrOpen() {
|
|
48
|
+
const endpointId = this.endpoint.id;
|
|
49
|
+
try {
|
|
50
|
+
// Execute user handler
|
|
51
|
+
await HomebridgeWindowCoveringServer.registry.executeHandler(endpointId, 'windowCovering', 'upOrOpen');
|
|
52
|
+
// Only reached if handler succeeded - update Matter state
|
|
53
|
+
await super.upOrOpen();
|
|
54
|
+
// Sync state to cache - window covering opening
|
|
55
|
+
this.syncPositionStateToCache(endpointId, WindowCoveringStateProps.targetPositionLiftPercent100ths, WindowCoveringStateProps.currentPositionLiftPercent100ths);
|
|
56
|
+
}
|
|
57
|
+
catch (error) {
|
|
58
|
+
// If user handler already threw a StatusResponseError, propagate it as-is
|
|
59
|
+
// This sends a proper Matter protocol error response to the controller
|
|
60
|
+
if (MatterStatus.isMatterProtocolError(error)) {
|
|
61
|
+
throw error;
|
|
62
|
+
}
|
|
63
|
+
// For other errors, wrap in appropriate StatusResponseError
|
|
64
|
+
// This prevents the endpoint from crashing and keeps the device online
|
|
65
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
66
|
+
throw new StatusResponseError(`Failed to open window covering: ${message}`, Status.Failure);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
async downOrClose() {
|
|
70
|
+
const endpointId = this.endpoint.id;
|
|
71
|
+
try {
|
|
72
|
+
// Execute user handler
|
|
73
|
+
await HomebridgeWindowCoveringServer.registry.executeHandler(endpointId, 'windowCovering', 'downOrClose');
|
|
74
|
+
// Only reached if handler succeeded - update Matter state
|
|
75
|
+
await super.downOrClose();
|
|
76
|
+
// Sync state to cache - window covering closing
|
|
77
|
+
this.syncPositionStateToCache(endpointId, WindowCoveringStateProps.targetPositionLiftPercent100ths, WindowCoveringStateProps.currentPositionLiftPercent100ths);
|
|
78
|
+
}
|
|
79
|
+
catch (error) {
|
|
80
|
+
// If user handler already threw a StatusResponseError, propagate it as-is
|
|
81
|
+
// This sends a proper Matter protocol error response to the controller
|
|
82
|
+
if (MatterStatus.isMatterProtocolError(error)) {
|
|
83
|
+
throw error;
|
|
84
|
+
}
|
|
85
|
+
// For other errors, wrap in appropriate StatusResponseError
|
|
86
|
+
// This prevents the endpoint from crashing and keeps the device online
|
|
87
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
88
|
+
throw new StatusResponseError(`Failed to close window covering: ${message}`, Status.Failure);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
async stopMotion() {
|
|
92
|
+
const endpointId = this.endpoint.id;
|
|
93
|
+
try {
|
|
94
|
+
// Execute user handler
|
|
95
|
+
await HomebridgeWindowCoveringServer.registry.executeHandler(endpointId, 'windowCovering', 'stopMotion');
|
|
96
|
+
// Only reached if handler succeeded - update Matter state
|
|
97
|
+
await super.stopMotion();
|
|
98
|
+
// Sync state to cache - window covering stopped
|
|
99
|
+
this.syncPositionStateToCache(endpointId, WindowCoveringStateProps.targetPositionLiftPercent100ths, WindowCoveringStateProps.currentPositionLiftPercent100ths);
|
|
100
|
+
}
|
|
101
|
+
catch (error) {
|
|
102
|
+
// If user handler already threw a StatusResponseError, propagate it as-is
|
|
103
|
+
// This sends a proper Matter protocol error response to the controller
|
|
104
|
+
if (MatterStatus.isMatterProtocolError(error)) {
|
|
105
|
+
throw error;
|
|
106
|
+
}
|
|
107
|
+
// For other errors, wrap in appropriate StatusResponseError
|
|
108
|
+
// This prevents the endpoint from crashing and keeps the device online
|
|
109
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
110
|
+
throw new StatusResponseError(`Failed to stop window covering: ${message}`, Status.Failure);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
async goToLiftPercentage(request) {
|
|
114
|
+
const endpointId = this.endpoint.id;
|
|
115
|
+
try {
|
|
116
|
+
// Execute user handler
|
|
117
|
+
await HomebridgeWindowCoveringServer.registry.executeHandler(endpointId, 'windowCovering', 'goToLiftPercentage', request);
|
|
118
|
+
// Only reached if handler succeeded - update Matter state
|
|
119
|
+
await super.goToLiftPercentage(request);
|
|
120
|
+
// Sync state to cache - window covering moving to target position
|
|
121
|
+
this.syncPositionStateToCache(endpointId, WindowCoveringStateProps.targetPositionLiftPercent100ths, WindowCoveringStateProps.currentPositionLiftPercent100ths);
|
|
122
|
+
}
|
|
123
|
+
catch (error) {
|
|
124
|
+
// If user handler already threw a StatusResponseError, propagate it as-is
|
|
125
|
+
// This sends a proper Matter protocol error response to the controller
|
|
126
|
+
if (MatterStatus.isMatterProtocolError(error)) {
|
|
127
|
+
throw error;
|
|
128
|
+
}
|
|
129
|
+
// For other errors, wrap in appropriate StatusResponseError
|
|
130
|
+
// This prevents the endpoint from crashing and keeps the device online
|
|
131
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
132
|
+
throw new StatusResponseError(`Failed to set window covering position: ${message}`, Status.Failure);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
async goToTiltPercentage(request) {
|
|
136
|
+
const endpointId = this.endpoint.id;
|
|
137
|
+
try {
|
|
138
|
+
// Execute user handler
|
|
139
|
+
await HomebridgeWindowCoveringServer.registry.executeHandler(endpointId, 'windowCovering', 'goToTiltPercentage', request);
|
|
140
|
+
// Only reached if handler succeeded - update Matter state
|
|
141
|
+
await super.goToTiltPercentage(request);
|
|
142
|
+
// Sync state to cache - window covering tilting to target angle
|
|
143
|
+
this.syncPositionStateToCache(endpointId, WindowCoveringStateProps.targetPositionTiltPercent100ths, WindowCoveringStateProps.currentPositionTiltPercent100ths);
|
|
144
|
+
}
|
|
145
|
+
catch (error) {
|
|
146
|
+
// If user handler already threw a StatusResponseError, propagate it as-is
|
|
147
|
+
// This sends a proper Matter protocol error response to the controller
|
|
148
|
+
if (MatterStatus.isMatterProtocolError(error)) {
|
|
149
|
+
throw error;
|
|
150
|
+
}
|
|
151
|
+
// For other errors, wrap in appropriate StatusResponseError
|
|
152
|
+
// This prevents the endpoint from crashing and keeps the device online
|
|
153
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
154
|
+
throw new StatusResponseError(`Failed to set window covering tilt: ${message}`, Status.Failure);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
//# sourceMappingURL=WindowCoveringBehavior.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WindowCoveringBehavior.js","sourceRoot":"","sources":["../../../src/matter/behaviors/WindowCoveringBehavior.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WindowCoveringBehavior.spec.d.ts","sourceRoot":"","sources":["../../../src/matter/behaviors/WindowCoveringBehavior.spec.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest';
|
|
2
|
+
import { HomebridgeWindowCoveringServer } from './WindowCoveringBehavior.js';
|
|
3
|
+
describe('homebridgeWindowCoveringServer', () => {
|
|
4
|
+
describe('setRegistry', () => {
|
|
5
|
+
it('should set the registry', () => {
|
|
6
|
+
const newRegistry = {};
|
|
7
|
+
HomebridgeWindowCoveringServer.setRegistry(newRegistry);
|
|
8
|
+
expect(true).toBe(true);
|
|
9
|
+
});
|
|
10
|
+
});
|
|
11
|
+
describe('behavior structure', () => {
|
|
12
|
+
it('should extend WindowCoveringServer', () => {
|
|
13
|
+
expect(HomebridgeWindowCoveringServer.prototype).toBeDefined();
|
|
14
|
+
});
|
|
15
|
+
it('should have window covering command methods', () => {
|
|
16
|
+
expect(typeof HomebridgeWindowCoveringServer.prototype.upOrOpen).toBe('function');
|
|
17
|
+
expect(typeof HomebridgeWindowCoveringServer.prototype.downOrClose).toBe('function');
|
|
18
|
+
expect(typeof HomebridgeWindowCoveringServer.prototype.stopMotion).toBe('function');
|
|
19
|
+
expect(typeof HomebridgeWindowCoveringServer.prototype.goToLiftPercentage).toBe('function');
|
|
20
|
+
expect(typeof HomebridgeWindowCoveringServer.prototype.goToTiltPercentage).toBe('function');
|
|
21
|
+
});
|
|
22
|
+
});
|
|
23
|
+
});
|
|
24
|
+
// Note: WindowCoveringBehavior has complex position control with helper methods.
|
|
25
|
+
// Full unit testing would require mocking the entire Matter.js state machine.
|
|
26
|
+
// Integration tests would be more appropriate.
|
|
27
|
+
//# sourceMappingURL=WindowCoveringBehavior.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WindowCoveringBehavior.spec.js","sourceRoot":"","sources":["../../../src/matter/behaviors/WindowCoveringBehavior.spec.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAE7C,OAAO,EAAE,8BAA8B,EAAE,MAAM,6BAA6B,CAAA;AAE5E,QAAQ,CAAC,gCAAgC,EAAE,GAAG,EAAE;IAC9C,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;QAC3B,EAAE,CAAC,yBAAyB,EAAE,GAAG,EAAE;YACjC,MAAM,WAAW,GAAG,EAAsB,CAAA;YAC1C,8BAA8B,CAAC,WAAW,CAAC,WAAW,CAAC,CAAA;YACvD,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,oCAAoC,EAAE,GAAG,EAAE;YAC5C,MAAM,CAAC,8BAA8B,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,CAAA;QAChE,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;YACrD,MAAM,CAAC,OAAO,8BAA8B,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;YACjF,MAAM,CAAC,OAAO,8BAA8B,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;YACpF,MAAM,CAAC,OAAO,8BAA8B,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;YACnF,MAAM,CAAC,OAAO,8BAA8B,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;YAC3F,MAAM,CAAC,OAAO,8BAA8B,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;QAC7F,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEF,iFAAiF;AACjF,8EAA8E;AAC9E,+CAA+C"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Matter Behaviors Index
|
|
3
|
+
*
|
|
4
|
+
* Exports all behavior classes and the registry
|
|
5
|
+
*/
|
|
6
|
+
export { BehaviorRegistry } from './BehaviorRegistry.js';
|
|
7
|
+
export type { MatterAccessoryMap, MatterCommandHandler } from './BehaviorRegistry.js';
|
|
8
|
+
export { HomebridgeColorControlServer } from './ColorControlBehavior.js';
|
|
9
|
+
export { HomebridgeDoorLockServer } from './DoorLockBehavior.js';
|
|
10
|
+
export { HomebridgeFanControlServer } from './FanControlBehavior.js';
|
|
11
|
+
export { HomebridgeIdentifyServer } from './IdentifyBehavior.js';
|
|
12
|
+
export { HomebridgeLevelControlServer } from './LevelControlBehavior.js';
|
|
13
|
+
export { HomebridgeOnOffServer } from './OnOffBehavior.js';
|
|
14
|
+
export { HomebridgeRvcCleanModeServer } from './RvcCleanModeBehavior.js';
|
|
15
|
+
export { HomebridgeRvcOperationalStateServer } from './RvcOperationalStateBehavior.js';
|
|
16
|
+
export { HomebridgeRvcRunModeServer } from './RvcRunModeBehavior.js';
|
|
17
|
+
export { HomebridgeServiceAreaServer } from './ServiceAreaBehavior.js';
|
|
18
|
+
export { HomebridgeThermostatServer } from './ThermostatBehavior.js';
|
|
19
|
+
export { HomebridgeWindowCoveringServer } from './WindowCoveringBehavior.js';
|
|
20
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/matter/behaviors/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AACxD,YAAY,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAA;AAGrF,OAAO,EAAE,4BAA4B,EAAE,MAAM,2BAA2B,CAAA;AACxE,OAAO,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAA;AAChE,OAAO,EAAE,0BAA0B,EAAE,MAAM,yBAAyB,CAAA;AACpE,OAAO,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAA;AAChE,OAAO,EAAE,4BAA4B,EAAE,MAAM,2BAA2B,CAAA;AACxE,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAA;AAC1D,OAAO,EAAE,4BAA4B,EAAE,MAAM,2BAA2B,CAAA;AACxE,OAAO,EAAE,mCAAmC,EAAE,MAAM,kCAAkC,CAAA;AACtF,OAAO,EAAE,0BAA0B,EAAE,MAAM,yBAAyB,CAAA;AACpE,OAAO,EAAE,2BAA2B,EAAE,MAAM,0BAA0B,CAAA;AACtE,OAAO,EAAE,0BAA0B,EAAE,MAAM,yBAAyB,CAAA;AACpE,OAAO,EAAE,8BAA8B,EAAE,MAAM,6BAA6B,CAAA"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Matter Behaviors Index
|
|
3
|
+
*
|
|
4
|
+
* Exports all behavior classes and the registry
|
|
5
|
+
*/
|
|
6
|
+
// Export registry
|
|
7
|
+
export { BehaviorRegistry } from './BehaviorRegistry.js';
|
|
8
|
+
// Export all behaviors from individual files (alphabetically)
|
|
9
|
+
export { HomebridgeColorControlServer } from './ColorControlBehavior.js';
|
|
10
|
+
export { HomebridgeDoorLockServer } from './DoorLockBehavior.js';
|
|
11
|
+
export { HomebridgeFanControlServer } from './FanControlBehavior.js';
|
|
12
|
+
export { HomebridgeIdentifyServer } from './IdentifyBehavior.js';
|
|
13
|
+
export { HomebridgeLevelControlServer } from './LevelControlBehavior.js';
|
|
14
|
+
export { HomebridgeOnOffServer } from './OnOffBehavior.js';
|
|
15
|
+
export { HomebridgeRvcCleanModeServer } from './RvcCleanModeBehavior.js';
|
|
16
|
+
export { HomebridgeRvcOperationalStateServer } from './RvcOperationalStateBehavior.js';
|
|
17
|
+
export { HomebridgeRvcRunModeServer } from './RvcRunModeBehavior.js';
|
|
18
|
+
export { HomebridgeServiceAreaServer } from './ServiceAreaBehavior.js';
|
|
19
|
+
export { HomebridgeThermostatServer } from './ThermostatBehavior.js';
|
|
20
|
+
export { HomebridgeWindowCoveringServer } from './WindowCoveringBehavior.js';
|
|
21
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/matter/behaviors/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,kBAAkB;AAClB,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AAGxD,8DAA8D;AAC9D,OAAO,EAAE,4BAA4B,EAAE,MAAM,2BAA2B,CAAA;AACxE,OAAO,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAA;AAChE,OAAO,EAAE,0BAA0B,EAAE,MAAM,yBAAyB,CAAA;AACpE,OAAO,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAA;AAChE,OAAO,EAAE,4BAA4B,EAAE,MAAM,2BAA2B,CAAA;AACxE,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAA;AAC1D,OAAO,EAAE,4BAA4B,EAAE,MAAM,2BAA2B,CAAA;AACxE,OAAO,EAAE,mCAAmC,EAAE,MAAM,kCAAkC,CAAA;AACtF,OAAO,EAAE,0BAA0B,EAAE,MAAM,yBAAyB,CAAA;AACpE,OAAO,EAAE,2BAA2B,EAAE,MAAM,0BAA0B,CAAA;AACtE,OAAO,EAAE,0BAA0B,EAAE,MAAM,yBAAyB,CAAA;AACpE,OAAO,EAAE,8BAA8B,EAAE,MAAM,6BAA6B,CAAA"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Matter Configuration Validation
|
|
3
|
+
*
|
|
4
|
+
* Provides validation utilities and orchestration for Matter configuration objects.
|
|
5
|
+
* Includes both low-level validation primitives and high-level validation methods.
|
|
6
|
+
*/
|
|
7
|
+
import type { AccessoryConfig, PlatformConfig } from '../bridgeService.js';
|
|
8
|
+
/**
|
|
9
|
+
* Port validation result
|
|
10
|
+
*/
|
|
11
|
+
export interface PortValidationResult {
|
|
12
|
+
valid: boolean;
|
|
13
|
+
error?: string;
|
|
14
|
+
warning?: string;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Sanitization result
|
|
18
|
+
*/
|
|
19
|
+
export interface SanitizationResult<T> {
|
|
20
|
+
value: T;
|
|
21
|
+
warnings: string[];
|
|
22
|
+
}
|
|
23
|
+
export interface MatterConfigValidationResult {
|
|
24
|
+
isValid: boolean;
|
|
25
|
+
errors: string[];
|
|
26
|
+
warnings: string[];
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Validate a Matter port number
|
|
30
|
+
*
|
|
31
|
+
* @param port - Port number to validate
|
|
32
|
+
* @param checkConflicts - Whether to check for known conflicting ports
|
|
33
|
+
* @returns Validation result with error/warning messages
|
|
34
|
+
*/
|
|
35
|
+
export declare function validatePort(port: number, checkConflicts?: boolean): PortValidationResult;
|
|
36
|
+
/**
|
|
37
|
+
* Sanitize a unique ID for Matter filesystem storage
|
|
38
|
+
*
|
|
39
|
+
* Removes colons from MAC addresses and converts to uppercase for consistency.
|
|
40
|
+
* Example: "AB:CD:EF:12:34:56" -> "ABCDEF123456"
|
|
41
|
+
*
|
|
42
|
+
* @param uniqueId - Unique identifier to sanitize (typically a MAC address)
|
|
43
|
+
* @returns Sanitized unique ID and any warnings
|
|
44
|
+
*/
|
|
45
|
+
export declare function sanitizeUniqueId(uniqueId: string): SanitizationResult<string>;
|
|
46
|
+
/**
|
|
47
|
+
* Truncate a string to a maximum length with warning
|
|
48
|
+
*
|
|
49
|
+
* @param value - String to truncate
|
|
50
|
+
* @param maxLength - Maximum allowed length
|
|
51
|
+
* @param fieldName - Name of the field (for warnings)
|
|
52
|
+
* @returns Truncated value and any warnings
|
|
53
|
+
*/
|
|
54
|
+
export declare function truncateString(value: string, maxLength: number, fieldName: string): SanitizationResult<string>;
|
|
55
|
+
/**
|
|
56
|
+
* Check for port conflicts between HAP and Matter ports
|
|
57
|
+
*
|
|
58
|
+
* @param hapPort - HAP bridge port
|
|
59
|
+
* @param matterPort - Matter bridge port
|
|
60
|
+
* @returns Warning message if ports are too close, undefined otherwise
|
|
61
|
+
*/
|
|
62
|
+
export declare function checkPortProximity(hapPort: number, matterPort: number): string | undefined;
|
|
63
|
+
/**
|
|
64
|
+
* Validate Matter configuration for production readiness
|
|
65
|
+
*/
|
|
66
|
+
export declare class MatterConfigValidator {
|
|
67
|
+
/**
|
|
68
|
+
* Validate a Matter configuration object
|
|
69
|
+
*/
|
|
70
|
+
static validate(config: Record<string, unknown>): MatterConfigValidationResult;
|
|
71
|
+
private static validatePort;
|
|
72
|
+
/**
|
|
73
|
+
* Validate child Matter configuration (_bridge.matter property)
|
|
74
|
+
*/
|
|
75
|
+
static validateChildMatterConfig(config: PlatformConfig | AccessoryConfig, configType: 'platform' | 'accessory', identifier: string): MatterConfigValidationResult;
|
|
76
|
+
/**
|
|
77
|
+
* Validate all child Matter configurations in a config
|
|
78
|
+
*/
|
|
79
|
+
static validateAllChildMatterConfigs(platforms: PlatformConfig[], accessories: AccessoryConfig[]): MatterConfigValidationResult;
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=configValidator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"configValidator.d.ts","sourceRoot":"","sources":["../../src/matter/configValidator.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AAM1E;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,OAAO,CAAA;IACd,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB,CAAC,CAAC;IACnC,KAAK,EAAE,CAAC,CAAA;IACR,QAAQ,EAAE,MAAM,EAAE,CAAA;CACnB;AAED,MAAM,WAAW,4BAA4B;IAC3C,OAAO,EAAE,OAAO,CAAA;IAChB,MAAM,EAAE,MAAM,EAAE,CAAA;IAChB,QAAQ,EAAE,MAAM,EAAE,CAAA;CACnB;AAMD;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,cAAc,UAAQ,GAAG,oBAAoB,CAqBvF;AAED;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAuB7E;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAC5B,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,GAChB,kBAAkB,CAAC,MAAM,CAAC,CAa5B;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAQ1F;AAMD;;GAEG;AACH,qBAAa,qBAAqB;IAChC;;OAEG;IACH,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,4BAA4B;IAyB9E,OAAO,CAAC,MAAM,CAAC,YAAY;IAiB3B;;OAEG;IACH,MAAM,CAAC,yBAAyB,CAC9B,MAAM,EAAE,cAAc,GAAG,eAAe,EACxC,UAAU,EAAE,UAAU,GAAG,WAAW,EACpC,UAAU,EAAE,MAAM,GACjB,4BAA4B;IAmD/B;;OAEG;IACH,MAAM,CAAC,6BAA6B,CAClC,SAAS,EAAE,cAAc,EAAE,EAC3B,WAAW,EAAE,eAAe,EAAE,GAC7B,4BAA4B;CA2DhC"}
|
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Matter Configuration Validation
|
|
3
|
+
*
|
|
4
|
+
* Provides validation utilities and orchestration for Matter configuration objects.
|
|
5
|
+
* Includes both low-level validation primitives and high-level validation methods.
|
|
6
|
+
*/
|
|
7
|
+
import { Logger } from '../logger.js';
|
|
8
|
+
const log = Logger.withPrefix('Matter/Config');
|
|
9
|
+
// ============================================================================
|
|
10
|
+
// Low-level validation utilities
|
|
11
|
+
// ============================================================================
|
|
12
|
+
/**
|
|
13
|
+
* Validate a Matter port number
|
|
14
|
+
*
|
|
15
|
+
* @param port - Port number to validate
|
|
16
|
+
* @param checkConflicts - Whether to check for known conflicting ports
|
|
17
|
+
* @returns Validation result with error/warning messages
|
|
18
|
+
*/
|
|
19
|
+
export function validatePort(port, checkConflicts = false) {
|
|
20
|
+
if (!Number.isInteger(port)) {
|
|
21
|
+
return { valid: false, error: `Port must be an integer (got: ${port})` };
|
|
22
|
+
}
|
|
23
|
+
if (port < 1025 || port > 65534) {
|
|
24
|
+
return { valid: false, error: `Port must be between 1025 and 65534 (got: ${port})` };
|
|
25
|
+
}
|
|
26
|
+
// Check for common conflicts
|
|
27
|
+
if (checkConflicts) {
|
|
28
|
+
const conflictPorts = [5353, 8080, 8443]; // mDNS, common HTTP ports
|
|
29
|
+
if (conflictPorts.includes(port)) {
|
|
30
|
+
return {
|
|
31
|
+
valid: true,
|
|
32
|
+
warning: `Port ${port} may conflict with other services. Consider using a different port.`,
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
return { valid: true };
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Sanitize a unique ID for Matter filesystem storage
|
|
40
|
+
*
|
|
41
|
+
* Removes colons from MAC addresses and converts to uppercase for consistency.
|
|
42
|
+
* Example: "AB:CD:EF:12:34:56" -> "ABCDEF123456"
|
|
43
|
+
*
|
|
44
|
+
* @param uniqueId - Unique identifier to sanitize (typically a MAC address)
|
|
45
|
+
* @returns Sanitized unique ID and any warnings
|
|
46
|
+
*/
|
|
47
|
+
export function sanitizeUniqueId(uniqueId) {
|
|
48
|
+
const warnings = [];
|
|
49
|
+
const original = uniqueId;
|
|
50
|
+
if (uniqueId.trim().length === 0) {
|
|
51
|
+
return {
|
|
52
|
+
value: '',
|
|
53
|
+
warnings: ['uniqueId is empty after trimming'],
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
// Remove colons and convert to uppercase for Matter storage paths
|
|
57
|
+
const sanitized = uniqueId.replace(/:/g, '').toUpperCase();
|
|
58
|
+
if (sanitized !== original) {
|
|
59
|
+
warnings.push(`uniqueId was sanitized from "${original}" to "${sanitized}"`);
|
|
60
|
+
}
|
|
61
|
+
if (sanitized.length === 0) {
|
|
62
|
+
warnings.push('uniqueId resulted in empty string after sanitization');
|
|
63
|
+
}
|
|
64
|
+
return { value: sanitized, warnings };
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Truncate a string to a maximum length with warning
|
|
68
|
+
*
|
|
69
|
+
* @param value - String to truncate
|
|
70
|
+
* @param maxLength - Maximum allowed length
|
|
71
|
+
* @param fieldName - Name of the field (for warnings)
|
|
72
|
+
* @returns Truncated value and any warnings
|
|
73
|
+
*/
|
|
74
|
+
export function truncateString(value, maxLength, fieldName) {
|
|
75
|
+
const warnings = [];
|
|
76
|
+
if (value.length > maxLength) {
|
|
77
|
+
warnings.push(`${fieldName} exceeds ${maxLength} characters, truncating: ${value}`);
|
|
78
|
+
log.warn(`${fieldName} exceeds ${maxLength} characters, truncating: ${value}`);
|
|
79
|
+
return {
|
|
80
|
+
value: value.slice(0, maxLength),
|
|
81
|
+
warnings,
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
return { value, warnings };
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Check for port conflicts between HAP and Matter ports
|
|
88
|
+
*
|
|
89
|
+
* @param hapPort - HAP bridge port
|
|
90
|
+
* @param matterPort - Matter bridge port
|
|
91
|
+
* @returns Warning message if ports are too close, undefined otherwise
|
|
92
|
+
*/
|
|
93
|
+
export function checkPortProximity(hapPort, matterPort) {
|
|
94
|
+
const MIN_PORT_SEPARATION = 10;
|
|
95
|
+
if (Math.abs(hapPort - matterPort) < MIN_PORT_SEPARATION) {
|
|
96
|
+
return `HAP port ${hapPort} and Matter port ${matterPort} are very close. Consider spacing them further apart.`;
|
|
97
|
+
}
|
|
98
|
+
return undefined;
|
|
99
|
+
}
|
|
100
|
+
// ============================================================================
|
|
101
|
+
// High-level validation orchestration
|
|
102
|
+
// ============================================================================
|
|
103
|
+
/**
|
|
104
|
+
* Validate Matter configuration for production readiness
|
|
105
|
+
*/
|
|
106
|
+
export class MatterConfigValidator {
|
|
107
|
+
/**
|
|
108
|
+
* Validate a Matter configuration object
|
|
109
|
+
*/
|
|
110
|
+
static validate(config) {
|
|
111
|
+
const result = {
|
|
112
|
+
isValid: true,
|
|
113
|
+
errors: [],
|
|
114
|
+
warnings: [],
|
|
115
|
+
};
|
|
116
|
+
// Validate port configuration
|
|
117
|
+
this.validatePort(config, result);
|
|
118
|
+
result.isValid = result.errors.length === 0;
|
|
119
|
+
if (result.warnings.length > 0) {
|
|
120
|
+
log.warn('Matter configuration warnings:');
|
|
121
|
+
result.warnings.forEach(warning => log.warn(` - ${warning}`));
|
|
122
|
+
}
|
|
123
|
+
if (result.errors.length > 0) {
|
|
124
|
+
log.error('Matter configuration errors:');
|
|
125
|
+
result.errors.forEach(error => log.error(` - ${error}`));
|
|
126
|
+
}
|
|
127
|
+
return result;
|
|
128
|
+
}
|
|
129
|
+
static validatePort(config, result) {
|
|
130
|
+
const port = config.port;
|
|
131
|
+
if (port !== undefined && port !== null) {
|
|
132
|
+
if (typeof port === 'number') {
|
|
133
|
+
const validation = validatePort(port, true);
|
|
134
|
+
if (!validation.valid) {
|
|
135
|
+
result.errors.push(validation.error);
|
|
136
|
+
}
|
|
137
|
+
else if (validation.warning) {
|
|
138
|
+
result.warnings.push(validation.warning);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
else {
|
|
142
|
+
result.errors.push(`Port must be a number, got ${typeof port}.`);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Validate child Matter configuration (_bridge.matter property)
|
|
148
|
+
*/
|
|
149
|
+
static validateChildMatterConfig(config, configType, identifier) {
|
|
150
|
+
const result = {
|
|
151
|
+
isValid: true,
|
|
152
|
+
errors: [],
|
|
153
|
+
warnings: [],
|
|
154
|
+
};
|
|
155
|
+
// If no _bridge.matter property, no validation needed
|
|
156
|
+
if (!config._bridge?.matter) {
|
|
157
|
+
return result;
|
|
158
|
+
}
|
|
159
|
+
const matterConfig = config._bridge.matter;
|
|
160
|
+
const prefix = `Child Matter bridge for ${configType} "${identifier}"`;
|
|
161
|
+
// Validate port if specified
|
|
162
|
+
if (matterConfig.port !== undefined) {
|
|
163
|
+
const validation = validatePort(matterConfig.port, false);
|
|
164
|
+
if (!validation.valid) {
|
|
165
|
+
result.errors.push(`${prefix}: ${validation.error}`);
|
|
166
|
+
result.isValid = false;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
else {
|
|
170
|
+
result.warnings.push(`${prefix}: No port specified. Port will be auto-allocated.`);
|
|
171
|
+
}
|
|
172
|
+
// Check for port conflicts with HAP bridge
|
|
173
|
+
if (config._bridge && config._bridge.matter) {
|
|
174
|
+
// Ensure ports don't conflict if both HAP and Matter are configured
|
|
175
|
+
if (config._bridge.port && matterConfig.port) {
|
|
176
|
+
const proximityWarning = checkPortProximity(config._bridge.port, matterConfig.port);
|
|
177
|
+
if (proximityWarning) {
|
|
178
|
+
result.warnings.push(`${prefix}: ${proximityWarning}`);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
// Log validation results
|
|
183
|
+
if (result.errors.length > 0) {
|
|
184
|
+
log.error(`${prefix} validation errors:`);
|
|
185
|
+
result.errors.forEach(error => log.error(` - ${error}`));
|
|
186
|
+
}
|
|
187
|
+
if (result.warnings.length > 0) {
|
|
188
|
+
log.warn(`${prefix} validation warnings:`);
|
|
189
|
+
result.warnings.forEach(warning => log.warn(` - ${warning}`));
|
|
190
|
+
}
|
|
191
|
+
return result;
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Validate all child Matter configurations in a config
|
|
195
|
+
*/
|
|
196
|
+
static validateAllChildMatterConfigs(platforms, accessories) {
|
|
197
|
+
const result = {
|
|
198
|
+
isValid: true,
|
|
199
|
+
errors: [],
|
|
200
|
+
warnings: [],
|
|
201
|
+
};
|
|
202
|
+
const usedPorts = new Set();
|
|
203
|
+
// Validate platform _bridge.matter configs
|
|
204
|
+
for (const platform of platforms) {
|
|
205
|
+
if (platform._bridge?.matter) {
|
|
206
|
+
const validation = this.validateChildMatterConfig(platform, 'platform', platform.platform || 'unknown');
|
|
207
|
+
result.errors.push(...validation.errors);
|
|
208
|
+
result.warnings.push(...validation.warnings);
|
|
209
|
+
result.isValid = result.isValid && validation.isValid;
|
|
210
|
+
// Check for port conflicts
|
|
211
|
+
if (platform._bridge.matter.port) {
|
|
212
|
+
if (usedPorts.has(platform._bridge.matter.port)) {
|
|
213
|
+
result.errors.push(`Duplicate Matter port ${platform._bridge.matter.port} detected. Each Matter bridge must use a unique port.`);
|
|
214
|
+
result.isValid = false;
|
|
215
|
+
}
|
|
216
|
+
usedPorts.add(platform._bridge.matter.port);
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
// Validate accessory _bridge.matter configs
|
|
221
|
+
for (const accessory of accessories) {
|
|
222
|
+
if (accessory._bridge?.matter) {
|
|
223
|
+
const validation = this.validateChildMatterConfig(accessory, 'accessory', accessory.accessory || 'unknown');
|
|
224
|
+
result.errors.push(...validation.errors);
|
|
225
|
+
result.warnings.push(...validation.warnings);
|
|
226
|
+
result.isValid = result.isValid && validation.isValid;
|
|
227
|
+
// Check for port conflicts
|
|
228
|
+
if (accessory._bridge.matter.port) {
|
|
229
|
+
if (usedPorts.has(accessory._bridge.matter.port)) {
|
|
230
|
+
result.errors.push(`Duplicate Matter port ${accessory._bridge.matter.port} detected. Each Matter bridge must use a unique port.`);
|
|
231
|
+
result.isValid = false;
|
|
232
|
+
}
|
|
233
|
+
usedPorts.add(accessory._bridge.matter.port);
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
return result;
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
//# sourceMappingURL=configValidator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"configValidator.js","sourceRoot":"","sources":["../../src/matter/configValidator.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AAErC,MAAM,GAAG,GAAG,MAAM,CAAC,UAAU,CAAC,eAAe,CAAC,CAAA;AAyB9C,+EAA+E;AAC/E,iCAAiC;AACjC,+EAA+E;AAE/E;;;;;;GAMG;AACH,MAAM,UAAU,YAAY,CAAC,IAAY,EAAE,cAAc,GAAG,KAAK;IAC/D,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5B,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,iCAAiC,IAAI,GAAG,EAAE,CAAA;IAC1E,CAAC;IAED,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,KAAK,EAAE,CAAC;QAChC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,6CAA6C,IAAI,GAAG,EAAE,CAAA;IACtF,CAAC;IAED,6BAA6B;IAC7B,IAAI,cAAc,EAAE,CAAC;QACnB,MAAM,aAAa,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAA,CAAC,0BAA0B;QACnE,IAAI,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YACjC,OAAO;gBACL,KAAK,EAAE,IAAI;gBACX,OAAO,EAAE,QAAQ,IAAI,qEAAqE;aAC3F,CAAA;QACH,CAAC;IACH,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAA;AACxB,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,gBAAgB,CAAC,QAAgB;IAC/C,MAAM,QAAQ,GAAa,EAAE,CAAA;IAC7B,MAAM,QAAQ,GAAG,QAAQ,CAAA;IAEzB,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACjC,OAAO;YACL,KAAK,EAAE,EAAE;YACT,QAAQ,EAAE,CAAC,kCAAkC,CAAC;SAC/C,CAAA;IACH,CAAC;IAED,kEAAkE;IAClE,MAAM,SAAS,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,CAAA;IAE1D,IAAI,SAAS,KAAK,QAAQ,EAAE,CAAC;QAC3B,QAAQ,CAAC,IAAI,CAAC,gCAAgC,QAAQ,SAAS,SAAS,GAAG,CAAC,CAAA;IAC9E,CAAC;IAED,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,QAAQ,CAAC,IAAI,CAAC,sDAAsD,CAAC,CAAA;IACvE,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAA;AACvC,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,cAAc,CAC5B,KAAa,EACb,SAAiB,EACjB,SAAiB;IAEjB,MAAM,QAAQ,GAAa,EAAE,CAAA;IAE7B,IAAI,KAAK,CAAC,MAAM,GAAG,SAAS,EAAE,CAAC;QAC7B,QAAQ,CAAC,IAAI,CAAC,GAAG,SAAS,YAAY,SAAS,4BAA4B,KAAK,EAAE,CAAC,CAAA;QACnF,GAAG,CAAC,IAAI,CAAC,GAAG,SAAS,YAAY,SAAS,4BAA4B,KAAK,EAAE,CAAC,CAAA;QAC9E,OAAO;YACL,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC;YAChC,QAAQ;SACT,CAAA;IACH,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAA;AAC5B,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,kBAAkB,CAAC,OAAe,EAAE,UAAkB;IACpE,MAAM,mBAAmB,GAAG,EAAE,CAAA;IAE9B,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,GAAG,UAAU,CAAC,GAAG,mBAAmB,EAAE,CAAC;QACzD,OAAO,YAAY,OAAO,oBAAoB,UAAU,uDAAuD,CAAA;IACjH,CAAC;IAED,OAAO,SAAS,CAAA;AAClB,CAAC;AAED,+EAA+E;AAC/E,sCAAsC;AACtC,+EAA+E;AAE/E;;GAEG;AACH,MAAM,OAAO,qBAAqB;IAChC;;OAEG;IACH,MAAM,CAAC,QAAQ,CAAC,MAA+B;QAC7C,MAAM,MAAM,GAAiC;YAC3C,OAAO,EAAE,IAAI;YACb,MAAM,EAAE,EAAE;YACV,QAAQ,EAAE,EAAE;SACb,CAAA;QAED,8BAA8B;QAC9B,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;QAEjC,MAAM,CAAC,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,CAAA;QAE3C,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC/B,GAAG,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAA;YAC1C,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,OAAO,EAAE,CAAC,CAAC,CAAA;QAChE,CAAC;QAED,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC7B,GAAG,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAA;YACzC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,KAAK,EAAE,CAAC,CAAC,CAAA;QAC3D,CAAC;QAED,OAAO,MAAM,CAAA;IACf,CAAC;IAEO,MAAM,CAAC,YAAY,CAAC,MAA+B,EAAE,MAAoC;QAC/F,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAA;QAExB,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;YACxC,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAC7B,MAAM,UAAU,GAAG,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;gBAC3C,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;oBACtB,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,KAAM,CAAC,CAAA;gBACvC,CAAC;qBAAM,IAAI,UAAU,CAAC,OAAO,EAAE,CAAC;oBAC9B,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAA;gBAC1C,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,8BAA8B,OAAO,IAAI,GAAG,CAAC,CAAA;YAClE,CAAC;QACH,CAAC;IACH,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,yBAAyB,CAC9B,MAAwC,EACxC,UAAoC,EACpC,UAAkB;QAElB,MAAM,MAAM,GAAiC;YAC3C,OAAO,EAAE,IAAI;YACb,MAAM,EAAE,EAAE;YACV,QAAQ,EAAE,EAAE;SACb,CAAA;QAED,sDAAsD;QACtD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC;YAC5B,OAAO,MAAM,CAAA;QACf,CAAC;QAED,MAAM,YAAY,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAA;QAC1C,MAAM,MAAM,GAAG,2BAA2B,UAAU,KAAK,UAAU,GAAG,CAAA;QAEtE,6BAA6B;QAC7B,IAAI,YAAY,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YACpC,MAAM,UAAU,GAAG,YAAY,CAAC,YAAY,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;YACzD,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;gBACtB,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,KAAK,UAAU,CAAC,KAAK,EAAE,CAAC,CAAA;gBACpD,MAAM,CAAC,OAAO,GAAG,KAAK,CAAA;YACxB,CAAC;QACH,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,MAAM,mDAAmD,CAAC,CAAA;QACpF,CAAC;QAED,2CAA2C;QAC3C,IAAI,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;YAC5C,oEAAoE;YACpE,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,IAAI,YAAY,CAAC,IAAI,EAAE,CAAC;gBAC7C,MAAM,gBAAgB,GAAG,kBAAkB,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,YAAY,CAAC,IAAI,CAAC,CAAA;gBACnF,IAAI,gBAAgB,EAAE,CAAC;oBACrB,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,MAAM,KAAK,gBAAgB,EAAE,CAAC,CAAA;gBACxD,CAAC;YACH,CAAC;QACH,CAAC;QAED,yBAAyB;QACzB,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC7B,GAAG,CAAC,KAAK,CAAC,GAAG,MAAM,qBAAqB,CAAC,CAAA;YACzC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,KAAK,EAAE,CAAC,CAAC,CAAA;QAC3D,CAAC;QAED,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC/B,GAAG,CAAC,IAAI,CAAC,GAAG,MAAM,uBAAuB,CAAC,CAAA;YAC1C,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,OAAO,EAAE,CAAC,CAAC,CAAA;QAChE,CAAC;QAED,OAAO,MAAM,CAAA;IACf,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,6BAA6B,CAClC,SAA2B,EAC3B,WAA8B;QAE9B,MAAM,MAAM,GAAiC;YAC3C,OAAO,EAAE,IAAI;YACb,MAAM,EAAE,EAAE;YACV,QAAQ,EAAE,EAAE;SACb,CAAA;QAED,MAAM,SAAS,GAAG,IAAI,GAAG,EAAU,CAAA;QAEnC,2CAA2C;QAC3C,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;YACjC,IAAI,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC;gBAC7B,MAAM,UAAU,GAAG,IAAI,CAAC,yBAAyB,CAC/C,QAAQ,EACR,UAAU,EACV,QAAQ,CAAC,QAAQ,IAAI,SAAS,CAC/B,CAAA;gBAED,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,MAAM,CAAC,CAAA;gBACxC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAA;gBAC5C,MAAM,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,UAAU,CAAC,OAAO,CAAA;gBAErD,2BAA2B;gBAC3B,IAAI,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;oBACjC,IAAI,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;wBAChD,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,yBAAyB,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,uDAAuD,CAAC,CAAA;wBAChI,MAAM,CAAC,OAAO,GAAG,KAAK,CAAA;oBACxB,CAAC;oBACD,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;gBAC7C,CAAC;YACH,CAAC;QACH,CAAC;QAED,4CAA4C;QAC5C,KAAK,MAAM,SAAS,IAAI,WAAW,EAAE,CAAC;YACpC,IAAI,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC;gBAC9B,MAAM,UAAU,GAAG,IAAI,CAAC,yBAAyB,CAC/C,SAAS,EACT,WAAW,EACX,SAAS,CAAC,SAAS,IAAI,SAAS,CACjC,CAAA;gBAED,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,MAAM,CAAC,CAAA;gBACxC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAA;gBAC5C,MAAM,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,UAAU,CAAC,OAAO,CAAA;gBAErD,2BAA2B;gBAC3B,IAAI,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;oBAClC,IAAI,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;wBACjD,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,yBAAyB,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,uDAAuD,CAAC,CAAA;wBACjI,MAAM,CAAC,OAAO,GAAG,KAAK,CAAA;oBACxB,CAAC;oBACD,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;gBAC9C,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,MAAM,CAAA;IACf,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"configValidator.spec.d.ts","sourceRoot":"","sources":["../../src/matter/configValidator.spec.ts"],"names":[],"mappings":""}
|