express-socket.io-session
Advanced tools
Comparing version 1.3.3 to 1.3.4
var debug = require("debug")("express-socket.io-session:example"), | ||
app = require('express')(), | ||
server = require("http").createServer(app), | ||
io = require("socket.io")(server), | ||
session = require("express-session")({ | ||
secret: "my-secret", | ||
resave: true, | ||
saveUninitialized: true | ||
}), | ||
sharedsession = require("../"); | ||
app = require("express")(), | ||
server = require("http").createServer(app), | ||
io = require("socket.io")(server), | ||
session = require("express-session")({ | ||
secret: "my-secret", | ||
resave: true, | ||
saveUninitialized: true | ||
}), | ||
sharedsession = require("../"); | ||
// Attach session | ||
@@ -17,16 +16,17 @@ app.use(session); | ||
// Share session with io sockets | ||
io.use(sharedsession(session, { | ||
autoSave: true | ||
})); | ||
io.use( | ||
sharedsession(session, { | ||
autoSave: true | ||
}) | ||
); | ||
//Debugging express | ||
app.use("*", function(req, res, next) { | ||
debug("Express `req.session` data is %j.", req.session); | ||
next(); | ||
debug("Express `req.session` data is %j.", req.session); | ||
next(); | ||
}); | ||
// Debugging io | ||
io.use(function(socket, next) { | ||
debug("socket.handshake session data is %j.", socket.handshake.session); | ||
next(); | ||
debug("socket.handshake session data is %j.", socket.handshake.session); | ||
next(); | ||
}); | ||
@@ -38,47 +38,44 @@ | ||
app.use("/login", function(req, res, next) { | ||
debug("Requested /login") | ||
req.session.user = { | ||
username: "OSK" | ||
}; | ||
//req.session.save(); | ||
res.redirect("/"); | ||
debug("Requested /login"); | ||
req.session.user = { | ||
username: "OSK" | ||
}; | ||
//req.session.save(); | ||
res.redirect("/"); | ||
}); | ||
// Unset session data via express request | ||
app.use("/logout", function(req, res, next) { | ||
debug("Requested /logout") | ||
delete req.session.user; | ||
//req.session.save(); | ||
res.redirect("/"); | ||
debug("Requested /logout"); | ||
delete req.session.user; | ||
//req.session.save(); | ||
res.redirect("/"); | ||
}); | ||
io.on("connection", function(socket) { | ||
socket.emit("sessiondata", socket.handshake.session); | ||
// Set session data via socket | ||
debug("Emitting session data"); | ||
socket.on("login", function() { | ||
debug("Received login message"); | ||
socket.handshake.session.user = { | ||
username: "OSK" | ||
}; | ||
debug("socket.handshake session data is %j.", socket.handshake.session); | ||
socket.emit("sessiondata", socket.handshake.session); | ||
// Set session data via socket | ||
debug("Emitting session data"); | ||
socket.on("login", function() { | ||
debug("Received login message"); | ||
socket.handshake.session.user = { | ||
username: "OSK" | ||
}; | ||
debug("socket.handshake session data is %j.", socket.handshake.session); | ||
// socket.handshake.session.save(); | ||
//emit logged_in for debugging purposes of this example | ||
socket.emit("logged_in", socket.handshake.session); | ||
}); | ||
// Unset session data via socket | ||
socket.on("logout", function() { | ||
debug("Received logout message"); | ||
socket.handshake.session.user = {}; | ||
delete socket.handshake.session.logged; | ||
// socket.handshake.session.save(); | ||
//emit logged_out for debugging purposes of this example | ||
debug("socket.handshake session data is %j.", socket.handshake.session); | ||
// socket.handshake.session.save(); | ||
//emit logged_in for debugging purposes of this example | ||
socket.emit("logged_in", socket.handshake.session); | ||
}); | ||
// Unset session data via socket | ||
socket.on("logout", function() { | ||
debug("Received logout message"); | ||
socket.handshake.session.user = {}; | ||
// socket.handshake.session.save(); | ||
//emit logged_out for debugging purposes of this example | ||
debug("socket.handshake session data is %j.", socket.handshake.session); | ||
socket.emit("logged_out", socket.handshake.session); | ||
}); | ||
socket.emit("logged_out", socket.handshake.session); | ||
}); | ||
}); | ||
server.listen(3000); | ||
server.listen(3000); |
@@ -12,3 +12,3 @@ { | ||
"session": "^0.1.0", | ||
"socket.io": "^1.3.5" | ||
"socket.io": "^1.7.4" | ||
}, | ||
@@ -15,0 +15,0 @@ "devDependencies": {}, |
207
index.js
@@ -1,2 +0,2 @@ | ||
var cookieparser = require('cookie-parser'); | ||
var cookieparser = require("cookie-parser"); | ||
var debug = require("debug")("express-socket.io-session"); | ||
@@ -16,107 +16,120 @@ var crc = require("crc").crc32; | ||
*/ | ||
module.exports = function(expressSessionMiddleware, cookieParserMiddleware, options) { | ||
var socketIoSharedSessionMiddleware; | ||
module.exports = function( | ||
expressSessionMiddleware, | ||
cookieParserMiddleware, | ||
options | ||
) { | ||
var socketIoSharedSessionMiddleware; | ||
// Accept options as second argument if only 2 parameters passed | ||
if (arguments.length == 2 && typeof cookieParserMiddleware === 'object') { | ||
options = cookieParserMiddleware; | ||
cookieParserMiddleware = undefined; | ||
} | ||
// Accept options as second argument if only 2 parameters passed | ||
if (arguments.length == 2 && typeof cookieParserMiddleware === "object") { | ||
options = cookieParserMiddleware; | ||
cookieParserMiddleware = undefined; | ||
} | ||
if (typeof cookieParserMiddleware === 'undefined') { | ||
debug("No cookie-parser instance passed as argument. Creating a cookie-parser " + | ||
"instance with default values"); | ||
cookieParserMiddleware = cookieparser(); | ||
} | ||
options = options || {}; | ||
var saveUninitializedSession = options.saveUninitialized; | ||
debug("Creating socket.io middleware"); | ||
if (typeof cookieParserMiddleware === "undefined") { | ||
debug( | ||
"No cookie-parser instance passed as argument. Creating a cookie-parser " + | ||
"instance with default values" | ||
); | ||
cookieParserMiddleware = cookieparser(); | ||
} | ||
options = options || {}; | ||
var saveUninitializedSession = options.saveUninitialized; | ||
debug("Creating socket.io middleware"); | ||
socketIoSharedSessionMiddleware = function(socket, next) { | ||
var req = socket.handshake; | ||
var res = { | ||
end: function() {} | ||
}; | ||
// originalHash, savedHash, originalId, cookieId | ||
// are variables present for replicating express-session autoSaving behavioiur | ||
var originalHash, savedHash; | ||
var originalId; | ||
var cookieId; | ||
var _onevent = socket.onevent; | ||
// Override socket.on if autoSave = true; | ||
if (options.autoSave === true) { | ||
debug("Using autoSave feature. express-session middleware will be called on every event received") | ||
socket.onevent = function() { | ||
debug("Executing socket.onevent monkeypatched by express-socket.io-session"); | ||
var _args = arguments; | ||
originalHash = savedHash = hash(req.session); | ||
cookieId = req.sessionID; | ||
originalId = req.sessionID; | ||
_onevent.apply(socket, _args); | ||
if (shouldSave(req)) { | ||
req.session.save() | ||
} | ||
}; | ||
} | ||
//Parse session cookie | ||
cookieParserMiddleware(req, res, function(err) { | ||
if (err) { | ||
debug("cookieParser errored"); | ||
return next(err); | ||
} | ||
expressSessionMiddleware(req, res, function(req, res) { | ||
next(); | ||
}); | ||
}); | ||
/* | ||
* These functions hash, isModified, isSaved, shouldSave | ||
* and shouldDestroy are canibalized from express-session | ||
* in order to this module being able to comply with the autoSave options. | ||
*/ | ||
socketIoSharedSessionMiddleware = function(socket, next) { | ||
var req = socket.handshake; | ||
var res = { | ||
end: function() {} | ||
}; | ||
// originalHash, savedHash, originalId, cookieId | ||
// are variables present for replicating express-session autoSaving behaviour | ||
var originalHash, savedHash; | ||
var originalId; | ||
var cookieId; | ||
var _onevent = socket.onevent; | ||
// Override socket.on if autoSave = true; | ||
if (options.autoSave === true) { | ||
debug( | ||
"Using autoSave feature. express-session middleware will be called on every event received" | ||
); | ||
socket.onevent = function() { | ||
debug( | ||
"Executing socket.onevent monkeypatched by express-socket.io-session" | ||
); | ||
var _args = arguments; | ||
originalHash = savedHash = hash(req.session); | ||
cookieId = req.sessionID; | ||
originalId = req.sessionID; | ||
_onevent.apply(socket, _args); | ||
process.nextTick( function() { | ||
if (shouldSave(req)) { | ||
req.session.save(); | ||
} | ||
} ); | ||
}; | ||
} | ||
//Parse session cookie | ||
cookieParserMiddleware(req, res, function(err) { | ||
if (err) { | ||
debug("cookieParser errored"); | ||
return next(err); | ||
} | ||
expressSessionMiddleware(req, res, function(req, res) { | ||
next(); | ||
}); | ||
}); | ||
/* | ||
* These functions hash, isModified, isSaved, shouldSave | ||
* and shouldDestroy are canibalized from express-session | ||
* in order to this module being able to comply with the autoSave options. | ||
*/ | ||
/** | ||
* Hash the given `sess` object omitting changes to `.cookie`. | ||
* | ||
* @param {Object} sess | ||
* @return {String} | ||
* @private | ||
*/ | ||
/** | ||
* Hash the given `sess` object omitting changes to `.cookie`. | ||
* | ||
* @param {Object} sess | ||
* @return {String} | ||
* @private | ||
*/ | ||
function hash(sess) { | ||
return crc(JSON.stringify(sess, function(key, val) { | ||
if (key !== 'cookie') { | ||
return val; | ||
} | ||
})); | ||
} | ||
function hash(sess) { | ||
return crc( | ||
JSON.stringify(sess, function(key, val) { | ||
if (key !== "cookie") { | ||
return val; | ||
} | ||
}) | ||
); | ||
} | ||
// check if session has been modified | ||
function isModified(sess) { | ||
return originalId !== sess.id || originalHash !== hash(sess); | ||
} | ||
// check if session has been modified | ||
function isModified(sess) { | ||
return originalId !== sess.id || originalHash !== hash(sess); | ||
} | ||
// check if session has been saved | ||
function isSaved(sess) { | ||
return originalId === sess.id && savedHash === hash(sess); | ||
} | ||
// check if session has been saved | ||
function isSaved(sess) { | ||
return originalId === sess.id && savedHash === hash(sess); | ||
} | ||
// determine if session should be destroyed | ||
function shouldDestroy(req) { | ||
return req.sessionID && unsetDestroy && req.session == null; | ||
} | ||
// determine if session should be saved to store | ||
function shouldSave(req) { | ||
// cannot set cookie without a session ID | ||
if (typeof req.sessionID !== "string") { | ||
debug( | ||
"session ignored because of bogus req.sessionID %o", | ||
req.sessionID | ||
); | ||
return false; | ||
} | ||
// determine if session should be saved to store | ||
function shouldSave(req) { | ||
// cannot set cookie without a session ID | ||
if (typeof req.sessionID !== 'string') { | ||
debug('session ignored because of bogus req.sessionID %o', req.sessionID); | ||
return false; | ||
} | ||
return !saveUninitializedSession && cookieId !== req.sessionID | ||
? isModified(req.session) | ||
: !isSaved(req.session); | ||
} | ||
}; | ||
return !saveUninitializedSession && cookieId !== req.sessionID ? isModified(req.session) : !isSaved(req.session) | ||
} | ||
}; | ||
return socketIoSharedSessionMiddleware; | ||
}; | ||
return socketIoSharedSessionMiddleware; | ||
}; |
{ | ||
"name": "express-socket.io-session", | ||
"version": "1.3.3", | ||
"version": "1.3.4", | ||
"description": "Share a cookie-based express-session middleware with socket.io", | ||
@@ -27,3 +27,6 @@ "main": "index.js", | ||
"debug": "~2.6.0" | ||
}, | ||
"devDependencies": { | ||
"prettier": "^1.13.5" | ||
} | ||
} |
193
16702
1