114 lines
8.9 KiB
JavaScript
114 lines
8.9 KiB
JavaScript
import { get_cached_object, set_cached_object, rm_cached_object } from "@polymech/cache";
|
|
import { Redis } from 'ioredis';
|
|
export const DEFAULT_CACHE_CONFIG = {
|
|
enabled: true,
|
|
provider: 'default',
|
|
namespace: 'default-cache',
|
|
expiration: 7 * 24 * 60 * 60 // 7 days in seconds
|
|
};
|
|
// --- Default Cache Provider (using @polymech/cache) ---
|
|
class DefaultCacheProvider {
|
|
async get(key, namespace) {
|
|
try {
|
|
return await get_cached_object({ ca_options: key }, namespace);
|
|
}
|
|
catch (error) {
|
|
console.error(`DefaultCache: Error getting cache for key ${JSON.stringify(key)} in namespace ${namespace}:`, error);
|
|
return null;
|
|
}
|
|
}
|
|
async set(key, namespace, value, options) {
|
|
try {
|
|
await set_cached_object({ ca_options: key }, namespace, value, options);
|
|
}
|
|
catch (error) {
|
|
console.error(`DefaultCache: Error setting cache for key ${JSON.stringify(key)} in namespace ${namespace}:`, error);
|
|
}
|
|
}
|
|
async delete(key, namespace) {
|
|
try {
|
|
await rm_cached_object({ ca_options: key }, namespace);
|
|
}
|
|
catch (error) {
|
|
console.error(`DefaultCache: Error deleting cache for key ${JSON.stringify(key)} in namespace ${namespace}:`, error);
|
|
}
|
|
}
|
|
}
|
|
// --- Redis Cache Provider ---
|
|
class RedisCacheProvider {
|
|
redis;
|
|
constructor(redisUrl) {
|
|
// Default to local instance if no URL is provided
|
|
this.redis = new Redis(redisUrl || 'redis://localhost:6379');
|
|
this.redis.on('error', (err) => console.error('Redis Client Error', err));
|
|
}
|
|
generateKey(key, namespace) {
|
|
// Simple serialization; consider a more robust hashing function for complex keys
|
|
return `${namespace}:${JSON.stringify(key)}`;
|
|
}
|
|
async get(key, namespace) {
|
|
const redisKey = this.generateKey(key, namespace);
|
|
try {
|
|
const data = await this.redis.get(redisKey);
|
|
return data ? JSON.parse(data) : null;
|
|
}
|
|
catch (error) {
|
|
console.error(`RedisCache: Error getting cache for key ${redisKey}:`, error);
|
|
return null;
|
|
}
|
|
}
|
|
async set(key, namespace, value, options) {
|
|
const redisKey = this.generateKey(key, namespace);
|
|
try {
|
|
const stringValue = JSON.stringify(value);
|
|
if (options?.expiration) {
|
|
await this.redis.set(redisKey, stringValue, 'EX', options.expiration);
|
|
}
|
|
else {
|
|
await this.redis.set(redisKey, stringValue);
|
|
}
|
|
}
|
|
catch (error) {
|
|
console.error(`RedisCache: Error setting cache for key ${redisKey}:`, error);
|
|
}
|
|
}
|
|
async delete(key, namespace) {
|
|
const redisKey = this.generateKey(key, namespace);
|
|
try {
|
|
await this.redis.del(redisKey);
|
|
}
|
|
catch (error) {
|
|
console.error(`RedisCache: Error deleting cache for key ${redisKey}:`, error);
|
|
}
|
|
}
|
|
async disconnect() {
|
|
await this.redis.quit();
|
|
}
|
|
}
|
|
// --- Factory Function ---
|
|
let defaultCacheProviderInstance = null;
|
|
let redisCacheProviderInstance = null;
|
|
export function createCacheProvider(config) {
|
|
const mergedConfig = { ...DEFAULT_CACHE_CONFIG, ...config };
|
|
if (!mergedConfig.enabled) {
|
|
// Return a dummy provider if caching is disabled
|
|
return {
|
|
get: async () => null,
|
|
set: async () => { },
|
|
delete: async () => { },
|
|
};
|
|
}
|
|
if (mergedConfig.provider === 'redis') {
|
|
if (!redisCacheProviderInstance) {
|
|
// Pass redisUrl if provided in config
|
|
redisCacheProviderInstance = new RedisCacheProvider(config?.redisUrl);
|
|
}
|
|
return redisCacheProviderInstance;
|
|
}
|
|
// Default provider
|
|
if (!defaultCacheProviderInstance) {
|
|
defaultCacheProviderInstance = new DefaultCacheProvider();
|
|
}
|
|
return defaultCacheProviderInstance;
|
|
}
|
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaXRlcmF0b3ItY2FjaGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaXRlcmF0b3ItY2FjaGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGlCQUFpQixFQUFFLGlCQUFpQixFQUFFLGdCQUFnQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDekYsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLFNBQVMsQ0FBQztBQWdCaEMsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQTRDO0lBQ3pFLE9BQU8sRUFBRSxJQUFJO0lBQ2IsUUFBUSxFQUFFLFNBQVM7SUFDbkIsU0FBUyxFQUFFLGVBQWU7SUFDMUIsVUFBVSxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxvQkFBb0I7Q0FDcEQsQ0FBQztBQUVGLHlEQUF5RDtBQUV6RCxNQUFNLG9CQUFvQjtJQUN0QixLQUFLLENBQUMsR0FBRyxDQUFDLEdBQVcsRUFBRSxTQUFpQjtRQUNwQyxJQUFJLENBQUM7WUFDRCxPQUFPLE1BQU0saUJBQWlCLENBQUMsRUFBRSxVQUFVLEVBQUUsR0FBRyxFQUFFLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDbkUsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDYixPQUFPLENBQUMsS0FBSyxDQUFDLDZDQUE2QyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsU0FBUyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDcEgsT0FBTyxJQUFJLENBQUM7UUFDaEIsQ0FBQztJQUNMLENBQUM7SUFFRCxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQVcsRUFBRSxTQUFpQixFQUFFLEtBQVUsRUFBRSxPQUFpQztRQUNuRixJQUFJLENBQUM7WUFDRCxNQUFNLGlCQUFpQixDQUFDLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7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
|