| /*! |
| * unpipe |
| * Copyright(c) 2015 Douglas Christopher Wilson |
| * MIT Licensed |
| */ |
| |
| 'use strict' |
| |
| /** |
| * Module exports. |
| * @public |
| */ |
| |
| module.exports = unpipe |
| |
| /** |
| * Determine if there are Node.js pipe-like data listeners. |
| * @private |
| */ |
| |
| function hasPipeDataListeners(stream) { |
| var listeners = stream.listeners('data') |
| |
| for (var i = 0; i < listeners.length; i++) { |
| if (listeners[i].name === 'ondata') { |
| return true |
| } |
| } |
| |
| return false |
| } |
| |
| /** |
| * Unpipe a stream from all destinations. |
| * |
| * @param {object} stream |
| * @public |
| */ |
| |
| function unpipe(stream) { |
| if (!stream) { |
| throw new TypeError('argument stream is required') |
| } |
| |
| if (typeof stream.unpipe === 'function') { |
| // new-style |
| stream.unpipe() |
| return |
| } |
| |
| // Node.js 0.8 hack |
| if (!hasPipeDataListeners(stream)) { |
| return |
| } |
| |
| var listener |
| var listeners = stream.listeners('close') |
| |
| for (var i = 0; i < listeners.length; i++) { |
| listener = listeners[i] |
| |
| if (listener.name !== 'cleanup' && listener.name !== 'onclose') { |
| continue |
| } |
| |
| // invoke the listener |
| listener.call(stream) |
| } |
| } |