import { GraphQLError, GraphQLSchema } from "graphql";
import { HeadersInit } from "node-fetch";
import { fetch } from 'apollo-server-env';
import { GraphQLRequestContextExecutionDidStart, Logger } from "apollo-server-types";
import { ServiceDefinition } from "@apollo/federation";
import { GraphQLDataSource } from './datasources/types';
import { QueryPlan } from '@apollo/query-planner';
import { OperationContext } from './operationContext';
import { ServiceMap } from './executeQueryPlan';
export declare type ServiceEndpointDefinition = Pick<ServiceDefinition, 'name' | 'url'>;
export declare type Experimental_DidResolveQueryPlanCallback = ({ queryPlan, serviceMap, operationContext, requestContext, }: {
    readonly queryPlan: QueryPlan;
    readonly serviceMap: ServiceMap;
    readonly operationContext: OperationContext;
    readonly requestContext: GraphQLRequestContextExecutionDidStart<Record<string, any>>;
}) => void;
interface ImplementingServiceLocation {
    name: string;
    path: string;
}
export interface CompositionMetadata {
    formatVersion: number;
    id: string;
    implementingServiceLocations: ImplementingServiceLocation[];
    schemaHash: string;
}
export declare type Experimental_DidFailCompositionCallback = ({ errors, serviceList, compositionMetadata, }: {
    readonly errors: GraphQLError[];
    readonly serviceList: ServiceDefinition[];
    readonly compositionMetadata?: CompositionMetadata;
}) => void;
export interface ServiceDefinitionCompositionInfo {
    serviceDefinitions: ServiceDefinition[];
    schema: GraphQLSchema;
    compositionMetadata?: CompositionMetadata;
}
export interface SupergraphSdlCompositionInfo {
    schema: GraphQLSchema;
    compositionId: string;
    supergraphSdl: string;
}
export declare type CompositionInfo = ServiceDefinitionCompositionInfo | SupergraphSdlCompositionInfo;
export declare type Experimental_DidUpdateCompositionCallback = (currentConfig: CompositionInfo, previousConfig?: CompositionInfo) => void;
export declare type CompositionUpdate = ServiceDefinitionUpdate | SupergraphSdlUpdate;
export interface ServiceDefinitionUpdate {
    serviceDefinitions?: ServiceDefinition[];
    compositionMetadata?: CompositionMetadata;
    isNewSchema: boolean;
}
export interface SupergraphSdlUpdate {
    id: string;
    supergraphSdl: string;
}
export declare function isSupergraphSdlUpdate(update: CompositionUpdate): update is SupergraphSdlUpdate;
export declare function isServiceDefinitionUpdate(update: CompositionUpdate): update is ServiceDefinitionUpdate;
export declare type Experimental_UpdateServiceDefinitions = (config: DynamicGatewayConfig) => Promise<ServiceDefinitionUpdate>;
export declare type Experimental_UpdateSupergraphSdl = (config: DynamicGatewayConfig) => Promise<SupergraphSdlUpdate>;
export declare type Experimental_UpdateComposition = (config: DynamicGatewayConfig) => Promise<CompositionUpdate>;
interface GatewayConfigBase {
    debug?: boolean;
    logger?: Logger;
    __exposeQueryPlanExperimental?: boolean;
    buildService?: (definition: ServiceEndpointDefinition) => GraphQLDataSource;
    experimental_didResolveQueryPlan?: Experimental_DidResolveQueryPlanCallback;
    experimental_didFailComposition?: Experimental_DidFailCompositionCallback;
    experimental_didUpdateComposition?: Experimental_DidUpdateCompositionCallback;
    experimental_pollInterval?: number;
    experimental_approximateQueryPlanStoreMiB?: number;
    experimental_autoFragmentization?: boolean;
    fetcher?: typeof fetch;
    serviceHealthCheck?: boolean;
}
export interface RemoteGatewayConfig extends GatewayConfigBase {
    serviceList: ServiceEndpointDefinition[];
    introspectionHeaders?: HeadersInit | ((service: ServiceEndpointDefinition) => Promise<HeadersInit> | HeadersInit);
}
export interface LegacyManagedGatewayConfig extends GatewayConfigBase {
    federationVersion?: number;
    schemaConfigDeliveryEndpoint: null;
}
export interface PrecomposedManagedGatewayConfig extends GatewayConfigBase {
    schemaConfigDeliveryEndpoint?: string;
}
export declare type ManagedGatewayConfig = LegacyManagedGatewayConfig | PrecomposedManagedGatewayConfig;
interface ManuallyManagedServiceDefsGatewayConfig extends GatewayConfigBase {
    experimental_updateServiceDefinitions: Experimental_UpdateServiceDefinitions;
}
interface ManuallyManagedSupergraphSdlGatewayConfig extends GatewayConfigBase {
    experimental_updateSupergraphSdl: Experimental_UpdateSupergraphSdl;
}
declare type ManuallyManagedGatewayConfig = ManuallyManagedServiceDefsGatewayConfig | ManuallyManagedSupergraphSdlGatewayConfig;
interface LocalGatewayConfig extends GatewayConfigBase {
    localServiceList: ServiceDefinition[];
}
interface SupergraphSdlGatewayConfig extends GatewayConfigBase {
    supergraphSdl: string;
}
export declare type StaticGatewayConfig = LocalGatewayConfig | SupergraphSdlGatewayConfig;
declare type DynamicGatewayConfig = ManagedGatewayConfig | RemoteGatewayConfig | ManuallyManagedGatewayConfig;
export declare type GatewayConfig = StaticGatewayConfig | DynamicGatewayConfig;
export declare function isLocalConfig(config: GatewayConfig): config is LocalGatewayConfig;
export declare function isRemoteConfig(config: GatewayConfig): config is RemoteGatewayConfig;
export declare function isSupergraphSdlConfig(config: GatewayConfig): config is SupergraphSdlGatewayConfig;
export declare function isManuallyManagedConfig(config: GatewayConfig): config is ManuallyManagedGatewayConfig;
export declare function isManagedConfig(config: GatewayConfig): config is ManagedGatewayConfig;
export declare function isPrecomposedManagedConfig(config: GatewayConfig): config is PrecomposedManagedGatewayConfig;
export declare function isLegacyManagedConfig(config: GatewayConfig): config is LegacyManagedGatewayConfig;
export declare function isStaticConfig(config: GatewayConfig): config is StaticGatewayConfig;
export declare function isDynamicConfig(config: GatewayConfig): config is DynamicGatewayConfig;
export {};
//# sourceMappingURL=config.d.ts.map