-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathindex.ts
63 lines (50 loc) · 1.73 KB
/
index.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
import http from "http";
import Koa from "koa";
import socketio from "socket.io";
import { AframeEvent, KaraokeEvent } from "@shared/events";
import { socketPort } from "@shared/ports";
import { JoinRoomData, PersonId, RoomPerson } from "@shared/types";
import { aframeEvents } from "./events/aframe";
import { karaokeEvents } from "./events/karaoke";
import { createLogger } from "./logging";
import { RoomsStore } from "./RoomsStore";
const logConnection = createLogger("connection");
const app = new Koa();
const server = http.createServer(app.callback());
const io = new socketio.Server(server, {
allowEIO3: true,
cors: {
origin: "http://localhost:3000",
methods: ["GET", "POST"],
credentials: true,
},
});
const roomsStore = new RoomsStore();
io.on("connection", (socket) => {
const personId = socket.id as PersonId;
socket.on(AframeEvent.JoinRoom, ({ room: roomName }: JoinRoomData) => {
const person: RoomPerson = {
id: personId,
joinedTime: Date.now(),
};
const room = roomsStore.join(roomName, person);
const log = logConnection.within(["room", roomName], ["person", person.id]);
const registration = { io, log, person, room, socket };
socket.join(roomName);
aframeEvents(registration);
karaokeEvents(registration);
socket.on("disconnect", () => {
roomsStore.leave(person.id, room);
socket.to(room.name).emit(AframeEvent.OccupantsChanged, {
occupants: Object.fromEntries(room.occupants),
});
socket.to(room.name).emit(KaraokeEvent.OccupantsUpdated, {
occupants: Array.from(room.occupants.values()),
});
});
log("Connected.");
});
});
server.listen(socketPort, () => {
logConnection(`Listening on port ${socketPort}...`);
});