fix(settings): сохранять результат операций базы при вторичных сбоях
This commit is contained in:
1 parent
738c98b9d3
commit
92b65a30ce
15 files changed
+159
-32
No files matched your search
@@ -0,0 +1,23 @@
|
||||
export type DatabaseOperationWarnings = { listenerError?: string; schedulerError?: string }
|
||||
interface Dependencies {
|
||||
stopListener: () => Promise<void> | void
|
||||
stopScheduler: () => Promise<void> | void
|
||||
startListener: () => Promise<void> | void
|
||||
startScheduler: () => Promise<void> | void
|
||||
}
|
||||
/** Restart both consumers independently; secondary errors cannot erase a completed command. */
|
||||
export async function executeDatabaseOperation<T extends object>(run: () => Promise<T>, deps: Dependencies): Promise<T & DatabaseOperationWarnings> {
|
||||
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 }
|
||||
}
|
||||
Reference in new issue
Block a user