{
  "version": 3,
  "sources": ["../../src-backend/ext/Room.ts"],
  "sourcesContent": ["//\n// Monkey-patch Colyseus' default behaviour\n//\nimport { Room, type Client, type ClientPrivate } from \"@colyseus/core\";\n\nfunction getStateSize(room) {\n    // TODO: `Serializer<T>` should provide a method for this (e.g. `serializer.hasState()`)\n    const hasState = (\n      room._serializer.encoder || // schema v3\n      room._serializer.state || // schema v2\n      room._serializer.previousState // legacy-fossil-delta\n    );\n    const fullState = hasState && room._serializer.getFullState();\n    return fullState && (fullState.byteLength || fullState.length) || 0;\n}\n\n(Room.prototype as any).getAvailableData = function () {\n    return {\n        clients: this.clients.length,\n        maxClients: this.maxClients,\n        metadata: this.metadata,\n        roomId: this.roomId,\n    };\n};\n\n(Room.prototype as any).getRoomListData = async function () {\n    const stateSize = getStateSize(this);\n    const elapsedTime = this.clock.elapsedTime;\n    const locked = this.locked;\n    const data = this.getAvailableData();\n\n    return { ...data, locked, elapsedTime, stateSize };\n};\n\n(Room.prototype as any).getInspectData = async function () {\n    const state = this.state;\n    const stateSize = getStateSize(this);\n    const roomElapsedTime = this.clock.elapsedTime;\n\n    const data = this.getAvailableData();\n    const clients = this.clients.map((client: Client & ClientPrivate) => ({\n        sessionId: client.sessionId,\n        elapsedTime: roomElapsedTime - client._joinedAt\n    }));\n    const locked = this.locked;\n\n    return { ...data, locked, clients, state, stateSize };\n};\n\n// Actions\n(Room.prototype as any)._forceClientDisconnect = async function (sessionId) {\n    for (let i = 0; i < this.clients.length; i++) {\n        if (this.clients[i].sessionId === sessionId) {\n            this.clients[i].leave();\n            break;\n        }\n    }\n};\n\n(Room.prototype as any)._sendMessageToClient = async function (sessionId, type, data) {\n    for (let i = 0; i < this.clients.length; i++) {\n        if (this.clients[i].sessionId === sessionId) {\n            this.clients[i].send(type, data);\n            break;\n        }\n    }\n};\n\nfunction getChild(parent: any, key: string | number) {\n    if (typeof parent.at === 'function' && typeof key === 'number') {\n        return parent.at(key);\n    }\n    if (typeof parent.get === 'function') {\n        return parent.get(String(key));\n    }\n    return parent[key];\n}\n\n(Room.prototype as any)._editStateProperty = async function (path: (string | number)[], value: any) {\n    let current = this.state;\n    for (let i = 0; i < path.length - 1; i++) {\n        if (current === null || current === undefined) return;\n        current = getChild(current, path[i]);\n    }\n    if (current === null || current === undefined) return;\n    const property = path[path.length - 1];\n    if (typeof current.set === 'function') {\n        current.set(String(property), value);\n    } else {\n        current[property] = value;\n    }\n};\n\n(Room.prototype as any)._deleteStateProperty = async function (path: (string | number)[]) {\n    let current = this.state;\n    for (let i = 0; i < path.length - 1; i++) {\n        if (current === null || current === undefined) return;\n        current = getChild(current, path[i]);\n    }\n    if (current === null || current === undefined) return;\n    const property = path[path.length - 1];\n    if (typeof current.delete === 'function') {\n        current.delete(String(property));\n    } else {\n        current[property] = undefined;\n    }\n};\n"],
  "mappings": "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",
  "names": []
}
