diff --git a/lib/dgram.js b/lib/dgram.js index 2db146886575e8..1e151edad0c78c 100644 --- a/lib/dgram.js +++ b/lib/dgram.js @@ -37,7 +37,10 @@ const { ERR_SOCKET_CANNOT_SEND, ERR_SOCKET_DGRAM_NOT_RUNNING } = errors.codes; -const { validateString } = require('internal/validators'); +const { + validateString, + validateNumber +} = require('internal/validators'); const { Buffer } = require('buffer'); const util = require('util'); const { isUint8Array } = require('internal/util/types'); @@ -258,18 +261,9 @@ Socket.prototype.sendto = function(buffer, port, address, callback) { - if (typeof offset !== 'number') { - throw new ERR_INVALID_ARG_TYPE('offset', 'number', offset); - } - - if (typeof length !== 'number') { - throw new ERR_INVALID_ARG_TYPE('length', 'number', length); - } - - if (typeof port !== 'number') { - throw new ERR_INVALID_ARG_TYPE('port', 'number', port); - } - + validateNumber(offset, 'offset'); + validateNumber(length, 'length'); + validateNumber(port, 'port'); validateString(address, 'address'); this.send(buffer, offset, length, port, address, callback); @@ -530,9 +524,7 @@ Socket.prototype.setBroadcast = function(arg) { Socket.prototype.setTTL = function(ttl) { - if (typeof ttl !== 'number') { - throw new ERR_INVALID_ARG_TYPE('ttl', 'number', ttl); - } + validateNumber(ttl, 'ttl'); var err = this[kStateSymbol].handle.setTTL(ttl); if (err) { @@ -544,9 +536,7 @@ Socket.prototype.setTTL = function(ttl) { Socket.prototype.setMulticastTTL = function(ttl) { - if (typeof ttl !== 'number') { - throw new ERR_INVALID_ARG_TYPE('ttl', 'number', ttl); - } + validateNumber(ttl, 'ttl'); var err = this[kStateSymbol].handle.setMulticastTTL(ttl); if (err) { diff --git a/lib/internal/buffer.js b/lib/internal/buffer.js index 085a82265a95de..3a944a13de3031 100644 --- a/lib/internal/buffer.js +++ b/lib/internal/buffer.js @@ -3,9 +3,9 @@ const binding = process.binding('buffer'); const { ERR_BUFFER_OUT_OF_BOUNDS, - ERR_INVALID_ARG_TYPE, ERR_OUT_OF_RANGE } = require('internal/errors').codes; +const { validateNumber } = require('internal/validators'); const { setupBufferJS } = binding; // Remove from the binding so that function is only available as exported here. @@ -38,9 +38,7 @@ function checkInt(value, min, max, buf, offset, byteLength) { } function checkNumberType(value, type) { - if (typeof value !== 'number') { - throw new ERR_INVALID_ARG_TYPE(type || 'offset', 'number', value); - } + validateNumber(value, type || 'offset'); } function boundsError(value, length, type) { diff --git a/lib/internal/crypto/random.js b/lib/internal/crypto/random.js index 15fbc37c2239d7..ea73c85ec5dbf0 100644 --- a/lib/internal/crypto/random.js +++ b/lib/internal/crypto/random.js @@ -8,16 +8,14 @@ const { ERR_INVALID_CALLBACK, ERR_OUT_OF_RANGE } = require('internal/errors').codes; +const { validateNumber } = require('internal/validators'); const { isArrayBufferView } = require('internal/util/types'); const kMaxUint32 = 2 ** 32 - 1; const kMaxPossibleLength = Math.min(kMaxLength, kMaxUint32); function assertOffset(offset, elementSize, length) { - if (typeof offset !== 'number') { - throw new ERR_INVALID_ARG_TYPE('offset', 'number', offset); - } - + validateNumber(offset, 'offset'); offset *= elementSize; const maxLength = Math.min(length, kMaxPossibleLength); @@ -29,10 +27,7 @@ function assertOffset(offset, elementSize, length) { } function assertSize(size, elementSize, offset, length) { - if (typeof size !== 'number') { - throw new ERR_INVALID_ARG_TYPE('size', 'number', size); - } - + validateNumber(size, 'size'); size *= elementSize; if (Number.isNaN(size) || size > kMaxPossibleLength || size < 0) { diff --git a/lib/internal/http2/core.js b/lib/internal/http2/core.js index 30c401774f10a3..e1eb8b517a5e56 100644 --- a/lib/internal/http2/core.js +++ b/lib/internal/http2/core.js @@ -75,6 +75,7 @@ const { ERR_SOCKET_CLOSED } } = require('internal/errors'); +const { validateNumber } = require('internal/validators'); const { utcDate } = require('internal/http'); const { onServerStream, Http2ServerRequest, @@ -1001,8 +1002,7 @@ class Http2Session extends EventEmitter { if (this.destroyed) throw new ERR_HTTP2_INVALID_SESSION(); - if (typeof id !== 'number') - throw new ERR_INVALID_ARG_TYPE('id', 'number', id); + validateNumber(id, 'id'); if (id <= 0 || id > kMaxStreams) throw new ERR_OUT_OF_RANGE('id', `> 0 and <= ${kMaxStreams}`, id); this[kHandle].setNextStreamID(id); @@ -1144,12 +1144,8 @@ class Http2Session extends EventEmitter { ['Buffer', 'TypedArray', 'DataView'], opaqueData); } - if (typeof code !== 'number') { - throw new ERR_INVALID_ARG_TYPE('code', 'number', code); - } - if (typeof lastStreamID !== 'number') { - throw new ERR_INVALID_ARG_TYPE('lastStreamID', 'number', lastStreamID); - } + validateNumber(code, 'code'); + validateNumber(lastStreamID, 'lastStreamID'); const goawayFn = submitGoaway.bind(this, code, lastStreamID, opaqueData); if (this.connecting) { @@ -1831,8 +1827,7 @@ class Http2Stream extends Duplex { // close, it is still possible to queue up PRIORITY and RST_STREAM frames, // but no DATA and HEADERS frames may be sent. close(code = NGHTTP2_NO_ERROR, callback) { - if (typeof code !== 'number') - throw new ERR_INVALID_ARG_TYPE('code', 'number', code); + validateNumber(code, 'code'); if (code < 0 || code > kMaxInt) throw new ERR_OUT_OF_RANGE('code', `>= 0 && <= ${kMaxInt}`, code); if (callback !== undefined && typeof callback !== 'function') @@ -2326,8 +2321,7 @@ class ServerHttp2Stream extends Http2Stream { this[kState].flags |= STREAM_FLAGS_HAS_TRAILERS; } - if (typeof fd !== 'number') - throw new ERR_INVALID_ARG_TYPE('fd', 'number', fd); + validateNumber(fd, 'fd'); debug(`Http2Stream ${this[kID]} [Http2Session ` + `${sessionName(session[kType])}]: initiating response from fd`); diff --git a/lib/internal/timers.js b/lib/internal/timers.js index 801fce1cc369fd..d33ad0c8ac8027 100644 --- a/lib/internal/timers.js +++ b/lib/internal/timers.js @@ -11,10 +11,10 @@ const async_id_symbol = Symbol('asyncId'); const trigger_async_id_symbol = Symbol('triggerId'); const { - ERR_INVALID_ARG_TYPE, ERR_INVALID_CALLBACK, ERR_OUT_OF_RANGE } = require('internal/errors').codes; +const { validateNumber } = require('internal/validators'); // Timeout values > TIMEOUT_MAX are set to 1. const TIMEOUT_MAX = 2 ** 31 - 1; @@ -130,10 +130,7 @@ function setUnrefTimeout(callback, after, arg1, arg2, arg3) { // Type checking used by timers.enroll() and Socket#setTimeout() function validateTimerDuration(msecs) { - if (typeof msecs !== 'number') { - throw new ERR_INVALID_ARG_TYPE('msecs', 'number', msecs); - } - + validateNumber(msecs, 'msecs'); if (msecs < 0 || !isFinite(msecs)) { throw new ERR_OUT_OF_RANGE('msecs', 'a non-negative finite number', msecs); } diff --git a/lib/internal/validators.js b/lib/internal/validators.js index 85e69e61255d58..0ecf286266678a 100644 --- a/lib/internal/validators.js +++ b/lib/internal/validators.js @@ -125,6 +125,11 @@ function validateString(value, name) { throw new ERR_INVALID_ARG_TYPE(name, 'string', value); } +function validateNumber(value, name) { + if (typeof value !== 'number') + throw new ERR_INVALID_ARG_TYPE(name, 'number', value); +} + module.exports = { isInt32, isUint32, @@ -132,5 +137,6 @@ module.exports = { validateInteger, validateInt32, validateUint32, - validateString + validateString, + validateNumber }; diff --git a/lib/util.js b/lib/util.js index 8b58b901eb78d3..94bde6e65ee055 100644 --- a/lib/util.js +++ b/lib/util.js @@ -27,6 +27,7 @@ const { ERR_INVALID_ARG_TYPE, ERR_OUT_OF_RANGE } = errors.codes; +const { validateNumber } = require('internal/validators'); const { TextDecoder, TextEncoder } = require('internal/encoding'); const { isBuffer } = require('buffer').Buffer; @@ -1431,9 +1432,7 @@ function callbackify(original) { } function getSystemErrorName(err) { - if (typeof err !== 'number') { - throw new ERR_INVALID_ARG_TYPE('err', 'number', err); - } + validateNumber(err, 'err'); if (err >= 0 || !Number.isSafeInteger(err)) { throw new ERR_OUT_OF_RANGE('err', 'a negative integer', err); }