@chartgpu/chartgpu 0.2.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (273) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +208 -0
  3. package/dist/ChartGPU.d.ts +146 -0
  4. package/dist/ChartGPU.d.ts.map +1 -0
  5. package/dist/components/createAnnotationConfigDialog.d.ts +24 -0
  6. package/dist/components/createAnnotationConfigDialog.d.ts.map +1 -0
  7. package/dist/components/createDataZoomSlider.d.ts +14 -0
  8. package/dist/components/createDataZoomSlider.d.ts.map +1 -0
  9. package/dist/components/createLegend.d.ts +9 -0
  10. package/dist/components/createLegend.d.ts.map +1 -0
  11. package/dist/components/createTextOverlay.d.ts +17 -0
  12. package/dist/components/createTextOverlay.d.ts.map +1 -0
  13. package/dist/components/createTooltip.d.ts +12 -0
  14. package/dist/components/createTooltip.d.ts.map +1 -0
  15. package/dist/components/formatTooltip.d.ts +19 -0
  16. package/dist/components/formatTooltip.d.ts.map +1 -0
  17. package/dist/config/OptionResolver.d.ts +137 -0
  18. package/dist/config/OptionResolver.d.ts.map +1 -0
  19. package/dist/config/defaults.d.ts +56 -0
  20. package/dist/config/defaults.d.ts.map +1 -0
  21. package/dist/config/types.d.ts +553 -0
  22. package/dist/config/types.d.ts.map +1 -0
  23. package/dist/core/GPUContext.d.ts +242 -0
  24. package/dist/core/GPUContext.d.ts.map +1 -0
  25. package/dist/core/RenderScheduler.d.ts +174 -0
  26. package/dist/core/RenderScheduler.d.ts.map +1 -0
  27. package/dist/core/createAnimationController.d.ts +15 -0
  28. package/dist/core/createAnimationController.d.ts.map +1 -0
  29. package/dist/core/createRenderCoordinator.d.ts +78 -0
  30. package/dist/core/createRenderCoordinator.d.ts.map +1 -0
  31. package/dist/core/renderCoordinator/animation/animationHelpers.d.ts +183 -0
  32. package/dist/core/renderCoordinator/animation/animationHelpers.d.ts.map +1 -0
  33. package/dist/core/renderCoordinator/annotations/processAnnotations.d.ts +88 -0
  34. package/dist/core/renderCoordinator/annotations/processAnnotations.d.ts.map +1 -0
  35. package/dist/core/renderCoordinator/axis/axisLabelHelpers.d.ts +91 -0
  36. package/dist/core/renderCoordinator/axis/axisLabelHelpers.d.ts.map +1 -0
  37. package/dist/core/renderCoordinator/axis/computeAxisTicks.d.ts +53 -0
  38. package/dist/core/renderCoordinator/axis/computeAxisTicks.d.ts.map +1 -0
  39. package/dist/core/renderCoordinator/data/computeVisibleSlice.d.ts +66 -0
  40. package/dist/core/renderCoordinator/data/computeVisibleSlice.d.ts.map +1 -0
  41. package/dist/core/renderCoordinator/gpu/textureManager.d.ts +69 -0
  42. package/dist/core/renderCoordinator/gpu/textureManager.d.ts.map +1 -0
  43. package/dist/core/renderCoordinator/interaction/interactionHelpers.d.ts +160 -0
  44. package/dist/core/renderCoordinator/interaction/interactionHelpers.d.ts.map +1 -0
  45. package/dist/core/renderCoordinator/render/renderAnnotationLabels.d.ts +36 -0
  46. package/dist/core/renderCoordinator/render/renderAnnotationLabels.d.ts.map +1 -0
  47. package/dist/core/renderCoordinator/render/renderAxisLabels.d.ts +40 -0
  48. package/dist/core/renderCoordinator/render/renderAxisLabels.d.ts.map +1 -0
  49. package/dist/core/renderCoordinator/render/renderOverlays.d.ts +70 -0
  50. package/dist/core/renderCoordinator/render/renderOverlays.d.ts.map +1 -0
  51. package/dist/core/renderCoordinator/render/renderSeries.d.ts +146 -0
  52. package/dist/core/renderCoordinator/render/renderSeries.d.ts.map +1 -0
  53. package/dist/core/renderCoordinator/renderers/rendererPool.d.ts +112 -0
  54. package/dist/core/renderCoordinator/renderers/rendererPool.d.ts.map +1 -0
  55. package/dist/core/renderCoordinator/types.d.ts +19 -0
  56. package/dist/core/renderCoordinator/types.d.ts.map +1 -0
  57. package/dist/core/renderCoordinator/ui/tooltipLegendHelpers.d.ts +104 -0
  58. package/dist/core/renderCoordinator/ui/tooltipLegendHelpers.d.ts.map +1 -0
  59. package/dist/core/renderCoordinator/utils/axisUtils.d.ts +122 -0
  60. package/dist/core/renderCoordinator/utils/axisUtils.d.ts.map +1 -0
  61. package/dist/core/renderCoordinator/utils/boundsComputation.d.ts +69 -0
  62. package/dist/core/renderCoordinator/utils/boundsComputation.d.ts.map +1 -0
  63. package/dist/core/renderCoordinator/utils/canvasUtils.d.ts +52 -0
  64. package/dist/core/renderCoordinator/utils/canvasUtils.d.ts.map +1 -0
  65. package/dist/core/renderCoordinator/utils/dataPointUtils.d.ts +71 -0
  66. package/dist/core/renderCoordinator/utils/dataPointUtils.d.ts.map +1 -0
  67. package/dist/core/renderCoordinator/utils/index.d.ts +12 -0
  68. package/dist/core/renderCoordinator/utils/index.d.ts.map +1 -0
  69. package/dist/core/renderCoordinator/utils/timeAxisUtils.d.ts +149 -0
  70. package/dist/core/renderCoordinator/utils/timeAxisUtils.d.ts.map +1 -0
  71. package/dist/core/renderCoordinator/zoom/zoomHelpers.d.ts +129 -0
  72. package/dist/core/renderCoordinator/zoom/zoomHelpers.d.ts.map +1 -0
  73. package/dist/data/cartesianData.d.ts +72 -0
  74. package/dist/data/cartesianData.d.ts.map +1 -0
  75. package/dist/data/createDataStore.d.ts +27 -0
  76. package/dist/data/createDataStore.d.ts.map +1 -0
  77. package/dist/data/createStreamBuffer.d.ts +20 -0
  78. package/dist/data/createStreamBuffer.d.ts.map +1 -0
  79. package/dist/data/lttbSample.d.ts +5 -0
  80. package/dist/data/lttbSample.d.ts.map +1 -0
  81. package/dist/data/ohlcSample.d.ts +21 -0
  82. package/dist/data/ohlcSample.d.ts.map +1 -0
  83. package/dist/data/packDataPoints.d.ts +65 -0
  84. package/dist/data/packDataPoints.d.ts.map +1 -0
  85. package/dist/data/sampleSeries.d.ts +20 -0
  86. package/dist/data/sampleSeries.d.ts.map +1 -0
  87. package/dist/esm/ChartGPUWorkerController-B50J-8sx.js +772 -0
  88. package/dist/esm/ChartGPUWorkerController-B50J-8sx.js.map +1 -0
  89. package/dist/esm/OptionResolver-R_gJDRSD.js +7150 -0
  90. package/dist/esm/OptionResolver-R_gJDRSD.js.map +1 -0
  91. package/dist/esm/assets/worker-entry-Wg897auv.js +779 -0
  92. package/dist/esm/assets/worker-entry-Wg897auv.js.map +1 -0
  93. package/dist/esm/createChartInWorker-C4fEeJL8.js +1224 -0
  94. package/dist/esm/createChartInWorker-C4fEeJL8.js.map +1 -0
  95. package/dist/esm/index.js +795 -0
  96. package/dist/esm/index.js.map +1 -0
  97. package/dist/index.cjs +1270 -0
  98. package/dist/index.cjs.map +1 -0
  99. package/dist/index.d.ts +30 -0
  100. package/dist/index.d.ts.map +1 -0
  101. package/dist/index.js +10504 -0
  102. package/dist/index.js.map +1 -0
  103. package/dist/interaction/createAnnotationAuthoring.d.ts +115 -0
  104. package/dist/interaction/createAnnotationAuthoring.d.ts.map +1 -0
  105. package/dist/interaction/createAnnotationDragHandler.d.ts +28 -0
  106. package/dist/interaction/createAnnotationDragHandler.d.ts.map +1 -0
  107. package/dist/interaction/createAnnotationHitTester.d.ts +32 -0
  108. package/dist/interaction/createAnnotationHitTester.d.ts.map +1 -0
  109. package/dist/interaction/createChartSync.d.ts +27 -0
  110. package/dist/interaction/createChartSync.d.ts.map +1 -0
  111. package/dist/interaction/createEventManager.d.ts +24 -0
  112. package/dist/interaction/createEventManager.d.ts.map +1 -0
  113. package/dist/interaction/createHoverState.d.ts +20 -0
  114. package/dist/interaction/createHoverState.d.ts.map +1 -0
  115. package/dist/interaction/createInsideZoom.d.ts +14 -0
  116. package/dist/interaction/createInsideZoom.d.ts.map +1 -0
  117. package/dist/interaction/createZoomState.d.ts +63 -0
  118. package/dist/interaction/createZoomState.d.ts.map +1 -0
  119. package/dist/interaction/findCandlestick.d.ts +41 -0
  120. package/dist/interaction/findCandlestick.d.ts.map +1 -0
  121. package/dist/interaction/findNearestPoint.d.ts +61 -0
  122. package/dist/interaction/findNearestPoint.d.ts.map +1 -0
  123. package/dist/interaction/findPieSlice.d.ts +36 -0
  124. package/dist/interaction/findPieSlice.d.ts.map +1 -0
  125. package/dist/interaction/findPointsAtX.d.ts +37 -0
  126. package/dist/interaction/findPointsAtX.d.ts.map +1 -0
  127. package/dist/renderers/createAnnotationMarkerRenderer.d.ts +58 -0
  128. package/dist/renderers/createAnnotationMarkerRenderer.d.ts.map +1 -0
  129. package/dist/renderers/createAreaRenderer.d.ts +19 -0
  130. package/dist/renderers/createAreaRenderer.d.ts.map +1 -0
  131. package/dist/renderers/createAxisRenderer.d.ts +19 -0
  132. package/dist/renderers/createAxisRenderer.d.ts.map +1 -0
  133. package/dist/renderers/createBarRenderer.d.ts +20 -0
  134. package/dist/renderers/createBarRenderer.d.ts.map +1 -0
  135. package/dist/renderers/createCandlestickRenderer.d.ts +19 -0
  136. package/dist/renderers/createCandlestickRenderer.d.ts.map +1 -0
  137. package/dist/renderers/createCrosshairRenderer.d.ts +43 -0
  138. package/dist/renderers/createCrosshairRenderer.d.ts.map +1 -0
  139. package/dist/renderers/createGridRenderer.d.ts +45 -0
  140. package/dist/renderers/createGridRenderer.d.ts.map +1 -0
  141. package/dist/renderers/createHighlightRenderer.d.ts +41 -0
  142. package/dist/renderers/createHighlightRenderer.d.ts.map +1 -0
  143. package/dist/renderers/createLineRenderer.d.ts +18 -0
  144. package/dist/renderers/createLineRenderer.d.ts.map +1 -0
  145. package/dist/renderers/createPieRenderer.d.ts +18 -0
  146. package/dist/renderers/createPieRenderer.d.ts.map +1 -0
  147. package/dist/renderers/createReferenceLineRenderer.d.ts +81 -0
  148. package/dist/renderers/createReferenceLineRenderer.d.ts.map +1 -0
  149. package/dist/renderers/createScatterDensityRenderer.d.ts +14 -0
  150. package/dist/renderers/createScatterDensityRenderer.d.ts.map +1 -0
  151. package/dist/renderers/createScatterRenderer.d.ts +20 -0
  152. package/dist/renderers/createScatterRenderer.d.ts.map +1 -0
  153. package/dist/renderers/rendererUtils.d.ts +100 -0
  154. package/dist/renderers/rendererUtils.d.ts.map +1 -0
  155. package/dist/themes/darkTheme.d.ts +11 -0
  156. package/dist/themes/darkTheme.d.ts.map +1 -0
  157. package/dist/themes/index.d.ts +8 -0
  158. package/dist/themes/index.d.ts.map +1 -0
  159. package/dist/themes/lightTheme.d.ts +11 -0
  160. package/dist/themes/lightTheme.d.ts.map +1 -0
  161. package/dist/themes/types.d.ts +14 -0
  162. package/dist/themes/types.d.ts.map +1 -0
  163. package/dist/types/ChartGPU.d.ts +99 -0
  164. package/dist/types/ChartGPU.d.ts.map +1 -0
  165. package/dist/types/components/createDataZoomSlider.d.ts +14 -0
  166. package/dist/types/components/createDataZoomSlider.d.ts.map +1 -0
  167. package/dist/types/components/createLegend.d.ts +9 -0
  168. package/dist/types/components/createLegend.d.ts.map +1 -0
  169. package/dist/types/components/createTextOverlay.d.ts +17 -0
  170. package/dist/types/components/createTextOverlay.d.ts.map +1 -0
  171. package/dist/types/components/createTooltip.d.ts +12 -0
  172. package/dist/types/components/createTooltip.d.ts.map +1 -0
  173. package/dist/types/components/formatTooltip.d.ts +19 -0
  174. package/dist/types/components/formatTooltip.d.ts.map +1 -0
  175. package/dist/types/config/OptionResolver.d.ts +134 -0
  176. package/dist/types/config/OptionResolver.d.ts.map +1 -0
  177. package/dist/types/config/defaults.d.ts +55 -0
  178. package/dist/types/config/defaults.d.ts.map +1 -0
  179. package/dist/types/config/types.d.ts +485 -0
  180. package/dist/types/config/types.d.ts.map +1 -0
  181. package/dist/types/core/GPUContext.d.ts +242 -0
  182. package/dist/types/core/GPUContext.d.ts.map +1 -0
  183. package/dist/types/core/RenderScheduler.d.ts +174 -0
  184. package/dist/types/core/RenderScheduler.d.ts.map +1 -0
  185. package/dist/types/core/createAnimationController.d.ts +15 -0
  186. package/dist/types/core/createAnimationController.d.ts.map +1 -0
  187. package/dist/types/core/createRenderCoordinator.d.ts +129 -0
  188. package/dist/types/core/createRenderCoordinator.d.ts.map +1 -0
  189. package/dist/types/data/createDataStore.d.ts +33 -0
  190. package/dist/types/data/createDataStore.d.ts.map +1 -0
  191. package/dist/types/data/createStreamBuffer.d.ts +20 -0
  192. package/dist/types/data/createStreamBuffer.d.ts.map +1 -0
  193. package/dist/types/data/lttbSample.d.ts +5 -0
  194. package/dist/types/data/lttbSample.d.ts.map +1 -0
  195. package/dist/types/data/ohlcSample.d.ts +21 -0
  196. package/dist/types/data/ohlcSample.d.ts.map +1 -0
  197. package/dist/types/data/packDataPoints.d.ts +79 -0
  198. package/dist/types/data/packDataPoints.d.ts.map +1 -0
  199. package/dist/types/data/sampleSeries.d.ts +3 -0
  200. package/dist/types/data/sampleSeries.d.ts.map +1 -0
  201. package/dist/types/index.d.ts +35 -0
  202. package/dist/types/index.d.ts.map +1 -0
  203. package/dist/types/interaction/createChartSync.d.ts +12 -0
  204. package/dist/types/interaction/createChartSync.d.ts.map +1 -0
  205. package/dist/types/interaction/createEventManager.d.ts +24 -0
  206. package/dist/types/interaction/createEventManager.d.ts.map +1 -0
  207. package/dist/types/interaction/createHoverState.d.ts +20 -0
  208. package/dist/types/interaction/createHoverState.d.ts.map +1 -0
  209. package/dist/types/interaction/createInsideZoom.d.ts +14 -0
  210. package/dist/types/interaction/createInsideZoom.d.ts.map +1 -0
  211. package/dist/types/interaction/createZoomState.d.ts +63 -0
  212. package/dist/types/interaction/createZoomState.d.ts.map +1 -0
  213. package/dist/types/interaction/findCandlestick.d.ts +41 -0
  214. package/dist/types/interaction/findCandlestick.d.ts.map +1 -0
  215. package/dist/types/interaction/findNearestPoint.d.ts +61 -0
  216. package/dist/types/interaction/findNearestPoint.d.ts.map +1 -0
  217. package/dist/types/interaction/findPieSlice.d.ts +36 -0
  218. package/dist/types/interaction/findPieSlice.d.ts.map +1 -0
  219. package/dist/types/interaction/findPointsAtX.d.ts +37 -0
  220. package/dist/types/interaction/findPointsAtX.d.ts.map +1 -0
  221. package/dist/types/renderers/createAreaRenderer.d.ts +18 -0
  222. package/dist/types/renderers/createAreaRenderer.d.ts.map +1 -0
  223. package/dist/types/renderers/createAxisRenderer.d.ts +19 -0
  224. package/dist/types/renderers/createAxisRenderer.d.ts.map +1 -0
  225. package/dist/types/renderers/createBarRenderer.d.ts +20 -0
  226. package/dist/types/renderers/createBarRenderer.d.ts.map +1 -0
  227. package/dist/types/renderers/createCandlestickRenderer.d.ts +19 -0
  228. package/dist/types/renderers/createCandlestickRenderer.d.ts.map +1 -0
  229. package/dist/types/renderers/createCrosshairRenderer.d.ts +43 -0
  230. package/dist/types/renderers/createCrosshairRenderer.d.ts.map +1 -0
  231. package/dist/types/renderers/createGridRenderer.d.ts +45 -0
  232. package/dist/types/renderers/createGridRenderer.d.ts.map +1 -0
  233. package/dist/types/renderers/createHighlightRenderer.d.ts +41 -0
  234. package/dist/types/renderers/createHighlightRenderer.d.ts.map +1 -0
  235. package/dist/types/renderers/createLineRenderer.d.ts +18 -0
  236. package/dist/types/renderers/createLineRenderer.d.ts.map +1 -0
  237. package/dist/types/renderers/createPieRenderer.d.ts +18 -0
  238. package/dist/types/renderers/createPieRenderer.d.ts.map +1 -0
  239. package/dist/types/renderers/createScatterDensityRenderer.d.ts +14 -0
  240. package/dist/types/renderers/createScatterDensityRenderer.d.ts.map +1 -0
  241. package/dist/types/renderers/createScatterRenderer.d.ts +19 -0
  242. package/dist/types/renderers/createScatterRenderer.d.ts.map +1 -0
  243. package/dist/types/renderers/rendererUtils.d.ts +100 -0
  244. package/dist/types/renderers/rendererUtils.d.ts.map +1 -0
  245. package/dist/types/themes/darkTheme.d.ts +11 -0
  246. package/dist/types/themes/darkTheme.d.ts.map +1 -0
  247. package/dist/types/themes/index.d.ts +8 -0
  248. package/dist/types/themes/index.d.ts.map +1 -0
  249. package/dist/types/themes/lightTheme.d.ts +11 -0
  250. package/dist/types/themes/lightTheme.d.ts.map +1 -0
  251. package/dist/types/themes/types.d.ts +14 -0
  252. package/dist/types/themes/types.d.ts.map +1 -0
  253. package/dist/types/utils/axisLabelStyling.d.ts +27 -0
  254. package/dist/types/utils/axisLabelStyling.d.ts.map +1 -0
  255. package/dist/types/utils/checkWebGPU.d.ts +39 -0
  256. package/dist/types/utils/checkWebGPU.d.ts.map +1 -0
  257. package/dist/types/utils/colors.d.ts +14 -0
  258. package/dist/types/utils/colors.d.ts.map +1 -0
  259. package/dist/types/utils/easing.d.ts +9 -0
  260. package/dist/types/utils/easing.d.ts.map +1 -0
  261. package/dist/types/utils/scales.d.ts +79 -0
  262. package/dist/types/utils/scales.d.ts.map +1 -0
  263. package/dist/utils/axisLabelStyling.d.ts +20 -0
  264. package/dist/utils/axisLabelStyling.d.ts.map +1 -0
  265. package/dist/utils/checkWebGPU.d.ts +39 -0
  266. package/dist/utils/checkWebGPU.d.ts.map +1 -0
  267. package/dist/utils/colors.d.ts +14 -0
  268. package/dist/utils/colors.d.ts.map +1 -0
  269. package/dist/utils/easing.d.ts +9 -0
  270. package/dist/utils/easing.d.ts.map +1 -0
  271. package/dist/utils/scales.d.ts +79 -0
  272. package/dist/utils/scales.d.ts.map +1 -0
  273. package/package.json +64 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChartGPUWorkerController-B50J-8sx.js","sources":["../../src/worker/ChartGPUWorkerController.ts"],"sourcesContent":["/**\n * ChartGPUWorkerController - Worker-side chart instance manager\n * \n * Manages multiple chart instances via messages from the main thread.\n * Uses a class-based approach (acceptable exception for internal worker singleton managing mutable state).\n * \n * ## Performance Optimizations\n * \n * This implementation is optimized for high-frequency operations:\n * \n * 1. **Shared State Closures**: ChartInstanceState is captured in coordinator callbacks\n * to eliminate Map lookups in hot paths (onRequestRender called on every data update,\n * render loop at 60fps).\n * \n * 2. **Cached Render Loop**: Render callback caches coordinator and state references,\n * avoiding Map lookups on every frame (critical for 60fps performance).\n * \n * 3. **Optimized Deserialization**: deserializeDataPoints uses:\n * - Pre-allocated arrays (no dynamic resizing)\n * - Unrolled offset calculation in loop increment\n * - Early validation (fail fast)\n * \n * 4. **Reduced Branching**: Click handler uses early returns instead of nested conditionals,\n * improving branch prediction and reducing instruction pipeline stalls.\n * \n * 5. **Zero-Copy Data Transfer**: ArrayBuffers are transferred (not cloned) via postMessage,\n * eliminating serialization overhead for large datasets.\n * \n * 6. **Batch Validation**: appendDataBatch validates all items upfront before processing,\n * ensuring transactional behavior and avoiding partial updates on error.\n */\n\nimport type {\n WorkerInboundMessage,\n WorkerOutboundMessage,\n InitMessage,\n ResizeMessage,\n ErrorMessage,\n} from './protocol';\nimport type {\n DataPoint,\n OHLCDataPoint,\n ChartGPUOptions,\n PerformanceMetrics,\n PerformanceCapabilities,\n ExactFPS,\n Milliseconds,\n Bytes,\n FrameTimeStats,\n GPUTimingStats,\n MemoryStats,\n FrameDropStats,\n} from '../config/types';\nimport { createGPUContext, initializeGPUContext, destroyGPUContext, type GPUContextState } from '../core/GPUContext';\nimport { createRenderCoordinator, type RenderCoordinator } from '../core/createRenderCoordinator';\nimport { resolveOptionsForChart } from '../config/OptionResolver';\n\n/**\n * Circular buffer size for frame timestamps (120 frames = 2 seconds at 60fps).\n */\nconst FRAME_BUFFER_SIZE = 120;\n\n/**\n * Expected frame time at 60fps (16.67ms).\n */\nconst EXPECTED_FRAME_TIME_MS = 1000 / 60;\n\n/**\n * Frame drop threshold multiplier (1.5x expected frame time).\n */\nconst FRAME_DROP_THRESHOLD_MULTIPLIER = 1.5;\n\n/**\n * Performance tracking state for a chart instance.\n * Circular buffer pattern for exact FPS measurement.\n */\ninterface PerformanceTrackingState {\n frameTimestamps: Float64Array;\n frameTimestampIndex: number;\n frameTimestampCount: number;\n totalFrames: number;\n totalDroppedFrames: number;\n consecutiveDroppedFrames: number;\n lastDropTimestamp: number;\n startTime: number;\n lastFrameTime: number;\n \n // GPU timing (optional)\n gpuTimingEnabled: boolean;\n lastCPUTime: number;\n lastGPUTime: number;\n}\n\n/**\n * Mutable state flags for a chart instance.\n * Shared between ChartInstance and coordinator callbacks for optimal performance.\n */\ninterface ChartInstanceState {\n renderPending: boolean;\n disposed: boolean;\n deviceLost: boolean;\n performance: PerformanceTrackingState;\n}\n\n/**\n * Represents a chart instance managed by the worker.\n * Contains all state needed for rendering and interaction.\n */\ninterface ChartInstance {\n readonly chartId: string;\n gpuContext: GPUContextState;\n readonly coordinator: RenderCoordinator;\n readonly canvas: OffscreenCanvas;\n readonly renderChannel: MessageChannel;\n /** Shared mutable state (avoid Map lookups in hot paths) */\n readonly state: ChartInstanceState;\n}\n\n/**\n * Error codes for categorizing worker errors.\n */\ntype ErrorCode = 'WEBGPU_INIT_FAILED' | 'DEVICE_LOST' | 'RENDER_ERROR' | 'DATA_ERROR' | 'UNKNOWN';\n\n/**\n * Performance-optimized validation helper for seriesIndex.\n * Extracted to reduce code duplication and improve performance.\n * \n * @param seriesIndex - Series index to validate\n * @param context - Context string for error message\n * @throws {Error} If validation fails\n */\nfunction validateSeriesIndex(seriesIndex: number, context: string): void {\n if (!Number.isInteger(seriesIndex) || seriesIndex < 0) {\n throw new Error(`Invalid seriesIndex ${context}: ${seriesIndex}. Must be a non-negative integer.`);\n }\n}\n\n/**\n * Performance-optimized validation helper for pointCount.\n * Extracted to reduce code duplication and improve performance.\n * \n * @param pointCount - Point count to validate\n * @param context - Context string for error message\n * @throws {Error} If validation fails\n */\nfunction validatePointCount(pointCount: number, context: string): void {\n if (!Number.isInteger(pointCount) || pointCount < 0) {\n throw new Error(`Invalid pointCount ${context}: ${pointCount}. Must be a non-negative integer.`);\n }\n}\n\n/**\n * Performance-optimized error message extractor.\n * Reduces repeated instanceof checks in hot paths.\n * \n * @param error - Error object or value\n * @returns Tuple of [message, stack]\n */\nfunction extractErrorInfo(error: unknown): [string, string | undefined] {\n if (error instanceof Error) {\n return [error.message, error.stack];\n }\n return [String(error), undefined];\n}\n\n/**\n * ChartGPUWorkerController - Singleton worker-side controller.\n * \n * Manages multiple chart instances and handles message-based communication\n * with the main thread. Uses class-based approach as acceptable exception\n * for internal worker singleton managing mutable state.\n */\nexport class ChartGPUWorkerController {\n private readonly charts = new Map<string, ChartInstance>();\n private messageHandler: ((msg: WorkerOutboundMessage) => void) | null = null;\n\n /**\n * Registers a message handler to send outbound messages to the main thread.\n * \n * @param handler - Function to call when emitting messages to main thread\n */\n onMessage(handler: (msg: WorkerOutboundMessage) => void): void {\n this.messageHandler = handler;\n }\n\n /**\n * Main entry point for handling inbound messages from the main thread.\n * Routes messages to appropriate handlers with exhaustive type checking.\n * \n * @param msg - Inbound message from main thread\n */\n async handleMessage(msg: WorkerInboundMessage): Promise<void> {\n try {\n switch (msg.type) {\n case 'init':\n await this.initChart(msg);\n break;\n case 'setOption':\n this.handleSetOption(msg.chartId, msg.options);\n break;\n case 'appendData':\n this.handleAppendData(msg.chartId, msg.seriesIndex, msg.data, msg.pointCount, msg.stride);\n break;\n case 'appendDataBatch':\n this.handleAppendDataBatch(msg.chartId, msg.items);\n break;\n case 'resize':\n this.handleResize(msg.chartId, msg);\n break;\n case 'forwardPointerEvent':\n this.handlePointerEvent(msg.chartId, msg.event);\n break;\n case 'setZoomRange':\n this.handleSetZoomRange(msg.chartId, msg.start, msg.end);\n break;\n case 'setInteractionX':\n this.handleSetInteractionX(msg.chartId, msg.x, msg.source);\n break;\n case 'setAnimation':\n this.handleSetAnimation(msg.chartId, msg.enabled, msg.config);\n break;\n case 'setGPUTiming':\n this.handleSetGPUTiming(msg.chartId, msg.enabled);\n break;\n case 'dispose':\n this.disposeChart(msg.chartId);\n break;\n default:\n // Exhaustive type check - ensures we handle all message types\n const exhaustive: never = msg;\n this.emitError(\n '', // No chartId available for unknown message\n 'UNKNOWN',\n `Unknown message type: ${(exhaustive as any).type}`,\n 'handleMessage'\n );\n }\n } catch (error) {\n // Catch any unhandled errors and emit error message\n const chartId = 'chartId' in msg ? msg.chartId : '';\n // Performance: Use shared error extraction helper\n const [message, stack] = extractErrorInfo(error);\n \n this.emitError(chartId, 'UNKNOWN', message, 'handleMessage', stack);\n }\n }\n\n /**\n * Initializes a new chart instance with WebGPU context and render coordinator.\n * \n * @param msg - Init message containing canvas, options, and configuration\n */\n private async initChart(msg: InitMessage): Promise<void> {\n let renderChannel: MessageChannel | null = null;\n\n try {\n // Ensure chart doesn't already exist\n if (this.charts.has(msg.chartId)) {\n this.emitError(\n msg.chartId,\n 'UNKNOWN',\n `Chart with ID \"${msg.chartId}\" already exists`,\n 'init',\n undefined,\n msg.messageId\n );\n return;\n }\n\n // Validate devicePixelRatio\n if (msg.devicePixelRatio <= 0) {\n throw new Error(`Invalid devicePixelRatio: ${msg.devicePixelRatio}. Must be positive.`);\n }\n\n // Create GPU context with OffscreenCanvas\n const gpuOptions = {\n devicePixelRatio: msg.devicePixelRatio,\n powerPreference: msg.gpuOptions?.powerPreference,\n };\n const gpuContext = createGPUContext(msg.canvas, gpuOptions);\n let initializedContext = await initializeGPUContext(gpuContext);\n\n // Resolve chart options with slider bottom-space reservation\n const resolvedOptions = resolveOptionsForChart(msg.options);\n\n // Create MessageChannel for render scheduling\n renderChannel = new MessageChannel();\n \n // PERFORMANCE: Pre-create shared instance state that will be captured in coordinator callbacks\n // This avoids Map lookups in hot paths (onRequestRender called on every data update/zoom/resize)\n // CRITICAL: Must be declared BEFORE device.lost handler to avoid ReferenceError\n const performanceState: PerformanceTrackingState = {\n frameTimestamps: new Float64Array(FRAME_BUFFER_SIZE),\n frameTimestampIndex: 0,\n frameTimestampCount: 0,\n totalFrames: 0,\n totalDroppedFrames: 0,\n consecutiveDroppedFrames: 0,\n lastDropTimestamp: 0,\n startTime: performance.now(),\n lastFrameTime: 0,\n gpuTimingEnabled: false,\n lastCPUTime: 0,\n lastGPUTime: 0,\n };\n\n const state: ChartInstanceState = {\n renderPending: false,\n disposed: false,\n deviceLost: false,\n performance: performanceState,\n };\n\n // Set up early device loss monitoring (before coordinator creation)\n // This catches device loss during initialization\n // PERFORMANCE: Capture state reference to avoid Map lookup in device.lost handler\n if (initializedContext.device) {\n initializedContext.device.lost.then((info) => {\n state.deviceLost = true;\n this.emit({\n type: 'deviceLost',\n chartId: msg.chartId,\n reason: info.reason === 'destroyed' ? 'destroyed' : 'unknown',\n message: info.message || info.reason || 'Device lost during initialization',\n });\n }).catch(() => {\n // Ignore errors in device.lost promise (can occur if device is destroyed before lost promise resolves)\n });\n\n // Set up uncaptured error handler for GPU validation errors\n initializedContext.device.addEventListener('uncapturederror', (event: GPUUncapturedErrorEvent) => {\n const errorMessage = event.error instanceof GPUValidationError\n ? `WebGPU Validation Error: ${event.error.message}`\n : event.error instanceof GPUOutOfMemoryError\n ? `WebGPU Out of Memory: ${event.error.message}`\n : `WebGPU Error: ${event.error.message}`;\n \n this.emitError(msg.chartId, 'RENDER_ERROR', errorMessage, 'uncaptured_gpu_error');\n });\n }\n\n // Create render coordinator with worker-mode callbacks\n const coordinator = createRenderCoordinator(\n initializedContext,\n resolvedOptions,\n {\n // CRITICAL: Disable DOM overlays for worker mode\n domOverlays: false,\n\n // Request render via MessageChannel for efficient scheduling\n // PERFORMANCE: Use closure-captured state instead of Map lookup (critical for 60fps)\n // CRITICAL: Post to port2, listen on port1 (MessageChannel requires opposite ends)\n onRequestRender: () => {\n if (!state.renderPending && !state.disposed && renderChannel) {\n state.renderPending = true;\n renderChannel.port2.postMessage(null);\n }\n },\n\n // Emit tooltip updates to main thread for DOM rendering\n onTooltipUpdate: (data) => {\n this.emit({\n type: 'tooltipUpdate',\n chartId: msg.chartId,\n data,\n });\n \n // Derive hover state from tooltip data\n // Tooltip data contains all the info needed for hover events\n if (data && data.params.length > 0) {\n const firstParam = data.params[0];\n this.emit({\n type: 'hoverChange',\n chartId: msg.chartId,\n payload: {\n seriesIndex: firstParam.seriesIndex,\n dataIndex: firstParam.dataIndex,\n value: firstParam.value,\n x: data.x,\n y: data.y,\n },\n });\n } else {\n // Tooltip hidden = hover cleared\n this.emit({\n type: 'hoverChange',\n chartId: msg.chartId,\n payload: null,\n });\n }\n },\n\n // Emit legend updates to main thread\n onLegendUpdate: (items) => {\n this.emit({\n type: 'legendUpdate',\n chartId: msg.chartId,\n items,\n });\n },\n\n // Emit axis label updates to main thread\n onAxisLabelsUpdate: (xLabels, yLabels) => {\n this.emit({\n type: 'axisLabelsUpdate',\n chartId: msg.chartId,\n xLabels,\n yLabels,\n });\n },\n\n // Emit crosshair position to main thread\n onCrosshairMove: (x) => {\n // Only emit if crosshair is active (x is not null)\n // Note: source parameter is not provided by callback - it's tracked\n // separately when setInteractionX is called programmatically\n if (x !== null) {\n this.emit({\n type: 'crosshairMove',\n chartId: msg.chartId,\n x,\n });\n }\n },\n\n // Emit click events to main thread\n onClickData: (payload) => {\n // PERFORMANCE: Early return if no hit (most common case in sparse data)\n if (!payload.nearest && !payload.pieSlice && !payload.candlestick) {\n return;\n }\n \n // PERFORMANCE: Use early returns to avoid nested conditionals\n if (payload.nearest) {\n this.emit({\n type: 'click',\n chartId: msg.chartId,\n payload: {\n seriesIndex: payload.nearest.seriesIndex,\n dataIndex: payload.nearest.dataIndex,\n value: payload.nearest.point as readonly [number, number],\n x: payload.x,\n y: payload.y,\n },\n });\n return;\n }\n \n if (payload.pieSlice) {\n this.emit({\n type: 'click',\n chartId: msg.chartId,\n payload: {\n seriesIndex: payload.pieSlice.seriesIndex,\n dataIndex: payload.pieSlice.dataIndex,\n value: [payload.pieSlice.slice.value, 0] as readonly [number, number],\n x: payload.x,\n y: payload.y,\n },\n });\n return;\n }\n \n if (payload.candlestick) {\n this.emit({\n type: 'click',\n chartId: msg.chartId,\n payload: {\n seriesIndex: payload.candlestick.seriesIndex,\n dataIndex: payload.candlestick.dataIndex,\n value: payload.candlestick.point as readonly [number, number, number, number, number],\n x: payload.x,\n y: payload.y,\n },\n });\n }\n },\n\n // Emit device lost events to main thread\n onDeviceLost: (reason) => {\n state.deviceLost = true;\n this.emit({\n type: 'deviceLost',\n chartId: msg.chartId,\n reason: reason === 'destroyed' ? 'destroyed' : 'unknown',\n message: reason,\n });\n },\n }\n );\n\n // Subscribe to zoom range changes from coordinator and emit to main thread\n // This ensures the zoom slider UI updates when zoom changes via wheel/programmatic means\n coordinator.onZoomRangeChange((range) => {\n this.emit({\n type: 'zoomChange',\n chartId: msg.chartId,\n start: range.start,\n end: range.end,\n });\n });\n\n // Store chart instance with shared state\n const instance: ChartInstance = {\n chartId: msg.chartId,\n gpuContext: initializedContext,\n coordinator,\n canvas: msg.canvas,\n renderChannel,\n state, // Shared state object (captured in coordinator callbacks)\n };\n this.charts.set(msg.chartId, instance);\n\n // Get initial zoom range for inclusion in ready message\n // This ensures the proxy has the correct zoom range immediately upon initialization\n // rather than waiting for a separate zoomChange message to be processed\n const initialZoomRange = coordinator.getZoomRange();\n\n // Set up render loop on the MessageChannel\n // Null check satisfies TypeScript - renderChannel is guaranteed non-null at this point\n // PERFORMANCE CRITICAL: Cache references in closure to eliminate Map lookup on every frame\n if (renderChannel) {\n const chartId = msg.chartId;\n const cachedCoordinator = coordinator;\n const cachedState = state;\n \n renderChannel.port1.onmessage = () => {\n // Use cached state instead of Map lookup - significant perf win for 60fps render loop\n if (!cachedState.disposed && !cachedState.deviceLost) {\n cachedState.renderPending = false;\n \n const perfState = cachedState.performance;\n const frameStartTime = performance.now();\n \n try {\n // Record frame timestamp in circular buffer BEFORE rendering\n perfState.frameTimestamps[perfState.frameTimestampIndex] = frameStartTime;\n perfState.frameTimestampIndex = (perfState.frameTimestampIndex + 1) % FRAME_BUFFER_SIZE;\n if (perfState.frameTimestampCount < FRAME_BUFFER_SIZE) {\n perfState.frameTimestampCount++;\n }\n perfState.totalFrames++;\n\n // Frame drop detection (only after first frame)\n if (perfState.lastFrameTime > 0) {\n const deltaTime = frameStartTime - perfState.lastFrameTime;\n if (deltaTime > EXPECTED_FRAME_TIME_MS * FRAME_DROP_THRESHOLD_MULTIPLIER) {\n perfState.totalDroppedFrames++;\n perfState.consecutiveDroppedFrames++;\n perfState.lastDropTimestamp = frameStartTime;\n } else {\n // Reset consecutive counter on successful frame\n perfState.consecutiveDroppedFrames = 0;\n }\n }\n perfState.lastFrameTime = frameStartTime;\n\n // Render frame\n cachedCoordinator.render();\n\n const frameEndTime = performance.now();\n const cpuTime = frameEndTime - frameStartTime;\n perfState.lastCPUTime = cpuTime;\n\n // GPU timing (optional, requires queue.onSubmittedWorkDone)\n // For now, we track CPU time only. GPU timing would require timestamp-query feature.\n // This can be added later when implementing GPU timing support.\n\n // Calculate and emit performance metrics\n const metrics = this.calculatePerformanceMetrics(perfState);\n this.emit({\n type: 'performance-update',\n chartId,\n metrics,\n });\n\n } catch (error) {\n // Performance: Use shared error extraction helper\n const [message, stack] = extractErrorInfo(error);\n this.emitError(chartId, 'RENDER_ERROR', message, 'render', stack);\n }\n } else if (cachedState.deviceLost) {\n // Silently skip render if device is lost\n cachedState.renderPending = false;\n }\n };\n }\n\n // Get GPU capabilities for diagnostics\n // Note: adapter.info() is an async method that returns GPUAdapterInfo\n // For simplicity, we just report that an adapter was obtained\n // adapter.features is a Set<GPUFeatureName>, convert to string array\n // Performance: Use spread operator instead of Array.from() - slightly faster\n const capabilities = initializedContext.adapter\n ? {\n adapter: 'WebGPU Adapter',\n features: initializedContext.adapter.features ? [...initializedContext.adapter.features] as string[] : [],\n }\n : undefined;\n\n // Determine performance capabilities\n const performanceCapabilities: PerformanceCapabilities = {\n gpuTimingSupported: initializedContext.adapter?.features.has('timestamp-query') ?? false,\n highResTimerSupported: typeof performance !== 'undefined' && typeof performance.now === 'function',\n performanceMetricsSupported: true, // Always supported in worker\n };\n\n // Emit ready message with matching messageId and initial zoom range\n // CRITICAL: Including initial zoom range in ready message ensures the proxy\n // can initialize its slider with the correct range before any async message processing\n this.emit({\n type: 'ready',\n chartId: msg.chartId,\n messageId: msg.messageId,\n capabilities,\n performanceCapabilities,\n initialZoomRange,\n });\n\n // Trigger initial render through MessageChannel to track performance metrics\n if (!state.renderPending && !state.disposed && renderChannel) {\n state.renderPending = true;\n renderChannel.port2.postMessage(null);\n }\n } catch (error) {\n // Clean up MessageChannel if initialization failed\n if (renderChannel) {\n try {\n renderChannel.port1.close();\n renderChannel.port2.close();\n } catch (cleanupError) {\n // Ignore cleanup errors during error handling\n }\n }\n\n // Performance: Use shared error extraction helper\n const [message, stack] = extractErrorInfo(error);\n const code: ErrorCode = message.includes('WebGPU')\n ? 'WEBGPU_INIT_FAILED'\n : 'UNKNOWN';\n\n this.emitError(msg.chartId, code, message, 'init', stack, msg.messageId);\n }\n }\n\n /**\n * Updates chart options for an existing instance.\n * \n * @param chartId - Chart instance identifier\n * @param options - New chart options to apply\n */\n private handleSetOption(chartId: string, options: ChartGPUOptions): void {\n try {\n const instance = this.getChartInstance(chartId, 'setOption');\n const resolvedOptions = resolveOptionsForChart(options);\n instance.coordinator.setOptions(resolvedOptions);\n } catch (error) {\n // Performance: Use shared error extraction helper\n const [message, stack] = extractErrorInfo(error);\n this.emitError(chartId, 'UNKNOWN', message, 'setOption', stack);\n }\n }\n\n /**\n * Appends data points to a specific series.\n * \n * Performance: Uses shared validation helpers to reduce code size and improve performance.\n * \n * @param chartId - Chart instance identifier\n * @param seriesIndex - Index of the series to append to\n * @param data - ArrayBuffer containing interleaved Float32 point data\n * @param pointCount - Number of points in the buffer\n * @param stride - Bytes per point (8 for DataPoint, 20 for OHLCDataPoint)\n */\n private handleAppendData(\n chartId: string,\n seriesIndex: number,\n data: ArrayBuffer,\n pointCount: number,\n stride: number\n ): void {\n try {\n // Performance: Use shared validation helpers\n validateSeriesIndex(seriesIndex, 'in appendData');\n validatePointCount(pointCount, 'in appendData');\n\n const instance = this.getChartInstance(chartId, 'appendData');\n const points = deserializeDataPoints(data, pointCount, stride);\n instance.coordinator.appendData(seriesIndex, points);\n } catch (error) {\n // Performance: Use shared error extraction helper\n const [message, stack] = extractErrorInfo(error);\n this.emitError(chartId, 'DATA_ERROR', message, 'appendData', stack);\n }\n }\n\n /**\n * Batch appends data to multiple series in a single operation.\n * \n * Performance optimizations:\n * - Validates all items upfront before processing (fail fast)\n * - Caches instance lookup outside loop\n * - Uses shared validation helpers\n * - Defers render request until all appends complete (batching)\n * \n * @param chartId - Chart instance identifier\n * @param items - Array of append operations to perform\n */\n private handleAppendDataBatch(\n chartId: string,\n items: ReadonlyArray<{\n readonly seriesIndex: number;\n readonly data: ArrayBuffer;\n readonly pointCount: number;\n readonly stride: number;\n }>\n ): void {\n try {\n const instance = this.getChartInstance(chartId, 'appendDataBatch');\n\n // Performance: Validate all items upfront before processing any (fail fast)\n const itemsLength = items.length;\n for (let i = 0; i < itemsLength; i++) {\n const item = items[i];\n // Performance: Use shared validation helpers\n validateSeriesIndex(item.seriesIndex, `at batch index ${i}`);\n validatePointCount(item.pointCount, `at batch index ${i}`);\n }\n\n // Performance: Process all append operations in batch\n // Each appendData call would normally trigger a render request,\n // but coordinator should coalesce them internally\n for (let i = 0; i < itemsLength; i++) {\n const item = items[i];\n const points = deserializeDataPoints(item.data, item.pointCount, item.stride);\n instance.coordinator.appendData(item.seriesIndex, points);\n }\n\n // Note: Render request is automatically triggered by coordinator's onRequestRender callback\n // No need to manually trigger render here - it's already coalesced\n } catch (error) {\n // Performance: Use shared error extraction helper\n const [message, stack] = extractErrorInfo(error);\n this.emitError(chartId, 'DATA_ERROR', message, 'appendDataBatch', stack);\n }\n }\n\n /**\n * Handles canvas resize events.\n * \n * @param chartId - Chart instance identifier\n * @param msg - Resize message with new dimensions\n */\n private handleResize(chartId: string, msg: ResizeMessage): void {\n try {\n const instance = this.getChartInstance(chartId, 'resize');\n\n // Check device lost state\n if (instance.state.deviceLost) {\n throw new Error('Cannot resize: GPU device is lost');\n }\n\n // Validate dimensions\n const { width, height, devicePixelRatio } = msg;\n if (width <= 0 || height <= 0) {\n throw new Error(`Invalid dimensions: width=${width}, height=${height}. Must be positive.`);\n }\n if (devicePixelRatio <= 0) {\n throw new Error(`Invalid devicePixelRatio: ${devicePixelRatio}. Must be positive.`);\n }\n\n // Calculate canvas dimensions with proper rounding\n const targetWidth = Math.floor(width * devicePixelRatio);\n const targetHeight = Math.floor(height * devicePixelRatio);\n\n // Validate that dimensions are non-zero after scaling\n if (targetWidth === 0 || targetHeight === 0) {\n throw new Error(\n `Computed canvas dimensions are zero: ${targetWidth}x${targetHeight}. ` +\n `CSS dimensions (${width}x${height}px) are too small for device pixel ratio ${devicePixelRatio}. ` +\n `Minimum canvas size is 1px in CSS space.`\n );\n }\n\n // Clamp to device limits\n const device = instance.gpuContext.device;\n if (!device) {\n throw new Error('GPU device is not available');\n }\n\n const maxDim = device.limits.maxTextureDimension2D;\n const finalWidth = Math.max(1, Math.min(targetWidth, maxDim));\n const finalHeight = Math.max(1, Math.min(targetHeight, maxDim));\n\n // Update canvas dimensions\n instance.canvas.width = finalWidth;\n instance.canvas.height = finalHeight;\n\n // Reconfigure canvas context\n const canvasContext = instance.gpuContext.canvasContext;\n const preferredFormat = instance.gpuContext.preferredFormat;\n \n if (!canvasContext) {\n throw new Error('Canvas context is not available');\n }\n if (!preferredFormat) {\n throw new Error('Preferred texture format is not available');\n }\n\n try {\n canvasContext.configure({\n device,\n format: preferredFormat,\n alphaMode: instance.gpuContext.alphaMode,\n });\n } catch (configError) {\n throw new Error(\n `Failed to reconfigure canvas context: ${configError instanceof Error ? configError.message : String(configError)}`\n );\n }\n\n // Request render if specified\n // Use MessageChannel to ensure performance metrics are tracked\n if (msg.requestRender) {\n if (!instance.state.renderPending && !instance.state.disposed) {\n instance.state.renderPending = true;\n instance.renderChannel.port2.postMessage(null);\n }\n }\n } catch (error) {\n // Performance: Use shared error extraction helper\n const [message, stack] = extractErrorInfo(error);\n this.emitError(chartId, 'RENDER_ERROR', message, 'resize', stack);\n }\n }\n\n /**\n * Forwards a pointer event to the coordinator for interaction handling.\n * \n * @param chartId - Chart instance identifier\n * @param event - Pre-computed pointer event data from main thread\n */\n private handlePointerEvent(\n chartId: string,\n event: import('../config/types').PointerEventData\n ): void {\n try {\n console.log('[ChartGPUWorkerController] Received pointer event:', {\n type: event.type,\n gridX: event.gridX,\n gridY: event.gridY,\n isInGrid: event.isInGrid,\n });\n const instance = this.getChartInstance(chartId, 'forwardPointerEvent');\n instance.coordinator.handlePointerEvent(event);\n } catch (error) {\n // Performance: Use shared error extraction helper\n const [message, stack] = extractErrorInfo(error);\n this.emitError(chartId, 'UNKNOWN', message, 'forwardPointerEvent', stack);\n }\n }\n\n /**\n * Sets the zoom range programmatically.\n * \n * @param chartId - Chart instance identifier\n * @param start - Start position in percent space [0, 100]\n * @param end - End position in percent space [0, 100]\n */\n private handleSetZoomRange(chartId: string, start: number, end: number): void {\n try {\n // Validate zoom range (percent space [0, 100])\n if (start < 0 || start > 100 || end < 0 || end > 100) {\n throw new Error(`Invalid zoom range: [${start}, ${end}]. Values must be in [0, 100] (percent space).`);\n }\n if (start >= end) {\n throw new Error(`Invalid zoom range: start (${start}) must be less than end (${end}).`);\n }\n\n const instance = this.getChartInstance(chartId, 'setZoomRange');\n instance.coordinator.setZoomRange(start, end);\n } catch (error) {\n // Performance: Use shared error extraction helper\n const [message, stack] = extractErrorInfo(error);\n this.emitError(chartId, 'UNKNOWN', message, 'setZoomRange', stack);\n }\n }\n\n /**\n * Sets the interaction X coordinate for synchronized crosshair display.\n * \n * @param chartId - Chart instance identifier\n * @param x - X coordinate in CSS pixels, or null to clear\n * @param source - Optional source identifier to prevent echo\n */\n private handleSetInteractionX(chartId: string, x: number | null, source?: string): void {\n try {\n const instance = this.getChartInstance(chartId, 'setInteractionX');\n instance.coordinator.setInteractionX(x, source);\n } catch (error) {\n // Performance: Use shared error extraction helper\n const [message, stack] = extractErrorInfo(error);\n this.emitError(chartId, 'UNKNOWN', message, 'setInteractionX', stack);\n }\n }\n\n /**\n * Enables or disables animation, optionally updating animation configuration.\n * \n * @param chartId - Chart instance identifier\n * @param enabled - Whether animation should be enabled\n * @param config - Optional animation configuration\n */\n private handleSetAnimation(\n chartId: string,\n enabled: boolean,\n _config?: import('../config/types').AnimationConfig\n ): void {\n try {\n const instance = this.getChartInstance(chartId, 'setAnimation');\n // Animation config would be handled through setOptions\n // This is a placeholder for future animation control\n // For now, just trigger a render through MessageChannel to track performance metrics\n if (enabled && !instance.state.renderPending && !instance.state.disposed) {\n instance.state.renderPending = true;\n instance.renderChannel.port2.postMessage(null);\n }\n } catch (error) {\n // Performance: Use shared error extraction helper\n const [message, stack] = extractErrorInfo(error);\n this.emitError(chartId, 'UNKNOWN', message, 'setAnimation', stack);\n }\n }\n\n /**\n * Enables or disables GPU timing for performance metrics.\n * \n * @param chartId - Chart instance identifier\n * @param enabled - Whether GPU timing should be enabled\n */\n private handleSetGPUTiming(chartId: string, enabled: boolean): void {\n try {\n const instance = this.getChartInstance(chartId, 'setGPUTiming');\n instance.state.performance.gpuTimingEnabled = enabled;\n \n // Note: Actual GPU timing implementation requires timestamp-query feature\n // and queue.onSubmittedWorkDone() tracking. For now, we just toggle the flag.\n // Full GPU timing implementation can be added later.\n } catch (error) {\n // Performance: Use shared error extraction helper\n const [message, stack] = extractErrorInfo(error);\n this.emitError(chartId, 'UNKNOWN', message, 'setGPUTiming', stack);\n }\n }\n\n /**\n * Calculates performance metrics from performance tracking state.\n * \n * @param perfState - Performance tracking state\n * @returns Complete performance metrics\n */\n private calculatePerformanceMetrics(perfState: PerformanceTrackingState): PerformanceMetrics {\n // Calculate exact FPS from timestamp deltas\n const fps = this.calculateExactFPS(perfState);\n \n // Calculate frame time statistics\n const frameTimeStats = this.calculateFrameTimeStats(perfState);\n \n // GPU timing stats (placeholder - requires timestamp-query feature)\n const gpuTiming: GPUTimingStats = {\n enabled: perfState.gpuTimingEnabled,\n cpuTime: perfState.lastCPUTime as Milliseconds,\n gpuTime: perfState.lastGPUTime as Milliseconds,\n };\n \n // Memory stats (placeholder - would require tracking buffer allocations)\n const memory: MemoryStats = {\n used: 0 as Bytes,\n peak: 0 as Bytes,\n allocated: 0 as Bytes,\n };\n \n // Frame drop stats\n const frameDrops: FrameDropStats = {\n totalDrops: perfState.totalDroppedFrames,\n consecutiveDrops: perfState.consecutiveDroppedFrames,\n lastDropTimestamp: perfState.lastDropTimestamp as Milliseconds,\n };\n \n const elapsedTime = performance.now() - perfState.startTime;\n \n return {\n fps,\n frameTimeStats,\n gpuTiming,\n memory,\n frameDrops,\n totalFrames: perfState.totalFrames,\n elapsedTime: elapsedTime as Milliseconds,\n };\n }\n\n /**\n * Calculates exact FPS from frame timestamp deltas.\n * \n * @param perfState - Performance tracking state\n * @returns Exact FPS measurement\n */\n private calculateExactFPS(perfState: PerformanceTrackingState): ExactFPS {\n const count = perfState.frameTimestampCount;\n if (count < 2) {\n return 0 as ExactFPS;\n }\n\n const timestamps = perfState.frameTimestamps;\n const startIndex = (perfState.frameTimestampIndex - count + FRAME_BUFFER_SIZE) % FRAME_BUFFER_SIZE;\n \n let totalDelta = 0;\n for (let i = 1; i < count; i++) {\n const prevIndex = (startIndex + i - 1) % FRAME_BUFFER_SIZE;\n const currIndex = (startIndex + i) % FRAME_BUFFER_SIZE;\n const delta = timestamps[currIndex] - timestamps[prevIndex];\n totalDelta += delta;\n }\n\n const avgFrameTime = totalDelta / (count - 1);\n const fps = avgFrameTime > 0 ? 1000 / avgFrameTime : 0;\n \n return fps as ExactFPS;\n }\n\n /**\n * Calculates frame time statistics.\n * \n * @param perfState - Performance tracking state\n * @returns Frame time statistics\n */\n private calculateFrameTimeStats(perfState: PerformanceTrackingState): FrameTimeStats {\n const count = perfState.frameTimestampCount;\n if (count < 2) {\n return {\n min: 0 as Milliseconds,\n max: 0 as Milliseconds,\n avg: 0 as Milliseconds,\n p50: 0 as Milliseconds,\n p95: 0 as Milliseconds,\n p99: 0 as Milliseconds,\n };\n }\n\n const timestamps = perfState.frameTimestamps;\n const startIndex = (perfState.frameTimestampIndex - count + FRAME_BUFFER_SIZE) % FRAME_BUFFER_SIZE;\n \n const deltas = new Array<number>(count - 1);\n let min = Number.POSITIVE_INFINITY;\n let max = Number.NEGATIVE_INFINITY;\n let sum = 0;\n \n for (let i = 1; i < count; i++) {\n const prevIndex = (startIndex + i - 1) % FRAME_BUFFER_SIZE;\n const currIndex = (startIndex + i) % FRAME_BUFFER_SIZE;\n const delta = timestamps[currIndex] - timestamps[prevIndex];\n deltas[i - 1] = delta;\n \n if (delta < min) min = delta;\n if (delta > max) max = delta;\n sum += delta;\n }\n\n const avg = sum / deltas.length;\n\n // Sort for percentile calculations\n deltas.sort((a, b) => a - b);\n\n const p50Index = Math.floor(deltas.length * 0.50);\n const p95Index = Math.floor(deltas.length * 0.95);\n const p99Index = Math.floor(deltas.length * 0.99);\n\n return {\n min: min as Milliseconds,\n max: max as Milliseconds,\n avg: avg as Milliseconds,\n p50: deltas[p50Index] as Milliseconds,\n p95: deltas[p95Index] as Milliseconds,\n p99: deltas[p99Index] as Milliseconds,\n };\n }\n\n /**\n * Disposes a chart instance and cleans up all resources.\n * \n * @param chartId - Chart instance identifier\n */\n private disposeChart(chartId: string): void {\n const cleanupErrors: string[] = [];\n\n try {\n const instance = this.charts.get(chartId);\n if (!instance) {\n this.emitError(chartId, 'UNKNOWN', `Chart \"${chartId}\" not found`, 'dispose');\n return;\n }\n\n // Check if already disposed\n if (instance.state.disposed) {\n this.emitError(chartId, 'UNKNOWN', `Chart \"${chartId}\" is already disposed`, 'dispose');\n return;\n }\n\n // Mark as disposed to prevent further operations\n instance.state.disposed = true;\n\n // Close render channel\n try {\n instance.renderChannel.port1.close();\n instance.renderChannel.port2.close();\n } catch (error) {\n cleanupErrors.push(`Failed to close render channel: ${error}`);\n }\n\n // Dispose coordinator (this cleans up all GPU buffers via dataStore.dispose())\n try {\n instance.coordinator.dispose();\n } catch (error) {\n cleanupErrors.push(`Failed to dispose coordinator: ${error}`);\n }\n\n // Destroy GPU context using proper functional API\n // This calls device.destroy() with error handling and returns a reset state\n try {\n instance.gpuContext = destroyGPUContext(instance.gpuContext);\n } catch (error) {\n cleanupErrors.push(`Failed to destroy GPU context: ${error}`);\n }\n\n // Remove from registry\n this.charts.delete(chartId);\n\n // Emit disposed message\n this.emit({\n type: 'disposed',\n chartId,\n cleanupErrors: cleanupErrors.length > 0 ? cleanupErrors : undefined,\n });\n } catch (error) {\n // Performance: Use shared error extraction helper\n const [message, stack] = extractErrorInfo(error);\n this.emitError(chartId, 'UNKNOWN', message, 'dispose', stack);\n }\n }\n\n /**\n * Disposes all chart instances and cleans up controller resources.\n * Should be called when the worker is being terminated.\n * \n * Performance: Uses spread operator instead of Array.from() for slight efficiency gain.\n */\n dispose(): void {\n // Performance: Spread operator is slightly faster than Array.from()\n const chartIds = [...this.charts.keys()];\n for (const chartId of chartIds) {\n this.disposeChart(chartId);\n }\n this.messageHandler = null;\n }\n\n /**\n * Gets a chart instance by ID, throwing if not found, disposed, or device lost.\n * \n * @param chartId - Chart instance identifier\n * @param operation - Operation name for error reporting\n * @returns Chart instance\n * @throws {Error} If chart not found, disposed, or device lost\n */\n private getChartInstance(chartId: string, operation: string): ChartInstance {\n const instance = this.charts.get(chartId);\n \n if (!instance) {\n throw new Error(`Chart \"${chartId}\" not found for operation \"${operation}\"`);\n }\n \n if (instance.state.disposed) {\n throw new Error(`Chart \"${chartId}\" is disposed and cannot perform \"${operation}\"`);\n }\n \n if (instance.state.deviceLost) {\n throw new Error(`Chart \"${chartId}\" GPU device is lost and cannot perform \"${operation}\". Re-initialize the chart.`);\n }\n \n return instance;\n }\n\n /**\n * Emits an outbound message to the main thread.\n * \n * @param msg - Outbound message to send\n */\n private emit(msg: WorkerOutboundMessage): void {\n if (this.messageHandler) {\n this.messageHandler(msg);\n } else {\n console.warn('No message handler registered, dropping message:', msg);\n }\n }\n\n /**\n * Emits an error message to the main thread.\n * \n * @param chartId - Chart instance identifier\n * @param code - Error code for categorization\n * @param message - Error message\n * @param operation - Operation that failed\n * @param stack - Optional stack trace\n * @param messageId - Optional message ID for correlation\n */\n private emitError(\n chartId: string,\n code: ErrorCode,\n message: string,\n operation: string,\n stack?: string,\n messageId?: string\n ): void {\n const errorMsg: ErrorMessage = {\n type: 'error',\n chartId,\n code,\n message,\n operation,\n stack,\n messageId,\n };\n this.emit(errorMsg);\n }\n}\n\n/**\n * Deserializes ArrayBuffer data into DataPoint or OHLCDataPoint arrays.\n * \n * Performance optimizations (critical hot path for streaming data):\n * - Pre-allocates array to exact size to avoid dynamic resizing\n * - Uses indexed assignment instead of push() for better performance\n * - Validates inputs early to fail fast\n * - Creates read-only tuple arrays for type safety with minimal overhead\n * \n * Note: We create tuple arrays rather than returning TypedArray views directly because:\n * 1. Type safety: coordinator.appendData expects DataPoint[] or OHLCDataPoint[] tuples\n * 2. API contract: Tuples are the documented format\n * 3. Minimal overhead: Modern engines optimize small tuple creation\n * \n * @param buffer - ArrayBuffer containing interleaved Float32 point data\n * @param pointCount - Number of points in the buffer\n * @param stride - Bytes per point (8 for DataPoint, 20 for OHLCDataPoint)\n * @returns Array of data points\n * @throws {Error} If stride is invalid or buffer size doesn't match\n */\nfunction deserializeDataPoints(\n buffer: ArrayBuffer,\n pointCount: number,\n stride: number\n): ReadonlyArray<DataPoint> | ReadonlyArray<OHLCDataPoint> {\n // Validate inputs early (fail fast)\n if (!buffer) {\n throw new Error('Buffer is null or undefined');\n }\n \n if (!Number.isInteger(pointCount) || pointCount < 0) {\n throw new Error(`Invalid pointCount: ${pointCount}. Must be a non-negative integer.`);\n }\n \n if (!Number.isInteger(stride) || stride <= 0) {\n throw new Error(`Invalid stride: ${stride}. Must be a positive integer.`);\n }\n \n // Validate buffer is detached (hasn't been transferred twice)\n if (buffer.byteLength === 0 && pointCount > 0) {\n throw new Error(\n 'Buffer is detached (byteLength = 0). The ArrayBuffer may have been transferred multiple times. ' +\n 'Each ArrayBuffer can only be transferred once via postMessage.'\n );\n }\n \n // Validate 4-byte alignment (WebGPU requirement)\n if (buffer.byteLength % 4 !== 0) {\n throw new Error(\n `Buffer size (${buffer.byteLength} bytes) is not 4-byte aligned. ` +\n `WebGPU requires all buffer sizes to be multiples of 4 bytes.`\n );\n }\n \n // Validate stride alignment (must be multiple of 4 for Float32 data)\n if (stride % 4 !== 0) {\n throw new Error(\n `Stride (${stride} bytes) is not 4-byte aligned. ` +\n `Float32 data requires stride to be a multiple of 4 bytes.`\n );\n }\n \n // Validate buffer size matches expected size\n const expectedSize = pointCount * stride;\n if (buffer.byteLength !== expectedSize) {\n throw new Error(\n `Buffer size mismatch: expected ${expectedSize} bytes (${pointCount} points × ${stride} bytes), ` +\n `got ${buffer.byteLength} bytes. Difference: ${buffer.byteLength - expectedSize} bytes.`\n );\n }\n\n // Create Float32Array view once (reused for all points)\n // GPU buffers use Float32 precision, so we deserialize as Float32\n const view = new Float32Array(buffer);\n \n // Validate view length matches expected element count\n const floatsPerPoint = stride / 4;\n const expectedLength = pointCount * floatsPerPoint;\n if (view.length !== expectedLength) {\n throw new Error(\n `Float32Array length mismatch: expected ${expectedLength} elements, got ${view.length} elements`\n );\n }\n\n if (stride === 8) {\n // DataPoint: [x, y] pairs (2 × 4 bytes = 8 bytes)\n // PERFORMANCE: Pre-allocate to exact size, use indexed assignment\n const points = new Array<DataPoint>(pointCount);\n for (let i = 0, offset = 0; i < pointCount; i++, offset += 2) {\n // Unrolled offset calculation in loop increment for slight perf gain\n points[i] = [view[offset], view[offset + 1]];\n }\n return points;\n } else if (stride === 20) {\n // OHLCDataPoint: [timestamp, open, close, low, high] (5 × 4 bytes = 20 bytes)\n // PERFORMANCE: Pre-allocate to exact size, use indexed assignment\n const points = new Array<OHLCDataPoint>(pointCount);\n for (let i = 0, offset = 0; i < pointCount; i++, offset += 5) {\n // Unrolled offset calculation in loop increment for slight perf gain\n \n // CRITICAL: OHLC data reordering\n // Storage format (Float32Array): [t, o, h, l, c]\n // ECharts tuple format: [t, o, c, l, h]\n // \n // packOHLCDataPoints stores data as [t, o, h, l, c] for GPU rendering efficiency\n // (high/low are adjacent for min/max operations). We must reorder back to ECharts\n // convention [t, o, c, l, h] for API consistency.\n points[i] = [\n view[offset], // timestamp (index 0 → 0)\n view[offset + 1], // open (index 1 → 1)\n view[offset + 4], // close (index 4 → 2) ← reordered\n view[offset + 3], // low (index 3 → 3)\n view[offset + 2], // high (index 2 → 4) ← reordered\n ];\n }\n return points;\n } else {\n throw new Error(\n `Invalid stride: ${stride} bytes. Expected 8 (DataPoint) or 20 (OHLCDataPoint). ` +\n `Received stride corresponds to ${stride / 4} floats per point.`\n );\n }\n}\n"],"names":["FRAME_BUFFER_SIZE","EXPECTED_FRAME_TIME_MS","FRAME_DROP_THRESHOLD_MULTIPLIER","validateSeriesIndex","seriesIndex","context","validatePointCount","pointCount","extractErrorInfo","error","ChartGPUWorkerController","handler","msg","exhaustive","chartId","message","stack","renderChannel","gpuOptions","_a","gpuContext","createGPUContext","initializedContext","initializeGPUContext","resolvedOptions","resolveOptionsForChart","state","info","event","errorMessage","coordinator","createRenderCoordinator","data","firstParam","items","xLabels","yLabels","x","payload","reason","range","instance","initialZoomRange","cachedCoordinator","cachedState","perfState","frameStartTime","cpuTime","metrics","capabilities","performanceCapabilities","_b","code","options","stride","points","deserializeDataPoints","itemsLength","i","item","width","height","devicePixelRatio","targetWidth","targetHeight","device","maxDim","finalWidth","finalHeight","canvasContext","preferredFormat","configError","start","end","source","enabled","_config","fps","frameTimeStats","gpuTiming","memory","frameDrops","elapsedTime","count","timestamps","startIndex","totalDelta","prevIndex","currIndex","delta","avgFrameTime","deltas","min","max","sum","avg","a","b","p50Index","p95Index","p99Index","cleanupErrors","destroyGPUContext","chartIds","operation","messageId","errorMsg","buffer","expectedSize","view","floatsPerPoint","expectedLength","offset"],"mappings":"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"}