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.
		
		
		
		
			
				
					104 lines
				
				2.0 KiB
			
		
		
			
		
	
	
					104 lines
				
				2.0 KiB
			| 
								 
											4 years ago
										 
									 | 
							
								var Readable = require('readable-stream').Readable
							 | 
						||
| 
								 | 
							
								var inherits = require('inherits')
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								module.exports = from2
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								from2.ctor = ctor
							 | 
						||
| 
								 | 
							
								from2.obj = obj
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								var Proto = ctor()
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function toFunction(list) {
							 | 
						||
| 
								 | 
							
								  list = list.slice()
							 | 
						||
| 
								 | 
							
								  return function (_, cb) {
							 | 
						||
| 
								 | 
							
								    var err = null
							 | 
						||
| 
								 | 
							
								    var item = list.length ? list.shift() : null
							 | 
						||
| 
								 | 
							
								    if (item instanceof Error) {
							 | 
						||
| 
								 | 
							
								      err = item
							 | 
						||
| 
								 | 
							
								      item = null
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    cb(err, item)
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function from2(opts, read) {
							 | 
						||
| 
								 | 
							
								  if (typeof opts !== 'object' || Array.isArray(opts)) {
							 | 
						||
| 
								 | 
							
								    read = opts
							 | 
						||
| 
								 | 
							
								    opts = {}
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  var rs = new Proto(opts)
							 | 
						||
| 
								 | 
							
								  rs._from = Array.isArray(read) ? toFunction(read) : (read || noop)
							 | 
						||
| 
								 | 
							
								  return rs
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function ctor(opts, read) {
							 | 
						||
| 
								 | 
							
								  if (typeof opts === 'function') {
							 | 
						||
| 
								 | 
							
								    read = opts
							 | 
						||
| 
								 | 
							
								    opts = {}
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  opts = defaults(opts)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  inherits(Class, Readable)
							 | 
						||
| 
								 | 
							
								  function Class(override) {
							 | 
						||
| 
								 | 
							
								    if (!(this instanceof Class)) return new Class(override)
							 | 
						||
| 
								 | 
							
								    this._reading = false
							 | 
						||
| 
								 | 
							
								    this._callback = check
							 | 
						||
| 
								 | 
							
								    this.destroyed = false
							 | 
						||
| 
								 | 
							
								    Readable.call(this, override || opts)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    var self = this
							 | 
						||
| 
								 | 
							
								    var hwm = this._readableState.highWaterMark
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    function check(err, data) {
							 | 
						||
| 
								 | 
							
								      if (self.destroyed) return
							 | 
						||
| 
								 | 
							
								      if (err) return self.destroy(err)
							 | 
						||
| 
								 | 
							
								      if (data === null) return self.push(null)
							 | 
						||
| 
								 | 
							
								      self._reading = false
							 | 
						||
| 
								 | 
							
								      if (self.push(data)) self._read(hwm)
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  Class.prototype._from = read || noop
							 | 
						||
| 
								 | 
							
								  Class.prototype._read = function(size) {
							 | 
						||
| 
								 | 
							
								    if (this._reading || this.destroyed) return
							 | 
						||
| 
								 | 
							
								    this._reading = true
							 | 
						||
| 
								 | 
							
								    this._from(size, this._callback)
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  Class.prototype.destroy = function(err) {
							 | 
						||
| 
								 | 
							
								    if (this.destroyed) return
							 | 
						||
| 
								 | 
							
								    this.destroyed = true
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    var self = this
							 | 
						||
| 
								 | 
							
								    process.nextTick(function() {
							 | 
						||
| 
								 | 
							
								      if (err) self.emit('error', err)
							 | 
						||
| 
								 | 
							
								      self.emit('close')
							 | 
						||
| 
								 | 
							
								    })
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  return Class
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function obj(opts, read) {
							 | 
						||
| 
								 | 
							
								  if (typeof opts === 'function' || Array.isArray(opts)) {
							 | 
						||
| 
								 | 
							
								    read = opts
							 | 
						||
| 
								 | 
							
								    opts = {}
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  opts = defaults(opts)
							 | 
						||
| 
								 | 
							
								  opts.objectMode = true
							 | 
						||
| 
								 | 
							
								  opts.highWaterMark = 16
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  return from2(opts, read)
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function noop () {}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function defaults(opts) {
							 | 
						||
| 
								 | 
							
								  opts = opts || {}
							 | 
						||
| 
								 | 
							
								  return opts
							 | 
						||
| 
								 | 
							
								}
							 |