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.
		
		
		
		
		
			
		
			
				
					
					
						
							91 lines
						
					
					
						
							1.6 KiB
						
					
					
				
			
		
		
	
	
							91 lines
						
					
					
						
							1.6 KiB
						
					
					
				var streamify = require('./streamify.js') | 
						|
  , defer     = require('./defer.js') | 
						|
  ; | 
						|
 | 
						|
// API | 
						|
module.exports = ReadableAsyncKit; | 
						|
 | 
						|
/** | 
						|
 * Base constructor for all streams | 
						|
 * used to hold properties/methods | 
						|
 */ | 
						|
function ReadableAsyncKit() | 
						|
{ | 
						|
  ReadableAsyncKit.super_.apply(this, arguments); | 
						|
 | 
						|
  // list of active jobs | 
						|
  this.jobs = {}; | 
						|
 | 
						|
  // add stream methods | 
						|
  this.destroy = destroy; | 
						|
  this._start  = _start; | 
						|
  this._read   = _read; | 
						|
} | 
						|
 | 
						|
/** | 
						|
 * Destroys readable stream, | 
						|
 * by aborting outstanding jobs | 
						|
 * | 
						|
 * @returns {void} | 
						|
 */ | 
						|
function destroy() | 
						|
{ | 
						|
  if (this.destroyed) | 
						|
  { | 
						|
    return; | 
						|
  } | 
						|
 | 
						|
  this.destroyed = true; | 
						|
 | 
						|
  if (typeof this.terminator == 'function') | 
						|
  { | 
						|
    this.terminator(); | 
						|
  } | 
						|
} | 
						|
 | 
						|
/** | 
						|
 * Starts provided jobs in async manner | 
						|
 * | 
						|
 * @private | 
						|
 */ | 
						|
function _start() | 
						|
{ | 
						|
  // first argument – runner function | 
						|
  var runner = arguments[0] | 
						|
    // take away first argument | 
						|
    , args   = Array.prototype.slice.call(arguments, 1) | 
						|
      // second argument - input data | 
						|
    , input  = args[0] | 
						|
      // last argument - result callback | 
						|
    , endCb  = streamify.callback.call(this, args[args.length - 1]) | 
						|
    ; | 
						|
 | 
						|
  args[args.length - 1] = endCb; | 
						|
  // third argument - iterator | 
						|
  args[1] = streamify.iterator.call(this, args[1]); | 
						|
 | 
						|
  // allow time for proper setup | 
						|
  defer(function() | 
						|
  { | 
						|
    if (!this.destroyed) | 
						|
    { | 
						|
      this.terminator = runner.apply(null, args); | 
						|
    } | 
						|
    else | 
						|
    { | 
						|
      endCb(null, Array.isArray(input) ? [] : {}); | 
						|
    } | 
						|
  }.bind(this)); | 
						|
} | 
						|
 | 
						|
 | 
						|
/** | 
						|
 * Implement _read to comply with Readable streams | 
						|
 * Doesn't really make sense for flowing object mode | 
						|
 * | 
						|
 * @private | 
						|
 */ | 
						|
function _read() | 
						|
{ | 
						|
 | 
						|
}
 | 
						|
 |