UNPKG

1.26 kBJavaScriptView Raw
1'use strict'
2
3const {
4 kReplyIsError,
5 kReplySent,
6 kReplySentOverwritten
7} = require('./symbols')
8
9const { FST_ERR_PROMISE_NOT_FULLFILLED } = require('./errors')
10
11function wrapThenable (thenable, reply) {
12 thenable.then(function (payload) {
13 if (reply[kReplySentOverwritten] === true) {
14 return
15 }
16
17 // this is for async functions that
18 // are using reply.send directly
19 if (payload !== undefined || (reply.raw.statusCode === 204 && reply[kReplySent] === false)) {
20 // we use a try-catch internally to avoid adding a catch to another
21 // promise, increase promise perf by 10%
22 try {
23 reply.send(payload)
24 } catch (err) {
25 reply[kReplySent] = false
26 reply[kReplyIsError] = true
27 reply.send(err)
28 }
29 } else if (reply[kReplySent] === false) {
30 reply.log.error({ err: new FST_ERR_PROMISE_NOT_FULLFILLED() }, "Promise may not be fulfilled with 'undefined' when statusCode is not 204")
31 }
32 }, function (err) {
33 if (reply[kReplySentOverwritten] === true) {
34 reply.log.error({ err }, 'Promise errored, but reply.sent = true was set')
35 return
36 }
37 reply[kReplySent] = false
38 reply[kReplyIsError] = true
39 reply.send(err)
40 })
41}
42
43module.exports = wrapThenable