@astralibx/email-rule-engine 1.1.0 → 1.2.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/README.md CHANGED
@@ -2,486 +2,74 @@
2
2
 
3
3
  Rule-based email automation engine with MJML + Handlebars templates, per-user throttling, and Redis distributed locking.
4
4
 
5
- ## What It Does
6
-
7
- - **Templates**: MJML + Handlebars email templates with CRUD, validation, preview, and variable extraction
8
- - **Rules**: Condition-based rules that target users and send templated emails
9
- - **Throttling**: Per-user daily/weekly limits with configurable minimum gap between emails
10
- - **Distributed Locking**: Redis-based locks prevent concurrent rule runs
11
- - **Run History**: Detailed logging of every rule execution with per-rule stats
12
- - **Draft Workflow**: Supports draft → approve → send pipeline via adapter
13
-
14
- ## Prerequisites
15
-
16
- | Dependency | Version | Why |
17
- |------------|---------|-----|
18
- | Node.js | >= 18 | Runtime |
19
- | MongoDB | >= 5.0 | Data storage |
20
- | Redis | >= 6.0 | Distributed locking |
21
-
22
- ### Peer Dependencies
23
-
24
- These must be installed in your project:
25
-
26
- ```bash
27
- npm install express mongoose ioredis handlebars mjml html-to-text
28
- ```
29
-
30
- | Package | Version | Purpose |
31
- |---------|---------|---------|
32
- | `express` | ^4.18 or ^5.0 | HTTP routes |
33
- | `mongoose` | ^7.0 or ^8.0 | MongoDB ODM |
34
- | `ioredis` | ^5.0 | Redis client |
35
- | `handlebars` | ^4.7 | Template variables |
36
- | `mjml` | ^4.0 | Responsive email HTML |
37
- | `html-to-text` | ^9.0 | Plain text fallback |
38
-
39
- ## Installation
5
+ ## Install
40
6
 
41
7
  ```bash
42
8
  npm install @astralibx/email-rule-engine
43
9
  ```
44
10
 
45
- ## How It Works
46
-
47
- The engine handles the **generic plumbing** — templates, rules, throttling, locking, REST API routes, and run history. Your project provides the **specific logic** through 5 adapter functions.
48
-
49
- ```
50
- ┌─────────────────────────────────────────────────────────┐
51
- │ YOUR APPLICATION │
52
- │ │
53
- │ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
54
- │ │ queryUsers │ │ resolveData │ │ sendEmail │ │
55
- │ │ (find who │ │ (map user to │ │ (deliver or │ │
56
- │ │ to email) │ │ template │ │ save draft) │ │
57
- │ │ │ │ variables) │ │ │ │
58
- │ └──────┬───────┘ └──────┬───────┘ └──────┬───────┘ │
59
- │ │ │ │ │
60
- │ ┌──────┴───────┐ ┌──────┴───────┐ │
61
- │ │ selectAgent │ │findIdentifier│ │
62
- │ │ (pick sender) │ │ (map email │ │
63
- │ │ │ │ to contact) │ │
64
- │ └──────┬───────┘ └──────┬───────┘ │
65
- └─────────┼─────────────────┼────────────────────────────┘
66
- │ │
67
- ┌─────────▼─────────────────▼────────────────────────────┐
68
- │ @astralibx/email-rule-engine │
69
- │ │
70
- │ Templates ─► Rules ─► Runner ─► Throttle ─► Lock │
71
- │ MJML/HBS CRUD Execute Per-user Redis │
72
- │ Render Match Adapters Limits Prevent │
73
- │ Duplicates │
74
- │ │
75
- │ REST API: /templates, /rules, /runner, /settings │
76
- │ MongoDB: 5 collections auto-created │
77
- └──────────────────────────────────────────────────────────┘
78
- ```
79
-
80
11
  ## Quick Start
81
12
 
