feat: Implement basic general folder support (#2051)

- Related: #1748
This commit is contained in:
Dermot Duffy
2025-05-21 19:59:21 -07:00
committed by GitHub
parent 2eb0d9e35e
commit c6a4c8aea2
350 changed files with 12837 additions and 4509 deletions
+70
View File
@@ -0,0 +1,70 @@
import { CacheInterface } from './types';
import { EqualityCache } from './equality-cache';
interface ExpiringValue<Value> {
value: Value;
expires?: Date;
}
export class ExpiringEqualityCache<Key, Value> implements CacheInterface<Key, Value> {
protected _data: EqualityCache<Key, ExpiringValue<Value>> = new EqualityCache();
public get(key: Key): Value | null {
const value = this._data.get(key);
const now = new Date();
return value && (!value.expires || now <= value.expires) ? value.value : null;
}
public has(key: Key): boolean {
return !!this.get(key);
}
public set(key: Key, value: Value, expiry?: Date): void {
this._data.set(key, {
value: value,
expires: expiry,
});
// Clean up old requests on set.
this._expireOldValues();
}
public delete(key: Key): boolean {
return this._data.delete(key);
}
public clear(): void {
this._data.clear();
}
public *entries(): MapIterator<[Key, Value]> {
const now = new Date();
for (const [key, value] of this._data.entries()) {
if (!value.expires || now <= value.expires) {
yield [key, value.value];
}
}
}
public getMatches(predicate: (value: Value) => boolean): Value[] {
const out: Value[] = [];
// eslint-disable-next-line @typescript-eslint/no-unused-vars
for (const [_key, value] of this.entries()) {
if (predicate(value)) {
out.push(value);
}
}
return out;
}
protected _expireOldValues(): void {
const now = new Date();
for (const [key, value] of this._data.entries()) {
if (value.expires && now > value.expires) {
this._data.delete(key);
}
}
}
}