@forgecharts/sdk 1.1.23 → 1.1.28

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.
Files changed (562) hide show
  1. package/dist/__tests__/backwardCompatibility.test.d.ts +14 -0
  2. package/dist/__tests__/backwardCompatibility.test.d.ts.map +1 -0
  3. package/dist/__tests__/backwardCompatibility.test.js +159 -0
  4. package/dist/__tests__/backwardCompatibility.test.js.map +1 -0
  5. package/dist/__tests__/candleInvariant.test.d.ts +20 -0
  6. package/dist/__tests__/candleInvariant.test.d.ts.map +1 -0
  7. package/dist/__tests__/candleInvariant.test.js +415 -0
  8. package/dist/__tests__/candleInvariant.test.js.map +1 -0
  9. package/dist/__tests__/public-api-surface.d.ts +13 -0
  10. package/dist/__tests__/public-api-surface.d.ts.map +1 -0
  11. package/{src/__tests__/public-api-surface.ts → dist/__tests__/public-api-surface.js} +4 -42
  12. package/dist/__tests__/public-api-surface.js.map +1 -0
  13. package/dist/__tests__/timeframeBoundary.test.d.ts +17 -0
  14. package/dist/__tests__/timeframeBoundary.test.d.ts.map +1 -0
  15. package/dist/__tests__/timeframeBoundary.test.js +452 -0
  16. package/dist/__tests__/timeframeBoundary.test.js.map +1 -0
  17. package/dist/api/DrawingManager.d.ts +20 -0
  18. package/dist/api/DrawingManager.d.ts.map +1 -0
  19. package/dist/api/DrawingManager.js +190 -0
  20. package/dist/api/DrawingManager.js.map +1 -0
  21. package/dist/api/EventBus.d.ts +19 -0
  22. package/dist/api/EventBus.d.ts.map +1 -0
  23. package/dist/api/EventBus.js +44 -0
  24. package/dist/api/EventBus.js.map +1 -0
  25. package/dist/api/IndicatorDAG.d.ts +85 -0
  26. package/dist/api/IndicatorDAG.d.ts.map +1 -0
  27. package/dist/api/IndicatorDAG.js +316 -0
  28. package/dist/api/IndicatorDAG.js.map +1 -0
  29. package/dist/api/IndicatorRegistry.d.ts +22 -0
  30. package/dist/api/IndicatorRegistry.d.ts.map +1 -0
  31. package/dist/api/IndicatorRegistry.js +39 -0
  32. package/dist/api/IndicatorRegistry.js.map +1 -0
  33. package/dist/api/LayoutManager.d.ts +30 -0
  34. package/dist/api/LayoutManager.d.ts.map +1 -0
  35. package/dist/api/LayoutManager.js +51 -0
  36. package/dist/api/LayoutManager.js.map +1 -0
  37. package/dist/api/PaneManager.d.ts +42 -0
  38. package/dist/api/PaneManager.d.ts.map +1 -0
  39. package/dist/api/PaneManager.js +119 -0
  40. package/dist/api/PaneManager.js.map +1 -0
  41. package/dist/api/ReferenceAPI.d.ts +78 -0
  42. package/dist/api/ReferenceAPI.d.ts.map +1 -0
  43. package/dist/api/ReferenceAPI.js +153 -0
  44. package/dist/api/ReferenceAPI.js.map +1 -0
  45. package/dist/api/TChart.d.ts +345 -0
  46. package/dist/api/TChart.d.ts.map +1 -0
  47. package/dist/api/TChart.js +765 -0
  48. package/dist/api/TChart.js.map +1 -0
  49. package/{src/api/createChart.ts → dist/api/createChart.d.ts} +2 -7
  50. package/dist/api/createChart.d.ts.map +1 -0
  51. package/dist/api/createChart.js +42 -0
  52. package/dist/api/createChart.js.map +1 -0
  53. package/dist/api/drawing tools/fib gann menu/fibRetracement.d.ts +4 -0
  54. package/dist/api/drawing tools/fib gann menu/fibRetracement.d.ts.map +1 -0
  55. package/dist/api/drawing tools/fib gann menu/fibRetracement.js +22 -0
  56. package/dist/api/drawing tools/fib gann menu/fibRetracement.js.map +1 -0
  57. package/dist/api/drawing tools/lines menu/crossLine.d.ts +4 -0
  58. package/dist/api/drawing tools/lines menu/crossLine.d.ts.map +1 -0
  59. package/dist/api/drawing tools/lines menu/crossLine.js +16 -0
  60. package/dist/api/drawing tools/lines menu/crossLine.js.map +1 -0
  61. package/dist/api/drawing tools/lines menu/disjointChannel.d.ts +17 -0
  62. package/dist/api/drawing tools/lines menu/disjointChannel.d.ts.map +1 -0
  63. package/dist/api/drawing tools/lines menu/disjointChannel.js +59 -0
  64. package/dist/api/drawing tools/lines menu/disjointChannel.js.map +1 -0
  65. package/dist/api/drawing tools/lines menu/extendedLine.d.ts +4 -0
  66. package/dist/api/drawing tools/lines menu/extendedLine.d.ts.map +1 -0
  67. package/dist/api/drawing tools/lines menu/extendedLine.js +17 -0
  68. package/dist/api/drawing tools/lines menu/extendedLine.js.map +1 -0
  69. package/dist/api/drawing tools/lines menu/flatTopBottom.d.ts +4 -0
  70. package/dist/api/drawing tools/lines menu/flatTopBottom.d.ts.map +1 -0
  71. package/dist/api/drawing tools/lines menu/flatTopBottom.js +41 -0
  72. package/dist/api/drawing tools/lines menu/flatTopBottom.js.map +1 -0
  73. package/dist/api/drawing tools/lines menu/horizontal.d.ts +4 -0
  74. package/dist/api/drawing tools/lines menu/horizontal.d.ts.map +1 -0
  75. package/dist/api/drawing tools/lines menu/horizontal.js +19 -0
  76. package/dist/api/drawing tools/lines menu/horizontal.js.map +1 -0
  77. package/dist/api/drawing tools/lines menu/horizontalRay.d.ts +4 -0
  78. package/dist/api/drawing tools/lines menu/horizontalRay.d.ts.map +1 -0
  79. package/dist/api/drawing tools/lines menu/horizontalRay.js +20 -0
  80. package/dist/api/drawing tools/lines menu/horizontalRay.js.map +1 -0
  81. package/dist/api/drawing tools/lines menu/infoLine.d.ts +4 -0
  82. package/dist/api/drawing tools/lines menu/infoLine.d.ts.map +1 -0
  83. package/dist/api/drawing tools/lines menu/infoLine.js +107 -0
  84. package/dist/api/drawing tools/lines menu/infoLine.js.map +1 -0
  85. package/dist/api/drawing tools/lines menu/insidePitchfork.d.ts +4 -0
  86. package/dist/api/drawing tools/lines menu/insidePitchfork.d.ts.map +1 -0
  87. package/dist/api/drawing tools/lines menu/insidePitchfork.js +31 -0
  88. package/dist/api/drawing tools/lines menu/insidePitchfork.js.map +1 -0
  89. package/dist/api/drawing tools/lines menu/modifiedSchiffPitchfork.d.ts +4 -0
  90. package/dist/api/drawing tools/lines menu/modifiedSchiffPitchfork.d.ts.map +1 -0
  91. package/dist/api/drawing tools/lines menu/modifiedSchiffPitchfork.js +15 -0
  92. package/dist/api/drawing tools/lines menu/modifiedSchiffPitchfork.js.map +1 -0
  93. package/dist/api/drawing tools/lines menu/parallelChannel.d.ts +4 -0
  94. package/dist/api/drawing tools/lines menu/parallelChannel.d.ts.map +1 -0
  95. package/dist/api/drawing tools/lines menu/parallelChannel.js +43 -0
  96. package/dist/api/drawing tools/lines menu/parallelChannel.js.map +1 -0
  97. package/dist/api/drawing tools/lines menu/pitchfork.d.ts +4 -0
  98. package/dist/api/drawing tools/lines menu/pitchfork.d.ts.map +1 -0
  99. package/dist/api/drawing tools/lines menu/pitchfork.js +12 -0
  100. package/dist/api/drawing tools/lines menu/pitchfork.js.map +1 -0
  101. package/dist/api/drawing tools/lines menu/ray.d.ts +4 -0
  102. package/dist/api/drawing tools/lines menu/ray.d.ts.map +1 -0
  103. package/dist/api/drawing tools/lines menu/ray.js +23 -0
  104. package/dist/api/drawing tools/lines menu/ray.js.map +1 -0
  105. package/dist/api/drawing tools/lines menu/regressionTrend.d.ts +4 -0
  106. package/dist/api/drawing tools/lines menu/regressionTrend.d.ts.map +1 -0
  107. package/dist/api/drawing tools/lines menu/regressionTrend.js +127 -0
  108. package/dist/api/drawing tools/lines menu/regressionTrend.js.map +1 -0
  109. package/dist/api/drawing tools/lines menu/schiffPitchfork.d.ts +4 -0
  110. package/dist/api/drawing tools/lines menu/schiffPitchfork.d.ts.map +1 -0
  111. package/dist/api/drawing tools/lines menu/schiffPitchfork.js +15 -0
  112. package/dist/api/drawing tools/lines menu/schiffPitchfork.js.map +1 -0
  113. package/dist/api/drawing tools/lines menu/trendAngle.d.ts +4 -0
  114. package/dist/api/drawing tools/lines menu/trendAngle.d.ts.map +1 -0
  115. package/dist/api/drawing tools/lines menu/trendAngle.js +51 -0
  116. package/dist/api/drawing tools/lines menu/trendAngle.js.map +1 -0
  117. package/dist/api/drawing tools/lines menu/trendline.d.ts +4 -0
  118. package/dist/api/drawing tools/lines menu/trendline.d.ts.map +1 -0
  119. package/dist/api/drawing tools/lines menu/trendline.js +11 -0
  120. package/dist/api/drawing tools/lines menu/trendline.js.map +1 -0
  121. package/dist/api/drawing tools/lines menu/vertical.d.ts +4 -0
  122. package/dist/api/drawing tools/lines menu/vertical.d.ts.map +1 -0
  123. package/dist/api/drawing tools/lines menu/vertical.js +11 -0
  124. package/dist/api/drawing tools/lines menu/vertical.js.map +1 -0
  125. package/dist/api/drawing tools/pointers menu/crosshair.d.ts +16 -0
  126. package/dist/api/drawing tools/pointers menu/crosshair.d.ts.map +1 -0
  127. package/{src/api/drawing tools/pointers menu/crosshair.ts → dist/api/drawing tools/pointers menu/crosshair.js } +6 -7
  128. package/dist/api/drawing tools/pointers menu/crosshair.js.map +1 -0
  129. package/dist/api/drawing tools/pointers menu/cursor.d.ts +15 -0
  130. package/dist/api/drawing tools/pointers menu/cursor.d.ts.map +1 -0
  131. package/{src/api/drawing tools/pointers menu/cursor.ts → dist/api/drawing tools/pointers menu/cursor.js } +7 -8
  132. package/dist/api/drawing tools/pointers menu/cursor.js.map +1 -0
  133. package/dist/api/drawing tools/pointers menu/demonstration.d.ts +30 -0
  134. package/dist/api/drawing tools/pointers menu/demonstration.d.ts.map +1 -0
  135. package/{src/api/drawing tools/pointers menu/demonstration.ts → dist/api/drawing tools/pointers menu/demonstration.js } +9 -14
  136. package/dist/api/drawing tools/pointers menu/demonstration.js.map +1 -0
  137. package/dist/api/drawing tools/pointers menu/dot.d.ts +23 -0
  138. package/dist/api/drawing tools/pointers menu/dot.d.ts.map +1 -0
  139. package/{src/api/drawing tools/pointers menu/dot.ts → dist/api/drawing tools/pointers menu/dot.js } +8 -11
  140. package/dist/api/drawing tools/pointers menu/dot.js.map +1 -0
  141. package/dist/api/drawing tools/shapes menu/rectangle.d.ts +4 -0
  142. package/dist/api/drawing tools/shapes menu/rectangle.d.ts.map +1 -0
  143. package/dist/api/drawing tools/shapes menu/rectangle.js +19 -0
  144. package/dist/api/drawing tools/shapes menu/rectangle.js.map +1 -0
  145. package/dist/api/drawing tools/shapes menu/text.d.ts +4 -0
  146. package/dist/api/drawing tools/shapes menu/text.d.ts.map +1 -0
  147. package/dist/api/drawing tools/shapes menu/text.js +25 -0
  148. package/dist/api/drawing tools/shapes menu/text.js.map +1 -0
  149. package/dist/api/drawingUtils.d.ts +22 -0
  150. package/dist/api/drawingUtils.d.ts.map +1 -0
  151. package/dist/api/drawingUtils.js +83 -0
  152. package/dist/api/drawingUtils.js.map +1 -0
  153. package/dist/core/CanvasLayer.d.ts +26 -0
  154. package/dist/core/CanvasLayer.d.ts.map +1 -0
  155. package/dist/core/CanvasLayer.js +56 -0
  156. package/dist/core/CanvasLayer.js.map +1 -0
  157. package/dist/core/Chart.d.ts +164 -0
  158. package/dist/core/Chart.d.ts.map +1 -0
  159. package/dist/core/Chart.js +839 -0
  160. package/dist/core/Chart.js.map +1 -0
  161. package/dist/core/CoordTransform.d.ts +168 -0
  162. package/dist/core/CoordTransform.d.ts.map +1 -0
  163. package/dist/core/CoordTransform.js +224 -0
  164. package/dist/core/CoordTransform.js.map +1 -0
  165. package/dist/core/Crosshair.d.ts +30 -0
  166. package/dist/core/Crosshair.d.ts.map +1 -0
  167. package/dist/core/Crosshair.js +186 -0
  168. package/dist/core/Crosshair.js.map +1 -0
  169. package/dist/core/IndicatorEngine.d.ts +51 -0
  170. package/dist/core/IndicatorEngine.d.ts.map +1 -0
  171. package/dist/core/IndicatorEngine.js +181 -0
  172. package/dist/core/IndicatorEngine.js.map +1 -0
  173. package/dist/core/InteractionManager.d.ts +197 -0
  174. package/dist/core/InteractionManager.d.ts.map +1 -0
  175. package/dist/core/InteractionManager.js +698 -0
  176. package/dist/core/InteractionManager.js.map +1 -0
  177. package/dist/core/PriceScale.d.ts +27 -0
  178. package/dist/core/PriceScale.d.ts.map +1 -0
  179. package/dist/core/PriceScale.js +113 -0
  180. package/dist/core/PriceScale.js.map +1 -0
  181. package/dist/core/Series.d.ts +40 -0
  182. package/dist/core/Series.d.ts.map +1 -0
  183. package/dist/core/Series.js +114 -0
  184. package/dist/core/Series.js.map +1 -0
  185. package/dist/core/TimeScale.d.ts +43 -0
  186. package/dist/core/TimeScale.d.ts.map +1 -0
  187. package/dist/core/TimeScale.js +150 -0
  188. package/dist/core/TimeScale.js.map +1 -0
  189. package/dist/datafeed/DatafeedConnector.d.ts +89 -0
  190. package/dist/datafeed/DatafeedConnector.d.ts.map +1 -0
  191. package/dist/datafeed/DatafeedConnector.js +268 -0
  192. package/dist/datafeed/DatafeedConnector.js.map +1 -0
  193. package/dist/engine/CandleEngine.d.ts +207 -0
  194. package/dist/engine/CandleEngine.d.ts.map +1 -0
  195. package/dist/engine/CandleEngine.js +318 -0
  196. package/dist/engine/CandleEngine.js.map +1 -0
  197. package/dist/engine/__tests__/CandleEngine.test.d.ts +2 -0
  198. package/dist/engine/__tests__/CandleEngine.test.d.ts.map +1 -0
  199. package/dist/engine/__tests__/CandleEngine.test.js +300 -0
  200. package/dist/engine/__tests__/CandleEngine.test.js.map +1 -0
  201. package/dist/engine/candleInvariants.d.ts +66 -0
  202. package/dist/engine/candleInvariants.d.ts.map +1 -0
  203. package/dist/engine/candleInvariants.js +134 -0
  204. package/dist/engine/candleInvariants.js.map +1 -0
  205. package/{src/engine/mergeUtils.ts → dist/engine/mergeUtils.d.ts} +15 -52
  206. package/dist/engine/mergeUtils.d.ts.map +1 -0
  207. package/dist/engine/mergeUtils.js +64 -0
  208. package/dist/engine/mergeUtils.js.map +1 -0
  209. package/dist/engine/timeframeUtils.d.ts +80 -0
  210. package/dist/engine/timeframeUtils.d.ts.map +1 -0
  211. package/{src/engine/timeframeUtils.ts → dist/engine/timeframeUtils.js} +30 -48
  212. package/dist/engine/timeframeUtils.js.map +1 -0
  213. package/dist/index.d.ts +40 -0
  214. package/dist/index.d.ts.map +1 -0
  215. package/dist/index.js +49 -0
  216. package/dist/index.js.map +1 -0
  217. package/dist/internal.d.ts +29 -0
  218. package/dist/internal.d.ts.map +1 -0
  219. package/{src/internal.ts → dist/internal.js} +2 -11
  220. package/dist/internal.js.map +1 -0
  221. package/dist/licensing/ChartRuntimeResolver.d.ts +233 -0
  222. package/dist/licensing/ChartRuntimeResolver.d.ts.map +1 -0
  223. package/dist/licensing/ChartRuntimeResolver.js +310 -0
  224. package/dist/licensing/ChartRuntimeResolver.js.map +1 -0
  225. package/dist/licensing/LicenseManager.d.ts +55 -0
  226. package/dist/licensing/LicenseManager.d.ts.map +1 -0
  227. package/dist/licensing/LicenseManager.js +114 -0
  228. package/dist/licensing/LicenseManager.js.map +1 -0
  229. package/dist/licensing/__tests__/ChartRuntimeResolver.test.d.ts +13 -0
  230. package/dist/licensing/__tests__/ChartRuntimeResolver.test.d.ts.map +1 -0
  231. package/dist/licensing/__tests__/ChartRuntimeResolver.test.js +177 -0
  232. package/dist/licensing/__tests__/ChartRuntimeResolver.test.js.map +1 -0
  233. package/dist/licensing/__tests__/LicenseManager.test.d.ts +12 -0
  234. package/dist/licensing/__tests__/LicenseManager.test.d.ts.map +1 -0
  235. package/dist/licensing/__tests__/LicenseManager.test.js +153 -0
  236. package/dist/licensing/__tests__/LicenseManager.test.js.map +1 -0
  237. package/dist/licensing/licenseTypes.d.ts +18 -0
  238. package/dist/licensing/licenseTypes.d.ts.map +1 -0
  239. package/dist/licensing/licenseTypes.js +2 -0
  240. package/dist/licensing/licenseTypes.js.map +1 -0
  241. package/dist/pine/PineCompiler.d.ts +35 -0
  242. package/dist/pine/PineCompiler.d.ts.map +1 -0
  243. package/dist/pine/PineCompiler.js +44 -0
  244. package/dist/pine/PineCompiler.js.map +1 -0
  245. package/dist/pine/diagnostics.d.ts +20 -0
  246. package/dist/pine/diagnostics.d.ts.map +1 -0
  247. package/dist/pine/diagnostics.js +11 -0
  248. package/dist/pine/diagnostics.js.map +1 -0
  249. package/{src/pine/index.ts → dist/pine/index.d.ts} +4 -3
  250. package/dist/pine/index.d.ts.map +1 -0
  251. package/dist/pine/index.js +5 -0
  252. package/dist/pine/index.js.map +1 -0
  253. package/dist/pine/pine-ast.d.ts +142 -0
  254. package/dist/pine/pine-ast.d.ts.map +1 -0
  255. package/dist/pine/pine-ast.js +19 -0
  256. package/dist/pine/pine-ast.js.map +1 -0
  257. package/dist/pine/pine-lexer.d.ts +41 -0
  258. package/dist/pine/pine-lexer.d.ts.map +1 -0
  259. package/dist/pine/pine-lexer.js +249 -0
  260. package/dist/pine/pine-lexer.js.map +1 -0
  261. package/dist/pine/pine-parser.d.ts +51 -0
  262. package/dist/pine/pine-parser.d.ts.map +1 -0
  263. package/dist/pine/pine-parser.js +416 -0
  264. package/dist/pine/pine-parser.js.map +1 -0
  265. package/dist/pine/pine-transpiler.d.ts +33 -0
  266. package/dist/pine/pine-transpiler.d.ts.map +1 -0
  267. package/dist/pine/pine-transpiler.js +260 -0
  268. package/dist/pine/pine-transpiler.js.map +1 -0
  269. package/dist/pixi/LayerName.d.ts +18 -0
  270. package/dist/pixi/LayerName.d.ts.map +1 -0
  271. package/dist/pixi/LayerName.js +35 -0
  272. package/dist/pixi/LayerName.js.map +1 -0
  273. package/dist/pixi/PixiCandlestickRenderer.d.ts +23 -0
  274. package/dist/pixi/PixiCandlestickRenderer.d.ts.map +1 -0
  275. package/dist/pixi/PixiCandlestickRenderer.js +107 -0
  276. package/dist/pixi/PixiCandlestickRenderer.js.map +1 -0
  277. package/dist/pixi/PixiChart.d.ts +72 -0
  278. package/dist/pixi/PixiChart.d.ts.map +1 -0
  279. package/dist/pixi/PixiChart.js +367 -0
  280. package/dist/pixi/PixiChart.js.map +1 -0
  281. package/dist/pixi/PixiCrosshairRenderer.d.ts +29 -0
  282. package/dist/pixi/PixiCrosshairRenderer.d.ts.map +1 -0
  283. package/dist/pixi/PixiCrosshairRenderer.js +110 -0
  284. package/dist/pixi/PixiCrosshairRenderer.js.map +1 -0
  285. package/dist/pixi/PixiDrawingRenderer.d.ts +17 -0
  286. package/dist/pixi/PixiDrawingRenderer.d.ts.map +1 -0
  287. package/dist/pixi/PixiDrawingRenderer.js +111 -0
  288. package/dist/pixi/PixiDrawingRenderer.js.map +1 -0
  289. package/dist/pixi/PixiGridRenderer.d.ts +22 -0
  290. package/dist/pixi/PixiGridRenderer.d.ts.map +1 -0
  291. package/dist/pixi/PixiGridRenderer.js +114 -0
  292. package/dist/pixi/PixiGridRenderer.js.map +1 -0
  293. package/dist/pixi/PixiLayerManager.d.ts +56 -0
  294. package/dist/pixi/PixiLayerManager.d.ts.map +1 -0
  295. package/dist/pixi/PixiLayerManager.js +92 -0
  296. package/dist/pixi/PixiLayerManager.js.map +1 -0
  297. package/dist/react/canvas/ChartCanvas.d.ts +85 -0
  298. package/dist/react/canvas/ChartCanvas.d.ts.map +1 -0
  299. package/dist/react/canvas/ChartCanvas.js +604 -0
  300. package/dist/react/canvas/ChartCanvas.js.map +1 -0
  301. package/dist/react/canvas/ChartContextMenu.d.ts +18 -0
  302. package/dist/react/canvas/ChartContextMenu.d.ts.map +1 -0
  303. package/dist/react/canvas/ChartContextMenu.js +5 -0
  304. package/dist/react/canvas/ChartContextMenu.js.map +1 -0
  305. package/dist/react/canvas/ChartSettingsDialog.d.ts +25 -0
  306. package/dist/react/canvas/ChartSettingsDialog.d.ts.map +1 -0
  307. package/dist/react/canvas/ChartSettingsDialog.js +28 -0
  308. package/dist/react/canvas/ChartSettingsDialog.js.map +1 -0
  309. package/dist/react/canvas/IndicatorLabel.d.ts +21 -0
  310. package/dist/react/canvas/IndicatorLabel.d.ts.map +1 -0
  311. package/dist/react/canvas/IndicatorLabel.js +196 -0
  312. package/dist/react/canvas/IndicatorLabel.js.map +1 -0
  313. package/dist/react/canvas/IndicatorPane.d.ts +32 -0
  314. package/dist/react/canvas/IndicatorPane.d.ts.map +1 -0
  315. package/dist/react/canvas/IndicatorPane.js +395 -0
  316. package/dist/react/canvas/IndicatorPane.js.map +1 -0
  317. package/dist/react/canvas/PointerOverlay.d.ts +23 -0
  318. package/dist/react/canvas/PointerOverlay.d.ts.map +1 -0
  319. package/dist/react/canvas/PointerOverlay.js +61 -0
  320. package/dist/react/canvas/PointerOverlay.js.map +1 -0
  321. package/dist/react/canvas/toolbars/LeftToolbar.d.ts +19 -0
  322. package/dist/react/canvas/toolbars/LeftToolbar.d.ts.map +1 -0
  323. package/dist/react/canvas/toolbars/LeftToolbar.js +407 -0
  324. package/dist/react/canvas/toolbars/LeftToolbar.js.map +1 -0
  325. package/dist/react/hooks/useChartCapabilities.d.ts +21 -0
  326. package/dist/react/hooks/useChartCapabilities.d.ts.map +1 -0
  327. package/dist/react/hooks/useChartCapabilities.js +66 -0
  328. package/dist/react/hooks/useChartCapabilities.js.map +1 -0
  329. package/dist/react/index.d.ts +30 -0
  330. package/dist/react/index.d.ts.map +1 -0
  331. package/dist/react/index.js +28 -0
  332. package/dist/react/index.js.map +1 -0
  333. package/dist/react/internal.d.ts +38 -0
  334. package/dist/react/internal.d.ts.map +1 -0
  335. package/dist/react/internal.js +44 -0
  336. package/dist/react/internal.js.map +1 -0
  337. package/dist/react/shell/ManagedAppShell.d.ts +91 -0
  338. package/dist/react/shell/ManagedAppShell.d.ts.map +1 -0
  339. package/dist/react/shell/ManagedAppShell.js +440 -0
  340. package/dist/react/shell/ManagedAppShell.js.map +1 -0
  341. package/dist/react/trading/TradingBridge.d.ts +86 -0
  342. package/dist/react/trading/TradingBridge.d.ts.map +1 -0
  343. package/dist/react/trading/TradingBridge.js +73 -0
  344. package/dist/react/trading/TradingBridge.js.map +1 -0
  345. package/dist/react/workspace/ChartWorkspace.d.ts +73 -0
  346. package/dist/react/workspace/ChartWorkspace.d.ts.map +1 -0
  347. package/dist/react/workspace/ChartWorkspace.js +42 -0
  348. package/dist/react/workspace/ChartWorkspace.js.map +1 -0
  349. package/dist/react/workspace/FloatingPanel.d.ts +18 -0
  350. package/dist/react/workspace/FloatingPanel.d.ts.map +1 -0
  351. package/dist/react/workspace/FloatingPanel.js +82 -0
  352. package/dist/react/workspace/FloatingPanel.js.map +1 -0
  353. package/dist/react/workspace/IndicatorsDialog.d.ts +8 -0
  354. package/dist/react/workspace/IndicatorsDialog.d.ts.map +1 -0
  355. package/dist/react/workspace/IndicatorsDialog.js +121 -0
  356. package/dist/react/workspace/IndicatorsDialog.js.map +1 -0
  357. package/dist/react/workspace/LayoutMenu.d.ts +33 -0
  358. package/dist/react/workspace/LayoutMenu.d.ts.map +1 -0
  359. package/dist/react/workspace/LayoutMenu.js +113 -0
  360. package/dist/react/workspace/LayoutMenu.js.map +1 -0
  361. package/dist/react/workspace/SymbolSearchDialog.d.ts +10 -0
  362. package/dist/react/workspace/SymbolSearchDialog.d.ts.map +1 -0
  363. package/dist/react/workspace/SymbolSearchDialog.js +245 -0
  364. package/dist/react/workspace/SymbolSearchDialog.js.map +1 -0
  365. package/dist/react/workspace/TabBar.d.ts +17 -0
  366. package/dist/react/workspace/TabBar.d.ts.map +1 -0
  367. package/dist/react/workspace/TabBar.js +29 -0
  368. package/dist/react/workspace/TabBar.js.map +1 -0
  369. package/dist/react/workspace/toolbars/BottomToolbar.d.ts +19 -0
  370. package/dist/react/workspace/toolbars/BottomToolbar.d.ts.map +1 -0
  371. package/dist/react/workspace/toolbars/BottomToolbar.js +236 -0
  372. package/dist/react/workspace/toolbars/BottomToolbar.js.map +1 -0
  373. package/dist/react/workspace/toolbars/RightToolbar.d.ts +8 -0
  374. package/dist/react/workspace/toolbars/RightToolbar.d.ts.map +1 -0
  375. package/dist/react/workspace/toolbars/RightToolbar.js +18 -0
  376. package/dist/react/workspace/toolbars/RightToolbar.js.map +1 -0
  377. package/dist/react/workspace/toolbars/TopToolbar.d.ts +41 -0
  378. package/dist/react/workspace/toolbars/TopToolbar.d.ts.map +1 -0
  379. package/dist/react/workspace/toolbars/TopToolbar.js +82 -0
  380. package/dist/react/workspace/toolbars/TopToolbar.js.map +1 -0
  381. package/dist/renderers/CandlestickRenderer.d.ts +13 -0
  382. package/dist/renderers/CandlestickRenderer.d.ts.map +1 -0
  383. package/dist/renderers/CandlestickRenderer.js +98 -0
  384. package/dist/renderers/CandlestickRenderer.js.map +1 -0
  385. package/dist/renderers/HistogramRenderer.d.ts +11 -0
  386. package/dist/renderers/HistogramRenderer.d.ts.map +1 -0
  387. package/dist/renderers/HistogramRenderer.js +50 -0
  388. package/dist/renderers/HistogramRenderer.js.map +1 -0
  389. package/dist/renderers/LineRenderer.d.ts +12 -0
  390. package/dist/renderers/LineRenderer.d.ts.map +1 -0
  391. package/dist/renderers/LineRenderer.js +64 -0
  392. package/dist/renderers/LineRenderer.js.map +1 -0
  393. package/dist/theme/colors.d.ts +4 -0
  394. package/dist/theme/colors.d.ts.map +1 -0
  395. package/dist/theme/colors.js +19 -0
  396. package/dist/theme/colors.js.map +1 -0
  397. package/dist/tools/barDivergenceCheck.d.ts +120 -0
  398. package/dist/tools/barDivergenceCheck.d.ts.map +1 -0
  399. package/dist/tools/barDivergenceCheck.js +200 -0
  400. package/dist/tools/barDivergenceCheck.js.map +1 -0
  401. package/dist/trading/TradingOverlayStore.d.ts +86 -0
  402. package/dist/trading/TradingOverlayStore.d.ts.map +1 -0
  403. package/dist/trading/TradingOverlayStore.js +139 -0
  404. package/dist/trading/TradingOverlayStore.js.map +1 -0
  405. package/dist/trading/UnmanagedIngestion.d.ts +91 -0
  406. package/dist/trading/UnmanagedIngestion.d.ts.map +1 -0
  407. package/dist/trading/UnmanagedIngestion.js +114 -0
  408. package/dist/trading/UnmanagedIngestion.js.map +1 -0
  409. package/dist/trading/__tests__/ManagedTradingController.test.d.ts +18 -0
  410. package/dist/trading/__tests__/ManagedTradingController.test.d.ts.map +1 -0
  411. package/dist/trading/__tests__/ManagedTradingController.test.js +271 -0
  412. package/dist/trading/__tests__/ManagedTradingController.test.js.map +1 -0
  413. package/dist/trading/__tests__/TradingOverlayStore.test.d.ts +16 -0
  414. package/dist/trading/__tests__/TradingOverlayStore.test.d.ts.map +1 -0
  415. package/dist/trading/__tests__/TradingOverlayStore.test.js +267 -0
  416. package/dist/trading/__tests__/TradingOverlayStore.test.js.map +1 -0
  417. package/dist/trading/__tests__/UnmanagedIngestion.test.d.ts +16 -0
  418. package/dist/trading/__tests__/UnmanagedIngestion.test.d.ts.map +1 -0
  419. package/dist/trading/__tests__/UnmanagedIngestion.test.js +170 -0
  420. package/dist/trading/__tests__/UnmanagedIngestion.test.js.map +1 -0
  421. package/dist/trading/managed/ManagedTradingController.d.ts +110 -0
  422. package/dist/trading/managed/ManagedTradingController.d.ts.map +1 -0
  423. package/dist/trading/managed/ManagedTradingController.js +247 -0
  424. package/dist/trading/managed/ManagedTradingController.js.map +1 -0
  425. package/dist/trading/managed/managedCapabilities.d.ts +45 -0
  426. package/dist/trading/managed/managedCapabilities.d.ts.map +1 -0
  427. package/dist/trading/managed/managedCapabilities.js +79 -0
  428. package/dist/trading/managed/managedCapabilities.js.map +1 -0
  429. package/dist/trading/managed/managedTypes.d.ts +122 -0
  430. package/dist/trading/managed/managedTypes.d.ts.map +1 -0
  431. package/dist/trading/managed/managedTypes.js +13 -0
  432. package/dist/trading/managed/managedTypes.js.map +1 -0
  433. package/dist/trading/tradingTypes.d.ts +89 -0
  434. package/dist/trading/tradingTypes.d.ts.map +1 -0
  435. package/dist/trading/tradingTypes.js +8 -0
  436. package/dist/trading/tradingTypes.js.map +1 -0
  437. package/dist/tscript/TScriptIndicator.d.ts +41 -0
  438. package/dist/tscript/TScriptIndicator.d.ts.map +1 -0
  439. package/dist/tscript/TScriptIndicator.js +47 -0
  440. package/dist/tscript/TScriptIndicator.js.map +1 -0
  441. package/dist/tscript/ast.d.ts +89 -0
  442. package/dist/tscript/ast.d.ts.map +1 -0
  443. package/dist/tscript/ast.js +22 -0
  444. package/dist/tscript/ast.js.map +1 -0
  445. package/dist/tscript/lexer.d.ts +36 -0
  446. package/dist/tscript/lexer.d.ts.map +1 -0
  447. package/dist/tscript/lexer.js +187 -0
  448. package/dist/tscript/lexer.js.map +1 -0
  449. package/dist/tscript/parser.d.ts +50 -0
  450. package/dist/tscript/parser.d.ts.map +1 -0
  451. package/dist/tscript/parser.js +318 -0
  452. package/dist/tscript/parser.js.map +1 -0
  453. package/dist/tscript/runtime.d.ts +123 -0
  454. package/dist/tscript/runtime.d.ts.map +1 -0
  455. package/dist/tscript/runtime.js +475 -0
  456. package/dist/tscript/runtime.js.map +1 -0
  457. package/dist/tscript/series.d.ts +49 -0
  458. package/dist/tscript/series.d.ts.map +1 -0
  459. package/dist/tscript/series.js +79 -0
  460. package/dist/tscript/series.js.map +1 -0
  461. package/dist/types/IChart.d.ts +48 -0
  462. package/dist/types/IChart.d.ts.map +1 -0
  463. package/dist/types/IChart.js +2 -0
  464. package/dist/types/IChart.js.map +1 -0
  465. package/{src/types/IRenderer.ts → dist/types/IRenderer.d.ts} +2 -8
  466. package/dist/types/IRenderer.d.ts.map +1 -0
  467. package/dist/types/IRenderer.js +2 -0
  468. package/dist/types/IRenderer.js.map +1 -0
  469. package/dist/types/ISeries.d.ts +26 -0
  470. package/dist/types/ISeries.d.ts.map +1 -0
  471. package/dist/types/ISeries.js +2 -0
  472. package/dist/types/ISeries.js.map +1 -0
  473. package/package.json +32 -4
  474. package/src/__tests__/backwardCompatibility.test.ts +0 -191
  475. package/src/__tests__/candleInvariant.test.ts +0 -500
  476. package/src/__tests__/timeframeBoundary.test.ts +0 -583
  477. package/src/api/DrawingManager.ts +0 -188
  478. package/src/api/EventBus.ts +0 -53
  479. package/src/api/IndicatorDAG.ts +0 -389
  480. package/src/api/IndicatorRegistry.ts +0 -47
  481. package/src/api/LayoutManager.ts +0 -72
  482. package/src/api/PaneManager.ts +0 -129
  483. package/src/api/ReferenceAPI.ts +0 -195
  484. package/src/api/TChart.ts +0 -881
  485. package/src/api/drawing tools/fib gann menu/fibRetracement.ts +0 -27
  486. package/src/api/drawing tools/lines menu/crossLine.ts +0 -21
  487. package/src/api/drawing tools/lines menu/disjointChannel.ts +0 -74
  488. package/src/api/drawing tools/lines menu/extendedLine.ts +0 -22
  489. package/src/api/drawing tools/lines menu/flatTopBottom.ts +0 -45
  490. package/src/api/drawing tools/lines menu/horizontal.ts +0 -24
  491. package/src/api/drawing tools/lines menu/horizontalRay.ts +0 -25
  492. package/src/api/drawing tools/lines menu/infoLine.ts +0 -127
  493. package/src/api/drawing tools/lines menu/insidePitchfork.ts +0 -21
  494. package/src/api/drawing tools/lines menu/modifiedSchiffPitchfork.ts +0 -18
  495. package/src/api/drawing tools/lines menu/parallelChannel.ts +0 -47
  496. package/src/api/drawing tools/lines menu/pitchfork.ts +0 -15
  497. package/src/api/drawing tools/lines menu/ray.ts +0 -28
  498. package/src/api/drawing tools/lines menu/regressionTrend.ts +0 -157
  499. package/src/api/drawing tools/lines menu/schiffPitchfork.ts +0 -18
  500. package/src/api/drawing tools/lines menu/trendAngle.ts +0 -64
  501. package/src/api/drawing tools/lines menu/trendline.ts +0 -16
  502. package/src/api/drawing tools/lines menu/vertical.ts +0 -16
  503. package/src/api/drawing tools/shapes menu/rectangle.ts +0 -24
  504. package/src/api/drawing tools/shapes menu/text.ts +0 -30
  505. package/src/api/drawingUtils.ts +0 -82
  506. package/src/core/CanvasLayer.ts +0 -77
  507. package/src/core/Chart.ts +0 -917
  508. package/src/core/CoordTransform.ts +0 -282
  509. package/src/core/Crosshair.ts +0 -207
  510. package/src/core/IndicatorEngine.ts +0 -216
  511. package/src/core/InteractionManager.ts +0 -899
  512. package/src/core/PriceScale.ts +0 -133
  513. package/src/core/Series.ts +0 -132
  514. package/src/core/TimeScale.ts +0 -175
  515. package/src/datafeed/DatafeedConnector.ts +0 -300
  516. package/src/engine/CandleEngine.ts +0 -458
  517. package/src/engine/__tests__/CandleEngine.test.ts +0 -402
  518. package/src/engine/candleInvariants.ts +0 -172
  519. package/src/index.ts +0 -190
  520. package/src/licensing/ChartRuntimeResolver.ts +0 -380
  521. package/src/licensing/LicenseManager.ts +0 -131
  522. package/src/licensing/__tests__/ChartRuntimeResolver.test.ts +0 -207
  523. package/src/licensing/__tests__/LicenseManager.test.ts +0 -180
  524. package/src/licensing/licenseTypes.ts +0 -19
  525. package/src/pine/PineCompiler.ts +0 -68
  526. package/src/pine/diagnostics.ts +0 -30
  527. package/src/pine/pine-ast.ts +0 -163
  528. package/src/pine/pine-lexer.ts +0 -265
  529. package/src/pine/pine-parser.ts +0 -439
  530. package/src/pine/pine-transpiler.ts +0 -301
  531. package/src/pixi/LayerName.ts +0 -35
  532. package/src/pixi/PixiCandlestickRenderer.ts +0 -125
  533. package/src/pixi/PixiChart.ts +0 -425
  534. package/src/pixi/PixiCrosshairRenderer.ts +0 -134
  535. package/src/pixi/PixiDrawingRenderer.ts +0 -121
  536. package/src/pixi/PixiGridRenderer.ts +0 -136
  537. package/src/pixi/PixiLayerManager.ts +0 -102
  538. package/src/renderers/CandlestickRenderer.ts +0 -130
  539. package/src/renderers/HistogramRenderer.ts +0 -63
  540. package/src/renderers/LineRenderer.ts +0 -77
  541. package/src/theme/colors.ts +0 -21
  542. package/src/tools/barDivergenceCheck.ts +0 -305
  543. package/src/trading/TradingOverlayStore.ts +0 -161
  544. package/src/trading/UnmanagedIngestion.ts +0 -156
  545. package/src/trading/__tests__/ManagedTradingController.test.ts +0 -338
  546. package/src/trading/__tests__/TradingOverlayStore.test.ts +0 -323
  547. package/src/trading/__tests__/UnmanagedIngestion.test.ts +0 -205
  548. package/src/trading/managed/ManagedTradingController.ts +0 -292
  549. package/src/trading/managed/managedCapabilities.ts +0 -98
  550. package/src/trading/managed/managedTypes.ts +0 -151
  551. package/src/trading/tradingTypes.ts +0 -135
  552. package/src/tscript/TScriptIndicator.ts +0 -54
  553. package/src/tscript/ast.ts +0 -105
  554. package/src/tscript/lexer.ts +0 -190
  555. package/src/tscript/parser.ts +0 -334
  556. package/src/tscript/runtime.ts +0 -525
  557. package/src/tscript/series.ts +0 -84
  558. package/src/types/IChart.ts +0 -56
  559. package/src/types/ISeries.ts +0 -30
  560. package/tsconfig.json +0 -22
  561. package/tsup.config.ts +0 -15
  562. package/vitest.config.ts +0 -25
