react / wstein / node_modules / jest-cli / node_modules / jsdom / node_modules / request / node_modules / form-data / node_modules / combined-stream / node_modules / delayed-stream / lib / delayed_stream.js
81165 viewsvar Stream = require('stream').Stream;1var util = require('util');23module.exports = DelayedStream;4function DelayedStream() {5this.source = null;6this.dataSize = 0;7this.maxDataSize = 1024 * 1024;8this.pauseStream = true;910this._maxDataSizeExceeded = false;11this._released = false;12this._bufferedEvents = [];13}14util.inherits(DelayedStream, Stream);1516DelayedStream.create = function(source, options) {17var delayedStream = new this();1819options = options || {};20for (var option in options) {21delayedStream[option] = options[option];22}2324delayedStream.source = source;2526var realEmit = source.emit;27source.emit = function() {28delayedStream._handleEmit(arguments);29return realEmit.apply(source, arguments);30};3132source.on('error', function() {});33if (delayedStream.pauseStream) {34source.pause();35}3637return delayedStream;38};3940DelayedStream.prototype.__defineGetter__('readable', function() {41return this.source.readable;42});4344DelayedStream.prototype.resume = function() {45if (!this._released) {46this.release();47}4849this.source.resume();50};5152DelayedStream.prototype.pause = function() {53this.source.pause();54};5556DelayedStream.prototype.release = function() {57this._released = true;5859this._bufferedEvents.forEach(function(args) {60this.emit.apply(this, args);61}.bind(this));62this._bufferedEvents = [];63};6465DelayedStream.prototype.pipe = function() {66var r = Stream.prototype.pipe.apply(this, arguments);67this.resume();68return r;69};7071DelayedStream.prototype._handleEmit = function(args) {72if (this._released) {73this.emit.apply(this, args);74return;75}7677if (args[0] === 'data') {78this.dataSize += args[1].length;79this._checkIfMaxDataSizeExceeded();80}8182this._bufferedEvents.push(args);83};8485DelayedStream.prototype._checkIfMaxDataSizeExceeded = function() {86if (this._maxDataSizeExceeded) {87return;88}8990if (this.dataSize <= this.maxDataSize) {91return;92}9394this._maxDataSizeExceeded = true;95var message =96'DelayedStream#maxDataSize of ' + this.maxDataSize + ' bytes exceeded.'97this.emit('error', new Error(message));98};99100101