summaryrefslogtreecommitdiffstats
path: root/excalidraw-app/sentry.ts
diff options
context:
space:
mode:
Diffstat (limited to 'excalidraw-app/sentry.ts')
-rw-r--r--excalidraw-app/sentry.ts81
1 files changed, 81 insertions, 0 deletions
diff --git a/excalidraw-app/sentry.ts b/excalidraw-app/sentry.ts
new file mode 100644
index 0000000..30b84f3
--- /dev/null
+++ b/excalidraw-app/sentry.ts
@@ -0,0 +1,81 @@
+import * as Sentry from "@sentry/browser";
+import callsites from "callsites";
+
+const SentryEnvHostnameMap: { [key: string]: string } = {
+ "excalidraw.com": "production",
+ "staging.excalidraw.com": "staging",
+ "vercel.app": "staging",
+};
+
+const SENTRY_DISABLED = import.meta.env.VITE_APP_DISABLE_SENTRY === "true";
+
+// Disable Sentry locally or inside the Docker to avoid noise/respect privacy
+const onlineEnv =
+ !SENTRY_DISABLED &&
+ Object.keys(SentryEnvHostnameMap).find(
+ (item) => window.location.hostname.indexOf(item) >= 0,
+ );
+
+Sentry.init({
+ dsn: onlineEnv
+ ? "https://7bfc596a5bf945eda6b660d3015a5460@sentry.io/5179260"
+ : undefined,
+ environment: onlineEnv ? SentryEnvHostnameMap[onlineEnv] : undefined,
+ release: import.meta.env.VITE_APP_GIT_SHA,
+ ignoreErrors: [
+ "undefined is not an object (evaluating 'window.__pad.performLoop')", // Only happens on Safari, but spams our servers. Doesn't break anything
+ "InvalidStateError: Failed to execute 'transaction' on 'IDBDatabase': The database connection is closing.", // Not much we can do about the IndexedDB closing error
+ /(Failed to fetch|(fetch|loading) dynamically imported module)/i, // This is happening when a service worker tries to load an old asset
+ /QuotaExceededError: (The quota has been exceeded|.*setItem.*Storage)/i, // localStorage quota exceeded
+ "Internal error opening backing store for indexedDB.open", // Private mode and disabled indexedDB
+ ],
+ integrations: [
+ Sentry.captureConsoleIntegration({
+ levels: ["error"],
+ }),
+ ],
+ beforeSend(event) {
+ if (event.request?.url) {
+ event.request.url = event.request.url.replace(/#.*$/, "");
+ }
+
+ if (!event.exception) {
+ event.exception = {
+ values: [
+ {
+ type: "ConsoleError",
+ value: event.message ?? "Unknown error",
+ stacktrace: {
+ frames: callsites()
+ .slice(1)
+ .filter(
+ (frame) =>
+ frame.getFileName() &&
+ !frame.getFileName()?.includes("@sentry_browser.js"),
+ )
+ .map((frame) => ({
+ filename: frame.getFileName() ?? undefined,
+ function: frame.getFunctionName() ?? undefined,
+ in_app: !(
+ frame.getFileName()?.includes("node_modules") ?? false
+ ),
+ lineno: frame.getLineNumber() ?? undefined,
+ colno: frame.getColumnNumber() ?? undefined,
+ })),
+ },
+ mechanism: {
+ type: "instrument",
+ handled: true,
+ data: {
+ function: "console.error",
+ handler: "Sentry.beforeSend",
+ },
+ },
+ },
+ ],
+ };
+ }
+
+ return event;
+ },
+});