@digicroz/node-backend-utils
Version:
Backend utilities for Node.js applications - Redis client wrappers and more utilities for TypeScript/JavaScript projects
1 lines • 7.23 kB
Source Map (JSON)
{"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"]}