From 87e9b31f4b2fb61178506b17b04dca094b4a559f Mon Sep 17 00:00:00 2001 From: Edoardo Cavazza Date: Tue, 15 Jul 2025 11:36:34 +0200 Subject: [PATCH] Add `child` method to `S3` cache adapter. --- .changeset/odd-candles-knock.md | 5 +++++ packages/utils/src/lib/server/cache/s3.ts | 23 ++++++++++++++++++++++- 2 files changed, 27 insertions(+), 1 deletion(-) create mode 100644 .changeset/odd-candles-knock.md diff --git a/.changeset/odd-candles-knock.md b/.changeset/odd-candles-knock.md new file mode 100644 index 0000000..db5b131 --- /dev/null +++ b/.changeset/odd-candles-knock.md @@ -0,0 +1,5 @@ +--- +"@chialab/sveltekit-utils": patch +--- + +Add `child` method to `S3` cache adapter. diff --git a/packages/utils/src/lib/server/cache/s3.ts b/packages/utils/src/lib/server/cache/s3.ts index 5bcbab5..bc8c125 100644 --- a/packages/utils/src/lib/server/cache/s3.ts +++ b/packages/utils/src/lib/server/cache/s3.ts @@ -18,6 +18,13 @@ type S3CacheOptions = { defaultJitter?: JitterMode | JitterFn; }; +function joinParts(...prefixes: string[]): string { + return prefixes + .filter((p) => p && p.length > 0) + .map((p) => p.replace(/\/+$/, '').replace(/^\/+/, '')) + .join('/'); +} + export class S3Cache extends BaseCache { readonly #options: S3CacheOptions; readonly #client: S3; @@ -39,7 +46,21 @@ export class S3Cache extends BaseCache { } #buildKey(key: string): string { - return `${this.#options.keyPrefix ?? ''}${key}`; + return joinParts(this.#options.keyPrefix ?? '', key); + } + + public child( + keyPrefix: string, + options?: Partial>, + ): S3Cache { + return new S3Cache( + { + ...this.#options, + ...options, + keyPrefix: joinParts(this.#options.keyPrefix ?? '', keyPrefix), + }, + this.#client, + ); } public async get(key: string): Promise {