mirror of
https://github.com/directus/directus.git
synced 2026-04-25 03:00:53 -04:00
* Typecheck across packages that are built with esbuild * Boilerplate new Errors package * No need, tsup checks with --dts * Switch to tsup * Setup dev script * Add readme * More boilerplaty things * Finish createError function * Install @directus/random * Downgrade node types * Add utility function to check if an error is a DirectusError * Use new is-error check * Install errors package * Add failed validation common error * Export common errors * Move joi convertion to utils * Export failed validation * Use new failed validation error in validate-batch * Enhance typing output of createError * Remove outdir (handled by tsup now) * Replace Exception with Error * Replace exception in test * Remove exceptions from app * Remove exceptions from app * Remove failed validation exception from users service * Remove old failed validation exception from shared * Remove exceptions package in favor of errors * Uninstall exceptions * Replace baseexception check * Migrate content too large error * Critical detail * Replace ForbiddenException * WIP remove exceptions * Add ForbiddenError to errors * HitRateLimitError * Move validation related error/helper to new validation package * Add index * Add docs * Install random * Convert TokenExpired * Convert user-suspended * Convert invalid-credentials * Move UnsupportedMediaType * Replace wrong imports for forbidden * Convert invalid-ip * Move invalid provider * Move InvalidOtp * Convert InvalidToken * Move MethodNotAllowed * Convert range not satisfiable * Move unexpect response * Move UnprocessableContent * Move IllegalAssetTransformation * Move RouteNotFound * Finalize not found * Various db errors * Move value too long * Move not null * Move record-not-unique * Move value out of range * Finish db errors * Service unavailable * GQL errors * Update packages/validation/src/errors/failed-validation.ts Co-authored-by: Azri Kahar <42867097+azrikahar@users.noreply.github.com> * Update packages/validation/src/errors/failed-validation.ts Co-authored-by: Azri Kahar <42867097+azrikahar@users.noreply.github.com> * InvalidQuery * Add test for invalid query message constructor * Invalid Payload * Finalize exceptions move * Improve type of isDirectusError * Various fixes * Fix build in api * Update websocket exceptions use * Allow optional reason for invalid config * Update errors usage in utils * Remove unused package from errors * Update lockfile * Update api/src/auth/drivers/ldap.ts Co-authored-by: Azri Kahar <42867097+azrikahar@users.noreply.github.com> * Update packages/validation/src/utils/joi-to-error-extensions.ts Co-authored-by: Azri Kahar <42867097+azrikahar@users.noreply.github.com> * Put error codes in shared enum * Replace instanceof checks in api * Fix tests I think * Tweak override names * Fix linter warnings * Set snapshots * Start fixing BB tests * Fix blackbox tests * Add changeset * Update changeset * Update extension docs to use new createError abstraction * 🙄 * Fix graphql validation error name * 🥳 * use ErrorCode.Forbidden * fix blackbox auth login test * Add license files * Rename preMutationException to preMutationError * Remove unused ms dep & sort package.json * Remove periods from error messages for consistency Co-authored-by: Azri Kahar <42867097+azrikahar@users.noreply.github.com> * Add optional code check * Use updated error code checker * Rename InvalidConfigError to InvalidProviderConfigError --------- Co-authored-by: Azri Kahar <42867097+azrikahar@users.noreply.github.com> Co-authored-by: Pascal Jufer <pascal-jufer@bluewin.ch> Co-authored-by: ian <licitdev@gmail.com>
71 lines
1.8 KiB
TypeScript
71 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 logger 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 {
|
|
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 })}`);
|
|
}
|