blob: bfa039bbf55ab86127928dc9f36ad23ea7e64779 [file] [log] [blame]
# 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