snapper-core
Version:
Teambition push messaging service, backed by redis.
63 lines (52 loc) • 1.44 kB
JavaScript
const Toa = require('toa')
const pm = require('toa-pm')
const ilog = require('ilog')
const config = require('config')
const toaToken = require('toa-token')
const packageInfo = require('../package.json')
const ws = require('./service/ws')
const stats = require('./service/stats')
ilog.level = config.logLevel
const app = module.exports = Toa()
app.use(function * () {
let res = {
server: packageInfo.name,
version: packageInfo.version
}
if (this.path === '/stats') {
let token = this.token
if (token.name !== 'snapper') this.throw(400)
Object.assign(res, stats.os())
res.stats = yield stats.clientsStats()
}
this.body = res
})
config.instancePort = config.port + (+process.env.NODE_APP_INSTANCE || 0)
app.onerror = function (err) {
if (!err || err.status < 500) return
ilog.error(err)
}
app.isTokenError = function (err) {
return err instanceof toaToken.jwt.JsonWebTokenError
}
toaToken(app, config.tokenSecret, {
expiresInSeconds: config.expires,
getToken: function () {
// both authorization headers and signature query token.
return this.query.token
}
})
/**
* Start up service.
*/
app.listen(config.instancePort, config.backlog, function () {
ilog.info({
class: 'snapper-core',
listen: config.instancePort,
serverId: stats.serverId
})
})
ws(app)
// The server is finally closed and exit gracefully when all connections are ended.
pm(app)