@colyseus/sdk 0.17.38 → 0.17.40
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/3rd_party/discord.cjs +1 -1
- package/build/3rd_party/discord.mjs +1 -1
- package/build/Auth.cjs +1 -1
- package/build/Auth.mjs +1 -1
- package/build/Client.cjs +2 -2
- package/build/Client.cjs.map +1 -1
- package/build/Client.d.ts +2 -1
- package/build/Client.mjs +2 -2
- package/build/Client.mjs.map +1 -1
- package/build/Connection.cjs +1 -1
- package/build/Connection.mjs +1 -1
- package/build/HTTP.cjs +17 -3
- package/build/HTTP.cjs.map +1 -1
- package/build/HTTP.d.ts +16 -6
- package/build/HTTP.mjs +18 -3
- package/build/HTTP.mjs.map +1 -1
- package/build/Room.cjs +1 -1
- package/build/Room.mjs +1 -1
- package/build/Storage.cjs +1 -1
- package/build/Storage.mjs +1 -1
- package/build/core/nanoevents.cjs +1 -1
- package/build/core/nanoevents.mjs +1 -1
- package/build/core/signal.cjs +1 -1
- package/build/core/signal.mjs +1 -1
- package/build/core/utils.cjs +1 -1
- package/build/core/utils.mjs +1 -1
- package/build/debug.cjs +1 -1
- package/build/debug.mjs +1 -1
- package/build/errors/Errors.cjs +1 -1
- package/build/errors/Errors.mjs +1 -1
- package/build/fetchXHR.cjs +91 -0
- package/build/fetchXHR.cjs.map +1 -0
- package/build/fetchXHR.d.ts +6 -0
- package/build/fetchXHR.mjs +84 -0
- package/build/fetchXHR.mjs.map +1 -0
- package/build/index.cjs +1 -1
- package/build/index.cjs.map +1 -1
- package/build/index.d.ts +1 -0
- package/build/index.mjs +1 -1
- package/build/index.mjs.map +1 -1
- package/build/legacy.cjs +1 -1
- package/build/legacy.mjs +1 -1
- package/build/serializer/NoneSerializer.cjs +1 -1
- package/build/serializer/NoneSerializer.mjs +1 -1
- package/build/serializer/SchemaSerializer.cjs +1 -1
- package/build/serializer/SchemaSerializer.mjs +1 -1
- package/build/serializer/Serializer.cjs +1 -1
- package/build/serializer/Serializer.mjs +1 -1
- package/build/transport/H3Transport.cjs +1 -1
- package/build/transport/H3Transport.mjs +1 -1
- package/build/transport/WebSocketTransport.cjs +1 -1
- package/build/transport/WebSocketTransport.mjs +1 -1
- package/dist/colyseus.js +96 -4
- package/dist/colyseus.js.map +1 -1
- package/dist/debug.js +1 -1
- package/package.json +6 -5
- package/src/Client.ts +3 -2
- package/src/HTTP.ts +49 -36
- package/src/fetchXHR.ts +88 -0
- package/src/index.ts +1 -0
- package/dist/colyseus-cocos-creator.js +0 -9667
- package/dist/colyseus-cocos-creator.js.map +0 -1
package/build/Auth.cjs
CHANGED
package/build/Auth.mjs
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
// This software is released under the MIT License.
|
|
4
4
|
// https://opensource.org/license/MIT
|
|
5
5
|
//
|
|
6
|
-
// colyseus.js@0.17.
|
|
6
|
+
// colyseus.js@0.17.40
|
|
7
7
|
import { getItem, removeItem, setItem } from './Storage.mjs';
|
|
8
8
|
import { createNanoEvents } from './core/nanoevents.mjs';
|
|
9
9
|
|
package/build/Client.cjs
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
// This software is released under the MIT License.
|
|
4
4
|
// https://opensource.org/license/MIT
|
|
5
5
|
//
|
|
6
|
-
// colyseus.js@0.17.
|
|
6
|
+
// colyseus.js@0.17.40
|
|
7
7
|
'use strict';
|
|
8
8
|
|
|
9
9
|
var tslib = require('tslib');
|
|
@@ -63,7 +63,7 @@ class ColyseusSDK {
|
|
|
63
63
|
}
|
|
64
64
|
this.http = new HTTP.HTTP(this, {
|
|
65
65
|
headers: (options === null || options === void 0 ? void 0 : options.headers) || {},
|
|
66
|
-
});
|
|
66
|
+
}, options === null || options === void 0 ? void 0 : options.fetchFn);
|
|
67
67
|
this.auth = new Auth.Auth(this.http);
|
|
68
68
|
this.urlBuilder = options === null || options === void 0 ? void 0 : options.urlBuilder;
|
|
69
69
|
//
|
package/build/Client.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Client.cjs","sources":["../src/Client.ts"],"sourcesContent":["import { CloseCode, Protocol, type InferState, type SDKTypes, type ServerRoomLike, type ISeatReservation } from '@colyseus/shared-types';\n\nimport { MatchMakeError, ServerError } from './errors/Errors.ts';\nimport { Room } from './Room.ts';\nimport { SchemaConstructor } from './serializer/SchemaSerializer.ts';\nimport { HTTP } from './HTTP.ts';\nimport { Auth } from './Auth.ts';\nimport { Connection } from './Connection.ts';\nimport { discordURLBuilder } from './3rd_party/discord.ts';\n\nexport type JoinOptions = any;\nexport type { ISeatReservation };\n\n// - React Native does not provide `window.location`\n// - Cocos Creator (Native) does not provide `window.location.hostname`\nconst DEFAULT_ENDPOINT = (typeof (window) !== \"undefined\" && typeof (window?.location?.hostname) !== \"undefined\")\n ? `${window.location.protocol.replace(\"http\", \"ws\")}//${window.location.hostname}${(window.location.port && `:${window.location.port}`)}`\n : \"ws://127.0.0.1:2567\";\n\nexport interface EndpointSettings {\n hostname: string,\n secure: boolean,\n port?: number,\n pathname?: string,\n searchParams?: string,\n protocol?: \"ws\" | \"h3\";\n}\n\nexport interface ClientOptions {\n headers?: { [id: string]: string };\n urlBuilder?: (url: URL) => string;\n protocol?: \"ws\" | \"h3\";\n}\n\nexport interface LatencyOptions {\n /** \"ws\" for WebSocket, \"h3\" for WebTransport (default: \"ws\") */\n protocol?: \"ws\" | \"h3\";\n /** Number of pings to send (default: 1). Returns the average latency when > 1. */\n pingCount?: number;\n}\n\nexport class ColyseusSDK<ServerType extends SDKTypes = any, UserData = any> {\n static VERSION = \"0.17\";\n\n /**\n * The HTTP client to make requests to the server.\n */\n public http: HTTP<ServerType['~routes']>;\n\n /**\n * The authentication module to authenticate into requests and rooms.\n */\n public auth: Auth<UserData>;\n\n /**\n * The settings used to connect to the server.\n */\n public settings: EndpointSettings;\n\n protected urlBuilder: (url: URL) => string;\n\n constructor(\n settings: string | EndpointSettings = DEFAULT_ENDPOINT,\n options?: ClientOptions,\n ) {\n if (typeof (settings) === \"string\") {\n\n //\n // endpoint by url\n //\n const url = (settings.startsWith(\"/\"))\n ? new URL(settings, DEFAULT_ENDPOINT)\n : new URL(settings);\n\n const secure = (url.protocol === \"https:\" || url.protocol === \"wss:\");\n const port = Number(url.port || (secure ? 443 : 80));\n\n this.settings = {\n hostname: url.hostname,\n pathname: url.pathname,\n port,\n secure,\n searchParams: url.searchParams.toString() || undefined,\n };\n\n } else {\n //\n // endpoint by settings\n //\n if (settings.port === undefined) {\n settings.port = (settings.secure) ? 443 : 80;\n }\n if (settings.pathname === undefined) {\n settings.pathname = \"\";\n }\n this.settings = settings;\n }\n\n // make sure pathname does not end with \"/\"\n if (this.settings.pathname.endsWith(\"/\")) {\n this.settings.pathname = this.settings.pathname.slice(0, -1);\n }\n\n // specify room connection protocol if provided\n if (options?.protocol) {\n this.settings.protocol = options.protocol;\n }\n\n this.http = new HTTP(this, {\n headers: options?.headers || {},\n });\n this.auth = new Auth(this.http);\n\n this.urlBuilder = options?.urlBuilder;\n\n //\n // Discord Embedded SDK requires a custom URL builder\n //\n if (\n !this.urlBuilder &&\n typeof (window) !== \"undefined\" &&\n window?.location?.hostname?.includes(\"discordsays.com\")\n ) {\n this.urlBuilder = discordURLBuilder;\n console.log(\"Colyseus SDK: Discord Embedded SDK detected. Using custom URL builder.\");\n }\n }\n\n /**\n * Select the endpoint with the lowest latency.\n * @param endpoints Array of endpoints to select from.\n * @param options Client options.\n * @param latencyOptions Latency measurement options (protocol, pingCount).\n * @returns The client with the lowest latency.\n */\n static async selectByLatency<ServerType extends SDKTypes = any, UserData = any>(\n endpoints: Array<string | EndpointSettings>,\n options?: ClientOptions,\n latencyOptions: LatencyOptions = {}\n ) {\n const clients = endpoints.map(endpoint => new ColyseusSDK<ServerType, UserData>(endpoint, options));\n\n const latencies = (await Promise.allSettled(clients.map((client, index) => client.getLatency(latencyOptions).then(latency => {\n const settings = clients[index].settings;\n console.log(`🛜 Endpoint Latency: ${latency}ms - ${settings.hostname}:${settings.port}${settings.pathname}`);\n return [index, latency]\n }))))\n .filter((result) => result.status === 'fulfilled')\n .map(result => result.value);\n\n if (latencies.length === 0) {\n throw new Error('All endpoints failed to respond');\n }\n\n return clients[latencies.sort((a, b) => a[1] - b[1])[0][0]];\n }\n\n // Overload: Use room name from ServerType to infer room type\n public async joinOrCreate<R extends keyof ServerType['~rooms'], State = InferState<ServerType['~rooms'][R]['~room'], never>>(\n roomName: R,\n options?: Parameters<ServerType['~rooms'][R]['~room']['onJoin']>[1],\n rootSchema?: SchemaConstructor<State>\n ): Promise<Room<ServerType['~rooms'][R]['~room'], State>>\n // Overload: Pass RoomType directly to extract state\n public async joinOrCreate<RoomType extends ServerRoomLike>(\n roomName: string,\n options?: Parameters<NonNullable<RoomType['onJoin']>>[1],\n rootSchema?: SchemaConstructor<RoomType['state']>\n ): Promise<Room<RoomType, RoomType['state']>>\n // Overload: Pass State type directly\n public async joinOrCreate<State = any>(\n roomName: string,\n options?: JoinOptions,\n rootSchema?: SchemaConstructor<State>\n ): Promise<Room<any, State>>\n // Implementation\n public async joinOrCreate<T = any>(roomName: string, options: JoinOptions = {}, rootSchema?: SchemaConstructor<T>) {\n return await this.createMatchMakeRequest<T>('joinOrCreate', roomName, options, rootSchema);\n }\n\n // Overload: Use room name from ServerType to infer room type\n public async create<R extends keyof ServerType['~rooms'], State = InferState<ServerType['~rooms'][R]['~room'], never>>(\n roomName: R,\n options?: Parameters<ServerType['~rooms'][R]['~room']['onJoin']>[1],\n rootSchema?: SchemaConstructor<State>\n ): Promise<Room<ServerType['~rooms'][R]['~room'], State>>\n // Overload: Pass RoomType directly to extract state\n public async create<RoomType extends ServerRoomLike>(\n roomName: string,\n options?: Parameters<NonNullable<RoomType['onJoin']>>[1],\n rootSchema?: SchemaConstructor<RoomType['state']>\n ): Promise<Room<RoomType, RoomType['state']>>\n // Overload: Pass State type directly\n public async create<State = any>(\n roomName: string,\n options?: JoinOptions,\n rootSchema?: SchemaConstructor<State>\n ): Promise<Room<any, State>>\n // Implementation\n public async create<T = any>(roomName: string, options: JoinOptions = {}, rootSchema?: SchemaConstructor<T>) {\n return await this.createMatchMakeRequest<T>('create', roomName, options, rootSchema);\n }\n\n // Overload: Use room name from ServerType to infer room type\n public async join<R extends keyof ServerType['~rooms'], State = InferState<ServerType['~rooms'][R]['~room'], never>>(\n roomName: R,\n options?: Parameters<ServerType['~rooms'][R]['~room']['onJoin']>[1],\n rootSchema?: SchemaConstructor<State>\n ): Promise<Room<ServerType['~rooms'][R]['~room'], State>>\n // Overload: Pass RoomType directly to extract state\n public async join<RoomType extends ServerRoomLike>(\n roomName: string,\n options?: Parameters<NonNullable<RoomType['onJoin']>>[1],\n rootSchema?: SchemaConstructor<RoomType['state']>\n ): Promise<Room<RoomType, RoomType['state']>>\n // Overload: Pass State type directly\n public async join<State = any>(\n roomName: string,\n options?: JoinOptions,\n rootSchema?: SchemaConstructor<State>\n ): Promise<Room<any, State>>\n // Implementation\n public async join<T = any>(roomName: string, options: JoinOptions = {}, rootSchema?: SchemaConstructor<T>) {\n return await this.createMatchMakeRequest<T>('join', roomName, options, rootSchema);\n }\n\n // Overload: Use room name from ServerType to infer room type\n public async joinById<R extends keyof ServerType['~rooms'], State = InferState<ServerType['~rooms'][R]['~room'], never>>(\n roomName: R,\n options?: Parameters<ServerType['~rooms'][R]['~room']['onJoin']>[1],\n rootSchema?: SchemaConstructor<State>\n ): Promise<Room<ServerType['~rooms'][R]['~room'], State>>\n // Overload: Pass RoomType directly to extract state\n public async joinById<RoomType extends ServerRoomLike>(\n roomId: string,\n options?: Parameters<NonNullable<RoomType['onJoin']>>[1],\n rootSchema?: SchemaConstructor<RoomType['state']>\n ): Promise<Room<RoomType, RoomType['state']>>\n // Overload: Pass State type directly\n public async joinById<State = any>(\n roomId: string,\n options?: JoinOptions,\n rootSchema?: SchemaConstructor<State>\n ): Promise<Room<any, State>>\n // Implementation\n public async joinById<T = any>(roomId: string, options: JoinOptions = {}, rootSchema?: SchemaConstructor<T>) {\n return await this.createMatchMakeRequest<T>('joinById', roomId, options, rootSchema);\n }\n\n /**\n * Re-establish connection with a room this client was previously connected to.\n *\n * @param reconnectionToken The `room.reconnectionToken` from previously connected room.\n * @param rootSchema (optional) Concrete root schema definition\n * @returns Promise<Room>\n */\n // Overload: Use room name from ServerType to infer room type\n public async reconnect<R extends keyof ServerType['~rooms']>(reconnectionToken: string, roomName?: R): Promise<Room<ServerType['~rooms'][R]['~room']>>\n // Overload: Pass RoomType directly to extract state\n public async reconnect<RoomType extends ServerRoomLike>(\n reconnectionToken: string,\n rootSchema?: SchemaConstructor<RoomType['state']>\n ): Promise<Room<RoomType, RoomType['state']>>\n // Overload: Pass State type directly\n public async reconnect<State = any>(\n reconnectionToken: string,\n rootSchema?: SchemaConstructor<State>\n ): Promise<Room<any, State>>\n // Implementation\n public async reconnect<T = any>(reconnectionToken: string, rootSchema?: SchemaConstructor<T>) {\n if (typeof (reconnectionToken) === \"string\" && typeof (rootSchema) === \"string\") {\n throw new Error(\"DEPRECATED: .reconnect() now only accepts 'reconnectionToken' as argument.\\nYou can get this token from previously connected `room.reconnectionToken`\");\n }\n const [roomId, token] = reconnectionToken.split(\":\");\n\t\tif (!roomId || !token) {\n\t\t\tthrow new Error(\"Invalid reconnection token format.\\nThe format should be roomId:reconnectionToken\");\n\t\t}\n return await this.createMatchMakeRequest<T>('reconnect', roomId, { reconnectionToken: token }, rootSchema);\n }\n\n public async consumeSeatReservation<T>(\n response: ISeatReservation,\n rootSchema?: SchemaConstructor<T>\n ): Promise<Room<any, T>> {\n const room = this.createRoom<T>(response.name, rootSchema);\n room.roomId = response.roomId;\n room.sessionId = response.sessionId;\n\n const options: any = { sessionId: room.sessionId };\n\n // forward \"reconnection token\" in case of reconnection.\n if (response.reconnectionToken) {\n options.reconnectionToken = response.reconnectionToken;\n }\n\n room.connect(\n this.buildEndpoint(response, options),\n response,\n this.http.options.headers\n );\n\n return new Promise((resolve, reject) => {\n const onError = (code, message) => 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 /**\n * Create a new connection with the server, and measure the latency.\n * @param options Latency measurement options (protocol, pingCount).\n */\n public getLatency(options: LatencyOptions = {}): Promise<number> {\n const protocol = options.protocol ?? \"ws\";\n const pingCount = options.pingCount ?? 1;\n\n return new Promise<number>((resolve, reject) => {\n const conn = new Connection(protocol);\n const latencies: number[] = [];\n let pingStart = 0;\n\n conn.events.onopen = () => {\n pingStart = Date.now();\n conn.send(new Uint8Array([Protocol.PING]));\n };\n\n conn.events.onmessage = (_: MessageEvent) => {\n latencies.push(Date.now() - pingStart);\n\n if (latencies.length < pingCount) {\n // Send another ping\n pingStart = Date.now();\n conn.send(new Uint8Array([Protocol.PING]));\n } else {\n // Done, calculate average and close\n conn.close();\n const average = latencies.reduce((sum, l) => sum + l, 0) / latencies.length;\n resolve(average);\n }\n };\n\n conn.events.onerror = (event: ErrorEvent) => {\n reject(new ServerError(CloseCode.ABNORMAL_CLOSURE, `Failed to get latency: ${event.message}`));\n };\n\n conn.connect(this.getHttpEndpoint());\n });\n }\n\n protected async createMatchMakeRequest<T>(\n method: string,\n roomName: string,\n options: JoinOptions = {},\n rootSchema?: SchemaConstructor<T>,\n ) {\n try {\n if (!roomName) {\n throw new Error(\"Must provide a room name\");\n }\n\n const httpResponse = await (this.http as HTTP<any>).post(`/matchmake/${method}/${roomName}`, {\n headers: {\n 'Accept': 'application/json',\n 'Content-Type': 'application/json'\n },\n body: options\n });\n\n const response = httpResponse.data as unknown as ISeatReservation;\n\n // forward reconnection token during \"reconnect\" methods.\n if (method === \"reconnect\") {\n response.reconnectionToken = options.reconnectionToken;\n }\n\n return await this.consumeSeatReservation<T>(response, rootSchema);\n } catch (error) {\n if (error instanceof ServerError) {\n throw new MatchMakeError(error.message, error.code);\n }\n throw error;\n }\n }\n\n protected createRoom<T>(roomName: string, rootSchema?: SchemaConstructor<T>) {\n return new Room<any, T>(roomName, rootSchema);\n }\n\n protected buildEndpoint(seatReservation: ISeatReservation, options: any = {}) {\n let protocol: string = this.settings.protocol || \"ws\";\n let searchParams = this.settings.searchParams || \"\";\n\n // forward authentication token\n if (this.http.authToken) {\n options['_authToken'] = this.http.authToken;\n }\n\n // append provided options\n for (const name in options) {\n if (!options.hasOwnProperty(name)) {\n continue;\n }\n searchParams += (searchParams ? '&' : '') + `${name}=${options[name]}`;\n }\n\n if (protocol === \"h3\") {\n protocol = \"http\";\n }\n\n let endpoint = (this.settings.secure)\n ? `${protocol}s://`\n : `${protocol}://`;\n\n if (seatReservation.publicAddress) {\n endpoint += `${seatReservation.publicAddress}`;\n\n } else {\n endpoint += `${this.settings.hostname}${this.getEndpointPort()}${this.settings.pathname}`;\n }\n\n const endpointURL = `${endpoint}/${seatReservation.processId}/${seatReservation.roomId}?${searchParams}`;\n return (this.urlBuilder)\n ? this.urlBuilder(new URL(endpointURL))\n : endpointURL;\n }\n\n protected getHttpEndpoint(segments: string = '') {\n const path = segments.startsWith(\"/\") ? segments : `/${segments}`;\n\n let endpointURL = `${(this.settings.secure) ? \"https\" : \"http\"}://${this.settings.hostname}${this.getEndpointPort()}${this.settings.pathname}${path}`;\n\n if (this.settings.searchParams) {\n endpointURL += `?${this.settings.searchParams}`;\n }\n\n return (this.urlBuilder)\n ? this.urlBuilder(new URL(endpointURL))\n : endpointURL;\n }\n\n protected getEndpointPort() {\n return (this.settings.port !== 80 && this.settings.port !== 443)\n ? `:${this.settings.port}`\n : \"\";\n }\n}\n\nexport const Client = ColyseusSDK;\nexport type Client<ServerType extends SDKTypes = any, UserData = any> = InstanceType<typeof ColyseusSDK<ServerType, UserData>>;"],"names":["HTTP","Auth","discordURLBuilder","__awaiter","ServerError","Connection","Protocol","CloseCode","MatchMakeError","Room"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Client.cjs","sources":["../src/Client.ts"],"sourcesContent":["import { CloseCode, Protocol, type InferState, type SDKTypes, type ServerRoomLike, type ISeatReservation } from '@colyseus/shared-types';\n\nimport { MatchMakeError, ServerError } from './errors/Errors.ts';\nimport { Room } from './Room.ts';\nimport { SchemaConstructor } from './serializer/SchemaSerializer.ts';\nimport { HTTP, type FetchFn } from './HTTP.ts';\nimport { Auth } from './Auth.ts';\nimport { Connection } from './Connection.ts';\nimport { discordURLBuilder } from './3rd_party/discord.ts';\n\nexport type JoinOptions = any;\nexport type { ISeatReservation };\n\n// - React Native does not provide `window.location`\n// - Cocos Creator (Native) does not provide `window.location.hostname`\nconst DEFAULT_ENDPOINT = (typeof (window) !== \"undefined\" && typeof (window?.location?.hostname) !== \"undefined\")\n ? `${window.location.protocol.replace(\"http\", \"ws\")}//${window.location.hostname}${(window.location.port && `:${window.location.port}`)}`\n : \"ws://127.0.0.1:2567\";\n\nexport interface EndpointSettings {\n hostname: string,\n secure: boolean,\n port?: number,\n pathname?: string,\n searchParams?: string,\n protocol?: \"ws\" | \"h3\";\n}\n\nexport interface ClientOptions {\n headers?: { [id: string]: string };\n urlBuilder?: (url: URL) => string;\n protocol?: \"ws\" | \"h3\";\n fetchFn?: FetchFn;\n}\n\nexport interface LatencyOptions {\n /** \"ws\" for WebSocket, \"h3\" for WebTransport (default: \"ws\") */\n protocol?: \"ws\" | \"h3\";\n /** Number of pings to send (default: 1). Returns the average latency when > 1. */\n pingCount?: number;\n}\n\nexport class ColyseusSDK<ServerType extends SDKTypes = any, UserData = any> {\n static VERSION = \"0.17\";\n\n /**\n * The HTTP client to make requests to the server.\n */\n public http: HTTP<ServerType['~routes']>;\n\n /**\n * The authentication module to authenticate into requests and rooms.\n */\n public auth: Auth<UserData>;\n\n /**\n * The settings used to connect to the server.\n */\n public settings: EndpointSettings;\n\n protected urlBuilder: (url: URL) => string;\n\n constructor(\n settings: string | EndpointSettings = DEFAULT_ENDPOINT,\n options?: ClientOptions,\n ) {\n if (typeof (settings) === \"string\") {\n\n //\n // endpoint by url\n //\n const url = (settings.startsWith(\"/\"))\n ? new URL(settings, DEFAULT_ENDPOINT)\n : new URL(settings);\n\n const secure = (url.protocol === \"https:\" || url.protocol === \"wss:\");\n const port = Number(url.port || (secure ? 443 : 80));\n\n this.settings = {\n hostname: url.hostname,\n pathname: url.pathname,\n port,\n secure,\n searchParams: url.searchParams.toString() || undefined,\n };\n\n } else {\n //\n // endpoint by settings\n //\n if (settings.port === undefined) {\n settings.port = (settings.secure) ? 443 : 80;\n }\n if (settings.pathname === undefined) {\n settings.pathname = \"\";\n }\n this.settings = settings;\n }\n\n // make sure pathname does not end with \"/\"\n if (this.settings.pathname.endsWith(\"/\")) {\n this.settings.pathname = this.settings.pathname.slice(0, -1);\n }\n\n // specify room connection protocol if provided\n if (options?.protocol) {\n this.settings.protocol = options.protocol;\n }\n\n this.http = new HTTP(this, {\n headers: options?.headers || {},\n }, options?.fetchFn);\n this.auth = new Auth(this.http);\n\n this.urlBuilder = options?.urlBuilder;\n\n //\n // Discord Embedded SDK requires a custom URL builder\n //\n if (\n !this.urlBuilder &&\n typeof (window) !== \"undefined\" &&\n window?.location?.hostname?.includes(\"discordsays.com\")\n ) {\n this.urlBuilder = discordURLBuilder;\n console.log(\"Colyseus SDK: Discord Embedded SDK detected. Using custom URL builder.\");\n }\n }\n\n /**\n * Select the endpoint with the lowest latency.\n * @param endpoints Array of endpoints to select from.\n * @param options Client options.\n * @param latencyOptions Latency measurement options (protocol, pingCount).\n * @returns The client with the lowest latency.\n */\n static async selectByLatency<ServerType extends SDKTypes = any, UserData = any>(\n endpoints: Array<string | EndpointSettings>,\n options?: ClientOptions,\n latencyOptions: LatencyOptions = {}\n ) {\n const clients = endpoints.map(endpoint => new ColyseusSDK<ServerType, UserData>(endpoint, options));\n\n const latencies = (await Promise.allSettled(clients.map((client, index) => client.getLatency(latencyOptions).then(latency => {\n const settings = clients[index].settings;\n console.log(`🛜 Endpoint Latency: ${latency}ms - ${settings.hostname}:${settings.port}${settings.pathname}`);\n return [index, latency]\n }))))\n .filter((result) => result.status === 'fulfilled')\n .map(result => result.value);\n\n if (latencies.length === 0) {\n throw new Error('All endpoints failed to respond');\n }\n\n return clients[latencies.sort((a, b) => a[1] - b[1])[0][0]];\n }\n\n // Overload: Use room name from ServerType to infer room type\n public async joinOrCreate<R extends keyof ServerType['~rooms'], State = InferState<ServerType['~rooms'][R]['~room'], never>>(\n roomName: R,\n options?: Parameters<ServerType['~rooms'][R]['~room']['onJoin']>[1],\n rootSchema?: SchemaConstructor<State>\n ): Promise<Room<ServerType['~rooms'][R]['~room'], State>>\n // Overload: Pass RoomType directly to extract state\n public async joinOrCreate<RoomType extends ServerRoomLike>(\n roomName: string,\n options?: Parameters<NonNullable<RoomType['onJoin']>>[1],\n rootSchema?: SchemaConstructor<RoomType['state']>\n ): Promise<Room<RoomType, RoomType['state']>>\n // Overload: Pass State type directly\n public async joinOrCreate<State = any>(\n roomName: string,\n options?: JoinOptions,\n rootSchema?: SchemaConstructor<State>\n ): Promise<Room<any, State>>\n // Implementation\n public async joinOrCreate<T = any>(roomName: string, options: JoinOptions = {}, rootSchema?: SchemaConstructor<T>) {\n return await this.createMatchMakeRequest<T>('joinOrCreate', roomName, options, rootSchema);\n }\n\n // Overload: Use room name from ServerType to infer room type\n public async create<R extends keyof ServerType['~rooms'], State = InferState<ServerType['~rooms'][R]['~room'], never>>(\n roomName: R,\n options?: Parameters<ServerType['~rooms'][R]['~room']['onJoin']>[1],\n rootSchema?: SchemaConstructor<State>\n ): Promise<Room<ServerType['~rooms'][R]['~room'], State>>\n // Overload: Pass RoomType directly to extract state\n public async create<RoomType extends ServerRoomLike>(\n roomName: string,\n options?: Parameters<NonNullable<RoomType['onJoin']>>[1],\n rootSchema?: SchemaConstructor<RoomType['state']>\n ): Promise<Room<RoomType, RoomType['state']>>\n // Overload: Pass State type directly\n public async create<State = any>(\n roomName: string,\n options?: JoinOptions,\n rootSchema?: SchemaConstructor<State>\n ): Promise<Room<any, State>>\n // Implementation\n public async create<T = any>(roomName: string, options: JoinOptions = {}, rootSchema?: SchemaConstructor<T>) {\n return await this.createMatchMakeRequest<T>('create', roomName, options, rootSchema);\n }\n\n // Overload: Use room name from ServerType to infer room type\n public async join<R extends keyof ServerType['~rooms'], State = InferState<ServerType['~rooms'][R]['~room'], never>>(\n roomName: R,\n options?: Parameters<ServerType['~rooms'][R]['~room']['onJoin']>[1],\n rootSchema?: SchemaConstructor<State>\n ): Promise<Room<ServerType['~rooms'][R]['~room'], State>>\n // Overload: Pass RoomType directly to extract state\n public async join<RoomType extends ServerRoomLike>(\n roomName: string,\n options?: Parameters<NonNullable<RoomType['onJoin']>>[1],\n rootSchema?: SchemaConstructor<RoomType['state']>\n ): Promise<Room<RoomType, RoomType['state']>>\n // Overload: Pass State type directly\n public async join<State = any>(\n roomName: string,\n options?: JoinOptions,\n rootSchema?: SchemaConstructor<State>\n ): Promise<Room<any, State>>\n // Implementation\n public async join<T = any>(roomName: string, options: JoinOptions = {}, rootSchema?: SchemaConstructor<T>) {\n return await this.createMatchMakeRequest<T>('join', roomName, options, rootSchema);\n }\n\n // Overload: Use room name from ServerType to infer room type\n public async joinById<R extends keyof ServerType['~rooms'], State = InferState<ServerType['~rooms'][R]['~room'], never>>(\n roomName: R,\n options?: Parameters<ServerType['~rooms'][R]['~room']['onJoin']>[1],\n rootSchema?: SchemaConstructor<State>\n ): Promise<Room<ServerType['~rooms'][R]['~room'], State>>\n // Overload: Pass RoomType directly to extract state\n public async joinById<RoomType extends ServerRoomLike>(\n roomId: string,\n options?: Parameters<NonNullable<RoomType['onJoin']>>[1],\n rootSchema?: SchemaConstructor<RoomType['state']>\n ): Promise<Room<RoomType, RoomType['state']>>\n // Overload: Pass State type directly\n public async joinById<State = any>(\n roomId: string,\n options?: JoinOptions,\n rootSchema?: SchemaConstructor<State>\n ): Promise<Room<any, State>>\n // Implementation\n public async joinById<T = any>(roomId: string, options: JoinOptions = {}, rootSchema?: SchemaConstructor<T>) {\n return await this.createMatchMakeRequest<T>('joinById', roomId, options, rootSchema);\n }\n\n /**\n * Re-establish connection with a room this client was previously connected to.\n *\n * @param reconnectionToken The `room.reconnectionToken` from previously connected room.\n * @param rootSchema (optional) Concrete root schema definition\n * @returns Promise<Room>\n */\n // Overload: Use room name from ServerType to infer room type\n public async reconnect<R extends keyof ServerType['~rooms']>(reconnectionToken: string, roomName?: R): Promise<Room<ServerType['~rooms'][R]['~room']>>\n // Overload: Pass RoomType directly to extract state\n public async reconnect<RoomType extends ServerRoomLike>(\n reconnectionToken: string,\n rootSchema?: SchemaConstructor<RoomType['state']>\n ): Promise<Room<RoomType, RoomType['state']>>\n // Overload: Pass State type directly\n public async reconnect<State = any>(\n reconnectionToken: string,\n rootSchema?: SchemaConstructor<State>\n ): Promise<Room<any, State>>\n // Implementation\n public async reconnect<T = any>(reconnectionToken: string, rootSchema?: SchemaConstructor<T>) {\n if (typeof (reconnectionToken) === \"string\" && typeof (rootSchema) === \"string\") {\n throw new Error(\"DEPRECATED: .reconnect() now only accepts 'reconnectionToken' as argument.\\nYou can get this token from previously connected `room.reconnectionToken`\");\n }\n const [roomId, token] = reconnectionToken.split(\":\");\n\t\tif (!roomId || !token) {\n\t\t\tthrow new Error(\"Invalid reconnection token format.\\nThe format should be roomId:reconnectionToken\");\n\t\t}\n return await this.createMatchMakeRequest<T>('reconnect', roomId, { reconnectionToken: token }, rootSchema);\n }\n\n public async consumeSeatReservation<T>(\n response: ISeatReservation,\n rootSchema?: SchemaConstructor<T>\n ): Promise<Room<any, T>> {\n const room = this.createRoom<T>(response.name, rootSchema);\n room.roomId = response.roomId;\n room.sessionId = response.sessionId;\n\n const options: any = { sessionId: room.sessionId };\n\n // forward \"reconnection token\" in case of reconnection.\n if (response.reconnectionToken) {\n options.reconnectionToken = response.reconnectionToken;\n }\n\n room.connect(\n this.buildEndpoint(response, options),\n response,\n this.http.options.headers\n );\n\n return new Promise((resolve, reject) => {\n const onError = (code, message) => 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 /**\n * Create a new connection with the server, and measure the latency.\n * @param options Latency measurement options (protocol, pingCount).\n */\n public getLatency(options: LatencyOptions = {}): Promise<number> {\n const protocol = options.protocol ?? \"ws\";\n const pingCount = options.pingCount ?? 1;\n\n return new Promise<number>((resolve, reject) => {\n const conn = new Connection(protocol);\n const latencies: number[] = [];\n let pingStart = 0;\n\n conn.events.onopen = () => {\n pingStart = Date.now();\n conn.send(new Uint8Array([Protocol.PING]));\n };\n\n conn.events.onmessage = (_: MessageEvent) => {\n latencies.push(Date.now() - pingStart);\n\n if (latencies.length < pingCount) {\n // Send another ping\n pingStart = Date.now();\n conn.send(new Uint8Array([Protocol.PING]));\n } else {\n // Done, calculate average and close\n conn.close();\n const average = latencies.reduce((sum, l) => sum + l, 0) / latencies.length;\n resolve(average);\n }\n };\n\n conn.events.onerror = (event: ErrorEvent) => {\n reject(new ServerError(CloseCode.ABNORMAL_CLOSURE, `Failed to get latency: ${event.message}`));\n };\n\n conn.connect(this.getHttpEndpoint());\n });\n }\n\n protected async createMatchMakeRequest<T>(\n method: string,\n roomName: string,\n options: JoinOptions = {},\n rootSchema?: SchemaConstructor<T>,\n ) {\n try {\n if (!roomName) {\n throw new Error(\"Must provide a room name\");\n }\n\n const httpResponse = await (this.http as HTTP<any>).post(`/matchmake/${method}/${roomName}`, {\n headers: {\n 'Accept': 'application/json',\n 'Content-Type': 'application/json'\n },\n body: options\n });\n\n const response = httpResponse.data as unknown as ISeatReservation;\n\n // forward reconnection token during \"reconnect\" methods.\n if (method === \"reconnect\") {\n response.reconnectionToken = options.reconnectionToken;\n }\n\n return await this.consumeSeatReservation<T>(response, rootSchema);\n } catch (error) {\n if (error instanceof ServerError) {\n throw new MatchMakeError(error.message, error.code);\n }\n throw error;\n }\n }\n\n protected createRoom<T>(roomName: string, rootSchema?: SchemaConstructor<T>) {\n return new Room<any, T>(roomName, rootSchema);\n }\n\n protected buildEndpoint(seatReservation: ISeatReservation, options: any = {}) {\n let protocol: string = this.settings.protocol || \"ws\";\n let searchParams = this.settings.searchParams || \"\";\n\n // forward authentication token\n if (this.http.authToken) {\n options['_authToken'] = this.http.authToken;\n }\n\n // append provided options\n for (const name in options) {\n if (!options.hasOwnProperty(name)) {\n continue;\n }\n searchParams += (searchParams ? '&' : '') + `${name}=${options[name]}`;\n }\n\n if (protocol === \"h3\") {\n protocol = \"http\";\n }\n\n let endpoint = (this.settings.secure)\n ? `${protocol}s://`\n : `${protocol}://`;\n\n if (seatReservation.publicAddress) {\n endpoint += `${seatReservation.publicAddress}`;\n\n } else {\n endpoint += `${this.settings.hostname}${this.getEndpointPort()}${this.settings.pathname}`;\n }\n\n const endpointURL = `${endpoint}/${seatReservation.processId}/${seatReservation.roomId}?${searchParams}`;\n return (this.urlBuilder)\n ? this.urlBuilder(new URL(endpointURL))\n : endpointURL;\n }\n\n protected getHttpEndpoint(segments: string = '') {\n const path = segments.startsWith(\"/\") ? segments : `/${segments}`;\n\n let endpointURL = `${(this.settings.secure) ? \"https\" : \"http\"}://${this.settings.hostname}${this.getEndpointPort()}${this.settings.pathname}${path}`;\n\n if (this.settings.searchParams) {\n endpointURL += `?${this.settings.searchParams}`;\n }\n\n return (this.urlBuilder)\n ? this.urlBuilder(new URL(endpointURL))\n : endpointURL;\n }\n\n protected getEndpointPort() {\n return (this.settings.port !== 80 && this.settings.port !== 443)\n ? `:${this.settings.port}`\n : \"\";\n }\n}\n\nexport const Client = ColyseusSDK;\nexport type Client<ServerType extends SDKTypes = any, UserData = any> = InstanceType<typeof ColyseusSDK<ServerType, UserData>>;"],"names":["HTTP","Auth","discordURLBuilder","__awaiter","ServerError","Connection","Protocol","CloseCode","MatchMakeError","Room"],"mappings":"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"}
|
package/build/Client.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { type InferState, type SDKTypes, type ServerRoomLike, type ISeatReservation } from '@colyseus/shared-types';
|
|
2
2
|
import { Room } from './Room.ts';
|
|
3
3
|
import { SchemaConstructor } from './serializer/SchemaSerializer.ts';
|
|
4
|
-
import { HTTP } from './HTTP.ts';
|
|
4
|
+
import { HTTP, type FetchFn } from './HTTP.ts';
|
|
5
5
|
import { Auth } from './Auth.ts';
|
|
6
6
|
export type JoinOptions = any;
|
|
7
7
|
export type { ISeatReservation };
|
|
@@ -19,6 +19,7 @@ export interface ClientOptions {
|
|
|
19
19
|
};
|
|
20
20
|
urlBuilder?: (url: URL) => string;
|
|
21
21
|
protocol?: "ws" | "h3";
|
|
22
|
+
fetchFn?: FetchFn;
|
|
22
23
|
}
|
|
23
24
|
export interface LatencyOptions {
|
|
24
25
|
/** "ws" for WebSocket, "h3" for WebTransport (default: "ws") */
|
package/build/Client.mjs
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
// This software is released under the MIT License.
|
|
4
4
|
// https://opensource.org/license/MIT
|
|
5
5
|
//
|
|
6
|
-
// colyseus.js@0.17.
|
|
6
|
+
// colyseus.js@0.17.40
|
|
7
7
|
import { Protocol, CloseCode } from '@colyseus/shared-types';
|
|
8
8
|
import { ServerError, MatchMakeError } from './errors/Errors.mjs';
|
|
9
9
|
import { Room } from './Room.mjs';
|
|
@@ -72,7 +72,7 @@ class ColyseusSDK {
|
|
|
72
72
|
}
|
|
73
73
|
this.http = new HTTP(this, {
|
|
74
74
|
headers: options?.headers || {},
|
|
75
|
-
});
|
|
75
|
+
}, options?.fetchFn);
|
|
76
76
|
this.auth = new Auth(this.http);
|
|
77
77
|
this.urlBuilder = options?.urlBuilder;
|
|
78
78
|
//
|
package/build/Client.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Client.mjs","sources":["../src/Client.ts"],"sourcesContent":["import { CloseCode, Protocol, type InferState, type SDKTypes, type ServerRoomLike, type ISeatReservation } from '@colyseus/shared-types';\n\nimport { MatchMakeError, ServerError } from './errors/Errors.ts';\nimport { Room } from './Room.ts';\nimport { SchemaConstructor } from './serializer/SchemaSerializer.ts';\nimport { HTTP } from './HTTP.ts';\nimport { Auth } from './Auth.ts';\nimport { Connection } from './Connection.ts';\nimport { discordURLBuilder } from './3rd_party/discord.ts';\n\nexport type JoinOptions = any;\nexport type { ISeatReservation };\n\n// - React Native does not provide `window.location`\n// - Cocos Creator (Native) does not provide `window.location.hostname`\nconst DEFAULT_ENDPOINT = (typeof (window) !== \"undefined\" && typeof (window?.location?.hostname) !== \"undefined\")\n ? `${window.location.protocol.replace(\"http\", \"ws\")}//${window.location.hostname}${(window.location.port && `:${window.location.port}`)}`\n : \"ws://127.0.0.1:2567\";\n\nexport interface EndpointSettings {\n hostname: string,\n secure: boolean,\n port?: number,\n pathname?: string,\n searchParams?: string,\n protocol?: \"ws\" | \"h3\";\n}\n\nexport interface ClientOptions {\n headers?: { [id: string]: string };\n urlBuilder?: (url: URL) => string;\n protocol?: \"ws\" | \"h3\";\n}\n\nexport interface LatencyOptions {\n /** \"ws\" for WebSocket, \"h3\" for WebTransport (default: \"ws\") */\n protocol?: \"ws\" | \"h3\";\n /** Number of pings to send (default: 1). Returns the average latency when > 1. */\n pingCount?: number;\n}\n\nexport class ColyseusSDK<ServerType extends SDKTypes = any, UserData = any> {\n static VERSION = \"0.17\";\n\n /**\n * The HTTP client to make requests to the server.\n */\n public http: HTTP<ServerType['~routes']>;\n\n /**\n * The authentication module to authenticate into requests and rooms.\n */\n public auth: Auth<UserData>;\n\n /**\n * The settings used to connect to the server.\n */\n public settings: EndpointSettings;\n\n protected urlBuilder: (url: URL) => string;\n\n constructor(\n settings: string | EndpointSettings = DEFAULT_ENDPOINT,\n options?: ClientOptions,\n ) {\n if (typeof (settings) === \"string\") {\n\n //\n // endpoint by url\n //\n const url = (settings.startsWith(\"/\"))\n ? new URL(settings, DEFAULT_ENDPOINT)\n : new URL(settings);\n\n const secure = (url.protocol === \"https:\" || url.protocol === \"wss:\");\n const port = Number(url.port || (secure ? 443 : 80));\n\n this.settings = {\n hostname: url.hostname,\n pathname: url.pathname,\n port,\n secure,\n searchParams: url.searchParams.toString() || undefined,\n };\n\n } else {\n //\n // endpoint by settings\n //\n if (settings.port === undefined) {\n settings.port = (settings.secure) ? 443 : 80;\n }\n if (settings.pathname === undefined) {\n settings.pathname = \"\";\n }\n this.settings = settings;\n }\n\n // make sure pathname does not end with \"/\"\n if (this.settings.pathname.endsWith(\"/\")) {\n this.settings.pathname = this.settings.pathname.slice(0, -1);\n }\n\n // specify room connection protocol if provided\n if (options?.protocol) {\n this.settings.protocol = options.protocol;\n }\n\n this.http = new HTTP(this, {\n headers: options?.headers || {},\n });\n this.auth = new Auth(this.http);\n\n this.urlBuilder = options?.urlBuilder;\n\n //\n // Discord Embedded SDK requires a custom URL builder\n //\n if (\n !this.urlBuilder &&\n typeof (window) !== \"undefined\" &&\n window?.location?.hostname?.includes(\"discordsays.com\")\n ) {\n this.urlBuilder = discordURLBuilder;\n console.log(\"Colyseus SDK: Discord Embedded SDK detected. Using custom URL builder.\");\n }\n }\n\n /**\n * Select the endpoint with the lowest latency.\n * @param endpoints Array of endpoints to select from.\n * @param options Client options.\n * @param latencyOptions Latency measurement options (protocol, pingCount).\n * @returns The client with the lowest latency.\n */\n static async selectByLatency<ServerType extends SDKTypes = any, UserData = any>(\n endpoints: Array<string | EndpointSettings>,\n options?: ClientOptions,\n latencyOptions: LatencyOptions = {}\n ) {\n const clients = endpoints.map(endpoint => new ColyseusSDK<ServerType, UserData>(endpoint, options));\n\n const latencies = (await Promise.allSettled(clients.map((client, index) => client.getLatency(latencyOptions).then(latency => {\n const settings = clients[index].settings;\n console.log(`🛜 Endpoint Latency: ${latency}ms - ${settings.hostname}:${settings.port}${settings.pathname}`);\n return [index, latency]\n }))))\n .filter((result) => result.status === 'fulfilled')\n .map(result => result.value);\n\n if (latencies.length === 0) {\n throw new Error('All endpoints failed to respond');\n }\n\n return clients[latencies.sort((a, b) => a[1] - b[1])[0][0]];\n }\n\n // Overload: Use room name from ServerType to infer room type\n public async joinOrCreate<R extends keyof ServerType['~rooms'], State = InferState<ServerType['~rooms'][R]['~room'], never>>(\n roomName: R,\n options?: Parameters<ServerType['~rooms'][R]['~room']['onJoin']>[1],\n rootSchema?: SchemaConstructor<State>\n ): Promise<Room<ServerType['~rooms'][R]['~room'], State>>\n // Overload: Pass RoomType directly to extract state\n public async joinOrCreate<RoomType extends ServerRoomLike>(\n roomName: string,\n options?: Parameters<NonNullable<RoomType['onJoin']>>[1],\n rootSchema?: SchemaConstructor<RoomType['state']>\n ): Promise<Room<RoomType, RoomType['state']>>\n // Overload: Pass State type directly\n public async joinOrCreate<State = any>(\n roomName: string,\n options?: JoinOptions,\n rootSchema?: SchemaConstructor<State>\n ): Promise<Room<any, State>>\n // Implementation\n public async joinOrCreate<T = any>(roomName: string, options: JoinOptions = {}, rootSchema?: SchemaConstructor<T>) {\n return await this.createMatchMakeRequest<T>('joinOrCreate', roomName, options, rootSchema);\n }\n\n // Overload: Use room name from ServerType to infer room type\n public async create<R extends keyof ServerType['~rooms'], State = InferState<ServerType['~rooms'][R]['~room'], never>>(\n roomName: R,\n options?: Parameters<ServerType['~rooms'][R]['~room']['onJoin']>[1],\n rootSchema?: SchemaConstructor<State>\n ): Promise<Room<ServerType['~rooms'][R]['~room'], State>>\n // Overload: Pass RoomType directly to extract state\n public async create<RoomType extends ServerRoomLike>(\n roomName: string,\n options?: Parameters<NonNullable<RoomType['onJoin']>>[1],\n rootSchema?: SchemaConstructor<RoomType['state']>\n ): Promise<Room<RoomType, RoomType['state']>>\n // Overload: Pass State type directly\n public async create<State = any>(\n roomName: string,\n options?: JoinOptions,\n rootSchema?: SchemaConstructor<State>\n ): Promise<Room<any, State>>\n // Implementation\n public async create<T = any>(roomName: string, options: JoinOptions = {}, rootSchema?: SchemaConstructor<T>) {\n return await this.createMatchMakeRequest<T>('create', roomName, options, rootSchema);\n }\n\n // Overload: Use room name from ServerType to infer room type\n public async join<R extends keyof ServerType['~rooms'], State = InferState<ServerType['~rooms'][R]['~room'], never>>(\n roomName: R,\n options?: Parameters<ServerType['~rooms'][R]['~room']['onJoin']>[1],\n rootSchema?: SchemaConstructor<State>\n ): Promise<Room<ServerType['~rooms'][R]['~room'], State>>\n // Overload: Pass RoomType directly to extract state\n public async join<RoomType extends ServerRoomLike>(\n roomName: string,\n options?: Parameters<NonNullable<RoomType['onJoin']>>[1],\n rootSchema?: SchemaConstructor<RoomType['state']>\n ): Promise<Room<RoomType, RoomType['state']>>\n // Overload: Pass State type directly\n public async join<State = any>(\n roomName: string,\n options?: JoinOptions,\n rootSchema?: SchemaConstructor<State>\n ): Promise<Room<any, State>>\n // Implementation\n public async join<T = any>(roomName: string, options: JoinOptions = {}, rootSchema?: SchemaConstructor<T>) {\n return await this.createMatchMakeRequest<T>('join', roomName, options, rootSchema);\n }\n\n // Overload: Use room name from ServerType to infer room type\n public async joinById<R extends keyof ServerType['~rooms'], State = InferState<ServerType['~rooms'][R]['~room'], never>>(\n roomName: R,\n options?: Parameters<ServerType['~rooms'][R]['~room']['onJoin']>[1],\n rootSchema?: SchemaConstructor<State>\n ): Promise<Room<ServerType['~rooms'][R]['~room'], State>>\n // Overload: Pass RoomType directly to extract state\n public async joinById<RoomType extends ServerRoomLike>(\n roomId: string,\n options?: Parameters<NonNullable<RoomType['onJoin']>>[1],\n rootSchema?: SchemaConstructor<RoomType['state']>\n ): Promise<Room<RoomType, RoomType['state']>>\n // Overload: Pass State type directly\n public async joinById<State = any>(\n roomId: string,\n options?: JoinOptions,\n rootSchema?: SchemaConstructor<State>\n ): Promise<Room<any, State>>\n // Implementation\n public async joinById<T = any>(roomId: string, options: JoinOptions = {}, rootSchema?: SchemaConstructor<T>) {\n return await this.createMatchMakeRequest<T>('joinById', roomId, options, rootSchema);\n }\n\n /**\n * Re-establish connection with a room this client was previously connected to.\n *\n * @param reconnectionToken The `room.reconnectionToken` from previously connected room.\n * @param rootSchema (optional) Concrete root schema definition\n * @returns Promise<Room>\n */\n // Overload: Use room name from ServerType to infer room type\n public async reconnect<R extends keyof ServerType['~rooms']>(reconnectionToken: string, roomName?: R): Promise<Room<ServerType['~rooms'][R]['~room']>>\n // Overload: Pass RoomType directly to extract state\n public async reconnect<RoomType extends ServerRoomLike>(\n reconnectionToken: string,\n rootSchema?: SchemaConstructor<RoomType['state']>\n ): Promise<Room<RoomType, RoomType['state']>>\n // Overload: Pass State type directly\n public async reconnect<State = any>(\n reconnectionToken: string,\n rootSchema?: SchemaConstructor<State>\n ): Promise<Room<any, State>>\n // Implementation\n public async reconnect<T = any>(reconnectionToken: string, rootSchema?: SchemaConstructor<T>) {\n if (typeof (reconnectionToken) === \"string\" && typeof (rootSchema) === \"string\") {\n throw new Error(\"DEPRECATED: .reconnect() now only accepts 'reconnectionToken' as argument.\\nYou can get this token from previously connected `room.reconnectionToken`\");\n }\n const [roomId, token] = reconnectionToken.split(\":\");\n\t\tif (!roomId || !token) {\n\t\t\tthrow new Error(\"Invalid reconnection token format.\\nThe format should be roomId:reconnectionToken\");\n\t\t}\n return await this.createMatchMakeRequest<T>('reconnect', roomId, { reconnectionToken: token }, rootSchema);\n }\n\n public async consumeSeatReservation<T>(\n response: ISeatReservation,\n rootSchema?: SchemaConstructor<T>\n ): Promise<Room<any, T>> {\n const room = this.createRoom<T>(response.name, rootSchema);\n room.roomId = response.roomId;\n room.sessionId = response.sessionId;\n\n const options: any = { sessionId: room.sessionId };\n\n // forward \"reconnection token\" in case of reconnection.\n if (response.reconnectionToken) {\n options.reconnectionToken = response.reconnectionToken;\n }\n\n room.connect(\n this.buildEndpoint(response, options),\n response,\n this.http.options.headers\n );\n\n return new Promise((resolve, reject) => {\n const onError = (code, message) => 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 /**\n * Create a new connection with the server, and measure the latency.\n * @param options Latency measurement options (protocol, pingCount).\n */\n public getLatency(options: LatencyOptions = {}): Promise<number> {\n const protocol = options.protocol ?? \"ws\";\n const pingCount = options.pingCount ?? 1;\n\n return new Promise<number>((resolve, reject) => {\n const conn = new Connection(protocol);\n const latencies: number[] = [];\n let pingStart = 0;\n\n conn.events.onopen = () => {\n pingStart = Date.now();\n conn.send(new Uint8Array([Protocol.PING]));\n };\n\n conn.events.onmessage = (_: MessageEvent) => {\n latencies.push(Date.now() - pingStart);\n\n if (latencies.length < pingCount) {\n // Send another ping\n pingStart = Date.now();\n conn.send(new Uint8Array([Protocol.PING]));\n } else {\n // Done, calculate average and close\n conn.close();\n const average = latencies.reduce((sum, l) => sum + l, 0) / latencies.length;\n resolve(average);\n }\n };\n\n conn.events.onerror = (event: ErrorEvent) => {\n reject(new ServerError(CloseCode.ABNORMAL_CLOSURE, `Failed to get latency: ${event.message}`));\n };\n\n conn.connect(this.getHttpEndpoint());\n });\n }\n\n protected async createMatchMakeRequest<T>(\n method: string,\n roomName: string,\n options: JoinOptions = {},\n rootSchema?: SchemaConstructor<T>,\n ) {\n try {\n if (!roomName) {\n throw new Error(\"Must provide a room name\");\n }\n\n const httpResponse = await (this.http as HTTP<any>).post(`/matchmake/${method}/${roomName}`, {\n headers: {\n 'Accept': 'application/json',\n 'Content-Type': 'application/json'\n },\n body: options\n });\n\n const response = httpResponse.data as unknown as ISeatReservation;\n\n // forward reconnection token during \"reconnect\" methods.\n if (method === \"reconnect\") {\n response.reconnectionToken = options.reconnectionToken;\n }\n\n return await this.consumeSeatReservation<T>(response, rootSchema);\n } catch (error) {\n if (error instanceof ServerError) {\n throw new MatchMakeError(error.message, error.code);\n }\n throw error;\n }\n }\n\n protected createRoom<T>(roomName: string, rootSchema?: SchemaConstructor<T>) {\n return new Room<any, T>(roomName, rootSchema);\n }\n\n protected buildEndpoint(seatReservation: ISeatReservation, options: any = {}) {\n let protocol: string = this.settings.protocol || \"ws\";\n let searchParams = this.settings.searchParams || \"\";\n\n // forward authentication token\n if (this.http.authToken) {\n options['_authToken'] = this.http.authToken;\n }\n\n // append provided options\n for (const name in options) {\n if (!options.hasOwnProperty(name)) {\n continue;\n }\n searchParams += (searchParams ? '&' : '') + `${name}=${options[name]}`;\n }\n\n if (protocol === \"h3\") {\n protocol = \"http\";\n }\n\n let endpoint = (this.settings.secure)\n ? `${protocol}s://`\n : `${protocol}://`;\n\n if (seatReservation.publicAddress) {\n endpoint += `${seatReservation.publicAddress}`;\n\n } else {\n endpoint += `${this.settings.hostname}${this.getEndpointPort()}${this.settings.pathname}`;\n }\n\n const endpointURL = `${endpoint}/${seatReservation.processId}/${seatReservation.roomId}?${searchParams}`;\n return (this.urlBuilder)\n ? this.urlBuilder(new URL(endpointURL))\n : endpointURL;\n }\n\n protected getHttpEndpoint(segments: string = '') {\n const path = segments.startsWith(\"/\") ? segments : `/${segments}`;\n\n let endpointURL = `${(this.settings.secure) ? \"https\" : \"http\"}://${this.settings.hostname}${this.getEndpointPort()}${this.settings.pathname}${path}`;\n\n if (this.settings.searchParams) {\n endpointURL += `?${this.settings.searchParams}`;\n }\n\n return (this.urlBuilder)\n ? this.urlBuilder(new URL(endpointURL))\n : endpointURL;\n }\n\n protected getEndpointPort() {\n return (this.settings.port !== 80 && this.settings.port !== 443)\n ? `:${this.settings.port}`\n : \"\";\n }\n}\n\nexport const Client = ColyseusSDK;\nexport type Client<ServerType extends SDKTypes = any, UserData = any> = InstanceType<typeof ColyseusSDK<ServerType, UserData>>;"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Client.mjs","sources":["../src/Client.ts"],"sourcesContent":["import { CloseCode, Protocol, type InferState, type SDKTypes, type ServerRoomLike, type ISeatReservation } from '@colyseus/shared-types';\n\nimport { MatchMakeError, ServerError } from './errors/Errors.ts';\nimport { Room } from './Room.ts';\nimport { SchemaConstructor } from './serializer/SchemaSerializer.ts';\nimport { HTTP, type FetchFn } from './HTTP.ts';\nimport { Auth } from './Auth.ts';\nimport { Connection } from './Connection.ts';\nimport { discordURLBuilder } from './3rd_party/discord.ts';\n\nexport type JoinOptions = any;\nexport type { ISeatReservation };\n\n// - React Native does not provide `window.location`\n// - Cocos Creator (Native) does not provide `window.location.hostname`\nconst DEFAULT_ENDPOINT = (typeof (window) !== \"undefined\" && typeof (window?.location?.hostname) !== \"undefined\")\n ? `${window.location.protocol.replace(\"http\", \"ws\")}//${window.location.hostname}${(window.location.port && `:${window.location.port}`)}`\n : \"ws://127.0.0.1:2567\";\n\nexport interface EndpointSettings {\n hostname: string,\n secure: boolean,\n port?: number,\n pathname?: string,\n searchParams?: string,\n protocol?: \"ws\" | \"h3\";\n}\n\nexport interface ClientOptions {\n headers?: { [id: string]: string };\n urlBuilder?: (url: URL) => string;\n protocol?: \"ws\" | \"h3\";\n fetchFn?: FetchFn;\n}\n\nexport interface LatencyOptions {\n /** \"ws\" for WebSocket, \"h3\" for WebTransport (default: \"ws\") */\n protocol?: \"ws\" | \"h3\";\n /** Number of pings to send (default: 1). Returns the average latency when > 1. */\n pingCount?: number;\n}\n\nexport class ColyseusSDK<ServerType extends SDKTypes = any, UserData = any> {\n static VERSION = \"0.17\";\n\n /**\n * The HTTP client to make requests to the server.\n */\n public http: HTTP<ServerType['~routes']>;\n\n /**\n * The authentication module to authenticate into requests and rooms.\n */\n public auth: Auth<UserData>;\n\n /**\n * The settings used to connect to the server.\n */\n public settings: EndpointSettings;\n\n protected urlBuilder: (url: URL) => string;\n\n constructor(\n settings: string | EndpointSettings = DEFAULT_ENDPOINT,\n options?: ClientOptions,\n ) {\n if (typeof (settings) === \"string\") {\n\n //\n // endpoint by url\n //\n const url = (settings.startsWith(\"/\"))\n ? new URL(settings, DEFAULT_ENDPOINT)\n : new URL(settings);\n\n const secure = (url.protocol === \"https:\" || url.protocol === \"wss:\");\n const port = Number(url.port || (secure ? 443 : 80));\n\n this.settings = {\n hostname: url.hostname,\n pathname: url.pathname,\n port,\n secure,\n searchParams: url.searchParams.toString() || undefined,\n };\n\n } else {\n //\n // endpoint by settings\n //\n if (settings.port === undefined) {\n settings.port = (settings.secure) ? 443 : 80;\n }\n if (settings.pathname === undefined) {\n settings.pathname = \"\";\n }\n this.settings = settings;\n }\n\n // make sure pathname does not end with \"/\"\n if (this.settings.pathname.endsWith(\"/\")) {\n this.settings.pathname = this.settings.pathname.slice(0, -1);\n }\n\n // specify room connection protocol if provided\n if (options?.protocol) {\n this.settings.protocol = options.protocol;\n }\n\n this.http = new HTTP(this, {\n headers: options?.headers || {},\n }, options?.fetchFn);\n this.auth = new Auth(this.http);\n\n this.urlBuilder = options?.urlBuilder;\n\n //\n // Discord Embedded SDK requires a custom URL builder\n //\n if (\n !this.urlBuilder &&\n typeof (window) !== \"undefined\" &&\n window?.location?.hostname?.includes(\"discordsays.com\")\n ) {\n this.urlBuilder = discordURLBuilder;\n console.log(\"Colyseus SDK: Discord Embedded SDK detected. Using custom URL builder.\");\n }\n }\n\n /**\n * Select the endpoint with the lowest latency.\n * @param endpoints Array of endpoints to select from.\n * @param options Client options.\n * @param latencyOptions Latency measurement options (protocol, pingCount).\n * @returns The client with the lowest latency.\n */\n static async selectByLatency<ServerType extends SDKTypes = any, UserData = any>(\n endpoints: Array<string | EndpointSettings>,\n options?: ClientOptions,\n latencyOptions: LatencyOptions = {}\n ) {\n const clients = endpoints.map(endpoint => new ColyseusSDK<ServerType, UserData>(endpoint, options));\n\n const latencies = (await Promise.allSettled(clients.map((client, index) => client.getLatency(latencyOptions).then(latency => {\n const settings = clients[index].settings;\n console.log(`🛜 Endpoint Latency: ${latency}ms - ${settings.hostname}:${settings.port}${settings.pathname}`);\n return [index, latency]\n }))))\n .filter((result) => result.status === 'fulfilled')\n .map(result => result.value);\n\n if (latencies.length === 0) {\n throw new Error('All endpoints failed to respond');\n }\n\n return clients[latencies.sort((a, b) => a[1] - b[1])[0][0]];\n }\n\n // Overload: Use room name from ServerType to infer room type\n public async joinOrCreate<R extends keyof ServerType['~rooms'], State = InferState<ServerType['~rooms'][R]['~room'], never>>(\n roomName: R,\n options?: Parameters<ServerType['~rooms'][R]['~room']['onJoin']>[1],\n rootSchema?: SchemaConstructor<State>\n ): Promise<Room<ServerType['~rooms'][R]['~room'], State>>\n // Overload: Pass RoomType directly to extract state\n public async joinOrCreate<RoomType extends ServerRoomLike>(\n roomName: string,\n options?: Parameters<NonNullable<RoomType['onJoin']>>[1],\n rootSchema?: SchemaConstructor<RoomType['state']>\n ): Promise<Room<RoomType, RoomType['state']>>\n // Overload: Pass State type directly\n public async joinOrCreate<State = any>(\n roomName: string,\n options?: JoinOptions,\n rootSchema?: SchemaConstructor<State>\n ): Promise<Room<any, State>>\n // Implementation\n public async joinOrCreate<T = any>(roomName: string, options: JoinOptions = {}, rootSchema?: SchemaConstructor<T>) {\n return await this.createMatchMakeRequest<T>('joinOrCreate', roomName, options, rootSchema);\n }\n\n // Overload: Use room name from ServerType to infer room type\n public async create<R extends keyof ServerType['~rooms'], State = InferState<ServerType['~rooms'][R]['~room'], never>>(\n roomName: R,\n options?: Parameters<ServerType['~rooms'][R]['~room']['onJoin']>[1],\n rootSchema?: SchemaConstructor<State>\n ): Promise<Room<ServerType['~rooms'][R]['~room'], State>>\n // Overload: Pass RoomType directly to extract state\n public async create<RoomType extends ServerRoomLike>(\n roomName: string,\n options?: Parameters<NonNullable<RoomType['onJoin']>>[1],\n rootSchema?: SchemaConstructor<RoomType['state']>\n ): Promise<Room<RoomType, RoomType['state']>>\n // Overload: Pass State type directly\n public async create<State = any>(\n roomName: string,\n options?: JoinOptions,\n rootSchema?: SchemaConstructor<State>\n ): Promise<Room<any, State>>\n // Implementation\n public async create<T = any>(roomName: string, options: JoinOptions = {}, rootSchema?: SchemaConstructor<T>) {\n return await this.createMatchMakeRequest<T>('create', roomName, options, rootSchema);\n }\n\n // Overload: Use room name from ServerType to infer room type\n public async join<R extends keyof ServerType['~rooms'], State = InferState<ServerType['~rooms'][R]['~room'], never>>(\n roomName: R,\n options?: Parameters<ServerType['~rooms'][R]['~room']['onJoin']>[1],\n rootSchema?: SchemaConstructor<State>\n ): Promise<Room<ServerType['~rooms'][R]['~room'], State>>\n // Overload: Pass RoomType directly to extract state\n public async join<RoomType extends ServerRoomLike>(\n roomName: string,\n options?: Parameters<NonNullable<RoomType['onJoin']>>[1],\n rootSchema?: SchemaConstructor<RoomType['state']>\n ): Promise<Room<RoomType, RoomType['state']>>\n // Overload: Pass State type directly\n public async join<State = any>(\n roomName: string,\n options?: JoinOptions,\n rootSchema?: SchemaConstructor<State>\n ): Promise<Room<any, State>>\n // Implementation\n public async join<T = any>(roomName: string, options: JoinOptions = {}, rootSchema?: SchemaConstructor<T>) {\n return await this.createMatchMakeRequest<T>('join', roomName, options, rootSchema);\n }\n\n // Overload: Use room name from ServerType to infer room type\n public async joinById<R extends keyof ServerType['~rooms'], State = InferState<ServerType['~rooms'][R]['~room'], never>>(\n roomName: R,\n options?: Parameters<ServerType['~rooms'][R]['~room']['onJoin']>[1],\n rootSchema?: SchemaConstructor<State>\n ): Promise<Room<ServerType['~rooms'][R]['~room'], State>>\n // Overload: Pass RoomType directly to extract state\n public async joinById<RoomType extends ServerRoomLike>(\n roomId: string,\n options?: Parameters<NonNullable<RoomType['onJoin']>>[1],\n rootSchema?: SchemaConstructor<RoomType['state']>\n ): Promise<Room<RoomType, RoomType['state']>>\n // Overload: Pass State type directly\n public async joinById<State = any>(\n roomId: string,\n options?: JoinOptions,\n rootSchema?: SchemaConstructor<State>\n ): Promise<Room<any, State>>\n // Implementation\n public async joinById<T = any>(roomId: string, options: JoinOptions = {}, rootSchema?: SchemaConstructor<T>) {\n return await this.createMatchMakeRequest<T>('joinById', roomId, options, rootSchema);\n }\n\n /**\n * Re-establish connection with a room this client was previously connected to.\n *\n * @param reconnectionToken The `room.reconnectionToken` from previously connected room.\n * @param rootSchema (optional) Concrete root schema definition\n * @returns Promise<Room>\n */\n // Overload: Use room name from ServerType to infer room type\n public async reconnect<R extends keyof ServerType['~rooms']>(reconnectionToken: string, roomName?: R): Promise<Room<ServerType['~rooms'][R]['~room']>>\n // Overload: Pass RoomType directly to extract state\n public async reconnect<RoomType extends ServerRoomLike>(\n reconnectionToken: string,\n rootSchema?: SchemaConstructor<RoomType['state']>\n ): Promise<Room<RoomType, RoomType['state']>>\n // Overload: Pass State type directly\n public async reconnect<State = any>(\n reconnectionToken: string,\n rootSchema?: SchemaConstructor<State>\n ): Promise<Room<any, State>>\n // Implementation\n public async reconnect<T = any>(reconnectionToken: string, rootSchema?: SchemaConstructor<T>) {\n if (typeof (reconnectionToken) === \"string\" && typeof (rootSchema) === \"string\") {\n throw new Error(\"DEPRECATED: .reconnect() now only accepts 'reconnectionToken' as argument.\\nYou can get this token from previously connected `room.reconnectionToken`\");\n }\n const [roomId, token] = reconnectionToken.split(\":\");\n\t\tif (!roomId || !token) {\n\t\t\tthrow new Error(\"Invalid reconnection token format.\\nThe format should be roomId:reconnectionToken\");\n\t\t}\n return await this.createMatchMakeRequest<T>('reconnect', roomId, { reconnectionToken: token }, rootSchema);\n }\n\n public async consumeSeatReservation<T>(\n response: ISeatReservation,\n rootSchema?: SchemaConstructor<T>\n ): Promise<Room<any, T>> {\n const room = this.createRoom<T>(response.name, rootSchema);\n room.roomId = response.roomId;\n room.sessionId = response.sessionId;\n\n const options: any = { sessionId: room.sessionId };\n\n // forward \"reconnection token\" in case of reconnection.\n if (response.reconnectionToken) {\n options.reconnectionToken = response.reconnectionToken;\n }\n\n room.connect(\n this.buildEndpoint(response, options),\n response,\n this.http.options.headers\n );\n\n return new Promise((resolve, reject) => {\n const onError = (code, message) => 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 /**\n * Create a new connection with the server, and measure the latency.\n * @param options Latency measurement options (protocol, pingCount).\n */\n public getLatency(options: LatencyOptions = {}): Promise<number> {\n const protocol = options.protocol ?? \"ws\";\n const pingCount = options.pingCount ?? 1;\n\n return new Promise<number>((resolve, reject) => {\n const conn = new Connection(protocol);\n const latencies: number[] = [];\n let pingStart = 0;\n\n conn.events.onopen = () => {\n pingStart = Date.now();\n conn.send(new Uint8Array([Protocol.PING]));\n };\n\n conn.events.onmessage = (_: MessageEvent) => {\n latencies.push(Date.now() - pingStart);\n\n if (latencies.length < pingCount) {\n // Send another ping\n pingStart = Date.now();\n conn.send(new Uint8Array([Protocol.PING]));\n } else {\n // Done, calculate average and close\n conn.close();\n const average = latencies.reduce((sum, l) => sum + l, 0) / latencies.length;\n resolve(average);\n }\n };\n\n conn.events.onerror = (event: ErrorEvent) => {\n reject(new ServerError(CloseCode.ABNORMAL_CLOSURE, `Failed to get latency: ${event.message}`));\n };\n\n conn.connect(this.getHttpEndpoint());\n });\n }\n\n protected async createMatchMakeRequest<T>(\n method: string,\n roomName: string,\n options: JoinOptions = {},\n rootSchema?: SchemaConstructor<T>,\n ) {\n try {\n if (!roomName) {\n throw new Error(\"Must provide a room name\");\n }\n\n const httpResponse = await (this.http as HTTP<any>).post(`/matchmake/${method}/${roomName}`, {\n headers: {\n 'Accept': 'application/json',\n 'Content-Type': 'application/json'\n },\n body: options\n });\n\n const response = httpResponse.data as unknown as ISeatReservation;\n\n // forward reconnection token during \"reconnect\" methods.\n if (method === \"reconnect\") {\n response.reconnectionToken = options.reconnectionToken;\n }\n\n return await this.consumeSeatReservation<T>(response, rootSchema);\n } catch (error) {\n if (error instanceof ServerError) {\n throw new MatchMakeError(error.message, error.code);\n }\n throw error;\n }\n }\n\n protected createRoom<T>(roomName: string, rootSchema?: SchemaConstructor<T>) {\n return new Room<any, T>(roomName, rootSchema);\n }\n\n protected buildEndpoint(seatReservation: ISeatReservation, options: any = {}) {\n let protocol: string = this.settings.protocol || \"ws\";\n let searchParams = this.settings.searchParams || \"\";\n\n // forward authentication token\n if (this.http.authToken) {\n options['_authToken'] = this.http.authToken;\n }\n\n // append provided options\n for (const name in options) {\n if (!options.hasOwnProperty(name)) {\n continue;\n }\n searchParams += (searchParams ? '&' : '') + `${name}=${options[name]}`;\n }\n\n if (protocol === \"h3\") {\n protocol = \"http\";\n }\n\n let endpoint = (this.settings.secure)\n ? `${protocol}s://`\n : `${protocol}://`;\n\n if (seatReservation.publicAddress) {\n endpoint += `${seatReservation.publicAddress}`;\n\n } else {\n endpoint += `${this.settings.hostname}${this.getEndpointPort()}${this.settings.pathname}`;\n }\n\n const endpointURL = `${endpoint}/${seatReservation.processId}/${seatReservation.roomId}?${searchParams}`;\n return (this.urlBuilder)\n ? this.urlBuilder(new URL(endpointURL))\n : endpointURL;\n }\n\n protected getHttpEndpoint(segments: string = '') {\n const path = segments.startsWith(\"/\") ? segments : `/${segments}`;\n\n let endpointURL = `${(this.settings.secure) ? \"https\" : \"http\"}://${this.settings.hostname}${this.getEndpointPort()}${this.settings.pathname}${path}`;\n\n if (this.settings.searchParams) {\n endpointURL += `?${this.settings.searchParams}`;\n }\n\n return (this.urlBuilder)\n ? this.urlBuilder(new URL(endpointURL))\n : endpointURL;\n }\n\n protected getEndpointPort() {\n return (this.settings.port !== 80 && this.settings.port !== 443)\n ? `:${this.settings.port}`\n : \"\";\n }\n}\n\nexport const Client = ColyseusSDK;\nexport type Client<ServerType extends SDKTypes = any, UserData = any> = InstanceType<typeof ColyseusSDK<ServerType, UserData>>;"],"names":[],"mappings":"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"}
|
package/build/Connection.cjs
CHANGED
package/build/Connection.mjs
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
// This software is released under the MIT License.
|
|
4
4
|
// https://opensource.org/license/MIT
|
|
5
5
|
//
|
|
6
|
-
// colyseus.js@0.17.
|
|
6
|
+
// colyseus.js@0.17.40
|
|
7
7
|
import { H3TransportTransport } from './transport/H3Transport.mjs';
|
|
8
8
|
import { WebSocketTransport } from './transport/WebSocketTransport.mjs';
|
|
9
9
|
import { CloseCode } from '@colyseus/shared-types';
|
package/build/HTTP.cjs
CHANGED
|
@@ -3,11 +3,12 @@
|
|
|
3
3
|
// This software is released under the MIT License.
|
|
4
4
|
// https://opensource.org/license/MIT
|
|
5
5
|
//
|
|
6
|
-
// colyseus.js@0.17.
|
|
6
|
+
// colyseus.js@0.17.40
|
|
7
7
|
'use strict';
|
|
8
8
|
|
|
9
9
|
var tslib = require('tslib');
|
|
10
10
|
var Errors = require('./errors/Errors.cjs');
|
|
11
|
+
var fetchXHR = require('./fetchXHR.cjs');
|
|
11
12
|
|
|
12
13
|
function isJSONSerializable(value) {
|
|
13
14
|
if (value === undefined) {
|
|
@@ -85,11 +86,24 @@ function getURLWithQueryParams(url, option) {
|
|
|
85
86
|
return `${path}${queryParamString}`;
|
|
86
87
|
}
|
|
87
88
|
class HTTP {
|
|
88
|
-
constructor(sdk, baseOptions) {
|
|
89
|
+
constructor(sdk, baseOptions, fetchFn) {
|
|
89
90
|
// alias "del()" to "delete()"
|
|
90
91
|
this.del = this.delete;
|
|
91
92
|
this.sdk = sdk;
|
|
92
93
|
this.options = baseOptions;
|
|
94
|
+
this._fetchFn = fetchFn;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Lazily resolve the fetch implementation.
|
|
98
|
+
* Falls back to XMLHttpRequest when fetch is unavailable (e.g. Cocos Creator Native).
|
|
99
|
+
*/
|
|
100
|
+
get fetchFn() {
|
|
101
|
+
if (!this._fetchFn) {
|
|
102
|
+
this._fetchFn = (typeof (globalThis.fetch) !== 'undefined')
|
|
103
|
+
? globalThis.fetch.bind(globalThis)
|
|
104
|
+
: fetchXHR.xhrFetch;
|
|
105
|
+
}
|
|
106
|
+
return this._fetchFn;
|
|
93
107
|
}
|
|
94
108
|
request(method, path, options) {
|
|
95
109
|
return tslib.__awaiter(this, void 0, void 0, function* () {
|
|
@@ -150,7 +164,7 @@ class HTTP {
|
|
|
150
164
|
const url = getURLWithQueryParams(this.sdk['getHttpEndpoint'](path.toString()), mergedOptions);
|
|
151
165
|
let raw;
|
|
152
166
|
try {
|
|
153
|
-
raw = yield
|
|
167
|
+
raw = yield this.fetchFn(url, mergedOptions);
|
|
154
168
|
}
|
|
155
169
|
catch (err) {
|
|
156
170
|
// If it's an AbortError, re-throw as-is
|
package/build/HTTP.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HTTP.cjs","sources":["../src/HTTP.ts"],"sourcesContent":["import type { Router, HasRequiredKeys, Prettify, UnionToIntersection, Endpoint, HTTPMethod } from \"@colyseus/better-call\";\nimport { ColyseusSDK } from \"./Client.ts\";\nimport { ServerError } from \"./errors/Errors.ts\";\n\n/**\n * TODO: we should clean up the types repetition in this file.\n */\n\n// Helper to check if a type is 'any'\ntype IsAny<T> = 0 extends 1 & T ? true : false;\n\n// Helper to check if a type resolves to any after indexed access\n// When T is any, T[K] is also any, but IsAny<T[K]> may not detect it due to deferred evaluation\n// We check multiple characteristics of 'any':\n// 1. Direct any check: IsAny<T>\n// 2. Accepts all string keys: string extends keyof T\n// 3. Accepts all number and symbol keys: for complete 'any' detection\ntype IsAnyOrAnyIndexed<T> = IsAny<T> extends true\n ? true\n : (string extends keyof T\n ? true\n : (number extends keyof T\n ? (symbol extends keyof T ? true : false)\n : false));\n\ntype HasRequired<\n T extends {\n body?: any;\n query?: any;\n params?: any;\n },\n> = T[\"body\"] extends object\n ? HasRequiredKeys<T[\"body\"]> extends true\n ? true\n : T[\"query\"] extends object\n ? HasRequiredKeys<T[\"query\"]> extends true\n ? true\n : T[\"params\"] extends object\n ? HasRequiredKeys<T[\"params\"]>\n : false\n : T[\"params\"] extends object\n ? HasRequiredKeys<T[\"params\"]>\n : false\n : T[\"query\"] extends object\n ? HasRequiredKeys<T[\"query\"]> extends true\n ? true\n : T[\"params\"] extends object\n ? HasRequiredKeys<T[\"params\"]>\n : false\n : T[\"params\"] extends object\n ? HasRequiredKeys<T[\"params\"]>\n : false;\n\ntype InferContext<T> = T extends (ctx: infer Ctx) => any\n ? Ctx extends object\n ? Ctx\n : never\n : never;\n\n// WithRequired - makes specific keys required\n// This works by spreading T and then overriding the specified keys to be non-nullable\ntype WithRequired<T, K extends keyof any> = Prettify<T & {\n [P in K & keyof T]-?: NonNullable<T[P]>\n}>;\n\ntype WithoutServerOnly<T extends Record<string, Endpoint>> = {\n [K in keyof T]: T[K] extends Endpoint<any, infer O>\n ? O extends { metadata: { SERVER_ONLY: true } }\n ? never\n : T[K]\n : T[K];\n};\n\n// Method-specific options type\ntype MethodOptions<API, M extends HTTPMethod> = API extends { [key: string]: infer T; }\n ? T extends Endpoint<any, infer O>\n ? O[\"method\"] extends M\n ? { [key in T[\"path\"]]: T; }\n : O[\"method\"] extends M[]\n ? M extends O[\"method\"][number]\n ? { [key in T[\"path\"]]: T; }\n : {}\n : O[\"method\"] extends \"*\"\n ? { [key in T[\"path\"]]: T; }\n : {}\n : {}\n : {};\n\nexport type RequiredOptionKeys<\n C extends {\n body?: any;\n query?: any;\n params?: any;\n },\n> = (C[\"body\"] extends object\n ? HasRequiredKeys<C[\"body\"]> extends true\n ? { body: true }\n : {}\n : {}) &\n (C[\"query\"] extends object\n ? HasRequiredKeys<C[\"query\"]> extends true\n ? { query: true }\n : {}\n : {}) &\n (C[\"params\"] extends object\n ? HasRequiredKeys<C[\"params\"]> extends true\n ? { params: true }\n : {}\n : {});\n\n\ntype CommonHeaders = {\n accept: \"application/json\" | \"text/plain\" | \"application/octet-stream\";\n \"content-type\": \"application/json\" | \"text/plain\" | \"application/x-www-form-urlencoded\" | \"multipart/form-data\" | \"application/octet-stream\";\n authorization: \"Bearer\" | \"Basic\";\n};\n\ntype FetchRequestOptions<\n Body = any,\n Query extends Record<string, any> = any,\n Params extends Record<string, any> | Array<string> | undefined = any, Res = any,\n ExtraOptions extends Record<string, any> = {}\n> = Prettify<ExtraOptions & Omit<RequestInit, \"body\"> & {\n// baseURL?: string;\n\n /**\n * Headers\n */\n headers?: CommonHeaders | Headers | HeadersInit;\n\n /**\n * Body\n */\n body?: Body;\n\n /**\n * Query parameters (key-value pairs)\n */\n query?: Query;\n\n /**\n * Dynamic parameters.\n *\n * If url is defined as /path/:id, params will be { id: string }\n */\n params?: Params;\n}>\n\ntype FetchResponse<T> = {\n raw: Response;\n data: T;\n headers: Headers;\n status: number;\n statusText: string;\n};\n\nexport function isJSONSerializable(value: any) {\n\tif (value === undefined) {\n\t\treturn false;\n\t}\n\tconst t = typeof value;\n\tif (t === \"string\" || t === \"number\" || t === \"boolean\" || t === null) {\n\t\treturn true;\n\t}\n\tif (t !== \"object\") {\n\t\treturn false;\n\t}\n\tif (Array.isArray(value)) {\n\t\treturn true;\n\t}\n\tif (value.buffer) {\n\t\treturn false;\n\t}\n\treturn (\n\t\t(value.constructor && value.constructor.name === \"Object\") ||\n\t\ttypeof value.toJSON === \"function\"\n\t);\n}\n\nconst JSON_RE = /^application\\/(?:[\\w!#$%&*.^`~-]*\\+)?json(;.+)?$/i;\n\nexport type ResponseType = \"json\" | \"text\" | \"blob\";\nexport function detectResponseType(request: Response): ResponseType {\n\tconst _contentType = request.headers.get(\"content-type\");\n\tconst textTypes = new Set([\n\t\t\"image/svg\",\n\t\t\"application/xml\",\n\t\t\"application/xhtml\",\n\t\t\"application/html\",\n\t]);\n\tif (!_contentType) {\n\t\treturn \"json\";\n\t}\n\tconst contentType = _contentType.split(\";\").shift() || \"\";\n\tif (JSON_RE.test(contentType)) {\n\t\treturn \"json\";\n\t}\n\tif (textTypes.has(contentType) || contentType.startsWith(\"text/\")) {\n\t\treturn \"text\";\n\t}\n\treturn \"blob\";\n}\n\nfunction getURLWithQueryParams(url: string, option?: FetchRequestOptions) {\n\tconst { params, query } = option || {};\n\n\t// Parse the URL and extract existing query parameters\n\tconst [urlPath, urlQuery] = url.split(\"?\");\n\tlet path = urlPath;\n\n\t// Handle params substitution\n\tif (params) {\n\t\tif (Array.isArray(params)) {\n\t\t\tconst paramPaths = path.split(\"/\").filter((p) => p.startsWith(\":\"));\n\t\t\tfor (const [index, key] of paramPaths.entries()) {\n\t\t\t\tconst value = params[index];\n\t\t\t\tpath = path.replace(key, value);\n\t\t\t}\n\t\t} else {\n\t\t\tfor (const [key, value] of Object.entries(params)) {\n\t\t\t\tpath = path.replace(`:${key}`, String(value));\n\t\t\t}\n\t\t}\n\t}\n\n\t// Merge query parameters from URL and options\n\tconst queryParams = new URLSearchParams(urlQuery);\n\tif (query) {\n\t\tfor (const [key, value] of Object.entries(query)) {\n\t\t\tif (value == null) continue;\n\t\t\tqueryParams.set(key, String(value));\n\t\t}\n\t}\n\n\t// Build final URL\n\tlet queryParamString = queryParams.toString();\n\tqueryParamString = queryParamString.length > 0 ? `?${queryParamString}`.replace(/\\+/g, \"%20\") : \"\";\n\n\treturn `${path}${queryParamString}`;\n}\n\ntype InferredAPI<R> = R extends { endpoints: Record<string, Endpoint> }\n ? WithoutServerOnly<R[\"endpoints\"]>\n : WithoutServerOnly<R & Record<string, Endpoint>>;\n\n// Helper type to resolve return type, returning 'any' when R is untyped\ntype InferReturnType<R, OPT, K extends keyof OPT> =\n IsAnyOrAnyIndexed<R> extends true\n ? any\n : Awaited<ReturnType<OPT[K] extends Endpoint ? OPT[K] : never>>;\n\nexport class HTTP<R extends Router | Router[\"endpoints\"]> {\n public authToken: string | undefined;\n public options: FetchRequestOptions;\n\n private sdk: ColyseusSDK;\n\n // alias \"del()\" to \"delete()\"\n public del = this.delete;\n\n constructor(sdk: ColyseusSDK, baseOptions: FetchRequestOptions) {\n this.sdk = sdk;\n this.options = baseOptions;\n }\n\n private async request<\n M extends HTTPMethod,\n API extends InferredAPI<R> = InferredAPI<R>,\n OPT extends Prettify<UnionToIntersection<MethodOptions<API, M>>> = Prettify<UnionToIntersection<MethodOptions<API, M>>>,\n K extends keyof OPT = keyof OPT,\n C extends InferContext<OPT[K]> = InferContext<OPT[K]>\n >(\n method: M,\n path: K,\n options?: FetchRequestOptions<C[\"body\"], C[\"query\"], C[\"params\"]>\n ): Promise<\n FetchResponse<Awaited<ReturnType<OPT[K] extends Endpoint ? OPT[K] : never>>>\n > {\n return this.executeRequest(method, path, options);\n }\n\n // Overload for endpoints WITH required fields (body/query/params)\n get<\n API extends InferredAPI<R> = InferredAPI<R>,\n OPT extends Prettify<UnionToIntersection<MethodOptions<API, \"GET\">>> = Prettify<UnionToIntersection<MethodOptions<API, \"GET\">>>,\n K extends keyof OPT = keyof OPT,\n C extends InferContext<OPT[K]> = InferContext<OPT[K]>\n >(\n path: IsAnyOrAnyIndexed<R> extends true ? string : (HasRequired<C> extends true ? K : never),\n options: IsAnyOrAnyIndexed<R> extends true\n ? FetchRequestOptions<any, any, any>\n : WithRequired<FetchRequestOptions<C[\"body\"], C[\"query\"], C[\"params\"]>, keyof RequiredOptionKeys<C>>\n ): Promise<\n FetchResponse<InferReturnType<R, OPT, K>>\n >;\n\n // Overload for endpoints WITHOUT required fields (permissive when R is 'any')\n get<\n API extends InferredAPI<R> = InferredAPI<R>,\n OPT extends Prettify<UnionToIntersection<MethodOptions<API, \"GET\">>> = Prettify<UnionToIntersection<MethodOptions<API, \"GET\">>>,\n K extends keyof OPT = keyof OPT,\n C extends InferContext<OPT[K]> = InferContext<OPT[K]>\n >(\n path: IsAnyOrAnyIndexed<R> extends true ? string : (HasRequired<C> extends false ? K : never),\n options?: IsAnyOrAnyIndexed<R> extends true\n ? FetchRequestOptions<any, any, any>\n : FetchRequestOptions<C[\"body\"], C[\"query\"], C[\"params\"]>\n ): Promise<\n FetchResponse<InferReturnType<R, OPT, K>>\n >;\n\n get(path: any, options?: any): Promise<any> {\n return this.request(\"GET\", path, options);\n }\n\n // Overload for endpoints WITH required fields (body/query/params)\n post<\n API extends InferredAPI<R> = InferredAPI<R>,\n OPT extends Prettify<UnionToIntersection<MethodOptions<API, \"POST\">>> = Prettify<UnionToIntersection<MethodOptions<API, \"POST\">>>,\n K extends keyof OPT = keyof OPT,\n C extends InferContext<OPT[K]> = InferContext<OPT[K]>\n >(\n path: (IsAnyOrAnyIndexed<R> extends true ? string : never) | (IsAny<API> extends true ? string : never) | (HasRequired<C> extends true ? K : never),\n options: IsAnyOrAnyIndexed<R> extends true ? FetchRequestOptions<any, any, any> : (IsAny<API> extends true\n ? FetchRequestOptions<any, any, any>\n : WithRequired<FetchRequestOptions<C[\"body\"], C[\"query\"], C[\"params\"]>, keyof RequiredOptionKeys<C>>)\n ): Promise<\n FetchResponse<InferReturnType<R, OPT, K>>\n >;\n\n // Overload for endpoints WITHOUT required fields (permissive when R is 'any')\n post<\n API extends InferredAPI<R> = InferredAPI<R>,\n OPT extends Prettify<UnionToIntersection<MethodOptions<API, \"POST\">>> = Prettify<UnionToIntersection<MethodOptions<API, \"POST\">>>,\n K extends keyof OPT = keyof OPT,\n C extends InferContext<OPT[K]> = InferContext<OPT[K]>\n >(\n path: (IsAnyOrAnyIndexed<R> extends true ? string : never) | (IsAny<API> extends true ? string : never) | (HasRequired<C> extends false ? K : never),\n options?: IsAnyOrAnyIndexed<R> extends true ? FetchRequestOptions<any, any, any> : (IsAny<API> extends true\n ? FetchRequestOptions<any, any, any>\n : FetchRequestOptions<C[\"body\"], C[\"query\"], C[\"params\"]>)\n ): Promise<\n FetchResponse<InferReturnType<R, OPT, K>>\n >;\n\n post(path: any, options?: any): Promise<any> {\n return this.request(\"POST\", path, options);\n }\n\n // Overload for endpoints WITH required fields (body/query/params)\n delete<\n API extends InferredAPI<R> = InferredAPI<R>,\n OPT extends Prettify<UnionToIntersection<MethodOptions<API, \"DELETE\">>> = Prettify<UnionToIntersection<MethodOptions<API, \"DELETE\">>>,\n K extends keyof OPT = keyof OPT,\n C extends InferContext<OPT[K]> = InferContext<OPT[K]>\n >(\n path: IsAnyOrAnyIndexed<R> extends true ? string : (HasRequired<C> extends true ? K : never),\n options: IsAnyOrAnyIndexed<R> extends true\n ? FetchRequestOptions<any, any, any>\n : WithRequired<FetchRequestOptions<C[\"body\"], C[\"query\"], C[\"params\"]>, keyof RequiredOptionKeys<C>>\n ): Promise<\n FetchResponse<InferReturnType<R, OPT, K>>\n >;\n\n // Overload for endpoints WITHOUT required fields (permissive when R is 'any')\n delete<\n API extends InferredAPI<R> = InferredAPI<R>,\n OPT extends Prettify<UnionToIntersection<MethodOptions<API, \"DELETE\">>> = Prettify<UnionToIntersection<MethodOptions<API, \"DELETE\">>>,\n K extends keyof OPT = keyof OPT,\n C extends InferContext<OPT[K]> = InferContext<OPT[K]>\n >(\n path: IsAnyOrAnyIndexed<R> extends true ? string : (HasRequired<C> extends false ? K : never),\n options?: IsAnyOrAnyIndexed<R> extends true\n ? FetchRequestOptions<any, any, any>\n : FetchRequestOptions<C[\"body\"], C[\"query\"], C[\"params\"]>\n ): Promise<\n FetchResponse<InferReturnType<R, OPT, K>>\n >;\n\n delete(path: any, options?: any): Promise<any> {\n return this.request(\"DELETE\", path, options);\n }\n\n // Overload for endpoints WITH required fields (body/query/params)\n patch<\n API extends InferredAPI<R> = InferredAPI<R>,\n OPT extends Prettify<UnionToIntersection<MethodOptions<API, \"PATCH\">>> = Prettify<UnionToIntersection<MethodOptions<API, \"PATCH\">>>,\n K extends keyof OPT = keyof OPT,\n C extends InferContext<OPT[K]> = InferContext<OPT[K]>\n >(\n path: IsAnyOrAnyIndexed<R> extends true ? string : (HasRequired<C> extends true ? K : never),\n options: IsAnyOrAnyIndexed<R> extends true\n ? FetchRequestOptions<any, any, any>\n : WithRequired<FetchRequestOptions<C[\"body\"], C[\"query\"], C[\"params\"]>, keyof RequiredOptionKeys<C>>\n ): Promise<\n FetchResponse<InferReturnType<R, OPT, K>>\n >;\n\n // Overload for endpoints WITHOUT required fields (permissive when R is 'any')\n patch<\n API extends InferredAPI<R> = InferredAPI<R>,\n OPT extends Prettify<UnionToIntersection<MethodOptions<API, \"PATCH\">>> = Prettify<UnionToIntersection<MethodOptions<API, \"PATCH\">>>,\n K extends keyof OPT = keyof OPT,\n C extends InferContext<OPT[K]> = InferContext<OPT[K]>\n >(\n path: IsAnyOrAnyIndexed<R> extends true ? string : (HasRequired<C> extends false ? K : never),\n options?: IsAnyOrAnyIndexed<R> extends true\n ? FetchRequestOptions<any, any, any>\n : FetchRequestOptions<C[\"body\"], C[\"query\"], C[\"params\"]>\n ): Promise<\n FetchResponse<InferReturnType<R, OPT, K>>\n >;\n\n patch(path: any, options?: any): Promise<any> {\n return this.request(\"PATCH\", path, options);\n }\n\n // Overload for endpoints WITH required fields (body/query/params)\n put<\n API extends InferredAPI<R> = InferredAPI<R>,\n OPT extends Prettify<UnionToIntersection<MethodOptions<API, \"PUT\">>> = Prettify<UnionToIntersection<MethodOptions<API, \"PUT\">>>,\n K extends keyof OPT = keyof OPT,\n C extends InferContext<OPT[K]> = InferContext<OPT[K]>\n >(\n path: IsAnyOrAnyIndexed<R> extends true ? string : (HasRequired<C> extends true ? K : never),\n options: IsAnyOrAnyIndexed<R> extends true\n ? FetchRequestOptions<any, any, any>\n : WithRequired<FetchRequestOptions<C[\"body\"], C[\"query\"], C[\"params\"]>, keyof RequiredOptionKeys<C>>\n ): Promise<\n FetchResponse<InferReturnType<R, OPT, K>>\n >;\n\n // Overload for endpoints WITHOUT required fields (permissive when R is 'any')\n put<\n API extends InferredAPI<R> = InferredAPI<R>,\n OPT extends Prettify<UnionToIntersection<MethodOptions<API, \"PUT\">>> = Prettify<UnionToIntersection<MethodOptions<API, \"PUT\">>>,\n K extends keyof OPT = keyof OPT,\n C extends InferContext<OPT[K]> = InferContext<OPT[K]>\n >(\n path: IsAnyOrAnyIndexed<R> extends true ? string : (HasRequired<C> extends false ? K : never),\n options?: IsAnyOrAnyIndexed<R> extends true\n ? FetchRequestOptions<any, any, any>\n : FetchRequestOptions<C[\"body\"], C[\"query\"], C[\"params\"]>\n ): Promise<\n FetchResponse<InferReturnType<R, OPT, K>>\n >;\n\n put(path: any, options?: any): Promise<any> {\n return this.request(\"PUT\", path, options);\n }\n\n protected async executeRequest<M extends HTTPMethod>(\n method: M,\n path: any,\n requestOptions?: any\n ): Promise<any> {\n //\n // FIXME: if FormData is provided, merging \"baseOptions.body\" with\n // \"options.body\" will not work as intended\n //\n let body = (this.options.body)\n ? { ...this.options.body, ...(requestOptions?.body as object || {}) }\n : requestOptions?.body;\n\n const query = (this.options.query)\n ? { ...this.options.query, ...(requestOptions?.query as object || {}) }\n : requestOptions?.query;\n\n const params = (this.options.params)\n ? { ...this.options.params, ...(requestOptions?.params as object || {}) }\n : requestOptions?.params;\n\n const headers = new Headers(\n (this.options.headers)\n ? { ...this.options.headers, ...(requestOptions?.headers || {}) }\n : requestOptions?.headers\n );\n\n // Add Authorization header if authToken is set\n if (this.authToken && !headers.has(\"authorization\")) {\n headers.set(\"authorization\", `Bearer ${this.authToken}`);\n }\n\n // Stringify JSON-serializable objects for fetch() body\n if (isJSONSerializable(body) && typeof body === 'object' && body !== null) {\n if (!headers.has(\"content-type\")) {\n headers.set(\"content-type\", \"application/json\");\n }\n for (const [key, value] of Object.entries(body)) {\n if (value instanceof Date) {\n body[key] = value.toISOString();\n }\n }\n body = JSON.stringify(body);\n }\n\n const mergedOptions = {\n credentials: requestOptions?.credentials || \"include\",\n ...this.options,\n ...requestOptions,\n query,\n params,\n headers,\n body,\n method,\n };\n\n const url = getURLWithQueryParams(this.sdk['getHttpEndpoint'](path.toString()), mergedOptions);\n\n let raw: Response;\n try {\n raw = await fetch(url, mergedOptions);\n } catch (err: any) {\n // If it's an AbortError, re-throw as-is\n if (err.name === 'AbortError') {\n throw err;\n }\n // Re-throw with network error code at top level (e.g. ECONNREFUSED)\n const networkError: ServerError = new ServerError(err.cause?.code || err.code, err.message);\n networkError.response = raw;\n networkError.cause = err.cause;\n throw networkError;\n }\n const contentType = raw.headers.get(\"content-type\");\n\n let data: any;\n\n if (contentType?.includes(\"json\")) {\n data = await raw.json();\n\n } else if (contentType?.includes(\"text\")) {\n data = await raw.text();\n\n } else {\n data = await raw.blob();\n }\n\n if (!raw.ok) {\n throw new ServerError(raw.status, data.message ?? data.error ?? raw.statusText, {\n headers: raw.headers,\n status: raw.status,\n response: raw,\n data\n });\n }\n\n return {\n raw,\n data,\n headers: raw.headers,\n status: raw.status,\n statusText: raw.statusText,\n };\n }\n}\n"],"names":["ServerError"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"HTTP.cjs","sources":["../src/HTTP.ts"],"sourcesContent":["import type { Router, HasRequiredKeys, Prettify, UnionToIntersection, Endpoint, HTTPMethod } from \"@colyseus/better-call\";\nimport { ColyseusSDK } from \"./Client.ts\";\nimport { ServerError } from \"./errors/Errors.ts\";\nimport { xhrFetch } from \"./fetchXHR.ts\";\n\n/**\n * TODO: we should clean up the types repetition in this file.\n */\n\n// Helper to check if a type is 'any'\ntype IsAny<T> = 0 extends 1 & T ? true : false;\n\n// Helper to check if a type resolves to any after indexed access\n// When T is any, T[K] is also any, but IsAny<T[K]> may not detect it due to deferred evaluation\n// We check multiple characteristics of 'any':\n// 1. Direct any check: IsAny<T>\n// 2. Accepts all string keys: string extends keyof T\n// 3. Accepts all number and symbol keys: for complete 'any' detection\ntype IsAnyOrAnyIndexed<T> = IsAny<T> extends true\n ? true\n : (string extends keyof T\n ? true\n : (number extends keyof T\n ? (symbol extends keyof T ? true : false)\n : false));\n\ntype HasRequired<\n T extends {\n body?: any;\n query?: any;\n params?: any;\n },\n> = keyof RequiredOptionKeys<T> extends never ? false : true;\n\ntype InferContext<T> = T extends (ctx: infer Ctx) => any\n ? Ctx extends object\n ? Ctx\n : never\n : never;\n\n// WithRequired - makes specific keys required\n// This works by spreading T and then overriding the specified keys to be non-nullable\ntype WithRequired<T, K extends keyof any> = Prettify<T & {\n [P in K & keyof T]-?: NonNullable<T[P]>\n}>;\n\ntype WithoutServerOnly<T extends Record<string, Endpoint>> = {\n [K in keyof T]: T[K] extends Endpoint<any, infer O>\n ? O extends { metadata: { SERVER_ONLY: true } }\n ? never\n : T[K]\n : T[K];\n};\n\n// Method-specific options type\ntype MethodOptions<API, M extends HTTPMethod> = API extends { [key: string]: infer T; }\n ? T extends Endpoint<any, infer O>\n ? O[\"method\"] extends M\n ? { [key in T[\"path\"]]: T; }\n : O[\"method\"] extends M[]\n ? M extends O[\"method\"][number]\n ? { [key in T[\"path\"]]: T; }\n : {}\n : O[\"method\"] extends \"*\"\n ? { [key in T[\"path\"]]: T; }\n : {}\n : {}\n : {};\n\n// When the endpoint didn't declare a schema, better-call infers:\n// - body: `any`\n// - query: `Record<string, any> | undefined`\n// - params: `Record<string, any> | undefined` (no `:param` in path)\n// Under `strictNullChecks: false`, `undefined extends T` is vacuously true and\n// `undefined extends object` is also true, so the previous `extends object`\n// guard wrongly classified these undeclared slots as required. The checks\n// below use `IsAny` for body and `string extends keyof NonNullable<…>` to\n// detect the fallback index signature — both are immune to null-check mode.\ntype IsUndeclaredSchema<T> = [T] extends [never]\n ? true\n : string extends keyof NonNullable<T> ? true : false;\n\nexport type RequiredOptionKeys<\n C extends {\n body?: any;\n query?: any;\n params?: any;\n },\n> = (IsAny<C[\"body\"]> extends true\n ? {}\n : NonNullable<C[\"body\"]> extends object\n ? HasRequiredKeys<NonNullable<C[\"body\"]>> extends true\n ? { body: true }\n : {}\n : { body: true }) &\n (IsUndeclaredSchema<C[\"query\"]> extends true\n ? {}\n : HasRequiredKeys<NonNullable<C[\"query\"]>> extends true\n ? { query: true }\n : {}) &\n (IsUndeclaredSchema<C[\"params\"]> extends true\n ? {}\n : HasRequiredKeys<NonNullable<C[\"params\"]>> extends true\n ? { params: true }\n : {});\n\n\ntype CommonHeaders = {\n accept: \"application/json\" | \"text/plain\" | \"application/octet-stream\";\n \"content-type\": \"application/json\" | \"text/plain\" | \"application/x-www-form-urlencoded\" | \"multipart/form-data\" | \"application/octet-stream\";\n authorization: \"Bearer\" | \"Basic\";\n};\n\ntype FetchRequestOptions<\n Body = any,\n Query extends Record<string, any> = any,\n Params extends Record<string, any> | Array<string> | undefined = any, Res = any,\n ExtraOptions extends Record<string, any> = {}\n> = Prettify<ExtraOptions & Omit<RequestInit, \"body\"> & {\n// baseURL?: string;\n\n /**\n * Headers\n */\n headers?: CommonHeaders | Headers | HeadersInit;\n\n /**\n * Body\n */\n body?: Body;\n\n /**\n * Query parameters (key-value pairs)\n */\n query?: Query;\n\n /**\n * Dynamic parameters.\n *\n * If url is defined as /path/:id, params will be { id: string }\n */\n params?: Params;\n}>\n\ntype FetchResponse<T> = {\n raw: Response;\n data: T;\n headers: Headers;\n status: number;\n statusText: string;\n};\n\nexport function isJSONSerializable(value: any) {\n\tif (value === undefined) {\n\t\treturn false;\n\t}\n\tconst t = typeof value;\n\tif (t === \"string\" || t === \"number\" || t === \"boolean\" || t === null) {\n\t\treturn true;\n\t}\n\tif (t !== \"object\") {\n\t\treturn false;\n\t}\n\tif (Array.isArray(value)) {\n\t\treturn true;\n\t}\n\tif (value.buffer) {\n\t\treturn false;\n\t}\n\treturn (\n\t\t(value.constructor && value.constructor.name === \"Object\") ||\n\t\ttypeof value.toJSON === \"function\"\n\t);\n}\n\nconst JSON_RE = /^application\\/(?:[\\w!#$%&*.^`~-]*\\+)?json(;.+)?$/i;\n\nexport type ResponseType = \"json\" | \"text\" | \"blob\";\nexport function detectResponseType(request: Response): ResponseType {\n\tconst _contentType = request.headers.get(\"content-type\");\n\tconst textTypes = new Set([\n\t\t\"image/svg\",\n\t\t\"application/xml\",\n\t\t\"application/xhtml\",\n\t\t\"application/html\",\n\t]);\n\tif (!_contentType) {\n\t\treturn \"json\";\n\t}\n\tconst contentType = _contentType.split(\";\").shift() || \"\";\n\tif (JSON_RE.test(contentType)) {\n\t\treturn \"json\";\n\t}\n\tif (textTypes.has(contentType) || contentType.startsWith(\"text/\")) {\n\t\treturn \"text\";\n\t}\n\treturn \"blob\";\n}\n\nfunction getURLWithQueryParams(url: string, option?: FetchRequestOptions) {\n\tconst { params, query } = option || {};\n\n\t// Parse the URL and extract existing query parameters\n\tconst [urlPath, urlQuery] = url.split(\"?\");\n\tlet path = urlPath;\n\n\t// Handle params substitution\n\tif (params) {\n\t\tif (Array.isArray(params)) {\n\t\t\tconst paramPaths = path.split(\"/\").filter((p) => p.startsWith(\":\"));\n\t\t\tfor (const [index, key] of paramPaths.entries()) {\n\t\t\t\tconst value = params[index];\n\t\t\t\tpath = path.replace(key, value);\n\t\t\t}\n\t\t} else {\n\t\t\tfor (const [key, value] of Object.entries(params)) {\n\t\t\t\tpath = path.replace(`:${key}`, String(value));\n\t\t\t}\n\t\t}\n\t}\n\n\t// Merge query parameters from URL and options\n\tconst queryParams = new URLSearchParams(urlQuery);\n\tif (query) {\n\t\tfor (const [key, value] of Object.entries(query)) {\n\t\t\tif (value == null) continue;\n\t\t\tqueryParams.set(key, String(value));\n\t\t}\n\t}\n\n\t// Build final URL\n\tlet queryParamString = queryParams.toString();\n\tqueryParamString = queryParamString.length > 0 ? `?${queryParamString}`.replace(/\\+/g, \"%20\") : \"\";\n\n\treturn `${path}${queryParamString}`;\n}\n\ntype InferredAPI<R> = R extends { endpoints: Record<string, Endpoint> }\n ? WithoutServerOnly<R[\"endpoints\"]>\n : WithoutServerOnly<R & Record<string, Endpoint>>;\n\n// Helper type to resolve return type, returning 'any' when R is untyped\ntype InferReturnType<R, OPT, K extends keyof OPT> =\n IsAnyOrAnyIndexed<R> extends true\n ? any\n : Awaited<ReturnType<OPT[K] extends Endpoint ? OPT[K] : never>>;\n\nexport type FetchFn = (url: string | URL | Request, init?: RequestInit) => Promise<Response>;\n\nexport class HTTP<R extends Router | Router[\"endpoints\"]> {\n public authToken: string | undefined;\n public options: FetchRequestOptions;\n\n private sdk: ColyseusSDK;\n private _fetchFn: FetchFn | undefined;\n\n // alias \"del()\" to \"delete()\"\n public del = this.delete;\n\n constructor(sdk: ColyseusSDK, baseOptions: FetchRequestOptions, fetchFn?: FetchFn) {\n this.sdk = sdk;\n this.options = baseOptions;\n this._fetchFn = fetchFn;\n }\n\n /**\n * Lazily resolve the fetch implementation.\n * Falls back to XMLHttpRequest when fetch is unavailable (e.g. Cocos Creator Native).\n */\n private get fetchFn(): FetchFn {\n if (!this._fetchFn) {\n this._fetchFn = (typeof(globalThis.fetch) !== 'undefined')\n ? globalThis.fetch.bind(globalThis)\n : xhrFetch;\n }\n return this._fetchFn;\n }\n\n private async request<\n M extends HTTPMethod,\n API extends InferredAPI<R> = InferredAPI<R>,\n OPT extends Prettify<UnionToIntersection<MethodOptions<API, M>>> = Prettify<UnionToIntersection<MethodOptions<API, M>>>,\n K extends keyof OPT = keyof OPT,\n C extends InferContext<OPT[K]> = InferContext<OPT[K]>\n >(\n method: M,\n path: K,\n options?: FetchRequestOptions<C[\"body\"], C[\"query\"], C[\"params\"]>\n ): Promise<\n FetchResponse<Awaited<ReturnType<OPT[K] extends Endpoint ? OPT[K] : never>>>\n > {\n return this.executeRequest(method, path, options);\n }\n\n // Overload for endpoints WITH required fields (body/query/params)\n get<\n API extends InferredAPI<R> = InferredAPI<R>,\n OPT extends Prettify<UnionToIntersection<MethodOptions<API, \"GET\">>> = Prettify<UnionToIntersection<MethodOptions<API, \"GET\">>>,\n K extends keyof OPT = keyof OPT,\n C extends InferContext<OPT[K]> = InferContext<OPT[K]>\n >(\n path: IsAnyOrAnyIndexed<R> extends true ? string : (HasRequired<C> extends true ? K : never),\n options: IsAnyOrAnyIndexed<R> extends true\n ? FetchRequestOptions<any, any, any>\n : WithRequired<FetchRequestOptions<C[\"body\"], C[\"query\"], C[\"params\"]>, keyof RequiredOptionKeys<C>>\n ): Promise<\n FetchResponse<InferReturnType<R, OPT, K>>\n >;\n\n // Overload for endpoints WITHOUT required fields (permissive when R is 'any')\n get<\n API extends InferredAPI<R> = InferredAPI<R>,\n OPT extends Prettify<UnionToIntersection<MethodOptions<API, \"GET\">>> = Prettify<UnionToIntersection<MethodOptions<API, \"GET\">>>,\n K extends keyof OPT = keyof OPT,\n C extends InferContext<OPT[K]> = InferContext<OPT[K]>\n >(\n path: IsAnyOrAnyIndexed<R> extends true ? string : (HasRequired<C> extends false ? K : never),\n options?: IsAnyOrAnyIndexed<R> extends true\n ? FetchRequestOptions<any, any, any>\n : FetchRequestOptions<C[\"body\"], C[\"query\"], C[\"params\"]>\n ): Promise<\n FetchResponse<InferReturnType<R, OPT, K>>\n >;\n\n get(path: any, options?: any): Promise<any> {\n return this.request(\"GET\", path, options);\n }\n\n // Overload for endpoints WITH required fields (body/query/params)\n post<\n API extends InferredAPI<R> = InferredAPI<R>,\n OPT extends Prettify<UnionToIntersection<MethodOptions<API, \"POST\">>> = Prettify<UnionToIntersection<MethodOptions<API, \"POST\">>>,\n K extends keyof OPT = keyof OPT,\n C extends InferContext<OPT[K]> = InferContext<OPT[K]>\n >(\n path: (IsAnyOrAnyIndexed<R> extends true ? string : never) | (IsAny<API> extends true ? string : never) | (HasRequired<C> extends true ? K : never),\n options: IsAnyOrAnyIndexed<R> extends true ? FetchRequestOptions<any, any, any> : (IsAny<API> extends true\n ? FetchRequestOptions<any, any, any>\n : WithRequired<FetchRequestOptions<C[\"body\"], C[\"query\"], C[\"params\"]>, keyof RequiredOptionKeys<C>>)\n ): Promise<\n FetchResponse<InferReturnType<R, OPT, K>>\n >;\n\n // Overload for endpoints WITHOUT required fields (permissive when R is 'any')\n post<\n API extends InferredAPI<R> = InferredAPI<R>,\n OPT extends Prettify<UnionToIntersection<MethodOptions<API, \"POST\">>> = Prettify<UnionToIntersection<MethodOptions<API, \"POST\">>>,\n K extends keyof OPT = keyof OPT,\n C extends InferContext<OPT[K]> = InferContext<OPT[K]>\n >(\n path: (IsAnyOrAnyIndexed<R> extends true ? string : never) | (IsAny<API> extends true ? string : never) | (HasRequired<C> extends false ? K : never),\n options?: IsAnyOrAnyIndexed<R> extends true ? FetchRequestOptions<any, any, any> : (IsAny<API> extends true\n ? FetchRequestOptions<any, any, any>\n : FetchRequestOptions<C[\"body\"], C[\"query\"], C[\"params\"]>)\n ): Promise<\n FetchResponse<InferReturnType<R, OPT, K>>\n >;\n\n post(path: any, options?: any): Promise<any> {\n return this.request(\"POST\", path, options);\n }\n\n // Overload for endpoints WITH required fields (body/query/params)\n delete<\n API extends InferredAPI<R> = InferredAPI<R>,\n OPT extends Prettify<UnionToIntersection<MethodOptions<API, \"DELETE\">>> = Prettify<UnionToIntersection<MethodOptions<API, \"DELETE\">>>,\n K extends keyof OPT = keyof OPT,\n C extends InferContext<OPT[K]> = InferContext<OPT[K]>\n >(\n path: IsAnyOrAnyIndexed<R> extends true ? string : (HasRequired<C> extends true ? K : never),\n options: IsAnyOrAnyIndexed<R> extends true\n ? FetchRequestOptions<any, any, any>\n : WithRequired<FetchRequestOptions<C[\"body\"], C[\"query\"], C[\"params\"]>, keyof RequiredOptionKeys<C>>\n ): Promise<\n FetchResponse<InferReturnType<R, OPT, K>>\n >;\n\n // Overload for endpoints WITHOUT required fields (permissive when R is 'any')\n delete<\n API extends InferredAPI<R> = InferredAPI<R>,\n OPT extends Prettify<UnionToIntersection<MethodOptions<API, \"DELETE\">>> = Prettify<UnionToIntersection<MethodOptions<API, \"DELETE\">>>,\n K extends keyof OPT = keyof OPT,\n C extends InferContext<OPT[K]> = InferContext<OPT[K]>\n >(\n path: IsAnyOrAnyIndexed<R> extends true ? string : (HasRequired<C> extends false ? K : never),\n options?: IsAnyOrAnyIndexed<R> extends true\n ? FetchRequestOptions<any, any, any>\n : FetchRequestOptions<C[\"body\"], C[\"query\"], C[\"params\"]>\n ): Promise<\n FetchResponse<InferReturnType<R, OPT, K>>\n >;\n\n delete(path: any, options?: any): Promise<any> {\n return this.request(\"DELETE\", path, options);\n }\n\n // Overload for endpoints WITH required fields (body/query/params)\n patch<\n API extends InferredAPI<R> = InferredAPI<R>,\n OPT extends Prettify<UnionToIntersection<MethodOptions<API, \"PATCH\">>> = Prettify<UnionToIntersection<MethodOptions<API, \"PATCH\">>>,\n K extends keyof OPT = keyof OPT,\n C extends InferContext<OPT[K]> = InferContext<OPT[K]>\n >(\n path: IsAnyOrAnyIndexed<R> extends true ? string : (HasRequired<C> extends true ? K : never),\n options: IsAnyOrAnyIndexed<R> extends true\n ? FetchRequestOptions<any, any, any>\n : WithRequired<FetchRequestOptions<C[\"body\"], C[\"query\"], C[\"params\"]>, keyof RequiredOptionKeys<C>>\n ): Promise<\n FetchResponse<InferReturnType<R, OPT, K>>\n >;\n\n // Overload for endpoints WITHOUT required fields (permissive when R is 'any')\n patch<\n API extends InferredAPI<R> = InferredAPI<R>,\n OPT extends Prettify<UnionToIntersection<MethodOptions<API, \"PATCH\">>> = Prettify<UnionToIntersection<MethodOptions<API, \"PATCH\">>>,\n K extends keyof OPT = keyof OPT,\n C extends InferContext<OPT[K]> = InferContext<OPT[K]>\n >(\n path: IsAnyOrAnyIndexed<R> extends true ? string : (HasRequired<C> extends false ? K : never),\n options?: IsAnyOrAnyIndexed<R> extends true\n ? FetchRequestOptions<any, any, any>\n : FetchRequestOptions<C[\"body\"], C[\"query\"], C[\"params\"]>\n ): Promise<\n FetchResponse<InferReturnType<R, OPT, K>>\n >;\n\n patch(path: any, options?: any): Promise<any> {\n return this.request(\"PATCH\", path, options);\n }\n\n // Overload for endpoints WITH required fields (body/query/params)\n put<\n API extends InferredAPI<R> = InferredAPI<R>,\n OPT extends Prettify<UnionToIntersection<MethodOptions<API, \"PUT\">>> = Prettify<UnionToIntersection<MethodOptions<API, \"PUT\">>>,\n K extends keyof OPT = keyof OPT,\n C extends InferContext<OPT[K]> = InferContext<OPT[K]>\n >(\n path: IsAnyOrAnyIndexed<R> extends true ? string : (HasRequired<C> extends true ? K : never),\n options: IsAnyOrAnyIndexed<R> extends true\n ? FetchRequestOptions<any, any, any>\n : WithRequired<FetchRequestOptions<C[\"body\"], C[\"query\"], C[\"params\"]>, keyof RequiredOptionKeys<C>>\n ): Promise<\n FetchResponse<InferReturnType<R, OPT, K>>\n >;\n\n // Overload for endpoints WITHOUT required fields (permissive when R is 'any')\n put<\n API extends InferredAPI<R> = InferredAPI<R>,\n OPT extends Prettify<UnionToIntersection<MethodOptions<API, \"PUT\">>> = Prettify<UnionToIntersection<MethodOptions<API, \"PUT\">>>,\n K extends keyof OPT = keyof OPT,\n C extends InferContext<OPT[K]> = InferContext<OPT[K]>\n >(\n path: IsAnyOrAnyIndexed<R> extends true ? string : (HasRequired<C> extends false ? K : never),\n options?: IsAnyOrAnyIndexed<R> extends true\n ? FetchRequestOptions<any, any, any>\n : FetchRequestOptions<C[\"body\"], C[\"query\"], C[\"params\"]>\n ): Promise<\n FetchResponse<InferReturnType<R, OPT, K>>\n >;\n\n put(path: any, options?: any): Promise<any> {\n return this.request(\"PUT\", path, options);\n }\n\n protected async executeRequest<M extends HTTPMethod>(\n method: M,\n path: any,\n requestOptions?: any\n ): Promise<any> {\n //\n // FIXME: if FormData is provided, merging \"baseOptions.body\" with\n // \"options.body\" will not work as intended\n //\n let body = (this.options.body)\n ? { ...this.options.body, ...(requestOptions?.body as object || {}) }\n : requestOptions?.body;\n\n const query = (this.options.query)\n ? { ...this.options.query, ...(requestOptions?.query as object || {}) }\n : requestOptions?.query;\n\n const params = (this.options.params)\n ? { ...this.options.params, ...(requestOptions?.params as object || {}) }\n : requestOptions?.params;\n\n const headers = new Headers(\n (this.options.headers)\n ? { ...this.options.headers, ...(requestOptions?.headers || {}) }\n : requestOptions?.headers\n );\n\n // Add Authorization header if authToken is set\n if (this.authToken && !headers.has(\"authorization\")) {\n headers.set(\"authorization\", `Bearer ${this.authToken}`);\n }\n\n // Stringify JSON-serializable objects for fetch() body\n if (isJSONSerializable(body) && typeof body === 'object' && body !== null) {\n if (!headers.has(\"content-type\")) {\n headers.set(\"content-type\", \"application/json\");\n }\n for (const [key, value] of Object.entries(body)) {\n if (value instanceof Date) {\n body[key] = value.toISOString();\n }\n }\n body = JSON.stringify(body);\n }\n\n const mergedOptions = {\n credentials: requestOptions?.credentials || \"include\",\n ...this.options,\n ...requestOptions,\n query,\n params,\n headers,\n body,\n method,\n };\n\n const url = getURLWithQueryParams(this.sdk['getHttpEndpoint'](path.toString()), mergedOptions);\n\n let raw: Response;\n try {\n raw = await this.fetchFn(url, mergedOptions);\n } catch (err: any) {\n // If it's an AbortError, re-throw as-is\n if (err.name === 'AbortError') {\n throw err;\n }\n // Re-throw with network error code at top level (e.g. ECONNREFUSED)\n const networkError: ServerError = new ServerError(err.cause?.code || err.code, err.message);\n networkError.response = raw;\n networkError.cause = err.cause;\n throw networkError;\n }\n const contentType = raw.headers.get(\"content-type\");\n\n let data: any;\n\n if (contentType?.includes(\"json\")) {\n data = await raw.json();\n\n } else if (contentType?.includes(\"text\")) {\n data = await raw.text();\n\n } else {\n data = await raw.blob();\n }\n\n if (!raw.ok) {\n throw new ServerError(raw.status, data.message ?? data.error ?? raw.statusText, {\n headers: raw.headers,\n status: raw.status,\n response: raw,\n data\n });\n }\n\n return {\n raw,\n data,\n headers: raw.headers,\n status: raw.status,\n statusText: raw.statusText,\n };\n }\n}\n"],"names":["xhrFetch","ServerError"],"mappings":"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"}
|