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