homebridge 2.0.0-beta.34 → 2.0.0-beta.36
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/api.d.ts +74 -32
- package/dist/api.d.ts.map +1 -1
- package/dist/api.js +48 -46
- package/dist/api.js.map +1 -1
- 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/dist/childBridgeFork.d.ts +1 -18
- package/dist/childBridgeFork.d.ts.map +1 -1
- package/dist/childBridgeFork.js +21 -258
- package/dist/childBridgeFork.js.map +1 -1
- package/dist/externalPortService.d.ts +2 -9
- package/dist/externalPortService.d.ts.map +1 -1
- package/dist/externalPortService.js +20 -40
- package/dist/externalPortService.js.map +1 -1
- package/dist/index.d.ts +10 -10
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -3
- package/dist/index.js.map +1 -1
- 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 +397 -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/{matterServer.d.ts → MatterAPIImpl.d.ts} +203 -367
- 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 +91 -0
- package/dist/matter/MatterBridgeManager.d.ts.map +1 -0
- package/dist/matter/MatterBridgeManager.js +426 -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/{matterAccessoryCache.d.ts → accessoryCache.d.ts} +12 -3
- package/dist/matter/accessoryCache.d.ts.map +1 -0
- package/dist/matter/{matterAccessoryCache.js → accessoryCache.js} +32 -10
- 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 +64 -0
- package/dist/matter/behaviors/ColorControlBehavior.d.ts.map +1 -0
- package/dist/matter/behaviors/ColorControlBehavior.js +160 -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 +21 -0
- package/dist/matter/behaviors/DoorLockBehavior.d.ts.map +1 -0
- package/dist/matter/behaviors/DoorLockBehavior.js +49 -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 +108 -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 +45 -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 +21 -0
- package/dist/matter/behaviors/IdentifyBehavior.d.ts.map +1 -0
- package/dist/matter/behaviors/IdentifyBehavior.js +27 -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 +34 -0
- package/dist/matter/behaviors/LevelControlBehavior.d.ts.map +1 -0
- package/dist/matter/behaviors/LevelControlBehavior.js +75 -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 +140 -0
- package/dist/matter/behaviors/LevelControlBehavior.spec.js.map +1 -0
- package/dist/matter/behaviors/OnOffBehavior.d.ts +28 -0
- package/dist/matter/behaviors/OnOffBehavior.d.ts.map +1 -0
- package/dist/matter/behaviors/OnOffBehavior.js +63 -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 +116 -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 +27 -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 +56 -0
- package/dist/matter/behaviors/RvcCleanModeBehavior.spec.js.map +1 -0
- package/dist/matter/behaviors/RvcOperationalStateBehavior.d.ts +23 -0
- package/dist/matter/behaviors/RvcOperationalStateBehavior.d.ts.map +1 -0
- package/dist/matter/behaviors/RvcOperationalStateBehavior.js +49 -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 +27 -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 +56 -0
- package/dist/matter/behaviors/RvcRunModeBehavior.spec.js.map +1 -0
- package/dist/matter/behaviors/ServiceAreaBehavior.d.ts +22 -0
- package/dist/matter/behaviors/ServiceAreaBehavior.d.ts.map +1 -0
- package/dist/matter/behaviors/ServiceAreaBehavior.js +35 -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 +52 -0
- package/dist/matter/behaviors/ServiceAreaBehavior.spec.js.map +1 -0
- package/dist/matter/behaviors/ThermostatBehavior.d.ts +23 -0
- package/dist/matter/behaviors/ThermostatBehavior.d.ts.map +1 -0
- package/dist/matter/behaviors/ThermostatBehavior.js +79 -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 +32 -0
- package/dist/matter/behaviors/WindowCoveringBehavior.d.ts.map +1 -0
- package/dist/matter/behaviors/WindowCoveringBehavior.js +106 -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/{matterConfigValidator.d.ts → configValidator.d.ts} +1 -1
- package/dist/matter/configValidator.d.ts.map +1 -0
- package/dist/matter/{matterConfigValidator.js → configValidator.js} +1 -1
- 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/index.d.ts +7 -4
- package/dist/matter/index.d.ts.map +1 -1
- package/dist/matter/index.js +7 -4
- package/dist/matter/index.js.map +1 -1
- package/dist/matter/{matterLogFormatter.d.ts → logFormatter.d.ts} +1 -1
- package/dist/matter/logFormatter.d.ts.map +1 -0
- package/dist/matter/{matterLogFormatter.js → logFormatter.js} +33 -6
- 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 +284 -0
- package/dist/matter/logFormatter.spec.js.map +1 -0
- package/dist/matter/server.d.ts +350 -0
- package/dist/matter/server.d.ts.map +1 -0
- package/dist/matter/{matterServer.js → server.js} +533 -352
- package/dist/matter/server.js.map +1 -0
- package/dist/matter/{matterServerHelpers.d.ts → serverHelpers.d.ts} +2 -2
- package/dist/matter/serverHelpers.d.ts.map +1 -0
- package/dist/matter/{matterServerHelpers.js → serverHelpers.js} +11 -8
- 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/{matterSharedTypes.d.ts → sharedTypes.d.ts} +4 -10
- package/dist/matter/sharedTypes.d.ts.map +1 -0
- package/dist/matter/{matterSharedTypes.js → sharedTypes.js} +4 -10
- package/dist/matter/sharedTypes.js.map +1 -0
- package/dist/matter/{matterStorage.d.ts → storage.d.ts} +9 -2
- package/dist/matter/storage.d.ts.map +1 -0
- package/dist/matter/{matterStorage.js → storage.js} +14 -5
- package/dist/matter/{matterStorage.js.map → storage.js.map} +1 -1
- 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/{matterTypes.d.ts → types.d.ts} +2 -2
- package/dist/matter/types.d.ts.map +1 -0
- package/dist/matter/{matterTypes.js → types.js} +1 -2
- package/dist/matter/types.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/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/dist/server.d.ts +4 -13
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +45 -333
- package/dist/server.js.map +1 -1
- 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/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/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.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 +4 -4
- package/dist/matter/matterAccessoryCache.d.ts.map +0 -1
- package/dist/matter/matterAccessoryCache.js.map +0 -1
- package/dist/matter/matterBehaviors.d.ts +0 -194
- package/dist/matter/matterBehaviors.d.ts.map +0 -1
- package/dist/matter/matterBehaviors.js +0 -665
- package/dist/matter/matterBehaviors.js.map +0 -1
- package/dist/matter/matterConfigValidator.d.ts.map +0 -1
- package/dist/matter/matterConfigValidator.js.map +0 -1
- package/dist/matter/matterErrorHandler.d.ts +0 -106
- package/dist/matter/matterErrorHandler.d.ts.map +0 -1
- package/dist/matter/matterErrorHandler.js +0 -495
- package/dist/matter/matterErrorHandler.js.map +0 -1
- package/dist/matter/matterLogFormatter.d.ts.map +0 -1
- package/dist/matter/matterLogFormatter.js.map +0 -1
- package/dist/matter/matterNetworkMonitor.d.ts +0 -68
- package/dist/matter/matterNetworkMonitor.d.ts.map +0 -1
- package/dist/matter/matterNetworkMonitor.js +0 -249
- package/dist/matter/matterNetworkMonitor.js.map +0 -1
- package/dist/matter/matterServer.d.ts.map +0 -1
- package/dist/matter/matterServer.js.map +0 -1
- package/dist/matter/matterServerHelpers.d.ts.map +0 -1
- package/dist/matter/matterServerHelpers.js.map +0 -1
- package/dist/matter/matterSharedTypes.d.ts.map +0 -1
- package/dist/matter/matterSharedTypes.js.map +0 -1
- package/dist/matter/matterStorage.d.ts.map +0 -1
- package/dist/matter/matterTypes.d.ts.map +0 -1
- package/dist/matter/matterTypes.js.map +0 -1
package/dist/index.js
CHANGED
|
@@ -6,12 +6,12 @@ export { APIEvent, PluginType } from './api.js';
|
|
|
6
6
|
* Export Logger const enums
|
|
7
7
|
*/
|
|
8
8
|
export { LogLevel } from './logger.js';
|
|
9
|
-
export { ChildMatterMessageType, MatterBridgeStatus } from './matter/
|
|
9
|
+
export { ChildMatterMessageType, MatterBridgeStatus } from './matter/sharedTypes.js';
|
|
10
10
|
/**
|
|
11
11
|
* Matter device types, clusters, and cluster names
|
|
12
12
|
* Access via api.matter.deviceTypes, api.matter.clusters, api.matter.clusterNames
|
|
13
13
|
*/
|
|
14
|
-
export { clusterNames, clusters, devices, deviceTypes, MatterAccessoryEventTypes } from './matter/
|
|
14
|
+
export { clusterNames, clusters, devices, deviceTypes, MatterAccessoryEventTypes } from './matter/types.js';
|
|
15
15
|
/**
|
|
16
16
|
* ═══════════════════════════════════════════════════════════════════════
|
|
17
17
|
* Matter Protocol - UI Integration Types
|
|
@@ -20,7 +20,7 @@ export { clusterNames, clusters, devices, deviceTypes, MatterAccessoryEventTypes
|
|
|
20
20
|
/**
|
|
21
21
|
* Matter error types for error handling
|
|
22
22
|
*/
|
|
23
|
-
export { MatterCommissioningError, MatterDeviceError, MatterError, MatterErrorType, MatterNetworkError, MatterStorageError, } from './matter/
|
|
23
|
+
export { MatterCommissioningError, MatterDeviceError, MatterError, MatterErrorType, MatterNetworkError, MatterStorageError, } from './matter/types.js';
|
|
24
24
|
/**
|
|
25
25
|
* Export Platform Accessory const enums
|
|
26
26
|
*/
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AA8BA;;GAEG;AACH,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AAiB/C;;GAEG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AA2CtC,OAAO,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,MAAM
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AA8BA;;GAEG;AACH,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AAiB/C;;GAEG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AA2CtC,OAAO,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAA;AAapF;;;GAGG;AACH,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,OAAO,EAAE,WAAW,EAAE,yBAAyB,EAAE,MAAM,mBAAmB,CAAA;AAE3G;;;;GAIG;AAEH;;GAEG;AACH,OAAO,EACL,wBAAwB,EACxB,iBAAiB,EACjB,WAAW,EACX,eAAe,EACf,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,mBAAmB,CAAA;AAI1B;;GAEG;AACH,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAA;AAiB/D;;;;GAIG;AACH,OAAO,EACL,MAAM,EACN,kBAAkB,EAClB,WAAW,EACX,mBAAmB,EACnB,gCAAgC,EAChC,8BAA8B,EAC9B,YAAY,EACZ,eAAe,EACf,uBAAuB,EACvB,wBAAwB,EACxB,eAAe,EACf,uBAAuB,EACvB,wBAAwB,EACxB,WAAW,EACX,UAAU,EACV,sBAAsB,EACtB,UAAU,EACV,YAAY,EACZ,wBAAwB,EACxB,cAAc,EACd,yBAAyB,EACzB,qBAAqB,EACrB,gBAAgB,EAChB,qBAAqB,EACrB,kBAAkB,EAClB,OAAO,EACP,SAAS,EACT,WAAW,EACX,mBAAmB,EACnB,SAAS,EACT,8BAA8B,EAC9B,SAAS,EACT,kBAAkB,EAClB,cAAc,EACd,KAAK,EACL,SAAS,EACT,sBAAsB,EACtB,qBAAqB,EACrB,iBAAiB,EACjB,sBAAsB,EACtB,gBAAgB,EAChB,kBAAkB,EAClB,cAAc,EACd,aAAa,EACb,MAAM,EACN,KAAK,GACN,MAAM,YAAY,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.spec.d.ts","sourceRoot":"","sources":["../src/logger.spec.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
|
|
3
|
+
import { Logger } from './logger.js';
|
|
4
|
+
describe('logger', () => {
|
|
5
|
+
let consoleLogSpy;
|
|
6
|
+
let consoleErrorSpy;
|
|
7
|
+
beforeEach(() => {
|
|
8
|
+
consoleLogSpy = vi.spyOn(console, 'log').mockImplementation(() => { });
|
|
9
|
+
consoleErrorSpy = vi.spyOn(console, 'error').mockImplementation(() => { });
|
|
10
|
+
});
|
|
11
|
+
afterEach(() => {
|
|
12
|
+
consoleLogSpy.mockRestore();
|
|
13
|
+
consoleErrorSpy.mockRestore();
|
|
14
|
+
});
|
|
15
|
+
it('should create a new logger with a prefix', () => {
|
|
16
|
+
const logger = Logger.withPrefix('test');
|
|
17
|
+
expect(logger.prefix).toBe('test');
|
|
18
|
+
});
|
|
19
|
+
it('should log info level messages', () => {
|
|
20
|
+
const logger = Logger.withPrefix('test');
|
|
21
|
+
logger.info('test message');
|
|
22
|
+
expect(consoleLogSpy).toHaveBeenCalledWith(expect.stringContaining('test message'));
|
|
23
|
+
});
|
|
24
|
+
it('should log success level messages', () => {
|
|
25
|
+
const logger = Logger.withPrefix('test');
|
|
26
|
+
logger.success('test message');
|
|
27
|
+
expect(consoleLogSpy).toHaveBeenCalledWith(expect.stringContaining('test message'));
|
|
28
|
+
});
|
|
29
|
+
it('should log warn level messages', () => {
|
|
30
|
+
const logger = Logger.withPrefix('test');
|
|
31
|
+
logger.warn('test message');
|
|
32
|
+
expect(consoleErrorSpy).toHaveBeenCalledWith(expect.stringContaining('test message'));
|
|
33
|
+
});
|
|
34
|
+
it('should log error level messages', () => {
|
|
35
|
+
const logger = Logger.withPrefix('test');
|
|
36
|
+
logger.error('test message');
|
|
37
|
+
expect(consoleErrorSpy).toHaveBeenCalledWith(expect.stringContaining('test message'));
|
|
38
|
+
});
|
|
39
|
+
it('should not log debug level messages when debug is disabled (via method)', () => {
|
|
40
|
+
const logger = Logger.withPrefix('test');
|
|
41
|
+
logger.debug('test message');
|
|
42
|
+
expect(consoleLogSpy).not.toHaveBeenCalled();
|
|
43
|
+
});
|
|
44
|
+
it('should log debug level messages when debug is enabled (via method, no param)', () => {
|
|
45
|
+
Logger.setDebugEnabled();
|
|
46
|
+
const logger = Logger.withPrefix('test');
|
|
47
|
+
logger.debug('test message');
|
|
48
|
+
expect(consoleLogSpy).toHaveBeenCalledWith(expect.stringContaining('test message'));
|
|
49
|
+
Logger.setDebugEnabled(false); // reset debug setting
|
|
50
|
+
});
|
|
51
|
+
it('should log debug level messages when debug is enabled (via method, with param)', () => {
|
|
52
|
+
Logger.setDebugEnabled(true);
|
|
53
|
+
const logger = Logger.withPrefix('test');
|
|
54
|
+
logger.debug('test message');
|
|
55
|
+
expect(consoleLogSpy).toHaveBeenCalledWith(expect.stringContaining('test message'));
|
|
56
|
+
Logger.setDebugEnabled(false); // reset debug setting
|
|
57
|
+
});
|
|
58
|
+
it('should not include timestamps in log messages when timestamp is disabled (via method)', () => {
|
|
59
|
+
Logger.setTimestampEnabled(false);
|
|
60
|
+
const logger = Logger.withPrefix('test');
|
|
61
|
+
logger.info('test message');
|
|
62
|
+
expect(consoleLogSpy).not.toHaveBeenCalledWith(expect.stringMatching(/\[\d{1,2}\/\d{1,2}\/\d{4}, \d{1,2}:\d{2}:\d{2} (AM|PM)\].*/));
|
|
63
|
+
});
|
|
64
|
+
it('should include timestamps in log messages when timestamp is enabled (via method, no param)', () => {
|
|
65
|
+
Logger.setTimestampEnabled();
|
|
66
|
+
const logger = Logger.withPrefix('test');
|
|
67
|
+
logger.info('test message');
|
|
68
|
+
expect(consoleLogSpy).toHaveBeenCalledWith(expect.stringMatching(/\[\d{1,2}\/\d{1,2}\/\d{4}, \d{1,2}:\d{2}:\d{2} (AM|PM)\].*/));
|
|
69
|
+
Logger.setTimestampEnabled(false); // reset timestamp setting
|
|
70
|
+
});
|
|
71
|
+
it('should include timestamps in log messages when timestamp is enabled (via method, with param)', () => {
|
|
72
|
+
Logger.setTimestampEnabled(true);
|
|
73
|
+
const logger = Logger.withPrefix('test');
|
|
74
|
+
logger.info('test message');
|
|
75
|
+
expect(consoleLogSpy).toHaveBeenCalledWith(expect.stringMatching(/\[\d{1,2}\/\d{1,2}\/\d{4}, \d{1,2}:\d{2}:\d{2} (AM|PM)\].*/));
|
|
76
|
+
Logger.setTimestampEnabled(false); // reset timestamp setting
|
|
77
|
+
});
|
|
78
|
+
it('should set chalk level to 1 when forceColor is enabled (via method)', () => {
|
|
79
|
+
Logger.forceColor();
|
|
80
|
+
expect(chalk.level).toBe(1);
|
|
81
|
+
});
|
|
82
|
+
it('should return the same logger when called with the same prefix', () => {
|
|
83
|
+
const logger1 = Logger.withPrefix('test');
|
|
84
|
+
const logger2 = Logger.withPrefix('test');
|
|
85
|
+
expect(logger1).toBe(logger2);
|
|
86
|
+
});
|
|
87
|
+
it('should create different loggers for different prefixes', () => {
|
|
88
|
+
const logger1 = Logger.withPrefix('test1');
|
|
89
|
+
const logger2 = Logger.withPrefix('test2');
|
|
90
|
+
expect(logger1).not.toBe(logger2);
|
|
91
|
+
expect(logger1.prefix).toBe('test1');
|
|
92
|
+
expect(logger2.prefix).toBe('test2');
|
|
93
|
+
});
|
|
94
|
+
});
|
|
95
|
+
//# sourceMappingURL=logger.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.spec.js","sourceRoot":"","sources":["../src/logger.spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Child Bridge Matter Manager
|
|
3
|
+
*
|
|
4
|
+
* Manages Matter server lifecycle and accessories for child bridges.
|
|
5
|
+
* This class extracts Matter-specific logic from childBridgeFork.ts to minimize changes to core files.
|
|
6
|
+
*/
|
|
7
|
+
import type { HomebridgeAPI } from '../api.js';
|
|
8
|
+
import type { BridgeConfiguration, BridgeOptions } from '../bridgeService.js';
|
|
9
|
+
import type { ChildBridgeExternalPortService } from '../externalPortService.js';
|
|
10
|
+
import type { InternalMatterAccessory } from './types.js';
|
|
11
|
+
import { PluginManager } from '../pluginManager.js';
|
|
12
|
+
/**
|
|
13
|
+
* Matter status information for child bridge IPC communication
|
|
14
|
+
*/
|
|
15
|
+
export interface ChildBridgeMatterStatusInfo {
|
|
16
|
+
qrCode?: string;
|
|
17
|
+
manualPairingCode?: string;
|
|
18
|
+
serialNumber?: string;
|
|
19
|
+
commissioned: boolean;
|
|
20
|
+
deviceCount: number;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Manages Matter server and accessories for a child bridge
|
|
24
|
+
*/
|
|
25
|
+
export declare class ChildBridgeMatterManager {
|
|
26
|
+
private readonly bridgeConfig;
|
|
27
|
+
private readonly bridgeOptions;
|
|
28
|
+
private readonly api;
|
|
29
|
+
private readonly externalPortService;
|
|
30
|
+
private readonly pluginManager;
|
|
31
|
+
private matterServer?;
|
|
32
|
+
private readonly externalMatterServers;
|
|
33
|
+
private matterConfig?;
|
|
34
|
+
private matterSerialNumber?;
|
|
35
|
+
constructor(bridgeConfig: BridgeConfiguration, bridgeOptions: BridgeOptions, api: HomebridgeAPI, externalPortService: ChildBridgeExternalPortService, pluginManager: PluginManager);
|
|
36
|
+
/**
|
|
37
|
+
* Initialize Matter server for child bridge if enabled
|
|
38
|
+
* @param onCommissioningChanged - Callback when commissioning state changes
|
|
39
|
+
*/
|
|
40
|
+
initialize(onCommissioningChanged: () => void): Promise<void>;
|
|
41
|
+
/**
|
|
42
|
+
* Start Matter server for child bridge
|
|
43
|
+
*/
|
|
44
|
+
private startMatterServer;
|
|
45
|
+
/**
|
|
46
|
+
* Set up Matter API event listeners
|
|
47
|
+
*/
|
|
48
|
+
private setupEventListeners;
|
|
49
|
+
/**
|
|
50
|
+
* Handle external Matter accessories - each gets its own dedicated Matter server
|
|
51
|
+
* This is required for devices like Robotic Vacuum Cleaners that Apple Home
|
|
52
|
+
* requires to be on their own bridge.
|
|
53
|
+
*/
|
|
54
|
+
handlePublishExternalAccessories(accessories: InternalMatterAccessory[], registrationId: string): Promise<void>;
|
|
55
|
+
/**
|
|
56
|
+
* Handle registration of Matter platform accessories
|
|
57
|
+
*/
|
|
58
|
+
handleRegisterPlatformAccessories(pluginIdentifier: string, platformName: string, accessories: InternalMatterAccessory[]): Promise<void>;
|
|
59
|
+
/**
|
|
60
|
+
* Handle updating Matter platform accessories in the cache
|
|
61
|
+
* Checks both external servers and child bridge server
|
|
62
|
+
*/
|
|
63
|
+
handleUpdatePlatformAccessories(accessories: InternalMatterAccessory[]): Promise<void>;
|
|
64
|
+
/**
|
|
65
|
+
* Handle unregistration of Matter platform accessories
|
|
66
|
+
*/
|
|
67
|
+
handleUnregisterPlatformAccessories(pluginIdentifier: string, platformName: string, accessories: InternalMatterAccessory[]): Promise<void>;
|
|
68
|
+
/**
|
|
69
|
+
* Handle unregistration of external Matter accessories
|
|
70
|
+
* Stops dedicated servers and cleans up storage
|
|
71
|
+
*/
|
|
72
|
+
handleUnregisterExternalAccessories(accessories: InternalMatterAccessory[]): Promise<void>;
|
|
73
|
+
/**
|
|
74
|
+
* Handle Matter accessory state updates
|
|
75
|
+
* Checks both external servers and child bridge server
|
|
76
|
+
*/
|
|
77
|
+
handleUpdateAccessoryState(uuid: string, cluster: string, attributes: Record<string, unknown>, partId?: string): Promise<void>;
|
|
78
|
+
/**
|
|
79
|
+
* Restore cached Matter accessories (matching HAP pattern)
|
|
80
|
+
*/
|
|
81
|
+
restoreCachedAccessories(keepOrphaned: boolean): void;
|
|
82
|
+
/**
|
|
83
|
+
* Get Matter status information for IPC communication
|
|
84
|
+
* Returns undefined if Matter is not enabled for this child bridge
|
|
85
|
+
*/
|
|
86
|
+
getMatterStatusInfo(): ChildBridgeMatterStatusInfo | undefined;
|
|
87
|
+
/**
|
|
88
|
+
* Check if Matter is enabled for this child bridge
|
|
89
|
+
*/
|
|
90
|
+
isMatterEnabled(): boolean;
|
|
91
|
+
/**
|
|
92
|
+
* Teardown Matter servers
|
|
93
|
+
*/
|
|
94
|
+
teardown(): Promise<void>;
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=ChildBridgeMatterManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ChildBridgeMatterManager.d.ts","sourceRoot":"","sources":["../../src/matter/ChildBridgeMatterManager.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,WAAW,CAAA;AAC9C,OAAO,KAAK,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAC7E,OAAO,KAAK,EAAE,8BAA8B,EAAE,MAAM,2BAA2B,CAAA;AAC/E,OAAO,KAAK,EAAE,uBAAuB,EAAiC,MAAM,YAAY,CAAA;AAOxF,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAQnD;;GAEG;AACH,MAAM,WAAW,2BAA2B;IAC1C,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,YAAY,EAAE,OAAO,CAAA;IACrB,WAAW,EAAE,MAAM,CAAA;CACpB;AAED;;GAEG;AACH,qBAAa,wBAAwB;IAejC,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,OAAO,CAAC,QAAQ,CAAC,GAAG;IACpB,OAAO,CAAC,QAAQ,CAAC,mBAAmB;IACpC,OAAO,CAAC,QAAQ,CAAC,aAAa;IAjBhC,OAAO,CAAC,YAAY,CAAC,CAAc;IAInC,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAuC;IAG7E,OAAO,CAAC,YAAY,CAAC,CAAc;IAGnC,OAAO,CAAC,kBAAkB,CAAC,CAAQ;gBAGhB,YAAY,EAAE,mBAAmB,EACjC,aAAa,EAAE,aAAa,EAC5B,GAAG,EAAE,aAAa,EAClB,mBAAmB,EAAE,8BAA8B,EACnD,aAAa,EAAE,aAAa;IAK/C;;;OAGG;IACG,UAAU,CAAC,sBAAsB,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IA6BnE;;OAEG;YACW,iBAAiB;IAiD/B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAwC3B;;;;OAIG;IACG,gCAAgC,CAAC,WAAW,EAAE,uBAAuB,EAAE,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAkDrH;;OAEG;IACG,iCAAiC,CAAC,gBAAgB,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,WAAW,EAAE,uBAAuB,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ9I;;;OAGG;IACG,+BAA+B,CAAC,WAAW,EAAE,uBAAuB,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAyB5F;;OAEG;IACG,mCAAmC,CAAC,gBAAgB,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,WAAW,EAAE,uBAAuB,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAQhJ;;;OAGG;IACG,mCAAmC,CAAC,WAAW,EAAE,uBAAuB,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAyChG;;;OAGG;IACG,0BAA0B,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAgBpI;;OAEG;IACH,wBAAwB,CAAC,YAAY,EAAE,OAAO,GAAG,IAAI;IAmDrD;;;OAGG;IACH,mBAAmB,IAAI,2BAA2B,GAAG,SAAS;IAe9D;;OAEG;IACH,eAAe,IAAI,OAAO;IAI1B;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CAsBhC"}
|
|
@@ -0,0 +1,397 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Child Bridge Matter Manager
|
|
3
|
+
*
|
|
4
|
+
* Manages Matter server lifecycle and accessories for child bridges.
|
|
5
|
+
* This class extracts Matter-specific logic from childBridgeFork.ts to minimize changes to core files.
|
|
6
|
+
*/
|
|
7
|
+
import { rmSync } from 'node:fs';
|
|
8
|
+
import path from 'node:path';
|
|
9
|
+
import { Logger } from '../logger.js';
|
|
10
|
+
import { User } from '../user.js';
|
|
11
|
+
import { generate } from '../util/mac.js';
|
|
12
|
+
import { publishExternalMatterAccessory } from './ExternalMatterAccessoryPublisher.js';
|
|
13
|
+
import { MatterServer } from './server.js';
|
|
14
|
+
const log = Logger.internal;
|
|
15
|
+
/**
|
|
16
|
+
* Manages Matter server and accessories for a child bridge
|
|
17
|
+
*/
|
|
18
|
+
export class ChildBridgeMatterManager {
|
|
19
|
+
bridgeConfig;
|
|
20
|
+
bridgeOptions;
|
|
21
|
+
api;
|
|
22
|
+
externalPortService;
|
|
23
|
+
pluginManager;
|
|
24
|
+
// Matter server instance for child bridge (if enabled)
|
|
25
|
+
matterServer;
|
|
26
|
+
// External Matter servers for accessories that need their own bridge
|
|
27
|
+
// Key is accessory UUID, value is MatterServer instance
|
|
28
|
+
externalMatterServers = new Map();
|
|
29
|
+
// Matter configuration from bridge config
|
|
30
|
+
matterConfig;
|
|
31
|
+
// Stored serial number for status updates
|
|
32
|
+
matterSerialNumber;
|
|
33
|
+
constructor(bridgeConfig, bridgeOptions, api, externalPortService, pluginManager) {
|
|
34
|
+
this.bridgeConfig = bridgeConfig;
|
|
35
|
+
this.bridgeOptions = bridgeOptions;
|
|
36
|
+
this.api = api;
|
|
37
|
+
this.externalPortService = externalPortService;
|
|
38
|
+
this.pluginManager = pluginManager;
|
|
39
|
+
this.matterConfig = bridgeConfig.matter;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Initialize Matter server for child bridge if enabled
|
|
43
|
+
* @param onCommissioningChanged - Callback when commissioning state changes
|
|
44
|
+
*/
|
|
45
|
+
async initialize(onCommissioningChanged) {
|
|
46
|
+
// Check if Matter is configured
|
|
47
|
+
if (!this.matterConfig) {
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
log.debug('Child bridge has Matter config (Combined HAP+Matter), starting Matter server');
|
|
51
|
+
// If Matter doesn't have a port configured, allocate one
|
|
52
|
+
if (!this.matterConfig.port) {
|
|
53
|
+
// Generate a unique username for Matter port allocation
|
|
54
|
+
const matterUsername = `${this.bridgeConfig.username}:MATTER`;
|
|
55
|
+
const matterPort = await this.externalPortService.requestPort(matterUsername);
|
|
56
|
+
if (!matterPort) {
|
|
57
|
+
throw new Error('Failed to allocate Matter port for child bridge. '
|
|
58
|
+
+ 'Please specify a port manually in the _bridge.matter configuration, or free up ports in the configured range.');
|
|
59
|
+
}
|
|
60
|
+
this.matterConfig.port = matterPort;
|
|
61
|
+
log.debug(`Allocated Matter port: ${this.matterConfig.port} (HAP port: ${this.bridgeConfig.port})`);
|
|
62
|
+
}
|
|
63
|
+
// Start Matter server
|
|
64
|
+
await this.startMatterServer(this.matterConfig, onCommissioningChanged);
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Start Matter server for child bridge
|
|
68
|
+
*/
|
|
69
|
+
async startMatterServer(matterConfig, onCommissioningChanged) {
|
|
70
|
+
log.info('Starting Matter server in child bridge process');
|
|
71
|
+
// Create Matter server with the provided configuration
|
|
72
|
+
const serialNumber = this.bridgeConfig.username.replace(/:/g, '');
|
|
73
|
+
// Normalize bind config to array format
|
|
74
|
+
const networkInterfaces = this.bridgeConfig.bind
|
|
75
|
+
? Array.isArray(this.bridgeConfig.bind)
|
|
76
|
+
? this.bridgeConfig.bind
|
|
77
|
+
: [this.bridgeConfig.bind]
|
|
78
|
+
: undefined;
|
|
79
|
+
this.matterServer = new MatterServer({
|
|
80
|
+
port: matterConfig.port || 5540,
|
|
81
|
+
uniqueId: serialNumber,
|
|
82
|
+
storagePath: User.matterPath(),
|
|
83
|
+
debugModeEnabled: this.bridgeOptions.debugModeEnabled,
|
|
84
|
+
manufacturer: this.bridgeConfig.manufacturer,
|
|
85
|
+
model: this.bridgeConfig.model,
|
|
86
|
+
firmwareRevision: this.bridgeConfig.firmwareRevision,
|
|
87
|
+
serialNumber,
|
|
88
|
+
networkInterfaces,
|
|
89
|
+
});
|
|
90
|
+
await this.matterServer.start();
|
|
91
|
+
// Inform the API that Matter is enabled
|
|
92
|
+
this.api._setMatterEnabled(true);
|
|
93
|
+
// Set the Matter server reference for API methods like getAccessoryState
|
|
94
|
+
this.api._setMatterServer(this.matterServer);
|
|
95
|
+
const commissioningInfo = this.matterServer.getCommissioningInfo();
|
|
96
|
+
log.info('Matter server started with commissioning info:', commissioningInfo);
|
|
97
|
+
// Store the serial number for status updates
|
|
98
|
+
this.matterSerialNumber = commissioningInfo.serialNumber;
|
|
99
|
+
// Listen for Matter commissioning events to update status
|
|
100
|
+
this.matterServer.on('commissioning-changed', (commissioned, fabricCount) => {
|
|
101
|
+
log.info(`Matter commissioning state changed: commissioned=${commissioned}, fabricCount=${fabricCount}`);
|
|
102
|
+
onCommissioningChanged();
|
|
103
|
+
});
|
|
104
|
+
// Set up event listeners for Matter API calls
|
|
105
|
+
this.setupEventListeners();
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Set up Matter API event listeners
|
|
109
|
+
*/
|
|
110
|
+
setupEventListeners() {
|
|
111
|
+
this.api.on("publishExternalMatterAccessories" /* InternalAPIEvent.PUBLISH_EXTERNAL_MATTER_ACCESSORIES */, (accessories, registrationId) => {
|
|
112
|
+
this.handlePublishExternalAccessories(accessories, registrationId).catch((error) => {
|
|
113
|
+
log.error('Failed to publish external Matter accessories:', error);
|
|
114
|
+
// Make sure to resolve the registration even on error
|
|
115
|
+
this.api._resolveExternalRegistration(registrationId);
|
|
116
|
+
});
|
|
117
|
+
});
|
|
118
|
+
this.api.on("registerMatterPlatformAccessories" /* InternalAPIEvent.REGISTER_MATTER_PLATFORM_ACCESSORIES */, (pluginIdentifier, platformName, accessories) => {
|
|
119
|
+
this.handleRegisterPlatformAccessories(pluginIdentifier, platformName, accessories).catch((error) => {
|
|
120
|
+
log.error(`Failed to register Matter accessories for ${pluginIdentifier}:`, error);
|
|
121
|
+
});
|
|
122
|
+
});
|
|
123
|
+
this.api.on("updateMatterPlatformAccessories" /* InternalAPIEvent.UPDATE_MATTER_PLATFORM_ACCESSORIES */, (accessories) => {
|
|
124
|
+
this.handleUpdatePlatformAccessories(accessories).catch((error) => {
|
|
125
|
+
log.error('Failed to update Matter platform accessories:', error);
|
|
126
|
+
});
|
|
127
|
+
});
|
|
128
|
+
this.api.on("unregisterMatterPlatformAccessories" /* InternalAPIEvent.UNREGISTER_MATTER_PLATFORM_ACCESSORIES */, (pluginIdentifier, platformName, accessories) => {
|
|
129
|
+
this.handleUnregisterPlatformAccessories(pluginIdentifier, platformName, accessories).catch((error) => {
|
|
130
|
+
log.error(`Failed to unregister Matter accessories for ${pluginIdentifier}:`, error);
|
|
131
|
+
});
|
|
132
|
+
});
|
|
133
|
+
this.api.on("unregisterExternalMatterAccessories" /* InternalAPIEvent.UNREGISTER_EXTERNAL_MATTER_ACCESSORIES */, (accessories) => {
|
|
134
|
+
this.handleUnregisterExternalAccessories(accessories).catch((error) => {
|
|
135
|
+
log.error('Failed to unregister external Matter accessories:', error);
|
|
136
|
+
});
|
|
137
|
+
});
|
|
138
|
+
this.api.on("updateMatterAccessoryState" /* InternalAPIEvent.UPDATE_MATTER_ACCESSORY_STATE */, (uuid, cluster, attributes, partId) => {
|
|
139
|
+
this.handleUpdateAccessoryState(uuid, cluster, attributes, partId).catch((error) => {
|
|
140
|
+
log.error(`Failed to update Matter accessory state for ${uuid}:`, error);
|
|
141
|
+
});
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Handle external Matter accessories - each gets its own dedicated Matter server
|
|
146
|
+
* This is required for devices like Robotic Vacuum Cleaners that Apple Home
|
|
147
|
+
* requires to be on their own bridge.
|
|
148
|
+
*/
|
|
149
|
+
async handlePublishExternalAccessories(accessories, registrationId) {
|
|
150
|
+
log.info(`Publishing ${accessories.length} external Matter accessor${accessories.length === 1 ? 'y' : 'ies'} from child bridge`);
|
|
151
|
+
try {
|
|
152
|
+
// Normalize bind config to array format (inherit from bridge)
|
|
153
|
+
const networkInterfaces = this.bridgeConfig.bind
|
|
154
|
+
? Array.isArray(this.bridgeConfig.bind)
|
|
155
|
+
? this.bridgeConfig.bind
|
|
156
|
+
: [this.bridgeConfig.bind]
|
|
157
|
+
: undefined;
|
|
158
|
+
for (const accessory of accessories) {
|
|
159
|
+
try {
|
|
160
|
+
// Check if already published
|
|
161
|
+
if (this.externalMatterServers.has(accessory.uuid)) {
|
|
162
|
+
log.warn(`External Matter accessory ${accessory.displayName} (${accessory.uuid}) is already published`);
|
|
163
|
+
continue;
|
|
164
|
+
}
|
|
165
|
+
// Publish the accessory using shared helper
|
|
166
|
+
const result = await publishExternalMatterAccessory(accessory, {
|
|
167
|
+
portService: this.externalPortService,
|
|
168
|
+
networkInterfaces,
|
|
169
|
+
debugModeEnabled: this.bridgeOptions.debugModeEnabled,
|
|
170
|
+
});
|
|
171
|
+
if (!result) {
|
|
172
|
+
// Validation or publishing failed (errors already logged by helper)
|
|
173
|
+
continue;
|
|
174
|
+
}
|
|
175
|
+
// Store the server instance
|
|
176
|
+
this.externalMatterServers.set(accessory.uuid, result.server);
|
|
177
|
+
// Log commissioning info
|
|
178
|
+
if (result.commissioningInfo.qrCode && result.commissioningInfo.manualPairingCode) {
|
|
179
|
+
log.info(`📱 Commissioning codes for ${accessory.displayName}:`);
|
|
180
|
+
log.info(` QR Code: ${result.commissioningInfo.qrCode}`);
|
|
181
|
+
log.info(` Manual Code: ${result.commissioningInfo.manualPairingCode}`);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
catch (error) {
|
|
185
|
+
log.error(`Failed to publish external Matter accessory ${accessory.displayName}:`, error);
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
finally {
|
|
190
|
+
// Notify that registration is complete (whether successful or not)
|
|
191
|
+
this.api._resolveExternalRegistration(registrationId);
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Handle registration of Matter platform accessories
|
|
196
|
+
*/
|
|
197
|
+
async handleRegisterPlatformAccessories(pluginIdentifier, platformName, accessories) {
|
|
198
|
+
if (!this.matterServer) {
|
|
199
|
+
log.warn('Cannot register Matter accessories - Matter server is not running');
|
|
200
|
+
return;
|
|
201
|
+
}
|
|
202
|
+
await this.matterServer.registerPlatformAccessories(pluginIdentifier, platformName, accessories);
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Handle updating Matter platform accessories in the cache
|
|
206
|
+
* Checks both external servers and child bridge server
|
|
207
|
+
*/
|
|
208
|
+
async handleUpdatePlatformAccessories(accessories) {
|
|
209
|
+
const bridgeAccessories = [];
|
|
210
|
+
// Route each accessory to the appropriate server
|
|
211
|
+
for (const accessory of accessories) {
|
|
212
|
+
const externalServer = this.externalMatterServers.get(accessory.uuid);
|
|
213
|
+
if (externalServer) {
|
|
214
|
+
// Update external accessory
|
|
215
|
+
await externalServer.updatePlatformAccessories([accessory]);
|
|
216
|
+
}
|
|
217
|
+
else {
|
|
218
|
+
// Collect accessories for child bridge
|
|
219
|
+
bridgeAccessories.push(accessory);
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
// Update accessories on child bridge server if any
|
|
223
|
+
if (bridgeAccessories.length > 0) {
|
|
224
|
+
if (!this.matterServer) {
|
|
225
|
+
log.warn('Cannot update Matter platform accessories - Matter server is not running');
|
|
226
|
+
return;
|
|
227
|
+
}
|
|
228
|
+
await this.matterServer.updatePlatformAccessories(bridgeAccessories);
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Handle unregistration of Matter platform accessories
|
|
233
|
+
*/
|
|
234
|
+
async handleUnregisterPlatformAccessories(pluginIdentifier, platformName, accessories) {
|
|
235
|
+
if (!this.matterServer) {
|
|
236
|
+
log.warn('Cannot unregister Matter accessories - Matter server is not running');
|
|
237
|
+
return;
|
|
238
|
+
}
|
|
239
|
+
await this.matterServer.unregisterPlatformAccessories(pluginIdentifier, platformName, accessories);
|
|
240
|
+
}
|
|
241
|
+
/**
|
|
242
|
+
* Handle unregistration of external Matter accessories
|
|
243
|
+
* Stops dedicated servers and cleans up storage
|
|
244
|
+
*/
|
|
245
|
+
async handleUnregisterExternalAccessories(accessories) {
|
|
246
|
+
log.info(`Unregistering ${accessories.length} external Matter accessor${accessories.length === 1 ? 'y' : 'ies'} from child bridge`);
|
|
247
|
+
for (const accessory of accessories) {
|
|
248
|
+
try {
|
|
249
|
+
// Check if this external server exists
|
|
250
|
+
const matterServer = this.externalMatterServers.get(accessory.uuid);
|
|
251
|
+
if (!matterServer) {
|
|
252
|
+
log.warn(`External Matter accessory ${accessory.displayName} (${accessory.uuid}) is not registered`);
|
|
253
|
+
continue;
|
|
254
|
+
}
|
|
255
|
+
log.info(`Stopping external Matter server for ${accessory.displayName}`);
|
|
256
|
+
// Stop the Matter server
|
|
257
|
+
await matterServer.stop();
|
|
258
|
+
// Remove from the map
|
|
259
|
+
this.externalMatterServers.delete(accessory.uuid);
|
|
260
|
+
// Clean up storage folder
|
|
261
|
+
// Generate the same uniqueId that was used when creating the server
|
|
262
|
+
const advertiseAddress = generate(accessory.uuid);
|
|
263
|
+
const uniqueId = advertiseAddress.replace(/:/g, '');
|
|
264
|
+
const storagePath = path.join(User.matterPath(), uniqueId);
|
|
265
|
+
try {
|
|
266
|
+
log.debug(`Removing Matter storage for external accessory at: ${storagePath}`);
|
|
267
|
+
rmSync(storagePath, { recursive: true, force: true });
|
|
268
|
+
log.info(`✓ Cleaned up storage for external Matter accessory: ${accessory.displayName}`);
|
|
269
|
+
}
|
|
270
|
+
catch (error) {
|
|
271
|
+
log.error(`Failed to clean up storage for external Matter accessory ${accessory.displayName}:`, error);
|
|
272
|
+
}
|
|
273
|
+
log.info(`✓ External Matter accessory unregistered: ${accessory.displayName}`);
|
|
274
|
+
}
|
|
275
|
+
catch (error) {
|
|
276
|
+
log.error(`Failed to unregister external Matter accessory ${accessory.displayName}:`, error);
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
/**
|
|
281
|
+
* Handle Matter accessory state updates
|
|
282
|
+
* Checks both external servers and child bridge server
|
|
283
|
+
*/
|
|
284
|
+
async handleUpdateAccessoryState(uuid, cluster, attributes, partId) {
|
|
285
|
+
// Check if this is an external accessory first (each has its own MatterServer)
|
|
286
|
+
const externalServer = this.externalMatterServers.get(uuid);
|
|
287
|
+
if (externalServer) {
|
|
288
|
+
await externalServer.updateAccessoryState(uuid, cluster, attributes, partId);
|
|
289
|
+
return;
|
|
290
|
+
}
|
|
291
|
+
// Otherwise, try the main child bridge Matter server
|
|
292
|
+
if (!this.matterServer) {
|
|
293
|
+
log.warn(`Cannot update Matter accessory state for ${uuid} - accessory not found in external servers and child bridge Matter server is not running`);
|
|
294
|
+
return;
|
|
295
|
+
}
|
|
296
|
+
await this.matterServer.updateAccessoryState(uuid, cluster, attributes, partId);
|
|
297
|
+
}
|
|
298
|
+
/**
|
|
299
|
+
* Restore cached Matter accessories (matching HAP pattern)
|
|
300
|
+
*/
|
|
301
|
+
restoreCachedAccessories(keepOrphaned) {
|
|
302
|
+
if (!this.matterServer) {
|
|
303
|
+
log.debug('Matter server not available for restoring cached accessories');
|
|
304
|
+
return;
|
|
305
|
+
}
|
|
306
|
+
const cachedAccessories = this.matterServer.getAllCachedAccessories();
|
|
307
|
+
log.debug(`Restoring ${cachedAccessories.length} cached Matter accessories`);
|
|
308
|
+
for (const cachedAccessory of cachedAccessories) {
|
|
309
|
+
let plugin = this.pluginManager.getPlugin(cachedAccessory.plugin);
|
|
310
|
+
if (!plugin) {
|
|
311
|
+
try {
|
|
312
|
+
// Try to find plugin by platform name (handles plugin renames)
|
|
313
|
+
plugin = this.pluginManager.getPluginByActiveDynamicPlatform(cachedAccessory.platform);
|
|
314
|
+
if (plugin) {
|
|
315
|
+
log.info(`When searching for the associated plugin of the Matter accessory '${cachedAccessory.displayName}' `
|
|
316
|
+
+ `it seems like the plugin name changed from '${cachedAccessory.plugin}' to '${plugin.getPluginIdentifier()}'. Plugin association is now being transformed!`);
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
catch (error) {
|
|
320
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
321
|
+
log.warn(`Could not find the associated plugin for the Matter accessory '${cachedAccessory.displayName}'. `
|
|
322
|
+
+ `Tried to find the plugin by the platform name but ${errorMessage}`);
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
const platformPlugin = plugin && plugin.getActiveDynamicPlatform(cachedAccessory.platform);
|
|
326
|
+
if (!platformPlugin) {
|
|
327
|
+
log.warn(`Failed to find plugin to handle Matter accessory ${cachedAccessory.displayName} (plugin: ${cachedAccessory.plugin}, platform: ${cachedAccessory.platform})`);
|
|
328
|
+
if (!keepOrphaned) {
|
|
329
|
+
log.info(`Removing orphaned Matter accessory ${cachedAccessory.displayName}`);
|
|
330
|
+
this.matterServer.unregisterAccessory(cachedAccessory.uuid).catch((error) => {
|
|
331
|
+
log.warn(`Failed to unregister orphaned Matter accessory ${cachedAccessory.displayName}:`, error);
|
|
332
|
+
});
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
else {
|
|
336
|
+
// Call configureMatterAccessory if the plugin implements it
|
|
337
|
+
if (platformPlugin.configureMatterAccessory) {
|
|
338
|
+
log.debug(`Calling configureMatterAccessory for ${cachedAccessory.displayName}`);
|
|
339
|
+
platformPlugin.configureMatterAccessory(cachedAccessory);
|
|
340
|
+
}
|
|
341
|
+
else {
|
|
342
|
+
log.debug(`Platform ${cachedAccessory.platform} does not implement configureMatterAccessory`);
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
/**
|
|
348
|
+
* Get Matter status information for IPC communication
|
|
349
|
+
* Returns undefined if Matter is not enabled for this child bridge
|
|
350
|
+
*/
|
|
351
|
+
getMatterStatusInfo() {
|
|
352
|
+
if (!this.matterConfig || !this.matterServer) {
|
|
353
|
+
return undefined;
|
|
354
|
+
}
|
|
355
|
+
const commissioningInfo = this.matterServer.getCommissioningInfo();
|
|
356
|
+
return {
|
|
357
|
+
qrCode: commissioningInfo.qrCode,
|
|
358
|
+
manualPairingCode: commissioningInfo.manualPairingCode,
|
|
359
|
+
serialNumber: this.matterSerialNumber || commissioningInfo.serialNumber,
|
|
360
|
+
commissioned: commissioningInfo.commissioned || false,
|
|
361
|
+
deviceCount: this.matterServer.getAccessories().length,
|
|
362
|
+
};
|
|
363
|
+
}
|
|
364
|
+
/**
|
|
365
|
+
* Check if Matter is enabled for this child bridge
|
|
366
|
+
*/
|
|
367
|
+
isMatterEnabled() {
|
|
368
|
+
return this.matterServer !== undefined;
|
|
369
|
+
}
|
|
370
|
+
/**
|
|
371
|
+
* Teardown Matter servers
|
|
372
|
+
*/
|
|
373
|
+
async teardown() {
|
|
374
|
+
// Stop main Matter server if it was initialized
|
|
375
|
+
if (this.matterServer) {
|
|
376
|
+
log.debug('Stopping Matter server');
|
|
377
|
+
try {
|
|
378
|
+
await this.matterServer.stop();
|
|
379
|
+
}
|
|
380
|
+
catch (error) {
|
|
381
|
+
log.error('Error stopping Matter server:', error);
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
// Stop all external Matter servers
|
|
385
|
+
for (const [uuid, matterServer] of this.externalMatterServers) {
|
|
386
|
+
log.debug(`Stopping external Matter server for ${uuid}`);
|
|
387
|
+
try {
|
|
388
|
+
await matterServer.stop();
|
|
389
|
+
}
|
|
390
|
+
catch (error) {
|
|
391
|
+
log.error(`Error stopping external Matter server for ${uuid}:`, error);
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
this.externalMatterServers.clear();
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
//# sourceMappingURL=ChildBridgeMatterManager.js.map
|