added working config lib
This commit is contained in:
parent
f8576c0d93
commit
def9bce8dc
33 changed files with 2896 additions and 1485 deletions
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue