From e010f50429c597518655dde78161f346d8c1724e Mon Sep 17 00:00:00 2001 From: sevenzing Date: Wed, 11 Mar 2026 17:47:26 +0300 Subject: [PATCH 1/9] initial rearrange --- .../explore}/name-tokens-api.routes.ts | 0 .../{ => api/explore}/name-tokens-api.ts | 0 .../explore}/registrar-actions-api.routes.ts | 0 .../explore}/registrar-actions-api.ts | 0 .../{ => api/graphql}/ensnode-graphql-api.ts | 0 .../{ => api/meta}/ensnode-api.routes.ts | 0 .../handlers/{ => api/meta}/ensnode-api.ts | 16 ---------------- .../meta/realtime-api.routes.ts} | 4 ++-- .../meta/realtime-api.test.ts} | 4 ++-- .../meta/realtime-api.ts} | 2 +- .../resolution}/resolution-api.routes.ts | 0 .../{ => api/resolution}/resolution-api.ts | 0 apps/ensapi/src/handlers/api/router.ts | 19 +++++++++++++++++++ .../ensanalytics-api-v1.routes.ts | 0 .../ensanalytics-api-v1.test.ts | 9 ++++----- .../{ => ensanalytics}/ensanalytics-api-v1.ts | 0 .../ensanalytics-api.routes.ts | 0 .../ensanalytics-api.test.ts | 5 ++--- .../{ => ensanalytics}/ensanalytics-api.ts | 0 .../handlers/{ => subgraph}/subgraph-api.ts | 0 apps/ensapi/src/index.ts | 14 +++++++------- apps/ensapi/src/openapi-document.ts | 14 +++++++------- 22 files changed, 44 insertions(+), 43 deletions(-) rename apps/ensapi/src/handlers/{ => api/explore}/name-tokens-api.routes.ts (100%) rename apps/ensapi/src/handlers/{ => api/explore}/name-tokens-api.ts (100%) rename apps/ensapi/src/handlers/{ => api/explore}/registrar-actions-api.routes.ts (100%) rename apps/ensapi/src/handlers/{ => api/explore}/registrar-actions-api.ts (100%) rename apps/ensapi/src/handlers/{ => api/graphql}/ensnode-graphql-api.ts (100%) rename apps/ensapi/src/handlers/{ => api/meta}/ensnode-api.routes.ts (100%) rename apps/ensapi/src/handlers/{ => api/meta}/ensnode-api.ts (76%) rename apps/ensapi/src/handlers/{amirealtime-api.routes.ts => api/meta/realtime-api.routes.ts} (95%) rename apps/ensapi/src/handlers/{amirealtime-api.test.ts => api/meta/realtime-api.test.ts} (98%) rename apps/ensapi/src/handlers/{amirealtime-api.ts => api/meta/realtime-api.ts} (96%) rename apps/ensapi/src/handlers/{ => api/resolution}/resolution-api.routes.ts (100%) rename apps/ensapi/src/handlers/{ => api/resolution}/resolution-api.ts (100%) create mode 100644 apps/ensapi/src/handlers/api/router.ts rename apps/ensapi/src/handlers/{ => ensanalytics}/ensanalytics-api-v1.routes.ts (100%) rename apps/ensapi/src/handlers/{ => ensanalytics}/ensanalytics-api-v1.test.ts (99%) rename apps/ensapi/src/handlers/{ => ensanalytics}/ensanalytics-api-v1.ts (100%) rename apps/ensapi/src/handlers/{ => ensanalytics}/ensanalytics-api.routes.ts (100%) rename apps/ensapi/src/handlers/{ => ensanalytics}/ensanalytics-api.test.ts (98%) rename apps/ensapi/src/handlers/{ => ensanalytics}/ensanalytics-api.ts (100%) rename apps/ensapi/src/handlers/{ => subgraph}/subgraph-api.ts (100%) diff --git a/apps/ensapi/src/handlers/name-tokens-api.routes.ts b/apps/ensapi/src/handlers/api/explore/name-tokens-api.routes.ts similarity index 100% rename from apps/ensapi/src/handlers/name-tokens-api.routes.ts rename to apps/ensapi/src/handlers/api/explore/name-tokens-api.routes.ts diff --git a/apps/ensapi/src/handlers/name-tokens-api.ts b/apps/ensapi/src/handlers/api/explore/name-tokens-api.ts similarity index 100% rename from apps/ensapi/src/handlers/name-tokens-api.ts rename to apps/ensapi/src/handlers/api/explore/name-tokens-api.ts diff --git a/apps/ensapi/src/handlers/registrar-actions-api.routes.ts b/apps/ensapi/src/handlers/api/explore/registrar-actions-api.routes.ts similarity index 100% rename from apps/ensapi/src/handlers/registrar-actions-api.routes.ts rename to apps/ensapi/src/handlers/api/explore/registrar-actions-api.routes.ts diff --git a/apps/ensapi/src/handlers/registrar-actions-api.ts b/apps/ensapi/src/handlers/api/explore/registrar-actions-api.ts similarity index 100% rename from apps/ensapi/src/handlers/registrar-actions-api.ts rename to apps/ensapi/src/handlers/api/explore/registrar-actions-api.ts diff --git a/apps/ensapi/src/handlers/ensnode-graphql-api.ts b/apps/ensapi/src/handlers/api/graphql/ensnode-graphql-api.ts similarity index 100% rename from apps/ensapi/src/handlers/ensnode-graphql-api.ts rename to apps/ensapi/src/handlers/api/graphql/ensnode-graphql-api.ts diff --git a/apps/ensapi/src/handlers/ensnode-api.routes.ts b/apps/ensapi/src/handlers/api/meta/ensnode-api.routes.ts similarity index 100% rename from apps/ensapi/src/handlers/ensnode-api.routes.ts rename to apps/ensapi/src/handlers/api/meta/ensnode-api.routes.ts diff --git a/apps/ensapi/src/handlers/ensnode-api.ts b/apps/ensapi/src/handlers/api/meta/ensnode-api.ts similarity index 76% rename from apps/ensapi/src/handlers/ensnode-api.ts rename to apps/ensapi/src/handlers/api/meta/ensnode-api.ts index 96e65d0c9..a9d5d3da7 100644 --- a/apps/ensapi/src/handlers/ensnode-api.ts +++ b/apps/ensapi/src/handlers/api/meta/ensnode-api.ts @@ -12,10 +12,6 @@ import { buildEnsApiPublicConfig } from "@/config/config.schema"; import { createApp } from "@/lib/hono-factory"; import { getConfigRoute, getIndexingStatusRoute } from "./ensnode-api.routes"; -import ensnodeGraphQLApi from "./ensnode-graphql-api"; -import nameTokensApi from "./name-tokens-api"; -import registrarActionsApi from "./registrar-actions-api"; -import resolutionApi from "./resolution-api"; const app = createApp(); @@ -49,16 +45,4 @@ app.openapi(getIndexingStatusRoute, async (c) => { ); }); -// Name Tokens API -app.route("/name-tokens", nameTokensApi); - -// Registrar Actions API -app.route("/registrar-actions", registrarActionsApi); - -// Resolution API -app.route("/resolve", resolutionApi); - -// ENSNode GraphQL API -app.route("/graphql", ensnodeGraphQLApi); - export default app; diff --git a/apps/ensapi/src/handlers/amirealtime-api.routes.ts b/apps/ensapi/src/handlers/api/meta/realtime-api.routes.ts similarity index 95% rename from apps/ensapi/src/handlers/amirealtime-api.routes.ts rename to apps/ensapi/src/handlers/api/meta/realtime-api.routes.ts index 328b94167..a04b5884f 100644 --- a/apps/ensapi/src/handlers/amirealtime-api.routes.ts +++ b/apps/ensapi/src/handlers/api/meta/realtime-api.routes.ts @@ -6,7 +6,7 @@ import { makeDurationSchema } from "@ensnode/ensnode-sdk/internal"; import { params } from "@/lib/handlers/params.schema"; -export const basePath = "/amirealtime"; +export const basePath = "/api/realtime"; // Set default `maxWorstCaseDistance` for `GET /amirealtime` endpoint to one minute. export const AMIREALTIME_DEFAULT_MAX_WORST_CASE_DISTANCE: Duration = minutesToSeconds(1); @@ -14,7 +14,7 @@ export const AMIREALTIME_DEFAULT_MAX_WORST_CASE_DISTANCE: Duration = minutesToSe export const amIRealtimeGetMeta = createRoute({ method: "get", path: "/", - operationId: "isRealtime", + operationId: "getRealtime", tags: ["Meta"], summary: "Check indexing progress", description: diff --git a/apps/ensapi/src/handlers/amirealtime-api.test.ts b/apps/ensapi/src/handlers/api/meta/realtime-api.test.ts similarity index 98% rename from apps/ensapi/src/handlers/amirealtime-api.test.ts rename to apps/ensapi/src/handlers/api/meta/realtime-api.test.ts index 8d807c24e..a7f5e6f12 100644 --- a/apps/ensapi/src/handlers/amirealtime-api.test.ts +++ b/apps/ensapi/src/handlers/api/meta/realtime-api.test.ts @@ -9,8 +9,8 @@ import { import { createApp } from "@/lib/hono-factory"; import * as middleware from "@/middleware/indexing-status.middleware"; -import amIRealtimeApi from "./amirealtime-api"; -import { AMIREALTIME_DEFAULT_MAX_WORST_CASE_DISTANCE } from "./amirealtime-api.routes"; +import amIRealtimeApi from "./realtime-api"; +import { AMIREALTIME_DEFAULT_MAX_WORST_CASE_DISTANCE } from "./realtime-api.routes"; vi.mock("@/middleware/indexing-status.middleware", () => ({ indexingStatusMiddleware: vi.fn(), diff --git a/apps/ensapi/src/handlers/amirealtime-api.ts b/apps/ensapi/src/handlers/api/meta/realtime-api.ts similarity index 96% rename from apps/ensapi/src/handlers/amirealtime-api.ts rename to apps/ensapi/src/handlers/api/meta/realtime-api.ts index 7b45d33fb..257ba5f6b 100644 --- a/apps/ensapi/src/handlers/amirealtime-api.ts +++ b/apps/ensapi/src/handlers/api/meta/realtime-api.ts @@ -1,7 +1,7 @@ import { errorResponse } from "@/lib/handlers/error-response"; import { createApp } from "@/lib/hono-factory"; -import { amIRealtimeGetMeta } from "./amirealtime-api.routes"; +import { amIRealtimeGetMeta } from "./realtime-api.routes"; const app = createApp(); diff --git a/apps/ensapi/src/handlers/resolution-api.routes.ts b/apps/ensapi/src/handlers/api/resolution/resolution-api.routes.ts similarity index 100% rename from apps/ensapi/src/handlers/resolution-api.routes.ts rename to apps/ensapi/src/handlers/api/resolution/resolution-api.routes.ts diff --git a/apps/ensapi/src/handlers/resolution-api.ts b/apps/ensapi/src/handlers/api/resolution/resolution-api.ts similarity index 100% rename from apps/ensapi/src/handlers/resolution-api.ts rename to apps/ensapi/src/handlers/api/resolution/resolution-api.ts diff --git a/apps/ensapi/src/handlers/api/router.ts b/apps/ensapi/src/handlers/api/router.ts new file mode 100644 index 000000000..ba7bbd463 --- /dev/null +++ b/apps/ensapi/src/handlers/api/router.ts @@ -0,0 +1,19 @@ +import { createApp } from "@/lib/hono-factory"; + +import nameTokensApi from "./explore/name-tokens-api"; +import registrarActionsApi from "./explore/registrar-actions-api"; +import ensnodeGraphQLApi from "./graphql/ensnode-graphql-api"; +import metaApi from "./meta/ensnode-api"; +import realtimeApi from "./meta/realtime-api"; +import resolutionApi from "./resolution/resolution-api"; + +const app = createApp(); + +app.route("/", metaApi); +app.route("/realtime", realtimeApi); +app.route("/resolve", resolutionApi); +app.route("/name-tokens", nameTokensApi); +app.route("/registrar-actions", registrarActionsApi); +app.route("/graphql", ensnodeGraphQLApi); + +export default app; diff --git a/apps/ensapi/src/handlers/ensanalytics-api-v1.routes.ts b/apps/ensapi/src/handlers/ensanalytics/ensanalytics-api-v1.routes.ts similarity index 100% rename from apps/ensapi/src/handlers/ensanalytics-api-v1.routes.ts rename to apps/ensapi/src/handlers/ensanalytics/ensanalytics-api-v1.routes.ts diff --git a/apps/ensapi/src/handlers/ensanalytics-api-v1.test.ts b/apps/ensapi/src/handlers/ensanalytics/ensanalytics-api-v1.test.ts similarity index 99% rename from apps/ensapi/src/handlers/ensanalytics-api-v1.test.ts rename to apps/ensapi/src/handlers/ensanalytics/ensanalytics-api-v1.test.ts index 2984d054a..27b140055 100644 --- a/apps/ensapi/src/handlers/ensanalytics-api-v1.test.ts +++ b/apps/ensapi/src/handlers/ensanalytics/ensanalytics-api-v1.test.ts @@ -3,9 +3,8 @@ import { describe, expect, it, vi } from "vitest"; import { ENSNamespaceIds } from "@ensnode/datasources"; import type { EnsApiConfig } from "@/config/config.schema"; - -import * as editionsCachesMiddleware from "../middleware/referral-leaderboard-editions-caches.middleware"; -import * as editionSetMiddleware from "../middleware/referral-program-edition-set.middleware"; +import * as editionsCachesMiddleware from "@/middleware/referral-leaderboard-editions-caches.middleware"; +import * as editionSetMiddleware from "@/middleware/referral-program-edition-set.middleware"; vi.mock("@/config", () => ({ get default() { @@ -18,11 +17,11 @@ vi.mock("@/config", () => ({ }, })); -vi.mock("../middleware/referral-program-edition-set.middleware", () => ({ +vi.mock("@/middleware/referral-program-edition-set.middleware", () => ({ referralProgramEditionConfigSetMiddleware: vi.fn(), })); -vi.mock("../middleware/referral-leaderboard-editions-caches.middleware", () => ({ +vi.mock("@/middleware/referral-leaderboard-editions-caches.middleware", () => ({ referralLeaderboardEditionsCachesMiddleware: vi.fn(), })); diff --git a/apps/ensapi/src/handlers/ensanalytics-api-v1.ts b/apps/ensapi/src/handlers/ensanalytics/ensanalytics-api-v1.ts similarity index 100% rename from apps/ensapi/src/handlers/ensanalytics-api-v1.ts rename to apps/ensapi/src/handlers/ensanalytics/ensanalytics-api-v1.ts diff --git a/apps/ensapi/src/handlers/ensanalytics-api.routes.ts b/apps/ensapi/src/handlers/ensanalytics/ensanalytics-api.routes.ts similarity index 100% rename from apps/ensapi/src/handlers/ensanalytics-api.routes.ts rename to apps/ensapi/src/handlers/ensanalytics/ensanalytics-api.routes.ts diff --git a/apps/ensapi/src/handlers/ensanalytics-api.test.ts b/apps/ensapi/src/handlers/ensanalytics/ensanalytics-api.test.ts similarity index 98% rename from apps/ensapi/src/handlers/ensanalytics-api.test.ts rename to apps/ensapi/src/handlers/ensanalytics/ensanalytics-api.test.ts index 0d0dcefc8..74582d1d7 100644 --- a/apps/ensapi/src/handlers/ensanalytics-api.test.ts +++ b/apps/ensapi/src/handlers/ensanalytics/ensanalytics-api.test.ts @@ -3,8 +3,7 @@ import { describe, expect, it, vi } from "vitest"; import { ENSNamespaceIds } from "@ensnode/datasources"; import type { EnsApiConfig } from "@/config/config.schema"; - -import * as middleware from "../middleware/referrer-leaderboard.middleware"; +import * as middleware from "@/middleware/referrer-leaderboard.middleware"; vi.mock("@/config", () => ({ get default() { @@ -17,7 +16,7 @@ vi.mock("@/config", () => ({ }, })); -vi.mock("../middleware/referrer-leaderboard.middleware", () => ({ +vi.mock("@/middleware/referrer-leaderboard.middleware", () => ({ referrerLeaderboardMiddleware: vi.fn(), })); diff --git a/apps/ensapi/src/handlers/ensanalytics-api.ts b/apps/ensapi/src/handlers/ensanalytics/ensanalytics-api.ts similarity index 100% rename from apps/ensapi/src/handlers/ensanalytics-api.ts rename to apps/ensapi/src/handlers/ensanalytics/ensanalytics-api.ts diff --git a/apps/ensapi/src/handlers/subgraph-api.ts b/apps/ensapi/src/handlers/subgraph/subgraph-api.ts similarity index 100% rename from apps/ensapi/src/handlers/subgraph-api.ts rename to apps/ensapi/src/handlers/subgraph/subgraph-api.ts diff --git a/apps/ensapi/src/index.ts b/apps/ensapi/src/index.ts index 778ab816c..c1638f167 100644 --- a/apps/ensapi/src/index.ts +++ b/apps/ensapi/src/index.ts @@ -18,11 +18,11 @@ import logger from "@/lib/logger"; import { indexingStatusMiddleware } from "@/middleware/indexing-status.middleware"; import { generateOpenApi31Document } from "@/openapi-document"; -import amIRealtimeApi from "./handlers/amirealtime-api"; -import ensanalyticsApi from "./handlers/ensanalytics-api"; -import ensanalyticsApiV1 from "./handlers/ensanalytics-api-v1"; -import ensNodeApi from "./handlers/ensnode-api"; -import subgraphApi from "./handlers/subgraph-api"; +import realtimeApi from "./handlers/api/meta/realtime-api"; +import apiRouter from "./handlers/api/router"; +import ensanalyticsApi from "./handlers/ensanalytics/ensanalytics-api"; +import ensanalyticsApiV1 from "./handlers/ensanalytics/ensanalytics-api-v1"; +import subgraphApi from "./handlers/subgraph/subgraph-api"; const app = factory.createApp(); @@ -60,7 +60,7 @@ app.get("/", (c) => ); // use ENSNode HTTP API at /api -app.route("/api", ensNodeApi); +app.route("/api", apiRouter); // use Subgraph GraphQL API at /subgraph app.route("/subgraph", subgraphApi); @@ -72,7 +72,7 @@ app.route("/ensanalytics", ensanalyticsApi); app.route("/v1/ensanalytics", ensanalyticsApiV1); // use Am I Realtime API at /amirealtime -app.route("/amirealtime", amIRealtimeApi); +app.route("/amirealtime", realtimeApi); // serve pre-generated OpenAPI 3.1 document const openApi31Document = generateOpenApi31Document(); diff --git a/apps/ensapi/src/openapi-document.ts b/apps/ensapi/src/openapi-document.ts index 7a45968e0..f6b6b7781 100644 --- a/apps/ensapi/src/openapi-document.ts +++ b/apps/ensapi/src/openapi-document.ts @@ -2,13 +2,13 @@ import { OpenAPIHono } from "@hono/zod-openapi"; import { openapiMeta } from "@/openapi-meta"; -import * as amIRealtimeRoutes from "./handlers/amirealtime-api.routes"; -import * as ensanalyticsRoutes from "./handlers/ensanalytics-api.routes"; -import * as ensanalyticsV1Routes from "./handlers/ensanalytics-api-v1.routes"; -import * as ensnodeRoutes from "./handlers/ensnode-api.routes"; -import * as nameTokensRoutes from "./handlers/name-tokens-api.routes"; -import * as registrarActionsRoutes from "./handlers/registrar-actions-api.routes"; -import * as resolutionRoutes from "./handlers/resolution-api.routes"; +import * as nameTokensRoutes from "./handlers/api/explore/name-tokens-api.routes"; +import * as registrarActionsRoutes from "./handlers/api/explore/registrar-actions-api.routes"; +import * as ensnodeRoutes from "./handlers/api/meta/ensnode-api.routes"; +import * as amIRealtimeRoutes from "./handlers/api/meta/realtime-api.routes"; +import * as resolutionRoutes from "./handlers/api/resolution/resolution-api.routes"; +import * as ensanalyticsRoutes from "./handlers/ensanalytics/ensanalytics-api.routes"; +import * as ensanalyticsV1Routes from "./handlers/ensanalytics/ensanalytics-api-v1.routes"; const routeGroups = [ amIRealtimeRoutes, From f77999bea3c148b4890ed011ea7e45f25796ab4d Mon Sep 17 00:00:00 2001 From: sevenzing Date: Tue, 17 Mar 2026 12:52:19 +0300 Subject: [PATCH 2/9] rename amirealtime to realtime --- apps/ensapi/src/handlers/api/meta/realtime-api.routes.ts | 4 ++-- apps/ensapi/src/handlers/api/meta/realtime-api.ts | 4 ++-- apps/ensapi/src/openapi-document.ts | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/apps/ensapi/src/handlers/api/meta/realtime-api.routes.ts b/apps/ensapi/src/handlers/api/meta/realtime-api.routes.ts index a04b5884f..3d171f315 100644 --- a/apps/ensapi/src/handlers/api/meta/realtime-api.routes.ts +++ b/apps/ensapi/src/handlers/api/meta/realtime-api.routes.ts @@ -11,7 +11,7 @@ export const basePath = "/api/realtime"; // Set default `maxWorstCaseDistance` for `GET /amirealtime` endpoint to one minute. export const AMIREALTIME_DEFAULT_MAX_WORST_CASE_DISTANCE: Duration = minutesToSeconds(1); -export const amIRealtimeGetMeta = createRoute({ +export const realtimeGetMeta = createRoute({ method: "get", path: "/", operationId: "getRealtime", @@ -47,4 +47,4 @@ export const amIRealtimeGetMeta = createRoute({ }, }); -export const routes = [amIRealtimeGetMeta]; +export const routes = [realtimeGetMeta]; diff --git a/apps/ensapi/src/handlers/api/meta/realtime-api.ts b/apps/ensapi/src/handlers/api/meta/realtime-api.ts index 257ba5f6b..e81f3bf42 100644 --- a/apps/ensapi/src/handlers/api/meta/realtime-api.ts +++ b/apps/ensapi/src/handlers/api/meta/realtime-api.ts @@ -1,13 +1,13 @@ import { errorResponse } from "@/lib/handlers/error-response"; import { createApp } from "@/lib/hono-factory"; -import { amIRealtimeGetMeta } from "./realtime-api.routes"; +import { realtimeGetMeta } from "./realtime-api.routes"; const app = createApp(); // allow performance monitoring clients to read HTTP Status for the provided // `maxWorstCaseDistance` param -app.openapi(amIRealtimeGetMeta, async (c) => { +app.openapi(realtimeGetMeta, async (c) => { // context must be set by the required middleware if (c.var.indexingStatus === undefined) { throw new Error(`Invariant(amirealtime-api): indexingStatusMiddleware required.`); diff --git a/apps/ensapi/src/openapi-document.ts b/apps/ensapi/src/openapi-document.ts index f6b6b7781..0fe9481c5 100644 --- a/apps/ensapi/src/openapi-document.ts +++ b/apps/ensapi/src/openapi-document.ts @@ -5,13 +5,13 @@ import { openapiMeta } from "@/openapi-meta"; import * as nameTokensRoutes from "./handlers/api/explore/name-tokens-api.routes"; import * as registrarActionsRoutes from "./handlers/api/explore/registrar-actions-api.routes"; import * as ensnodeRoutes from "./handlers/api/meta/ensnode-api.routes"; -import * as amIRealtimeRoutes from "./handlers/api/meta/realtime-api.routes"; +import * as realtimeRoutes from "./handlers/api/meta/realtime-api.routes"; import * as resolutionRoutes from "./handlers/api/resolution/resolution-api.routes"; import * as ensanalyticsRoutes from "./handlers/ensanalytics/ensanalytics-api.routes"; import * as ensanalyticsV1Routes from "./handlers/ensanalytics/ensanalytics-api-v1.routes"; const routeGroups = [ - amIRealtimeRoutes, + realtimeRoutes, ensnodeRoutes, ensanalyticsV1Routes, ensanalyticsRoutes, From 02b31e96726299db45fbc3c6504a4983032a313d Mon Sep 17 00:00:00 2001 From: sevenzing Date: Thu, 19 Mar 2026 18:35:23 +0300 Subject: [PATCH 3/9] renames realtime in tests --- .../handlers/api/meta/realtime-api.routes.ts | 6 ++-- .../handlers/api/meta/realtime-api.test.ts | 34 +++++++++---------- .../src/handlers/api/meta/realtime-api.ts | 4 +-- apps/ensapi/src/index.ts | 1 + 4 files changed, 23 insertions(+), 22 deletions(-) diff --git a/apps/ensapi/src/handlers/api/meta/realtime-api.routes.ts b/apps/ensapi/src/handlers/api/meta/realtime-api.routes.ts index 3d171f315..56fd2f541 100644 --- a/apps/ensapi/src/handlers/api/meta/realtime-api.routes.ts +++ b/apps/ensapi/src/handlers/api/meta/realtime-api.routes.ts @@ -8,8 +8,8 @@ import { params } from "@/lib/handlers/params.schema"; export const basePath = "/api/realtime"; -// Set default `maxWorstCaseDistance` for `GET /amirealtime` endpoint to one minute. -export const AMIREALTIME_DEFAULT_MAX_WORST_CASE_DISTANCE: Duration = minutesToSeconds(1); +// Set default `maxWorstCaseDistance` for `GET /api/realtime` endpoint to one minute. +export const REALTIME_DEFAULT_MAX_WORST_CASE_DISTANCE: Duration = minutesToSeconds(1); export const realtimeGetMeta = createRoute({ method: "get", @@ -23,7 +23,7 @@ export const realtimeGetMeta = createRoute({ query: z.object({ maxWorstCaseDistance: params.queryParam .optional() - .default(AMIREALTIME_DEFAULT_MAX_WORST_CASE_DISTANCE) + .default(REALTIME_DEFAULT_MAX_WORST_CASE_DISTANCE) .pipe( z.coerce .number({ diff --git a/apps/ensapi/src/handlers/api/meta/realtime-api.test.ts b/apps/ensapi/src/handlers/api/meta/realtime-api.test.ts index a7f5e6f12..e59bd6458 100644 --- a/apps/ensapi/src/handlers/api/meta/realtime-api.test.ts +++ b/apps/ensapi/src/handlers/api/meta/realtime-api.test.ts @@ -9,8 +9,8 @@ import { import { createApp } from "@/lib/hono-factory"; import * as middleware from "@/middleware/indexing-status.middleware"; -import amIRealtimeApi from "./realtime-api"; -import { AMIREALTIME_DEFAULT_MAX_WORST_CASE_DISTANCE } from "./realtime-api.routes"; +import realtimeApi from "./realtime-api"; +import { REALTIME_DEFAULT_MAX_WORST_CASE_DISTANCE } from "./realtime-api.routes"; vi.mock("@/middleware/indexing-status.middleware", () => ({ indexingStatusMiddleware: vi.fn(), @@ -18,7 +18,7 @@ vi.mock("@/middleware/indexing-status.middleware", () => ({ const indexingStatusMiddlewareMock = vi.mocked(middleware.indexingStatusMiddleware); -describe("amirealtime-api", () => { +describe("realtime-api", () => { const now: UnixTimestamp = 1766123729; const arrangeMockedIndexingStatusMiddleware = ({ @@ -51,21 +51,21 @@ describe("amirealtime-api", () => { // Create a fresh app instance for each test with middleware registered app = createApp(); app.use(middleware.indexingStatusMiddleware); - app.route("/amirealtime", amIRealtimeApi); + app.route("/realtime", realtimeApi); }); afterEach(() => { indexingStatusMiddlewareMock.mockReset(); }); - describe("GET /amirealtime", () => { + describe("GET /realtime", () => { describe("request", () => { it("should accept valid maxWorstCaseDistance query param", async () => { // Arrange: set `indexingStatus` context var arrangeMockedIndexingStatusMiddleware({ now }); // Act - const response = await app.request("http://localhost/amirealtime?maxWorstCaseDistance=300"); + const response = await app.request("http://localhost/realtime?maxWorstCaseDistance=300"); const responseJson = await response.json(); // Assert @@ -83,7 +83,7 @@ describe("amirealtime-api", () => { }); // Act - const response = await app.request("http://localhost/amirealtime?maxWorstCaseDistance=0"); + const response = await app.request("http://localhost/realtime?maxWorstCaseDistance=0"); const responseJson = await response.json(); // Assert @@ -98,13 +98,13 @@ describe("amirealtime-api", () => { arrangeMockedIndexingStatusMiddleware({ now }); // Act - const response = await app.request("http://localhost/amirealtime?maxWorstCaseDistance"); + const response = await app.request("http://localhost/realtime?maxWorstCaseDistance"); const responseJson = await response.json(); // Assert expect(response.status).toBe(200); expect(responseJson).toMatchObject({ - maxWorstCaseDistance: AMIREALTIME_DEFAULT_MAX_WORST_CASE_DISTANCE, + maxWorstCaseDistance: REALTIME_DEFAULT_MAX_WORST_CASE_DISTANCE, }); }); @@ -113,13 +113,13 @@ describe("amirealtime-api", () => { arrangeMockedIndexingStatusMiddleware({ now }); // Act - const response = await app.request("http://localhost/amirealtime"); + const response = await app.request("http://localhost/realtime"); const responseJson = await response.json(); // Assert expect(response.status).toBe(200); expect(responseJson).toMatchObject({ - maxWorstCaseDistance: AMIREALTIME_DEFAULT_MAX_WORST_CASE_DISTANCE, + maxWorstCaseDistance: REALTIME_DEFAULT_MAX_WORST_CASE_DISTANCE, }); }); @@ -128,7 +128,7 @@ describe("amirealtime-api", () => { arrangeMockedIndexingStatusMiddleware({ now }); // Act - const response = await app.request("http://localhost/amirealtime?maxWorstCaseDistance=-1"); + const response = await app.request("http://localhost/realtime?maxWorstCaseDistance=-1"); // Assert expect(response.status).toBe(400); @@ -143,7 +143,7 @@ describe("amirealtime-api", () => { // Act const response = await app.request( - "http://localhost/amirealtime?maxWorstCaseDistance=invalid", + "http://localhost/realtime?maxWorstCaseDistance=invalid", ); // Assert @@ -163,7 +163,7 @@ describe("amirealtime-api", () => { }); // Act - const response = await app.request("http://localhost/amirealtime?maxWorstCaseDistance=10"); + const response = await app.request("http://localhost/realtime?maxWorstCaseDistance=10"); const responseJson = await response.json(); // Assert @@ -183,7 +183,7 @@ describe("amirealtime-api", () => { }); // Act - const response = await app.request("http://localhost/amirealtime?maxWorstCaseDistance=10"); + const response = await app.request("http://localhost/realtime?maxWorstCaseDistance=10"); const responseJson = await response.json(); // Assert @@ -203,7 +203,7 @@ describe("amirealtime-api", () => { }); // Act - const response = await app.request("http://localhost/amirealtime?maxWorstCaseDistance=10"); + const response = await app.request("http://localhost/realtime?maxWorstCaseDistance=10"); const responseJson = await response.json(); // Assert @@ -223,7 +223,7 @@ describe("amirealtime-api", () => { }); // Act - const response = await app.request("http://localhost/amirealtime?maxWorstCaseDistance=10"); + const response = await app.request("http://localhost/realtime?maxWorstCaseDistance=10"); const responseJson = await response.json(); // Assert diff --git a/apps/ensapi/src/handlers/api/meta/realtime-api.ts b/apps/ensapi/src/handlers/api/meta/realtime-api.ts index e81f3bf42..6c222ca01 100644 --- a/apps/ensapi/src/handlers/api/meta/realtime-api.ts +++ b/apps/ensapi/src/handlers/api/meta/realtime-api.ts @@ -10,14 +10,14 @@ const app = createApp(); app.openapi(realtimeGetMeta, async (c) => { // context must be set by the required middleware if (c.var.indexingStatus === undefined) { - throw new Error(`Invariant(amirealtime-api): indexingStatusMiddleware required.`); + throw new Error(`Invariant(realtime-api): indexingStatusMiddleware required.`); } // return 503 response error with details on prerequisite being unavailable if (c.var.indexingStatus instanceof Error) { return errorResponse( c, - `Invariant(amirealtime-api): Indexing Status has to be resolved successfully before 'maxWorstCaseDistance' can be applied.`, + `Invariant(realtime-api): Indexing Status has to be resolved successfully before 'maxWorstCaseDistance' can be applied.`, 503, ); } diff --git a/apps/ensapi/src/index.ts b/apps/ensapi/src/index.ts index c1638f167..a5db69aeb 100644 --- a/apps/ensapi/src/index.ts +++ b/apps/ensapi/src/index.ts @@ -72,6 +72,7 @@ app.route("/ensanalytics", ensanalyticsApi); app.route("/v1/ensanalytics", ensanalyticsApiV1); // use Am I Realtime API at /amirealtime +// NOTE: this is legacy endpoint and will be deleted in future. one should use /api/realtime instead app.route("/amirealtime", realtimeApi); // serve pre-generated OpenAPI 3.1 document From e6728eb0fad2316feaa378fc03a7d6d77ac92933 Mon Sep 17 00:00:00 2001 From: sevenzing Date: Thu, 19 Mar 2026 18:51:17 +0300 Subject: [PATCH 4/9] update openapi file --- docs/docs.ensnode.io/ensapi-openapi.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/docs.ensnode.io/ensapi-openapi.json b/docs/docs.ensnode.io/ensapi-openapi.json index 54e2e9423..d69de2e6f 100644 --- a/docs/docs.ensnode.io/ensapi-openapi.json +++ b/docs/docs.ensnode.io/ensapi-openapi.json @@ -29,9 +29,9 @@ ], "components": { "schemas": {}, "parameters": {} }, "paths": { - "/amirealtime": { + "/api/realtime": { "get": { - "operationId": "isRealtime", + "operationId": "getRealtime", "tags": ["Meta"], "summary": "Check indexing progress", "description": "Checks if the indexing progress is guaranteed to be within a requested worst-case distance of realtime", From 44c4cae3b183c05181b5d004168714040069d4bc Mon Sep 17 00:00:00 2001 From: sevenzing Date: Thu, 19 Mar 2026 20:15:15 +0300 Subject: [PATCH 5/9] docs(changeset): API file handlers rearrange --- .changeset/metal-breads-bathe.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/metal-breads-bathe.md diff --git a/.changeset/metal-breads-bathe.md b/.changeset/metal-breads-bathe.md new file mode 100644 index 000000000..b4edc8aba --- /dev/null +++ b/.changeset/metal-breads-bathe.md @@ -0,0 +1,5 @@ +--- +"ensapi": patch +--- + +API file handlers rearrange From b86c6c77d2e8a61beb6f42c53cf223ad064d2cb9 Mon Sep 17 00:00:00 2001 From: sevenzing Date: Thu, 19 Mar 2026 20:17:26 +0300 Subject: [PATCH 6/9] add changeset --- .changeset/metal-breads-bathe.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/metal-breads-bathe.md b/.changeset/metal-breads-bathe.md index b4edc8aba..17fc9acfc 100644 --- a/.changeset/metal-breads-bathe.md +++ b/.changeset/metal-breads-bathe.md @@ -2,4 +2,4 @@ "ensapi": patch --- -API file handlers rearrange +API file handlers rearrange, making them grouped by open api tags. Moving /amirealtime to /api/realtime and keeping old endpoint for backward compatibility. From dc018568753897b769edc15b8c61bcf59b833c95 Mon Sep 17 00:00:00 2001 From: sevenzing Date: Thu, 19 Mar 2026 21:03:59 +0300 Subject: [PATCH 7/9] rename ensenodeRoute to statusRoute --- apps/ensapi/src/config/config.schema.ts | 2 +- .../api/meta/{ensnode-api.routes.ts => status-api.routes.ts} | 0 .../src/handlers/api/meta/{ensnode-api.ts => status-api.ts} | 2 +- apps/ensapi/src/handlers/api/router.ts | 4 ++-- apps/ensapi/src/openapi-document.ts | 4 ++-- 5 files changed, 6 insertions(+), 6 deletions(-) rename apps/ensapi/src/handlers/api/meta/{ensnode-api.routes.ts => status-api.routes.ts} (100%) rename apps/ensapi/src/handlers/api/meta/{ensnode-api.ts => status-api.ts} (94%) diff --git a/apps/ensapi/src/config/config.schema.ts b/apps/ensapi/src/config/config.schema.ts index ec402ba89..3228089c8 100644 --- a/apps/ensapi/src/config/config.schema.ts +++ b/apps/ensapi/src/config/config.schema.ts @@ -73,7 +73,7 @@ const EnsApiConfigSchema = z customReferralProgramEditionConfigSetUrl: CustomReferralProgramEditionConfigSetUrlSchema, }) .check(invariant_rpcConfigsSpecifiedForRootChain) - .check(invariant_ensIndexerPublicConfigVersionInfo); + // .check(invariant_ensIndexerPublicConfigVersionInfo); export type EnsApiConfig = z.infer; diff --git a/apps/ensapi/src/handlers/api/meta/ensnode-api.routes.ts b/apps/ensapi/src/handlers/api/meta/status-api.routes.ts similarity index 100% rename from apps/ensapi/src/handlers/api/meta/ensnode-api.routes.ts rename to apps/ensapi/src/handlers/api/meta/status-api.routes.ts diff --git a/apps/ensapi/src/handlers/api/meta/ensnode-api.ts b/apps/ensapi/src/handlers/api/meta/status-api.ts similarity index 94% rename from apps/ensapi/src/handlers/api/meta/ensnode-api.ts rename to apps/ensapi/src/handlers/api/meta/status-api.ts index a9d5d3da7..b295823b8 100644 --- a/apps/ensapi/src/handlers/api/meta/ensnode-api.ts +++ b/apps/ensapi/src/handlers/api/meta/status-api.ts @@ -11,7 +11,7 @@ import { import { buildEnsApiPublicConfig } from "@/config/config.schema"; import { createApp } from "@/lib/hono-factory"; -import { getConfigRoute, getIndexingStatusRoute } from "./ensnode-api.routes"; +import { getConfigRoute, getIndexingStatusRoute } from "./status-api.routes"; const app = createApp(); diff --git a/apps/ensapi/src/handlers/api/router.ts b/apps/ensapi/src/handlers/api/router.ts index ba7bbd463..6ceed6650 100644 --- a/apps/ensapi/src/handlers/api/router.ts +++ b/apps/ensapi/src/handlers/api/router.ts @@ -3,13 +3,13 @@ import { createApp } from "@/lib/hono-factory"; import nameTokensApi from "./explore/name-tokens-api"; import registrarActionsApi from "./explore/registrar-actions-api"; import ensnodeGraphQLApi from "./graphql/ensnode-graphql-api"; -import metaApi from "./meta/ensnode-api"; +import statusApi from "./meta/status-api"; import realtimeApi from "./meta/realtime-api"; import resolutionApi from "./resolution/resolution-api"; const app = createApp(); -app.route("/", metaApi); +app.route("/", statusApi); app.route("/realtime", realtimeApi); app.route("/resolve", resolutionApi); app.route("/name-tokens", nameTokensApi); diff --git a/apps/ensapi/src/openapi-document.ts b/apps/ensapi/src/openapi-document.ts index 0fe9481c5..63bb7a35e 100644 --- a/apps/ensapi/src/openapi-document.ts +++ b/apps/ensapi/src/openapi-document.ts @@ -4,7 +4,7 @@ import { openapiMeta } from "@/openapi-meta"; import * as nameTokensRoutes from "./handlers/api/explore/name-tokens-api.routes"; import * as registrarActionsRoutes from "./handlers/api/explore/registrar-actions-api.routes"; -import * as ensnodeRoutes from "./handlers/api/meta/ensnode-api.routes"; +import * as statusRoutes from "./handlers/api/meta/status-api.routes"; import * as realtimeRoutes from "./handlers/api/meta/realtime-api.routes"; import * as resolutionRoutes from "./handlers/api/resolution/resolution-api.routes"; import * as ensanalyticsRoutes from "./handlers/ensanalytics/ensanalytics-api.routes"; @@ -12,7 +12,7 @@ import * as ensanalyticsV1Routes from "./handlers/ensanalytics/ensanalytics-api- const routeGroups = [ realtimeRoutes, - ensnodeRoutes, + statusRoutes, ensanalyticsV1Routes, ensanalyticsRoutes, nameTokensRoutes, From 9b2d18b6935c21cc98c2f84867c33af61b6fcd08 Mon Sep 17 00:00:00 2001 From: sevenzing Date: Thu, 19 Mar 2026 21:08:29 +0300 Subject: [PATCH 8/9] pnpm lint --- apps/ensapi/src/handlers/api/router.ts | 2 +- apps/ensapi/src/openapi-document.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/ensapi/src/handlers/api/router.ts b/apps/ensapi/src/handlers/api/router.ts index 6ceed6650..1a8d31e54 100644 --- a/apps/ensapi/src/handlers/api/router.ts +++ b/apps/ensapi/src/handlers/api/router.ts @@ -3,8 +3,8 @@ import { createApp } from "@/lib/hono-factory"; import nameTokensApi from "./explore/name-tokens-api"; import registrarActionsApi from "./explore/registrar-actions-api"; import ensnodeGraphQLApi from "./graphql/ensnode-graphql-api"; -import statusApi from "./meta/status-api"; import realtimeApi from "./meta/realtime-api"; +import statusApi from "./meta/status-api"; import resolutionApi from "./resolution/resolution-api"; const app = createApp(); diff --git a/apps/ensapi/src/openapi-document.ts b/apps/ensapi/src/openapi-document.ts index 63bb7a35e..ae6805800 100644 --- a/apps/ensapi/src/openapi-document.ts +++ b/apps/ensapi/src/openapi-document.ts @@ -4,8 +4,8 @@ import { openapiMeta } from "@/openapi-meta"; import * as nameTokensRoutes from "./handlers/api/explore/name-tokens-api.routes"; import * as registrarActionsRoutes from "./handlers/api/explore/registrar-actions-api.routes"; -import * as statusRoutes from "./handlers/api/meta/status-api.routes"; import * as realtimeRoutes from "./handlers/api/meta/realtime-api.routes"; +import * as statusRoutes from "./handlers/api/meta/status-api.routes"; import * as resolutionRoutes from "./handlers/api/resolution/resolution-api.routes"; import * as ensanalyticsRoutes from "./handlers/ensanalytics/ensanalytics-api.routes"; import * as ensanalyticsV1Routes from "./handlers/ensanalytics/ensanalytics-api-v1.routes"; From 81297dc8dfed074681849a5c94eea0539a690772 Mon Sep 17 00:00:00 2001 From: sevenzing Date: Thu, 19 Mar 2026 21:13:23 +0300 Subject: [PATCH 9/9] oops --- apps/ensapi/src/config/config.schema.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/ensapi/src/config/config.schema.ts b/apps/ensapi/src/config/config.schema.ts index 3228089c8..ec402ba89 100644 --- a/apps/ensapi/src/config/config.schema.ts +++ b/apps/ensapi/src/config/config.schema.ts @@ -73,7 +73,7 @@ const EnsApiConfigSchema = z customReferralProgramEditionConfigSetUrl: CustomReferralProgramEditionConfigSetUrlSchema, }) .check(invariant_rpcConfigsSpecifiedForRootChain) - // .check(invariant_ensIndexerPublicConfigVersionInfo); + .check(invariant_ensIndexerPublicConfigVersionInfo); export type EnsApiConfig = z.infer;