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.
		
		
		
		
		
			
		
			
				
					69 lines
				
				1.4 KiB
			
		
		
			
		
	
	
					69 lines
				
				1.4 KiB
			| 
								 
											3 years ago
										 
									 | 
							
								'use strict'
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								module.exports = errSerializer
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								const { toString } = Object.prototype
							 | 
						||
| 
								 | 
							
								const seen = Symbol('circular-ref-tag')
							 | 
						||
| 
								 | 
							
								const rawSymbol = Symbol('pino-raw-err-ref')
							 | 
						||
| 
								 | 
							
								const pinoErrProto = Object.create({}, {
							 | 
						||
| 
								 | 
							
								  type: {
							 | 
						||
| 
								 | 
							
								    enumerable: true,
							 | 
						||
| 
								 | 
							
								    writable: true,
							 | 
						||
| 
								 | 
							
								    value: undefined
							 | 
						||
| 
								 | 
							
								  },
							 | 
						||
| 
								 | 
							
								  message: {
							 | 
						||
| 
								 | 
							
								    enumerable: true,
							 | 
						||
| 
								 | 
							
								    writable: true,
							 | 
						||
| 
								 | 
							
								    value: undefined
							 | 
						||
| 
								 | 
							
								  },
							 | 
						||
| 
								 | 
							
								  stack: {
							 | 
						||
| 
								 | 
							
								    enumerable: true,
							 | 
						||
| 
								 | 
							
								    writable: true,
							 | 
						||
| 
								 | 
							
								    value: undefined
							 | 
						||
| 
								 | 
							
								  },
							 | 
						||
| 
								 | 
							
								  raw: {
							 | 
						||
| 
								 | 
							
								    enumerable: false,
							 | 
						||
| 
								 | 
							
								    get: function () {
							 | 
						||
| 
								 | 
							
								      return this[rawSymbol]
							 | 
						||
| 
								 | 
							
								    },
							 | 
						||
| 
								 | 
							
								    set: function (val) {
							 | 
						||
| 
								 | 
							
								      this[rawSymbol] = val
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								})
							 | 
						||
| 
								 | 
							
								Object.defineProperty(pinoErrProto, rawSymbol, {
							 | 
						||
| 
								 | 
							
								  writable: true,
							 | 
						||
| 
								 | 
							
								  value: {}
							 | 
						||
| 
								 | 
							
								})
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function errSerializer (err) {
							 | 
						||
| 
								 | 
							
								  if (!(err instanceof Error)) {
							 | 
						||
| 
								 | 
							
								    return err
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  err[seen] = undefined // tag to prevent re-looking at this
							 | 
						||
| 
								 | 
							
								  const _err = Object.create(pinoErrProto)
							 | 
						||
| 
								 | 
							
								  _err.type = toString.call(err.constructor) === '[object Function]'
							 | 
						||
| 
								 | 
							
								    ? err.constructor.name
							 | 
						||
| 
								 | 
							
								    : err.name
							 | 
						||
| 
								 | 
							
								  _err.message = err.message
							 | 
						||
| 
								 | 
							
								  _err.stack = err.stack
							 | 
						||
| 
								 | 
							
								  for (const key in err) {
							 | 
						||
| 
								 | 
							
								    if (_err[key] === undefined) {
							 | 
						||
| 
								 | 
							
								      const val = err[key]
							 | 
						||
| 
								 | 
							
								      if (val instanceof Error) {
							 | 
						||
| 
								 | 
							
								        /* eslint-disable no-prototype-builtins */
							 | 
						||
| 
								 | 
							
								        if (!val.hasOwnProperty(seen)) {
							 | 
						||
| 
								 | 
							
								          _err[key] = errSerializer(val)
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								      } else {
							 | 
						||
| 
								 | 
							
								        _err[key] = val
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  delete err[seen] // clean up tag in case err is serialized again later
							 | 
						||
| 
								 | 
							
								  _err.raw = err
							 | 
						||
| 
								 | 
							
								  return _err
							 | 
						||
| 
								 | 
							
								}
							 |