summaryrefslogtreecommitdiff
path: root/packages/backend/src/misc/cache.ts
diff options
context:
space:
mode:
authorHazelnoot <acomputerdog@gmail.com>2025-06-06 12:17:04 -0400
committerHazelnoot <acomputerdog@gmail.com>2025-06-09 11:02:36 -0400
commit2e486f02ffb83192fd46fd231fb3604e1b982416 (patch)
treefe351c8793f32e06c55e25c6f957e5decd83a9c8 /packages/backend/src/misc/cache.ts
parentfix reversed isBlocking / isBlocked in UserEntityService.getRelation (diff)
downloadsharkey-2e486f02ffb83192fd46fd231fb3604e1b982416.tar.gz
sharkey-2e486f02ffb83192fd46fd231fb3604e1b982416.tar.bz2
sharkey-2e486f02ffb83192fd46fd231fb3604e1b982416.zip
implement no-op caches for testing
Diffstat (limited to 'packages/backend/src/misc/cache.ts')
-rw-r--r--packages/backend/src/misc/cache.ts41
1 files changed, 29 insertions, 12 deletions
diff --git a/packages/backend/src/misc/cache.ts b/packages/backend/src/misc/cache.ts
index 3145550a44..0a1cf6adb4 100644
--- a/packages/backend/src/misc/cache.ts
+++ b/packages/backend/src/misc/cache.ts
@@ -11,9 +11,9 @@ import { InternalEventTypes } from '@/core/GlobalEventService.js';
export class RedisKVCache<T> {
private readonly lifetime: number;
private readonly memoryCache: MemoryKVCache<T>;
- private readonly fetcher: (key: string) => Promise<T>;
- private readonly toRedisConverter: (value: T) => string;
- private readonly fromRedisConverter: (value: string) => T | undefined;
+ public readonly fetcher: (key: string) => Promise<T>;
+ public readonly toRedisConverter: (value: T) => string;
+ public readonly fromRedisConverter: (value: string) => T | undefined;
constructor(
private redisClient: Redis.Redis,
@@ -102,6 +102,11 @@ export class RedisKVCache<T> {
}
@bindThis
+ public clear() {
+ this.memoryCache.clear();
+ }
+
+ @bindThis
public gc() {
this.memoryCache.gc();
}
@@ -125,16 +130,17 @@ export class RedisSingleCache<T> {
opts: {
lifetime: number;
memoryCacheLifetime: number;
- fetcher: RedisSingleCache<T>['fetcher'];
- toRedisConverter: RedisSingleCache<T>['toRedisConverter'];
- fromRedisConverter: RedisSingleCache<T>['fromRedisConverter'];
+ fetcher?: RedisSingleCache<T>['fetcher'];
+ toRedisConverter?: RedisSingleCache<T>['toRedisConverter'];
+ fromRedisConverter?: RedisSingleCache<T>['fromRedisConverter'];
},
) {
this.lifetime = opts.lifetime;
this.memoryCache = new MemorySingleCache(opts.memoryCacheLifetime);
- this.fetcher = opts.fetcher;
- this.toRedisConverter = opts.toRedisConverter;
- this.fromRedisConverter = opts.fromRedisConverter;
+
+ this.fetcher = opts.fetcher ?? (() => { throw new Error('fetch not supported - use get/set directly'); });
+ this.toRedisConverter = opts.toRedisConverter ?? ((value) => JSON.stringify(value));
+ this.fromRedisConverter = opts.fromRedisConverter ?? ((value) => JSON.parse(value));
}
@bindThis
@@ -417,6 +423,8 @@ export class MemorySingleCache<T> {
}
}
+// TODO move to separate file
+
export interface QuantumKVOpts<T> {
/**
* Memory cache lifetime in milliseconds.
@@ -452,9 +460,9 @@ export interface QuantumKVOpts<T> {
export class QuantumKVCache<T> implements Iterable<[key: string, value: T]> {
private readonly memoryCache: MemoryKVCache<T>;
- private readonly fetcher: QuantumKVOpts<T>['fetcher'];
- private readonly onSet: QuantumKVOpts<T>['onSet'];
- private readonly onDelete: QuantumKVOpts<T>['onDelete'];
+ public readonly fetcher: QuantumKVOpts<T>['fetcher'];
+ public readonly onSet: QuantumKVOpts<T>['onSet'];
+ public readonly onDelete: QuantumKVOpts<T>['onDelete'];
/**
* @param internalEventService Service bus to synchronize events.
@@ -676,6 +684,15 @@ export class QuantumKVCache<T> implements Iterable<[key: string, value: T]> {
* Does not send any events or update other processes.
*/
@bindThis
+ public clear() {
+ this.memoryCache.clear();
+ }
+
+ /**
+ * Removes expired cache entries from the local view.
+ * Does not send any events or update other processes.
+ */
+ @bindThis
public gc() {
this.memoryCache.gc();
}