diff --git a/package.json b/package.json index c7b7f25a..901dd95b 100644 --- a/package.json +++ b/package.json @@ -39,7 +39,7 @@ "npm": ">=3.0.0" }, "devDependencies": { - "aegir": "^11.0.0", + "aegir": "^11.0.1", "chai": "^3.5.0", "dirty-chai": "^1.2.2", "lodash": "^4.17.4", @@ -53,13 +53,13 @@ "async": "^2.1.5", "base32.js": "^0.1.0", "cids": "^0.4.2", - "datastore-core": "^0.1.0", - "datastore-fs": "^0.1.1", - "datastore-level": "^0.1.0", + "datastore-core": "^0.2.0", + "datastore-fs": "^0.2.0", + "datastore-level": "^0.3.0", "debug": "^2.6.3", - "interface-datastore": "^0.1.1", + "interface-datastore": "^0.2.0", "ipfs-block": "~0.6.0", - "level-js": "^2.2.4", + "level-js": "timkuijsten/level.js#idbunwrapper", "leveldown": "^1.6.0", "lock-me": "^1.0.2", "multiaddr": "^2.2.2", @@ -81,4 +81,4 @@ "nginnever ", "npmcdn-to-unpkg-bot " ] -} \ No newline at end of file +} diff --git a/src/index.js b/src/index.js index 334a58f3..26d62e7e 100644 --- a/src/index.js +++ b/src/index.js @@ -54,7 +54,6 @@ class IpfsRepo { lock: 'fs' }, options) this._fsOptions = Object.assign({}, options.fsOptions) - const FsStore = this.options.fs this._fsStore = new FsStore(this.path, Object.assign({}, this._fsOptions, { extension: '' @@ -81,7 +80,14 @@ class IpfsRepo { */ init (config, callback) { log('initializing at: %s', this.path) + series([ + (cb) => this._fsStore.open((err) => { + if (err && err.message === 'Already open') { + return cb() + } + cb(err) + }), (cb) => this.config.set(config, cb), (cb) => this.version.set(repoVersion, cb) ], callback) @@ -102,6 +108,12 @@ class IpfsRepo { // check if the repo is already initialized waterfall([ + (cb) => this._fsStore.open((err) => { + if (err && err.message === 'Already open') { + return cb() + } + cb(err) + }), (cb) => this._isInitialized(cb), (cb) => this._locker.lock(this.path, cb), (lck, cb) => { @@ -155,10 +167,12 @@ class IpfsRepo { * @returns {void} */ _isInitialized (callback) { + log('init check') parallel([ (cb) => this.config.exists(cb), (cb) => this.version.check(repoVersion, cb) ], (err, res) => { + log('init', err, res) if (err) { return callback(err) } @@ -192,10 +206,15 @@ class IpfsRepo { (cb) => this.store.close(cb), (cb) => this._fsStore.close(cb), (cb) => { + log('unlocking') this.closed = true this.lockfile.close(cb) + }, + (cb) => { + this.lockfile = null + cb() } - ], callback) + ], (err) => callback(err)) } /** diff --git a/test/blockstore-test.js b/test/blockstore-test.js index 4449bed4..5bddc617 100644 --- a/test/blockstore-test.js +++ b/test/blockstore-test.js @@ -43,6 +43,15 @@ module.exports = (repo) => { ], done) }) + it('empty value', (done) => { + const d = new Buffer(0) + multihashing(d, 'sha2-256', (err, multihash) => { + expect(err).to.not.exist() + const empty = new Block(d, new CID(multihash)) + repo.blockstore.put(empty, done) + }) + }) + it('massive multiwrite', (done) => { waterfall([ (cb) => map(_.range(100), (i, cb) => { diff --git a/test/repo-test.js b/test/repo-test.js index 4d48c016..d0340959 100644 --- a/test/repo-test.js +++ b/test/repo-test.js @@ -5,6 +5,7 @@ const chai = require('chai') chai.use(require('dirty-chai')) const expect = chai.expect const series = require('async/series') +const waterfall = require('async/waterfall') const Repo = require('../src') @@ -61,14 +62,32 @@ module.exports = (repo) => { }) it('set version', (done) => { - repo.version.set(9000, (err) => { - expect(err).to.not.exist() - repo.version.get((err, version) => { - expect(err).to.not.exist() + waterfall([ + (cb) => repo.version.set(9000, cb), + (cb) => repo.version.get(cb), + (version, cb) => { expect(version).to.equal(9000) - done() - }) - }) + cb() + }, + (cb) => repo.version.set(5, cb) + ], done) + }) + }) + + describe('lifecycle', () => { + it('close and open', (done) => { + waterfall([ + (cb) => repo.close(cb), + (cb) => repo.open(cb), + (cb) => repo.close(cb), + (cb) => repo.open(cb), + (cb) => repo.version.get(cb), + (version, cb) => { + console.log(version) + expect(version).to.exist() + cb() + } + ], done) }) }) })