Demo for query storing

Change-Id: I947bcac841992c3f6cfd01ab337c265b0d01cb70
diff --git a/node_modules/pumpify/.travis.yml b/node_modules/pumpify/.travis.yml
new file mode 100644
index 0000000..32e71a6
--- /dev/null
+++ b/node_modules/pumpify/.travis.yml
@@ -0,0 +1,8 @@
+language: node_js
+
+node_js:
+  - "0.10"
+  - "4"
+  - "5"
+
+sudo: false
diff --git a/node_modules/pumpify/LICENSE b/node_modules/pumpify/LICENSE
new file mode 100644
index 0000000..757562e
--- /dev/null
+++ b/node_modules/pumpify/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2014 Mathias Buus
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
\ No newline at end of file
diff --git a/node_modules/pumpify/README.md b/node_modules/pumpify/README.md
new file mode 100644
index 0000000..4988f7b
--- /dev/null
+++ b/node_modules/pumpify/README.md
@@ -0,0 +1,56 @@
+# pumpify
+
+Combine an array of streams into a single duplex stream using [pump](https://github.com/mafintosh/pump) and [duplexify](https://github.com/mafintosh/duplexify).
+If one of the streams closes/errors all streams in the pipeline will be destroyed.
+
+```
+npm install pumpify
+```
+
+[![build status](http://img.shields.io/travis/mafintosh/pumpify.svg?style=flat)](http://travis-ci.org/mafintosh/pumpify)
+
+## Usage
+
+Pass the streams you want to pipe together to pumpify `pipeline = pumpify(s1, s2, s3, ...)`.
+`pipeline` is a duplex stream that writes to the first streams and reads from the last one.
+Streams are piped together using [pump](https://github.com/mafintosh/pump) so if one of them closes
+all streams will be destroyed.
+
+``` js
+var pumpify = require('pumpify')
+var tar = require('tar-fs')
+var zlib = require('zlib')
+var fs = require('fs')
+
+var untar = pumpify(zlib.createGunzip(), tar.extract('output-folder'))
+// you can also pass an array instead
+// var untar = pumpify([zlib.createGunzip(), tar.extract('output-folder')])
+
+fs.createReadStream('some-gzipped-tarball.tgz').pipe(untar)
+```
+
+If you are pumping object streams together use `pipeline = pumpify.obj(s1, s2, ...)`.
+Call `pipeline.destroy()` to destroy the pipeline (including the streams passed to pumpify).
+
+### Using `setPipeline(s1, s2, ...)`
+
+Similar to [duplexify](https://github.com/mafintosh/duplexify) you can also define the pipeline asynchronously using `setPipeline(s1, s2, ...)`
+
+``` js
+var untar = pumpify()
+
+setTimeout(function() {
+  // will start draining the input now
+  untar.setPipeline(zlib.createGunzip(), tar.extract('output-folder'))
+}, 1000)
+
+fs.createReadStream('some-gzipped-tarball.tgz').pipe(untar)
+```
+
+## License
+
+MIT
+
+## Related
+
+`pumpify` is part of the [mississippi stream utility collection](https://github.com/maxogden/mississippi) which includes more useful stream modules similar to this one.
diff --git a/node_modules/pumpify/index.js b/node_modules/pumpify/index.js
new file mode 100644
index 0000000..473e256
--- /dev/null
+++ b/node_modules/pumpify/index.js
@@ -0,0 +1,60 @@
+var pump = require('pump')
+var inherits = require('inherits')
+var Duplexify = require('duplexify')
+
+var toArray = function(args) {
+  if (!args.length) return []
+  return Array.isArray(args[0]) ? args[0] : Array.prototype.slice.call(args)
+}
+
+var define = function(opts) {
+  var Pumpify = function() {
+    var streams = toArray(arguments)
+    if (!(this instanceof Pumpify)) return new Pumpify(streams)
+    Duplexify.call(this, null, null, opts)
+    if (streams.length) this.setPipeline(streams)
+  }
+
+  inherits(Pumpify, Duplexify)
+
+  Pumpify.prototype.setPipeline = function() {
+    var streams = toArray(arguments)
+    var self = this
+    var ended = false
+    var w = streams[0]
+    var r = streams[streams.length-1]
+
+    r = r.readable ? r : null
+    w = w.writable ? w : null
+
+    var onclose = function() {
+      streams[0].emit('error', new Error('stream was destroyed'))
+    }
+
+    this.on('close', onclose)
+    this.on('prefinish', function() {
+      if (!ended) self.cork()
+    })
+
+    pump(streams, function(err) {
+      self.removeListener('close', onclose)
+      if (err) return self.destroy(err.message === 'premature close' ? null : err)
+      ended = true
+      // pump ends after the last stream is not writable *but*
+      // pumpify still forwards the readable part so we need to catch errors
+      // still, so reenable autoDestroy in this case
+      if (self._autoDestroy === false) self._autoDestroy = true
+      self.uncork()
+    })
+
+    if (this.destroyed) return onclose()
+    this.setWritable(w)
+    this.setReadable(r)
+  }
+
+  return Pumpify
+}
+
+module.exports = define({autoDestroy:false, destroy:false})
+module.exports.obj = define({autoDestroy: false, destroy:false, objectMode:true, highWaterMark:16})
+module.exports.ctor = define
diff --git a/node_modules/pumpify/node_modules/pump/.travis.yml b/node_modules/pumpify/node_modules/pump/.travis.yml
new file mode 100644
index 0000000..17f9433
--- /dev/null
+++ b/node_modules/pumpify/node_modules/pump/.travis.yml
@@ -0,0 +1,5 @@
+language: node_js
+node_js:
+  - "0.10"
+
+script: "npm test"
diff --git a/node_modules/pumpify/node_modules/pump/LICENSE b/node_modules/pumpify/node_modules/pump/LICENSE
new file mode 100644
index 0000000..757562e
--- /dev/null
+++ b/node_modules/pumpify/node_modules/pump/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2014 Mathias Buus
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
\ No newline at end of file
diff --git a/node_modules/pumpify/node_modules/pump/README.md b/node_modules/pumpify/node_modules/pump/README.md
new file mode 100644
index 0000000..5029b27
--- /dev/null
+++ b/node_modules/pumpify/node_modules/pump/README.md
@@ -0,0 +1,56 @@
+# pump
+
+pump is a small node module that pipes streams together and destroys all of them if one of them closes.
+
+```
+npm install pump
+```
+
+[![build status](http://img.shields.io/travis/mafintosh/pump.svg?style=flat)](http://travis-ci.org/mafintosh/pump)
+
+## What problem does it solve?
+
+When using standard `source.pipe(dest)` source will _not_ be destroyed if dest emits close or an error.
+You are also not able to provide a callback to tell when then pipe has finished.
+
+pump does these two things for you
+
+## Usage
+
+Simply pass the streams you want to pipe together to pump and add an optional callback
+
+``` js
+var pump = require('pump')
+var fs = require('fs')
+
+var source = fs.createReadStream('/dev/random')
+var dest = fs.createWriteStream('/dev/null')
+
+pump(source, dest, function(err) {
+  console.log('pipe finished', err)
+})
+
+setTimeout(function() {
+  dest.destroy() // when dest is closed pump will destroy source
+}, 1000)
+```
+
+You can use pump to pipe more than two streams together as well
+
+``` js
+var transform = someTransformStream()
+
+pump(source, transform, anotherTransform, dest, function(err) {
+  console.log('pipe finished', err)
+})
+```
+
+If `source`, `transform`, `anotherTransform` or `dest` closes all of them will be destroyed.
+
+## License
+
+MIT
+
+## Related
+
+`pump` is part of the [mississippi stream utility collection](https://github.com/maxogden/mississippi) which includes more useful stream modules similar to this one.
diff --git a/node_modules/pumpify/node_modules/pump/index.js b/node_modules/pumpify/node_modules/pump/index.js
new file mode 100644
index 0000000..d9ca033
--- /dev/null
+++ b/node_modules/pumpify/node_modules/pump/index.js
@@ -0,0 +1,82 @@
+var once = require('once')
+var eos = require('end-of-stream')
+var fs = require('fs') // we only need fs to get the ReadStream and WriteStream prototypes
+
+var noop = function () {}
+var ancient = /^v?\.0/.test(process.version)
+
+var isFn = function (fn) {
+  return typeof fn === 'function'
+}
+
+var isFS = function (stream) {
+  if (!ancient) return false // newer node version do not need to care about fs is a special way
+  if (!fs) return false // browser
+  return (stream instanceof (fs.ReadStream || noop) || stream instanceof (fs.WriteStream || noop)) && isFn(stream.close)
+}
+
+var isRequest = function (stream) {
+  return stream.setHeader && isFn(stream.abort)
+}
+
+var destroyer = function (stream, reading, writing, callback) {
+  callback = once(callback)
+
+  var closed = false
+  stream.on('close', function () {
+    closed = true
+  })
+
+  eos(stream, {readable: reading, writable: writing}, function (err) {
+    if (err) return callback(err)
+    closed = true
+    callback()
+  })
+
+  var destroyed = false
+  return function (err) {
+    if (closed) return
+    if (destroyed) return
+    destroyed = true
+
+    if (isFS(stream)) return stream.close(noop) // use close for fs streams to avoid fd leaks
+    if (isRequest(stream)) return stream.abort() // request.destroy just do .end - .abort is what we want
+
+    if (isFn(stream.destroy)) return stream.destroy()
+
+    callback(err || new Error('stream was destroyed'))
+  }
+}
+
+var call = function (fn) {
+  fn()
+}
+
+var pipe = function (from, to) {
+  return from.pipe(to)
+}
+
+var pump = function () {
+  var streams = Array.prototype.slice.call(arguments)
+  var callback = isFn(streams[streams.length - 1] || noop) && streams.pop() || noop
+
+  if (Array.isArray(streams[0])) streams = streams[0]
+  if (streams.length < 2) throw new Error('pump requires two streams per minimum')
+
+  var error
+  var destroys = streams.map(function (stream, i) {
+    var reading = i < streams.length - 1
+    var writing = i > 0
+    return destroyer(stream, reading, writing, function (err) {
+      if (!error) error = err
+      if (err) destroys.forEach(call)
+      if (reading) return
+      destroys.forEach(call)
+      callback(error)
+    })
+  })
+
+  streams.reduce(pipe)
+}
+
+module.exports = pump
diff --git a/node_modules/pumpify/node_modules/pump/package.json b/node_modules/pumpify/node_modules/pump/package.json
new file mode 100644
index 0000000..39f30ae
--- /dev/null
+++ b/node_modules/pumpify/node_modules/pump/package.json
@@ -0,0 +1,59 @@
+{
+  "_from": "pump@^2.0.0",
+  "_id": "pump@2.0.1",
+  "_inBundle": false,
+  "_integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==",
+  "_location": "/pumpify/pump",
+  "_phantomChildren": {},
+  "_requested": {
+    "type": "range",
+    "registry": true,
+    "raw": "pump@^2.0.0",
+    "name": "pump",
+    "escapedName": "pump",
+    "rawSpec": "^2.0.0",
+    "saveSpec": null,
+    "fetchSpec": "^2.0.0"
+  },
+  "_requiredBy": [
+    "/pumpify"
+  ],
+  "_resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz",
+  "_shasum": "12399add6e4cf7526d973cbc8b5ce2e2908b3909",
+  "_spec": "pump@^2.0.0",
+  "_where": "C:\\Users\\marcr\\Desktop\\KorAp\\Git\\Kalamar\\node_modules\\pumpify",
+  "author": {
+    "name": "Mathias Buus Madsen",
+    "email": "mathiasbuus@gmail.com"
+  },
+  "browser": {
+    "fs": false
+  },
+  "bugs": {
+    "url": "https://github.com/mafintosh/pump/issues"
+  },
+  "bundleDependencies": false,
+  "dependencies": {
+    "end-of-stream": "^1.1.0",
+    "once": "^1.3.1"
+  },
+  "deprecated": false,
+  "description": "pipe streams together and close all of them if one of them closes",
+  "homepage": "https://github.com/mafintosh/pump#readme",
+  "keywords": [
+    "streams",
+    "pipe",
+    "destroy",
+    "callback"
+  ],
+  "license": "MIT",
+  "name": "pump",
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/mafintosh/pump.git"
+  },
+  "scripts": {
+    "test": "node test-browser.js && node test-node.js"
+  },
+  "version": "2.0.1"
+}
diff --git a/node_modules/pumpify/node_modules/pump/test-browser.js b/node_modules/pumpify/node_modules/pump/test-browser.js
new file mode 100644
index 0000000..75ea4a2
--- /dev/null
+++ b/node_modules/pumpify/node_modules/pump/test-browser.js
@@ -0,0 +1,62 @@
+var stream = require('stream')
+var pump = require('./index')
+
+var rs = new stream.Readable()
+var ws = new stream.Writable()
+
+rs._read = function (size) {
+  this.push(Buffer(size).fill('abc'))
+}
+
+ws._write = function (chunk, encoding, cb) {
+  setTimeout(function () {
+    cb()
+  }, 100)
+}
+
+var toHex = function () {
+  var reverse = new (require('stream').Transform)()
+
+  reverse._transform = function (chunk, enc, callback) {
+    reverse.push(chunk.toString('hex'))
+    callback()
+  }
+
+  return reverse
+}
+
+var wsClosed = false
+var rsClosed = false
+var callbackCalled = false
+
+var check = function () {
+  if (wsClosed && rsClosed && callbackCalled) {
+    console.log('test-browser.js passes')
+    clearTimeout(timeout)
+  }
+}
+
+ws.on('finish', function () {
+  wsClosed = true
+  check()
+})
+
+rs.on('end', function () {
+  rsClosed = true
+  check()
+})
+
+pump(rs, toHex(), toHex(), toHex(), ws, function () {
+  callbackCalled = true
+  check()
+})
+
+setTimeout(function () {
+  rs.push(null)
+  rs.emit('close')
+}, 1000)
+
+var timeout = setTimeout(function () {
+  check()
+  throw new Error('timeout')
+}, 5000)
diff --git a/node_modules/pumpify/node_modules/pump/test-node.js b/node_modules/pumpify/node_modules/pump/test-node.js
new file mode 100644
index 0000000..034a654
--- /dev/null
+++ b/node_modules/pumpify/node_modules/pump/test-node.js
@@ -0,0 +1,53 @@
+var pump = require('./index')
+
+var rs = require('fs').createReadStream('/dev/random')
+var ws = require('fs').createWriteStream('/dev/null')
+
+var toHex = function () {
+  var reverse = new (require('stream').Transform)()
+
+  reverse._transform = function (chunk, enc, callback) {
+    reverse.push(chunk.toString('hex'))
+    callback()
+  }
+
+  return reverse
+}
+
+var wsClosed = false
+var rsClosed = false
+var callbackCalled = false
+
+var check = function () {
+  if (wsClosed && rsClosed && callbackCalled) {
+    console.log('test-node.js passes')
+    clearTimeout(timeout)
+  }
+}
+
+ws.on('close', function () {
+  wsClosed = true
+  check()
+})
+
+rs.on('close', function () {
+  rsClosed = true
+  check()
+})
+
+var res = pump(rs, toHex(), toHex(), toHex(), ws, function () {
+  callbackCalled = true
+  check()
+})
+
+if (res) {
+  process.exit(1)
+}
+
+setTimeout(function () {
+  rs.destroy()
+}, 1000)
+
+var timeout = setTimeout(function () {
+  throw new Error('timeout')
+}, 5000)
diff --git a/node_modules/pumpify/package.json b/node_modules/pumpify/package.json
new file mode 100644
index 0000000..ed2dbce
--- /dev/null
+++ b/node_modules/pumpify/package.json
@@ -0,0 +1,68 @@
+{
+  "_from": "pumpify@^1.3.5",
+  "_id": "pumpify@1.5.1",
+  "_inBundle": false,
+  "_integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==",
+  "_location": "/pumpify",
+  "_phantomChildren": {
+    "end-of-stream": "1.4.4",
+    "once": "1.4.0"
+  },
+  "_requested": {
+    "type": "range",
+    "registry": true,
+    "raw": "pumpify@^1.3.5",
+    "name": "pumpify",
+    "escapedName": "pumpify",
+    "rawSpec": "^1.3.5",
+    "saveSpec": null,
+    "fetchSpec": "^1.3.5"
+  },
+  "_requiredBy": [
+    "/glob-stream",
+    "/vinyl-fs"
+  ],
+  "_resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz",
+  "_shasum": "36513be246ab27570b1a374a5ce278bfd74370ce",
+  "_spec": "pumpify@^1.3.5",
+  "_where": "C:\\Users\\marcr\\Desktop\\KorAp\\Git\\Kalamar\\node_modules\\vinyl-fs",
+  "author": {
+    "name": "Mathias Buus"
+  },
+  "bugs": {
+    "url": "https://github.com/mafintosh/pumpify/issues"
+  },
+  "bundleDependencies": false,
+  "dependencies": {
+    "duplexify": "^3.6.0",
+    "inherits": "^2.0.3",
+    "pump": "^2.0.0"
+  },
+  "deprecated": false,
+  "description": "Combine an array of streams into a single duplex stream using pump and duplexify",
+  "devDependencies": {
+    "tape": "^4.8.0",
+    "through2": "^2.0.3"
+  },
+  "homepage": "https://github.com/mafintosh/pumpify",
+  "keywords": [
+    "pump",
+    "duplexify",
+    "duplex",
+    "streams",
+    "stream",
+    "pipeline",
+    "combine"
+  ],
+  "license": "MIT",
+  "main": "index.js",
+  "name": "pumpify",
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/mafintosh/pumpify.git"
+  },
+  "scripts": {
+    "test": "tape test.js"
+  },
+  "version": "1.5.1"
+}
diff --git a/node_modules/pumpify/test.js b/node_modules/pumpify/test.js
new file mode 100644
index 0000000..b603c4d
--- /dev/null
+++ b/node_modules/pumpify/test.js
@@ -0,0 +1,235 @@
+var tape = require('tape')
+var through = require('through2')
+var pumpify = require('./')
+var stream = require('stream')
+var duplexify = require('duplexify')
+
+tape('basic', function(t) {
+  t.plan(3)
+
+  var pipeline = pumpify(
+    through(function(data, enc, cb) {
+      t.same(data.toString(), 'hello')
+      cb(null, data.toString().toUpperCase())
+    }),
+    through(function(data, enc, cb) {
+      t.same(data.toString(), 'HELLO')
+      cb(null, data.toString().toLowerCase())
+    })
+  )
+
+  pipeline.write('hello')
+  pipeline.on('data', function(data) {
+    t.same(data.toString(), 'hello')
+    t.end()
+  })
+})
+
+tape('3 times', function(t) {
+  t.plan(4)
+
+  var pipeline = pumpify(
+    through(function(data, enc, cb) {
+      t.same(data.toString(), 'hello')
+      cb(null, data.toString().toUpperCase())
+    }),
+    through(function(data, enc, cb) {
+      t.same(data.toString(), 'HELLO')
+      cb(null, data.toString().toLowerCase())
+    }),
+    through(function(data, enc, cb) {
+      t.same(data.toString(), 'hello')
+      cb(null, data.toString().toUpperCase())
+    })
+  )
+
+  pipeline.write('hello')
+  pipeline.on('data', function(data) {
+    t.same(data.toString(), 'HELLO')
+    t.end()
+  })
+})
+
+tape('destroy', function(t) {
+  var test = through()
+  test.destroy = function() {
+    t.ok(true)
+    t.end()
+  }
+
+  var pipeline = pumpify(through(), test)
+
+  pipeline.destroy()
+})
+
+tape('close', function(t) {
+  var test = through()
+  var pipeline = pumpify(through(), test)
+
+  pipeline.on('error', function(err) {
+    t.same(err.message, 'lol')
+    t.end()
+  })
+
+  test.emit('error', new Error('lol'))
+})
+
+tape('end waits for last one', function(t) {
+  var ran = false
+
+  var a = through()
+  var b = through()
+  var c = through(function(data, enc, cb) {
+    setTimeout(function() {
+      ran = true
+      cb()
+    }, 100)
+  })
+
+  var pipeline = pumpify(a, b, c)
+
+  pipeline.write('foo')
+  pipeline.end(function() {
+    t.ok(ran)
+    t.end()
+  })
+
+  t.ok(!ran)
+})
+
+tape('always wait for finish', function(t) {
+  var a = new stream.Readable()
+  a._read = function() {}
+  a.push('hello')
+
+  var pipeline = pumpify(a, through(), through())
+  var ran = false
+
+  pipeline.on('finish', function() {
+    t.ok(ran)
+    t.end()
+  })
+
+  setTimeout(function() {
+    ran = true
+    a.push(null)
+  }, 100)
+})
+
+tape('async', function(t) {
+  var pipeline = pumpify()
+
+  t.plan(4)
+
+  pipeline.write('hello')
+  pipeline.on('data', function(data) {
+    t.same(data.toString(), 'HELLO')
+    t.end()
+  })
+
+  setTimeout(function() {
+    pipeline.setPipeline(
+      through(function(data, enc, cb) {
+        t.same(data.toString(), 'hello')
+        cb(null, data.toString().toUpperCase())
+      }),
+      through(function(data, enc, cb) {
+        t.same(data.toString(), 'HELLO')
+        cb(null, data.toString().toLowerCase())
+      }),
+      through(function(data, enc, cb) {
+        t.same(data.toString(), 'hello')
+        cb(null, data.toString().toUpperCase())
+      })
+    )
+  }, 100)
+})
+
+tape('early destroy', function(t) {
+  var a = through()
+  var b = through()
+  var c = through()
+
+  b.destroy = function() {
+    t.ok(true)
+    t.end()
+  }
+
+  var pipeline = pumpify()
+
+  pipeline.destroy()
+  setTimeout(function() {
+    pipeline.setPipeline(a, b, c)
+  }, 100)
+})
+
+tape('preserves error', function (t) {
+  var a = through()
+  var b = through(function (data, enc, cb) {
+    cb(new Error('stop'))
+  })
+  var c = through()
+  var s = pumpify()
+
+  s.on('error', function (err) {
+    t.same(err.message, 'stop')
+    t.end()
+  })
+
+  s.setPipeline(a, b, c)
+  s.resume()
+  s.write('hi')
+})
+
+tape('preserves error again', function (t) {
+  var ws = new stream.Writable()
+  var rs = new stream.Readable({highWaterMark: 16})
+
+  ws._write = function (data, enc, cb) {
+    cb(null)
+  }
+
+  rs._read = function () {
+    process.nextTick(function () {
+      rs.push('hello world')
+    })
+  }
+
+  var pumpifyErr = pumpify(
+    through(),
+    through(function(chunk, _, cb) {
+      cb(new Error('test'))
+    }),
+    ws
+  )
+
+  rs.pipe(pumpifyErr)
+    .on('error', function (err) {
+      t.ok(err)
+      t.ok(err.message !== 'premature close', 'does not close with premature close')
+      t.end()
+    })
+})
+
+tape('returns error from duplexify', function (t) {
+  var a = through()
+  var b = duplexify()
+  var s = pumpify()
+
+  s.setPipeline(a, b)
+
+  s.on('error', function (err) {
+    t.same(err.message, 'stop')
+    t.end()
+  })
+
+  s.write('data')
+  // Test passes if `.end()` is not called
+  s.end()
+
+  b.setWritable(through())
+
+  setImmediate(function () {
+    b.destroy(new Error('stop'))
+  })
+})