export type DatabaseOperationWarnings = { listenerError?: string; schedulerError?: string } interface Dependencies { stopListener: () => Promise | void stopScheduler: () => Promise | void startListener: () => Promise | void startScheduler: () => Promise | void } /** Restart both consumers independently; secondary errors cannot erase a completed command. */ export async function executeDatabaseOperation(run: () => Promise, deps: Dependencies): Promise { let result: T | undefined, failed = false, failure: unknown const warnings: DatabaseOperationWarnings = {} try { await deps.stopListener() await deps.stopScheduler() result = await run() } catch (error) { failed = true; failure = error } finally { try { await deps.startListener() } catch { warnings.listenerError = "Не удалось перезапустить приём NetFlow" } try { await deps.startScheduler() } catch { warnings.schedulerError = "Не удалось перезапустить планировщик" } } if (failed) throw failure return { ...result!, ...warnings } }