diff --git a/src/api/na.ts b/src/api/na.ts index d05f1a9..5a128db 100644 --- a/src/api/na.ts +++ b/src/api/na.ts @@ -29,7 +29,7 @@ export async function getNintendoAccountSessionToken(code: string, verifier: str const token = await response.json() as NintendoAccountSessionToken | NintendoAccountError; if ('errorCode' in token) { - throw new ErrorResponse('[na] + ' + token.detail, response, token); + throw new ErrorResponse('[na] ' + token.detail, response, token); } debug('Got Nintendo Account session token', token); @@ -59,7 +59,7 @@ export async function getNintendoAccountToken(token: string, client_id: string) const nintendoAccountToken = await response.json() as NintendoAccountToken | NintendoAccountError; if ('errorCode' in nintendoAccountToken) { - throw new ErrorResponse('[na] + ' + nintendoAccountToken.detail, response, nintendoAccountToken); + throw new ErrorResponse('[na] ' + nintendoAccountToken.detail, response, nintendoAccountToken); } debug('Got Nintendo Account token', nintendoAccountToken); @@ -85,7 +85,7 @@ export async function getNintendoAccountUser(token: NintendoAccountToken) { const user = await response.json() as NintendoAccountUser | NintendoAccountError; if ('errorCode' in user) { - throw new ErrorResponse('[na] + ' + user.detail, response, user); + throw new ErrorResponse('[na] ' + user.detail, response, user); } debug('Got Nintendo Account user info', user); diff --git a/src/api/util.ts b/src/api/util.ts index 4819020..84e1bd3 100644 --- a/src/api/util.ts +++ b/src/api/util.ts @@ -1,3 +1,4 @@ +import * as util from 'node:util'; import { Response as NodeFetchResponse } from 'node-fetch'; export class ErrorResponse extends Error { @@ -19,6 +20,19 @@ export class ErrorResponse extends Error { } else if (typeof body !== 'undefined') { this.data = body; } + + const stack = this.stack ?? (this.name + ': ' + message); + const lines = stack.split('\n'); + const head = lines.shift()!; + + Object.defineProperty(this, 'stack', { + value: head + '\n' + + ' from ' + response.url + ' (' + response.status + ' ' + response.statusText + ')\n' + + ' ' + util.inspect(this.data ? this.data : this.body, { + compact: true, + }).replace(/\n/g, '\n ') + + (lines.length ? '\n' + lines.join('\n') : ''), + }); } } diff --git a/src/app/main/index.ts b/src/app/main/index.ts index 3d5227e..8926214 100644 --- a/src/app/main/index.ts +++ b/src/app/main/index.ts @@ -245,8 +245,10 @@ export class Store extends EventEmitter { await this.app.menu?.updateMenu(); } catch (err) { + debug('Error restoring monitor for user %s', user.id, err); + const {response} = await dialog.showMessageBox({ - message: 'Error restoring monitor for user ' + user.id, + message: (err instanceof Error ? err.name : 'Error') + ' restoring monitor for user ' + user.id, detail: err instanceof Error ? err.stack ?? err.message : err as any, type: 'error', buttons: ['OK', 'Retry'], @@ -272,8 +274,10 @@ export class Store extends EventEmitter { await this.app.menu?.updateMenu(); } catch (err) { + debug('Error restoring monitor for presence URL %s', state.discord_presence.source.url, err); + const {response} = await dialog.showMessageBox({ - message: 'Error restoring monitor for presence URL ' + state.discord_presence.source.url, + message: (err instanceof Error ? err.name : 'Error') + ' restoring monitor for presence URL ' + state.discord_presence.source.url, detail: err instanceof Error ? err.stack ?? err.message : err as any, type: 'error', buttons: ['OK', 'Retry'], diff --git a/src/app/main/ipc.ts b/src/app/main/ipc.ts index a96bc1d..ba6a7f2 100644 --- a/src/app/main/ipc.ts +++ b/src/app/main/ipc.ts @@ -58,7 +58,7 @@ export function setupIpc(appinstance: App, ipcMain: IpcMain) { store.users.get(token).then(u => openWebService(store, token, u.nso, u.data, webservice, qs) .catch(err => dialog.showMessageBox(BrowserWindow.fromWebContents(e.sender)!, { type: 'error', - title: 'Error opening web service', + title: (err instanceof Error ? err.name : 'Error') + ' opening web service', message: err.message, detail: (err instanceof Error ? err.stack ?? '' : err) + '\n\n' + util.inspect({ webservice: { diff --git a/src/app/main/monitor.ts b/src/app/main/monitor.ts index aa50fc9..c0b4137 100644 --- a/src/app/main/monitor.ts +++ b/src/app/main/monitor.ts @@ -262,18 +262,9 @@ export class PresenceMonitorManager { monitor: EmbeddedPresenceMonitor | EmbeddedProxyPresenceMonitor, err: ErrorResponse | NodeJS.ErrnoException ): Promise { - const {response} = await dialog.showMessageBox(err instanceof ErrorResponse ? { - message: 'Request error updating presence monitor', - detail: err.response.status + ' ' + err.response.statusText + ' ' + - err.response.url + '\n' + - err.body + '\n\n' + - (err.stack ?? err.message), - type: 'error', - buttons: ['OK', 'Retry'], - defaultId: 0, - } : { - message: 'Error updating presence monitor', - detail: err instanceof Error ? err.stack ?? err.message : err as any, + const {response} = await dialog.showMessageBox({ + message: err.name + ' updating presence monitor', + detail: err.stack ?? err.message, type: 'error', buttons: ['OK', 'Retry'], defaultId: 0,