-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathhostMaster.ts
93 lines (81 loc) · 2.08 KB
/
hostMaster.ts
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
92
93
import geckos, {
GeckosServer,
iceServers,
ServerChannel,
} from "@geckos.io/server";
import http from "http";
import { ClientMessage } from "../../../common/types/messages.js";
import {
ClientPacket,
ClientPacketType,
PayloadFor,
ServerPacketType,
} from "../../../common/types/packet.js";
export type CallbackFnFor<T extends ClientPacketType> = (
channel: ServerChannel,
arg: PayloadFor<T>
) => void;
export type CallbackFor<T extends ClientPacketType> = {
type: T;
callback: CallbackFnFor<T>;
};
export type Callback = CallbackFor<ClientPacketType>;
export class HostMaster {
callbacks: Callback[] = [];
io: GeckosServer;
lobbyChannels: ServerChannel[] = [];
gameHandlers: { [key: string]: (msg: ClientMessage) => void } = {};
constructor(server: http.Server) {
this.io = geckos({
iceServers: iceServers,
portRange: {
min: 20000,
max: 25000,
}
});
this.io.addServer(server);
this.addHandlersCallback();
this.io.onConnection((channel: ServerChannel) => {
console.log("new connection");
this.lobbyChannels.push(channel);
channel.on("msg", (p: any) => {
const packet = p as ClientPacket;
this.callbacks
.find((c) => c.type === packet.type)
?.callback(channel, packet.payload);
});
});
}
private addHandlersCallback() {
this.addCallback("gameInfo", (_, payload) => {
this.gameHandlers?.[payload.gameId]?.(payload.payload);
});
}
public setGameHandler(gameId: string, handler: (msg: ClientMessage) => void) {
this.gameHandlers[gameId] = handler;
}
public clearGameHandlers(gameId: string) {
delete this.gameHandlers[gameId];
}
public addCallback<T extends ClientPacketType>(
type: T,
callback: CallbackFnFor<T>
) {
this.callbacks.push({ type, callback });
}
public send<T extends ServerPacketType>(
channel: ServerChannel,
type: T,
payload: PayloadFor<T>,
reliable: boolean = false
) {
channel.emit(
"msg",
{
type,
payload,
},
{ reliable }
);
}
}