{"version":3,"sources":["../src/redis/redisBase.ts","../src/redis/redisGenericClient.ts"],"names":["createClient"],"mappings":"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","file":"index.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","import { RedisClientType } from \"redis\"\r\nimport { redisBase } from \"./redisBase.js\"\r\n\r\n/**\r\n * Extract all possible cache key types from a cache key definition object\r\n * Recursively extracts string literals and function return types\r\n *\r\n * @example\r\n * ```typescript\r\n * const CACHE_KEYS = {\r\n *   users: {\r\n *     profile: (userId: number) => `user:${userId}:profile` as const,\r\n *   },\r\n * } as const;\r\n *\r\n * type CacheKey = ExtractCacheKeyType<typeof CACHE_KEYS>;\r\n * // Result: \"user:${number}:profile\"\r\n * ```\r\n */\r\nexport type ExtractCacheKeyType<T> = T extends string\r\n  ? T\r\n  : T extends (...args: any[]) => infer R\r\n  ? R extends string\r\n    ? R\r\n    : never\r\n  : T extends Record<string, any>\r\n  ? { [K in keyof T]: ExtractCacheKeyType<T[K]> }[keyof T]\r\n  : never\r\n\r\ninterface RedisGenericClientConfig {\r\n  prefix: string\r\n  isEnabled: boolean\r\n}\r\n\r\n/**\r\n * Generic Redis client with optional type-safe cache keys\r\n * @template TCacheKeys - Optional type for cache keys (defaults to string)\r\n */\r\nclass RedisGenericClient<TCacheKeys = string> {\r\n  private readonly keyPrefix: string\r\n  private readonly isEnabled: boolean\r\n\r\n  constructor(config: RedisGenericClientConfig) {\r\n    this.keyPrefix = config.prefix.endsWith(\":\")\r\n      ? config.prefix\r\n      : `${config.prefix}:`\r\n    this.isEnabled = config.isEnabled\r\n  }\r\n\r\n  private addPrefix(key: string): string {\r\n    if (key.startsWith(this.keyPrefix)) {\r\n      return key\r\n    }\r\n    return `${this.keyPrefix}${key}`\r\n  }\r\n\r\n  private removePrefix(key: string): string {\r\n    if (key.startsWith(this.keyPrefix)) {\r\n      return key.slice(this.keyPrefix.length)\r\n    }\r\n    return key\r\n  }\r\n\r\n  public isClientEnabled(): boolean {\r\n    return this.isEnabled\r\n  }\r\n\r\n  public isClientConnected(): boolean {\r\n    if (!this.isEnabled) {\r\n      return false\r\n    }\r\n    return redisBase.isClientConnected()\r\n  }\r\n\r\n  public getStatus() {\r\n    return {\r\n      ...redisBase.getStatus(),\r\n      isEnabled: this.isEnabled,\r\n      prefix: this.keyPrefix,\r\n    }\r\n  }\r\n\r\n  public async set(key: TCacheKeys, value: string): Promise<string | null> {\r\n    if (!this.isEnabled) {\r\n      return null\r\n    }\r\n\r\n    const prefixedKey = this.addPrefix(key as string)\r\n    return redisBase.safeExecute(async (client) => {\r\n      return await client.set(prefixedKey, value)\r\n    }) as Promise<string | null>\r\n  }\r\n\r\n  public async setObj<T>(key: TCacheKeys, value: T): Promise<string | null> {\r\n    if (!this.isEnabled) {\r\n      return null\r\n    }\r\n\r\n    try {\r\n      const serializedValue = JSON.stringify(value)\r\n      const prefixedKey = this.addPrefix(key as string)\r\n      return redisBase.safeExecute(async (client) => {\r\n        return await client.set(prefixedKey, serializedValue)\r\n      }) as Promise<string | null>\r\n    } catch (error) {\r\n      console.error(\"Error serializing object for Redis:\", error)\r\n      return null\r\n    }\r\n  }\r\n\r\n  public async setEx(\r\n    key: TCacheKeys,\r\n    seconds: number,\r\n    value: string\r\n  ): Promise<string | null> {\r\n    if (!this.isEnabled) {\r\n      return null\r\n    }\r\n\r\n    const prefixedKey = this.addPrefix(key as string)\r\n    return redisBase.safeExecute(async (client) => {\r\n      return await client.setEx(prefixedKey, seconds, value)\r\n    }) as Promise<string | null>\r\n  }\r\n\r\n  public async setObjEx<T>(\r\n    key: TCacheKeys,\r\n    seconds: number,\r\n    value: T\r\n  ): Promise<string | null> {\r\n    if (!this.isEnabled) {\r\n      return null\r\n    }\r\n\r\n    try {\r\n      const serializedValue = JSON.stringify(value)\r\n      const prefixedKey = this.addPrefix(key as string)\r\n      return redisBase.safeExecute(async (client) => {\r\n        return await client.setEx(prefixedKey, seconds, serializedValue)\r\n      }) as Promise<string | null>\r\n    } catch (error) {\r\n      console.error(\"Error serializing object for Redis setEx:\", error)\r\n      return null\r\n    }\r\n  }\r\n\r\n  public async get(key: TCacheKeys): Promise<string | null> {\r\n    if (!this.isEnabled) {\r\n      return null\r\n    }\r\n\r\n    const prefixedKey = this.addPrefix(key as string)\r\n    return redisBase.safeExecute(async (client) => {\r\n      return await client.get(prefixedKey)\r\n    }) as Promise<string | null>\r\n  }\r\n\r\n  public async getObj<T>(key: TCacheKeys): Promise<T | null> {\r\n    if (!this.isEnabled) {\r\n      return null\r\n    }\r\n\r\n    try {\r\n      const prefixedKey = this.addPrefix(key as string)\r\n      const serializedValue = (await redisBase.safeExecute(async (client) => {\r\n        return await client.get(prefixedKey)\r\n      })) as string | null\r\n\r\n      if (serializedValue === null) {\r\n        return null\r\n      }\r\n\r\n      return JSON.parse(serializedValue) as T\r\n    } catch (error) {\r\n      console.error(\"Error deserializing object from Redis:\", error)\r\n      return null\r\n    }\r\n  }\r\n\r\n  public async del(key: TCacheKeys): Promise<number | null> {\r\n    if (!this.isEnabled) {\r\n      return null\r\n    }\r\n\r\n    const prefixedKey = this.addPrefix(key as string)\r\n    return redisBase.safeExecute(async (client) => {\r\n      return await client.del(prefixedKey)\r\n    }) as Promise<number | null>\r\n  }\r\n\r\n  public async delMultiple(keys: TCacheKeys[]): Promise<number | null> {\r\n    if (!this.isEnabled) {\r\n      return null\r\n    }\r\n\r\n    const prefixedKeys = keys.map((key) => this.addPrefix(key as string))\r\n    return redisBase.safeExecute(async (client) => {\r\n      return await client.del(prefixedKeys)\r\n    }) as Promise<number | null>\r\n  }\r\n\r\n  /**\r\n   * Delete all keys matching a pattern (Production-safe using SCAN)\r\n   * @param pattern - Pattern to match (e.g., \"games:*\" to delete all keys starting with \"games:\")\r\n   * @param batchSize - Number of keys to scan per iteration (default: 100)\r\n   * @returns Number of keys deleted, or null if client is disabled\r\n   *\r\n   * @example\r\n   * ```typescript\r\n   * // Delete all game-related keys\r\n   * await cache.delByPattern(\"games:*\");\r\n   *\r\n   * // With type-safe patterns\r\n   * await cache.delByPattern(CACHE_KEYS.games._pattern);\r\n   * ```\r\n   */\r\n  public async delByPattern(\r\n    pattern: TCacheKeys | string,\r\n    batchSize: number = 100\r\n  ): Promise<number | null> {\r\n    if (!this.isEnabled) {\r\n      return null\r\n    }\r\n\r\n    const prefixedPattern = this.addPrefix(pattern as string)\r\n    return redisBase.safeExecute(async (client) => {\r\n      let totalDeleted = 0\r\n      const keysToDelete: string[] = []\r\n\r\n      // Use scanIterator for cleaner async iteration\r\n      for await (const key of client.scanIterator({\r\n        MATCH: prefixedPattern,\r\n        COUNT: batchSize,\r\n      })) {\r\n        // scanIterator returns string keys, not arrays\r\n        if (typeof key === \"string\") {\r\n          keysToDelete.push(key)\r\n        } else if (Array.isArray(key)) {\r\n          keysToDelete.push(...key)\r\n        }\r\n\r\n        // Delete in batches to avoid blocking Redis\r\n        if (keysToDelete.length >= batchSize) {\r\n          const deleted = await client.del(keysToDelete)\r\n          totalDeleted += deleted\r\n          keysToDelete.length = 0 // Clear array\r\n        }\r\n      }\r\n\r\n      // Delete remaining keys\r\n      if (keysToDelete.length > 0) {\r\n        const deleted = await client.del(keysToDelete)\r\n        totalDeleted += deleted\r\n      }\r\n\r\n      return totalDeleted\r\n    }) as Promise<number | null>\r\n  }\r\n\r\n  public async exists(key: TCacheKeys): Promise<number | null> {\r\n    if (!this.isEnabled) {\r\n      return null\r\n    }\r\n\r\n    const prefixedKey = this.addPrefix(key as string)\r\n    return redisBase.safeExecute(async (client) => {\r\n      return await client.exists(prefixedKey)\r\n    }) as Promise<number | null>\r\n  }\r\n\r\n  public async expire(\r\n    key: TCacheKeys,\r\n    seconds: number\r\n  ): Promise<number | null> {\r\n    if (!this.isEnabled) {\r\n      return null\r\n    }\r\n\r\n    const prefixedKey = this.addPrefix(key as string)\r\n    return redisBase.safeExecute(async (client) => {\r\n      return await client.expire(prefixedKey, seconds)\r\n    }) as Promise<number | null>\r\n  }\r\n\r\n  public async ttl(key: TCacheKeys): Promise<number | null> {\r\n    if (!this.isEnabled) {\r\n      return null\r\n    }\r\n\r\n    const prefixedKey = this.addPrefix(key as string)\r\n    return redisBase.safeExecute(async (client) => {\r\n      return await client.ttl(prefixedKey)\r\n    }) as Promise<number | null>\r\n  }\r\n\r\n  public async incr(key: TCacheKeys): Promise<number | null> {\r\n    if (!this.isEnabled) {\r\n      return null\r\n    }\r\n\r\n    const prefixedKey = this.addPrefix(key as string)\r\n    return redisBase.safeExecute(async (client) => {\r\n      return await client.incr(prefixedKey)\r\n    }) as Promise<number | null>\r\n  }\r\n\r\n  public async incrBy(\r\n    key: TCacheKeys,\r\n    increment: number\r\n  ): Promise<number | null> {\r\n    if (!this.isEnabled) {\r\n      return null\r\n    }\r\n\r\n    const prefixedKey = this.addPrefix(key as string)\r\n    return redisBase.safeExecute(async (client) => {\r\n      return await client.incrBy(prefixedKey, increment)\r\n    }) as Promise<number | null>\r\n  }\r\n\r\n  public async decr(key: TCacheKeys): Promise<number | null> {\r\n    if (!this.isEnabled) {\r\n      return null\r\n    }\r\n\r\n    const prefixedKey = this.addPrefix(key as string)\r\n    return redisBase.safeExecute(async (client) => {\r\n      return await client.decr(prefixedKey)\r\n    }) as Promise<number | null>\r\n  }\r\n\r\n  public async keys(pattern: string): Promise<string[] | null> {\r\n    if (!this.isEnabled) {\r\n      return null\r\n    }\r\n\r\n    const prefixedPattern = this.addPrefix(pattern)\r\n    const result = await redisBase.safeExecute(async (client) => {\r\n      return await client.keys(prefixedPattern)\r\n    })\r\n\r\n    // Remove prefix from returned keys for cleaner usage\r\n    if (result) {\r\n      return result.map((key) => this.removePrefix(key))\r\n    }\r\n    return result\r\n  }\r\n\r\n  public async hSet(\r\n    key: TCacheKeys,\r\n    field: string,\r\n    value: string\r\n  ): Promise<number | null> {\r\n    if (!this.isEnabled) {\r\n      return null\r\n    }\r\n\r\n    const prefixedKey = this.addPrefix(key as string)\r\n    return redisBase.safeExecute(async (client) => {\r\n      return await client.hSet(prefixedKey, field, value)\r\n    }) as Promise<number | null>\r\n  }\r\n\r\n  public async hGet(key: TCacheKeys, field: string): Promise<string | null> {\r\n    if (!this.isEnabled) {\r\n      return null\r\n    }\r\n\r\n    const prefixedKey = this.addPrefix(key as string)\r\n    return redisBase.safeExecute(async (client) => {\r\n      return await client.hGet(prefixedKey, field)\r\n    }) as Promise<string | null>\r\n  }\r\n\r\n  public async hGetAll(\r\n    key: TCacheKeys\r\n  ): Promise<Record<string, string> | null> {\r\n    if (!this.isEnabled) {\r\n      return null\r\n    }\r\n\r\n    const prefixedKey = this.addPrefix(key as string)\r\n    return redisBase.safeExecute(async (client) => {\r\n      return await client.hGetAll(prefixedKey)\r\n    }) as Promise<Record<string, string> | null>\r\n  }\r\n\r\n  public async hDel(\r\n    key: TCacheKeys,\r\n    fields: string | string[]\r\n  ): Promise<number | null> {\r\n    if (!this.isEnabled) {\r\n      return null\r\n    }\r\n\r\n    const prefixedKey = this.addPrefix(key as string)\r\n    return redisBase.safeExecute(async (client) => {\r\n      return await client.hDel(prefixedKey, fields)\r\n    }) as Promise<number | null>\r\n  }\r\n\r\n  public async lPush(\r\n    key: TCacheKeys,\r\n    ...elements: string[]\r\n  ): Promise<number | null> {\r\n    if (!this.isEnabled) {\r\n      return null\r\n    }\r\n\r\n    const prefixedKey = this.addPrefix(key as string)\r\n    return redisBase.safeExecute(async (client) => {\r\n      return await client.lPush(prefixedKey, elements)\r\n    }) as Promise<number | null>\r\n  }\r\n\r\n  public async rPush(\r\n    key: TCacheKeys,\r\n    ...elements: string[]\r\n  ): Promise<number | null> {\r\n    if (!this.isEnabled) {\r\n      return null\r\n    }\r\n\r\n    const prefixedKey = this.addPrefix(key as string)\r\n    return redisBase.safeExecute(async (client) => {\r\n      return await client.rPush(prefixedKey, elements)\r\n    }) as Promise<number | null>\r\n  }\r\n\r\n  public async lPop(key: TCacheKeys): Promise<string | null> {\r\n    if (!this.isEnabled) {\r\n      return null\r\n    }\r\n\r\n    const prefixedKey = this.addPrefix(key as string)\r\n    return redisBase.safeExecute(async (client) => {\r\n      return await client.lPop(prefixedKey)\r\n    }) as Promise<string | null>\r\n  }\r\n\r\n  public async rPop(key: TCacheKeys): Promise<string | null> {\r\n    if (!this.isEnabled) {\r\n      return null\r\n    }\r\n\r\n    const prefixedKey = this.addPrefix(key as string)\r\n    return redisBase.safeExecute(async (client) => {\r\n      return await client.rPop(prefixedKey)\r\n    }) as Promise<string | null>\r\n  }\r\n\r\n  public async lRange(\r\n    key: TCacheKeys,\r\n    start: number,\r\n    stop: number\r\n  ): Promise<string[] | null> {\r\n    if (!this.isEnabled) {\r\n      return null\r\n    }\r\n\r\n    const prefixedKey = this.addPrefix(key as string)\r\n    return redisBase.safeExecute(async (client) => {\r\n      return await client.lRange(prefixedKey, start, stop)\r\n    }) as Promise<string[] | null>\r\n  }\r\n\r\n  public async sAdd(\r\n    key: TCacheKeys,\r\n    ...members: string[]\r\n  ): Promise<number | null> {\r\n    if (!this.isEnabled) {\r\n      return null\r\n    }\r\n\r\n    const prefixedKey = this.addPrefix(key as string)\r\n    return redisBase.safeExecute(async (client) => {\r\n      return await client.sAdd(prefixedKey, members)\r\n    }) as Promise<number | null>\r\n  }\r\n\r\n  public async sMembers(key: TCacheKeys): Promise<string[] | null> {\r\n    if (!this.isEnabled) {\r\n      return null\r\n    }\r\n\r\n    const prefixedKey = this.addPrefix(key as string)\r\n    return redisBase.safeExecute(async (client) => {\r\n      return await client.sMembers(prefixedKey)\r\n    }) as Promise<string[] | null>\r\n  }\r\n\r\n  public async sRem(\r\n    key: TCacheKeys,\r\n    ...members: string[]\r\n  ): Promise<number | null> {\r\n    if (!this.isEnabled) {\r\n      return null\r\n    }\r\n\r\n    const prefixedKey = this.addPrefix(key as string)\r\n    return redisBase.safeExecute(async (client) => {\r\n      return await client.sRem(prefixedKey, members)\r\n    }) as Promise<number | null>\r\n  }\r\n\r\n  public async safeExecute<T>(\r\n    operation: (\r\n      client: RedisClientType,\r\n      addPrefix: (key: string) => string\r\n    ) => Promise<T>\r\n  ): Promise<T | null> {\r\n    if (!this.isEnabled) {\r\n      return null\r\n    }\r\n\r\n    return redisBase.safeExecute(async (client) => {\r\n      return await operation(client, this.addPrefix.bind(this))\r\n    })\r\n  }\r\n}\r\n\r\nexport { RedisGenericClient }\r\n\r\ntype TCreateRedisClient = {\r\n  prefix: string\r\n  isEnabled?: boolean\r\n}\r\n\r\n/**\r\n * Create a Redis client instance\r\n *\r\n * @example\r\n * ```typescript\r\n * // Without type safety (accepts any string)\r\n * const cache = createRedisGenericClient({ prefix: \"myapp\" });\r\n * await cache.set(\"any:key\", \"value\");\r\n *\r\n * // With type safety (only accepts defined cache keys)\r\n * const CACHE_KEYS = {\r\n *   users: {\r\n *     profile: (userId: number) => `user:${userId}:profile` as const,\r\n *   },\r\n * } as const;\r\n *\r\n * type CacheKey = ExtractCacheKeyType<typeof CACHE_KEYS>;\r\n * const cache = createRedisGenericClient<CacheKey>({ prefix: \"myapp\" });\r\n * await cache.set(CACHE_KEYS.users.profile(123), \"value\"); // ✅ Valid\r\n * await cache.set(\"random:key\", \"value\"); // ❌ Type error\r\n * ```\r\n */\r\nexport const createRedisGenericClient = <TCacheKeys = string>({\r\n  prefix,\r\n  isEnabled = true,\r\n}: TCreateRedisClient): RedisGenericClient<TCacheKeys> => {\r\n  return new RedisGenericClient<TCacheKeys>({ prefix, isEnabled })\r\n}\r\n"]}