@ratelock/redis
Version:
Redis storage backend for RateLock rate limiting system
1 lines • 2.67 kB
JavaScript
import{DECREMENT as e,INCREMENT as t,INCREMENT_IF as n}from"./lua-scripts-djZr0F6_.mjs";var r=class{constructor(e){this.multi=e}get(e){return this.multi.get(e),this}set(e,t,n){return this.multi.set(e,t,n?{PX:n}:void 0),this}expire(e,t){return this.multi.pExpire(e,t),this}increment(e,n){return this.multi.eval(t,{keys:[e],arguments:[n?.toString()??`0`]}),this}incrementIf(e,t,r){return this.multi.eval(n,{keys:[e],arguments:[t.toString(),r?.toString()??`0`]}),this}decrement(t,n=0){return this.multi.eval(e,{keys:[t],arguments:[n.toString()]}),this}addTimestamp(e,t,n){return this.multi.zAdd(e,{score:t,value:String(t)}),this.multi.pExpire(e,n),this}countTimestamps(e,t){let n=Date.now();return this.multi.zCount(e,n-t,n),this}getOldestTimestamp(e){return this.multi.zRangeWithScores(e,0,0),this}async exec(){return this.multi.exec()}},i=class{constructor(e){this.client=e}getKey(e){return e}async get(e){return this.client.get(this.getKey(e))}async set(e,t,n){let r=this.getKey(e);n&&n>0?await this.client.set(r,t,{PX:n}):await this.client.set(r,t)}async delete(e){await this.client.del(this.getKey(e))}async exists(e){let t=await this.client.exists(this.getKey(e));return t===1}async expire(e,t){await this.client.pExpire(this.getKey(e),t)}async increment(e,n){let r=await this.client.eval(t,{keys:[this.getKey(e)],arguments:[n?.toString()??`0`]});return parseInt(r,10)}async incrementIf(e,t,r){let i=await this.client.eval(n,{keys:[this.getKey(e)],arguments:[t.toString(),r?.toString()??`0`]});return{value:parseInt(i[0],10),incremented:i[1]===1}}async decrement(t,n=0){let r=await this.client.eval(e,{keys:[this.getKey(t)],arguments:[n.toString()]});return parseInt(r,10)}async addTimestamp(e,t,n){let r=this.getKey(e);await this.client.zAdd(r,{score:t,value:t.toString()}),n>0&&await this.expire(e,n)}async countTimestamps(e,t){let n=Date.now(),r=n-t;return this.client.zCount(this.getKey(e),r,n)}async getOldestTimestamp(e){let t=await this.client.zRangeWithScores(this.getKey(e),0,0);return t.length>0&&t[0]?t[0].score:null}async cleanupTimestamps(e){return Promise.resolve()}async multiGet(e){return e.length===0?[]:this.client.mGet(e.map(e=>this.getKey(e)))}async multiSet(e){if(e.length===0)return;let t=this.client.multi();for(let{key:n,value:r,ttlMs:i}of e){let e=this.getKey(n);i&&i>0?t.set(e,r,{PX:i}):t.set(e,r)}await t.exec()}async evalScript(e,t){return this.client.eval(e,{keys:t.keys,arguments:t.arguments})}async scriptLoad(e){return this.client.scriptLoad(e)}async evalSha(e,t){return this.client.evalSha(e,{keys:t.keys,arguments:t.arguments})}pipeline(){return new r(this.client.multi())}};export{r as StoragePipelineService,i as StorageService};