You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
53 lines
1.2 KiB
53 lines
1.2 KiB
4 years ago
|
'use strict'
|
||
|
|
||
|
/**
|
||
|
* Creates a stream which becomes the response body of the interceptor when a
|
||
|
* delay is set. The stream outputs the intended body and EOF after the delay.
|
||
|
*
|
||
|
* @param {String|Buffer|Stream} body - the body to write/pipe out
|
||
|
* @param {Integer} ms - The delay in milliseconds
|
||
|
* @constructor
|
||
|
*/
|
||
|
|
||
|
const { Transform } = require('stream')
|
||
|
const common = require('./common')
|
||
|
|
||
|
module.exports = class DelayedBody extends Transform {
|
||
|
constructor(ms, body) {
|
||
|
super()
|
||
|
|
||
|
const self = this
|
||
|
let data = ''
|
||
|
let ended = false
|
||
|
|
||
|
if (common.isStream(body)) {
|
||
|
body.on('data', function(chunk) {
|
||
|
data += Buffer.isBuffer(chunk) ? chunk.toString() : chunk
|
||
|
})
|
||
|
|
||
|
body.once('end', function() {
|
||
|
ended = true
|
||
|
})
|
||
|
|
||
|
body.resume()
|
||
|
}
|
||
|
|
||
|
// TODO: This would be more readable if the stream case were moved into
|
||
|
// the `if` statement above.
|
||
|
common.setTimeout(function() {
|
||
|
if (common.isStream(body) && !ended) {
|
||
|
body.once('end', function() {
|
||
|
self.end(data)
|
||
|
})
|
||
|
} else {
|
||
|
self.end(data || body)
|
||
|
}
|
||
|
}, ms)
|
||
|
}
|
||
|
|
||
|
_transform(chunk, encoding, cb) {
|
||
|
this.push(chunk)
|
||
|
process.nextTick(cb)
|
||
|
}
|
||
|
}
|