Skip to content
This repository was archived by the owner on Feb 12, 2024. It is now read-only.

Commit df06062

Browse files
wip
1 parent 30bc5db commit df06062

File tree

20 files changed

+438
-230
lines changed

20 files changed

+438
-230
lines changed

gulpfile.js

Lines changed: 14 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -16,16 +16,16 @@ let nodes = []
1616
function spawnDaemon (num, callback) {
1717
num = leftPad(num, 3, 0)
1818

19-
const node = new IPFS({
20-
repo: createTempRepo(),
21-
init: {
22-
bits: 1024
23-
},
24-
start: false,
25-
EXPERIMENTAL: {
26-
pubsub: true
27-
},
28-
config: {
19+
// const node = new IPFS({
20+
// repo: createTempRepo(),
21+
// init: {
22+
// bits: 1024
23+
// },
24+
// start: false,
25+
// EXPERIMENTAL: {
26+
// pubsub: true
27+
// },
28+
const config = {
2929
Addresses: {
3030
Swarm: [
3131
`/ip4/127.0.0.1/tcp/10${num}`,
@@ -40,13 +40,11 @@ function spawnDaemon (num, callback) {
4040
}
4141
}
4242
}
43-
})
43+
// })
4444

45-
setTimeout(() => {
46-
const daemon = new HTTPAPI(node._repo)
47-
nodes.push(daemon)
48-
setTimeout(() => daemon.start(callback), 400)
49-
}, 800)
45+
const daemon = new HTTPAPI(createTempRepo(), config)
46+
nodes.push(daemon)
47+
daemon.start(true, callback)
5048
}
5149

5250
gulp.task('libnode:start', (done) => {

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,7 @@
120120
"lodash.set": "^4.3.2",
121121
"lodash.sortby": "^4.7.0",
122122
"lodash.values": "^4.3.0",
123+
"machina": "^2.0.0",
123124
"mafmt": "^2.1.6",
124125
"mkdirp": "^0.5.1",
125126
"multiaddr": "^2.2.2",

src/cli/bin.js

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,13 @@ aliases.forEach((alias) => {
2828
cli.command(alias.command, alias.describe, alias.builder, alias.handler)
2929
})
3030

31+
const args = process.argv.slice(2)
32+
33+
// Need to skip to avoid locking the daemon
34+
if (args[0] === 'daemon') {
35+
return cli.help().strict(false).completion().parse(args)
36+
}
37+
3138
utils.getIPFS((err, ipfs, cleanup) => {
3239
if (err) {
3340
throw err
@@ -38,7 +45,7 @@ utils.getIPFS((err, ipfs, cleanup) => {
3845
.help()
3946
.strict(false)
4047
.completion()
41-
.parse(process.argv.slice(2), {
48+
.parse(args, {
4249
ipfs: ipfs
4350
}, (err, argv, output) => {
4451
cleanup(() => {

src/cli/commands/daemon.js

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,6 @@
11
'use strict'
22

33
const HttpAPI = require('../../http-api')
4-
const debug = require('debug')
5-
const log = debug('cli:daemon')
6-
log.error = debug('cli:daemon:error')
74

85
let httpAPI
96

src/cli/commands/init.js

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -35,17 +35,15 @@ module.exports = {
3535
start: false
3636
})
3737

38-
node.once('ready', () => {
39-
node.init({
40-
bits: argv.bits,
41-
emptyRepo: argv.emptyRepo,
42-
log: log
43-
}, (err) => {
44-
if (err) {
45-
console.error(err.toString())
46-
process.exit(1)
47-
}
48-
})
38+
node.init({
39+
bits: argv.bits,
40+
emptyRepo: argv.emptyRepo,
41+
log: log
42+
}, (err) => {
43+
if (err) {
44+
console.error(err.toString())
45+
process.exit(1)
46+
}
4947
})
5048
}
5149
}

src/cli/utils.js

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,9 +55,12 @@ exports.getIPFS = (callback) => {
5555
cb()
5656
}
5757
}
58-
node.once('ready', () => {
59-
node.preStart(() => callback(null, node, cleanup))
58+
59+
node.on('error', (err) => {
60+
throw err
6061
})
62+
63+
callback(null, node, cleanup)
6164
}
6265

6366
exports.getRepoPath = () => {

src/core/boot.js

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
'use strict'
2+
3+
const waterfall = require('async/waterfall')
4+
const series = require('async/series')
5+
const extend = require('deep-extend')
6+
7+
// Boot an IPFS node depending on the options set
8+
module.exports = (self) => {
9+
self.log('booting')
10+
const options = self._options
11+
const doInit = options.init
12+
const doStart = options.start
13+
const config = options.config
14+
const setConfig = config && typeof config === 'object'
15+
const repoOpen = !self._repo.closed
16+
17+
const customInitOptions = typeof options.init === 'object' ? options.init : {}
18+
const initOptions = Object.assign({
19+
bits: 2048
20+
}, customInitOptions)
21+
22+
const maybeOpenRepo = (cb) => {
23+
waterfall([
24+
(cb) => self._repo.exists(cb),
25+
(exists, cb) => {
26+
if (exists && !repoOpen) {
27+
return self._repo.open(cb)
28+
}
29+
cb()
30+
}
31+
], cb)
32+
}
33+
34+
const done = (err) => {
35+
if (err) {
36+
self.emit('error', err)
37+
}
38+
self.log('boot:done', err)
39+
}
40+
41+
const tasks = []
42+
43+
if (doInit) {
44+
self.log('boot:doInit')
45+
tasks.push((cb) => self.init(initOptions, cb))
46+
next(null, true)
47+
} else if (!repoOpen) {
48+
self._repo.exists(next)
49+
}
50+
51+
function next (err, hasRepo) {
52+
self.log('boot:next')
53+
if (err) {
54+
return done(err)
55+
}
56+
57+
if (hasRepo && !doInit) {
58+
self.log('boot:maybeopenreop')
59+
tasks.push(maybeOpenRepo)
60+
}
61+
62+
if (setConfig) {
63+
self.log('boot:setConfig')
64+
// if (!hasRepo) {
65+
// console.log('WARNING, trying to set config on uninitialized repo, maybe forgot to set "init: true"')
66+
// } else {
67+
tasks.push((cb) => {
68+
waterfall([
69+
(cb) => self.config.get(cb),
70+
(config, cb) => {
71+
extend(config, options.config)
72+
self.config.replace(config, cb)
73+
}
74+
], cb)
75+
})
76+
// }
77+
}
78+
79+
if (doStart) {
80+
self.log('boot:doStart')
81+
// if (!hasRepo) {
82+
// console.log('WARNING, trying to start ipfs node on uninitialized repo, maybe forgot to set "init: true"')
83+
// return done(new Error('Uninitalized repo'))
84+
// } else {
85+
tasks.push((cb) => self.start(cb))
86+
// }
87+
}
88+
89+
series(tasks, done)
90+
}
91+
}

src/core/components/init.js

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,14 @@ const addDefaultAssets = require('./init-assets')
99

1010
module.exports = function init (self) {
1111
return (opts, callback) => {
12-
self.log('init')
1312
if (typeof opts === 'function') {
1413
callback = opts
1514
opts = {}
1615
}
1716

17+
self.state.init()
18+
self.log('init')
19+
1820
opts.emptyRepo = opts.emptyRepo || false
1921
opts.bits = Number(opts.bits) || 2048
2022
opts.log = opts.log || function () {}
@@ -48,7 +50,7 @@ module.exports = function init (self) {
4850

4951
self._repo.init(config, cb)
5052
},
51-
(_, cb) => self._repo.open(cb),
53+
(cb) => self._repo.open(cb),
5254
(cb) => {
5355
self.log('repo opened')
5456
if (opts.emptyRepo) {
@@ -77,8 +79,10 @@ module.exports = function init (self) {
7779
self.log('init failed', err)
7880
return callback(err)
7981
}
82+
self._state.daemon = 'initialized'
8083
self.emit('init')
8184
self.log('init done')
85+
self.state.initialized()
8286
callback(null, res)
8387
})
8488
}

src/core/components/pre-start.js

Lines changed: 39 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -11,31 +11,45 @@ const mafmt = require('mafmt')
1111
*/
1212
module.exports = function preStart (self) {
1313
return (callback) => {
14-
waterfall([
15-
(cb) => self._repo.config.get(cb),
16-
(config, cb) => {
17-
const privKey = config.Identity.PrivKey
18-
19-
peerId.createFromPrivKey(privKey, (err, id) => {
20-
cb(err, config, id)
21-
})
22-
},
23-
(config, id, cb) => {
24-
self._peerInfo = new PeerInfo(id)
25-
26-
config.Addresses.Swarm.forEach((addr) => {
27-
let ma = multiaddr(addr)
28-
29-
if (!mafmt.IPFS.matches(ma)) {
30-
ma = ma.encapsulate('/ipfs/' +
31-
self._peerInfo.id.toB58String())
32-
}
33-
34-
self._peerInfo.multiaddr.add(ma)
35-
})
36-
37-
cb()
14+
if (self._repo.closed) {
15+
if (self._awaitInit) {
16+
self._repo.once('init', start)
17+
} else {
18+
self._repo.once('open', start)
3819
}
39-
], callback)
20+
} else {
21+
start()
22+
}
23+
24+
function start () {
25+
self.log('pre-start')
26+
27+
waterfall([
28+
(cb) => self._repo.config.get(cb),
29+
(config, cb) => {
30+
const privKey = config.Identity.PrivKey
31+
32+
peerId.createFromPrivKey(privKey, (err, id) => {
33+
cb(err, config, id)
34+
})
35+
},
36+
(config, id, cb) => {
37+
self._peerInfo = new PeerInfo(id)
38+
39+
config.Addresses.Swarm.forEach((addr) => {
40+
let ma = multiaddr(addr)
41+
42+
if (!mafmt.IPFS.matches(ma)) {
43+
ma = ma.encapsulate('/ipfs/' +
44+
self._peerInfo.id.toB58String())
45+
}
46+
47+
self._peerInfo.multiaddr.add(ma)
48+
})
49+
50+
cb()
51+
}
52+
], callback)
53+
}
4054
}
4155
}

0 commit comments

Comments
 (0)