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