const express = require('express'); const path = require('path'); const cookieParser = require('cookie-parser'); const logger = require('morgan'); const http = require("http"); const { Server } = require("socket.io"); const createClient = require('redis').createClient; const client = createClient( { socket: { // host: 'simple_map_redis', host: 'localhost', } } ); client.on('error', err => console.log('Redis Client Error', err)); client.connect(); const indexRouter = require('./routes/index'); const app = express(); app.use(logger('dev')); app.use(express.json()); app.use(express.urlencoded({ extended: false })); app.use(cookieParser()); app.use(express.static(path.join(__dirname, 'public'))); app.use('/', indexRouter); let users = []; const server = http.createServer(app); const io = new Server(server); io.on('connection', (socket) => { const randomColor = "#" + ((1 << 24) * Math.random() | 0).toString(16).padStart(6, "0"); users.push({"color": randomColor, "id": socket.id}); io.to(socket.id).emit('color', {"color": randomColor, "id": socket.id}); io.emit('users', users); client.lRange('draw', -500, -1).then((res) => { let lines = []; res.forEach((line) => { lines.push(JSON.parse(line)); }); io.to(socket.id).emit('history', lines); }); socket.on('disconnect', () => { users = users.filter(user => user.id !== socket.id); io.emit('users', users); }); socket.on('new_color', msg => { const user = msg.user; users.find(u => u.id === user).color = msg.color; io.emit('users', users); }); socket.on('new_marker', msg => { const user = msg.user; const color = users.find(u => u.id === user).color; console.log(msg.coords); io.emit('new_marker', {"marker": msg.marker, "color": color, "coords": msg.coords}); }); socket.on('draw', async (msg) => { const user = msg.user; const color = users.find(u => u.id === user).color; await client.rPush('draw', JSON.stringify({"line": msg.line, "color": color})); await client.lTrim('draw', -500, -1); await client.expire('draw', 600); socket.broadcast.emit('draw', {"line": msg.line, "color": color}); }); }); function normalizePort(val) { var port = parseInt(val, 10); if (isNaN(port)) { // named pipe return val; } if (port >= 0) { // port number return port; } return false; } var port = normalizePort(process.env.PORT || '3232'); app.set('port', port); server.listen(port); server.on('error', onError); server.on('listening', onListening); function onError(error) { if (error.syscall !== 'listen') { throw error; } var bind = typeof port === 'string' ? 'Pipe ' + port : 'Port ' + port; // handle specific listen errors with friendly messages switch (error.code) { case 'EACCES': console.error(bind + ' requires elevated privileges'); process.exit(1); break; case 'EADDRINUSE': console.error(bind + ' is already in use'); process.exit(1); break; default: throw error; } } function onListening() { var addr = server.address(); var bind = typeof addr === 'string' ? 'pipe ' + addr : 'port ' + addr.port; console.log('Listening on ' + bind); }