index.js (2244B)
1 'use strict'; 2 3 const session = require('express-session'); 4 const express = require('express'); 5 const http = require('http'); 6 const uuid = require('uuid'); 7 8 const { WebSocketServer } = require('../..'); 9 10 const app = express(); 11 const map = new Map(); 12 13 // 14 // We need the same instance of the session parser in express and 15 // WebSocket server. 16 // 17 const sessionParser = session({ 18 saveUninitialized: false, 19 secret: '$eCuRiTy', 20 resave: false 21 }); 22 23 // 24 // Serve static files from the 'public' folder. 25 // 26 app.use(express.static('public')); 27 app.use(sessionParser); 28 29 app.post('/login', function (req, res) { 30 // 31 // "Log in" user and set userId to session. 32 // 33 const id = uuid.v4(); 34 35 console.log(`Updating session for user ${id}`); 36 req.session.userId = id; 37 res.send({ result: 'OK', message: 'Session updated' }); 38 }); 39 40 app.delete('/logout', function (request, response) { 41 const ws = map.get(request.session.userId); 42 43 console.log('Destroying session'); 44 request.session.destroy(function () { 45 if (ws) ws.close(); 46 47 response.send({ result: 'OK', message: 'Session destroyed' }); 48 }); 49 }); 50 51 // 52 // Create an HTTP server. 53 // 54 const server = http.createServer(app); 55 56 // 57 // Create a WebSocket server completely detached from the HTTP server. 58 // 59 const wss = new WebSocketServer({ clientTracking: false, noServer: true }); 60 61 server.on('upgrade', function (request, socket, head) { 62 console.log('Parsing session from request...'); 63 64 sessionParser(request, {}, () => { 65 if (!request.session.userId) { 66 socket.write('HTTP/1.1 401 Unauthorized\r\n\r\n'); 67 socket.destroy(); 68 return; 69 } 70 71 console.log('Session is parsed!'); 72 73 wss.handleUpgrade(request, socket, head, function (ws) { 74 wss.emit('connection', ws, request); 75 }); 76 }); 77 }); 78 79 wss.on('connection', function (ws, request) { 80 const userId = request.session.userId; 81 82 map.set(userId, ws); 83 84 ws.on('message', function (message) { 85 // 86 // Here we can now use session parameters. 87 // 88 console.log(`Received message ${message} from user ${userId}`); 89 }); 90 91 ws.on('close', function () { 92 map.delete(userId); 93 }); 94 }); 95 96 // 97 // Start the server. 98 // 99 server.listen(8080, function () { 100 console.log('Listening on http://localhost:8080'); 101 });