@push.rocks/smartmta 6.5.2 → 8.0.0

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 (84) hide show
  1. package/changelog.md +40 -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/functions.errors.d.ts +3 -0
  6. package/dist_ts/functions.errors.js +8 -0
  7. package/dist_ts/index.d.ts +3 -0
  8. package/dist_ts/index.js +4 -1
  9. package/dist_ts/mail/core/classes.bouncemanager.d.ts +16 -12
  10. package/dist_ts/mail/core/classes.bouncemanager.js +146 -129
  11. package/dist_ts/mail/core/classes.email.js +15 -13
  12. package/dist_ts/mail/core/classes.emailvalidator.d.ts +3 -3
  13. package/dist_ts/mail/core/classes.emailvalidator.js +7 -5
  14. package/dist_ts/mail/core/classes.templatemanager.d.ts +10 -6
  15. package/dist_ts/mail/core/classes.templatemanager.js +35 -51
  16. package/dist_ts/mail/delivery/classes.delivery.queue.d.ts +92 -22
  17. package/dist_ts/mail/delivery/classes.delivery.queue.js +738 -151
  18. package/dist_ts/mail/delivery/classes.delivery.system.d.ts +13 -7
  19. package/dist_ts/mail/delivery/classes.delivery.system.js +458 -145
  20. package/dist_ts/mail/delivery/classes.unified.rate.limiter.js +9 -8
  21. package/dist_ts/mail/delivery/functions.safe-observers.d.ts +10 -0
  22. package/dist_ts/mail/delivery/functions.safe-observers.js +37 -0
  23. package/dist_ts/mail/delivery/interfaces.d.ts +21 -0
  24. package/dist_ts/mail/delivery/interfaces.js +1 -1
  25. package/dist_ts/mail/interfaces.storage.d.ts +37 -6
  26. package/dist_ts/mail/interfaces.storage.js +33 -3
  27. package/dist_ts/mail/routing/classes.dkim.manager.d.ts +10 -6
  28. package/dist_ts/mail/routing/classes.dkim.manager.js +47 -31
  29. package/dist_ts/mail/routing/classes.dns.manager.d.ts +7 -5
  30. package/dist_ts/mail/routing/classes.dns.manager.js +22 -11
  31. package/dist_ts/mail/routing/classes.email.action.executor.d.ts +2 -1
  32. package/dist_ts/mail/routing/classes.email.action.executor.js +45 -16
  33. package/dist_ts/mail/routing/classes.email.router.d.ts +5 -2
  34. package/dist_ts/mail/routing/classes.email.router.js +17 -12
  35. package/dist_ts/mail/routing/classes.unified.email.server.d.ts +12 -6
  36. package/dist_ts/mail/routing/classes.unified.email.server.js +69 -78
  37. package/dist_ts/mail/routing/interfaces.d.ts +0 -2
  38. package/dist_ts/mail/security/classes.dkimcreator.d.ts +22 -45
  39. package/dist_ts/mail/security/classes.dkimcreator.js +93 -296
  40. package/dist_ts/mail/security/classes.spfverifier.js +5 -3
  41. package/dist_ts/paths.d.ts +0 -12
  42. package/dist_ts/paths.js +3 -36
  43. package/dist_ts/plugins.d.ts +2 -5
  44. package/dist_ts/plugins.js +3 -6
  45. package/dist_ts/security/classes.contentscanner.js +14 -12
  46. package/dist_ts/security/classes.ipreputationchecker.d.ts +9 -6
  47. package/dist_ts/security/classes.ipreputationchecker.js +42 -93
  48. package/dist_ts/security/classes.rustsecuritybridge.d.ts +52 -4
  49. package/dist_ts/security/classes.rustsecuritybridge.js +201 -4
  50. package/dist_ts/security/classes.securitylogger.js +7 -5
  51. package/dist_ts/security/index.d.ts +1 -1
  52. package/dist_ts/security/index.js +2 -2
  53. package/package.json +8 -9
  54. package/readme.hints.md +4 -3
  55. package/readme.md +50 -18
  56. package/readme.plan.md +6 -0
  57. package/ts/00_commitinfo_data.ts +1 -1
  58. package/ts/functions.errors.ts +8 -0
  59. package/ts/index.ts +3 -0
  60. package/ts/mail/core/classes.bouncemanager.ts +188 -155
  61. package/ts/mail/core/classes.email.ts +20 -14
  62. package/ts/mail/core/classes.emailvalidator.ts +9 -7
  63. package/ts/mail/core/classes.templatemanager.ts +42 -57
  64. package/ts/mail/delivery/classes.delivery.queue.ts +996 -185
  65. package/ts/mail/delivery/classes.delivery.system.ts +583 -170
  66. package/ts/mail/delivery/classes.unified.rate.limiter.ts +9 -8
  67. package/ts/mail/delivery/functions.safe-observers.ts +45 -0
  68. package/ts/mail/delivery/interfaces.ts +27 -1
  69. package/ts/mail/interfaces.storage.ts +64 -10
  70. package/ts/mail/routing/classes.dkim.manager.ts +65 -40
  71. package/ts/mail/routing/classes.dns.manager.ts +39 -16
  72. package/ts/mail/routing/classes.email.action.executor.ts +64 -17
  73. package/ts/mail/routing/classes.email.router.ts +20 -13
  74. package/ts/mail/routing/classes.unified.email.server.ts +107 -86
  75. package/ts/mail/routing/interfaces.ts +0 -2
  76. package/ts/mail/security/classes.dkimcreator.ts +150 -355
  77. package/ts/mail/security/classes.spfverifier.ts +4 -2
  78. package/ts/paths.ts +2 -41
  79. package/ts/plugins.ts +1 -6
  80. package/ts/security/classes.contentscanner.ts +14 -12
  81. package/ts/security/classes.ipreputationchecker.ts +46 -99
  82. package/ts/security/classes.rustsecuritybridge.ts +272 -6
  83. package/ts/security/classes.securitylogger.ts +6 -4
  84. package/ts/security/index.ts +5 -1
