{"version":3,"sources":["../src/utils/backoff.ts","../src/utils/logger.ts","../src/core/errors.ts","../src/core/transport.ts","../src/core/protocol.ts","../src/core/rate-limiter.types.ts","../src/core/rate-limiter.ts","../src/core/constants.ts","../src/core/session-manager.ts","../src/utils/random-id.ts","../src/types/candle.ts","../src/sessions/chart-session.ts","../src/sessions/quote-session.ts","../src/utils/kebab-to-camel.ts","../src/types/symbol-info.ts"],"names":["debug","log"],"mappings":"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","file":"internal.cjs","sourcesContent":["/**\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 * 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 * 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 * 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 * 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 * 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 * 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 * 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 * 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 * 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 * 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 * 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"]}