@gugananuvem/aws-local-simulator 1.0.35 → 1.0.39

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 (149) hide show
  1. package/README.md +662 -658
  2. package/package.json +10 -3
  3. package/src/config/default-config.js +71 -0
  4. package/src/config/env-loader.js +4 -2
  5. package/src/middleware/authorization.js +271 -0
  6. package/src/middleware/cloudtrail-logger.js +333 -0
  7. package/src/middleware/error-handler.js +138 -0
  8. package/src/middleware/index.js +79 -0
  9. package/src/middleware/policy-enforcement.js +407 -0
  10. package/src/server.js +74 -4
  11. package/src/services/acm/index.js +66 -0
  12. package/src/services/acm/models/certificate.js +202 -0
  13. package/src/services/acm/server.js +224 -0
  14. package/src/services/acm/simulator.js +293 -0
  15. package/src/services/alb/index.js +104 -0
  16. package/src/services/alb/models/loadBalancer.js +88 -0
  17. package/src/services/alb/models/targetGroup.js +128 -0
  18. package/src/services/alb/server.js +160 -0
  19. package/src/services/alb/simulator.js +262 -0
  20. package/src/services/apigateway/index.js +22 -0
  21. package/src/services/apigateway/server.js +247 -35
  22. package/src/services/apigateway/simulator.js +780 -26
  23. package/src/services/asg/index.js +100 -0
  24. package/src/services/asg/models/autoScalingGroup.js +110 -0
  25. package/src/services/asg/models/launchTemplate.js +41 -0
  26. package/src/services/asg/models/scalingPolicy.js +51 -0
  27. package/src/services/asg/server.js +236 -0
  28. package/src/services/asg/simulator.js +410 -0
  29. package/src/services/aurora/cluster-manager.js +731 -0
  30. package/src/services/aurora/data-api.js +514 -0
  31. package/src/services/aurora/db-engine.js +270 -0
  32. package/src/services/aurora/index.js +159 -0
  33. package/src/services/aurora/rds-api.js +189 -0
  34. package/src/services/aurora/server.js +213 -0
  35. package/src/services/aurora/sql-translator.js +334 -0
  36. package/src/services/cloudformation/index.js +2 -2
  37. package/src/services/cloudformation/server.js +1 -0
  38. package/src/services/cloudfront/cache-engine.js +225 -0
  39. package/src/services/cloudfront/geo-restrictions.js +377 -0
  40. package/src/services/cloudfront/index.js +220 -0
  41. package/src/services/cloudfront/models/behavior.js +158 -0
  42. package/src/services/cloudfront/models/distribution.js +284 -0
  43. package/src/services/cloudfront/models/index.js +99 -0
  44. package/src/services/cloudfront/models/invalidation.js +109 -0
  45. package/src/services/cloudfront/models/origin.js +155 -0
  46. package/src/services/cloudfront/origin-router.js +552 -0
  47. package/src/services/cloudfront/origin-validator.js +398 -0
  48. package/src/services/cloudfront/server.js +512 -0
  49. package/src/services/cloudfront/signed-url-generator.js +377 -0
  50. package/src/services/cloudfront/simulator.js +425 -0
  51. package/src/services/cloudfront/store.js +326 -0
  52. package/src/services/cloudshell/env-builder.js +27 -0
  53. package/src/services/cloudshell/index.js +48 -0
  54. package/src/services/cloudshell/routes.js +60 -0
  55. package/src/services/cloudshell/session-manager.js +226 -0
  56. package/src/services/cloudshell/static/.gitkeep +0 -0
  57. package/src/services/cloudshell/static/index.html +406 -0
  58. package/src/services/cloudshell/websocket-handler.js +107 -0
  59. package/src/services/cloudtrail/index.js +2 -3
  60. package/src/services/cloudtrail/server.js +68 -0
  61. package/src/services/cognito/server.js +4 -1
  62. package/src/services/dynamodb/server.js +4 -1
  63. package/src/services/dynamodb/simulator.js +2 -1
  64. package/src/services/ec2/index.js +101 -0
  65. package/src/services/ec2/instanceServer.js +311 -0
  66. package/src/services/ec2/models/ami.js +39 -0
  67. package/src/services/ec2/models/instance.js +98 -0
  68. package/src/services/ec2/models/networkInterface.js +74 -0
  69. package/src/services/ec2/models/securityGroup.js +71 -0
  70. package/src/services/ec2/server.js +350 -0
  71. package/src/services/ec2/simulator.js +436 -0
  72. package/src/services/eventbridge/server.js +36 -0
  73. package/src/services/eventbridge/simulator.js +230 -45
  74. package/src/services/iam/index.js +65 -0
  75. package/src/services/iam/middleware.js +99 -0
  76. package/src/services/iam/server.js +331 -0
  77. package/src/services/iam/simulator.js +1432 -0
  78. package/src/services/index.js +28 -0
  79. package/src/services/kinesis-analytics/index.js +105 -0
  80. package/src/services/kinesis-analytics/models/application.js +325 -0
  81. package/src/services/kinesis-analytics/models/index.js +12 -0
  82. package/src/services/kinesis-analytics/server.js +250 -0
  83. package/src/services/kinesis-analytics/simulator.js +407 -0
  84. package/src/services/kinesis-analytics/store.js +176 -0
  85. package/src/services/kinesis-data-streams/index.js +106 -0
  86. package/src/services/kinesis-data-streams/models/index.js +12 -0
  87. package/src/services/kinesis-data-streams/models/record.js +70 -0
  88. package/src/services/kinesis-data-streams/models/stream.js +280 -0
  89. package/src/services/kinesis-data-streams/server.js +255 -0
  90. package/src/services/kinesis-data-streams/simulator.js +514 -0
  91. package/src/services/kinesis-data-streams/store.js +163 -0
  92. package/src/services/kinesis-firehose/index.js +106 -0
  93. package/src/services/kinesis-firehose/models/delivery-stream.js +265 -0
  94. package/src/services/kinesis-firehose/models/index.js +10 -0
  95. package/src/services/kinesis-firehose/server.js +215 -0
  96. package/src/services/kinesis-firehose/simulator.js +388 -0
  97. package/src/services/kinesis-firehose/store.js +163 -0
  98. package/src/services/kms/server.js +4 -1
  99. package/src/services/lambda/index.js +26 -0
  100. package/src/services/lambda/server.js +12 -1
  101. package/src/services/lambda/simulator.js +4 -0
  102. package/src/services/opensearch/index.js +105 -0
  103. package/src/services/opensearch/models/document.js +115 -0
  104. package/src/services/opensearch/models/index.js +73 -0
  105. package/src/services/opensearch/server.js +310 -0
  106. package/src/services/opensearch/simulator.js +605 -0
  107. package/src/services/opensearch/store.js +162 -0
  108. package/src/services/organizations/control-tower-simulator.js +321 -0
  109. package/src/services/organizations/control-tower-store.js +182 -0
  110. package/src/services/organizations/iam-integration.js +413 -0
  111. package/src/services/organizations/index.js +172 -0
  112. package/src/services/organizations/models/index.js +13 -0
  113. package/src/services/organizations/models/invitation.js +48 -0
  114. package/src/services/organizations/models/organization.js +566 -0
  115. package/src/services/organizations/models/role.js +244 -0
  116. package/src/services/organizations/models/scp.js +131 -0
  117. package/src/services/organizations/server.js +736 -0
  118. package/src/services/organizations/simulator.js +593 -0
  119. package/src/services/organizations/store.js +235 -0
  120. package/src/services/organizations/vpc-integration.js +453 -0
  121. package/src/services/route53/index.js +67 -0
  122. package/src/services/route53/models/healthCheck.js +101 -0
  123. package/src/services/route53/models/hostedZone.js +37 -0
  124. package/src/services/route53/models/resourceRecord.js +106 -0
  125. package/src/services/route53/server.js +841 -0
  126. package/src/services/route53/simulator.js +350 -0
  127. package/src/services/s3/index.js +62 -0
  128. package/src/services/s3/presigned-url-generator.js +337 -0
  129. package/src/services/s3/server.js +231 -0
  130. package/src/services/s3/simulator.js +551 -4
  131. package/src/services/sns/index.js +31 -0
  132. package/src/services/sns/server.js +9 -0
  133. package/src/services/sqs/index.js +38 -0
  134. package/src/services/sqs/server.js +57 -4
  135. package/src/services/sqs/simulator.js +423 -33
  136. package/src/services/sts/simulator.js +209 -17
  137. package/src/services/vpc/README.md +459 -0
  138. package/src/services/vpc/ec2ResponseFormatter.js +431 -0
  139. package/src/services/vpc/index.js +90 -0
  140. package/src/services/vpc/models/internetGateway.js +71 -0
  141. package/src/services/vpc/models/routeTable.js +160 -0
  142. package/src/services/vpc/models/subnet.js +48 -0
  143. package/src/services/vpc/models/vpc.js +37 -0
  144. package/src/services/vpc/models/vpcEndpoint.js +100 -0
  145. package/src/services/vpc/models/vpcGateway.js +134 -0
  146. package/src/services/vpc/server.js +836 -0
  147. package/src/services/vpc/simulator.js +613 -0
  148. package/src/utils/policy-cache.js +215 -0
  149. package/aws-config +0 -154
