60 lines
1.5 KiB
TypeScript
60 lines
1.5 KiB
TypeScript
|
import * as plugins from '../../plugins.js';
|
||
|
import { EventEmitter } from 'node:events';
|
||
|
import type { IEmailRoute, IEmailMatch, IEmailAction, IEmailContext } from './interfaces.js';
|
||
|
import type { Email } from '../core/classes.email.js';
|
||
|
|
||
|
/**
|
||
|
* Email router that evaluates routes and determines actions
|
||
|
*/
|
||
|
export class EmailRouter extends EventEmitter {
|
||
|
private routes: IEmailRoute[];
|
||
|
private patternCache: Map<string, boolean> = new Map();
|
||
|
|
||
|
/**
|
||
|
* Create a new email router
|
||
|
* @param routes Array of email routes
|
||
|
*/
|
||
|
constructor(routes: IEmailRoute[]) {
|
||
|
super();
|
||
|
this.routes = this.sortRoutesByPriority(routes);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Sort routes by priority (higher priority first)
|
||
|
* @param routes Routes to sort
|
||
|
* @returns Sorted routes
|
||
|
*/
|
||
|
private sortRoutesByPriority(routes: IEmailRoute[]): IEmailRoute[] {
|
||
|
return [...routes].sort((a, b) => {
|
||
|
const priorityA = a.priority ?? 0;
|
||
|
const priorityB = b.priority ?? 0;
|
||
|
return priorityB - priorityA; // Higher priority first
|
||
|
});
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get all configured routes
|
||
|
* @returns Array of routes
|
||
|
*/
|
||
|
public getRoutes(): IEmailRoute[] {
|
||
|
return [...this.routes];
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Update routes
|
||
|
* @param routes New routes
|
||
|
*/
|
||
|
public updateRoutes(routes: IEmailRoute[]): void {
|
||
|
this.routes = this.sortRoutesByPriority(routes);
|
||
|
this.clearCache();
|
||
|
this.emit('routesUpdated', this.routes);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Clear the pattern cache
|
||
|
*/
|
||
|
public clearCache(): void {
|
||
|
this.patternCache.clear();
|
||
|
this.emit('cacheCleared');
|
||
|
}
|
||
|
}
|