matterbridge-roborock-vacuum-plugin
Version:
Matterbridge Roborock Vacuum Plugin
188 lines • 7.79 kB
JavaScript
/**
* 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