You've already forked node-redis
mirror of
https://github.com/redis/node-redis.git
synced 2025-08-04 15:02:09 +03:00
fix(client): cache subsequent clients (#2963)
* fix(client): cache subsequent clients we dont need to recreate a client if its config hasnt changed fixes #2954 * handle circular structures * make cache generic
This commit is contained in:
committed by
GitHub
parent
ebd03036d6
commit
6f961bd715
37
packages/client/lib/single-entry-cache.ts
Normal file
37
packages/client/lib/single-entry-cache.ts
Normal file
@@ -0,0 +1,37 @@
|
||||
export default class SingleEntryCache<K, V> {
|
||||
#cached?: V;
|
||||
#serializedKey?: string;
|
||||
|
||||
/**
|
||||
* Retrieves an instance from the cache based on the provided key object.
|
||||
*
|
||||
* @param keyObj - The key object to look up in the cache.
|
||||
* @returns The cached instance if found, undefined otherwise.
|
||||
*
|
||||
* @remarks
|
||||
* This method uses JSON.stringify for comparison, which may not work correctly
|
||||
* if the properties in the key object are rearranged or reordered.
|
||||
*/
|
||||
get(keyObj?: K): V | undefined {
|
||||
return JSON.stringify(keyObj, makeCircularReplacer()) === this.#serializedKey ? this.#cached : undefined;
|
||||
}
|
||||
|
||||
set(keyObj: K | undefined, obj: V) {
|
||||
this.#cached = obj;
|
||||
this.#serializedKey = JSON.stringify(keyObj, makeCircularReplacer());
|
||||
}
|
||||
}
|
||||
|
||||
function makeCircularReplacer() {
|
||||
const seen = new WeakSet();
|
||||
return function serialize(_: string, value: any) {
|
||||
if (value && typeof value === 'object') {
|
||||
if (seen.has(value)) {
|
||||
return 'circular';
|
||||
}
|
||||
seen.add(value);
|
||||
return value;
|
||||
}
|
||||
return value;
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user