Index: frontend/node_modules/handle-thing/test/api-test.js
===================================================================
--- frontend/node_modules/handle-thing/test/api-test.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
+++ frontend/node_modules/handle-thing/test/api-test.js	(revision 9af201e94b5a79beb92a30858fc54de4bc3b9449)
@@ -0,0 +1,110 @@
+/* eslint-env mocha */
+
+var assert = require('assert')
+var net = require('net')
+var streamPair = require('stream-pair')
+
+var thing = require('../')
+
+describe('Handle Thing', function () {
+  var handle
+  var pair
+  var socket;
+
+  [ 'normal', 'lazy' ].forEach(function (mode) {
+    describe(mode, function () {
+      beforeEach(function () {
+        pair = streamPair.create()
+        handle = thing.create(mode === 'normal' ? pair.other : null)
+        socket = new net.Socket({
+          handle: handle,
+          readable: true,
+          writable: true
+        })
+
+        if (mode === 'lazy') {
+          setTimeout(function () {
+            handle.setStream(pair.other)
+          }, 50)
+        }
+      })
+
+      afterEach(function () {
+        assert(handle._stream)
+      })
+
+      it('should write data to Socket', function (done) {
+        pair.write('hello')
+        pair.write(' world')
+        pair.end('... ok')
+
+        var chunks = ''
+        socket.on('data', function (chunk) {
+          chunks += chunk
+        })
+        socket.on('end', function () {
+          assert.strictEqual(chunks, 'hello world... ok')
+
+          // allowHalfOpen is `false`, so the `end` should be followed by `close`
+          socket.once('close', function () {
+            done()
+          })
+        })
+      })
+
+      it('should read data from Socket', function (done) {
+        socket.write('hello')
+        socket.write(' world')
+        socket.end('... ok')
+
+        var chunks = ''
+        pair.on('data', function (chunk) {
+          chunks += chunk
+        })
+        pair.on('end', function () {
+          assert.strictEqual(chunks, 'hello world... ok')
+
+          done()
+        })
+      })
+
+      it('should invoke `close` callback', function (done) {
+        handle._options.close = function (callback) {
+          done()
+          process.nextTick(callback)
+        }
+
+        pair.end('hello')
+        socket.resume()
+      })
+
+      it('should kill pending requests', function (done) {
+        handle._options.close = function () {
+          setTimeout(done, 75)
+        }
+
+        socket.write('hello')
+        socket.destroy()
+      })
+
+      if (mode === 'normal') {
+        it('should invoke `getPeerName` callback', function () {
+          handle._options.getPeerName = function () {
+            return { address: 'ohai' }
+          }
+
+          assert.strictEqual(socket.remoteAddress, 'ohai')
+        })
+
+        it('should emit ECONNRESET at `close` event', function (done) {
+          pair.other.emit('close')
+
+          socket.on('error', function (err) {
+            assert(/ECONNRESET/.test(err.message))
+            done()
+          })
+        })
+      }
+    })
+  })
+})
