import { RedisClientType, createClient } from 'redis'; import { StorageInterface } from "./StorageInterface"; let client: RedisClientType; /** * Implementace úložiště využívající Redis server. */ export default class RedisStorage implements StorageInterface { constructor() { const HOST = process.env.REDIS_HOST ?? 'localhost'; const PORT = process.env.REDIS_PORT ?? 6379; client = createClient({ url: `redis://${HOST}:${PORT}` }); } async initialize() { await client.connect(); } async hasData(key: string) { const data = await client.json.get(key); return (!!data); } async getData(key: string) { const data = await client.json.get(key, { path: '.' }); return data as Type; } async setData(key: string, data: Type) { await client.json.set(key, '.', data as any); await client.json.get(key); } async listKeys(contains?: string): Promise { // SCAN je bezpečnější než KEYS na produkci (neblokuje server) const match = contains ? `*${contains}*` : '*'; const keys: string[] = []; for await (const key of client.scanIterator({ MATCH: match, COUNT: 100 })) { // node-redis v4 vrací buď string, nebo (novější verze) pole stringů if (Array.isArray(key)) keys.push(...key); else keys.push(key); } return keys; } }