Path: blob/master/node_modules/asynckit/lib/streamify.js
1126 views
var async = require('./async.js');12// API3module.exports = {4iterator: wrapIterator,5callback: wrapCallback6};78/**9* Wraps iterators with long signature10*11* @this ReadableAsyncKit#12* @param {function} iterator - function to wrap13* @returns {function} - wrapped function14*/15function wrapIterator(iterator)16{17var stream = this;1819return function(item, key, cb)20{21var aborter22, wrappedCb = async(wrapIteratorCallback.call(stream, cb, key))23;2425stream.jobs[key] = wrappedCb;2627// it's either shortcut (item, cb)28if (iterator.length == 2)29{30aborter = iterator(item, wrappedCb);31}32// or long format (item, key, cb)33else34{35aborter = iterator(item, key, wrappedCb);36}3738return aborter;39};40}4142/**43* Wraps provided callback function44* allowing to execute snitch function before45* real callback46*47* @this ReadableAsyncKit#48* @param {function} callback - function to wrap49* @returns {function} - wrapped function50*/51function wrapCallback(callback)52{53var stream = this;5455var wrapped = function(error, result)56{57return finisher.call(stream, error, result, callback);58};5960return wrapped;61}6263/**64* Wraps provided iterator callback function65* makes sure snitch only called once,66* but passes secondary calls to the original callback67*68* @this ReadableAsyncKit#69* @param {function} callback - callback to wrap70* @param {number|string} key - iteration key71* @returns {function} wrapped callback72*/73function wrapIteratorCallback(callback, key)74{75var stream = this;7677return function(error, output)78{79// don't repeat yourself80if (!(key in stream.jobs))81{82callback(error, output);83return;84}8586// clean up jobs87delete stream.jobs[key];8889return streamer.call(stream, error, {key: key, value: output}, callback);90};91}9293/**94* Stream wrapper for iterator callback95*96* @this ReadableAsyncKit#97* @param {mixed} error - error response98* @param {mixed} output - iterator output99* @param {function} callback - callback that expects iterator results100*/101function streamer(error, output, callback)102{103if (error && !this.error)104{105this.error = error;106this.pause();107this.emit('error', error);108// send back value only, as expected109callback(error, output && output.value);110return;111}112113// stream stuff114this.push(output);115116// back to original track117// send back value only, as expected118callback(error, output && output.value);119}120121/**122* Stream wrapper for finishing callback123*124* @this ReadableAsyncKit#125* @param {mixed} error - error response126* @param {mixed} output - iterator output127* @param {function} callback - callback that expects final results128*/129function finisher(error, output, callback)130{131// signal end of the stream132// only for successfully finished streams133if (!error)134{135this.push(null);136}137138// back to original track139callback(error, output);140}141142143