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
						
					
					
				| # 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
 |