all files / firebase/modules/crash/ index.js

40% Statements 8/20
0% Branches 0/9
83.33% Functions 5/6
44.44% Lines 8/18
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87                                                                                                                                                             
/**
 * @flow
 * Crash Reporting representation wrapper
 */
import ModuleBase from '../../utils/ModuleBase';
import { getNativeModule } from '../../utils/native';
 
import type App from '../core/app';
import type { FirebaseError } from '../../types';
 
export const MODULE_NAME = 'RNFirebaseCrash';
export const NAMESPACE = 'crash';
 
export default class Crash extends ModuleBase {
  constructor(app: App) {
    super(app, {
      moduleName: MODULE_NAME,
      multiApp: false,
      namespace: NAMESPACE,
    });
  }
 
  /**
   * Enables/Disables crash reporting
   * @param enabled
   */
  setCrashCollectionEnabled(enabled: boolean): void {
    getNativeModule(this).setCrashCollectionEnabled(enabled);
  }
 
  /**
   * Returns whether or not crash reporting is currently enabled
   * @returns {Promise.<boolean>}
   */
  isCrashCollectionEnabled(): Promise<boolean> {
    return getNativeModule(this).isCrashCollectionEnabled();
  }
 
  /**
   * Logs a message that will appear in a subsequent crash report.
   * @param {string} message
   */
  log(message: string): void {
    getNativeModule(this).log(message);
  }
 
  /**
   * Logs a message that will appear in a subsequent crash report as well as in logcat.
   * NOTE: Android only functionality. iOS will just log the message.
   * @param {string} message
   * @param {number} level
   * @param {string} tag
   */
  logcat(level: number, tag: string, message: string): void {
    getNativeModule(this).logcat(level, tag, message);
  }
 
  /**
   * Generates a crash report for the given message. This method should be used for unexpected
   * exceptions where recovery is not possible.
   * NOTE: on iOS, this will cause the app to crash as it's the only way to ensure the exception
   * gets sent to Firebase.  Otherwise it just gets lost as a log message.
   * @param {Error} error
   * @param maxStackSize
   */
  report(error: FirebaseError, maxStackSize: number = 10): void {
    if (!error || !error.message) return;
 
    let errorMessage = `Message: ${error.message}\r\n`;
 
    if (error.code) {
      errorMessage = `${errorMessage}Code: ${error.code}\r\n`;
    }
 
    const stackRows = error.stack.split('\n');
    errorMessage = `${errorMessage}\r\nStack: \r\n`;
    for (let i = 0, len = stackRows.length; i < len; i++) {
      if (i === maxStackSize) break;
      errorMessage = `${errorMessage}  -  ${stackRows[i]}\r\n`;
    }
 
    getNativeModule(this).report(errorMessage);
  }
}
 
export const statics = {};