diff --git a/app/lib/entity/block.js b/app/lib/entity/block.js index cc82a3ee04c0645737c34278fdf3edbc6fba73c2..55314a71b23c3e1dbd6685ae51e680e72a4c7b21 100644 --- a/app/lib/entity/block.js +++ b/app/lib/entity/block.js @@ -192,4 +192,8 @@ function Block(json) { }); return transactions; }; -} \ No newline at end of file +} + +Block.statics = {}; + +Block.statics.fromJSON = (json) => new Block(json); diff --git a/app/lib/entity/identity.js b/app/lib/entity/identity.js index de3fec8c6b0dc4dfbcc9fdb8558f14738055be0f..12d3ac695277989df31ffb8797db332a1abdf926 100644 --- a/app/lib/entity/identity.js +++ b/app/lib/entity/identity.js @@ -128,4 +128,6 @@ Identity.statics.toInline = function (entity) { return [entity.pubkey, entity.sig, moment(entity.time).unix(), entity.uid].join(':'); }; +Identity.statics.fromJSON = (json) => new Identity(json); + module.exports = Identity; diff --git a/app/lib/entity/membership.js b/app/lib/entity/membership.js index b312451abf0ee483629c7e2da2b8d4f18d4f1c10..29aff53439dc25acc8e96f40a3ee7baae3ecc559 100644 --- a/app/lib/entity/membership.js +++ b/app/lib/entity/membership.js @@ -90,4 +90,6 @@ Membership.statics.toInline = function (entity) { return [entity.issuer, entity.signature, entity.number, entity.fpr, moment(entity.certts).unix(), entity.userid].join(':'); }; +Membership.statics.fromJSON = (json) => new Membership(json); + module.exports = Membership; diff --git a/app/lib/entity/transaction.js b/app/lib/entity/transaction.js index f151958a5befac56237752aa8e1b331aa5830e9c..1546fe0741488d3900380cb6f610640e85e4ea6c 100644 --- a/app/lib/entity/transaction.js +++ b/app/lib/entity/transaction.js @@ -93,4 +93,6 @@ var Transaction = function(obj, currency) { Transaction.statics = {}; +Transaction.statics.fromJSON = (json) => new Transaction(json); + module.exports = Transaction; diff --git a/app/lib/streams/multicaster.js b/app/lib/streams/multicaster.js index dcb47b993891ae5d3fd523a4bb124c3b606fec35..38ab9af8967c27d6e37589ecdfd95fccd97cdb8e 100644 --- a/app/lib/streams/multicaster.js +++ b/app/lib/streams/multicaster.js @@ -6,6 +6,10 @@ var request = require('request'); var co = require('co'); var constants = require('../../lib/constants'); var Peer = require('../../lib/entity/peer'); +var Identity = require('../../lib/entity/identity'); +var Membership = require('../../lib/entity/membership'); +var Block = require('../../lib/entity/block'); +var Transaction = require('../../lib/entity/transaction'); var logger = require('../../lib/logger')('multicaster'); const WITH_ISOLATION = true; @@ -21,6 +25,7 @@ function Multicaster (isolate, timeout) { var that = this; let blockForward = forward({ + transform: Block.statics.fromJSON, type: 'Block', uri: '/blockchain/block', getObj: (block) => { @@ -32,6 +37,7 @@ function Multicaster (isolate, timeout) { }); let idtyForward = forward({ + transform: Identity.statics.fromJSON, type: 'Identity', uri: '/wot/add', getObj: (idty) => { @@ -45,6 +51,7 @@ function Multicaster (isolate, timeout) { }); let txForward = forward({ + transform: Transaction.statics.fromJSON, type: 'Transaction', uri: '/tx/process', getObj: (transaction) => { @@ -69,6 +76,7 @@ function Multicaster (isolate, timeout) { }); let msForward = forward({ + transform: Membership.statics.fromJSON, type: 'Membership', uri: '/blockchain/membership', getObj: (membership) => { @@ -96,22 +104,26 @@ function Multicaster (isolate, timeout) { function forward(params) { return function(doc, peers) { return co(function *() { - if(!params.withIsolation || !isolate) { - let theDoc = params.transform ? params.transform(doc) : doc; - logger.debug('--> new %s to be sent to %s peer(s)', params.type, peers.length); - if (params.getDocID) { - logger.info('POST %s %s', params.type, params.getDocID(theDoc)); + try { + if(!params.withIsolation || !isolate) { + let theDoc = params.transform ? params.transform(doc) : doc; + logger.debug('--> new %s to be sent to %s peer(s)', params.type, peers.length); + if (params.getDocID) { + logger.info('POST %s %s', params.type, params.getDocID(theDoc)); + } else { + logger.info('POST %s', params.type); + } + for (let i = 0, len = peers.length; i < len; i++) { + let p = peers[i]; + let peer = Peer.statics.peerize(p); + logger.debug(' `--> to peer %s [%s] (%s)', peer.keyID(), peer.member ? 'member' : '------', peer.getNamedURL()); + yield post(peer, params.uri, params.getObj(theDoc)); + } } else { - logger.info('POST %s', params.type); + logger.debug('[ISOLATE] Prevent --> new Peer to be sent to %s peer(s)', peers.length); } - for (let i = 0, len = peers.length; i < len; i++) { - let p = peers[i]; - let peer = Peer.statics.peerize(p); - logger.debug(' `--> to peer %s [%s] (%s)', peer.keyID(), peer.member ? 'member' : '------', peer.getNamedURL()); - yield post(peer, params.uri, params.getObj(theDoc)); - } - } else { - logger.debug('[ISOLATE] Prevent --> new Peer to be sent to %s peer(s)', peers.length); + } catch (err) { + logger.error(err); } }); }; diff --git a/app/lib/streams/parsers/http2raw.js b/app/lib/streams/parsers/http2raw.js index a9fcfdc7fc83c2eb860bcfc3ee349a7056942a37..8e9f937d7a58636f77008d72ac0f503c503260a8 100644 --- a/app/lib/streams/parsers/http2raw.js +++ b/app/lib/streams/parsers/http2raw.js @@ -73,7 +73,14 @@ function Http2RawMembership (req) { if(!(req.body && req.body.membership)){ throw constants.ERRORS.HTTP_PARAM_MEMBERSHIP_REQUIRED; } - return req.body.membership; + let ms = req.body.membership; + if(req.body && req.body.signature){ + ms = [ms, req.body.signature].join(''); + if (!ms.match(/\n$/)) { + ms += '\n'; + } + } + return ms; } function Http2RawBlock (req) { diff --git a/server.js b/server.js index 30c82ebce3996ab1c28828f435e3d8aa11dbb930..434e90dfb4c90b1dbe3a90da087726f0617cf06b 100644 --- a/server.js +++ b/server.js @@ -82,8 +82,8 @@ function Server (dbConf, overrideConf) { } if (res) { // Only emit valid documents - that.emit(obj.documentType, res); - that.push(res); + that.emit(obj.documentType, _.clone(res)); + that.push(_.clone(res)); } isInnerWrite ? done(null, res) : done(); } catch (err) { diff --git a/test/integration/identity-test.js b/test/integration/identity-test.js index b0d1f52d94f39f494d0a0d20569ee98bd241f422..bbc8e9ea835d20a46bdf6f56d56f5aa9e3d5e33f 100644 --- a/test/integration/identity-test.js +++ b/test/integration/identity-test.js @@ -360,7 +360,7 @@ describe("Identities", function() { it('difficulties', function() { return expectAnswer(rp('http://127.0.0.1:7799/blockchain/difficulties', { json: true }), function(res) { - res.should.have.property('block').equal(1); + res.should.have.property('block').equal(2); res.should.have.property('levels').length(1); res.levels[0].should.have.property('uid').equal('cat'); res.levels[0].should.have.property('level').equal(0);