local-serverless-stack 0.6.0 → 0.9.0

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 (257) hide show
  1. package/CHANGELOG.md +104 -0
  2. package/README.md +261 -583
  3. package/bin/cli.js +31 -3
  4. package/dist/client/types.d.ts +4 -0
  5. package/dist/client/types.d.ts.map +1 -1
  6. package/dist/server/engine/aoss-sidecar.d.ts +13 -0
  7. package/dist/server/engine/aoss-sidecar.d.ts.map +1 -0
  8. package/dist/server/engine/aoss-sidecar.js +93 -0
  9. package/dist/server/engine/aoss-sidecar.js.map +1 -0
  10. package/dist/server/engine/backends/localstack-backend.d.ts +25 -0
  11. package/dist/server/engine/backends/localstack-backend.d.ts.map +1 -0
  12. package/dist/server/engine/backends/localstack-backend.js +199 -0
  13. package/dist/server/engine/backends/localstack-backend.js.map +1 -0
  14. package/dist/server/engine/backends/self-backend.d.ts +32 -0
  15. package/dist/server/engine/backends/self-backend.d.ts.map +1 -0
  16. package/dist/server/engine/backends/self-backend.js +207 -0
  17. package/dist/server/engine/backends/self-backend.js.map +1 -0
  18. package/dist/server/engine/bus.d.ts +10 -0
  19. package/dist/server/engine/bus.d.ts.map +1 -0
  20. package/dist/server/engine/bus.js +24 -0
  21. package/dist/server/engine/bus.js.map +1 -0
  22. package/dist/server/engine/dispatch/dispatcher.d.ts +46 -0
  23. package/dist/server/engine/dispatch/dispatcher.d.ts.map +1 -0
  24. package/dist/server/engine/dispatch/dispatcher.js +312 -0
  25. package/dist/server/engine/dispatch/dispatcher.js.map +1 -0
  26. package/dist/server/engine/dispatch/scheduler.d.ts +47 -0
  27. package/dist/server/engine/dispatch/scheduler.d.ts.map +1 -0
  28. package/dist/server/engine/dispatch/scheduler.js +328 -0
  29. package/dist/server/engine/dispatch/scheduler.js.map +1 -0
  30. package/dist/server/engine/dispatch/sqs-poller.d.ts +25 -0
  31. package/dist/server/engine/dispatch/sqs-poller.d.ts.map +1 -0
  32. package/dist/server/engine/dispatch/sqs-poller.js +242 -0
  33. package/dist/server/engine/dispatch/sqs-poller.js.map +1 -0
  34. package/dist/server/engine/dispatch/stream-tailer.d.ts +22 -0
  35. package/dist/server/engine/dispatch/stream-tailer.d.ts.map +1 -0
  36. package/dist/server/engine/dispatch/stream-tailer.js +205 -0
  37. package/dist/server/engine/dispatch/stream-tailer.js.map +1 -0
  38. package/dist/server/engine/emulators/dynamodb/expressions/decimal.d.ts +5 -0
  39. package/dist/server/engine/emulators/dynamodb/expressions/decimal.d.ts.map +1 -0
  40. package/dist/server/engine/emulators/dynamodb/expressions/decimal.js +91 -0
  41. package/dist/server/engine/emulators/dynamodb/expressions/decimal.js.map +1 -0
  42. package/dist/server/engine/emulators/dynamodb/expressions/evaluate.d.ts +24 -0
  43. package/dist/server/engine/emulators/dynamodb/expressions/evaluate.d.ts.map +1 -0
  44. package/dist/server/engine/emulators/dynamodb/expressions/evaluate.js +183 -0
  45. package/dist/server/engine/emulators/dynamodb/expressions/evaluate.js.map +1 -0
  46. package/dist/server/engine/emulators/dynamodb/expressions/expression-types.d.ts +29 -0
  47. package/dist/server/engine/emulators/dynamodb/expressions/expression-types.d.ts.map +1 -0
  48. package/dist/server/engine/emulators/dynamodb/expressions/expression-types.js +12 -0
  49. package/dist/server/engine/emulators/dynamodb/expressions/expression-types.js.map +1 -0
  50. package/dist/server/engine/emulators/dynamodb/expressions/index.d.ts +13 -0
  51. package/dist/server/engine/emulators/dynamodb/expressions/index.d.ts.map +1 -0
  52. package/dist/server/engine/emulators/dynamodb/expressions/index.js +244 -0
  53. package/dist/server/engine/emulators/dynamodb/expressions/index.js.map +1 -0
  54. package/dist/server/engine/emulators/dynamodb/expressions/lexer.d.ts +11 -0
  55. package/dist/server/engine/emulators/dynamodb/expressions/lexer.d.ts.map +1 -0
  56. package/dist/server/engine/emulators/dynamodb/expressions/lexer.js +109 -0
  57. package/dist/server/engine/emulators/dynamodb/expressions/lexer.js.map +1 -0
  58. package/dist/server/engine/emulators/dynamodb/expressions/parser.d.ts +23 -0
  59. package/dist/server/engine/emulators/dynamodb/expressions/parser.d.ts.map +1 -0
  60. package/dist/server/engine/emulators/dynamodb/expressions/parser.js +541 -0
  61. package/dist/server/engine/emulators/dynamodb/expressions/parser.js.map +1 -0
  62. package/dist/server/engine/emulators/dynamodb/index.d.ts +46 -0
  63. package/dist/server/engine/emulators/dynamodb/index.d.ts.map +1 -0
  64. package/dist/server/engine/emulators/dynamodb/index.js +572 -0
  65. package/dist/server/engine/emulators/dynamodb/index.js.map +1 -0
  66. package/dist/server/engine/emulators/dynamodb/query.d.ts +12 -0
  67. package/dist/server/engine/emulators/dynamodb/query.d.ts.map +1 -0
  68. package/dist/server/engine/emulators/dynamodb/query.js +237 -0
  69. package/dist/server/engine/emulators/dynamodb/query.js.map +1 -0
  70. package/dist/server/engine/emulators/dynamodb/schema.d.ts +58 -0
  71. package/dist/server/engine/emulators/dynamodb/schema.d.ts.map +1 -0
  72. package/dist/server/engine/emulators/dynamodb/schema.js +284 -0
  73. package/dist/server/engine/emulators/dynamodb/schema.js.map +1 -0
  74. package/dist/server/engine/emulators/dynamodb/streams.d.ts +28 -0
  75. package/dist/server/engine/emulators/dynamodb/streams.d.ts.map +1 -0
  76. package/dist/server/engine/emulators/dynamodb/streams.js +100 -0
  77. package/dist/server/engine/emulators/dynamodb/streams.js.map +1 -0
  78. package/dist/server/engine/emulators/events/index.d.ts +53 -0
  79. package/dist/server/engine/emulators/events/index.d.ts.map +1 -0
  80. package/dist/server/engine/emulators/events/index.js +417 -0
  81. package/dist/server/engine/emulators/events/index.js.map +1 -0
  82. package/dist/server/engine/emulators/events/pattern.d.ts +3 -0
  83. package/dist/server/engine/emulators/events/pattern.d.ts.map +1 -0
  84. package/dist/server/engine/emulators/events/pattern.js +125 -0
  85. package/dist/server/engine/emulators/events/pattern.js.map +1 -0
  86. package/dist/server/engine/emulators/lambda-ctl/index.d.ts +55 -0
  87. package/dist/server/engine/emulators/lambda-ctl/index.d.ts.map +1 -0
  88. package/dist/server/engine/emulators/lambda-ctl/index.js +461 -0
  89. package/dist/server/engine/emulators/lambda-ctl/index.js.map +1 -0
  90. package/dist/server/engine/emulators/opensearch/index.d.ts +67 -0
  91. package/dist/server/engine/emulators/opensearch/index.d.ts.map +1 -0
  92. package/dist/server/engine/emulators/opensearch/index.js +811 -0
  93. package/dist/server/engine/emulators/opensearch/index.js.map +1 -0
  94. package/dist/server/engine/emulators/opensearch/search.d.ts +17 -0
  95. package/dist/server/engine/emulators/opensearch/search.d.ts.map +1 -0
  96. package/dist/server/engine/emulators/opensearch/search.js +434 -0
  97. package/dist/server/engine/emulators/opensearch/search.js.map +1 -0
  98. package/dist/server/engine/emulators/s3/index.d.ts +45 -0
  99. package/dist/server/engine/emulators/s3/index.d.ts.map +1 -0
  100. package/dist/server/engine/emulators/s3/index.js +591 -0
  101. package/dist/server/engine/emulators/s3/index.js.map +1 -0
  102. package/dist/server/engine/emulators/sns/index.d.ts +22 -0
  103. package/dist/server/engine/emulators/sns/index.d.ts.map +1 -0
  104. package/dist/server/engine/emulators/sns/index.js +135 -0
  105. package/dist/server/engine/emulators/sns/index.js.map +1 -0
  106. package/dist/server/engine/emulators/sqs/index.d.ts +66 -0
  107. package/dist/server/engine/emulators/sqs/index.d.ts.map +1 -0
  108. package/dist/server/engine/emulators/sqs/index.js +552 -0
  109. package/dist/server/engine/emulators/sqs/index.js.map +1 -0
  110. package/dist/server/engine/emulators/sqs/md5.d.ts +8 -0
  111. package/dist/server/engine/emulators/sqs/md5.d.ts.map +1 -0
  112. package/dist/server/engine/emulators/sqs/md5.js +36 -0
  113. package/dist/server/engine/emulators/sqs/md5.js.map +1 -0
  114. package/dist/server/engine/emulators/sqs/queue.d.ts +105 -0
  115. package/dist/server/engine/emulators/sqs/queue.d.ts.map +1 -0
  116. package/dist/server/engine/emulators/sqs/queue.js +371 -0
  117. package/dist/server/engine/emulators/sqs/queue.js.map +1 -0
  118. package/dist/server/engine/emulators/sts.d.ts +8 -0
  119. package/dist/server/engine/emulators/sts.d.ts.map +1 -0
  120. package/dist/server/engine/emulators/sts.js +23 -0
  121. package/dist/server/engine/emulators/sts.js.map +1 -0
  122. package/dist/server/engine/engine-backend.d.ts +17 -0
  123. package/dist/server/engine/engine-backend.d.ts.map +1 -0
  124. package/dist/server/engine/engine-backend.js +7 -0
  125. package/dist/server/engine/engine-backend.js.map +1 -0
  126. package/dist/server/engine/engine-manager.d.ts +22 -0
  127. package/dist/server/engine/engine-manager.d.ts.map +1 -0
  128. package/dist/server/engine/engine-manager.js +74 -0
  129. package/dist/server/engine/engine-manager.js.map +1 -0
  130. package/dist/server/engine/http/aws-chunked.d.ts +3 -0
  131. package/dist/server/engine/http/aws-chunked.d.ts.map +1 -0
  132. package/dist/server/engine/http/aws-chunked.js +50 -0
  133. package/dist/server/engine/http/aws-chunked.js.map +1 -0
  134. package/dist/server/engine/http/errors.d.ts +20 -0
  135. package/dist/server/engine/http/errors.d.ts.map +1 -0
  136. package/dist/server/engine/http/errors.js +43 -0
  137. package/dist/server/engine/http/errors.js.map +1 -0
  138. package/dist/server/engine/http/protocols/aws-json.d.ts +8 -0
  139. package/dist/server/engine/http/protocols/aws-json.d.ts.map +1 -0
  140. package/dist/server/engine/http/protocols/aws-json.js +42 -0
  141. package/dist/server/engine/http/protocols/aws-json.js.map +1 -0
  142. package/dist/server/engine/http/protocols/query-xml.d.ts +7 -0
  143. package/dist/server/engine/http/protocols/query-xml.d.ts.map +1 -0
  144. package/dist/server/engine/http/protocols/query-xml.js +35 -0
  145. package/dist/server/engine/http/protocols/query-xml.js.map +1 -0
  146. package/dist/server/engine/http/router.d.ts +8 -0
  147. package/dist/server/engine/http/router.d.ts.map +1 -0
  148. package/dist/server/engine/http/router.js +402 -0
  149. package/dist/server/engine/http/router.js.map +1 -0
  150. package/dist/server/engine/http/sigv4.d.ts +9 -0
  151. package/dist/server/engine/http/sigv4.d.ts.map +1 -0
  152. package/dist/server/engine/http/sigv4.js +33 -0
  153. package/dist/server/engine/http/sigv4.js.map +1 -0
  154. package/dist/server/engine/http/xml.d.ts +16 -0
  155. package/dist/server/engine/http/xml.d.ts.map +1 -0
  156. package/dist/server/engine/http/xml.js +92 -0
  157. package/dist/server/engine/http/xml.js.map +1 -0
  158. package/dist/server/engine/store/atomic.d.ts +4 -0
  159. package/dist/server/engine/store/atomic.d.ts.map +1 -0
  160. package/dist/server/engine/store/atomic.js +35 -0
  161. package/dist/server/engine/store/atomic.js.map +1 -0
  162. package/dist/server/engine/store/engine-store.d.ts +9 -0
  163. package/dist/server/engine/store/engine-store.d.ts.map +1 -0
  164. package/dist/server/engine/store/engine-store.js +218 -0
  165. package/dist/server/engine/store/engine-store.js.map +1 -0
  166. package/dist/server/engine/store/store-types.d.ts +37 -0
  167. package/dist/server/engine/store/store-types.d.ts.map +1 -0
  168. package/dist/server/engine/store/store-types.js +17 -0
  169. package/dist/server/engine/store/store-types.js.map +1 -0
  170. package/dist/server/engine/store/wal.d.ts +49 -0
  171. package/dist/server/engine/store/wal.d.ts.map +1 -0
  172. package/dist/server/engine/store/wal.js +328 -0
  173. package/dist/server/engine/store/wal.js.map +1 -0
  174. package/dist/server/engine/types.d.ts +137 -0
  175. package/dist/server/engine/types.d.ts.map +1 -0
  176. package/dist/server/engine/types.js +8 -0
  177. package/dist/server/engine/types.js.map +1 -0
  178. package/dist/server/index.js +43 -9
  179. package/dist/server/index.js.map +1 -1
  180. package/dist/server/routes/config.d.ts.map +1 -1
  181. package/dist/server/routes/config.js +16 -0
  182. package/dist/server/routes/config.js.map +1 -1
  183. package/dist/server/routes/opensearch.d.ts +3 -0
  184. package/dist/server/routes/opensearch.d.ts.map +1 -0
  185. package/dist/server/routes/opensearch.js +69 -0
  186. package/dist/server/routes/opensearch.js.map +1 -0
  187. package/dist/server/routes/resources.d.ts.map +1 -1
  188. package/dist/server/routes/resources.js +4 -1
  189. package/dist/server/routes/resources.js.map +1 -1
  190. package/dist/server/routes/services.d.ts.map +1 -1
  191. package/dist/server/routes/services.js +3 -0
  192. package/dist/server/routes/services.js.map +1 -1
  193. package/dist/server/services/cache-manager.d.ts +2 -1
  194. package/dist/server/services/cache-manager.d.ts.map +1 -1
  195. package/dist/server/services/cache-manager.js +22 -2
  196. package/dist/server/services/cache-manager.js.map +1 -1
  197. package/dist/server/services/cloudformation-parser.d.ts +35 -2
  198. package/dist/server/services/cloudformation-parser.d.ts.map +1 -1
  199. package/dist/server/services/cloudformation-parser.js +88 -3
  200. package/dist/server/services/cloudformation-parser.js.map +1 -1
  201. package/dist/server/services/config-manager.d.ts +82 -0
  202. package/dist/server/services/config-manager.d.ts.map +1 -1
  203. package/dist/server/services/config-manager.js +151 -7
  204. package/dist/server/services/config-manager.js.map +1 -1
  205. package/dist/server/services/gateway-manager.d.ts +2 -0
  206. package/dist/server/services/gateway-manager.d.ts.map +1 -1
  207. package/dist/server/services/gateway-manager.js +44 -6
  208. package/dist/server/services/gateway-manager.js.map +1 -1
  209. package/dist/server/services/localstack-manager.d.ts +0 -7
  210. package/dist/server/services/localstack-manager.d.ts.map +1 -1
  211. package/dist/server/services/localstack-manager.js +11 -173
  212. package/dist/server/services/localstack-manager.js.map +1 -1
  213. package/dist/server/services/opensearch-explorer.d.ts +37 -0
  214. package/dist/server/services/opensearch-explorer.d.ts.map +1 -0
  215. package/dist/server/services/opensearch-explorer.js +124 -0
  216. package/dist/server/services/opensearch-explorer.js.map +1 -0
  217. package/dist/server/services/resource-provisioner.d.ts +13 -0
  218. package/dist/server/services/resource-provisioner.d.ts.map +1 -1
  219. package/dist/server/services/resource-provisioner.js +257 -11
  220. package/dist/server/services/resource-provisioner.js.map +1 -1
  221. package/dist/server/services/service-registrar.d.ts +1 -0
  222. package/dist/server/services/service-registrar.d.ts.map +1 -1
  223. package/dist/server/services/service-registrar.js +19 -4
  224. package/dist/server/services/service-registrar.js.map +1 -1
  225. package/dist/ui/assets/ApisPage-C0xaNFQW.js +1 -0
  226. package/dist/ui/assets/BucketDetailPage-Bnny8S04.js +1 -0
  227. package/dist/ui/assets/BucketsPage-Dd3Y4-gU.js +1 -0
  228. package/dist/ui/assets/{DynamoPage-B1__Rjr2.js → DynamoPage-JzSF-4VI.js} +1 -1
  229. package/dist/ui/assets/DynamoTablePage-uM0DXGCo.js +3 -0
  230. package/dist/ui/assets/LambdaDetailPage-CoR9ZXdb.js +4 -0
  231. package/dist/ui/assets/LambdasPage-CNMX_O5P.js +1 -0
  232. package/dist/ui/assets/OpenSearchCollectionPage-D5FaSCF1.js +1 -0
  233. package/dist/ui/assets/OpenSearchPage-FEzLxaej.js +1 -0
  234. package/dist/ui/assets/OverviewPage-0xvjT7Q0.js +1 -0
  235. package/dist/ui/assets/OverviewPage-qEl0a-0B.css +1 -0
  236. package/dist/ui/assets/QueueDetailPage-B2GaNLLe.js +1 -0
  237. package/dist/ui/assets/QueuesPage-Ch5kGwrp.js +1 -0
  238. package/dist/ui/assets/ServiceDetailPage-DKiz21oo.js +2 -0
  239. package/dist/ui/assets/ServicesPage-Cmi3UIfM.js +2 -0
  240. package/dist/ui/assets/index-DH7RTkRh.css +1 -0
  241. package/dist/ui/assets/index-MF9fVrsr.js +37 -0
  242. package/dist/ui/index.html +2 -2
  243. package/package.json +3 -1
  244. package/dist/ui/assets/ApisPage-DdgKjEdS.js +0 -1
  245. package/dist/ui/assets/BucketDetailPage-DZQGxm0y.js +0 -1
  246. package/dist/ui/assets/BucketsPage-xYXzxCvd.js +0 -1
  247. package/dist/ui/assets/DynamoTablePage-BCoxPdXW.js +0 -3
  248. package/dist/ui/assets/LambdaDetailPage-B85CA8tb.js +0 -4
  249. package/dist/ui/assets/LambdasPage-_TtxQMT_.js +0 -1
  250. package/dist/ui/assets/OverviewPage-6jDXV1jr.css +0 -1
  251. package/dist/ui/assets/OverviewPage-CqTKTY64.js +0 -1
  252. package/dist/ui/assets/QueueDetailPage-BOr_sImA.js +0 -1
  253. package/dist/ui/assets/QueuesPage-DpByfcM5.js +0 -1
  254. package/dist/ui/assets/ServiceDetailPage-DsWgV-ad.js +0 -2
  255. package/dist/ui/assets/ServicesPage-CGlpsj98.js +0 -2
  256. package/dist/ui/assets/index-BWlB542w.js +0 -36
  257. package/dist/ui/assets/index-EYnsoJOq.css +0 -1
