import { config } from '../config'; | |
let context: { errorThrown: boolean; error: any } | null = null; | |
/** | |
* Handles dealing with errors for super-gross mode. Creates a context, in which | |
* any synchronously thrown errors will be passed to {@link captureError}. Which | |
* will record the error such that it will be rethrown after the call back is complete. | |
* TODO: Remove in v8 | |
* @param cb An immediately executed function. | |
*/ | |
export function errorContext(cb: () => void) { | |
if (config.useDeprecatedSynchronousErrorHandling) { | |
const isRoot = !context; | |
if (isRoot) { | |
context = { errorThrown: false, error: null }; | |
} | |
cb(); | |
if (isRoot) { | |
const { errorThrown, error } = context!; | |
context = null; | |
if (errorThrown) { | |
throw error; | |
} | |
} | |
} else { | |
// This is the general non-deprecated path for everyone that | |
// isn't crazy enough to use super-gross mode (useDeprecatedSynchronousErrorHandling) | |
cb(); | |
} | |
} | |
/** | |
* Captures errors only in super-gross mode. | |
* @param err the error to capture | |
*/ | |
export function captureError(err: any) { | |
if (config.useDeprecatedSynchronousErrorHandling && context) { | |
context.errorThrown = true; | |
context.error = err; | |
} | |
} | |