homebridge 2.0.0-beta.43 → 2.0.0-beta.45
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/dist/api.d.ts +3 -365
- package/dist/api.d.ts.map +1 -1
- package/dist/api.js +13 -85
- package/dist/api.js.map +1 -1
- package/dist/bridgeService.d.ts +0 -25
- package/dist/bridgeService.d.ts.map +1 -1
- package/dist/bridgeService.js +32 -85
- package/dist/bridgeService.js.map +1 -1
- package/dist/childBridgeFork.d.ts +12 -15
- package/dist/childBridgeFork.d.ts.map +1 -1
- package/dist/childBridgeFork.js +126 -80
- package/dist/childBridgeFork.js.map +1 -1
- package/dist/childBridgeService.d.ts +21 -105
- package/dist/childBridgeService.d.ts.map +1 -1
- package/dist/childBridgeService.js +57 -134
- package/dist/childBridgeService.js.map +1 -1
- package/dist/cli.js +0 -2
- package/dist/cli.js.map +1 -1
- package/dist/externalPortService.d.ts +0 -21
- package/dist/externalPortService.d.ts.map +1 -1
- package/dist/externalPortService.js +0 -28
- package/dist/externalPortService.js.map +1 -1
- package/dist/index.d.ts +0 -112
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +0 -44
- package/dist/index.js.map +1 -1
- package/dist/ipcService.d.ts +23 -15
- package/dist/ipcService.d.ts.map +1 -1
- package/dist/ipcService.js +6 -12
- package/dist/ipcService.js.map +1 -1
- package/dist/logger.d.ts +0 -46
- package/dist/logger.d.ts.map +1 -1
- package/dist/logger.js +13 -57
- package/dist/logger.js.map +1 -1
- package/dist/matter/BaseMatterManager.d.ts +19 -0
- package/dist/matter/BaseMatterManager.d.ts.map +1 -0
- package/dist/matter/BaseMatterManager.js +170 -0
- package/dist/matter/BaseMatterManager.js.map +1 -0
- package/dist/matter/ChildBridgeMatterManager.d.ts +5 -69
- package/dist/matter/ChildBridgeMatterManager.d.ts.map +1 -1
- package/dist/matter/ChildBridgeMatterManager.js +36 -227
- package/dist/matter/ChildBridgeMatterManager.js.map +1 -1
- package/dist/matter/ClusterCommandMapper.d.ts +5 -0
- package/dist/matter/ClusterCommandMapper.d.ts.map +1 -0
- package/dist/matter/ClusterCommandMapper.js +203 -0
- package/dist/matter/ClusterCommandMapper.js.map +1 -0
- package/dist/matter/ExternalMatterAccessoryPublisher.d.ts +0 -27
- package/dist/matter/ExternalMatterAccessoryPublisher.d.ts.map +1 -1
- package/dist/matter/ExternalMatterAccessoryPublisher.js +2 -27
- package/dist/matter/ExternalMatterAccessoryPublisher.js.map +1 -1
- package/dist/matter/MatterAPIImpl.d.ts +7 -68
- package/dist/matter/MatterAPIImpl.d.ts.map +1 -1
- package/dist/matter/MatterAPIImpl.js +6 -106
- package/dist/matter/MatterAPIImpl.js.map +1 -1
- package/dist/matter/MatterBridgeManager.d.ts +9 -60
- package/dist/matter/MatterBridgeManager.d.ts.map +1 -1
- package/dist/matter/MatterBridgeManager.js +139 -215
- package/dist/matter/MatterBridgeManager.js.map +1 -1
- package/dist/matter/MatterConfigCollector.d.ts +1 -20
- package/dist/matter/MatterConfigCollector.d.ts.map +1 -1
- package/dist/matter/MatterConfigCollector.js +14 -27
- package/dist/matter/MatterConfigCollector.js.map +1 -1
- package/dist/matter/accessoryCache.d.ts +0 -48
- package/dist/matter/accessoryCache.d.ts.map +1 -1
- package/dist/matter/accessoryCache.js +1 -60
- package/dist/matter/accessoryCache.js.map +1 -1
- package/dist/matter/behaviors/AirQualityBehavior.d.ts +0 -42
- package/dist/matter/behaviors/AirQualityBehavior.d.ts.map +1 -1
- package/dist/matter/behaviors/AirQualityBehavior.js +0 -44
- package/dist/matter/behaviors/AirQualityBehavior.js.map +1 -1
- package/dist/matter/behaviors/BehaviorRegistry.d.ts +4 -42
- package/dist/matter/behaviors/BehaviorRegistry.d.ts.map +1 -1
- package/dist/matter/behaviors/BehaviorRegistry.js +12 -42
- package/dist/matter/behaviors/BehaviorRegistry.js.map +1 -1
- package/dist/matter/behaviors/ColorControlBehavior.d.ts +0 -49
- package/dist/matter/behaviors/ColorControlBehavior.d.ts.map +1 -1
- package/dist/matter/behaviors/ColorControlBehavior.js +0 -90
- package/dist/matter/behaviors/ColorControlBehavior.js.map +1 -1
- package/dist/matter/behaviors/ConcentrationMeasurementBehavior.d.ts +0 -91
- package/dist/matter/behaviors/ConcentrationMeasurementBehavior.d.ts.map +1 -1
- package/dist/matter/behaviors/ConcentrationMeasurementBehavior.js +0 -96
- package/dist/matter/behaviors/ConcentrationMeasurementBehavior.js.map +1 -1
- package/dist/matter/behaviors/DoorLockBehavior.d.ts +0 -11
- package/dist/matter/behaviors/DoorLockBehavior.d.ts.map +1 -1
- package/dist/matter/behaviors/DoorLockBehavior.js +0 -25
- package/dist/matter/behaviors/DoorLockBehavior.js.map +1 -1
- package/dist/matter/behaviors/FanControlBehavior.d.ts +0 -11
- package/dist/matter/behaviors/FanControlBehavior.d.ts.map +1 -1
- package/dist/matter/behaviors/FanControlBehavior.js +0 -25
- package/dist/matter/behaviors/FanControlBehavior.js.map +1 -1
- package/dist/matter/behaviors/IdentifyBehavior.d.ts +0 -11
- package/dist/matter/behaviors/IdentifyBehavior.d.ts.map +1 -1
- package/dist/matter/behaviors/IdentifyBehavior.js +0 -17
- package/dist/matter/behaviors/IdentifyBehavior.js.map +1 -1
- package/dist/matter/behaviors/LevelControlBehavior.d.ts +0 -20
- package/dist/matter/behaviors/LevelControlBehavior.d.ts.map +1 -1
- package/dist/matter/behaviors/LevelControlBehavior.js +0 -52
- package/dist/matter/behaviors/LevelControlBehavior.js.map +1 -1
- package/dist/matter/behaviors/OnOffBehavior.d.ts +0 -17
- package/dist/matter/behaviors/OnOffBehavior.d.ts.map +1 -1
- package/dist/matter/behaviors/OnOffBehavior.js +0 -38
- package/dist/matter/behaviors/OnOffBehavior.js.map +1 -1
- package/dist/matter/behaviors/RvcCleanModeBehavior.d.ts +0 -11
- package/dist/matter/behaviors/RvcCleanModeBehavior.d.ts.map +1 -1
- package/dist/matter/behaviors/RvcCleanModeBehavior.js +0 -17
- package/dist/matter/behaviors/RvcCleanModeBehavior.js.map +1 -1
- package/dist/matter/behaviors/RvcOperationalStateBehavior.d.ts +0 -11
- package/dist/matter/behaviors/RvcOperationalStateBehavior.d.ts.map +1 -1
- package/dist/matter/behaviors/RvcOperationalStateBehavior.js +0 -29
- package/dist/matter/behaviors/RvcOperationalStateBehavior.js.map +1 -1
- package/dist/matter/behaviors/RvcRunModeBehavior.d.ts +0 -11
- package/dist/matter/behaviors/RvcRunModeBehavior.d.ts.map +1 -1
- package/dist/matter/behaviors/RvcRunModeBehavior.js +0 -17
- package/dist/matter/behaviors/RvcRunModeBehavior.js.map +1 -1
- package/dist/matter/behaviors/ServiceAreaBehavior.d.ts +0 -11
- package/dist/matter/behaviors/ServiceAreaBehavior.d.ts.map +1 -1
- package/dist/matter/behaviors/ServiceAreaBehavior.js +0 -23
- package/dist/matter/behaviors/ServiceAreaBehavior.js.map +1 -1
- package/dist/matter/behaviors/ThermostatBehavior.d.ts +0 -11
- package/dist/matter/behaviors/ThermostatBehavior.d.ts.map +1 -1
- package/dist/matter/behaviors/ThermostatBehavior.js +0 -39
- package/dist/matter/behaviors/ThermostatBehavior.js.map +1 -1
- package/dist/matter/behaviors/WindowCoveringBehavior.d.ts +0 -17
- package/dist/matter/behaviors/WindowCoveringBehavior.d.ts.map +1 -1
- package/dist/matter/behaviors/WindowCoveringBehavior.js +0 -56
- package/dist/matter/behaviors/WindowCoveringBehavior.js.map +1 -1
- package/dist/matter/behaviors/index.d.ts +0 -5
- package/dist/matter/behaviors/index.d.ts.map +1 -1
- package/dist/matter/behaviors/index.js +0 -5
- package/dist/matter/behaviors/index.js.map +1 -1
- package/dist/matter/configValidator.d.ts +0 -55
- package/dist/matter/configValidator.d.ts.map +1 -1
- package/dist/matter/configValidator.js +1 -68
- package/dist/matter/configValidator.js.map +1 -1
- package/dist/matter/errorHandler.d.ts +0 -22
- package/dist/matter/errorHandler.d.ts.map +1 -1
- package/dist/matter/errorHandler.js +0 -32
- package/dist/matter/errorHandler.js.map +1 -1
- package/dist/matter/errors.d.ts +0 -132
- package/dist/matter/errors.d.ts.map +1 -1
- package/dist/matter/errors.js +0 -132
- package/dist/matter/errors.js.map +1 -1
- package/dist/matter/index.d.ts +0 -30
- package/dist/matter/index.d.ts.map +1 -1
- package/dist/matter/index.js +0 -13
- package/dist/matter/index.js.map +1 -1
- package/dist/matter/logFormatter.d.ts +0 -17
- package/dist/matter/logFormatter.d.ts.map +1 -1
- package/dist/matter/logFormatter.js +5 -63
- package/dist/matter/logFormatter.js.map +1 -1
- package/dist/matter/server.d.ts +12 -236
- package/dist/matter/server.d.ts.map +1 -1
- package/dist/matter/server.js +177 -488
- package/dist/matter/server.js.map +1 -1
- package/dist/matter/serverHelpers.d.ts +0 -56
- package/dist/matter/serverHelpers.d.ts.map +1 -1
- package/dist/matter/serverHelpers.js +1 -66
- package/dist/matter/serverHelpers.js.map +1 -1
- package/dist/matter/sharedTypes.d.ts +0 -83
- package/dist/matter/sharedTypes.d.ts.map +1 -1
- package/dist/matter/sharedTypes.js +0 -26
- package/dist/matter/sharedTypes.js.map +1 -1
- package/dist/matter/storage.d.ts +0 -90
- package/dist/matter/storage.d.ts.map +1 -1
- package/dist/matter/storage.js +2 -130
- package/dist/matter/storage.js.map +1 -1
- package/dist/matter/typeHelpers.d.ts +0 -30
- package/dist/matter/typeHelpers.d.ts.map +1 -1
- package/dist/matter/typeHelpers.js +0 -24
- package/dist/matter/typeHelpers.js.map +1 -1
- package/dist/matter/types.d.ts +7 -273
- package/dist/matter/types.d.ts.map +1 -1
- package/dist/matter/types.js +7 -83
- package/dist/matter/types.js.map +1 -1
- package/dist/platformAccessory.d.ts +0 -15
- package/dist/platformAccessory.d.ts.map +1 -1
- package/dist/platformAccessory.js +6 -32
- package/dist/platformAccessory.js.map +1 -1
- package/dist/plugin.d.ts +0 -3
- package/dist/plugin.d.ts.map +1 -1
- package/dist/plugin.js +6 -29
- package/dist/plugin.js.map +1 -1
- package/dist/pluginManager.d.ts +0 -22
- package/dist/pluginManager.d.ts.map +1 -1
- package/dist/pluginManager.js +18 -41
- package/dist/pluginManager.js.map +1 -1
- package/dist/server.d.ts +9 -29
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +304 -157
- package/dist/server.js.map +1 -1
- package/dist/user.d.ts +0 -3
- package/dist/user.d.ts.map +1 -1
- package/dist/user.js +2 -5
- package/dist/user.js.map +1 -1
- package/dist/util/mac.js +0 -1
- package/dist/util/mac.js.map +1 -1
- package/package.json +4 -4
- package/dist/api.spec.d.ts +0 -2
- package/dist/api.spec.d.ts.map +0 -1
- package/dist/api.spec.js +0 -413
- package/dist/api.spec.js.map +0 -1
- package/dist/logger.spec.d.ts +0 -2
- package/dist/logger.spec.d.ts.map +0 -1
- package/dist/logger.spec.js +0 -95
- package/dist/logger.spec.js.map +0 -1
- package/dist/matter/ExternalMatterAccessoryPublisher.spec.d.ts +0 -2
- package/dist/matter/ExternalMatterAccessoryPublisher.spec.d.ts.map +0 -1
- package/dist/matter/ExternalMatterAccessoryPublisher.spec.js +0 -293
- package/dist/matter/ExternalMatterAccessoryPublisher.spec.js.map +0 -1
- package/dist/matter/accessoryCache.spec.d.ts +0 -2
- package/dist/matter/accessoryCache.spec.d.ts.map +0 -1
- package/dist/matter/accessoryCache.spec.js +0 -452
- package/dist/matter/accessoryCache.spec.js.map +0 -1
- package/dist/matter/behaviors/AirQualityBehavior.spec.d.ts +0 -5
- package/dist/matter/behaviors/AirQualityBehavior.spec.d.ts.map +0 -1
- package/dist/matter/behaviors/AirQualityBehavior.spec.js +0 -46
- package/dist/matter/behaviors/AirQualityBehavior.spec.js.map +0 -1
- package/dist/matter/behaviors/BehaviorRegistry.spec.d.ts +0 -2
- package/dist/matter/behaviors/BehaviorRegistry.spec.d.ts.map +0 -1
- package/dist/matter/behaviors/BehaviorRegistry.spec.js +0 -307
- package/dist/matter/behaviors/BehaviorRegistry.spec.js.map +0 -1
- package/dist/matter/behaviors/ColorControlBehavior.spec.d.ts +0 -2
- package/dist/matter/behaviors/ColorControlBehavior.spec.d.ts.map +0 -1
- package/dist/matter/behaviors/ColorControlBehavior.spec.js +0 -29
- package/dist/matter/behaviors/ColorControlBehavior.spec.js.map +0 -1
- package/dist/matter/behaviors/ConcentrationMeasurementBehavior.spec.d.ts +0 -5
- package/dist/matter/behaviors/ConcentrationMeasurementBehavior.spec.d.ts.map +0 -1
- package/dist/matter/behaviors/ConcentrationMeasurementBehavior.spec.js +0 -95
- package/dist/matter/behaviors/ConcentrationMeasurementBehavior.spec.js.map +0 -1
- package/dist/matter/behaviors/DoorLockBehavior.spec.d.ts +0 -2
- package/dist/matter/behaviors/DoorLockBehavior.spec.d.ts.map +0 -1
- package/dist/matter/behaviors/DoorLockBehavior.spec.js +0 -120
- package/dist/matter/behaviors/DoorLockBehavior.spec.js.map +0 -1
- package/dist/matter/behaviors/FanControlBehavior.spec.d.ts +0 -2
- package/dist/matter/behaviors/FanControlBehavior.spec.d.ts.map +0 -1
- package/dist/matter/behaviors/FanControlBehavior.spec.js +0 -23
- package/dist/matter/behaviors/FanControlBehavior.spec.js.map +0 -1
- package/dist/matter/behaviors/IdentifyBehavior.spec.d.ts +0 -2
- package/dist/matter/behaviors/IdentifyBehavior.spec.d.ts.map +0 -1
- package/dist/matter/behaviors/IdentifyBehavior.spec.js +0 -64
- package/dist/matter/behaviors/IdentifyBehavior.spec.js.map +0 -1
- package/dist/matter/behaviors/LevelControlBehavior.spec.d.ts +0 -2
- package/dist/matter/behaviors/LevelControlBehavior.spec.d.ts.map +0 -1
- package/dist/matter/behaviors/LevelControlBehavior.spec.js +0 -145
- package/dist/matter/behaviors/LevelControlBehavior.spec.js.map +0 -1
- package/dist/matter/behaviors/OnOffBehavior.spec.d.ts +0 -2
- package/dist/matter/behaviors/OnOffBehavior.spec.d.ts.map +0 -1
- package/dist/matter/behaviors/OnOffBehavior.spec.js +0 -128
- package/dist/matter/behaviors/OnOffBehavior.spec.js.map +0 -1
- package/dist/matter/behaviors/RvcCleanModeBehavior.spec.d.ts +0 -2
- package/dist/matter/behaviors/RvcCleanModeBehavior.spec.d.ts.map +0 -1
- package/dist/matter/behaviors/RvcCleanModeBehavior.spec.js +0 -57
- package/dist/matter/behaviors/RvcCleanModeBehavior.spec.js.map +0 -1
- package/dist/matter/behaviors/RvcOperationalStateBehavior.spec.d.ts +0 -2
- package/dist/matter/behaviors/RvcOperationalStateBehavior.spec.d.ts.map +0 -1
- package/dist/matter/behaviors/RvcOperationalStateBehavior.spec.js +0 -55
- package/dist/matter/behaviors/RvcOperationalStateBehavior.spec.js.map +0 -1
- package/dist/matter/behaviors/RvcRunModeBehavior.spec.d.ts +0 -2
- package/dist/matter/behaviors/RvcRunModeBehavior.spec.d.ts.map +0 -1
- package/dist/matter/behaviors/RvcRunModeBehavior.spec.js +0 -57
- package/dist/matter/behaviors/RvcRunModeBehavior.spec.js.map +0 -1
- package/dist/matter/behaviors/ServiceAreaBehavior.spec.d.ts +0 -2
- package/dist/matter/behaviors/ServiceAreaBehavior.spec.d.ts.map +0 -1
- package/dist/matter/behaviors/ServiceAreaBehavior.spec.js +0 -53
- package/dist/matter/behaviors/ServiceAreaBehavior.spec.js.map +0 -1
- package/dist/matter/behaviors/ThermostatBehavior.spec.d.ts +0 -2
- package/dist/matter/behaviors/ThermostatBehavior.spec.d.ts.map +0 -1
- package/dist/matter/behaviors/ThermostatBehavior.spec.js +0 -23
- package/dist/matter/behaviors/ThermostatBehavior.spec.js.map +0 -1
- package/dist/matter/behaviors/WindowCoveringBehavior.spec.d.ts +0 -2
- package/dist/matter/behaviors/WindowCoveringBehavior.spec.d.ts.map +0 -1
- package/dist/matter/behaviors/WindowCoveringBehavior.spec.js +0 -27
- package/dist/matter/behaviors/WindowCoveringBehavior.spec.js.map +0 -1
- package/dist/matter/configValidator.spec.d.ts +0 -2
- package/dist/matter/configValidator.spec.d.ts.map +0 -1
- package/dist/matter/configValidator.spec.js +0 -390
- package/dist/matter/configValidator.spec.js.map +0 -1
- package/dist/matter/errorHandler.spec.d.ts +0 -2
- package/dist/matter/errorHandler.spec.d.ts.map +0 -1
- package/dist/matter/errorHandler.spec.js +0 -159
- package/dist/matter/errorHandler.spec.js.map +0 -1
- package/dist/matter/logFormatter.spec.d.ts +0 -2
- package/dist/matter/logFormatter.spec.d.ts.map +0 -1
- package/dist/matter/logFormatter.spec.js +0 -252
- package/dist/matter/logFormatter.spec.js.map +0 -1
- package/dist/matter/serverHelpers.spec.d.ts +0 -2
- package/dist/matter/serverHelpers.spec.d.ts.map +0 -1
- package/dist/matter/serverHelpers.spec.js +0 -527
- package/dist/matter/serverHelpers.spec.js.map +0 -1
- package/dist/matter/storage.spec.d.ts +0 -2
- package/dist/matter/storage.spec.d.ts.map +0 -1
- package/dist/matter/storage.spec.js +0 -570
- package/dist/matter/storage.spec.js.map +0 -1
- package/dist/matter/typeHelpers.spec.d.ts +0 -2
- package/dist/matter/typeHelpers.spec.d.ts.map +0 -1
- package/dist/matter/typeHelpers.spec.js +0 -127
- package/dist/matter/typeHelpers.spec.js.map +0 -1
- package/dist/platformAccessory.spec.d.ts +0 -2
- package/dist/platformAccessory.spec.d.ts.map +0 -1
- package/dist/platformAccessory.spec.js +0 -126
- package/dist/platformAccessory.spec.js.map +0 -1
- package/dist/pluginManager.spec.d.ts +0 -2
- package/dist/pluginManager.spec.d.ts.map +0 -1
- package/dist/pluginManager.spec.js +0 -43
- package/dist/pluginManager.spec.js.map +0 -1
- package/dist/server.spec.d.ts +0 -2
- package/dist/server.spec.d.ts.map +0 -1
- package/dist/server.spec.js +0 -57
- package/dist/server.spec.js.map +0 -1
- package/dist/user.spec.d.ts +0 -2
- package/dist/user.spec.d.ts.map +0 -1
- package/dist/user.spec.js +0 -31
- package/dist/user.spec.js.map +0 -1
- package/dist/util/mac.spec.d.ts +0 -2
- package/dist/util/mac.spec.d.ts.map +0 -1
- package/dist/util/mac.spec.js +0 -36
- package/dist/util/mac.spec.js.map +0 -1
- package/dist/version.spec.d.ts +0 -2
- package/dist/version.spec.d.ts.map +0 -1
- package/dist/version.spec.js +0 -20
- package/dist/version.spec.js.map +0 -1
|
@@ -1,26 +1,7 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Matter Config Collector
|
|
3
|
-
*
|
|
4
|
-
* Collects and validates Matter configuration from Homebridge config.
|
|
5
|
-
* This class extracts Matter config validation logic from server.ts to minimize changes to core files.
|
|
6
|
-
*/
|
|
7
1
|
import type { HomebridgeConfig } from '../bridgeService.js';
|
|
8
|
-
/**
|
|
9
|
-
* Validates and processes Matter configuration from Homebridge config
|
|
10
|
-
*/
|
|
11
2
|
export declare class MatterConfigCollector {
|
|
12
|
-
|
|
13
|
-
* Validate all Matter configuration in the config
|
|
14
|
-
* Validates main bridge and child bridge Matter configs, checks for port conflicts
|
|
15
|
-
*
|
|
16
|
-
* @param config - The Homebridge configuration
|
|
17
|
-
*/
|
|
3
|
+
static validateMatterPortsPool(config: HomebridgeConfig): void;
|
|
18
4
|
static validateMatterConfig(config: HomebridgeConfig): void;
|
|
19
|
-
/**
|
|
20
|
-
* Check for port conflicts between main bridge and child bridges
|
|
21
|
-
*
|
|
22
|
-
* @param config - The Homebridge configuration
|
|
23
|
-
*/
|
|
24
5
|
private static checkPortConflicts;
|
|
25
6
|
}
|
|
26
7
|
//# sourceMappingURL=MatterConfigCollector.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MatterConfigCollector.d.ts","sourceRoot":"","sources":["../../src/matter/MatterConfigCollector.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"MatterConfigCollector.d.ts","sourceRoot":"","sources":["../../src/matter/MatterConfigCollector.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAA;AAU3D,qBAAa,qBAAqB;IAOhC,MAAM,CAAC,uBAAuB,CAAC,MAAM,EAAE,gBAAgB,GAAG,IAAI;IAoB9D,MAAM,CAAC,oBAAoB,CAAC,MAAM,EAAE,gBAAgB,GAAG,IAAI;IAwC3D,OAAO,CAAC,MAAM,CAAC,kBAAkB;CA+BlC"}
|
|
@@ -1,31 +1,28 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Matter Config Collector
|
|
3
|
-
*
|
|
4
|
-
* Collects and validates Matter configuration from Homebridge config.
|
|
5
|
-
* This class extracts Matter config validation logic from server.ts to minimize changes to core files.
|
|
6
|
-
*/
|
|
7
1
|
import { Logger } from '../logger.js';
|
|
8
2
|
import { MatterConfigValidator } from './configValidator.js';
|
|
9
3
|
const log = Logger.internal;
|
|
10
|
-
/**
|
|
11
|
-
* Validates and processes Matter configuration from Homebridge config
|
|
12
|
-
*/
|
|
13
4
|
export class MatterConfigCollector {
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
5
|
+
static validateMatterPortsPool(config) {
|
|
6
|
+
if (config.matterPorts !== undefined) {
|
|
7
|
+
if (config.matterPorts.start && config.matterPorts.end) {
|
|
8
|
+
if (config.matterPorts.start > config.matterPorts.end) {
|
|
9
|
+
log.error('Invalid Matter port pool configuration. End should be greater than or equal to start.');
|
|
10
|
+
config.matterPorts = undefined;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
else {
|
|
14
|
+
log.error('Invalid configuration for \'matterPorts\'. Missing \'start\' and \'end\' properties! Ignoring it!');
|
|
15
|
+
config.matterPorts = undefined;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
}
|
|
20
19
|
static validateMatterConfig(config) {
|
|
21
|
-
// Check if any Matter config exists
|
|
22
20
|
const hasMatterConfig = config.bridge.matter
|
|
23
21
|
|| config.platforms.some((p) => p._bridge?.matter)
|
|
24
22
|
|| config.accessories.some((a) => a._bridge?.matter);
|
|
25
23
|
if (!hasMatterConfig) {
|
|
26
24
|
return;
|
|
27
25
|
}
|
|
28
|
-
// Validate main bridge Matter config
|
|
29
26
|
if (config.bridge.matter) {
|
|
30
27
|
const validation = MatterConfigValidator.validate(config.bridge.matter);
|
|
31
28
|
if (!validation.isValid) {
|
|
@@ -33,27 +30,19 @@ export class MatterConfigCollector {
|
|
|
33
30
|
delete config.bridge.matter;
|
|
34
31
|
}
|
|
35
32
|
}
|
|
36
|
-
// Validate all child bridge Matter configs and check for port conflicts
|
|
37
33
|
const childMatterValidation = MatterConfigValidator.validateAllChildMatterConfigs(config.platforms, config.accessories);
|
|
38
34
|
if (!childMatterValidation.isValid) {
|
|
39
35
|
log.error('Some child bridge Matter configurations are invalid. Check the errors above.');
|
|
40
36
|
}
|
|
41
|
-
// Check for conflicts between main bridge Matter port and child bridge ports
|
|
42
37
|
if (config.bridge.matter?.port) {
|
|
43
38
|
this.checkPortConflicts(config);
|
|
44
39
|
}
|
|
45
40
|
}
|
|
46
|
-
/**
|
|
47
|
-
* Check for port conflicts between main bridge and child bridges
|
|
48
|
-
*
|
|
49
|
-
* @param config - The Homebridge configuration
|
|
50
|
-
*/
|
|
51
41
|
static checkPortConflicts(config) {
|
|
52
42
|
const mainMatterPort = config.bridge.matter?.port;
|
|
53
43
|
if (!mainMatterPort) {
|
|
54
44
|
return;
|
|
55
45
|
}
|
|
56
|
-
// Collect all child bridge Matter ports
|
|
57
46
|
const childMatterPorts = [];
|
|
58
47
|
for (const platform of config.platforms) {
|
|
59
48
|
if (platform._bridge?.matter?.port) {
|
|
@@ -65,11 +54,9 @@ export class MatterConfigCollector {
|
|
|
65
54
|
childMatterPorts.push(accessory._bridge.matter.port);
|
|
66
55
|
}
|
|
67
56
|
}
|
|
68
|
-
// Check for conflicts with child bridge Matter ports
|
|
69
57
|
if (childMatterPorts.includes(mainMatterPort)) {
|
|
70
58
|
log.error(`Main bridge Matter port ${mainMatterPort} conflicts with a child bridge Matter port. Please use unique ports.`);
|
|
71
59
|
}
|
|
72
|
-
// Check for conflict with main bridge HAP port
|
|
73
60
|
if (config.bridge.port && Math.abs(config.bridge.port - mainMatterPort) < 10) {
|
|
74
61
|
log.warn(`Main bridge HAP port ${config.bridge.port} and Matter port ${mainMatterPort} are very close. Consider spacing them further apart.`);
|
|
75
62
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MatterConfigCollector.js","sourceRoot":"","sources":["../../src/matter/MatterConfigCollector.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"MatterConfigCollector.js","sourceRoot":"","sources":["../../src/matter/MatterConfigCollector.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AACrC,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAA;AAE5D,MAAM,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAA;AAK3B,MAAM,OAAO,qBAAqB;IAOhC,MAAM,CAAC,uBAAuB,CAAC,MAAwB;QACrD,IAAI,MAAM,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;YACrC,IAAI,MAAM,CAAC,WAAW,CAAC,KAAK,IAAI,MAAM,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC;gBACvD,IAAI,MAAM,CAAC,WAAW,CAAC,KAAK,GAAG,MAAM,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC;oBACtD,GAAG,CAAC,KAAK,CAAC,uFAAuF,CAAC,CAAA;oBAClG,MAAM,CAAC,WAAW,GAAG,SAAS,CAAA;gBAChC,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,GAAG,CAAC,KAAK,CAAC,mGAAmG,CAAC,CAAA;gBAC9G,MAAM,CAAC,WAAW,GAAG,SAAS,CAAA;YAChC,CAAC;QACH,CAAC;IACH,CAAC;IAQD,MAAM,CAAC,oBAAoB,CAAC,MAAwB;QAElD,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM;eACvC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,MAAM,CAAC;eACpD,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;QAE3D,IAAI,CAAC,eAAe,EAAE,CAAC;YACrB,OAAM;QACR,CAAC;QAGD,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YACzB,MAAM,UAAU,GAAG,qBAAqB,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;YACvE,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;gBACxB,GAAG,CAAC,KAAK,CAAC,8FAA8F,CAAC,CAAA;gBACzG,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,CAAA;YAC7B,CAAC;QACH,CAAC;QAGD,MAAM,qBAAqB,GAAG,qBAAqB,CAAC,6BAA6B,CAC/E,MAAM,CAAC,SAAkB,EACzB,MAAM,CAAC,WAAoB,CAC5B,CAAA;QAED,IAAI,CAAC,qBAAqB,CAAC,OAAO,EAAE,CAAC;YACnC,GAAG,CAAC,KAAK,CAAC,8EAA8E,CAAC,CAAA;QAC3F,CAAC;QAGD,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC;YAC/B,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAA;QACjC,CAAC;IACH,CAAC;IAOO,MAAM,CAAC,kBAAkB,CAAC,MAAwB;QACxD,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAA;QACjD,IAAI,CAAC,cAAc,EAAE,CAAC;YACpB,OAAM;QACR,CAAC;QAGD,MAAM,gBAAgB,GAAa,EAAE,CAAA;QAErC,KAAK,MAAM,QAAQ,IAAI,MAAM,CAAC,SAAkB,EAAE,CAAC;YACjD,IAAI,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;gBACnC,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;YACrD,CAAC;QACH,CAAC;QAED,KAAK,MAAM,SAAS,IAAI,MAAM,CAAC,WAAoB,EAAE,CAAC;YACpD,IAAI,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;gBACpC,gBAAgB,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;YACtD,CAAC;QACH,CAAC;QAGD,IAAI,gBAAgB,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;YAC9C,GAAG,CAAC,KAAK,CAAC,2BAA2B,cAAc,sEAAsE,CAAC,CAAA;QAC5H,CAAC;QAGD,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,GAAG,cAAc,CAAC,GAAG,EAAE,EAAE,CAAC;YAC7E,GAAG,CAAC,IAAI,CAAC,wBAAwB,MAAM,CAAC,MAAM,CAAC,IAAI,oBAAoB,cAAc,uDAAuD,CAAC,CAAA;QAC/I,CAAC;IACH,CAAC;CACF"}
|
|
@@ -1,13 +1,4 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Matter Accessory Cache
|
|
3
|
-
*
|
|
4
|
-
* Handles persistence of Matter accessories across Homebridge restarts.
|
|
5
|
-
* Similar to HAP's cached accessories, but designed for Matter's simpler API.
|
|
6
|
-
*/
|
|
7
1
|
import type { InternalMatterAccessory } from './types.js';
|
|
8
|
-
/**
|
|
9
|
-
* Serializable Matter accessory part (excludes functions and runtime state)
|
|
10
|
-
*/
|
|
11
2
|
export interface SerializedMatterAccessoryPart {
|
|
12
3
|
id: string;
|
|
13
4
|
displayName?: string;
|
|
@@ -21,9 +12,6 @@ export interface SerializedMatterAccessoryPart {
|
|
|
21
12
|
};
|
|
22
13
|
};
|
|
23
14
|
}
|
|
24
|
-
/**
|
|
25
|
-
* Serializable Matter accessory (excludes functions and runtime state)
|
|
26
|
-
*/
|
|
27
15
|
export interface SerializedMatterAccessory {
|
|
28
16
|
plugin: string;
|
|
29
17
|
platform: string;
|
|
@@ -47,9 +35,6 @@ export interface SerializedMatterAccessory {
|
|
|
47
35
|
};
|
|
48
36
|
parts?: SerializedMatterAccessoryPart[];
|
|
49
37
|
}
|
|
50
|
-
/**
|
|
51
|
-
* Matter Accessory Cache Manager
|
|
52
|
-
*/
|
|
53
38
|
export declare class MatterAccessoryCache {
|
|
54
39
|
private readonly cacheFilePath;
|
|
55
40
|
private cachedAccessories;
|
|
@@ -59,47 +44,14 @@ export declare class MatterAccessoryCache {
|
|
|
59
44
|
private saveDebounceTimer;
|
|
60
45
|
private readonly SAVE_DEBOUNCE_MS;
|
|
61
46
|
constructor(storagePath: string, bridgeId: string);
|
|
62
|
-
/**
|
|
63
|
-
* Load cached accessories from disk
|
|
64
|
-
* Returns a map of cached accessories keyed by UUID
|
|
65
|
-
*/
|
|
66
47
|
load(): Promise<Map<string, SerializedMatterAccessory>>;
|
|
67
|
-
/**
|
|
68
|
-
* Request a debounced save to cache
|
|
69
|
-
* Multiple rapid calls within the debounce window will only result in one disk write
|
|
70
|
-
* Use this for normal operations to reduce disk I/O
|
|
71
|
-
*/
|
|
72
48
|
requestSave(accessories: Map<string, InternalMatterAccessory>): void;
|
|
73
|
-
/**
|
|
74
|
-
* Save accessories to cache immediately (serialized to prevent concurrent write conflicts)
|
|
75
|
-
* Uses a queue pattern to ensure saves are truly serialized even when called concurrently
|
|
76
|
-
* Use this for shutdown/critical operations that need immediate persistence
|
|
77
|
-
*/
|
|
78
49
|
save(accessories: Map<string, InternalMatterAccessory>): Promise<void>;
|
|
79
|
-
/**
|
|
80
|
-
* Internal save implementation
|
|
81
|
-
* Performs atomic write to prevent cache corruption on system crashes
|
|
82
|
-
*/
|
|
83
50
|
private performSave;
|
|
84
|
-
/**
|
|
85
|
-
* Get cached accessory by UUID
|
|
86
|
-
*/
|
|
87
51
|
getCached(uuid: string): SerializedMatterAccessory | undefined;
|
|
88
|
-
/**
|
|
89
|
-
* Check if an accessory is cached
|
|
90
|
-
*/
|
|
91
52
|
hasCached(uuid: string): boolean;
|
|
92
|
-
/**
|
|
93
|
-
* Remove an accessory from cache
|
|
94
|
-
*/
|
|
95
53
|
removeCached(uuid: string): void;
|
|
96
|
-
/**
|
|
97
|
-
* Get all cached accessories
|
|
98
|
-
*/
|
|
99
54
|
getAllCached(): Map<string, SerializedMatterAccessory>;
|
|
100
|
-
/**
|
|
101
|
-
* Serialize a Matter accessory for storage
|
|
102
|
-
*/
|
|
103
55
|
private serializeAccessory;
|
|
104
56
|
}
|
|
105
57
|
//# sourceMappingURL=accessoryCache.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"accessoryCache.d.ts","sourceRoot":"","sources":["../../src/matter/accessoryCache.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"accessoryCache.d.ts","sourceRoot":"","sources":["../../src/matter/accessoryCache.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAA;AAazD,MAAM,WAAW,6BAA6B;IAC5C,EAAE,EAAE,MAAM,CAAA;IACV,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,UAAU,EAAE;QACV,IAAI,CAAC,EAAE,MAAM,CAAA;QACb,IAAI,CAAC,EAAE,MAAM,CAAA;KACd,CAAA;IACD,QAAQ,EAAE;QACR,CAAC,WAAW,EAAE,MAAM,GAAG;YACrB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAA;SACjC,CAAA;KACF,CAAA;CACF;AAKD,MAAM,WAAW,yBAAyB;IACxC,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,CAAA;IACnB,UAAU,EAAE;QACV,IAAI,CAAC,EAAE,MAAM,CAAA;QACb,IAAI,CAAC,EAAE,MAAM,CAAA;KACd,CAAA;IACD,YAAY,EAAE,MAAM,CAAA;IACpB,YAAY,EAAE,MAAM,CAAA;IACpB,KAAK,EAAE,MAAM,CAAA;IACb,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACjC,QAAQ,CAAC,EAAE;QACT,CAAC,WAAW,EAAE,MAAM,GAAG;YACrB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAA;SACjC,CAAA;KACF,CAAA;IACD,KAAK,CAAC,EAAE,6BAA6B,EAAE,CAAA;CACxC;AAKD,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAQ;IACtC,OAAO,CAAC,iBAAiB,CAAoD;IAC7E,OAAO,CAAC,WAAW,CAAQ;IAC3B,OAAO,CAAC,SAAS,CAAmC;IACpD,OAAO,CAAC,gBAAgB,CAAQ;IAChC,OAAO,CAAC,iBAAiB,CAA8B;IACvD,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAO;gBAE5B,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM;IAQ3C,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,yBAAyB,CAAC,CAAC;IAyD7D,WAAW,CAAC,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,uBAAuB,CAAC,GAAG,IAAI;IAmB9D,IAAI,CAAC,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,uBAAuB,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;YAmB9D,WAAW;IAkDzB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,yBAAyB,GAAG,SAAS;IAO9D,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAOhC,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAOhC,YAAY,IAAI,GAAG,CAAC,MAAM,EAAE,yBAAyB,CAAC;IAOtD,OAAO,CAAC,kBAAkB;CA0C3B"}
|
|
@@ -1,11 +1,7 @@
|
|
|
1
|
-
/* global NodeJS */
|
|
2
1
|
import { dirname, join } from 'node:path';
|
|
3
2
|
import fs from 'fs-extra';
|
|
4
3
|
import { Logger } from '../logger.js';
|
|
5
4
|
const log = Logger.withPrefix('Matter/Accessories');
|
|
6
|
-
/**
|
|
7
|
-
* Matter Accessory Cache Manager
|
|
8
|
-
*/
|
|
9
5
|
export class MatterAccessoryCache {
|
|
10
6
|
cacheFilePath;
|
|
11
7
|
cachedAccessories = new Map();
|
|
@@ -13,44 +9,35 @@ export class MatterAccessoryCache {
|
|
|
13
9
|
saveQueue = Promise.resolve();
|
|
14
10
|
directoryEnsured = false;
|
|
15
11
|
saveDebounceTimer = null;
|
|
16
|
-
SAVE_DEBOUNCE_MS = 2000;
|
|
12
|
+
SAVE_DEBOUNCE_MS = 2000;
|
|
17
13
|
constructor(storagePath, bridgeId) {
|
|
18
14
|
this.cacheFilePath = join(storagePath, bridgeId, 'accessories.json');
|
|
19
15
|
}
|
|
20
|
-
/**
|
|
21
|
-
* Load cached accessories from disk
|
|
22
|
-
* Returns a map of cached accessories keyed by UUID
|
|
23
|
-
*/
|
|
24
16
|
async load() {
|
|
25
17
|
if (this.cacheLoaded) {
|
|
26
18
|
return this.cachedAccessories;
|
|
27
19
|
}
|
|
28
20
|
try {
|
|
29
|
-
// Check if cache file exists
|
|
30
21
|
if (!await fs.pathExists(this.cacheFilePath)) {
|
|
31
22
|
log.info('No cached Matter accessories found (first run)');
|
|
32
23
|
this.cacheLoaded = true;
|
|
33
24
|
return this.cachedAccessories;
|
|
34
25
|
}
|
|
35
|
-
// Read and parse cache file
|
|
36
26
|
const cacheData = await fs.readJson(this.cacheFilePath);
|
|
37
27
|
if (!Array.isArray(cacheData)) {
|
|
38
28
|
throw new TypeError('Cache file does not contain an array');
|
|
39
29
|
}
|
|
40
|
-
// Load accessories into map (only those with valid UUIDs)
|
|
41
30
|
for (const serialized of cacheData) {
|
|
42
31
|
if (serialized.uuid) {
|
|
43
32
|
this.cachedAccessories.set(serialized.uuid, serialized);
|
|
44
33
|
}
|
|
45
34
|
}
|
|
46
35
|
log.info(`Loaded ${this.cachedAccessories.size} cached Matter accessories`);
|
|
47
|
-
// Directory must exist if we successfully loaded the cache file
|
|
48
36
|
this.directoryEnsured = true;
|
|
49
37
|
this.cacheLoaded = true;
|
|
50
38
|
return this.cachedAccessories;
|
|
51
39
|
}
|
|
52
40
|
catch (error) {
|
|
53
|
-
// If JSON parsing failed (corrupted file), delete it and start fresh
|
|
54
41
|
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
55
42
|
log.error(`Failed to load Matter accessory cache from ${this.cacheFilePath}: ${errorMessage}`);
|
|
56
43
|
log.warn('Deleting corrupted cache file and starting fresh');
|
|
@@ -58,62 +45,38 @@ export class MatterAccessoryCache {
|
|
|
58
45
|
await fs.remove(this.cacheFilePath);
|
|
59
46
|
}
|
|
60
47
|
catch (removeError) {
|
|
61
|
-
// non-fatal: couldn't delete corrupted file
|
|
62
48
|
log.debug('Could not delete corrupted cache file:', removeError);
|
|
63
49
|
}
|
|
64
50
|
this.cacheLoaded = true;
|
|
65
51
|
return this.cachedAccessories;
|
|
66
52
|
}
|
|
67
53
|
}
|
|
68
|
-
/**
|
|
69
|
-
* Request a debounced save to cache
|
|
70
|
-
* Multiple rapid calls within the debounce window will only result in one disk write
|
|
71
|
-
* Use this for normal operations to reduce disk I/O
|
|
72
|
-
*/
|
|
73
54
|
requestSave(accessories) {
|
|
74
|
-
// Clear any existing debounce timer
|
|
75
55
|
if (this.saveDebounceTimer) {
|
|
76
56
|
clearTimeout(this.saveDebounceTimer);
|
|
77
57
|
}
|
|
78
|
-
// Schedule a new save after the debounce period
|
|
79
58
|
this.saveDebounceTimer = setTimeout(() => {
|
|
80
59
|
this.save(accessories).catch((error) => {
|
|
81
60
|
log.error('Debounced cache save failed:', error);
|
|
82
61
|
});
|
|
83
62
|
}, this.SAVE_DEBOUNCE_MS);
|
|
84
63
|
}
|
|
85
|
-
/**
|
|
86
|
-
* Save accessories to cache immediately (serialized to prevent concurrent write conflicts)
|
|
87
|
-
* Uses a queue pattern to ensure saves are truly serialized even when called concurrently
|
|
88
|
-
* Use this for shutdown/critical operations that need immediate persistence
|
|
89
|
-
*/
|
|
90
64
|
async save(accessories) {
|
|
91
|
-
// Clear any pending debounced save since we're saving now
|
|
92
65
|
if (this.saveDebounceTimer) {
|
|
93
66
|
clearTimeout(this.saveDebounceTimer);
|
|
94
67
|
this.saveDebounceTimer = null;
|
|
95
68
|
}
|
|
96
|
-
// Chain this save to the end of the queue
|
|
97
|
-
// This ensures all saves run sequentially without race conditions
|
|
98
69
|
this.saveQueue = this.saveQueue.then(() => this.performSave(accessories));
|
|
99
|
-
// Wait for this save to complete
|
|
100
70
|
await this.saveQueue;
|
|
101
71
|
}
|
|
102
|
-
/**
|
|
103
|
-
* Internal save implementation
|
|
104
|
-
* Performs atomic write to prevent cache corruption on system crashes
|
|
105
|
-
*/
|
|
106
72
|
async performSave(accessories) {
|
|
107
73
|
const tempFilePath = `${this.cacheFilePath}.tmp`;
|
|
108
74
|
try {
|
|
109
|
-
// Serialize accessories (strip out functions and non-serializable objects)
|
|
110
75
|
const serialized = Array.from(accessories.values())
|
|
111
76
|
.map(accessory => this.serializeAccessory(accessory));
|
|
112
|
-
// Ensure directory exists (only check once, not on every save)
|
|
113
77
|
if (!this.directoryEnsured) {
|
|
114
78
|
const directory = dirname(this.cacheFilePath);
|
|
115
79
|
await fs.ensureDir(directory);
|
|
116
|
-
// Verify directory was created successfully
|
|
117
80
|
const dirExists = await fs.pathExists(directory);
|
|
118
81
|
if (!dirExists) {
|
|
119
82
|
throw new Error(`Failed to create cache directory: ${directory}`);
|
|
@@ -121,63 +84,41 @@ export class MatterAccessoryCache {
|
|
|
121
84
|
this.directoryEnsured = true;
|
|
122
85
|
log.debug(`Cache directory ensured: ${directory}`);
|
|
123
86
|
}
|
|
124
|
-
// Write to temporary file first (atomic write pattern to prevent corruption)
|
|
125
87
|
await fs.writeJson(tempFilePath, serialized, { spaces: 2 });
|
|
126
|
-
// Atomically move temp file to final location
|
|
127
|
-
// Use move instead of rename for better cross-device compatibility
|
|
128
88
|
await fs.move(tempFilePath, this.cacheFilePath, { overwrite: true });
|
|
129
89
|
log.debug(`Saved ${serialized.length} Matter accessor${serialized.length === 1 ? 'y' : 'ies'} to cache`);
|
|
130
90
|
}
|
|
131
91
|
catch (error) {
|
|
132
92
|
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
133
93
|
log.error(`Failed to save Matter accessory cache: ${errorMessage}`);
|
|
134
|
-
// Clean up temp file if it exists
|
|
135
94
|
try {
|
|
136
95
|
if (await fs.pathExists(tempFilePath)) {
|
|
137
96
|
await fs.remove(tempFilePath);
|
|
138
97
|
}
|
|
139
98
|
}
|
|
140
99
|
catch (cleanupError) {
|
|
141
|
-
// non-fatal: couldn't clean up temp file
|
|
142
100
|
log.debug('Could not clean up temporary cache file:', cleanupError);
|
|
143
101
|
}
|
|
144
102
|
}
|
|
145
103
|
}
|
|
146
|
-
/**
|
|
147
|
-
* Get cached accessory by UUID
|
|
148
|
-
*/
|
|
149
104
|
getCached(uuid) {
|
|
150
105
|
return this.cachedAccessories.get(uuid);
|
|
151
106
|
}
|
|
152
|
-
/**
|
|
153
|
-
* Check if an accessory is cached
|
|
154
|
-
*/
|
|
155
107
|
hasCached(uuid) {
|
|
156
108
|
return this.cachedAccessories.has(uuid);
|
|
157
109
|
}
|
|
158
|
-
/**
|
|
159
|
-
* Remove an accessory from cache
|
|
160
|
-
*/
|
|
161
110
|
removeCached(uuid) {
|
|
162
111
|
this.cachedAccessories.delete(uuid);
|
|
163
112
|
}
|
|
164
|
-
/**
|
|
165
|
-
* Get all cached accessories
|
|
166
|
-
*/
|
|
167
113
|
getAllCached() {
|
|
168
114
|
return new Map(this.cachedAccessories);
|
|
169
115
|
}
|
|
170
|
-
/**
|
|
171
|
-
* Serialize a Matter accessory for storage
|
|
172
|
-
*/
|
|
173
116
|
serializeAccessory(accessory) {
|
|
174
|
-
// Extract device type information (EndpointType has name and code properties)
|
|
175
117
|
const deviceType = accessory.deviceType;
|
|
176
118
|
const deviceTypeInfo = {
|
|
177
119
|
name: deviceType?.name,
|
|
178
120
|
code: deviceType?.code,
|
|
179
121
|
};
|
|
180
|
-
// Serialize parts if present (excluding handlers which are functions)
|
|
181
122
|
let serializedParts;
|
|
182
123
|
if (accessory.parts && accessory.parts.length > 0) {
|
|
183
124
|
serializedParts = accessory.parts.map((part) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"accessoryCache.js","sourceRoot":"","sources":["../../src/matter/accessoryCache.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"accessoryCache.js","sourceRoot":"","sources":["../../src/matter/accessoryCache.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,50 +1,8 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Air Quality Cluster Behavior
|
|
3
|
-
*
|
|
4
|
-
* Handles air quality sensor readings
|
|
5
|
-
* This cluster is primarily read-only, exposing air quality measurements to Matter controllers
|
|
6
|
-
*
|
|
7
|
-
* Example usage:
|
|
8
|
-
* ```typescript
|
|
9
|
-
* const accessory: MatterAccessory = {
|
|
10
|
-
* uuid: 'air-quality-sensor-1',
|
|
11
|
-
* displayName: 'Living Room Air Quality',
|
|
12
|
-
* deviceType: api.matter.deviceTypes.AirQualitySensor,
|
|
13
|
-
* serialNumber: 'AQ-12345',
|
|
14
|
-
* manufacturer: 'Acme',
|
|
15
|
-
* model: 'AQ-100',
|
|
16
|
-
* clusters: {
|
|
17
|
-
* airQuality: {
|
|
18
|
-
* airQuality: 1, // 0=Unknown, 1=Good, 2=Fair, 3=Moderate, 4=Poor, 5=VeryPoor, 6=ExtremelyPoor
|
|
19
|
-
* }
|
|
20
|
-
* }
|
|
21
|
-
* }
|
|
22
|
-
*
|
|
23
|
-
* // Update air quality reading
|
|
24
|
-
* await api.matter.updateClusterState(accessory.uuid, 'airQuality', { airQuality: 2 })
|
|
25
|
-
* ```
|
|
26
|
-
*/
|
|
27
1
|
import type { BehaviorRegistry } from './BehaviorRegistry.js';
|
|
28
2
|
import { AirQualityServer } from '@matter/main/behaviors/air-quality';
|
|
29
|
-
/**
|
|
30
|
-
* Custom Air Quality Server
|
|
31
|
-
*
|
|
32
|
-
* The Air Quality cluster provides an interface for monitoring air quality levels.
|
|
33
|
-
* It includes measurements for overall air quality and various pollutants.
|
|
34
|
-
*
|
|
35
|
-
* This is a read-only cluster - plugins update state via the Matter API,
|
|
36
|
-
* and Matter controllers read these values. No commands are defined.
|
|
37
|
-
*/
|
|
38
3
|
export declare class HomebridgeAirQualityServer extends AirQualityServer {
|
|
39
4
|
private static registry;
|
|
40
|
-
/**
|
|
41
|
-
* Set the behavior registry (called once during server initialization)
|
|
42
|
-
*/
|
|
43
5
|
static setRegistry(registry: BehaviorRegistry): void;
|
|
44
|
-
/**
|
|
45
|
-
* Initialize the air quality server
|
|
46
|
-
* Sets up any required state or listeners
|
|
47
|
-
*/
|
|
48
6
|
initialize(): void;
|
|
49
7
|
}
|
|
50
8
|
//# sourceMappingURL=AirQualityBehavior.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AirQualityBehavior.d.ts","sourceRoot":"","sources":["../../../src/matter/behaviors/AirQualityBehavior.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"AirQualityBehavior.d.ts","sourceRoot":"","sources":["../../../src/matter/behaviors/AirQualityBehavior.ts"],"names":[],"mappings":"AA2BA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AAE7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAA;AAWrE,qBAAa,0BAA2B,SAAQ,gBAAgB;IAC9D,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAkB;IAKzC,MAAM,CAAC,WAAW,CAAC,QAAQ,EAAE,gBAAgB,GAAG,IAAI;IAQ3C,UAAU,IAAI,IAAI;CAM5B"}
|
|
@@ -1,55 +1,11 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Air Quality Cluster Behavior
|
|
3
|
-
*
|
|
4
|
-
* Handles air quality sensor readings
|
|
5
|
-
* This cluster is primarily read-only, exposing air quality measurements to Matter controllers
|
|
6
|
-
*
|
|
7
|
-
* Example usage:
|
|
8
|
-
* ```typescript
|
|
9
|
-
* const accessory: MatterAccessory = {
|
|
10
|
-
* uuid: 'air-quality-sensor-1',
|
|
11
|
-
* displayName: 'Living Room Air Quality',
|
|
12
|
-
* deviceType: api.matter.deviceTypes.AirQualitySensor,
|
|
13
|
-
* serialNumber: 'AQ-12345',
|
|
14
|
-
* manufacturer: 'Acme',
|
|
15
|
-
* model: 'AQ-100',
|
|
16
|
-
* clusters: {
|
|
17
|
-
* airQuality: {
|
|
18
|
-
* airQuality: 1, // 0=Unknown, 1=Good, 2=Fair, 3=Moderate, 4=Poor, 5=VeryPoor, 6=ExtremelyPoor
|
|
19
|
-
* }
|
|
20
|
-
* }
|
|
21
|
-
* }
|
|
22
|
-
*
|
|
23
|
-
* // Update air quality reading
|
|
24
|
-
* await api.matter.updateClusterState(accessory.uuid, 'airQuality', { airQuality: 2 })
|
|
25
|
-
* ```
|
|
26
|
-
*/
|
|
27
1
|
import { AirQualityServer } from '@matter/main/behaviors/air-quality';
|
|
28
|
-
/**
|
|
29
|
-
* Custom Air Quality Server
|
|
30
|
-
*
|
|
31
|
-
* The Air Quality cluster provides an interface for monitoring air quality levels.
|
|
32
|
-
* It includes measurements for overall air quality and various pollutants.
|
|
33
|
-
*
|
|
34
|
-
* This is a read-only cluster - plugins update state via the Matter API,
|
|
35
|
-
* and Matter controllers read these values. No commands are defined.
|
|
36
|
-
*/
|
|
37
2
|
export class HomebridgeAirQualityServer extends AirQualityServer {
|
|
38
3
|
static registry;
|
|
39
|
-
/**
|
|
40
|
-
* Set the behavior registry (called once during server initialization)
|
|
41
|
-
*/
|
|
42
4
|
static setRegistry(registry) {
|
|
43
5
|
this.registry = registry;
|
|
44
6
|
}
|
|
45
|
-
/**
|
|
46
|
-
* Initialize the air quality server
|
|
47
|
-
* Sets up any required state or listeners
|
|
48
|
-
*/
|
|
49
7
|
initialize() {
|
|
50
8
|
super.initialize();
|
|
51
|
-
// Air Quality cluster is read-only, no command handlers needed
|
|
52
|
-
// State updates come from plugin via Matter API's updateClusterState()
|
|
53
9
|
}
|
|
54
10
|
}
|
|
55
11
|
//# sourceMappingURL=AirQualityBehavior.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AirQualityBehavior.js","sourceRoot":"","sources":["../../../src/matter/behaviors/AirQualityBehavior.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"AirQualityBehavior.js","sourceRoot":"","sources":["../../../src/matter/behaviors/AirQualityBehavior.ts"],"names":[],"mappings":"AA6BA,OAAO,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAA;AAWrE,MAAM,OAAO,0BAA2B,SAAQ,gBAAgB;IACtD,MAAM,CAAC,QAAQ,CAAkB;IAKzC,MAAM,CAAC,WAAW,CAAC,QAA0B;QAC3C,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAA;IAC1B,CAAC;IAMQ,UAAU;QACjB,KAAK,CAAC,UAAU,EAAE,CAAA;IAIpB,CAAC;CACF"}
|
|
@@ -1,62 +1,24 @@
|
|
|
1
|
-
|
|
2
|
-
* Behavior Registry
|
|
3
|
-
*
|
|
4
|
-
* Manages handler registration and accessory state without global mutable state.
|
|
5
|
-
* This replaces the global Maps in matterBehaviors.ts.
|
|
6
|
-
*/
|
|
1
|
+
import type { MatterServer } from '../server.js';
|
|
7
2
|
import type { InternalMatterAccessory } from '../types.js';
|
|
8
|
-
/**
|
|
9
|
-
* Handler function signature
|
|
10
|
-
*/
|
|
11
3
|
export type MatterCommandHandler = (...args: any[]) => void | Promise<void>;
|
|
12
|
-
/**
|
|
13
|
-
* Accessory map type
|
|
14
|
-
*/
|
|
15
4
|
export type MatterAccessoryMap = Map<string, InternalMatterAccessory>;
|
|
16
|
-
/**
|
|
17
|
-
* Registry for behavior handlers and accessory state
|
|
18
|
-
* Replaces global state with a proper class instance
|
|
19
|
-
*/
|
|
20
5
|
export declare class BehaviorRegistry {
|
|
21
6
|
private handlers;
|
|
22
7
|
private partEndpoints;
|
|
23
8
|
private accessoriesMap;
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
*/
|
|
9
|
+
private server?;
|
|
10
|
+
constructor(accessoriesMap: MatterAccessoryMap, server?: MatterServer);
|
|
11
|
+
setServer(server: MatterServer): void;
|
|
28
12
|
registerHandler(endpointId: string, clusterName: string, commandName: string, handler: MatterCommandHandler): void;
|
|
29
|
-
/**
|
|
30
|
-
* Get a registered handler
|
|
31
|
-
*/
|
|
32
13
|
getHandler(endpointId: string, clusterName: string, commandName: string): MatterCommandHandler | undefined;
|
|
33
|
-
/**
|
|
34
|
-
* Execute a handler if it exists
|
|
35
|
-
*/
|
|
36
14
|
executeHandler(endpointId: string, clusterName: string, commandName: string, ...args: any[]): Promise<boolean>;
|
|
37
|
-
/**
|
|
38
|
-
* Register a part endpoint mapping
|
|
39
|
-
*/
|
|
40
15
|
registerPartEndpoint(endpointId: string, parentUuid: string, partId: string): void;
|
|
41
|
-
/**
|
|
42
|
-
* Get part endpoint info
|
|
43
|
-
*/
|
|
44
16
|
getPartEndpointInfo(endpointId: string): {
|
|
45
17
|
parentUuid: string;
|
|
46
18
|
partId: string;
|
|
47
19
|
} | undefined;
|
|
48
|
-
/**
|
|
49
|
-
* Sync cluster state to cache
|
|
50
|
-
* Updates the accessory's cached cluster state when values change
|
|
51
|
-
*/
|
|
52
20
|
syncStateToCache(endpointId: string, clusterName: string, attributes: Record<string, unknown>): void;
|
|
53
|
-
/**
|
|
54
|
-
* Clear all handlers (for cleanup)
|
|
55
|
-
*/
|
|
56
21
|
clear(): void;
|
|
57
|
-
/**
|
|
58
|
-
* Get statistics
|
|
59
|
-
*/
|
|
60
22
|
getStats(): {
|
|
61
23
|
handlerCount: number;
|
|
62
24
|
partCount: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BehaviorRegistry.d.ts","sourceRoot":"","sources":["../../../src/matter/behaviors/BehaviorRegistry.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"BehaviorRegistry.d.ts","sourceRoot":"","sources":["../../../src/matter/behaviors/BehaviorRegistry.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAChD,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAA;AAS1D,MAAM,MAAM,oBAAoB,GAAG,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;AAK3E,MAAM,MAAM,kBAAkB,GAAG,GAAG,CAAC,MAAM,EAAE,uBAAuB,CAAC,CAAA;AAMrE,qBAAa,gBAAgB;IAE3B,OAAO,CAAC,QAAQ,CAAoE;IAGpF,OAAO,CAAC,aAAa,CAA4D;IAGjF,OAAO,CAAC,cAAc,CAAoB;IAG1C,OAAO,CAAC,MAAM,CAAC,CAAc;gBAEjB,cAAc,EAAE,kBAAkB,EAAE,MAAM,CAAC,EAAE,YAAY;IAQrE,SAAS,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI;IAOrC,eAAe,CACb,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,oBAAoB,GAC5B,IAAI;IAmBP,UAAU,CACR,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,GAClB,oBAAoB,GAAG,SAAS;IAO7B,cAAc,CAClB,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,EACnB,GAAG,IAAI,EAAE,GAAG,EAAE,GACb,OAAO,CAAC,OAAO,CAAC;IAkBnB,oBAAoB,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAQlF,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS;IAQ3F,gBAAgB,CACd,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAClC,IAAI;IA2DP,KAAK,IAAI,IAAI;IAQb,QAAQ,IAAI;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE;CAaxD"}
|