From a5c99abcba839233bdf87da7f391efbca1a5f69e Mon Sep 17 00:00:00 2001 From: Denys Sedchenko Date: Sun, 6 Oct 2024 08:57:39 -0400 Subject: [PATCH] fix: fix cache invalidation (#437) --- web/src/services/storage/kv.ts | 11 +++++++++-- web/src/workers/language/language.worker.ts | 6 +++++- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/web/src/services/storage/kv.ts b/web/src/services/storage/kv.ts index cd7df912..689c9ee9 100644 --- a/web/src/services/storage/kv.ts +++ b/web/src/services/storage/kv.ts @@ -1,17 +1,24 @@ import { isAfter } from 'date-fns' import type { DatabaseStorage } from './db' -import type { CacheStorage } from './types' +import type { CacheEntry, CacheStorage } from './types' + +type RecordValidator = (entry: CacheEntry) => boolean export class KeyValueStore implements CacheStorage { constructor(private readonly db: DatabaseStorage) {} - async getItem(key: string): Promise { + async getItem(key: string, validate?: RecordValidator): Promise { const entry = await this.db.keyValue.get(key) if (entry?.expireAt && isAfter(new Date(), entry.expireAt)) { void this.deleteItem(key) return undefined } + if (entry && validate && !validate(entry)) { + void this.deleteItem(key) + return undefined + } + return entry?.value as T | undefined } diff --git a/web/src/workers/language/language.worker.ts b/web/src/workers/language/language.worker.ts index 3ed5d4d3..c3bb5442 100644 --- a/web/src/workers/language/language.worker.ts +++ b/web/src/workers/language/language.worker.ts @@ -158,7 +158,11 @@ export class WorkerHandler { } // TODO: add invalidation by Go version - const version = await this.keyValue.getItem(completionVersionKey) + const version = await this.keyValue.getItem(completionVersionKey, (entry) => { + // v2.2.0 didn't write TTL by mistake + return typeof entry.expireAt !== 'undefined' + }) + if (!version) { await this.populateCache() return true