@gugananuvem/aws-local-simulator 1.0.34 → 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 (150) hide show
  1. package/README.md +662 -658
  2. package/package.json +11 -4
  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/handler-loader.js +50 -5
  100. package/src/services/lambda/index.js +26 -0
  101. package/src/services/lambda/server.js +18 -12
  102. package/src/services/lambda/simulator.js +73 -17
  103. package/src/services/opensearch/index.js +105 -0
  104. package/src/services/opensearch/models/document.js +115 -0
  105. package/src/services/opensearch/models/index.js +73 -0
  106. package/src/services/opensearch/server.js +310 -0
  107. package/src/services/opensearch/simulator.js +605 -0
  108. package/src/services/opensearch/store.js +162 -0
  109. package/src/services/organizations/control-tower-simulator.js +321 -0
  110. package/src/services/organizations/control-tower-store.js +182 -0
  111. package/src/services/organizations/iam-integration.js +413 -0
  112. package/src/services/organizations/index.js +172 -0
  113. package/src/services/organizations/models/index.js +13 -0
  114. package/src/services/organizations/models/invitation.js +48 -0
  115. package/src/services/organizations/models/organization.js +566 -0
  116. package/src/services/organizations/models/role.js +244 -0
  117. package/src/services/organizations/models/scp.js +131 -0
  118. package/src/services/organizations/server.js +736 -0
  119. package/src/services/organizations/simulator.js +593 -0
  120. package/src/services/organizations/store.js +235 -0
  121. package/src/services/organizations/vpc-integration.js +453 -0
  122. package/src/services/route53/index.js +67 -0
  123. package/src/services/route53/models/healthCheck.js +101 -0
  124. package/src/services/route53/models/hostedZone.js +37 -0
  125. package/src/services/route53/models/resourceRecord.js +106 -0
  126. package/src/services/route53/server.js +841 -0
  127. package/src/services/route53/simulator.js +350 -0
  128. package/src/services/s3/index.js +62 -0
  129. package/src/services/s3/presigned-url-generator.js +337 -0
  130. package/src/services/s3/server.js +231 -0
  131. package/src/services/s3/simulator.js +551 -4
  132. package/src/services/sns/index.js +31 -0
  133. package/src/services/sns/server.js +9 -0
  134. package/src/services/sqs/index.js +38 -0
  135. package/src/services/sqs/server.js +57 -4
  136. package/src/services/sqs/simulator.js +423 -33
  137. package/src/services/sts/simulator.js +209 -17
  138. package/src/services/vpc/README.md +459 -0
  139. package/src/services/vpc/ec2ResponseFormatter.js +431 -0
  140. package/src/services/vpc/index.js +90 -0
  141. package/src/services/vpc/models/internetGateway.js +71 -0
  142. package/src/services/vpc/models/routeTable.js +160 -0
  143. package/src/services/vpc/models/subnet.js +48 -0
  144. package/src/services/vpc/models/vpc.js +37 -0
  145. package/src/services/vpc/models/vpcEndpoint.js +100 -0
  146. package/src/services/vpc/models/vpcGateway.js +134 -0
  147. package/src/services/vpc/server.js +836 -0
  148. package/src/services/vpc/simulator.js +613 -0
  149. package/src/utils/policy-cache.js +215 -0
  150. package/aws-config +0 -154
