velo-plot 1.15.0 → 2.0.0

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 (104) hide show
  1. package/dist/{ChartCore-BimVvUEg.js → ChartCore-BhQ4j7f5.js} +2213 -1489
  2. package/dist/ChartCore-BhQ4j7f5.js.map +1 -0
  3. package/dist/SciPlot-GJvw7GJo.js +463 -0
  4. package/dist/SciPlot-GJvw7GJo.js.map +1 -0
  5. package/dist/assets/downsample.worker-C70QJ04y.js +2 -0
  6. package/dist/assets/downsample.worker-C70QJ04y.js.map +1 -0
  7. package/dist/assets/indicator.worker-bv0zC4EX.js +2 -0
  8. package/dist/assets/indicator.worker-bv0zC4EX.js.map +1 -0
  9. package/dist/axisFormat-SPX-CD5s.js +200 -0
  10. package/dist/axisFormat-SPX-CD5s.js.map +1 -0
  11. package/dist/core/InteractionManager.d.ts +1 -0
  12. package/dist/core/OverlayRenderer.d.ts +13 -0
  13. package/dist/core/chart/ChartAlerts.d.ts +42 -0
  14. package/dist/core/chart/ChartCore.d.ts +24 -1
  15. package/dist/core/chart/ChartRenderLoop.d.ts +9 -2
  16. package/dist/core/chart/ChartRenderer.d.ts +8 -2
  17. package/dist/core/chart/candlestickMarkers.d.ts +23 -0
  18. package/dist/core/chart/heikinAshi.d.ts +10 -0
  19. package/dist/core/chart/positionLines.d.ts +12 -0
  20. package/dist/core/chart/series/types.d.ts +2 -2
  21. package/dist/core/chart/types.d.ts +9 -0
  22. package/dist/core/format/axisFormat.d.ts +2 -1
  23. package/dist/core/indicator/addIndicator.d.ts +36 -0
  24. package/dist/core/indicator/index.d.ts +2 -0
  25. package/dist/core/indicator/indicatorPresets.d.ts +45 -0
  26. package/dist/core/series/Series.d.ts +3 -0
  27. package/dist/core/stacked/types.d.ts +8 -0
  28. package/dist/core/time/TimeScale.d.ts +31 -0
  29. package/dist/core/time/applyTimeScale.d.ts +10 -0
  30. package/dist/createStackedChart-DJSmqerD.js +706 -0
  31. package/dist/createStackedChart-DJSmqerD.js.map +1 -0
  32. package/dist/gpu/adapter/gpuRenderer.d.ts +21 -0
  33. package/dist/gpu/backends/webgpu/WebGPUBackend.d.ts +2 -1
  34. package/dist/gpuRenderer-BpaMYz-k.js +1848 -0
  35. package/dist/gpuRenderer-BpaMYz-k.js.map +1 -0
  36. package/dist/{index-DjeWClO9.js → index-CWipqOLP.js} +2 -2
  37. package/dist/{index-DjeWClO9.js.map → index-CWipqOLP.js.map} +1 -1
  38. package/dist/index-D7dTq6VB.js +503 -0
  39. package/dist/index-D7dTq6VB.js.map +1 -0
  40. package/dist/{index-Ce2JgkH_.js → index-DoYxf1cV.js} +86 -43
  41. package/dist/{index-Ce2JgkH_.js.map → index-DoYxf1cV.js.map} +1 -1
  42. package/dist/{index.core-C_-CFftD.js → index.core-fpZ1dYN0.js} +3 -3
  43. package/dist/{index.core-C_-CFftD.js.map → index.core-fpZ1dYN0.js.map} +1 -1
  44. package/dist/index.d.ts +17 -4
  45. package/dist/indicators--eJGmVox.js +302 -0
  46. package/dist/indicators--eJGmVox.js.map +1 -0
  47. package/dist/mockDatafeed-Cdg5hKEo.js +511 -0
  48. package/dist/mockDatafeed-Cdg5hKEo.js.map +1 -0
  49. package/dist/plugins/analysis.js +530 -807
  50. package/dist/plugins/analysis.js.map +1 -1
  51. package/dist/plugins/caching.js +26 -21
  52. package/dist/plugins/caching.js.map +1 -1
  53. package/dist/plugins/drawing-tools/index.d.ts +29 -0
  54. package/dist/plugins/drawing-tools/measure.d.ts +21 -0
  55. package/dist/plugins/drawing-tools/snapToCandle.d.ts +21 -0
  56. package/dist/plugins/gpu.js +202 -1895
  57. package/dist/plugins/gpu.js.map +1 -1
  58. package/dist/plugins/index.d.ts +2 -0
  59. package/dist/plugins/keyboard/index.d.ts +1 -7
  60. package/dist/plugins/keyboard.js +1 -1
  61. package/dist/plugins/lazy-load/types.d.ts +7 -0
  62. package/dist/plugins/lazy-load.js +131 -108
  63. package/dist/plugins/lazy-load.js.map +1 -1
  64. package/dist/plugins/replay/index.d.ts +19 -0
  65. package/dist/plugins/tools.js +1 -1
  66. package/dist/plugins/virtualization/types.d.ts +12 -0
  67. package/dist/plugins/virtualization.js +1 -1
  68. package/dist/pool-15HMCNv8.js +88 -0
  69. package/dist/pool-15HMCNv8.js.map +1 -0
  70. package/dist/react.js +5 -5
  71. package/dist/renderer/CandlestickRenderer.d.ts +1 -1
  72. package/dist/renderer/ChartSeriesRenderer.d.ts +6 -0
  73. package/dist/renderer/GpuChartRenderer.d.ts +23 -0
  74. package/dist/renderer/index.d.ts +3 -0
  75. package/dist/renderer/spike/WebGLGridSpike.d.ts +40 -0
  76. package/dist/testing/baselines/v1.15.0.json.d.ts +51 -0
  77. package/dist/testing/gridSpikeBenchmark.d.ts +49 -0
  78. package/dist/testing/index.d.ts +5 -0
  79. package/dist/testing/rendererBenchmark.d.ts +13 -0
  80. package/dist/testing/stage1BrowserBench.d.ts +42 -0
  81. package/dist/trading/datafeed.d.ts +48 -0
  82. package/dist/trading/index.d.ts +29 -0
  83. package/dist/trading/mockDatafeed.d.ts +9 -0
  84. package/dist/trading/ohlcvGenerator.d.ts +25 -0
  85. package/dist/trading.d.ts +1 -0
  86. package/dist/trading.js +95 -0
  87. package/dist/trading.js.map +1 -0
  88. package/dist/types.d.ts +22 -2
  89. package/dist/velo-plot.full.js +1088 -776
  90. package/dist/velo-plot.full.js.map +1 -1
  91. package/dist/velo-plot.js +15 -15
  92. package/dist/workers/downsample.d.ts +38 -0
  93. package/dist/workers/downsampleAsync.d.ts +6 -0
  94. package/dist/workers/indicator.worker.d.ts +32 -0
  95. package/dist/workers/indicatorsAsync.d.ts +26 -0
  96. package/dist/workers/pool.d.ts +36 -0
  97. package/package.json +23 -1
  98. package/dist/ChartCore-BimVvUEg.js.map +0 -1
  99. package/dist/axisFormat-B7o_uIEA.js +0 -127
  100. package/dist/axisFormat-B7o_uIEA.js.map +0 -1
  101. package/dist/createStackedChart-CjsKcOvX.js +0 -1088
  102. package/dist/createStackedChart-CjsKcOvX.js.map +0 -1
  103. package/dist/index-ChgIdk3N.js +0 -229
  104. package/dist/index-ChgIdk3N.js.map +0 -1
