ludo-web-multiplayer/backend/server.js
2022-05-30 09:06:59 +02:00

98 lines
2.6 KiB
JavaScript

const express = require('express');
const cors = require('cors');
const cookieParser = require('cookie-parser');
const { sessionMiddleware, wrap } = require('./controllers/serverController');
const registerPlayerHandlers = require('./handlers/playerHandler');
const registerRoomHandlers = require('./handlers/roomHandler');
const PORT = 8080;
const mongoose = require('mongoose');
const CONNECTION_URI = require('./credentials.js');
const app = express();
app.use(cookieParser());
app.use(
express.urlencoded({
extended: true,
})
);
app.use(express.json());
app.set('trust proxy', 1);
app.use(
cors({
origin: 'http://localhost:3000',
credentials: true,
})
);
app.use(sessionMiddleware);
mongoose.set('useFindAndModify', false);
mongoose
.connect(CONNECTION_URI, {
useNewUrlParser: true,
useUnifiedTopology: true,
})
.then(() => {
console.log('MongoDB Connected…');
})
.catch(err => console.error(err));
const server = app.listen(PORT, () => {
console.log('Server runs on port ' + PORT);
});
const io = require('socket.io')(server, {
cors: {
origin: 'http://localhost:3000',
credentials: true,
},
allowRequest: (req, callback) => {
const fakeRes = {
getHeader() {
return [];
},
setHeader(key, values) {
req.cookieHolder = values[0];
},
writeHead() {},
};
sessionMiddleware(req, fakeRes, () => {
if (req.session) {
fakeRes.writeHead();
req.session.save();
}
callback(null, true);
});
},
});
io.engine.on('initial_headers', (headers, req) => {
if (req.cookieHolder) {
headers['set-cookie'] = req.cookieHolder;
delete req.cookieHolder;
}
});
io.use(wrap(sessionMiddleware));
io.on('connection', socket => {
registerPlayerHandlers(io, socket);
registerRoomHandlers(io, socket);
if (socket.request.session.roomId) {
socket.join(socket.request.session.roomId);
socket.emit('player:data', JSON.stringify(socket.request.session));
io.to(socket.request.session.roomId).emit('player joined');
}
});
//ROUTES CONFIG
const playerRoutes = require('./routes/player');
const gameRoutes = require('./routes/game');
app.use('/player', playerRoutes);
app.use('/game', gameRoutes);
if (process.env.NODE_ENV === 'production') {
app.use(express.static('/app/build'));
app.get('/', (req, res) => {
res.sendFile('/app/build/index.html');
});
}