import { DocumentNode } from 'graphql';
import { Ref } from 'vue-demi';
import type { OperationVariables, SubscriptionOptions, FetchResult, Observable, TypedDocumentNode, ApolloError, ApolloClient } from '@apollo/client/core/index.js';
import { ReactiveFunction } from './util/ReactiveFunction';
export interface UseSubscriptionOptions<TResult = any, TVariables = OperationVariables> extends Omit<SubscriptionOptions<TVariables>, 'query' | 'variables'> {
    clientId?: string;
    enabled?: boolean | Ref<boolean>;
    throttle?: number;
    debounce?: number;
}
type DocumentParameter<TResult, TVariables> = DocumentNode | Ref<DocumentNode> | ReactiveFunction<DocumentNode> | TypedDocumentNode<TResult, TVariables> | Ref<TypedDocumentNode<TResult, TVariables>> | ReactiveFunction<TypedDocumentNode<TResult, TVariables>>;
type VariablesParameter<TVariables> = TVariables | Ref<TVariables> | ReactiveFunction<TVariables>;
type OptionsParameter<TResult, TVariables> = UseSubscriptionOptions<TResult, TVariables> | Ref<UseSubscriptionOptions<TResult, TVariables>> | ReactiveFunction<UseSubscriptionOptions<TResult, TVariables>>;
export interface OnResultContext {
    client: ApolloClient<any>;
}
export interface OnErrorContext {
    client: ApolloClient<any>;
}
export interface UseSubscriptionReturn<TResult, TVariables> {
    result: Ref<TResult | null | undefined>;
    loading: Ref<boolean>;
    error: Ref<ApolloError | null>;
    start: () => void;
    stop: () => void;
    restart: () => void;
    document: Ref<DocumentNode>;
    variables: Ref<TVariables | undefined>;
    options: UseSubscriptionOptions<TResult, TVariables> | Ref<UseSubscriptionOptions<TResult, TVariables>>;
    subscription: Ref<Observable<FetchResult<TResult, Record<string, any>, Record<string, any>>> | null>;
    onResult: (fn: (param: FetchResult<TResult, Record<string, any>, Record<string, any>>, context: OnResultContext) => void) => {
        off: () => void;
    };
    onError: (fn: (param: ApolloError, context: OnErrorContext) => void) => {
        off: () => void;
    };
}
/**
 * Use a subscription that does not require variables or options.
 * */
export declare function useSubscription<TResult = any>(document: DocumentParameter<TResult, undefined>): UseSubscriptionReturn<TResult, undefined>;
/**
 * Use a subscription that requires options but not variables.
 */
export declare function useSubscription<TResult = any>(document: DocumentParameter<TResult, undefined>, variables: undefined | null, options: OptionsParameter<TResult, null>): UseSubscriptionReturn<TResult, null>;
/**
 * Use a subscription that requires variables.
 */
export declare function useSubscription<TResult = any, TVariables extends OperationVariables = OperationVariables>(document: DocumentParameter<TResult, TVariables>, variables: VariablesParameter<TVariables>): UseSubscriptionReturn<TResult, TVariables>;
/**
 * Use a subscription that has optional variables.
 */
export declare function useSubscription<TResult = any, TVariables extends OperationVariables = OperationVariables>(document: DocumentParameter<TResult, TVariables>): UseSubscriptionReturn<TResult, TVariables>;
/**
 * Use a subscription that requires variables and options.
 */
export declare function useSubscription<TResult = any, TVariables extends OperationVariables = OperationVariables>(document: DocumentParameter<TResult, TVariables>, variables: VariablesParameter<TVariables>, options: OptionsParameter<TResult, TVariables>): UseSubscriptionReturn<TResult, TVariables>;
export {};
