{"version":3,"sources":["../../src/redis/redisBase.ts"],"names":["createClient"],"mappings":"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","file":"redisBase.cjs","sourcesContent":["import { createClient, RedisClientType } from \"redis\"\r\n\r\ninterface RedisConfig {\r\n  url: string\r\n}\r\n\r\nclass RedisDatabase {\r\n  // eslint-disable-next-line no-use-before-define\r\n  private static instance: RedisDatabase\r\n  private client: RedisClientType | null = null\r\n  private isConnecting: boolean = false\r\n  private isConnected: boolean = false\r\n  private initializationAttempted: boolean = false\r\n  private redisUrl: string | null = null\r\n\r\n  private constructor() {}\r\n\r\n  public static getInstance(): RedisDatabase {\r\n    if (!RedisDatabase.instance) {\r\n      RedisDatabase.instance = new RedisDatabase()\r\n    }\r\n    return RedisDatabase.instance\r\n  }\r\n\r\n  public async initialize(config: RedisConfig): Promise<void> {\r\n    if (this.initializationAttempted) {\r\n      return\r\n    }\r\n\r\n    this.initializationAttempted = true\r\n    this.redisUrl = config.url\r\n\r\n    try {\r\n      await this.connect()\r\n      console.log(\"Redis initialized successfully at application startup\")\r\n    } catch (error) {\r\n      console.warn(\r\n        \"Redis initialization failed (non-critical), app will continue without Redis:\",\r\n        error\r\n      )\r\n    }\r\n  }\r\n\r\n  public getClient(): RedisClientType | null {\r\n    if (this.isConnected && this.client) {\r\n      return this.client\r\n    }\r\n    return null\r\n  }\r\n\r\n  private async connect(): Promise<RedisClientType> {\r\n    if (this.isConnecting || (this.isConnected && this.client)) {\r\n      return this.client!\r\n    }\r\n\r\n    if (!this.redisUrl) {\r\n      throw new Error(\r\n        \"Redis URL is required. Call initialize() with config first.\"\r\n      )\r\n    }\r\n\r\n    this.isConnecting = true\r\n\r\n    try {\r\n      this.client = createClient({\r\n        url: this.redisUrl,\r\n      })\r\n\r\n      this.client.on(\"error\", (err) => {\r\n        console.warn(\"Redis Client Error (non-critical):\", err)\r\n        this.isConnected = false\r\n        // Don't throw or crash - just log and continue\r\n      })\r\n\r\n      this.client.on(\"connect\", () => {\r\n        console.log(\"Redis Client Connected\")\r\n        this.isConnected = true\r\n      })\r\n\r\n      this.client.on(\"disconnect\", () => {\r\n        console.log(\"Redis Client Disconnected\")\r\n        this.isConnected = false\r\n      })\r\n\r\n      await this.client.connect()\r\n      this.isConnected = true\r\n      this.isConnecting = false\r\n\r\n      return this.client\r\n    } catch (error) {\r\n      console.warn(\"Failed to connect to Redis (non-critical):\", error)\r\n      this.isConnecting = false\r\n      this.isConnected = false\r\n      this.client = null\r\n      throw error\r\n    }\r\n  }\r\n\r\n  public async disconnect(): Promise<void> {\r\n    try {\r\n      if (this.client && this.isConnected) {\r\n        await this.client.quit()\r\n        this.isConnected = false\r\n        this.client = null\r\n      }\r\n    } catch (error) {\r\n      console.warn(\"Error disconnecting from Redis (non-critical):\", error)\r\n      // Force cleanup even if disconnect fails\r\n      this.isConnected = false\r\n      this.client = null\r\n    }\r\n  }\r\n\r\n  public isClientConnected(): boolean {\r\n    return this.isConnected && this.client !== null\r\n  }\r\n\r\n  public async safeExecute<T>(\r\n    operation: (client: RedisClientType) => Promise<T>\r\n  ): Promise<T | null> {\r\n    try {\r\n      const client = this.getClient()\r\n      if (!client) {\r\n        return null\r\n      }\r\n      return await operation(client)\r\n    } catch (error) {\r\n      console.warn(\"Redis operation failed (non-critical):\", error)\r\n      return null\r\n    }\r\n  }\r\n\r\n  public getStatus(): {\r\n    isConnected: boolean\r\n    isConnecting: boolean\r\n    initializationAttempted: boolean\r\n  } {\r\n    return {\r\n      isConnected: this.isConnected,\r\n      isConnecting: this.isConnecting,\r\n      initializationAttempted: this.initializationAttempted,\r\n    }\r\n  }\r\n}\r\n\r\nexport const redisBase = RedisDatabase.getInstance()\r\nexport type { RedisConfig }\r\n"]}