add socket server test
This commit is contained in:
parent
9087701d99
commit
1d5af5bdad
|
@ -7,29 +7,47 @@ var mdb = require('../../lib/MessageDb').default();
|
|||
|
||||
module.exports.init = function(io_ext) {
|
||||
ios = io_ext;
|
||||
if (ios) {
|
||||
// when a new socket connects
|
||||
ios.sockets.on('connection', function(socket) {
|
||||
// when it subscribes, make it join the according room
|
||||
socket.on('subscribe', function(topic) {
|
||||
socket.join(topic);
|
||||
});
|
||||
|
||||
// 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 err; // TODO: handle
|
||||
if (err) {
|
||||
throw new Error('Couldn\'t add message to database: ' + err);
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
mdb.on('message', broadcastMessage);
|
||||
}
|
||||
};
|
||||
|
||||
module.exports.broadcastTx = function(tx) {
|
||||
if (ios) {
|
||||
var t;
|
||||
if (typeof tx === 'string') {
|
||||
t = {
|
||||
var simpleTx = function(tx) {
|
||||
return {
|
||||
txid: tx
|
||||
};
|
||||
} else {
|
||||
t = {
|
||||
};
|
||||
|
||||
var fullTx = function(tx) {
|
||||
var t = {
|
||||
txid: tx.txid,
|
||||
size: tx.size,
|
||||
};
|
||||
|
@ -40,7 +58,12 @@ module.exports.broadcastTx = function(tx) {
|
|||
});
|
||||
|
||||
t.valueOut = (valueOut.toFixed(8) / util.COIN);
|
||||
}
|
||||
return t;
|
||||
};
|
||||
|
||||
module.exports.broadcastTx = function(tx) {
|
||||
if (ios) {
|
||||
var t = (typeof tx === 'string') ? simpleTx(tx) : fullTx(tx);
|
||||
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="./bitcore.js"></script>
|
||||
<script>
|
||||
var fixedPK = prompt('Enter your private key or leave empty to generate one', 'a52e54d90c1ff4846e6f164e56405094cc96ecc0ea7732831e24418204c8ab55');
|
||||
|
||||
$(document).ready(function()
|
||||
{
|
||||
// load dependencies
|
||||
|
@ -69,6 +71,11 @@
|
|||
|
||||
// generate new identity
|
||||
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');
|
||||
$('#pubkey').text('Your key: '+pubkey);
|
||||
|
||||
|
@ -97,6 +104,7 @@
|
|||
|
||||
// receive chat handler
|
||||
socket.emit('subscribe', pubkey);
|
||||
socket.emit('sync', pubkey);
|
||||
socket.on('message', function(msg)
|
||||
{
|
||||
try {
|
||||
|
|
|
@ -13,7 +13,7 @@ var bitcore = require('bitcore');
|
|||
var AuthMessage = bitcore.AuthMessage;
|
||||
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 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());
|
||||
return MESSAGE_PREFIX + pubkey.toString() + '-' + to.toString() + '-' + ts;
|
||||
return MESSAGE_PREFIX + to.toString() + '-' + ts;
|
||||
};
|
||||
|
||||
MessageDb.prototype.addMessage = function(m, cb) {
|
||||
|
@ -67,7 +70,7 @@ MessageDb.prototype.addMessage = function(m, cb) {
|
|||
return;
|
||||
}
|
||||
|
||||
var key = messageKey(m.pubkey, m.to);
|
||||
var key = messageKey(m.to);
|
||||
var value = m;
|
||||
this.db.put(key, value, cb);
|
||||
};
|
||||
|
@ -85,20 +88,19 @@ MessageDb.prototype.authenticate = function(m) {
|
|||
|
||||
MessageDb.fromStorage = function(data) {
|
||||
var spl = data.key.split('-');
|
||||
var pubkey = spl[1];
|
||||
var to = spl[2];
|
||||
var ts = +spl[3];
|
||||
var to = spl[1];
|
||||
var ts = +spl[2];
|
||||
var message = data.value;
|
||||
message.ts = ts;
|
||||
message.to = to;
|
||||
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 opts = {
|
||||
end: messageKey(pubkey, to, lower_ts),
|
||||
start: messageKey(pubkey, to, upper_ts),
|
||||
end: messageKey(to, lower_ts),
|
||||
start: messageKey(to, upper_ts),
|
||||
// limit: limit, TODO
|
||||
reverse: true,
|
||||
};
|
||||
|
|
|
@ -49,7 +49,7 @@ describe('MessageDb', function() {
|
|||
mdb.addMessage(message, function(err) {
|
||||
expect(err).to.not.exist;
|
||||
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;
|
||||
messages.length.should.equal(1);
|
||||
messages[0].ts.should.be.below(upper_ts);
|
||||
|
@ -72,7 +72,7 @@ describe('MessageDb', function() {
|
|||
setTimeout(function() {
|
||||
mdb.addMessage(message3, function(err) {
|
||||
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;
|
||||
messages.length.should.equal(2);
|
||||
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