'use strict'; const _ = require('lodash'); const req = require('http').IncomingMessage.prototype; module.exports = ({ serialize, deserialize }) => { if (!_.isFunction(serialize) || !_.isFunction(deserialize)) { throw new TypeError('Both arguments need to be functions'); } req.login = function (user) { if (!req.session) Promise.reject(new Error('Session middleware not in use')); return serialize(user).then((result) => { req.session.user = result; }).catch((err) => { delete req.sesson.user; throw err; }); } req.logout = function () { delete req.session.user; delete req.user; } req.isAuthenticated = function () { return this.session && this.session.user; } req.isUnauthenticated = function () { return !this.isAuthenticated(); } // option1 req.getUser = function () { if (this.__user) return Promise.resolve(this.__user); if (!req.session || !req.session.user) return Promise.resolve(null); return deserialize(this.session.user).then((user) => { this.__user = user; return user; }); } Object.defineProperty(req, 'user', { get() { if (this.__user) return Promise.resolve(this.__user); if (!req.session || !req.session.user) return Promise.resolve(null); return deserialize(this.session.user).then((user) => { this.__user = user; return user; }); }