UNPKG

@mollitia/redis

Version:
2 lines (1 loc) 3.46 kB
"use strict";var u=Object.defineProperty;var d=(a,e,t)=>e in a?u(a,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):a[e]=t;var l=(a,e,t)=>(d(a,typeof e!="symbol"?e+"":e,t),t);Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const h=require("mollitia"),g=require("redis");function y(a){const e=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(a){for(const t in a)if(t!=="default"){const s=Object.getOwnPropertyDescriptor(a,t);Object.defineProperty(e,t,s.get?s:{enumerable:!0,get:()=>a[t]})}}return e.default=a,Object.freeze(e)}const c=y(h);class m{constructor(e){l(this,"client");l(this,"prefix","mollitia");l(this,"initializePromise");l(this,"logger");const t={socket:{reconnectStrategy:()=>500},disableOfflineQueue:!0};e.password&&(t.password=e.password),e.username&&(t.username=e.username),e.url?t.url=e.url:(t.socket.host=e.host,t.socket.port=e.port),this.client=g.createClient(t),this.logger=e.logger,this.initializePromise=new Promise(s=>{this.client.on("ready",()=>{var i;(i=this.logger)==null||i.debug("Redis Ready"),s()}),this.client.on("error",()=>{var i;(i=this.logger)==null||i.debug("Redis Connection Error")})}),this.client.connect()}async getState(e){const t={};await this.initializePromise;const s=await this.client.keys(`${this.prefix}::module::${e}::*`);for(const i of s){const r=await this.client.get(i);if(r)try{t[i.substring(i.lastIndexOf("::")+2)]=JSON.parse(r)}catch{}}return t}async setState(e,t,s=0){await this.initializePromise;for await(const i of t){const r=this.getKeyName(e,i.key);i.value?(await this.client.set(r,JSON.stringify(i.value)),s&&this.client.expire(r,Math.ceil(s/1e3))):await this.client.del(r)}}async clearState(e){try{const t=await this.client.keys(`${this.prefix}::module::${e}::*`);for(const s of t)await this.client.del(s)}catch{}}getKeyName(e,t){return t?`${this.prefix}::module::${e}::${t}`:`${this.prefix}::module::${e}`}}const f="0.0.2",S=[];class w{constructor(e){l(this,"redis");l(this,"getMaxDelay",500);l(this,"setMaxDelay",500);l(this,"ttl",0);l(this,"logger");var t;if(this.logger=e.logger,!e.url&&(!e.host||!e.port)){(t=this.logger)==null||t.warn("Redis configuration is invalid");return}this.redis=new m(e),this.getMaxDelay=e.getMaxDelay||500,this.setMaxDelay=e.setMaxDelay??500,this.ttl=e.ttl||0}async getStateWithRedis(e,t){return new Promise((s,i)=>{const r=setTimeout(()=>{i("Getting the state from Redis timed out.")},t);try{this.redis.getState(e).then(n=>{clearTimeout(r),s(n)})}catch{clearTimeout(r),i("Error occurred while trying to get the state from Redis.")}})}async setStateWithRedis(e,t,s,i){return new Promise((r,n)=>{const o=setTimeout(()=>{n("Setting the state in Redis timed out.")},s);try{this.redis.setState(e,t,i).then(()=>{clearTimeout(o),r()})}catch{clearTimeout(o),n("Error occurred while trying to set the state in Redis")}})}moduleOverride(e,t,s,i){e.getState=async()=>this.getStateWithRedis(e.name,t),e.setState=async(r,n=0)=>this.setStateWithRedis(e.name,r,s,n||i),e.clearState=async()=>this.redis.clearState(e.name)}onModuleCreate(e,t){var s;if((s=t.redis)!=null&&s.use&&this.redis){const i=t.redis.getMaxDelay||this.getMaxDelay,r=t.redis.setMaxDelay??this.setMaxDelay,n=t.redis.ttl||this.ttl;switch(e.constructor.name){case c.Ratelimit.name:{this.moduleOverride(e,i,r,n);break}case c.SlidingCountBreaker.name:case c.SlidingTimeBreaker.name:{this.moduleOverride(e,i,r,n);break}}}}}exports.RedisAddon=w;exports.modules=S;exports.version=f;