diff --git a/packages/nextjs-cache-handler/src/handlers/redis-strings.ts b/packages/nextjs-cache-handler/src/handlers/redis-strings.ts index 0662064..4a90322 100644 --- a/packages/nextjs-cache-handler/src/handlers/redis-strings.ts +++ b/packages/nextjs-cache-handler/src/handlers/redis-strings.ts @@ -193,7 +193,7 @@ export default function createHandler({ return null; } - const cacheValue = valueSerializer.deserialize(result); + const cacheValue = await valueSerializer.deserialize(result); if (!cacheValue) { return null; @@ -254,7 +254,7 @@ export default function createHandler({ parseBuffersToStrings({ ...cacheHandlerValue, value: valueForStorage }); } - const serializedValue = valueSerializer.serialize({ + const serializedValue = await valueSerializer.serialize({ ...cacheHandlerValue, value: valueForStorage, }); diff --git a/packages/nextjs-cache-handler/src/handlers/redis-strings.types.ts b/packages/nextjs-cache-handler/src/handlers/redis-strings.types.ts index 65e1106..9af95c1 100644 --- a/packages/nextjs-cache-handler/src/handlers/redis-strings.types.ts +++ b/packages/nextjs-cache-handler/src/handlers/redis-strings.types.ts @@ -5,10 +5,14 @@ import type { CacheHandlerValue } from "./cache-handler.types"; /** * Pluggable wire-format codec for Redis string values (JSON, compression, encryption, etc.). * Default behavior is JSON.stringify / JSON.parse (see `jsonCacheValueSerializer` export). + * + * Both methods may return a `Promise`, enabling non-blocking async codecs such as + * stream-based compression (`zlib.brotliCompress`) or encryption (`crypto.subtle`). + * Synchronous implementations continue to work unchanged — `await` on a plain value is a no-op. */ export type CacheValueSerializer = { - serialize(value: CacheHandlerValue): string; - deserialize(stored: string): CacheHandlerValue | null; + serialize(value: CacheHandlerValue): string | Promise; + deserialize(stored: string): CacheHandlerValue | null | Promise; }; export type RedisCompliantCachedRouteValue = { @@ -86,6 +90,10 @@ export type CreateRedisStringsHandlerOptions< * Optional codec for values stored in Redis (`SET`/`GET`). * Implement compression, encryption, or custom formats in your app; this package stays dependency-free. * + * Both `serialize` and `deserialize` may return a `Promise`, enabling non-blocking async codecs + * (e.g. `zlib.brotliCompress` / `zlib.brotliDecompress`) that avoid blocking the Node.js event loop. + * Synchronous implementations continue to work unchanged. + * * @default JSON.stringify / JSON.parse (same as previous releases) */ valueSerializer?: CacheValueSerializer;