@impruthvi/nodemail 0.5.0 → 0.7.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 (62) hide show
  1. package/README.md +165 -15
  2. package/dist/core/MailFacade.d.ts +17 -10
  3. package/dist/core/MailFacade.d.ts.map +1 -1
  4. package/dist/core/MailFacade.js +104 -5
  5. package/dist/core/MailFacade.js.map +1 -1
  6. package/dist/core/MailManager.d.ts +13 -1
  7. package/dist/core/MailManager.d.ts.map +1 -1
  8. package/dist/core/MailManager.js +111 -0
  9. package/dist/core/MailManager.js.map +1 -1
  10. package/dist/core/Mailable.d.ts +1 -0
  11. package/dist/core/Mailable.d.ts.map +1 -1
  12. package/dist/core/Mailable.js +4 -0
  13. package/dist/core/Mailable.js.map +1 -1
  14. package/dist/index.d.ts +4 -1
  15. package/dist/index.d.ts.map +1 -1
  16. package/dist/index.js +10 -2
  17. package/dist/index.js.map +1 -1
  18. package/dist/markdown/MarkdownMailable.d.ts +10 -0
  19. package/dist/markdown/MarkdownMailable.d.ts.map +1 -0
  20. package/dist/markdown/MarkdownMailable.js +42 -0
  21. package/dist/markdown/MarkdownMailable.js.map +1 -0
  22. package/dist/markdown/MarkdownRenderer.d.ts +26 -0
  23. package/dist/markdown/MarkdownRenderer.d.ts.map +1 -0
  24. package/dist/markdown/MarkdownRenderer.js +121 -0
  25. package/dist/markdown/MarkdownRenderer.js.map +1 -0
  26. package/dist/markdown/index.d.ts +6 -0
  27. package/dist/markdown/index.d.ts.map +1 -0
  28. package/dist/markdown/index.js +10 -0
  29. package/dist/markdown/index.js.map +1 -0
  30. package/dist/markdown/themes/default.d.ts +7 -0
  31. package/dist/markdown/themes/default.d.ts.map +1 -0
  32. package/dist/markdown/themes/default.js +248 -0
  33. package/dist/markdown/themes/default.js.map +1 -0
  34. package/dist/queue/QueueManager.d.ts +21 -0
  35. package/dist/queue/QueueManager.d.ts.map +1 -0
  36. package/dist/queue/QueueManager.js +131 -0
  37. package/dist/queue/QueueManager.js.map +1 -0
  38. package/dist/queue/drivers/BullDriver.d.ts +16 -0
  39. package/dist/queue/drivers/BullDriver.d.ts.map +1 -0
  40. package/dist/queue/drivers/BullDriver.js +137 -0
  41. package/dist/queue/drivers/BullDriver.js.map +1 -0
  42. package/dist/queue/drivers/BullMQDriver.d.ts +18 -0
  43. package/dist/queue/drivers/BullMQDriver.d.ts.map +1 -0
  44. package/dist/queue/drivers/BullMQDriver.js +150 -0
  45. package/dist/queue/drivers/BullMQDriver.js.map +1 -0
  46. package/dist/queue/index.d.ts +4 -0
  47. package/dist/queue/index.d.ts.map +1 -0
  48. package/dist/queue/index.js +10 -0
  49. package/dist/queue/index.js.map +1 -0
  50. package/dist/testing/AssertableMessage.d.ts +3 -0
  51. package/dist/testing/AssertableMessage.d.ts.map +1 -1
  52. package/dist/testing/AssertableMessage.js +12 -0
  53. package/dist/testing/AssertableMessage.js.map +1 -1
  54. package/dist/testing/MailFake.d.ts +10 -8
  55. package/dist/testing/MailFake.d.ts.map +1 -1
  56. package/dist/testing/MailFake.js +6 -0
  57. package/dist/testing/MailFake.js.map +1 -1
  58. package/dist/types/index.d.ts +54 -0
  59. package/dist/types/index.d.ts.map +1 -1
  60. package/examples/markdown-mail.ts +219 -0
  61. package/examples/queue-example.ts +313 -0
  62. package/package.json +1 -1
