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 +42 -1
- package/dist/main.cjs.map +1 -1
- package/dist/main.js +42 -1
- package/dist/main.js.map +1 -1
- package/package.json +1 -1
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
|
-
|
|
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
|
-
|
|
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