diff --git a/excalidraw-app/package.json b/excalidraw-app/package.json index c5e1cdc5d0..bc95abd011 100644 --- a/excalidraw-app/package.json +++ b/excalidraw-app/package.json @@ -27,8 +27,8 @@ }, "dependencies": { "@excalidraw/random-username": "1.0.0", - "@sentry/browser": "6.2.5", - "@sentry/integrations": "6.2.5", + "@sentry/browser": "9.0.1", + "callsites": "4.2.0", "firebase": "8.3.3", "i18next-browser-languagedetector": "6.1.4", "idb-keyval": "6.0.3", diff --git a/excalidraw-app/sentry.ts b/excalidraw-app/sentry.ts index 26dbde3363..30b84f3f69 100644 --- a/excalidraw-app/sentry.ts +++ b/excalidraw-app/sentry.ts @@ -1,8 +1,9 @@ import * as Sentry from "@sentry/browser"; -import * as SentryIntegrations from "@sentry/integrations"; +import callsites from "callsites"; const SentryEnvHostnameMap: { [key: string]: string } = { "excalidraw.com": "production", + "staging.excalidraw.com": "staging", "vercel.app": "staging", }; @@ -24,11 +25,12 @@ Sentry.init({ 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 - /TypeError: Failed to fetch dynamically imported module: https:\/\/excalidraw\.com\/assets\/index\.esm.*/i, // This is happening when a service worker tries to load an old asset - /TypeError: error loading dynamically imported module: https:\/\/excalidraw\.com\/assets\/index\.esm.*/i, // This is happening when a service worker tries to load an old asset + /(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: [ - new SentryIntegrations.CaptureConsole({ + Sentry.captureConsoleIntegration({ levels: ["error"], }), ], @@ -36,6 +38,44 @@ Sentry.init({ 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; }, }); diff --git a/packages/excalidraw/data/restore.ts b/packages/excalidraw/data/restore.ts index 0c9811559a..550b88071a 100644 --- a/packages/excalidraw/data/restore.ts +++ b/packages/excalidraw/data/restore.ts @@ -219,9 +219,8 @@ const restoreElementWithProperties = < element.height > 1e6 ) { console.error( - `Restore element with properties size or position is too large ${JSON.stringify( - element, - )}`, + "Restore element with properties size or position is too large", + { element }, ); } @@ -251,11 +250,7 @@ const restoreElement = ( element.height < -1e6 || element.height > 1e6 ) { - console.error( - `Restore element size or position is too large ${JSON.stringify( - element, - )}`, - ); + console.error("Restore element size or position is too large", { element }); } switch (element.type) { diff --git a/packages/excalidraw/element/elbowArrow.ts b/packages/excalidraw/element/elbowArrow.ts index 4c5f577918..d3154cae91 100644 --- a/packages/excalidraw/element/elbowArrow.ts +++ b/packages/excalidraw/element/elbowArrow.ts @@ -910,9 +910,11 @@ export const updateElbowArrowPoints = ( arrow.y + (arrow?.points?.[arrow?.points?.length - 1]?.[1] ?? 0) > MAX_POS ) { console.error( - `Elbow arrow (or update) is outside reasonable bounds (> 1e6) arrow: ${JSON.stringify( + "Elbow arrow (or update) is outside reasonable bounds (> 1e6)", + { arrow, - )} updates: ${JSON.stringify(updates)}`, + updates, + }, ); } // @ts-ignore See above note @@ -2046,14 +2048,13 @@ const normalizeArrowElementUpdate = ( offsetY + points[points.length - 1][1] > MAX_POS ) { console.error( - `Elbow arrow normalization is outside reasonable bounds (> 1e6) arrow: ${JSON.stringify( - { - x: offsetX, - y: offsetY, - points, - ...getSizeFromPoints(points), - }, - )}`, + "Elbow arrow normalization is outside reasonable bounds (> 1e6)", + { + x: offsetX, + y: offsetY, + points, + ...getSizeFromPoints(points), + }, ); } diff --git a/packages/excalidraw/element/newElement.ts b/packages/excalidraw/element/newElement.ts index ab417356cf..464641288b 100644 --- a/packages/excalidraw/element/newElement.ts +++ b/packages/excalidraw/element/newElement.ts @@ -111,16 +111,14 @@ const _newElementBase = ( height < -1e6 || height > 1e6 ) { - console.error( - `New element size or position is too large ${JSON.stringify({ - x, - y, - width, - height, - // @ts-ignore - points: rest.points, - })}`, - ); + console.error("New element size or position is too large", { + x, + y, + width, + height, + // @ts-ignore + points: rest.points, + }); } // assign type to guard against excess properties diff --git a/packages/excalidraw/element/resizeElements.ts b/packages/excalidraw/element/resizeElements.ts index ee9c5b8720..63923c5d83 100644 --- a/packages/excalidraw/element/resizeElements.ts +++ b/packages/excalidraw/element/resizeElements.ts @@ -779,11 +779,13 @@ const getResizedOrigin = ( ) > 1e6 ) { console.error( - `getResizedOrigin() new calculation creates extremely large (> 1e6) y value where the old calculation resulted in ${ - y + - (newHeight - prevHeight) / 2 + - ((prevWidth - newWidth) / 2) * Math.sin(angle) - }`, + "getResizedOrigin() new calculation creates extremely large (> 1e6) y value where the old calculation resulted in", + { + result: + y + + (newHeight - prevHeight) / 2 + + ((prevWidth - newWidth) / 2) * Math.sin(angle), + }, ); } diff --git a/yarn.lock b/yarn.lock index a71ad5738d..7ccc3d9567 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2821,67 +2821,51 @@ resolved "https://registry.yarnpkg.com/@rushstack/eslint-patch/-/eslint-patch-1.10.3.tgz#391d528054f758f81e53210f1a1eebcf1a8b1d20" integrity sha512-qC/xYId4NMebE6w/V33Fh9gWxLgURiNYgVNObbJl2LZv0GUUItCcCqC5axQSwRaAgaxl2mELq1rMzlswaQ0Zxg== -"@sentry/browser@6.2.5": - version "6.2.5" - resolved "https://registry.yarnpkg.com/@sentry/browser/-/browser-6.2.5.tgz#35e259e16521d26f348a06b31eb495e0033111d6" - integrity sha512-nlvaE+D7oaj4MxoY9ikw+krQDOjftnDYJQnOwOraXPk7KYM6YwmkakLuE+x/AkaH3FQVTQF330VAa9d6SWETlA== +"@sentry-internal/browser-utils@9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@sentry-internal/browser-utils/-/browser-utils-9.0.1.tgz#c8edf0b0af7c4e7f1cca46cf5c523453c0de6568" + integrity sha512-/2karfYpQFtnkFrWxQgi/DuOf83OGhIdJcEmRDYDZKvj3mGHQ6n7fzIFD8fc0hPupBA/xi2kHVu7DX7scx5Fbw== dependencies: - "@sentry/core" "6.2.5" - "@sentry/types" "6.2.5" - "@sentry/utils" "6.2.5" - tslib "^1.9.3" + "@sentry/core" "9.0.1" -"@sentry/core@6.2.5": - version "6.2.5" - resolved "https://registry.yarnpkg.com/@sentry/core/-/core-6.2.5.tgz#e75093f8598becc0a4a0be927f32f7ac49e8588f" - integrity sha512-I+AkgIFO6sDUoHQticP6I27TT3L+i6TUS03in3IEtpBcSeP2jyhlxI8l/wdA7gsBqUPdQ4GHOOaNgtFIcr8qag== +"@sentry-internal/feedback@9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@sentry-internal/feedback/-/feedback-9.0.1.tgz#1403b09bb1790e90a3fdade7a0d4b55efacffa29" + integrity sha512-U43WMmhTXx9+wtXaJRnfoFfHz2Zv9fIEWDinYZQ03yGhjnAj3033Ca+mH+wMM0SQjF0KhGLG8Os4B/OGoQzB2g== dependencies: - "@sentry/hub" "6.2.5" - "@sentry/minimal" "6.2.5" - "@sentry/types" "6.2.5" - "@sentry/utils" "6.2.5" - tslib "^1.9.3" + "@sentry/core" "9.0.1" -"@sentry/hub@6.2.5": - version "6.2.5" - resolved "https://registry.yarnpkg.com/@sentry/hub/-/hub-6.2.5.tgz#324cae0c90d736cd1032e94104bf3f18becec4d6" - integrity sha512-YlEFdEhcfqpl2HC+/dWXBsBJEljyMzFS7LRRjCk8QANcOdp9PhwQjwebUB4/ulOBjHPP2WZk7fBBd/IKDasTUg== +"@sentry-internal/replay-canvas@9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@sentry-internal/replay-canvas/-/replay-canvas-9.0.1.tgz#c57a29b15550be98af856b040e741f252511ed99" + integrity sha512-7PBCkqNZQjbAunQmfSRkMKqviQ+jOqB/dy0nvL/T7EaahoD7VzVCGAbL29cLkPmpP3a9dzYk7ALrUqKLApwhRg== dependencies: - "@sentry/types" "6.2.5" - "@sentry/utils" "6.2.5" - tslib "^1.9.3" + "@sentry-internal/replay" "9.0.1" + "@sentry/core" "9.0.1" -"@sentry/integrations@6.2.5": - version "6.2.5" - resolved "https://registry.yarnpkg.com/@sentry/integrations/-/integrations-6.2.5.tgz#37cac11b486779707d62751da36aaaefbb44951a" - integrity sha512-4LOgO8lSeGaRV4w1Y03YWtTqrZdm56ciD7k0GLhv+PcFLpiu0exsS1XSs/9vET5LB5GtIgBTeJNNbxVFvvmv8g== +"@sentry-internal/replay@9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@sentry-internal/replay/-/replay-9.0.1.tgz#494f7a33fd78bceb31f6a205aac8c29a24663678" + integrity sha512-QzHClQWOgTEjOiBaCoQMytTSyZUKo/F2SYnzeWF30qNHtOKZSXEUugOeF3Ph0wc47NdH/4qPjYZgbNEYARf2qw== dependencies: - "@sentry/types" "6.2.5" - "@sentry/utils" "6.2.5" - localforage "^1.8.1" - tslib "^1.9.3" + "@sentry-internal/browser-utils" "9.0.1" + "@sentry/core" "9.0.1" -"@sentry/minimal@6.2.5": - version "6.2.5" - resolved "https://registry.yarnpkg.com/@sentry/minimal/-/minimal-6.2.5.tgz#3e963e868bfa68e97581403521fd4e09a8965b02" - integrity sha512-RKP4Qx3p7Cv0oX1cPKAkNVFYM7p2k1t32cNk1+rrVQS4hwlJ7Eg6m6fsqsO+85jd6Ne/FnyYsfo9cDD3ImTlWQ== +"@sentry/browser@9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@sentry/browser/-/browser-9.0.1.tgz#b6066a24c52550141d71afaeca2d39ea9e9349b9" + integrity sha512-alI1r1NyIARjzEm5493QuOPhiT2W1gelGDV30B1oL5cKo1arjqRLHp8Ny5odlTnyDTFC4EIx5Z69J+iyhW0CvQ== dependencies: - "@sentry/hub" "6.2.5" - "@sentry/types" "6.2.5" - tslib "^1.9.3" + "@sentry-internal/browser-utils" "9.0.1" + "@sentry-internal/feedback" "9.0.1" + "@sentry-internal/replay" "9.0.1" + "@sentry-internal/replay-canvas" "9.0.1" + "@sentry/core" "9.0.1" -"@sentry/types@6.2.5": - version "6.2.5" - resolved "https://registry.yarnpkg.com/@sentry/types/-/types-6.2.5.tgz#34b75285b149e0b9bc5fd54fcc2c445d978c7f2e" - integrity sha512-1Sux6CLYrV9bETMsGP/HuLFLouwKoX93CWzG8BjMueW+Di0OGxZphYjXrGuDs8xO8bAKEVGCHgVQdcB2jevS0w== - -"@sentry/utils@6.2.5": - version "6.2.5" - resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-6.2.5.tgz#be90d056b09ed1216097d7a29e3e81ba39238e1b" - integrity sha512-fJoLUZHrd5MPylV1dT4qL74yNFDl1Ur/dab+pKNSyvnHPnbZ/LRM7aJ8VaRY/A7ZdpRowU+E14e/Yeem2c6gtQ== - dependencies: - "@sentry/types" "6.2.5" - tslib "^1.9.3" +"@sentry/core@9.0.1": + version "9.0.1" + resolved "https://registry.yarnpkg.com/@sentry/core/-/core-9.0.1.tgz#da0207f7a4f74eb4af4ba26ad4244056968b3e41" + integrity sha512-RQ3B3NfF+BdmQz1c+vj4OBO+kxvxSsYMcmCDxSEZ7YrS/6Er1kMy0fwfxmdZJMdM1LlzXmO0XWF2g1IO9CzKyQ== "@sinclair/typebox@^0.27.8": version "0.27.8" @@ -4450,6 +4434,11 @@ call-bind@^1.0.2, call-bind@^1.0.5, call-bind@^1.0.6, call-bind@^1.0.7: get-intrinsic "^1.2.4" set-function-length "^1.2.1" +callsites@4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-4.2.0.tgz#98761d5be3ce092e4b9c92f7fb8c8eb9b83cadc8" + integrity sha512-kfzR4zzQtAE9PC7CzZsjl3aBNbXWuXiSeOCdLcPpBfGW8YuCqQHcRPFDbr/BPVmd3EEPVpuFzLyuT/cUhPr4OQ== + callsites@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" @@ -6863,11 +6852,6 @@ image-blob-reduce@3.0.1: dependencies: pica "^7.1.0" -immediate@~3.0.5: - version "3.0.6" - resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b" - integrity sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ== - immutable@^4.0.0: version "4.3.6" resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.3.6.tgz#6a05f7858213238e587fb83586ffa3b4b27f0447" @@ -7548,13 +7532,6 @@ levn@^0.4.1: prelude-ls "^1.2.1" type-check "~0.4.0" -lie@3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/lie/-/lie-3.1.1.tgz#9a436b2cc7746ca59de7a41fa469b3efb76bd87e" - integrity sha512-RiNhHysUjhrDQntfYSfY4MU24coXXdEOgw9WGcKHNeEwffDYbF//u87M1EWaMGzuFoSbqW0C9C6lEEhDOAswfw== - dependencies: - immediate "~3.0.5" - lilconfig@2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.0.4.tgz#f4507d043d7058b380b6a8f5cb7bcd4b34cee082" @@ -7618,13 +7595,6 @@ loader-utils@^2.0.0: emojis-list "^3.0.0" json5 "^2.1.2" -localforage@^1.8.1: - version "1.10.0" - resolved "https://registry.yarnpkg.com/localforage/-/localforage-1.10.0.tgz#5c465dc5f62b2807c3a84c0c6a1b1b3212781dd4" - integrity sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg== - dependencies: - lie "3.1.1" - locate-path@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" @@ -10055,7 +10025,7 @@ tsconfig-paths@^3.15.0: minimist "^1.2.6" strip-bom "^3.0.0" -tslib@^1.8.1, tslib@^1.9.3: +tslib@^1.8.1: version "1.14.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==