File tree Expand file tree Collapse file tree 2 files changed +30
-6
lines changed Expand file tree Collapse file tree 2 files changed +30
-6
lines changed Original file line number Diff line number Diff line change 1
- var rateLimiter = require ( './rate-limiter' ) ;
1
+ var rateLimiter = require ( './rate-limiter' ) ;
2
+
3
+ var defaultFailMessage = 'Rate limit exceeded, retry after {after}ms' ;
2
4
3
5
module . exports = function ( opts ) {
4
6
var limiter = rateLimiter ( opts ) ;
@@ -7,8 +9,24 @@ module.exports = function(opts) {
7
9
if ( err ) {
8
10
next ( ) ;
9
11
} else {
12
+ res . set ( {
13
+ 'X-RateLimit-Limit' : rate . limit ,
14
+ 'X-RateLimit-Remaining' : rate . current > rate . limit ? 0 : rate . limit - rate . current ,
15
+ 'X-RateLimit-Reset' : ( rate . reset / 1000 ) | 0
16
+ } ) ;
10
17
if ( rate . current > rate . limit ) {
11
- res . writeHead ( 429 ) ;
18
+ var after = rate . reset - Date . now ( ) ;
19
+ var failMessage = defaultFailMessage ;
20
+ res . set ( 'Retry-After' , ( after / 1000 ) | 0 ) ;
21
+ if ( opts . failMessage ) {
22
+ if ( typeof opts . failMessage === 'function' ) {
23
+ failMessage = opts . failMessage ( req ) ;
24
+ }
25
+ else {
26
+ failMessage = opts . failMessage ;
27
+ }
28
+ }
29
+ res . status ( 429 ) . send ( ( opts . failMessage || defaultFailMessage ) . replace ( / { a f t e r } / g, after ) ) ;
12
30
res . end ( ) ;
13
31
} else {
14
32
next ( ) ;
Original file line number Diff line number Diff line change @@ -10,21 +10,27 @@ module.exports = function(opts) {
10
10
. setex ( tempKey , opts . window ( ) , 0 )
11
11
. renamenx ( tempKey , realKey )
12
12
. incr ( realKey )
13
- . ttl ( realKey )
13
+ . pttl ( realKey )
14
14
. exec ( function ( err , results ) {
15
15
if ( err ) {
16
16
callback ( err ) ;
17
17
} else {
18
- if ( results [ 3 ] == - 1 ) { // automatically recover from possible race condition
19
- opts . redis . expire ( realKey , opts . window ( ) ) ;
18
+ var reset , ttl = results [ 3 ] ;
19
+ if ( ttl == - 1 ) { // automatically recover from possible race condition
20
+ opts . redis . expire ( realKey , opts . window ( ) ) ;
21
+ reset = Date . now ( ) + opts . window ( ) * 1000 ;
22
+ }
23
+ else {
24
+ reset = Date . now ( ) + ttl ;
20
25
}
21
26
var current = results [ 2 ] ;
22
27
callback ( null , {
23
28
key : key ,
24
29
current : current ,
25
30
limit : opts . limit ( ) ,
26
31
window : opts . window ( ) ,
27
- over : ( current > opts . limit ( ) )
32
+ over : ( current > opts . limit ( ) ) ,
33
+ reset : reset
28
34
} ) ;
29
35
}
30
36
} ) ;
You can’t perform that action at this time.
0 commit comments