2025-07-12 20:11:20 +09:00

154 lines
4.8 KiB
JavaScript

// Configuration management for environment-based settings
const os = require('os');
const path = require('path');
const fs = require('fs');
class Config {
constructor() {
this.env = process.env.NODE_ENV || 'development';
this.defaults = {
apiUrl: process.env.pickleglass_API_URL || 'http://localhost:9001',
apiTimeout: 10000,
webUrl: process.env.pickleglass_WEB_URL || 'http://localhost:3000',
enableJWT: false,
fallbackToHeaderAuth: false,
cacheTimeout: 5 * 60 * 1000,
enableCaching: true,
syncInterval: 0,
healthCheckInterval: 30 * 1000,
defaultWindowWidth: 400,
defaultWindowHeight: 60,
enableOfflineMode: true,
enableFileBasedCommunication: false,
enableSQLiteStorage: true,
logLevel: 'info',
enableDebugLogging: false
};
this.config = { ...this.defaults };
this.loadEnvironmentConfig();
this.loadUserConfig();
}
loadEnvironmentConfig() {
if (process.env.pickleglass_API_URL) {
this.config.apiUrl = process.env.pickleglass_API_URL;
console.log(`[Config] API URL from env: ${this.config.apiUrl}`);
}
if (process.env.pickleglass_WEB_URL) {
this.config.webUrl = process.env.pickleglass_WEB_URL;
console.log(`[Config] Web URL from env: ${this.config.webUrl}`);
}
if (process.env.pickleglass_API_TIMEOUT) {
this.config.apiTimeout = parseInt(process.env.pickleglass_API_TIMEOUT);
}
if (process.env.pickleglass_ENABLE_JWT) {
this.config.enableJWT = process.env.pickleglass_ENABLE_JWT === 'true';
}
if (process.env.pickleglass_CACHE_TIMEOUT) {
this.config.cacheTimeout = parseInt(process.env.pickleglass_CACHE_TIMEOUT);
}
if (process.env.pickleglass_LOG_LEVEL) {
this.config.logLevel = process.env.pickleglass_LOG_LEVEL;
}
if (process.env.pickleglass_DEBUG) {
this.config.enableDebugLogging = process.env.pickleglass_DEBUG === 'true';
}
if (this.env === 'production') {
this.config.enableDebugLogging = false;
this.config.logLevel = 'warn';
} else if (this.env === 'development') {
this.config.enableDebugLogging = true;
this.config.logLevel = 'debug';
}
}
loadUserConfig() {
try {
const userConfigPath = this.getUserConfigPath();
if (fs.existsSync(userConfigPath)) {
const userConfig = JSON.parse(fs.readFileSync(userConfigPath, 'utf-8'));
this.config = { ...this.config, ...userConfig };
console.log('[Config] User config loaded from:', userConfigPath);
}
} catch (error) {
console.warn('[Config] Failed to load user config:', error.message);
}
}
getUserConfigPath() {
const configDir = path.join(os.homedir(), '.pickleglass');
if (!fs.existsSync(configDir)) {
fs.mkdirSync(configDir, { recursive: true });
}
return path.join(configDir, 'config.json');
}
get(key) {
return this.config[key];
}
set(key, value) {
this.config[key] = value;
}
getAll() {
return { ...this.config };
}
saveUserConfig() {
try {
const userConfigPath = this.getUserConfigPath();
const userConfig = { ...this.config };
Object.keys(this.defaults).forEach(key => {
if (userConfig[key] === this.defaults[key]) {
delete userConfig[key];
}
});
fs.writeFileSync(userConfigPath, JSON.stringify(userConfig, null, 2));
console.log('[Config] User config saved to:', userConfigPath);
} catch (error) {
console.error('[Config] Failed to save user config:', error);
}
}
reset() {
this.config = { ...this.defaults };
this.loadEnvironmentConfig();
}
isDevelopment() {
return this.env === 'development';
}
isProduction() {
return this.env === 'production';
}
shouldLog(level) {
const levels = ['debug', 'info', 'warn', 'error'];
const currentLevelIndex = levels.indexOf(this.config.logLevel);
const requestedLevelIndex = levels.indexOf(level);
return requestedLevelIndex >= currentLevelIndex;
}
}
const config = new Config();
module.exports = config;