chore(ui): temporary Android WebView boot diagnostic (test contour only) #176
@@ -143,6 +143,34 @@
|
||||
var r = e && e.reason;
|
||||
logErr('unhandledrejection', r && (r.stack || r.message) ? r.stack || r.message : String(r));
|
||||
});
|
||||
// Mirror console.error / console.warn into the panel. The app catches its boot failures and
|
||||
// surfaces them only as a toast (they never reach window.onerror); a temporary console.error
|
||||
// at the app's handleError routes the real cause here, so the panel shows what actually threw.
|
||||
function fmt(a) {
|
||||
if (a && (a.stack || a.message)) return a.stack || a.message;
|
||||
if (typeof a === 'object') {
|
||||
try {
|
||||
return JSON.stringify(a);
|
||||
} catch (e) {
|
||||
return String(a);
|
||||
}
|
||||
}
|
||||
return String(a);
|
||||
}
|
||||
function wrapConsole(orig, label) {
|
||||
return function () {
|
||||
try {
|
||||
var parts = [];
|
||||
for (var i = 0; i < arguments.length; i++) parts.push(fmt(arguments[i]));
|
||||
logErr('console.' + label, parts.join(' '));
|
||||
} catch (e) {}
|
||||
if (orig) return orig.apply(console, arguments);
|
||||
};
|
||||
}
|
||||
if (window.console) {
|
||||
console.error = wrapConsole(console.error, 'error');
|
||||
console.warn = wrapConsole(console.warn, 'warn');
|
||||
}
|
||||
|
||||
// ---- environment -----------------------------------------------------------------------
|
||||
var ua = nav.userAgent || '(no userAgent)';
|
||||
|
||||
@@ -283,6 +283,12 @@ export function markChatRead(gameId: string): void {
|
||||
* failure — or anything raised while the app is mid-reconnect — is shown by the "Connecting…"
|
||||
* header indicator (and auto-retried), never a red toast. */
|
||||
export function handleError(err: unknown): void {
|
||||
// TEMP (boot diagnostic): the toast is generic, so route the real caught error to the on-device
|
||||
// BOOT-DIAG panel via console (it mirrors console.error). Mode-gated to keep it out of the mock
|
||||
// e2e. Revert together with the index.html BOOT-DIAG block.
|
||||
if (import.meta.env.MODE !== 'mock') {
|
||||
console.error('[diag] handleError:', err instanceof Error ? err.stack || err.message : err);
|
||||
}
|
||||
const code = err instanceof GatewayError ? err.code : '';
|
||||
if (code === 'session_invalid' || code === 'unauthenticated') {
|
||||
void logout();
|
||||
|
||||
Reference in New Issue
Block a user