@@ -0,0 +1,28 @@
1
+ import type { AttributeMap, EngineContext } from '../../types.js';
2
+ import type { TableRecord } from './schema.js';
3
+ export type StreamEventName = 'INSERT' | 'MODIFY' | 'REMOVE';
4
+ export interface StreamAppendInput {
5
+ eventName: StreamEventName;
6
+ keys: AttributeMap;
7
+ newImage?: AttributeMap;
8
+ oldImage?: AttributeMap;
9
+ userIdentity?: {
10
+ type: string;
11
+ principalId: string;
12
+ };
13
+ }
14
+ export declare class DynamoStreams {
15
+ private readonly ctx;
16
+ private readonly states;
17
+ constructor(ctx: EngineContext);
18
+ private stateKey;
19
+ ensureRegistered(region: string, record: TableRecord): void;
20
+ unregister(region: string, tableName: string): void;
21
+ getStreamArn(region: string, tableName: string): string | undefined;
22
+ append(region: string, tableName: string, input: StreamAppendInput): void;
23
+ read(region: string, tableName: string, afterSeq: string | undefined, limit: number): {
24
+ records: unknown[];
25
+ lastSeq: string | undefined;
26
+ };
27
+ }
28
+ //# sourceMappingURL=streams.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"streams.d.ts","sourceRoot":"","sources":["../../../../../src/server/engine/emulators/dynamodb/streams.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAClE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAM/C,MAAM,MAAM,eAAe,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAE7D,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,eAAe,CAAC;IAC3B,IAAI,EAAE,YAAY,CAAC;IACnB,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,QAAQ,CAAC,EAAE,YAAY,CAAC;IAExB,YAAY,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;CACtD;AA4BD,qBAAa,aAAa;IAGZ,OAAO,CAAC,QAAQ,CAAC,GAAG;IAFhC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkC;gBAE5B,GAAG,EAAE,aAAa;IAE/C,OAAO,CAAC,QAAQ;IAMhB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,IAAI;IAY3D,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI;IAInD,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAKnE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,iBAAiB,GAAG,IAAI;IAsCzE,IAAI,CACF,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,KAAK,EAAE,MAAM,GACZ;QAAE,OAAO,EAAE,OAAO,EAAE,CAAC;QAAC,OAAO,EAAE,MAAM,GAAG,SAAS,CAAA;KAAE;CAgBvD"}
@@ -0,0 +1,100 @@
1
+ // Per-table DynamoDB change streams: an in-memory ring buffer (1000 records
2
+ // per table, the local stand-in for the 24 h retention window) plus the read
3
+ // API the dispatcher's stream tailer consumes. Rings are memory-only — after
4
+ // an engine restart the ring is empty and sequence numbers restart at 1,
5
+ // which for a dev tool is an acceptable TRIM_HORIZON.
6
+ import crypto from 'crypto';
7
+ import { itemSizeBytes, streamArnFor } from './schema.js';
8
+ const MAX_RECORDS_PER_TABLE = 1000;
9
+ const SEQUENCE_PAD = 21;
10
+ export class DynamoStreams {
11
+ ctx;
12
+ states = new Map();
13
+ constructor(ctx) {
14
+ this.ctx = ctx;
15
+ }
16
+ stateKey(region, tableName) {
17
+ return `${region}/${tableName}`;
18
+ }
19
+ // Idempotent: called every time table metadata is touched, so streams come
20
+ // back after a restart as soon as the region catalog is loaded.
21
+ ensureRegistered(region, record) {
22
+ if (record.streamSpecification?.StreamEnabled !== true || !record.latestStreamLabel)
23
+ return;
24
+ const key = this.stateKey(region, record.tableName);
25
+ if (this.states.has(key))
26
+ return;
27
+ this.states.set(key, {
28
+ arn: streamArnFor(this.ctx.config.account, region, record),
29
+ viewType: record.streamSpecification.StreamViewType,
30
+ nextSeq: 1,
31
+ records: [],
32
+ });
33
+ }
34
+ unregister(region, tableName) {
35
+ this.states.delete(this.stateKey(region, tableName));
36
+ }
37
+ getStreamArn(region, tableName) {
38
+ return this.states.get(this.stateKey(region, tableName))?.arn;
39
+ }
40
+ // Appends one committed write. No-op for tables without an enabled stream.
41
+ append(region, tableName, input) {
42
+ const state = this.states.get(this.stateKey(region, tableName));
43
+ if (!state)
44
+ return;
45
+ const sequenceNumber = String(state.nextSeq++).padStart(SEQUENCE_PAD, '0');
46
+ const record = {
47
+ eventID: crypto.randomUUID(),
48
+ eventName: input.eventName,
49
+ eventVersion: '1.1',
50
+ eventSource: 'aws:dynamodb',
51
+ awsRegion: region,
52
+ dynamodb: {
53
+ ApproximateCreationDateTime: Math.floor(Date.now() / 1000),
54
+ Keys: structuredClone(input.keys),
55
+ SequenceNumber: sequenceNumber,
56
+ SizeBytes: 0,
57
+ StreamViewType: state.viewType,
58
+ },
59
+ eventSourceARN: state.arn,
60
+ };
61
+ if (input.newImage && (state.viewType === 'NEW_IMAGE' || state.viewType === 'NEW_AND_OLD_IMAGES')) {
62
+ record.dynamodb.NewImage = structuredClone(input.newImage);
63
+ }
64
+ if (input.oldImage && (state.viewType === 'OLD_IMAGE' || state.viewType === 'NEW_AND_OLD_IMAGES')) {
65
+ record.dynamodb.OldImage = structuredClone(input.oldImage);
66
+ }
67
+ record.dynamodb.SizeBytes = itemSizeBytes(record.dynamodb.Keys)
68
+ + (record.dynamodb.NewImage ? itemSizeBytes(record.dynamodb.NewImage) : 0)
69
+ + (record.dynamodb.OldImage ? itemSizeBytes(record.dynamodb.OldImage) : 0)
70
+ + sequenceNumber.length;
71
+ if (input.userIdentity)
72
+ record.userIdentity = input.userIdentity;
73
+ state.records.push(record);
74
+ if (state.records.length > MAX_RECORDS_PER_TABLE)
75
+ state.records.shift();
76
+ this.ctx.bus.emit('dynamo:stream-appended', { region, tableName });
77
+ }
78
+ // afterSeq undefined starts at TRIM_HORIZON (oldest retained record).
79
+ // lastSeq is the SequenceNumber of the last returned record — undefined
80
+ // when nothing was returned, so the caller keeps its previous cursor.
81
+ read(region, tableName, afterSeq, limit) {
82
+ const state = this.states.get(this.stateKey(region, tableName));
83
+ if (!state || limit < 1)
84
+ return { records: [], lastSeq: undefined };
85
+ let startIndex = 0;
86
+ if (afterSeq !== undefined) {
87
+ // Sequence numbers are fixed-width, so string comparison is numeric.
88
+ startIndex = state.records.findIndex((r) => r.dynamodb.SequenceNumber > afterSeq);
89
+ if (startIndex === -1)
90
+ return { records: [], lastSeq: undefined };
91
+ }
92
+ const slice = state.records.slice(startIndex, startIndex + limit);
93
+ const last = slice[slice.length - 1];
94
+ return {
95
+ records: slice.map((r) => structuredClone(r)),
96
+ lastSeq: last?.dynamodb.SequenceNumber,
97
+ };
98
+ }
99
+ }
100
+ //# sourceMappingURL=streams.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"streams.js","sourceRoot":"","sources":["../../../../../src/server/engine/emulators/dynamodb/streams.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ import type { AwsRequest, EngineContext, EngineServiceName, EventRuleTarget, TargetEmulator } from '../../types.js';
2
+ export interface EventBusRecord {
3
+ name: string;
4
+ }
5
+ export interface EventRuleRecord {
6
+ name: string;
7
+ busName: string;
8
+ eventPattern?: string;
9
+ scheduleExpression?: string;
10
+ state: 'ENABLED' | 'DISABLED';
11
+ targets: EventRuleTarget[];
12
+ }
13
+ export interface ScheduleRuleView {
14
+ busName: string;
15
+ ruleName: string;
16
+ scheduleExpression: string;
17
+ state: 'ENABLED' | 'DISABLED';
18
+ targets: EventRuleTarget[];
19
+ }
20
+ export declare class EventsEmulator implements TargetEmulator {
21
+ readonly service: EngineServiceName;
22
+ readonly targetPrefix = "AWSEvents";
23
+ readonly jsonVersion: "1.1";
24
+ private ctx;
25
+ private readonly rulesChangedListeners;
26
+ constructor(ctx: EngineContext);
27
+ onRulesChanged(cb: (region: string) => void): void;
28
+ private fireRulesChanged;
29
+ handle(operation: string, input: Record<string, unknown>, req: AwsRequest): Promise<object>;
30
+ listScheduleRules(region: string): Promise<ScheduleRuleView[]>;
31
+ private createEventBus;
32
+ private deleteEventBus;
33
+ private describeEventBus;
34
+ private listEventBuses;
35
+ private putRule;
36
+ private assertPatternSupported;
37
+ private deleteRule;
38
+ private setRuleState;
39
+ private putTargets;
40
+ private removeTargets;
41
+ private listRules;
42
+ private listTargetsByRule;
43
+ private putEvents;
44
+ private putOneEvent;
45
+ private buses;
46
+ private rules;
47
+ private resolveBusName;
48
+ private assertBusExists;
49
+ private ruleNotFound;
50
+ private busArn;
51
+ private ruleArn;
52
+ }
53
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/server/engine/emulators/events/index.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EACV,UAAU,EACV,aAAa,EACb,iBAAiB,EACjB,eAAe,EACf,cAAc,EACf,MAAM,gBAAgB,CAAC;AAOxB,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,KAAK,EAAE,SAAS,GAAG,UAAU,CAAC;IAC9B,OAAO,EAAE,eAAe,EAAE,CAAC;CAC5B;AAGD,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,KAAK,EAAE,SAAS,GAAG,UAAU,CAAC;IAC9B,OAAO,EAAE,eAAe,EAAE,CAAC;CAC5B;AAQD,qBAAa,cAAe,YAAW,cAAc;IACnD,QAAQ,CAAC,OAAO,EAAE,iBAAiB,CAAY;IAC/C,QAAQ,CAAC,YAAY,eAAe;IACpC,QAAQ,CAAC,WAAW,EAAG,KAAK,CAAU;IAEtC,OAAO,CAAC,GAAG,CAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAuC;gBAEjE,GAAG,EAAE,aAAa;IAO9B,cAAc,CAAC,EAAE,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI;IAIlD,OAAO,CAAC,gBAAgB;IAUlB,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC;IAqB3F,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC;YAiBtD,cAAc;YAUd,cAAc;YAoBd,gBAAgB;YAMhB,cAAc;YAad,OAAO;IAuCrB,OAAO,CAAC,sBAAsB;YAsBhB,UAAU;YAgBV,YAAY;YAWZ,UAAU;YA0BV,aAAa;YAeb,SAAS;YAmBT,iBAAiB;YAoBjB,SAAS;IAiBvB,OAAO,CAAC,WAAW;YA4DL,KAAK;YAML,KAAK;IAOnB,OAAO,CAAC,cAAc;YAMR,eAAe;IAQ7B,OAAO,CAAC,YAAY;IAKpB,OAAO,CAAC,MAAM;IAMd,OAAO,CAAC,OAAO;CAIhB"}
@@ -0,0 +1,417 @@
1
+ // EventBridge emulator (JSON 1.1, X-Amz-Target "AWSEvents.<Operation>").
2
+ // Buses and rules are catalog metadata; PutEvents matches ENABLED pattern
3
+ // rules and emits 'events:rule-matched' on the engine bus — the dispatcher
4
+ // applies Input/InputPath per target and invokes. Delivered events are the
5
+ // canonical EventBridge envelope, never wrapped in Records.
6
+ //
7
+ // Fidelity anchors: resource-provisioner.ts (createEventBus/createEventRule/
8
+ // deleteEventRule idempotency error names, hand-built rule ARNs) and the
9
+ // self-hosted example (PutEvents per-entry results against a named bus).
10
+ import { randomUUID } from 'crypto';
11
+ import { AwsError, notImplemented } from '../../http/errors.js';
12
+ import { matches, validatePattern } from './pattern.js';
13
+ const DEFAULT_BUS = 'default';
14
+ export class EventsEmulator {
15
+ service = 'events';
16
+ targetPrefix = 'AWSEvents';
17
+ jsonVersion = '1.1';
18
+ ctx;
19
+ rulesChangedListeners = [];
20
+ constructor(ctx) {
21
+ this.ctx = ctx;
22
+ }
23
+ // Fired after every rule mutation (PutRule, DeleteRule, Enable/DisableRule,
24
+ // PutTargets, RemoveTargets and the cascade drop in DeleteEventBus) so the
25
+ // dispatcher's scheduler can resync without polling.
26
+ onRulesChanged(cb) {
27
+ this.rulesChangedListeners.push(cb);
28
+ }
29
+ fireRulesChanged(region) {
30
+ for (const listener of this.rulesChangedListeners) {
31
+ try {
32
+ listener(region);
33
+ }
34
+ catch (err) {
35
+ console.warn(`events: onRulesChanged listener failed: ${err instanceof Error ? err.message : String(err)}`);
36
+ }
37
+ }
38
+ }
39
+ async handle(operation, input, req) {
40
+ const region = req.region;
41
+ switch (operation) {
42
+ case 'CreateEventBus': return this.createEventBus(region, input);
43
+ case 'DeleteEventBus': return this.deleteEventBus(region, input);
44
+ case 'DescribeEventBus': return this.describeEventBus(region, input);
45
+ case 'ListEventBuses': return this.listEventBuses(region, input);
46
+ case 'PutRule': return this.putRule(region, input);
47
+ case 'DeleteRule': return this.deleteRule(region, input);
48
+ case 'EnableRule': return this.setRuleState(region, input, 'ENABLED');
49
+ case 'DisableRule': return this.setRuleState(region, input, 'DISABLED');
50
+ case 'PutTargets': return this.putTargets(region, input);
51
+ case 'RemoveTargets': return this.removeTargets(region, input);
52
+ case 'ListRules': return this.listRules(region, input);
53
+ case 'ListTargetsByRule': return this.listTargetsByRule(region, input);
54
+ case 'PutEvents': return this.putEvents(region, input);
55
+ default: throw notImplemented('events', operation);
56
+ }
57
+ }
58
+ // Rules with a ScheduleExpression, for the dispatcher's scheduler to (re)arm.
59
+ async listScheduleRules(region) {
60
+ const rules = await this.rules(region);
61
+ return rules.values()
62
+ .filter(rule => rule.scheduleExpression !== undefined)
63
+ .map(rule => ({
64
+ busName: rule.busName,
65
+ ruleName: rule.name,
66
+ scheduleExpression: rule.scheduleExpression,
67
+ state: rule.state,
68
+ targets: rule.targets,
69
+ }));
70
+ }
71
+ // -------------------------------------------------------------------------
72
+ // Buses
73
+ // -------------------------------------------------------------------------
74
+ async createEventBus(region, input) {
75
+ const name = requireString(input, 'Name');
76
+ const buses = await this.buses(region);
77
+ if (name === DEFAULT_BUS || buses.get(name)) {
78
+ throw new AwsError('ResourceAlreadyExistsException', `Event bus ${name} already exists.`);
79
+ }
80
+ buses.set(name, { name });
81
+ return { EventBusArn: this.busArn(region, name) };
82
+ }
83
+ async deleteEventBus(region, input) {
84
+ const name = requireString(input, 'Name');
85
+ if (name === DEFAULT_BUS) {
86
+ throw new AwsError('ValidationException', 'Cannot delete event bus default.');
87
+ }
88
+ const buses = await this.buses(region);
89
+ buses.delete(name);
90
+ // A bus takes its rules with it — orphan rules would silently match nothing.
91
+ const rules = await this.rules(region);
92
+ let droppedRules = false;
93
+ for (const key of rules.keys()) {
94
+ if (rules.get(key)?.busName === name) {
95
+ rules.delete(key);
96
+ droppedRules = true;
97
+ }
98
+ }
99
+ if (droppedRules)
100
+ this.fireRulesChanged(region);
101
+ return {};
102
+ }
103
+ async describeEventBus(region, input) {
104
+ const name = this.resolveBusName(input.EventBusName ?? input.Name);
105
+ await this.assertBusExists(region, name);
106
+ return { Name: name, Arn: this.busArn(region, name) };
107
+ }
108
+ async listEventBuses(region, input) {
109
+ const buses = await this.buses(region);
110
+ const prefix = typeof input.NamePrefix === 'string' ? input.NamePrefix : '';
111
+ const names = [DEFAULT_BUS, ...buses.values().map(bus => bus.name)]
112
+ .filter(name => name.startsWith(prefix))
113
+ .sort();
114
+ return { EventBuses: names.map(name => ({ Name: name, Arn: this.busArn(region, name) })) };
115
+ }
116
+ // -------------------------------------------------------------------------
117
+ // Rules and targets
118
+ // -------------------------------------------------------------------------
119
+ async putRule(region, input) {
120
+ const name = requireString(input, 'Name');
121
+ const busName = this.resolveBusName(input.EventBusName);
122
+ await this.assertBusExists(region, busName);
123
+ const eventPattern = typeof input.EventPattern === 'string' ? input.EventPattern : undefined;
124
+ const scheduleExpression = typeof input.ScheduleExpression === 'string' ? input.ScheduleExpression : undefined;
125
+ if (!eventPattern && !scheduleExpression) {
126
+ throw new AwsError('ValidationException', 'Parameter(s) EventPattern or ScheduleExpression must be specified.');
127
+ }
128
+ if (eventPattern)
129
+ this.assertPatternSupported(eventPattern);
130
+ if (scheduleExpression) {
131
+ if (busName !== DEFAULT_BUS) {
132
+ throw new AwsError('ValidationException', 'ScheduleExpression is supported only on the default event bus.');
133
+ }
134
+ if (!/^(rate|cron)\(.+\)$/.test(scheduleExpression)) {
135
+ throw new AwsError('ValidationException', 'Parameter ScheduleExpression is not valid.');
136
+ }
137
+ }
138
+ const rules = await this.rules(region);
139
+ const existing = rules.get(ruleKey(busName, name));
140
+ // Upsert semantics: an omitted State keeps the current state.
141
+ const state = String(input.State ?? existing?.state ?? 'ENABLED');
142
+ if (state !== 'ENABLED' && state !== 'DISABLED') {
143
+ throw new AwsError('ValidationException', `1 validation error detected: Value '${state}' at 'state' failed to satisfy constraint: Member must satisfy enum value set: [ENABLED, DISABLED]`);
144
+ }
145
+ rules.set(ruleKey(busName, name), {
146
+ name,
147
+ busName,
148
+ eventPattern,
149
+ scheduleExpression,
150
+ state,
151
+ targets: existing?.targets ?? [],
152
+ });
153
+ this.fireRulesChanged(region);
154
+ return { RuleArn: this.ruleArn(region, busName, name) };
155
+ }
156
+ assertPatternSupported(eventPattern) {
157
+ let parsed;
158
+ try {
159
+ parsed = JSON.parse(eventPattern);
160
+ }
161
+ catch {
162
+ throw new AwsError('InvalidEventPatternException', 'Event pattern is not valid. Reason: Invalid JSON');
163
+ }
164
+ let unsupported;
165
+ try {
166
+ unsupported = validatePattern(parsed);
167
+ }
168
+ catch (error) {
169
+ const reason = error instanceof Error ? error.message : String(error);
170
+ throw new AwsError('InvalidEventPatternException', `Event pattern is not valid. Reason: ${reason}`);
171
+ }
172
+ if (unsupported.length > 0) {
173
+ throw new AwsError('InvalidEventPatternException', `Event pattern is not valid. Reason: operator(s) not supported by the LSS self engine in v1: ${unsupported.join(', ')}`);
174
+ }
175
+ }
176
+ async deleteRule(region, input) {
177
+ const name = requireString(input, 'Name');
178
+ const busName = this.resolveBusName(input.EventBusName);
179
+ await this.assertBusExists(region, busName);
180
+ const rules = await this.rules(region);
181
+ const rule = rules.get(ruleKey(busName, name));
182
+ // Deleting an absent rule is a silent success, matching AWS.
183
+ if (!rule)
184
+ return {};
185
+ if (rule.targets.length > 0 && input.Force !== true) {
186
+ throw new AwsError('ValidationException', "Rule can't be deleted since it has targets.");
187
+ }
188
+ rules.delete(ruleKey(busName, name));
189
+ this.fireRulesChanged(region);
190
+ return {};
191
+ }
192
+ async setRuleState(region, input, state) {
193
+ const name = requireString(input, 'Name');
194
+ const busName = this.resolveBusName(input.EventBusName);
195
+ const rules = await this.rules(region);
196
+ const rule = rules.get(ruleKey(busName, name));
197
+ if (!rule)
198
+ throw this.ruleNotFound(name, busName);
199
+ rules.set(ruleKey(busName, name), { ...rule, state });
200
+ this.fireRulesChanged(region);
201
+ return {};
202
+ }
203
+ async putTargets(region, input) {
204
+ const name = requireString(input, 'Rule');
205
+ const busName = this.resolveBusName(input.EventBusName);
206
+ const rules = await this.rules(region);
207
+ const rule = rules.get(ruleKey(busName, name));
208
+ if (!rule)
209
+ throw this.ruleNotFound(name, busName);
210
+ const entries = requireArray(input, 'Targets');
211
+ const targets = [...rule.targets];
212
+ for (const entry of entries) {
213
+ const raw = entry;
214
+ const target = {
215
+ id: requireString(raw, 'Id'),
216
+ arn: requireString(raw, 'Arn'),
217
+ ...(typeof raw.Input === 'string' ? { input: raw.Input } : {}),
218
+ ...(typeof raw.InputPath === 'string' ? { inputPath: raw.InputPath } : {}),
219
+ };
220
+ const index = targets.findIndex(existing => existing.id === target.id);
221
+ if (index === -1)
222
+ targets.push(target);
223
+ else
224
+ targets[index] = target;
225
+ }
226
+ rules.set(ruleKey(busName, name), { ...rule, targets });
227
+ this.fireRulesChanged(region);
228
+ return { FailedEntryCount: 0, FailedEntries: [] };
229
+ }
230
+ async removeTargets(region, input) {
231
+ const name = requireString(input, 'Rule');
232
+ const busName = this.resolveBusName(input.EventBusName);
233
+ const rules = await this.rules(region);
234
+ const rule = rules.get(ruleKey(busName, name));
235
+ if (!rule)
236
+ throw this.ruleNotFound(name, busName);
237
+ const ids = new Set(requireArray(input, 'Ids').map(String));
238
+ rules.set(ruleKey(busName, name), {
239
+ ...rule,
240
+ targets: rule.targets.filter(target => !ids.has(target.id)),
241
+ });
242
+ this.fireRulesChanged(region);
243
+ return { FailedEntryCount: 0, FailedEntries: [] };
244
+ }
245
+ async listRules(region, input) {
246
+ const busName = this.resolveBusName(input.EventBusName);
247
+ await this.assertBusExists(region, busName);
248
+ const prefix = typeof input.NamePrefix === 'string' ? input.NamePrefix : '';
249
+ const rules = await this.rules(region);
250
+ return {
251
+ Rules: rules.values()
252
+ .filter(rule => rule.busName === busName && rule.name.startsWith(prefix))
253
+ .map(rule => ({
254
+ Name: rule.name,
255
+ Arn: this.ruleArn(region, busName, rule.name),
256
+ EventBusName: busName,
257
+ State: rule.state,
258
+ ...(rule.eventPattern !== undefined ? { EventPattern: rule.eventPattern } : {}),
259
+ ...(rule.scheduleExpression !== undefined ? { ScheduleExpression: rule.scheduleExpression } : {}),
260
+ })),
261
+ };
262
+ }
263
+ async listTargetsByRule(region, input) {
264
+ const name = requireString(input, 'Rule');
265
+ const busName = this.resolveBusName(input.EventBusName);
266
+ const rules = await this.rules(region);
267
+ const rule = rules.get(ruleKey(busName, name));
268
+ if (!rule)
269
+ throw this.ruleNotFound(name, busName);
270
+ return {
271
+ Targets: rule.targets.map(target => ({
272
+ Id: target.id,
273
+ Arn: target.arn,
274
+ ...(target.input !== undefined ? { Input: target.input } : {}),
275
+ ...(target.inputPath !== undefined ? { InputPath: target.inputPath } : {}),
276
+ })),
277
+ };
278
+ }
279
+ // -------------------------------------------------------------------------
280
+ // PutEvents
281
+ // -------------------------------------------------------------------------
282
+ async putEvents(region, input) {
283
+ const entries = requireArray(input, 'Entries');
284
+ const buses = await this.buses(region);
285
+ const rules = await this.rules(region);
286
+ const results = [];
287
+ for (const raw of entries) {
288
+ results.push(this.putOneEvent(region, buses, rules, raw));
289
+ }
290
+ return {
291
+ FailedEntryCount: results.filter(entry => entry.ErrorCode !== undefined).length,
292
+ Entries: results,
293
+ };
294
+ }
295
+ // Per-entry semantics: an entry problem (unknown bus, malformed detail) is
296
+ // reported in its result slot, never as a request-level error.
297
+ putOneEvent(region, buses, rules, entry) {
298
+ const busName = this.resolveBusName(entry.EventBusName);
299
+ if (busName !== DEFAULT_BUS && !buses.get(busName)) {
300
+ return { ErrorCode: 'ResourceNotFoundException', ErrorMessage: `Event bus ${busName} does not exist.` };
301
+ }
302
+ const source = typeof entry.Source === 'string' ? entry.Source : '';
303
+ const detailType = typeof entry.DetailType === 'string' ? entry.DetailType : '';
304
+ if (source === '') {
305
+ return { ErrorCode: 'InvalidArgument', ErrorMessage: 'Parameter Source is not valid. Reason: Source is a required argument.' };
306
+ }
307
+ if (detailType === '') {
308
+ return { ErrorCode: 'InvalidArgument', ErrorMessage: 'Parameter DetailType is not valid. Reason: DetailType is a required argument.' };
309
+ }
310
+ let detail;
311
+ try {
312
+ detail = JSON.parse(typeof entry.Detail === 'string' ? entry.Detail : '{}');
313
+ }
314
+ catch {
315
+ return { ErrorCode: 'MalformedDetail', ErrorMessage: 'Detail is malformed.' };
316
+ }
317
+ if (typeof detail !== 'object' || detail === null || Array.isArray(detail)) {
318
+ return { ErrorCode: 'MalformedDetail', ErrorMessage: 'Detail is malformed.' };
319
+ }
320
+ const eventId = randomUUID();
321
+ const envelope = {
322
+ version: '0',
323
+ id: eventId,
324
+ 'detail-type': detailType,
325
+ source,
326
+ account: this.ctx.config.account,
327
+ time: toEventTime(entry.Time),
328
+ region,
329
+ resources: Array.isArray(entry.Resources) ? entry.Resources : [],
330
+ detail,
331
+ };
332
+ for (const rule of rules.values()) {
333
+ if (rule.busName !== busName || rule.state !== 'ENABLED' || rule.eventPattern === undefined)
334
+ continue;
335
+ if (!matches(JSON.parse(rule.eventPattern), envelope))
336
+ continue;
337
+ this.ctx.bus.emit('events:rule-matched', {
338
+ region,
339
+ busName,
340
+ ruleName: rule.name,
341
+ targets: rule.targets,
342
+ event: envelope,
343
+ });
344
+ }
345
+ return { EventId: eventId };
346
+ }
347
+ // -------------------------------------------------------------------------
348
+ // Shared helpers
349
+ // -------------------------------------------------------------------------
350
+ async buses(region) {
351
+ const catalog = this.ctx.store.catalog(`events/${region}/buses`);
352
+ await catalog.load();
353
+ return catalog;
354
+ }
355
+ async rules(region) {
356
+ const catalog = this.ctx.store.catalog(`events/${region}/rules`);
357
+ await catalog.load();
358
+ return catalog;
359
+ }
360
+ // EventBusName parameters accept a bus name or a full event-bus ARN.
361
+ resolveBusName(raw) {
362
+ if (typeof raw !== 'string' || raw === '')
363
+ return DEFAULT_BUS;
364
+ if (raw.startsWith('arn:'))
365
+ return raw.slice(raw.indexOf('/') + 1);
366
+ return raw;
367
+ }
368
+ async assertBusExists(region, busName) {
369
+ if (busName === DEFAULT_BUS)
370
+ return;
371
+ const buses = await this.buses(region);
372
+ if (!buses.get(busName)) {
373
+ throw new AwsError('ResourceNotFoundException', `Event bus ${busName} does not exist.`);
374
+ }
375
+ }
376
+ ruleNotFound(name, busName) {
377
+ const suffix = busName === DEFAULT_BUS ? '' : ` on EventBus ${busName}`;
378
+ return new AwsError('ResourceNotFoundException', `Rule ${name} does not exist${suffix}.`);
379
+ }
380
+ busArn(region, name) {
381
+ return `arn:aws:events:${region}:${this.ctx.config.account}:event-bus/${name}`;
382
+ }
383
+ // Matches the ARN the provisioner hand-builds for AddPermission SourceArn:
384
+ // the default bus omits the bus segment.
385
+ ruleArn(region, busName, ruleName) {
386
+ const busSegment = busName === DEFAULT_BUS ? '' : `${busName}/`;
387
+ return `arn:aws:events:${region}:${this.ctx.config.account}:rule/${busSegment}${ruleName}`;
388
+ }
389
+ }
390
+ function ruleKey(busName, ruleName) {
391
+ return `${busName}|${ruleName}`;
392
+ }
393
+ function requireString(input, field) {
394
+ const value = input[field];
395
+ if (typeof value !== 'string' || value === '') {
396
+ throw new AwsError('ValidationException', `Parameter ${field} is required.`);
397
+ }
398
+ return value;
399
+ }
400
+ function requireArray(input, field) {
401
+ const value = input[field];
402
+ if (!Array.isArray(value) || value.length === 0) {
403
+ throw new AwsError('ValidationException', `Parameter ${field} is required.`);
404
+ }
405
+ return value;
406
+ }
407
+ // JSON 1.1 timestamps arrive as epoch seconds; ISO strings are accepted from
408
+ // hand-built payloads. The envelope uses second-resolution ISO time like AWS.
409
+ function toEventTime(raw) {
410
+ let date = new Date();
411
+ if (typeof raw === 'number')
412
+ date = new Date(raw * 1000);
413
+ else if (typeof raw === 'string' && !Number.isNaN(Date.parse(raw)))
414
+ date = new Date(raw);
415
+ return date.toISOString().replace(/\.\d{3}Z$/, 'Z');
416
+ }
417
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/server/engine/emulators/events/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export declare function matches(pattern: unknown, event: Record<string, unknown>): boolean;
2
+ export declare function validatePattern(pattern: unknown): string[];
3
+ //# sourceMappingURL=pattern.d.ts.map