binbot-charts 0.12.13 → 0.12.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/main.cjs CHANGED
@@ -480,6 +480,7 @@ var binanceAdapter = {
480
480
  });
481
481
  }
482
482
  };
483
+ var kucoinFuturesBarsAbort = null;
483
484
  var kucoinAdapter = {
484
485
  fetchSymbolMeta(symbol, apiHost) {
485
486
  return __async(this, null, function* () {
@@ -514,35 +515,50 @@ var kucoinAdapter = {
514
515
  fetchBars(_0, _1) {
515
516
  return __async(this, arguments, function* ({ symbol, interval, from, to }, apiHost) {
516
517
  if (isKucoinFutures(symbol)) {
518
+ if (kucoinFuturesBarsAbort) {
519
+ kucoinFuturesBarsAbort.abort();
520
+ }
521
+ kucoinFuturesBarsAbort = new AbortController();
522
+ const { signal } = kucoinFuturesBarsAbort;
517
523
  const granularity = mapKuCoinFuturesGranularity(interval);
518
- const params2 = new URLSearchParams({
519
- symbol,
520
- granularity: String(granularity),
521
- from: String(from * 1e3),
522
- // futures expects milliseconds
523
- to: String(to * 1e3)
524
+ const fromMs = from * 1e3;
525
+ let currentTo = to * 1e3;
526
+ let allCandles = [];
527
+ const MAX_PAGES = 10;
528
+ for (let page = 0; page < MAX_PAGES; page++) {
529
+ const params2 = new URLSearchParams({
530
+ symbol,
531
+ granularity: String(granularity),
532
+ to: String(currentTo)
533
+ });
534
+ const resp2 = yield makeApiRequest(
535
+ `api/v1/kline/query?${params2.toString()}`,
536
+ KUCOIN_FUTURES_API,
537
+ { signal }
538
+ );
539
+ const raw2 = Array.isArray(resp2 == null ? void 0 : resp2.data) ? resp2.data : [];
540
+ if (raw2.length === 0) break;
541
+ const candles2 = raw2.map((bar) => [
542
+ Number(bar[0]),
543
+ Number(bar[1]),
544
+ Number(bar[2]),
545
+ Number(bar[3]),
546
+ Number(bar[4]),
547
+ Number(bar[5])
548
+ ]);
549
+ allCandles = allCandles.concat(candles2);
550
+ const earliest = Math.min(...candles2.map((c) => c[0]));
551
+ if (earliest <= fromMs) break;
552
+ currentTo = earliest;
553
+ }
554
+ const seen = /* @__PURE__ */ new Set();
555
+ const unique = allCandles.filter((c) => {
556
+ if (seen.has(c[0])) return false;
557
+ seen.add(c[0]);
558
+ return true;
524
559
  });
525
- const resp2 = yield makeApiRequest(
526
- `api/v1/kline/query?${params2.toString()}`,
527
- KUCOIN_FUTURES_API
528
- );
529
- const raw2 = Array.isArray(resp2 == null ? void 0 : resp2.data) ? resp2.data : [];
530
- const candles2 = raw2.map((bar) => [
531
- Number(bar[0]),
532
- // time already in ms
533
- Number(bar[1]),
534
- // open
535
- Number(bar[2]),
536
- // high
537
- Number(bar[3]),
538
- // low
539
- Number(bar[4]),
540
- // close
541
- Number(bar[5])
542
- // volume
543
- ]);
544
- candles2.sort((a, b) => a[0] - b[0]);
545
- return candles2;
560
+ unique.sort((a, b) => a[0] - b[0]);
561
+ return unique;
546
562
  }
547
563
  const type = mapKuCoinInterval(interval);
548
564
  const params = new URLSearchParams({
@@ -925,6 +941,10 @@ var Datafeed = class {
925
941
  });
926
942
  this.getBars = (symbolInfo, resolution, periodParams, onHistoryCallback, onErrorCallback) => __async(this, null, function* () {
927
943
  const { from, to, firstDataRequest } = periodParams;
944
+ if (!firstDataRequest) {
945
+ onHistoryCallback([], { noData: true });
946
+ return;
947
+ }
928
948
  let interval = "60";
929
949
  if (!/[a-zA-Z]$/.test(resolution)) {
930
950
  if (parseInt(resolution) >= 60) {
@@ -960,7 +980,7 @@ var Datafeed = class {
960
980
  ];
961
981
  }
962
982
  });
963
- onHistoryCallback(bars, { noData: false });
983
+ onHistoryCallback(bars, { noData: bars.length === 0 });
964
984
  } catch (error) {
965
985
  console.log("[getBars]: Get error", error);
966
986
  onErrorCallback(error);
package/dist/main.cjs.map CHANGED
@@ -1 +1 @@
1
- {"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 height?: string;\n onTick?: (event: any) => void;\n getLatestBar?: (data: any) => void;\n exchange?: string; // Exchange name: 'binance' or 'kucoin'\n supportedExchanges?: string[]; // List of supported exchanges\n}\n\nconst TVChartContainer: FC<TVChartContainerProps> = ({\n symbol = \"SUPER-USDT\",\n interval = \"1h\" as ResolutionString,\n libraryPath = \"/charting_library/\",\n timescaleMarks = [],\n orderLines = [],\n height = \"calc(100vh - 80px)\",\n onTick,\n getLatestBar,\n exchange = \"kucoin\",\n supportedExchanges = [\"kucoin\", \"binance\"],\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 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={{ height: height }} />;\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 // In browser during development, route through Vite proxy to avoid CORS\n if (typeof window !== \"undefined\") {\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 }\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\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 tickStr = String(info.data.tickSize);\n const dot = tickStr.indexOf(\".\");\n priceScale = dot >= 0 ? Math.max(0, tickStr.length - dot - 1) : 0;\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 // KuCoin Futures: GET /api/v1/kline/query\n // granularity is in minutes: 1,5,15,30,60,120,240,480,720,1440,10080\n const granularity = mapKuCoinFuturesGranularity(interval);\n const params = new URLSearchParams({\n symbol,\n granularity: String(granularity),\n from: String(from * 1000), // futures expects milliseconds\n to: String(to * 1000),\n });\n const resp = await makeApiRequest(\n `api/v1/kline/query?${params.toString()}`,\n KUCOIN_FUTURES_API,\n );\n const raw = Array.isArray(resp?.data) ? resp.data : [];\n // Futures candle format: [time(ms), open, high, low, close, volume]\n const candles: NormalizedCandle[] = raw.map((bar: any) => [\n Number(bar[0]), // time already in ms\n Number(bar[1]), // open\n Number(bar[2]), // high\n Number(bar[3]), // low\n Number(bar[4]), // close\n Number(bar[5]), // volume\n ]);\n candles.sort((a, b) => a[0] - b[0]);\n return candles;\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 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: false });\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","interval","e","orderLines"]}
1
+ {"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 height?: string;\n onTick?: (event: any) => void;\n getLatestBar?: (data: any) => void;\n exchange?: string; // Exchange name: 'binance' or 'kucoin'\n supportedExchanges?: string[]; // List of supported exchanges\n}\n\nconst TVChartContainer: FC<TVChartContainerProps> = ({\n symbol = \"SUPER-USDT\",\n interval = \"1h\" as ResolutionString,\n libraryPath = \"/charting_library/\",\n timescaleMarks = [],\n orderLines = [],\n height = \"calc(100vh - 80px)\",\n onTick,\n getLatestBar,\n exchange = \"kucoin\",\n supportedExchanges = [\"kucoin\", \"binance\"],\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 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={{ height: height }} />;\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 // In browser during development, route through Vite proxy to avoid CORS\n if (typeof window !== \"undefined\") {\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 }\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 tickStr = String(info.data.tickSize);\n const dot = tickStr.indexOf(\".\");\n priceScale = dot >= 0 ? Math.max(0, tickStr.length - dot - 1) : 0;\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","interval","e","orderLines"]}
package/dist/main.js CHANGED
@@ -458,6 +458,7 @@ var binanceAdapter = {
458
458
  });
459
459
  }
460
460
  };
461
+ var kucoinFuturesBarsAbort = null;
461
462
  var kucoinAdapter = {
462
463
  fetchSymbolMeta(symbol, apiHost) {
463
464
  return __async(this, null, function* () {
@@ -492,35 +493,50 @@ var kucoinAdapter = {
492
493
  fetchBars(_0, _1) {
493
494
  return __async(this, arguments, function* ({ symbol, interval, from, to }, apiHost) {
494
495
  if (isKucoinFutures(symbol)) {
496
+ if (kucoinFuturesBarsAbort) {
497
+ kucoinFuturesBarsAbort.abort();
498
+ }
499
+ kucoinFuturesBarsAbort = new AbortController();
500
+ const { signal } = kucoinFuturesBarsAbort;
495
501
  const granularity = mapKuCoinFuturesGranularity(interval);
496
- const params2 = new URLSearchParams({
497
- symbol,
498
- granularity: String(granularity),
499
- from: String(from * 1e3),
500
- // futures expects milliseconds
501
- to: String(to * 1e3)
502
+ const fromMs = from * 1e3;
503
+ let currentTo = to * 1e3;
504
+ let allCandles = [];
505
+ const MAX_PAGES = 10;
506
+ for (let page = 0; page < MAX_PAGES; page++) {
507
+ const params2 = new URLSearchParams({
508
+ symbol,
509
+ granularity: String(granularity),
510
+ to: String(currentTo)
511
+ });
512
+ const resp2 = yield makeApiRequest(
513
+ `api/v1/kline/query?${params2.toString()}`,
514
+ KUCOIN_FUTURES_API,
515
+ { signal }
516
+ );
517
+ const raw2 = Array.isArray(resp2 == null ? void 0 : resp2.data) ? resp2.data : [];
518
+ if (raw2.length === 0) break;
519
+ const candles2 = raw2.map((bar) => [
520
+ Number(bar[0]),
521
+ Number(bar[1]),
522
+ Number(bar[2]),
523
+ Number(bar[3]),
524
+ Number(bar[4]),
525
+ Number(bar[5])
526
+ ]);
527
+ allCandles = allCandles.concat(candles2);
528
+ const earliest = Math.min(...candles2.map((c) => c[0]));
529
+ if (earliest <= fromMs) break;
530
+ currentTo = earliest;
531
+ }
532
+ const seen = /* @__PURE__ */ new Set();
533
+ const unique = allCandles.filter((c) => {
534
+ if (seen.has(c[0])) return false;
535
+ seen.add(c[0]);
536
+ return true;
502
537
  });
503
- const resp2 = yield makeApiRequest(
504
- `api/v1/kline/query?${params2.toString()}`,
505
- KUCOIN_FUTURES_API
506
- );
507
- const raw2 = Array.isArray(resp2 == null ? void 0 : resp2.data) ? resp2.data : [];
508
- const candles2 = raw2.map((bar) => [
509
- Number(bar[0]),
510
- // time already in ms
511
- Number(bar[1]),
512
- // open
513
- Number(bar[2]),
514
- // high
515
- Number(bar[3]),
516
- // low
517
- Number(bar[4]),
518
- // close
519
- Number(bar[5])
520
- // volume
521
- ]);
522
- candles2.sort((a, b) => a[0] - b[0]);
523
- return candles2;
538
+ unique.sort((a, b) => a[0] - b[0]);
539
+ return unique;
524
540
  }
525
541
  const type = mapKuCoinInterval(interval);
526
542
  const params = new URLSearchParams({
@@ -903,6 +919,10 @@ var Datafeed = class {
903
919
  });
904
920
  this.getBars = (symbolInfo, resolution, periodParams, onHistoryCallback, onErrorCallback) => __async(this, null, function* () {
905
921
  const { from, to, firstDataRequest } = periodParams;
922
+ if (!firstDataRequest) {
923
+ onHistoryCallback([], { noData: true });
924
+ return;
925
+ }
906
926
  let interval = "60";
907
927
  if (!/[a-zA-Z]$/.test(resolution)) {
908
928
  if (parseInt(resolution) >= 60) {
@@ -938,7 +958,7 @@ var Datafeed = class {
938
958
  ];
939
959
  }
940
960
  });
941
- onHistoryCallback(bars, { noData: false });
961
+ onHistoryCallback(bars, { noData: bars.length === 0 });
942
962
  } catch (error) {
943
963
  console.log("[getBars]: Get error", error);
944
964
  onErrorCallback(error);
package/dist/main.js.map CHANGED
@@ -1 +1 @@
1
- {"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 height?: string;\n onTick?: (event: any) => void;\n getLatestBar?: (data: any) => void;\n exchange?: string; // Exchange name: 'binance' or 'kucoin'\n supportedExchanges?: string[]; // List of supported exchanges\n}\n\nconst TVChartContainer: FC<TVChartContainerProps> = ({\n symbol = \"SUPER-USDT\",\n interval = \"1h\" as ResolutionString,\n libraryPath = \"/charting_library/\",\n timescaleMarks = [],\n orderLines = [],\n height = \"calc(100vh - 80px)\",\n onTick,\n getLatestBar,\n exchange = \"kucoin\",\n supportedExchanges = [\"kucoin\", \"binance\"],\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 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={{ height: height }} />;\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 // In browser during development, route through Vite proxy to avoid CORS\n if (typeof window !== \"undefined\") {\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 }\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\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 tickStr = String(info.data.tickSize);\n const dot = tickStr.indexOf(\".\");\n priceScale = dot >= 0 ? Math.max(0, tickStr.length - dot - 1) : 0;\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 // KuCoin Futures: GET /api/v1/kline/query\n // granularity is in minutes: 1,5,15,30,60,120,240,480,720,1440,10080\n const granularity = mapKuCoinFuturesGranularity(interval);\n const params = new URLSearchParams({\n symbol,\n granularity: String(granularity),\n from: String(from * 1000), // futures expects milliseconds\n to: String(to * 1000),\n });\n const resp = await makeApiRequest(\n `api/v1/kline/query?${params.toString()}`,\n KUCOIN_FUTURES_API,\n );\n const raw = Array.isArray(resp?.data) ? resp.data : [];\n // Futures candle format: [time(ms), open, high, low, close, volume]\n const candles: NormalizedCandle[] = raw.map((bar: any) => [\n Number(bar[0]), // time already in ms\n Number(bar[1]), // open\n Number(bar[2]), // high\n Number(bar[3]), // low\n Number(bar[4]), // close\n Number(bar[5]), // volume\n ]);\n candles.sort((a, b) => a[0] - b[0]);\n return candles;\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 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: false });\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":["useEffect","useRef","t","i","n","o","e","e","info","priceScale","params","resp","raw","candles","Exchange","e","useRef","useEffect","interval","e","orderLines"]}
1
+ {"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 height?: string;\n onTick?: (event: any) => void;\n getLatestBar?: (data: any) => void;\n exchange?: string; // Exchange name: 'binance' or 'kucoin'\n supportedExchanges?: string[]; // List of supported exchanges\n}\n\nconst TVChartContainer: FC<TVChartContainerProps> = ({\n symbol = \"SUPER-USDT\",\n interval = \"1h\" as ResolutionString,\n libraryPath = \"/charting_library/\",\n timescaleMarks = [],\n orderLines = [],\n height = \"calc(100vh - 80px)\",\n onTick,\n getLatestBar,\n exchange = \"kucoin\",\n supportedExchanges = [\"kucoin\", \"binance\"],\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 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={{ height: height }} />;\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 // In browser during development, route through Vite proxy to avoid CORS\n if (typeof window !== \"undefined\") {\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 }\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 tickStr = String(info.data.tickSize);\n const dot = tickStr.indexOf(\".\");\n priceScale = dot >= 0 ? Math.max(0, tickStr.length - dot - 1) : 0;\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":["useEffect","useRef","t","i","n","o","e","e","info","priceScale","params","resp","raw","candles","Exchange","e","useRef","useEffect","interval","e","orderLines"]}
package/package.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "0.12.13",
2
+ "version": "0.12.14",
3
3
  "name": "binbot-charts",
4
4
  "type": "module",
5
5
  "description": "Binbot charts is the default candlestick bars chart used in terminal.binbot.in to render bots graphically.",