- Consolidated duplicate UndoManagers to single instance - Fixed connection promise to only resolve on 'connected' status - Fixed WebSocketProvider import (WebsocketProvider) - Added proper doc.destroy() cleanup - Renamed isPresenceInitialized property to avoid conflict Co-Authored-By: Paperclip <noreply@paperclip.ing>
58 lines
1.4 KiB
TypeScript
58 lines
1.4 KiB
TypeScript
import type { ErrorType } from '../../errors/utils.js'
|
|
import { wait } from '../wait.js'
|
|
|
|
export type WithRetryParameters = {
|
|
// The delay (in ms) between retries.
|
|
delay?:
|
|
| ((config: { count: number; error: Error }) => number)
|
|
| number
|
|
| undefined
|
|
// The max number of times to retry.
|
|
retryCount?: number | undefined
|
|
// Whether or not to retry when an error is thrown.
|
|
shouldRetry?:
|
|
| (({
|
|
count,
|
|
error,
|
|
}: {
|
|
count: number
|
|
error: Error
|
|
}) => Promise<boolean> | boolean)
|
|
| undefined
|
|
}
|
|
|
|
export type WithRetryErrorType = ErrorType
|
|
|
|
export function withRetry<data>(
|
|
fn: () => Promise<data>,
|
|
{
|
|
delay: delay_ = 100,
|
|
retryCount = 2,
|
|
shouldRetry = () => true,
|
|
}: WithRetryParameters = {},
|
|
) {
|
|
return new Promise<data>((resolve, reject) => {
|
|
const attemptRetry = async ({ count = 0 } = {}) => {
|
|
const retry = async ({ error }: { error: Error }) => {
|
|
const delay =
|
|
typeof delay_ === 'function' ? delay_({ count, error }) : delay_
|
|
if (delay) await wait(delay)
|
|
attemptRetry({ count: count + 1 })
|
|
}
|
|
|
|
try {
|
|
const data = await fn()
|
|
resolve(data)
|
|
} catch (err) {
|
|
if (
|
|
count < retryCount &&
|
|
(await shouldRetry({ count, error: err as Error }))
|
|
)
|
|
return retry({ error: err as Error })
|
|
reject(err)
|
|
}
|
|
}
|
|
attemptRetry()
|
|
})
|
|
}
|