Skip to content

Commit 4633e16

Browse files
committed
fix(cache): store and return cloned response from cache
1 parent ce2e367 commit 4633e16

File tree

1 file changed

+15
-3
lines changed

1 file changed

+15
-3
lines changed

src/services/common/base-client.ts

+15-3
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,18 @@ export type IApi<Parameter extends RecursiveRecord = RecursiveRecord, Response =
137137
const isApiTemplate = <T extends RecursiveRecord = RecursiveRecord>(template: ClientEndpoint<T> | IApi<T>): template is ClientEndpoint<T> =>
138138
template instanceof ClientEndpoint;
139139

140+
/**
141+
* Clones a response object
142+
* @param response - The response to clone
143+
*/
144+
const cloneResponse = <T>(response: TypedResponse<T>): TypedResponse<T> => {
145+
const clone: Record<keyof TypedResponse<T>, unknown> = response.clone();
146+
Object.entries(response).forEach(([key, value]) => {
147+
if (typeof value !== 'function') clone[key as keyof TypedResponse<T>] = value;
148+
});
149+
return clone as TypedResponse<T>;
150+
};
151+
140152
/**
141153
* Represents a client with common functionality.
142154
*
@@ -244,16 +256,16 @@ export abstract class BaseClient<
244256
if (cached) {
245257
const templateRetention = typeof template.opts?.cache === 'number' ? template.opts.cache : undefined;
246258
const retention = cacheOptions?.retention ?? templateRetention ?? this._cache.retention;
247-
if (!retention) return cached.value;
259+
if (!retention) return cloneResponse(cached.value);
248260
const expires = cached.cachedAt + retention;
249-
if (expires > Date.now()) return cached.value;
261+
if (expires > Date.now()) return cloneResponse(cached.value);
250262
}
251263
}
252264
try {
253265
const result = await fn(param, init);
254266
await this._cache.set(key, {
255267
cachedAt: Date.now(),
256-
value: result as ResponseType,
268+
value: cloneResponse(result) as ResponseType,
257269
});
258270
return result;
259271
} catch (error) {

0 commit comments

Comments
 (0)