File size: 2,830 Bytes
5b324f1
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
import WebSocket, { WebSocketServer } from "ws";
import fs from "fs";
import { MonopolyWebSocketMsgType } from "../enums/bace";
import { asyncMissionQueue, MissionQueueItem } from "../utils/async-mission-queue";
import { MonopolyWebSocketMsg } from "../interfaces/bace";
import { serverLog } from "../utils/logger";
import chalk from "chalk";

export class RoomRouter {
	private webSocketPort: number;

	private webSocketServer: WebSocketServer;

	//K:房间Id,  V:主机游戏进程的peerId
	private roomMap: Map<string, string> = new Map();

	constructor(webSocketPort: number) {
		this.webSocketPort = webSocketPort;
		this.webSocketServer = new WebSocketServer(
			{
				port: webSocketPort,
			},
			() => {
				serverLog(`${chalk.bold.bgGreen(` RoomRouter-WebSocket服务启动成功 ${webSocketPort}端口`)}`);
			}
		);
		this.webSocketServer.on("connection", async (client) => {
			sendToClient(client, MonopolyWebSocketMsgType.Connected, "success");

			let end = false;
			while (!end) {
				const missionQueue: MissionQueueItem<MonopolyWebSocketMsgType, MonopolyWebSocketMsg>[] = [
					{
						type: MonopolyWebSocketMsgType.JoinRoom,
						fn: (data, cancle) => {
							const roomId = data.data;
							if (!roomId) {
								sendToClient(client, MonopolyWebSocketMsgType.Error, "不合法的房间ID");
								throw Error("不合法的房间ID");
							}
							if (this.roomMap.has(roomId)) {
								//有Id就加入
								//Join Room
								sendToClient(client, MonopolyWebSocketMsgType.JoinRoom, this.roomMap.get(roomId));
								end = true;
								cancle("通讯结束");
							} else {
								//没有Id就创建
								sendToClient(client, MonopolyWebSocketMsgType.JoinRoom, {
									create: true,
									roomId: roomId,
								});

								//添加一条任务: 等待客户端生成游戏主机服务端
								missionQueue.push({
									type: MonopolyWebSocketMsgType.CreateRoom,
									fn: (data) => {
										const hostPeerId = data.data;
										this.roomMap.set(roomId, hostPeerId);
										end = true;
									},
								});
							}
						},
					},
				];
				await asyncMissionQueue<MonopolyWebSocketMsgType, MonopolyWebSocketMsg>((callback) => {
					const messageHandler = (event: WebSocket.MessageEvent) => {
						const data: MonopolyWebSocketMsg = JSON.parse(event.data.toString());
						callback(data);
					};
					client.addEventListener("message", messageHandler);
					return () => client.removeEventListener("message", messageHandler);
				}, missionQueue)
					.then((e) => {
						console.log(e);
					})
					.catch((e) => {
						console.log(e);
					});
			}
			console.dir(this.roomMap);
			client.close();
		});
	}
}

function sendToClient(ws: WebSocket, type: MonopolyWebSocketMsgType, data: any) {
	ws.send(JSON.stringify({ type, data }));
}