@@ -0,0 +1,503 @@
1
+ import { n as H, W as Z } from "./pool-15HMCNv8.js";
2
+ function R(o, r, n) {
3
+ const l = o.length;
4
+ if (n >= l || n <= 2)
5
+ return {
6
+ x: new Float32Array(o),
7
+ y: new Float32Array(r),
8
+ indices: new Uint32Array(Array.from({ length: l }, (g, F) => F))
9
+ };
10
+ const u = new Float32Array(n), f = new Float32Array(n), s = new Uint32Array(n);
11
+ u[0] = o[0], f[0] = r[0], s[0] = 0;
12
+ const c = (l - 2) / (n - 2);
13
+ let h = 0, p = 1;
14
+ for (let g = 0; g < n - 2; g++) {
15
+ const F = Math.floor((g + 1) * c) + 1, z = Math.floor((g + 2) * c) + 1, x = Math.min(z, l - 1), y = Math.min(
16
+ Math.floor((g + 3) * c) + 1,
17
+ l
18
+ );
19
+ let w = 0, E = 0, v = 0;
20
+ for (let D = x; D < y; D++)
21
+ w += o[D], E += r[D], v++;
22
+ v > 0 && (w /= v, E /= v);
23
+ let b = -1, M = F;
24
+ const S = o[h], L = r[h];
25
+ for (let D = F; D < z && D < l; D++) {
26
+ const P = Math.abs(
27
+ (S - w) * (r[D] - L) - (S - o[D]) * (E - L)
28
+ );
29
+ P > b && (b = P, M = D);
30
+ }
31
+ u[p] = o[M], f[p] = r[M], s[p] = M, h = M, p++;
32
+ }
33
+ return u[n - 1] = o[l - 1], f[n - 1] = r[l - 1], s[n - 1] = l - 1, { x: u, y: f, indices: s };
34
+ }
35
+ function G(o, r, n) {
36
+ const l = o.length;
37
+ if (n >= l / 2)
38
+ return {
39
+ x: new Float32Array(o),
40
+ y: new Float32Array(r),
41
+ indices: new Uint32Array(Array.from({ length: l }, (h, p) => p))
42
+ };
43
+ const u = l / n, f = [], s = [], c = [];
44
+ for (let h = 0; h < n; h++) {
45
+ const p = Math.floor(h * u), g = Math.floor((h + 1) * u);
46
+ let F = 1 / 0, z = -1 / 0, x = p, y = p;
47
+ for (let w = p; w < g && w < l; w++)
48
+ r[w] < F && (F = r[w], x = w), r[w] > z && (z = r[w], y = w);
49
+ x <= y ? (f.push(o[x], o[y]), s.push(r[x], r[y]), c.push(x, y)) : (f.push(o[y], o[x]), s.push(r[y], r[x]), c.push(y, x));
50
+ }
51
+ return {
52
+ x: new Float32Array(f),
53
+ y: new Float32Array(s),
54
+ indices: new Uint32Array(c)
55
+ };
56
+ }
57
+ function ee(o, r, n = 2) {
58
+ const l = r * n;
59
+ return Math.min(o, l);
60
+ }
61
+ function q(o, r, n, l, u, f) {
62
+ const s = o.length;
63
+ if (f >= s || f <= 1 || s === 0)
64
+ return {
65
+ x: new Float32Array(o),
66
+ open: new Float32Array(r),
67
+ high: new Float32Array(n),
68
+ low: new Float32Array(l),
69
+ close: new Float32Array(u),
70
+ indices: new Uint32Array(Array.from({ length: s }, (y, w) => w))
71
+ };
72
+ const c = s / f, h = [], p = [], g = [], F = [], z = [], x = [];
73
+ for (let y = 0; y < f; y++) {
74
+ const w = Math.floor(y * c), E = Math.min(s, Math.floor((y + 1) * c));
75
+ if (w >= E) continue;
76
+ let v = -1 / 0, b = 1 / 0, M = w;
77
+ for (let S = w; S < E; S++)
78
+ n[S] > v && (v = n[S]), l[S] < b && (b = l[S]), M = S;
79
+ p.push(r[w]), g.push(v), F.push(b), z.push(u[M]), h.push(o[M]), x.push(M);
80
+ }
81
+ return {
82
+ x: new Float32Array(h),
83
+ open: new Float32Array(p),
84
+ high: new Float32Array(g),
85
+ low: new Float32Array(F),
86
+ close: new Float32Array(z),
87
+ indices: new Uint32Array(x)
88
+ };
89
+ }
90
+ function te(o, r) {
91
+ let n = 0, l = o.length;
92
+ for (; n < l; ) {
93
+ const u = n + l >>> 1;
94
+ o[u] < r ? n = u + 1 : l = u;
95
+ }
96
+ return n;
97
+ }
98
+ function ne(o, r) {
99
+ let n = 0, l = o.length;
100
+ for (; n < l; ) {
101
+ const u = n + l >>> 1;
102
+ o[u] <= r ? n = u + 1 : l = u;
103
+ }
104
+ return n;
105
+ }
106
+ function re(o, r, n, l = 0.5) {
107
+ const u = o.x.length;
108
+ if (u === 0)
109
+ return { x: new Float32Array(0), start: 0, end: 0 };
110
+ const f = Math.max(n - r, 1e-12), s = r - f * l, c = n + f * l;
111
+ let h = te(o.x, s), p = ne(o.x, c);
112
+ h = Math.max(0, h), p = Math.min(u, Math.max(p, h + 1));
113
+ const g = (F) => {
114
+ if (F)
115
+ return new Float32Array(F.subarray(h, p));
116
+ };
117
+ return {
118
+ x: new Float32Array(o.x.subarray(h, p)),
119
+ y: g(o.y),
120
+ open: g(o.open),
121
+ high: g(o.high),
122
+ low: g(o.low),
123
+ close: g(o.close),
124
+ start: h,
125
+ end: p
126
+ };
127
+ }
128
+ let I = null;
129
+ function J() {
130
+ return I || (I = new Z(
131
+ () => new Worker(new URL(
132
+ /* @vite-ignore */
133
+ "/assets/downsample.worker-C70QJ04y.js",
134
+ import.meta.url
135
+ ), { type: "module" }),
136
+ {
137
+ poolSize: 2,
138
+ syncFallback: !0,
139
+ syncHandler: (o) => {
140
+ if (o.type === "downsample") {
141
+ const n = o.algorithm === "minmax" ? G(o.x, o.y, Math.ceil(o.targetPoints / 2)) : R(o.x, o.y, o.targetPoints);
142
+ return { id: o.id, type: "downsample-result", x: n.x, y: n.y };
143
+ }
144
+ const r = q(
145
+ o.x,
146
+ o.open,
147
+ o.high,
148
+ o.low,
149
+ o.close,
150
+ o.targetBars
151
+ );
152
+ return {
153
+ id: o.id,
154
+ type: "ohlc-downsample-result",
155
+ x: r.x,
156
+ open: r.open,
157
+ high: r.high,
158
+ low: r.low,
159
+ close: r.close
160
+ };
161
+ }
162
+ }
163
+ ), I);
164
+ }
165
+ async function oe(o, r, n, l = "lttb") {
166
+ const u = H("downsample"), f = await J().run({
167
+ id: u,
168
+ type: "downsample",
169
+ x: o,
170
+ y: r,
171
+ targetPoints: n,
172
+ algorithm: l
173
+ });
174
+ if (f.type === "error") throw new Error(f.error);
175
+ if (f.type !== "downsample-result")
176
+ throw new Error("Unexpected downsample worker response");
177
+ return {
178
+ x: f.x,
179
+ y: f.y,
180
+ indices: new Uint32Array(f.x.length)
181
+ };
182
+ }
183
+ async function ae(o, r, n, l, u, f) {
184
+ const s = H("ohlc-downsample"), c = await J().run({
185
+ id: s,
186
+ type: "ohlc-downsample",
187
+ x: o,
188
+ open: r,
189
+ high: n,
190
+ low: l,
191
+ close: u,
192
+ targetBars: f
193
+ });
194
+ if (c.type === "error") throw new Error(c.error);
195
+ if (c.type !== "ohlc-downsample-result")
196
+ throw new Error("Unexpected OHLC downsample worker response");
197
+ return {
198
+ x: c.x,
199
+ open: c.open,
200
+ high: c.high,
201
+ low: c.low,
202
+ close: c.close,
203
+ indices: new Uint32Array(c.x.length)
204
+ };
205
+ }
206
+ function ce() {
207
+ I == null || I.destroy(), I = null;
208
+ }
209
+ function fe() {
210
+ return (I == null ? void 0 : I.size()) ?? 0;
211
+ }
212
+ const le = {
213
+ name: "velo-plot-virtualization",
214
+ version: "1.0.0",
215
+ description: "Viewport-aware data virtualization with LOD strategies",
216
+ provides: ["performance", "data-virtualization"],
217
+ tags: ["performance", "lod", "virtualization"]
218
+ }, ie = {
219
+ enabled: !0,
220
+ precision: "lod",
221
+ mode: "lod",
222
+ targetPoints: "auto",
223
+ pointsPerPixel: 2,
224
+ lodLevels: [1, 4, 8, 16],
225
+ strategy: "lttb",
226
+ reuseOriginalData: !0,
227
+ syncWithLazyLoad: !0,
228
+ includeSeries: [],
229
+ excludeSeries: [],
230
+ debug: !1,
231
+ viewportBuffer: 0.5,
232
+ useWorker: !0,
233
+ workerThreshold: 25e4
234
+ };
235
+ function de(o = {}) {
236
+ const r = { ...ie, ...o };
237
+ let n = null, l = !1;
238
+ const u = /* @__PURE__ */ new Map(), f = /* @__PURE__ */ new Map();
239
+ let s = null, c = null, h = 0;
240
+ const p = /* @__PURE__ */ new Map();
241
+ let g = "";
242
+ function F(e, ...t) {
243
+ r.debug && n && n.log.info(`[Virtualization] ${e}`, ...t);
244
+ }
245
+ function z(e) {
246
+ if (!r.enabled || r.precision === "full" || r.includeSeries.length > 0 && !r.includeSeries.includes(e.getId()) || r.excludeSeries.includes(e.getId())) return !1;
247
+ const t = e.getType();
248
+ return t === "line" || t === "scatter" || t === "line+scatter" || t === "step" || t === "step+scatter" || t === "candlestick" || t === "bar";
249
+ }
250
+ function x(e) {
251
+ return e.getType() === "candlestick";
252
+ }
253
+ function y(e) {
254
+ return e.open && e.high && e.low && e.close ? {
255
+ x: e.x,
256
+ open: e.open,
257
+ high: e.high,
258
+ low: e.low,
259
+ close: e.close
260
+ } : { x: e.x, y: e.y };
261
+ }
262
+ function w(e) {
263
+ if (!n) return e;
264
+ if (r.targetPoints !== "auto") return Math.max(2, r.targetPoints);
265
+ const t = n.render.canvasSize.width / n.render.pixelRatio;
266
+ return ee(e, t, r.pointsPerPixel);
267
+ }
268
+ function E(e, t, a, i) {
269
+ if (a >= e.length || e.length <= 2)
270
+ return { x: new Float32Array(e), y: new Float32Array(t) };
271
+ if (i === "minmax") {
272
+ const m = Math.ceil(a / 2), A = G(e, t, m);
273
+ return { x: A.x, y: A.y };
274
+ }
275
+ const d = R(e, t, a);
276
+ return { x: d.x, y: d.y };
277
+ }
278
+ function v(e, t) {
279
+ r.reuseOriginalData && (u.has(e) || u.set(e, { ...t }));
280
+ }
281
+ function b(e) {
282
+ return u.get(e) ?? null;
283
+ }
284
+ function M(e, t, a, i, d, m) {
285
+ f.set(e, {
286
+ seriesId: e,
287
+ originalPoints: t,
288
+ renderedPoints: a,
289
+ targetPoints: i,
290
+ lastUpdated: Date.now(),
291
+ mode: d,
292
+ strategy: m
293
+ });
294
+ }
295
+ function S(e) {
296
+ var i;
297
+ const t = e.getData();
298
+ if (!((i = t == null ? void 0 : t.x) != null && i.length)) return null;
299
+ if (x(e)) {
300
+ if (!t.open || !t.high || !t.low || !t.close) return null;
301
+ const d = {
302
+ x: t.x,
303
+ open: t.open,
304
+ high: t.high,
305
+ low: t.low,
306
+ close: t.close
307
+ };
308
+ return v(e.getId(), d), d;
309
+ }
310
+ if (!t.y) return null;
311
+ const a = { x: t.x, y: t.y };
312
+ return v(e.getId(), a), a;
313
+ }
314
+ function L(e) {
315
+ return b(e.getId()) ?? S(e);
316
+ }
317
+ function D(e) {
318
+ var i, d;
319
+ if (!n) return e;
320
+ const t = (d = (i = n.data).getViewBounds) == null ? void 0 : d.call(i);
321
+ if (!t) return e;
322
+ const a = re(
323
+ e,
324
+ t.xMin,
325
+ t.xMax,
326
+ r.viewportBuffer
327
+ );
328
+ return a.end - a.start >= e.x.length ? e : {
329
+ x: a.x,
330
+ y: a.y,
331
+ open: a.open,
332
+ high: a.high,
333
+ low: a.low,
334
+ close: a.close
335
+ };
336
+ }
337
+ function P(e, t) {
338
+ s && (l = !0, s(e, t), l = !1);
339
+ }
340
+ async function K(e, t, a) {
341
+ const i = new Float32Array(e.x), d = new Float32Array(e.y);
342
+ if (r.useWorker && i.length >= r.workerThreshold) {
343
+ const A = await oe(i, d, t, a === "minmax" ? "minmax" : "lttb");
344
+ return { x: A.x, y: A.y };
345
+ }
346
+ return E(i, d, t, a);
347
+ }
348
+ async function W(e) {
349
+ var V;
350
+ if (!n || !s) return;
351
+ const t = e.getId();
352
+ if (!z(e)) {
353
+ const O = b(t);
354
+ O && r.reuseOriginalData && P(t, y(O));
355
+ return;
356
+ }
357
+ const a = L(e);
358
+ if (!((V = a == null ? void 0 : a.x) != null && V.length)) return;
359
+ const i = D(a), d = (p.get(t) ?? 0) + 1;
360
+ if (p.set(t, d), x(e)) {
361
+ if (!i.open || !i.high || !i.low || !i.close)
362
+ return;
363
+ const O = w(i.x.length), T = new Float32Array(i.x), $ = new Float32Array(i.open), j = new Float32Array(i.high), C = new Float32Array(i.low), _ = new Float32Array(i.close), k = r.useWorker && T.length >= r.workerThreshold ? await ae(T, $, j, C, _, O) : q(T, $, j, C, _, O);
364
+ if (p.get(t) !== d) return;
365
+ P(t, {
366
+ x: k.x,
367
+ open: k.open,
368
+ high: k.high,
369
+ low: k.low,
370
+ close: k.close
371
+ }), M(t, a.x.length, k.x.length, O, r.mode, "minmax");
372
+ return;
373
+ }
374
+ if (!i.y) return;
375
+ const m = w(i.x.length), A = e.getType() === "bar" ? "minmax" : r.strategy, U = await K(i, m, A);
376
+ p.get(t) === d && (P(t, { x: U.x, y: U.y }), M(t, a.x.length, U.x.length, m, r.mode, A));
377
+ }
378
+ function B() {
379
+ n && n.data.getAllSeries().forEach((e) => {
380
+ W(e);
381
+ });
382
+ }
383
+ function X() {
384
+ var t, a;
385
+ if (!n) return;
386
+ const e = (a = (t = n.data).getViewBounds) == null ? void 0 : a.call(t);
387
+ if (e) {
388
+ const i = `${e.xMin}:${e.xMax}:${e.yMin}:${e.yMax}:${n.render.canvasSize.width}`;
389
+ if (i === g) return;
390
+ g = i;
391
+ }
392
+ h || (h = requestAnimationFrame(() => {
393
+ h = 0, B();
394
+ }));
395
+ }
396
+ function N(e, t) {
397
+ var m, A, U, V;
398
+ if (!n || !s) return;
399
+ if (!r.enabled || l) {
400
+ s(e, t);
401
+ return;
402
+ }
403
+ if (!((A = (m = n.chart).getSeries) == null ? void 0 : A.call(m, e))) {
404
+ s(e, t);
405
+ return;
406
+ }
407
+ const i = b(e);
408
+ i && r.reuseOriginalData && (l = !0, s(e, y(i)), l = !1), s(e, t);
409
+ const d = (V = (U = n.chart).getSeries) == null ? void 0 : V.call(U, e);
410
+ d && (u.delete(e), S(d), W(d));
411
+ }
412
+ function Q(e, t, a) {
413
+ var A, U, V, O;
414
+ if (!n || !c || !s) return;
415
+ if (!r.enabled || l) {
416
+ c(e, t, a);
417
+ return;
418
+ }
419
+ if (!((U = (A = n.chart).getSeries) == null ? void 0 : U.call(A, e))) {
420
+ c(e, t, a);
421
+ return;
422
+ }
423
+ const d = b(e);
424
+ d && r.reuseOriginalData && (l = !0, s(e, y(d)), l = !1), c(e, t, a);
425
+ const m = (O = (V = n.chart).getSeries) == null ? void 0 : O.call(V, e);
426
+ if (m) {
427
+ const T = b(e);
428
+ T != null && T.y && r.reuseOriginalData ? v(e, {
429
+ x: Y(T.x, t),
430
+ y: Y(T.y, a)
431
+ }) : (u.delete(e), S(m)), W(m);
432
+ }
433
+ }
434
+ function Y(e, t) {
435
+ const a = t instanceof Float32Array ? t : Float32Array.from(t), i = new Float32Array(e.length + a.length);
436
+ return i.set(e), i.set(a, e.length), i;
437
+ }
438
+ return {
439
+ manifest: le,
440
+ onInit(e) {
441
+ var a, i;
442
+ n = e;
443
+ const t = n.chart;
444
+ s = ((a = t.updateSeries) == null ? void 0 : a.bind(t)) ?? null, c = ((i = t.appendData) == null ? void 0 : i.bind(t)) ?? null, s && (t.updateSeries = (d, m) => N(d, m)), c && (t.appendData = (d, m, A) => Q(d, m, A)), n.events.on("zoom", () => X()), n.events.on("pan", () => X()), n.events.on("resize", () => {
445
+ g = "", X();
446
+ }), B(), F("Initialized");
447
+ },
448
+ onDestroy(e) {
449
+ h && cancelAnimationFrame(h), h = 0, p.clear(), s && (e.chart.updateSeries = s), c && (e.chart.appendData = c), n = null, u.clear(), f.clear();
450
+ },
451
+ api: {
452
+ enable() {
453
+ r.enabled = !0, B();
454
+ },
455
+ disable() {
456
+ if (r.enabled = !1, !n || !s) return;
457
+ const e = s;
458
+ n.data.getAllSeries().forEach((t) => {
459
+ const a = b(t.getId());
460
+ a && (l = !0, e(t.getId(), y(a)), l = !1);
461
+ });
462
+ },
463
+ isEnabled() {
464
+ return r.enabled;
465
+ },
466
+ updateConfig(e) {
467
+ Object.assign(r, e), B();
468
+ },
469
+ invalidate(e) {
470
+ var t, a;
471
+ if (n) {
472
+ if (e) {
473
+ const i = (a = (t = n.chart).getSeries) == null ? void 0 : a.call(t, e);
474
+ i && W(i);
475
+ return;
476
+ }
477
+ B();
478
+ }
479
+ },
480
+ getStats(e) {
481
+ return f.get(e) ?? null;
482
+ },
483
+ getAllStats() {
484
+ return Array.from(f.values());
485
+ }
486
+ }
487
+ };
488
+ }
489
+ export {
490
+ de as P,
491
+ te as a,
492
+ ae as b,
493
+ ee as c,
494
+ oe as d,
495
+ ce as e,
496
+ fe as g,
497
+ R as l,
498
+ G as m,
499
+ q as o,
500
+ re as s,
501
+ ne as u
502
+ };
503
+ //# sourceMappingURL=index-D7dTq6VB.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-D7dTq6VB.js","sources":["../src/workers/downsample.ts","../src/workers/downsampleAsync.ts","../src/plugins/virtualization/index.ts"],"sourcesContent":["/**\n * LTTB (Largest-Triangle-Three-Buckets) Downsampling Algorithm\n *\n * This algorithm downsamples time-series data while preserving visual features.\n * It's much better than naive sampling for preserving peaks and valleys.\n *\n * Reference: https://skemman.is/bitstream/1946/15343/3/SS_MSthesis.pdf\n */\n\nexport interface DownsampleResult {\n x: Float32Array;\n y: Float32Array;\n /** Original indices of selected points */\n indices: Uint32Array;\n}\n\n/**\n * Downsample data using LTTB algorithm\n *\n * @param x - X values (e.g., potential)\n * @param y - Y values (e.g., current)\n * @param targetPoints - Number of output points\n * @returns Downsampled data\n */\nexport function lttbDownsample(\n x: Float32Array | Float64Array,\n y: Float32Array | Float64Array,\n targetPoints: number\n): DownsampleResult {\n const length = x.length;\n\n // No need to downsample\n if (targetPoints >= length || targetPoints <= 2) {\n return {\n x: new Float32Array(x),\n y: new Float32Array(y),\n indices: new Uint32Array(Array.from({ length }, (_, i) => i)),\n };\n }\n\n const outX = new Float32Array(targetPoints);\n const outY = new Float32Array(targetPoints);\n const outIndices = new Uint32Array(targetPoints);\n\n // Always include first point\n outX[0] = x[0];\n outY[0] = y[0];\n outIndices[0] = 0;\n\n // Bucket size\n const bucketSize = (length - 2) / (targetPoints - 2);\n\n let a = 0; // Previous selected point index\n let outIdx = 1;\n\n for (let i = 0; i < targetPoints - 2; i++) {\n // Calculate bucket boundaries\n const bucketStart = Math.floor((i + 1) * bucketSize) + 1;\n const bucketEnd = Math.floor((i + 2) * bucketSize) + 1;\n\n // Calculate average point of next bucket\n const nextBucketStart = Math.min(bucketEnd, length - 1);\n const nextBucketEnd = Math.min(\n Math.floor((i + 3) * bucketSize) + 1,\n length\n );\n\n let avgX = 0;\n let avgY = 0;\n let avgCount = 0;\n\n for (let j = nextBucketStart; j < nextBucketEnd; j++) {\n avgX += x[j];\n avgY += y[j];\n avgCount++;\n }\n\n if (avgCount > 0) {\n avgX /= avgCount;\n avgY /= avgCount;\n }\n\n // Find point in current bucket with largest triangle area\n let maxArea = -1;\n let maxIndex = bucketStart;\n\n const aX = x[a];\n const aY = y[a];\n\n for (let j = bucketStart; j < bucketEnd && j < length; j++) {\n // Calculate triangle area (simplified: |x1(y2-y3) + x2(y3-y1) + x3(y1-y2)| / 2)\n const area = Math.abs(\n (aX - avgX) * (y[j] - aY) - (aX - x[j]) * (avgY - aY)\n );\n\n if (area > maxArea) {\n maxArea = area;\n maxIndex = j;\n }\n }\n\n // Store selected point\n outX[outIdx] = x[maxIndex];\n outY[outIdx] = y[maxIndex];\n outIndices[outIdx] = maxIndex;\n\n a = maxIndex;\n outIdx++;\n }\n\n // Always include last point\n outX[targetPoints - 1] = x[length - 1];\n outY[targetPoints - 1] = y[length - 1];\n outIndices[targetPoints - 1] = length - 1;\n\n return { x: outX, y: outY, indices: outIndices };\n}\n\n/**\n * Min-Max per bucket downsampling\n *\n * Simpler alternative to LTTB that preserves extremes in each bucket.\n * Uses 2 points per bucket (min and max), so output is ~2x target.\n */\nexport function minMaxDownsample(\n x: Float32Array | Float64Array,\n y: Float32Array | Float64Array,\n bucketCount: number\n): DownsampleResult {\n const length = x.length;\n\n if (bucketCount >= length / 2) {\n return {\n x: new Float32Array(x),\n y: new Float32Array(y),\n indices: new Uint32Array(Array.from({ length }, (_, i) => i)),\n };\n }\n\n const bucketSize = length / bucketCount;\n const outX: number[] = [];\n const outY: number[] = [];\n const outIndices: number[] = [];\n\n for (let b = 0; b < bucketCount; b++) {\n const start = Math.floor(b * bucketSize);\n const end = Math.floor((b + 1) * bucketSize);\n\n let minY = Infinity;\n let maxY = -Infinity;\n let minIdx = start;\n let maxIdx = start;\n\n for (let i = start; i < end && i < length; i++) {\n if (y[i] < minY) {\n minY = y[i];\n minIdx = i;\n }\n if (y[i] > maxY) {\n maxY = y[i];\n maxIdx = i;\n }\n }\n\n // Add points in order (min first if it comes before max)\n if (minIdx <= maxIdx) {\n outX.push(x[minIdx], x[maxIdx]);\n outY.push(y[minIdx], y[maxIdx]);\n outIndices.push(minIdx, maxIdx);\n } else {\n outX.push(x[maxIdx], x[minIdx]);\n outY.push(y[maxIdx], y[minIdx]);\n outIndices.push(maxIdx, minIdx);\n }\n }\n\n return {\n x: new Float32Array(outX),\n y: new Float32Array(outY),\n indices: new Uint32Array(outIndices),\n };\n}\n\n/**\n * Calculate optimal target points based on canvas width\n */\nexport function calculateTargetPoints(\n dataLength: number,\n canvasWidth: number,\n pointsPerPixel = 2\n): number {\n // Never draw more than pointsPerPixel per pixel\n const maxPoints = canvasWidth * pointsPerPixel;\n return Math.min(dataLength, maxPoints);\n}\n\nexport interface OhlcDownsampleResult {\n x: Float32Array;\n open: Float32Array;\n high: Float32Array;\n low: Float32Array;\n close: Float32Array;\n indices: Uint32Array;\n}\n\n/**\n * Aggregate OHLC bars into fewer buckets while preserving extremes.\n * Each bucket: open=first open, close=last close, high=max high, low=min low, x=last x.\n */\nexport function ohlcMinMaxDownsample(\n x: Float32Array | Float64Array,\n open: Float32Array | Float64Array,\n high: Float32Array | Float64Array,\n low: Float32Array | Float64Array,\n close: Float32Array | Float64Array,\n targetBars: number,\n): OhlcDownsampleResult {\n const length = x.length;\n if (targetBars >= length || targetBars <= 1 || length === 0) {\n return {\n x: new Float32Array(x),\n open: new Float32Array(open),\n high: new Float32Array(high),\n low: new Float32Array(low),\n close: new Float32Array(close),\n indices: new Uint32Array(Array.from({ length }, (_, i) => i)),\n };\n }\n\n const bucketSize = length / targetBars;\n const outX: number[] = [];\n const outOpen: number[] = [];\n const outHigh: number[] = [];\n const outLow: number[] = [];\n const outClose: number[] = [];\n const outIndices: number[] = [];\n\n for (let b = 0; b < targetBars; b++) {\n const start = Math.floor(b * bucketSize);\n const end = Math.min(length, Math.floor((b + 1) * bucketSize));\n if (start >= end) continue;\n\n let hi = -Infinity;\n let lo = Infinity;\n let lastIdx = start;\n\n for (let i = start; i < end; i++) {\n if (high[i] > hi) hi = high[i];\n if (low[i] < lo) lo = low[i];\n lastIdx = i;\n }\n\n outOpen.push(open[start]);\n outHigh.push(hi);\n outLow.push(lo);\n outClose.push(close[lastIdx]);\n outX.push(x[lastIdx]);\n outIndices.push(lastIdx);\n }\n\n return {\n x: new Float32Array(outX),\n open: new Float32Array(outOpen),\n high: new Float32Array(outHigh),\n low: new Float32Array(outLow),\n close: new Float32Array(outClose),\n indices: new Uint32Array(outIndices),\n };\n}\n\n/** Binary search lower bound: first index where x[i] >= value */\nexport function lowerBoundX(\n x: Float32Array | Float64Array,\n value: number,\n): number {\n let lo = 0;\n let hi = x.length;\n while (lo < hi) {\n const mid = (lo + hi) >>> 1;\n if (x[mid] < value) lo = mid + 1;\n else hi = mid;\n }\n return lo;\n}\n\n/** Binary search upper bound: first index where x[i] > value */\nexport function upperBoundX(\n x: Float32Array | Float64Array,\n value: number,\n): number {\n let lo = 0;\n let hi = x.length;\n while (lo < hi) {\n const mid = (lo + hi) >>> 1;\n if (x[mid] <= value) lo = mid + 1;\n else hi = mid;\n }\n return lo;\n}\n\nexport interface ViewportSlice {\n x: Float32Array;\n y?: Float32Array;\n open?: Float32Array;\n high?: Float32Array;\n low?: Float32Array;\n close?: Float32Array;\n start: number;\n end: number;\n}\n\n/**\n * Slice sorted x-series to visible range plus buffer (fraction of visible width).\n */\nexport function sliceSeriesToViewport(\n source: {\n x: Float32Array | Float64Array;\n y?: Float32Array | Float64Array;\n open?: Float32Array | Float64Array;\n high?: Float32Array | Float64Array;\n low?: Float32Array | Float64Array;\n close?: Float32Array | Float64Array;\n },\n xMin: number,\n xMax: number,\n bufferRatio = 0.5,\n): ViewportSlice {\n const length = source.x.length;\n if (length === 0) {\n return { x: new Float32Array(0), start: 0, end: 0 };\n }\n\n const range = Math.max(xMax - xMin, 1e-12);\n const paddedMin = xMin - range * bufferRatio;\n const paddedMax = xMax + range * bufferRatio;\n\n let start = lowerBoundX(source.x, paddedMin);\n let end = upperBoundX(source.x, paddedMax);\n start = Math.max(0, start);\n end = Math.min(length, Math.max(end, start + 1));\n\n const slice = <T extends Float32Array | Float64Array>(arr: T | undefined): Float32Array | undefined => {\n if (!arr) return undefined;\n return new Float32Array(arr.subarray(start, end));\n };\n\n return {\n x: new Float32Array(source.x.subarray(start, end)),\n y: slice(source.y),\n open: slice(source.open),\n high: slice(source.high),\n low: slice(source.low),\n close: slice(source.close),\n start,\n end,\n };\n}\n","/**\n * Async downsampling via shared worker pool (main-thread fallback in Node/tests).\n * @module workers/downsampleAsync\n */\n\nimport {\n lttbDownsample,\n minMaxDownsample,\n ohlcMinMaxDownsample,\n type OhlcDownsampleResult,\n type DownsampleResult,\n} from \"./downsample\";\nimport { WorkerPool, nextTaskId } from \"./pool\";\n\ntype DownsampleTask = {\n id: string;\n type: \"downsample\";\n x: Float32Array;\n y: Float32Array;\n targetPoints: number;\n algorithm: \"lttb\" | \"minmax\";\n};\n\ntype OhlcDownsampleTask = {\n id: string;\n type: \"ohlc-downsample\";\n x: Float32Array;\n open: Float32Array;\n high: Float32Array;\n low: Float32Array;\n close: Float32Array;\n targetBars: number;\n};\n\ntype DownsampleWorkerResult =\n | {\n id: string;\n type: \"downsample-result\";\n x: Float32Array;\n y: Float32Array;\n }\n | {\n id: string;\n type: \"ohlc-downsample-result\";\n x: Float32Array;\n open: Float32Array;\n high: Float32Array;\n low: Float32Array;\n close: Float32Array;\n }\n | { id: string; type: \"error\"; error: string };\n\nlet pool: WorkerPool<DownsampleTask | OhlcDownsampleTask, DownsampleWorkerResult> | null = null;\n\nfunction getPool() {\n if (pool) return pool;\n\n pool = new WorkerPool<DownsampleTask | OhlcDownsampleTask, DownsampleWorkerResult>(\n () => new Worker(new URL(\"./downsample.worker.ts\", import.meta.url), { type: \"module\" }),\n {\n poolSize: 2,\n syncFallback: true,\n syncHandler: (task) => {\n if (task.type === \"downsample\") {\n const result =\n task.algorithm === \"minmax\"\n ? minMaxDownsample(task.x, task.y, Math.ceil(task.targetPoints / 2))\n : lttbDownsample(task.x, task.y, task.targetPoints);\n return { id: task.id, type: \"downsample-result\", x: result.x, y: result.y };\n }\n\n const result = ohlcMinMaxDownsample(\n task.x,\n task.open,\n task.high,\n task.low,\n task.close,\n task.targetBars,\n );\n return {\n id: task.id,\n type: \"ohlc-downsample-result\",\n x: result.x,\n open: result.open,\n high: result.high,\n low: result.low,\n close: result.close,\n };\n },\n },\n );\n\n return pool;\n}\n\nexport async function downsampleAsync(\n x: Float32Array,\n y: Float32Array,\n targetPoints: number,\n algorithm: \"lttb\" | \"minmax\" = \"lttb\",\n): Promise<DownsampleResult> {\n const id = nextTaskId(\"downsample\");\n const result = await getPool().run({\n id,\n type: \"downsample\",\n x,\n y,\n targetPoints,\n algorithm,\n });\n\n if (result.type === \"error\") throw new Error(result.error);\n if (result.type !== \"downsample-result\") {\n throw new Error(\"Unexpected downsample worker response\");\n }\n\n return {\n x: result.x,\n y: result.y,\n indices: new Uint32Array(result.x.length),\n };\n}\n\nexport async function ohlcDownsampleAsync(\n x: Float32Array,\n open: Float32Array,\n high: Float32Array,\n low: Float32Array,\n close: Float32Array,\n targetBars: number,\n): Promise<OhlcDownsampleResult> {\n const id = nextTaskId(\"ohlc-downsample\");\n const result = await getPool().run({\n id,\n type: \"ohlc-downsample\",\n x,\n open,\n high,\n low,\n close,\n targetBars,\n });\n\n if (result.type === \"error\") throw new Error(result.error);\n if (result.type !== \"ohlc-downsample-result\") {\n throw new Error(\"Unexpected OHLC downsample worker response\");\n }\n\n return {\n x: result.x,\n open: result.open,\n high: result.high,\n low: result.low,\n close: result.close,\n indices: new Uint32Array(result.x.length),\n };\n}\n\nexport function destroyDownsamplePool(): void {\n pool?.destroy();\n pool = null;\n}\n\nexport function getDownsamplePoolSize(): number {\n return pool?.size() ?? 0;\n}\n","/**\n * @fileoverview Data virtualization plugin (LOD/min-max)\n * @module plugins/virtualization\n */\n\nimport type {\n PluginVirtualizationConfig,\n VirtualizationAPI,\n VirtualizationStats,\n VirtualizationMode,\n VirtualizationStrategy,\n} from \"./types\";\nimport type { ChartPlugin, PluginContext, PluginManifest } from \"../types\";\nimport type { Series } from \"../../core/Series\";\nimport type { SeriesUpdateData } from \"../../types\";\nimport {\n lttbDownsample,\n minMaxDownsample,\n ohlcMinMaxDownsample,\n calculateTargetPoints,\n sliceSeriesToViewport,\n} from \"../../workers/downsample\";\nimport { downsampleAsync, ohlcDownsampleAsync } from \"../../workers/downsampleAsync\";\n\nconst manifest: PluginManifest = {\n name: \"velo-plot-virtualization\",\n version: \"1.0.0\",\n description: \"Viewport-aware data virtualization with LOD strategies\",\n provides: [\"performance\", \"data-virtualization\"],\n tags: [\"performance\", \"lod\", \"virtualization\"],\n};\n\nconst DEFAULT_CONFIG: Required<PluginVirtualizationConfig> = {\n enabled: true,\n precision: \"lod\",\n mode: \"lod\",\n targetPoints: \"auto\",\n pointsPerPixel: 2,\n lodLevels: [1, 4, 8, 16],\n strategy: \"lttb\",\n reuseOriginalData: true,\n syncWithLazyLoad: true,\n includeSeries: [],\n excludeSeries: [],\n debug: false,\n viewportBuffer: 0.5,\n useWorker: true,\n workerThreshold: 250_000,\n};\n\ntype SeriesCache = {\n x: Float32Array | Float64Array;\n y?: Float32Array | Float64Array;\n open?: Float32Array | Float64Array;\n high?: Float32Array | Float64Array;\n low?: Float32Array | Float64Array;\n close?: Float32Array | Float64Array;\n};\n\nexport function PluginVirtualization(\n userConfig: Partial<PluginVirtualizationConfig> = {}\n): ChartPlugin<PluginVirtualizationConfig> {\n const config = { ...DEFAULT_CONFIG, ...userConfig };\n let ctx: PluginContext | null = null;\n let isInternalUpdate = false;\n\n const originalData = new Map<string, SeriesCache>();\n const stats = new Map<string, VirtualizationStats>();\n\n let originalUpdateSeries: ((id: string, data: SeriesUpdateData) => void) | null = null;\n let originalAppendData: ((id: string, x: number[] | Float32Array, y: number[] | Float32Array) => void) | null = null;\n let refreshRaf = 0;\n const applyGeneration = new Map<string, number>();\n let lastViewKey = \"\";\n\n function log(message: string, ...args: unknown[]) {\n if (config.debug && ctx) {\n ctx.log.info(`[Virtualization] ${message}`, ...args);\n }\n }\n\n function shouldVirtualize(series: Series): boolean {\n if (!config.enabled) return false;\n if (config.precision === \"full\") return false;\n if (config.includeSeries.length > 0 && !config.includeSeries.includes(series.getId())) return false;\n if (config.excludeSeries.includes(series.getId())) return false;\n\n const type = series.getType();\n return (\n type === \"line\" ||\n type === \"scatter\" ||\n type === \"line+scatter\" ||\n type === \"step\" ||\n type === \"step+scatter\" ||\n type === \"candlestick\" ||\n type === \"bar\"\n );\n }\n\n function isOhlcSeries(series: Series): boolean {\n return series.getType() === \"candlestick\";\n }\n\n function buildUpdatePayload(cache: SeriesCache): SeriesUpdateData {\n if (cache.open && cache.high && cache.low && cache.close) {\n return {\n x: cache.x,\n open: cache.open,\n high: cache.high,\n low: cache.low,\n close: cache.close,\n };\n }\n return { x: cache.x, y: cache.y! };\n }\n\n function getTargetPoints(dataLength: number): number {\n if (!ctx) return dataLength;\n if (config.targetPoints !== \"auto\") return Math.max(2, config.targetPoints);\n const width = ctx.render.canvasSize.width / ctx.render.pixelRatio;\n return calculateTargetPoints(dataLength, width, config.pointsPerPixel);\n }\n\n function downsampleData(\n x: Float32Array | Float64Array,\n y: Float32Array | Float64Array,\n targetPoints: number,\n strategy: VirtualizationStrategy\n ): { x: Float32Array; y: Float32Array } {\n if (targetPoints >= x.length || x.length <= 2) {\n return { x: new Float32Array(x), y: new Float32Array(y) };\n }\n\n if (strategy === \"minmax\") {\n const bucketCount = Math.ceil(targetPoints / 2);\n const result = minMaxDownsample(x, y, bucketCount);\n return { x: result.x, y: result.y };\n }\n\n const result = lttbDownsample(x, y, targetPoints);\n return { x: result.x, y: result.y };\n }\n\n function cacheOriginal(seriesId: string, data: SeriesCache): void {\n if (!config.reuseOriginalData) return;\n if (originalData.has(seriesId)) return;\n originalData.set(seriesId, { ...data });\n }\n\n function restoreOriginal(seriesId: string): SeriesCache | null {\n return originalData.get(seriesId) ?? null;\n }\n\n function updateStats(\n seriesId: string,\n originalPoints: number,\n renderedPoints: number,\n targetPoints: number,\n mode: VirtualizationMode,\n strategy: VirtualizationStrategy,\n ): void {\n stats.set(seriesId, {\n seriesId,\n originalPoints,\n renderedPoints,\n targetPoints,\n lastUpdated: Date.now(),\n mode,\n strategy,\n });\n }\n\n function captureOriginalFromSeries(series: Series): SeriesCache | null {\n const live = series.getData();\n if (!live?.x?.length) return null;\n\n if (isOhlcSeries(series)) {\n if (!live.open || !live.high || !live.low || !live.close) return null;\n const cache: SeriesCache = {\n x: live.x,\n open: live.open,\n high: live.high,\n low: live.low,\n close: live.close,\n };\n cacheOriginal(series.getId(), cache);\n return cache;\n }\n\n if (!live.y) return null;\n const cache: SeriesCache = { x: live.x, y: live.y };\n cacheOriginal(series.getId(), cache);\n return cache;\n }\n\n function getSourceData(series: Series): SeriesCache | null {\n return restoreOriginal(series.getId()) ?? captureOriginalFromSeries(series);\n }\n\n function getViewportSource(source: SeriesCache): SeriesCache {\n if (!ctx) return source;\n const bounds = ctx.data.getViewBounds?.();\n if (!bounds) return source;\n\n const sliced = sliceSeriesToViewport(\n source,\n bounds.xMin,\n bounds.xMax,\n config.viewportBuffer,\n );\n if (sliced.end - sliced.start >= source.x.length) return source;\n\n return {\n x: sliced.x,\n y: sliced.y,\n open: sliced.open,\n high: sliced.high,\n low: sliced.low,\n close: sliced.close,\n };\n }\n\n function commitDownsampled(seriesId: string, payload: SeriesUpdateData): void {\n if (!originalUpdateSeries) return;\n isInternalUpdate = true;\n originalUpdateSeries(seriesId, payload);\n isInternalUpdate = false;\n }\n\n async function runDownsample(\n source: SeriesCache,\n targetPoints: number,\n strategy: VirtualizationStrategy,\n ): Promise<{ x: Float32Array; y: Float32Array }> {\n const x = new Float32Array(source.x);\n const y = new Float32Array(source.y!);\n\n if (config.useWorker && x.length >= config.workerThreshold) {\n const algorithm = strategy === \"minmax\" ? \"minmax\" : \"lttb\";\n const result = await downsampleAsync(x, y, targetPoints, algorithm);\n return { x: result.x, y: result.y };\n }\n\n return downsampleData(x, y, targetPoints, strategy);\n }\n\n async function applyVirtualization(series: Series): Promise<void> {\n if (!ctx || !originalUpdateSeries) return;\n const seriesId = series.getId();\n\n if (!shouldVirtualize(series)) {\n const original = restoreOriginal(seriesId);\n if (original && config.reuseOriginalData) {\n commitDownsampled(seriesId, buildUpdatePayload(original));\n }\n return;\n }\n\n const source = getSourceData(series);\n if (!source?.x?.length) return;\n\n const viewportSource = getViewportSource(source);\n const gen = (applyGeneration.get(seriesId) ?? 0) + 1;\n applyGeneration.set(seriesId, gen);\n\n if (isOhlcSeries(series)) {\n if (!viewportSource.open || !viewportSource.high || !viewportSource.low || !viewportSource.close) {\n return;\n }\n\n const targetBars = getTargetPoints(viewportSource.x.length);\n const x = new Float32Array(viewportSource.x);\n const open = new Float32Array(viewportSource.open);\n const high = new Float32Array(viewportSource.high);\n const low = new Float32Array(viewportSource.low);\n const close = new Float32Array(viewportSource.close);\n\n const downsampled =\n config.useWorker && x.length >= config.workerThreshold\n ? await ohlcDownsampleAsync(x, open, high, low, close, targetBars)\n : ohlcMinMaxDownsample(x, open, high, low, close, targetBars);\n\n if (applyGeneration.get(seriesId) !== gen) return;\n\n commitDownsampled(seriesId, {\n x: downsampled.x,\n open: downsampled.open,\n high: downsampled.high,\n low: downsampled.low,\n close: downsampled.close,\n });\n\n updateStats(seriesId, source.x.length, downsampled.x.length, targetBars, config.mode, \"minmax\");\n return;\n }\n\n if (!viewportSource.y) return;\n\n const targetPoints = getTargetPoints(viewportSource.x.length);\n const strategy = series.getType() === \"bar\" ? \"minmax\" : config.strategy;\n const downsampled = await runDownsample(viewportSource, targetPoints, strategy);\n\n if (applyGeneration.get(seriesId) !== gen) return;\n\n commitDownsampled(seriesId, { x: downsampled.x, y: downsampled.y });\n updateStats(seriesId, source.x.length, downsampled.x.length, targetPoints, config.mode, strategy);\n }\n\n function refreshAll(): void {\n if (!ctx) return;\n ctx.data.getAllSeries().forEach((series) => {\n void applyVirtualization(series);\n });\n }\n\n function scheduleRefreshAll(): void {\n if (!ctx) return;\n const bounds = ctx.data.getViewBounds?.();\n if (bounds) {\n const key = `${bounds.xMin}:${bounds.xMax}:${bounds.yMin}:${bounds.yMax}:${ctx.render.canvasSize.width}`;\n if (key === lastViewKey) return;\n lastViewKey = key;\n }\n\n if (refreshRaf) return;\n refreshRaf = requestAnimationFrame(() => {\n refreshRaf = 0;\n refreshAll();\n });\n }\n\n function handleUpdateSeries(id: string, data: SeriesUpdateData): void {\n if (!ctx || !originalUpdateSeries) return;\n if (!config.enabled || isInternalUpdate) {\n originalUpdateSeries(id, data);\n return;\n }\n\n const series = ctx.chart.getSeries?.(id) as Series | undefined;\n if (!series) {\n originalUpdateSeries(id, data);\n return;\n }\n\n const original = restoreOriginal(id);\n if (original && config.reuseOriginalData) {\n isInternalUpdate = true;\n originalUpdateSeries(id, buildUpdatePayload(original));\n isInternalUpdate = false;\n }\n\n originalUpdateSeries(id, data);\n\n const updatedSeries = ctx.chart.getSeries?.(id) as Series | undefined;\n if (updatedSeries) {\n originalData.delete(id);\n captureOriginalFromSeries(updatedSeries);\n void applyVirtualization(updatedSeries);\n }\n }\n\n function handleAppendData(\n id: string,\n x: number[] | Float32Array,\n y: number[] | Float32Array\n ): void {\n if (!ctx || !originalAppendData || !originalUpdateSeries) return;\n\n if (!config.enabled || isInternalUpdate) {\n originalAppendData(id, x, y);\n return;\n }\n\n const series = ctx.chart.getSeries?.(id) as Series | undefined;\n if (!series) {\n originalAppendData(id, x, y);\n return;\n }\n\n const original = restoreOriginal(id);\n if (original && config.reuseOriginalData) {\n isInternalUpdate = true;\n originalUpdateSeries(id, buildUpdatePayload(original));\n isInternalUpdate = false;\n }\n\n originalAppendData(id, x, y);\n\n const updatedSeries = ctx.chart.getSeries?.(id) as Series | undefined;\n if (updatedSeries) {\n const cached = restoreOriginal(id);\n if (cached?.y && config.reuseOriginalData) {\n cacheOriginal(id, {\n x: appendTyped(cached.x, x),\n y: appendTyped(cached.y, y),\n });\n } else {\n originalData.delete(id);\n captureOriginalFromSeries(updatedSeries);\n }\n void applyVirtualization(updatedSeries);\n }\n }\n\n function appendTyped(\n existing: Float32Array | Float64Array,\n incoming: number[] | Float32Array,\n ): Float32Array {\n const next = incoming instanceof Float32Array ? incoming : Float32Array.from(incoming);\n const merged = new Float32Array(existing.length + next.length);\n merged.set(existing);\n merged.set(next, existing.length);\n return merged;\n }\n\n const api: VirtualizationAPI & Record<string, unknown> = {\n enable() {\n config.enabled = true;\n refreshAll();\n },\n disable() {\n config.enabled = false;\n if (!ctx || !originalUpdateSeries) return;\n const updater = originalUpdateSeries;\n ctx.data.getAllSeries().forEach((series) => {\n const original = restoreOriginal(series.getId());\n if (original) {\n isInternalUpdate = true;\n updater(series.getId(), buildUpdatePayload(original));\n isInternalUpdate = false;\n }\n });\n },\n isEnabled() {\n return config.enabled;\n },\n updateConfig(newConfig) {\n Object.assign(config, newConfig);\n refreshAll();\n },\n invalidate(seriesId) {\n if (!ctx) return;\n if (seriesId) {\n const series = ctx.chart.getSeries?.(seriesId) as Series | undefined;\n if (series) applyVirtualization(series);\n return;\n }\n refreshAll();\n },\n getStats(seriesId) {\n return stats.get(seriesId) ?? null;\n },\n getAllStats() {\n return Array.from(stats.values());\n },\n };\n\n return {\n manifest,\n onInit(pluginCtx: PluginContext) {\n ctx = pluginCtx;\n // API is exposed via plugin.api / chart.virtualization getter (ChartPluginBridge)\n\n const chart = ctx.chart as any;\n originalUpdateSeries = chart.updateSeries?.bind(chart) ?? null;\n originalAppendData = chart.appendData?.bind(chart) ?? null;\n\n if (originalUpdateSeries) {\n chart.updateSeries = (id: string, data: SeriesUpdateData) => handleUpdateSeries(id, data);\n }\n\n if (originalAppendData) {\n chart.appendData = (id: string, x: number[] | Float32Array, y: number[] | Float32Array) =>\n handleAppendData(id, x, y);\n }\n\n ctx.events.on(\"zoom\", () => scheduleRefreshAll());\n ctx.events.on(\"pan\", () => scheduleRefreshAll());\n ctx.events.on(\"resize\", () => {\n lastViewKey = \"\";\n scheduleRefreshAll();\n });\n\n refreshAll();\n log(\"Initialized\");\n },\n onDestroy(pluginCtx: PluginContext) {\n if (refreshRaf) cancelAnimationFrame(refreshRaf);\n refreshRaf = 0;\n applyGeneration.clear();\n if (originalUpdateSeries) {\n (pluginCtx.chart as any).updateSeries = originalUpdateSeries;\n }\n if (originalAppendData) {\n (pluginCtx.chart as any).appendData = originalAppendData;\n }\n ctx = null;\n originalData.clear();\n stats.clear();\n },\n api,\n };\n}\n\nexport default PluginVirtualization;\n\n// Type exports\nexport type {\n PluginVirtualizationConfig,\n VirtualizationAPI,\n VirtualizationStats,\n VirtualizationMode,\n VirtualizationStrategy,\n} from \"./types\";\n"],"names":["lttbDownsample","x","y","targetPoints","length","_","i","outX","outY","outIndices","bucketSize","a","outIdx","bucketStart","bucketEnd","nextBucketStart","nextBucketEnd","avgX","avgY","avgCount","j","maxArea","maxIndex","aX","aY","area","minMaxDownsample","bucketCount","b","start","end","minY","maxY","minIdx","maxIdx","calculateTargetPoints","dataLength","canvasWidth","pointsPerPixel","maxPoints","ohlcMinMaxDownsample","open","high","low","close","targetBars","outOpen","outHigh","outLow","outClose","hi","lo","lastIdx","lowerBoundX","value","mid","upperBoundX","sliceSeriesToViewport","source","xMin","xMax","bufferRatio","range","paddedMin","paddedMax","slice","arr","pool","getPool","WorkerPool","task","result","downsampleAsync","algorithm","id","nextTaskId","ohlcDownsampleAsync","destroyDownsamplePool","getDownsamplePoolSize","manifest","DEFAULT_CONFIG","PluginVirtualization","userConfig","config","ctx","isInternalUpdate","originalData","stats","originalUpdateSeries","originalAppendData","refreshRaf","applyGeneration","lastViewKey","log","message","args","shouldVirtualize","series","type","isOhlcSeries","buildUpdatePayload","cache","getTargetPoints","width","downsampleData","strategy","cacheOriginal","seriesId","data","restoreOriginal","updateStats","originalPoints","renderedPoints","mode","captureOriginalFromSeries","live","_a","getSourceData","getViewportSource","bounds","_b","sliced","commitDownsampled","payload","runDownsample","applyVirtualization","original","viewportSource","gen","downsampled","refreshAll","scheduleRefreshAll","key","handleUpdateSeries","updatedSeries","_d","_c","handleAppendData","cached","appendTyped","existing","incoming","next","merged","pluginCtx","chart","updater","newConfig"],"mappings":"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"}