96 lines
2.0 KiB
TypeScript
96 lines
2.0 KiB
TypeScript
/**
|
|
* Módulo de conexão com Redis
|
|
* Gerencia conexão e fornece helpers para cache e sessões
|
|
*/
|
|
|
|
import { createClient, type RedisClientType } from "redis";
|
|
|
|
let client: RedisClientType | null = null;
|
|
|
|
/**
|
|
* Valida variáveis de ambiente necessárias
|
|
*/
|
|
function validateEnvVars() {
|
|
if (!process.env.REDIS_DB) {
|
|
throw new Error(
|
|
"REDIS_DB não está definido. Configure a variável de ambiente REDIS_DB com a connection string do Redis.",
|
|
);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Obtém ou cria o cliente Redis
|
|
*/
|
|
export function getRedisClient(): RedisClientType {
|
|
if (!client) {
|
|
validateEnvVars();
|
|
|
|
const connectionString = process.env.REDIS_DB;
|
|
|
|
client = createClient({
|
|
url: connectionString,
|
|
});
|
|
|
|
// Event listeners para debug
|
|
client.on("error", (err) => {
|
|
console.error("❌ Erro no cliente Redis:", err);
|
|
});
|
|
|
|
client.on("connect", () => {
|
|
console.log("✅ Conectado ao Redis");
|
|
});
|
|
|
|
client.on("ready", () => {
|
|
console.log("✅ Redis está pronto para uso");
|
|
});
|
|
|
|
// Conectar
|
|
client.connect().catch((err) => {
|
|
console.error("❌ Erro ao conectar com Redis:", err);
|
|
});
|
|
}
|
|
|
|
return client;
|
|
}
|
|
|
|
/**
|
|
* Verifica se Redis está conectado
|
|
*/
|
|
export async function isRedisConnected(): Promise<boolean> {
|
|
try {
|
|
const redisClient = getRedisClient();
|
|
if (!redisClient.isOpen) {
|
|
await redisClient.connect();
|
|
}
|
|
await redisClient.ping();
|
|
return true;
|
|
} catch (error) {
|
|
console.error("❌ Redis não está conectado:", error);
|
|
return false;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Fecha conexão com Redis
|
|
*/
|
|
export async function closeRedis(): Promise<void> {
|
|
if (client?.isOpen) {
|
|
await client.quit();
|
|
client = null;
|
|
console.log("🔌 Conexão Redis fechada");
|
|
}
|
|
}
|
|
|
|
// Cleanup ao encerrar o processo
|
|
if (typeof process !== "undefined") {
|
|
process.on("SIGINT", async () => {
|
|
await closeRedis();
|
|
process.exit(0);
|
|
});
|
|
|
|
process.on("SIGTERM", async () => {
|
|
await closeRedis();
|
|
process.exit(0);
|
|
});
|
|
}
|