diff options
| author | syuilo <Syuilotan@yahoo.co.jp> | 2022-03-26 19:09:57 +0900 |
|---|---|---|
| committer | syuilo <Syuilotan@yahoo.co.jp> | 2022-03-26 19:09:57 +0900 |
| commit | 17589843da22e7a75f7ad6a3d49ec2bfbd0d4a06 (patch) | |
| tree | 0cd019bfbe37d5d296143ecfbf25a621e0b8f407 /packages/backend/src/misc/cache.ts | |
| parent | refactor (diff) | |
| download | sharkey-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.ts | 27 |
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; } } |