@bernierllc/email-manager 0.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.
- package/LICENSE +5 -0
- package/README.md +534 -0
- package/dist/email-manager.d.ts +134 -0
- package/dist/email-manager.d.ts.map +1 -0
- package/dist/email-manager.js +360 -0
- package/dist/email-manager.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +17 -0
- package/dist/index.js.map +1 -0
- package/dist/managers/email-analytics.d.ts +92 -0
- package/dist/managers/email-analytics.d.ts.map +1 -0
- package/dist/managers/email-analytics.js +375 -0
- package/dist/managers/email-analytics.js.map +1 -0
- package/dist/managers/email-scheduler.d.ts +81 -0
- package/dist/managers/email-scheduler.d.ts.map +1 -0
- package/dist/managers/email-scheduler.js +288 -0
- package/dist/managers/email-scheduler.js.map +1 -0
- package/dist/managers/provider-manager.d.ts +104 -0
- package/dist/managers/provider-manager.d.ts.map +1 -0
- package/dist/managers/provider-manager.js +436 -0
- package/dist/managers/provider-manager.js.map +1 -0
- package/dist/managers/template-manager.d.ts +65 -0
- package/dist/managers/template-manager.d.ts.map +1 -0
- package/dist/managers/template-manager.js +314 -0
- package/dist/managers/template-manager.js.map +1 -0
- package/dist/types.d.ts +507 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +60 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/simple-template-engine.d.ts +27 -0
- package/dist/utils/simple-template-engine.d.ts.map +1 -0
- package/dist/utils/simple-template-engine.js +61 -0
- package/dist/utils/simple-template-engine.js.map +1 -0
- package/package.json +57 -0
|
@@ -0,0 +1,375 @@
|
|
|
1
|
+
/*
|
|
2
|
+
Copyright (c) 2025 Bernier LLC
|
|
3
|
+
|
|
4
|
+
This file is licensed to the client under a limited-use license.
|
|
5
|
+
The client may use and modify this code *only within the scope of the project it was delivered for*.
|
|
6
|
+
Redistribution or use in other products or commercial offerings is not permitted without written consent from Bernier LLC.
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Email Analytics System
|
|
10
|
+
* Handles email performance tracking and reporting
|
|
11
|
+
*/
|
|
12
|
+
export class EmailAnalytics {
|
|
13
|
+
constructor(config = {
|
|
14
|
+
enabled: true,
|
|
15
|
+
trackOpens: true,
|
|
16
|
+
trackClicks: true,
|
|
17
|
+
trackBounces: true,
|
|
18
|
+
maxEvents: 10000
|
|
19
|
+
}) {
|
|
20
|
+
this.events = [];
|
|
21
|
+
this.stats = new Map();
|
|
22
|
+
this.config = config;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Track email sent event
|
|
26
|
+
*/
|
|
27
|
+
trackEmailSent(emailId, provider, recipient) {
|
|
28
|
+
if (!this.config.enabled)
|
|
29
|
+
return;
|
|
30
|
+
this.recordEvent({
|
|
31
|
+
type: 'sent',
|
|
32
|
+
emailId,
|
|
33
|
+
provider,
|
|
34
|
+
recipient,
|
|
35
|
+
timestamp: new Date()
|
|
36
|
+
});
|
|
37
|
+
this.updateEmailStats(emailId, 'sent');
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Track email delivered event
|
|
41
|
+
*/
|
|
42
|
+
trackEmailDelivered(emailId, recipient) {
|
|
43
|
+
if (!this.config.enabled)
|
|
44
|
+
return;
|
|
45
|
+
this.recordEvent({
|
|
46
|
+
type: 'delivered',
|
|
47
|
+
emailId,
|
|
48
|
+
recipient,
|
|
49
|
+
timestamp: new Date()
|
|
50
|
+
});
|
|
51
|
+
this.updateEmailStats(emailId, 'delivered');
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Track email opened event
|
|
55
|
+
*/
|
|
56
|
+
trackEmailOpened(emailId, recipient) {
|
|
57
|
+
if (!this.config.enabled || !this.config.trackOpens)
|
|
58
|
+
return;
|
|
59
|
+
this.recordEvent({
|
|
60
|
+
type: 'opened',
|
|
61
|
+
emailId,
|
|
62
|
+
recipient,
|
|
63
|
+
timestamp: new Date()
|
|
64
|
+
});
|
|
65
|
+
this.updateEmailStats(emailId, 'opened');
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Track email clicked event
|
|
69
|
+
*/
|
|
70
|
+
trackEmailClicked(emailId, recipient, url) {
|
|
71
|
+
if (!this.config.enabled || !this.config.trackClicks)
|
|
72
|
+
return;
|
|
73
|
+
this.recordEvent({
|
|
74
|
+
type: 'clicked',
|
|
75
|
+
emailId,
|
|
76
|
+
recipient,
|
|
77
|
+
url,
|
|
78
|
+
timestamp: new Date()
|
|
79
|
+
});
|
|
80
|
+
this.updateEmailStats(emailId, 'clicked');
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Track email bounced event
|
|
84
|
+
*/
|
|
85
|
+
trackEmailBounced(emailId, recipient, reason) {
|
|
86
|
+
if (!this.config.enabled || !this.config.trackBounces)
|
|
87
|
+
return;
|
|
88
|
+
this.recordEvent({
|
|
89
|
+
type: 'bounced',
|
|
90
|
+
emailId,
|
|
91
|
+
recipient,
|
|
92
|
+
reason,
|
|
93
|
+
timestamp: new Date()
|
|
94
|
+
});
|
|
95
|
+
this.updateEmailStats(emailId, 'bounced');
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Get email statistics for a specific email
|
|
99
|
+
*/
|
|
100
|
+
getEmailStats(emailId) {
|
|
101
|
+
const existingStats = this.stats.get(emailId);
|
|
102
|
+
if (existingStats) {
|
|
103
|
+
return existingStats;
|
|
104
|
+
}
|
|
105
|
+
// Calculate stats from events if not cached
|
|
106
|
+
const events = this.events.filter(event => event.emailId === emailId);
|
|
107
|
+
const stats = {
|
|
108
|
+
emailId,
|
|
109
|
+
sent: events.filter(e => e.type === 'sent').length,
|
|
110
|
+
delivered: events.filter(e => e.type === 'delivered').length,
|
|
111
|
+
opened: events.filter(e => e.type === 'opened').length,
|
|
112
|
+
clicked: events.filter(e => e.type === 'clicked').length,
|
|
113
|
+
bounced: events.filter(e => e.type === 'bounced').length,
|
|
114
|
+
deliveryRate: 0,
|
|
115
|
+
openRate: 0,
|
|
116
|
+
clickRate: 0
|
|
117
|
+
};
|
|
118
|
+
// Calculate rates
|
|
119
|
+
stats.deliveryRate = this.calculateDeliveryRate(events);
|
|
120
|
+
stats.openRate = this.calculateOpenRate(events);
|
|
121
|
+
stats.clickRate = this.calculateClickRate(events);
|
|
122
|
+
// Cache the stats
|
|
123
|
+
this.stats.set(emailId, stats);
|
|
124
|
+
return stats;
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Get delivery report for a time period
|
|
128
|
+
*/
|
|
129
|
+
getDeliveryReport(options = {}) {
|
|
130
|
+
const startDate = options.startDate || new Date(Date.now() - 30 * 24 * 60 * 60 * 1000); // 30 days ago
|
|
131
|
+
const endDate = options.endDate || new Date();
|
|
132
|
+
let relevantEvents = this.events.filter(event => event.timestamp >= startDate && event.timestamp <= endDate);
|
|
133
|
+
// Filter by provider if specified
|
|
134
|
+
if (options.provider) {
|
|
135
|
+
relevantEvents = relevantEvents.filter(event => event.provider === options.provider);
|
|
136
|
+
}
|
|
137
|
+
// Filter by template if specified
|
|
138
|
+
if (options.templateId) {
|
|
139
|
+
// Note: This would require tracking templateId in events, which we could add
|
|
140
|
+
// For now, we'll include all events
|
|
141
|
+
}
|
|
142
|
+
const totalSent = relevantEvents.filter(e => e.type === 'sent').length;
|
|
143
|
+
const totalDelivered = relevantEvents.filter(e => e.type === 'delivered').length;
|
|
144
|
+
const totalOpened = relevantEvents.filter(e => e.type === 'opened').length;
|
|
145
|
+
const totalClicked = relevantEvents.filter(e => e.type === 'clicked').length;
|
|
146
|
+
const totalBounced = relevantEvents.filter(e => e.type === 'bounced').length;
|
|
147
|
+
return {
|
|
148
|
+
period: { startDate, endDate },
|
|
149
|
+
totalSent,
|
|
150
|
+
totalDelivered,
|
|
151
|
+
totalOpened,
|
|
152
|
+
totalClicked,
|
|
153
|
+
totalBounced,
|
|
154
|
+
deliveryRate: totalSent > 0 ? (totalDelivered / totalSent) * 100 : 0,
|
|
155
|
+
openRate: totalDelivered > 0 ? (totalOpened / totalDelivered) * 100 : 0,
|
|
156
|
+
clickRate: totalDelivered > 0 ? (totalClicked / totalDelivered) * 100 : 0,
|
|
157
|
+
bounceRate: totalSent > 0 ? (totalBounced / totalSent) * 100 : 0
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Get bounce report for a time period
|
|
162
|
+
*/
|
|
163
|
+
getBounceReport(options = {}) {
|
|
164
|
+
const startDate = options.startDate || new Date(Date.now() - 30 * 24 * 60 * 60 * 1000); // 30 days ago
|
|
165
|
+
const endDate = options.endDate || new Date();
|
|
166
|
+
let bounceEvents = this.events.filter(event => event.type === 'bounced' &&
|
|
167
|
+
event.timestamp >= startDate &&
|
|
168
|
+
event.timestamp <= endDate);
|
|
169
|
+
// Filter by provider if specified
|
|
170
|
+
if (options.provider) {
|
|
171
|
+
bounceEvents = bounceEvents.filter(event => event.provider === options.provider);
|
|
172
|
+
}
|
|
173
|
+
const totalBounces = bounceEvents.length;
|
|
174
|
+
const totalSent = this.events.filter(event => event.type === 'sent' &&
|
|
175
|
+
event.timestamp >= startDate &&
|
|
176
|
+
event.timestamp <= endDate &&
|
|
177
|
+
(!options.provider || event.provider === options.provider)).length;
|
|
178
|
+
// Group bounces by reason
|
|
179
|
+
const bouncesByReason = {};
|
|
180
|
+
bounceEvents.forEach(event => {
|
|
181
|
+
const reason = event.reason || 'unknown';
|
|
182
|
+
bouncesByReason[reason] = (bouncesByReason[reason] || 0) + 1;
|
|
183
|
+
});
|
|
184
|
+
// Group bounces by provider
|
|
185
|
+
const bouncesByProvider = {};
|
|
186
|
+
bounceEvents.forEach(event => {
|
|
187
|
+
const provider = event.provider || 'unknown';
|
|
188
|
+
bouncesByProvider[provider] = (bouncesByProvider[provider] || 0) + 1;
|
|
189
|
+
});
|
|
190
|
+
return {
|
|
191
|
+
period: { startDate, endDate },
|
|
192
|
+
totalBounces,
|
|
193
|
+
bouncesByReason,
|
|
194
|
+
bouncesByProvider,
|
|
195
|
+
bounceRate: totalSent > 0 ? (totalBounces / totalSent) * 100 : 0
|
|
196
|
+
};
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Get analytics summary
|
|
200
|
+
*/
|
|
201
|
+
getSummary(days = 30) {
|
|
202
|
+
const startDate = new Date(Date.now() - days * 24 * 60 * 60 * 1000);
|
|
203
|
+
const endDate = new Date();
|
|
204
|
+
const deliveryReport = this.getDeliveryReport({ startDate, endDate });
|
|
205
|
+
const bounceReport = this.getBounceReport({ startDate, endDate });
|
|
206
|
+
// Get top providers by volume
|
|
207
|
+
const providerStats = {};
|
|
208
|
+
this.events
|
|
209
|
+
.filter(e => e.type === 'sent' && e.timestamp >= startDate && e.timestamp <= endDate)
|
|
210
|
+
.forEach(event => {
|
|
211
|
+
const provider = event.provider || 'unknown';
|
|
212
|
+
providerStats[provider] = (providerStats[provider] || 0) + 1;
|
|
213
|
+
});
|
|
214
|
+
const topProviders = Object.entries(providerStats)
|
|
215
|
+
.sort(([, a], [, b]) => b - a)
|
|
216
|
+
.slice(0, 5)
|
|
217
|
+
.map(([provider, count]) => ({ provider, count }));
|
|
218
|
+
// Get daily stats for the period
|
|
219
|
+
const dailyStats = this.getDailyStats(startDate, endDate);
|
|
220
|
+
return {
|
|
221
|
+
period: { startDate, endDate, days },
|
|
222
|
+
overview: {
|
|
223
|
+
totalSent: deliveryReport.totalSent,
|
|
224
|
+
deliveryRate: deliveryReport.deliveryRate,
|
|
225
|
+
openRate: deliveryReport.openRate,
|
|
226
|
+
clickRate: deliveryReport.clickRate,
|
|
227
|
+
bounceRate: bounceReport.bounceRate
|
|
228
|
+
},
|
|
229
|
+
topProviders,
|
|
230
|
+
dailyStats,
|
|
231
|
+
totalEvents: this.events.length,
|
|
232
|
+
uniqueEmails: new Set(this.events.map(e => e.emailId)).size
|
|
233
|
+
};
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* Get daily statistics for a period
|
|
237
|
+
*/
|
|
238
|
+
getDailyStats(startDate, endDate) {
|
|
239
|
+
const dailyStats = {};
|
|
240
|
+
// Initialize all days in the period
|
|
241
|
+
const currentDate = new Date(startDate);
|
|
242
|
+
while (currentDate <= endDate) {
|
|
243
|
+
const dateKey = currentDate.toISOString().split('T')[0];
|
|
244
|
+
dailyStats[dateKey] = {
|
|
245
|
+
date: new Date(currentDate),
|
|
246
|
+
sent: 0,
|
|
247
|
+
delivered: 0,
|
|
248
|
+
opened: 0,
|
|
249
|
+
clicked: 0,
|
|
250
|
+
bounced: 0
|
|
251
|
+
};
|
|
252
|
+
currentDate.setDate(currentDate.getDate() + 1);
|
|
253
|
+
}
|
|
254
|
+
// Populate with actual data
|
|
255
|
+
this.events
|
|
256
|
+
.filter(e => e.timestamp >= startDate && e.timestamp <= endDate)
|
|
257
|
+
.forEach(event => {
|
|
258
|
+
const dateKey = event.timestamp.toISOString().split('T')[0];
|
|
259
|
+
if (dailyStats[dateKey]) {
|
|
260
|
+
dailyStats[dateKey][event.type]++;
|
|
261
|
+
}
|
|
262
|
+
});
|
|
263
|
+
return Object.values(dailyStats).sort((a, b) => a.date.getTime() - b.date.getTime());
|
|
264
|
+
}
|
|
265
|
+
/**
|
|
266
|
+
* Record an event
|
|
267
|
+
*/
|
|
268
|
+
recordEvent(event) {
|
|
269
|
+
this.events.push(event);
|
|
270
|
+
// Maintain max events limit to prevent memory issues
|
|
271
|
+
if (this.events.length > this.config.maxEvents) {
|
|
272
|
+
// Remove oldest events (keep most recent maxEvents/2)
|
|
273
|
+
const keepCount = Math.floor(this.config.maxEvents / 2);
|
|
274
|
+
this.events = this.events.slice(-keepCount);
|
|
275
|
+
// Clear stats cache as some events were removed
|
|
276
|
+
this.stats.clear();
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
/**
|
|
280
|
+
* Update email stats cache
|
|
281
|
+
*/
|
|
282
|
+
updateEmailStats(emailId, eventType) {
|
|
283
|
+
const stats = this.stats.get(emailId) || {
|
|
284
|
+
emailId,
|
|
285
|
+
sent: 0,
|
|
286
|
+
delivered: 0,
|
|
287
|
+
opened: 0,
|
|
288
|
+
clicked: 0,
|
|
289
|
+
bounced: 0,
|
|
290
|
+
deliveryRate: 0,
|
|
291
|
+
openRate: 0,
|
|
292
|
+
clickRate: 0
|
|
293
|
+
};
|
|
294
|
+
// Increment the appropriate counter
|
|
295
|
+
switch (eventType) {
|
|
296
|
+
case 'sent':
|
|
297
|
+
stats.sent++;
|
|
298
|
+
break;
|
|
299
|
+
case 'delivered':
|
|
300
|
+
stats.delivered++;
|
|
301
|
+
break;
|
|
302
|
+
case 'opened':
|
|
303
|
+
stats.opened++;
|
|
304
|
+
break;
|
|
305
|
+
case 'clicked':
|
|
306
|
+
stats.clicked++;
|
|
307
|
+
break;
|
|
308
|
+
case 'bounced':
|
|
309
|
+
stats.bounced++;
|
|
310
|
+
break;
|
|
311
|
+
}
|
|
312
|
+
// Recalculate rates
|
|
313
|
+
stats.deliveryRate = stats.sent > 0 ? (stats.delivered / stats.sent) * 100 : 0;
|
|
314
|
+
stats.openRate = stats.delivered > 0 ? (stats.opened / stats.delivered) * 100 : 0;
|
|
315
|
+
stats.clickRate = stats.delivered > 0 ? (stats.clicked / stats.delivered) * 100 : 0;
|
|
316
|
+
this.stats.set(emailId, stats);
|
|
317
|
+
}
|
|
318
|
+
/**
|
|
319
|
+
* Calculate delivery rate from events
|
|
320
|
+
*/
|
|
321
|
+
calculateDeliveryRate(events) {
|
|
322
|
+
const sent = events.filter(e => e.type === 'sent').length;
|
|
323
|
+
const delivered = events.filter(e => e.type === 'delivered').length;
|
|
324
|
+
return sent > 0 ? (delivered / sent) * 100 : 0;
|
|
325
|
+
}
|
|
326
|
+
/**
|
|
327
|
+
* Calculate open rate from events
|
|
328
|
+
*/
|
|
329
|
+
calculateOpenRate(events) {
|
|
330
|
+
const delivered = events.filter(e => e.type === 'delivered').length;
|
|
331
|
+
const opened = events.filter(e => e.type === 'opened').length;
|
|
332
|
+
return delivered > 0 ? (opened / delivered) * 100 : 0;
|
|
333
|
+
}
|
|
334
|
+
/**
|
|
335
|
+
* Calculate click rate from events
|
|
336
|
+
*/
|
|
337
|
+
calculateClickRate(events) {
|
|
338
|
+
const delivered = events.filter(e => e.type === 'delivered').length;
|
|
339
|
+
const clicked = events.filter(e => e.type === 'clicked').length;
|
|
340
|
+
return delivered > 0 ? (clicked / delivered) * 100 : 0;
|
|
341
|
+
}
|
|
342
|
+
/**
|
|
343
|
+
* Update analytics configuration
|
|
344
|
+
*/
|
|
345
|
+
updateConfig(config) {
|
|
346
|
+
this.config = { ...this.config, ...config };
|
|
347
|
+
}
|
|
348
|
+
/**
|
|
349
|
+
* Export events data (for backup or migration)
|
|
350
|
+
*/
|
|
351
|
+
exportEvents() {
|
|
352
|
+
return [...this.events];
|
|
353
|
+
}
|
|
354
|
+
/**
|
|
355
|
+
* Import events data (for restore or migration)
|
|
356
|
+
*/
|
|
357
|
+
importEvents(events) {
|
|
358
|
+
this.events = events.slice(0, this.config.maxEvents);
|
|
359
|
+
this.stats.clear(); // Clear cache to force recalculation
|
|
360
|
+
}
|
|
361
|
+
/**
|
|
362
|
+
* Clear all analytics data (for testing)
|
|
363
|
+
*/
|
|
364
|
+
clear() {
|
|
365
|
+
this.events = [];
|
|
366
|
+
this.stats.clear();
|
|
367
|
+
}
|
|
368
|
+
/**
|
|
369
|
+
* Get total event count
|
|
370
|
+
*/
|
|
371
|
+
getEventCount() {
|
|
372
|
+
return this.events.length;
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
//# sourceMappingURL=email-analytics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"email-analytics.js","sourceRoot":"","sources":["../../src/managers/email-analytics.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { EmailData, ScheduledEmail, ScheduleResult, CancelResult, SchedulingConfig } from '../types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Email Scheduling System
|
|
4
|
+
* Handles queuing and scheduled delivery of emails
|
|
5
|
+
*/
|
|
6
|
+
export declare class EmailScheduler {
|
|
7
|
+
private queue;
|
|
8
|
+
private isRunning;
|
|
9
|
+
private interval;
|
|
10
|
+
private config;
|
|
11
|
+
private sendEmailCallback;
|
|
12
|
+
constructor(sendEmailCallback: (email: EmailData) => Promise<any>, config?: SchedulingConfig);
|
|
13
|
+
/**
|
|
14
|
+
* Schedule an email for future delivery
|
|
15
|
+
*/
|
|
16
|
+
scheduleEmail(email: EmailData, scheduleTime: Date): Promise<ScheduleResult>;
|
|
17
|
+
/**
|
|
18
|
+
* Cancel a scheduled email
|
|
19
|
+
*/
|
|
20
|
+
cancelScheduledEmail(scheduleId: string): Promise<CancelResult>;
|
|
21
|
+
/**
|
|
22
|
+
* Get scheduled email by ID
|
|
23
|
+
*/
|
|
24
|
+
getScheduledEmail(scheduleId: string): ScheduledEmail | null;
|
|
25
|
+
/**
|
|
26
|
+
* List all scheduled emails
|
|
27
|
+
*/
|
|
28
|
+
listScheduledEmails(status?: 'scheduled' | 'cancelled' | 'sent' | 'failed'): ScheduledEmail[];
|
|
29
|
+
/**
|
|
30
|
+
* Start the scheduler
|
|
31
|
+
*/
|
|
32
|
+
startScheduler(): void;
|
|
33
|
+
/**
|
|
34
|
+
* Stop the scheduler
|
|
35
|
+
*/
|
|
36
|
+
stopScheduler(): void;
|
|
37
|
+
/**
|
|
38
|
+
* Process the email queue
|
|
39
|
+
*/
|
|
40
|
+
private processQueue;
|
|
41
|
+
/**
|
|
42
|
+
* Process a single scheduled email
|
|
43
|
+
*/
|
|
44
|
+
private processSingleEmail;
|
|
45
|
+
/**
|
|
46
|
+
* Handle failed email delivery with retry logic
|
|
47
|
+
*/
|
|
48
|
+
private handleFailedEmail;
|
|
49
|
+
/**
|
|
50
|
+
* Sort queue by scheduled time
|
|
51
|
+
*/
|
|
52
|
+
private sortQueue;
|
|
53
|
+
/**
|
|
54
|
+
* Clean up old completed emails to prevent memory issues
|
|
55
|
+
*/
|
|
56
|
+
private cleanupCompletedEmails;
|
|
57
|
+
/**
|
|
58
|
+
* Get scheduler statistics
|
|
59
|
+
*/
|
|
60
|
+
getStats(): {
|
|
61
|
+
isRunning: boolean;
|
|
62
|
+
totalInQueue: number;
|
|
63
|
+
scheduled: number;
|
|
64
|
+
overdue: number;
|
|
65
|
+
nextScheduled: Date | null;
|
|
66
|
+
config: SchedulingConfig;
|
|
67
|
+
};
|
|
68
|
+
/**
|
|
69
|
+
* Update scheduler configuration
|
|
70
|
+
*/
|
|
71
|
+
updateConfig(config: Partial<SchedulingConfig>): void;
|
|
72
|
+
/**
|
|
73
|
+
* Clear all scheduled emails (for testing)
|
|
74
|
+
*/
|
|
75
|
+
clear(): void;
|
|
76
|
+
/**
|
|
77
|
+
* Get queue length
|
|
78
|
+
*/
|
|
79
|
+
getQueueLength(): number;
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=email-scheduler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"email-scheduler.d.ts","sourceRoot":"","sources":["../../src/managers/email-scheduler.ts"],"names":[],"mappings":"AASA,OAAO,EACL,SAAS,EACT,cAAc,EACd,cAAc,EACd,YAAY,EACZ,gBAAgB,EACjB,MAAM,aAAa,CAAC;AAErB;;;GAGG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,KAAK,CAAwB;IACrC,OAAO,CAAC,SAAS,CAAkB;IACnC,OAAO,CAAC,QAAQ,CAA+B;IAC/C,OAAO,CAAC,MAAM,CAAmB;IACjC,OAAO,CAAC,iBAAiB,CAAqC;gBAG5D,iBAAiB,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,OAAO,CAAC,GAAG,CAAC,EACrD,MAAM,GAAE,gBAKP;IAMH;;OAEG;IACG,aAAa,CAAC,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,IAAI,GAAG,OAAO,CAAC,cAAc,CAAC;IA6ClF;;OAEG;IACG,oBAAoB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAqCrE;;OAEG;IACH,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI;IAI5D;;OAEG;IACH,mBAAmB,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,WAAW,GAAG,MAAM,GAAG,QAAQ,GAAG,cAAc,EAAE;IAa7F;;OAEG;IACH,cAAc,IAAI,IAAI;IAatB;;OAEG;IACH,aAAa,IAAI,IAAI;IAcrB;;OAEG;YACW,YAAY;IAoB1B;;OAEG;YACW,kBAAkB;IAgChC;;OAEG;YACW,iBAAiB;IA2B/B;;OAEG;IACH,OAAO,CAAC,SAAS;IAIjB;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAoB9B;;OAEG;IACH,QAAQ;;;;;;;;IAiBR;;OAEG;IACH,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,gBAAgB,CAAC,GAAG,IAAI;IAUrD;;OAEG;IACH,KAAK,IAAI,IAAI;IAIb;;OAEG;IACH,cAAc,IAAI,MAAM;CAGzB"}
|