| 'use strict'; | 
| const PassThrough = require('stream').PassThrough; | 
|   | 
| module.exports = opts => { | 
|     opts = Object.assign({}, opts); | 
|   | 
|     const array = opts.array; | 
|     let encoding = opts.encoding; | 
|     const buffer = encoding === 'buffer'; | 
|     let objectMode = false; | 
|   | 
|     if (array) { | 
|         objectMode = !(encoding || buffer); | 
|     } else { | 
|         encoding = encoding || 'utf8'; | 
|     } | 
|   | 
|     if (buffer) { | 
|         encoding = null; | 
|     } | 
|   | 
|     let len = 0; | 
|     const ret = []; | 
|     const stream = new PassThrough({objectMode}); | 
|   | 
|     if (encoding) { | 
|         stream.setEncoding(encoding); | 
|     } | 
|   | 
|     stream.on('data', chunk => { | 
|         ret.push(chunk); | 
|   | 
|         if (objectMode) { | 
|             len = ret.length; | 
|         } else { | 
|             len += chunk.length; | 
|         } | 
|     }); | 
|   | 
|     stream.getBufferedValue = () => { | 
|         if (array) { | 
|             return ret; | 
|         } | 
|   | 
|         return buffer ? Buffer.concat(ret, len) : ret.join(''); | 
|     }; | 
|   | 
|     stream.getBufferedLength = () => len; | 
|   | 
|     return stream; | 
| }; |