mirror of
https://github.com/openclaw/openclaw.git
synced 2026-05-08 10:51:23 +00:00
fix(infra): treat undici fetch failed as transient unhandled rejection
This commit is contained in:
@@ -79,6 +79,12 @@ describe("isTransientNetworkError", () => {
|
||||
expect(isTransientNetworkError(error)).toBe(true);
|
||||
});
|
||||
|
||||
it("returns true for fetch failed with unclassified cause", () => {
|
||||
const cause = Object.assign(new Error("unknown socket state"), { code: "UNKNOWN" });
|
||||
const error = Object.assign(new TypeError("fetch failed"), { cause });
|
||||
expect(isTransientNetworkError(error)).toBe(true);
|
||||
});
|
||||
|
||||
it("returns true for nested cause chain with network error", () => {
|
||||
const innerCause = Object.assign(new Error("connection reset"), { code: "ECONNRESET" });
|
||||
const outerCause = Object.assign(new Error("wrapper"), { cause: innerCause });
|
||||
|
||||
@@ -94,12 +94,10 @@ export function isTransientNetworkError(err: unknown): boolean {
|
||||
return true;
|
||||
}
|
||||
|
||||
// "fetch failed" TypeError from undici (Node's native fetch)
|
||||
// "fetch failed" TypeError from undici (Node's native fetch).
|
||||
// Treat as transient regardless of nested cause code because causes vary
|
||||
// across runtimes and can be unclassified even for real network faults.
|
||||
if (err instanceof TypeError && err.message === "fetch failed") {
|
||||
const cause = getErrorCause(err);
|
||||
if (cause) {
|
||||
return isTransientNetworkError(cause);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user