Files
directus/api/src/websocket/errors.ts
Rijk van Zanten 2b9056cc80 Refactor default import logger with useLogger (#20872)
* useLogger

* Rework to useLogger and no globals

* Only export useLogger / createLogger

* Temp remove logger tests

* Refactor logger

* Refactor logger

* Refactor logger

* Refactor logger use

* Fix tests

* Fix logger usage in bootstrap

* Run formatter

* Remove logger tests

Feels drastic, but I'm about to rewrite them into @directus/logger :)

* Fix log operation test
2023-12-26 11:38:38 -05:00

73 lines
1.8 KiB
TypeScript

import type { DirectusError } from '@directus/errors';
import { isDirectusError } from '@directus/errors';
import type { WebSocket } from 'ws';
import { ZodError } from 'zod';
import { fromZodError } from 'zod-validation-error';
import { useLogger } from '../logger.js';
import type { WebSocketResponse } from './messages.js';
import type { WebSocketClient } from './types.js';
export class WebSocketError extends Error {
type: string;
code: string;
uid: string | number | undefined;
constructor(type: string, code: string, message: string, uid?: string | number) {
super(message);
this.type = type;
this.code = code;
this.uid = uid;
}
toJSON(): WebSocketResponse {
const message: WebSocketResponse = {
type: this.type,
status: 'error',
error: {
code: this.code,
message: this.message,
},
};
if (this.uid !== undefined) {
message.uid = this.uid;
}
return message;
}
toMessage(): string {
return JSON.stringify(this.toJSON());
}
static fromError(error: DirectusError<unknown>, type = 'unknown') {
return new WebSocketError(type, error.code, error.message);
}
static fromZodError(error: ZodError, type = 'unknown') {
const zError = fromZodError(error);
return new WebSocketError(type, 'INVALID_PAYLOAD', zError.message);
}
}
export function handleWebSocketError(client: WebSocketClient | WebSocket, error: unknown, type?: string): void {
const logger = useLogger();
if (isDirectusError(error)) {
client.send(WebSocketError.fromError(error, type).toMessage());
return;
}
if (error instanceof WebSocketError) {
client.send(error.toMessage());
return;
}
if (error instanceof ZodError) {
client.send(WebSocketError.fromZodError(error, type).toMessage());
return;
}
// unhandled exceptions
logger.error(`WebSocket unhandled exception ${JSON.stringify({ type, error })}`);
}