@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.
- package/dist/EmailService.d.ts +24 -0
- package/dist/EmailService.d.ts.map +1 -0
- package/dist/EmailService.js +32 -0
- package/dist/EmailService.js.map +1 -0
- package/dist/EmailServiceFactory.d.ts +5 -0
- package/dist/EmailServiceFactory.d.ts.map +1 -0
- package/dist/EmailServiceFactory.js +21 -0
- package/dist/EmailServiceFactory.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -0
- package/dist/interfaces/IEmailProvider.d.ts +103 -0
- package/dist/interfaces/IEmailProvider.d.ts.map +1 -0
- package/dist/interfaces/IEmailProvider.js +11 -0
- package/dist/interfaces/IEmailProvider.js.map +1 -0
- package/dist/providers/GatewayApiEmailProvider.d.ts +41 -0
- package/dist/providers/GatewayApiEmailProvider.d.ts.map +1 -0
- package/dist/providers/GatewayApiEmailProvider.js +270 -0
- package/dist/providers/GatewayApiEmailProvider.js.map +1 -0
- package/dist/providers/MockEmailProvider.d.ts +49 -0
- package/dist/providers/MockEmailProvider.d.ts.map +1 -0
- package/dist/providers/MockEmailProvider.js +194 -0
- package/dist/providers/MockEmailProvider.js.map +1 -0
- package/dist/providers/RedirectEmailProvider.d.ts +28 -0
- package/dist/providers/RedirectEmailProvider.d.ts.map +1 -0
- package/dist/providers/RedirectEmailProvider.js +108 -0
- package/dist/providers/RedirectEmailProvider.js.map +1 -0
- package/dist/providers/SweegoEmailProvider.d.ts +36 -0
- package/dist/providers/SweegoEmailProvider.d.ts.map +1 -0
- package/dist/providers/SweegoEmailProvider.js +379 -0
- package/dist/providers/SweegoEmailProvider.js.map +1 -0
- package/dist/providers/index.d.ts +5 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +5 -0
- package/dist/providers/index.js.map +1 -0
- 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 @@
|
|
|
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"}
|
package/dist/index.d.ts
ADDED
|
@@ -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, '&')
|
|
213
|
+
.replace(/</g, '<')
|
|
214
|
+
.replace(/>/g, '>');
|
|
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(/ /g, ' ')
|
|
228
|
+
.replace(/&/g, '&')
|
|
229
|
+
.replace(/</g, '<')
|
|
230
|
+
.replace(/>/g, '>')
|
|
231
|
+
.replace(/"/g, '"')
|
|
232
|
+
.replace(/'/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"}
|