@@ -1,3 +1,4 @@
1
+ const { setupServiceMiddleware } = require('../../middleware');
1
2
  /**
2
3
  * @fileoverview SNS HTTP Server — Query Protocol completo
3
4
  * Compatível com AWS SDK v3 SNS Client
@@ -45,6 +46,14 @@ function createSNSServer(simulator, config, logger) {
45
46
  next();
46
47
  });
47
48
 
49
+ // ── IAM enforcement (applied conditionally via injectDependencies) ──
50
+ app.use((req, res, next) => {
51
+ if (app.iamMiddleware && !req.path.startsWith('/__admin')) {
52
+ return app.iamMiddleware(req, res, next);
53
+ }
54
+ next();
55
+ });
56
+
48
57
  // ── Endpoint principal (Query Protocol) ─────────────────────
49
58
  app.post('/', async (req, res) => {
50
59
  const body = req.body || {};
@@ -94,6 +94,44 @@ class SQSService {
94
94
  getServer() {
95
95
  return this.server;
96
96
  }
97
+
98
+ injectDependencies(server) {
99
+ const lambdaService = server.getService('lambda');
100
+ if (lambdaService) {
101
+ this.lambdaService = lambdaService;
102
+ if (this.simulator) {
103
+ this.simulator.setLambdaService(lambdaService);
104
+ this.simulator.reattachLambdaHandlers();
105
+ }
106
+ if (this.server) {
107
+ this.server.lambdaService = lambdaService;
108
+ }
109
+ }
110
+
111
+ const iamService = server.getService('iam');
112
+ if (iamService && iamService.getSimulator()) {
113
+ const { createIAMEnforcementMiddleware } = require('../iam/middleware');
114
+ const iamSimulator = iamService.getSimulator();
115
+
116
+ const middleware = createIAMEnforcementMiddleware({
117
+ iamSimulator,
118
+ servicePrefix: 'sqs',
119
+ extractAction: (req) => req.body?.Action || req.query?.Action || 'Unknown',
120
+ extractResource: (req) => {
121
+ const queueUrl = req.body?.QueueUrl || req.query?.QueueUrl || '';
122
+ const queueName = queueUrl.split('/').pop() || req.body?.QueueName || 'unknown';
123
+ return `arn:aws:sqs:us-east-1:123456789012:${queueName}`;
124
+ },
125
+ formatError: (res, code, message) => {
126
+ res.status(403).set('Content-Type', 'text/xml').send(
127
+ `<ErrorResponse><Error><Type>Sender</Type><Code>${code}</Code><Message>${message}</Message></Error></ErrorResponse>`
128
+ );
129
+ }
130
+ });
131
+
132
+ this.server.iamMiddleware = middleware;
133
+ }
134
+ }
97
135
  }
98
136
 
99
137
  module.exports = SQSService;
@@ -1,3 +1,4 @@
1
+ const { setupServiceMiddleware } = require('../../middleware');
1
2
  /**
2
3
  * SQS Server - Servidor HTTP para SQS
3
4
  */
