@@ -10,13 +10,14 @@ const conditional = require('koa-conditional-get');
1010const etag = require ( 'koa-etag' ) ;
1111const compress = require ( 'koa-compress' ) ;
1212const responseTime = require ( 'koa-response-time' ) ;
13- const rateLimit = require ( 'koa-simple-ratelimit' ) ;
13+ const rateLimiter = require ( 'koa-simple-ratelimit' ) ;
1414const koaLogger = require ( 'koa-logger' ) ;
1515const bodyParser = require ( 'koa-bodyparser' ) ;
1616const koa404Handler = require ( 'koa-404-handler' ) ;
1717const json = require ( 'koa-json' ) ;
1818const errorHandler = require ( 'koa-better-error-handler' ) ;
1919const helmet = require ( 'koa-helmet' ) ;
20+ const cors = require ( 'kcors' ) ;
2021const removeTrailingSlashes = require ( 'koa-no-trailing-slash' ) ;
2122const redis = require ( 'redis' ) ;
2223const StoreIPAddress = require ( '@ladjs/store-ip-address' ) ;
@@ -27,11 +28,20 @@ const { oneLine } = require('common-tags');
2728
2829const env = process . env . NODE_ENV || 'development' ;
2930
30- let max = process . env . RATELIMIT_MAX
31- ? parseInt ( process . env . RATELIMIT_MAX , 10 )
32- : 100 ;
33-
34- if ( ! process . env . RATELIMIT_MAX && env === 'development' ) max = Number . MAX_VALUE ;
31+ let rateLimit = {
32+ duration : process . env . RATELIMIT_DURATION
33+ ? parseInt ( process . env . RATELIMIT_DURATION , 10 )
34+ : 60000 ,
35+ max : process . env . RATELIMIT_MAX
36+ ? parseInt ( process . env . RATELIMIT_MAX , 10 )
37+ : 100 ,
38+ id : ctx => ctx . ip ,
39+ prefix : process . env . RATELIMIT_PREFIX
40+ ? process . env . RATELIMIT_PREFIX
41+ : `limit_${ env . toLowerCase ( ) } `
42+ } ;
43+
44+ if ( env === 'development' ) rateLimit = false ;
3545
3646class Server {
3747 constructor ( config ) {
@@ -54,16 +64,9 @@ class Server {
5464 logger : console ,
5565 passport : false ,
5666 i18n : { } ,
57- rateLimit : {
58- duration : process . env . RATELIMIT_DURATION
59- ? parseInt ( process . env . RATELIMIT_DURATION , 10 )
60- : 60000 ,
61- max,
62- id : ctx => ctx . ip ,
63- prefix : process . env . RATELIMIT_PREFIX
64- ? process . env . RATELIMIT_PREFIX
65- : `limit_${ env . toLowerCase ( ) } `
66- } ,
67+ rateLimit,
68+ // <https://github.com/koajs/cors#corsoptions>
69+ cors : { } ,
6770 timeoutMs : process . env . API_TIMEOUT_MS
6871 ? parseInt ( process . env . API_TIMEOUT_MS , 10 )
6972 : 2000
@@ -123,19 +126,26 @@ class Server {
123126 app . use ( koaLogger ( { logger } ) ) ;
124127
125128 // rate limiting
126- app . use (
127- rateLimit ( {
128- ...this . config . rateLimit ,
129- db : redisClient
130- } )
131- ) ;
129+ if ( this . config . rateLimit )
130+ app . use (
131+ rateLimiter ( {
132+ ...this . config . rateLimit ,
133+ db : redisClient
134+ } )
135+ ) ;
132136
133137 // conditional-get
134138 app . use ( conditional ( ) ) ;
135139
136140 // etag
137141 app . use ( etag ( ) ) ;
138142
143+ // cors
144+ if ( this . config . cors ) app . use ( cors ( this . config . cors ) ) ;
145+
146+ // TODO: add `cors-gate`
147+ // <https://github.com/mixmaxhq/cors-gate/issues/6>
148+
139149 // security
140150 app . use ( helmet ( ) ) ;
141151
@@ -180,6 +190,8 @@ class Server {
180190 if ( this . config . routes ) {
181191 if ( _ . isFunction ( this . config . routes . routes ) )
182192 app . use ( this . config . routes . routes ( ) ) ;
193+ if ( _ . isFunction ( this . config . routes . allowedMethods ) )
194+ app . use ( this . config . routes . allowedMethods ( ) ) ;
183195 else app . use ( this . config . routes ) ;
184196 }
185197
0 commit comments