summaryrefslogtreecommitdiff
path: root/packages/frontend/src/utility/cache.ts
diff options
context:
space:
mode:
authorsyuilo <4439005+syuilo@users.noreply.github.com>2025-03-09 14:28:01 +0900
committersyuilo <4439005+syuilo@users.noreply.github.com>2025-03-09 14:28:01 +0900
commitbe7e3b9a0cb81b78a744993fef2fa2fd2833fa9c (patch)
treec82e18ce93ec0a24c57d7e36eb54a09266b3a25b /packages/frontend/src/utility/cache.ts
parentenhnace(frontend): 文字列比較のためのローマナイズを強化(... (diff)
downloadsharkey-be7e3b9a0cb81b78a744993fef2fa2fd2833fa9c.tar.gz
sharkey-be7e3b9a0cb81b78a744993fef2fa2fd2833fa9c.tar.bz2
sharkey-be7e3b9a0cb81b78a744993fef2fa2fd2833fa9c.zip
refactor(frontend): scripts -> utility
Diffstat (limited to 'packages/frontend/src/utility/cache.ts')
-rw-r--r--packages/frontend/src/utility/cache.ts53
1 files changed, 53 insertions, 0 deletions
diff --git a/packages/frontend/src/utility/cache.ts b/packages/frontend/src/utility/cache.ts
new file mode 100644
index 0000000000..0fbdf34d5d
--- /dev/null
+++ b/packages/frontend/src/utility/cache.ts
@@ -0,0 +1,53 @@
+/*
+ * SPDX-FileCopyrightText: syuilo and misskey-project
+ * SPDX-License-Identifier: AGPL-3.0-only
+ */
+
+import { ref } from 'vue';
+
+export class Cache<T> {
+ private cachedAt: number | null = null;
+ public value = ref<T | undefined>();
+ private lifetime: number;
+ private fetcher: () => Promise<T>;
+
+ constructor(lifetime: Cache<never>['lifetime'], fetcher: () => Promise<T>) {
+ this.lifetime = lifetime;
+ this.fetcher = fetcher;
+ }
+
+ public set(value: T): void {
+ this.cachedAt = Date.now();
+ this.value.value = value;
+ }
+
+ private get(): T | undefined {
+ if (this.cachedAt == null) return undefined;
+ if ((Date.now() - this.cachedAt) > this.lifetime) {
+ this.value.value = undefined;
+ this.cachedAt = null;
+ return undefined;
+ }
+ return this.value.value;
+ }
+
+ public delete() {
+ this.cachedAt = null;
+ }
+
+ /**
+ * キャッシュがあればそれを返し、無ければfetcherを呼び出して結果をキャッシュ&返します
+ */
+ public async fetch(): Promise<T> {
+ const cachedValue = this.get();
+ if (cachedValue !== undefined) {
+ // Cache HIT
+ return cachedValue;
+ }
+
+ // Cache MISS
+ const value = await this.fetcher();
+ this.set(value);
+ return value;
+ }
+}