@groundbrick/email-service 1.1.3 → 1.1.4

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 (37) hide show
  1. package/dist/EmailService.d.ts +24 -0
  2. package/dist/EmailService.d.ts.map +1 -0
  3. package/dist/EmailService.js +32 -0
  4. package/dist/EmailService.js.map +1 -0
  5. package/dist/EmailServiceFactory.d.ts +5 -0
  6. package/dist/EmailServiceFactory.d.ts.map +1 -0
  7. package/dist/EmailServiceFactory.js +21 -0
  8. package/dist/EmailServiceFactory.js.map +1 -0
  9. package/dist/index.d.ts +5 -0
  10. package/dist/index.d.ts.map +1 -0
  11. package/dist/index.js +8 -0
  12. package/dist/index.js.map +1 -0
  13. package/dist/interfaces/IEmailProvider.d.ts +103 -0
  14. package/dist/interfaces/IEmailProvider.d.ts.map +1 -0
  15. package/dist/interfaces/IEmailProvider.js +11 -0
  16. package/dist/interfaces/IEmailProvider.js.map +1 -0
  17. package/dist/providers/GatewayApiEmailProvider.d.ts +41 -0
  18. package/dist/providers/GatewayApiEmailProvider.d.ts.map +1 -0
  19. package/dist/providers/GatewayApiEmailProvider.js +270 -0
  20. package/dist/providers/GatewayApiEmailProvider.js.map +1 -0
  21. package/dist/providers/MockEmailProvider.d.ts +49 -0
  22. package/dist/providers/MockEmailProvider.d.ts.map +1 -0
  23. package/dist/providers/MockEmailProvider.js +194 -0
  24. package/dist/providers/MockEmailProvider.js.map +1 -0
  25. package/dist/providers/RedirectEmailProvider.d.ts +28 -0
  26. package/dist/providers/RedirectEmailProvider.d.ts.map +1 -0
  27. package/dist/providers/RedirectEmailProvider.js +108 -0
  28. package/dist/providers/RedirectEmailProvider.js.map +1 -0
  29. package/dist/providers/SweegoEmailProvider.d.ts +36 -0
  30. package/dist/providers/SweegoEmailProvider.d.ts.map +1 -0
  31. package/dist/providers/SweegoEmailProvider.js +379 -0
  32. package/dist/providers/SweegoEmailProvider.js.map +1 -0
  33. package/dist/providers/index.d.ts +5 -0
  34. package/dist/providers/index.d.ts.map +1 -0
  35. package/dist/providers/index.js +5 -0
  36. package/dist/providers/index.js.map +1 -0
  37. package/package.json +8 -9
