{"version":3,"file":"Client.mjs","sources":["../../src/Client.ts"],"sourcesContent":["import { ServerError } from \"./errors/ServerError\";\nimport { Room, RoomAvailable } from \"./Room\";\nimport { Auth } from \"./Auth\";\nimport { SchemaConstructor } from \"./serializer/SchemaSerializer\";\nconst Fly = require(\"flyio/dist/npm/wx\");\n\nconst fly = new Fly();\n\nexport type JoinOptions = any;\n\nexport class MatchMakeError extends Error {\n    code: number;\n    constructor(message: string, code: number) {\n        super(message);\n        this.code = code;\n        Object.setPrototypeOf(this, MatchMakeError.prototype);\n    }\n}\n\n// - React Native does not provide `window.location`\n// - Cocos Creator (Native) does not provide `window.location.hostname`\nconst DEFAULT_ENDPOINT =\n    typeof window !== \"undefined\" &&\n    typeof window?.location?.hostname !== \"undefined\"\n        ? `${window.location.protocol.replace(\"http\", \"ws\")}//${\n              window.location.hostname\n          }${window.location.port && `:${window.location.port}`}`\n        : \"ws://127.0.0.1:2567\";\n\nexport class Client {\n    protected endpoint: string;\n    protected _auth: Auth;\n\n    constructor(endpoint: string = DEFAULT_ENDPOINT) {\n        this.endpoint = endpoint;\n    }\n\n    public get auth(): Auth {\n        if (!this._auth) {\n            this._auth = new Auth(this.endpoint);\n        }\n        return this._auth;\n    }\n\n    public async joinOrCreate<T>(\n        roomName: string,\n        options: JoinOptions = {},\n        rootSchema?: SchemaConstructor<T>\n    ) {\n        return await this.createMatchMakeRequest<T>(\n            \"joinOrCreate\",\n            roomName,\n            options,\n            rootSchema\n        );\n    }\n\n    public async create<T>(\n        roomName: string,\n        options: JoinOptions = {},\n        rootSchema?: SchemaConstructor<T>\n    ) {\n        return await this.createMatchMakeRequest<T>(\n            \"create\",\n            roomName,\n            options,\n            rootSchema\n        );\n    }\n\n    public async join<T>(\n        roomName: string,\n        options: JoinOptions = {},\n        rootSchema?: SchemaConstructor<T>\n    ) {\n        return await this.createMatchMakeRequest<T>(\n            \"join\",\n            roomName,\n            options,\n            rootSchema\n        );\n    }\n\n    public async joinById<T>(\n        roomId: string,\n        options: JoinOptions = {},\n        rootSchema?: SchemaConstructor<T>\n    ) {\n        return await this.createMatchMakeRequest<T>(\n            \"joinById\",\n            roomId,\n            options,\n            rootSchema\n        );\n    }\n\n    public async reconnect<T>(\n        roomId: string,\n        sessionId: string,\n        rootSchema?: SchemaConstructor<T>\n    ) {\n        return await this.createMatchMakeRequest<T>(\n            \"joinById\",\n            roomId,\n            { sessionId },\n            rootSchema\n        );\n    }\n\n    public async getAvailableRooms<Metadata = any>(\n        roomName: string = \"\"\n    ): Promise<RoomAvailable<Metadata>[]> {\n        const url = `${this.endpoint.replace(\n            \"ws\",\n            \"http\"\n        )}/matchmake/${roomName}`;\n        return (\n            await fly.get(url, {}, { headers: { Accept: \"application/json\" } })\n        ).data;\n    }\n\n    public async consumeSeatReservation<T>(\n        response: any,\n        rootSchema?: SchemaConstructor<T>\n    ): Promise<Room<T>> {\n        const room = this.createRoom<T>(response.room.name, rootSchema);\n        room.roomId = response.room.roomId;\n        room.sessionId = response.sessionId;\n\n        room.connect(\n            this.buildEndpoint(response.room, { sessionId: room.sessionId })\n        );\n\n        return new Promise((resolve, reject) => {\n            const onError = (code, message) =>\n                reject(new ServerError(code, message));\n            room.onError.once(onError);\n\n            room[\"onJoin\"].once(() => {\n                room.onError.remove(onError);\n                resolve(room);\n            });\n        });\n    }\n\n    protected async createMatchMakeRequest<T>(\n        method: string,\n        roomName: string,\n        options: JoinOptions = {},\n        rootSchema?: SchemaConstructor<T>\n    ) {\n        const url = `${this.endpoint.replace(\n            \"ws\",\n            \"http\"\n        )}/matchmake/${method}/${roomName}`;\n\n        // automatically forward auth token, if present\n        if (this._auth && this._auth.hasToken) {\n            options.token = this._auth.token;\n        }\n\n        const response = (\n            await fly.post(url, JSON.stringify(options), {\n                headers: {\n                    Accept: \"application/json\",\n                    \"Content-Type\": \"application/json\",\n                },\n            })\n        ).data;\n\n        if (response.error) {\n            throw new MatchMakeError(response.error, response.code);\n        }\n\n        return this.consumeSeatReservation<T>(response, rootSchema);\n    }\n\n    protected createRoom<T>(\n        roomName: string,\n        rootSchema?: SchemaConstructor<T>\n    ) {\n        return new Room<T>(roomName, rootSchema);\n    }\n\n    protected buildEndpoint(room: any, options: any = {}) {\n        const params = [];\n\n        for (const name in options) {\n            if (!options.hasOwnProperty(name)) {\n                continue;\n            }\n            params.push(`${name}=${options[name]}`);\n        }\n\n        return `${this.endpoint}/${room.processId}/${room.roomId}?${params.join(\n            \"&\"\n        )}`;\n    }\n}\n"],"names":[],"mappings":"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"}