UNPKG

alepha

Version:

Alepha is a convention-driven TypeScript framework for building robust, end-to-end type-safe applications, from serverless APIs to full-stack React apps.

288 lines (287 loc) 10 kB
import * as _alepha_core0 from "alepha"; import { Descriptor, InstantiableClass, KIND } from "alepha"; import { DateTimeProvider, DurationLike, Timeout } from "alepha/datetime"; import * as _alepha_logger0 from "alepha/logger"; //#region src/providers/CacheProvider.d.ts /** * Cache provider interface. * * All methods are asynchronous and return promises. * Values are stored as Uint8Array. */ declare abstract class CacheProvider { /** * Get the value of a key. * * @param name Cache name, used to group keys. Should be Redis-like "some:group:name" format. * @param key The key of the value to get. * * @return The value of the key, or undefined if the key does not exist. */ abstract get(name: string, key: string): Promise<Uint8Array | undefined>; /** * Set the string value of a key. * * @param name Cache name, used to group keys. Should be Redis-like "some:group:name" format. * @param key The key of the value to set. * @param value The value to set. * @param ttl The time-to-live of the key, in milliseconds. * * @return The value of the key. */ abstract set(name: string, key: string, value: Uint8Array, ttl?: number): Promise<Uint8Array>; /** * Remove the specified keys. * * @param name Cache name, used to group keys. Should be Redis-like "some:group:name" format. * @param keys The keys to delete. */ abstract del(name: string, ...keys: string[]): Promise<void>; abstract has(name: string, key: string): Promise<boolean>; abstract keys(name: string, filter?: string): Promise<string[]>; /** * Remove all keys from all cache names. */ abstract clear(): Promise<void>; } //#endregion //#region src/descriptors/$cache.d.ts /** * Creates a cache descriptor for high-performance data caching with automatic cache management. * * This descriptor provides a powerful caching layer that can significantly improve application performance * by storing frequently accessed data in memory or external cache stores like Redis. It supports both * function result caching and manual cache operations with intelligent serialization and TTL management. * * **Key Features** * * - **Function Result Caching**: Automatically cache function results based on input parameters * - **Multiple Storage Backends**: Support for in-memory, Redis, and custom cache providers * - **Intelligent Serialization**: Automatic handling of JSON, strings, and binary data * - **TTL Management**: Configurable time-to-live with automatic expiration * - **Cache Invalidation**: Pattern-based cache invalidation with wildcard support * - **Environment Controls**: Enable/disable caching via environment variables * - **Type Safety**: Full TypeScript support with generic type parameters * * ## Cache Strategies * * ### 1. Function Result Caching (Memoization) * Automatically cache the results of expensive operations based on input parameters. * * ### 2. Manual Cache Operations * Direct cache operations for custom caching logic and data storage. * * ## Storage Backends * * - **Memory**: Fast in-memory cache (default for development) * - **Redis**: Distributed cache for production environments * - **Custom Providers**: Implement your own cache storage backend * * @example * **Basic function result caching:** * ```ts * import { $cache } from "alepha/cache"; * * class DataService { * // Cache expensive database queries * getUserData = $cache({ * name: "user-data", * ttl: [10, "minutes"], * handler: async (userId: string) => { * // Expensive database operation * return await database.users.findById(userId); * } * }); * * async getUser(id: string) { * // This will hit cache on subsequent calls with same ID * return await this.getUserData(id); * } * } * ``` * * @example * **API response caching with custom key generation:** * ```ts * class ApiService { * fetchUserPosts = $cache({ * name: "user-posts", * ttl: [5, "minutes"], * key: (userId: string, page: number) => `${userId}:page:${page}`, * handler: async (userId: string, page: number = 1) => { * const response = await fetch(`/api/users/${userId}/posts?page=${page}`); * return await response.json(); * } * }); * } * ``` * * @example * **Manual cache operations for custom logic:** * ```ts * class SessionService { * sessionCache = $cache<UserSession>({ * name: "user-sessions", * ttl: [1, "hour"], * provider: "memory" // Use memory cache for sessions * }); * * async storeSession(sessionId: string, session: UserSession) { * await this.sessionCache.set(sessionId, session); * } * * async getSession(sessionId: string): Promise<UserSession | undefined> { * return await this.sessionCache.get(sessionId); * } * * async invalidateUserSessions(userId: string) { * // Invalidate all sessions for a user using wildcards * await this.sessionCache.invalidate(`user:${userId}:*`); * } * } * ``` * * @example * **Redis-backed caching for production:** * ```ts * class ProductService { * productCache = $cache({ * name: "products", * ttl: [1, "hour"], * provider: RedisCacheProvider, // Use Redis for distributed caching * handler: async (productId: string) => { * return await this.database.products.findById(productId); * } * }); * * async invalidateProduct(productId: string) { * await this.productCache.invalidate(productId); * } * * async invalidateAllProducts() { * await this.productCache.invalidate("*"); * } * } * ``` * * @example * **Conditional caching with environment controls:** * ```ts * class ExpensiveService { * computation = $cache({ * name: "heavy-computation", * ttl: [1, "day"], * disabled: process.env.NODE_ENV === "development", // Disable in dev * handler: async (input: ComplexInput) => { * // Very expensive computation that should be cached in production * return await performHeavyComputation(input); * } * }); * } * ``` */ declare const $cache: { <TReturn = string, TParameter extends any[] = any[]>(options?: CacheDescriptorOptions<TReturn, TParameter>): CacheDescriptorFn<TReturn, TParameter>; [KIND]: typeof CacheDescriptor; }; interface CacheDescriptorOptions<TReturn = any, TParameter extends any[] = any[]> { /** * The cache name. This is useful for invalidating multiple caches at once. * * Store key as `cache:$name:$key`. * * @default Name of the key of the class. */ name?: string; /** * Function which returns cached data. */ handler?: (...args: TParameter) => TReturn; /** * The key generator for the cache. * If not provided, the arguments will be json.stringify(). */ key?: (...args: TParameter) => string; /** * The store provider for the cache. * If not provided, the default store provider will be used. */ provider?: InstantiableClass<CacheProvider> | "memory"; /** * The time-to-live for the cache in seconds. * Set 0 to skip expiration. * * @default 300 (5 minutes). */ ttl?: DurationLike; /** * If the cache is disabled. */ disabled?: boolean; } declare class CacheDescriptor<TReturn = any, TParameter extends any[] = any[]> extends Descriptor<CacheDescriptorOptions<TReturn, TParameter>> { protected readonly env: { CACHE_ENABLED: boolean; CACHE_DEFAULT_TTL: number; }; protected readonly dateTimeProvider: DateTimeProvider; protected readonly provider: CacheProvider; protected encoder: TextEncoder; protected decoder: TextDecoder; protected codes: { BINARY: number; JSON: number; STRING: number; }; get container(): string; run(...args: TParameter): Promise<TReturn>; key(...args: TParameter): string; invalidate(...keys: string[]): Promise<void>; set(key: string, value: TReturn, ttl?: DurationLike): Promise<void>; get(key: string): Promise<TReturn | undefined>; protected serialize<TReturn>(value: TReturn): Uint8Array; protected deserialize<TReturn>(uint8Array: Uint8Array): Promise<TReturn>; protected $provider(): CacheProvider; } interface CacheDescriptorFn<TReturn = any, TParameter extends any[] = any[]> extends CacheDescriptor<TReturn, TParameter> { /** * Run the cache descriptor with the provided arguments. */ (...args: TParameter): Promise<TReturn>; } //#endregion //#region src/providers/MemoryCacheProvider.d.ts type CacheName = string; type CacheKey = string; type CacheValue = { data?: Uint8Array; timeout?: Timeout; }; declare class MemoryCacheProvider implements CacheProvider { protected readonly dateTimeProvider: DateTimeProvider; protected readonly log: _alepha_logger0.Logger; protected store: Record<CacheName, Record<CacheKey, CacheValue>>; get(name: string, key: string): Promise<Uint8Array | undefined>; set(name: string, key: string, value: Uint8Array, ttl?: number): Promise<Uint8Array>; del(name: string, ...keys: string[]): Promise<void>; has(name: string, key: string): Promise<boolean>; keys(name: string, filter?: string): Promise<string[]>; clear(): Promise<void>; } //#endregion //#region src/index.d.ts /** * Provides high-performance caching capabilities for Alepha applications with configurable TTL and multiple storage backends. * * The cache module enables declarative caching through the `$cache` descriptor, allowing you to cache method results, * API responses, or computed values with automatic invalidation and type safety. It supports both in-memory and * persistent storage backends for different performance and durability requirements. * * @see {@link $cache} * @see {@link CacheProvider} * @module alepha.cache */ declare const AlephaCache: _alepha_core0.Service<_alepha_core0.Module<{}>>; //#endregion export { $cache, AlephaCache, CacheDescriptor, CacheDescriptorFn, CacheDescriptorOptions, CacheProvider, MemoryCacheProvider }; //# sourceMappingURL=index.d.ts.map