| # stream-splicer |
| |
| streaming pipeline with a mutable configuration |
| |
| This module is similar to |
| [stream-combiner](https://npmjs.org/package/stream-combiner), |
| but with a pipeline configuration that can be changed at runtime. |
| |
| [![build status](https://travis-ci.org/substack/stream-splicer.png?branch=master)](http://travis-ci.org/substack/stream-splicer) |
| |
| # example |
| |
| This example begins with an HTTP header parser that waits for an empty line to |
| signify the end of the header. At that point, it switches to a streaming json |
| parser to operate on the HTTP body. |
| |
| ``` js |
| var splicer = require('stream-splicer'); |
| var through = require('through2'); |
| var JSONStream = require('JSONStream'); |
| var split = require('split'); |
| |
| var headerData = {}; |
| var headers = through.obj(function (buf, enc, next) { |
| var line = buf.toString('utf8'); |
| if (line === '') { |
| this.push(headerData); |
| pipeline.splice(1, 1, JSONStream.parse([ 'rows', true ])); |
| } |
| else { |
| var m = /^(\S+):(.+)/.exec(line); |
| var key = m && m[1].trim(); |
| var value = m && m[2].trim(); |
| if (m) headerData[key] = value; |
| } |
| next(); |
| }); |
| var pipeline = splicer([ split(), headers, JSONStream.stringify() ]); |
| process.stdin.pipe(pipeline).pipe(process.stdout); |
| ``` |
| |
| intput: |
| |
| ``` |
| GET / HTTP/1.1 |
| Host: substack.net |
| User-Agent: echo |
| |
| {"rows":["beep","boop"]} |
| ``` |
| |
| output: |
| |
| ``` |
| $ echo -ne 'GET / HTTP/1.1\nHost: substack.net\nUser-Agent: echo\n\n{"rows":["beep","boop"]}\n' | node example/header.js |
| [ |
| {"Host":"substack.net","User-Agent":"echo"} |
| , |
| "beep" |
| , |
| "boop" |
| ] |
| ``` |
| |
| # methods |
| |
| ``` js |
| var splicer = require('stream-splicer') |
| ``` |
| |
| ## var pipeline = splicer(streams, opts) |
| |
| Create a `pipeline` duplex stream given an array of `streams`. Each `stream` |
| will be piped to the next. Writes to `pipeline` get written to the first stream |
| and data for reads from `pipeline` come from the last stream. |
| |
| For example, for streams `[ a, b, c, d ]`, this pipeline is constructed |
| internally: |
| |
| ``` |
| a.pipe(b).pipe(c).pipe(d) |
| ``` |
| |
| Input will get written into `a`. Output will be read from `d`. |
| |
| If any of the elements in `streams` are arrays, they will be converted into |
| nested pipelines. This is useful if you want to expose a hookable pipeline with |
| grouped insertion points. |
| |
| ## var pipeline = splicer.obj(streams, opts) |
| |
| Create a `pipeline` with `opts.objectMode` set to true for convenience. |
| |
| ## var removed = pipeline.splice(index, howMany, stream, ...) |
| |
| Splice the pipeline starting at `index`, removing `howMany` streams and |
| replacing them with each additional `stream` argument provided. |
| |
| The streams that were removed from the splice and returned. |
| |
| ## pipeline.push(stream, ...) |
| |
| Push one or more streams to the end of the pipeline. |
| |
| ## var stream = pipeline.pop() |
| |
| Pop a stream from the end of the pipeline. |
| |
| ## pipeline.unshift(stream, ...) |
| |
| Unshift one or more streams to the begining of the pipeline. |
| |
| ## var stream = pipeline.shift() |
| |
| Shift a stream from the begining of the pipeline. |
| |
| ## var stream = pipeline.get(index, ...) |
| |
| Return the stream at index `index, ...`. Indexes can be negative. |
| |
| Multiple indexes will traverse into nested pipelines. |
| |
| # attributes |
| |
| ## pipeline.length |
| |
| The number of streams in the pipeline |
| |
| # install |
| |
| With [npm](https://npmjs.org) do: |
| |
| ``` |
| npm install stream-splicer |
| ``` |
| |
| # license |
| |
| MIT |