Skip to content

Commit

Permalink
stream: group all properties using defineProperties
Browse files Browse the repository at this point in the history
PR-URL: #31144
Reviewed-By: Matteo Collina <matteo.collina@gmail.com>
Reviewed-By: Ruben Bridgewater <ruben@bridgewater.de>
Reviewed-By: Luigi Pinca <luigipinca@gmail.com>
Reviewed-By: Yongsheng Zhang <zyszys98@gmail.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
  • Loading branch information
antsmartian authored and targos committed Jan 14, 2020
1 parent 5facae0 commit 504e6d4
Showing 1 changed file with 83 additions and 95 deletions.
178 changes: 83 additions & 95 deletions lib/_stream_readable.js
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ const {
ArrayIsArray,
NumberIsInteger,
NumberIsNaN,
ObjectDefineProperty,
ObjectDefineProperties,
ObjectSetPrototypeOf,
SymbolAsyncIterator,
Symbol
Expand Down Expand Up @@ -162,15 +162,6 @@ function ReadableState(options, stream, isDuplex) {
}
}

// Legacy property for `paused`
ObjectDefineProperty(ReadableState.prototype, 'paused', {
get() {
return this[kPaused] !== false;
},
set(value) {
this[kPaused] = !!value;
}
});

function Readable(options) {
if (!(this instanceof Readable))
Expand All @@ -196,40 +187,6 @@ function Readable(options) {
Stream.call(this, options);
}

ObjectDefineProperty(Readable.prototype, 'destroyed', {
// Making it explicit this property is not enumerable
// because otherwise some prototype manipulation in
// userland will fail
enumerable: false,
get() {
if (this._readableState === undefined) {
return false;
}
return this._readableState.destroyed;
},
set(value) {
// We ignore the value if the stream
// has not been initialized yet
if (!this._readableState) {
return;
}

// Backward compatibility, the user is explicitly
// managing destroyed
this._readableState.destroyed = value;
}
});

ObjectDefineProperty(Readable.prototype, 'readableEnded', {
// Making it explicit this property is not enumerable
// because otherwise some prototype manipulation in
// userland will fail
enumerable: false,
get() {
return this._readableState ? this._readableState.endEmitted : false;
}
});

Readable.prototype.destroy = destroyImpl.destroy;
Readable.prototype._undestroy = destroyImpl.undestroy;
Readable.prototype._destroy = function(err, cb) {
Expand Down Expand Up @@ -1105,68 +1062,99 @@ Readable.prototype[SymbolAsyncIterator] = function() {
return createReadableStreamAsyncIterator(this);
};

ObjectDefineProperty(Readable.prototype, 'readableHighWaterMark', {
// Making it explicit this property is not enumerable
// because otherwise some prototype manipulation in
// userland will fail
enumerable: false,
get: function() {
return this._readableState.highWaterMark;
}
});
// Making it explicit these properties are not enumerable
// because otherwise some prototype manipulation in
// userland will fail
ObjectDefineProperties(Readable.prototype, {

ObjectDefineProperty(Readable.prototype, 'readableBuffer', {
// Making it explicit this property is not enumerable
// because otherwise some prototype manipulation in
// userland will fail
enumerable: false,
get: function() {
return this._readableState && this._readableState.buffer;
}
});
readableHighWaterMark: {
enumerable: false,
get: function() {
return this._readableState.highWaterMark;
}
},

ObjectDefineProperty(Readable.prototype, 'readableFlowing', {
// Making it explicit this property is not enumerable
// because otherwise some prototype manipulation in
// userland will fail
enumerable: false,
get: function() {
return this._readableState.flowing;
readableBuffer: {
enumerable: false,
get: function() {
return this._readableState && this._readableState.buffer;
}
},
set: function(state) {
if (this._readableState) {
this._readableState.flowing = state;

readableFlowing: {
enumerable: false,
get: function() {
return this._readableState.flowing;
},
set: function(state) {
if (this._readableState) {
this._readableState.flowing = state;
}
}
}
});
},

// Exposed for testing purposes only.
Readable._fromList = fromList;
readableLength: {
enumerable: false,
get() {
return this._readableState.length;
}
},

ObjectDefineProperty(Readable.prototype, 'readableLength', {
// Making it explicit this property is not enumerable
// because otherwise some prototype manipulation in
// userland will fail
enumerable: false,
get() {
return this._readableState.length;
}
});
readableObjectMode: {
enumerable: false,
get() {
return this._readableState ? this._readableState.objectMode : false;
}
},

ObjectDefineProperty(Readable.prototype, 'readableObjectMode', {
enumerable: false,
get() {
return this._readableState ? this._readableState.objectMode : false;
}
});
readableEncoding: {
enumerable: false,
get() {
return this._readableState ? this._readableState.encoding : null;
}
},

destroyed: {
enumerable: false,
get() {
if (this._readableState === undefined) {
return false;
}
return this._readableState.destroyed;
},
set(value) {
// We ignore the value if the stream
// has not been initialized yet
if (!this._readableState) {
return;
}

ObjectDefineProperty(Readable.prototype, 'readableEncoding', {
enumerable: false,
get() {
return this._readableState ? this._readableState.encoding : null;
// Backward compatibility, the user is explicitly
// managing destroyed
this._readableState.destroyed = value;
}
},

readableEnded: {
enumerable: false,
get() {
return this._readableState ? this._readableState.endEmitted : false;
}
},

paused: {
get() {
return this[kPaused] !== false;
},
set(value) {
this[kPaused] = !!value;
}
}
});

// Exposed for testing purposes only.
Readable._fromList = fromList;

// Pluck off n bytes from an array of buffers.
// Length is the combined lengths of all the buffers in the list.
// This function is designed to be inlinable, so please take care when making
Expand Down

0 comments on commit 504e6d4

Please sign in to comment.