From 9c90e0ee62b8f2cf02577bf77f57f24de134e558 Mon Sep 17 00:00:00 2001 From: cgeek <cem.moreau@gmail.com> Date: Mon, 1 Feb 2016 12:53:37 +0100 Subject: [PATCH] Fix: network layer issue --- app/lib/entity/block.js | 6 ++++- app/lib/entity/identity.js | 2 ++ app/lib/entity/membership.js | 2 ++ app/lib/entity/transaction.js | 2 ++ app/lib/streams/multicaster.js | 40 +++++++++++++++++++---------- app/lib/streams/parsers/http2raw.js | 9 ++++++- server.js | 4 +-- test/integration/identity-test.js | 2 +- 8 files changed, 48 insertions(+), 19 deletions(-) diff --git a/app/lib/entity/block.js b/app/lib/entity/block.js index cc82a3ee0..55314a71b 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 de3fec8c6..12d3ac695 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 b312451ab..29aff5343 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 f151958a5..1546fe074 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 dcb47b993..38ab9af89 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 a9fcfdc7f..8e9f937d7 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 30c82ebce..434e90dfb 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 b0d1f52d9..bbc8e9ea8 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); -- GitLab