You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
78 lines
1.8 KiB
78 lines
1.8 KiB
4 years ago
|
var nextTick = require('./next-tick')
|
||
|
|
||
|
function AbstractIterator (db) {
|
||
|
if (typeof db !== 'object' || db === null) {
|
||
|
throw new TypeError('First argument must be an abstract-leveldown compliant store')
|
||
|
}
|
||
|
|
||
|
this.db = db
|
||
|
this._ended = false
|
||
|
this._nexting = false
|
||
|
}
|
||
|
|
||
|
AbstractIterator.prototype.next = function (callback) {
|
||
|
var self = this
|
||
|
|
||
|
if (typeof callback !== 'function') {
|
||
|
throw new Error('next() requires a callback argument')
|
||
|
}
|
||
|
|
||
|
if (self._ended) {
|
||
|
nextTick(callback, new Error('cannot call next() after end()'))
|
||
|
return self
|
||
|
}
|
||
|
|
||
|
if (self._nexting) {
|
||
|
nextTick(callback, new Error('cannot call next() before previous next() has completed'))
|
||
|
return self
|
||
|
}
|
||
|
|
||
|
self._nexting = true
|
||
|
self._next(function () {
|
||
|
self._nexting = false
|
||
|
callback.apply(null, arguments)
|
||
|
})
|
||
|
|
||
|
return self
|
||
|
}
|
||
|
|
||
|
AbstractIterator.prototype._next = function (callback) {
|
||
|
nextTick(callback)
|
||
|
}
|
||
|
|
||
|
AbstractIterator.prototype.seek = function (target) {
|
||
|
if (this._ended) {
|
||
|
throw new Error('cannot call seek() after end()')
|
||
|
}
|
||
|
if (this._nexting) {
|
||
|
throw new Error('cannot call seek() before next() has completed')
|
||
|
}
|
||
|
|
||
|
target = this.db._serializeKey(target)
|
||
|
this._seek(target)
|
||
|
}
|
||
|
|
||
|
AbstractIterator.prototype._seek = function (target) {}
|
||
|
|
||
|
AbstractIterator.prototype.end = function (callback) {
|
||
|
if (typeof callback !== 'function') {
|
||
|
throw new Error('end() requires a callback argument')
|
||
|
}
|
||
|
|
||
|
if (this._ended) {
|
||
|
return nextTick(callback, new Error('end() already called on iterator'))
|
||
|
}
|
||
|
|
||
|
this._ended = true
|
||
|
this._end(callback)
|
||
|
}
|
||
|
|
||
|
AbstractIterator.prototype._end = function (callback) {
|
||
|
nextTick(callback)
|
||
|
}
|
||
|
|
||
|
// Expose browser-compatible nextTick for dependents
|
||
|
AbstractIterator.prototype._nextTick = nextTick
|
||
|
|
||
|
module.exports = AbstractIterator
|