brush_cli
Version:
A tool for creating and developing cmos PC Framework project.
77 lines (65 loc) • 2.02 kB
JavaScript
var Readable = require('readable-stream').Readable;
// wrap an old-style stream as the async data source.
// This is *not* part of the readable stream interface.
// It is an ugly unfortunate mess of history.
module.exports = wrap;
module.exports.obj = function (stream, opts) {
if (!opts) opts = {};
opts.objectMode = true;
return wrap(stream, opts);
};
function wrap (stream, opts) {
var self = new Readable(opts)
var state = self._readableState;
var paused = false;
stream.on('end', function() {
if (state.decoder && !state.ended) {
var chunk = state.decoder.end();
if (chunk && chunk.length)
self.push(chunk);
}
self.push(null);
});
stream.on('data', function(chunk) {
if (state.decoder)
chunk = state.decoder.write(chunk);
// don't skip over falsy values in objectMode
//if (state.objectMode && util.isNullOrUndefined(chunk))
if (state.objectMode && (chunk === null || chunk === undefined))
return
else if (!state.objectMode && (!chunk || !chunk.length))
return;
var ret = self.push(chunk);
if (!ret) {
paused = true;
stream.pause();
}
});
// proxy all the other methods.
// important when wrapping filters and duplexes.
for (var i in stream) {
if (typeof stream[i] === 'function' &&
typeof self[i] === 'undefined') {
self[i] = function(method) { return function() {
return stream[method].apply(stream, arguments);
}}(i);
}
}
// proxy certain important events.
var events = ['error', 'close', 'destroy', 'pause', 'resume'];
for (var i = 0; i < events.length; i++) (function (ev) {
stream.on(ev, function () {
var args = [ ev ].concat([].slice.call(arguments));
self.emit.apply(self, args);
})
})(events[i]);
// when we try to consume some more bytes, simply unpause the
// underlying stream.
self._read = function(n) {
if (paused) {
paused = false;
stream.resume();
}
};
return self;
};