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.
56 lines
1.5 KiB
56 lines
1.5 KiB
var inherits = require('inherits'); |
|
var Readable = require('readable-stream').Readable; |
|
var extend = require('xtend'); |
|
var EncodingError = require('level-errors').EncodingError; |
|
|
|
module.exports = ReadStream; |
|
inherits(ReadStream, Readable); |
|
|
|
function ReadStream(iterator, options){ |
|
if (!(this instanceof ReadStream)) return new ReadStream(iterator, options); |
|
Readable.call(this, extend(options, { |
|
objectMode: true |
|
})); |
|
this._iterator = iterator; |
|
this._destroyed = false; |
|
this._decoder = null; |
|
if (options && options.decoder) this._decoder = options.decoder; |
|
this.on('end', this._cleanup.bind(this)); |
|
} |
|
|
|
ReadStream.prototype._read = function(){ |
|
var self = this; |
|
if (this._destroyed) return; |
|
|
|
this._iterator.next(function(err, key, value){ |
|
if (self._destroyed) return; |
|
if (err) return self.emit('error', err); |
|
if (key === undefined && value === undefined) { |
|
self.push(null); |
|
} else { |
|
if (!self._decoder) return self.push({ key: key, value: value }); |
|
|
|
try { |
|
var value = self._decoder(key, value); |
|
} catch (err) { |
|
self.emit('error', new EncodingError(err)); |
|
self.push(null); |
|
return; |
|
} |
|
self.push(value); |
|
} |
|
}); |
|
}; |
|
|
|
ReadStream.prototype.destroy = |
|
ReadStream.prototype._cleanup = function(){ |
|
var self = this; |
|
if (this._destroyed) return; |
|
this._destroyed = true; |
|
|
|
this._iterator.end(function(err){ |
|
if (err) return self.emit('error', err); |
|
self.emit('close'); |
|
}); |
|
}; |
|
|
|
|