scichart-engine 1.7.2 → 1.9.1

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 (110) hide show
  1. package/dist/core/chart/ChartCore.d.ts +35 -2
  2. package/dist/core/chart/types.d.ts +31 -0
  3. package/dist/core/series/Series.d.ts +20 -2
  4. package/dist/{mock-DAXWlHh6.js → index-6-LSB7hi.js} +43 -26
  5. package/dist/index-6-LSB7hi.js.map +1 -0
  6. package/dist/{index-IRhlzXlI.js → index-D_gdFhpG.js} +49 -32
  7. package/dist/index-D_gdFhpG.js.map +1 -0
  8. package/dist/{index-CWxIHdwX.js → index-vnImOjDa.js} +36 -19
  9. package/dist/index-vnImOjDa.js.map +1 -0
  10. package/dist/{index.core-CnuU1ey4.js → index.core-9MC7hRn3.js} +2019 -1547
  11. package/dist/index.core-9MC7hRn3.js.map +1 -0
  12. package/dist/index.d.ts +4 -4
  13. package/dist/plugins/analysis/filters.d.ts +13 -0
  14. package/dist/plugins/analysis/index.d.ts +2 -2
  15. package/dist/plugins/analysis.js +264 -254
  16. package/dist/plugins/analysis.js.map +1 -1
  17. package/dist/plugins/broken-axis/BrokenAxisScale.d.ts +24 -0
  18. package/dist/plugins/broken-axis/exports.d.ts +6 -0
  19. package/dist/plugins/broken-axis/index.d.ts +6 -0
  20. package/dist/plugins/broken-axis/types.d.ts +50 -0
  21. package/dist/plugins/caching/exports.d.ts +6 -0
  22. package/dist/plugins/caching/index.d.ts +6 -0
  23. package/dist/plugins/caching/types.d.ts +120 -0
  24. package/dist/plugins/clipboard.js +252 -12
  25. package/dist/plugins/clipboard.js.map +1 -1
  26. package/dist/plugins/data-export.js +180 -180
  27. package/dist/plugins/data-export.js.map +1 -1
  28. package/dist/plugins/data-transform/index.d.ts +6 -0
  29. package/dist/plugins/data-transform/types.d.ts +34 -0
  30. package/dist/plugins/debug.js +244 -61
  31. package/dist/plugins/debug.js.map +1 -1
  32. package/dist/plugins/drag-edit/exports.d.ts +6 -0
  33. package/dist/plugins/drag-edit/index.d.ts +6 -0
  34. package/dist/plugins/drag-edit/types.d.ts +118 -0
  35. package/dist/plugins/gpu.js +2414 -17
  36. package/dist/plugins/gpu.js.map +1 -1
  37. package/dist/plugins/index.d.ts +15 -0
  38. package/dist/plugins/keyboard.js +5 -21
  39. package/dist/plugins/keyboard.js.map +1 -1
  40. package/dist/plugins/latex/exports.d.ts +6 -0
  41. package/dist/plugins/latex/index.d.ts +8 -0
  42. package/dist/plugins/latex/parser.d.ts +6 -0
  43. package/dist/plugins/latex/renderer.d.ts +6 -0
  44. package/dist/plugins/latex/symbols.d.ts +28 -0
  45. package/dist/plugins/latex/types.d.ts +88 -0
  46. package/dist/plugins/lazy-load/exports.d.ts +6 -0
  47. package/dist/plugins/lazy-load/index.d.ts +6 -0
  48. package/dist/plugins/lazy-load/types.d.ts +121 -0
  49. package/dist/plugins/ml-integration/exports.d.ts +11 -0
  50. package/dist/plugins/ml-integration/index.d.ts +6 -0
  51. package/dist/plugins/ml-integration/native-algorithms.d.ts +69 -0
  52. package/dist/plugins/ml-integration/types.d.ts +74 -0
  53. package/dist/plugins/offscreen/exports.d.ts +6 -0
  54. package/dist/plugins/offscreen/index.d.ts +6 -0
  55. package/dist/plugins/offscreen/pool.d.ts +32 -0
  56. package/dist/plugins/offscreen/types.d.ts +35 -0
  57. package/dist/plugins/pattern-recognition/index.d.ts +6 -0
  58. package/dist/plugins/pattern-recognition/patterns.d.ts +3 -0
  59. package/dist/plugins/pattern-recognition/types.d.ts +245 -0
  60. package/dist/plugins/radar/index.d.ts +6 -0
  61. package/dist/plugins/radar/types.d.ts +40 -0
  62. package/dist/plugins/regression/algorithms.d.ts +6 -0
  63. package/dist/plugins/regression/index.d.ts +6 -0
  64. package/dist/plugins/regression/types.d.ts +261 -0
  65. package/dist/plugins/roi/exports.d.ts +6 -0
  66. package/dist/plugins/roi/index.d.ts +49 -0
  67. package/dist/plugins/roi/types.d.ts +60 -0
  68. package/dist/plugins/snapshot/index.d.ts +11 -0
  69. package/dist/plugins/snapshot/types.d.ts +38 -0
  70. package/dist/plugins/streaming.js +8 -24
  71. package/dist/plugins/streaming.js.map +1 -1
  72. package/dist/plugins/sync.js +247 -13
  73. package/dist/plugins/sync.js.map +1 -1
  74. package/dist/plugins/theme-editor.js +3 -19
  75. package/dist/plugins/theme-editor.js.map +1 -1
  76. package/dist/plugins/video-recorder/exports.d.ts +6 -0
  77. package/dist/plugins/video-recorder/index.d.ts +6 -0
  78. package/dist/plugins/video-recorder/types.d.ts +55 -0
  79. package/dist/plugins/virtualization/exports.d.ts +6 -0
  80. package/dist/plugins/virtualization/index.d.ts +6 -0
  81. package/dist/plugins/virtualization/types.d.ts +48 -0
  82. package/dist/renderer/GaugeRenderer.d.ts +3 -0
  83. package/dist/renderer/NativeWebGLRenderer.d.ts +1 -1
  84. package/dist/renderer/SankeyRenderer.d.ts +3 -0
  85. package/dist/renderer/index.d.ts +3 -1
  86. package/dist/renderer/native/draw.d.ts +16 -0
  87. package/dist/renderer/native/types.d.ts +18 -1
  88. package/dist/renderer/native/utils.d.ts +26 -0
  89. package/dist/renderer/radar/RadarRenderer.d.ts +71 -0
  90. package/dist/renderer/radar/index.d.ts +10 -0
  91. package/dist/renderer/ternary/TernaryRenderer.d.ts +39 -0
  92. package/dist/renderer/ternary/index.d.ts +6 -0
  93. package/dist/renderer/ternary/types.d.ts +56 -0
  94. package/dist/scichart-engine.full.js +5087 -1009
  95. package/dist/scichart-engine.full.js.map +1 -1
  96. package/dist/scichart-engine.js +1 -1
  97. package/dist/types.d.ts +203 -4
  98. package/package.json +61 -1
  99. package/dist/gpuCompute-Be2JAcYX.js +0 -2412
  100. package/dist/gpuCompute-Be2JAcYX.js.map +0 -1
  101. package/dist/index-BeNSvLQt.js +0 -248
  102. package/dist/index-BeNSvLQt.js.map +0 -1
  103. package/dist/index-CWxIHdwX.js.map +0 -1
  104. package/dist/index-DB_1SXBk.js +0 -242
  105. package/dist/index-DB_1SXBk.js.map +0 -1
  106. package/dist/index-IRhlzXlI.js.map +0 -1
  107. package/dist/index-q2iX8Vyd.js +0 -194
  108. package/dist/index-q2iX8Vyd.js.map +0 -1
  109. package/dist/index.core-CnuU1ey4.js.map +0 -1
  110. package/dist/mock-DAXWlHh6.js.map +0 -1