82
- ### Step 1: Create Adapters
83
-
84
- These are the 5 functions that connect the engine to YOUR data and infrastructure.
85
-
86
13
  ```typescript
87
- // adapters.ts
88
- import { SendEmailParams } from '@astralibx/email-rule-engine';
89
-
90
- // 1. Find users matching rule conditions — YOUR query logic
91
- async function queryUsers(target: any, limit: number) {
92
- // `target` contains: { role, platform, conditions[] }
93
- // Build your own query based on these conditions
94
- return db.collection('users')
95
- .find({ role: target.role, platform: target.platform })
96
- .limit(limit)
97
- .toArray();
98
- }
99
-
100
- // 2. Transform a user record into template variables
101
- // These variables become available in your Handlebars templates
102
- function resolveData(user: Record<string, unknown>) {
103
- return {
104
- user: {
105
- name: user.name,
106
- email: user.email,
107
- },
108
- platform: {
109
- name: 'My App',
110
- domain: 'myapp.com',
111
- supportEmail: 'help@myapp.com',
112
- },
113
- };
114
- }
115
-
116
- // 3. Deliver the email — save as draft, send directly, or queue
117
- async function sendEmail(params: SendEmailParams) {
118
- // params contains:
119
- // identifierId - your internal email contact ID
120
- // contactId - your internal contact ID
121
- // accountId - selected sender account ID
122
- // subject - rendered subject line
123
- // htmlBody - rendered HTML (from MJML)
124
- // textBody - rendered plain text
125
- // ruleId - which rule triggered this
126
- // autoApprove - whether to send immediately or queue for review
127
- await myEmailService.send({
128
- to: params.identifierId,
129
- subject: params.subject,
130
- html: params.htmlBody,
131
- text: params.textBody,
132
- });
133
- }
134
-
135
- // 4. Select a sending account — return null to skip this recipient
136
- async function selectAgent(identifierId: string) {
137
- const account = await myAccounts.findBestAvailable();
138
- return account ? { accountId: account.id } : null;
139
- }
140
-
141
- // 5. Map an email address to your contact/identifier system
142
- async function findIdentifier(email: string) {
143
- const contact = await myContacts.findByEmail(email);
144
- return contact
145
- ? { id: contact._id.toString(), contactId: contact.contactId.toString() }
146
- : null;
147
- }
148
-
149
- export const adapters = {
150
- queryUsers,
151
- resolveData,
152
- sendEmail,
153
- selectAgent,
154
- findIdentifier,
155
- };
156
- ```
157
-
158
- ### Step 2: Initialize the Engine
159
-
160
- ```typescript
161
- // email-engine-setup.ts
162
14
  import { createEmailRuleEngine } from '@astralibx/email-rule-engine';
163
15
  import mongoose from 'mongoose';
164
16
  import Redis from 'ioredis';
165
- import { adapters } from './adapters';
166
-
167
- const dbConnection = mongoose.createConnection('mongodb://localhost/myapp');
168
- const redis = new Redis();
169
17
 
170
18
  const engine = createEmailRuleEngine({
171
- // MongoDB connection engine creates 5 collections on this connection
172
- db: {
173
- connection: dbConnection,
174
- collectionPrefix: '', // optional: prefix collection names (e.g., 'myapp_')
175
- },
176
-
177
- // Redis used for distributed locking only
178
- redis: {
179
- connection: redis,
180
- keyPrefix: 'myapp:', // optional: prefix Redis keys
181
- },
182
-
183
- // Custom enum values for your domain
184
- // These control what values are allowed in template/rule schemas
185
- platforms: ['web', 'mobile', 'both'], // your platform identifiers
186
- audiences: ['customer', 'provider', 'all'], // your user role identifiers
187
-
188
- // Your 5 adapter functions
189
- adapters,
190
-
191
- // Optional: logger (must have info/warn/error methods)
192
- logger: console,
193
-
194
- // Optional: tuning
195
- options: {
196
- lockTTLMs: 30 * 60 * 1000, // lock timeout (default: 30 min)
197
- defaultMaxPerRun: 500, // max users per rule execution (default: 500)
19
+ db: { connection: mongoose.createConnection('mongodb://localhost/myapp') },
20
+ redis: { connection: new Redis() },
21
+ adapters: {
22
+ queryUsers: async (target, limit) => db.collection('users').find({ role: target.role }).limit(limit).toArray(),
23
+ resolveData: (user) => ({ user: { name: user.name, email: user.email }, platform: { name: 'MyApp' } }),
24
+ sendEmail: async (params) => transporter.sendMail({ to: params.identifierId, subject: params.subject, html: params.htmlBody }),
25
+ selectAgent: async () => ({ accountId: 'default' }),
26
+ findIdentifier: async (email) => { const c = await Contacts.findOne({ email }); return c ? { id: c._id.toString(), contactId: c._id.toString() } : null; },
198
27
  },
199
28
  });
200
29
 
201
- export { engine };
202
- ```
203
-
204
- ### Step 3: Mount Routes
205
-
206
- ```typescript
207
- // app.ts
208
- import express from 'express';
209
- import { engine } from './email-engine-setup';
210
-
211
- const app = express();
212
- app.use(express.json());
213
-
214
- // Mount all email rule engine routes under a prefix
215
30
  app.use('/api/email-rules', engine.routes);
216
-
217
- app.listen(3000);
218
31
  ```
