This commit is contained in:
Josh Harvey 2014-05-02 10:25:39 -04:00
parent 2d0938c1e5
commit d2cb7e8a07
7 changed files with 44 additions and 36 deletions

View file

@ -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

View file

@ -2,13 +2,12 @@
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();
@ -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
View 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});

View file

@ -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();
}; };

View file

@ -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) {

View file

@ -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
};
}; };

View file

@ -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",