diff --git a/src/cache/adapters/limited.ts b/src/cache/adapters/limited.ts index 9b89a8e..6229cb2 100644 --- a/src/cache/adapters/limited.ts +++ b/src/cache/adapters/limited.ts @@ -63,31 +63,36 @@ export class LimitedMemoryAdapter implements Adapter { scan(query: string, keys?: false): any[]; scan(query: string, keys: true): string[]; scan(query: string, keys = false) { - const values: (string | unknown)[] = []; const sq = query.split('.'); - for (const iterator of [...this.storage.values()].flatMap(x => x.entries())) - for (const [key, value] of iterator) { - if (key.split('.').every((value, i) => (sq[i] === '*' ? !!value : sq[i] === value))) { - values.push(keys ? key : this.options.decode(value.value)); - } - } + const isWildcard = sq.map(segment => segment === '*'); - return values; + return [...this.storage.values()].flatMap(storageEntry => + Array.from(storageEntry.entries()) + .filter(([key]) => key.split('.').every((value, i) => isWildcard[i] || sq[i] === value)) + .map(([key, value]) => (keys ? key : this.options.decode(value.value))), + ); } bulkGet(keys: string[]) { - const iterator = [...this.storage.values()]; - return keys - .map(key => { - const data = iterator.find(x => x.has(key))?.get(key); - return data ? this.options.decode(data) : null; + const storageArray = Array.from(this.storage.values()); + const keySet = new Set(keys); + + return storageArray + .flatMap(storageEntry => { + const entries = Array.from(storageEntry.entries()); + return entries.filter(([key]) => keySet.has(key)).map(([, value]) => this.options.decode(value as T)); }) - .filter(x => x); + .filter(Boolean); } - get(keys: string) { - const data = [...this.storage.values()].find(x => x.has(keys))?.get(keys); - return data ? this.options.decode(data) : null; + get(key: string) { + for (const storageEntry of this.storage.values()) { + if (storageEntry.has(key)) { + const data = storageEntry.get(key); + return data ? this.options.decode(data) : null; + } + } + return null; } private __set(key: string, data: any) {