added working config lib

This commit is contained in:
Bojan Kucera 2025-06-03 14:09:31 -04:00
parent f8576c0d93
commit def9bce8dc
33 changed files with 2896 additions and 1485 deletions

View file

@ -1,85 +1,157 @@
/**
* Data provider configurations for market data
* Data provider configurations using envalid
*/
import { getEnvVar, validateConfig, createConfigLoader } from './core';
import { dataProvidersConfigSchema, DataProvidersConfig, DataProviderConfig } from './types';
import { cleanEnv, str, num, bool } from 'envalid';
/**
* Default data provider configurations
* Data providers configuration with validation and defaults
*/
const defaultDataProviders: DataProviderConfig[] = [
{
name: 'alpaca',
type: 'rest',
baseUrl: 'https://data.alpaca.markets/v1beta1',
apiKey: '',
apiSecret: '',
rateLimits: {
maxRequestsPerMinute: 200
}
},
{
name: 'polygon',
type: 'rest',
baseUrl: 'https://api.polygon.io/v2',
apiKey: '',
rateLimits: {
maxRequestsPerMinute: 5
}
},
{
name: 'alpaca-websocket',
type: 'websocket',
wsUrl: 'wss://stream.data.alpaca.markets/v2/iex',
apiKey: '',
apiSecret: ''
export const dataProvidersConfig = cleanEnv(process.env, {
// Default Provider
DEFAULT_DATA_PROVIDER: str({
choices: ['alpaca', 'polygon', 'yahoo', 'iex'],
default: 'alpaca',
desc: 'Default data provider'
}),
// Alpaca Configuration
ALPACA_API_KEY: str({ default: '', desc: 'Alpaca API key' }),
ALPACA_API_SECRET: str({ default: '', desc: 'Alpaca API secret' }),
ALPACA_BASE_URL: str({ default: 'https://data.alpaca.markets/v1beta1', desc: 'Alpaca base URL' }),
ALPACA_RATE_LIMIT: num({ default: 200, desc: 'Alpaca rate limit per minute' }),
ALPACA_ENABLED: bool({ default: true, desc: 'Enable Alpaca provider' }),
// Polygon Configuration
POLYGON_API_KEY: str({ default: '', desc: 'Polygon API key' }),
POLYGON_BASE_URL: str({ default: 'https://api.polygon.io', desc: 'Polygon base URL' }),
POLYGON_RATE_LIMIT: num({ default: 5, desc: 'Polygon rate limit per minute' }),
POLYGON_ENABLED: bool({ default: false, desc: 'Enable Polygon provider' }),
// Yahoo Finance Configuration
YAHOO_BASE_URL: str({ default: 'https://query1.finance.yahoo.com', desc: 'Yahoo Finance base URL' }),
YAHOO_RATE_LIMIT: num({ default: 2000, desc: 'Yahoo Finance rate limit per hour' }),
YAHOO_ENABLED: bool({ default: true, desc: 'Enable Yahoo Finance provider' }),
// IEX Cloud Configuration
IEX_API_KEY: str({ default: '', desc: 'IEX Cloud API key' }),
IEX_BASE_URL: str({ default: 'https://cloud.iexapis.com/stable', desc: 'IEX Cloud base URL' }),
IEX_RATE_LIMIT: num({ default: 100, desc: 'IEX Cloud rate limit per second' }),
IEX_ENABLED: bool({ default: false, desc: 'Enable IEX Cloud provider' }),
// Connection Settings
DATA_PROVIDER_TIMEOUT: num({ default: 30000, desc: 'Request timeout in milliseconds' }),
DATA_PROVIDER_RETRIES: num({ default: 3, desc: 'Number of retry attempts' }),
DATA_PROVIDER_RETRY_DELAY: num({ default: 1000, desc: 'Retry delay in milliseconds' }),
// Cache Settings
DATA_CACHE_ENABLED: bool({ default: true, desc: 'Enable data caching' }),
DATA_CACHE_TTL: num({ default: 300000, desc: 'Cache TTL in milliseconds' }),
DATA_CACHE_MAX_SIZE: num({ default: 1000, desc: 'Maximum cache entries' }),
});
/**
* Helper function to get provider-specific configuration
*/
export function getProviderConfig(providerName: string) {
const name = providerName.toUpperCase();
switch (name) {
case 'ALPACA':
return {
name: 'alpaca',
type: 'rest' as const,
enabled: dataProvidersConfig.ALPACA_ENABLED,
baseUrl: dataProvidersConfig.ALPACA_BASE_URL,
apiKey: dataProvidersConfig.ALPACA_API_KEY,
apiSecret: dataProvidersConfig.ALPACA_API_SECRET,
rateLimits: {
maxRequestsPerMinute: dataProvidersConfig.ALPACA_RATE_LIMIT
}
};
case 'POLYGON':
return {
name: 'polygon',
type: 'rest' as const,
enabled: dataProvidersConfig.POLYGON_ENABLED,
baseUrl: dataProvidersConfig.POLYGON_BASE_URL,
apiKey: dataProvidersConfig.POLYGON_API_KEY,
rateLimits: {
maxRequestsPerMinute: dataProvidersConfig.POLYGON_RATE_LIMIT
}
};
case 'YAHOO':
return {
name: 'yahoo',
type: 'rest' as const,
enabled: dataProvidersConfig.YAHOO_ENABLED,
baseUrl: dataProvidersConfig.YAHOO_BASE_URL,
rateLimits: {
maxRequestsPerHour: dataProvidersConfig.YAHOO_RATE_LIMIT
}
};
case 'IEX':
return {
name: 'iex',
type: 'rest' as const,
enabled: dataProvidersConfig.IEX_ENABLED,
baseUrl: dataProvidersConfig.IEX_BASE_URL,
apiKey: dataProvidersConfig.IEX_API_KEY,
rateLimits: {
maxRequestsPerSecond: dataProvidersConfig.IEX_RATE_LIMIT
}
};
default:
throw new Error(`Unknown provider: ${providerName}`);
}
];
/**
* Load data provider configurations from environment variables
*/
export function loadDataProviderConfigs(): DataProvidersConfig {
// Get provider specific environment variables
const providers = defaultDataProviders.map(provider => {
const nameUpper = provider.name.toUpperCase().replace('-', '_');
const updatedProvider: DataProviderConfig = {
...provider,
apiKey: getEnvVar(`${nameUpper}_API_KEY`) || provider.apiKey || '',
};
if (provider.apiSecret !== undefined) {
updatedProvider.apiSecret = getEnvVar(`${nameUpper}_API_SECRET`) || provider.apiSecret || '';
}
return updatedProvider;
});
// Load default provider from environment
const defaultProvider = getEnvVar('DEFAULT_DATA_PROVIDER') || 'alpaca';
const config: DataProvidersConfig = {
providers,
defaultProvider
};
return validateConfig(config, dataProvidersConfigSchema);
}
/**
* Creates a dynamic configuration loader for data providers
* Get all enabled providers
*/
export const createDataProvidersConfig = createConfigLoader<DataProvidersConfig>(
'data-providers',
dataProvidersConfigSchema,
{
providers: defaultDataProviders,
defaultProvider: 'alpaca'
}
);
export function getEnabledProviders() {
const providers = ['alpaca', 'polygon', 'yahoo', 'iex'];
return providers
.map(provider => getProviderConfig(provider))
.filter(config => config.enabled);
}
/**
* Singleton data provider configurations
* Get the default provider configuration
*/
export const dataProviderConfigs = loadDataProviderConfigs();
export function getDefaultProvider() {
return getProviderConfig(dataProvidersConfig.DEFAULT_DATA_PROVIDER);
}
// Export typed configuration object
export type DataProvidersConfig = typeof dataProvidersConfig;
// Export individual config values for convenience
export const {
DEFAULT_DATA_PROVIDER,
ALPACA_API_KEY,
ALPACA_API_SECRET,
ALPACA_BASE_URL,
ALPACA_RATE_LIMIT,
ALPACA_ENABLED,
POLYGON_API_KEY,
POLYGON_BASE_URL,
POLYGON_RATE_LIMIT,
POLYGON_ENABLED,
YAHOO_BASE_URL,
YAHOO_RATE_LIMIT,
YAHOO_ENABLED,
IEX_API_KEY,
IEX_BASE_URL,
IEX_RATE_LIMIT,
IEX_ENABLED,
DATA_PROVIDER_TIMEOUT,
DATA_PROVIDER_RETRIES,
DATA_PROVIDER_RETRY_DELAY,
DATA_CACHE_ENABLED,
DATA_CACHE_TTL,
DATA_CACHE_MAX_SIZE,
} = dataProvidersConfig;