add socket server test

This commit is contained in:
Manuel Araoz 2014-08-05 13:04:38 -03:00
parent 9087701d99
commit 1d5af5bdad
5 changed files with 101 additions and 38 deletions

View File

@ -7,40 +7,63 @@ var mdb = require('../../lib/MessageDb').default();
module.exports.init = function(io_ext) { module.exports.init = function(io_ext) {
ios = io_ext; ios = io_ext;
ios.sockets.on('connection', function(socket) { if (ios) {
socket.on('subscribe', function(topic) { // when a new socket connects
socket.join(topic); ios.sockets.on('connection', function(socket) {
}); // when it subscribes, make it join the according room
socket.on('message', function(m) { socket.on('subscribe', function(topic) {
mdb.addMessage(m, function(err) { socket.join(topic);
if (err) throw err; // TODO: handle });
// when it requests sync, send him all pending messages
socket.on('sync', function(ts) {
mdb.getMessages(to, lower_ts, upper_ts, function(err, messages) {
if (err) {
throw new Error('Couldn\'t get messages on sync request: ' + err);
}
for (var i = 0; i < message.length; i++) {
broadcastMessage(messages[i]);
}
});
});
// when it sends a message, add it to db
socket.on('message', function(m) {
mdb.addMessage(m, function(err) {
if (err) {
throw new Error('Couldn\'t add message to database: ' + err);
}
});
}); });
}); });
mdb.on('message', broadcastMessage);
}
};
var simpleTx = function(tx) {
return {
txid: tx
};
};
var fullTx = function(tx) {
var t = {
txid: tx.txid,
size: tx.size,
};
// Outputs
var valueOut = 0;
tx.vout.forEach(function(o) {
valueOut += o.valueSat;
}); });
mdb.on('message', broadcastMessage); t.valueOut = (valueOut.toFixed(8) / util.COIN);
return t;
}; };
module.exports.broadcastTx = function(tx) { module.exports.broadcastTx = function(tx) {
if (ios) { if (ios) {
var t; var t = (typeof tx === 'string') ? simpleTx(tx) : fullTx(tx);
if (typeof tx === 'string') {
t = {
txid: tx
};
} else {
t = {
txid: tx.txid,
size: tx.size,
};
// Outputs
var valueOut = 0;
tx.vout.forEach(function(o) {
valueOut += o.valueSat;
});
t.valueOut = (valueOut.toFixed(8) / util.COIN);
}
ios.sockets.in('inv').emit('tx', t); ios.sockets.in('inv').emit('tx', t);
} }
}; };

View File

@ -57,6 +57,8 @@
<script src="http://code.jquery.com/jquery-1.11.1.js"></script> <script src="http://code.jquery.com/jquery-1.11.1.js"></script>
<script src="./bitcore.js"></script> <script src="./bitcore.js"></script>
<script> <script>
var fixedPK = prompt('Enter your private key or leave empty to generate one', 'a52e54d90c1ff4846e6f164e56405094cc96ecc0ea7732831e24418204c8ab55');
$(document).ready(function() $(document).ready(function()
{ {
// load dependencies // load dependencies
@ -69,6 +71,11 @@
// generate new identity // generate new identity
var pk = Key.generateSync(); var pk = Key.generateSync();
if (fixedPK) {
pk.private = new Buffer(fixedPK, 'hex');
pk.regenerateSync();
}
console.log(pk.private.toString('hex'));
var pubkey = pk.public.toString('hex'); var pubkey = pk.public.toString('hex');
$('#pubkey').text('Your key: '+pubkey); $('#pubkey').text('Your key: '+pubkey);
@ -97,6 +104,7 @@
// receive chat handler // receive chat handler
socket.emit('subscribe', pubkey); socket.emit('subscribe', pubkey);
socket.emit('sync', pubkey);
socket.on('message', function(msg) socket.on('message', function(msg)
{ {
try { try {

View File

@ -13,7 +13,7 @@ var bitcore = require('bitcore');
var AuthMessage = bitcore.AuthMessage; var AuthMessage = bitcore.AuthMessage;
var preconditions = require('preconditions').singleton(); var preconditions = require('preconditions').singleton();
var MESSAGE_PREFIX = 'msg-'; // msg-<sin1>-<sin2> => <message> var MESSAGE_PREFIX = 'msg-'; // msg-<recieving_pubkey>-<ts> => <message>
var MAX_OPEN_FILES = 500; var MAX_OPEN_FILES = 500;
var CONCURRENCY = 5; var CONCURRENCY = 5;
@ -55,9 +55,12 @@ MessageDb.prototype.close = function(cb) {
}; };
var messageKey = function(pubkey, to, ts) { var messageKey = function(to, ts) {
preconditions.checkArgument(typeof to === 'string');
preconditions.checkArgument(to.length === 66);
preconditions.checkArgument(!ts || typeof ts === 'number');
if (!ts) ts = Math.round(microtime.now()); if (!ts) ts = Math.round(microtime.now());
return MESSAGE_PREFIX + pubkey.toString() + '-' + to.toString() + '-' + ts; return MESSAGE_PREFIX + to.toString() + '-' + ts;
}; };
MessageDb.prototype.addMessage = function(m, cb) { MessageDb.prototype.addMessage = function(m, cb) {
@ -67,7 +70,7 @@ MessageDb.prototype.addMessage = function(m, cb) {
return; return;
} }
var key = messageKey(m.pubkey, m.to); var key = messageKey(m.to);
var value = m; var value = m;
this.db.put(key, value, cb); this.db.put(key, value, cb);
}; };
@ -85,20 +88,19 @@ MessageDb.prototype.authenticate = function(m) {
MessageDb.fromStorage = function(data) { MessageDb.fromStorage = function(data) {
var spl = data.key.split('-'); var spl = data.key.split('-');
var pubkey = spl[1]; var to = spl[1];
var to = spl[2]; var ts = +spl[2];
var ts = +spl[3];
var message = data.value; var message = data.value;
message.ts = ts; message.ts = ts;
message.to = to; message.to = to;
return message; return message;
}; };
MessageDb.prototype.getMessages = function(pubkey, to, lower_ts, upper_ts, cb) { MessageDb.prototype.getMessages = function(to, lower_ts, upper_ts, cb) {
var list = []; var list = [];
var opts = { var opts = {
end: messageKey(pubkey, to, lower_ts), end: messageKey(to, lower_ts),
start: messageKey(pubkey, to, upper_ts), start: messageKey(to, upper_ts),
// limit: limit, TODO // limit: limit, TODO
reverse: true, reverse: true,
}; };

View File

@ -49,7 +49,7 @@ describe('MessageDb', function() {
mdb.addMessage(message, function(err) { mdb.addMessage(message, function(err) {
expect(err).to.not.exist; expect(err).to.not.exist;
var upper_ts = microtime.now(); var upper_ts = microtime.now();
mdb.getMessages(from, to, lower_ts, upper_ts, function(err, messages) { mdb.getMessages(to, lower_ts, upper_ts, function(err, messages) {
expect(err).to.not.exist; expect(err).to.not.exist;
messages.length.should.equal(1); messages.length.should.equal(1);
messages[0].ts.should.be.below(upper_ts); messages[0].ts.should.be.below(upper_ts);
@ -72,7 +72,7 @@ describe('MessageDb', function() {
setTimeout(function() { setTimeout(function() {
mdb.addMessage(message3, function(err) { mdb.addMessage(message3, function(err) {
expect(err).to.not.exist; expect(err).to.not.exist;
mdb.getMessages(from, to, lower_ts, upper_ts, function(err, messages) { mdb.getMessages(to, lower_ts, upper_ts, function(err, messages) {
expect(err).to.not.exist; expect(err).to.not.exist;
messages.length.should.equal(2); messages.length.should.equal(2);
messages[0].ts.should.be.below(upper_ts); messages[0].ts.should.be.below(upper_ts);

View File

@ -0,0 +1,30 @@
'use strict';
var chai = require('chai');
var should = chai.should;
var expect = chai.expect;
var sinon = require('sinon');
var socket = require('../app/controllers/socket');
var bitcore = require('bitcore');
var EventEmitter = require('events').EventEmitter;
describe('socket server', function() {
it('should be able to call init with no args', function() {
socket.init.should.not.throw();
});
it('should register socket handlers', function() {
var io = {
sockets: new EventEmitter()
}
socket.init(io);
var mockSocket = {};
mockSocket.on = sinon.spy();
io.sockets.emit('connection', mockSocket);
mockSocket.on.calledWith('subscribe');
mockSocket.on.calledWith('sync');
mockSocket.on.calledWith('message');
});
});