code: function report(error, additionalTags, extra) {
      let sentTags = tags ? [].concat(tags) : [];
  
      if (additionalTags) {
          sentTags = sentTags.concat(additionalTags);
      }
  
      return Promise.resolve(sentTags).then(function(t) {
          // Need this wrapping so that our internal implementation can safely throw errors
          return new Promise(function(resolve) {
              const sentError = error.nativeError ? error.nativeError : error;
  
              Raygun.send(sentError, _.merge(extra || {}, error.extra), function(res) {
                  // No response === stubbed Raygun
                  if (res) {
                      if (res.statusCode !== 202) {
                          console.log('Failed to report error to Raygun', res); //eslint-disable-line no-console
                      } else {
                          console.log('Reported error to Raygun', error); //eslint-disable-line no-console
                      }
                  }
  
                  // Resolve with the error, so that our caller can finish deal
                  // with it further
                  resolve(error);
              }, error.request, t);
          });
      }).catch(function(err) {
          // Return the same error that we were supposed to report
          // and simply log out the error that actually occurred during reporting
          console.error(err); //eslint-disable-line no-console
          return error;
      });
  }
docs: Report an error, with optional additional tags
  
  @param error - error to report
  @param additionalTags - optional additional tags to report, along with the
  default set of tags set on the module
  @param extra - optional extra metadata to include in the error report
  @returns promise which resolves into the passed in error