Kopie van https://gitlab.com/studieverenigingvia/ict/centurion met een paar aanpassingen
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
187 lines
4.9 KiB
187 lines
4.9 KiB
import express from "express";
|
|
import { Server } from "socket.io";
|
|
import path from "path";
|
|
|
|
import Service from "./Service";
|
|
import { RoomOptions } from "./Room";
|
|
|
|
// process.on('SIGINT', () => process.exit());
|
|
// process.on('SIGTERM', () => process.exit());
|
|
|
|
const HOST = "0.0.0.0";
|
|
const PORT = 3001;
|
|
|
|
const app = express();
|
|
const httpServer = app.listen(PORT, HOST, () =>
|
|
console.log(`Centurion listening on port ${PORT}!`)
|
|
);
|
|
app.use(express.static(path.join(__dirname, "../public")));
|
|
|
|
const io = new Server(httpServer);
|
|
|
|
const service = new Service();
|
|
|
|
app.get("/state", (req, res) => {
|
|
return res.json(service.rooms.map((r) => r.serialize()));
|
|
});
|
|
|
|
io.on("connection", (socket) => {
|
|
socket.on("disconnect", async () => {
|
|
await service.onSocketDisconnect(socket);
|
|
});
|
|
|
|
socket.on("ping", () => {
|
|
socket.emit("pong");
|
|
});
|
|
|
|
socket.on("time_sync", (requestId: number, clientTime: number) => {
|
|
if (!Number.isSafeInteger(requestId)) return;
|
|
if (!Number.isSafeInteger(clientTime)) return;
|
|
|
|
service.onTimeSync(socket, requestId, clientTime);
|
|
});
|
|
|
|
socket.on("room_options", (options: RoomOptions) => {
|
|
if (!options) return;
|
|
if (!options.timelineName || typeof options.timelineName !== "string")
|
|
return;
|
|
if (!Number.isSafeInteger(options.seekTime)) return;
|
|
|
|
service.onSetRoomOptions(socket, options);
|
|
});
|
|
|
|
socket.on("request_start", () => {
|
|
service.onRequestStart(socket);
|
|
});
|
|
|
|
socket.on(
|
|
"request_join",
|
|
async (roomId: number, callback: (err?: string, res?: boolean) => void) => {
|
|
if (!Number.isSafeInteger(roomId)) {
|
|
return callback("Invalid roomId.");
|
|
}
|
|
|
|
if (!service.hasRoomId(roomId)) {
|
|
// cannot join a room that does not exist.
|
|
return callback(undefined, false);
|
|
}
|
|
|
|
try {
|
|
const didJoinRoom = await service.onRequestJoin(socket, roomId);
|
|
callback(undefined, didJoinRoom);
|
|
} catch (e) {
|
|
callback(e instanceof Error ? e.message : "Unknown error.");
|
|
}
|
|
}
|
|
);
|
|
|
|
socket.on("request_set_ready", () => {
|
|
service.onRequestSetReady(socket);
|
|
});
|
|
|
|
socket.on("request_join_random", async () => {
|
|
await service.onRequestJoinRandom(socket);
|
|
});
|
|
|
|
socket.on(
|
|
"submit_ticker_message",
|
|
(message?: unknown, callback?: (res?: null, err?: string) => void) => {
|
|
if (typeof message !== "string") {
|
|
return callback && callback(null, "Invalid message.");
|
|
}
|
|
|
|
if (message.length > 192) {
|
|
// perfect voor het Wilhelmus
|
|
return callback && callback(null, "Message too long.");
|
|
}
|
|
|
|
try {
|
|
service.submitTickerMessage(socket, message);
|
|
return callback && callback();
|
|
} catch (e) {
|
|
console.error(e);
|
|
return (
|
|
callback &&
|
|
callback(null, e instanceof Error ? e.message : "Unknown error")
|
|
);
|
|
}
|
|
}
|
|
);
|
|
|
|
service.onSocketConnect(socket);
|
|
|
|
// if (name == 'request_join') {
|
|
// let roomId = params && params['roomId'];
|
|
// if (!Number.isSafeInteger(roomId)) {
|
|
// call.error('Invalid room id');
|
|
// return;
|
|
// }
|
|
// if (!service.hasRoomId(roomId)) {
|
|
// call.respond(false);
|
|
// return;
|
|
// }
|
|
// if (service.onRequestJoin(socket, roomId)) {
|
|
// call.respond(true);
|
|
// } else {
|
|
// call.respond(false);
|
|
// }
|
|
// }
|
|
|
|
/*socket.on('join_room', (roomId, callback) => {
|
|
if (!callback || typeof callback !== 'function') {
|
|
console.error("Join: Callback not a function.");
|
|
return
|
|
}
|
|
|
|
if (!roomId) {
|
|
return callback('no_room_id_given');
|
|
}
|
|
|
|
if (!Number.isSafeInteger(+roomId)) {
|
|
return callback('room_id_not_integer');
|
|
}
|
|
|
|
console.log(`${socketId} wants to join '${roomId}'.`);
|
|
|
|
// Leave current room first
|
|
|
|
let currentRoom = service.getUserRoom(socketId);
|
|
if (currentRoom) {
|
|
socket.leave(currentRoom.name);
|
|
service.leaveRoom(socketId);
|
|
}
|
|
|
|
const room = service.joinRoom(socketId, roomId);
|
|
|
|
socket.join(room.name);
|
|
sendRoom(socket, room);
|
|
});
|
|
|
|
socket.on('room_info', callback => {
|
|
if (!callback || typeof callback !== 'function') {
|
|
console.error("Room info: Callback not a function.");
|
|
return
|
|
}
|
|
|
|
const room = service.getUserRoom(socketId);
|
|
sendRoom(socket, room);
|
|
});
|
|
|
|
socket.on('request_start', (time = null) => {
|
|
console.log('request start', socket.rooms);
|
|
|
|
const room = service.getUserRoom(socketId);
|
|
if (!room.isLeader(socketId)) {
|
|
console.warn("Non leader tried to start.");
|
|
return;
|
|
}
|
|
|
|
room.run(io);
|
|
sendRoom(io.to(room.name.toString()), room);
|
|
|
|
if (typeof time === 'number' && time) {
|
|
console.log("Starting at", time);
|
|
room.seek(io, time);
|
|
}
|
|
});*/
|
|
});
|
|
|