@colyseus/sdk 0.17.29 → 0.17.30
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 +4 -1
- package/build/Client.cjs.map +1 -1
- package/build/Client.mjs +4 -1
- package/build/Client.mjs.map +1 -1
- package/build/Connection.cjs +1 -1
- package/build/Connection.mjs +1 -1
- package/build/HTTP.cjs +3 -3
- package/build/HTTP.cjs.map +1 -1
- package/build/HTTP.mjs +2 -2
- 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/index.cjs +1 -1
- package/build/index.mjs +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-cocos-creator.js +10 -7
- package/dist/colyseus-cocos-creator.js.map +1 -1
- package/dist/colyseus.js +10 -7
- package/dist/colyseus.js.map +1 -1
- package/dist/debug.js +1 -1
- package/package.json +3 -3
- package/src/Client.ts +4 -0
- package/src/HTTP.ts +1 -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.30
|
|
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.30
|
|
7
7
|
'use strict';
|
|
8
8
|
|
|
9
9
|
var tslib = require('tslib');
|
|
@@ -196,6 +196,9 @@ class ColyseusSDK {
|
|
|
196
196
|
createMatchMakeRequest(method_1, roomName_1) {
|
|
197
197
|
return tslib.__awaiter(this, arguments, void 0, function* (method, roomName, options = {}, rootSchema) {
|
|
198
198
|
try {
|
|
199
|
+
if (!roomName) {
|
|
200
|
+
throw new Error("Must provide a room name");
|
|
201
|
+
}
|
|
199
202
|
const httpResponse = yield this.http.post(`/matchmake/${method}/${roomName}`, {
|
|
200
203
|
headers: {
|
|
201
204
|
'Accept': 'application/json',
|
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 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 } 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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"}
|
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.30
|
|
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';
|
|
@@ -189,6 +189,9 @@ class ColyseusSDK {
|
|
|
189
189
|
}
|
|
190
190
|
async createMatchMakeRequest(method, roomName, options = {}, rootSchema) {
|
|
191
191
|
try {
|
|
192
|
+
if (!roomName) {
|
|
193
|
+
throw new Error("Must provide a room name");
|
|
194
|
+
}
|
|
192
195
|
const httpResponse = await this.http.post(`/matchmake/${method}/${roomName}`, {
|
|
193
196
|
headers: {
|
|
194
197
|
'Accept': 'application/json',
|
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 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 } 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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"}
|
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.30
|
|
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,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.30
|
|
7
7
|
'use strict';
|
|
8
8
|
|
|
9
9
|
var tslib = require('tslib');
|
|
@@ -113,7 +113,7 @@ class HTTP {
|
|
|
113
113
|
}
|
|
114
114
|
executeRequest(method, path, requestOptions) {
|
|
115
115
|
return tslib.__awaiter(this, void 0, void 0, function* () {
|
|
116
|
-
var _a, _b, _c
|
|
116
|
+
var _a, _b, _c;
|
|
117
117
|
//
|
|
118
118
|
// FIXME: if FormData is provided, merging "baseOptions.body" with
|
|
119
119
|
// "options.body" will not work as intended
|
|
@@ -176,7 +176,7 @@ class HTTP {
|
|
|
176
176
|
data = yield raw.blob();
|
|
177
177
|
}
|
|
178
178
|
if (!raw.ok) {
|
|
179
|
-
throw new Errors.ServerError(
|
|
179
|
+
throw new Errors.ServerError(raw.status, (_c = (_b = data.message) !== null && _b !== void 0 ? _b : data.error) !== null && _c !== void 0 ? _c : raw.statusText, {
|
|
180
180
|
headers: raw.headers,
|
|
181
181
|
status: raw.status,
|
|
182
182
|
response: raw,
|
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 // TODO: improve content-type detection here!\n if (contentType?.indexOf(\"json\")) {\n data = await raw.json();\n\n } else if (contentType?.indexOf(\"text\")) {\n data = await raw.text();\n\n } else {\n data = await raw.blob();\n }\n\n if (!raw.ok) {\n throw new ServerError(data.code ?? raw.status, data.error ?? data.message ?? 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\";\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 // TODO: improve content-type detection here!\n if (contentType?.indexOf(\"json\")) {\n data = await raw.json();\n\n } else if (contentType?.indexOf(\"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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"}
|
package/build/HTTP.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.30
|
|
7
7
|
import { ServerError } from './errors/Errors.mjs';
|
|
8
8
|
|
|
9
9
|
function isJSONSerializable(value) {
|
|
@@ -181,7 +181,7 @@ class HTTP {
|
|
|
181
181
|
data = await raw.blob();
|
|
182
182
|
}
|
|
183
183
|
if (!raw.ok) {
|
|
184
|
-
throw new ServerError(
|
|
184
|
+
throw new ServerError(raw.status, data.message ?? data.error ?? raw.statusText, {
|
|
185
185
|
headers: raw.headers,
|
|
186
186
|
status: raw.status,
|
|
187
187
|
response: raw,
|