diff --git a/web/packages/shared/utils/assertUnreachable.ts b/web/packages/shared/utils/assertUnreachable.ts index 1be4fd45a6e19..18bd8e6e62415 100644 --- a/web/packages/shared/utils/assertUnreachable.ts +++ b/web/packages/shared/utils/assertUnreachable.ts @@ -17,5 +17,11 @@ */ export function assertUnreachable(x: never): never { - throw new Error(`Unhandled case: ${x}`); + throw new UnhandledCaseError(x); +} + +export class UnhandledCaseError extends Error { + constructor(public unhandledCase: unknown) { + super(`Unhandled case: ${unhandledCase}`); + } } diff --git a/web/packages/teleterm/src/ui/components/CatchError/CatchError.jsx b/web/packages/teleterm/src/ui/components/CatchError/CatchError.jsx index 6decad666ccc7..11d78f41a277e 100644 --- a/web/packages/teleterm/src/ui/components/CatchError/CatchError.jsx +++ b/web/packages/teleterm/src/ui/components/CatchError/CatchError.jsx @@ -18,11 +18,13 @@ import React from 'react'; +import { UnhandledCaseError } from 'shared/utils/assertUnreachable'; + import { FailedApp } from 'teleterm/ui/components/App'; import Logger from 'teleterm/logger'; export class CatchError extends React.Component { - logger = new Logger('components/CatchError'); + logger = new Logger('CatchError'); static getDerivedStateFromError(error) { return { error }; @@ -33,7 +35,17 @@ export class CatchError extends React.Component { }; componentDidCatch(err) { - this.logger.error('render', err); + if (err instanceof UnhandledCaseError) { + try { + // Log this message only to console to avoid storing it on disk. unhandledCase might be an + // object which holds sensitive data. + console.error('Unhandled case', JSON.stringify(err.unhandledCase)); + } catch (error) { + console.error('Cannot stringify unhandled case', error); + } + } + + this.logger.error('Caught', err.stack || err); } render() { diff --git a/web/packages/teleterm/src/ui/services/workspacesService/documentsService/documentsUtils.ts b/web/packages/teleterm/src/ui/services/workspacesService/documentsService/documentsUtils.ts index 79c07d1d6c7b9..e71525ce99b95 100644 --- a/web/packages/teleterm/src/ui/services/workspacesService/documentsService/documentsUtils.ts +++ b/web/packages/teleterm/src/ui/services/workspacesService/documentsService/documentsUtils.ts @@ -17,7 +17,6 @@ */ import { ClusterOrResourceUri, routing } from 'teleterm/ui/uri'; -import { assertUnreachable } from 'teleterm/ui/utils'; import { Document, isDocumentTshNodeWithServerId } from './types'; @@ -57,6 +56,7 @@ export function getResourceUri( case 'doc.blank': return undefined; default: - assertUnreachable(document); + document satisfies never; + return undefined; } }