@@ -0,0 +1,255 @@
1
+ /**
2
+ * Kinesis Data Streams Server - Servidor HTTP REST/JSON para Kinesis
3
+ */
4
+
5
+ const express = require('express');
6
+ const cors = require('cors');
7
+ const logger = require('../../utils/logger');
8
+
9
+ class KinesisDataStreamsServer {
10
+ constructor(port, config) {
11
+ this.port = port;
12
+ this.config = config;
13
+ this.app = express();
14
+ this.simulator = null;
15
+ this.server = null;
16
+ this.setupMiddlewares();
17
+ }
18
+
19
+ setupMiddlewares() {
20
+ this.app.use(cors());
21
+ this.app.use(express.json({ limit: '10mb' }));
22
+
23
+ // Custom header parsing para AWS SDK
24
+ this.app.use((req, res, next) => {
25
+ // Parsa target header (X-Amz-Target: Kinesis_20131202.DescribeStream)
26
+ const target = req.headers['x-amz-target'];
27
+ if (target) {
28
+ const [, action] = target.split('.');
29
+ req.action = action;
30
+ }
31
+
32
+ logger.debug(`Kinesis Data Streams: ${req.method} ${req.path} - Action: ${req.action || 'none'}`);
33
+ next();
34
+ });
35
+ }
36
+
37
+ async initialize() {
38
+ logger.debug(`Inicializando Kinesis Data Streams Server na porta ${this.port}`);
39
+ this.setupRoutes();
40
+ }
41
+
42
+ setupRoutes() {
43
+ // Rota padrão para operações (AWS SDK usa POST com X-Amz-Target)
44
+ this.app.post('/', (req, res) => {
45
+ const action = req.action || req.body.Action;
46
+
47
+ try {
48
+ switch (action) {
49
+ case 'CreateStream':
50
+ return this.createStream(req, res);
51
+ case 'DescribeStream':
52
+ return this.describeStream(req, res);
53
+ case 'ListStreams':
54
+ return this.listStreams(req, res);
55
+ case 'DeleteStream':
56
+ return this.deleteStream(req, res);
57
+ case 'PutRecord':
58
+ return this.putRecord(req, res);
59
+ case 'PutRecords':
60
+ return this.putRecords(req, res);
61
+ case 'GetRecords':
62
+ return this.getRecords(req, res);
63
+ case 'GetShardIterator':
64
+ return this.getShardIterator(req, res);
65
+ case 'RegisterStreamConsumer':
66
+ return this.registerStreamConsumer(req, res);
67
+ case 'DescribeStreamConsumer':
68
+ return this.describeStreamConsumer(req, res);
69
+ case 'ListStreamConsumers':
70
+ return this.listStreamConsumers(req, res);
71
+ default:
72
+ res.status(400).json({ __type: 'UnknownAction', message: `Unknown action: ${action}` });
73
+ }
74
+ } catch (error) {
75
+ res.status(400).json({ __type: 'InternalFailure', message: error.message });
76
+ }
77
+ });
78
+
79
+ // Health check
80
+ this.app.get('/health', (req, res) => {
81
+ res.json({
82
+ status: 'healthy',
83
+ service: 'kinesis-data-streams',
84
+ port: this.port,
85
+ stats: this.simulator.getStats()
86
+ });
87
+ });
88
+ }
89
+
90
+ async createStream(req, res) {
91
+ const { StreamName, ShardCount = 1, StreamModeDetails } = req.body;
92
+
93
+ if (!StreamName) {
94
+ throw new Error('StreamName is required');
95
+ }
96
+
97
+ const result = await this.simulator.createStream(StreamName, {
98
+ shardCount: ShardCount,
99
+ streamMode: StreamModeDetails?.StreamMode || 'PROVISIONED'
100
+ });
101
+
102
+ res.status(201).json(result);
103
+ }
104
+
105
+ async describeStream(req, res) {
106
+ const { StreamName } = req.body;
107
+
108
+ if (!StreamName) {
109
+ throw new Error('StreamName is required');
110
+ }
111
+
112
+ const result = this.simulator.describeStream(StreamName);
113
+ res.json(result);
114
+ }
115
+
116
+ async listStreams(req, res) {
117
+ const { Limit, ExclusiveStartStreamName } = req.body;
118
+
119
+ const result = this.simulator.listStreams({
120
+ Limit,
121
+ ExclusiveStartStreamName
122
+ });
123
+
124
+ res.json(result);
125
+ }
126
+
127
+ async deleteStream(req, res) {
128
+ const { StreamName } = req.body;
129
+
130
+ if (!StreamName) {
131
+ throw new Error('StreamName is required');
132
+ }
133
+
134
+ const result = await this.simulator.deleteStream(StreamName);
135
+ res.json(result);
136
+ }
137
+
138
+ async putRecord(req, res) {
139
+ const { StreamName, Data, PartitionKey, ExplicitHashKey } = req.body;
140
+
141
+ if (!StreamName || !Data || !PartitionKey) {
142
+ throw new Error('StreamName, Data, and PartitionKey are required');
143
+ }
144
+
145
+ const result = await this.simulator.putRecord(StreamName, Data, PartitionKey, {
146
+ explicitHashKey: ExplicitHashKey
147
+ });
148
+
149
+ res.json(result);
150
+ }
151
+
152
+ async putRecords(req, res) {
153
+ const { StreamName, Records } = req.body;
154
+
155
+ if (!StreamName || !Records || !Array.isArray(Records)) {
156
+ throw new Error('StreamName and Records array are required');
157
+ }
158
+
159
+ const result = await this.simulator.putRecords(StreamName, Records);
160
+ res.json(result);
161
+ }
162
+
163
+ async getRecords(req, res) {
164
+ const { ShardIterator, Limit } = req.body;
165
+
166
+ if (!ShardIterator) {
167
+ throw new Error('ShardIterator is required');
168
+ }
169
+
170
+ const result = this.simulator.getRecords(ShardIterator, { Limit });
171
+ res.json(result);
172
+ }
173
+
174
+ async getShardIterator(req, res) {
175
+ const { StreamName, ShardId, ShardIteratorType, StartingSequenceNumber, Timestamp } = req.body;
176
+
177
+ if (!StreamName || !ShardId || !ShardIteratorType) {
178
+ throw new Error('StreamName, ShardId, and ShardIteratorType are required');
179
+ }
180
+
181
+ const result = this.simulator.getSharIterator(StreamName, ShardId, ShardIteratorType, {
182
+ StartingSequenceNumber,
183
+ Timestamp
184
+ });
185
+
186
+ res.json(result);
187
+ }
188
+
189
+ async registerStreamConsumer(req, res) {
190
+ const { StreamArn, ConsumerName } = req.body;
191
+
192
+ if (!StreamArn || !ConsumerName) {
193
+ throw new Error('StreamArn and ConsumerName are required');
194
+ }
195
+
196
+ const result = this.simulator.registerStreamConsumer(StreamArn, ConsumerName);
197
+ res.status(201).json(result);
198
+ }
199
+
200
+ async describeStreamConsumer(req, res) {
201
+ const { ConsumerArn } = req.body;
202
+
203
+ if (!ConsumerArn) {
204
+ throw new Error('ConsumerArn is required');
205
+ }
206
+
207
+ const result = this.simulator.describeStreamConsumer(ConsumerArn);
208
+ res.json(result);
209
+ }
210
+
211
+ async listStreamConsumers(req, res) {
212
+ const { StreamArn } = req.body;
213
+
214
+ if (!StreamArn) {
215
+ throw new Error('StreamArn is required');
216
+ }
217
+
218
+ const result = this.simulator.listStreamConsumers(StreamArn);
219
+ res.json(result);
220
+ }
221
+
222
+ async start() {
223
+ return new Promise((resolve, reject) => {
224
+ try {
225
+ this.server = this.app.listen(this.port, () => {
226
+ logger.info(`✅ Kinesis Data Streams Server iniciado na porta ${this.port}`);
227
+ resolve();
228
+ });
229
+ } catch (error) {
230
+ logger.error(`❌ Erro ao iniciar Kinesis Data Streams Server: ${error.message}`);
231
+ reject(error);
232
+ }
233
+ });
234
+ }
235
+
236
+ async stop() {
237
+ return new Promise((resolve, reject) => {
238
+ if (this.server) {
239
+ this.server.close((err) => {
240
+ if (err) {
241
+ logger.error(`Erro ao parar Kinesis Data Streams Server: ${err.message}`);
242
+ reject(err);
243
+ } else {
244
+ logger.info('Kinesis Data Streams Server parado');
245
+ resolve();
246
+ }
247
+ });
248
+ } else {
249
+ resolve();
250
+ }
251
+ });
252
+ }
253
+ }
254
+
255
+ module.exports = KinesisDataStreamsServer;