Comparing version 1.0.4 to 1.1.0
76
index.js
@@ -16,2 +16,3 @@ /*! | ||
var Stream = require('stream') | ||
var Zlib = require('zlib') | ||
@@ -32,3 +33,3 @@ /** | ||
function destroy(stream) { | ||
function destroy (stream) { | ||
if (stream instanceof ReadStream) { | ||
@@ -38,2 +39,12 @@ return destroyReadStream(stream) | ||
if (stream instanceof Zlib.Gzip || | ||
stream instanceof Zlib.Gunzip || | ||
stream instanceof Zlib.Deflate || | ||
stream instanceof Zlib.DeflateRaw || | ||
stream instanceof Zlib.Inflate || | ||
stream instanceof Zlib.InflateRaw || | ||
stream instanceof Zlib.Unzip) { | ||
return destroyZlibStream(stream) | ||
} | ||
if (!(stream instanceof Stream)) { | ||
@@ -57,3 +68,3 @@ return stream | ||
function destroyReadStream(stream) { | ||
function destroyReadStream (stream) { | ||
stream.destroy() | ||
@@ -70,2 +81,61 @@ | ||
/** | ||
* Destroy a Zlib stream. | ||
* | ||
* Zlib streams don't have a destroy function in Node.js 6. On top of that | ||
* simply calling destroy on a zlib stream in Node.js 8+ will result in a | ||
* memory leak. So until that is fixed, we need to call both close AND destroy. | ||
* | ||
* PR to fix memory leak: https://github.com/nodejs/node/pull/23734 | ||
* | ||
* In Node.js 6+8, it's important that destroy is called before close as the | ||
* stream would otherwise emit the error 'zlib binding closed'. | ||
* | ||
* @param {object} stream | ||
* @private | ||
*/ | ||
function destroyZlibStream (stream) { | ||
if (typeof stream.destroy === 'function') { | ||
// node.js core bug work-around | ||
// istanbul ignore if: node.js 0.8 | ||
if (stream._binding) { | ||
// node.js < 0.10.0 | ||
stream.destroy() | ||
if (stream._processing) { | ||
stream._needDrain = true | ||
stream.once('drain', onDrainClearBinding) | ||
} else { | ||
stream._binding.clear() | ||
} | ||
} else if (stream._destroy && stream._destroy !== Stream.Transform.prototype._destroy) { | ||
// node.js >= 12, ^11.1.0, ^10.15.1 | ||
stream.destroy() | ||
} else if (stream._destroy && typeof stream.close === 'function') { | ||
// node.js 7, 8 | ||
stream.destroyed = true | ||
stream.close() | ||
} else { | ||
// fallback | ||
// istanbul ignore next | ||
stream.destroy() | ||
} | ||
} else if (typeof stream.close === 'function') { | ||
// node.js < 8 fallback | ||
stream.close() | ||
} | ||
return stream | ||
} | ||
/** | ||
* On drain handler to clear binding. | ||
* @private | ||
*/ | ||
// istanbul ignore next: node.js 0.8 | ||
function onDrainClearBinding () { | ||
this._binding.clear() | ||
} | ||
/** | ||
* On open handler to close stream. | ||
@@ -75,3 +145,3 @@ * @private | ||
function onOpenClose() { | ||
function onOpenClose () { | ||
if (typeof this.fd === 'number') { | ||
@@ -78,0 +148,0 @@ // actually close down the fd |
{ | ||
"name": "destroy", | ||
"description": "destroy a stream if possible", | ||
"version": "1.0.4", | ||
"version": "1.1.0", | ||
"author": { | ||
@@ -17,9 +17,20 @@ "name": "Jonathan Ong", | ||
"devDependencies": { | ||
"istanbul": "0.4.2", | ||
"mocha": "2.3.4" | ||
"eslint": "7.32.0", | ||
"eslint-config-standard": "14.1.1", | ||
"eslint-plugin-import": "2.25.4", | ||
"eslint-plugin-node": "11.1.0", | ||
"eslint-plugin-promise": "5.2.0", | ||
"eslint-plugin-standard": "4.1.0", | ||
"mocha": "9.2.0", | ||
"nyc": "15.1.0" | ||
}, | ||
"engines": { | ||
"node": ">= 0.8", | ||
"npm": "1.2.8000 || >= 1.4.16" | ||
}, | ||
"scripts": { | ||
"lint": "eslint .", | ||
"test": "mocha --reporter spec", | ||
"test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot", | ||
"test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter dot" | ||
"test-ci": "nyc --reporter=lcovonly --reporter=text npm test", | ||
"test-cov": "nyc --reporter=html --reporter=text npm test" | ||
}, | ||
@@ -26,0 +37,0 @@ "files": [ |
# Destroy | ||
[![NPM version][npm-image]][npm-url] | ||
[![Build status][travis-image]][travis-url] | ||
[![Build Status][github-actions-ci-image]][github-actions-ci-url] | ||
[![Test coverage][coveralls-image]][coveralls-url] | ||
[![License][license-image]][license-url] | ||
[![Downloads][downloads-image]][downloads-url] | ||
[![Gittip][gittip-image]][gittip-url] | ||
@@ -30,4 +29,8 @@ Destroy a stream. | ||
`.destroy()` is called before `open`. | ||
2. If the `stream` is not an instance of `Stream`, then nothing happens. | ||
3. If the `stream` has a `.destroy()` method, then call it. | ||
2. If the `stream` is an instance of a zlib stream, then call `stream.destroy()` | ||
and close the underlying zlib handle if open, otherwise call `stream.close()`. | ||
This is for consistency across Node.js versions and a Node.js bug that will | ||
leak a native zlib handle. | ||
3. If the `stream` is not an instance of `Stream`, then nothing happens. | ||
4. If the `stream` has a `.destroy()` method, then call it. | ||
@@ -52,4 +55,2 @@ The function returns the `stream` passed in as the argument. | ||
[github-url]: https://github.com/stream-utils/destroy/tags | ||
[travis-image]: https://img.shields.io/travis/stream-utils/destroy.svg?style=flat-square | ||
[travis-url]: https://travis-ci.org/stream-utils/destroy | ||
[coveralls-image]: https://img.shields.io/coveralls/stream-utils/destroy.svg?style=flat-square | ||
@@ -61,3 +62,3 @@ [coveralls-url]: https://coveralls.io/r/stream-utils/destroy?branch=master | ||
[downloads-url]: https://npmjs.org/package/destroy | ||
[gittip-image]: https://img.shields.io/gittip/jonathanong.svg?style=flat-square | ||
[gittip-url]: https://www.gittip.com/jonathanong/ | ||
[github-actions-ci-image]: https://img.shields.io/github/workflow/status/stream-utils/destroy/ci/master?label=ci&style=flat-square | ||
[github-actions-ci-url]: https://github.com/stream-utils/destroy/actions/workflows/ci.yml |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
New author
Supply chain riskA new npm collaborator published a version of the package for the first time. New collaborators are usually benign additions to a project, but do indicate a change to the security surface area of a package.
Found 1 instance in 1 package
7604
123
62
0
8