-
Notifications
You must be signed in to change notification settings - Fork 0
/
server.ts
76 lines (72 loc) · 2.33 KB
/
server.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
import type { PartyKitServer } from "partykit/server";
import { interpret } from "xstate";
import { serverMachine } from "./src/srcServer/stateServer/serverMachine";
import type {
ServerToClientMessage,
ServerConnectionEvent,
AddExcludedPlayers,
} from "./server.types";
import type {
ClientToServerMessage,
LettersChangedMessage,
SolutionMessage,
} from "./src/state/gameMachine.types";
import type { ScreenNameMessage } from "./src/components/Buttons";
const serverService = interpret(serverMachine()).start();
export default {
async onConnect(connection, room) {
if ([...room.getConnections()].length === 1) {
serverService.send({
type: "firstUserConnected",
connectionId: connection.id,
});
} else {
serverService.send({ type: "newPlayer", connectionId: connection.id });
}
// listen for client messages
connection.addEventListener("message", (event) => {
if (typeof event.data !== "string") {
return;
}
const message: ClientToServerMessage = JSON.parse(event.data);
console.log("clientToServerMessage: ", message);
serverService.send({ ...message, connectionId: connection.id });
});
// send machine events to the client
serverService.onEvent((evt) => {
if (
(
[
"solution",
"newPlayer",
"firstUserConnected",
"userDisconnected",
"lastUserDisconnected",
"screenName",
"lettersChanged",
] satisfies Array<
| ServerConnectionEvent["type"]
| SolutionMessage["type"]
| ScreenNameMessage["type"]
| LettersChangedMessage["type"]
>
).includes(evt.type as ServerConnectionEvent["type"])
) {
return;
}
console.log("serverToClientMessage: ", evt);
const { excludedPlayers, ...event } =
evt as AddExcludedPlayers<ServerToClientMessage>;
room.broadcast(JSON.stringify(event), excludedPlayers);
});
connection.addEventListener("close", () => {
if ([...room.getConnections()].length === 0) {
serverService.send("lastUserDisconnected");
}
serverService.send({
type: "userDisconnected",
connectionId: connection.id,
} satisfies ServerConnectionEvent);
});
},
} satisfies PartyKitServer;