diff --git a/apps/server/src/core/Connection.ts b/apps/server/src/core/Connection.ts index b9372f1..27a1396 100644 --- a/apps/server/src/core/Connection.ts +++ b/apps/server/src/core/Connection.ts @@ -1,83 +1,82 @@ -import WebSocket from "ws"; -import { EventEmitter } from "stream"; -import { MyServer } from "./MyServer"; -import { getTime, buffer2ArrayBuffer } from "../Utils"; -import { ApiMsgEnum, IModel } from "../Common"; -import { binaryEncode, binaryDecode } from "../Common/Binary"; +import WebSocket from "ws" +import { EventEmitter } from "stream" +import { MyServer } from "./MyServer" +import { getTime, buffer2ArrayBuffer } from "../Utils" +import { ApiMsgEnum, IModel } from "../Common" +import { binaryEncode, binaryDecode } from "../Common/Binary" export enum ConnectionEventEnum { Close = "Close", } interface IItem { - cb: Function; - ctx: unknown; + cb: Function + ctx: unknown } export class Connection extends EventEmitter { - server: MyServer; - ws: WebSocket; - msgMap: Map> = new Map(); - playerId?: number; + server: MyServer + ws: WebSocket + msgMap: Map> = new Map() constructor(server: MyServer, ws: WebSocket) { - super(); + super() - this.server = server; - this.ws = ws; + this.server = server + this.ws = ws this.ws.on("close", (code: number, reason: Buffer) => { - this.emit(ConnectionEventEnum.Close, code, reason.toString()); - }); + this.emit(ConnectionEventEnum.Close, code, reason.toString()) + }) this.ws.on("message", (buffer: Buffer) => { // const str = buffer.toString() try { - const json = binaryDecode(buffer2ArrayBuffer(buffer)); - const { name, data } = json; + const json = binaryDecode(buffer2ArrayBuffer(buffer)) + const { name, data } = json // console.log(`${getTime()}接收|字节数${buffer.length}|${this.playerId || -1}|${str}`) - console.log(`${getTime()}接收|字节数${buffer.length}|${this.playerId || -1}|${JSON.stringify(json)}`); + console.log(`${getTime()}接收|字节数${buffer.length}|${this.playerId || -1}|${JSON.stringify(json)}`) if (this.server.apiMap.has(name)) { try { - const cb = this.server.apiMap.get(name); - const res = cb.call(null, this, data); + const cb = this.server.apiMap.get(name) + const res = cb.call(null, this, data) this.sendMsg(name, { success: true, res, - }); + }) } catch (error) { this.sendMsg(name, { success: false, error: (error as Error)?.message, - }); + }) } } else { try { if (this.msgMap.has(name)) { - this.msgMap.get(name).forEach(({ cb, ctx }) => cb.call(ctx, this, data)); + this.msgMap.get(name).forEach(({ cb, ctx }) => cb.call(ctx, this, data)) } } catch (error) { - console.log(error); + console.log(error) } } } catch (error) { - console.log(`解析失败,不是合法的JSON格式:`, error); + console.log(`解析失败,不是合法的JSON格式:`, error) } - }); + }) } listenMsg(name: T, cb: (connection: Connection, arg: IModel["msg"][T]) => void, ctx: unknown) { if (this.msgMap.has(name)) { - this.msgMap.get(name).push({ cb, ctx }); + this.msgMap.get(name).push({ cb, ctx }) } else { - this.msgMap.set(name, [{ cb, ctx }]); + this.msgMap.set(name, [{ cb, ctx }]) } } unlistenMsg(name: T, cb: (connection: Connection, arg: IModel["msg"][T]) => void, ctx: unknown) { if (this.msgMap.has(name)) { - const items = this.msgMap.get(name); - const index = items.findIndex((i) => cb === i.cb && i.ctx === ctx); - index > -1 && items.splice(index, 1); + const items = this.msgMap.get(name) + const index = items.findIndex((i) => cb === i.cb && i.ctx === ctx) + index > -1 && items.splice(index, 1) } } @@ -85,14 +84,14 @@ export class Connection extends EventEmitter { const msg = JSON.stringify({ name, data, - }); - const view = binaryEncode(name, data); - const buffer = Buffer.from(view.buffer); + }) + const view = binaryEncode(name, data) + const buffer = Buffer.from(view.buffer) console.log( `${getTime()}发送|字节数${buffer.length}|${this.playerId || -1}|内存${(process.memoryUsage().heapUsed / 1024 / 1024).toFixed( 2 )}MB|${msg}` - ); - this.ws.send(buffer); + ) + this.ws.send(buffer) } } diff --git a/apps/server/src/index.ts b/apps/server/src/index.ts index a70900f..3e504b1 100644 --- a/apps/server/src/index.ts +++ b/apps/server/src/index.ts @@ -1,7 +1,7 @@ -import { Connection, MyServer, MyServerEventEnum } from "./Core"; -import PlayerManager from "./Biz/PlayerManager"; -import RoomManager from "./Biz/RoomManager"; -import { getTime, symlinkCommon } from "./Utils"; +import { Connection, MyServer, MyServerEventEnum } from "./Core" +import PlayerManager from "./Biz/PlayerManager" +import RoomManager from "./Biz/RoomManager" +import { getTime, symlinkCommon } from "./Utils" import { ApiMsgEnum, IApiGameEndReq, @@ -21,145 +21,151 @@ import { IApiRoomListReq, IApiRoomListRes, IModel, -} from "./Common"; +} from "./Common" -const server = new MyServer({ port: 8888 }); +declare module "./Core" { + interface Connection { + playerId?: number + } +} + +const server = new MyServer({ port: 8888 }) // event server.on(MyServerEventEnum.Connect, (connection: Connection) => { - console.log(`${getTime()}来人|人数|${server.connections.size}`); -}); + console.log(`${getTime()}来人|人数|${server.connections.size}`) +}) server.on(MyServerEventEnum.DisConnect, (connection: Connection) => { - console.log(`${getTime()}走人|人数|${server.connections.size}`); + console.log(`${getTime()}走人|人数|${server.connections.size}`) if (connection.playerId) { - PlayerManager.Instance.removePlayer(connection.playerId); + PlayerManager.Instance.removePlayer(connection.playerId) } -}); +}) // api server.setApi(ApiMsgEnum.ApiPlayerList, (connection: Connection, data: IApiPlayerListReq): IApiPlayerListRes => { - return { list: PlayerManager.Instance.getPlayersView() }; -}); + return { list: PlayerManager.Instance.getPlayersView() } +}) server.setApi(ApiMsgEnum.ApiPlayerJoin, (connection: Connection, { nickname }: IApiPlayerJoinReq): IApiPlayerJoinRes => { - const player = PlayerManager.Instance.createPlayer({ connection, nickname }); - PlayerManager.Instance.syncPlayers(); + const player = PlayerManager.Instance.createPlayer({ connection, nickname }) + PlayerManager.Instance.syncPlayers() return { player: PlayerManager.Instance.getPlayerView(player), - }; -}); + } +}) server.setApi(ApiMsgEnum.ApiRoomList, (connection: Connection, data: IApiRoomListReq): IApiRoomListRes => { - return { list: RoomManager.Instance.getRoomsView() }; -}); + return { list: RoomManager.Instance.getRoomsView() } +}) server.setApi(ApiMsgEnum.ApiRoomCreate, (connection: Connection, data: IApiRoomCreateReq): IApiRoomCreateRes => { if (connection.playerId) { - const room = RoomManager.Instance.joinRoom(RoomManager.Instance.createRoom().id, connection.playerId); + const room = RoomManager.Instance.joinRoom(RoomManager.Instance.createRoom().id, connection.playerId) if (room) { - RoomManager.Instance.syncRooms(); - PlayerManager.Instance.syncPlayers(); + RoomManager.Instance.syncRooms() + PlayerManager.Instance.syncPlayers() return { room: RoomManager.Instance.getRoomView(room), - }; + } } else { - throw new Error("ApiRoomCreate room不存在"); + throw new Error("ApiRoomCreate room不存在") } } else { - throw new Error("ApiRoomCreate 玩家未登录"); + throw new Error("ApiRoomCreate 玩家未登录") } -}); +}) server.setApi(ApiMsgEnum.ApiRoomJoin, (connection: Connection, data: IApiRoomJoinReq): IApiRoomJoinRes => { if (connection.playerId) { - const room = RoomManager.Instance.joinRoom(data.rid, connection.playerId); + const room = RoomManager.Instance.joinRoom(data.rid, connection.playerId) if (room) { - RoomManager.Instance.syncRooms(); - PlayerManager.Instance.syncPlayers(); - RoomManager.Instance.syncRoom(room.id); + RoomManager.Instance.syncRooms() + PlayerManager.Instance.syncPlayers() + RoomManager.Instance.syncRoom(room.id) return { room: RoomManager.Instance.getRoomView(room), - }; + } } else { - throw new Error("ApiRoomJoin room不存在"); + throw new Error("ApiRoomJoin room不存在") } } else { - throw new Error("ApiRoomJoin 玩家未登录"); + throw new Error("ApiRoomJoin 玩家未登录") } -}); +}) server.setApi(ApiMsgEnum.ApiRoomLeave, (connection: Connection, data: IApiRoomLeaveReq): IApiRoomLeaveRes => { if (connection.playerId) { - const player = PlayerManager.Instance.getPlayerById(connection.playerId); + const player = PlayerManager.Instance.getPlayerById(connection.playerId) if (player) { - const rid = player.rid; + const rid = player.rid if (rid) { - RoomManager.Instance.leaveRoom(rid, player.id); - PlayerManager.Instance.syncPlayers(); - RoomManager.Instance.syncRooms(); - RoomManager.Instance.syncRoom(rid); - return {}; + RoomManager.Instance.leaveRoom(rid, player.id) + PlayerManager.Instance.syncPlayers() + RoomManager.Instance.syncRooms() + RoomManager.Instance.syncRoom(rid) + return {} } else { - throw new Error("ApiRoomLeave 玩家不在房间"); + throw new Error("ApiRoomLeave 玩家不在房间") } } else { - throw new Error("ApiRoomLeave 玩家不存在"); + throw new Error("ApiRoomLeave 玩家不存在") } } else { - throw new Error("ApiRoomLeave 玩家未登录"); + throw new Error("ApiRoomLeave 玩家未登录") } -}); +}) server.setApi(ApiMsgEnum.ApiGameStart, (connection: Connection, data: IApiGameStartReq): IApiGameStartRes => { if (connection.playerId) { - const player = PlayerManager.Instance.getPlayerById(connection.playerId); + const player = PlayerManager.Instance.getPlayerById(connection.playerId) if (player) { - const rid = player.rid; + const rid = player.rid if (rid) { - RoomManager.Instance.startRoom(rid); - PlayerManager.Instance.syncPlayers(); - RoomManager.Instance.syncRooms(); - return {}; + RoomManager.Instance.startRoom(rid) + PlayerManager.Instance.syncPlayers() + RoomManager.Instance.syncRooms() + return {} } else { - throw new Error("ApiRoomLeave 玩家不在房间"); + throw new Error("ApiRoomLeave 玩家不在房间") } } else { - throw new Error("ApiRoomLeave 玩家不存在"); + throw new Error("ApiRoomLeave 玩家不存在") } } else { - throw new Error("ApiRoomLeave 玩家未登录"); + throw new Error("ApiRoomLeave 玩家未登录") } -}); +}) server.setApi(ApiMsgEnum.ApiGameEnd, (connection: Connection, data: IApiGameEndReq): IApiGameEndRes => { if (connection.playerId) { - const player = PlayerManager.Instance.getPlayerById(connection.playerId); + const player = PlayerManager.Instance.getPlayerById(connection.playerId) if (player) { - const rid = player.rid; + const rid = player.rid if (rid) { - RoomManager.Instance.closeRoom(rid); - PlayerManager.Instance.syncPlayers(); - RoomManager.Instance.syncRooms(); - return {}; + RoomManager.Instance.closeRoom(rid) + PlayerManager.Instance.syncPlayers() + RoomManager.Instance.syncRooms() + return {} } else { - throw new Error("ApiGameEnd 玩家不在房间"); + throw new Error("ApiGameEnd 玩家不在房间") } } else { - throw new Error("ApiGameEnd 玩家不存在"); + throw new Error("ApiGameEnd 玩家不存在") } } else { - throw new Error("ApiGameEnd 玩家未登录"); + throw new Error("ApiGameEnd 玩家未登录") } -}); +}) // start!! server .start() .then(() => { - symlinkCommon(); - console.log("服务启动!"); + symlinkCommon() + console.log("服务启动!") }) .catch((e) => { - console.log("服务异常", e); - }); + console.log("服务异常", e) + })