UNPKG

unleash-server

Version:

Unleash is an enterprise ready feature flag service. It provides different strategies for handling feature flags.

83 lines 2.87 kB
import crypto from 'crypto'; import bcrypt from 'bcryptjs'; import { URL } from 'url'; import UsedTokenError from '../error/used-token-error.js'; import InvalidTokenError from '../error/invalid-token-error.js'; import { hoursToMilliseconds } from 'date-fns'; export default class ResetTokenService { constructor({ resetTokenStore }, { getLogger, server }) { this.expireExistingTokensForUser = async (userId) => { return this.store.expireExistingTokensForUser(userId); }; this.store = resetTokenStore; this.logger = getLogger('/services/reset-token-service.ts'); this.unleashBase = server.unleashUrl; } async useAccessToken(token) { try { await this.isValid(token.token); await this.store.useToken(token); return true; } catch (_e) { return false; } } async getActiveInvitations() { try { const tokens = await this.store.getActiveTokens(); const links = tokens.reduce((acc, token) => { const inviteLink = this.getExistingInvitationUrl(token).toString(); acc[token.userId] = inviteLink; return acc; }, {}); return links; } catch (_e) { return {}; } } async isValid(token) { let t; try { t = await this.store.getActive(token); if (!t.usedAt) { return t; } } catch (_e) { throw new InvalidTokenError(); } throw new UsedTokenError(t.usedAt); } getExistingInvitationUrl(token) { return new URL(`${this.unleashBase}/new-user?token=${token.token}`); } async createResetUrl(forUser, creator, path) { const token = await this.createToken(forUser, creator); return Promise.resolve(new URL(`${this.unleashBase}${path}?token=${token.token}`)); } async createResetPasswordUrl(forUser, creator) { const path = '/reset-password'; return this.createResetUrl(forUser, creator, path); } async createNewUserUrl(forUser, creator) { const path = '/new-user'; return this.createResetUrl(forUser, creator, path); } async createToken(tokenUser, creator, expiryDelta = hoursToMilliseconds(24)) { const token = await this.generateToken(); const expiry = new Date(Date.now() + expiryDelta); await this.expireExistingTokensForUser(tokenUser); return this.store.insert({ reset_token: token, user_id: tokenUser, expires_at: expiry, created_by: creator, }); } generateToken() { return bcrypt.hash(crypto.randomBytes(32).toString(), 10); } } //# sourceMappingURL=reset-token-service.js.map