mirror of
https://github.com/Memo-2023/mana-monorepo.git
synced 2026-05-14 22:01:09 +02:00
53 lines
1.5 KiB
TypeScript
53 lines
1.5 KiB
TypeScript
import { ErrorCode } from '../types/error-codes';
|
|
import { AppError } from './app-error';
|
|
import type { ErrorContext } from './app-error';
|
|
|
|
type NetworkErrorCode = ErrorCode.NETWORK_ERROR | ErrorCode.TIMEOUT | ErrorCode.CONNECTION_REFUSED;
|
|
|
|
/**
|
|
* Error for network-level failures (timeouts, connection issues, etc.).
|
|
* HTTP Status: 502 (gateway), 503 (connection refused), 504 (timeout)
|
|
*
|
|
* @example
|
|
* ```typescript
|
|
* // Timeout
|
|
* return err(NetworkError.timeout('Fetching user profile'));
|
|
*
|
|
* // Connection refused
|
|
* return err(NetworkError.connectionRefused('Database'));
|
|
*
|
|
* // Generic network error
|
|
* return err(new NetworkError(ErrorCode.NETWORK_ERROR, 'DNS resolution failed'));
|
|
* ```
|
|
*/
|
|
export class NetworkError extends AppError {
|
|
constructor(code: NetworkErrorCode, message: string, cause?: Error, context?: ErrorContext) {
|
|
super({ code, message, cause, context });
|
|
this.name = 'NetworkError';
|
|
}
|
|
|
|
/**
|
|
* Create a timeout error.
|
|
*
|
|
* @param operation - Description of the operation that timed out
|
|
*/
|
|
static timeout(operation: string): NetworkError {
|
|
return new NetworkError(ErrorCode.TIMEOUT, `Operation timed out: ${operation}`, undefined, {
|
|
operation,
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Create a connection refused error.
|
|
*
|
|
* @param service - Name of the service that refused connection
|
|
*/
|
|
static connectionRefused(service: string): NetworkError {
|
|
return new NetworkError(
|
|
ErrorCode.CONNECTION_REFUSED,
|
|
`Connection refused: ${service}`,
|
|
undefined,
|
|
{ service }
|
|
);
|
|
}
|
|
}
|