tiaoom 0.0.24 → 0.0.26
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/package.json +1 -1
- package/src/client.cjs +1 -1
- package/src/client.cjs.map +1 -1
- package/src/client.d.cts +1 -0
- package/src/client.d.mts +1 -0
- package/src/client.iife.js +1 -1
- package/src/client.iife.js.map +1 -1
- package/src/client.mjs +1 -1
- package/src/client.mjs.map +1 -1
- package/src/index.cjs +74 -49
- package/src/index.cjs.map +1 -1
- package/src/index.d.cts +12 -19
- package/src/index.d.mts +12 -19
- package/src/index.mjs +74 -49
- package/src/index.mjs.map +1 -1
package/src/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","names":["EventEmitter","EventEmitter","player","EventEmitter","room"],"sources":["../lib/models/message.ts","../lib/models/player.ts","../lib/models/room.ts","../lib/index.ts"],"sourcesContent":["import EventEmitter from \"events\";\nimport { IPlayer, IPlayerOptions } from \"./player\";\nimport { IRoom, IRoomPlayer, IRoomOptions } from \"./room\";\nimport { IMessageEmitterEvents, IMessageEvents } from \"@lib/events/message\";\n\n/**\n * 消息包类型枚举\n * player: 'command', 'message', 'join', 'leave', 'status'\n */\nexport enum MessageTypes {\n /**\n * 连接准备就绪事件\n */\n SysReady = \"sys.ready\",\n /**\n * 连接关闭事件\n */\n SysClose = \"sys.close\",\n /**\n * 错误事件\n */\n SysError = \"sys.error\",\n /**\n * 全局错误\n */\n GlobalError = \"global.error\",\n /**\n * 房间列表\n */\n RoomList = \"room.list\",\n /**\n * 房间创建\n */\n RoomCreate = \"room.create\",\n /**\n * 房间更新\n */\n RoomUpdate = \"room.update\",\n /**\n * 房间开始\n */\n RoomStart = \"room.start\",\n /**\n * 房间结束\n */\n RoomEnd = \"room.end\",\n /**\n * 房间关闭\n */\n RoomClose = \"room.close\",\n /**\n * 房间全部玩家已准备\n */\n RoomAllReady = \"room.all-ready\",\n /**\n * 房间命令\n */\n RoomCommand = \"room.command\",\n /**\n * 房间内玩家发送的指令\n */\n RoomPlayerCommand = \"room.player-command\",\n /**\n * 房间消息\n */\n RoomMessage = \"room.message\",\n /**\n * 玩家加入房间\n */\n RoomJoin = \"room.join\",\n /**\n * 玩家离开房间\n */\n RoomLeave = \"room.leave\",\n /**\n * 房间玩家准备\n */\n RoomPlayerReady = \"room.player-ready\",\n /**\n * 房间玩家取消准备\n */\n RoomPlayerUnready = \"room.player-unready\",\n /**\n * 玩家列表\n */\n PlayerList = \"player.list\",\n /**\n * 玩家登录\n */\n PlayerLogin = \"player.login\",\n /**\n * 玩家登出\n */\n PlayerLogout = \"player.logout\",\n /**\n * *玩家消息\n */\n PlayerMessage = \"player.message\",\n /**\n * *玩家命令\n */\n PlayerCommand = \"player.command\",\n /**\n * 玩家错误信息\n */\n PlayerError = \"player.error\",\n /**\n * 全局消息\n */\n GlobalMessage = \"global.message\",\n /**\n * 全局命令\n */\n GlobalCommand = \"global.command\",\n}\n\n/**\n * 客户端发送消息包类型枚举\n * player: 'command', 'message', 'join', 'leave', 'status'\n */\nexport enum RecvMessageTypes {\n /**\n * 房间列表\n */\n RoomList = \"room.list\",\n /**\n * 玩家列表\n */\n PlayerList = \"player.list\",\n /**\n * 房间创建\n */\n RoomCreate = \"room.create\",\n /**\n * 玩家加入房间\n */\n PlayerJoin = \"player.join\",\n /**\n * 玩家离开房间\n */\n PlayerLeave = \"player.leave\",\n /**\n * 玩家离开座位\n */\n PlayerStandUp = \"player.standup\",\n /**\n * 房间获取\n */\n RoomGet = \"room.get\",\n /**\n * 房间开始\n */\n RoomStart = \"room.start\",\n /**\n * 房间踢出玩家\n */\n RoomKick = \"room.kick\",\n /**\n * 房间转移\n */\n RoomTransfer = \"room.transfer\",\n /**\n * 房间关闭\n */\n RoomClose = \"room.close\", \n /**\n * 玩家登录\n */\n PlayerLogin = \"player.login\",\n /**\n * 玩家登出\n */\n PlayerLogout = \"player.logout\",\n /**\n * 玩家准备\n */\n PlayerReady = \"player.ready\",\n /**\n * 玩家取消准备\n */\n PlayerUnready = \"player.unready\",\n /**\n * 房间内玩家发送的指令\n */\n RoomPlayerCommand = \"room.player-command\",\n /**\n * 全局命令\n */\n GlobalCommand = \"global.command\",\n}\n\n/**\n * 消息包接口\n */\nexport interface IMessagePackage {\n /**\n * 消息类型\n */\n type: MessageTypes;\n /**\n * 消息数据\n */\n data?: IPlayerOptions | IRoomOptions | IPlayer | IRoom | IRoomPlayer | any\n /**\n * 发送者信息\n */\n sender?: IPlayer | IRoomPlayer | IRoom;\n}\n\n/**\n * 消息数据接口,包含发送者信息\n */\nexport interface IMessageData extends IMessagePackage {\n sender: IPlayer | IRoomPlayer | IRoom;\n}\n\n/**\n * 消息通信接口\n */\nexport interface IMessage extends EventEmitter<IMessageEmitterEvents> {\n /**\n * 监听消息事件\n * @param event 事件名,具体见 MessageEvents\n * @param listener 监听器\n */\n on<K extends keyof IMessageEvents>(event: K, listener: IMessageEvents[K]): this;\n /**\n * 触发消息事件\n * @param event 事件名,具体见 MessageEvents\n * @param args 参数\n */\n emit<K extends keyof IMessageEvents>(event: K, ...args: Parameters<IMessageEvents[K]>): boolean;\n /**\n * 关闭连接\n */\n close(): void;\n /**\n * 发送消息包\n * @param message 消息包\n */\n send(message: IMessagePackage): void;\n}\n","import { PlayerEvents } from \"@lib/events/player\";\nimport EventEmitter from \"events\";\n\n/**\n * 玩家选项接口\n */\nexport interface IPlayerOptions {\n /**\n * 玩家ID\n */\n id: string;\n /**\n * 玩家名称\n */\n name: string;\n /**\n * 玩家属性\n */\n attributes?: any;\n /**\n * 发送者函数\n */\n sender?: (type: string, ...message: any) => void;\n}\n\n/**\n * 玩家状态枚举\n */\nexport enum PlayerStatus {\n /**\n * 已准备\n */\n ready = 'ready',\n /**\n * 未准备\n */\n unready = 'unready',\n /**\n * 在线\n */\n online = 'online',\n /**\n * 游戏中\n */\n playing = 'playing',\n}\n\n/**\n * 玩家接口\n */\nexport interface IPlayer extends IPlayerOptions {\n /**\n * 玩家状态\n */\n status: PlayerStatus;\n}\n\n/**\n * 玩家\n */\nexport class Player extends EventEmitter implements IPlayer {\n /**\n * 监听玩家事件\n * @param event 事件名,具体见 PlayEvents\n * @param listener 监听器\n * @returns this\n */\n on<K extends keyof PlayerEvents>(event: K, listener: PlayerEvents[K]): this {\n return super.on(event, listener);\n }\n\n /**\n * 触发玩家事件\n * @param event 事件名,具体见 PlayEvents\n * @param args 参数\n * @returns 是否有监听器被触发\n */\n emit<K extends keyof PlayerEvents>(event: K, ...args: Parameters<PlayerEvents[K]>): boolean {\n return super.emit(event, ...args);\n }\n \n id: string = \"\";\n name: string = \"\";\n attributes?: any;\n status: PlayerStatus = PlayerStatus.online;\n sender?: (type: string, ...message: any) => void;\n\n constructor({ id = new Date().getTime().toString(), name = '', attributes, sender }: IPlayerOptions) {\n super();\n this.id = id;\n this.name = name;\n this.attributes = attributes;\n this.sender = sender;\n\n this.on('status', (status: PlayerStatus) => {\n this.status = status;\n });\n \n const events: Array<keyof PlayerEvents> = ['command', 'message', 'status'];\n events.forEach((event) => {\n this.on(event, (...data: any) => {\n this.sender?.(event, ...data);\n });\n }); \n }\n\n toJSON() {\n return {\n id: this.id,\n name: this.name,\n attributes: this.attributes,\n status: this.status,\n };\n }\n\n toString() {\n return JSON.stringify(this.toJSON());\n }\n\n /**\n * 设置发送者函数\n * @param {(type: string, ...message: any) => void} sender 发送者函数\n * @returns this\n */\n setSender(sender: (type: string, ...message: any) => void) {\n this.sender = sender;\n return this;\n }\n}","import { IPlayer, Player, IPlayerOptions, PlayerStatus } from \"./player\";\nimport EventEmitter from \"events\";\nimport { RoomEvents } from \"@lib/events\";\n\n/**\n * 房间选项接口\n */\nexport interface IRoomOptions {\n /**\n * 房间号\n */\n id: string, \n /**\n * 房间名称\n */\n name: string,\n /**\n * 房间容量\n */\n size: number, \n /**\n * 最小容量\n */\n minSize: number,\n /**\n * 其他属性\n */\n attrs?: Record<string, any>,\n}\n\n/**\n * 房间玩家角色\n */\nexport enum PlayerRole {\n /**\n * 玩家\n */\n player = 'player',\n /**\n * 观众\n */\n watcher = 'watcher',\n}\n\n/**\n * 房间状态\n */\nexport enum RoomStatus {\n /**\n * 等待中\n */\n waiting = 'waiting',\n /**\n * 已准备\n */\n ready = 'ready',\n /**\n * 游戏中\n */\n playing = 'playing',\n}\n\n/**\n * 房间接口\n */\nexport interface IRoom extends IRoomOptions {\n /**\n * 房间玩家列表\n */\n players: RoomPlayer[];\n}\n\n/**\n * 房间玩家选项接口\n */\nexport interface IRoomPlayerOptions extends IPlayerOptions {\n /**\n * 房间Id\n */\n roomId?: string;\n}\n\n/**\n * 房间玩家接口\n */\nexport interface IRoomPlayer extends IRoomPlayerOptions, IPlayer {\n /**\n * 是否已准备\n */\n isReady: boolean;\n /**\n * 玩家角色\n */\n role: PlayerRole;\n /**\n * 是否为房主\n */\n isCreator: boolean;\n}\n\n/**\n * 房间玩家\n */\nexport class RoomPlayer extends Player implements IRoomPlayer {\n isReady: boolean = false;\n role: PlayerRole = PlayerRole.player;\n isCreator: boolean = false;\n roomId?: string;\n\n constructor(player: IPlayer | Player, role: PlayerRole = PlayerRole.player) {\n super(player);\n this.role = role;\n if (player instanceof Player && player.sender) super.setSender(player.sender);\n }\n\n toJSON() {\n return {\n ...super.toJSON(),\n role: this.role,\n isReady: this.isReady,\n isCreator: this.isCreator,\n };\n }\n}\n\n/**\n * 房间\n */\nexport class Room extends EventEmitter implements IRoom {\n /**\n * 监听房间事件\n * @param event 事件名,具体见 RoomEvents\n * @param listener 监听器\n * @returns this\n */\n on<K extends keyof RoomEvents>(event: K, listener: RoomEvents[K]): this {\n return super.on(event, listener);\n }\n\n /**\n * 触发房间事件\n * @param event 事件名,具体见 RoomEvents\n * @param args 参数\n * @returns 是否有监听器被触发\n */\n emit<K extends keyof RoomEvents>(event: K, ...args: Parameters<RoomEvents[K]>): boolean {\n return super.emit(event, ...args);\n }\n\n id: string;\n size: number = 10;\n name: string = '';\n minSize: number = 2;\n attrs?: Record<string, any>;\n players: RoomPlayer[] = [];\n\n /**\n * 有效玩家列表(非观众)\n */\n get validPlayers() {\n return this.players.filter((player) => player.role === PlayerRole.player);\n }\n\n /**\n * 观众列表\n */\n get watchers() {\n return this.players.filter((player) => player.role === PlayerRole.watcher);\n }\n\n /**\n * 消息发送器\n */\n private sender?: (type: string, ...message: any) => void;\n\n /**\n * 房间玩家是否已准备好\n */\n get isReady(): boolean {\n return this.players.length >= this.minSize\n && this.players.every((target) => target.isReady || target.role === PlayerRole.watcher); // is all player ready\n }\n\n /**\n * 房间状态\n */\n get status(): RoomStatus {\n if (!this.isReady) return RoomStatus.waiting;\n if (this.players.findIndex((target) => target.status === PlayerStatus.playing) != -1) return RoomStatus.playing;\n return RoomStatus.ready;\n }\n\n /**\n * 房间是否在游戏中\n */\n get isPlaying(): boolean {\n return this.status === RoomStatus.playing;\n }\n\n /**\n * 房间是否已满\n */\n get isFull(): boolean {\n return this.validPlayers.length == this.size;\n }\n\n /**\n * 房主\n */\n get owner(): RoomPlayer | undefined {\n const creator = this.players.find((player) => player.isCreator);\n return creator;\n }\n\n toJSON() {\n return {\n id: this.id,\n name: this.name,\n size: this.size || 10,\n minSize: this.minSize,\n status: this.status,\n players: this.players.map((player) => player.toJSON()),\n attrs: this.attrs,\n }\n }\n\n toString() {\n return JSON.stringify(this.toJSON());\n }\n\n constructor({\n id = new Date().getTime().toString(), name = '', size = 10, minSize = 2, attrs\n }: Partial<IRoomOptions>) {\n super();\n this.id = id;\n this.name = name;\n this.size = size;\n this.minSize = minSize;\n this.attrs = attrs;\n \n const events: Array<keyof RoomEvents> = ['message', 'command', 'start', 'end', 'all-ready', 'player-unready', 'player-ready', 'join', 'leave'];\n events.forEach((event) => {\n this.on(event, (...data: any) => {\n this.sender?.(event, ...data);\n });\n });\n }\n\n /**\n * 设置房主\n * @param {Player} player 玩家\n * @returns this\n */\n setCreator(player: Player) {\n const roomPlayer = this.searchPlayer(player);\n if (roomPlayer) {\n this.players.forEach((p) => {\n p.isCreator = false;\n });\n roomPlayer.isCreator = true;\n this.emit(\"update\", this);\n }\n return this;\n }\n\n /**\n * 添加玩家\n * @param {Player} player 玩家\n * @param {boolean} isCreator 是否房主\n * @returns 玩家实例 \n */\n addPlayer(player: Player, isCreator: boolean = false) {\n let roomPlayer = this.searchPlayer(player);\n if (roomPlayer) {\n if (roomPlayer.role === PlayerRole.watcher && !this.isFull && !this.isPlaying) {\n roomPlayer.role = PlayerRole.player;\n this.emit(\"update\", this);\n }\n return roomPlayer;\n }\n\n if (isCreator) {\n this.players.forEach((p) => {\n p.isCreator = false;\n });\n }\n roomPlayer = new RoomPlayer(player, this.isFull || this.isPlaying ? PlayerRole.watcher : PlayerRole.player);\n roomPlayer.isCreator = isCreator;\n roomPlayer.roomId = this.id;\n this.players.push(roomPlayer);\n this.emit(\"join\", { roomId: this.id, ...roomPlayer });\n \n return roomPlayer;\n }\n\n /**\n * 离开座位\n * @param {string | IPlayer} player 玩家 / 玩家 id\n */\n leaveSeat(playerId: string): RoomPlayer;\n leaveSeat(player: IPlayer): RoomPlayer;\n leaveSeat(player: IPlayer | string) {\n const playerId = typeof player === \"string\" ? player : player.id;\n const roomPlayer = this.searchPlayer(playerId);\n if (roomPlayer && roomPlayer.role === PlayerRole.player) {\n roomPlayer.role = PlayerRole.watcher;\n roomPlayer.isReady = false;\n this.emit(\"leave\", { roomId: this.id, ...roomPlayer});\n if (roomPlayer.isCreator && this.validPlayers.length > 0) {\n this.validPlayers[0].isCreator = true;\n this.emit(\"update\", this);\n }\n }\n return roomPlayer!;\n }\n\n /**\n * 踢出玩家\n * @param {string | IPlayer} player 玩家 / 玩家 id\n */\n kickPlayer(playerId: string): RoomPlayer;\n kickPlayer(player: IPlayer): RoomPlayer;\n kickPlayer(player: IPlayer | string) {\n const playerId = typeof player === \"string\" ? player : player.id;\n const index = this.players.findIndex((p) => p.id == playerId);\n const roomPlayer = this.players[index];\n if (index > -1) {\n this.emit(\"leave\", { roomId: this.id, ...roomPlayer});\n this.players.splice(index, 1);\n if (roomPlayer.isCreator && this.players.length > 0) {\n this.players[0].isCreator = true;\n this.emit(\"update\", this);\n }\n }\n return roomPlayer;\n }\n\n /**\n * 搜索玩家\n * @param {string | IPlayer} player 玩家 / 玩家 id\n */\n searchPlayer(playerId: string): RoomPlayer | undefined;\n searchPlayer(player: IPlayer): RoomPlayer | undefined;\n searchPlayer(player: string | IPlayer) {\n const playerId = typeof player === \"string\" ? player : player?.id;\n return this.players.find((player) => player.id == playerId);\n }\n\n /**\n * 开始游戏\n */\n start(sender: IPlayer) {\n if (!this.isReady) {\n throw new Error('room is not ready.');\n }\n if (this.status === RoomStatus.playing) {\n throw new Error('room is already started.');\n }\n this.players.forEach((player) => {\n if (player.role != PlayerRole.player) return;\n player.emit('status', PlayerStatus.playing);\n });\n this.emit(\"update\", this);\n return this.emit(\"start\", this);\n }\n\n /**\n * 结束游戏\n */\n end() {\n this.players.forEach((player) => {\n if (player.role != PlayerRole.player) return;\n player.emit('status', PlayerStatus.unready);\n });\n this.emit(\"update\", this);\n return this.emit(\"end\", this);\n }\n\n /**\n * 设置消息发送器\n * @param sender 消息发送器\n */\n setSender(sender: (type: string, ...message: any) => void) {\n this.sender = sender;\n return this;\n }\n}\n","import { EventEmitter } from \"events\";\nimport { TiaoomEvents } from \"@lib/events\";\nimport { IMessage, RecvMessageTypes, MessageTypes } from \"@lib/models/message\";\nimport { IRoom, IRoomPlayer, Room, IRoomOptions, IRoomPlayerOptions } from \"@lib/models/room\";\nimport { IPlayer, Player, IPlayerOptions, PlayerStatus } from \"@lib/models/player\";\n\nexport interface ITiaoomOptions {\n socket: IMessage;\n}\n\nexport class Tiaoom extends EventEmitter {\n rooms: Room[] = []; // room list\n players: Player[] = []; // player list\n messageInstance?: IMessage;\n\n constructor({ socket }: ITiaoomOptions) {\n super();\n this.messageInstance = socket;\n }\n\n /**\n * 导出 JSON 数据\n * @returns 房间与玩家数据\n */\n toJSON() {\n return {\n rooms: this.rooms,\n players: this.players,\n };\n }\n\n /**\n * 从数据加载\n * @param data 房间与玩家数据\n * @returns this\n */\n loadFrom(data: { rooms?: IRoom[]; players?: IPlayer[] }) {\n this.rooms = data.rooms?.map((r) => new Room(r)) ?? [];\n this.players = data.players?.map((p) => new Player(p)) ?? [];\n return this;\n }\n\n on<K extends keyof TiaoomEvents>(event: K, listener: TiaoomEvents[K]): this {\n super.on(event, listener);\n return this\n }\n\n emit<K extends keyof TiaoomEvents>(event: K, ...args: Parameters<TiaoomEvents[K]>): boolean {\n return super.emit(event, ...args);\n }\n\n run() {\n this.messageInstance?.on(\"message\", (message: any, cb?: (err: Error | null, data?: any) => any) => {\n try {\n switch (message.type) {\n case RecvMessageTypes.RoomList:\n return cb?.(null, this.rooms);\n case RecvMessageTypes.PlayerList:\n return cb?.(null, this.players);\n case RecvMessageTypes.RoomCreate:\n return this.createRoom(message.sender, message.data);\n case RecvMessageTypes.PlayerJoin:\n return this.joinPlayer(message.sender, message.data);\n case RecvMessageTypes.PlayerLeave:\n return this.leavePlayer(message.sender, message.data);\n case RecvMessageTypes.PlayerStandUp:\n return this.leaveSeat(message.sender, message.data);\n case RecvMessageTypes.RoomGet:\n return cb?.(null, this.searchRoom(message.data));\n case RecvMessageTypes.RoomStart:\n return this.startRoom(message.sender, message.data);\n case RecvMessageTypes.RoomKick:\n return this.kickPlayer(message.sender, message.data);\n case RecvMessageTypes.RoomTransfer:\n return this.transferOwner(message.sender, message.data);\n case RecvMessageTypes.RoomClose:\n return this.closeRoom(message.sender, message.data);\n case RecvMessageTypes.PlayerLogin:\n return this.loginPlayer(message.data);\n case RecvMessageTypes.PlayerLogout:\n return this.removePlayer(message.data);\n case RecvMessageTypes.PlayerReady:\n return this.readyPlayer(message.sender, message.data);\n case RecvMessageTypes.PlayerUnready:\n return this.unReadyPlayer(message.sender, message.data);\n case RecvMessageTypes.RoomPlayerCommand:\n return this.searchRoom(message.data)?.emit(\"player-command\", { ...message.data , sender: message.sender });\n case RecvMessageTypes.GlobalCommand:\n return this.emit(\"command\", { ...message.data , sender: message.sender });\n default:\n throw new Error('unknown message type.');\n }\n } catch (error) {\n cb?.(error as Error);\n this.messageInstance?.send({\n type: MessageTypes.PlayerError,\n data: {\n name: (error as Error).name, \n message: (error as Error).message,\n stack: (error as Error).stack,\n },\n sender: message.sender,\n });\n }\n });\n\n this.on('player', (player, online) => {\n this.messageInstance?.send({ type: online ? MessageTypes.PlayerLogin : MessageTypes.PlayerLogout, data: player });\n });\n\n this.on('players', (players) => {\n this.messageInstance?.send({ type: MessageTypes.PlayerList, data: players });\n });\n\n this.on('room', (room) => {\n this.messageInstance?.send({ type: MessageTypes.RoomCreate, data: room });\n });\n\n this.on('room-player', (room) => {\n this.messageInstance?.send({ type: MessageTypes.RoomUpdate, data: room });\n });\n\n this.on('rooms', (rooms) => {\n this.messageInstance?.send({ type: MessageTypes.RoomList, data: rooms });\n });\n\n this.on('message', (data, sender) => {\n this.messageInstance?.send({ type: MessageTypes.GlobalMessage, data, sender });\n });\n\n return this;\n }\n\n searchPlayer(player: string): Player | undefined;\n searchPlayer(player: IPlayerOptions | IRoomPlayerOptions): Player | undefined;\n\n searchPlayer(player: IPlayerOptions | IRoomPlayerOptions | string) {\n const playerId = typeof player === \"string\" ? player : player?.id;\n return this.players.find((target) => target.id === playerId);\n }\n\n searchRoom(room: string): Room | undefined;\n searchRoom(room: Partial<IRoomOptions>): Room | undefined;\n\n searchRoom(room: Partial<IRoomOptions> | string) {\n const roomId = typeof room === \"string\" ? room : room?.id;\n return this.rooms.find((target) => target.id === roomId);\n }\n\n createRoom(sender: IPlayer, options: IRoomOptions) {\n if (!options.name) {\n throw new Error('missing room id or name.');\n }\n const roomInstance = this.searchRoom(options);\n if (roomInstance) {\n throw new Error('room already exists.');\n }\n\n if (this.rooms.some(r => r.players.some(p => p.id === sender.id))) {\n throw new Error('you are already in a room.');\n }\n\n const room = new Room(options);\n room.setSender((type, message, sender) => {\n this.messageInstance?.send({ type: `room.${type}` as MessageTypes, data: message, sender: room });\n });\n \n this.emit(\"room\", room);\n this.rooms.push(room);\n\n this.joinPlayer(sender, { roomId: room.id, ...sender }, true);\n return room;\n }\n\n startRoom(sender: IPlayer, room: IRoom) {\n const roomInstance = this.searchRoom(room);\n if (!roomInstance) {\n throw new Error('room not found.');\n }\n roomInstance.start(sender);\n\n return this.emit(\"room-player\", roomInstance);\n }\n\n closeRoom(sender: IPlayer, room: IRoom) {\n const roomIndex = this.rooms.findIndex((r) => r.id === room.id);\n const roomInstance = this.rooms[roomIndex];\n if (!roomInstance) {\n throw new Error('room not found.');\n }\n\n if (roomInstance.players.length && !roomInstance.players.some(p => p.id === sender.id && p.isCreator)) {\n throw new Error('only room creator can close the room.');\n }\n\n room = this.rooms.splice(roomIndex, 1)[0];\n\n this.emit(\"rooms\", this.rooms);\n roomInstance.emit('close');\n return room;\n }\n\n kickPlayer(sender: IPlayer, data: { roomId: string, playerId: string }) {\n const room = this.searchRoom(data.roomId);\n if (!room) {\n throw new Error('room not found.');\n }\n\n const senderInRoom = room.searchPlayer(sender);\n if (!senderInRoom || !senderInRoom.isCreator) {\n throw new Error('permission denied.');\n }\n\n const targetPlayer = room.players.find(p => p.id === data.playerId);\n if (!targetPlayer) {\n throw new Error('player not found in room.');\n }\n\n const roomPlayer = room.kickPlayer(targetPlayer);\n if (roomPlayer) this.emit(\"room-player\", room);\n return roomPlayer;\n }\n\n transferOwner(sender: IPlayer, data: { roomId: string, playerId: string }) {\n const room = this.searchRoom(data.roomId);\n if (!room) {\n throw new Error('room not found.');\n }\n\n const senderInRoom = room.searchPlayer(sender);\n if (!senderInRoom || !senderInRoom.isCreator) {\n throw new Error('permission denied.');\n }\n\n const targetPlayer = room.players.find(p => p.id === data.playerId);\n if (!targetPlayer) {\n throw new Error('player not found in room.');\n }\n\n if (targetPlayer.id === sender.id) {\n return;\n }\n\n senderInRoom.isCreator = false;\n targetPlayer.isCreator = true;\n\n this.emit(\"room-player\", room);\n return room;\n }\n\n loginPlayer (player: IPlayerOptions, cb?: (data: { player: Player }) => void): Player {\n let playerInstance = this.searchPlayer(player);\n if (!playerInstance) {\n playerInstance = new Player(player);\n playerInstance.setSender((type, message) => {\n this.messageInstance?.send({ type: `player.${type}` as MessageTypes, data: message, sender: playerInstance });\n });\n this.players.push(playerInstance);\n this.emit(\"player\", playerInstance, true);\n }\n \n playerInstance.emit(\"status\", PlayerStatus.online);\n cb?.({ player: playerInstance });\n return playerInstance;\n }\n\n joinPlayer(sender: IPlayer, player: IRoomPlayerOptions, isCreator: boolean = false) {\n let playerInstance = this.searchPlayer(sender);\n if (!playerInstance) {\n playerInstance = this.loginPlayer(sender);\n }\n\n if (!player.roomId) {\n throw new Error('missing room id.');\n }\n\n const room = this.rooms.find((room) => room.id === player.roomId);\n if (!room) {\n throw new Error('room not found.');\n }\n\n const roomPlayer = room.addPlayer(playerInstance, isCreator);\n if (roomPlayer) {\n this.emit(\"room-player\", room);\n }\n\n return roomPlayer;\n }\n\n leavePlayer(sender: IPlayer, player: IRoomPlayerOptions) {\n if (!player.roomId) {\n throw new Error('missing room id.');\n }\n\n const room = this.rooms.find((room) => room.id === player.roomId);\n if (!room) {\n throw new Error('room not found.');\n }\n\n const playerInstance = room.searchPlayer(sender);\n if (!playerInstance) {\n throw new Error('player not in room.');\n }\n\n const roomPlayer = room.kickPlayer(playerInstance);\n\n if (roomPlayer) this.emit(\"room-player\", room);\n\n return roomPlayer;\n }\n \n leaveSeat(sender: IPlayer, player: IRoomPlayerOptions) {\n if (!player.roomId) {\n throw new Error('missing room id.');\n }\n\n const room = this.rooms.find((room) => room.id === player.roomId);\n if (!room) {\n throw new Error('room not found.');\n }\n\n const playerInstance = room.searchPlayer(sender);\n if (!playerInstance) {\n throw new Error('player not in room.');\n }\n\n const roomPlayer = room.leaveSeat(playerInstance);\n if (roomPlayer) this.emit(\"room-player\", room);\n\n return roomPlayer;\n }\n\n readyPlayer(sender: IPlayer, player: IRoomPlayer) {\n const playerInstance = this.searchPlayer(sender);\n if (!playerInstance) {\n throw new Error('player not found.');\n }\n\n if (!player.roomId) {\n throw new Error('missing room id.');\n }\n\n const room = this.rooms.find((room) => room.id === player.roomId);\n if (!room) {\n throw new Error('room not found.');\n }\n\n const roomPlayer = room.searchPlayer(playerInstance);\n \n if (!roomPlayer) {\n throw new Error('player not in room.');\n }\n\n roomPlayer.isReady = true;\n\n if (room.isReady) {\n room.emit(\"all-ready\", room.players);\n }\n\n playerInstance.emit(\"status\", PlayerStatus.ready);\n\n room.emit(\"player-ready\", { ...player, ...roomPlayer });\n room.emit('update', room);\n\n return this;\n }\n \n unReadyPlayer(sender: IPlayer, player: IRoomPlayer) {\n const playerInstance = this.searchPlayer(sender);\n if (!playerInstance) {\n throw new Error('player not found.');\n }\n\n if (!player.roomId) {\n throw new Error('missing room id.');\n }\n\n const room = this.rooms.find((room) => room.id === player.roomId);\n if (!room) {\n throw new Error('room not found.');\n }\n\n const roomPlayer = room.searchPlayer(playerInstance);\n \n if (!roomPlayer) {\n throw new Error('player not in room.');\n }\n\n roomPlayer.isReady = false;\n playerInstance.emit(\"status\", PlayerStatus.unready);\n room.emit(\"player-unready\", { ...player, ...roomPlayer });\n room.emit('update', room);\n\n return this;\n }\n\n removePlayer(sender: IPlayer) {\n const playerIndex = this.players.findIndex((p) => p.id === sender?.id);\n const player = this.players[playerIndex];\n if (playerIndex > -1) {\n this.players.splice(playerIndex, 1)[0];\n this.emit(\"player\", player, false);\n if (this.rooms.some(r => r.searchPlayer(player))) {\n setTimeout(() => {\n if (this.players.some(p => p.id === sender.id)) return; // player is online\n this.rooms.filter(r => r.searchPlayer(player)).forEach(r => {\n this.leavePlayer(sender, { ...sender, roomId: r.id });\n });\n }, 5 * 60 * 1000); // 5 minutes later\n }\n }\n return player;\n }\n}\n\nexport * from \"@lib/models/message\";\nexport * from \"@lib/models/room\";\nexport * from \"@lib/models/player\";\nexport * from \"@lib/events\";"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","names":["EventEmitter","status","EventEmitter","player","EventEmitter","room"],"sources":["../lib/models/message.ts","../lib/models/player.ts","../lib/models/room.ts","../lib/index.ts"],"sourcesContent":["import EventEmitter from \"events\";\nimport { IPlayer, IPlayerOptions } from \"./player\";\nimport { IRoom, IRoomPlayer, IRoomOptions } from \"./room\";\nimport { IMessageEmitterEvents, IMessageEvents } from \"@lib/events/message\";\n\n/**\n * 消息包类型枚举\n * player: 'command', 'message', 'join', 'leave', 'status'\n */\nexport enum MessageTypes {\n /**\n * 连接准备就绪事件\n */\n SysReady = \"sys.ready\",\n /**\n * 连接关闭事件\n */\n SysClose = \"sys.close\",\n /**\n * 错误事件\n */\n SysError = \"sys.error\",\n /**\n * 全局错误\n */\n GlobalError = \"global.error\",\n /**\n * 房间列表\n */\n RoomList = \"room.list\",\n /**\n * 房间创建\n */\n RoomCreate = \"room.create\",\n /**\n * 房间更新\n */\n RoomUpdate = \"room.update\",\n /**\n * 房间开始\n */\n RoomStart = \"room.start\",\n /**\n * 房间结束\n */\n RoomEnd = \"room.end\",\n /**\n * 房间关闭\n */\n RoomClose = \"room.close\",\n /**\n * 房间全部玩家已准备\n */\n RoomAllReady = \"room.all-ready\",\n /**\n * 房间命令\n */\n RoomCommand = \"room.command\",\n /**\n * 房间内玩家发送的指令\n */\n RoomPlayerCommand = \"room.player-command\",\n /**\n * 房间消息\n */\n RoomMessage = \"room.message\",\n /**\n * 玩家加入房间\n */\n RoomJoin = \"room.join\",\n /**\n * 玩家离开房间\n */\n RoomLeave = \"room.leave\",\n /**\n * 房间玩家准备\n */\n RoomPlayerReady = \"room.player-ready\",\n /**\n * 房间玩家取消准备\n */\n RoomPlayerUnready = \"room.player-unready\",\n /**\n * 玩家列表\n */\n PlayerList = \"player.list\",\n /**\n * 玩家登录\n */\n PlayerLogin = \"player.login\",\n /**\n * 玩家登出\n */\n PlayerLogout = \"player.logout\",\n /**\n * *玩家消息\n */\n PlayerMessage = \"player.message\",\n /**\n * *玩家命令\n */\n PlayerCommand = \"player.command\",\n /**\n * 玩家错误信息\n */\n PlayerError = \"player.error\",\n /**\n * 全局消息\n */\n GlobalMessage = \"global.message\",\n /**\n * 全局命令\n */\n GlobalCommand = \"global.command\",\n}\n\n/**\n * 客户端发送消息包类型枚举\n * player: 'command', 'message', 'join', 'leave', 'status'\n */\nexport enum RecvMessageTypes {\n /**\n * 房间列表\n */\n RoomList = \"room.list\",\n /**\n * 玩家列表\n */\n PlayerList = \"player.list\",\n /**\n * 房间创建\n */\n RoomCreate = \"room.create\",\n /**\n * 玩家加入房间\n */\n PlayerJoin = \"player.join\",\n /**\n * 玩家离开房间\n */\n PlayerLeave = \"player.leave\",\n /**\n * 玩家离开座位\n */\n PlayerStandUp = \"player.standup\",\n /**\n * 房间获取\n */\n RoomGet = \"room.get\",\n /**\n * 房间开始\n */\n RoomStart = \"room.start\",\n /**\n * 房间踢出玩家\n */\n RoomKick = \"room.kick\",\n /**\n * 房间转移\n */\n RoomTransfer = \"room.transfer\",\n /**\n * 房间关闭\n */\n RoomClose = \"room.close\", \n /**\n * 玩家登录\n */\n PlayerLogin = \"player.login\",\n /**\n * 玩家登出\n */\n PlayerLogout = \"player.logout\",\n /**\n * 玩家准备\n */\n PlayerReady = \"player.ready\",\n /**\n * 玩家取消准备\n */\n PlayerUnready = \"player.unready\",\n /**\n * 房间内玩家发送的指令\n */\n RoomPlayerCommand = \"room.player-command\",\n /**\n * 全局命令\n */\n GlobalCommand = \"global.command\",\n}\n\n/**\n * 消息包接口\n */\nexport interface IMessagePackage {\n /**\n * 消息类型\n */\n type: MessageTypes;\n /**\n * 消息数据\n */\n data?: IPlayerOptions | IRoomOptions | IPlayer | IRoom | IRoomPlayer | any\n /**\n * 发送者信息\n */\n sender?: IPlayer | IRoomPlayer | IRoom;\n}\n\n/**\n * 消息数据接口,包含发送者信息\n */\nexport interface IMessageData extends IMessagePackage {\n sender: IPlayer | IRoomPlayer | IRoom;\n}\n\n/**\n * 消息通信接口\n */\nexport interface IMessage extends EventEmitter<IMessageEmitterEvents> {\n /**\n * 监听消息事件\n * @param event 事件名,具体见 MessageEvents\n * @param listener 监听器\n */\n on<K extends keyof IMessageEvents>(event: K, listener: IMessageEvents[K]): this;\n /**\n * 触发消息事件\n * @param event 事件名,具体见 MessageEvents\n * @param args 参数\n */\n emit<K extends keyof IMessageEvents>(event: K, ...args: Parameters<IMessageEvents[K]>): boolean;\n /**\n * 关闭连接\n */\n close(): void;\n /**\n * 发送消息包\n * @param message 消息包\n */\n send(message: IMessagePackage): void;\n}\n","import { PlayerEvents } from \"@lib/events/player\";\nimport EventEmitter from \"events\";\n\n/**\n * 玩家选项接口\n */\nexport interface IPlayerOptions {\n /**\n * 玩家ID\n */\n id: string;\n /**\n * 玩家名称\n */\n name: string;\n /**\n * 玩家属性\n */\n attributes?: any;\n /**\n * 发送者函数\n */\n sender?: (type: string, ...message: any) => void;\n}\n\n/**\n * 玩家状态枚举\n */\nexport enum PlayerStatus {\n /**\n * 已准备\n */\n ready = 'ready',\n /**\n * 未准备\n */\n unready = 'unready',\n /**\n * 在线\n */\n online = 'online',\n /**\n * 游戏中\n */\n playing = 'playing',\n}\n\n/**\n * 玩家接口\n */\nexport interface IPlayer extends IPlayerOptions {\n /**\n * 玩家状态\n */\n status: PlayerStatus;\n}\n\n/**\n * 玩家\n */\nexport class Player extends EventEmitter implements IPlayer {\n /**\n * 监听玩家事件\n * @param event 事件名,具体见 PlayEvents\n * @param listener 监听器\n * @returns this\n */\n on<K extends keyof PlayerEvents>(event: K, listener: PlayerEvents[K]): this {\n return super.on(event, listener);\n }\n\n /**\n * 触发玩家事件\n * @param event 事件名,具体见 PlayEvents\n * @param args 参数\n * @returns 是否有监听器被触发\n */\n emit<K extends keyof PlayerEvents>(event: K, ...args: Parameters<PlayerEvents[K]>): boolean {\n return super.emit(event, ...args);\n }\n \n id: string = \"\";\n name: string = \"\";\n attributes?: any;\n status: PlayerStatus = PlayerStatus.online;\n sender?: (type: string, ...message: any) => void;\n\n constructor(player: Partial<IPlayerOptions> | Player, status: PlayerStatus = PlayerStatus.online) {\n super();\n this.id = player.id || new Date().getTime().toString();\n this.name = player.name || \"\";\n this.attributes = player.attributes || {};\n this.sender = player.sender;\n\n if (player instanceof Player) this.status = player.status;\n\n this.status = status;\n\n this.on('status', (status: PlayerStatus) => {\n this.status = status;\n });\n \n const events: Array<keyof PlayerEvents> = ['command', 'message', 'status'];\n events.forEach((event) => {\n this.on(event, (...data: any) => {\n this.sender?.(event, ...data);\n });\n }); \n }\n\n toJSON() {\n return {\n id: this.id,\n name: this.name,\n attributes: this.attributes,\n status: this.status,\n };\n }\n\n toString() {\n return JSON.stringify(this.toJSON());\n }\n\n /**\n * 设置发送者函数\n * @param {(type: string, ...message: any) => void} sender 发送者函数\n * @returns this\n */\n setSender(sender: (type: string, ...message: any) => void) {\n this.sender = sender;\n return this;\n }\n}","import { IPlayer, Player, IPlayerOptions, PlayerStatus } from \"./player\";\nimport EventEmitter from \"events\";\nimport { RoomEvents } from \"@lib/events\";\n\n/**\n * 房间选项接口\n */\nexport interface IRoomOptions {\n /**\n * 房间号\n */\n id: string, \n /**\n * 房间名称\n */\n name: string,\n /**\n * 房间容量\n */\n size: number, \n /**\n * 最小容量\n */\n minSize: number,\n /**\n * 其他属性\n */\n attrs?: Record<string, any>,\n}\n\n/**\n * 房间玩家角色\n */\nexport enum PlayerRole {\n /**\n * 玩家\n */\n player = 'player',\n /**\n * 观众\n */\n watcher = 'watcher',\n}\n\n/**\n * 房间状态\n */\nexport enum RoomStatus {\n /**\n * 等待中\n */\n waiting = 'waiting',\n /**\n * 已准备\n */\n ready = 'ready',\n /**\n * 游戏中\n */\n playing = 'playing',\n}\n\n/**\n * 房间接口\n */\nexport interface IRoom extends IRoomOptions {\n /**\n * 房间玩家列表\n */\n players: RoomPlayer[];\n}\n\n/**\n * 房间玩家选项接口\n */\nexport interface IRoomPlayerOptions extends IPlayerOptions {\n /**\n * 房间Id\n */\n roomId?: string;\n}\n\n/**\n * 房间玩家接口\n */\nexport interface IRoomPlayer extends IRoomPlayerOptions, IPlayer {\n /**\n * 是否已准备\n */\n isReady: boolean;\n /**\n * 玩家角色\n */\n role: PlayerRole;\n /**\n * 是否为房主\n */\n isCreator: boolean;\n /**\n * 房间 Id\n */\n roomId: string;\n}\n\n/**\n * 房间玩家\n */\nexport class RoomPlayer extends Player implements IRoomPlayer {\n isReady: boolean = false;\n role: PlayerRole = PlayerRole.player;\n isCreator: boolean = false;\n roomId: string;\n\n constructor(player: Partial<IRoomPlayer>, role: PlayerRole = PlayerRole.player) {\n super(player);\n this.isReady = player.isReady || false;\n this.isCreator = player.isCreator || false;\n this.roomId = player.roomId || '';\n this.role = player.role || role;\n this.status = player.status || PlayerStatus.online;\n if (player instanceof Player && player.sender) super.setSender(player.sender);\n }\n\n toJSON() {\n return {\n ...super.toJSON(),\n role: this.role,\n isReady: this.isReady,\n isCreator: this.isCreator,\n };\n }\n}\n\n/**\n * 房间\n */\nexport class Room extends EventEmitter implements IRoom {\n /**\n * 监听房间事件\n * @param event 事件名,具体见 RoomEvents\n * @param listener 监听器\n * @returns this\n */\n on<K extends keyof RoomEvents>(event: K, listener: RoomEvents[K]): this {\n return super.on(event, listener);\n }\n\n /**\n * 触发房间事件\n * @param event 事件名,具体见 RoomEvents\n * @param args 参数\n * @returns 是否有监听器被触发\n */\n emit<K extends keyof RoomEvents>(event: K, ...args: Parameters<RoomEvents[K]>): boolean {\n return super.emit(event, ...args);\n }\n\n id: string;\n size: number = 10;\n name: string = '';\n minSize: number = 2;\n attrs?: Record<string, any>;\n players: RoomPlayer[] = [];\n\n /**\n * 有效玩家列表(非观众)\n */\n get validPlayers() {\n return this.players.filter((player) => player.role === PlayerRole.player);\n }\n\n /**\n * 观众列表\n */\n get watchers() {\n return this.players.filter((player) => player.role === PlayerRole.watcher);\n }\n\n /**\n * 消息发送器\n */\n private sender?: (type: string, ...message: any) => void;\n\n /**\n * 房间玩家是否已准备好\n */\n get isReady(): boolean {\n return this.players.length >= this.minSize\n && this.players.every((target) => target.isReady || target.role === PlayerRole.watcher); // is all player ready\n }\n\n /**\n * 房间状态\n */\n get status(): RoomStatus {\n if (!this.isReady) return RoomStatus.waiting;\n if (this.players.findIndex((target) => target.status === PlayerStatus.playing) != -1) return RoomStatus.playing;\n return RoomStatus.ready;\n }\n\n /**\n * 房间是否在游戏中\n */\n get isPlaying(): boolean {\n return this.status === RoomStatus.playing;\n }\n\n /**\n * 房间是否已满\n */\n get isFull(): boolean {\n return this.validPlayers.length == this.size;\n }\n\n /**\n * 房主\n */\n get owner(): RoomPlayer | undefined {\n const creator = this.players.find((player) => player.isCreator);\n return creator;\n }\n\n toJSON() {\n return {\n id: this.id,\n name: this.name,\n size: this.size || 10,\n minSize: this.minSize,\n status: this.status,\n players: this.players.map((player) => player.toJSON()),\n attrs: this.attrs,\n }\n }\n\n toString() {\n return JSON.stringify(this.toJSON());\n }\n\n constructor(room: Partial<IRoomOptions> | Room, players: RoomPlayer[] = []) {\n super();\n if (room instanceof Room) {\n this.players = room.players;\n this.players.forEach((p) => {\n p.roomId = room.id;\n });\n }\n\n this.id = room.id || new Date().getTime().toString();\n this.name = room.name || '';\n this.size = room.size || 10;\n this.minSize = room.minSize || 2;\n this.attrs = room.attrs;\n this.players = players;\n \n const events: Array<keyof RoomEvents> = ['message', 'command', 'start', 'end', 'all-ready', 'player-unready', 'player-ready', 'join', 'leave'];\n events.forEach((event) => {\n this.on(event, (...data: any) => {\n this.sender?.(event, ...data);\n });\n });\n }\n\n /**\n * 设置房主\n * @param {Player} player 玩家\n * @returns this\n */\n setCreator(player: Player) {\n const roomPlayer = this.searchPlayer(player);\n if (roomPlayer) {\n this.players.forEach((p) => {\n p.isCreator = false;\n });\n roomPlayer.isCreator = true;\n this.emit(\"update\", this);\n }\n return this;\n }\n\n /**\n * 添加玩家\n * @param {Player} player 玩家\n * @param {boolean} isCreator 是否房主\n * @returns 玩家实例 \n */\n addPlayer(player: Player, isCreator: boolean = false) {\n let roomPlayer = this.searchPlayer(player);\n if (roomPlayer) {\n if (roomPlayer.role === PlayerRole.watcher && !this.isFull && !this.isPlaying) {\n roomPlayer.role = PlayerRole.player;\n this.emit(\"update\", this);\n }\n return roomPlayer;\n }\n\n if (isCreator) {\n this.players.forEach((p) => {\n p.isCreator = false;\n });\n }\n roomPlayer = new RoomPlayer(player, this.isFull || this.isPlaying ? PlayerRole.watcher : PlayerRole.player);\n roomPlayer.isCreator = isCreator;\n roomPlayer.roomId = this.id;\n this.players.push(roomPlayer);\n this.emit(\"join\", { ...roomPlayer, roomId: this.id });\n \n return roomPlayer;\n }\n\n /**\n * 离开座位\n * @param {string | IPlayer} player 玩家 / 玩家 id\n */\n leaveSeat(playerId: string): RoomPlayer;\n leaveSeat(player: IPlayer): RoomPlayer;\n leaveSeat(player: IPlayer | string) {\n const playerId = typeof player === \"string\" ? player : player.id;\n const roomPlayer = this.searchPlayer(playerId);\n if (roomPlayer && roomPlayer.role === PlayerRole.player) {\n roomPlayer.role = PlayerRole.watcher;\n roomPlayer.isReady = false;\n this.emit(\"leave\", { ...roomPlayer, roomId: this.id });\n if (roomPlayer.isCreator && this.validPlayers.length > 0) {\n this.validPlayers[0].isCreator = true;\n this.emit(\"update\", this);\n }\n }\n return roomPlayer!;\n }\n\n /**\n * 踢出玩家\n * @param {string | IPlayer} player 玩家 / 玩家 id\n */\n kickPlayer(playerId: string): RoomPlayer;\n kickPlayer(player: IPlayer): RoomPlayer;\n kickPlayer(player: IPlayer | string) {\n const playerId = typeof player === \"string\" ? player : player.id;\n const index = this.players.findIndex((p) => p.id == playerId);\n const roomPlayer = this.players[index];\n if (index > -1) {\n this.emit(\"leave\", { ...roomPlayer, roomId: this.id });\n this.players.splice(index, 1);\n if (roomPlayer.isCreator && this.players.length > 0) {\n this.players[0].isCreator = true;\n this.emit(\"update\", this);\n }\n }\n return roomPlayer;\n }\n\n /**\n * 搜索玩家\n * @param {string | IPlayer} player 玩家 / 玩家 id\n */\n searchPlayer(playerId: string): RoomPlayer | undefined;\n searchPlayer(player: IPlayer): RoomPlayer | undefined;\n searchPlayer(player: string | IPlayer) {\n const playerId = typeof player === \"string\" ? player : player?.id;\n return this.players.find((player) => player.id == playerId);\n }\n\n /**\n * 开始游戏\n */\n start(sender: IPlayer) {\n if (!this.isReady) {\n throw new Error('room is not ready.');\n }\n if (this.status === RoomStatus.playing) {\n throw new Error('room is already started.');\n }\n this.players.forEach((player) => {\n if (player.role != PlayerRole.player) return;\n player.emit('status', PlayerStatus.playing);\n });\n this.emit(\"update\", this);\n return this.emit(\"start\", this);\n }\n\n /**\n * 结束游戏\n */\n end() {\n this.players.forEach((player) => {\n if (player.role != PlayerRole.player) return;\n player.emit('status', PlayerStatus.unready);\n });\n this.emit(\"update\", this);\n return this.emit(\"end\", this);\n }\n\n /**\n * 设置消息发送器\n * @param sender 消息发送器\n */\n setSender(sender: (type: string, ...message: any) => void) {\n this.sender = sender;\n return this;\n }\n}\n","import { EventEmitter } from \"events\";\nimport { TiaoomEvents } from \"@lib/events\";\nimport { IMessage, RecvMessageTypes, MessageTypes } from \"@lib/models/message\";\nimport { IRoom, IRoomPlayer, Room, IRoomOptions, IRoomPlayerOptions } from \"@lib/models/room\";\nimport { IPlayer, Player, IPlayerOptions, PlayerStatus } from \"@lib/models/player\";\n\nexport interface ITiaoomOptions {\n socket: IMessage;\n}\n\nexport class Tiaoom extends EventEmitter {\n rooms: Room[] = []; // room list\n players: Player[] = []; // player list\n messageInstance?: IMessage;\n\n constructor({ socket }: ITiaoomOptions) {\n super();\n this.messageInstance = socket;\n }\n\n /**\n * 导出 JSON 数据\n * @returns 房间与玩家数据\n */\n toJSON() {\n return {\n rooms: this.rooms,\n players: this.players,\n };\n }\n\n /**\n * 从数据加载\n * @param data 房间与玩家数据\n * @returns this\n */\n loadFrom(data: { rooms?: Room[]; players?: Player[] }) {\n this.rooms = data.rooms?.map((r) => new Room(r, r.players)) ?? [];\n this.players = data.players?.map((p) => new Player(p, p.status)) ?? [];\n this.rooms.forEach((room) => {\n room.setSender((type, message, sender) => {\n this.messageInstance?.send({ type: `room.${type}` as MessageTypes, data: message, sender: room });\n })\n })\n return this;\n }\n\n on<K extends keyof TiaoomEvents>(event: K, listener: TiaoomEvents[K]): this {\n super.on(event, listener);\n return this\n }\n\n emit<K extends keyof TiaoomEvents>(event: K, ...args: Parameters<TiaoomEvents[K]>): boolean {\n return super.emit(event, ...args);\n }\n\n run() {\n this.messageInstance?.on(\"message\", (message: any, cb?: (err: Error | null, data?: any) => any) => {\n try {\n switch (message.type) {\n case RecvMessageTypes.RoomList:\n return cb?.(null, this.rooms);\n case RecvMessageTypes.PlayerList:\n return cb?.(null, this.players);\n case RecvMessageTypes.RoomCreate:\n return this.createRoom(message.sender, message.data);\n case RecvMessageTypes.PlayerJoin:\n return this.joinPlayer(message.sender, message.data);\n case RecvMessageTypes.PlayerLeave:\n return this.leavePlayer(message.sender, message.data);\n case RecvMessageTypes.PlayerStandUp:\n return this.leaveSeat(message.sender, message.data);\n case RecvMessageTypes.RoomGet:\n return cb?.(null, this.searchRoom(message.data));\n case RecvMessageTypes.RoomStart:\n return this.startRoom(message.sender, message.data);\n case RecvMessageTypes.RoomKick:\n return this.kickPlayer(message.sender, message.data);\n case RecvMessageTypes.RoomTransfer:\n return this.transferOwner(message.sender, message.data);\n case RecvMessageTypes.RoomClose:\n return this.closeRoom(message.sender, message.data);\n case RecvMessageTypes.PlayerLogin:\n return this.loginPlayer(message.data);\n case RecvMessageTypes.PlayerLogout:\n return this.removePlayer(message.data);\n case RecvMessageTypes.PlayerReady:\n return this.readyPlayer(message.sender, message.data);\n case RecvMessageTypes.PlayerUnready:\n return this.unReadyPlayer(message.sender, message.data);\n case RecvMessageTypes.RoomPlayerCommand:\n return this.searchRoom(message.data)?.emit(\"player-command\", { ...message.data , sender: message.sender });\n case RecvMessageTypes.GlobalCommand:\n return this.emit(\"command\", { ...message.data , sender: message.sender });\n default:\n throw new Error('unknown message type.');\n }\n } catch (error) {\n cb?.(error as Error);\n this.messageInstance?.send({\n type: MessageTypes.PlayerError,\n data: {\n name: (error as Error).name, \n message: (error as Error).message,\n stack: (error as Error).stack,\n },\n sender: message.sender,\n });\n }\n });\n\n this.on('player', (player, online) => {\n this.messageInstance?.send({ type: online ? MessageTypes.PlayerLogin : MessageTypes.PlayerLogout, data: player });\n });\n\n this.on('players', (players) => {\n this.messageInstance?.send({ type: MessageTypes.PlayerList, data: players });\n });\n\n this.on('room', (room) => {\n this.messageInstance?.send({ type: MessageTypes.RoomCreate, data: room });\n });\n\n this.on('room-player', (room) => {\n this.messageInstance?.send({ type: MessageTypes.RoomUpdate, data: room });\n });\n\n this.on('rooms', (rooms) => {\n this.messageInstance?.send({ type: MessageTypes.RoomList, data: rooms });\n });\n\n this.on('message', (data, sender) => {\n this.messageInstance?.send({ type: MessageTypes.GlobalMessage, data, sender });\n });\n\n return this;\n }\n\n searchPlayer(player: string): Player | undefined;\n searchPlayer(player: IPlayerOptions | IRoomPlayerOptions): Player | undefined;\n\n searchPlayer(player: IPlayerOptions | IRoomPlayerOptions | string) {\n const playerId = typeof player === \"string\" ? player : player?.id;\n return this.players.find((target) => target.id === playerId);\n }\n\n searchRoom(room: string): Room | undefined;\n searchRoom(room: Partial<IRoomOptions>): Room | undefined;\n\n searchRoom(room: Partial<IRoomOptions> | string) {\n const roomId = typeof room === \"string\" ? room : room?.id;\n return this.rooms.find((target) => target.id === roomId);\n }\n\n createRoom(sender: IPlayer, options: IRoomOptions) {\n if (!options.name) {\n throw new Error('missing room id or name.');\n }\n const roomInstance = this.searchRoom(options);\n if (roomInstance) {\n throw new Error('room already exists.');\n }\n\n if (this.rooms.some(r => r.players.some(p => p.id === sender.id))) {\n throw new Error('you are already in a room.');\n }\n\n const room = new Room(options);\n room.setSender((type, message, sender) => {\n this.messageInstance?.send({ type: `room.${type}` as MessageTypes, data: message, sender: room });\n });\n \n this.rooms.push(room);\n this.joinPlayer(sender, { roomId: room.id, ...sender }, true);\n this.emit(\"room\", room);\n return room;\n }\n\n startRoom(sender: IPlayer, room: IRoom) {\n const roomInstance = this.searchRoom(room);\n if (!roomInstance) {\n throw new Error('room not found.');\n }\n roomInstance.start(sender);\n\n return this.emit(\"room-player\", roomInstance);\n }\n\n closeRoom(sender: IPlayer, room: IRoom) {\n const roomIndex = this.rooms.findIndex((r) => r.id === room.id);\n const roomInstance = this.rooms[roomIndex];\n if (!roomInstance) {\n throw new Error('room not found.');\n }\n\n if (roomInstance.players.length && !roomInstance.players.some(p => p.id === sender.id && p.isCreator)) {\n throw new Error('only room creator can close the room.');\n }\n\n room = this.rooms.splice(roomIndex, 1)[0];\n\n this.emit(\"rooms\", this.rooms);\n roomInstance.emit('close');\n return room;\n }\n\n kickPlayer(sender: IPlayer, data: { roomId: string, playerId: string }) {\n const room = this.searchRoom(data.roomId);\n if (!room) {\n throw new Error('room not found.');\n }\n\n const senderInRoom = room.searchPlayer(sender);\n if (!senderInRoom || !senderInRoom.isCreator) {\n throw new Error('permission denied.');\n }\n\n const targetPlayer = room.players.find(p => p.id === data.playerId);\n if (!targetPlayer) {\n throw new Error('player not found in room.');\n }\n\n const roomPlayer = room.kickPlayer(targetPlayer);\n if (roomPlayer) this.emit(\"room-player\", room);\n return roomPlayer;\n }\n\n transferOwner(sender: IPlayer, data: { roomId: string, playerId: string }) {\n const room = this.searchRoom(data.roomId);\n if (!room) {\n throw new Error('room not found.');\n }\n\n const senderInRoom = room.searchPlayer(sender);\n if (!senderInRoom || !senderInRoom.isCreator) {\n throw new Error('permission denied.');\n }\n\n const targetPlayer = room.players.find(p => p.id === data.playerId);\n if (!targetPlayer) {\n throw new Error('player not found in room.');\n }\n\n if (targetPlayer.id === sender.id) {\n return;\n }\n\n senderInRoom.isCreator = false;\n targetPlayer.isCreator = true;\n\n this.emit(\"room-player\", room);\n return room;\n }\n\n loginPlayer (player: IPlayerOptions, cb?: (data: { player: Player }) => void): Player {\n let playerInstance = this.searchPlayer(player);\n if (!playerInstance?.sender) {\n if (!playerInstance) {\n playerInstance = new Player(player);\n this.players.push(playerInstance);\n }\n playerInstance.setSender((type, message) => {\n this.messageInstance?.send({ type: `player.${type}` as MessageTypes, data: message, sender: playerInstance });\n });\n this.emit(\"player\", playerInstance, true);\n }\n \n playerInstance.emit(\"status\", playerInstance.status);\n cb?.({ player: playerInstance });\n return playerInstance;\n }\n\n joinPlayer(sender: IPlayer, player: IRoomPlayerOptions, isCreator: boolean = false) {\n let playerInstance = this.searchPlayer(sender);\n if (!playerInstance) {\n playerInstance = this.loginPlayer(sender);\n }\n\n if (!player.roomId) {\n throw new Error('missing room id.');\n }\n\n const room = this.rooms.find((room) => room.id === player.roomId);\n if (!room) {\n throw new Error('room not found.');\n }\n\n const roomPlayer = room.addPlayer(playerInstance, isCreator);\n if (roomPlayer) {\n this.emit(\"room-player\", room);\n }\n\n return roomPlayer;\n }\n\n leavePlayer(sender: IPlayer, player: IRoomPlayerOptions) {\n if (!player.roomId) {\n throw new Error('missing room id.');\n }\n\n const room = this.rooms.find((room) => room.id === player.roomId);\n if (!room) {\n throw new Error('room not found.');\n }\n\n const playerInstance = room.searchPlayer(sender);\n if (!playerInstance) {\n throw new Error('player not in room.');\n }\n\n const roomPlayer = room.kickPlayer(playerInstance);\n\n if (roomPlayer) this.emit(\"room-player\", room);\n\n return roomPlayer;\n }\n \n leaveSeat(sender: IPlayer, player: IRoomPlayerOptions) {\n if (!player.roomId) {\n throw new Error('missing room id.');\n }\n\n const room = this.rooms.find((room) => room.id === player.roomId);\n if (!room) {\n throw new Error('room not found.');\n }\n\n const playerInstance = room.searchPlayer(sender);\n if (!playerInstance) {\n throw new Error('player not in room.');\n }\n\n const roomPlayer = room.leaveSeat(playerInstance);\n if (roomPlayer) this.emit(\"room-player\", room);\n\n return roomPlayer;\n }\n\n readyPlayer(sender: IPlayer, player: IRoomPlayer) {\n const playerInstance = this.searchPlayer(sender);\n if (!playerInstance) {\n throw new Error('player not found.');\n }\n\n if (!player.roomId) {\n throw new Error('missing room id.');\n }\n\n const room = this.rooms.find((room) => room.id === player.roomId);\n if (!room) {\n throw new Error('room not found.');\n }\n\n const roomPlayer = room.searchPlayer(playerInstance);\n \n if (!roomPlayer) {\n throw new Error('player not in room.');\n }\n\n roomPlayer.isReady = true;\n\n if (room.isReady) {\n room.emit(\"all-ready\", room.players);\n }\n\n playerInstance.emit(\"status\", PlayerStatus.ready);\n\n room.emit(\"player-ready\", { ...player, ...roomPlayer });\n room.emit('update', room);\n\n return this;\n }\n \n unReadyPlayer(sender: IPlayer, player: IRoomPlayer) {\n const playerInstance = this.searchPlayer(sender);\n if (!playerInstance) {\n throw new Error('player not found.');\n }\n\n if (!player.roomId) {\n throw new Error('missing room id.');\n }\n\n const room = this.rooms.find((room) => room.id === player.roomId);\n if (!room) {\n throw new Error('room not found.');\n }\n\n const roomPlayer = room.searchPlayer(playerInstance);\n \n if (!roomPlayer) {\n throw new Error('player not in room.');\n }\n\n roomPlayer.isReady = false;\n playerInstance.emit(\"status\", PlayerStatus.unready);\n room.emit(\"player-unready\", { ...player, ...roomPlayer });\n room.emit('update', room);\n\n return this;\n }\n\n removePlayer(sender: IPlayer) {\n const playerIndex = this.players.findIndex((p) => p.id === sender?.id);\n const player = this.players[playerIndex];\n if (playerIndex > -1) {\n this.players.splice(playerIndex, 1)[0];\n this.emit(\"player\", player, false);\n if (this.rooms.some(r => r.searchPlayer(player))) {\n setTimeout(() => {\n if (this.players.some(p => p.id === sender.id)) return; // player is online\n this.rooms.filter(r => r.searchPlayer(player)).forEach(r => {\n this.leavePlayer(sender, { ...sender, roomId: r.id });\n });\n }, 5 * 60 * 1000); // 5 minutes later\n }\n }\n return player;\n }\n}\n\nexport * from \"@lib/models/message\";\nexport * from \"@lib/models/room\";\nexport * from \"@lib/models/player\";\nexport * from \"@lib/events\";"],"mappings":"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"}
|
package/src/index.d.cts
CHANGED
|
@@ -140,12 +140,7 @@ declare class Player extends EventEmitter$1 implements IPlayer {
|
|
|
140
140
|
attributes?: any;
|
|
141
141
|
status: PlayerStatus;
|
|
142
142
|
sender?: (type: string, ...message: any) => void;
|
|
143
|
-
constructor(
|
|
144
|
-
id,
|
|
145
|
-
name,
|
|
146
|
-
attributes,
|
|
147
|
-
sender
|
|
148
|
-
}: IPlayerOptions);
|
|
143
|
+
constructor(player: Partial<IPlayerOptions> | Player, status?: PlayerStatus);
|
|
149
144
|
toJSON(): {
|
|
150
145
|
id: string;
|
|
151
146
|
name: string;
|
|
@@ -450,9 +445,9 @@ interface RoomEvents extends BaseEvents {
|
|
|
450
445
|
}) => void;
|
|
451
446
|
/**
|
|
452
447
|
* 玩家发送的房间命令
|
|
453
|
-
* @param {
|
|
448
|
+
* @param {any} message 命令内容
|
|
454
449
|
*/
|
|
455
|
-
'player-command': (message:
|
|
450
|
+
'player-command': (message: any) => void;
|
|
456
451
|
/**
|
|
457
452
|
* 房间命令
|
|
458
453
|
* @param {IMessagePackage} message 命令内容
|
|
@@ -625,6 +620,10 @@ interface IRoomPlayer extends IRoomPlayerOptions, IPlayer {
|
|
|
625
620
|
* 是否为房主
|
|
626
621
|
*/
|
|
627
622
|
isCreator: boolean;
|
|
623
|
+
/**
|
|
624
|
+
* 房间 Id
|
|
625
|
+
*/
|
|
626
|
+
roomId: string;
|
|
628
627
|
}
|
|
629
628
|
/**
|
|
630
629
|
* 房间玩家
|
|
@@ -633,8 +632,8 @@ declare class RoomPlayer extends Player implements IRoomPlayer {
|
|
|
633
632
|
isReady: boolean;
|
|
634
633
|
role: PlayerRole;
|
|
635
634
|
isCreator: boolean;
|
|
636
|
-
roomId
|
|
637
|
-
constructor(player:
|
|
635
|
+
roomId: string;
|
|
636
|
+
constructor(player: Partial<IRoomPlayer>, role?: PlayerRole);
|
|
638
637
|
toJSON(): {
|
|
639
638
|
role: PlayerRole;
|
|
640
639
|
isReady: boolean;
|
|
@@ -719,13 +718,7 @@ declare class Room extends EventEmitter$1 implements IRoom {
|
|
|
719
718
|
attrs: Record<string, any> | undefined;
|
|
720
719
|
};
|
|
721
720
|
toString(): string;
|
|
722
|
-
constructor(
|
|
723
|
-
id,
|
|
724
|
-
name,
|
|
725
|
-
size,
|
|
726
|
-
minSize,
|
|
727
|
-
attrs
|
|
728
|
-
}: Partial<IRoomOptions>);
|
|
721
|
+
constructor(room: Partial<IRoomOptions> | Room, players?: RoomPlayer[]);
|
|
729
722
|
/**
|
|
730
723
|
* 设置房主
|
|
731
724
|
* @param {Player} player 玩家
|
|
@@ -797,8 +790,8 @@ declare class Tiaoom extends EventEmitter {
|
|
|
797
790
|
* @returns this
|
|
798
791
|
*/
|
|
799
792
|
loadFrom(data: {
|
|
800
|
-
rooms?:
|
|
801
|
-
players?:
|
|
793
|
+
rooms?: Room[];
|
|
794
|
+
players?: Player[];
|
|
802
795
|
}): this;
|
|
803
796
|
on<K extends keyof TiaoomEvents>(event: K, listener: TiaoomEvents[K]): this;
|
|
804
797
|
emit<K extends keyof TiaoomEvents>(event: K, ...args: Parameters<TiaoomEvents[K]>): boolean;
|
package/src/index.d.mts
CHANGED
|
@@ -140,12 +140,7 @@ declare class Player extends EventEmitter$1 implements IPlayer {
|
|
|
140
140
|
attributes?: any;
|
|
141
141
|
status: PlayerStatus;
|
|
142
142
|
sender?: (type: string, ...message: any) => void;
|
|
143
|
-
constructor(
|
|
144
|
-
id,
|
|
145
|
-
name,
|
|
146
|
-
attributes,
|
|
147
|
-
sender
|
|
148
|
-
}: IPlayerOptions);
|
|
143
|
+
constructor(player: Partial<IPlayerOptions> | Player, status?: PlayerStatus);
|
|
149
144
|
toJSON(): {
|
|
150
145
|
id: string;
|
|
151
146
|
name: string;
|
|
@@ -450,9 +445,9 @@ interface RoomEvents extends BaseEvents {
|
|
|
450
445
|
}) => void;
|
|
451
446
|
/**
|
|
452
447
|
* 玩家发送的房间命令
|
|
453
|
-
* @param {
|
|
448
|
+
* @param {any} message 命令内容
|
|
454
449
|
*/
|
|
455
|
-
'player-command': (message:
|
|
450
|
+
'player-command': (message: any) => void;
|
|
456
451
|
/**
|
|
457
452
|
* 房间命令
|
|
458
453
|
* @param {IMessagePackage} message 命令内容
|
|
@@ -625,6 +620,10 @@ interface IRoomPlayer extends IRoomPlayerOptions, IPlayer {
|
|
|
625
620
|
* 是否为房主
|
|
626
621
|
*/
|
|
627
622
|
isCreator: boolean;
|
|
623
|
+
/**
|
|
624
|
+
* 房间 Id
|
|
625
|
+
*/
|
|
626
|
+
roomId: string;
|
|
628
627
|
}
|
|
629
628
|
/**
|
|
630
629
|
* 房间玩家
|
|
@@ -633,8 +632,8 @@ declare class RoomPlayer extends Player implements IRoomPlayer {
|
|
|
633
632
|
isReady: boolean;
|
|
634
633
|
role: PlayerRole;
|
|
635
634
|
isCreator: boolean;
|
|
636
|
-
roomId
|
|
637
|
-
constructor(player:
|
|
635
|
+
roomId: string;
|
|
636
|
+
constructor(player: Partial<IRoomPlayer>, role?: PlayerRole);
|
|
638
637
|
toJSON(): {
|
|
639
638
|
role: PlayerRole;
|
|
640
639
|
isReady: boolean;
|
|
@@ -719,13 +718,7 @@ declare class Room extends EventEmitter$1 implements IRoom {
|
|
|
719
718
|
attrs: Record<string, any> | undefined;
|
|
720
719
|
};
|
|
721
720
|
toString(): string;
|
|
722
|
-
constructor(
|
|
723
|
-
id,
|
|
724
|
-
name,
|
|
725
|
-
size,
|
|
726
|
-
minSize,
|
|
727
|
-
attrs
|
|
728
|
-
}: Partial<IRoomOptions>);
|
|
721
|
+
constructor(room: Partial<IRoomOptions> | Room, players?: RoomPlayer[]);
|
|
729
722
|
/**
|
|
730
723
|
* 设置房主
|
|
731
724
|
* @param {Player} player 玩家
|
|
@@ -797,8 +790,8 @@ declare class Tiaoom extends EventEmitter {
|
|
|
797
790
|
* @returns this
|
|
798
791
|
*/
|
|
799
792
|
loadFrom(data: {
|
|
800
|
-
rooms?:
|
|
801
|
-
players?:
|
|
793
|
+
rooms?: Room[];
|
|
794
|
+
players?: Player[];
|
|
802
795
|
}): this;
|
|
803
796
|
on<K extends keyof TiaoomEvents>(event: K, listener: TiaoomEvents[K]): this;
|
|
804
797
|
emit<K extends keyof TiaoomEvents>(event: K, ...args: Parameters<TiaoomEvents[K]>): boolean;
|
package/src/index.mjs
CHANGED
|
@@ -215,7 +215,7 @@ let PlayerStatus = /* @__PURE__ */ function(PlayerStatus$1) {
|
|
|
215
215
|
/**
|
|
216
216
|
* 玩家
|
|
217
217
|
*/
|
|
218
|
-
var Player = class extends EventEmitter$1 {
|
|
218
|
+
var Player = class Player extends EventEmitter$1 {
|
|
219
219
|
/**
|
|
220
220
|
* 监听玩家事件
|
|
221
221
|
* @param event 事件名,具体见 PlayEvents
|
|
@@ -234,17 +234,19 @@ var Player = class extends EventEmitter$1 {
|
|
|
234
234
|
emit(event, ...args) {
|
|
235
235
|
return super.emit(event, ...args);
|
|
236
236
|
}
|
|
237
|
-
constructor(
|
|
237
|
+
constructor(player, status = PlayerStatus.online) {
|
|
238
238
|
super();
|
|
239
239
|
this.id = "";
|
|
240
240
|
this.name = "";
|
|
241
241
|
this.status = PlayerStatus.online;
|
|
242
|
-
this.id = id;
|
|
243
|
-
this.name = name;
|
|
244
|
-
this.attributes = attributes;
|
|
245
|
-
this.sender = sender;
|
|
246
|
-
this.
|
|
247
|
-
|
|
242
|
+
this.id = player.id || (/* @__PURE__ */ new Date()).getTime().toString();
|
|
243
|
+
this.name = player.name || "";
|
|
244
|
+
this.attributes = player.attributes || {};
|
|
245
|
+
this.sender = player.sender;
|
|
246
|
+
if (player instanceof Player) this.status = player.status;
|
|
247
|
+
this.status = status;
|
|
248
|
+
this.on("status", (status$1) => {
|
|
249
|
+
this.status = status$1;
|
|
248
250
|
});
|
|
249
251
|
[
|
|
250
252
|
"command",
|
|
@@ -322,7 +324,11 @@ var RoomPlayer = class extends Player {
|
|
|
322
324
|
this.isReady = false;
|
|
323
325
|
this.role = PlayerRole.player;
|
|
324
326
|
this.isCreator = false;
|
|
325
|
-
this.
|
|
327
|
+
this.isReady = player.isReady || false;
|
|
328
|
+
this.isCreator = player.isCreator || false;
|
|
329
|
+
this.roomId = player.roomId || "";
|
|
330
|
+
this.role = player.role || role;
|
|
331
|
+
this.status = player.status || PlayerStatus.online;
|
|
326
332
|
if (player instanceof Player && player.sender) super.setSender(player.sender);
|
|
327
333
|
}
|
|
328
334
|
toJSON() {
|
|
@@ -337,7 +343,7 @@ var RoomPlayer = class extends Player {
|
|
|
337
343
|
/**
|
|
338
344
|
* 房间
|
|
339
345
|
*/
|
|
340
|
-
var Room = class extends EventEmitter$1 {
|
|
346
|
+
var Room = class Room extends EventEmitter$1 {
|
|
341
347
|
/**
|
|
342
348
|
* 监听房间事件
|
|
343
349
|
* @param event 事件名,具体见 RoomEvents
|
|
@@ -414,17 +420,24 @@ var Room = class extends EventEmitter$1 {
|
|
|
414
420
|
toString() {
|
|
415
421
|
return JSON.stringify(this.toJSON());
|
|
416
422
|
}
|
|
417
|
-
constructor(
|
|
423
|
+
constructor(room, players = []) {
|
|
418
424
|
super();
|
|
419
425
|
this.size = 10;
|
|
420
426
|
this.name = "";
|
|
421
427
|
this.minSize = 2;
|
|
422
428
|
this.players = [];
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
429
|
+
if (room instanceof Room) {
|
|
430
|
+
this.players = room.players;
|
|
431
|
+
this.players.forEach((p) => {
|
|
432
|
+
p.roomId = room.id;
|
|
433
|
+
});
|
|
434
|
+
}
|
|
435
|
+
this.id = room.id || (/* @__PURE__ */ new Date()).getTime().toString();
|
|
436
|
+
this.name = room.name || "";
|
|
437
|
+
this.size = room.size || 10;
|
|
438
|
+
this.minSize = room.minSize || 2;
|
|
439
|
+
this.attrs = room.attrs;
|
|
440
|
+
this.players = players;
|
|
428
441
|
[
|
|
429
442
|
"message",
|
|
430
443
|
"command",
|
|
@@ -481,8 +494,8 @@ var Room = class extends EventEmitter$1 {
|
|
|
481
494
|
roomPlayer.roomId = this.id;
|
|
482
495
|
this.players.push(roomPlayer);
|
|
483
496
|
this.emit("join", {
|
|
484
|
-
|
|
485
|
-
|
|
497
|
+
...roomPlayer,
|
|
498
|
+
roomId: this.id
|
|
486
499
|
});
|
|
487
500
|
return roomPlayer;
|
|
488
501
|
}
|
|
@@ -493,8 +506,8 @@ var Room = class extends EventEmitter$1 {
|
|
|
493
506
|
roomPlayer.role = PlayerRole.watcher;
|
|
494
507
|
roomPlayer.isReady = false;
|
|
495
508
|
this.emit("leave", {
|
|
496
|
-
|
|
497
|
-
|
|
509
|
+
...roomPlayer,
|
|
510
|
+
roomId: this.id
|
|
498
511
|
});
|
|
499
512
|
if (roomPlayer.isCreator && this.validPlayers.length > 0) {
|
|
500
513
|
this.validPlayers[0].isCreator = true;
|
|
@@ -509,8 +522,8 @@ var Room = class extends EventEmitter$1 {
|
|
|
509
522
|
const roomPlayer = this.players[index];
|
|
510
523
|
if (index > -1) {
|
|
511
524
|
this.emit("leave", {
|
|
512
|
-
|
|
513
|
-
|
|
525
|
+
...roomPlayer,
|
|
526
|
+
roomId: this.id
|
|
514
527
|
});
|
|
515
528
|
this.players.splice(index, 1);
|
|
516
529
|
if (roomPlayer.isCreator && this.players.length > 0) {
|
|
@@ -584,8 +597,18 @@ var Tiaoom = class extends EventEmitter {
|
|
|
584
597
|
*/
|
|
585
598
|
loadFrom(data) {
|
|
586
599
|
var _data$rooms, _data$players;
|
|
587
|
-
this.rooms = ((_data$rooms = data.rooms) === null || _data$rooms === void 0 ? void 0 : _data$rooms.map((r) => new Room(r))) ?? [];
|
|
588
|
-
this.players = ((_data$players = data.players) === null || _data$players === void 0 ? void 0 : _data$players.map((p) => new Player(p))) ?? [];
|
|
600
|
+
this.rooms = ((_data$rooms = data.rooms) === null || _data$rooms === void 0 ? void 0 : _data$rooms.map((r) => new Room(r, r.players))) ?? [];
|
|
601
|
+
this.players = ((_data$players = data.players) === null || _data$players === void 0 ? void 0 : _data$players.map((p) => new Player(p, p.status))) ?? [];
|
|
602
|
+
this.rooms.forEach((room) => {
|
|
603
|
+
room.setSender((type, message, sender) => {
|
|
604
|
+
var _this$messageInstance;
|
|
605
|
+
(_this$messageInstance = this.messageInstance) === null || _this$messageInstance === void 0 || _this$messageInstance.send({
|
|
606
|
+
type: `room.${type}`,
|
|
607
|
+
data: message,
|
|
608
|
+
sender: room
|
|
609
|
+
});
|
|
610
|
+
});
|
|
611
|
+
});
|
|
589
612
|
return this;
|
|
590
613
|
}
|
|
591
614
|
on(event, listener) {
|
|
@@ -596,8 +619,8 @@ var Tiaoom = class extends EventEmitter {
|
|
|
596
619
|
return super.emit(event, ...args);
|
|
597
620
|
}
|
|
598
621
|
run() {
|
|
599
|
-
var _this$
|
|
600
|
-
(_this$
|
|
622
|
+
var _this$messageInstance2;
|
|
623
|
+
(_this$messageInstance2 = this.messageInstance) === null || _this$messageInstance2 === void 0 || _this$messageInstance2.on("message", (message, cb) => {
|
|
601
624
|
try {
|
|
602
625
|
switch (message.type) {
|
|
603
626
|
case RecvMessageTypes.RoomList: return cb === null || cb === void 0 ? void 0 : cb(null, this.rooms);
|
|
@@ -628,9 +651,9 @@ var Tiaoom = class extends EventEmitter {
|
|
|
628
651
|
default: throw new Error("unknown message type.");
|
|
629
652
|
}
|
|
630
653
|
} catch (error) {
|
|
631
|
-
var _this$
|
|
654
|
+
var _this$messageInstance3;
|
|
632
655
|
cb === null || cb === void 0 || cb(error);
|
|
633
|
-
(_this$
|
|
656
|
+
(_this$messageInstance3 = this.messageInstance) === null || _this$messageInstance3 === void 0 || _this$messageInstance3.send({
|
|
634
657
|
type: MessageTypes.PlayerError,
|
|
635
658
|
data: {
|
|
636
659
|
name: error.name,
|
|
@@ -642,43 +665,43 @@ var Tiaoom = class extends EventEmitter {
|
|
|
642
665
|
}
|
|
643
666
|
});
|
|
644
667
|
this.on("player", (player, online) => {
|
|
645
|
-
var _this$
|
|
646
|
-
(_this$
|
|
668
|
+
var _this$messageInstance4;
|
|
669
|
+
(_this$messageInstance4 = this.messageInstance) === null || _this$messageInstance4 === void 0 || _this$messageInstance4.send({
|
|
647
670
|
type: online ? MessageTypes.PlayerLogin : MessageTypes.PlayerLogout,
|
|
648
671
|
data: player
|
|
649
672
|
});
|
|
650
673
|
});
|
|
651
674
|
this.on("players", (players) => {
|
|
652
|
-
var _this$
|
|
653
|
-
(_this$
|
|
675
|
+
var _this$messageInstance5;
|
|
676
|
+
(_this$messageInstance5 = this.messageInstance) === null || _this$messageInstance5 === void 0 || _this$messageInstance5.send({
|
|
654
677
|
type: MessageTypes.PlayerList,
|
|
655
678
|
data: players
|
|
656
679
|
});
|
|
657
680
|
});
|
|
658
681
|
this.on("room", (room) => {
|
|
659
|
-
var _this$
|
|
660
|
-
(_this$
|
|
682
|
+
var _this$messageInstance6;
|
|
683
|
+
(_this$messageInstance6 = this.messageInstance) === null || _this$messageInstance6 === void 0 || _this$messageInstance6.send({
|
|
661
684
|
type: MessageTypes.RoomCreate,
|
|
662
685
|
data: room
|
|
663
686
|
});
|
|
664
687
|
});
|
|
665
688
|
this.on("room-player", (room) => {
|
|
666
|
-
var _this$
|
|
667
|
-
(_this$
|
|
689
|
+
var _this$messageInstance7;
|
|
690
|
+
(_this$messageInstance7 = this.messageInstance) === null || _this$messageInstance7 === void 0 || _this$messageInstance7.send({
|
|
668
691
|
type: MessageTypes.RoomUpdate,
|
|
669
692
|
data: room
|
|
670
693
|
});
|
|
671
694
|
});
|
|
672
695
|
this.on("rooms", (rooms) => {
|
|
673
|
-
var _this$
|
|
674
|
-
(_this$
|
|
696
|
+
var _this$messageInstance8;
|
|
697
|
+
(_this$messageInstance8 = this.messageInstance) === null || _this$messageInstance8 === void 0 || _this$messageInstance8.send({
|
|
675
698
|
type: MessageTypes.RoomList,
|
|
676
699
|
data: rooms
|
|
677
700
|
});
|
|
678
701
|
});
|
|
679
702
|
this.on("message", (data, sender) => {
|
|
680
|
-
var _this$
|
|
681
|
-
(_this$
|
|
703
|
+
var _this$messageInstance9;
|
|
704
|
+
(_this$messageInstance9 = this.messageInstance) === null || _this$messageInstance9 === void 0 || _this$messageInstance9.send({
|
|
682
705
|
type: MessageTypes.GlobalMessage,
|
|
683
706
|
data,
|
|
684
707
|
sender
|
|
@@ -700,19 +723,19 @@ var Tiaoom = class extends EventEmitter {
|
|
|
700
723
|
if (this.rooms.some((r) => r.players.some((p) => p.id === sender.id))) throw new Error("you are already in a room.");
|
|
701
724
|
const room = new Room(options);
|
|
702
725
|
room.setSender((type, message, sender$1) => {
|
|
703
|
-
var _this$
|
|
704
|
-
(_this$
|
|
726
|
+
var _this$messageInstance10;
|
|
727
|
+
(_this$messageInstance10 = this.messageInstance) === null || _this$messageInstance10 === void 0 || _this$messageInstance10.send({
|
|
705
728
|
type: `room.${type}`,
|
|
706
729
|
data: message,
|
|
707
730
|
sender: room
|
|
708
731
|
});
|
|
709
732
|
});
|
|
710
|
-
this.emit("room", room);
|
|
711
733
|
this.rooms.push(room);
|
|
712
734
|
this.joinPlayer(sender, {
|
|
713
735
|
roomId: room.id,
|
|
714
736
|
...sender
|
|
715
737
|
}, true);
|
|
738
|
+
this.emit("room", room);
|
|
716
739
|
return room;
|
|
717
740
|
}
|
|
718
741
|
startRoom(sender, room) {
|
|
@@ -757,20 +780,22 @@ var Tiaoom = class extends EventEmitter {
|
|
|
757
780
|
}
|
|
758
781
|
loginPlayer(player, cb) {
|
|
759
782
|
let playerInstance = this.searchPlayer(player);
|
|
760
|
-
if (!playerInstance) {
|
|
761
|
-
|
|
783
|
+
if (!(playerInstance === null || playerInstance === void 0 ? void 0 : playerInstance.sender)) {
|
|
784
|
+
if (!playerInstance) {
|
|
785
|
+
playerInstance = new Player(player);
|
|
786
|
+
this.players.push(playerInstance);
|
|
787
|
+
}
|
|
762
788
|
playerInstance.setSender((type, message) => {
|
|
763
|
-
var _this$
|
|
764
|
-
(_this$
|
|
789
|
+
var _this$messageInstance11;
|
|
790
|
+
(_this$messageInstance11 = this.messageInstance) === null || _this$messageInstance11 === void 0 || _this$messageInstance11.send({
|
|
765
791
|
type: `player.${type}`,
|
|
766
792
|
data: message,
|
|
767
793
|
sender: playerInstance
|
|
768
794
|
});
|
|
769
795
|
});
|
|
770
|
-
this.players.push(playerInstance);
|
|
771
796
|
this.emit("player", playerInstance, true);
|
|
772
797
|
}
|
|
773
|
-
playerInstance.emit("status",
|
|
798
|
+
playerInstance.emit("status", playerInstance.status);
|
|
774
799
|
cb === null || cb === void 0 || cb({ player: playerInstance });
|
|
775
800
|
return playerInstance;
|
|
776
801
|
}
|