From d2d32ea5a22a30f428a6e08bcb707c3538558933 Mon Sep 17 00:00:00 2001 From: James M Snell Date: Sat, 11 Mar 2017 12:32:25 -0800 Subject: [PATCH] buffer: add pending deprecation warning MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The pending deprecation warning is off by default. Launch the node process with --pending-deprecation or NODE_PENDING_DEPRECATION=1 env var set. PR-URL: https://github.com/nodejs/node/pull/11968 Reviewed-By: Anna Henningsen Reviewed-By: Michaël Zasso Reviewed-By: Michael Dawson Reviewed-By: Сковорода Никита Андреевич Reviewed-By: James M Snell --- lib/buffer.js | 33 ++++++++++++++++++- test/parallel/test-buffer-nopendingdep-map.js | 14 ++++++++ .../test-buffer-pending-deprecation.js | 15 +++++++++ 3 files changed, 61 insertions(+), 1 deletion(-) create mode 100644 test/parallel/test-buffer-nopendingdep-map.js create mode 100644 test/parallel/test-buffer-pending-deprecation.js diff --git a/lib/buffer.js b/lib/buffer.js index 5450861d04e986..e5d15740349e63 100644 --- a/lib/buffer.js +++ b/lib/buffer.js @@ -22,18 +22,20 @@ 'use strict'; const binding = process.binding('buffer'); +const config = process.binding('config'); const { compare: compare_, compareOffset } = binding; const { isAnyArrayBuffer, isUint8Array } = process.binding('util'); const bindingObj = {}; const internalUtil = require('internal/util'); +const pendingDeprecation = !!config.pendingDeprecation; class FastBuffer extends Uint8Array { constructor(arg1, arg2, arg3) { super(arg1, arg2, arg3); } } - FastBuffer.prototype.constructor = Buffer; + Buffer.prototype = FastBuffer.prototype; exports.Buffer = Buffer; @@ -83,6 +85,28 @@ function alignPool() { } } +var bufferWarn = true; +const bufferWarning = 'The Buffer() and new Buffer() constructors are not ' + + 'recommended for use due to security and usability ' + + 'concerns. Please use the new Buffer.alloc(), ' + + 'Buffer.allocUnsafe(), or Buffer.from() construction ' + + 'methods instead.'; + +function showFlaggedDeprecation() { + if (bufferWarn) { + // This is a *pending* deprecation warning. It is not emitted by + // default unless the --pending-deprecation command-line flag is + // used or the NODE_PENDING_DEPRECATION=1 envvar is set. + process.emitWarning(bufferWarning, 'DeprecationWarning', 'DEP0005'); + bufferWarn = false; + } +} + +const doFlaggedDeprecation = + pendingDeprecation ? + showFlaggedDeprecation : + function() {}; + /** * The Buffer() construtor is deprecated in documentation and should not be * used moving forward. Rather, developers should use one of the three new @@ -94,6 +118,7 @@ function alignPool() { * Deprecation Code: DEP0005 **/ function Buffer(arg, encodingOrOffset, length) { + doFlaggedDeprecation(); // Common case. if (typeof arg === 'number') { if (typeof encodingOrOffset === 'string') { @@ -106,6 +131,12 @@ function Buffer(arg, encodingOrOffset, length) { return Buffer.from(arg, encodingOrOffset, length); } +Object.defineProperty(Buffer, Symbol.species, { + enumerable: false, + configurable: true, + get() { return FastBuffer; } +}); + /** * Functionally equivalent to Buffer(arg, encoding) but throws a TypeError * if value is a number. diff --git a/test/parallel/test-buffer-nopendingdep-map.js b/test/parallel/test-buffer-nopendingdep-map.js new file mode 100644 index 00000000000000..90a24a625bf748 --- /dev/null +++ b/test/parallel/test-buffer-nopendingdep-map.js @@ -0,0 +1,14 @@ +// Flags: --no-warnings --pending-deprecation +'use strict'; + +const common = require('../common'); +const Buffer = require('buffer').Buffer; + +process.on('warning', common.mustNotCall('A warning should not be emitted')); + +// With the --pending-deprecation flag, the deprecation warning for +// new Buffer() should not be emitted when Uint8Array methods are called. + +Buffer.from('abc').map((i) => i); +Buffer.from('abc').filter((i) => i); +Buffer.from('abc').slice(1, 2); diff --git a/test/parallel/test-buffer-pending-deprecation.js b/test/parallel/test-buffer-pending-deprecation.js new file mode 100644 index 00000000000000..fcce8814cdbd6f --- /dev/null +++ b/test/parallel/test-buffer-pending-deprecation.js @@ -0,0 +1,15 @@ +// Flags: --pending-deprecation --no-warnings +'use strict'; + +const common = require('../common'); +const Buffer = require('buffer').Buffer; + +const bufferWarning = 'The Buffer() and new Buffer() constructors are not ' + + 'recommended for use due to security and usability ' + + 'concerns. Please use the new Buffer.alloc(), ' + + 'Buffer.allocUnsafe(), or Buffer.from() construction ' + + 'methods instead.'; + +common.expectWarning('DeprecationWarning', bufferWarning); + +new Buffer(10);