From 7fa61ff0d3b8853cd77f9e69059a241395cc38c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Cie=C5=9Blak?= Date: Fri, 9 Feb 2024 17:24:14 +0100 Subject: [PATCH 1/2] Serialize unhandled case to console --- web/packages/shared/utils/assertUnreachable.ts | 8 +++++++- .../src/ui/components/CatchError/CatchError.jsx | 16 ++++++++++++++-- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/web/packages/shared/utils/assertUnreachable.ts b/web/packages/shared/utils/assertUnreachable.ts index 4d91e495874f1..28fd7b10e19d6 100644 --- a/web/packages/shared/utils/assertUnreachable.ts +++ b/web/packages/shared/utils/assertUnreachable.ts @@ -15,5 +15,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 4eb520b78a059..13c05ff2c798c 100644 --- a/web/packages/teleterm/src/ui/components/CatchError/CatchError.jsx +++ b/web/packages/teleterm/src/ui/components/CatchError/CatchError.jsx @@ -16,11 +16,13 @@ limitations under the License. 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 }; @@ -31,7 +33,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() { From 8167cb480698688689312e1129ed9ee1de66ad90 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Cie=C5=9Blak?= Date: Fri, 9 Feb 2024 17:24:44 +0100 Subject: [PATCH 2/2] getResourceUri: Return undefined for unhandled cases --- .../workspacesService/documentsService/documentsUtils.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 aa14a643f836c..888ba3a7d6d1d 100644 --- a/web/packages/teleterm/src/ui/services/workspacesService/documentsService/documentsUtils.ts +++ b/web/packages/teleterm/src/ui/services/workspacesService/documentsService/documentsUtils.ts @@ -15,7 +15,6 @@ */ import { ClusterOrResourceUri, routing } from 'teleterm/ui/uri'; -import { assertUnreachable } from 'teleterm/ui/utils'; import { Document, isDocumentTshNodeWithServerId } from './types'; @@ -55,6 +54,7 @@ export function getResourceUri( case 'doc.blank': return undefined; default: - assertUnreachable(document); + document satisfies never; + return undefined; } }