import timers from 'node:timers/promises' import { DiscordHTTPError, DiscordRESTError } from 'oceanic.js' export async function retryDiscord(operation: () => Promise, label: string): Promise { for (let attempt = 0; ; attempt++) { try { return await operation() } catch (error) { const transient = (error instanceof TypeError && error.message === 'fetch failed') || (error instanceof Error && error.name === 'AbortError') || ((error instanceof DiscordHTTPError || error instanceof DiscordRESTError) && error.status >= 500) if (!transient || attempt >= 4) throw error const wait = 1000 * 2 ** attempt console.warn(`${label}: transient Discord request failure; retrying in ${wait / 1000}s`, error) await timers.setTimeout(wait) } } }