mirror of
https://github.com/SteamDeckHomebrew/decky-loader.git
synced 2026-06-17 00:37:49 +00:00
error boundary now properly reports steam errors
This commit is contained in:
@@ -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 (
|
||||
<DeckyErrorBoundary error={this.state.error} errorKey={this.state.errorKey} reset={() => this.Reset()} />
|
||||
<DeckyErrorBoundary
|
||||
error={this.state.error}
|
||||
errorKey={this.props.errorKey}
|
||||
identifier={`${store.product}_${store.version}_${this.state.identifierHash}`}
|
||||
reset={() => this.Reset()}
|
||||
/>
|
||||
);
|
||||
}
|
||||
return callOriginal;
|
||||
@@ -62,6 +86,7 @@ class ErrorBoundaryHook extends Logger {
|
||||
}
|
||||
|
||||
deinit() {
|
||||
this.errorCheckPatch?.unpatch();
|
||||
this.errorBoundaryPatch?.unpatch();
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user