@@ -1,5 +1,7 @@
1
1
  import { ChartOptions, AxisOptions, SeriesOptions, HeatmapOptions, SeriesUpdateData, ZoomOptions, CursorOptions, ChartEventMap, Bounds } from '../../types';
2
+ import { EventEmitter } from '../EventEmitter';
2
3
  import { Series } from '../Series';
4
+ import { Scale } from '../../scales';
3
5
  import { ChartTheme } from '../../theme';
4
6
  import { Annotation } from '../annotations';
5
7
  import { SelectedPoint, SelectionMode, HitTestResult, SelectionConfig } from '../selection';
@@ -13,8 +15,8 @@ export declare class ChartImpl implements Chart {
13
15
  private webglCanvas;
14
16
  private overlayCanvas;
15
17
  private overlayCtx;
16
- private series;
17
- private events;
18
+ series: Map<string, Series>;
19
+ events: EventEmitter<ChartEventMap>;
18
20
  private viewBounds;
19
21
  private xAxisOptions;
20
22
  private yAxisOptionsMap;
@@ -58,6 +60,8 @@ export declare class ChartImpl implements Chart {
58
60
  private selectionRect;
59
61
  private pluginManager;
60
62
  private initialOptions;
63
+ setXScale(scale: Scale): void;
64
+ setYScale(yAxisId: string, scale: Scale): void;
61
65
  get analysis(): any;
62
66
  private animationEngine;
63
67
  private animationConfig;
@@ -68,6 +72,18 @@ export declare class ChartImpl implements Chart {
68
72
  get loading(): any;
69
73
  get deltaTool(): any;
70
74
  get peakTool(): any;
75
+ get regression(): any;
76
+ get radar(): any;
77
+ get ml(): any;
78
+ get snapshot(): any;
79
+ get dataExport(): any;
80
+ get roi(): any;
81
+ get videoRecorder(): any;
82
+ get offscreen(): any;
83
+ get virtualization(): any;
84
+ get themeEditor(): any;
85
+ get sync(): any;
86
+ get brokenAxis(): any;
71
87
  constructor(options: ChartOptions);
72
88
  /**
73
89
  * Start the chart initialization (called by queue system)
@@ -154,6 +170,11 @@ export declare class ChartImpl implements Chart {
154
170
  getAnnotation(id: string): Annotation | undefined;
155
171
  getAnnotations(): Annotation[];
156
172
  clearAnnotations(): void;
173
+ /**
174
+ * Get a plugin API by name
175
+ */
176
+ getPlugin<T = any>(name: string): T | null;
177
+ getPluginNames(): string[];
157
178
  private getPluginAPI;
158
179
  exportCSV(options?: ExportOptions): string;
159
180
  exportJSON(options?: ExportOptions): string;
@@ -169,6 +190,18 @@ export declare class ChartImpl implements Chart {
169
190
  * Update Y axis configuration
170
191
  */
171
192
  updateYAxis(id: string, options: Partial<AxisOptions>): void;
193
+ /**
194
+ * Get current device pixel ratio
195
+ */
196
+ getDPR(): number;
197
+ /**
198
+ * Set device pixel ratio and re-render
199
+ */
200
+ setDPR(dpr: number): void;
201
+ /**
202
+ * Update X axis configuration
203
+ */
204
+ updateXAxis(options: Partial<AxisOptions>): void;
172
205
  /**
173
206
  * Get Y axis configuration by ID
174
207
  */
@@ -2,9 +2,11 @@ import { SeriesOptions, HeatmapOptions, SeriesUpdateData, ZoomOptions, CursorOpt
2
2
  import { Series } from '../Series';
3
3
  import { Annotation } from '../annotations';
4
4
  import { ChartAnimationConfig } from '../animation';
5
+ import { EventEmitter } from '../EventEmitter';
5
6
  import { ChartPlugin } from '../../plugins/types';
6
7
 
7
8
  export interface Chart {
9
+ readonly events: EventEmitter<ChartEventMap>;
8
10
  addSeries(options: SeriesOptions | HeatmapOptions): void;
9
11
  addBar(options: Omit<SeriesOptions, "type">): void;
10
12
  addHeatmap(options: Omit<HeatmapOptions, "type">): void;
@@ -25,6 +27,10 @@ export interface Chart {
25
27
  enableCursor(options: CursorOptions): void;
26
28
  disableCursor(): void;
27
29
  resize(width?: number, height?: number): void;
30
+ /** Get current device pixel ratio used for rendering */
31
+ getDPR(): number;
32
+ /** Set device pixel ratio and trigger re-render */
33
+ setDPR(dpr: number): void;
28
34
  render(): void;
29
35
  on<K extends keyof ChartEventMap>(event: K, handler: (data: ChartEventMap[K]) => void): void;
30
36
  off<K extends keyof ChartEventMap>(event: K, handler: (data: ChartEventMap[K]) => void): void;
@@ -39,6 +45,18 @@ export interface Chart {
39
45
  readonly baseTheme: any;
40
46
  readonly analysis: any;
41
47
  readonly animations: any;
48
+ readonly regression: any;
49
+ readonly radar: any;
50
+ readonly ml: any;
51
+ readonly snapshot: any;
52
+ readonly dataExport: any;
53
+ readonly roi: any;
54
+ readonly videoRecorder: any;
55
+ readonly offscreen: any;
56
+ readonly virtualization: any;
57
+ readonly themeEditor: any;
58
+ readonly sync: any;
59
+ readonly brokenAxis: any;
42
60
  addAnnotation(annotation: Annotation): string;
43
61
  removeAnnotation(id: string): boolean;
44
62
  updateAnnotation(id: string, updates: Partial<Annotation>): void;
@@ -70,6 +88,8 @@ export interface Chart {
70
88
  removeYAxis(id: string): boolean;
71
89
  /** Update Y axis configuration */
72
90
  updateYAxis(id: string, options: Partial<AxisOptions>): void;
91
+ /** Update X axis configuration */
92
+ updateXAxis(options: Partial<AxisOptions>): void;
73
93
  /** Get Y axis configuration by ID */
74
94
  getYAxis(id: string): AxisOptions | undefined;
75
95
  /** Get all Y axes configurations */
@@ -115,6 +135,14 @@ export interface Chart {
115
135
  * Get the Peak Tool instance for peak integration
116
136
  */
117
137
  getPeakTool(): any | null;
138
+ /**
139
+ * Get a plugin API by name
140
+ */
141
+ getPlugin<T = any>(name: string): T | null;
142
+ /**
143
+ * Get names of all registered plugins
144
+ */
145
+ getPluginNames(): string[];
118
146
  /** Get current responsive state */
119
147
  getResponsiveState(): import('../responsive').ResponsiveState;
120
148
  /** Configure responsive behavior */
@@ -129,6 +157,9 @@ export interface Chart {
129
157
  toUrlHash(compress?: boolean): string;
130
158
  /** Load state from URL hash */
131
159
  fromUrlHash(hash: string, compressed?: boolean): void;
160
+ /** Set custom scales (e.g. for Broken Axis support) */
161
+ setXScale(scale: any): void;
162
+ setYScale(yAxisId: string, scale: any): void;
132
163
  /** Use a plugin */
133
164
  use(plugin: ChartPlugin): void;
134
165
  /** Destroy the chart and cleanup resources */
@@ -1,4 +1,4 @@
1
- import { SeriesOptions, SeriesData, SeriesStyle, SeriesUpdateData, Bounds, SeriesType, HeatmapOptions, HeatmapData, HeatmapStyle, PolarOptions, PolarData } from '../../types';
1
+ import { SeriesOptions, SeriesData, SeriesStyle, SeriesUpdateData, Bounds, SeriesType, HeatmapOptions, HeatmapData, HeatmapStyle, PolarOptions, PolarData, GaugeOptions, GaugeData, GaugeStyle, SankeyOptions, SankeyData, SankeyStyle } from '../../types';
2
2
 
3
3
  export declare class Series {
4
4
  private id;
@@ -13,16 +13,26 @@ export declare class Series {
13
13
  private maxPoints?;
14
14
  bullishCount: number;
15
15
  bearishCount: number;
16
+ waterfallCounts?: {
17
+ positive: number;
18
+ negative: number;
19
+ subtotal: number;
20
+ connectors: number;
21
+ };
16
22
  private heatmapData?;
17
23
  private heatmapStyle?;
18
24
  private polarData?;
25
+ private gaugeData?;
26
+ private gaugeStyle?;
27
+ private sankeyData?;
28
+ private sankeyStyle?;
19
29
  private lastAppendCount;
20
30
  private cachedBounds;
21
31
  private boundsNeedsUpdate;
22
32
  private _needsBufferUpdate;
23
33
  private smoothedData;
24
34
  private smoothingNeedsUpdate;
25
- constructor(options: SeriesOptions | HeatmapOptions | PolarOptions);
35
+ constructor(options: SeriesOptions | HeatmapOptions | PolarOptions | GaugeOptions | SankeyOptions);
26
36
  getId: () => string;
27
37
  getName: () => string;
28
38
  getType: () => SeriesType;
@@ -35,6 +45,10 @@ export declare class Series {
35
45
  getHeatmapData: () => HeatmapData | undefined;
36
46
  getHeatmapStyle: () => HeatmapStyle | undefined;
37
47
  getPolarData: () => PolarData | undefined;
48
+ getGaugeData: () => GaugeData | undefined;
49
+ getGaugeStyle: () => GaugeStyle | undefined;
50
+ getSankeyData: () => SankeyData | undefined;
51
+ getSankeyStyle: () => SankeyStyle | undefined;
38
52
  getCycle: () => number | undefined;
39
53
  getPointCount: () => number;
40
54
  getLastAppendCount: () => number;
@@ -47,6 +61,10 @@ export declare class Series {
47
61
  updateData(update: SeriesUpdateData): void;
48
62
  setStyle(style: Partial<SeriesStyle>): void;
49
63
  setType(type: SeriesType): void;
64
+ /**
65
+ * Invalidate buffers - call this after modifying data directly
66
+ */
67
+ invalidateBuffers(): void;
50
68
  setVisible(visible: boolean): void;
51
69
  get needsBufferUpdate(): boolean;
52
70
  set needsBufferUpdate(val: boolean);
@@ -14,7 +14,7 @@ function U(r) {
14
14
  seriesId: typeof e.seriesId == "string" ? e.seriesId : void 0
15
15
  } : null;
16
16
  }
17
- function j(r) {
17
+ function _(r) {
18
18
  return (e) => {
19
19
  try {
20
20
  return r(e);
@@ -61,14 +61,14 @@ function J(r) {
61
61
  bufferSize: 0
62
62
  };
63
63
  let k = 0, M = !1;
64
- function x() {
64
+ function A() {
65
65
  if (!(u && (u.readyState === WebSocket.OPEN || u.readyState === WebSocket.CONNECTING))) {
66
66
  d = "connecting";
67
67
  try {
68
68
  u = new WebSocket(e), u.onopen = () => {
69
69
  d = "connected", b = 0, T = Date.now(), l == null || l();
70
- }, u.onmessage = (o) => D(o.data), u.onclose = (o) => {
71
- d = "disconnected", T = null, f == null || f(o), !o.wasClean && b < s && H();
70
+ }, u.onmessage = (o) => H(o.data), u.onclose = (o) => {
71
+ d = "disconnected", T = null, f == null || f(o), !o.wasClean && b < s && D();
72
72
  }, u.onerror = (o) => {
73
73
  d = "error", c == null || c(o);
74
74
  };
@@ -80,18 +80,18 @@ function J(r) {
80
80
  function B() {
81
81
  S && (clearTimeout(S), S = null), u && (u.close(1e3, "Client disconnect"), u = null), d = "disconnected", b = 0, y.clear();
82
82
  }
83
- function H() {
83
+ function D() {
84
84
  S || (d = "reconnecting", b++, v.reconnectCount++, g == null || g(b), S = setTimeout(() => {
85
- S = null, x();
85
+ S = null, A();
86
86
  }, t * b));
87
87
  }
88
- function D(o) {
88
+ function H(o) {
89
89
  v.messagesReceived++, v.lastMessageTime = Date.now();
90
90
  try {
91
91
  const p = typeof o == "string" ? JSON.parse(o) : o, m = a(p);
92
92
  if (!m) return;
93
- const A = Array.isArray(m) ? m : [m];
94
- for (const R of A) {
93
+ const P = Array.isArray(m) ? m : [m];
94
+ for (const R of P) {
95
95
  const C = R.seriesId || "default";
96
96
  y.has(C) || y.set(C, []), y.get(C).push(R), v.pointsProcessed++;
97
97
  }
@@ -112,15 +112,15 @@ function J(r) {
112
112
  if (p.length !== 0 && (p.length >= n || performance.now() - k > i * 2)) {
113
113
  const m = w.get(o);
114
114
  if (m) {
115
- const A = p.splice(0, p.length);
116
- for (const R of m) R(A);
115
+ const P = p.splice(0, p.length);
116
+ for (const R of m) R(P);
117
117
  } else
118
118
  p.length = 0;
119
119
  }
120
120
  v.bufferSize = Array.from(y.values()).reduce((o, p) => o + p.length, 0);
121
121
  }
122
122
  return {
123
- connect: x,
123
+ connect: A,
124
124
  disconnect: B,
125
125
  isConnected: () => u !== null && u.readyState === WebSocket.OPEN,
126
126
  getState: () => d,
@@ -137,7 +137,7 @@ function J(r) {
137
137
  getStats: () => ({ ...v, connectionUptime: T ? Date.now() - T : 0 })
138
138
  };
139
139
  }
140
- class W {
140
+ class I {
141
141
  constructor(e) {
142
142
  h(this, "buffer");
143
143
  h(this, "head", 0);
@@ -232,7 +232,7 @@ class W {
232
232
  return this.capacity;
233
233
  }
234
234
  }
235
- class P {
235
+ class x {
236
236
  constructor(e) {
237
237
  h(this, "config");
238
238
  h(this, "buffers", /* @__PURE__ */ new Map());
@@ -260,7 +260,7 @@ class P {
260
260
  */
261
261
  push(e, s) {
262
262
  var l, f;
263
- this.buffers.has(e) || (this.buffers.set(e, new W(this.config.maxBuffer)), this.stats.set(e, { dropped: 0, sampled: 0, lastIncoming: 0, lastOutgoing: 0 }));
263
+ this.buffers.has(e) || (this.buffers.set(e, new I(this.config.maxBuffer)), this.stats.set(e, { dropped: 0, sampled: 0, lastIncoming: 0, lastOutgoing: 0 }));
264
264
  const t = this.buffers.get(e), n = this.stats.get(e);
265
265
  let i = 0, a = 0;
266
266
  for (const c of s)
@@ -431,10 +431,10 @@ class P {
431
431
  }
432
432
  }
433
433
  function X(r = 1e4, e = "drop-oldest") {
434
- return new P({ maxBuffer: r, strategy: e });
434
+ return new x({ maxBuffer: r, strategy: e });
435
435
  }
436
436
  function $(r = 5e4) {
437
- return new P({
437
+ return new x({
438
438
  maxBuffer: r,
439
439
  strategy: "drop-oldest",
440
440
  warningThreshold: 0.8,
@@ -442,7 +442,7 @@ function $(r = 5e4) {
442
442
  });
443
443
  }
444
444
  function q(r = 1e5) {
445
- return new P({
445
+ return new x({
446
446
  maxBuffer: r,
447
447
  strategy: "pause",
448
448
  warningThreshold: 0.6,
@@ -450,7 +450,7 @@ function q(r = 1e5) {
450
450
  });
451
451
  }
452
452
  function K(r) {
453
- const { interval: e = 100, generatePoint: s = I } = r;
453
+ const { interval: e = 100, generatePoint: s = W } = r;
454
454
  let t = null, n = !1;
455
455
  const i = /* @__PURE__ */ new Map(), a = {
456
456
  messagesReceived: 0,
@@ -499,21 +499,38 @@ function K(r) {
499
499
  };
500
500
  }
501
501
  let z = 0;
502
- function I() {
502
+ function W() {
503
503
  return {
504
504
  x: z++,
505
505
  y: Math.sin(z * 0.1) + Math.random() * 0.2
506
506
  };
507
507
  }
508
+ const G = {
509
+ name: "scichart-streaming",
510
+ version: "1.0.0",
511
+ description: "Real-time data streaming support for scichart-engine",
512
+ provides: ["data-source"],
513
+ tags: ["websocket", "real-time", "streaming", "backpressure"]
514
+ };
515
+ function Q(r = {}) {
516
+ return {
517
+ manifest: G,
518
+ onInit(e) {
519
+ },
520
+ onDestroy(e) {
521
+ }
522
+ };
523
+ }
508
524
  export {
509
- P as B,
510
- W as C,
525
+ x as B,
526
+ I as C,
527
+ Q as P,
511
528
  E as a,
512
- j as b,
529
+ _ as b,
513
530
  J as c,
514
- X as d,
515
- K as e,
531
+ K as d,
532
+ X as e,
516
533
  $ as f,
517
534
  q as g
518
535
  };
519
- //# sourceMappingURL=mock-DAXWlHh6.js.map
536
+ //# sourceMappingURL=index-6-LSB7hi.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-6-LSB7hi.js","sources":["../src/streaming/utils.ts","../src/streaming/websocket.ts","../src/streaming/backpressure.ts","../src/streaming/mock.ts","../src/plugins/streaming/index.ts"],"sourcesContent":["/**\n * WebSocket Streaming Utilities\n */\nimport { DataPoint, WebSocketStream } from \"./types\";\n\n/**\n * Default message parser - expects { x, y, seriesId? } or array of same\n */\nexport function defaultParser(data: unknown): DataPoint | DataPoint[] | null {\n if (!data || typeof data !== 'object') return null;\n \n // Array of points\n if (Array.isArray(data)) {\n return data\n .filter((item): item is DataPoint => \n typeof item === 'object' && \n item !== null && \n typeof item.x === 'number' && \n typeof item.y === 'number'\n );\n }\n \n // Single point\n const point = data as Record<string, unknown>;\n if (typeof point.x === 'number' && typeof point.y === 'number') {\n return {\n x: point.x,\n y: point.y,\n seriesId: typeof point.seriesId === 'string' ? point.seriesId : undefined,\n };\n }\n \n return null;\n}\n\n/**\n * Helper to create a parser for custom message formats\n */\nexport function createMessageParser<T>(\n transform: (message: T) => DataPoint | DataPoint[] | null\n): (data: unknown) => DataPoint | DataPoint[] | null {\n return (data: unknown) => {\n try {\n return transform(data as T);\n } catch {\n return null;\n }\n };\n}\n\n/**\n * Helper to connect a WebSocket stream to a chart\n */\nexport function connectStreamToChart(\n stream: WebSocketStream,\n chart: { appendData: (seriesId: string, data: { x: Float32Array; y: Float32Array }) => void },\n seriesIds: string[] = ['default']\n): () => void {\n const unsubscribers: (() => void)[] = [];\n\n for (const seriesId of seriesIds) {\n const unsubscribe = stream.subscribe(seriesId, (points) => {\n if (points.length === 0) return;\n \n const x = new Float32Array(points.map(p => p.x));\n const y = new Float32Array(points.map(p => p.y));\n \n chart.appendData(seriesId, { x, y });\n });\n \n unsubscribers.push(unsubscribe);\n }\n\n // Return cleanup function\n return () => {\n for (const unsubscribe of unsubscribers) {\n unsubscribe();\n }\n };\n}\n","/**\n * WebSocket Stream Implementation\n */\nimport { \n WebSocketStreamConfig, \n DataPoint, \n WebSocketStream, \n StreamStats, \n WebSocketState \n} from \"./types\";\nimport { defaultParser } from \"./utils\";\n\n/**\n * Create a WebSocket stream for real-time chart data\n */\nexport function createWebSocketStream(config: WebSocketStreamConfig): WebSocketStream {\n const {\n url,\n maxReconnectAttempts = 5,\n reconnectDelay = 1000,\n bufferSize = 10,\n throttleMs = 16,\n parseMessage = defaultParser,\n onConnect,\n onDisconnect,\n onError,\n onReconnect,\n } = config;\n\n let ws: WebSocket | null = null;\n let state: WebSocketState = 'disconnected';\n let reconnectAttempts = 0;\n let reconnectTimeout: ReturnType<typeof setTimeout> | null = null;\n let connectionStartTime: number | null = null;\n\n const buffers = new Map<string, DataPoint[]>();\n const subscribers = new Map<string, Set<(points: DataPoint[]) => void>>();\n \n const stats: StreamStats = {\n messagesReceived: 0,\n pointsProcessed: 0,\n reconnectCount: 0,\n lastMessageTime: null,\n connectionUptime: 0,\n bufferSize: 0,\n };\n\n let lastFlushTime = 0;\n let flushScheduled = false;\n\n function connect(): void {\n if (ws && (ws.readyState === WebSocket.OPEN || ws.readyState === WebSocket.CONNECTING)) {\n return;\n }\n state = 'connecting';\n try {\n ws = new WebSocket(url);\n ws.onopen = () => {\n state = 'connected';\n reconnectAttempts = 0;\n connectionStartTime = Date.now();\n onConnect?.();\n };\n ws.onmessage = (event) => handleMessage(event.data);\n ws.onclose = (event) => {\n state = 'disconnected';\n connectionStartTime = null;\n onDisconnect?.(event);\n if (!event.wasClean && reconnectAttempts < maxReconnectAttempts) scheduleReconnect();\n };\n ws.onerror = (error) => {\n state = 'error';\n onError?.(error);\n };\n } catch (error) {\n state = 'error';\n onError?.(error as Event);\n }\n }\n\n function disconnect(): void {\n if (reconnectTimeout) { clearTimeout(reconnectTimeout); reconnectTimeout = null; }\n if (ws) { ws.close(1000, 'Client disconnect'); ws = null; }\n state = 'disconnected';\n reconnectAttempts = 0;\n buffers.clear();\n }\n\n function scheduleReconnect(): void {\n if (reconnectTimeout) return;\n state = 'reconnecting';\n reconnectAttempts++;\n stats.reconnectCount++;\n onReconnect?.(reconnectAttempts);\n reconnectTimeout = setTimeout(() => {\n reconnectTimeout = null;\n connect();\n }, reconnectDelay * reconnectAttempts);\n }\n\n function handleMessage(data: unknown): void {\n stats.messagesReceived++;\n stats.lastMessageTime = Date.now();\n try {\n const parsed = typeof data === 'string' ? JSON.parse(data) : data;\n const points = parseMessage(parsed);\n if (!points) return;\n const pointArray = Array.isArray(points) ? points : [points];\n for (const point of pointArray) {\n const seriesId = point.seriesId || 'default';\n if (!buffers.has(seriesId)) buffers.set(seriesId, []);\n buffers.get(seriesId)!.push(point);\n stats.pointsProcessed++;\n }\n stats.bufferSize = Array.from(buffers.values()).reduce((sum, b) => sum + b.length, 0);\n scheduleFlush();\n } catch {}\n }\n\n function scheduleFlush(): void {\n if (flushScheduled) return;\n const now = performance.now();\n const timeSinceLastFlush = now - lastFlushTime;\n if (timeSinceLastFlush >= throttleMs) {\n flush();\n } else {\n flushScheduled = true;\n setTimeout(() => { flushScheduled = false; flush(); }, throttleMs - timeSinceLastFlush);\n }\n }\n\n function flush(): void {\n lastFlushTime = performance.now();\n for (const [seriesId, buffer] of buffers.entries()) {\n if (buffer.length === 0) continue;\n if (buffer.length >= bufferSize || performance.now() - lastFlushTime > throttleMs * 2) {\n const callbacks = subscribers.get(seriesId);\n if (callbacks) {\n const points = buffer.splice(0, buffer.length);\n for (const callback of callbacks) callback(points);\n } else {\n buffer.length = 0;\n }\n }\n }\n stats.bufferSize = Array.from(buffers.values()).reduce((sum, b) => sum + b.length, 0);\n }\n\n return {\n connect,\n disconnect,\n isConnected: () => ws !== null && ws.readyState === WebSocket.OPEN,\n getState: () => state,\n subscribe: (seriesId, callback) => {\n if (!subscribers.has(seriesId)) subscribers.set(seriesId, new Set());\n subscribers.get(seriesId)!.add(callback);\n return () => {\n const callbacks = subscribers.get(seriesId);\n if (callbacks) {\n callbacks.delete(callback);\n if (callbacks.size === 0) subscribers.delete(seriesId);\n }\n };\n },\n unsubscribeAll: () => { subscribers.clear(); buffers.clear(); },\n send: (message) => {\n if (ws && ws.readyState === WebSocket.OPEN) {\n ws.send(typeof message === 'string' ? message : JSON.stringify(message));\n }\n },\n getStats: () => ({ ...stats, connectionUptime: connectionStartTime ? Date.now() - connectionStartTime : 0 }),\n };\n}\n","/**\n * SciChart Engine - Backpressure Management Module\n * \n * Provides advanced backpressure handling for streaming data:\n * - Configurable buffer limits\n * - Multiple overflow strategies (drop-oldest, pause, sample)\n * - Health monitoring and metrics\n * - Automatic flow control\n * \n * @module backpressure\n */\n\nimport type { DataPoint } from \"./types\";\n\n// ============================================\n// Types\n// ============================================\n\nexport type OverflowStrategy = 'drop-oldest' | 'drop-newest' | 'pause' | 'sample' | 'block';\n\nexport interface BackpressureConfig {\n /** Maximum buffer size before triggering backpressure (default: 10000) */\n maxBuffer: number;\n /** Warning threshold as fraction of maxBuffer (default: 0.7) */\n warningThreshold?: number;\n /** Critical threshold as fraction of maxBuffer (default: 0.9) */\n criticalThreshold?: number;\n /** Overflow handling strategy (default: 'drop-oldest') */\n strategy: OverflowStrategy;\n /** For 'sample' strategy: keep every Nth point (default: 2) */\n sampleRate?: number;\n /** Callback when pressure level changes */\n onPressure?: (stats: PressureStats) => void;\n /** Callback when buffer overflows */\n onOverflow?: (droppedCount: number) => void;\n /** Callback when back to normal */\n onRecovery?: () => void;\n}\n\nexport interface PressureStats {\n /** Current buffer fill level (0-1) */\n fillLevel: number;\n /** Pressure state */\n state: 'normal' | 'warning' | 'critical' | 'overflow';\n /** Current buffer size */\n bufferSize: number;\n /** Maximum buffer size */\n maxBuffer: number;\n /** Points dropped due to overflow */\n droppedCount: number;\n /** Points sampled/skipped */\n sampledCount: number;\n /** Incoming rate (points per second) */\n incomingRate: number;\n /** Outgoing rate (points per second) */\n outgoingRate: number;\n /** Whether stream is paused due to backpressure */\n isPaused: boolean;\n}\n\nexport interface BufferHealth {\n /** Overall health score (0-100) */\n score: number;\n /** Health status */\n status: 'healthy' | 'degraded' | 'critical';\n /** Recommendations */\n recommendations: string[];\n}\n\n// ============================================\n// Circular Buffer Implementation\n// ============================================\n\nexport class CircularBuffer<T> {\n private buffer: T[];\n private head: number = 0;\n private tail: number = 0;\n private count: number = 0;\n private readonly capacity: number;\n\n constructor(capacity: number) {\n this.capacity = capacity;\n this.buffer = new Array(capacity);\n }\n\n /**\n * Add item to buffer\n * @returns true if item was added, false if buffer was full\n */\n push(item: T): boolean {\n if (this.count === this.capacity) {\n return false;\n }\n this.buffer[this.tail] = item;\n this.tail = (this.tail + 1) % this.capacity;\n this.count++;\n return true;\n }\n\n /**\n * Add item, overwriting oldest if full\n * @returns the overwritten item, or undefined\n */\n pushOverwrite(item: T): T | undefined {\n let overwritten: T | undefined;\n if (this.count === this.capacity) {\n overwritten = this.buffer[this.head];\n this.head = (this.head + 1) % this.capacity;\n this.count--;\n }\n this.buffer[this.tail] = item;\n this.tail = (this.tail + 1) % this.capacity;\n this.count++;\n return overwritten;\n }\n\n /**\n * Remove and return oldest item\n */\n shift(): T | undefined {\n if (this.count === 0) {\n return undefined;\n }\n const item = this.buffer[this.head];\n this.head = (this.head + 1) % this.capacity;\n this.count--;\n return item;\n }\n\n /**\n * Remove and return multiple items\n */\n shiftMany(n: number): T[] {\n const result: T[] = [];\n const toRemove = Math.min(n, this.count);\n for (let i = 0; i < toRemove; i++) {\n result.push(this.buffer[this.head]);\n this.head = (this.head + 1) % this.capacity;\n }\n this.count -= toRemove;\n return result;\n }\n\n /**\n * Peek at oldest item without removing\n */\n peek(): T | undefined {\n return this.count > 0 ? this.buffer[this.head] : undefined;\n }\n\n /**\n * Get all items as array\n */\n toArray(): T[] {\n const result: T[] = [];\n let current = this.head;\n for (let i = 0; i < this.count; i++) {\n result.push(this.buffer[current]);\n current = (current + 1) % this.capacity;\n }\n return result;\n }\n\n /**\n * Clear the buffer\n */\n clear(): void {\n this.head = 0;\n this.tail = 0;\n this.count = 0;\n }\n\n /**\n * Get current size\n */\n size(): number {\n return this.count;\n }\n\n /**\n * Check if buffer is full\n */\n isFull(): boolean {\n return this.count === this.capacity;\n }\n\n /**\n * Check if buffer is empty\n */\n isEmpty(): boolean {\n return this.count === 0;\n }\n\n /**\n * Get fill level (0-1)\n */\n fillLevel(): number {\n return this.count / this.capacity;\n }\n\n /**\n * Get capacity\n */\n getCapacity(): number {\n return this.capacity;\n }\n}\n\n// ============================================\n// Backpressure Manager\n// ============================================\n\nexport class BackpressureManager {\n private config: Required<BackpressureConfig>;\n private buffers: Map<string, CircularBuffer<DataPoint>> = new Map();\n private stats: Map<string, { dropped: number; sampled: number; lastIncoming: number; lastOutgoing: number }> = new Map();\n private paused: boolean = false;\n private sampleCounter: number = 0;\n\n // Rate tracking\n private incomingHistory: number[] = [];\n private outgoingHistory: number[] = [];\n private lastRateUpdate: number = 0;\n private currentIncoming: number = 0;\n private currentOutgoing: number = 0;\n\n constructor(config: BackpressureConfig) {\n this.config = {\n warningThreshold: 0.7,\n criticalThreshold: 0.9,\n sampleRate: 2,\n onPressure: undefined,\n onOverflow: undefined,\n onRecovery: undefined,\n ...config,\n } as Required<BackpressureConfig>;\n }\n\n /**\n * Add points to the buffer with backpressure handling\n */\n push(seriesId: string, points: DataPoint[]): number {\n if (!this.buffers.has(seriesId)) {\n this.buffers.set(seriesId, new CircularBuffer(this.config.maxBuffer));\n this.stats.set(seriesId, { dropped: 0, sampled: 0, lastIncoming: 0, lastOutgoing: 0 });\n }\n\n const buffer = this.buffers.get(seriesId)!;\n const stats = this.stats.get(seriesId)!;\n let added = 0;\n let dropped = 0;\n\n for (const point of points) {\n this.currentIncoming++;\n stats.lastIncoming = Date.now();\n\n // Handle based on strategy when buffer is under pressure\n if (buffer.fillLevel() >= this.config.criticalThreshold) {\n switch (this.config.strategy) {\n case 'drop-oldest':\n // Overwrite oldest points\n const overwritten = buffer.pushOverwrite(point);\n if (overwritten) {\n dropped++;\n stats.dropped++;\n }\n added++;\n break;\n\n case 'drop-newest':\n // Skip new points\n dropped++;\n stats.dropped++;\n continue;\n\n case 'pause':\n // Signal pause (external handling required)\n this.paused = true;\n return added;\n\n case 'sample':\n // Keep every Nth point\n this.sampleCounter++;\n if (this.sampleCounter >= this.config.sampleRate) {\n this.sampleCounter = 0;\n buffer.pushOverwrite(point);\n added++;\n } else {\n stats.sampled++;\n }\n break;\n\n case 'block':\n // Block until buffer has space\n if (!buffer.isFull()) {\n buffer.push(point);\n added++;\n }\n break;\n }\n } else {\n // Normal operation\n if (buffer.push(point)) {\n added++;\n } else {\n // Shouldn't happen in normal operation\n buffer.pushOverwrite(point);\n added++;\n dropped++;\n stats.dropped++;\n }\n }\n }\n\n // Track drops\n if (dropped > 0) {\n this.config.onOverflow?.(dropped);\n }\n\n // Check and report pressure state\n this.checkPressure(seriesId);\n this.updateRates();\n\n return added;\n }\n\n /**\n * Consume points from buffer\n */\n consume(seriesId: string, count?: number): DataPoint[] {\n const buffer = this.buffers.get(seriesId);\n if (!buffer) return [];\n\n const stats = this.stats.get(seriesId)!;\n const toConsume = count ?? buffer.size();\n const points = buffer.shiftMany(toConsume);\n\n this.currentOutgoing += points.length;\n stats.lastOutgoing = Date.now();\n\n // Check for recovery from paused state\n if (this.paused && buffer.fillLevel() < this.config.warningThreshold) {\n this.paused = false;\n this.config.onRecovery?.();\n }\n\n this.updateRates();\n return points;\n }\n\n /**\n * Consume all points from buffer\n */\n consumeAll(seriesId: string): DataPoint[] {\n return this.consume(seriesId);\n }\n\n /**\n * Get current pressure stats for a series\n */\n getPressureStats(seriesId: string): PressureStats {\n const buffer = this.buffers.get(seriesId);\n const stats = this.stats.get(seriesId);\n\n if (!buffer || !stats) {\n return {\n fillLevel: 0,\n state: 'normal',\n bufferSize: 0,\n maxBuffer: this.config.maxBuffer,\n droppedCount: 0,\n sampledCount: 0,\n incomingRate: 0,\n outgoingRate: 0,\n isPaused: false,\n };\n }\n\n const fillLevel = buffer.fillLevel();\n let state: PressureStats['state'] = 'normal';\n if (fillLevel >= this.config.criticalThreshold) {\n state = buffer.isFull() ? 'overflow' : 'critical';\n } else if (fillLevel >= this.config.warningThreshold) {\n state = 'warning';\n }\n\n return {\n fillLevel,\n state,\n bufferSize: buffer.size(),\n maxBuffer: this.config.maxBuffer,\n droppedCount: stats.dropped,\n sampledCount: stats.sampled,\n incomingRate: this.getAverageRate(this.incomingHistory),\n outgoingRate: this.getAverageRate(this.outgoingHistory),\n isPaused: this.paused,\n };\n }\n\n /**\n * Get aggregate stats for all series\n */\n getGlobalStats(): PressureStats {\n let totalSize = 0;\n let totalDropped = 0;\n let totalSampled = 0;\n\n for (const [seriesId] of this.buffers) {\n const buffer = this.buffers.get(seriesId)!;\n const stats = this.stats.get(seriesId)!;\n totalSize += buffer.size();\n totalDropped += stats.dropped;\n totalSampled += stats.sampled;\n }\n\n const maxTotal = this.config.maxBuffer * this.buffers.size;\n const fillLevel = maxTotal > 0 ? totalSize / maxTotal : 0;\n\n let state: PressureStats['state'] = 'normal';\n if (fillLevel >= this.config.criticalThreshold) {\n state = 'critical';\n } else if (fillLevel >= this.config.warningThreshold) {\n state = 'warning';\n }\n\n return {\n fillLevel,\n state,\n bufferSize: totalSize,\n maxBuffer: maxTotal,\n droppedCount: totalDropped,\n sampledCount: totalSampled,\n incomingRate: this.getAverageRate(this.incomingHistory),\n outgoingRate: this.getAverageRate(this.outgoingHistory),\n isPaused: this.paused,\n };\n }\n\n /**\n * Get buffer health assessment\n */\n getHealth(): BufferHealth {\n const stats = this.getGlobalStats();\n const recommendations: string[] = [];\n let score = 100;\n\n // Deduct for fill level\n if (stats.fillLevel > 0.9) {\n score -= 40;\n recommendations.push('Buffer critically full - reduce data rate or increase buffer size');\n } else if (stats.fillLevel > 0.7) {\n score -= 20;\n recommendations.push('Buffer filling up - consider increasing consumption rate');\n }\n\n // Deduct for drops\n if (stats.droppedCount > 0) {\n const dropRate = stats.droppedCount / (stats.droppedCount + stats.bufferSize + 1);\n score -= Math.min(30, dropRate * 100);\n recommendations.push(`Data being dropped (${stats.droppedCount} points) - buffer overflow`);\n }\n\n // Deduct for rate imbalance\n if (stats.incomingRate > stats.outgoingRate * 1.5) {\n score -= 15;\n recommendations.push('Incoming rate exceeds processing rate - consider sampling or throttling');\n }\n\n // Deduct for pause state\n if (stats.isPaused) {\n score -= 25;\n recommendations.push('Stream paused due to backpressure');\n }\n\n let status: BufferHealth['status'] = 'healthy';\n if (score < 50) {\n status = 'critical';\n } else if (score < 75) {\n status = 'degraded';\n }\n\n return {\n score: Math.max(0, score),\n status,\n recommendations,\n };\n }\n\n /**\n * Check if paused due to backpressure\n */\n isPaused(): boolean {\n return this.paused;\n }\n\n /**\n * Resume if paused\n */\n resume(): void {\n this.paused = false;\n }\n\n /**\n * Clear all buffers\n */\n clear(seriesId?: string): void {\n if (seriesId) {\n this.buffers.get(seriesId)?.clear();\n const stats = this.stats.get(seriesId);\n if (stats) {\n stats.dropped = 0;\n stats.sampled = 0;\n }\n } else {\n for (const buffer of this.buffers.values()) {\n buffer.clear();\n }\n for (const stats of this.stats.values()) {\n stats.dropped = 0;\n stats.sampled = 0;\n }\n }\n this.paused = false;\n }\n\n /**\n * Update configuration\n */\n updateConfig(config: Partial<BackpressureConfig>): void {\n Object.assign(this.config, config);\n }\n\n /**\n * Get current configuration\n */\n getConfig(): BackpressureConfig {\n return { ...this.config };\n }\n\n // ============================================\n // Private Methods\n // ============================================\n\n private checkPressure(seriesId: string): void {\n const stats = this.getPressureStats(seriesId);\n this.config.onPressure?.(stats);\n }\n\n private updateRates(): void {\n const now = Date.now();\n const elapsed = now - this.lastRateUpdate;\n\n // Update every second\n if (elapsed >= 1000) {\n this.incomingHistory.push(this.currentIncoming);\n this.outgoingHistory.push(this.currentOutgoing);\n\n // Keep last 10 seconds\n if (this.incomingHistory.length > 10) this.incomingHistory.shift();\n if (this.outgoingHistory.length > 10) this.outgoingHistory.shift();\n\n this.currentIncoming = 0;\n this.currentOutgoing = 0;\n this.lastRateUpdate = now;\n }\n }\n\n private getAverageRate(history: number[]): number {\n if (history.length === 0) return 0;\n return history.reduce((a, b) => a + b, 0) / history.length;\n }\n}\n\n// ============================================\n// Convenience Functions\n// ============================================\n\n/**\n * Create a backpressure manager with default settings\n */\nexport function createBackpressureManager(\n maxBuffer: number = 10000,\n strategy: OverflowStrategy = 'drop-oldest'\n): BackpressureManager {\n return new BackpressureManager({ maxBuffer, strategy });\n}\n\n/**\n * Create a high-performance backpressure manager optimized for real-time\n */\nexport function createRealtimeBackpressure(\n maxBuffer: number = 50000\n): BackpressureManager {\n return new BackpressureManager({\n maxBuffer,\n strategy: 'drop-oldest',\n warningThreshold: 0.8,\n criticalThreshold: 0.95,\n });\n}\n\n/**\n * Create a lossless backpressure manager (for when data loss is unacceptable)\n */\nexport function createLosslessBackpressure(\n maxBuffer: number = 100000\n): BackpressureManager {\n return new BackpressureManager({\n maxBuffer,\n strategy: 'pause',\n warningThreshold: 0.6,\n criticalThreshold: 0.8,\n });\n}\n","/**\n * Mock WebSocket Stream for Testing\n */\nimport { DataPoint, WebSocketStream, StreamStats } from \"./types\";\n\n/**\n * Mock WebSocket stream for testing\n */\nexport function createMockStream(config: {\n interval?: number;\n generatePoint?: () => DataPoint;\n}): WebSocketStream & { start: () => void; stop: () => void } {\n const { interval = 100, generatePoint = defaultGenerator } = config;\n \n let intervalId: ReturnType<typeof setInterval> | null = null;\n let connected = false;\n const subscribers = new Map<string, Set<(points: DataPoint[]) => void>>();\n \n const stats: StreamStats = {\n messagesReceived: 0,\n pointsProcessed: 0,\n reconnectCount: 0,\n lastMessageTime: null,\n connectionUptime: 0,\n bufferSize: 0,\n };\n\n let startTime: number | null = null;\n\n function start(): void {\n if (intervalId) return;\n \n startTime = Date.now();\n intervalId = setInterval(() => {\n const point = generatePoint();\n stats.messagesReceived++;\n stats.pointsProcessed++;\n stats.lastMessageTime = Date.now();\n \n const seriesId = point.seriesId || 'default';\n const callbacks = subscribers.get(seriesId);\n \n if (callbacks) {\n for (const callback of callbacks) {\n callback([point]);\n }\n }\n }, interval);\n }\n\n function stop(): void {\n if (intervalId) {\n clearInterval(intervalId);\n intervalId = null;\n }\n startTime = null;\n }\n\n return {\n connect: () => { connected = true; start(); },\n disconnect: () => { connected = false; stop(); },\n isConnected: () => connected,\n getState: () => connected ? 'connected' : 'disconnected',\n subscribe: (seriesId, callback) => {\n if (!subscribers.has(seriesId)) {\n subscribers.set(seriesId, new Set());\n }\n subscribers.get(seriesId)!.add(callback);\n return () => {\n subscribers.get(seriesId)?.delete(callback);\n };\n },\n unsubscribeAll: () => subscribers.clear(),\n send: () => {},\n getStats: () => ({\n ...stats,\n connectionUptime: startTime ? Date.now() - startTime : 0,\n }),\n start,\n stop,\n };\n}\n\nlet mockX = 0;\nfunction defaultGenerator(): DataPoint {\n return {\n x: mockX++,\n y: Math.sin(mockX * 0.1) + Math.random() * 0.2,\n };\n}\n","/**\n * SciChart Engine - Streaming Plugin\n * \n * Provides real-time data streaming capabilities including:\n * - WebSocket connections\n * - Backpressure management\n * - Mock data streaming for testing\n * \n * @module plugins/streaming\n */\n\nexport {\n createWebSocketStream,\n} from \"../../streaming/websocket\";\n\nexport {\n connectStreamToChart,\n createMessageParser,\n} from \"../../streaming/utils\";\n\nexport {\n BackpressureManager,\n CircularBuffer,\n createBackpressureManager,\n} from \"../../streaming/backpressure\";\n\nexport { createMockStream } from \"../../streaming/mock\";\n\nexport * from \"../../streaming/types\";\n\nimport type { PluginManifest, ChartPlugin, PluginContext } from \"../types\";\n\nexport interface PluginStreamingConfig {\n /** Default WebSocket URL */\n url?: string;\n /** Backpressure strategy */\n backpressure?: {\n maxBufferSize?: number;\n overflowStrategy?: \"drop-oldest\" | \"drop-newest\" | \"error\";\n };\n}\n\nconst manifestStreaming: PluginManifest = {\n name: \"scichart-streaming\",\n version: \"1.0.0\",\n description: \"Real-time data streaming support for scichart-engine\",\n provides: [\"data-source\"],\n tags: [\"websocket\", \"real-time\", \"streaming\", \"backpressure\"],\n};\n\n/**\n * SciChartEngine Streaming Plugin\n * \n * Enables seamless integration with real-time data sources.\n */\nexport function PluginStreaming(_config: PluginStreamingConfig = {}): ChartPlugin<PluginStreamingConfig> {\n return {\n manifest: manifestStreaming,\n\n onInit(_ctx: PluginContext) {\n },\n\n onDestroy(_ctx: PluginContext) {\n }\n };\n}\n\nexport default PluginStreaming;\n"],"names":["defaultParser","data","item","point","createMessageParser","transform","connectStreamToChart","stream","chart","seriesIds","unsubscribers","seriesId","unsubscribe","points","x","p","y","createWebSocketStream","config","url","maxReconnectAttempts","reconnectDelay","bufferSize","throttleMs","parseMessage","onConnect","onDisconnect","onError","onReconnect","ws","state","reconnectAttempts","reconnectTimeout","connectionStartTime","buffers","subscribers","stats","lastFlushTime","flushScheduled","connect","event","handleMessage","scheduleReconnect","error","disconnect","parsed","pointArray","sum","b","scheduleFlush","timeSinceLastFlush","flush","buffer","callbacks","callback","message","CircularBuffer","capacity","__publicField","overwritten","n","result","toRemove","i","current","BackpressureManager","_a","_b","added","dropped","count","toConsume","fillLevel","totalSize","totalDropped","totalSampled","maxTotal","recommendations","score","dropRate","status","now","history","a","createBackpressureManager","maxBuffer","strategy","createRealtimeBackpressure","createLosslessBackpressure","createMockStream","interval","generatePoint","defaultGenerator","intervalId","connected","startTime","start","stop","mockX","manifestStreaming","PluginStreaming","_config","_ctx"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  var f = Object.defineProperty;
2
- var d = (i, e, t) => e in i ? f(i, e, { enumerable: !0, configurable: !0, writable: !0, value: t }) : i[e] = t;
3
- var c = (i, e, t) => d(i, typeof e != "symbol" ? e + "" : e, t);
4
- const b = [
2
+ var d = (l, e, t) => e in l ? f(l, e, { enumerable: !0, configurable: !0, writable: !0, value: t }) : l[e] = t;
3
+ var c = (l, e, t) => d(l, typeof e != "symbol" ? e + "" : e, t);
4
+ const h = [
5
5
  {
6
6
  label: "Background & Canvas",
7
7
  description: "Chart background and canvas colors",
@@ -267,7 +267,7 @@ const b = [
267
267
  }
268
268
  }
269
269
  ];
270
- class h {
270
+ class b {
271
271
  constructor(e, t) {
272
272
  c(this, "container");
273
273
  c(this, "options");
@@ -357,20 +357,20 @@ class h {
357
357
  }
358
358
  setNestedValue(e, t, o) {
359
359
  const r = t.split(".");
360
- let l = e;
360
+ let i = e;
361
361
  for (let a = 0; a < r.length - 1; a++) {
362
362
  const s = r[a];
363
- s in l || (l[s] = {}), l = l[s];
363
+ s in i || (i[s] = {}), i = i[s];
364
364
  }
365
- l[r[r.length - 1]] = o;
365
+ i[r[r.length - 1]] = o;
366
366
  }
367
367
  getNestedValue(e, t) {
368
368
  const o = t.split(".");
369
369
  let r = e;
370
- for (const l of o) {
370
+ for (const i of o) {
371
371
  if (r == null || typeof r != "object")
372
372
  return;
373
- r = r[l];
373
+ r = r[i];
374
374
  }
375
375
  return r;
376
376
  }
@@ -389,14 +389,14 @@ class h {
389
389
  </div>
390
390
  <span class="preset-name">${o.name}</span>
391
391
  </button>
392
- `).join(""), t = b.map((o) => {
393
- const r = o.colors.map((l) => {
394
- const a = this.getNestedValue(this.currentTheme, l.key) || "#000000";
392
+ `).join(""), t = h.map((o) => {
393
+ const r = o.colors.map((i) => {
394
+ const a = this.getNestedValue(this.currentTheme, i.key) || "#000000";
395
395
  return `
396
396
  <div class="color-row">
397
- <label title="${l.description || ""}">${l.label}</label>
398
- <input type="color" data-key="${l.key}" value="${this.normalizeColor(a)}" />
399
- <input type="text" data-key="${l.key}" value="${a}" class="color-text" />
397
+ <label title="${i.description || ""}">${i.label}</label>
398
+ <input type="color" data-key="${i.key}" value="${this.normalizeColor(a)}" />
399
+ <input type="text" data-key="${i.key}" value="${a}" class="color-text" />
400
400
  </div>
401
401
  `;
402
402
  }).join("");
@@ -429,8 +429,8 @@ class h {
429
429
  if (e.startsWith("rgba") || e.startsWith("rgb")) {
430
430
  const t = e.match(/rgba?\((\d+),\s*(\d+),\s*(\d+)/);
431
431
  if (t) {
432
- const o = parseInt(t[1]).toString(16).padStart(2, "0"), r = parseInt(t[2]).toString(16).padStart(2, "0"), l = parseInt(t[3]).toString(16).padStart(2, "0");
433
- return `#${o}${r}${l}`;
432
+ const o = parseInt(t[1]).toString(16).padStart(2, "0"), r = parseInt(t[2]).toString(16).padStart(2, "0"), i = parseInt(t[3]).toString(16).padStart(2, "0");
433
+ return `#${o}${r}${i}`;
434
434
  }
435
435
  }
436
436
  return e;
@@ -444,11 +444,11 @@ class h {
444
444
  });
445
445
  }), this.element.querySelectorAll('input[type="color"], input.color-text').forEach((o) => {
446
446
  o.addEventListener("input", (r) => {
447
- const l = r.target, a = l.getAttribute("data-key");
447
+ const i = r.target, a = i.getAttribute("data-key");
448
448
  if (a) {
449
- this.updateProperty(a, l.value);
450
- const s = l.type === "color" ? l.nextElementSibling : l.previousElementSibling;
451
- s && (s.value = l.type === "color" ? l.value : this.normalizeColor(l.value));
449
+ this.updateProperty(a, i.value);
450
+ const s = i.type === "color" ? i.nextElementSibling : i.previousElementSibling;
451
+ s && (s.value = i.type === "color" ? i.value : this.normalizeColor(i.value));
452
452
  }
453
453
  });
454
454
  }), (e = this.element.querySelector(".export-btn")) == null || e.addEventListener("click", () => {
@@ -462,21 +462,38 @@ class h {
462
462
  }));
463
463
  }
464
464
  }
465
- function g(i, e) {
466
- return new h(i, e);
465
+ function p(l, e) {
466
+ return new b(l, e);
467
467
  }
468
- function p(i) {
469
- const e = n.find((t) => t.name.toLowerCase() === i.toLowerCase());
468
+ function m(l) {
469
+ const e = n.find((t) => t.name.toLowerCase() === l.toLowerCase());
470
470
  return e ? { ...e.theme } : void 0;
471
471
  }
472
- function m() {
473
- return n.map((i) => i.name);
472
+ function C() {
473
+ return n.map((l) => l.name);
474
+ }
475
+ const u = {
476
+ name: "scichart-theme-editor",
477
+ version: "1.0.0",
478
+ description: "Visual theme editor for scichart-engine",
479
+ provides: ["ui", "theme"],
480
+ tags: ["theme", "editor", "styling", "ui"]
481
+ };
482
+ function k(l = {}) {
483
+ return {
484
+ manifest: u,
485
+ onInit(e) {
486
+ },
487
+ onDestroy(e) {
488
+ }
489
+ };
474
490
  }
475
491
  export {
476
- h as T,
477
- m as a,
492
+ k as P,
493
+ b as T,
494
+ C as a,
478
495
  n as b,
479
- g as c,
480
- p as g
496
+ p as c,
497
+ m as g
481
498
  };
482
- //# sourceMappingURL=index-IRhlzXlI.js.map
499
+ //# sourceMappingURL=index-D_gdFhpG.js.map