diff --git a/lib/_stream_duplex.js b/lib/_stream_duplex.js index 522b94d660c821..b123cdcb4d776f 100644 --- a/lib/_stream_duplex.js +++ b/lib/_stream_duplex.js @@ -29,15 +29,33 @@ module.exports = Duplex; const util = require('util'); -const DuplexBase = require('internal/streams/duplex_base'); - -util.inherits(Duplex, DuplexBase); +const Readable = require('_stream_readable'); +const Writable = require('_stream_writable'); + +util.inherits(Duplex, Readable); + +{ + // Allow the keys array to be GC'ed. + const keys = Object.keys(Writable.prototype); + for (var v = 0; v < keys.length; v++) { + const method = keys[v]; + if (!Duplex.prototype[method]) + Duplex.prototype[method] = Writable.prototype[method]; + } +} function Duplex(options) { if (!(this instanceof Duplex)) return new Duplex(options); - DuplexBase.call(this, options); + Readable.call(this, options); + Writable.call(this, options); + + if (options && options.readable === false) + this.readable = false; + + if (options && options.writable === false) + this.writable = false; this.allowHalfOpen = true; if (options && options.allowHalfOpen === false) { diff --git a/lib/internal/streams/duplex_base.js b/lib/internal/streams/duplex_base.js deleted file mode 100644 index df3c5c37a80ea7..00000000000000 --- a/lib/internal/streams/duplex_base.js +++ /dev/null @@ -1,30 +0,0 @@ -'use strict'; - -const util = require('util'); -const Readable = require('_stream_readable'); -const Writable = require('_stream_writable'); - -function DuplexBase(options) { - Readable.call(this, options); - Writable.call(this, options); - - if (options && options.readable === false) - this.readable = false; - - if (options && options.writable === false) - this.writable = false; -} - -util.inherits(DuplexBase, Readable); - -{ - // Avoid scope creep, the keys array can then be collected. - const keys = Object.keys(Writable.prototype); - for (var v = 0; v < keys.length; v++) { - const method = keys[v]; - if (!DuplexBase.prototype[method]) - DuplexBase.prototype[method] = Writable.prototype[method]; - } -} - -module.exports = DuplexBase; diff --git a/lib/net.js b/lib/net.js index 5b460befa49374..68dde9cac3615e 100644 --- a/lib/net.js +++ b/lib/net.js @@ -75,7 +75,6 @@ const { ERR_SOCKET_BAD_PORT, ERR_SOCKET_CLOSED } = errors.codes; -const DuplexBase = require('internal/streams/duplex_base'); const dns = require('dns'); const kLastWriteQueueSize = Symbol('lastWriteQueueSize'); @@ -242,19 +241,19 @@ function Socket(options) { if (typeof options === 'number') options = { fd: options }; // Legacy interface. - else if (options === undefined) - options = {}; else options = util._extend({}, options); + const allowHalfOpen = options.allowHalfOpen; + + // Prevent the "no-half-open enforcer" from being inherited from `Duplex`. + options.allowHalfOpen = true; // For backwards compat do not emit close on destroy. options.emitClose = false; + stream.Duplex.call(this, options); - // `DuplexBase` is just a slimmed down constructor for `Duplex` which allow - // us to not inherit the "no-half-open enforcer" as there is already one in - // place. Instances of `Socket` are still instances of `Duplex`, that is, - // `socket instanceof Duplex === true`. - DuplexBase.call(this, options); + // Default to *not* allowing half open sockets. + this.allowHalfOpen = Boolean(allowHalfOpen); if (options.handle) { this._handle = options.handle; // private @@ -300,9 +299,6 @@ function Socket(options) { // handle strings directly this._writableState.decodeStrings = false; - // default to *not* allowing half open sockets - this.allowHalfOpen = options.allowHalfOpen || false; - // if we have a handle, then start the flow of data into the // buffer. if not, then this will happen when we connect if (this._handle && options.readable !== false) { diff --git a/node.gyp b/node.gyp index dc1cd5f72fd3da..4bc9a3650f7781 100644 --- a/node.gyp +++ b/node.gyp @@ -150,7 +150,6 @@ 'lib/internal/streams/lazy_transform.js', 'lib/internal/streams/async_iterator.js', 'lib/internal/streams/buffer_list.js', - 'lib/internal/streams/duplex_base.js', 'lib/internal/streams/duplexpair.js', 'lib/internal/streams/legacy.js', 'lib/internal/streams/destroy.js',