@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,402 @@
1
+ /**
2
+ * SQS Batch Processing
3
+ * Batch operations, parallel processing, and throughput optimization
4
+ */
5
+
6
+ export interface BatchConfig {
7
+ id: string
8
+ queueUrl: string
9
+ batchSize: number
10
+ maxWaitTime: number // milliseconds
11
+ parallelProcessors: number
12
+ retryAttempts: number
13
+ visibilityTimeout: number
14
+ }
15
+
16
+ export interface BatchJob {
17
+ id: string
18
+ configId: string
19
+ messages: BatchMessage[]
20
+ status: 'pending' | 'processing' | 'completed' | 'failed'
21
+ startedAt?: Date
22
+ completedAt?: Date
23
+ processedCount: number
24
+ failedCount: number
25
+ }
26
+
27
+ export interface BatchMessage {
28
+ id: string
29
+ messageId: string
30
+ body: string
31
+ receiptHandle: string
32
+ attributes: Record<string, any>
33
+ status: 'pending' | 'processing' | 'success' | 'failed'
34
+ processingTime?: number
35
+ error?: string
36
+ }
37
+
38
+ export interface ProcessorMetrics {
39
+ id: string
40
+ configId: string
41
+ timestamp: Date
42
+ messagesProcessed: number
43
+ averageProcessingTime: number
44
+ throughput: number // messages per second
45
+ errorRate: number
46
+ }
47
+
48
+ /**
49
+ * Batch processing manager
50
+ */
51
+ export class BatchProcessingManager {
52
+ private configs: Map<string, BatchConfig> = new Map()
53
+ private jobs: Map<string, BatchJob> = new Map()
54
+ private metrics: Map<string, ProcessorMetrics[]> = new Map()
55
+ private configCounter = 0
56
+ private jobCounter = 0
57
+ private metricsCounter = 0
58
+
59
+ /**
60
+ * Create batch config
61
+ */
62
+ createBatchConfig(config: Omit<BatchConfig, 'id'>): BatchConfig {
63
+ const id = `batch-config-${Date.now()}-${this.configCounter++}`
64
+
65
+ const batchConfig: BatchConfig = {
66
+ id,
67
+ ...config,
68
+ }
69
+
70
+ this.configs.set(id, batchConfig)
71
+
72
+ return batchConfig
73
+ }
74
+
75
+ /**
76
+ * Create high-throughput batch config
77
+ */
78
+ createHighThroughputConfig(options: {
79
+ queueUrl: string
80
+ }): BatchConfig {
81
+ return this.createBatchConfig({
82
+ queueUrl: options.queueUrl,
83
+ batchSize: 10, // Max for SQS
84
+ maxWaitTime: 100,
85
+ parallelProcessors: 10,
86
+ retryAttempts: 3,
87
+ visibilityTimeout: 30,
88
+ })
89
+ }
90
+
91
+ /**
92
+ * Create low-latency batch config
93
+ */
94
+ createLowLatencyConfig(options: {
95
+ queueUrl: string
96
+ }): BatchConfig {
97
+ return this.createBatchConfig({
98
+ queueUrl: options.queueUrl,
99
+ batchSize: 1,
100
+ maxWaitTime: 0,
101
+ parallelProcessors: 5,
102
+ retryAttempts: 2,
103
+ visibilityTimeout: 10,
104
+ })
105
+ }
106
+
107
+ /**
108
+ * Create batch job
109
+ */
110
+ createBatchJob(options: {
111
+ configId: string
112
+ messageCount: number
113
+ }): BatchJob {
114
+ const id = `batch-job-${Date.now()}-${this.jobCounter++}`
115
+
116
+ const config = this.configs.get(options.configId)
117
+
118
+ if (!config) {
119
+ throw new Error(`Batch config not found: ${options.configId}`)
120
+ }
121
+
122
+ const messages: BatchMessage[] = []
123
+ for (let i = 0; i < options.messageCount; i++) {
124
+ messages.push({
125
+ id: `msg-${id}-${i}`,
126
+ messageId: `${id}-${i}`,
127
+ body: `Message ${i}`,
128
+ receiptHandle: `receipt-${id}-${i}`,
129
+ attributes: {},
130
+ status: 'pending',
131
+ })
132
+ }
133
+
134
+ const job: BatchJob = {
135
+ id,
136
+ configId: options.configId,
137
+ messages,
138
+ status: 'pending',
139
+ processedCount: 0,
140
+ failedCount: 0,
141
+ }
142
+
143
+ this.jobs.set(id, job)
144
+
145
+ return job
146
+ }
147
+
148
+ /**
149
+ * Process batch job
150
+ */
151
+ async processBatchJob(jobId: string): Promise<BatchJob> {
152
+ const job = this.jobs.get(jobId)
153
+
154
+ if (!job) {
155
+ throw new Error(`Batch job not found: ${jobId}`)
156
+ }
157
+
158
+ const config = this.configs.get(job.configId)
159
+
160
+ if (!config) {
161
+ throw new Error(`Batch config not found: ${job.configId}`)
162
+ }
163
+
164
+ job.status = 'processing'
165
+ job.startedAt = new Date()
166
+
167
+ // Process in batches
168
+ const batches = this.chunkArray(job.messages, config.batchSize)
169
+
170
+ for (const batch of batches) {
171
+ await this.processBatch(batch, config)
172
+ }
173
+
174
+ // Update job status
175
+ job.processedCount = job.messages.filter(m => m.status === 'success').length
176
+ job.failedCount = job.messages.filter(m => m.status === 'failed').length
177
+ job.status = job.failedCount === 0 ? 'completed' : 'failed'
178
+ job.completedAt = new Date()
179
+
180
+ // Collect metrics
181
+ this.collectProcessorMetrics(config.id, job)
182
+
183
+ return job
184
+ }
185
+
186
+ /**
187
+ * Process single batch
188
+ */
189
+ private async processBatch(messages: BatchMessage[], config: BatchConfig): Promise<void> {
190
+ const promises = messages.map(msg => this.processMessage(msg, config))
191
+ await Promise.all(promises)
192
+ }
193
+
194
+ /**
195
+ * Process single message
196
+ */
197
+ private async processMessage(message: BatchMessage, config: BatchConfig): Promise<void> {
198
+ message.status = 'processing'
199
+
200
+ const startTime = Date.now()
201
+
202
+ // Simulate processing with random delay
203
+ await new Promise(resolve => setTimeout(resolve, Math.random() * 100))
204
+
205
+ const processingTime = Date.now() - startTime
206
+ message.processingTime = processingTime
207
+
208
+ // Random success/failure
209
+ const success = Math.random() > 0.1
210
+
211
+ if (success) {
212
+ message.status = 'success'
213
+ } else {
214
+ message.status = 'failed'
215
+ message.error = 'Processing error'
216
+ }
217
+ }
218
+
219
+ /**
220
+ * Chunk array into batches
221
+ */
222
+ private chunkArray<T>(array: T[], chunkSize: number): T[][] {
223
+ const chunks: T[][] = []
224
+ for (let i = 0; i < array.length; i += chunkSize) {
225
+ chunks.push(array.slice(i, i + chunkSize))
226
+ }
227
+ return chunks
228
+ }
229
+
230
+ /**
231
+ * Collect processor metrics
232
+ */
233
+ private collectProcessorMetrics(configId: string, job: BatchJob): void {
234
+ const id = `metrics-${Date.now()}-${this.metricsCounter++}`
235
+
236
+ const successfulMessages = job.messages.filter(m => m.status === 'success')
237
+ const processingTimes = successfulMessages
238
+ .map(m => m.processingTime || 0)
239
+ .filter(t => t > 0)
240
+
241
+ const averageProcessingTime = processingTimes.length > 0
242
+ ? processingTimes.reduce((sum, t) => sum + t, 0) / processingTimes.length
243
+ : 0
244
+
245
+ const duration = job.completedAt && job.startedAt
246
+ ? (job.completedAt.getTime() - job.startedAt.getTime()) / 1000
247
+ : 1
248
+
249
+ const throughput = job.processedCount / duration
250
+
251
+ const errorRate = job.messages.length > 0
252
+ ? (job.failedCount / job.messages.length) * 100
253
+ : 0
254
+
255
+ const metrics: ProcessorMetrics = {
256
+ id,
257
+ configId,
258
+ timestamp: new Date(),
259
+ messagesProcessed: job.processedCount,
260
+ averageProcessingTime,
261
+ throughput,
262
+ errorRate,
263
+ }
264
+
265
+ const configMetrics = this.metrics.get(configId) || []
266
+ configMetrics.push(metrics)
267
+ this.metrics.set(configId, configMetrics)
268
+ }
269
+
270
+ /**
271
+ * Get batch statistics
272
+ */
273
+ getBatchStatistics(configId: string): {
274
+ totalJobsProcessed: number
275
+ totalMessagesProcessed: number
276
+ averageThroughput: number
277
+ averageErrorRate: number
278
+ averageProcessingTime: number
279
+ } {
280
+ const metricsHistory = this.metrics.get(configId) || []
281
+
282
+ if (metricsHistory.length === 0) {
283
+ return {
284
+ totalJobsProcessed: 0,
285
+ totalMessagesProcessed: 0,
286
+ averageThroughput: 0,
287
+ averageErrorRate: 0,
288
+ averageProcessingTime: 0,
289
+ }
290
+ }
291
+
292
+ const totalMessagesProcessed = metricsHistory.reduce((sum, m) => sum + m.messagesProcessed, 0)
293
+ const averageThroughput = metricsHistory.reduce((sum, m) => sum + m.throughput, 0) / metricsHistory.length
294
+ const averageErrorRate = metricsHistory.reduce((sum, m) => sum + m.errorRate, 0) / metricsHistory.length
295
+ const averageProcessingTime = metricsHistory.reduce((sum, m) => sum + m.averageProcessingTime, 0) / metricsHistory.length
296
+
297
+ return {
298
+ totalJobsProcessed: metricsHistory.length,
299
+ totalMessagesProcessed,
300
+ averageThroughput,
301
+ averageErrorRate,
302
+ averageProcessingTime,
303
+ }
304
+ }
305
+
306
+ /**
307
+ * Optimize batch config
308
+ */
309
+ optimizeBatchConfig(configId: string): BatchConfig {
310
+ const config = this.configs.get(configId)
311
+
312
+ if (!config) {
313
+ throw new Error(`Batch config not found: ${configId}`)
314
+ }
315
+
316
+ const stats = this.getBatchStatistics(configId)
317
+
318
+ // Increase batch size if error rate is low
319
+ if (stats.averageErrorRate < 5 && config.batchSize < 10) {
320
+ config.batchSize = Math.min(10, config.batchSize + 1)
321
+ }
322
+
323
+ // Decrease batch size if error rate is high
324
+ if (stats.averageErrorRate > 20 && config.batchSize > 1) {
325
+ config.batchSize = Math.max(1, config.batchSize - 1)
326
+ }
327
+
328
+ // Adjust parallel processors based on throughput
329
+ if (stats.averageThroughput < 5 && config.parallelProcessors < 20) {
330
+ config.parallelProcessors++
331
+ }
332
+
333
+ return config
334
+ }
335
+
336
+ /**
337
+ * Get config
338
+ */
339
+ getConfig(id: string): BatchConfig | undefined {
340
+ return this.configs.get(id)
341
+ }
342
+
343
+ /**
344
+ * List configs
345
+ */
346
+ listConfigs(): BatchConfig[] {
347
+ return Array.from(this.configs.values())
348
+ }
349
+
350
+ /**
351
+ * Get job
352
+ */
353
+ getJob(id: string): BatchJob | undefined {
354
+ return this.jobs.get(id)
355
+ }
356
+
357
+ /**
358
+ * List jobs
359
+ */
360
+ listJobs(configId?: string): BatchJob[] {
361
+ let jobs = Array.from(this.jobs.values())
362
+
363
+ if (configId) {
364
+ jobs = jobs.filter(j => j.configId === configId)
365
+ }
366
+
367
+ return jobs
368
+ }
369
+
370
+ /**
371
+ * Generate CloudFormation for Lambda batch processor
372
+ */
373
+ generateBatchProcessorCF(config: BatchConfig): any {
374
+ return {
375
+ Type: 'AWS::Lambda::EventSourceMapping',
376
+ Properties: {
377
+ EventSourceArn: `arn:aws:sqs:us-east-1:123456789012:${config.queueUrl.split('/').pop()}`,
378
+ FunctionName: 'batch-processor-function',
379
+ BatchSize: config.batchSize,
380
+ MaximumBatchingWindowInSeconds: config.maxWaitTime / 1000,
381
+ FunctionResponseTypes: ['ReportBatchItemFailures'],
382
+ },
383
+ }
384
+ }
385
+
386
+ /**
387
+ * Clear all data
388
+ */
389
+ clear(): void {
390
+ this.configs.clear()
391
+ this.jobs.clear()
392
+ this.metrics.clear()
393
+ this.configCounter = 0
394
+ this.jobCounter = 0
395
+ this.metricsCounter = 0
396
+ }
397
+ }
398
+
399
+ /**
400
+ * Global batch processing manager instance
401
+ */
402
+ export const batchProcessingManager: BatchProcessingManager = new BatchProcessingManager()