@@ -0,0 +1,89 @@
1
+ import type { IDatafeed, OHLCV, Timeframe } from '@forgecharts/types';
2
+ import type { ISeries } from '../types/ISeries';
3
+ /**
4
+ * Lifecycle callbacks injected by TChart so it can relay data-load state
5
+ * as EventBus events without coupling DatafeedConnector to the bus.
6
+ */
7
+ export type ConnectorCallbacks = {
8
+ onLoading(symbol: string, interval: Timeframe): void;
9
+ onLoaded(symbol: string, interval: Timeframe, count: number): void;
10
+ onError(symbol: string, interval: Timeframe, error: string): void;
11
+ /** Called on every real-time tick after the series is updated. Optional. */
12
+ onUpdate?: (bar: OHLCV) => void;
13
+ };
14
+ /**
15
+ * DatafeedConnector wires an {@link IDatafeed} to an {@link ISeries}.
16
+ *
17
+ * Responsibilities:
18
+ * - Generates stable, unique subscriber UIDs (`forgecharts-<symbol>-<tf>-<n>`).
19
+ * - Calls `getHistoricalBars` and pushes the result into `series.setData()`.
20
+ * - Calls `subscribeBars` so real-time ticks flow into `series.update()`.
21
+ * - Guards against stale async responses after a reconnect or destroy.
22
+ * - Tears down the active subscription cleanly on `disconnect()` / `destroy()`.
23
+ *
24
+ * @example
25
+ * ```ts
26
+ * const connector = new DatafeedConnector(datafeed, series, {
27
+ * onLoading: (s, tf) => console.log('loading', s, tf),
28
+ * onLoaded: (s, tf, n) => console.log('loaded', n, 'bars'),
29
+ * onError: (s, tf, e) => console.error(e),
30
+ * });
31
+ *
32
+ * connector.connect('BTCUSDT', '1h');
33
+ * // ...later, on symbol change:
34
+ * connector.reconnect('ETHUSDT', '1h');
35
+ * // ...on unmount:
36
+ * connector.destroy();
37
+ * ```
38
+ */
39
+ export declare class DatafeedConnector {
40
+ private readonly _datafeed;
41
+ private readonly _series;
42
+ private readonly _cb;
43
+ /**
44
+ * UID of the outstanding subscription.
45
+ * `null` means nothing is subscribed / all responses for older UIDs are stale.
46
+ */
47
+ private _activeUID;
48
+ private _activeEngine;
49
+ private _destroyed;
50
+ /** True while an async `loadMoreHistory()` request is in-flight. */
51
+ private _isLoadingMore;
52
+ /** True once the datafeed returned 0 bars for a backwards page — no point fetching older. */
53
+ private _noMoreHistory;
54
+ constructor(datafeed: IDatafeed, series: ISeries, callbacks: ConnectorCallbacks);
55
+ /**
56
+ * Loads historical bars then subscribes for real-time updates.
57
+ * Safe to call while a previous subscription is still active — it will be
58
+ * cancelled first (same as calling `disconnect()` then `connect()`).
59
+ */
60
+ connect(symbol: string, timeframe: Timeframe): void;
61
+ /**
62
+ * Cancels the active subscription without starting a new one.
63
+ * Historical-bar `Promise` results arriving after this call are silently
64
+ * discarded via the UID guard.
65
+ */
66
+ disconnect(): void;
67
+ /**
68
+ * Convenience shorthand: `disconnect()` then `connect()`.
69
+ * Use this for symbol or timeframe changes.
70
+ */
71
+ reconnect(symbol: string, timeframe: Timeframe): void;
72
+ /**
73
+ * Permanently deactivates the connector.
74
+ * Any subscription or in-flight request is cancelled; subsequent calls to
75
+ * `connect()` / `reconnect()` are no-ops.
76
+ */
77
+ destroy(): void;
78
+ /**
79
+ * Fetches a page of older history (up to ~500 candles) and prepends it to
80
+ * the loaded dataset. Safe to call on every pan event — it is internally
81
+ * debounced by the `_isLoadingMore` flag and stops permanently once the
82
+ * datafeed signals no more history (`_noMoreHistory = true`).
83
+ *
84
+ * The series is updated automatically via the engine's `onResync` callback.
85
+ */
86
+ loadMoreHistory(symbol: string, timeframe: Timeframe): void;
87
+ private _cancelActive;
88
+ }
89
+ //# sourceMappingURL=DatafeedConnector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DatafeedConnector.d.ts","sourceRoot":"","sources":["../../src/datafeed/DatafeedConnector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACtE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAoEhD;;;GAGG;AACH,MAAM,MAAM,kBAAkB,GAAG;IAC/B,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,GAAG,IAAI,CAAC;IACrD,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACnE,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAClE,4EAA4E;IAC5E,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,KAAK,KAAK,IAAI,CAAC;CACjC,CAAC;AAIF;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAY;IACtC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAU;IAClC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAqB;IAEzC;;;OAGG;IACH,OAAO,CAAC,UAAU,CAAuB;IACzC,OAAO,CAAC,aAAa,CAA6B;IAClD,OAAO,CAAC,UAAU,CAAS;IAE3B,oEAAoE;IACpE,OAAO,CAAC,cAAc,CAAS;IAC/B,6FAA6F;IAC7F,OAAO,CAAC,cAAc,CAAS;gBAEnB,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,kBAAkB;IAQ/E;;;;OAIG;IACH,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,GAAG,IAAI;IA0EnD;;;;OAIG;IACH,UAAU,IAAI,IAAI;IAIlB;;;OAGG;IACH,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,GAAG,IAAI;IAKrD;;;;OAIG;IACH,OAAO,IAAI,IAAI;IAOf;;;;;;;OAOG;IACH,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,GAAG,IAAI;IAgC3D,OAAO,CAAC,aAAa;CAgBtB"}
@@ -0,0 +1,268 @@
1
+ import { CandleEngine } from '../engine/CandleEngine';
2
+ /** Strip engine-only fields so the value is a plain OHLCV the chart series accepts. */
3
+ function toOHLCV(bar) {
4
+ return { time: bar.time, open: bar.open, high: bar.high, low: bar.low, close: bar.close, volume: bar.volume };
5
+ }
6
+ /**
7
+ * Initial history window per timeframe — controls how much data the chart
8
+ * requests on first connect.
9
+ *
10
+ * TWO-LAYER ARCHITECTURE — these two concerns are independent:
11
+ * • CLIENT (this table): how many bars are fetched and held in memory for the
12
+ * initial view + scroll buffer. Larger = more data in the browser.
13
+ * • SERVER DB fill (bars.ts MAX_DB_SECONDS): the server always fills a full
14
+ * 12 months of 1m data (and all available daily history) into the DB cache
15
+ * in the background, regardless of the client window size. This means
16
+ * scroll-left lazy-loading hits the DB, not the upstream TV API.
17
+ *
18
+ * For sub-hour timeframes a large display window is impractical:
19
+ * 12 months of 1m = 525 600 bars — impossible to render, slow to transfer.
20
+ * For 4h and above, 12 months is a manageable bar count so we load it all
21
+ * upfront; the server will have it cached or will fill it synchronously.
22
+ */
23
+ const HISTORY_WINDOWS = {
24
+ // Sub-hour: small display window; DB fills 12 months in background for scrollback.
25
+ '1m': 3 * 24 * 3600, // 3 days → ~4 320 bars
26
+ '3m': 7 * 24 * 3600, // 7 days → ~3 360 bars
27
+ '5m': 10 * 24 * 3600, // 10 days → ~2 880 bars
28
+ '15m': 30 * 24 * 3600, // 30 days → ~2 880 bars
29
+ '30m': 60 * 24 * 3600, // 60 days → ~2 880 bars
30
+ '1h': 90 * 24 * 3600, // 90 days → ~2 160 bars
31
+ // 4h and above: 12 months — bar counts are small enough to load in full.
32
+ '2h': 365 * 86400, // 12 months → ~4 380 bars
33
+ '4h': 365 * 86400, // 12 months → ~2 190 bars
34
+ '6h': 365 * 86400, // 12 months → ~1 460 bars
35
+ '12h': 365 * 86400, // 12 months → ~730 bars
36
+ '1d': 365 * 86400, // 12 months → ~365 bars
37
+ '3d': 365 * 86400, // 12 months → ~122 bars
38
+ '1w': 365 * 86400, // 12 months → ~52 bars
39
+ '1M': 365 * 86400, // 12 months → ~12 bars
40
+ };
41
+ const DEFAULT_HISTORY_WINDOW = 90 * 24 * 3600; // 90-day fallback (~200 bars at 1h)
42
+ /**
43
+ * How many seconds of history to fetch per lazy-load page (~500 candles).
44
+ * Used by `loadMoreHistory()` when the user pans past the oldest loaded bar.
45
+ */
46
+ const PAGE_SIZES = {
47
+ '1m': 500 * 60,
48
+ '5m': 500 * 300,
49
+ '15m': 500 * 900,
50
+ '30m': 500 * 1800,
51
+ '1h': 500 * 3600,
52
+ '4h': 500 * 4 * 3600,
53
+ '1d': 500 * 86400,
54
+ '1w': 500 * 7 * 86400,
55
+ '1M': 500 * 30 * 86400,
56
+ };
57
+ const DEFAULT_PAGE_SIZE = 500 * 3600;
58
+ /** Monotonic counter so every subscriber UID is unique within the process. */
59
+ let _uidCounter = 0;
60
+ // ─── DatafeedConnector ────────────────────────────────────────────────────────
61
+ /**
62
+ * DatafeedConnector wires an {@link IDatafeed} to an {@link ISeries}.
63
+ *
64
+ * Responsibilities:
65
+ * - Generates stable, unique subscriber UIDs (`forgecharts-<symbol>-<tf>-<n>`).
66
+ * - Calls `getHistoricalBars` and pushes the result into `series.setData()`.
67
+ * - Calls `subscribeBars` so real-time ticks flow into `series.update()`.
68
+ * - Guards against stale async responses after a reconnect or destroy.
69
+ * - Tears down the active subscription cleanly on `disconnect()` / `destroy()`.
70
+ *
71
+ * @example
72
+ * ```ts
73
+ * const connector = new DatafeedConnector(datafeed, series, {
74
+ * onLoading: (s, tf) => console.log('loading', s, tf),
75
+ * onLoaded: (s, tf, n) => console.log('loaded', n, 'bars'),
76
+ * onError: (s, tf, e) => console.error(e),
77
+ * });
78
+ *
79
+ * connector.connect('BTCUSDT', '1h');
80
+ * // ...later, on symbol change:
81
+ * connector.reconnect('ETHUSDT', '1h');
82
+ * // ...on unmount:
83
+ * connector.destroy();
84
+ * ```
85
+ */
86
+ export class DatafeedConnector {
87
+ _datafeed;
88
+ _series;
89
+ _cb;
90
+ /**
91
+ * UID of the outstanding subscription.
92
+ * `null` means nothing is subscribed / all responses for older UIDs are stale.
93
+ */
94
+ _activeUID = null;
95
+ _activeEngine = null;
96
+ _destroyed = false;
97
+ /** True while an async `loadMoreHistory()` request is in-flight. */
98
+ _isLoadingMore = false;
99
+ /** True once the datafeed returned 0 bars for a backwards page — no point fetching older. */
100
+ _noMoreHistory = false;
101
+ constructor(datafeed, series, callbacks) {
102
+ this._datafeed = datafeed;
103
+ this._series = series;
104
+ this._cb = callbacks;
105
+ }
106
+ // ─── Public API ───────────────────────────────────────────────────────────────
107
+ /**
108
+ * Loads historical bars then subscribes for real-time updates.
109
+ * Safe to call while a previous subscription is still active — it will be
110
+ * cancelled first (same as calling `disconnect()` then `connect()`).
111
+ */
112
+ connect(symbol, timeframe) {
113
+ if (this._destroyed)
114
+ return;
115
+ // Cancel any in-flight request / active subscription before starting fresh
116
+ this._cancelActive();
117
+ const uid = `forgecharts-${symbol}-${timeframe}-${++_uidCounter}`;
118
+ this._activeUID = uid;
119
+ this._cb.onLoading(symbol, timeframe);
120
+ const to = Math.floor(Date.now() / 1000);
121
+ const from = to - (HISTORY_WINDOWS[timeframe] ?? DEFAULT_HISTORY_WINDOW);
122
+ // Build the engine for this subscription. Close over `uid` for stale-guard.
123
+ const engine = new CandleEngine({
124
+ // Every live tick mutates the engine's bar array and the chart series.
125
+ onBarUpdated: (bar) => {
126
+ if (this._activeUID !== uid)
127
+ return;
128
+ const ohlcv = toOHLCV(bar);
129
+ this._series.update(ohlcv);
130
+ this._cb.onUpdate?.(ohlcv);
131
+ },
132
+ // When a gap is detected, fetch the missing range from REST and backfill.
133
+ // backfillGap() will call onResync which re-syncs the full chart series.
134
+ onGapDetected: (gapInfo) => {
135
+ if (this._activeUID !== uid)
136
+ return;
137
+ const gapFrom = Math.floor(gapInfo.fromTimeMs / 1000);
138
+ const gapTo = Math.ceil(gapInfo.toTimeMs / 1000);
139
+ this._datafeed.getHistoricalBars(symbol, timeframe, gapFrom, gapTo)
140
+ .then(({ bars }) => {
141
+ if (this._activeUID !== uid)
142
+ return;
143
+ engine.backfillGap(bars);
144
+ })
145
+ .catch(() => {
146
+ // Gap backfill errors are non-fatal — chart continues with live data
147
+ });
148
+ },
149
+ // Full re-paint after gap fill or reconnect reconciliation.
150
+ onResync: (bars) => {
151
+ if (this._activeUID !== uid)
152
+ return;
153
+ this._series.setData(bars.map(toOHLCV));
154
+ },
155
+ });
156
+ this._activeEngine = engine;
157
+ this._datafeed
158
+ .getHistoricalBars(symbol, timeframe, from, to)
159
+ .then((result) => {
160
+ // Guard: another connect() / destroy() may have superseded this request
161
+ if (this._activeUID !== uid)
162
+ return;
163
+ engine.initialize(result.bars, timeframe);
164
+ this._series.setData(engine.getBars().map(toOHLCV));
165
+ this._cb.onLoaded(symbol, timeframe, engine.getBars().length);
166
+ // Double-check still active before subscribing (setData callback could
167
+ // have triggered a synchronous reconnect in pathological code)
168
+ if (this._activeUID !== uid)
169
+ return;
170
+ this._datafeed.subscribeBars(symbol, timeframe, (bar) => {
171
+ if (this._activeUID === uid) {
172
+ engine.applyLiveUpdate(bar);
173
+ }
174
+ }, uid);
175
+ })
176
+ .catch((err) => {
177
+ if (this._activeUID !== uid)
178
+ return;
179
+ const message = err instanceof Error ? err.message : String(err);
180
+ this._cb.onError(symbol, timeframe, message);
181
+ });
182
+ }
183
+ /**
184
+ * Cancels the active subscription without starting a new one.
185
+ * Historical-bar `Promise` results arriving after this call are silently
186
+ * discarded via the UID guard.
187
+ */
188
+ disconnect() {
189
+ this._cancelActive();
190
+ }
191
+ /**
192
+ * Convenience shorthand: `disconnect()` then `connect()`.
193
+ * Use this for symbol or timeframe changes.
194
+ */
195
+ reconnect(symbol, timeframe) {
196
+ this.disconnect();
197
+ this.connect(symbol, timeframe);
198
+ }
199
+ /**
200
+ * Permanently deactivates the connector.
201
+ * Any subscription or in-flight request is cancelled; subsequent calls to
202
+ * `connect()` / `reconnect()` are no-ops.
203
+ */
204
+ destroy() {
205
+ this._cancelActive();
206
+ this._destroyed = true;
207
+ }
208
+ // ─── Private ─────────────────────────────────────────────────────────────────
209
+ /**
210
+ * Fetches a page of older history (up to ~500 candles) and prepends it to
211
+ * the loaded dataset. Safe to call on every pan event — it is internally
212
+ * debounced by the `_isLoadingMore` flag and stops permanently once the
213
+ * datafeed signals no more history (`_noMoreHistory = true`).
214
+ *
215
+ * The series is updated automatically via the engine's `onResync` callback.
216
+ */
217
+ loadMoreHistory(symbol, timeframe) {
218
+ if (this._destroyed || this._isLoadingMore || this._noMoreHistory)
219
+ return;
220
+ if (!this._activeEngine || !this._activeUID)
221
+ return;
222
+ const engine = this._activeEngine;
223
+ const oldest = engine.getBars()[0];
224
+ if (!oldest)
225
+ return;
226
+ const uid = this._activeUID;
227
+ const to = Math.floor(oldest.timeMs / 1000);
228
+ const page = PAGE_SIZES[timeframe] ?? DEFAULT_PAGE_SIZE;
229
+ const from = to - page;
230
+ this._isLoadingMore = true;
231
+ this._datafeed.getHistoricalBars(symbol, timeframe, from, to - 1)
232
+ .then(({ bars }) => {
233
+ if (this._activeUID !== uid)
234
+ return;
235
+ if (bars.length === 0) {
236
+ this._noMoreHistory = true;
237
+ }
238
+ else {
239
+ engine.prependHistory(bars);
240
+ }
241
+ })
242
+ .catch(() => {
243
+ // Non-fatal — user can scroll again to retry
244
+ })
245
+ .finally(() => {
246
+ if (this._activeUID === uid)
247
+ this._isLoadingMore = false;
248
+ });
249
+ }
250
+ _cancelActive() {
251
+ if (this._activeUID !== null) {
252
+ try {
253
+ this._datafeed.unsubscribeBars(this._activeUID);
254
+ }
255
+ catch {
256
+ // Best-effort teardown — datafeed may already be closed
257
+ }
258
+ this._activeUID = null;
259
+ }
260
+ if (this._activeEngine !== null) {
261
+ this._activeEngine.reset();
262
+ this._activeEngine = null;
263
+ }
264
+ this._isLoadingMore = false;
265
+ this._noMoreHistory = false;
266
+ }
267
+ }
268
+ //# sourceMappingURL=DatafeedConnector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DatafeedConnector.js","sourceRoot":"","sources":["../../src/datafeed/DatafeedConnector.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,207 @@
1
+ /**
2
+ * CandleEngine — the single source of truth for live candle data.
3
+ *
4
+ * Architecture:
5
+ *
6
+ * WebSocket feed
7
+ * ↓
8
+ * Market Data Normalizer (normalizeOhlcv — handles strings, ms vs s)
9
+ * ↓
10
+ * CandleEngine (applyCandleUpdate — O(1) update path)
11
+ * ↓
12
+ * Chart Update Adapter (onBarUpdated / onResync callbacks)
13
+ * ↓
14
+ * Chart Library (series.update / series.setData)
15
+ *
16
+ * Guarantees:
17
+ * - open is never overwritten on an existing live candle
18
+ * - high can only increase within a candle
19
+ * - low can only decrease within a candle
20
+ * - close updates on every tick
21
+ * - out-of-order ticks are silently discarded
22
+ * - gaps are detected and reported for async REST backfill
23
+ * - the engine is framework-agnostic (no DOM, React, or chart-lib imports)
24
+ */
25
+ import type { Timeframe } from '@forgecharts/types';
26
+ /**
27
+ * Normalised candle shape used throughout the engine.
28
+ *
29
+ * `timeMs` — millisecond timestamp (used for bucket identity comparisons)
30
+ * `time` — second timestamp (used for chart library rendering)
31
+ */
32
+ export interface CandleBar {
33
+ /** Candle open-time in milliseconds — the primary bucket key. */
34
+ timeMs: number;
35
+ /** Candle open-time in seconds — passed directly to the chart library. */
36
+ time: number;
37
+ open: number;
38
+ high: number;
39
+ low: number;
40
+ close: number;
41
+ volume: number;
42
+ /** True once the next candle has started and this bar is fully formed. */
43
+ isClosed: boolean;
44
+ }
45
+ /**
46
+ * Raw OHLCV input accepted by the engine.
47
+ * Values may be number or numeric string; `time` may be milliseconds or seconds.
48
+ */
49
+ export interface RawOHLCV {
50
+ time: number | string;
51
+ open: number | string;
52
+ high: number | string;
53
+ low: number | string;
54
+ close: number | string;
55
+ volume?: number | string;
56
+ isClosed?: boolean;
57
+ }
58
+ /** Describes what the engine did with a live update. */
59
+ export type UpdateResult = {
60
+ type: 'update';
61
+ bar: CandleBar;
62
+ } | {
63
+ type: 'append';
64
+ bar: CandleBar;
65
+ previousBarClosed: boolean;
66
+ } | {
67
+ type: 'gap';
68
+ bar: CandleBar;
69
+ missingCount: number;
70
+ } | {
71
+ type: 'ignore';
72
+ };
73
+ /** Gap information emitted via `onGapDetected`. */
74
+ export interface GapInfo {
75
+ fromTimeMs: number;
76
+ toTimeMs: number;
77
+ missingCount: number;
78
+ }
79
+ export interface CandleEngineOptions {
80
+ /**
81
+ * Enable structured debug logging to the console.
82
+ * Log every incoming tick with action, timestamps, and resulting OHLCV.
83
+ */
84
+ debug?: boolean;
85
+ /**
86
+ * Fired when the live stream skips one or more candle buckets.
87
+ * Use this to trigger an async REST backfill; do not block the live stream.
88
+ */
89
+ onGapDetected?: (info: GapInfo) => void;
90
+ /**
91
+ * Fired after every bar mutation (update or append).
92
+ * The chart adapter should call `series.update(bar)` here.
93
+ */
94
+ onBarUpdated?: (bar: CandleBar, result: UpdateResult) => void;
95
+ /** Fired when a candle is finalised — the next candle's first tick arrived. */
96
+ onBarClosed?: (bar: CandleBar) => void;
97
+ /**
98
+ * Fired after the full bar array changes (backfillGap / handleReconnect).
99
+ * The chart adapter should call `series.setData(bars)` here to fully resync.
100
+ */
101
+ onResync?: (bars: readonly CandleBar[]) => void;
102
+ }
103
+ export declare class CandleEngine {
104
+ /** Authoritative ordered bar array. Only the rightmost bar may be open. */
105
+ private _bars;
106
+ private _timeframe;
107
+ private _intervalMs;
108
+ private readonly _opts;
109
+ constructor(options?: CandleEngineOptions);
110
+ /**
111
+ * Seed the engine with historical bars and set the active timeframe.
112
+ * All existing bars are replaced.
113
+ *
114
+ * Historical bars loaded from REST are assumed closed, except possibly
115
+ * the last one (which may represent the still-forming candle).
116
+ *
117
+ * @param history Raw bars from a REST endpoint (oldest → newest).
118
+ * @param timeframe The active timeframe label (e.g. '1m', '1h').
119
+ */
120
+ initialize(history: RawOHLCV[], timeframe: Timeframe): void;
121
+ /**
122
+ * Process a single live OHLCV tick from the WebSocket feed.
123
+ *
124
+ * Algorithm (mirrors TradingView / Binance candle engine behaviour):
125
+ *
126
+ * 1. Normalise: coerce strings to numbers, detect ms vs s, align to bucket.
127
+ * 2. Empty array → append as first bar.
128
+ * 3. incoming.timeMs === last.timeMs → SAME CANDLE (update in-place):
129
+ * open = unchanged (first tick's open is authoritative)
130
+ * high = max(last.high, inc.high, inc.close)
131
+ * low = min(last.low, inc.low, inc.close)
132
+ * close = inc.close
133
+ * volume = inc.volume
134
+ * 4. incoming.timeMs > last.timeMs → NEW CANDLE:
135
+ * - Detect and report any gap (missing buckets between last and incoming).
136
+ * - Mark last bar as closed, fire onBarClosed.
137
+ * - Append incoming as a fresh live candle.
138
+ * 5. incoming.timeMs < last.timeMs → OUT-OF-ORDER: discard silently.
139
+ *
140
+ * @returns UpdateResult indicating what was done — the chart adapter uses
141
+ * this to choose between series.update() and series.setData().
142
+ */
143
+ applyLiveUpdate(raw: RawOHLCV): UpdateResult;
144
+ /**
145
+ * Merge REST-fetched bars into the engine to fill a detected gap.
146
+ *
147
+ * Incoming bars are treated as authoritative closed candles.
148
+ * The current live candle is preserved if present.
149
+ *
150
+ * After calling this, `onResync` fires — the chart adapter must call
151
+ * `series.setData(engine.getBars())` to fully resync the chart.
152
+ *
153
+ * @param rawBars Historical bars from the REST endpoint covering the gap.
154
+ */
155
+ backfillGap(rawBars: RawOHLCV[]): void;
156
+ /**
157
+ * Reconcile after a WebSocket reconnect.
158
+ *
159
+ * Fetch a rolling overlap window from REST (e.g. last 50 bars or 2 hours)
160
+ * and pass them here. The engine merges them with the existing bar array,
161
+ * correcting any candles that were missed or corrupted during the outage.
162
+ *
163
+ * After reconciliation, `onResync` fires so the chart adapter can resync
164
+ * the chart series with `series.setData(engine.getBars())`.
165
+ *
166
+ * @param recentBars REST bars covering the reconnect overlap window.
167
+ */
168
+ handleReconnect(recentBars: RawOHLCV[]): void;
169
+ /**
170
+ * Stub for future tick/trade-based candle construction.
171
+ *
172
+ * When implemented, this will:
173
+ * - Assign the trade to its bucket using `getBucketStart(timeMs, intervalMs)`.
174
+ * - Create a new candle if the bucket is absent.
175
+ * - Update OHLCV: open/close from trade price, high/low expanded, volume summed.
176
+ *
177
+ * Not yet implemented — structure is in place for future extension.
178
+ */
179
+ applyTradeTick(_trade: {
180
+ time: number | string;
181
+ price: number | string;
182
+ size?: number | string;
183
+ }): void;
184
+ /**
185
+ * Returns a readonly view of the authoritative bar array.
186
+ * Do not mutate — call `applyLiveUpdate`, `backfillGap`, etc. instead.
187
+ */
188
+ getBars(): readonly CandleBar[];
189
+ /** Returns the most recent (possibly still live) bar, or null if empty. */
190
+ getLastBar(): CandleBar | null;
191
+ /**
192
+ * Prepend older historical bars fetched during a lazy scroll-left page load.
193
+ * Only bars older than the current oldest bar are accepted; duplicates and
194
+ * out-of-range bars are silently dropped.
195
+ * Fires `onResync` so the chart adapter updates the series with `setData`.
196
+ *
197
+ * @param rawBars Historical bars from the REST endpoint, oldest → newest.
198
+ */
199
+ prependHistory(rawBars: RawOHLCV[]): void;
200
+ /**
201
+ * Clear all state.
202
+ * Call before switching symbol or timeframe, or on a hard disconnect.
203
+ */
204
+ reset(): void;
205
+ private _debugLog;
206
+ }
207
+ //# sourceMappingURL=CandleEngine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CandleEngine.d.ts","sourceRoot":"","sources":["../../src/engine/CandleEngine.ts"],"names":[],"mappings":"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"}