homebridge 2.0.0-beta.4 → 2.0.0-beta.40
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +16 -17
- package/bin/homebridge.js +22 -0
- package/config-sample.json +3 -3
- package/dist/api.d.ts +499 -0
- package/dist/api.d.ts.map +1 -0
- package/dist/api.js +223 -0
- package/dist/api.js.map +1 -0
- package/dist/api.spec.d.ts +2 -0
- package/dist/api.spec.d.ts.map +1 -0
- package/dist/api.spec.js +413 -0
- package/dist/api.spec.js.map +1 -0
- package/{lib → dist}/bridgeService.d.ts +19 -10
- package/dist/bridgeService.d.ts.map +1 -0
- package/{lib → dist}/bridgeService.js +85 -117
- package/dist/bridgeService.js.map +1 -0
- package/{lib → dist}/childBridgeFork.d.ts +11 -5
- package/dist/childBridgeFork.d.ts.map +1 -0
- package/{lib → dist}/childBridgeFork.js +93 -44
- package/dist/childBridgeFork.js.map +1 -0
- package/{lib → dist}/childBridgeService.d.ts +37 -7
- package/dist/childBridgeService.d.ts.map +1 -0
- package/{lib → dist}/childBridgeService.js +127 -69
- package/dist/childBridgeService.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +90 -0
- package/dist/cli.js.map +1 -0
- package/dist/externalPortService.d.ts +47 -0
- package/dist/externalPortService.d.ts.map +1 -0
- package/dist/externalPortService.js +105 -0
- package/dist/externalPortService.js.map +1 -0
- package/dist/index.d.ts +141 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +53 -0
- package/dist/index.js.map +1 -0
- package/dist/ipcService.d.ts +48 -0
- package/dist/ipcService.d.ts.map +1 -0
- package/{lib → dist}/ipcService.js +12 -14
- package/dist/ipcService.js.map +1 -0
- package/{lib → dist}/logger.d.ts +12 -6
- package/dist/logger.d.ts.map +1 -0
- package/{lib → dist}/logger.js +27 -28
- package/dist/logger.js.map +1 -0
- package/dist/logger.spec.d.ts +2 -0
- package/dist/logger.spec.d.ts.map +1 -0
- package/dist/logger.spec.js +95 -0
- package/dist/logger.spec.js.map +1 -0
- package/dist/matter/ChildBridgeMatterManager.d.ts +96 -0
- package/dist/matter/ChildBridgeMatterManager.d.ts.map +1 -0
- package/dist/matter/ChildBridgeMatterManager.js +399 -0
- package/dist/matter/ChildBridgeMatterManager.js.map +1 -0
- package/dist/matter/ExternalMatterAccessoryPublisher.d.ts +48 -0
- package/dist/matter/ExternalMatterAccessoryPublisher.d.ts.map +1 -0
- package/dist/matter/ExternalMatterAccessoryPublisher.js +73 -0
- package/dist/matter/ExternalMatterAccessoryPublisher.js.map +1 -0
- package/dist/matter/ExternalMatterAccessoryPublisher.spec.d.ts +2 -0
- package/dist/matter/ExternalMatterAccessoryPublisher.spec.d.ts.map +1 -0
- package/dist/matter/ExternalMatterAccessoryPublisher.spec.js +293 -0
- package/dist/matter/ExternalMatterAccessoryPublisher.spec.js.map +1 -0
- package/dist/matter/MatterAPIImpl.d.ts +504 -0
- package/dist/matter/MatterAPIImpl.d.ts.map +1 -0
- package/dist/matter/MatterAPIImpl.js +305 -0
- package/dist/matter/MatterAPIImpl.js.map +1 -0
- package/dist/matter/MatterBridgeManager.d.ts +87 -0
- package/dist/matter/MatterBridgeManager.d.ts.map +1 -0
- package/dist/matter/MatterBridgeManager.js +413 -0
- package/dist/matter/MatterBridgeManager.js.map +1 -0
- package/dist/matter/MatterConfigCollector.d.ts +26 -0
- package/dist/matter/MatterConfigCollector.d.ts.map +1 -0
- package/dist/matter/MatterConfigCollector.js +78 -0
- package/dist/matter/MatterConfigCollector.js.map +1 -0
- package/dist/matter/accessoryCache.d.ts +105 -0
- package/dist/matter/accessoryCache.d.ts.map +1 -0
- package/dist/matter/accessoryCache.js +214 -0
- package/dist/matter/accessoryCache.js.map +1 -0
- package/dist/matter/accessoryCache.spec.d.ts +2 -0
- package/dist/matter/accessoryCache.spec.d.ts.map +1 -0
- package/dist/matter/accessoryCache.spec.js +452 -0
- package/dist/matter/accessoryCache.spec.js.map +1 -0
- package/dist/matter/behaviors/BehaviorRegistry.d.ts +65 -0
- package/dist/matter/behaviors/BehaviorRegistry.d.ts.map +1 -0
- package/dist/matter/behaviors/BehaviorRegistry.js +139 -0
- package/dist/matter/behaviors/BehaviorRegistry.js.map +1 -0
- package/dist/matter/behaviors/BehaviorRegistry.spec.d.ts +2 -0
- package/dist/matter/behaviors/BehaviorRegistry.spec.d.ts.map +1 -0
- package/dist/matter/behaviors/BehaviorRegistry.spec.js +307 -0
- package/dist/matter/behaviors/BehaviorRegistry.spec.js.map +1 -0
- package/dist/matter/behaviors/ColorControlBehavior.d.ts +63 -0
- package/dist/matter/behaviors/ColorControlBehavior.d.ts.map +1 -0
- package/dist/matter/behaviors/ColorControlBehavior.js +223 -0
- package/dist/matter/behaviors/ColorControlBehavior.js.map +1 -0
- package/dist/matter/behaviors/ColorControlBehavior.spec.d.ts +2 -0
- package/dist/matter/behaviors/ColorControlBehavior.spec.d.ts.map +1 -0
- package/dist/matter/behaviors/ColorControlBehavior.spec.js +29 -0
- package/dist/matter/behaviors/ColorControlBehavior.spec.js.map +1 -0
- package/dist/matter/behaviors/DoorLockBehavior.d.ts +20 -0
- package/dist/matter/behaviors/DoorLockBehavior.d.ts.map +1 -0
- package/dist/matter/behaviors/DoorLockBehavior.js +71 -0
- package/dist/matter/behaviors/DoorLockBehavior.js.map +1 -0
- package/dist/matter/behaviors/DoorLockBehavior.spec.d.ts +2 -0
- package/dist/matter/behaviors/DoorLockBehavior.spec.d.ts.map +1 -0
- package/dist/matter/behaviors/DoorLockBehavior.spec.js +120 -0
- package/dist/matter/behaviors/DoorLockBehavior.spec.js.map +1 -0
- package/dist/matter/behaviors/FanControlBehavior.d.ts +20 -0
- package/dist/matter/behaviors/FanControlBehavior.d.ts.map +1 -0
- package/dist/matter/behaviors/FanControlBehavior.js +71 -0
- package/dist/matter/behaviors/FanControlBehavior.js.map +1 -0
- package/dist/matter/behaviors/FanControlBehavior.spec.d.ts +2 -0
- package/dist/matter/behaviors/FanControlBehavior.spec.d.ts.map +1 -0
- package/dist/matter/behaviors/FanControlBehavior.spec.js +23 -0
- package/dist/matter/behaviors/FanControlBehavior.spec.js.map +1 -0
- package/dist/matter/behaviors/IdentifyBehavior.d.ts +20 -0
- package/dist/matter/behaviors/IdentifyBehavior.d.ts.map +1 -0
- package/dist/matter/behaviors/IdentifyBehavior.js +41 -0
- package/dist/matter/behaviors/IdentifyBehavior.js.map +1 -0
- package/dist/matter/behaviors/IdentifyBehavior.spec.d.ts +2 -0
- package/dist/matter/behaviors/IdentifyBehavior.spec.d.ts.map +1 -0
- package/dist/matter/behaviors/IdentifyBehavior.spec.js +64 -0
- package/dist/matter/behaviors/IdentifyBehavior.spec.js.map +1 -0
- package/dist/matter/behaviors/LevelControlBehavior.d.ts +33 -0
- package/dist/matter/behaviors/LevelControlBehavior.d.ts.map +1 -0
- package/dist/matter/behaviors/LevelControlBehavior.js +138 -0
- package/dist/matter/behaviors/LevelControlBehavior.js.map +1 -0
- package/dist/matter/behaviors/LevelControlBehavior.spec.d.ts +2 -0
- package/dist/matter/behaviors/LevelControlBehavior.spec.d.ts.map +1 -0
- package/dist/matter/behaviors/LevelControlBehavior.spec.js +145 -0
- package/dist/matter/behaviors/LevelControlBehavior.spec.js.map +1 -0
- package/dist/matter/behaviors/OnOffBehavior.d.ts +27 -0
- package/dist/matter/behaviors/OnOffBehavior.d.ts.map +1 -0
- package/dist/matter/behaviors/OnOffBehavior.js +95 -0
- package/dist/matter/behaviors/OnOffBehavior.js.map +1 -0
- package/dist/matter/behaviors/OnOffBehavior.spec.d.ts +2 -0
- package/dist/matter/behaviors/OnOffBehavior.spec.d.ts.map +1 -0
- package/dist/matter/behaviors/OnOffBehavior.spec.js +128 -0
- package/dist/matter/behaviors/OnOffBehavior.spec.js.map +1 -0
- package/dist/matter/behaviors/RvcCleanModeBehavior.d.ts +19 -0
- package/dist/matter/behaviors/RvcCleanModeBehavior.d.ts.map +1 -0
- package/dist/matter/behaviors/RvcCleanModeBehavior.js +41 -0
- package/dist/matter/behaviors/RvcCleanModeBehavior.js.map +1 -0
- package/dist/matter/behaviors/RvcCleanModeBehavior.spec.d.ts +2 -0
- package/dist/matter/behaviors/RvcCleanModeBehavior.spec.d.ts.map +1 -0
- package/dist/matter/behaviors/RvcCleanModeBehavior.spec.js +57 -0
- package/dist/matter/behaviors/RvcCleanModeBehavior.spec.js.map +1 -0
- package/dist/matter/behaviors/RvcOperationalStateBehavior.d.ts +22 -0
- package/dist/matter/behaviors/RvcOperationalStateBehavior.d.ts.map +1 -0
- package/dist/matter/behaviors/RvcOperationalStateBehavior.js +86 -0
- package/dist/matter/behaviors/RvcOperationalStateBehavior.js.map +1 -0
- package/dist/matter/behaviors/RvcOperationalStateBehavior.spec.d.ts +2 -0
- package/dist/matter/behaviors/RvcOperationalStateBehavior.spec.d.ts.map +1 -0
- package/dist/matter/behaviors/RvcOperationalStateBehavior.spec.js +55 -0
- package/dist/matter/behaviors/RvcOperationalStateBehavior.spec.js.map +1 -0
- package/dist/matter/behaviors/RvcRunModeBehavior.d.ts +19 -0
- package/dist/matter/behaviors/RvcRunModeBehavior.d.ts.map +1 -0
- package/dist/matter/behaviors/RvcRunModeBehavior.js +41 -0
- package/dist/matter/behaviors/RvcRunModeBehavior.js.map +1 -0
- package/dist/matter/behaviors/RvcRunModeBehavior.spec.d.ts +2 -0
- package/dist/matter/behaviors/RvcRunModeBehavior.spec.d.ts.map +1 -0
- package/dist/matter/behaviors/RvcRunModeBehavior.spec.js +57 -0
- package/dist/matter/behaviors/RvcRunModeBehavior.spec.js.map +1 -0
- package/dist/matter/behaviors/ServiceAreaBehavior.d.ts +21 -0
- package/dist/matter/behaviors/ServiceAreaBehavior.d.ts.map +1 -0
- package/dist/matter/behaviors/ServiceAreaBehavior.js +61 -0
- package/dist/matter/behaviors/ServiceAreaBehavior.js.map +1 -0
- package/dist/matter/behaviors/ServiceAreaBehavior.spec.d.ts +2 -0
- package/dist/matter/behaviors/ServiceAreaBehavior.spec.d.ts.map +1 -0
- package/dist/matter/behaviors/ServiceAreaBehavior.spec.js +53 -0
- package/dist/matter/behaviors/ServiceAreaBehavior.spec.js.map +1 -0
- package/dist/matter/behaviors/ThermostatBehavior.d.ts +22 -0
- package/dist/matter/behaviors/ThermostatBehavior.d.ts.map +1 -0
- package/dist/matter/behaviors/ThermostatBehavior.js +127 -0
- package/dist/matter/behaviors/ThermostatBehavior.js.map +1 -0
- package/dist/matter/behaviors/ThermostatBehavior.spec.d.ts +2 -0
- package/dist/matter/behaviors/ThermostatBehavior.spec.d.ts.map +1 -0
- package/dist/matter/behaviors/ThermostatBehavior.spec.js +23 -0
- package/dist/matter/behaviors/ThermostatBehavior.spec.js.map +1 -0
- package/dist/matter/behaviors/WindowCoveringBehavior.d.ts +31 -0
- package/dist/matter/behaviors/WindowCoveringBehavior.d.ts.map +1 -0
- package/dist/matter/behaviors/WindowCoveringBehavior.js +158 -0
- package/dist/matter/behaviors/WindowCoveringBehavior.js.map +1 -0
- package/dist/matter/behaviors/WindowCoveringBehavior.spec.d.ts +2 -0
- package/dist/matter/behaviors/WindowCoveringBehavior.spec.d.ts.map +1 -0
- package/dist/matter/behaviors/WindowCoveringBehavior.spec.js +27 -0
- package/dist/matter/behaviors/WindowCoveringBehavior.spec.js.map +1 -0
- package/dist/matter/behaviors/index.d.ts +20 -0
- package/dist/matter/behaviors/index.d.ts.map +1 -0
- package/dist/matter/behaviors/index.js +21 -0
- package/dist/matter/behaviors/index.js.map +1 -0
- package/dist/matter/configValidator.d.ts +81 -0
- package/dist/matter/configValidator.d.ts.map +1 -0
- package/dist/matter/configValidator.js +240 -0
- package/dist/matter/configValidator.js.map +1 -0
- package/dist/matter/configValidator.spec.d.ts +2 -0
- package/dist/matter/configValidator.spec.d.ts.map +1 -0
- package/dist/matter/configValidator.spec.js +390 -0
- package/dist/matter/configValidator.spec.js.map +1 -0
- package/dist/matter/errorHandler.d.ts +33 -0
- package/dist/matter/errorHandler.d.ts.map +1 -0
- package/dist/matter/errorHandler.js +113 -0
- package/dist/matter/errorHandler.js.map +1 -0
- package/dist/matter/errorHandler.spec.d.ts +2 -0
- package/dist/matter/errorHandler.spec.d.ts.map +1 -0
- package/dist/matter/errorHandler.spec.js +159 -0
- package/dist/matter/errorHandler.spec.js.map +1 -0
- package/dist/matter/errors.d.ts +178 -0
- package/dist/matter/errors.d.ts.map +1 -0
- package/dist/matter/errors.js +200 -0
- package/dist/matter/errors.js.map +1 -0
- package/dist/matter/index.d.ts +127 -0
- package/dist/matter/index.d.ts.map +1 -0
- package/dist/matter/index.js +23 -0
- package/dist/matter/index.js.map +1 -0
- package/dist/matter/logFormatter.d.ts +19 -0
- package/dist/matter/logFormatter.d.ts.map +1 -0
- package/dist/matter/logFormatter.js +158 -0
- package/dist/matter/logFormatter.js.map +1 -0
- package/dist/matter/logFormatter.spec.d.ts +2 -0
- package/dist/matter/logFormatter.spec.d.ts.map +1 -0
- package/dist/matter/logFormatter.spec.js +252 -0
- package/dist/matter/logFormatter.spec.js.map +1 -0
- package/dist/matter/server.d.ts +336 -0
- package/dist/matter/server.d.ts.map +1 -0
- package/dist/matter/server.js +1810 -0
- package/dist/matter/server.js.map +1 -0
- package/dist/matter/serverHelpers.d.ts +81 -0
- package/dist/matter/serverHelpers.d.ts.map +1 -0
- package/dist/matter/serverHelpers.js +326 -0
- package/dist/matter/serverHelpers.js.map +1 -0
- package/dist/matter/serverHelpers.spec.d.ts +2 -0
- package/dist/matter/serverHelpers.spec.d.ts.map +1 -0
- package/dist/matter/serverHelpers.spec.js +521 -0
- package/dist/matter/serverHelpers.spec.js.map +1 -0
- package/dist/matter/sharedTypes.d.ts +164 -0
- package/dist/matter/sharedTypes.d.ts.map +1 -0
- package/dist/matter/sharedTypes.js +46 -0
- package/dist/matter/sharedTypes.js.map +1 -0
- package/dist/matter/storage.d.ts +135 -0
- package/dist/matter/storage.d.ts.map +1 -0
- package/dist/matter/storage.js +424 -0
- package/dist/matter/storage.js.map +1 -0
- package/dist/matter/storage.spec.d.ts +2 -0
- package/dist/matter/storage.spec.d.ts.map +1 -0
- package/dist/matter/storage.spec.js +570 -0
- package/dist/matter/storage.spec.js.map +1 -0
- package/dist/matter/typeHelpers.d.ts +45 -0
- package/dist/matter/typeHelpers.d.ts.map +1 -0
- package/dist/matter/typeHelpers.js +57 -0
- package/dist/matter/typeHelpers.js.map +1 -0
- package/dist/matter/typeHelpers.spec.d.ts +2 -0
- package/dist/matter/typeHelpers.spec.d.ts.map +1 -0
- package/dist/matter/typeHelpers.spec.js +127 -0
- package/dist/matter/typeHelpers.spec.js.map +1 -0
- package/dist/matter/types.d.ts +826 -0
- package/dist/matter/types.d.ts.map +1 -0
- package/dist/matter/types.js +204 -0
- package/dist/matter/types.js.map +1 -0
- package/{lib → dist}/platformAccessory.d.ts +8 -6
- package/dist/platformAccessory.d.ts.map +1 -0
- package/{lib → dist}/platformAccessory.js +19 -16
- package/dist/platformAccessory.js.map +1 -0
- package/dist/platformAccessory.spec.d.ts +2 -0
- package/dist/platformAccessory.spec.d.ts.map +1 -0
- package/dist/platformAccessory.spec.js +126 -0
- package/dist/platformAccessory.spec.js.map +1 -0
- package/{lib → dist}/plugin.d.ts +2 -3
- package/dist/plugin.d.ts.map +1 -0
- package/{lib → dist}/plugin.js +39 -51
- package/dist/plugin.js.map +1 -0
- package/{lib → dist}/pluginManager.d.ts +3 -3
- package/dist/pluginManager.d.ts.map +1 -0
- package/{lib → dist}/pluginManager.js +76 -81
- package/dist/pluginManager.js.map +1 -0
- package/dist/pluginManager.spec.d.ts +2 -0
- package/dist/pluginManager.spec.d.ts.map +1 -0
- package/dist/pluginManager.spec.js +43 -0
- package/dist/pluginManager.spec.js.map +1 -0
- package/{lib → dist}/server.d.ts +14 -1
- package/dist/server.d.ts.map +1 -0
- package/{lib → dist}/server.js +193 -123
- package/dist/server.js.map +1 -0
- package/dist/server.spec.d.ts +2 -0
- package/dist/server.spec.d.ts.map +1 -0
- package/dist/server.spec.js +57 -0
- package/dist/server.spec.js.map +1 -0
- package/{lib → dist}/storageService.d.ts.map +1 -1
- package/dist/storageService.js +41 -0
- package/dist/storageService.js.map +1 -0
- package/{lib → dist}/user.d.ts +1 -0
- package/dist/user.d.ts.map +1 -0
- package/dist/user.js +32 -0
- package/dist/user.js.map +1 -0
- package/dist/user.spec.d.ts +2 -0
- package/dist/user.spec.d.ts.map +1 -0
- package/dist/user.spec.js +31 -0
- package/dist/user.spec.js.map +1 -0
- package/{lib → dist}/util/mac.d.ts +1 -0
- package/dist/util/mac.d.ts.map +1 -0
- package/dist/util/mac.js +14 -0
- package/dist/util/mac.js.map +1 -0
- package/dist/util/mac.spec.d.ts +2 -0
- package/dist/util/mac.spec.d.ts.map +1 -0
- package/dist/util/mac.spec.js +36 -0
- package/dist/util/mac.spec.js.map +1 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +16 -0
- package/dist/version.js.map +1 -0
- package/dist/version.spec.d.ts +2 -0
- package/dist/version.spec.d.ts.map +1 -0
- package/dist/version.spec.js +20 -0
- package/dist/version.spec.js.map +1 -0
- package/package.json +49 -50
- package/bin/homebridge +0 -17
- package/lib/api.d.ts +0 -210
- package/lib/api.d.ts.map +0 -1
- package/lib/api.js +0 -155
- package/lib/api.js.map +0 -1
- package/lib/bridgeService.d.ts.map +0 -1
- package/lib/bridgeService.js.map +0 -1
- package/lib/childBridgeFork.d.ts.map +0 -1
- package/lib/childBridgeFork.js.map +0 -1
- package/lib/childBridgeService.d.ts.map +0 -1
- package/lib/childBridgeService.js.map +0 -1
- package/lib/cli.d.ts +0 -4
- package/lib/cli.d.ts.map +0 -1
- package/lib/cli.js +0 -111
- package/lib/cli.js.map +0 -1
- package/lib/externalPortService.d.ts +0 -33
- package/lib/externalPortService.d.ts.map +0 -1
- package/lib/externalPortService.js +0 -64
- package/lib/externalPortService.js.map +0 -1
- package/lib/index.d.ts +0 -76
- package/lib/index.d.ts.map +0 -1
- package/lib/index.js +0 -72
- package/lib/index.js.map +0 -1
- package/lib/ipcService.d.ts +0 -33
- package/lib/ipcService.d.ts.map +0 -1
- package/lib/ipcService.js.map +0 -1
- package/lib/logger.d.ts.map +0 -1
- package/lib/logger.js.map +0 -1
- package/lib/platformAccessory.d.ts.map +0 -1
- package/lib/platformAccessory.js.map +0 -1
- package/lib/plugin.d.ts.map +0 -1
- package/lib/plugin.js.map +0 -1
- package/lib/pluginManager.d.ts.map +0 -1
- package/lib/pluginManager.js.map +0 -1
- package/lib/server.d.ts.map +0 -1
- package/lib/server.js.map +0 -1
- package/lib/storageService.js +0 -70
- package/lib/storageService.js.map +0 -1
- package/lib/user.d.ts.map +0 -1
- package/lib/user.js +0 -36
- package/lib/user.js.map +0 -1
- package/lib/util/mac.d.ts.map +0 -1
- package/lib/util/mac.js +0 -20
- package/lib/util/mac.js.map +0 -1
- package/lib/version.d.ts.map +0 -1
- package/lib/version.js +0 -21
- package/lib/version.js.map +0 -1
- /package/{lib → dist}/storageService.d.ts +0 -0
- /package/{lib → dist}/version.d.ts +0 -0
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* External Matter Accessory Publisher
|
|
3
|
+
*
|
|
4
|
+
* Shared logic for publishing external Matter accessories on dedicated bridges.
|
|
5
|
+
* Used by both MatterBridgeManager and ChildBridgeMatterManager to avoid code duplication.
|
|
6
|
+
*/
|
|
7
|
+
import type { InternalMatterAccessory } from './types.js';
|
|
8
|
+
import { MatterServer } from './server.js';
|
|
9
|
+
/**
|
|
10
|
+
* Configuration context for publishing external Matter accessories
|
|
11
|
+
*/
|
|
12
|
+
export interface ExternalAccessoryPublishContext {
|
|
13
|
+
/** Port service for allocating Matter ports */
|
|
14
|
+
portService: {
|
|
15
|
+
requestMatterPort: (uniqueId: string) => Promise<number | null | undefined>;
|
|
16
|
+
};
|
|
17
|
+
/** Network interfaces to bind to (from bridge config) */
|
|
18
|
+
networkInterfaces?: string[];
|
|
19
|
+
/** Whether debug mode is enabled */
|
|
20
|
+
debugModeEnabled?: boolean;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Result of publishing an external Matter accessory
|
|
24
|
+
*/
|
|
25
|
+
export interface PublishedExternalAccessory {
|
|
26
|
+
/** The MatterServer instance for this accessory */
|
|
27
|
+
server: MatterServer;
|
|
28
|
+
/** Port the server is running on */
|
|
29
|
+
port: number;
|
|
30
|
+
/** Commissioning information */
|
|
31
|
+
commissioningInfo: {
|
|
32
|
+
qrCode?: string;
|
|
33
|
+
manualPairingCode?: string;
|
|
34
|
+
serialNumber?: string;
|
|
35
|
+
commissioned: boolean;
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Publish an external Matter accessory on its own dedicated Matter server.
|
|
40
|
+
* This is required for devices like Robotic Vacuum Cleaners that Apple Home
|
|
41
|
+
* requires to be on their own bridge.
|
|
42
|
+
*
|
|
43
|
+
* @param accessory - The Matter accessory to publish
|
|
44
|
+
* @param context - Configuration context for publishing
|
|
45
|
+
* @returns Published accessory info, or null if publishing failed
|
|
46
|
+
*/
|
|
47
|
+
export declare function publishExternalMatterAccessory(accessory: InternalMatterAccessory, context: ExternalAccessoryPublishContext): Promise<PublishedExternalAccessory | null>;
|
|
48
|
+
//# sourceMappingURL=ExternalMatterAccessoryPublisher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ExternalMatterAccessoryPublisher.d.ts","sourceRoot":"","sources":["../../src/matter/ExternalMatterAccessoryPublisher.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAA;AAKzD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAI1C;;GAEG;AACH,MAAM,WAAW,+BAA+B;IAC9C,+CAA+C;IAC/C,WAAW,EAAE;QACX,iBAAiB,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC,CAAA;KAC5E,CAAA;IACD,yDAAyD;IACzD,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAA;IAC5B,oCAAoC;IACpC,gBAAgB,CAAC,EAAE,OAAO,CAAA;CAC3B;AAED;;GAEG;AACH,MAAM,WAAW,0BAA0B;IACzC,mDAAmD;IACnD,MAAM,EAAE,YAAY,CAAA;IACpB,oCAAoC;IACpC,IAAI,EAAE,MAAM,CAAA;IACZ,gCAAgC;IAChC,iBAAiB,EAAE;QACjB,MAAM,CAAC,EAAE,MAAM,CAAA;QACf,iBAAiB,CAAC,EAAE,MAAM,CAAA;QAC1B,YAAY,CAAC,EAAE,MAAM,CAAA;QACrB,YAAY,EAAE,OAAO,CAAA;KACtB,CAAA;CACF;AAED;;;;;;;;GAQG;AACH,wBAAsB,8BAA8B,CAClD,SAAS,EAAE,uBAAuB,EAClC,OAAO,EAAE,+BAA+B,GACvC,OAAO,CAAC,0BAA0B,GAAG,IAAI,CAAC,CAgE5C"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* External Matter Accessory Publisher
|
|
3
|
+
*
|
|
4
|
+
* Shared logic for publishing external Matter accessories on dedicated bridges.
|
|
5
|
+
* Used by both MatterBridgeManager and ChildBridgeMatterManager to avoid code duplication.
|
|
6
|
+
*/
|
|
7
|
+
import { Logger } from '../logger.js';
|
|
8
|
+
import { User } from '../user.js';
|
|
9
|
+
import { generate } from '../util/mac.js';
|
|
10
|
+
import { MatterServer } from './server.js';
|
|
11
|
+
const log = Logger.internal;
|
|
12
|
+
/**
|
|
13
|
+
* Publish an external Matter accessory on its own dedicated Matter server.
|
|
14
|
+
* This is required for devices like Robotic Vacuum Cleaners that Apple Home
|
|
15
|
+
* requires to be on their own bridge.
|
|
16
|
+
*
|
|
17
|
+
* @param accessory - The Matter accessory to publish
|
|
18
|
+
* @param context - Configuration context for publishing
|
|
19
|
+
* @returns Published accessory info, or null if publishing failed
|
|
20
|
+
*/
|
|
21
|
+
export async function publishExternalMatterAccessory(accessory, context) {
|
|
22
|
+
// Validate accessory has required fields
|
|
23
|
+
if (!accessory.uuid) {
|
|
24
|
+
log.error('External Matter accessory missing UUID - skipping');
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
if (!accessory.displayName) {
|
|
28
|
+
log.error(`External Matter accessory ${accessory.uuid} missing displayName - skipping`);
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
// Generate deterministic MAC address from UUID (same pattern as HAP external accessories)
|
|
32
|
+
const advertiseAddress = generate(accessory.uuid);
|
|
33
|
+
// For Matter, use the MAC without colons as uniqueId
|
|
34
|
+
const uniqueId = advertiseAddress.replace(/:/g, '');
|
|
35
|
+
// Allocate Matter port for the external Matter server
|
|
36
|
+
const port = await context.portService.requestMatterPort(uniqueId);
|
|
37
|
+
if (!port) {
|
|
38
|
+
log.error(`Failed to allocate Matter port for external Matter accessory ${accessory.displayName}`);
|
|
39
|
+
log.error('Please configure matterPorts in config.json or free up ports in the default range (5530-5541)');
|
|
40
|
+
return null;
|
|
41
|
+
}
|
|
42
|
+
log.info(`Allocated port ${port} for external Matter accessory: ${accessory.displayName}`);
|
|
43
|
+
// Create dedicated Matter server for this accessory
|
|
44
|
+
const matterServer = new MatterServer({
|
|
45
|
+
port,
|
|
46
|
+
uniqueId,
|
|
47
|
+
storagePath: User.matterPath(),
|
|
48
|
+
manufacturer: accessory.manufacturer,
|
|
49
|
+
model: accessory.model,
|
|
50
|
+
firmwareRevision: accessory.firmwareRevision,
|
|
51
|
+
serialNumber: accessory.serialNumber || uniqueId, // use uniqueId as fallback serial number
|
|
52
|
+
debugModeEnabled: context.debugModeEnabled,
|
|
53
|
+
externalAccessory: true, // external accessory, added before server runs
|
|
54
|
+
networkInterfaces: context.networkInterfaces,
|
|
55
|
+
});
|
|
56
|
+
// Start the Matter server (but don't run it yet due to externalAccessory mode)
|
|
57
|
+
await matterServer.start();
|
|
58
|
+
// Get plugin identifier from accessory
|
|
59
|
+
const pluginIdentifier = accessory._associatedPlugin || 'unknown';
|
|
60
|
+
// Register the accessory to this dedicated server
|
|
61
|
+
await matterServer.registerPlatformAccessories(pluginIdentifier, 'ExternalMatter', [accessory]);
|
|
62
|
+
// Now run the server with the device already attached (required for external accessories)
|
|
63
|
+
await matterServer.runServer();
|
|
64
|
+
log.info(`✓ External Matter accessory published: ${accessory.displayName} on port ${port}`);
|
|
65
|
+
// Get commissioning info
|
|
66
|
+
const commissioningInfo = matterServer.getCommissioningInfo();
|
|
67
|
+
return {
|
|
68
|
+
server: matterServer,
|
|
69
|
+
port,
|
|
70
|
+
commissioningInfo,
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=ExternalMatterAccessoryPublisher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ExternalMatterAccessoryPublisher.js","sourceRoot":"","sources":["../../src/matter/ExternalMatterAccessoryPublisher.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,YAAY,CAAA;AACjC,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAE1C,MAAM,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAA;AAiC3B;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,8BAA8B,CAClD,SAAkC,EAClC,OAAwC;IAExC,yCAAyC;IACzC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;QACpB,GAAG,CAAC,KAAK,CAAC,mDAAmD,CAAC,CAAA;QAC9D,OAAO,IAAI,CAAA;IACb,CAAC;IAED,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC;QAC3B,GAAG,CAAC,KAAK,CAAC,6BAA6B,SAAS,CAAC,IAAI,iCAAiC,CAAC,CAAA;QACvF,OAAO,IAAI,CAAA;IACb,CAAC;IAED,0FAA0F;IAC1F,MAAM,gBAAgB,GAAG,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,CAAA;IAEjD,qDAAqD;IACrD,MAAM,QAAQ,GAAG,gBAAgB,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAA;IAEnD,sDAAsD;IACtD,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,WAAW,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAA;IAClE,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,GAAG,CAAC,KAAK,CAAC,gEAAgE,SAAS,CAAC,WAAW,EAAE,CAAC,CAAA;QAClG,GAAG,CAAC,KAAK,CAAC,+FAA+F,CAAC,CAAA;QAC1G,OAAO,IAAI,CAAA;IACb,CAAC;IAED,GAAG,CAAC,IAAI,CAAC,kBAAkB,IAAI,mCAAmC,SAAS,CAAC,WAAW,EAAE,CAAC,CAAA;IAE1F,oDAAoD;IACpD,MAAM,YAAY,GAAG,IAAI,YAAY,CAAC;QACpC,IAAI;QACJ,QAAQ;QACR,WAAW,EAAE,IAAI,CAAC,UAAU,EAAE;QAC9B,YAAY,EAAE,SAAS,CAAC,YAAY;QACpC,KAAK,EAAE,SAAS,CAAC,KAAK;QACtB,gBAAgB,EAAE,SAAS,CAAC,gBAAgB;QAC5C,YAAY,EAAE,SAAS,CAAC,YAAY,IAAI,QAAQ,EAAE,yCAAyC;QAC3F,gBAAgB,EAAE,OAAO,CAAC,gBAAgB;QAC1C,iBAAiB,EAAE,IAAI,EAAE,+CAA+C;QACxE,iBAAiB,EAAE,OAAO,CAAC,iBAAiB;KAC7C,CAAC,CAAA;IAEF,+EAA+E;IAC/E,MAAM,YAAY,CAAC,KAAK,EAAE,CAAA;IAE1B,uCAAuC;IACvC,MAAM,gBAAgB,GAAG,SAAS,CAAC,iBAAiB,IAAI,SAAS,CAAA;IAEjE,kDAAkD;IAClD,MAAM,YAAY,CAAC,2BAA2B,CAAC,gBAAgB,EAAE,gBAAgB,EAAE,CAAC,SAAS,CAAC,CAAC,CAAA;IAE/F,0FAA0F;IAC1F,MAAM,YAAY,CAAC,SAAS,EAAE,CAAA;IAE9B,GAAG,CAAC,IAAI,CAAC,0CAA0C,SAAS,CAAC,WAAW,YAAY,IAAI,EAAE,CAAC,CAAA;IAE3F,yBAAyB;IACzB,MAAM,iBAAiB,GAAG,YAAY,CAAC,oBAAoB,EAAE,CAAA;IAE7D,OAAO;QACL,MAAM,EAAE,YAAY;QACpB,IAAI;QACJ,iBAAiB;KAClB,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ExternalMatterAccessoryPublisher.spec.d.ts","sourceRoot":"","sources":["../../src/matter/ExternalMatterAccessoryPublisher.spec.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,293 @@
|
|
|
1
|
+
import { beforeEach, describe, expect, it, vi } from 'vitest';
|
|
2
|
+
import { Logger } from '../logger.js';
|
|
3
|
+
import { User } from '../user.js';
|
|
4
|
+
import * as mac from '../util/mac.js';
|
|
5
|
+
import { publishExternalMatterAccessory } from './ExternalMatterAccessoryPublisher.js';
|
|
6
|
+
import { MatterServer } from './server.js';
|
|
7
|
+
// Mock dependencies
|
|
8
|
+
vi.mock('../logger.js', () => {
|
|
9
|
+
const mockLogger = {
|
|
10
|
+
error: vi.fn(),
|
|
11
|
+
info: vi.fn(),
|
|
12
|
+
warn: vi.fn(),
|
|
13
|
+
debug: vi.fn(),
|
|
14
|
+
log: vi.fn(),
|
|
15
|
+
};
|
|
16
|
+
return {
|
|
17
|
+
Logger: {
|
|
18
|
+
internal: mockLogger,
|
|
19
|
+
withPrefix: vi.fn(() => mockLogger),
|
|
20
|
+
},
|
|
21
|
+
};
|
|
22
|
+
});
|
|
23
|
+
vi.mock('../user.js');
|
|
24
|
+
vi.mock('../util/mac.js');
|
|
25
|
+
vi.mock('./server.js');
|
|
26
|
+
describe('externalMatterAccessoryPublisher', () => {
|
|
27
|
+
let mockAccessory;
|
|
28
|
+
let mockContext;
|
|
29
|
+
let mockPortService;
|
|
30
|
+
let mockMatterServer;
|
|
31
|
+
let logErrorSpy;
|
|
32
|
+
let logInfoSpy;
|
|
33
|
+
beforeEach(() => {
|
|
34
|
+
// Reset all mocks
|
|
35
|
+
vi.clearAllMocks();
|
|
36
|
+
// Get logger spies
|
|
37
|
+
logErrorSpy = vi.mocked(Logger).internal.error;
|
|
38
|
+
logInfoSpy = vi.mocked(Logger).internal.info;
|
|
39
|
+
// Mock User.matterPath()
|
|
40
|
+
vi.mocked(User).matterPath = vi.fn().mockReturnValue('/mock/matter/path');
|
|
41
|
+
// Mock MAC address generation
|
|
42
|
+
vi.mocked(mac.generate).mockReturnValue('AA:BB:CC:DD:EE:FF');
|
|
43
|
+
// Mock MatterServer
|
|
44
|
+
mockMatterServer = {
|
|
45
|
+
start: vi.fn().mockResolvedValue(undefined),
|
|
46
|
+
registerPlatformAccessories: vi.fn().mockResolvedValue(undefined),
|
|
47
|
+
runServer: vi.fn().mockResolvedValue(undefined),
|
|
48
|
+
getCommissioningInfo: vi.fn().mockReturnValue({
|
|
49
|
+
qrCode: 'MT:MOCK-QR-CODE',
|
|
50
|
+
manualPairingCode: '12345678',
|
|
51
|
+
serialNumber: 'MOCK-SERIAL',
|
|
52
|
+
commissioned: false,
|
|
53
|
+
}),
|
|
54
|
+
};
|
|
55
|
+
vi.mocked(MatterServer).mockImplementation(function () {
|
|
56
|
+
return mockMatterServer;
|
|
57
|
+
});
|
|
58
|
+
// Create mock port service
|
|
59
|
+
mockPortService = {
|
|
60
|
+
requestMatterPort: vi.fn().mockResolvedValue(5530),
|
|
61
|
+
};
|
|
62
|
+
// Create mock context
|
|
63
|
+
mockContext = {
|
|
64
|
+
portService: mockPortService,
|
|
65
|
+
networkInterfaces: ['eth0'],
|
|
66
|
+
debugModeEnabled: true,
|
|
67
|
+
};
|
|
68
|
+
// Create mock accessory
|
|
69
|
+
mockAccessory = {
|
|
70
|
+
uuid: 'test-uuid-123',
|
|
71
|
+
displayName: 'Test Vacuum',
|
|
72
|
+
manufacturer: 'Test Mfg',
|
|
73
|
+
model: 'Test Model',
|
|
74
|
+
firmwareRevision: '1.0.0',
|
|
75
|
+
serialNumber: 'SN-123',
|
|
76
|
+
_associatedPlugin: 'homebridge-test-plugin',
|
|
77
|
+
};
|
|
78
|
+
});
|
|
79
|
+
describe('publishExternalMatterAccessory', () => {
|
|
80
|
+
describe('validation', () => {
|
|
81
|
+
it('should return null when accessory has no UUID', async () => {
|
|
82
|
+
const invalidAccessory = { ...mockAccessory, uuid: undefined };
|
|
83
|
+
const result = await publishExternalMatterAccessory(invalidAccessory, mockContext);
|
|
84
|
+
expect(result).toBeNull();
|
|
85
|
+
expect(logErrorSpy).toHaveBeenCalledWith('External Matter accessory missing UUID - skipping');
|
|
86
|
+
});
|
|
87
|
+
it('should return null when accessory has no displayName', async () => {
|
|
88
|
+
const invalidAccessory = { ...mockAccessory, displayName: undefined };
|
|
89
|
+
const result = await publishExternalMatterAccessory(invalidAccessory, mockContext);
|
|
90
|
+
expect(result).toBeNull();
|
|
91
|
+
expect(logErrorSpy).toHaveBeenCalledWith('External Matter accessory test-uuid-123 missing displayName - skipping');
|
|
92
|
+
});
|
|
93
|
+
it('should return null when port allocation fails', async () => {
|
|
94
|
+
mockPortService.requestMatterPort.mockResolvedValue(null);
|
|
95
|
+
const result = await publishExternalMatterAccessory(mockAccessory, mockContext);
|
|
96
|
+
expect(result).toBeNull();
|
|
97
|
+
expect(logErrorSpy).toHaveBeenCalledWith('Failed to allocate Matter port for external Matter accessory Test Vacuum');
|
|
98
|
+
expect(logErrorSpy).toHaveBeenCalledWith('Please configure matterPorts in config.json or free up ports in the default range (5530-5541)');
|
|
99
|
+
});
|
|
100
|
+
it('should return null when port allocation returns undefined', async () => {
|
|
101
|
+
mockPortService.requestMatterPort.mockResolvedValue(undefined);
|
|
102
|
+
const result = await publishExternalMatterAccessory(mockAccessory, mockContext);
|
|
103
|
+
expect(result).toBeNull();
|
|
104
|
+
expect(logErrorSpy).toHaveBeenCalledWith('Failed to allocate Matter port for external Matter accessory Test Vacuum');
|
|
105
|
+
});
|
|
106
|
+
});
|
|
107
|
+
describe('mAC address generation', () => {
|
|
108
|
+
it('should generate deterministic MAC address from UUID', async () => {
|
|
109
|
+
await publishExternalMatterAccessory(mockAccessory, mockContext);
|
|
110
|
+
expect(mac.generate).toHaveBeenCalledWith('test-uuid-123');
|
|
111
|
+
});
|
|
112
|
+
it('should use MAC without colons as uniqueId', async () => {
|
|
113
|
+
vi.mocked(mac.generate).mockReturnValue('11:22:33:44:55:66');
|
|
114
|
+
await publishExternalMatterAccessory(mockAccessory, mockContext);
|
|
115
|
+
expect(mockPortService.requestMatterPort).toHaveBeenCalledWith('112233445566');
|
|
116
|
+
});
|
|
117
|
+
});
|
|
118
|
+
describe('port allocation', () => {
|
|
119
|
+
it('should request Matter port with uniqueId', async () => {
|
|
120
|
+
await publishExternalMatterAccessory(mockAccessory, mockContext);
|
|
121
|
+
expect(mockPortService.requestMatterPort).toHaveBeenCalledWith('AABBCCDDEEFF');
|
|
122
|
+
});
|
|
123
|
+
it('should log port allocation success', async () => {
|
|
124
|
+
mockPortService.requestMatterPort.mockResolvedValue(5535);
|
|
125
|
+
await publishExternalMatterAccessory(mockAccessory, mockContext);
|
|
126
|
+
expect(logInfoSpy).toHaveBeenCalledWith('Allocated port 5535 for external Matter accessory: Test Vacuum');
|
|
127
|
+
});
|
|
128
|
+
});
|
|
129
|
+
describe('matterServer creation', () => {
|
|
130
|
+
it('should create MatterServer with correct configuration', async () => {
|
|
131
|
+
await publishExternalMatterAccessory(mockAccessory, mockContext);
|
|
132
|
+
expect(MatterServer).toHaveBeenCalledWith({
|
|
133
|
+
port: 5530,
|
|
134
|
+
uniqueId: 'AABBCCDDEEFF',
|
|
135
|
+
storagePath: '/mock/matter/path',
|
|
136
|
+
manufacturer: 'Test Mfg',
|
|
137
|
+
model: 'Test Model',
|
|
138
|
+
firmwareRevision: '1.0.0',
|
|
139
|
+
serialNumber: 'SN-123',
|
|
140
|
+
debugModeEnabled: true,
|
|
141
|
+
externalAccessory: true,
|
|
142
|
+
networkInterfaces: ['eth0'],
|
|
143
|
+
});
|
|
144
|
+
});
|
|
145
|
+
it('should use uniqueId as fallback serial number', async () => {
|
|
146
|
+
const accessoryNoSerial = { ...mockAccessory, serialNumber: undefined };
|
|
147
|
+
await publishExternalMatterAccessory(accessoryNoSerial, mockContext);
|
|
148
|
+
expect(MatterServer).toHaveBeenCalledWith(expect.objectContaining({
|
|
149
|
+
serialNumber: 'AABBCCDDEEFF',
|
|
150
|
+
}));
|
|
151
|
+
});
|
|
152
|
+
it('should pass through debugModeEnabled setting', async () => {
|
|
153
|
+
const contextNoDebug = { ...mockContext, debugModeEnabled: false };
|
|
154
|
+
await publishExternalMatterAccessory(mockAccessory, contextNoDebug);
|
|
155
|
+
expect(MatterServer).toHaveBeenCalledWith(expect.objectContaining({
|
|
156
|
+
debugModeEnabled: false,
|
|
157
|
+
}));
|
|
158
|
+
});
|
|
159
|
+
it('should pass through networkInterfaces setting', async () => {
|
|
160
|
+
const contextMultipleInterfaces = {
|
|
161
|
+
...mockContext,
|
|
162
|
+
networkInterfaces: ['eth0', 'eth1', 'wlan0'],
|
|
163
|
+
};
|
|
164
|
+
await publishExternalMatterAccessory(mockAccessory, contextMultipleInterfaces);
|
|
165
|
+
expect(MatterServer).toHaveBeenCalledWith(expect.objectContaining({
|
|
166
|
+
networkInterfaces: ['eth0', 'eth1', 'wlan0'],
|
|
167
|
+
}));
|
|
168
|
+
});
|
|
169
|
+
it('should handle undefined networkInterfaces', async () => {
|
|
170
|
+
const contextNoInterfaces = { ...mockContext, networkInterfaces: undefined };
|
|
171
|
+
await publishExternalMatterAccessory(mockAccessory, contextNoInterfaces);
|
|
172
|
+
expect(MatterServer).toHaveBeenCalledWith(expect.objectContaining({
|
|
173
|
+
networkInterfaces: undefined,
|
|
174
|
+
}));
|
|
175
|
+
});
|
|
176
|
+
});
|
|
177
|
+
describe('server lifecycle', () => {
|
|
178
|
+
it('should start server before registering accessory', async () => {
|
|
179
|
+
const callOrder = [];
|
|
180
|
+
mockMatterServer.start.mockImplementation(() => {
|
|
181
|
+
callOrder.push('start');
|
|
182
|
+
return Promise.resolve();
|
|
183
|
+
});
|
|
184
|
+
mockMatterServer.registerPlatformAccessories.mockImplementation(() => {
|
|
185
|
+
callOrder.push('register');
|
|
186
|
+
return Promise.resolve();
|
|
187
|
+
});
|
|
188
|
+
await publishExternalMatterAccessory(mockAccessory, mockContext);
|
|
189
|
+
expect(callOrder).toEqual(['start', 'register']);
|
|
190
|
+
});
|
|
191
|
+
it('should register accessory with plugin identifier', async () => {
|
|
192
|
+
await publishExternalMatterAccessory(mockAccessory, mockContext);
|
|
193
|
+
expect(mockMatterServer.registerPlatformAccessories).toHaveBeenCalledWith('homebridge-test-plugin', 'ExternalMatter', [mockAccessory]);
|
|
194
|
+
});
|
|
195
|
+
it('should use "unknown" plugin identifier when not set', async () => {
|
|
196
|
+
const accessoryNoPlugin = { ...mockAccessory, _associatedPlugin: undefined };
|
|
197
|
+
await publishExternalMatterAccessory(accessoryNoPlugin, mockContext);
|
|
198
|
+
expect(mockMatterServer.registerPlatformAccessories).toHaveBeenCalledWith('unknown', 'ExternalMatter', [
|
|
199
|
+
accessoryNoPlugin,
|
|
200
|
+
]);
|
|
201
|
+
});
|
|
202
|
+
it('should run server after registering accessory', async () => {
|
|
203
|
+
const callOrder = [];
|
|
204
|
+
mockMatterServer.registerPlatformAccessories.mockImplementation(() => {
|
|
205
|
+
callOrder.push('register');
|
|
206
|
+
return Promise.resolve();
|
|
207
|
+
});
|
|
208
|
+
mockMatterServer.runServer.mockImplementation(() => {
|
|
209
|
+
callOrder.push('runServer');
|
|
210
|
+
return Promise.resolve();
|
|
211
|
+
});
|
|
212
|
+
await publishExternalMatterAccessory(mockAccessory, mockContext);
|
|
213
|
+
expect(callOrder).toEqual(['register', 'runServer']);
|
|
214
|
+
});
|
|
215
|
+
it('should call all server lifecycle methods', async () => {
|
|
216
|
+
await publishExternalMatterAccessory(mockAccessory, mockContext);
|
|
217
|
+
expect(mockMatterServer.start).toHaveBeenCalledOnce();
|
|
218
|
+
expect(mockMatterServer.registerPlatformAccessories).toHaveBeenCalledOnce();
|
|
219
|
+
expect(mockMatterServer.runServer).toHaveBeenCalledOnce();
|
|
220
|
+
});
|
|
221
|
+
});
|
|
222
|
+
describe('success path', () => {
|
|
223
|
+
it('should return PublishedExternalAccessory on success', async () => {
|
|
224
|
+
const result = await publishExternalMatterAccessory(mockAccessory, mockContext);
|
|
225
|
+
expect(result).toEqual({
|
|
226
|
+
server: mockMatterServer,
|
|
227
|
+
port: 5530,
|
|
228
|
+
commissioningInfo: {
|
|
229
|
+
qrCode: 'MT:MOCK-QR-CODE',
|
|
230
|
+
manualPairingCode: '12345678',
|
|
231
|
+
serialNumber: 'MOCK-SERIAL',
|
|
232
|
+
commissioned: false,
|
|
233
|
+
},
|
|
234
|
+
});
|
|
235
|
+
});
|
|
236
|
+
it('should log success message', async () => {
|
|
237
|
+
await publishExternalMatterAccessory(mockAccessory, mockContext);
|
|
238
|
+
expect(logInfoSpy).toHaveBeenCalledWith('✓ External Matter accessory published: Test Vacuum on port 5530');
|
|
239
|
+
});
|
|
240
|
+
it('should retrieve commissioning info from server', async () => {
|
|
241
|
+
await publishExternalMatterAccessory(mockAccessory, mockContext);
|
|
242
|
+
expect(mockMatterServer.getCommissioningInfo).toHaveBeenCalledOnce();
|
|
243
|
+
});
|
|
244
|
+
it('should return commissioning info with commissioned status', async () => {
|
|
245
|
+
mockMatterServer.getCommissioningInfo.mockReturnValue({
|
|
246
|
+
qrCode: undefined,
|
|
247
|
+
manualPairingCode: undefined,
|
|
248
|
+
serialNumber: 'SN-123',
|
|
249
|
+
commissioned: true,
|
|
250
|
+
});
|
|
251
|
+
const result = await publishExternalMatterAccessory(mockAccessory, mockContext);
|
|
252
|
+
expect(result?.commissioningInfo).toEqual({
|
|
253
|
+
qrCode: undefined,
|
|
254
|
+
manualPairingCode: undefined,
|
|
255
|
+
serialNumber: 'SN-123',
|
|
256
|
+
commissioned: true,
|
|
257
|
+
});
|
|
258
|
+
});
|
|
259
|
+
});
|
|
260
|
+
describe('edge cases', () => {
|
|
261
|
+
it('should handle empty string UUID', async () => {
|
|
262
|
+
const invalidAccessory = { ...mockAccessory, uuid: '' };
|
|
263
|
+
const result = await publishExternalMatterAccessory(invalidAccessory, mockContext);
|
|
264
|
+
expect(result).toBeNull();
|
|
265
|
+
expect(logErrorSpy).toHaveBeenCalledWith('External Matter accessory missing UUID - skipping');
|
|
266
|
+
});
|
|
267
|
+
it('should handle empty string displayName', async () => {
|
|
268
|
+
const invalidAccessory = { ...mockAccessory, displayName: '' };
|
|
269
|
+
const result = await publishExternalMatterAccessory(invalidAccessory, mockContext);
|
|
270
|
+
expect(result).toBeNull();
|
|
271
|
+
});
|
|
272
|
+
it('should handle MAC address with different format', async () => {
|
|
273
|
+
vi.mocked(mac.generate).mockReturnValue('00:11:22:33:44:55');
|
|
274
|
+
await publishExternalMatterAccessory(mockAccessory, mockContext);
|
|
275
|
+
expect(mockPortService.requestMatterPort).toHaveBeenCalledWith('001122334455');
|
|
276
|
+
});
|
|
277
|
+
it('should handle port allocation returning 0', async () => {
|
|
278
|
+
mockPortService.requestMatterPort.mockResolvedValue(0);
|
|
279
|
+
const result = await publishExternalMatterAccessory(mockAccessory, mockContext);
|
|
280
|
+
expect(result).toBeNull();
|
|
281
|
+
});
|
|
282
|
+
it('should handle very high port numbers', async () => {
|
|
283
|
+
mockPortService.requestMatterPort.mockResolvedValue(65535);
|
|
284
|
+
const result = await publishExternalMatterAccessory(mockAccessory, mockContext);
|
|
285
|
+
expect(result?.port).toBe(65535);
|
|
286
|
+
expect(MatterServer).toHaveBeenCalledWith(expect.objectContaining({
|
|
287
|
+
port: 65535,
|
|
288
|
+
}));
|
|
289
|
+
});
|
|
290
|
+
});
|
|
291
|
+
});
|
|
292
|
+
});
|
|
293
|
+
//# sourceMappingURL=ExternalMatterAccessoryPublisher.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ExternalMatterAccessoryPublisher.spec.js","sourceRoot":"","sources":["../../src/matter/ExternalMatterAccessoryPublisher.spec.ts"],"names":[],"mappings":"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"}
|