{"version":3,"file":"Room.mjs","sources":["../src/Room.ts"],"sourcesContent":["import { CloseCode, HandshakeSection, Protocol, PROTOCOL_CODE_MASK, PROTOCOL_MODIFIER_MASK, ProtocolModifier, ResponseStatus, type InferState, type InferInput, type NormalizeRoomType, type ExtractRoomMessages, type ExtractRoomClientMessages, type ExtractMessageType, type ExtractResponseType } from '@colyseus/shared-types';\nimport { decode, Decoder, encode, Iterator, Schema } from '@colyseus/schema';\n\nimport { RoomInput } from './input/RoomInput.ts';\nimport type { InputHandle, InputOptions } from './input/InputHandle.ts';\nexport { type InputHandle, type InputOptions } from './input/InputHandle.ts';\n\nimport { Packr, unpack, RESERVE_START_SPACE } from 'msgpackr';\n\nimport { Connection } from './Connection.ts';\nimport { getSerializer, Serializer } from './serializer/Serializer.ts';\n\n// The unused imports here are important for better `.d.ts` file generation\n// (Later merged with `dts-bundle-generator`)\nimport { createNanoEvents } from './core/nanoevents.ts';\nimport { createSignal } from './core/signal.ts';\n\nimport { SchemaConstructor, SchemaSerializer } from './serializer/SchemaSerializer.ts';\n\nimport { NULL_CLOCK, type RoomClock } from './RoomClock.ts';\n\nimport { type ReconnectionOptions, createReconnection, enqueueMessage } from './Reconnection.ts';\nimport { type OnReply, type RequestOptions, toRequestError } from './RoomRequest.ts';\n\nimport { now } from './core/utils.ts';\n\n// Infer serializer type based on State: SchemaSerializer for Schema types, Serializer otherwise\nexport type InferSerializer<State> = [State] extends [Schema]\n    ? SchemaSerializer<State>\n    : Serializer<State>;\n\nexport class Room<\n    T = any,\n    State = InferState<T, never>,\n> {\n    public roomId: string;\n    public sessionId: string;\n    public reconnectionToken: string;\n\n    public name: string;\n    public connection: Connection;\n\n    // Public signals\n    public onStateChange = createSignal<(state: State) => void>();\n    public onError = createSignal<(code: number, message?: string) => void>();\n    public onLeave = createSignal<(code: number, reason?: string) => void>();\n\n    public onReconnect = createSignal<() => void>();\n    public onDrop = createSignal<(code: number, reason?: string) => void>();\n\n    protected onJoin = createSignal();\n\n    public serializerId: string;\n    public serializer: InferSerializer<State>;\n\n    // reconnection logic\n    public reconnection: ReconnectionOptions = createReconnection();\n\n    protected joinedAtTime: number = 0;\n\n    /**\n     * Server-time + RTT estimator, driven by the {@link ProtocolModifier.TIMED}\n     * prefix that servers emit when `defineInput()` was called.\n     *\n     * PRESENCE CONTRACT: `clock` is never `undefined` and always satisfies\n     * {@link RoomClock} — every member, including `renderNow()`, is callable\n     * with no optional chaining and no fallback.\n     *\n     * - Defaults to a shared frozen {@link NULL_CLOCK} so `room.clock.serverNow()`\n     *   always works. The shim returns the client's own `performance.now()` and\n     *   reports `0` for RTT. Rooms that never call `defineInput()` keep this\n     *   stub for the whole session — zero allocation cost for chat / lobby /\n     *   turn-based rooms.\n     * - After handshake on an input room, a default {@link RoomClockImpl} is\n     *   instantiated. Users can swap their own implementation in via\n     *   `room.clock = new MyClock()` between `await joinOrCreate(...)` and\n     *   the first state message (any state-message arrival is on a future\n     *   microtask, so a synchronous swap is race-free). A custom clock with no\n     *   slew state of its own satisfies the `renderNow` guarantee by aliasing:\n     *   `renderNow() { return this.serverNow(); }`.\n     */\n    public clock: RoomClock = NULL_CLOCK;\n\n    protected onMessageHandlers = createNanoEvents();\n\n    protected packr: Packr;\n    protected sharedBuffer: Uint8Array;\n\n    #lastPingTime: number = 0;\n    #pingCallback?: (ms: number) => void = undefined;\n\n    /**\n     * Default time (ms) a `room.request()` / `room.send(..., callback)` waits\n     * for a reply before rejecting. Class-level default — tune globally via\n     * `Room.defaultRequestTimeout = ms`; override per-call with the `timeout` option.\n     */\n    static defaultRequestTimeout = 10000;\n\n    /** Monotonic id correlating a {@link Protocol.ROOM_REQUEST} with its reply. @internal */\n    #nextRequestId: number = 0;\n\n    /**\n     * In-flight round-trips awaiting a {@link Protocol.ROOM_RESPONSE}, keyed by the\n     * monotonic request id. `onReply` receives the decoded outcome `(ok, payload,\n     * faulted)`; `onClose` (optional) rejects on disconnect — its absence drops the\n     * registration silently. @internal\n     */\n    #pending = new Map<number, {\n        onReply: OnReply;\n        onClose?: (reason: string) => void;\n    }>();\n\n    /**\n     * Per-room input state — schema ctor, server-advertised stamp/rate flags,\n     * and the cached {@link InputHandle} — all grouped in {@link RoomInput}.\n     * Lazily created only when the room declares input (an `INPUT_*` handshake\n     * section arrives) or `input()` is called; stays `undefined` for chat /\n     * lobby / turn-based rooms — zero allocation.\n     * @internal\n     */\n    #input?: RoomInput;\n\n    /**\n     * Seq of the newest {@link ProtocolModifier.UNRELIABLE} patch applied, so a\n     * reordered datagram can be dropped rather than write a stale value. Wraps\n     * at 65536; `0` is the post-`ROOM_STATE` baseline. Stays `0` forever on\n     * rooms whose state declares no `@unreliable` field.\n     * @internal\n     */\n    #lastUnreliableSeq = 0;\n\n    constructor(name: string, rootSchema?: SchemaConstructor<State>) {\n        this.name = name;\n\n        this.packr = new Packr();\n        this.sharedBuffer = new Uint8Array(8192);\n\n        if (rootSchema) {\n            const serializer: SchemaSerializer = new (getSerializer(\"schema\"));\n            this.serializer = serializer;\n\n            const state: State = new rootSchema();\n            serializer.state = state;\n            serializer.decoder = new Decoder(state as Schema);\n        }\n\n        this.onLeave(() => {\n            this.removeAllListeners();\n            this.destroy();\n        });\n    }\n\n    public connect(endpoint: string, options?: any, headers?: any) {\n        this.connection = new Connection(options.protocol);\n        this.connection.events.onmessage = this.onMessageCallback.bind(this);\n        this.connection.events.onclose = (e: CloseEvent) => {\n            // the in-flight requests can't be answered on a closed socket\n            this.#rejectAllPending(\"connection closed before a response was received.\");\n\n            if (this.joinedAtTime === 0) {\n                console.warn?.(`Room connection was closed unexpectedly (${e.code}): ${e.reason}`);\n                this.onError.invoke(e.code, e.reason);\n                return;\n            }\n\n            if (\n                e.code === CloseCode.NO_STATUS_RECEIVED ||\n                e.code === CloseCode.ABNORMAL_CLOSURE ||\n                e.code === CloseCode.GOING_AWAY ||\n                e.code === CloseCode.MAY_TRY_RECONNECT\n            ) {\n                this.onDrop.invoke(e.code, e.reason);\n                this.handleReconnection(e.code, e.reason);\n\n            } else {\n                this.onLeave.invoke(e.code, e.reason);\n            }\n        };\n\n        this.connection.events.onerror = (e: CloseEvent) => {\n            this.onError.invoke(e.code, e.reason);\n        };\n\n        /**\n         * if local serializer has state, it means we don't need to receive the\n         * handshake from the server\n         */\n        const skipHandshake = (this.serializer?.getState() !== undefined);\n\n        if (options.protocol === \"h3\") {\n            // FIXME: refactor this.\n            const url = new URL(endpoint);\n            this.connection.connect(url.origin, { ...options, skipHandshake });\n\n        } else {\n            this.connection.connect(`${endpoint}${skipHandshake ? \"&skipHandshake=1\" : \"\"}`, headers);\n        }\n\n    }\n\n    public leave(consented: boolean = true): Promise<number> {\n        return new Promise((resolve) => {\n            this.onLeave((code) => resolve(code));\n\n            if (this.connection) {\n                if (consented) {\n                    this.sharedBuffer[0] = Protocol.LEAVE_ROOM;\n                    this.connection.send(this.sharedBuffer.subarray(0, 1));\n\n                } else {\n                    this.connection.close();\n                }\n\n            } else {\n                this.onLeave.invoke(CloseCode.CONSENTED);\n            }\n        });\n    }\n\n    public onMessage<MessageType extends keyof ExtractRoomClientMessages<NormalizeRoomType<T>>>(\n        message: MessageType,\n        callback: (payload: ExtractRoomClientMessages<NormalizeRoomType<T>>[MessageType]) => void\n    ): () => void\n    public onMessage<Payload = any>(type: \"*\", callback: (messageType: string | number, payload: Payload) => void): () => void\n    // Fallback overload: only available when no typed client messages are defined\n    public onMessage<Payload = any>(\n        type: [keyof ExtractRoomClientMessages<NormalizeRoomType<T>>] extends [never] ? (string | number) : never,\n        callback: (payload: Payload) => void\n    ): () => void\n    public onMessage(type: '*' | string | number, callback: (...args: any[]) => void) {\n        return this.onMessageHandlers.on(this.getMessageHandlerKey(type), callback);\n    }\n\n    public ping(callback: (ms: number) => void) {\n        // skip if connection is not open\n        if (!this.connection?.isOpen) {\n            return;\n        }\n\n        this.#lastPingTime = now();\n        this.#pingCallback = callback;\n        this.sharedBuffer[0] = Protocol.PING;\n        this.connection.send(this.sharedBuffer.subarray(0, 1));\n    }\n\n    public send<MessageType extends keyof ExtractRoomMessages<NormalizeRoomType<T>>>(\n        messageType: MessageType,\n        payload?: ExtractMessageType<ExtractRoomMessages<NormalizeRoomType<T>>[MessageType]>\n    ): void\n    // Request overload: passing a callback turns this into a request/response —\n    // the callback receives the value the server handler returns (or an Error).\n    public send<MessageType extends keyof ExtractRoomMessages<NormalizeRoomType<T>>>(\n        messageType: MessageType,\n        payload: ExtractMessageType<ExtractRoomMessages<NormalizeRoomType<T>>[MessageType]>,\n        callback: (response: ExtractResponseType<ExtractRoomMessages<NormalizeRoomType<T>>[MessageType]>, error?: Error) => void\n    ): void\n    // Fallback overload: only available when no typed messages are defined\n    public send<Payload = any>(\n        messageType: [keyof ExtractRoomMessages<NormalizeRoomType<T>>] extends [never] ? (string | number) : never,\n        payload?: Payload\n    ): void\n    // Fallback request overload\n    public send<Payload = any, Response = any>(\n        messageType: [keyof ExtractRoomMessages<NormalizeRoomType<T>>] extends [never] ? (string | number) : never,\n        payload: Payload,\n        callback: (response: Response, error?: Error) => void\n    ): void\n    public send(messageType: string | number, payload?: any, callback?: (response: any, error?: Error) => void): void {\n        // Request/response form: defer to `request()` and adapt to a\n        // (response, error) callback.\n        if (callback !== undefined) {\n            this.request(messageType as any, payload).then(\n                (response) => callback(response, undefined),\n                (error) => callback(undefined, error),\n            );\n            return;\n        }\n\n        const it: Iterator = { offset: 1 };\n        this.sharedBuffer[0] = Protocol.ROOM_DATA;\n\n        if (typeof(messageType) === \"string\") {\n            encode.string(this.sharedBuffer, messageType, it);\n\n        } else {\n            encode.number(this.sharedBuffer, messageType, it);\n        }\n        const headerLength = it.offset;\n\n        let data: Uint8Array;\n        if (payload !== undefined) {\n            // Reserve `headerLength` writable bytes at the front of msgpackr's\n            // output and prepend the protocol header into them.\n            data = this.packr.pack(payload, RESERVE_START_SPACE | headerLength);\n            data.set(this.sharedBuffer.subarray(0, headerLength), 0);\n        } else {\n            data = this.sharedBuffer.subarray(0, headerLength);\n        }\n\n        // If connection is not open, buffer the message\n        if (!this.connection.isOpen) {\n            enqueueMessage(this, new Uint8Array(data));\n        } else {\n            this.connection.send(data);\n        }\n    }\n\n    /**\n     * Send a message and await the server's reply. The server answers by\n     * returning a value from its matching `onMessage(type, ...)` handler.\n     *\n     * Rejects if the handler throws, if no handler is registered, if the\n     * connection closes first, or if no reply arrives within `timeout`\n     * (defaults to {@link Room.defaultRequestTimeout}).\n     *\n     * @example\n     * ```typescript\n     * const profile = await room.request(\"get-profile\", { id: 42 });\n     * ```\n     */\n    public request<MessageType extends keyof ExtractRoomMessages<NormalizeRoomType<T>>>(\n        messageType: MessageType,\n        payload?: ExtractMessageType<ExtractRoomMessages<NormalizeRoomType<T>>[MessageType]>,\n        options?: RequestOptions\n    ): Promise<ExtractResponseType<ExtractRoomMessages<NormalizeRoomType<T>>[MessageType]>>\n    public request<Payload = any, Response = any>(\n        messageType: [keyof ExtractRoomMessages<NormalizeRoomType<T>>] extends [never] ? (string | number) : never,\n        payload?: Payload,\n        options?: RequestOptions\n    ): Promise<Response>\n    public request(messageType: string | number, payload?: any, options?: RequestOptions): Promise<any> {\n        if (!this.connection.isOpen) {\n            return Promise.reject(new Error(`cannot send request \"${messageType}\": connection is not open.`));\n        }\n        const timeoutMs = options?.timeout ?? Room.defaultRequestTimeout;\n        // request = sendRequest + fail-fast-offline (above) + promise + timeout. The\n        // timer lives in this closure, so the shared #pending registry stays unaware\n        // of timeouts (a request-only concern); the reply callback and onClose both clear it.\n        return new Promise((resolve, reject) => {\n            let timer: ReturnType<typeof setTimeout>;\n            const id = this.sendRequest(\n                messageType, payload, { mode: options?.mode },\n                (ok, replyPayload, faulted) => {\n                    clearTimeout(timer);\n                    if (ok) { resolve(replyPayload); }\n                    else { reject(toRequestError(replyPayload, faulted)); }\n                },\n                (reason) => { clearTimeout(timer); reject(new Error(reason)); },\n            );\n            timer = setTimeout(() => {\n                this.cancelRequest(id);\n                reject(new Error(`request \"${messageType}\" timed out after ${timeoutMs}ms.`));\n            }, timeoutMs);\n        });\n    }\n\n    /** Next correlation id (uint32) for a round-trip. @internal */\n    #mintRequestId(): number {\n        const id = this.#nextRequestId;\n        this.#nextRequestId = (this.#nextRequestId + 1) >>> 0; // keep within uint32\n        return id;\n    }\n\n    /** Encode a {@link Protocol.ROOM_REQUEST} frame (shared by `request` + `sendRequest`).\n     *  The returned buffer aliases `sharedBuffer` for the payload-less case, so\n     *  it must be transmitted (or copied) before the next encode. @internal */\n    #encodeRequestFrame(requestId: number, messageType: string | number, payload: any): Uint8Array {\n        const it: Iterator = { offset: 1 };\n        this.sharedBuffer[0] = Protocol.ROOM_REQUEST;\n        encode.number(this.sharedBuffer, requestId, it);\n\n        if (typeof(messageType) === \"string\") {\n            encode.string(this.sharedBuffer, messageType, it);\n        } else {\n            encode.number(this.sharedBuffer, messageType, it);\n        }\n        const headerLength = it.offset;\n\n        if (payload !== undefined) {\n            const data = this.packr.pack(payload, RESERVE_START_SPACE | headerLength);\n            data.set(this.sharedBuffer.subarray(0, headerLength), 0);\n            return data;\n        }\n        return this.sharedBuffer.subarray(0, headerLength);\n    }\n\n    /**\n     * Low-level round-trip primitive: register `onReply` (called once with the\n     * decoded outcome when the server replies) and transmit a\n     * {@link Protocol.ROOM_REQUEST} (`mode` picks the channel). {@link request}\n     * wraps it with a promise + timeout. `onClose` (optional) is invoked on\n     * disconnect — omit it to drop the registration silently. Returns the request\n     * id, or `-1` if an unreliable send couldn't be transmitted (offline). @internal\n     */\n    protected sendRequest(\n        messageType: string | number,\n        payload: any,\n        opts: { mode?: \"reliable\" | \"unreliable\" },\n        onReply: OnReply,\n        onClose?: (reason: string) => void,\n    ): number {\n        const requestId = this.#mintRequestId();\n\n        const data = this.#encodeRequestFrame(requestId, messageType, payload);\n        if (opts.mode === \"unreliable\") {\n            if (!this.connection.isOpen) { return -1; }\n            // Sent once — no unreliable channel falls back to reliable inside the\n            // transport.\n            this.connection.sendUnreliable(data);\n        } else if (this.connection.isOpen) {\n            this.connection.send(data);\n        } else {\n            // Reliable + offline: buffer so it flushes on (re)connect.\n            enqueueMessage(this, new Uint8Array(data));\n        }\n\n        this.#pending.set(requestId, { onReply, onClose });\n        return requestId;\n    }\n\n    /** Drop a pending round-trip (request timeout, or the predict layer's TTL/cancel\n     *  path). Idempotent. @internal */\n    protected cancelRequest(id: number): void {\n        this.#pending.delete(id);\n    }\n\n    #rejectAllPending(reason: string) {\n        if (this.#pending.size === 0) { return; }\n        // request entries reject (their `onClose` clears the timer); entries with no\n        // `onClose` drop silently.\n        for (const entry of this.#pending.values()) { entry.onClose?.(reason); }\n        this.#pending.clear();\n    }\n\n    public sendUnreliable<T = any>(type: string | number, message?: T): void {\n        // If connection is not open, skip\n        if (!this.connection.isOpen) { return; }\n\n        const it: Iterator = { offset: 1 };\n        this.sharedBuffer[0] = Protocol.ROOM_DATA;\n\n        if (typeof(type) === \"string\") {\n            encode.string(this.sharedBuffer, type, it);\n\n        } else {\n            encode.number(this.sharedBuffer, type, it);\n        }\n        const headerLength = it.offset;\n\n        let data: Uint8Array;\n        if (message !== undefined) {\n            data = this.packr.pack(message, RESERVE_START_SPACE | headerLength);\n            data.set(this.sharedBuffer.subarray(0, headerLength), 0);\n        } else {\n            data = this.sharedBuffer.subarray(0, headerLength);\n        }\n\n        this.connection.sendUnreliable(data);\n    }\n\n    public sendBytes(type: string | number, bytes: Uint8Array) {\n        const it: Iterator = { offset: 1 };\n        this.sharedBuffer[0] = Protocol.ROOM_DATA_BYTES;\n\n        if (typeof(type) === \"string\") {\n            encode.string(this.sharedBuffer, type, it);\n\n        } else {\n            encode.number(this.sharedBuffer, type, it);\n        }\n        const headerLength = it.offset;\n\n        // grow the scratch buffer if needed, preserving the header bytes\n        if (headerLength + bytes.byteLength > this.sharedBuffer.byteLength) {\n            const newBuffer = new Uint8Array(headerLength + bytes.byteLength);\n            newBuffer.set(this.sharedBuffer.subarray(0, headerLength));\n            this.sharedBuffer = newBuffer;\n        }\n\n        this.sharedBuffer.set(bytes, headerLength);\n\n        // If connection is not open, buffer the message\n        if (!this.connection.isOpen) {\n            enqueueMessage(this, this.sharedBuffer.subarray(0, headerLength + bytes.byteLength));\n        } else {\n            this.connection.send(this.sharedBuffer.subarray(0, headerLength + bytes.byteLength));\n        }\n\n    }\n\n    /**\n     * Get the per-room input handle. Lazily created on first call and cached;\n     * subsequent calls return the same handle (options on later calls are\n     * ignored — a warning fires once if they differ from the handle's config).\n     *\n     * Schema discovery, in order:\n     * 1. `options.type` — explicit constructor (overrides everything).\n     * 2. Server-sent reflection from the JOIN handshake — populated when the\n     *    server room called `defineInput()`. The synthesized class has the\n     *    same fields as the server's input schema; `instanceof YourInput`\n     *    won't pass on it.\n     *\n     * Throws if neither source has produced a constructor.\n     *\n     * Inputs are always delta-encoded; every `send()` transmits one input\n     * (a body-less frame when nothing changed). For rollback netcode, prefer\n     * `{ mode: \"unreliable\", historySize: 4 }`: tiny per-tick payloads,\n     * redundancy across drops, idempotent under reordering.\n     *\n     * @example\n     * ```typescript\n     * const room = await client.joinOrCreate<typeof FpsRoom>(\"fps\");\n     * const input = room.input({ mode: \"unreliable\" });   // type from server\n     * // each simulation tick:\n     * input.data.seq++;\n     * input.data.vx = vx;\n     * input.data.vy = vy;\n     * input.send();\n     * ```\n     */\n    public input<\n        I = ([InferInput<T>] extends [never] ? any : InferInput<T>),\n    >(options?: InputOptions<I>): InputHandle<I> {\n        return (this.#input ??= new RoomInput(this)).handle(options);\n    }\n\n    public get state (): State {\n        return this.serializer.getState();\n    }\n\n    public removeAllListeners() {\n        this.onJoin.clear();\n        this.onStateChange.clear();\n        this.onError.clear();\n        this.onLeave.clear();\n        this.onReconnect.clear();\n        this.onDrop.clear();\n        this.onMessageHandlers.events = {};\n\n        if (this.serializer instanceof SchemaSerializer) {\n            // Remove callback references\n            this.serializer.decoder.root.callbacks = {};\n        }\n    }\n\n    protected onMessageCallback(event: MessageEvent) {\n        this.#dispatchFrame(new Uint8Array(event.data));\n    }\n\n    /** Decode + dispatch a single protocol frame. */\n    #dispatchFrame(buffer: Uint8Array) {\n        const it: Iterator = { offset: 1 };\n        // Strip modifier bits (e.g. ProtocolModifier.TIMED). Consume any\n        // modifier-attached prefix bytes here so the dispatch tree below\n        // stays modifier-agnostic.\n        const rawByte = buffer[0];\n        const code = rawByte & PROTOCOL_CODE_MASK;\n        if (rawByte & ProtocolModifier.TIMED) {\n            // [uint32 sNow][uint32 inputSeq]  — sNow = ms since room start\n            // (clock.elapsedTime); inputSeq = last PROCESSED input.\n            //\n            // Routing: the INPUT ack goes to the input handle (it owns the\n            // round-trip — what you sent, what's acked); it returns an RTT\n            // sample which, with sNow, feeds the time-only clock. `decode.*`\n            // advance `it.offset`; read in declared byte order.\n            const sNow = decode.uint32(buffer as Buffer, it);\n            const inputSeq = decode.uint32(buffer as Buffer, it);\n            const rttSample = this.#input ? this.#input.ackInput(inputSeq) : -1;\n            this.clock.sample(sNow, rttSample);\n        }\n\n        if (code === Protocol.JOIN_ROOM) {\n            const reconnectionToken = decode.utf8Read(buffer as Buffer, it, buffer[it.offset++]);\n            this.serializerId = decode.utf8Read(buffer as Buffer, it, buffer[it.offset++]);\n\n            // Instantiate serializer if not locally available.\n            if (!this.serializer) {\n                const serializer = getSerializer(this.serializerId);\n                this.serializer = new serializer();\n            }\n\n            // State reflection is length-prefixed (varint). The schema decoder\n            // runs `while (offset < bytes.byteLength)` so without a boundary\n            // it would read past the state reflection into the trailing\n            // tagged-section bytes — see Protocol.ts for the wire layout.\n            const stateReflectionLen = decode.number(buffer as Buffer, it);\n            if (stateReflectionLen > 0 && this.serializer.handshake) {\n                const stateReflectionEnd = it.offset + stateReflectionLen;\n                this.serializer.handshake(buffer.subarray(0, stateReflectionEnd), it);\n                it.offset = stateReflectionEnd;\n            }\n\n            // Parse trailing tagged sections (forward-compatible: unknown tags\n            // are skipped via length). See HandshakeSection in shared-types.\n            while (it.offset < buffer.byteLength) {\n                const tag = buffer[it.offset++];\n                const sectionLen = decode.number(buffer as Buffer, it);\n                const sectionEnd = it.offset + sectionLen;\n\n                if (tag === HandshakeSection.INPUT_REFLECTION) {\n                    (this.#input ??= new RoomInput(this)).applyReflection(buffer, it, sectionEnd);\n\n                } else if (tag === HandshakeSection.INPUT_OPTIONS) {\n                    (this.#input ??= new RoomInput(this)).applyOptions(buffer, it);\n                }\n\n                it.offset = sectionEnd;\n            }\n\n            // Hand the snapshot cadence to the clock (sections decode in any\n            // order, so do it once the loop has both the clock and patchRate) —\n            // interpolation reads it to tell an idle delta-encoded gap from the\n            // normal patch interval.\n            const patchRate = this.#input?.patchRate;\n            if (patchRate !== undefined) {\n                this.clock.setPatchInterval?.(patchRate);\n            }\n\n            if (this.joinedAtTime === 0) {\n                this.joinedAtTime = Date.now();\n                this.onJoin.invoke();\n\n            } else {\n                console.info(`[Colyseus reconnection]: ${String.fromCodePoint(0x2705)} reconnection successful!`); // ✅\n                this.reconnection.isReconnecting = false;\n                this.onReconnect.invoke();\n            }\n\n            this.reconnectionToken = `${this.roomId}:${reconnectionToken}`;\n\n            // Acknowledge JOIN_ROOM.\n            this.sharedBuffer[0] = Protocol.JOIN_ROOM;\n            this.connection.send(this.sharedBuffer.subarray(0, 1));\n\n            // Send any enqueued messages that were buffered while disconnected\n            if (this.reconnection.enqueuedMessages.length > 0) {\n                for (const message of this.reconnection.enqueuedMessages) {\n                    this.connection.send(message.data);\n                }\n                // Clear the buffer after sending\n                this.reconnection.enqueuedMessages = [];\n            }\n\n        } else if (code === Protocol.ERROR) {\n            const code = decode.number(buffer as Buffer, it);\n            const message = decode.string(buffer as Buffer, it);\n\n            this.onError.invoke(code, message);\n\n        } else if (code === Protocol.LEAVE_ROOM) {\n            this.leave();\n\n        } else if (code === Protocol.ROOM_STATE) {\n            // Full state re-baselines the unreliable timeline (join / resync).\n            this.#lastUnreliableSeq = 0;\n            this.serializer.setState(buffer, it);\n            this.onStateChange.invoke(this.serializer.getState());\n\n        } else if (code === Protocol.ROOM_STATE_PATCH) {\n            // The unreliable channel can reorder. `@unreliable` fields carry\n            // absolute values, so a late frame would write a stale one that\n            // survives until the field changes again — drop it instead.\n            if (rawByte & ProtocolModifier.UNRELIABLE) {\n                const seq = decode.uint16(buffer as Buffer, it);\n                // wrap-safe at 65536: a positive int16 delta means newer\n                if ((((seq - this.#lastUnreliableSeq) << 16) >> 16) <= 0) { return; }\n                this.#lastUnreliableSeq = seq;\n            }\n\n            this.serializer.patch(buffer, it);\n            this.onStateChange.invoke(this.serializer.getState());\n\n        } else if (code === Protocol.ROOM_DATA) {\n            const type = (decode.stringCheck(buffer as Buffer, it))\n                ? decode.string(buffer as Buffer, it)\n                : decode.number(buffer as Buffer, it);\n\n            const message = (buffer.byteLength > it.offset)\n                ? unpack(buffer as Buffer, { start: it.offset })\n                : undefined;\n\n            this.dispatchMessage(type, message);\n\n        } else if (code === Protocol.ROOM_DATA_BYTES) {\n            const type = (decode.stringCheck(buffer as Buffer, it))\n                ? decode.string(buffer as Buffer, it)\n                : decode.number(buffer as Buffer, it);\n\n            this.dispatchMessage(type, buffer.subarray(it.offset));\n\n        } else if (code === Protocol.ROOM_RESPONSE) {\n            // reply to a pending `request()` / `send(..., callback)`.\n            const requestId = decode.number(buffer as Buffer, it);\n            const status = buffer[it.offset++];\n            const payload = (buffer.byteLength > it.offset)\n                ? unpack(buffer as Buffer, { start: it.offset })\n                : undefined;\n\n            const entry = this.#pending.get(requestId);\n            // already answered (e.g. timed out / cancelled) or unknown id — ignore\n            if (entry !== undefined) {\n                this.#pending.delete(requestId);\n                // the ONE place the wire's three statuses collapse to (ok, payload, faulted):\n                entry.onReply(status === ResponseStatus.OK, payload, status === ResponseStatus.ERROR);\n            }\n\n        } else if (code === Protocol.PING) {\n            this.#pingCallback?.(Math.round(now() - this.#lastPingTime));\n            this.#pingCallback = undefined;\n        }\n    }\n\n    private dispatchMessage(type: string | number, message: any) {\n        const messageType = this.getMessageHandlerKey(type);\n\n        if (this.onMessageHandlers.events[messageType]) {\n            this.onMessageHandlers.emit(messageType, message);\n\n        } else if (this.onMessageHandlers.events['*']) {\n            this.onMessageHandlers.emit('*', type, message);\n\n        } else if (!messageType.startsWith(\"__\")) { // ignore internal messages\n            console.warn?.(`@colyseus/sdk: onMessage() not registered for type '${type}'.`);\n        }\n    }\n\n    private destroy () {\n        if (this.serializer) {\n            this.serializer.teardown();\n        }\n    }\n\n    private getMessageHandlerKey(type: string | number): string {\n        switch (typeof(type)) {\n            // string\n            case \"string\": return type;\n\n            // number\n            case \"number\": return `i${type}`;\n\n            default: throw new Error(\"invalid message type.\");\n        }\n    }\n\n    private handleReconnection(code: number, reason?: string) {\n        if (!this.reconnection.enabled) {\n            this.onLeave.invoke(code, reason);\n            return;\n        }\n\n        if (Date.now() - this.joinedAtTime < this.reconnection.minUptime) {\n            console.info(`[Colyseus reconnection]: ${String.fromCodePoint(0x274C)} Room has not been up for long enough for automatic reconnection. (min uptime: ${this.reconnection.minUptime}ms)`); // ❌\n            this.onLeave.invoke(CloseCode.ABNORMAL_CLOSURE, \"Room uptime too short for reconnection.\");\n            return;\n        }\n\n        if (!this.reconnection.isReconnecting) {\n            this.reconnection.retryCount = 0;\n            this.reconnection.isReconnecting = true;\n            // The server allocates a FRESH input buffer for the reconnected client\n            // (its consumed counter restarts at 0). Zero ours now so post-reconnect\n            // seqs line up — otherwise every ack echo (≤ the old counter) is\n            // discarded until the new counter catches up past it, and `sentCount`\n            // stays permanently ahead. Reconcilers follow this reset on their own\n            // (they poll the handle's `epoch`) — no `onReconnect` wiring needed.\n            this.#input?.reset();\n        }\n\n        this.retryReconnection();\n    }\n\n    private retryReconnection() {\n        if (this.reconnection.retryCount >= this.reconnection.maxRetries) {\n            // No more retries\n            console.info(`[Colyseus reconnection]: ${String.fromCodePoint(0x274C)} ❌ Reconnection failed after ${this.reconnection.maxRetries} attempts.`); // ❌\n            this.reconnection.isReconnecting = false;\n            this.onLeave.invoke(CloseCode.FAILED_TO_RECONNECT, \"No more retries. Reconnection failed.\");\n            return;\n        }\n\n        this.reconnection.retryCount++;\n\n        const delay = Math.min(this.reconnection.maxDelay, Math.max(this.reconnection.minDelay, this.reconnection.backoff(this.reconnection.retryCount, this.reconnection.delay)));\n        console.info(`[Colyseus reconnection]: ${String.fromCodePoint(0x023F3)} will retry in ${(delay/1000).toFixed(1)} seconds...`); // 🔄\n\n        // Wait before attempting reconnection\n        setTimeout(() => {\n            try {\n                console.info(`[Colyseus reconnection]: ${String.fromCodePoint(0x1F504)} Re-establishing sessionId '${this.sessionId}' with roomId '${this.roomId}'... (attempt ${this.reconnection.retryCount} of ${this.reconnection.maxRetries})`); // 🔄\n                this.connection.reconnect({\n                    reconnectionToken: this.reconnectionToken.split(\":\")[1],\n                    skipHandshake: true, // we already applied the handshake on first join\n                });\n\n            } catch (e) {\n                this.retryReconnection();\n            }\n        }, delay);\n    }\n}\n"],"names":[],"mappings":"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"}