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)
 | 
						|
}
 |