Format response data in error messages

This commit is contained in:
Samuel Elliott 2022-07-23 18:07:25 +01:00
parent a32c3dec72
commit fe725f931a
No known key found for this signature in database
GPG Key ID: 8420C7CDE43DC4D6
5 changed files with 27 additions and 18 deletions

View File

@ -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);

View File

@ -1,3 +1,4 @@
import * as util from 'node:util';
import { Response as NodeFetchResponse } from 'node-fetch';
export class ErrorResponse<T = unknown> extends Error {
@ -19,6 +20,19 @@ export class ErrorResponse<T = unknown> 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') : ''),
});
}
}

View File

@ -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'],

View File

@ -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: {

View File

@ -262,18 +262,9 @@ export class PresenceMonitorManager {
monitor: EmbeddedPresenceMonitor | EmbeddedProxyPresenceMonitor,
err: ErrorResponse<CoralErrorResponse> | NodeJS.ErrnoException
): Promise<LoopResult> {
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,