@stacksjs/ts-cloud-core 0.1.1

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 (251) hide show
  1. package/LICENSE.md +21 -0
  2. package/README.md +321 -0
  3. package/package.json +31 -0
  4. package/src/advanced-features.test.ts +465 -0
  5. package/src/aws/cloudformation.ts +421 -0
  6. package/src/aws/cloudfront.ts +158 -0
  7. package/src/aws/credentials.test.ts +132 -0
  8. package/src/aws/credentials.ts +545 -0
  9. package/src/aws/index.ts +87 -0
  10. package/src/aws/s3.test.ts +188 -0
  11. package/src/aws/s3.ts +1088 -0
  12. package/src/aws/signature.test.ts +670 -0
  13. package/src/aws/signature.ts +1155 -0
  14. package/src/backup/disaster-recovery.test.ts +726 -0
  15. package/src/backup/disaster-recovery.ts +500 -0
  16. package/src/backup/index.ts +34 -0
  17. package/src/backup/manager.test.ts +498 -0
  18. package/src/backup/manager.ts +432 -0
  19. package/src/cicd/circleci.ts +430 -0
  20. package/src/cicd/github-actions.ts +424 -0
  21. package/src/cicd/gitlab-ci.ts +255 -0
  22. package/src/cicd/index.ts +8 -0
  23. package/src/cli/history.ts +396 -0
  24. package/src/cli/index.ts +10 -0
  25. package/src/cli/progress.ts +458 -0
  26. package/src/cli/repl.ts +454 -0
  27. package/src/cli/suggestions.ts +327 -0
  28. package/src/cli/table.test.ts +319 -0
  29. package/src/cli/table.ts +332 -0
  30. package/src/cloudformation/builder.test.ts +327 -0
  31. package/src/cloudformation/builder.ts +378 -0
  32. package/src/cloudformation/builders/api-gateway.ts +449 -0
  33. package/src/cloudformation/builders/cache.ts +334 -0
  34. package/src/cloudformation/builders/cdn.ts +278 -0
  35. package/src/cloudformation/builders/compute.ts +485 -0
  36. package/src/cloudformation/builders/database.ts +392 -0
  37. package/src/cloudformation/builders/functions.ts +343 -0
  38. package/src/cloudformation/builders/messaging.ts +140 -0
  39. package/src/cloudformation/builders/monitoring.ts +300 -0
  40. package/src/cloudformation/builders/network.ts +264 -0
  41. package/src/cloudformation/builders/queue.ts +147 -0
  42. package/src/cloudformation/builders/security.ts +399 -0
  43. package/src/cloudformation/builders/storage.ts +285 -0
  44. package/src/cloudformation/index.ts +30 -0
  45. package/src/cloudformation/types.ts +173 -0
  46. package/src/compliance/aws-config.ts +543 -0
  47. package/src/compliance/cloudtrail.ts +376 -0
  48. package/src/compliance/compliance.test.ts +423 -0
  49. package/src/compliance/guardduty.ts +446 -0
  50. package/src/compliance/index.ts +66 -0
  51. package/src/compliance/security-hub.ts +456 -0
  52. package/src/containers/build-optimization.ts +416 -0
  53. package/src/containers/containers.test.ts +508 -0
  54. package/src/containers/image-scanning.ts +360 -0
  55. package/src/containers/index.ts +9 -0
  56. package/src/containers/registry.ts +293 -0
  57. package/src/containers/service-mesh.ts +520 -0
  58. package/src/database/database.test.ts +762 -0
  59. package/src/database/index.ts +9 -0
  60. package/src/database/migrations.ts +444 -0
  61. package/src/database/performance.ts +528 -0
  62. package/src/database/replicas.ts +534 -0
  63. package/src/database/users.ts +494 -0
  64. package/src/dependency-graph.ts +143 -0
  65. package/src/deployment/ab-testing.ts +582 -0
  66. package/src/deployment/blue-green.ts +452 -0
  67. package/src/deployment/canary.ts +500 -0
  68. package/src/deployment/deployment.test.ts +526 -0
  69. package/src/deployment/index.ts +61 -0
  70. package/src/deployment/progressive.ts +62 -0
  71. package/src/dns/dns.test.ts +641 -0
  72. package/src/dns/dnssec.ts +315 -0
  73. package/src/dns/index.ts +8 -0
  74. package/src/dns/resolver.ts +496 -0
  75. package/src/dns/routing.ts +593 -0
  76. package/src/email/advanced/analytics.ts +445 -0
  77. package/src/email/advanced/index.ts +11 -0
  78. package/src/email/advanced/rules.ts +465 -0
  79. package/src/email/advanced/scheduling.ts +352 -0
  80. package/src/email/advanced/search.ts +412 -0
  81. package/src/email/advanced/shared-mailboxes.ts +404 -0
  82. package/src/email/advanced/templates.ts +455 -0
  83. package/src/email/advanced/threading.ts +281 -0
  84. package/src/email/analytics.ts +467 -0
  85. package/src/email/bounce-handling.ts +425 -0
  86. package/src/email/email.test.ts +431 -0
  87. package/src/email/handlers/__tests__/inbound.test.ts +38 -0
  88. package/src/email/handlers/__tests__/outbound.test.ts +37 -0
  89. package/src/email/handlers/converter.ts +227 -0
  90. package/src/email/handlers/feedback.ts +228 -0
  91. package/src/email/handlers/inbound.ts +169 -0
  92. package/src/email/handlers/outbound.ts +178 -0
  93. package/src/email/index.ts +15 -0
  94. package/src/email/reputation.ts +303 -0
  95. package/src/email/templates.ts +352 -0
  96. package/src/errors/index.test.ts +434 -0
  97. package/src/errors/index.ts +416 -0
  98. package/src/health-checks/index.ts +40 -0
  99. package/src/index.ts +360 -0
  100. package/src/intrinsic-functions.ts +118 -0
  101. package/src/lambda/concurrency.ts +330 -0
  102. package/src/lambda/destinations.ts +345 -0
  103. package/src/lambda/dlq.ts +425 -0
  104. package/src/lambda/index.ts +11 -0
  105. package/src/lambda/lambda.test.ts +840 -0
  106. package/src/lambda/layers.ts +263 -0
  107. package/src/lambda/versions.ts +376 -0
  108. package/src/lambda/vpc.ts +399 -0
  109. package/src/local/config.ts +114 -0
  110. package/src/local/index.ts +6 -0
  111. package/src/local/mock-aws.ts +351 -0
  112. package/src/modules/ai.ts +340 -0
  113. package/src/modules/api.ts +478 -0
  114. package/src/modules/auth.ts +805 -0
  115. package/src/modules/cache.ts +417 -0
  116. package/src/modules/cdn.ts +1062 -0
  117. package/src/modules/communication.ts +1094 -0
  118. package/src/modules/compute.ts +3348 -0
  119. package/src/modules/database.ts +554 -0
  120. package/src/modules/deployment.ts +1079 -0
  121. package/src/modules/dns.ts +337 -0
  122. package/src/modules/email.ts +1538 -0
  123. package/src/modules/filesystem.ts +515 -0
  124. package/src/modules/index.ts +32 -0
  125. package/src/modules/messaging.ts +486 -0
  126. package/src/modules/monitoring.ts +2086 -0
  127. package/src/modules/network.ts +664 -0
  128. package/src/modules/parameter-store.ts +325 -0
  129. package/src/modules/permissions.ts +1081 -0
  130. package/src/modules/phone.ts +494 -0
  131. package/src/modules/queue.ts +1260 -0
  132. package/src/modules/redirects.ts +464 -0
  133. package/src/modules/registry.ts +699 -0
  134. package/src/modules/search.ts +401 -0
  135. package/src/modules/secrets.ts +416 -0
  136. package/src/modules/security.ts +731 -0
  137. package/src/modules/sms.ts +389 -0
  138. package/src/modules/storage.ts +1120 -0
  139. package/src/modules/workflow.ts +680 -0
  140. package/src/multi-account/config.ts +521 -0
  141. package/src/multi-account/index.ts +7 -0
  142. package/src/multi-account/manager.ts +427 -0
  143. package/src/multi-region/cross-region.ts +410 -0
  144. package/src/multi-region/index.ts +8 -0
  145. package/src/multi-region/manager.ts +483 -0
  146. package/src/multi-region/regions.ts +435 -0
  147. package/src/network-security/index.ts +48 -0
  148. package/src/observability/index.ts +9 -0
  149. package/src/observability/logs.ts +522 -0
  150. package/src/observability/metrics.ts +460 -0
  151. package/src/observability/observability.test.ts +782 -0
  152. package/src/observability/synthetics.ts +568 -0
  153. package/src/observability/xray.ts +358 -0
  154. package/src/phone/advanced/analytics.ts +349 -0
  155. package/src/phone/advanced/callbacks.ts +428 -0
  156. package/src/phone/advanced/index.ts +8 -0
  157. package/src/phone/advanced/ivr-builder.ts +504 -0
  158. package/src/phone/advanced/recording.ts +310 -0
  159. package/src/phone/handlers/__tests__/incoming-call.test.ts +40 -0
  160. package/src/phone/handlers/incoming-call.ts +117 -0
  161. package/src/phone/handlers/missed-call.ts +116 -0
  162. package/src/phone/handlers/voicemail.ts +179 -0
  163. package/src/phone/index.ts +9 -0
  164. package/src/presets/api-backend.ts +134 -0
  165. package/src/presets/data-pipeline.ts +204 -0
  166. package/src/presets/extend.test.ts +295 -0
  167. package/src/presets/extend.ts +297 -0
  168. package/src/presets/fullstack-app.ts +144 -0
  169. package/src/presets/index.ts +27 -0
  170. package/src/presets/jamstack.ts +135 -0
  171. package/src/presets/microservices.ts +167 -0
  172. package/src/presets/ml-api.ts +208 -0
  173. package/src/presets/nodejs-server.ts +104 -0
  174. package/src/presets/nodejs-serverless.ts +114 -0
  175. package/src/presets/realtime-app.ts +184 -0
  176. package/src/presets/static-site.ts +64 -0
  177. package/src/presets/traditional-web-app.ts +339 -0
  178. package/src/presets/wordpress.ts +138 -0
  179. package/src/preview/github.test.ts +249 -0
  180. package/src/preview/github.ts +297 -0
  181. package/src/preview/index.ts +37 -0
  182. package/src/preview/manager.test.ts +440 -0
  183. package/src/preview/manager.ts +326 -0
  184. package/src/preview/notifications.test.ts +582 -0
  185. package/src/preview/notifications.ts +341 -0
  186. package/src/queue/batch-processing.ts +402 -0
  187. package/src/queue/dlq-monitoring.ts +402 -0
  188. package/src/queue/fifo.ts +342 -0
  189. package/src/queue/index.ts +9 -0
  190. package/src/queue/management.ts +428 -0
  191. package/src/queue/queue.test.ts +429 -0
  192. package/src/resource-mgmt/index.ts +39 -0
  193. package/src/resource-naming.ts +62 -0
  194. package/src/s3/index.ts +523 -0
  195. package/src/schema/cloud-config.schema.json +554 -0
  196. package/src/schema/index.ts +68 -0
  197. package/src/security/certificate-manager.ts +492 -0
  198. package/src/security/index.ts +9 -0
  199. package/src/security/scanning.ts +545 -0
  200. package/src/security/secrets-manager.ts +476 -0
  201. package/src/security/secrets-rotation.ts +456 -0
  202. package/src/security/security.test.ts +738 -0
  203. package/src/sms/advanced/ab-testing.ts +389 -0
  204. package/src/sms/advanced/analytics.ts +336 -0
  205. package/src/sms/advanced/campaigns.ts +523 -0
  206. package/src/sms/advanced/chatbot.ts +224 -0
  207. package/src/sms/advanced/index.ts +10 -0
  208. package/src/sms/advanced/link-tracking.ts +248 -0
  209. package/src/sms/advanced/mms.ts +308 -0
  210. package/src/sms/handlers/__tests__/send.test.ts +40 -0
  211. package/src/sms/handlers/delivery-status.ts +133 -0
  212. package/src/sms/handlers/receive.ts +162 -0
  213. package/src/sms/handlers/send.ts +174 -0
  214. package/src/sms/index.ts +9 -0
  215. package/src/stack-diff.ts +389 -0
  216. package/src/static-site/index.ts +85 -0
  217. package/src/template-builder.ts +110 -0
  218. package/src/template-validator.ts +574 -0
  219. package/src/utils/cache.ts +291 -0
  220. package/src/utils/diff.ts +269 -0
  221. package/src/utils/hash.ts +227 -0
  222. package/src/utils/index.ts +8 -0
  223. package/src/utils/parallel.ts +294 -0
  224. package/src/validators/credentials.test.ts +274 -0
  225. package/src/validators/credentials.ts +233 -0
  226. package/src/validators/quotas.test.ts +434 -0
  227. package/src/validators/quotas.ts +217 -0
  228. package/test/ai.test.ts +327 -0
  229. package/test/api.test.ts +511 -0
  230. package/test/auth.test.ts +632 -0
  231. package/test/cache.test.ts +406 -0
  232. package/test/cdn.test.ts +247 -0
  233. package/test/compute.test.ts +861 -0
  234. package/test/database.test.ts +523 -0
  235. package/test/deployment.test.ts +499 -0
  236. package/test/dns.test.ts +270 -0
  237. package/test/email.test.ts +439 -0
  238. package/test/filesystem.test.ts +382 -0
  239. package/test/integration.test.ts +350 -0
  240. package/test/messaging.test.ts +514 -0
  241. package/test/monitoring.test.ts +634 -0
  242. package/test/network.test.ts +425 -0
  243. package/test/permissions.test.ts +488 -0
  244. package/test/queue.test.ts +484 -0
  245. package/test/registry.test.ts +306 -0
  246. package/test/security.test.ts +462 -0
  247. package/test/storage.test.ts +463 -0
  248. package/test/template-validator.test.ts +559 -0
  249. package/test/workflow.test.ts +592 -0
  250. package/tsconfig.json +16 -0
  251. package/tsconfig.tsbuildinfo +1 -0
