glasswork 0.10.0 → 0.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (93) hide show
  1. package/dist/email/compiler/code-generator.d.ts +11 -0
  2. package/dist/email/compiler/code-generator.d.ts.map +1 -0
  3. package/dist/email/compiler/code-generator.js +319 -0
  4. package/dist/email/compiler/code-generator.js.map +1 -0
  5. package/dist/email/compiler/compile-templates.d.ts +68 -0
  6. package/dist/email/compiler/compile-templates.d.ts.map +1 -0
  7. package/dist/email/compiler/compile-templates.js +156 -0
  8. package/dist/email/compiler/compile-templates.js.map +1 -0
  9. package/dist/email/compiler/compiler.d.ts +30 -0
  10. package/dist/email/compiler/compiler.d.ts.map +1 -0
  11. package/dist/email/compiler/compiler.js +510 -0
  12. package/dist/email/compiler/compiler.js.map +1 -0
  13. package/dist/email/compiler/index.d.ts +4 -0
  14. package/dist/email/compiler/index.d.ts.map +1 -0
  15. package/dist/email/compiler/index.js +3 -0
  16. package/dist/email/compiler/index.js.map +1 -0
  17. package/dist/email/compiler/tokenizer.d.ts +7 -0
  18. package/dist/email/compiler/tokenizer.d.ts.map +1 -0
  19. package/dist/email/compiler/tokenizer.js +154 -0
  20. package/dist/email/compiler/tokenizer.js.map +1 -0
  21. package/dist/email/compiler/type-extractor.d.ts +11 -0
  22. package/dist/email/compiler/type-extractor.d.ts.map +1 -0
  23. package/dist/email/compiler/type-extractor.js +296 -0
  24. package/dist/email/compiler/type-extractor.js.map +1 -0
  25. package/dist/email/compiler/types.d.ts +108 -0
  26. package/dist/email/compiler/types.d.ts.map +1 -0
  27. package/dist/email/compiler/types.js +2 -0
  28. package/dist/email/compiler/types.js.map +1 -0
  29. package/dist/email/config.d.ts +89 -0
  30. package/dist/email/config.d.ts.map +1 -0
  31. package/dist/email/config.js +55 -0
  32. package/dist/email/config.js.map +1 -0
  33. package/dist/email/email-service.d.ts +54 -0
  34. package/dist/email/email-service.d.ts.map +1 -0
  35. package/dist/email/email-service.js +94 -0
  36. package/dist/email/email-service.js.map +1 -0
  37. package/dist/email/index.d.ts +12 -0
  38. package/dist/email/index.d.ts.map +1 -0
  39. package/dist/email/index.js +23 -0
  40. package/dist/email/index.js.map +1 -0
  41. package/dist/email/template-registry.d.ts +83 -0
  42. package/dist/email/template-registry.d.ts.map +1 -0
  43. package/dist/email/template-registry.js +85 -0
  44. package/dist/email/template-registry.js.map +1 -0
  45. package/dist/email/templated-email-service.d.ts +59 -0
  46. package/dist/email/templated-email-service.d.ts.map +1 -0
  47. package/dist/email/templated-email-service.js +63 -0
  48. package/dist/email/templated-email-service.js.map +1 -0
  49. package/dist/email/transports/index.d.ts +3 -0
  50. package/dist/email/transports/index.d.ts.map +1 -0
  51. package/dist/email/transports/index.js +3 -0
  52. package/dist/email/transports/index.js.map +1 -0
  53. package/dist/email/transports/mock-transport.d.ts +74 -0
  54. package/dist/email/transports/mock-transport.d.ts.map +1 -0
  55. package/dist/email/transports/mock-transport.js +102 -0
  56. package/dist/email/transports/mock-transport.js.map +1 -0
  57. package/dist/email/transports/ses-transport.d.ts +65 -0
  58. package/dist/email/transports/ses-transport.d.ts.map +1 -0
  59. package/dist/email/transports/ses-transport.js +290 -0
  60. package/dist/email/transports/ses-transport.js.map +1 -0
  61. package/dist/email/types.d.ts +128 -0
  62. package/dist/email/types.d.ts.map +1 -0
  63. package/dist/email/types.js +2 -0
  64. package/dist/email/types.js.map +1 -0
  65. package/dist/email/webhooks/handler-factory.d.ts +41 -0
  66. package/dist/email/webhooks/handler-factory.d.ts.map +1 -0
  67. package/dist/email/webhooks/handler-factory.js +136 -0
  68. package/dist/email/webhooks/handler-factory.js.map +1 -0
  69. package/dist/email/webhooks/index.d.ts +6 -0
  70. package/dist/email/webhooks/index.d.ts.map +1 -0
  71. package/dist/email/webhooks/index.js +9 -0
  72. package/dist/email/webhooks/index.js.map +1 -0
  73. package/dist/email/webhooks/notification-parser.d.ts +45 -0
  74. package/dist/email/webhooks/notification-parser.d.ts.map +1 -0
  75. package/dist/email/webhooks/notification-parser.js +150 -0
  76. package/dist/email/webhooks/notification-parser.js.map +1 -0
  77. package/dist/email/webhooks/signature-verification.d.ts +38 -0
  78. package/dist/email/webhooks/signature-verification.d.ts.map +1 -0
  79. package/dist/email/webhooks/signature-verification.js +179 -0
  80. package/dist/email/webhooks/signature-verification.js.map +1 -0
  81. package/dist/email/webhooks/subscription-handler.d.ts +37 -0
  82. package/dist/email/webhooks/subscription-handler.d.ts.map +1 -0
  83. package/dist/email/webhooks/subscription-handler.js +99 -0
  84. package/dist/email/webhooks/subscription-handler.js.map +1 -0
  85. package/dist/email/webhooks/types.d.ts +187 -0
  86. package/dist/email/webhooks/types.d.ts.map +1 -0
  87. package/dist/email/webhooks/types.js +5 -0
  88. package/dist/email/webhooks/types.js.map +1 -0
  89. package/dist/index.d.ts +9 -0
  90. package/dist/index.d.ts.map +1 -1
  91. package/dist/index.js +22 -0
  92. package/dist/index.js.map +1 -1
  93. package/package.json +10 -2
@@ -0,0 +1,179 @@
1
+ import { createPublicKey, createVerify } from 'node:crypto';
2
+ import { createLogger } from '../../utils/logger.js';
3
+ const logger = createLogger('SNS');
4
+ /**
5
+ * Cache for SNS signing certificates
6
+ */
7
+ const certCache = new Map();
8
+ /**
9
+ * Default certificate cache TTL (1 hour)
10
+ */
11
+ const DEFAULT_CERT_CACHE_TTL = 60 * 60 * 1000;
12
+ /**
13
+ * AWS SNS certificate domain pattern
14
+ */
15
+ const SNS_CERT_DOMAIN_PATTERN = /^sns\.[a-z0-9-]+\.amazonaws\.com$/;
16
+ /**
17
+ * Validates that a URL is a valid AWS SNS certificate URL
18
+ */
19
+ function isValidCertUrl(url) {
20
+ try {
21
+ const parsed = new URL(url);
22
+ return (parsed.protocol === 'https:' &&
23
+ SNS_CERT_DOMAIN_PATTERN.test(parsed.hostname) &&
24
+ parsed.pathname.endsWith('.pem'));
25
+ }
26
+ catch {
27
+ return false;
28
+ }
29
+ }
30
+ /**
31
+ * Fetches the signing certificate from AWS
32
+ */
33
+ async function fetchCertificate(certUrl, options) {
34
+ const now = Date.now();
35
+ const cached = certCache.get(certUrl);
36
+ if (cached && cached.expiresAt > now) {
37
+ return cached.cert;
38
+ }
39
+ const fetchFn = options.fetchFn || fetch;
40
+ const response = await fetchFn(certUrl);
41
+ if (!response.ok) {
42
+ throw new Error(`Failed to fetch SNS certificate: ${response.status}`);
43
+ }
44
+ const cert = await response.text();
45
+ const ttl = options.certCacheTTL ?? DEFAULT_CERT_CACHE_TTL;
46
+ certCache.set(certUrl, {
47
+ cert,
48
+ expiresAt: now + ttl,
49
+ });
50
+ return cert;
51
+ }
52
+ /**
53
+ * Builds the canonical string to sign for SNS message verification
54
+ *
55
+ * Ordering differs per message type:
56
+ * - Notification: Message, MessageId, optional Subject, Timestamp, TopicArn, Type
57
+ * - SubscriptionConfirmation/UnsubscribeConfirmation: Message, MessageId, SubscribeURL, Timestamp, Token, TopicArn, Type
58
+ *
59
+ * See: https://docs.aws.amazon.com/sns/latest/dg/sns-verify-signature-of-message.html
60
+ */
61
+ export function buildStringToSign(message) {
62
+ const fields = [];
63
+ const append = (label, value) => {
64
+ if (value === undefined) {
65
+ throw new Error(`Missing required field "${label}" for SNS ${message.Type} message`);
66
+ }
67
+ fields.push(label, value);
68
+ };
69
+ append('Message', message.Message);
70
+ append('MessageId', message.MessageId);
71
+ if (message.Type === 'Notification') {
72
+ if (message.Subject) {
73
+ append('Subject', message.Subject);
74
+ }
75
+ append('Timestamp', message.Timestamp);
76
+ append('TopicArn', message.TopicArn);
77
+ append('Type', message.Type);
78
+ }
79
+ else if (message.Type === 'SubscriptionConfirmation' ||
80
+ message.Type === 'UnsubscribeConfirmation') {
81
+ append('SubscribeURL', message.SubscribeURL);
82
+ append('Timestamp', message.Timestamp);
83
+ append('Token', message.Token);
84
+ append('TopicArn', message.TopicArn);
85
+ append('Type', message.Type);
86
+ }
87
+ else {
88
+ append('Timestamp', message.Timestamp);
89
+ append('TopicArn', message.TopicArn);
90
+ append('Type', message.Type);
91
+ }
92
+ return `${fields.join('\n')}\n`;
93
+ }
94
+ /**
95
+ * Verifies the SNS message signature using Node.js crypto
96
+ */
97
+ function verifySignature(message, certificate) {
98
+ try {
99
+ const stringToSign = buildStringToSign(message);
100
+ // Extract public key from X.509 certificate
101
+ const publicKey = createPublicKey(certificate);
102
+ // SNS uses SHA-1 for SignatureVersion 1
103
+ const verify = createVerify('SHA1');
104
+ verify.update(stringToSign);
105
+ verify.end();
106
+ return verify.verify(publicKey, message.Signature, 'base64');
107
+ }
108
+ catch (error) {
109
+ logger.error('Signature verification error:', error);
110
+ return false;
111
+ }
112
+ }
113
+ /**
114
+ * Middleware that verifies AWS SNS message signatures.
115
+ *
116
+ * Protects webhook endpoints from spoofed requests by validating
117
+ * that messages are genuinely from AWS SNS.
118
+ *
119
+ * @example
120
+ * ```typescript
121
+ * import { verifySNSSignature } from 'glasswork';
122
+ *
123
+ * router.post('/webhooks/ses',
124
+ * verifySNSSignature(),
125
+ * async (c) => {
126
+ * // Message is verified to be from AWS SNS
127
+ * const body = await c.req.json();
128
+ * // ...
129
+ * }
130
+ * );
131
+ * ```
132
+ */
133
+ export function verifySNSSignature(options = {}) {
134
+ return async (c, next) => {
135
+ // Clone the request to read the body without consuming it
136
+ const body = await c.req.text();
137
+ let message;
138
+ try {
139
+ message = JSON.parse(body);
140
+ }
141
+ catch {
142
+ return c.json({ error: 'Invalid JSON body' }, 400);
143
+ }
144
+ // Validate signature version
145
+ if (message.SignatureVersion !== '1') {
146
+ return c.json({ error: 'Unsupported signature version' }, 400);
147
+ }
148
+ // Validate certificate URL
149
+ if (!isValidCertUrl(message.SigningCertURL)) {
150
+ return c.json({ error: 'Invalid certificate URL' }, 400);
151
+ }
152
+ // Fetch and cache the certificate
153
+ let certificate;
154
+ try {
155
+ certificate = await fetchCertificate(message.SigningCertURL, options);
156
+ }
157
+ catch (error) {
158
+ logger.error('Failed to fetch certificate:', error);
159
+ return c.json({ error: 'Failed to fetch signing certificate' }, 500);
160
+ }
161
+ // Verify the signature
162
+ const isValid = verifySignature(message, certificate);
163
+ if (!isValid) {
164
+ logger.warn('Invalid signature for message:', message.MessageId);
165
+ return c.json({ error: 'Invalid signature' }, 403);
166
+ }
167
+ // Store the parsed message for downstream handlers
168
+ c.set('snsMessage', message);
169
+ c.set('snsMessageRaw', body);
170
+ await next();
171
+ };
172
+ }
173
+ /**
174
+ * Clears the certificate cache (useful for testing)
175
+ */
176
+ export function clearCertCache() {
177
+ certCache.clear();
178
+ }
179
+ //# sourceMappingURL=signature-verification.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signature-verification.js","sourceRoot":"","sources":["../../../src/email/webhooks/signature-verification.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ import type { MiddlewareHandler } from 'hono';
2
+ /**
3
+ * Options for SNS subscription handling
4
+ */
5
+ export interface HandleSubscriptionOptions {
6
+ /** Custom fetch function for testing */
7
+ fetchFn?: typeof fetch;
8
+ /** Whether to auto-confirm subscriptions (default: true) */
9
+ autoConfirm?: boolean;
10
+ }
11
+ /**
12
+ * Middleware that automatically handles SNS subscription confirmations.
13
+ *
14
+ * When AWS SNS first sends notifications to an endpoint, it sends a
15
+ * SubscriptionConfirmation message that must be confirmed by visiting
16
+ * the SubscribeURL. This middleware handles that automatically.
17
+ *
18
+ * Should be used after `verifySNSSignature()` to ensure the confirmation
19
+ * request is genuine.
20
+ *
21
+ * @example
22
+ * ```typescript
23
+ * import { verifySNSSignature, handleSNSSubscription } from 'glasswork';
24
+ *
25
+ * router.post('/webhooks/ses',
26
+ * verifySNSSignature(),
27
+ * handleSNSSubscription(),
28
+ * async (c) => {
29
+ * // This only runs for actual notifications, not subscription confirmations
30
+ * const event = await parseSESNotification(c);
31
+ * // ...
32
+ * }
33
+ * );
34
+ * ```
35
+ */
36
+ export declare function handleSNSSubscription(options?: HandleSubscriptionOptions): MiddlewareHandler;
37
+ //# sourceMappingURL=subscription-handler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subscription-handler.d.ts","sourceRoot":"","sources":["../../../src/email/webhooks/subscription-handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAW,iBAAiB,EAAE,MAAM,MAAM,CAAC;AAMvD;;GAEG;AACH,MAAM,WAAW,yBAAyB;IACxC,wCAAwC;IACxC,OAAO,CAAC,EAAE,OAAO,KAAK,CAAC;IACvB,4DAA4D;IAC5D,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,GAAE,yBAA8B,GAAG,iBAAiB,CAuBhG"}
@@ -0,0 +1,99 @@
1
+ import { createLogger } from '../../utils/logger.js';
2
+ const logger = createLogger('SNS');
3
+ /**
4
+ * Middleware that automatically handles SNS subscription confirmations.
5
+ *
6
+ * When AWS SNS first sends notifications to an endpoint, it sends a
7
+ * SubscriptionConfirmation message that must be confirmed by visiting
8
+ * the SubscribeURL. This middleware handles that automatically.
9
+ *
10
+ * Should be used after `verifySNSSignature()` to ensure the confirmation
11
+ * request is genuine.
12
+ *
13
+ * @example
14
+ * ```typescript
15
+ * import { verifySNSSignature, handleSNSSubscription } from 'glasswork';
16
+ *
17
+ * router.post('/webhooks/ses',
18
+ * verifySNSSignature(),
19
+ * handleSNSSubscription(),
20
+ * async (c) => {
21
+ * // This only runs for actual notifications, not subscription confirmations
22
+ * const event = await parseSESNotification(c);
23
+ * // ...
24
+ * }
25
+ * );
26
+ * ```
27
+ */
28
+ export function handleSNSSubscription(options = {}) {
29
+ const { fetchFn = fetch, autoConfirm = true } = options;
30
+ return async (c, next) => {
31
+ const message = await getSNSMessage(c);
32
+ if (!message) {
33
+ return c.json({ error: 'Invalid JSON body' }, 400);
34
+ }
35
+ // Handle subscription confirmation
36
+ if (message.Type === 'SubscriptionConfirmation') {
37
+ const result = await handleSubscriptionConfirmation(c, message, autoConfirm, fetchFn);
38
+ if (result)
39
+ return result;
40
+ }
41
+ // Handle unsubscribe confirmation
42
+ if (message.Type === 'UnsubscribeConfirmation') {
43
+ return handleUnsubscribeConfirmation(c, message);
44
+ }
45
+ // For regular notifications, continue to the next handler
46
+ await next();
47
+ };
48
+ }
49
+ /**
50
+ * Gets SNS message from context or parses from body
51
+ */
52
+ async function getSNSMessage(c) {
53
+ let message = c.get('snsMessage');
54
+ if (!message) {
55
+ try {
56
+ const body = await c.req.text();
57
+ message = JSON.parse(body);
58
+ }
59
+ catch {
60
+ return null;
61
+ }
62
+ }
63
+ return message;
64
+ }
65
+ /**
66
+ * Handles subscription confirmation
67
+ */
68
+ async function handleSubscriptionConfirmation(c, message, autoConfirm, fetchFn) {
69
+ if (!autoConfirm) {
70
+ logger.info('Subscription confirmation received but auto-confirm disabled');
71
+ return c.json({ message: 'Subscription confirmation received' }, 200);
72
+ }
73
+ if (!message.SubscribeURL) {
74
+ logger.error('Subscription confirmation missing SubscribeURL');
75
+ return c.json({ error: 'Missing SubscribeURL' }, 400);
76
+ }
77
+ try {
78
+ logger.info('Confirming subscription to:', message.TopicArn);
79
+ const response = await fetchFn(message.SubscribeURL);
80
+ if (!response.ok) {
81
+ logger.error('Failed to confirm subscription:', response.status);
82
+ return c.json({ error: 'Failed to confirm subscription' }, 500);
83
+ }
84
+ logger.info('Subscription confirmed successfully');
85
+ return c.json({ message: 'Subscription confirmed' }, 200);
86
+ }
87
+ catch (error) {
88
+ logger.error('Error confirming subscription:', error);
89
+ return c.json({ error: 'Failed to confirm subscription' }, 500);
90
+ }
91
+ }
92
+ /**
93
+ * Handles unsubscribe confirmation
94
+ */
95
+ function handleUnsubscribeConfirmation(c, message) {
96
+ logger.info('Unsubscribe confirmation received for:', message.TopicArn);
97
+ return c.json({ message: 'Unsubscribe confirmation received' }, 200);
98
+ }
99
+ //# sourceMappingURL=subscription-handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subscription-handler.js","sourceRoot":"","sources":["../../../src/email/webhooks/subscription-handler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,187 @@
1
+ /**
2
+ * Types for SES webhook events delivered via SNS
3
+ */
4
+ /**
5
+ * Base SES event properties
6
+ */
7
+ interface BaseSESEvent {
8
+ /** SES message ID */
9
+ messageId: string;
10
+ /** When the event occurred */
11
+ timestamp: Date;
12
+ /** The recipient email address */
13
+ recipient: string;
14
+ }
15
+ /**
16
+ * Email successfully delivered
17
+ */
18
+ export interface DeliveredEvent extends BaseSESEvent {
19
+ type: 'delivered';
20
+ /** Processing time in milliseconds */
21
+ processingTimeMs?: number;
22
+ /** SMTP response from receiving server */
23
+ smtpResponse?: string;
24
+ /** Raw SES notification data */
25
+ raw: SESDeliveryNotification;
26
+ }
27
+ /**
28
+ * Email bounced (permanent or transient)
29
+ */
30
+ export interface BouncedEvent extends BaseSESEvent {
31
+ type: 'bounced';
32
+ /** Whether the bounce is permanent or transient */
33
+ bounceType: 'permanent' | 'transient';
34
+ /** Specific bounce sub-type */
35
+ bounceSubType: string;
36
+ /** Human-readable bounce reason */
37
+ reason: string;
38
+ /** Raw SES notification data */
39
+ raw: SESBounceNotification;
40
+ }
41
+ /**
42
+ * Recipient filed a complaint (marked as spam)
43
+ */
44
+ export interface ComplaintEvent extends BaseSESEvent {
45
+ type: 'complaint';
46
+ /** Type of complaint feedback */
47
+ complaintType: string;
48
+ /** User agent that filed the complaint */
49
+ userAgent?: string;
50
+ /** Raw SES notification data */
51
+ raw: SESComplaintNotification;
52
+ }
53
+ /**
54
+ * Union of all SES events
55
+ */
56
+ export type SESEvent = DeliveredEvent | BouncedEvent | ComplaintEvent;
57
+ /**
58
+ * Raw SNS message envelope
59
+ */
60
+ export interface SNSMessage {
61
+ Type: 'Notification' | 'SubscriptionConfirmation' | 'UnsubscribeConfirmation';
62
+ MessageId: string;
63
+ TopicArn: string;
64
+ Subject?: string;
65
+ Message: string;
66
+ Timestamp: string;
67
+ SignatureVersion: string;
68
+ Signature: string;
69
+ SigningCertURL: string;
70
+ UnsubscribeURL?: string;
71
+ SubscribeURL?: string;
72
+ Token?: string;
73
+ }
74
+ /**
75
+ * Raw SES mail object
76
+ */
77
+ export interface SESMailObject {
78
+ timestamp: string;
79
+ messageId: string;
80
+ source: string;
81
+ sourceArn?: string;
82
+ sendingAccountId?: string;
83
+ destination: string[];
84
+ headersTruncated: boolean;
85
+ headers: Array<{
86
+ name: string;
87
+ value: string;
88
+ }>;
89
+ commonHeaders: {
90
+ from: string[];
91
+ to: string[];
92
+ subject: string;
93
+ messageId?: string;
94
+ date?: string;
95
+ };
96
+ tags?: Record<string, string[]>;
97
+ }
98
+ /**
99
+ * Raw SES delivery notification
100
+ */
101
+ export interface SESDeliveryNotification {
102
+ notificationType: 'Delivery';
103
+ mail: SESMailObject;
104
+ delivery: {
105
+ timestamp: string;
106
+ processingTimeMillis: number;
107
+ recipients: string[];
108
+ smtpResponse: string;
109
+ reportingMTA?: string;
110
+ remoteMtaIp?: string;
111
+ };
112
+ }
113
+ /**
114
+ * Raw SES bounce notification
115
+ */
116
+ export interface SESBounceNotification {
117
+ notificationType: 'Bounce';
118
+ mail: SESMailObject;
119
+ bounce: {
120
+ bounceType: 'Undetermined' | 'Permanent' | 'Transient';
121
+ bounceSubType: string;
122
+ bouncedRecipients: Array<{
123
+ emailAddress: string;
124
+ action?: string;
125
+ status?: string;
126
+ diagnosticCode?: string;
127
+ }>;
128
+ timestamp: string;
129
+ feedbackId: string;
130
+ reportingMTA?: string;
131
+ remoteMtaIp?: string;
132
+ };
133
+ }
134
+ /**
135
+ * Raw SES complaint notification
136
+ */
137
+ export interface SESComplaintNotification {
138
+ notificationType: 'Complaint';
139
+ mail: SESMailObject;
140
+ complaint: {
141
+ complainedRecipients: Array<{
142
+ emailAddress: string;
143
+ }>;
144
+ timestamp: string;
145
+ feedbackId: string;
146
+ complaintSubType?: string;
147
+ complaintFeedbackType?: string;
148
+ userAgent?: string;
149
+ arrivalDate?: string;
150
+ };
151
+ }
152
+ /**
153
+ * Union of raw SES notifications
154
+ */
155
+ export type SESNotification = SESDeliveryNotification | SESBounceNotification | SESComplaintNotification;
156
+ /**
157
+ * Options for SNS signature verification
158
+ */
159
+ export interface VerifySignatureOptions {
160
+ /** Cache TTL for signing certificates in milliseconds (default: 1 hour) */
161
+ certCacheTTL?: number;
162
+ /** Custom fetch function for testing */
163
+ fetchFn?: typeof fetch;
164
+ }
165
+ import type { Context } from 'hono';
166
+ /**
167
+ * Event handler functions for the factory
168
+ */
169
+ export interface SESWebhookHandlers {
170
+ /** Called when an email is delivered */
171
+ onDelivered?: (event: DeliveredEvent, c: Context) => Promise<void> | void;
172
+ /** Called when an email bounces */
173
+ onBounced?: (event: BouncedEvent, c: Context) => Promise<void> | void;
174
+ /** Called when a complaint is received */
175
+ onComplaint?: (event: ComplaintEvent, c: Context) => Promise<void> | void;
176
+ }
177
+ /**
178
+ * Options for the webhook handler factory
179
+ */
180
+ export interface CreateWebhookHandlerOptions extends SESWebhookHandlers {
181
+ /** Whether to verify SNS signatures (default: true in production) */
182
+ verifySignature?: boolean;
183
+ /** Options for signature verification */
184
+ signatureOptions?: VerifySignatureOptions;
185
+ }
186
+ export {};
187
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/email/webhooks/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Types for SES webhook events delivered via SNS
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/email/webhooks/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
package/dist/index.d.ts CHANGED
@@ -37,4 +37,13 @@ export { defaultConfig, serializePrismaTypes } from './utils/serialize-prisma-ty
37
37
  export { type CloudWatchClientLike, type CloudWatchTrackerOptions, createCloudWatchTracker, createConsoleTracker, createExceptionTrackingMiddleware, defaultTrackStatusCodes, type ExceptionTracker, type ExceptionTrackingConfig, shouldTrackException, } from './observability/exception-tracking.js';
38
38
  export { type ContextAwarePinoOptions, createContextAwarePinoLogger, createPinoHttpMiddleware, lambdaPinoConfig, type PinoLogger, } from './observability/pino-logger.js';
39
39
  export { getRequestContext, getRequestId, type RequestContext, setRequestContextValue, setRequestUser, } from './observability/request-context.js';
40
+ export { type CompiledTemplate, type CompileOptions, type CompileResult, type CompilerOptions, compile as compileEmailTemplate, compileTemplates, extractTypes as extractTemplateTypes, generateInterface as generateTemplateInterface, type InferredType as TemplateInferredType, type Token as TemplateToken, tokenize as tokenizeTemplate, } from './email/compiler/index.js';
41
+ export { type EmailConfigInput, EmailConfigSchema, type MockTransportConfigInput, MockTransportConfigSchema, type SESTransportConfigInput, SESTransportConfigSchema, type SMTPTransportConfigInput, SMTPTransportConfigSchema, type TransportConfigInput, TransportConfigSchema, validateEmailConfig, } from './email/config.js';
42
+ export { EmailService, type SendOptions } from './email/email-service.js';
43
+ export { createTemplateRegistry, type TemplateDefinition, TemplateRegistry, type TemplateRenderFn, } from './email/template-registry.js';
44
+ export { type SendTemplateOptions, TemplatedEmailService, } from './email/templated-email-service.js';
45
+ export { MockTransport, type StoredEmail } from './email/transports/mock-transport.js';
46
+ export { SESTransport } from './email/transports/ses-transport.js';
47
+ export type { EmailAttachment, EmailConfig, EmailMessage, EmailModuleOptions, EmailResult, EmailTransport, OnSentHook, SESTransportConfig, SMTPTransportConfig, } from './email/types.js';
48
+ export { type BouncedEvent, type ComplaintEvent, type CreateWebhookHandlerOptions, clearCertCache, createSESWebhookHandler, type DeliveredEvent, type HandleSubscriptionOptions, handleSNSSubscription, parseSESNotification, parseSNSMessage, type SESBounceNotification, type SESComplaintNotification, type SESDeliveryNotification, type SESEvent, type SESNotification, type SESWebhookHandlers, type SNSMessage, type VerifySignatureOptions, verifySNSSignature, } from './email/webhooks/index.js';
40
49
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -43,4 +43,26 @@ export { createCloudWatchTracker, createConsoleTracker, createExceptionTrackingM
43
43
  export { createContextAwarePinoLogger, createPinoHttpMiddleware, lambdaPinoConfig, } from './observability/pino-logger.js';
44
44
  // Request Context (AsyncLocalStorage-based)
45
45
  export { getRequestContext, getRequestId, setRequestContextValue, setRequestUser, } from './observability/request-context.js';
46
+ // ============================================================================
47
+ // Email
48
+ // ============================================================================
49
+ // Template compiler (for build-time usage)
50
+ export { compile as compileEmailTemplate, compileTemplates, extractTypes as extractTemplateTypes, generateInterface as generateTemplateInterface, tokenize as tokenizeTemplate, } from './email/compiler/index.js';
51
+ // Configuration schemas
52
+ export { EmailConfigSchema, MockTransportConfigSchema, SESTransportConfigSchema, SMTPTransportConfigSchema, TransportConfigSchema, validateEmailConfig, } from './email/config.js';
53
+ export { EmailService } from './email/email-service.js';
54
+ // Template registry
55
+ export { createTemplateRegistry, TemplateRegistry, } from './email/template-registry.js';
56
+ export { TemplatedEmailService, } from './email/templated-email-service.js';
57
+ export { MockTransport } from './email/transports/mock-transport.js';
58
+ // Transports
59
+ export { SESTransport } from './email/transports/ses-transport.js';
60
+ // Webhook handlers for SES delivery tracking
61
+ export { clearCertCache,
62
+ // Handler factory
63
+ createSESWebhookHandler, handleSNSSubscription,
64
+ // Parsers
65
+ parseSESNotification, parseSNSMessage,
66
+ // Middleware
67
+ verifySNSSignature, } from './email/webhooks/index.js';
46
68
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAOH,gBAAgB;AAChB,OAAO,EAIL,yBAAyB,EACzB,YAAY,EAEZ,cAAc,EAEd,WAAW,EACX,cAAc,EACd,UAAU,EACV,YAAY,EACZ,SAAS,EAET,WAAW,EACX,WAAW,EACX,WAAW,EACX,cAAc,GACf,MAAM,mBAAmB,CAAC;AAE3B,iBAAiB;AACjB,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAwBhD,eAAe;AACf,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAClF,OAAO,EAEL,gBAAgB,EAEhB,0BAA0B,EAE1B,kBAAkB,GACnB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACnB,iBAAiB,EACjB,eAAe,EAEf,kBAAkB,EAClB,uBAAuB,EACvB,aAAa,EACb,4BAA4B,EAC5B,eAAe,EACf,yBAAyB,EACzB,iBAAiB,EACjB,uBAAuB,EACvB,wBAAwB,EACxB,2BAA2B,EAC3B,uBAAuB,EACvB,2BAA2B,EAC3B,wBAAwB,EACxB,qBAAqB,EACrB,4BAA4B,EAC5B,6BAA6B,EAC7B,mBAAmB,GACpB,MAAM,kBAAkB,CAAC;AAS1B,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAC;AAE9D,4BAA4B;AAC5B,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAmBtE,mDAAmD;AACnD,OAAO,EACL,mBAAmB,EACnB,kBAAkB,EAClB,eAAe,EACf,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,EAGhB,eAAe,EACf,kBAAkB,EAElB,oBAAoB,EACpB,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,uBAAuB,CAAC;AAE/B,aAAa;AACb,OAAO,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAC;AAEvE,UAAU;AACV,OAAO,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAC;AACjE,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EACL,eAAe,EACf,uBAAuB,EACvB,0BAA0B,EAC1B,+BAA+B,EAC/B,0BAA0B,EAC1B,wBAAwB,GACzB,MAAM,iCAAiC,CAAC;AAEzC,YAAY;AACZ,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AACvF,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAEvD,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACnF,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AACvC,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAQvC,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,mCAAmC,CAAC;AAExF,+EAA+E;AAC/E,gBAAgB;AAChB,+EAA+E;AAE/E,qBAAqB;AACrB,OAAO,EAGL,uBAAuB,EACvB,oBAAoB,EACpB,iCAAiC,EACjC,uBAAuB,EAGvB,oBAAoB,GACrB,MAAM,uCAAuC,CAAC;AAE/C,0BAA0B;AAC1B,OAAO,EAEL,4BAA4B,EAC5B,wBAAwB,EACxB,gBAAgB,GAEjB,MAAM,gCAAgC,CAAC;AACxC,4CAA4C;AAC5C,OAAO,EACL,iBAAiB,EACjB,YAAY,EAEZ,sBAAsB,EACtB,cAAc,GACf,MAAM,oCAAoC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}