tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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 });