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.
		
		
		
		
		
			
		
			
				
					45 lines
				
				1.3 KiB
			
		
		
			
		
	
	
					45 lines
				
				1.3 KiB
			| 
											3 years ago
										 | 'use strict' | ||
|  | 
 | ||
|  | const { | ||
|  |   kReplyIsError, | ||
|  |   kReplySent, | ||
|  |   kReplySentOverwritten | ||
|  | } = require('./symbols') | ||
|  | 
 | ||
|  | const { FST_ERR_PROMISE_NOT_FULFILLED } = require('./errors') | ||
|  | 
 | ||
|  | function wrapThenable (thenable, reply) { | ||
|  |   thenable.then(function (payload) { | ||
|  |     if (reply[kReplySentOverwritten] === true) { | ||
|  |       return | ||
|  |     } | ||
|  | 
 | ||
|  |     // this is for async functions that
 | ||
|  |     // are using reply.send directly
 | ||
|  |     if (payload !== undefined || (reply.raw.statusCode === 204 && reply[kReplySent] === false)) { | ||
|  |       // we use a try-catch internally to avoid adding a catch to another
 | ||
|  |       // promise, increase promise perf by 10%
 | ||
|  |       try { | ||
|  |         reply.send(payload) | ||
|  |       } catch (err) { | ||
|  |         reply[kReplySent] = false | ||
|  |         reply[kReplyIsError] = true | ||
|  |         reply.send(err) | ||
|  |       } | ||
|  |     } else if (reply[kReplySent] === false) { | ||
|  |       reply.log.error({ err: new FST_ERR_PROMISE_NOT_FULFILLED() }, "Promise may not be fulfilled with 'undefined' when statusCode is not 204") | ||
|  |     } | ||
|  |   }, function (err) { | ||
|  |     if (reply[kReplySentOverwritten] === true || reply.sent === true) { | ||
|  |       reply.log.error({ err }, 'Promise errored, but reply.sent = true was set') | ||
|  |       return | ||
|  |     } | ||
|  | 
 | ||
|  |     reply[kReplySent] = false | ||
|  |     reply[kReplyIsError] = true | ||
|  |     reply.send(err) | ||
|  |   }) | ||
|  | } | ||
|  | 
 | ||
|  | module.exports = wrapThenable |