/** * Spaxel Dashboard - Time-Travel Replay Mode * * Provides pause-live, timeline scrubbing, and replay 3D visualization * from recorded CSI data. */ (function() { 'use strict'; // ============================================ // Configuration // ============================================ const CONFIG = { // Default replay window when pausing live (60 seconds before now) defaultReplayWindowSec: 60, // Timeline scrubber update interval (ms) timelineUpdateInterval: 100, // Playback speeds speeds: [1, 2, 5], // Timestamp range padding when creating replay sessions sessionPaddingMs: 5000, // Event fetch configuration eventFetchBatchSize: 100, // events per batch eventMarkerTypes: ['anomaly', 'anomaly_detected', 'security_alert', 'portal_crossing', 'zone_entry', 'zone_exit'], }; // ============================================ // State // ============================================ const state = { // Replay session state activeSessionId: null, sessionFromMs: null, sessionToMs: null, sessionCurrentMs: null, sessionSpeed: 1, sessionState: 'stopped', // stopped, paused, playing // Recording store info storeOldestMs: null, storeNewestMs: null, storeHasData: false, // UI state isPaused: false, isReplayMode: false, // Callbacks onReplayBlob: null, }; // ============================================ // DOM Elements // ============================================ let elements = {}; // ============================================ // Initialization // ============================================ function init() { console.log('[Replay] Initializing time-travel replay'); // Create replay controls createReplayControls(); // Fetch recording store info fetchStoreInfo(); // Start timeline update loop startTimelineLoop(); console.log('[Replay] Ready'); } // ============================================ // Replay Controls UI // ============================================ function createReplayControls() { const statusBar = document.getElementById('status-bar'); if (!statusBar) { console.warn('[Replay] Status bar not found'); return; } // Create replay control bar (hidden by default) const replayBar = document.createElement('div'); replayBar.id = 'replay-control-bar'; replayBar.className = 'replay-control-bar'; replayBar.style.display = 'none'; replayBar.innerHTML = `