66} from "openclaw/plugin-sdk/retry-runtime" ;
77import { resolveDiscordAccount } from "./accounts.js" ;
88import { DiscordError } from "./internal/discord.js" ;
9+ import { parseDiscordRetryAfterBodySeconds } from "./retry-after.js" ;
910
1011const DISCORD_DELIVERY_RETRY_DEFAULTS = {
1112 attempts : 3 ,
@@ -22,27 +23,21 @@ export function isRetryableDiscordDeliveryError(err: unknown): boolean {
2223 return status === 429 || ( status !== undefined && status >= 500 ) ;
2324}
2425
25- function getDiscordDeliveryRetryAfterMs ( err : unknown ) : number | undefined {
26+ export function getDiscordDeliveryRetryAfterMs ( err : unknown ) : number | undefined {
2627 if ( ! err || typeof err !== "object" ) {
2728 return undefined ;
2829 }
29- if (
30- "retryAfter" in err &&
31- typeof err . retryAfter === "number" &&
32- Number . isFinite ( err . retryAfter )
33- ) {
34- return err . retryAfter * 1000 ;
30+ const retryAfterSeconds =
31+ "retryAfter" in err ? parseDiscordRetryAfterBodySeconds ( err . retryAfter ) : undefined ;
32+ if ( retryAfterSeconds !== undefined ) {
33+ return retryAfterSeconds * 1000 ;
3534 }
3635 const retryAfterRaw = ( err as { headers ?: Record < string , string > } ) . headers ?. [ "retry-after" ] ;
3736 if ( ! retryAfterRaw ) {
3837 return undefined ;
3938 }
40- const trimmedRetryAfter = retryAfterRaw . trim ( ) ;
41- if ( ! / ^ \d + (?: \. \d + ) ? $ / . test ( trimmedRetryAfter ) ) {
42- return undefined ;
43- }
44- const retryAfterMs = Number ( trimmedRetryAfter ) * 1000 ;
45- return Number . isFinite ( retryAfterMs ) ? retryAfterMs : undefined ;
39+ const headerSeconds = parseDiscordRetryAfterBodySeconds ( retryAfterRaw ) ;
40+ return headerSeconds === undefined ? undefined : headerSeconds * 1000 ;
4641}
4742
4843export async function withDiscordDeliveryRetry < T > ( params : {
0 commit comments