102 lines
3.5 KiB
TypeScript
102 lines
3.5 KiB
TypeScript
/**
|
|
* Automation configuration module for environment-based adapter selection.
|
|
*
|
|
* This module provides configuration types and loaders for the automation system,
|
|
* allowing switching between different adapters based on environment variables.
|
|
*/
|
|
|
|
export type AutomationMode = 'dev' | 'production' | 'mock';
|
|
|
|
export interface AutomationEnvironmentConfig {
|
|
mode: AutomationMode;
|
|
|
|
/** Dev mode configuration (Browser DevTools) */
|
|
devTools?: {
|
|
browserWSEndpoint?: string;
|
|
debuggingPort?: number;
|
|
};
|
|
|
|
/** Production mode configuration (nut.js) */
|
|
nutJs?: {
|
|
mouseSpeed?: number;
|
|
keyboardDelay?: number;
|
|
windowTitle?: string;
|
|
templatePath?: string;
|
|
confidence?: number;
|
|
};
|
|
|
|
/** Default timeout for automation operations in milliseconds */
|
|
defaultTimeout?: number;
|
|
/** Number of retry attempts for failed operations */
|
|
retryAttempts?: number;
|
|
/** Whether to capture screenshots on error */
|
|
screenshotOnError?: boolean;
|
|
}
|
|
|
|
/**
|
|
* Load automation configuration from environment variables.
|
|
*
|
|
* Environment variables:
|
|
* - AUTOMATION_MODE: 'dev' | 'production' | 'mock' (default: 'mock')
|
|
* - CHROME_DEBUG_PORT: Chrome debugging port (default: 9222)
|
|
* - CHROME_WS_ENDPOINT: WebSocket endpoint for Chrome DevTools
|
|
* - IRACING_WINDOW_TITLE: Window title for nut.js (default: 'iRacing')
|
|
* - TEMPLATE_PATH: Path to template images (default: './resources/templates')
|
|
* - OCR_CONFIDENCE: OCR confidence threshold (default: 0.9)
|
|
* - AUTOMATION_TIMEOUT: Default timeout in ms (default: 30000)
|
|
* - RETRY_ATTEMPTS: Number of retry attempts (default: 3)
|
|
* - SCREENSHOT_ON_ERROR: Capture screenshots on error (default: true)
|
|
*
|
|
* @returns AutomationEnvironmentConfig with parsed environment values
|
|
*/
|
|
export function loadAutomationConfig(): AutomationEnvironmentConfig {
|
|
const modeEnv = process.env.AUTOMATION_MODE;
|
|
const mode: AutomationMode = isValidAutomationMode(modeEnv) ? modeEnv : 'production';
|
|
|
|
return {
|
|
mode,
|
|
devTools: {
|
|
debuggingPort: parseIntSafe(process.env.CHROME_DEBUG_PORT, 9222),
|
|
browserWSEndpoint: process.env.CHROME_WS_ENDPOINT,
|
|
},
|
|
nutJs: {
|
|
mouseSpeed: parseIntSafe(process.env.NUTJS_MOUSE_SPEED, 1000),
|
|
keyboardDelay: parseIntSafe(process.env.NUTJS_KEYBOARD_DELAY, 50),
|
|
windowTitle: process.env.IRACING_WINDOW_TITLE || 'iRacing',
|
|
templatePath: process.env.TEMPLATE_PATH || './resources/templates',
|
|
confidence: parseFloatSafe(process.env.OCR_CONFIDENCE, 0.9),
|
|
},
|
|
defaultTimeout: parseIntSafe(process.env.AUTOMATION_TIMEOUT, 30000),
|
|
retryAttempts: parseIntSafe(process.env.RETRY_ATTEMPTS, 3),
|
|
screenshotOnError: process.env.SCREENSHOT_ON_ERROR !== 'false',
|
|
};
|
|
}
|
|
|
|
/**
|
|
* Type guard to validate automation mode string.
|
|
*/
|
|
function isValidAutomationMode(value: string | undefined): value is AutomationMode {
|
|
return value === 'dev' || value === 'production' || value === 'mock';
|
|
}
|
|
|
|
/**
|
|
* Safely parse an integer with a default fallback.
|
|
*/
|
|
function parseIntSafe(value: string | undefined, defaultValue: number): number {
|
|
if (value === undefined || value === '') {
|
|
return defaultValue;
|
|
}
|
|
const parsed = parseInt(value, 10);
|
|
return isNaN(parsed) ? defaultValue : parsed;
|
|
}
|
|
|
|
/**
|
|
* Safely parse a float with a default fallback.
|
|
*/
|
|
function parseFloatSafe(value: string | undefined, defaultValue: number): number {
|
|
if (value === undefined || value === '') {
|
|
return defaultValue;
|
|
}
|
|
const parsed = parseFloat(value);
|
|
return isNaN(parsed) ? defaultValue : parsed;
|
|
} |