- Add @git.zone/tsrust with linux_amd64/linux_arm64 cross-compilation - Scaffold Rust workspace with 5 crates: mailer-core, mailer-smtp, mailer-security, mailer-napi, mailer-bin - Fix all TypeScript compilation errors for upgraded dependencies (smartfile v13, mailauth v4.13, smartproxy v23) - Replace smartfile.fs/memory with @push.rocks/smartfs throughout codebase - Fix .ts import extensions to .js for NodeNext module resolution - Update DKIMSignOptions usage to match mailauth v4.13 API - Add MTA error classes with permissive signatures for legacy SMTP client - Replace removed DcRouter/StorageManager/deliverability imports with local interfaces
120 lines
3.8 KiB
TypeScript
120 lines
3.8 KiB
TypeScript
/**
|
|
* MTA error classes for SMTP client operations
|
|
*/
|
|
|
|
export class MtaConnectionError extends Error {
|
|
public code: string;
|
|
public details?: any;
|
|
constructor(message: string, detailsOrCode?: any) {
|
|
super(message);
|
|
this.name = 'MtaConnectionError';
|
|
if (typeof detailsOrCode === 'string') {
|
|
this.code = detailsOrCode;
|
|
} else {
|
|
this.code = 'CONNECTION_ERROR';
|
|
this.details = detailsOrCode;
|
|
}
|
|
}
|
|
static timeout(host: string, port: number, timeoutMs?: number): MtaConnectionError {
|
|
return new MtaConnectionError(`Connection to ${host}:${port} timed out${timeoutMs ? ` after ${timeoutMs}ms` : ''}`, 'TIMEOUT');
|
|
}
|
|
static refused(host: string, port: number): MtaConnectionError {
|
|
return new MtaConnectionError(`Connection to ${host}:${port} refused`, 'REFUSED');
|
|
}
|
|
static dnsError(host: string, err?: any): MtaConnectionError {
|
|
const errMsg = typeof err === 'string' ? err : err?.message || '';
|
|
return new MtaConnectionError(`DNS resolution failed for ${host}${errMsg ? `: ${errMsg}` : ''}`, 'DNS_ERROR');
|
|
}
|
|
}
|
|
|
|
export class MtaAuthenticationError extends Error {
|
|
public code: string;
|
|
public details?: any;
|
|
constructor(message: string, detailsOrCode?: any) {
|
|
super(message);
|
|
this.name = 'MtaAuthenticationError';
|
|
if (typeof detailsOrCode === 'string') {
|
|
this.code = detailsOrCode;
|
|
} else {
|
|
this.code = 'AUTH_ERROR';
|
|
this.details = detailsOrCode;
|
|
}
|
|
}
|
|
static invalidCredentials(host?: string, user?: string): MtaAuthenticationError {
|
|
const detail = host && user ? `${user}@${host}` : host || user || '';
|
|
return new MtaAuthenticationError(`Authentication failed${detail ? `: ${detail}` : ''}`, 'INVALID_CREDENTIALS');
|
|
}
|
|
}
|
|
|
|
export class MtaDeliveryError extends Error {
|
|
public code: string;
|
|
public responseCode?: number;
|
|
public details?: any;
|
|
constructor(message: string, detailsOrCode?: any, responseCode?: number) {
|
|
super(message);
|
|
this.name = 'MtaDeliveryError';
|
|
if (typeof detailsOrCode === 'string') {
|
|
this.code = detailsOrCode;
|
|
this.responseCode = responseCode;
|
|
} else {
|
|
this.code = 'DELIVERY_ERROR';
|
|
this.details = detailsOrCode;
|
|
}
|
|
}
|
|
static temporary(message: string, ...args: any[]): MtaDeliveryError {
|
|
return new MtaDeliveryError(message, 'TEMPORARY');
|
|
}
|
|
static permanent(message: string, ...args: any[]): MtaDeliveryError {
|
|
return new MtaDeliveryError(message, 'PERMANENT');
|
|
}
|
|
}
|
|
|
|
export class MtaConfigurationError extends Error {
|
|
public code: string;
|
|
public details?: any;
|
|
constructor(message: string, detailsOrCode?: any) {
|
|
super(message);
|
|
this.name = 'MtaConfigurationError';
|
|
if (typeof detailsOrCode === 'string') {
|
|
this.code = detailsOrCode;
|
|
} else {
|
|
this.code = 'CONFIG_ERROR';
|
|
this.details = detailsOrCode;
|
|
}
|
|
}
|
|
}
|
|
|
|
export class MtaTimeoutError extends Error {
|
|
public code: string;
|
|
public details?: any;
|
|
constructor(message: string, detailsOrCode?: any) {
|
|
super(message);
|
|
this.name = 'MtaTimeoutError';
|
|
if (typeof detailsOrCode === 'string') {
|
|
this.code = detailsOrCode;
|
|
} else {
|
|
this.code = 'TIMEOUT';
|
|
this.details = detailsOrCode;
|
|
}
|
|
}
|
|
static commandTimeout(command: string, hostOrTimeout?: any, timeoutMs?: number): MtaTimeoutError {
|
|
const timeout = typeof hostOrTimeout === 'number' ? hostOrTimeout : timeoutMs;
|
|
return new MtaTimeoutError(`Command '${command}' timed out${timeout ? ` after ${timeout}ms` : ''}`, 'COMMAND_TIMEOUT');
|
|
}
|
|
}
|
|
|
|
export class MtaProtocolError extends Error {
|
|
public code: string;
|
|
public details?: any;
|
|
constructor(message: string, detailsOrCode?: any) {
|
|
super(message);
|
|
this.name = 'MtaProtocolError';
|
|
if (typeof detailsOrCode === 'string') {
|
|
this.code = detailsOrCode;
|
|
} else {
|
|
this.code = 'PROTOCOL_ERROR';
|
|
this.details = detailsOrCode;
|
|
}
|
|
}
|
|
}
|