import { randomBytes } from 'node:crypto' const TOKEN_TTL_MS = 60 * 1000 const tokens = new Map() function purgeExpired() { const now = Date.now() for (const [key, entry] of tokens) { if (entry.expiresAt <= now) tokens.delete(key) } } export function createStaffPreviewToken(payload) { purgeExpired() const token = randomBytes(32).toString('hex') tokens.set(token, { ...payload, expiresAt: Date.now() + TOKEN_TTL_MS, }) return token } /** * Einmal einloesen. purpose trennt Preview-Links ('preview', Standard) von der Kundenansicht aus dem * Ticketsystem ('kundenansicht'); ein Token fuer den falschen Zweck ist trotzdem verbraucht. */ export function consumeStaffPreviewToken(token, purpose = 'preview') { purgeExpired() const entry = tokens.get(token) if (!entry) return null tokens.delete(token) if (entry.expiresAt <= Date.now()) return null if ((entry.purpose || 'preview') !== purpose) return null return entry }