• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1/*!
2 * unpipe
3 * Copyright(c) 2015 Douglas Christopher Wilson
4 * MIT Licensed
5 */
6
7'use strict'
8
9/**
10 * Module exports.
11 * @public
12 */
13
14module.exports = unpipe
15
16/**
17 * Determine if there are Node.js pipe-like data listeners.
18 * @private
19 */
20
21function hasPipeDataListeners(stream) {
22  var listeners = stream.listeners('data')
23
24  for (var i = 0; i < listeners.length; i++) {
25    if (listeners[i].name === 'ondata') {
26      return true
27    }
28  }
29
30  return false
31}
32
33/**
34 * Unpipe a stream from all destinations.
35 *
36 * @param {object} stream
37 * @public
38 */
39
40function unpipe(stream) {
41  if (!stream) {
42    throw new TypeError('argument stream is required')
43  }
44
45  if (typeof stream.unpipe === 'function') {
46    // new-style
47    stream.unpipe()
48    return
49  }
50
51  // Node.js 0.8 hack
52  if (!hasPipeDataListeners(stream)) {
53    return
54  }
55
56  var listener
57  var listeners = stream.listeners('close')
58
59  for (var i = 0; i < listeners.length; i++) {
60    listener = listeners[i]
61
62    if (listener.name !== 'cleanup' && listener.name !== 'onclose') {
63      continue
64    }
65
66    // invoke the listener
67    listener.call(stream)
68  }
69}
70