UNPKG

@accounts/express-session

Version:

Stores the access and refresh tokens as part of the session (`express-session`), this way auth flow could be based on it.

91 lines 2.87 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.AccountsSession = void 0; const request_ip_1 = require("request-ip"); const lodash_1 = require("lodash"); require("express-session"); const get_user_agent_1 = require("./utils/get-user-agent"); class AccountsSession { accountsServer; options; constructor(accountsServer, options) { this.accountsServer = accountsServer; this.options = (0, lodash_1.merge)({ name: 'accounts-js-tokens', user: { name: 'user', resolve: null, }, }, options); } middleware() { return async (req, res, next) => { try { const tokenResult = await this.renew(req); const tokens = this.get(req); if (tokens) { const user = this.options.user.resolve ? await this.options.user.resolve(tokens, req, tokenResult?.user) : tokenResult?.user; // eslint-disable-next-line // @ts-ignore req[this.options.user.name] = user; } next(); } catch (e) { next(e); } }; } async destroy(req) { const tokens = this.get(req); if (tokens && tokens.accessToken) { await this.accountsServer.logout(tokens.accessToken); await this.clear(req); } return new Promise((resolve, reject) => { req.session.destroy((err) => { if (err) { reject(err); } else { resolve(); } }); }); } get(req) { if (!req) { return; } if (req.session && req.session[this.options.name]) { return req.session[this.options.name]; } } async renew(req) { const tokens = this.get(req); if (this.accountsServer && tokens && tokens.accessToken && tokens.refreshToken) { const result = await this.accountsServer.refreshTokens(tokens.accessToken, tokens.refreshToken, { ip: (0, request_ip_1.getClientIp)(req), userAgent: (0, get_user_agent_1.getUserAgent)(req) }); this.set(req, result.tokens); return result; } } set(req, tokens) { if (!tokens) { this.clear(req); return; } if (req.session) { req.session[this.options.name] = tokens; } } clear(req) { if (this.get(req)) { req.session[this.options.name] = null; } } } exports.AccountsSession = AccountsSession; exports.default = AccountsSession; //# sourceMappingURL=index.js.map