From 83dad6215621ea86e5c4c5360ccdbb99842b5596 Mon Sep 17 00:00:00 2001 From: Vincent Weevers Date: Fri, 25 May 2018 18:51:19 +0200 Subject: [PATCH 1/9] move mixedToBuffer to utils/ (closes #95) --- index.js | 7 ++++--- iterator.js | 10 +++------- util/mixed-to-buffer.js | 8 ++++++++ 3 files changed, 15 insertions(+), 10 deletions(-) create mode 100644 util/mixed-to-buffer.js diff --git a/index.js b/index.js index d70f3a8..1d367f2 100644 --- a/index.js +++ b/index.js @@ -1,9 +1,11 @@ +'use strict' + module.exports = Level var AbstractLevelDOWN = require('abstract-leveldown').AbstractLevelDOWN var util = require('util') var Iterator = require('./iterator') -var toBuffer = require('typedarray-to-buffer') +var mixedToBuffer = require('./util/mixed-to-buffer') var DEFAULT_PREFIX = 'level-js-' @@ -88,8 +90,7 @@ Level.prototype._get = function (key, options, callback) { } if (options.asBuffer) { - if (value instanceof Uint8Array) value = toBuffer(value) - else value = Buffer.from(String(value)) + value = mixedToBuffer(value) } callback(null, value) diff --git a/iterator.js b/iterator.js index b5b6a5c..98cac4e 100644 --- a/iterator.js +++ b/iterator.js @@ -1,15 +1,11 @@ +'use strict' + var util = require('util') var AbstractIterator = require('abstract-leveldown').AbstractIterator var ltgt = require('ltgt') -var toBuffer = require('typedarray-to-buffer') +var mixedToBuffer = require('./util/mixed-to-buffer') var noop = function () {} -// TODO: move this to a util, to be used by get() and iterators. -function mixedToBuffer (value) { - if (value instanceof Uint8Array) return toBuffer(value) - else return Buffer.from(String(value)) -} - module.exports = Iterator function Iterator (db, location, options) { diff --git a/util/mixed-to-buffer.js b/util/mixed-to-buffer.js new file mode 100644 index 0000000..89fbbee --- /dev/null +++ b/util/mixed-to-buffer.js @@ -0,0 +1,8 @@ +'use strict' + +var toBuffer = require('typedarray-to-buffer') + +module.exports = function (value) { + if (value instanceof Uint8Array) return toBuffer(value) + else return Buffer.from(String(value)) +} From e70fb9e6e7968d99957b20509c4839b2109e115e Mon Sep 17 00:00:00 2001 From: Vincent Weevers Date: Fri, 25 May 2018 19:06:44 +0200 Subject: [PATCH 2/9] move feature detection to util/support --- index.js | 22 ++++------------------ test/index.js | 1 + test/test-support.js | 26 ++++++++++++++++++++++++++ util/support.js | 19 +++++++++++++++++++ 4 files changed, 50 insertions(+), 18 deletions(-) create mode 100644 test/test-support.js create mode 100644 util/support.js diff --git a/index.js b/index.js index 1d367f2..6f66be7 100644 --- a/index.js +++ b/index.js @@ -6,6 +6,7 @@ var AbstractLevelDOWN = require('abstract-leveldown').AbstractLevelDOWN var util = require('util') var Iterator = require('./iterator') var mixedToBuffer = require('./util/mixed-to-buffer') +var support = require('./util/support') var DEFAULT_PREFIX = 'level-js-' @@ -20,24 +21,9 @@ function Level (location, opts) { util.inherits(Level, AbstractLevelDOWN) -// Detect binary key support (IndexedDB Second Edition) -Level.binaryKeys = (function () { - try { - indexedDB.cmp(new Uint8Array(0), 0) - return true - } catch (err) { - return false - } -})() - -Level.arrayKeys = (function () { - try { - indexedDB.cmp([1], 0) - return true - } catch (err) { - return false - } -})() +// Detect binary and array key support (IndexedDB Second Edition) +Level.binaryKeys = support.binaryKeys(indexedDB) +Level.arrayKeys = support.arrayKeys(indexedDB) Level.prototype._open = function (options, callback) { var req = indexedDB.open(this.prefix + this.location, this.version) diff --git a/test/index.js b/test/index.js index 70e50c6..00bee4d 100644 --- a/test/index.js +++ b/test/index.js @@ -3,5 +3,6 @@ if (process.browser && typeof Promise !== 'function') { global.Promise = require('pinkie') } +require('./test-support') require('./test') require('./test-levelup') diff --git a/test/test-support.js b/test/test-support.js new file mode 100644 index 0000000..1cbb668 --- /dev/null +++ b/test/test-support.js @@ -0,0 +1,26 @@ +'use strict' + +var test = require('tape') +var support = require('../util/support') + +var pos = function () { } +var neg = function () { throw new Error() } + +test('mock binaryKeys support', function (t) { + t.ok(support.binaryKeys({ cmp: pos })) + t.notOk(support.binaryKeys({ cmp: neg })) + t.end() +}) + +test('mock arrayKeys support', function (t) { + t.ok(support.arrayKeys({ cmp: pos })) + t.notOk(support.arrayKeys({ cmp: neg })) + t.end() +}) + +// Purely informational +test('support', function (t) { + t.pass('binary keys: ' + support.binaryKeys(indexedDB)) + t.pass('array keys: ' + support.arrayKeys(indexedDB)) + t.end() +}) diff --git a/util/support.js b/util/support.js new file mode 100644 index 0000000..c87e682 --- /dev/null +++ b/util/support.js @@ -0,0 +1,19 @@ +'use strict' + +exports.binaryKeys = function (impl) { + try { + impl.cmp(new Uint8Array(0), 0) + return true + } catch (err) { + return false + } +} + +exports.arrayKeys = function (impl) { + try { + impl.cmp([1], 0) + return true + } catch (err) { + return false + } +} From cbf679437f66ae52a31dae4dcc79792099cdd90b Mon Sep 17 00:00:00 2001 From: Vincent Weevers Date: Fri, 25 May 2018 19:09:00 +0200 Subject: [PATCH 3/9] move (unused) idb-shim to test/util --- test/test.js | 2 +- test/{ => util}/idb-shim.js | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename test/{ => util}/idb-shim.js (100%) diff --git a/test/test.js b/test/test.js index c761a9f..7865597 100644 --- a/test/test.js +++ b/test/test.js @@ -3,7 +3,7 @@ var leveljs = require('../') var testCommon = require('./testCommon') // load IndexedDBShim in the tests -// require('./idb-shim.js')() +// require('./util/idb-shim.js')() /*** compatibility with basic LevelDOWN API ***/ require('abstract-leveldown/abstract/leveldown-test').args(leveljs, tape, testCommon) diff --git a/test/idb-shim.js b/test/util/idb-shim.js similarity index 100% rename from test/idb-shim.js rename to test/util/idb-shim.js From 039a004f440132750202c328806edbacedf02c44 Mon Sep 17 00:00:00 2001 From: Vincent Weevers Date: Fri, 25 May 2018 19:12:06 +0200 Subject: [PATCH 4/9] move testCommon to test/util --- test/test-levelup.js | 2 +- test/test.js | 2 +- test/{testCommon.js => util/test-common.js} | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) rename test/{testCommon.js => util/test-common.js} (98%) diff --git a/test/test-levelup.js b/test/test-levelup.js index 6b08230..0f886ae 100644 --- a/test/test-levelup.js +++ b/test/test-levelup.js @@ -6,7 +6,7 @@ var levelup = require('levelup') var encoding = require('encoding-down') var leveljs = require('../') var test = require('tape') -var testCommon = require('./testCommon') +var testCommon = require('./util/test-common') test('setup', testCommon.setUp) diff --git a/test/test.js b/test/test.js index 7865597..cb59d3b 100644 --- a/test/test.js +++ b/test/test.js @@ -1,6 +1,6 @@ var tape = require('tape') var leveljs = require('../') -var testCommon = require('./testCommon') +var testCommon = require('./util/test-common') // load IndexedDBShim in the tests // require('./util/idb-shim.js')() diff --git a/test/testCommon.js b/test/util/test-common.js similarity index 98% rename from test/testCommon.js rename to test/util/test-common.js index 12690c7..5891fd8 100644 --- a/test/testCommon.js +++ b/test/util/test-common.js @@ -1,5 +1,5 @@ var dbidx = 0 - , leveljs = require('../') + , leveljs = require('../..') , location = function () { return '_leveldown_test_db_' + dbidx++ } @@ -14,13 +14,13 @@ var dbidx = 0 for (var i = 0; i < dbidx; i++) { list.push('_leveldown_test_db_' + i) } - + function destroy() { var f = list.pop() if (list.length === 0) return callback() leveljs.destroy(f, destroy) } - + destroy() } From c2adc9610ed8dd4bf291727e89a373cfc67c641c Mon Sep 17 00:00:00 2001 From: Vincent Weevers Date: Fri, 25 May 2018 19:26:32 +0200 Subject: [PATCH 5/9] restructure tests --- test/{custom-tests.js => custom-test.js} | 22 +++++---- test/index.js | 31 ++++++++++-- test/levelup-test.js | 62 ++++++++++++++++++++++++ test/support-test.js | 27 +++++++++++ test/test-levelup.js | 62 ------------------------ test/test-support.js | 26 ---------- test/test.js | 22 --------- 7 files changed, 129 insertions(+), 123 deletions(-) rename test/{custom-tests.js => custom-test.js} (90%) create mode 100644 test/levelup-test.js create mode 100644 test/support-test.js delete mode 100644 test/test-levelup.js delete mode 100644 test/test-support.js delete mode 100644 test/test.js diff --git a/test/custom-tests.js b/test/custom-test.js similarity index 90% rename from test/custom-tests.js rename to test/custom-test.js index ea5fad6..2b7377e 100644 --- a/test/custom-tests.js +++ b/test/custom-test.js @@ -1,9 +1,11 @@ +'use strict' + var levelup = require('levelup') -module.exports.all = function(leveljs, tape, testCommon) { - tape('setUp', testCommon.setUp) +module.exports = function (leveljs, test, testCommon) { + test('setUp', testCommon.setUp) - tape('buffer value', function(t) { + test('buffer value', function(t) { var level = leveljs(testCommon.location()) level.open(function(err) { t.notOk(err, 'no error') @@ -22,7 +24,7 @@ module.exports.all = function(leveljs, tape, testCommon) { // This should be covered by abstract-leveldown tests, but that's // prevented by process.browser checks (Level/abstract-leveldown#121). // This test is adapted from memdown. - leveljs.binaryKeys && tape('buffer keys', function (t) { + leveljs.binaryKeys && test('buffer keys', function (t) { var db = leveljs(testCommon.location()) db.open(function (err) { @@ -60,7 +62,7 @@ module.exports.all = function(leveljs, tape, testCommon) { }) // Adapted from a memdown test. - leveljs.binaryKeys && tape('iterator stringifies buffer input', function (t) { + leveljs.binaryKeys && test('iterator stringifies buffer input', function (t) { t.plan(6) var db = leveljs(testCommon.location()) @@ -85,7 +87,7 @@ module.exports.all = function(leveljs, tape, testCommon) { }) // TODO: merge this and the test below. Test all types. - tape('store native JS types', function(t) { + test('store native JS types', function(t) { var level = leveljs(testCommon.location()) level.open(function(err) { t.notOk(err, 'no error') @@ -101,7 +103,7 @@ module.exports.all = function(leveljs, tape, testCommon) { }) }) - tape('store NaN value', function(t) { + test('store NaN value', function(t) { var level = leveljs(testCommon.location()) level.open(function(err) { t.notOk(err, 'no error') @@ -119,7 +121,7 @@ module.exports.all = function(leveljs, tape, testCommon) { // NOTE: in chrome (at least) indexeddb gets buggy if you try and destroy a db, // then create it again, then try and destroy it again. these avoid doing that - tape('test levelup .destroy w/ string', function(t) { + test('test levelup .destroy w/ string', function(t) { var location = testCommon.location() var db = levelup(leveljs(location)) db.put('key', 'value', function (err) { @@ -142,7 +144,7 @@ module.exports.all = function(leveljs, tape, testCommon) { }) }) - tape('test levelup .destroy w/ db instance', function(t) { + test('test levelup .destroy w/ db instance', function(t) { var location = testCommon.location() var db = levelup(leveljs(location)) db.put('key', 'value', function (err) { @@ -165,5 +167,5 @@ module.exports.all = function(leveljs, tape, testCommon) { }) }) - tape('teardown', testCommon.tearDown) + test('teardown', testCommon.tearDown) } diff --git a/test/index.js b/test/index.js index 00bee4d..4811a22 100644 --- a/test/index.js +++ b/test/index.js @@ -1,8 +1,33 @@ +'use strict' + // Promise polyfill for IE and others. if (process.browser && typeof Promise !== 'function') { global.Promise = require('pinkie') } -require('./test-support') -require('./test') -require('./test-levelup') +// Load IndexedDBShim +// require('./util/idb-shim.js')() + +var test = require('tape') +var leveljs = require('..') +var testCommon = require('./util/test-common') + +// Test feature detection +require('./support-test')(leveljs, test) + +// Test abstract-leveldown compliance +require('abstract-leveldown/abstract/leveldown-test').args(leveljs, test, testCommon) +require('abstract-leveldown/abstract/open-test').open(leveljs, test, testCommon) +require('abstract-leveldown/abstract/put-test').all(leveljs, test, testCommon) +require('abstract-leveldown/abstract/del-test').all(leveljs, test, testCommon) +require('abstract-leveldown/abstract/get-test').all(leveljs, test, testCommon) +require('abstract-leveldown/abstract/put-get-del-test').all(leveljs, test, testCommon) +require('abstract-leveldown/abstract/batch-test').all(leveljs, test, testCommon) +require('abstract-leveldown/abstract/chained-batch-test').all(leveljs, test, testCommon) +require('abstract-leveldown/abstract/close-test').close(leveljs, test, testCommon) +require('abstract-leveldown/abstract/iterator-test').all(leveljs, test, testCommon) +require('abstract-leveldown/abstract/iterator-range-test').all(leveljs, test, testCommon) + +// Additional tests for this implementation +require('./custom-test')(leveljs, test, testCommon) +require('./levelup-test')(leveljs, test, testCommon) diff --git a/test/levelup-test.js b/test/levelup-test.js new file mode 100644 index 0000000..9983fc1 --- /dev/null +++ b/test/levelup-test.js @@ -0,0 +1,62 @@ +'use strict' + +// NOTE: Temporary integration tests, can be removed later. Remember +// to also remove the encoding-down devDependency. + +var levelup = require('levelup') +var encoding = require('encoding-down') + +module.exports = function (leveljs, test, testCommon) { + test('setup', testCommon.setUp) + + test('levelup put', function (t) { + t.plan(4) + + var down = leveljs(testCommon.location()) + var db = levelup(down) + + db.put('name', 'LevelUP string', function (err) { + t.ifError(err, 'no put error') + + db.get('name', { asBuffer: false }, function (err, value) { + t.ifError(err, 'no get error') + t.is(value, 'LevelUP string') + + db.close(function (err) { + t.ifError(err, 'no close error') + }) + }) + }) + }) + + test('binary', function (t) { + t.plan(9) + + var down = leveljs(testCommon.location()) + var db = levelup(encoding(down, { valueEncoding: 'binary' })) + var buf = Buffer.from('00ff', 'hex') + + db.put('binary', buf, function (err) { + t.ifError(err, 'no put error') + + db.get('binary', function (err, value) { + t.ifError(err, 'no get error') + t.ok(Buffer.isBuffer(value), 'is a buffer') + t.same(value, buf) + + db.get('binary', { valueEncoding: 'id' }, function (err, value) { + t.ifError(err, 'no get error') + t.notOk(Buffer.isBuffer(value), 'is not a buffer') + t.ok(value instanceof Uint8Array, 'is a Uint8Array') + t.same(Buffer.from(value), buf) + + db.close(function (err) { + t.ifError(err, 'no close error') + }) + }) + }) + }) + }) + + test('teardown', testCommon.tearDown) +} diff --git a/test/support-test.js b/test/support-test.js new file mode 100644 index 0000000..6ed4e5a --- /dev/null +++ b/test/support-test.js @@ -0,0 +1,27 @@ +'use strict' + +var support = require('../util/support') + +var pos = function () { } +var neg = function () { throw new Error() } + +module.exports = function (leveljs, test) { + test('mock binaryKeys support', function (t) { + t.ok(support.binaryKeys({ cmp: pos })) + t.notOk(support.binaryKeys({ cmp: neg })) + t.end() + }) + + test('mock arrayKeys support', function (t) { + t.ok(support.arrayKeys({ cmp: pos })) + t.notOk(support.arrayKeys({ cmp: neg })) + t.end() + }) + + // Purely informational + test('support', function (t) { + t.pass('binary keys: ' + support.binaryKeys(indexedDB)) + t.pass('array keys: ' + support.arrayKeys(indexedDB)) + t.end() + }) +} diff --git a/test/test-levelup.js b/test/test-levelup.js deleted file mode 100644 index 0f886ae..0000000 --- a/test/test-levelup.js +++ /dev/null @@ -1,62 +0,0 @@ -/*** Levelup tests - NOTE: Temporary integration tests, can be removed later. Remember - to also remove the encoding-down devDependency. -***/ -var levelup = require('levelup') -var encoding = require('encoding-down') -var leveljs = require('../') -var test = require('tape') -var testCommon = require('./util/test-common') - -test('setup', testCommon.setUp) - -test('levelup put', function (t) { - t.plan(4) - - var down = leveljs(testCommon.location()) - var db = levelup(down) - - db.put('name', 'LevelUP string', function (err) { - t.ifError(err, 'no put error') - - db.get('name', { asBuffer: false }, function (err, value) { - t.ifError(err, 'no get error') - t.is(value, 'LevelUP string') - - db.close(function (err) { - t.ifError(err, 'no close error') - }) - }) - }) -}) - -test('binary', function (t) { - t.plan(9) - - var down = leveljs(testCommon.location()) - var db = levelup(encoding(down, { valueEncoding: 'binary' })) - var buf = Buffer.from('00ff', 'hex') - - db.put('binary', buf, function (err) { - t.ifError(err, 'no put error') - - db.get('binary', function (err, value) { - t.ifError(err, 'no get error') - t.ok(Buffer.isBuffer(value), 'is a buffer') - t.same(value, buf) - - db.get('binary', { valueEncoding: 'id' }, function (err, value) { - t.ifError(err, 'no get error') - t.notOk(Buffer.isBuffer(value), 'is not a buffer') - t.ok(value instanceof Uint8Array, 'is a Uint8Array') - t.same(Buffer.from(value), buf) - - db.close(function (err) { - t.ifError(err, 'no close error') - }) - }) - }) - }) -}) - -test('teardown', testCommon.tearDown) diff --git a/test/test-support.js b/test/test-support.js deleted file mode 100644 index 1cbb668..0000000 --- a/test/test-support.js +++ /dev/null @@ -1,26 +0,0 @@ -'use strict' - -var test = require('tape') -var support = require('../util/support') - -var pos = function () { } -var neg = function () { throw new Error() } - -test('mock binaryKeys support', function (t) { - t.ok(support.binaryKeys({ cmp: pos })) - t.notOk(support.binaryKeys({ cmp: neg })) - t.end() -}) - -test('mock arrayKeys support', function (t) { - t.ok(support.arrayKeys({ cmp: pos })) - t.notOk(support.arrayKeys({ cmp: neg })) - t.end() -}) - -// Purely informational -test('support', function (t) { - t.pass('binary keys: ' + support.binaryKeys(indexedDB)) - t.pass('array keys: ' + support.arrayKeys(indexedDB)) - t.end() -}) diff --git a/test/test.js b/test/test.js deleted file mode 100644 index cb59d3b..0000000 --- a/test/test.js +++ /dev/null @@ -1,22 +0,0 @@ -var tape = require('tape') -var leveljs = require('../') -var testCommon = require('./util/test-common') - -// load IndexedDBShim in the tests -// require('./util/idb-shim.js')() - -/*** compatibility with basic LevelDOWN API ***/ -require('abstract-leveldown/abstract/leveldown-test').args(leveljs, tape, testCommon) -require('abstract-leveldown/abstract/open-test').open(leveljs, tape, testCommon) -require('abstract-leveldown/abstract/put-test').all(leveljs, tape, testCommon) -require('abstract-leveldown/abstract/del-test').all(leveljs, tape, testCommon) -require('abstract-leveldown/abstract/get-test').all(leveljs, tape, testCommon) -require('abstract-leveldown/abstract/put-get-del-test').all(leveljs, tape, testCommon) -require('abstract-leveldown/abstract/batch-test').all(leveljs, tape, testCommon) -require('abstract-leveldown/abstract/chained-batch-test').all(leveljs, tape, testCommon) -require('abstract-leveldown/abstract/close-test').close(leveljs, tape, testCommon) -require('abstract-leveldown/abstract/iterator-test').all(leveljs, tape, testCommon) -require('abstract-leveldown/abstract/iterator-range-test').all(leveljs, tape, testCommon) - -// non abstract-leveldown tests: -require('./custom-tests.js').all(leveljs, tape, testCommon) From c8ea79608c74823c3deead7f4ed3af15b3775638 Mon Sep 17 00:00:00 2001 From: Vincent Weevers Date: Fri, 25 May 2018 19:34:27 +0200 Subject: [PATCH 6/9] remove manual end-test (closes #80) --- package.json | 1 - test/manual/end-test.js | 51 ----------------------------------------- 2 files changed, 52 deletions(-) delete mode 100644 test/manual/end-test.js diff --git a/package.json b/package.json index e619e21..a2b3c68 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,6 @@ "main": "index.js", "scripts": { "test": "airtap --local --no-coverage test/index.js", - "test-end": "airtap --local --no-coverage test/manual/end-test.js", "test-browsers": "airtap --sauce-connect --loopback airtap.local --no-coverage test/index.js" }, "repository": { diff --git a/test/manual/end-test.js b/test/manual/end-test.js deleted file mode 100644 index 817f4f1..0000000 --- a/test/manual/end-test.js +++ /dev/null @@ -1,51 +0,0 @@ -'use strict' - -var test = require('tape') -var leveljs = require('../..') -var testCommon = require('../testCommon') -var db - -test('setUp', testCommon.setUp) - -test('create', function (t) { - db = leveljs(testCommon.location()) - db.open(function (err) { - t.ifError(err) - - db.put('key', 'value', function (err) { - t.ifError(err) - t.end() - }) - }) -}) - -test('repeated end', function (t) { - function loop (n) { - if (n > 5e3) return t.end() - - var iterator = db.iterator() - - iterator.next(function (err, key, value) { - if (err) throw err - - t.is(key.toString(), 'key', 'correct key') - t.is(value.toString(), 'value', 'correct value') - - iterator.end(function (err) { - if (err) throw err - loop(n + 1) - }) - }) - } - - loop(0) -}) - -test('close', function (t) { - db.close(function (err) { - t.ifError(err) - t.end() - }) -}) - -test('tearDown', testCommon.tearDown) From b864b19f81157093b3b746f12e8a9bee9d9f8b7f Mon Sep 17 00:00:00 2001 From: Vincent Weevers Date: Fri, 25 May 2018 19:56:57 +0200 Subject: [PATCH 7/9] upgrade airtap to 0.0.7 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index a2b3c68..2b20d39 100644 --- a/package.json +++ b/package.json @@ -18,7 +18,7 @@ "author": "max ogden", "license": "MIT", "devDependencies": { - "airtap": "0.0.5", + "airtap": "0.0.7", "browserify": "~16.2.2", "encoding-down": "~5.0.2", "levelup": "~3.0.0", From 534907b0e648fd7b0c4c7e298054baa47ef41812 Mon Sep 17 00:00:00 2001 From: Vincent Weevers Date: Fri, 25 May 2018 19:58:35 +0200 Subject: [PATCH 8/9] gitignore npm files --- .gitignore | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 28f1ba7..f894770 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,4 @@ node_modules -.DS_Store \ No newline at end of file +.DS_Store +npm-debug.log +package-lock.json From 0cdcfafc11cd1f2915b85d22776909eb2d6b5306 Mon Sep 17 00:00:00 2001 From: Vincent Weevers Date: Fri, 25 May 2018 20:50:27 +0200 Subject: [PATCH 9/9] use setImmediate (closes #87) --- index.js | 3 ++- iterator.js | 17 ++++++++--------- package.json | 4 ++++ util/immediate-browser.js | 1 + util/immediate.js | 1 + 5 files changed, 16 insertions(+), 10 deletions(-) create mode 100644 util/immediate-browser.js create mode 100644 util/immediate.js diff --git a/index.js b/index.js index 6f66be7..85f9924 100644 --- a/index.js +++ b/index.js @@ -6,6 +6,7 @@ var AbstractLevelDOWN = require('abstract-leveldown').AbstractLevelDOWN var util = require('util') var Iterator = require('./iterator') var mixedToBuffer = require('./util/mixed-to-buffer') +var setImmediate = require('./util/immediate') var support = require('./util/support') var DEFAULT_PREFIX = 'level-js-' @@ -121,7 +122,7 @@ Level.prototype._iterator = function (options) { } Level.prototype._batch = function (operations, options, callback) { - if (operations.length === 0) return setTimeout(callback, 0) + if (operations.length === 0) return setImmediate(callback) var store = this.store('readwrite') var transaction = store.transaction diff --git a/iterator.js b/iterator.js index 98cac4e..4571a8e 100644 --- a/iterator.js +++ b/iterator.js @@ -4,6 +4,7 @@ var util = require('util') var AbstractIterator = require('abstract-leveldown').AbstractIterator var ltgt = require('ltgt') var mixedToBuffer = require('./util/mixed-to-buffer') +var setImmediate = require('./util/immediate') var noop = function () {} module.exports = Iterator @@ -110,16 +111,15 @@ Iterator.prototype.maybeNext = function () { } } -// TODO: use setImmediate (see memdown) Iterator.prototype._next = function (callback) { if (this._aborted) { // The error should be picked up by either next() or end(). var err = this._error this._error = null - setTimeout(function() { + setImmediate(function() { callback(err) - }, 0) + }) } else if (this._cache.length > 0) { var key = this._cache.shift() var value = this._cache.shift() @@ -127,24 +127,23 @@ Iterator.prototype._next = function (callback) { if (this._keyAsBuffer) key = mixedToBuffer(key) if (this._valueAsBuffer) value = mixedToBuffer(value) - setTimeout(function() { + setImmediate(function() { callback(null, key, value) - }, 0) + }) } else if (this._completed) { - setTimeout(callback, 0) + setImmediate(callback) } else { this._callback = callback } } -// TODO: use setImmediate (see memdown) Iterator.prototype._end = function (callback) { if (this._aborted || this._completed) { var err = this._error - setTimeout(function () { + setImmediate(function () { callback(err) - }, 0) + }) return } diff --git a/package.json b/package.json index 2b20d39..dfb4a98 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,11 @@ }, "dependencies": { "abstract-leveldown": "~5.0.0", + "immediate": "~3.2.3", "ltgt": "^2.1.2", "typedarray-to-buffer": "~3.1.5" + }, + "browser": { + "./util/immediate.js": "./util/immediate-browser.js" } } diff --git a/util/immediate-browser.js b/util/immediate-browser.js new file mode 100644 index 0000000..3e424be --- /dev/null +++ b/util/immediate-browser.js @@ -0,0 +1 @@ +module.exports = require('immediate') diff --git a/util/immediate.js b/util/immediate.js new file mode 100644 index 0000000..f09f984 --- /dev/null +++ b/util/immediate.js @@ -0,0 +1 @@ +module.exports = setImmediate