diff --git a/.changeset/slimy-yaks-sniff.md b/.changeset/slimy-yaks-sniff.md new file mode 100644 index 000000000..e719bd830 --- /dev/null +++ b/.changeset/slimy-yaks-sniff.md @@ -0,0 +1,5 @@ +--- +'@graphql-hive/client': minor +--- + +Introduce createSupergraphManager for @apollo/gateway v2 diff --git a/packages/libraries/client/src/apollo.ts b/packages/libraries/client/src/apollo.ts index 45851e163..061d6b855 100644 --- a/packages/libraries/client/src/apollo.ts +++ b/packages/libraries/client/src/apollo.ts @@ -28,6 +28,46 @@ export function createSupergraphSDLFetcher({ endpoint, key }: SupergraphSDLFetch }; } +export function createSupergraphManager(options: { pollIntervalInMs?: number } & SupergraphSDLFetcherOptions) { + const pollIntervalInMs = options.pollIntervalInMs ?? 30_000; + const fetchSupergraph = createSupergraphSDLFetcher({ endpoint: options.endpoint, key: options.key }); + let timer: ReturnType | null = null; + + return { + async initialize(hooks: { update(supergraphSdl: string): void }): Promise<{ + supergraphSdl: string; + cleanup?: () => Promise; + }> { + const initialResult = await fetchSupergraph(); + + function poll() { + timer = setTimeout(async () => { + try { + const result = await fetchSupergraph(); + if (result.supergraphSdl) { + hooks.update?.(result.supergraphSdl); + } + } catch (error) { + console.error(`Failed to update supergraph: ${error instanceof Error ? error.message : error}`); + } + poll(); + }, pollIntervalInMs); + } + + poll(); + + return { + supergraphSdl: initialResult.supergraphSdl, + cleanup: async () => { + if (timer) { + clearTimeout(timer); + } + }, + }; + }, + }; +} + export function hiveApollo(clientOrOptions: HiveClient | HivePluginOptions): ApolloServerPlugin { const hive = isHiveClient(clientOrOptions) ? clientOrOptions diff --git a/packages/libraries/client/src/index.ts b/packages/libraries/client/src/index.ts index 9b43c13ba..b74dc0295 100644 --- a/packages/libraries/client/src/index.ts +++ b/packages/libraries/client/src/index.ts @@ -1,5 +1,5 @@ export type { HivePluginOptions, HiveClient } from './internal/types'; export { useHive } from './envelop'; -export { hiveApollo, createSupergraphSDLFetcher } from './apollo'; +export { hiveApollo, createSupergraphSDLFetcher, createSupergraphManager } from './apollo'; export { createSchemaFetcher, createServicesFetcher } from './gateways'; export { createHive } from './client';