mirror of
https://github.com/TriliumNext/Notes.git
synced 2025-07-27 18:12:29 +08:00
118 lines
3.3 KiB
TypeScript
118 lines
3.3 KiB
TypeScript
import log from '../../../log.js';
|
|
import type { ICacheManager, CachedNoteData, CachedQueryResults } from '../../interfaces/context_interfaces.js';
|
|
|
|
/**
|
|
* Manages caching for context services
|
|
* Provides a centralized caching system to avoid redundant operations
|
|
*/
|
|
export class CacheManager implements ICacheManager {
|
|
// Cache for recently used context to avoid repeated lookups
|
|
private noteDataCache = new Map<string, CachedNoteData<unknown>>();
|
|
|
|
// Cache for recently used queries
|
|
private queryCache = new Map<string, CachedQueryResults<unknown>>();
|
|
|
|
// Default cache expiry (5 minutes)
|
|
private defaultCacheExpiryMs = 5 * 60 * 1000;
|
|
|
|
constructor() {
|
|
this.setupCacheCleanup();
|
|
}
|
|
|
|
/**
|
|
* Set up periodic cache cleanup
|
|
*/
|
|
private setupCacheCleanup() {
|
|
setInterval(() => {
|
|
this.cleanupCache();
|
|
}, 60000); // Run cleanup every minute
|
|
}
|
|
|
|
/**
|
|
* Clean up expired cache entries
|
|
*/
|
|
cleanupCache() {
|
|
const now = Date.now();
|
|
|
|
// Clean note data cache
|
|
for (const [key, data] of this.noteDataCache.entries()) {
|
|
if (now - data.timestamp > this.defaultCacheExpiryMs) {
|
|
this.noteDataCache.delete(key);
|
|
}
|
|
}
|
|
|
|
// Clean query cache
|
|
for (const [key, data] of this.queryCache.entries()) {
|
|
if (now - data.timestamp > this.defaultCacheExpiryMs) {
|
|
this.queryCache.delete(key);
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Get cached note data
|
|
*/
|
|
getNoteData<T>(noteId: string, type: string): T | null {
|
|
const key = `${noteId}:${type}`;
|
|
const cached = this.noteDataCache.get(key);
|
|
|
|
if (cached && Date.now() - cached.timestamp < this.defaultCacheExpiryMs) {
|
|
log.info(`Cache hit for note data: ${key}`);
|
|
return cached.data as T;
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
/**
|
|
* Store note data in cache
|
|
*/
|
|
storeNoteData<T>(noteId: string, type: string, data: T): void {
|
|
const key = `${noteId}:${type}`;
|
|
this.noteDataCache.set(key, {
|
|
timestamp: Date.now(),
|
|
data
|
|
});
|
|
log.info(`Cached note data: ${key}`);
|
|
}
|
|
|
|
/**
|
|
* Get cached query results
|
|
*/
|
|
getQueryResults<T>(query: string, contextNoteId: string | null = null): T | null {
|
|
const key = JSON.stringify({ query, contextNoteId });
|
|
const cached = this.queryCache.get(key);
|
|
|
|
if (cached && Date.now() - cached.timestamp < this.defaultCacheExpiryMs) {
|
|
log.info(`Cache hit for query: ${query}`);
|
|
return cached.results as T;
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
/**
|
|
* Store query results in cache
|
|
*/
|
|
storeQueryResults<T>(query: string, results: T, contextNoteId: string | null = null): void {
|
|
const key = JSON.stringify({ query, contextNoteId });
|
|
this.queryCache.set(key, {
|
|
timestamp: Date.now(),
|
|
results
|
|
});
|
|
log.info(`Cached query results: ${query}`);
|
|
}
|
|
|
|
/**
|
|
* Clear all caches
|
|
*/
|
|
clearAllCaches(): void {
|
|
this.noteDataCache.clear();
|
|
this.queryCache.clear();
|
|
log.info('All context caches cleared');
|
|
}
|
|
}
|
|
|
|
// Export singleton instance
|
|
export default new CacheManager();
|