-
Notifications
You must be signed in to change notification settings - Fork 59
/
Copy pathCustomCache.ts
65 lines (51 loc) · 2.17 KB
/
CustomCache.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
/*
* Copyright (C) Contributors to the Suwayomi project
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
export class CustomCache {
private keyToResponseMap = new Map<string, unknown>();
private keyToFetchTimestampMap = new Map<string, number>();
public readonly createKeyFn = (endpoint: string, data: unknown): string => `${endpoint}_${JSON.stringify(data)}`;
constructor(createKeyFn?: (endpoint: string, data: unknown) => string) {
this.createKeyFn = createKeyFn ?? this.createKeyFn;
}
public getKeyFor(key: string, data: unknown): string {
return this.createKeyFn(key, data);
}
public cacheResponse(endpoint: string, data: unknown, response: unknown) {
const createdKey = this.getKeyFor(endpoint, data);
this.keyToFetchTimestampMap.set(createdKey, Date.now());
this.keyToResponseMap.set(createdKey, response);
}
public getFetchTimestampFor(endpoint: string, data: unknown): number | undefined {
const key = this.getKeyFor(endpoint, data);
return this.keyToFetchTimestampMap.get(key);
}
public getResponseFor<Response = any>(endpoint: string, data: unknown, ttl?: number): Response | undefined {
const key = this.getKeyFor(endpoint, data);
const isTtlReached = ttl && Date.now() - (this.getFetchTimestampFor(endpoint, data) ?? 0) >= ttl;
if (isTtlReached) {
this.keyToResponseMap.delete(key);
}
return this.keyToResponseMap.get(key) as Response;
}
public getAllKeys(): string[] {
return [...this.keyToResponseMap.keys()];
}
public getMatchingKeys(regex: RegExp): string[] {
return this.getAllKeys().filter((key) => !!regex.exec(key));
}
public clearFor(...keys: string[]) {
keys.forEach((key) => {
this.keyToResponseMap.delete(key);
this.keyToFetchTimestampMap.delete(key);
});
}
public clear(): void {
this.keyToResponseMap.clear();
this.keyToFetchTimestampMap.clear();
}
}