You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
148 lines
3.9 KiB
148 lines
3.9 KiB
3 years ago
|
# pino-abstract-transport
|
||
|
[](https://www.npmjs.com/package/pino-abstract-transport)
|
||
|
[](https://github.com/pinojs/pino-abstract-transport/actions)
|
||
|
[](https://coveralls.io/github/pinojs/pino-abstract-transport?branch=master)
|
||
|
[](https://standardjs.com/)
|
||
|
|
||
|
Write Pino transports easily.
|
||
|
|
||
|
## Install
|
||
|
|
||
|
```
|
||
|
npm i pino-abstract-transport
|
||
|
```
|
||
|
|
||
|
## Usage
|
||
|
|
||
|
```js
|
||
|
import build from 'pino-abstract-transport'
|
||
|
|
||
|
export default async function (opts) {
|
||
|
return build(async function (source) {
|
||
|
for await (let obj of source) {
|
||
|
console.log(obj)
|
||
|
}
|
||
|
})
|
||
|
}
|
||
|
```
|
||
|
|
||
|
or in CommonJS and streams:
|
||
|
|
||
|
```js
|
||
|
'use strict'
|
||
|
|
||
|
const build = require('pino-abstract-transport')
|
||
|
|
||
|
module.exports = function (opts) {
|
||
|
return build(function (source) {
|
||
|
source.on('data', function (obj) {
|
||
|
console.log(obj)
|
||
|
})
|
||
|
})
|
||
|
}
|
||
|
```
|
||
|
|
||
|
## Typescript usage
|
||
|
Install the type definitions for node. Make sure the major version of the type definitions matches the node version you are using.
|
||
|
#### Node 16
|
||
|
```
|
||
|
npm i -D @types/node@16
|
||
|
```
|
||
|
|
||
|
## API
|
||
|
|
||
|
### build(fn, opts) => Stream
|
||
|
|
||
|
Create a [`split2`](http://npm.im/split2) instance and returns it.
|
||
|
This same instance is also passed to the given function, which is called
|
||
|
synchronously.
|
||
|
|
||
|
If `opts.transform` is `true`, `pino-abstract-transform` will
|
||
|
wrap the split2 instance and the returned stream using [`duplexify`](https://www.npmjs.com/package/duplexify),
|
||
|
so they can be concatenated into multiple transports.
|
||
|
|
||
|
#### Events emitted
|
||
|
|
||
|
In addition to all events emitted by a [`Readable`](https://nodejs.org/api/stream.html#stream_class_stream_readable)
|
||
|
stream, it emits the following events:
|
||
|
|
||
|
* `unknown` where an unparsable line is found, both the line and optional error is emitted.
|
||
|
|
||
|
#### Options
|
||
|
|
||
|
* `parse` an option to change to data format passed to build function. When this option is set to `lines`,
|
||
|
the data is passed as a string, otherwise the data is passed as an object. Default: `undefined`.
|
||
|
|
||
|
* `close(err, cb)` a function that is called to shutdown the transport. It's called both on error and non-error shutdowns.
|
||
|
It can also return a promise. In this case discard the the `cb` argument.
|
||
|
|
||
|
* `parseLine(line)` a function that is used to parse line received from `pino`.
|
||
|
|
||
|
## Example
|
||
|
|
||
|
### custom parseLine
|
||
|
|
||
|
You can allow custom `parseLine` from users while providing a simple and safe default parseLine.
|
||
|
|
||
|
```js
|
||
|
'use strict'
|
||
|
|
||
|
const build = require('pino-abstract-transport')
|
||
|
|
||
|
function defaultParseLine (line) {
|
||
|
const obj = JSON.parse(line)
|
||
|
// property foo will be added on each line
|
||
|
obj.foo = 'bar'
|
||
|
return obj
|
||
|
}
|
||
|
|
||
|
module.exports = function (opts) {
|
||
|
const parseLine = typeof opts.parseLine === 'function' ? opts.parseLine : defaultParseLine
|
||
|
return build(function (source) {
|
||
|
source.on('data', function (obj) {
|
||
|
console.log(obj)
|
||
|
})
|
||
|
}, {
|
||
|
parseLine: parseLine
|
||
|
})
|
||
|
}
|
||
|
```
|
||
|
|
||
|
### Stream concatenation / pipeline
|
||
|
|
||
|
You can pipeline multiple transports:
|
||
|
|
||
|
```js
|
||
|
const build = require('pino-abstract-transport')
|
||
|
const { Transform, pipeline } = require('stream')
|
||
|
|
||
|
function buildTransform () {
|
||
|
return build(function (source) {
|
||
|
return new Transform({
|
||
|
objectMode: true,
|
||
|
autoDestroy: true,
|
||
|
transform (line, enc, cb) {
|
||
|
line.service = 'bob'
|
||
|
cb(null, JSON.stringify(line))
|
||
|
}
|
||
|
})
|
||
|
}, { enablePipelining: true })
|
||
|
}
|
||
|
|
||
|
function buildDestination () {
|
||
|
return build(function (source) {
|
||
|
source.on('data', function (obj) {
|
||
|
console.log(obj)
|
||
|
})
|
||
|
})
|
||
|
}
|
||
|
|
||
|
pipeline(process.stdin, buildTransform(), buildDestination(), function (err) {
|
||
|
console.log('pipeline completed!', err)
|
||
|
})
|
||
|
```
|
||
|
|
||
|
## License
|
||
|
|
||
|
MIT
|