UNPKG

matterbridge-roborock-vacuum-plugin

Version:
188 lines 7.79 kB
/** * Platform configuration manager. * Provides validation, defaults, and device allow/deny checks using whiteList/blackList. */ import { DEFAULT_REFRESH_INTERVAL_SECONDS } from '../constants/index.js'; import { createDefaultAdvancedFeature, createDefaultCleanModeSettings, } from '../model/RoborockPluginPlatformConfig.js'; /** * Manages platform configuration with validation and defaults. */ export class PlatformConfigManager { config; log; constructor(config, log) { this.config = config; this.log = log; this.config.pluginConfiguration.whiteList ??= []; this.config.advancedFeature ??= createDefaultAdvancedFeature(); } /** * Create a PlatformConfigManager with defaults applied. */ static create(config, log) { return new PlatformConfigManager(config, log); } validateConfig() { if (!this.config.authentication.username || typeof this.config.authentication.username !== 'string') { return false; } return true; } /** * Validate authentication configuration. * Returns true if authentication can proceed. */ validateAuthentication() { const auth = this.config.authentication; if (!auth || typeof auth !== 'object') { this.log.error('Platform config validation failed: "authentication" object is required'); return false; } const method = auth.authenticationMethod; if (method === 'VerificationCode') { if (!auth.verificationCode) { this.log.info('Platform config validation: verification code not provided'); return false; } } else { if (!auth.password) { this.log.info('Platform config validation: password not provided'); return false; } } return true; } // ─── Authentication Configuration ───────────────────────────────────────────── get alwaysExecuteAuthentication() { return this.config.authentication.forceAuthentication; } get username() { return this.config.authentication.username; } get password() { return this.config.authentication.password ?? ''; } get verificationCode() { return this.config.authentication.verificationCode ?? ''; } get authenticationMethod() { return this.config.authentication.authenticationMethod ?? 'Password'; } get region() { const configRegion = this.config.authentication.region; return configRegion?.toUpperCase() ?? 'US'; } get rawConfig() { return this.config; } // ─── Plugin Configurations ────────────────────────────────────────────────── get refreshInterval() { return this.config.pluginConfiguration.refreshInterval ?? DEFAULT_REFRESH_INTERVAL_SECONDS; } get hasWhiteListConfig() { return (this.config.pluginConfiguration.whiteList ?? []).length > 0; } get unregisterOnShutdown() { return this.config.pluginConfiguration.unregisterOnShutdown ?? false; } get isServerModeEnabled() { return this.config.pluginConfiguration.enableServerMode; } get isMultipleMapEnabled() { return this.config.pluginConfiguration.enableMultipleMap; } // ─── Experimental Features ────────────────────────────────────────────────── get isAdvancedFeatureEnabled() { return this.config.advancedFeature.enableAdvancedFeature; } get isClearStorageOnStartupEnabled() { return this.isAdvancedFeatureEnabled && this.advancedFeatureSettings.clearStorageOnStartup; } get isCustomCleanModeMappingEnabled() { return this.isAdvancedFeatureEnabled && this.advancedFeatureSettings.enableCleanModeMapping; } get advancedFeatureSettings() { return this.config.advancedFeature.settings; } get cleanModeSettings() { if (this.isAdvancedFeatureEnabled && this.advancedFeatureSettings.enableCleanModeMapping) { return this.config.advancedFeature.settings.cleanModeSettings; } return createDefaultCleanModeSettings(); } get showRoutinesAsRoom() { return this.isAdvancedFeatureEnabled && this.advancedFeatureSettings.showRoutinesAsRoom; } get forceRunAtDefault() { return this.isAdvancedFeatureEnabled && this.advancedFeatureSettings.forceRunAtDefault; } get includeDockStationStatus() { if (this.isAdvancedFeatureEnabled) { return this.advancedFeatureSettings.includeDockStationStatus; } return false; } get includeVacuumErrorStatus() { if (this.isAdvancedFeatureEnabled) { return this.advancedFeatureSettings.includeVacuumErrorStatus; } return false; } get useVacationModeToSendVacuumToDock() { if (this.isAdvancedFeatureEnabled) { return this.advancedFeatureSettings.useVacationModeToSendVacuumToDock; } return false; } get overrideMatterConfiguration() { if (this.isAdvancedFeatureEnabled) { return this.advancedFeatureSettings.overrideMatterConfiguration ?? false; } return false; } get matterOverrideSettings() { const defaultSettings = createDefaultAdvancedFeature().settings.matterOverrideSettings; if (this.isAdvancedFeatureEnabled && this.overrideMatterConfiguration) { return (this.advancedFeatureSettings.matterOverrideSettings ?? createDefaultAdvancedFeature().settings.matterOverrideSettings); } return defaultSettings; } getProductNameForDevice(serialNumber) { if (!this.isAdvancedFeatureEnabled || !this.overrideMatterConfiguration) { return undefined; } const deviceProductNames = this.advancedFeatureSettings.matterOverrideSettings?.deviceProductNames ?? []; return deviceProductNames.find((d) => d.serialNumber === serialNumber)?.productName; } ensureDeviceProductNameEntry(serialNumber, defaultProductName) { if (!this.isAdvancedFeatureEnabled || !this.overrideMatterConfiguration) { return false; } const settings = this.advancedFeatureSettings?.matterOverrideSettings; if (!settings) return false; settings.deviceProductNames ??= []; if (settings.deviceProductNames.some((d) => d.serialNumber === serialNumber)) return false; settings.deviceProductNames.push({ serialNumber, productName: defaultProductName }); return true; } get isEmailNotificationEnabled() { return this.isAdvancedFeatureEnabled && (this.advancedFeatureSettings.enableEmailNotification ?? false); } get emailNotificationSettings() { if (!this.isEmailNotificationEnabled) return undefined; return this.advancedFeatureSettings.emailNotificationSettings; } // ─── Device Filtering ─────────────────────────────────────────────────────── isDeviceAllowed(device) { if (this.hasWhiteListConfig) { return this.config.pluginConfiguration.whiteList.some((entry) => entry === device.duid); } return true; } } //# sourceMappingURL=platformConfigManager.js.map