@digicroz/node-backend-utils
Version:
Backend utilities for Node.js applications - Redis client wrappers and more utilities for TypeScript/JavaScript projects
1 lines • 34.6 kB
Source Map (JSON)
{"version":3,"sources":["../../src/redis/redisBase.ts","../../src/redis/redisGenericClient.ts"],"names":["createClient"],"mappings":";;;;;AAMA,IAAM,aAAA,GAAN,MAAM,cAAA,CAAc;AAAA,EASV,WAAA,GAAc;AANtB,IAAA,IAAA,CAAQ,MAAA,GAAiC,IAAA;AACzC,IAAA,IAAA,CAAQ,YAAA,GAAwB,KAAA;AAChC,IAAA,IAAA,CAAQ,WAAA,GAAuB,KAAA;AAC/B,IAAA,IAAA,CAAQ,uBAAA,GAAmC,KAAA;AAC3C,IAAA,IAAA,CAAQ,QAAA,GAA0B,IAAA;AAAA;AAEX,EAEvB,OAAc,WAAA,GAA6B;AACzC,IAAA,IAAI,CAAC,eAAc,QAAA,EAAU;AAC3B,MAAA,cAAA,CAAc,QAAA,GAAW,IAAI,cAAA,EAAc;AAAA;AAE7C,IAAA,OAAO,cAAA,CAAc,QAAA;AAAA;AACvB,EAEA,MAAa,WAAW,MAAA,EAAoC;AAC1D,IAAA,IAAI,KAAK,uBAAA,EAAyB;AAChC,MAAA;AAAA;AAGF,IAAA,IAAA,CAAK,uBAAA,GAA0B,IAAA;AAC/B,IAAA,IAAA,CAAK,WAAW,MAAA,CAAO,GAAA;AAEvB,IAAA,IAAI;AACF,MAAA,MAAM,KAAK,OAAA,EAAQ;AACnB,MAAA,OAAA,CAAQ,IAAI,uDAAuD,CAAA;AAAA,aAC5D,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,IAAA;AAAA,QACN,8EAAA;AAAA,QACA;AAAA,OACF;AAAA;AACF;AACF,EAEO,SAAA,GAAoC;AACzC,IAAA,IAAI,IAAA,CAAK,WAAA,IAAe,IAAA,CAAK,MAAA,EAAQ;AACnC,MAAA,OAAO,IAAA,CAAK,MAAA;AAAA;AAEd,IAAA,OAAO,IAAA;AAAA;AACT,EAEA,MAAc,OAAA,GAAoC;AAChD,IAAA,IAAI,IAAA,CAAK,YAAA,IAAiB,IAAA,CAAK,WAAA,IAAe,KAAK,MAAA,EAAS;AAC1D,MAAA,OAAO,IAAA,CAAK,MAAA;AAAA;AAGd,IAAA,IAAI,CAAC,KAAK,QAAA,EAAU;AAClB,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA;AAGF,IAAA,IAAA,CAAK,YAAA,GAAe,IAAA;AAEpB,IAAA,IAAI;AACF,MAAA,IAAA,CAAK,SAASA,kBAAA,CAAa;AAAA,QACzB,KAAK,IAAA,CAAK;AAAA,OACX,CAAA;AAED,MAAA,IAAA,CAAK,MAAA,CAAO,EAAA,CAAG,OAAA,EAAS,CAAC,GAAA,KAAQ;AAC/B,QAAA,OAAA,CAAQ,IAAA,CAAK,sCAAsC,GAAG,CAAA;AACtD,QAAA,IAAA,CAAK,WAAA,GAAc,KAAA;AAAA,OAEpB,CAAA;AAED,MAAA,IAAA,CAAK,MAAA,CAAO,EAAA,CAAG,SAAA,EAAW,MAAM;AAC9B,QAAA,OAAA,CAAQ,IAAI,wBAAwB,CAAA;AACpC,QAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AAAA,OACpB,CAAA;AAED,MAAA,IAAA,CAAK,MAAA,CAAO,EAAA,CAAG,YAAA,EAAc,MAAM;AACjC,QAAA,OAAA,CAAQ,IAAI,2BAA2B,CAAA;AACvC,QAAA,IAAA,CAAK,WAAA,GAAc,KAAA;AAAA,OACpB,CAAA;AAED,MAAA,MAAM,IAAA,CAAK,OAAO,OAAA,EAAQ;AAC1B,MAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AACnB,MAAA,IAAA,CAAK,YAAA,GAAe,KAAA;AAEpB,MAAA,OAAO,IAAA,CAAK,MAAA;AAAA,aACL,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,IAAA,CAAK,8CAA8C,KAAK,CAAA;AAChE,MAAA,IAAA,CAAK,YAAA,GAAe,KAAA;AACpB,MAAA,IAAA,CAAK,WAAA,GAAc,KAAA;AACnB,MAAA,IAAA,CAAK,MAAA,GAAS,IAAA;AACd,MAAA,MAAM,KAAA;AAAA;AACR;AACF,EAEA,MAAa,UAAA,GAA4B;AACvC,IAAA,IAAI;AACF,MAAA,IAAI,IAAA,CAAK,MAAA,IAAU,IAAA,CAAK,WAAA,EAAa;AACnC,QAAA,MAAM,IAAA,CAAK,OAAO,IAAA,EAAK;AACvB,QAAA,IAAA,CAAK,WAAA,GAAc,KAAA;AACnB,QAAA,IAAA,CAAK,MAAA,GAAS,IAAA;AAAA;AAChB,aACO,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,IAAA,CAAK,kDAAkD,KAAK,CAAA;AAEpE,MAAA,IAAA,CAAK,WAAA,GAAc,KAAA;AACnB,MAAA,IAAA,CAAK,MAAA,GAAS,IAAA;AAAA;AAChB;AACF,EAEO,iBAAA,GAA6B;AAClC,IAAA,OAAO,IAAA,CAAK,WAAA,IAAe,IAAA,CAAK,MAAA,KAAW,IAAA;AAAA;AAC7C,EAEA,MAAa,YACX,SAAA,EACmB;AACnB,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,KAAK,SAAA,EAAU;AAC9B,MAAA,IAAI,CAAC,MAAA,EAAQ;AACX,QAAA,OAAO,IAAA;AAAA;AAET,MAAA,OAAO,MAAM,UAAU,MAAM,CAAA;AAAA,aACtB,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,IAAA,CAAK,0CAA0C,KAAK,CAAA;AAC5D,MAAA,OAAO,IAAA;AAAA;AACT;AACF,EAEO,SAAA,GAIL;AACA,IAAA,OAAO;AAAA,MACL,aAAa,IAAA,CAAK,WAAA;AAAA,MAClB,cAAc,IAAA,CAAK,YAAA;AAAA,MACnB,yBAAyB,IAAA,CAAK;AAAA,KAChC;AAAA;AAEJ,CAAA;AAEO,IAAM,SAAA,GAAY,cAAc,WAAA,EAAY;;;AC3GnD,IAAM,qBAAN,MAA8C;AAAA,EAI5C,YAAY,MAAA,EAAkC;AAC5C,IAAA,IAAA,CAAK,SAAA,GAAY,MAAA,CAAO,MAAA,CAAO,QAAA,CAAS,GAAG,IACvC,MAAA,CAAO,MAAA,GACP,CAAA,EAAG,MAAA,CAAO,MAAM,CAAA,CAAA,CAAA;AACpB,IAAA,IAAA,CAAK,YAAY,MAAA,CAAO,SAAA;AAAA;AAC1B,EAEQ,UAAU,GAAA,EAAqB;AACrC,IAAA,IAAI,GAAA,CAAI,UAAA,CAAW,IAAA,CAAK,SAAS,CAAA,EAAG;AAClC,MAAA,OAAO,GAAA;AAAA;AAET,IAAA,OAAO,CAAA,EAAG,IAAA,CAAK,SAAS,CAAA,EAAG,GAAG,CAAA,CAAA;AAAA;AAChC,EAEQ,aAAa,GAAA,EAAqB;AACxC,IAAA,IAAI,GAAA,CAAI,UAAA,CAAW,IAAA,CAAK,SAAS,CAAA,EAAG;AAClC,MAAA,OAAO,GAAA,CAAI,KAAA,CAAM,IAAA,CAAK,SAAA,CAAU,MAAM,CAAA;AAAA;AAExC,IAAA,OAAO,GAAA;AAAA;AACT,EAEO,eAAA,GAA2B;AAChC,IAAA,OAAO,IAAA,CAAK,SAAA;AAAA;AACd,EAEO,iBAAA,GAA6B;AAClC,IAAA,IAAI,CAAC,KAAK,SAAA,EAAW;AACnB,MAAA,OAAO,KAAA;AAAA;AAET,IAAA,OAAO,UAAU,iBAAA,EAAkB;AAAA;AACrC,EAEO,SAAA,GAAY;AACjB,IAAA,OAAO;AAAA,MACL,GAAG,UAAU,SAAA,EAAU;AAAA,MACvB,WAAW,IAAA,CAAK,SAAA;AAAA,MAChB,QAAQ,IAAA,CAAK;AAAA,KACf;AAAA;AACF,EAEA,MAAa,GAAA,CAAI,GAAA,EAAiB,KAAA,EAAuC;AACvE,IAAA,IAAI,CAAC,KAAK,SAAA,EAAW;AACnB,MAAA,OAAO,IAAA;AAAA;AAGT,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,SAAA,CAAU,GAAa,CAAA;AAChD,IAAA,OAAO,SAAA,CAAU,WAAA,CAAY,OAAO,MAAA,KAAW;AAC7C,MAAA,OAAO,MAAM,MAAA,CAAO,GAAA,CAAI,WAAA,EAAa,KAAK,CAAA;AAAA,KAC3C,CAAA;AAAA;AACH,EAEA,MAAa,MAAA,CAAU,GAAA,EAAiB,KAAA,EAAkC;AACxE,IAAA,IAAI,CAAC,KAAK,SAAA,EAAW;AACnB,MAAA,OAAO,IAAA;AAAA;AAGT,IAAA,IAAI;AACF,MAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,SAAA,CAAU,KAAK,CAAA;AAC5C,MAAA,MAAM,WAAA,GAAc,IAAA,CAAK,SAAA,CAAU,GAAa,CAAA;AAChD,MAAA,OAAO,SAAA,CAAU,WAAA,CAAY,OAAO,MAAA,KAAW;AAC7C,QAAA,OAAO,MAAM,MAAA,CAAO,GAAA,CAAI,WAAA,EAAa,eAAe,CAAA;AAAA,OACrD,CAAA;AAAA,aACM,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,uCAAuC,KAAK,CAAA;AAC1D,MAAA,OAAO,IAAA;AAAA;AACT;AACF,EAEA,MAAa,KAAA,CACX,GAAA,EACA,OAAA,EACA,KAAA,EACwB;AACxB,IAAA,IAAI,CAAC,KAAK,SAAA,EAAW;AACnB,MAAA,OAAO,IAAA;AAAA;AAGT,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,SAAA,CAAU,GAAa,CAAA;AAChD,IAAA,OAAO,SAAA,CAAU,WAAA,CAAY,OAAO,MAAA,KAAW;AAC7C,MAAA,OAAO,MAAM,MAAA,CAAO,KAAA,CAAM,WAAA,EAAa,SAAS,KAAK,CAAA;AAAA,KACtD,CAAA;AAAA;AACH,EAEA,MAAa,QAAA,CACX,GAAA,EACA,OAAA,EACA,KAAA,EACwB;AACxB,IAAA,IAAI,CAAC,KAAK,SAAA,EAAW;AACnB,MAAA,OAAO,IAAA;AAAA;AAGT,IAAA,IAAI;AACF,MAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,SAAA,CAAU,KAAK,CAAA;AAC5C,MAAA,MAAM,WAAA,GAAc,IAAA,CAAK,SAAA,CAAU,GAAa,CAAA;AAChD,MAAA,OAAO,SAAA,CAAU,WAAA,CAAY,OAAO,MAAA,KAAW;AAC7C,QAAA,OAAO,MAAM,MAAA,CAAO,KAAA,CAAM,WAAA,EAAa,SAAS,eAAe,CAAA;AAAA,OAChE,CAAA;AAAA,aACM,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,6CAA6C,KAAK,CAAA;AAChE,MAAA,OAAO,IAAA;AAAA;AACT;AACF,EAEA,MAAa,IAAI,GAAA,EAAyC;AACxD,IAAA,IAAI,CAAC,KAAK,SAAA,EAAW;AACnB,MAAA,OAAO,IAAA;AAAA;AAGT,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,SAAA,CAAU,GAAa,CAAA;AAChD,IAAA,OAAO,SAAA,CAAU,WAAA,CAAY,OAAO,MAAA,KAAW;AAC7C,MAAA,OAAO,MAAM,MAAA,CAAO,GAAA,CAAI,WAAW,CAAA;AAAA,KACpC,CAAA;AAAA;AACH,EAEA,MAAa,OAAU,GAAA,EAAoC;AACzD,IAAA,IAAI,CAAC,KAAK,SAAA,EAAW;AACnB,MAAA,OAAO,IAAA;AAAA;AAGT,IAAA,IAAI;AACF,MAAA,MAAM,WAAA,GAAc,IAAA,CAAK,SAAA,CAAU,GAAa,CAAA;AAChD,MAAA,MAAM,eAAA,GAAmB,MAAM,SAAA,CAAU,WAAA,CAAY,OAAO,MAAA,KAAW;AACrE,QAAA,OAAO,MAAM,MAAA,CAAO,GAAA,CAAI,WAAW,CAAA;AAAA,OACpC,CAAA;AAED,MAAA,IAAI,oBAAoB,IAAA,EAAM;AAC5B,QAAA,OAAO,IAAA;AAAA;AAGT,MAAA,OAAO,IAAA,CAAK,MAAM,eAAe,CAAA;AAAA,aAC1B,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,0CAA0C,KAAK,CAAA;AAC7D,MAAA,OAAO,IAAA;AAAA;AACT;AACF,EAEA,MAAa,IAAI,GAAA,EAAyC;AACxD,IAAA,IAAI,CAAC,KAAK,SAAA,EAAW;AACnB,MAAA,OAAO,IAAA;AAAA;AAGT,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,SAAA,CAAU,GAAa,CAAA;AAChD,IAAA,OAAO,SAAA,CAAU,WAAA,CAAY,OAAO,MAAA,KAAW;AAC7C,MAAA,OAAO,MAAM,MAAA,CAAO,GAAA,CAAI,WAAW,CAAA;AAAA,KACpC,CAAA;AAAA;AACH,EAEA,MAAa,YAAY,IAAA,EAA4C;AACnE,IAAA,IAAI,CAAC,KAAK,SAAA,EAAW;AACnB,MAAA,OAAO,IAAA;AAAA;AAGT,IAAA,MAAM,YAAA,GAAe,KAAK,GAAA,CAAI,CAAC,QAAQ,IAAA,CAAK,SAAA,CAAU,GAAa,CAAC,CAAA;AACpE,IAAA,OAAO,SAAA,CAAU,WAAA,CAAY,OAAO,MAAA,KAAW;AAC7C,MAAA,OAAO,MAAM,MAAA,CAAO,GAAA,CAAI,YAAY,CAAA;AAAA,KACrC,CAAA;AAAA;AACH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBA,MAAa,YAAA,CACX,OAAA,EACA,SAAA,GAAoB,GAAA,EACI;AACxB,IAAA,IAAI,CAAC,KAAK,SAAA,EAAW;AACnB,MAAA,OAAO,IAAA;AAAA;AAGT,IAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,SAAA,CAAU,OAAiB,CAAA;AACxD,IAAA,OAAO,SAAA,CAAU,WAAA,CAAY,OAAO,MAAA,KAAW;AAC7C,MAAA,IAAI,YAAA,GAAe,CAAA;AACnB,MAAA,MAAM,eAAyB,EAAC;AAGhC,MAAA,WAAA,MAAiB,GAAA,IAAO,OAAO,YAAA,CAAa;AAAA,QAC1C,KAAA,EAAO,eAAA;AAAA,QACP,KAAA,EAAO;AAAA,OACR,CAAA,EAAG;AAEF,QAAA,IAAI,OAAO,QAAQ,QAAA,EAAU;AAC3B,UAAA,YAAA,CAAa,KAAK,GAAG,CAAA;AAAA,SACvB,MAAA,IAAW,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA,EAAG;AAC7B,UAAA,YAAA,CAAa,IAAA,CAAK,GAAG,GAAG,CAAA;AAAA;AAI1B,QAAA,IAAI,YAAA,CAAa,UAAU,SAAA,EAAW;AACpC,UAAA,MAAM,OAAA,GAAU,MAAM,MAAA,CAAO,GAAA,CAAI,YAAY,CAAA;AAC7C,UAAA,YAAA,IAAgB,OAAA;AAChB,UAAA,YAAA,CAAa,MAAA,GAAS,CAAA;AAAA;AACxB;AAIF,MAAA,IAAI,YAAA,CAAa,SAAS,CAAA,EAAG;AAC3B,QAAA,MAAM,OAAA,GAAU,MAAM,MAAA,CAAO,GAAA,CAAI,YAAY,CAAA;AAC7C,QAAA,YAAA,IAAgB,OAAA;AAAA;AAGlB,MAAA,OAAO,YAAA;AAAA,KACR,CAAA;AAAA;AACH,EAEA,MAAa,OAAO,GAAA,EAAyC;AAC3D,IAAA,IAAI,CAAC,KAAK,SAAA,EAAW;AACnB,MAAA,OAAO,IAAA;AAAA;AAGT,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,SAAA,CAAU,GAAa,CAAA;AAChD,IAAA,OAAO,SAAA,CAAU,WAAA,CAAY,OAAO,MAAA,KAAW;AAC7C,MAAA,OAAO,MAAM,MAAA,CAAO,MAAA,CAAO,WAAW,CAAA;AAAA,KACvC,CAAA;AAAA;AACH,EAEA,MAAa,MAAA,CACX,GAAA,EACA,OAAA,EACwB;AACxB,IAAA,IAAI,CAAC,KAAK,SAAA,EAAW;AACnB,MAAA,OAAO,IAAA;AAAA;AAGT,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,SAAA,CAAU,GAAa,CAAA;AAChD,IAAA,OAAO,SAAA,CAAU,WAAA,CAAY,OAAO,MAAA,KAAW;AAC7C,MAAA,OAAO,MAAM,MAAA,CAAO,MAAA,CAAO,WAAA,EAAa,OAAO,CAAA;AAAA,KAChD,CAAA;AAAA;AACH,EAEA,MAAa,IAAI,GAAA,EAAyC;AACxD,IAAA,IAAI,CAAC,KAAK,SAAA,EAAW;AACnB,MAAA,OAAO,IAAA;AAAA;AAGT,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,SAAA,CAAU,GAAa,CAAA;AAChD,IAAA,OAAO,SAAA,CAAU,WAAA,CAAY,OAAO,MAAA,KAAW;AAC7C,MAAA,OAAO,MAAM,MAAA,CAAO,GAAA,CAAI,WAAW,CAAA;AAAA,KACpC,CAAA;AAAA;AACH,EAEA,MAAa,KAAK,GAAA,EAAyC;AACzD,IAAA,IAAI,CAAC,KAAK,SAAA,EAAW;AACnB,MAAA,OAAO,IAAA;AAAA;AAGT,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,SAAA,CAAU,GAAa,CAAA;AAChD,IAAA,OAAO,SAAA,CAAU,WAAA,CAAY,OAAO,MAAA,KAAW;AAC7C,MAAA,OAAO,MAAM,MAAA,CAAO,IAAA,CAAK,WAAW,CAAA;AAAA,KACrC,CAAA;AAAA;AACH,EAEA,MAAa,MAAA,CACX,GAAA,EACA,SAAA,EACwB;AACxB,IAAA,IAAI,CAAC,KAAK,SAAA,EAAW;AACnB,MAAA,OAAO,IAAA;AAAA;AAGT,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,SAAA,CAAU,GAAa,CAAA;AAChD,IAAA,OAAO,SAAA,CAAU,WAAA,CAAY,OAAO,MAAA,KAAW;AAC7C,MAAA,OAAO,MAAM,MAAA,CAAO,MAAA,CAAO,WAAA,EAAa,SAAS,CAAA;AAAA,KAClD,CAAA;AAAA;AACH,EAEA,MAAa,KAAK,GAAA,EAAyC;AACzD,IAAA,IAAI,CAAC,KAAK,SAAA,EAAW;AACnB,MAAA,OAAO,IAAA;AAAA;AAGT,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,SAAA,CAAU,GAAa,CAAA;AAChD,IAAA,OAAO,SAAA,CAAU,WAAA,CAAY,OAAO,MAAA,KAAW;AAC7C,MAAA,OAAO,MAAM,MAAA,CAAO,IAAA,CAAK,WAAW,CAAA;AAAA,KACrC,CAAA;AAAA;AACH,EAEA,MAAa,KAAK,OAAA,EAA2C;AAC3D,IAAA,IAAI,CAAC,KAAK,SAAA,EAAW;AACnB,MAAA,OAAO,IAAA;AAAA;AAGT,IAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,SAAA,CAAU,OAAO,CAAA;AAC9C,IAAA,MAAM,MAAA,GAAS,MAAM,SAAA,CAAU,WAAA,CAAY,OAAO,MAAA,KAAW;AAC3D,MAAA,OAAO,MAAM,MAAA,CAAO,IAAA,CAAK,eAAe,CAAA;AAAA,KACzC,CAAA;AAGD,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,OAAO,OAAO,GAAA,CAAI,CAAC,QAAQ,IAAA,CAAK,YAAA,CAAa,GAAG,CAAC,CAAA;AAAA;AAEnD,IAAA,OAAO,MAAA;AAAA;AACT,EAEA,MAAa,IAAA,CACX,GAAA,EACA,KAAA,EACA,KAAA,EACwB;AACxB,IAAA,IAAI,CAAC,KAAK,SAAA,EAAW;AACnB,MAAA,OAAO,IAAA;AAAA;AAGT,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,SAAA,CAAU,GAAa,CAAA;AAChD,IAAA,OAAO,SAAA,CAAU,WAAA,CAAY,OAAO,MAAA,KAAW;AAC7C,MAAA,OAAO,MAAM,MAAA,CAAO,IAAA,CAAK,WAAA,EAAa,OAAO,KAAK,CAAA;AAAA,KACnD,CAAA;AAAA;AACH,EAEA,MAAa,IAAA,CAAK,GAAA,EAAiB,KAAA,EAAuC;AACxE,IAAA,IAAI,CAAC,KAAK,SAAA,EAAW;AACnB,MAAA,OAAO,IAAA;AAAA;AAGT,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,SAAA,CAAU,GAAa,CAAA;AAChD,IAAA,OAAO,SAAA,CAAU,WAAA,CAAY,OAAO,MAAA,KAAW;AAC7C,MAAA,OAAO,MAAM,MAAA,CAAO,IAAA,CAAK,WAAA,EAAa,KAAK,CAAA;AAAA,KAC5C,CAAA;AAAA;AACH,EAEA,MAAa,QACX,GAAA,EACwC;AACxC,IAAA,IAAI,CAAC,KAAK,SAAA,EAAW;AACnB,MAAA,OAAO,IAAA;AAAA;AAGT,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,SAAA,CAAU,GAAa,CAAA;AAChD,IAAA,OAAO,SAAA,CAAU,WAAA,CAAY,OAAO,MAAA,KAAW;AAC7C,MAAA,OAAO,MAAM,MAAA,CAAO,OAAA,CAAQ,WAAW,CAAA;AAAA,KACxC,CAAA;AAAA;AACH,EAEA,MAAa,IAAA,CACX,GAAA,EACA,MAAA,EACwB;AACxB,IAAA,IAAI,CAAC,KAAK,SAAA,EAAW;AACnB,MAAA,OAAO,IAAA;AAAA;AAGT,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,SAAA,CAAU,GAAa,CAAA;AAChD,IAAA,OAAO,SAAA,CAAU,WAAA,CAAY,OAAO,MAAA,KAAW;AAC7C,MAAA,OAAO,MAAM,MAAA,CAAO,IAAA,CAAK,WAAA,EAAa,MAAM,CAAA;AAAA,KAC7C,CAAA;AAAA;AACH,EAEA,MAAa,KAAA,CACX,GAAA,EAAA,GACG,QAAA,EACqB;AACxB,IAAA,IAAI,CAAC,KAAK,SAAA,EAAW;AACnB,MAAA,OAAO,IAAA;AAAA;AAGT,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,SAAA,CAAU,GAAa,CAAA;AAChD,IAAA,OAAO,SAAA,CAAU,WAAA,CAAY,OAAO,MAAA,KAAW;AAC7C,MAAA,OAAO,MAAM,MAAA,CAAO,KAAA,CAAM,WAAA,EAAa,QAAQ,CAAA;AAAA,KAChD,CAAA;AAAA;AACH,EAEA,MAAa,KAAA,CACX,GAAA,EAAA,GACG,QAAA,EACqB;AACxB,IAAA,IAAI,CAAC,KAAK,SAAA,EAAW;AACnB,MAAA,OAAO,IAAA;AAAA;AAGT,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,SAAA,CAAU,GAAa,CAAA;AAChD,IAAA,OAAO,SAAA,CAAU,WAAA,CAAY,OAAO,MAAA,KAAW;AAC7C,MAAA,OAAO,MAAM,MAAA,CAAO,KAAA,CAAM,WAAA,EAAa,QAAQ,CAAA;AAAA,KAChD,CAAA;AAAA;AACH,EAEA,MAAa,KAAK,GAAA,EAAyC;AACzD,IAAA,IAAI,CAAC,KAAK,SAAA,EAAW;AACnB,MAAA,OAAO,IAAA;AAAA;AAGT,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,SAAA,CAAU,GAAa,CAAA;AAChD,IAAA,OAAO,SAAA,CAAU,WAAA,CAAY,OAAO,MAAA,KAAW;AAC7C,MAAA,OAAO,MAAM,MAAA,CAAO,IAAA,CAAK,WAAW,CAAA;AAAA,KACrC,CAAA;AAAA;AACH,EAEA,MAAa,KAAK,GAAA,EAAyC;AACzD,IAAA,IAAI,CAAC,KAAK,SAAA,EAAW;AACnB,MAAA,OAAO,IAAA;AAAA;AAGT,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,SAAA,CAAU,GAAa,CAAA;AAChD,IAAA,OAAO,SAAA,CAAU,WAAA,CAAY,OAAO,MAAA,KAAW;AAC7C,MAAA,OAAO,MAAM,MAAA,CAAO,IAAA,CAAK,WAAW,CAAA;AAAA,KACrC,CAAA;AAAA;AACH,EAEA,MAAa,MAAA,CACX,GAAA,EACA,KAAA,EACA,IAAA,EAC0B;AAC1B,IAAA,IAAI,CAAC,KAAK,SAAA,EAAW;AACnB,MAAA,OAAO,IAAA;AAAA;AAGT,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,SAAA,CAAU,GAAa,CAAA;AAChD,IAAA,OAAO,SAAA,CAAU,WAAA,CAAY,OAAO,MAAA,KAAW;AAC7C,MAAA,OAAO,MAAM,MAAA,CAAO,MAAA,CAAO,WAAA,EAAa,OAAO,IAAI,CAAA;AAAA,KACpD,CAAA;AAAA;AACH,EAEA,MAAa,IAAA,CACX,GAAA,EAAA,GACG,OAAA,EACqB;AACxB,IAAA,IAAI,CAAC,KAAK,SAAA,EAAW;AACnB,MAAA,OAAO,IAAA;AAAA;AAGT,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,SAAA,CAAU,GAAa,CAAA;AAChD,IAAA,OAAO,SAAA,CAAU,WAAA,CAAY,OAAO,MAAA,KAAW;AAC7C,MAAA,OAAO,MAAM,MAAA,CAAO,IAAA,CAAK,WAAA,EAAa,OAAO,CAAA;AAAA,KAC9C,CAAA;AAAA;AACH,EAEA,MAAa,SAAS,GAAA,EAA2C;AAC/D,IAAA,IAAI,CAAC,KAAK,SAAA,EAAW;AACnB,MAAA,OAAO,IAAA;AAAA;AAGT,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,SAAA,CAAU,GAAa,CAAA;AAChD,IAAA,OAAO,SAAA,CAAU,WAAA,CAAY,OAAO,MAAA,KAAW;AAC7C,MAAA,OAAO,MAAM,MAAA,CAAO,QAAA,CAAS,WAAW,CAAA;AAAA,KACzC,CAAA;AAAA;AACH,EAEA,MAAa,IAAA,CACX,GAAA,EAAA,GACG,OAAA,EACqB;AACxB,IAAA,IAAI,CAAC,KAAK,SAAA,EAAW;AACnB,MAAA,OAAO,IAAA;AAAA;AAGT,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,SAAA,CAAU,GAAa,CAAA;AAChD,IAAA,OAAO,SAAA,CAAU,WAAA,CAAY,OAAO,MAAA,KAAW;AAC7C,MAAA,OAAO,MAAM,MAAA,CAAO,IAAA,CAAK,WAAA,EAAa,OAAO,CAAA;AAAA,KAC9C,CAAA;AAAA;AACH,EAEA,MAAa,YACX,SAAA,EAImB;AACnB,IAAA,IAAI,CAAC,KAAK,SAAA,EAAW;AACnB,MAAA,OAAO,IAAA;AAAA;AAGT,IAAA,OAAO,SAAA,CAAU,WAAA,CAAY,OAAO,MAAA,KAAW;AAC7C,MAAA,OAAO,MAAM,SAAA,CAAU,MAAA,EAAQ,KAAK,SAAA,CAAU,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,KACzD,CAAA;AAAA;AAEL;AA+BO,IAAM,2BAA2B,CAAsB;AAAA,EAC5D,MAAA;AAAA,EACA,SAAA,GAAY;AACd,CAAA,KAA0D;AACxD,EAAA,OAAO,IAAI,kBAAA,CAA+B,EAAE,MAAA,EAAQ,WAAW,CAAA;AACjE","file":"redisGenericClient.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"]}