@colyseus/sdk 0.17.11 → 0.17.13
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.cjs.map +1 -1
- package/build/3rd_party/discord.mjs +1 -1
- package/build/Auth.cjs +1 -1
- package/build/Auth.cjs.map +1 -1
- package/build/Auth.mjs +1 -1
- package/build/Client.cjs +1 -1
- package/build/Client.cjs.map +1 -1
- package/build/Client.d.ts +7 -7
- package/build/Client.mjs +1 -1
- package/build/Client.mjs.map +1 -1
- package/build/Connection.cjs +1 -1
- package/build/Connection.mjs +1 -1
- package/build/HTTP.cjs +23 -1
- package/build/HTTP.cjs.map +1 -1
- package/build/HTTP.mjs +23 -2
- package/build/HTTP.mjs.map +1 -1
- package/build/Protocol.cjs +1 -1
- package/build/Protocol.mjs +1 -1
- package/build/Room.cjs +1 -1
- package/build/Room.cjs.map +1 -1
- package/build/Room.d.ts +3 -19
- package/build/Room.mjs +1 -1
- package/build/Room.mjs.map +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.cjs.map +1 -1
- package/build/core/nanoevents.mjs +1 -1
- package/build/core/signal.cjs +2 -1
- package/build/core/signal.cjs.map +1 -1
- package/build/core/signal.mjs +2 -1
- package/build/core/signal.mjs.map +1 -1
- package/build/core/utils.cjs +1 -1
- package/build/core/utils.mjs +1 -1
- package/build/debug.cjs +2461 -0
- package/build/debug.cjs.map +1 -0
- package/build/debug.mjs +2452 -0
- package/build/debug.mjs.map +1 -0
- package/build/errors/Errors.cjs +8 -1
- package/build/errors/Errors.cjs.map +1 -1
- package/build/errors/Errors.mjs +8 -2
- package/build/errors/Errors.mjs.map +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 +2 -2
- 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.cjs.map +1 -1
- package/build/transport/H3Transport.mjs +1 -1
- package/build/transport/H3Transport.mjs.map +1 -1
- package/build/transport/WebSocketTransport.cjs +1 -1
- package/build/transport/WebSocketTransport.mjs +1 -1
- package/dist/colyseus-cocos-creator.js +1 -1
- package/dist/colyseus-cocos-creator.js.map +1 -1
- package/dist/colyseus.js +1 -1
- package/dist/colyseus.js.map +1 -1
- package/dist/debug.js +4277 -2394
- package/dist/debug.js.map +1 -1
- package/package.json +4 -3
- package/src/Client.ts +7 -7
- package/src/Room.ts +6 -25
- package/src/debug.ts +5 -5
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 ResponseData<T> = {\n ok: true;\n data: T;\n error: null,\n response: Response;\n headers: Headers;\n status: number;\n statusText: string;\n};\n\ntype ResponseError<E> = {\n ok: false,\n data: null,\n error: Prettify<(E extends Record<string, any> ? E : {\n message?: string;\n }) & {\n code?: string;\n }>;\n response: Response;\n headers: Headers;\n status: number;\n statusText: string;\n};\n\ntype FetchResponse<T, E extends Record<string, unknown> | unknown = unknown, Throw extends boolean = false> =\n Throw extends true\n ? T\n : ResponseData<T> | ResponseError<E>;\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\nexport class HTTP<R extends Router | Router[\"endpoints\"]> {\n public authToken: string | undefined;\n public options: FetchRequestOptions;\n\n private sdk: ColyseusSDK;\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<Awaited<ReturnType<OPT[K] extends Endpoint ? OPT[K] : never>>>\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<Awaited<ReturnType<OPT[K] extends Endpoint ? OPT[K] : never>>>\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<Awaited<ReturnType<OPT[K] extends Endpoint ? OPT[K] : never>>>\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<Awaited<ReturnType<OPT[K] extends Endpoint ? OPT[K] : never>>>\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<Awaited<ReturnType<OPT[K] extends Endpoint ? OPT[K] : never>>>\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<Awaited<ReturnType<OPT[K] extends Endpoint ? OPT[K] : never>>>\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<Awaited<ReturnType<OPT[K] extends Endpoint ? OPT[K] : never>>>\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<Awaited<ReturnType<OPT[K] extends Endpoint ? OPT[K] : never>>>\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<Awaited<ReturnType<OPT[K] extends Endpoint ? OPT[K] : never>>>\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<Awaited<ReturnType<OPT[K] extends Endpoint ? OPT[K] : never>>>\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 response: Response;\n try {\n response = 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.cause = err.cause;\n throw networkError;\n }\n const contentType = response.headers.get(\"content-type\");\n\n let data: any;\n let error = null;\n\n // TODO: improve content-type detection here!\n if (contentType?.indexOf(\"json\")) {\n data = await response.json();\n\n } else if (contentType?.indexOf(\"text\")) {\n data = await response.text();\n\n } else {\n data = await response.blob();\n }\n\n if (!response.ok) {\n // TODO: throw error here?!\n error = data;\n data = null;\n }\n\n return {\n ok: response.ok,\n headers: response.headers,\n data,\n error,\n status: response.status,\n statusText: response.statusText,\n response,\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 ResponseData<T> = {\n ok: true;\n data: T;\n error: null,\n response: Response;\n headers: Headers;\n status: number;\n statusText: string;\n};\n\ntype ResponseError<E> = {\n ok: false,\n data: null,\n error: Prettify<(E extends Record<string, any> ? E : {\n message?: string;\n }) & {\n code?: string;\n }>;\n response: Response;\n headers: Headers;\n status: number;\n statusText: string;\n};\n\ntype FetchResponse<T, E extends Record<string, unknown> | unknown = unknown, Throw extends boolean = false> =\n Throw extends true\n ? T\n : ResponseData<T> | ResponseError<E>;\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\nexport class HTTP<R extends Router | Router[\"endpoints\"]> {\n public authToken: string | undefined;\n public options: FetchRequestOptions;\n\n private sdk: ColyseusSDK;\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<Awaited<ReturnType<OPT[K] extends Endpoint ? OPT[K] : never>>>\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<Awaited<ReturnType<OPT[K] extends Endpoint ? OPT[K] : never>>>\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<Awaited<ReturnType<OPT[K] extends Endpoint ? OPT[K] : never>>>\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<Awaited<ReturnType<OPT[K] extends Endpoint ? OPT[K] : never>>>\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<Awaited<ReturnType<OPT[K] extends Endpoint ? OPT[K] : never>>>\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<Awaited<ReturnType<OPT[K] extends Endpoint ? OPT[K] : never>>>\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<Awaited<ReturnType<OPT[K] extends Endpoint ? OPT[K] : never>>>\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<Awaited<ReturnType<OPT[K] extends Endpoint ? OPT[K] : never>>>\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<Awaited<ReturnType<OPT[K] extends Endpoint ? OPT[K] : never>>>\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<Awaited<ReturnType<OPT[K] extends Endpoint ? OPT[K] : never>>>\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 response: Response;\n try {\n response = 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.cause = err.cause;\n throw networkError;\n }\n const contentType = response.headers.get(\"content-type\");\n\n let data: any;\n let error = null;\n\n // TODO: improve content-type detection here!\n if (contentType?.indexOf(\"json\")) {\n data = await response.json();\n\n } else if (contentType?.indexOf(\"text\")) {\n data = await response.text();\n\n } else {\n data = await response.blob();\n }\n\n if (!response.ok) {\n // TODO: throw error here?!\n error = data;\n data = null;\n }\n\n return {\n ok: response.ok,\n headers: response.headers,\n data,\n error,\n status: response.status,\n statusText: response.statusText,\n response,\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.13
|
|
7
7
|
import { ServerError } from './errors/Errors.mjs';
|
|
8
8
|
|
|
9
9
|
function isJSONSerializable(value) {
|
|
@@ -26,6 +26,27 @@ function isJSONSerializable(value) {
|
|
|
26
26
|
return ((value.constructor && value.constructor.name === "Object") ||
|
|
27
27
|
typeof value.toJSON === "function");
|
|
28
28
|
}
|
|
29
|
+
const JSON_RE = /^application\/(?:[\w!#$%&*.^`~-]*\+)?json(;.+)?$/i;
|
|
30
|
+
function detectResponseType(request) {
|
|
31
|
+
const _contentType = request.headers.get("content-type");
|
|
32
|
+
const textTypes = new Set([
|
|
33
|
+
"image/svg",
|
|
34
|
+
"application/xml",
|
|
35
|
+
"application/xhtml",
|
|
36
|
+
"application/html",
|
|
37
|
+
]);
|
|
38
|
+
if (!_contentType) {
|
|
39
|
+
return "json";
|
|
40
|
+
}
|
|
41
|
+
const contentType = _contentType.split(";").shift() || "";
|
|
42
|
+
if (JSON_RE.test(contentType)) {
|
|
43
|
+
return "json";
|
|
44
|
+
}
|
|
45
|
+
if (textTypes.has(contentType) || contentType.startsWith("text/")) {
|
|
46
|
+
return "text";
|
|
47
|
+
}
|
|
48
|
+
return "blob";
|
|
49
|
+
}
|
|
29
50
|
function getURLWithQueryParams(url, option) {
|
|
30
51
|
const { params, query } = option || {};
|
|
31
52
|
// Parse the URL and extract existing query parameters
|
|
@@ -174,5 +195,5 @@ class HTTP {
|
|
|
174
195
|
}
|
|
175
196
|
}
|
|
176
197
|
|
|
177
|
-
export { HTTP, isJSONSerializable };
|
|
198
|
+
export { HTTP, detectResponseType, isJSONSerializable };
|
|
178
199
|
//# sourceMappingURL=HTTP.mjs.map
|
package/build/HTTP.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HTTP.mjs","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 ResponseData<T> = {\n ok: true;\n data: T;\n error: null,\n response: Response;\n headers: Headers;\n status: number;\n statusText: string;\n};\n\ntype ResponseError<E> = {\n ok: false,\n data: null,\n error: Prettify<(E extends Record<string, any> ? E : {\n message?: string;\n }) & {\n code?: string;\n }>;\n response: Response;\n headers: Headers;\n status: number;\n statusText: string;\n};\n\ntype FetchResponse<T, E extends Record<string, unknown> | unknown = unknown, Throw extends boolean = false> =\n Throw extends true\n ? T\n : ResponseData<T> | ResponseError<E>;\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\nexport class HTTP<R extends Router | Router[\"endpoints\"]> {\n public authToken: string | undefined;\n public options: FetchRequestOptions;\n\n private sdk: ColyseusSDK;\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<Awaited<ReturnType<OPT[K] extends Endpoint ? OPT[K] : never>>>\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<Awaited<ReturnType<OPT[K] extends Endpoint ? OPT[K] : never>>>\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<Awaited<ReturnType<OPT[K] extends Endpoint ? OPT[K] : never>>>\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<Awaited<ReturnType<OPT[K] extends Endpoint ? OPT[K] : never>>>\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<Awaited<ReturnType<OPT[K] extends Endpoint ? OPT[K] : never>>>\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<Awaited<ReturnType<OPT[K] extends Endpoint ? OPT[K] : never>>>\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<Awaited<ReturnType<OPT[K] extends Endpoint ? OPT[K] : never>>>\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<Awaited<ReturnType<OPT[K] extends Endpoint ? OPT[K] : never>>>\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<Awaited<ReturnType<OPT[K] extends Endpoint ? OPT[K] : never>>>\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<Awaited<ReturnType<OPT[K] extends Endpoint ? OPT[K] : never>>>\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 response: Response;\n try {\n response = 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.cause = err.cause;\n throw networkError;\n }\n const contentType = response.headers.get(\"content-type\");\n\n let data: any;\n let error = null;\n\n // TODO: improve content-type detection here!\n if (contentType?.indexOf(\"json\")) {\n data = await response.json();\n\n } else if (contentType?.indexOf(\"text\")) {\n data = await response.text();\n\n } else {\n data = await response.blob();\n }\n\n if (!response.ok) {\n // TODO: throw error here?!\n error = data;\n data = null;\n }\n\n return {\n ok: response.ok,\n headers: response.headers,\n data,\n error,\n status: response.status,\n statusText: response.statusText,\n response,\n };\n }\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"HTTP.mjs","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 ResponseData<T> = {\n ok: true;\n data: T;\n error: null,\n response: Response;\n headers: Headers;\n status: number;\n statusText: string;\n};\n\ntype ResponseError<E> = {\n ok: false,\n data: null,\n error: Prettify<(E extends Record<string, any> ? E : {\n message?: string;\n }) & {\n code?: string;\n }>;\n response: Response;\n headers: Headers;\n status: number;\n statusText: string;\n};\n\ntype FetchResponse<T, E extends Record<string, unknown> | unknown = unknown, Throw extends boolean = false> =\n Throw extends true\n ? T\n : ResponseData<T> | ResponseError<E>;\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\nexport class HTTP<R extends Router | Router[\"endpoints\"]> {\n public authToken: string | undefined;\n public options: FetchRequestOptions;\n\n private sdk: ColyseusSDK;\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<Awaited<ReturnType<OPT[K] extends Endpoint ? OPT[K] : never>>>\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<Awaited<ReturnType<OPT[K] extends Endpoint ? OPT[K] : never>>>\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<Awaited<ReturnType<OPT[K] extends Endpoint ? OPT[K] : never>>>\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<Awaited<ReturnType<OPT[K] extends Endpoint ? OPT[K] : never>>>\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<Awaited<ReturnType<OPT[K] extends Endpoint ? OPT[K] : never>>>\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<Awaited<ReturnType<OPT[K] extends Endpoint ? OPT[K] : never>>>\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<Awaited<ReturnType<OPT[K] extends Endpoint ? OPT[K] : never>>>\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<Awaited<ReturnType<OPT[K] extends Endpoint ? OPT[K] : never>>>\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<Awaited<ReturnType<OPT[K] extends Endpoint ? OPT[K] : never>>>\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<Awaited<ReturnType<OPT[K] extends Endpoint ? OPT[K] : never>>>\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 response: Response;\n try {\n response = 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.cause = err.cause;\n throw networkError;\n }\n const contentType = response.headers.get(\"content-type\");\n\n let data: any;\n let error = null;\n\n // TODO: improve content-type detection here!\n if (contentType?.indexOf(\"json\")) {\n data = await response.json();\n\n } else if (contentType?.indexOf(\"text\")) {\n data = await response.text();\n\n } else {\n data = await response.blob();\n }\n\n if (!response.ok) {\n // TODO: throw error here?!\n error = data;\n data = null;\n }\n\n return {\n ok: response.ok,\n headers: response.headers,\n data,\n error,\n status: response.status,\n statusText: response.statusText,\n response,\n };\n }\n}\n"],"names":[],"mappings":";;;;;;;;AAiLM,SAAU,kBAAkB,CAAC,KAAU,EAAA;AAC5C,IAAA,IAAI,KAAK,KAAK,SAAS,EAAE;AACxB,QAAA,OAAO,KAAK;IACb;AACA,IAAA,MAAM,CAAC,GAAG,OAAO,KAAK;AACtB,IAAA,IAAI,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,IAAI,EAAE;AACtE,QAAA,OAAO,IAAI;IACZ;AACA,IAAA,IAAI,CAAC,KAAK,QAAQ,EAAE;AACnB,QAAA,OAAO,KAAK;IACb;AACA,IAAA,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;AACzB,QAAA,OAAO,IAAI;IACZ;AACA,IAAA,IAAI,KAAK,CAAC,MAAM,EAAE;AACjB,QAAA,OAAO,KAAK;IACb;AACA,IAAA,QACC,CAAC,KAAK,CAAC,WAAW,IAAI,KAAK,CAAC,WAAW,CAAC,IAAI,KAAK,QAAQ;AACzD,QAAA,OAAO,KAAK,CAAC,MAAM,KAAK,UAAU;AAEpC;AAEA,MAAM,OAAO,GAAG,mDAAmD;AAG7D,SAAU,kBAAkB,CAAC,OAAiB,EAAA;IACnD,MAAM,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;AACxD,IAAA,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC;QACzB,WAAW;QACX,iBAAiB;QACjB,mBAAmB;QACnB,kBAAkB;AAClB,KAAA,CAAC;IACF,IAAI,CAAC,YAAY,EAAE;AAClB,QAAA,OAAO,MAAM;IACd;AACA,IAAA,MAAM,WAAW,GAAG,YAAY,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE;AACzD,IAAA,IAAI,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE;AAC9B,QAAA,OAAO,MAAM;IACd;AACA,IAAA,IAAI,SAAS,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,WAAW,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE;AAClE,QAAA,OAAO,MAAM;IACd;AACA,IAAA,OAAO,MAAM;AACd;AAEA,SAAS,qBAAqB,CAAC,GAAW,EAAE,MAA4B,EAAA;IACvE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,EAAE;;AAGtC,IAAA,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC;IAC1C,IAAI,IAAI,GAAG,OAAO;;IAGlB,IAAI,MAAM,EAAE;AACX,QAAA,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;YAC1B,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;AACnE,YAAA,KAAK,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,UAAU,CAAC,OAAO,EAAE,EAAE;AAChD,gBAAA,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;gBAC3B,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC;YAChC;QACD;aAAO;AACN,YAAA,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;AAClD,gBAAA,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,CAAA,CAAA,EAAI,GAAG,CAAA,CAAE,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;YAC9C;QACD;IACD;;AAGA,IAAA,MAAM,WAAW,GAAG,IAAI,eAAe,CAAC,QAAQ,CAAC;IACjD,IAAI,KAAK,EAAE;AACV,QAAA,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;YACjD,IAAI,KAAK,IAAI,IAAI;gBAAE;YACnB,WAAW,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;QACpC;IACD;;AAGA,IAAA,IAAI,gBAAgB,GAAG,WAAW,CAAC,QAAQ,EAAE;IAC7C,gBAAgB,GAAG,gBAAgB,CAAC,MAAM,GAAG,CAAC,GAAG,CAAA,CAAA,EAAI,gBAAgB,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,EAAE;AAElG,IAAA,OAAO,CAAA,EAAG,IAAI,CAAA,EAAG,gBAAgB,EAAE;AACpC;MAMa,IAAI,CAAA;AACN,IAAA,SAAS;AACT,IAAA,OAAO;AAEN,IAAA,GAAG;IAEX,WAAA,CAAY,GAAgB,EAAE,WAAgC,EAAA;AAC1D,QAAA,IAAI,CAAC,GAAG,GAAG,GAAG;AACd,QAAA,IAAI,CAAC,OAAO,GAAG,WAAW;IAC9B;AAEQ,IAAA,MAAM,OAAO,CAOjB,MAAS,EACT,IAAO,EACP,OAAiE,EAAA;QAIjE,OAAO,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC;IACrD;IAgCA,GAAG,CAAC,IAAS,EAAE,OAAa,EAAA;QACxB,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,CAAC;IAC7C;IAgCA,IAAI,CAAC,IAAS,EAAE,OAAa,EAAA;QACzB,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC;IAC9C;IAgCA,MAAM,CAAC,IAAS,EAAE,OAAa,EAAA;QAC3B,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,CAAC;IAChD;IAgCA,KAAK,CAAC,IAAS,EAAE,OAAa,EAAA;QAC1B,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC;IAC/C;IAgCA,GAAG,CAAC,IAAS,EAAE,OAAa,EAAA;QACxB,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,CAAC;IAC7C;AAEU,IAAA,MAAM,cAAc,CAC1B,MAAS,EACT,IAAS,EACT,cAAoB,EAAA;;;;;QAMpB,IAAI,IAAI,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI;AACzB,cAAE,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,cAAc,EAAE,IAAc,IAAI,EAAE,CAAC;AACnE,cAAE,cAAc,EAAE,IAAI;QAE1B,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK;AAC7B,cAAE,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,cAAc,EAAE,KAAe,IAAI,EAAE,CAAC;AACrE,cAAE,cAAc,EAAE,KAAK;QAE3B,MAAM,MAAM,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM;AAC/B,cAAE,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,cAAc,EAAE,MAAgB,IAAI,EAAE,CAAC;AACvE,cAAE,cAAc,EAAE,MAAM;QAE5B,MAAM,OAAO,GAAG,IAAI,OAAO,CACvB,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO;AACjB,cAAE,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,cAAc,EAAE,OAAO,IAAI,EAAE,CAAC;AAC/D,cAAE,cAAc,EAAE,OAAO,CAChC;;AAGD,QAAA,IAAI,IAAI,CAAC,SAAS,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,EAAE;YACjD,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,CAAA,OAAA,EAAU,IAAI,CAAC,SAAS,CAAA,CAAE,CAAC;QAC5D;;AAGA,QAAA,IAAI,kBAAkB,CAAC,IAAI,CAAC,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,EAAE;YACvE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE;AAC9B,gBAAA,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,kBAAkB,CAAC;YACnD;AACA,YAAA,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;AAC7C,gBAAA,IAAI,KAAK,YAAY,IAAI,EAAE;oBACvB,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,WAAW,EAAE;gBACnC;YACJ;AACA,YAAA,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;QAC/B;AAEA,QAAA,MAAM,aAAa,GAAG;AAClB,YAAA,WAAW,EAAE,cAAc,EAAE,WAAW,IAAI,SAAS;YACrD,GAAG,IAAI,CAAC,OAAO;AACf,YAAA,GAAG,cAAc;YACjB,KAAK;YACL,MAAM;YACN,OAAO;YACP,IAAI;YACJ,MAAM;SACT;AAED,QAAA,MAAM,GAAG,GAAG,qBAAqB,CAAC,IAAI,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,EAAE,aAAa,CAAC;AAE9F,QAAA,IAAI,QAAkB;AACtB,QAAA,IAAI;YACA,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,aAAa,CAAC;QAC9C;QAAE,OAAO,GAAQ,EAAE;;AAEf,YAAA,IAAI,GAAG,CAAC,IAAI,KAAK,YAAY,EAAE;AAC3B,gBAAA,MAAM,GAAG;YACb;;AAEA,YAAA,MAAM,YAAY,GAAgB,IAAI,WAAW,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,IAAI,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,OAAO,CAAC;AAC3F,YAAA,YAAY,CAAC,KAAK,GAAG,GAAG,CAAC,KAAK;AAC9B,YAAA,MAAM,YAAY;QACtB;QACA,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;AAExD,QAAA,IAAI,IAAS;QACb,IAAI,KAAK,GAAG,IAAI;;AAGhB,QAAA,IAAI,WAAW,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE;AAC9B,YAAA,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE;QAEhC;AAAO,aAAA,IAAI,WAAW,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE;AACrC,YAAA,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE;QAEhC;aAAO;AACH,YAAA,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE;QAChC;AAEA,QAAA,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE;;YAEd,KAAK,GAAG,IAAI;YACZ,IAAI,GAAG,IAAI;QACf;QAEA,OAAO;YACH,EAAE,EAAE,QAAQ,CAAC,EAAE;YACf,OAAO,EAAE,QAAQ,CAAC,OAAO;YACzB,IAAI;YACJ,KAAK;YACL,MAAM,EAAE,QAAQ,CAAC,MAAM;YACvB,UAAU,EAAE,QAAQ,CAAC,UAAU;YAC/B,QAAQ;SACX;IACL;AACH;;;;"}
|
package/build/Protocol.cjs
CHANGED
package/build/Protocol.mjs
CHANGED
package/build/Room.cjs
CHANGED
package/build/Room.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Room.cjs","sources":["../src/Room.ts"],"sourcesContent":["import { type Room as ServerRoom, type ExtractMessageType } from '@colyseus/core';\nimport { decode, Decoder, encode, Iterator, schema, Schema, SchemaType } from '@colyseus/schema';\n\nimport { Packr, unpack } from '@colyseus/msgpackr';\n\nimport { Connection } from './Connection.ts';\nimport { Protocol } from './Protocol.ts';\nimport { getSerializer, Serializer } from './serializer/Serializer.ts';\n\n// The unused imports here are important for better `.d.ts` file generation\n// (Later merged with `dts-bundle-generator`)\nimport { createNanoEvents } from './core/nanoevents.ts';\nimport { createSignal } from './core/signal.ts';\n\nimport { SchemaConstructor, SchemaSerializer } from './serializer/SchemaSerializer.ts';\n\nimport { CloseCode } from './errors/Errors.ts';\nimport { now } from './core/utils.ts';\n\n// Infer serializer type based on State: SchemaSerializer for Schema types, Serializer otherwise\nexport type InferSerializer<State> = [State] extends [Schema]\n ? SchemaSerializer<State>\n : Serializer<State>;\n\n// Helper types for flexible Room generics\n// Allows: Room<State>, Room<ServerRoom>, or Room<ServerRoom, State>\ntype InferState<T, S> = [S] extends [never]\n ? (T extends typeof ServerRoom ? T['prototype']['state'] : T)\n : S;\n\n// Supports both constructor types (typeof MyRoom) and instance types (MyRoom)\ntype RoomMessages<T> = T extends abstract new (...args: any) => { messages: infer M }\n ? M\n : T extends { messages: infer M }\n ? M\n : {};\n\ntype RoomClientMessages<T> = T extends abstract new (...args: any) => { '~client': { '~messages': infer M } }\n ? M\n : T extends { '~client': { '~messages': infer M } }\n ? M\n : {};\n\nexport interface RoomAvailable<Metadata = any> {\n name: string;\n roomId: string;\n clients: number;\n maxClients: number;\n metadata?: Metadata;\n}\n\nexport interface ReconnectionOptions {\n /**\n * The maximum number of reconnection attempts.\n */\n maxRetries: number;\n\n /**\n * The minimum delay between reconnection attempts.\n */\n minDelay: number;\n\n /**\n * The maximum delay between reconnection attempts.\n */\n maxDelay: number;\n\n /**\n * The minimum uptime of the room before reconnection attempts can be made.\n */\n minUptime: number;\n\n /**\n * The current number of reconnection attempts.\n */\n retryCount: number;\n\n /**\n * The initial delay between reconnection attempts.\n */\n delay: number;\n\n /**\n * The function to calculate the delay between reconnection attempts.\n * @param attempt - The current attempt number.\n * @param delay - The initial delay between reconnection attempts.\n * @returns The delay between reconnection attempts.\n */\n backoff: (attempt: number, delay: number) => number;\n\n /**\n * The maximum number of enqueued messages to buffer.\n */\n maxEnqueuedMessages: number;\n\n /**\n * Buffer for messages sent while connection is not open.\n * These messages will be sent once the connection is re-established.\n */\n enqueuedMessages: Array<{ data: Uint8Array }>;\n\n /**\n * Whether the room is currently reconnecting.\n */\n isReconnecting: boolean;\n}\n\nexport class Room<\n T = any,\n State = InferState<T, never>,\n> {\n public roomId: string;\n public sessionId: string;\n public reconnectionToken: string;\n\n public name: string;\n public connection: Connection;\n\n // Public signals\n public onStateChange = createSignal<(state: State) => void>();\n public onError = createSignal<(code: number, message?: string) => void>();\n public onLeave = createSignal<(code: number, reason?: string) => void>();\n\n public onReconnect = createSignal<() => void>();\n public onDrop = createSignal<(code: number, reason?: string) => void>();\n\n protected onJoin = createSignal();\n\n public serializerId: string;\n public serializer: InferSerializer<State>;\n\n // reconnection logic\n public reconnection: ReconnectionOptions = {\n retryCount: 0,\n maxRetries: 8,\n delay: 100,\n minDelay: 100,\n maxDelay: 5000,\n minUptime: 5000,\n backoff: exponentialBackoff,\n maxEnqueuedMessages: 10,\n enqueuedMessages: [],\n isReconnecting: false,\n };\n\n protected joinedAtTime: number = 0;\n\n protected onMessageHandlers = createNanoEvents();\n\n protected packr: Packr;\n\n #lastPingTime: number = 0;\n #pingCallback: (ms: number) => void;\n\n constructor(name: string, rootSchema?: SchemaConstructor<State>) {\n this.name = name;\n\n this.packr = new Packr();\n\n // msgpackr workaround: force buffer to be created.\n this.packr.encode(undefined);\n\n if (rootSchema) {\n this.serializer = new (getSerializer(\"schema\"));\n (this.serializer as SchemaSerializer).state = new rootSchema();\n }\n\n this.onError((code, message) => console.warn?.(`colyseus.js - onError => (${code}) ${message}`));\n this.onLeave(() => this.removeAllListeners());\n }\n\n public connect(endpoint: string, options?: any, headers?: any) {\n this.connection = new Connection(options.protocol);\n this.connection.events.onmessage = this.onMessageCallback.bind(this);\n this.connection.events.onclose = (e: CloseEvent) => {\n if (this.joinedAtTime === 0) {\n console.warn?.(`Room connection was closed unexpectedly (${e.code}): ${e.reason}`);\n this.onError.invoke(e.code, e.reason);\n return;\n }\n\n if (\n e.code === CloseCode.NO_STATUS_RECEIVED ||\n e.code === CloseCode.ABNORMAL_CLOSURE ||\n e.code === CloseCode.GOING_AWAY ||\n e.code === CloseCode.DEVMODE_RESTART\n ) {\n this.onDrop.invoke(e.code, e.reason);\n this.handleReconnection();\n\n } else {\n this.onLeave.invoke(e.code, e.reason);\n this.destroy();\n }\n };\n\n this.connection.events.onerror = (e: CloseEvent) => {\n console.warn?.(`Room, onError (${e.code}): ${e.reason}`);\n this.onError.invoke(e.code, e.reason);\n };\n\n /**\n * if local serializer has state, it means we don't need to receive the\n * handshake from the server\n */\n const skipHandshake = (this.serializer?.getState() !== undefined);\n\n if (options.protocol === \"h3\") {\n // FIXME: refactor this.\n const url = new URL(endpoint);\n this.connection.connect(url.origin, { ...options, skipHandshake });\n\n } else {\n this.connection.connect(`${endpoint}${skipHandshake ? \"?skipHandshake=1\" : \"\"}`, headers);\n }\n\n }\n\n public leave(consented: boolean = true): Promise<number> {\n return new Promise((resolve) => {\n this.onLeave((code) => resolve(code));\n\n if (this.connection) {\n if (consented) {\n this.packr.buffer[0] = Protocol.LEAVE_ROOM;\n this.connection.send(this.packr.buffer.subarray(0, 1));\n\n } else {\n this.connection.close();\n }\n\n } else {\n this.onLeave.invoke(CloseCode.CONSENTED);\n }\n });\n }\n\n public onMessage<MessageType extends keyof RoomClientMessages<T>>(\n message: MessageType,\n callback: (payload: RoomClientMessages<T>[MessageType]) => void\n )\n public onMessage<T = any>(type: \"*\", callback: (messageType: string | number, payload: T) => void)\n public onMessage<T = any>(type: string | number, callback: (payload: T) => void)\n public onMessage(type: '*' | string | number, callback: (...args: any[]) => void) {\n return this.onMessageHandlers.on(this.getMessageHandlerKey(type), callback);\n }\n\n public ping(callback: (ms: number) => void) {\n this.#lastPingTime = now();\n this.#pingCallback = callback;\n this.packr.buffer[0] = Protocol.PING;\n this.connection.send(this.packr.buffer.subarray(0, 1));\n }\n\n public send<MessageType extends keyof RoomMessages<T>>(\n messageType: MessageType,\n payload?: ExtractMessageType<RoomMessages<T>[MessageType]>\n )\n public send<T = any>(messageType: string | number, payload?: T): void {\n const it: Iterator = { offset: 1 };\n this.packr.buffer[0] = Protocol.ROOM_DATA;\n\n if (typeof(messageType) === \"string\") {\n encode.string(this.packr.buffer as Buffer, messageType, it);\n\n } else {\n encode.number(this.packr.buffer as Buffer, messageType, it);\n }\n\n // force packr to use beginning of the buffer\n this.packr.position = 0;\n\n const data = (payload !== undefined)\n ? this.packr.pack(payload, 2048 + it.offset) // 2048 = RESERVE_START_SPACE\n : this.packr.buffer.subarray(0, it.offset);\n\n // If connection is not open, buffer the message\n if (!this.connection.isOpen) {\n enqueueMessage(this, new Uint8Array(data));\n } else {\n this.connection.send(data);\n }\n }\n\n public sendUnreliable<T = any>(type: string | number, message?: T): void {\n // If connection is not open, skip\n if (!this.connection.isOpen) { return; }\n\n const it: Iterator = { offset: 1 };\n this.packr.buffer[0] = Protocol.ROOM_DATA;\n\n if (typeof(type) === \"string\") {\n encode.string(this.packr.buffer as Buffer, type, it);\n\n } else {\n encode.number(this.packr.buffer as Buffer, type, it);\n }\n\n // force packr to use beginning of the buffer\n this.packr.position = 0;\n\n const data = (message !== undefined)\n ? this.packr.pack(message, 2048 + it.offset) // 2048 = RESERVE_START_SPACE\n : this.packr.buffer.subarray(0, it.offset);\n\n this.connection.sendUnreliable(data);\n }\n\n public sendBytes(type: string | number, bytes: Uint8Array) {\n const it: Iterator = { offset: 1 };\n this.packr.buffer[0] = Protocol.ROOM_DATA_BYTES;\n\n if (typeof(type) === \"string\") {\n encode.string(this.packr.buffer as Buffer, type, it);\n\n } else {\n encode.number(this.packr.buffer as Buffer, type, it);\n }\n\n // check if buffer needs to be resized\n // TODO: can we avoid this?\n if (bytes.byteLength + it.offset > this.packr.buffer.byteLength) {\n const newBuffer = new Uint8Array(it.offset + bytes.byteLength);\n newBuffer.set(this.packr.buffer);\n this.packr.useBuffer(newBuffer);\n }\n\n this.packr.buffer.set(bytes, it.offset);\n\n // If connection is not open, buffer the message\n if (!this.connection.isOpen) {\n enqueueMessage(this, this.packr.buffer.subarray(0, it.offset + bytes.byteLength));\n } else {\n this.connection.send(this.packr.buffer.subarray(0, it.offset + bytes.byteLength));\n }\n\n }\n\n public get state (): State {\n return this.serializer.getState();\n }\n\n public removeAllListeners() {\n this.onJoin.clear();\n this.onStateChange.clear();\n this.onError.clear();\n this.onLeave.clear();\n this.onMessageHandlers.events = {};\n\n if (this.serializer instanceof SchemaSerializer) {\n // Remove callback references\n this.serializer.decoder.root.callbacks = {};\n }\n }\n\n protected onMessageCallback(event: MessageEvent) {\n const buffer = new Uint8Array(event.data);\n\n const it: Iterator = { offset: 1 };\n const code = buffer[0];\n\n if (code === Protocol.JOIN_ROOM) {\n const reconnectionToken = decode.utf8Read(buffer as Buffer, it, buffer[it.offset++]);\n this.serializerId = decode.utf8Read(buffer as Buffer, it, buffer[it.offset++]);\n\n // Instantiate serializer if not locally available.\n if (!this.serializer) {\n const serializer = getSerializer(this.serializerId);\n this.serializer = new serializer();\n }\n\n // apply handshake on first join (no need to do this on reconnect)\n if (buffer.byteLength > it.offset && this.serializer.handshake) {\n this.serializer.handshake(buffer, it);\n }\n\n if (this.joinedAtTime === 0) {\n this.joinedAtTime = Date.now();\n this.onJoin.invoke();\n\n } else {\n console.info(`[Colyseus reconnection]: ${String.fromCodePoint(0x2705)} reconnection successful!`); // ✅\n this.reconnection.isReconnecting = false;\n this.onReconnect.invoke();\n }\n\n this.reconnectionToken = `${this.roomId}:${reconnectionToken}`;\n\n // acknowledge successfull JOIN_ROOM\n this.packr.buffer[0] = Protocol.JOIN_ROOM;\n this.connection.send(this.packr.buffer.subarray(0, 1));\n\n // Send any enqueued messages that were buffered while disconnected\n if (this.reconnection.enqueuedMessages.length > 0) {\n for (const message of this.reconnection.enqueuedMessages) {\n this.connection.send(message.data);\n }\n // Clear the buffer after sending\n this.reconnection.enqueuedMessages = [];\n }\n\n } else if (code === Protocol.ERROR) {\n const code = decode.number(buffer as Buffer, it);\n const message = decode.string(buffer as Buffer, it);\n\n this.onError.invoke(code, message);\n\n } else if (code === Protocol.LEAVE_ROOM) {\n this.leave();\n\n } else if (code === Protocol.ROOM_STATE) {\n this.serializer.setState(buffer, it);\n this.onStateChange.invoke(this.serializer.getState());\n\n } else if (code === Protocol.ROOM_STATE_PATCH) {\n this.serializer.patch(buffer, it);\n this.onStateChange.invoke(this.serializer.getState());\n\n } else if (code === Protocol.ROOM_DATA) {\n const type = (decode.stringCheck(buffer as Buffer, it))\n ? decode.string(buffer as Buffer, it)\n : decode.number(buffer as Buffer, it);\n\n const message = (buffer.byteLength > it.offset)\n ? unpack(buffer as Buffer, { start: it.offset })\n : undefined;\n\n this.dispatchMessage(type, message);\n\n } else if (code === Protocol.ROOM_DATA_BYTES) {\n const type = (decode.stringCheck(buffer as Buffer, it))\n ? decode.string(buffer as Buffer, it)\n : decode.number(buffer as Buffer, it);\n\n this.dispatchMessage(type, buffer.subarray(it.offset));\n } else if (code === Protocol.PING) {\n this.#pingCallback?.(now() - this.#lastPingTime);\n this.#pingCallback = undefined;\n }\n }\n\n private dispatchMessage(type: string | number, message: any) {\n const messageType = this.getMessageHandlerKey(type);\n\n if (this.onMessageHandlers.events[messageType]) {\n this.onMessageHandlers.emit(messageType, message);\n\n } else if (this.onMessageHandlers.events['*']) {\n this.onMessageHandlers.emit('*', type, message);\n\n } else if (!messageType.startsWith(\"__\")) { // ignore internal messages\n console.warn?.(`@colyseus/sdk: onMessage() not registered for type '${type}'.`);\n }\n }\n\n private destroy () {\n if (this.serializer) {\n this.serializer.teardown();\n }\n }\n\n private getMessageHandlerKey(type: string | number): string {\n switch (typeof(type)) {\n // string\n case \"string\": return type;\n\n // number\n case \"number\": return `i${type}`;\n\n default: throw new Error(\"invalid message type.\");\n }\n }\n\n private handleReconnection() {\n if (Date.now() - this.joinedAtTime < this.reconnection.minUptime) {\n console.info(`[Colyseus reconnection]: ${String.fromCodePoint(0x274C)} Room has not been up for long enough for automatic reconnection. (min uptime: ${this.reconnection.minUptime}ms)`); // ❌\n return;\n }\n\n if (!this.reconnection.isReconnecting) {\n console.info(`[Colyseus reconnection]: ${String.fromCodePoint(0x1F504)} Re-establishing connection with roomId '${this.roomId}'...`); // 🔄\n this.reconnection.retryCount = 0;\n this.reconnection.isReconnecting = true;\n }\n\n this.retryReconnection();\n }\n\n private retryReconnection() {\n this.reconnection.retryCount++;\n\n const delay = Math.min(this.reconnection.maxDelay, Math.max(this.reconnection.minDelay, this.reconnection.backoff(this.reconnection.retryCount, this.reconnection.delay)));\n\n console.info(`[Colyseus reconnection]: ${String.fromCodePoint(0x1F504)} will retry in ${delay}ms... (${this.reconnection.retryCount} out of ${this.reconnection.maxRetries})`); // 🔄\n\n // Wait before attempting reconnection\n setTimeout(() => {\n try {\n this.connection.reconnect({\n reconnectionToken: this.reconnectionToken.split(\":\")[1],\n skipHandshake: true, // we already applied the handshake on first join\n });\n\n } catch (e) {\n if (this.reconnection.retryCount < this.reconnection.maxRetries) {\n this.retryReconnection();\n } else {\n console.info(`[Colyseus reconnection]: ${String.fromCodePoint(0x274C)} Failed to reconnect. Is your server running? Please check server logs.`); // ❌\n }\n }\n }, delay);\n }\n}\n\nconst exponentialBackoff = (attempt: number, delay: number) => {\n return Math.floor(Math.pow(2, attempt) * delay);\n}\n\nfunction enqueueMessage(room: Room, message: Uint8Array) {\n room.reconnection.enqueuedMessages.push({ data: message });\n if (room.reconnection.enqueuedMessages.length > room.reconnection.maxEnqueuedMessages) {\n room.reconnection.enqueuedMessages.shift();\n }\n}"],"names":["createSignal","createNanoEvents","Packr","getSerializer","Connection","CloseCode","Protocol","__classPrivateFieldSet","now","encode","SchemaSerializer","decode","unpack","__classPrivateFieldGet"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Room.cjs","sources":["../src/Room.ts"],"sourcesContent":["import { type InferState, type ExtractRoomMessages, type ExtractRoomClientMessages, type ExtractMessageType } from '@colyseus/shared-types';\nimport { decode, encode, Iterator, Schema } from '@colyseus/schema';\n\nimport { Packr, unpack } from '@colyseus/msgpackr';\n\nimport { Connection } from './Connection.ts';\nimport { Protocol } from './Protocol.ts';\nimport { getSerializer, Serializer } from './serializer/Serializer.ts';\n\n// The unused imports here are important for better `.d.ts` file generation\n// (Later merged with `dts-bundle-generator`)\nimport { createNanoEvents } from './core/nanoevents.ts';\nimport { createSignal } from './core/signal.ts';\n\nimport { SchemaConstructor, SchemaSerializer } from './serializer/SchemaSerializer.ts';\n\nimport { CloseCode } from './errors/Errors.ts';\nimport { now } from './core/utils.ts';\n\n// Infer serializer type based on State: SchemaSerializer for Schema types, Serializer otherwise\nexport type InferSerializer<State> = [State] extends [Schema]\n ? SchemaSerializer<State>\n : Serializer<State>;\n\nexport interface RoomAvailable<Metadata = any> {\n name: string;\n roomId: string;\n clients: number;\n maxClients: number;\n metadata?: Metadata;\n}\n\nexport interface ReconnectionOptions {\n /**\n * The maximum number of reconnection attempts.\n */\n maxRetries: number;\n\n /**\n * The minimum delay between reconnection attempts.\n */\n minDelay: number;\n\n /**\n * The maximum delay between reconnection attempts.\n */\n maxDelay: number;\n\n /**\n * The minimum uptime of the room before reconnection attempts can be made.\n */\n minUptime: number;\n\n /**\n * The current number of reconnection attempts.\n */\n retryCount: number;\n\n /**\n * The initial delay between reconnection attempts.\n */\n delay: number;\n\n /**\n * The function to calculate the delay between reconnection attempts.\n * @param attempt - The current attempt number.\n * @param delay - The initial delay between reconnection attempts.\n * @returns The delay between reconnection attempts.\n */\n backoff: (attempt: number, delay: number) => number;\n\n /**\n * The maximum number of enqueued messages to buffer.\n */\n maxEnqueuedMessages: number;\n\n /**\n * Buffer for messages sent while connection is not open.\n * These messages will be sent once the connection is re-established.\n */\n enqueuedMessages: Array<{ data: Uint8Array }>;\n\n /**\n * Whether the room is currently reconnecting.\n */\n isReconnecting: boolean;\n}\n\nexport class Room<\n T = any,\n State = InferState<T, never>,\n> {\n public roomId: string;\n public sessionId: string;\n public reconnectionToken: string;\n\n public name: string;\n public connection: Connection;\n\n // Public signals\n public onStateChange = createSignal<(state: State) => void>();\n public onError = createSignal<(code: number, message?: string) => void>();\n public onLeave = createSignal<(code: number, reason?: string) => void>();\n\n public onReconnect = createSignal<() => void>();\n public onDrop = createSignal<(code: number, reason?: string) => void>();\n\n protected onJoin = createSignal();\n\n public serializerId: string;\n public serializer: InferSerializer<State>;\n\n // reconnection logic\n public reconnection: ReconnectionOptions = {\n retryCount: 0,\n maxRetries: 8,\n delay: 100,\n minDelay: 100,\n maxDelay: 5000,\n minUptime: 5000,\n backoff: exponentialBackoff,\n maxEnqueuedMessages: 10,\n enqueuedMessages: [],\n isReconnecting: false,\n };\n\n protected joinedAtTime: number = 0;\n\n protected onMessageHandlers = createNanoEvents();\n\n protected packr: Packr;\n\n #lastPingTime: number = 0;\n #pingCallback: (ms: number) => void;\n\n constructor(name: string, rootSchema?: SchemaConstructor<State>) {\n this.name = name;\n\n this.packr = new Packr();\n\n // msgpackr workaround: force buffer to be created.\n this.packr.encode(undefined);\n\n if (rootSchema) {\n this.serializer = new (getSerializer(\"schema\"));\n (this.serializer as SchemaSerializer).state = new rootSchema();\n }\n\n this.onError((code, message) => console.warn?.(`colyseus.js - onError => (${code}) ${message}`));\n this.onLeave(() => this.removeAllListeners());\n }\n\n public connect(endpoint: string, options?: any, headers?: any) {\n this.connection = new Connection(options.protocol);\n this.connection.events.onmessage = this.onMessageCallback.bind(this);\n this.connection.events.onclose = (e: CloseEvent) => {\n if (this.joinedAtTime === 0) {\n console.warn?.(`Room connection was closed unexpectedly (${e.code}): ${e.reason}`);\n this.onError.invoke(e.code, e.reason);\n return;\n }\n\n if (\n e.code === CloseCode.NO_STATUS_RECEIVED ||\n e.code === CloseCode.ABNORMAL_CLOSURE ||\n e.code === CloseCode.GOING_AWAY ||\n e.code === CloseCode.DEVMODE_RESTART\n ) {\n this.onDrop.invoke(e.code, e.reason);\n this.handleReconnection();\n\n } else {\n this.onLeave.invoke(e.code, e.reason);\n this.destroy();\n }\n };\n\n this.connection.events.onerror = (e: CloseEvent) => {\n console.warn?.(`Room, onError (${e.code}): ${e.reason}`);\n this.onError.invoke(e.code, e.reason);\n };\n\n /**\n * if local serializer has state, it means we don't need to receive the\n * handshake from the server\n */\n const skipHandshake = (this.serializer?.getState() !== undefined);\n\n if (options.protocol === \"h3\") {\n // FIXME: refactor this.\n const url = new URL(endpoint);\n this.connection.connect(url.origin, { ...options, skipHandshake });\n\n } else {\n this.connection.connect(`${endpoint}${skipHandshake ? \"?skipHandshake=1\" : \"\"}`, headers);\n }\n\n }\n\n public leave(consented: boolean = true): Promise<number> {\n return new Promise((resolve) => {\n this.onLeave((code) => resolve(code));\n\n if (this.connection) {\n if (consented) {\n this.packr.buffer[0] = Protocol.LEAVE_ROOM;\n this.connection.send(this.packr.buffer.subarray(0, 1));\n\n } else {\n this.connection.close();\n }\n\n } else {\n this.onLeave.invoke(CloseCode.CONSENTED);\n }\n });\n }\n\n public onMessage<MessageType extends keyof ExtractRoomClientMessages<T>>(\n message: MessageType,\n callback: (payload: ExtractRoomClientMessages<T>[MessageType]) => void\n )\n public onMessage<T = any>(type: \"*\", callback: (messageType: string | number, payload: T) => void)\n public onMessage<T = any>(type: string | number, callback: (payload: T) => void)\n public onMessage(type: '*' | string | number, callback: (...args: any[]) => void) {\n return this.onMessageHandlers.on(this.getMessageHandlerKey(type), callback);\n }\n\n public ping(callback: (ms: number) => void) {\n this.#lastPingTime = now();\n this.#pingCallback = callback;\n this.packr.buffer[0] = Protocol.PING;\n this.connection.send(this.packr.buffer.subarray(0, 1));\n }\n\n public send<MessageType extends keyof ExtractRoomMessages<T>>(\n messageType: MessageType,\n payload?: ExtractMessageType<ExtractRoomMessages<T>[MessageType]>\n )\n public send<T = any>(messageType: string | number, payload?: T): void {\n const it: Iterator = { offset: 1 };\n this.packr.buffer[0] = Protocol.ROOM_DATA;\n\n if (typeof(messageType) === \"string\") {\n encode.string(this.packr.buffer as Buffer, messageType, it);\n\n } else {\n encode.number(this.packr.buffer as Buffer, messageType, it);\n }\n\n // force packr to use beginning of the buffer\n this.packr.position = 0;\n\n const data = (payload !== undefined)\n ? this.packr.pack(payload, 2048 + it.offset) // 2048 = RESERVE_START_SPACE\n : this.packr.buffer.subarray(0, it.offset);\n\n // If connection is not open, buffer the message\n if (!this.connection.isOpen) {\n enqueueMessage(this, new Uint8Array(data));\n } else {\n this.connection.send(data);\n }\n }\n\n public sendUnreliable<T = any>(type: string | number, message?: T): void {\n // If connection is not open, skip\n if (!this.connection.isOpen) { return; }\n\n const it: Iterator = { offset: 1 };\n this.packr.buffer[0] = Protocol.ROOM_DATA;\n\n if (typeof(type) === \"string\") {\n encode.string(this.packr.buffer as Buffer, type, it);\n\n } else {\n encode.number(this.packr.buffer as Buffer, type, it);\n }\n\n // force packr to use beginning of the buffer\n this.packr.position = 0;\n\n const data = (message !== undefined)\n ? this.packr.pack(message, 2048 + it.offset) // 2048 = RESERVE_START_SPACE\n : this.packr.buffer.subarray(0, it.offset);\n\n this.connection.sendUnreliable(data);\n }\n\n public sendBytes(type: string | number, bytes: Uint8Array) {\n const it: Iterator = { offset: 1 };\n this.packr.buffer[0] = Protocol.ROOM_DATA_BYTES;\n\n if (typeof(type) === \"string\") {\n encode.string(this.packr.buffer as Buffer, type, it);\n\n } else {\n encode.number(this.packr.buffer as Buffer, type, it);\n }\n\n // check if buffer needs to be resized\n // TODO: can we avoid this?\n if (bytes.byteLength + it.offset > this.packr.buffer.byteLength) {\n const newBuffer = new Uint8Array(it.offset + bytes.byteLength);\n newBuffer.set(this.packr.buffer);\n this.packr.useBuffer(newBuffer);\n }\n\n this.packr.buffer.set(bytes, it.offset);\n\n // If connection is not open, buffer the message\n if (!this.connection.isOpen) {\n enqueueMessage(this, this.packr.buffer.subarray(0, it.offset + bytes.byteLength));\n } else {\n this.connection.send(this.packr.buffer.subarray(0, it.offset + bytes.byteLength));\n }\n\n }\n\n public get state (): State {\n return this.serializer.getState();\n }\n\n public removeAllListeners() {\n this.onJoin.clear();\n this.onStateChange.clear();\n this.onError.clear();\n this.onLeave.clear();\n this.onMessageHandlers.events = {};\n\n if (this.serializer instanceof SchemaSerializer) {\n // Remove callback references\n this.serializer.decoder.root.callbacks = {};\n }\n }\n\n protected onMessageCallback(event: MessageEvent) {\n const buffer = new Uint8Array(event.data);\n\n const it: Iterator = { offset: 1 };\n const code = buffer[0];\n\n if (code === Protocol.JOIN_ROOM) {\n const reconnectionToken = decode.utf8Read(buffer as Buffer, it, buffer[it.offset++]);\n this.serializerId = decode.utf8Read(buffer as Buffer, it, buffer[it.offset++]);\n\n // Instantiate serializer if not locally available.\n if (!this.serializer) {\n const serializer = getSerializer(this.serializerId);\n this.serializer = new serializer();\n }\n\n // apply handshake on first join (no need to do this on reconnect)\n if (buffer.byteLength > it.offset && this.serializer.handshake) {\n this.serializer.handshake(buffer, it);\n }\n\n if (this.joinedAtTime === 0) {\n this.joinedAtTime = Date.now();\n this.onJoin.invoke();\n\n } else {\n console.info(`[Colyseus reconnection]: ${String.fromCodePoint(0x2705)} reconnection successful!`); // ✅\n this.reconnection.isReconnecting = false;\n this.onReconnect.invoke();\n }\n\n this.reconnectionToken = `${this.roomId}:${reconnectionToken}`;\n\n // acknowledge successfull JOIN_ROOM\n this.packr.buffer[0] = Protocol.JOIN_ROOM;\n this.connection.send(this.packr.buffer.subarray(0, 1));\n\n // Send any enqueued messages that were buffered while disconnected\n if (this.reconnection.enqueuedMessages.length > 0) {\n for (const message of this.reconnection.enqueuedMessages) {\n this.connection.send(message.data);\n }\n // Clear the buffer after sending\n this.reconnection.enqueuedMessages = [];\n }\n\n } else if (code === Protocol.ERROR) {\n const code = decode.number(buffer as Buffer, it);\n const message = decode.string(buffer as Buffer, it);\n\n this.onError.invoke(code, message);\n\n } else if (code === Protocol.LEAVE_ROOM) {\n this.leave();\n\n } else if (code === Protocol.ROOM_STATE) {\n this.serializer.setState(buffer, it);\n this.onStateChange.invoke(this.serializer.getState());\n\n } else if (code === Protocol.ROOM_STATE_PATCH) {\n this.serializer.patch(buffer, it);\n this.onStateChange.invoke(this.serializer.getState());\n\n } else if (code === Protocol.ROOM_DATA) {\n const type = (decode.stringCheck(buffer as Buffer, it))\n ? decode.string(buffer as Buffer, it)\n : decode.number(buffer as Buffer, it);\n\n const message = (buffer.byteLength > it.offset)\n ? unpack(buffer as Buffer, { start: it.offset })\n : undefined;\n\n this.dispatchMessage(type, message);\n\n } else if (code === Protocol.ROOM_DATA_BYTES) {\n const type = (decode.stringCheck(buffer as Buffer, it))\n ? decode.string(buffer as Buffer, it)\n : decode.number(buffer as Buffer, it);\n\n this.dispatchMessage(type, buffer.subarray(it.offset));\n } else if (code === Protocol.PING) {\n this.#pingCallback?.(now() - this.#lastPingTime);\n this.#pingCallback = undefined;\n }\n }\n\n private dispatchMessage(type: string | number, message: any) {\n const messageType = this.getMessageHandlerKey(type);\n\n if (this.onMessageHandlers.events[messageType]) {\n this.onMessageHandlers.emit(messageType, message);\n\n } else if (this.onMessageHandlers.events['*']) {\n this.onMessageHandlers.emit('*', type, message);\n\n } else if (!messageType.startsWith(\"__\")) { // ignore internal messages\n console.warn?.(`@colyseus/sdk: onMessage() not registered for type '${type}'.`);\n }\n }\n\n private destroy () {\n if (this.serializer) {\n this.serializer.teardown();\n }\n }\n\n private getMessageHandlerKey(type: string | number): string {\n switch (typeof(type)) {\n // string\n case \"string\": return type;\n\n // number\n case \"number\": return `i${type}`;\n\n default: throw new Error(\"invalid message type.\");\n }\n }\n\n private handleReconnection() {\n if (Date.now() - this.joinedAtTime < this.reconnection.minUptime) {\n console.info(`[Colyseus reconnection]: ${String.fromCodePoint(0x274C)} Room has not been up for long enough for automatic reconnection. (min uptime: ${this.reconnection.minUptime}ms)`); // ❌\n return;\n }\n\n if (!this.reconnection.isReconnecting) {\n console.info(`[Colyseus reconnection]: ${String.fromCodePoint(0x1F504)} Re-establishing connection with roomId '${this.roomId}'...`); // 🔄\n this.reconnection.retryCount = 0;\n this.reconnection.isReconnecting = true;\n }\n\n this.retryReconnection();\n }\n\n private retryReconnection() {\n this.reconnection.retryCount++;\n\n const delay = Math.min(this.reconnection.maxDelay, Math.max(this.reconnection.minDelay, this.reconnection.backoff(this.reconnection.retryCount, this.reconnection.delay)));\n\n console.info(`[Colyseus reconnection]: ${String.fromCodePoint(0x1F504)} will retry in ${delay}ms... (${this.reconnection.retryCount} out of ${this.reconnection.maxRetries})`); // 🔄\n\n // Wait before attempting reconnection\n setTimeout(() => {\n try {\n this.connection.reconnect({\n reconnectionToken: this.reconnectionToken.split(\":\")[1],\n skipHandshake: true, // we already applied the handshake on first join\n });\n\n } catch (e) {\n if (this.reconnection.retryCount < this.reconnection.maxRetries) {\n this.retryReconnection();\n } else {\n console.info(`[Colyseus reconnection]: ${String.fromCodePoint(0x274C)} Failed to reconnect. Is your server running? Please check server logs.`); // ❌\n }\n }\n }, delay);\n }\n}\n\nconst exponentialBackoff = (attempt: number, delay: number) => {\n return Math.floor(Math.pow(2, attempt) * delay);\n}\n\nfunction enqueueMessage(room: Room, message: Uint8Array) {\n room.reconnection.enqueuedMessages.push({ data: message });\n if (room.reconnection.enqueuedMessages.length > room.reconnection.maxEnqueuedMessages) {\n room.reconnection.enqueuedMessages.shift();\n }\n}"],"names":["createSignal","createNanoEvents","Packr","getSerializer","Connection","CloseCode","Protocol","__classPrivateFieldSet","now","encode","SchemaSerializer","decode","unpack","__classPrivateFieldGet"],"mappings":"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"}
|
package/build/Room.d.ts
CHANGED
|
@@ -1,25 +1,10 @@
|
|
|
1
|
-
import { type
|
|
1
|
+
import { type InferState, type ExtractRoomMessages, type ExtractRoomClientMessages, type ExtractMessageType } from '@colyseus/shared-types';
|
|
2
2
|
import { Schema } from '@colyseus/schema';
|
|
3
3
|
import { Packr } from '@colyseus/msgpackr';
|
|
4
4
|
import { Connection } from './Connection.ts';
|
|
5
5
|
import { Serializer } from './serializer/Serializer.ts';
|
|
6
6
|
import { SchemaConstructor, SchemaSerializer } from './serializer/SchemaSerializer.ts';
|
|
7
7
|
export type InferSerializer<State> = [State] extends [Schema] ? SchemaSerializer<State> : Serializer<State>;
|
|
8
|
-
type InferState<T, S> = [S] extends [never] ? (T extends typeof ServerRoom ? T['prototype']['state'] : T) : S;
|
|
9
|
-
type RoomMessages<T> = T extends abstract new (...args: any) => {
|
|
10
|
-
messages: infer M;
|
|
11
|
-
} ? M : T extends {
|
|
12
|
-
messages: infer M;
|
|
13
|
-
} ? M : {};
|
|
14
|
-
type RoomClientMessages<T> = T extends abstract new (...args: any) => {
|
|
15
|
-
'~client': {
|
|
16
|
-
'~messages': infer M;
|
|
17
|
-
};
|
|
18
|
-
} ? M : T extends {
|
|
19
|
-
'~client': {
|
|
20
|
-
'~messages': infer M;
|
|
21
|
-
};
|
|
22
|
-
} ? M : {};
|
|
23
8
|
export interface RoomAvailable<Metadata = any> {
|
|
24
9
|
name: string;
|
|
25
10
|
roomId: string;
|
|
@@ -133,11 +118,11 @@ export declare class Room<T = any, State = InferState<T, never>> {
|
|
|
133
118
|
constructor(name: string, rootSchema?: SchemaConstructor<State>);
|
|
134
119
|
connect(endpoint: string, options?: any, headers?: any): void;
|
|
135
120
|
leave(consented?: boolean): Promise<number>;
|
|
136
|
-
onMessage<MessageType extends keyof
|
|
121
|
+
onMessage<MessageType extends keyof ExtractRoomClientMessages<T>>(message: MessageType, callback: (payload: ExtractRoomClientMessages<T>[MessageType]) => void): any;
|
|
137
122
|
onMessage<T = any>(type: "*", callback: (messageType: string | number, payload: T) => void): any;
|
|
138
123
|
onMessage<T = any>(type: string | number, callback: (payload: T) => void): any;
|
|
139
124
|
ping(callback: (ms: number) => void): void;
|
|
140
|
-
send<MessageType extends keyof
|
|
125
|
+
send<MessageType extends keyof ExtractRoomMessages<T>>(messageType: MessageType, payload?: ExtractMessageType<ExtractRoomMessages<T>[MessageType]>): any;
|
|
141
126
|
sendUnreliable<T = any>(type: string | number, message?: T): void;
|
|
142
127
|
sendBytes(type: string | number, bytes: Uint8Array): void;
|
|
143
128
|
get state(): State;
|
|
@@ -149,4 +134,3 @@ export declare class Room<T = any, State = InferState<T, never>> {
|
|
|
149
134
|
private handleReconnection;
|
|
150
135
|
private retryReconnection;
|
|
151
136
|
}
|
|
152
|
-
export {};
|
package/build/Room.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.13
|
|
7
7
|
import { encode, decode } from '@colyseus/schema';
|
|
8
8
|
import { Packr, unpack } from '@colyseus/msgpackr';
|
|
9
9
|
import { Connection } from './Connection.mjs';
|