@@ -0,0 +1,24 @@
1
+ import { EmailConfig, EmailMessage, EmailResult, DeliveryReport, WebhookValidationResult, WebhookValidationOptions } from './interfaces/IEmailProvider.js';
2
+ /**
3
+ * EmailService - Main entry point for sending emails
4
+ *
5
+ * Unlike SmsService, this class allows multiple instances to support
6
+ * different configurations (useful for multi-tenancy or different email contexts)
7
+ */
8
+ export declare class EmailService {
9
+ private provider;
10
+ constructor(config: EmailConfig);
11
+ /**
12
+ * Send an email message
13
+ */
14
+ send(message: EmailMessage): Promise<EmailResult>;
15
+ /**
16
+ * Get delivery report for a sent email
17
+ */
18
+ getDeliveryReport(messageId: string): Promise<DeliveryReport | null>;
19
+ /**
20
+ * Validate a webhook payload from the email provider
21
+ */
22
+ validateWebhook(payload: any, signature?: string, options?: WebhookValidationOptions): WebhookValidationResult;
23
+ }
24
+ //# sourceMappingURL=EmailService.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EmailService.d.ts","sourceRoot":"","sources":["../src/EmailService.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,WAAW,EACX,YAAY,EACZ,WAAW,EACX,cAAc,EACd,uBAAuB,EACvB,wBAAwB,EACzB,MAAM,gCAAgC,CAAC;AAGxC;;;;;GAKG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAiB;gBAErB,MAAM,EAAE,WAAW;IAI/B;;OAEG;IACG,IAAI,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC;IAIvD;;OAEG;IACG,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IAI1E;;OAEG;IACH,eAAe,CACb,OAAO,EAAE,GAAG,EACZ,SAAS,CAAC,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE,wBAAwB,GACjC,uBAAuB;CAG3B"}
@@ -0,0 +1,32 @@
1
+ import { EmailServiceFactory } from './EmailServiceFactory.js';
2
+ /**
3
+ * EmailService - Main entry point for sending emails
4
+ *
5
+ * Unlike SmsService, this class allows multiple instances to support
6
+ * different configurations (useful for multi-tenancy or different email contexts)
7
+ */
8
+ export class EmailService {
9
+ provider;
10
+ constructor(config) {
11
+ this.provider = EmailServiceFactory.create(config);
12
+ }
13
+ /**
14
+ * Send an email message
15
+ */
16
+ async send(message) {
17
+ return this.provider.send(message);
18
+ }
19
+ /**
20
+ * Get delivery report for a sent email
21
+ */
22
+ async getDeliveryReport(messageId) {
23
+ return this.provider.getDeliveryReport(messageId);
24
+ }
25
+ /**
26
+ * Validate a webhook payload from the email provider
27
+ */
28
+ validateWebhook(payload, signature, options) {
29
+ return this.provider.validateWebhook(payload, signature, options);
30
+ }
31
+ }
32
+ //# sourceMappingURL=EmailService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EmailService.js","sourceRoot":"","sources":["../src/EmailService.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAE/D;;;;;GAKG;AACH,MAAM,OAAO,YAAY;IACf,QAAQ,CAAiB;IAEjC,YAAY,MAAmB;QAC7B,IAAI,CAAC,QAAQ,GAAG,mBAAmB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACrD,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,IAAI,CAAC,OAAqB;QAC9B,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACrC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,iBAAiB,CAAC,SAAiB;QACvC,OAAO,IAAI,CAAC,QAAQ,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;IACpD,CAAC;IAED;;OAEG;IACH,eAAe,CACb,OAAY,EACZ,SAAkB,EAClB,OAAkC;QAElC,OAAO,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;IACpE,CAAC;CACF"}
@@ -0,0 +1,5 @@
1
+ import { IEmailProvider, EmailConfig } from './interfaces/IEmailProvider.js';
2
+ export declare class EmailServiceFactory {
3
+ static create(config: EmailConfig): IEmailProvider;
4
+ }
5
+ //# sourceMappingURL=EmailServiceFactory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EmailServiceFactory.d.ts","sourceRoot":"","sources":["../src/EmailServiceFactory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAM7E,qBAAa,mBAAmB;IAC9B,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,WAAW,GAAG,cAAc;CAkBnD"}
@@ -0,0 +1,21 @@
1
+ import { GatewayApiEmailProvider } from './providers/GatewayApiEmailProvider.js';
2
+ import { MockEmailProvider } from './providers/MockEmailProvider.js';
3
+ import { RedirectEmailProvider } from './providers/RedirectEmailProvider.js';
4
+ import { SweegoEmailProvider } from './providers/SweegoEmailProvider.js';
5
+ export class EmailServiceFactory {
6
+ static create(config) {
7
+ switch (config.provider) {
8
+ case 'gatewayapi':
9
+ return new GatewayApiEmailProvider(config.config);
10
+ case 'mock':
11
+ return new MockEmailProvider(config.config);
12
+ case 'redirect':
13
+ return new RedirectEmailProvider(config.config);
14
+ case 'sweego':
15
+ return new SweegoEmailProvider(config.config);
16
+ default:
17
+ throw new Error(`Provider ${config.provider} not supported`);
18
+ }
19
+ }
20
+ }
21
+ //# sourceMappingURL=EmailServiceFactory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EmailServiceFactory.js","sourceRoot":"","sources":["../src/EmailServiceFactory.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,uBAAuB,EAAE,MAAM,wCAAwC,CAAC;AACjF,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AACrE,OAAO,EAAE,qBAAqB,EAAE,MAAM,sCAAsC,CAAC;AAC7E,OAAO,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AAEzE,MAAM,OAAO,mBAAmB;IAC9B,MAAM,CAAC,MAAM,CAAC,MAAmB;QAC/B,QAAQ,MAAM,CAAC,QAAQ,EAAE,CAAC;YACxB,KAAK,YAAY;gBACf,OAAO,IAAI,uBAAuB,CAAC,MAAM,CAAC,MAAa,CAAC,CAAC;YAE3D,KAAK,MAAM;gBACT,OAAO,IAAI,iBAAiB,CAAC,MAAM,CAAC,MAAa,CAAC,CAAC;YAErD,KAAK,UAAU;gBACb,OAAO,IAAI,qBAAqB,CAAC,MAAM,CAAC,MAAa,CAAC,CAAC;YAEzD,KAAK,QAAQ;gBACX,OAAO,IAAI,mBAAmB,CAAC,MAAM,CAAC,MAAa,CAAC,CAAC;YAEvD;gBACE,MAAM,IAAI,KAAK,CAAC,YAAY,MAAM,CAAC,QAAQ,gBAAgB,CAAC,CAAC;QACjE,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,5 @@
1
+ export { EmailService } from './EmailService.js';
2
+ export { EmailServiceFactory } from './EmailServiceFactory.js';
3
+ export * from './interfaces/IEmailProvider.js';
4
+ export * from './providers/index.js';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAG/D,cAAc,gCAAgC,CAAC;AAG/C,cAAc,sBAAsB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,8 @@
1
+ // Main service
2
+ export { EmailService } from './EmailService.js';
3
+ export { EmailServiceFactory } from './EmailServiceFactory.js';
4
+ // Interfaces and types
5
+ export * from './interfaces/IEmailProvider.js';
6
+ // Providers
7
+ export * from './providers/index.js';
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,eAAe;AACf,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAE/D,uBAAuB;AACvB,cAAc,gCAAgC,CAAC;AAE/C,YAAY;AACZ,cAAc,sBAAsB,CAAC"}
@@ -0,0 +1,103 @@
1
+ export interface IEmailProvider {
2
+ send(message: EmailMessage): Promise<EmailResult>;
3
+ getDeliveryReport(messageId: string): Promise<DeliveryReport | null>;
4
+ validateWebhook(payload: any, signature?: string, options?: WebhookValidationOptions): WebhookValidationResult;
5
+ }
6
+ export interface WebhookValidationOptions {
7
+ headers?: Record<string, string | string[] | undefined>;
8
+ rawBody?: string;
9
+ }
10
+ export interface EmailAddress {
11
+ address: string;
12
+ name?: string;
13
+ }
14
+ export interface EmailAttachment {
15
+ filename: string;
16
+ content: Buffer | string;
17
+ contentType: string;
18
+ }
19
+ export interface EmailTemplate {
20
+ id?: string;
21
+ variables: Record<string, string>;
22
+ }
23
+ export interface EmailTracking {
24
+ opens: boolean;
25
+ clicks: boolean;
26
+ }
27
+ export interface EmailMessage {
28
+ to: EmailAddress | EmailAddress[];
29
+ from?: EmailAddress;
30
+ cc?: EmailAddress[];
31
+ bcc?: EmailAddress[];
32
+ replyTo?: EmailAddress;
33
+ subject: string;
34
+ text?: string;
35
+ html?: string;
36
+ attachments?: EmailAttachment[];
37
+ template?: EmailTemplate;
38
+ tracking?: EmailTracking;
39
+ metadata?: Record<string, any>;
40
+ }
41
+ export interface EmailResult {
42
+ success: boolean;
43
+ messageId?: string;
44
+ status: EmailStatus;
45
+ timestamp: Date;
46
+ error?: string;
47
+ providerResponse?: any;
48
+ }
49
+ export declare enum EmailStatus {
50
+ QUEUED = "queued",
51
+ SENT = "sent",
52
+ DELIVERED = "delivered",
53
+ BOUNCED = "bounced",
54
+ FAILED = "failed",
55
+ DEFERRED = "deferred",
56
+ BLOCKED = "blocked"
57
+ }
58
+ export interface DeliveryReport {
59
+ messageId: string;
60
+ status: EmailStatus;
61
+ timestamp: Date;
62
+ recipient?: string;
63
+ error?: string;
64
+ providerData?: any;
65
+ }
66
+ export interface WebhookValidationResult {
67
+ isValid: boolean;
68
+ payload?: DeliveryReport;
69
+ error?: string;
70
+ }
71
+ export type EmailProviderType = 'gatewayapi' | 'mock' | 'redirect' | 'sweego';
72
+ export interface EmailConfig {
73
+ provider: EmailProviderType;
74
+ config: GatewayApiEmailConfig | MockEmailConfig | RedirectEmailConfig | SweegoEmailConfig;
75
+ }
76
+ export interface GatewayApiEmailConfig {
77
+ token: string;
78
+ baseUrl?: string;
79
+ webhookSecret?: string;
80
+ defaultFrom: EmailAddress;
81
+ }
82
+ export interface MockEmailConfig {
83
+ simulateDelay?: number;
84
+ simulateFailures?: boolean;
85
+ defaultFrom: EmailAddress;
86
+ }
87
+ export interface RedirectEmailConfig {
88
+ redirectTo: string;
89
+ defaultFrom: EmailAddress;
90
+ addOriginalToSubject?: boolean;
91
+ baseProvider?: IEmailProvider;
92
+ }
93
+ export interface SweegoEmailConfig {
94
+ defaultFrom: EmailAddress;
95
+ apiKey?: string;
96
+ accessToken?: string;
97
+ baseUrl?: string;
98
+ providerSlug?: string;
99
+ clientId?: string;
100
+ channel?: string;
101
+ webhookSecret?: string;
102
+ }
103
+ //# sourceMappingURL=IEmailProvider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IEmailProvider.d.ts","sourceRoot":"","sources":["../../src/interfaces/IEmailProvider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ export var EmailStatus;
2
+ (function (EmailStatus) {
3
+ EmailStatus["QUEUED"] = "queued";
4
+ EmailStatus["SENT"] = "sent";
5
+ EmailStatus["DELIVERED"] = "delivered";
6
+ EmailStatus["BOUNCED"] = "bounced";
7
+ EmailStatus["FAILED"] = "failed";
8
+ EmailStatus["DEFERRED"] = "deferred";
9
+ EmailStatus["BLOCKED"] = "blocked";
10
+ })(EmailStatus || (EmailStatus = {}));
11
+ //# sourceMappingURL=IEmailProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IEmailProvider.js","sourceRoot":"","sources":["../../src/interfaces/IEmailProvider.ts"],"names":[],"mappings":"AA4DA,MAAM,CAAN,IAAY,WAQX;AARD,WAAY,WAAW;IACrB,gCAAiB,CAAA;IACjB,4BAAa,CAAA;IACb,sCAAuB,CAAA;IACvB,kCAAmB,CAAA;IACnB,gCAAiB,CAAA;IACjB,oCAAqB,CAAA;IACrB,kCAAmB,CAAA;AACrB,CAAC,EARW,WAAW,KAAX,WAAW,QAQtB"}
@@ -0,0 +1,41 @@
1
+ import { IEmailProvider, EmailMessage, EmailResult, DeliveryReport, WebhookValidationResult, GatewayApiEmailConfig, WebhookValidationOptions } from '../interfaces/IEmailProvider.js';
2
+ export declare class GatewayApiEmailProvider implements IEmailProvider {
3
+ private token;
4
+ private baseUrl;
5
+ private webhookSecret?;
6
+ private defaultFrom;
7
+ constructor(config: GatewayApiEmailConfig);
8
+ send(message: EmailMessage): Promise<EmailResult>;
9
+ getDeliveryReport(messageId: string): Promise<DeliveryReport | null>;
10
+ validateWebhook(payload: any, signature?: string, _options?: WebhookValidationOptions): WebhookValidationResult;
11
+ /**
12
+ * Format email address to string format (Name <email@example.com> or email@example.com)
13
+ */
14
+ private formatAddress;
15
+ /**
16
+ * Build recipients array for GatewayAPI format
17
+ */
18
+ private buildRecipients;
19
+ private mapRecipientAddress;
20
+ /**
21
+ * Encode attachments to base64
22
+ */
23
+ private encodeAttachments;
24
+ private convertTextToHtml;
25
+ private convertHtmlToPlainText;
26
+ /**
27
+ * Build callback URL, adding https:// if needed
28
+ */
29
+ private buildCallbackUrl;
30
+ /**
31
+ * Map GatewayAPI email status codes to our EmailStatus enum
32
+ * Based on GatewayAPI documentation:
33
+ * - PROCESSED: successfully received and ready to send
34
+ * - DELIVERED: successfully delivered
35
+ * - DEFERRED: delayed (temporary issue with recipient server)
36
+ * - BOUNCED: could not be delivered (typically unknown address)
37
+ * - BLOCKED: blocked by the server
38
+ */
39
+ private mapGatewayApiStatus;
40
+ }
41
+ //# sourceMappingURL=GatewayApiEmailProvider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GatewayApiEmailProvider.d.ts","sourceRoot":"","sources":["../../src/providers/GatewayApiEmailProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,cAAc,EACd,YAAY,EACZ,WAAW,EACX,cAAc,EACd,uBAAuB,EACvB,qBAAqB,EAIrB,wBAAwB,EAC3B,MAAM,iCAAiC,CAAC;AAGzC,qBAAa,uBAAwB,YAAW,cAAc;IAC1D,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,aAAa,CAAC,CAAS;IAC/B,OAAO,CAAC,WAAW,CAAe;gBAEtB,MAAM,EAAE,qBAAqB;IAOnC,IAAI,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC;IAmFjD,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IA8B1E,eAAe,CACX,OAAO,EAAE,GAAG,EACZ,SAAS,CAAC,EAAE,MAAM,EAClB,QAAQ,CAAC,EAAE,wBAAwB,GACpC,uBAAuB;IA0C1B;;OAEG;IACH,OAAO,CAAC,aAAa;IAUrB;;OAEG;IACH,OAAO,CAAC,eAAe;IAiCvB,OAAO,CAAC,mBAAmB;IAM3B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAczB,OAAO,CAAC,iBAAiB;IAazB,OAAO,CAAC,sBAAsB;IAqB9B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAaxB;;;;;;;;OAQG;IACH,OAAO,CAAC,mBAAmB;CAY9B"}
@@ -0,0 +1,270 @@
1
+ import { EmailStatus } from '../interfaces/IEmailProvider.js';
2
+ import jwt from 'jsonwebtoken';
3
+ export class GatewayApiEmailProvider {
4
+ token;
5
+ baseUrl;
6
+ webhookSecret;
7
+ defaultFrom;
8
+ constructor(config) {
9
+ this.token = config.token;
10
+ this.baseUrl = config.baseUrl;
11
+ this.webhookSecret = config.webhookSecret;
12
+ this.defaultFrom = config.defaultFrom;
13
+ }
14
+ async send(message) {
15
+ try {
16
+ // Encode token as Base64 for Basic Auth
17
+ const authHeader = `Basic ${Buffer.from(this.token + ':').toString('base64')}`;
18
+ const templateKeys = message.template?.variables
19
+ ? Object.keys(message.template.variables)
20
+ : undefined;
21
+ const htmlContent = message.html ?? this.convertTextToHtml(message.text);
22
+ if (!htmlContent) {
23
+ throw new Error('Email message must include html or text content');
24
+ }
25
+ const plainTextContent = message.text ?? this.convertHtmlToPlainText(message.html);
26
+ // Build request body according to GatewayAPI Email docs
27
+ const requestBody = {
28
+ html: htmlContent,
29
+ plaintext: plainTextContent,
30
+ subject: message.subject,
31
+ from: this.formatAddress(message.from || this.defaultFrom),
32
+ recipients: this.buildRecipients(message, templateKeys),
33
+ userref: message.metadata?.reference,
34
+ callback_url: this.buildCallbackUrl(message.metadata?.callbackUrl)
35
+ };
36
+ if (message.replyTo) {
37
+ requestBody.reply = this.formatAddress(message.replyTo);
38
+ }
39
+ // Handle templates with tags
40
+ if (templateKeys && templateKeys.length > 0) {
41
+ requestBody.tags = templateKeys.map(key => `%${key}`);
42
+ }
43
+ // Handle attachments
44
+ if (message.attachments && message.attachments.length > 0) {
45
+ requestBody.attachments = this.encodeAttachments(message.attachments);
46
+ }
47
+ const response = await fetch(`${this.baseUrl}/rest/email`, {
48
+ method: 'POST',
49
+ headers: {
50
+ 'Authorization': authHeader,
51
+ 'Content-Type': 'application/json'
52
+ },
53
+ body: JSON.stringify(requestBody)
54
+ });
55
+ const responseData = await response.json();
56
+ if (!response.ok) {
57
+ return {
58
+ success: false,
59
+ status: EmailStatus.FAILED,
60
+ timestamp: new Date(),
61
+ error: responseData.message || `HTTP ${response.status}`,
62
+ providerResponse: responseData
63
+ };
64
+ }
65
+ // GatewayAPI returns an array of message IDs
66
+ const messageId = responseData.ids?.[0]?.toString();
67
+ return {
68
+ success: true,
69
+ messageId,
70
+ status: EmailStatus.QUEUED, // GatewayAPI returns PROCESSED initially
71
+ timestamp: new Date(),
72
+ providerResponse: responseData
73
+ };
74
+ }
75
+ catch (error) {
76
+ return {
77
+ success: false,
78
+ status: EmailStatus.FAILED,
79
+ timestamp: new Date(),
80
+ error: error instanceof Error ? error.message : String(error)
81
+ };
82
+ }
83
+ }
84
+ async getDeliveryReport(messageId) {
85
+ try {
86
+ const authHeader = `Basic ${Buffer.from(this.token + ':').toString('base64')}`;
87
+ const response = await fetch(`${this.baseUrl}/rest/email/${messageId}`, {
88
+ method: 'GET',
89
+ headers: {
90
+ 'Authorization': authHeader
91
+ }
92
+ });
93
+ if (!response.ok) {
94
+ return null;
95
+ }
96
+ const data = await response.json();
97
+ return {
98
+ messageId,
99
+ status: this.mapGatewayApiStatus(data.status),
100
+ timestamp: data.time ? new Date(data.time * 1000) : new Date(),
101
+ recipient: data.email_address,
102
+ providerData: data
103
+ };
104
+ }
105
+ catch (error) {
106
+ return null;
107
+ }
108
+ }
109
+ validateWebhook(payload, signature, _options) {
110
+ try {
111
+ // If webhook secret is configured, validate the signature
112
+ if (this.webhookSecret && signature) {
113
+ try {
114
+ jwt.verify(signature, this.webhookSecret);
115
+ }
116
+ catch {
117
+ return { isValid: false, error: 'Invalid webhook signature' };
118
+ }
119
+ }
120
+ // Validate payload structure (delivery report)
121
+ if (!payload.id || !payload.status) {
122
+ return {
123
+ isValid: false,
124
+ error: 'Invalid webhook payload: missing id or status'
125
+ };
126
+ }
127
+ // Parse delivery report from GatewayAPI webhook
128
+ const deliveryReport = {
129
+ messageId: payload.id?.toString() || '',
130
+ status: this.mapGatewayApiStatus(payload.status),
131
+ timestamp: payload.time ? new Date(payload.time * 1000) : new Date(),
132
+ recipient: payload.email_address,
133
+ error: payload.details,
134
+ providerData: payload
135
+ };
136
+ return {
137
+ isValid: true,
138
+ payload: deliveryReport
139
+ };
140
+ }
141
+ catch (error) {
142
+ return {
143
+ isValid: false,
144
+ error: error instanceof Error ? error.message : String(error)
145
+ };
146
+ }
147
+ }
148
+ /**
149
+ * Format email address to string format (Name <email@example.com> or email@example.com)
150
+ */
151
+ formatAddress(address) {
152
+ const normalizedAddress = (address.address || '').trim();
153
+ if (!normalizedAddress) {
154
+ throw new Error('Sender address is required');
155
+ }
156
+ // GatewayAPI email endpoint expects a single RFC5322 mailbox string without extra metadata.
157
+ return normalizedAddress;
158
+ }
159
+ /**
160
+ * Build recipients array for GatewayAPI format
161
+ */
162
+ buildRecipients(message, templateKeys) {
163
+ const recipients = [];
164
+ // Main recipients (to)
165
+ const toAddresses = Array.isArray(message.to) ? message.to : [message.to];
166
+ for (const to of toAddresses) {
167
+ const recipient = {
168
+ address: to.address
169
+ };
170
+ if (to.name) {
171
+ recipient.name = to.name;
172
+ }
173
+ // Add template variables if provided
174
+ if (templateKeys && templateKeys.length && message.template?.variables) {
175
+ recipient.tagvalues = templateKeys.map(key => message.template.variables[key] ?? '');
176
+ }
177
+ if (message.cc && message.cc.length > 0) {
178
+ recipient.cc = message.cc.map(cc => this.mapRecipientAddress(cc));
179
+ }
180
+ if (message.bcc && message.bcc.length > 0) {
181
+ recipient.bcc = message.bcc.map(bcc => this.mapRecipientAddress(bcc));
182
+ }
183
+ recipients.push(recipient);
184
+ }
185
+ return recipients;
186
+ }
187
+ mapRecipientAddress(address) {
188
+ return address.name
189
+ ? { address: address.address, name: address.name }
190
+ : { address: address.address };
191
+ }
192
+ /**
193
+ * Encode attachments to base64
194
+ */
195
+ encodeAttachments(attachments) {
196
+ return attachments.map(attachment => {
197
+ const content = attachment.content instanceof Buffer
198
+ ? attachment.content.toString('base64')
199
+ : Buffer.from(attachment.content).toString('base64');
200
+ return {
201
+ filename: attachment.filename,
202
+ data: content,
203
+ mimetype: attachment.contentType
204
+ };
205
+ });
206
+ }
207
+ convertTextToHtml(text) {
208
+ if (!text) {
209
+ return undefined;
210
+ }
211
+ const escaped = text
212
+ .replace(/&/g, '&amp;')
213
+ .replace(/</g, '&lt;')
214
+ .replace(/>/g, '&gt;');
215
+ return `<pre style="font-family:inherit;white-space:pre-wrap;">${escaped}</pre>`;
216
+ }
217
+ convertHtmlToPlainText(html) {
218
+ if (!html) {
219
+ return undefined;
220
+ }
221
+ return html
222
+ .replace(/<style[\s\S]*?<\/style>/gi, '')
223
+ .replace(/<script[\s\S]*?<\/script>/gi, '')
224
+ .replace(/<br\s*\/>/gi, '\n')
225
+ .replace(/<\/(p|div|li|tr|h[1-6])>/gi, '\n')
226
+ .replace(/<[^>]+>/g, '')
227
+ .replace(/&nbsp;/g, ' ')
228
+ .replace(/&amp;/g, '&')
229
+ .replace(/&lt;/g, '<')
230
+ .replace(/&gt;/g, '>')
231
+ .replace(/&quot;/g, '"')
232
+ .replace(/&#039;/g, "'")
233
+ .replace(/\n{3,}/g, '\n\n')
234
+ .trim();
235
+ }
236
+ /**
237
+ * Build callback URL, adding https:// if needed
238
+ */
239
+ buildCallbackUrl(callbackUrl) {
240
+ if (!callbackUrl) {
241
+ return undefined;
242
+ }
243
+ // Avoid duplicating schemes if caller already provided one
244
+ if (callbackUrl.startsWith('http://') || callbackUrl.startsWith('https://')) {
245
+ return callbackUrl;
246
+ }
247
+ return `https://${callbackUrl}`;
248
+ }
249
+ /**
250
+ * Map GatewayAPI email status codes to our EmailStatus enum
251
+ * Based on GatewayAPI documentation:
252
+ * - PROCESSED: successfully received and ready to send
253
+ * - DELIVERED: successfully delivered
254
+ * - DEFERRED: delayed (temporary issue with recipient server)
255
+ * - BOUNCED: could not be delivered (typically unknown address)
256
+ * - BLOCKED: blocked by the server
257
+ */
258
+ mapGatewayApiStatus(status) {
259
+ const statusMap = {
260
+ 'PROCESSED': EmailStatus.QUEUED,
261
+ 'DELIVERED': EmailStatus.DELIVERED,
262
+ 'DEFERRED': EmailStatus.DEFERRED,
263
+ 'BOUNCED': EmailStatus.BOUNCED,
264
+ 'BLOCKED': EmailStatus.BLOCKED,
265
+ 'FAILED': EmailStatus.FAILED
266
+ };
267
+ return statusMap[status?.toUpperCase()] || EmailStatus.QUEUED;
268
+ }
269
+ }
270
+ //# sourceMappingURL=GatewayApiEmailProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GatewayApiEmailProvider.js","sourceRoot":"","sources":["../../src/providers/GatewayApiEmailProvider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ import { IEmailProvider, EmailMessage, EmailResult, DeliveryReport, WebhookValidationResult, MockEmailConfig, EmailStatus, WebhookValidationOptions } from '../interfaces/IEmailProvider.js';
2
+ interface SentEmail {
3
+ id: string;
4
+ message: EmailMessage;
5
+ sentAt: Date;
6
+ status: EmailStatus;
7
+ }
8
+ export declare class MockEmailProvider implements IEmailProvider {
9
+ private simulateDelay;
10
+ private simulateFailures;
11
+ private defaultFrom;
12
+ private sentEmails;
13
+ private messageIdCounter;
14
+ constructor(config: MockEmailConfig);
15
+ send(message: EmailMessage): Promise<EmailResult>;
16
+ getDeliveryReport(messageId: string): Promise<DeliveryReport | null>;
17
+ validateWebhook(payload: any, signature?: string, _options?: WebhookValidationOptions): WebhookValidationResult;
18
+ /**
19
+ * Get all sent emails (useful for testing)
20
+ */
21
+ getSentEmails(): SentEmail[];
22
+ /**
23
+ * Clear all sent emails (useful for testing)
24
+ */
25
+ clearSentEmails(): void;
26
+ /**
27
+ * Get a specific sent email by ID (useful for testing)
28
+ */
29
+ getSentEmail(messageId: string): SentEmail | undefined;
30
+ /**
31
+ * Log email to console (only in development)
32
+ */
33
+ private logEmail;
34
+ /**
35
+ * Convert HTML to plain text (basic implementation)
36
+ */
37
+ private htmlToPlainText;
38
+ /**
39
+ * Extract 2FA/verification code from email content
40
+ * Looks for 6-digit codes commonly used in 2FA
41
+ */
42
+ private extract2FACode;
43
+ /**
44
+ * Simple delay helper
45
+ */
46
+ private delay;
47
+ }
48
+ export {};
49
+ //# sourceMappingURL=MockEmailProvider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MockEmailProvider.d.ts","sourceRoot":"","sources":["../../src/providers/MockEmailProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,cAAc,EACd,YAAY,EACZ,WAAW,EACX,cAAc,EACd,uBAAuB,EACvB,eAAe,EACf,WAAW,EAEX,wBAAwB,EAC3B,MAAM,iCAAiC,CAAC;AAEzC,UAAU,SAAS;IACf,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,YAAY,CAAC;IACtB,MAAM,EAAE,IAAI,CAAC;IACb,MAAM,EAAE,WAAW,CAAC;CACvB;AAED,qBAAa,iBAAkB,YAAW,cAAc;IACpD,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,gBAAgB,CAAU;IAClC,OAAO,CAAC,WAAW,CAAe;IAClC,OAAO,CAAC,UAAU,CAAqC;IACvD,OAAO,CAAC,gBAAgB,CAAK;gBAEjB,MAAM,EAAE,eAAe;IAM7B,IAAI,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC;IAyCjD,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IAoB1E,eAAe,CACX,OAAO,EAAE,GAAG,EACZ,SAAS,CAAC,EAAE,MAAM,EAClB,QAAQ,CAAC,EAAE,wBAAwB,GACpC,uBAAuB;IAQ1B;;OAEG;IACH,aAAa,IAAI,SAAS,EAAE;IAI5B;;OAEG;IACH,eAAe,IAAI,IAAI;IAKvB;;OAEG;IACH,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS;IAItD;;OAEG;IACH,OAAO,CAAC,QAAQ;IAuDhB;;OAEG;IACH,OAAO,CAAC,eAAe;IAoBvB;;;OAGG;IACH,OAAO,CAAC,cAAc;IAsBtB;;OAEG;IACH,OAAO,CAAC,KAAK;CAGhB"}