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