73 lines
1.6 KiB
JavaScript
73 lines
1.6 KiB
JavaScript
// Copyright 2012 Mark Cavage, Inc. All rights reserved.
|
|
|
|
'use strict';
|
|
|
|
///--- Helpers
|
|
|
|
/**
|
|
* @private
|
|
* @function pauseStream
|
|
* @param {Stream} stream - the stream to pause
|
|
* @returns {undefined} no return value
|
|
*/
|
|
function pauseStream(stream) {
|
|
function _buffer(chunk) {
|
|
stream.__buffered.push(chunk);
|
|
}
|
|
|
|
function _catchEnd(chunk) {
|
|
stream.__rstfyEnded = true;
|
|
}
|
|
|
|
stream.__rstfyEnded = false;
|
|
stream.__rstfyPaused = true;
|
|
stream.__buffered = [];
|
|
stream.on('data', _buffer);
|
|
stream.once('end', _catchEnd);
|
|
stream.pause();
|
|
|
|
stream._resume = stream.resume;
|
|
stream.resume = function _rstfy_resume() {
|
|
if (!stream.__rstfyPaused) {
|
|
return;
|
|
}
|
|
|
|
stream.removeListener('data', _buffer);
|
|
stream.removeListener('end', _catchEnd);
|
|
|
|
stream.__buffered.forEach(stream.emit.bind(stream, 'data'));
|
|
stream.__buffered.length = 0;
|
|
|
|
stream._resume();
|
|
stream.resume = stream._resume;
|
|
|
|
if (stream.__rstfyEnded) {
|
|
stream.emit('end');
|
|
}
|
|
};
|
|
}
|
|
|
|
/**
|
|
* This pre handler fixes issues with node hanging when an `asyncHandler` is
|
|
* used prior to `bodyParser`.
|
|
* https://github.com/restify/node-restify/issues/287
|
|
* https://github.com/restify/node-restify/issues/409
|
|
* https://github.com/restify/node-restify/wiki/1.4-to-2.0-Migration-Tips
|
|
*
|
|
* @public
|
|
* @function pause
|
|
* @returns {Function} Handler
|
|
*/
|
|
function pause() {
|
|
function prePause(req, res, next) {
|
|
pauseStream(req);
|
|
next();
|
|
}
|
|
|
|
return prePause;
|
|
}
|
|
|
|
///--- Exports
|
|
|
|
module.exports = pause;
|