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