import { Response, Request, NextFunction } from "express";
import { RedisClientType } from "redis";
import { GraphQLSchema } from "graphql";
import type { ConstructorOptions, IdCacheType, CostParamsType, MutationMapType, QueryMapType, FieldsMapType, RequestType } from "./types/types";
import type { BuildFromCacheFunction, GenerateCacheIDFunction } from "./types/readCacheTypes";
import type { WriteToCacheFunction, UpdateIdCacheFunction } from "./types/writeCacheTypes";
import type { NormalizeForCacheFunction } from "./cacheOperations/normalizeCache";
import type { UpdateCacheByMutationFunction } from "./types/updateCacheTypes";
import type { ClearCacheFunction, DeleteCacheByIdFunction, ClearAllCachesFunction } from "./types/invalidateCacheTypes";
import type { BuildCacheFromResponseFunction, BuildCacheFromMergedResponseFunction, HandleQueryCachingFunction } from "./types/buildCacheTypes";
/**
 * Creates a QuellCache instance that provides middleware for caching between the graphQL endpoint and
 * front-end requests, connects to redis cloud store via user-specified parameters.
 *    - If there is no cache expiration provided by the user, cacheExpiration defaults to 14 days in seconds.
 *    - If there are no cost parameters provided by the user, costParameters is given the default values.
 *    - If redisPort, redisHost, and redisPassword are omitted, will use local Redis instance.
 *     See https://redis.io/docs/getting-started/installation/ for instructions on installing Redis and starting a Redis server.
 *  @param {ConstructorOptions} options - The options to use for the cache.
 *  @param {GraphQLSchema} options.schema - GraphQL defined schema that is used to facilitate caching by providing valid queries,
 *  mutations, and fields.
 *  @param {number} [options.cacheExpiration=1209600] - Time in seconds for redis values to be evicted from the cache. Defaults to 14 days.
 *  @param {CostParamsType} [options.costParameters=defaultCostParams] - The cost parameters to use for caching. Defaults to:
 *    - maxCost: 5000 (maximum cost allowed before a request is rejected)
 *    - mutationCost: 5 (cost of a mutation)
 *    - objectCost: 2 (cost of retrieving an object)
 *    - scalarCost: 1 (cost of retrieving a scalar)
 *    - depthCostFactor: 1.5 (multiplicative cost of each depth level)
 *    - maxDepth: 10 (depth limit parameter)
 *    - ipRate: 3 (requests allowed per second)
 *  @param {number} options.redisPort - (optional) The Redis port to connect to.
 *  @param {string} options.redisHost - (optional) The Redis host URI to connect to.
 *  @param {string} options.redisPassword - (optional) The Redis password to the host URI.
 *  @example // Omit redisPort, redisHost, and redisPassword to use a local Redis instance.
 *  const quellCache = new QuellCache({
 *    schema: schema,
 *    cacheExpiration: 3600, // 1 hour in seconds
 *    });
 */
export declare class QuellCache {
    idCache: IdCacheType;
    schema: GraphQLSchema;
    costParameters: CostParamsType;
    queryMap: QueryMapType;
    mutationMap: MutationMapType;
    fieldsMap: FieldsMapType;
    cacheExpiration: number;
    redisReadBatchSize: number;
    redisCache: RedisClientType;
    costLimit: (req: Request, res: Response, next: NextFunction) => void;
    depthLimit: (req: Request, res: Response, next: NextFunction) => void;
    rateLimiter: (req: Request, res: Response, next: NextFunction) => Promise<void>;
    buildFromCache: BuildFromCacheFunction;
    generateCacheID: GenerateCacheIDFunction;
    writeToCache: WriteToCacheFunction;
    normalizeForCache: NormalizeForCacheFunction;
    updateIdCache: UpdateIdCacheFunction;
    updateCacheByMutation: UpdateCacheByMutationFunction;
    clearCache: ClearCacheFunction;
    deleteCacheById: DeleteCacheByIdFunction;
    clearAllCaches: ClearAllCachesFunction;
    buildCacheFromResponse: BuildCacheFromResponseFunction;
    buildCacheFromMergedResponse: BuildCacheFromMergedResponseFunction;
    handleQueryCaching: HandleQueryCachingFunction;
    constructor({ schema, cacheExpiration, // Default expiry time is 14 days in seconds
    costParameters, redisPort, redisHost, redisPassword, }: ConstructorOptions);
    /**
     * The class's controller method. It:
     *    - reads the query string from the request object,
     *    - tries to construct a response from cache,
     *    - reformulates a query for any data not in cache,
     *    - passes the reformulated query to the graphql library to resolve,
     *    - joins the cached and uncached responses,
     *    - decomposes and caches the joined query, and
     *    - attaches the joined response to the response object before passing control to the next middleware.
     *  @param {Request} req - Express request object, including request body with GraphQL query string.
     *  @param {Response} res - Express response object, will carry query response to next middleware.
     *  @param {NextFunction} next - Express next middleware function, invoked when QuellCache completes its work.
     */
    query(req: RequestType, res: Response, next: NextFunction): Promise<void>;
}
//# sourceMappingURL=QuellCache.d.ts.map