Skip to content

Commit 2644f26

Browse files
committed
fix(discord): centralize retry status parsing
1 parent 2be1d1b commit 2644f26

2 files changed

Lines changed: 7 additions & 7 deletions

File tree

extensions/discord/src/retry.test.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,10 @@ describe("isRetryableDiscordTransientError", () => {
3030
["408 status", Object.assign(new Error("request timeout"), { status: 408 })],
3131
["502 status", Object.assign(new Error("bad gateway"), { status: 502 })],
3232
["503 statusCode", Object.assign(new Error("service unavailable"), { statusCode: 503 })],
33+
[
34+
"signed string statusCode",
35+
Object.assign(new Error("service unavailable"), { statusCode: "+503" }),
36+
],
3337
["fetch failed", new TypeError("fetch failed")],
3438
["ECONNRESET", Object.assign(new Error("socket hang up"), { code: "ECONNRESET" })],
3539
["ETIMEDOUT cause", new Error("request failed", { cause: { code: "ETIMEDOUT" } })],
@@ -40,6 +44,7 @@ describe("isRetryableDiscordTransientError", () => {
4044

4145
it.each([
4246
["400 status", Object.assign(new Error("bad request"), { status: 400 })],
47+
["fractional status", Object.assign(new Error("upstream rejected request"), { status: 500.5 })],
4348
["403 status", Object.assign(new Error("missing permissions"), { statusCode: 403 })],
4449
["unknown channel", new Error("Unknown Channel")],
4550
["plain string", "fetch failed"],

extensions/discord/src/retry.ts

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import {
44
formatErrorMessage,
55
readErrorName,
66
} from "openclaw/plugin-sdk/error-runtime";
7+
import { parseStrictNonNegativeInteger } from "openclaw/plugin-sdk/number-runtime";
78
import {
89
createRateLimitRetryRunner,
910
type RetryConfig,
@@ -45,13 +46,7 @@ function readDiscordErrorStatus(err: unknown): number | undefined {
4546
: "statusCode" in err && err.statusCode !== undefined
4647
? err.statusCode
4748
: undefined;
48-
if (typeof raw === "number" && Number.isFinite(raw)) {
49-
return raw;
50-
}
51-
if (typeof raw === "string" && /^\d+$/.test(raw)) {
52-
return Number(raw);
53-
}
54-
return undefined;
49+
return parseStrictNonNegativeInteger(raw);
5550
}
5651

5752
export function isRetryableDiscordTransientError(err: unknown): boolean {

0 commit comments

Comments
 (0)