UNPKG

rauth-provider

Version:

A lightweight, plug-and-play Node.js library for phone number authentication using the Rauth.io reverse verification flow via WhatsApp or SMS.

117 lines (100 loc) 3.06 kB
/** * In-memory revoked sessions store */ class RevokedStore { constructor() { // Map: sessionToken -> { reason, ttl, revokedAt } this.revokedSessions = new Map(); } /** * Add a session to the revoked store * @param {string} sessionToken - Session token * @param {number} ttl - Time to live in seconds * @param {string} reason - Reason for revocation */ revokeSession(sessionToken, ttl, reason = 'revoked') { const revokedData = { reason, ttl, revokedAt: Date.now() }; this.revokedSessions.set(sessionToken, revokedData); // Auto-cleanup after TTL if (ttl > 0) { setTimeout(() => { this.removeRevokedSession(sessionToken); }, ttl * 1000); } } /** * Check if a session is revoked * @param {string} sessionToken - Session token * @returns {boolean} True if session is revoked and not expired */ isSessionRevoked(sessionToken) { const revokedData = this.revokedSessions.get(sessionToken); if (!revokedData) return false; // Check if revocation has expired const now = Date.now(); const expirationTime = revokedData.revokedAt + (revokedData.ttl * 1000); if (revokedData.ttl > 0 && now > expirationTime) { this.removeRevokedSession(sessionToken); return false; } return true; } /** * Get revoked session data * @param {string} sessionToken - Session token * @returns {Object|null} Revoked session data or null if not found/expired */ getRevokedSession(sessionToken) { const revokedData = this.revokedSessions.get(sessionToken); if (!revokedData) return null; // Check if revocation has expired const now = Date.now(); const expirationTime = revokedData.revokedAt + (revokedData.ttl * 1000); if (revokedData.ttl > 0 && now > expirationTime) { this.removeRevokedSession(sessionToken); return null; } return revokedData; } /** * Remove a revoked session from the store * @param {string} sessionToken - Session token */ removeRevokedSession(sessionToken) { this.revokedSessions.delete(sessionToken); } /** * Get all revoked sessions * @returns {Map} All revoked sessions */ getAllRevokedSessions() { // Clean up expired revoked sessions first this.cleanupExpiredRevokedSessions(); return new Map(this.revokedSessions); } /** * Clean up expired revoked sessions */ cleanupExpiredRevokedSessions() { const now = Date.now(); for (const [token, revokedData] of this.revokedSessions) { if (revokedData.ttl > 0) { const expirationTime = revokedData.revokedAt + (revokedData.ttl * 1000); if (now > expirationTime) { this.removeRevokedSession(token); } } } } /** * Clear all revoked sessions */ clear() { this.revokedSessions.clear(); } } module.exports = RevokedStore;