184 lines
5.5 KiB
TypeScript
184 lines
5.5 KiB
TypeScript
/**
|
|
* Data provider configurations using Yup
|
|
*/
|
|
import { cleanEnv, envValidators } from './env-utils';
|
|
|
|
const { str, num, bool, strWithChoices } = envValidators;
|
|
|
|
export interface ProviderConfig {
|
|
name: string;
|
|
type: 'rest' | 'websocket';
|
|
enabled: boolean;
|
|
baseUrl?: string;
|
|
apiKey?: string;
|
|
apiSecret?: string;
|
|
rateLimits?: {
|
|
maxRequestsPerMinute?: number;
|
|
maxRequestsPerSecond?: number;
|
|
maxRequestsPerHour?: number;
|
|
};
|
|
}
|
|
/**
|
|
* Data providers configuration with validation and defaults
|
|
*/
|
|
export const dataProvidersConfig = cleanEnv(process.env, {
|
|
// Default Provider
|
|
DEFAULT_DATA_PROVIDER: strWithChoices(['alpaca', 'polygon', 'yahoo', 'iex'], 'alpaca', 'Default data provider'),
|
|
|
|
// Alpaca Configuration
|
|
ALPACA_API_KEY: str('', 'Alpaca API key'),
|
|
ALPACA_API_SECRET: str('', 'Alpaca API secret'),
|
|
ALPACA_BASE_URL: str('https://data.alpaca.markets/v1beta1', 'Alpaca base URL'),
|
|
ALPACA_RATE_LIMIT: num(200, 'Alpaca rate limit per minute'),
|
|
ALPACA_ENABLED: bool(true, 'Enable Alpaca provider'),
|
|
|
|
// Polygon Configuration
|
|
POLYGON_API_KEY: str('', 'Polygon API key'),
|
|
POLYGON_BASE_URL: str('https://api.polygon.io', 'Polygon base URL'),
|
|
POLYGON_RATE_LIMIT: num(5, 'Polygon rate limit per minute'),
|
|
POLYGON_ENABLED: bool(false, 'Enable Polygon provider'),
|
|
|
|
// Yahoo Finance Configuration
|
|
YAHOO_BASE_URL: str('https://query1.finance.yahoo.com', 'Yahoo Finance base URL'),
|
|
YAHOO_RATE_LIMIT: num(2000, 'Yahoo Finance rate limit per hour'),
|
|
YAHOO_ENABLED: bool(true, 'Enable Yahoo Finance provider'),
|
|
|
|
// IEX Cloud Configuration
|
|
IEX_API_KEY: str('', 'IEX Cloud API key'),
|
|
IEX_BASE_URL: str('https://cloud.iexapis.com/stable', 'IEX Cloud base URL'),
|
|
IEX_RATE_LIMIT: num(100, 'IEX Cloud rate limit per second'),
|
|
IEX_ENABLED: bool(false, 'Enable IEX Cloud provider'),
|
|
|
|
// Connection Settings
|
|
DATA_PROVIDER_TIMEOUT: num(30000, 'Request timeout in milliseconds'),
|
|
DATA_PROVIDER_RETRIES: num(3, 'Number of retry attempts'),
|
|
DATA_PROVIDER_RETRY_DELAY: num(1000, 'Retry delay in milliseconds'),
|
|
|
|
// Cache Settings
|
|
DATA_CACHE_ENABLED: bool(true, 'Enable data caching'),
|
|
DATA_CACHE_TTL: num(300000, 'Cache TTL in milliseconds'),
|
|
DATA_CACHE_MAX_SIZE: num(1000, 'Maximum cache entries'),
|
|
});
|
|
|
|
/**
|
|
* Helper function to get provider-specific configuration
|
|
*/
|
|
export function getProviderConfig(providerName: string) {
|
|
// make a interface for the provider config
|
|
|
|
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}`);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Get all enabled providers
|
|
*/
|
|
export function getEnabledProviders() {
|
|
const providers = ['alpaca', 'polygon', 'yahoo', 'iex'];
|
|
return providers
|
|
.map(provider => getProviderConfig(provider))
|
|
.filter(config => config.enabled);
|
|
}
|
|
|
|
/**
|
|
* Get the default provider configuration
|
|
*/
|
|
export function getDefaultProvider() {
|
|
return getProviderConfig(dataProvidersConfig.DEFAULT_DATA_PROVIDER);
|
|
}
|
|
|
|
// Export typed configuration object
|
|
export type DataProvidersConfig = typeof dataProvidersConfig;
|
|
export class DataProviders {
|
|
static getProviderConfig(providerName: string): ProviderConfig {
|
|
return getProviderConfig(providerName);
|
|
}
|
|
|
|
static getEnabledProviders(): ProviderConfig[] {
|
|
return getEnabledProviders();
|
|
}
|
|
|
|
static getDefaultProvider(): ProviderConfig {
|
|
return getDefaultProvider();
|
|
}
|
|
}
|
|
|
|
|
|
// 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;
|