{"version":3,"file":"Connection.cjs","sources":["../src/Connection.ts"],"sourcesContent":["import type { ITransport, ITransportEventMap } from \"./transport/ITransport.ts\";\nimport { H3TransportTransport } from \"./transport/H3Transport.ts\";\nimport { WebSocketTransport } from \"./transport/WebSocketTransport.ts\";\nimport { CloseCode } from \"@colyseus/shared-types\";\n\nconst onOfflineListeners: (() => void)[] = [];\nconst hasGlobalEventListeners = typeof (addEventListener) === \"function\" && typeof (removeEventListener) === \"function\";\nif (hasGlobalEventListeners) {\n    /**\n     * Detects when the network is offline and closes all connections.\n     * (When switching wifi networks, etc.)\n     */\n    addEventListener(\"offline\", () => {\n        console.warn(`@colyseus/sdk: 🛑 Network offline. Closing ${onOfflineListeners.length} connection(s)`);\n        onOfflineListeners.forEach((listener) => listener());\n    }, false);\n}\n\nexport class Connection implements ITransport {\n    transport: ITransport;\n    events: ITransportEventMap = {};\n\n    url?: string;\n    options?: any;\n\n    #_offlineListener = (hasGlobalEventListeners) ? () => this.close(CloseCode.MAY_TRY_RECONNECT) : null;\n\n    constructor(protocol?: string) {\n        switch (protocol) {\n            case \"h3\":\n                this.transport = new H3TransportTransport(this.events);\n                break;\n\n            default:\n                this.transport = new WebSocketTransport(this.events);\n                break;\n        }\n    }\n\n    connect(url: string, options?: any): void {\n        if (hasGlobalEventListeners) {\n            const onOpen = this.events.onopen;\n            this.events.onopen = (ev: any) => {\n                onOfflineListeners.push(this.#_offlineListener);\n                onOpen?.(ev);\n            };\n\n            const onClose = this.events.onclose;\n            this.events.onclose = (ev: any) => {\n                onOfflineListeners.splice(onOfflineListeners.indexOf(this.#_offlineListener), 1);\n                onClose?.(ev);\n            };\n        }\n\n        this.url = url;\n        this.options = options;\n        this.transport.connect(url, options);\n    }\n\n    send(data: Buffer | Uint8Array): void {\n        this.transport.send(data);\n    }\n\n    sendUnreliable(data: Buffer | Uint8Array): void {\n        this.transport.sendUnreliable(data);\n    }\n\n    reconnect(queryParams: { reconnectionToken: string, skipHandshake?: boolean }): void {\n        // h3/WebTransport carries the session params (roomId/sessionId/reconnectionToken/\n        // skipHandshake) in the bidi seat-reservation message, NOT the URL — appending\n        // them as query params yields an invalid WebTransport path (ERR_METHOD_NOT_SUPPORTED).\n        // So reconnect to the same origin and merge the params into the connect options.\n        if (this.transport instanceof H3TransportTransport) {\n            this.transport.connect(this.url, { ...this.options, ...queryParams });\n            return;\n        }\n\n        const url = new URL(this.url);\n\n        // override query params\n        for (const key in queryParams) {\n            url.searchParams.set(key, queryParams[key]);\n        }\n\n        this.transport.connect(url.toString(), this.options);\n    }\n\n    close(code?: number, reason?: string): void {\n        this.transport.close(code, reason);\n    }\n\n    get isOpen() {\n        return this.transport.isOpen;\n    }\n\n}\n"],"names":["CloseCode","H3TransportTransport","WebSocketTransport","__classPrivateFieldGet"],"mappings":"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"}