From 22592cc48a78bba17b65c451d78cf9c0f173d162 Mon Sep 17 00:00:00 2001 From: shrugs Date: Tue, 3 Mar 2026 18:41:43 -0600 Subject: [PATCH 1/6] fix: throw better error when ensrainbow fails to serve json --- apps/ensindexer/package.json | 2 +- packages/ensrainbow-sdk/src/client.test.ts | 12 ++++++++++++ packages/ensrainbow-sdk/src/client.ts | 12 ++++++++---- 3 files changed, 21 insertions(+), 5 deletions(-) diff --git a/apps/ensindexer/package.json b/apps/ensindexer/package.json index 0afe00f24..761f3d139 100644 --- a/apps/ensindexer/package.json +++ b/apps/ensindexer/package.json @@ -20,7 +20,7 @@ "test": "vitest", "lint": "biome check --write .", "lint:ci": "biome ci", - "typecheck": "tsc --noEmit" + "typecheck": "pnpm exec tsc --noEmit" }, "dependencies": { "@ensdomains/ensjs": "^4.0.2", diff --git a/packages/ensrainbow-sdk/src/client.test.ts b/packages/ensrainbow-sdk/src/client.test.ts index e84581a52..96fb4aa28 100644 --- a/packages/ensrainbow-sdk/src/client.test.ts +++ b/packages/ensrainbow-sdk/src/client.test.ts @@ -342,6 +342,18 @@ describe("EnsRainbowApiClient", () => { "Failed to fetch ENSRainbow config: Service Unavailable", ); }); + + it("should throw with fallback message when error body is not valid JSON", async () => { + mockFetch.mockResolvedValueOnce({ + ok: false, + statusText: "Not Found", + json: () => Promise.reject(new SyntaxError("Unexpected token")), + }); + + await expect(client.config()).rejects.toThrow( + "Failed to fetch ENSRainbow config: Not Found", + ); + }); }); }); diff --git a/packages/ensrainbow-sdk/src/client.ts b/packages/ensrainbow-sdk/src/client.ts index 5f8fe0d87..c9a67dc67 100644 --- a/packages/ensrainbow-sdk/src/client.ts +++ b/packages/ensrainbow-sdk/src/client.ts @@ -400,10 +400,14 @@ export class EnsRainbowApiClient implements EnsRainbow.ApiClient { const response = await fetch(new URL("/v1/config", this.options.endpointUrl)); if (!response.ok) { - const errorData = (await response.json()) as { error?: string; errorCode?: number }; - throw new Error( - errorData.error ?? `Failed to fetch ENSRainbow config: ${response.statusText}`, - ); + let message: string | undefined; + try { + const errorData = (await response.json()) as { error?: string; errorCode?: number }; + message = errorData.error; + } catch { + // response body is not valid JSON + } + throw new Error(message ?? `Failed to fetch ENSRainbow config: ${response.statusText}`); } return response.json() as Promise; From 9268bbf2d00f7fe080971ed0a51ccc42c9941c75 Mon Sep 17 00:00:00 2001 From: shrugs Date: Tue, 3 Mar 2026 18:45:58 -0600 Subject: [PATCH 2/6] fix lint --- packages/ensrainbow-sdk/src/client.test.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/packages/ensrainbow-sdk/src/client.test.ts b/packages/ensrainbow-sdk/src/client.test.ts index 96fb4aa28..c8ec0506b 100644 --- a/packages/ensrainbow-sdk/src/client.test.ts +++ b/packages/ensrainbow-sdk/src/client.test.ts @@ -350,9 +350,7 @@ describe("EnsRainbowApiClient", () => { json: () => Promise.reject(new SyntaxError("Unexpected token")), }); - await expect(client.config()).rejects.toThrow( - "Failed to fetch ENSRainbow config: Not Found", - ); + await expect(client.config()).rejects.toThrow("Failed to fetch ENSRainbow config: Not Found"); }); }); }); From 610afc3073b6f1a1727f935921cd3986f3a4f668 Mon Sep 17 00:00:00 2001 From: shrugs Date: Wed, 4 Mar 2026 09:59:27 -0600 Subject: [PATCH 3/6] fix: streamline error derivation --- packages/ensrainbow-sdk/src/client.ts | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/packages/ensrainbow-sdk/src/client.ts b/packages/ensrainbow-sdk/src/client.ts index c9a67dc67..0fb88df4c 100644 --- a/packages/ensrainbow-sdk/src/client.ts +++ b/packages/ensrainbow-sdk/src/client.ts @@ -400,14 +400,13 @@ export class EnsRainbowApiClient implements EnsRainbow.ApiClient { const response = await fetch(new URL("/v1/config", this.options.endpointUrl)); if (!response.ok) { - let message: string | undefined; - try { - const errorData = (await response.json()) as { error?: string; errorCode?: number }; - message = errorData.error; - } catch { - // response body is not valid JSON - } - throw new Error(message ?? `Failed to fetch ENSRainbow config: ${response.statusText}`); + const errorMessage = await response + .json() + .then((data: { error?: string }) => data.error) + .catch(() => undefined); + throw new Error( + errorMessage ?? `Failed to fetch ENSRainbow config: ${response.statusText}`, + ); } return response.json() as Promise; From 3b8c13bd8b289d920b461a4bd99dc22ed8eb4ab2 Mon Sep 17 00:00:00 2001 From: shrugs Date: Wed, 4 Mar 2026 10:01:06 -0600 Subject: [PATCH 4/6] fix: lint --- packages/ensrainbow-sdk/src/client.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/packages/ensrainbow-sdk/src/client.ts b/packages/ensrainbow-sdk/src/client.ts index 0fb88df4c..7522aad5f 100644 --- a/packages/ensrainbow-sdk/src/client.ts +++ b/packages/ensrainbow-sdk/src/client.ts @@ -404,9 +404,7 @@ export class EnsRainbowApiClient implements EnsRainbow.ApiClient { .json() .then((data: { error?: string }) => data.error) .catch(() => undefined); - throw new Error( - errorMessage ?? `Failed to fetch ENSRainbow config: ${response.statusText}`, - ); + throw new Error(errorMessage ?? `Failed to fetch ENSRainbow config: ${response.statusText}`); } return response.json() as Promise; From dd8ecdf4ead3d64a13570b159aeb1dec0c7b0ec9 Mon Sep 17 00:00:00 2001 From: shrugs Date: Wed, 4 Mar 2026 10:12:07 -0600 Subject: [PATCH 5/6] fix: revert pnpm exec --- apps/ensindexer/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/ensindexer/package.json b/apps/ensindexer/package.json index ef8e8bc5d..bb3d9887f 100644 --- a/apps/ensindexer/package.json +++ b/apps/ensindexer/package.json @@ -20,7 +20,7 @@ "test": "vitest", "lint": "biome check --write .", "lint:ci": "biome ci", - "typecheck": "pnpm exec tsc --noEmit" + "typecheck": "tsc --noEmit" }, "dependencies": { "@ensdomains/ensjs": "^4.0.2", From 94f51a5a527b5bed3dd5a00669a0d641fe8ed63d Mon Sep 17 00:00:00 2001 From: shrugs Date: Wed, 4 Mar 2026 10:54:40 -0600 Subject: [PATCH 6/6] fix: more accurate ensraibow client config endpoint testing --- apps/ensindexer/src/lib/version-info.ts | 5 ---- packages/ensrainbow-sdk/src/client.test.ts | 34 ++-------------------- packages/ensrainbow-sdk/src/client.ts | 6 +--- 3 files changed, 3 insertions(+), 42 deletions(-) diff --git a/apps/ensindexer/src/lib/version-info.ts b/apps/ensindexer/src/lib/version-info.ts index c13100735..8f47997d7 100644 --- a/apps/ensindexer/src/lib/version-info.ts +++ b/apps/ensindexer/src/lib/version-info.ts @@ -4,11 +4,6 @@ import { existsSync, readdirSync, readFileSync } from "node:fs"; import { dirname, join } from "node:path"; import { fileURLToPath } from "node:url"; -import { prettifyError } from "zod/v4"; - -import type { ENSIndexerVersionInfo, SerializedENSIndexerVersionInfo } from "@ensnode/ensnode-sdk"; -import { makeENSIndexerVersionInfoSchema } from "@ensnode/ensnode-sdk/internal"; - /** * Get ENSIndexer version */ diff --git a/packages/ensrainbow-sdk/src/client.test.ts b/packages/ensrainbow-sdk/src/client.test.ts index c8ec0506b..7133797b1 100644 --- a/packages/ensrainbow-sdk/src/client.test.ts +++ b/packages/ensrainbow-sdk/src/client.test.ts @@ -317,40 +317,10 @@ describe("EnsRainbowApiClient", () => { expect(response).toEqual(configData); }); - it("should throw with server error message when response is not ok", async () => { - mockFetch.mockResolvedValueOnce({ - ok: false, - statusText: "Internal Server Error", - json: () => - Promise.resolve({ - error: "Database not ready", - errorCode: 500, - }), - }); - - await expect(client.config()).rejects.toThrow("Database not ready"); - }); - - it("should throw with fallback message when error body has no error field", async () => { - mockFetch.mockResolvedValueOnce({ - ok: false, - statusText: "Service Unavailable", - json: () => Promise.resolve({}), - }); - - await expect(client.config()).rejects.toThrow( - "Failed to fetch ENSRainbow config: Service Unavailable", - ); - }); - it("should throw with fallback message when error body is not valid JSON", async () => { - mockFetch.mockResolvedValueOnce({ - ok: false, - statusText: "Not Found", - json: () => Promise.reject(new SyntaxError("Unexpected token")), - }); + mockFetch.mockResolvedValueOnce({ ok: false, statusText: "Not Found" }); - await expect(client.config()).rejects.toThrow("Failed to fetch ENSRainbow config: Not Found"); + await expect(client.config()).rejects.toThrow(/Not Found/); }); }); }); diff --git a/packages/ensrainbow-sdk/src/client.ts b/packages/ensrainbow-sdk/src/client.ts index 7522aad5f..5ef743801 100644 --- a/packages/ensrainbow-sdk/src/client.ts +++ b/packages/ensrainbow-sdk/src/client.ts @@ -400,11 +400,7 @@ export class EnsRainbowApiClient implements EnsRainbow.ApiClient { const response = await fetch(new URL("/v1/config", this.options.endpointUrl)); if (!response.ok) { - const errorMessage = await response - .json() - .then((data: { error?: string }) => data.error) - .catch(() => undefined); - throw new Error(errorMessage ?? `Failed to fetch ENSRainbow config: ${response.statusText}`); + throw new Error(`Failed to fetch ENSRainbow config: ${response.statusText}`); } return response.json() as Promise;