summaryrefslogtreecommitdiff
path: root/packages/backend/src/misc/cache.ts
diff options
context:
space:
mode:
authorsyuilo <Syuilotan@yahoo.co.jp>2022-03-26 19:09:57 +0900
committersyuilo <Syuilotan@yahoo.co.jp>2022-03-26 19:09:57 +0900
commit17589843da22e7a75f7ad6a3d49ec2bfbd0d4a06 (patch)
tree0cd019bfbe37d5d296143ecfbf25a621e0b8f407 /packages/backend/src/misc/cache.ts
parentrefactor (diff)
downloadsharkey-17589843da22e7a75f7ad6a3d49ec2bfbd0d4a06.tar.gz
sharkey-17589843da22e7a75f7ad6a3d49ec2bfbd0d4a06.tar.bz2
sharkey-17589843da22e7a75f7ad6a3d49ec2bfbd0d4a06.zip
perf(server): use cached user info in getUserFromApId
Diffstat (limited to 'packages/backend/src/misc/cache.ts')
-rw-r--r--packages/backend/src/misc/cache.ts27
1 files changed, 26 insertions, 1 deletions
diff --git a/packages/backend/src/misc/cache.ts b/packages/backend/src/misc/cache.ts
index 9ce5c3e8b0..01bbe98a85 100644
--- a/packages/backend/src/misc/cache.ts
+++ b/packages/backend/src/misc/cache.ts
@@ -48,7 +48,32 @@ export class Cache<T> {
// Cache MISS
const value = await fetcher();
- this.set(key, value);
+ return value;
+ }
+
+ /**
+ * キャッシュがあればそれを返し、無ければfetcherを呼び出して結果をキャッシュ&返します
+ * optional: キャッシュが存在してもvalidatorでfalseを返すとキャッシュ無効扱いにします
+ */
+ public async fetchMaybe(key: string | null, fetcher: () => Promise<T | undefined>, validator?: (cachedValue: T) => boolean): Promise<T | undefined> {
+ const cachedValue = this.get(key);
+ if (cachedValue !== undefined) {
+ if (validator) {
+ if (validator(cachedValue)) {
+ // Cache HIT
+ return cachedValue;
+ }
+ } else {
+ // Cache HIT
+ return cachedValue;
+ }
+ }
+
+ // Cache MISS
+ const value = await fetcher();
+ if (value !== undefined) {
+ this.set(key, value);
+ }
return value;
}
}