@luisjpf/alpaca-sdk 0.2.1 → 0.2.7
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.
- package/README.md +2 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +5 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../core/src/errors.ts","../../core/src/auth.ts","../../core/src/client.ts","../../core/src/response.ts","../../trading/src/client.ts","../../market-data/src/client.ts","../../broker/src/client.ts","../../streaming/src/base-stream.ts","../../streaming/src/stock-stream.ts","../../streaming/src/crypto-stream.ts","../../streaming/src/trade-updates-stream.ts","../src/client.ts"],"sourcesContent":["/**\n * Typed error system for Alpaca SDK\n * Supports both class-based (instanceof) and discriminated union patterns\n */\n\n// =============================================================================\n// Error Type Constants (as const for type safety)\n// =============================================================================\n\nexport const ErrorType = {\n Authentication: 'authentication',\n Forbidden: 'forbidden',\n NotFound: 'not_found',\n Validation: 'validation',\n RateLimit: 'rate_limit',\n InsufficientFunds: 'insufficient_funds',\n MarketClosed: 'market_closed',\n Server: 'server',\n Unknown: 'unknown',\n} as const\n\nexport type ErrorType = (typeof ErrorType)[keyof typeof ErrorType]\n\n// =============================================================================\n// Discriminated Union Error Types (for Result pattern)\n// =============================================================================\n\ninterface BaseApiError {\n message: string\n code: number\n status: number\n requestId?: string\n}\n\nexport interface AuthenticationApiError extends BaseApiError {\n type: typeof ErrorType.Authentication\n status: 401\n}\n\nexport interface ForbiddenApiError extends BaseApiError {\n type: typeof ErrorType.Forbidden\n status: 403\n}\n\nexport interface NotFoundApiError extends BaseApiError {\n type: typeof ErrorType.NotFound\n status: 404\n}\n\nexport interface ValidationApiError extends BaseApiError {\n type: typeof ErrorType.Validation\n status: 422\n}\n\nexport interface RateLimitApiError extends BaseApiError {\n type: typeof ErrorType.RateLimit\n status: 429\n retryAfter?: number\n}\n\nexport interface InsufficientFundsApiError extends BaseApiError {\n type: typeof ErrorType.InsufficientFunds\n status: 403\n}\n\nexport interface MarketClosedApiError extends BaseApiError {\n type: typeof ErrorType.MarketClosed\n status: 403\n}\n\nexport interface ServerApiError extends BaseApiError {\n type: typeof ErrorType.Server\n status: number // 500+\n}\n\nexport interface UnknownApiError extends BaseApiError {\n type: typeof ErrorType.Unknown\n}\n\n/** Discriminated union of all API error types */\nexport type ApiError =\n | AuthenticationApiError\n | ForbiddenApiError\n | NotFoundApiError\n | ValidationApiError\n | RateLimitApiError\n | InsufficientFundsApiError\n | MarketClosedApiError\n | ServerApiError\n | UnknownApiError\n\n// =============================================================================\n// Result Type (for compile-time error handling)\n// =============================================================================\n\nexport type Result<T, E = ApiError> =\n | { ok: true; data: T; error?: never }\n | { ok: false; data?: never; error: E }\n\n/** Create a success result */\nexport function ok<T>(data: T): Result<T, never> {\n return { ok: true, data }\n}\n\n/** Create an error result */\nexport function err<E>(error: E): Result<never, E> {\n return { ok: false, error }\n}\n\n// =============================================================================\n// Error Classes (for instanceof pattern)\n// =============================================================================\n\n/** Base error class for all Alpaca errors */\nexport class AlpacaError extends Error {\n readonly type: ErrorType\n readonly code: number\n readonly status: number\n readonly requestId?: string\n\n constructor(message: string, type: ErrorType, code: number, status: number, requestId?: string) {\n super(message)\n this.name = 'AlpacaError'\n this.type = type\n this.code = code\n this.status = status\n this.requestId = requestId\n Object.setPrototypeOf(this, AlpacaError.prototype)\n }\n\n /** Convert to plain error object (for Result pattern) */\n toApiError(): ApiError {\n return {\n type: this.type,\n message: this.message,\n code: this.code,\n status: this.status,\n requestId: this.requestId,\n } as ApiError\n }\n}\n\n/** Authentication failed (401) */\nexport class AuthenticationError extends AlpacaError {\n declare readonly type: typeof ErrorType.Authentication\n declare readonly status: 401\n\n constructor(message: string, code: number, requestId?: string) {\n super(message, ErrorType.Authentication, code, 401, requestId)\n this.name = 'AuthenticationError'\n Object.setPrototypeOf(this, AuthenticationError.prototype)\n }\n}\n\n/** Forbidden - insufficient permissions (403) */\nexport class ForbiddenError extends AlpacaError {\n declare readonly type: typeof ErrorType.Forbidden\n declare readonly status: 403\n\n constructor(message: string, code: number, requestId?: string) {\n super(message, ErrorType.Forbidden, code, 403, requestId)\n this.name = 'ForbiddenError'\n Object.setPrototypeOf(this, ForbiddenError.prototype)\n }\n}\n\n/** Resource not found (404) */\nexport class NotFoundError extends AlpacaError {\n declare readonly type: typeof ErrorType.NotFound\n declare readonly status: 404\n\n constructor(message: string, code: number, requestId?: string) {\n super(message, ErrorType.NotFound, code, 404, requestId)\n this.name = 'NotFoundError'\n Object.setPrototypeOf(this, NotFoundError.prototype)\n }\n}\n\n/** Validation error (422) */\nexport class ValidationError extends AlpacaError {\n declare readonly type: typeof ErrorType.Validation\n declare readonly status: 422\n\n constructor(message: string, code: number, requestId?: string) {\n super(message, ErrorType.Validation, code, 422, requestId)\n this.name = 'ValidationError'\n Object.setPrototypeOf(this, ValidationError.prototype)\n }\n}\n\n/** Rate limit exceeded (429) */\nexport class RateLimitError extends AlpacaError {\n declare readonly type: typeof ErrorType.RateLimit\n declare readonly status: 429\n readonly retryAfter?: number\n\n constructor(message: string, code: number, requestId?: string, retryAfter?: number) {\n super(message, ErrorType.RateLimit, code, 429, requestId)\n this.name = 'RateLimitError'\n this.retryAfter = retryAfter\n Object.setPrototypeOf(this, RateLimitError.prototype)\n }\n\n override toApiError(): RateLimitApiError {\n return {\n type: ErrorType.RateLimit,\n message: this.message,\n code: this.code,\n status: 429,\n requestId: this.requestId,\n retryAfter: this.retryAfter,\n }\n }\n}\n\n/** Insufficient buying power */\nexport class InsufficientFundsError extends AlpacaError {\n declare readonly type: typeof ErrorType.InsufficientFunds\n declare readonly status: 403\n\n constructor(message: string, code: number, requestId?: string) {\n super(message, ErrorType.InsufficientFunds, code, 403, requestId)\n this.name = 'InsufficientFundsError'\n Object.setPrototypeOf(this, InsufficientFundsError.prototype)\n }\n}\n\n/** Market is closed */\nexport class MarketClosedError extends AlpacaError {\n declare readonly type: typeof ErrorType.MarketClosed\n declare readonly status: 403\n\n constructor(message: string, code: number, requestId?: string) {\n super(message, ErrorType.MarketClosed, code, 403, requestId)\n this.name = 'MarketClosedError'\n Object.setPrototypeOf(this, MarketClosedError.prototype)\n }\n}\n\n/** Internal server error (500+) */\nexport class ServerError extends AlpacaError {\n declare readonly type: typeof ErrorType.Server\n\n constructor(message: string, code: number, status: number, requestId?: string) {\n super(message, ErrorType.Server, code, status, requestId)\n this.name = 'ServerError'\n Object.setPrototypeOf(this, ServerError.prototype)\n }\n}\n\n/**\n * Feature not yet implemented (501)\n *\n * Used for features that are planned but not yet available,\n * such as WebSocket streaming in preview mode.\n */\nexport class NotImplementedError extends AlpacaError {\n readonly feature: string\n readonly docsUrl?: string\n\n constructor(feature: string, docsUrl?: string) {\n const message = docsUrl\n ? `${feature} is not yet implemented. See: ${docsUrl}`\n : `${feature} is not yet implemented. This feature is in development.`\n super(message, ErrorType.Unknown, 0, 501)\n this.name = 'NotImplementedError'\n this.feature = feature\n this.docsUrl = docsUrl\n Object.setPrototypeOf(this, NotImplementedError.prototype)\n }\n}\n\n// =============================================================================\n// Error Factory Functions\n// =============================================================================\n\n/**\n * Create appropriate error class instance from API response\n */\nexport function createAlpacaError(\n message: string,\n code: number,\n status: number,\n requestId?: string,\n retryAfter?: number\n): AlpacaError {\n switch (status) {\n case 401:\n return new AuthenticationError(message, code, requestId)\n case 403:\n if (message.toLowerCase().includes('insufficient')) {\n return new InsufficientFundsError(message, code, requestId)\n }\n if (message.toLowerCase().includes('market') && message.toLowerCase().includes('closed')) {\n return new MarketClosedError(message, code, requestId)\n }\n return new ForbiddenError(message, code, requestId)\n case 404:\n return new NotFoundError(message, code, requestId)\n case 422:\n return new ValidationError(message, code, requestId)\n case 429:\n return new RateLimitError(message, code, requestId, retryAfter)\n default:\n if (status >= 500) {\n return new ServerError(message, code, status, requestId)\n }\n return new AlpacaError(message, ErrorType.Unknown, code, status, requestId)\n }\n}\n\n/**\n * Create typed ApiError object from raw API response (for Result pattern)\n */\nexport function createApiError(\n message: string,\n code: number,\n status: number,\n requestId?: string,\n retryAfter?: number\n): ApiError {\n switch (status) {\n case 401:\n return { type: ErrorType.Authentication, message, code, status: 401, requestId }\n case 403:\n if (message.toLowerCase().includes('insufficient')) {\n return { type: ErrorType.InsufficientFunds, message, code, status: 403, requestId }\n }\n if (message.toLowerCase().includes('market') && message.toLowerCase().includes('closed')) {\n return { type: ErrorType.MarketClosed, message, code, status: 403, requestId }\n }\n return { type: ErrorType.Forbidden, message, code, status: 403, requestId }\n case 404:\n return { type: ErrorType.NotFound, message, code, status: 404, requestId }\n case 422:\n return { type: ErrorType.Validation, message, code, status: 422, requestId }\n case 429:\n return { type: ErrorType.RateLimit, message, code, status: 429, requestId, retryAfter }\n default:\n if (status >= 500) {\n return { type: ErrorType.Server, message, code, status, requestId }\n }\n return { type: ErrorType.Unknown, message, code, status, requestId }\n }\n}\n\n/**\n * Convert unknown error to typed ApiError\n */\nexport function toApiError(error: unknown): ApiError {\n if (error instanceof AlpacaError) {\n return error.toApiError()\n }\n\n if (error && typeof error === 'object') {\n const e = error as Record<string, unknown>\n const message = typeof e.message === 'string' ? e.message : 'Unknown error'\n const code = typeof e.code === 'number' ? e.code : 0\n const status = typeof e.status === 'number' ? e.status : 0\n const requestId = typeof e.requestId === 'string' ? e.requestId : undefined\n const retryAfter = typeof e.retryAfter === 'number' ? e.retryAfter : undefined\n\n return createApiError(message, code, status, requestId, retryAfter)\n }\n\n return {\n type: ErrorType.Unknown,\n message: error instanceof Error ? error.message : String(error),\n code: 0,\n status: 0,\n }\n}\n\n/**\n * Type guard to check if a value is an ApiError\n */\nexport function isApiError(value: unknown): value is ApiError {\n return (\n value !== null &&\n typeof value === 'object' &&\n 'type' in value &&\n 'message' in value &&\n 'code' in value &&\n 'status' in value\n )\n}\n\n/**\n * Type guards for specific error types\n */\nexport const isAuthenticationError = (e: ApiError): e is AuthenticationApiError =>\n e.type === ErrorType.Authentication\n\nexport const isRateLimitError = (e: ApiError): e is RateLimitApiError =>\n e.type === ErrorType.RateLimit\n\nexport const isNotFoundError = (e: ApiError): e is NotFoundApiError => e.type === ErrorType.NotFound\n\nexport const isValidationError = (e: ApiError): e is ValidationApiError =>\n e.type === ErrorType.Validation\n\nexport const isInsufficientFundsError = (e: ApiError): e is InsufficientFundsApiError =>\n e.type === ErrorType.InsufficientFunds\n\nexport const isMarketClosedError = (e: ApiError): e is MarketClosedApiError =>\n e.type === ErrorType.MarketClosed\n\nexport const isServerError = (e: ApiError): e is ServerApiError => e.type === ErrorType.Server\n","/**\n * Authentication strategies for Alpaca APIs\n */\n\n/**\n * Validates that a credential string is non-empty\n * @throws Error if the credential is empty or whitespace-only\n */\nfunction validateCredential(value: string, name: string): void {\n if (!value || typeof value !== 'string' || value.trim().length === 0) {\n throw new Error(`${name} cannot be empty`)\n }\n}\n\n/** Authentication headers for Trading/Market Data APIs */\nexport type ApiKeyAuth = {\n 'APCA-API-KEY-ID': string\n 'APCA-API-SECRET-KEY': string\n} & Record<string, string>\n\n/** Authentication header for Broker API (HTTP Basic) */\nexport type BasicAuth = {\n Authorization: string\n} & Record<string, string>\n\n/** Authentication header for OAuth */\nexport type OAuthAuth = {\n Authorization: string\n} & Record<string, string>\n\nexport type AuthHeaders = ApiKeyAuth | BasicAuth | OAuthAuth\n\n/**\n * Create API Key authentication headers\n * @throws Error if keyId or secretKey is empty\n */\nexport function createApiKeyAuth(keyId: string, secretKey: string): ApiKeyAuth {\n validateCredential(keyId, 'API Key ID')\n validateCredential(secretKey, 'Secret Key')\n return {\n 'APCA-API-KEY-ID': keyId,\n 'APCA-API-SECRET-KEY': secretKey,\n }\n}\n\n/**\n * Create HTTP Basic authentication header for Broker API\n * @throws Error if keyId or secretKey is empty\n */\nexport function createBasicAuth(keyId: string, secretKey: string): BasicAuth {\n validateCredential(keyId, 'API Key ID')\n validateCredential(secretKey, 'Secret Key')\n const credentials = btoa(`${keyId}:${secretKey}`)\n return {\n Authorization: `Basic ${credentials}`,\n }\n}\n\n/**\n * Create OAuth Bearer token header\n * @throws Error if token is empty\n */\nexport function createOAuthAuth(token: string): OAuthAuth {\n validateCredential(token, 'OAuth token')\n return {\n Authorization: `Bearer ${token}`,\n }\n}\n\n/**\n * WebSocket authentication message\n */\nexport interface WebSocketAuthMessage {\n action: 'auth'\n key: string\n secret: string\n}\n\n/**\n * Create WebSocket authentication message\n * @throws Error if keyId or secretKey is empty\n */\nexport function createWebSocketAuth(keyId: string, secretKey: string): WebSocketAuthMessage {\n validateCredential(keyId, 'API Key ID')\n validateCredential(secretKey, 'Secret Key')\n return {\n action: 'auth',\n key: keyId,\n secret: secretKey,\n }\n}\n\n/**\n * Create WebSocket OAuth authentication message\n * @throws Error if token is empty\n */\nexport function createWebSocketOAuth(token: string): WebSocketAuthMessage {\n validateCredential(token, 'OAuth token')\n return {\n action: 'auth',\n key: 'oauth',\n secret: token,\n }\n}\n","/**\n * Base HTTP client for Alpaca SDK\n */\n\nimport type { AlpacaConfig, ResolvedAlpacaConfig, RequestOptions } from './types'\nimport { createAlpacaError, AlpacaError } from './errors'\nimport { createApiKeyAuth, createBasicAuth } from './auth'\nimport type { AuthHeaders } from './auth'\n\n/** Base URLs for Alpaca APIs */\nexport const ALPACA_URLS = {\n trading: {\n paper: 'https://paper-api.alpaca.markets',\n live: 'https://api.alpaca.markets',\n },\n broker: {\n sandbox: 'https://broker-api.sandbox.alpaca.markets',\n live: 'https://broker-api.alpaca.markets',\n },\n marketData: 'https://data.alpaca.markets',\n stream: {\n data: 'wss://stream.data.alpaca.markets',\n trading: {\n paper: 'wss://paper-api.alpaca.markets/stream',\n live: 'wss://api.alpaca.markets/stream',\n },\n },\n} as const\n\n/** Default configuration values */\nconst DEFAULT_CONFIG = {\n paper: true,\n timeout: 30_000,\n maxRetries: 2,\n} as const\n\n/** Maximum retry backoff in milliseconds (5 minutes) to prevent DoS via malicious retry-after headers */\nconst MAX_RETRY_BACKOFF_MS = 5 * 60 * 1000\n\n/**\n * Resolve configuration with defaults\n */\nexport function resolveConfig(\n config: AlpacaConfig,\n apiType: 'trading' | 'broker' | 'marketData'\n): ResolvedAlpacaConfig {\n const paper = config.paper ?? DEFAULT_CONFIG.paper\n\n let baseUrl: string\n if (config.baseUrl) {\n baseUrl = config.baseUrl\n } else if (apiType === 'trading') {\n baseUrl = paper ? ALPACA_URLS.trading.paper : ALPACA_URLS.trading.live\n } else if (apiType === 'broker') {\n baseUrl = paper ? ALPACA_URLS.broker.sandbox : ALPACA_URLS.broker.live\n } else {\n baseUrl = ALPACA_URLS.marketData\n }\n\n return {\n keyId: config.keyId,\n secretKey: config.secretKey,\n paper,\n timeout: config.timeout ?? DEFAULT_CONFIG.timeout,\n maxRetries: config.maxRetries ?? DEFAULT_CONFIG.maxRetries,\n baseUrl,\n }\n}\n\n/**\n * Sleep utility for retry backoff\n */\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms))\n}\n\n/**\n * Calculate exponential backoff with jitter\n */\nfunction calculateBackoff(attempt: number, baseMs = 1000): number {\n const exponential = Math.min(baseMs * Math.pow(2, attempt), 30_000)\n const jitter = Math.random() * 1000\n return exponential + jitter\n}\n\n/**\n * Check if error is retryable\n */\nfunction isRetryable(status: number): boolean {\n return status === 429 || status >= 500\n}\n\ninterface AlpacaApiError {\n code: number\n message: string\n}\n\n/**\n * Base fetch client with retry logic\n */\nexport async function fetchWithRetry<T>(\n url: string,\n init: RequestInit,\n config: ResolvedAlpacaConfig,\n options?: RequestOptions\n): Promise<T> {\n const timeout = options?.timeout ?? config.timeout\n let lastError: AlpacaError | null = null\n\n for (let attempt = 0; attempt <= config.maxRetries; attempt++) {\n const controller = new AbortController()\n const timeoutId = setTimeout(() => {\n controller.abort()\n }, timeout)\n\n // Combine signals if user provided one\n const signal = options?.signal\n ? AbortSignal.any([options.signal, controller.signal])\n : controller.signal\n\n try {\n const response = await fetch(url, {\n ...init,\n signal,\n })\n\n clearTimeout(timeoutId)\n\n const requestId = response.headers.get('x-request-id') ?? undefined\n\n if (!response.ok) {\n const retryAfter = response.headers.get('retry-after')\n const retryAfterMs = retryAfter ? parseInt(retryAfter, 10) * 1000 : undefined\n\n let errorBody: AlpacaApiError\n try {\n errorBody = (await response.json()) as AlpacaApiError\n } catch (parseError) {\n // Only handle JSON parse errors (non-JSON responses like HTML error pages)\n // Re-throw other errors (network issues, memory errors, etc.)\n if (parseError instanceof SyntaxError) {\n errorBody = { code: 0, message: response.statusText }\n } else {\n throw parseError\n }\n }\n\n const error = createAlpacaError(\n errorBody.message,\n errorBody.code,\n response.status,\n requestId,\n retryAfterMs ? retryAfterMs / 1000 : undefined\n )\n\n if (isRetryable(response.status) && attempt < config.maxRetries) {\n lastError = error\n // Cap backoff to prevent DoS via malicious retry-after headers\n const rawBackoff = retryAfterMs ?? calculateBackoff(attempt)\n const backoff = Math.min(rawBackoff, MAX_RETRY_BACKOFF_MS)\n await sleep(backoff)\n continue\n }\n\n throw error\n }\n\n // Handle empty responses (204 No Content)\n // Note: Callers expecting 204 responses should type T to include undefined,\n // or use this function only for endpoints that don't return 204.\n if (response.status === 204) {\n return undefined as unknown as T\n }\n\n return (await response.json()) as T\n } catch (error) {\n clearTimeout(timeoutId)\n\n if (error instanceof AlpacaError) {\n throw error\n }\n\n if (error instanceof Error && error.name === 'AbortError') {\n throw new AlpacaError('Request timeout', 'unknown', 0, 408)\n }\n\n throw new AlpacaError(\n error instanceof Error ? error.message : 'Unknown error',\n 'unknown',\n 0,\n 0\n )\n }\n }\n\n throw lastError ?? new AlpacaError('Max retries exceeded', 'unknown', 0, 0)\n}\n\n/**\n * Create headers for API request\n */\nexport function createHeaders(auth: AuthHeaders, options?: RequestOptions): Record<string, string> {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n ...auth,\n }\n\n if (options?.idempotencyKey) {\n headers['Idempotency-Key'] = options.idempotencyKey\n }\n\n return headers\n}\n\n/**\n * Create a configured fetch function for a specific API\n */\nexport function createApiFetch(\n config: ResolvedAlpacaConfig,\n authType: 'apiKey' | 'basic' = 'apiKey'\n) {\n const auth =\n authType === 'basic'\n ? createBasicAuth(config.keyId, config.secretKey)\n : createApiKeyAuth(config.keyId, config.secretKey)\n\n return async function apiFetch<T>(\n path: string,\n init: RequestInit = {},\n options?: RequestOptions\n ): Promise<T> {\n const url = `${config.baseUrl}${path}`\n const headers = createHeaders(auth, options)\n\n return fetchWithRetry<T>(\n url,\n {\n ...init,\n headers: {\n ...headers,\n ...(init.headers as Record<string, string> | undefined),\n },\n },\n config,\n options\n )\n }\n}\n","/**\n * Response unwrap helpers for openapi-fetch responses\n *\n * These helpers provide type-safe error handling by:\n * 1. Converting openapi-fetch errors to AlpacaError instances\n * 2. Extracting request metadata (requestId, retryAfter) from headers\n * 3. Throwing explicit errors for unexpected null data\n */\n\nimport { createAlpacaError, AlpacaError } from './errors'\n\n/**\n * Response shape from openapi-fetch\n */\nexport interface OpenApiFetchResponse<T> {\n data?: T\n error?: unknown\n response: Response\n}\n\n/**\n * Error object shape from Alpaca API\n */\ninterface AlpacaApiErrorBody {\n message?: string\n code?: number\n}\n\n/**\n * Creates an AlpacaError from an openapi-fetch error response\n */\nfunction createAlpacaErrorFromResponse(error: unknown, response: Response): AlpacaError {\n const requestId = response.headers.get('x-request-id') ?? undefined\n const retryAfterHeader = response.headers.get('retry-after')\n const retryAfter = retryAfterHeader ? parseInt(retryAfterHeader, 10) : undefined\n\n // Extract error details from the error object\n const errorObj = error as AlpacaApiErrorBody\n const message = errorObj?.message ?? 'Unknown API error'\n const code = errorObj?.code ?? 0\n const status = response.status\n\n return createAlpacaError(message, code, status, requestId, retryAfter)\n}\n\n/**\n * Unwraps an openapi-fetch response, converting errors to AlpacaError.\n *\n * Use this for endpoints that return a single object.\n * Throws if data is null/undefined (unexpected empty response).\n *\n * @example\n * ```typescript\n * const result = await client.GET('/v2/account', { signal })\n * return unwrap(result)\n * ```\n */\nexport function unwrap<T>(result: OpenApiFetchResponse<T>): T {\n if (result.error) {\n throw createAlpacaErrorFromResponse(result.error, result.response)\n }\n\n if (result.data === undefined || result.data === null) {\n throw new AlpacaError(\n 'Unexpected empty response from API',\n 'unknown',\n 0,\n result.response.status\n )\n }\n\n return result.data\n}\n\n/**\n * Unwraps an openapi-fetch response for list endpoints.\n *\n * Returns empty array if data is null/undefined (common for empty results).\n * This is intentional - list endpoints often return null for empty results.\n *\n * @example\n * ```typescript\n * const result = await client.GET('/v2/orders', { params: { query: params } })\n * return unwrapList(result)\n * ```\n */\nexport function unwrapList<T>(result: OpenApiFetchResponse<T[] | null>): T[] {\n if (result.error) {\n throw createAlpacaErrorFromResponse(result.error, result.response)\n }\n\n return result.data ?? []\n}\n\n/**\n * Unwraps an openapi-fetch response, allowing undefined data.\n *\n * Use this for endpoints where null/undefined is a valid response\n * (e.g., optional resources, 204 No Content).\n *\n * @example\n * ```typescript\n * const result = await client.GET('/v2/optional-resource', { signal })\n * return unwrapOptional(result) // T | undefined\n * ```\n */\nexport function unwrapOptional<T>(result: OpenApiFetchResponse<T>): T | undefined {\n if (result.error) {\n throw createAlpacaErrorFromResponse(result.error, result.response)\n }\n\n return result.data\n}\n","/**\n * Trading API client factory\n */\n\nimport createClient from 'openapi-fetch'\nimport {\n type AlpacaConfig,\n resolveConfig,\n createApiKeyAuth,\n type RequestOptions,\n unwrap,\n unwrapList,\n unwrapOptional,\n} from '@luisjpf/core'\nimport type { paths, components, operations } from './generated/trading-api'\n\n// Re-export schema types for consumers\nexport type Account = components['schemas']['Account']\nexport type Order = components['schemas']['Order']\nexport type Position = components['schemas']['Position']\nexport type Clock = components['schemas']['Clock']\nexport type Calendar = components['schemas']['Calendar']\nexport type Watchlist = components['schemas']['Watchlist']\nexport type PortfolioHistory = components['schemas']['PortfolioHistory']\nexport type AccountConfigurations = components['schemas']['AccountConfigurations']\n\n// Asset type from the Assets schema\nexport type Asset = components['schemas']['Assets']\n\n// Activity types - union of trading and non-trade activities\nexport type TradingActivity = components['schemas']['TradingActivities']\nexport type NonTradeActivity = components['schemas']['NonTradeActivities']\nexport type AccountActivity = TradingActivity | NonTradeActivity\n\n// Order-related types\nexport type OrderSide = components['schemas']['OrderSide']\nexport type OrderType = components['schemas']['OrderType']\nexport type TimeInForce = components['schemas']['TimeInForce']\nexport type OrderClass = components['schemas']['OrderClass']\n\n// Derive OrderRequest from the POST /v2/orders operation\nexport type OrderRequest = NonNullable<\n operations['postOrder']['requestBody']\n>['content']['application/json']\n\n// Derive PatchOrderRequest from schema\nexport type PatchOrderRequest = components['schemas']['PatchOrderRequest']\n\nexport type TradingClientConfig = AlpacaConfig\n\n/**\n * Create a Trading API client\n */\nexport function createTradingClient(config: TradingClientConfig) {\n const resolvedConfig = resolveConfig(config, 'trading')\n const auth = createApiKeyAuth(resolvedConfig.keyId, resolvedConfig.secretKey)\n\n const client = createClient<paths>({\n baseUrl: resolvedConfig.baseUrl,\n headers: auth,\n })\n\n return {\n /** Raw openapi-fetch client for advanced usage */\n raw: client,\n\n /** Account operations */\n account: {\n /** Get account information */\n async get(options?: RequestOptions) {\n return unwrap(\n await client.GET('/v2/account', {\n signal: options?.signal,\n })\n )\n },\n\n /** Get account configurations */\n async getConfigurations(options?: RequestOptions) {\n return unwrap(\n await client.GET('/v2/account/configurations', {\n signal: options?.signal,\n })\n )\n },\n\n /** Update account configurations */\n async updateConfigurations(\n updates: Partial<AccountConfigurations>,\n options?: RequestOptions\n ) {\n return unwrap(\n await client.PATCH('/v2/account/configurations', {\n body: updates,\n signal: options?.signal,\n })\n )\n },\n\n /** Get account activities */\n async getActivities(\n params?: operations['getAccountActivities']['parameters']['query'],\n options?: RequestOptions\n ) {\n return unwrapList(\n await client.GET('/v2/account/activities', {\n params: { query: params },\n signal: options?.signal,\n })\n )\n },\n\n /** Get portfolio history */\n async getPortfolioHistory(\n params?: operations['getAccountPortfolioHistory']['parameters']['query'],\n options?: RequestOptions\n ) {\n return unwrap(\n await client.GET('/v2/account/portfolio/history', {\n params: { query: params },\n signal: options?.signal,\n })\n )\n },\n },\n\n /** Order operations */\n orders: {\n /** List all orders */\n async list(\n params?: operations['getAllOrders']['parameters']['query'],\n options?: RequestOptions\n ) {\n return unwrapList(\n await client.GET('/v2/orders', {\n params: { query: params },\n signal: options?.signal,\n })\n )\n },\n\n /** Get order by ID */\n async get(orderId: string, options?: RequestOptions) {\n return unwrap(\n await client.GET('/v2/orders/{order_id}', {\n params: { path: { order_id: orderId } },\n signal: options?.signal,\n })\n )\n },\n\n /** Get order by client order ID */\n async getByClientOrderId(clientOrderId: string, options?: RequestOptions) {\n return unwrap(\n await client.GET('/v2/orders:by_client_order_id', {\n params: { query: { client_order_id: clientOrderId } },\n signal: options?.signal,\n })\n )\n },\n\n /** Create a new order */\n async create(order: OrderRequest, options?: RequestOptions) {\n return unwrap(\n await client.POST('/v2/orders', {\n body: order,\n signal: options?.signal,\n })\n )\n },\n\n /** Replace an existing order */\n async replace(orderId: string, updates: PatchOrderRequest, options?: RequestOptions) {\n return unwrap(\n await client.PATCH('/v2/orders/{order_id}', {\n params: { path: { order_id: orderId } },\n body: updates,\n signal: options?.signal,\n })\n )\n },\n\n /** Cancel an order */\n async cancel(orderId: string, options?: RequestOptions) {\n unwrapOptional(\n await client.DELETE('/v2/orders/{order_id}', {\n params: { path: { order_id: orderId } },\n signal: options?.signal,\n })\n )\n },\n\n /** Cancel all open orders */\n async cancelAll(options?: RequestOptions) {\n return unwrapList(\n await client.DELETE('/v2/orders', {\n signal: options?.signal,\n })\n )\n },\n },\n\n /** Position operations */\n positions: {\n /** List all open positions */\n async list(options?: RequestOptions) {\n return unwrapList(\n await client.GET('/v2/positions', {\n signal: options?.signal,\n })\n )\n },\n\n /** Get position by symbol or asset ID */\n async get(symbolOrAssetId: string, options?: RequestOptions) {\n return unwrap(\n await client.GET('/v2/positions/{symbol_or_asset_id}', {\n params: { path: { symbol_or_asset_id: symbolOrAssetId } },\n signal: options?.signal,\n })\n )\n },\n\n /** Close a position */\n async close(\n symbolOrAssetId: string,\n params?: operations['deleteOpenPosition']['parameters']['query'],\n options?: RequestOptions\n ) {\n return unwrap(\n await client.DELETE('/v2/positions/{symbol_or_asset_id}', {\n params: {\n path: { symbol_or_asset_id: symbolOrAssetId },\n query: params,\n },\n signal: options?.signal,\n })\n )\n },\n\n /** Close all positions */\n async closeAll(\n params?: operations['deleteAllOpenPositions']['parameters']['query'],\n options?: RequestOptions\n ) {\n return unwrapList(\n await client.DELETE('/v2/positions', {\n params: { query: params },\n signal: options?.signal,\n })\n )\n },\n },\n\n /** Asset operations */\n assets: {\n /** List all assets */\n async list(\n params?: operations['get-v2-assets']['parameters']['query'],\n options?: RequestOptions\n ) {\n return unwrapList(\n await client.GET('/v2/assets', {\n params: { query: params },\n signal: options?.signal,\n })\n )\n },\n\n /** Get asset by symbol or ID */\n async get(symbolOrAssetId: string, options?: RequestOptions) {\n return unwrap(\n await client.GET('/v2/assets/{symbol_or_asset_id}', {\n params: { path: { symbol_or_asset_id: symbolOrAssetId } },\n signal: options?.signal,\n })\n )\n },\n },\n\n /** Clock operations */\n clock: {\n /** Get market clock */\n async get(options?: RequestOptions) {\n return unwrap(\n await client.GET('/v2/clock', {\n signal: options?.signal,\n })\n )\n },\n },\n\n /** Calendar operations */\n calendar: {\n /** Get market calendar */\n async get(\n params?: operations['getCalendar']['parameters']['query'],\n options?: RequestOptions\n ) {\n return unwrapList(\n await client.GET('/v2/calendar', {\n params: { query: params },\n signal: options?.signal,\n })\n )\n },\n },\n\n /** Watchlist operations */\n watchlists: {\n /** List all watchlists */\n async list(options?: RequestOptions) {\n return unwrapList(\n await client.GET('/v2/watchlists', {\n signal: options?.signal,\n })\n )\n },\n\n /** Get watchlist by ID */\n async get(watchlistId: string, options?: RequestOptions) {\n return unwrap(\n await client.GET('/v2/watchlists/{watchlist_id}', {\n params: { path: { watchlist_id: watchlistId } },\n signal: options?.signal,\n })\n )\n },\n\n /** Create a new watchlist */\n async create(params: { name: string; symbols?: string[] }, options?: RequestOptions) {\n return unwrap(\n await client.POST('/v2/watchlists', {\n body: { name: params.name, symbols: params.symbols ?? [] },\n signal: options?.signal,\n })\n )\n },\n\n /** Update a watchlist */\n async update(\n watchlistId: string,\n params: { name: string; symbols?: string[] },\n options?: RequestOptions\n ) {\n return unwrap(\n await client.PUT('/v2/watchlists/{watchlist_id}', {\n params: { path: { watchlist_id: watchlistId } },\n body: { name: params.name, symbols: params.symbols ?? [] },\n signal: options?.signal,\n })\n )\n },\n\n /** Add symbol to watchlist */\n async addSymbol(watchlistId: string, symbol: string, options?: RequestOptions) {\n return unwrap(\n await client.POST('/v2/watchlists/{watchlist_id}', {\n params: { path: { watchlist_id: watchlistId } },\n body: { symbol },\n signal: options?.signal,\n })\n )\n },\n\n /** Remove symbol from watchlist */\n async removeSymbol(watchlistId: string, symbol: string, options?: RequestOptions) {\n return unwrap(\n await client.DELETE('/v2/watchlists/{watchlist_id}/{symbol}', {\n params: { path: { watchlist_id: watchlistId, symbol } },\n signal: options?.signal,\n })\n )\n },\n\n /** Delete a watchlist */\n async delete(watchlistId: string, options?: RequestOptions) {\n unwrapOptional(\n await client.DELETE('/v2/watchlists/{watchlist_id}', {\n params: { path: { watchlist_id: watchlistId } },\n signal: options?.signal,\n })\n )\n },\n },\n }\n}\n\n/** Type inference helper for the trading client */\nexport type TradingClient = ReturnType<typeof createTradingClient>\n","/**\n * Market Data API client factory\n */\n\nimport createClient from 'openapi-fetch'\nimport {\n type AlpacaConfig,\n resolveConfig,\n createApiKeyAuth,\n type RequestOptions,\n unwrap,\n} from '@luisjpf/core'\nimport type { paths, components, operations } from './generated/market-data-api'\n\n// Stock data types\nexport type StockBar = components['schemas']['stock_bar']\nexport type StockTrade = components['schemas']['stock_trade']\nexport type StockQuote = components['schemas']['stock_quote']\nexport type StockSnapshot = components['schemas']['stock_snapshot']\nexport type StockAuction = components['schemas']['stock_auction']\n\n// Crypto data types\nexport type CryptoBar = components['schemas']['crypto_bar']\nexport type CryptoTrade = components['schemas']['crypto_trade']\nexport type CryptoQuote = components['schemas']['crypto_quote']\nexport type CryptoSnapshot = components['schemas']['crypto_snapshot']\nexport type CryptoOrderbook = components['schemas']['crypto_orderbook']\n\n// Options data types\nexport type OptionBar = components['schemas']['option_bar']\nexport type OptionTrade = components['schemas']['option_trade']\nexport type OptionQuote = components['schemas']['option_quote']\nexport type OptionSnapshot = components['schemas']['option_snapshot']\nexport type OptionGreeks = components['schemas']['option_greeks']\n\n// News types\nexport type News = components['schemas']['news']\nexport type NewsImage = components['schemas']['news_image']\n\n// Screener types\nexport type MostActive = components['schemas']['most_active']\nexport type Mover = components['schemas']['mover']\n\n// Corporate actions\nexport type CorporateActions = components['schemas']['corporate_actions']\n\nexport type MarketDataClientConfig = AlpacaConfig\n\n/**\n * Create a Market Data API client\n */\nexport function createMarketDataClient(config: MarketDataClientConfig) {\n const resolvedConfig = resolveConfig(config, 'marketData')\n const auth = createApiKeyAuth(resolvedConfig.keyId, resolvedConfig.secretKey)\n\n const client = createClient<paths>({\n baseUrl: resolvedConfig.baseUrl,\n headers: auth,\n })\n\n return {\n /** Raw openapi-fetch client for advanced usage */\n raw: client,\n\n /** Stock market data operations */\n stocks: {\n /** Get historical bars for multiple symbols */\n async getBars(\n params: operations['StockBars']['parameters']['query'],\n options?: RequestOptions\n ) {\n return unwrap(\n await client.GET('/v2/stocks/bars', {\n params: { query: params },\n signal: options?.signal,\n })\n )\n },\n\n /** Get historical bars for a single symbol */\n async getSymbolBars(\n symbol: string,\n params: NonNullable<operations['StockBarSingle']['parameters']['query']>,\n options?: RequestOptions\n ) {\n return unwrap(\n await client.GET('/v2/stocks/{symbol}/bars', {\n params: { path: { symbol }, query: params },\n signal: options?.signal,\n })\n )\n },\n\n /** Get latest bars for multiple symbols */\n async getLatestBars(\n params: operations['StockLatestBars']['parameters']['query'],\n options?: RequestOptions\n ) {\n return unwrap(\n await client.GET('/v2/stocks/bars/latest', {\n params: { query: params },\n signal: options?.signal,\n })\n )\n },\n\n /** Get latest bar for a single symbol */\n async getLatestBar(\n symbol: string,\n params?: Omit<\n NonNullable<operations['StockLatestBarSingle']['parameters']['query']>,\n 'symbol'\n >,\n options?: RequestOptions\n ) {\n return unwrap(\n await client.GET('/v2/stocks/{symbol}/bars/latest', {\n params: { path: { symbol }, query: params },\n signal: options?.signal,\n })\n )\n },\n\n /** Get historical trades for multiple symbols */\n async getTrades(\n params: operations['StockTrades']['parameters']['query'],\n options?: RequestOptions\n ) {\n return unwrap(\n await client.GET('/v2/stocks/trades', {\n params: { query: params },\n signal: options?.signal,\n })\n )\n },\n\n /** Get historical trades for a single symbol */\n async getSymbolTrades(\n symbol: string,\n params?: Omit<NonNullable<operations['StockTradeSingle']['parameters']['query']>, 'symbol'>,\n options?: RequestOptions\n ) {\n return unwrap(\n await client.GET('/v2/stocks/{symbol}/trades', {\n params: { path: { symbol }, query: params },\n signal: options?.signal,\n })\n )\n },\n\n /** Get latest trades for multiple symbols */\n async getLatestTrades(\n params: operations['StockLatestTrades']['parameters']['query'],\n options?: RequestOptions\n ) {\n return unwrap(\n await client.GET('/v2/stocks/trades/latest', {\n params: { query: params },\n signal: options?.signal,\n })\n )\n },\n\n /** Get latest trade for a single symbol */\n async getLatestTrade(\n symbol: string,\n params?: Omit<\n NonNullable<operations['StockLatestTradeSingle']['parameters']['query']>,\n 'symbol'\n >,\n options?: RequestOptions\n ) {\n return unwrap(\n await client.GET('/v2/stocks/{symbol}/trades/latest', {\n params: { path: { symbol }, query: params },\n signal: options?.signal,\n })\n )\n },\n\n /** Get historical quotes for multiple symbols */\n async getQuotes(\n params: operations['StockQuotes']['parameters']['query'],\n options?: RequestOptions\n ) {\n return unwrap(\n await client.GET('/v2/stocks/quotes', {\n params: { query: params },\n signal: options?.signal,\n })\n )\n },\n\n /** Get historical quotes for a single symbol */\n async getSymbolQuotes(\n symbol: string,\n params?: Omit<NonNullable<operations['StockQuoteSingle']['parameters']['query']>, 'symbol'>,\n options?: RequestOptions\n ) {\n return unwrap(\n await client.GET('/v2/stocks/{symbol}/quotes', {\n params: { path: { symbol }, query: params },\n signal: options?.signal,\n })\n )\n },\n\n /** Get latest quotes for multiple symbols */\n async getLatestQuotes(\n params: operations['StockLatestQuotes']['parameters']['query'],\n options?: RequestOptions\n ) {\n return unwrap(\n await client.GET('/v2/stocks/quotes/latest', {\n params: { query: params },\n signal: options?.signal,\n })\n )\n },\n\n /** Get latest quote for a single symbol */\n async getLatestQuote(\n symbol: string,\n params?: Omit<\n NonNullable<operations['StockLatestQuoteSingle']['parameters']['query']>,\n 'symbol'\n >,\n options?: RequestOptions\n ) {\n return unwrap(\n await client.GET('/v2/stocks/{symbol}/quotes/latest', {\n params: { path: { symbol }, query: params },\n signal: options?.signal,\n })\n )\n },\n\n /** Get snapshots for multiple symbols */\n async getSnapshots(\n params: operations['StockSnapshots']['parameters']['query'],\n options?: RequestOptions\n ) {\n return unwrap(\n await client.GET('/v2/stocks/snapshots', {\n params: { query: params },\n signal: options?.signal,\n })\n )\n },\n\n /** Get snapshot for a single symbol */\n async getSnapshot(\n symbol: string,\n params?: operations['StockSnapshotSingle']['parameters']['query'],\n options?: RequestOptions\n ) {\n return unwrap(\n await client.GET('/v2/stocks/{symbol}/snapshot', {\n params: { path: { symbol }, query: params },\n signal: options?.signal,\n })\n )\n },\n\n /** Get auctions for multiple symbols */\n async getAuctions(\n params: operations['StockAuctions']['parameters']['query'],\n options?: RequestOptions\n ) {\n return unwrap(\n await client.GET('/v2/stocks/auctions', {\n params: { query: params },\n signal: options?.signal,\n })\n )\n },\n\n /** Get auctions for a single symbol */\n async getSymbolAuctions(\n symbol: string,\n params?: Omit<\n NonNullable<operations['StockAuctionSingle']['parameters']['query']>,\n 'symbol'\n >,\n options?: RequestOptions\n ) {\n return unwrap(\n await client.GET('/v2/stocks/{symbol}/auctions', {\n params: { path: { symbol }, query: params },\n signal: options?.signal,\n })\n )\n },\n\n /** Get exchange code mappings */\n async getExchanges(options?: RequestOptions) {\n return unwrap(\n await client.GET('/v2/stocks/meta/exchanges', {\n signal: options?.signal,\n })\n )\n },\n\n /** Get condition code mappings */\n async getConditions(\n ticktype: 'trade' | 'quote',\n params: NonNullable<operations['StockMetaConditions']['parameters']['query']>,\n options?: RequestOptions\n ) {\n return unwrap(\n await client.GET('/v2/stocks/meta/conditions/{ticktype}', {\n params: { path: { ticktype }, query: params },\n signal: options?.signal,\n })\n )\n },\n },\n\n /** Crypto market data operations */\n crypto: {\n /** Get historical bars */\n async getBars(\n loc: 'us' | 'us-1' | 'eu-1',\n params: operations['CryptoBars']['parameters']['query'],\n options?: RequestOptions\n ) {\n return unwrap(\n await client.GET('/v1beta3/crypto/{loc}/bars', {\n params: { path: { loc }, query: params },\n signal: options?.signal,\n })\n )\n },\n\n /** Get latest bars */\n async getLatestBars(\n loc: 'us' | 'us-1' | 'eu-1',\n params: operations['CryptoLatestBars']['parameters']['query'],\n options?: RequestOptions\n ) {\n return unwrap(\n await client.GET('/v1beta3/crypto/{loc}/latest/bars', {\n params: { path: { loc }, query: params },\n signal: options?.signal,\n })\n )\n },\n\n /** Get historical trades */\n async getTrades(\n loc: 'us' | 'us-1' | 'eu-1',\n params: operations['CryptoTrades']['parameters']['query'],\n options?: RequestOptions\n ) {\n return unwrap(\n await client.GET('/v1beta3/crypto/{loc}/trades', {\n params: { path: { loc }, query: params },\n signal: options?.signal,\n })\n )\n },\n\n /** Get latest trades */\n async getLatestTrades(\n loc: 'us' | 'us-1' | 'eu-1',\n params: operations['CryptoLatestTrades']['parameters']['query'],\n options?: RequestOptions\n ) {\n return unwrap(\n await client.GET('/v1beta3/crypto/{loc}/latest/trades', {\n params: { path: { loc }, query: params },\n signal: options?.signal,\n })\n )\n },\n\n /** Get historical quotes */\n async getQuotes(\n loc: 'us' | 'us-1' | 'eu-1',\n params: operations['CryptoQuotes']['parameters']['query'],\n options?: RequestOptions\n ) {\n return unwrap(\n await client.GET('/v1beta3/crypto/{loc}/quotes', {\n params: { path: { loc }, query: params },\n signal: options?.signal,\n })\n )\n },\n\n /** Get latest quotes */\n async getLatestQuotes(\n loc: 'us' | 'us-1' | 'eu-1',\n params: operations['CryptoLatestQuotes']['parameters']['query'],\n options?: RequestOptions\n ) {\n return unwrap(\n await client.GET('/v1beta3/crypto/{loc}/latest/quotes', {\n params: { path: { loc }, query: params },\n signal: options?.signal,\n })\n )\n },\n\n /** Get snapshots */\n async getSnapshots(\n loc: 'us' | 'us-1' | 'eu-1',\n params: operations['CryptoSnapshots']['parameters']['query'],\n options?: RequestOptions\n ) {\n return unwrap(\n await client.GET('/v1beta3/crypto/{loc}/snapshots', {\n params: { path: { loc }, query: params },\n signal: options?.signal,\n })\n )\n },\n\n /** Get latest orderbooks */\n async getLatestOrderbooks(\n loc: 'us' | 'us-1' | 'eu-1',\n params: operations['CryptoLatestOrderbooks']['parameters']['query'],\n options?: RequestOptions\n ) {\n return unwrap(\n await client.GET('/v1beta3/crypto/{loc}/latest/orderbooks', {\n params: { path: { loc }, query: params },\n signal: options?.signal,\n })\n )\n },\n },\n\n /** Options market data operations */\n options: {\n /** Get historical bars */\n async getBars(\n params: operations['optionBars']['parameters']['query'],\n options?: RequestOptions\n ) {\n return unwrap(\n await client.GET('/v1beta1/options/bars', {\n params: { query: params },\n signal: options?.signal,\n })\n )\n },\n\n /** Get historical trades */\n async getTrades(\n params: operations['OptionTrades']['parameters']['query'],\n options?: RequestOptions\n ) {\n return unwrap(\n await client.GET('/v1beta1/options/trades', {\n params: { query: params },\n signal: options?.signal,\n })\n )\n },\n\n /** Get latest trades */\n async getLatestTrades(\n params: operations['OptionLatestTrades']['parameters']['query'],\n options?: RequestOptions\n ) {\n return unwrap(\n await client.GET('/v1beta1/options/trades/latest', {\n params: { query: params },\n signal: options?.signal,\n })\n )\n },\n\n /** Get latest quotes */\n async getLatestQuotes(\n params: operations['OptionLatestQuotes']['parameters']['query'],\n options?: RequestOptions\n ) {\n return unwrap(\n await client.GET('/v1beta1/options/quotes/latest', {\n params: { query: params },\n signal: options?.signal,\n })\n )\n },\n\n /** Get snapshots for multiple symbols */\n async getSnapshots(\n params: operations['OptionSnapshots']['parameters']['query'],\n options?: RequestOptions\n ) {\n return unwrap(\n await client.GET('/v1beta1/options/snapshots', {\n params: { query: params },\n signal: options?.signal,\n })\n )\n },\n\n /** Get option chain for underlying symbol */\n async getChain(\n underlyingSymbol: string,\n params?: operations['OptionChain']['parameters']['query'],\n options?: RequestOptions\n ) {\n return unwrap(\n await client.GET('/v1beta1/options/snapshots/{underlying_symbol}', {\n params: { path: { underlying_symbol: underlyingSymbol }, query: params },\n signal: options?.signal,\n })\n )\n },\n\n /** Get exchange code mappings */\n async getExchanges(options?: RequestOptions) {\n return unwrap(\n await client.GET('/v1beta1/options/meta/exchanges', {\n signal: options?.signal,\n })\n )\n },\n\n /** Get condition code mappings */\n async getConditions(ticktype: 'trade' | 'quote', options?: RequestOptions) {\n return unwrap(\n await client.GET('/v1beta1/options/meta/conditions/{ticktype}', {\n params: { path: { ticktype } },\n signal: options?.signal,\n })\n )\n },\n },\n\n /** News operations */\n news: {\n /** Get news articles */\n async get(params?: operations['News']['parameters']['query'], options?: RequestOptions) {\n return unwrap(\n await client.GET('/v1beta1/news', {\n params: { query: params },\n signal: options?.signal,\n })\n )\n },\n },\n\n /** Screener operations */\n screener: {\n /** Get most active stocks */\n async getMostActives(\n params?: operations['MostActives']['parameters']['query'],\n options?: RequestOptions\n ) {\n return unwrap(\n await client.GET('/v1beta1/screener/stocks/most-actives', {\n params: { query: params },\n signal: options?.signal,\n })\n )\n },\n\n /** Get market movers */\n async getMovers(\n marketType: 'stocks' | 'crypto',\n params?: operations['Movers']['parameters']['query'],\n options?: RequestOptions\n ) {\n return unwrap(\n await client.GET('/v1beta1/screener/{market_type}/movers', {\n params: { path: { market_type: marketType }, query: params },\n signal: options?.signal,\n })\n )\n },\n },\n\n /** Corporate actions */\n corporateActions: {\n /** Get corporate actions */\n async get(\n params: operations['CorporateActions']['parameters']['query'],\n options?: RequestOptions\n ) {\n return unwrap(\n await client.GET('/v1/corporate-actions', {\n params: { query: params },\n signal: options?.signal,\n })\n )\n },\n },\n\n /** Forex operations */\n forex: {\n /** Get latest forex rates */\n async getLatestRates(\n params: operations['LatestRates']['parameters']['query'],\n options?: RequestOptions\n ) {\n return unwrap(\n await client.GET('/v1beta1/forex/latest/rates', {\n params: { query: params },\n signal: options?.signal,\n })\n )\n },\n\n /** Get historical forex rates */\n async getRates(params: operations['Rates']['parameters']['query'], options?: RequestOptions) {\n return unwrap(\n await client.GET('/v1beta1/forex/rates', {\n params: { query: params },\n signal: options?.signal,\n })\n )\n },\n },\n\n /** Logo operations */\n logos: {\n /** Get company logo */\n async get(\n symbol: string,\n params?: operations['Logos']['parameters']['query'],\n options?: RequestOptions\n ) {\n return unwrap(\n await client.GET('/v1beta1/logos/{symbol}', {\n params: { path: { symbol }, query: params },\n signal: options?.signal,\n })\n )\n },\n },\n }\n}\n\n/** Type inference helper for the market data client */\nexport type MarketDataClient = ReturnType<typeof createMarketDataClient>\n","/**\n * Broker API client factory\n */\n\nimport createClient from 'openapi-fetch'\nimport {\n type AlpacaConfig,\n resolveConfig,\n createBasicAuth,\n type RequestOptions,\n unwrap,\n unwrapList,\n unwrapOptional,\n} from '@luisjpf/core'\nimport type { paths, components, operations } from './generated/broker-api'\n\n// Account types\nexport type Account = components['schemas']['Account']\nexport type AccountExtended = components['schemas']['AccountExtended']\nexport type TradeAccount = components['schemas']['TradeAccount']\nexport type AccountStatus = components['schemas']['AccountStatus']\nexport type AccountConfigurations = components['schemas']['AccountConfigurations']\nexport type AccountCreationRequest = components['schemas']['AccountCreationRequest']\nexport type AccountUpdateRequest = components['schemas']['AccountUpdateRequest']\n\n// Activity types\nexport type Activity = components['schemas']['Activity']\nexport type TradeActivity = components['schemas']['TradeActivity']\nexport type NonTradeActivity = components['schemas']['NonTradeActivity']\nexport type ActivityType = components['schemas']['ActivityType']\n\n// Order types\nexport type Order = components['schemas']['Order']\nexport type CreateOrderRequest = components['schemas']['CreateOrderRequest']\nexport type OrderSide = components['schemas']['OrderSide']\nexport type OrderType = components['schemas']['OrderType']\nexport type TimeInForce = components['schemas']['TimeInForce']\nexport type OrderClass = components['schemas']['OrderClass']\nexport type OrderStatus = components['schemas']['OrderStatus']\n\n// Position types\nexport type Position = components['schemas']['Position']\n\n// Transfer types\nexport type Transfer = components['schemas']['Transfer']\nexport type CreateTransferRequest = components['schemas']['CreateTransferRequest']\nexport type TransferDirection = components['schemas']['TransferDirection']\nexport type TransferType = components['schemas']['TransferType']\n\n// ACH types\nexport type ACHRelationship = components['schemas']['ACHRelationship']\nexport type CreateACHRelationshipRequest = components['schemas']['CreateACHRelationshipRequest']\n\n// Document types\nexport type AccountDocument = components['schemas']['AccountDocument']\nexport type OwnerDocument = components['schemas']['OwnerDocument']\n\n// Identity types\nexport type Contact = components['schemas']['Contact']\nexport type Identity = components['schemas']['Identity']\nexport type Disclosures = components['schemas']['Disclosures']\nexport type TrustedContact = components['schemas']['TrustedContact']\n\n// Calendar and Clock\nexport type Calendar = components['schemas']['Calendar']\nexport type Clock = components['schemas']['Clock']\n\nexport type BrokerClientConfig = AlpacaConfig\n\n/**\n * Create a Broker API client\n */\nexport function createBrokerClient(config: BrokerClientConfig) {\n const resolvedConfig = resolveConfig(config, 'broker')\n const auth = createBasicAuth(resolvedConfig.keyId, resolvedConfig.secretKey)\n\n const client = createClient<paths>({\n baseUrl: resolvedConfig.baseUrl,\n headers: auth,\n })\n\n return {\n /** Raw openapi-fetch client for advanced usage */\n raw: client,\n\n /** Account operations */\n accounts: {\n /** List all accounts */\n async list(\n params?: operations['getAllAccounts']['parameters']['query'],\n options?: RequestOptions\n ) {\n return unwrapList(\n await client.GET('/v1/accounts', {\n params: { query: params },\n signal: options?.signal,\n })\n )\n },\n\n /** Get account by ID */\n async get(accountId: string, options?: RequestOptions) {\n return unwrap(\n await client.GET('/v1/accounts/{account_id}', {\n params: { path: { account_id: accountId } },\n signal: options?.signal,\n })\n )\n },\n\n /** Create a new account */\n async create(account: AccountCreationRequest, options?: RequestOptions) {\n return unwrap(\n await client.POST('/v1/accounts', {\n body: account,\n signal: options?.signal,\n })\n )\n },\n\n /** Update an account */\n async update(accountId: string, updates: AccountUpdateRequest, options?: RequestOptions) {\n return unwrap(\n await client.PATCH('/v1/accounts/{account_id}', {\n params: { path: { account_id: accountId } },\n body: updates,\n signal: options?.signal,\n })\n )\n },\n\n /** Get trading account details */\n async getTradingAccount(accountId: string, options?: RequestOptions) {\n return unwrap(\n await client.GET('/v1/trading/accounts/{account_id}/account', {\n params: { path: { account_id: accountId } },\n signal: options?.signal,\n })\n )\n },\n },\n\n /** Account activities */\n activities: {\n /** Get activities across all accounts */\n async list(\n params?: operations['getAccountActivities']['parameters']['query'],\n options?: RequestOptions\n ) {\n return unwrapList(\n await client.GET('/v1/accounts/activities', {\n params: { query: params },\n signal: options?.signal,\n })\n )\n },\n\n /** Get activities by type */\n async getByType(\n activityType: ActivityType,\n params?: operations['getAccountActivitiesByType']['parameters']['query'],\n options?: RequestOptions\n ) {\n return unwrapList(\n await client.GET('/v1/accounts/activities/{activity_type}', {\n params: { path: { activity_type: activityType }, query: params },\n signal: options?.signal,\n })\n )\n },\n },\n\n /** Transfer operations */\n transfers: {\n /** Get transfers for an account */\n async list(\n accountId: string,\n params?: operations['getTransfersForAccount']['parameters']['query'],\n options?: RequestOptions\n ) {\n return unwrapList(\n await client.GET('/v1/accounts/{account_id}/transfers', {\n params: { path: { account_id: accountId }, query: params },\n signal: options?.signal,\n })\n )\n },\n\n /** Create a transfer */\n async create(accountId: string, transfer: CreateTransferRequest, options?: RequestOptions) {\n return unwrap(\n await client.POST('/v1/accounts/{account_id}/transfers', {\n params: { path: { account_id: accountId } },\n body: transfer,\n signal: options?.signal,\n })\n )\n },\n\n /** Delete/cancel a transfer */\n async delete(accountId: string, transferId: string, options?: RequestOptions) {\n unwrapOptional(\n await client.DELETE('/v1/accounts/{account_id}/transfers/{transfer_id}', {\n params: { path: { account_id: accountId, transfer_id: transferId } },\n signal: options?.signal,\n })\n )\n },\n },\n\n /** ACH relationship operations */\n achRelationships: {\n /** Get ACH relationships for an account */\n async list(accountId: string, options?: RequestOptions) {\n return unwrapList(\n await client.GET('/v1/accounts/{account_id}/ach_relationships', {\n params: { path: { account_id: accountId } },\n signal: options?.signal,\n })\n )\n },\n\n /** Create an ACH relationship */\n async create(\n accountId: string,\n relationship: CreateACHRelationshipRequest,\n options?: RequestOptions\n ) {\n return unwrap(\n await client.POST('/v1/accounts/{account_id}/ach_relationships', {\n params: { path: { account_id: accountId } },\n body: relationship,\n signal: options?.signal,\n })\n )\n },\n\n /** Delete an ACH relationship */\n async delete(accountId: string, achRelationshipId: string, options?: RequestOptions) {\n unwrapOptional(\n await client.DELETE('/v1/accounts/{account_id}/ach_relationships/{ach_relationship_id}', {\n params: { path: { account_id: accountId, ach_relationship_id: achRelationshipId } },\n signal: options?.signal,\n })\n )\n },\n },\n\n /** Trading operations on behalf of accounts */\n trading: {\n /** Orders */\n orders: {\n /** List orders for an account */\n async list(\n accountId: string,\n params?: operations['getAllOrdersForAccount']['parameters']['query'],\n options?: RequestOptions\n ) {\n return unwrapList(\n await client.GET('/v1/trading/accounts/{account_id}/orders', {\n params: { path: { account_id: accountId }, query: params },\n signal: options?.signal,\n })\n )\n },\n\n /** Get order by ID */\n async get(accountId: string, orderId: string, options?: RequestOptions) {\n return unwrap(\n await client.GET('/v1/trading/accounts/{account_id}/orders/{order_id}', {\n params: { path: { account_id: accountId, order_id: orderId } },\n signal: options?.signal,\n })\n )\n },\n\n /** Create an order */\n async create(accountId: string, order: CreateOrderRequest, options?: RequestOptions) {\n return unwrap(\n await client.POST('/v1/trading/accounts/{account_id}/orders', {\n params: { path: { account_id: accountId } },\n body: order,\n signal: options?.signal,\n })\n )\n },\n\n /** Replace an order */\n async replace(\n accountId: string,\n orderId: string,\n updates: operations['replaceOrderForAccount']['requestBody']['content']['application/json'],\n options?: RequestOptions\n ) {\n return unwrap(\n await client.PATCH('/v1/trading/accounts/{account_id}/orders/{order_id}', {\n params: { path: { account_id: accountId, order_id: orderId } },\n body: updates,\n signal: options?.signal,\n })\n )\n },\n\n /** Cancel an order */\n async cancel(accountId: string, orderId: string, options?: RequestOptions) {\n unwrapOptional(\n await client.DELETE('/v1/trading/accounts/{account_id}/orders/{order_id}', {\n params: { path: { account_id: accountId, order_id: orderId } },\n signal: options?.signal,\n })\n )\n },\n\n /** Cancel all orders */\n async cancelAll(accountId: string, options?: RequestOptions) {\n return unwrapList(\n await client.DELETE('/v1/trading/accounts/{account_id}/orders', {\n params: { path: { account_id: accountId } },\n signal: options?.signal,\n })\n )\n },\n },\n\n /** Positions */\n positions: {\n /** List positions for an account */\n async list(accountId: string, options?: RequestOptions) {\n return unwrapList(\n await client.GET('/v1/trading/accounts/{account_id}/positions', {\n params: { path: { account_id: accountId } },\n signal: options?.signal,\n })\n )\n },\n\n /** Get position by symbol */\n async get(accountId: string, symbolOrAssetId: string, options?: RequestOptions) {\n return unwrap(\n await client.GET('/v1/trading/accounts/{account_id}/positions/{symbol_or_asset_id}', {\n params: { path: { account_id: accountId, symbol_or_asset_id: symbolOrAssetId } },\n signal: options?.signal,\n })\n )\n },\n\n /** Close a position */\n async close(\n accountId: string,\n symbolOrAssetId: string,\n params?: operations['closePositionForAccountBySymbol']['parameters']['query'],\n options?: RequestOptions\n ) {\n return unwrap(\n await client.DELETE(\n '/v1/trading/accounts/{account_id}/positions/{symbol_or_asset_id}',\n {\n params: {\n path: { account_id: accountId, symbol_or_asset_id: symbolOrAssetId },\n query: params,\n },\n signal: options?.signal,\n }\n )\n )\n },\n\n /** Close all positions */\n async closeAll(\n accountId: string,\n params?: operations['closeAllPositionsForAccount']['parameters']['query'],\n options?: RequestOptions\n ) {\n return unwrapList(\n await client.DELETE('/v1/trading/accounts/{account_id}/positions', {\n params: { path: { account_id: accountId }, query: params },\n signal: options?.signal,\n })\n )\n },\n },\n },\n\n /** Document operations */\n documents: {\n /** Get documents for an account */\n async list(\n accountId: string,\n params?: operations['getDocsForAccount']['parameters']['query'],\n options?: RequestOptions\n ) {\n return unwrapList(\n await client.GET('/v1/accounts/{account_id}/documents', {\n params: { path: { account_id: accountId }, query: params },\n signal: options?.signal,\n })\n )\n },\n\n /** Download a document */\n async download(accountId: string, documentId: string, options?: RequestOptions) {\n return unwrap(\n await client.GET('/v1/accounts/{account_id}/documents/{document_id}/download', {\n params: { path: { account_id: accountId, document_id: documentId } },\n signal: options?.signal,\n })\n )\n },\n },\n\n /** Asset operations */\n assets: {\n /** List all assets */\n async list(\n params?: operations['getAssets']['parameters']['query'],\n options?: RequestOptions\n ) {\n return unwrapList(\n await client.GET('/v1/assets', {\n params: { query: params },\n signal: options?.signal,\n })\n )\n },\n\n /** Get asset by symbol or ID */\n async get(symbolOrAssetId: string, options?: RequestOptions) {\n return unwrap(\n await client.GET('/v1/assets/{symbol_or_asset_id}', {\n params: { path: { symbol_or_asset_id: symbolOrAssetId } },\n signal: options?.signal,\n })\n )\n },\n },\n\n /** Calendar operations */\n calendar: {\n /** Get market calendar */\n async get(\n params?: operations['queryMarketCalendar']['parameters']['query'],\n options?: RequestOptions\n ) {\n return unwrapList(\n await client.GET('/v1/calendar', {\n params: { query: params },\n signal: options?.signal,\n })\n )\n },\n },\n\n /** Clock operations */\n clock: {\n /** Get market clock */\n async get(options?: RequestOptions) {\n return unwrap(\n await client.GET('/v1/clock', {\n signal: options?.signal,\n })\n )\n },\n },\n }\n}\n\n/** Type inference helper for the broker client */\nexport type BrokerClient = ReturnType<typeof createBrokerClient>\n","/**\n * Base WebSocket stream client with connection management, authentication,\n * and reconnection logic.\n */\n\nimport WebSocket from 'ws'\nimport { encode, decode } from '@msgpack/msgpack'\nimport type { StreamState, StreamConfig } from './types'\n\n/** Reconnection configuration */\nconst RECONNECT_INITIAL_DELAY = 1000\nconst RECONNECT_MAX_DELAY = 30000\nconst RECONNECT_BACKOFF_MULTIPLIER = 2\n\n/** Connection timeout (30 seconds) */\nconst CONNECTION_TIMEOUT = 30000\n\n/** Message types from the server */\nexport interface ControlMessage {\n T: 'success' | 'error' | 'subscription'\n msg?: string\n code?: number\n trades?: string[]\n quotes?: string[]\n bars?: string[]\n}\n\n/** Event types emitted by the stream */\nexport type StreamEvent =\n | 'connected'\n | 'disconnected'\n | 'authenticated'\n | 'error'\n | 'trade'\n | 'quote'\n | 'bar'\n | 'trade_update'\n | 'subscription'\n\n/** Event handler type */\nexport type EventHandler<T = unknown> = (data: T) => void\n\n/**\n * Abstract base class for WebSocket streaming clients.\n *\n * Handles:\n * - WebSocket connection lifecycle\n * - Authentication flow\n * - Reconnection with exponential backoff\n * - Message parsing (JSON + MessagePack)\n * - Event emission\n * - Subscription queue during reconnection\n */\nexport abstract class BaseStream {\n protected ws: WebSocket | null = null\n protected state: StreamState = 'disconnected'\n protected config: StreamConfig\n protected reconnectAttempts = 0\n protected reconnectTimer: ReturnType<typeof setTimeout> | null = null\n protected connectionTimer: ReturnType<typeof setTimeout> | null = null\n protected shouldReconnect = true\n protected pendingSubscriptions: (() => void)[] = []\n protected eventHandlers = new Map<StreamEvent, Set<EventHandler>>()\n\n constructor(config: StreamConfig) {\n this.config = config\n }\n\n /**\n * Get the WebSocket URL for this stream type.\n */\n protected abstract getUrl(): string\n\n /**\n * Handle incoming messages from the WebSocket.\n */\n protected abstract handleMessage(data: unknown): void\n\n /**\n * Get the authentication message to send after connecting.\n */\n protected abstract getAuthMessage(): object\n\n /**\n * Get the current connection state.\n */\n getState(): StreamState {\n return this.state\n }\n\n /**\n * Check if the stream is currently connected and authenticated.\n */\n isConnected(): boolean {\n return this.state === 'connected'\n }\n\n /**\n * Connect to the WebSocket server.\n */\n connect(): void {\n if (this.ws && (this.state === 'connecting' || this.state === 'connected')) {\n return\n }\n\n this.shouldReconnect = true\n this.doConnect()\n }\n\n /**\n * Disconnect from the WebSocket server.\n */\n disconnect(): void {\n this.shouldReconnect = false\n this.clearReconnectTimer()\n this.clearConnectionTimer()\n\n if (this.ws) {\n this.ws.close()\n this.ws = null\n }\n\n this.setState('disconnected')\n }\n\n /**\n * Register an event handler.\n */\n on<T = unknown>(event: StreamEvent, handler: EventHandler<T>): void {\n if (!this.eventHandlers.has(event)) {\n this.eventHandlers.set(event, new Set())\n }\n this.eventHandlers.get(event)!.add(handler as EventHandler)\n }\n\n /**\n * Remove an event handler.\n */\n off<T = unknown>(event: StreamEvent, handler: EventHandler<T>): void {\n const handlers = this.eventHandlers.get(event)\n if (handlers) {\n handlers.delete(handler as EventHandler)\n }\n }\n\n /**\n * Remove all handlers for a specific event, or all handlers if no event specified.\n */\n removeAllListeners(event?: StreamEvent): void {\n if (event) {\n this.eventHandlers.delete(event)\n } else {\n this.eventHandlers.clear()\n }\n }\n\n /**\n * Emit an event to all registered handlers.\n */\n protected emit(event: StreamEvent, data?: unknown): void {\n const handlers = this.eventHandlers.get(event)\n if (handlers) {\n for (const handler of handlers) {\n try {\n handler(data)\n } catch (error) {\n // For error handlers, just log to avoid infinite recursion\n // For other handlers, re-emit as an error event\n if (event === 'error') {\n console.error(`Error in ${event} handler:`, error)\n } else {\n this.emit(\n 'error',\n error instanceof Error\n ? error\n : new Error(`Error in ${event} handler: ${String(error)}`)\n )\n }\n }\n }\n }\n }\n\n /**\n * Perform the actual WebSocket connection.\n */\n private doConnect(): void {\n this.setState('connecting')\n\n // Set connection timeout\n this.connectionTimer = setTimeout(() => {\n if (this.state === 'connecting' || this.state === 'authenticating') {\n this.emit('error', new Error('Connection timeout'))\n if (this.ws) {\n this.ws.close()\n }\n }\n }, CONNECTION_TIMEOUT)\n\n const url = this.getUrl()\n this.ws = new WebSocket(url)\n\n if (this.config.useMsgpack) {\n this.ws.binaryType = 'arraybuffer'\n }\n\n this.ws.onopen = () => {\n // Wait for server's 'connected' message before authenticating\n this.setState('authenticating')\n }\n\n this.ws.onmessage = (event: WebSocket.MessageEvent) => {\n this.onMessage(event)\n }\n\n this.ws.onerror = (event: WebSocket.ErrorEvent) => {\n this.emit('error', new Error(event.message || 'WebSocket error'))\n }\n\n this.ws.onclose = () => {\n const wasConnected = this.state === 'connected'\n this.ws = null\n\n if (this.shouldReconnect) {\n this.scheduleReconnect()\n } else {\n this.setState('disconnected')\n }\n\n if (wasConnected) {\n this.emit('disconnected')\n }\n }\n }\n\n /**\n * Send the authentication message.\n */\n private authenticate(): void {\n this.send(this.getAuthMessage())\n }\n\n /**\n * Handle incoming WebSocket messages.\n */\n private onMessage(event: WebSocket.MessageEvent): void {\n let data: unknown\n\n try {\n if (this.config.useMsgpack && event.data instanceof ArrayBuffer) {\n data = decode(new Uint8Array(event.data))\n } else if (typeof event.data === 'string') {\n data = JSON.parse(event.data)\n } else {\n return\n }\n } catch (error) {\n this.emit(\n 'error',\n new Error(\n `Failed to parse message: ${error instanceof Error ? error.message : String(error)}`\n )\n )\n return\n }\n\n // Handle arrays of messages\n if (Array.isArray(data)) {\n for (const message of data) {\n this.processMessage(message as Record<string, unknown>)\n }\n } else {\n this.processMessage(data as Record<string, unknown>)\n }\n }\n\n /**\n * Process a single message from the server.\n */\n private processMessage(message: Record<string, unknown>): void {\n const type = message.T as string\n\n // Handle control messages\n if (type === 'success') {\n const msg = message.msg as string | undefined\n if (msg === 'connected') {\n // Initial connection message - send auth\n this.authenticate()\n } else if (msg === 'authenticated') {\n this.onAuthenticated()\n }\n return\n }\n\n if (type === 'error') {\n const errorMsg = (message.msg as string) || 'Unknown error'\n const errorCode = message.code as number | undefined\n this.emit('error', new Error(`[${String(errorCode ?? 'unknown')}] ${errorMsg}`))\n\n // Auth errors should not reconnect\n if (errorCode === 401 || errorCode === 402 || errorCode === 403) {\n this.shouldReconnect = false\n this.disconnect()\n }\n return\n }\n\n if (type === 'subscription') {\n this.emit('subscription', message)\n return\n }\n\n // Delegate other messages to the subclass\n this.handleMessage(message)\n }\n\n /**\n * Called when authentication is successful.\n */\n private onAuthenticated(): void {\n this.clearConnectionTimer()\n this.setState('connected')\n this.reconnectAttempts = 0\n this.emit('connected')\n this.emit('authenticated')\n\n // Process any pending subscriptions\n for (const subscribe of this.pendingSubscriptions) {\n subscribe()\n }\n this.pendingSubscriptions = []\n }\n\n /**\n * Send a message to the WebSocket server.\n */\n protected send(message: object): void {\n if (this.ws?.readyState !== WebSocket.OPEN) {\n return\n }\n\n if (this.config.useMsgpack) {\n this.ws.send(encode(message))\n } else {\n this.ws.send(JSON.stringify(message))\n }\n }\n\n /**\n * Queue a subscription to be sent when connected.\n */\n protected queueOrSend(action: () => void): void {\n if (this.state === 'connected') {\n action()\n } else {\n this.pendingSubscriptions.push(action)\n }\n }\n\n /**\n * Schedule a reconnection attempt with exponential backoff.\n */\n private scheduleReconnect(): void {\n this.clearReconnectTimer()\n this.setState('disconnected')\n\n const delay = Math.min(\n RECONNECT_INITIAL_DELAY * Math.pow(RECONNECT_BACKOFF_MULTIPLIER, this.reconnectAttempts),\n RECONNECT_MAX_DELAY\n )\n\n this.reconnectAttempts++\n\n this.reconnectTimer = setTimeout(() => {\n this.doConnect()\n }, delay)\n }\n\n /**\n * Clear the reconnection timer.\n */\n private clearReconnectTimer(): void {\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer)\n this.reconnectTimer = null\n }\n }\n\n /**\n * Clear the connection timeout timer.\n */\n private clearConnectionTimer(): void {\n if (this.connectionTimer) {\n clearTimeout(this.connectionTimer)\n this.connectionTimer = null\n }\n }\n\n /**\n * Update the connection state and emit state change event.\n */\n private setState(state: StreamState): void {\n if (this.state !== state) {\n this.state = state\n }\n }\n}\n","/**\n * Stock market data streaming\n *\n * Provides real-time stock trades, quotes, and bars via WebSocket.\n */\n\nimport { BaseStream } from './base-stream'\nimport type {\n StockStreamConfig,\n StockFeed,\n Trade,\n Quote,\n Bar,\n MarketDataAuth,\n MarketDataSubscription,\n} from './types'\n\n/** Base URL for stock data streaming */\nconst STOCK_STREAM_BASE_URL = 'wss://stream.data.alpaca.markets/v2'\n\nexport interface StockStream {\n /** Connect to the WebSocket server */\n connect: () => void\n /** Disconnect from the WebSocket server */\n disconnect: () => void\n /** Check if connected and authenticated */\n isConnected: () => boolean\n /** Subscribe to trades for symbols */\n subscribeForTrades: (symbols: string[]) => void\n /** Subscribe to quotes for symbols */\n subscribeForQuotes: (symbols: string[]) => void\n /** Subscribe to bars for symbols */\n subscribeForBars: (symbols: string[]) => void\n /** Unsubscribe from trades for symbols */\n unsubscribeFromTrades: (symbols: string[]) => void\n /** Unsubscribe from quotes for symbols */\n unsubscribeFromQuotes: (symbols: string[]) => void\n /** Unsubscribe from bars for symbols */\n unsubscribeFromBars: (symbols: string[]) => void\n /** Register a handler for trade events */\n onTrade: (handler: (trade: Trade) => void) => void\n /** Register a handler for quote events */\n onQuote: (handler: (quote: Quote) => void) => void\n /** Register a handler for bar events */\n onBar: (handler: (bar: Bar) => void) => void\n /** Register a handler for connection events */\n onConnect: (handler: () => void) => void\n /** Register a handler for disconnection events */\n onDisconnect: (handler: () => void) => void\n /** Register a handler for error events */\n onError: (handler: (error: Error) => void) => void\n}\n\n/**\n * Internal implementation of the stock stream client.\n */\nclass StockStreamImpl extends BaseStream {\n private feed: StockFeed\n private subscribedTrades = new Set<string>()\n private subscribedQuotes = new Set<string>()\n private subscribedBars = new Set<string>()\n\n constructor(config: StockStreamConfig) {\n super(config)\n this.feed = config.feed ?? 'iex'\n }\n\n protected getUrl(): string {\n return `${STOCK_STREAM_BASE_URL}/${this.feed}`\n }\n\n protected getAuthMessage(): MarketDataAuth {\n return {\n action: 'auth',\n key: this.config.keyId,\n secret: this.config.secretKey,\n }\n }\n\n protected handleMessage(message: Record<string, unknown>): void {\n const type = message.T as string\n\n switch (type) {\n case 't':\n this.emit('trade', message as unknown as Trade)\n break\n case 'q':\n this.emit('quote', message as unknown as Quote)\n break\n case 'b':\n this.emit('bar', message as unknown as Bar)\n break\n }\n }\n\n subscribeForTrades(symbols: string[]): void {\n this.queueOrSend(() => {\n const newSymbols = symbols.filter((s) => !this.subscribedTrades.has(s))\n if (newSymbols.length === 0) return\n\n for (const symbol of newSymbols) {\n this.subscribedTrades.add(symbol)\n }\n\n const message: MarketDataSubscription = {\n action: 'subscribe',\n trades: newSymbols,\n }\n this.send(message)\n })\n }\n\n subscribeForQuotes(symbols: string[]): void {\n this.queueOrSend(() => {\n const newSymbols = symbols.filter((s) => !this.subscribedQuotes.has(s))\n if (newSymbols.length === 0) return\n\n for (const symbol of newSymbols) {\n this.subscribedQuotes.add(symbol)\n }\n\n const message: MarketDataSubscription = {\n action: 'subscribe',\n quotes: newSymbols,\n }\n this.send(message)\n })\n }\n\n subscribeForBars(symbols: string[]): void {\n this.queueOrSend(() => {\n const newSymbols = symbols.filter((s) => !this.subscribedBars.has(s))\n if (newSymbols.length === 0) return\n\n for (const symbol of newSymbols) {\n this.subscribedBars.add(symbol)\n }\n\n const message: MarketDataSubscription = {\n action: 'subscribe',\n bars: newSymbols,\n }\n this.send(message)\n })\n }\n\n unsubscribeFromTrades(symbols: string[]): void {\n this.queueOrSend(() => {\n const existingSymbols = symbols.filter((s) => this.subscribedTrades.has(s))\n if (existingSymbols.length === 0) return\n\n for (const symbol of existingSymbols) {\n this.subscribedTrades.delete(symbol)\n }\n\n const message: MarketDataSubscription = {\n action: 'unsubscribe',\n trades: existingSymbols,\n }\n this.send(message)\n })\n }\n\n unsubscribeFromQuotes(symbols: string[]): void {\n this.queueOrSend(() => {\n const existingSymbols = symbols.filter((s) => this.subscribedQuotes.has(s))\n if (existingSymbols.length === 0) return\n\n for (const symbol of existingSymbols) {\n this.subscribedQuotes.delete(symbol)\n }\n\n const message: MarketDataSubscription = {\n action: 'unsubscribe',\n quotes: existingSymbols,\n }\n this.send(message)\n })\n }\n\n unsubscribeFromBars(symbols: string[]): void {\n this.queueOrSend(() => {\n const existingSymbols = symbols.filter((s) => this.subscribedBars.has(s))\n if (existingSymbols.length === 0) return\n\n for (const symbol of existingSymbols) {\n this.subscribedBars.delete(symbol)\n }\n\n const message: MarketDataSubscription = {\n action: 'unsubscribe',\n bars: existingSymbols,\n }\n this.send(message)\n })\n }\n\n onTrade(handler: (trade: Trade) => void): void {\n this.on('trade', handler)\n }\n\n onQuote(handler: (quote: Quote) => void): void {\n this.on('quote', handler)\n }\n\n onBar(handler: (bar: Bar) => void): void {\n this.on('bar', handler)\n }\n\n onConnect(handler: () => void): void {\n this.on('connected', handler)\n }\n\n onDisconnect(handler: () => void): void {\n this.on('disconnected', handler)\n }\n\n onError(handler: (error: Error) => void): void {\n this.on('error', handler)\n }\n}\n\n/**\n * Create a stock data stream client.\n *\n * @param config - Stream configuration including API credentials and feed type\n * @returns Stock stream client\n *\n * @example\n * ```typescript\n * const stream = createStockStream({\n * keyId: 'your-api-key',\n * secretKey: 'your-api-secret',\n * feed: 'iex', // 'iex' (free), 'sip' (paid), or 'delayed_sip'\n * })\n *\n * stream.onTrade((trade) => {\n * console.log(`Trade: ${trade.S} @ ${trade.p}`)\n * })\n *\n * stream.connect()\n * stream.subscribeForTrades(['AAPL', 'MSFT'])\n * ```\n */\nexport function createStockStream(config: StockStreamConfig): StockStream {\n const impl = new StockStreamImpl(config)\n\n return {\n connect: () => {\n impl.connect()\n },\n disconnect: () => {\n impl.disconnect()\n },\n isConnected: () => impl.isConnected(),\n subscribeForTrades: (symbols) => {\n impl.subscribeForTrades(symbols)\n },\n subscribeForQuotes: (symbols) => {\n impl.subscribeForQuotes(symbols)\n },\n subscribeForBars: (symbols) => {\n impl.subscribeForBars(symbols)\n },\n unsubscribeFromTrades: (symbols) => {\n impl.unsubscribeFromTrades(symbols)\n },\n unsubscribeFromQuotes: (symbols) => {\n impl.unsubscribeFromQuotes(symbols)\n },\n unsubscribeFromBars: (symbols) => {\n impl.unsubscribeFromBars(symbols)\n },\n onTrade: (handler) => {\n impl.onTrade(handler)\n },\n onQuote: (handler) => {\n impl.onQuote(handler)\n },\n onBar: (handler) => {\n impl.onBar(handler)\n },\n onConnect: (handler) => {\n impl.onConnect(handler)\n },\n onDisconnect: (handler) => {\n impl.onDisconnect(handler)\n },\n onError: (handler) => {\n impl.onError(handler)\n },\n }\n}\n","/**\n * Crypto market data streaming\n *\n * Provides real-time crypto trades, quotes, and bars via WebSocket.\n */\n\nimport { BaseStream } from './base-stream'\nimport type {\n CryptoStreamConfig,\n CryptoLocation,\n Trade,\n Quote,\n Bar,\n MarketDataAuth,\n MarketDataSubscription,\n} from './types'\n\n/** Base URL for crypto data streaming */\nconst CRYPTO_STREAM_BASE_URL = 'wss://stream.data.alpaca.markets/v1beta3/crypto'\n\nexport interface CryptoStream {\n /** Connect to the WebSocket server */\n connect: () => void\n /** Disconnect from the WebSocket server */\n disconnect: () => void\n /** Check if connected and authenticated */\n isConnected: () => boolean\n /** Subscribe to trades for symbols */\n subscribeForTrades: (symbols: string[]) => void\n /** Subscribe to quotes for symbols */\n subscribeForQuotes: (symbols: string[]) => void\n /** Subscribe to bars for symbols */\n subscribeForBars: (symbols: string[]) => void\n /** Unsubscribe from trades for symbols */\n unsubscribeFromTrades: (symbols: string[]) => void\n /** Unsubscribe from quotes for symbols */\n unsubscribeFromQuotes: (symbols: string[]) => void\n /** Unsubscribe from bars for symbols */\n unsubscribeFromBars: (symbols: string[]) => void\n /** Register a handler for trade events */\n onTrade: (handler: (trade: Trade) => void) => void\n /** Register a handler for quote events */\n onQuote: (handler: (quote: Quote) => void) => void\n /** Register a handler for bar events */\n onBar: (handler: (bar: Bar) => void) => void\n /** Register a handler for connection events */\n onConnect: (handler: () => void) => void\n /** Register a handler for disconnection events */\n onDisconnect: (handler: () => void) => void\n /** Register a handler for error events */\n onError: (handler: (error: Error) => void) => void\n}\n\n/**\n * Internal implementation of the crypto stream client.\n */\nclass CryptoStreamImpl extends BaseStream {\n private location: CryptoLocation\n private subscribedTrades = new Set<string>()\n private subscribedQuotes = new Set<string>()\n private subscribedBars = new Set<string>()\n\n constructor(config: CryptoStreamConfig) {\n super(config)\n this.location = config.location ?? 'us'\n }\n\n protected getUrl(): string {\n return `${CRYPTO_STREAM_BASE_URL}/${this.location}`\n }\n\n protected getAuthMessage(): MarketDataAuth {\n return {\n action: 'auth',\n key: this.config.keyId,\n secret: this.config.secretKey,\n }\n }\n\n protected handleMessage(message: Record<string, unknown>): void {\n const type = message.T as string\n\n switch (type) {\n case 't':\n this.emit('trade', message as unknown as Trade)\n break\n case 'q':\n this.emit('quote', message as unknown as Quote)\n break\n case 'b':\n this.emit('bar', message as unknown as Bar)\n break\n }\n }\n\n subscribeForTrades(symbols: string[]): void {\n this.queueOrSend(() => {\n const newSymbols = symbols.filter((s) => !this.subscribedTrades.has(s))\n if (newSymbols.length === 0) return\n\n for (const symbol of newSymbols) {\n this.subscribedTrades.add(symbol)\n }\n\n const message: MarketDataSubscription = {\n action: 'subscribe',\n trades: newSymbols,\n }\n this.send(message)\n })\n }\n\n subscribeForQuotes(symbols: string[]): void {\n this.queueOrSend(() => {\n const newSymbols = symbols.filter((s) => !this.subscribedQuotes.has(s))\n if (newSymbols.length === 0) return\n\n for (const symbol of newSymbols) {\n this.subscribedQuotes.add(symbol)\n }\n\n const message: MarketDataSubscription = {\n action: 'subscribe',\n quotes: newSymbols,\n }\n this.send(message)\n })\n }\n\n subscribeForBars(symbols: string[]): void {\n this.queueOrSend(() => {\n const newSymbols = symbols.filter((s) => !this.subscribedBars.has(s))\n if (newSymbols.length === 0) return\n\n for (const symbol of newSymbols) {\n this.subscribedBars.add(symbol)\n }\n\n const message: MarketDataSubscription = {\n action: 'subscribe',\n bars: newSymbols,\n }\n this.send(message)\n })\n }\n\n unsubscribeFromTrades(symbols: string[]): void {\n this.queueOrSend(() => {\n const existingSymbols = symbols.filter((s) => this.subscribedTrades.has(s))\n if (existingSymbols.length === 0) return\n\n for (const symbol of existingSymbols) {\n this.subscribedTrades.delete(symbol)\n }\n\n const message: MarketDataSubscription = {\n action: 'unsubscribe',\n trades: existingSymbols,\n }\n this.send(message)\n })\n }\n\n unsubscribeFromQuotes(symbols: string[]): void {\n this.queueOrSend(() => {\n const existingSymbols = symbols.filter((s) => this.subscribedQuotes.has(s))\n if (existingSymbols.length === 0) return\n\n for (const symbol of existingSymbols) {\n this.subscribedQuotes.delete(symbol)\n }\n\n const message: MarketDataSubscription = {\n action: 'unsubscribe',\n quotes: existingSymbols,\n }\n this.send(message)\n })\n }\n\n unsubscribeFromBars(symbols: string[]): void {\n this.queueOrSend(() => {\n const existingSymbols = symbols.filter((s) => this.subscribedBars.has(s))\n if (existingSymbols.length === 0) return\n\n for (const symbol of existingSymbols) {\n this.subscribedBars.delete(symbol)\n }\n\n const message: MarketDataSubscription = {\n action: 'unsubscribe',\n bars: existingSymbols,\n }\n this.send(message)\n })\n }\n\n onTrade(handler: (trade: Trade) => void): void {\n this.on('trade', handler)\n }\n\n onQuote(handler: (quote: Quote) => void): void {\n this.on('quote', handler)\n }\n\n onBar(handler: (bar: Bar) => void): void {\n this.on('bar', handler)\n }\n\n onConnect(handler: () => void): void {\n this.on('connected', handler)\n }\n\n onDisconnect(handler: () => void): void {\n this.on('disconnected', handler)\n }\n\n onError(handler: (error: Error) => void): void {\n this.on('error', handler)\n }\n}\n\n/**\n * Create a crypto data stream client.\n *\n * @param config - Stream configuration including API credentials and location\n * @returns Crypto stream client\n *\n * @example\n * ```typescript\n * const stream = createCryptoStream({\n * keyId: 'your-api-key',\n * secretKey: 'your-api-secret',\n * location: 'us', // 'us' (Alpaca), 'us-1' (Kraken US), 'eu-1' (Kraken EU)\n * })\n *\n * stream.onTrade((trade) => {\n * console.log(`Trade: ${trade.S} @ ${trade.p}`)\n * })\n *\n * stream.connect()\n * stream.subscribeForTrades(['BTC/USD', 'ETH/USD'])\n * ```\n */\nexport function createCryptoStream(config: CryptoStreamConfig): CryptoStream {\n const impl = new CryptoStreamImpl(config)\n\n return {\n connect: () => {\n impl.connect()\n },\n disconnect: () => {\n impl.disconnect()\n },\n isConnected: () => impl.isConnected(),\n subscribeForTrades: (symbols) => {\n impl.subscribeForTrades(symbols)\n },\n subscribeForQuotes: (symbols) => {\n impl.subscribeForQuotes(symbols)\n },\n subscribeForBars: (symbols) => {\n impl.subscribeForBars(symbols)\n },\n unsubscribeFromTrades: (symbols) => {\n impl.unsubscribeFromTrades(symbols)\n },\n unsubscribeFromQuotes: (symbols) => {\n impl.unsubscribeFromQuotes(symbols)\n },\n unsubscribeFromBars: (symbols) => {\n impl.unsubscribeFromBars(symbols)\n },\n onTrade: (handler) => {\n impl.onTrade(handler)\n },\n onQuote: (handler) => {\n impl.onQuote(handler)\n },\n onBar: (handler) => {\n impl.onBar(handler)\n },\n onConnect: (handler) => {\n impl.onConnect(handler)\n },\n onDisconnect: (handler) => {\n impl.onDisconnect(handler)\n },\n onError: (handler) => {\n impl.onError(handler)\n },\n }\n}\n","/**\n * Trade/Account updates streaming\n *\n * Provides real-time updates on order fills, cancellations, rejections,\n * and other trade-related events.\n */\n\nimport WebSocket from 'ws'\nimport { encode, decode } from '@msgpack/msgpack'\nimport type {\n StreamConfig,\n StreamState,\n TradeUpdate,\n TradeUpdatesAuth,\n TradeUpdatesListen,\n} from './types'\n\n/** Paper trading WebSocket URL */\nconst PAPER_TRADING_URL = 'wss://paper-api.alpaca.markets/stream'\n\n/** Live trading WebSocket URL */\nconst LIVE_TRADING_URL = 'wss://api.alpaca.markets/stream'\n\n/** Reconnection configuration */\nconst RECONNECT_INITIAL_DELAY = 1000\nconst RECONNECT_MAX_DELAY = 30000\nconst RECONNECT_BACKOFF_MULTIPLIER = 2\n\nexport interface TradeUpdatesStream {\n /** Connect to the WebSocket server */\n connect: () => void\n /** Disconnect from the WebSocket server */\n disconnect: () => void\n /** Check if connected and authenticated */\n isConnected: () => boolean\n /** Subscribe to trade updates */\n subscribe: () => void\n /** Unsubscribe from trade updates */\n unsubscribe: () => void\n /** Register a handler for trade update events */\n onTradeUpdate: (handler: (update: TradeUpdate) => void) => void\n /** Register a handler for connection events */\n onConnect: (handler: () => void) => void\n /** Register a handler for disconnection events */\n onDisconnect: (handler: () => void) => void\n /** Register a handler for error events */\n onError: (handler: (error: Error) => void) => void\n}\n\n/** Event handler type */\ntype EventHandler<T = unknown> = (data: T) => void\n\n/**\n * Internal implementation of the trade updates stream client.\n *\n * The trade updates stream has a different protocol than market data streams:\n * - Authentication uses `authenticate` action with `key_id` and `secret_key`\n * - Subscription uses `listen` action with `streams` array\n */\nclass TradeUpdatesStreamImpl {\n private ws: WebSocket | null = null\n private state: StreamState = 'disconnected'\n private config: StreamConfig\n private reconnectAttempts = 0\n private reconnectTimer: ReturnType<typeof setTimeout> | null = null\n private shouldReconnect = true\n private isSubscribed = false\n private pendingSubscribe = false\n private eventHandlers = new Map<string, Set<EventHandler>>()\n\n constructor(config: StreamConfig) {\n this.config = config\n }\n\n private getUrl(): string {\n return this.config.paper === false ? LIVE_TRADING_URL : PAPER_TRADING_URL\n }\n\n getState(): StreamState {\n return this.state\n }\n\n isConnected(): boolean {\n return this.state === 'connected'\n }\n\n connect(): void {\n if (this.ws && (this.state === 'connecting' || this.state === 'connected')) {\n return\n }\n\n this.shouldReconnect = true\n this.doConnect()\n }\n\n disconnect(): void {\n this.shouldReconnect = false\n this.clearReconnectTimer()\n\n if (this.ws) {\n this.ws.close()\n this.ws = null\n }\n\n this.setState('disconnected')\n this.isSubscribed = false\n }\n\n subscribe(): void {\n if (this.state === 'connected') {\n if (!this.isSubscribed) {\n this.doSubscribe()\n }\n } else if (!this.pendingSubscribe) {\n // Guard against double-queuing subscriptions\n this.pendingSubscribe = true\n }\n }\n\n unsubscribe(): void {\n if (this.state !== 'connected' || !this.isSubscribed) {\n return\n }\n\n const message: TradeUpdatesListen = {\n action: 'listen',\n data: {\n streams: [],\n },\n }\n this.send(message)\n this.isSubscribed = false\n }\n\n onTradeUpdate(handler: (update: TradeUpdate) => void): void {\n this.on('trade_update', handler)\n }\n\n onConnect(handler: () => void): void {\n this.on('connected', handler)\n }\n\n onDisconnect(handler: () => void): void {\n this.on('disconnected', handler)\n }\n\n onError(handler: (error: Error) => void): void {\n this.on('error', handler)\n }\n\n private on<T = unknown>(event: string, handler: EventHandler<T>): void {\n if (!this.eventHandlers.has(event)) {\n this.eventHandlers.set(event, new Set())\n }\n this.eventHandlers.get(event)!.add(handler as EventHandler)\n }\n\n private emit(event: string, data?: unknown): void {\n const handlers = this.eventHandlers.get(event)\n if (handlers) {\n for (const handler of handlers) {\n try {\n handler(data)\n } catch (error) {\n // For error handlers, just log to avoid infinite recursion\n // For other handlers, re-emit as an error event\n if (event === 'error') {\n console.error(`Error in ${event} handler:`, error)\n } else {\n this.emit(\n 'error',\n error instanceof Error\n ? error\n : new Error(`Error in ${event} handler: ${String(error)}`)\n )\n }\n }\n }\n }\n }\n\n private doConnect(): void {\n this.setState('connecting')\n\n const url = this.getUrl()\n this.ws = new WebSocket(url)\n\n if (this.config.useMsgpack) {\n this.ws.binaryType = 'arraybuffer'\n }\n\n this.ws.onopen = () => {\n this.setState('authenticating')\n this.authenticate()\n }\n\n this.ws.onmessage = (event: WebSocket.MessageEvent) => {\n this.onMessage(event)\n }\n\n this.ws.onerror = (event: WebSocket.ErrorEvent) => {\n this.emit('error', new Error(event.message || 'WebSocket error'))\n }\n\n this.ws.onclose = () => {\n const wasConnected = this.state === 'connected'\n this.ws = null\n this.isSubscribed = false\n\n if (this.shouldReconnect) {\n this.scheduleReconnect()\n } else {\n this.setState('disconnected')\n }\n\n if (wasConnected) {\n this.emit('disconnected')\n }\n }\n }\n\n private authenticate(): void {\n const message: TradeUpdatesAuth = {\n action: 'authenticate',\n data: {\n key_id: this.config.keyId,\n secret_key: this.config.secretKey,\n },\n }\n this.send(message)\n }\n\n private doSubscribe(): void {\n const message: TradeUpdatesListen = {\n action: 'listen',\n data: {\n streams: ['trade_updates'],\n },\n }\n this.send(message)\n this.isSubscribed = true\n }\n\n private onMessage(event: WebSocket.MessageEvent): void {\n let data: unknown\n\n try {\n if (this.config.useMsgpack && event.data instanceof ArrayBuffer) {\n data = decode(new Uint8Array(event.data))\n } else if (typeof event.data === 'string') {\n data = JSON.parse(event.data)\n } else {\n return\n }\n } catch (error) {\n this.emit(\n 'error',\n new Error(\n `Failed to parse message: ${error instanceof Error ? error.message : String(error)}`\n )\n )\n return\n }\n\n this.processMessage(data as Record<string, unknown>)\n }\n\n private processMessage(message: Record<string, unknown>): void {\n const stream = message.stream as string | undefined\n const data = message.data as Record<string, unknown> | undefined\n\n // Handle authentication response\n if (stream === 'authorization') {\n const status = data?.status as string | undefined\n const action = data?.action as string | undefined\n\n if (status === 'authorized' && action === 'authenticate') {\n this.onAuthenticated()\n } else if (status === 'unauthorized') {\n this.emit('error', new Error('Authentication failed'))\n this.shouldReconnect = false\n this.disconnect()\n }\n return\n }\n\n // Handle listening confirmation\n if (stream === 'listening') {\n // Successfully subscribed\n return\n }\n\n // Handle trade updates\n if (stream === 'trade_updates' && data) {\n this.emit('trade_update', data as unknown as TradeUpdate)\n return\n }\n }\n\n private onAuthenticated(): void {\n this.setState('connected')\n this.reconnectAttempts = 0\n this.emit('connected')\n\n // Process pending subscription\n if (this.pendingSubscribe) {\n this.pendingSubscribe = false\n this.doSubscribe()\n }\n }\n\n private send(message: object): void {\n if (this.ws?.readyState !== WebSocket.OPEN) {\n return\n }\n\n if (this.config.useMsgpack) {\n this.ws.send(encode(message))\n } else {\n this.ws.send(JSON.stringify(message))\n }\n }\n\n private scheduleReconnect(): void {\n this.clearReconnectTimer()\n this.setState('disconnected')\n\n const delay = Math.min(\n RECONNECT_INITIAL_DELAY * Math.pow(RECONNECT_BACKOFF_MULTIPLIER, this.reconnectAttempts),\n RECONNECT_MAX_DELAY\n )\n\n this.reconnectAttempts++\n\n // If we were subscribed, mark for re-subscription after reconnect\n if (this.isSubscribed) {\n this.pendingSubscribe = true\n this.isSubscribed = false\n }\n\n this.reconnectTimer = setTimeout(() => {\n this.doConnect()\n }, delay)\n }\n\n private clearReconnectTimer(): void {\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer)\n this.reconnectTimer = null\n }\n }\n\n private setState(state: StreamState): void {\n if (this.state !== state) {\n this.state = state\n }\n }\n}\n\n/**\n * Create a trade updates stream client.\n *\n * @param config - Stream configuration including API credentials\n * @returns Trade updates stream client\n *\n * @example\n * ```typescript\n * const stream = createTradeUpdatesStream({\n * keyId: 'your-api-key',\n * secretKey: 'your-api-secret',\n * paper: true, // true for paper trading, false for live\n * })\n *\n * stream.onTradeUpdate((update) => {\n * console.log(`Order ${update.event}: ${JSON.stringify(update.order)}`)\n * })\n *\n * stream.connect()\n * stream.subscribe()\n * ```\n */\nexport function createTradeUpdatesStream(config: StreamConfig): TradeUpdatesStream {\n const impl = new TradeUpdatesStreamImpl(config)\n\n return {\n connect: () => {\n impl.connect()\n },\n disconnect: () => {\n impl.disconnect()\n },\n isConnected: () => impl.isConnected(),\n subscribe: () => {\n impl.subscribe()\n },\n unsubscribe: () => {\n impl.unsubscribe()\n },\n onTradeUpdate: (handler) => {\n impl.onTradeUpdate(handler)\n },\n onConnect: (handler) => {\n impl.onConnect(handler)\n },\n onDisconnect: (handler) => {\n impl.onDisconnect(handler)\n },\n onError: (handler) => {\n impl.onError(handler)\n },\n }\n}\n","/**\n * Unified Alpaca client\n */\n\nimport type { AlpacaConfig } from '@luisjpf/core'\nimport { createTradingClient } from '@luisjpf/trading'\nimport type { TradingClient } from '@luisjpf/trading'\nimport { createBrokerClient } from '@luisjpf/broker'\nimport type { BrokerClient } from '@luisjpf/broker'\nimport { createMarketDataClient } from '@luisjpf/market-data'\nimport type { MarketDataClient } from '@luisjpf/market-data'\nimport {\n createStockStream,\n createCryptoStream,\n createTradeUpdatesStream,\n} from '@luisjpf/streaming'\nimport type { StockStream, CryptoStream, TradeUpdatesStream } from '@luisjpf/streaming'\n\nexport type AlpacaClientConfig = AlpacaConfig\n\nexport interface AlpacaClient {\n trading: TradingClient\n broker: BrokerClient\n marketData: MarketDataClient\n streams: {\n stocks: StockStream\n crypto: CryptoStream\n tradeUpdates: TradeUpdatesStream\n }\n}\n\n/**\n * Create a unified Alpaca client with all APIs\n */\nexport function createAlpacaClient(config: AlpacaClientConfig): AlpacaClient {\n const streamConfig = {\n keyId: config.keyId,\n secretKey: config.secretKey,\n paper: config.paper,\n }\n\n return {\n trading: createTradingClient(config),\n broker: createBrokerClient(config),\n marketData: createMarketDataClient(config),\n streams: {\n stocks: createStockStream(streamConfig),\n crypto: createCryptoStream(streamConfig),\n tradeUpdates: createTradeUpdatesStream(streamConfig),\n },\n }\n}\n"],"mappings":"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","names":["createClient","createClient","createClient","createClient","WebSocket","encode","decode","RECONNECT_INITIAL_DELAY","RECONNECT_MAX_DELAY","RECONNECT_BACKOFF_MULTIPLIER"]}
|
|
1
|
+
{"version":3,"sources":["../../core/src/errors.ts","../../core/src/auth.ts","../../core/src/client.ts","../../core/src/response.ts","../../trading/src/client.ts","../../market-data/src/client.ts","../../broker/src/client.ts","../../streaming/src/base-stream.ts","../../streaming/src/stock-stream.ts","../../streaming/src/crypto-stream.ts","../../streaming/src/trade-updates-stream.ts","../src/client.ts"],"sourcesContent":["/**\n * Typed error system for Alpaca SDK\n * Supports both class-based (instanceof) and discriminated union patterns\n */\n\n// =============================================================================\n// Error Type Constants (as const for type safety)\n// =============================================================================\n\nexport const ErrorType = {\n Authentication: 'authentication',\n Forbidden: 'forbidden',\n NotFound: 'not_found',\n Validation: 'validation',\n RateLimit: 'rate_limit',\n InsufficientFunds: 'insufficient_funds',\n MarketClosed: 'market_closed',\n Server: 'server',\n Unknown: 'unknown',\n} as const\n\nexport type ErrorType = (typeof ErrorType)[keyof typeof ErrorType]\n\n// =============================================================================\n// Discriminated Union Error Types (for Result pattern)\n// =============================================================================\n\ninterface BaseApiError {\n message: string\n code: number\n status: number\n requestId?: string\n}\n\nexport interface AuthenticationApiError extends BaseApiError {\n type: typeof ErrorType.Authentication\n status: 401\n}\n\nexport interface ForbiddenApiError extends BaseApiError {\n type: typeof ErrorType.Forbidden\n status: 403\n}\n\nexport interface NotFoundApiError extends BaseApiError {\n type: typeof ErrorType.NotFound\n status: 404\n}\n\nexport interface ValidationApiError extends BaseApiError {\n type: typeof ErrorType.Validation\n status: 422\n}\n\nexport interface RateLimitApiError extends BaseApiError {\n type: typeof ErrorType.RateLimit\n status: 429\n retryAfter?: number\n}\n\nexport interface InsufficientFundsApiError extends BaseApiError {\n type: typeof ErrorType.InsufficientFunds\n status: 403\n}\n\nexport interface MarketClosedApiError extends BaseApiError {\n type: typeof ErrorType.MarketClosed\n status: 403\n}\n\nexport interface ServerApiError extends BaseApiError {\n type: typeof ErrorType.Server\n status: number // 500+\n}\n\nexport interface UnknownApiError extends BaseApiError {\n type: typeof ErrorType.Unknown\n}\n\n/** Discriminated union of all API error types */\nexport type ApiError =\n | AuthenticationApiError\n | ForbiddenApiError\n | NotFoundApiError\n | ValidationApiError\n | RateLimitApiError\n | InsufficientFundsApiError\n | MarketClosedApiError\n | ServerApiError\n | UnknownApiError\n\n// =============================================================================\n// Result Type (for compile-time error handling)\n// =============================================================================\n\nexport type Result<T, E = ApiError> =\n | { ok: true; data: T; error?: never }\n | { ok: false; data?: never; error: E }\n\n/** Create a success result */\nexport function ok<T>(data: T): Result<T, never> {\n return { ok: true, data }\n}\n\n/** Create an error result */\nexport function err<E>(error: E): Result<never, E> {\n return { ok: false, error }\n}\n\n// =============================================================================\n// Error Classes (for instanceof pattern)\n// =============================================================================\n\n/** Base error class for all Alpaca errors */\nexport class AlpacaError extends Error {\n readonly type: ErrorType\n readonly code: number\n readonly status: number\n readonly requestId?: string\n\n constructor(message: string, type: ErrorType, code: number, status: number, requestId?: string) {\n super(message)\n this.name = 'AlpacaError'\n this.type = type\n this.code = code\n this.status = status\n this.requestId = requestId\n Object.setPrototypeOf(this, AlpacaError.prototype)\n }\n\n /** Convert to plain error object (for Result pattern) */\n toApiError(): ApiError {\n return {\n type: this.type,\n message: this.message,\n code: this.code,\n status: this.status,\n requestId: this.requestId,\n } as ApiError\n }\n}\n\n/** Authentication failed (401) */\nexport class AuthenticationError extends AlpacaError {\n declare readonly type: typeof ErrorType.Authentication\n declare readonly status: 401\n\n constructor(message: string, code: number, requestId?: string) {\n super(message, ErrorType.Authentication, code, 401, requestId)\n this.name = 'AuthenticationError'\n Object.setPrototypeOf(this, AuthenticationError.prototype)\n }\n}\n\n/** Forbidden - insufficient permissions (403) */\nexport class ForbiddenError extends AlpacaError {\n declare readonly type: typeof ErrorType.Forbidden\n declare readonly status: 403\n\n constructor(message: string, code: number, requestId?: string) {\n super(message, ErrorType.Forbidden, code, 403, requestId)\n this.name = 'ForbiddenError'\n Object.setPrototypeOf(this, ForbiddenError.prototype)\n }\n}\n\n/** Resource not found (404) */\nexport class NotFoundError extends AlpacaError {\n declare readonly type: typeof ErrorType.NotFound\n declare readonly status: 404\n\n constructor(message: string, code: number, requestId?: string) {\n super(message, ErrorType.NotFound, code, 404, requestId)\n this.name = 'NotFoundError'\n Object.setPrototypeOf(this, NotFoundError.prototype)\n }\n}\n\n/** Validation error (422) */\nexport class ValidationError extends AlpacaError {\n declare readonly type: typeof ErrorType.Validation\n declare readonly status: 422\n\n constructor(message: string, code: number, requestId?: string) {\n super(message, ErrorType.Validation, code, 422, requestId)\n this.name = 'ValidationError'\n Object.setPrototypeOf(this, ValidationError.prototype)\n }\n}\n\n/** Rate limit exceeded (429) */\nexport class RateLimitError extends AlpacaError {\n declare readonly type: typeof ErrorType.RateLimit\n declare readonly status: 429\n readonly retryAfter?: number\n\n constructor(message: string, code: number, requestId?: string, retryAfter?: number) {\n super(message, ErrorType.RateLimit, code, 429, requestId)\n this.name = 'RateLimitError'\n this.retryAfter = retryAfter\n Object.setPrototypeOf(this, RateLimitError.prototype)\n }\n\n override toApiError(): RateLimitApiError {\n return {\n type: ErrorType.RateLimit,\n message: this.message,\n code: this.code,\n status: 429,\n requestId: this.requestId,\n retryAfter: this.retryAfter,\n }\n }\n}\n\n/** Insufficient buying power */\nexport class InsufficientFundsError extends AlpacaError {\n declare readonly type: typeof ErrorType.InsufficientFunds\n declare readonly status: 403\n\n constructor(message: string, code: number, requestId?: string) {\n super(message, ErrorType.InsufficientFunds, code, 403, requestId)\n this.name = 'InsufficientFundsError'\n Object.setPrototypeOf(this, InsufficientFundsError.prototype)\n }\n}\n\n/** Market is closed */\nexport class MarketClosedError extends AlpacaError {\n declare readonly type: typeof ErrorType.MarketClosed\n declare readonly status: 403\n\n constructor(message: string, code: number, requestId?: string) {\n super(message, ErrorType.MarketClosed, code, 403, requestId)\n this.name = 'MarketClosedError'\n Object.setPrototypeOf(this, MarketClosedError.prototype)\n }\n}\n\n/** Internal server error (500+) */\nexport class ServerError extends AlpacaError {\n declare readonly type: typeof ErrorType.Server\n\n constructor(message: string, code: number, status: number, requestId?: string) {\n super(message, ErrorType.Server, code, status, requestId)\n this.name = 'ServerError'\n Object.setPrototypeOf(this, ServerError.prototype)\n }\n}\n\n/**\n * Feature not yet implemented (501)\n *\n * Used for features that are planned but not yet available,\n * such as WebSocket streaming in preview mode.\n */\nexport class NotImplementedError extends AlpacaError {\n readonly feature: string\n readonly docsUrl?: string\n\n constructor(feature: string, docsUrl?: string) {\n const message = docsUrl\n ? `${feature} is not yet implemented. See: ${docsUrl}`\n : `${feature} is not yet implemented. This feature is in development.`\n super(message, ErrorType.Unknown, 0, 501)\n this.name = 'NotImplementedError'\n this.feature = feature\n this.docsUrl = docsUrl\n Object.setPrototypeOf(this, NotImplementedError.prototype)\n }\n}\n\n// =============================================================================\n// Error Factory Functions\n// =============================================================================\n\n/**\n * Create appropriate error class instance from API response\n */\nexport function createAlpacaError(\n message: string,\n code: number,\n status: number,\n requestId?: string,\n retryAfter?: number\n): AlpacaError {\n switch (status) {\n case 401:\n return new AuthenticationError(message, code, requestId)\n case 403:\n if (message.toLowerCase().includes('insufficient')) {\n return new InsufficientFundsError(message, code, requestId)\n }\n if (message.toLowerCase().includes('market') && message.toLowerCase().includes('closed')) {\n return new MarketClosedError(message, code, requestId)\n }\n return new ForbiddenError(message, code, requestId)\n case 404:\n return new NotFoundError(message, code, requestId)\n case 422:\n return new ValidationError(message, code, requestId)\n case 429:\n return new RateLimitError(message, code, requestId, retryAfter)\n default:\n if (status >= 500) {\n return new ServerError(message, code, status, requestId)\n }\n return new AlpacaError(message, ErrorType.Unknown, code, status, requestId)\n }\n}\n\n/**\n * Create typed ApiError object from raw API response (for Result pattern)\n */\nexport function createApiError(\n message: string,\n code: number,\n status: number,\n requestId?: string,\n retryAfter?: number\n): ApiError {\n switch (status) {\n case 401:\n return { type: ErrorType.Authentication, message, code, status: 401, requestId }\n case 403:\n if (message.toLowerCase().includes('insufficient')) {\n return { type: ErrorType.InsufficientFunds, message, code, status: 403, requestId }\n }\n if (message.toLowerCase().includes('market') && message.toLowerCase().includes('closed')) {\n return { type: ErrorType.MarketClosed, message, code, status: 403, requestId }\n }\n return { type: ErrorType.Forbidden, message, code, status: 403, requestId }\n case 404:\n return { type: ErrorType.NotFound, message, code, status: 404, requestId }\n case 422:\n return { type: ErrorType.Validation, message, code, status: 422, requestId }\n case 429:\n return { type: ErrorType.RateLimit, message, code, status: 429, requestId, retryAfter }\n default:\n if (status >= 500) {\n return { type: ErrorType.Server, message, code, status, requestId }\n }\n return { type: ErrorType.Unknown, message, code, status, requestId }\n }\n}\n\n/**\n * Convert unknown error to typed ApiError\n */\nexport function toApiError(error: unknown): ApiError {\n if (error instanceof AlpacaError) {\n return error.toApiError()\n }\n\n if (error && typeof error === 'object') {\n const e = error as Record<string, unknown>\n const message = typeof e.message === 'string' ? e.message : 'Unknown error'\n const code = typeof e.code === 'number' ? e.code : 0\n const status = typeof e.status === 'number' ? e.status : 0\n const requestId = typeof e.requestId === 'string' ? e.requestId : undefined\n const retryAfter = typeof e.retryAfter === 'number' ? e.retryAfter : undefined\n\n return createApiError(message, code, status, requestId, retryAfter)\n }\n\n return {\n type: ErrorType.Unknown,\n message: error instanceof Error ? error.message : String(error),\n code: 0,\n status: 0,\n }\n}\n\n/**\n * Type guard to check if a value is an ApiError\n */\nexport function isApiError(value: unknown): value is ApiError {\n return (\n value !== null &&\n typeof value === 'object' &&\n 'type' in value &&\n 'message' in value &&\n 'code' in value &&\n 'status' in value\n )\n}\n\n/**\n * Type guards for specific error types\n */\nexport const isAuthenticationError = (e: ApiError): e is AuthenticationApiError =>\n e.type === ErrorType.Authentication\n\nexport const isRateLimitError = (e: ApiError): e is RateLimitApiError =>\n e.type === ErrorType.RateLimit\n\nexport const isNotFoundError = (e: ApiError): e is NotFoundApiError => e.type === ErrorType.NotFound\n\nexport const isValidationError = (e: ApiError): e is ValidationApiError =>\n e.type === ErrorType.Validation\n\nexport const isInsufficientFundsError = (e: ApiError): e is InsufficientFundsApiError =>\n e.type === ErrorType.InsufficientFunds\n\nexport const isMarketClosedError = (e: ApiError): e is MarketClosedApiError =>\n e.type === ErrorType.MarketClosed\n\nexport const isServerError = (e: ApiError): e is ServerApiError => e.type === ErrorType.Server\n","/**\n * Authentication strategies for Alpaca APIs\n */\n\n/**\n * Validates that a credential string is non-empty\n * @throws Error if the credential is empty or whitespace-only\n */\nfunction validateCredential(value: string, name: string): void {\n if (!value || typeof value !== 'string' || value.trim().length === 0) {\n throw new Error(`${name} cannot be empty`)\n }\n}\n\n/** Authentication headers for Trading/Market Data APIs */\nexport type ApiKeyAuth = {\n 'APCA-API-KEY-ID': string\n 'APCA-API-SECRET-KEY': string\n} & Record<string, string>\n\n/** Authentication header for Broker API (HTTP Basic) */\nexport type BasicAuth = {\n Authorization: string\n} & Record<string, string>\n\n/** Authentication header for OAuth */\nexport type OAuthAuth = {\n Authorization: string\n} & Record<string, string>\n\nexport type AuthHeaders = ApiKeyAuth | BasicAuth | OAuthAuth\n\n/**\n * Create API Key authentication headers\n * @throws Error if keyId or secretKey is empty\n */\nexport function createApiKeyAuth(keyId: string, secretKey: string): ApiKeyAuth {\n validateCredential(keyId, 'API Key ID')\n validateCredential(secretKey, 'Secret Key')\n return {\n 'APCA-API-KEY-ID': keyId,\n 'APCA-API-SECRET-KEY': secretKey,\n }\n}\n\n/**\n * Create HTTP Basic authentication header for Broker API\n * @throws Error if keyId or secretKey is empty\n */\nexport function createBasicAuth(keyId: string, secretKey: string): BasicAuth {\n validateCredential(keyId, 'API Key ID')\n validateCredential(secretKey, 'Secret Key')\n const credentials = btoa(`${keyId}:${secretKey}`)\n return {\n Authorization: `Basic ${credentials}`,\n }\n}\n\n/**\n * Create OAuth Bearer token header\n * @throws Error if token is empty\n */\nexport function createOAuthAuth(token: string): OAuthAuth {\n validateCredential(token, 'OAuth token')\n return {\n Authorization: `Bearer ${token}`,\n }\n}\n\n/**\n * WebSocket authentication message\n */\nexport interface WebSocketAuthMessage {\n action: 'auth'\n key: string\n secret: string\n}\n\n/**\n * Create WebSocket authentication message\n * @throws Error if keyId or secretKey is empty\n */\nexport function createWebSocketAuth(keyId: string, secretKey: string): WebSocketAuthMessage {\n validateCredential(keyId, 'API Key ID')\n validateCredential(secretKey, 'Secret Key')\n return {\n action: 'auth',\n key: keyId,\n secret: secretKey,\n }\n}\n\n/**\n * Create WebSocket OAuth authentication message\n * @throws Error if token is empty\n */\nexport function createWebSocketOAuth(token: string): WebSocketAuthMessage {\n validateCredential(token, 'OAuth token')\n return {\n action: 'auth',\n key: 'oauth',\n secret: token,\n }\n}\n","/**\n * Base HTTP client for Alpaca SDK\n */\n\nimport type { AlpacaConfig, ResolvedAlpacaConfig, RequestOptions } from './types'\nimport { createAlpacaError, AlpacaError } from './errors'\nimport { createApiKeyAuth, createBasicAuth } from './auth'\nimport type { AuthHeaders } from './auth'\n\n/** Base URLs for Alpaca APIs */\nexport const ALPACA_URLS = {\n trading: {\n paper: 'https://paper-api.alpaca.markets',\n live: 'https://api.alpaca.markets',\n },\n broker: {\n sandbox: 'https://broker-api.sandbox.alpaca.markets',\n live: 'https://broker-api.alpaca.markets',\n },\n marketData: 'https://data.alpaca.markets',\n stream: {\n data: 'wss://stream.data.alpaca.markets',\n trading: {\n paper: 'wss://paper-api.alpaca.markets/stream',\n live: 'wss://api.alpaca.markets/stream',\n },\n },\n} as const\n\n/** Default configuration values */\nconst DEFAULT_CONFIG = {\n paper: true,\n timeout: 30_000,\n maxRetries: 2,\n} as const\n\n/** Maximum retry backoff in milliseconds (5 minutes) to prevent DoS via malicious retry-after headers */\nconst MAX_RETRY_BACKOFF_MS = 5 * 60 * 1000\n\n/**\n * Resolve configuration with defaults\n */\nexport function resolveConfig(\n config: AlpacaConfig,\n apiType: 'trading' | 'broker' | 'marketData'\n): ResolvedAlpacaConfig {\n const paper = config.paper ?? DEFAULT_CONFIG.paper\n\n let baseUrl: string\n if (config.baseUrl) {\n baseUrl = config.baseUrl\n } else if (apiType === 'trading') {\n baseUrl = paper ? ALPACA_URLS.trading.paper : ALPACA_URLS.trading.live\n } else if (apiType === 'broker') {\n baseUrl = paper ? ALPACA_URLS.broker.sandbox : ALPACA_URLS.broker.live\n } else {\n baseUrl = ALPACA_URLS.marketData\n }\n\n return {\n keyId: config.keyId,\n secretKey: config.secretKey,\n paper,\n timeout: config.timeout ?? DEFAULT_CONFIG.timeout,\n maxRetries: config.maxRetries ?? DEFAULT_CONFIG.maxRetries,\n baseUrl,\n }\n}\n\n/**\n * Sleep utility for retry backoff\n */\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms))\n}\n\n/**\n * Calculate exponential backoff with jitter\n */\nfunction calculateBackoff(attempt: number, baseMs = 1000): number {\n const exponential = Math.min(baseMs * Math.pow(2, attempt), 30_000)\n const jitter = Math.random() * 1000\n return exponential + jitter\n}\n\n/**\n * Check if error is retryable\n */\nfunction isRetryable(status: number): boolean {\n return status === 429 || status >= 500\n}\n\ninterface AlpacaApiError {\n code: number\n message: string\n}\n\n/**\n * Base fetch client with retry logic\n */\nexport async function fetchWithRetry<T>(\n url: string,\n init: RequestInit,\n config: ResolvedAlpacaConfig,\n options?: RequestOptions\n): Promise<T> {\n const timeout = options?.timeout ?? config.timeout\n let lastError: AlpacaError | null = null\n\n for (let attempt = 0; attempt <= config.maxRetries; attempt++) {\n const controller = new AbortController()\n const timeoutId = setTimeout(() => {\n controller.abort()\n }, timeout)\n\n // Combine signals if user provided one\n const signal = options?.signal\n ? AbortSignal.any([options.signal, controller.signal])\n : controller.signal\n\n try {\n const response = await fetch(url, {\n ...init,\n signal,\n })\n\n clearTimeout(timeoutId)\n\n const requestId = response.headers.get('x-request-id') ?? undefined\n\n if (!response.ok) {\n const retryAfter = response.headers.get('retry-after')\n const retryAfterMs = retryAfter ? parseInt(retryAfter, 10) * 1000 : undefined\n\n let errorBody: AlpacaApiError\n try {\n errorBody = (await response.json()) as AlpacaApiError\n } catch (parseError) {\n // Only handle JSON parse errors (non-JSON responses like HTML error pages)\n // Re-throw other errors (network issues, memory errors, etc.)\n if (parseError instanceof SyntaxError) {\n errorBody = { code: 0, message: response.statusText }\n } else {\n throw parseError\n }\n }\n\n const error = createAlpacaError(\n errorBody.message,\n errorBody.code,\n response.status,\n requestId,\n retryAfterMs ? retryAfterMs / 1000 : undefined\n )\n\n if (isRetryable(response.status) && attempt < config.maxRetries) {\n lastError = error\n // Cap backoff to prevent DoS via malicious retry-after headers\n const rawBackoff = retryAfterMs ?? calculateBackoff(attempt)\n const backoff = Math.min(rawBackoff, MAX_RETRY_BACKOFF_MS)\n await sleep(backoff)\n continue\n }\n\n throw error\n }\n\n // Handle empty responses (204 No Content)\n // Note: Callers expecting 204 responses should type T to include undefined,\n // or use this function only for endpoints that don't return 204.\n if (response.status === 204) {\n return undefined as unknown as T\n }\n\n return (await response.json()) as T\n } catch (error) {\n clearTimeout(timeoutId)\n\n if (error instanceof AlpacaError) {\n throw error\n }\n\n if (error instanceof Error && error.name === 'AbortError') {\n throw new AlpacaError('Request timeout', 'unknown', 0, 408)\n }\n\n throw new AlpacaError(\n error instanceof Error ? error.message : 'Unknown error',\n 'unknown',\n 0,\n 0\n )\n }\n }\n\n throw lastError ?? new AlpacaError('Max retries exceeded', 'unknown', 0, 0)\n}\n\n/**\n * Create headers for API request\n */\nexport function createHeaders(auth: AuthHeaders, options?: RequestOptions): Record<string, string> {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n ...auth,\n }\n\n if (options?.idempotencyKey) {\n headers['Idempotency-Key'] = options.idempotencyKey\n }\n\n return headers\n}\n\n/**\n * Create a configured fetch function for a specific API\n */\nexport function createApiFetch(\n config: ResolvedAlpacaConfig,\n authType: 'apiKey' | 'basic' = 'apiKey'\n) {\n const auth =\n authType === 'basic'\n ? createBasicAuth(config.keyId, config.secretKey)\n : createApiKeyAuth(config.keyId, config.secretKey)\n\n return async function apiFetch<T>(\n path: string,\n init: RequestInit = {},\n options?: RequestOptions\n ): Promise<T> {\n const url = `${config.baseUrl}${path}`\n const headers = createHeaders(auth, options)\n\n return fetchWithRetry<T>(\n url,\n {\n ...init,\n headers: {\n ...headers,\n ...(init.headers as Record<string, string> | undefined),\n },\n },\n config,\n options\n )\n }\n}\n","/**\n * Response unwrap helpers for openapi-fetch responses\n *\n * These helpers provide type-safe error handling by:\n * 1. Converting openapi-fetch errors to AlpacaError instances\n * 2. Extracting request metadata (requestId, retryAfter) from headers\n * 3. Throwing explicit errors for unexpected null data\n */\n\nimport { createAlpacaError, AlpacaError } from './errors'\n\n/**\n * Response shape from openapi-fetch\n */\nexport interface OpenApiFetchResponse<T> {\n data?: T\n error?: unknown\n response: Response\n}\n\n/**\n * Error object shape from Alpaca API\n */\ninterface AlpacaApiErrorBody {\n message?: string\n code?: number\n}\n\n/**\n * Creates an AlpacaError from an openapi-fetch error response\n */\nfunction createAlpacaErrorFromResponse(error: unknown, response: Response): AlpacaError {\n const requestId = response.headers.get('x-request-id') ?? undefined\n const retryAfterHeader = response.headers.get('retry-after')\n const retryAfter = retryAfterHeader ? parseInt(retryAfterHeader, 10) : undefined\n\n // Extract error details from the error object\n const errorObj = error as AlpacaApiErrorBody\n const message = errorObj?.message ?? 'Unknown API error'\n const code = errorObj?.code ?? 0\n const status = response.status\n\n return createAlpacaError(message, code, status, requestId, retryAfter)\n}\n\n/**\n * Unwraps an openapi-fetch response, converting errors to AlpacaError.\n *\n * Use this for endpoints that return a single object.\n * Throws if data is null/undefined (unexpected empty response).\n *\n * @example\n * ```typescript\n * const result = await client.GET('/v2/account', { signal })\n * return unwrap(result)\n * ```\n */\nexport function unwrap<T>(result: OpenApiFetchResponse<T>): T {\n if (result.error) {\n throw createAlpacaErrorFromResponse(result.error, result.response)\n }\n\n if (result.data === undefined || result.data === null) {\n throw new AlpacaError(\n 'Unexpected empty response from API',\n 'unknown',\n 0,\n result.response.status\n )\n }\n\n return result.data\n}\n\n/**\n * Unwraps an openapi-fetch response for list endpoints.\n *\n * Returns empty array if data is null/undefined (common for empty results).\n * This is intentional - list endpoints often return null for empty results.\n *\n * @example\n * ```typescript\n * const result = await client.GET('/v2/orders', { params: { query: params } })\n * return unwrapList(result)\n * ```\n */\nexport function unwrapList<T>(result: OpenApiFetchResponse<T[] | null>): T[] {\n if (result.error) {\n throw createAlpacaErrorFromResponse(result.error, result.response)\n }\n\n return result.data ?? []\n}\n\n/**\n * Unwraps an openapi-fetch response, allowing undefined data.\n *\n * Use this for endpoints where null/undefined is a valid response\n * (e.g., optional resources, 204 No Content).\n *\n * @example\n * ```typescript\n * const result = await client.GET('/v2/optional-resource', { signal })\n * return unwrapOptional(result) // T | undefined\n * ```\n */\nexport function unwrapOptional<T>(result: OpenApiFetchResponse<T>): T | undefined {\n if (result.error) {\n throw createAlpacaErrorFromResponse(result.error, result.response)\n }\n\n return result.data\n}\n","/**\n * Trading API client factory\n */\n\nimport createClient from 'openapi-fetch'\nimport {\n type AlpacaConfig,\n resolveConfig,\n createApiKeyAuth,\n type RequestOptions,\n unwrap,\n unwrapList,\n unwrapOptional,\n} from '@luisjpf/core'\nimport type { paths, components, operations } from './generated/trading-api'\n\n// Re-export schema types for consumers\nexport type Account = components['schemas']['Account']\nexport type Order = components['schemas']['Order']\nexport type Position = components['schemas']['Position']\nexport type Clock = components['schemas']['Clock']\nexport type Calendar = components['schemas']['Calendar']\nexport type Watchlist = components['schemas']['Watchlist']\nexport type PortfolioHistory = components['schemas']['PortfolioHistory']\nexport type AccountConfigurations = components['schemas']['AccountConfigurations']\n\n// Asset type from the Assets schema\nexport type Asset = components['schemas']['Assets']\n\n// Activity types - union of trading and non-trade activities\nexport type TradingActivity = components['schemas']['TradingActivities']\nexport type NonTradeActivity = components['schemas']['NonTradeActivities']\nexport type AccountActivity = TradingActivity | NonTradeActivity\n\n// Order-related types\nexport type OrderSide = components['schemas']['OrderSide']\nexport type OrderType = components['schemas']['OrderType']\nexport type TimeInForce = components['schemas']['TimeInForce']\nexport type OrderClass = components['schemas']['OrderClass']\n\n// Derive OrderRequest from the POST /v2/orders operation\nexport type OrderRequest = NonNullable<\n operations['postOrder']['requestBody']\n>['content']['application/json']\n\n// Derive PatchOrderRequest from schema\nexport type PatchOrderRequest = components['schemas']['PatchOrderRequest']\n\nexport type TradingClientConfig = AlpacaConfig\n\n/**\n * Create a Trading API client\n */\nexport function createTradingClient(config: TradingClientConfig) {\n const resolvedConfig = resolveConfig(config, 'trading')\n const auth = createApiKeyAuth(resolvedConfig.keyId, resolvedConfig.secretKey)\n\n const client = createClient<paths>({\n baseUrl: resolvedConfig.baseUrl,\n headers: auth,\n })\n\n return {\n /** Raw openapi-fetch client for advanced usage */\n raw: client,\n\n /** Account operations */\n account: {\n /** Get account information */\n async get(options?: RequestOptions) {\n return unwrap(\n await client.GET('/v2/account', {\n signal: options?.signal,\n })\n )\n },\n\n /** Get account configurations */\n async getConfigurations(options?: RequestOptions) {\n return unwrap(\n await client.GET('/v2/account/configurations', {\n signal: options?.signal,\n })\n )\n },\n\n /** Update account configurations */\n async updateConfigurations(\n updates: Partial<AccountConfigurations>,\n options?: RequestOptions\n ) {\n return unwrap(\n await client.PATCH('/v2/account/configurations', {\n body: updates,\n signal: options?.signal,\n })\n )\n },\n\n /** Get account activities */\n async getActivities(\n params?: operations['getAccountActivities']['parameters']['query'],\n options?: RequestOptions\n ) {\n return unwrapList(\n await client.GET('/v2/account/activities', {\n params: { query: params },\n signal: options?.signal,\n })\n )\n },\n\n /** Get portfolio history */\n async getPortfolioHistory(\n params?: operations['getAccountPortfolioHistory']['parameters']['query'],\n options?: RequestOptions\n ) {\n return unwrap(\n await client.GET('/v2/account/portfolio/history', {\n params: { query: params },\n signal: options?.signal,\n })\n )\n },\n },\n\n /** Order operations */\n orders: {\n /** List all orders */\n async list(\n params?: operations['getAllOrders']['parameters']['query'],\n options?: RequestOptions\n ) {\n return unwrapList(\n await client.GET('/v2/orders', {\n params: { query: params },\n signal: options?.signal,\n })\n )\n },\n\n /** Get order by ID */\n async get(orderId: string, options?: RequestOptions) {\n return unwrap(\n await client.GET('/v2/orders/{order_id}', {\n params: { path: { order_id: orderId } },\n signal: options?.signal,\n })\n )\n },\n\n /** Get order by client order ID */\n async getByClientOrderId(clientOrderId: string, options?: RequestOptions) {\n return unwrap(\n await client.GET('/v2/orders:by_client_order_id', {\n params: { query: { client_order_id: clientOrderId } },\n signal: options?.signal,\n })\n )\n },\n\n /** Create a new order */\n async create(order: OrderRequest, options?: RequestOptions) {\n return unwrap(\n await client.POST('/v2/orders', {\n body: order,\n signal: options?.signal,\n })\n )\n },\n\n /** Replace an existing order */\n async replace(orderId: string, updates: PatchOrderRequest, options?: RequestOptions) {\n return unwrap(\n await client.PATCH('/v2/orders/{order_id}', {\n params: { path: { order_id: orderId } },\n body: updates,\n signal: options?.signal,\n })\n )\n },\n\n /** Cancel an order */\n async cancel(orderId: string, options?: RequestOptions) {\n unwrapOptional(\n await client.DELETE('/v2/orders/{order_id}', {\n params: { path: { order_id: orderId } },\n signal: options?.signal,\n })\n )\n },\n\n /** Cancel all open orders */\n async cancelAll(options?: RequestOptions) {\n return unwrapList(\n await client.DELETE('/v2/orders', {\n signal: options?.signal,\n })\n )\n },\n },\n\n /** Position operations */\n positions: {\n /** List all open positions */\n async list(options?: RequestOptions) {\n return unwrapList(\n await client.GET('/v2/positions', {\n signal: options?.signal,\n })\n )\n },\n\n /** Get position by symbol or asset ID */\n async get(symbolOrAssetId: string, options?: RequestOptions) {\n return unwrap(\n await client.GET('/v2/positions/{symbol_or_asset_id}', {\n params: { path: { symbol_or_asset_id: symbolOrAssetId } },\n signal: options?.signal,\n })\n )\n },\n\n /** Close a position */\n async close(\n symbolOrAssetId: string,\n params?: operations['deleteOpenPosition']['parameters']['query'],\n options?: RequestOptions\n ) {\n return unwrap(\n await client.DELETE('/v2/positions/{symbol_or_asset_id}', {\n params: {\n path: { symbol_or_asset_id: symbolOrAssetId },\n query: params,\n },\n signal: options?.signal,\n })\n )\n },\n\n /** Close all positions */\n async closeAll(\n params?: operations['deleteAllOpenPositions']['parameters']['query'],\n options?: RequestOptions\n ) {\n return unwrapList(\n await client.DELETE('/v2/positions', {\n params: { query: params },\n signal: options?.signal,\n })\n )\n },\n },\n\n /** Asset operations */\n assets: {\n /** List all assets */\n async list(\n params?: operations['get-v2-assets']['parameters']['query'],\n options?: RequestOptions\n ) {\n return unwrapList(\n await client.GET('/v2/assets', {\n params: { query: params },\n signal: options?.signal,\n })\n )\n },\n\n /** Get asset by symbol or ID */\n async get(symbolOrAssetId: string, options?: RequestOptions) {\n return unwrap(\n await client.GET('/v2/assets/{symbol_or_asset_id}', {\n params: { path: { symbol_or_asset_id: symbolOrAssetId } },\n signal: options?.signal,\n })\n )\n },\n },\n\n /** Clock operations */\n clock: {\n /** Get market clock */\n async get(options?: RequestOptions) {\n return unwrap(\n await client.GET('/v2/clock', {\n signal: options?.signal,\n })\n )\n },\n },\n\n /** Calendar operations */\n calendar: {\n /** Get market calendar */\n async get(\n params?: operations['getCalendar']['parameters']['query'],\n options?: RequestOptions\n ) {\n return unwrapList(\n await client.GET('/v2/calendar', {\n params: { query: params },\n signal: options?.signal,\n })\n )\n },\n },\n\n /** Watchlist operations */\n watchlists: {\n /** List all watchlists */\n async list(options?: RequestOptions) {\n return unwrapList(\n await client.GET('/v2/watchlists', {\n signal: options?.signal,\n })\n )\n },\n\n /** Get watchlist by ID */\n async get(watchlistId: string, options?: RequestOptions) {\n return unwrap(\n await client.GET('/v2/watchlists/{watchlist_id}', {\n params: { path: { watchlist_id: watchlistId } },\n signal: options?.signal,\n })\n )\n },\n\n /** Create a new watchlist */\n async create(params: { name: string; symbols?: string[] }, options?: RequestOptions) {\n return unwrap(\n await client.POST('/v2/watchlists', {\n body: { name: params.name, symbols: params.symbols ?? [] },\n signal: options?.signal,\n })\n )\n },\n\n /** Update a watchlist */\n async update(\n watchlistId: string,\n params: { name: string; symbols?: string[] },\n options?: RequestOptions\n ) {\n return unwrap(\n await client.PUT('/v2/watchlists/{watchlist_id}', {\n params: { path: { watchlist_id: watchlistId } },\n body: { name: params.name, symbols: params.symbols ?? [] },\n signal: options?.signal,\n })\n )\n },\n\n /** Add symbol to watchlist */\n async addSymbol(watchlistId: string, symbol: string, options?: RequestOptions) {\n return unwrap(\n await client.POST('/v2/watchlists/{watchlist_id}', {\n params: { path: { watchlist_id: watchlistId } },\n body: { symbol },\n signal: options?.signal,\n })\n )\n },\n\n /** Remove symbol from watchlist */\n async removeSymbol(watchlistId: string, symbol: string, options?: RequestOptions) {\n return unwrap(\n await client.DELETE('/v2/watchlists/{watchlist_id}/{symbol}', {\n params: { path: { watchlist_id: watchlistId, symbol } },\n signal: options?.signal,\n })\n )\n },\n\n /** Delete a watchlist */\n async delete(watchlistId: string, options?: RequestOptions) {\n unwrapOptional(\n await client.DELETE('/v2/watchlists/{watchlist_id}', {\n params: { path: { watchlist_id: watchlistId } },\n signal: options?.signal,\n })\n )\n },\n },\n }\n}\n\n/** Type inference helper for the trading client */\nexport type TradingClient = ReturnType<typeof createTradingClient>\n","/**\n * Market Data API client factory\n */\n\nimport createClient from 'openapi-fetch'\nimport {\n type AlpacaConfig,\n resolveConfig,\n createApiKeyAuth,\n type RequestOptions,\n unwrap,\n} from '@luisjpf/core'\nimport type { paths, components, operations } from './generated/market-data-api'\n\n// Stock data types\nexport type StockBar = components['schemas']['stock_bar']\nexport type StockTrade = components['schemas']['stock_trade']\nexport type StockQuote = components['schemas']['stock_quote']\nexport type StockSnapshot = components['schemas']['stock_snapshot']\nexport type StockAuction = components['schemas']['stock_auction']\n\n// Crypto data types\nexport type CryptoBar = components['schemas']['crypto_bar']\nexport type CryptoTrade = components['schemas']['crypto_trade']\nexport type CryptoQuote = components['schemas']['crypto_quote']\nexport type CryptoSnapshot = components['schemas']['crypto_snapshot']\nexport type CryptoOrderbook = components['schemas']['crypto_orderbook']\n\n// Options data types\nexport type OptionBar = components['schemas']['option_bar']\nexport type OptionTrade = components['schemas']['option_trade']\nexport type OptionQuote = components['schemas']['option_quote']\nexport type OptionSnapshot = components['schemas']['option_snapshot']\nexport type OptionGreeks = components['schemas']['option_greeks']\n\n// News types\nexport type News = components['schemas']['news']\nexport type NewsImage = components['schemas']['news_image']\n\n// Screener types\nexport type MostActive = components['schemas']['most_active']\nexport type Mover = components['schemas']['mover']\n\n// Corporate actions\nexport type CorporateActions = components['schemas']['corporate_actions']\n\nexport type MarketDataClientConfig = AlpacaConfig\n\n/**\n * Create a Market Data API client\n */\nexport function createMarketDataClient(config: MarketDataClientConfig) {\n const resolvedConfig = resolveConfig(config, 'marketData')\n const auth = createApiKeyAuth(resolvedConfig.keyId, resolvedConfig.secretKey)\n\n const client = createClient<paths>({\n baseUrl: resolvedConfig.baseUrl,\n headers: auth,\n })\n\n return {\n /** Raw openapi-fetch client for advanced usage */\n raw: client,\n\n /** Stock market data operations */\n stocks: {\n /** Get historical bars for multiple symbols */\n async getBars(\n params: operations['StockBars']['parameters']['query'],\n options?: RequestOptions\n ) {\n return unwrap(\n await client.GET('/v2/stocks/bars', {\n params: { query: params },\n signal: options?.signal,\n })\n )\n },\n\n /** Get historical bars for a single symbol */\n async getSymbolBars(\n symbol: string,\n params: NonNullable<operations['StockBarSingle']['parameters']['query']>,\n options?: RequestOptions\n ) {\n return unwrap(\n await client.GET('/v2/stocks/{symbol}/bars', {\n params: { path: { symbol }, query: params },\n signal: options?.signal,\n })\n )\n },\n\n /** Get latest bars for multiple symbols */\n async getLatestBars(\n params: operations['StockLatestBars']['parameters']['query'],\n options?: RequestOptions\n ) {\n return unwrap(\n await client.GET('/v2/stocks/bars/latest', {\n params: { query: params },\n signal: options?.signal,\n })\n )\n },\n\n /** Get latest bar for a single symbol */\n async getLatestBar(\n symbol: string,\n params?: Omit<\n NonNullable<operations['StockLatestBarSingle']['parameters']['query']>,\n 'symbol'\n >,\n options?: RequestOptions\n ) {\n return unwrap(\n await client.GET('/v2/stocks/{symbol}/bars/latest', {\n params: { path: { symbol }, query: params },\n signal: options?.signal,\n })\n )\n },\n\n /** Get historical trades for multiple symbols */\n async getTrades(\n params: operations['StockTrades']['parameters']['query'],\n options?: RequestOptions\n ) {\n return unwrap(\n await client.GET('/v2/stocks/trades', {\n params: { query: params },\n signal: options?.signal,\n })\n )\n },\n\n /** Get historical trades for a single symbol */\n async getSymbolTrades(\n symbol: string,\n params?: Omit<NonNullable<operations['StockTradeSingle']['parameters']['query']>, 'symbol'>,\n options?: RequestOptions\n ) {\n return unwrap(\n await client.GET('/v2/stocks/{symbol}/trades', {\n params: { path: { symbol }, query: params },\n signal: options?.signal,\n })\n )\n },\n\n /** Get latest trades for multiple symbols */\n async getLatestTrades(\n params: operations['StockLatestTrades']['parameters']['query'],\n options?: RequestOptions\n ) {\n return unwrap(\n await client.GET('/v2/stocks/trades/latest', {\n params: { query: params },\n signal: options?.signal,\n })\n )\n },\n\n /** Get latest trade for a single symbol */\n async getLatestTrade(\n symbol: string,\n params?: Omit<\n NonNullable<operations['StockLatestTradeSingle']['parameters']['query']>,\n 'symbol'\n >,\n options?: RequestOptions\n ) {\n return unwrap(\n await client.GET('/v2/stocks/{symbol}/trades/latest', {\n params: { path: { symbol }, query: params },\n signal: options?.signal,\n })\n )\n },\n\n /** Get historical quotes for multiple symbols */\n async getQuotes(\n params: operations['StockQuotes']['parameters']['query'],\n options?: RequestOptions\n ) {\n return unwrap(\n await client.GET('/v2/stocks/quotes', {\n params: { query: params },\n signal: options?.signal,\n })\n )\n },\n\n /** Get historical quotes for a single symbol */\n async getSymbolQuotes(\n symbol: string,\n params?: Omit<NonNullable<operations['StockQuoteSingle']['parameters']['query']>, 'symbol'>,\n options?: RequestOptions\n ) {\n return unwrap(\n await client.GET('/v2/stocks/{symbol}/quotes', {\n params: { path: { symbol }, query: params },\n signal: options?.signal,\n })\n )\n },\n\n /** Get latest quotes for multiple symbols */\n async getLatestQuotes(\n params: operations['StockLatestQuotes']['parameters']['query'],\n options?: RequestOptions\n ) {\n return unwrap(\n await client.GET('/v2/stocks/quotes/latest', {\n params: { query: params },\n signal: options?.signal,\n })\n )\n },\n\n /** Get latest quote for a single symbol */\n async getLatestQuote(\n symbol: string,\n params?: Omit<\n NonNullable<operations['StockLatestQuoteSingle']['parameters']['query']>,\n 'symbol'\n >,\n options?: RequestOptions\n ) {\n return unwrap(\n await client.GET('/v2/stocks/{symbol}/quotes/latest', {\n params: { path: { symbol }, query: params },\n signal: options?.signal,\n })\n )\n },\n\n /** Get snapshots for multiple symbols */\n async getSnapshots(\n params: operations['StockSnapshots']['parameters']['query'],\n options?: RequestOptions\n ) {\n return unwrap(\n await client.GET('/v2/stocks/snapshots', {\n params: { query: params },\n signal: options?.signal,\n })\n )\n },\n\n /** Get snapshot for a single symbol */\n async getSnapshot(\n symbol: string,\n params?: operations['StockSnapshotSingle']['parameters']['query'],\n options?: RequestOptions\n ) {\n return unwrap(\n await client.GET('/v2/stocks/{symbol}/snapshot', {\n params: { path: { symbol }, query: params },\n signal: options?.signal,\n })\n )\n },\n\n /** Get auctions for multiple symbols */\n async getAuctions(\n params: operations['StockAuctions']['parameters']['query'],\n options?: RequestOptions\n ) {\n return unwrap(\n await client.GET('/v2/stocks/auctions', {\n params: { query: params },\n signal: options?.signal,\n })\n )\n },\n\n /** Get auctions for a single symbol */\n async getSymbolAuctions(\n symbol: string,\n params?: Omit<\n NonNullable<operations['StockAuctionSingle']['parameters']['query']>,\n 'symbol'\n >,\n options?: RequestOptions\n ) {\n return unwrap(\n await client.GET('/v2/stocks/{symbol}/auctions', {\n params: { path: { symbol }, query: params },\n signal: options?.signal,\n })\n )\n },\n\n /** Get exchange code mappings */\n async getExchanges(options?: RequestOptions) {\n return unwrap(\n await client.GET('/v2/stocks/meta/exchanges', {\n signal: options?.signal,\n })\n )\n },\n\n /** Get condition code mappings */\n async getConditions(\n ticktype: 'trade' | 'quote',\n params: NonNullable<operations['StockMetaConditions']['parameters']['query']>,\n options?: RequestOptions\n ) {\n return unwrap(\n await client.GET('/v2/stocks/meta/conditions/{ticktype}', {\n params: { path: { ticktype }, query: params },\n signal: options?.signal,\n })\n )\n },\n },\n\n /** Crypto market data operations */\n crypto: {\n /** Get historical bars */\n async getBars(\n loc: 'us' | 'us-1' | 'eu-1',\n params: operations['CryptoBars']['parameters']['query'],\n options?: RequestOptions\n ) {\n return unwrap(\n await client.GET('/v1beta3/crypto/{loc}/bars', {\n params: { path: { loc }, query: params },\n signal: options?.signal,\n })\n )\n },\n\n /** Get latest bars */\n async getLatestBars(\n loc: 'us' | 'us-1' | 'eu-1',\n params: operations['CryptoLatestBars']['parameters']['query'],\n options?: RequestOptions\n ) {\n return unwrap(\n await client.GET('/v1beta3/crypto/{loc}/latest/bars', {\n params: { path: { loc }, query: params },\n signal: options?.signal,\n })\n )\n },\n\n /** Get historical trades */\n async getTrades(\n loc: 'us' | 'us-1' | 'eu-1',\n params: operations['CryptoTrades']['parameters']['query'],\n options?: RequestOptions\n ) {\n return unwrap(\n await client.GET('/v1beta3/crypto/{loc}/trades', {\n params: { path: { loc }, query: params },\n signal: options?.signal,\n })\n )\n },\n\n /** Get latest trades */\n async getLatestTrades(\n loc: 'us' | 'us-1' | 'eu-1',\n params: operations['CryptoLatestTrades']['parameters']['query'],\n options?: RequestOptions\n ) {\n return unwrap(\n await client.GET('/v1beta3/crypto/{loc}/latest/trades', {\n params: { path: { loc }, query: params },\n signal: options?.signal,\n })\n )\n },\n\n /** Get historical quotes */\n async getQuotes(\n loc: 'us' | 'us-1' | 'eu-1',\n params: operations['CryptoQuotes']['parameters']['query'],\n options?: RequestOptions\n ) {\n return unwrap(\n await client.GET('/v1beta3/crypto/{loc}/quotes', {\n params: { path: { loc }, query: params },\n signal: options?.signal,\n })\n )\n },\n\n /** Get latest quotes */\n async getLatestQuotes(\n loc: 'us' | 'us-1' | 'eu-1',\n params: operations['CryptoLatestQuotes']['parameters']['query'],\n options?: RequestOptions\n ) {\n return unwrap(\n await client.GET('/v1beta3/crypto/{loc}/latest/quotes', {\n params: { path: { loc }, query: params },\n signal: options?.signal,\n })\n )\n },\n\n /** Get snapshots */\n async getSnapshots(\n loc: 'us' | 'us-1' | 'eu-1',\n params: operations['CryptoSnapshots']['parameters']['query'],\n options?: RequestOptions\n ) {\n return unwrap(\n await client.GET('/v1beta3/crypto/{loc}/snapshots', {\n params: { path: { loc }, query: params },\n signal: options?.signal,\n })\n )\n },\n\n /** Get latest orderbooks */\n async getLatestOrderbooks(\n loc: 'us' | 'us-1' | 'eu-1',\n params: operations['CryptoLatestOrderbooks']['parameters']['query'],\n options?: RequestOptions\n ) {\n return unwrap(\n await client.GET('/v1beta3/crypto/{loc}/latest/orderbooks', {\n params: { path: { loc }, query: params },\n signal: options?.signal,\n })\n )\n },\n },\n\n /** Options market data operations */\n options: {\n /** Get historical bars */\n async getBars(\n params: operations['optionBars']['parameters']['query'],\n options?: RequestOptions\n ) {\n return unwrap(\n await client.GET('/v1beta1/options/bars', {\n params: { query: params },\n signal: options?.signal,\n })\n )\n },\n\n /** Get historical trades */\n async getTrades(\n params: operations['OptionTrades']['parameters']['query'],\n options?: RequestOptions\n ) {\n return unwrap(\n await client.GET('/v1beta1/options/trades', {\n params: { query: params },\n signal: options?.signal,\n })\n )\n },\n\n /** Get latest trades */\n async getLatestTrades(\n params: operations['OptionLatestTrades']['parameters']['query'],\n options?: RequestOptions\n ) {\n return unwrap(\n await client.GET('/v1beta1/options/trades/latest', {\n params: { query: params },\n signal: options?.signal,\n })\n )\n },\n\n /** Get latest quotes */\n async getLatestQuotes(\n params: operations['OptionLatestQuotes']['parameters']['query'],\n options?: RequestOptions\n ) {\n return unwrap(\n await client.GET('/v1beta1/options/quotes/latest', {\n params: { query: params },\n signal: options?.signal,\n })\n )\n },\n\n /** Get snapshots for multiple symbols */\n async getSnapshots(\n params: operations['OptionSnapshots']['parameters']['query'],\n options?: RequestOptions\n ) {\n return unwrap(\n await client.GET('/v1beta1/options/snapshots', {\n params: { query: params },\n signal: options?.signal,\n })\n )\n },\n\n /** Get option chain for underlying symbol */\n async getChain(\n underlyingSymbol: string,\n params?: operations['OptionChain']['parameters']['query'],\n options?: RequestOptions\n ) {\n return unwrap(\n await client.GET('/v1beta1/options/snapshots/{underlying_symbol}', {\n params: { path: { underlying_symbol: underlyingSymbol }, query: params },\n signal: options?.signal,\n })\n )\n },\n\n /** Get exchange code mappings */\n async getExchanges(options?: RequestOptions) {\n return unwrap(\n await client.GET('/v1beta1/options/meta/exchanges', {\n signal: options?.signal,\n })\n )\n },\n\n /** Get condition code mappings */\n async getConditions(ticktype: 'trade' | 'quote', options?: RequestOptions) {\n return unwrap(\n await client.GET('/v1beta1/options/meta/conditions/{ticktype}', {\n params: { path: { ticktype } },\n signal: options?.signal,\n })\n )\n },\n },\n\n /** News operations */\n news: {\n /** Get news articles */\n async get(params?: operations['News']['parameters']['query'], options?: RequestOptions) {\n return unwrap(\n await client.GET('/v1beta1/news', {\n params: { query: params },\n signal: options?.signal,\n })\n )\n },\n },\n\n /** Screener operations */\n screener: {\n /** Get most active stocks */\n async getMostActives(\n params?: operations['MostActives']['parameters']['query'],\n options?: RequestOptions\n ) {\n return unwrap(\n await client.GET('/v1beta1/screener/stocks/most-actives', {\n params: { query: params },\n signal: options?.signal,\n })\n )\n },\n\n /** Get market movers */\n async getMovers(\n marketType: 'stocks' | 'crypto',\n params?: operations['Movers']['parameters']['query'],\n options?: RequestOptions\n ) {\n return unwrap(\n await client.GET('/v1beta1/screener/{market_type}/movers', {\n params: { path: { market_type: marketType }, query: params },\n signal: options?.signal,\n })\n )\n },\n },\n\n /** Corporate actions */\n corporateActions: {\n /** Get corporate actions */\n async get(\n params: operations['CorporateActions']['parameters']['query'],\n options?: RequestOptions\n ) {\n return unwrap(\n await client.GET('/v1/corporate-actions', {\n params: { query: params },\n signal: options?.signal,\n })\n )\n },\n },\n\n /** Forex operations */\n forex: {\n /** Get latest forex rates */\n async getLatestRates(\n params: operations['LatestRates']['parameters']['query'],\n options?: RequestOptions\n ) {\n return unwrap(\n await client.GET('/v1beta1/forex/latest/rates', {\n params: { query: params },\n signal: options?.signal,\n })\n )\n },\n\n /** Get historical forex rates */\n async getRates(params: operations['Rates']['parameters']['query'], options?: RequestOptions) {\n return unwrap(\n await client.GET('/v1beta1/forex/rates', {\n params: { query: params },\n signal: options?.signal,\n })\n )\n },\n },\n\n /** Logo operations */\n logos: {\n /** Get company logo */\n async get(\n symbol: string,\n params?: operations['Logos']['parameters']['query'],\n options?: RequestOptions\n ) {\n return unwrap(\n await client.GET('/v1beta1/logos/{symbol}', {\n params: { path: { symbol }, query: params },\n signal: options?.signal,\n })\n )\n },\n },\n }\n}\n\n/** Type inference helper for the market data client */\nexport type MarketDataClient = ReturnType<typeof createMarketDataClient>\n","/**\n * Broker API client factory\n */\n\nimport createClient from 'openapi-fetch'\nimport {\n type AlpacaConfig,\n resolveConfig,\n createBasicAuth,\n type RequestOptions,\n unwrap,\n unwrapList,\n unwrapOptional,\n} from '@luisjpf/core'\nimport type { paths, components, operations } from './generated/broker-api'\n\n// Account types\nexport type Account = components['schemas']['Account']\nexport type AccountExtended = components['schemas']['AccountExtended']\nexport type TradeAccount = components['schemas']['TradeAccount']\nexport type AccountStatus = components['schemas']['AccountStatus']\nexport type AccountConfigurations = components['schemas']['AccountConfigurations']\nexport type AccountCreationRequest = components['schemas']['AccountCreationRequest']\nexport type AccountUpdateRequest = components['schemas']['AccountUpdateRequest']\n\n// Activity types\nexport type Activity = components['schemas']['Activity']\nexport type TradeActivity = components['schemas']['TradeActivity']\nexport type NonTradeActivity = components['schemas']['NonTradeActivity']\nexport type ActivityType = components['schemas']['ActivityType']\n\n// Order types\nexport type Order = components['schemas']['Order']\nexport type CreateOrderRequest = components['schemas']['CreateOrderRequest']\nexport type OrderSide = components['schemas']['OrderSide']\nexport type OrderType = components['schemas']['OrderType']\nexport type TimeInForce = components['schemas']['TimeInForce']\nexport type OrderClass = components['schemas']['OrderClass']\nexport type OrderStatus = components['schemas']['OrderStatus']\n\n// Position types\nexport type Position = components['schemas']['Position']\n\n// Transfer types\nexport type Transfer = components['schemas']['Transfer']\nexport type CreateTransferRequest = components['schemas']['CreateTransferRequest']\nexport type TransferDirection = components['schemas']['TransferDirection']\nexport type TransferType = components['schemas']['TransferType']\n\n// ACH types\nexport type ACHRelationship = components['schemas']['ACHRelationship']\nexport type CreateACHRelationshipRequest = components['schemas']['CreateACHRelationshipRequest']\n\n// Document types\nexport type AccountDocument = components['schemas']['AccountDocument']\nexport type OwnerDocument = components['schemas']['OwnerDocument']\n\n// Identity types\nexport type Contact = components['schemas']['Contact']\nexport type Identity = components['schemas']['Identity']\nexport type Disclosures = components['schemas']['Disclosures']\nexport type TrustedContact = components['schemas']['TrustedContact']\n\n// Calendar and Clock\nexport type Calendar = components['schemas']['Calendar']\nexport type Clock = components['schemas']['Clock']\n\nexport type BrokerClientConfig = AlpacaConfig\n\n/**\n * Create a Broker API client\n */\nexport function createBrokerClient(config: BrokerClientConfig) {\n const resolvedConfig = resolveConfig(config, 'broker')\n const auth = createBasicAuth(resolvedConfig.keyId, resolvedConfig.secretKey)\n\n const client = createClient<paths>({\n baseUrl: resolvedConfig.baseUrl,\n headers: auth,\n })\n\n return {\n /** Raw openapi-fetch client for advanced usage */\n raw: client,\n\n /** Account operations */\n accounts: {\n /** List all accounts */\n async list(\n params?: operations['getAllAccounts']['parameters']['query'],\n options?: RequestOptions\n ) {\n return unwrapList(\n await client.GET('/v1/accounts', {\n params: { query: params },\n signal: options?.signal,\n })\n )\n },\n\n /** Get account by ID */\n async get(accountId: string, options?: RequestOptions) {\n return unwrap(\n await client.GET('/v1/accounts/{account_id}', {\n params: { path: { account_id: accountId } },\n signal: options?.signal,\n })\n )\n },\n\n /** Create a new account */\n async create(account: AccountCreationRequest, options?: RequestOptions) {\n return unwrap(\n await client.POST('/v1/accounts', {\n body: account,\n signal: options?.signal,\n })\n )\n },\n\n /** Update an account */\n async update(accountId: string, updates: AccountUpdateRequest, options?: RequestOptions) {\n return unwrap(\n await client.PATCH('/v1/accounts/{account_id}', {\n params: { path: { account_id: accountId } },\n body: updates,\n signal: options?.signal,\n })\n )\n },\n\n /** Get trading account details */\n async getTradingAccount(accountId: string, options?: RequestOptions) {\n return unwrap(\n await client.GET('/v1/trading/accounts/{account_id}/account', {\n params: { path: { account_id: accountId } },\n signal: options?.signal,\n })\n )\n },\n },\n\n /** Account activities */\n activities: {\n /** Get activities across all accounts */\n async list(\n params?: operations['getAccountActivities']['parameters']['query'],\n options?: RequestOptions\n ) {\n return unwrapList(\n await client.GET('/v1/accounts/activities', {\n params: { query: params },\n signal: options?.signal,\n })\n )\n },\n\n /** Get activities by type */\n async getByType(\n activityType: ActivityType,\n params?: operations['getAccountActivitiesByType']['parameters']['query'],\n options?: RequestOptions\n ) {\n return unwrapList(\n await client.GET('/v1/accounts/activities/{activity_type}', {\n params: { path: { activity_type: activityType }, query: params },\n signal: options?.signal,\n })\n )\n },\n },\n\n /** Transfer operations */\n transfers: {\n /** Get transfers for an account */\n async list(\n accountId: string,\n params?: operations['getTransfersForAccount']['parameters']['query'],\n options?: RequestOptions\n ) {\n return unwrapList(\n await client.GET('/v1/accounts/{account_id}/transfers', {\n params: { path: { account_id: accountId }, query: params },\n signal: options?.signal,\n })\n )\n },\n\n /** Create a transfer */\n async create(accountId: string, transfer: CreateTransferRequest, options?: RequestOptions) {\n return unwrap(\n await client.POST('/v1/accounts/{account_id}/transfers', {\n params: { path: { account_id: accountId } },\n body: transfer,\n signal: options?.signal,\n })\n )\n },\n\n /** Delete/cancel a transfer */\n async delete(accountId: string, transferId: string, options?: RequestOptions) {\n unwrapOptional(\n await client.DELETE('/v1/accounts/{account_id}/transfers/{transfer_id}', {\n params: { path: { account_id: accountId, transfer_id: transferId } },\n signal: options?.signal,\n })\n )\n },\n },\n\n /** ACH relationship operations */\n achRelationships: {\n /** Get ACH relationships for an account */\n async list(accountId: string, options?: RequestOptions) {\n return unwrapList(\n await client.GET('/v1/accounts/{account_id}/ach_relationships', {\n params: { path: { account_id: accountId } },\n signal: options?.signal,\n })\n )\n },\n\n /** Create an ACH relationship */\n async create(\n accountId: string,\n relationship: CreateACHRelationshipRequest,\n options?: RequestOptions\n ) {\n return unwrap(\n await client.POST('/v1/accounts/{account_id}/ach_relationships', {\n params: { path: { account_id: accountId } },\n body: relationship,\n signal: options?.signal,\n })\n )\n },\n\n /** Delete an ACH relationship */\n async delete(accountId: string, achRelationshipId: string, options?: RequestOptions) {\n unwrapOptional(\n await client.DELETE('/v1/accounts/{account_id}/ach_relationships/{ach_relationship_id}', {\n params: { path: { account_id: accountId, ach_relationship_id: achRelationshipId } },\n signal: options?.signal,\n })\n )\n },\n },\n\n /** Trading operations on behalf of accounts */\n trading: {\n /** Orders */\n orders: {\n /** List orders for an account */\n async list(\n accountId: string,\n params?: operations['getAllOrdersForAccount']['parameters']['query'],\n options?: RequestOptions\n ) {\n return unwrapList(\n await client.GET('/v1/trading/accounts/{account_id}/orders', {\n params: { path: { account_id: accountId }, query: params },\n signal: options?.signal,\n })\n )\n },\n\n /** Get order by ID */\n async get(accountId: string, orderId: string, options?: RequestOptions) {\n return unwrap(\n await client.GET('/v1/trading/accounts/{account_id}/orders/{order_id}', {\n params: { path: { account_id: accountId, order_id: orderId } },\n signal: options?.signal,\n })\n )\n },\n\n /** Create an order */\n async create(accountId: string, order: CreateOrderRequest, options?: RequestOptions) {\n return unwrap(\n await client.POST('/v1/trading/accounts/{account_id}/orders', {\n params: { path: { account_id: accountId } },\n body: order,\n signal: options?.signal,\n })\n )\n },\n\n /** Replace an order */\n async replace(\n accountId: string,\n orderId: string,\n updates: operations['replaceOrderForAccount']['requestBody']['content']['application/json'],\n options?: RequestOptions\n ) {\n return unwrap(\n await client.PATCH('/v1/trading/accounts/{account_id}/orders/{order_id}', {\n params: { path: { account_id: accountId, order_id: orderId } },\n body: updates,\n signal: options?.signal,\n })\n )\n },\n\n /** Cancel an order */\n async cancel(accountId: string, orderId: string, options?: RequestOptions) {\n unwrapOptional(\n await client.DELETE('/v1/trading/accounts/{account_id}/orders/{order_id}', {\n params: { path: { account_id: accountId, order_id: orderId } },\n signal: options?.signal,\n })\n )\n },\n\n /** Cancel all orders */\n async cancelAll(accountId: string, options?: RequestOptions) {\n return unwrapList(\n await client.DELETE('/v1/trading/accounts/{account_id}/orders', {\n params: { path: { account_id: accountId } },\n signal: options?.signal,\n })\n )\n },\n },\n\n /** Positions */\n positions: {\n /** List positions for an account */\n async list(accountId: string, options?: RequestOptions) {\n return unwrapList(\n await client.GET('/v1/trading/accounts/{account_id}/positions', {\n params: { path: { account_id: accountId } },\n signal: options?.signal,\n })\n )\n },\n\n /** Get position by symbol */\n async get(accountId: string, symbolOrAssetId: string, options?: RequestOptions) {\n return unwrap(\n await client.GET('/v1/trading/accounts/{account_id}/positions/{symbol_or_asset_id}', {\n params: { path: { account_id: accountId, symbol_or_asset_id: symbolOrAssetId } },\n signal: options?.signal,\n })\n )\n },\n\n /** Close a position */\n async close(\n accountId: string,\n symbolOrAssetId: string,\n params?: operations['closePositionForAccountBySymbol']['parameters']['query'],\n options?: RequestOptions\n ) {\n return unwrap(\n await client.DELETE(\n '/v1/trading/accounts/{account_id}/positions/{symbol_or_asset_id}',\n {\n params: {\n path: { account_id: accountId, symbol_or_asset_id: symbolOrAssetId },\n query: params,\n },\n signal: options?.signal,\n }\n )\n )\n },\n\n /** Close all positions */\n async closeAll(\n accountId: string,\n params?: operations['closeAllPositionsForAccount']['parameters']['query'],\n options?: RequestOptions\n ) {\n return unwrapList(\n await client.DELETE('/v1/trading/accounts/{account_id}/positions', {\n params: { path: { account_id: accountId }, query: params },\n signal: options?.signal,\n })\n )\n },\n },\n },\n\n /** Document operations */\n documents: {\n /** Get documents for an account */\n async list(\n accountId: string,\n params?: operations['getDocsForAccount']['parameters']['query'],\n options?: RequestOptions\n ) {\n return unwrapList(\n await client.GET('/v1/accounts/{account_id}/documents', {\n params: { path: { account_id: accountId }, query: params },\n signal: options?.signal,\n })\n )\n },\n\n /** Download a document */\n async download(accountId: string, documentId: string, options?: RequestOptions) {\n return unwrap(\n await client.GET('/v1/accounts/{account_id}/documents/{document_id}/download', {\n params: { path: { account_id: accountId, document_id: documentId } },\n signal: options?.signal,\n })\n )\n },\n },\n\n /** Asset operations */\n assets: {\n /** List all assets */\n async list(\n params?: operations['getAssets']['parameters']['query'],\n options?: RequestOptions\n ) {\n return unwrapList(\n await client.GET('/v1/assets', {\n params: { query: params },\n signal: options?.signal,\n })\n )\n },\n\n /** Get asset by symbol or ID */\n async get(symbolOrAssetId: string, options?: RequestOptions) {\n return unwrap(\n await client.GET('/v1/assets/{symbol_or_asset_id}', {\n params: { path: { symbol_or_asset_id: symbolOrAssetId } },\n signal: options?.signal,\n })\n )\n },\n },\n\n /** Calendar operations */\n calendar: {\n /** Get market calendar */\n async get(\n params?: operations['queryMarketCalendar']['parameters']['query'],\n options?: RequestOptions\n ) {\n return unwrapList(\n await client.GET('/v1/calendar', {\n params: { query: params },\n signal: options?.signal,\n })\n )\n },\n },\n\n /** Clock operations */\n clock: {\n /** Get market clock */\n async get(options?: RequestOptions) {\n return unwrap(\n await client.GET('/v1/clock', {\n signal: options?.signal,\n })\n )\n },\n },\n }\n}\n\n/** Type inference helper for the broker client */\nexport type BrokerClient = ReturnType<typeof createBrokerClient>\n","/**\n * Base WebSocket stream client with connection management, authentication,\n * and reconnection logic.\n */\n\nimport WebSocket from 'ws'\nimport { encode, decode } from '@msgpack/msgpack'\nimport type { StreamState, StreamConfig } from './types'\n\n/** Reconnection configuration */\nconst RECONNECT_INITIAL_DELAY = 1000\nconst RECONNECT_MAX_DELAY = 30000\nconst RECONNECT_BACKOFF_MULTIPLIER = 2\n\n/** Connection timeout (30 seconds) */\nconst CONNECTION_TIMEOUT = 30000\n\n/** Message types from the server */\nexport interface ControlMessage {\n T: 'success' | 'error' | 'subscription'\n msg?: string\n code?: number\n trades?: string[]\n quotes?: string[]\n bars?: string[]\n}\n\n/** Event types emitted by the stream */\nexport type StreamEvent =\n | 'connected'\n | 'disconnected'\n | 'authenticated'\n | 'error'\n | 'trade'\n | 'quote'\n | 'bar'\n | 'trade_update'\n | 'subscription'\n\n/** Event handler type */\nexport type EventHandler<T = unknown> = (data: T) => void\n\n/**\n * Abstract base class for WebSocket streaming clients.\n *\n * Handles:\n * - WebSocket connection lifecycle\n * - Authentication flow\n * - Reconnection with exponential backoff\n * - Message parsing (JSON + MessagePack)\n * - Event emission\n * - Subscription queue during reconnection\n */\nexport abstract class BaseStream {\n protected ws: WebSocket | null = null\n protected state: StreamState = 'disconnected'\n protected config: StreamConfig\n protected reconnectAttempts = 0\n protected reconnectTimer: ReturnType<typeof setTimeout> | null = null\n protected connectionTimer: ReturnType<typeof setTimeout> | null = null\n protected shouldReconnect = true\n protected pendingSubscriptions: (() => void)[] = []\n protected eventHandlers = new Map<StreamEvent, Set<EventHandler>>()\n\n constructor(config: StreamConfig) {\n this.config = config\n }\n\n /**\n * Get the WebSocket URL for this stream type.\n */\n protected abstract getUrl(): string\n\n /**\n * Handle incoming messages from the WebSocket.\n */\n protected abstract handleMessage(data: unknown): void\n\n /**\n * Get the authentication message to send after connecting.\n */\n protected abstract getAuthMessage(): object\n\n /**\n * Get the current connection state.\n */\n getState(): StreamState {\n return this.state\n }\n\n /**\n * Check if the stream is currently connected and authenticated.\n */\n isConnected(): boolean {\n return this.state === 'connected'\n }\n\n /**\n * Connect to the WebSocket server.\n */\n connect(): void {\n if (this.ws && (this.state === 'connecting' || this.state === 'connected')) {\n return\n }\n\n this.shouldReconnect = true\n this.doConnect()\n }\n\n /**\n * Disconnect from the WebSocket server.\n */\n disconnect(): void {\n this.shouldReconnect = false\n this.clearReconnectTimer()\n this.clearConnectionTimer()\n\n if (this.ws) {\n this.ws.close()\n this.ws = null\n }\n\n this.setState('disconnected')\n }\n\n /**\n * Register an event handler.\n */\n on<T = unknown>(event: StreamEvent, handler: EventHandler<T>): void {\n if (!this.eventHandlers.has(event)) {\n this.eventHandlers.set(event, new Set())\n }\n this.eventHandlers.get(event)!.add(handler as EventHandler)\n }\n\n /**\n * Remove an event handler.\n */\n off<T = unknown>(event: StreamEvent, handler: EventHandler<T>): void {\n const handlers = this.eventHandlers.get(event)\n if (handlers) {\n handlers.delete(handler as EventHandler)\n }\n }\n\n /**\n * Remove all handlers for a specific event, or all handlers if no event specified.\n */\n removeAllListeners(event?: StreamEvent): void {\n if (event) {\n this.eventHandlers.delete(event)\n } else {\n this.eventHandlers.clear()\n }\n }\n\n /**\n * Emit an event to all registered handlers.\n */\n protected emit(event: StreamEvent, data?: unknown): void {\n const handlers = this.eventHandlers.get(event)\n if (handlers) {\n for (const handler of handlers) {\n try {\n handler(data)\n } catch (error) {\n // For error handlers, just log to avoid infinite recursion\n // For other handlers, re-emit as an error event\n if (event === 'error') {\n console.error(`Error in ${event} handler:`, error)\n } else {\n this.emit(\n 'error',\n error instanceof Error\n ? error\n : new Error(`Error in ${event} handler: ${String(error)}`)\n )\n }\n }\n }\n }\n }\n\n /**\n * Perform the actual WebSocket connection.\n */\n private doConnect(): void {\n this.setState('connecting')\n\n // Set connection timeout\n this.connectionTimer = setTimeout(() => {\n if (this.state === 'connecting' || this.state === 'authenticating') {\n this.emit('error', new Error('Connection timeout'))\n if (this.ws) {\n this.ws.close()\n }\n }\n }, CONNECTION_TIMEOUT)\n\n const url = this.getUrl()\n this.ws = new WebSocket(url)\n\n if (this.config.useMsgpack) {\n this.ws.binaryType = 'arraybuffer'\n }\n\n this.ws.onopen = () => {\n // Wait for server's 'connected' message before authenticating\n this.setState('authenticating')\n }\n\n this.ws.onmessage = (event: WebSocket.MessageEvent) => {\n this.onMessage(event)\n }\n\n this.ws.onerror = (event: WebSocket.ErrorEvent) => {\n this.emit('error', new Error(event.message || 'WebSocket error'))\n }\n\n this.ws.onclose = () => {\n const wasConnected = this.state === 'connected'\n this.ws = null\n\n if (this.shouldReconnect) {\n this.scheduleReconnect()\n } else {\n this.setState('disconnected')\n }\n\n if (wasConnected) {\n this.emit('disconnected')\n }\n }\n }\n\n /**\n * Send the authentication message.\n */\n private authenticate(): void {\n this.send(this.getAuthMessage())\n }\n\n /**\n * Handle incoming WebSocket messages.\n */\n private onMessage(event: WebSocket.MessageEvent): void {\n let data: unknown\n\n try {\n if (this.config.useMsgpack && event.data instanceof ArrayBuffer) {\n data = decode(new Uint8Array(event.data))\n } else if (typeof event.data === 'string') {\n data = JSON.parse(event.data)\n } else {\n return\n }\n } catch (error) {\n this.emit(\n 'error',\n new Error(\n `Failed to parse message: ${error instanceof Error ? error.message : String(error)}`\n )\n )\n return\n }\n\n // Handle arrays of messages\n if (Array.isArray(data)) {\n for (const message of data) {\n this.processMessage(message as Record<string, unknown>)\n }\n } else {\n this.processMessage(data as Record<string, unknown>)\n }\n }\n\n /**\n * Process a single message from the server.\n */\n private processMessage(message: Record<string, unknown>): void {\n const type = message.T as string\n\n // Handle control messages\n if (type === 'success') {\n const msg = message.msg as string | undefined\n if (msg === 'connected') {\n // Initial connection message - send auth\n this.authenticate()\n } else if (msg === 'authenticated') {\n this.onAuthenticated()\n }\n return\n }\n\n if (type === 'error') {\n const errorMsg = (message.msg as string) || 'Unknown error'\n const errorCode = message.code as number | undefined\n this.emit('error', new Error(`[${String(errorCode ?? 'unknown')}] ${errorMsg}`))\n\n // Auth errors should not reconnect\n if (errorCode === 401 || errorCode === 402 || errorCode === 403) {\n this.shouldReconnect = false\n this.disconnect()\n }\n return\n }\n\n if (type === 'subscription') {\n this.emit('subscription', message)\n return\n }\n\n // Delegate other messages to the subclass\n this.handleMessage(message)\n }\n\n /**\n * Called when authentication is successful.\n */\n private onAuthenticated(): void {\n this.clearConnectionTimer()\n this.setState('connected')\n this.reconnectAttempts = 0\n this.emit('connected')\n this.emit('authenticated')\n\n // Process any pending subscriptions\n for (const subscribe of this.pendingSubscriptions) {\n subscribe()\n }\n this.pendingSubscriptions = []\n }\n\n /**\n * Send a message to the WebSocket server.\n */\n protected send(message: object): void {\n if (this.ws?.readyState !== WebSocket.OPEN) {\n return\n }\n\n if (this.config.useMsgpack) {\n this.ws.send(encode(message))\n } else {\n this.ws.send(JSON.stringify(message))\n }\n }\n\n /**\n * Queue a subscription to be sent when connected.\n */\n protected queueOrSend(action: () => void): void {\n if (this.state === 'connected') {\n action()\n } else {\n this.pendingSubscriptions.push(action)\n }\n }\n\n /**\n * Schedule a reconnection attempt with exponential backoff.\n */\n private scheduleReconnect(): void {\n this.clearReconnectTimer()\n this.setState('disconnected')\n\n const delay = Math.min(\n RECONNECT_INITIAL_DELAY * Math.pow(RECONNECT_BACKOFF_MULTIPLIER, this.reconnectAttempts),\n RECONNECT_MAX_DELAY\n )\n\n this.reconnectAttempts++\n\n this.reconnectTimer = setTimeout(() => {\n this.doConnect()\n }, delay)\n }\n\n /**\n * Clear the reconnection timer.\n */\n private clearReconnectTimer(): void {\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer)\n this.reconnectTimer = null\n }\n }\n\n /**\n * Clear the connection timeout timer.\n */\n private clearConnectionTimer(): void {\n if (this.connectionTimer) {\n clearTimeout(this.connectionTimer)\n this.connectionTimer = null\n }\n }\n\n /**\n * Update the connection state and emit state change event.\n */\n private setState(state: StreamState): void {\n if (this.state !== state) {\n this.state = state\n }\n }\n}\n","/**\n * Stock market data streaming\n *\n * Provides real-time stock trades, quotes, and bars via WebSocket.\n */\n\nimport { BaseStream } from './base-stream'\nimport type {\n StockStreamConfig,\n StockFeed,\n Trade,\n Quote,\n Bar,\n MarketDataAuth,\n MarketDataSubscription,\n} from './types'\n\n/** Base URL for stock data streaming */\nconst STOCK_STREAM_BASE_URL = 'wss://stream.data.alpaca.markets/v2'\n\nexport interface StockStream {\n /** Connect to the WebSocket server */\n connect: () => void\n /** Disconnect from the WebSocket server */\n disconnect: () => void\n /** Check if connected and authenticated */\n isConnected: () => boolean\n /** Subscribe to trades for symbols */\n subscribeForTrades: (symbols: string[]) => void\n /** Subscribe to quotes for symbols */\n subscribeForQuotes: (symbols: string[]) => void\n /** Subscribe to bars for symbols */\n subscribeForBars: (symbols: string[]) => void\n /** Unsubscribe from trades for symbols */\n unsubscribeFromTrades: (symbols: string[]) => void\n /** Unsubscribe from quotes for symbols */\n unsubscribeFromQuotes: (symbols: string[]) => void\n /** Unsubscribe from bars for symbols */\n unsubscribeFromBars: (symbols: string[]) => void\n /** Register a handler for trade events */\n onTrade: (handler: (trade: Trade) => void) => void\n /** Register a handler for quote events */\n onQuote: (handler: (quote: Quote) => void) => void\n /** Register a handler for bar events */\n onBar: (handler: (bar: Bar) => void) => void\n /** Register a handler for connection events */\n onConnect: (handler: () => void) => void\n /** Register a handler for disconnection events */\n onDisconnect: (handler: () => void) => void\n /** Register a handler for error events */\n onError: (handler: (error: Error) => void) => void\n}\n\n/**\n * Internal implementation of the stock stream client.\n */\nclass StockStreamImpl extends BaseStream {\n private feed: StockFeed\n private subscribedTrades = new Set<string>()\n private subscribedQuotes = new Set<string>()\n private subscribedBars = new Set<string>()\n\n constructor(config: StockStreamConfig) {\n super(config)\n this.feed = config.feed ?? 'iex'\n }\n\n protected getUrl(): string {\n return `${STOCK_STREAM_BASE_URL}/${this.feed}`\n }\n\n protected getAuthMessage(): MarketDataAuth {\n return {\n action: 'auth',\n key: this.config.keyId,\n secret: this.config.secretKey,\n }\n }\n\n protected handleMessage(message: Record<string, unknown>): void {\n const type = message.T as string\n\n switch (type) {\n case 't':\n this.emit('trade', message as unknown as Trade)\n break\n case 'q':\n this.emit('quote', message as unknown as Quote)\n break\n case 'b':\n this.emit('bar', message as unknown as Bar)\n break\n }\n }\n\n subscribeForTrades(symbols: string[]): void {\n this.queueOrSend(() => {\n const newSymbols = symbols.filter((s) => !this.subscribedTrades.has(s))\n if (newSymbols.length === 0) return\n\n for (const symbol of newSymbols) {\n this.subscribedTrades.add(symbol)\n }\n\n const message: MarketDataSubscription = {\n action: 'subscribe',\n trades: newSymbols,\n }\n this.send(message)\n })\n }\n\n subscribeForQuotes(symbols: string[]): void {\n this.queueOrSend(() => {\n const newSymbols = symbols.filter((s) => !this.subscribedQuotes.has(s))\n if (newSymbols.length === 0) return\n\n for (const symbol of newSymbols) {\n this.subscribedQuotes.add(symbol)\n }\n\n const message: MarketDataSubscription = {\n action: 'subscribe',\n quotes: newSymbols,\n }\n this.send(message)\n })\n }\n\n subscribeForBars(symbols: string[]): void {\n this.queueOrSend(() => {\n const newSymbols = symbols.filter((s) => !this.subscribedBars.has(s))\n if (newSymbols.length === 0) return\n\n for (const symbol of newSymbols) {\n this.subscribedBars.add(symbol)\n }\n\n const message: MarketDataSubscription = {\n action: 'subscribe',\n bars: newSymbols,\n }\n this.send(message)\n })\n }\n\n unsubscribeFromTrades(symbols: string[]): void {\n this.queueOrSend(() => {\n const existingSymbols = symbols.filter((s) => this.subscribedTrades.has(s))\n if (existingSymbols.length === 0) return\n\n for (const symbol of existingSymbols) {\n this.subscribedTrades.delete(symbol)\n }\n\n const message: MarketDataSubscription = {\n action: 'unsubscribe',\n trades: existingSymbols,\n }\n this.send(message)\n })\n }\n\n unsubscribeFromQuotes(symbols: string[]): void {\n this.queueOrSend(() => {\n const existingSymbols = symbols.filter((s) => this.subscribedQuotes.has(s))\n if (existingSymbols.length === 0) return\n\n for (const symbol of existingSymbols) {\n this.subscribedQuotes.delete(symbol)\n }\n\n const message: MarketDataSubscription = {\n action: 'unsubscribe',\n quotes: existingSymbols,\n }\n this.send(message)\n })\n }\n\n unsubscribeFromBars(symbols: string[]): void {\n this.queueOrSend(() => {\n const existingSymbols = symbols.filter((s) => this.subscribedBars.has(s))\n if (existingSymbols.length === 0) return\n\n for (const symbol of existingSymbols) {\n this.subscribedBars.delete(symbol)\n }\n\n const message: MarketDataSubscription = {\n action: 'unsubscribe',\n bars: existingSymbols,\n }\n this.send(message)\n })\n }\n\n onTrade(handler: (trade: Trade) => void): void {\n this.on('trade', handler)\n }\n\n onQuote(handler: (quote: Quote) => void): void {\n this.on('quote', handler)\n }\n\n onBar(handler: (bar: Bar) => void): void {\n this.on('bar', handler)\n }\n\n onConnect(handler: () => void): void {\n this.on('connected', handler)\n }\n\n onDisconnect(handler: () => void): void {\n this.on('disconnected', handler)\n }\n\n onError(handler: (error: Error) => void): void {\n this.on('error', handler)\n }\n}\n\n/**\n * Create a stock data stream client.\n *\n * @param config - Stream configuration including API credentials and feed type\n * @returns Stock stream client\n *\n * @example\n * ```typescript\n * const stream = createStockStream({\n * keyId: 'your-api-key',\n * secretKey: 'your-api-secret',\n * feed: 'iex', // 'iex' (free), 'sip' (paid), or 'delayed_sip'\n * })\n *\n * stream.onTrade((trade) => {\n * console.log(`Trade: ${trade.S} @ ${trade.p}`)\n * })\n *\n * stream.connect()\n * stream.subscribeForTrades(['AAPL', 'MSFT'])\n * ```\n */\nexport function createStockStream(config: StockStreamConfig): StockStream {\n const impl = new StockStreamImpl(config)\n\n return {\n connect: () => {\n impl.connect()\n },\n disconnect: () => {\n impl.disconnect()\n },\n isConnected: () => impl.isConnected(),\n subscribeForTrades: (symbols) => {\n impl.subscribeForTrades(symbols)\n },\n subscribeForQuotes: (symbols) => {\n impl.subscribeForQuotes(symbols)\n },\n subscribeForBars: (symbols) => {\n impl.subscribeForBars(symbols)\n },\n unsubscribeFromTrades: (symbols) => {\n impl.unsubscribeFromTrades(symbols)\n },\n unsubscribeFromQuotes: (symbols) => {\n impl.unsubscribeFromQuotes(symbols)\n },\n unsubscribeFromBars: (symbols) => {\n impl.unsubscribeFromBars(symbols)\n },\n onTrade: (handler) => {\n impl.onTrade(handler)\n },\n onQuote: (handler) => {\n impl.onQuote(handler)\n },\n onBar: (handler) => {\n impl.onBar(handler)\n },\n onConnect: (handler) => {\n impl.onConnect(handler)\n },\n onDisconnect: (handler) => {\n impl.onDisconnect(handler)\n },\n onError: (handler) => {\n impl.onError(handler)\n },\n }\n}\n","/**\n * Crypto market data streaming\n *\n * Provides real-time crypto trades, quotes, and bars via WebSocket.\n */\n\nimport { BaseStream } from './base-stream'\nimport type {\n CryptoStreamConfig,\n CryptoLocation,\n Trade,\n Quote,\n Bar,\n MarketDataAuth,\n MarketDataSubscription,\n} from './types'\n\n/** Base URL for crypto data streaming */\nconst CRYPTO_STREAM_BASE_URL = 'wss://stream.data.alpaca.markets/v1beta3/crypto'\n\nexport interface CryptoStream {\n /** Connect to the WebSocket server */\n connect: () => void\n /** Disconnect from the WebSocket server */\n disconnect: () => void\n /** Check if connected and authenticated */\n isConnected: () => boolean\n /** Subscribe to trades for symbols */\n subscribeForTrades: (symbols: string[]) => void\n /** Subscribe to quotes for symbols */\n subscribeForQuotes: (symbols: string[]) => void\n /** Subscribe to bars for symbols */\n subscribeForBars: (symbols: string[]) => void\n /** Unsubscribe from trades for symbols */\n unsubscribeFromTrades: (symbols: string[]) => void\n /** Unsubscribe from quotes for symbols */\n unsubscribeFromQuotes: (symbols: string[]) => void\n /** Unsubscribe from bars for symbols */\n unsubscribeFromBars: (symbols: string[]) => void\n /** Register a handler for trade events */\n onTrade: (handler: (trade: Trade) => void) => void\n /** Register a handler for quote events */\n onQuote: (handler: (quote: Quote) => void) => void\n /** Register a handler for bar events */\n onBar: (handler: (bar: Bar) => void) => void\n /** Register a handler for connection events */\n onConnect: (handler: () => void) => void\n /** Register a handler for disconnection events */\n onDisconnect: (handler: () => void) => void\n /** Register a handler for error events */\n onError: (handler: (error: Error) => void) => void\n}\n\n/**\n * Internal implementation of the crypto stream client.\n */\nclass CryptoStreamImpl extends BaseStream {\n private location: CryptoLocation\n private subscribedTrades = new Set<string>()\n private subscribedQuotes = new Set<string>()\n private subscribedBars = new Set<string>()\n\n constructor(config: CryptoStreamConfig) {\n super(config)\n this.location = config.location ?? 'us'\n }\n\n protected getUrl(): string {\n return `${CRYPTO_STREAM_BASE_URL}/${this.location}`\n }\n\n protected getAuthMessage(): MarketDataAuth {\n return {\n action: 'auth',\n key: this.config.keyId,\n secret: this.config.secretKey,\n }\n }\n\n protected handleMessage(message: Record<string, unknown>): void {\n const type = message.T as string\n\n switch (type) {\n case 't':\n this.emit('trade', message as unknown as Trade)\n break\n case 'q':\n this.emit('quote', message as unknown as Quote)\n break\n case 'b':\n this.emit('bar', message as unknown as Bar)\n break\n }\n }\n\n subscribeForTrades(symbols: string[]): void {\n this.queueOrSend(() => {\n const newSymbols = symbols.filter((s) => !this.subscribedTrades.has(s))\n if (newSymbols.length === 0) return\n\n for (const symbol of newSymbols) {\n this.subscribedTrades.add(symbol)\n }\n\n const message: MarketDataSubscription = {\n action: 'subscribe',\n trades: newSymbols,\n }\n this.send(message)\n })\n }\n\n subscribeForQuotes(symbols: string[]): void {\n this.queueOrSend(() => {\n const newSymbols = symbols.filter((s) => !this.subscribedQuotes.has(s))\n if (newSymbols.length === 0) return\n\n for (const symbol of newSymbols) {\n this.subscribedQuotes.add(symbol)\n }\n\n const message: MarketDataSubscription = {\n action: 'subscribe',\n quotes: newSymbols,\n }\n this.send(message)\n })\n }\n\n subscribeForBars(symbols: string[]): void {\n this.queueOrSend(() => {\n const newSymbols = symbols.filter((s) => !this.subscribedBars.has(s))\n if (newSymbols.length === 0) return\n\n for (const symbol of newSymbols) {\n this.subscribedBars.add(symbol)\n }\n\n const message: MarketDataSubscription = {\n action: 'subscribe',\n bars: newSymbols,\n }\n this.send(message)\n })\n }\n\n unsubscribeFromTrades(symbols: string[]): void {\n this.queueOrSend(() => {\n const existingSymbols = symbols.filter((s) => this.subscribedTrades.has(s))\n if (existingSymbols.length === 0) return\n\n for (const symbol of existingSymbols) {\n this.subscribedTrades.delete(symbol)\n }\n\n const message: MarketDataSubscription = {\n action: 'unsubscribe',\n trades: existingSymbols,\n }\n this.send(message)\n })\n }\n\n unsubscribeFromQuotes(symbols: string[]): void {\n this.queueOrSend(() => {\n const existingSymbols = symbols.filter((s) => this.subscribedQuotes.has(s))\n if (existingSymbols.length === 0) return\n\n for (const symbol of existingSymbols) {\n this.subscribedQuotes.delete(symbol)\n }\n\n const message: MarketDataSubscription = {\n action: 'unsubscribe',\n quotes: existingSymbols,\n }\n this.send(message)\n })\n }\n\n unsubscribeFromBars(symbols: string[]): void {\n this.queueOrSend(() => {\n const existingSymbols = symbols.filter((s) => this.subscribedBars.has(s))\n if (existingSymbols.length === 0) return\n\n for (const symbol of existingSymbols) {\n this.subscribedBars.delete(symbol)\n }\n\n const message: MarketDataSubscription = {\n action: 'unsubscribe',\n bars: existingSymbols,\n }\n this.send(message)\n })\n }\n\n onTrade(handler: (trade: Trade) => void): void {\n this.on('trade', handler)\n }\n\n onQuote(handler: (quote: Quote) => void): void {\n this.on('quote', handler)\n }\n\n onBar(handler: (bar: Bar) => void): void {\n this.on('bar', handler)\n }\n\n onConnect(handler: () => void): void {\n this.on('connected', handler)\n }\n\n onDisconnect(handler: () => void): void {\n this.on('disconnected', handler)\n }\n\n onError(handler: (error: Error) => void): void {\n this.on('error', handler)\n }\n}\n\n/**\n * Create a crypto data stream client.\n *\n * @param config - Stream configuration including API credentials and location\n * @returns Crypto stream client\n *\n * @example\n * ```typescript\n * const stream = createCryptoStream({\n * keyId: 'your-api-key',\n * secretKey: 'your-api-secret',\n * location: 'us', // 'us' (Alpaca), 'us-1' (Kraken US), 'eu-1' (Kraken EU)\n * })\n *\n * stream.onTrade((trade) => {\n * console.log(`Trade: ${trade.S} @ ${trade.p}`)\n * })\n *\n * stream.connect()\n * stream.subscribeForTrades(['BTC/USD', 'ETH/USD'])\n * ```\n */\nexport function createCryptoStream(config: CryptoStreamConfig): CryptoStream {\n const impl = new CryptoStreamImpl(config)\n\n return {\n connect: () => {\n impl.connect()\n },\n disconnect: () => {\n impl.disconnect()\n },\n isConnected: () => impl.isConnected(),\n subscribeForTrades: (symbols) => {\n impl.subscribeForTrades(symbols)\n },\n subscribeForQuotes: (symbols) => {\n impl.subscribeForQuotes(symbols)\n },\n subscribeForBars: (symbols) => {\n impl.subscribeForBars(symbols)\n },\n unsubscribeFromTrades: (symbols) => {\n impl.unsubscribeFromTrades(symbols)\n },\n unsubscribeFromQuotes: (symbols) => {\n impl.unsubscribeFromQuotes(symbols)\n },\n unsubscribeFromBars: (symbols) => {\n impl.unsubscribeFromBars(symbols)\n },\n onTrade: (handler) => {\n impl.onTrade(handler)\n },\n onQuote: (handler) => {\n impl.onQuote(handler)\n },\n onBar: (handler) => {\n impl.onBar(handler)\n },\n onConnect: (handler) => {\n impl.onConnect(handler)\n },\n onDisconnect: (handler) => {\n impl.onDisconnect(handler)\n },\n onError: (handler) => {\n impl.onError(handler)\n },\n }\n}\n","/**\n * Trade/Account updates streaming\n *\n * Provides real-time updates on order fills, cancellations, rejections,\n * and other trade-related events.\n */\n\nimport WebSocket from 'ws'\nimport { encode, decode } from '@msgpack/msgpack'\nimport type {\n StreamConfig,\n StreamState,\n TradeUpdate,\n TradeUpdatesAuth,\n TradeUpdatesListen,\n} from './types'\n\n/** Paper trading WebSocket URL */\nconst PAPER_TRADING_URL = 'wss://paper-api.alpaca.markets/stream'\n\n/** Live trading WebSocket URL */\nconst LIVE_TRADING_URL = 'wss://api.alpaca.markets/stream'\n\n/** Reconnection configuration */\nconst RECONNECT_INITIAL_DELAY = 1000\nconst RECONNECT_MAX_DELAY = 30000\nconst RECONNECT_BACKOFF_MULTIPLIER = 2\n\nexport interface TradeUpdatesStream {\n /** Connect to the WebSocket server */\n connect: () => void\n /** Disconnect from the WebSocket server */\n disconnect: () => void\n /** Check if connected and authenticated */\n isConnected: () => boolean\n /** Subscribe to trade updates */\n subscribe: () => void\n /** Unsubscribe from trade updates */\n unsubscribe: () => void\n /** Register a handler for trade update events */\n onTradeUpdate: (handler: (update: TradeUpdate) => void) => void\n /** Register a handler for connection events */\n onConnect: (handler: () => void) => void\n /** Register a handler for disconnection events */\n onDisconnect: (handler: () => void) => void\n /** Register a handler for error events */\n onError: (handler: (error: Error) => void) => void\n}\n\n/** Event handler type */\ntype EventHandler<T = unknown> = (data: T) => void\n\n/**\n * Internal implementation of the trade updates stream client.\n *\n * The trade updates stream has a different protocol than market data streams:\n * - Authentication uses `authenticate` action with `key_id` and `secret_key`\n * - Subscription uses `listen` action with `streams` array\n */\nclass TradeUpdatesStreamImpl {\n private ws: WebSocket | null = null\n private state: StreamState = 'disconnected'\n private config: StreamConfig\n private reconnectAttempts = 0\n private reconnectTimer: ReturnType<typeof setTimeout> | null = null\n private shouldReconnect = true\n private isSubscribed = false\n private pendingSubscribe = false\n private eventHandlers = new Map<string, Set<EventHandler>>()\n\n constructor(config: StreamConfig) {\n this.config = config\n }\n\n private getUrl(): string {\n return this.config.paper === false ? LIVE_TRADING_URL : PAPER_TRADING_URL\n }\n\n getState(): StreamState {\n return this.state\n }\n\n isConnected(): boolean {\n return this.state === 'connected'\n }\n\n connect(): void {\n if (this.ws && (this.state === 'connecting' || this.state === 'connected')) {\n return\n }\n\n this.shouldReconnect = true\n this.doConnect()\n }\n\n disconnect(): void {\n this.shouldReconnect = false\n this.clearReconnectTimer()\n\n if (this.ws) {\n this.ws.close()\n this.ws = null\n }\n\n this.setState('disconnected')\n this.isSubscribed = false\n }\n\n subscribe(): void {\n if (this.state === 'connected') {\n if (!this.isSubscribed) {\n this.doSubscribe()\n }\n } else if (!this.pendingSubscribe) {\n // Guard against double-queuing subscriptions\n this.pendingSubscribe = true\n }\n }\n\n unsubscribe(): void {\n if (this.state !== 'connected' || !this.isSubscribed) {\n return\n }\n\n const message: TradeUpdatesListen = {\n action: 'listen',\n data: {\n streams: [],\n },\n }\n this.send(message)\n this.isSubscribed = false\n }\n\n onTradeUpdate(handler: (update: TradeUpdate) => void): void {\n this.on('trade_update', handler)\n }\n\n onConnect(handler: () => void): void {\n this.on('connected', handler)\n }\n\n onDisconnect(handler: () => void): void {\n this.on('disconnected', handler)\n }\n\n onError(handler: (error: Error) => void): void {\n this.on('error', handler)\n }\n\n private on<T = unknown>(event: string, handler: EventHandler<T>): void {\n if (!this.eventHandlers.has(event)) {\n this.eventHandlers.set(event, new Set())\n }\n this.eventHandlers.get(event)!.add(handler as EventHandler)\n }\n\n private emit(event: string, data?: unknown): void {\n const handlers = this.eventHandlers.get(event)\n if (handlers) {\n for (const handler of handlers) {\n try {\n handler(data)\n } catch (error) {\n // For error handlers, just log to avoid infinite recursion\n // For other handlers, re-emit as an error event\n if (event === 'error') {\n console.error(`Error in ${event} handler:`, error)\n } else {\n this.emit(\n 'error',\n error instanceof Error\n ? error\n : new Error(`Error in ${event} handler: ${String(error)}`)\n )\n }\n }\n }\n }\n }\n\n private doConnect(): void {\n this.setState('connecting')\n\n const url = this.getUrl()\n this.ws = new WebSocket(url)\n\n if (this.config.useMsgpack) {\n this.ws.binaryType = 'arraybuffer'\n }\n\n this.ws.onopen = () => {\n this.setState('authenticating')\n this.authenticate()\n }\n\n this.ws.onmessage = (event: WebSocket.MessageEvent) => {\n this.onMessage(event)\n }\n\n this.ws.onerror = (event: WebSocket.ErrorEvent) => {\n this.emit('error', new Error(event.message || 'WebSocket error'))\n }\n\n this.ws.onclose = () => {\n const wasConnected = this.state === 'connected'\n this.ws = null\n this.isSubscribed = false\n\n if (this.shouldReconnect) {\n this.scheduleReconnect()\n } else {\n this.setState('disconnected')\n }\n\n if (wasConnected) {\n this.emit('disconnected')\n }\n }\n }\n\n private authenticate(): void {\n const message: TradeUpdatesAuth = {\n action: 'authenticate',\n data: {\n key_id: this.config.keyId,\n secret_key: this.config.secretKey,\n },\n }\n this.send(message)\n }\n\n private doSubscribe(): void {\n const message: TradeUpdatesListen = {\n action: 'listen',\n data: {\n streams: ['trade_updates'],\n },\n }\n this.send(message)\n this.isSubscribed = true\n }\n\n private onMessage(event: WebSocket.MessageEvent): void {\n let data: unknown\n\n try {\n if (this.config.useMsgpack && event.data instanceof ArrayBuffer) {\n data = decode(new Uint8Array(event.data))\n } else if (typeof event.data === 'string') {\n data = JSON.parse(event.data)\n } else {\n return\n }\n } catch (error) {\n this.emit(\n 'error',\n new Error(\n `Failed to parse message: ${error instanceof Error ? error.message : String(error)}`\n )\n )\n return\n }\n\n this.processMessage(data as Record<string, unknown>)\n }\n\n private processMessage(message: Record<string, unknown>): void {\n const stream = message.stream as string | undefined\n const data = message.data as Record<string, unknown> | undefined\n\n // Handle authentication response\n if (stream === 'authorization') {\n const status = data?.status as string | undefined\n const action = data?.action as string | undefined\n\n if (status === 'authorized' && action === 'authenticate') {\n this.onAuthenticated()\n } else if (status === 'unauthorized') {\n this.emit('error', new Error('Authentication failed'))\n this.shouldReconnect = false\n this.disconnect()\n }\n return\n }\n\n // Handle listening confirmation\n if (stream === 'listening') {\n // Successfully subscribed\n return\n }\n\n // Handle trade updates\n if (stream === 'trade_updates' && data) {\n this.emit('trade_update', data as unknown as TradeUpdate)\n return\n }\n }\n\n private onAuthenticated(): void {\n this.setState('connected')\n this.reconnectAttempts = 0\n this.emit('connected')\n\n // Process pending subscription\n if (this.pendingSubscribe) {\n this.pendingSubscribe = false\n this.doSubscribe()\n }\n }\n\n private send(message: object): void {\n if (this.ws?.readyState !== WebSocket.OPEN) {\n return\n }\n\n if (this.config.useMsgpack) {\n this.ws.send(encode(message))\n } else {\n this.ws.send(JSON.stringify(message))\n }\n }\n\n private scheduleReconnect(): void {\n this.clearReconnectTimer()\n this.setState('disconnected')\n\n const delay = Math.min(\n RECONNECT_INITIAL_DELAY * Math.pow(RECONNECT_BACKOFF_MULTIPLIER, this.reconnectAttempts),\n RECONNECT_MAX_DELAY\n )\n\n this.reconnectAttempts++\n\n // If we were subscribed, mark for re-subscription after reconnect\n if (this.isSubscribed) {\n this.pendingSubscribe = true\n this.isSubscribed = false\n }\n\n this.reconnectTimer = setTimeout(() => {\n this.doConnect()\n }, delay)\n }\n\n private clearReconnectTimer(): void {\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer)\n this.reconnectTimer = null\n }\n }\n\n private setState(state: StreamState): void {\n if (this.state !== state) {\n this.state = state\n }\n }\n}\n\n/**\n * Create a trade updates stream client.\n *\n * @param config - Stream configuration including API credentials\n * @returns Trade updates stream client\n *\n * @example\n * ```typescript\n * const stream = createTradeUpdatesStream({\n * keyId: 'your-api-key',\n * secretKey: 'your-api-secret',\n * paper: true, // true for paper trading, false for live\n * })\n *\n * stream.onTradeUpdate((update) => {\n * console.log(`Order ${update.event}: ${JSON.stringify(update.order)}`)\n * })\n *\n * stream.connect()\n * stream.subscribe()\n * ```\n */\nexport function createTradeUpdatesStream(config: StreamConfig): TradeUpdatesStream {\n const impl = new TradeUpdatesStreamImpl(config)\n\n return {\n connect: () => {\n impl.connect()\n },\n disconnect: () => {\n impl.disconnect()\n },\n isConnected: () => impl.isConnected(),\n subscribe: () => {\n impl.subscribe()\n },\n unsubscribe: () => {\n impl.unsubscribe()\n },\n onTradeUpdate: (handler) => {\n impl.onTradeUpdate(handler)\n },\n onConnect: (handler) => {\n impl.onConnect(handler)\n },\n onDisconnect: (handler) => {\n impl.onDisconnect(handler)\n },\n onError: (handler) => {\n impl.onError(handler)\n },\n }\n}\n","/**\n * Unified Alpaca client\n */\n\nimport type { AlpacaConfig } from '@luisjpf/core'\nimport { createTradingClient } from '@luisjpf/trading'\nimport type { TradingClient } from '@luisjpf/trading'\nimport { createBrokerClient } from '@luisjpf/broker'\nimport type { BrokerClient } from '@luisjpf/broker'\nimport { createMarketDataClient } from '@luisjpf/market-data'\nimport type { MarketDataClient } from '@luisjpf/market-data'\nimport { createStockStream, createCryptoStream, createTradeUpdatesStream } from '@luisjpf/streaming'\nimport type { StockStream, CryptoStream, TradeUpdatesStream } from '@luisjpf/streaming'\n\nexport type AlpacaClientConfig = AlpacaConfig\n\nexport interface AlpacaClient {\n trading: TradingClient\n broker: BrokerClient\n marketData: MarketDataClient\n streams: {\n stocks: StockStream\n crypto: CryptoStream\n tradeUpdates: TradeUpdatesStream\n }\n}\n\n/**\n * Create a unified Alpaca client with all APIs\n */\nexport function createAlpacaClient(config: AlpacaClientConfig): AlpacaClient {\n const streamConfig = {\n keyId: config.keyId,\n secretKey: config.secretKey,\n paper: config.paper,\n }\n\n return {\n trading: createTradingClient(config),\n broker: createBrokerClient(config),\n marketData: createMarketDataClient(config),\n streams: {\n stocks: createStockStream(streamConfig),\n crypto: createCryptoStream(streamConfig),\n tradeUpdates: createTradeUpdatesStream(streamConfig),\n },\n }\n}\n"],"mappings":"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","names":["createClient","createClient","createClient","createClient","WebSocket","encode","decode","RECONNECT_INITIAL_DELAY","RECONNECT_MAX_DELAY","RECONNECT_BACKOFF_MULTIPLIER"]}
|