|
|
|
import express from "express";
|
|
|
|
import SocketIO, {Socket} from "socket.io";
|
|
|
|
import path from "path";
|
|
|
|
|
|
|
|
import Service from './Service'
|
|
|
|
|
|
|
|
// process.on('SIGINT', () => process.exit());
|
|
|
|
// process.on('SIGTERM', () => process.exit());
|
|
|
|
|
|
|
|
const HOST = '0.0.0.0';
|
|
|
|
const PORT = 3001;
|
|
|
|
|
|
|
|
const app = express();
|
|
|
|
const server = app.listen(PORT, HOST, () => console.log(`Centurion listening on port ${PORT}!`));
|
|
|
|
app.use(express.static(path.join(__dirname, '../public')));
|
|
|
|
|
|
|
|
const io = SocketIO(server);
|
|
|
|
|
|
|
|
const service = new Service();
|
|
|
|
|
|
|
|
io.on('connection', socket => {
|
|
|
|
socket.on('disconnect', (reason) => {
|
|
|
|
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) => {
|
|
|
|
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', (options) => {
|
|
|
|
service.onRequestStart(socket);
|
|
|
|
});
|
|
|
|
|
|
|
|
socket.on('request_join', (roomId: number) => {
|
|
|
|
if (!Number.isSafeInteger(roomId)) return;
|
|
|
|
|
|
|
|
service.onRequestJoin(socket, roomId);
|
|
|
|
});
|
|
|
|
|
|
|
|
socket.on('request_ready', () => {
|
|
|
|
service.onRequestReady(socket);
|
|
|
|
})
|
|
|
|
|
|
|
|
socket.on('request_join_random', () => {
|
|
|
|
service.onRequestJoinRandom(socket);
|
|
|
|
})
|
|
|
|
|
|
|
|
socket.on('call', (id: number, name: string, params: any) => {
|
|
|
|
if (!Number.isSafeInteger(id)) return;
|
|
|
|
// noinspection SuspiciousTypeOfGuard
|
|
|
|
if (!name || typeof (name) !== 'string') return;
|
|
|
|
// if (!params) return;
|
|
|
|
|
|
|
|
let call = new Call(socket, id, name, params);
|
|
|
|
|
|
|
|
if (name == 'room_exists') {
|
|
|
|
let roomId = params && params['roomId'];
|
|
|
|
if (!Number.isSafeInteger(roomId)) {
|
|
|
|
call.error('Invalid room id');
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
call.respond(service.hasRoomId(roomId));
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
//
|
|
|
|
// 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);
|
|
|
|
// }
|
|
|
|
// }
|
|
|
|
})
|
|
|
|
|
|
|
|
service.onSocketConnect(socket);
|
|
|
|
|
|
|
|
/*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);
|
|
|
|
}
|
|
|
|
});*/
|
|
|
|
});
|
|
|
|
|
|
|
|
class Call {
|
|
|
|
private socket: Socket;
|
|
|
|
private id: number;
|
|
|
|
private name: string;
|
|
|
|
private params: any;
|
|
|
|
|
|
|
|
constructor(socket: Socket, id: number, name: string, params: any) {
|
|
|
|
this.socket = socket;
|
|
|
|
this.id = id;
|
|
|
|
this.name = name;
|
|
|
|
this.params = params;
|
|
|
|
}
|
|
|
|
|
|
|
|
error(reason: string) {
|
|
|
|
this.socket.emit('call_response', {
|
|
|
|
'id': this.id,
|
|
|
|
'error': reason
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
respond(data: any) {
|
|
|
|
this.socket.emit('call_response', {
|
|
|
|
'id': this.id,
|
|
|
|
'response': data
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|