{"version":3,"sources":["../src/utils/logger.ts","../src/core/errors.ts","../src/core/protocol.ts","../src/core/constants.ts","../src/core/rate-limiter.types.ts","../src/utils/backoff.ts","../src/core/transport.ts","../src/core/session-manager.ts","../src/core/rate-limiter.ts","../src/utils/random-id.ts","../src/sessions/quote-session.ts","../src/types/candle.ts","../src/sessions/chart-session.ts","../src/utils/kebab-to-camel.ts","../src/types/symbol-info.ts","../src/api/stream.ts","../src/api/symbol.ts","../src/api/multi-stream.ts","../src/api/portfolio.ts","../src/api/group.ts","../src/api/group-registry.ts","../src/api/client.ts","../src/index.ts"],"names":["debug","log"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Debug logging wrapper.\n *\n * Usage:\n *   const log = createLogger('transport')\n *   log('connect() → %s', url)\n *\n * Enable at runtime via the `DEBUG` environment variable:\n *   DEBUG=tradingview-adapter:*              (all namespaces)\n *   DEBUG=tradingview-adapter:transport      (one namespace)\n *   DEBUG=tradingview-adapter:transport,tradingview-adapter:protocol\n */\n\nimport debug from 'debug'\n\nconst ROOT_NAMESPACE = 'tradingview-adapter'\n\nexport type Logger = debug.Debugger\n\nexport function createLogger(namespace: string): Logger {\n  return debug(`${ROOT_NAMESPACE}:${namespace}`)\n}\n","/**\n * Error hierarchy for tradingview-api-adapter.\n *\n * All errors thrown by the library extend `TvError`, so consumers can\n * catch them all with a single `instanceof TvError` check. Specific\n * error classes are provided for the common failure modes.\n */\n\nexport interface TvErrorOptions {\n  cause?: unknown\n}\n\nexport class TvError extends Error {\n  public override readonly cause?: unknown\n\n  constructor(message: string, options: TvErrorOptions = {}) {\n    super(message)\n    this.name = this.constructor.name\n    if (options.cause !== undefined) {\n      this.cause = options.cause\n    }\n  }\n}\n\n/** Raised when the WebSocket transport fails to connect or is lost. */\nexport class TvConnectionError extends TvError {}\n\n/** Raised when incoming bytes cannot be parsed as a valid TradingView frame. */\nexport class TvProtocolError extends TvError {}\n\n/** Raised when a session-level operation fails (quote/chart session). */\nexport class TvSessionError extends TvError {}\n\n/** Raised when a specific symbol cannot be resolved or subscribed. */\nexport class TvSymbolError extends TvError {\n  constructor(\n    public readonly symbol: string,\n    message: string,\n    options: TvErrorOptions = {},\n  ) {\n    super(`[${symbol}] ${message}`, options)\n  }\n}\n\n/** Raised when an operation exceeds its configured timeout. */\nexport class TvTimeoutError extends TvError {\n  constructor(\n    message: string,\n    public readonly timeoutMs: number,\n    options: TvErrorOptions = {},\n  ) {\n    super(`${message} (timeout=${timeoutMs}ms)`, options)\n  }\n}\n","/**\n * TradingView wire protocol — pure encode/decode functions.\n *\n * This module has no side effects and no I/O. It only translates between\n * raw strings received from the WebSocket and strongly typed messages.\n *\n * See `protocol.types.ts` for a description of the frame format.\n */\n\nimport { TvProtocolError } from './errors.js'\nimport type {\n  CommandMessage,\n  HeartbeatMessage,\n  HelloMessage,\n  ProtocolMessage,\n} from './protocol.types.js'\n\nconst FRAME_MARKER = '~m~'\nconst HEARTBEAT_MARKER = '~h~'\n\n/**\n * Wrap a raw payload in the TradingView frame header.\n *\n * The payload length is measured in character-count (UTF-16 code units),\n * matching TradingView's own behaviour.\n */\nexport function encodeFrame(payload: string | object): string {\n  const body = typeof payload === 'string' ? payload : JSON.stringify(payload)\n  return `${FRAME_MARKER}${body.length}${FRAME_MARKER}${body}`\n}\n\n/** Build a heartbeat echo frame for a given server-provided id. */\nexport function encodeHeartbeat(id: number): string {\n  if (!Number.isFinite(id)) {\n    throw new TvProtocolError(`Invalid heartbeat id: ${id}`)\n  }\n  return encodeFrame(`${HEARTBEAT_MARKER}${id}`)\n}\n\n/** Build a command frame like `{ m: \"quote_add_symbols\", p: [...] }`. */\nexport function encodeCommand(method: string, params: unknown[]): string {\n  return encodeFrame({ m: method, p: params })\n}\n\n/**\n * Decode a raw WebSocket message (which may contain multiple concatenated\n * frames) into an array of typed `ProtocolMessage`s.\n *\n * Throws `TvProtocolError` on malformed input.\n */\nexport function decodeFrames(raw: string): ProtocolMessage[] {\n  if (raw.length === 0) return []\n\n  const messages: ProtocolMessage[] = []\n  let cursor = 0\n\n  while (cursor < raw.length) {\n    if (raw.slice(cursor, cursor + FRAME_MARKER.length) !== FRAME_MARKER) {\n      throw new TvProtocolError(\n        `Expected frame marker \"~m~\" at position ${cursor}, got \"${raw.slice(cursor, cursor + 10)}\"`,\n      )\n    }\n    cursor += FRAME_MARKER.length\n\n    const lengthEnd = raw.indexOf(FRAME_MARKER, cursor)\n    if (lengthEnd === -1) {\n      throw new TvProtocolError(`Unterminated length marker starting at position ${cursor}`)\n    }\n\n    const lengthStr = raw.slice(cursor, lengthEnd)\n    const length = Number.parseInt(lengthStr, 10)\n    if (!Number.isFinite(length) || length < 0 || String(length) !== lengthStr) {\n      throw new TvProtocolError(`Invalid frame length: \"${lengthStr}\"`)\n    }\n\n    cursor = lengthEnd + FRAME_MARKER.length\n\n    if (cursor + length > raw.length) {\n      throw new TvProtocolError(\n        `Truncated payload: declared ${length} chars but only ${raw.length - cursor} available`,\n      )\n    }\n\n    const payload = raw.slice(cursor, cursor + length)\n    cursor += length\n\n    const parsed = parsePayload(payload)\n    if (parsed !== null) messages.push(parsed)\n  }\n\n  return messages\n}\n\nfunction parsePayload(payload: string): ProtocolMessage | null {\n  if (payload === '') return null\n\n  if (payload.startsWith(HEARTBEAT_MARKER)) {\n    const id = Number.parseInt(payload.slice(HEARTBEAT_MARKER.length), 10)\n    if (!Number.isFinite(id)) {\n      throw new TvProtocolError(`Invalid heartbeat payload: \"${payload}\"`)\n    }\n    const msg: HeartbeatMessage = { type: 'heartbeat', id }\n    return msg\n  }\n\n  let data: unknown\n  try {\n    data = JSON.parse(payload)\n  } catch (err) {\n    throw new TvProtocolError(`Invalid JSON payload: \"${truncate(payload, 80)}\"`, { cause: err })\n  }\n\n  if (isCommandShape(data)) {\n    const msg: CommandMessage = {\n      type: 'message',\n      method: data.m,\n      params: Array.isArray(data.p) ? data.p : [],\n    }\n    return msg\n  }\n\n  const hello: HelloMessage = { type: 'hello', data }\n  return hello\n}\n\nfunction isCommandShape(data: unknown): data is { m: string; p: unknown } {\n  return (\n    typeof data === 'object' &&\n    data !== null &&\n    'm' in data &&\n    typeof (data as { m: unknown }).m === 'string'\n  )\n}\n\nfunction truncate(s: string, max: number): string {\n  return s.length > max ? `${s.slice(0, max)}…` : s\n}\n","/**\n * Stable TradingView protocol constants.\n *\n * These values come from reverse-engineering the public TradingView\n * widget WebSocket — they may change without notice if TradingView\n * updates its infrastructure.\n */\n\n/** WebSocket endpoint for quote/chart sessions. */\nexport const TV_WS_URL = 'wss://widgetdata.tradingview.com/socket.io/websocket'\n\n/** Origin header required by TradingView when connecting from Node. */\nexport const TV_ORIGIN = 'https://s.tradingview.com'\n","/**\n * Types for the client-side rate limiter.\n *\n * The limiter is responsible for:\n *   - **Micro-batching**: collect calls made inside a short window and\n *     flush them as a single list, so a loop doing `add('A'); add('B')`\n *     becomes one network command.\n *   - **Chunking**: split very large flushes into fixed-size chunks and\n *     dispatch them with an interval, to avoid flooding TradingView in\n *     cases where the caller enqueues hundreds of symbols at once.\n *   - **Deduplication**: `add('X')` called twice inside the window\n *     becomes one add. Calling `add('X'); remove('X')` inside the window\n *     cancels out and produces nothing at all.\n */\n\nexport interface RateLimitOptions {\n  /**\n   * Collect operations for this many milliseconds before flushing.\n   * A shorter window means less batching but lower latency.\n   * Default: 50.\n   */\n  batchWindowMs?: number\n\n  /**\n   * Maximum symbols per dispatched chunk. Flushes larger than this are\n   * split across multiple chunks with `chunkIntervalMs` between them.\n   * Default: 50.\n   */\n  chunkSize?: number\n\n  /**\n   * Delay between consecutive chunks within a single flush.\n   * Only applies when a flush exceeds `chunkSize` symbols.\n   * Default: 100.\n   */\n  chunkIntervalMs?: number\n}\n\nexport const DEFAULT_RATE_LIMIT: Required<RateLimitOptions> = {\n  batchWindowMs: 50,\n  chunkSize: 50,\n  chunkIntervalMs: 100,\n}\n\nexport function resolveRateLimit(opts: RateLimitOptions = {}): Required<RateLimitOptions> {\n  return {\n    batchWindowMs: opts.batchWindowMs ?? DEFAULT_RATE_LIMIT.batchWindowMs,\n    chunkSize: opts.chunkSize ?? DEFAULT_RATE_LIMIT.chunkSize,\n    chunkIntervalMs: opts.chunkIntervalMs ?? DEFAULT_RATE_LIMIT.chunkIntervalMs,\n  }\n}\n\nexport interface SymbolBatcherExecutor {\n  /** Called with a chunk of symbols to add. */\n  add: (symbols: string[]) => void\n  /** Called with a chunk of symbols to remove. */\n  remove: (symbols: string[]) => void\n}\n","/**\n * Exponential backoff with jitter.\n *\n * delay(attempt) = min(initial * factor^(attempt-1), max) + jitter\n *\n * `jitter` is a fraction in [0, 1] applied symmetrically: a value of 0.3\n * means the final delay is the base delay ± up to 30%.\n *\n * The random source can be overridden for deterministic tests.\n */\n\nexport interface BackoffOptions {\n  /** First attempt delay, in milliseconds. Default: 100. */\n  initialDelayMs?: number\n  /** Upper bound for any single delay, in milliseconds. Default: 30_000. */\n  maxDelayMs?: number\n  /** Multiplier applied to each subsequent attempt. Default: 2. */\n  factor?: number\n  /** Jitter fraction in [0, 1]. Default: 0.3. */\n  jitter?: number\n}\n\nexport const DEFAULT_BACKOFF: Required<BackoffOptions> = {\n  initialDelayMs: 100,\n  maxDelayMs: 30_000,\n  factor: 2,\n  jitter: 0.3,\n}\n\nexport function calculateBackoff(\n  attempt: number,\n  opts: BackoffOptions = {},\n  random: () => number = Math.random,\n): number {\n  if (attempt < 1) throw new Error(`attempt must be >= 1, got ${attempt}`)\n\n  const initial = opts.initialDelayMs ?? DEFAULT_BACKOFF.initialDelayMs\n  const max = opts.maxDelayMs ?? DEFAULT_BACKOFF.maxDelayMs\n  const factor = opts.factor ?? DEFAULT_BACKOFF.factor\n  const jitter = clamp(opts.jitter ?? DEFAULT_BACKOFF.jitter, 0, 1)\n\n  const base = Math.min(initial * Math.pow(factor, attempt - 1), max)\n  // random() in [0, 1) → map to [-1, 1)\n  const jitterAmount = base * jitter * (random() * 2 - 1)\n  return Math.max(0, Math.round(base + jitterAmount))\n}\n\nfunction clamp(value: number, min: number, max: number): number {\n  return Math.min(Math.max(value, min), max)\n}\n","/**\n * Transport — WebSocket lifecycle with reconnect and message buffering.\n *\n * Responsibilities:\n *   - Open / close / destroy the socket\n *   - Buffer outbound messages until connected, then flush\n *   - Reconnect with exponential backoff + jitter on unexpected drops\n *   - Surface raw inbound messages via `onMessage` callback\n *   - Integrate with `AbortSignal` for external cancellation\n *\n * Non-responsibilities:\n *   - TradingView frame encoding/decoding (see `protocol.ts`)\n *   - Session management (see phase 2: `session-manager.ts`)\n *   - Heartbeat handling (composed at the SessionManager layer)\n */\n\n// `import type` is erased at compile time — it does NOT cause the `ws`\n// module to be loaded in browser bundles. The actual runtime import\n// happens dynamically inside `loadNodeWs()` below, which is only\n// reached in Node-like runtimes.\nimport type { WebSocket as NodeWebSocket, ClientOptions as NodeWsOptions } from 'ws'\nimport { calculateBackoff } from '../utils/backoff.js'\nimport { createLogger } from '../utils/logger.js'\nimport { TvConnectionError } from './errors.js'\nimport type { CloseInfo, TransportOptions, TransportState } from './transport.types.js'\n\nconst log = createLogger('transport')\n\nconst DEFAULT_MAX_ATTEMPTS = 10\n\n// Use a local interface instead of `typeof import('ws')` so ESLint's\n// consistent-type-imports rule is happy (it forbids `import()` type\n// annotations in favour of top-level `import type`, which we already\n// do above).\ninterface NodeWsModule {\n  WebSocket: typeof NodeWebSocket\n}\ntype AnyWebSocket = NodeWebSocket | WebSocket\n\n/**\n * Lazily import the Node `ws` module. Cached after the first call so\n * subsequent reconnects don't pay the import cost. In browser bundles\n * this function is never called, so `ws` never hits the bundle.\n */\nlet cachedNodeWsModule: Promise<NodeWsModule> | null = null\nfunction loadNodeWs(): Promise<NodeWsModule> {\n  if (!cachedNodeWsModule) {\n    cachedNodeWsModule = import('ws') as unknown as Promise<NodeWsModule>\n  }\n  return cachedNodeWsModule\n}\n\nexport class Transport {\n  private ws: AnyWebSocket | null = null\n  private state: TransportState = 'idle'\n  private buffer: string[] = []\n  private reconnectAttempt = 0\n  private reconnectTimer: ReturnType<typeof setTimeout> | null = null\n  private manualClose = false\n  private readonly onAbort = (): void => {\n    log('aborted via signal')\n    this.destroy()\n  }\n\n  constructor(private readonly opts: TransportOptions) {\n    if (opts.signal) {\n      if (opts.signal.aborted) {\n        this.state = 'closed'\n        return\n      }\n      opts.signal.addEventListener('abort', this.onAbort, { once: true })\n    }\n  }\n\n  /** Current transport state. */\n  getState(): TransportState {\n    return this.state\n  }\n\n  /** Number of messages currently held in the outbound buffer. */\n  getBufferedCount(): number {\n    return this.buffer.length\n  }\n\n  /**\n   * Open the WebSocket connection. Resolves when the socket reaches the\n   * `open` state, rejects if the initial handshake fails.\n   *\n   * Calling `connect()` on an already-open or already-connecting transport\n   * is a no-op and resolves immediately.\n   */\n  async connect(): Promise<void> {\n    if (this.state === 'open' || this.state === 'connecting') return\n    if (this.opts.signal?.aborted) {\n      throw new TvConnectionError('Transport aborted before connect')\n    }\n\n    this.clearReconnectTimer()\n    this.manualClose = false\n    this.state = 'connecting'\n    log('connect() → %s', this.opts.url)\n\n    // Phase 1: asynchronously create the underlying WebSocket. This may\n    // trigger a dynamic `import('ws')` on the first call in Node.\n    let ws: AnyWebSocket\n    try {\n      ws = await this.createSocket()\n    } catch (err) {\n      this.state = 'closed'\n      throw new TvConnectionError('Failed to create WebSocket', { cause: err })\n    }\n    this.ws = ws\n\n    // Phase 2: attach listeners and wait for the socket to reach open.\n    await new Promise<void>((resolve, reject) => {\n      let settled = false\n\n      const handleOpen = (): void => {\n        log('opened')\n        this.state = 'open'\n        this.reconnectAttempt = 0\n        this.opts.onOpen?.()\n        this.flushBuffer()\n        if (!settled) {\n          settled = true\n          resolve()\n        }\n      }\n\n      const handleMessage = (data: unknown): void => {\n        const raw = extractMessageData(data)\n        if (raw === null) return\n        this.opts.onMessage?.(raw)\n      }\n\n      const handleError = (err: Error): void => {\n        log('error: %s', err.message)\n        this.opts.onError?.(err)\n        if (!settled) {\n          settled = true\n          this.state = 'closed'\n          reject(err)\n        }\n      }\n\n      const handleClose = (info: CloseInfo): void => {\n        log('closed: code=%d reason=%s wasClean=%s', info.code, info.reason, info.wasClean)\n        this.ws = null\n        this.opts.onClose?.(info)\n\n        if (this.manualClose) {\n          this.state = 'closed'\n          if (!settled) {\n            settled = true\n            reject(new TvConnectionError('Closed before connection established'))\n          }\n          return\n        }\n\n        if (this.shouldReconnect()) {\n          this.scheduleReconnect()\n        } else {\n          this.state = 'closed'\n        }\n\n        if (!settled) {\n          settled = true\n          reject(new TvConnectionError(`Closed during connect: code=${info.code}`))\n        }\n      }\n\n      attachListeners(ws!, { handleOpen, handleMessage, handleError, handleClose })\n    })\n  }\n\n  /**\n   * Queue a message for sending.\n   *\n   * If the transport is not currently open, the message is buffered and\n   * sent once the connection is established. The buffer has no size limit\n   * — the caller is responsible for not flooding it in bad network\n   * conditions.\n   */\n  send(data: string): void {\n    const ws = this.ws\n    // readyState values per the WebSocket spec: CONNECTING=0, OPEN=1, CLOSING=2, CLOSED=3.\n    // The underlying socket can race ahead of our tracked `state` during an\n    // unexpected close — e.g. the peer kills the TCP connection but the\n    // `close` event has not yet been delivered. Guard against that so the\n    // message ends up safely in the buffer rather than throwing on a dead\n    // socket.\n    if (this.state !== 'open' || !ws || ws.readyState !== 1) {\n      log('send() buffered (state=%s, len=%d)', this.state, this.buffer.length + 1)\n      this.buffer.push(data)\n      return\n    }\n    try {\n      ws.send(data)\n    } catch (err) {\n      log('send() failed, re-buffering: %s', (err as Error).message)\n      this.buffer.push(data)\n    }\n  }\n\n  /**\n   * Gracefully close the current connection. Disables reconnect — use\n   * `connect()` again if you want to reopen.\n   */\n  async close(code = 1000, reason = 'Normal closure'): Promise<void> {\n    if (this.state === 'closed' || this.state === 'idle') return\n\n    this.manualClose = true\n    this.clearReconnectTimer()\n\n    const ws = this.ws\n    if (!ws) {\n      this.state = 'closed'\n      return\n    }\n\n    await new Promise<void>((resolve) => {\n      const done = (): void => {\n        this.state = 'closed'\n        resolve()\n      }\n      const timeout = setTimeout(done, 1000)\n\n      const onFinalClose = (): void => {\n        clearTimeout(timeout)\n        done()\n      }\n      if (isNodeSocket(ws)) {\n        ws.once('close', onFinalClose)\n      } else {\n        ws.addEventListener('close', onFinalClose, { once: true })\n      }\n\n      try {\n        ws.close(code, reason)\n      } catch (err) {\n        log('close() threw: %s', (err as Error).message)\n        clearTimeout(timeout)\n        done()\n      }\n    })\n  }\n\n  /**\n   * Forcefully tear down the transport. Cancels any pending reconnect,\n   * drops the buffer, and releases event listeners. After `destroy()`\n   * the transport cannot be reused.\n   */\n  destroy(): void {\n    log('destroy()')\n    this.manualClose = true\n    this.clearReconnectTimer()\n    this.buffer = []\n    this.opts.signal?.removeEventListener('abort', this.onAbort)\n\n    if (this.ws) {\n      try {\n        this.ws.close()\n      } catch {\n        /* ignore */\n      }\n      this.ws = null\n    }\n    this.state = 'closed'\n  }\n\n  // ─── private ────────────────────────────────────────────────\n\n  /**\n   * Pick the right WebSocket implementation for the current runtime.\n   *\n   *   1. Browser-like (`window` global + `WebSocket` global): use the\n   *      native `WebSocket` — `origin`/`headers`/`agent` cannot be set,\n   *      they're controlled by the browser.\n   *   2. Node-like: dynamically import the `ws` package so that browser\n   *      bundlers can tree-shake it away. This gives us `origin`,\n   *      `headers`, and `agent` for proxies.\n   *   3. Fallback: if `ws` can't be loaded but native `WebSocket` is\n   *      present (e.g. Bun, Deno, Cloudflare Workers, Node 22+), use\n   *      that — headers simply won't be set.\n   */\n  private async createSocket(): Promise<AnyWebSocket> {\n    const globalWs = (globalThis as { WebSocket?: typeof WebSocket }).WebSocket\n    const isBrowserLike = typeof (globalThis as { window?: unknown }).window !== 'undefined'\n\n    if (isBrowserLike && globalWs) {\n      log('createSocket: using native WebSocket (browser-like runtime)')\n      return new globalWs(this.opts.url)\n    }\n\n    try {\n      const wsModule = await loadNodeWs()\n      log('createSocket: using ws package')\n      const wsOpts: NodeWsOptions = {}\n      if (this.opts.origin) wsOpts.origin = this.opts.origin\n      if (this.opts.agent) wsOpts.agent = this.opts.agent as NodeWsOptions['agent']\n      if (this.opts.headers) wsOpts.headers = this.opts.headers\n      return new wsModule.WebSocket(this.opts.url, wsOpts)\n    } catch (err) {\n      if (globalWs) {\n        log('createSocket: ws unavailable, falling back to native WebSocket')\n        return new globalWs(this.opts.url)\n      }\n      throw new TvConnectionError('No WebSocket implementation available in this runtime', {\n        cause: err,\n      })\n    }\n  }\n\n  private flushBuffer(): void {\n    if (this.buffer.length === 0 || !this.ws) return\n    const ws = this.ws\n    log('flushing %d buffered messages', this.buffer.length)\n    const pending = this.buffer\n    this.buffer = []\n    for (const msg of pending) {\n      try {\n        ws.send(msg)\n      } catch (err) {\n        log('flush send failed, re-buffering: %s', (err as Error).message)\n        this.buffer.push(msg)\n      }\n    }\n  }\n\n  private shouldReconnect(): boolean {\n    const r = this.opts.reconnect\n    if (r?.enabled === false) return false\n    const max = r?.maxAttempts ?? DEFAULT_MAX_ATTEMPTS\n    return this.reconnectAttempt < max\n  }\n\n  private scheduleReconnect(): void {\n    this.reconnectAttempt += 1\n    const delayMs = calculateBackoff(this.reconnectAttempt, this.opts.reconnect ?? {})\n    log('reconnect scheduled: attempt=%d delay=%dms', this.reconnectAttempt, delayMs)\n    this.state = 'reconnecting'\n    this.opts.onReconnect?.({ attempt: this.reconnectAttempt, delayMs })\n\n    this.reconnectTimer = setTimeout(() => {\n      this.reconnectTimer = null\n      this.connect().catch((err) => {\n        log('reconnect attempt failed: %s', (err as Error).message)\n      })\n    }, delayMs)\n  }\n\n  private clearReconnectTimer(): void {\n    if (this.reconnectTimer) {\n      clearTimeout(this.reconnectTimer)\n      this.reconnectTimer = null\n    }\n  }\n}\n\n// ─── helpers ──────────────────────────────────────────────────\n\ninterface ListenerBundle {\n  handleOpen: () => void\n  handleMessage: (data: unknown) => void\n  handleError: (err: Error) => void\n  handleClose: (info: CloseInfo) => void\n}\n\nfunction attachListeners(\n  ws: AnyWebSocket,\n  { handleOpen, handleMessage, handleError, handleClose }: ListenerBundle,\n): void {\n  if (isNodeSocket(ws)) {\n    ws.on('open', handleOpen)\n    ws.on('message', handleMessage)\n    ws.on('error', (err: Error) => handleError(err))\n    ws.on('close', (code: number, reason: Buffer) =>\n      handleClose({ code, reason: reason.toString('utf8'), wasClean: code === 1000 }),\n    )\n  } else {\n    ws.onopen = (): void => handleOpen()\n    ws.onmessage = (ev: MessageEvent): void => handleMessage(ev.data)\n    ws.onerror = (): void => handleError(new TvConnectionError('WebSocket error event'))\n    ws.onclose = (ev: CloseEvent): void =>\n      handleClose({ code: ev.code, reason: ev.reason, wasClean: ev.wasClean })\n  }\n}\n\nfunction isNodeSocket(ws: AnyWebSocket): ws is NodeWebSocket {\n  return typeof (ws as NodeWebSocket).on === 'function'\n}\n\nfunction extractMessageData(data: unknown): string | null {\n  if (typeof data === 'string') return data\n  if (data instanceof Uint8Array) return new TextDecoder('utf-8').decode(data)\n  if (data instanceof ArrayBuffer) return new TextDecoder('utf-8').decode(new Uint8Array(data))\n  if (Array.isArray(data)) {\n    // Node ws can deliver fragments as Buffer[]\n    return data.map((part) => extractMessageData(part) ?? '').join('')\n  }\n  return null\n}\n","/**\n * SessionManager — glues Transport, Protocol, and per-session logic.\n *\n * Responsibilities:\n *   - Own a single `Transport` and connect/disconnect it\n *   - Auto-respond to heartbeat frames\n *   - Buffer command sends until the TradingView hello packet arrives\n *   - Route inbound command frames to the session named in `params[0]`\n *   - Replay all registered sessions after a reconnect\n *   - Provide a `sendCommand()` helper used by session classes\n */\n\nimport { decodeFrames, encodeCommand, encodeHeartbeat } from './protocol.js'\nimport type { CommandMessage, ProtocolMessage } from './protocol.types.js'\nimport { createLogger } from '../utils/logger.js'\nimport { TV_ORIGIN, TV_WS_URL } from './constants.js'\nimport { resolveRateLimit } from './rate-limiter.types.js'\nimport type { RateLimitOptions } from './rate-limiter.types.js'\nimport { Transport } from './transport.js'\nimport type { CloseInfo } from './transport.types.js'\nimport type { Session } from '../sessions/session.types.js'\nimport type { SessionManagerOptions, SessionManagerState } from './session-manager.types.js'\n\nconst log = createLogger('session-manager')\n\nconst DEFAULT_AUTH_TOKEN = 'unauthorized_user_token'\nconst DEFAULT_LOCALE: [string, string] = ['en', 'US']\n\nexport class SessionManager {\n  readonly transport: Transport\n  readonly rateLimit: Required<RateLimitOptions>\n\n  private readonly sessions = new Map<string, Session>()\n  private readonly authToken: string\n  private readonly locale: [string, string]\n  private helloData: unknown = null\n  private state: SessionManagerState = 'idle'\n  private readyWaiters: Array<{ resolve: () => void; reject: (err: Error) => void }> = []\n  private hasEverConnected = false\n  private disposed = false\n\n  constructor(opts: SessionManagerOptions = {}) {\n    this.rateLimit = resolveRateLimit(opts.rateLimit)\n    this.authToken = opts.authToken ?? DEFAULT_AUTH_TOKEN\n    this.locale = opts.locale ?? DEFAULT_LOCALE\n\n    this.transport = new Transport({\n      url: opts.url ?? TV_WS_URL,\n      origin: opts.origin ?? TV_ORIGIN,\n      agent: opts.agent,\n      headers: opts.headers,\n      reconnect: opts.reconnect,\n      signal: opts.signal,\n      onOpen: () => this.handleTransportOpen(),\n      onClose: (info) => this.handleTransportClose(info),\n      onMessage: (raw) => this.handleRawMessage(raw),\n      onReconnect: ({ attempt, delayMs }) => {\n        log('reconnect scheduled attempt=%d delay=%dms', attempt, delayMs)\n        this.state = 'reconnecting'\n      },\n      onError: (err) => log('transport error: %s', err.message),\n    })\n  }\n\n  /** Current manager state. */\n  getState(): SessionManagerState {\n    return this.state\n  }\n\n  /** The TradingView hello packet from the most recent connection, if any. */\n  getHelloData(): unknown {\n    return this.helloData\n  }\n\n  /** Number of currently registered sessions. */\n  getSessionCount(): number {\n    return this.sessions.size\n  }\n\n  /**\n   * Open the transport and wait until the TradingView hello packet is\n   * received — only after that are session commands safe to send.\n   */\n  async connect(): Promise<void> {\n    if (this.disposed) throw new Error('SessionManager has been disposed')\n    if (this.state === 'ready') return\n    this.state = 'connecting'\n    await this.transport.connect()\n    await this.waitForReady()\n  }\n\n  /**\n   * Gracefully close the transport and release all sessions. After\n   * `disconnect()` the manager cannot be reused.\n   */\n  async disconnect(): Promise<void> {\n    if (this.disposed) return\n    this.disposed = true\n    log('disconnect(): %d active sessions', this.sessions.size)\n\n    for (const session of this.sessions.values()) {\n      session.handleDisconnect()\n    }\n    this.sessions.clear()\n\n    this.rejectReadyWaiters(new Error('SessionManager disconnected'))\n\n    await this.transport.close()\n    this.state = 'closed'\n  }\n\n  /**\n   * Register a session so `SessionManager` can route inbound messages\n   * to it and include it in replay after reconnect.\n   */\n  registerSession(session: Session): void {\n    if (this.disposed) throw new Error('SessionManager has been disposed')\n    if (this.sessions.has(session.id)) {\n      throw new Error(`Session id collision: ${session.id}`)\n    }\n    this.sessions.set(session.id, session)\n    log('register: %s (total=%d)', session.id, this.sessions.size)\n  }\n\n  /** Remove a session from the routing table. */\n  unregisterSession(sessionId: string): void {\n    if (this.sessions.delete(sessionId)) {\n      log('unregister: %s (total=%d)', sessionId, this.sessions.size)\n    }\n  }\n\n  /** Send a `{ m: method, p: params }` command over the transport. */\n  sendCommand(method: string, params: unknown[]): void {\n    this.transport.send(encodeCommand(method, params))\n  }\n\n  // ─── transport wiring ───────────────────────────────────────\n\n  private handleTransportOpen(): void {\n    log('transport open')\n    // We don't transition to 'ready' here — we wait for the hello packet\n    // to arrive, so sessions don't send commands into an unprimed\n    // TradingView session.\n  }\n\n  private handleTransportClose(info: CloseInfo): void {\n    log('transport close: code=%d', info.code)\n    if (this.disposed) return\n    this.state = 'reconnecting'\n    this.helloData = null\n    // Reset per-session loaded state so a successful replay re-delivers\n    // the full snapshot.\n    for (const session of this.sessions.values()) {\n      try {\n        session.handleDisconnect()\n      } catch (err) {\n        log('session.handleDisconnect threw: %s', (err as Error).message)\n      }\n    }\n  }\n\n  private handleRawMessage(raw: string): void {\n    let frames: ProtocolMessage[]\n    try {\n      frames = decodeFrames(raw)\n    } catch (err) {\n      log('decode error: %s', (err as Error).message)\n      return\n    }\n\n    for (const frame of frames) {\n      switch (frame.type) {\n        case 'heartbeat':\n          this.transport.send(encodeHeartbeat(frame.id))\n          break\n        case 'hello':\n          this.handleHello(frame.data)\n          break\n        case 'message':\n          this.routeCommand(frame)\n          break\n      }\n    }\n  }\n\n  private handleHello(data: unknown): void {\n    this.helloData = data\n    log('hello received')\n\n    // Every connection (initial AND reconnect) must authenticate and\n    // set the locale before sending session commands. TradingView's\n    // server rejects / ignores most session commands issued without\n    // these prologue messages.\n    this.transport.send(encodeCommand('set_auth_token', [this.authToken]))\n    this.transport.send(encodeCommand('set_locale', [...this.locale]))\n\n    const wasReconnect = this.hasEverConnected\n    this.hasEverConnected = true\n    this.state = 'ready'\n\n    if (wasReconnect) {\n      // Replay all active sessions in declaration order.\n      log('replaying %d sessions after reconnect', this.sessions.size)\n      for (const session of this.sessions.values()) {\n        try {\n          session.replay()\n        } catch (err) {\n          log('session.replay threw: %s', (err as Error).message)\n        }\n      }\n    }\n\n    this.resolveReadyWaiters()\n  }\n\n  private routeCommand(frame: CommandMessage): void {\n    const sessionId = frame.params[0]\n    if (typeof sessionId !== 'string') {\n      log('unrouted (no session id): method=%s', frame.method)\n      return\n    }\n    const session = this.sessions.get(sessionId)\n    if (!session) {\n      log('message for unknown session %s: method=%s', sessionId, frame.method)\n      return\n    }\n    try {\n      session.handleMessage(frame.method, frame.params)\n    } catch (err) {\n      log('session.handleMessage threw: %s', (err as Error).message)\n    }\n  }\n\n  // ─── ready promise machinery ────────────────────────────────\n\n  private waitForReady(): Promise<void> {\n    if (this.state === 'ready') return Promise.resolve()\n    return new Promise((resolve, reject) => {\n      this.readyWaiters.push({ resolve, reject })\n    })\n  }\n\n  private resolveReadyWaiters(): void {\n    const waiters = this.readyWaiters\n    this.readyWaiters = []\n    for (const w of waiters) w.resolve()\n  }\n\n  private rejectReadyWaiters(err: Error): void {\n    const waiters = this.readyWaiters\n    this.readyWaiters = []\n    for (const w of waiters) w.reject(err)\n  }\n}\n","/**\n * SymbolBatcher — batching + chunking + dedup for quote add/remove ops.\n *\n * See `rate-limiter.types.ts` for a description of the semantics.\n */\n\nimport { createLogger } from '../utils/logger.js'\nimport {\n  type RateLimitOptions,\n  resolveRateLimit,\n  type SymbolBatcherExecutor,\n} from './rate-limiter.types.js'\n\nconst log = createLogger('rate-limiter')\n\nexport class SymbolBatcher {\n  private readonly opts: Required<RateLimitOptions>\n  private pendingAdd = new Set<string>()\n  private pendingRemove = new Set<string>()\n  private flushTimer: ReturnType<typeof setTimeout> | null = null\n  private inFlight: Promise<void> | null = null\n  private disposed = false\n\n  constructor(\n    private readonly executor: SymbolBatcherExecutor,\n    opts: RateLimitOptions = {},\n  ) {\n    this.opts = resolveRateLimit(opts)\n  }\n\n  /**\n   * Queue a symbol for addition. If the same symbol has a pending\n   * removal in the current window, the two cancel out and nothing is\n   * dispatched.\n   */\n  add(symbol: string): void {\n    if (this.disposed) return\n    if (this.pendingRemove.delete(symbol)) {\n      log('cancel: add(%s) cancelled pending remove', symbol)\n      return\n    }\n    this.pendingAdd.add(symbol)\n    this.scheduleFlush()\n  }\n\n  /**\n   * Queue a symbol for removal. If the same symbol has a pending\n   * addition in the current window, the two cancel out and nothing is\n   * dispatched.\n   */\n  remove(symbol: string): void {\n    if (this.disposed) return\n    if (this.pendingAdd.delete(symbol)) {\n      log('cancel: remove(%s) cancelled pending add', symbol)\n      return\n    }\n    this.pendingRemove.add(symbol)\n    this.scheduleFlush()\n  }\n\n  /** Number of pending operations (both adds and removes). */\n  get pendingCount(): number {\n    return this.pendingAdd.size + this.pendingRemove.size\n  }\n\n  /**\n   * Force an immediate flush of any pending operations, bypassing the\n   * batch window timer. Resolves once all resulting chunks have been\n   * dispatched through the executor.\n   */\n  async flushNow(): Promise<void> {\n    if (this.flushTimer) {\n      clearTimeout(this.flushTimer)\n      this.flushTimer = null\n    }\n    await this.flush()\n  }\n\n  /**\n   * Destroy the batcher. Any pending operations are dropped — the\n   * caller is responsible for calling `flushNow()` first if that's\n   * undesired.\n   */\n  destroy(): void {\n    if (this.disposed) return\n    this.disposed = true\n    if (this.flushTimer) {\n      clearTimeout(this.flushTimer)\n      this.flushTimer = null\n    }\n    this.pendingAdd.clear()\n    this.pendingRemove.clear()\n  }\n\n  // ─── private ────────────────────────────────────────────────\n\n  private scheduleFlush(): void {\n    if (this.flushTimer || this.disposed) return\n    this.flushTimer = setTimeout(() => {\n      this.flushTimer = null\n      void this.flush()\n    }, this.opts.batchWindowMs)\n  }\n\n  private async flush(): Promise<void> {\n    if (this.inFlight) {\n      // A flush is already in progress. Wait for it, then re-check in\n      // case more ops were enqueued in the meantime.\n      await this.inFlight\n      if (!this.disposed && (this.pendingAdd.size > 0 || this.pendingRemove.size > 0)) {\n        return this.flush()\n      }\n      return\n    }\n\n    const adds = Array.from(this.pendingAdd)\n    const removes = Array.from(this.pendingRemove)\n    this.pendingAdd.clear()\n    this.pendingRemove.clear()\n\n    if (adds.length === 0 && removes.length === 0) return\n\n    log('flush: add=%d remove=%d', adds.length, removes.length)\n\n    this.inFlight = (async () => {\n      try {\n        await this.dispatchChunks(adds, (chunk) => this.executor.add(chunk))\n        await this.dispatchChunks(removes, (chunk) => this.executor.remove(chunk))\n      } finally {\n        this.inFlight = null\n      }\n    })()\n    return this.inFlight\n  }\n\n  private async dispatchChunks(items: string[], send: (chunk: string[]) => void): Promise<void> {\n    if (items.length === 0) return\n    const { chunkSize, chunkIntervalMs } = this.opts\n    for (let i = 0; i < items.length; i += chunkSize) {\n      if (this.disposed) return\n      const chunk = items.slice(i, i + chunkSize)\n      send(chunk)\n      if (i + chunkSize < items.length) {\n        await sleep(chunkIntervalMs)\n      }\n    }\n  }\n}\n\nfunction sleep(ms: number): Promise<void> {\n  return new Promise((resolve) => setTimeout(resolve, ms))\n}\n","/**\n * Random alphanumeric id generator.\n *\n * Used for session identifiers (quote session, chart session) sent to\n * TradingView. Not cryptographically secure — just collision-resistant\n * enough for in-flight session multiplexing.\n */\n\nconst CHARS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'\n\nexport function randomId(length = 12, random: () => number = Math.random): string {\n  let out = ''\n  for (let i = 0; i < length; i++) {\n    out += CHARS.charAt(Math.floor(random() * CHARS.length))\n  }\n  return out\n}\n","/**\n * QuoteSession — manages a TradingView `quote_create_session` container.\n *\n * Responsibilities:\n *   - Send `quote_create_session` / `quote_set_fields` / `quote_add_symbols`\n *     / `quote_remove_symbols` / `quote_delete_session`\n *   - Accumulate per-symbol state across deltas\n *   - Emit typed events via callbacks\n *   - Re-register on reconnect via `replay()`\n *   - Apply rate limiting to add/remove calls through `SymbolBatcher`\n */\n\nimport { SymbolBatcher } from '../core/rate-limiter.js'\nimport type { RateLimitOptions } from '../core/rate-limiter.types.js'\nimport type { SessionManager } from '../core/session-manager.js'\nimport { createLogger } from '../utils/logger.js'\nimport { randomId } from '../utils/random-id.js'\nimport type { QuoteErrorInfo, QuoteUpdate, Session } from './session.types.js'\n\nconst log = createLogger('session:quote')\n\nexport interface QuoteSessionOptions {\n  manager: SessionManager\n  /** Override the manager-level rate limit for this session. */\n  rateLimit?: RateLimitOptions\n  /** Called for every quote delta received on this session. */\n  onUpdate?: (update: QuoteUpdate) => void\n  /** Called when TradingView returns a per-symbol error. */\n  onError?: (err: QuoteErrorInfo) => void\n  /** Called when the initial snapshot for a symbol has fully loaded. */\n  onComplete?: (symbol: string) => void\n}\n\nexport class QuoteSession implements Session {\n  readonly id: string\n  private readonly manager: SessionManager\n  private readonly batcher: SymbolBatcher\n  private readonly state = new Map<string, Record<string, unknown>>()\n  private readonly fields = new Set<string>()\n  private readonly subscribedSymbols = new Set<string>()\n  private readonly loadedSymbols = new Set<string>()\n  private disposed = false\n  private created = false\n\n  private readonly onUpdateCb?: (update: QuoteUpdate) => void\n  private readonly onErrorCb?: (err: QuoteErrorInfo) => void\n  private readonly onCompleteCb?: (symbol: string) => void\n\n  constructor(opts: QuoteSessionOptions) {\n    this.id = `qs_${randomId(12)}`\n    this.manager = opts.manager\n    this.onUpdateCb = opts.onUpdate\n    this.onErrorCb = opts.onError\n    this.onCompleteCb = opts.onComplete\n\n    this.batcher = new SymbolBatcher(\n      {\n        add: (symbols) => this.manager.sendCommand('quote_add_symbols', [this.id, ...symbols]),\n        remove: (symbols) =>\n          this.manager.sendCommand('quote_remove_symbols', [this.id, ...symbols]),\n      },\n      opts.rateLimit ?? opts.manager.rateLimit,\n    )\n\n    this.manager.registerSession(this)\n    this.sendCreate()\n  }\n\n  /** Replace the active field set and push the update to TradingView. */\n  setFields(fields: readonly string[]): void {\n    if (this.disposed) return\n    this.fields.clear()\n    for (const f of fields) this.fields.add(f)\n    if (this.created) {\n      this.manager.sendCommand('quote_set_fields', [this.id, ...this.fields])\n    }\n  }\n\n  /** Queue one symbol for addition. */\n  addSymbol(symbol: string): void {\n    if (this.disposed || !symbol) return\n    if (this.subscribedSymbols.has(symbol)) return\n    this.subscribedSymbols.add(symbol)\n    this.batcher.add(symbol)\n  }\n\n  /** Queue multiple symbols for addition. */\n  addSymbols(symbols: Iterable<string>): void {\n    for (const s of symbols) this.addSymbol(s)\n  }\n\n  /** Queue one symbol for removal. */\n  removeSymbol(symbol: string): void {\n    if (this.disposed || !symbol) return\n    if (!this.subscribedSymbols.delete(symbol)) return\n    this.loadedSymbols.delete(symbol)\n    this.state.delete(symbol)\n    this.batcher.remove(symbol)\n  }\n\n  /** Queue multiple symbols for removal. */\n  removeSymbols(symbols: Iterable<string>): void {\n    for (const s of symbols) this.removeSymbol(s)\n  }\n\n  /** All symbols currently subscribed on this session (local view). */\n  getSubscribedSymbols(): readonly string[] {\n    return Array.from(this.subscribedSymbols)\n  }\n\n  /** Accumulated quote state for a symbol, if any. */\n  getSnapshot(symbol: string): Readonly<Record<string, unknown>> | undefined {\n    return this.state.get(symbol)\n  }\n\n  /** Force-flush any pending add/remove operations. */\n  async flushPending(): Promise<void> {\n    await this.batcher.flushNow()\n  }\n\n  /**\n   * Delete the server-side session and release local resources.\n   * Safe to call more than once.\n   */\n  async delete(): Promise<void> {\n    if (this.disposed) return\n    this.disposed = true\n    try {\n      await this.batcher.flushNow()\n    } catch {\n      /* ignore flush errors during teardown */\n    }\n    this.batcher.destroy()\n    if (this.created) {\n      this.manager.sendCommand('quote_delete_session', [this.id])\n    }\n    this.manager.unregisterSession(this.id)\n    this.state.clear()\n    this.subscribedSymbols.clear()\n    this.loadedSymbols.clear()\n  }\n\n  // ─── Session interface ─────────────────────────────────────\n\n  handleMessage(method: string, params: unknown[]): void {\n    switch (method) {\n      case 'qsd':\n        this.handleQsd(params)\n        break\n      case 'quote_completed':\n        this.handleQuoteCompleted(params)\n        break\n      default:\n        log('ignoring unknown method %s', method)\n    }\n  }\n\n  handleDisconnect(): void {\n    // Keep subscribedSymbols + fields so replay() can restore them.\n    // But the server's view of \"loaded\" is gone, so next deltas should\n    // look like a fresh initial load.\n    this.loadedSymbols.clear()\n    this.created = false\n  }\n\n  replay(): void {\n    if (this.disposed) return\n    log('replay %s: %d symbols', this.id, this.subscribedSymbols.size)\n    this.sendCreate()\n    if (this.fields.size > 0) {\n      this.manager.sendCommand('quote_set_fields', [this.id, ...this.fields])\n    }\n    if (this.subscribedSymbols.size > 0) {\n      // Bypass the batcher on replay — we need deterministic ordering.\n      this.manager.sendCommand('quote_add_symbols', [this.id, ...this.subscribedSymbols])\n    }\n  }\n\n  // ─── private ───────────────────────────────────────────────\n\n  private sendCreate(): void {\n    this.manager.sendCommand('quote_create_session', [this.id])\n    this.created = true\n  }\n\n  private handleQsd(params: unknown[]): void {\n    const payload = params[1]\n    if (!isQsdPayload(payload)) return\n\n    if (payload.s === 'error') {\n      this.onErrorCb?.({\n        symbol: payload.n,\n        message: typeof payload.errmsg === 'string' ? payload.errmsg : 'Unknown error',\n      })\n      return\n    }\n\n    const prev = this.state.get(payload.n) ?? {}\n    const snapshot = { ...prev, ...payload.v }\n    this.state.set(payload.n, snapshot)\n\n    const isFirstLoad = !this.loadedSymbols.has(payload.n)\n\n    this.onUpdateCb?.({\n      symbol: payload.n,\n      delta: payload.v,\n      snapshot,\n      isFirstLoad,\n    })\n  }\n\n  private handleQuoteCompleted(params: unknown[]): void {\n    const symbol = params[1]\n    if (typeof symbol !== 'string') return\n    this.loadedSymbols.add(symbol)\n    this.onCompleteCb?.(symbol)\n  }\n}\n\ninterface QsdPayload {\n  n: string\n  s: 'ok' | 'error'\n  v: Record<string, unknown>\n  errmsg?: string\n}\n\nfunction isQsdPayload(p: unknown): p is QsdPayload {\n  if (typeof p !== 'object' || p === null) return false\n  const obj = p as Record<string, unknown>\n  return (\n    typeof obj.n === 'string' &&\n    (obj.s === 'ok' || obj.s === 'error') &&\n    typeof obj.v === 'object' &&\n    obj.v !== null\n  )\n}\n","/**\n * OHLCV candle types and timeframe definitions.\n */\n\nimport { TvError } from '../core/errors.js'\n\n/** A single OHLCV bar. All times are UTC epoch seconds. */\nexport interface Candle {\n  /** Bar start time, UTC epoch seconds. */\n  time: number\n  open: number\n  high: number\n  low: number\n  close: number\n  volume: number\n}\n\n/**\n * TradingView-native timeframe strings — these are the exact values\n * sent on the wire in `create_series`. Minute-based values are the\n * count of minutes (\"60\" = 1 hour, \"240\" = 4 hours).\n *\n * Case matters: lower-case `m` is never used raw — see `TimeframeAlias`.\n */\nexport type RawTimeframe =\n  | '1'\n  | '3'\n  | '5'\n  | '15'\n  | '30'\n  | '45'\n  | '60'\n  | '120'\n  | '180'\n  | '240'\n  | '360'\n  | '480'\n  | '720'\n  | '1D'\n  | '3D'\n  | '1W'\n  | '1M'\n  | '3M'\n  | '6M'\n  | '12M'\n\n/**\n * Human-friendly timeframe aliases. Case-sensitive:\n *   - lowercase `m` = minute\n *   - uppercase `M` = month (use `RawTimeframe`'s `'1M'` / `'3M'` directly)\n */\nexport type TimeframeAlias =\n  | '1m'\n  | '3m'\n  | '5m'\n  | '15m'\n  | '30m'\n  | '45m'\n  | '1h'\n  | '2h'\n  | '3h'\n  | '4h'\n  | '6h'\n  | '8h'\n  | '12h'\n  | '1d'\n  | '3d'\n  | '1w'\n\n/** Any value accepted by the public API. Normalized to `RawTimeframe` before going on the wire. */\nexport type Timeframe = RawTimeframe | TimeframeAlias\n\n/**\n * Lookup table mapping every accepted `Timeframe` value to the\n * TradingView-native string. The `Record<Timeframe, RawTimeframe>`\n * constraint guarantees exhaustive coverage at compile time.\n */\nconst TIMEFRAME_MAP: Record<Timeframe, RawTimeframe> = {\n  // Raw timeframes (identity)\n  '1': '1',\n  '3': '3',\n  '5': '5',\n  '15': '15',\n  '30': '30',\n  '45': '45',\n  '60': '60',\n  '120': '120',\n  '180': '180',\n  '240': '240',\n  '360': '360',\n  '480': '480',\n  '720': '720',\n  '1D': '1D',\n  '3D': '3D',\n  '1W': '1W',\n  '1M': '1M',\n  '3M': '3M',\n  '6M': '6M',\n  '12M': '12M',\n\n  // Human aliases\n  '1m': '1',\n  '3m': '3',\n  '5m': '5',\n  '15m': '15',\n  '30m': '30',\n  '45m': '45',\n  '1h': '60',\n  '2h': '120',\n  '3h': '180',\n  '4h': '240',\n  '6h': '360',\n  '8h': '480',\n  '12h': '720',\n  '1d': '1D',\n  '3d': '3D',\n  '1w': '1W',\n}\n\n/**\n * Convert any accepted `Timeframe` value to the raw TradingView string\n * that must be sent on the wire.\n *\n * Throws `TvError` if called with a string that isn't a known timeframe.\n * This exists as a runtime guard for values coming from untyped\n * sources (JSON config files, user input, etc.).\n */\nexport function normalizeTimeframe(tf: Timeframe | string): RawTimeframe {\n  const out = TIMEFRAME_MAP[tf as Timeframe]\n  if (!out) {\n    throw new TvError(`Unknown timeframe: \"${tf}\"`)\n  }\n  return out\n}\n\n/** Runtime list of every valid timeframe alias, useful for docs and validation. */\nexport const TIMEFRAME_ALIASES: readonly Timeframe[] = Object.keys(TIMEFRAME_MAP) as Timeframe[]\n","/**\n * ChartSession — manages a TradingView `chart_create_session` container.\n *\n * This session type is used for historical candle data and live bar\n * updates. A typical flow:\n *\n *   1. `chart_create_session` to open the container\n *   2. `resolve_symbol` to bind a symbol key (e.g. `sym_1`) to a market pair\n *   3. `create_series` to request N bars for that symbol at a timeframe\n *   4. Receive `timescale_update` (initial bars) and subsequent `du`\n *      (data update) messages as bars tick\n *   5. `chart_delete_session` on teardown\n *\n * This class wraps all of that into a simple callback-driven API. A\n * higher-level layer (Phase 4 `Symbol.candles()`) will consume it via\n * a promise-returning helper.\n */\n\nimport { createLogger } from '../utils/logger.js'\nimport { randomId } from '../utils/random-id.js'\nimport { TvError, TvSymbolError, TvTimeoutError } from '../core/errors.js'\nimport type { SessionManager } from '../core/session-manager.js'\nimport { normalizeTimeframe } from '../types/candle.js'\nimport type { Candle, Timeframe } from '../types/candle.js'\nimport type { CandlesUpdate, CandleTick, Session } from './session.types.js'\n\nconst log = createLogger('session:chart')\n\nexport type { Timeframe }\n\nexport interface SeriesRequest {\n  /** Full TradingView pair, e.g. `'BINANCE:BTCUSDT'`. */\n  symbol: string\n  /** Candle timeframe (TradingView native, e.g. `'60'` for 1h, `'1D'` for daily). */\n  timeframe: Timeframe\n  /** Number of bars to request on initial load. */\n  barCount: number\n}\n\nexport interface ChartSessionOptions {\n  manager: SessionManager\n  /** Called when a batch of bars arrives on a series (initial load). */\n  onCandles?: (update: CandlesUpdate) => void\n  /** Called when a single bar ticks live after the initial load. */\n  onTick?: (tick: CandleTick) => void\n  /** Called when TradingView rejects a symbol or a series. */\n  onError?: (err: TvSymbolError) => void\n}\n\ninterface InternalSeries {\n  seriesId: string\n  symbolKey: string\n  request: SeriesRequest\n  /** Timeframe already normalized to the TradingView wire format. */\n  rawTimeframe: string\n  resolved: boolean\n  initialLoaded: boolean\n}\n\ninterface PendingResolve {\n  pair: string\n  resolve: (info: Record<string, unknown>) => void\n  reject: (err: Error) => void\n}\n\ninterface PendingCandles {\n  symbol: string\n  resolve: (candles: Candle[]) => void\n  reject: (err: Error) => void\n}\n\nexport class ChartSession implements Session {\n  readonly id: string\n  private readonly manager: SessionManager\n  private readonly series = new Map<string, InternalSeries>() // by seriesId\n  private readonly seriesBySymbolKey = new Map<string, InternalSeries>() // by symbolKey\n  private nextSymbolSeq = 1\n  private nextSeriesSeq = 1\n  private created = false\n  private disposed = false\n\n  private readonly onCandlesCb?: (update: CandlesUpdate) => void\n  private readonly onTickCb?: (tick: CandleTick) => void\n  private readonly onErrorCb?: (err: TvSymbolError) => void\n\n  // One-shot helpers — see `resolvePair()` and `fetchCandlesOnce()`.\n  private readonly pendingResolves = new Map<string, PendingResolve>() // by symbolKey\n  private readonly pendingCandles = new Map<string, PendingCandles>() // by seriesId\n\n  constructor(opts: ChartSessionOptions) {\n    this.id = `cs_${randomId(12)}`\n    this.manager = opts.manager\n    this.onCandlesCb = opts.onCandles\n    this.onTickCb = opts.onTick\n    this.onErrorCb = opts.onError\n\n    this.manager.registerSession(this)\n    this.sendCreate()\n  }\n\n  /**\n   * Request a series of bars for a symbol. The `onCandles` callback is\n   * invoked once the initial batch arrives; subsequent bar updates come\n   * through `onTick`.\n   *\n   * Returns the generated `seriesId`, which can be used with\n   * `requestMore()` to fetch additional historical bars.\n   */\n  requestSeries(request: SeriesRequest): string {\n    if (this.disposed) throw new Error('ChartSession has been disposed')\n\n    const rawTimeframe = normalizeTimeframe(request.timeframe)\n    const symbolKey = `sym_${this.nextSymbolSeq++}`\n    const seriesId = `sds_${this.nextSeriesSeq++}`\n    const internal: InternalSeries = {\n      seriesId,\n      symbolKey,\n      request,\n      rawTimeframe,\n      resolved: false,\n      initialLoaded: false,\n    }\n    this.series.set(seriesId, internal)\n    this.seriesBySymbolKey.set(symbolKey, internal)\n\n    this.manager.sendCommand('resolve_symbol', [\n      this.id,\n      symbolKey,\n      `={\"symbol\":\"${request.symbol}\",\"adjustment\":\"splits\"}`,\n    ])\n    this.manager.sendCommand('create_series', [\n      this.id,\n      seriesId,\n      seriesId,\n      symbolKey,\n      rawTimeframe,\n      request.barCount,\n      '',\n    ])\n\n    log('requestSeries %s → %s %s x%d', request.symbol, seriesId, rawTimeframe, request.barCount)\n    return seriesId\n  }\n\n  /** Request additional historical bars for an existing series. */\n  requestMore(seriesId: string, additionalBars: number): void {\n    if (this.disposed) return\n    const s = this.series.get(seriesId)\n    if (!s) {\n      log('requestMore: unknown seriesId %s', seriesId)\n      return\n    }\n    this.manager.sendCommand('request_more_data', [this.id, seriesId, additionalBars])\n  }\n\n  /** Remove a series (stop receiving updates for it). */\n  removeSeries(seriesId: string): void {\n    if (this.disposed) return\n    const s = this.series.get(seriesId)\n    if (!s) return\n    this.manager.sendCommand('remove_series', [this.id, seriesId])\n    this.series.delete(seriesId)\n    this.seriesBySymbolKey.delete(s.symbolKey)\n  }\n\n  /** All active series keyed by `seriesId`. */\n  getSeries(): ReadonlyMap<string, { symbol: string; timeframe: string }> {\n    const out = new Map<string, { symbol: string; timeframe: string }>()\n    for (const [id, s] of this.series) {\n      out.set(id, { symbol: s.request.symbol, timeframe: s.rawTimeframe })\n    }\n    return out\n  }\n\n  /**\n   * Promise-based helper: resolve a symbol without creating a series.\n   * Returns the raw `symbol_resolved` payload from TradingView.\n   *\n   * Useful for fetching symbol metadata (description, exchange, type,\n   * session hours, etc.) without paying for a candle subscription.\n   */\n  async resolvePair(pair: string, timeoutMs = 5000): Promise<Record<string, unknown>> {\n    if (this.disposed) throw new TvError('ChartSession has been disposed')\n\n    const symbolKey = `sym_${this.nextSymbolSeq++}`\n\n    return new Promise<Record<string, unknown>>((resolve, reject) => {\n      const timer = setTimeout(() => {\n        this.pendingResolves.delete(symbolKey)\n        reject(new TvTimeoutError(`resolvePair(${pair})`, timeoutMs))\n      }, timeoutMs)\n\n      this.pendingResolves.set(symbolKey, {\n        pair,\n        resolve: (info) => {\n          clearTimeout(timer)\n          resolve(info)\n        },\n        reject: (err) => {\n          clearTimeout(timer)\n          reject(err)\n        },\n      })\n\n      this.manager.sendCommand('resolve_symbol', [\n        this.id,\n        symbolKey,\n        `={\"symbol\":\"${pair}\",\"adjustment\":\"splits\"}`,\n      ])\n    })\n  }\n\n  /**\n   * Promise-based helper: fetch a historical candle window in one call.\n   * Creates a temporary series, waits for the initial backfill, then\n   * removes the series and returns the candles.\n   */\n  async fetchCandlesOnce(\n    symbol: string,\n    opts: { timeframe: Timeframe; barCount: number },\n    timeoutMs = 15_000,\n  ): Promise<Candle[]> {\n    if (this.disposed) throw new TvError('ChartSession has been disposed')\n\n    return new Promise<Candle[]>((resolve, reject) => {\n      let seriesId: string\n      const timer = setTimeout(() => {\n        this.pendingCandles.delete(seriesId)\n        reject(new TvTimeoutError(`fetchCandlesOnce(${symbol})`, timeoutMs))\n      }, timeoutMs)\n\n      try {\n        seriesId = this.requestSeries({\n          symbol,\n          timeframe: opts.timeframe,\n          barCount: opts.barCount,\n        })\n      } catch (err) {\n        clearTimeout(timer)\n        reject(err as Error)\n        return\n      }\n\n      this.pendingCandles.set(seriesId, {\n        symbol,\n        resolve: (candles) => {\n          clearTimeout(timer)\n          this.removeSeries(seriesId)\n          resolve(candles)\n        },\n        reject: (err) => {\n          clearTimeout(timer)\n          this.removeSeries(seriesId)\n          reject(err)\n        },\n      })\n    })\n  }\n\n  /** Close the chart session on the server and release local state. */\n  async delete(): Promise<void> {\n    if (this.disposed) return\n    this.disposed = true\n\n    // Reject any pending one-shot promises so callers don't hang.\n    for (const p of this.pendingResolves.values()) {\n      p.reject(new TvError('ChartSession deleted before resolve'))\n    }\n    this.pendingResolves.clear()\n    for (const p of this.pendingCandles.values()) {\n      p.reject(new TvError('ChartSession deleted before candles delivered'))\n    }\n    this.pendingCandles.clear()\n\n    if (this.created) {\n      this.manager.sendCommand('chart_delete_session', [this.id])\n    }\n    this.manager.unregisterSession(this.id)\n    this.series.clear()\n    this.seriesBySymbolKey.clear()\n  }\n\n  // ─── Session interface ─────────────────────────────────────\n\n  handleMessage(method: string, params: unknown[]): void {\n    switch (method) {\n      case 'symbol_resolved':\n        this.handleSymbolResolved(params)\n        break\n      case 'symbol_error':\n        this.handleSymbolError(params)\n        break\n      case 'series_loading':\n        // Just an ack that the series has been accepted; nothing to do.\n        break\n      case 'series_completed':\n        // Historical load complete — initialLoaded is set inside du/timescale_update.\n        break\n      case 'series_error':\n        this.handleSeriesError(params)\n        break\n      case 'timescale_update':\n      case 'du':\n        this.handleSeriesData(method, params)\n        break\n      default:\n        log('ignoring unknown method %s', method)\n    }\n  }\n\n  handleDisconnect(): void {\n    this.created = false\n    for (const s of this.series.values()) {\n      s.resolved = false\n      s.initialLoaded = false\n    }\n  }\n\n  replay(): void {\n    if (this.disposed) return\n    log('replay %s: %d series', this.id, this.series.size)\n    this.sendCreate()\n    // Re-resolve and re-create every series.\n    for (const s of this.series.values()) {\n      this.manager.sendCommand('resolve_symbol', [\n        this.id,\n        s.symbolKey,\n        `={\"symbol\":\"${s.request.symbol}\",\"adjustment\":\"splits\"}`,\n      ])\n      this.manager.sendCommand('create_series', [\n        this.id,\n        s.seriesId,\n        s.seriesId,\n        s.symbolKey,\n        s.rawTimeframe,\n        s.request.barCount,\n        '',\n      ])\n    }\n  }\n\n  // ─── private ───────────────────────────────────────────────\n\n  private sendCreate(): void {\n    this.manager.sendCommand('chart_create_session', [this.id])\n    this.created = true\n  }\n\n  private handleSymbolResolved(params: unknown[]): void {\n    const symbolKey = params[1]\n    if (typeof symbolKey !== 'string') return\n\n    // Promise-based one-shot resolve takes priority.\n    const pending = this.pendingResolves.get(symbolKey)\n    if (pending) {\n      this.pendingResolves.delete(symbolKey)\n      const info = params[2]\n      if (typeof info === 'object' && info !== null) {\n        pending.resolve(info as Record<string, unknown>)\n      } else {\n        pending.reject(new TvError(`Invalid symbol_resolved payload for ${pending.pair}`))\n      }\n      return\n    }\n\n    // Otherwise it's attached to a running series.\n    const series = this.seriesBySymbolKey.get(symbolKey)\n    if (!series) return\n    series.resolved = true\n  }\n\n  private handleSymbolError(params: unknown[]): void {\n    const symbolKey = params[1]\n    if (typeof symbolKey !== 'string') return\n\n    const reason = typeof params[2] === 'string' ? params[2] : 'symbol_error'\n\n    // Reject the one-shot resolver if present.\n    const pending = this.pendingResolves.get(symbolKey)\n    if (pending) {\n      this.pendingResolves.delete(symbolKey)\n      pending.reject(new TvSymbolError(pending.pair, reason))\n      return\n    }\n\n    const series = this.seriesBySymbolKey.get(symbolKey)\n    if (!series) return\n    this.onErrorCb?.(new TvSymbolError(series.request.symbol, reason))\n    // Also reject any pending candles tied to this series.\n    const pendingCandles = this.pendingCandles.get(series.seriesId)\n    if (pendingCandles) {\n      this.pendingCandles.delete(series.seriesId)\n      pendingCandles.reject(new TvSymbolError(series.request.symbol, reason))\n    }\n    this.series.delete(series.seriesId)\n    this.seriesBySymbolKey.delete(symbolKey)\n  }\n\n  private handleSeriesError(params: unknown[]): void {\n    const seriesId = params[1]\n    if (typeof seriesId !== 'string') return\n    const series = this.series.get(seriesId)\n    if (!series) return\n    const reason = typeof params[2] === 'string' ? params[2] : 'series_error'\n    this.onErrorCb?.(new TvSymbolError(series.request.symbol, reason))\n    this.series.delete(seriesId)\n    this.seriesBySymbolKey.delete(series.symbolKey)\n  }\n\n  /**\n   * Handle `timescale_update` and `du` (data update). Both carry a\n   * payload of the form:\n   *\n   *   { sds_1: { s: [ { i, v: [time, open, high, low, close, volume] }, ... ] } }\n   *\n   * `timescale_update` is typically the initial historical dump;\n   * subsequent `du` updates usually contain only the last tick.\n   */\n  private handleSeriesData(method: string, params: unknown[]): void {\n    const payload = params[1]\n    if (typeof payload !== 'object' || payload === null) return\n\n    for (const [seriesId, value] of Object.entries(payload)) {\n      const series = this.series.get(seriesId)\n      if (!series) continue\n\n      const candles = extractCandles(value)\n      if (candles.length === 0) continue\n\n      // Heuristic: an update larger than 1 bar is part of the historical\n      // backfill. A single-bar update is a live tick.\n      const isBackfill = method === 'timescale_update' || candles.length > 1\n\n      // If the backfill finishes a one-shot pending candle fetch,\n      // resolve its promise (which also removes the series).\n      if (isBackfill) {\n        const pending = this.pendingCandles.get(seriesId)\n        if (pending) {\n          this.pendingCandles.delete(seriesId)\n          pending.resolve(candles)\n          continue\n        }\n      }\n\n      if (isBackfill && !series.initialLoaded) {\n        series.initialLoaded = true\n        this.onCandlesCb?.({\n          seriesId,\n          symbol: series.request.symbol,\n          candles,\n        })\n      } else {\n        for (const candle of candles) {\n          this.onTickCb?.({\n            seriesId,\n            symbol: series.request.symbol,\n            candle,\n          })\n        }\n      }\n    }\n  }\n}\n\n/**\n * Extract candles from a `sds_1`-shaped payload.\n *\n * Shape: `{ s: [ { i: number, v: [time, open, high, low, close, volume] } ] }`.\n * We tolerate missing `s` or non-numeric entries.\n */\nfunction extractCandles(value: unknown): Candle[] {\n  if (typeof value !== 'object' || value === null) return []\n  const s = (value as { s?: unknown }).s\n  if (!Array.isArray(s)) return []\n\n  const out: Candle[] = []\n  for (const entry of s) {\n    if (typeof entry !== 'object' || entry === null) continue\n    const v = (entry as { v?: unknown }).v\n    if (!Array.isArray(v) || v.length < 6) continue\n    const [time, open, high, low, close, volume] = v\n    if (\n      typeof time !== 'number' ||\n      typeof open !== 'number' ||\n      typeof high !== 'number' ||\n      typeof low !== 'number' ||\n      typeof close !== 'number' ||\n      typeof volume !== 'number'\n    ) {\n      continue\n    }\n    out.push({ time, open, high, low, close, volume })\n  }\n  return out\n}\n","/**\n * Convert `kebab-case` and `snake_case` strings to `camelCase`.\n *\n * TradingView's wire format mixes both conventions: `series-key`,\n * `base_name`, `session-regular-display`, `is_tradable`, etc. Our\n * public API exposes everything as camelCase — this helper is the\n * single conversion point.\n *\n * Examples:\n *   kebabToCamel('series-key')             → 'seriesKey'\n *   kebabToCamel('base_name')              → 'baseName'\n *   kebabToCamel('session-regular-display') → 'sessionRegularDisplay'\n *   kebabToCamel('is_tradable')            → 'isTradable'\n *   kebabToCamel('has-no-bbo')             → 'hasNoBbo'\n *\n * Edge behaviour:\n *   - Already-camelCase strings pass through unchanged.\n *   - Numeric segments are kept: `rt-lag` → `rtLag`, `price_52_week_high` → `price52WeekHigh`.\n *   - Leading separators are preserved (`-foo` → `-foo`, unlikely to appear in TV payloads).\n *   - Consecutive separators collapse: `a--b` → `aB`.\n */\nexport function kebabToCamel(key: string): string {\n  if (key.length === 0) return key\n  return key.replace(/[-_]+([a-zA-Z0-9])/g, (_, char: string) => char.toUpperCase())\n}\n\n/**\n * Shallow-transform the top-level keys of an object from kebab/snake to\n * camelCase. Values are passed through unchanged — nested objects keep\n * their original key casing, because TradingView nests things like\n * `local_popularity: { US: 123, DE: 45 }` where the inner keys are\n * country codes and must NOT be lowercased.\n *\n * If you need recursive transformation, do it explicitly at each level\n * where it makes sense.\n */\nexport function transformKeys<T = Record<string, unknown>>(obj: Record<string, unknown>): T {\n  const out: Record<string, unknown> = {}\n  for (const [key, value] of Object.entries(obj)) {\n    out[kebabToCamel(key)] = value\n  }\n  return out as T\n}\n","/**\n * Typed SymbolInfo — the camelCase view of TradingView's raw\n * `symbol_resolved` payload.\n *\n * All fields are optional because TradingView emits different subsets\n * for different instrument types (crypto vs stock vs forex etc.).\n * Consumers should defensively check presence before use.\n *\n * The raw → typed conversion is a single pass through `transformKeys`\n * (see `utils/kebab-to-camel.ts`). Any field TradingView adds in the\n * future will automatically surface on the returned object (with type\n * `unknown`) even if it isn't declared here.\n */\n\nimport { transformKeys } from '../utils/kebab-to-camel.js'\n\nexport interface SymbolInfo {\n  // ─── Identity ─────────────────────────────────────────────\n  seriesKey?: string\n  baseName?: string[]\n  symbol?: string\n  symbolFullname?: string\n  feedTicker?: string\n  exchangeListedSymbol?: string\n\n  shortName?: string\n  proName?: string\n  originalName?: string\n  symbolPrimaryName?: string\n  symbolProname?: string\n\n  // ─── Session and trading hours ─────────────────────────────\n  sessionId?: string\n  sessionRegular?: string\n  sessionExtended?: string\n  sessionDisplay?: string\n  sessionRegularDisplay?: string\n  sessionExtendedDisplay?: string\n  subsessions?: unknown[]\n  subsessionId?: string\n  currentSession?: string\n  marketStatus?: {\n    phase?: string\n    tradingday?: string\n  }\n\n  // ─── Exchange and venue ────────────────────────────────────\n  exchange?: string\n  exchangeTraded?: string\n  listedExchange?: string\n  providerId?: string\n  group?: string\n\n  // ─── Descriptive ───────────────────────────────────────────\n  description?: string\n  shortDescription?: string\n  type?: string\n\n  // ─── Currency ──────────────────────────────────────────────\n  currencyCode?: string\n  currencyId?: string\n  baseCurrency?: string\n  baseCurrencyId?: string\n  currencyLogoid?: string\n  baseCurrencyLogoid?: string\n\n  // ─── Precision ─────────────────────────────────────────────\n  maxPrecision?: number\n  variableTickSize?: string\n\n  // ─── Capability flags ──────────────────────────────────────\n  isTradable?: boolean\n  hasDepth?: boolean\n  fundamentalData?: boolean\n  fractional?: boolean\n  feedHasIntraday?: boolean\n  hasIntraday?: boolean\n  isReplayable?: boolean\n  hasPriceSnapshot?: boolean\n  feedHasDwm?: boolean\n  hasNoBbo?: boolean\n  hasNoVolume?: boolean\n  hasDwm?: boolean\n\n  // ─── Popularity ────────────────────────────────────────────\n  popularityRank?: number\n  localPopularity?: Record<string, number>\n  localPopularityRank?: Record<string, number>\n\n  // ─── Internal / misc ───────────────────────────────────────\n  perms?: Record<string, unknown>\n  proPerm?: string\n  historyTag?: string\n  internalStudyId?: string\n  internalStudyInputs?: Record<string, unknown>\n  rtLag?: string\n  rtUpdateTime?: string\n  timezone?: string\n  feed?: string\n  visiblePlotsSet?: string\n  prefixes?: string[]\n  brokerNames?: Record<string, unknown>\n  volumeType?: string\n  typespecs?: string[]\n\n  // ─── Forward-compat: unknown future fields ─────────────────\n  [key: string]: unknown\n}\n\n/**\n * Convert a raw `symbol_resolved` payload into a `SymbolInfo`.\n *\n * This is a shallow conversion — it only camelCases the top-level\n * keys. Nested objects (like `marketStatus`, `localPopularity`) keep\n * their original key casing because their keys are data, not schema\n * (country codes, phase names, etc.).\n */\nexport function symbolInfoFromRaw(raw: Record<string, unknown>): SymbolInfo {\n  return transformKeys<SymbolInfo>(raw)\n}\n","/**\n * Stream — typed event emitter returned by `TvSymbol.stream()`.\n *\n * A `Stream` is a thin wrapper around a `TvSymbol`'s ongoing quote\n * subscription. It exposes strongly-typed events and a closable\n * lifecycle, plus an `AsyncIterator` interface so you can consume\n * updates with `for await`.\n *\n * All event handlers receive a single object argument (never positional\n * arguments) so adding new fields in the future is a non-breaking\n * change.\n */\n\nimport { createLogger } from '../utils/logger.js'\nimport type { QuoteUpdate } from '../sessions/session.types.js'\nimport type { BarTick, FullQuoteSnapshot, QuoteField, TradeTick } from '../types/quote-fields.js'\nimport type { TvSymbol } from './symbol.js'\n\nconst log = createLogger('stream')\n\nexport interface StreamEventMap {\n  /** Fires on every quote delta. `data` is the full accumulated snapshot. */\n  update: { symbol: string; data: FullQuoteSnapshot }\n  /** Fires whenever the last traded price (`lp`) changes. */\n  price: { price: number }\n  /** Fires whenever `ch`/`chp` change (both present in the accumulated snapshot). */\n  change: { value: number; percent: number }\n  /** Fires when a new bar arrives (`trade`, `minute-bar`, or `daily-bar`). */\n  bar: { bar: TradeTick | BarTick }\n  /** Fires on per-symbol errors reported by TradingView. */\n  error: Error\n}\n\ntype StreamEventName = keyof StreamEventMap\ntype Handler<E extends StreamEventName> = (data: StreamEventMap[E]) => void\n\nexport class Stream {\n  private readonly listeners: { [K in StreamEventName]: Set<Handler<K>> } = {\n    update: new Set(),\n    price: new Set(),\n    change: new Set(),\n    bar: new Set(),\n    error: new Set(),\n  }\n\n  private closed = false\n  private iteratorQueue: StreamEventMap['update'][] = []\n  private iteratorResolve: ((value: IteratorResult<StreamEventMap['update']>) => void) | null = null\n\n  constructor(\n    readonly tvSymbol: TvSymbol,\n    /** Fields this stream was opened with. Currently informational only. */\n    readonly fields: readonly QuoteField[],\n  ) {}\n\n  /** Register a listener for a specific stream event. */\n  on<E extends StreamEventName>(event: E, handler: Handler<E>): this {\n    this.listeners[event].add(handler)\n    return this\n  }\n\n  /** Remove a previously registered listener. */\n  off<E extends StreamEventName>(event: E, handler: Handler<E>): this {\n    this.listeners[event].delete(handler)\n    return this\n  }\n\n  /** Close the stream and release its resources. */\n  close(): void {\n    if (this.closed) return\n    this.closed = true\n    this.tvSymbol._removeStream(this)\n    for (const event of Object.keys(this.listeners) as StreamEventName[]) {\n      this.listeners[event].clear()\n    }\n    this.flushIteratorOnClose()\n  }\n\n  [Symbol.dispose](): void {\n    this.close()\n  }\n\n  /**\n   * Async iterator interface — iterate over `update` events with\n   * `for await`. Breaking out of the loop automatically closes the\n   * stream.\n   */\n  [Symbol.asyncIterator](): AsyncIterator<StreamEventMap['update']> {\n    return {\n      next: (): Promise<IteratorResult<StreamEventMap['update']>> => {\n        if (this.closed && this.iteratorQueue.length === 0) {\n          return Promise.resolve({ value: undefined as never, done: true })\n        }\n        const queued = this.iteratorQueue.shift()\n        if (queued !== undefined) {\n          return Promise.resolve({ value: queued, done: false })\n        }\n        return new Promise((resolve) => {\n          this.iteratorResolve = resolve\n        })\n      },\n      return: (): Promise<IteratorResult<StreamEventMap['update']>> => {\n        this.close()\n        return Promise.resolve({ value: undefined as never, done: true })\n      },\n    }\n  }\n\n  // ─── Internal dispatch API (called by TvSymbol) ─────────────\n\n  /** @internal */\n  _dispatch(u: QuoteUpdate, snapshot: FullQuoteSnapshot): void {\n    if (this.closed) return\n\n    // Shallow-copy the snapshot so historical update events are not\n    // mutated when subsequent deltas modify the parent snapshotState.\n    // Listeners can safely hold references across events.\n    const updateEvent: StreamEventMap['update'] = {\n      symbol: u.symbol,\n      data: { ...snapshot },\n    }\n    this.emit('update', updateEvent)\n    this.pushToIterator(updateEvent)\n\n    const delta = u.delta as Record<string, unknown>\n\n    if ('lp' in delta && typeof delta.lp === 'number') {\n      this.emit('price', { price: delta.lp })\n    }\n\n    if ('ch' in delta || 'chp' in delta) {\n      const snap = snapshot as Record<string, unknown>\n      if (typeof snap.ch === 'number' && typeof snap.chp === 'number') {\n        this.emit('change', { value: snap.ch, percent: snap.chp })\n      }\n    }\n\n    if ('minute-bar' in delta) {\n      this.emit('bar', { bar: delta['minute-bar'] as BarTick })\n    } else if ('daily-bar' in delta) {\n      this.emit('bar', { bar: delta['daily-bar'] as BarTick })\n    } else if ('trade' in delta) {\n      this.emit('bar', { bar: delta.trade as TradeTick })\n    }\n  }\n\n  /** @internal */\n  _dispatchError(err: Error): void {\n    if (this.closed) return\n    this.emit('error', err)\n  }\n\n  /** @internal — used by TvSymbol when the parent client shuts down. */\n  _closeFromSymbol(): void {\n    if (this.closed) return\n    this.closed = true\n    for (const event of Object.keys(this.listeners) as StreamEventName[]) {\n      this.listeners[event].clear()\n    }\n    this.flushIteratorOnClose()\n  }\n\n  // ─── private ────────────────────────────────────────────────\n\n  private emit<E extends StreamEventName>(event: E, data: StreamEventMap[E]): void {\n    for (const listener of this.listeners[event]) {\n      try {\n        listener(data)\n      } catch (err) {\n        log('listener for %s threw: %s', event, (err as Error).message)\n      }\n    }\n  }\n\n  private pushToIterator(event: StreamEventMap['update']): void {\n    if (this.iteratorResolve) {\n      const resolve = this.iteratorResolve\n      this.iteratorResolve = null\n      resolve({ value: event, done: false })\n    } else {\n      this.iteratorQueue.push(event)\n    }\n  }\n\n  private flushIteratorOnClose(): void {\n    if (this.iteratorResolve) {\n      const resolve = this.iteratorResolve\n      this.iteratorResolve = null\n      resolve({ value: undefined as never, done: true })\n    }\n  }\n}\n","/**\n * TvSymbol — the user-facing handle for a single market pair.\n *\n * Users never construct this directly. They call `client.symbol(pair)`\n * which lazily creates (or retrieves) a pooled instance.\n *\n * Responsibilities:\n *   - Aggregate every quote field any caller has asked about for this pair\n *   - Maintain a local accumulated snapshot of the latest values\n *   - Dispatch updates to all active Streams on the pair\n *   - Provide one-shot promise helpers: `price`, `snapshot`, `info`, `candles`\n *\n * `info()` and `candles()` use a fresh short-lived `ChartSession` per\n * call; `price()`, `snapshot()`, and `stream()` share the parent\n * Client's pooled quote session.\n */\n\nimport { TvError, TvSymbolError } from '../core/errors.js'\nimport { ChartSession } from '../sessions/chart-session.js'\nimport type { QuoteErrorInfo, QuoteUpdate } from '../sessions/session.types.js'\nimport type { Candle, Timeframe } from '../types/candle.js'\nimport type { FullQuoteSnapshot, QuoteField, QuoteSnapshot } from '../types/quote-fields.js'\nimport { symbolInfoFromRaw } from '../types/symbol-info.js'\nimport type { SymbolInfo } from '../types/symbol-info.js'\nimport { createLogger } from '../utils/logger.js'\nimport type { Client } from './client.js'\nimport { Stream } from './stream.js'\n\nconst log = createLogger('symbol')\n\n/** Default fields used for `price()`, `snapshot()` without args, and `stream()`. */\nexport const DEFAULT_STREAM_FIELDS: readonly QuoteField[] = [\n  'lp',\n  'bid',\n  'ask',\n  'ch',\n  'chp',\n  'volume',\n] as const\n\nexport interface CandlesOptions {\n  timeframe: Timeframe\n  /** Number of bars to fetch. */\n  count: number\n}\n\nconst LOAD_TIMEOUT_MS = 10_000\n\nexport class TvSymbol {\n  private readonly streams = new Set<Stream>()\n  private readonly snapshotState: Partial<Record<QuoteField, unknown>> = {}\n  private readonly fields = new Set<QuoteField>()\n  private loaded = false\n  private loadWaiters: Array<(err?: Error) => void> = []\n  private subscribed = false\n  private disposed = false\n\n  constructor(\n    readonly client: Client,\n    readonly pair: string,\n  ) {}\n\n  /** The last traded price, resolving as soon as it is available. */\n  async price(): Promise<number> {\n    this.assertAlive()\n    if (typeof this.snapshotState.lp === 'number') {\n      return this.snapshotState.lp\n    }\n    const snap = await this.snapshot(['lp'] as const)\n    if (snap.lp === undefined || snap.lp === null) {\n      throw new TvError(`No price available for ${this.pair}`)\n    }\n    return snap.lp\n  }\n\n  /**\n   * Resolve a typed snapshot for a specific subset of fields. Passing\n   * no argument returns every field currently accumulated for this\n   * symbol (type `FullQuoteSnapshot`).\n   */\n  snapshot<const F extends readonly QuoteField[]>(fields: F): Promise<QuoteSnapshot<F>>\n  snapshot(): Promise<FullQuoteSnapshot>\n  async snapshot(fields?: readonly QuoteField[]): Promise<FullQuoteSnapshot> {\n    this.assertAlive()\n    const targetFields = fields ?? DEFAULT_STREAM_FIELDS\n    await this.ensureSubscribed(targetFields)\n    await this.waitForLoad()\n\n    if (!fields) {\n      return { ...this.snapshotState } as FullQuoteSnapshot\n    }\n    const out: Record<string, unknown> = {}\n    for (const f of fields) {\n      if (this.snapshotState[f] !== undefined) {\n        out[f] = this.snapshotState[f]\n      }\n    }\n    return out as FullQuoteSnapshot\n  }\n\n  /** Fetch full symbol metadata via a one-shot chart session resolve. */\n  async info(): Promise<SymbolInfo> {\n    this.assertAlive()\n    await this.client.manager.connect()\n\n    const cs = new ChartSession({ manager: this.client.manager })\n    try {\n      const raw = await cs.resolvePair(this.pair)\n      return symbolInfoFromRaw(raw)\n    } finally {\n      try {\n        await cs.delete()\n      } catch (err) {\n        log('chart session delete failed: %s', (err as Error).message)\n      }\n    }\n  }\n\n  /** Fetch historical candles via a one-shot chart session. */\n  async candles(opts: CandlesOptions): Promise<Candle[]> {\n    this.assertAlive()\n    if (opts.count <= 0) {\n      throw new TvError('candles: count must be > 0')\n    }\n    await this.client.manager.connect()\n\n    const cs = new ChartSession({ manager: this.client.manager })\n    try {\n      return await cs.fetchCandlesOnce(this.pair, {\n        timeframe: opts.timeframe,\n        barCount: opts.count,\n      })\n    } finally {\n      try {\n        await cs.delete()\n      } catch (err) {\n        log('chart session delete failed: %s', (err as Error).message)\n      }\n    }\n  }\n\n  /** Open a live quote stream for this symbol. */\n  stream(fields: readonly QuoteField[] = DEFAULT_STREAM_FIELDS): Stream {\n    this.assertAlive()\n    const stream = new Stream(this, fields)\n    this.streams.add(stream)\n    void this.ensureSubscribed(fields).catch((err) => {\n      stream._dispatchError(err as Error)\n    })\n    return stream\n  }\n\n  /** Current list of fields this symbol is subscribed to. */\n  get subscribedFields(): readonly QuoteField[] {\n    return Array.from(this.fields)\n  }\n\n  // ─── Internal API used by Client and Stream ─────────────────\n\n  /** @internal */\n  _onUpdate(update: QuoteUpdate): void {\n    Object.assign(this.snapshotState, update.delta)\n    for (const stream of this.streams) {\n      stream._dispatch(update, this.snapshotState as FullQuoteSnapshot)\n    }\n  }\n\n  /** @internal */\n  _onComplete(): void {\n    this.loaded = true\n    const waiters = this.loadWaiters\n    this.loadWaiters = []\n    for (const w of waiters) w()\n  }\n\n  /** @internal */\n  _onError(info: QuoteErrorInfo): void {\n    const err = new TvSymbolError(info.symbol, info.message)\n    for (const stream of this.streams) {\n      stream._dispatchError(err)\n    }\n    const waiters = this.loadWaiters\n    this.loadWaiters = []\n    for (const w of waiters) w(err)\n  }\n\n  /** @internal */\n  _removeStream(stream: Stream): void {\n    this.streams.delete(stream)\n  }\n\n  /** @internal */\n  _dispose(): void {\n    if (this.disposed) return\n    this.disposed = true\n    for (const stream of this.streams) {\n      stream._closeFromSymbol()\n    }\n    this.streams.clear()\n    const waiters = this.loadWaiters\n    this.loadWaiters = []\n    const err = new TvError(`TvSymbol ${this.pair} disposed`)\n    for (const w of waiters) w(err)\n  }\n\n  // ─── private ────────────────────────────────────────────────\n\n  private assertAlive(): void {\n    if (this.disposed) {\n      throw new TvError(`TvSymbol ${this.pair} has been disposed`)\n    }\n  }\n\n  private async ensureSubscribed(fields: readonly QuoteField[]): Promise<void> {\n    await this.client.manager.connect()\n\n    const newFields: QuoteField[] = []\n    for (const f of fields) {\n      if (!this.fields.has(f)) {\n        this.fields.add(f)\n        newFields.push(f)\n      }\n    }\n\n    if (newFields.length > 0) {\n      this.client._requestFields(newFields)\n    }\n\n    if (!this.subscribed) {\n      const pool = this.client._getQuotePool()\n      pool.addSymbol(this.pair)\n      this.subscribed = true\n    }\n  }\n\n  private waitForLoad(): Promise<void> {\n    if (this.loaded) return Promise.resolve()\n    return new Promise((resolve, reject) => {\n      const timer = setTimeout(() => {\n        const idx = this.loadWaiters.indexOf(waiter)\n        if (idx >= 0) this.loadWaiters.splice(idx, 1)\n        reject(new TvError(`Timeout waiting for ${this.pair} to load`))\n      }, LOAD_TIMEOUT_MS)\n\n      const waiter = (err?: Error): void => {\n        clearTimeout(timer)\n        if (err) reject(err)\n        else resolve()\n      }\n      this.loadWaiters.push(waiter)\n    })\n  }\n}\n","/**\n * MultiStream — a multi-symbol stream used by `Portfolio`, `Group`,\n * and `Client.stream()`.\n *\n * Internally, a `MultiStream` composes one single-symbol `Stream` per\n * participating `TvSymbol`. Updates from each child stream are\n * forwarded to the multi-stream's listeners with the `symbol` field\n * included on every event, so consumers can distinguish which pair\n * ticked.\n *\n * Dedup: because `Client.symbol(pair)` returns a pooled instance, two\n * groups that share a pair share the same child `TvSymbol`. When the\n * client-level aggregate stream iterates `symbolCache.values()`, each\n * pair appears exactly once, so listeners receive one event per tick\n * regardless of how many groups reference the pair.\n */\n\nimport { createLogger } from '../utils/logger.js'\nimport type { BarTick, FullQuoteSnapshot, QuoteField, TradeTick } from '../types/quote-fields.js'\nimport type { Stream } from './stream.js'\nimport type { TvSymbol } from './symbol.js'\n\nconst log = createLogger('multi-stream')\n\nexport interface MultiStreamEventMap {\n  /** Fires on every quote delta, with the symbol and accumulated snapshot. */\n  update: { symbol: string; data: FullQuoteSnapshot }\n  /** Fires when `lp` changes, with the owning symbol. */\n  price: { symbol: string; price: number }\n  /** Fires when both `ch` and `chp` are present in the accumulated snapshot. */\n  change: { symbol: string; value: number; percent: number }\n  /** Fires when a new bar tick arrives. */\n  bar: { symbol: string; bar: TradeTick | BarTick }\n  /** Fires for per-symbol errors from any child stream. */\n  error: Error\n}\n\ntype MultiEventName = keyof MultiStreamEventMap\ntype Handler<E extends MultiEventName> = (data: MultiStreamEventMap[E]) => void\n\nexport interface MultiStreamOptions {\n  /** Called when this MultiStream is closed (used by parent Group to untrack). */\n  onClose?: () => void\n}\n\nexport class MultiStream {\n  private readonly children = new Map<string, Stream>()\n  private readonly listeners: { [K in MultiEventName]: Set<Handler<K>> } = {\n    update: new Set(),\n    price: new Set(),\n    change: new Set(),\n    bar: new Set(),\n    error: new Set(),\n  }\n\n  private closed = false\n  private iteratorQueue: MultiStreamEventMap['update'][] = []\n  private iteratorResolve: ((value: IteratorResult<MultiStreamEventMap['update']>) => void) | null =\n    null\n\n  constructor(\n    symbols: Iterable<TvSymbol>,\n    readonly fields: readonly QuoteField[],\n    private readonly opts: MultiStreamOptions = {},\n  ) {\n    for (const sym of symbols) {\n      this.attachSymbol(sym)\n    }\n  }\n\n  /** Register a listener for a specific stream event. */\n  on<E extends MultiEventName>(event: E, handler: Handler<E>): this {\n    this.listeners[event].add(handler)\n    return this\n  }\n\n  /** Remove a previously registered listener. */\n  off<E extends MultiEventName>(event: E, handler: Handler<E>): this {\n    this.listeners[event].delete(handler)\n    return this\n  }\n\n  /** Close the stream, all of its child streams, and release resources. */\n  close(): void {\n    if (this.closed) return\n    this.closed = true\n    for (const child of this.children.values()) {\n      child.close()\n    }\n    this.children.clear()\n    for (const event of Object.keys(this.listeners) as MultiEventName[]) {\n      this.listeners[event].clear()\n    }\n    this.flushIteratorOnClose()\n    this.opts.onClose?.()\n  }\n\n  [Symbol.dispose](): void {\n    this.close()\n  }\n\n  /**\n   * Async iterator interface — yields `update` events across all\n   * attached symbols. Breaking out of the `for await` loop closes the\n   * stream automatically.\n   */\n  [Symbol.asyncIterator](): AsyncIterator<MultiStreamEventMap['update']> {\n    return {\n      next: (): Promise<IteratorResult<MultiStreamEventMap['update']>> => {\n        if (this.closed && this.iteratorQueue.length === 0) {\n          return Promise.resolve({ value: undefined as never, done: true })\n        }\n        const queued = this.iteratorQueue.shift()\n        if (queued !== undefined) {\n          return Promise.resolve({ value: queued, done: false })\n        }\n        return new Promise((resolve) => {\n          this.iteratorResolve = resolve\n        })\n      },\n      return: (): Promise<IteratorResult<MultiStreamEventMap['update']>> => {\n        this.close()\n        return Promise.resolve({ value: undefined as never, done: true })\n      },\n    }\n  }\n\n  /** Currently attached pairs. */\n  get pairs(): readonly string[] {\n    return Array.from(this.children.keys())\n  }\n\n  /** Number of currently attached child streams. */\n  get size(): number {\n    return this.children.size\n  }\n\n  /** Whether this multi-stream has been closed. */\n  get isClosed(): boolean {\n    return this.closed\n  }\n\n  // ─── Internal API used by Group to keep the stream in sync ──\n\n  /** @internal */\n  _attachSymbol(sym: TvSymbol): void {\n    if (this.closed) return\n    this.attachSymbol(sym)\n  }\n\n  /** @internal */\n  _detachSymbol(pair: string): void {\n    if (this.closed) return\n    const child = this.children.get(pair)\n    if (!child) return\n    child.close()\n    this.children.delete(pair)\n  }\n\n  // ─── private ────────────────────────────────────────────────\n\n  private attachSymbol(sym: TvSymbol): void {\n    if (this.children.has(sym.pair)) return\n    const childStream = sym.stream(this.fields)\n    this.children.set(sym.pair, childStream)\n\n    childStream.on('update', (e) => {\n      this.emit('update', e)\n      this.pushToIterator(e)\n    })\n    childStream.on('price', (e) => {\n      this.emit('price', { symbol: sym.pair, price: e.price })\n    })\n    childStream.on('change', (e) => {\n      this.emit('change', { symbol: sym.pair, value: e.value, percent: e.percent })\n    })\n    childStream.on('bar', (e) => {\n      this.emit('bar', { symbol: sym.pair, bar: e.bar })\n    })\n    childStream.on('error', (err) => {\n      this.emit('error', err)\n    })\n  }\n\n  private emit<E extends MultiEventName>(event: E, data: MultiStreamEventMap[E]): void {\n    for (const listener of this.listeners[event]) {\n      try {\n        listener(data)\n      } catch (err) {\n        log('listener for %s threw: %s', event, (err as Error).message)\n      }\n    }\n  }\n\n  private pushToIterator(event: MultiStreamEventMap['update']): void {\n    if (this.iteratorResolve) {\n      const resolve = this.iteratorResolve\n      this.iteratorResolve = null\n      resolve({ value: event, done: false })\n    } else {\n      this.iteratorQueue.push(event)\n    }\n  }\n\n  private flushIteratorOnClose(): void {\n    if (this.iteratorResolve) {\n      const resolve = this.iteratorResolve\n      this.iteratorResolve = null\n      resolve({ value: undefined as never, done: true })\n    }\n  }\n}\n","/**\n * Portfolio — a lightweight, ad-hoc collection of symbols.\n *\n * Created via `client.symbols([...])`. Unlike `Group`, a portfolio is\n * immutable: the pairs you pass at construction are the only pairs it\n * tracks. Use it for quick, one-off queries (\"what are the prices of\n * these 5 tickers right now?\") or short-lived streaming sessions.\n *\n * For long-lived, mutable collections with a name, use `Group`.\n */\n\nimport { DEFAULT_STREAM_FIELDS } from './symbol.js'\nimport type { TvSymbol } from './symbol.js'\nimport type { Client } from './client.js'\nimport type { FullQuoteSnapshot, QuoteField, QuoteSnapshot } from '../types/quote-fields.js'\nimport { MultiStream } from './multi-stream.js'\n\nexport class Portfolio {\n  readonly tvSymbols: readonly TvSymbol[]\n\n  constructor(\n    readonly client: Client,\n    pairs: readonly string[],\n  ) {\n    this.tvSymbols = pairs.map((p) => client.symbol(p))\n  }\n\n  /** Pairs currently tracked (order preserved from construction). */\n  get pairs(): readonly string[] {\n    return this.tvSymbols.map((s) => s.pair)\n  }\n\n  /** Number of symbols in the portfolio. */\n  get size(): number {\n    return this.tvSymbols.length\n  }\n\n  /** Last prices keyed by pair. Missing prices are omitted. */\n  async prices(): Promise<Record<string, number>> {\n    const results = await Promise.all(\n      this.tvSymbols.map(async (s) => {\n        try {\n          return [s.pair, await s.price()] as const\n        } catch {\n          return [s.pair, undefined] as const\n        }\n      }),\n    )\n    const out: Record<string, number> = {}\n    for (const [pair, price] of results) {\n      if (typeof price === 'number') out[pair] = price\n    }\n    return out\n  }\n\n  /** Typed snapshots keyed by pair. */\n  snapshot<const F extends readonly QuoteField[]>(\n    fields: F,\n  ): Promise<Record<string, QuoteSnapshot<F>>>\n  snapshot(): Promise<Record<string, FullQuoteSnapshot>>\n  async snapshot(fields?: readonly QuoteField[]): Promise<Record<string, FullQuoteSnapshot>> {\n    const snaps = await Promise.all(\n      this.tvSymbols.map(async (s) => {\n        try {\n          const data = fields ? await s.snapshot(fields) : await s.snapshot()\n          return [s.pair, data] as const\n        } catch {\n          return [s.pair, null] as const\n        }\n      }),\n    )\n    const out: Record<string, FullQuoteSnapshot> = {}\n    for (const [pair, data] of snaps) {\n      if (data !== null) out[pair] = data as FullQuoteSnapshot\n    }\n    return out\n  }\n\n  /** Open a multi-symbol live stream over every pair in the portfolio. */\n  stream(fields: readonly QuoteField[] = DEFAULT_STREAM_FIELDS): MultiStream {\n    return new MultiStream(this.tvSymbols, fields)\n  }\n}\n","/**\n * Group — a named, mutable collection of symbols.\n *\n * Unlike `Portfolio`, a `Group` is long-lived: it has a name, is\n * tracked by the parent `Client` via `GroupRegistry`, and supports\n * mutation (`add`, `remove`, `clear`). Active streams stay in sync\n * with the group: adding a pair attaches a child stream, removing a\n * pair detaches it.\n *\n * Lifecycle:\n *   const crypto = client.createGroup('crypto', ['BINANCE:BTCUSDT'])\n *   crypto.add('BINANCE:ETHUSDT')\n *   const stream = crypto.stream()\n *   crypto.add('BINANCE:DOGEUSDT')     // ← joins the active stream\n *   crypto.remove('BINANCE:BTCUSDT')    // ← detaches from the active stream\n *   await crypto.delete()               // ← close all streams, remove from registry\n */\n\nimport { TvError } from '../core/errors.js'\nimport { DEFAULT_STREAM_FIELDS } from './symbol.js'\nimport type { TvSymbol } from './symbol.js'\nimport type { Client } from './client.js'\nimport type { FullQuoteSnapshot, QuoteField, QuoteSnapshot } from '../types/quote-fields.js'\nimport { MultiStream } from './multi-stream.js'\n\nexport class Group {\n  private readonly members = new Map<string, TvSymbol>()\n  private readonly activeStreams = new Set<MultiStream>()\n  private disposed = false\n\n  constructor(\n    readonly client: Client,\n    readonly name: string,\n    pairs: readonly string[],\n  ) {\n    for (const pair of pairs) {\n      this.members.set(pair, client.symbol(pair))\n    }\n  }\n\n  /** Symbols currently in the group. */\n  get pairs(): readonly string[] {\n    return Array.from(this.members.keys())\n  }\n\n  /** Live `TvSymbol` handles for every pair. */\n  get tvSymbols(): readonly TvSymbol[] {\n    return Array.from(this.members.values())\n  }\n\n  /** Number of pairs in the group. */\n  get size(): number {\n    return this.members.size\n  }\n\n  /** Whether a specific pair is in the group. */\n  has(pair: string): boolean {\n    return this.members.has(pair)\n  }\n\n  /** Add a pair. Active streams automatically pick it up. Returns `this` for chaining. */\n  add(pair: string): this {\n    this.assertAlive()\n    if (this.members.has(pair)) return this\n    const sym = this.client.symbol(pair)\n    this.members.set(pair, sym)\n    for (const stream of this.activeStreams) {\n      stream._attachSymbol(sym)\n    }\n    return this\n  }\n\n  /** Add many pairs at once. */\n  addAll(pairs: Iterable<string>): this {\n    for (const p of pairs) this.add(p)\n    return this\n  }\n\n  /** Remove a pair. Returns `true` if it was present. */\n  remove(pair: string): boolean {\n    this.assertAlive()\n    if (!this.members.delete(pair)) return false\n    for (const stream of this.activeStreams) {\n      stream._detachSymbol(pair)\n    }\n    return true\n  }\n\n  /** Remove many pairs at once. Returns the count of removed pairs. */\n  removeAll(pairs: Iterable<string>): number {\n    let n = 0\n    for (const p of pairs) {\n      if (this.remove(p)) n++\n    }\n    return n\n  }\n\n  /** Remove every pair. */\n  clear(): this {\n    this.assertAlive()\n    const all = Array.from(this.members.keys())\n    for (const p of all) this.remove(p)\n    return this\n  }\n\n  /** Last prices keyed by pair. Missing prices are omitted. */\n  async prices(): Promise<Record<string, number>> {\n    this.assertAlive()\n    const results = await Promise.all(\n      this.tvSymbols.map(async (s) => {\n        try {\n          return [s.pair, await s.price()] as const\n        } catch {\n          return [s.pair, undefined] as const\n        }\n      }),\n    )\n    const out: Record<string, number> = {}\n    for (const [pair, price] of results) {\n      if (typeof price === 'number') out[pair] = price\n    }\n    return out\n  }\n\n  /** Typed snapshots keyed by pair. */\n  snapshot<const F extends readonly QuoteField[]>(\n    fields: F,\n  ): Promise<Record<string, QuoteSnapshot<F>>>\n  snapshot(): Promise<Record<string, FullQuoteSnapshot>>\n  async snapshot(fields?: readonly QuoteField[]): Promise<Record<string, FullQuoteSnapshot>> {\n    this.assertAlive()\n    const snaps = await Promise.all(\n      this.tvSymbols.map(async (s) => {\n        try {\n          const data = fields ? await s.snapshot(fields) : await s.snapshot()\n          return [s.pair, data] as const\n        } catch {\n          return [s.pair, null] as const\n        }\n      }),\n    )\n    const out: Record<string, FullQuoteSnapshot> = {}\n    for (const [pair, data] of snaps) {\n      if (data !== null) out[pair] = data as FullQuoteSnapshot\n    }\n    return out\n  }\n\n  /** Open a multi-symbol live stream that stays in sync with the group. */\n  stream(fields: readonly QuoteField[] = DEFAULT_STREAM_FIELDS): MultiStream {\n    this.assertAlive()\n    const stream = new MultiStream(this.tvSymbols, fields, {\n      onClose: () => {\n        this.activeStreams.delete(stream)\n      },\n    })\n    this.activeStreams.add(stream)\n    return stream\n  }\n\n  /**\n   * Delete the group: close every active stream and remove it from the\n   * parent client's group registry.\n   */\n  async delete(): Promise<void> {\n    if (this.disposed) return\n    this.disposed = true\n    for (const stream of this.activeStreams) stream.close()\n    this.activeStreams.clear()\n    this.members.clear()\n    this.client.groups._unregister(this.name)\n  }\n\n  // ─── private ────────────────────────────────────────────────\n\n  private assertAlive(): void {\n    if (this.disposed) {\n      throw new TvError(`Group \"${this.name}\" has been deleted`)\n    }\n  }\n}\n","/**\n * GroupRegistry — the `Map`-like container for a `Client`'s groups.\n *\n * Accessible via `client.groups`. Supports lookup, iteration,\n * deletion, and presence checks. Creation goes through\n * `client.createGroup(name, pairs)` (delegated here) to ensure names\n * are unique per client.\n */\n\nimport { TvError } from '../core/errors.js'\nimport type { Client } from './client.js'\nimport { Group } from './group.js'\n\nexport class GroupRegistry {\n  private readonly groups = new Map<string, Group>()\n\n  constructor(private readonly client: Client) {}\n\n  /** Create a new group. Throws if a group with the same name already exists. */\n  create(name: string, pairs: readonly string[] = []): Group {\n    if (this.groups.has(name)) {\n      throw new TvError(`Group \"${name}\" already exists`)\n    }\n    const group = new Group(this.client, name, pairs)\n    this.groups.set(name, group)\n    return group\n  }\n\n  /** Retrieve a group by name. */\n  get(name: string): Group | undefined {\n    return this.groups.get(name)\n  }\n\n  /** Check whether a group exists. */\n  has(name: string): boolean {\n    return this.groups.has(name)\n  }\n\n  /** Delete a group by name. Returns `true` if it existed. */\n  async delete(name: string): Promise<boolean> {\n    const group = this.groups.get(name)\n    if (!group) return false\n    await group.delete()\n    // group.delete() already calls _unregister, so the map entry is\n    // gone — double-check for safety.\n    this.groups.delete(name)\n    return true\n  }\n\n  /** List of group names. */\n  get list(): readonly string[] {\n    return Array.from(this.groups.keys())\n  }\n\n  /** Number of groups. */\n  get size(): number {\n    return this.groups.size\n  }\n\n  /** Iterate over all groups. */\n  [Symbol.iterator](): IterableIterator<Group> {\n    return this.groups.values()\n  }\n\n  /** @internal — called from `Group.delete()` during self-unregistration. */\n  _unregister(name: string): void {\n    this.groups.delete(name)\n  }\n\n  /** @internal — called from `Client.disconnect()` to clean up all groups. */\n  async _disposeAll(): Promise<void> {\n    const all = Array.from(this.groups.values())\n    this.groups.clear()\n    for (const g of all) {\n      try {\n        await g.delete()\n      } catch {\n        /* ignore */\n      }\n    }\n  }\n}\n","/**\n * Client — the public entry point for the library.\n *\n * A `Client` owns a `SessionManager` (and therefore a `Transport`) and\n * acts as a registry/pool for `TvSymbol` instances. It also lazily\n * creates a single shared `QuoteSession` that carries every symbol's\n * live subscription, so one open TradingView session services an\n * entire portfolio.\n *\n * Create one via the `tv(options)` factory — a simple function call is\n * more idiomatic than `new Client()` and keeps the public surface tiny.\n */\n\nimport { createLogger } from '../utils/logger.js'\nimport { SessionManager } from '../core/session-manager.js'\nimport type { RateLimitOptions } from '../core/rate-limiter.types.js'\nimport type { ReconnectOptions } from '../core/transport.types.js'\nimport { QuoteSession } from '../sessions/quote-session.js'\nimport type { QuoteErrorInfo, QuoteUpdate } from '../sessions/session.types.js'\nimport type { QuoteField } from '../types/quote-fields.js'\nimport { TvError } from '../core/errors.js'\nimport { DEFAULT_STREAM_FIELDS, TvSymbol } from './symbol.js'\nimport { Portfolio } from './portfolio.js'\nimport type { Group } from './group.js'\nimport { GroupRegistry } from './group-registry.js'\nimport { MultiStream } from './multi-stream.js'\n\nconst log = createLogger('client')\n\n/**\n * Authentication options.\n *\n * TradingView recognises two cooperating pieces of auth state:\n *\n *   1. The `sessionid` + `sessionid_sign` cookies from an active\n *      tradingview.com login. These are passed as a `Cookie` header on\n *      the WebSocket handshake (Node only — browsers don't allow\n *      custom handshake headers).\n *   2. A per-session `authToken` sent via the `set_auth_token` message\n *      after the server hello. This is a JWT-like token you normally\n *      obtain by POSTing `sessionid` to `https://www.tradingview.com/…`\n *      ahead of time.\n *\n * This library does **not** fetch `authToken` for you — if you need\n * premium features, obtain the token through your own auth flow and\n * pass it here. Without an `authToken`, public quotes and candles\n * still work through the implicit `\"unauthorized_user_token\"` default.\n */\nexport interface AuthOptions {\n  /** TradingView auth token. Omit for public/anonymous access. */\n  authToken?: string\n  /** `sessionid` cookie from tradingview.com (Node only). */\n  sessionid?: string\n  /** `sessionid_sign` cookie from tradingview.com (Node only). */\n  sessionidSign?: string\n}\n\nexport interface ClientOptions {\n  /** WebSocket URL. Defaults to TradingView widget endpoint. */\n  url?: string\n  /** Origin header (Node only). Defaults to the TradingView origin. */\n  origin?: string\n  /** HTTP/SOCKS agent for proxy support (Node only). */\n  agent?: unknown\n  /** Authentication credentials (optional). */\n  auth?: AuthOptions\n  /** Locale to advertise to TradingView (`[language, country]`). Defaults to `['en', 'US']`. */\n  locale?: [language: string, country: string]\n  /** Reconnect behaviour for the underlying transport. */\n  reconnect?: ReconnectOptions\n  /** Symbol add/remove rate limiting. */\n  rateLimit?: RateLimitOptions\n  /** Abort signal — disconnects the client when fired. */\n  signal?: AbortSignal\n}\n\nexport interface ClientEventMap {\n  open: void\n  close: void\n  reconnect: { attempt: number; delayMs: number }\n  error: Error\n}\n\ntype ClientEventName = keyof ClientEventMap\ntype Handler<E extends ClientEventName> = (data: ClientEventMap[E]) => void\n\n/**\n * Factory: `tv(options)` → `Client`.\n *\n * Idiomatic entry point. Equivalent to `new Client(options)`.\n */\nexport function tv(options: ClientOptions = {}): Client {\n  return new Client(options)\n}\n\nexport class Client {\n  readonly manager: SessionManager\n  readonly groups: GroupRegistry\n\n  private quotePool: QuoteSession | null = null\n  private readonly symbolCache = new Map<string, TvSymbol>()\n  private readonly aggregatedFields = new Set<QuoteField>()\n  private readonly listeners: { [K in ClientEventName]: Set<Handler<K>> } = {\n    open: new Set(),\n    close: new Set(),\n    reconnect: new Set(),\n    error: new Set(),\n  }\n  private disposed = false\n\n  constructor(opts: ClientOptions = {}) {\n    this.manager = new SessionManager({\n      url: opts.url,\n      origin: opts.origin,\n      agent: opts.agent,\n      headers: buildAuthHeaders(opts.auth),\n      authToken: opts.auth?.authToken,\n      locale: opts.locale,\n      reconnect: opts.reconnect,\n      rateLimit: opts.rateLimit,\n      signal: opts.signal,\n    })\n    this.groups = new GroupRegistry(this)\n  }\n\n  /**\n   * Get the `TvSymbol` handle for a market pair. Repeated calls for\n   * the same pair return the same instance, so subscriptions pool\n   * naturally across callers.\n   */\n  symbol(pair: string): TvSymbol {\n    if (this.disposed) throw new TvError('Client has been disposed')\n    let s = this.symbolCache.get(pair)\n    if (!s) {\n      s = new TvSymbol(this, pair)\n      this.symbolCache.set(pair, s)\n    }\n    return s\n  }\n\n  /**\n   * Build an ad-hoc `Portfolio` over the given pairs. Unlike\n   * `createGroup`, a portfolio is not tracked by the client — it only\n   * lives as long as the caller holds the reference.\n   */\n  symbols(pairs: readonly string[]): Portfolio {\n    if (this.disposed) throw new TvError('Client has been disposed')\n    return new Portfolio(this, pairs)\n  }\n\n  /**\n   * Create a named `Group` and register it with `client.groups`. Use\n   * groups for long-lived, mutable collections — e.g. a watchlist the\n   * user can edit at runtime.\n   */\n  createGroup(name: string, pairs: readonly string[] = []): Group {\n    if (this.disposed) throw new TvError('Client has been disposed')\n    return this.groups.create(name, pairs)\n  }\n\n  /**\n   * Aggregate multi-symbol stream across every symbol currently\n   * registered on this client. De-duplicates naturally: a pair that\n   * belongs to multiple groups appears once in the client's symbol\n   * cache, so listeners receive one event per tick regardless of how\n   * many groups reference it.\n   */\n  stream(fields: readonly QuoteField[] = DEFAULT_STREAM_FIELDS): MultiStream {\n    if (this.disposed) throw new TvError('Client has been disposed')\n    return new MultiStream(this.symbolCache.values(), fields)\n  }\n\n  /** Open the underlying transport and wait until TradingView is ready. */\n  async connect(): Promise<void> {\n    if (this.disposed) throw new TvError('Client has been disposed')\n    await this.manager.connect()\n    this.emit('open', undefined)\n  }\n\n  /** Close everything: groups, pool session, all symbols, transport. */\n  async disconnect(): Promise<void> {\n    if (this.disposed) return\n    this.disposed = true\n    log('disconnect: %d cached symbols, %d groups', this.symbolCache.size, this.groups.size)\n\n    await this.groups._disposeAll()\n\n    for (const s of this.symbolCache.values()) {\n      s._dispose()\n    }\n    this.symbolCache.clear()\n\n    if (this.quotePool) {\n      try {\n        await this.quotePool.delete()\n      } catch (err) {\n        log('quote pool delete failed: %s', (err as Error).message)\n      }\n      this.quotePool = null\n    }\n\n    await this.manager.disconnect()\n    this.emit('close', undefined)\n  }\n\n  /** Register a client-level event listener. */\n  on<E extends ClientEventName>(event: E, handler: Handler<E>): this {\n    this.listeners[event].add(handler)\n    return this\n  }\n\n  /** Remove a previously registered event listener. */\n  off<E extends ClientEventName>(event: E, handler: Handler<E>): this {\n    this.listeners[event].delete(handler)\n    return this\n  }\n\n  /** Async disposer support (`using client = tv()`). */\n  async [Symbol.asyncDispose](): Promise<void> {\n    await this.disconnect()\n  }\n\n  // ─── Internal API used by TvSymbol / Stream ─────────────────\n\n  /** @internal */\n  _getQuotePool(): QuoteSession {\n    if (this.quotePool) return this.quotePool\n    this.quotePool = new QuoteSession({\n      manager: this.manager,\n      onUpdate: (u) => this.dispatchUpdate(u),\n      onError: (e) => this.dispatchError(e),\n      onComplete: (pair) => this.dispatchComplete(pair),\n    })\n    // Push any previously-aggregated fields into the pool so symbols\n    // that registered fields before the pool existed are covered.\n    if (this.aggregatedFields.size > 0) {\n      this.quotePool.setFields([...this.aggregatedFields])\n    }\n    return this.quotePool\n  }\n\n  /** @internal */\n  _requestFields(fields: readonly QuoteField[]): void {\n    if (fields.length === 0) return\n    let changed = false\n    for (const f of fields) {\n      if (!this.aggregatedFields.has(f)) {\n        this.aggregatedFields.add(f)\n        changed = true\n      }\n    }\n    if (changed && this.quotePool) {\n      this.quotePool.setFields([...this.aggregatedFields])\n    }\n  }\n\n  /** @internal — exposed primarily for tests and advanced users. */\n  _getSymbolCache(): ReadonlyMap<string, TvSymbol> {\n    return this.symbolCache\n  }\n\n  // ─── private ────────────────────────────────────────────────\n\n  private dispatchUpdate(u: QuoteUpdate): void {\n    const s = this.symbolCache.get(u.symbol)\n    if (s) s._onUpdate(u)\n  }\n\n  private dispatchError(e: QuoteErrorInfo): void {\n    const s = this.symbolCache.get(e.symbol)\n    if (s) s._onError(e)\n  }\n\n  private dispatchComplete(pair: string): void {\n    const s = this.symbolCache.get(pair)\n    if (s) s._onComplete()\n  }\n\n  private emit<E extends ClientEventName>(event: E, data: ClientEventMap[E]): void {\n    for (const listener of this.listeners[event]) {\n      try {\n        listener(data)\n      } catch (err) {\n        log('listener for %s threw: %s', event, (err as Error).message)\n      }\n    }\n  }\n}\n\n/**\n * Build the Cookie header from `sessionid` / `sessionidSign` auth\n * options. Returns `undefined` when no cookies are provided, so\n * callers can simply forward the result to the transport.\n */\nfunction buildAuthHeaders(auth: AuthOptions | undefined): Record<string, string> | undefined {\n  if (!auth?.sessionid) return undefined\n  const parts = [`sessionid=${auth.sessionid}`]\n  if (auth.sessionidSign) {\n    parts.push(`sessionid_sign=${auth.sessionidSign}`)\n  }\n  return { Cookie: parts.join('; ') }\n}\n","/**\n * tradingview-api-adapter\n *\n * Real-time market data from TradingView via WebSocket.\n *\n * Quick start:\n *\n *   import { tv } from 'tradingview-api-adapter'\n *\n *   const client = tv()\n *   const btc = client.symbol('BINANCE:BTCUSDT')\n *\n *   console.log(await btc.price())\n *\n *   const stream = btc.stream()\n *   stream.on('price', ({ price }) => console.log(price))\n *\n *   await client.disconnect()\n */\n\n// ─── Public API ──────────────────────────────────────────────\nexport { Client, tv } from './api/client.js'\nexport type { AuthOptions, ClientEventMap, ClientOptions } from './api/client.js'\n\nexport { TvSymbol, DEFAULT_STREAM_FIELDS } from './api/symbol.js'\nexport type { CandlesOptions } from './api/symbol.js'\n\nexport { Stream } from './api/stream.js'\nexport type { StreamEventMap } from './api/stream.js'\n\nexport { MultiStream } from './api/multi-stream.js'\nexport type { MultiStreamEventMap, MultiStreamOptions } from './api/multi-stream.js'\n\nexport { Portfolio } from './api/portfolio.js'\nexport { Group } from './api/group.js'\nexport { GroupRegistry } from './api/group-registry.js'\n\n// ─── Typed domain model ──────────────────────────────────────\nexport type {\n  BarTick,\n  Candle,\n  FullQuoteSnapshot,\n  QuoteField,\n  QuoteFieldTypeMap,\n  QuoteSnapshot,\n  RawTimeframe,\n  SymbolInfo,\n  Timeframe,\n  TimeframeAlias,\n  TradeTick,\n} from './types/index.js'\nexport { normalizeTimeframe, TIMEFRAME_ALIASES, symbolInfoFromRaw } from './types/index.js'\n\n// ─── Errors ──────────────────────────────────────────────────\nexport {\n  TvConnectionError,\n  TvError,\n  TvProtocolError,\n  TvSessionError,\n  TvSymbolError,\n  TvTimeoutError,\n} from './core/errors.js'\nexport type { TvErrorOptions } from './core/errors.js'\n\n// ─── Version ─────────────────────────────────────────────────\nexport const version = '2.0.0'\n"]}