@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,428 @@
1
+ /**
2
+ * SQS Queue Management
3
+ * Retention policies, delay queues, and queue operations
4
+ */
5
+
6
+ export interface QueueManagement {
7
+ id: string
8
+ queueUrl: string
9
+ queueName: string
10
+ messageRetentionPeriod: number // seconds (60 - 1209600)
11
+ delaySeconds: number // 0-900
12
+ maximumMessageSize: number // bytes
13
+ receiveMessageWaitTime: number // seconds (long polling)
14
+ purgeInProgress: boolean
15
+ }
16
+
17
+ export interface RetentionPolicy {
18
+ id: string
19
+ queueId: string
20
+ retentionPeriod: number // seconds
21
+ autoCleanup: boolean
22
+ cleanupSchedule?: string
23
+ archiveExpiredMessages: boolean
24
+ archiveS3Bucket?: string
25
+ }
26
+
27
+ export interface DelayQueue {
28
+ id: string
29
+ queueUrl: string
30
+ defaultDelay: number // seconds
31
+ perMessageDelay: boolean
32
+ maxDelay: number
33
+ }
34
+
35
+ export interface PurgeOperation {
36
+ id: string
37
+ queueUrl: string
38
+ status: 'pending' | 'in_progress' | 'completed' | 'failed'
39
+ messagesPurged?: number
40
+ startedAt?: Date
41
+ completedAt?: Date
42
+ }
43
+
44
+ export interface QueueMetrics {
45
+ id: string
46
+ queueUrl: string
47
+ timestamp: Date
48
+ approximateNumberOfMessages: number
49
+ approximateNumberOfMessagesNotVisible: number
50
+ approximateNumberOfMessagesDelayed: number
51
+ oldestMessageAge?: number
52
+ }
53
+
54
+ /**
55
+ * Queue management manager
56
+ */
57
+ export class QueueManagementManager {
58
+ private queues: Map<string, QueueManagement> = new Map()
59
+ private retentionPolicies: Map<string, RetentionPolicy> = new Map()
60
+ private delayQueues: Map<string, DelayQueue> = new Map()
61
+ private purgeOperations: Map<string, PurgeOperation> = new Map()
62
+ private metrics: Map<string, QueueMetrics[]> = new Map()
63
+ private queueCounter = 0
64
+ private retentionCounter = 0
65
+ private delayCounter = 0
66
+ private purgeCounter = 0
67
+ private metricsCounter = 0
68
+
69
+ /**
70
+ * Create queue
71
+ */
72
+ createQueue(queue: Omit<QueueManagement, 'id' | 'purgeInProgress'>): QueueManagement {
73
+ const id = `queue-${Date.now()}-${this.queueCounter++}`
74
+
75
+ const queueManagement: QueueManagement = {
76
+ id,
77
+ purgeInProgress: false,
78
+ ...queue,
79
+ }
80
+
81
+ this.queues.set(id, queueManagement)
82
+
83
+ return queueManagement
84
+ }
85
+
86
+ /**
87
+ * Create standard queue
88
+ */
89
+ createStandardQueue(options: {
90
+ queueName: string
91
+ messageRetentionDays?: number
92
+ }): QueueManagement {
93
+ return this.createQueue({
94
+ queueUrl: `https://sqs.us-east-1.amazonaws.com/123456789012/${options.queueName}`,
95
+ queueName: options.queueName,
96
+ messageRetentionPeriod: (options.messageRetentionDays || 4) * 24 * 60 * 60,
97
+ delaySeconds: 0,
98
+ maximumMessageSize: 256 * 1024, // 256 KB
99
+ receiveMessageWaitTime: 0,
100
+ })
101
+ }
102
+
103
+ /**
104
+ * Create long polling queue
105
+ */
106
+ createLongPollingQueue(options: {
107
+ queueName: string
108
+ waitTimeSeconds?: number
109
+ }): QueueManagement {
110
+ return this.createQueue({
111
+ queueUrl: `https://sqs.us-east-1.amazonaws.com/123456789012/${options.queueName}`,
112
+ queueName: options.queueName,
113
+ messageRetentionPeriod: 345600, // 4 days
114
+ delaySeconds: 0,
115
+ maximumMessageSize: 256 * 1024,
116
+ receiveMessageWaitTime: options.waitTimeSeconds || 20,
117
+ })
118
+ }
119
+
120
+ /**
121
+ * Create retention policy
122
+ */
123
+ createRetentionPolicy(policy: Omit<RetentionPolicy, 'id'>): RetentionPolicy {
124
+ const id = `retention-${Date.now()}-${this.retentionCounter++}`
125
+
126
+ const retentionPolicy: RetentionPolicy = {
127
+ id,
128
+ ...policy,
129
+ }
130
+
131
+ this.retentionPolicies.set(id, retentionPolicy)
132
+
133
+ // Update queue retention
134
+ const queue = this.queues.get(policy.queueId)
135
+ if (queue) {
136
+ queue.messageRetentionPeriod = policy.retentionPeriod
137
+ }
138
+
139
+ return retentionPolicy
140
+ }
141
+
142
+ /**
143
+ * Create short retention policy
144
+ */
145
+ createShortRetentionPolicy(options: {
146
+ queueId: string
147
+ retentionHours: number
148
+ }): RetentionPolicy {
149
+ return this.createRetentionPolicy({
150
+ queueId: options.queueId,
151
+ retentionPeriod: options.retentionHours * 60 * 60,
152
+ autoCleanup: true,
153
+ archiveExpiredMessages: false,
154
+ })
155
+ }
156
+
157
+ /**
158
+ * Create archival retention policy
159
+ */
160
+ createArchivalRetentionPolicy(options: {
161
+ queueId: string
162
+ retentionDays: number
163
+ s3Bucket: string
164
+ }): RetentionPolicy {
165
+ return this.createRetentionPolicy({
166
+ queueId: options.queueId,
167
+ retentionPeriod: options.retentionDays * 24 * 60 * 60,
168
+ autoCleanup: true,
169
+ cleanupSchedule: 'cron(0 0 * * ? *)', // Daily at midnight
170
+ archiveExpiredMessages: true,
171
+ archiveS3Bucket: options.s3Bucket,
172
+ })
173
+ }
174
+
175
+ /**
176
+ * Create delay queue
177
+ */
178
+ createDelayQueue(delay: Omit<DelayQueue, 'id'>): DelayQueue {
179
+ const id = `delay-${Date.now()}-${this.delayCounter++}`
180
+
181
+ const delayQueue: DelayQueue = {
182
+ id,
183
+ ...delay,
184
+ }
185
+
186
+ this.delayQueues.set(id, delayQueue)
187
+
188
+ // Update queue delay
189
+ const queue = Array.from(this.queues.values()).find(q => q.queueUrl === delay.queueUrl)
190
+ if (queue) {
191
+ queue.delaySeconds = delay.defaultDelay
192
+ }
193
+
194
+ return delayQueue
195
+ }
196
+
197
+ /**
198
+ * Create scheduled delay queue
199
+ */
200
+ createScheduledDelayQueue(options: {
201
+ queueUrl: string
202
+ delayMinutes: number
203
+ }): DelayQueue {
204
+ return this.createDelayQueue({
205
+ queueUrl: options.queueUrl,
206
+ defaultDelay: options.delayMinutes * 60,
207
+ perMessageDelay: false,
208
+ maxDelay: 900, // 15 minutes max
209
+ })
210
+ }
211
+
212
+ /**
213
+ * Purge queue
214
+ */
215
+ async purgeQueue(queueId: string): Promise<PurgeOperation> {
216
+ const queue = this.queues.get(queueId)
217
+
218
+ if (!queue) {
219
+ throw new Error(`Queue not found: ${queueId}`)
220
+ }
221
+
222
+ if (queue.purgeInProgress) {
223
+ throw new Error('Purge already in progress for this queue')
224
+ }
225
+
226
+ const id = `purge-${Date.now()}-${this.purgeCounter++}`
227
+
228
+ const purgeOp: PurgeOperation = {
229
+ id,
230
+ queueUrl: queue.queueUrl,
231
+ status: 'in_progress',
232
+ startedAt: new Date(),
233
+ }
234
+
235
+ this.purgeOperations.set(id, purgeOp)
236
+ queue.purgeInProgress = true
237
+
238
+ // Simulate purge operation
239
+ setTimeout(() => {
240
+ purgeOp.status = 'completed'
241
+ purgeOp.completedAt = new Date()
242
+ purgeOp.messagesPurged = Math.floor(Math.random() * 1000)
243
+ queue.purgeInProgress = false
244
+ }, 100)
245
+
246
+ return purgeOp
247
+ }
248
+
249
+ /**
250
+ * Collect queue metrics
251
+ */
252
+ collectQueueMetrics(queueUrl: string): QueueMetrics {
253
+ const id = `metrics-${Date.now()}-${this.metricsCounter++}`
254
+
255
+ const metrics: QueueMetrics = {
256
+ id,
257
+ queueUrl,
258
+ timestamp: new Date(),
259
+ approximateNumberOfMessages: Math.floor(Math.random() * 1000),
260
+ approximateNumberOfMessagesNotVisible: Math.floor(Math.random() * 100),
261
+ approximateNumberOfMessagesDelayed: Math.floor(Math.random() * 50),
262
+ oldestMessageAge: Math.floor(Math.random() * 86400),
263
+ }
264
+
265
+ const queueMetrics = this.metrics.get(queueUrl) || []
266
+ queueMetrics.push(metrics)
267
+ this.metrics.set(queueUrl, queueMetrics)
268
+
269
+ return metrics
270
+ }
271
+
272
+ /**
273
+ * Get queue health
274
+ */
275
+ getQueueHealth(queueUrl: string): {
276
+ status: 'healthy' | 'warning' | 'critical'
277
+ issues: string[]
278
+ recommendations: string[]
279
+ } {
280
+ const metricsHistory = this.metrics.get(queueUrl) || []
281
+
282
+ if (metricsHistory.length === 0) {
283
+ return {
284
+ status: 'healthy',
285
+ issues: [],
286
+ recommendations: [],
287
+ }
288
+ }
289
+
290
+ const latest = metricsHistory[metricsHistory.length - 1]
291
+ const issues: string[] = []
292
+ const recommendations: string[] = []
293
+ let status: 'healthy' | 'warning' | 'critical' = 'healthy'
294
+
295
+ // Check message backlog
296
+ if (latest.approximateNumberOfMessages > 10000) {
297
+ status = 'critical'
298
+ issues.push('Large message backlog detected')
299
+ recommendations.push('Increase consumer capacity')
300
+ } else if (latest.approximateNumberOfMessages > 1000) {
301
+ status = 'warning'
302
+ issues.push('Growing message backlog')
303
+ recommendations.push('Monitor consumer performance')
304
+ }
305
+
306
+ // Check message age
307
+ if (latest.oldestMessageAge && latest.oldestMessageAge > 3600) {
308
+ if (status !== 'critical') status = 'warning'
309
+ issues.push('Old messages in queue')
310
+ recommendations.push('Review message processing')
311
+ }
312
+
313
+ // Check delayed messages
314
+ if (latest.approximateNumberOfMessagesDelayed > 100) {
315
+ if (status !== 'critical') status = 'warning'
316
+ issues.push('High number of delayed messages')
317
+ }
318
+
319
+ return {
320
+ status,
321
+ issues,
322
+ recommendations,
323
+ }
324
+ }
325
+
326
+ /**
327
+ * Get queue
328
+ */
329
+ getQueue(id: string): QueueManagement | undefined {
330
+ return this.queues.get(id)
331
+ }
332
+
333
+ /**
334
+ * List queues
335
+ */
336
+ listQueues(): QueueManagement[] {
337
+ return Array.from(this.queues.values())
338
+ }
339
+
340
+ /**
341
+ * Get retention policy
342
+ */
343
+ getRetentionPolicy(id: string): RetentionPolicy | undefined {
344
+ return this.retentionPolicies.get(id)
345
+ }
346
+
347
+ /**
348
+ * List retention policies
349
+ */
350
+ listRetentionPolicies(): RetentionPolicy[] {
351
+ return Array.from(this.retentionPolicies.values())
352
+ }
353
+
354
+ /**
355
+ * Get purge operations
356
+ */
357
+ getPurgeOperations(queueUrl?: string): PurgeOperation[] {
358
+ let operations = Array.from(this.purgeOperations.values())
359
+
360
+ if (queueUrl) {
361
+ operations = operations.filter(op => op.queueUrl === queueUrl)
362
+ }
363
+
364
+ return operations
365
+ }
366
+
367
+ /**
368
+ * Generate CloudFormation for queue
369
+ */
370
+ generateQueueCF(queue: QueueManagement): any {
371
+ return {
372
+ Type: 'AWS::SQS::Queue',
373
+ Properties: {
374
+ QueueName: queue.queueName,
375
+ MessageRetentionPeriod: queue.messageRetentionPeriod,
376
+ DelaySeconds: queue.delaySeconds,
377
+ MaximumMessageSize: queue.maximumMessageSize,
378
+ ReceiveMessageWaitTimeSeconds: queue.receiveMessageWaitTime,
379
+ },
380
+ }
381
+ }
382
+
383
+ /**
384
+ * Generate CloudFormation for EventBridge rule for cleanup
385
+ */
386
+ generateCleanupRuleCF(policy: RetentionPolicy): any {
387
+ return {
388
+ Type: 'AWS::Events::Rule',
389
+ Properties: {
390
+ Name: `${policy.id}-cleanup`,
391
+ Description: 'Automated queue cleanup',
392
+ ScheduleExpression: policy.cleanupSchedule || 'cron(0 0 * * ? *)',
393
+ State: 'ENABLED',
394
+ Targets: [
395
+ {
396
+ Arn: 'arn:aws:lambda:us-east-1:123456789012:function:queue-cleanup',
397
+ Id: policy.id,
398
+ Input: JSON.stringify({
399
+ queueId: policy.queueId,
400
+ archiveBucket: policy.archiveS3Bucket,
401
+ }),
402
+ },
403
+ ],
404
+ },
405
+ }
406
+ }
407
+
408
+ /**
409
+ * Clear all data
410
+ */
411
+ clear(): void {
412
+ this.queues.clear()
413
+ this.retentionPolicies.clear()
414
+ this.delayQueues.clear()
415
+ this.purgeOperations.clear()
416
+ this.metrics.clear()
417
+ this.queueCounter = 0
418
+ this.retentionCounter = 0
419
+ this.delayCounter = 0
420
+ this.purgeCounter = 0
421
+ this.metricsCounter = 0
422
+ }
423
+ }
424
+
425
+ /**
426
+ * Global queue management manager instance
427
+ */
428
+ export const queueManagementManager: QueueManagementManager = new QueueManagementManager()