{"version":3,"file":"state-tree.cjs","sources":["../../src/debug/state-tree.ts"],"sourcesContent":["import { type DataChange, Metadata, Schema } from \"@colyseus/schema\";\n\n/**\n * Renders a Colyseus room state tree into a DOM container and keeps it in sync\n * as the decoder reports changes.\n *\n * Update strategy:\n *\n *  - The cheap, common case — a primitive field/item value changing (player\n *    positions, scores, …) — is patched *in place*: only the text of the\n *    affected `<span>` is rewritten. The surrounding DOM keeps its identity, so\n *    in-flight clicks, text selection, focus, hover and scroll all survive, and\n *    there is no flicker.\n *\n *  - Anything structural (a key added/removed, a sub-object replaced, an array\n *    reordered) falls back to a full re-render, throttled so bursts coalesce.\n *    This matches the historical behaviour and is a safe default.\n *\n * The bridge between a change record and its DOM node is the `ref` object\n * identity carried by every `DataChange` — no schema-internal symbols are read.\n * Each rendered container ref is assigned a render-local id; primitive value\n * spans are tagged `data-vk=\"<ownerId>|<key>\"`, so a change to `(ref, field)`\n * can be located in O(1).\n */\n\nconst VALUE_COLORS = {\n    string: '#CE9178',\n    number: '#B5CEA8',\n    boolean: '#569CD6',\n    nullish: '#858585',\n} as const;\n\nconst KEY_COLOR = '#DCDCAA';\nconst PUNCTUATION_COLOR = '#858585';\n\nconst FULL_RENDER_THROTTLE_MS = 200;\n\ninterface Patch {\n    els: HTMLElement[];\n    value: any;\n}\n\nexport class StateTreeView {\n    private container: HTMLElement;\n    private getState: () => any;\n\n    // Paths (e.g. \"root.players.abc\") currently expanded. Survives re-renders.\n    private expandedPaths: Set<string> = new Set(['root']);\n\n    // Render-local id assigned to each container ref during a full render.\n    // Keyed by object identity (the same instance carried in DataChange.ref).\n    private refIds: Map<object, number> = new Map();\n    private nextRefId: number = 1;\n\n    // \"ownerId|key\" -> primitive value span(s). Rebuilt after each full render.\n    // An array because a shared ref (refCount > 1) renders in multiple places.\n    private valueIndex: Map<string, HTMLElement[]> = new Map();\n\n    // Trailing-edge throttle bookkeeping for full re-renders.\n    private fullRenderTimer: ReturnType<typeof setTimeout> | null = null;\n    private lastFullRender: number = 0;\n\n    // Set while the tab is hidden: change work is skipped (nothing is on screen)\n    // and coalesced into a single catch-up render when the tab becomes visible.\n    private dirty: boolean = false;\n\n    constructor(container: HTMLElement, getState: () => any) {\n        this.container = container;\n        this.getState = getState;\n\n        // Event delegation: a single listener survives every re-render, so\n        // expand/collapse keeps working regardless of how the tree updates.\n        this.container.addEventListener('click', (e: MouseEvent) => {\n            const button = (e.target as HTMLElement).closest('[data-expand-button]');\n            if (button) {\n                e.stopPropagation();\n                this.toggleExpand(button as HTMLElement);\n            }\n        });\n\n        // Skip work while the tab is hidden; resync on return (see applyChanges).\n        document.addEventListener('visibilitychange', this.onVisibilityChange);\n    }\n\n    /** Detach document-level listeners and timers. Call when discarding the view. */\n    dispose(): void {\n        document.removeEventListener('visibilitychange', this.onVisibilityChange);\n        if (this.fullRenderTimer) {\n            clearTimeout(this.fullRenderTimer);\n            this.fullRenderTimer = null;\n        }\n    }\n\n    private onVisibilityChange = (): void => {\n        if (!document.hidden && this.dirty) {\n            this.dirty = false;\n            this.render();\n        }\n    };\n\n    /** Full (re)render of the whole tree. Preserves expanded paths. */\n    render(): void {\n        if (this.fullRenderTimer) {\n            clearTimeout(this.fullRenderTimer);\n            this.fullRenderTimer = null;\n        }\n        this.lastFullRender = Date.now();\n        this.refIds = new Map();\n        this.nextRefId = 1;\n\n        let inner: string;\n        try {\n            inner = this.renderNode(this.getState() || {});\n        } catch (e: any) {\n            this.container.innerHTML = '<div style=\"color: #e74856; padding: 20px;\">Error accessing room state: ' + escapeHtml(e.message) + '</div>';\n            this.valueIndex = new Map();\n            return;\n        }\n\n        this.container.innerHTML = '<div style=\"font-family: \\'Consolas\\', \\'Monaco\\', \\'Courier New\\', monospace; font-size: 12px; line-height: 1.5; color: #d4d4d4; padding: 8px;\">' + inner + '</div>';\n        this.buildValueIndex();\n    }\n\n    /**\n     * Apply a batch of decoder changes. Patches primitive value changes in\n     * place; falls back to a (throttled) full render for anything structural.\n     */\n    applyChanges(changes: DataChange[]): void {\n        // Tab hidden: nothing is on screen. Drop the work and remember to do a\n        // single catch-up render once the tab is visible again.\n        if (document.hidden) {\n            this.dirty = true;\n            return;\n        }\n        // Returned from a hidden tab with missed changes: full render to resync.\n        // (Belt-and-suspenders alongside the visibilitychange listener, in case\n        // a change lands before that handler runs.)\n        if (this.dirty) {\n            this.dirty = false;\n            this.render();\n            return;\n        }\n\n        // A full render is already queued — it will reflect the latest state,\n        // so there is nothing useful to patch in the meantime.\n        if (this.fullRenderTimer) { return; }\n\n        const patches = this.collectPatches(changes);\n        if (patches === null) {\n            this.scheduleFullRender();\n            return;\n        }\n        for (let i = 0; i < patches.length; i++) {\n            this.applyPatch(patches[i]);\n        }\n    }\n\n    /**\n     * Returns the in-place patches for `changes`, or `null` if any change is\n     * not a primitive value update on an already-rendered slot (in which case\n     * the caller should do a full re-render).\n     */\n    private collectPatches(changes: DataChange[]): Patch[] | null {\n        const patches: Patch[] = [];\n        for (let i = 0; i < changes.length; i++) {\n            const change = changes[i];\n            if (!isPatchablePrimitive(change.value)) { return null; }\n\n            const ownerId = this.refIds.get(change.ref as object);\n            if (ownerId === undefined) { return null; }\n\n            const key = (change.field !== undefined) ? change.field : change.dynamicIndex;\n            const els = this.valueIndex.get(ownerId + '|' + String(key));\n            if (!els || els.length === 0) { return null; }\n\n            patches.push({ els, value: change.value });\n        }\n        return patches;\n    }\n\n    private applyPatch(patch: Patch): void {\n        const formatted = formatPrimitive(patch.value);\n        for (let i = 0; i < patch.els.length; i++) {\n            const el = patch.els[i];\n            el.textContent = formatted.text;\n            el.style.color = formatted.color;\n        }\n    }\n\n    private scheduleFullRender(): void {\n        if (this.fullRenderTimer) { return; }\n        const wait = Math.max(0, FULL_RENDER_THROTTLE_MS - (Date.now() - this.lastFullRender));\n        if (wait === 0) {\n            this.render();\n        } else {\n            this.fullRenderTimer = setTimeout(() => {\n                this.fullRenderTimer = null;\n                this.render();\n            }, wait);\n        }\n    }\n\n    private buildValueIndex(): void {\n        this.valueIndex = new Map();\n        const spans = this.container.querySelectorAll<HTMLElement>('[data-vk]');\n        for (let i = 0; i < spans.length; i++) {\n            const el = spans[i];\n            const vk = el.getAttribute('data-vk');\n            if (vk === null) { continue; }\n            const existing = this.valueIndex.get(vk);\n            if (existing) { existing.push(el); }\n            else { this.valueIndex.set(vk, [el]); }\n        }\n    }\n\n    private localIdFor(ref: object): number {\n        let id = this.refIds.get(ref);\n        if (id === undefined) {\n            id = this.nextRefId++;\n            this.refIds.set(ref, id);\n        }\n        return id;\n    }\n\n    private toggleExpand(expandButton: HTMLElement): void {\n        const content = expandButton.nextElementSibling as HTMLElement | null;\n        const icon = expandButton.querySelector('[data-expand-icon]');\n        if (!content || !content.style) { return; }\n\n        const isHidden = content.style.display === 'none';\n        content.style.display = isHidden ? 'block' : 'none';\n        if (icon) { icon.textContent = isHidden ? '▼' : '▶'; }\n\n        const pathElement = expandButton.closest('[data-path]');\n        if (pathElement) {\n            const path = pathElement.getAttribute('data-path');\n            if (path !== null) {\n                if (isHidden) { this.expandedPaths.add(path); }\n                else { this.expandedPaths.delete(path); }\n            }\n        }\n    }\n\n    /** Recursively render any value to an HTML string. */\n    private renderNode(\n        obj: any,\n        depth: number = 0,\n        parentKey: string = '',\n        path: string = '',\n        fieldName: string | null = null,\n        vk: string | null = null,\n    ): string {\n        if (depth > 10) {\n            return '<span style=\"color: ' + PUNCTUATION_COLOR + '; font-style: italic;\">[Max depth reached]</span>';\n        }\n\n        if (obj === null || obj === undefined) {\n            return primitiveSpan(obj, vk);\n        }\n\n        const type = typeof obj;\n        if (type === 'string' || type === 'number' || type === 'boolean') {\n            return primitiveSpan(obj, vk);\n        }\n\n        const indent = depth * 6;\n        const currentPath = path ? path + '.' + (parentKey || '') : (parentKey || 'root');\n        const isPathExpanded = this.expandedPaths.has(currentPath);\n\n        // forEach collections (Map, Set, Array, …)\n        if (typeof obj.forEach === 'function') {\n            const collectionSize = (obj.size || obj.length) || null;\n            const size = (collectionSize !== null ? collectionSize : '?');\n            const ownerId = this.localIdFor(obj);\n            const displayState = getDisplayState(depth, isPathExpanded);\n            const displayLabel = fieldName !== null ? fieldName : (displayState.isRoot ? 'State' : '');\n\n            let html = '<div style=\"margin-left: ' + indent + 'px;\" data-path=\"' + escapeAttr(currentPath) + '\">';\n            html += renderExpandButton(displayState, displayLabel, size);\n            html += '<div style=\"display: ' + displayState.initialDisplay + ';\">';\n\n            const isSet = obj instanceof Set || (obj.constructor && obj.constructor.name === 'Set');\n            try {\n                obj.forEach((value: any, key: any) => {\n                    if (isSet) {\n                        // Sets pass (value, value, set) — only the value matters.\n                        html += this.renderNode(value, depth + 1, String(key), currentPath);\n                    } else {\n                        const isKeyNumber = typeof key === 'number';\n                        const keyStr = isKeyNumber ? '[' + String(key) + ']' : String(key);\n                        html += this.renderKeyValue(key, value, depth + 1, currentPath, keyStr, typeof key === 'string', ownerId);\n                    }\n                });\n            } catch (e: any) {\n                const errorIndent = (depth + 1) * 6;\n                html += '<div style=\"margin-left: ' + errorIndent + 'px; color: #e74856;\">Error iterating: ' + escapeHtml(e.message) + '</div>';\n            }\n\n            html += '</div></div>';\n            return html;\n        }\n\n        if (type === 'object') {\n            const keys = schemaFieldKeys(obj);\n            const ownerId = this.localIdFor(obj);\n            const displayState = getDisplayState(depth, isPathExpanded);\n            const displayLabel = fieldName !== null ? fieldName : (displayState.isRoot ? 'state' : '');\n\n            let html = '<div style=\"margin-left: ' + indent + 'px;\" data-path=\"' + escapeAttr(currentPath) + '\">';\n\n            if (keys.length === 0) {\n                if (displayLabel) {\n                    html += '<span style=\"color: ' + getLabelColor(displayLabel) + ';\">' + escapeHtml(String(displayLabel)) + '</span><span style=\"color: ' + PUNCTUATION_COLOR + ';\"> {}</span>';\n                } else {\n                    html += '<span style=\"color: ' + PUNCTUATION_COLOR + ';\">{}</span>';\n                }\n            } else {\n                html += renderExpandButton(displayState, displayLabel, null);\n                html += '<div style=\"display: ' + displayState.initialDisplay + ';\">';\n                for (let i = 0; i < keys.length; i++) {\n                    const key = keys[i];\n                    if (key === '~refId') { continue; }\n                    html += this.renderKeyValue(key, obj[key], depth + 1, currentPath, key, false, ownerId);\n                }\n                html += '</div>';\n            }\n\n            html += '</div>';\n            return html;\n        }\n\n        return primitiveSpan(obj, vk);\n    }\n\n    /** Render a single `key: value` entry of an object/collection. */\n    private renderKeyValue(\n        key: any,\n        value: any,\n        depth: number,\n        currentPath: string,\n        keyDisplay: string | null,\n        isKeyString: boolean,\n        ownerId: number,\n    ): string {\n        if (isExpandable(value)) {\n            // Expandable values render their own container with the key as label.\n            return (keyDisplay !== null)\n                ? this.renderNode(value, depth, String(key), currentPath, keyDisplay)\n                : this.renderNode(value, depth, String(key), currentPath);\n        }\n\n        // Primitive value: align with expandable items (icon 10px + 4px margin).\n        const indent = depth * 6;\n        const vk = ownerId + '|' + String(key);\n        let html = '<div style=\"margin-left: ' + indent + 'px; padding-left: 14px;\">';\n        if (keyDisplay !== null) {\n            const keyColor = isKeyString ? VALUE_COLORS.string : KEY_COLOR;\n            const label = isKeyString ? '\"' + escapeHtml(String(keyDisplay)) + '\"' : escapeHtml(String(keyDisplay));\n            html += '<span style=\"color: ' + keyColor + ';\">' + label + '</span><span style=\"color: ' + PUNCTUATION_COLOR + ';\">: </span>';\n        } else {\n            html += '<span style=\"color: ' + KEY_COLOR + ';\">' + escapeHtml(String(key)) + '</span><span style=\"color: ' + PUNCTUATION_COLOR + ';\">: </span>';\n        }\n        html += this.renderNode(value, depth + 1, String(key), currentPath, null, vk);\n        html += '</div>';\n        return html;\n    }\n}\n\n// --- pure helpers -----------------------------------------------------------\n\nfunction escapeHtml(text: any): string {\n    const div = document.createElement('div');\n    div.textContent = text;\n    return div.innerHTML;\n}\n\nfunction escapeAttr(text: string): string {\n    return String(text)\n        .replace(/&/g, '&amp;')\n        .replace(/\"/g, '&quot;')\n        .replace(/</g, '&lt;')\n        .replace(/>/g, '&gt;');\n}\n\n/**\n * Field names to render for an object node.\n *\n * A Colyseus Schema exposes its synced fields as enumerable accessors on the\n * *prototype*, so `Object.keys` (own-enumerable only) returns `[]`. Worse, a\n * `.noSync()` field is stored as an *own* property, so `Object.keys` would\n * surface precisely the local-only fields we must hide. The schema metadata\n * lists exactly the synced fields in declaration order — use it for Schema\n * instances and fall back to `Object.keys` for plain objects.\n */\nfunction schemaFieldKeys(obj: any): string[] {\n    if (Schema.isSchema(obj)) {\n        return Object.keys(Metadata.getFields(obj.constructor));\n    }\n    return Object.keys(obj);\n}\n\nfunction isExpandable(value: any): boolean {\n    if (value === null || value === undefined) { return false; }\n    const valueType = typeof value;\n    const isObject = valueType === 'object' && !(value instanceof Array);\n    const hasForEach = valueType === 'object' && typeof value.forEach === 'function';\n    const isArray = value instanceof Array;\n    return isObject || isArray || hasForEach;\n}\n\n/** A value that can be patched in place (i.e. not undefined, not an object). */\nfunction isPatchablePrimitive(value: any): boolean {\n    if (value === null) { return true; }\n    const t = typeof value;\n    return t === 'string' || t === 'number' || t === 'boolean';\n}\n\nfunction getLabelColor(fieldName: any): string {\n    return typeof fieldName === 'string' && fieldName.startsWith('\"') ? VALUE_COLORS.string : KEY_COLOR;\n}\n\ninterface DisplayState {\n    isRoot: boolean;\n    initialDisplay: string;\n    initialIcon: string;\n    rootClass: string;\n}\n\nfunction getDisplayState(depth: number, isPathExpanded: boolean): DisplayState {\n    const isRoot = depth === 0;\n    return {\n        isRoot,\n        initialDisplay: isRoot ? 'block' : (isPathExpanded ? 'block' : 'none'),\n        initialIcon: (isRoot || isPathExpanded) ? '▼' : '▶',\n        rootClass: isRoot ? ' data-root-node=\"true\"' : '',\n    };\n}\n\nfunction renderExpandButton(displayState: DisplayState, displayLabel: string, size: number | string | null): string {\n    const cursor = displayState.isRoot ? 'default' : 'pointer';\n    const onmouseover = displayState.isRoot ? '' : 'this.style.backgroundColor=\\'rgba(255,255,255,0.05)\\'';\n    const onmouseout = displayState.isRoot ? '' : 'this.style.backgroundColor=\\'transparent\\'';\n\n    let html = '<div data-expand-button' + displayState.rootClass + ' style=\"display: flex; align-items: center; cursor: ' + cursor + '; user-select: none; margin: 0; padding: 1px 0;\" onmouseover=\"' + onmouseover + '\" onmouseout=\"' + onmouseout + '\">';\n    html += '<span data-expand-icon style=\"margin-right: 4px; color: ' + PUNCTUATION_COLOR + '; font-size: 10px; width: 10px; display: inline-block; text-align: center; user-select: none;\">' + displayState.initialIcon + '</span>';\n    if (displayLabel) {\n        html += '<span style=\"color: ' + getLabelColor(displayLabel) + ';\">' + escapeHtml(String(displayLabel)) + '</span>';\n    }\n    if (size !== null && size !== undefined && size !== '?') {\n        html += ' <span style=\"color: ' + PUNCTUATION_COLOR + ';\">(' + size + ') </span>';\n    }\n    html += '</div>';\n    return html;\n}\n\ninterface FormattedPrimitive {\n    text: string;\n    color: string;\n}\n\nfunction formatPrimitive(value: any): FormattedPrimitive {\n    if (value === null) { return { text: 'null', color: VALUE_COLORS.nullish }; }\n    if (value === undefined) { return { text: 'undefined', color: VALUE_COLORS.nullish }; }\n    switch (typeof value) {\n        case 'string': return { text: '\"' + value + '\"', color: VALUE_COLORS.string };\n        case 'number': return { text: String(value), color: VALUE_COLORS.number };\n        case 'boolean': return { text: String(value), color: VALUE_COLORS.boolean };\n        default: return { text: String(value), color: VALUE_COLORS.nullish };\n    }\n}\n\n/**\n * Render a primitive value as a `<span>`. When `vk` (\"<ownerId>|<key>\") is\n * provided the span is tagged so {@link StateTreeView} can patch it in place.\n */\nfunction primitiveSpan(value: any, vk: string | null): string {\n    const formatted = formatPrimitive(value);\n    const attr = (vk !== null) ? ' data-vk=\"' + escapeAttr(vk) + '\" data-kind=\"value\"' : '';\n    return '<span' + attr + ' style=\"color: ' + formatted.color + ';\">' + escapeHtml(formatted.text) + '</span>';\n}\n"],"names":["Schema","Metadata"],"mappings":"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"}