From 802ea05a37e5d342ef26970daeb876f4f8405ce5 Mon Sep 17 00:00:00 2001 From: ZYSzys <17367077526@163.com> Date: Fri, 4 Jan 2019 10:40:22 +0800 Subject: [PATCH] net,http2: merge setTimeout code PR-URL: https://github.com/nodejs/node/pull/25084 Refs: https://github.com/nodejs/node/issues/19060 Reviewed-By: Anna Henningsen Reviewed-By: Matteo Collina --- lib/internal/http2/core.js | 41 +++---------------------- lib/internal/stream_base_commons.js | 47 ++++++++++++++++++++++++++++- lib/net.js | 32 +++----------------- 3 files changed, 55 insertions(+), 65 deletions(-) diff --git a/lib/internal/http2/core.js b/lib/internal/http2/core.js index fc99b50eae21f2..b78ecaf5eebf9f 100644 --- a/lib/internal/http2/core.js +++ b/lib/internal/http2/core.js @@ -110,13 +110,11 @@ const { onStreamRead, kAfterAsyncWrite, kMaybeDestroy, - kUpdateTimer + kUpdateTimer, + kSession, + setStreamTimeout } = require('internal/stream_base_commons'); -const { - kTimeout, - setUnrefTimeout, - validateTimerDuration -} = require('internal/timers'); +const { kTimeout } = require('internal/timers'); const { isArrayBufferView } = require('internal/util/types'); const { FileHandle } = internalBinding('fs'); @@ -163,7 +161,6 @@ const kSelectPadding = Symbol('select-padding'); const kSentHeaders = Symbol('sent-headers'); const kSentTrailers = Symbol('sent-trailers'); const kServer = Symbol('server'); -const kSession = Symbol('session'); const kState = Symbol('state'); const kType = Symbol('type'); const kWriteGeneric = Symbol('write-generic'); @@ -2546,35 +2543,7 @@ const setTimeout = { configurable: true, enumerable: true, writable: true, - value: function(msecs, callback) { - if (this.destroyed) - return; - - // Type checking identical to timers.enroll() - msecs = validateTimerDuration(msecs); - - // Attempt to clear an existing timer lear in both cases - - // even if it will be rescheduled we don't want to leak an existing timer. - clearTimeout(this[kTimeout]); - - if (msecs === 0) { - if (callback !== undefined) { - if (typeof callback !== 'function') - throw new ERR_INVALID_CALLBACK(); - this.removeListener('timeout', callback); - } - } else { - this[kTimeout] = setUnrefTimeout(this._onTimeout.bind(this), msecs); - if (this[kSession]) this[kSession][kUpdateTimer](); - - if (callback !== undefined) { - if (typeof callback !== 'function') - throw new ERR_INVALID_CALLBACK(); - this.once('timeout', callback); - } - } - return this; - } + value: setStreamTimeout }; Object.defineProperty(Http2Stream.prototype, 'setTimeout', setTimeout); Object.defineProperty(Http2Session.prototype, 'setTimeout', setTimeout); diff --git a/lib/internal/stream_base_commons.js b/lib/internal/stream_base_commons.js index 31291e751d57a6..6de03c09d83d1b 100644 --- a/lib/internal/stream_base_commons.js +++ b/lib/internal/stream_base_commons.js @@ -11,12 +11,23 @@ const { streamBaseState } = internalBinding('stream_wrap'); const { UV_EOF } = internalBinding('uv'); -const { errnoException } = require('internal/errors'); +const { + codes: { + ERR_INVALID_CALLBACK + }, + errnoException +} = require('internal/errors'); const { owner_symbol } = require('internal/async_hooks').symbols; +const { + kTimeout, + setUnrefTimeout, + validateTimerDuration +} = require('internal/timers'); const kMaybeDestroy = Symbol('kMaybeDestroy'); const kUpdateTimer = Symbol('kUpdateTimer'); const kAfterAsyncWrite = Symbol('kAfterAsyncWrite'); +const kSession = Symbol('session'); function handleWriteReq(req, data, encoding) { const { handle } = req; @@ -178,6 +189,38 @@ function onStreamRead(arrayBuffer) { } } +function setStreamTimeout(msecs, callback) { + if (this.destroyed) + return; + + this.timeout = msecs; + + // Type checking identical to timers.enroll() + msecs = validateTimerDuration(msecs); + + // Attempt to clear an existing timer in both cases - + // even if it will be rescheduled we don't want to leak an existing timer. + clearTimeout(this[kTimeout]); + + if (msecs === 0) { + if (callback !== undefined) { + if (typeof callback !== 'function') + throw new ERR_INVALID_CALLBACK(); + this.removeListener('timeout', callback); + } + } else { + this[kTimeout] = setUnrefTimeout(this._onTimeout.bind(this), msecs); + if (this[kSession]) this[kSession][kUpdateTimer](); + + if (callback !== undefined) { + if (typeof callback !== 'function') + throw new ERR_INVALID_CALLBACK(); + this.once('timeout', callback); + } + } + return this; +} + module.exports = { createWriteWrap, writevGeneric, @@ -186,4 +229,6 @@ module.exports = { kAfterAsyncWrite, kMaybeDestroy, kUpdateTimer, + kSession, + setStreamTimeout }; diff --git a/lib/net.js b/lib/net.js index 9eb7448c59a9b1..1cea5bf6ced0f0 100644 --- a/lib/net.js +++ b/lib/net.js @@ -63,7 +63,8 @@ const { writeGeneric, onStreamRead, kAfterAsyncWrite, - kUpdateTimer + kUpdateTimer, + setStreamTimeout } = require('internal/stream_base_commons'); const { codes: { @@ -89,11 +90,7 @@ const kLastWriteQueueSize = Symbol('lastWriteQueueSize'); let cluster; let dns; -const { - kTimeout, - setUnrefTimeout, - validateTimerDuration -} = require('internal/timers'); +const { kTimeout } = require('internal/timers'); function noop() {} @@ -405,28 +402,7 @@ function writeAfterFIN(chunk, encoding, cb) { } } -Socket.prototype.setTimeout = function(msecs, callback) { - this.timeout = msecs; - // Type checking identical to timers.enroll() - msecs = validateTimerDuration(msecs); - - // Attempt to clear an existing timer in both cases - - // even if it will be rescheduled we don't want to leak an existing timer. - clearTimeout(this[kTimeout]); - - if (msecs === 0) { - if (callback) { - this.removeListener('timeout', callback); - } - } else { - this[kTimeout] = setUnrefTimeout(this._onTimeout.bind(this), msecs); - - if (callback) { - this.once('timeout', callback); - } - } - return this; -}; +Socket.prototype.setTimeout = setStreamTimeout; Socket.prototype._onTimeout = function() {