|  |  | 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()
 | 
						
						
						
							|  |  | {
 | 
						
						
						
							|  |  | 
 | 
						
						
						
							|  |  | }
 |