@spinajs/email 2.0.481 → 2.0.482
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/lib/cjs/cli/EmailSrv.js +1 -1
- package/lib/cjs/config/email.d.ts +11 -1
- package/lib/cjs/config/email.d.ts.map +1 -1
- package/lib/cjs/config/email.js +9 -1
- package/lib/cjs/config/email.js.map +1 -1
- package/lib/cjs/events/EmailSendFailed.d.ts +44 -0
- package/lib/cjs/events/EmailSendFailed.d.ts.map +1 -0
- package/lib/cjs/events/EmailSendFailed.js +41 -0
- package/lib/cjs/events/EmailSendFailed.js.map +1 -0
- package/lib/cjs/index.d.ts +3 -1
- package/lib/cjs/index.d.ts.map +1 -1
- package/lib/cjs/index.js +32 -6
- package/lib/cjs/index.js.map +1 -1
- package/lib/cjs/interfaces.d.ts +39 -3
- package/lib/cjs/interfaces.d.ts.map +1 -1
- package/lib/cjs/interfaces.js.map +1 -1
- package/lib/cjs/jobs/EmailSend.d.ts +4 -3
- package/lib/cjs/jobs/EmailSend.d.ts.map +1 -1
- package/lib/cjs/jobs/EmailSend.js +7 -0
- package/lib/cjs/jobs/EmailSend.js.map +1 -1
- package/lib/cjs/schemas/email.smtp.configuration.d.ts +30 -3
- package/lib/cjs/schemas/email.smtp.configuration.d.ts.map +1 -1
- package/lib/cjs/schemas/email.smtp.configuration.js +18 -3
- package/lib/cjs/schemas/email.smtp.configuration.js.map +1 -1
- package/lib/mjs/cli/EmailSrv.js +1 -1
- package/lib/mjs/config/email.d.ts +11 -1
- package/lib/mjs/config/email.d.ts.map +1 -1
- package/lib/mjs/config/email.js +9 -1
- package/lib/mjs/config/email.js.map +1 -1
- package/lib/mjs/events/EmailSendFailed.d.ts +44 -0
- package/lib/mjs/events/EmailSendFailed.d.ts.map +1 -0
- package/lib/mjs/events/EmailSendFailed.js +38 -0
- package/lib/mjs/events/EmailSendFailed.js.map +1 -0
- package/lib/mjs/index.d.ts +3 -1
- package/lib/mjs/index.d.ts.map +1 -1
- package/lib/mjs/index.js +32 -6
- package/lib/mjs/index.js.map +1 -1
- package/lib/mjs/interfaces.d.ts +39 -3
- package/lib/mjs/interfaces.d.ts.map +1 -1
- package/lib/mjs/interfaces.js.map +1 -1
- package/lib/mjs/jobs/EmailSend.d.ts +4 -3
- package/lib/mjs/jobs/EmailSend.d.ts.map +1 -1
- package/lib/mjs/jobs/EmailSend.js +8 -1
- package/lib/mjs/jobs/EmailSend.js.map +1 -1
- package/lib/mjs/schemas/email.smtp.configuration.d.ts +30 -3
- package/lib/mjs/schemas/email.smtp.configuration.d.ts.map +1 -1
- package/lib/mjs/schemas/email.smtp.configuration.js +18 -3
- package/lib/mjs/schemas/email.smtp.configuration.js.map +1 -1
- package/lib/tsconfig.cjs.tsbuildinfo +1 -1
- package/lib/tsconfig.mjs.tsbuildinfo +1 -1
- package/package.json +17 -18
package/lib/mjs/config/email.js
CHANGED
|
@@ -22,11 +22,18 @@ const email = {
|
|
|
22
22
|
* FS must be set in configuration on server/app that sends emails
|
|
23
23
|
*/
|
|
24
24
|
templateFs: "email-templates",
|
|
25
|
+
/**
|
|
26
|
+
* Default queue-level retry count for deferred emails.
|
|
27
|
+
*/
|
|
28
|
+
retry: {
|
|
29
|
+
count: 3,
|
|
30
|
+
},
|
|
25
31
|
},
|
|
26
32
|
queue: {
|
|
27
33
|
routing: {
|
|
28
|
-
|
|
34
|
+
EmailSend: { connection: 'email-queue-black-hole' },
|
|
29
35
|
EmailSent: { connection: 'email-queue-black-hole' },
|
|
36
|
+
EmailSendFailed: { connection: 'email-queue-black-hole' },
|
|
30
37
|
},
|
|
31
38
|
// by default we dont have queue server for sending emails
|
|
32
39
|
connections: [
|
|
@@ -35,6 +42,7 @@ const email = {
|
|
|
35
42
|
service: 'BlackHoleQueueClient',
|
|
36
43
|
defaultQueueChannel: 'email-jobs',
|
|
37
44
|
defaultTopicChannel: 'email-events',
|
|
45
|
+
defaultQueueDeadLetterChannel: 'email-jobs-dlq',
|
|
38
46
|
},
|
|
39
47
|
],
|
|
40
48
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"email.js","sourceRoot":"","sources":["../../../src/config/email.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAEhD,SAAS,GAAG,CAAC,IAAY;IACvB,MAAM,UAAU,GAAG,OAAO,MAAM,KAAK,WAAW,CAAC;IACjD,OAAO;QACL,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,OAAO,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,UAAU,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;QAExJ,4CAA4C;QAC5C,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,OAAO,CAAC,GAAG,EAAE,EAAC,KAAK,EAAC,cAAc,EAAE,UAAU,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;KAC9J,CAAC;AACJ,CAAC;AAED,MAAM,KAAK,GAAG;IACZ,MAAM,EAAE;QACN,IAAI,EAAE;YACJ,GAAG,EAAE,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC;YACpB,IAAI,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC;SACvB;KACF;IACD,KAAK,EAAE;QACL,kCAAkC;QAClC,KAAK,EAAE,wBAAwB;QAE/B;;;WAGG;QACH,UAAU,EAAE,iBAAiB;
|
|
1
|
+
{"version":3,"file":"email.js","sourceRoot":"","sources":["../../../src/config/email.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAEhD,SAAS,GAAG,CAAC,IAAY;IACvB,MAAM,UAAU,GAAG,OAAO,MAAM,KAAK,WAAW,CAAC;IACjD,OAAO;QACL,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,OAAO,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,UAAU,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;QAExJ,4CAA4C;QAC5C,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,IAAI,OAAO,CAAC,GAAG,EAAE,EAAC,KAAK,EAAC,cAAc,EAAE,UAAU,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;KAC9J,CAAC;AACJ,CAAC;AAED,MAAM,KAAK,GAAG;IACZ,MAAM,EAAE;QACN,IAAI,EAAE;YACJ,GAAG,EAAE,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC;YACpB,IAAI,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC;SACvB;KACF;IACD,KAAK,EAAE;QACL,kCAAkC;QAClC,KAAK,EAAE,wBAAwB;QAE/B;;;WAGG;QACH,UAAU,EAAE,iBAAiB;QAE7B;;WAEG;QACH,KAAK,EAAE;YACL,KAAK,EAAE,CAAC;SACT;KACF;IACD,KAAK,EAAE;QACL,OAAO,EAAE;YACP,SAAS,EAAE,EAAE,UAAU,EAAE,wBAAwB,EAAE;YACnD,SAAS,EAAE,EAAE,UAAU,EAAE,wBAAwB,EAAE;YACnD,eAAe,EAAE,EAAE,UAAU,EAAE,wBAAwB,EAAE;SAC1D;QAED,0DAA0D;QAC1D,WAAW,EAAE;YACX;gBACE,IAAI,EAAE,wBAAwB;gBAC9B,OAAO,EAAE,sBAAsB;gBAC/B,mBAAmB,EAAE,YAAY;gBACjC,mBAAmB,EAAE,cAAc;gBACnC,6BAA6B,EAAE,gBAAgB;aAChD;SACF;KACF;CACF,CAAC;AAEF,eAAe,KAAK,CAAC"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { QueueEvent, IJobFailureContext } from '@spinajs/queue';
|
|
2
|
+
import { DateTime } from 'luxon';
|
|
3
|
+
import { IEmail, IEmailTemplate } from '../interfaces.js';
|
|
4
|
+
/**
|
|
5
|
+
* Emitted when a deferred email job has finally failed ( retries exhausted ).
|
|
6
|
+
* Carries only wire-safe fields so it can be routed to alerting / dead-letter handling.
|
|
7
|
+
*/
|
|
8
|
+
export declare class EmailSendFailed extends QueueEvent {
|
|
9
|
+
Connection?: string;
|
|
10
|
+
From: string;
|
|
11
|
+
To: string[];
|
|
12
|
+
Subject: string;
|
|
13
|
+
/**
|
|
14
|
+
* Email template eg. pug file or mustashe
|
|
15
|
+
*/
|
|
16
|
+
Template?: string | IEmailTemplate;
|
|
17
|
+
/**
|
|
18
|
+
* Additional tag for email, usefull for identyfying emails by category or module that sends it
|
|
19
|
+
*/
|
|
20
|
+
Tag?: string;
|
|
21
|
+
/**
|
|
22
|
+
* Unique email id, for identification eg. in case of delivery failure
|
|
23
|
+
*/
|
|
24
|
+
EmailId?: string;
|
|
25
|
+
/**
|
|
26
|
+
* Id of the failed queue job.
|
|
27
|
+
*/
|
|
28
|
+
JobId?: string;
|
|
29
|
+
/**
|
|
30
|
+
* Failure reason - message only, so it stays wire-safe ( no stack / PII ).
|
|
31
|
+
*/
|
|
32
|
+
Error: string;
|
|
33
|
+
/**
|
|
34
|
+
* The attempt number that finally failed.
|
|
35
|
+
*/
|
|
36
|
+
Attempt?: number;
|
|
37
|
+
/**
|
|
38
|
+
* The total allowed executions for the job ( retries + 1 ).
|
|
39
|
+
*/
|
|
40
|
+
MaxAttempts?: number;
|
|
41
|
+
FailedAt: DateTime;
|
|
42
|
+
constructor(email: IEmail, err: unknown, ctx?: IJobFailureContext);
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=EmailSendFailed.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EmailSendFailed.d.ts","sourceRoot":"","sources":["../../../src/events/EmailSendFailed.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAS,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACvE,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACjC,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAE1D;;;GAGG;AACH,qBACa,eAAgB,SAAQ,UAAU;IACtC,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB,IAAI,EAAE,MAAM,CAAC;IAEb,EAAE,EAAE,MAAM,EAAE,CAAC;IAEb,OAAO,EAAE,MAAM,CAAC;IAEvB;;OAEG;IACI,QAAQ,CAAC,EAAE,MAAM,GAAG,cAAc,CAAC;IAE1C;;OAEG;IACI,GAAG,CAAC,EAAE,MAAM,CAAC;IAEpB;;OAEG;IACI,OAAO,CAAC,EAAE,MAAM,CAAC;IAExB;;OAEG;IACI,KAAK,CAAC,EAAE,MAAM,CAAC;IAEtB;;OAEG;IACI,KAAK,EAAE,MAAM,CAAC;IAErB;;OAEG;IACI,OAAO,CAAC,EAAE,MAAM,CAAC;IAExB;;OAEG;IACI,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,QAAQ,EAAE,QAAQ,CAAC;gBAEd,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,CAAC,EAAE,kBAAkB;CAmBlE"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
8
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
9
|
+
};
|
|
10
|
+
import { QueueEvent, Event } from '@spinajs/queue';
|
|
11
|
+
import { DateTime } from 'luxon';
|
|
12
|
+
/**
|
|
13
|
+
* Emitted when a deferred email job has finally failed ( retries exhausted ).
|
|
14
|
+
* Carries only wire-safe fields so it can be routed to alerting / dead-letter handling.
|
|
15
|
+
*/
|
|
16
|
+
let EmailSendFailed = class EmailSendFailed extends QueueEvent {
|
|
17
|
+
constructor(email, err, ctx) {
|
|
18
|
+
super();
|
|
19
|
+
this.Connection = email.connection;
|
|
20
|
+
this.From = email.from ?? '';
|
|
21
|
+
this.To = email.to;
|
|
22
|
+
this.Subject = email.subject;
|
|
23
|
+
this.Template = email.template;
|
|
24
|
+
this.Tag = email.tag;
|
|
25
|
+
this.EmailId = email.emailId;
|
|
26
|
+
this.JobId = ctx?.jobId;
|
|
27
|
+
this.Attempt = ctx?.attempt;
|
|
28
|
+
this.MaxAttempts = ctx?.maxAttempts;
|
|
29
|
+
this.Error = err instanceof Error ? err.message : String(err);
|
|
30
|
+
this.FailedAt = DateTime.now();
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
EmailSendFailed = __decorate([
|
|
34
|
+
Event(),
|
|
35
|
+
__metadata("design:paramtypes", [Object, Object, Object])
|
|
36
|
+
], EmailSendFailed);
|
|
37
|
+
export { EmailSendFailed };
|
|
38
|
+
//# sourceMappingURL=EmailSendFailed.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EmailSendFailed.js","sourceRoot":"","sources":["../../../src/events/EmailSendFailed.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,UAAU,EAAE,KAAK,EAAsB,MAAM,gBAAgB,CAAC;AACvE,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAGjC;;;GAGG;AAEI,IAAM,eAAe,GAArB,MAAM,eAAgB,SAAQ,UAAU;IA8C7C,YAAY,KAAa,EAAE,GAAY,EAAE,GAAwB;QAC/D,KAAK,EAAE,CAAC;QAER,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC,UAAU,CAAC;QACnC,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC;QAC7B,IAAI,CAAC,EAAE,GAAG,KAAK,CAAC,EAAE,CAAC;QACnB,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;QAC7B,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC;QAC/B,IAAI,CAAC,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC;QACrB,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;QAE7B,IAAI,CAAC,KAAK,GAAG,GAAG,EAAE,KAAK,CAAC;QACxB,IAAI,CAAC,OAAO,GAAG,GAAG,EAAE,OAAO,CAAC;QAC5B,IAAI,CAAC,WAAW,GAAG,GAAG,EAAE,WAAW,CAAC;QAEpC,IAAI,CAAC,KAAK,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAE9D,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC,GAAG,EAAE,CAAC;IACjC,CAAC;CACF,CAAA;AAjEY,eAAe;IAD3B,KAAK,EAAE;;GACK,eAAe,CAiE3B"}
|
package/lib/mjs/index.d.ts
CHANGED
|
@@ -4,6 +4,8 @@ import { EmailSend } from './jobs/EmailSend.js';
|
|
|
4
4
|
export * from './interfaces.js';
|
|
5
5
|
export * from './transports.js';
|
|
6
6
|
export * from './jobs/EmailSend.js';
|
|
7
|
+
export * from './events/EmailSent.js';
|
|
8
|
+
export * from './events/EmailSendFailed.js';
|
|
7
9
|
export * from "./fp.js";
|
|
8
10
|
export declare class LogBotstrapper extends Bootstrapper {
|
|
9
11
|
bootstrap(): void;
|
|
@@ -20,6 +22,6 @@ export declare class DefaultEmailService extends EmailService {
|
|
|
20
22
|
*/
|
|
21
23
|
send(email: IEmail): Promise<void>;
|
|
22
24
|
sendDeferred(email: IEmail): Promise<EmailSend>;
|
|
23
|
-
|
|
25
|
+
processDeferredEmails(): Promise<void>;
|
|
24
26
|
}
|
|
25
27
|
//# sourceMappingURL=index.d.ts.map
|
package/lib/mjs/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAM,YAAY,EAAc,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAM,YAAY,EAAc,MAAM,aAAa,CAAC;AAE3D,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAGvD,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAEhD,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AACtC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,SAAS,CAAC;AAExB,qBACa,cAAe,SAAQ,YAAY;IACvC,SAAS,IAAI,IAAI;CAGzB;AAED;;GAEG;AACH,qBACa,mBAAoB,SAAQ,YAAY;IACnD;;;;;OAKG;IACU,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAiClC,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;IAoB/C,qBAAqB,IAAI,OAAO,CAAC,IAAI,CAAC;CAGpD"}
|
package/lib/mjs/index.js
CHANGED
|
@@ -6,6 +6,7 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
|
|
|
6
6
|
};
|
|
7
7
|
import { InvalidOperation } from '@spinajs/exceptions';
|
|
8
8
|
import { DI, Bootstrapper, Injectable } from '@spinajs/di';
|
|
9
|
+
import { Perf } from '@spinajs/log';
|
|
9
10
|
import { EmailService } from './interfaces.js';
|
|
10
11
|
import CONFIGURATION_SCHEMA from './schemas/email.smtp.configuration.js';
|
|
11
12
|
import { EmailSent } from './events/EmailSent.js';
|
|
@@ -13,6 +14,8 @@ import { EmailSend } from './jobs/EmailSend.js';
|
|
|
13
14
|
export * from './interfaces.js';
|
|
14
15
|
export * from './transports.js';
|
|
15
16
|
export * from './jobs/EmailSend.js';
|
|
17
|
+
export * from './events/EmailSent.js';
|
|
18
|
+
export * from './events/EmailSendFailed.js';
|
|
16
19
|
export * from "./fp.js";
|
|
17
20
|
let LogBotstrapper = class LogBotstrapper extends Bootstrapper {
|
|
18
21
|
bootstrap() {
|
|
@@ -34,16 +37,39 @@ let DefaultEmailService = class DefaultEmailService extends EmailService {
|
|
|
34
37
|
* @param email - email struct
|
|
35
38
|
*/
|
|
36
39
|
async send(email) {
|
|
37
|
-
|
|
38
|
-
|
|
40
|
+
const connection = email.connection;
|
|
41
|
+
if (!this.Senders.has(connection)) {
|
|
42
|
+
this.Log.error(`Email sender ${connection} not exists. Please check your configuration files.`);
|
|
43
|
+
Perf.count('email.send.failed', 1, { connection });
|
|
44
|
+
throw new InvalidOperation(`Email sender ${connection} not exists. Please check your configuration files.`);
|
|
45
|
+
}
|
|
46
|
+
try {
|
|
47
|
+
await Perf.measure('email.send', () => this.Senders.get(connection).send(email), { labels: { connection } });
|
|
48
|
+
}
|
|
49
|
+
catch (err) {
|
|
50
|
+
// full recipient addresses are PII - keep them at trace level only, log just the count otherwise.
|
|
51
|
+
this.Log.error(err, `Cannot send email on connection ${connection}, subject: ${email.subject}, recipients: ${email.to?.length ?? 0}`);
|
|
52
|
+
this.Log.trace(`Failed email recipients on connection ${connection}: ${(email.to ?? []).join(', ')}`);
|
|
53
|
+
Perf.count('email.send.failed', 1, { connection });
|
|
54
|
+
// rethrow the ORIGINAL error so the queue consumer sees the failure and can retry / dead-letter.
|
|
55
|
+
throw err;
|
|
56
|
+
}
|
|
57
|
+
Perf.count('email.sent', 1, { connection });
|
|
58
|
+
this.Log.info(`Email sent on connection ${connection}, subject: ${email.subject}, recipients: ${email.to?.length ?? 0}`);
|
|
59
|
+
// inform others of email event. Guard separately: rethrowing after a successful SMTP send
|
|
60
|
+
// would make the queue retry the job and send a DUPLICATE email.
|
|
61
|
+
try {
|
|
62
|
+
await this.Queue.emit(new EmailSent(email));
|
|
63
|
+
}
|
|
64
|
+
catch (err) {
|
|
65
|
+
this.Log.error(err, `Failed to emit EmailSent event on connection ${connection}, subject: ${email.subject}`);
|
|
39
66
|
}
|
|
40
|
-
await this.Senders.get(email.connection).send(email);
|
|
41
|
-
// inform others of email event
|
|
42
|
-
await this.Queue.emit(new EmailSent(email));
|
|
43
67
|
}
|
|
44
68
|
async sendDeferred(email) {
|
|
45
69
|
const dEmail = new EmailSend();
|
|
46
70
|
dEmail.hydrate(email);
|
|
71
|
+
// queue-level retry: per-email override wins, then config default, then 3.
|
|
72
|
+
dEmail.RetryCount = email.retryCount ?? this.Configuration.retry?.count ?? 3;
|
|
47
73
|
/** set queue schedule */
|
|
48
74
|
if (email.schedule) {
|
|
49
75
|
dEmail.ScheduleCron = email.schedule.cron;
|
|
@@ -54,7 +80,7 @@ let DefaultEmailService = class DefaultEmailService extends EmailService {
|
|
|
54
80
|
await this.Queue.emit(dEmail);
|
|
55
81
|
return dEmail;
|
|
56
82
|
}
|
|
57
|
-
async
|
|
83
|
+
async processDeferredEmails() {
|
|
58
84
|
await this.Queue.consume(EmailSend);
|
|
59
85
|
}
|
|
60
86
|
};
|
package/lib/mjs/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,EAAE,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC3D,OAAO,EAAU,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,oBAAoB,MAAM,uCAAuC,CAAC;AACzE,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAEhD,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,qBAAqB,CAAC;AACpC,cAAc,SAAS,CAAC;AAGjB,IAAM,cAAc,GAApB,MAAM,cAAe,SAAQ,YAAY;IACvC,SAAS;QACd,EAAE,CAAC,QAAQ,CAAC,oBAAoB,CAAC,CAAC,OAAO,CAAC,yBAAyB,CAAC,CAAC;IACvE,CAAC;CACF,CAAA;AAJY,cAAc;IAD1B,UAAU,CAAC,YAAY,CAAC;GACZ,cAAc,CAI1B;;AAED;;GAEG;AAEI,IAAM,mBAAmB,GAAzB,MAAM,mBAAoB,SAAQ,YAAY;IACnD;;;;;OAKG;IACI,KAAK,CAAC,IAAI,CAAC,KAAa;QAC7B,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,EAAE,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC3D,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AACpC,OAAO,EAAU,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACvD,OAAO,oBAAoB,MAAM,uCAAuC,CAAC;AACzE,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAEhD,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AACtC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,SAAS,CAAC;AAGjB,IAAM,cAAc,GAApB,MAAM,cAAe,SAAQ,YAAY;IACvC,SAAS;QACd,EAAE,CAAC,QAAQ,CAAC,oBAAoB,CAAC,CAAC,OAAO,CAAC,yBAAyB,CAAC,CAAC;IACvE,CAAC;CACF,CAAA;AAJY,cAAc;IAD1B,UAAU,CAAC,YAAY,CAAC;GACZ,cAAc,CAI1B;;AAED;;GAEG;AAEI,IAAM,mBAAmB,GAAzB,MAAM,mBAAoB,SAAQ,YAAY;IACnD;;;;;OAKG;IACI,KAAK,CAAC,IAAI,CAAC,KAAa;QAC7B,MAAM,UAAU,GAAG,KAAK,CAAC,UAAU,CAAC;QAEpC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;YAClC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,gBAAgB,UAAU,qDAAqD,CAAC,CAAC;YAChG,IAAI,CAAC,KAAK,CAAC,mBAAmB,EAAE,CAAC,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC;YACnD,MAAM,IAAI,gBAAgB,CAAC,gBAAgB,UAAU,qDAAqD,CAAC,CAAC;QAC9G,CAAC;QAED,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAE,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,UAAU,EAAE,EAAE,CAAC,CAAC;QAChH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,kGAAkG;YAClG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,mCAAmC,UAAU,cAAc,KAAK,CAAC,OAAO,iBAAiB,KAAK,CAAC,EAAE,EAAE,MAAM,IAAI,CAAC,EAAE,CAAC,CAAC;YACtI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,yCAAyC,UAAU,KAAK,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACtG,IAAI,CAAC,KAAK,CAAC,mBAAmB,EAAE,CAAC,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC;YAEnD,iGAAiG;YACjG,MAAM,GAAG,CAAC;QACZ,CAAC;QAED,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC;QAC5C,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,4BAA4B,UAAU,cAAc,KAAK,CAAC,OAAO,iBAAiB,KAAK,CAAC,EAAE,EAAE,MAAM,IAAI,CAAC,EAAE,CAAC,CAAC;QAEzH,0FAA0F;QAC1F,iEAAiE;QACjE,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;QAC9C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,gDAAgD,UAAU,cAAc,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QAC/G,CAAC;IACH,CAAC;IAEM,KAAK,CAAC,YAAY,CAAC,KAAa;QACrC,MAAM,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;QAC/B,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAEtB,2EAA2E;QAC3E,MAAM,CAAC,UAAU,GAAG,KAAK,CAAC,UAAU,IAAI,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,KAAK,IAAI,CAAC,CAAC;QAE7E,yBAAyB;QACzB,IAAG,KAAK,CAAC,QAAQ,EAAC,CAAC;YACjB,MAAM,CAAC,YAAY,GAAG,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC;YAC1C,MAAM,CAAC,aAAa,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC;YAC5C,MAAM,CAAC,cAAc,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC;YAC9C,MAAM,CAAC,cAAc,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC;QAChD,CAAC;QAED,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAE9B,OAAO,MAAM,CAAC;IAChB,CAAC;IAEM,KAAK,CAAC,qBAAqB;QAChC,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACtC,CAAC;CACF,CAAA;AA/DY,mBAAmB;IAD/B,UAAU,CAAC,YAAY,CAAC;GACZ,mBAAmB,CA+D/B"}
|
package/lib/mjs/interfaces.d.ts
CHANGED
|
@@ -88,6 +88,11 @@ export interface IEmail {
|
|
|
88
88
|
* Unique email id, for identification eg. in case of delivery failure
|
|
89
89
|
*/
|
|
90
90
|
emailId?: string;
|
|
91
|
+
/**
|
|
92
|
+
* Per-email override of the queue-level retry count used when the email is sent deferred.
|
|
93
|
+
* Falls back to `email.retry.count` configuration when not set.
|
|
94
|
+
*/
|
|
95
|
+
retryCount?: number;
|
|
91
96
|
/**
|
|
92
97
|
* Email delivery schedule. If we want to repeat email, schedule to send at specific time, send delayed etc..
|
|
93
98
|
*/
|
|
@@ -113,14 +118,27 @@ export interface IEmail {
|
|
|
113
118
|
export interface EmailConfiguration {
|
|
114
119
|
connections: EmailConnectionOptions[];
|
|
115
120
|
defaultConnection: string;
|
|
121
|
+
/**
|
|
122
|
+
* Default queue-level retry policy for deferred emails.
|
|
123
|
+
*/
|
|
124
|
+
retry?: {
|
|
125
|
+
/**
|
|
126
|
+
* How many times a deferred email job is retried on failure. Defaults to 3.
|
|
127
|
+
*/
|
|
128
|
+
count?: number;
|
|
129
|
+
};
|
|
116
130
|
}
|
|
117
131
|
export interface EmailConnectionOptions {
|
|
118
|
-
|
|
132
|
+
/**
|
|
133
|
+
* DI service name of the {@link EmailSender} implementation handling this connection.
|
|
134
|
+
* Selected via {@link AutoinjectService} ( reads the `service` key of each connection entry ).
|
|
135
|
+
*/
|
|
136
|
+
service: string;
|
|
119
137
|
name: string;
|
|
120
138
|
host?: string;
|
|
121
139
|
port?: number;
|
|
122
140
|
user?: string;
|
|
123
|
-
|
|
141
|
+
password?: string;
|
|
124
142
|
ssl?: boolean;
|
|
125
143
|
templates?: {
|
|
126
144
|
defaults?: any;
|
|
@@ -134,6 +152,24 @@ export interface EmailConnectionOptions {
|
|
|
134
152
|
*/
|
|
135
153
|
mailFrom?: string;
|
|
136
154
|
};
|
|
155
|
+
/**
|
|
156
|
+
* In-process SMTP send resilience ( retry / timeout ) applied by transports when
|
|
157
|
+
* talking to the SMTP server, independent of the queue-level job retry.
|
|
158
|
+
*/
|
|
159
|
+
resilience?: {
|
|
160
|
+
/**
|
|
161
|
+
* How many times the transport retries a failed SMTP send.
|
|
162
|
+
*/
|
|
163
|
+
retries?: number;
|
|
164
|
+
/**
|
|
165
|
+
* Delay ( ms ) between SMTP send retries.
|
|
166
|
+
*/
|
|
167
|
+
delay?: number;
|
|
168
|
+
/**
|
|
169
|
+
* Timeout ( ms ) for a single SMTP send attempt.
|
|
170
|
+
*/
|
|
171
|
+
timeout?: number;
|
|
172
|
+
};
|
|
137
173
|
/**
|
|
138
174
|
* Additional options passed
|
|
139
175
|
* lib specific
|
|
@@ -163,6 +199,6 @@ export declare abstract class EmailService extends AsyncService {
|
|
|
163
199
|
/**
|
|
164
200
|
* Subscribte to queue for emails to send
|
|
165
201
|
*/
|
|
166
|
-
abstract
|
|
202
|
+
abstract processDeferredEmails(): Promise<void>;
|
|
167
203
|
}
|
|
168
204
|
//# sourceMappingURL=interfaces.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../../src/interfaces.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAkB,gBAAgB,EAA6C,MAAM,aAAa,CAAC;AACxH,OAAO,EAAE,GAAG,EAAU,MAAM,cAAc,CAAC;AAE3C,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AACjC,8BAAsB,WAAY,SAAQ,YAAa,YAAW,gBAAgB;IACzE,OAAO,EAAE,sBAAsB,CAAC;IAGvC,SAAS,CAAC,qBAAqB,EAAE,MAAM,CAAC;IAExC,SAAS,CAAC,iBAAiB,EAAE,EAAE,CAAC;IAEhC,IAAW,WAAW,WAErB;IAED,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAE9B,OAAO;CASrB;AAED,qBAEa,oBAAqB,SAAQ,WAAW;IAKhC,OAAO,EAAE,sBAAsB;IAHlD,SAAS,CAAC,GAAG,EAAE,GAAG,CAAC;gBAGA,OAAO,EAAE,sBAAsB;IAIrC,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAIjD;AAED,MAAM,WAAW,iBAAiB;IAChC;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;IAEb;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;IAEb;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;OAEG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAE7B;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;IAEb;;OAEG;IACH,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,MAAM;IACrB,EAAE,EAAE,MAAM,EAAE,CAAC;IAEb,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC;IAEd,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC;IAEf;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd,UAAU,EAAE,MAAM,CAAC;IAEnB,YAAY,CAAC,EAAE,iBAAiB,EAAE,CAAC;IAEnC;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,GAAG,cAAc,CAAC;IAEnC;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB;;OAEG;IACH,KAAK,CAAC,EAAE,GAAG,CAAC;IAEZ;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd,OAAO,EAAE,MAAM,CAAC;IAEhB,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;;OAGG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;IAEb;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;OAEG;IACH,QAAQ,CAAC,EAAE;QAET;;WAEG;QACH,IAAI,CAAC,EAAE,MAAM,CAAC;QAEd;;WAEG;QACH,KAAK,CAAC,EAAE,MAAM,CAAC;QAEf;;WAEG;QACH,MAAM,CAAC,EAAE,MAAM,CAAC;QAEhB;;WAEG;QACH,MAAM,CAAC,EAAE,MAAM,CAAA;KAEhB,CAAA;CACF;AAED,MAAM,WAAW,kBAAkB;IACjC,WAAW,EAAE,sBAAsB,EAAE,CAAC;IACtC,iBAAiB,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../../src/interfaces.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interfaces.js","sourceRoot":"","sources":["../../src/interfaces.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,EAAE,EAAoB,UAAU,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACxH,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,iBAAiB,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AACnE,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAG9C,MAAM,OAAgB,WAAY,SAAQ,YAAY;IAQpD,IAAW,WAAW;QACpB,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;IAC3B,CAAC;IAIM,KAAK,CAAC,OAAO;QAClB,IAAI,IAAI,CAAC,qBAAqB,EAAE,CAAC;YAC/B,IAAI,CAAC,iBAAiB,GAAG,EAAE,CAAC,OAAO,CAAC,mBAAmB,EAAE,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC;YAEvF,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC;gBAC5B,MAAM,IAAI,gBAAgB,CAAC,oCAAoC,GAAG,IAAI,CAAC,qBAAqB,GAAG,4GAA4G,GAAG,IAAI,CAAC,qBAAqB,GAAG,gBAAgB,CAAC,CAAC;YAC/P,CAAC;QACH,CAAC;IACH,CAAC;CACF;AAnBW;IADT,MAAM,CAAC,kBAAkB,CAAC;;0DACa;AAuBnC,IAAM,oBAAoB,GAA1B,MAAM,oBAAqB,SAAQ,WAAW;IAKnD,YAAmB,OAA+B;QAChD,KAAK,EAAE,CAAC;QADS,YAAO,GAAP,OAAO,CAAwB;IAElD,CAAC;IAEM,KAAK,CAAC,IAAI,CAAC,MAAc;QAC9B,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,MAAM,CAAC,OAAO,qBAAqB,CAAC,CAAC;QAC5D,OAAO;IACT,CAAC;CACF,CAAA;AAXW;IADT,MAAM,CAAC,OAAO,CAAC;8BACD,GAAG;iDAAC;AAFR,oBAAoB;IAFhC,UAAU,CAAC,WAAW,CAAC;IACvB,WAAW,EAAE;;GACD,oBAAoB,CAahC;;
|
|
1
|
+
{"version":3,"file":"interfaces.js","sourceRoot":"","sources":["../../src/interfaces.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,EAAE,EAAoB,UAAU,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACxH,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,iBAAiB,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AACnE,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAG9C,MAAM,OAAgB,WAAY,SAAQ,YAAY;IAQpD,IAAW,WAAW;QACpB,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;IAC3B,CAAC;IAIM,KAAK,CAAC,OAAO;QAClB,IAAI,IAAI,CAAC,qBAAqB,EAAE,CAAC;YAC/B,IAAI,CAAC,iBAAiB,GAAG,EAAE,CAAC,OAAO,CAAC,mBAAmB,EAAE,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC;YAEvF,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC;gBAC5B,MAAM,IAAI,gBAAgB,CAAC,oCAAoC,GAAG,IAAI,CAAC,qBAAqB,GAAG,4GAA4G,GAAG,IAAI,CAAC,qBAAqB,GAAG,gBAAgB,CAAC,CAAC;YAC/P,CAAC;QACH,CAAC;IACH,CAAC;CACF;AAnBW;IADT,MAAM,CAAC,kBAAkB,CAAC;;0DACa;AAuBnC,IAAM,oBAAoB,GAA1B,MAAM,oBAAqB,SAAQ,WAAW;IAKnD,YAAmB,OAA+B;QAChD,KAAK,EAAE,CAAC;QADS,YAAO,GAAP,OAAO,CAAwB;IAElD,CAAC;IAEM,KAAK,CAAC,IAAI,CAAC,MAAc;QAC9B,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,MAAM,CAAC,OAAO,qBAAqB,CAAC,CAAC;QAC5D,OAAO;IACT,CAAC;CACF,CAAA;AAXW;IADT,MAAM,CAAC,OAAO,CAAC;8BACD,GAAG;iDAAC;AAFR,oBAAoB;IAFhC,UAAU,CAAC,WAAW,CAAC;IACvB,WAAW,EAAE;;GACD,oBAAoB,CAahC;;AAuMD,MAAM,OAAgB,YAAa,SAAQ,YAAY;CAmCtD;AAjCW;IADT,MAAM,CAAC,OAAO,CAAC;8BACD,GAAG;yCAAC;AAGT;IADT,iBAAiB,CAAC,mBAAmB,EAAE,WAAW,CAAC;8BACjC,GAAG;6CAAsB;AAGlC;IADT,MAAM,CAAC,OAAO,CAAC;;mDAC4B;AAGlC;IADT,UAAU,CAAC,YAAY,CAAC;8BACR,YAAY;2CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { QueueJob } from '@spinajs/queue';
|
|
2
|
-
import { IEmail, IEmailAttachement } from '../interfaces.js';
|
|
1
|
+
import { QueueJob, IJobFailureContext } from '@spinajs/queue';
|
|
2
|
+
import { IEmail, IEmailAttachement, IEmailTemplate } from '../interfaces.js';
|
|
3
3
|
/**
|
|
4
4
|
* Job for sending emails in background
|
|
5
5
|
*/
|
|
@@ -10,7 +10,7 @@ export declare class EmailSend extends QueueJob implements IEmail {
|
|
|
10
10
|
from: string;
|
|
11
11
|
connection: string;
|
|
12
12
|
attachements?: IEmailAttachement[];
|
|
13
|
-
template?: string;
|
|
13
|
+
template?: string | IEmailTemplate;
|
|
14
14
|
templateId?: string;
|
|
15
15
|
model?: unknown;
|
|
16
16
|
text?: string;
|
|
@@ -23,5 +23,6 @@ export declare class EmailSend extends QueueJob implements IEmail {
|
|
|
23
23
|
execute(): Promise<{
|
|
24
24
|
result: boolean;
|
|
25
25
|
}>;
|
|
26
|
+
onFailed(err: unknown, ctx: IJobFailureContext): Promise<void>;
|
|
26
27
|
}
|
|
27
28
|
//# sourceMappingURL=EmailSend.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EmailSend.d.ts","sourceRoot":"","sources":["../../../src/jobs/EmailSend.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,
|
|
1
|
+
{"version":3,"file":"EmailSend.d.ts","sourceRoot":"","sources":["../../../src/jobs/EmailSend.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAqB,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACjF,OAAO,EAAgB,MAAM,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAG3F;;GAEG;AACH,qBACa,SAAU,SAAQ,QAAS,YAAW,MAAM;IAChD,EAAE,EAAE,MAAM,EAAE,CAAC;IACb,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,iBAAiB,EAAE,CAAC;IACnC,QAAQ,CAAC,EAAE,MAAM,GAAG,cAAc,CAAC;IACnC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IAEX,OAAO;;;IAQP,QAAQ,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,kBAAkB;CAK5D"}
|
|
@@ -5,8 +5,9 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
|
|
|
5
5
|
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
6
|
};
|
|
7
7
|
import { DI } from '@spinajs/di';
|
|
8
|
-
import { QueueJob, Job } from '@spinajs/queue';
|
|
8
|
+
import { QueueJob, Job, QueueService } from '@spinajs/queue';
|
|
9
9
|
import { EmailService } from '../interfaces.js';
|
|
10
|
+
import { EmailSendFailed } from '../events/EmailSendFailed.js';
|
|
10
11
|
/**
|
|
11
12
|
* Job for sending emails in background
|
|
12
13
|
*/
|
|
@@ -18,6 +19,12 @@ let EmailSend = class EmailSend extends QueueJob {
|
|
|
18
19
|
result: true,
|
|
19
20
|
};
|
|
20
21
|
}
|
|
22
|
+
async onFailed(err, ctx) {
|
|
23
|
+
if (!ctx.isFinal)
|
|
24
|
+
return;
|
|
25
|
+
const queue = await DI.resolve(QueueService);
|
|
26
|
+
await queue.emit(new EmailSendFailed(this, err, ctx));
|
|
27
|
+
}
|
|
21
28
|
};
|
|
22
29
|
EmailSend = __decorate([
|
|
23
30
|
Job()
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EmailSend.js","sourceRoot":"","sources":["../../../src/jobs/EmailSend.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"EmailSend.js","sourceRoot":"","sources":["../../../src/jobs/EmailSend.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,YAAY,EAAsB,MAAM,gBAAgB,CAAC;AACjF,OAAO,EAAE,YAAY,EAA6C,MAAM,kBAAkB,CAAC;AAC3F,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAE/D;;GAEG;AAEI,IAAM,SAAS,GAAf,MAAM,SAAU,SAAQ,QAAQ;IAkB9B,KAAK,CAAC,OAAO;QAClB,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;QAC9C,MAAM,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxB,OAAO;YACL,MAAM,EAAE,IAAI;SACb,CAAC;IACJ,CAAC;IAEM,KAAK,CAAC,QAAQ,CAAC,GAAY,EAAE,GAAuB;QACzD,IAAI,CAAC,GAAG,CAAC,OAAO;YAAE,OAAO;QACzB,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;QAC7C,MAAM,KAAK,CAAC,IAAI,CAAC,IAAI,eAAe,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;IACxD,CAAC;CACF,CAAA;AA/BY,SAAS;IADrB,GAAG,EAAE;GACO,SAAS,CA+BrB"}
|
|
@@ -4,7 +4,20 @@ declare const CONFIGURATION_SCHEMA: {
|
|
|
4
4
|
description: string;
|
|
5
5
|
type: string;
|
|
6
6
|
properties: {
|
|
7
|
-
queue:
|
|
7
|
+
queue: {
|
|
8
|
+
type: string;
|
|
9
|
+
};
|
|
10
|
+
templateFs: {
|
|
11
|
+
type: string;
|
|
12
|
+
};
|
|
13
|
+
retry: {
|
|
14
|
+
type: string;
|
|
15
|
+
properties: {
|
|
16
|
+
count: {
|
|
17
|
+
type: string;
|
|
18
|
+
};
|
|
19
|
+
};
|
|
20
|
+
};
|
|
8
21
|
connections: {
|
|
9
22
|
type: string;
|
|
10
23
|
uniqueItems: boolean;
|
|
@@ -29,12 +42,26 @@ declare const CONFIGURATION_SCHEMA: {
|
|
|
29
42
|
name: {
|
|
30
43
|
type: string;
|
|
31
44
|
};
|
|
32
|
-
|
|
45
|
+
service: {
|
|
33
46
|
type: string;
|
|
34
47
|
};
|
|
35
48
|
options: {
|
|
36
49
|
type: string;
|
|
37
50
|
};
|
|
51
|
+
resilience: {
|
|
52
|
+
type: string;
|
|
53
|
+
properties: {
|
|
54
|
+
retries: {
|
|
55
|
+
type: string;
|
|
56
|
+
};
|
|
57
|
+
delay: {
|
|
58
|
+
type: string;
|
|
59
|
+
};
|
|
60
|
+
timeout: {
|
|
61
|
+
type: string;
|
|
62
|
+
};
|
|
63
|
+
};
|
|
64
|
+
};
|
|
38
65
|
defaults: {
|
|
39
66
|
type: string;
|
|
40
67
|
properties: {
|
|
@@ -44,10 +71,10 @@ declare const CONFIGURATION_SCHEMA: {
|
|
|
44
71
|
};
|
|
45
72
|
};
|
|
46
73
|
};
|
|
74
|
+
required: string[];
|
|
47
75
|
};
|
|
48
76
|
};
|
|
49
77
|
};
|
|
50
|
-
required: string[];
|
|
51
78
|
};
|
|
52
79
|
export default CONFIGURATION_SCHEMA;
|
|
53
80
|
//# sourceMappingURL=email.smtp.configuration.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"email.smtp.configuration.d.ts","sourceRoot":"","sources":["../../../src/schemas/email.smtp.configuration.ts"],"names":[],"mappings":"AAAA,QAAA,MAAM,oBAAoB
|
|
1
|
+
{"version":3,"file":"email.smtp.configuration.d.ts","sourceRoot":"","sources":["../../../src/schemas/email.smtp.configuration.ts"],"names":[],"mappings":"AAAA,QAAA,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiDzB,CAAC;AAEF,eAAe,oBAAoB,CAAC"}
|
|
@@ -4,7 +4,14 @@ const CONFIGURATION_SCHEMA = {
|
|
|
4
4
|
description: 'Email smtp transport configuration option validation',
|
|
5
5
|
type: 'object',
|
|
6
6
|
properties: {
|
|
7
|
-
queue: 'string',
|
|
7
|
+
queue: { type: 'string' },
|
|
8
|
+
templateFs: { type: 'string' },
|
|
9
|
+
retry: {
|
|
10
|
+
type: 'object',
|
|
11
|
+
properties: {
|
|
12
|
+
count: { type: 'number' },
|
|
13
|
+
},
|
|
14
|
+
},
|
|
8
15
|
connections: {
|
|
9
16
|
type: 'array',
|
|
10
17
|
uniqueItems: true,
|
|
@@ -17,10 +24,18 @@ const CONFIGURATION_SCHEMA = {
|
|
|
17
24
|
user: { type: 'string' },
|
|
18
25
|
password: { type: 'string' },
|
|
19
26
|
name: { type: 'string' },
|
|
20
|
-
|
|
27
|
+
service: { type: 'string' },
|
|
21
28
|
options: {
|
|
22
29
|
type: 'object',
|
|
23
30
|
},
|
|
31
|
+
resilience: {
|
|
32
|
+
type: 'object',
|
|
33
|
+
properties: {
|
|
34
|
+
retries: { type: 'number' },
|
|
35
|
+
delay: { type: 'number' },
|
|
36
|
+
timeout: { type: 'number' },
|
|
37
|
+
},
|
|
38
|
+
},
|
|
24
39
|
defaults: {
|
|
25
40
|
type: 'object',
|
|
26
41
|
properties: {
|
|
@@ -28,10 +43,10 @@ const CONFIGURATION_SCHEMA = {
|
|
|
28
43
|
},
|
|
29
44
|
},
|
|
30
45
|
},
|
|
46
|
+
required: ['name', 'service'],
|
|
31
47
|
},
|
|
32
48
|
},
|
|
33
49
|
},
|
|
34
|
-
required: ['name', 'sender'],
|
|
35
50
|
};
|
|
36
51
|
export default CONFIGURATION_SCHEMA;
|
|
37
52
|
//# sourceMappingURL=email.smtp.configuration.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"email.smtp.configuration.js","sourceRoot":"","sources":["../../../src/schemas/email.smtp.configuration.ts"],"names":[],"mappings":"AAAA,MAAM,oBAAoB,GAAG;IAC3B,GAAG,EAAE,yCAAyC;IAC9C,oBAAoB,EAAE,OAAO;IAC7B,WAAW,EAAE,sDAAsD;IACnE,IAAI,EAAE,QAAQ;IACd,UAAU,EAAE;QACV,KAAK,EAAE,QAAQ;
|
|
1
|
+
{"version":3,"file":"email.smtp.configuration.js","sourceRoot":"","sources":["../../../src/schemas/email.smtp.configuration.ts"],"names":[],"mappings":"AAAA,MAAM,oBAAoB,GAAG;IAC3B,GAAG,EAAE,yCAAyC;IAC9C,oBAAoB,EAAE,OAAO;IAC7B,WAAW,EAAE,sDAAsD;IACnE,IAAI,EAAE,QAAQ;IACd,UAAU,EAAE;QACV,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;QACzB,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;QAC9B,KAAK,EAAE;YACL,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;aAC1B;SACF;QACD,WAAW,EAAE;YACX,IAAI,EAAE,OAAO;YACb,WAAW,EAAE,IAAI;YACjB,KAAK,EAAE;gBACL,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE;oBACV,GAAG,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;oBACxB,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;oBACxB,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;oBACxB,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;oBACxB,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;oBAC5B,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;oBACxB,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;oBAC3B,OAAO,EAAE;wBACP,IAAI,EAAE,QAAQ;qBACf;oBACD,UAAU,EAAE;wBACV,IAAI,EAAE,QAAQ;wBACd,UAAU,EAAE;4BACV,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;4BAC3B,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;4BACzB,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;yBAC5B;qBACF;oBACD,QAAQ,EAAE;wBACR,IAAI,EAAE,QAAQ;wBACd,UAAU,EAAE;4BACV,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;yBAC7B;qBACF;iBACF;gBACD,QAAQ,EAAE,CAAC,MAAM,EAAE,SAAS,CAAC;aAC9B;SACF;KACF;CACF,CAAC;AAEF,eAAe,oBAAoB,CAAC"}
|