RateLimiter.coffee 852 B

123456789101112131415161718192021222324252627
  1. settings = require("settings-sharelatex")
  2. RedisWrapper = require('./RedisWrapper')
  3. rclient = RedisWrapper.client('ratelimiter')
  4. RollingRateLimiter = require('rolling-rate-limiter')
  5. module.exports = RateLimiter =
  6. addCount: (opts, callback = (err, shouldProcess)->)->
  7. namespace = "RateLimit:#{opts.endpointName}:"
  8. k = "{#{opts.subjectName}}"
  9. limiter = RollingRateLimiter({
  10. redis: rclient,
  11. namespace: namespace,
  12. interval: opts.timeInterval * 1000,
  13. maxInInterval: opts.throttle
  14. })
  15. limiter k, (err, timeLeft, actionsLeft) ->
  16. if err?
  17. return callback(err)
  18. allowed = timeLeft == 0
  19. callback(null, allowed)
  20. clearRateLimit: (endpointName, subject, callback) ->
  21. # same as the key which will be built by RollingRateLimiter (namespace+k)
  22. keyName = "RateLimit:#{endpointName}:{#{subject}}"
  23. rclient.del keyName, callback