Skip to content

Commit 592f03f

Browse files
authored
Fix: updated logic to respect retry-after header (supabase#40046)
updated logic to respect try after header
1 parent 474a787 commit 592f03f

File tree

1 file changed

+28
-5
lines changed

1 file changed

+28
-5
lines changed

apps/studio/data/table-rows/table-rows-query.ts

Lines changed: 28 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import { isRoleImpersonationEnabled } from 'state/role-impersonation-state'
2020
import { ExecuteSqlError, executeSql } from '../sql/execute-sql-query'
2121
import { tableRowKeys } from './keys'
2222
import { formatFilterValue } from './utils'
23+
import { ResponseError } from 'types'
2324

2425
export interface GetTableRowsArgs {
2526
table?: SupaTable
@@ -42,6 +43,27 @@ const getDefaultOrderByColumns = (table: SupaTable) => {
4243
}
4344
}
4445

46+
function getErrorCode(error: any): number | undefined {
47+
// Our custom ResponseError's use 'code' instead of 'status'
48+
if (error instanceof ResponseError) {
49+
return error.code
50+
}
51+
return error.status
52+
}
53+
54+
function getRetryAfter(error: any): number | undefined {
55+
if (error instanceof ResponseError) {
56+
return error.retryAfter
57+
}
58+
59+
const headerRetry = error.headers?.get('retry-after')
60+
if (headerRetry) {
61+
return parseInt(headerRetry)
62+
}
63+
64+
return undefined
65+
}
66+
4567
async function sleep(ms: number) {
4668
return new Promise((resolve) => setTimeout(resolve, ms))
4769
}
@@ -54,12 +76,13 @@ export async function executeWithRetry<T>(
5476
for (let attempt = 0; attempt <= maxRetries; attempt++) {
5577
try {
5678
return await fn()
57-
} catch (error: any) {
58-
// Our custom ResponseError's use 'code' instead of 'status'
59-
if ((error?.status ?? error?.code) === 429 && attempt < maxRetries) {
79+
} catch (error: unknown) {
80+
const errorCode = getErrorCode(error)
81+
if (errorCode === 429 && attempt < maxRetries) {
6082
// Get retry delay from headers or use exponential backoff (1s, then 2s, then 4s)
61-
const retryAfter = error.headers?.get('retry-after')
62-
const delayMs = retryAfter ? parseInt(retryAfter) * 1000 : baseDelay * Math.pow(2, attempt)
83+
const retryAfter = getRetryAfter(error)
84+
const delayMs = retryAfter ? retryAfter * 1000 : baseDelay * Math.pow(2, attempt)
85+
6386
await sleep(delayMs)
6487
continue
6588
}

0 commit comments

Comments
 (0)