Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/mafintosh/peek-stream

Transform stream that lets you peek the first line before deciding how to parse it
https://github.com/mafintosh/peek-stream

Last synced: 9 days ago
JSON representation

Transform stream that lets you peek the first line before deciding how to parse it

Awesome Lists containing this project

README

        

# peek-stream

Transform stream that lets you peek the first line before deciding how to parse it

```
npm install peek-stream
```

[![build status](http://img.shields.io/travis/mafintosh/peek-stream.svg?style=flat)](http://travis-ci.org/mafintosh/peek-stream)
![dat](http://img.shields.io/badge/Development%20sponsored%20by-dat-green.svg?style=flat)

## Usage

``` js
var peek = require('peek-stream')
var ldjson = require('ldjson-stream')
var csv = require('csv-parser')

var isCSV = function(data) {
return data.toString().indexOf(',') > -1
}

var isJSON = function(data) {
try {
JSON.parse(data)
return true
} catch (err) {
return false
}
}

// call parser to create a new parser
var parser = function() {
return peek(function(data, swap) {
// maybe it is JSON?
if (isJSON(data)) return swap(null, ldjson())

// maybe it is CSV?
if (isCSV(data)) return swap(null, csv())

// we do not know - bail
swap(new Error('No parser available'))
})
}
```

The above parser will be able to parse both line delimited JSON and CSV

``` js
var parse = parser()

parse.write('{"hello":"world"}\n{"hello":"another"}\n')
parse.on('data', function(data) {
console.log(data) // prints {hello:'world'} and {hello:'another'}
})
```

Or

``` js
var parse = parser()

parse.write('test,header\nvalue-1,value-2\n')
parse.on('data', function(data) {
console.log(data) // prints {test:'value-1', header:'value-2'}
})
```

Per default `data` is the first line (or the first `65535` bytes if no newline is found).
To change the max buffer pass an options map to the constructor

``` js
var parse = peek({
maxBuffer: 10000
}, function(data, swap) {
...
})
```

If you want to emit an error if no newline is found set `strict: true` as well.

## License

MIT