diff options
Diffstat (limited to '')
-rw-r--r-- | testing/xpcshell/node-ws/examples/express-session-parse/index.js | 101 |
1 files changed, 101 insertions, 0 deletions
diff --git a/testing/xpcshell/node-ws/examples/express-session-parse/index.js b/testing/xpcshell/node-ws/examples/express-session-parse/index.js new file mode 100644 index 0000000000..b62a2e4a5f --- /dev/null +++ b/testing/xpcshell/node-ws/examples/express-session-parse/index.js @@ -0,0 +1,101 @@ +'use strict'; + +const session = require('express-session'); +const express = require('express'); +const http = require('http'); +const uuid = require('uuid'); + +const { WebSocketServer } = require('../..'); + +const app = express(); +const map = new Map(); + +// +// We need the same instance of the session parser in express and +// WebSocket server. +// +const sessionParser = session({ + saveUninitialized: false, + secret: '$eCuRiTy', + resave: false +}); + +// +// Serve static files from the 'public' folder. +// +app.use(express.static('public')); +app.use(sessionParser); + +app.post('/login', function (req, res) { + // + // "Log in" user and set userId to session. + // + const id = uuid.v4(); + + console.log(`Updating session for user ${id}`); + req.session.userId = id; + res.send({ result: 'OK', message: 'Session updated' }); +}); + +app.delete('/logout', function (request, response) { + const ws = map.get(request.session.userId); + + console.log('Destroying session'); + request.session.destroy(function () { + if (ws) ws.close(); + + response.send({ result: 'OK', message: 'Session destroyed' }); + }); +}); + +// +// Create an HTTP server. +// +const server = http.createServer(app); + +// +// Create a WebSocket server completely detached from the HTTP server. +// +const wss = new WebSocketServer({ clientTracking: false, noServer: true }); + +server.on('upgrade', function (request, socket, head) { + console.log('Parsing session from request...'); + + sessionParser(request, {}, () => { + if (!request.session.userId) { + socket.write('HTTP/1.1 401 Unauthorized\r\n\r\n'); + socket.destroy(); + return; + } + + console.log('Session is parsed!'); + + wss.handleUpgrade(request, socket, head, function (ws) { + wss.emit('connection', ws, request); + }); + }); +}); + +wss.on('connection', function (ws, request) { + const userId = request.session.userId; + + map.set(userId, ws); + + ws.on('message', function (message) { + // + // Here we can now use session parameters. + // + console.log(`Received message ${message} from user ${userId}`); + }); + + ws.on('close', function () { + map.delete(userId); + }); +}); + +// +// Start the server. +// +server.listen(8080, function () { + console.log('Listening on http://localhost:8080'); +}); |