diff --git a/lib/interceptor/cache.js b/lib/interceptor/cache.js index c3264a1f0af..f63ea0d27d8 100644 --- a/lib/interceptor/cache.js +++ b/lib/interceptor/cache.js @@ -8,7 +8,6 @@ const CacheRevalidationHandler = require('../handler/cache-revalidation-handler' const { assertCacheStore, assertCacheMethods } = require('../util/cache.js') const AGE_HEADER = Buffer.from('age') -function noop () {} /** * @param {import('../../types/cache-interceptor.d.ts').default.CacheOptions} [opts] @@ -57,6 +56,18 @@ module.exports = (opts = {}) => { assert(!stream.readableDidRead, 'stream should not be readableDidRead') try { + stream + .on('error', function (err) { + if (!this.readableEnded && typeof handler.onError === 'function') { + handler.onError(err) + } + }) + .on('close', function () { + if (!this.errored && typeof handler.onComplete === 'function') { + handler.onComplete(value.rawTrailers ?? []) + } + }) + if (typeof handler.onConnect === 'function') { handler.onConnect((err) => { stream.destroy(err) @@ -73,36 +84,19 @@ module.exports = (opts = {}) => { value.rawHeaders.push(AGE_HEADER, Buffer.from(`${age}`)) - handler.onHeaders(value.statusCode, value.rawHeaders, () => stream.resume(), value.statusMessage) - if (stream.destroyed) { - return + if (handler.onHeaders(value.statusCode, value.rawHeaders, () => stream.resume(), value.statusMessage) === false) { + stream.pause() } } if (opts.method === 'HEAD') { - if (typeof handler.onComplete === 'function') { - handler.onComplete(null) - } - stream - .on('error', noop) - .destroy() + stream.destroy() } else { - stream - .on('data', chunk => { - if (typeof handler.onData === 'function' && !handler.onData(chunk)) { - stream.pause() - } - }) - .on('end', () => { - if (typeof handler.onComplete === 'function') { - handler.onComplete(value.rawTrailers ?? []) - } - }) - .on('error', (err) => { - if (!stream.readableEnded && typeof handler.onError === 'function') { - handler.onError(err) - } - }) + stream.on('data', function (chunk) { + if (typeof handler.onData === 'function' && !handler.onData(chunk)) { + stream.pause() + } + }) } } catch (err) { stream.destroy(err)