const sequelize = require('../config/database'); const DEFAULTS = { attempts: 3, baseDelayMs: 200, }; function delay(ms) { return new Promise((resolve) => setTimeout(resolve, ms)); } /** * Führt eine DB-Operation bis zu `attempts` mal aus. Nach einem Fehler: * kurzes Backoff, dann Verbindung mit authenticate() neu prüfen (frische * Verbindung aus dem Pool), erneuter Versuch. * Kein sequelize.close() — würde die gemeinsame Instanz für alle Requests killen. */ async function withDbRetries(operation, options = {}) { const { attempts, baseDelayMs } = { ...DEFAULTS, ...options }; let lastError; for (let attempt = 1; attempt <= attempts; attempt++) { try { if (attempt > 1) { const backoff = baseDelayMs * 2 ** (attempt - 2); await delay(backoff); try { await sequelize.authenticate(); } catch (authErr) { console.warn( `DB authenticate vor Wiederholung ${attempt}/${attempts} fehlgeschlagen:`, authErr.message ); } } return await operation(); } catch (error) { lastError = error; console.error( `DB-Operation Versuch ${attempt}/${attempts} fehlgeschlagen:`, error.message ); if (attempt === attempts) { throw error; } } } throw lastError; } module.exports = { withDbRetries };