diff --git a/apps/desktop/src/lib/trpc/routers/viewer-github/index.test.ts b/apps/desktop/src/lib/trpc/routers/viewer-github/index.test.ts index 58c8e45d81d..40497ac5d45 100644 --- a/apps/desktop/src/lib/trpc/routers/viewer-github/index.test.ts +++ b/apps/desktop/src/lib/trpc/routers/viewer-github/index.test.ts @@ -69,4 +69,32 @@ describe("viewer GitHub on this machine", () => { }); expect(tokensUsed).toEqual(["local-token"]); }); + + test("a request that never reached GitHub is unavailable, not a server bug", async () => { + const failWith = (error: Error) => + caller("local-token", { + graphql: (async () => { + throw error; + }) as unknown as Octokit["graphql"], + request: (async () => { + throw error; + }) as unknown as Octokit["request"], + }).call.getPullRequestDetail({ repoFullName: "acme/widgets", number: 7 }); + + const reset = Object.assign(new Error("read ECONNRESET"), { + code: "ECONNRESET", + }); + await expect( + failWith( + Object.assign(new Error("read ECONNRESET"), { + status: 500, + cause: new TypeError("fetch failed", { cause: reset }), + }), + ), + ).rejects.toMatchObject({ code: "SERVICE_UNAVAILABLE" }); + + await expect( + failWith(Object.assign(new Error("Server Error"), { status: 500 })), + ).rejects.toMatchObject({ code: "INTERNAL_SERVER_ERROR" }); + }); }); diff --git a/apps/desktop/src/lib/trpc/routers/viewer-github/index.ts b/apps/desktop/src/lib/trpc/routers/viewer-github/index.ts index ff054bff8a5..4772550afe3 100644 --- a/apps/desktop/src/lib/trpc/routers/viewer-github/index.ts +++ b/apps/desktop/src/lib/trpc/routers/viewer-github/index.ts @@ -1,4 +1,5 @@ import { Octokit } from "@octokit/core"; +import { isGitHubUnreachableError } from "@superset/host-service"; import { LocalGitCredentialProvider } from "@superset/host-service/git-credentials"; import { githubErrorCode, @@ -68,7 +69,9 @@ export function createViewerGithubRouter( ); } catch (error) { throw new TRPCError({ - code: githubErrorCode(error), + code: isGitHubUnreachableError(error) + ? "SERVICE_UNAVAILABLE" + : githubErrorCode(error), message: error instanceof Error && error.message ? error.message : fallback, cause: error, diff --git a/packages/host-service/src/index.ts b/packages/host-service/src/index.ts index de5b098446a..2ff2aea676c 100644 --- a/packages/host-service/src/index.ts +++ b/packages/host-service/src/index.ts @@ -15,6 +15,7 @@ export type { HostAuthProvider } from "./providers/host-auth"; export { PskHostAuthProvider } from "./providers/host-auth"; export { resolveBrowserBridgeFromEnv } from "./runtime/browser-bridge/env"; export type { GitCredentialProvider, GitFactory } from "./runtime/git"; +export { isGitHubUnreachableError } from "./runtime/pull-requests/utils/github-availability"; export { startVitalsLog } from "./runtime/vitals"; export { detachFromLaunchDirectory } from "./runtime/working-directory"; export { installProcessSafetyNet, installUpgradeSocketGuard } from "./safety";