From bd9cb41f8a037a6e239fc24175bd7ac5a086204f Mon Sep 17 00:00:00 2001 From: forehalo Date: Wed, 26 Jun 2024 12:22:33 +0000 Subject: [PATCH] fix(server): websocket error backward compatibility (#7346) --- .../server/src/fundamentals/error/def.ts | 2 +- .../server/src/fundamentals/graphql/index.ts | 2 +- .../src/fundamentals/nestjs/exception.ts | 25 ++++++++++++++++--- 3 files changed, 24 insertions(+), 5 deletions(-) diff --git a/packages/backend/server/src/fundamentals/error/def.ts b/packages/backend/server/src/fundamentals/error/def.ts index d15affb2a9..239e55dda4 100644 --- a/packages/backend/server/src/fundamentals/error/def.ts +++ b/packages/backend/server/src/fundamentals/error/def.ts @@ -76,7 +76,7 @@ export class UserFriendlyError extends Error { this.data = args; } - json() { + toJSON() { return { status: this.status, code: STATUS_CODES[this.status] ?? 'BAD REQUEST', diff --git a/packages/backend/server/src/fundamentals/graphql/index.ts b/packages/backend/server/src/fundamentals/graphql/index.ts index 58def77b90..8f604984aa 100644 --- a/packages/backend/server/src/fundamentals/graphql/index.ts +++ b/packages/backend/server/src/fundamentals/graphql/index.ts @@ -62,7 +62,7 @@ export type GraphqlContext = { error.originalError instanceof UserFriendlyError ) { // @ts-expect-error allow assign - formattedError.extensions = error.originalError.json(); + formattedError.extensions = error.originalError.toJSON(); formattedError.extensions.stacktrace = error.originalError.stack; return formattedError; } else { diff --git a/packages/backend/server/src/fundamentals/nestjs/exception.ts b/packages/backend/server/src/fundamentals/nestjs/exception.ts index a5e80b221e..2460cb32ea 100644 --- a/packages/backend/server/src/fundamentals/nestjs/exception.ts +++ b/packages/backend/server/src/fundamentals/nestjs/exception.ts @@ -38,12 +38,31 @@ export class GlobalExceptionFilter extends BaseExceptionFilter { error.log('HTTP'); metrics.controllers.counter('error').add(1, { status: error.status }); const res = host.switchToHttp().getResponse(); - res.status(error.status).send(error.json()); + res.status(error.status).send(error.toJSON()); return; } } } +/** + * Only exists for websocket error body backward compatibility + * + * relay on `code` field instead of `name` + * + * @TODO(@forehalo): remove + */ +function toWebsocketError(error: UserFriendlyError) { + // should be `error.toJSON()` after backward compatibility removed + return { + status: error.status, + code: error.name.toUpperCase(), + type: error.type.toUpperCase(), + name: error.name.toUpperCase(), + message: error.message, + data: error.data, + }; +} + export const GatewayErrorWrapper = (event: string): MethodDecorator => { // @ts-expect-error allow return ( @@ -67,7 +86,7 @@ export const GatewayErrorWrapper = (event: string): MethodDecorator => { .add(1, { event, status: mappedError.status }); return { - error: mappedError.json(), + error: toWebsocketError(mappedError), }; } }; @@ -82,6 +101,6 @@ export function mapSseError(originalError: any) { metrics.sse.counter('error').add(1, { status: error.status }); return of({ type: 'error' as const, - data: error.json(), + data: error.toJSON(), }); }