UNPKG

2.1 kBPlain TextView Raw
1import { LogFn } from 'pino'
2import defaultLogger from './logger'
3
4export default function catchErrors(
5 closeHandlers: Array<() => Promise<any>> = [],
6 {
7 exitOnUncaughtPromiseException = true,
8 logger = defaultLogger.fatal.bind(defaultLogger) as LogFn,
9 timeout = 30,
10 }: {
11 exitOnUncaughtPromiseException?: boolean
12 logger?: LogFn
13 timeout?: number
14 } = {}
15) {
16 // it is not safe to resume normal operation after 'uncaughtException'.
17 // read more: https://nodejs.org/api/process.html#process_event_uncaughtexception
18 const uncaughtExceptionHandler = async (err: Error) => {
19 logger(err, 'uncaught exception')
20
21 // shut down anyway after `timeout` seconds
22 if (timeout) {
23 setTimeout(() => {
24 logger('could not finish in time, forcefully exiting')
25 process.exit(1)
26 }, timeout * 1000).unref()
27 }
28
29 for (const handler of closeHandlers) {
30 try {
31 await Promise.resolve(handler())
32 } catch (err) {
33 logger(err, 'failed to close resource')
34 }
35 }
36
37 process.exit(1)
38 }
39 process.on('uncaughtException', uncaughtExceptionHandler)
40
41 // a Promise is rejected and no error handler is attached.
42 // read more: https://nodejs.org/api/process.html#process_event_unhandledrejection
43 const unhandledRejectionHandler = async (reason: any = {}, promise: Promise<any>) => {
44 logger(reason, 'unhandled promise rejection')
45
46 // shut down anyway after `timeout` seconds
47 if (timeout) {
48 setTimeout(() => {
49 logger('could not finish in time, forcefully exiting')
50 process.exit(1)
51 }, timeout * 1000).unref()
52 }
53
54 for (const handler of closeHandlers) {
55 try {
56 await Promise.resolve(handler())
57 } catch (err) {
58 logger(err, 'failed to close resource')
59 }
60 }
61
62 if (exitOnUncaughtPromiseException) {
63 process.exit(1)
64 }
65 }
66 process.on('unhandledRejection', unhandledRejectionHandler)
67
68 return () => {
69 process.off('uncaughtException', uncaughtExceptionHandler)
70 process.off('unhandledRejection', unhandledRejectionHandler)
71 }
72}