{"version":3,"sources":["../src/main.tsx","../src/charting_library/charting_library.esm.js","../src/helpers.ts","../src/exchangeAdapters.ts","../src/exchanges.ts","../src/streaming.ts","../src/datafeed.ts"],"sourcesContent":["import { FC, useEffect, useRef } from \"react\";\nimport { useImmer } from \"use-immer\";\nimport { type IOrderLine } from \"./charting-library-interfaces\";\nimport { ResolutionString, widget } from \"./charting_library/\";\nimport Datafeed from \"./datafeed\";\nimport { SUPPORTED_EXCHANGES } from \"./exchanges\";\n\nexport interface OrderLine extends IOrderLine {\n  id: string;\n  lineStyle?: number;\n}\n\ninterface TVChartContainerProps {\n  symbol?: string;\n  interval?: ResolutionString;\n  libraryPath?: string;\n  timescaleMarks?: any[];\n  orderLines?: OrderLine[];\n  onTick?: (event: any) => void;\n  getLatestBar?: (data: any) => void;\n  exchange?: string; // Exchange name: 'binance' or 'kucoin'\n  style?: React.CSSProperties;\n}\n\nconst supportedExchanges = [\"kucoin\", \"binance\"];\n\nconst TVChartContainer: FC<TVChartContainerProps> = ({\n  symbol = \"SUPER-USDT\",\n  interval = \"1h\" as ResolutionString,\n  libraryPath = \"/charting_library/\",\n  timescaleMarks = [],\n  orderLines = [],\n  onTick,\n  getLatestBar,\n  exchange = \"kucoin\",\n  style = { height: \"100%\" },\n}) => {\n  const containerRef = useRef<HTMLDivElement | null>(null);\n\n  const [chartOrderLines, setChartOrderLines] = useImmer<any[]>([]);\n  const [widgetState, setWidgetState] = useImmer<any>(null);\n  const prevTimescaleMarks = useRef<any[]>(timescaleMarks);\n  const prevExchange = useRef<string>(exchange);\n  const prevSymbol = useRef<string>(symbol);\n\n  useEffect(() => {\n    if (!symbol) return;\n\n    // If widget exists and symbol or exchange changed, tear down and reinitialize\n    if (\n      widgetState &&\n      (symbol !== prevSymbol.current || exchange !== prevExchange.current)\n    ) {\n      widgetState.remove();\n      setWidgetState(null);\n      prevSymbol.current = symbol;\n      prevExchange.current = exchange;\n      return; // Will reinitialize on next render with widgetState === null\n    }\n\n    if (!widgetState) {\n      initializeChart(interval);\n      prevSymbol.current = symbol;\n      prevExchange.current = exchange;\n      return;\n    }\n\n    if (orderLines && orderLines.length > 0) {\n      updateOrderLines(orderLines);\n    }\n\n    if (\n      widgetState &&\n      prevTimescaleMarks.current &&\n      timescaleMarks !== prevTimescaleMarks.current\n    ) {\n      widgetState._options.datafeed.timescaleMarks = timescaleMarks;\n      prevTimescaleMarks.current = timescaleMarks;\n    }\n  }, [symbol, orderLines, timescaleMarks, exchange, widgetState, interval]);\n\n  const initializeChart = (interval: ResolutionString) => {\n    // Get exchange configuration\n    const exchangeConfig = SUPPORTED_EXCHANGES[exchange.toLowerCase()];\n    if (!exchangeConfig) {\n      console.error(`Exchange ${exchange} not supported`);\n      return;\n    }\n\n    // Get list of supported exchange configs\n    const supportedExchangeConfigs = supportedExchanges\n      .map((ex) => SUPPORTED_EXCHANGES[ex.toLowerCase()])\n      .filter(Boolean);\n\n    const widgetOptions: any = {\n      symbol: symbol,\n      datafeed: new Datafeed(\n        timescaleMarks,\n        interval,\n        exchangeConfig,\n        supportedExchangeConfigs,\n      ),\n      interval: interval,\n      container: containerRef.current,\n      library_path: libraryPath,\n      locale: \"en\",\n      fullscreen: false,\n      autosize: true,\n      studies_overrides: {},\n      symbol_search_request_delay: 1000,\n      height: \"600px\",\n      overrides: {\n        volumePaneSize: \"small\",\n        \"mainSeriesProperties.barStyle.dontDrawOpen\": false,\n      },\n    };\n    const tvWidget = new widget(widgetOptions);\n\n    tvWidget.onChartReady(() => {\n      tvWidget.subscribe(\"onTick\", (event: any) => onTick && onTick(event));\n      setWidgetState(tvWidget);\n\n      // get latest bar for last price, guard against null/empty\n      const prices = async () => {\n        try {\n          const chart = tvWidget.activeChart?.();\n          if (!chart) return;\n          const data = await chart.exportData({\n            includeTime: false,\n            includeSeries: true,\n            includedStudies: [],\n          });\n          const last =\n            data?.data && data.data.length > 0\n              ? data.data[data.data.length - 1]\n              : null;\n          if (last && getLatestBar) {\n            getLatestBar(last);\n          }\n        } catch (e) {\n          // exportData may throw if series not ready yet; ignore\n        }\n      };\n      // slight defer to let series attach\n      setTimeout(prices, 300);\n    });\n  };\n\n  const updateOrderLines = (orderLines: OrderLine[]) => {\n    if (chartOrderLines && chartOrderLines.length > 0) {\n      chartOrderLines.forEach((item) => {\n        orderLines.forEach((order) => {\n          if (item.id == order.id) {\n            item\n              .setText(order.text)\n              .setTooltip(order.tooltip)\n              .setQuantity(order.quantity)\n              .setPrice(order.price);\n          }\n        });\n      });\n    } else {\n      if (widgetState && orderLines && orderLines.length > 0) {\n        orderLines.forEach((order) => {\n          const lineStyle = order.lineStyle || 0;\n          let chartOrderLine = widgetState\n            .chart()\n            .createOrderLine()\n            .setText(order.text)\n            .setTooltip(order.tooltip)\n            .setQuantity(order.quantity)\n            .setQuantityFont(\"inherit 14px Arial\")\n            .setQuantityBackgroundColor(order.color)\n            .setQuantityBorderColor(order.color)\n            .setLineStyle(lineStyle)\n            .setLineLength(25)\n            .setLineColor(order.color)\n            .setBodyFont(\"inherit 14px Arial\")\n            .setBodyBorderColor(order.color)\n            .setBodyTextColor(order.color)\n            .setPrice(order.price);\n\n          // set custom id easier search\n          chartOrderLine.id = order.id;\n\n          setChartOrderLines((draft) => {\n            draft.push(chartOrderLine);\n            return draft;\n          });\n        });\n      }\n    }\n  };\n\n  return <div ref={containerRef} style={style} />;\n};\n\nexport { SUPPORTED_EXCHANGES, Exchange } from \"./exchanges\";\nexport type { ExchangeConfig } from \"./exchanges\";\nexport default TVChartContainer;\n","function e(t,i){const n={...t};for(const o in i)\"object\"!=typeof t[o]||null===t[o]||Array.isArray(t[o])?void 0!==i[o]&&(n[o]=i[o]):n[o]=e(t[o],i[o]);return n}const t={mobile:{disabled_features:[\"left_toolbar\",\"header_widget\",\"timeframes_toolbar\",\"edit_buttons_in_legend\",\"context_menus\",\"control_bar\",\"border_around_the_chart\"],enabled_features:[]}},i={width:800,height:500,interval:\"1D\",timezone:\"Etc/UTC\",container:\"\",library_path:\"\",locale:\"en\",widgetbar:{details:!1,watchlist:!1,watchlist_settings:{default_symbols:[]}},overrides:{\"mainSeriesProperties.showCountdown\":!1},studies_overrides:{},trading_customization:{position:{},order:{}},brokerConfig:{configFlags:{}},fullscreen:!1,autosize:!1,disabled_features:[],enabled_features:[],debug:!1,logo:{},time_frames:[{text:\"5y\",resolution:\"1W\"},{text:\"1y\",resolution:\"1W\"},{text:\"6m\",resolution:\"120\"},{text:\"3m\",resolution:\"60\"},{text:\"1m\",resolution:\"30\"},{text:\"5d\",resolution:\"5\"},{text:\"1d\",resolution:\"1\"}],client_id:\"0\",user_id:\"0\",charts_storage_api_version:\"1.0\",favorites:{intervals:[],chartTypes:[]}};let n=!1;function o(){return\"CL v21.064 (internal id f0bc1e45 @ 2022-03-17T12:19:26.809Z)\"}const s=class{constructor(o){if(this._id=`tradingview_${(1048576*(1+Math.random())|0).toString(16).substring(1)}`,this._ready=!1,this._readyHandlers=[],this._onWindowResize=this._autoResizeChart.bind(this),!o.datafeed)throw new Error(\"Datafeed is not defined\");if(this._options=e(i,o),o.preset){const e=t[o.preset];e?(void 0!==this._options.disabled_features?this._options.disabled_features=this._options.disabled_features.concat(e.disabled_features):this._options.disabled_features=e.disabled_features,void 0!==this._options.enabled_features?this._options.enabled_features=this._options.enabled_features.concat(e.enabled_features):this._options.enabled_features=e.enabled_features):console.warn(\"Unknown preset: `\"+o.preset+\"`\")}\"Dark\"===this._options.theme&&void 0===this._options.loading_screen&&(this._options.loading_screen={backgroundColor:\"#131722\"}),this._options.debug&&(n||(n=!0,console.log(\"Using CL v21.064 (internal id f0bc1e45 @ 2022-03-17T12:19:26.809Z)\"))),this._create()}onChartReady(e){this._ready?e.call(this):this._readyHandlers.push(e)}headerReady(){return this._innerWindowLoaded.then((()=>this._innerWindow().headerReady()))}onGrayedObjectClicked(e){this._doWhenInnerApiLoaded((t=>{t.onGrayedObjectClicked(e)}))}onShortcut(e,t){this._doWhenInnerWindowLoaded((i=>{i.createShortcutAction(e,t)}))}subscribe(e,t){this._doWhenInnerApiLoaded((i=>{i.subscribe(e,t)}))}unsubscribe(e,t){this._doWhenInnerApiLoaded((i=>{i.unsubscribe(e,t)}))}chart(e){return this._innerAPI().chart(e)}getLanguage(){return this._options.locale}setSymbol(e,t,i){this._innerAPI().changeSymbol(e,t,i)}remove(){window.removeEventListener(\"resize\",this._onWindowResize),this._readyHandlers.splice(0,this._readyHandlers.length),delete window[this._id],this._iFrame.parentNode&&this._iFrame.parentNode.removeChild(this._iFrame)}closePopupsAndDialogs(){this._doWhenInnerApiLoaded((e=>{e.closePopupsAndDialogs()}))}selectLineTool(e){this._innerAPI().selectLineTool(e)}selectedLineTool(){return this._innerAPI().selectedLineTool()}save(e){this._innerAPI().saveChart(e)}load(e,t){this._innerAPI().loadChart({json:e,extendedData:t})}getSavedCharts(e){this._innerAPI().getSavedCharts(e)}loadChartFromServer(e){this._innerAPI().loadChartFromServer(e)}saveChartToServer(e,t,i){this._innerAPI().saveChartToServer(e,t,i)}removeChartFromServer(e,t){this._innerAPI().removeChartFromServer(e,t)}onContextMenu(e){this._doWhenInnerApiLoaded((t=>{t.onContextMenu(e)}))}createButton(e){return this._innerWindow().createButton(e)}createDropdown(e){return this._innerWindow().createDropdown(e)}showNoticeDialog(e){this._doWhenInnerApiLoaded((t=>{t.showNoticeDialog(e)}))}showConfirmDialog(e){this._doWhenInnerApiLoaded((t=>{t.showConfirmDialog(e)}))}showLoadChartDialog(){this._innerAPI().showLoadChartDialog()}showSaveAsChartDialog(){this._innerAPI().showSaveAsChartDialog()}symbolInterval(){return this._innerAPI().getSymbolInterval()}mainSeriesPriceFormatter(){return this._innerAPI().mainSeriesPriceFormatter()}getIntervals(){return this._innerAPI().getIntervals()}getStudiesList(){return this._innerAPI().getStudiesList()}getStudyInputs(e){return this._innerAPI().getStudyInputs(e)}addCustomCSSFile(e){this._innerWindow().addCustomCSSFile(e)}applyOverrides(t){this._options=e(this._options,{overrides:t}),this._doWhenInnerWindowLoaded((e=>{e.applyOverrides(t)}))}applyStudiesOverrides(e){this._doWhenInnerWindowLoaded((t=>{t.applyStudiesOverrides(e)}))}watchList(){return this._innerAPI().watchlist()}news(){return this._innerAPI().news()}activeChart(){return this._innerAPI().activeChart()}chartsCount(){return this._innerAPI().chartsCount()}layout(){return this._innerAPI().layout()}setLayout(e){this._innerAPI().setLayout(e)}layoutName(){return this._innerAPI().layoutName()}changeTheme(e,t){return this._innerWindow().changeTheme(e,t)}getTheme(){return this._innerWindow().getTheme()}takeScreenshot(){this._doWhenInnerApiLoaded((e=>{e.takeScreenshot()}))}lockAllDrawingTools(){return this._innerAPI().lockAllDrawingTools()}hideAllDrawingTools(){return this._innerAPI().hideAllDrawingTools()}drawOnAllCharts(e){this._innerAPI().drawOnAllCharts(e)}magnetEnabled(){return this._innerAPI().magnetEnabled()}magnetMode(){return this._innerAPI().magnetMode()}undoRedoState(){return this._innerAPI().undoRedoState()}setIntervalLinkingEnabled(e){this._innerAPI().setIntervalLinkingEnabled(e)}setTimeFrame(e){this._innerAPI().setTimeFrame(e)}symbolSync(){return this._innerAPI().symbolSync()}intervalSync(){return this._innerAPI().intervalSync()}crosshairSync(){return this._innerAPI().crosshairSync()}timeSync(){return this._innerAPI().timeSync()}getAllFeatures(){return this._innerWindow().getAllFeatures()}clearUndoHistory(){return this._innerAPI().clearUndoHistory()}undo(){return this._innerAPI().undo()}redo(){return this._innerAPI().redo()}startFullscreen(){this._innerAPI().startFullscreen()}exitFullscreen(){this._innerAPI().exitFullscreen()}takeClientScreenshot(e){return this._innerAPI().takeClientScreenshot(e)}navigationButtonsVisibility(){return this._innerWindow().getNavigationButtonsVisibility()}paneButtonsVisibility(){return this._innerWindow().getPaneButtonsVisibility()}dateFormat(){return this._innerWindow().getDateFormat()}_innerAPI(){return this._innerWindow().tradingViewApi}_innerWindow(){return this._iFrame.contentWindow}_doWhenInnerWindowLoaded(e){this._ready?e(this._innerWindow()):this._innerWindowLoaded.then((()=>{e(this._innerWindow())}))}_doWhenInnerApiLoaded(e){this._doWhenInnerWindowLoaded((t=>{t.doWhenApiIsReady((()=>e(this._innerAPI())))}))}_autoResizeChart(){this._options.fullscreen&&(this._iFrame.style.height=window.innerHeight+\"px\")}_create(){const e=this._render();this._options.container_id&&console.warn(\"`container_id` is now deprecated. Please use `container` instead to either still pass a string or an `HTMLElement`.\");const t=this._options.container_id||this._options.container,i=\"string\"==typeof t?document.getElementById(t):t;if(null===i)throw new Error(`There is no such element - #${this._options.container}`);i.innerHTML=e,this._iFrame=i.querySelector(`#${this._id}`);const n=this._iFrame;(this._options.autosize||this._options.fullscreen)&&(n.style.width=\"100%\",this._options.fullscreen||(n.style.height=\"100%\")),window.addEventListener(\"resize\",this._onWindowResize),this._onWindowResize(),this._innerWindowLoaded=new Promise((e=>{const t=()=>{n.removeEventListener(\"load\",t,!1),e()};n.addEventListener(\"load\",t,!1)})),this._innerWindowLoaded.then((()=>{this._innerWindow().widgetReady((()=>{this._ready=!0;for(const e of this._readyHandlers)try{e.call(this)}catch(e){console.error(e)}this._innerWindow().initializationFinished()}))}))}_render(){const e=window;if(e[this._id]={datafeed:this._options.datafeed,customFormatters:this._options.custom_formatters||this._options.customFormatters,brokerFactory:this._options.broker_factory||this._options.brokerFactory,overrides:this._options.overrides,studiesOverrides:this._options.studies_overrides,tradingCustomization:this._options.trading_customization,disabledFeatures:this._options.disabled_features,enabledFeatures:this._options.enabled_features,brokerConfig:this._options.broker_config||this._options.brokerConfig,restConfig:this._options.restConfig,favorites:this._options.favorites,logo:this._options.logo,numeric_formatting:this._options.numeric_formatting,rss_news_feed:this._options.rss_news_feed,newsProvider:this._options.news_provider,loadLastChart:this._options.load_last_chart,saveLoadAdapter:this._options.save_load_adapter,loading_screen:this._options.loading_screen,settingsAdapter:this._options.settings_adapter,getCustomIndicators:this._options.custom_indicators_getter,additionalSymbolInfoFields:this._options.additional_symbol_info_fields,headerWidgetButtonsMode:this._options.header_widget_buttons_mode,symbolSearchComplete:this._options.symbol_search_complete},this._options.saved_data)e[this._id].chartContent={json:this._options.saved_data},this._options.saved_data_meta_info&&(e[this._id].chartContentExtendedData=this._options.saved_data_meta_info);else if(!this._options.load_last_chart&&!this._options.symbol)throw new Error(\"Symbol is not defined: either 'symbol' or 'load_last_chart' option must be set\");const t=(this._options.library_path||\"\")+`${encodeURIComponent(this._options.locale)}-tv-chart.f0bc1e45.html#symbol=`+encodeURIComponent(this._options.symbol||\"\")+\"&interval=\"+encodeURIComponent(this._options.interval)+(this._options.timeframe?\"&timeframe=\"+encodeURIComponent(this._options.timeframe):\"\")+(this._options.toolbar_bg?\"&toolbarbg=\"+encodeURIComponent(this._options.toolbar_bg.replace(\"#\",\"\")):\"\")+(this._options.studies_access?\"&studiesAccess=\"+encodeURIComponent(JSON.stringify(this._options.studies_access)):\"\")+\"&widgetbar=\"+encodeURIComponent(JSON.stringify(this._options.widgetbar))+(this._options.drawings_access?\"&drawingsAccess=\"+encodeURIComponent(JSON.stringify(this._options.drawings_access)):\"\")+\"&timeFrames=\"+encodeURIComponent(JSON.stringify(this._options.time_frames))+\"&locale=\"+encodeURIComponent(this._options.locale)+\"&uid=\"+encodeURIComponent(this._id)+\"&clientId=\"+encodeURIComponent(String(this._options.client_id))+\"&userId=\"+encodeURIComponent(String(this._options.user_id))+(this._options.charts_storage_url?\"&chartsStorageUrl=\"+encodeURIComponent(this._options.charts_storage_url):\"\")+(this._options.charts_storage_api_version?\"&chartsStorageVer=\"+encodeURIComponent(this._options.charts_storage_api_version):\"\")+(this._options.custom_css_url?\"&customCSS=\"+encodeURIComponent(this._options.custom_css_url):\"\")+(this._options.auto_save_delay?\"&autoSaveDelay=\"+encodeURIComponent(String(this._options.auto_save_delay)):\"\")+\"&debug=\"+encodeURIComponent(String(this._options.debug))+(this._options.snapshot_url?\"&snapshotUrl=\"+encodeURIComponent(this._options.snapshot_url):\"\")+(this._options.timezone?\"&timezone=\"+encodeURIComponent(this._options.timezone):\"\")+(this._options.study_count_limit?\"&studyCountLimit=\"+encodeURIComponent(String(this._options.study_count_limit)):\"\")+(this._options.symbol_search_request_delay?\"&ssreqdelay=\"+encodeURIComponent(String(this._options.symbol_search_request_delay)):\"\")+(this._options.compare_symbols?\"&compareSymbols=\"+encodeURIComponent(JSON.stringify(this._options.compare_symbols)):\"\")+(this._options.theme?\"&theme=\"+encodeURIComponent(String(this._options.theme)):\"\")+(this._options.header_widget_buttons_mode?\"&header_widget_buttons_mode=\"+encodeURIComponent(String(this._options.header_widget_buttons_mode)):\"\")+(this._options.time_scale?\"&time_scale=\"+encodeURIComponent(JSON.stringify(this._options.time_scale)):\"\");return'<iframe id=\"'+this._id+'\" name=\"'+this._id+'\"  src=\"'+t+'\"'+(this._options.autosize||this._options.fullscreen?\"\":' width=\"'+this._options.width+'\" height=\"'+this._options.height+'\"')+' title=\"Financial Chart\" frameborder=\"0\" allowTransparency=\"true\" scrolling=\"no\" allowfullscreen style=\"display:block;\"></iframe>'}};window.TradingView=window.TradingView||{},window.TradingView.version=o;export{o as version,s as widget};\n","import { useEffect, useRef } from \"react\";\n\nfunction resolveApiBase(apiHost: string): string {\n  // Always route through reverse proxy to avoid CORS (Vite in dev, nginx in prod, localhost)\n  if (apiHost.includes(\"api.binance.com\")) return \"/binance\";\n  if (apiHost.includes(\"api-futures.kucoin.com\")) return \"/kucoin-futures\";\n  if (apiHost.includes(\"api.kucoin.com\")) return \"/kucoin\";\n  return apiHost.replace(/\\/$/, \"\");\n}\n\nexport async function makeApiRequest(\n  path: string,\n  apiHost: string = \"https://api.binance.com\",\n  init?: RequestInit,\n) {\n  try {\n    const base = resolveApiBase(apiHost);\n    const url = `${base}/${path.replace(/^\\//, \"\")}`;\n    const response = await fetch(url, init);\n    if (!response.ok) {\n      throw new Error(`${response.status} ${response.statusText}`);\n    }\n    return response.json();\n  } catch (error: any) {\n    throw new Error(`API request error: ${error?.message || String(error)}`);\n  }\n}\n\nexport async function getAllSymbols(\n  symbol: string,\n  apiHost: string = \"https://api.binance.com\",\n  exchange: string = \"Binance\",\n) {\n  let newSymbols = [];\n  try {\n    const data = await makeApiRequest(\n      `api/v3/exchangeInfo?symbol=${symbol.toUpperCase()}`,\n      apiHost,\n    );\n    data.symbols.forEach((item) => {\n      if (item.status === \"TRADING\") {\n        newSymbols.push({\n          symbol: item.symbol,\n          full_name: `${item.baseAsset}/${item.quoteAsset}`,\n          description: `Precision: ${item.quoteAssetPrecision}`,\n          exchange: exchange,\n          ticker: item.symbol,\n          type: \"crypto\",\n        });\n      }\n    });\n  } catch (e) {\n    return newSymbols;\n  }\n  return newSymbols;\n}\n\nexport function usePrevious(value) {\n  const ref = useRef();\n  useEffect(() => {\n    ref.current = value;\n  });\n  return ref.current;\n}\n\nexport function roundTime(ts: number): number {\n  /**\n   * @param ts a JavaScript new Date().getTime() timestamp\n   */\n  let time = new Date(ts);\n  time.setMinutes(0);\n  time.setSeconds(0);\n  time.setMilliseconds(0);\n  const roundFloor = time.getTime();\n  return roundFloor / 1000;\n}\n","import { makeApiRequest } from \"./helpers\";\n\nconst KUCOIN_FUTURES_API = \"https://api-futures.kucoin.com\";\n\nexport type NormalizedCandle = [\n  number, // time in ms\n  number, // open\n  number, // high\n  number, // low\n  number, // close\n  number, // volume\n];\n\nexport interface ExchangeAdapter {\n  fetchSymbolMeta(\n    symbol: string,\n    apiHost: string,\n  ): Promise<{ priceScale: number }>;\n  fetchBars(\n    params: {\n      symbol: string;\n      interval: string; // e.g., 1m,5m,1h,1d\n      from: number; // seconds\n      to: number; // seconds\n    },\n    apiHost: string,\n  ): Promise<NormalizedCandle[]>;\n  fetchServerTime(apiHost: string): Promise<number>; // seconds\n}\n\n/**\n * Check if a KuCoin symbol is a futures contract (ends with \"M\", e.g. XBTUSDTM)\n */\nexport function isKucoinFutures(symbol: string): boolean {\n  return symbol.endsWith(\"M\");\n}\n\nfunction mapKuCoinInterval(interval: string): string {\n  if (interval.endsWith(\"m\")) return interval.replace(\"m\", \"min\");\n  if (interval.endsWith(\"h\")) return interval.replace(\"h\", \"hour\");\n  if (interval.endsWith(\"d\")) return interval.replace(\"d\", \"day\");\n  return interval;\n}\n\n/**\n * Map interval string to KuCoin Futures granularity (in minutes).\n * Supported: 1, 5, 15, 30, 60, 120, 240, 480, 720, 1440, 10080\n */\nexport function mapKuCoinFuturesGranularity(interval: string): number {\n  const match = interval.match(/^(\\d+)([mhdw])$/);\n  if (!match) return 60;\n  const value = parseInt(match[1]);\n  const unit = match[2];\n  switch (unit) {\n    case \"m\":\n      return value;\n    case \"h\":\n      return value * 60;\n    case \"d\":\n      return value * 1440;\n    case \"w\":\n      return value * 10080;\n    default:\n      return 60;\n  }\n}\n\nconst binanceAdapter: ExchangeAdapter = {\n  async fetchSymbolMeta(symbol, apiHost) {\n    const info = await makeApiRequest(\n      `api/v3/exchangeInfo?symbol=${symbol}`,\n      apiHost,\n    );\n    // Use quotePrecision (price precision) instead of baseAssetPrecision\n    const priceScale = Number(info.symbols?.[0]?.quotePrecision) || 8;\n    return { priceScale };\n  },\n  async fetchBars({ symbol, interval, from, to }, apiHost) {\n    const params = new URLSearchParams({\n      symbol,\n      interval,\n      startTime: String(Math.abs(from * 1000)),\n      endTime: String(Math.abs(to * 1000)),\n      limit: String(600),\n    });\n    const data = await makeApiRequest(\n      `api/v3/uiKlines?${params.toString()}`,\n      apiHost,\n    );\n    const candles: NormalizedCandle[] = Array.isArray(data)\n      ? data.map((bar: any) => [\n          Number(bar[0]),\n          Number(bar[1]),\n          Number(bar[2]),\n          Number(bar[3]),\n          Number(bar[4]),\n          Number(bar[5]),\n        ])\n      : [];\n    candles.sort((a, b) => a[0] - b[0]);\n    return candles;\n  },\n  async fetchServerTime(apiHost) {\n    const data = await makeApiRequest(`api/v3/time`, apiHost);\n    return Number(data.serverTime) / 1000;\n  },\n};\n\nlet kucoinFuturesBarsAbort: AbortController | null = null;\n\nconst kucoinAdapter: ExchangeAdapter = {\n  async fetchSymbolMeta(symbol, apiHost) {\n    if (isKucoinFutures(symbol)) {\n      // KuCoin Futures: GET /api/v1/contracts/{symbol}\n      const info = await makeApiRequest(\n        `api/v1/contracts/${symbol}`,\n        KUCOIN_FUTURES_API,\n      );\n      let priceScale = 8;\n      if (info?.data?.tickSize) {\n        const tickNum = Number(info.data.tickSize);\n        if (tickNum < 1 && tickNum > 0) {\n          // Convert to string with up to 16 decimals, trim trailing zeros\n          const fixed = tickNum.toFixed(16).replace(/0+$/, \"\");\n          const dot = fixed.indexOf(\".\");\n          priceScale = dot >= 0 ? fixed.length - dot - 1 : 0;\n        } else {\n          priceScale = 0;\n        }\n      }\n      return { priceScale };\n    }\n\n    // KuCoin Spot\n    const info = await makeApiRequest(\n      `api/v1/symbols?symbol=${symbol}`,\n      apiHost,\n    );\n    let priceScale = 8;\n    if (info?.data && info.data.length > 0) {\n      // Use priceIncrement (price precision) instead of baseIncrement\n      const incRaw = info.data[0].priceIncrement;\n      const incStr =\n        typeof incRaw === \"number\" ? incRaw.toString() : String(incRaw || \"\");\n      const dot = incStr.indexOf(\".\");\n      priceScale = dot >= 0 ? Math.max(0, incStr.length - dot - 1) : 0;\n    }\n    return { priceScale };\n  },\n  async fetchBars({ symbol, interval, from, to }, apiHost) {\n    if (isKucoinFutures(symbol)) {\n      // Abort any in-flight KuCoin Futures bars request\n      if (kucoinFuturesBarsAbort) {\n        kucoinFuturesBarsAbort.abort();\n      }\n      kucoinFuturesBarsAbort = new AbortController();\n      const { signal } = kucoinFuturesBarsAbort;\n\n      // granularity is in minutes: 1,5,15,30,60,120,240,480,720,1440,10080\n      const granularity = mapKuCoinFuturesGranularity(interval);\n      const fromMs = from * 1000;\n      let currentTo = to * 1000;\n      let allCandles: NormalizedCandle[] = [];\n\n      // KuCoin Futures API returns ~200 candles per request and has no limit param.\n      // Paginate backwards: fetch ending at `to`, then use the earliest candle as\n      // the next `to`, until we reach `from` or get no more data.\n      const MAX_PAGES = 10; // safety cap to avoid runaway requests\n      for (let page = 0; page < MAX_PAGES; page++) {\n        const params = new URLSearchParams({\n          symbol,\n          granularity: String(granularity),\n          to: String(currentTo),\n        });\n\n        const resp = await makeApiRequest(\n          `api/v1/kline/query?${params.toString()}`,\n          KUCOIN_FUTURES_API,\n          { signal },\n        );\n        const raw = Array.isArray(resp?.data) ? resp.data : [];\n        if (raw.length === 0) break;\n\n        const candles: NormalizedCandle[] = raw.map((bar: any) => [\n          Number(bar[0]),\n          Number(bar[1]),\n          Number(bar[2]),\n          Number(bar[3]),\n          Number(bar[4]),\n          Number(bar[5]),\n        ]);\n\n        allCandles = allCandles.concat(candles);\n\n        // Find the earliest candle timestamp in this batch\n        const earliest = Math.min(...candles.map((c) => c[0]));\n\n        // Stop if we've reached or passed the requested `from` time\n        if (earliest <= fromMs) break;\n\n        // Use earliest as the next `to` to fetch older data\n        currentTo = earliest;\n      }\n\n      // Deduplicate by timestamp and sort\n      const seen = new Set<number>();\n      const unique = allCandles.filter((c) => {\n        if (seen.has(c[0])) return false;\n        seen.add(c[0]);\n        return true;\n      });\n      unique.sort((a, b) => a[0] - b[0]);\n      return unique;\n    }\n\n    // KuCoin Spot\n    const type = mapKuCoinInterval(interval);\n    const params = new URLSearchParams({\n      symbol,\n      type,\n      startAt: String(from),\n      endAt: String(to),\n    });\n    const resp = await makeApiRequest(\n      `api/v1/market/candles?${params.toString()}`,\n      apiHost,\n    );\n    const raw = Array.isArray(resp?.data) ? resp.data : [];\n    // Spot candle format: [time(s), open, close, high, low, volume, turnover]\n    const candles: NormalizedCandle[] = raw.map((bar: any) => [\n      Number(bar[0]) * 1000,\n      Number(bar[1]),\n      Number(bar[3]), // high\n      Number(bar[4]), // low\n      Number(bar[2]), // close\n      Number(bar[5]), // volume\n    ]);\n    candles.sort((a, b) => a[0] - b[0]);\n    return candles;\n  },\n  async fetchServerTime(apiHost) {\n    const data = await makeApiRequest(`api/v1/timestamp`, apiHost);\n    return Number(data.data) / 1000;\n  },\n};\n\nexport function getExchangeAdapter(exchangeName: string): ExchangeAdapter {\n  const name = exchangeName?.toLowerCase();\n  if (name === \"kucoin\") return kucoinAdapter;\n  return binanceAdapter;\n}\n","// Exchange enum for type-safe exchange selection\nexport enum Exchange {\n  BINANCE = \"binance\",\n  KUCOIN = \"kucoin\",\n}\n\n// Exchange name constants for consistency\nconst EXCHANGE_BINANCE = \"Binance\";\nconst EXCHANGE_KUCOIN = \"KuCoin\";\n\nexport interface ExchangeConfig {\n  name: string;\n  value: string;\n  restApiUrl: string;\n  wsUrl: string;\n  // KuCoin requires dynamic WebSocket URL, so this can be a function\n  getWsUrl?: (symbol?: string) => Promise<string>;\n}\n\nimport { makeApiRequest } from \"./helpers\";\n\nexport const SUPPORTED_EXCHANGES: Record<string, ExchangeConfig> = {\n  binance: {\n    name: EXCHANGE_BINANCE,\n    value: EXCHANGE_BINANCE,\n    restApiUrl: \"https://api.binance.com\",\n    wsUrl: \"wss://stream.binance.com:9443/ws\",\n  },\n  kucoin: {\n    name: EXCHANGE_KUCOIN,\n    value: EXCHANGE_KUCOIN,\n    restApiUrl: \"https://api.kucoin.com\",\n    wsUrl: \"\", // Will be fetched dynamically\n    getWsUrl: async (symbol?: string) => {\n      // Determine whether to use spot or futures bullet endpoint\n      const isFutures = symbol?.endsWith(\"M\");\n      const apiBase = isFutures\n        ? \"https://api-futures.kucoin.com\"\n        : \"https://api.kucoin.com\";\n      try {\n        const data = await makeApiRequest(\"api/v1/bullet-public\", apiBase, {\n          method: \"POST\",\n        });\n        if (data.code === \"200000\" && data.data?.instanceServers?.length > 0) {\n          const server = data.data.instanceServers[0];\n          return `${server.endpoint}?token=${data.data.token}`;\n        }\n        throw new Error(\"Failed to get KuCoin WebSocket URL: Invalid response\");\n      } catch (error: any) {\n        throw new Error(\n          `Failed to get KuCoin WebSocket URL: ${error?.message || String(error)}`,\n        );\n      }\n    },\n  },\n};\n\nexport type ExchangeName = keyof typeof SUPPORTED_EXCHANGES;\n\n// Export exchange name constants for use in other modules\nexport { EXCHANGE_BINANCE, EXCHANGE_KUCOIN };\n","import { EXCHANGE_BINANCE, EXCHANGE_KUCOIN } from \"./exchanges\";\nimport {\n  isKucoinFutures,\n  mapKuCoinFuturesGranularity,\n} from \"./exchangeAdapters\";\n\nconst channelToSubscription = new Map();\nlet pingInterval: number | null = null;\nlet reconnectTimeout: number | null = null;\n\ndeclare global {\n  interface Window {\n    socket: WebSocket;\n  }\n}\n\ninterface StreamingConfig {\n  wsUrl: string;\n  exchange: string;\n}\n\ninterface SubscriptionRequest {\n  method?: string;\n  params?: string[];\n  id?: number;\n  type?: string;\n  topic?: string;\n  privateChannel?: boolean;\n  response?: boolean;\n}\n\nfunction setupSockets(\n  subRequest: SubscriptionRequest,\n  config: StreamingConfig,\n) {\n  const socket: WebSocket = new WebSocket(config.wsUrl);\n  window.socket = socket;\n\n  socket.onopen = (event) => {\n    console.log(\"[socket] Connected\");\n    socket.send(JSON.stringify(subRequest));\n\n    // Setup ping interval for KuCoin (every 20 seconds)\n    if (config.exchange === EXCHANGE_KUCOIN) {\n      if (pingInterval) {\n        clearInterval(pingInterval);\n      }\n      pingInterval = window.setInterval(() => {\n        if (socket.readyState === WebSocket.OPEN) {\n          socket.send(JSON.stringify({ id: Date.now(), type: \"ping\" }));\n        }\n      }, 20000);\n    }\n  };\n\n  socket.onclose = (reason) => {\n    console.log(\"[socket] Disconnected:\", reason);\n\n    // Clear ping interval\n    if (pingInterval) {\n      clearInterval(pingInterval);\n      pingInterval = null;\n    }\n\n    // Reconnect after 3 seconds if there are active subscriptions\n    if (channelToSubscription.size > 0) {\n      console.log(\"[socket] Reconnecting in 3 seconds...\");\n      if (reconnectTimeout) {\n        clearTimeout(reconnectTimeout);\n      }\n      reconnectTimeout = window.setTimeout(() => {\n        setupSockets(subRequest, config);\n      }, 3000);\n    }\n  };\n\n  socket.onerror = (error) => {\n    console.log(\"[socket] Error:\", error);\n  };\n\n  socket.onmessage = (e) => {\n    const data = JSON.parse(e.data);\n\n    // Handle KuCoin pong response\n    if (data.type === \"pong\") {\n      return;\n    }\n\n    // Parse based on exchange\n    if (config.exchange === EXCHANGE_BINANCE) {\n      parseBinanceMessage(data);\n    } else if (config.exchange === EXCHANGE_KUCOIN) {\n      parseKuCoinMessage(data);\n    }\n  };\n}\n\nfunction parseBinanceMessage(data: any) {\n  if (data.e == undefined) {\n    // skip all non-TRADE events\n    return;\n  }\n  const {\n    s: symbol,\n    t: startTime,\n    T: closeTime,\n    i: interval,\n    o: open,\n    c: close,\n    h: high,\n    l: low,\n    v: volume,\n    n: trades,\n    q: quoteVolume,\n  } = data.k;\n\n  const channelString = `${symbol.toLowerCase()}@kline_${interval}`;\n  const subscriptionItem = channelToSubscription.get(channelString);\n  if (subscriptionItem === undefined) {\n    return;\n  }\n  const bar = {\n    time: startTime,\n    open: open,\n    high: high,\n    low: low,\n    close: close,\n    volume: volume,\n  };\n  // send data to every subscriber of that symbol\n  subscriptionItem.handlers.forEach((handler) => handler.callback(bar));\n}\n\nfunction parseKuCoinMessage(data: any) {\n  // KuCoin WebSocket message structure\n  if (data.type !== \"message\" || !data.data) {\n    return;\n  }\n\n  const candlesData = data.data.candles;\n  if (!candlesData) {\n    return;\n  }\n\n  // KuCoin candle format: single string \"time,open,close,high,low,volume,turnover\"\n  // or array format depending on the endpoint\n  let candleArray: string[];\n  if (typeof candlesData === \"string\") {\n    candleArray = candlesData.split(\",\");\n  } else if (Array.isArray(candlesData)) {\n    // If it's already an array, use it directly\n    candleArray = candlesData;\n  } else {\n    return;\n  }\n\n  // KuCoin candle format: [time, open, close, high, low, volume, turnover]\n  const [timestamp, open, close, high, low, volume] = candleArray;\n\n  const channelString = data.topic; // KuCoin uses topic for channel identification\n  const subscriptionItem = channelToSubscription.get(channelString);\n  if (subscriptionItem === undefined) {\n    return;\n  }\n\n  const bar = {\n    time: parseInt(timestamp) * 1000, // KuCoin uses seconds, convert to milliseconds\n    open: parseFloat(open),\n    high: parseFloat(high),\n    low: parseFloat(low),\n    close: parseFloat(close),\n    volume: parseFloat(volume),\n  };\n\n  // send data to every subscriber of that symbol\n  subscriptionItem.handlers.forEach((handler) => handler.callback(bar));\n}\n\nexport function subscribeOnStream(\n  symbolInfo,\n  resolution,\n  onRealtimeCallback,\n  subscribeUID,\n  onResetCacheNeededCallback,\n  interval,\n  wsUrl: string,\n  exchange: string = EXCHANGE_BINANCE,\n) {\n  let channelString: string;\n  if (exchange === EXCHANGE_BINANCE) {\n    channelString = `${symbolInfo.name.toLowerCase()}@kline_${interval}`;\n  } else if (isKucoinFutures(symbolInfo.name)) {\n    // KuCoin Futures: /contractMarket/candle:{symbol}_{granularity_in_minutes}\n    const granularity = mapKuCoinFuturesGranularity(interval);\n    channelString = `/contractMarket/candle:${symbolInfo.name}_${granularity}`;\n  } else {\n    // KuCoin Spot\n    channelString = `/market/candles:${symbolInfo.name}_${interval}`;\n  }\n\n  const handler = {\n    id: subscribeUID,\n    callback: onRealtimeCallback,\n  };\n  let subscriptionItem = channelToSubscription.get(channelString);\n  if (subscriptionItem) {\n    // already subscribed to the channel, use the existing subscription\n    subscriptionItem.handlers.push(handler);\n    return;\n  }\n  subscriptionItem = {\n    subscribeUID,\n    resolution,\n    handlers: [handler],\n    exchange, // Store exchange for unsubscribe\n  };\n\n  const subRequest =\n    exchange === EXCHANGE_BINANCE\n      ? {\n          method: \"SUBSCRIBE\",\n          params: [channelString],\n          id: 1,\n        }\n      : {\n          id: Date.now(),\n          type: \"subscribe\",\n          topic: channelString,\n          privateChannel: false,\n          response: true,\n        };\n\n  channelToSubscription.set(channelString, subscriptionItem);\n  setupSockets(subRequest, { wsUrl, exchange });\n}\n\nexport function unsubscribeFromStream(subscriberUID) {\n  // find a subscription with id === subscriberUID\n  for (const channelString of channelToSubscription.keys()) {\n    const subscriptionItem = channelToSubscription.get(channelString);\n    const handlerIndex = subscriptionItem.handlers.findIndex(\n      (handler) => handler.id === subscriberUID,\n    );\n\n    if (handlerIndex !== -1) {\n      // remove from handlers\n      subscriptionItem.handlers.splice(handlerIndex, 1);\n\n      if (subscriptionItem.handlers.length === 0) {\n        // unsubscribe from the channel, if it was the last handler\n        console.log(\n          \"[unsubscribeBars]: Unsubscribe from streaming. Channel:\",\n          channelString,\n        );\n\n        // Use exchange-specific unsubscribe format\n        const subRequest =\n          subscriptionItem.exchange === EXCHANGE_BINANCE\n            ? {\n                method: \"UNSUBSCRIBE\",\n                params: [channelString],\n                id: 1,\n              }\n            : {\n                id: Date.now(),\n                type: \"unsubscribe\",\n                topic: channelString,\n                privateChannel: false,\n                response: true,\n              };\n\n        if (window.socket && window.socket.readyState === WebSocket.OPEN) {\n          window.socket.send(JSON.stringify(subRequest));\n        }\n        channelToSubscription.delete(channelString);\n\n        // Clear intervals and close socket if no more subscriptions\n        if (channelToSubscription.size === 0) {\n          if (pingInterval) {\n            clearInterval(pingInterval);\n            pingInterval = null;\n          }\n          if (reconnectTimeout) {\n            clearTimeout(reconnectTimeout);\n            reconnectTimeout = null;\n          }\n          if (window.socket) {\n            window.socket.close();\n            window.socket = undefined;\n          }\n        }\n        break;\n      }\n    }\n  }\n}\n","import { getAllSymbols, makeApiRequest } from \"./helpers\";\nimport {\n  getExchangeAdapter,\n  type ExchangeAdapter,\n  type NormalizedCandle,\n} from \"./exchangeAdapters\";\nimport { subscribeOnStream, unsubscribeFromStream } from \"./streaming\";\nimport { ExchangeConfig } from \"./exchanges\";\n\nenum BinanceResolutions {\n  one_second = \"1s\",\n  one_minute = \"1m\",\n  three_minute = \"3m\",\n  five_minute = \"5m\",\n  fifteen_minute = \"15m\",\n  thirty_minute = \"30m\",\n  one_hour = \"1h\",\n  two_hour = \"2h\",\n  four_hour = \"4h\",\n  six_hour = \"6h\",\n  eight_hour = \"8h\",\n  twelve_hour = \"12h\",\n  one_day = \"1d\",\n  three_day = \"3d\",\n  one_week = \"1w\",\n  one_month = \"1M\",\n}\n\ninterface ConfigurationData {\n  supports_marks: boolean;\n  supports_timescale_marks: boolean;\n  supports_time: boolean;\n  supported_resolutions: string[];\n  exchanges: { value: string; name: string; desc: string }[];\n  symbols_types: { name: string; value: string }[];\n}\n\nconst getConfigurationData = async (\n  supportedExchanges: ExchangeConfig[],\n): Promise<ConfigurationData> => {\n  return {\n    supports_marks: true,\n    supports_timescale_marks: true,\n    supports_time: true,\n    supported_resolutions: [\n      \"1S\",\n      \"1\",\n      \"3\",\n      \"5\",\n      \"15\",\n      \"30\",\n      \"60\",\n      \"120\",\n      \"240\",\n      \"360\",\n      \"480\",\n      \"720\",\n      \"1D\",\n      \"3D\",\n      \"1W\",\n      \"12M\",\n    ],\n    exchanges: supportedExchanges.map((exchange) => ({\n      value: exchange.value,\n      name: exchange.name,\n      desc: exchange.name,\n    })),\n    symbols_types: [\n      {\n        name: \"crypto\",\n        value: \"crypto\",\n      },\n    ],\n  };\n};\n\ninterface TimescaleMark {\n  id: string;\n  time: number;\n  color: string;\n  label: string;\n  tooltip: string;\n}\n\ninterface SymbolInfo {\n  name: string;\n  ticker: string;\n  description: string;\n  type: string;\n  session: string;\n  timezone: string;\n  exchange: string;\n  minmov: number;\n  pricescale: number;\n  has_daily: boolean;\n  has_intraday: boolean;\n  has_no_volume: boolean;\n  has_seconds: boolean;\n  seconds_multipliers: number[];\n  volume: string;\n  volume_precision: number;\n  data_status: string;\n  resolution: string;\n}\n\ninterface PeriodParams {\n  from: number;\n  to: number;\n  firstDataRequest: boolean;\n}\n\ninterface Bar {\n  time: number;\n  low: number;\n  high: number;\n  open: number;\n  close: number;\n  volume: number;\n}\n\nexport default class Datafeed {\n  private streaming: any;\n  private timescaleMarks: TimescaleMark[];\n  private interval: string;\n  private configurationData: ConfigurationData | null = null;\n  private exchangeConfig: ExchangeConfig;\n  private supportedExchanges: ExchangeConfig[];\n  private adapter: ExchangeAdapter;\n\n  constructor(\n    timescaleMarks: TimescaleMark[] = [],\n    interval: string = \"1h\",\n    exchangeConfig: ExchangeConfig,\n    supportedExchanges: ExchangeConfig[] = [],\n  ) {\n    this.streaming = null;\n    this.timescaleMarks = timescaleMarks;\n    this.interval = interval;\n    this.exchangeConfig = exchangeConfig;\n    this.supportedExchanges = supportedExchanges;\n    this.adapter = getExchangeAdapter(this.exchangeConfig.name);\n  }\n\n  onReady = async (\n    callback: (data: ConfigurationData) => void,\n  ): Promise<void> => {\n    this.configurationData = await getConfigurationData(\n      this.supportedExchanges,\n    );\n    callback(this.configurationData);\n  };\n\n  searchSymbols = async (\n    userInput: string,\n    exchange: string,\n    symbolType: string,\n    onResultReadyCallback: (symbols: any[]) => void,\n  ): Promise<void> => {\n    const symbols = await getAllSymbols(\n      userInput,\n      this.exchangeConfig.restApiUrl,\n      this.exchangeConfig.name,\n    );\n    onResultReadyCallback(symbols);\n  };\n\n  resolveSymbol = async (\n    symbolName: string,\n    onSymbolResolvedCallback: (symbolInfo: SymbolInfo) => void,\n    onResolveErrorCallback: (error: string) => void,\n  ): Promise<void> => {\n    if (!symbolName) {\n      await onResolveErrorCallback(\"cannot resolve symbol\");\n      return;\n    }\n\n    const symbolInfo = async (): Promise<SymbolInfo> => {\n      const meta = await this.adapter.fetchSymbolMeta(\n        symbolName,\n        this.exchangeConfig.restApiUrl,\n      );\n      const priceScale = meta.priceScale ?? 8;\n\n      return {\n        name: symbolName,\n        ticker: symbolName,\n        description: symbolName,\n        type: \"crypto\",\n        session: \"24x7\",\n        timezone: \"Etc/UTC\",\n        exchange: this.exchangeConfig.name,\n        minmov: 1,\n        pricescale: Math.pow(10, priceScale),\n        has_daily: true,\n        has_intraday: true,\n        has_no_volume: false,\n        has_seconds: true,\n        seconds_multipliers: [1],\n        volume: \"hundreds\",\n        volume_precision: 9,\n        data_status: \"streaming\",\n        resolution: \"1h\",\n      };\n    };\n    const symbol = await symbolInfo();\n    onSymbolResolvedCallback(symbol);\n  };\n\n  getBars = async (\n    symbolInfo: SymbolInfo,\n    resolution: string,\n    periodParams: PeriodParams,\n    onHistoryCallback: (bars: Bar[], meta: { noData: boolean }) => void,\n    onErrorCallback: (error: any) => void,\n  ): Promise<void> => {\n    const { from, to, firstDataRequest } = periodParams;\n\n    // Only fetch on the first data request; tell TradingView there's\n    // no older history so it stops paginating backwards.\n    if (!firstDataRequest) {\n      onHistoryCallback([], { noData: true });\n      return;\n    }\n\n    let interval = \"60\"; // 1 hour\n\n    // Calculate interval using resolution data\n    if (!/[a-zA-Z]$/.test(resolution)) {\n      if (parseInt(resolution) >= 60) {\n        interval = parseInt(resolution) / 60 + \"h\";\n      } else {\n        interval = resolution + \"m\";\n      }\n    } else {\n      interval = resolution\n        .toLowerCase()\n        .replace(/[a-z]\\b/g, (c) => c.toLowerCase());\n    }\n\n    try {\n      const data: NormalizedCandle[] = await this.adapter.fetchBars(\n        { symbol: symbolInfo.name, interval, from, to },\n        this.exchangeConfig.restApiUrl,\n      );\n\n      if (!Array.isArray(data) || data.length === 0) {\n        onHistoryCallback([], { noData: true });\n        return;\n      }\n\n      let bars: Bar[] = [];\n      data.forEach((bar) => {\n        if (bar[0] >= from * 1000 && bar[0] < to * 1000) {\n          bars = [\n            ...bars,\n            {\n              time: bar[0],\n              low: bar[3],\n              high: bar[2],\n              open: bar[1],\n              close: bar[4],\n              volume: bar[5],\n            },\n          ];\n        }\n      });\n      onHistoryCallback(bars, { noData: bars.length === 0 });\n    } catch (error) {\n      console.log(\"[getBars]: Get error\", error);\n      onErrorCallback(error);\n    }\n  };\n\n  getTimescaleMarks(\n    symbolInfo: SymbolInfo,\n    from: number,\n    to: number,\n    onDataCallback: (marks: TimescaleMark[]) => void,\n    resolution: string,\n  ): void {\n    if (this.timescaleMarks.length > 0) {\n      let timescaleMarks = Object.assign([], this.timescaleMarks);\n      onDataCallback(timescaleMarks);\n    }\n  }\n\n  async getServerTime(\n    onServertimeCallback: (time: number) => void,\n  ): Promise<void> {\n    const serverTime = await this.adapter.fetchServerTime(\n      this.exchangeConfig.restApiUrl,\n    );\n    onServertimeCallback(serverTime);\n  }\n\n  subscribeBars = (\n    symbolInfo: SymbolInfo,\n    resolution: string,\n    onRealtimeCallback: (bar: Bar) => void,\n    subscribeUID: string,\n    onResetCacheNeededCallback: () => void,\n  ): void => {\n    // Get WebSocket URL (might be dynamic for KuCoin)\n    const connectWebSocket = async () => {\n      let wsUrl = this.exchangeConfig.wsUrl;\n      if (this.exchangeConfig.getWsUrl) {\n        try {\n          wsUrl = await this.exchangeConfig.getWsUrl(symbolInfo.name);\n        } catch (error) {\n          console.error(\"Failed to get WebSocket URL:\", error);\n          return;\n        }\n      }\n\n      subscribeOnStream(\n        symbolInfo,\n        resolution,\n        onRealtimeCallback,\n        subscribeUID,\n        onResetCacheNeededCallback,\n        this.interval,\n        wsUrl,\n        this.exchangeConfig.name,\n      );\n    };\n\n    // Execute connection asynchronously\n    connectWebSocket();\n  };\n\n  unsubscribeBars = (subscriberUID: string): void => {\n    unsubscribeFromStream(subscriberUID);\n  };\n}\n"],"mappings":"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","names":["import_react","t","i","n","o","e","e","info","priceScale","params","resp","raw","candles","Exchange","e","supportedExchanges","interval","e","orderLines"]}