WebGPU-basierte Chart-Library fΓΌr Echtzeit-Datenvisualisierung ΓΌber gRPC Streams.
- WebGPU Rendering - Millionen von Datenpunkten @ 60fps
- gRPC Server-Streaming - Effiziente Echtzeit-Daten-Γbertragung
- SharedArrayBuffer - Lock-free Threading fΓΌr maximale Performance
- Auto-Scaling - Y-Achse passt sich automatisch an
- Zoom & Pan - Interaktive Datenexploration
- TypeScript - Voll typisierte API
- Embedded/IoT Dashboards (z.B. PrΓΌfstΓ€nde)
- Scientific Data Visualization
- Monitoring Tools
cd eros-server
npm install
node server.mjsServer lΓ€uft auf http://localhost:50051
npm install
npm run devΓffne http://localhost:5173
import { ErosChart } from './lib/api/ErosChart';
// Chart erstellen
const chart = new ErosChart('#plotCanvas', {
grpcUrl: 'http://localhost:50051',
bufferSize: 100_000, // 10 Sekunden @ 10kHz
sampleRate: 10_000, // 10kHz
lineColor: '#00ff00' // Optional: Linienfarbe (default: grΓΌn)
});
// Initialisieren
await chart.initialize();
// Stream starten
await chart.startStream({ duration: 30 });
// Zoom/Pan
chart.setViewport(5000, 15000); // Zeige Samples 5k-15k
chart.resetViewport(); // ZurΓΌck zur Vollansichteros/
βββ src/
β βββ lib/ # Die Eros Chart Library
β β βββ api/
β β β βββ ErosChart.ts # Haupt-API (Start hier!)
β β βββ core/
β β β βββ SharedRingBuffer.ts # Thread-sicherer Ringpuffer
β β βββ renderer/
β β β βββ WebGPURenderer.ts # WebGPU Renderer
β β β βββ GridOverlay.ts # Canvas2D Grid
β β βββ worker/
β β β βββ data.worker.ts # gRPC Stream Worker
β β βββ index.ts # Public Exports
β β
β βββ main.ts # Demo App
β βββ gen/ # Generated Protobuf Code
β
βββ eros-server/ # Beispiel gRPC Server
β βββ server.mjs # Node.js Server
β βββ gen/ # Generated Protobuf Code
β
βββ src/lib/api/proto/
βββ measurements.proto # gRPC Schema
CPU: Daten in GPU Buffer kopieren
GPU: Vertex Shader lΓ€uft PARALLEL fΓΌr alle Punkte
GPU: Fragment Shader malt die Pixel
Ergebnis: 60fps bei Millionen von Punkten!
Worker Thread: gRPC Stream β schreibt in SharedArrayBuffer
Main Thread: Renderer β liest aus SharedArrayBuffer
Vorteil: Keine Kopie nΓΆtig, ultra-schnell!
Client: "Gib mir Messdaten"
Server: Batch 1 (100 Samples)
Server: Batch 2 (100 Samples)
Server: Batch 3 (100 Samples)
...
Vorteil: 1 Connection, viele Messages (effizient!)
Der Code ist VOLLSTΓNDIG kommentiert mit:
- WAS passiert (fΓΌr schnelles Verstehen)
- WARUM diese LΓΆsung (fΓΌr Lernen)
- WIE es technisch funktioniert (Details)
Perfekt zum Lernen von WebGPU, SharedArrayBuffer, gRPC!
- WebGPU (WGSL Shaders)
- gRPC / Connect-RPC (Protocol Buffers)
- Web Workers (Background Threading)
- SharedArrayBuffer + Atomics (Lock-free Sync)
- TypeScript (Type Safety)
- Vite (Build Tool)
The app can export and import native binary curve files with the .erosb extension.
- Spec:
docs/erosb-format.md - APIs:
ErosChart.exportBinary(),ErosChart.decodeBinary(),ErosChart.loadData()
# TypeScript kompilieren
npm run build
# Dev Server (Hot Reload)
npm run dev
# Protobuf Code generieren
npm run buf:generateIn package.json kannst du das spΓ€ter publishen:
{
"name": "@eros/charts",
"main": "./dist/lib/index.js",
"types": "./dist/lib/index.d.ts",
"exports": {
".": {
"import": "./dist/lib/index.js",
"types": "./dist/lib/index.d.ts"
}
}
}Dann in anderen Projekten:
npm install @eros/chartsimport { ErosChart } from '@eros/charts';Canvas2D ist CPU-basiert und schafft maximal ~10.000 Punkte bei 60fps. WebGPU nutzt die GPU (parallele Berechnung) β Millionen von Punkten mΓΆglich!
Normales ArrayBuffer: Jeder Thread bekommt eine KOPIE (langsam!). SharedArrayBuffer: BEIDE Threads sehen den GLEICHEN Speicher (schnell!).
10.000 Samples/Sekunde = 10.000 HTTP Requests wΓ€re irre. gRPC Stream hΓ€lt die Verbindung offen und schickt Daten fortlaufend.
- Multi-Channel Support (mehrere Kurven gleichzeitig)
- Cursors & Measurements
- Export (PNG/CSV)
- WebGPU Fallback (Canvas2D fΓΌr alte Browser)
- Reconnection Logic
- npm Package verΓΆffentlichen
- Dokumentations-Website (VitePress)
- Unit Tests
Noch offen - fΓΌr private/firmeninternen Gebrauch OK!
Made with β€οΈ fΓΌr PrΓΌfstΓ€nde und High-Performance Visualisierung