@sentry/react-native
Version:
Official Sentry SDK for react-native
72 lines • 2.62 kB
JavaScript
import { debug } from '@sentry/core';
import { NativeEventEmitter, NativeModules, Platform } from 'react-native';
import { isExpoGo } from './utils/environment';
const NATIVE_LOG_EVENT_NAME = 'SentryNativeLog';
/**
* Sets up the native log listener that forwards logs from the native SDK to JS.
* This only works when `debug: true` is set in Sentry options.
*
* @param callback - The callback to invoke when a native log is received.
* @returns A function to remove the listener, or undefined if setup failed.
*/
export function setupNativeLogListener(callback) {
if (Platform.OS !== 'ios' && Platform.OS !== 'android') {
debug.log('Native log listener is only supported on iOS and Android.');
return undefined;
}
if (isExpoGo()) {
return undefined;
}
if (!NativeModules.RNSentry) {
debug.warn('Could not set up native log listener: RNSentry module not found.');
return undefined;
}
try {
const eventEmitter = new NativeEventEmitter(NativeModules.RNSentry);
const listener = eventEmitter.addListener(NATIVE_LOG_EVENT_NAME, (event) => {
var _a, _b, _c;
const logEntry = {
level: (_a = event.level) !== null && _a !== void 0 ? _a : 'info',
component: (_b = event.component) !== null && _b !== void 0 ? _b : 'Sentry',
message: (_c = event.message) !== null && _c !== void 0 ? _c : '',
};
callback(logEntry);
});
debug.log('Native log listener set up successfully.');
let removed = false;
return () => {
if (!removed) {
listener.remove();
removed = true;
debug.log('Native log listener removed.');
}
};
}
catch (error) {
debug.warn('Failed to set up native log listener:', error);
return undefined;
}
}
/**
* Default handler for native logs that uses Sentry's debug logger.
* This avoids interference with captureConsoleIntegration which would
* otherwise capture these logs as breadcrumbs or events.
*/
export function defaultNativeLogHandler(log) {
const message = `[Native] [${log.component}] ${log.message}`;
switch (log.level.toLowerCase()) {
case 'fatal':
case 'error':
debug.error(message);
break;
case 'warning':
debug.warn(message);
break;
case 'info':
case 'debug':
default:
debug.log(message);
break;
}
}
//# sourceMappingURL=NativeLogListener.js.map