binbot-charts 0.12.4 → 0.12.5

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
@@ -557,21 +557,49 @@ var SUPPORTED_EXCHANGES = {
557
557
 
558
558
  // src/streaming.ts
559
559
  var channelToSubscription = /* @__PURE__ */ new Map();
560
+ var pingInterval = null;
561
+ var reconnectTimeout = null;
560
562
  function setupSockets(subRequest, config) {
561
563
  const socket = new WebSocket(config.wsUrl);
562
564
  window.socket = socket;
563
565
  socket.onopen = (event) => {
564
566
  console.log("[socket] Connected");
565
567
  socket.send(JSON.stringify(subRequest));
568
+ if (config.exchange === EXCHANGE_KUCOIN) {
569
+ if (pingInterval) {
570
+ clearInterval(pingInterval);
571
+ }
572
+ pingInterval = window.setInterval(() => {
573
+ if (socket.readyState === WebSocket.OPEN) {
574
+ socket.send(JSON.stringify({ id: Date.now(), type: "ping" }));
575
+ }
576
+ }, 2e4);
577
+ }
566
578
  };
567
579
  socket.onclose = (reason) => {
568
580
  console.log("[socket] Disconnected:", reason);
581
+ if (pingInterval) {
582
+ clearInterval(pingInterval);
583
+ pingInterval = null;
584
+ }
585
+ if (channelToSubscription.size > 0) {
586
+ console.log("[socket] Reconnecting in 3 seconds...");
587
+ if (reconnectTimeout) {
588
+ clearTimeout(reconnectTimeout);
589
+ }
590
+ reconnectTimeout = window.setTimeout(() => {
591
+ setupSockets(subRequest, config);
592
+ }, 3e3);
593
+ }
569
594
  };
570
595
  socket.onerror = (error) => {
571
596
  console.log("[socket] Error:", error);
572
597
  };
573
598
  socket.onmessage = (e2) => {
574
599
  const data = JSON.parse(e2.data);
600
+ if (data.type === "pong") {
601
+ return;
602
+ }
575
603
  if (config.exchange === EXCHANGE_BINANCE) {
576
604
  parseBinanceMessage(data);
577
605
  } else if (config.exchange === EXCHANGE_KUCOIN) {
@@ -704,7 +732,20 @@ function unsubscribeFromStream(subscriberUID) {
704
732
  window.socket.send(JSON.stringify(subRequest));
705
733
  }
706
734
  channelToSubscription.delete(channelString);
707
- window.socket = void 0;
735
+ if (channelToSubscription.size === 0) {
736
+ if (pingInterval) {
737
+ clearInterval(pingInterval);
738
+ pingInterval = null;
739
+ }
740
+ if (reconnectTimeout) {
741
+ clearTimeout(reconnectTimeout);
742
+ reconnectTimeout = null;
743
+ }
744
+ if (window.socket) {
745
+ window.socket.close();
746
+ window.socket = void 0;
747
+ }
748
+ }
708
749
  break;
709
750
  }
710
751
  }
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, useState } from \"react\";\nimport { useImmer } from \"use-immer\";\nimport { type IOrderLine } from \"./charting-library-interfaces\";\nimport {\n ResolutionString,\n widget,\n} from \"./charting_library/\";\nimport Datafeed from \"./datafeed\";\nimport { ExchangeConfig, 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 [symbolState, setSymbolState] = useState<string | null>(symbol);\n const [transformedSymbol, setTransformedSymbol] = useState<string | null>(null);\n const [isLoadingSymbol, setIsLoadingSymbol] = useState<boolean>(false);\n const prevTimescaleMarks = useRef<any[]>(timescaleMarks);\n const prevExchange = useRef<string>(exchange);\n\n // Fetch symbol metadata and transform based on exchange\n useEffect(() => {\n const fetchSymbolMetadata = async () => {\n if (!symbol) return;\n \n setIsLoadingSymbol(true);\n try {\n // Remove any dashes or formatting from input symbol\n const cleanSymbol = symbol.replace(/-/g, '');\n const response = await fetch(`https://api.terminal.binbot.in/symbol/${cleanSymbol}`);\n \n if (!response.ok) {\n console.warn(`Failed to fetch symbol metadata for ${cleanSymbol}, using original symbol`);\n setTransformedSymbol(symbol);\n return;\n }\n \n const result = await response.json();\n if (result.data?.base_asset && result.data?.quote_asset) {\n const { base_asset, quote_asset } = result.data;\n // KuCoin uses dash separator, Binance uses no separator\n const formatted = exchange.toLowerCase() === 'kucoin'\n ? `${base_asset}-${quote_asset}`\n : `${base_asset}${quote_asset}`;\n setTransformedSymbol(formatted);\n } else {\n console.warn('Invalid symbol metadata response, using original symbol');\n setTransformedSymbol(symbol);\n }\n } catch (error) {\n console.error('Error fetching symbol metadata:', error);\n setTransformedSymbol(symbol);\n } finally {\n setIsLoadingSymbol(false);\n }\n };\n \n fetchSymbolMetadata();\n }, [symbol, exchange]);\n\n useEffect(() => {\n // Don't initialize until symbol is transformed\n if (isLoadingSymbol || !transformedSymbol) {\n return;\n }\n \n if (!widgetState) {\n initializeChart(interval);\n prevExchange.current = exchange;\n setSymbolState(transformedSymbol);\n return;\n }\n\n // Reinitialize chart if exchange changes\n if (widgetState && exchange !== prevExchange.current) {\n widgetState.remove();\n setWidgetState(null);\n prevExchange.current = exchange;\n // Will reinitialize on next render\n return;\n }\n\n if (orderLines && orderLines.length > 0) {\n updateOrderLines(orderLines);\n }\n\n if (widgetState && transformedSymbol !== symbolState) {\n try {\n widgetState.setSymbol(transformedSymbol, interval);\n setSymbolState(transformedSymbol);\n } catch (error) {\n console.error(\"Failed to set symbol:\", error);\n }\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 }, [orderLines, timescaleMarks, exchange, isLoadingSymbol, transformedSymbol, widgetState, symbolState, 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: transformedSymbol || 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 = data?.data && data.data.length > 0 ? data.data[data.data.length - 1] : 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;","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\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.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(symbol: string, apiHost: string = \"https://api.binance.com\", exchange: string = \"Binance\") {\n let newSymbols = [];\n try {\n const data = await makeApiRequest(`api/v3/exchangeInfo?symbol=${symbol.toUpperCase()}`, apiHost);\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}","import { makeApiRequest } from \"./helpers\";\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(symbol: string, apiHost: string): Promise<{ priceScale: number }>;\n fetchBars(params: {\n symbol: string;\n interval: string; // e.g., 1m,5m,1h,1d\n from: number; // seconds\n to: number; // seconds\n }, apiHost: string): Promise<NormalizedCandle[]>;\n fetchServerTime(apiHost: string): Promise<number>; // seconds\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\nconst binanceAdapter: ExchangeAdapter = {\n async fetchSymbolMeta(symbol, apiHost) {\n const info = await makeApiRequest(\n `api/v3/exchangeInfo?symbol=${symbol}`,\n apiHost\n );\n const priceScale = Number(info.symbols?.[0]?.baseAssetPrecision) || 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 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 const incRaw = info.data[0].baseIncrement;\n const incStr = 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 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 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?: () => 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 () => {\n // KuCoin requires POST to bullet-public; use proxy via makeApiRequest\n try {\n const data = await makeApiRequest(\n \"api/v1/bullet-public\",\n \"https://api.kucoin.com\",\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(`Failed to get KuCoin WebSocket URL: ${error?.message || String(error)}`);\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\";\n\nconst channelToSubscription = new Map();\n\ndeclare global {\n interface Window { socket: WebSocket; }\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(subRequest: SubscriptionRequest, config: StreamingConfig) {\n const socket: WebSocket = new WebSocket(config.wsUrl);\n window.socket = socket;\n socket.onopen = (event) => {\n console.log(\"[socket] Connected\");\n socket.send(JSON.stringify(subRequest));\n };\n\n socket.onclose = (reason) => {\n console.log(\"[socket] Disconnected:\", reason);\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 // 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 const channelString = exchange === EXCHANGE_BINANCE \n ? `${symbolInfo.name.toLowerCase()}@kline_${interval}`\n : `/market/candles:${symbolInfo.name}_${interval}`; // KuCoin format\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 = 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 = 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 window.socket = undefined;\n break;\n }\n }\n }\n}\n","import { getAllSymbols, makeApiRequest } from \"./helpers\";\nimport { getExchangeAdapter, type ExchangeAdapter, type NormalizedCandle } 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 (supportedExchanges: ExchangeConfig[]): 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 (callback: (data: ConfigurationData) => void): Promise<void> => {\n this.configurationData = await getConfigurationData(this.supportedExchanges);\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(symbolName, this.exchangeConfig.restApiUrl);\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.toLowerCase().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(onServertimeCallback: (time: number) => void): Promise<void> {\n const serverTime = await this.adapter.fetchServerTime(this.exchangeConfig.restApiUrl);\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();\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","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, useState } from \"react\";\nimport { useImmer } from \"use-immer\";\nimport { type IOrderLine } from \"./charting-library-interfaces\";\nimport {\n ResolutionString,\n widget,\n} from \"./charting_library/\";\nimport Datafeed from \"./datafeed\";\nimport { ExchangeConfig, 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 [symbolState, setSymbolState] = useState<string | null>(symbol);\n const [transformedSymbol, setTransformedSymbol] = useState<string | null>(null);\n const [isLoadingSymbol, setIsLoadingSymbol] = useState<boolean>(false);\n const prevTimescaleMarks = useRef<any[]>(timescaleMarks);\n const prevExchange = useRef<string>(exchange);\n\n // Fetch symbol metadata and transform based on exchange\n useEffect(() => {\n const fetchSymbolMetadata = async () => {\n if (!symbol) return;\n \n setIsLoadingSymbol(true);\n try {\n // Remove any dashes or formatting from input symbol\n const cleanSymbol = symbol.replace(/-/g, '');\n const response = await fetch(`https://api.terminal.binbot.in/symbol/${cleanSymbol}`);\n \n if (!response.ok) {\n console.warn(`Failed to fetch symbol metadata for ${cleanSymbol}, using original symbol`);\n setTransformedSymbol(symbol);\n return;\n }\n \n const result = await response.json();\n if (result.data?.base_asset && result.data?.quote_asset) {\n const { base_asset, quote_asset } = result.data;\n // KuCoin uses dash separator, Binance uses no separator\n const formatted = exchange.toLowerCase() === 'kucoin'\n ? `${base_asset}-${quote_asset}`\n : `${base_asset}${quote_asset}`;\n setTransformedSymbol(formatted);\n } else {\n console.warn('Invalid symbol metadata response, using original symbol');\n setTransformedSymbol(symbol);\n }\n } catch (error) {\n console.error('Error fetching symbol metadata:', error);\n setTransformedSymbol(symbol);\n } finally {\n setIsLoadingSymbol(false);\n }\n };\n \n fetchSymbolMetadata();\n }, [symbol, exchange]);\n\n useEffect(() => {\n // Don't initialize until symbol is transformed\n if (isLoadingSymbol || !transformedSymbol) {\n return;\n }\n \n if (!widgetState) {\n initializeChart(interval);\n prevExchange.current = exchange;\n setSymbolState(transformedSymbol);\n return;\n }\n\n // Reinitialize chart if exchange changes\n if (widgetState && exchange !== prevExchange.current) {\n widgetState.remove();\n setWidgetState(null);\n prevExchange.current = exchange;\n // Will reinitialize on next render\n return;\n }\n\n if (orderLines && orderLines.length > 0) {\n updateOrderLines(orderLines);\n }\n\n if (widgetState && transformedSymbol !== symbolState) {\n try {\n widgetState.setSymbol(transformedSymbol, interval);\n setSymbolState(transformedSymbol);\n } catch (error) {\n console.error(\"Failed to set symbol:\", error);\n }\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 }, [orderLines, timescaleMarks, exchange, isLoadingSymbol, transformedSymbol, widgetState, symbolState, 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: transformedSymbol || 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 = data?.data && data.data.length > 0 ? data.data[data.data.length - 1] : 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;","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\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.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(symbol: string, apiHost: string = \"https://api.binance.com\", exchange: string = \"Binance\") {\n let newSymbols = [];\n try {\n const data = await makeApiRequest(`api/v3/exchangeInfo?symbol=${symbol.toUpperCase()}`, apiHost);\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}","import { makeApiRequest } from \"./helpers\";\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(symbol: string, apiHost: string): Promise<{ priceScale: number }>;\n fetchBars(params: {\n symbol: string;\n interval: string; // e.g., 1m,5m,1h,1d\n from: number; // seconds\n to: number; // seconds\n }, apiHost: string): Promise<NormalizedCandle[]>;\n fetchServerTime(apiHost: string): Promise<number>; // seconds\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\nconst binanceAdapter: ExchangeAdapter = {\n async fetchSymbolMeta(symbol, apiHost) {\n const info = await makeApiRequest(\n `api/v3/exchangeInfo?symbol=${symbol}`,\n apiHost\n );\n const priceScale = Number(info.symbols?.[0]?.baseAssetPrecision) || 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 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 const incRaw = info.data[0].baseIncrement;\n const incStr = 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 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 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?: () => 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 () => {\n // KuCoin requires POST to bullet-public; use proxy via makeApiRequest\n try {\n const data = await makeApiRequest(\n \"api/v1/bullet-public\",\n \"https://api.kucoin.com\",\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(`Failed to get KuCoin WebSocket URL: ${error?.message || String(error)}`);\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\";\n\nconst channelToSubscription = new Map();\nlet pingInterval: number | null = null;\nlet reconnectTimeout: number | null = null;\n\ndeclare global {\n interface Window { socket: WebSocket; }\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(subRequest: SubscriptionRequest, config: StreamingConfig) {\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 const channelString = exchange === EXCHANGE_BINANCE \n ? `${symbolInfo.name.toLowerCase()}@kline_${interval}`\n : `/market/candles:${symbolInfo.name}_${interval}`; // KuCoin format\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 = 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 = 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 { getExchangeAdapter, type ExchangeAdapter, type NormalizedCandle } 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 (supportedExchanges: ExchangeConfig[]): 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 (callback: (data: ConfigurationData) => void): Promise<void> => {\n this.configurationData = await getConfigurationData(this.supportedExchanges);\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(symbolName, this.exchangeConfig.restApiUrl);\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.toLowerCase().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(onServertimeCallback: (time: number) => void): Promise<void> {\n const serverTime = await this.adapter.fetchServerTime(this.exchangeConfig.restApiUrl);\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();\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","Exchange","e","interval","e","orderLines"]}
package/dist/main.js CHANGED
@@ -535,21 +535,49 @@ var SUPPORTED_EXCHANGES = {
535
535
 
536
536
  // src/streaming.ts
537
537
  var channelToSubscription = /* @__PURE__ */ new Map();
538
+ var pingInterval = null;
539
+ var reconnectTimeout = null;
538
540
  function setupSockets(subRequest, config) {
539
541
  const socket = new WebSocket(config.wsUrl);
540
542
  window.socket = socket;
541
543
  socket.onopen = (event) => {
542
544
  console.log("[socket] Connected");
543
545
  socket.send(JSON.stringify(subRequest));
546
+ if (config.exchange === EXCHANGE_KUCOIN) {
547
+ if (pingInterval) {
548
+ clearInterval(pingInterval);
549
+ }
550
+ pingInterval = window.setInterval(() => {
551
+ if (socket.readyState === WebSocket.OPEN) {
552
+ socket.send(JSON.stringify({ id: Date.now(), type: "ping" }));
553
+ }
554
+ }, 2e4);
555
+ }
544
556
  };
545
557
  socket.onclose = (reason) => {
546
558
  console.log("[socket] Disconnected:", reason);
559
+ if (pingInterval) {
560
+ clearInterval(pingInterval);
561
+ pingInterval = null;
562
+ }
563
+ if (channelToSubscription.size > 0) {
564
+ console.log("[socket] Reconnecting in 3 seconds...");
565
+ if (reconnectTimeout) {
566
+ clearTimeout(reconnectTimeout);
567
+ }
568
+ reconnectTimeout = window.setTimeout(() => {
569
+ setupSockets(subRequest, config);
570
+ }, 3e3);
571
+ }
547
572
  };
548
573
  socket.onerror = (error) => {
549
574
  console.log("[socket] Error:", error);
550
575
  };
551
576
  socket.onmessage = (e2) => {
552
577
  const data = JSON.parse(e2.data);
578
+ if (data.type === "pong") {
579
+ return;
580
+ }
553
581
  if (config.exchange === EXCHANGE_BINANCE) {
554
582
  parseBinanceMessage(data);
555
583
  } else if (config.exchange === EXCHANGE_KUCOIN) {
@@ -682,7 +710,20 @@ function unsubscribeFromStream(subscriberUID) {
682
710
  window.socket.send(JSON.stringify(subRequest));
683
711
  }
684
712
  channelToSubscription.delete(channelString);
685
- window.socket = void 0;
713
+ if (channelToSubscription.size === 0) {
714
+ if (pingInterval) {
715
+ clearInterval(pingInterval);
716
+ pingInterval = null;
717
+ }
718
+ if (reconnectTimeout) {
719
+ clearTimeout(reconnectTimeout);
720
+ reconnectTimeout = null;
721
+ }
722
+ if (window.socket) {
723
+ window.socket.close();
724
+ window.socket = void 0;
725
+ }
726
+ }
686
727
  break;
687
728
  }
688
729
  }
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, useState } from \"react\";\nimport { useImmer } from \"use-immer\";\nimport { type IOrderLine } from \"./charting-library-interfaces\";\nimport {\n ResolutionString,\n widget,\n} from \"./charting_library/\";\nimport Datafeed from \"./datafeed\";\nimport { ExchangeConfig, 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 [symbolState, setSymbolState] = useState<string | null>(symbol);\n const [transformedSymbol, setTransformedSymbol] = useState<string | null>(null);\n const [isLoadingSymbol, setIsLoadingSymbol] = useState<boolean>(false);\n const prevTimescaleMarks = useRef<any[]>(timescaleMarks);\n const prevExchange = useRef<string>(exchange);\n\n // Fetch symbol metadata and transform based on exchange\n useEffect(() => {\n const fetchSymbolMetadata = async () => {\n if (!symbol) return;\n \n setIsLoadingSymbol(true);\n try {\n // Remove any dashes or formatting from input symbol\n const cleanSymbol = symbol.replace(/-/g, '');\n const response = await fetch(`https://api.terminal.binbot.in/symbol/${cleanSymbol}`);\n \n if (!response.ok) {\n console.warn(`Failed to fetch symbol metadata for ${cleanSymbol}, using original symbol`);\n setTransformedSymbol(symbol);\n return;\n }\n \n const result = await response.json();\n if (result.data?.base_asset && result.data?.quote_asset) {\n const { base_asset, quote_asset } = result.data;\n // KuCoin uses dash separator, Binance uses no separator\n const formatted = exchange.toLowerCase() === 'kucoin'\n ? `${base_asset}-${quote_asset}`\n : `${base_asset}${quote_asset}`;\n setTransformedSymbol(formatted);\n } else {\n console.warn('Invalid symbol metadata response, using original symbol');\n setTransformedSymbol(symbol);\n }\n } catch (error) {\n console.error('Error fetching symbol metadata:', error);\n setTransformedSymbol(symbol);\n } finally {\n setIsLoadingSymbol(false);\n }\n };\n \n fetchSymbolMetadata();\n }, [symbol, exchange]);\n\n useEffect(() => {\n // Don't initialize until symbol is transformed\n if (isLoadingSymbol || !transformedSymbol) {\n return;\n }\n \n if (!widgetState) {\n initializeChart(interval);\n prevExchange.current = exchange;\n setSymbolState(transformedSymbol);\n return;\n }\n\n // Reinitialize chart if exchange changes\n if (widgetState && exchange !== prevExchange.current) {\n widgetState.remove();\n setWidgetState(null);\n prevExchange.current = exchange;\n // Will reinitialize on next render\n return;\n }\n\n if (orderLines && orderLines.length > 0) {\n updateOrderLines(orderLines);\n }\n\n if (widgetState && transformedSymbol !== symbolState) {\n try {\n widgetState.setSymbol(transformedSymbol, interval);\n setSymbolState(transformedSymbol);\n } catch (error) {\n console.error(\"Failed to set symbol:\", error);\n }\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 }, [orderLines, timescaleMarks, exchange, isLoadingSymbol, transformedSymbol, widgetState, symbolState, 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: transformedSymbol || 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 = data?.data && data.data.length > 0 ? data.data[data.data.length - 1] : 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;","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\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.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(symbol: string, apiHost: string = \"https://api.binance.com\", exchange: string = \"Binance\") {\n let newSymbols = [];\n try {\n const data = await makeApiRequest(`api/v3/exchangeInfo?symbol=${symbol.toUpperCase()}`, apiHost);\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}","import { makeApiRequest } from \"./helpers\";\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(symbol: string, apiHost: string): Promise<{ priceScale: number }>;\n fetchBars(params: {\n symbol: string;\n interval: string; // e.g., 1m,5m,1h,1d\n from: number; // seconds\n to: number; // seconds\n }, apiHost: string): Promise<NormalizedCandle[]>;\n fetchServerTime(apiHost: string): Promise<number>; // seconds\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\nconst binanceAdapter: ExchangeAdapter = {\n async fetchSymbolMeta(symbol, apiHost) {\n const info = await makeApiRequest(\n `api/v3/exchangeInfo?symbol=${symbol}`,\n apiHost\n );\n const priceScale = Number(info.symbols?.[0]?.baseAssetPrecision) || 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 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 const incRaw = info.data[0].baseIncrement;\n const incStr = 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 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 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?: () => 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 () => {\n // KuCoin requires POST to bullet-public; use proxy via makeApiRequest\n try {\n const data = await makeApiRequest(\n \"api/v1/bullet-public\",\n \"https://api.kucoin.com\",\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(`Failed to get KuCoin WebSocket URL: ${error?.message || String(error)}`);\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\";\n\nconst channelToSubscription = new Map();\n\ndeclare global {\n interface Window { socket: WebSocket; }\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(subRequest: SubscriptionRequest, config: StreamingConfig) {\n const socket: WebSocket = new WebSocket(config.wsUrl);\n window.socket = socket;\n socket.onopen = (event) => {\n console.log(\"[socket] Connected\");\n socket.send(JSON.stringify(subRequest));\n };\n\n socket.onclose = (reason) => {\n console.log(\"[socket] Disconnected:\", reason);\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 // 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 const channelString = exchange === EXCHANGE_BINANCE \n ? `${symbolInfo.name.toLowerCase()}@kline_${interval}`\n : `/market/candles:${symbolInfo.name}_${interval}`; // KuCoin format\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 = 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 = 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 window.socket = undefined;\n break;\n }\n }\n }\n}\n","import { getAllSymbols, makeApiRequest } from \"./helpers\";\nimport { getExchangeAdapter, type ExchangeAdapter, type NormalizedCandle } 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 (supportedExchanges: ExchangeConfig[]): 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 (callback: (data: ConfigurationData) => void): Promise<void> => {\n this.configurationData = await getConfigurationData(this.supportedExchanges);\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(symbolName, this.exchangeConfig.restApiUrl);\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.toLowerCase().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(onServertimeCallback: (time: number) => void): Promise<void> {\n const serverTime = await this.adapter.fetchServerTime(this.exchangeConfig.restApiUrl);\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();\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","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, useState } from \"react\";\nimport { useImmer } from \"use-immer\";\nimport { type IOrderLine } from \"./charting-library-interfaces\";\nimport {\n ResolutionString,\n widget,\n} from \"./charting_library/\";\nimport Datafeed from \"./datafeed\";\nimport { ExchangeConfig, 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 [symbolState, setSymbolState] = useState<string | null>(symbol);\n const [transformedSymbol, setTransformedSymbol] = useState<string | null>(null);\n const [isLoadingSymbol, setIsLoadingSymbol] = useState<boolean>(false);\n const prevTimescaleMarks = useRef<any[]>(timescaleMarks);\n const prevExchange = useRef<string>(exchange);\n\n // Fetch symbol metadata and transform based on exchange\n useEffect(() => {\n const fetchSymbolMetadata = async () => {\n if (!symbol) return;\n \n setIsLoadingSymbol(true);\n try {\n // Remove any dashes or formatting from input symbol\n const cleanSymbol = symbol.replace(/-/g, '');\n const response = await fetch(`https://api.terminal.binbot.in/symbol/${cleanSymbol}`);\n \n if (!response.ok) {\n console.warn(`Failed to fetch symbol metadata for ${cleanSymbol}, using original symbol`);\n setTransformedSymbol(symbol);\n return;\n }\n \n const result = await response.json();\n if (result.data?.base_asset && result.data?.quote_asset) {\n const { base_asset, quote_asset } = result.data;\n // KuCoin uses dash separator, Binance uses no separator\n const formatted = exchange.toLowerCase() === 'kucoin'\n ? `${base_asset}-${quote_asset}`\n : `${base_asset}${quote_asset}`;\n setTransformedSymbol(formatted);\n } else {\n console.warn('Invalid symbol metadata response, using original symbol');\n setTransformedSymbol(symbol);\n }\n } catch (error) {\n console.error('Error fetching symbol metadata:', error);\n setTransformedSymbol(symbol);\n } finally {\n setIsLoadingSymbol(false);\n }\n };\n \n fetchSymbolMetadata();\n }, [symbol, exchange]);\n\n useEffect(() => {\n // Don't initialize until symbol is transformed\n if (isLoadingSymbol || !transformedSymbol) {\n return;\n }\n \n if (!widgetState) {\n initializeChart(interval);\n prevExchange.current = exchange;\n setSymbolState(transformedSymbol);\n return;\n }\n\n // Reinitialize chart if exchange changes\n if (widgetState && exchange !== prevExchange.current) {\n widgetState.remove();\n setWidgetState(null);\n prevExchange.current = exchange;\n // Will reinitialize on next render\n return;\n }\n\n if (orderLines && orderLines.length > 0) {\n updateOrderLines(orderLines);\n }\n\n if (widgetState && transformedSymbol !== symbolState) {\n try {\n widgetState.setSymbol(transformedSymbol, interval);\n setSymbolState(transformedSymbol);\n } catch (error) {\n console.error(\"Failed to set symbol:\", error);\n }\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 }, [orderLines, timescaleMarks, exchange, isLoadingSymbol, transformedSymbol, widgetState, symbolState, 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: transformedSymbol || 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 = data?.data && data.data.length > 0 ? data.data[data.data.length - 1] : 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;","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\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.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(symbol: string, apiHost: string = \"https://api.binance.com\", exchange: string = \"Binance\") {\n let newSymbols = [];\n try {\n const data = await makeApiRequest(`api/v3/exchangeInfo?symbol=${symbol.toUpperCase()}`, apiHost);\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}","import { makeApiRequest } from \"./helpers\";\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(symbol: string, apiHost: string): Promise<{ priceScale: number }>;\n fetchBars(params: {\n symbol: string;\n interval: string; // e.g., 1m,5m,1h,1d\n from: number; // seconds\n to: number; // seconds\n }, apiHost: string): Promise<NormalizedCandle[]>;\n fetchServerTime(apiHost: string): Promise<number>; // seconds\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\nconst binanceAdapter: ExchangeAdapter = {\n async fetchSymbolMeta(symbol, apiHost) {\n const info = await makeApiRequest(\n `api/v3/exchangeInfo?symbol=${symbol}`,\n apiHost\n );\n const priceScale = Number(info.symbols?.[0]?.baseAssetPrecision) || 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 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 const incRaw = info.data[0].baseIncrement;\n const incStr = 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 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 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?: () => 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 () => {\n // KuCoin requires POST to bullet-public; use proxy via makeApiRequest\n try {\n const data = await makeApiRequest(\n \"api/v1/bullet-public\",\n \"https://api.kucoin.com\",\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(`Failed to get KuCoin WebSocket URL: ${error?.message || String(error)}`);\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\";\n\nconst channelToSubscription = new Map();\nlet pingInterval: number | null = null;\nlet reconnectTimeout: number | null = null;\n\ndeclare global {\n interface Window { socket: WebSocket; }\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(subRequest: SubscriptionRequest, config: StreamingConfig) {\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 const channelString = exchange === EXCHANGE_BINANCE \n ? `${symbolInfo.name.toLowerCase()}@kline_${interval}`\n : `/market/candles:${symbolInfo.name}_${interval}`; // KuCoin format\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 = 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 = 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 { getExchangeAdapter, type ExchangeAdapter, type NormalizedCandle } 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 (supportedExchanges: ExchangeConfig[]): 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 (callback: (data: ConfigurationData) => void): Promise<void> => {\n this.configurationData = await getConfigurationData(this.supportedExchanges);\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(symbolName, this.exchangeConfig.restApiUrl);\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.toLowerCase().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(onServertimeCallback: (time: number) => void): Promise<void> {\n const serverTime = await this.adapter.fetchServerTime(this.exchangeConfig.restApiUrl);\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();\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","Exchange","e","useRef","useEffect","interval","e","orderLines"]}
package/package.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "0.12.4",
2
+ "version": "0.12.5",
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.",