feat(lib): add useLiveStream WS hook + useLiveMetrics + LiveMetricChart
feat(hooks): add useLiveStream generic WebSocket hook - supports websocket/sse/polling transports - exponential backoff reconnect with jitter - circular buffer with configurable size - typed filter callback per use case - manual disconnect + reconnect + error state feat(hooks): add useLiveMetrics derived hook - sliding time-window cut - moving average (configurable window) - current / avg / min / max / ratePerSecond - zero allocations per tick (memoized) feat(charts): add LiveMetricChart molecule (Recharts) - line + area variants, grid + tooltip - moving-average overlay (dashed) - ConnectionStatus atom in header - status bar + compact mode - 100% responsive, GPU via SVG ViewBox feat(atoms): add ConnectionStatus indicator - 5 states: disconnected/connecting/connected/reconnecting/error - animated pulse, JetBrains Mono, pill style - exported helpers: formatLatency / formatBytes docs(pkg): bump v0.1.0 → v0.2.0, add recharts peerDep
This commit is contained in:
@@ -0,0 +1,58 @@
|
||||
/**
|
||||
* ═══════════════════════════════════════════════════════════════════
|
||||
* packages/shared/src/types.ts
|
||||
* Tipos compartilhados entre websocket-core e live-charts
|
||||
* ═══════════════════════════════════════════════════════════════════
|
||||
*/
|
||||
|
||||
export interface WSMessage<T = unknown> {
|
||||
id: string;
|
||||
channel: string;
|
||||
type: "data" | "error" | "control";
|
||||
timestamp: number;
|
||||
payload: T;
|
||||
seq?: number; // sequência para detectar gaps
|
||||
}
|
||||
|
||||
export interface WSConfig {
|
||||
/** URL do broker WebSocket (wss://, ws://) */
|
||||
url: string;
|
||||
/** Nome do canal / tópico */
|
||||
channel: string;
|
||||
/** Token JWT opcional */
|
||||
token?: string;
|
||||
/** Timeout de conexão em ms */
|
||||
connectTimeoutMs?: number;
|
||||
/** Intervalo de heartbeat em ms (envia ping) */
|
||||
heartbeatIntervalMs?: number;
|
||||
/** Número de tentativas de reconexão antes de desistir */
|
||||
maxRetries?: number;
|
||||
/** Delay base para backoff exponencial em ms */
|
||||
retryBaseMs?: number;
|
||||
/** Delay máximo de backoff em ms */
|
||||
retryMaxMs?: number;
|
||||
/** Buffer máximo de mensagens armazenadas */
|
||||
maxBufferSize?: number;
|
||||
}
|
||||
|
||||
export type WSStatus =
|
||||
| "idle"
|
||||
| "connecting"
|
||||
| "connected"
|
||||
| "retrying"
|
||||
| "error"
|
||||
| "closed";
|
||||
|
||||
export interface WSState<T = unknown> {
|
||||
status: WSStatus;
|
||||
data: T[];
|
||||
error: Error | null;
|
||||
lastMessage: WSMessage<T> | null;
|
||||
retryCount: number;
|
||||
latencyMs: number | null;
|
||||
bufferSize: number;
|
||||
}
|
||||
|
||||
export type MessageHandler<T = unknown> = (msg: WSMessage<T>) => void;
|
||||
export type StatusHandler = (status: WSStatus, prev: WSStatus) => void;
|
||||
export type ErrorHandler = (err: Error) => void;
|
||||
Reference in New Issue
Block a user