@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.
- package/changelog.md +40 -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/functions.errors.d.ts +3 -0
- package/dist_ts/functions.errors.js +8 -0
- package/dist_ts/index.d.ts +3 -0
- package/dist_ts/index.js +4 -1
- package/dist_ts/mail/core/classes.bouncemanager.d.ts +16 -12
- package/dist_ts/mail/core/classes.bouncemanager.js +146 -129
- package/dist_ts/mail/core/classes.email.js +15 -13
- package/dist_ts/mail/core/classes.emailvalidator.d.ts +3 -3
- package/dist_ts/mail/core/classes.emailvalidator.js +7 -5
- package/dist_ts/mail/core/classes.templatemanager.d.ts +10 -6
- package/dist_ts/mail/core/classes.templatemanager.js +35 -51
- package/dist_ts/mail/delivery/classes.delivery.queue.d.ts +92 -22
- package/dist_ts/mail/delivery/classes.delivery.queue.js +738 -151
- package/dist_ts/mail/delivery/classes.delivery.system.d.ts +13 -7
- package/dist_ts/mail/delivery/classes.delivery.system.js +458 -145
- package/dist_ts/mail/delivery/classes.unified.rate.limiter.js +9 -8
- package/dist_ts/mail/delivery/functions.safe-observers.d.ts +10 -0
- package/dist_ts/mail/delivery/functions.safe-observers.js +37 -0
- package/dist_ts/mail/delivery/interfaces.d.ts +21 -0
- package/dist_ts/mail/delivery/interfaces.js +1 -1
- package/dist_ts/mail/interfaces.storage.d.ts +37 -6
- package/dist_ts/mail/interfaces.storage.js +33 -3
- package/dist_ts/mail/routing/classes.dkim.manager.d.ts +10 -6
- package/dist_ts/mail/routing/classes.dkim.manager.js +47 -31
- package/dist_ts/mail/routing/classes.dns.manager.d.ts +7 -5
- package/dist_ts/mail/routing/classes.dns.manager.js +22 -11
- package/dist_ts/mail/routing/classes.email.action.executor.d.ts +2 -1
- package/dist_ts/mail/routing/classes.email.action.executor.js +45 -16
- package/dist_ts/mail/routing/classes.email.router.d.ts +5 -2
- package/dist_ts/mail/routing/classes.email.router.js +17 -12
- package/dist_ts/mail/routing/classes.unified.email.server.d.ts +12 -6
- package/dist_ts/mail/routing/classes.unified.email.server.js +69 -78
- package/dist_ts/mail/routing/interfaces.d.ts +0 -2
- package/dist_ts/mail/security/classes.dkimcreator.d.ts +22 -45
- package/dist_ts/mail/security/classes.dkimcreator.js +93 -296
- package/dist_ts/mail/security/classes.spfverifier.js +5 -3
- package/dist_ts/paths.d.ts +0 -12
- package/dist_ts/paths.js +3 -36
- package/dist_ts/plugins.d.ts +2 -5
- package/dist_ts/plugins.js +3 -6
- package/dist_ts/security/classes.contentscanner.js +14 -12
- package/dist_ts/security/classes.ipreputationchecker.d.ts +9 -6
- package/dist_ts/security/classes.ipreputationchecker.js +42 -93
- package/dist_ts/security/classes.rustsecuritybridge.d.ts +52 -4
- package/dist_ts/security/classes.rustsecuritybridge.js +201 -4
- package/dist_ts/security/classes.securitylogger.js +7 -5
- package/dist_ts/security/index.d.ts +1 -1
- package/dist_ts/security/index.js +2 -2
- package/package.json +8 -9
- package/readme.hints.md +4 -3
- package/readme.md +50 -18
- package/readme.plan.md +6 -0
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/functions.errors.ts +8 -0
- package/ts/index.ts +3 -0
- package/ts/mail/core/classes.bouncemanager.ts +188 -155
- package/ts/mail/core/classes.email.ts +20 -14
- package/ts/mail/core/classes.emailvalidator.ts +9 -7
- package/ts/mail/core/classes.templatemanager.ts +42 -57
- package/ts/mail/delivery/classes.delivery.queue.ts +996 -185
- package/ts/mail/delivery/classes.delivery.system.ts +583 -170
- package/ts/mail/delivery/classes.unified.rate.limiter.ts +9 -8
- package/ts/mail/delivery/functions.safe-observers.ts +45 -0
- package/ts/mail/delivery/interfaces.ts +27 -1
- package/ts/mail/interfaces.storage.ts +64 -10
- package/ts/mail/routing/classes.dkim.manager.ts +65 -40
- package/ts/mail/routing/classes.dns.manager.ts +39 -16
- package/ts/mail/routing/classes.email.action.executor.ts +64 -17
- package/ts/mail/routing/classes.email.router.ts +20 -13
- package/ts/mail/routing/classes.unified.email.server.ts +107 -86
- package/ts/mail/routing/interfaces.ts +0 -2
- package/ts/mail/security/classes.dkimcreator.ts +150 -355
- package/ts/mail/security/classes.spfverifier.ts +4 -2
- package/ts/paths.ts +2 -41
- package/ts/plugins.ts +1 -6
- package/ts/security/classes.contentscanner.ts +14 -12
- package/ts/security/classes.ipreputationchecker.ts +46 -99
- package/ts/security/classes.rustsecuritybridge.ts +272 -6
- package/ts/security/classes.securitylogger.ts +6 -4
- 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:
|
|
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
|
-
|
|
29
|
-
|
|
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
|
-
|
|
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:
|
|
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
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
private
|
|
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
|
*/
|