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.
		
		
		
		
		
			
		
			
				
					
					
						
							79 lines
						
					
					
						
							1.7 KiB
						
					
					
				
			
		
		
	
	
							79 lines
						
					
					
						
							1.7 KiB
						
					
					
				| 'use strict'
 | |
| 
 | |
| const metadata = Symbol.for('pino.metadata')
 | |
| const split = require('split2')
 | |
| const { Duplex } = require('readable-stream')
 | |
| 
 | |
| module.exports = function build (fn, opts = {}) {
 | |
|   const parseLines = opts.parse === 'lines'
 | |
|   const parseLine = typeof opts.parseLine === 'function' ? opts.parseLine : JSON.parse
 | |
|   const close = opts.close || defaultClose
 | |
|   const stream = split(function (line) {
 | |
|     let value
 | |
| 
 | |
|     try {
 | |
|       value = parseLine(line)
 | |
|     } catch (error) {
 | |
|       this.emit('unknown', line, error)
 | |
|       return
 | |
|     }
 | |
| 
 | |
|     if (value === null) {
 | |
|       this.emit('unknown', line, 'Null value ignored')
 | |
|       return
 | |
|     }
 | |
| 
 | |
|     if (typeof value !== 'object') {
 | |
|       value = {
 | |
|         data: value,
 | |
|         time: Date.now()
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     if (stream[metadata]) {
 | |
|       stream.lastTime = value.time
 | |
|       stream.lastLevel = value.level
 | |
|       stream.lastObj = value
 | |
|     }
 | |
| 
 | |
|     if (parseLines) {
 | |
|       return line
 | |
|     }
 | |
| 
 | |
|     return value
 | |
|   }, { autoDestroy: true })
 | |
| 
 | |
|   stream._destroy = function (err, cb) {
 | |
|     const promise = close(err, cb)
 | |
|     if (promise && typeof promise.then === 'function') {
 | |
|       promise.then(cb, cb)
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   if (opts.metadata !== false) {
 | |
|     stream[metadata] = true
 | |
|     stream.lastTime = 0
 | |
|     stream.lastLevel = 0
 | |
|     stream.lastObj = null
 | |
|   }
 | |
| 
 | |
|   let res = fn(stream)
 | |
| 
 | |
|   if (res && typeof res.catch === 'function') {
 | |
|     res.catch((err) => {
 | |
|       stream.destroy(err)
 | |
|     })
 | |
| 
 | |
|     // set it to null to not retain a reference to the promise
 | |
|     res = null
 | |
|   } else if (opts.enablePipelining && res) {
 | |
|     return Duplex.from({ writable: stream, readable: res, objectMode: true })
 | |
|   }
 | |
| 
 | |
|   return stream
 | |
| }
 | |
| 
 | |
| function defaultClose (err, cb) {
 | |
|   process.nextTick(cb, err)
 | |
| }
 |