diff --git a/.changeset/cool-hotels-dress.md b/.changeset/cool-hotels-dress.md new file mode 100644 index 0000000000..cc95d775cd --- /dev/null +++ b/.changeset/cool-hotels-dress.md @@ -0,0 +1,5 @@ +--- +"@ensnode/ensnode-sdk": minor +--- + +Fully removed the deprecated `ENSNodeClient` (use `EnsApiClient` instead). diff --git a/.changeset/stale-wombats-help.md b/.changeset/stale-wombats-help.md new file mode 100644 index 0000000000..7d776384bc --- /dev/null +++ b/.changeset/stale-wombats-help.md @@ -0,0 +1,5 @@ +--- +"@ensnode/ensnode-react": minor +--- + +Applied `ASSUME_IMMUTABLE_QUERY` options to `useResolvedIdentity` to prevent redundant refetches. diff --git a/.changeset/two-rice-flash.md b/.changeset/two-rice-flash.md new file mode 100644 index 0000000000..45bf39db68 --- /dev/null +++ b/.changeset/two-rice-flash.md @@ -0,0 +1,5 @@ +--- +"@ensnode/ensnode-react": minor +--- + +Replaced references to the deprecated and removed `ENSNodeClient` with `EnsApiClient`. diff --git a/packages/ensnode-react/src/hooks/useResolvedIdentity.ts b/packages/ensnode-react/src/hooks/useResolvedIdentity.ts index 460ecaca6b..a913b54a47 100644 --- a/packages/ensnode-react/src/hooks/useResolvedIdentity.ts +++ b/packages/ensnode-react/src/hooks/useResolvedIdentity.ts @@ -14,6 +14,7 @@ import { } from "@ensnode/ensnode-sdk"; import type { UseResolvedIdentityParameters } from "../types"; +import { ASSUME_IMMUTABLE_QUERY } from "../utils/query"; import { useENSNodeConfig } from "./useENSNodeConfig"; import { usePrimaryName } from "./usePrimaryName"; @@ -56,7 +57,12 @@ export function useResolvedIdentity(parameters: UseResolvedIdentityParameters) { namespace ?? ENSNamespaceIds.Mainnet, ), accelerate, + // NOTE: Overriding `gcTime` to prevent unbounded memory growth + // in long-running sessions with many identities. query: { + ...ASSUME_IMMUTABLE_QUERY, // identity changes very rarely + gcTime: 60 * 60 * 1000, // 1 hour + refetchInterval: false, // not covered by ASSUME_IMMUTABLE_QUERY ..._query, enabled: (_query.enabled ?? true) && namespace !== undefined, }, diff --git a/packages/ensnode-react/src/provider.tsx b/packages/ensnode-react/src/provider.tsx index 457db1319e..a99fa3a45c 100644 --- a/packages/ensnode-react/src/provider.tsx +++ b/packages/ensnode-react/src/provider.tsx @@ -4,7 +4,7 @@ import { QueryClient, QueryClientProvider, useQueryClient } from "@tanstack/react-query"; import { createElement, useMemo } from "react"; -import { ENSNodeClient } from "@ensnode/ensnode-sdk"; +import { EnsApiClient } from "@ensnode/ensnode-sdk"; import { ENSNodeContext } from "./context"; import type { ENSNodeSDKConfig } from "./types"; @@ -95,11 +95,11 @@ export function ENSNodeProvider(parameters: React.PropsWithChildren { - const client = new ENSNodeClient(config.client); + const client = new EnsApiClient(config.client); return client.resolveRecords(args.name, args.selection, args); }, }; @@ -93,7 +93,7 @@ export function createPrimaryNameQueryOptions( enabled: true, queryKey: queryKeys.primaryName(config.client.url.href, args), queryFn: async () => { - const client = new ENSNodeClient(config.client); + const client = new EnsApiClient(config.client); return client.resolvePrimaryName(args.address, args.chainId, args); }, }; @@ -110,7 +110,7 @@ export function createPrimaryNamesQueryOptions( enabled: true, queryKey: queryKeys.primaryNames(config.client.url.href, args), queryFn: async () => { - const client = new ENSNodeClient(config.client); + const client = new EnsApiClient(config.client); return client.resolvePrimaryNames(args.address, args); }, }; @@ -124,7 +124,7 @@ export function createConfigQueryOptions(config: ENSNodeSDKConfig) { enabled: true, queryKey: queryKeys.config(config.client.url.href), queryFn: async () => { - const client = new ENSNodeClient(config.client); + const client = new EnsApiClient(config.client); return client.config(); }, }; @@ -138,7 +138,7 @@ export function createIndexingStatusQueryOptions(config: ENSNodeSDKConfig) { enabled: true, queryKey: queryKeys.indexingStatus(config.client.url.href), queryFn: async () => { - const client = new ENSNodeClient(config.client); + const client = new EnsApiClient(config.client); return client.indexingStatus(); }, }; @@ -155,7 +155,7 @@ export function createRegistrarActionsQueryOptions( enabled: true, queryKey: queryKeys.registrarActions(config.client.url.href, args), queryFn: async () => { - const client = new ENSNodeClient(config.client); + const client = new EnsApiClient(config.client); return client.registrarActions(args); }, @@ -170,7 +170,7 @@ export function createNameTokensQueryOptions(config: ENSNodeSDKConfig, args: Nam enabled: true, queryKey: queryKeys.nameTokens(config.client.url.href, args), queryFn: async () => { - const client = new ENSNodeClient(config.client); + const client = new EnsApiClient(config.client); return client.nameTokens(args); }, diff --git a/packages/ensnode-sdk/README.md b/packages/ensnode-sdk/README.md index ddfd708b21..346c3c8487 100644 --- a/packages/ensnode-sdk/README.md +++ b/packages/ensnode-sdk/README.md @@ -10,9 +10,9 @@ Learn more about [ENSNode](https://ensnode.io/) from [the ENSNode docs](https:// npm install @ensnode/ensnode-sdk ``` -## ENSNode Client +## EnsApiClient -The `ENSNodeClient` provides a unified interface for the supported ENSNode APIs: +The `EnsApiClient` provides a unified interface for the ENSApi REST APIs: - Resolution API (Protocol Accelerated Forward/Reverse Resolution) - Indexing Status API - Configuration API @@ -20,10 +20,10 @@ The `ENSNodeClient` provides a unified interface for the supported ENSNode APIs: ### Basic Usage ```typescript -import { ENSNodeClient, evmChainIdToCoinType } from "@ensnode/ensnode-sdk"; -import { mainnet } from 'viem/chains'; +import { EnsApiClient, evmChainIdToCoinType } from "@ensnode/ensnode-sdk"; +import { mainnet } from "viem/chains"; -const client = new ENSNodeClient(); +const client = new EnsApiClient(); // Resolution API: Records Resolution const { records } = await client.resolveRecords("jesse.base.eth", { @@ -186,7 +186,7 @@ console.log(status); ### Configuration ```typescript -const client = new ENSNodeClient({ +const client = new EnsApiClient({ url: new URL("https://my-ensnode-instance.com"), }); ``` diff --git a/packages/ensnode-sdk/src/ensapi/client.ts b/packages/ensnode-sdk/src/ensapi/client.ts index e1ca9fdea4..9881159b66 100644 --- a/packages/ensnode-sdk/src/ensapi/client.ts +++ b/packages/ensnode-sdk/src/ensapi/client.ts @@ -678,10 +678,3 @@ export class EnsApiClient { return deserializedNameTokensResponse(responseData as SerializedNameTokensResponse); } } - -/** - * ENSNode Client - * - * @deprecated use {@link EnsApiClient} instead - */ -export class ENSNodeClient extends EnsApiClient {} diff --git a/packages/ensnode-sdk/src/ensapi/index.ts b/packages/ensnode-sdk/src/ensapi/index.ts index 5e22faf218..c31054877e 100644 --- a/packages/ensnode-sdk/src/ensapi/index.ts +++ b/packages/ensnode-sdk/src/ensapi/index.ts @@ -1,7 +1,6 @@ export * from "./api"; export { type ClientOptions, - ENSNodeClient, EnsApiClient, type EnsApiClientOptions, } from "./client";