From 686099dba3f282ffae56a00305c5519bdb09f714 Mon Sep 17 00:00:00 2001 From: Friedel Ziegelmayer Date: Mon, 20 Mar 2017 18:02:15 +0100 Subject: [PATCH] =?UTF-8?q?working=C2=A0\o/?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- gulpfile.js | 37 ++++------ src/cli/bin.js | 2 +- src/cli/utils.js | 4 +- src/core/boot.js | 26 ++++--- src/core/components/init.js | 27 +++++--- src/core/components/pre-start.js | 66 ++++++++---------- src/core/components/start.js | 92 +++++++++++-------------- src/core/components/stop.js | 52 +++++++------- src/core/index.js | 1 - src/core/state.js | 38 +--------- test/core/create-node.spec.js | 24 +++---- test/utils/ipfs-factory-daemon/index.js | 18 ----- 12 files changed, 151 insertions(+), 236 deletions(-) diff --git a/gulpfile.js b/gulpfile.js index c77cf79d42..4b415223a2 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -4,7 +4,6 @@ const gulp = require('gulp') const parallel = require('async/parallel') const series = require('async/series') const createTempRepo = require('./test/utils/create-repo-node.js') -const IPFS = require('./src/core') const HTTPAPI = require('./src/http-api') const leftPad = require('left-pad') @@ -16,31 +15,21 @@ let nodes = [] function spawnDaemon (num, callback) { num = leftPad(num, 3, 0) - // const node = new IPFS({ - // repo: createTempRepo(), - // init: { - // bits: 1024 - // }, - // start: false, - // EXPERIMENTAL: { - // pubsub: true - // }, - const config = { - Addresses: { - Swarm: [ - `/ip4/127.0.0.1/tcp/10${num}`, - `/ip4/127.0.0.1/tcp/20${num}/ws` - ], - API: `/ip4/127.0.0.1/tcp/31${num}`, - Gateway: `/ip4/127.0.0.1/tcp/32${num}` - }, - Discovery: { - MDNS: { - Enabled: false - } + const config = { + Addresses: { + Swarm: [ + `/ip4/127.0.0.1/tcp/10${num}`, + `/ip4/127.0.0.1/tcp/20${num}/ws` + ], + API: `/ip4/127.0.0.1/tcp/31${num}`, + Gateway: `/ip4/127.0.0.1/tcp/32${num}` + }, + Discovery: { + MDNS: { + Enabled: false } } - // }) + } const daemon = new HTTPAPI(createTempRepo(), config) nodes.push(daemon) diff --git a/src/cli/bin.js b/src/cli/bin.js index 9a53571474..6085d3dfdf 100755 --- a/src/cli/bin.js +++ b/src/cli/bin.js @@ -31,7 +31,7 @@ aliases.forEach((alias) => { const args = process.argv.slice(2) // Need to skip to avoid locking the daemon -if (args[0] === 'daemon') { +if (args[0] === 'daemon' || args[0] === 'init') { return cli.help().strict(false).completion().parse(args) } diff --git a/src/cli/utils.js b/src/cli/utils.js index c75564519c..6af62979c7 100644 --- a/src/cli/utils.js +++ b/src/cli/utils.js @@ -60,7 +60,9 @@ exports.getIPFS = (callback) => { throw err }) - callback(null, node, cleanup) + node.once('ready', () => { + callback(null, node, cleanup) + }) } exports.getRepoPath = () => { diff --git a/src/core/boot.js b/src/core/boot.js index de25238c1d..9735072f68 100644 --- a/src/core/boot.js +++ b/src/core/boot.js @@ -24,7 +24,10 @@ module.exports = (self) => { (cb) => self._repo.exists(cb), (exists, cb) => { if (exists && !repoOpen) { - return self._repo.open(cb) + return series([ + (cb) => self._repo.open(cb), + (cb) => self.preStart(cb) + ], cb) } cb() } @@ -35,6 +38,7 @@ module.exports = (self) => { if (err) { self.emit('error', err) } + self.emit('ready') self.log('boot:done', err) } @@ -61,10 +65,10 @@ module.exports = (self) => { if (setConfig) { self.log('boot:setConfig') - // if (!hasRepo) { - // console.log('WARNING, trying to set config on uninitialized repo, maybe forgot to set "init: true"') - // } else { - tasks.push((cb) => { + if (!hasRepo) { + console.log('WARNING, trying to set config on uninitialized repo, maybe forgot to set "init: true"') + } else { + tasks.push((cb) => { waterfall([ (cb) => self.config.get(cb), (config, cb) => { @@ -73,17 +77,17 @@ module.exports = (self) => { } ], cb) }) - // } + } } if (doStart) { self.log('boot:doStart') - // if (!hasRepo) { - // console.log('WARNING, trying to start ipfs node on uninitialized repo, maybe forgot to set "init: true"') - // return done(new Error('Uninitalized repo')) - // } else { + if (!hasRepo) { + console.log('WARNING, trying to start ipfs node on uninitialized repo, maybe forgot to set "init: true"') + return done(new Error('Uninitalized repo')) + } else { tasks.push((cb) => self.start(cb)) - // } + } } series(tasks, done) diff --git a/src/core/components/init.js b/src/core/components/init.js index 0b63b28d9a..e46b3242b5 100644 --- a/src/core/components/init.js +++ b/src/core/components/init.js @@ -14,6 +14,21 @@ module.exports = function init (self) { opts = {} } + const done = (err, res) => { + if (err) { + self.emit('error', err) + return callback(err) + } + + self.state.initialized() + self.emit('init') + callback(null, res) + } + + if (self.state.state !== 'uninitalized') { + return done(new Error('Not able to init from state: ' + self.state.state)) + } + self.state.init() self.log('init') @@ -74,16 +89,6 @@ module.exports = function init (self) { cb(null, true) }) } - ], (err, res) => { - if (err) { - self.log('init failed', err) - return callback(err) - } - self._state.daemon = 'initialized' - self.emit('init') - self.log('init done') - self.state.initialized() - callback(null, res) - }) + ], done) } } diff --git a/src/core/components/pre-start.js b/src/core/components/pre-start.js index d6f4498fb8..afec5a7cc8 100644 --- a/src/core/components/pre-start.js +++ b/src/core/components/pre-start.js @@ -11,45 +11,33 @@ const mafmt = require('mafmt') */ module.exports = function preStart (self) { return (callback) => { - if (self._repo.closed) { - if (self._awaitInit) { - self._repo.once('init', start) - } else { - self._repo.once('open', start) + self.log('pre-start') + + waterfall([ + (cb) => self._repo.config.get(cb), + (config, cb) => { + const privKey = config.Identity.PrivKey + + peerId.createFromPrivKey(privKey, (err, id) => { + cb(err, config, id) + }) + }, + (config, id, cb) => { + self._peerInfo = new PeerInfo(id) + + config.Addresses.Swarm.forEach((addr) => { + let ma = multiaddr(addr) + + if (!mafmt.IPFS.matches(ma)) { + ma = ma.encapsulate('/ipfs/' + + self._peerInfo.id.toB58String()) + } + + self._peerInfo.multiaddr.add(ma) + }) + + cb() } - } else { - start() - } - - function start () { - self.log('pre-start') - - waterfall([ - (cb) => self._repo.config.get(cb), - (config, cb) => { - const privKey = config.Identity.PrivKey - - peerId.createFromPrivKey(privKey, (err, id) => { - cb(err, config, id) - }) - }, - (config, id, cb) => { - self._peerInfo = new PeerInfo(id) - - config.Addresses.Swarm.forEach((addr) => { - let ma = multiaddr(addr) - - if (!mafmt.IPFS.matches(ma)) { - ma = ma.encapsulate('/ipfs/' + - self._peerInfo.id.toB58String()) - } - - self._peerInfo.multiaddr.add(ma) - }) - - cb() - } - ], callback) - } + ], callback) } } diff --git a/src/core/components/start.js b/src/core/components/start.js index 8bc713ff6f..fdb398d1ef 100644 --- a/src/core/components/start.js +++ b/src/core/components/start.js @@ -3,67 +3,59 @@ const series = require('async/series') const Bitswap = require('ipfs-bitswap') const FloodSub = require('libp2p-floodsub') -const once = require('once') module.exports = (self) => { return (callback) => { - callback = once(callback) || function noop () {} - self.once('error', callback) - self.once('start', callback) + callback = callback || function noop () {} - if (self.state.state !== 'stopped') { - self.log('sub', self.state.state) - const sub = self.state.on('stopped', () => { - sub.off() - start() - }) - } else { - start() + const done = (err) => { + if (err) { + self.emit('error', err) + return callback(err) + } + + self.state.started() + self.emit('start') + callback() } - function start () { - self.log('starting') - self.state.start() - const done = (err) => { - if (err) { - return self.emit('error', err) - } + if (self.state.state !== 'stopped') { + return done(new Error('Not able to start from state: ' + self.state.state)) + } - self.state.started() - self.emit('start') - } + self.log('starting') + self.state.start() - series([ - (cb) => { - if (self._repo.closed) { - self._repo.open(cb) - } else { - cb() - } - }, - (cb) => self.preStart(cb), - (cb) => self.libp2p.start(cb) - ], (err) => { - if (err) { - return done(err) + series([ + (cb) => { + if (self._repo.closed) { + self._repo.open(cb) + } else { + cb() } + }, + (cb) => self.preStart(cb), + (cb) => self.libp2p.start(cb) + ], (err) => { + if (err) { + return done(err) + } - self._bitswap = new Bitswap( - self._libp2pNode, - self._repo.blockstore, - self._peerInfoBook - ) + self._bitswap = new Bitswap( + self._libp2pNode, + self._repo.blockstore, + self._peerInfoBook + ) - self._bitswap.start() - self._blockService.goOnline(self._bitswap) + self._bitswap.start() + self._blockService.goOnline(self._bitswap) - if (self._options.EXPERIMENTAL.pubsub) { - self._pubsub = new FloodSub(self._libp2pNode) - self._pubsub.start(done) - } else { - done() - } - }) - } + if (self._options.EXPERIMENTAL.pubsub) { + self._pubsub = new FloodSub(self._libp2pNode) + self._pubsub.start(done) + } else { + done() + } + }) } } diff --git a/src/core/components/stop.js b/src/core/components/stop.js index 1e7b9f92ca..e7ca4eb963 100644 --- a/src/core/components/stop.js +++ b/src/core/components/stop.js @@ -7,38 +7,34 @@ module.exports = (self) => { callback = callback || function noop () {} self.log('stop', self._repo.closed, self._awaitInit) + const done = (err) => { + if (err) { + self.emit('error', err) + return callback(err) + } + self.state.stopped() + self.emit('stop') + callback() + } + if (self.state.state !== 'running') { - const sub = self.state.on('running', () => { - sub.off() - stop() - }) - } else { - stop() + return done(new Error('')) } - function stop () { - self.state.stop() - self._blockService.goOffline() - self._bitswap.stop() + self.state.stop() + self._blockService.goOffline() + self._bitswap.stop() - series([ - (cb) => { - if (self._options.EXPERIMENTAL.pubsub) { - self._pubsub.stop(cb) - } else { - cb() - } - }, - (cb) => self.libp2p.stop(cb), - (cb) => self._repo.close(cb) - ], (err) => { - if (err) { - return callback(err) + series([ + (cb) => { + if (self._options.EXPERIMENTAL.pubsub) { + self._pubsub.stop(cb) + } else { + cb() } - self.state.stopped() - self.emit('stop') - callback() - }) - } + }, + (cb) => self.libp2p.stop(cb), + (cb) => self._repo.close(cb) + ], done) } } diff --git a/src/core/index.js b/src/core/index.js index 1287378704..9a349a94f8 100644 --- a/src/core/index.js +++ b/src/core/index.js @@ -97,7 +97,6 @@ class IPFS extends EventEmitter { if (this._options.EXPERIMENTAL.pubsub) { this.log('EXPERIMENTAL pubsub is enabled') } - this.state = require('./state')(this) boot(this) diff --git a/src/core/state.js b/src/core/state.js index 0805cd8b6e..b91daf456c 100644 --- a/src/core/state.js +++ b/src/core/state.js @@ -1,37 +1,9 @@ 'use strict' const machina = require('machina') -const repoStates = [ - 'initializing', - 'initialized', - 'opening', - 'open', - 'closing', - 'closed' -] module.exports = (self) => { - // Track the state of the repo - // const repo = new machina.Fsm({ - // initialize () { - // repoStates.forEach((s) => { - // self._repo.on(s, () => this.transition(s)) - // }) - // }, - // namespace: 'jsipfs:repo', - // initialValue: 'uninitalized', - // states: { - // uninitalized: {}, - // initializing: {}, - // initialized: {}, - // opening: {}, - // open: {}, - // closing: {}, - // closed: {} - // } - // }) - - const node = new machina.Fsm({ + return new machina.Fsm({ namespace: 'jsipfs', initialState: 'uninitalized', states: { @@ -42,18 +14,12 @@ module.exports = (self) => { initialized: 'stopped' }, stopped: { - _onEnter () { - this.emit('stopped') - }, start: 'starting' }, starting: { started: 'running' }, running: { - _onEnter () { - this.emit('running') - }, stop: 'stopping' }, stopping: { @@ -79,6 +45,4 @@ module.exports = (self) => { this.handle('started') } }) - - return node } diff --git a/test/core/create-node.spec.js b/test/core/create-node.spec.js index 2270d38d38..f2404b522c 100644 --- a/test/core/create-node.spec.js +++ b/test/core/create-node.spec.js @@ -15,7 +15,7 @@ const IPFS = require('../../src/core') // in the browser const createTempRepo = require('../utils/create-repo-node.js') -describe.only('create node', () => { +describe('create node', () => { it('custom repoPath', (done) => { const node = new IPFS({ repo: '/tmp/ipfs-repo-' + Math.random() @@ -91,8 +91,7 @@ describe.only('create node', () => { }) }) - // this does not throw currently - it.skip('init: false errors (start default: true)', (done) => { + it('init: false errors (start default: true)', (done) => { const node = new IPFS({ repo: createTempRepo(), init: false @@ -137,9 +136,7 @@ describe.only('create node', () => { node.once('stop', done) node.once('start', () => node.stop()) - node.once('init', () => { - node.start() - }) + node.once('init', () => node.start()) }) it('init: true, start: false, use callback', (done) => { @@ -181,19 +178,16 @@ describe.only('create node', () => { }) }) - it.only('start and stop, start and stop', (done) => { + it('start and stop, start and stop', (done) => { const node = new IPFS({ repo: createTempRepo() }) - const l = (text, inner) => { - console.log('doing ' + text) - return inner - } + series([ - (cb) => l('start', node.once('start', cb)), - (cb) => l('stop', node.stop(cb)), - (cb) => l('start', node.start(cb)), - (cb) => l('stop', node.stop(cb)) + (cb) => node.once('start', cb), + (cb) => node.stop(cb), + (cb) => node.start(cb), + (cb) => node.stop(cb) ], done) }) }) diff --git a/test/utils/ipfs-factory-daemon/index.js b/test/utils/ipfs-factory-daemon/index.js index 691f3349ea..66e275d14e 100644 --- a/test/utils/ipfs-factory-daemon/index.js +++ b/test/utils/ipfs-factory-daemon/index.js @@ -2,7 +2,6 @@ const PeerId = require('peer-id') const IPFSAPI = require('ipfs-api') -const IPFS = require('../../../src/core') const clean = require('../clean') const HTTPAPI = require('../../../src/http-api') const series = require('async/series') @@ -33,7 +32,6 @@ class Factory { let daemon let ctl - let node series([ (cb) => { @@ -56,22 +54,6 @@ class Factory { }) }, (cb) => { - // // create the node - // node = new IPFS({ - // repo: repoPath, - // start: false, - // config: config, - // EXPERIMENTAL: { - // pubsub: true - // } - // }) - // node.once('error', (err) => { - // throw err - // }) - // cb() - // }, - // (cb) => { - // create the daemon daemon = new HTTPAPI(repoPath, config) daemon.repoPath = repoPath this.daemonsSpawned.push(daemon)