From dae8a9cc89755cbb08838198251856969dc23346 Mon Sep 17 00:00:00 2001 From: Andras Schmelczer Date: Thu, 2 Jan 2025 11:24:22 +0000 Subject: [PATCH] Display formatted HTTP errors --- plugin/src/services/sync-service.ts | 42 +++++++++-- plugin/src/services/types.ts | 107 +++++++++++++++++----------- 2 files changed, 104 insertions(+), 45 deletions(-) diff --git a/plugin/src/services/sync-service.ts b/plugin/src/services/sync-service.ts index 80bee99e..22f6f737 100644 --- a/plugin/src/services/sync-service.ts +++ b/plugin/src/services/sync-service.ts @@ -23,6 +23,18 @@ export class SyncService { }); } + private static formatError( + error: components["schemas"]["SerializedError"] + ): string { + let result = error.message; + if (error.causes.length > 0) { + const causes = error.causes.join(", "); + result += ` caused by: ${causes}`; + } + + return result; + } + public async ping(): Promise { const response = await this.client.GET("/ping", { params: { @@ -39,7 +51,11 @@ export class SyncService { ); if (!response.data) { - throw new Error(`Failed to ping server: ${response.error}`); + throw new Error( + `Failed to ping server: ${SyncService.formatError( + response.error + )}` + ); } return response.data; @@ -76,7 +92,11 @@ export class SyncService { ); if (!response.data) { - throw new Error(`Failed to create document: ${response.error}`); + throw new Error( + `Failed to create document: ${SyncService.formatError( + response.error + )}` + ); } Logger.getInstance().debug( @@ -125,7 +145,11 @@ export class SyncService { ); if (!response.data) { - throw new Error(`Failed to update document: ${response.error}`); + throw new Error( + `Failed to update document: ${SyncService.formatError( + response.error + )}` + ); } Logger.getInstance().debug( @@ -199,7 +223,11 @@ export class SyncService { ); if (!response.data) { - throw new Error(`Failed to get document: ${response.error}`); + throw new Error( + `Failed to get document: ${SyncService.formatError( + response.error + )}` + ); } Logger.getInstance().debug( @@ -230,7 +258,11 @@ export class SyncService { const { error } = response; if (error) { - throw new Error(`Failed to get documents: ${error}`); + throw new Error( + `Failed to get documents: ${SyncService.formatError( + response.error + )}` + ); } Logger.getInstance().debug( diff --git a/plugin/src/services/types.ts b/plugin/src/services/types.ts index 09f50f13..bd51c68d 100644 --- a/plugin/src/services/types.ts +++ b/plugin/src/services/types.ts @@ -23,11 +23,21 @@ export interface paths { requestBody?: never; responses: { 200: { - headers: Record; + headers: { + [name: string]: unknown; + }; content: { "application/json": components["schemas"]["PingResponse"]; }; }; + default: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["SerializedError"]; + }; + }; }; }; put?: never; @@ -61,11 +71,21 @@ export interface paths { requestBody?: never; responses: { 200: { - headers: Record; + headers: { + [name: string]: unknown; + }; content: { "application/json": components["schemas"]["FetchLatestDocumentsResponse"]; }; }; + default: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["SerializedError"]; + }; + }; }; }; put?: never; @@ -87,11 +107,21 @@ export interface paths { }; responses: { 200: { - headers: Record; + headers: { + [name: string]: unknown; + }; content: { "application/json": components["schemas"]["DocumentVersion"]; }; }; + default: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["SerializedError"]; + }; + }; }; }; delete?: never; @@ -122,11 +152,21 @@ export interface paths { requestBody?: never; responses: { 200: { - headers: Record; + headers: { + [name: string]: unknown; + }; content: { "application/json": components["schemas"]["DocumentVersion"]; }; }; + default: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["SerializedError"]; + }; + }; }; }; put: { @@ -148,11 +188,21 @@ export interface paths { }; responses: { 200: { - headers: Record; + headers: { + [name: string]: unknown; + }; content: { "application/json": components["schemas"]["DocumentVersion"]; }; }; + default: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["SerializedError"]; + }; + }; }; }; post?: never; @@ -176,48 +226,21 @@ export interface paths { responses: { /** @description no content */ 200: { - headers: Record; - content?: never; - }; - }; - }; - options?: never; - head?: never; - patch?: never; - trace?: never; - }; - "/ws": { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - get: { - parameters: { - query?: never; - header?: never; - path?: never; - cookie?: never; - }; - requestBody?: never; - responses: { - /** @description websocket upgrade */ - 101: { headers: { - connection?: "upgrade"; - upgrade?: "websocket"; - "sec-websocket-key"?: string; - "sec-websocket-protocol"?: string; [name: string]: unknown; }; content?: never; }; + default: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["SerializedError"]; + }; + }; }; }; - put?: never; - post?: never; - delete?: never; options?: never; head?: never; patch?: never; @@ -299,6 +322,10 @@ export interface components { /** Format: int64 */ since_update_id?: number | null; }; + SerializedError: { + causes: string[]; + message: string; + }; UpdateDocumentVersion: { contentBase64: string; /** Format: date-time */