diff --git a/.changeset/fix-room-define-timing.md b/.changeset/fix-room-define-timing.md new file mode 100644 index 00000000..36366c7a --- /dev/null +++ b/.changeset/fix-room-define-timing.md @@ -0,0 +1,13 @@ +--- +"@esengine/server": patch +--- + +fix: allow define() to be called before start() + +Previously, calling `server.define()` before `server.start()` would throw an error because `roomManager` was initialized inside `start()`. This fix moves the `roomManager` initialization to `createServer()`, allowing the expected usage pattern: + +```typescript +const server = await createServer({ port: 3000 }) +server.define('world', WorldRoom) // Now works correctly +await server.start() +``` diff --git a/packages/framework/server/src/core/server.ts b/packages/framework/server/src/core/server.ts index 3a8cfe07..8569416d 100644 --- a/packages/framework/server/src/core/server.ts +++ b/packages/framework/server/src/core/server.ts @@ -91,8 +91,10 @@ export async function createServer(config: ServerConfig = {}): Promise | null = null let rpcServer: RpcServer> | null = null - // 房间管理器 - let roomManager: RoomManager | null = null + // 房间管理器(立即初始化,以便 define() 可在 start() 前调用) + const roomManager = new RoomManager((conn, type, data) => { + rpcServer?.send(conn, 'RoomMessage' as any, { type, data } as any) + }) // 构建 API 处理器映射 const apiMap: Record = {} @@ -108,7 +110,7 @@ export async function createServer(config: ServerConfig = {}): Promise @@ -127,18 +129,10 @@ export async function createServer(config: ServerConfig = {}): Promise unknown): void { - if (!roomManager) { - throw new Error('Server not started. Call define() after createServer().') - } roomManager.define(name, roomClass as RoomClass) }, async start() { - // 初始化房间管理器 - roomManager = new RoomManager((conn, type, data) => { - rpcServer?.send(conn, 'RoomMessage' as any, { type, data } as any) - }) - // 构建 API handlers const apiHandlersObj: Record Promise> = {} @@ -151,7 +145,7 @@ export async function createServer(config: ServerConfig = {}): Promise { - await roomManager!.leave(conn.id) + await roomManager.leave(conn.id) return { success: true } } @@ -192,7 +186,7 @@ export async function createServer(config: ServerConfig = {}): Promise { const { type, payload } = data as { type: string; payload: unknown } - roomManager!.handleMessage(conn.id, type, payload) + roomManager.handleMessage(conn.id, type, payload) } // 文件路由消息