stock-bot/libs/config/src/example.ts

817 lines
25 KiB
TypeScript

/**
* Example usage of the Stock Bot configuration library
*
* This file demonstrates how to use the Zod-based configuration
* system for various services in the Stock Bot platform.
*/
// Import all the configuration modules
import {
// Core utilities
loadEnvVariables,
getEnvironment,
Environment,
ConfigurationError,
} from './core';
import {
// PostgreSQL configuration
postgresConfig,
PostgresConfig,
POSTGRES_HOST,
POSTGRES_PORT,
POSTGRES_DATABASE,
POSTGRES_USERNAME,
POSTGRES_PASSWORD,
} from './postgres';
import {
// QuestDB configuration
questdbConfig,
QuestDbConfig,
QUESTDB_HOST,
QUESTDB_HTTP_PORT,
QUESTDB_PG_PORT,
} from './questdb';
import {
// MongoDB configuration
mongodbConfig,
MongoDbConfig,
MONGODB_HOST,
MONGODB_PORT,
MONGODB_DATABASE,
MONGODB_USERNAME,
} from './mongodb';
import {
// Dragonfly configuration
dragonflyConfig,
DragonflyConfig,
DRAGONFLY_HOST,
DRAGONFLY_PORT,
DRAGONFLY_DATABASE,
} from './dragonfly';
import {
// Monitoring configuration
prometheusConfig,
grafanaConfig,
PrometheusConfig,
GrafanaConfig,
PROMETHEUS_HOST,
PROMETHEUS_PORT,
GRAFANA_HOST,
GRAFANA_PORT,
} from './monitoring';
import {
// Loki configuration
lokiConfig,
LokiConfig,
LOKI_HOST,
LOKI_PORT,
LOKI_SERVICE_LABEL,
LOKI_BATCH_SIZE,
} from './loki';
import {
// Logging configuration
loggingConfig,
LoggingConfig,
LOG_LEVEL,
LOG_FORMAT,
LOG_CONSOLE,
LOG_FILE,
LOG_SERVICE_NAME,
} from './logging';
import {
// Risk management configuration
riskConfig,
RiskConfig,
RISK_MAX_POSITION_SIZE,
RISK_DEFAULT_STOP_LOSS,
RISK_CIRCUIT_BREAKER_ENABLED,
} from './risk';
import {
// Data provider configuration
dataProvidersConfig,
DataProvidersConfig,
getProviderConfig,
getEnabledProviders,
getDefaultProvider,
DEFAULT_DATA_PROVIDER,
ALPACA_API_KEY,
} from './data-providers';
/**
* Example 1: Basic usage - Load environment variables and get configuration
*/
function basicUsageExample() {
console.log('=== Basic Usage Example ===');
// Load environment variables (optional - they're loaded automatically)
loadEnvVariables();
// Get the current environment
const env = getEnvironment();
console.log(`Current environment: ${env}`);
// Access individual configuration values
console.log(`Database host: ${POSTGRES_HOST}`);
console.log(`Database port: ${POSTGRES_PORT}`);
console.log(`Log level: ${LOG_LEVEL}`);
// Access full database config objects
console.log(`Full database config:`, {
host: postgresConfig.POSTGRES_HOST,
port: postgresConfig.POSTGRES_PORT,
name: postgresConfig.POSTGRES_DATABASE,
ssl: postgresConfig.POSTGRES_SSL,
});
}
/**
* Example 2: Using configuration in a database connection
*/
async function databaseConnectionExample() {
console.log('=== Database Connection Example ===');
try {
// Use the database configuration to create a connection string
const connectionString = `postgresql://${POSTGRES_USERNAME}:${POSTGRES_PASSWORD}@${POSTGRES_HOST}:${POSTGRES_PORT}/${POSTGRES_DATABASE}`;
console.log('Database connection settings:');
console.log(`- Host: ${postgresConfig.POSTGRES_HOST}`);
console.log(`- Port: ${postgresConfig.POSTGRES_PORT}`);
console.log(`- Database: ${postgresConfig.POSTGRES_DATABASE}`);
console.log(`- SSL enabled: ${postgresConfig.POSTGRES_SSL}`);
console.log(`- Pool max connections: ${postgresConfig.POSTGRES_POOL_MAX}`);
console.log(`- Query timeout: ${postgresConfig.POSTGRES_QUERY_TIMEOUT}ms`);
// Example pool configuration
const poolConfig = {
host: postgresConfig.POSTGRES_HOST,
port: postgresConfig.POSTGRES_PORT,
database: postgresConfig.POSTGRES_DATABASE,
user: postgresConfig.POSTGRES_USERNAME,
password: postgresConfig.POSTGRES_PASSWORD,
ssl: postgresConfig.POSTGRES_SSL,
min: postgresConfig.POSTGRES_POOL_MIN,
max: postgresConfig.POSTGRES_POOL_MAX,
idleTimeoutMillis: postgresConfig.POSTGRES_POOL_IDLE_TIMEOUT,
};
console.log('Pool configuration:', poolConfig);
} catch (error) {
console.error('Database configuration error:', error);
}
}
/**
* Example 3: Logging setup example
*/
function loggingSetupExample() {
console.log('=== Logging Setup Example ===');
// Access logging configuration
console.log('Logging settings:');
console.log(`- Level: ${loggingConfig.LOG_LEVEL}`);
console.log(`- Format: ${loggingConfig.LOG_FORMAT}`);
console.log(`- Console enabled: ${loggingConfig.LOG_CONSOLE}`);
console.log(`- File logging: ${loggingConfig.LOG_FILE}`);
console.log(`- Service name: ${loggingConfig.LOG_SERVICE_NAME}`);
// Example logger configuration
const loggerConfig = {
level: loggingConfig.LOG_LEVEL,
format: loggingConfig.LOG_FORMAT,
transports: [] as any[],
defaultMeta: {
service: loggingConfig.LOG_SERVICE_NAME,
version: loggingConfig.LOG_SERVICE_VERSION,
environment: loggingConfig.LOG_ENVIRONMENT,
},
};
if (loggingConfig.LOG_CONSOLE) {
loggerConfig.transports.push({
type: 'console',
format: loggingConfig.LOG_FORMAT,
timestamp: loggingConfig.LOG_TIMESTAMP,
});
}
if (loggingConfig.LOG_FILE) {
loggerConfig.transports.push({
type: 'file',
filename: `${loggingConfig.LOG_FILE_PATH}/application.log`,
maxSize: loggingConfig.LOG_FILE_MAX_SIZE,
maxFiles: loggingConfig.LOG_FILE_MAX_FILES,
datePattern: loggingConfig.LOG_FILE_DATE_PATTERN,
});
}
// Example Loki transport configuration
if (lokiConfig.LOKI_HOST) {
loggerConfig.transports.push({
type: 'loki',
host: lokiConfig.LOKI_HOST,
port: lokiConfig.LOKI_PORT,
batchSize: lokiConfig.LOKI_BATCH_SIZE,
labels: {
service: lokiConfig.LOKI_SERVICE_LABEL,
environment: lokiConfig.LOKI_ENVIRONMENT_LABEL,
},
});
}
console.log('Logger configuration:', loggerConfig);
}
/**
* Example 4: Risk management configuration
*/
function riskManagementExample() {
console.log('=== Risk Management Example ===');
// Access risk configuration
console.log('Risk management settings:');
console.log(`- Max position size: ${RISK_MAX_POSITION_SIZE * 100}%`);
console.log(`- Default stop loss: ${RISK_DEFAULT_STOP_LOSS * 100}%`);
console.log(`- Circuit breaker enabled: ${RISK_CIRCUIT_BREAKER_ENABLED}`);
console.log(`- Max leverage: ${riskConfig.RISK_MAX_LEVERAGE}x`);
// Example risk calculator
function calculatePositionSize(portfolioValue: number, riskPerTrade: number = RISK_DEFAULT_STOP_LOSS) {
const maxPositionValue = portfolioValue * RISK_MAX_POSITION_SIZE;
const riskAmount = portfolioValue * riskPerTrade;
return {
maxPositionValue,
riskAmount,
maxShares: Math.floor(maxPositionValue / 100), // Assuming $100 per share
};
}
const portfolioValue = 100000; // $100k portfolio
const position = calculatePositionSize(portfolioValue);
console.log(`Position sizing for $${portfolioValue} portfolio:`, position);
}
/**
* Example 5: Data provider configuration
*/
function dataProviderExample() {
console.log('=== Data Provider Example ===');
// Get the default provider
const defaultProvider = getDefaultProvider();
console.log('Default provider:', defaultProvider);
// Get all enabled providers
const enabledProviders = getEnabledProviders();
console.log('Enabled providers:', enabledProviders.map(p => p.name));
// Get specific provider configuration
try {
const alpacaConfig = getProviderConfig('alpaca');
console.log('Alpaca configuration:', {
enabled: alpacaConfig.enabled,
baseUrl: alpacaConfig.baseUrl,
hasApiKey: !!alpacaConfig.apiKey,
rateLimit: alpacaConfig.rateLimits,
});
} catch (error) {
console.error('Error getting Alpaca config:', error);
}
// Example API client setup
const apiClients = enabledProviders.map(provider => ({
name: provider.name,
client: {
baseURL: provider.baseUrl,
timeout: dataProvidersConfig.DATA_PROVIDER_TIMEOUT,
retries: dataProvidersConfig.DATA_PROVIDER_RETRIES,
retryDelay: dataProvidersConfig.DATA_PROVIDER_RETRY_DELAY,
headers: provider.apiKey ? {
'Authorization': `Bearer ${provider.apiKey}`
} : {},
}
}));
console.log('API clients configuration:', apiClients);
}
/**
* Example 6: Environment-specific configuration
*/
function environmentSpecificExample() {
console.log('=== Environment-Specific Example ===');
const env = getEnvironment();
switch (env) {
case Environment.Development:
console.log('Development environment detected');
console.log('- Using local database');
console.log('- Verbose logging enabled');
console.log('- Paper trading mode');
break;
case Environment.Testing:
console.log('Testing environment detected');
console.log('- Using test database');
console.log('- Structured logging');
console.log('- Mock data providers');
break;
case Environment.Staging:
console.log('Staging environment detected');
console.log('- Using staging database');
console.log('- Production-like settings');
console.log('- Real data providers (limited)');
break;
case Environment.Production:
console.log('Production environment detected');
console.log('- Using production database');
console.log('- Optimized logging');
console.log('- Live trading enabled');
break;
}
// Example of environment-specific behavior
const isProduction = env === Environment.Production;
const tradingMode = isProduction ? 'live' : 'paper';
const logLevel = isProduction ? 'info' : 'debug';
console.log(`Trading mode: ${tradingMode}`);
console.log(`Recommended log level: ${logLevel}`);
}
/**
* Example 7: Configuration validation and error handling
*/
function configurationValidationExample() {
console.log('=== Configuration Validation Example ===');
try {
// Check required configurations
if (!ALPACA_API_KEY && DEFAULT_DATA_PROVIDER === 'alpaca') {
throw new ConfigurationError('Alpaca API key is required when using Alpaca as default provider');
}
// Validate risk settings
if (RISK_MAX_POSITION_SIZE > 1.0) {
throw new ConfigurationError('Maximum position size cannot exceed 100%');
}
if (riskConfig.RISK_DEFAULT_STOP_LOSS > riskConfig.RISK_DEFAULT_TAKE_PROFIT) {
console.warn('Warning: Stop loss is greater than take profit - check your risk settings');
}
// Validate database connection settings
if (postgresConfig.POSTGRES_POOL_MAX < postgresConfig.POSTGRES_POOL_MIN) {
throw new ConfigurationError('Database max pool size must be greater than min pool size');
}
console.log('✅ All configuration validations passed');
} catch (error) {
if (error instanceof ConfigurationError) {
console.error('❌ Configuration error:', error.message);
} else {
console.error('❌ Unexpected error:', error);
}
}
}
/**
* Example 8: QuestDB time-series database configuration
*/
function questdbConfigurationExample() {
console.log('=== QuestDB Configuration Example ===');
// Access QuestDB configuration
console.log('QuestDB settings:');
console.log(`- Host: ${questdbConfig.QUESTDB_HOST}`);
console.log(`- HTTP port (web console): ${questdbConfig.QUESTDB_HTTP_PORT}`);
console.log(`- PostgreSQL port: ${questdbConfig.QUESTDB_PG_PORT}`);
console.log(`- InfluxDB port: ${questdbConfig.QUESTDB_INFLUX_PORT}`);
console.log(`- TLS enabled: ${questdbConfig.QUESTDB_TLS_ENABLED}`);
// Example QuestDB client configuration
const questdbClientConfig = {
http: {
host: questdbConfig.QUESTDB_HOST,
port: questdbConfig.QUESTDB_HTTP_PORT,
tls: questdbConfig.QUESTDB_TLS_ENABLED,
timeout: questdbConfig.QUESTDB_REQUEST_TIMEOUT,
},
postgresql: {
host: questdbConfig.QUESTDB_HOST,
port: questdbConfig.QUESTDB_PG_PORT,
database: questdbConfig.QUESTDB_DEFAULT_DATABASE,
user: questdbConfig.QUESTDB_USER,
password: questdbConfig.QUESTDB_PASSWORD,
},
influxdb: {
host: questdbConfig.QUESTDB_HOST,
port: questdbConfig.QUESTDB_INFLUX_PORT,
}
};
console.log('QuestDB client configuration:', questdbClientConfig);
// Example time-series table creation
const createTableQuery = `
CREATE TABLE IF NOT EXISTS ohlcv_data (
timestamp TIMESTAMP,
symbol SYMBOL,
open DOUBLE,
high DOUBLE,
low DOUBLE,
close DOUBLE,
volume LONG
) timestamp(timestamp) PARTITION BY DAY;
`;
console.log('Example table creation query:', createTableQuery);
}
/**
* Example 9: MongoDB document database configuration
*/
function mongodbConfigurationExample() {
console.log('=== MongoDB Configuration Example ===');
// Access MongoDB configuration
console.log('MongoDB settings:');
console.log(`- Host: ${mongodbConfig.MONGODB_HOST}`);
console.log(`- Port: ${mongodbConfig.MONGODB_PORT}`);
console.log(`- Database: ${mongodbConfig.MONGODB_DATABASE}`);
console.log(`- Username: ${mongodbConfig.MONGODB_USERNAME}`);
console.log(`- TLS enabled: ${mongodbConfig.MONGODB_TLS}`);
console.log(`- Max pool size: ${mongodbConfig.MONGODB_MAX_POOL_SIZE}`);
// Build connection URI
const buildMongoUri = () => {
if (mongodbConfig.MONGODB_URI) {
return mongodbConfig.MONGODB_URI;
}
const auth = mongodbConfig.MONGODB_USERNAME && mongodbConfig.MONGODB_PASSWORD
? `${mongodbConfig.MONGODB_USERNAME}:${mongodbConfig.MONGODB_PASSWORD}@`
: '';
const tls = mongodbConfig.MONGODB_TLS ? '?tls=true' : '';
return `mongodb://${auth}${mongodbConfig.MONGODB_HOST}:${mongodbConfig.MONGODB_PORT}/${mongodbConfig.MONGODB_DATABASE}${tls}`;
};
const mongoUri = buildMongoUri();
console.log('MongoDB connection URI:', mongoUri.replace(/:[^:@]*@/, ':***@')); // Hide password
// Example MongoDB client configuration
const mongoClientConfig = {
maxPoolSize: mongodbConfig.MONGODB_MAX_POOL_SIZE,
minPoolSize: mongodbConfig.MONGODB_MIN_POOL_SIZE,
maxIdleTimeMS: mongodbConfig.MONGODB_MAX_IDLE_TIME,
connectTimeoutMS: mongodbConfig.MONGODB_CONNECT_TIMEOUT,
socketTimeoutMS: mongodbConfig.MONGODB_SOCKET_TIMEOUT,
serverSelectionTimeoutMS: mongodbConfig.MONGODB_SERVER_SELECTION_TIMEOUT,
retryWrites: mongodbConfig.MONGODB_RETRY_WRITES,
w: mongodbConfig.MONGODB_WRITE_CONCERN,
readPreference: mongodbConfig.MONGODB_READ_PREFERENCE,
};
console.log('MongoDB client configuration:', mongoClientConfig);
// Example collections structure
const collections = [
'sentiment_data', // News sentiment analysis
'market_news', // Raw news articles
'social_signals', // Social media signals
'earnings_reports', // Earnings data
'analyst_ratings', // Analyst recommendations
];
console.log('Example collections:', collections);
}
/**
* Example 10: Dragonfly (Redis replacement) configuration
*/
function dragonflyConfigurationExample() {
console.log('=== Dragonfly Configuration Example ===');
// Access Dragonfly configuration
console.log('Dragonfly settings:');
console.log(`- Host: ${dragonflyConfig.DRAGONFLY_HOST}`);
console.log(`- Port: ${dragonflyConfig.DRAGONFLY_PORT}`);
console.log(`- Database: ${dragonflyConfig.DRAGONFLY_DATABASE}`);
console.log(`- Cache mode: ${dragonflyConfig.DRAGONFLY_CACHE_MODE}`);
console.log(`- Max memory: ${dragonflyConfig.DRAGONFLY_MAX_MEMORY}`);
console.log(`- Pool size: ${dragonflyConfig.DRAGONFLY_POOL_SIZE}`);
// Example Dragonfly client configuration
const dragonflyClientConfig = {
host: dragonflyConfig.DRAGONFLY_HOST,
port: dragonflyConfig.DRAGONFLY_PORT,
db: dragonflyConfig.DRAGONFLY_DATABASE,
password: dragonflyConfig.DRAGONFLY_PASSWORD || undefined,
username: dragonflyConfig.DRAGONFLY_USERNAME || undefined,
retryDelayOnFailover: dragonflyConfig.DRAGONFLY_RETRY_DELAY,
maxRetriesPerRequest: dragonflyConfig.DRAGONFLY_MAX_RETRIES,
connectTimeout: dragonflyConfig.DRAGONFLY_CONNECT_TIMEOUT,
commandTimeout: dragonflyConfig.DRAGONFLY_COMMAND_TIMEOUT,
enableAutoPipelining: true,
};
console.log('Dragonfly client configuration:', dragonflyClientConfig);
// Example cache key patterns
const cachePatterns = {
marketData: 'market:{symbol}:{timeframe}',
indicators: 'indicators:{symbol}:{indicator}:{period}',
positions: 'positions:{account_id}',
orders: 'orders:{order_id}',
rateLimit: 'rate_limit:{provider}:{endpoint}',
sessions: 'session:{user_id}',
};
console.log('Example cache key patterns:', cachePatterns);
// Example TTL configurations
const ttlConfigs = {
marketData: 60, // 1 minute for real-time data
indicators: 300, // 5 minutes for calculated indicators
positions: 30, // 30 seconds for positions
orders: 86400, // 1 day for order history
rateLimit: 3600, // 1 hour for rate limiting
sessions: 1800, // 30 minutes for user sessions
};
console.log('Example TTL configurations (seconds):', ttlConfigs);
}
/**
* Example 11: Monitoring stack configuration (Prometheus, Grafana, Loki)
*/
function monitoringConfigurationExample() {
console.log('=== Monitoring Configuration Example ===');
// Prometheus configuration
console.log('Prometheus settings:');
console.log(`- Host: ${prometheusConfig.PROMETHEUS_HOST}`);
console.log(`- Port: ${prometheusConfig.PROMETHEUS_PORT}`);
console.log(`- Scrape interval: ${prometheusConfig.PROMETHEUS_SCRAPE_INTERVAL}`);
console.log(`- Retention time: ${prometheusConfig.PROMETHEUS_RETENTION_TIME}`);
// Grafana configuration
console.log('\nGrafana settings:');
console.log(`- Host: ${grafanaConfig.GRAFANA_HOST}`);
console.log(`- Port: ${grafanaConfig.GRAFANA_PORT}`);
console.log(`- Admin user: ${grafanaConfig.GRAFANA_ADMIN_USER}`);
console.log(`- Allow sign up: ${grafanaConfig.GRAFANA_ALLOW_SIGN_UP}`);
console.log(`- Database type: ${grafanaConfig.GRAFANA_DATABASE_TYPE}`);
// Loki configuration
console.log('\nLoki settings:');
console.log(`- Host: ${lokiConfig.LOKI_HOST}`);
console.log(`- Port: ${lokiConfig.LOKI_PORT}`);
console.log(`- Batch size: ${lokiConfig.LOKI_BATCH_SIZE}`);
console.log(`- Retention period: ${lokiConfig.LOKI_RETENTION_PERIOD}`);
// Example monitoring endpoints
const monitoringEndpoints = {
prometheus: `http://${prometheusConfig.PROMETHEUS_HOST}:${prometheusConfig.PROMETHEUS_PORT}`,
grafana: `http://${grafanaConfig.GRAFANA_HOST}:${grafanaConfig.GRAFANA_PORT}`,
loki: `http://${lokiConfig.LOKI_HOST}:${lokiConfig.LOKI_PORT}`,
};
console.log('\nMonitoring endpoints:', monitoringEndpoints);
// Example metrics configuration
const metricsConfig = {
defaultLabels: {
service: 'stock-bot',
environment: getEnvironment(),
version: process.env.npm_package_version || '1.0.0',
},
collectDefaultMetrics: true,
prefix: 'stockbot_',
buckets: [0.1, 0.5, 1, 2, 5, 10, 30, 60], // Response time buckets in seconds
};
console.log('Example metrics configuration:', metricsConfig);
}
/**
* Example 12: Multi-database service configuration
*/
function multiDatabaseServiceExample() {
console.log('=== Multi-Database Service Example ===');
// Complete database configuration for a microservice
const serviceConfig = {
service: {
name: 'market-data-processor',
version: '1.0.0',
environment: getEnvironment(),
},
// PostgreSQL for operational data
postgresql: {
host: postgresConfig.POSTGRES_HOST,
port: postgresConfig.POSTGRES_PORT,
database: postgresConfig.POSTGRES_DATABASE,
username: postgresConfig.POSTGRES_USERNAME,
password: postgresConfig.POSTGRES_PASSWORD,
ssl: postgresConfig.POSTGRES_SSL,
pool: {
min: postgresConfig.POSTGRES_POOL_MIN,
max: postgresConfig.POSTGRES_POOL_MAX,
idleTimeout: postgresConfig.POSTGRES_POOL_IDLE_TIMEOUT,
},
},
// QuestDB for time-series data
questdb: {
host: questdbConfig.QUESTDB_HOST,
httpPort: questdbConfig.QUESTDB_HTTP_PORT,
pgPort: questdbConfig.QUESTDB_PG_PORT,
database: questdbConfig.QUESTDB_DEFAULT_DATABASE,
timeout: questdbConfig.QUESTDB_REQUEST_TIMEOUT,
},
// MongoDB for document storage
mongodb: {
host: mongodbConfig.MONGODB_HOST,
port: mongodbConfig.MONGODB_PORT,
database: mongodbConfig.MONGODB_DATABASE,
username: mongodbConfig.MONGODB_USERNAME,
maxPoolSize: mongodbConfig.MONGODB_MAX_POOL_SIZE,
readPreference: mongodbConfig.MONGODB_READ_PREFERENCE,
},
// Dragonfly for caching
dragonfly: {
host: dragonflyConfig.DRAGONFLY_HOST,
port: dragonflyConfig.DRAGONFLY_PORT,
database: dragonflyConfig.DRAGONFLY_DATABASE,
poolSize: dragonflyConfig.DRAGONFLY_POOL_SIZE,
commandTimeout: dragonflyConfig.DRAGONFLY_COMMAND_TIMEOUT,
},
// Monitoring
monitoring: {
prometheus: {
pushGateway: `http://${prometheusConfig.PROMETHEUS_HOST}:${prometheusConfig.PROMETHEUS_PORT}`,
scrapeInterval: prometheusConfig.PROMETHEUS_SCRAPE_INTERVAL,
}, loki: {
host: lokiConfig.LOKI_HOST,
port: lokiConfig.LOKI_PORT,
batchSize: lokiConfig.LOKI_BATCH_SIZE,
labels: {
service: 'market-data-processor',
environment: getEnvironment(),
},
},
},
};
console.log('Complete service configuration:', JSON.stringify(serviceConfig, null, 2));
// Example data flow
const dataFlow = {
ingestion: 'Market data → Dragonfly (cache) → QuestDB (storage)',
processing: 'QuestDB → Analysis → PostgreSQL (results) → MongoDB (metadata)',
serving: 'Dragonfly (cache) ← PostgreSQL/QuestDB ← API requests',
monitoring: 'All services → Prometheus → Grafana dashboards',
logging: 'All services → Loki → Grafana log viewer',
};
console.log('\nData flow patterns:', dataFlow);
}
/**
* Example 8: Creating a service configuration object
*/
function serviceConfigurationExample() {
console.log('=== Service Configuration Example ===');
// Example: Market Data Gateway service configuration
const marketDataGatewayConfig = {
service: {
name: 'market-data-gateway',
port: 3001,
environment: getEnvironment(),
},
database: {
host: postgresConfig.POSTGRES_HOST,
port: postgresConfig.POSTGRES_PORT,
name: postgresConfig.POSTGRES_DATABASE,
ssl: postgresConfig.POSTGRES_SSL,
}, logging: {
level: loggingConfig.LOG_LEVEL,
console: loggingConfig.LOG_CONSOLE,
loki: {
host: lokiConfig.LOKI_HOST,
port: lokiConfig.LOKI_PORT,
labels: {
service: 'market-data-gateway',
environment: getEnvironment(),
}
}
},
dataProviders: {
default: DEFAULT_DATA_PROVIDER,
enabled: getEnabledProviders(),
timeout: dataProvidersConfig.DATA_PROVIDER_TIMEOUT,
retries: dataProvidersConfig.DATA_PROVIDER_RETRIES,
},
cache: {
enabled: dataProvidersConfig.DATA_CACHE_ENABLED,
ttl: dataProvidersConfig.DATA_CACHE_TTL,
maxSize: dataProvidersConfig.DATA_CACHE_MAX_SIZE,
}
};
console.log('Market Data Gateway configuration:', JSON.stringify(marketDataGatewayConfig, null, 2));
}
/**
* Main example runner
*/
function runAllExamples() {
console.log('🚀 Stock Bot Configuration Examples\n');
try {
basicUsageExample();
console.log('\n');
databaseConnectionExample();
console.log('\n');
loggingSetupExample();
console.log('\n');
riskManagementExample();
console.log('\n');
dataProviderExample();
console.log('\n');
environmentSpecificExample();
console.log('\n');
configurationValidationExample();
console.log('\n');
questdbConfigurationExample();
console.log('\n');
mongodbConfigurationExample();
console.log('\n');
dragonflyConfigurationExample();
console.log('\n');
monitoringConfigurationExample();
console.log('\n');
multiDatabaseServiceExample();
console.log('\n');
serviceConfigurationExample();
} catch (error) {
console.error('Example execution error:', error);
}
}
// Export the examples for use in other files
export {
basicUsageExample,
databaseConnectionExample,
loggingSetupExample,
riskManagementExample,
dataProviderExample,
environmentSpecificExample,
configurationValidationExample,
questdbConfigurationExample,
mongodbConfigurationExample,
dragonflyConfigurationExample,
monitoringConfigurationExample,
multiDatabaseServiceExample,
serviceConfigurationExample,
runAllExamples,
};
// Run examples if this file is executed directly
if (require.main === module) {
runAllExamples();
}