blazeplot 0.1.1 → 0.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -5,18 +5,9 @@
5
5
  [![license](https://img.shields.io/badge/license-MIT-green.svg)](LICENSE)
6
6
  [![build](https://img.shields.io/github/actions/workflow/status/Federicocervelli/blazeplot/release.yml?branch=master)](https://github.com/Federicocervelli/blazeplot/actions)
7
7
 
8
- Real-time LOD time series rendering engine for the browser.
8
+ Fast WebGL2 plotting engine for the browser 🔥
9
9
 
10
- BlazePlot is GPU-native plotting engineered for high-frequency streaming data where standard charting libraries (Chart.js, ECharts, uPlot) fall over. Instead of drawing every sample, it keeps a resident ring buffer of millions of points, builds a min/max LOD pyramid, and renders only what each pixel needs — so frame cost is `O(pixels)`, not `O(samples)`.
11
-
12
- Built on WebGL2 + [regl](https://github.com/regl-project/regl). No Canvas2D, no SVG, no DOM layout.
13
-
14
- ## Target
15
-
16
- - **10M+** resident points per series
17
- - **60 Hz** smooth append + render
18
- - **Zero allocations** in the frame loop
19
- - **Multi-series** with independent buffers and LOD
10
+ GPU-native, zero DOM. Built on WebGL2 + [regl](https://github.com/regl-project/regl). No Canvas2D, no SVG, no layout thrashing.
20
11
 
21
12
  ## Installation
22
13
 
@@ -44,19 +35,18 @@ const series = chart.addSeries(
44
35
  chart.setViewport({ xMin: 0, xMax: 1000, yMin: -2, yMax: 2 });
45
36
  chart.start();
46
37
 
47
- // Append data periodically
38
+ const xs = new Float64Array(256);
39
+ const ys = new Float32Array(256);
40
+ let t = 0;
41
+
48
42
  function push() {
49
- const n = 256;
50
- const xs = new Float64Array(n);
51
- const ys = new Float32Array(n);
52
- for (let i = 0; i < n; i++) {
43
+ for (let i = 0; i < 256; i++) {
53
44
  xs[i] = t++;
54
45
  ys[i] = Math.sin(t * 0.01) * 0.5 + Math.random() * 0.01;
55
46
  }
56
47
  series.append(xs, ys);
57
48
  requestAnimationFrame(push);
58
49
  }
59
- let t = 0;
60
50
  push();
61
51
  ```
62
52
 
@@ -64,12 +54,13 @@ push();
64
54
 
65
55
  | | |
66
56
  |---|---|
67
- | **LOD downsampling** | Min/max pyramid automatically selects the right detail level for the visible range — sparse viewports show raw points, dense viewports show vertical min/max segments. |
68
- | **Streaming append** | Fixed-capacity ring buffer wraps silently. No re-allocation. No memory growth. |
69
- | **Pan & zoom** | Pointer/touch pan and wheel zoom via `Camera2D`. Customizable viewport policies (e.g. live-follow X while Y is free). |
57
+ | **WebGL2 rendering** | GPU-accelerated from the ground up. No Canvas2D fallback, no DOM text nodes. |
58
+ | **Flexible data model** | Streaming ring buffer or static arrays. Bring your own data shape. |
59
+ | **LOD downsampling** | Min/max pyramid for efficient line rendering at any zoom level sparse views show raw points, dense views show vertical segments. |
60
+ | **Pan & zoom** | Pointer/touch pan and wheel zoom via `Camera2D`. Customizable viewport policies. |
70
61
  | **Grid lines** | Data-anchored grid rendered as WebGL line lists. |
71
62
  | **Multi-series** | Independent buffers, styles, and visibility per series. |
72
- | **No DOM** | No axis DOM elements, no SVG overlay. The canvas owns everything. |
63
+ | **Benchmark overlay** | Built-in fps, frame time, vertex count, draw calls. |
73
64
  | **ResizeObserver** | Automatic DPR-aware canvas sizing. |
74
65
 
75
66
  ## API
@@ -111,8 +102,8 @@ push();
111
102
 
112
103
  | Signature | Description |
113
104
  |---|---|
114
- | `series.append(xs, ys)` | Append typed arrays of X (Float64) and Y (Float32) values. |
115
- | `series.clear()` | Clear all data and reset LOD state. |
105
+ | `series.append(xs, ys)` | Append typed arrays of X and Y values (streaming). |
106
+ | `series.clear()` | Clear all data and reset. |
116
107
  | `series.setVisible(v)` | Toggle visibility. |
117
108
  | `series.visible` | Current visibility state. |
118
109
  | `series.length` | Number of samples buffered. |
@@ -123,7 +114,7 @@ push();
123
114
  |---|---|
124
115
  | `mode` | `"line"` / `"envelope"` / `"scatter"` (envelope and scatter roadmap-only). |
125
116
  | `capacity` | Ring buffer capacity (samples). |
126
- | `downsample` | `"minmax"` (the only LOD strategy). |
117
+ | `downsample` | `"minmax"` (LOD for line rendering). |
127
118
 
128
119
  ### `SeriesStyle`
129
120
 
@@ -142,36 +133,15 @@ interface ViewportPolicy {
142
133
  }
143
134
  ```
144
135
 
145
- Built-in data types: `Viewport`, `PanIntent`, `ZoomIntent`, `ZoomAxis`.
146
-
147
136
  ### Lower-level primitives
148
137
 
149
- `Camera2D`, `RingBuffer`, `MinMaxPyramid`, `AxisController` are exported for advanced use cases (custom pipelines, worker threads, offscreen rendering).
150
-
151
- ## How it works
152
-
153
- ```
154
- Data stream ──► RingBuffer (resident, wraps at capacity)
155
-
156
-
157
- MinMaxPyramid (full rebuild today, incremental roadmap)
158
-
159
-
160
- SeriesStore.query() ──► LODView (buckets for visible range)
161
-
162
-
163
- Renderer (regl / WebGL2)
164
- ```
165
-
166
- The render loop decides per-frame:
167
- - **Few visible samples** → raw line strip from ring buffer
168
- - **Many visible samples** → min/max vertical segments from the pyramid
138
+ `Camera2D`, `RingBuffer`, `MinMaxPyramid`, `AxisController` are exported for advanced use cases.
169
139
 
170
140
  ## Architecture
171
141
 
172
142
  ```
173
143
  src/
174
- core/ # Data engineno UI, no GPU
144
+ core/ # Data modelseries, datasets, LOD
175
145
  render/ # GPU abstraction + regl backend
176
146
  interaction/ # Camera, input, axis ticks
177
147
  ui/ # Orchestrator (Chart)
@@ -184,7 +154,7 @@ bun install
184
154
  bun run dev # Vite dev server → preview/
185
155
  bun run build # Package build (JS + declarations)
186
156
  bun run build:js # JS-only build
187
- bun test # Core data-structure tests
157
+ bun test # Tests
188
158
  bun run typecheck # TypeScript strict check
189
159
  ```
190
160
 
@@ -199,8 +169,8 @@ Output:
199
169
  ```
200
170
  dist/index.js ES module
201
171
  dist/index.d.ts TypeScript declarations
202
- dist/index.js.map Source map
203
- dist/*.d.ts.map Declaration maps
204
172
  ```
205
173
 
174
+ ## Why WebGL2?
206
175
 
176
+ Canvas2D and SVG are CPU-bound — every point becomes a draw call or a DOM node. BlazePlot keeps data on the GPU, streams only visible vertices, and avoids DOM entirely. For dense line plots (millions of points), interactive scatter, or real-time streaming, the difference is orders of magnitude.
@@ -1,8 +1,8 @@
1
- import { RingBuffer } from './RingBuffer.js';
1
+ import { Dataset } from './types.js';
2
2
  export declare class DataCursor {
3
3
  private _index;
4
4
  private _buffer;
5
- bind(buffer: RingBuffer): void;
5
+ bind(buffer: Dataset): void;
6
6
  get index(): number;
7
7
  seekTimestamp(x: number): number;
8
8
  }
@@ -1 +1 @@
1
- {"version":3,"file":"DataCursor.d.ts","sourceRoot":"","sources":["../../src/core/DataCursor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAElD,qBAAa,UAAU;IACrB,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,OAAO,CAA2B;IAE1C,IAAI,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI;IAK9B,IAAI,KAAK,IAAI,MAAM,CAElB;IAED,aAAa,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM;CAYjC"}
1
+ {"version":3,"file":"DataCursor.d.ts","sourceRoot":"","sources":["../../src/core/DataCursor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAE1C,qBAAa,UAAU;IACrB,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,OAAO,CAAwB;IAEvC,IAAI,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI;IAK3B,IAAI,KAAK,IAAI,MAAM,CAElB;IAED,aAAa,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM;CAYjC"}
@@ -1,12 +1,16 @@
1
- import { LODView, Viewport } from './types.js';
2
- import { RingBuffer } from './RingBuffer.js';
1
+ import { Dataset, LODView, Viewport } from './types.js';
3
2
  export declare class MinMaxPyramid {
4
3
  readonly bucketSize: number;
5
4
  private levels;
6
5
  private levelLengths;
7
6
  private levelSampleWidths;
7
+ private _builtLen;
8
+ private _lastRangeStart;
8
9
  constructor(bucketSize?: number);
9
- build(source: RingBuffer): void;
10
+ build(source: Dataset): void;
11
+ incrementalBuild(source: Dataset): void;
12
+ private appendTail;
13
+ private ensureLevelData;
10
14
  query(_viewport: Viewport, pixelWidth: number, xRange: {
11
15
  start: number;
12
16
  length: number;
@@ -1 +1 @@
1
- {"version":3,"file":"MinMaxPyramid.d.ts","sourceRoot":"","sources":["../../src/core/MinMaxPyramid.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAI7C,qBAAa,aAAa;IAKZ,QAAQ,CAAC,UAAU,EAAE,MAAM;IAJvC,OAAO,CAAC,MAAM,CAAsB;IACpC,OAAO,CAAC,YAAY,CAAc;IAClC,OAAO,CAAC,iBAAiB,CAAc;gBAElB,UAAU,GAAE,MAAU;IAS3C,KAAK,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI;IAgD/B,KAAK,CAAC,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO;CAsCnG"}
1
+ {"version":3,"file":"MinMaxPyramid.d.ts","sourceRoot":"","sources":["../../src/core/MinMaxPyramid.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAI7D,qBAAa,aAAa;IAOZ,QAAQ,CAAC,UAAU,EAAE,MAAM;IANvC,OAAO,CAAC,MAAM,CAAsB;IACpC,OAAO,CAAC,YAAY,CAAc;IAClC,OAAO,CAAC,iBAAiB,CAAc;IACvC,OAAO,CAAC,SAAS,CAAa;IAC9B,OAAO,CAAC,eAAe,CAAe;gBAEjB,UAAU,GAAE,MAAU;IAS3C,KAAK,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI;IAuD5B,gBAAgB,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI;IAwBvC,OAAO,CAAC,UAAU;IAkDlB,OAAO,CAAC,eAAe;IAYvB,KAAK,CAAC,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO;CAsCnG"}
@@ -9,6 +9,7 @@ export declare class RingBuffer {
9
9
  get length(): number;
10
10
  get range(): TimeRange | null;
11
11
  push(x: number, y: number): void;
12
+ append(x: ArrayLike<number>, y: ArrayLike<number>): void;
12
13
  get(index: number): {
13
14
  x: number;
14
15
  y: number;
@@ -1 +1 @@
1
- {"version":3,"file":"RingBuffer.d.ts","sourceRoot":"","sources":["../../src/core/RingBuffer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,qBAAa,UAAU;IACrB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,OAAO,CAAC,OAAO,CAAa;IAC5B,OAAO,CAAC,KAAK,CAAa;IAE1B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAe;IACrC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAe;gBAEzB,QAAQ,EAAE,MAAM;IAU5B,IAAI,MAAM,IAAI,MAAM,CAEnB;IAED,IAAI,KAAK,IAAI,SAAS,GAAG,IAAI,CAG5B;IAED,IAAI,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI;IAOhC,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAKnD,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAK3B,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAK3B,WAAW,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM;IAW9B,WAAW,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM;IAW9B,KAAK,IAAI,IAAI;IAKb,OAAO,CAAC,iBAAiB;IAIzB,OAAO,CAAC,gBAAgB;CAKzB"}
1
+ {"version":3,"file":"RingBuffer.d.ts","sourceRoot":"","sources":["../../src/core/RingBuffer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,qBAAa,UAAU;IACrB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,OAAO,CAAC,OAAO,CAAa;IAC5B,OAAO,CAAC,KAAK,CAAa;IAE1B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAe;IACrC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAe;gBAEzB,QAAQ,EAAE,MAAM;IAU5B,IAAI,MAAM,IAAI,MAAM,CAEnB;IAED,IAAI,KAAK,IAAI,SAAS,GAAG,IAAI,CAG5B;IAED,IAAI,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI;IAOhC,MAAM,CAAC,CAAC,EAAE,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,SAAS,CAAC,MAAM,CAAC,GAAG,IAAI;IAOxD,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAKnD,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAK3B,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAK3B,WAAW,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM;IAW9B,WAAW,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM;IAW9B,KAAK,IAAI,IAAI;IAKb,OAAO,CAAC,iBAAiB;IAIzB,OAAO,CAAC,gBAAgB;CAKzB"}
@@ -1,12 +1,12 @@
1
- import { SeriesConfig, SeriesStyle, LODView, Viewport } from './types.js';
1
+ import { Dataset, LODView, Viewport, SeriesConfig, SeriesStyle } from './types.js';
2
2
  export declare class SeriesStore {
3
3
  readonly config: SeriesConfig;
4
4
  readonly style: SeriesStyle;
5
- private readonly buffer;
5
+ private readonly dataset;
6
6
  private readonly pyramid;
7
7
  private _dirty;
8
8
  private _visible;
9
- constructor(config: SeriesConfig, style: SeriesStyle);
9
+ constructor(dataset: Dataset, config: SeriesConfig, style: SeriesStyle);
10
10
  get dirty(): boolean;
11
11
  get length(): number;
12
12
  get visible(): boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"SeriesStore.d.ts","sourceRoot":"","sources":["../../src/core/SeriesStore.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAI/E,qBAAa,WAAW;IACtB,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;IAC9B,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC;IAC5B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAa;IACpC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAgB;IAExC,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,QAAQ,CAAiB;gBAErB,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,WAAW;IAOpD,IAAI,KAAK,IAAI,OAAO,CAEnB;IAED,IAAI,MAAM,IAAI,MAAM,CAEnB;IAED,IAAI,OAAO,IAAI,OAAO,CAErB;IAED,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAIlC,MAAM,CAAC,CAAC,EAAE,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,SAAS,CAAC,MAAM,CAAC,GAAG,IAAI;IAQxD,KAAK,IAAI,IAAI;IAMb,cAAc,IAAI,IAAI;IAMtB,KAAK,CAAC,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO;IAetD,kBAAkB,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM;IAM9C,cAAc,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM;IAmBnF,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM;CAqCzF"}
1
+ {"version":3,"file":"SeriesStore.d.ts","sourceRoot":"","sources":["../../src/core/SeriesStore.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAqB,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAG3G,qBAAa,WAAW;IACtB,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC;IAC9B,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC;IAC5B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAU;IAClC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAgB;IAExC,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,QAAQ,CAAiB;gBAErB,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,WAAW;IAWtE,IAAI,KAAK,IAAI,OAAO,CAEnB;IAED,IAAI,MAAM,IAAI,MAAM,CAEnB;IAED,IAAI,OAAO,IAAI,OAAO,CAErB;IAED,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAIlC,MAAM,CAAC,CAAC,EAAE,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,SAAS,CAAC,MAAM,CAAC,GAAG,IAAI;IAUxD,KAAK,IAAI,IAAI;IAUb,cAAc,IAAI,IAAI;IAMtB,KAAK,CAAC,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO;IAetD,kBAAkB,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM;IAM9C,cAAc,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM;IAmBnF,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM;CAqCzF"}
@@ -0,0 +1,14 @@
1
+ import { Dataset, TimeRange } from './types.js';
2
+ export declare class StaticDataset implements Dataset {
3
+ private readonly xData;
4
+ private readonly yData;
5
+ constructor(xData: ArrayLike<number>, yData: ArrayLike<number>);
6
+ get length(): number;
7
+ get range(): TimeRange | null;
8
+ getX(index: number): number;
9
+ getY(index: number): number;
10
+ lowerBoundX(x: number): number;
11
+ upperBoundX(x: number): number;
12
+ private assertValidIndex;
13
+ }
14
+ //# sourceMappingURL=StaticDataset.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StaticDataset.d.ts","sourceRoot":"","sources":["../../src/core/StaticDataset.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAErD,qBAAa,aAAc,YAAW,OAAO;IAEzC,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,KAAK;gBADL,KAAK,EAAE,SAAS,CAAC,MAAM,CAAC,EACxB,KAAK,EAAE,SAAS,CAAC,MAAM,CAAC;IAG3C,IAAI,MAAM,IAAI,MAAM,CAEnB;IAED,IAAI,KAAK,IAAI,SAAS,GAAG,IAAI,CAG5B;IAED,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAK3B,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAK3B,WAAW,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM;IAW9B,WAAW,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM;IAW9B,OAAO,CAAC,gBAAgB;CAKzB"}
@@ -1,5 +1,6 @@
1
- export type { Viewport, LODBucket, LODView, TimeRange, SeriesStyle, SeriesMode, SeriesConfig } from './types.js';
1
+ export type { Viewport, LODBucket, LODView, TimeRange, SeriesStyle, SeriesMode, SeriesConfig, Dataset, AppendableDataset } from './types.js';
2
2
  export { RingBuffer } from './RingBuffer.js';
3
+ export { StaticDataset } from './StaticDataset.js';
3
4
  export { MinMaxPyramid } from './MinMaxPyramid.js';
4
5
  export { SeriesStore } from './SeriesStore.js';
5
6
  export { DataCursor } from './DataCursor.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAEjH,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,UAAU,EAAE,YAAY,EAAE,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAE7I,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC"}
@@ -25,9 +25,23 @@ export interface SeriesStyle {
25
25
  readonly lineWidth: number;
26
26
  }
27
27
  export type SeriesMode = "line" | "envelope" | "scatter";
28
+ export interface Dataset {
29
+ readonly length: number;
30
+ readonly range: TimeRange | null;
31
+ getX(index: number): number;
32
+ getY(index: number): number;
33
+ lowerBoundX(x: number): number;
34
+ upperBoundX(x: number): number;
35
+ }
36
+ export interface AppendableDataset extends Dataset {
37
+ push(x: number, y: number): void;
38
+ append(x: ArrayLike<number>, y: ArrayLike<number>): void;
39
+ clear(): void;
40
+ }
28
41
  export interface SeriesConfig {
29
42
  readonly mode: SeriesMode;
30
43
  readonly capacity: number;
31
44
  readonly downsample: "minmax";
45
+ readonly dataset?: Dataset;
32
46
  }
33
47
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,OAAO;IACtB,QAAQ,CAAC,OAAO,EAAE,YAAY,CAAC;IAC/B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;CAClC;AAED,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1D,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,UAAU,GAAG,SAAS,CAAC;AAEzD,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC;CAC/B"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,OAAO;IACtB,QAAQ,CAAC,OAAO,EAAE,YAAY,CAAC;IAC/B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;CAClC;AAED,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1D,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,UAAU,GAAG,SAAS,CAAC;AAEzD,MAAM,WAAW,OAAO;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI,CAAC;IACjC,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;IAC5B,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;IAC5B,WAAW,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC/B,WAAW,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CAChC;AAED,MAAM,WAAW,iBAAkB,SAAQ,OAAO;IAChD,IAAI,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,MAAM,CAAC,CAAC,EAAE,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,SAAS,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;IACzD,KAAK,IAAI,IAAI,CAAC;CACf;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC;IAC9B,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;CAC5B"}
package/dist/index.d.ts CHANGED
@@ -2,9 +2,10 @@ export { Chart } from './ui/Chart.js';
2
2
  export type { ChartFrameStats, ChartOptions } from './ui/Chart.js';
3
3
  export { SeriesStore } from './core/SeriesStore.js';
4
4
  export { RingBuffer } from './core/RingBuffer.js';
5
+ export { StaticDataset } from './core/StaticDataset.js';
5
6
  export { MinMaxPyramid } from './core/MinMaxPyramid.js';
6
7
  export { Camera2D } from './interaction/Camera2D.js';
7
8
  export { AxisController } from './interaction/AxisController.js';
8
- export type { Viewport, LODBucket, LODView, TimeRange, SeriesStyle, SeriesMode, SeriesConfig } from './core/types.js';
9
+ export type { Viewport, LODBucket, LODView, TimeRange, SeriesStyle, SeriesMode, SeriesConfig, Dataset, AppendableDataset } from './core/types.js';
9
10
  export type { PanIntent, ZoomAxis, ZoomIntent, ViewportPolicy } from './interaction/types.js';
10
11
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,YAAY,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AACnE,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AACjE,YAAY,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACtH,YAAY,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,YAAY,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AACnE,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AACjE,YAAY,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,UAAU,EAAE,YAAY,EAAE,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAClJ,YAAY,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC"}