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

Commit fca76b0

Browse files
committed
Adds core logic for ipfs init.
1 parent d01c82f commit fca76b0

File tree

8 files changed

+337
-10
lines changed

8 files changed

+337
-10
lines changed

default-config.json

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
{
2+
"Addresses": {
3+
"Swarm": [
4+
"/ip4/0.0.0.0/tcp/4001",
5+
"/ip6/::/tcp/4001"
6+
],
7+
"API": "/ip4/127.0.0.1/tcp/5001",
8+
"Gateway": "/ip4/127.0.0.1/tcp/8080"
9+
},
10+
"Discovery": {
11+
"MDNS": {
12+
"Enabled": true,
13+
"Interval": 10
14+
}
15+
},
16+
"Mounts": {
17+
"IPFS": "/ipfs",
18+
"IPNS": "/ipns"
19+
},
20+
"Ipns": {
21+
"ResolveCacheSize": 128
22+
},
23+
"Gateway": {
24+
"RootRedirect": "",
25+
"Writable": false
26+
},
27+
"Bootstrap": [
28+
"/ip4/104.131.131.82/tcp/4001/ipfs/QmaCpDMGvV2BGHeYERUEnRQAwe3N8SzbUtfsmvsqQLuvuJ",
29+
"/ip4/104.236.176.52/tcp/4001/ipfs/QmSoLnSGccFuZQJzRadHn95W2CrSFmZuTdDWP8HXaHca9z",
30+
"/ip4/104.236.179.241/tcp/4001/ipfs/QmSoLPppuBtQSGwKDZT2M73ULpjvfd3aZ6ha4oFGL1KrGM",
31+
"/ip4/162.243.248.213/tcp/4001/ipfs/QmSoLueR4xBeUbY9WZ9xGUUxunbKWcrNFTDAadQJmocnWm",
32+
"/ip4/128.199.219.111/tcp/4001/ipfs/QmSoLSafTMBsPKadTEgaXctDQVcqN88CNLHXMkTNwMKPnu",
33+
"/ip4/104.236.76.40/tcp/4001/ipfs/QmSoLV4Bbm51jM9C4gDYZQ9Cy3U6aXMJDAbzgu2fzaDs64",
34+
"/ip4/178.62.158.247/tcp/4001/ipfs/QmSoLer265NRgSp2LA3dPaeykiS1J6DifTC88f5uVQKNAd",
35+
"/ip4/178.62.61.185/tcp/4001/ipfs/QmSoLMeWqB7YGVLJN3pNLQpmmEk35v6wYtsMGLzSr5QBU3",
36+
"/ip4/104.236.151.122/tcp/4001/ipfs/QmSoLju6m7xTh3DuokvT3886QRYqxAzb1kShaanJgW36yx"
37+
]
38+
}

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@
8282
"hapi": "^12.0.0",
8383
"ipfs-api": "^2.13.1",
8484
"ipfs-blocks": "^0.1.0",
85-
"ipfs-data-importing": "^0.3.0",
85+
"ipfs-data-importing": "^0.3.3",
8686
"ipfs-merkle-dag": "^0.2.1",
8787
"ipfs-multipart": "^0.1.0",
8888
"ipfs-repo": "^0.5.0",

src/core/index.js

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

33
const defaultRepo = require('./default-repo')
4-
// const bl = require('bl')
54
const blocks = require('ipfs-blocks')
65
const BlockService = blocks.BlockService
76
const Block = blocks.Block
@@ -13,6 +12,7 @@ const PeerInfo = require('peer-info')
1312
const multiaddr = require('multiaddr')
1413
const importer = require('ipfs-data-importing').import
1514
const libp2p = require('libp2p-ipfs')
15+
const init = require('./init')
1616

1717
exports = module.exports = IPFS
1818

@@ -107,6 +107,8 @@ function IPFS (repo) {
107107
gc: function () {}
108108
}
109109

