@esengine/server 4.4.0 → 4.5.0
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/dist/{Room-BnKpl5Sj.d.ts → Room-5owFVIFR.d.ts} +18 -0
- package/dist/auth/index.d.ts +4 -4
- package/dist/auth/testing/index.d.ts +2 -2
- package/dist/chunk-NWZLKNGV.js +2045 -0
- package/dist/chunk-NWZLKNGV.js.map +1 -0
- package/dist/{chunk-FACTBKJ3.js → chunk-T3QJOPNG.js} +37 -2
- package/dist/chunk-T3QJOPNG.js.map +1 -0
- package/dist/chunk-ZUTL4RI7.js +285 -0
- package/dist/chunk-ZUTL4RI7.js.map +1 -0
- package/dist/ecs/index.d.ts +31 -4
- package/dist/ecs/index.js +3 -280
- package/dist/ecs/index.js.map +1 -1
- package/dist/index-B1sr5YAl.d.ts +1076 -0
- package/dist/index.d.ts +1453 -7
- package/dist/index.js +1502 -4
- package/dist/index.js.map +1 -1
- package/dist/ratelimit/index.d.ts +1 -1
- package/dist/testing/index.d.ts +2 -2
- package/dist/testing/index.js +2 -2
- package/dist/{types-C7sS8Sfi.d.ts → types-BCTRacMF.d.ts} +2 -2
- package/package.json +1 -1
- package/dist/chunk-FACTBKJ3.js.map +0 -1
- package/dist/chunk-M7VONMZJ.js +0 -938
- package/dist/chunk-M7VONMZJ.js.map +0 -1
- package/dist/decorators-DY8nZ8Nh.d.ts +0 -26
- package/dist/index-lcuKuQsL.d.ts +0 -470
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/helpers/define.ts"],"names":["defineApi","definition","defineMsg","defineHttp"],"mappings":";;;;;;;AAwBO,SAASA,UACZC,UAAAA,EAA4C;AAE5C,EAAA,OAAOA,UAAAA;AACX;AAJgBD,MAAAA,CAAAA,SAAAA,EAAAA,WAAAA,CAAAA;AAsBT,SAASE,UACZD,UAAAA,EAAsC;AAEtC,EAAA,OAAOA,UAAAA;AACX;AAJgBC,MAAAA,CAAAA,SAAAA,EAAAA,WAAAA,CAAAA;AA8BT,SAASC,WACZF,UAAAA,EAAiC;AAEjC,EAAA,OAAOA,UAAAA;AACX;AAJgBE,MAAAA,CAAAA,UAAAA,EAAAA,YAAAA,CAAAA","file":"index.js","sourcesContent":["/**\n * @zh API、消息和 HTTP 定义助手\n * @en API, message, and HTTP definition helpers\n */\n\nimport type { ApiDefinition, MsgDefinition, HttpDefinition } from '../types/index.js';\n\n/**\n * @zh 定义 API 处理器\n * @en Define API handler\n *\n * @example\n * ```typescript\n * // src/api/join.ts\n * import { defineApi } from '@esengine/server'\n *\n * export default defineApi<ReqJoin, ResJoin>({\n * handler(req, ctx) {\n * ctx.conn.data.playerId = generateId()\n * return { playerId: ctx.conn.data.playerId }\n * }\n * })\n * ```\n */\nexport function defineApi<TReq, TRes, TData = Record<string, unknown>>(\n definition: ApiDefinition<TReq, TRes, TData>\n): ApiDefinition<TReq, TRes, TData> {\n return definition;\n}\n\n/**\n * @zh 定义消息处理器\n * @en Define message handler\n *\n * @example\n * ```typescript\n * // src/msg/input.ts\n * import { defineMsg } from '@esengine/server'\n *\n * export default defineMsg<MsgInput>({\n * handler(msg, ctx) {\n * console.log('Input from', ctx.conn.id, msg)\n * }\n * })\n * ```\n */\nexport function defineMsg<TMsg, TData = Record<string, unknown>>(\n definition: MsgDefinition<TMsg, TData>\n): MsgDefinition<TMsg, TData> {\n return definition;\n}\n\n/**\n * @zh 定义 HTTP 路由处理器\n * @en Define HTTP route handler\n *\n * @example\n * ```typescript\n * // src/http/login.ts\n * import { defineHttp } from '@esengine/server'\n *\n * interface LoginBody {\n * username: string\n * password: string\n * }\n *\n * export default defineHttp<LoginBody>({\n * method: 'POST',\n * handler(req, res) {\n * const { username, password } = req.body\n * // ... validate credentials\n * res.json({ token: '...', userId: '...' })\n * }\n * })\n * ```\n */\nexport function defineHttp<TBody = unknown>(\n definition: HttpDefinition<TBody>\n): HttpDefinition<TBody> {\n return definition;\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/helpers/define.ts","../src/schema/base.ts","../src/schema/primitives.ts","../src/schema/composites.ts","../src/schema/index.ts","../src/distributed/adapters/RedisAdapter.ts","../src/distributed/routing/LoadBalancedRouter.ts"],"names":["defineApi","definition","defineApiWithSchema","schema","defineMsg","defineMsgWithSchema","defineHttp","BaseValidator","_options","validate","value","path","undefined","isOptional","defaultValue","success","data","error","message","expected","typeName","received","isNullable","_validate","is","optional","clone","_clone","default","nullable","StringValidator","_stringOptions","minLength","maxLength","pattern","length","test","min","max","regex","email","url","NumberValidator","_numberOptions","Number","isNaN","integer","isInteger","range","int","positive","negative","BooleanValidator","LiteralValidator","literal","_literal","JSON","stringify","AnyValidator","string","number","boolean","any","ObjectValidator","shape","_shape","_objectOptions","Array","isArray","result","obj","key","validator","Object","entries","fieldValue","fieldPath","fieldResult","strict","knownKeys","Set","keys","has","partial","partialShape","pick","pickedShape","omit","keySet","omittedShape","extend","extendedShape","ArrayValidator","element","_element","_arrayOptions","i","itemPath","String","itemResult","push","nonempty","TupleValidator","elements","_elements","UnionValidator","variants","_variants","map","v","join","errors","variant","RecordValidator","valueValidator","_valueValidator","val","EnumValidator","values","_values","_valuesArray","object","array","tuple","union","record","nativeEnum","s","enum","infer","parse","pathStr","Error","safeParse","createGuard","RELEASE_LOCK_SCRIPT","EXTEND_LOCK_SCRIPT","RedisAdapter","config","_config","_client","_subscriber","_connected","_lockTokens","Map","_handlers","_messageHandler","prefix","serverTtl","roomTtl","snapshotTtl","channel","factory","_key","type","id","_serverKey","serverId","_roomKey","roomId","_snapshotKey","_lockKey","_serversSetKey","_roomsSetKey","_serverRoomsKey","connect","duplicate","event","_dispatchEvent","console","on","subscribe","disconnect","off","unsubscribe","quit","clear","isConnected","_ensureConnected","registerServer","server","client","hmset","address","port","roomCount","playerCount","capacity","status","Date","now","metadata","expire","sadd","publish","payload","timestamp","unregisterServer","del","srem","roomIds","smembers","unregisterRoom","heartbeat","hset","getServers","serverIds","servers","getServer","hgetall","parseInt","lastHeartbeat","updateServer","updates","args","registerRoom","room","roomType","serverAddress","maxPlayers","isLocked","createdAt","updatedAt","getRoom","deleteSnapshot","updateRoom","queryRooms","query","results","filter","r","hasSpace","notLocked","offset","slice","limit","findAvailableRoom","rooms","getRoomsByServer","saveSnapshot","snapshot","set","loadSnapshot","get","handler","add","handlers","delete","size","sendToRoom","messageType","playerId","wildcardHandlers","typeHandlers","acquireLock","ttlMs","lockKey","token","Math","random","toString","substring","ttlSeconds","ceil","releaseLock","eval","extendLock","createRedisAdapter","LoadBalancedRouter","_roundRobinIndex","strategy","preferLocal","localPreferenceThreshold","selectServer","localServerId","availableServers","localServer","find","loadRatio","_selectRoundRobin","_selectLeastRooms","_selectLeastPlayers","_selectRandom","_selectWeighted","selectServerForCreation","resetRoundRobin","reduce","best","current","floor","weights","weight","totalWeight","sum","w","createLoadBalancedRouter"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * @zh API、消息和 HTTP 定义助手\n * @en API, message, and HTTP definition helpers\n */\n\nimport type { ApiDefinition, MsgDefinition, HttpDefinition } from '../types/index.js';\nimport type { Validator, Infer } from '../schema/index.js';\n\n/**\n * @zh 带 Schema 的 API 定义选项\n * @en API definition options with schema\n */\nexport interface ApiDefinitionWithSchema<TReq, TRes, TData = Record<string, unknown>> extends ApiDefinition<TReq, TRes, TData> {\n /**\n * @zh 请求数据 Schema(自动验证)\n * @en Request data schema (auto validation)\n */\n schema?: Validator<TReq>;\n}\n\n/**\n * @zh 定义 API 处理器\n * @en Define API handler\n *\n * @example\n * ```typescript\n * // src/api/join.ts\n * import { defineApi } from '@esengine/server'\n *\n * export default defineApi<ReqJoin, ResJoin>({\n * handler(req, ctx) {\n * ctx.conn.data.playerId = generateId()\n * return { playerId: ctx.conn.data.playerId }\n * }\n * })\n * ```\n *\n * @example\n * ```typescript\n * // 使用 Schema 验证 | With schema validation\n * import { defineApi, s } from '@esengine/server'\n *\n * const MoveSchema = s.object({\n * x: s.number(),\n * y: s.number()\n * });\n *\n * export default defineApi({\n * schema: MoveSchema,\n * handler(req, ctx) {\n * // req 已验证,类型安全 | req is validated, type-safe\n * console.log(req.x, req.y);\n * }\n * })\n * ```\n */\nexport function defineApi<TReq, TRes, TData = Record<string, unknown>>(\n definition: ApiDefinitionWithSchema<TReq, TRes, TData>\n): ApiDefinitionWithSchema<TReq, TRes, TData> {\n return definition;\n}\n\n/**\n * @zh 使用 Schema 定义 API 处理器(类型自动推断)\n * @en Define API handler with schema (auto type inference)\n *\n * @example\n * ```typescript\n * import { defineApiWithSchema, s } from '@esengine/server'\n *\n * const MoveSchema = s.object({\n * x: s.number(),\n * y: s.number()\n * });\n *\n * export default defineApiWithSchema(MoveSchema, {\n * handler(req, ctx) {\n * // req 类型自动推断为 { x: number, y: number }\n * // req type is auto-inferred as { x: number, y: number }\n * console.log(req.x, req.y);\n * return { success: true };\n * }\n * })\n * ```\n */\nexport function defineApiWithSchema<\n TReq,\n TRes,\n TData = Record<string, unknown>\n>(\n schema: Validator<TReq>,\n definition: Omit<ApiDefinition<TReq, TRes, TData>, 'validate'>\n): ApiDefinitionWithSchema<TReq, TRes, TData> {\n return {\n ...definition,\n schema\n };\n}\n\n/**\n * @zh 带 Schema 的消息定义选项\n * @en Message definition options with schema\n */\nexport interface MsgDefinitionWithSchema<TMsg, TData = Record<string, unknown>> extends MsgDefinition<TMsg, TData> {\n /**\n * @zh 消息数据 Schema(自动验证)\n * @en Message data schema (auto validation)\n */\n schema?: Validator<TMsg>;\n}\n\n/**\n * @zh 定义消息处理器\n * @en Define message handler\n *\n * @example\n * ```typescript\n * // src/msg/input.ts\n * import { defineMsg } from '@esengine/server'\n *\n * export default defineMsg<MsgInput>({\n * handler(msg, ctx) {\n * console.log('Input from', ctx.conn.id, msg)\n * }\n * })\n * ```\n *\n * @example\n * ```typescript\n * // 使用 Schema 验证 | With schema validation\n * import { defineMsg, s } from '@esengine/server'\n *\n * const InputSchema = s.object({\n * keys: s.array(s.string()),\n * timestamp: s.number()\n * });\n *\n * export default defineMsg({\n * schema: InputSchema,\n * handler(msg, ctx) {\n * // msg 已验证,类型安全 | msg is validated, type-safe\n * console.log(msg.keys, msg.timestamp);\n * }\n * })\n * ```\n */\nexport function defineMsg<TMsg, TData = Record<string, unknown>>(\n definition: MsgDefinitionWithSchema<TMsg, TData>\n): MsgDefinitionWithSchema<TMsg, TData> {\n return definition;\n}\n\n/**\n * @zh 使用 Schema 定义消息处理器(类型自动推断)\n * @en Define message handler with schema (auto type inference)\n *\n * @example\n * ```typescript\n * import { defineMsgWithSchema, s } from '@esengine/server'\n *\n * const InputSchema = s.object({\n * keys: s.array(s.string()),\n * timestamp: s.number()\n * });\n *\n * export default defineMsgWithSchema(InputSchema, {\n * handler(msg, ctx) {\n * // msg 类型自动推断\n * // msg type is auto-inferred\n * console.log(msg.keys, msg.timestamp);\n * }\n * })\n * ```\n */\nexport function defineMsgWithSchema<\n TMsg,\n TData = Record<string, unknown>\n>(\n schema: Validator<TMsg>,\n definition: MsgDefinition<TMsg, TData>\n): MsgDefinitionWithSchema<TMsg, TData> {\n return {\n ...definition,\n schema\n };\n}\n\n/**\n * @zh 定义 HTTP 路由处理器\n * @en Define HTTP route handler\n *\n * @example\n * ```typescript\n * // src/http/login.ts\n * import { defineHttp } from '@esengine/server'\n *\n * interface LoginBody {\n * username: string\n * password: string\n * }\n *\n * export default defineHttp<LoginBody>({\n * method: 'POST',\n * handler(req, res) {\n * const { username, password } = req.body\n * // ... validate credentials\n * res.json({ token: '...', userId: '...' })\n * }\n * })\n * ```\n */\nexport function defineHttp<TBody = unknown>(\n definition: HttpDefinition<TBody>\n): HttpDefinition<TBody> {\n return definition;\n}\n","/**\n * @zh 基础验证器抽象类\n * @en Base validator abstract class\n *\n * @zh 所有验证器的基类,提供通用的验证逻辑\n * @en Base class for all validators, providing common validation logic\n */\n\nimport type {\n Validator,\n ValidationResult,\n ValidatorOptions\n} from './types.js';\n\n/**\n * @zh 基础验证器抽象类\n * @en Base validator abstract class\n */\nexport abstract class BaseValidator<T> implements Validator<T> {\n abstract readonly typeName: string;\n\n protected _options: ValidatorOptions = {};\n\n /**\n * @zh 核心验证逻辑(子类实现)\n * @en Core validation logic (implemented by subclass)\n */\n protected abstract _validate(value: unknown, path: string[]): ValidationResult<T>;\n\n validate(value: unknown, path: string[] = []): ValidationResult<T> {\n // Handle undefined\n if (value === undefined) {\n if (this._options.isOptional) {\n if (this._options.defaultValue !== undefined) {\n return { success: true, data: this._options.defaultValue as T };\n }\n return { success: true, data: undefined as T };\n }\n return {\n success: false,\n error: {\n path,\n message: 'Required',\n expected: this.typeName,\n received: undefined\n }\n };\n }\n\n // Handle null\n if (value === null) {\n if (this._options.isNullable) {\n return { success: true, data: null as T };\n }\n return {\n success: false,\n error: {\n path,\n message: 'Expected non-null value',\n expected: this.typeName,\n received: null\n }\n };\n }\n\n return this._validate(value, path);\n }\n\n is(value: unknown): value is T {\n return this.validate(value).success;\n }\n\n optional(): Validator<T | undefined> {\n const clone = this._clone();\n clone._options.isOptional = true;\n return clone as unknown as Validator<T | undefined>;\n }\n\n default(defaultValue: T): Validator<T> {\n const clone = this._clone();\n clone._options.isOptional = true;\n clone._options.defaultValue = defaultValue;\n return clone;\n }\n\n nullable(): Validator<T | null> {\n const clone = this._clone();\n clone._options.isNullable = true;\n return clone as unknown as Validator<T | null>;\n }\n\n /**\n * @zh 克隆验证器(用于链式调用)\n * @en Clone validator (for chaining)\n */\n protected abstract _clone(): BaseValidator<T>;\n}\n","/**\n * @zh 基础类型验证器\n * @en Primitive type validators\n */\n\nimport type { ValidationResult } from './types.js';\nimport { BaseValidator } from './base.js';\n\n// ============================================================================\n// String Validator\n// ============================================================================\n\n/**\n * @zh 字符串验证选项\n * @en String validation options\n */\nexport interface StringValidatorOptions {\n minLength?: number;\n maxLength?: number;\n pattern?: RegExp;\n}\n\n/**\n * @zh 字符串验证器\n * @en String validator\n */\nexport class StringValidator extends BaseValidator<string> {\n readonly typeName = 'string';\n private _stringOptions: StringValidatorOptions = {};\n\n protected _validate(value: unknown, path: string[]): ValidationResult<string> {\n if (typeof value !== 'string') {\n return {\n success: false,\n error: {\n path,\n message: `Expected string, received ${typeof value}`,\n expected: 'string',\n received: value\n }\n };\n }\n\n const { minLength, maxLength, pattern } = this._stringOptions;\n\n if (minLength !== undefined && value.length < minLength) {\n return {\n success: false,\n error: {\n path,\n message: `String must be at least ${minLength} characters`,\n expected: `string(minLength: ${minLength})`,\n received: value\n }\n };\n }\n\n if (maxLength !== undefined && value.length > maxLength) {\n return {\n success: false,\n error: {\n path,\n message: `String must be at most ${maxLength} characters`,\n expected: `string(maxLength: ${maxLength})`,\n received: value\n }\n };\n }\n\n if (pattern && !pattern.test(value)) {\n return {\n success: false,\n error: {\n path,\n message: `String does not match pattern ${pattern}`,\n expected: `string(pattern: ${pattern})`,\n received: value\n }\n };\n }\n\n return { success: true, data: value };\n }\n\n protected _clone(): StringValidator {\n const clone = new StringValidator();\n clone._options = { ...this._options };\n clone._stringOptions = { ...this._stringOptions };\n return clone;\n }\n\n /**\n * @zh 设置最小长度\n * @en Set minimum length\n */\n min(length: number): StringValidator {\n const clone = this._clone();\n clone._stringOptions.minLength = length;\n return clone;\n }\n\n /**\n * @zh 设置最大长度\n * @en Set maximum length\n */\n max(length: number): StringValidator {\n const clone = this._clone();\n clone._stringOptions.maxLength = length;\n return clone;\n }\n\n /**\n * @zh 设置长度范围\n * @en Set length range\n */\n length(min: number, max: number): StringValidator {\n const clone = this._clone();\n clone._stringOptions.minLength = min;\n clone._stringOptions.maxLength = max;\n return clone;\n }\n\n /**\n * @zh 设置正则模式\n * @en Set regex pattern\n */\n regex(pattern: RegExp): StringValidator {\n const clone = this._clone();\n clone._stringOptions.pattern = pattern;\n return clone;\n }\n\n /**\n * @zh 邮箱格式验证\n * @en Email format validation\n */\n email(): StringValidator {\n return this.regex(/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/);\n }\n\n /**\n * @zh URL 格式验证\n * @en URL format validation\n */\n url(): StringValidator {\n return this.regex(/^https?:\\/\\/.+/);\n }\n}\n\n// ============================================================================\n// Number Validator\n// ============================================================================\n\n/**\n * @zh 数字验证选项\n * @en Number validation options\n */\nexport interface NumberValidatorOptions {\n min?: number;\n max?: number;\n integer?: boolean;\n}\n\n/**\n * @zh 数字验证器\n * @en Number validator\n */\nexport class NumberValidator extends BaseValidator<number> {\n readonly typeName = 'number';\n private _numberOptions: NumberValidatorOptions = {};\n\n protected _validate(value: unknown, path: string[]): ValidationResult<number> {\n if (typeof value !== 'number' || Number.isNaN(value)) {\n return {\n success: false,\n error: {\n path,\n message: `Expected number, received ${typeof value}`,\n expected: 'number',\n received: value\n }\n };\n }\n\n const { min, max, integer } = this._numberOptions;\n\n if (integer && !Number.isInteger(value)) {\n return {\n success: false,\n error: {\n path,\n message: 'Expected integer',\n expected: 'integer',\n received: value\n }\n };\n }\n\n if (min !== undefined && value < min) {\n return {\n success: false,\n error: {\n path,\n message: `Number must be >= ${min}`,\n expected: `number(min: ${min})`,\n received: value\n }\n };\n }\n\n if (max !== undefined && value > max) {\n return {\n success: false,\n error: {\n path,\n message: `Number must be <= ${max}`,\n expected: `number(max: ${max})`,\n received: value\n }\n };\n }\n\n return { success: true, data: value };\n }\n\n protected _clone(): NumberValidator {\n const clone = new NumberValidator();\n clone._options = { ...this._options };\n clone._numberOptions = { ...this._numberOptions };\n return clone;\n }\n\n /**\n * @zh 设置最小值\n * @en Set minimum value\n */\n min(value: number): NumberValidator {\n const clone = this._clone();\n clone._numberOptions.min = value;\n return clone;\n }\n\n /**\n * @zh 设置最大值\n * @en Set maximum value\n */\n max(value: number): NumberValidator {\n const clone = this._clone();\n clone._numberOptions.max = value;\n return clone;\n }\n\n /**\n * @zh 设置范围\n * @en Set range\n */\n range(min: number, max: number): NumberValidator {\n const clone = this._clone();\n clone._numberOptions.min = min;\n clone._numberOptions.max = max;\n return clone;\n }\n\n /**\n * @zh 要求为整数\n * @en Require integer\n */\n int(): NumberValidator {\n const clone = this._clone();\n clone._numberOptions.integer = true;\n return clone;\n }\n\n /**\n * @zh 要求为正数\n * @en Require positive\n */\n positive(): NumberValidator {\n return this.min(0);\n }\n\n /**\n * @zh 要求为负数\n * @en Require negative\n */\n negative(): NumberValidator {\n return this.max(0);\n }\n}\n\n// ============================================================================\n// Boolean Validator\n// ============================================================================\n\n/**\n * @zh 布尔验证器\n * @en Boolean validator\n */\nexport class BooleanValidator extends BaseValidator<boolean> {\n readonly typeName = 'boolean';\n\n protected _validate(value: unknown, path: string[]): ValidationResult<boolean> {\n if (typeof value !== 'boolean') {\n return {\n success: false,\n error: {\n path,\n message: `Expected boolean, received ${typeof value}`,\n expected: 'boolean',\n received: value\n }\n };\n }\n\n return { success: true, data: value };\n }\n\n protected _clone(): BooleanValidator {\n const clone = new BooleanValidator();\n clone._options = { ...this._options };\n return clone;\n }\n}\n\n// ============================================================================\n// Literal Validator\n// ============================================================================\n\n/**\n * @zh 字面量验证器\n * @en Literal validator\n */\nexport class LiteralValidator<T extends string | number | boolean> extends BaseValidator<T> {\n readonly typeName: string;\n private readonly _literal: T;\n\n constructor(literal: T) {\n super();\n this._literal = literal;\n this.typeName = `literal(${JSON.stringify(literal)})`;\n }\n\n protected _validate(value: unknown, path: string[]): ValidationResult<T> {\n if (value !== this._literal) {\n return {\n success: false,\n error: {\n path,\n message: `Expected ${JSON.stringify(this._literal)}, received ${JSON.stringify(value)}`,\n expected: this.typeName,\n received: value\n }\n };\n }\n\n return { success: true, data: value as T };\n }\n\n protected _clone(): LiteralValidator<T> {\n const clone = new LiteralValidator(this._literal);\n clone._options = { ...this._options };\n return clone;\n }\n}\n\n// ============================================================================\n// Any Validator\n// ============================================================================\n\n/**\n * @zh 任意类型验证器\n * @en Any type validator\n */\nexport class AnyValidator extends BaseValidator<unknown> {\n readonly typeName = 'any';\n\n protected _validate(value: unknown): ValidationResult<unknown> {\n return { success: true, data: value };\n }\n\n protected _clone(): AnyValidator {\n const clone = new AnyValidator();\n clone._options = { ...this._options };\n return clone;\n }\n}\n\n// ============================================================================\n// Factory Functions\n// ============================================================================\n\n/**\n * @zh 创建字符串验证器\n * @en Create string validator\n */\nexport function string(): StringValidator {\n return new StringValidator();\n}\n\n/**\n * @zh 创建数字验证器\n * @en Create number validator\n */\nexport function number(): NumberValidator {\n return new NumberValidator();\n}\n\n/**\n * @zh 创建布尔验证器\n * @en Create boolean validator\n */\nexport function boolean(): BooleanValidator {\n return new BooleanValidator();\n}\n\n/**\n * @zh 创建字面量验证器\n * @en Create literal validator\n */\nexport function literal<T extends string | number | boolean>(value: T): LiteralValidator<T> {\n return new LiteralValidator(value);\n}\n\n/**\n * @zh 创建任意类型验证器\n * @en Create any type validator\n */\nexport function any(): AnyValidator {\n return new AnyValidator();\n}\n","/**\n * @zh 复合类型验证器\n * @en Composite type validators\n */\n\nimport type {\n Validator,\n ValidationResult,\n ObjectShape,\n InferShape\n} from './types.js';\nimport { BaseValidator } from './base.js';\n\n// ============================================================================\n// Object Validator\n// ============================================================================\n\n/**\n * @zh 对象验证选项\n * @en Object validation options\n */\nexport interface ObjectValidatorOptions {\n strict?: boolean;\n}\n\n/**\n * @zh 对象验证器\n * @en Object validator\n */\nexport class ObjectValidator<T extends ObjectShape> extends BaseValidator<InferShape<T>> {\n readonly typeName = 'object';\n private readonly _shape: T;\n private _objectOptions: ObjectValidatorOptions = {};\n\n constructor(shape: T) {\n super();\n this._shape = shape;\n }\n\n protected _validate(value: unknown, path: string[]): ValidationResult<InferShape<T>> {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) {\n return {\n success: false,\n error: {\n path,\n message: `Expected object, received ${Array.isArray(value) ? 'array' : typeof value}`,\n expected: 'object',\n received: value\n }\n };\n }\n\n const result: Record<string, unknown> = {};\n const obj = value as Record<string, unknown>;\n\n // Validate each field in shape\n for (const [key, validator] of Object.entries(this._shape)) {\n const fieldValue = obj[key];\n const fieldPath = [...path, key];\n const fieldResult = validator.validate(fieldValue, fieldPath);\n\n if (!fieldResult.success) {\n return fieldResult as ValidationResult<InferShape<T>>;\n }\n\n result[key] = fieldResult.data;\n }\n\n // Strict mode: check for unknown keys\n if (this._objectOptions.strict) {\n const knownKeys = new Set(Object.keys(this._shape));\n for (const key of Object.keys(obj)) {\n if (!knownKeys.has(key)) {\n return {\n success: false,\n error: {\n path: [...path, key],\n message: `Unknown key \"${key}\"`,\n expected: 'known key',\n received: key\n }\n };\n }\n }\n }\n\n return { success: true, data: result as InferShape<T> };\n }\n\n protected _clone(): ObjectValidator<T> {\n const clone = new ObjectValidator(this._shape);\n clone._options = { ...this._options };\n clone._objectOptions = { ...this._objectOptions };\n return clone;\n }\n\n /**\n * @zh 严格模式(不允许额外字段)\n * @en Strict mode (no extra fields allowed)\n */\n strict(): ObjectValidator<T> {\n const clone = this._clone();\n clone._objectOptions.strict = true;\n return clone;\n }\n\n /**\n * @zh 部分模式(所有字段可选)\n * @en Partial mode (all fields optional)\n */\n partial(): ObjectValidator<{\n [K in keyof T]: ReturnType<T[K]['optional']>;\n }> {\n const partialShape: Record<string, Validator<unknown>> = {};\n for (const [key, validator] of Object.entries(this._shape)) {\n partialShape[key] = validator.optional();\n }\n return new ObjectValidator(partialShape) as any;\n }\n\n /**\n * @zh 选择部分字段\n * @en Pick specific fields\n */\n pick<K extends keyof T>(...keys: K[]): ObjectValidator<Pick<T, K>> {\n const pickedShape: Record<string, Validator<unknown>> = {};\n for (const key of keys) {\n pickedShape[key as string] = this._shape[key];\n }\n return new ObjectValidator(pickedShape) as any;\n }\n\n /**\n * @zh 排除部分字段\n * @en Omit specific fields\n */\n omit<K extends keyof T>(...keys: K[]): ObjectValidator<Omit<T, K>> {\n const keySet = new Set(keys as string[]);\n const omittedShape: Record<string, Validator<unknown>> = {};\n for (const [key, validator] of Object.entries(this._shape)) {\n if (!keySet.has(key)) {\n omittedShape[key] = validator;\n }\n }\n return new ObjectValidator(omittedShape) as any;\n }\n\n /**\n * @zh 扩展对象 Schema\n * @en Extend object schema\n */\n extend<U extends ObjectShape>(shape: U): ObjectValidator<T & U> {\n const extendedShape = { ...this._shape, ...shape };\n return new ObjectValidator(extendedShape) as any;\n }\n}\n\n// ============================================================================\n// Array Validator\n// ============================================================================\n\n/**\n * @zh 数组验证选项\n * @en Array validation options\n */\nexport interface ArrayValidatorOptions {\n minLength?: number;\n maxLength?: number;\n}\n\n/**\n * @zh 数组验证器\n * @en Array validator\n */\nexport class ArrayValidator<T> extends BaseValidator<T[]> {\n readonly typeName = 'array';\n private readonly _element: Validator<T>;\n private _arrayOptions: ArrayValidatorOptions = {};\n\n constructor(element: Validator<T>) {\n super();\n this._element = element;\n }\n\n protected _validate(value: unknown, path: string[]): ValidationResult<T[]> {\n if (!Array.isArray(value)) {\n return {\n success: false,\n error: {\n path,\n message: `Expected array, received ${typeof value}`,\n expected: 'array',\n received: value\n }\n };\n }\n\n const { minLength, maxLength } = this._arrayOptions;\n\n if (minLength !== undefined && value.length < minLength) {\n return {\n success: false,\n error: {\n path,\n message: `Array must have at least ${minLength} items`,\n expected: `array(minLength: ${minLength})`,\n received: value\n }\n };\n }\n\n if (maxLength !== undefined && value.length > maxLength) {\n return {\n success: false,\n error: {\n path,\n message: `Array must have at most ${maxLength} items`,\n expected: `array(maxLength: ${maxLength})`,\n received: value\n }\n };\n }\n\n const result: T[] = [];\n for (let i = 0; i < value.length; i++) {\n const itemPath = [...path, String(i)];\n const itemResult = this._element.validate(value[i], itemPath);\n\n if (!itemResult.success) {\n return itemResult as ValidationResult<T[]>;\n }\n\n result.push(itemResult.data);\n }\n\n return { success: true, data: result };\n }\n\n protected _clone(): ArrayValidator<T> {\n const clone = new ArrayValidator(this._element);\n clone._options = { ...this._options };\n clone._arrayOptions = { ...this._arrayOptions };\n return clone;\n }\n\n /**\n * @zh 设置最小长度\n * @en Set minimum length\n */\n min(length: number): ArrayValidator<T> {\n const clone = this._clone();\n clone._arrayOptions.minLength = length;\n return clone;\n }\n\n /**\n * @zh 设置最大长度\n * @en Set maximum length\n */\n max(length: number): ArrayValidator<T> {\n const clone = this._clone();\n clone._arrayOptions.maxLength = length;\n return clone;\n }\n\n /**\n * @zh 设置长度范围\n * @en Set length range\n */\n length(min: number, max: number): ArrayValidator<T> {\n const clone = this._clone();\n clone._arrayOptions.minLength = min;\n clone._arrayOptions.maxLength = max;\n return clone;\n }\n\n /**\n * @zh 要求非空数组\n * @en Require non-empty array\n */\n nonempty(): ArrayValidator<T> {\n return this.min(1);\n }\n}\n\n// ============================================================================\n// Tuple Validator\n// ============================================================================\n\n/**\n * @zh 元组验证器\n * @en Tuple validator\n */\nexport class TupleValidator<T extends readonly Validator<unknown>[]> extends BaseValidator<{\n [K in keyof T]: T[K] extends Validator<infer U> ? U : never;\n}> {\n readonly typeName = 'tuple';\n private readonly _elements: T;\n\n constructor(elements: T) {\n super();\n this._elements = elements;\n }\n\n protected _validate(value: unknown, path: string[]): ValidationResult<{\n [K in keyof T]: T[K] extends Validator<infer U> ? U : never;\n }> {\n if (!Array.isArray(value)) {\n return {\n success: false,\n error: {\n path,\n message: `Expected tuple, received ${typeof value}`,\n expected: 'tuple',\n received: value\n }\n };\n }\n\n if (value.length !== this._elements.length) {\n return {\n success: false,\n error: {\n path,\n message: `Expected tuple of length ${this._elements.length}, received length ${value.length}`,\n expected: `tuple(length: ${this._elements.length})`,\n received: value\n }\n };\n }\n\n const result: unknown[] = [];\n for (let i = 0; i < this._elements.length; i++) {\n const itemPath = [...path, String(i)];\n const itemResult = this._elements[i].validate(value[i], itemPath);\n\n if (!itemResult.success) {\n return itemResult as any;\n }\n\n result.push(itemResult.data);\n }\n\n return { success: true, data: result as any };\n }\n\n protected _clone(): TupleValidator<T> {\n const clone = new TupleValidator(this._elements);\n clone._options = { ...this._options };\n return clone;\n }\n}\n\n// ============================================================================\n// Union Validator\n// ============================================================================\n\n/**\n * @zh 联合类型验证器\n * @en Union type validator\n */\nexport class UnionValidator<T extends readonly Validator<unknown>[]> extends BaseValidator<\n T[number] extends Validator<infer U> ? U : never\n> {\n readonly typeName: string;\n private readonly _variants: T;\n\n constructor(variants: T) {\n super();\n this._variants = variants;\n this.typeName = `union(${variants.map(v => v.typeName).join(' | ')})`;\n }\n\n protected _validate(value: unknown, path: string[]): ValidationResult<\n T[number] extends Validator<infer U> ? U : never\n > {\n const errors: string[] = [];\n\n for (const variant of this._variants) {\n const result = variant.validate(value, path);\n if (result.success) {\n return result as any;\n }\n errors.push(variant.typeName);\n }\n\n return {\n success: false,\n error: {\n path,\n message: `Expected one of: ${errors.join(', ')}`,\n expected: this.typeName,\n received: value\n }\n };\n }\n\n protected _clone(): UnionValidator<T> {\n const clone = new UnionValidator(this._variants);\n clone._options = { ...this._options };\n return clone;\n }\n}\n\n// ============================================================================\n// Record Validator\n// ============================================================================\n\n/**\n * @zh 记录类型验证器\n * @en Record type validator\n */\nexport class RecordValidator<T> extends BaseValidator<Record<string, T>> {\n readonly typeName = 'record';\n private readonly _valueValidator: Validator<T>;\n\n constructor(valueValidator: Validator<T>) {\n super();\n this._valueValidator = valueValidator;\n }\n\n protected _validate(value: unknown, path: string[]): ValidationResult<Record<string, T>> {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) {\n return {\n success: false,\n error: {\n path,\n message: `Expected object, received ${Array.isArray(value) ? 'array' : typeof value}`,\n expected: 'record',\n received: value\n }\n };\n }\n\n const result: Record<string, T> = {};\n const obj = value as Record<string, unknown>;\n\n for (const [key, val] of Object.entries(obj)) {\n const fieldPath = [...path, key];\n const fieldResult = this._valueValidator.validate(val, fieldPath);\n\n if (!fieldResult.success) {\n return fieldResult as ValidationResult<Record<string, T>>;\n }\n\n result[key] = fieldResult.data;\n }\n\n return { success: true, data: result };\n }\n\n protected _clone(): RecordValidator<T> {\n const clone = new RecordValidator(this._valueValidator);\n clone._options = { ...this._options };\n return clone;\n }\n}\n\n// ============================================================================\n// Enum Validator\n// ============================================================================\n\n/**\n * @zh 枚举验证器\n * @en Enum validator\n */\nexport class EnumValidator<T extends readonly (string | number)[]> extends BaseValidator<T[number]> {\n readonly typeName: string;\n private readonly _values: Set<string | number>;\n private readonly _valuesArray: T;\n\n constructor(values: T) {\n super();\n this._valuesArray = values;\n this._values = new Set(values);\n this.typeName = `enum(${values.map(v => JSON.stringify(v)).join(', ')})`;\n }\n\n protected _validate(value: unknown, path: string[]): ValidationResult<T[number]> {\n if (!this._values.has(value as string | number)) {\n return {\n success: false,\n error: {\n path,\n message: `Expected one of: ${this._valuesArray.map(v => JSON.stringify(v)).join(', ')}`,\n expected: this.typeName,\n received: value\n }\n };\n }\n\n return { success: true, data: value as T[number] };\n }\n\n protected _clone(): EnumValidator<T> {\n const clone = new EnumValidator(this._valuesArray);\n clone._options = { ...this._options };\n return clone;\n }\n}\n\n// ============================================================================\n// Factory Functions\n// ============================================================================\n\n/**\n * @zh 创建对象验证器\n * @en Create object validator\n */\nexport function object<T extends ObjectShape>(shape: T): ObjectValidator<T> {\n return new ObjectValidator(shape);\n}\n\n/**\n * @zh 创建数组验证器\n * @en Create array validator\n */\nexport function array<T>(element: Validator<T>): ArrayValidator<T> {\n return new ArrayValidator(element);\n}\n\n/**\n * @zh 创建元组验证器\n * @en Create tuple validator\n */\nexport function tuple<T extends readonly Validator<unknown>[]>(\n elements: T\n): TupleValidator<T> {\n return new TupleValidator(elements);\n}\n\n/**\n * @zh 创建联合类型验证器\n * @en Create union type validator\n */\nexport function union<T extends readonly Validator<unknown>[]>(\n variants: T\n): UnionValidator<T> {\n return new UnionValidator(variants);\n}\n\n/**\n * @zh 创建记录类型验证器\n * @en Create record type validator\n */\nexport function record<T>(valueValidator: Validator<T>): RecordValidator<T> {\n return new RecordValidator(valueValidator);\n}\n\n/**\n * @zh 创建枚举验证器\n * @en Create enum validator\n */\nexport function nativeEnum<T extends readonly (string | number)[]>(\n values: T\n): EnumValidator<T> {\n return new EnumValidator(values);\n}\n","/**\n * @zh Schema 验证系统\n * @en Schema validation system\n *\n * @zh 轻量级自定义验证系统,提供类型安全的运行时验证\n * @en Lightweight custom validation system with type-safe runtime validation\n *\n * @example\n * ```typescript\n * import { s } from '@esengine/server';\n *\n * // 定义 Schema | Define schema\n * const MoveSchema = s.object({\n * x: s.number(),\n * y: s.number(),\n * speed: s.number().optional()\n * });\n *\n * // 推断类型 | Infer type\n * type Move = s.infer<typeof MoveSchema>;\n *\n * // 验证数据 | Validate data\n * const result = MoveSchema.validate(data);\n * if (result.success) {\n * console.log(result.data); // 类型安全 | Type-safe\n * } else {\n * console.error(result.error);\n * }\n *\n * // 与 defineApi 集成 | Integrate with defineApi\n * export default defineApi<Move, void>({\n * schema: MoveSchema,\n * handler(req, ctx) {\n * // req 已验证,类型安全 | req is validated, type-safe\n * }\n * });\n * ```\n */\n\n// ============================================================================\n// Type Exports\n// ============================================================================\n\nexport type {\n Validator,\n ValidationResult,\n ValidationSuccess,\n ValidationFailure,\n ValidationError,\n Infer,\n ObjectShape,\n InferShape,\n ValidatorOptions\n} from './types.js';\n\n// ============================================================================\n// Base Validator Export\n// ============================================================================\n\nexport { BaseValidator } from './base.js';\n\n// ============================================================================\n// Validator Exports\n// ============================================================================\n\nexport {\n StringValidator,\n NumberValidator,\n BooleanValidator,\n LiteralValidator,\n AnyValidator,\n string,\n number,\n boolean,\n literal,\n any\n} from './primitives.js';\n\nexport type {\n StringValidatorOptions,\n NumberValidatorOptions\n} from './primitives.js';\n\nexport {\n ObjectValidator,\n ArrayValidator,\n TupleValidator,\n UnionValidator,\n RecordValidator,\n EnumValidator,\n object,\n array,\n tuple,\n union,\n record,\n nativeEnum\n} from './composites.js';\n\nexport type {\n ObjectValidatorOptions,\n ArrayValidatorOptions\n} from './composites.js';\n\n// ============================================================================\n// Schema Builder (s namespace)\n// ============================================================================\n\nimport type { Infer, Validator } from './types.js';\nimport {\n string,\n number,\n boolean,\n literal,\n any\n} from './primitives.js';\nimport {\n object,\n array,\n tuple,\n union,\n record,\n nativeEnum\n} from './composites.js';\n\n/**\n * @zh Schema 构建器命名空间\n * @en Schema builder namespace\n *\n * @example\n * ```typescript\n * import { s } from '@esengine/server';\n *\n * const UserSchema = s.object({\n * id: s.string(),\n * name: s.string().min(1).max(50),\n * age: s.number().int().min(0).max(150),\n * email: s.string().email().optional(),\n * role: s.enum(['admin', 'user', 'guest'] as const),\n * tags: s.array(s.string()),\n * metadata: s.record(s.any()).optional()\n * });\n *\n * type User = s.infer<typeof UserSchema>;\n * ```\n */\nexport const s = {\n // Primitives\n string,\n number,\n boolean,\n literal,\n any,\n\n // Composites\n object,\n array,\n tuple,\n union,\n record,\n\n /**\n * @zh 创建枚举验证器\n * @en Create enum validator\n *\n * @example\n * ```typescript\n * const RoleSchema = s.enum(['admin', 'user', 'guest'] as const);\n * type Role = s.infer<typeof RoleSchema>; // 'admin' | 'user' | 'guest'\n * ```\n */\n enum: nativeEnum,\n\n /**\n * @zh 类型推断辅助(仅用于类型层面)\n * @en Type inference helper (type-level only)\n *\n * @zh 这是一个类型辅助,用于从验证器推断类型\n * @en This is a type helper to infer types from validators\n */\n infer: undefined as unknown as <V extends Validator<unknown>>() => Infer<V>\n} as const;\n\n/**\n * @zh 类型推断辅助类型\n * @en Type inference helper type\n */\nexport namespace s {\n /**\n * @zh 从验证器推断类型\n * @en Infer type from validator\n */\n export type infer<V extends Validator<unknown>> = Infer<V>;\n}\n\n// ============================================================================\n// Validation Helpers\n// ============================================================================\n\n/**\n * @zh 验证数据并抛出错误\n * @en Validate data and throw error\n *\n * @param validator - @zh 验证器 @en Validator\n * @param value - @zh 待验证的值 @en Value to validate\n * @returns @zh 验证通过的数据 @en Validated data\n * @throws @zh 验证失败时抛出错误 @en Throws when validation fails\n */\nexport function parse<T>(validator: Validator<T>, value: unknown): T {\n const result = validator.validate(value);\n if (!result.success) {\n const pathStr = result.error.path.length > 0\n ? ` at \"${result.error.path.join('.')}\"`\n : '';\n throw new Error(`Validation failed${pathStr}: ${result.error.message}`);\n }\n return result.data;\n}\n\n/**\n * @zh 安全验证数据(不抛出错误)\n * @en Safely validate data (no throw)\n *\n * @param validator - @zh 验证器 @en Validator\n * @param value - @zh 待验证的值 @en Value to validate\n * @returns @zh 验证结果 @en Validation result\n */\nexport function safeParse<T>(validator: Validator<T>, value: unknown) {\n return validator.validate(value);\n}\n\n/**\n * @zh 创建类型守卫函数\n * @en Create type guard function\n *\n * @param validator - @zh 验证器 @en Validator\n * @returns @zh 类型守卫函数 @en Type guard function\n *\n * @example\n * ```typescript\n * const isUser = createGuard(UserSchema);\n * if (isUser(data)) {\n * // data is User\n * }\n * ```\n */\nexport function createGuard<T>(validator: Validator<T>): (value: unknown) => value is T {\n return (value: unknown): value is T => validator.is(value);\n}\n","/**\n * @zh Redis 分布式适配器\n * @en Redis distributed adapter\n *\n * @zh 基于 Redis 的分布式房间适配器,支持 Pub/Sub、分布式锁和状态持久化\n * @en Redis-based distributed room adapter with Pub/Sub, distributed lock and state persistence\n */\n\nimport type { IDistributedAdapter } from './IDistributedAdapter.js';\nimport type {\n ServerRegistration,\n RoomRegistration,\n RoomQuery,\n RoomSnapshot,\n DistributedEvent,\n DistributedEventType,\n DistributedEventHandler,\n Unsubscribe\n} from '../types.js';\n\n/**\n * @zh Redis 客户端接口(兼容 ioredis)\n * @en Redis client interface (compatible with ioredis)\n */\nexport interface RedisClient {\n // 基础操作\n get(key: string): Promise<string | null>;\n set(key: string, value: string, ...args: (string | number)[]): Promise<string | null>;\n del(...keys: string[]): Promise<number>;\n expire(key: string, seconds: number): Promise<number>;\n ttl(key: string): Promise<number>;\n\n // Hash 操作\n hget(key: string, field: string): Promise<string | null>;\n hset(key: string, ...args: (string | number | Buffer)[]): Promise<number>;\n hdel(key: string, ...fields: string[]): Promise<number>;\n hgetall(key: string): Promise<Record<string, string>>;\n hmset(key: string, ...args: (string | number | Buffer)[]): Promise<'OK'>;\n\n // Set 操作\n sadd(key: string, ...members: string[]): Promise<number>;\n srem(key: string, ...members: string[]): Promise<number>;\n smembers(key: string): Promise<string[]>;\n\n // Pub/Sub\n publish(channel: string, message: string): Promise<number>;\n subscribe(channel: string): Promise<number>;\n psubscribe(pattern: string): Promise<number>;\n unsubscribe(...channels: string[]): Promise<number>;\n punsubscribe(...patterns: string[]): Promise<number>;\n\n // 事件(重载支持 message 事件的类型安全)\n on(event: 'message', callback: (channel: string, message: string) => void): void;\n on(event: 'pmessage', callback: (pattern: string, channel: string, message: string) => void): void;\n on(event: string, callback: (...args: unknown[]) => void): void;\n off(event: 'message', callback: (channel: string, message: string) => void): void;\n off(event: 'pmessage', callback: (pattern: string, channel: string, message: string) => void): void;\n off(event: string, callback: (...args: unknown[]) => void): void;\n\n // Lua 脚本\n eval(script: string, numkeys: number, ...args: (string | number)[]): Promise<unknown>;\n\n // 连接\n duplicate(): RedisClient;\n quit(): Promise<'OK'>;\n disconnect(): void;\n}\n\n/**\n * @zh Redis 连接工厂\n * @en Redis connection factory\n */\nexport type RedisClientFactory = () => RedisClient | Promise<RedisClient>;\n\n/**\n * @zh Redis 适配器配置\n * @en Redis adapter configuration\n */\nexport interface RedisAdapterConfig {\n /**\n * @zh Redis 客户端工厂(惰性连接)\n * @en Redis client factory (lazy connection)\n *\n * @example\n * ```typescript\n * import Redis from 'ioredis'\n * const adapter = new RedisAdapter({\n * factory: () => new Redis('redis://localhost:6379')\n * })\n * ```\n */\n factory: RedisClientFactory;\n\n /**\n * @zh 键前缀\n * @en Key prefix\n * @default 'dist:'\n */\n prefix?: string;\n\n /**\n * @zh 服务器 TTL(秒)\n * @en Server TTL (seconds)\n * @default 30\n */\n serverTtl?: number;\n\n /**\n * @zh 房间 TTL(秒),0 = 永不过期\n * @en Room TTL (seconds), 0 = never expire\n * @default 0\n */\n roomTtl?: number;\n\n /**\n * @zh 快照 TTL(秒)\n * @en Snapshot TTL (seconds)\n * @default 86400 (24 hours)\n */\n snapshotTtl?: number;\n\n /**\n * @zh Pub/Sub 频道名\n * @en Pub/Sub channel name\n * @default 'distributed:events'\n */\n channel?: string;\n}\n\n// Lua 脚本:安全释放锁\nconst RELEASE_LOCK_SCRIPT = `\nif redis.call(\"get\", KEYS[1]) == ARGV[1] then\n return redis.call(\"del\", KEYS[1])\nelse\n return 0\nend\n`;\n\n// Lua 脚本:扩展锁 TTL\nconst EXTEND_LOCK_SCRIPT = `\nif redis.call(\"get\", KEYS[1]) == ARGV[1] then\n return redis.call(\"pexpire\", KEYS[1], ARGV[2])\nelse\n return 0\nend\n`;\n\n/**\n * @zh Redis 分布式适配器\n * @en Redis distributed adapter\n *\n * @example\n * ```typescript\n * import Redis from 'ioredis'\n * import { RedisAdapter, DistributedRoomManager } from '@esengine/server'\n *\n * const adapter = new RedisAdapter({\n * factory: () => new Redis('redis://localhost:6379'),\n * prefix: 'game:'\n * })\n *\n * const manager = new DistributedRoomManager(adapter, {\n * serverId: 'server-1',\n * serverAddress: 'localhost',\n * serverPort: 3000\n * }, sendFn)\n *\n * await manager.start()\n * ```\n */\nexport class RedisAdapter implements IDistributedAdapter {\n private readonly _config: Required<RedisAdapterConfig>;\n private _client: RedisClient | null = null;\n private _subscriber: RedisClient | null = null;\n private _connected = false;\n\n // 锁的 owner token(用于安全释放)\n private readonly _lockTokens = new Map<string, string>();\n\n // 事件处理器\n private readonly _handlers = new Map<string, Set<DistributedEventHandler>>();\n private _messageHandler: ((channel: string, message: string) => void) | null = null;\n\n constructor(config: RedisAdapterConfig) {\n this._config = {\n prefix: 'dist:',\n serverTtl: 30,\n roomTtl: 0,\n snapshotTtl: 86400,\n channel: 'distributed:events',\n ...config,\n factory: config.factory\n };\n }\n\n // =========================================================================\n // Key 生成器 | Key Generators\n // =========================================================================\n\n private _key(type: string, id?: string): string {\n return id\n ? `${this._config.prefix}${type}:${id}`\n : `${this._config.prefix}${type}`;\n }\n\n private _serverKey(serverId: string): string {\n return this._key('server', serverId);\n }\n\n private _roomKey(roomId: string): string {\n return this._key('room', roomId);\n }\n\n private _snapshotKey(roomId: string): string {\n return this._key('snapshot', roomId);\n }\n\n private _lockKey(key: string): string {\n return this._key('lock', key);\n }\n\n private _serversSetKey(): string {\n return this._key('servers');\n }\n\n private _roomsSetKey(): string {\n return this._key('rooms');\n }\n\n private _serverRoomsKey(serverId: string): string {\n return this._key('server-rooms', serverId);\n }\n\n // =========================================================================\n // 生命周期 | Lifecycle\n // =========================================================================\n\n async connect(): Promise<void> {\n if (this._connected) return;\n\n // 创建主客户端\n this._client = await this._config.factory();\n\n // 创建订阅专用客户端\n this._subscriber = this._client.duplicate();\n\n // 设置消息处理器\n this._messageHandler = (channel: string, message: string) => {\n if (channel !== this._config.channel) return;\n\n try {\n const event: DistributedEvent = JSON.parse(message);\n this._dispatchEvent(event);\n } catch (error) {\n console.error('[RedisAdapter] Failed to parse event:', error);\n }\n };\n\n this._subscriber.on('message', this._messageHandler);\n await this._subscriber.subscribe(this._config.channel);\n\n this._connected = true;\n }\n\n async disconnect(): Promise<void> {\n if (!this._connected) return;\n\n // 清理订阅\n if (this._subscriber) {\n if (this._messageHandler) {\n this._subscriber.off('message', this._messageHandler);\n }\n await this._subscriber.unsubscribe(this._config.channel);\n this._subscriber.disconnect();\n this._subscriber = null;\n }\n\n // 关闭主客户端\n if (this._client) {\n await this._client.quit();\n this._client = null;\n }\n\n this._handlers.clear();\n this._lockTokens.clear();\n this._connected = false;\n }\n\n isConnected(): boolean {\n return this._connected;\n }\n\n private _ensureConnected(): RedisClient {\n if (!this._connected || !this._client) {\n throw new Error('RedisAdapter is not connected');\n }\n return this._client;\n }\n\n // =========================================================================\n // 服务器注册 | Server Registry\n // =========================================================================\n\n async registerServer(server: ServerRegistration): Promise<void> {\n const client = this._ensureConnected();\n const key = this._serverKey(server.serverId);\n\n // 存储服务器信息\n await client.hmset(\n key,\n 'serverId', server.serverId,\n 'address', server.address,\n 'port', String(server.port),\n 'roomCount', String(server.roomCount),\n 'playerCount', String(server.playerCount),\n 'capacity', String(server.capacity),\n 'status', server.status,\n 'lastHeartbeat', String(Date.now()),\n 'metadata', JSON.stringify(server.metadata ?? {})\n );\n\n // 设置 TTL\n await client.expire(key, this._config.serverTtl);\n\n // 添加到服务器集合\n await client.sadd(this._serversSetKey(), server.serverId);\n\n // 发布事件\n await this.publish({\n type: 'server:online',\n serverId: server.serverId,\n payload: server,\n timestamp: Date.now()\n });\n }\n\n async unregisterServer(serverId: string): Promise<void> {\n const client = this._ensureConnected();\n const key = this._serverKey(serverId);\n\n // 删除服务器信息\n await client.del(key);\n\n // 从服务器集合移除\n await client.srem(this._serversSetKey(), serverId);\n\n // 删除该服务器的所有房间\n const roomIds = await client.smembers(this._serverRoomsKey(serverId));\n for (const roomId of roomIds) {\n await this.unregisterRoom(roomId);\n }\n await client.del(this._serverRoomsKey(serverId));\n\n // 发布事件\n await this.publish({\n type: 'server:offline',\n serverId,\n payload: { serverId },\n timestamp: Date.now()\n });\n }\n\n async heartbeat(serverId: string): Promise<void> {\n const client = this._ensureConnected();\n const key = this._serverKey(serverId);\n\n // 更新心跳时间并刷新 TTL\n await client.hset(key, 'lastHeartbeat', String(Date.now()));\n await client.expire(key, this._config.serverTtl);\n }\n\n async getServers(): Promise<ServerRegistration[]> {\n const client = this._ensureConnected();\n const serverIds = await client.smembers(this._serversSetKey());\n\n const servers: ServerRegistration[] = [];\n for (const serverId of serverIds) {\n const server = await this.getServer(serverId);\n if (server && server.status === 'online') {\n servers.push(server);\n }\n }\n\n return servers;\n }\n\n async getServer(serverId: string): Promise<ServerRegistration | null> {\n const client = this._ensureConnected();\n const key = this._serverKey(serverId);\n const data = await client.hgetall(key);\n\n if (!data || !data.serverId) return null;\n\n return {\n serverId: data.serverId,\n address: data.address,\n port: parseInt(data.port, 10),\n roomCount: parseInt(data.roomCount, 10),\n playerCount: parseInt(data.playerCount, 10),\n capacity: parseInt(data.capacity, 10),\n status: data.status as ServerRegistration['status'],\n lastHeartbeat: parseInt(data.lastHeartbeat, 10),\n metadata: data.metadata ? JSON.parse(data.metadata) : {}\n };\n }\n\n async updateServer(serverId: string, updates: Partial<ServerRegistration>): Promise<void> {\n const client = this._ensureConnected();\n const key = this._serverKey(serverId);\n\n const args: (string | number)[] = [];\n if (updates.address !== undefined) args.push('address', updates.address);\n if (updates.port !== undefined) args.push('port', String(updates.port));\n if (updates.roomCount !== undefined) args.push('roomCount', String(updates.roomCount));\n if (updates.playerCount !== undefined) args.push('playerCount', String(updates.playerCount));\n if (updates.capacity !== undefined) args.push('capacity', String(updates.capacity));\n if (updates.status !== undefined) args.push('status', updates.status);\n if (updates.metadata !== undefined) args.push('metadata', JSON.stringify(updates.metadata));\n\n if (args.length > 0) {\n await client.hmset(key, ...args);\n }\n\n // 如果是 draining 状态,发布事件\n if (updates.status === 'draining') {\n await this.publish({\n type: 'server:draining',\n serverId,\n payload: { serverId },\n timestamp: Date.now()\n });\n }\n }\n\n // =========================================================================\n // 房间注册 | Room Registry\n // =========================================================================\n\n async registerRoom(room: RoomRegistration): Promise<void> {\n const client = this._ensureConnected();\n const key = this._roomKey(room.roomId);\n\n // 存储房间信息\n await client.hmset(\n key,\n 'roomId', room.roomId,\n 'roomType', room.roomType,\n 'serverId', room.serverId,\n 'serverAddress', room.serverAddress,\n 'playerCount', String(room.playerCount),\n 'maxPlayers', String(room.maxPlayers),\n 'isLocked', room.isLocked ? '1' : '0',\n 'metadata', JSON.stringify(room.metadata),\n 'createdAt', String(room.createdAt),\n 'updatedAt', String(room.updatedAt)\n );\n\n // 设置 TTL(如果配置了)\n if (this._config.roomTtl > 0) {\n await client.expire(key, this._config.roomTtl);\n }\n\n // 添加到房间集合\n await client.sadd(this._roomsSetKey(), room.roomId);\n\n // 添加到服务器的房间列表\n await client.sadd(this._serverRoomsKey(room.serverId), room.roomId);\n\n // 更新服务器房间计数\n const roomCount = (await client.smembers(this._serverRoomsKey(room.serverId))).length;\n await client.hset(this._serverKey(room.serverId), 'roomCount', String(roomCount));\n\n // 发布事件\n await this.publish({\n type: 'room:created',\n serverId: room.serverId,\n roomId: room.roomId,\n payload: { roomType: room.roomType },\n timestamp: Date.now()\n });\n }\n\n async unregisterRoom(roomId: string): Promise<void> {\n const client = this._ensureConnected();\n const room = await this.getRoom(roomId);\n if (!room) return;\n\n const key = this._roomKey(roomId);\n\n // 删除房间信息\n await client.del(key);\n\n // 从房间集合移除\n await client.srem(this._roomsSetKey(), roomId);\n\n // 从服务器的房间列表移除\n await client.srem(this._serverRoomsKey(room.serverId), roomId);\n\n // 更新服务器房间计数\n const roomCount = (await client.smembers(this._serverRoomsKey(room.serverId))).length;\n await client.hset(this._serverKey(room.serverId), 'roomCount', String(roomCount));\n\n // 删除快照\n await this.deleteSnapshot(roomId);\n\n // 发布事件\n await this.publish({\n type: 'room:disposed',\n serverId: room.serverId,\n roomId,\n payload: {},\n timestamp: Date.now()\n });\n }\n\n async updateRoom(roomId: string, updates: Partial<RoomRegistration>): Promise<void> {\n const client = this._ensureConnected();\n const room = await this.getRoom(roomId);\n if (!room) return;\n\n const key = this._roomKey(roomId);\n const args: (string | number)[] = [];\n\n if (updates.playerCount !== undefined) args.push('playerCount', String(updates.playerCount));\n if (updates.maxPlayers !== undefined) args.push('maxPlayers', String(updates.maxPlayers));\n if (updates.isLocked !== undefined) args.push('isLocked', updates.isLocked ? '1' : '0');\n if (updates.metadata !== undefined) args.push('metadata', JSON.stringify(updates.metadata));\n args.push('updatedAt', String(Date.now()));\n\n if (args.length > 0) {\n await client.hmset(key, ...args);\n }\n\n // 发布更新事件\n await this.publish({\n type: 'room:updated',\n serverId: room.serverId,\n roomId,\n payload: updates,\n timestamp: Date.now()\n });\n\n // 如果锁定状态变化,发布专门事件\n if (updates.isLocked !== undefined) {\n await this.publish({\n type: updates.isLocked ? 'room:locked' : 'room:unlocked',\n serverId: room.serverId,\n roomId,\n payload: {},\n timestamp: Date.now()\n });\n }\n }\n\n async getRoom(roomId: string): Promise<RoomRegistration | null> {\n const client = this._ensureConnected();\n const key = this._roomKey(roomId);\n const data = await client.hgetall(key);\n\n if (!data || !data.roomId) return null;\n\n return {\n roomId: data.roomId,\n roomType: data.roomType,\n serverId: data.serverId,\n serverAddress: data.serverAddress,\n playerCount: parseInt(data.playerCount, 10),\n maxPlayers: parseInt(data.maxPlayers, 10),\n isLocked: data.isLocked === '1',\n metadata: data.metadata ? JSON.parse(data.metadata) : {},\n createdAt: parseInt(data.createdAt, 10),\n updatedAt: parseInt(data.updatedAt, 10)\n };\n }\n\n async queryRooms(query: RoomQuery): Promise<RoomRegistration[]> {\n const client = this._ensureConnected();\n const roomIds = await client.smembers(this._roomsSetKey());\n\n let results: RoomRegistration[] = [];\n\n // 获取所有房间\n for (const roomId of roomIds) {\n const room = await this.getRoom(roomId);\n if (room) results.push(room);\n }\n\n // 过滤\n if (query.roomType) {\n results = results.filter(r => r.roomType === query.roomType);\n }\n if (query.hasSpace) {\n results = results.filter(r => r.playerCount < r.maxPlayers);\n }\n if (query.notLocked) {\n results = results.filter(r => !r.isLocked);\n }\n if (query.metadata) {\n results = results.filter(r => {\n for (const [key, value] of Object.entries(query.metadata!)) {\n if (r.metadata[key] !== value) return false;\n }\n return true;\n });\n }\n\n // 分页\n if (query.offset) {\n results = results.slice(query.offset);\n }\n if (query.limit) {\n results = results.slice(0, query.limit);\n }\n\n return results;\n }\n\n async findAvailableRoom(roomType: string): Promise<RoomRegistration | null> {\n const rooms = await this.queryRooms({\n roomType,\n hasSpace: true,\n notLocked: true,\n limit: 1\n });\n return rooms[0] ?? null;\n }\n\n async getRoomsByServer(serverId: string): Promise<RoomRegistration[]> {\n const client = this._ensureConnected();\n const roomIds = await client.smembers(this._serverRoomsKey(serverId));\n\n const rooms: RoomRegistration[] = [];\n for (const roomId of roomIds) {\n const room = await this.getRoom(roomId);\n if (room) rooms.push(room);\n }\n\n return rooms;\n }\n\n // =========================================================================\n // 房间状态 | Room State\n // =========================================================================\n\n async saveSnapshot(snapshot: RoomSnapshot): Promise<void> {\n const client = this._ensureConnected();\n const key = this._snapshotKey(snapshot.roomId);\n\n await client.set(key, JSON.stringify(snapshot));\n await client.expire(key, this._config.snapshotTtl);\n }\n\n async loadSnapshot(roomId: string): Promise<RoomSnapshot | null> {\n const client = this._ensureConnected();\n const key = this._snapshotKey(roomId);\n const data = await client.get(key);\n\n return data ? JSON.parse(data) : null;\n }\n\n async deleteSnapshot(roomId: string): Promise<void> {\n const client = this._ensureConnected();\n const key = this._snapshotKey(roomId);\n await client.del(key);\n }\n\n // =========================================================================\n // 发布/订阅 | Pub/Sub\n // =========================================================================\n\n async publish(event: DistributedEvent): Promise<void> {\n const client = this._ensureConnected();\n await client.publish(this._config.channel, JSON.stringify(event));\n }\n\n async subscribe(\n pattern: DistributedEventType | '*',\n handler: DistributedEventHandler\n ): Promise<Unsubscribe> {\n if (!this._handlers.has(pattern)) {\n this._handlers.set(pattern, new Set());\n }\n this._handlers.get(pattern)!.add(handler);\n\n return () => {\n const handlers = this._handlers.get(pattern);\n if (handlers) {\n handlers.delete(handler);\n if (handlers.size === 0) {\n this._handlers.delete(pattern);\n }\n }\n };\n }\n\n async sendToRoom(\n roomId: string,\n messageType: string,\n data: unknown,\n playerId?: string\n ): Promise<void> {\n const room = await this.getRoom(roomId);\n if (!room) return;\n\n await this.publish({\n type: 'room:message',\n serverId: room.serverId,\n roomId,\n payload: { messageType, data, playerId },\n timestamp: Date.now()\n });\n }\n\n private _dispatchEvent(event: DistributedEvent): void {\n // 通知通配符订阅者\n const wildcardHandlers = this._handlers.get('*');\n if (wildcardHandlers) {\n for (const handler of wildcardHandlers) {\n try {\n handler(event);\n } catch (error) {\n console.error('[RedisAdapter] Event handler error:', error);\n }\n }\n }\n\n // 通知类型匹配的订阅者\n const typeHandlers = this._handlers.get(event.type);\n if (typeHandlers) {\n for (const handler of typeHandlers) {\n try {\n handler(event);\n } catch (error) {\n console.error('[RedisAdapter] Event handler error:', error);\n }\n }\n }\n }\n\n // =========================================================================\n // 分布式锁 | Distributed Lock\n // =========================================================================\n\n async acquireLock(key: string, ttlMs: number): Promise<boolean> {\n const client = this._ensureConnected();\n const lockKey = this._lockKey(key);\n const token = `${Date.now()}_${Math.random().toString(36).substring(2)}`;\n const ttlSeconds = Math.ceil(ttlMs / 1000);\n\n const result = await client.set(lockKey, token, 'NX', 'EX', ttlSeconds);\n\n if (result === 'OK') {\n this._lockTokens.set(key, token);\n return true;\n }\n\n return false;\n }\n\n async releaseLock(key: string): Promise<void> {\n const client = this._ensureConnected();\n const lockKey = this._lockKey(key);\n const token = this._lockTokens.get(key);\n\n if (!token) return;\n\n await client.eval(RELEASE_LOCK_SCRIPT, 1, lockKey, token);\n this._lockTokens.delete(key);\n }\n\n async extendLock(key: string, ttlMs: number): Promise<boolean> {\n const client = this._ensureConnected();\n const lockKey = this._lockKey(key);\n const token = this._lockTokens.get(key);\n\n if (!token) return false;\n\n const result = await client.eval(EXTEND_LOCK_SCRIPT, 1, lockKey, token, String(ttlMs));\n return result === 1;\n }\n}\n\n/**\n * @zh 创建 Redis 适配器\n * @en Create Redis adapter\n */\nexport function createRedisAdapter(config: RedisAdapterConfig): RedisAdapter {\n return new RedisAdapter(config);\n}\n","/**\n * @zh 负载均衡路由器\n * @en Load-balanced router for server selection\n */\n\nimport type { ServerRegistration } from '../types.js';\n\n/**\n * @zh 负载均衡策略\n * @en Load balancing strategy\n */\nexport type LoadBalanceStrategy =\n | 'round-robin' // 轮询\n | 'least-rooms' // 最少房间\n | 'least-players' // 最少玩家\n | 'random' // 随机\n | 'weighted'; // 加权(基于剩余容量)\n\n/**\n * @zh 负载均衡路由器配置\n * @en Load-balanced router configuration\n */\nexport interface LoadBalancedRouterConfig {\n /**\n * @zh 负载均衡策略\n * @en Load balancing strategy\n * @default 'least-rooms'\n */\n strategy?: LoadBalanceStrategy;\n\n /**\n * @zh 本地服务器优先\n * @en Prefer local server\n * @default true\n */\n preferLocal?: boolean;\n\n /**\n * @zh 本地服务器优先阈值(0-1之间,表示本地服务器负载低于此比例时优先使用本地)\n * @en Local server preference threshold (0-1, prefer local if load is below this ratio)\n * @default 0.8\n */\n localPreferenceThreshold?: number;\n}\n\n/**\n * @zh 负载均衡路由器\n * @en Load-balanced router for selecting optimal server\n *\n * @example\n * ```typescript\n * const router = new LoadBalancedRouter({\n * strategy: 'least-rooms',\n * preferLocal: true\n * });\n *\n * const bestServer = router.selectServer(servers, 'server-1');\n * ```\n */\nexport class LoadBalancedRouter {\n private readonly _config: Required<LoadBalancedRouterConfig>;\n private _roundRobinIndex = 0;\n\n constructor(config: LoadBalancedRouterConfig = {}) {\n this._config = {\n strategy: config.strategy ?? 'least-rooms',\n preferLocal: config.preferLocal ?? true,\n localPreferenceThreshold: config.localPreferenceThreshold ?? 0.8\n };\n }\n\n /**\n * @zh 选择最优服务器\n * @en Select optimal server\n *\n * @param servers - 可用服务器列表 | Available servers\n * @param localServerId - 本地服务器 ID | Local server ID\n * @returns 最优服务器,如果没有可用服务器返回 null | Optimal server, or null if none available\n */\n selectServer(\n servers: ServerRegistration[],\n localServerId?: string\n ): ServerRegistration | null {\n // 过滤掉不可用的服务器\n const availableServers = servers.filter(s =>\n s.status === 'online' && s.roomCount < s.capacity\n );\n\n if (availableServers.length === 0) {\n return null;\n }\n\n // 本地服务器优先检查\n if (this._config.preferLocal && localServerId) {\n const localServer = availableServers.find(s => s.serverId === localServerId);\n if (localServer) {\n const loadRatio = localServer.roomCount / localServer.capacity;\n if (loadRatio < this._config.localPreferenceThreshold) {\n return localServer;\n }\n }\n }\n\n // 应用负载均衡策略\n switch (this._config.strategy) {\n case 'round-robin':\n return this._selectRoundRobin(availableServers);\n case 'least-rooms':\n return this._selectLeastRooms(availableServers);\n case 'least-players':\n return this._selectLeastPlayers(availableServers);\n case 'random':\n return this._selectRandom(availableServers);\n case 'weighted':\n return this._selectWeighted(availableServers);\n default:\n return this._selectLeastRooms(availableServers);\n }\n }\n\n /**\n * @zh 选择创建房间的最优服务器\n * @en Select optimal server for room creation\n */\n selectServerForCreation(\n servers: ServerRegistration[],\n localServerId?: string\n ): ServerRegistration | null {\n return this.selectServer(servers, localServerId);\n }\n\n /**\n * @zh 重置轮询索引\n * @en Reset round-robin index\n */\n resetRoundRobin(): void {\n this._roundRobinIndex = 0;\n }\n\n // =========================================================================\n // 私有方法 | Private Methods\n // =========================================================================\n\n private _selectRoundRobin(servers: ServerRegistration[]): ServerRegistration {\n const server = servers[this._roundRobinIndex % servers.length];\n this._roundRobinIndex++;\n return server;\n }\n\n private _selectLeastRooms(servers: ServerRegistration[]): ServerRegistration {\n return servers.reduce((best, current) =>\n current.roomCount < best.roomCount ? current : best\n );\n }\n\n private _selectLeastPlayers(servers: ServerRegistration[]): ServerRegistration {\n return servers.reduce((best, current) =>\n current.playerCount < best.playerCount ? current : best\n );\n }\n\n private _selectRandom(servers: ServerRegistration[]): ServerRegistration {\n return servers[Math.floor(Math.random() * servers.length)];\n }\n\n private _selectWeighted(servers: ServerRegistration[]): ServerRegistration {\n // 计算每个服务器的权重(剩余容量占比)\n const weights = servers.map(s => ({\n server: s,\n weight: (s.capacity - s.roomCount) / s.capacity\n }));\n\n // 计算总权重\n const totalWeight = weights.reduce((sum, w) => sum + w.weight, 0);\n\n // 随机选择(加权)\n let random = Math.random() * totalWeight;\n for (const { server, weight } of weights) {\n random -= weight;\n if (random <= 0) {\n return server;\n }\n }\n\n // 兜底返回第一个\n return servers[0];\n }\n}\n\n/**\n * @zh 创建负载均衡路由器\n * @en Create load-balanced router\n */\nexport function createLoadBalancedRouter(\n config?: LoadBalancedRouterConfig\n): LoadBalancedRouter {\n return new LoadBalancedRouter(config);\n}\n"]}
|
package/dist/testing/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Codec } from '@esengine/rpc/codec';
|
|
2
|
-
import { G as GameServer } from '../index-
|
|
3
|
-
import { R as Room, P as Player } from '../Room-
|
|
2
|
+
import { G as GameServer } from '../index-B1sr5YAl.js';
|
|
3
|
+
import { R as Room, P as Player } from '../Room-5owFVIFR.js';
|
|
4
4
|
import '@esengine/rpc';
|
|
5
5
|
import 'node:http';
|
|
6
6
|
|
package/dist/testing/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { createServer } from '../chunk-
|
|
1
|
+
import { createServer } from '../chunk-NWZLKNGV.js';
|
|
2
2
|
import { createLogger } from '../chunk-I4QQSQ72.js';
|
|
3
|
-
import { onMessage, Room } from '../chunk-
|
|
3
|
+
import { onMessage, Room } from '../chunk-T3QJOPNG.js';
|
|
4
4
|
import { __name, __publicField } from '../chunk-T626JPC7.js';
|
|
5
5
|
import WebSocket from 'ws';
|
|
6
6
|
import { json } from '@esengine/rpc/codec';
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { S as ServerConnection, A as ApiContext, M as MsgContext, G as GameServer } from './index-B1sr5YAl.js';
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* @zh 认证系统类型定义
|
|
@@ -308,4 +308,4 @@ interface RequireRoleOptions extends RequireAuthOptions {
|
|
|
308
308
|
mode?: 'any' | 'all';
|
|
309
309
|
}
|
|
310
310
|
|
|
311
|
-
export type { AuthResult as A, ConnectionRequest as C,
|
|
311
|
+
export type { AuthResult as A, ConnectionRequest as C, IAuthProvider as I, RequireAuthOptions as R, IAuthContext as a, AuthServerConfig as b, AuthGameServer as c, AuthRoomConfig as d, RequireRoleOptions as e, AuthErrorCode as f, AuthConnectionData as g, AuthConnection as h, AuthApiContext as i, AuthMsgContext as j };
|
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/room/Player.ts","../src/room/Room.ts","../src/room/decorators.ts"],"names":["Player","options","id","roomId","data","_conn","_sendFn","_leaveFn","conn","sendFn","leaveFn","initialData","connection","send","type","leave","reason","MESSAGE_HANDLERS","Room","maxPlayers","tickRate","autoDispose","state","_id","_players","Map","_locked","_disposed","_tickInterval","_lastTickTime","_broadcastFn","_disposeFn","players","Array","from","values","playerCount","size","isFull","isLocked","isDisposed","onCreate","onJoin","player","onLeave","onTick","dt","onDispose","broadcast","broadcastExcept","except","getPlayer","get","kick","lock","unlock","dispose","_stopTick","clear","_init","broadcastFn","disposeFn","_create","_startTick","_addPlayer","p","_removePlayer","set","delete","_handleMessage","playerId","handlers","handler","method","call","performance","now","setInterval","clearInterval","registerMessageHandler","target","push","onMessage","propertyKey","_descriptor"],"mappings":"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","file":"chunk-FACTBKJ3.js","sourcesContent":["/**\n * @zh 玩家类\n * @en Player class\n */\n\nimport type { Connection } from '@esengine/rpc';\n\n/**\n * @zh 玩家接口\n * @en Player interface\n */\nexport interface IPlayer<TData = Record<string, unknown>> {\n readonly id: string\n readonly roomId: string\n data: TData\n send<T>(type: string, data: T): void\n leave(reason?: string): void\n}\n\n/**\n * @zh 玩家实现\n * @en Player implementation\n */\nexport class Player<TData = Record<string, unknown>> implements IPlayer<TData> {\n readonly id: string;\n readonly roomId: string;\n data: TData;\n\n private _conn: Connection<any>;\n private _sendFn: (conn: Connection<any>, type: string, data: unknown) => void;\n private _leaveFn: (player: Player<TData>, reason?: string) => void;\n\n constructor(options: {\n id: string\n roomId: string\n conn: Connection<any>\n sendFn: (conn: Connection<any>, type: string, data: unknown) => void\n leaveFn: (player: Player<TData>, reason?: string) => void\n initialData?: TData\n }) {\n this.id = options.id;\n this.roomId = options.roomId;\n this._conn = options.conn;\n this._sendFn = options.sendFn;\n this._leaveFn = options.leaveFn;\n this.data = options.initialData ?? ({} as TData);\n }\n\n /**\n * @zh 获取底层连接\n * @en Get underlying connection\n */\n get connection(): Connection<any> {\n return this._conn;\n }\n\n /**\n * @zh 发送消息给玩家\n * @en Send message to player\n */\n send<T>(type: string, data: T): void {\n this._sendFn(this._conn, type, data);\n }\n\n /**\n * @zh 让玩家离开房间\n * @en Make player leave the room\n */\n leave(reason?: string): void {\n this._leaveFn(this, reason);\n }\n}\n","/**\n * @zh 房间基类\n * @en Room base class\n */\n\nimport { Player } from './Player.js';\n\n/**\n * @zh 房间配置\n * @en Room options\n */\nexport interface RoomOptions {\n [key: string]: unknown\n}\n\n/**\n * @zh 消息处理器元数据\n * @en Message handler metadata\n */\ninterface MessageHandlerMeta {\n type: string\n method: string\n}\n\n/**\n * @zh 消息处理器存储 key\n * @en Message handler storage key\n */\nconst MESSAGE_HANDLERS = Symbol('messageHandlers');\n\n/**\n * @zh 房间基类\n * @en Room base class\n *\n * @example\n * ```typescript\n * class GameRoom extends Room {\n * maxPlayers = 4\n * tickRate = 20\n *\n * onJoin(player: Player) {\n * this.broadcast('Joined', { id: player.id })\n * }\n *\n * @onMessage('Move')\n * handleMove(data: { x: number, y: number }, player: Player) {\n * // handle move\n * }\n * }\n * ```\n */\nexport abstract class Room<TState = any, TPlayerData = Record<string, unknown>> {\n // ========================================================================\n // 配置 | Configuration\n // ========================================================================\n\n /**\n * @zh 最大玩家数\n * @en Maximum players\n */\n maxPlayers = 16;\n\n /**\n * @zh Tick 速率(每秒),0 = 不自动 tick\n * @en Tick rate (per second), 0 = no auto tick\n */\n tickRate = 0;\n\n /**\n * @zh 空房间自动销毁\n * @en Auto dispose when empty\n */\n autoDispose = true;\n\n // ========================================================================\n // 状态 | State\n // ========================================================================\n\n /**\n * @zh 房间状态\n * @en Room state\n */\n state: TState = {} as TState;\n\n // ========================================================================\n // 内部属性 | Internal properties\n // ========================================================================\n\n private _id: string = '';\n private _players: Map<string, Player<TPlayerData>> = new Map();\n private _locked = false;\n private _disposed = false;\n private _tickInterval: ReturnType<typeof setInterval> | null = null;\n private _lastTickTime = 0;\n private _broadcastFn: ((type: string, data: unknown) => void) | null = null;\n private _sendFn: ((conn: any, type: string, data: unknown) => void) | null = null;\n private _disposeFn: (() => void) | null = null;\n\n // ========================================================================\n // 只读属性 | Readonly properties\n // ========================================================================\n\n /**\n * @zh 房间 ID\n * @en Room ID\n */\n get id(): string {\n return this._id;\n }\n\n /**\n * @zh 所有玩家\n * @en All players\n */\n get players(): ReadonlyArray<Player<TPlayerData>> {\n return Array.from(this._players.values());\n }\n\n /**\n * @zh 玩家数量\n * @en Player count\n */\n get playerCount(): number {\n return this._players.size;\n }\n\n /**\n * @zh 是否已满\n * @en Is full\n */\n get isFull(): boolean {\n return this._players.size >= this.maxPlayers;\n }\n\n /**\n * @zh 是否已锁定\n * @en Is locked\n */\n get isLocked(): boolean {\n return this._locked;\n }\n\n /**\n * @zh 是否已销毁\n * @en Is disposed\n */\n get isDisposed(): boolean {\n return this._disposed;\n }\n\n // ========================================================================\n // 生命周期 | Lifecycle\n // ========================================================================\n\n /**\n * @zh 房间创建时调用\n * @en Called when room is created\n */\n onCreate(options?: RoomOptions): void | Promise<void> {}\n\n /**\n * @zh 玩家加入时调用\n * @en Called when player joins\n */\n onJoin(player: Player<TPlayerData>): void | Promise<void> {}\n\n /**\n * @zh 玩家离开时调用\n * @en Called when player leaves\n */\n onLeave(player: Player<TPlayerData>, reason?: string): void | Promise<void> {}\n\n /**\n * @zh 游戏循环\n * @en Game tick\n */\n onTick(dt: number): void {}\n\n /**\n * @zh 房间销毁时调用\n * @en Called when room is disposed\n */\n onDispose(): void | Promise<void> {}\n\n // ========================================================================\n // 公共方法 | Public methods\n // ========================================================================\n\n /**\n * @zh 广播消息给所有玩家\n * @en Broadcast message to all players\n */\n broadcast<T>(type: string, data: T): void {\n for (const player of this._players.values()) {\n player.send(type, data);\n }\n }\n\n /**\n * @zh 广播消息给除指定玩家外的所有玩家\n * @en Broadcast message to all players except one\n */\n broadcastExcept<T>(except: Player<TPlayerData>, type: string, data: T): void {\n for (const player of this._players.values()) {\n if (player.id !== except.id) {\n player.send(type, data);\n }\n }\n }\n\n /**\n * @zh 获取玩家\n * @en Get player by id\n */\n getPlayer(id: string): Player<TPlayerData> | undefined {\n return this._players.get(id);\n }\n\n /**\n * @zh 踢出玩家\n * @en Kick player\n */\n kick(player: Player<TPlayerData>, reason?: string): void {\n player.leave(reason ?? 'kicked');\n }\n\n /**\n * @zh 锁定房间\n * @en Lock room\n */\n lock(): void {\n this._locked = true;\n }\n\n /**\n * @zh 解锁房间\n * @en Unlock room\n */\n unlock(): void {\n this._locked = false;\n }\n\n /**\n * @zh 手动销毁房间\n * @en Manually dispose room\n */\n dispose(): void {\n if (this._disposed) return;\n this._disposed = true;\n\n this._stopTick();\n\n for (const player of this._players.values()) {\n player.leave('room_disposed');\n }\n this._players.clear();\n\n this.onDispose();\n this._disposeFn?.();\n }\n\n // ========================================================================\n // 内部方法 | Internal methods\n // ========================================================================\n\n /**\n * @internal\n */\n _init(options: {\n id: string\n sendFn: (conn: any, type: string, data: unknown) => void\n broadcastFn: (type: string, data: unknown) => void\n disposeFn: () => void\n }): void {\n this._id = options.id;\n this._sendFn = options.sendFn;\n this._broadcastFn = options.broadcastFn;\n this._disposeFn = options.disposeFn;\n }\n\n /**\n * @internal\n */\n async _create(options?: RoomOptions): Promise<void> {\n await this.onCreate(options);\n this._startTick();\n }\n\n /**\n * @internal\n */\n async _addPlayer(id: string, conn: any): Promise<Player<TPlayerData> | null> {\n if (this._locked || this.isFull || this._disposed) {\n return null;\n }\n\n const player = new Player<TPlayerData>({\n id,\n roomId: this._id,\n conn,\n sendFn: this._sendFn!,\n leaveFn: (p, reason) => this._removePlayer(p.id, reason)\n });\n\n this._players.set(id, player);\n await this.onJoin(player);\n\n return player;\n }\n\n /**\n * @internal\n */\n async _removePlayer(id: string, reason?: string): Promise<void> {\n const player = this._players.get(id);\n if (!player) return;\n\n this._players.delete(id);\n await this.onLeave(player, reason);\n\n if (this.autoDispose && this._players.size === 0) {\n this.dispose();\n }\n }\n\n /**\n * @internal\n */\n _handleMessage(type: string, data: unknown, playerId: string): void {\n const player = this._players.get(playerId);\n if (!player) return;\n\n const handlers = (this.constructor as any)[MESSAGE_HANDLERS] as MessageHandlerMeta[] | undefined;\n if (handlers) {\n for (const handler of handlers) {\n if (handler.type === type) {\n const method = (this as any)[handler.method];\n if (typeof method === 'function') {\n method.call(this, data, player);\n }\n }\n }\n }\n }\n\n private _startTick(): void {\n if (this.tickRate <= 0) return;\n\n this._lastTickTime = performance.now();\n this._tickInterval = setInterval(() => {\n const now = performance.now();\n const dt = (now - this._lastTickTime) / 1000;\n this._lastTickTime = now;\n this.onTick(dt);\n }, 1000 / this.tickRate);\n }\n\n private _stopTick(): void {\n if (this._tickInterval) {\n clearInterval(this._tickInterval);\n this._tickInterval = null;\n }\n }\n}\n\n/**\n * @zh 获取消息处理器元数据\n * @en Get message handler metadata\n */\nexport function getMessageHandlers(target: any): MessageHandlerMeta[] {\n return target[MESSAGE_HANDLERS] || [];\n}\n\n/**\n * @zh 注册消息处理器元数据\n * @en Register message handler metadata\n */\nexport function registerMessageHandler(target: any, type: string, method: string): void {\n if (!target[MESSAGE_HANDLERS]) {\n target[MESSAGE_HANDLERS] = [];\n }\n target[MESSAGE_HANDLERS].push({ type, method });\n}\n","/**\n * @zh 房间装饰器\n * @en Room decorators\n */\n\nimport { registerMessageHandler } from './Room.js';\n\n/**\n * @zh 消息处理器装饰器\n * @en Message handler decorator\n *\n * @example\n * ```typescript\n * class GameRoom extends Room {\n * @onMessage('Move')\n * handleMove(data: { x: number, y: number }, player: Player) {\n * // handle move\n * }\n *\n * @onMessage('Chat')\n * handleChat(data: { text: string }, player: Player) {\n * this.broadcast('Chat', { from: player.id, text: data.text })\n * }\n * }\n * ```\n */\nexport function onMessage(type: string): MethodDecorator {\n return function (\n target: any,\n propertyKey: string | symbol,\n _descriptor: PropertyDescriptor\n ) {\n registerMessageHandler(target.constructor, type, propertyKey as string);\n };\n}\n"]}
|