Skip to content

Commit 72cf8be

Browse files
karatheodorylpinca
authored andcommitted
[example] Add Express session parsing example
1 parent 92d8696 commit 72cf8be

File tree

4 files changed

+158
-0
lines changed

4 files changed

+158
-0
lines changed
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
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 WebSocket = require('../..');
9+
10+
const app = express();
11+
12+
//
13+
// We need the same instance of the session parser in express and
14+
// WebSocket server.
15+
//
16+
const sessionParser = session({
17+
saveUninitialized: false,
18+
secret: '$eCuRiTy',
19+
resave: false
20+
});
21+
22+
//
23+
// Serve static files from the 'public' folder.
24+
//
25+
app.use(express.static('public'));
26+
app.use(sessionParser);
27+
28+
app.post('/login', (req, res) => {
29+
//
30+
// "Log in" user and set userId to session.
31+
//
32+
const id = uuid.v4();
33+
34+
console.log(`Updating session for user ${id}`);
35+
req.session.userId = id;
36+
res.send({ result: 'OK', message: 'Session updated' });
37+
});
38+
39+
app.delete('/logout', (request, response) => {
40+
console.log('Destroying session');
41+
request.session.destroy();
42+
response.send({ result: 'OK', message: 'Session destroyed' });
43+
});
44+
45+
//
46+
// Create HTTP server by ourselves.
47+
//
48+
const server = http.createServer(app);
49+
50+
const wss = new WebSocket.Server({
51+
verifyClient: (info, done) => {
52+
console.log('Parsing session from request...');
53+
sessionParser(info.req, {}, () => {
54+
console.log('Session is parsed!');
55+
56+
//
57+
// We can reject the connection by returning false to done(). For example,
58+
// reject here if user is unknown.
59+
//
60+
done(info.req.session.userId);
61+
});
62+
},
63+
server
64+
});
65+
66+
wss.on('connection', (ws) => {
67+
ws.on('message', (message) => {
68+
const session = ws.upgradeReq.session;
69+
70+
//
71+
// Here we can now use session parameters.
72+
//
73+
console.log(`WS message ${message} from user ${session.userId}`);
74+
});
75+
});
76+
77+
//
78+
// Start the server.
79+
//
80+
server.listen(8080, () => console.log('Listening on http://localhost:8080'));
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
{
2+
"author": "",
3+
"name": "express-session-parse",
4+
"version": "0.0.0",
5+
"repository": "websockets/ws",
6+
"dependencies": {
7+
"express": "~4.14.1",
8+
"express-session": "~1.15.1",
9+
"uuid": "~3.0.1"
10+
}
11+
}
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
/* global fetch, WebSocket, location */
2+
(() => {
3+
const messages = document.querySelector('#messages');
4+
const wsButton = document.querySelector('#wsButton');
5+
const logout = document.querySelector('#logout');
6+
const login = document.querySelector('#login');
7+
8+
const showMessage = (message) => {
9+
messages.textContent += `\n${message}`;
10+
messages.scrollTop = messages.scrollHeight;
11+
};
12+
13+
const handleResponse = (response) => {
14+
return response.ok
15+
? response.json().then((data) => JSON.stringify(data, null, 2))
16+
: Promise.reject(new Error('Unexpected response'));
17+
};
18+
19+
login.onclick = () => {
20+
fetch('/login', { method: 'POST', credentials: 'same-origin' })
21+
.then(handleResponse)
22+
.then(showMessage)
23+
.catch((err) => showMessage(err.message));
24+
};
25+
26+
logout.onclick = () => {
27+
fetch('/logout', { method: 'DELETE', credentials: 'same-origin' })
28+
.then(handleResponse)
29+
.then(showMessage)
30+
.catch((err) => showMessage(err.message));
31+
};
32+
33+
let ws;
34+
35+
wsButton.onclick = () => {
36+
if (ws) {
37+
ws.onerror = ws.onopen = ws.onclose = null;
38+
ws.close();
39+
}
40+
41+
ws = new WebSocket(`ws://${location.host}`);
42+
ws.onerror = () => showMessage('WebSocket error');
43+
ws.onopen = () => showMessage('WebSocket connection established');
44+
ws.onclose = () => showMessage('WebSocket connection closed');
45+
};
46+
})();
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
<!DOCTYPE html>
2+
<html lang="en">
3+
<head>
4+
<meta charset="utf-8">
5+
<title>Express session demo</title>
6+
</head>
7+
<body>
8+
<h1>Choose an action.</h1>
9+
<button id="login" type="button" title="Simulate login">
10+
Simulate login
11+
</button>
12+
<button id="logout" type="button" title="Simulate logout">
13+
Simulate logout
14+
</button>
15+
<button id="wsButton" type="button" title="Open WebSocket connection">
16+
Open WebSocket connection
17+
</button>
18+
<pre id="messages" style="height: 400px; overflow: scroll"></pre>
19+
<script src="app.js"></script>
20+
</body>
21+
</html>

0 commit comments

Comments
 (0)