@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.
Files changed (43) hide show
  1. package/changelog.md +51 -0
  2. package/dist_rust/mailer-bin_linux_amd64 +0 -0
  3. package/dist_rust/mailer-bin_linux_arm64 +0 -0
  4. package/dist_ts/00_commitinfo_data.js +1 -1
  5. package/dist_ts/index.d.ts +6 -0
  6. package/dist_ts/index.js +7 -1
  7. package/dist_ts/mail/delivery/classes.delivery.queue.d.ts +43 -3
  8. package/dist_ts/mail/delivery/classes.delivery.queue.js +310 -10
  9. package/dist_ts/mail/delivery/classes.delivery.system.d.ts +13 -2
  10. package/dist_ts/mail/delivery/classes.delivery.system.js +106 -36
  11. package/dist_ts/mail/interfaces.storage.d.ts +34 -0
  12. package/dist_ts/mail/interfaces.storage.js +89 -3
  13. package/dist_ts/mail/routing/classes.domain.registry.js +5 -1
  14. package/dist_ts/mail/routing/classes.email.action.executor.d.ts +15 -0
  15. package/dist_ts/mail/routing/classes.email.action.executor.js +38 -13
  16. package/dist_ts/mail/routing/classes.email.router.d.ts +2 -0
  17. package/dist_ts/mail/routing/classes.email.router.js +28 -21
  18. package/dist_ts/mail/routing/classes.unified.email.server.d.ts +156 -4
  19. package/dist_ts/mail/routing/classes.unified.email.server.js +1001 -61
  20. package/dist_ts/mail/routing/functions.routing.validation.d.ts +8 -0
  21. package/dist_ts/mail/routing/functions.routing.validation.js +18 -0
  22. package/dist_ts/mail/routing/interfaces.d.ts +11 -1
  23. package/dist_ts/plugins.d.ts +2 -1
  24. package/dist_ts/plugins.js +3 -2
  25. package/dist_ts/security/classes.rustsecuritybridge.d.ts +32 -1
  26. package/dist_ts/security/classes.rustsecuritybridge.js +13 -1
  27. package/dist_ts/security/index.d.ts +1 -1
  28. package/dist_ts/security/index.js +1 -1
  29. package/package.json +1 -1
  30. package/ts/00_commitinfo_data.ts +1 -1
  31. package/ts/index.ts +6 -0
  32. package/ts/mail/delivery/classes.delivery.queue.ts +429 -7
  33. package/ts/mail/delivery/classes.delivery.system.ts +137 -41
  34. package/ts/mail/interfaces.storage.ts +148 -2
  35. package/ts/mail/routing/classes.domain.registry.ts +4 -0
  36. package/ts/mail/routing/classes.email.action.executor.ts +97 -13
  37. package/ts/mail/routing/classes.email.router.ts +33 -20
  38. package/ts/mail/routing/classes.unified.email.server.ts +1367 -74
  39. package/ts/mail/routing/functions.routing.validation.ts +36 -0
  40. package/ts/mail/routing/interfaces.ts +13 -1
  41. package/ts/plugins.ts +2 -0
  42. package/ts/security/classes.rustsecuritybridge.ts +46 -1
  43. 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
- for (const route of this.routes) {
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
- // Validate loaded routes
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
- // Validate route
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
- // Validate route
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