{"version":3,"file":"debug.mjs","sources":["../src/debug.ts"],"sourcesContent":["import { Client } from \"./Client.ts\";\nimport type { Room } from \"./Room.ts\";\nimport { applyPanelPosition, authInstances, getDebugRoot, loadPreferences, preferences, repositionDebugPanels, roomDebugInfo, savePreferences } from \"./debug/core.ts\";\nimport { initLayout, onReflow } from \"./debug/layout.ts\";\nimport { calculateRates, initialize, updateDebugPanel } from \"./debug/panel.ts\";\nimport { onPredictPublished, positionPredictContainer } from \"./debug/predict.ts\";\nimport type { PredictCore } from \"./debug/predict-bridge.ts\";\n\n// Single interval for all panels\nlet globalUpdateInterval = null;\n\n// Load preferences on script load\nloadPreferences();\n\n// Every overlay surface re-anchors from one rAF-coalesced viewport signal.\ninitLayout();\nonReflow(applyPanelPosition);       // logo + menu + room-panel stack\nonReflow(positionPredictContainer); // predict overlay (its own corner)\n\n// Order-preserving jittered delay. Returns the setTimeout ms, or -1 when sim is off.\n// `cursor.t` is a monotonic delivery clock: each message lands at max(now+base±jitter,\n// previous+0.5ms), so jitter perturbs message SPACING without reordering — the reliable\n// schema decoder never sees an out-of-order patch (which would corrupt the delta stream).\nfunction jitteredDelay(base: number, jit: number, cursor: { t: number }): number {\n    if (!preferences.latencySimulation.enabled || (base <= 0 && jit <= 0)) return -1;\n    // Symmetric U[-jit,jit] jitter — perturbs message SPACING without reordering.\n    const j = jit > 0 ? (Math.random() * 2 - 1) * jit : 0;\n    const now = performance.now();\n    const at = Math.max(now + base + j, cursor.t + 0.5);\n    cursor.t = at;\n    return at - now;\n}\n\n// Console API to drive the network simulator: `__net(80, 40)` = 80ms round-trip\n// latency ± 40ms jitter, split evenly across both directions. `__net()` clears it.\n(globalThis as { __net?: (delay?: number, jitter?: number) => void }).__net = (delay = 0, jitter = 0) => {\n    preferences.latencySimulation.delay = delay;\n    preferences.latencySimulation.jitter = jitter;\n    preferences.latencySimulation.enabled = delay > 0 || jitter > 0;\n    savePreferences();\n    console.log(`[net] RTT ${delay}±${jitter}ms (split both ways) — ${delay > 0 || jitter > 0 ? \"ON\" : \"OFF\"}`);\n};\n\n// Start global update interval if not already running\nfunction ensureGlobalUpdateInterval() {\n    if (globalUpdateInterval === null) {\n        globalUpdateInterval = setInterval(function() {\n            // Loop through all panels and calculate rates\n            roomDebugInfo.forEach(function(debugInfo, uniquePanelId) {\n                calculateRates(debugInfo);\n            });\n\n            // Clean up interval if no more panels\n            if (roomDebugInfo.size === 0) {\n                clearInterval(globalUpdateInterval);\n                globalUpdateInterval = null;\n            }\n        }, 1000);\n    }\n}\n\nfunction applyMonkeyPatches() {\n\n    // Helper function to patch a room\n    function patchRoom(room: Room) {\n        if (!room) { return room; }\n\n        // Generate a consistent room ID\n        const roomId = room.roomId;\n        const sessionId = room.sessionId;\n\n        // Generate unique panel ID: use roomId + sessionId to avoid collisions\n        // when the same sessionId is reused across rooms (e.g. QueueRoom handoff)\n        const uniquePanelId = roomId + '_' + (sessionId && sessionId !== 'N/A' && sessionId !== ''\n            ? sessionId\n            : Date.now() + '-' + Math.random().toString(36).substring(2, 9));\n\n        const transport = room.connection?.transport as any;\n        // WebSocket transports expose `ws.url`; h3/WebTransport exposes `url`.\n        const endpoint = transport?.ws?.url ?? transport?.url ?? 'N/A';\n        let host = 'N/A';\n        try { host = new URL(endpoint).host; } catch { /* non-URL endpoint (h3 / 'N/A') */ }\n\n        const debugInfo = {\n            uniquePanelId: uniquePanelId,\n            roomId: roomId,\n            roomName: room.name || 'N/A',\n            sessionId: sessionId || 'N/A',\n            endpoint,\n            host,\n            room, // Store room reference for state inspector\n            bytesSent: 0,\n            bytesReceived: 0,\n            messagesSent: 0,\n            messagesReceived: 0,\n            bytesSentDelta: 0,\n            bytesReceivedDelta: 0,\n            messagesSentDelta: 0,\n            messagesReceivedDelta: 0,\n            bytesSentPerSec: 0,\n            bytesReceivedPerSec: 0,\n            messagesSentPerSec: 0,\n            messagesReceivedPerSec: 0,\n            lastUpdate: Date.now(),\n            bytesSentHistory: [],\n            bytesReceivedHistory: [],\n            jitterHistory: [] as number[], // per-second snapshots of room.clock.jitter() for the sparkline\n            // historyTimestamps: [],\n            maxHistoryLength: 60, // Keep last 60 data points (1 minute at 1 second intervals)\n            messageTypes: null, // Will store message types from __playground_message_types\n            pingMs: null as number | null, // Current ping value in milliseconds\n            pingInterval: null as any // Interval for pinging the room\n        };\n\n        roomDebugInfo.set(uniquePanelId, debugInfo);\n\n        // Start ping interval (every 2 seconds)\n        debugInfo.pingInterval = setInterval(() => {\n            room.ping((ms: number) => {\n                debugInfo.pingMs = ms;\n            });\n        }, 2000);\n\n        // Initial ping\n        room.ping((ms: number) => {\n            debugInfo.pingMs = ms;\n        });\n\n        // Listen for __playground_message_types message\n        room.onMessage('__playground_message_types', (messageTypes: any) => {\n            debugInfo.messageTypes = messageTypes;\n\n            // Show/hide message button based on message types availability\n            var messageBtnElement = getDebugRoot().getElementById('debug-message-btn-' + uniquePanelId);\n            if (messageBtnElement) {\n                messageBtnElement.style.display = messageTypes ? 'flex' : 'none';\n            }\n        });\n\n        // Helper function to track received message/bytes\n        function trackReceivedMessage(data) {\n            // Calculate bytes received\n            var bytes = 0;\n            if (data instanceof Blob) {\n                bytes = data.size;\n            } else if (data instanceof ArrayBuffer) {\n                bytes = data.byteLength;\n            } else if (typeof data === 'string') {\n                bytes = new Blob([data]).size;\n            } else if (data) {\n                try {\n                    bytes = new Blob([JSON.stringify(data)]).size;\n                } catch (e) {\n                    bytes = new Blob([String(data)]).size;\n                }\n            }\n\n            //\n            // TODO: avoid trackig __playground_message_types messages in the stats\n            //\n            debugInfo.messagesReceived++;\n            debugInfo.messagesReceivedDelta++;\n            debugInfo.bytesReceived += bytes;\n            debugInfo.bytesReceivedDelta += bytes;\n        }\n\n        function trackSentMessage(data) {\n            var bytes = 0;\n            if (data instanceof Blob) {\n                bytes = data.size;\n            } else if (data instanceof ArrayBuffer) {\n                bytes = data.byteLength;\n            } else if (typeof data === 'string') {\n                bytes = new Blob([data]).size;\n            }\n            debugInfo.messagesSent++;\n            debugInfo.messagesSentDelta++;\n            debugInfo.bytesSent += data.length;\n            debugInfo.bytesSentDelta += data.length;\n        }\n\n        // Per-connection delivery cursors so jittered messages stay in arrival order.\n        const inCursor = { t: 0 }, outCursor = { t: 0 };\n\n        // Monkey-patch: track received messages through onmessage event\n        const originalOnMessage = transport.events.onmessage;\n        transport.events.onmessage = function(event) {\n            // Clone event data to avoid issues with delayed processing\n            var eventData = event.data;\n            if (eventData instanceof Blob) {\n                eventData = eventData.slice();\n            } else if (eventData instanceof ArrayBuffer) {\n                eventData = eventData.slice(0);\n            } else if (typeof eventData === 'string') {\n                eventData = eventData;\n            }\n\n            trackReceivedMessage(eventData);\n\n            // Apply latency simulation (order-preserving jitter) for received messages.\n            // The `delay`/`jitter` sliders are ROUND-TRIP values, split evenly across\n            // the two directions — so each path applies half (send path mirrors this).\n            const wait = jitteredDelay(preferences.latencySimulation.delay / 2, preferences.latencySimulation.jitter / 2, inCursor);\n            if (wait >= 0) {\n                setTimeout(function() {\n                    // Create a synthetic event-like object\n                    var syntheticEvent = {\n                        data: eventData,\n                        target: event.target,\n                        currentTarget: event.currentTarget,\n                        type: 'message'\n                    };\n                    originalOnMessage.call(event.target, syntheticEvent);\n                }, wait);\n            } else {\n                return originalOnMessage.apply(this, arguments as any);\n            }\n        };\n\n        // Monkey-patch: delay onclose so it fires AFTER any pending onmessage\n        // callbacks scheduled via setTimeout (latency simulation). Without this,\n        // onclose → onLeave → clearRefs() runs before delayed messages are\n        // decoded, causing \"refId not found\" schema decoder errors.\n        const originalOnClose = transport.events.onclose;\n        transport.events.onclose = function(event) {\n            // jitter-only sim (delay=0) also schedules delayed messages\n            if (preferences.latencySimulation.enabled && (preferences.latencySimulation.delay > 0 || preferences.latencySimulation.jitter > 0)) {\n                setTimeout(function(this: any) {\n                    if (originalOnClose) originalOnClose.call(this, event);\n                }, preferences.latencySimulation.delay + preferences.latencySimulation.jitter + 1);\n            } else {\n                if (originalOnClose) return originalOnClose.apply(this, arguments as any);\n            }\n        };\n\n        // Monkey-patch: sending messages through room connection\n        const originalSend = room.connection.send.bind(room.connection);\n        room.connection.send = function(data: any) {\n            trackSentMessage(data);\n\n            // Apply latency simulation (order-preserving jitter) for sent messages —\n            // half the round-trip slider value, mirroring the receive path above.\n            const wait = jitteredDelay(preferences.latencySimulation.delay / 2, preferences.latencySimulation.jitter / 2, outCursor);\n            if (wait >= 0) {\n                var clonedData = data;\n                if (data instanceof ArrayBuffer) {\n                    clonedData = data.slice(0);\n                } else if (data instanceof Blob) {\n                    clonedData = data.slice(0);\n                } else if (data instanceof Uint8Array || data instanceof DataView || (data.buffer && data.buffer instanceof ArrayBuffer)) {\n                    clonedData = new Uint8Array(data).buffer;\n                }\n\n                setTimeout(function() {\n                    originalSend(clonedData);\n                }, wait);\n            } else {\n                return originalSend(data);\n            }\n        };\n\n        updateDebugPanel(uniquePanelId, debugInfo);\n\n        // Ensure global update interval is running\n        ensureGlobalUpdateInterval();\n\n        // Clean up on room leave\n        room.onLeave.once(() => {\n            // Clear ping interval\n            if (debugInfo.pingInterval !== null) {\n                clearInterval(debugInfo.pingInterval);\n                debugInfo.pingInterval = null;\n            }\n            roomDebugInfo.delete(uniquePanelId);\n            var panel = getDebugRoot().getElementById('debug-panel-' + uniquePanelId);\n            if (panel) {\n                panel.remove();\n                repositionDebugPanels();\n            }\n            // Clean up interval if no more panels\n            if (roomDebugInfo.size === 0 && globalUpdateInterval !== null) {\n                clearInterval(globalUpdateInterval);\n                globalUpdateInterval = null;\n            }\n        });\n\n\n        return room;\n    }\n\n    // Install the shared debug registry: route published handles to their panels\n    // and REPLAY anything a publisher buffered before this bundle loaded (the room\n    // panel's old failure mode — a fast join beat the dev-only dynamic import).\n    // Rooms now arrive on the \"room\" channel from Client.consumeSeatReservation,\n    // so one joined before this loaded is adopted on drain instead of missed\n    // forever — no consumeSeatReservation monkey-patch needed.\n    const debugGlobal = globalThis as {\n        __colyseusDebug?: {\n            publish(channel: string, handle: object): void;\n            __buffer?: Array<[string, { deref(): object | undefined }]>;\n        };\n    };\n    const buffered = debugGlobal.__colyseusDebug?.__buffer;\n    const registry = {\n        publish(channel: string, handle: object) {\n            if (channel === \"predict\") { onPredictPublished(handle as PredictCore); }\n            else if (channel === \"room\") { patchRoom(handle as Room); }\n        },\n    };\n    debugGlobal.__colyseusDebug = registry;\n    if (buffered) {\n        for (const [channel, ref] of buffered) {\n            const handle = ref.deref();\n            if (handle) { registry.publish(channel, handle); }\n        }\n    }\n\n    // Capture live `client.auth` on every matchmake attempt so the \"Clear auth\n    // token\" dev-tool can null the in-memory token (not just storage). These run\n    // BEFORE the server responds, so a token rejected by onAuth is still captured\n    // — consumeSeatReservation is too late (it never runs when onAuth fails).\n    ['joinOrCreate', 'join', 'create', 'joinById', 'reconnect'].forEach((method) => {\n        const original = (Client.prototype as any)[method];\n        if (typeof original !== 'function') { return; }\n        (Client.prototype as any)[method] = function(this: any, ...args: any[]) {\n            if (this.auth) { authInstances.add(this.auth); }\n            return original.apply(this, args);\n        };\n    });\n\n}\n\napplyMonkeyPatches();\n\n// Initialize only after DOM is ready\n// (in case script is loaded in HEAD tag)\nif (document.readyState === 'loading') {\n    document.addEventListener('DOMContentLoaded', initialize);\n} else {\n    // DOM is already ready\n    initialize();\n}\n"],"names":[],"mappings":"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"}