// SPDX-License-Identifier: AGPL-3.0-or-later interface CacheMSetEntry { key: string; value: T; ttlSeconds?: number; } export abstract class ICacheService { abstract get(key: string): Promise; abstract set(key: string, value: T, ttlSeconds?: number): Promise; abstract delete(key: string): Promise; abstract getAndDelete(key: string): Promise; abstract exists(key: string): Promise; abstract expire(key: string, ttlSeconds: number): Promise; abstract ttl(key: string): Promise; abstract mget(keys: Array): Promise>; abstract mset(entries: Array>): Promise; abstract deletePattern(pattern: string): Promise; abstract acquireLock(key: string, ttlSeconds: number): Promise; abstract releaseLock(key: string, token: string): Promise; abstract extendLock(key: string, token: string, ttlSeconds: number): Promise; abstract getAndRenewTtl(key: string, newTtlSeconds: number): Promise; abstract publish(channel: string, message: string): Promise; abstract sadd(key: string, member: string, ttlSeconds?: number): Promise; abstract srem(key: string, member: string): Promise; abstract smembers(key: string): Promise>; abstract sismember(key: string, member: string): Promise; async getOrSet(key: string, valueFactory: () => Promise, ttlSeconds?: number): Promise { const existingValue = await this.get(key); if (existingValue !== null) { return existingValue; } const newValue = await valueFactory(); await this.set(key, newValue, ttlSeconds); return newValue; } }