GeezerVison is showing github.com — zlib: simplify validators · nodejs/node@ecdf6dd
File treeExpand file treeCollapse file tree Open diff view settings Expand file treeCollapse file tree Open diff view settings Collapse file Copy file name to clipboardExpand all lines: lib/internal/validators.js +43Lines changed: 43 additions & 0 deletions | Original file line number | Diff line number | Diff line change |
|---|
| 7 | 7 | ArrayPrototypeIncludes, | 8 | 8 | ArrayPrototypeJoin, | 9 | 9 | ArrayPrototypeMap, | | 10 | + NumberIsFinite, | 10 | 11 | NumberIsInteger, | 11 | 12 | NumberIsNaN, | 12 | 13 | NumberMAX_SAFE_INTEGER, | @@ -567,6 +568,46 @@ const validateLinkHeaderValue = hideStackFrames((hints) => { | 567 | 568 | ); | 568 | 569 | }); | 569 | 570 |
| | 571 | +// 1. Returns false for undefined and NaN | | 572 | +// 2. Returns true for finite numbers | | 573 | +// 3. Throws ERR_INVALID_ARG_TYPE for non-numbers | | 574 | +// 4. Throws ERR_OUT_OF_RANGE for infinite numbers | | 575 | +const validateFiniteNumber = hideStackFrames((number, name) => { | | 576 | + // Common case | | 577 | + if (number === undefined) { | | 578 | + return false; | | 579 | + } | | 580 | + | | 581 | + if (NumberIsFinite(number)) { | | 582 | + return true; // Is a valid number | | 583 | + } | | 584 | + | | 585 | + if (NumberIsNaN(number)) { | | 586 | + return false; | | 587 | + } | | 588 | + | | 589 | + validateNumber(number, name); | | 590 | + | | 591 | + // Infinite numbers | | 592 | + throw new ERR_OUT_OF_RANGE(name, 'a finite number', number); | | 593 | +}); | | 594 | + | | 595 | +// 1. Returns def for number when it's undefined or NaN | | 596 | +// 2. Returns number for finite numbers >= lower and <= upper | | 597 | +// 3. Throws ERR_INVALID_ARG_TYPE for non-numbers | | 598 | +// 4. Throws ERR_OUT_OF_RANGE for infinite numbers or numbers > upper or < lower | | 599 | +const checkRangesOrGetDefault = hideStackFrames( | | 600 | + (number, name, lower, upper, def) => { | | 601 | + if (!validateFiniteNumber(number, name)) { | | 602 | + return def; | | 603 | + } | | 604 | + if (number < lower || number > upper) { | | 605 | + throw new ERR_OUT_OF_RANGE(name, `>= ${lower} and <= ${upper}`, number); | | 606 | + } | | 607 | + return number; | | 608 | + }, | | 609 | +); | | 610 | + | 570 | 611 | module.exports = { | 571 | 612 | isInt32, | 572 | 613 | isUint32, | @@ -601,4 +642,6 @@ module.exports = { | 601 | 642 | validateAbortSignal, | 602 | 643 | validateLinkHeaderValue, | 603 | 644 | validateInternalField, | | 645 | + validateFiniteNumber, | | 646 | + checkRangesOrGetDefault, | 604 | 647 | }; |
Collapse file Copy file name to clipboardExpand all lines: lib/zlib.js +3-45Lines changed: 3 additions & 45 deletions | Original file line number | Diff line number | Diff line change |
|---|
@@ -28,7 +28,6 @@ const { | 28 | 28 | ArrayPrototypePush, | 29 | 29 | FunctionPrototypeBind, | 30 | 30 | MathMaxApply, | 31 | | - NumberIsFinite, | 32 | 31 | NumberIsNaN, | 33 | 32 | ObjectDefineProperties, | 34 | 33 | ObjectDefineProperty, | @@ -51,7 +50,6 @@ const { | 51 | 50 | ERR_ZLIB_INITIALIZATION_FAILED, | 52 | 51 | }, | 53 | 52 | genericNodeError, | 54 | | - hideStackFrames, | 55 | 53 | } = require('internal/errors'); | 56 | 54 | const { Transform, finished } = require('stream'); | 57 | 55 | const { | @@ -71,9 +69,10 @@ const { | 71 | 69 | } = require('buffer'); | 72 | 70 | const { owner_symbol } = require('internal/async_hooks').symbols; | 73 | 71 | const { | | 72 | + checkRangesOrGetDefault, | 74 | 73 | validateFunction, | 75 | | - validateNumber, | 76 | 74 | validateUint32, | | 75 | + validateFiniteNumber, | 77 | 76 | } = require('internal/validators'); | 78 | 77 |
| 79 | 78 | const kFlushFlag = Symbol('kFlushFlag'); | @@ -195,47 +194,6 @@ function zlibOnError(message, errno, code) { | 195 | 194 | self[kError] = error; | 196 | 195 | } | 197 | 196 |
| 198 | | -// 1. Returns false for undefined and NaN | 199 | | -// 2. Returns true for finite numbers | 200 | | -// 3. Throws ERR_INVALID_ARG_TYPE for non-numbers | 201 | | -// 4. Throws ERR_OUT_OF_RANGE for infinite numbers | 202 | | -const checkFiniteNumber = hideStackFrames((number, name) => { | 203 | | - // Common case | 204 | | - if (number === undefined) { | 205 | | - return false; | 206 | | - } | 207 | | - | 208 | | - if (NumberIsFinite(number)) { | 209 | | - return true; // Is a valid number | 210 | | - } | 211 | | - | 212 | | - if (NumberIsNaN(number)) { | 213 | | - return false; | 214 | | - } | 215 | | - | 216 | | - validateNumber.withoutStackTrace(number, name); | 217 | | - | 218 | | - // Infinite numbers | 219 | | - throw new ERR_OUT_OF_RANGE.HideStackFramesError(name, 'a finite number', number); | 220 | | -}); | 221 | | - | 222 | | -// 1. Returns def for number when it's undefined or NaN | 223 | | -// 2. Returns number for finite numbers >= lower and <= upper | 224 | | -// 3. Throws ERR_INVALID_ARG_TYPE for non-numbers | 225 | | -// 4. Throws ERR_OUT_OF_RANGE for infinite numbers or numbers > upper or < lower | 226 | | -const checkRangesOrGetDefault = hideStackFrames( | 227 | | - (number, name, lower, upper, def) => { | 228 | | - if (!checkFiniteNumber.withoutStackTrace(number, name)) { | 229 | | - return def; | 230 | | - } | 231 | | - if (number < lower || number > upper) { | 232 | | - throw new ERR_OUT_OF_RANGE.HideStackFramesError(name, | 233 | | - `>= ${lower} and <= ${upper}`, number); | 234 | | - } | 235 | | - return number; | 236 | | - }, | 237 | | -); | 238 | | - | 239 | 197 | const FLUSH_BOUND = [ | 240 | 198 | [ Z_NO_FLUSH, Z_BLOCK ], | 241 | 199 | [ BROTLI_OPERATION_PROCESS, BROTLI_OPERATION_EMIT_METADATA ], | @@ -261,7 +219,7 @@ function ZlibBase(opts, mode, handle, { flush, finishFlush, fullFlush }) { | 261 | 219 |
| 262 | 220 | if (opts) { | 263 | 221 | chunkSize = opts.chunkSize; | 264 | | - if (!checkFiniteNumber(chunkSize, 'options.chunkSize')) { | | 222 | + if (!validateFiniteNumber(chunkSize, 'options.chunkSize')) { | 265 | 223 | chunkSize = Z_DEFAULT_CHUNK; | 266 | 224 | } else if (chunkSize < Z_MIN_CHUNK) { | 267 | 225 | throw new ERR_OUT_OF_RANGE('options.chunkSize', | |
|