UNPKG

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