feat: remove bugsnag (#931)
This commit is contained in:
@@ -1,115 +0,0 @@
|
||||
import { isNullOrUndefined, SNLog } from '@standardnotes/snjs';
|
||||
import { getDesktopVersion, isDesktopApplication, isDev } from '@/utils';
|
||||
import { storage, StorageKey } from './localStorage';
|
||||
import Bugsnag from '@bugsnag/js';
|
||||
import { WebCrypto } from '../crypto';
|
||||
import { WebAppVersion } from '@/version';
|
||||
|
||||
function redactFilePath(line: string): string {
|
||||
const fileName = line.match(/\w+\.(html|js)/)?.[0];
|
||||
const redacted = '<redacted file path>';
|
||||
if (fileName) {
|
||||
return redacted + '/' + fileName;
|
||||
} else {
|
||||
return redacted;
|
||||
}
|
||||
}
|
||||
|
||||
export function startErrorReporting(): void {
|
||||
const disableErrorReporting = storage.get(StorageKey.DisableErrorReporting);
|
||||
if (
|
||||
/**
|
||||
* Error reporting used to be opt-out, but is now opt-in, so
|
||||
* treat the absence of an error reporting preference as an indication
|
||||
* to disable error reporting.
|
||||
*/
|
||||
isNullOrUndefined(disableErrorReporting) ||
|
||||
disableErrorReporting ||
|
||||
!window.bugsnagApiKey
|
||||
) {
|
||||
SNLog.onError = console.error;
|
||||
return;
|
||||
}
|
||||
try {
|
||||
const storedUserId = storage.get(StorageKey.AnonymousUserId);
|
||||
let anonymousUserId: string;
|
||||
if (storedUserId === null) {
|
||||
anonymousUserId = WebCrypto.generateUUID();
|
||||
storage.set(StorageKey.AnonymousUserId, anonymousUserId);
|
||||
} else {
|
||||
anonymousUserId = storedUserId;
|
||||
}
|
||||
|
||||
Bugsnag.start({
|
||||
apiKey: window.bugsnagApiKey,
|
||||
appType: isDesktopApplication() ? 'desktop' : 'web',
|
||||
appVersion: getDesktopVersion() || WebAppVersion,
|
||||
collectUserIp: false,
|
||||
autoTrackSessions: false,
|
||||
releaseStage: isDev ? 'development' : undefined,
|
||||
enabledBreadcrumbTypes: ['error', 'log'],
|
||||
onError(event) {
|
||||
event.setUser(anonymousUserId);
|
||||
|
||||
/**
|
||||
* Redact any data that could be used to identify user,
|
||||
* such as file paths.
|
||||
*/
|
||||
if (isDesktopApplication()) {
|
||||
if (event.context) {
|
||||
event.context = `Desktop/${redactFilePath(event.context)}`;
|
||||
}
|
||||
}
|
||||
|
||||
if (event.request.url?.includes('file:')) {
|
||||
event.request.url = redactFilePath(event.request.url);
|
||||
}
|
||||
|
||||
const originalStack = event.originalError.stack;
|
||||
if (
|
||||
typeof originalStack === 'string' &&
|
||||
originalStack.includes('file:')
|
||||
) {
|
||||
event.originalError.stack = originalStack
|
||||
.split('\n')
|
||||
.map((line) =>
|
||||
line.includes('file:') ? redactFilePath(line) : line
|
||||
)
|
||||
.join('\n');
|
||||
}
|
||||
|
||||
for (const error of event.errors) {
|
||||
for (const stackFrame of error.stacktrace) {
|
||||
if (stackFrame.file.includes('file:')) {
|
||||
stackFrame.file = redactFilePath(stackFrame.file);
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
});
|
||||
|
||||
if (isDev) {
|
||||
SNLog.onError = console.error;
|
||||
} else {
|
||||
SNLog.onError = (error) => {
|
||||
Bugsnag.notify(error);
|
||||
};
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('Failed to start Bugsnag.', error);
|
||||
SNLog.onError = console.error;
|
||||
}
|
||||
}
|
||||
|
||||
export function disableErrorReporting() {
|
||||
storage.remove(StorageKey.AnonymousUserId);
|
||||
storage.set(StorageKey.DisableErrorReporting, true);
|
||||
}
|
||||
|
||||
export function enableErrorReporting() {
|
||||
storage.set(StorageKey.DisableErrorReporting, false);
|
||||
}
|
||||
|
||||
export function errorReportingId() {
|
||||
return storage.get(StorageKey.AnonymousUserId);
|
||||
}
|
||||
@@ -1,16 +1,14 @@
|
||||
export enum StorageKey {
|
||||
DisableErrorReporting = 'DisableErrorReporting',
|
||||
AnonymousUserId = 'AnonymousUserId',
|
||||
ShowBetaWarning = 'ShowBetaWarning',
|
||||
ShowNoAccountWarning = 'ShowNoAccountWarning',
|
||||
}
|
||||
|
||||
export type StorageValue = {
|
||||
[StorageKey.DisableErrorReporting]: boolean;
|
||||
[StorageKey.AnonymousUserId]: string;
|
||||
[StorageKey.ShowBetaWarning]: boolean;
|
||||
[StorageKey.ShowNoAccountWarning]: boolean;
|
||||
}
|
||||
};
|
||||
|
||||
export const storage = {
|
||||
get<K extends StorageKey>(key: K): StorageValue[K] | null {
|
||||
|
||||
Reference in New Issue
Block a user