react / wstein / node_modules / jest-cli / node_modules / jsdom / node_modules / request / node_modules / combined-stream / node_modules / delayed-stream / lib / delayed_stream.js
81154 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};3940Object.defineProperty(DelayedStream.prototype, 'readable', {41configurable: true,42enumerable: true,43get: function() {44return this.source.readable;45}46});4748DelayedStream.prototype.setEncoding = function() {49return this.source.setEncoding.apply(this.source, arguments);50};5152DelayedStream.prototype.resume = function() {53if (!this._released) {54this.release();55}5657this.source.resume();58};5960DelayedStream.prototype.pause = function() {61this.source.pause();62};6364DelayedStream.prototype.release = function() {65this._released = true;6667this._bufferedEvents.forEach(function(args) {68this.emit.apply(this, args);69}.bind(this));70this._bufferedEvents = [];71};7273DelayedStream.prototype.pipe = function() {74var r = Stream.prototype.pipe.apply(this, arguments);75this.resume();76return r;77};7879DelayedStream.prototype._handleEmit = function(args) {80if (this._released) {81this.emit.apply(this, args);82return;83}8485if (args[0] === 'data') {86this.dataSize += args[1].length;87this._checkIfMaxDataSizeExceeded();88}8990this._bufferedEvents.push(args);91};9293DelayedStream.prototype._checkIfMaxDataSizeExceeded = function() {94if (this._maxDataSizeExceeded) {95return;96}9798if (this.dataSize <= this.maxDataSize) {99return;100}101102this._maxDataSizeExceeded = true;103var message =104'DelayedStream#maxDataSize of ' + this.maxDataSize + ' bytes exceeded.'105this.emit('error', new Error(message));106};107108109