219
32
 
220
- ### Step 4: Schedule Rule Execution
33
+ ## Features & Documentation
34
+
35
+ | Feature | Description | Docs |
36
+ |---------|-------------|------|
37
+ | Adapters | Connect to your data, delivery, and accounts | [adapters.md](docs/adapters.md) |
38
+ | Templates | MJML + Handlebars responsive email templates | [templates.md](docs/templates.md) |
39
+ | Rules | Condition-based targeting and automation | [rules.md](docs/rules.md) |
40
+ | Throttling | Per-user daily/weekly rate limits | [throttling.md](docs/throttling.md) |
41
+ | Send Window | Time-based execution control | [send-window.md](docs/send-window.md) |
42
+ | Delivery Delays | Natural send spread with jitter | [delivery-delays.md](docs/delivery-delays.md) |
43
+ | Progress Hooks | Live execution tracking callbacks | [progress-hooks.md](docs/progress-hooks.md) |
44
+ | SMTP Pooling | Efficient email delivery patterns | [smtp-pooling.md](docs/smtp-pooling.md) |
45
+ | Account Rotation | Multi-account sending with quotas | [account-rotation.md](docs/account-rotation.md) |
46
+ | Email Validation | MX checks and domain validation | [email-validation.md](docs/email-validation.md) |
47
+ | Execution Flow | How the runner processes rules | [execution-flow.md](docs/execution-flow.md) |
48
+ | API Routes | REST endpoint reference | [api-routes.md](docs/api-routes.md) |
49
+ | Config Reference | Full configuration options | [config-reference.md](docs/config-reference.md) |
221
50
 
