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.05 kB
JavaScript
/**
* 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();
}
}
export { RevokedStore };