110+
this.init = (opts, callback) => { init(repo, opts, callback) }
111+
110112
this.bootstrap = {
111113
list: (callback) => {
112114
repo.config.get((err, config) => {

src/core/init.js

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
const peerId = require('peer-id')
2+
const IpfsBlocks = require('ipfs-blocks').BlockService
3+
const IpfsDagService = require('ipfs-merkle-dag').DAGService
4+
const path = require('path')
5+
6+
module.exports = (repo, opts, callback) => {
7+
opts = opts || {}
8+
opts.force = opts.force || false
9+
opts.emptyRepo = opts.emptyRepo || false
10+
opts.bits = opts.bits || 2048
11+
12+
// Pre-set config values.
13+
var config = require('../../default-config.json')
14+
15+
// Verify repo does not yet exist (or that 'force' is provided).
16+
repo.exists((err, res) => {
17+
if (err) { return callback(err) }
18+
if (res === true && !opts.force) {
19+
return callback(new Error('repo already exists and \'force\' is not set'))
20+
}
21+
22+
generateAndSetKeypair()
23+
})
24+
25+
// Generate peer identity keypair + transform to desired format + add to config.
26+
function generateAndSetKeypair () {
27+
var keys = peerId.create({
28+
bits: opts.bits
29+
})
30+
config.Identity = {
31+
PeerID: keys.toB58String(),
32+
PrivKey: keys.privKey.toString('base64')
33+
}
34+
35+
writeVersion()
36+
}
37+
38+
function writeVersion () {
39+
const version = '3'
40+
repo.version.set(version, (err) => {
41+
if (err) { return callback(err) }
42+
43+
writeConfig()
44+
})
45+
}
46+
47+
// Write the config to the repo.
48+
function writeConfig () {
49+
repo.config.set(config, (err) => {
50+
if (err) { return callback(err) }
51+
52+
addDefaultAssets()
53+
})
54+
}
55+
56+
// Add the default assets to the repo.
57+
function addDefaultAssets () {
58+
// Skip this step on the browser, or if emptyRepo was supplied.
59+
const isNode = !global.window
60+
if (!isNode || opts.emptyRepo) {
61+
return doneImport(null)
62+
}
63+
64+
const importer = require('ipfs-data-importing')
65+
const blocks = new IpfsBlocks(repo)
66+
const dag = new IpfsDagService(blocks)
67+
68+
const initDocsPath = path.join(__dirname, '../../init-doc')
69+
70+
importer.import(initDocsPath, dag, {
71+
recursive: true
72+
}, doneImport)
73+
74+
function doneImport (err, stat) {
75+
if (err) { return callback(err) }
76+
77+
// All finished!
78+
callback(null, true)
79+
}
80+
}
81+
}

tests/test-core/browser.js

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -48,12 +48,7 @@ describe('IPFS Repo Tests on the Browser', function () {
4848
testsContext
4949
.keys()
5050
.filter((key) => {
51-
if (key === './test-swarm-node.js' ||
52-
key === './test-swarm-node') {
53-
return false
54-
} else {
55-
return true
56-
}
51+
return !(key.endsWith('-node.js') || key.endsWith('-node'))
5752
})
5853
.forEach((key) => {
5954
testsContext(key)

tests/test-core/index.js

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,7 @@ describe('core', () => {
2727
const tests = fs.readdirSync(__dirname)
2828
tests.filter((file) => {
2929
if (file === 'index.js' ||
30-
file === 'browser.js' ||
31-
file === 'test-swarm-browser.js') {
30+
file.endsWith('browser.js')) {
3231
return false
3332
} else {
3433
return true

tests/test-core/test-init-node.js

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
/* eslint-env mocha */
2+
3+
const expect = require('chai').expect
4+
const IPFS = require('../../src/core')
5+
const IPFSRepo = require('ipfs-repo')
6+
7+
function createTestRepo () {
8+
const repoPath = '/tmp/ipfs-test-' + Math.random().toString().substring(2, 8) + '/'
9+
10+
var store
11+
var teardown
12+
13+
const isNode = !global.window
14+
if (isNode) {
15+
store = require('fs-blob-store')
16+
teardown = (done) => {
17+
const rimraf = require('rimraf')
18+
rimraf(repoPath, (err) => {
19+
expect(err).to.not.exist
20+
done()
21+
})
22+
}
23+
} else {
24+
const idb = window.indexedDB ||
25+
window.mozIndexedDB ||
26+
window.webkitIndexedDB ||
27+
window.msIndexedDB
28+
store = require('idb-plus-blob-store')
29+
teardown = (done) => {
30+
idb.deleteDatabase(repoPath)
31+
idb.deleteDatabase(repoPath + '/blocks')
32+
done()
33+
}
34+
}
35+
36+
const options = {
37+
bits: 64,
38+
stores: {
39+
keys: store,
40+
config: store,
41+
datastore: store,
42+
logs: store,
43+
locks: store,
44+
version: store
45+
}
46+
}
47+
48+
var repo = new IPFSRepo(repoPath, options)
49+
50+
repo.teardown = teardown
51+
52+
return repo
53+
}
54+
55+
describe('node: init', function () {
56+
this.timeout(10000)
57+
58+
it('init docs written', (done) => {
59+
var repo = createTestRepo()
60+
const ipfs = new IPFS(repo)
61+
ipfs.init({ bits: 64 }, (err) => {
62+
expect(err).to.not.exist
63+
64+
// Check for default assets
65+
var multihash = new Buffer('12205e7c3ce237f936c76faf625e90f7751a9f5eeb048f59873303c215e9cce87599', 'hex')
66+
ipfs.object.get(multihash, {}, (err, node) => {
67+
expect(err).to.not.exist
68+
expect(node.links).to.exist
69+
70+
repo.teardown(done)
71+
})
72+
})
73+
})
74+
75+
it('empty repo', (done) => {
76+
var repo = createTestRepo()
77+
const ipfs = new IPFS(repo)
78+
ipfs.init({ bits: 64, emptyRepo: true }, (err) => {
79+
expect(err).to.not.exist
80+
81+
// Check for default assets
82+
var multihash = new Buffer('12205e7c3ce237f936c76faf625e90f7751a9f5eeb048f59873303c215e9cce87599', 'hex')
83+
ipfs.object.get(multihash, {}, (err, node) => {
84+
expect(err).to.exist
85+
repo.teardown(done)
86+
})
87+
})
88+
})
89+
})

tests/test-core/test-init.js

Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
1+
/* eslint-env mocha */
2+
3+
const expect = require('chai').expect
4+
const IPFS = require('../../src/core')
5+
const IPFSRepo = require('ipfs-repo')
6+
7+
function createTestRepo () {
8+
const repoPath = '/tmp/ipfs-test-' + Math.random().toString().substring(2, 8) + '/'
9+
10+
var store
11+
var teardown
12+
13+
const isNode = !global.window
14+
if (isNode) {
15+
store = require('fs-blob-store')
16+
teardown = (done) => {
17+
const rimraf = require('rimraf')
18+
rimraf(repoPath, (err) => {
19+
expect(err).to.not.exist
20+
done()
21+
})
22+
}
23+
} else {
24+
const idb = window.indexedDB ||
25+
window.mozIndexedDB ||
26+
window.webkitIndexedDB ||
27+
window.msIndexedDB
28+
store = require('idb-plus-blob-store')
29+
teardown = (done) => {
30+
idb.deleteDatabase(repoPath)
31+
idb.deleteDatabase(repoPath + '/blocks')
32+
done()
33+
}
34+
}
35+
36+
const options = {
37+
bits: 64,
38+
stores: {
39+
keys: store,
40+
config: store,
41+
datastore: store,
42+
logs: store,
43+
locks: store,
44+
version: store
45+
}
46+
}
47+
48+
var repo = new IPFSRepo(repoPath, options)
49+
50+
repo.teardown = teardown
51+
52+
return repo
53+
}
54+
55+
describe('init', function () {
56+
this.timeout(10000)
57+
58+
it('basic', (done) => {
59+
var repo = createTestRepo()
60+
const ipfs = new IPFS(repo)
61+
ipfs.init({ emptyRepo: true }, (err) => {
62+
expect(err).to.not.exist
63+
64+
repo.exists((err, res) => {
65+
expect(err).to.not.exist
66+
expect(res).to.equal(true)
67+
68+
repo.config.get((err, config) => {
69+
expect(err).to.not.exist
70+
expect(config.Identity).to.exist
71+
72+
repo.teardown(done)
73+
})
74+
})
75+
})
76+
})
77+
78+
it('set # of bits in key', (done) => {
79+
var repo1 = createTestRepo()
80+
var repo2 = createTestRepo()
81+
const ipfsShort = new IPFS(repo1)
82+
const ipfsLong = new IPFS(repo2)
83+
ipfsShort.init({ bits: 128, emptyRepo: true }, (err) => {
84+
expect(err).to.not.exist
85+
86+
ipfsLong.init({ bits: 256, emptyRepo: true }, (err) => {
87+
expect(err).to.not.exist
88+
89+
repo1.config.get((err, config1) => {
90+
expect(err).to.not.exist
91+
92+
repo2.config.get((err, config2) => {
93+
expect(err).to.not.exist
94+
expect(config1.Identity.PrivKey.length).is.below(config2.Identity.PrivKey.length)
95+
96+
repo1.teardown(() => {
97+
repo2.teardown(done)
98+
})
99+
})
100+
})
101+
})
102+
})
103+
})
104+
105+
it('force init (overwrite)', (done) => {
106+
var repo = createTestRepo()
107+
const ipfs1 = new IPFS(repo)
108+
const ipfs2 = new IPFS(repo)
109+
ipfs1.init({ bits: 128, emptyRepo: true }, (err) => {
110+
expect(err).to.not.exist
111+
112+
ipfs2.init({ bits: 128, force: false }, (err) => {
113+
expect(err).to.exist
114+
115+
ipfs2.init({ force: true }, (err) => {
116+
expect(err).to.not.exist
117+
118+
repo.teardown(done)
119+
})
120+
})
121+
})
122+
})
123+
})

0 commit comments

Comments
 (0)