diff --git a/.env b/.env index a0208b87..66b9df27 100644 --- a/.env +++ b/.env @@ -5,4 +5,4 @@ VITE_PLATFORM_LOGO=static/flotilla.png VITE_PLATFORM_RELAY= VITE_PLATFORM_ACCENT="#7161FF" VITE_PLATFORM_DESCRIPTION="Flotilla is nostr — for communities." -VITE_BUGSNAG_API_KEY= +VITE_SENTRY_DSN= diff --git a/package-lock.json b/package-lock.json index 64a90ab8..f73f4c51 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,10 +8,10 @@ "name": "flotilla", "version": "0.0.1", "dependencies": { - "@bugsnag/js": "^8.1.2", "@noble/curves": "^1.5.0", "@noble/hashes": "^1.4.0", "@poppanator/sveltekit-svg": "^4.2.1", + "@sentry/browser": "^8.35.0", "@sveltejs/adapter-static": "^3.0.4", "@tiptap/extension-code": "^2.6.6", "@tiptap/extension-code-block": "^2.6.6", @@ -1788,64 +1788,6 @@ "resolved": "https://registry.npmjs.org/@braintree/sanitize-url/-/sanitize-url-7.1.0.tgz", "integrity": "sha512-o+UlMLt49RvtCASlOMW0AkHnabN9wR9rwCCherxO0yG4Npy34GkvrAqdXQvrhNs+jh+gkK8gB8Lf05qL/O7KWg==" }, - "node_modules/@bugsnag/browser": { - "version": "8.1.2", - "resolved": "https://registry.npmjs.org/@bugsnag/browser/-/browser-8.1.2.tgz", - "integrity": "sha512-COP3OanbGCOS/K4g0rGwSYk2/RcIooG2PqxqdrF0MDY4u3Nz44iOaJg8w7WlOr8CckmDEiwSW2DVR+M7qZcoQw==", - "license": "MIT", - "dependencies": { - "@bugsnag/core": "^8.1.1" - } - }, - "node_modules/@bugsnag/core": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/@bugsnag/core/-/core-8.1.1.tgz", - "integrity": "sha512-ytOWqwm4H2h8rADqYPR+tQpDHsBav3NEZ5E2VSCCxPbT2R89Q0/t0PZTbQVlOS+TRutajO29VxTV9qsAREfpSw==", - "license": "MIT", - "dependencies": { - "@bugsnag/cuid": "^3.0.0", - "@bugsnag/safe-json-stringify": "^6.0.0", - "error-stack-parser": "^2.0.3", - "iserror": "^0.0.2", - "stack-generator": "^2.0.3" - } - }, - "node_modules/@bugsnag/cuid": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@bugsnag/cuid/-/cuid-3.1.1.tgz", - "integrity": "sha512-d2z4b0rEo3chI07FNN1Xds8v25CNeekecU6FC/2Fs9MxY2EipkZTThVcV2YinMn8dvRUlViKOyC50evoUxg8tw==", - "license": "MIT" - }, - "node_modules/@bugsnag/js": { - "version": "8.1.2", - "resolved": "https://registry.npmjs.org/@bugsnag/js/-/js-8.1.2.tgz", - "integrity": "sha512-vMl/TlMTpm0Xv4IKqYpmsjeVE4nPWAZL8uOxOi0JI6dgTaWE8+VQF6KuSpeKiA7Pr34uUxpWhSBrkZ3uSwCBdg==", - "license": "MIT", - "dependencies": { - "@bugsnag/browser": "^8.1.2", - "@bugsnag/node": "^8.1.1" - } - }, - "node_modules/@bugsnag/node": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/@bugsnag/node/-/node-8.1.1.tgz", - "integrity": "sha512-Ckdgj4tQto3CH4wWo12BAG0lQuS9s5SUpZvwmYF3meW5Qxq7D8XHZzrfGQo9nb1VTvmwOB+uyMt8En6Cy86Jcg==", - "license": "MIT", - "dependencies": { - "@bugsnag/core": "^8.1.1", - "byline": "^5.0.0", - "error-stack-parser": "^2.0.3", - "iserror": "^0.0.2", - "pump": "^3.0.0", - "stack-generator": "^2.0.3" - } - }, - "node_modules/@bugsnag/safe-json-stringify": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@bugsnag/safe-json-stringify/-/safe-json-stringify-6.0.0.tgz", - "integrity": "sha512-htzFO1Zc57S8kgdRK9mLcPVTW1BY2ijfH7Dk2CeZmspTWKdKqSo1iwmqrq2WtRjFlo8aRZYgLX0wFrDXF/9DLA==", - "license": "MIT" - }, "node_modules/@canvas/image-data": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@canvas/image-data/-/image-data-1.0.0.tgz", @@ -2885,6 +2827,116 @@ "url": "https://paulmillr.com/funding/" } }, + "node_modules/@sentry-internal/browser-utils": { + "version": "8.35.0", + "resolved": "https://registry.npmjs.org/@sentry-internal/browser-utils/-/browser-utils-8.35.0.tgz", + "integrity": "sha512-uj9nwERm7HIS13f/Q52hF/NUS5Al8Ma6jkgpfYGeppYvU0uSjPkwMogtqoJQNbOoZg973tV8qUScbcWY616wNA==", + "license": "MIT", + "dependencies": { + "@sentry/core": "8.35.0", + "@sentry/types": "8.35.0", + "@sentry/utils": "8.35.0" + }, + "engines": { + "node": ">=14.18" + } + }, + "node_modules/@sentry-internal/feedback": { + "version": "8.35.0", + "resolved": "https://registry.npmjs.org/@sentry-internal/feedback/-/feedback-8.35.0.tgz", + "integrity": "sha512-7bjSaUhL0bDArozre6EiIhhdWdT/1AWNWBC1Wc5w1IxEi5xF7nvF/FfvjQYrONQzZAI3HRxc45J2qhLUzHBmoQ==", + "license": "MIT", + "dependencies": { + "@sentry/core": "8.35.0", + "@sentry/types": "8.35.0", + "@sentry/utils": "8.35.0" + }, + "engines": { + "node": ">=14.18" + } + }, + "node_modules/@sentry-internal/replay": { + "version": "8.35.0", + "resolved": "https://registry.npmjs.org/@sentry-internal/replay/-/replay-8.35.0.tgz", + "integrity": "sha512-3wkW03vXYMyWtTLxl9yrtkV+qxbnKFgfASdoGWhXzfLjycgT6o4/04eb3Gn71q9aXqRwH17ISVQbVswnRqMcmA==", + "license": "MIT", + "dependencies": { + "@sentry-internal/browser-utils": "8.35.0", + "@sentry/core": "8.35.0", + "@sentry/types": "8.35.0", + "@sentry/utils": "8.35.0" + }, + "engines": { + "node": ">=14.18" + } + }, + "node_modules/@sentry-internal/replay-canvas": { + "version": "8.35.0", + "resolved": "https://registry.npmjs.org/@sentry-internal/replay-canvas/-/replay-canvas-8.35.0.tgz", + "integrity": "sha512-TUrH6Piv19kvHIiRyIuapLdnuwxk/Un/l1WDCQfq7mK9p1Pac0FkQ7Uufjp6zY3lyhDDZQ8qvCS4ioCMibCwQg==", + "license": "MIT", + "dependencies": { + "@sentry-internal/replay": "8.35.0", + "@sentry/core": "8.35.0", + "@sentry/types": "8.35.0", + "@sentry/utils": "8.35.0" + }, + "engines": { + "node": ">=14.18" + } + }, + "node_modules/@sentry/browser": { + "version": "8.35.0", + "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-8.35.0.tgz", + "integrity": "sha512-WHfI+NoZzpCsmIvtr6ChOe7yWPLQyMchPnVhY3Z4UeC70bkYNdKcoj/4XZbX3m0D8+71JAsm0mJ9s9OC3Ue6MQ==", + "license": "MIT", + "dependencies": { + "@sentry-internal/browser-utils": "8.35.0", + "@sentry-internal/feedback": "8.35.0", + "@sentry-internal/replay": "8.35.0", + "@sentry-internal/replay-canvas": "8.35.0", + "@sentry/core": "8.35.0", + "@sentry/types": "8.35.0", + "@sentry/utils": "8.35.0" + }, + "engines": { + "node": ">=14.18" + } + }, + "node_modules/@sentry/core": { + "version": "8.35.0", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-8.35.0.tgz", + "integrity": "sha512-Ci0Nmtw5ETWLqQJGY4dyF+iWh7PWKy6k303fCEoEmqj2czDrKJCp7yHBNV0XYbo00prj2ZTbCr6I7albYiyONA==", + "license": "MIT", + "dependencies": { + "@sentry/types": "8.35.0", + "@sentry/utils": "8.35.0" + }, + "engines": { + "node": ">=14.18" + } + }, + "node_modules/@sentry/types": { + "version": "8.35.0", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-8.35.0.tgz", + "integrity": "sha512-AVEZjb16MlYPifiDDvJ19dPQyDn0jlrtC1PHs6ZKO+Rzyz+2EX2BRdszvanqArldexPoU1p5Bn2w81XZNXThBA==", + "license": "MIT", + "engines": { + "node": ">=14.18" + } + }, + "node_modules/@sentry/utils": { + "version": "8.35.0", + "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-8.35.0.tgz", + "integrity": "sha512-MdMb6+uXjqND7qIPWhulubpSeHzia6HtxeJa8jYI09OCvIcmNGPydv/Gx/LZBwosfMHrLdTWcFH7Y7aCxrq7cg==", + "license": "MIT", + "dependencies": { + "@sentry/types": "8.35.0" + }, + "engines": { + "node": ">=14.18" + } + }, "node_modules/@surma/rollup-plugin-off-main-thread": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-2.2.3.tgz", @@ -4154,15 +4206,6 @@ "license": "MIT", "peer": true }, - "node_modules/byline": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/byline/-/byline-5.0.0.tgz", - "integrity": "sha512-s6webAy+R4SR8XVuJWt2V2rGvhnrhxN+9S15GNuTK3wKPOXFF6RNc+8ug2XhH+2s4f+uudG4kUVYmYOQWL2g0Q==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/cac": { "version": "6.7.14", "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", @@ -4927,15 +4970,6 @@ "url": "https://github.com/fb55/entities?sponsor=1" } }, - "node_modules/error-stack-parser": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz", - "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==", - "license": "MIT", - "dependencies": { - "stackframe": "^1.3.4" - } - }, "node_modules/es-abstract": { "version": "1.23.3", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", @@ -6364,12 +6398,6 @@ "license": "MIT", "peer": true }, - "node_modules/iserror": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/iserror/-/iserror-0.0.2.tgz", - "integrity": "sha512-oKGGrFVaWwETimP3SiWwjDeY27ovZoyZPHtxblC4hCq9fXxed/jasx+ATWFFjCVSRZng8VTMsN1nDnGo6zMBSw==", - "license": "MIT" - }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -8530,21 +8558,6 @@ "license": "MIT", "peer": true }, - "node_modules/stack-generator": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/stack-generator/-/stack-generator-2.0.10.tgz", - "integrity": "sha512-mwnua/hkqM6pF4k8SnmZ2zfETsRUpWXREfA/goT8SLCV4iOFa4bzOX2nDipWAZFPTjLvQB82f5yaodMVhK0yJQ==", - "license": "MIT", - "dependencies": { - "stackframe": "^1.3.4" - } - }, - "node_modules/stackframe": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz", - "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==", - "license": "MIT" - }, "node_modules/streamx": { "version": "2.20.1", "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.20.1.tgz", diff --git a/package.json b/package.json index 46d9ef90..78027df5 100644 --- a/package.json +++ b/package.json @@ -32,10 +32,10 @@ }, "type": "module", "dependencies": { - "@bugsnag/js": "^8.1.2", "@noble/curves": "^1.5.0", "@noble/hashes": "^1.4.0", "@poppanator/sveltekit-svg": "^4.2.1", + "@sentry/browser": "^8.35.0", "@sveltejs/adapter-static": "^3.0.4", "@tiptap/extension-code": "^2.6.6", "@tiptap/extension-code-block": "^2.6.6", diff --git a/src/app/tracking.ts b/src/app/tracking.ts index dfd829a8..f8772fc5 100644 --- a/src/app/tracking.ts +++ b/src/app/tracking.ts @@ -1,32 +1,13 @@ -import Bugsnag from "@bugsnag/js" +import * as Sentry from "@sentry/browser" export const setupTracking = () => { - if (!import.meta.env.VITE_BUGSNAG_API_KEY) return - - // Initialize - Bugsnag.start({ - apiKey: import.meta.env.VITE_BUGSNAG_API_KEY, - collectUserIp: false, - }) - - // Redact long strings, especially hex and bech32 keys which are 64 and 63 - // characters long, respectively. Put the threshold a little lower in case - // someone accidentally enters a key with the last few digits missing - const redactErrorInfo = (info: any) => - JSON.parse( - JSON.stringify(info || null) - .replace(/\d+:{60}\w+:\w+/g, "[REDACTED]") - .replace(/\w{60}\w+/g, "[REDACTED]"), - ) - - Bugsnag.addOnError((event: any) => { - // Redact individual properties since the event needs to be - // mutated, and we don't want to lose the prototype - event.context = redactErrorInfo(event.context) - event.request = redactErrorInfo(event.request) - event.exceptions = redactErrorInfo(event.exceptions) - event.breadcrumbs = redactErrorInfo(event.breadcrumbs) - - return true - }) + if (import.meta.env.VITE_SENTRY_DSN) { + Sentry.init({ + dsn: import.meta.env.VITE_SENTRY_DSN, + tracesSampleRate: 0.01, + integrations(integrations) { + return integrations.filter(integration => integration.name !== 'Breadcrumbs') + }, + }) + } }