Skip to content
This repository has been archived by the owner on Mar 23, 2023. It is now read-only.

fix: upgrade level libs to resolve node 10 failure #7

Merged
merged 6 commits into from
May 29, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file removed .DS_Store
Binary file not shown.
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -37,3 +37,5 @@ node_modules
lib
dist
test/test-repo/datastore
init-default
datastore-test
4 changes: 4 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@

- [Install](#install)
- [Usage](#usage)
- [Browser Shimming Leveldown](#browser-shimming-leveldown)
- [Contribute](#contribute)
- [License](#license)

Expand All @@ -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.
Expand Down
2 changes: 1 addition & 1 deletion ci/Jenkinsfile
Original file line number Diff line number Diff line change
@@ -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']])
16 changes: 10 additions & 6 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,9 @@
"version": "0.7.0",
"description": "Datastore implementation with level(up|down) backend",
"main": "src/index.js",
"browser": {
"leveldown": "level-js"
},
"scripts": {
"lint": "aegir lint",
"build": "aegir build",
Expand Down Expand Up @@ -38,17 +41,18 @@
"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": "^2.2.4",
"leveldown": "^1.9.0",
"levelup": "^1.3.9",
"level-js": "github:timkuijsten/level.js#idbunwrapper",
"leveldown": "^3.0.2",
"levelup": "^2.0.2",
"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",
Expand Down
32 changes: 27 additions & 5 deletions src/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand All @@ -24,10 +25,28 @@ class LevelDatastore {
/* :: db: levelup */

constructor (path /* : string */, opts /* : ?LevelOptions */) {
this.db = levelup(path, Object.assign({}, opts, {
compression: false, // same default as go
valueEncoding: 'binary'
}))
let database

if (opts && opts.db) {
database = opts.db
delete opts.db
} else {
// Default to leveldown db
database = require('leveldown')
}

this.db = levelup(
encode(database(path), { valueEncoding: 'binary' }),
Object.assign({}, opts, {
compression: false // same default as go
}),
(err) => {
// Prevent an uncaught exception error on duplicate locks
if (err) {
throw err
}
}
)
}

open (callback /* : Callback<void> */) /* : void */ {
Expand Down Expand Up @@ -58,7 +77,10 @@ class LevelDatastore {
}

delete (key /* : Key */, callback /* : Callback<void> */) /* : 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> */) /* : void */ {
Expand Down
4 changes: 3 additions & 1 deletion test/browser.js
Original file line number Diff line number Diff line change
Expand Up @@ -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')

Expand Down
67 changes: 58 additions & 9 deletions test/index.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,20 +2,69 @@
/* 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 eachSeries = require('async/eachSeries')

const LevelStore = require('../src')

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()
}
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.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()
})
})

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.db instanceof memdown).to.equal(true)
expect(levelStore.db.options).to.include({
createIfMissing: true,
errorIfExists: true
})
done()
})
})
})

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()
})
})
20 changes: 15 additions & 5 deletions test/node.js
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -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) {
Expand All @@ -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({}),
Expand Down