scichart-engine 1.8.1 → 1.10.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 (88) hide show
  1. package/dist/core/chart/ChartCore.d.ts +17 -3
  2. package/dist/core/chart/types.d.ts +19 -1
  3. package/dist/core/series/Series.d.ts +4 -0
  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-DSspeT94.js +2431 -0
  7. package/dist/index-DSspeT94.js.map +1 -0
  8. package/dist/{index-IRhlzXlI.js → index-D_gdFhpG.js} +49 -32
  9. package/dist/index-D_gdFhpG.js.map +1 -0
  10. package/dist/{index-CWxIHdwX.js → index-vnImOjDa.js} +36 -19
  11. package/dist/index-vnImOjDa.js.map +1 -0
  12. package/dist/{index.core--nZ46gLA.js → index.core-BLkGsIq1.js} +399 -301
  13. package/dist/index.core-BLkGsIq1.js.map +1 -0
  14. package/dist/index.d.ts +2 -2
  15. package/dist/plugins/broken-axis/BrokenAxisScale.d.ts +24 -0
  16. package/dist/plugins/broken-axis/exports.d.ts +6 -0
  17. package/dist/plugins/broken-axis/index.d.ts +6 -0
  18. package/dist/plugins/broken-axis/types.d.ts +50 -0
  19. package/dist/plugins/caching/exports.d.ts +6 -0
  20. package/dist/plugins/caching/index.d.ts +6 -0
  21. package/dist/plugins/caching/types.d.ts +120 -0
  22. package/dist/plugins/clipboard.js +252 -12
  23. package/dist/plugins/clipboard.js.map +1 -1
  24. package/dist/plugins/data-export.js +180 -180
  25. package/dist/plugins/data-export.js.map +1 -1
  26. package/dist/plugins/debug.js +244 -61
  27. package/dist/plugins/debug.js.map +1 -1
  28. package/dist/plugins/drag-edit/exports.d.ts +6 -0
  29. package/dist/plugins/drag-edit/index.d.ts +6 -0
  30. package/dist/plugins/drag-edit/types.d.ts +118 -0
  31. package/dist/plugins/forecasting/algorithms.d.ts +6 -0
  32. package/dist/plugins/forecasting/exports.d.ts +3 -0
  33. package/dist/plugins/forecasting/index.d.ts +11 -0
  34. package/dist/plugins/forecasting/types.d.ts +88 -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 +9 -0
  38. package/dist/plugins/keyboard.js +5 -21
  39. package/dist/plugins/keyboard.js.map +1 -1
  40. package/dist/plugins/lazy-load/exports.d.ts +6 -0
  41. package/dist/plugins/lazy-load/index.d.ts +6 -0
  42. package/dist/plugins/lazy-load/types.d.ts +121 -0
  43. package/dist/plugins/offscreen/exports.d.ts +6 -0
  44. package/dist/plugins/offscreen/index.d.ts +6 -0
  45. package/dist/plugins/offscreen/pool.d.ts +32 -0
  46. package/dist/plugins/offscreen/types.d.ts +35 -0
  47. package/dist/plugins/roi/exports.d.ts +6 -0
  48. package/dist/plugins/roi/index.d.ts +49 -0
  49. package/dist/plugins/roi/types.d.ts +60 -0
  50. package/dist/plugins/streaming.js +8 -24
  51. package/dist/plugins/streaming.js.map +1 -1
  52. package/dist/plugins/sync.js +247 -13
  53. package/dist/plugins/sync.js.map +1 -1
  54. package/dist/plugins/theme-editor.js +3 -19
  55. package/dist/plugins/theme-editor.js.map +1 -1
  56. package/dist/plugins/tools/tooltip/templates/AnnotationTemplate.d.ts +1 -1
  57. package/dist/plugins/tools/tooltip/templates/CrosshairTemplate.d.ts +10 -1
  58. package/dist/plugins/tools/tooltip/templates/DefaultTemplate.d.ts +1 -1
  59. package/dist/plugins/tools/tooltip/templates/HeatmapTemplate.d.ts +1 -1
  60. package/dist/plugins/tools/tooltip/templates/MinimalTemplate.d.ts +1 -1
  61. package/dist/plugins/tools/tooltip/templates/RangeTemplate.d.ts +1 -1
  62. package/dist/plugins/tools/tooltip/templates/ScientificTemplate.d.ts +1 -1
  63. package/dist/plugins/tools/tooltip/types.d.ts +1 -1
  64. package/dist/plugins/tools.js +1 -1
  65. package/dist/plugins/video-recorder/exports.d.ts +6 -0
  66. package/dist/plugins/video-recorder/index.d.ts +6 -0
  67. package/dist/plugins/video-recorder/types.d.ts +55 -0
  68. package/dist/plugins/virtualization/exports.d.ts +6 -0
  69. package/dist/plugins/virtualization/index.d.ts +6 -0
  70. package/dist/plugins/virtualization/types.d.ts +48 -0
  71. package/dist/scichart-engine.full.js +4342 -1752
  72. package/dist/scichart-engine.full.js.map +1 -1
  73. package/dist/scichart-engine.js +1 -1
  74. package/package.json +65 -1
  75. package/dist/gpuCompute-Be2JAcYX.js +0 -2412
  76. package/dist/gpuCompute-Be2JAcYX.js.map +0 -1
  77. package/dist/index-BeNSvLQt.js +0 -248
  78. package/dist/index-BeNSvLQt.js.map +0 -1
  79. package/dist/index-Btz_voey.js +0 -2403
  80. package/dist/index-Btz_voey.js.map +0 -1
  81. package/dist/index-CWxIHdwX.js.map +0 -1
  82. package/dist/index-DB_1SXBk.js +0 -242
  83. package/dist/index-DB_1SXBk.js.map +0 -1
  84. package/dist/index-IRhlzXlI.js.map +0 -1
  85. package/dist/index-q2iX8Vyd.js +0 -194
  86. package/dist/index-q2iX8Vyd.js.map +0 -1
  87. package/dist/index.core--nZ46gLA.js.map +0 -1
  88. 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;
