@363045841yyt/klinechart-core 0.8.11-alpha.0 → 0.8.12
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/alerts/createAlertController.d.ts +30 -0
- package/dist/alerts/createAlertController.d.ts.map +1 -0
- package/dist/alerts/createAlertController.js +261 -0
- package/dist/alerts/createAlertController.js.map +1 -0
- package/dist/alerts/index.d.ts +5 -0
- package/dist/alerts/index.d.ts.map +1 -0
- package/dist/alerts/index.js +4 -0
- package/dist/alerts/index.js.map +1 -0
- package/dist/alerts/predicates.d.ts +28 -0
- package/dist/alerts/predicates.d.ts.map +1 -0
- package/dist/alerts/predicates.js +211 -0
- package/dist/alerts/predicates.js.map +1 -0
- package/dist/alerts/rollingVolume.d.ts +15 -0
- package/dist/alerts/rollingVolume.d.ts.map +1 -0
- package/dist/alerts/rollingVolume.js +42 -0
- package/dist/alerts/rollingVolume.js.map +1 -0
- package/dist/alerts/ruleSchema.d.ts +42 -0
- package/dist/alerts/ruleSchema.d.ts.map +1 -0
- package/dist/alerts/ruleSchema.js +240 -0
- package/dist/alerts/ruleSchema.js.map +1 -0
- package/dist/alerts/types.d.ts +169 -0
- package/dist/alerts/types.d.ts.map +1 -0
- package/dist/alerts/types.js +24 -0
- package/dist/alerts/types.js.map +1 -0
- package/dist/chartTypes/heikinAshi.d.ts +49 -0
- package/dist/chartTypes/heikinAshi.d.ts.map +1 -0
- package/dist/chartTypes/heikinAshi.js +94 -0
- package/dist/chartTypes/heikinAshi.js.map +1 -0
- package/dist/chartTypes/index.d.ts +6 -0
- package/dist/chartTypes/index.d.ts.map +1 -0
- package/dist/chartTypes/index.js +5 -0
- package/dist/chartTypes/index.js.map +1 -0
- package/dist/chartTypes/pointAndFigure.d.ts +83 -0
- package/dist/chartTypes/pointAndFigure.d.ts.map +1 -0
- package/dist/chartTypes/pointAndFigure.js +159 -0
- package/dist/chartTypes/pointAndFigure.js.map +1 -0
- package/dist/chartTypes/rangeBars.d.ts +61 -0
- package/dist/chartTypes/rangeBars.d.ts.map +1 -0
- package/dist/chartTypes/rangeBars.js +181 -0
- package/dist/chartTypes/rangeBars.js.map +1 -0
- package/dist/chartTypes/renko.d.ts +94 -0
- package/dist/chartTypes/renko.d.ts.map +1 -0
- package/dist/chartTypes/renko.js +207 -0
- package/dist/chartTypes/renko.js.map +1 -0
- package/dist/chartTypes/types.d.ts +97 -0
- package/dist/chartTypes/types.d.ts.map +1 -0
- package/dist/chartTypes/types.js +39 -0
- package/dist/chartTypes/types.js.map +1 -0
- package/dist/components/anchoredVwap/computeAnchoredVwap.d.ts +76 -0
- package/dist/components/anchoredVwap/computeAnchoredVwap.d.ts.map +1 -0
- package/dist/components/anchoredVwap/computeAnchoredVwap.js +155 -0
- package/dist/components/anchoredVwap/computeAnchoredVwap.js.map +1 -0
- package/dist/components/anchoredVwap/createAnchoredVwapController.d.ts +28 -0
- package/dist/components/anchoredVwap/createAnchoredVwapController.d.ts.map +1 -0
- package/dist/components/anchoredVwap/createAnchoredVwapController.js +282 -0
- package/dist/components/anchoredVwap/createAnchoredVwapController.js.map +1 -0
- package/dist/components/anchoredVwap/index.d.ts +11 -0
- package/dist/components/anchoredVwap/index.d.ts.map +1 -0
- package/dist/components/anchoredVwap/index.js +10 -0
- package/dist/components/anchoredVwap/index.js.map +1 -0
- package/dist/components/anchoredVwap/types.d.ts +171 -0
- package/dist/components/anchoredVwap/types.d.ts.map +1 -0
- package/dist/components/anchoredVwap/types.js +25 -0
- package/dist/components/anchoredVwap/types.js.map +1 -0
- package/dist/components/crosshairSync/createCrosshairSync.d.ts +94 -0
- package/dist/components/crosshairSync/createCrosshairSync.d.ts.map +1 -0
- package/dist/components/crosshairSync/createCrosshairSync.js +118 -0
- package/dist/components/crosshairSync/createCrosshairSync.js.map +1 -0
- package/dist/components/crosshairSync/index.d.ts +2 -0
- package/dist/components/crosshairSync/index.d.ts.map +1 -0
- package/dist/components/crosshairSync/index.js +2 -0
- package/dist/components/crosshairSync/index.js.map +1 -0
- package/dist/components/footprint/aggressor.d.ts +89 -0
- package/dist/components/footprint/aggressor.d.ts.map +1 -0
- package/dist/components/footprint/aggressor.js +106 -0
- package/dist/components/footprint/aggressor.js.map +1 -0
- package/dist/components/footprint/createFootprintController.d.ts +29 -0
- package/dist/components/footprint/createFootprintController.d.ts.map +1 -0
- package/dist/components/footprint/createFootprintController.js +264 -0
- package/dist/components/footprint/createFootprintController.js.map +1 -0
- package/dist/components/footprint/index.d.ts +7 -0
- package/dist/components/footprint/index.d.ts.map +1 -0
- package/dist/components/footprint/index.js +4 -0
- package/dist/components/footprint/index.js.map +1 -0
- package/dist/components/footprint/perBarStats.d.ts +63 -0
- package/dist/components/footprint/perBarStats.d.ts.map +1 -0
- package/dist/components/footprint/perBarStats.js +123 -0
- package/dist/components/footprint/perBarStats.js.map +1 -0
- package/dist/components/footprint/types.d.ts +197 -0
- package/dist/components/footprint/types.d.ts.map +1 -0
- package/dist/components/footprint/types.js +23 -0
- package/dist/components/footprint/types.js.map +1 -0
- package/dist/components/mtfOverlay/alignToBaseIndex.d.ts +45 -0
- package/dist/components/mtfOverlay/alignToBaseIndex.d.ts.map +1 -0
- package/dist/components/mtfOverlay/alignToBaseIndex.js +92 -0
- package/dist/components/mtfOverlay/alignToBaseIndex.js.map +1 -0
- package/dist/components/mtfOverlay/createMtfController.d.ts +7 -0
- package/dist/components/mtfOverlay/createMtfController.d.ts.map +1 -0
- package/dist/components/mtfOverlay/createMtfController.js +134 -0
- package/dist/components/mtfOverlay/createMtfController.js.map +1 -0
- package/dist/components/mtfOverlay/index.d.ts +19 -0
- package/dist/components/mtfOverlay/index.d.ts.map +1 -0
- package/dist/components/mtfOverlay/index.js +18 -0
- package/dist/components/mtfOverlay/index.js.map +1 -0
- package/dist/components/mtfOverlay/resampleBars.d.ts +37 -0
- package/dist/components/mtfOverlay/resampleBars.d.ts.map +1 -0
- package/dist/components/mtfOverlay/resampleBars.js +93 -0
- package/dist/components/mtfOverlay/resampleBars.js.map +1 -0
- package/dist/components/mtfOverlay/types.d.ts +132 -0
- package/dist/components/mtfOverlay/types.d.ts.map +1 -0
- package/dist/components/mtfOverlay/types.js +22 -0
- package/dist/components/mtfOverlay/types.js.map +1 -0
- package/dist/components/orderBookHeatmap/createHeatmapController.d.ts +21 -0
- package/dist/components/orderBookHeatmap/createHeatmapController.d.ts.map +1 -0
- package/dist/components/orderBookHeatmap/createHeatmapController.js +234 -0
- package/dist/components/orderBookHeatmap/createHeatmapController.js.map +1 -0
- package/dist/components/orderBookHeatmap/createOrderBookState.d.ts +18 -0
- package/dist/components/orderBookHeatmap/createOrderBookState.d.ts.map +1 -0
- package/dist/components/orderBookHeatmap/createOrderBookState.js +102 -0
- package/dist/components/orderBookHeatmap/createOrderBookState.js.map +1 -0
- package/dist/components/orderBookHeatmap/deltaArchive.d.ts +25 -0
- package/dist/components/orderBookHeatmap/deltaArchive.d.ts.map +1 -0
- package/dist/components/orderBookHeatmap/deltaArchive.js +106 -0
- package/dist/components/orderBookHeatmap/deltaArchive.js.map +1 -0
- package/dist/components/orderBookHeatmap/index.d.ts +13 -0
- package/dist/components/orderBookHeatmap/index.d.ts.map +1 -0
- package/dist/components/orderBookHeatmap/index.js +12 -0
- package/dist/components/orderBookHeatmap/index.js.map +1 -0
- package/dist/components/orderBookHeatmap/logColorScale.d.ts +20 -0
- package/dist/components/orderBookHeatmap/logColorScale.d.ts.map +1 -0
- package/dist/components/orderBookHeatmap/logColorScale.js +71 -0
- package/dist/components/orderBookHeatmap/logColorScale.js.map +1 -0
- package/dist/components/orderBookHeatmap/snapshotRing.d.ts +16 -0
- package/dist/components/orderBookHeatmap/snapshotRing.d.ts.map +1 -0
- package/dist/components/orderBookHeatmap/snapshotRing.js +61 -0
- package/dist/components/orderBookHeatmap/snapshotRing.js.map +1 -0
- package/dist/components/orderBookHeatmap/types.d.ts +128 -0
- package/dist/components/orderBookHeatmap/types.d.ts.map +1 -0
- package/dist/components/orderBookHeatmap/types.js +16 -0
- package/dist/components/orderBookHeatmap/types.js.map +1 -0
- package/dist/components/volumeProfile/binning.d.ts +54 -0
- package/dist/components/volumeProfile/binning.d.ts.map +1 -0
- package/dist/components/volumeProfile/binning.js +123 -0
- package/dist/components/volumeProfile/binning.js.map +1 -0
- package/dist/components/volumeProfile/createVolumeProfileController.d.ts +31 -0
- package/dist/components/volumeProfile/createVolumeProfileController.d.ts.map +1 -0
- package/dist/components/volumeProfile/createVolumeProfileController.js +179 -0
- package/dist/components/volumeProfile/createVolumeProfileController.js.map +1 -0
- package/dist/components/volumeProfile/index.d.ts +6 -0
- package/dist/components/volumeProfile/index.d.ts.map +1 -0
- package/dist/components/volumeProfile/index.js +5 -0
- package/dist/components/volumeProfile/index.js.map +1 -0
- package/dist/components/volumeProfile/poc.d.ts +35 -0
- package/dist/components/volumeProfile/poc.d.ts.map +1 -0
- package/dist/components/volumeProfile/poc.js +51 -0
- package/dist/components/volumeProfile/poc.js.map +1 -0
- package/dist/components/volumeProfile/types.d.ts +138 -0
- package/dist/components/volumeProfile/types.d.ts.map +1 -0
- package/dist/components/volumeProfile/types.js +19 -0
- package/dist/components/volumeProfile/types.js.map +1 -0
- package/dist/components/volumeProfile/valueArea.d.ts +58 -0
- package/dist/components/volumeProfile/valueArea.d.ts.map +1 -0
- package/dist/components/volumeProfile/valueArea.js +172 -0
- package/dist/components/volumeProfile/valueArea.js.map +1 -0
- package/dist/controllers/createChartController.d.ts.map +1 -1
- package/dist/controllers/createChartController.js +22 -11
- package/dist/controllers/createChartController.js.map +1 -1
- package/dist/controllers/types.d.ts +3 -1
- package/dist/controllers/types.d.ts.map +1 -1
- package/dist/data-fetchers/baostock.d.ts.map +1 -1
- package/dist/data-fetchers/baostock.js +2 -1
- package/dist/data-fetchers/baostock.js.map +1 -1
- package/dist/data-fetchers/dataBuffer.effects.d.ts.map +1 -1
- package/dist/data-fetchers/dataBuffer.effects.js +2 -1
- package/dist/data-fetchers/dataBuffer.effects.js.map +1 -1
- package/dist/data-fetchers/fetcherDefinitionRegistry.d.ts.map +1 -1
- package/dist/data-fetchers/fetcherDefinitionRegistry.js +2 -1
- package/dist/data-fetchers/fetcherDefinitionRegistry.js.map +1 -1
- package/dist/data-fetchers/gotdx.js +4 -3
- package/dist/data-fetchers/gotdx.js.map +1 -1
- package/dist/data-fetchers/router.d.ts.map +1 -1
- package/dist/data-fetchers/router.js +4 -3
- package/dist/data-fetchers/router.js.map +1 -1
- package/dist/data-fetchers/tradingview.js +3 -2
- package/dist/data-fetchers/tradingview.js.map +1 -1
- package/dist/engine/chart.d.ts +13 -0
- package/dist/engine/chart.d.ts.map +1 -1
- package/dist/engine/chart.js +109 -0
- package/dist/engine/chart.js.map +1 -1
- package/dist/engine/data/chartDataManager.d.ts +1 -0
- package/dist/engine/data/chartDataManager.d.ts.map +1 -1
- package/dist/engine/data/chartDataManager.js +27 -4
- package/dist/engine/data/chartDataManager.js.map +1 -1
- package/dist/engine/drawing/toolConfig.d.ts.map +1 -1
- package/dist/engine/drawing/toolConfig.js +2 -1
- package/dist/engine/drawing/toolConfig.js.map +1 -1
- package/dist/engine/indicators/chartIndicatorManager.d.ts.map +1 -1
- package/dist/engine/indicators/chartIndicatorManager.js +2 -1
- package/dist/engine/indicators/chartIndicatorManager.js.map +1 -1
- package/dist/engine/indicators/indicatorDefinitionRegistry.d.ts.map +1 -1
- package/dist/engine/indicators/indicatorDefinitionRegistry.js +2 -1
- package/dist/engine/indicators/indicatorDefinitionRegistry.js.map +1 -1
- package/dist/engine/indicators/indicatorMetadata.d.ts.map +1 -1
- package/dist/engine/indicators/indicatorMetadata.js +2 -1
- package/dist/engine/indicators/indicatorMetadata.js.map +1 -1
- package/dist/engine/indicators/indicatorRegistry.d.ts.map +1 -1
- package/dist/engine/indicators/indicatorRegistry.js +6 -5
- package/dist/engine/indicators/indicatorRegistry.js.map +1 -1
- package/dist/engine/indicators/registerBuiltins.d.ts.map +1 -1
- package/dist/engine/indicators/registerBuiltins.js +2 -1
- package/dist/engine/indicators/registerBuiltins.js.map +1 -1
- package/dist/engine/indicators/scheduler.d.ts +6 -0
- package/dist/engine/indicators/scheduler.d.ts.map +1 -1
- package/dist/engine/indicators/scheduler.js +12 -0
- package/dist/engine/indicators/scheduler.js.map +1 -1
- package/dist/engine/indicators/soa.d.ts.map +1 -1
- package/dist/engine/indicators/soa.js +2 -1
- package/dist/engine/indicators/soa.js.map +1 -1
- package/dist/engine/indicators/stateComposer.d.ts.map +1 -1
- package/dist/engine/indicators/stateComposer.js +2 -1
- package/dist/engine/indicators/stateComposer.js.map +1 -1
- package/dist/engine/subPaneManager.d.ts.map +1 -1
- package/dist/engine/subPaneManager.js +2 -1
- package/dist/engine/subPaneManager.js.map +1 -1
- package/dist/engine/utils/chartZoomController.d.ts +2 -0
- package/dist/engine/utils/chartZoomController.d.ts.map +1 -1
- package/dist/engine/utils/chartZoomController.js +5 -1
- package/dist/engine/utils/chartZoomController.js.map +1 -1
- package/dist/errors-help.d.ts +72 -0
- package/dist/errors-help.d.ts.map +1 -0
- package/dist/errors-help.js +149 -0
- package/dist/errors-help.js.map +1 -0
- package/dist/errors.d.ts +64 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +61 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +22 -0
- package/dist/index.js.map +1 -1
- package/dist/indicators/alma.d.ts +27 -0
- package/dist/indicators/alma.d.ts.map +1 -0
- package/dist/indicators/alma.js +36 -0
- package/dist/indicators/alma.js.map +1 -0
- package/dist/indicators/awesomeOscillator.d.ts +19 -0
- package/dist/indicators/awesomeOscillator.d.ts.map +1 -0
- package/dist/indicators/awesomeOscillator.js +36 -0
- package/dist/indicators/awesomeOscillator.js.map +1 -0
- package/dist/indicators/dpo.d.ts +17 -0
- package/dist/indicators/dpo.d.ts.map +1 -0
- package/dist/indicators/dpo.js +24 -0
- package/dist/indicators/dpo.js.map +1 -0
- package/dist/indicators/fisherTransform.d.ts +26 -0
- package/dist/indicators/fisherTransform.d.ts.map +1 -0
- package/dist/indicators/fisherTransform.js +44 -0
- package/dist/indicators/fisherTransform.js.map +1 -0
- package/dist/indicators/frama.d.ts +25 -0
- package/dist/indicators/frama.d.ts.map +1 -0
- package/dist/indicators/frama.js +61 -0
- package/dist/indicators/frama.js.map +1 -0
- package/dist/indicators/index.d.ts +24 -0
- package/dist/indicators/index.d.ts.map +1 -0
- package/dist/indicators/index.js +26 -0
- package/dist/indicators/index.js.map +1 -0
- package/dist/indicators/lsma.d.ts +21 -0
- package/dist/indicators/lsma.d.ts.map +1 -0
- package/dist/indicators/lsma.js +37 -0
- package/dist/indicators/lsma.js.map +1 -0
- package/dist/indicators/schaffTrendCycle.d.ts +24 -0
- package/dist/indicators/schaffTrendCycle.d.ts.map +1 -0
- package/dist/indicators/schaffTrendCycle.js +70 -0
- package/dist/indicators/schaffTrendCycle.js.map +1 -0
- package/dist/indicators/stochRSI.d.ts +24 -0
- package/dist/indicators/stochRSI.d.ts.map +1 -0
- package/dist/indicators/stochRSI.js +86 -0
- package/dist/indicators/stochRSI.js.map +1 -0
- package/dist/indicators/t3.d.ts +31 -0
- package/dist/indicators/t3.d.ts.map +1 -0
- package/dist/indicators/t3.js +63 -0
- package/dist/indicators/t3.js.map +1 -0
- package/dist/indicators/ultimateOscillator.d.ts +26 -0
- package/dist/indicators/ultimateOscillator.d.ts.map +1 -0
- package/dist/indicators/ultimateOscillator.js +59 -0
- package/dist/indicators/ultimateOscillator.js.map +1 -0
- package/dist/indicators/vidya.d.ts +24 -0
- package/dist/indicators/vidya.d.ts.map +1 -0
- package/dist/indicators/vidya.js +54 -0
- package/dist/indicators/vidya.js.map +1 -0
- package/dist/indicators/zlema.d.ts +16 -0
- package/dist/indicators/zlema.d.ts.map +1 -0
- package/dist/indicators/zlema.js +26 -0
- package/dist/indicators/zlema.js.map +1 -0
- package/dist/input/gesture.d.ts +125 -0
- package/dist/input/gesture.d.ts.map +1 -0
- package/dist/input/gesture.js +249 -0
- package/dist/input/gesture.js.map +1 -0
- package/dist/input/index.d.ts +9 -0
- package/dist/input/index.d.ts.map +1 -0
- package/dist/input/index.js +9 -0
- package/dist/input/index.js.map +1 -0
- package/dist/input/keyboard.d.ts +140 -0
- package/dist/input/keyboard.d.ts.map +1 -0
- package/dist/input/keyboard.js +260 -0
- package/dist/input/keyboard.js.map +1 -0
- package/dist/mcp/chartBridge.d.ts +2 -2
- package/dist/mcp/chartBridge.d.ts.map +1 -1
- package/dist/mcp/chartBridge.js +27 -21
- package/dist/mcp/chartBridge.js.map +1 -1
- package/dist/plugin/PluginHost.d.ts +0 -3
- package/dist/plugin/PluginHost.d.ts.map +1 -1
- package/dist/plugin/PluginHost.js +7 -3
- package/dist/plugin/PluginHost.js.map +1 -1
- package/dist/plugin/PluginRegistry.d.ts +0 -3
- package/dist/plugin/PluginRegistry.d.ts.map +1 -1
- package/dist/plugin/PluginRegistry.js +5 -1
- package/dist/plugin/PluginRegistry.js.map +1 -1
- package/dist/render/Renderer.d.ts +116 -0
- package/dist/render/Renderer.d.ts.map +1 -0
- package/dist/render/Renderer.js +31 -0
- package/dist/render/Renderer.js.map +1 -0
- package/dist/render/SurfaceBackend.d.ts +83 -0
- package/dist/render/SurfaceBackend.d.ts.map +1 -0
- package/dist/render/SurfaceBackend.js +27 -0
- package/dist/render/SurfaceBackend.js.map +1 -0
- package/dist/render/index.d.ts +12 -0
- package/dist/render/index.d.ts.map +1 -0
- package/dist/render/index.js +11 -0
- package/dist/render/index.js.map +1 -0
- package/dist/renderer-tier/detectRendererTier.d.ts +57 -0
- package/dist/renderer-tier/detectRendererTier.d.ts.map +1 -0
- package/dist/renderer-tier/detectRendererTier.js +143 -0
- package/dist/renderer-tier/detectRendererTier.js.map +1 -0
- package/dist/renderer-tier/index.d.ts +12 -0
- package/dist/renderer-tier/index.d.ts.map +1 -0
- package/dist/renderer-tier/index.js +12 -0
- package/dist/renderer-tier/index.js.map +1 -0
- package/dist/renderer-tier/selectBackend.d.ts +106 -0
- package/dist/renderer-tier/selectBackend.d.ts.map +1 -0
- package/dist/renderer-tier/selectBackend.js +113 -0
- package/dist/renderer-tier/selectBackend.js.map +1 -0
- package/dist/renderer-tier/types.d.ts +50 -0
- package/dist/renderer-tier/types.d.ts.map +1 -0
- package/dist/renderer-tier/types.js +24 -0
- package/dist/renderer-tier/types.js.map +1 -0
- package/dist/replay/createReplayController.d.ts +3 -0
- package/dist/replay/createReplayController.d.ts.map +1 -0
- package/dist/replay/createReplayController.js +251 -0
- package/dist/replay/createReplayController.js.map +1 -0
- package/dist/replay/index.d.ts +5 -0
- package/dist/replay/index.d.ts.map +1 -0
- package/dist/replay/index.js +3 -0
- package/dist/replay/index.js.map +1 -0
- package/dist/replay/timeline.d.ts +50 -0
- package/dist/replay/timeline.d.ts.map +1 -0
- package/dist/replay/timeline.js +104 -0
- package/dist/replay/timeline.js.map +1 -0
- package/dist/replay/types.d.ts +94 -0
- package/dist/replay/types.d.ts.map +1 -0
- package/dist/replay/types.js +21 -0
- package/dist/replay/types.js.map +1 -0
- package/dist/scale/anchoredZoom.d.ts +64 -0
- package/dist/scale/anchoredZoom.d.ts.map +1 -0
- package/dist/scale/anchoredZoom.js +67 -0
- package/dist/scale/anchoredZoom.js.map +1 -0
- package/dist/scale/createPriceScale.d.ts +49 -0
- package/dist/scale/createPriceScale.d.ts.map +1 -0
- package/dist/scale/createPriceScale.js +175 -0
- package/dist/scale/createPriceScale.js.map +1 -0
- package/dist/scale/createTimeScale.d.ts +27 -0
- package/dist/scale/createTimeScale.d.ts.map +1 -0
- package/dist/scale/createTimeScale.js +139 -0
- package/dist/scale/createTimeScale.js.map +1 -0
- package/dist/scale/index.d.ts +6 -0
- package/dist/scale/index.d.ts.map +1 -0
- package/dist/scale/index.js +5 -0
- package/dist/scale/index.js.map +1 -0
- package/dist/scale/originShift.d.ts +69 -0
- package/dist/scale/originShift.d.ts.map +1 -0
- package/dist/scale/originShift.js +41 -0
- package/dist/scale/originShift.js.map +1 -0
- package/dist/scale/types.d.ts +90 -0
- package/dist/scale/types.d.ts.map +1 -0
- package/dist/scale/types.js +17 -0
- package/dist/scale/types.js.map +1 -0
- package/dist/scene/createScene.d.ts +22 -0
- package/dist/scene/createScene.d.ts.map +1 -0
- package/dist/scene/createScene.js +114 -0
- package/dist/scene/createScene.js.map +1 -0
- package/dist/scene/index.d.ts +13 -0
- package/dist/scene/index.d.ts.map +1 -0
- package/dist/scene/index.js +11 -0
- package/dist/scene/index.js.map +1 -0
- package/dist/scene/layerRegistry.d.ts +83 -0
- package/dist/scene/layerRegistry.d.ts.map +1 -0
- package/dist/scene/layerRegistry.js +43 -0
- package/dist/scene/layerRegistry.js.map +1 -0
- package/dist/scene/types.d.ts +128 -0
- package/dist/scene/types.d.ts.map +1 -0
- package/dist/scene/types.js +21 -0
- package/dist/scene/types.js.map +1 -0
- package/dist/scheduler/createFrameBudget.d.ts +91 -0
- package/dist/scheduler/createFrameBudget.d.ts.map +1 -0
- package/dist/scheduler/createFrameBudget.js +232 -0
- package/dist/scheduler/createFrameBudget.js.map +1 -0
- package/dist/scheduler/index.d.ts +2 -0
- package/dist/scheduler/index.d.ts.map +1 -0
- package/dist/scheduler/index.js +2 -0
- package/dist/scheduler/index.js.map +1 -0
- package/dist/tokens/themeToCssVars.d.ts.map +1 -1
- package/dist/tokens/themeToCssVars.js +2 -28
- package/dist/tokens/themeToCssVars.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.d.ts.map +1 -1
- package/dist/version.js +1 -1
- package/dist/version.js.map +1 -1
- package/package.json +1 -1
- package/src/__bench__/indicators.bench.ts +215 -0
- package/src/__bench__/orderBookHeatmap.bench.ts +68 -0
- package/src/__bench__/scale.bench.ts +80 -0
- package/src/__bench__/signal.bench.ts +41 -0
- package/src/__bench__/volumeProfile.bench.ts +66 -0
- package/src/__tests__/errors-help.test.ts +184 -0
- package/src/__tests__/errors.test.ts +187 -0
- package/src/alerts/__tests__/controller.test.ts +231 -0
- package/src/alerts/__tests__/predicates.test.ts +374 -0
- package/src/alerts/__tests__/ruleSchema.test.ts +180 -0
- package/src/alerts/createAlertController.ts +312 -0
- package/src/alerts/index.ts +18 -0
- package/src/alerts/predicates.ts +231 -0
- package/src/alerts/rollingVolume.ts +51 -0
- package/src/alerts/ruleSchema.ts +278 -0
- package/src/alerts/types.ts +177 -0
- package/src/chartTypes/__tests__/heikinAshi.test.ts +122 -0
- package/src/chartTypes/__tests__/pointAndFigure.test.ts +167 -0
- package/src/chartTypes/__tests__/rangeBars.test.ts +146 -0
- package/src/chartTypes/__tests__/renko.test.ts +160 -0
- package/src/chartTypes/heikinAshi.ts +116 -0
- package/src/chartTypes/index.ts +5 -0
- package/src/chartTypes/pointAndFigure.ts +278 -0
- package/src/chartTypes/rangeBars.ts +303 -0
- package/src/chartTypes/renko.ts +311 -0
- package/src/chartTypes/types.ts +99 -0
- package/src/components/anchoredVwap/__tests__/computeAnchoredVwap.test.ts +331 -0
- package/src/components/anchoredVwap/__tests__/controller.test.ts +430 -0
- package/src/components/anchoredVwap/computeAnchoredVwap.ts +174 -0
- package/src/components/anchoredVwap/createAnchoredVwapController.ts +358 -0
- package/src/components/anchoredVwap/index.ts +17 -0
- package/src/components/anchoredVwap/types.ts +187 -0
- package/src/components/crosshairSync/__tests__/crosshairSync.test.ts +261 -0
- package/src/components/crosshairSync/createCrosshairSync.ts +187 -0
- package/src/components/crosshairSync/index.ts +5 -0
- package/src/components/footprint/__tests__/aggressor.test.ts +127 -0
- package/src/components/footprint/__tests__/controller.test.ts +130 -0
- package/src/components/footprint/__tests__/perBarStats.test.ts +114 -0
- package/src/components/footprint/aggressor.ts +165 -0
- package/src/components/footprint/createFootprintController.ts +338 -0
- package/src/components/footprint/index.ts +21 -0
- package/src/components/footprint/perBarStats.ts +137 -0
- package/src/components/footprint/types.ts +232 -0
- package/src/components/mtfOverlay/__tests__/alignToBaseIndex.test.ts +103 -0
- package/src/components/mtfOverlay/__tests__/controller.test.ts +172 -0
- package/src/components/mtfOverlay/__tests__/resampleBars.test.ts +106 -0
- package/src/components/mtfOverlay/alignToBaseIndex.ts +108 -0
- package/src/components/mtfOverlay/createMtfController.ts +180 -0
- package/src/components/mtfOverlay/index.ts +26 -0
- package/src/components/mtfOverlay/resampleBars.ts +134 -0
- package/src/components/mtfOverlay/types.ts +148 -0
- package/src/components/orderBookHeatmap/__tests__/controller.test.ts +237 -0
- package/src/components/orderBookHeatmap/__tests__/deltaArchive.test.ts +88 -0
- package/src/components/orderBookHeatmap/__tests__/logColorScale.test.ts +69 -0
- package/src/components/orderBookHeatmap/__tests__/orderBookState.test.ts +113 -0
- package/src/components/orderBookHeatmap/__tests__/snapshotRing.test.ts +53 -0
- package/src/components/orderBookHeatmap/computeShader.wgsl.md +130 -0
- package/src/components/orderBookHeatmap/createHeatmapController.ts +273 -0
- package/src/components/orderBookHeatmap/createOrderBookState.ts +116 -0
- package/src/components/orderBookHeatmap/deltaArchive.ts +113 -0
- package/src/components/orderBookHeatmap/index.ts +25 -0
- package/src/components/orderBookHeatmap/logColorScale.ts +77 -0
- package/src/components/orderBookHeatmap/snapshotRing.ts +65 -0
- package/src/components/orderBookHeatmap/types.ts +168 -0
- package/src/components/volumeProfile/__tests__/binning.test.ts +133 -0
- package/src/components/volumeProfile/__tests__/poc.test.ts +44 -0
- package/src/components/volumeProfile/__tests__/valueArea.test.ts +177 -0
- package/src/components/volumeProfile/binning.ts +133 -0
- package/src/components/volumeProfile/createVolumeProfileController.ts +213 -0
- package/src/components/volumeProfile/index.ts +12 -0
- package/src/components/volumeProfile/poc.ts +53 -0
- package/src/components/volumeProfile/types.ts +148 -0
- package/src/components/volumeProfile/valueArea.ts +187 -0
- package/src/controllers/createChartController.ts +23 -10
- package/src/controllers/types.ts +5 -1
- package/src/data-fetchers/baostock.ts +2 -1
- package/src/data-fetchers/dataBuffer.effects.ts +3 -1
- package/src/data-fetchers/fetcherDefinitionRegistry.ts +2 -1
- package/src/data-fetchers/gotdx.ts +4 -3
- package/src/data-fetchers/router.ts +6 -3
- package/src/data-fetchers/tradingview.ts +3 -2
- package/src/engine/chart.ts +126 -3
- package/src/engine/data/chartDataManager.ts +26 -4
- package/src/engine/drawing/toolConfig.ts +2 -1
- package/src/engine/indicators/chartIndicatorManager.ts +2 -1
- package/src/engine/indicators/indicatorDefinitionRegistry.ts +2 -1
- package/src/engine/indicators/indicatorMetadata.ts +2 -1
- package/src/engine/indicators/indicatorRegistry.ts +6 -5
- package/src/engine/indicators/registerBuiltins.ts +2 -1
- package/src/engine/indicators/scheduler.ts +15 -0
- package/src/engine/indicators/soa.ts +2 -1
- package/src/engine/indicators/stateComposer.ts +2 -1
- package/src/engine/subPaneManager.ts +2 -1
- package/src/engine/utils/chartZoomController.ts +7 -1
- package/src/errors-help.ts +218 -0
- package/src/errors.ts +128 -0
- package/src/index.ts +37 -0
- package/src/indicators/__tests__/maFamily.test.ts +159 -0
- package/src/indicators/__tests__/oscillators.test.ts +150 -0
- package/src/indicators/alma.ts +61 -0
- package/src/indicators/awesomeOscillator.ts +54 -0
- package/src/indicators/dpo.ts +37 -0
- package/src/indicators/fisherTransform.ts +63 -0
- package/src/indicators/frama.ts +87 -0
- package/src/indicators/index.ts +39 -0
- package/src/indicators/lsma.ts +58 -0
- package/src/indicators/schaffTrendCycle.ts +92 -0
- package/src/indicators/stochRSI.ts +108 -0
- package/src/indicators/t3.ts +96 -0
- package/src/indicators/ultimateOscillator.ts +83 -0
- package/src/indicators/vidya.ts +80 -0
- package/src/indicators/zlema.ts +41 -0
- package/src/input/__tests__/gesture.test.ts +271 -0
- package/src/input/__tests__/keyboard.test.ts +317 -0
- package/src/input/gesture.ts +357 -0
- package/src/input/index.ts +26 -0
- package/src/input/keyboard.ts +373 -0
- package/src/mcp/chartBridge.ts +98 -72
- package/src/plugin/PluginHost.ts +4 -3
- package/src/plugin/PluginRegistry.ts +2 -1
- package/src/render/Renderer.ts +127 -0
- package/src/render/SurfaceBackend.ts +94 -0
- package/src/render/__tests__/contract.test.ts +176 -0
- package/src/render/index.ts +27 -0
- package/src/renderer-tier/__tests__/detectRendererTier.test.ts +180 -0
- package/src/renderer-tier/__tests__/selectBackend.test.ts +253 -0
- package/src/renderer-tier/detectRendererTier.ts +168 -0
- package/src/renderer-tier/index.ts +30 -0
- package/src/renderer-tier/selectBackend.ts +201 -0
- package/src/renderer-tier/types.ts +59 -0
- package/src/replay/__tests__/controller.test.ts +309 -0
- package/src/replay/__tests__/timeline.test.ts +99 -0
- package/src/replay/createReplayController.ts +302 -0
- package/src/replay/index.ts +15 -0
- package/src/replay/timeline.ts +106 -0
- package/src/replay/types.ts +107 -0
- package/src/scale/__tests__/anchoredZoom.test.ts +125 -0
- package/src/scale/__tests__/originShift.test.ts +97 -0
- package/src/scale/__tests__/priceScale.test.ts +219 -0
- package/src/scale/__tests__/timeScale.test.ts +119 -0
- package/src/scale/anchoredZoom.ts +104 -0
- package/src/scale/createPriceScale.ts +226 -0
- package/src/scale/createTimeScale.ts +150 -0
- package/src/scale/index.ts +9 -0
- package/src/scale/originShift.ts +111 -0
- package/src/scale/types.ts +100 -0
- package/src/scene/__tests__/layerRegistry.test.ts +207 -0
- package/src/scene/__tests__/scene.test.ts +411 -0
- package/src/scene/createScene.ts +117 -0
- package/src/scene/index.ts +29 -0
- package/src/scene/layerRegistry.ts +117 -0
- package/src/scene/types.ts +143 -0
- package/src/scheduler/__tests__/createFrameBudget.test.ts +315 -0
- package/src/scheduler/createFrameBudget.ts +316 -0
- package/src/scheduler/index.ts +7 -0
- package/src/tokens/themeToCssVars.ts +3 -1
- package/src/version.ts +1 -1
- package/dist/data-fetchers/gotdx/gotdx.d.ts +0 -7
- package/dist/data-fetchers/gotdx/gotdx.d.ts.map +0 -1
- package/dist/data-fetchers/gotdx/gotdx.js +0 -7
- package/dist/data-fetchers/gotdx/gotdx.js.map +0 -1
- package/src/data-fetchers/gotdx/gotdx.ts +0 -6
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Renderer backend selector — bridges the tier-detection layer
|
|
3
|
+
* ({@link detectRendererTier}) to the actual backend factory the
|
|
4
|
+
* `Renderer` interface will instantiate.
|
|
5
|
+
*
|
|
6
|
+
* Why this exists separately from {@link detectRendererTier}:
|
|
7
|
+
*
|
|
8
|
+
* - Detection answers "what's *possible*?".
|
|
9
|
+
* - Selection answers "what's *registered* and matches what's possible?".
|
|
10
|
+
*
|
|
11
|
+
* In practice the answers diverge. A consumer can:
|
|
12
|
+
*
|
|
13
|
+
* (a) Choose to omit a backend they don't want to ship (e.g. drop the
|
|
14
|
+
* WebGPU backend to save bundle size; the selector then falls
|
|
15
|
+
* through to WebGL2 even when the host supports WebGPU).
|
|
16
|
+
* (b) Override a backend for a specific tier (e.g. inject a Canvas2D
|
|
17
|
+
* backend stub during tests, so the chart still renders headless).
|
|
18
|
+
*
|
|
19
|
+
* Both shapes need a *structural* fallback chain, not just "give me the
|
|
20
|
+
* factory for the detected tier". This module formalises that chain so
|
|
21
|
+
* the wiring is consistent across React, Vue, Angular, and any future
|
|
22
|
+
* adapter.
|
|
23
|
+
*
|
|
24
|
+
* Pure data: no DOM, no async, no side effects. The returned factory is
|
|
25
|
+
* just the function the caller registered.
|
|
26
|
+
*/
|
|
27
|
+
import { type DetectRendererTierOptions, type RendererTier, type RendererTierResult } from './types';
|
|
28
|
+
/**
|
|
29
|
+
* Opaque factory shape. We don't constrain the Renderer construction here —
|
|
30
|
+
* the consumer's backend implementation knows its own signature. The
|
|
31
|
+
* selector is purely about *which* factory to hand back.
|
|
32
|
+
*/
|
|
33
|
+
export type BackendFactory<T = unknown> = () => T;
|
|
34
|
+
/**
|
|
35
|
+
* Map of tier → registered factory. Tiers that are absent or `null` are
|
|
36
|
+
* treated as "not registered" and skipped during selection.
|
|
37
|
+
*
|
|
38
|
+
* `'none'` is intentionally absent from the type. A `'none'` tier is the
|
|
39
|
+
* absence of any rendering capability; there is nothing to register.
|
|
40
|
+
*/
|
|
41
|
+
export type BackendRegistry<T = unknown> = Partial<Record<Exclude<RendererTier, 'none'>, BackendFactory<T> | null>>;
|
|
42
|
+
/**
|
|
43
|
+
* Selection result. `tier` is the effective tier the chosen factory
|
|
44
|
+
* targets — which is at most the detected tier. `fallbackChain`
|
|
45
|
+
* enumerates the tiers the selector traversed (high → low). When no
|
|
46
|
+
* backend is registered for any tier ≤ the detected tier, returns
|
|
47
|
+
* `tier: 'none'` and `factory: null`.
|
|
48
|
+
*/
|
|
49
|
+
export interface BackendSelection<T = unknown> {
|
|
50
|
+
readonly tier: RendererTier;
|
|
51
|
+
readonly factory: BackendFactory<T> | null;
|
|
52
|
+
readonly fallbackChain: ReadonlyArray<RendererTier>;
|
|
53
|
+
readonly reason: string;
|
|
54
|
+
/**
|
|
55
|
+
* The original tier-detection result. Useful for telemetry — when
|
|
56
|
+
* `tier < detection.tier` the consumer knows the host could have
|
|
57
|
+
* done better but the registry was the binding constraint.
|
|
58
|
+
*/
|
|
59
|
+
readonly detection: RendererTierResult;
|
|
60
|
+
}
|
|
61
|
+
export interface SelectBackendOptions<T = unknown> {
|
|
62
|
+
readonly registry: BackendRegistry<T>;
|
|
63
|
+
/**
|
|
64
|
+
* Tier-detection probes pass-through for tests. Same shape as
|
|
65
|
+
* {@link DetectRendererTierOptions}.
|
|
66
|
+
*/
|
|
67
|
+
readonly detect?: DetectRendererTierOptions;
|
|
68
|
+
/**
|
|
69
|
+
* Optional pre-computed detection result. When provided, the selector
|
|
70
|
+
* skips `detectRendererTier()` and uses this directly. Useful when
|
|
71
|
+
* the caller cached the detection at app startup.
|
|
72
|
+
*/
|
|
73
|
+
readonly detection?: RendererTierResult;
|
|
74
|
+
/**
|
|
75
|
+
* Optional floor — refuse to select a backend below this tier even
|
|
76
|
+
* if a lower-tier factory is registered. Used by features that need
|
|
77
|
+
* GPU compute (`minimum: 'webgl2'`). When the floor can't be met,
|
|
78
|
+
* the result has `tier: 'none'` and `factory: null`.
|
|
79
|
+
*/
|
|
80
|
+
readonly minimum?: RendererTier;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Pick the highest registered backend at or below the detected tier
|
|
84
|
+
* (and at or above the optional minimum). Pure-data.
|
|
85
|
+
*
|
|
86
|
+
* const sel = selectBackend({
|
|
87
|
+
* registry: { webgpu: makeGpu, webgl2: makeGl2, canvas2d: makeC2d },
|
|
88
|
+
* })
|
|
89
|
+
* if (sel.factory === null) throw new Error('no renderer')
|
|
90
|
+
* const renderer = sel.factory()
|
|
91
|
+
*
|
|
92
|
+
* Telemetry pattern:
|
|
93
|
+
*
|
|
94
|
+
* if (sel.tier !== sel.detection.tier) {
|
|
95
|
+
* log('renderer downgrade', sel.detection.tier, '→', sel.tier, sel.reason)
|
|
96
|
+
* }
|
|
97
|
+
*/
|
|
98
|
+
export declare function selectBackend<T = unknown>(opts: SelectBackendOptions<T>): BackendSelection<T>;
|
|
99
|
+
/**
|
|
100
|
+
* Strict variant: throws `KLineChartError('INVALID_STATE')` if no factory
|
|
101
|
+
* could be selected. Use when a renderable backend is mandatory.
|
|
102
|
+
*/
|
|
103
|
+
export declare function selectBackendOrThrow<T = unknown>(opts: SelectBackendOptions<T>): BackendSelection<T> & {
|
|
104
|
+
factory: BackendFactory<T>;
|
|
105
|
+
};
|
|
106
|
+
//# sourceMappingURL=selectBackend.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"selectBackend.d.ts","sourceRoot":"","sources":["../../src/renderer-tier/selectBackend.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAGH,OAAO,EAEH,KAAK,yBAAyB,EAC9B,KAAK,YAAY,EACjB,KAAK,kBAAkB,EAC1B,MAAM,SAAS,CAAA;AAOhB;;;;GAIG;AACH,MAAM,MAAM,cAAc,CAAC,CAAC,GAAG,OAAO,IAAI,MAAM,CAAC,CAAA;AAEjD;;;;;;GAMG;AACH,MAAM,MAAM,eAAe,CAAC,CAAC,GAAG,OAAO,IAAI,OAAO,CAC9C,MAAM,CAAC,OAAO,CAAC,YAAY,EAAE,MAAM,CAAC,EAAE,cAAc,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAClE,CAAA;AAED;;;;;;GAMG;AACH,MAAM,WAAW,gBAAgB,CAAC,CAAC,GAAG,OAAO;IACzC,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAA;IAC3B,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC,GAAG,IAAI,CAAA;IAC1C,QAAQ,CAAC,aAAa,EAAE,aAAa,CAAC,YAAY,CAAC,CAAA;IACnD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB;;;;OAIG;IACH,QAAQ,CAAC,SAAS,EAAE,kBAAkB,CAAA;CACzC;AAED,MAAM,WAAW,oBAAoB,CAAC,CAAC,GAAG,OAAO;IAC7C,QAAQ,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC,CAAC,CAAA;IACrC;;;OAGG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,yBAAyB,CAAA;IAC3C;;;;OAIG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,kBAAkB,CAAA;IACvC;;;;;OAKG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,YAAY,CAAA;CAClC;AAYD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,aAAa,CAAC,CAAC,GAAG,OAAO,EACrC,IAAI,EAAE,oBAAoB,CAAC,CAAC,CAAC,GAC9B,gBAAgB,CAAC,CAAC,CAAC,CAuDrB;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,CAAC,GAAG,OAAO,EAC5C,IAAI,EAAE,oBAAoB,CAAC,CAAC,CAAC,GAC9B,gBAAgB,CAAC,CAAC,CAAC,GAAG;IAAE,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC,CAAA;CAAE,CAStD"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Renderer backend selector — bridges the tier-detection layer
|
|
3
|
+
* ({@link detectRendererTier}) to the actual backend factory the
|
|
4
|
+
* `Renderer` interface will instantiate.
|
|
5
|
+
*
|
|
6
|
+
* Why this exists separately from {@link detectRendererTier}:
|
|
7
|
+
*
|
|
8
|
+
* - Detection answers "what's *possible*?".
|
|
9
|
+
* - Selection answers "what's *registered* and matches what's possible?".
|
|
10
|
+
*
|
|
11
|
+
* In practice the answers diverge. A consumer can:
|
|
12
|
+
*
|
|
13
|
+
* (a) Choose to omit a backend they don't want to ship (e.g. drop the
|
|
14
|
+
* WebGPU backend to save bundle size; the selector then falls
|
|
15
|
+
* through to WebGL2 even when the host supports WebGPU).
|
|
16
|
+
* (b) Override a backend for a specific tier (e.g. inject a Canvas2D
|
|
17
|
+
* backend stub during tests, so the chart still renders headless).
|
|
18
|
+
*
|
|
19
|
+
* Both shapes need a *structural* fallback chain, not just "give me the
|
|
20
|
+
* factory for the detected tier". This module formalises that chain so
|
|
21
|
+
* the wiring is consistent across React, Vue, Angular, and any future
|
|
22
|
+
* adapter.
|
|
23
|
+
*
|
|
24
|
+
* Pure data: no DOM, no async, no side effects. The returned factory is
|
|
25
|
+
* just the function the caller registered.
|
|
26
|
+
*/
|
|
27
|
+
import { KLineChartError } from '../errors';
|
|
28
|
+
import { RENDERER_TIER_RANK, } from './types';
|
|
29
|
+
import { detectRendererTier, isTierAtLeast } from './detectRendererTier';
|
|
30
|
+
// ---------------------------------------------------------------------------
|
|
31
|
+
// Selection
|
|
32
|
+
// ---------------------------------------------------------------------------
|
|
33
|
+
const SEARCH_ORDER = [
|
|
34
|
+
'webgpu',
|
|
35
|
+
'webgl2',
|
|
36
|
+
'canvas2d',
|
|
37
|
+
];
|
|
38
|
+
/**
|
|
39
|
+
* Pick the highest registered backend at or below the detected tier
|
|
40
|
+
* (and at or above the optional minimum). Pure-data.
|
|
41
|
+
*
|
|
42
|
+
* const sel = selectBackend({
|
|
43
|
+
* registry: { webgpu: makeGpu, webgl2: makeGl2, canvas2d: makeC2d },
|
|
44
|
+
* })
|
|
45
|
+
* if (sel.factory === null) throw new Error('no renderer')
|
|
46
|
+
* const renderer = sel.factory()
|
|
47
|
+
*
|
|
48
|
+
* Telemetry pattern:
|
|
49
|
+
*
|
|
50
|
+
* if (sel.tier !== sel.detection.tier) {
|
|
51
|
+
* log('renderer downgrade', sel.detection.tier, '→', sel.tier, sel.reason)
|
|
52
|
+
* }
|
|
53
|
+
*/
|
|
54
|
+
export function selectBackend(opts) {
|
|
55
|
+
const detection = opts.detection ?? detectRendererTier(opts.detect);
|
|
56
|
+
const detectedTier = detection.tier;
|
|
57
|
+
const minimum = opts.minimum ?? 'none';
|
|
58
|
+
// Validate the minimum is a known tier; reject 'none' as a minimum
|
|
59
|
+
// because a 'none' floor is meaningless — nothing can be below it.
|
|
60
|
+
if (!(minimum in RENDERER_TIER_RANK)) {
|
|
61
|
+
throw new KLineChartError('INVALID_PARAM', `selectBackend: minimum must be a RendererTier, got ${JSON.stringify(minimum)}`);
|
|
62
|
+
}
|
|
63
|
+
const chain = [];
|
|
64
|
+
// Search from the detected tier downwards through SEARCH_ORDER.
|
|
65
|
+
for (const candidate of SEARCH_ORDER) {
|
|
66
|
+
// Skip tiers above the detected ceiling.
|
|
67
|
+
if (RENDERER_TIER_RANK[candidate] > RENDERER_TIER_RANK[detectedTier]) {
|
|
68
|
+
continue;
|
|
69
|
+
}
|
|
70
|
+
chain.push(candidate);
|
|
71
|
+
// Skip below the configured minimum.
|
|
72
|
+
if (!isTierAtLeast(candidate, minimum)) {
|
|
73
|
+
// No further candidate will satisfy the minimum.
|
|
74
|
+
break;
|
|
75
|
+
}
|
|
76
|
+
const factory = opts.registry[candidate] ?? null;
|
|
77
|
+
if (factory !== null) {
|
|
78
|
+
return {
|
|
79
|
+
tier: candidate,
|
|
80
|
+
factory,
|
|
81
|
+
fallbackChain: chain,
|
|
82
|
+
reason: candidate === detectedTier
|
|
83
|
+
? `direct match: detected ${candidate} and ${candidate} backend is registered`
|
|
84
|
+
: `downgrade: detected ${detectedTier}, but only ${candidate} backend is registered`,
|
|
85
|
+
detection,
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
return {
|
|
90
|
+
tier: 'none',
|
|
91
|
+
factory: null,
|
|
92
|
+
fallbackChain: chain,
|
|
93
|
+
reason: detectedTier === 'none'
|
|
94
|
+
? `host has no renderable tier`
|
|
95
|
+
: `no registered backend at or below detected ${detectedTier}` +
|
|
96
|
+
(opts.minimum !== undefined && opts.minimum !== 'none'
|
|
97
|
+
? ` (minimum=${opts.minimum})`
|
|
98
|
+
: ''),
|
|
99
|
+
detection,
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Strict variant: throws `KLineChartError('INVALID_STATE')` if no factory
|
|
104
|
+
* could be selected. Use when a renderable backend is mandatory.
|
|
105
|
+
*/
|
|
106
|
+
export function selectBackendOrThrow(opts) {
|
|
107
|
+
const sel = selectBackend(opts);
|
|
108
|
+
if (sel.factory === null) {
|
|
109
|
+
throw new KLineChartError('INVALID_STATE', `selectBackendOrThrow: ${sel.reason}`);
|
|
110
|
+
}
|
|
111
|
+
return sel;
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=selectBackend.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"selectBackend.js","sourceRoot":"","sources":["../../src/renderer-tier/selectBackend.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAA;AAC3C,OAAO,EACH,kBAAkB,GAIrB,MAAM,SAAS,CAAA;AAChB,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AAkExE,8EAA8E;AAC9E,YAAY;AACZ,8EAA8E;AAE9E,MAAM,YAAY,GAAiD;IAC/D,QAAQ;IACR,QAAQ;IACR,UAAU;CACb,CAAA;AAED;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,aAAa,CACzB,IAA6B;IAE7B,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,kBAAkB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IACnE,MAAM,YAAY,GAAG,SAAS,CAAC,IAAI,CAAA;IACnC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,MAAM,CAAA;IAEtC,mEAAmE;IACnE,mEAAmE;IACnE,IAAI,CAAC,CAAC,OAAO,IAAI,kBAAkB,CAAC,EAAE,CAAC;QACnC,MAAM,IAAI,eAAe,CACrB,eAAe,EACf,sDAAsD,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAClF,CAAA;IACL,CAAC;IAED,MAAM,KAAK,GAAmB,EAAE,CAAA;IAChC,gEAAgE;IAChE,KAAK,MAAM,SAAS,IAAI,YAAY,EAAE,CAAC;QACnC,yCAAyC;QACzC,IAAI,kBAAkB,CAAC,SAAS,CAAC,GAAG,kBAAkB,CAAC,YAAY,CAAC,EAAE,CAAC;YACnE,SAAQ;QACZ,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;QACrB,qCAAqC;QACrC,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE,OAAO,CAAC,EAAE,CAAC;YACrC,iDAAiD;YACjD,MAAK;QACT,CAAC;QACD,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,IAAI,CAAA;QAChD,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;YACnB,OAAO;gBACH,IAAI,EAAE,SAAS;gBACf,OAAO;gBACP,aAAa,EAAE,KAAK;gBACpB,MAAM,EACF,SAAS,KAAK,YAAY;oBACtB,CAAC,CAAC,0BAA0B,SAAS,QAAQ,SAAS,wBAAwB;oBAC9E,CAAC,CAAC,uBAAuB,YAAY,cAAc,SAAS,wBAAwB;gBAC5F,SAAS;aACZ,CAAA;QACL,CAAC;IACL,CAAC;IAED,OAAO;QACH,IAAI,EAAE,MAAM;QACZ,OAAO,EAAE,IAAI;QACb,aAAa,EAAE,KAAK;QACpB,MAAM,EACF,YAAY,KAAK,MAAM;YACnB,CAAC,CAAC,6BAA6B;YAC/B,CAAC,CAAC,8CAA8C,YAAY,EAAE;gBAC5D,CAAC,IAAI,CAAC,OAAO,KAAK,SAAS,IAAI,IAAI,CAAC,OAAO,KAAK,MAAM;oBAClD,CAAC,CAAC,aAAa,IAAI,CAAC,OAAO,GAAG;oBAC9B,CAAC,CAAC,EAAE,CAAC;QACnB,SAAS;KACZ,CAAA;AACL,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAChC,IAA6B;IAE7B,MAAM,GAAG,GAAG,aAAa,CAAC,IAAI,CAAC,CAAA;IAC/B,IAAI,GAAG,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;QACvB,MAAM,IAAI,eAAe,CACrB,eAAe,EACf,yBAAyB,GAAG,CAAC,MAAM,EAAE,CACxC,CAAA;IACL,CAAC;IACD,OAAO,GAA2D,CAAA;AACtE,CAAC"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Renderer tier types.
|
|
3
|
+
*
|
|
4
|
+
* `RendererTier` is a totally-ordered enum (`'webgpu' > 'webgl2' >
|
|
5
|
+
* 'canvas2d' > 'none'`). Consumers pick the highest tier the host
|
|
6
|
+
* environment supports and configure the {@link Renderer} accordingly.
|
|
7
|
+
*
|
|
8
|
+
* Why a string union (not a numeric enum):
|
|
9
|
+
* - Logs and analytics stay human-readable.
|
|
10
|
+
* - Tree-shakable; no runtime enum object.
|
|
11
|
+
* - Cross-package safe — string equality survives serialization
|
|
12
|
+
* and avoids the "two enum copies don't compare" footgun.
|
|
13
|
+
*/
|
|
14
|
+
export type RendererTier = 'webgpu' | 'webgl2' | 'canvas2d' | 'none';
|
|
15
|
+
/**
|
|
16
|
+
* Numeric rank used for `compareRendererTier`. Higher = better.
|
|
17
|
+
* Exposed so consumers can write their own "at least X" guards.
|
|
18
|
+
*/
|
|
19
|
+
export declare const RENDERER_TIER_RANK: Readonly<Record<RendererTier, number>>;
|
|
20
|
+
/**
|
|
21
|
+
* Detection result. `tier` is the picked tier; `reason` is a one-line
|
|
22
|
+
* human-readable explanation (intended for diagnostics, not for
|
|
23
|
+
* branching — branch on `tier`).
|
|
24
|
+
*
|
|
25
|
+
* `tried` enumerates the tiers probed in order — useful when reporting
|
|
26
|
+
* "we wanted WebGPU but it threw" telemetry.
|
|
27
|
+
*/
|
|
28
|
+
export interface RendererTierResult {
|
|
29
|
+
readonly tier: RendererTier;
|
|
30
|
+
readonly reason: string;
|
|
31
|
+
readonly tried: ReadonlyArray<RendererTier>;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Probe injection — the unit tests use this to simulate every tier
|
|
35
|
+
* combination without poking globals. Production code passes nothing
|
|
36
|
+
* and the real `globalThis` probes run.
|
|
37
|
+
*
|
|
38
|
+
* Each probe returns `true` when the tier is detected, `false` when
|
|
39
|
+
* it is conclusively unavailable. Throwing is treated as "unavailable"
|
|
40
|
+
* with the message folded into `reason`.
|
|
41
|
+
*/
|
|
42
|
+
export interface RendererTierProbes {
|
|
43
|
+
readonly webgpu?: () => boolean;
|
|
44
|
+
readonly webgl2?: () => boolean;
|
|
45
|
+
readonly canvas2d?: () => boolean;
|
|
46
|
+
}
|
|
47
|
+
export interface DetectRendererTierOptions {
|
|
48
|
+
readonly probes?: RendererTierProbes;
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/renderer-tier/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,QAAQ,GAAG,UAAU,GAAG,MAAM,CAAA;AAEpE;;;GAGG;AACH,eAAO,MAAM,kBAAkB,EAAE,QAAQ,CAAC,MAAM,CAAC,YAAY,EAAE,MAAM,CAAC,CAKrE,CAAA;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,kBAAkB;IAC/B,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAA;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC,YAAY,CAAC,CAAA;CAC9C;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,kBAAkB;IAC/B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,OAAO,CAAA;IAC/B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,OAAO,CAAA;IAC/B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,OAAO,CAAA;CACpC;AAED,MAAM,WAAW,yBAAyB;IACtC,QAAQ,CAAC,MAAM,CAAC,EAAE,kBAAkB,CAAA;CACvC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Renderer tier types.
|
|
3
|
+
*
|
|
4
|
+
* `RendererTier` is a totally-ordered enum (`'webgpu' > 'webgl2' >
|
|
5
|
+
* 'canvas2d' > 'none'`). Consumers pick the highest tier the host
|
|
6
|
+
* environment supports and configure the {@link Renderer} accordingly.
|
|
7
|
+
*
|
|
8
|
+
* Why a string union (not a numeric enum):
|
|
9
|
+
* - Logs and analytics stay human-readable.
|
|
10
|
+
* - Tree-shakable; no runtime enum object.
|
|
11
|
+
* - Cross-package safe — string equality survives serialization
|
|
12
|
+
* and avoids the "two enum copies don't compare" footgun.
|
|
13
|
+
*/
|
|
14
|
+
/**
|
|
15
|
+
* Numeric rank used for `compareRendererTier`. Higher = better.
|
|
16
|
+
* Exposed so consumers can write their own "at least X" guards.
|
|
17
|
+
*/
|
|
18
|
+
export const RENDERER_TIER_RANK = {
|
|
19
|
+
webgpu: 3,
|
|
20
|
+
webgl2: 2,
|
|
21
|
+
canvas2d: 1,
|
|
22
|
+
none: 0,
|
|
23
|
+
};
|
|
24
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/renderer-tier/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAIH;;;GAGG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAA2C;IACtE,MAAM,EAAE,CAAC;IACT,MAAM,EAAE,CAAC;IACT,QAAQ,EAAE,CAAC;IACX,IAAI,EAAE,CAAC;CACV,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createReplayController.d.ts","sourceRoot":"","sources":["../../src/replay/createReplayController.ts"],"names":[],"mappings":"AAyBA,OAAO,KAAK,EACR,gBAAgB,EAChB,oBAAoB,EAIvB,MAAM,SAAS,CAAA;AAwDhB,wBAAgB,sBAAsB,CAClC,IAAI,CAAC,EAAE,oBAAoB,GAC5B,gBAAgB,CAoNlB"}
|
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
import { KLineChartError } from '../errors';
|
|
2
|
+
/**
|
|
3
|
+
* createReplayController — framework-agnostic Bar Replay state machine.
|
|
4
|
+
*
|
|
5
|
+
* Owns: position, mode, pacing, speed, [start, end] range.
|
|
6
|
+
* Doesn't own: the data series, the calendar, the frame loop. Those are
|
|
7
|
+
* supplied by the surrounding chart adapter.
|
|
8
|
+
*
|
|
9
|
+
* Why we expose it via a single `state` signal (rather than five separate
|
|
10
|
+
* signals): every replay mutation is a transaction over the playhead — the
|
|
11
|
+
* mode flip on auto-pause, the clamp on `setRange`, etc. Emitting a single
|
|
12
|
+
* snapshot keeps subscribers (React/Vue) from rendering intermediate states.
|
|
13
|
+
*
|
|
14
|
+
* Open design question (deferred from v1):
|
|
15
|
+
* Should "reverse play" (speed < 0) be supported in v2?
|
|
16
|
+
* The cleanest extension is to drop the `speed <= 0` guard, accept negative
|
|
17
|
+
* multipliers in `tick()` math (already symmetric), and add an
|
|
18
|
+
* `autoStartReached` clamp that mirrors `autoEndReached`. The on-disk
|
|
19
|
+
* contract (the `ReplayState` shape) does not need to change. We defer it
|
|
20
|
+
* because reverse playback is meaningless for live-data sessions and the
|
|
21
|
+
* indicator runtime currently assumes monotonic time — flipping that
|
|
22
|
+
* assumption is a larger cross-package change than this PR.
|
|
23
|
+
*/
|
|
24
|
+
import { createSignal } from '../reactivity/signal';
|
|
25
|
+
// ---------------------------------------------------------------------------
|
|
26
|
+
// Constants
|
|
27
|
+
// ---------------------------------------------------------------------------
|
|
28
|
+
/** Default bar interval used by wall-clock pacing when the host did not
|
|
29
|
+
* supply one via `init.barIntervalMs`. Picked to match the most common
|
|
30
|
+
* intraday chart (1-minute bars). */
|
|
31
|
+
const DEFAULT_BAR_INTERVAL_MS = 60_000;
|
|
32
|
+
/** For `tick` pacing, this is the nominal wall-time spent on one bar at
|
|
33
|
+
* speed=1. 100ms means a 60-bar tick replay takes 6 seconds at 1x — fast
|
|
34
|
+
* enough to feel like "tick playback", slow enough to follow visually. */
|
|
35
|
+
const TICK_PACING_MS_PER_BAR = 100;
|
|
36
|
+
// ---------------------------------------------------------------------------
|
|
37
|
+
// Helpers
|
|
38
|
+
// ---------------------------------------------------------------------------
|
|
39
|
+
function clamp(value, lo, hi) {
|
|
40
|
+
if (value < lo)
|
|
41
|
+
return lo;
|
|
42
|
+
if (value > hi)
|
|
43
|
+
return hi;
|
|
44
|
+
return value;
|
|
45
|
+
}
|
|
46
|
+
function assertValidRange(start, end) {
|
|
47
|
+
if (!Number.isFinite(start) || !Number.isFinite(end)) {
|
|
48
|
+
throw new KLineChartError('REPLAY_CONFIG_INVALID', `Replay range must be finite numbers: got start=${String(start)}, end=${String(end)}`);
|
|
49
|
+
}
|
|
50
|
+
if (end < start) {
|
|
51
|
+
throw new KLineChartError('REPLAY_CONFIG_INVALID', `Replay range end (${end}) must be >= start (${start})`);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
function assertValidSpeed(speed) {
|
|
55
|
+
if (!Number.isFinite(speed) || speed <= 0) {
|
|
56
|
+
// Reverse playback (negative speed) is deliberately rejected in v1.
|
|
57
|
+
// See the header comment for the extension path.
|
|
58
|
+
throw new KLineChartError('REPLAY_CONFIG_INVALID', `Replay speed must be a positive finite number; got ${String(speed)}`);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
// ---------------------------------------------------------------------------
|
|
62
|
+
// Factory
|
|
63
|
+
// ---------------------------------------------------------------------------
|
|
64
|
+
export function createReplayController(init) {
|
|
65
|
+
// -------------------------------------------------------------------
|
|
66
|
+
// Initial state — validate eagerly so misconfiguration surfaces at
|
|
67
|
+
// construction rather than on first tick.
|
|
68
|
+
// -------------------------------------------------------------------
|
|
69
|
+
const start = init?.start ?? 0;
|
|
70
|
+
const end = init?.end ?? 0;
|
|
71
|
+
assertValidRange(start, end);
|
|
72
|
+
const pacing = init?.pacing ?? 'bar';
|
|
73
|
+
const speed = init?.speed ?? 1;
|
|
74
|
+
assertValidSpeed(speed);
|
|
75
|
+
let barIntervalMs = init?.barIntervalMs ?? DEFAULT_BAR_INTERVAL_MS;
|
|
76
|
+
if (!Number.isFinite(barIntervalMs) || barIntervalMs <= 0) {
|
|
77
|
+
throw new KLineChartError('REPLAY_CONFIG_INVALID', `barIntervalMs must be a positive finite number; got ${String(barIntervalMs)}`);
|
|
78
|
+
}
|
|
79
|
+
const state = createSignal({
|
|
80
|
+
position: start,
|
|
81
|
+
start,
|
|
82
|
+
end,
|
|
83
|
+
mode: 'paused',
|
|
84
|
+
pacing,
|
|
85
|
+
speed,
|
|
86
|
+
});
|
|
87
|
+
// -------------------------------------------------------------------
|
|
88
|
+
// Internal commit helper. All mutations funnel through here so the
|
|
89
|
+
// immutability invariant and auto-pause check live in one place.
|
|
90
|
+
// -------------------------------------------------------------------
|
|
91
|
+
function commit(patch) {
|
|
92
|
+
const prev = state.peek();
|
|
93
|
+
const next = { ...prev, ...patch };
|
|
94
|
+
// Re-clamp position whenever it or the range changed.
|
|
95
|
+
if (patch.position !== undefined ||
|
|
96
|
+
patch.start !== undefined ||
|
|
97
|
+
patch.end !== undefined) {
|
|
98
|
+
next.position = clamp(next.position, next.start, next.end);
|
|
99
|
+
}
|
|
100
|
+
// Auto-pause when the playhead arrives at the right edge while
|
|
101
|
+
// playing. This is the natural end-of-tape transition; without it,
|
|
102
|
+
// the frame loop would happily tick forever against a clamped
|
|
103
|
+
// value and waste battery.
|
|
104
|
+
if (next.mode === 'playing' && next.position >= next.end) {
|
|
105
|
+
next.position = next.end;
|
|
106
|
+
next.mode = 'paused';
|
|
107
|
+
}
|
|
108
|
+
// Object.is short-circuits identical structural snapshots so a
|
|
109
|
+
// no-op commit (e.g. seekTo(currentPosition)) doesn't notify.
|
|
110
|
+
if (prev.position === next.position &&
|
|
111
|
+
prev.start === next.start &&
|
|
112
|
+
prev.end === next.end &&
|
|
113
|
+
prev.mode === next.mode &&
|
|
114
|
+
prev.pacing === next.pacing &&
|
|
115
|
+
prev.speed === next.speed) {
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
state.set(next);
|
|
119
|
+
}
|
|
120
|
+
// -------------------------------------------------------------------
|
|
121
|
+
// Public mutators
|
|
122
|
+
// -------------------------------------------------------------------
|
|
123
|
+
function setRange(nextStart, nextEnd) {
|
|
124
|
+
assertValidRange(nextStart, nextEnd);
|
|
125
|
+
commit({ start: nextStart, end: nextEnd });
|
|
126
|
+
}
|
|
127
|
+
function seekTo(position) {
|
|
128
|
+
if (!Number.isFinite(position))
|
|
129
|
+
return;
|
|
130
|
+
commit({ position });
|
|
131
|
+
}
|
|
132
|
+
function seekBy(delta) {
|
|
133
|
+
if (!Number.isFinite(delta))
|
|
134
|
+
return;
|
|
135
|
+
const cur = state.peek().position;
|
|
136
|
+
commit({ position: cur + delta });
|
|
137
|
+
}
|
|
138
|
+
function stepForward() {
|
|
139
|
+
seekBy(1);
|
|
140
|
+
}
|
|
141
|
+
function stepBackward() {
|
|
142
|
+
seekBy(-1);
|
|
143
|
+
}
|
|
144
|
+
function play() {
|
|
145
|
+
const cur = state.peek();
|
|
146
|
+
// If we're already at the end, calling play() should not flip to
|
|
147
|
+
// 'playing' only to immediately auto-pause — that would be a
|
|
148
|
+
// confusing observable transition for subscribers. Stay paused.
|
|
149
|
+
if (cur.position >= cur.end)
|
|
150
|
+
return;
|
|
151
|
+
commit({ mode: 'playing' });
|
|
152
|
+
}
|
|
153
|
+
function pause() {
|
|
154
|
+
commit({ mode: 'paused' });
|
|
155
|
+
}
|
|
156
|
+
function toggle() {
|
|
157
|
+
const cur = state.peek();
|
|
158
|
+
if (cur.mode === 'playing') {
|
|
159
|
+
pause();
|
|
160
|
+
}
|
|
161
|
+
else {
|
|
162
|
+
play();
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
function setPacing(p) {
|
|
166
|
+
commit({ pacing: p });
|
|
167
|
+
}
|
|
168
|
+
function setSpeed(s) {
|
|
169
|
+
assertValidSpeed(s);
|
|
170
|
+
commit({ speed: s });
|
|
171
|
+
}
|
|
172
|
+
// -------------------------------------------------------------------
|
|
173
|
+
// Frame-loop driver
|
|
174
|
+
//
|
|
175
|
+
// `tick()` is deliberately stateless w.r.t. internal clock
|
|
176
|
+
// accumulation: each call applies the full advance derived from
|
|
177
|
+
// `deltaMs` directly to `position`. We DO carry fractional position
|
|
178
|
+
// values forward through the signal itself, so sub-bar progress is
|
|
179
|
+
// visible to subscribers (useful for smooth scrubbing animations and
|
|
180
|
+
// for sub-bar interpolation in the renderer).
|
|
181
|
+
//
|
|
182
|
+
// Rationale: a stateful internal accumulator would hide state from
|
|
183
|
+
// the signal, defeating the "fully observable" property that
|
|
184
|
+
// distinguishes us from TradingView. Anyone driving the controller
|
|
185
|
+
// can save/restore the entire replay session by snapshotting the
|
|
186
|
+
// state signal — no hidden bookkeeping.
|
|
187
|
+
// -------------------------------------------------------------------
|
|
188
|
+
function tick(deltaMs) {
|
|
189
|
+
if (!Number.isFinite(deltaMs) || deltaMs <= 0)
|
|
190
|
+
return false;
|
|
191
|
+
const cur = state.peek();
|
|
192
|
+
if (cur.mode !== 'playing')
|
|
193
|
+
return false;
|
|
194
|
+
let advance = 0;
|
|
195
|
+
switch (cur.pacing) {
|
|
196
|
+
case 'bar':
|
|
197
|
+
// Bar pacing is keyboard-driven: tick() never auto-advances.
|
|
198
|
+
return false;
|
|
199
|
+
case 'wallclock':
|
|
200
|
+
advance = (deltaMs / barIntervalMs) * cur.speed;
|
|
201
|
+
break;
|
|
202
|
+
case 'tick':
|
|
203
|
+
advance = (deltaMs / TICK_PACING_MS_PER_BAR) * cur.speed;
|
|
204
|
+
break;
|
|
205
|
+
}
|
|
206
|
+
if (advance === 0)
|
|
207
|
+
return false;
|
|
208
|
+
const prevPosition = cur.position;
|
|
209
|
+
commit({ position: cur.position + advance });
|
|
210
|
+
// commit() may have clamped or auto-paused; the only way position
|
|
211
|
+
// genuinely did not change is if we were already at end and the
|
|
212
|
+
// clamp swallowed the advance.
|
|
213
|
+
return state.peek().position !== prevPosition;
|
|
214
|
+
}
|
|
215
|
+
// -------------------------------------------------------------------
|
|
216
|
+
// Disposal — same guard pattern as createIndicatorSelectorController.
|
|
217
|
+
// -------------------------------------------------------------------
|
|
218
|
+
let disposed = false;
|
|
219
|
+
function dispose() {
|
|
220
|
+
if (disposed)
|
|
221
|
+
return;
|
|
222
|
+
disposed = true;
|
|
223
|
+
}
|
|
224
|
+
function guard(fn) {
|
|
225
|
+
return (...args) => {
|
|
226
|
+
if (disposed)
|
|
227
|
+
return undefined;
|
|
228
|
+
return fn(...args);
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
return {
|
|
232
|
+
state,
|
|
233
|
+
setRange: guard(setRange),
|
|
234
|
+
seekTo: guard(seekTo),
|
|
235
|
+
seekBy: guard(seekBy),
|
|
236
|
+
stepForward: guard(stepForward),
|
|
237
|
+
stepBackward: guard(stepBackward),
|
|
238
|
+
play: guard(play),
|
|
239
|
+
pause: guard(pause),
|
|
240
|
+
toggle: guard(toggle),
|
|
241
|
+
setPacing: guard(setPacing),
|
|
242
|
+
setSpeed: guard(setSpeed),
|
|
243
|
+
tick: ((deltaMs) => {
|
|
244
|
+
if (disposed)
|
|
245
|
+
return false;
|
|
246
|
+
return tick(deltaMs);
|
|
247
|
+
}),
|
|
248
|
+
dispose,
|
|
249
|
+
};
|
|
250
|
+
}
|
|
251
|
+
//# sourceMappingURL=createReplayController.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createReplayController.js","sourceRoot":"","sources":["../../src/replay/createReplayController.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export type { ReplayMode, ReplayPacing, ReplayState, ReplayController, ReplayControllerInit, CreateReplayController, } from './types';
|
|
2
|
+
export { createReplayController } from './createReplayController';
|
|
3
|
+
export { barIndexToTimestamp, timestampToBarIndex, inferBarIntervalMs, } from './timeline';
|
|
4
|
+
export type { BarCalendar } from './timeline';
|
|
5
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/replay/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACR,UAAU,EACV,YAAY,EACZ,WAAW,EACX,gBAAgB,EAChB,oBAAoB,EACpB,sBAAsB,GACzB,MAAM,SAAS,CAAA;AAChB,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAA;AACjE,OAAO,EACH,mBAAmB,EACnB,mBAAmB,EACnB,kBAAkB,GACrB,MAAM,YAAY,CAAA;AACnB,YAAY,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/replay/index.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAA;AACjE,OAAO,EACH,mBAAmB,EACnB,mBAAmB,EACnB,kBAAkB,GACrB,MAAM,YAAY,CAAA"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Timeline — bar-index ↔ timestamp navigation.
|
|
3
|
+
*
|
|
4
|
+
* A `BarCalendar` is the authoritative list of bar open-times in
|
|
5
|
+
* milliseconds. Real markets aren't uniformly spaced: there are weekend
|
|
6
|
+
* gaps, half-day holiday closes, exchange maintenance windows, etc. The
|
|
7
|
+
* timeline functions must honor those gaps exactly — bar N and bar N+1 can
|
|
8
|
+
* be 60 seconds apart on a Tuesday and three days apart Friday→Monday.
|
|
9
|
+
*
|
|
10
|
+
* Both functions are pure and total: out-of-range inputs return `null`
|
|
11
|
+
* instead of throwing. Callers (e.g. the replay controller, the crosshair
|
|
12
|
+
* tooltip) should treat `null` as "no data at that position".
|
|
13
|
+
*/
|
|
14
|
+
/** A monotonically-increasing list of bar open timestamps (ms since epoch).
|
|
15
|
+
* By convention `calendar[i]` is the open time of bar `i`. */
|
|
16
|
+
export type BarCalendar = ReadonlyArray<number>;
|
|
17
|
+
/**
|
|
18
|
+
* Look up the timestamp for an integer bar index.
|
|
19
|
+
*
|
|
20
|
+
* Fractional `barIndex` is floored — the timestamp returned is the
|
|
21
|
+
* open-time of the containing bar. (Callers that want intra-bar
|
|
22
|
+
* interpolation should do it themselves.)
|
|
23
|
+
*
|
|
24
|
+
* Returns `null` if the calendar is empty or the index is out of range.
|
|
25
|
+
*/
|
|
26
|
+
export declare function barIndexToTimestamp(calendar: BarCalendar, barIndex: number): number | null;
|
|
27
|
+
/**
|
|
28
|
+
* Look up the bar index that contains a given timestamp.
|
|
29
|
+
*
|
|
30
|
+
* Uses binary search; cost is O(log n). The returned index is the bar
|
|
31
|
+
* whose open-time is the largest value `<= ts`. This means a timestamp
|
|
32
|
+
* that falls inside a non-trading gap (e.g. Saturday) resolves to the
|
|
33
|
+
* last bar before the gap (Friday's close), which is the intuitive
|
|
34
|
+
* behavior for "scrub to this wall-clock time".
|
|
35
|
+
*
|
|
36
|
+
* Returns `null` if the calendar is empty or `ts` precedes the first bar.
|
|
37
|
+
*/
|
|
38
|
+
export declare function timestampToBarIndex(calendar: BarCalendar, ts: number): number | null;
|
|
39
|
+
/**
|
|
40
|
+
* Compute the dominant bar interval (in ms) from a calendar.
|
|
41
|
+
*
|
|
42
|
+
* Uses the median delta between successive bars, which is robust to
|
|
43
|
+
* weekend and holiday gaps that would skew a simple mean. Returns
|
|
44
|
+
* `null` if the calendar has fewer than two bars.
|
|
45
|
+
*
|
|
46
|
+
* The replay controller uses this when `barIntervalMs` is not configured
|
|
47
|
+
* but a calendar is available, so wall-clock pacing self-calibrates.
|
|
48
|
+
*/
|
|
49
|
+
export declare function inferBarIntervalMs(calendar: BarCalendar): number | null;
|
|
50
|
+
//# sourceMappingURL=timeline.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timeline.d.ts","sourceRoot":"","sources":["../../src/replay/timeline.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH;+DAC+D;AAC/D,MAAM,MAAM,WAAW,GAAG,aAAa,CAAC,MAAM,CAAC,CAAA;AAE/C;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAC/B,QAAQ,EAAE,WAAW,EACrB,QAAQ,EAAE,MAAM,GACjB,MAAM,GAAG,IAAI,CAOf;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,mBAAmB,CAC/B,QAAQ,EAAE,WAAW,EACrB,EAAE,EAAE,MAAM,GACX,MAAM,GAAG,IAAI,CAsBf;AAED;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,WAAW,GAAG,MAAM,GAAG,IAAI,CAkBvE"}
|