import { Cluster, Redis, RedisOptions } from 'ioredis';
import { PubSubEngine } from 'graphql-subscriptions';
import { PubSubAsyncIterator } from './pubsub-async-iterator';
type RedisClient = Redis | Cluster;
type OnMessage<T> = (message: T) => void;
type DeserializerContext = {
    channel: string;
    pattern?: string;
};
export interface PubSubRedisOptions {
    connection?: RedisOptions | string;
    triggerTransform?: TriggerTransform;
    connectionListener?: (err: Error) => void;
    publisher?: RedisClient;
    subscriber?: RedisClient;
    reviver?: Reviver;
    serializer?: Serializer;
    deserializer?: Deserializer;
    messageEventName?: string;
    pmessageEventName?: string;
}
export declare class RedisPubSub implements PubSubEngine {
    constructor(options?: PubSubRedisOptions);
    publish<T>(trigger: string, payload: T): Promise<void>;
    subscribe<T = any>(trigger: string, onMessage: OnMessage<T>, options?: unknown): Promise<number>;
    unsubscribe(subId: number): void;
    asyncIterator<T>(triggers: string | string[], options?: unknown): PubSubAsyncIterator<T>;
    asyncIterableIterator<T>(triggers: string | string[], options?: unknown): any;
    getSubscriber(): RedisClient;
    getPublisher(): RedisClient;
    close(): Promise<'OK'[]>;
    private readonly serializer?;
    private readonly deserializer?;
    private readonly triggerTransform;
    private readonly redisSubscriber;
    private readonly redisPublisher;
    private readonly reviver;
    private readonly subscriptionMap;
    private readonly subsRefsMap;
    private readonly subsPendingRefsMap;
    private currentSubscriptionId;
    private onMessage;
}
export type Path = Array<string | number>;
export type Trigger = string | Path;
export type TriggerTransform = (trigger: Trigger, channelOptions?: unknown) => string;
export type Reviver = (key: any, value: any) => any;
export type Serializer = (source: any) => string;
export type Deserializer = (source: string | Buffer, context: DeserializerContext) => any;
export {};
