ilp-core
Version:
ILP core module managing ledger abstraction
130 lines (108 loc) • 3.58 kB
JavaScript
"use strict"
const fs = require('fs')
const co = require('co')
const Koa = require('koa.io')
const body = require('koa-better-body')
const logger = require('koa-mag')
const session = require('koa-session')
const cors = require('kcors')
const errorHandler = require('five-bells-shared/middlewares/error-handler')
const Validator = require('five-bells-shared').Validator
const Config = require('./config')
const Auth = require('./auth')
const Router = require('./router')
const DB = require('./db')
const Log = require('./log')
const Ledger = require('./ledger')
const SPSP = require('./spsp')
const User = require('../models/user')
const Socket = require('./socket')
const Pay = require('./pay')
const Connector = require('./connector')
module.exports = class App {
static constitute () { return [ Config, Auth, Router, Validator, Ledger, SPSP, DB, Log, Socket, User, Pay, Connector ] }
constructor (config, auth, router, validator, ledger, spsp, db, log, socket, user, pay, connector) {
this.config = config
this.auth = auth
this.router = router
this.socket = socket
this.validator = validator
this.ledger = ledger
this.spsp = spsp
this.user = user
this.db = db
this.pay = pay
this.log = log('app')
this.connector = connector
validator.loadSchemasFromDirectory(__dirname + '/../../schemas')
const app = this.app = new Koa()
const uploadDir = __dirname + '/../../../uploads'
// Create uploads folder
try {
fs.mkdirSync(uploadDir)
} catch (err) {
// ignore if the folder already exists
if (err.code !== 'EEXIST') { throw err }
}
app.use(body({
multipart: false,
strict: false
}))
app.use(function *(next) {
if (this.request.method === 'POST' || this.request.method === 'PUT') {
// the parsed body will store in this.request.body
// if nothing was parsed, body will be an empty object {}
this.body = this.request.fields
}
yield next
})
app.use(logger({mag: log('http')}))
app.use(errorHandler({log: log('error-handler')}))
app.use(cors({origin: '*'}))
app.proxy = true
app.keys = [this.config.data.get('sessionSecret')]
app.use(session({
maxAge: 2592000000
}, app))
app.use(require('koa-static')(__dirname + '/../../../uploads'))
socket.attach(app)
auth.attach(app)
router.setupDefaultRoutes()
router.attach(app)
}
start() {
co(this._start.bind(this)).catch(err => {
this.log.critical(err)
})
}
* _start() {
if (this.db.options.dialect === 'sqlite') {
yield this.db.sync()
} else {
yield this.db.migrate()
}
// Ensure admin and connector accounts exists
const adminAccount = yield this.user.setupAdminAccount()
const connectorAccount = yield this.user.setupConnectorAccount()
this.listen()
yield this.connector.start()
// Initial connector funding
if (connectorAccount && connectorAccount.new) {
yield this.pay.pay({
user: adminAccount,
destination: connectorAccount.username,
quote: {
sourceAmount: 1000,
destinationAmount: 1000
},
message: 'Initial connector funding'
})
}
}
listen() {
this.app.listen(this.config.data.getIn(['server', 'port']))
this.log.info('wallet listening on ' + this.config.data.getIn(['server', 'bind_ip']) +
':' + this.config.data.getIn(['server', 'port']))
this.log.info('public at ' + this.config.data.getIn(['server', 'base_uri']))
}
}