UNPKG

@mirad-work/sms-core

Version:

A framework-agnostic TypeScript SMS service core with provider abstraction for Iranian SMS providers

225 lines (221 loc) 7.98 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.SmsConfigManager = void 0; const driver_types_1 = require("../types/driver-types"); const sms_exceptions_1 = require("../exceptions/sms-exceptions"); /** * Configuration manager for SMS service * Supports environment variables, config objects, and default values */ class SmsConfigManager { /** * Create configuration from environment variables */ static fromEnvironment() { const defaultDriver = process.env.SMS_DEFAULT_DRIVER || driver_types_1.DriverType.KAVENEGAR; const timeout = parseInt(process.env.SMS_TIMEOUT || "10000", 10); const config = { defaultDriver, timeout, drivers: {}, }; // Kavenegar configuration if (process.env.SMS_KAVENEGAR_URL || process.env.SMS_KAVENEGAR_API_KEY) { config.drivers.kavenegar = { url: process.env.SMS_KAVENEGAR_URL || "https://api.kavenegar.com/v1/", apiKey: process.env.SMS_KAVENEGAR_API_KEY || "", lineNumber: process.env.SMS_KAVENEGAR_LINE_NUMBER || "", }; } // SMS.ir configuration if (process.env.SMS_SMSIR_URL || process.env.SMS_SMSIR_API_KEY) { config.drivers.smsir = { url: process.env.SMS_SMSIR_URL || "https://api.sms.ir/v1/", apiKey: process.env.SMS_SMSIR_API_KEY || "", lineNumber: process.env.SMS_SMSIR_LINE_NUMBER || "", }; } // Melipayamak configuration if (process.env.SMS_MELIPAYAMAK_URL || process.env.SMS_MELIPAYAMAK_API_KEY) { config.drivers.melipayamak = { url: process.env.SMS_MELIPAYAMAK_URL || "https://console.melipayamak.com/api/", apiKey: process.env.SMS_MELIPAYAMAK_API_KEY || "", lineNumber: process.env.SMS_MELIPAYAMAK_LINE_NUMBER || "", }; } // Mock driver configuration (for testing) if (process.env.NODE_ENV === "test" || process.env.SMS_USE_MOCK === "true") { config.drivers.mock = { shouldFail: process.env.SMS_MOCK_SHOULD_FAIL === "true", delay: parseInt(process.env.SMS_MOCK_DELAY || "0", 10), }; } return config; } /** * Create configuration with validation */ static create(config) { const fullConfig = { defaultDriver: config.defaultDriver || driver_types_1.DriverType.KAVENEGAR, timeout: config.timeout || 10000, drivers: config.drivers || {}, }; this.validateConfig(fullConfig); return fullConfig; } /** * Create a simple configuration for testing with mock driver */ static createForTesting(options = {}) { return { defaultDriver: driver_types_1.DriverType.MOCK, timeout: 5000, drivers: { mock: { shouldFail: options.shouldFail || false, delay: options.delay || 0, }, }, }; } /** * Create configuration for Kavenegar */ static createKavenegarConfig(options) { return { defaultDriver: driver_types_1.DriverType.KAVENEGAR, timeout: 10000, drivers: { kavenegar: { url: options.url || "https://api.kavenegar.com/v1/", apiKey: options.apiKey, lineNumber: options.lineNumber, }, }, }; } /** * Create configuration for SMS.ir */ static createSmsIrConfig(options) { return { defaultDriver: driver_types_1.DriverType.SMSIR, timeout: 10000, drivers: { smsir: { url: options.url || "https://api.sms.ir/v1/", apiKey: options.apiKey, lineNumber: options.lineNumber, }, }, }; } /** * Create configuration for Melipayamak */ static createMelipayamakConfig(options) { return { defaultDriver: driver_types_1.DriverType.MELIPAYAMAK, timeout: 10000, drivers: { melipayamak: { url: options.url || "https://console.melipayamak.com/api/", apiKey: options.apiKey, lineNumber: options.lineNumber, }, }, }; } /** * Merge multiple configurations */ static merge(...configs) { const mergedConfig = { defaultDriver: driver_types_1.DriverType.KAVENEGAR, timeout: 10000, drivers: {}, }; for (const config of configs) { if (config.defaultDriver) { mergedConfig.defaultDriver = config.defaultDriver; } if (config.timeout) { mergedConfig.timeout = config.timeout; } if (config.drivers) { Object.assign(mergedConfig.drivers, config.drivers); } } this.validateConfig(mergedConfig); return mergedConfig; } /** * Validate configuration */ static validateConfig(config) { if (!config.defaultDriver) { throw new sms_exceptions_1.MissingConfigException("defaultDriver"); } if (!config.drivers || Object.keys(config.drivers).length === 0) { throw new sms_exceptions_1.ConfigurationException("At least one driver must be configured"); } // Validate that default driver is configured if (!config.drivers[config.defaultDriver]) { throw new sms_exceptions_1.ConfigurationException(`Default driver '${config.defaultDriver}' is not configured`); } // Validate individual driver configurations Object.entries(config.drivers).forEach(([driverType, driverConfig]) => { if (!driverConfig) return; switch (driverType) { case driver_types_1.DriverType.KAVENEGAR: case driver_types_1.DriverType.SMSIR: case driver_types_1.DriverType.MELIPAYAMAK: { const basicDriverConfig = driverConfig; const config = basicDriverConfig; if (!config.url || !config.apiKey || !config.lineNumber) { throw new sms_exceptions_1.ConfigurationException(`Driver '${driverType}' requires url, apiKey, and lineNumber`); } break; } case driver_types_1.DriverType.MOCK: // Mock driver doesn't require specific validation break; default: throw new sms_exceptions_1.ConfigurationException(`Unknown driver type: ${driverType}`); } }); } /** * Get sample environment variables */ static getSampleEnvVars() { return ` # SMS Service Configuration SMS_DEFAULT_DRIVER=kavenegar SMS_TIMEOUT=10000 # Kavenegar Configuration SMS_KAVENEGAR_URL=https://api.kavenegar.com/v1/ SMS_KAVENEGAR_API_KEY=your-kavenegar-api-key SMS_KAVENEGAR_LINE_NUMBER=your-line-number # SMS.ir Configuration SMS_SMSIR_URL=https://api.sms.ir/v1/ SMS_SMSIR_API_KEY=your-smsir-api-key SMS_SMSIR_LINE_NUMBER=your-line-number # Melipayamak Configuration SMS_MELIPAYAMAK_URL=https://console.melipayamak.com/api/ SMS_MELIPAYAMAK_API_KEY=your-melipayamak-api-key SMS_MELIPAYAMAK_LINE_NUMBER=your-line-number # Mock Driver Configuration (for testing) SMS_USE_MOCK=false SMS_MOCK_SHOULD_FAIL=false SMS_MOCK_DELAY=0 `.trim(); } } exports.SmsConfigManager = SmsConfigManager; //# sourceMappingURL=sms-config.js.map