@push.rocks/smartmta 8.0.1 → 8.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/changelog.md +51 -0
- package/dist_rust/mailer-bin_linux_amd64 +0 -0
- package/dist_rust/mailer-bin_linux_arm64 +0 -0
- package/dist_ts/00_commitinfo_data.js +1 -1
- package/dist_ts/index.d.ts +6 -0
- package/dist_ts/index.js +7 -1
- package/dist_ts/mail/delivery/classes.delivery.queue.d.ts +43 -3
- package/dist_ts/mail/delivery/classes.delivery.queue.js +310 -10
- package/dist_ts/mail/delivery/classes.delivery.system.d.ts +13 -2
- package/dist_ts/mail/delivery/classes.delivery.system.js +106 -36
- package/dist_ts/mail/interfaces.storage.d.ts +34 -0
- package/dist_ts/mail/interfaces.storage.js +89 -3
- package/dist_ts/mail/routing/classes.domain.registry.js +5 -1
- package/dist_ts/mail/routing/classes.email.action.executor.d.ts +15 -0
- package/dist_ts/mail/routing/classes.email.action.executor.js +38 -13
- package/dist_ts/mail/routing/classes.email.router.d.ts +2 -0
- package/dist_ts/mail/routing/classes.email.router.js +28 -21
- package/dist_ts/mail/routing/classes.unified.email.server.d.ts +156 -4
- package/dist_ts/mail/routing/classes.unified.email.server.js +1001 -61
- package/dist_ts/mail/routing/functions.routing.validation.d.ts +8 -0
- package/dist_ts/mail/routing/functions.routing.validation.js +18 -0
- package/dist_ts/mail/routing/interfaces.d.ts +11 -1
- package/dist_ts/plugins.d.ts +2 -1
- package/dist_ts/plugins.js +3 -2
- package/dist_ts/security/classes.rustsecuritybridge.d.ts +32 -1
- package/dist_ts/security/classes.rustsecuritybridge.js +13 -1
- package/dist_ts/security/index.d.ts +1 -1
- package/dist_ts/security/index.js +1 -1
- package/package.json +1 -1
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/index.ts +6 -0
- package/ts/mail/delivery/classes.delivery.queue.ts +429 -7
- package/ts/mail/delivery/classes.delivery.system.ts +137 -41
- package/ts/mail/interfaces.storage.ts +148 -2
- package/ts/mail/routing/classes.domain.registry.ts +4 -0
- package/ts/mail/routing/classes.email.action.executor.ts +97 -13
- package/ts/mail/routing/classes.email.router.ts +33 -20
- package/ts/mail/routing/classes.unified.email.server.ts +1367 -74
- package/ts/mail/routing/functions.routing.validation.ts +36 -0
- package/ts/mail/routing/interfaces.ts +13 -1
- package/ts/plugins.ts +2 -0
- package/ts/security/classes.rustsecuritybridge.ts +46 -1
- package/ts/security/index.ts +2 -0
|
@@ -4,6 +4,7 @@ import type { IStorageManager } from '../interfaces.storage.js';
|
|
|
4
4
|
import type { IEmailRoute, IEmailMatch, IEmailAction, IEmailContext } from './interfaces.js';
|
|
5
5
|
import type { Email } from '../core/classes.email.js';
|
|
6
6
|
import { getErrorMessage } from '../../functions.errors.js';
|
|
7
|
+
import { assertValidRetentionDays } from './functions.routing.validation.js';
|
|
7
8
|
|
|
8
9
|
/**
|
|
9
10
|
* Email router that evaluates routes and determines actions
|
|
@@ -25,6 +26,7 @@ export class EmailRouter extends EventEmitter {
|
|
|
25
26
|
persistChanges?: boolean;
|
|
26
27
|
}) {
|
|
27
28
|
super();
|
|
29
|
+
this.validateRoutes(routes);
|
|
28
30
|
this.routes = this.sortRoutesByPriority(routes);
|
|
29
31
|
this.storageManager = options?.storageManager;
|
|
30
32
|
this.persistChanges = options?.persistChanges ?? !!this.storageManager;
|
|
@@ -41,6 +43,32 @@ export class EmailRouter extends EventEmitter {
|
|
|
41
43
|
public async initialize(): Promise<void> {
|
|
42
44
|
await this.initializationPromise;
|
|
43
45
|
}
|
|
46
|
+
|
|
47
|
+
private validateRoute(route: IEmailRoute): void {
|
|
48
|
+
if (!route?.name || !route.match || !route.action) {
|
|
49
|
+
throw new Error('Invalid route: missing required fields');
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
if (route.action.type !== 'store') {
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
if (!route.action.store) {
|
|
56
|
+
throw new Error(`Store route ${route.name} requires store configuration`);
|
|
57
|
+
}
|
|
58
|
+
assertValidRetentionDays(
|
|
59
|
+
route.action.store.retentionDays,
|
|
60
|
+
`Store route ${route.name}`,
|
|
61
|
+
);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
private validateRoutes(routes: IEmailRoute[]): void {
|
|
65
|
+
if (!Array.isArray(routes)) {
|
|
66
|
+
throw new Error('Invalid routes: expected an array');
|
|
67
|
+
}
|
|
68
|
+
for (const route of routes) {
|
|
69
|
+
this.validateRoute(route);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
44
72
|
|
|
45
73
|
/**
|
|
46
74
|
* Sort routes by priority (higher priority first)
|
|
@@ -69,6 +97,7 @@ export class EmailRouter extends EventEmitter {
|
|
|
69
97
|
* @param persist Whether to persist changes (defaults to persistChanges setting)
|
|
70
98
|
*/
|
|
71
99
|
public async updateRoutes(routes: IEmailRoute[], persist?: boolean): Promise<void> {
|
|
100
|
+
this.validateRoutes(routes);
|
|
72
101
|
this.routes = this.sortRoutesByPriority(routes);
|
|
73
102
|
this.clearCache();
|
|
74
103
|
this.emit('routesUpdated', this.routes);
|
|
@@ -409,11 +438,7 @@ export class EmailRouter extends EventEmitter {
|
|
|
409
438
|
|
|
410
439
|
try {
|
|
411
440
|
// Validate all routes before saving
|
|
412
|
-
|
|
413
|
-
if (!route.name || !route.match || !route.action) {
|
|
414
|
-
throw new Error(`Invalid route: ${JSON.stringify(route)}`);
|
|
415
|
-
}
|
|
416
|
-
}
|
|
441
|
+
this.validateRoutes(this.routes);
|
|
417
442
|
|
|
418
443
|
const routesData = JSON.stringify(this.routes, null, 2);
|
|
419
444
|
await this.storageManager.set('/email/routes/config.json', routesData);
|
|
@@ -447,13 +472,7 @@ export class EmailRouter extends EventEmitter {
|
|
|
447
472
|
|
|
448
473
|
const loadedRoutes = JSON.parse(routesData) as IEmailRoute[];
|
|
449
474
|
|
|
450
|
-
|
|
451
|
-
for (const route of loadedRoutes) {
|
|
452
|
-
if (!route.name || !route.match || !route.action) {
|
|
453
|
-
console.warn(`Skipping invalid route: ${JSON.stringify(route)}`);
|
|
454
|
-
continue;
|
|
455
|
-
}
|
|
456
|
-
}
|
|
475
|
+
this.validateRoutes(loadedRoutes);
|
|
457
476
|
|
|
458
477
|
if (options?.replace) {
|
|
459
478
|
// Replace all routes
|
|
@@ -491,10 +510,7 @@ export class EmailRouter extends EventEmitter {
|
|
|
491
510
|
* @param persist Whether to persist changes
|
|
492
511
|
*/
|
|
493
512
|
public async addRoute(route: IEmailRoute, persist?: boolean): Promise<void> {
|
|
494
|
-
|
|
495
|
-
if (!route.name || !route.match || !route.action) {
|
|
496
|
-
throw new Error('Invalid route: missing required fields');
|
|
497
|
-
}
|
|
513
|
+
this.validateRoute(route);
|
|
498
514
|
|
|
499
515
|
// Check if route already exists
|
|
500
516
|
const existingIndex = this.routes.findIndex(r => r.name === route.name);
|
|
@@ -547,10 +563,7 @@ export class EmailRouter extends EventEmitter {
|
|
|
547
563
|
* @param persist Whether to persist changes
|
|
548
564
|
*/
|
|
549
565
|
public async updateRoute(name: string, route: IEmailRoute, persist?: boolean): Promise<void> {
|
|
550
|
-
|
|
551
|
-
if (!route.name || !route.match || !route.action) {
|
|
552
|
-
throw new Error('Invalid route: missing required fields');
|
|
553
|
-
}
|
|
566
|
+
this.validateRoute(route);
|
|
554
567
|
|
|
555
568
|
const index = this.routes.findIndex(r => r.name === name);
|
|
556
569
|
|