@@ -0,0 +1,248 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getDefaultTheme = getDefaultTheme;
4
+ function getDefaultTheme() {
5
+ return {
6
+ css: `
7
+ /* Base Styles */
8
+ body {
9
+ margin: 0;
10
+ padding: 0;
11
+ width: 100%;
12
+ background-color: #f4f4f7;
13
+ -webkit-text-size-adjust: none;
14
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif;
15
+ }
16
+
17
+ .email-wrapper {
18
+ width: 100%;
19
+ margin: 0;
20
+ padding: 0;
21
+ background-color: #f4f4f7;
22
+ }
23
+
24
+ .email-content {
25
+ width: 100%;
26
+ max-width: 570px;
27
+ margin: 0 auto;
28
+ }
29
+
30
+ /* Header */
31
+ .email-header {
32
+ padding: 25px 0;
33
+ text-align: center;
34
+ }
35
+
36
+ /* Body */
37
+ .email-body {
38
+ width: 100%;
39
+ margin: 0;
40
+ padding: 0;
41
+ background-color: #ffffff;
42
+ border-radius: 4px;
43
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.06);
44
+ }
45
+
46
+ .email-body-inner {
47
+ width: 570px;
48
+ max-width: 570px;
49
+ margin: 0 auto;
50
+ padding: 32px;
51
+ }
52
+
53
+ /* Footer */
54
+ .email-footer {
55
+ width: 570px;
56
+ max-width: 570px;
57
+ margin: 0 auto;
58
+ padding: 32px;
59
+ text-align: center;
60
+ }
61
+
62
+ .email-footer p {
63
+ color: #aeaeae;
64
+ font-size: 12px;
65
+ line-height: 1.5;
66
+ }
67
+
68
+ /* Typography */
69
+ h1 {
70
+ margin-top: 0;
71
+ color: #333333;
72
+ font-size: 22px;
73
+ font-weight: bold;
74
+ line-height: 1.4;
75
+ }
76
+
77
+ h2 {
78
+ margin-top: 0;
79
+ color: #333333;
80
+ font-size: 18px;
81
+ font-weight: bold;
82
+ line-height: 1.4;
83
+ }
84
+
85
+ h3 {
86
+ margin-top: 0;
87
+ color: #333333;
88
+ font-size: 16px;
89
+ font-weight: bold;
90
+ line-height: 1.4;
91
+ }
92
+
93
+ p {
94
+ margin-top: 0;
95
+ color: #51545e;
96
+ font-size: 16px;
97
+ line-height: 1.625;
98
+ }
99
+
100
+ a {
101
+ color: #3869d4;
102
+ text-decoration: underline;
103
+ }
104
+
105
+ /* Lists */
106
+ ul, ol {
107
+ margin-top: 0;
108
+ color: #51545e;
109
+ font-size: 16px;
110
+ line-height: 1.625;
111
+ }
112
+
113
+ /* Code */
114
+ code {
115
+ background-color: #e8e8eb;
116
+ border-radius: 3px;
117
+ padding: 2px 6px;
118
+ font-size: 14px;
119
+ color: #333333;
120
+ }
121
+
122
+ pre {
123
+ background-color: #333333;
124
+ color: #e8e8eb;
125
+ border-radius: 4px;
126
+ padding: 16px;
127
+ overflow-x: auto;
128
+ font-size: 14px;
129
+ line-height: 1.5;
130
+ }
131
+
132
+ pre code {
133
+ background-color: transparent;
134
+ padding: 0;
135
+ color: inherit;
136
+ }
137
+
138
+ /* Blockquote */
139
+ blockquote {
140
+ margin: 0 0 16px;
141
+ padding: 0 0 0 16px;
142
+ border-left: 4px solid #e8e8eb;
143
+ color: #6e6e73;
144
+ font-style: italic;
145
+ }
146
+
147
+ /* Horizontal Rule */
148
+ hr {
149
+ border: none;
150
+ border-top: 1px solid #e8e8eb;
151
+ margin: 24px 0;
152
+ }
153
+
154
+ /* Images */
155
+ img {
156
+ max-width: 100%;
157
+ height: auto;
158
+ }
159
+
160
+ /* Button Component */
161
+ .button {
162
+ display: inline-block;
163
+ width: auto;
164
+ padding: 12px 36px;
165
+ border-radius: 4px;
166
+ font-size: 16px;
167
+ font-weight: bold;
168
+ text-align: center;
169
+ text-decoration: none;
170
+ -webkit-text-size-adjust: none;
171
+ mso-hide: all;
172
+ }
173
+
174
+ .button-primary {
175
+ background-color: #3869d4;
176
+ color: #ffffff;
177
+ }
178
+
179
+ .button-success {
180
+ background-color: #22bc66;
181
+ color: #ffffff;
182
+ }
183
+
184
+ .button-error {
185
+ background-color: #ff6136;
186
+ color: #ffffff;
187
+ }
188
+
189
+ /* Panel Component */
190
+ .panel {
191
+ margin: 16px 0;
192
+ padding: 16px;
193
+ background-color: #f4f4f7;
194
+ border-left: 4px solid #3869d4;
195
+ border-radius: 0 4px 4px 0;
196
+ }
197
+
198
+ .panel p {
199
+ color: #51545e;
200
+ font-size: 14px;
201
+ line-height: 1.625;
202
+ }
203
+
204
+ .panel p:last-child {
205
+ margin-bottom: 0;
206
+ }
207
+
208
+ /* Table Component */
209
+ .table-wrapper {
210
+ margin: 16px 0;
211
+ width: 100%;
212
+ overflow-x: auto;
213
+ }
214
+
215
+ .table-wrapper table {
216
+ width: 100%;
217
+ border-collapse: collapse;
218
+ }
219
+
220
+ .table-wrapper th {
221
+ padding: 10px 12px;
222
+ background-color: #f4f4f7;
223
+ border-bottom: 2px solid #e8e8eb;
224
+ text-align: left;
225
+ font-size: 14px;
226
+ font-weight: bold;
227
+ color: #333333;
228
+ }
229
+
230
+ .table-wrapper td {
231
+ padding: 10px 12px;
232
+ border-bottom: 1px solid #e8e8eb;
233
+ font-size: 14px;
234
+ color: #51545e;
235
+ }
236
+
237
+ /* Responsive */
238
+ @media only screen and (max-width: 600px) {
239
+ .email-body-inner,
240
+ .email-footer {
241
+ width: 100% !important;
242
+ padding: 16px !important;
243
+ }
244
+ }
245
+ `,
246
+ };
247
+ }
248
+ //# sourceMappingURL=default.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"default.js","sourceRoot":"","sources":["../../../src/markdown/themes/default.ts"],"names":[],"mappings":";;AAWA,0CAmPC;AAnPD,SAAgB,eAAe;IAC7B,OAAO;QACL,GAAG,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+OR;KACE,CAAC;AACJ,CAAC"}
@@ -0,0 +1,21 @@
1
+ import type { QueueConfig, QueuedMailJob, QueueJobResult, MailOptions, MailResponse } from '../types';
2
+ export declare class QueueManager {
3
+ private driver;
4
+ private config;
5
+ private initialized;
6
+ constructor(config: QueueConfig);
7
+ initialize(): Promise<void>;
8
+ private createBullMQDriver;
9
+ private createBullDriver;
10
+ private createSyncDriver;
11
+ private getDriver;
12
+ queue(mailOptions: MailOptions, queueName?: string): Promise<QueueJobResult>;
13
+ later(mailOptions: MailOptions, delaySeconds: number, queueName?: string): Promise<QueueJobResult>;
14
+ at(mailOptions: MailOptions, date: Date, queueName?: string): Promise<QueueJobResult>;
15
+ process(handler: (job: QueuedMailJob) => Promise<MailResponse>, queueName?: string): Promise<void>;
16
+ close(): Promise<void>;
17
+ private createJob;
18
+ private generateJobId;
19
+ getConfig(): QueueConfig;
20
+ }
21
+ //# sourceMappingURL=QueueManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"QueueManager.d.ts","sourceRoot":"","sources":["../../src/queue/QueueManager.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,WAAW,EAEX,aAAa,EACb,cAAc,EACd,WAAW,EACX,YAAY,EACb,MAAM,UAAU,CAAC;AAElB,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAA4B;IAC1C,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,WAAW,CAAS;gBAEhB,MAAM,EAAE,WAAW;IAczB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;YAwBnB,kBAAkB;YAQlB,gBAAgB;IAQ9B,OAAO,CAAC,gBAAgB;YAuCV,SAAS;IAUjB,KAAK,CAAC,WAAW,EAAE,WAAW,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAS5E,KAAK,CACT,WAAW,EAAE,WAAW,EACxB,YAAY,EAAE,MAAM,EACpB,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,cAAc,CAAC;IASpB,EAAE,CACN,WAAW,EAAE,WAAW,EACxB,IAAI,EAAE,IAAI,EACV,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,cAAc,CAAC;IAWpB,OAAO,CACX,OAAO,EAAE,CAAC,GAAG,EAAE,aAAa,KAAK,OAAO,CAAC,YAAY,CAAC,EACtD,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC;IAQV,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAW5B,OAAO,CAAC,SAAS;IAmBjB,OAAO,CAAC,aAAa;IAOrB,SAAS,IAAI,WAAW;CAGzB"}
@@ -0,0 +1,131 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.QueueManager = void 0;
4
+ class QueueManager {
5
+ driver = null;
6
+ config;
7
+ initialized = false;
8
+ constructor(config) {
9
+ this.config = {
10
+ driver: config.driver || 'sync',
11
+ defaultQueue: config.defaultQueue || 'mail',
12
+ prefix: config.prefix || 'nodemail',
13
+ retries: config.retries ?? 3,
14
+ backoff: config.backoff || { type: 'exponential', delay: 1000 },
15
+ connection: config.connection || { host: 'localhost', port: 6379 },
16
+ };
17
+ }
18
+ async initialize() {
19
+ if (this.initialized)
20
+ return;
21
+ switch (this.config.driver) {
22
+ case 'bullmq':
23
+ this.driver = await this.createBullMQDriver();
24
+ break;
25
+ case 'bull':
26
+ this.driver = await this.createBullDriver();
27
+ break;
28
+ case 'sync':
29
+ this.driver = this.createSyncDriver();
30
+ break;
31
+ default:
32
+ throw new Error(`Unsupported queue driver: ${this.config.driver}`);
33
+ }
34
+ this.initialized = true;
35
+ }
36
+ async createBullMQDriver() {
37
+ const { BullMQDriver } = await import('./drivers/BullMQDriver.js');
38
+ return new BullMQDriver(this.config);
39
+ }
40
+ async createBullDriver() {
41
+ const { BullDriver } = await import('./drivers/BullDriver.js');
42
+ return new BullDriver(this.config);
43
+ }
44
+ createSyncDriver() {
45
+ return {
46
+ add: (job) => {
47
+ return Promise.resolve({
48
+ success: true,
49
+ jobId: job.id,
50
+ queue: this.config.defaultQueue,
51
+ });
52
+ },
53
+ addDelayed: (job, delay) => {
54
+ return Promise.resolve({
55
+ success: true,
56
+ jobId: job.id,
57
+ queue: this.config.defaultQueue,
58
+ scheduledAt: new Date(Date.now() + delay * 1000),
59
+ });
60
+ },
61
+ addScheduled: (job, date) => {
62
+ return Promise.resolve({
63
+ success: true,
64
+ jobId: job.id,
65
+ queue: this.config.defaultQueue,
66
+ scheduledAt: date,
67
+ });
68
+ },
69
+ process: () => {
70
+ },
71
+ close: () => {
72
+ return Promise.resolve();
73
+ },
74
+ };
75
+ }
76
+ async getDriver() {
77
+ if (!this.driver) {
78
+ await this.initialize();
79
+ }
80
+ return this.driver;
81
+ }
82
+ async queue(mailOptions, queueName) {
83
+ const driver = await this.getDriver();
84
+ const job = this.createJob(mailOptions);
85
+ return driver.add(job, queueName || this.config.defaultQueue);
86
+ }
87
+ async later(mailOptions, delaySeconds, queueName) {
88
+ const driver = await this.getDriver();
89
+ const job = this.createJob(mailOptions, delaySeconds);
90
+ return driver.addDelayed(job, delaySeconds, queueName || this.config.defaultQueue);
91
+ }
92
+ async at(mailOptions, date, queueName) {
93
+ const driver = await this.getDriver();
94
+ const delayMs = date.getTime() - Date.now();
95
+ const job = this.createJob(mailOptions, Math.floor(delayMs / 1000));
96
+ job.scheduledAt = date;
97
+ return driver.addScheduled(job, date, queueName || this.config.defaultQueue);
98
+ }
99
+ async process(handler, queueName) {
100
+ const driver = await this.getDriver();
101
+ driver.process(queueName || this.config.defaultQueue, handler);
102
+ }
103
+ async close() {
104
+ if (this.driver) {
105
+ await this.driver.close();
106
+ this.driver = null;
107
+ this.initialized = false;
108
+ }
109
+ }
110
+ createJob(mailOptions, delay) {
111
+ const job = {
112
+ id: this.generateJobId(),
113
+ mailOptions,
114
+ attempts: 0,
115
+ maxAttempts: this.config.retries,
116
+ createdAt: new Date(),
117
+ };
118
+ if (delay !== undefined) {
119
+ job.delay = delay;
120
+ }
121
+ return job;
122
+ }
123
+ generateJobId() {
124
+ return `mail-${Date.now()}-${Math.random().toString(36).substring(2, 9)}`;
125
+ }
126
+ getConfig() {
127
+ return this.config;
128
+ }
129
+ }
130
+ exports.QueueManager = QueueManager;
131
+ //# sourceMappingURL=QueueManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"QueueManager.js","sourceRoot":"","sources":["../../src/queue/QueueManager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import type { QueueConfig, QueueDriver, QueuedMailJob, QueueJobResult, MailResponse } from '../../types';
2
+ export declare class BullDriver implements QueueDriver {
3
+ private queues;
4
+ private config;
5
+ private Bull;
6
+ constructor(config: QueueConfig);
7
+ private loadBull;
8
+ private getQueue;
9
+ private getRedisOptions;
10
+ add(job: QueuedMailJob, queueName?: string): Promise<QueueJobResult>;
11
+ addDelayed(job: QueuedMailJob, delaySeconds: number, queueName?: string): Promise<QueueJobResult>;
12
+ addScheduled(job: QueuedMailJob, date: Date, queueName?: string): Promise<QueueJobResult>;
13
+ process(queueName: string, handler: (job: QueuedMailJob) => Promise<MailResponse>): void;
14
+ close(): Promise<void>;
15
+ }
16
+ //# sourceMappingURL=BullDriver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BullDriver.d.ts","sourceRoot":"","sources":["../../../src/queue/drivers/BullDriver.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,WAAW,EACX,WAAW,EACX,aAAa,EACb,cAAc,EACd,YAAY,EACb,MAAM,aAAa,CAAC;AAMrB,qBAAa,UAAW,YAAW,WAAW;IAC5C,OAAO,CAAC,MAAM,CAAqC;IACnD,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,IAAI,CAAsC;gBAEtC,MAAM,EAAE,WAAW;YAOjB,QAAQ;YAiBR,QAAQ;IA6BtB,OAAO,CAAC,eAAe;IAkBjB,GAAG,CAAC,GAAG,EAAE,aAAa,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IA2BpE,UAAU,CACd,GAAG,EAAE,aAAa,EAClB,YAAY,EAAE,MAAM,EACpB,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,cAAc,CAAC;IA6BpB,YAAY,CAChB,GAAG,EAAE,aAAa,EAClB,IAAI,EAAE,IAAI,EACV,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,cAAc,CAAC;IAY1B,OAAO,CACL,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,CAAC,GAAG,EAAE,aAAa,KAAK,OAAO,CAAC,YAAY,CAAC,GACrD,IAAI;IAiCD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAM7B"}
@@ -0,0 +1,137 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BullDriver = void 0;
4
+ class BullDriver {
5
+ queues = new Map();
6
+ config;
7
+ Bull = null;
8
+ constructor(config) {
9
+ this.config = config;
10
+ }
11
+ async loadBull() {
12
+ if (this.Bull)
13
+ return;
14
+ try {
15
+ const bull = await import('bull');
16
+ this.Bull = bull.default || bull;
17
+ }
18
+ catch {
19
+ throw new Error('Bull is not installed. Please install it with: npm install bull');
20
+ }
21
+ }
22
+ async getQueue(name) {
23
+ await this.loadBull();
24
+ const queueName = `${this.config.prefix}:${name}`;
25
+ let queue = this.queues.get(queueName);
26
+ if (!queue) {
27
+ const redisOptions = this.getRedisOptions();
28
+ queue = new this.Bull(queueName, {
29
+ redis: redisOptions,
30
+ defaultJobOptions: {
31
+ attempts: this.config.retries || 3,
32
+ backoff: {
33
+ type: this.config.backoff?.type || 'exponential',
34
+ delay: this.config.backoff?.delay || 1000,
35
+ },
36
+ removeOnComplete: true,
37
+ removeOnFail: false,
38
+ },
39
+ });
40
+ this.queues.set(queueName, queue);
41
+ }
42
+ return queue;
43
+ }
44
+ getRedisOptions() {
45
+ const conn = this.config.connection || {};
46
+ if (conn.url) {
47
+ return conn.url;
48
+ }
49
+ return {
50
+ host: conn.host || 'localhost',
51
+ port: conn.port || 6379,
52
+ password: conn.password,
53
+ db: conn.db || 0,
54
+ };
55
+ }
56
+ async add(job, queueName) {
57
+ const name = queueName || this.config.defaultQueue || 'mail';
58
+ const queue = await this.getQueue(name);
59
+ try {
60
+ const bullJob = await queue.add('send-mail', job, {
61
+ jobId: job.id,
62
+ });
63
+ return {
64
+ success: true,
65
+ jobId: String(bullJob.id),
66
+ queue: name,
67
+ };
68
+ }
69
+ catch (error) {
70
+ return {
71
+ success: false,
72
+ jobId: job.id,
73
+ queue: name,
74
+ error: error instanceof Error ? error.message : 'Failed to add job to queue',
75
+ };
76
+ }
77
+ }
78
+ async addDelayed(job, delaySeconds, queueName) {
79
+ const name = queueName || this.config.defaultQueue || 'mail';
80
+ const queue = await this.getQueue(name);
81
+ try {
82
+ const bullJob = await queue.add('send-mail', job, {
83
+ jobId: job.id,
84
+ delay: delaySeconds * 1000,
85
+ });
86
+ return {
87
+ success: true,
88
+ jobId: String(bullJob.id),
89
+ queue: name,
90
+ scheduledAt: new Date(Date.now() + delaySeconds * 1000),
91
+ };
92
+ }
93
+ catch (error) {
94
+ return {
95
+ success: false,
96
+ jobId: job.id,
97
+ queue: name,
98
+ error: error instanceof Error ? error.message : 'Failed to add delayed job to queue',
99
+ };
100
+ }
101
+ }
102
+ async addScheduled(job, date, queueName) {
103
+ const delayMs = date.getTime() - Date.now();
104
+ if (delayMs < 0) {
105
+ return this.add(job, queueName);
106
+ }
107
+ return this.addDelayed(job, Math.floor(delayMs / 1000), queueName);
108
+ }
109
+ process(queueName, handler) {
110
+ void (async () => {
111
+ const queue = await this.getQueue(queueName);
112
+ void queue.process('send-mail', 5, async (bullJob) => {
113
+ const mailJob = bullJob.data;
114
+ mailJob.attempts = bullJob.attemptsMade + 1;
115
+ const result = await handler(mailJob);
116
+ if (!result.success) {
117
+ throw new Error(result.error || 'Failed to send email');
118
+ }
119
+ return result;
120
+ });
121
+ queue.on('completed', (job) => {
122
+ console.warn(`[Queue] Job ${String(job.id)} completed`);
123
+ });
124
+ queue.on('failed', (job, error) => {
125
+ console.error(`[Queue] Job ${String(job.id)} failed:`, error.message);
126
+ });
127
+ })();
128
+ }
129
+ async close() {
130
+ for (const queue of this.queues.values()) {
131
+ await queue.close();
132
+ }
133
+ this.queues.clear();
134
+ }
135
+ }
136
+ exports.BullDriver = BullDriver;
137
+ //# sourceMappingURL=BullDriver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BullDriver.js","sourceRoot":"","sources":["../../../src/queue/drivers/BullDriver.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import type { QueueConfig, QueueDriver, QueuedMailJob, QueueJobResult, MailResponse } from '../../types';
2
+ export declare class BullMQDriver implements QueueDriver {
3
+ private queues;
4
+ private workers;
5
+ private config;
6
+ private Queue;
7
+ private Worker;
8
+ constructor(config: QueueConfig);
9
+ private loadBullMQ;
10
+ private getQueue;
11
+ private getConnectionOptions;
12
+ add(job: QueuedMailJob, queueName?: string): Promise<QueueJobResult>;
13
+ addDelayed(job: QueuedMailJob, delaySeconds: number, queueName?: string): Promise<QueueJobResult>;
14
+ addScheduled(job: QueuedMailJob, date: Date, queueName?: string): Promise<QueueJobResult>;
15
+ process(queueName: string, handler: (job: QueuedMailJob) => Promise<MailResponse>): void;
16
+ close(): Promise<void>;
17
+ }
18
+ //# sourceMappingURL=BullMQDriver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BullMQDriver.d.ts","sourceRoot":"","sources":["../../../src/queue/drivers/BullMQDriver.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,WAAW,EACX,WAAW,EACX,aAAa,EACb,cAAc,EACd,YAAY,EACb,MAAM,aAAa,CAAC;AAOrB,qBAAa,YAAa,YAAW,WAAW;IAC9C,OAAO,CAAC,MAAM,CAAuC;IACrD,OAAO,CAAC,OAAO,CAAwC;IACvD,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,KAAK,CAA8C;IAC3D,OAAO,CAAC,MAAM,CAA+C;gBAEjD,MAAM,EAAE,WAAW;YAOjB,UAAU;YAiBV,QAAQ;IA6BtB,OAAO,CAAC,oBAAoB;IAkBtB,GAAG,CAAC,GAAG,EAAE,aAAa,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IA2BpE,UAAU,CACd,GAAG,EAAE,aAAa,EAClB,YAAY,EAAE,MAAM,EACpB,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,cAAc,CAAC;IA6BpB,YAAY,CAChB,GAAG,EAAE,aAAa,EAClB,IAAI,EAAE,IAAI,EACV,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,cAAc,CAAC;IAY1B,OAAO,CACL,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,CAAC,GAAG,EAAE,aAAa,KAAK,OAAO,CAAC,YAAY,CAAC,GACrD,IAAI;IA4CD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAa7B"}