@@ -1,17 +1,47 @@
1
1
  import { EventEmitter } from 'node:events';
2
+ import type { IBlobStorageManager } from '../interfaces.storage.js';
2
3
  import { type EmailProcessingMode } from './interfaces.js';
4
+ import type { ISmtpTransactionAttempt } from './interfaces.js';
3
5
  import type { IEmailRoute } from '../routing/interfaces.js';
6
+ import { Email } from '../core/classes.email.js';
4
7
  /**
5
8
  * Queue item status
6
9
  */
7
10
  export type QueueItemStatus = 'pending' | 'processing' | 'delivered' | 'failed' | 'deferred';
11
+ export type TRecipientDeliveryState = 'unresolved' | 'delivered' | 'permanentFailure';
12
+ export interface IRecipientDeliveryState {
13
+ recipient: string;
14
+ normalizedRecipient: string;
15
+ state: TRecipientDeliveryState;
16
+ smtpCode?: number;
17
+ smtpResponse?: string;
18
+ updatedAt: Date;
19
+ }
20
+ export interface IRecipientPermanentFailure {
21
+ recipient: string;
22
+ smtpCode: number;
23
+ smtpResponse: string;
24
+ }
25
+ export interface IBounceOperation {
26
+ operationId: string;
27
+ kind: 'smtpFailure';
28
+ recipient: string;
29
+ normalizedRecipient: string;
30
+ smtpCode: number;
31
+ smtpResponse: string;
32
+ state: 'pending' | 'completed';
33
+ attempts: number;
34
+ nextAttempt: Date;
35
+ lastError?: string;
36
+ completedAt?: Date;
37
+ }
8
38
  /**
9
39
  * Queue item interface
10
40
  */
