http: refactor websocket handling.

This commit is contained in:
Christopher Jeffrey 2016-08-22 15:24:15 -07:00
parent 375699c6c5
commit 14da6a0875
No known key found for this signature in database
GPG Key ID: 8962AB9DE6666BBD

View File

@ -946,17 +946,17 @@ HTTPServer.prototype._initIO = function _initIO() {
socket.destroy(); socket.destroy();
}); });
socket.once('auth', function(apiKey, callback) { socket.on('auth', function(args, callback) {
if (typeof callback !== 'function') var apiKey = args[0];
return socket.destroy();
if (socket.auth)
return callback({ error: 'Already authed.' });
socket.stop(); socket.stop();
if (self.apiHash) { if (self.apiHash) {
if (!utils.ccmp(hash256(apiKey), self.apiHash)) { if (!utils.ccmp(hash256(apiKey), self.apiHash))
socket.destroy();
return callback({ error: 'Bad key.' }); return callback({ error: 'Bad key.' });
}
} }
socket.auth = true; socket.auth = true;
@ -976,9 +976,9 @@ HTTPServer.prototype._initIO = function _initIO() {
}); });
this.on('websocket', function(socket) { this.on('websocket', function(socket) {
socket.on('wallet join', function(id, token, callback) { socket.on('wallet join', function(args, callback) {
if (typeof callback !== 'function') var id = args[0];
return socket.destroy(); var token = args[1];
if (typeof id !== 'string') if (typeof id !== 'string')
return callback({ error: 'Invalid parameter.' }); return callback({ error: 'Invalid parameter.' });
@ -988,7 +988,7 @@ HTTPServer.prototype._initIO = function _initIO() {
return callback(); return callback();
} }
if (typeof token !== 'string') if (!utils.isHex256(token))
return callback({ error: 'Invalid parameter.' }); return callback({ error: 'Invalid parameter.' });
self.walletdb.auth(id, token, function(err, wallet) { self.walletdb.auth(id, token, function(err, wallet) {
@ -1008,9 +1008,8 @@ HTTPServer.prototype._initIO = function _initIO() {
}); });
}); });
socket.on('wallet leave', function(id, callback) { socket.on('wallet leave', function(args, callback) {
if (typeof callback !== 'function') var id = args[0];
return socket.destroy();
if (typeof id !== 'string') if (typeof id !== 'string')
return callback({ error: 'Invalid parameter.' }); return callback({ error: 'Invalid parameter.' });
@ -1020,48 +1019,57 @@ HTTPServer.prototype._initIO = function _initIO() {
callback(); callback();
}); });
socket.on('watch chain', function() { socket.on('watch chain', function(args, callback) {
socket.watchChain(); socket.watchChain();
callback();
}); });
socket.on('unwatch chain', function() { socket.on('unwatch chain', function(args, callback) {
socket.unwatchChain(); socket.unwatchChain();
callback();
}); });
socket.on('watch address', function(addresses) { socket.on('watch address', function(args, callback) {
var addresses = args[0];
if (!Array.isArray(addresses)) if (!Array.isArray(addresses))
return socket.destroy(); return callback({ error: 'Invalid parameter.' });
try { try {
socket.addFilter(addresses); socket.addFilter(addresses);
} catch (e) { } catch (e) {
return socket.destroy(); return callback({ error: e.message });
} }
callback();
}); });
socket.on('unwatch address', function(addresses) { socket.on('unwatch address', function(args, callback) {
var addresses = args[0];
if (!Array.isArray(addresses)) if (!Array.isArray(addresses))
return socket.destroy(); return callback({ error: 'Invalid parameter.' });
try { try {
socket.removeFilter(addresses); socket.removeFilter(addresses);
} catch (e) {
return socket.destroy();
}
});
socket.on('scan chain', function(start, callback) {
if (typeof callback !== 'function')
return socket.destroy();
if (typeof start !== 'string' && !utils.isNumber(start))
return callback({ error: 'Invalid parameter.' });
try {
socket.scan(start, callback);
} catch (e) { } catch (e) {
return callback({ error: e.message }); return callback({ error: e.message });
} }
callback();
});
socket.on('scan chain', function(args, callback) {
var start = args[0];
if (!utils.isHex256(start) && !utils.isNumber(start))
return callback({ error: 'Invalid parameter.' });
socket.scan(start, function(err) {
if (err)
return callback({ error: err.message });
callback();
});
}); });
}); });
@ -1232,7 +1240,16 @@ ClientSocket.prototype._init = function _init() {
socket.onevent = function(packet) { socket.onevent = function(packet) {
var result = onevent(packet); var result = onevent(packet);
var args = packet.data || []; var args = packet.data || [];
emit.apply(self, args); var event = args.shift();
var ack;
if (typeof args[args.length - 1] === 'function')
ack = args.pop();
else
ack = self.socket.ack(packet.id);
emit.apply(self, [event, args, ack]);
return result; return result;
}; };
@ -1381,12 +1398,9 @@ ClientSocket.prototype.scan = function scan(start, callback) {
txs[i] = txs[i].toJSON(); txs[i] = txs[i].toJSON();
self.emit('block tx', entry.toJSON(), txs); self.emit('block tx', entry.toJSON(), txs);
next(); next();
}, function(err) { }, callback);
if (err)
return callback({ error: err.message });
callback();
});
}; };
ClientSocket.prototype.join = function join(id) { ClientSocket.prototype.join = function join(id) {