From 9e1360bf5a1f7ee021c03862d7d0ea7b0e31b0c9 Mon Sep 17 00:00:00 2001 From: Jacob Heun Date: Wed, 9 May 2018 13:04:51 -0700 Subject: [PATCH 1/6] fix: upgrade level libs to resolve node 10 failure License: MIT Signed-off-by: Jacob Heun --- .DS_Store | Bin 6148 -> 0 bytes package.json | 9 ++++++--- src/index.js | 27 ++++++++++++++++++++++----- test/browser.js | 4 +++- test/node.js | 20 +++++++++++++++----- 5 files changed, 46 insertions(+), 14 deletions(-) delete mode 100644 .DS_Store diff --git a/.DS_Store b/.DS_Store deleted file mode 100644 index 92df3c5ade9bf8da2f689476fbd490fb68090ce6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeHK%}N9@3{G?pi!L|^4<7pp`vzs1J$c**P}o`Yu;VP~c{%i6Co?3u>vOhI-nL1p13p$bCjP zn)Qa>=f9!b?bUp>?%Ev^Kbk$Ber4Nsb=~xLYoe#~hkJN@9=Gk9Z`27-ZL;0FxIoeh~D8%7@t1OvgqD+4$mk~Cm;EQWe?NT(%$AfC}GqNA38PjbwT z#ZXp6*jxq8mA%AZbC>z#cG-!FB<)ff1a<|Ai0FeyfDCYsoav&iC+K3A W9g88NU|!t?;~}7gL>CPF0t3&jg) { + // Prevent an uncaught exception error on duplicate locks + if (err) { + throw err + } + } + ) } open (callback /* : Callback */) /* : void */ { @@ -58,7 +72,10 @@ class LevelDatastore { } delete (key /* : Key */, callback /* : Callback */) /* : void */ { - this.db.del(key.toString(), callback) + this.db.del(key.toString(), (err) => { + // Avoid level passing additional arguments to callback, we dont need them + callback(err) + }) } close (callback /* : Callback */) /* : void */ { diff --git a/test/browser.js b/test/browser.js index 4dab658..c049d3f 100644 --- a/test/browser.js +++ b/test/browser.js @@ -5,7 +5,9 @@ const each = require('async/each') const MountStore = require('datastore-core').MountDatastore const Key = require('interface-datastore').Key -const leveljs = require('level-js') + +// leveldown will be swapped for level-js +const leveljs = require('leveldown') const LevelStore = require('../src') diff --git a/test/node.js b/test/node.js index c37d968..b6f8b02 100644 --- a/test/node.js +++ b/test/node.js @@ -21,7 +21,9 @@ describe('LevelDatastore', () => { const dir = utils.tmpdir() require('interface-datastore/src/tests')({ setup (callback) { - callback(null, new LevelStore(dir)) + callback(null, new LevelStore(dir, { + db: require('leveldown') + })) }, teardown (callback) { rimraf(dir, callback) @@ -40,13 +42,19 @@ describe('LevelDatastore', () => { setup (callback) { callback(null, new MountStore([{ prefix: new Key('/a'), - datastore: new LevelStore(dirs[0]) + datastore: new LevelStore(dirs[0], { + db: require('leveldown') + }) }, { prefix: new Key('/q'), - datastore: new LevelStore(dirs[1]) + datastore: new LevelStore(dirs[1], { + db: require('leveldown') + }) }, { prefix: new Key('/z'), - datastore: new LevelStore(dirs[2]) + datastore: new LevelStore(dirs[2], { + db: require('leveldown') + }) }])) }, teardown (callback) { @@ -56,7 +64,9 @@ describe('LevelDatastore', () => { }) it.skip('interop with go', (done) => { - const store = new LevelStore(path.join(__dirname, 'test-repo', 'datastore')) + const store = new LevelStore(path.join(__dirname, 'test-repo', 'datastore'), { + db: require('leveldown') + }) pull( store.query({}), From de0d32a70356306ad3c043abed70a88678ef784c Mon Sep 17 00:00:00 2001 From: Jacob Heun Date: Mon, 14 May 2018 14:18:26 -0700 Subject: [PATCH 2/6] chore: add node 10 to jenkins override License: MIT Signed-off-by: Jacob Heun --- ci/Jenkinsfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ci/Jenkinsfile b/ci/Jenkinsfile index a7da2e5..6f4483f 100644 --- a/ci/Jenkinsfile +++ b/ci/Jenkinsfile @@ -1,2 +1,2 @@ // Warning: This file is automatically synced from https://github.com/ipfs/ci-sync so if you want to change it, please change it there and ask someone to sync all repositories. -javascript() +javascript(['nodejs_versions': ['8.11.1','9.2.0','10.0.0']]) From ca7b6a25dd264f1dd03ad40b030ba7bb8a126908 Mon Sep 17 00:00:00 2001 From: Jacob Heun Date: Wed, 16 May 2018 11:28:39 -0700 Subject: [PATCH 3/6] fix: add test and fix constructor License: MIT Signed-off-by: Jacob Heun --- .gitignore | 1 + package.json | 6 +++--- src/index.js | 25 +++++++++++++++---------- test/index.spec.js | 38 ++++++++++++++++++++++++++++++++++++++ 4 files changed, 57 insertions(+), 13 deletions(-) diff --git a/.gitignore b/.gitignore index be6de95..8047247 100644 --- a/.gitignore +++ b/.gitignore @@ -37,3 +37,4 @@ node_modules lib dist test/test-repo/datastore +init-default \ No newline at end of file diff --git a/package.json b/package.json index f376cce..5c1f010 100644 --- a/package.json +++ b/package.json @@ -48,10 +48,10 @@ "pull-stream": "^3.6.1" }, "devDependencies": { - "aegir": "^12.1.3", - "async": "^2.5.0", + "aegir": "^13.1.0", + "async": "^2.6.0", "chai": "^4.1.2", - "cids": "~0.5.2", + "cids": "~0.5.3", "dirty-chai": "^2.0.1", "flow-bin": "^0.58.0", "memdown": "^1.4.1", diff --git a/src/index.js b/src/index.js index 0e36657..cc597cc 100644 --- a/src/index.js +++ b/src/index.js @@ -24,18 +24,23 @@ class LevelDatastore { /* :: db: levelup */ constructor (path /* : string */, opts /* : ?LevelOptions */) { - // Default to leveldown db - const database = opts && opts.db ? opts.db : require('leveldown') - delete opts.db + let database + + if (opts && opts.db) { + database = opts.db + delete opts.db + } else { + // Default to leveldown db + database = require('leveldown') + } this.db = levelup( - database( - path, - Object.assign({}, opts, { - compression: false, // same default as go - valueEncoding: 'binary' - }) - ), (err) => { + database(path), + Object.assign({}, opts, { + compression: false, // same default as go + valueEncoding: 'binary' + }), + (err) => { // Prevent an uncaught exception error on duplicate locks if (err) { throw err diff --git a/test/index.spec.js b/test/index.spec.js index ec559a0..b5274ea 100644 --- a/test/index.spec.js +++ b/test/index.spec.js @@ -2,11 +2,49 @@ /* eslint-env mocha */ 'use strict' +const chai = require('chai') +chai.use(require('dirty-chai')) +const expect = chai.expect const memdown = require('memdown') +const LevelDown = require('leveldown') const LevelStore = require('../src') describe('LevelDatastore', () => { + describe('initialization', () => { + it('should default to a leveldown database', (done) => { + const levelStore = new LevelStore('init-default') + + levelStore.open((err) => { + expect(err).to.not.exist() + expect(levelStore.db.db instanceof LevelDown).to.equal(true) + expect(levelStore.db.options).to.include({ + createIfMissing: true, + errorIfExists: false + }) + done() + }) + }) + + it('should be able to override the database', (done) => { + const levelStore = new LevelStore('init-default', { + db: memdown, + createIfMissing: true, + errorIfExists: true + }) + + levelStore.open((err) => { + expect(err).to.not.exist() + expect(levelStore.db.db instanceof memdown).to.equal(true) + expect(levelStore.db.options).to.include({ + createIfMissing: true, + errorIfExists: true + }) + done() + }) + }) + }) + describe('interface-datastore (memdown)', () => { require('interface-datastore/src/tests')({ setup (callback) { From 8093ad5e795dadf3b6498320c62e5352bed7a2bb Mon Sep 17 00:00:00 2001 From: Jacob Heun Date: Wed, 16 May 2018 14:32:48 -0700 Subject: [PATCH 4/6] test: add interface tests for leveldown License: MIT Signed-off-by: Jacob Heun --- .gitignore | 3 ++- test/index.spec.js | 26 +++++++++++++++++--------- 2 files changed, 19 insertions(+), 10 deletions(-) diff --git a/.gitignore b/.gitignore index 8047247..c1f7def 100644 --- a/.gitignore +++ b/.gitignore @@ -37,4 +37,5 @@ node_modules lib dist test/test-repo/datastore -init-default \ No newline at end of file +init-default +datastore-test \ No newline at end of file diff --git a/test/index.spec.js b/test/index.spec.js index b5274ea..724e529 100644 --- a/test/index.spec.js +++ b/test/index.spec.js @@ -7,6 +7,7 @@ chai.use(require('dirty-chai')) const expect = chai.expect const memdown = require('memdown') const LevelDown = require('leveldown') +const eachSeries = require('async/eachSeries') const LevelStore = require('../src') @@ -45,15 +46,22 @@ describe('LevelDatastore', () => { }) }) - describe('interface-datastore (memdown)', () => { - require('interface-datastore/src/tests')({ - setup (callback) { - callback(null, new LevelStore('hello', {db: memdown})) - }, - teardown (callback) { - memdown.clearGlobalStore() - callback() - } + eachSeries([ + memdown, + LevelDown + ], (database) => { + describe(`interface-datastore ${database.name}`, () => { + require('interface-datastore/src/tests')({ + setup (callback) { + callback(null, new LevelStore('datastore-test', {db: database})) + }, + teardown (callback) { + memdown.clearGlobalStore() + callback() + } + }) }) + }, (err) => { + expect(err).to.not.exist() }) }) From 6e7ebe0c02196684c2df5a65ac583879e2edc5f2 Mon Sep 17 00:00:00 2001 From: Jacob Heun Date: Thu, 24 May 2018 18:01:17 +0200 Subject: [PATCH 5/6] docs: add note on browser shimming to readmewq License: MIT Signed-off-by: Jacob Heun --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index 16884e5..4940ea7 100644 --- a/README.md +++ b/README.md @@ -16,6 +16,7 @@ - [Install](#install) - [Usage](#usage) + - [Browser Shimming Leveldown](#browser-shimming-leveldown) - [Contribute](#contribute) - [License](#license) @@ -39,6 +40,9 @@ const browserStore = new LevelStore('my/db/name', {db: require('level-js')}) const memStore = new LevelStore('my/mem/store', {db: require('memdown')}) ``` +### Browser Shimming Leveldown +As `leveldown` does not work in the browser, `LevelStore` takes advantage of the browser property in package.json to shim `level-js` in its place. Most modern bundlers such as webpack, will see the shim and replace it for use in the browser. If you are using a bundler that does not support pkg.browser, you will need to handle the shimming yourself, as was the case with versions of `LevelStore` 0.7.0 and earlier. + ## Contribute PRs accepted. From 931170b7584d15317e497d4578784b4c931a5fdf Mon Sep 17 00:00:00 2001 From: Jacob Heun Date: Mon, 28 May 2018 16:04:34 +0200 Subject: [PATCH 6/6] fix: update binary encoding for levelup 2 License: MIT Signed-off-by: Jacob Heun --- package.json | 1 + src/index.js | 6 +++--- test/index.spec.js | 7 +++++-- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 5c1f010..c6b7f01 100644 --- a/package.json +++ b/package.json @@ -41,6 +41,7 @@ "homepage": "https://github.com/ipfs/js-datastore-level#readme", "dependencies": { "datastore-core": "~0.4.0", + "encoding-down": "^5.0.2", "interface-datastore": "~0.4.1", "level-js": "github:timkuijsten/level.js#idbunwrapper", "leveldown": "^3.0.2", diff --git a/src/index.js b/src/index.js index cc597cc..19a823e 100644 --- a/src/index.js +++ b/src/index.js @@ -9,6 +9,7 @@ const levelup = require('levelup') const asyncFilter = require('interface-datastore').utils.asyncFilter const asyncSort = require('interface-datastore').utils.asyncSort const Key = require('interface-datastore').Key +const encode = require('encoding-down') /** * A datastore backed by leveldb. @@ -35,10 +36,9 @@ class LevelDatastore { } this.db = levelup( - database(path), + encode(database(path), { valueEncoding: 'binary' }), Object.assign({}, opts, { - compression: false, // same default as go - valueEncoding: 'binary' + compression: false // same default as go }), (err) => { // Prevent an uncaught exception error on duplicate locks diff --git a/test/index.spec.js b/test/index.spec.js index 724e529..fdd62ef 100644 --- a/test/index.spec.js +++ b/test/index.spec.js @@ -18,11 +18,14 @@ describe('LevelDatastore', () => { levelStore.open((err) => { expect(err).to.not.exist() - expect(levelStore.db.db instanceof LevelDown).to.equal(true) + expect(levelStore.db.db.db instanceof LevelDown).to.equal(true) expect(levelStore.db.options).to.include({ createIfMissing: true, errorIfExists: false }) + expect(levelStore.db.db.codec.opts).to.include({ + valueEncoding: 'binary' + }) done() }) }) @@ -36,7 +39,7 @@ describe('LevelDatastore', () => { levelStore.open((err) => { expect(err).to.not.exist() - expect(levelStore.db.db instanceof memdown).to.equal(true) + expect(levelStore.db.db.db instanceof memdown).to.equal(true) expect(levelStore.db.options).to.include({ createIfMissing: true, errorIfExists: true