From 3ae923e949beaa9a17ac58e435f8be6059dc2896 Mon Sep 17 00:00:00 2001 From: Steven-John Lange Date: Thu, 13 Jun 2024 00:24:22 +0200 Subject: [PATCH 01/10] chore: modernize sublevel-pouchdb --- .../sublevel-pouchdb/src/batch.js | 29 +++++++------- .../sublevel-pouchdb/src/index.js | 2 +- .../sublevel-pouchdb/src/legacyCodec.js | 4 +- .../node_modules/sublevel-pouchdb/src/nut.js | 16 +++----- .../sublevel-pouchdb/src/readStream.js | 39 ++++++++----------- .../sublevel-pouchdb/src/shell.js | 22 +++++------ 6 files changed, 49 insertions(+), 63 deletions(-) diff --git a/packages/node_modules/sublevel-pouchdb/src/batch.js b/packages/node_modules/sublevel-pouchdb/src/batch.js index 6dd533675c..8b568666fe 100644 --- a/packages/node_modules/sublevel-pouchdb/src/batch.js +++ b/packages/node_modules/sublevel-pouchdb/src/batch.js @@ -1,5 +1,5 @@ function addOperation(type, key, value, options) { - var operation = { + const operation = { type, key, value, @@ -16,22 +16,23 @@ function addOperation(type, key, value, options) { return this; } -function Batch(sdb) { - this._operations = []; - this._sdb = sdb; +class Batch { + constructor(sdb) { + this._operations = []; + this._sdb = sdb; - this.put = addOperation.bind(this, 'put'); - this.del = addOperation.bind(this, 'del'); -} + this.put = addOperation.bind(this, 'put'); + this.del = addOperation.bind(this, 'del'); + } -var B = Batch.prototype; + clear() { + this._operations = []; + } -B.clear = function () { - this._operations = []; -}; + write(cb) { + this._sdb.batch(this._operations, cb); + } +} -B.write = function (cb) { - this._sdb.batch(this._operations, cb); -}; export default Batch; diff --git a/packages/node_modules/sublevel-pouchdb/src/index.js b/packages/node_modules/sublevel-pouchdb/src/index.js index 67f8a2523e..5fd7e2a179 100644 --- a/packages/node_modules/sublevel-pouchdb/src/index.js +++ b/packages/node_modules/sublevel-pouchdb/src/index.js @@ -4,7 +4,7 @@ import Codec from 'level-codec'; import ReadStream from './readStream'; import precodec from './legacyCodec'; -var codec = new Codec(); +const codec = new Codec(); function sublevelPouch(db) { return shell(nut(db, precodec, codec), [], ReadStream, db.options); diff --git a/packages/node_modules/sublevel-pouchdb/src/legacyCodec.js b/packages/node_modules/sublevel-pouchdb/src/legacyCodec.js index b35262a479..dca0ef2040 100644 --- a/packages/node_modules/sublevel-pouchdb/src/legacyCodec.js +++ b/packages/node_modules/sublevel-pouchdb/src/legacyCodec.js @@ -3,8 +3,8 @@ export default { return '\xff' + decodedKey[0] + '\xff' + decodedKey[1]; }, decode: function (encodedKeyAsBuffer) { - var str = encodedKeyAsBuffer.toString(); - var idx = str.indexOf('\xff', 1); + const str = encodedKeyAsBuffer.toString(); + const idx = str.indexOf('\xff', 1); return [str.substring(1, idx), str.substring(idx + 1)]; }, lowerBound: '\x00', diff --git a/packages/node_modules/sublevel-pouchdb/src/nut.js b/packages/node_modules/sublevel-pouchdb/src/nut.js index 71b5192b27..c61a530518 100644 --- a/packages/node_modules/sublevel-pouchdb/src/nut.js +++ b/packages/node_modules/sublevel-pouchdb/src/nut.js @@ -12,8 +12,8 @@ function getPrefix(db) { } function clone(_obj) { - var obj = {}; - for (var k in _obj) { + const obj = {}; + for (let k in _obj) { obj[k] = _obj[k]; } return obj; @@ -39,13 +39,9 @@ function nut(db, precodec, codec) { return { apply: function (ops, opts, cb) { opts = opts || {}; + const batch = []; - var batch = []; - var i = -1; - var len = ops.length; - - while (++i < len) { - var op = ops[i]; + for (const op of ops) { addEncodings(op, op.prefix); op.prefix = getPrefix(op.prefix); batch.push({ @@ -85,8 +81,8 @@ function nut(db, precodec, codec) { return db.close(cb); }, iterator: function (_opts) { - var opts = clone(_opts || {}); - var prefix = _opts.prefix || []; + const opts = clone(_opts || {}); + const prefix = _opts.prefix || []; function encodeKey(key) { return encodePrefix(prefix, key, opts, {}); diff --git a/packages/node_modules/sublevel-pouchdb/src/readStream.js b/packages/node_modules/sublevel-pouchdb/src/readStream.js index dca4ff70ef..0433b6285d 100644 --- a/packages/node_modules/sublevel-pouchdb/src/readStream.js +++ b/packages/node_modules/sublevel-pouchdb/src/readStream.js @@ -3,11 +3,7 @@ * MIT License */ -// NOTE: we are fixed to readable-stream@1.0.x for now -// for pure Streams2 across Node versions -import ReadableStreamCore from 'readable-stream'; - -var Readable = ReadableStreamCore.Readable; +import { Readable } from 'node:stream'; function createClass(parent, init) { let klass = function (...args) { @@ -58,20 +54,19 @@ class ReadStreamInternal extends Readable { this._destroyed = true; - var self = this; /* istanbul ignore if */ if (err && err.message !== 'iterator has ended') { - self.emit('error', err); + this.emit('error', err); } /* istanbul ignore else */ - if (self._iterator) { - self._iterator.end(function () { - self._iterator = null; - self.emit('close'); + if (this._iterator) { + this._iterator.end(() => { + this._iterator = null; + this.emit('close'); }); } else { - self.emit('close'); + this.emit('close'); } } @@ -80,28 +75,27 @@ class ReadStreamInternal extends Readable { } _read() { - var self = this; /* istanbul ignore if */ - if (self._destroyed) { + if (this._destroyed) { return; } /* istanbul ignore if */ - if (!self._iterator) { + if (!this._iterator) { return this._waiting = true; } - self._iterator.next(function (err, key, value) { + this._iterator.next((err, key, value) => { if (err || (key === undefined && value === undefined)) { - if (!err && !self._destroyed) { - self.push(null); + if (!err && !this._destroyed) { + this.push(null); } - return self._cleanup(err); + return this._cleanup(err); } - value = self._makeData(key, value); - if (!self._destroyed) { - self.push(value); + value = this._makeData(key, value); + if (!this._destroyed) { + this.push(value); } }); } @@ -112,4 +106,3 @@ const ReadStream = createClass(ReadStreamInternal, function (options, makeData) }); export default ReadStream; - diff --git a/packages/node_modules/sublevel-pouchdb/src/shell.js b/packages/node_modules/sublevel-pouchdb/src/shell.js index fd7cf2ee0e..86cdf69280 100644 --- a/packages/node_modules/sublevel-pouchdb/src/shell.js +++ b/packages/node_modules/sublevel-pouchdb/src/shell.js @@ -1,13 +1,11 @@ -import events from 'events'; +import { EventEmitter } from 'node:events'; import NotFoundError from './NotFoundError'; -var EventEmitter = events.EventEmitter; -var version = "6.5.4"; +const version = "6.5.4"; +const NOT_FOUND_ERROR = new NotFoundError(); -var NOT_FOUND_ERROR = new NotFoundError(); - -var sublevel = function (nut, prefix, createStream, options) { - var emitter = new EventEmitter(); +const sublevel = function (nut, prefix, createStream, options) { + const emitter = new EventEmitter(); emitter.sublevels = {}; emitter.options = options; @@ -17,8 +15,8 @@ var sublevel = function (nut, prefix, createStream, options) { prefix = prefix || []; function mergeOpts(opts) { - var o = {}; - var k; + const o = {}; + let k; if (options) { for (k in options) { if (typeof options[k] !== 'undefined') { @@ -109,11 +107,9 @@ var sublevel = function (nut, prefix, createStream, options) { emitter.readStream = emitter.createReadStream = function (opts) { opts = mergeOpts(opts); opts.prefix = prefix; - var stream; - var it = nut.iterator(opts); - stream = createStream(opts, nut.createDecoder(opts)); - stream.setIterator(it); + const stream = createStream(opts, nut.createDecoder(opts)); + stream.setIterator(nut.iterator(opts)); return stream; }; From 59698315963990ef054750ed90530c6d38712a7a Mon Sep 17 00:00:00 2001 From: Steven-John Lange Date: Thu, 13 Jun 2024 00:24:53 +0200 Subject: [PATCH 02/10] chore: remove unused `readable-stream` dependency --- package.json | 3 --- 1 file changed, 3 deletions(-) diff --git a/package.json b/package.json index 2dd3f4eba3..073f383e2f 100644 --- a/package.json +++ b/package.json @@ -52,7 +52,6 @@ "ltgt": "2.2.1", "memdown": "1.4.1", "node-fetch": "2.6.9", - "readable-stream": "1.1.14", "spark-md5": "3.0.2", "through2": "3.0.2", "uuid": "8.3.2", @@ -106,13 +105,11 @@ }, "// greenkeeper": [ "// chai-as-promised is pinned because of breaking changes in 6.0.0", - "// readable-stream has breaking changes in 2.0.0", "// stream-to-promise is pinned because there's a breaking change in 2.0.0" ], "greenkeeper": { "ignore": [ "chai-as-promised", - "readable-stream", "stream-to-promise" ] } From 220e1844340210de28dfa6aaf5df344eb8e80e2a Mon Sep 17 00:00:00 2001 From: Steven-John Lange Date: Thu, 13 Jun 2024 00:44:17 +0200 Subject: [PATCH 03/10] rollup can't resolve `node:events` --- packages/node_modules/sublevel-pouchdb/src/shell.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/node_modules/sublevel-pouchdb/src/shell.js b/packages/node_modules/sublevel-pouchdb/src/shell.js index 86cdf69280..afc4b804ff 100644 --- a/packages/node_modules/sublevel-pouchdb/src/shell.js +++ b/packages/node_modules/sublevel-pouchdb/src/shell.js @@ -1,4 +1,4 @@ -import { EventEmitter } from 'node:events'; +import { EventEmitter } from 'events'; import NotFoundError from './NotFoundError'; const version = "6.5.4"; From 91114171ee490c0d4c242afacfe2e915d1c2bf79 Mon Sep 17 00:00:00 2001 From: Steven-John Lange Date: Thu, 13 Jun 2024 00:47:21 +0200 Subject: [PATCH 04/10] rollup can't resolve `node:stream` --- packages/node_modules/sublevel-pouchdb/src/readStream.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/node_modules/sublevel-pouchdb/src/readStream.js b/packages/node_modules/sublevel-pouchdb/src/readStream.js index 0433b6285d..fa2e8c9409 100644 --- a/packages/node_modules/sublevel-pouchdb/src/readStream.js +++ b/packages/node_modules/sublevel-pouchdb/src/readStream.js @@ -3,7 +3,7 @@ * MIT License */ -import { Readable } from 'node:stream'; +import { Readable } from 'stream'; function createClass(parent, init) { let klass = function (...args) { From ef5212100cff0b97c50993669d8cba7e20214f09 Mon Sep 17 00:00:00 2001 From: Steven-John Lange Date: Thu, 13 Jun 2024 01:03:01 +0200 Subject: [PATCH 05/10] chore: should not override `Readable.prototype.destroy`, instead implement `_destroy` --- packages/node_modules/sublevel-pouchdb/src/readStream.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/node_modules/sublevel-pouchdb/src/readStream.js b/packages/node_modules/sublevel-pouchdb/src/readStream.js index fa2e8c9409..83a47e5340 100644 --- a/packages/node_modules/sublevel-pouchdb/src/readStream.js +++ b/packages/node_modules/sublevel-pouchdb/src/readStream.js @@ -70,7 +70,7 @@ class ReadStreamInternal extends Readable { } } - destroy() { + _destroy() { this._cleanup(); } From 476c247e5283ad006727aefdd89fc742af57b266 Mon Sep 17 00:00:00 2001 From: Steven-John Lange Date: Thu, 13 Jun 2024 01:28:43 +0200 Subject: [PATCH 06/10] chore(sublevel-pouchdb): simplify clone --- packages/node_modules/sublevel-pouchdb/src/nut.js | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/packages/node_modules/sublevel-pouchdb/src/nut.js b/packages/node_modules/sublevel-pouchdb/src/nut.js index c61a530518..de6ec49944 100644 --- a/packages/node_modules/sublevel-pouchdb/src/nut.js +++ b/packages/node_modules/sublevel-pouchdb/src/nut.js @@ -12,11 +12,7 @@ function getPrefix(db) { } function clone(_obj) { - const obj = {}; - for (let k in _obj) { - obj[k] = _obj[k]; - } - return obj; + return Object.assign({}, _obj); } function nut(db, precodec, codec) { From 22eb776f4842d2536212fd2522367654ccd2900c Mon Sep 17 00:00:00 2001 From: Steven-John Lange Date: Thu, 13 Jun 2024 02:16:06 +0200 Subject: [PATCH 07/10] chore: update to ES6 function style --- .../sublevel-pouchdb/src/legacyCodec.js | 4 ++-- .../node_modules/sublevel-pouchdb/src/nut.js | 18 +++++++++--------- .../node_modules/sublevel-pouchdb/src/pull.js | 6 +++--- .../sublevel-pouchdb/src/readStream.js | 3 +-- 4 files changed, 15 insertions(+), 16 deletions(-) diff --git a/packages/node_modules/sublevel-pouchdb/src/legacyCodec.js b/packages/node_modules/sublevel-pouchdb/src/legacyCodec.js index dca0ef2040..9fcc65793a 100644 --- a/packages/node_modules/sublevel-pouchdb/src/legacyCodec.js +++ b/packages/node_modules/sublevel-pouchdb/src/legacyCodec.js @@ -1,8 +1,8 @@ export default { - encode: function (decodedKey) { + encode(decodedKey) { return '\xff' + decodedKey[0] + '\xff' + decodedKey[1]; }, - decode: function (encodedKeyAsBuffer) { + decode(encodedKeyAsBuffer) { const str = encodedKeyAsBuffer.toString(); const idx = str.indexOf('\xff', 1); return [str.substring(1, idx), str.substring(idx + 1)]; diff --git a/packages/node_modules/sublevel-pouchdb/src/nut.js b/packages/node_modules/sublevel-pouchdb/src/nut.js index de6ec49944..6a0a3e25b8 100644 --- a/packages/node_modules/sublevel-pouchdb/src/nut.js +++ b/packages/node_modules/sublevel-pouchdb/src/nut.js @@ -30,10 +30,10 @@ function nut(db, precodec, codec) { return op; } - db.open(function () { /* no-op */}); + db.open(() => { /* no-op */ }); return { - apply: function (ops, opts, cb) { + apply(ops, opts, cb) { opts = opts || {}; const batch = []; @@ -48,7 +48,7 @@ function nut(db, precodec, codec) { } db.db.batch(batch, opts, cb); }, - get: function (key, prefix, opts, cb) { + get(key, prefix, opts, cb) { opts.asBuffer = codec.valueAsBuffer(opts); return db.db.get( encodePrefix(prefix, key, opts), @@ -62,7 +62,7 @@ function nut(db, precodec, codec) { } ); }, - createDecoder: function (opts) { + createDecoder(opts) { return function (key, value) { return { key: codec.decodeKey(precodec.decode(key)[1], opts), @@ -70,13 +70,13 @@ function nut(db, precodec, codec) { }; }; }, - isClosed: function isClosed() { + isClosed() { return db.isClosed(); }, - close: function close(cb) { + close(cb) { return db.close(cb); }, - iterator: function (_opts) { + iterator(_opts) { const opts = clone(_opts || {}); const prefix = _opts.prefix || []; @@ -109,10 +109,10 @@ function nut(db, precodec, codec) { function wrapIterator(iterator) { return { - next: function (cb) { + next(cb) { return iterator.next(cb); }, - end: function (cb) { + end(cb) { iterator.end(cb); } }; diff --git a/packages/node_modules/sublevel-pouchdb/src/pull.js b/packages/node_modules/sublevel-pouchdb/src/pull.js index fc9d996d74..587e234d1d 100644 --- a/packages/node_modules/sublevel-pouchdb/src/pull.js +++ b/packages/node_modules/sublevel-pouchdb/src/pull.js @@ -5,10 +5,10 @@ import pull from 'pull-stream'; function pullReadStream(options, makeData) { var stream = pull.defer(); - stream.setIterator = function (iterator) { - stream.resolve(function (end, cb) { + stream.setIterator = (iterator) => { + stream.resolve((end, cb) => { if (!end) { - iterator.next(function (err, key, value) { + iterator.next((err, key, value) => { if (err) { return cb(err); } diff --git a/packages/node_modules/sublevel-pouchdb/src/readStream.js b/packages/node_modules/sublevel-pouchdb/src/readStream.js index 83a47e5340..c0b7b7027b 100644 --- a/packages/node_modules/sublevel-pouchdb/src/readStream.js +++ b/packages/node_modules/sublevel-pouchdb/src/readStream.js @@ -37,7 +37,7 @@ class ReadStreamInternal extends Readable { this._iterator = it; /* istanbul ignore if */ if (this._destroyed) { - return it.end(function () {}); + return it.end(() => { }); } /* istanbul ignore if */ if (this._waiting) { @@ -92,7 +92,6 @@ class ReadStreamInternal extends Readable { return this._cleanup(err); } - value = this._makeData(key, value); if (!this._destroyed) { this.push(value); From c96a17fcdfc858b9b78e62b390126ebd095357e9 Mon Sep 17 00:00:00 2001 From: Steven-John Lange Date: Thu, 13 Jun 2024 02:16:36 +0200 Subject: [PATCH 08/10] chore: simplify nut.js --- packages/node_modules/sublevel-pouchdb/src/nut.js | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/packages/node_modules/sublevel-pouchdb/src/nut.js b/packages/node_modules/sublevel-pouchdb/src/nut.js index 6a0a3e25b8..3dae19fea6 100644 --- a/packages/node_modules/sublevel-pouchdb/src/nut.js +++ b/packages/node_modules/sublevel-pouchdb/src/nut.js @@ -1,20 +1,12 @@ import ltgt from 'ltgt'; -function isFunction(f) { - return 'function' === typeof f; -} - function getPrefix(db) { - if (isFunction(db.prefix)) { + if (typeof db.prefix === 'function') { return db.prefix(); } return db; } -function clone(_obj) { - return Object.assign({}, _obj); -} - function nut(db, precodec, codec) { function encodePrefix(prefix, key, opts1, opts2) { return precodec.encode([ prefix, codec.encodeKey(key, opts1, opts2 ) ]); @@ -77,7 +69,7 @@ function nut(db, precodec, codec) { return db.close(cb); }, iterator(_opts) { - const opts = clone(_opts || {}); + const opts = Object.assign({}, _opts || {}); const prefix = _opts.prefix || []; function encodeKey(key) { From c9b3977bede6126bf2693074b5498a881779d6ec Mon Sep 17 00:00:00 2001 From: Steven-John Lange Date: Thu, 13 Jun 2024 02:16:51 +0200 Subject: [PATCH 09/10] chore: update var -> const in pull.js --- packages/node_modules/sublevel-pouchdb/src/pull.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/node_modules/sublevel-pouchdb/src/pull.js b/packages/node_modules/sublevel-pouchdb/src/pull.js index 587e234d1d..c67e2429c1 100644 --- a/packages/node_modules/sublevel-pouchdb/src/pull.js +++ b/packages/node_modules/sublevel-pouchdb/src/pull.js @@ -4,7 +4,7 @@ import pull from 'pull-stream'; // I should be able pretty much just drop that in. function pullReadStream(options, makeData) { - var stream = pull.defer(); + const stream = pull.defer(); stream.setIterator = (iterator) => { stream.resolve((end, cb) => { if (!end) { From 8df708f474c792dfc26e604fbfadb3b0dd0f3e16 Mon Sep 17 00:00:00 2001 From: Steven-John Lange Date: Thu, 13 Jun 2024 02:18:05 +0200 Subject: [PATCH 10/10] chore: rewrite sublevel EventEmitter to be a class --- .../sublevel-pouchdb/src/shell.js | 192 +++++++++--------- 1 file changed, 94 insertions(+), 98 deletions(-) diff --git a/packages/node_modules/sublevel-pouchdb/src/shell.js b/packages/node_modules/sublevel-pouchdb/src/shell.js index afc4b804ff..3ed7b8af69 100644 --- a/packages/node_modules/sublevel-pouchdb/src/shell.js +++ b/packages/node_modules/sublevel-pouchdb/src/shell.js @@ -4,124 +4,120 @@ import NotFoundError from './NotFoundError'; const version = "6.5.4"; const NOT_FOUND_ERROR = new NotFoundError(); -const sublevel = function (nut, prefix, createStream, options) { - const emitter = new EventEmitter(); - emitter.sublevels = {}; - emitter.options = options; +function sublevel(nut, prefix, createStream, options = {}) { + prefix = prefix || []; - emitter.version = version; + function mergeOpts(opts = {}) { + return Object.assign({}, options, opts); + } - emitter.methods = {}; - prefix = prefix || []; + class SublevelEventEmitter extends EventEmitter { + constructor() { + super(); + this.isOpen = nut.isOpen; + this.isClosed = nut.isClosed; + this.sublevels = {}; + this.options = options; + this.version = version; + this.methods = {}; + } - function mergeOpts(opts) { - const o = {}; - let k; - if (options) { - for (k in options) { - if (typeof options[k] !== 'undefined') { - o[k] = options[k]; - } + put(key, value, opts, cb) { + if ('function' === typeof opts) { + cb = opts; + opts = {}; } - } - if (opts) { - for (k in opts) { - if (typeof opts[k] !== 'undefined') { - o[k] = opts[k]; + + nut.apply( + [{ + key, + value, + prefix: prefix.slice(), type: 'put' + }], + mergeOpts(opts), + (err) => { + /* istanbul ignore next */ + if (err) { + return cb(err); + } + this.emit('put', key, value); + cb(null); } - } + ); } - return o; - } - emitter.put = function (key, value, opts, cb) { - if ('function' === typeof opts) { - cb = opts; - opts = {}; - } + prefix() { return prefix.slice(); } - nut.apply([{ - key, value, - prefix: prefix.slice(), type: 'put' - }], mergeOpts(opts), function (err) { - /* istanbul ignore next */ - if (err) { - return cb(err); + batch(ops, opts, cb) { + if ('function' === typeof opts) { + cb = opts; + opts = {}; } - emitter.emit('put', key, value); - cb(null); - }); - }; - - emitter.prefix = function () { - return prefix.slice(); - }; - - emitter.batch = function (ops, opts, cb) { - if ('function' === typeof opts) { - cb = opts; - opts = {}; + + ops = ops.map((op) => { + return { + key: op.key, + value: op.value, + prefix: op.prefix || prefix, + keyEncoding: op.keyEncoding, // * + valueEncoding: op.valueEncoding, // * (TODO: encodings on sublevel) + type: op.type + }; + }); + + nut.apply(ops, mergeOpts(opts), (err) => { + /* istanbul ignore next */ + if (err) { + return cb(err); + } + this.emit('batch', ops); + cb(null); + }); } - ops = ops.map(function (op) { - return { - key: op.key, - value: op.value, - prefix: op.prefix || prefix, - keyEncoding: op.keyEncoding, // * - valueEncoding: op.valueEncoding, // * (TODO: encodings on sublevel) - type: op.type - }; - }); - - nut.apply(ops, mergeOpts(opts), function (err) { - /* istanbul ignore next */ - if (err) { - return cb(err); + get(key, opts, cb) { + /* istanbul ignore else */ + if ('function' === typeof opts) { + cb = opts; + opts = {}; } - emitter.emit('batch', ops); - cb(null); - }); - }; - - emitter.get = function (key, opts, cb) { - /* istanbul ignore else */ - if ('function' === typeof opts) { - cb = opts; - opts = {}; + nut.get(key, prefix, mergeOpts(opts), (err, value) => { + if (err) { + cb(NOT_FOUND_ERROR); + } else { + cb(null, value); + } + }); } - nut.get(key, prefix, mergeOpts(opts), function (err, value) { - if (err) { - cb(NOT_FOUND_ERROR); - } else { - cb(null, value); + + sublevel(name, opts) { + if (!(name in this.sublevels)) { + this.sublevels[name] = sublevel(nut, prefix.concat(name), createStream, mergeOpts(opts)); } - }); - }; - emitter.sublevel = function (name, opts) { - return emitter.sublevels[name] = - emitter.sublevels[name] || sublevel(nut, prefix.concat(name), createStream, mergeOpts(opts)); - }; + return this.sublevels[name]; + } - emitter.readStream = emitter.createReadStream = function (opts) { - opts = mergeOpts(opts); - opts.prefix = prefix; + readStream(opts) { + return this.createReadStream(opts); + } - const stream = createStream(opts, nut.createDecoder(opts)); - stream.setIterator(nut.iterator(opts)); + createReadStream(opts) { + opts = mergeOpts(opts); + opts.prefix = prefix; - return stream; - }; + const stream = createStream(opts, nut.createDecoder(opts)); + stream.setIterator(nut.iterator(opts)); - emitter.close = function (cb) { - nut.close(cb); - }; + return stream; + } - emitter.isOpen = nut.isOpen; - emitter.isClosed = nut.isClosed; + close(cb) { + nut.close(cb); + } + } - return emitter; -}; + return new SublevelEventEmitter(); +} export default sublevel;