@@ -9,7 +10,9 @@ const SQSSimulator = require('./simulator');
9
10
  const logger = require('../../utils/logger');
10
11
 
11
12
  class SQSServer {
12
- constructor(port, config, lambdaService) {
13
+ constructor(port, config, lambdaService) {
14
+ this.organizationsService = null;
15
+ this.stsService = null;
13
16
  this.port = port;
14
17
  this.config = config;
15
18
  this.lambdaService = lambdaService;
@@ -67,6 +70,14 @@ class SQSServer {
67
70
  next();
68
71
  });
69
72
 
73
+ // IAM enforcement (applied conditionally via injectDependencies)
74
+ this.app.use((req, res, next) => {
75
+ if (this.iamMiddleware && !req.path.startsWith('/__admin')) {
76
+ return this.iamMiddleware(req, res, next);
77
+ }
78
+ next();
79
+ });
80
+
70
81
  this.app.post('/', (req, res) => {
71
82
  const action = req.query.Action || req.body.Action ||
72
83
  (req.headers['x-amz-target'] && req.headers['x-amz-target'].split('.')[1]);
@@ -161,13 +172,16 @@ class SQSServer {
161
172
  MessageId: m.MessageId,
162
173
  ReceiptHandle: m.ReceiptHandle,
163
174
  MD5OfBody: m.MD5OfBody,
164
- Body: m.Body
175
+ Body: m.Body,
176
+ Attributes: m.Attributes
165
177
  }))
166
178
  };
167
179
  case 'DeleteMessage':
168
180
  return {};
169
181
  case 'GetQueueUrl':
170
182
  return { QueueUrl: result.queueUrl };
183
+ case 'GetQueueAttributes':
184
+ return { Attributes: result.attributes };
171
185
  case 'ListQueues':
172
186
  return { QueueUrls: (result.queues || []).map(q => q.url) };
173
187
  default:
@@ -189,8 +203,9 @@ class SQSServer {
189
203
  return this.generateDeleteMessageResponse();
190
204
  case 'SetQueueAttributes':
191
205
  return this.generateSetQueueAttributesResponse();
206
+ case 'GetQueueAttributes':
207
+ return this.generateGetQueueAttributesResponse(result.attributes);
192
208
  case 'GetQueueUrl':
193
-
194
209
  return this.generateGetQueueUrlResponse(result.queueUrl);
195
210
  case 'ListQueues':
196
211
  return this.generateListQueuesResponse(result.queues);
@@ -206,6 +221,29 @@ class SQSServer {
206
221
  </SetQueueAttributesResponse>`;
207
222
  }
208
223
 
224
+ generateGetQueueAttributesResponse(attributes) {
225
+ let xml = `<?xml version="1.0" encoding="UTF-8"?>
226
+ <GetQueueAttributesResponse xmlns="http://queue.amazonaws.com/doc/2012-11-05/">
227
+ <GetQueueAttributesResult>
228
+ <Attribute>`;
229
+
230
+ for (const [key, value] of Object.entries(attributes)) {
231
+ xml += `
232
+ <Name>${key}</Name>
233
+ <Value>${this.escapeXml(value)}</Value>
234
+ </Attribute>
235
+ <Attribute>`;
236
+ }
237
+
238
+ xml = xml.slice(0, -13); // Remove last <Attribute>
239
+
240
+ xml += `
241
+ </GetQueueAttributesResult>
242
+ <ResponseMetadata><RequestId>${crypto.randomUUID()}</RequestId></ResponseMetadata>
243
+ </GetQueueAttributesResponse>`;
244
+
245
+ return xml;
246
+ }
209
247
 
210
248
  generateCreateQueueResponse(queueUrl) {
211
249
  return `<?xml version="1.0" encoding="UTF-8"?>
@@ -270,7 +308,22 @@ class SQSServer {
270
308
  <MessageId>${msg.MessageId}</MessageId>
271
309
  <ReceiptHandle>${msg.ReceiptHandle}</ReceiptHandle>
272
310
  <MD5OfBody>${msg.MD5OfBody}</MD5OfBody>
273
- <Body>${this.escapeXml(msg.Body)}</Body>
311
+ <Body>${this.escapeXml(msg.Body)}</Body>`;
312
+
313
+ // Add message attributes if present
314
+ if (msg.Attributes && Object.keys(msg.Attributes).length > 0) {
315
+ for (const [attrKey, attrValue] of Object.entries(msg.Attributes)) {
316
+ if (attrValue !== null && attrValue !== undefined) {
317
+ xml += `
318
+ <Attribute>
319
+ <Name>${attrKey}</Name>
320
+ <Value>${this.escapeXml(String(attrValue))}</Value>
321
+ </Attribute>`;
322
+ }
323
+ }
324
+ }
325
+
326
+ xml += `
274
327
  </Message>`;
275
328
  }
276
329