market-feed 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cache/memory.ts","../src/errors.ts","../src/http/client.ts","../src/utils/symbol.ts","../src/providers/yahoo/transform.ts","../src/providers/yahoo/index.ts","../src/client.ts","../src/utils/rate-limiter.ts","../src/providers/alpha-vantage/transform.ts","../src/providers/alpha-vantage/index.ts","../src/providers/polygon/transform.ts","../src/providers/polygon/index.ts"],"names":["PROVIDER","transformQuote","transformSearch","transformCompany","subtractOneYear"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { CacheDriver } from \"./types.js\";\n\ninterface Entry<T> {\n value: T;\n expiresAt: number; // epoch ms, 0 = no expiry\n}\n\n/**\n * A simple LRU (Least-Recently-Used) in-memory cache with TTL support.\n * No dependencies — uses a Map for O(1) access and insertion-order eviction.\n */\nexport class MemoryCacheDriver implements CacheDriver {\n private readonly store = new Map<string, Entry<unknown>>();\n private readonly maxSize: number;\n\n constructor(maxSize = 500) {\n this.maxSize = maxSize;\n }\n\n async get<T>(key: string): Promise<T | undefined> {\n const entry = this.store.get(key) as Entry<T> | undefined;\n if (!entry) return undefined;\n\n // Evict expired entries on read\n if (entry.expiresAt !== 0 && Date.now() > entry.expiresAt) {\n this.store.delete(key);\n return undefined;\n }\n\n // LRU: move to end (most recently used)\n this.store.delete(key);\n this.store.set(key, entry);\n\n return entry.value;\n }\n\n async set<T>(key: string, value: T, ttlSeconds?: number): Promise<void> {\n // Evict the oldest entry if at capacity\n if (this.store.size >= this.maxSize && !this.store.has(key)) {\n const oldest = this.store.keys().next().value;\n if (oldest !== undefined) {\n this.store.delete(oldest);\n }\n }\n\n const expiresAt =\n ttlSeconds !== undefined && ttlSeconds > 0\n ? Date.now() + ttlSeconds * 1_000\n : 0;\n\n this.store.set(key, { value, expiresAt });\n }\n\n async delete(key: string): Promise<void> {\n this.store.delete(key);\n }\n\n async clear(): Promise<void> {\n this.store.clear();\n }\n\n /** Current number of cached entries (including potentially expired ones). */\n get size(): number {\n return this.store.size;\n }\n}\n","/**\n * Base error class for all market-feed errors.\n * Includes the provider name so callers can identify the source.\n */\nexport class MarketFeedError extends Error {\n constructor(\n message: string,\n public readonly provider: string,\n public override readonly cause?: unknown,\n ) {\n super(message);\n this.name = \"MarketFeedError\";\n // Maintain correct prototype chain in transpiled output\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/**\n * Thrown when an upstream provider returns an HTTP error or unexpected payload.\n */\nexport class ProviderError extends MarketFeedError {\n constructor(\n message: string,\n provider: string,\n public readonly statusCode?: number,\n cause?: unknown,\n ) {\n super(message, provider, cause);\n this.name = \"ProviderError\";\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/**\n * Thrown when a provider's rate limit is reached.\n * Contains the earliest time the caller may retry.\n */\nexport class RateLimitError extends MarketFeedError {\n constructor(\n provider: string,\n public readonly retryAfter?: Date,\n ) {\n const when = retryAfter ? ` Retry after ${retryAfter.toISOString()}.` : \"\";\n super(`Rate limit reached for provider \"${provider}\".${when}`, provider);\n this.name = \"RateLimitError\";\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/**\n * Thrown when all configured providers have failed for a given operation.\n */\nexport class AllProvidersFailedError extends Error {\n constructor(\n public readonly errors: MarketFeedError[],\n operation: string,\n ) {\n const summary = errors.map((e) => `[${e.provider}] ${e.message}`).join(\"; \");\n super(`All providers failed for \"${operation}\": ${summary}`);\n this.name = \"AllProvidersFailedError\";\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/**\n * Thrown when a required feature is not supported by the active provider.\n */\nexport class UnsupportedOperationError extends MarketFeedError {\n constructor(provider: string, operation: string) {\n super(`Provider \"${provider}\" does not support \"${operation}\".`, provider);\n this.name = \"UnsupportedOperationError\";\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n","import { ProviderError } from \"../errors.js\";\n\nexport interface HttpClientOptions {\n /** Base URL prepended to every request path */\n baseUrl?: string;\n /** Default headers merged into every request */\n headers?: Record<string, string>;\n /** Request timeout in milliseconds. Defaults to 10 000. */\n timeoutMs?: number;\n /** Number of retry attempts on transient failures. Defaults to 2. */\n retries?: number;\n /** Initial backoff in milliseconds for exponential retry. Defaults to 300. */\n retryDelayMs?: number;\n}\n\nexport interface RequestOptions {\n params?: Record<string, string | number | boolean | undefined>;\n headers?: Record<string, string>;\n timeoutMs?: number;\n}\n\n/** HTTP status codes that are safe to retry */\nconst RETRYABLE_STATUSES = new Set([429, 500, 502, 503, 504]);\n\nfunction buildUrl(\n base: string,\n path: string,\n params?: Record<string, string | number | boolean | undefined>,\n): string {\n const url = new URL(path, base.endsWith(\"/\") ? base : `${base}/`);\n if (params) {\n for (const [key, value] of Object.entries(params)) {\n if (value !== undefined) {\n url.searchParams.set(key, String(value));\n }\n }\n }\n return url.toString();\n}\n\nasync function sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport class HttpClient {\n private readonly baseUrl: string;\n private readonly defaultHeaders: Record<string, string>;\n private readonly timeoutMs: number;\n private readonly retries: number;\n private readonly retryDelayMs: number;\n\n constructor(private readonly providerName: string, options: HttpClientOptions = {}) {\n this.baseUrl = options.baseUrl ?? \"\";\n this.defaultHeaders = {\n \"Accept\": \"application/json\",\n \"User-Agent\": \"market-feed/0.1.0 (+https://github.com/piyushgupta344/market-feed)\",\n ...options.headers,\n };\n this.timeoutMs = options.timeoutMs ?? 10_000;\n this.retries = options.retries ?? 2;\n this.retryDelayMs = options.retryDelayMs ?? 300;\n }\n\n async get<T>(path: string, options: RequestOptions = {}): Promise<T> {\n const url = buildUrl(this.baseUrl, path, options.params);\n const headers = { ...this.defaultHeaders, ...options.headers };\n const timeoutMs = options.timeoutMs ?? this.timeoutMs;\n\n let lastError: unknown;\n\n for (let attempt = 0; attempt <= this.retries; attempt++) {\n if (attempt > 0) {\n // Exponential backoff: 300ms, 600ms, 1200ms...\n await sleep(this.retryDelayMs * 2 ** (attempt - 1));\n }\n\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n\n try {\n const response = await fetch(url, {\n method: \"GET\",\n headers,\n signal: controller.signal,\n });\n\n clearTimeout(timer);\n\n if (!response.ok) {\n if (RETRYABLE_STATUSES.has(response.status) && attempt < this.retries) {\n lastError = new ProviderError(\n `HTTP ${response.status} from ${url}`,\n this.providerName,\n response.status,\n );\n continue;\n }\n throw new ProviderError(\n `HTTP ${response.status} ${response.statusText} from ${url}`,\n this.providerName,\n response.status,\n );\n }\n\n const contentType = response.headers.get(\"content-type\") ?? \"\";\n if (!contentType.includes(\"application/json\") && !contentType.includes(\"text/plain\")) {\n // Some financial APIs return JSON with a non-standard content-type\n }\n\n return (await response.json()) as T;\n } catch (err) {\n clearTimeout(timer);\n\n if (err instanceof ProviderError) {\n throw err;\n }\n\n if (err instanceof Error && err.name === \"AbortError\") {\n throw new ProviderError(\n `Request to ${url} timed out after ${timeoutMs}ms`,\n this.providerName,\n );\n }\n\n if (attempt < this.retries) {\n lastError = err;\n continue;\n }\n\n throw new ProviderError(\n `Network error fetching ${url}: ${err instanceof Error ? err.message : String(err)}`,\n this.providerName,\n undefined,\n err,\n );\n }\n }\n\n throw new ProviderError(\n `Failed after ${this.retries + 1} attempts`,\n this.providerName,\n undefined,\n lastError,\n );\n }\n}\n","/**\n * Normalise a ticker symbol for use with a specific provider.\n *\n * Different providers use slightly different conventions:\n * - Yahoo Finance: \"BRK-B\", \"BTC-USD\"\n * - Alpha Vantage: \"BRKB\", \"BTCUSD\" (no separator for crypto pairs)\n * - Polygon.io: \"BRK/B\", \"X:BTCUSD\"\n */\n\n/** Strip exchange suffixes like \".NASDAQ\" or \".NYSE\" */\nexport function stripExchange(symbol: string): string {\n return symbol.split(\".\")[0] ?? symbol;\n}\n\n/** Upper-case and trim a symbol */\nexport function normalise(symbol: string): string {\n return symbol.trim().toUpperCase();\n}\n\n/** Convert \"BTC/USD\" or \"BTCUSD\" → \"BTC-USD\" (Yahoo style) */\nexport function toYahooSymbol(symbol: string): string {\n const s = normalise(stripExchange(symbol));\n // \"BTC/USD\" → \"BTC-USD\"\n if (s.includes(\"/\")) return s.replace(\"/\", \"-\");\n return s;\n}\n\n/** Convert \"BTC-USD\" → \"BTCUSD\" (Alpha Vantage style for some endpoints) */\nexport function toAlphaVantageSymbol(symbol: string): string {\n return normalise(stripExchange(symbol)).replace(/[-/]/g, \"\");\n}\n\n/** Convert \"BTC-USD\" → \"X:BTCUSD\" for Polygon crypto, else leave as-is */\nexport function toPolygonSymbol(symbol: string): string {\n const s = normalise(stripExchange(symbol));\n if (s.includes(\"-\")) {\n const [base, quote] = s.split(\"-\");\n if (base && quote && quote.length === 3) {\n // Likely a crypto pair\n return `X:${base}${quote}`;\n }\n }\n return s;\n}\n\n/** Deduplicate and normalise an array of symbols */\nexport function dedupeSymbols(symbols: string[]): string[] {\n return [...new Set(symbols.map(normalise))];\n}\n","import type { CompanyProfile } from \"../../types/company.js\";\nimport type { HistoricalBar } from \"../../types/historical.js\";\nimport type { Quote } from \"../../types/quote.js\";\nimport type { SearchResult } from \"../../types/search.js\";\nimport type { AssetType } from \"../../types/search.js\";\nimport type {\n YahooChartResult,\n YahooQuoteSummaryResult,\n YahooSearchQuote,\n} from \"./types.js\";\n\nconst PROVIDER = \"yahoo\";\n\n// ---------------------------------------------------------------------------\n// Quote\n// ---------------------------------------------------------------------------\nexport function transformQuote(result: YahooChartResult, raw?: unknown): Quote {\n const meta = result.meta;\n\n return {\n symbol: meta.symbol,\n name: meta.symbol, // Yahoo chart API doesn't return company name — enriched separately\n price: meta.regularMarketPrice,\n change: meta.regularMarketPrice - meta.regularMarketPreviousClose,\n changePercent:\n ((meta.regularMarketPrice - meta.regularMarketPreviousClose) /\n meta.regularMarketPreviousClose) *\n 100,\n open: meta.regularMarketDayHigh, // chart meta has dayHigh/Low not open — see below\n high: meta.regularMarketDayHigh,\n low: meta.regularMarketDayLow,\n close: meta.regularMarketPrice,\n previousClose: meta.regularMarketPreviousClose,\n volume: meta.regularMarketVolume,\n ...(meta.fiftyTwoWeekHigh !== undefined ? { fiftyTwoWeekHigh: meta.fiftyTwoWeekHigh } : {}),\n ...(meta.fiftyTwoWeekLow !== undefined ? { fiftyTwoWeekLow: meta.fiftyTwoWeekLow } : {}),\n currency: meta.currency,\n exchange: meta.fullExchangeName ?? meta.exchangeName,\n timestamp: new Date(meta.regularMarketTime * 1_000),\n provider: PROVIDER,\n ...(raw !== undefined ? { raw } : {}),\n };\n}\n\n// ---------------------------------------------------------------------------\n// Historical bars\n// ---------------------------------------------------------------------------\nexport function transformHistorical(result: YahooChartResult, raw?: unknown): HistoricalBar[] {\n const timestamps = result.timestamp ?? [];\n const quoteIndicators = result.indicators.quote[0];\n const adjCloseIndicators = result.indicators.adjclose?.[0];\n\n if (!quoteIndicators) return [];\n\n return timestamps\n .map((ts, i) => {\n const open = quoteIndicators.open[i];\n const high = quoteIndicators.high[i];\n const low = quoteIndicators.low[i];\n const close = quoteIndicators.close[i];\n const volume = quoteIndicators.volume[i];\n const adjClose = adjCloseIndicators?.adjclose[i];\n\n // Skip bars with null/undefined OHLCV (Yahoo returns nulls for non-trading days)\n // Using == null to catch both null and undefined (noUncheckedIndexedAccess)\n if (open == null || high == null || low == null || close == null || volume == null) {\n return null;\n }\n\n const bar: HistoricalBar = {\n date: new Date(ts * 1_000),\n open,\n high,\n low,\n close,\n volume,\n ...(adjClose !== null && adjClose !== undefined ? { adjClose } : {}),\n ...(raw !== undefined ? { raw } : {}),\n };\n\n return bar;\n })\n .filter((bar): bar is HistoricalBar => bar !== null);\n}\n\n// ---------------------------------------------------------------------------\n// Company profile\n// ---------------------------------------------------------------------------\nexport function transformCompany(\n symbol: string,\n result: YahooQuoteSummaryResult,\n raw?: unknown,\n): CompanyProfile {\n const profile = result.assetProfile;\n const summary = result.summaryDetail;\n const price = result.price;\n\n const officers = profile?.companyOfficers ?? [];\n const ceo = officers.find((o) =>\n (o.title ?? \"\").toLowerCase().includes(\"chief executive\"),\n )?.name;\n\n return {\n symbol,\n name: price?.longName ?? price?.shortName ?? symbol,\n ...(profile?.longBusinessSummary !== undefined ? { description: profile.longBusinessSummary } : {}),\n ...(profile?.sector !== undefined ? { sector: profile.sector } : {}),\n ...(profile?.industry !== undefined ? { industry: profile.industry } : {}),\n ...(profile?.country !== undefined ? { country: profile.country } : {}),\n ...(profile?.fullTimeEmployees !== undefined ? { employees: profile.fullTimeEmployees } : {}),\n ...(profile?.website !== undefined ? { website: profile.website } : {}),\n ...(ceo !== undefined ? { ceo } : {}),\n ...(summary?.marketCap?.raw !== undefined ? { marketCap: summary.marketCap.raw } : {}),\n ...(summary?.trailingPE?.raw !== undefined ? { peRatio: summary.trailingPE.raw } : {}),\n ...(summary?.forwardPE?.raw !== undefined ? { forwardPE: summary.forwardPE.raw } : {}),\n ...(summary?.priceToBook?.raw !== undefined ? { priceToBook: summary.priceToBook.raw } : {}),\n ...(summary?.dividendYield?.raw !== undefined ? { dividendYield: summary.dividendYield.raw } : {}),\n ...(summary?.beta?.raw !== undefined ? { beta: summary.beta.raw } : {}),\n ...(price?.exchangeName !== undefined ? { exchange: price.exchangeName } : {}),\n ...(price?.currency !== undefined ? { currency: price.currency } : summary?.currency !== undefined ? { currency: summary.currency } : {}),\n provider: PROVIDER,\n ...(raw !== undefined ? { raw } : {}),\n };\n}\n\n// ---------------------------------------------------------------------------\n// Search\n// ---------------------------------------------------------------------------\nconst YAHOO_TYPE_MAP: Record<string, AssetType> = {\n EQUITY: \"stock\",\n ETF: \"etf\",\n CRYPTOCURRENCY: \"crypto\",\n CURRENCY: \"forex\",\n INDEX: \"index\",\n MUTUALFUND: \"mutual-fund\",\n FUTURE: \"future\",\n};\n\nexport function transformSearch(quote: YahooSearchQuote, raw?: unknown): SearchResult {\n const exchange = quote.exchDisp ?? quote.exchange;\n return {\n symbol: quote.symbol,\n name: quote.longname ?? quote.shortname ?? quote.symbol,\n type: YAHOO_TYPE_MAP[quote.quoteType?.toUpperCase() ?? \"\"] ?? \"unknown\",\n ...(exchange !== undefined ? { exchange } : {}),\n provider: PROVIDER,\n ...(raw !== undefined ? { raw } : {}),\n };\n}\n","import { ProviderError } from \"../../errors.js\";\nimport { HttpClient } from \"../../http/client.js\";\nimport type { CompanyOptions, CompanyProfile } from \"../../types/company.js\";\nimport type { HistoricalBar, HistoricalOptions } from \"../../types/historical.js\";\nimport type { MarketProvider } from \"../../types/provider.js\";\nimport type { Quote, QuoteOptions } from \"../../types/quote.js\";\nimport type { SearchOptions, SearchResult } from \"../../types/search.js\";\nimport { toYahooSymbol } from \"../../utils/symbol.js\";\nimport type {\n YahooChartResponse,\n YahooQuoteSummaryResponse,\n YahooSearchResponse,\n} from \"./types.js\";\nimport { transformCompany, transformHistorical, transformQuote, transformSearch } from \"./transform.js\";\n\nexport interface YahooProviderOptions {\n /** Request timeout in milliseconds. Defaults to 10 000. */\n timeoutMs?: number;\n /** Retry attempts on transient failures. Defaults to 2. */\n retries?: number;\n}\n\n/**\n * Yahoo Finance provider — no API key required.\n *\n * Uses the unofficial Yahoo Finance v8 chart API, which is free and publicly\n * accessible but not officially supported. Use respectfully.\n */\nexport class YahooProvider implements MarketProvider {\n readonly name = \"yahoo\";\n\n private readonly http1: HttpClient;\n private readonly http2: HttpClient;\n\n constructor(options: YahooProviderOptions = {}) {\n const shared = {\n ...(options.timeoutMs !== undefined ? { timeoutMs: options.timeoutMs } : {}),\n ...(options.retries !== undefined ? { retries: options.retries } : {}),\n headers: {\n \"Accept\": \"application/json\",\n \"Accept-Language\": \"en-US,en;q=0.9\",\n },\n };\n this.http1 = new HttpClient(\"yahoo\", {\n ...shared,\n baseUrl: \"https://query1.finance.yahoo.com\",\n });\n this.http2 = new HttpClient(\"yahoo\", {\n ...shared,\n baseUrl: \"https://query2.finance.yahoo.com\",\n });\n }\n\n // ---------------------------------------------------------------------------\n // Quote\n // ---------------------------------------------------------------------------\n async quote(symbols: string[], options?: QuoteOptions): Promise<Quote[]> {\n const results = await Promise.all(\n symbols.map((symbol) => this.fetchSingleQuote(symbol, options)),\n );\n return results;\n }\n\n private async fetchSingleQuote(symbol: string, options?: QuoteOptions): Promise<Quote> {\n const s = toYahooSymbol(symbol);\n const data = await this.http1.get<YahooChartResponse>(`/v8/finance/chart/${s}`, {\n params: {\n interval: \"1d\",\n range: \"1d\",\n includePrePost: false,\n },\n });\n\n const result = data.chart.result?.[0];\n if (!result) {\n const err = data.chart.error;\n throw new ProviderError(\n err?.description ?? `No data returned for symbol \"${s}\"`,\n this.name,\n );\n }\n\n return transformQuote(result, options?.raw ? data : undefined);\n }\n\n // ---------------------------------------------------------------------------\n // Historical\n // ---------------------------------------------------------------------------\n async historical(symbol: string, options?: HistoricalOptions): Promise<HistoricalBar[]> {\n const s = toYahooSymbol(symbol);\n const interval = options?.interval ?? \"1d\";\n\n const period1 = toEpoch(options?.period1 ?? subtractOneYear());\n const period2 = toEpoch(options?.period2 ?? new Date());\n\n const data = await this.http1.get<YahooChartResponse>(`/v8/finance/chart/${s}`, {\n params: {\n interval,\n period1,\n period2,\n events: \"div,splits\",\n includeAdjustedClose: true,\n },\n });\n\n const result = data.chart.result?.[0];\n if (!result) {\n const err = data.chart.error;\n throw new ProviderError(\n err?.description ?? `No historical data for symbol \"${s}\"`,\n this.name,\n );\n }\n\n return transformHistorical(result, options?.raw ? data : undefined);\n }\n\n // ---------------------------------------------------------------------------\n // Search\n // ---------------------------------------------------------------------------\n async search(query: string, options?: SearchOptions): Promise<SearchResult[]> {\n const limit = options?.limit ?? 10;\n\n const data = await this.http1.get<YahooSearchResponse>(\"/v1/finance/search\", {\n params: {\n q: query,\n quotesCount: limit,\n newsCount: 0,\n enableFuzzyQuery: false,\n enableEnhancedTrivialQuery: true,\n },\n });\n\n return (data.quotes ?? [])\n .slice(0, limit)\n .map((q) => transformSearch(q, options?.raw ? q : undefined));\n }\n\n // ---------------------------------------------------------------------------\n // Company\n // ---------------------------------------------------------------------------\n async company(symbol: string, options?: CompanyOptions): Promise<CompanyProfile> {\n const s = toYahooSymbol(symbol);\n\n const data = await this.http2.get<YahooQuoteSummaryResponse>(\n `/v10/finance/quoteSummary/${s}`,\n {\n params: {\n modules: \"assetProfile,summaryDetail,price\",\n },\n },\n );\n\n const result = data.quoteSummary.result?.[0];\n if (!result) {\n const err = data.quoteSummary.error;\n throw new ProviderError(\n err?.description ?? `No company data for symbol \"${s}\"`,\n this.name,\n );\n }\n\n return transformCompany(symbol, result, options?.raw ? data : undefined);\n }\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\nfunction toEpoch(date: string | Date): number {\n const d = date instanceof Date ? date : new Date(date);\n return Math.floor(d.getTime() / 1_000);\n}\n\nfunction subtractOneYear(): Date {\n const d = new Date();\n d.setFullYear(d.getFullYear() - 1);\n return d;\n}\n","import type { CacheConfig, CacheDriver, CacheMethod } from \"./cache/types.js\";\nimport { MemoryCacheDriver } from \"./cache/memory.js\";\nimport { YahooProvider } from \"./providers/yahoo/index.js\";\nimport { AllProvidersFailedError, MarketFeedError, UnsupportedOperationError } from \"./errors.js\";\nimport type { CompanyOptions, CompanyProfile } from \"./types/company.js\";\nimport type { HistoricalBar, HistoricalOptions } from \"./types/historical.js\";\nimport type { MarketStatus, MarketStatusOptions } from \"./types/market.js\";\nimport type { NewsItem, NewsOptions } from \"./types/news.js\";\nimport type { MarketProvider } from \"./types/provider.js\";\nimport type { Quote, QuoteOptions } from \"./types/quote.js\";\nimport type { SearchOptions, SearchResult } from \"./types/search.js\";\n\nexport interface MarketFeedOptions {\n /**\n * Ordered list of provider adapters.\n * When `fallback: true`, each is tried in order until one succeeds.\n * Defaults to `[new YahooProvider()]`.\n */\n providers?: MarketProvider[];\n /**\n * Cache configuration. Pass `false` to disable caching entirely.\n * Defaults to an in-memory LRU cache with 60s TTL.\n */\n cache?: CacheConfig | false;\n /**\n * When `true`, automatically tries the next provider if the current one fails.\n * Defaults to `true`.\n */\n fallback?: boolean;\n}\n\n// Default TTLs per method (seconds)\nconst DEFAULT_TTLS: Record<CacheMethod, number> = {\n quote: 60,\n historical: 3600,\n company: 86400,\n news: 300,\n search: 600,\n marketStatus: 60,\n};\n\n/**\n * The unified MarketFeed client.\n *\n * Wraps one or more provider adapters under a single consistent API.\n * Handles caching, fallback, and error aggregation transparently.\n *\n * @example\n * ```ts\n * import { MarketFeed } from 'market-feed';\n *\n * const feed = new MarketFeed();\n * const quote = await feed.quote('AAPL');\n * console.log(quote.price); // 189.84\n * ```\n */\nexport class MarketFeed {\n private readonly providers: MarketProvider[];\n private readonly cache: CacheDriver | null;\n private readonly fallback: boolean;\n private readonly ttls: Record<CacheMethod, number>;\n\n constructor(options: MarketFeedOptions = {}) {\n this.providers =\n options.providers && options.providers.length > 0\n ? options.providers\n : [new YahooProvider()];\n\n this.fallback = options.fallback ?? true;\n\n if (options.cache === false) {\n this.cache = null;\n } else {\n const cfg = options.cache ?? {};\n this.cache = cfg.driver ?? new MemoryCacheDriver(cfg.maxSize ?? 500);\n }\n\n const overrides = options.cache !== false ? (options.cache?.ttlOverrides ?? {}) : {};\n this.ttls = { ...DEFAULT_TTLS, ...overrides };\n }\n\n // ---------------------------------------------------------------------------\n // quote\n // ---------------------------------------------------------------------------\n\n /** Fetch a quote for a single symbol. */\n async quote(symbol: string, options?: QuoteOptions): Promise<Quote>;\n /** Fetch quotes for multiple symbols in parallel. */\n async quote(symbols: string[], options?: QuoteOptions): Promise<Quote[]>;\n async quote(\n symbolOrSymbols: string | string[],\n options?: QuoteOptions,\n ): Promise<Quote | Quote[]> {\n const isSingle = typeof symbolOrSymbols === \"string\";\n const symbols = isSingle ? [symbolOrSymbols] : symbolOrSymbols;\n\n const cacheKey = `quote:${symbols.join(\",\")}`;\n const cached = await this.getCache<Quote[]>(cacheKey);\n if (cached) return isSingle ? (cached[0] as Quote) : cached;\n\n const result = await this.withFallback(\n \"quote\",\n (provider) => provider.quote(symbols, options),\n );\n\n await this.setCache(cacheKey, result, \"quote\");\n return isSingle ? (result[0] as Quote) : result;\n }\n\n // ---------------------------------------------------------------------------\n // historical\n // ---------------------------------------------------------------------------\n\n async historical(symbol: string, options?: HistoricalOptions): Promise<HistoricalBar[]> {\n const interval = options?.interval ?? \"1d\";\n const p1 = normaliseDate(options?.period1);\n const p2 = normaliseDate(options?.period2 ?? new Date());\n const cacheKey = `historical:${symbol}:${interval}:${p1}:${p2}`;\n\n const cached = await this.getCache<HistoricalBar[]>(cacheKey);\n if (cached) return cached;\n\n const result = await this.withFallback(\n \"historical\",\n (provider) => provider.historical(symbol, options),\n );\n\n await this.setCache(cacheKey, result, \"historical\");\n return result;\n }\n\n // ---------------------------------------------------------------------------\n // search\n // ---------------------------------------------------------------------------\n\n async search(query: string, options?: SearchOptions): Promise<SearchResult[]> {\n const cacheKey = `search:${query}:${options?.limit ?? 10}`;\n const cached = await this.getCache<SearchResult[]>(cacheKey);\n if (cached) return cached;\n\n const result = await this.withFallback(\n \"search\",\n (provider) => provider.search(query, options),\n );\n\n await this.setCache(cacheKey, result, \"search\");\n return result;\n }\n\n // ---------------------------------------------------------------------------\n // company\n // ---------------------------------------------------------------------------\n\n async company(symbol: string, options?: CompanyOptions): Promise<CompanyProfile> {\n const cacheKey = `company:${symbol}`;\n const cached = await this.getCache<CompanyProfile>(cacheKey);\n if (cached) return cached;\n\n const result = await this.withFallback(\"company\", (provider) => {\n if (!provider.company) throw new UnsupportedOperationError(provider.name, \"company\");\n return provider.company(symbol, options);\n });\n\n await this.setCache(cacheKey, result, \"company\");\n return result;\n }\n\n // ---------------------------------------------------------------------------\n // news\n // ---------------------------------------------------------------------------\n\n async news(symbol: string, options?: NewsOptions): Promise<NewsItem[]> {\n const cacheKey = `news:${symbol}:${options?.limit ?? 10}`;\n const cached = await this.getCache<NewsItem[]>(cacheKey);\n if (cached) return cached;\n\n const result = await this.withFallback(\"news\", (provider) => {\n if (!provider.news) throw new UnsupportedOperationError(provider.name, \"news\");\n return provider.news(symbol, options);\n });\n\n await this.setCache(cacheKey, result, \"news\");\n return result;\n }\n\n // ---------------------------------------------------------------------------\n // marketStatus\n // ---------------------------------------------------------------------------\n\n async marketStatus(market?: string, options?: MarketStatusOptions): Promise<MarketStatus> {\n const cacheKey = `marketStatus:${market ?? \"default\"}`;\n const cached = await this.getCache<MarketStatus>(cacheKey);\n if (cached) return cached;\n\n const result = await this.withFallback(\"marketStatus\", (provider) => {\n if (!provider.marketStatus) {\n throw new UnsupportedOperationError(provider.name, \"marketStatus\");\n }\n return provider.marketStatus(market, options);\n });\n\n await this.setCache(cacheKey, result, \"marketStatus\");\n return result;\n }\n\n // ---------------------------------------------------------------------------\n // Cache management\n // ---------------------------------------------------------------------------\n\n /** Invalidate all cached entries. */\n async clearCache(): Promise<void> {\n await this.cache?.clear();\n }\n\n /** Invalidate a specific cache key (exact match). */\n async invalidate(key: string): Promise<void> {\n await this.cache?.delete(key);\n }\n\n // ---------------------------------------------------------------------------\n // Internal helpers\n // ---------------------------------------------------------------------------\n\n private async withFallback<T>(\n operation: string,\n fn: (provider: MarketProvider) => Promise<T>,\n ): Promise<T> {\n const errors: MarketFeedError[] = [];\n\n for (const provider of this.providers) {\n try {\n return await fn(provider);\n } catch (err) {\n if (err instanceof UnsupportedOperationError) {\n if (!this.fallback) throw err;\n errors.push(err);\n continue;\n }\n if (err instanceof MarketFeedError) {\n if (!this.fallback) throw err;\n errors.push(err);\n continue;\n }\n // Unknown error — wrap and rethrow\n throw err;\n }\n }\n\n throw new AllProvidersFailedError(errors, operation);\n }\n\n private async getCache<T>(key: string): Promise<T | undefined> {\n if (!this.cache) return undefined;\n return this.cache.get<T>(key);\n }\n\n private async setCache<T>(key: string, value: T, method: CacheMethod): Promise<void> {\n if (!this.cache) return;\n await this.cache.set(key, value, this.ttls[method]);\n }\n}\n\nfunction normaliseDate(d?: string | Date): string {\n if (!d) return \"\";\n const date = d instanceof Date ? d : new Date(d);\n return date.toISOString().slice(0, 10);\n}\n","import { RateLimitError } from \"../errors.js\";\n\n/**\n * Token-bucket rate limiter.\n *\n * Tokens refill at `refillRate` tokens per second up to `capacity`.\n * Call `consume()` before each API request; it throws `RateLimitError`\n * if the bucket is empty.\n */\nexport class RateLimiter {\n private tokens: number;\n private lastRefill: number; // epoch ms\n\n /**\n * @param providerName Used in error messages\n * @param capacity Maximum tokens in the bucket (= burst limit)\n * @param refillRate Tokens added per second\n */\n constructor(\n private readonly providerName: string,\n private readonly capacity: number,\n private readonly refillRate: number,\n ) {\n this.tokens = capacity;\n this.lastRefill = Date.now();\n }\n\n /**\n * Attempt to consume `count` tokens.\n * Throws `RateLimitError` if insufficient tokens are available.\n */\n consume(count = 1): void {\n this.refill();\n\n if (this.tokens < count) {\n // Calculate when enough tokens will be available\n const deficit = count - this.tokens;\n const waitSeconds = deficit / this.refillRate;\n const retryAfter = new Date(Date.now() + waitSeconds * 1_000);\n throw new RateLimitError(this.providerName, retryAfter);\n }\n\n this.tokens -= count;\n }\n\n /**\n * Returns true if at least `count` tokens are available without consuming them.\n */\n canConsume(count = 1): boolean {\n this.refill();\n return this.tokens >= count;\n }\n\n /** Milliseconds until the bucket has at least `count` tokens. 0 if already available. */\n waitTimeMs(count = 1): number {\n this.refill();\n if (this.tokens >= count) return 0;\n const deficit = count - this.tokens;\n return Math.ceil((deficit / this.refillRate) * 1_000);\n }\n\n private refill(): void {\n const now = Date.now();\n const elapsed = (now - this.lastRefill) / 1_000; // seconds\n const newTokens = elapsed * this.refillRate;\n this.tokens = Math.min(this.capacity, this.tokens + newTokens);\n this.lastRefill = now;\n }\n}\n","import type { CompanyProfile } from \"../../types/company.js\";\nimport type { HistoricalBar } from \"../../types/historical.js\";\nimport type { Quote } from \"../../types/quote.js\";\nimport type { AssetType, SearchResult } from \"../../types/search.js\";\nimport type { AVDailyAdjBar, AVGlobalQuote, AVOverviewResponse, AVSearchMatch } from \"./types.js\";\n\nconst PROVIDER = \"alpha-vantage\";\n\n// ---------------------------------------------------------------------------\n// Quote\n// ---------------------------------------------------------------------------\nexport function transformQuote(raw: AVGlobalQuote, includeRaw?: unknown): Quote {\n const price = parseFloat(raw[\"05. price\"]);\n const open = parseFloat(raw[\"02. open\"]);\n const high = parseFloat(raw[\"03. high\"]);\n const low = parseFloat(raw[\"04. low\"]);\n const previousClose = parseFloat(raw[\"08. previous close\"]);\n const change = parseFloat(raw[\"09. change\"]);\n const changePercent = parseFloat(raw[\"10. change percent\"].replace(\"%\", \"\"));\n const volume = parseInt(raw[\"06. volume\"], 10);\n const latestDay = raw[\"07. latest trading day\"];\n\n return {\n symbol: raw[\"01. symbol\"],\n name: raw[\"01. symbol\"],\n price,\n change,\n changePercent,\n open,\n high,\n low,\n close: price,\n previousClose,\n volume,\n currency: \"USD\", // AV free tier is USD only\n exchange: \"\",\n timestamp: new Date(`${latestDay}T16:00:00-05:00`),\n provider: PROVIDER,\n raw: includeRaw,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Historical bars\n// ---------------------------------------------------------------------------\nexport function transformHistoricalBars(\n timeSeries: Record<string, AVDailyAdjBar>,\n period1?: Date,\n period2?: Date,\n raw?: unknown,\n): HistoricalBar[] {\n return Object.entries(timeSeries)\n .filter(([dateStr]) => {\n const d = new Date(dateStr);\n if (period1 && d < period1) return false;\n if (period2 && d > period2) return false;\n return true;\n })\n .map(([dateStr, bar]): HistoricalBar => ({\n date: new Date(dateStr),\n open: parseFloat(bar[\"1. open\"]),\n high: parseFloat(bar[\"2. high\"]),\n low: parseFloat(bar[\"3. low\"]),\n close: parseFloat(bar[\"4. close\"]),\n adjClose: parseFloat(bar[\"5. adjusted close\"]),\n volume: parseInt(bar[\"6. volume\"], 10),\n ...(raw !== undefined ? { raw } : {}),\n }))\n .sort((a, b) => a.date.getTime() - b.date.getTime());\n}\n\n// ---------------------------------------------------------------------------\n// Search\n// ---------------------------------------------------------------------------\nconst AV_TYPE_MAP: Record<string, AssetType> = {\n equity: \"stock\",\n etf: \"etf\",\n \"mutual fund\": \"mutual-fund\",\n crypto: \"crypto\",\n forex: \"forex\",\n index: \"index\",\n};\n\nexport function transformSearch(match: AVSearchMatch, raw?: unknown): SearchResult {\n const rawType = match[\"3. type\"].toLowerCase();\n return {\n symbol: match[\"1. symbol\"],\n name: match[\"2. name\"],\n type: AV_TYPE_MAP[rawType] ?? \"unknown\",\n exchange: match[\"4. region\"],\n currency: match[\"8. currency\"],\n provider: PROVIDER,\n raw,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Company profile\n// ---------------------------------------------------------------------------\nexport function transformCompany(data: AVOverviewResponse, raw?: unknown): CompanyProfile {\n return {\n symbol: data.Symbol ?? \"\",\n name: data.Name ?? data.Symbol ?? \"\",\n ...(data.Description ? { description: data.Description } : {}),\n ...(data.Sector ? { sector: data.Sector } : {}),\n ...(data.Industry ? { industry: data.Industry } : {}),\n ...(data.Country ? { country: data.Country } : {}),\n ...(data.FullTimeEmployees ? { employees: parseInt(data.FullTimeEmployees, 10) } : {}),\n ...(data.OfficialSite ? { website: data.OfficialSite } : {}),\n ...(data.MarketCapitalization ? { marketCap: parseFloat(data.MarketCapitalization) } : {}),\n ...(data.TrailingPE ? { peRatio: parseFloat(data.TrailingPE) } : {}),\n ...(data.ForwardPE ? { forwardPE: parseFloat(data.ForwardPE) } : {}),\n ...(data.PriceToBookRatio ? { priceToBook: parseFloat(data.PriceToBookRatio) } : {}),\n ...(data.DividendYield ? { dividendYield: parseFloat(data.DividendYield) } : {}),\n ...(data.Beta ? { beta: parseFloat(data.Beta) } : {}),\n ...(data.Exchange ? { exchange: data.Exchange } : {}),\n ...(data.Currency ? { currency: data.Currency } : {}),\n ...(data.IPODate ? { ipoDate: new Date(data.IPODate) } : {}),\n provider: PROVIDER,\n ...(raw !== undefined ? { raw } : {}),\n };\n}\n","import { ProviderError, RateLimitError } from \"../../errors.js\";\nimport { HttpClient } from \"../../http/client.js\";\nimport { RateLimiter } from \"../../utils/rate-limiter.js\";\nimport { normalise } from \"../../utils/symbol.js\";\nimport type { CompanyOptions, CompanyProfile } from \"../../types/company.js\";\nimport type { HistoricalBar, HistoricalOptions } from \"../../types/historical.js\";\nimport type { MarketProvider } from \"../../types/provider.js\";\nimport type { Quote, QuoteOptions } from \"../../types/quote.js\";\nimport type { SearchOptions, SearchResult } from \"../../types/search.js\";\nimport type {\n AVGlobalQuoteResponse,\n AVOverviewResponse,\n AVSearchResponse,\n AVTimeSeriesDailyResponse,\n AVDailyAdjBar,\n} from \"./types.js\";\nimport {\n transformCompany,\n transformHistoricalBars,\n transformQuote,\n transformSearch,\n} from \"./transform.js\";\n\nexport interface AlphaVantageProviderOptions {\n apiKey: string;\n /** Request timeout in milliseconds. Defaults to 10 000. */\n timeoutMs?: number;\n /** Retry attempts on transient failures. Defaults to 2. */\n retries?: number;\n /**\n * Override the rate limiter.\n * Free tier: 5 calls/minute, 25 calls/day.\n * Premium tier: higher — set refillRate accordingly.\n */\n rateLimiter?: RateLimiter;\n}\n\n/**\n * Alpha Vantage provider.\n *\n * Free tier: 25 API calls/day, 5 calls/minute.\n * The rate limiter is enforced client-side to avoid burning your daily quota.\n */\nexport class AlphaVantageProvider implements MarketProvider {\n readonly name = \"alpha-vantage\";\n\n private readonly http: HttpClient;\n private readonly apiKey: string;\n private readonly limiter: RateLimiter;\n\n constructor(options: AlphaVantageProviderOptions) {\n this.apiKey = options.apiKey;\n this.http = new HttpClient(\"alpha-vantage\", {\n baseUrl: \"https://www.alphavantage.co\",\n ...(options.timeoutMs !== undefined ? { timeoutMs: options.timeoutMs } : {}),\n ...(options.retries !== undefined ? { retries: options.retries } : {}),\n });\n // Default: 5 requests/minute burst capacity\n this.limiter =\n options.rateLimiter ?? new RateLimiter(\"alpha-vantage\", 5, 5 / 60);\n }\n\n // ---------------------------------------------------------------------------\n // Quote — uses GLOBAL_QUOTE function\n // ---------------------------------------------------------------------------\n async quote(symbols: string[], options?: QuoteOptions): Promise<Quote[]> {\n // AV only supports single-symbol quote; batch sequentially\n const quotes: Quote[] = [];\n for (const symbol of symbols) {\n this.limiter.consume();\n quotes.push(await this.fetchSingleQuote(symbol, options));\n }\n return quotes;\n }\n\n private async fetchSingleQuote(symbol: string, options?: QuoteOptions): Promise<Quote> {\n const s = normalise(symbol);\n const data = await this.http.get<AVGlobalQuoteResponse>(\"/query\", {\n params: { function: \"GLOBAL_QUOTE\", symbol: s, apikey: this.apiKey },\n });\n\n this.checkRateLimit(data as Record<string, unknown>);\n\n const gq = data[\"Global Quote\"];\n if (!gq || !gq[\"01. symbol\"]) {\n throw new ProviderError(`No quote data returned for \"${s}\"`, this.name);\n }\n\n return transformQuote(gq, options?.raw ? data : undefined);\n }\n\n // ---------------------------------------------------------------------------\n // Historical — uses TIME_SERIES_DAILY_ADJUSTED\n // ---------------------------------------------------------------------------\n async historical(symbol: string, options?: HistoricalOptions): Promise<HistoricalBar[]> {\n this.limiter.consume();\n\n const s = normalise(symbol);\n const outputsize = \"full\"; // always fetch full; filter client-side\n\n const data = await this.http.get<AVTimeSeriesDailyResponse>(\"/query\", {\n params: {\n function: \"TIME_SERIES_DAILY_ADJUSTED\",\n symbol: s,\n outputsize,\n apikey: this.apiKey,\n },\n });\n\n this.checkRateLimit(data as Record<string, unknown>);\n\n const timeSeries = data[\"Time Series (Daily Adjusted)\"] ?? data[\"Time Series (Daily)\"];\n if (!timeSeries) {\n throw new ProviderError(`No historical data returned for \"${s}\"`, this.name);\n }\n\n const period1 = options?.period1\n ? new Date(options.period1)\n : (() => { const d = new Date(); d.setFullYear(d.getFullYear() - 1); return d; })();\n const period2 = options?.period2 ? new Date(options.period2) : new Date();\n\n return transformHistoricalBars(\n timeSeries as Record<string, AVDailyAdjBar>,\n period1,\n period2,\n options?.raw ? data : undefined,\n );\n }\n\n // ---------------------------------------------------------------------------\n // Search — uses SYMBOL_SEARCH\n // ---------------------------------------------------------------------------\n async search(query: string, options?: SearchOptions): Promise<SearchResult[]> {\n this.limiter.consume();\n\n const data = await this.http.get<AVSearchResponse>(\"/query\", {\n params: { function: \"SYMBOL_SEARCH\", keywords: query, apikey: this.apiKey },\n });\n\n this.checkRateLimit(data as Record<string, unknown>);\n\n const limit = options?.limit ?? 10;\n return (data.bestMatches ?? [])\n .slice(0, limit)\n .map((m) => transformSearch(m, options?.raw ? m : undefined));\n }\n\n // ---------------------------------------------------------------------------\n // Company — uses OVERVIEW\n // ---------------------------------------------------------------------------\n async company(symbol: string, options?: CompanyOptions): Promise<CompanyProfile> {\n this.limiter.consume();\n\n const s = normalise(symbol);\n const data = await this.http.get<AVOverviewResponse>(\"/query\", {\n params: { function: \"OVERVIEW\", symbol: s, apikey: this.apiKey },\n });\n\n this.checkRateLimit(data as Record<string, unknown>);\n\n if (!data.Symbol) {\n throw new ProviderError(`No company overview returned for \"${s}\"`, this.name);\n }\n\n return transformCompany(data, options?.raw ? data : undefined);\n }\n\n // ---------------------------------------------------------------------------\n // Internal\n // ---------------------------------------------------------------------------\n private checkRateLimit(data: Record<string, unknown>): void {\n const info = data[\"Information\"] as string | undefined;\n const note = data[\"Note\"] as string | undefined;\n const msg = info ?? note ?? \"\";\n if (msg.toLowerCase().includes(\"rate limit\") || msg.toLowerCase().includes(\"api call\")) {\n throw new RateLimitError(this.name);\n }\n }\n}\n","import type { CompanyProfile } from \"../../types/company.js\";\nimport type { HistoricalBar } from \"../../types/historical.js\";\nimport type { NewsItem } from \"../../types/news.js\";\nimport type { Quote } from \"../../types/quote.js\";\nimport type { AssetType, SearchResult } from \"../../types/search.js\";\nimport type {\n PolygonAggBar,\n PolygonNewsArticle,\n PolygonSnapshotTicker,\n PolygonTicker,\n PolygonTickerDetails,\n} from \"./types.js\";\n\nconst PROVIDER = \"polygon\";\n\n// ---------------------------------------------------------------------------\n// Quote\n// ---------------------------------------------------------------------------\nexport function transformQuote(ticker: PolygonSnapshotTicker, raw?: unknown): Quote {\n const day = ticker.day;\n const prev = ticker.prevDay;\n const price = ticker.lastTrade?.p ?? day.c;\n\n return {\n symbol: ticker.ticker,\n name: ticker.ticker,\n price,\n change: ticker.todaysChange,\n changePercent: ticker.todaysChangePerc,\n open: day.o,\n high: day.h,\n low: day.l,\n close: day.c,\n previousClose: prev.c,\n volume: day.v,\n currency: \"USD\",\n exchange: \"\",\n timestamp: new Date(ticker.updated / 1_000_000), // nanoseconds → ms\n provider: PROVIDER,\n raw,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Historical bars\n// ---------------------------------------------------------------------------\nexport function transformHistoricalBar(bar: PolygonAggBar, raw?: unknown): HistoricalBar {\n return {\n date: new Date(bar.t),\n open: bar.o,\n high: bar.h,\n low: bar.l,\n close: bar.c,\n volume: bar.v,\n ...(raw !== undefined ? { raw } : {}),\n };\n}\n\n// ---------------------------------------------------------------------------\n// Search\n// ---------------------------------------------------------------------------\nconst POLYGON_TYPE_MAP: Record<string, AssetType> = {\n CS: \"stock\",\n ETF: \"etf\",\n ETN: \"etf\",\n ETP: \"etf\",\n CRYPTO: \"crypto\",\n FX: \"forex\",\n CURRENCY: \"forex\",\n INDEX: \"index\",\n MF: \"mutual-fund\",\n FUND: \"mutual-fund\",\n WARRANT: \"unknown\",\n RIGHT: \"unknown\",\n ADRC: \"stock\",\n PFD: \"stock\",\n};\n\nexport function transformSearch(ticker: PolygonTicker, raw?: unknown): SearchResult {\n const type = ticker.type ? (POLYGON_TYPE_MAP[ticker.type.toUpperCase()] ?? \"unknown\") : \"unknown\";\n return {\n symbol: ticker.ticker,\n name: ticker.name,\n type,\n ...(ticker.primary_exchange ? { exchange: ticker.primary_exchange } : {}),\n ...(ticker.currency_name ? { currency: ticker.currency_name.toUpperCase() } : {}),\n provider: PROVIDER,\n ...(raw !== undefined ? { raw } : {}),\n };\n}\n\n// ---------------------------------------------------------------------------\n// Company profile\n// ---------------------------------------------------------------------------\nexport function transformCompany(details: PolygonTickerDetails, raw?: unknown): CompanyProfile {\n return {\n symbol: details.ticker,\n name: details.name,\n ...(details.description ? { description: details.description } : {}),\n ...(details.sic_description ? { sector: details.sic_description } : {}),\n ...(details.address?.country ? { country: details.address.country } : {}),\n ...(details.total_employees !== undefined ? { employees: details.total_employees } : {}),\n ...(details.homepage_url ? { website: details.homepage_url } : {}),\n ...(details.market_cap !== undefined ? { marketCap: details.market_cap } : {}),\n ...(details.primary_exchange ? { exchange: details.primary_exchange } : {}),\n ...(details.list_date ? { ipoDate: new Date(details.list_date) } : {}),\n provider: PROVIDER,\n ...(raw !== undefined ? { raw } : {}),\n };\n}\n\n// ---------------------------------------------------------------------------\n// News\n// ---------------------------------------------------------------------------\nexport function transformNews(article: PolygonNewsArticle, raw?: unknown): NewsItem {\n return {\n id: article.id,\n title: article.title,\n ...(article.description ? { summary: article.description } : {}),\n url: article.article_url,\n source: article.publisher?.name ?? \"unknown\",\n publishedAt: new Date(article.published_utc),\n symbols: article.tickers ?? [],\n ...(article.image_url ? { thumbnail: article.image_url } : {}),\n provider: PROVIDER,\n ...(raw !== undefined ? { raw } : {}),\n };\n}\n","import { ProviderError } from \"../../errors.js\";\nimport { HttpClient } from \"../../http/client.js\";\nimport { RateLimiter } from \"../../utils/rate-limiter.js\";\nimport { normalise } from \"../../utils/symbol.js\";\nimport type { CompanyOptions, CompanyProfile } from \"../../types/company.js\";\nimport type { HistoricalBar, HistoricalOptions } from \"../../types/historical.js\";\nimport type { NewsItem, NewsOptions } from \"../../types/news.js\";\nimport type { MarketProvider } from \"../../types/provider.js\";\nimport type { Quote, QuoteOptions } from \"../../types/quote.js\";\nimport type { SearchOptions, SearchResult } from \"../../types/search.js\";\nimport type {\n PolygonAggregatesResponse,\n PolygonNewsResponse,\n PolygonSnapshotResponse,\n PolygonTickerDetailsResponse,\n PolygonTickersResponse,\n} from \"./types.js\";\nimport {\n transformCompany,\n transformHistoricalBar,\n transformNews,\n transformQuote,\n transformSearch,\n} from \"./transform.js\";\n\nexport interface PolygonProviderOptions {\n apiKey: string;\n /** Request timeout in milliseconds. Defaults to 10 000. */\n timeoutMs?: number;\n /** Retry attempts on transient failures. Defaults to 2. */\n retries?: number;\n /**\n * Override the rate limiter.\n * Free tier: 5 calls/minute. Unlimited for paid plans.\n */\n rateLimiter?: RateLimiter;\n}\n\n/**\n * Polygon.io provider.\n *\n * Free tier provides 15-minute delayed data with 5 API calls per minute.\n * Paid plans unlock real-time data and higher rate limits.\n */\nexport class PolygonProvider implements MarketProvider {\n readonly name = \"polygon\";\n\n private readonly http: HttpClient;\n private readonly limiter: RateLimiter;\n\n constructor(private readonly options: PolygonProviderOptions) {\n this.http = new HttpClient(\"polygon\", {\n baseUrl: \"https://api.polygon.io\",\n ...(options.timeoutMs !== undefined ? { timeoutMs: options.timeoutMs } : {}),\n ...(options.retries !== undefined ? { retries: options.retries } : {}),\n headers: { Authorization: `Bearer ${options.apiKey}` },\n });\n // Free tier: 5 calls/minute\n this.limiter = options.rateLimiter ?? new RateLimiter(\"polygon\", 5, 5 / 60);\n }\n\n // ---------------------------------------------------------------------------\n // Quote — snapshot endpoint\n // ---------------------------------------------------------------------------\n async quote(symbols: string[], options?: QuoteOptions): Promise<Quote[]> {\n this.limiter.consume();\n\n const tickers = symbols.map(normalise).join(\",\");\n const data = await this.http.get<PolygonSnapshotResponse>(\n `/v2/snapshot/locale/us/markets/stocks/tickers`,\n { params: { tickers, apiKey: this.options.apiKey } },\n );\n\n this.assertSuccess(data as { status: string; error?: string });\n\n const tickerList = data.tickers ?? (data.ticker ? [data.ticker] : []);\n if (tickerList.length === 0) {\n throw new ProviderError(`No snapshot data for \"${tickers}\"`, this.name);\n }\n\n return tickerList.map((t) => transformQuote(t, options?.raw ? t : undefined));\n }\n\n // ---------------------------------------------------------------------------\n // Historical — aggregates endpoint\n // ---------------------------------------------------------------------------\n async historical(symbol: string, options?: HistoricalOptions): Promise<HistoricalBar[]> {\n this.limiter.consume();\n\n const s = normalise(symbol);\n const interval = options?.interval ?? \"1d\";\n const { multiplier, timespan } = parseInterval(interval);\n\n const period1 = toDateString(options?.period1 ?? subtractOneYear());\n const period2 = toDateString(options?.period2 ?? new Date());\n\n const data = await this.http.get<PolygonAggregatesResponse>(\n `/v2/aggs/ticker/${s}/range/${multiplier}/${timespan}/${period1}/${period2}`,\n {\n params: {\n adjusted: true,\n sort: \"asc\",\n limit: 50000,\n apiKey: this.options.apiKey,\n },\n },\n );\n\n this.assertSuccess(data as { status: string; error?: string });\n\n return (data.results ?? []).map((bar) =>\n transformHistoricalBar(bar, options?.raw ? bar : undefined),\n );\n }\n\n // ---------------------------------------------------------------------------\n // Search — reference tickers endpoint\n // ---------------------------------------------------------------------------\n async search(query: string, options?: SearchOptions): Promise<SearchResult[]> {\n this.limiter.consume();\n\n const limit = options?.limit ?? 10;\n const data = await this.http.get<PolygonTickersResponse>(\"/v3/reference/tickers\", {\n params: {\n search: query,\n active: true,\n limit,\n apiKey: this.options.apiKey,\n },\n });\n\n this.assertSuccess(data as { status: string; error?: string });\n\n return (data.results ?? []).map((t) => transformSearch(t, options?.raw ? t : undefined));\n }\n\n // ---------------------------------------------------------------------------\n // Company — ticker details v3\n // ---------------------------------------------------------------------------\n async company(symbol: string, options?: CompanyOptions): Promise<CompanyProfile> {\n this.limiter.consume();\n\n const s = normalise(symbol);\n const data = await this.http.get<PolygonTickerDetailsResponse>(\n `/v3/reference/tickers/${s}`,\n { params: { apiKey: this.options.apiKey } },\n );\n\n this.assertSuccess(data as { status: string; error?: string });\n\n if (!data.results) {\n throw new ProviderError(`No company data for \"${s}\"`, this.name);\n }\n\n return transformCompany(data.results, options?.raw ? data : undefined);\n }\n\n // ---------------------------------------------------------------------------\n // News — ticker news endpoint\n // ---------------------------------------------------------------------------\n async news(symbol: string, options?: NewsOptions): Promise<NewsItem[]> {\n this.limiter.consume();\n\n const s = normalise(symbol);\n const limit = options?.limit ?? 10;\n\n const data = await this.http.get<PolygonNewsResponse>(\"/v2/reference/news\", {\n params: {\n ticker: s,\n limit,\n order: \"desc\",\n sort: \"published_utc\",\n apiKey: this.options.apiKey,\n },\n });\n\n this.assertSuccess(data as { status: string; error?: string });\n\n return (data.results ?? []).map((a) => transformNews(a, options?.raw ? a : undefined));\n }\n\n // ---------------------------------------------------------------------------\n // Internal\n // ---------------------------------------------------------------------------\n private assertSuccess(response: { status: string; error?: string }): void {\n if (response.status === \"ERROR\" || response.error) {\n throw new ProviderError(\n response.error ?? `Polygon returned status \"${response.status}\"`,\n this.name,\n );\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Interval parsing helpers\n// ---------------------------------------------------------------------------\nfunction parseInterval(interval: string): { multiplier: number; timespan: string } {\n const map: Record<string, { multiplier: number; timespan: string }> = {\n \"1m\": { multiplier: 1, timespan: \"minute\" },\n \"2m\": { multiplier: 2, timespan: \"minute\" },\n \"5m\": { multiplier: 5, timespan: \"minute\" },\n \"15m\": { multiplier: 15, timespan: \"minute\" },\n \"30m\": { multiplier: 30, timespan: \"minute\" },\n \"60m\": { multiplier: 60, timespan: \"minute\" },\n \"1h\": { multiplier: 1, timespan: \"hour\" },\n \"1d\": { multiplier: 1, timespan: \"day\" },\n \"5d\": { multiplier: 5, timespan: \"day\" },\n \"1wk\": { multiplier: 1, timespan: \"week\" },\n \"1mo\": { multiplier: 1, timespan: \"month\" },\n \"3mo\": { multiplier: 3, timespan: \"month\" },\n };\n return map[interval] ?? { multiplier: 1, timespan: \"day\" };\n}\n\nfunction toDateString(date: string | Date): string {\n const d = date instanceof Date ? date : new Date(date);\n return d.toISOString().slice(0, 10);\n}\n\nfunction subtractOneYear(): Date {\n const d = new Date();\n d.setFullYear(d.getFullYear() - 1);\n return d;\n}\n"]}