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; 
 | 
  } 
 | 
} 
 |