Home Identifier Source Repository

lib/Driver/RavenBrowserDriver.js

/**
 * Created by AlexanderC on 6/15/15.
 */

'use strict';

import {AbstractDriver} from './AbstractDriver';
import {Log} from '../Log';
import Raven from 'raven';
import url from 'url';

/**
 * Raven/Sentry logging for browser
 *
 * @todo replace it on compile time rather than runtime!
 */
export class RavenBrowserDriver extends AbstractDriver {
  /**
   * @param {String} dsn
   */
  constructor(dsn) {
    super();

    Raven.config(RavenBrowserDriver._prepareDsn(dsn)).install();
  }

  /**
   * @todo: tmp hook, remove it before persisting frontend config
   *
   * Remove password from url to not expose it into browser
   *
   * @param {String} dsn
   * @returns {String}
   */
  static _prepareDsn(dsn) {
    let parsedDsn = url.parse(dsn);
    parsedDsn.auth = parsedDsn.auth.split(':')[0];

    return url.format(parsedDsn);
  }

  /**
   * @param {String} msg
   * @param {String} level
   * @param {*} context
   */
  log(msg, level, context) {
    let nativeLevel = RavenBrowserDriver._mapLevel(level);

    Raven.captureMessage(msg, {
      level: nativeLevel,
      extra: context,
      tags: {
        originalLevel: level,
      },
    });
  }

  /**
   * @param {String} level
   * @returns {string}
   * @private
   */
  static _mapLevel(level) {
    let nativeLevel = 'info';

    switch (level) {
      case Log.EMERGENCY:
      case Log.CRITICAL:
        nativeLevel = 'fatal';
        break;
      case Log.ALERT:
      case Log.WARNING:
      case Log.NOTICE:
        nativeLevel = 'warning';
        break;
      case Log.ERROR:
        nativeLevel = 'error';
        break;
      case Log.INFO:
        nativeLevel = 'info';
        break;
      case Log.DEBUG:
        nativeLevel = 'debug';
        break;
    }

    return nativeLevel;
  }
}