summaryrefslogtreecommitdiff
path: root/frontend/src/utils/errors.ts
diff options
context:
space:
mode:
Diffstat (limited to 'frontend/src/utils/errors.ts')
-rw-r--r--frontend/src/utils/errors.ts48
1 files changed, 48 insertions, 0 deletions
diff --git a/frontend/src/utils/errors.ts b/frontend/src/utils/errors.ts
new file mode 100644
index 00000000..0bf82986
--- /dev/null
+++ b/frontend/src/utils/errors.ts
@@ -0,0 +1,48 @@
+import { ErrorInfo } from 'react';
+
+const pluginErrorRegex = /http:\/\/localhost:1337\/plugins\/([^\/]*)\//;
+const pluginSourceMapErrorRegex = /decky:\/\/decky\/plugin\/([^\/]*)\//;
+const legacyPluginErrorRegex = /decky:\/\/decky\/legacy_plugin\/([^\/]*)\/index.js/;
+
+export interface ValveReactErrorInfo {
+ error: Error;
+ info: ErrorInfo;
+}
+
+export interface ValveError {
+ identifier: string;
+ identifierHash: string;
+ message: string | [func: string, src: string, line: number, column: number];
+}
+
+export type ErrorSource = [source: string, wasPlugin: boolean, shouldReportToValve: boolean];
+
+export function getLikelyErrorSourceFromValveError(error: ValveError): ErrorSource {
+ return getLikelyErrorSource(JSON.stringify(error?.message));
+}
+
+export function getLikelyErrorSourceFromValveReactError(error: ValveReactErrorInfo): ErrorSource {
+ return getLikelyErrorSource(error?.error?.stack);
+}
+
+export function getLikelyErrorSource(error?: string): ErrorSource {
+ const pluginMatch = error?.match(pluginErrorRegex);
+ if (pluginMatch) {
+ return [decodeURIComponent(pluginMatch[1]), true, false];
+ }
+
+ const pluginMatchViaMap = error?.match(pluginSourceMapErrorRegex);
+ if (pluginMatchViaMap) {
+ return [decodeURIComponent(pluginMatchViaMap[1]), true, false];
+ }
+
+ const legacyPluginMatch = error?.match(legacyPluginErrorRegex);
+ if (legacyPluginMatch) {
+ return [decodeURIComponent(legacyPluginMatch[1]), true, false];
+ }
+
+ if (error?.includes('http://localhost:1337/')) {
+ return ['the Decky frontend', false, false];
+ }
+ return ['Steam', false, true];
+}