From 451cfe70fe6d746c6a5077e86e08cef229d895a4 Mon Sep 17 00:00:00 2001 From: Alan Shaw Date: Fri, 27 Jul 2018 12:13:39 +0100 Subject: [PATCH 1/2] fix: emit boot error only once `init` and `start` both emit any error they encounter. `boot` will then receive that error and also emit it! This PR adds an `emitted` property in `boot` to errors that came from `init` or `start` so that later in the code it knows whether to emit it or not! License: MIT Signed-off-by: Alan Shaw --- src/core/boot.js | 21 +++++++++++++++++---- test/core/create-node.spec.js | 26 ++++++++++++++++++++------ 2 files changed, 37 insertions(+), 10 deletions(-) diff --git a/src/core/boot.js b/src/core/boot.js index 0602cb90a0..50b2677b5c 100644 --- a/src/core/boot.js +++ b/src/core/boot.js @@ -30,7 +30,10 @@ module.exports = (self) => { (repoOpened, cb) => { // Init with existing initialized, opened, repo if (repoOpened) { - return self.init({ repo: self._repo }, (err) => cb(err)) + return self.init({ repo: self._repo }, (err) => { + if (err) return cb(Object.assign(err, { emitted: true })) + cb() + }) } if (doInit) { @@ -38,7 +41,10 @@ module.exports = (self) => { { bits: 2048, pass: self._options.pass }, typeof options.init === 'object' ? options.init : {} ) - return self.init(initOptions, (err) => cb(err)) + return self.init(initOptions, (err) => { + if (err) return cb(Object.assign(err, { emitted: true })) + cb() + }) } cb() @@ -48,11 +54,18 @@ module.exports = (self) => { if (!doStart) { return cb() } - self.start(cb) + + self.start((err) => { + if (err) return cb(Object.assign(err, { emitted: true })) + cb() + }) } ], (err) => { if (err) { - return self.emit('error', err) + if (!err.emitted) { + self.emit('error', err) + } + return } self.log('booted') self.emit('ready') diff --git a/test/core/create-node.spec.js b/test/core/create-node.spec.js index 5dcb86ace2..1aa07dc215 100644 --- a/test/core/create-node.spec.js +++ b/test/core/create-node.spec.js @@ -19,7 +19,7 @@ const IPFS = require('../../src/core') // This gets replaced by `create-repo-browser.js` in the browser const createTempRepo = require('../utils/create-repo-nodejs.js') -describe('create node', function () { +describe.only('create node', function () { it('custom repoPath', function (done) { this.timeout(80 * 1000) @@ -123,7 +123,7 @@ describe('create node', function () { }) }) - it('init: false errors (start default: true)', function (done) { + it('init: false errors (start default: true) and errors only once', function (done) { this.timeout(80 * 1000) const node = new IPFS({ @@ -135,10 +135,24 @@ describe('create node', function () { } } }) - node.once('error', (err) => { - expect(err).to.exist() - done() - }) + + const shouldHappenOnce = () => { + let timeoutId = null + + return (err) => { + expect(err).to.exist() + + // Bad news, this handler has been executed before + if (timeoutId) { + clearTimeout(timeoutId) + return done(new Error('error handler called multiple times')) + } + + timeoutId = setTimeout(done, 100) + } + } + + node.on('error', shouldHappenOnce()) }) it('init: false, start: false', function (done) { From 5a7bc4b5ba2ccc9e310d6059d37b51c2523dcacc Mon Sep 17 00:00:00 2001 From: Alan Shaw Date: Fri, 27 Jul 2018 12:18:31 +0100 Subject: [PATCH 2/2] chore: remove .only License: MIT Signed-off-by: Alan Shaw --- test/core/create-node.spec.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/core/create-node.spec.js b/test/core/create-node.spec.js index 1aa07dc215..1d4b43ab2f 100644 --- a/test/core/create-node.spec.js +++ b/test/core/create-node.spec.js @@ -19,7 +19,7 @@ const IPFS = require('../../src/core') // This gets replaced by `create-repo-browser.js` in the browser const createTempRepo = require('../utils/create-repo-nodejs.js') -describe.only('create node', function () { +describe('create node', function () { it('custom repoPath', function (done) { this.timeout(80 * 1000)