From 9c8db576f5cea498c70d00a0764d7f3c6c9cef65 Mon Sep 17 00:00:00 2001 From: AAGaming Date: Mon, 27 May 2024 17:21:27 -0400 Subject: error boundary now properly reports steam errors --- frontend/src/errorboundary-hook.tsx | 37 +++++++++++++++++++++++++++++++------ 1 file changed, 31 insertions(+), 6 deletions(-) (limited to 'frontend/src/errorboundary-hook.tsx') diff --git a/frontend/src/errorboundary-hook.tsx b/frontend/src/errorboundary-hook.tsx index 175b3ff6..6963f207 100644 --- a/frontend/src/errorboundary-hook.tsx +++ b/frontend/src/errorboundary-hook.tsx @@ -2,6 +2,7 @@ import { Patch, callOriginal, findModuleExport, replacePatch } from '@decky/ui'; import DeckyErrorBoundary from './components/DeckyErrorBoundary'; import Logger from './logger'; +import { getLikelyErrorSourceFromValveError } from './utils/errors'; declare global { interface Window { @@ -11,6 +12,7 @@ declare global { class ErrorBoundaryHook extends Logger { private errorBoundaryPatch?: Patch; + private errorCheckPatch?: Patch; constructor() { super('ErrorBoundaryHook'); @@ -35,13 +37,29 @@ class ErrorBoundaryHook extends Logger { const errorReportingStore = initErrorReportingStore(); // NUH UH. - Object.defineProperty(Object.getPrototypeOf(errorReportingStore), 'reporting_enabled', { - get: () => false, - }); - errorReportingStore.m_bEnabled = false; + // Object.defineProperty(Object.getPrototypeOf(errorReportingStore), 'reporting_enabled', { + // get: () => false, + // }); + // errorReportingStore.m_bEnabled = false; // @ts-ignore - // window.errorStore = errorReportingStore; + window.errorStore = errorReportingStore; + + const react15069WorkaroundRegex = / at .+\.componentDidCatch\..+\.callback /; + this.errorCheckPatch = replacePatch(Object.getPrototypeOf(errorReportingStore), 'BIsBlacklisted', (args: any[]) => { + const [errorSource, wasPlugin, shouldReport] = getLikelyErrorSourceFromValveError(args[0]); + this.debug('Caught an error', args, { errorSource, wasPlugin, shouldReport }); + // react#15069 workaround. this took 2 hours to figure out. + if ( + args[0]?.message?.[3]?.[0] && + args[0]?.message?.[1]?.[0] == ' at console.error ' && + react15069WorkaroundRegex.test(args[0].message[3][0]) + ) { + this.debug('ignoring early report caused by react#15069'); + return true; + } + return shouldReport ? callOriginal : true; + }); const ValveErrorBoundary = findModuleExport( (e) => e.InstallErrorReportingStore && e?.prototype?.Reset && e?.prototype?.componentDidCatch, @@ -53,8 +71,14 @@ class ErrorBoundaryHook extends Logger { this.errorBoundaryPatch = replacePatch(ValveErrorBoundary.prototype, 'render', function (this: any) { if (this.state.error) { + const store = Object.getPrototypeOf(this)?.constructor?.sm_ErrorReportingStore || errorReportingStore; return ( - this.Reset()} /> + this.Reset()} + /> ); } return callOriginal; @@ -62,6 +86,7 @@ class ErrorBoundaryHook extends Logger { } deinit() { + this.errorCheckPatch?.unpatch(); this.errorBoundaryPatch?.unpatch(); } } -- cgit v1.2.3