@@ -72,6 +76,15 @@ export declare class ChartImpl implements Chart {
72
76
  get radar(): any;
73
77
  get ml(): any;
74
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;
87
+ get forecasting(): any;
75
88
  constructor(options: ChartOptions);
76
89
  /**
77
90
  * Start the chart initialization (called by queue system)
@@ -162,6 +175,7 @@ export declare class ChartImpl implements Chart {
162
175
  * Get a plugin API by name
163
176
  */
164
177
  getPlugin<T = any>(name: string): T | null;
178
+ getPluginNames(): string[];
165
179
  private getPluginAPI;
166
180
  exportCSV(options?: ExportOptions): string;
167
181
  exportJSON(options?: ExportOptions): string;
@@ -286,7 +300,7 @@ export declare class ChartImpl implements Chart {
286
300
  * Load state from URL hash
287
301
  */
288
302
  fromUrlHash(hash: string, compressed?: boolean): void;
289
- use(plugin: import('../../plugins').ChartPlugin): void;
303
+ use(plugin: any): Promise<void>;
290
304
  resize(): void;
291
305
  requestRender(): void;
292
306
  requestOverlayRender(): void;
@@ -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;
@@ -47,6 +49,15 @@ export interface Chart {
47
49
  readonly radar: any;
48
50
  readonly ml: any;
49
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;
60
+ readonly forecasting: any;
50
61
  addAnnotation(annotation: Annotation): string;
51
62
  removeAnnotation(id: string): boolean;
52
63
  updateAnnotation(id: string, updates: Partial<Annotation>): void;
@@ -129,6 +140,10 @@ export interface Chart {
129
140
  * Get a plugin API by name
130
141
  */
131
142
  getPlugin<T = any>(name: string): T | null;
143
+ /**
144
+ * Get names of all registered plugins
145
+ */
146
+ getPluginNames(): string[];
132
147
  /** Get current responsive state */
133
148
  getResponsiveState(): import('../responsive').ResponsiveState;
134
149
  /** Configure responsive behavior */
@@ -143,8 +158,11 @@ export interface Chart {
143
158
  toUrlHash(compress?: boolean): string;
144
159
  /** Load state from URL hash */
145
160
  fromUrlHash(hash: string, compressed?: boolean): void;
161
+ /** Set custom scales (e.g. for Broken Axis support) */
162
+ setXScale(scale: any): void;
163
+ setYScale(yAxisId: string, scale: any): void;
146
164
  /** Use a plugin */
147
- use(plugin: ChartPlugin): void;
165
+ use(plugin: ChartPlugin | any): Promise<void>;
148
166
  /** Destroy the chart and cleanup resources */
149
167
  destroy(): void;
150
168
  }
@@ -61,6 +61,10 @@ export declare class Series {
61
61
  updateData(update: SeriesUpdateData): void;
62
62
  setStyle(style: Partial<SeriesStyle>): void;
63
63
  setType(type: SeriesType): void;
64
+ /**
65
+ * Invalidate buffers - call this after modifying data directly
66
+ */
67
+ invalidateBuffers(): void;
64
68
  setVisible(visible: boolean): void;
65
69
  get needsBufferUpdate(): boolean;
66
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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"}