stream: optimize creation
PR-URL: https://github.com/nodejs/node/pull/29135 Reviewed-By: Matteo Collina <matteo.collina@gmail.com> Reviewed-By: Yongsheng Zhang <zyszys98@gmail.com>
This commit is contained in:
parent
8235ffd786
commit
bd02775af8
@ -33,7 +33,10 @@ const { Buffer } = require('buffer');
|
|||||||
const debug = require('internal/util/debuglog').debuglog('stream');
|
const debug = require('internal/util/debuglog').debuglog('stream');
|
||||||
const BufferList = require('internal/streams/buffer_list');
|
const BufferList = require('internal/streams/buffer_list');
|
||||||
const destroyImpl = require('internal/streams/destroy');
|
const destroyImpl = require('internal/streams/destroy');
|
||||||
const { getHighWaterMark } = require('internal/streams/state');
|
const {
|
||||||
|
getHighWaterMark,
|
||||||
|
getDefaultHighWaterMark
|
||||||
|
} = require('internal/streams/state');
|
||||||
const {
|
const {
|
||||||
ERR_INVALID_ARG_TYPE,
|
ERR_INVALID_ARG_TYPE,
|
||||||
ERR_STREAM_PUSH_AFTER_EOF,
|
ERR_STREAM_PUSH_AFTER_EOF,
|
||||||
@ -70,8 +73,6 @@ function prependListener(emitter, event, fn) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function ReadableState(options, stream, isDuplex) {
|
function ReadableState(options, stream, isDuplex) {
|
||||||
options = options || {};
|
|
||||||
|
|
||||||
// Duplex streams are both readable and writable, but share
|
// Duplex streams are both readable and writable, but share
|
||||||
// the same options object.
|
// the same options object.
|
||||||
// However, some cases require setting options to different
|
// However, some cases require setting options to different
|
||||||
@ -82,15 +83,17 @@ function ReadableState(options, stream, isDuplex) {
|
|||||||
|
|
||||||
// Object stream flag. Used to make read(n) ignore n and to
|
// Object stream flag. Used to make read(n) ignore n and to
|
||||||
// make all the buffer merging and length checks go away
|
// make all the buffer merging and length checks go away
|
||||||
this.objectMode = !!options.objectMode;
|
this.objectMode = !!(options && options.objectMode);
|
||||||
|
|
||||||
if (isDuplex)
|
if (isDuplex)
|
||||||
this.objectMode = this.objectMode || !!options.readableObjectMode;
|
this.objectMode = this.objectMode ||
|
||||||
|
!!(options && options.readableObjectMode);
|
||||||
|
|
||||||
// The point at which it stops calling _read() to fill the buffer
|
// The point at which it stops calling _read() to fill the buffer
|
||||||
// Note: 0 is a valid value, means "don't call _read preemptively ever"
|
// Note: 0 is a valid value, means "don't call _read preemptively ever"
|
||||||
this.highWaterMark = getHighWaterMark(this, options, 'readableHighWaterMark',
|
this.highWaterMark = options ?
|
||||||
isDuplex);
|
getHighWaterMark(this, options, 'readableHighWaterMark', isDuplex) :
|
||||||
|
getDefaultHighWaterMark(false);
|
||||||
|
|
||||||
// A linked list is used to store data chunks instead of an array because the
|
// A linked list is used to store data chunks instead of an array because the
|
||||||
// linked list can remove elements from the beginning faster than
|
// linked list can remove elements from the beginning faster than
|
||||||
@ -121,10 +124,10 @@ function ReadableState(options, stream, isDuplex) {
|
|||||||
this.errorEmitted = false;
|
this.errorEmitted = false;
|
||||||
|
|
||||||
// Should close be emitted on destroy. Defaults to true.
|
// Should close be emitted on destroy. Defaults to true.
|
||||||
this.emitClose = options.emitClose !== false;
|
this.emitClose = !options || options.emitClose !== false;
|
||||||
|
|
||||||
// Should .destroy() be called after 'end' (and potentially 'finish')
|
// Should .destroy() be called after 'end' (and potentially 'finish')
|
||||||
this.autoDestroy = !!options.autoDestroy;
|
this.autoDestroy = !!(options && options.autoDestroy);
|
||||||
|
|
||||||
// Has it been destroyed
|
// Has it been destroyed
|
||||||
this.destroyed = false;
|
this.destroyed = false;
|
||||||
@ -132,7 +135,7 @@ function ReadableState(options, stream, isDuplex) {
|
|||||||
// Crypto is kind of old and crusty. Historically, its default string
|
// Crypto is kind of old and crusty. Historically, its default string
|
||||||
// encoding is 'binary' so we have to make this configurable.
|
// encoding is 'binary' so we have to make this configurable.
|
||||||
// Everything else in the universe uses 'utf8', though.
|
// Everything else in the universe uses 'utf8', though.
|
||||||
this.defaultEncoding = options.defaultEncoding || 'utf8';
|
this.defaultEncoding = (options && options.defaultEncoding) || 'utf8';
|
||||||
|
|
||||||
// Ref the piped dest which we need a drain event on it
|
// Ref the piped dest which we need a drain event on it
|
||||||
// type: null | Writable | Set<Writable>
|
// type: null | Writable | Set<Writable>
|
||||||
@ -144,7 +147,7 @@ function ReadableState(options, stream, isDuplex) {
|
|||||||
|
|
||||||
this.decoder = null;
|
this.decoder = null;
|
||||||
this.encoding = null;
|
this.encoding = null;
|
||||||
if (options.encoding) {
|
if (options && options.encoding) {
|
||||||
if (!StringDecoder)
|
if (!StringDecoder)
|
||||||
StringDecoder = require('string_decoder').StringDecoder;
|
StringDecoder = require('string_decoder').StringDecoder;
|
||||||
this.decoder = new StringDecoder(options.encoding);
|
this.decoder = new StringDecoder(options.encoding);
|
||||||
|
@ -34,7 +34,10 @@ const internalUtil = require('internal/util');
|
|||||||
const Stream = require('stream');
|
const Stream = require('stream');
|
||||||
const { Buffer } = require('buffer');
|
const { Buffer } = require('buffer');
|
||||||
const destroyImpl = require('internal/streams/destroy');
|
const destroyImpl = require('internal/streams/destroy');
|
||||||
const { getHighWaterMark } = require('internal/streams/state');
|
const {
|
||||||
|
getHighWaterMark,
|
||||||
|
getDefaultHighWaterMark
|
||||||
|
} = require('internal/streams/state');
|
||||||
const {
|
const {
|
||||||
ERR_INVALID_ARG_TYPE,
|
ERR_INVALID_ARG_TYPE,
|
||||||
ERR_METHOD_NOT_IMPLEMENTED,
|
ERR_METHOD_NOT_IMPLEMENTED,
|
||||||
@ -55,8 +58,6 @@ Object.setPrototypeOf(Writable, Stream);
|
|||||||
function nop() {}
|
function nop() {}
|
||||||
|
|
||||||
function WritableState(options, stream, isDuplex) {
|
function WritableState(options, stream, isDuplex) {
|
||||||
options = options || {};
|
|
||||||
|
|
||||||
// Duplex streams are both readable and writable, but share
|
// Duplex streams are both readable and writable, but share
|
||||||
// the same options object.
|
// the same options object.
|
||||||
// However, some cases require setting options to different
|
// However, some cases require setting options to different
|
||||||
@ -67,16 +68,18 @@ function WritableState(options, stream, isDuplex) {
|
|||||||
|
|
||||||
// Object stream flag to indicate whether or not this stream
|
// Object stream flag to indicate whether or not this stream
|
||||||
// contains buffers or objects.
|
// contains buffers or objects.
|
||||||
this.objectMode = !!options.objectMode;
|
this.objectMode = !!(options && options.objectMode);
|
||||||
|
|
||||||
if (isDuplex)
|
if (isDuplex)
|
||||||
this.objectMode = this.objectMode || !!options.writableObjectMode;
|
this.objectMode = this.objectMode ||
|
||||||
|
!!(options && options.writableObjectMode);
|
||||||
|
|
||||||
// The point at which write() starts returning false
|
// The point at which write() starts returning false
|
||||||
// Note: 0 is a valid value, means that we always return false if
|
// Note: 0 is a valid value, means that we always return false if
|
||||||
// the entire buffer is not flushed immediately on write()
|
// the entire buffer is not flushed immediately on write()
|
||||||
this.highWaterMark = getHighWaterMark(this, options, 'writableHighWaterMark',
|
this.highWaterMark = options ?
|
||||||
isDuplex);
|
getHighWaterMark(this, options, 'writableHighWaterMark', isDuplex) :
|
||||||
|
getDefaultHighWaterMark(false);
|
||||||
|
|
||||||
// if _final has been called
|
// if _final has been called
|
||||||
this.finalCalled = false;
|
this.finalCalled = false;
|
||||||
@ -96,13 +99,13 @@ function WritableState(options, stream, isDuplex) {
|
|||||||
// Should we decode strings into buffers before passing to _write?
|
// Should we decode strings into buffers before passing to _write?
|
||||||
// this is here so that some node-core streams can optimize string
|
// this is here so that some node-core streams can optimize string
|
||||||
// handling at a lower level.
|
// handling at a lower level.
|
||||||
const noDecode = options.decodeStrings === false;
|
const noDecode = !!(options && options.decodeStrings === false);
|
||||||
this.decodeStrings = !noDecode;
|
this.decodeStrings = !noDecode;
|
||||||
|
|
||||||
// Crypto is kind of old and crusty. Historically, its default string
|
// Crypto is kind of old and crusty. Historically, its default string
|
||||||
// encoding is 'binary' so we have to make this configurable.
|
// encoding is 'binary' so we have to make this configurable.
|
||||||
// Everything else in the universe uses 'utf8', though.
|
// Everything else in the universe uses 'utf8', though.
|
||||||
this.defaultEncoding = options.defaultEncoding || 'utf8';
|
this.defaultEncoding = (options && options.defaultEncoding) || 'utf8';
|
||||||
|
|
||||||
// Not an actual buffer we keep track of, but a measurement
|
// Not an actual buffer we keep track of, but a measurement
|
||||||
// of how much we're waiting to get pushed to some underlying
|
// of how much we're waiting to get pushed to some underlying
|
||||||
@ -150,10 +153,10 @@ function WritableState(options, stream, isDuplex) {
|
|||||||
this.errorEmitted = false;
|
this.errorEmitted = false;
|
||||||
|
|
||||||
// Should close be emitted on destroy. Defaults to true.
|
// Should close be emitted on destroy. Defaults to true.
|
||||||
this.emitClose = options.emitClose !== false;
|
this.emitClose = !options || options.emitClose !== false;
|
||||||
|
|
||||||
// Should .destroy() be called after 'finish' (and potentially 'end')
|
// Should .destroy() be called after 'finish' (and potentially 'end')
|
||||||
this.autoDestroy = !!options.autoDestroy;
|
this.autoDestroy = !!(options && options.autoDestroy);
|
||||||
|
|
||||||
// Count buffered requests
|
// Count buffered requests
|
||||||
this.bufferedRequestCount = 0;
|
this.bufferedRequestCount = 0;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user