11
41
  export interface IQueueItem {
12
42
  id: string;
13
43
  processingMode: EmailProcessingMode;
14
- processingResult: any;
44
+ processingResult: Email;
15
45
  route?: IEmailRoute;
16
46
  status: QueueItemStatus;
17
47
  attempts: number;
@@ -20,13 +50,31 @@ export interface IQueueItem {
20
50
  createdAt: Date;
21
51
  updatedAt: Date;
22
52
  deliveredAt?: Date;
53
+ deliveredRecipients?: string[];
54
+ terminalRecipients?: string[];
55
+ recipientStates?: IRecipientDeliveryState[];
56
+ bounceOperations?: IBounceOperation[];
57
+ smtpTransactions?: ISmtpTransactionAttempt[];
58
+ }
59
+ export interface IQueueFailureOptions {
60
+ /** Unknown failures default to retryable so temporary internal faults do not lose mail. */
61
+ retryable?: boolean;
62
+ }
63
+ export interface IQueueFailureTransition {
64
+ updated: boolean;
65
+ status?: 'deferred' | 'failed';
66
+ terminal: boolean;
67
+ terminalReason?: 'permanent' | 'retry_exhausted';
23
68
  }
24
69
  /**
25
70
  * Queue options interface
26
71
  */
27
72
  export interface IQueueOptions {
28
- storageType?: 'memory' | 'disk';
29
- persistentPath?: string;
73
+ /** Persistence is always an explicit caller choice. */
74
+ storageMode: 'memory' | 'managed';
75
+ /** Required when storageMode is managed. */
76
+ storageManager?: IBlobStorageManager;
77
+ storagePrefix?: string;
30
78
  checkInterval?: number;
31
79
  maxQueueSize?: number;
32
80
  maxPerDestination?: number;
@@ -34,9 +82,6 @@ export interface IQueueOptions {
34
82
  baseRetryDelay?: number;
35
83
  maxRetryDelay?: number;
36
84
  }
37
- /**
38
- * Queue statistics interface
39
- */
40
85
  export interface IQueueStats {
41
86
  queueSize: number;
42
87
  status: {
@@ -68,15 +113,24 @@ export declare class UnifiedDeliveryQueue extends EventEmitter {
68
113
  private stats;
69
114
  private processing;
70
115
  private totalProcessed;
116
+ private ownsManagedPrefix;
117
+ private lifecycleState;
71
118
  /**
72
119
  * Create a new unified delivery queue
73
120
  * @param options Queue options
74
121
  */
75
122
  constructor(options: IQueueOptions);
123
+ private assertMutable;
124
+ private createInitialRecipientStates;
125
+ private createBounceOperationId;
76
126
  /**
77
127
  * Initialize the queue
78
128
  */
79
- initialize(): Promise<void>;
129
+ private claimManagedPrefix;
130
+ private releaseManagedPrefix;
131
+ initialize(optionsArg?: {
132
+ startProcessing?: boolean;
133
+ }): Promise<void>;
80
134
  /**
81
135
  * Start queue processing
82
136
  */
@@ -95,7 +149,7 @@ export declare class UnifiedDeliveryQueue extends EventEmitter {
95
149
  * @param mode Processing mode
96
150
  * @param route Email route
97
151
  */
98
- enqueue(processingResult: any, mode: EmailProcessingMode, route?: IEmailRoute): Promise<string>;
152
+ enqueue(processingResult: Email, mode: EmailProcessingMode, route?: IEmailRoute): Promise<string>;
99
153
  /**
100
154
  * Get an item from the queue
101
155
  * @param id Item ID
@@ -117,26 +171,42 @@ export declare class UnifiedDeliveryQueue extends EventEmitter {
117
171
  * @param id Item ID
118
172
  * @param error Error message
119
173
  */
120
- markFailed(id: string, error: string): Promise<boolean>;
174
+ markFailed(id: string, error: string, optionsArg?: IQueueFailureOptions): Promise<boolean>;
175
+ /** Rich internal disposition used by the delivery system without breaking markFailed(). */
176
+ markFailedWithTransition(id: string, error: string, optionsArg?: IQueueFailureOptions): Promise<IQueueFailureTransition>;
177
+ /** Persist a completed SMTP attempt before any queue status event is emitted. */
178
+ appendSmtpTransaction(id: string, transaction: ISmtpTransactionAttempt): Promise<boolean>;
179
+ /** Record recipients accepted after the SMTP final-response 250 checkpoint. */
180
+ markRecipientsDelivered(id: string, recipients: string[]): Promise<boolean>;
181
+ /**
182
+ * Atomically checkpoint permanent recipient failures together with their
183
+ * durable bounce work. This is the sole 5xx recipient transition.
184
+ */
185
+ markRecipientsTerminal(id: string, failures: Array<string | IRecipientPermanentFailure>): Promise<string[]>;
186
+ getRecipientDisposition(id: string): {
187
+ unresolved: string[];
188
+ delivered: string[];
189
+ permanentFailures: string[];
190
+ };
191
+ /** Includes terminal queue items because bounce work outlives delivery status. */
192
+ listPendingBounceOperations(now?: Date): Array<{
193
+ itemId: string;
194
+ operation: IBounceOperation;
195
+ }>;
196
+ markBounceOperationCompleted(itemId: string, operationId: string): Promise<boolean>;
197
+ markBounceOperationFailed(itemId: string, operationId: string, error: string): Promise<boolean>;
121
198
  /**
122
199
  * Remove an item from the queue
123
200
  * @param id Item ID
124
201
  */
125
202
  removeItem(id: string): Promise<boolean>;
126
- /**
127
- * Persist an item to disk
128
- * @param item Item to persist
129
- */
203
+ private storageKey;
130
204
  private persistItem;
131
- /**
132
- * Remove an item from disk
133
- * @param id Item ID
134
- */
135
- private removeItemFromDisk;
136
- /**
137
- * Load queue items from disk
138
- */
139
- private loadFromDisk;
205
+ private serializeItem;
206
+ private applyPersistedMutation;
207
+ private removeItemFromStorage;
208
+ private deserializeItem;
209
+ private loadFromStorage;
140
210
  /**
141
211
  * Update queue statistics
142
212
  */