222
- ```typescript
223
- import cron from 'node-cron';
224
- import { engine } from './email-engine-setup';
225
-
226
- // Run all active rules every day at 9 AM
227
- cron.schedule('0 9 * * *', () => {
228
- engine.runner.runAllRules();
229
- });
230
- ```
231
-
232
- ## What You Get Back
233
-
234
- `createEmailRuleEngine()` returns:
235
-
236
- ```typescript
237
- {
238
- routes: Router; // Express router — mount with app.use()
239
- runner: RuleRunnerService; // Call runner.runAllRules() from cron
240
- templateService: TemplateService; // Direct access if needed
241
- ruleService: RuleService; // Direct access if needed
242
- models: {
243
- EmailTemplate, // Mongoose models if you need direct DB access
244
- EmailRule,
245
- EmailRuleSend,
246
- EmailRuleRunLog,
247
- EmailThrottleConfig,
248
- };
249
- }
250
- ```
251
-
252
- ## API Routes
253
-
254
- Once mounted, these endpoints are available:
255
-
256
- ### Templates
257
-
258
- | Method | Path | Description |
259
- |--------|------|-------------|
260
- | GET | `/templates` | List all templates (filterable by `category`, `audience`, `platform`) |
261
- | POST | `/templates` | Create new template |
262
- | GET | `/templates/:id` | Get template by ID |
263
- | PUT | `/templates/:id` | Update template |
264
- | DELETE | `/templates/:id` | Delete template |
265
- | PATCH | `/templates/:id/toggle` | Toggle active/inactive |
266
- | POST | `/templates/:id/preview` | Render preview with sample data |
267
- | POST | `/templates/:id/test-email` | Send test email (requires `sendTestEmail` adapter) |
268
- | POST | `/templates/validate` | Validate MJML + Handlebars syntax |
269
- | POST | `/templates/preview` | Preview raw template without saving |
270
-
271
- ### Rules
272
-
273
- | Method | Path | Description |
274
- |--------|------|-------------|
275
- | GET | `/rules` | List all rules (with populated template info) |
276
- | POST | `/rules` | Create new rule |
277
- | GET | `/rules/:id` | Get rule by ID |
278
- | PATCH | `/rules/:id` | Update rule |
279
- | DELETE | `/rules/:id` | Delete (or disable if has send history) |
280
- | PATCH | `/rules/:id/toggle` | Toggle active/inactive |
281
- | POST | `/rules/:id/dry-run` | Count matching users without sending |
282
- | GET | `/rules/run-history` | Get execution history |
283
-
284
- ### Runner
285
-
286
- | Method | Path | Description |
287
- |--------|------|-------------|
288
- | POST | `/runner` | Trigger manual rule run (fire-and-forget) |
289
- | GET | `/runner/status` | Get latest run result |
290
-
291
- ### Settings
292
-
293
- | Method | Path | Description |
294
- |--------|------|-------------|
295
- | GET | `/settings/throttle` | Get throttle configuration |
296
- | PATCH | `/settings/throttle` | Update throttle limits |
297
-
298
- ## Config Reference
299
-
300
- ### `EmailRuleEngineConfig`
301
-
302
- | Field | Type | Required | Default | Description |
303
- |-------|------|----------|---------|-------------|
304
- | `db.connection` | `mongoose.Connection` | Yes | — | Mongoose connection for engine collections |
305
- | `db.collectionPrefix` | `string` | No | `''` | Prefix for collection names (e.g., `'myapp_'`) |
306
- | `redis.connection` | `Redis` | Yes | — | ioredis instance for distributed locking |
307
- | `redis.keyPrefix` | `string` | No | `''` | Prefix for Redis keys (e.g., `'myapp:'`) |
308
- | `platforms` | `string[]` | No | `['web', 'mobile', 'both']` | Valid platform values for schema enum validation |
309
- | `audiences` | `string[]` | No | `['customer', 'provider', 'all']` | Valid audience/role values for schema enum validation |
310
- | `adapters` | `object` | Yes | — | Your 5 project-specific callbacks (see below) |
311
- | `logger` | `LogAdapter` | No | silent | Object with `info`, `warn`, `error` methods |
312
- | `options.lockTTLMs` | `number` | No | `1800000` | Lock timeout in ms (30 min) |
313
- | `options.defaultMaxPerRun` | `number` | No | `500` | Max users processed per rule execution |
314
-
315
- ### Adapters
316
-
317
- | Adapter | Signature | Required | Description |
318
- |---------|-----------|----------|-------------|
319
- | `queryUsers` | `(target, limit) => Promise<Record[]>` | Yes | Find users matching rule target conditions. `target` has `role`, `platform`, `conditions[]` |
320
- | `resolveData` | `(user) => Record` | Yes | Transform a user record into Handlebars template variables |
321
- | `sendEmail` | `(params: SendEmailParams) => Promise<void>` | Yes | Deliver the email (send, queue, or save as draft) |
322
- | `selectAgent` | `(identifierId) => Promise<{accountId} \| null>` | Yes | Pick a sending account. Return `null` to skip this recipient |
323
- | `findIdentifier` | `(email) => Promise<{id, contactId} \| null>` | Yes | Map email address to your contact system. Return `null` to skip |
324
- | `sendTestEmail` | `(to, subject, html, text) => Promise<void>` | No | Send test email for template preview |
325
-
326
- ### `SendEmailParams`
327
-
328
- ```typescript
329
- {
330
- identifierId: string; // Your internal email contact ID
331
- contactId: string; // Your internal contact ID
332
- accountId: string; // Selected sender account ID
333
- subject: string; // Rendered subject line
334
- htmlBody: string; // Rendered HTML from MJML template
335
- textBody: string; // Rendered plain text
336
- ruleId: string; // Rule that triggered this send
337
- autoApprove: boolean; // true = send now, false = save as draft for review
338
- }
339
- ```
340
-
341
- ## Template System
342
-
343
- Templates use [MJML](https://mjml.io/) for responsive email HTML and [Handlebars](https://handlebarsjs.com/) for dynamic variables.
344
-
345
- ### Writing a Template
346
-
347
- **Subject** (Handlebars only):
348
- ```
349
- Welcome to {{platform.name}}, {{user.name}}!
350
- ```
351
-
352
- **Body** (MJML + Handlebars):
353
- ```html
354
- <mjml>
355
- <mj-body>
356
- <mj-section>
357
- <mj-column>
358
- <mj-text>
359
- Hi {{user.name}},
360
- Welcome to {{platform.name}}!
361
- {{#if subscription}}
362
- Your {{subscription.planName}} plan includes {{subscription.sessions}} sessions.
363
- {{/if}}
364
- </mj-text>
365
- <mj-button href="{{platform.bookingLink}}">Book Now</mj-button>
366
- </mj-column>
367
- </mj-section>
368
- </mj-body>
369
- </mjml>
370
- ```
371
-
372
- The variables available in templates depend on what your `resolveData` adapter returns.
373
-
374
- ### Built-in Handlebars Helpers
375
-
376
- | Helper | Usage | Output |
377
- |--------|-------|--------|
378
- | `currency` | `{{currency 1500}}` | `₹1,500` |
379
- | `formatDate` | `{{formatDate date}}` | `13 Mar 2026` |
380
- | `capitalize` | `{{capitalize "hello"}}` | `Hello` |
381
- | `lowercase` | `{{lowercase "HELLO"}}` | `hello` |
382
- | `uppercase` | `{{uppercase "hello"}}` | `HELLO` |
383
- | `join` | `{{join items ", "}}` | `a, b, c` |
384
- | `pluralize` | `{{pluralize count "item" "items"}}` | `items` |
385
- | `eq/neq/gt/lt/gte/lte` | `{{#if (eq a b)}}` | Comparison |
386
- | `not` | `{{#if (not val)}}` | Negation |
387
-
388
- ## Rule Execution Flow
389
-
390
- When `engine.runner.runAllRules()` is called:
391
-
392
- ```
393
- 1. Acquire Redis lock (prevents concurrent runs)
394
- 2. Load throttle config (daily/weekly limits, min gap)
395
- 3. Load all active rules (sorted by priority)
396
- 4. For each rule:
397
- a. Load linked template
398
- b. Call YOUR queryUsers(target, limit) adapter
399
- c. For each matched user:
400
- - Check send history (sendOnce, resendAfterDays)
401
- - Call YOUR findIdentifier(email) adapter
402
- - Check throttle limits (daily, weekly, min gap)
403
- - Call YOUR selectAgent(identifierId) adapter
404
- - Call YOUR resolveData(user) adapter
405
- - Render template (MJML → HTML, Handlebars → variables)
406
- - Call YOUR sendEmail(params) adapter
407
- - Log send for deduplication
408
- d. Update rule stats (totalSent, lastRunAt)
409
- 5. Save run log with per-rule statistics
410
- 6. Release Redis lock
411
- ```
412
-
413
- ## Collections Created
414
-
415
- The engine creates these MongoDB collections (prefixed if `db.collectionPrefix` is set):
416
-
417
- | Collection | Purpose | Auto-cleanup |
418
- |------------|---------|--------------|
419
- | `email_templates` | MJML + Handlebars templates | — |
420
- | `email_rules` | Automation rules with conditions and targeting | — |
421
- | `email_rule_sends` | Per-user send tracking for deduplication | — |
422
- | `email_rule_run_logs` | Execution history with per-rule stats | 90 days TTL |
423
- | `email_throttle_config` | Throttle settings (singleton document) | — |
51
+ ## Prerequisites
424
52
 
425
- ## Throttle Configuration
53
+ | Dependency | Version | Purpose |
54
+ |------------|---------|---------|
55
+ | Node.js | >= 18 | Runtime |
56
+ | MongoDB | >= 5.0 | Data storage (5 collections auto-created) |
57
+ | Redis | >= 6.0 | Distributed locking |
426
58
 
427
- Default throttle settings (configurable via `PATCH /settings/throttle`):
59
+ ### Peer Dependencies
428
60
 
429
- ```json
430
- {
431
- "maxPerUserPerDay": 2,
432
- "maxPerUserPerWeek": 5,
433
- "minGapDays": 1,
434
- "window": "rolling"
435
- }
61
+ ```bash
62
+ npm install express mongoose ioredis handlebars mjml html-to-text
436
63
  ```
437
64
 
438
- Rules with `bypassThrottle: true` or `emailType: 'transactional'` skip throttle checks.
439
-
440
- ## TypeScript Exports
441
-
442
- The package exports everything you might need:
443
-
444
- ```typescript
445
- // Factory
446
- import { createEmailRuleEngine } from '@astralibx/email-rule-engine';
447
-
448
- // Types
449
- import type {
450
- EmailRuleEngineConfig,
451
- SendEmailParams,
452
- AgentSelection,
453
- RecipientIdentifier,
454
- LogAdapter,
455
- EmailRule,
456
- EmailTemplate,
457
- RuleTarget,
458
- RuleCondition,
459
- RuleRunStats,
460
- PerRuleStats,
461
- CreateEmailRuleInput,
462
- UpdateEmailRuleInput,
463
- CreateEmailTemplateInput,
464
- UpdateEmailTemplateInput,
465
- } from '@astralibx/email-rule-engine';
466
-
467
- // Enums
468
- import {
469
- TemplateAudience,
470
- TemplateCategory,
471
- RuleOperator,
472
- EmailType,
473
- RunTrigger,
474
- } from '@astralibx/email-rule-engine';
475
-
476
- // Services (for advanced usage)
477
- import {
478
- TemplateRenderService,
479
- TemplateService,
480
- RuleService,
481
- RuleRunnerService,
482
- RedisLock,
483
- } from '@astralibx/email-rule-engine';
484
- ```
65
+ | Package | Version | Purpose |
66
+ |---------|---------|---------|
67
+ | `express` | ^4.18 or ^5.0 | HTTP routes |
68
+ | `mongoose` | ^7.0 or ^8.0 | MongoDB ODM |
69
+ | `ioredis` | ^5.0 | Redis client |
70
+ | `handlebars` | ^4.7 | Template variables |
71
+ | `mjml` | ^4.0 | Responsive email HTML |
72
+ | `html-to-text` | ^9.0 | Plain text fallback |
485
73
 
486
74
  ## License
487
75
 
@@ -1 +1 @@
1
- {"version":3,"file":"rule-runner.service.d.ts","sourceRoot":"","sources":["../../src/services/rule-runner.service.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AACrE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AACtE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACtE,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,mCAAmC,CAAC;AAClF,OAAO,EAAE,UAAU,EAAa,MAAM,gBAAgB,CAAC;AACvD,OAAO,KAAK,EAAE,YAAY,EAAgB,MAAM,qBAAqB,CAAC;AACtE,OAAO,KAAK,EAAE,qBAAqB,EAAc,MAAM,uBAAuB,CAAC;AAK/E,UAAU,YAAY;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,IAAI,GAAG,IAAI,CAAC;CAC3B;AAQD,qBAAa,iBAAiB;IAM1B,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,aAAa;IACrB,OAAO,CAAC,aAAa;IACrB,OAAO,CAAC,eAAe;IACvB,OAAO,CAAC,mBAAmB;IAC3B,OAAO,CAAC,MAAM;IAVhB,OAAO,CAAC,gBAAgB,CAA+B;IACvD,OAAO,CAAC,IAAI,CAAY;IACxB,OAAO,CAAC,MAAM,CAAa;gBAGjB,SAAS,EAAE,cAAc,EACzB,aAAa,EAAE,kBAAkB,EACjC,aAAa,EAAE,kBAAkB,EACjC,eAAe,EAAE,oBAAoB,EACrC,mBAAmB,EAAE,wBAAwB,EAC7C,MAAM,EAAE,qBAAqB;IAajC,WAAW,CAAC,WAAW,GAAE,OAAO,UAAU,CAAC,MAAM,OAAO,UAAU,CAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;IA0ErG,WAAW,CACf,IAAI,EAAE,GAAG,EACT,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,EACtC,cAAc,EAAE,GAAG,GAClB,OAAO,CAAC,YAAY,CAAC;IA4HxB,OAAO,CAAC,aAAa;IA8BrB,gBAAgB,CAAC,WAAW,EAAE,GAAG,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC;CAuBhE"}
1
+ {"version":3,"file":"rule-runner.service.d.ts","sourceRoot":"","sources":["../../src/services/rule-runner.service.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AACrE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AACtE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACtE,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,mCAAmC,CAAC;AAClF,OAAO,EAAE,UAAU,EAAa,MAAM,gBAAgB,CAAC;AACvD,OAAO,KAAK,EAAE,YAAY,EAAgB,MAAM,qBAAqB,CAAC;AACtE,OAAO,KAAK,EAAE,qBAAqB,EAAc,MAAM,uBAAuB,CAAC;AAK/E,UAAU,YAAY;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,IAAI,GAAG,IAAI,CAAC;CAC3B;AAQD,qBAAa,iBAAiB;IAM1B,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,aAAa;IACrB,OAAO,CAAC,aAAa;IACrB,OAAO,CAAC,eAAe;IACvB,OAAO,CAAC,mBAAmB;IAC3B,OAAO,CAAC,MAAM;IAVhB,OAAO,CAAC,gBAAgB,CAA+B;IACvD,OAAO,CAAC,IAAI,CAAY;IACxB,OAAO,CAAC,MAAM,CAAa;gBAGjB,SAAS,EAAE,cAAc,EACzB,aAAa,EAAE,kBAAkB,EACjC,aAAa,EAAE,kBAAkB,EACjC,eAAe,EAAE,oBAAoB,EACrC,mBAAmB,EAAE,wBAAwB,EAC7C,MAAM,EAAE,qBAAqB;IAajC,WAAW,CAAC,WAAW,GAAE,OAAO,UAAU,CAAC,MAAM,OAAO,UAAU,CAAmB,GAAG,OAAO,CAAC,IAAI,CAAC;IAyFrG,WAAW,CACf,IAAI,EAAE,GAAG,EACT,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,EACtC,cAAc,EAAE,GAAG,GAClB,OAAO,CAAC,YAAY,CAAC;IA2IxB,OAAO,CAAC,aAAa;IA8BrB,gBAAgB,CAAC,WAAW,EAAE,GAAG,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC;CAuBhE"}
@@ -34,6 +34,16 @@ class RuleRunnerService {
34
34
  this.logger = config.logger || defaultLogger;
35
35
  }
36
36
  async runAllRules(triggeredBy = enums_1.RunTrigger.Cron) {
37
+ if (this.config.options?.sendWindow) {
38
+ const { startHour, endHour, timezone } = this.config.options.sendWindow;
39
+ const now = new Date();
40
+ const formatter = new Intl.DateTimeFormat('en-US', { hour: 'numeric', hour12: false, timeZone: timezone });
41
+ const currentHour = parseInt(formatter.format(now), 10);
42
+ if (currentHour < startHour || currentHour >= endHour) {
43
+ this.logger.info('Outside send window, skipping run', { currentHour, startHour, endHour, timezone });
44
+ return;
45
+ }
46
+ }
37
47
  const lockAcquired = await this.lock.acquire();
38
48
  if (!lockAcquired) {
39
49
  this.logger.warn('Rule runner already executing, skipping');
@@ -43,6 +53,7 @@ class RuleRunnerService {
43
53
  try {
44
54
  const throttleConfig = await this.EmailThrottleConfig.getConfig();
45
55
  const activeRules = await this.EmailRule.findActive();
56
+ this.config.hooks?.onRunStart?.({ rulesCount: activeRules.length, triggeredBy });
46
57
  if (activeRules.length === 0) {
47
58
  this.logger.info('No active rules to process');
48
59
  await this.EmailRuleRunLog.create({
@@ -83,6 +94,7 @@ class RuleRunnerService {
83
94
  totalStats,
84
95
  perRuleStats
85
96
  });
97
+ this.config.hooks?.onRunComplete?.({ duration: Date.now() - runStartTime, totalStats, perRuleStats });
86
98
  this.logger.info('Rule run completed', {
87
99
  triggeredBy,
88
100
  rulesProcessed: activeRules.length,
@@ -113,6 +125,7 @@ class RuleRunnerService {
113
125
  return stats;
114
126
  }
115
127
  stats.matched = users.length;
128
+ this.config.hooks?.onRuleStart?.({ ruleId: rule._id.toString(), ruleName: rule.name, matchedCount: users.length });
116
129
  if (users.length === 0)
117
130
  return stats;
118
131
  const userIds = users.map(u => u._id?.toString()).filter(Boolean);
@@ -138,7 +151,8 @@ class RuleRunnerService {
138
151
  }
139
152
  }
140
153
  const compiled = this.templateRenderer.compileBatch(template.subject, template.body, template.textBody);
141
- for (const user of users) {
154
+ for (let i = 0; i < users.length; i++) {
155
+ const user = users[i];
142
156
  try {
143
157
  const userId = user._id?.toString();
144
158
  const email = user.email;
@@ -196,9 +210,20 @@ class RuleRunnerService {
196
210
  lastSentDate: new Date()
197
211
  });
198
212
  stats.sent++;
213
+ this.config.hooks?.onSend?.({ ruleId: rule._id.toString(), ruleName: rule.name, email, status: 'sent' });
214
+ if (i < users.length - 1) {
215
+ const delayMs = this.config.options?.delayBetweenSendsMs || 0;
216
+ const jitterMs = this.config.options?.jitterMs || 0;
217
+ if (delayMs > 0 || jitterMs > 0) {
218
+ const totalDelay = delayMs + Math.floor(Math.random() * (jitterMs + 1));
219
+ if (totalDelay > 0)
220
+ await new Promise(resolve => setTimeout(resolve, totalDelay));
221
+ }
222
+ }
199
223
  }
200
224
  catch (err) {
201
225
  stats.errors++;
226
+ this.config.hooks?.onSend?.({ ruleId: rule._id.toString(), ruleName: rule.name, email: user.email || 'unknown', status: 'error' });
202
227
  this.logger.error(`Rule "${rule.name}" failed for user ${user._id?.toString()}`, { error: err });
203
228
  }
204
229
  }
@@ -206,6 +231,7 @@ class RuleRunnerService {
206
231
  $set: { lastRunAt: new Date(), lastRunStats: stats },
207
232
  $inc: { totalSent: stats.sent, totalSkipped: stats.skipped }
208
233
  });
234
+ this.config.hooks?.onRuleComplete?.({ ruleId: rule._id.toString(), ruleName: rule.name, stats });
209
235
  return stats;
210
236
  }
211
237
  checkThrottle(rule, userId, throttleMap, config, stats) {
@@ -1 +1 @@
1
- {"version":3,"file":"rule-runner.service.js","sourceRoot":"","sources":["../../src/services/rule-runner.service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"rule-runner.service.js","sourceRoot":"","sources":["../../src/services/rule-runner.service.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import type { Connection } from 'mongoose';
2
2
  import type { Redis } from 'ioredis';
3
- import { RuleTarget } from './rule.types';
3
+ import type { RuleTarget, RuleRunStats, PerRuleStats } from './rule.types';
4
4
  export interface SendEmailParams {
5
5
  identifierId: string;
6
6
  contactId: string;
@@ -46,6 +46,40 @@ export interface EmailRuleEngineConfig {
46
46
  options?: {
47
47
  lockTTLMs?: number;
48
48
  defaultMaxPerRun?: number;
49
+ sendWindow?: {
50
+ startHour: number;
51
+ endHour: number;
52
+ timezone: string;
53
+ };
54
+ delayBetweenSendsMs?: number;
55
+ jitterMs?: number;
56
+ };
57
+ hooks?: {
58
+ onRunStart?: (info: {
59
+ rulesCount: number;
60
+ triggeredBy: string;
61
+ }) => void;
62
+ onRuleStart?: (info: {
63
+ ruleId: string;
64
+ ruleName: string;
65
+ matchedCount: number;
66
+ }) => void;
67
+ onSend?: (info: {
68
+ ruleId: string;
69
+ ruleName: string;
70
+ email: string;
71
+ status: 'sent' | 'error';
72
+ }) => void;
73
+ onRuleComplete?: (info: {
74
+ ruleId: string;
75
+ ruleName: string;
76
+ stats: RuleRunStats;
77
+ }) => void;
78
+ onRunComplete?: (info: {
79
+ duration: number;
80
+ totalStats: RuleRunStats;
81
+ perRuleStats: PerRuleStats[];
82
+ }) => void;
49
83
  };
50
84
  }
51
85
  //# sourceMappingURL=config.types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.types.d.ts","sourceRoot":"","sources":["../../src/types/config.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAC3C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,MAAM,WAAW,eAAe;IAC9B,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;IAC5D,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;IAC5D,KAAK,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;CAC9D;AAED,MAAM,WAAW,qBAAqB;IACpC,EAAE,EAAE;QACF,UAAU,EAAE,UAAU,CAAC;QACvB,gBAAgB,CAAC,EAAE,MAAM,CAAC;KAC3B,CAAC;IAEF,KAAK,EAAE;QACL,UAAU,EAAE,KAAK,CAAC;QAClB,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,CAAC;IAEF,QAAQ,EAAE;QACR,UAAU,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC;QACtF,WAAW,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACxE,SAAS,EAAE,CAAC,MAAM,EAAE,eAAe,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;QACtD,WAAW,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;QACtE,cAAc,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC,CAAC;QACvE,aAAa,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;KAC5F,CAAC;IAEF,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IAErB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IAErB,MAAM,CAAC,EAAE,UAAU,CAAC;IAEpB,OAAO,CAAC,EAAE;QACR,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;KAC3B,CAAC;CACH"}
1
+ {"version":3,"file":"config.types.d.ts","sourceRoot":"","sources":["../../src/types/config.types.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@astralibx/email-rule-engine",
3
- "version": "1.1.0",
3
+ "version": "1.2.0",
4
4
  "description": "Rule-based email automation engine with MJML + Handlebars templates, throttling, and distributed locking",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",