From 1bf80a0a3f1020f8a2f2c7be18323a660aaa2332 Mon Sep 17 00:00:00 2001 From: Calvin Metcalf Date: Mon, 8 Aug 2016 13:32:26 -0400 Subject: [PATCH] stream: avoid caching prepend check This removes the cached check for EE.prototype.prependListener because we can't have nice things. More specifically some libraries will bundle their own event emitter implementation. PR-URL: https://github.com/nodejs/node/pull/8018 Reviewed-By: James M Snell Reviewed-By: Anna Henningsen Reviewed-By: Colin Ihrig Reviewed-By: Matteo Collina --- lib/_stream_readable.js | 13 +++++---- test/parallel/test-stream-events-prepend.js | 29 +++++++++++++++++++++ 2 files changed, 35 insertions(+), 7 deletions(-) create mode 100644 test/parallel/test-stream-events-prepend.js diff --git a/lib/_stream_readable.js b/lib/_stream_readable.js index 4eb5f705848b30..65efdc4992fcef 100644 --- a/lib/_stream_readable.js +++ b/lib/_stream_readable.js @@ -13,13 +13,12 @@ var StringDecoder; util.inherits(Readable, Stream); -var prependListener; -if (typeof EE.prototype.prependListener === 'function') { - prependListener = function prependListener(emitter, event, fn) { +function prependListener(emitter, event, fn) { + // Sadly this is not cacheable as some libraries bundle their own + // event emitter implementation with them. + if (typeof emitter.prependListener === 'function') { return emitter.prependListener(event, fn); - }; -} else { - prependListener = function prependListener(emitter, event, fn) { + } else { // This is a hack to make sure that our error handler is attached before any // userland ones. NEVER DO THIS. This is here only because this code needs // to continue to work with older versions of Node.js that do not include @@ -30,7 +29,7 @@ if (typeof EE.prototype.prependListener === 'function') { emitter._events[event].unshift(fn); else emitter._events[event] = [fn, emitter._events[event]]; - }; + } } function ReadableState(options, stream) { diff --git a/test/parallel/test-stream-events-prepend.js b/test/parallel/test-stream-events-prepend.js new file mode 100644 index 00000000000000..63d9a32807c5d5 --- /dev/null +++ b/test/parallel/test-stream-events-prepend.js @@ -0,0 +1,29 @@ +'use strict'; +const common = require('../common'); +const stream = require('stream'); +const util = require('util'); + +function Writable() { + this.writable = true; + stream.Writable.call(this); + this.prependListener = undefined; +} +util.inherits(Writable, stream.Writable); +Writable.prototype._write = function(chunk, end, cb) { + cb(); +}; + +function Readable() { + this.readable = true; + stream.Readable.call(this); +} +util.inherits(Readable, stream.Readable); +Readable.prototype._read = function() { + this.push(null); +}; + +const w = new Writable(); +w.on('pipe', common.mustCall(function() {})); + +const r = new Readable(); +r.pipe(w);