forked from mirrors/gecko-dev
		
	
		
			
				
	
	
		
			101 lines
		
	
	
	
		
			2.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			101 lines
		
	
	
	
		
			2.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| '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');
 | |
| });
 | 
