mirror of
https://codeberg.org/tacerus/teddit.git
synced 2025-01-09 21:02:36 +01:00
67 lines
1.7 KiB
JavaScript
67 lines
1.7 KiB
JavaScript
|
'use strict'
|
||
|
|
||
|
var zlib = require('zlib')
|
||
|
var stream = require('stream')
|
||
|
var inherit = require('util').inherits
|
||
|
var Buffer = require('safe-buffer').Buffer
|
||
|
var Inflate
|
||
|
|
||
|
Inflate = function (options) {
|
||
|
this.options = options
|
||
|
this._stream = null
|
||
|
stream.Transform.call(this)
|
||
|
}
|
||
|
|
||
|
inherit(Inflate, stream.Transform)
|
||
|
|
||
|
Inflate.prototype._transform = function (chunk, encoding, callback) {
|
||
|
var self = this
|
||
|
if (!self._stream) {
|
||
|
// If the response stream does not have a valid deflate header, use `InflateRaw`
|
||
|
if ((Buffer.from(chunk, encoding)[0] & 0x0F) === 0x08) {
|
||
|
self._stream = zlib.createInflate(self.options)
|
||
|
} else {
|
||
|
self._stream = zlib.createInflateRaw(self.options)
|
||
|
}
|
||
|
|
||
|
self._stream.on('error', function (error) {
|
||
|
self.emit('error', error)
|
||
|
})
|
||
|
|
||
|
self.once('finish', function () {
|
||
|
self._stream.end()
|
||
|
})
|
||
|
self._stream.on('data', function (chunk) {
|
||
|
self.push(chunk)
|
||
|
})
|
||
|
|
||
|
self._stream.once('end', function () {
|
||
|
self._ended = true
|
||
|
self.push(null)
|
||
|
})
|
||
|
}
|
||
|
|
||
|
self._stream.write(chunk, encoding, callback)
|
||
|
}
|
||
|
|
||
|
Inflate.prototype._flush = function (callback) {
|
||
|
if (this._stream && !this._ended) {
|
||
|
this._stream.once('end', callback)
|
||
|
} else {
|
||
|
callback()
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Creates an intelligent inflate stream, that can handle deflate responses from older servers,
|
||
|
* which do not send the correct GZip headers in the response. See http://stackoverflow.com/a/37528114
|
||
|
* for details on why this is needed.
|
||
|
*
|
||
|
* @param {Object=} options - Are passed to the underlying `Inflate` or `InflateRaw` constructor.
|
||
|
*
|
||
|
* @returns {*}
|
||
|
*/
|
||
|
module.exports.createInflate = function (options) {
|
||
|
return new Inflate(options)
|
||
|
}
|