import { SessionData } from 'express-session';
import { Store } from 'express-session';

declare interface NormalizedRedisClient {
    get(key: string): Promise<string | null>;
    set(key: string, value: string, ttl?: number): Promise<string | null>;
    expire(key: string, ttl: number): Promise<number | boolean>;
    scanIterator(match: string, count: number): AsyncIterable<string>;
    del(key: string[]): Promise<number>;
    mget(key: string[]): Promise<(string | null)[]>;
}

export declare class RedisStore extends Store {
    client: NormalizedRedisClient;
    prefix: string;
    scanCount: number;
    serializer: Serializer;
    ttl: number | {
        (sess: SessionData): number;
    };
    disableTTL: boolean;
    disableTouch: boolean;
    constructor(opts: RedisStoreOptions);
    private normalizeClient;
    get(sid: string, cb?: (_err?: unknown, _data?: any) => void): Promise<void>;
    set(sid: string, sess: SessionData, cb?: (_err?: unknown, _data?: any) => void): Promise<void>;
    touch(sid: string, sess: SessionData, cb?: (_err?: unknown, _data?: any) => void): Promise<void>;
    destroy(sid: string, cb?: (_err?: unknown, _data?: any) => void): Promise<void>;
    clear(cb?: (_err?: unknown, _data?: any) => void): Promise<void>;
    length(cb?: (_err?: unknown, _data?: any) => void): Promise<void>;
    ids(cb?: (_err?: unknown, _data?: any) => void): Promise<void>;
    all(cb?: (_err?: unknown, _data?: any) => void): Promise<void>;
    private _getTTL;
    private _getAllKeys;
}

declare interface RedisStoreOptions {
    client: any;
    prefix?: string;
    scanCount?: number;
    serializer?: Serializer;
    ttl?: number | {
        (sess: SessionData): number;
    };
    disableTTL?: boolean;
    disableTouch?: boolean;
}

declare interface Serializer {
    parse(s: string): SessionData | Promise<SessionData>;
    stringify(s: SessionData): string;
}

export { }
