bowling-analysis-system
Version:
A comprehensive system for analyzing bowling techniques using video processing and metrics calculation
151 lines (129 loc) • 4.03 kB
JavaScript
/**
* @module pipeline/PipelineConfig
* @description Pipeline configuration handler for video processing
*/
const fs = require('fs');
const path = require('path');
const { merge } = require('lodash');
const { defaultLogger } = require('../utils/logger');
const { getPipelineTemplate } = require('../core/utils/PatternDetectionConfig');
const env = require('../config/env');
/**
* Default pipeline configuration
* @type {Object}
*/
const DEFAULT_CONFIG = {
template: 'FULL_ANALYSIS',
outputFormat: 'json',
processorOptions: {},
monitoring: {
enablePerformanceTracking: true,
detailedMetrics: true
}
};
/**
* Load pipeline configuration from a file
* @param {string} configPath - Path to configuration file
* @returns {Object|null} - Loaded configuration or null if loading failed
*/
function loadConfigFromFile(configPath) {
try {
if (!fs.existsSync(configPath)) {
logger.warn(`Pipeline configuration file not found: ${configPath}`);
return null;
}
const configData = fs.readFileSync(configPath, 'utf8');
return JSON.parse(configData);
} catch (error) {
logger.error(`Failed to load pipeline configuration: ${error.message}`);
return null;
}
}
/**
* Build a pipeline configuration with overrides
* @param {Object} options - Configuration options and overrides
* @returns {Object} - Complete pipeline configuration
*/
function buildPipelineConfig(options = {}) {
// Start with default configuration
const config = { ...DEFAULT_CONFIG };
// Load configuration from environment
if (env.pipeline && typeof env.pipeline === 'object') {
merge(config, env.pipeline);
}
// Load configuration from default config file
const defaultConfigPath = path.join(process.cwd(), 'src', 'config', 'pipeline-config.json');
const fileConfig = loadConfigFromFile(defaultConfigPath);
if (fileConfig) {
merge(config, fileConfig);
}
// Apply any custom config file specified in options
if (options.configFile) {
const customFileConfig = loadConfigFromFile(options.configFile);
if (customFileConfig) {
merge(config, customFileConfig);
}
}
// Apply direct options (highest priority)
merge(config, options);
// Set up template
if (config.template) {
const template = getPipelineTemplate(config.template);
if (template) {
config.stages = template.stages;
} else {
logger.warn(`Unknown pipeline template: ${config.template}, using default stages`);
}
}
// Validate configuration
validatePipelineConfig(config);
return config;
}
/**
* Validate pipeline configuration
* @param {Object} config - Pipeline configuration
* @returns {boolean} - Whether configuration is valid
*/
function validatePipelineConfig(config) {
let isValid = true;
// Validate required properties
if (!config.stages || !Array.isArray(config.stages)) {
logger.error('Pipeline configuration missing stages array');
isValid = false;
}
// Validate stages
if (config.stages) {
config.stages.forEach((stage, index) => {
if (!stage.type) {
logger.error(`Stage at index ${index} is missing type property`);
isValid = false;
}
});
}
return isValid;
}
/**
* Get processor configuration for a stage
* @param {Object} stage - Pipeline stage
* @param {Object} pipelineConfig - Overall pipeline configuration
* @returns {Object} - Processor configuration
*/
function getProcessorConfig(stage, pipelineConfig) {
// Start with empty config
const config = {};
// Add processor options from pipeline config if available
if (pipelineConfig.processorOptions && pipelineConfig.processorOptions[stage.type]) {
merge(config, pipelineConfig.processorOptions[stage.type]);
}
// Add processor options from stage config if available
if (stage.config) {
merge(config, stage.config);
}
return config;
}
module.exports = {
buildPipelineConfig,
validatePipelineConfig,
getProcessorConfig,
DEFAULT_CONFIG
};