import { Redis } from "ioredis"; export type StorageOptionsType = "redis" | "memory"; export type StorageOptions = { type: StorageOptionsType, options: StorageRedisOptions | StorageMemoryOptions, } type References = string | string[]; interface LoggerInput { msg: string; [key: string]: any; } interface Logger { debug: (input: LoggerInput) => void; warn: (input: LoggerInput) => void; error: (input: LoggerInput) => void; } export interface StorageRedisOptions { client: Redis; log?: Logger; invalidation?: { referencesTTL: number } | boolean; } export interface StorageMemoryOptions { size?: number; log?: Logger; invalidation?: boolean; } interface DataTransformer { serialize: (data: any) => any; deserialize: (data: any) => any; } type Events = { onDedupe?: (key: string) => void; onError?: (err: any) => void; onHit?: (key: string) => void; onMiss?: (key: string) => void; }; export type StorageInputRedis = { type: "redis"; options?: StorageRedisOptions; }; export type StorageInputMemory = { type: "memory"; options?: StorageMemoryOptions; }; export declare class StorageInterface { constructor(options: any); get(key: string): Promise; set(key: string, value: any, ttl: number, references?: References): Promise; remove(key: string): Promise; invalidate(references: References): Promise; clear(name: string): Promise; refresh(): Promise; } export declare function createCache( options?: { storage?: StorageInputRedis | StorageInputMemory; ttl?: number | ((result: unknown) => number); transformer?: DataTransformer; stale?: number | ((result: unknown) => number); } & Events, ): Cache; export declare class Cache { constructor( options: { ttl: number | ((result: unknown) => number); stale?: number | ((result: unknown) => number); storage: StorageInterface; } & Events ); define any, N extends string, S extends this>( name: N, opts: { storage?: StorageOptions; transformer?: DataTransformer; ttl?: number | ((result: Awaited>) => number); stale?: number | ((result: Awaited>) => number); serialize?: (...args: any[]) => any; references?: ( args: Parameters[0], key: string, result: Awaited> ) => References | Promise; } & Events, func?: T ): S & { [n in N]: T }; define any, N extends string, S extends this>( name: N, opts: T ): S & { [n in N]: T }; clear(): Promise; clear(name: string): Promise; clear(name: string, value: any): Promise; get(name: string, key: string): Promise; set( name: string, key: string, value: any, ttl: number, references?: References ): Promise; invalidate(name: string, references: References): Promise; invalidateAll( references: References, storage?: StorageOptionsType ): Promise; } export declare function createStorage(type: "redis", options: StorageRedisOptions): StorageInterface; export declare function createStorage(type: "memory", options: StorageMemoryOptions): StorageInterface; export declare function createStorage( type: StorageOptionsType, options: StorageRedisOptions | StorageMemoryOptions, ): StorageInterface;