@ratelock/redis
Version:
Redis storage backend for RateLock rate limiting system
1 lines • 3.6 kB
JavaScript
import{FIXED_WINDOW as e,INDIVIDUAL_FIXED_WINDOW as t,SLIDING_WINDOW as n,TOKEN_BUCKET as r}from"./lua-scripts-djZr0F6_.mjs";import{FixedWindowStrategy as i,IndividualFixedWindowStrategy as a,SlidingWindowStrategy as o,TokenBucketStrategy as s,createStrategyFactory as c,fixedWindowValidator as l,individualFixedWindowValidator as u,slidingWindowValidator as d,tokenBucketValidator as f}from"@ratelock/core/strategy";var p=class extends i{scriptSha=null;async check(t){let n=this.storage;if(typeof n.evalScript!=`function`)return super.check(t);let r=Date.now(),{limit:i,windowMs:a,prefix:o=`fw`}=this.options,s=Math.floor((r-(this.options.startTimeMs||0))/a),c=`${o}:${t}:${s}`;this.scriptSha||(this.scriptSha=await n.scriptLoad(e));try{let e=await n.evalSha(this.scriptSha,{keys:[c],arguments:[a.toString(),i.toString(),r.toString()]});return{allowed:e[0]===1,remaining:e[2],reset:r+e[3]}}catch(t){if(t.message.includes(`NOSCRIPT`)){this.scriptSha=await n.scriptLoad(e);let t=await n.evalSha(this.scriptSha,{keys:[c],arguments:[a.toString(),i.toString(),r.toString()]});return{allowed:t[0]===1,remaining:t[2],reset:r+t[3]}}throw t}}};const m=c(l,(e,t)=>new p(e,t));var h=class extends a{scriptSha=null;async check(e){let n=this.storage;if(typeof n.evalScript!=`function`)return super.check(e);let r=Date.now(),{limit:i,windowMs:a,prefix:o=`ifw`}=this.options,s=`${o}:${e}:start`,c=`${o}:${e}:count`;this.scriptSha||(this.scriptSha=await n.scriptLoad(t));try{let e=await n.evalSha(this.scriptSha,{keys:[s,c],arguments:[a.toString(),i.toString(),r.toString()]}),[t,o,l,u]=e;return{allowed:!!t,remaining:l,reset:u}}catch(r){if(r?.message?.includes(`NOSCRIPT`))return this.scriptSha=await n.scriptLoad(t),this.check(e);throw r}}};const g=c(u,(e,t)=>new h(e,t));var _=class extends o{scriptSha=null;async check(e){let t=this.storage;if(typeof t.evalScript!=`function`)return super.check(e);let r=Date.now(),{limit:i,windowMs:a,prefix:o=`sw`}=this.options,s=`${o}:${e}`;this.scriptSha||(this.scriptSha=await t.scriptLoad(n));try{let e=await t.evalSha(this.scriptSha,{keys:[s],arguments:[a.toString(),i.toString(),r.toString()]}),n=e[0]===1,o=e[3],c=r+o;return{allowed:n,remaining:e[2],reset:c,windowStart:r-a,windowEnd:c}}catch(e){if(e.message.includes(`NOSCRIPT`)){this.scriptSha=await t.scriptLoad(n);let e=await t.evalSha(this.scriptSha,{keys:[s],arguments:[a.toString(),i.toString(),r.toString()]}),o=e[0]===1,c=e[3],l=r+c;return{allowed:o,remaining:e[2],reset:l,windowStart:r-a,windowEnd:l}}throw e}}};const v=c(d,(e,t)=>new _(e,t));var y=class extends s{scriptSha=null;async check(e){let t=this.storage;if(typeof t.evalScript!=`function`)return super.check(e);let n=Date.now(),{capacity:i,refillRate:a,refillTime:o,prefix:s=`tb`}=this.options,c=`${s}:${e}`;this.scriptSha||(this.scriptSha=await t.scriptLoad(r));try{let e=await t.evalSha(this.scriptSha,{keys:[c],arguments:[i.toString(),a.toString(),n.toString()]});return{allowed:e[0]===1,remaining:Math.floor(e[1]),tokens:e[1],refillTime:this.options.refillTime}}catch(e){if(e.message.includes(`NOSCRIPT`)){this.scriptSha=await t.scriptLoad(r);let e=await t.evalSha(this.scriptSha,{keys:[c],arguments:[i.toString(),a.toString(),n.toString()]});return{allowed:e[0]===1,remaining:Math.floor(e[1]),tokens:e[1],refillTime:this.options.refillTime}}throw e}}};const b=c(f,(e,t)=>new y(e,t));export{p as FixedWindowStrategy,h as IndividualFixedWindowStrategy,_ as SlidingWindowStrategy,y as TokenBucketStrategy,m as createFixedWindowStrategy,g as createIndividualFixedWindowStrategy,v as createSlidingWindowStrategy,b as createTokenBucketStrategy};