WIP
This commit is contained in:
parent
2d0938c1e5
commit
d2cb7e8a07
7 changed files with 44 additions and 36 deletions
|
|
@ -2,6 +2,7 @@
|
||||||
var fs = require('fs');
|
var fs = require('fs');
|
||||||
var createServer = require('../lib/app.js');
|
var createServer = require('../lib/app.js');
|
||||||
var argv = require('optimist').argv;
|
var argv = require('optimist').argv;
|
||||||
|
var logger = require('../lib/logger');
|
||||||
|
|
||||||
var options = {
|
var options = {
|
||||||
postgres: process.env.DATABASE_URL
|
postgres: process.env.DATABASE_URL
|
||||||
|
|
|
||||||
11
lib/app.js
11
lib/app.js
|
|
@ -2,14 +2,13 @@
|
||||||
|
|
||||||
var http = require('http');
|
var http = require('http');
|
||||||
var https = require('https');
|
var https = require('https');
|
||||||
var path = require('path');
|
|
||||||
var express = require('express');
|
var express = require('express');
|
||||||
var fs = require('fs');
|
|
||||||
var LamassuConfig = require('lamassu-config');
|
var LamassuConfig = require('lamassu-config');
|
||||||
var routes = require('./routes');
|
var routes = require('./routes');
|
||||||
var Trader = require('./trader');
|
var Trader = require('./trader');
|
||||||
var PostgresqlInterface = require('./postgresql_interface');
|
var PostgresqlInterface = require('./postgresql_interface');
|
||||||
|
var logger = require('./logger');
|
||||||
|
|
||||||
module.exports = function (options) {
|
module.exports = function (options) {
|
||||||
var app = express();
|
var app = express();
|
||||||
var connectionString;
|
var connectionString;
|
||||||
|
|
@ -27,7 +26,7 @@ module.exports = function (options) {
|
||||||
|
|
||||||
config.load(function (err, config) {
|
config.load(function (err, config) {
|
||||||
if (err) {
|
if (err) {
|
||||||
console.error('Loading config failed');
|
logger.error('Loading config failed');
|
||||||
throw err;
|
throw err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -38,11 +37,11 @@ module.exports = function (options) {
|
||||||
config.on('configUpdate', function () {
|
config.on('configUpdate', function () {
|
||||||
config.load(function (err, config) {
|
config.load(function (err, config) {
|
||||||
if (err) {
|
if (err) {
|
||||||
return console.error('Error while reloading config');
|
return logger.error('Error while reloading config');
|
||||||
}
|
}
|
||||||
|
|
||||||
trader.configure(config);
|
trader.configure(config);
|
||||||
console.log('Config reloaded');
|
logger.info('Config reloaded');
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
||||||
7
lib/logger.js
Normal file
7
lib/logger.js
Normal file
|
|
@ -0,0 +1,7 @@
|
||||||
|
var bunyan = require('bunyan');
|
||||||
|
|
||||||
|
var logLevel = process.env.LAMASSU_ENV === 'debug' ?
|
||||||
|
'debug' :
|
||||||
|
'info';
|
||||||
|
|
||||||
|
module.exports = bunyan.createLogger({name: 'lamassu-server', level: logLevel});
|
||||||
|
|
@ -1,6 +1,8 @@
|
||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
var pg = require('pg');
|
var pg = require('pg');
|
||||||
|
var logger = require('./logger');
|
||||||
|
|
||||||
var PG_ERRORS = {
|
var PG_ERRORS = {
|
||||||
23505: 'uniqueViolation'
|
23505: 'uniqueViolation'
|
||||||
};
|
};
|
||||||
|
|
@ -11,9 +13,7 @@ var PostgresqlInterface = function (conString) {
|
||||||
}
|
}
|
||||||
|
|
||||||
this.client = new pg.Client(conString);
|
this.client = new pg.Client(conString);
|
||||||
|
this.client.on('error', function (err) { logger.error(err); });
|
||||||
// TODO better logging
|
|
||||||
this.client.on('error', function (err) { console.log(err); });
|
|
||||||
|
|
||||||
this.client.connect();
|
this.client.connect();
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,7 @@
|
||||||
|
|
||||||
var _trader;
|
var _trader;
|
||||||
var _lamassuConfig;
|
var _lamassuConfig;
|
||||||
|
var logger = require('./logger');
|
||||||
|
|
||||||
// Make sure these are higher than polling interval
|
// Make sure these are higher than polling interval
|
||||||
// or there will be a lot of errors
|
// or there will be a lot of errors
|
||||||
|
|
@ -22,6 +23,8 @@ var poll = function(req, res) {
|
||||||
var balanceRec = _trader.balance;
|
var balanceRec = _trader.balance;
|
||||||
var fingerprint = req.connection.getPeerCertificate().fingerprint;
|
var fingerprint = req.connection.getPeerCertificate().fingerprint;
|
||||||
|
|
||||||
|
logger.debug('poll request from: %s', fingerprint);
|
||||||
|
|
||||||
// `rateRec` and `balanceRec` are both objects, so there's no danger
|
// `rateRec` and `balanceRec` are both objects, so there's no danger
|
||||||
// of misinterpreting rate or balance === 0 as 'Server initializing'.
|
// of misinterpreting rate or balance === 0 as 'Server initializing'.
|
||||||
if (!rateRec || !balanceRec) {
|
if (!rateRec || !balanceRec) {
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
var path = require('path');
|
var path = require('path');
|
||||||
var async = require('async');
|
var async = require('async');
|
||||||
var winston = require('winston');
|
var logger = require('./logger');
|
||||||
|
|
||||||
var SATOSHI_FACTOR = Math.pow(10, 8);
|
var SATOSHI_FACTOR = Math.pow(10, 8);
|
||||||
|
|
||||||
|
|
@ -16,13 +16,6 @@ var Trader = module.exports = function (db) {
|
||||||
|
|
||||||
this.db = db;
|
this.db = db;
|
||||||
this.rates = {};
|
this.rates = {};
|
||||||
var logLevel = process.env.LAMASSU_ENV === 'debug' ?
|
|
||||||
'debug' :
|
|
||||||
'info';
|
|
||||||
this.logger = new (winston.Logger)({
|
|
||||||
transports: [new (winston.transports.Console)({level: logLevel})]
|
|
||||||
});
|
|
||||||
|
|
||||||
this._tradeQueue = [];
|
this._tradeQueue = [];
|
||||||
this._sessionInfo = {};
|
this._sessionInfo = {};
|
||||||
};
|
};
|
||||||
|
|
@ -81,8 +74,12 @@ Trader.prototype._consolidateTrades = function () {
|
||||||
|
|
||||||
Trader.prototype._purchase = function (trade, cb) {
|
Trader.prototype._purchase = function (trade, cb) {
|
||||||
var self = this;
|
var self = this;
|
||||||
var rate = self.rate(trade.currency);
|
var tradeCurrency = this.tradeExchange.currency();
|
||||||
self.tradeExchange.purchase(trade.satoshis, rate.rate, function (err) {
|
var rate = this.rate(tradeCurrency).rate;
|
||||||
|
console.dir(this.rates);
|
||||||
|
console.log(rate);
|
||||||
|
console.log(tradeCurrency);
|
||||||
|
this.tradeExchange.purchase(trade.satoshis, rate, function (err) {
|
||||||
if (err) return cb(err);
|
if (err) return cb(err);
|
||||||
self.pollBalance();
|
self.pollBalance();
|
||||||
cb();
|
cb();
|
||||||
|
|
@ -233,27 +230,26 @@ Trader.prototype.trade = function (rec, deviceFingerprint) {
|
||||||
Trader.prototype.executeTrades = function () {
|
Trader.prototype.executeTrades = function () {
|
||||||
if (!this.tradeExchange) return;
|
if (!this.tradeExchange) return;
|
||||||
|
|
||||||
this.logger.debug('checking for trades');
|
logger.debug('checking for trades');
|
||||||
|
|
||||||
var trade = this._consolidateTrades();
|
var trade = this._consolidateTrades();
|
||||||
this.logger.debug('consolidated: ', JSON.stringify(trade));
|
logger.debug('consolidated: ', JSON.stringify(trade));
|
||||||
|
|
||||||
if (trade.fiat === 0) {
|
if (trade.fiat === 0) {
|
||||||
this.logger.debug('rejecting 0 trade');
|
logger.debug('rejecting 0 trade');
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (trade.fiat < this.config.exchanges.settings.minimumTradeFiat) {
|
if (trade.fiat < this.config.exchanges.settings.minimumTradeFiat) {
|
||||||
// throw it back in the water
|
// throw it back in the water
|
||||||
this.logger.debug('reject fiat too small');
|
logger.debug('reject fiat too small');
|
||||||
this._tradeQueue.unshift(trade);
|
this._tradeQueue.unshift(trade);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
this.logger.debug('making a trade: %d', trade.satoshis / Math.pow(10, 8));
|
logger.debug('making a trade: %d', trade.satoshis / Math.pow(10, 8));
|
||||||
var self = this;
|
|
||||||
this._purchase(trade, function (err) {
|
this._purchase(trade, function (err) {
|
||||||
if (err) self.logger.error(err);
|
if (err) logger.error(err);
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -281,7 +277,7 @@ Trader.prototype.stopPolling = function () {
|
||||||
Trader.prototype.pollBalance = function (callback) {
|
Trader.prototype.pollBalance = function (callback) {
|
||||||
var self = this;
|
var self = this;
|
||||||
|
|
||||||
self.logger.debug('collecting balance');
|
logger.debug('collecting balance');
|
||||||
|
|
||||||
async.parallel({
|
async.parallel({
|
||||||
transferBalance: self.transferExchange.balance.bind(self.transferExchange),
|
transferBalance: self.transferExchange.balance.bind(self.transferExchange),
|
||||||
|
|
@ -298,7 +294,7 @@ Trader.prototype.pollBalance = function (callback) {
|
||||||
}
|
}
|
||||||
|
|
||||||
balance.timestamp = Date.now();
|
balance.timestamp = Date.now();
|
||||||
self.logger.debug('Balance update:', balance);
|
logger.debug('Balance update:', balance);
|
||||||
self.balance = balance;
|
self.balance = balance;
|
||||||
|
|
||||||
return callback && callback(null, balance);
|
return callback && callback(null, balance);
|
||||||
|
|
@ -308,19 +304,20 @@ Trader.prototype.pollBalance = function (callback) {
|
||||||
Trader.prototype.pollRate = function (callback) {
|
Trader.prototype.pollRate = function (callback) {
|
||||||
var self = this;
|
var self = this;
|
||||||
|
|
||||||
var currency = self.config.exchanges.settings.currency;
|
logger.debug('polling for rates...');
|
||||||
self.logger.debug('polling for rate...');
|
self.tickerExchange.ticker(function(err, resRates) {
|
||||||
self.tickerExchange.ticker(currency, function(err, rate) {
|
|
||||||
if (err) {
|
if (err) {
|
||||||
return callback && callback(err);
|
return callback && callback(err);
|
||||||
}
|
}
|
||||||
|
|
||||||
self.logger.debug('Rate update:', rate);
|
self.rateInfo = {rates: resRates, timestamp: new Date()};
|
||||||
self.rates[currency] = {rate: rate, timestamp: new Date()};
|
|
||||||
return callback && callback(null, self.rates[currency]);
|
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// This is the rate in local currency quote to the user
|
||||||
Trader.prototype.rate = function () {
|
Trader.prototype.rate = function () {
|
||||||
return this.rates[this.config.exchanges.settings.currency];
|
return {
|
||||||
|
rate: this.rateInfo.rates[this.config.exchanges.settings.currency],
|
||||||
|
timestamp: this.rateInfo.timestamp
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -24,7 +24,8 @@
|
||||||
"lamassu-bitstamp": "0.0.4",
|
"lamassu-bitstamp": "0.0.4",
|
||||||
"lamassu-mtgox": "~0.0.1",
|
"lamassu-mtgox": "~0.0.1",
|
||||||
"lamassu-blockchain": "~0.1.0",
|
"lamassu-blockchain": "~0.1.0",
|
||||||
"morgan": "~1.0.0"
|
"morgan": "~1.0.0",
|
||||||
|
"bunyan": "~0.22.3"
|
||||||
},
|
},
|
||||||
"repository": {
|
"repository": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue