@stacksjs/ts-cloud-core 0.1.6 → 0.1.7
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/advanced-features.test.d.ts +0 -0
- package/dist/aws/cloudformation.d.ts +69 -0
- package/dist/aws/cloudfront.d.ts +21 -0
- package/dist/aws/credentials.d.ts +66 -0
- package/dist/aws/credentials.test.d.ts +0 -0
- package/dist/aws/index.d.ts +73 -0
- package/dist/aws/s3.d.ts +130 -0
- package/dist/aws/s3.test.d.ts +0 -0
- package/dist/aws/signature.d.ts +101 -0
- package/dist/aws/signature.test.d.ts +0 -0
- package/dist/backup/disaster-recovery.d.ts +98 -0
- package/dist/backup/disaster-recovery.test.d.ts +0 -0
- package/dist/backup/index.d.ts +24 -0
- package/dist/backup/manager.d.ts +112 -0
- package/dist/backup/manager.test.d.ts +0 -0
- package/dist/cicd/circleci.d.ts +47 -0
- package/dist/cicd/github-actions.d.ts +55 -0
- package/dist/cicd/gitlab-ci.d.ts +46 -0
- package/dist/cicd/index.d.ts +3 -0
- package/dist/cli/history.d.ts +66 -0
- package/dist/cli/index.d.ts +5 -0
- package/dist/cli/progress.d.ts +97 -0
- package/dist/cli/repl.d.ts +76 -0
- package/dist/cli/suggestions.d.ts +67 -0
- package/dist/cli/table.d.ts +70 -0
- package/dist/cli/table.test.d.ts +0 -0
- package/dist/cloudformation/builder.d.ts +59 -0
- package/dist/cloudformation/builder.test.d.ts +0 -0
- package/dist/cloudformation/builders/api-gateway.d.ts +30 -0
- package/dist/cloudformation/builders/cache.d.ts +35 -0
- package/dist/cloudformation/builders/cdn.d.ts +34 -0
- package/dist/cloudformation/builders/compute.d.ts +66 -0
- package/dist/cloudformation/builders/database.d.ts +61 -0
- package/dist/cloudformation/builders/functions.d.ts +32 -0
- package/dist/cloudformation/builders/messaging.d.ts +17 -0
- package/dist/cloudformation/builders/monitoring.d.ts +36 -0
- package/dist/cloudformation/builders/network.d.ts +14 -0
- package/dist/cloudformation/builders/queue.d.ts +8 -0
- package/dist/cloudformation/builders/security.d.ts +31 -0
- package/dist/cloudformation/builders/storage.d.ts +8 -0
- package/dist/cloudformation/index.d.ts +24 -0
- package/dist/cloudformation/types.d.ts +132 -0
- package/dist/compliance/aws-config.d.ts +88 -0
- package/dist/compliance/cloudtrail.d.ts +96 -0
- package/dist/compliance/compliance.test.d.ts +0 -0
- package/dist/compliance/guardduty.d.ts +110 -0
- package/dist/compliance/index.d.ts +50 -0
- package/dist/compliance/security-hub.d.ts +110 -0
- package/dist/containers/build-optimization.d.ts +110 -0
- package/dist/containers/containers.test.d.ts +0 -0
- package/dist/containers/image-scanning.d.ts +96 -0
- package/dist/containers/index.d.ts +4 -0
- package/dist/containers/registry.d.ts +99 -0
- package/dist/containers/service-mesh.d.ts +206 -0
- package/dist/database/database.test.d.ts +0 -0
- package/dist/database/index.d.ts +4 -0
- package/dist/database/migrations.d.ts +102 -0
- package/dist/database/performance.d.ts +168 -0
- package/dist/database/replicas.d.ts +146 -0
- package/dist/database/users.d.ts +102 -0
- package/dist/dependency-graph.d.ts +19 -0
- package/dist/deployment/ab-testing.d.ts +114 -0
- package/dist/deployment/blue-green.d.ts +98 -0
- package/dist/deployment/canary.d.ts +103 -0
- package/dist/deployment/deployment.test.d.ts +0 -0
- package/dist/deployment/index.d.ts +45 -0
- package/dist/deployment/progressive.d.ts +34 -0
- package/dist/dns/dns.test.d.ts +0 -0
- package/dist/dns/dnssec.d.ts +75 -0
- package/dist/dns/index.d.ts +3 -0
- package/dist/dns/resolver.d.ts +150 -0
- package/dist/dns/routing.d.ts +217 -0
- package/dist/email/advanced/analytics.d.ts +78 -0
- package/dist/email/advanced/index.d.ts +7 -0
- package/dist/email/advanced/rules.d.ts +60 -0
- package/dist/email/advanced/scheduling.d.ts +63 -0
- package/dist/email/advanced/search.d.ts +76 -0
- package/dist/email/advanced/shared-mailboxes.d.ts +66 -0
- package/dist/email/advanced/templates.d.ts +39 -0
- package/dist/email/advanced/threading.d.ts +53 -0
- package/dist/email/analytics.d.ts +144 -0
- package/dist/email/bounce-handling.d.ts +120 -0
- package/dist/email/email.test.d.ts +0 -0
- package/dist/email/handlers/__tests__/inbound.test.d.ts +0 -0
- package/dist/email/handlers/__tests__/outbound.test.d.ts +0 -0
- package/dist/email/handlers/converter.d.ts +225 -0
- package/dist/email/handlers/feedback.d.ts +226 -0
- package/dist/email/handlers/inbound.d.ts +167 -0
- package/dist/email/handlers/outbound.d.ts +176 -0
- package/dist/email/index.d.ts +6 -0
- package/dist/email/reputation.d.ts +97 -0
- package/dist/email/templates.d.ts +82 -0
- package/dist/errors/index.d.ts +186 -0
- package/dist/errors/index.test.d.ts +0 -0
- package/dist/health-checks/index.d.ts +35 -0
- package/dist/index.d.ts +256 -0
- package/dist/index.js +63499 -0
- package/dist/intrinsic-functions.d.ts +37 -0
- package/dist/lambda/concurrency.d.ts +98 -0
- package/dist/lambda/destinations.d.ts +99 -0
- package/dist/lambda/dlq.d.ts +109 -0
- package/dist/lambda/index.d.ts +6 -0
- package/dist/lambda/lambda.test.d.ts +0 -0
- package/dist/lambda/layers.d.ts +81 -0
- package/dist/lambda/versions.d.ts +91 -0
- package/dist/lambda/vpc.d.ts +116 -0
- package/dist/local/config.d.ts +44 -0
- package/dist/local/index.d.ts +2 -0
- package/dist/local/mock-aws.d.ts +60 -0
- package/dist/modules/ai.d.ts +47 -0
- package/dist/modules/api.d.ts +98 -0
- package/dist/modules/auth.d.ts +165 -0
- package/dist/modules/cache.d.ts +73 -0
- package/dist/modules/cdn.d.ts +125 -0
- package/dist/modules/communication.d.ts +98 -0
- package/dist/modules/compute.d.ts +309 -0
- package/dist/modules/database.d.ts +105 -0
- package/dist/modules/deployment.d.ts +181 -0
- package/dist/modules/dns.d.ts +45 -0
- package/dist/modules/email.d.ts +217 -0
- package/dist/modules/filesystem.d.ts +94 -0
- package/dist/modules/index.d.ts +27 -0
- package/dist/modules/messaging.d.ts +108 -0
- package/dist/modules/monitoring.d.ts +127 -0
- package/dist/modules/network.d.ts +102 -0
- package/dist/modules/parameter-store.d.ts +33 -0
- package/dist/modules/permissions.d.ts +132 -0
- package/dist/modules/phone.d.ts +80 -0
- package/dist/modules/queue.d.ts +210 -0
- package/dist/modules/redirects.d.ts +59 -0
- package/dist/modules/registry.d.ts +73 -0
- package/dist/modules/search.d.ts +56 -0
- package/dist/modules/secrets.d.ts +80 -0
- package/dist/modules/security.d.ts +100 -0
- package/dist/modules/sms.d.ts +52 -0
- package/dist/modules/storage.d.ts +160 -0
- package/dist/modules/workflow.d.ts +205 -0
- package/dist/multi-account/config.d.ts +315 -0
- package/dist/multi-account/index.d.ts +2 -0
- package/dist/multi-account/manager.d.ts +100 -0
- package/dist/multi-region/cross-region.d.ts +114 -0
- package/dist/multi-region/index.d.ts +3 -0
- package/dist/multi-region/manager.d.ts +72 -0
- package/dist/multi-region/regions.d.ts +98 -0
- package/dist/network-security/index.d.ts +39 -0
- package/dist/observability/index.d.ts +4 -0
- package/dist/observability/logs.d.ts +129 -0
- package/dist/observability/metrics.d.ts +153 -0
- package/dist/observability/observability.test.d.ts +0 -0
- package/dist/observability/synthetics.d.ts +146 -0
- package/dist/observability/xray.d.ts +129 -0
- package/dist/phone/advanced/analytics.d.ts +66 -0
- package/dist/phone/advanced/callbacks.d.ts +50 -0
- package/dist/phone/advanced/index.d.ts +4 -0
- package/dist/phone/advanced/ivr-builder.d.ts +83 -0
- package/dist/phone/advanced/recording.d.ts +48 -0
- package/dist/phone/handlers/__tests__/incoming-call.test.d.ts +0 -0
- package/dist/phone/handlers/incoming-call.d.ts +115 -0
- package/dist/phone/handlers/missed-call.d.ts +114 -0
- package/dist/phone/handlers/voicemail.d.ts +177 -0
- package/dist/phone/index.d.ts +2 -0
- package/dist/presets/api-backend.d.ts +11 -0
- package/dist/presets/data-pipeline.d.ts +11 -0
- package/dist/presets/extend.d.ts +194 -0
- package/dist/presets/extend.test.d.ts +0 -0
- package/dist/presets/fullstack-app.d.ts +12 -0
- package/dist/presets/index.d.ts +24 -0
- package/dist/presets/jamstack.d.ts +12 -0
- package/dist/presets/microservices.d.ts +18 -0
- package/dist/presets/ml-api.d.ts +13 -0
- package/dist/presets/nodejs-server.d.ts +14 -0
- package/dist/presets/nodejs-serverless.d.ts +14 -0
- package/dist/presets/realtime-app.d.ts +11 -0
- package/dist/presets/static-site.d.ts +12 -0
- package/dist/presets/traditional-web-app.d.ts +16 -0
- package/dist/presets/wordpress.d.ts +12 -0
- package/dist/preview/github.d.ts +32 -0
- package/dist/preview/github.test.d.ts +0 -0
- package/dist/preview/index.d.ts +27 -0
- package/dist/preview/manager.d.ts +58 -0
- package/dist/preview/manager.test.d.ts +0 -0
- package/dist/preview/notifications.d.ts +55 -0
- package/dist/preview/notifications.test.d.ts +0 -0
- package/dist/queue/batch-processing.d.ts +87 -0
- package/dist/queue/dlq-monitoring.d.ts +95 -0
- package/dist/queue/fifo.d.ts +90 -0
- package/dist/queue/index.d.ts +4 -0
- package/dist/queue/management.d.ts +105 -0
- package/dist/queue/queue.test.d.ts +0 -0
- package/dist/resource-mgmt/index.d.ts +29 -0
- package/dist/resource-naming.d.ts +26 -0
- package/dist/s3/index.d.ts +173 -0
- package/dist/schema/index.d.ts +9 -0
- package/dist/security/certificate-manager.d.ts +121 -0
- package/dist/security/index.d.ts +4 -0
- package/dist/security/scanning.d.ts +147 -0
- package/dist/security/secrets-manager.d.ts +144 -0
- package/dist/security/secrets-rotation.d.ts +115 -0
- package/dist/security/security.test.d.ts +0 -0
- package/dist/sms/advanced/ab-testing.d.ts +54 -0
- package/dist/sms/advanced/analytics.d.ts +56 -0
- package/dist/sms/advanced/campaigns.d.ts +82 -0
- package/dist/sms/advanced/chatbot.d.ts +48 -0
- package/dist/sms/advanced/index.d.ts +6 -0
- package/dist/sms/advanced/link-tracking.d.ts +42 -0
- package/dist/sms/advanced/mms.d.ts +35 -0
- package/dist/sms/handlers/__tests__/send.test.d.ts +0 -0
- package/dist/sms/handlers/delivery-status.d.ts +131 -0
- package/dist/sms/handlers/receive.d.ts +160 -0
- package/dist/sms/handlers/send.d.ts +172 -0
- package/dist/sms/index.d.ts +2 -0
- package/dist/stack-diff.d.ts +34 -0
- package/dist/static-site/index.d.ts +49 -0
- package/dist/template-builder.d.ts +14 -0
- package/dist/template-validator.d.ts +24 -0
- package/dist/utils/cache.d.ts +55 -0
- package/dist/utils/diff.d.ts +48 -0
- package/dist/utils/hash.d.ts +58 -0
- package/dist/utils/index.d.ts +4 -0
- package/dist/utils/parallel.d.ts +60 -0
- package/dist/validators/credentials.d.ts +23 -0
- package/dist/validators/credentials.test.d.ts +0 -0
- package/dist/validators/quotas.d.ts +60 -0
- package/dist/validators/quotas.test.d.ts +0 -0
- package/package.json +4 -4
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Outbound Email Lambda Handler
|
|
3
|
+
*
|
|
4
|
+
* Processes outgoing emails:
|
|
5
|
+
* - Accepts JSON email payloads from S3
|
|
6
|
+
* - Generates proper MIME messages
|
|
7
|
+
* - Supports HTML and plain text
|
|
8
|
+
* - Handles attachments (base64 encoded)
|
|
9
|
+
* - Tracks via configuration set
|
|
10
|
+
* - Stores sent emails in S3
|
|
11
|
+
*/
|
|
12
|
+
export declare const handler: `
|
|
13
|
+
const { S3Client, GetObjectCommand, PutObjectCommand, DeleteObjectCommand } = require('@aws-sdk/client-s3');
|
|
14
|
+
const { SESClient, SendRawEmailCommand } = require('@aws-sdk/client-ses');
|
|
15
|
+
|
|
16
|
+
const s3 = new S3Client({});
|
|
17
|
+
const ses = new SESClient({});
|
|
18
|
+
|
|
19
|
+
exports.handler = async (event) => {
|
|
20
|
+
console.log('Outbound email event:', JSON.stringify(event, null, 2));
|
|
21
|
+
|
|
22
|
+
const bucket = process.env.EMAIL_BUCKET;
|
|
23
|
+
const configSet = process.env.CONFIG_SET || 'default';
|
|
24
|
+
|
|
25
|
+
for (const record of event.Records) {
|
|
26
|
+
try {
|
|
27
|
+
// Get the email payload from S3
|
|
28
|
+
const s3Event = record.s3 || {};
|
|
29
|
+
const key = decodeURIComponent(s3Event.object?.key?.replace(/\\+/g, ' ') || '');
|
|
30
|
+
|
|
31
|
+
if (!key || !key.startsWith('outbox/')) {
|
|
32
|
+
continue;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
const getResult = await s3.send(new GetObjectCommand({
|
|
36
|
+
Bucket: bucket,
|
|
37
|
+
Key: key,
|
|
38
|
+
}));
|
|
39
|
+
|
|
40
|
+
const emailData = JSON.parse(await getResult.Body.transformToString());
|
|
41
|
+
|
|
42
|
+
// Build MIME message
|
|
43
|
+
const boundary = \`----=_Part_\${Date.now()}_\${Math.random().toString(36).substr(2)}\`;
|
|
44
|
+
const mixedBoundary = \`----=_Mixed_\${Date.now()}_\${Math.random().toString(36).substr(2)}\`;
|
|
45
|
+
|
|
46
|
+
let rawMessage = '';
|
|
47
|
+
|
|
48
|
+
// Headers
|
|
49
|
+
rawMessage += \`From: \${emailData.from}\\r\\n\`;
|
|
50
|
+
rawMessage += \`To: \${Array.isArray(emailData.to) ? emailData.to.join(', ') : emailData.to}\\r\\n\`;
|
|
51
|
+
|
|
52
|
+
if (emailData.cc) {
|
|
53
|
+
rawMessage += \`Cc: \${Array.isArray(emailData.cc) ? emailData.cc.join(', ') : emailData.cc}\\r\\n\`;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
if (emailData.replyTo) {
|
|
57
|
+
rawMessage += \`Reply-To: \${emailData.replyTo}\\r\\n\`;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
rawMessage += \`Subject: =?UTF-8?B?\${Buffer.from(emailData.subject || '').toString('base64')}?=\\r\\n\`;
|
|
61
|
+
rawMessage += \`Date: \${new Date().toUTCString()}\\r\\n\`;
|
|
62
|
+
rawMessage += \`Message-ID: <\${Date.now()}.\${Math.random().toString(36)}@\${emailData.from.split('@')[1] || 'local'}>\\r\\n\`;
|
|
63
|
+
rawMessage += 'MIME-Version: 1.0\\r\\n';
|
|
64
|
+
|
|
65
|
+
const hasAttachments = emailData.attachments && emailData.attachments.length > 0;
|
|
66
|
+
|
|
67
|
+
if (hasAttachments) {
|
|
68
|
+
rawMessage += \`Content-Type: multipart/mixed; boundary="\${mixedBoundary}"\\r\\n\\r\\n\`;
|
|
69
|
+
rawMessage += \`--\${mixedBoundary}\\r\\n\`;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
// Body (multipart alternative for HTML + text)
|
|
73
|
+
if (emailData.html && emailData.text) {
|
|
74
|
+
rawMessage += \`Content-Type: multipart/alternative; boundary="\${boundary}"\\r\\n\\r\\n\`;
|
|
75
|
+
|
|
76
|
+
// Plain text part
|
|
77
|
+
rawMessage += \`--\${boundary}\\r\\n\`;
|
|
78
|
+
rawMessage += 'Content-Type: text/plain; charset=UTF-8\\r\\n';
|
|
79
|
+
rawMessage += 'Content-Transfer-Encoding: quoted-printable\\r\\n\\r\\n';
|
|
80
|
+
rawMessage += emailData.text + '\\r\\n\\r\\n';
|
|
81
|
+
|
|
82
|
+
// HTML part
|
|
83
|
+
rawMessage += \`--\${boundary}\\r\\n\`;
|
|
84
|
+
rawMessage += 'Content-Type: text/html; charset=UTF-8\\r\\n';
|
|
85
|
+
rawMessage += 'Content-Transfer-Encoding: quoted-printable\\r\\n\\r\\n';
|
|
86
|
+
rawMessage += emailData.html + '\\r\\n\\r\\n';
|
|
87
|
+
|
|
88
|
+
rawMessage += \`--\${boundary}--\\r\\n\`;
|
|
89
|
+
} else if (emailData.html) {
|
|
90
|
+
if (!hasAttachments) {
|
|
91
|
+
rawMessage += 'Content-Type: text/html; charset=UTF-8\\r\\n';
|
|
92
|
+
rawMessage += 'Content-Transfer-Encoding: quoted-printable\\r\\n\\r\\n';
|
|
93
|
+
} else {
|
|
94
|
+
rawMessage += 'Content-Type: text/html; charset=UTF-8\\r\\n\\r\\n';
|
|
95
|
+
}
|
|
96
|
+
rawMessage += emailData.html + '\\r\\n';
|
|
97
|
+
} else {
|
|
98
|
+
if (!hasAttachments) {
|
|
99
|
+
rawMessage += 'Content-Type: text/plain; charset=UTF-8\\r\\n';
|
|
100
|
+
rawMessage += 'Content-Transfer-Encoding: quoted-printable\\r\\n\\r\\n';
|
|
101
|
+
} else {
|
|
102
|
+
rawMessage += 'Content-Type: text/plain; charset=UTF-8\\r\\n\\r\\n';
|
|
103
|
+
}
|
|
104
|
+
rawMessage += (emailData.text || emailData.body || '') + '\\r\\n';
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
// Attachments
|
|
108
|
+
if (hasAttachments) {
|
|
109
|
+
for (const attachment of emailData.attachments) {
|
|
110
|
+
rawMessage += \`--\${mixedBoundary}\\r\\n\`;
|
|
111
|
+
rawMessage += \`Content-Type: \${attachment.contentType || 'application/octet-stream'}; name="\${attachment.filename}"\\r\\n\`;
|
|
112
|
+
rawMessage += 'Content-Transfer-Encoding: base64\\r\\n';
|
|
113
|
+
rawMessage += \`Content-Disposition: attachment; filename="\${attachment.filename}"\\r\\n\\r\\n\`;
|
|
114
|
+
rawMessage += attachment.content + '\\r\\n';
|
|
115
|
+
}
|
|
116
|
+
rawMessage += \`--\${mixedBoundary}--\\r\\n\`;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
// Send via SES
|
|
120
|
+
const sendResult = await ses.send(new SendRawEmailCommand({
|
|
121
|
+
RawMessage: { Data: Buffer.from(rawMessage) },
|
|
122
|
+
ConfigurationSetName: configSet,
|
|
123
|
+
}));
|
|
124
|
+
|
|
125
|
+
console.log(\`Email sent: \${sendResult.MessageId}\`);
|
|
126
|
+
|
|
127
|
+
// Store in sent folder
|
|
128
|
+
const timestamp = new Date();
|
|
129
|
+
const year = timestamp.getFullYear();
|
|
130
|
+
const month = String(timestamp.getMonth() + 1).padStart(2, '0');
|
|
131
|
+
const day = String(timestamp.getDate()).padStart(2, '0');
|
|
132
|
+
|
|
133
|
+
const fromEmail = emailData.from.match(/<([^>]+)>/) ? emailData.from.match(/<([^>]+)>/)[1] : emailData.from;
|
|
134
|
+
const [localPart, domain] = fromEmail.split('@');
|
|
135
|
+
|
|
136
|
+
const sentPath = \`mailboxes/\${domain}/\${localPart}/sent/\${year}/\${month}/\${day}/\${sendResult.MessageId}\`;
|
|
137
|
+
|
|
138
|
+
// Save sent email metadata
|
|
139
|
+
await s3.send(new PutObjectCommand({
|
|
140
|
+
Bucket: bucket,
|
|
141
|
+
Key: \`\${sentPath}/metadata.json\`,
|
|
142
|
+
Body: JSON.stringify({
|
|
143
|
+
messageId: sendResult.MessageId,
|
|
144
|
+
from: emailData.from,
|
|
145
|
+
to: emailData.to,
|
|
146
|
+
cc: emailData.cc,
|
|
147
|
+
subject: emailData.subject,
|
|
148
|
+
sentAt: timestamp.toISOString(),
|
|
149
|
+
hasAttachments,
|
|
150
|
+
}, null, 2),
|
|
151
|
+
ContentType: 'application/json',
|
|
152
|
+
}));
|
|
153
|
+
|
|
154
|
+
// Save raw message
|
|
155
|
+
await s3.send(new PutObjectCommand({
|
|
156
|
+
Bucket: bucket,
|
|
157
|
+
Key: \`\${sentPath}/raw.eml\`,
|
|
158
|
+
Body: rawMessage,
|
|
159
|
+
ContentType: 'message/rfc822',
|
|
160
|
+
}));
|
|
161
|
+
|
|
162
|
+
// Delete from outbox
|
|
163
|
+
await s3.send(new DeleteObjectCommand({
|
|
164
|
+
Bucket: bucket,
|
|
165
|
+
Key: key,
|
|
166
|
+
}));
|
|
167
|
+
|
|
168
|
+
} catch (error) {
|
|
169
|
+
console.error('Error sending email:', error);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
return { statusCode: 200, body: 'OK' };
|
|
174
|
+
};
|
|
175
|
+
`;
|
|
176
|
+
export default handler;
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Global sender reputation manager instance
|
|
3
|
+
*/
|
|
4
|
+
export declare const senderReputationManager: SenderReputationManager;
|
|
5
|
+
/**
|
|
6
|
+
* SES Sender Reputation Monitoring
|
|
7
|
+
* Reputation tracking, sending limits, and deliverability monitoring
|
|
8
|
+
*/
|
|
9
|
+
export declare interface ReputationDashboard {
|
|
10
|
+
id: string
|
|
11
|
+
timestamp: Date
|
|
12
|
+
overallScore: number
|
|
13
|
+
bounceRate: number
|
|
14
|
+
complaintRate: number
|
|
15
|
+
spamReports: number
|
|
16
|
+
blacklistStatus: BlacklistStatus[]
|
|
17
|
+
dkimStatus: 'VERIFIED' | 'PENDING' | 'FAILED'
|
|
18
|
+
spfStatus: 'PASS' | 'FAIL' | 'SOFTFAIL'
|
|
19
|
+
dmarcStatus: 'PASS' | 'FAIL' | 'NONE'
|
|
20
|
+
sendingLimits: SendingLimits
|
|
21
|
+
recommendations: string[]
|
|
22
|
+
}
|
|
23
|
+
export declare interface BlacklistStatus {
|
|
24
|
+
listName: string
|
|
25
|
+
listed: boolean
|
|
26
|
+
listedAt?: Date
|
|
27
|
+
delistUrl?: string
|
|
28
|
+
}
|
|
29
|
+
export declare interface SendingLimits {
|
|
30
|
+
maxSendRate: number
|
|
31
|
+
max24HourSend: number
|
|
32
|
+
sentLast24Hours: number
|
|
33
|
+
remainingQuota: number
|
|
34
|
+
quotaResetTime: Date
|
|
35
|
+
}
|
|
36
|
+
export declare interface WarmupPlan {
|
|
37
|
+
id: string
|
|
38
|
+
name: string
|
|
39
|
+
startDate: Date
|
|
40
|
+
currentDay: number
|
|
41
|
+
totalDays: number
|
|
42
|
+
dailyLimits: number[]
|
|
43
|
+
currentLimit: number
|
|
44
|
+
status: 'active' | 'paused' | 'completed'
|
|
45
|
+
}
|
|
46
|
+
export declare interface DomainReputation {
|
|
47
|
+
id: string
|
|
48
|
+
domain: string
|
|
49
|
+
reputationScore: number
|
|
50
|
+
totalSent: number
|
|
51
|
+
deliveryRate: number
|
|
52
|
+
openRate: number
|
|
53
|
+
clickRate: number
|
|
54
|
+
bounceRate: number
|
|
55
|
+
complaintRate: number
|
|
56
|
+
engagementScore: number
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Sender reputation manager
|
|
60
|
+
*/
|
|
61
|
+
export declare class SenderReputationManager {
|
|
62
|
+
private dashboards: Map<string, ReputationDashboard>;
|
|
63
|
+
private warmupPlans: Map<string, WarmupPlan>;
|
|
64
|
+
private domainReputations: Map<string, DomainReputation>;
|
|
65
|
+
private dashboardCounter: any;
|
|
66
|
+
private warmupCounter: any;
|
|
67
|
+
private domainCounter: any;
|
|
68
|
+
getReputationDashboard(): ReputationDashboard;
|
|
69
|
+
private checkBlacklists(): BlacklistStatus[];
|
|
70
|
+
createWarmupPlan(options: {
|
|
71
|
+
name: string
|
|
72
|
+
initialDailyLimit: number
|
|
73
|
+
targetDailyLimit: number
|
|
74
|
+
durationDays: number
|
|
75
|
+
}): WarmupPlan;
|
|
76
|
+
createAggressiveWarmupPlan(options: {
|
|
77
|
+
name: string
|
|
78
|
+
}): WarmupPlan;
|
|
79
|
+
createConservativeWarmupPlan(options: {
|
|
80
|
+
name: string
|
|
81
|
+
}): WarmupPlan;
|
|
82
|
+
advanceWarmupPlan(warmupId: string): WarmupPlan;
|
|
83
|
+
trackDomainReputation(options: {
|
|
84
|
+
domain: string
|
|
85
|
+
totalSent: number
|
|
86
|
+
delivered: number
|
|
87
|
+
opened: number
|
|
88
|
+
clicked: number
|
|
89
|
+
bounced: number
|
|
90
|
+
complained: number
|
|
91
|
+
}): DomainReputation;
|
|
92
|
+
getDomainReputation(domain: string): DomainReputation | undefined;
|
|
93
|
+
listDomainReputations(): DomainReputation[];
|
|
94
|
+
getWarmupPlan(id: string): WarmupPlan | undefined;
|
|
95
|
+
listWarmupPlans(): WarmupPlan[];
|
|
96
|
+
clear(): void;
|
|
97
|
+
}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Global email template manager instance
|
|
3
|
+
*/
|
|
4
|
+
export declare const emailTemplateManager: EmailTemplateManager;
|
|
5
|
+
/**
|
|
6
|
+
* SES Email Template Management
|
|
7
|
+
* Template versioning, personalization, and testing
|
|
8
|
+
*/
|
|
9
|
+
export declare interface EmailTemplate {
|
|
10
|
+
id: string
|
|
11
|
+
name: string
|
|
12
|
+
subject: string
|
|
13
|
+
htmlPart: string
|
|
14
|
+
textPart: string
|
|
15
|
+
variables: string[]
|
|
16
|
+
createdAt: Date
|
|
17
|
+
updatedAt: Date
|
|
18
|
+
version: number
|
|
19
|
+
}
|
|
20
|
+
export declare interface TemplateVersion {
|
|
21
|
+
id: string
|
|
22
|
+
templateId: string
|
|
23
|
+
version: number
|
|
24
|
+
subject: string
|
|
25
|
+
htmlPart: string
|
|
26
|
+
textPart: string
|
|
27
|
+
createdAt: Date
|
|
28
|
+
createdBy: string
|
|
29
|
+
changelog?: string
|
|
30
|
+
}
|
|
31
|
+
export declare interface TemplateTest {
|
|
32
|
+
id: string
|
|
33
|
+
templateId: string
|
|
34
|
+
testData: Record<string, any>
|
|
35
|
+
renderedSubject: string
|
|
36
|
+
renderedHtml: string
|
|
37
|
+
renderedText: string
|
|
38
|
+
timestamp: Date
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Email template manager
|
|
42
|
+
*/
|
|
43
|
+
export declare class EmailTemplateManager {
|
|
44
|
+
private templates: Map<string, EmailTemplate>;
|
|
45
|
+
private versions: Map<string, TemplateVersion[]>;
|
|
46
|
+
private tests: Map<string, TemplateTest>;
|
|
47
|
+
private templateCounter: any;
|
|
48
|
+
private testCounter: any;
|
|
49
|
+
createTemplate(template: {
|
|
50
|
+
name: string
|
|
51
|
+
subject: string
|
|
52
|
+
htmlPart: string
|
|
53
|
+
textPart: string
|
|
54
|
+
}): EmailTemplate;
|
|
55
|
+
createWelcomeTemplate(options: {
|
|
56
|
+
name: string
|
|
57
|
+
companyName: string
|
|
58
|
+
}): EmailTemplate;
|
|
59
|
+
createPasswordResetTemplate(options: {
|
|
60
|
+
name: string
|
|
61
|
+
companyName: string
|
|
62
|
+
}): EmailTemplate;
|
|
63
|
+
updateTemplate(templateId: string, updates: {
|
|
64
|
+
subject?: string
|
|
65
|
+
htmlPart?: string
|
|
66
|
+
textPart?: string
|
|
67
|
+
}, changelog?: string): EmailTemplate;
|
|
68
|
+
private addVersion(version: Omit<TemplateVersion, 'id' | 'createdAt'>): TemplateVersion;
|
|
69
|
+
private extractVariables(text: string): string[];
|
|
70
|
+
renderTemplate(templateId: string, data: Record<string, any>): {
|
|
71
|
+
subject: string
|
|
72
|
+
html: string
|
|
73
|
+
text: string
|
|
74
|
+
};
|
|
75
|
+
testTemplate(templateId: string, testData: Record<string, any>): TemplateTest;
|
|
76
|
+
getTemplate(id: string): EmailTemplate | undefined;
|
|
77
|
+
listTemplates(): EmailTemplate[];
|
|
78
|
+
getTemplateVersions(templateId: string): TemplateVersion[];
|
|
79
|
+
revertToVersion(templateId: string, versionNumber: number): EmailTemplate;
|
|
80
|
+
generateTemplateCF(template: EmailTemplate): any;
|
|
81
|
+
clear(): void;
|
|
82
|
+
}
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Get error details by code
|
|
3
|
+
*/
|
|
4
|
+
export declare function getErrorDetails(code: keyof typeof ErrorCodes): { message: string; solution: string };
|
|
5
|
+
/**
|
|
6
|
+
* Create error from code
|
|
7
|
+
*/
|
|
8
|
+
export declare function createError(code: keyof typeof ErrorCodes, additionalDetails?: Record<string, any>): CloudError;
|
|
9
|
+
/**
|
|
10
|
+
* Validate configuration
|
|
11
|
+
*/
|
|
12
|
+
export declare function validateConfiguration(config: any): void;
|
|
13
|
+
/**
|
|
14
|
+
* Detect common misconfigurations
|
|
15
|
+
*/
|
|
16
|
+
export declare function detectMisconfigurations(config: any): string[];
|
|
17
|
+
/**
|
|
18
|
+
* Common error scenarios with solutions
|
|
19
|
+
*/
|
|
20
|
+
export declare const ErrorCodes: {
|
|
21
|
+
// Credential errors
|
|
22
|
+
NO_CREDENTIALS: {
|
|
23
|
+
message: 'AWS credentials not found';
|
|
24
|
+
solution: `Configure AWS credentials using one of these methods:
|
|
25
|
+
1. Set environment variables: AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY
|
|
26
|
+
2. Create ~/.aws/credentials file with your credentials
|
|
27
|
+
3. Use an IAM role (for EC2 instances)
|
|
28
|
+
4. Run 'aws configure' if you have AWS CLI installed`
|
|
29
|
+
};
|
|
30
|
+
INVALID_CREDENTIALS: {
|
|
31
|
+
message: 'AWS credentials are invalid';
|
|
32
|
+
solution: 'Verify your AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY are correct. Run: aws sts get-caller-identity'
|
|
33
|
+
};
|
|
34
|
+
EXPIRED_CREDENTIALS: {
|
|
35
|
+
message: 'AWS credentials have expired';
|
|
36
|
+
solution: 'Refresh your AWS credentials. If using temporary credentials, generate new ones.'
|
|
37
|
+
};
|
|
38
|
+
// Configuration errors
|
|
39
|
+
MISSING_CONFIG: {
|
|
40
|
+
message: 'Configuration file not found';
|
|
41
|
+
solution: 'Create a cloud.config.ts file in your project root. Use: cloud init'
|
|
42
|
+
};
|
|
43
|
+
INVALID_CONFIG: {
|
|
44
|
+
message: 'Configuration is invalid';
|
|
45
|
+
solution: 'Check your cloud.config.ts file for syntax errors. Use: cloud config:validate'
|
|
46
|
+
};
|
|
47
|
+
MISSING_REQUIRED_FIELD: {
|
|
48
|
+
message: 'Required configuration field is missing';
|
|
49
|
+
solution: 'Add the missing field to your cloud.config.ts file'
|
|
50
|
+
};
|
|
51
|
+
INVALID_REGION: {
|
|
52
|
+
message: 'AWS region is invalid';
|
|
53
|
+
solution: 'Use a valid AWS region like us-east-1, us-west-2, eu-west-1, etc.'
|
|
54
|
+
};
|
|
55
|
+
// Deployment errors
|
|
56
|
+
STACK_ALREADY_EXISTS: {
|
|
57
|
+
message: 'CloudFormation stack already exists';
|
|
58
|
+
solution: 'Use: cloud deploy --update to update the existing stack, or cloud destroy to delete it first'
|
|
59
|
+
};
|
|
60
|
+
STACK_IN_PROGRESS: {
|
|
61
|
+
message: 'Stack operation already in progress';
|
|
62
|
+
solution: 'Wait for the current operation to complete, or cancel it in the AWS Console'
|
|
63
|
+
};
|
|
64
|
+
INSUFFICIENT_PERMISSIONS: {
|
|
65
|
+
message: 'Insufficient IAM permissions';
|
|
66
|
+
solution: 'Ensure your IAM user/role has the necessary permissions for CloudFormation and the resources you\'re deploying'
|
|
67
|
+
};
|
|
68
|
+
RESOURCE_LIMIT_EXCEEDED: {
|
|
69
|
+
message: 'AWS service limit exceeded';
|
|
70
|
+
solution: 'Request a service limit increase in the AWS Console, or clean up unused resources'
|
|
71
|
+
};
|
|
72
|
+
ROLLBACK_COMPLETE: {
|
|
73
|
+
message: 'Stack creation failed and rolled back';
|
|
74
|
+
solution: 'Check the CloudFormation events to see which resource failed. Fix the issue and try again.'
|
|
75
|
+
};
|
|
76
|
+
// Validation errors
|
|
77
|
+
CIRCULAR_DEPENDENCY: {
|
|
78
|
+
message: 'Circular dependency detected in resources';
|
|
79
|
+
solution: 'Review your resource dependencies and remove the circular reference'
|
|
80
|
+
};
|
|
81
|
+
INVALID_RESOURCE_NAME: {
|
|
82
|
+
message: 'Resource name contains invalid characters';
|
|
83
|
+
solution: 'Use only alphanumeric characters and hyphens in resource names'
|
|
84
|
+
};
|
|
85
|
+
DUPLICATE_RESOURCE: {
|
|
86
|
+
message: 'Duplicate resource name detected';
|
|
87
|
+
solution: 'Ensure all resource names are unique in your configuration'
|
|
88
|
+
};
|
|
89
|
+
// Network errors
|
|
90
|
+
VPC_CIDR_CONFLICT: {
|
|
91
|
+
message: 'VPC CIDR block conflicts with existing VPC';
|
|
92
|
+
solution: 'Use a different CIDR block that doesn\'t overlap with existing VPCs'
|
|
93
|
+
};
|
|
94
|
+
SUBNET_CIDR_INVALID: {
|
|
95
|
+
message: 'Subnet CIDR block is invalid or outside VPC range';
|
|
96
|
+
solution: 'Ensure subnet CIDR is within the VPC CIDR range and properly sized'
|
|
97
|
+
};
|
|
98
|
+
// Database errors
|
|
99
|
+
DB_INSTANCE_LIMIT: {
|
|
100
|
+
message: 'RDS instance limit reached';
|
|
101
|
+
solution: 'Delete unused RDS instances or request a limit increase'
|
|
102
|
+
};
|
|
103
|
+
INVALID_DB_NAME: {
|
|
104
|
+
message: 'Database name contains invalid characters';
|
|
105
|
+
solution: 'Use only alphanumeric characters and underscores, starting with a letter'
|
|
106
|
+
};
|
|
107
|
+
// S3 errors
|
|
108
|
+
BUCKET_ALREADY_EXISTS: {
|
|
109
|
+
message: 'S3 bucket name already exists globally';
|
|
110
|
+
solution: 'S3 bucket names must be globally unique. Try a different name with your organization prefix'
|
|
111
|
+
};
|
|
112
|
+
INVALID_BUCKET_NAME: {
|
|
113
|
+
message: 'S3 bucket name is invalid';
|
|
114
|
+
solution: 'Use lowercase letters, numbers, and hyphens. Must start/end with letter/number. 3-63 characters.'
|
|
115
|
+
};
|
|
116
|
+
// CloudFormation errors
|
|
117
|
+
TEMPLATE_TOO_LARGE: {
|
|
118
|
+
message: 'CloudFormation template exceeds size limit';
|
|
119
|
+
solution: 'Split your infrastructure into multiple stacks or use nested stacks'
|
|
120
|
+
};
|
|
121
|
+
INVALID_TEMPLATE: {
|
|
122
|
+
message: 'CloudFormation template is invalid';
|
|
123
|
+
solution: 'Validate your template with: cloud config:validate'
|
|
124
|
+
};
|
|
125
|
+
PARAMETER_NOT_FOUND: {
|
|
126
|
+
message: 'CloudFormation parameter not found';
|
|
127
|
+
solution: 'Check that all referenced parameters are defined in your template'
|
|
128
|
+
}
|
|
129
|
+
};
|
|
130
|
+
/**
|
|
131
|
+
* Error Handling & Debugging
|
|
132
|
+
* Clear error messages with solutions and debugging support
|
|
133
|
+
*/
|
|
134
|
+
export declare class CloudError extends Error {
|
|
135
|
+
public code: string;
|
|
136
|
+
public solution?: string | undefined;
|
|
137
|
+
public details?: Record<string, any> | undefined;
|
|
138
|
+
constructor(message: string, code: string, solution?: string | undefined, details?: Record<string, any> | undefined);
|
|
139
|
+
toString(): string;
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Configuration errors
|
|
143
|
+
*/
|
|
144
|
+
export declare class ConfigurationError extends CloudError {
|
|
145
|
+
constructor(message: string, solution?: string, details?: Record<string, any>);
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* AWS credential errors
|
|
149
|
+
*/
|
|
150
|
+
export declare class CredentialError extends CloudError {
|
|
151
|
+
constructor(message: string, solution?: string, details?: Record<string, any>);
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Deployment errors
|
|
155
|
+
*/
|
|
156
|
+
export declare class DeploymentError extends CloudError {
|
|
157
|
+
constructor(message: string, solution?: string, details?: Record<string, any>);
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Validation errors
|
|
161
|
+
*/
|
|
162
|
+
export declare class ValidationError extends CloudError {
|
|
163
|
+
constructor(message: string, solution?: string, details?: Record<string, any>);
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* AWS API errors
|
|
167
|
+
*/
|
|
168
|
+
export declare class AWSAPIError extends CloudError {
|
|
169
|
+
public statusCode?: number;
|
|
170
|
+
constructor(message: string, statusCode?: number, solution?: string, details?: Record<string, any>);
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Debug logger
|
|
174
|
+
*/
|
|
175
|
+
export declare class DebugLogger {
|
|
176
|
+
static private verboseMode: any;
|
|
177
|
+
static private debugMode: any;
|
|
178
|
+
static setVerbose(enabled: boolean): void;
|
|
179
|
+
static setDebug(enabled: boolean): void;
|
|
180
|
+
static verbose(message: string, args: any[]): void;
|
|
181
|
+
static debug(message: string, args: any[]): void;
|
|
182
|
+
static info(message: string, args: any[]): void;
|
|
183
|
+
static warn(message: string, args: any[]): void;
|
|
184
|
+
static error(message: string, error?: Error): void;
|
|
185
|
+
static success(message: string): void;
|
|
186
|
+
}
|
|
File without changes
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
export declare const healthCheckManager: HealthCheckManager;
|
|
2
|
+
/**
|
|
3
|
+
* Health Checks & Monitoring - Endpoint monitoring, synthetic monitoring, uptime tracking
|
|
4
|
+
*/
|
|
5
|
+
export declare interface HealthCheck {
|
|
6
|
+
id: string
|
|
7
|
+
url: string
|
|
8
|
+
interval: number
|
|
9
|
+
timeout: number
|
|
10
|
+
status: 'healthy' | 'unhealthy'
|
|
11
|
+
}
|
|
12
|
+
export declare interface SyntheticMonitor {
|
|
13
|
+
id: string
|
|
14
|
+
name: string
|
|
15
|
+
script: string
|
|
16
|
+
frequency: number
|
|
17
|
+
locations: string[]
|
|
18
|
+
}
|
|
19
|
+
export declare interface UptimeTracker {
|
|
20
|
+
id: string
|
|
21
|
+
resource: string
|
|
22
|
+
uptime: number
|
|
23
|
+
downtime: number
|
|
24
|
+
availability: number
|
|
25
|
+
}
|
|
26
|
+
export declare class HealthCheckManager {
|
|
27
|
+
private checks: any;
|
|
28
|
+
private synthetics: any;
|
|
29
|
+
private uptimeTrackers: any;
|
|
30
|
+
private counter: any;
|
|
31
|
+
createHealthCheck(url: string, interval?: any, timeout?: any): HealthCheck;
|
|
32
|
+
createSyntheticMonitor(name: string, script: string, frequency: number, locations: string[]): SyntheticMonitor;
|
|
33
|
+
trackUptime(resource: string, uptime: number, downtime: number): UptimeTracker;
|
|
34
|
+
clear(): void;
|
|
35
|
+
}
|