@@ -0,0 +1,425 @@
1
+ /**
2
+ * Lambda Dead Letter Queue (DLQ)
3
+ * Error handling and failed event management
4
+ */
5
+
6
+ export interface DLQConfig {
7
+ id: string
8
+ functionName: string
9
+ targetArn: string
10
+ targetType: 'sqs' | 'sns'
11
+ maxReceiveCount?: number
12
+ retentionPeriod?: number // seconds
13
+ }
14
+
15
+ export interface DLQMessage {
16
+ id: string
17
+ functionName: string
18
+ requestId: string
19
+ timestamp: Date
20
+ errorMessage: string
21
+ errorType: string
22
+ stackTrace?: string
23
+ payload: any
24
+ attemptCount: number
25
+ }
26
+
27
+ export interface DLQAlarm {
28
+ id: string
29
+ dlqConfigId: string
30
+ alarmName: string
31
+ threshold: number
32
+ evaluationPeriods: number
33
+ notificationTopicArn?: string
34
+ enabled: boolean
35
+ }
36
+
37
+ export interface DLQReprocessing {
38
+ id: string
39
+ dlqConfigId: string
40
+ messageId: string
41
+ status: 'pending' | 'processing' | 'success' | 'failed'
42
+ startedAt?: Date
43
+ completedAt?: Date
44
+ error?: string
45
+ }
46
+
47
+ /**
48
+ * Lambda DLQ manager
49
+ */
50
+ export class LambdaDLQManager {
51
+ private dlqConfigs: Map<string, DLQConfig> = new Map()
52
+ private messages: Map<string, DLQMessage> = new Map()
53
+ private alarms: Map<string, DLQAlarm> = new Map()
54
+ private reprocessing: Map<string, DLQReprocessing> = new Map()
55
+ private configCounter = 0
56
+ private messageCounter = 0
57
+ private alarmCounter = 0
58
+ private reprocessCounter = 0
59
+
60
+ /**
61
+ * Configure DLQ
62
+ */
63
+ configureDLQ(config: Omit<DLQConfig, 'id'>): DLQConfig {
64
+ const id = `dlq-${Date.now()}-${this.configCounter++}`
65
+
66
+ const dlqConfig: DLQConfig = {
67
+ id,
68
+ ...config,
69
+ }
70
+
71
+ this.dlqConfigs.set(id, dlqConfig)
72
+
73
+ return dlqConfig
74
+ }
75
+
76
+ /**
77
+ * Configure SQS DLQ
78
+ */
79
+ configureSQSDLQ(options: {
80
+ functionName: string
81
+ queueArn: string
82
+ maxReceiveCount?: number
83
+ retentionPeriod?: number
84
+ }): DLQConfig {
85
+ return this.configureDLQ({
86
+ functionName: options.functionName,
87
+ targetArn: options.queueArn,
88
+ targetType: 'sqs',
89
+ maxReceiveCount: options.maxReceiveCount || 3,
90
+ retentionPeriod: options.retentionPeriod || 1209600, // 14 days
91
+ })
92
+ }
93
+
94
+ /**
95
+ * Configure SNS DLQ
96
+ */
97
+ configureSNSDLQ(options: {
98
+ functionName: string
99
+ topicArn: string
100
+ }): DLQConfig {
101
+ return this.configureDLQ({
102
+ functionName: options.functionName,
103
+ targetArn: options.topicArn,
104
+ targetType: 'sns',
105
+ })
106
+ }
107
+
108
+ /**
109
+ * Configure DLQ with alarm
110
+ */
111
+ configureDLQWithAlarm(options: {
112
+ functionName: string
113
+ queueArn: string
114
+ alarmThreshold: number
115
+ notificationTopicArn: string
116
+ }): DLQConfig {
117
+ const dlq = this.configureSQSDLQ({
118
+ functionName: options.functionName,
119
+ queueArn: options.queueArn,
120
+ })
121
+
122
+ this.createDLQAlarm({
123
+ dlqConfigId: dlq.id,
124
+ alarmName: `${options.functionName}-dlq-alarm`,
125
+ threshold: options.alarmThreshold,
126
+ evaluationPeriods: 1,
127
+ notificationTopicArn: options.notificationTopicArn,
128
+ enabled: true,
129
+ })
130
+
131
+ return dlq
132
+ }
133
+
134
+ /**
135
+ * Send message to DLQ
136
+ */
137
+ sendToDLQ(options: {
138
+ functionName: string
139
+ requestId: string
140
+ errorMessage: string
141
+ errorType: string
142
+ stackTrace?: string
143
+ payload: any
144
+ attemptCount: number
145
+ }): DLQMessage {
146
+ const id = `message-${Date.now()}-${this.messageCounter++}`
147
+
148
+ const message: DLQMessage = {
149
+ id,
150
+ timestamp: new Date(),
151
+ ...options,
152
+ }
153
+
154
+ this.messages.set(id, message)
155
+
156
+ return message
157
+ }
158
+
159
+ /**
160
+ * Create DLQ alarm
161
+ */
162
+ createDLQAlarm(alarm: Omit<DLQAlarm, 'id'>): DLQAlarm {
163
+ const id = `alarm-${Date.now()}-${this.alarmCounter++}`
164
+
165
+ const dlqAlarm: DLQAlarm = {
166
+ id,
167
+ ...alarm,
168
+ }
169
+
170
+ this.alarms.set(id, dlqAlarm)
171
+
172
+ return dlqAlarm
173
+ }
174
+
175
+ /**
176
+ * Create age alarm
177
+ */
178
+ createAgeAlarm(options: {
179
+ dlqConfigId: string
180
+ maxAgeSeconds: number
181
+ notificationTopicArn: string
182
+ }): DLQAlarm {
183
+ const config = this.dlqConfigs.get(options.dlqConfigId)
184
+
185
+ if (!config) {
186
+ throw new Error(`DLQ config not found: ${options.dlqConfigId}`)
187
+ }
188
+
189
+ return this.createDLQAlarm({
190
+ dlqConfigId: options.dlqConfigId,
191
+ alarmName: `${config.functionName}-dlq-age-alarm`,
192
+ threshold: options.maxAgeSeconds,
193
+ evaluationPeriods: 1,
194
+ notificationTopicArn: options.notificationTopicArn,
195
+ enabled: true,
196
+ })
197
+ }
198
+
199
+ /**
200
+ * Reprocess DLQ message
201
+ */
202
+ async reprocessMessage(messageId: string): Promise<DLQReprocessing> {
203
+ const message = this.messages.get(messageId)
204
+
205
+ if (!message) {
206
+ throw new Error(`Message not found: ${messageId}`)
207
+ }
208
+
209
+ const config = Array.from(this.dlqConfigs.values()).find(
210
+ c => c.functionName === message.functionName
211
+ )
212
+
213
+ if (!config) {
214
+ throw new Error(`DLQ config not found for function: ${message.functionName}`)
215
+ }
216
+
217
+ const id = `reprocess-${Date.now()}-${this.reprocessCounter++}`
218
+
219
+ const reprocessing: DLQReprocessing = {
220
+ id,
221
+ dlqConfigId: config.id,
222
+ messageId,
223
+ status: 'pending',
224
+ startedAt: new Date(),
225
+ }
226
+
227
+ this.reprocessing.set(id, reprocessing)
228
+
229
+ // Simulate reprocessing
230
+ setTimeout(() => {
231
+ reprocessing.status = 'processing'
232
+
233
+ setTimeout(() => {
234
+ // Randomly succeed or fail
235
+ const success = Math.random() > 0.3
236
+
237
+ reprocessing.status = success ? 'success' : 'failed'
238
+ reprocessing.completedAt = new Date()
239
+
240
+ if (!success) {
241
+ reprocessing.error = 'Reprocessing failed - same error occurred'
242
+ } else {
243
+ // Remove message from DLQ if successful
244
+ this.messages.delete(messageId)
245
+ }
246
+ }, 100)
247
+ }, 50)
248
+
249
+ return reprocessing
250
+ }
251
+
252
+ /**
253
+ * Batch reprocess messages
254
+ */
255
+ async batchReprocess(options: {
256
+ dlqConfigId: string
257
+ maxMessages?: number
258
+ }): Promise<DLQReprocessing[]> {
259
+ const config = this.dlqConfigs.get(options.dlqConfigId)
260
+
261
+ if (!config) {
262
+ throw new Error(`DLQ config not found: ${options.dlqConfigId}`)
263
+ }
264
+
265
+ const messages = Array.from(this.messages.values())
266
+ .filter(m => m.functionName === config.functionName)
267
+ .slice(0, options.maxMessages || 10)
268
+
269
+ const reprocessingPromises = messages.map(m => this.reprocessMessage(m.id))
270
+
271
+ return Promise.all(reprocessingPromises)
272
+ }
273
+
274
+ /**
275
+ * Get DLQ statistics
276
+ */
277
+ getDLQStats(dlqConfigId: string): {
278
+ totalMessages: number
279
+ oldestMessage?: Date
280
+ newestMessage?: Date
281
+ averageAttempts: number
282
+ errorTypes: Record<string, number>
283
+ } {
284
+ const config = this.dlqConfigs.get(dlqConfigId)
285
+
286
+ if (!config) {
287
+ throw new Error(`DLQ config not found: ${dlqConfigId}`)
288
+ }
289
+
290
+ const messages = Array.from(this.messages.values()).filter(
291
+ m => m.functionName === config.functionName
292
+ )
293
+
294
+ const errorTypes: Record<string, number> = {}
295
+ let totalAttempts = 0
296
+
297
+ for (const message of messages) {
298
+ errorTypes[message.errorType] = (errorTypes[message.errorType] || 0) + 1
299
+ totalAttempts += message.attemptCount
300
+ }
301
+
302
+ const timestamps = messages.map(m => m.timestamp)
303
+
304
+ return {
305
+ totalMessages: messages.length,
306
+ oldestMessage: timestamps.length > 0 ? new Date(Math.min(...timestamps.map(t => t.getTime()))) : undefined,
307
+ newestMessage: timestamps.length > 0 ? new Date(Math.max(...timestamps.map(t => t.getTime()))) : undefined,
308
+ averageAttempts: messages.length > 0 ? totalAttempts / messages.length : 0,
309
+ errorTypes,
310
+ }
311
+ }
312
+
313
+ /**
314
+ * Get DLQ config
315
+ */
316
+ getDLQConfig(id: string): DLQConfig | undefined {
317
+ return this.dlqConfigs.get(id)
318
+ }
319
+
320
+ /**
321
+ * List DLQ configs
322
+ */
323
+ listDLQConfigs(): DLQConfig[] {
324
+ return Array.from(this.dlqConfigs.values())
325
+ }
326
+
327
+ /**
328
+ * Get DLQ messages
329
+ */
330
+ getDLQMessages(dlqConfigId: string): DLQMessage[] {
331
+ const config = this.dlqConfigs.get(dlqConfigId)
332
+
333
+ if (!config) {
334
+ return []
335
+ }
336
+
337
+ return Array.from(this.messages.values()).filter(
338
+ m => m.functionName === config.functionName
339
+ )
340
+ }
341
+
342
+ /**
343
+ * Generate CloudFormation for DLQ
344
+ */
345
+ generateDLQCF(config: DLQConfig): any {
346
+ return {
347
+ DeadLetterConfig: {
348
+ TargetArn: config.targetArn,
349
+ },
350
+ }
351
+ }
352
+
353
+ /**
354
+ * Generate CloudFormation for SQS DLQ
355
+ */
356
+ generateSQSDLQCF(config: DLQConfig): any {
357
+ return {
358
+ Type: 'AWS::SQS::Queue',
359
+ Properties: {
360
+ QueueName: `${config.functionName}-dlq`,
361
+ MessageRetentionPeriod: config.retentionPeriod || 1209600,
362
+ ...(config.maxReceiveCount && {
363
+ RedrivePolicy: {
364
+ deadLetterTargetArn: config.targetArn,
365
+ maxReceiveCount: config.maxReceiveCount,
366
+ },
367
+ }),
368
+ },
369
+ }
370
+ }
371
+
372
+ /**
373
+ * Generate CloudFormation for DLQ alarm
374
+ */
375
+ generateDLQAlarmCF(alarm: DLQAlarm): any {
376
+ const config = this.dlqConfigs.get(alarm.dlqConfigId)
377
+
378
+ if (!config) {
379
+ throw new Error(`DLQ config not found: ${alarm.dlqConfigId}`)
380
+ }
381
+
382
+ return {
383
+ Type: 'AWS::CloudWatch::Alarm',
384
+ Properties: {
385
+ AlarmName: alarm.alarmName,
386
+ AlarmDescription: `DLQ alarm for ${config.functionName}`,
387
+ MetricName: 'ApproximateNumberOfMessagesVisible',
388
+ Namespace: 'AWS/SQS',
389
+ Statistic: 'Sum',
390
+ Period: 300,
391
+ EvaluationPeriods: alarm.evaluationPeriods,
392
+ Threshold: alarm.threshold,
393
+ ComparisonOperator: 'GreaterThanThreshold',
394
+ Dimensions: [
395
+ {
396
+ Name: 'QueueName',
397
+ Value: config.targetArn.split(':').pop(),
398
+ },
399
+ ],
400
+ ...(alarm.notificationTopicArn && {
401
+ AlarmActions: [alarm.notificationTopicArn],
402
+ }),
403
+ },
404
+ }
405
+ }
406
+
407
+ /**
408
+ * Clear all data
409
+ */
410
+ clear(): void {
411
+ this.dlqConfigs.clear()
412
+ this.messages.clear()
413
+ this.alarms.clear()
414
+ this.reprocessing.clear()
415
+ this.configCounter = 0
416
+ this.messageCounter = 0
417
+ this.alarmCounter = 0
418
+ this.reprocessCounter = 0
419
+ }
420
+ }
421
+
422
+ /**
423
+ * Global Lambda DLQ manager instance
424
+ */
425
+ export const lambdaDLQManager: LambdaDLQManager = new LambdaDLQManager()
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Lambda Advanced Features
3
+ * Layers, versions, concurrency, destinations, VPC, and DLQ
4
+ */
5
+
6
+ export * from './layers'
7
+ export * from './versions'
8
+ export * from './concurrency'
9
+ export * from './destinations'
10
+ export * from './vpc'
11
+ export * from './dlq'