示例#1
0
function api(opts) {
  opts = opts || {};
  var app = koa();

  // logging

  if ('test' != env) app.use(logger());

  // x-response-time

  app.use(responseTime());

  // compression

  app.use(compress());

  // rate limiting

  app.use(ratelimit({
    max: opts.ratelimit,
    duration: opts.duration,
    db: redis.createClient()
  }));

  // routing

  app.use(router(app));

  // boot

  load(app, __dirname + '/api');

  return app;
}
示例#2
0
/**
 * Initialize an app with the given `opts`.
 *
 * @param {Object} opts
 * @return {Application}
 * @api public
 */
function api(opts) {
  opts = opts || {};
  let app = koa();

  // Oauth2 server init & caching
  let oauthServer = oauth2orize.createServer();
  oauth.init(oauthServer);
  generateAccessToken.cacheOauthServer(oauthServer);

  // querystring
  require('koa-qs')(app);
  app.querystring = require('qs');

  app.use(body());

  app.use(cors({
    methods: 'GET,POST,PUT,PATCH,OPTIONS',
    headers: 'Authorization,Content-Type,Accept,Origin,User-Agent,DNT,Cache-Control,X-Mx-ReqToken,Keep-Alive,X-Requested-With,If-Modified-Since',
    maxAge: 300000,
    credentials: true
  }));

  // Logging
  if ('test' != env) app.use(logger());

  // Passport
  app.use(passport.initialize());

  // Enable app-wide authentication
  app.use(isAuthenticated());

  // Etag
  app.use(conditional());
  app.use(etag());

  // x-response-time
  app.use(responseTime());

  // compression
  app.use(compress());

  // rate limiting
  app.use(ratelimit({
    max: opts.ratelimit,
    duration: opts.duration,
    db: redis.hiringTicket
  }));

  // routing
  app.use(router(app));

  // Error handling
  app.use(error());

  // boot
  load(app, __dirname + '/api');

  return app;
}
示例#3
0
const router = new Router()
const app = new Koa()
const kitsu = new Kitsu()
const chrome = spawn('google-chrome')
chrome.stdout.on('data', (data) => { console.log(`stdout: ${data}`) })
chrome.stderr.on('data', (data) => { console.log(`stderr: ${data}`) })
chrome.on('close', (code) => { console.log(`exited: ${code}`) })
chrome.on('error', (err) => { console.log(`error: ${err}`) })

app.use(parser())
app.use(ratelimit({
  db: redis.createClient(process.env.REDIS_URL),
  duration: parseInt(process.env.RATELIMIT_DURATION),
  max: parseInt(process.env.RATELIMIT_MAX),
  id: (ctx) => {
    let { body } = ctx.request
    if (body.user_id) {
      return body.user_id
    } else return ctx.ip
  }
}))

router.use(async (ctx, next) => {
  try {
    let { method, body } = ctx.request
    let token = process.env.VERIFICATION
    if (method === 'POST') {
      let valid = true
      if (body.token) {
        valid = body.token === token
      } else {
示例#4
0
module.exports = function (port) {

  // inject sugarJS
  require('sugar');

  // npm dependencies
  let bodyParser = require('koa-body')({multipart: true}),
      koa = require('koa'),
      gzip = require('koa-gzip'),
      AWS = require('aws-sdk'),
      helmet = require('koa-helmet'),
      logger = require('koa-logger'),
      router = require('koa-router'),
      //session = require('koa-generic-session'),
      //RedisStore = require('koa-redis'),
      limit = require('koa-ratelimit'),
      redis = require('redis'),
      statics = require('koa-static'),
      path = require('path'),
      views = require('koa-render');

  let utils = require('./libs/utils')();

  // config AWS
  AWS.config.region = 'eu-west-1';
  let DynamoDB = new AWS.DynamoDB({ apiVersion: '2012-08-10' });
  let db = utils.wrap(DynamoDB);

  // config coolog
  require('coolog').addChannel({
    name: 'root',
    level: 'debug',
    appenders: ['console']
  });


  let app = koa();
  // logger
  app.use(logger());

  // session
  app.keys = [process.env.SECRET_KEY];

  /*app.use(session({
    store: new RedisStore({
      host: process.env.REDIS_HOST,
      port: process.env.REDIS_PORT
    })
  }));*/

  let redis_url = require('url').parse(process.env.REDIS_URL);
  let client = redis.createClient(redis_url.port, redis_url.hostname, {no_ready_check: true});
  //client.auth(redis_url.auth.split(":")[1]);

  app.use(limit({
    db: client,
    duration: 1000 * 60 * 60,
    max: 1000
  }));


  app.use(views('./views', 'jade'));

  // serve static files
  app.use(statics(__dirname + '/public'));

  // router

  app.use(router(app));
  //app.use(require('koa-router-newrelic')(app));

  // ## Website routes

  let website_routes = require('./routes/site')(db);
  let api_routes = require('./routes/api')(db);
  let error_routes = require('./routes/error')();
  let middleware = require('./middleware')();


  // website
  let website_prefix = '';
  app.get(path.join(website_prefix, '/'), website_routes.index);
  app.get(path.join(website_prefix, '/success/:api_key'), middleware.api_key, website_routes.form.success);
  app.get(path.join(website_prefix, '/deleted'), website_routes.form.deleted);
  app.get(path.join(website_prefix, '/signup'), website_routes.form.signup);
  app.get(path.join(website_prefix, '/delete/:api_key'), middleware.api_key, website_routes.form.del);
  app.get(path.join(website_prefix, '/edit/:api_key'), middleware.api_key, website_routes.form.edit);
  app.get(path.join(website_prefix, '/dashboard/:api_key'), middleware.api_key, website_routes.dashboard);
  app.get(path.join(website_prefix, '/confirm/email/confirmed/:api_key'), middleware.api_key, website_routes.confirmed_email);
  // website errors
  app.get(path.join(website_prefix, '/520'), error_routes.origin_error);
  app.get(path.join(website_prefix, '/404'), error_routes.not_found);
  app.get(path.join(website_prefix, '/500'), error_routes.server_error);

  let api_prefix = '/api';
  app.post(path.join(api_prefix, '/confirm/sms/:api_key'), bodyParser, api_routes.confirm_sms);
  app.get(path.join(api_prefix, '/confirm/send-sms/:api_key'), api_routes.send_confirm_sms);
  app.get(path.join(api_prefix, '/confirm/send-email/:api_key'), middleware.api_key, api_routes.send_confirm_email);
  app.post(path.join(api_prefix, '/new-form'), bodyParser, api_routes.form.create);
  app.post(path.join(api_prefix, '/form/:type/:api_key'), bodyParser, api_routes.form.get); //utils.rateLimit()
  app.post(path.join(api_prefix, '/edit/:api_key'), bodyParser, api_routes.form.edit);
  app.post(path.join(api_prefix, '/delete/:api_key'), bodyParser, api_routes.form.del);
  app.get(path.join(api_prefix, '/graph/:api_key'), bodyParser, api_routes.graph);

  app.get(path.join('/confirm/email/:api_key'), api_routes.confirm_email);

  // add security
  app.use(helmet.defaults());
  // compress responses
  app.use(gzip());

  // start server
  return app.listen(port);
};