add socket server test
This commit is contained in:
parent
9087701d99
commit
1d5af5bdad
|
@ -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);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -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,
|
||||||
};
|
};
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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');
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
Loading…
Reference in New Issue