"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
    return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.dragonfly = void 0;
const ioredis_1 = __importDefault(require("ioredis"));
const env_1 = require("../../config/env");
const logger_1 = require("../../config/logger");
class DragonflyClient {
    constructor() {
        this.ttl = parseInt(env_1.env.DRAGONFLY_TTL_SECONDS, 10);
        this.client = new ioredis_1.default(env_1.env.DRAGONFLY_URL, {
            // null = não limita tentativas por comando; a reconexão é gerenciada pelo retryStrategy
            maxRetriesPerRequest: null,
            enableReadyCheck: false,
            lazyConnect: true,
            // Falha imediata quando desconectado — evita fila infinita em memória
            enableOfflineQueue: false,
            // Reconexão exponencial: 200ms → 400ms → ... → 30s
            retryStrategy(times) {
                const delay = Math.min(200 * 2 ** times, 30000);
                return delay;
            },
        });
        this.client.on('connect', () => logger_1.logger.info('DragonflyDB conectado'));
        this.client.on('ready', () => logger_1.logger.info('DragonflyDB pronto'));
        this.client.on('error', (err) => logger_1.logger.error({ msg: 'DragonflyDB erro', code: err.code }));
        this.client.on('close', () => logger_1.logger.warn('DragonflyDB conexão fechada — reconectando...'));
    }
    /** true se o cliente está conectado e pronto */
    isAlive() {
        return this.client.status === 'ready';
    }
    async connect() {
        // Inicia conexão em background — não bloqueia o startup se Redis estiver fora
        // retryStrategy cuida da reconexão automática
        this.client.connect().catch(() => { });
    }
    async get(key) {
        try {
            return await this.client.get(key);
        }
        catch {
            return null;
        }
    }
    async getJson(key) {
        try {
            const raw = await this.client.get(key);
            if (!raw)
                return null;
            return JSON.parse(raw);
        }
        catch {
            return null;
        }
    }
    async set(key, value, ttlSeconds) {
        try {
            const ttl = ttlSeconds ?? this.ttl;
            if (ttl > 0) {
                await this.client.set(key, value, 'EX', ttl);
            }
            else {
                await this.client.set(key, value);
            }
        }
        catch { /* Redis indisponível — ignora silenciosamente */ }
    }
    async setJson(key, value, ttlSeconds) {
        try {
            const ttl = ttlSeconds ?? this.ttl;
            if (ttl > 0) {
                await this.client.set(key, JSON.stringify(value), 'EX', ttl);
            }
            else {
                await this.client.set(key, JSON.stringify(value));
            }
        }
        catch { /* Redis indisponível — ignora silenciosamente */ }
    }
    async psetex(key, ttlMs, value) {
        try {
            await this.client.psetex(key, ttlMs, value);
        }
        catch { }
    }
    async del(key) {
        try {
            await this.client.del(key);
        }
        catch { }
    }
    async exists(key) {
        try {
            const count = await this.client.exists(key);
            return count > 0;
        }
        catch {
            return false;
        }
    }
    /** Publica em um canal pub/sub (usado para broadcasting de QR/status) */
    async publish(channel, message) {
        try {
            await this.client.publish(channel, message);
        }
        catch { }
    }
    raw() {
        return this.client;
    }
}
exports.dragonfly = new DragonflyClient();
//# sourceMappingURL=dragonfly.js.map