@geekmidas/constructs 9.0.2 → 10.0.0-alpha.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.
- package/README.md +71 -44
- package/dist/{AWSScheduledFunction-Bn99MceY.d.cts → AWSScheduledFunction-9bJS4WdJ.d.cts} +8 -3
- package/dist/{AWSScheduledFunction-ysaCsdWx.d.mts.map → AWSScheduledFunction-9bJS4WdJ.d.cts.map} +1 -1
- package/dist/{AWSScheduledFunction-CufMMhGB.mjs → AWSScheduledFunction-BJjj8B5V.mjs} +3 -3
- package/dist/{AWSScheduledFunction-CufMMhGB.mjs.map → AWSScheduledFunction-BJjj8B5V.mjs.map} +1 -1
- package/dist/{AWSScheduledFunction-ysaCsdWx.d.mts → AWSScheduledFunction-BO5iEMSh.d.mts} +9 -4
- package/dist/{AWSScheduledFunction-Bn99MceY.d.cts.map → AWSScheduledFunction-BO5iEMSh.d.mts.map} +1 -1
- package/dist/{AWSScheduledFunction-DbkDr8CA.cjs → AWSScheduledFunction-qu4ieRZR.cjs} +9 -9
- package/dist/{AWSScheduledFunction-DbkDr8CA.cjs.map → AWSScheduledFunction-qu4ieRZR.cjs.map} +1 -1
- package/dist/{Construct-_1wX7p_Y.d.cts → Construct-B-xc0SE9.d.mts} +27 -5
- package/dist/Construct-B-xc0SE9.d.mts.map +1 -0
- package/dist/{Construct-r0U2zBwW.mjs → Construct-CdhThxDI.mjs} +3 -2
- package/dist/Construct-CdhThxDI.mjs.map +1 -0
- package/dist/{Construct-DCMuYOox.d.mts → Construct-WhCXIOPV.d.cts} +29 -7
- package/dist/Construct-WhCXIOPV.d.cts.map +1 -0
- package/dist/{Construct-vXMZJgRp.cjs → Construct-roId57cU.cjs} +7 -43
- package/dist/Construct-roId57cU.cjs.map +1 -0
- package/dist/{lazyAccessors-DmTG8sQH.cjs → Endpoint-BBkV6l0k.cjs} +869 -1079
- package/dist/Endpoint-BBkV6l0k.cjs.map +1 -0
- package/dist/{Endpoint-DgfRslct.d.cts → Endpoint-BKR5QH6O.d.mts} +57 -8
- package/dist/Endpoint-BKR5QH6O.d.mts.map +1 -0
- package/dist/{Endpoint-CLPSIl6S.d.mts → Endpoint-BQ9O0P1w.d.cts} +58 -9
- package/dist/Endpoint-BQ9O0P1w.d.cts.map +1 -0
- package/dist/{lazyAccessors-DfqZR6C4.mjs → Endpoint-BTj58Gob.mjs} +840 -1003
- package/dist/Endpoint-BTj58Gob.mjs.map +1 -0
- package/dist/EndpointFactory-BejSTzbB.mjs +808 -0
- package/dist/EndpointFactory-BejSTzbB.mjs.map +1 -0
- package/dist/EndpointFactory-DYoGLaIT.cjs +850 -0
- package/dist/EndpointFactory-DYoGLaIT.cjs.map +1 -0
- package/dist/{HonoEndpointAdaptor-DJDT3PMx.mjs → HonoEndpointAdaptor-7aYNdqJq.mjs} +5 -4
- package/dist/HonoEndpointAdaptor-7aYNdqJq.mjs.map +1 -0
- package/dist/{HonoEndpointAdaptor-CkJENANP.cjs → HonoEndpointAdaptor-wMsCyMgt.cjs} +24 -23
- package/dist/HonoEndpointAdaptor-wMsCyMgt.cjs.map +1 -0
- package/dist/{Queue-DaxjwmOQ.d.cts → Queue-D6WeziRD.d.cts} +43 -4
- package/dist/Queue-D6WeziRD.d.cts.map +1 -0
- package/dist/{Queue-HBDf0fqz.d.mts → Queue-DpUeqdC8.d.mts} +43 -4
- package/dist/Queue-DpUeqdC8.d.mts.map +1 -0
- package/dist/{Subscriber-B69ngPwl.d.cts → Subscriber-4rBJgDKI.d.mts} +9 -4
- package/dist/{Subscriber-B69ngPwl.d.cts.map → Subscriber-4rBJgDKI.d.mts.map} +1 -1
- package/dist/{Subscriber-D8Xm-86W.d.mts → Subscriber-DVQowdyj.d.cts} +11 -6
- package/dist/Subscriber-DVQowdyj.d.cts.map +1 -0
- package/dist/{Topic-C5ZMfveW.d.cts → Topic-Ohx9dvWr.d.cts} +33 -2
- package/dist/Topic-Ohx9dvWr.d.cts.map +1 -0
- package/dist/{Topic-DT10AqHk.d.mts → Topic-cmy2jOUy.d.mts} +33 -2
- package/dist/Topic-cmy2jOUy.d.mts.map +1 -0
- package/dist/adaptors/aws.cjs +39 -26
- package/dist/adaptors/aws.cjs.map +1 -1
- package/dist/adaptors/aws.d.cts +24 -16
- package/dist/adaptors/aws.d.cts.map +1 -1
- package/dist/adaptors/aws.d.mts +25 -17
- package/dist/adaptors/aws.d.mts.map +1 -1
- package/dist/adaptors/aws.mjs +26 -14
- package/dist/adaptors/aws.mjs.map +1 -1
- package/dist/adaptors/hono.cjs +9 -6
- package/dist/adaptors/hono.d.cts +7 -6
- package/dist/adaptors/hono.d.cts.map +1 -1
- package/dist/adaptors/hono.d.mts +8 -7
- package/dist/adaptors/hono.d.mts.map +1 -1
- package/dist/adaptors/hono.mjs +9 -6
- package/dist/adaptors/testing.cjs +18 -14
- package/dist/adaptors/testing.cjs.map +1 -1
- package/dist/adaptors/testing.d.cts +7 -6
- package/dist/adaptors/testing.d.cts.map +1 -1
- package/dist/adaptors/testing.d.mts +11 -10
- package/dist/adaptors/testing.d.mts.map +1 -1
- package/dist/adaptors/testing.mjs +10 -7
- package/dist/adaptors/testing.mjs.map +1 -1
- package/dist/auth.cjs +165 -0
- package/dist/auth.cjs.map +1 -0
- package/dist/auth.d.cts +108 -0
- package/dist/auth.d.cts.map +1 -0
- package/dist/auth.d.mts +108 -0
- package/dist/auth.d.mts.map +1 -0
- package/dist/auth.mjs +164 -0
- package/dist/auth.mjs.map +1 -0
- package/dist/cache-0ANvRQnD.mjs +51 -0
- package/dist/cache-0ANvRQnD.mjs.map +1 -0
- package/dist/cache-3WSvAulx.cjs +57 -0
- package/dist/cache-3WSvAulx.cjs.map +1 -0
- package/dist/cache-CdQ7OLpR.d.cts +47 -0
- package/dist/cache-CdQ7OLpR.d.cts.map +1 -0
- package/dist/cache-DYoJFcfd.d.mts +47 -0
- package/dist/cache-DYoJFcfd.d.mts.map +1 -0
- package/dist/cache.cjs +3 -0
- package/dist/cache.d.cts +3 -0
- package/dist/cache.d.mts +3 -0
- package/dist/cache.mjs +3 -0
- package/dist/chunk-DWy1uDak.cjs +39 -0
- package/dist/clone-DblgEZZa.mjs +39 -0
- package/dist/clone-DblgEZZa.mjs.map +1 -0
- package/dist/clone-Dy0cR2SZ.cjs +45 -0
- package/dist/clone-Dy0cR2SZ.cjs.map +1 -0
- package/dist/construct-interface-BfjcOD_E.cjs +117 -0
- package/dist/construct-interface-BfjcOD_E.cjs.map +1 -0
- package/dist/construct-interface-BqwRNYA2.d.mts +131 -0
- package/dist/construct-interface-BqwRNYA2.d.mts.map +1 -0
- package/dist/construct-interface-D2nNkHUN.d.cts +131 -0
- package/dist/construct-interface-D2nNkHUN.d.cts.map +1 -0
- package/dist/construct-interface-Z4CpS8tK.mjs +81 -0
- package/dist/construct-interface-Z4CpS8tK.mjs.map +1 -0
- package/dist/construct-interface.cjs +8 -0
- package/dist/construct-interface.d.cts +2 -0
- package/dist/construct-interface.d.mts +2 -0
- package/dist/construct-interface.mjs +3 -0
- package/dist/credential.cjs +96 -0
- package/dist/credential.cjs.map +1 -0
- package/dist/credential.d.cts +61 -0
- package/dist/credential.d.cts.map +1 -0
- package/dist/credential.d.mts +61 -0
- package/dist/credential.d.mts.map +1 -0
- package/dist/credential.mjs +94 -0
- package/dist/credential.mjs.map +1 -0
- package/dist/crons/index.cjs +39 -37
- package/dist/crons/index.cjs.map +1 -1
- package/dist/crons/index.d.cts +21 -8
- package/dist/crons/index.d.cts.map +1 -1
- package/dist/crons/index.d.mts +29 -13
- package/dist/crons/index.d.mts.map +1 -1
- package/dist/crons/index.mjs +37 -36
- package/dist/crons/index.mjs.map +1 -1
- package/dist/database/kysely.cjs +181 -0
- package/dist/database/kysely.cjs.map +1 -0
- package/dist/database/kysely.d.cts +152 -0
- package/dist/database/kysely.d.cts.map +1 -0
- package/dist/database/kysely.d.mts +152 -0
- package/dist/database/kysely.d.mts.map +1 -0
- package/dist/database/kysely.mjs +180 -0
- package/dist/database/kysely.mjs.map +1 -0
- package/dist/email.cjs +59 -0
- package/dist/email.cjs.map +1 -0
- package/dist/email.d.cts +50 -0
- package/dist/email.d.cts.map +1 -0
- package/dist/email.d.mts +50 -0
- package/dist/email.d.mts.map +1 -0
- package/dist/email.mjs +58 -0
- package/dist/email.mjs.map +1 -0
- package/dist/endpoints/index.cjs +21 -747
- package/dist/endpoints/index.d.cts +7 -343
- package/dist/endpoints/index.d.mts +7 -342
- package/dist/endpoints/index.mjs +11 -738
- package/dist/file-server.cjs +154 -0
- package/dist/file-server.cjs.map +1 -0
- package/dist/file-server.d.cts +156 -0
- package/dist/file-server.d.cts.map +1 -0
- package/dist/file-server.d.mts +156 -0
- package/dist/file-server.d.mts.map +1 -0
- package/dist/file-server.mjs +152 -0
- package/dist/file-server.mjs.map +1 -0
- package/dist/functions/index.cjs +4 -2
- package/dist/functions/index.d.cts +3 -2
- package/dist/functions/index.d.mts +3 -2
- package/dist/functions/index.mjs +4 -2
- package/dist/{functions-B-qt91O7.mjs → functions-Cpff1uZH.mjs} +55 -51
- package/dist/functions-Cpff1uZH.mjs.map +1 -0
- package/dist/{functions-C8i1kCMM.cjs → functions-DukjG8ov.cjs} +62 -57
- package/dist/functions-DukjG8ov.cjs.map +1 -0
- package/dist/{index-BVs9DvIj.d.cts → index-BTvozlUD.d.cts} +36 -9
- package/dist/index-BTvozlUD.d.cts.map +1 -0
- package/dist/index-Cvz551AO.d.mts +419 -0
- package/dist/index-Cvz551AO.d.mts.map +1 -0
- package/dist/index-D5zqAJ2e.d.cts +419 -0
- package/dist/index-D5zqAJ2e.d.cts.map +1 -0
- package/dist/{index-DP6fqv0I.d.mts → index-L7pz0R0T.d.mts} +48 -19
- package/dist/index-L7pz0R0T.d.mts.map +1 -0
- package/dist/index.cjs +1 -1
- package/dist/index.d.cts +3 -3
- package/dist/index.d.mts +3 -3
- package/dist/index.mjs +1 -1
- package/dist/lazyAccessors-DM6HcXQk.mjs +175 -0
- package/dist/lazyAccessors-DM6HcXQk.mjs.map +1 -0
- package/dist/lazyAccessors-DrJj8NpA.cjs +223 -0
- package/dist/lazyAccessors-DrJj8NpA.cjs.map +1 -0
- package/dist/object-storage.cjs +48 -0
- package/dist/object-storage.cjs.map +1 -0
- package/dist/object-storage.d.cts +36 -0
- package/dist/object-storage.d.cts.map +1 -0
- package/dist/object-storage.d.mts +36 -0
- package/dist/object-storage.d.mts.map +1 -0
- package/dist/object-storage.mjs +47 -0
- package/dist/object-storage.mjs.map +1 -0
- package/dist/{processAudits-CKjjivyz.cjs → processAudits-Bc8rz6Ev.cjs} +3 -3
- package/dist/{processAudits-CKjjivyz.cjs.map → processAudits-Bc8rz6Ev.cjs.map} +1 -1
- package/dist/{processAudits-ySnizdMG.mjs → processAudits-D89tICM4.mjs} +1 -1
- package/dist/{processAudits-ySnizdMG.mjs.map → processAudits-D89tICM4.mjs.map} +1 -1
- package/dist/{publisher-BrFOF847.mjs → publisher-CGEo8UKD.mjs} +1 -1
- package/dist/{publisher-BrFOF847.mjs.map → publisher-CGEo8UKD.mjs.map} +1 -1
- package/dist/{publisher-lFQleddL.cjs → publisher-CqGsXB2X.cjs} +1 -1
- package/dist/{publisher-lFQleddL.cjs.map → publisher-CqGsXB2X.cjs.map} +1 -1
- package/dist/queue/index.cjs +92 -30
- package/dist/queue/index.cjs.map +1 -1
- package/dist/queue/index.d.cts +19 -4
- package/dist/queue/index.d.cts.map +1 -1
- package/dist/queue/index.d.mts +22 -6
- package/dist/queue/index.d.mts.map +1 -1
- package/dist/queue/index.mjs +90 -29
- package/dist/queue/index.mjs.map +1 -1
- package/dist/rest-api.cjs +187 -0
- package/dist/rest-api.cjs.map +1 -0
- package/dist/rest-api.d.cts +221 -0
- package/dist/rest-api.d.cts.map +1 -0
- package/dist/rest-api.d.mts +221 -0
- package/dist/rest-api.d.mts.map +1 -0
- package/dist/rest-api.mjs +186 -0
- package/dist/rest-api.mjs.map +1 -0
- package/dist/site.cjs +48 -0
- package/dist/site.cjs.map +1 -0
- package/dist/site.d.cts +101 -0
- package/dist/site.d.cts.map +1 -0
- package/dist/site.d.mts +101 -0
- package/dist/site.d.mts.map +1 -0
- package/dist/site.mjs +47 -0
- package/dist/site.mjs.map +1 -0
- package/dist/subscribers/index.cjs +35 -27
- package/dist/subscribers/index.cjs.map +1 -1
- package/dist/subscribers/index.d.cts +20 -5
- package/dist/subscribers/index.d.cts.map +1 -1
- package/dist/subscribers/index.d.mts +23 -7
- package/dist/subscribers/index.d.mts.map +1 -1
- package/dist/subscribers/index.mjs +34 -27
- package/dist/subscribers/index.mjs.map +1 -1
- package/dist/surfaceEnv-BFXEms2f.cjs +39 -0
- package/dist/surfaceEnv-BFXEms2f.cjs.map +1 -0
- package/dist/surfaceEnv-C3Ktahea.mjs +27 -0
- package/dist/surfaceEnv-C3Ktahea.mjs.map +1 -0
- package/dist/{telemetry-3vdxGn4q.d.mts → telemetry-C3L0iS28.d.cts} +2 -2
- package/dist/{telemetry-3vdxGn4q.d.mts.map → telemetry-C3L0iS28.d.cts.map} +1 -1
- package/dist/{telemetry-Dqx-D3F7.d.cts → telemetry-D7bVFLGi.d.mts} +2 -2
- package/dist/{telemetry-Dqx-D3F7.d.cts.map → telemetry-D7bVFLGi.d.mts.map} +1 -1
- package/dist/topic/index.cjs +56 -13
- package/dist/topic/index.cjs.map +1 -1
- package/dist/topic/index.d.cts +2 -2
- package/dist/topic/index.d.cts.map +1 -1
- package/dist/topic/index.d.mts +2 -2
- package/dist/topic/index.d.mts.map +1 -1
- package/dist/topic/index.mjs +54 -12
- package/dist/topic/index.mjs.map +1 -1
- package/dist/{types-BDNGr7pv.d.mts → types-BlAkSuGI.d.cts} +1 -1
- package/dist/{types-BDNGr7pv.d.mts.map → types-BlAkSuGI.d.cts.map} +1 -1
- package/dist/{types-BdAaYDvd.d.cts → types-aKksMEWL.d.mts} +1 -1
- package/dist/{types-BdAaYDvd.d.cts.map → types-aKksMEWL.d.mts.map} +1 -1
- package/dist/types.d.cts +1 -1
- package/dist/types.d.mts +1 -1
- package/package.json +155 -23
- package/CHANGELOG.md +0 -396
- package/dist/Construct-DCMuYOox.d.mts.map +0 -1
- package/dist/Construct-_1wX7p_Y.d.cts.map +0 -1
- package/dist/Construct-r0U2zBwW.mjs.map +0 -1
- package/dist/Construct-vXMZJgRp.cjs.map +0 -1
- package/dist/Endpoint-CLPSIl6S.d.mts.map +0 -1
- package/dist/Endpoint-DgfRslct.d.cts.map +0 -1
- package/dist/HonoEndpointAdaptor-CkJENANP.cjs.map +0 -1
- package/dist/HonoEndpointAdaptor-DJDT3PMx.mjs.map +0 -1
- package/dist/Queue-DaxjwmOQ.d.cts.map +0 -1
- package/dist/Queue-HBDf0fqz.d.mts.map +0 -1
- package/dist/Subscriber-D8Xm-86W.d.mts.map +0 -1
- package/dist/Topic-C5ZMfveW.d.cts.map +0 -1
- package/dist/Topic-DT10AqHk.d.mts.map +0 -1
- package/dist/endpoints/index.cjs.map +0 -1
- package/dist/endpoints/index.d.cts.map +0 -1
- package/dist/endpoints/index.d.mts.map +0 -1
- package/dist/endpoints/index.mjs.map +0 -1
- package/dist/functions-B-qt91O7.mjs.map +0 -1
- package/dist/functions-C8i1kCMM.cjs.map +0 -1
- package/dist/index-BVs9DvIj.d.cts.map +0 -1
- package/dist/index-DP6fqv0I.d.mts.map +0 -1
- package/dist/lazyAccessors-DfqZR6C4.mjs.map +0 -1
- package/dist/lazyAccessors-DmTG8sQH.cjs.map +0 -1
- package/src/Construct.ts +0 -204
- package/src/__benchmarks__/build-time-optimization.bench.ts +0 -274
- package/src/__benchmarks__/endpoint.bench.ts +0 -494
- package/src/__benchmarks__/fixtures.ts +0 -241
- package/src/__benchmarks__/hono-adaptor.bench.ts +0 -533
- package/src/__benchmarks__/hono-server.bench.ts +0 -249
- package/src/__benchmarks__/response-builder.bench.ts +0 -428
- package/src/__benchmarks__/strategies/strategy-a-lazy-services.ts +0 -319
- package/src/__benchmarks__/strategies/strategy-c-middleware.ts +0 -530
- package/src/__benchmarks__/strategies/strategy-d-opt-in-events.ts +0 -567
- package/src/__tests__/Construct.environment.spec.ts +0 -704
- package/src/__tests__/publisher.setting.spec.ts +0 -508
- package/src/__tests__/publisher.spec.ts +0 -452
- package/src/adaptors/aws.ts +0 -6
- package/src/adaptors/hono.ts +0 -1
- package/src/adaptors/testing.ts +0 -11
- package/src/crons/AWSScheduledFunction.ts +0 -73
- package/src/crons/Cron.ts +0 -149
- package/src/crons/CronBuilder.ts +0 -271
- package/src/crons/__tests__/AWSScheduledFunction.spec.ts +0 -152
- package/src/crons/__tests__/Cron.spec.ts +0 -464
- package/src/crons/__tests__/CronBuilder.state-isolation.spec.ts +0 -227
- package/src/crons/index.ts +0 -12
- package/src/endpoints/AmazonApiGatewayEndpointAdaptor.ts +0 -677
- package/src/endpoints/AmazonApiGatewayV1EndpointAdaptor.ts +0 -105
- package/src/endpoints/AmazonApiGatewayV2EndpointAdaptor.ts +0 -97
- package/src/endpoints/Authorizer.ts +0 -152
- package/src/endpoints/Endpoint.ts +0 -1287
- package/src/endpoints/EndpointBuilder.ts +0 -758
- package/src/endpoints/EndpointFactory.ts +0 -1148
- package/src/endpoints/HonoEndpointAdaptor.ts +0 -677
- package/src/endpoints/MswEndpointAdaptor.ts +0 -226
- package/src/endpoints/TestEndpointAdaptor.ts +0 -422
- package/src/endpoints/__tests__/AmazonApiGatewayV1EndpointAdaptor.audits.spec.ts +0 -499
- package/src/endpoints/__tests__/AmazonApiGatewayV1EndpointAdaptor.events.spec.ts +0 -560
- package/src/endpoints/__tests__/AmazonApiGatewayV1EndpointAdaptor.spec.ts +0 -1304
- package/src/endpoints/__tests__/AmazonApiGatewayV2EndpointAdaptor.audits.spec.ts +0 -626
- package/src/endpoints/__tests__/AmazonApiGatewayV2EndpointAdaptor.events.spec.ts +0 -732
- package/src/endpoints/__tests__/AmazonApiGatewayV2EndpointAdaptor.factory-publisher.spec.ts +0 -296
- package/src/endpoints/__tests__/AmazonApiGatewayV2EndpointAdaptor.kysely-audit.integration.spec.ts +0 -951
- package/src/endpoints/__tests__/AmazonApiGatewayV2EndpointAdaptor.responseType.spec.ts +0 -111
- package/src/endpoints/__tests__/AmazonApiGatewayV2EndpointAdaptor.rls.spec.ts +0 -307
- package/src/endpoints/__tests__/AmazonApiGatewayV2EndpointAdaptor.spec.ts +0 -629
- package/src/endpoints/__tests__/Authorizer.spec.ts +0 -286
- package/src/endpoints/__tests__/Endpoint.cookies.spec.ts +0 -207
- package/src/endpoints/__tests__/Endpoint.headers.spec.ts +0 -187
- package/src/endpoints/__tests__/Endpoint.manifest.spec.ts +0 -175
- package/src/endpoints/__tests__/Endpoint.spec.ts +0 -857
- package/src/endpoints/__tests__/EndpointBuilder.audit.spec.ts +0 -448
- package/src/endpoints/__tests__/EndpointBuilder.responseType.spec.ts +0 -47
- package/src/endpoints/__tests__/EndpointBuilder.spec.ts +0 -523
- package/src/endpoints/__tests__/EndpointFactory.authorizers.spec.ts +0 -492
- package/src/endpoints/__tests__/EndpointFactory.database-auditor.spec.ts +0 -509
- package/src/endpoints/__tests__/EndpointFactory.reference-audit.spec.ts +0 -190
- package/src/endpoints/__tests__/EndpointFactory.spec.ts +0 -479
- package/src/endpoints/__tests__/EndpointFactory.state-isolation.spec.ts +0 -155
- package/src/endpoints/__tests__/HonoEndpointAdaptor.audit-transactions.spec.ts +0 -703
- package/src/endpoints/__tests__/HonoEndpointAdaptor.audits.spec.ts +0 -632
- package/src/endpoints/__tests__/HonoEndpointAdaptor.events.spec.ts +0 -577
- package/src/endpoints/__tests__/HonoEndpointAdaptor.kysely-audit.integration.spec.ts +0 -1067
- package/src/endpoints/__tests__/HonoEndpointAdaptor.openapi.spec.ts +0 -317
- package/src/endpoints/__tests__/HonoEndpointAdaptor.pgboss-publisher.spec.ts +0 -289
- package/src/endpoints/__tests__/HonoEndpointAdaptor.responseType.spec.ts +0 -128
- package/src/endpoints/__tests__/HonoEndpointAdaptor.spec.ts +0 -1207
- package/src/endpoints/__tests__/MswEndpointAdaptor.spec.ts +0 -211
- package/src/endpoints/__tests__/ResponseBuilder.spec.ts +0 -235
- package/src/endpoints/__tests__/TestEndpointAdaptor.audits.spec.ts +0 -602
- package/src/endpoints/__tests__/TestEndpointAdaptor.spec.ts +0 -1044
- package/src/endpoints/__tests__/__snapshots__/HonoEndpointAdaptor.spec.ts.snap +0 -54
- package/src/endpoints/__tests__/endpoint-types.test.ts +0 -88
- package/src/endpoints/__tests__/helpers.spec.ts +0 -37
- package/src/endpoints/__tests__/lazyAccessors.spec.ts +0 -330
- package/src/endpoints/__tests__/processAudits.spec.ts +0 -631
- package/src/endpoints/audit.ts +0 -87
- package/src/endpoints/helpers.ts +0 -98
- package/src/endpoints/index.ts +0 -42
- package/src/endpoints/lazyAccessors.ts +0 -241
- package/src/endpoints/parseHonoQuery.ts +0 -16
- package/src/endpoints/parseQueryParams.ts +0 -32
- package/src/endpoints/processAudits.ts +0 -371
- package/src/endpoints/rls.ts +0 -67
- package/src/functions/AWSLambdaFunction.ts +0 -348
- package/src/functions/BaseFunctionBuilder.ts +0 -201
- package/src/functions/Function.ts +0 -238
- package/src/functions/FunctionBuilder.ts +0 -391
- package/src/functions/FunctionExecutionWrapper.ts +0 -216
- package/src/functions/TestFunctionAdaptor.ts +0 -217
- package/src/functions/__tests__/AWSLambdaFunctionAdaptor.spec.ts +0 -513
- package/src/functions/__tests__/Function.audits.spec.ts +0 -393
- package/src/functions/__tests__/Function.spec.ts +0 -477
- package/src/functions/__tests__/FunctionBuilder.state-isolation.spec.ts +0 -207
- package/src/functions/__tests__/TestFunctionAdaptor.spec.ts +0 -480
- package/src/functions/index.ts +0 -12
- package/src/index.ts +0 -23
- package/src/publisher.ts +0 -93
- package/src/queue/AWSLambdaQueueAdaptor.ts +0 -162
- package/src/queue/Queue.ts +0 -128
- package/src/queue/QueueBuilder.ts +0 -115
- package/src/queue/TestQueueAdaptor.ts +0 -63
- package/src/queue/__tests__/QueueBuilder.spec.ts +0 -137
- package/src/queue/index.ts +0 -12
- package/src/subscribers/AWSLambdaSubscriberAdaptor.ts +0 -342
- package/src/subscribers/Subscriber.ts +0 -117
- package/src/subscribers/SubscriberBuilder.ts +0 -186
- package/src/subscribers/TestSubscriberAdaptor.ts +0 -133
- package/src/subscribers/__tests__/AWSLambdaSubscriberAdaptor.spec.ts +0 -1018
- package/src/subscribers/__tests__/Subscriber.spec.ts +0 -430
- package/src/subscribers/__tests__/TestSubscriberAdaptor.spec.ts +0 -652
- package/src/subscribers/index.ts +0 -6
- package/src/telemetry.ts +0 -103
- package/src/topic/Topic.ts +0 -103
- package/src/topic/TopicBuilder.ts +0 -51
- package/src/topic/__tests__/TopicBuilder.spec.ts +0 -82
- package/src/topic/index.ts +0 -11
- package/src/types.ts +0 -13
- package/test.ts +0 -91
- package/tsconfig.json +0 -9
- package/tsdown.config.ts +0 -34
|
@@ -1,1018 +0,0 @@
|
|
|
1
|
-
import { EnvironmentParser } from '@geekmidas/envkit';
|
|
2
|
-
import { ConsoleLogger } from '@geekmidas/logger/console';
|
|
3
|
-
import type { Service } from '@geekmidas/services';
|
|
4
|
-
import { serviceContext } from '@geekmidas/services';
|
|
5
|
-
import type {
|
|
6
|
-
Context,
|
|
7
|
-
SNSEvent,
|
|
8
|
-
SNSEventRecord,
|
|
9
|
-
SQSEvent,
|
|
10
|
-
SQSRecord,
|
|
11
|
-
} from 'aws-lambda';
|
|
12
|
-
import { beforeEach, describe, expect, it, vi } from 'vitest';
|
|
13
|
-
import { z } from 'zod/v4';
|
|
14
|
-
import { AWSLambdaSubscriber } from '../AWSLambdaSubscriberAdaptor';
|
|
15
|
-
import { Subscriber } from '../Subscriber';
|
|
16
|
-
|
|
17
|
-
// Mock services
|
|
18
|
-
class TestService implements Service<'TestService', TestService> {
|
|
19
|
-
serviceName = 'TestService' as const;
|
|
20
|
-
static serviceName = 'TestService';
|
|
21
|
-
|
|
22
|
-
async register() {
|
|
23
|
-
return this;
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
getValue() {
|
|
27
|
-
return 'test-value';
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
// Mock Lambda context
|
|
32
|
-
const createMockContext = (): Context => ({
|
|
33
|
-
functionName: 'test-subscriber',
|
|
34
|
-
functionVersion: '1',
|
|
35
|
-
invokedFunctionArn: 'arn:aws:lambda:region:account:function:test-subscriber',
|
|
36
|
-
memoryLimitInMB: '512',
|
|
37
|
-
awsRequestId: 'test-request-id',
|
|
38
|
-
logGroupName: '/aws/lambda/test-subscriber',
|
|
39
|
-
logStreamName: '2023/01/01/[$LATEST]test-stream',
|
|
40
|
-
getRemainingTimeInMillis: () => 30000,
|
|
41
|
-
done: vi.fn(),
|
|
42
|
-
fail: vi.fn(),
|
|
43
|
-
succeed: vi.fn(),
|
|
44
|
-
callbackWaitsForEmptyEventLoop: true,
|
|
45
|
-
});
|
|
46
|
-
|
|
47
|
-
// Helper to create SQS event
|
|
48
|
-
const createSQSEvent = (messages: any[]): SQSEvent => ({
|
|
49
|
-
Records: messages.map(
|
|
50
|
-
(body, index) =>
|
|
51
|
-
({
|
|
52
|
-
messageId: `message-${index}`,
|
|
53
|
-
receiptHandle: `receipt-${index}`,
|
|
54
|
-
body: JSON.stringify(body),
|
|
55
|
-
attributes: {
|
|
56
|
-
ApproximateReceiveCount: '1',
|
|
57
|
-
SentTimestamp: '1234567890',
|
|
58
|
-
SenderId: 'sender-id',
|
|
59
|
-
ApproximateFirstReceiveTimestamp: '1234567890',
|
|
60
|
-
},
|
|
61
|
-
messageAttributes: {},
|
|
62
|
-
md5OfBody: 'md5',
|
|
63
|
-
eventSource: 'aws:sqs',
|
|
64
|
-
eventSourceARN: 'arn:aws:sqs:region:account:queue-name',
|
|
65
|
-
awsRegion: 'us-east-1',
|
|
66
|
-
}) as SQSRecord,
|
|
67
|
-
),
|
|
68
|
-
});
|
|
69
|
-
|
|
70
|
-
// Helper to create SNS event with full event format (type in message body)
|
|
71
|
-
const createSNSEvent = (messages: any[]): SNSEvent => ({
|
|
72
|
-
Records: messages.map(
|
|
73
|
-
(message, index) =>
|
|
74
|
-
({
|
|
75
|
-
EventSource: 'aws:sns',
|
|
76
|
-
EventVersion: '1.0',
|
|
77
|
-
EventSubscriptionArn: 'arn:aws:sns:region:account:topic-name',
|
|
78
|
-
Sns: {
|
|
79
|
-
Type: 'Notification',
|
|
80
|
-
MessageId: `message-${index}`,
|
|
81
|
-
TopicArn: 'arn:aws:sns:region:account:topic-name',
|
|
82
|
-
Subject: 'Test',
|
|
83
|
-
Message: JSON.stringify(message),
|
|
84
|
-
Timestamp: '2023-01-01T00:00:00.000Z',
|
|
85
|
-
SignatureVersion: '1',
|
|
86
|
-
Signature: 'signature',
|
|
87
|
-
SigningCertUrl: 'https://example.com/cert',
|
|
88
|
-
UnsubscribeUrl: 'https://example.com/unsubscribe',
|
|
89
|
-
},
|
|
90
|
-
}) as SNSEventRecord,
|
|
91
|
-
),
|
|
92
|
-
});
|
|
93
|
-
|
|
94
|
-
// Helper to create SNS event with payload-only format (type in MessageAttributes)
|
|
95
|
-
const createSNSEventWithMessageAttributes = (
|
|
96
|
-
messages: { type: string; payload: any }[],
|
|
97
|
-
): SNSEvent => ({
|
|
98
|
-
Records: messages.map(
|
|
99
|
-
(message, index) =>
|
|
100
|
-
({
|
|
101
|
-
EventSource: 'aws:sns',
|
|
102
|
-
EventVersion: '1.0',
|
|
103
|
-
EventSubscriptionArn: 'arn:aws:sns:region:account:topic-name',
|
|
104
|
-
Sns: {
|
|
105
|
-
Type: 'Notification',
|
|
106
|
-
MessageId: `message-${index}`,
|
|
107
|
-
TopicArn: 'arn:aws:sns:region:account:topic-name',
|
|
108
|
-
Subject: undefined,
|
|
109
|
-
Message: JSON.stringify(message.payload),
|
|
110
|
-
Timestamp: '2023-01-01T00:00:00.000Z',
|
|
111
|
-
SignatureVersion: '1',
|
|
112
|
-
Signature: 'signature',
|
|
113
|
-
SigningCertUrl: 'https://example.com/cert',
|
|
114
|
-
UnsubscribeUrl: 'https://example.com/unsubscribe',
|
|
115
|
-
MessageAttributes: {
|
|
116
|
-
type: {
|
|
117
|
-
Type: 'String',
|
|
118
|
-
Value: message.type,
|
|
119
|
-
},
|
|
120
|
-
},
|
|
121
|
-
},
|
|
122
|
-
}) satisfies SNSEventRecord,
|
|
123
|
-
),
|
|
124
|
-
});
|
|
125
|
-
|
|
126
|
-
// Helper to create SNS wrapped in SQS
|
|
127
|
-
const createSNSWrappedInSQS = (messages: any[]): SQSEvent => {
|
|
128
|
-
return createSQSEvent(
|
|
129
|
-
messages.map((message) => ({
|
|
130
|
-
Type: 'Notification',
|
|
131
|
-
MessageId: 'message-id',
|
|
132
|
-
TopicArn: 'arn:aws:sns:region:account:topic-name',
|
|
133
|
-
Message: JSON.stringify(message),
|
|
134
|
-
Timestamp: '2023-01-01T00:00:00.000Z',
|
|
135
|
-
})),
|
|
136
|
-
);
|
|
137
|
-
};
|
|
138
|
-
|
|
139
|
-
// Helper to create SNS wrapped in SQS with payload-only format (type in MessageAttributes)
|
|
140
|
-
const createSNSWrappedInSQSWithMessageAttributes = (
|
|
141
|
-
messages: { type: string; payload: any }[],
|
|
142
|
-
): SQSEvent => {
|
|
143
|
-
return createSQSEvent(
|
|
144
|
-
messages.map((message) => ({
|
|
145
|
-
Type: 'Notification',
|
|
146
|
-
MessageId: 'message-id',
|
|
147
|
-
TopicArn: 'arn:aws:sns:region:account:topic-name',
|
|
148
|
-
Message: JSON.stringify(message.payload),
|
|
149
|
-
Timestamp: '2023-01-01T00:00:00.000Z',
|
|
150
|
-
MessageAttributes: {
|
|
151
|
-
type: {
|
|
152
|
-
Type: 'String',
|
|
153
|
-
Value: message.type,
|
|
154
|
-
},
|
|
155
|
-
},
|
|
156
|
-
})),
|
|
157
|
-
);
|
|
158
|
-
};
|
|
159
|
-
|
|
160
|
-
describe('AWSLambdaSubscriber', () => {
|
|
161
|
-
let envParser: EnvironmentParser<{}>;
|
|
162
|
-
let logger: ConsoleLogger;
|
|
163
|
-
|
|
164
|
-
beforeEach(() => {
|
|
165
|
-
envParser = new EnvironmentParser({});
|
|
166
|
-
logger = new ConsoleLogger();
|
|
167
|
-
vi.clearAllMocks();
|
|
168
|
-
});
|
|
169
|
-
|
|
170
|
-
describe('SQS event processing', () => {
|
|
171
|
-
it('should process direct SQS messages', async () => {
|
|
172
|
-
const handler = vi.fn(async ({ events }) => {
|
|
173
|
-
expect(events).toHaveLength(2);
|
|
174
|
-
expect(events[0]).toEqual({
|
|
175
|
-
type: 'user.created',
|
|
176
|
-
payload: { userId: '1', email: 'user1@example.com' },
|
|
177
|
-
});
|
|
178
|
-
expect(events[1]).toEqual({
|
|
179
|
-
type: 'user.created',
|
|
180
|
-
payload: { userId: '2', email: 'user2@example.com' },
|
|
181
|
-
});
|
|
182
|
-
});
|
|
183
|
-
|
|
184
|
-
const subscriber = new Subscriber(
|
|
185
|
-
handler,
|
|
186
|
-
30000, // timeout
|
|
187
|
-
undefined, // subscribedEvents
|
|
188
|
-
undefined, // outputSchema
|
|
189
|
-
[], // services
|
|
190
|
-
logger, // logger
|
|
191
|
-
);
|
|
192
|
-
|
|
193
|
-
const adapter = new AWSLambdaSubscriber(envParser, subscriber);
|
|
194
|
-
const lambdaHandler = adapter.handler;
|
|
195
|
-
|
|
196
|
-
const sqsEvent = createSQSEvent([
|
|
197
|
-
{
|
|
198
|
-
type: 'user.created',
|
|
199
|
-
payload: { userId: '1', email: 'user1@example.com' },
|
|
200
|
-
},
|
|
201
|
-
{
|
|
202
|
-
type: 'user.created',
|
|
203
|
-
payload: { userId: '2', email: 'user2@example.com' },
|
|
204
|
-
},
|
|
205
|
-
]);
|
|
206
|
-
|
|
207
|
-
await lambdaHandler(sqsEvent, createMockContext(), vi.fn());
|
|
208
|
-
|
|
209
|
-
expect(handler).toHaveBeenCalled();
|
|
210
|
-
});
|
|
211
|
-
|
|
212
|
-
it('should process SNS messages wrapped in SQS', async () => {
|
|
213
|
-
const handler = vi.fn(async ({ events }) => {
|
|
214
|
-
expect(events).toHaveLength(2);
|
|
215
|
-
expect(events[0]).toEqual({
|
|
216
|
-
type: 'order.placed',
|
|
217
|
-
payload: { orderId: 'order-1' },
|
|
218
|
-
});
|
|
219
|
-
});
|
|
220
|
-
|
|
221
|
-
const subscriber = new Subscriber(
|
|
222
|
-
handler,
|
|
223
|
-
30000, // timeout
|
|
224
|
-
undefined, // subscribedEvents
|
|
225
|
-
undefined, // outputSchema
|
|
226
|
-
[], // services
|
|
227
|
-
logger, // logger
|
|
228
|
-
);
|
|
229
|
-
|
|
230
|
-
const adapter = new AWSLambdaSubscriber(envParser, subscriber);
|
|
231
|
-
const lambdaHandler = adapter.handler;
|
|
232
|
-
|
|
233
|
-
const sqsEvent = createSNSWrappedInSQS([
|
|
234
|
-
{ type: 'order.placed', payload: { orderId: 'order-1' } },
|
|
235
|
-
{ type: 'order.placed', payload: { orderId: 'order-2' } },
|
|
236
|
-
]);
|
|
237
|
-
|
|
238
|
-
await lambdaHandler(sqsEvent, createMockContext(), vi.fn());
|
|
239
|
-
|
|
240
|
-
expect(handler).toHaveBeenCalled();
|
|
241
|
-
});
|
|
242
|
-
});
|
|
243
|
-
|
|
244
|
-
describe('SNS event processing', () => {
|
|
245
|
-
it('should process SNS events directly', async () => {
|
|
246
|
-
const handler = vi.fn(async ({ events }) => {
|
|
247
|
-
expect(events).toHaveLength(2);
|
|
248
|
-
expect(events[0]).toEqual({
|
|
249
|
-
type: 'user.created',
|
|
250
|
-
payload: { userId: '1', email: 'user1@example.com' },
|
|
251
|
-
});
|
|
252
|
-
});
|
|
253
|
-
|
|
254
|
-
const subscriber = new Subscriber(
|
|
255
|
-
handler,
|
|
256
|
-
30000, // timeout
|
|
257
|
-
undefined, // subscribedEvents
|
|
258
|
-
undefined, // outputSchema
|
|
259
|
-
[], // services
|
|
260
|
-
logger, // logger
|
|
261
|
-
);
|
|
262
|
-
|
|
263
|
-
const adapter = new AWSLambdaSubscriber(envParser, subscriber);
|
|
264
|
-
const lambdaHandler = adapter.handler;
|
|
265
|
-
|
|
266
|
-
const snsEvent = createSNSEvent([
|
|
267
|
-
{
|
|
268
|
-
type: 'user.created',
|
|
269
|
-
payload: { userId: '1', email: 'user1@example.com' },
|
|
270
|
-
},
|
|
271
|
-
{
|
|
272
|
-
type: 'user.created',
|
|
273
|
-
payload: { userId: '2', email: 'user2@example.com' },
|
|
274
|
-
},
|
|
275
|
-
]);
|
|
276
|
-
|
|
277
|
-
await lambdaHandler(snsEvent, createMockContext(), vi.fn());
|
|
278
|
-
|
|
279
|
-
expect(handler).toHaveBeenCalled();
|
|
280
|
-
});
|
|
281
|
-
|
|
282
|
-
it('should process SNS events with type in MessageAttributes (payload-only format)', async () => {
|
|
283
|
-
const handler = vi.fn(async ({ events }) => {
|
|
284
|
-
expect(events).toHaveLength(1);
|
|
285
|
-
expect(events[0]).toEqual({
|
|
286
|
-
type: 'tenant.created',
|
|
287
|
-
payload: { tenantId: '019c0b2b-d881-7c21-93b6-480571144b28' },
|
|
288
|
-
});
|
|
289
|
-
});
|
|
290
|
-
|
|
291
|
-
const subscriber = new Subscriber(
|
|
292
|
-
handler,
|
|
293
|
-
30000,
|
|
294
|
-
['tenant.created'] as any,
|
|
295
|
-
undefined,
|
|
296
|
-
[],
|
|
297
|
-
logger,
|
|
298
|
-
);
|
|
299
|
-
|
|
300
|
-
const adapter = new AWSLambdaSubscriber(envParser, subscriber);
|
|
301
|
-
const lambdaHandler = adapter.handler;
|
|
302
|
-
|
|
303
|
-
const snsEvent = createSNSEventWithMessageAttributes([
|
|
304
|
-
{
|
|
305
|
-
type: 'tenant.created',
|
|
306
|
-
payload: { tenantId: '019c0b2b-d881-7c21-93b6-480571144b28' },
|
|
307
|
-
},
|
|
308
|
-
]);
|
|
309
|
-
|
|
310
|
-
await lambdaHandler(snsEvent, createMockContext(), vi.fn());
|
|
311
|
-
|
|
312
|
-
expect(handler).toHaveBeenCalled();
|
|
313
|
-
});
|
|
314
|
-
|
|
315
|
-
it('should process SNS-wrapped-in-SQS with type in MessageAttributes (payload-only format)', async () => {
|
|
316
|
-
const handler = vi.fn(async ({ events }) => {
|
|
317
|
-
expect(events).toHaveLength(1);
|
|
318
|
-
expect(events[0]).toEqual({
|
|
319
|
-
type: 'tenant.created',
|
|
320
|
-
payload: { tenantId: '019c0b2b-d881-7c21-93b6-480571144b28' },
|
|
321
|
-
});
|
|
322
|
-
});
|
|
323
|
-
|
|
324
|
-
const subscriber = new Subscriber(
|
|
325
|
-
handler,
|
|
326
|
-
30000,
|
|
327
|
-
['tenant.created'] as any,
|
|
328
|
-
undefined,
|
|
329
|
-
[],
|
|
330
|
-
logger,
|
|
331
|
-
);
|
|
332
|
-
|
|
333
|
-
const adapter = new AWSLambdaSubscriber(envParser, subscriber);
|
|
334
|
-
const lambdaHandler = adapter.handler;
|
|
335
|
-
|
|
336
|
-
const sqsEvent = createSNSWrappedInSQSWithMessageAttributes([
|
|
337
|
-
{
|
|
338
|
-
type: 'tenant.created',
|
|
339
|
-
payload: { tenantId: '019c0b2b-d881-7c21-93b6-480571144b28' },
|
|
340
|
-
},
|
|
341
|
-
]);
|
|
342
|
-
|
|
343
|
-
await lambdaHandler(sqsEvent, createMockContext(), vi.fn());
|
|
344
|
-
|
|
345
|
-
expect(handler).toHaveBeenCalled();
|
|
346
|
-
});
|
|
347
|
-
});
|
|
348
|
-
|
|
349
|
-
describe('event type filtering', () => {
|
|
350
|
-
it('should filter events by subscribed types', async () => {
|
|
351
|
-
const handler = vi.fn(async ({ events }) => {
|
|
352
|
-
expect(events).toHaveLength(2);
|
|
353
|
-
expect(events.every((e: any) => e.type === 'user.created')).toBe(true);
|
|
354
|
-
});
|
|
355
|
-
|
|
356
|
-
const subscriber = new Subscriber(
|
|
357
|
-
handler,
|
|
358
|
-
30000, // timeout
|
|
359
|
-
['user.created'] as any, // subscribedEvents - Only subscribe to user.created
|
|
360
|
-
undefined, // outputSchema
|
|
361
|
-
[], // services
|
|
362
|
-
logger, // logger
|
|
363
|
-
);
|
|
364
|
-
|
|
365
|
-
const adapter = new AWSLambdaSubscriber(envParser, subscriber);
|
|
366
|
-
const lambdaHandler = adapter.handler;
|
|
367
|
-
|
|
368
|
-
const sqsEvent = createSQSEvent([
|
|
369
|
-
{
|
|
370
|
-
type: 'user.created',
|
|
371
|
-
payload: { userId: '1', email: 'user1@example.com' },
|
|
372
|
-
},
|
|
373
|
-
{ type: 'order.placed', payload: { orderId: 'order-1' } }, // Should be filtered out
|
|
374
|
-
{
|
|
375
|
-
type: 'user.created',
|
|
376
|
-
payload: { userId: '2', email: 'user2@example.com' },
|
|
377
|
-
},
|
|
378
|
-
]);
|
|
379
|
-
|
|
380
|
-
await lambdaHandler(sqsEvent, createMockContext(), vi.fn());
|
|
381
|
-
|
|
382
|
-
expect(handler).toHaveBeenCalled();
|
|
383
|
-
});
|
|
384
|
-
|
|
385
|
-
it('should accept all events when no subscribed types specified', async () => {
|
|
386
|
-
const handler = vi.fn(async ({ events }) => {
|
|
387
|
-
expect(events).toHaveLength(3);
|
|
388
|
-
});
|
|
389
|
-
|
|
390
|
-
const subscriber = new Subscriber(
|
|
391
|
-
handler,
|
|
392
|
-
30000, // timeout
|
|
393
|
-
undefined, // subscribedEvents - No filter
|
|
394
|
-
undefined, // outputSchema
|
|
395
|
-
[], // services
|
|
396
|
-
logger, // logger
|
|
397
|
-
);
|
|
398
|
-
|
|
399
|
-
const adapter = new AWSLambdaSubscriber(envParser, subscriber);
|
|
400
|
-
const lambdaHandler = adapter.handler;
|
|
401
|
-
|
|
402
|
-
const sqsEvent = createSQSEvent([
|
|
403
|
-
{
|
|
404
|
-
type: 'user.created',
|
|
405
|
-
payload: { userId: '1', email: 'user1@example.com' },
|
|
406
|
-
},
|
|
407
|
-
{ type: 'order.placed', payload: { orderId: 'order-1' } },
|
|
408
|
-
{ type: 'user.updated', payload: { userId: '1' } },
|
|
409
|
-
]);
|
|
410
|
-
|
|
411
|
-
await lambdaHandler(sqsEvent, createMockContext(), vi.fn());
|
|
412
|
-
|
|
413
|
-
expect(handler).toHaveBeenCalled();
|
|
414
|
-
});
|
|
415
|
-
|
|
416
|
-
it('should return early when no subscribed events after filtering', async () => {
|
|
417
|
-
const handler = vi.fn();
|
|
418
|
-
|
|
419
|
-
const subscriber = new Subscriber(
|
|
420
|
-
handler,
|
|
421
|
-
30000, // timeout
|
|
422
|
-
['user.deleted'] as any, // subscribedEvents - Subscribe to events that won't come
|
|
423
|
-
undefined, // outputSchema
|
|
424
|
-
[], // services
|
|
425
|
-
logger, // logger
|
|
426
|
-
);
|
|
427
|
-
|
|
428
|
-
const adapter = new AWSLambdaSubscriber(envParser, subscriber);
|
|
429
|
-
const lambdaHandler = adapter.handler;
|
|
430
|
-
|
|
431
|
-
const sqsEvent = createSQSEvent([
|
|
432
|
-
{
|
|
433
|
-
type: 'user.created',
|
|
434
|
-
payload: { userId: '1', email: 'user1@example.com' },
|
|
435
|
-
},
|
|
436
|
-
{ type: 'order.placed', payload: { orderId: 'order-1' } },
|
|
437
|
-
]);
|
|
438
|
-
|
|
439
|
-
const result = await lambdaHandler(
|
|
440
|
-
sqsEvent,
|
|
441
|
-
createMockContext(),
|
|
442
|
-
vi.fn(),
|
|
443
|
-
);
|
|
444
|
-
|
|
445
|
-
expect(handler).not.toHaveBeenCalled();
|
|
446
|
-
expect(result).toEqual({ batchItemFailures: [] });
|
|
447
|
-
});
|
|
448
|
-
});
|
|
449
|
-
|
|
450
|
-
describe('services', () => {
|
|
451
|
-
it('should inject services into subscriber context', async () => {
|
|
452
|
-
const service = new TestService();
|
|
453
|
-
const handler = vi.fn(async ({ services }) => {
|
|
454
|
-
expect(services.TestService.getValue()).toBe('test-value');
|
|
455
|
-
});
|
|
456
|
-
|
|
457
|
-
const subscriber = new Subscriber(
|
|
458
|
-
handler,
|
|
459
|
-
30000, // timeout
|
|
460
|
-
undefined, // subscribedEvents
|
|
461
|
-
undefined, // outputSchema
|
|
462
|
-
[service], // services
|
|
463
|
-
logger, // logger
|
|
464
|
-
);
|
|
465
|
-
|
|
466
|
-
const adapter = new AWSLambdaSubscriber(envParser, subscriber);
|
|
467
|
-
const lambdaHandler = adapter.handler;
|
|
468
|
-
|
|
469
|
-
const sqsEvent = createSQSEvent([
|
|
470
|
-
{
|
|
471
|
-
type: 'user.created',
|
|
472
|
-
payload: { userId: '1', email: 'user1@example.com' },
|
|
473
|
-
},
|
|
474
|
-
]);
|
|
475
|
-
|
|
476
|
-
await lambdaHandler(sqsEvent, createMockContext(), vi.fn());
|
|
477
|
-
|
|
478
|
-
expect(handler).toHaveBeenCalledWith(
|
|
479
|
-
expect.objectContaining({
|
|
480
|
-
services: expect.objectContaining({
|
|
481
|
-
TestService: expect.any(TestService),
|
|
482
|
-
}),
|
|
483
|
-
}),
|
|
484
|
-
);
|
|
485
|
-
});
|
|
486
|
-
});
|
|
487
|
-
|
|
488
|
-
describe('logging', () => {
|
|
489
|
-
it('should create child logger with Lambda context', async () => {
|
|
490
|
-
const childLogger = {
|
|
491
|
-
info: vi.fn(),
|
|
492
|
-
error: vi.fn(),
|
|
493
|
-
warn: vi.fn(),
|
|
494
|
-
debug: vi.fn(),
|
|
495
|
-
child: vi.fn(),
|
|
496
|
-
};
|
|
497
|
-
|
|
498
|
-
const mockLogger = {
|
|
499
|
-
child: vi.fn().mockReturnValue(childLogger),
|
|
500
|
-
info: vi.fn(),
|
|
501
|
-
error: vi.fn(),
|
|
502
|
-
warn: vi.fn(),
|
|
503
|
-
debug: vi.fn(),
|
|
504
|
-
};
|
|
505
|
-
|
|
506
|
-
const subscriber = new Subscriber(
|
|
507
|
-
async ({ logger }) => {
|
|
508
|
-
logger.info('Processing events');
|
|
509
|
-
},
|
|
510
|
-
30000, // timeout
|
|
511
|
-
undefined, // subscribedEvents
|
|
512
|
-
undefined, // outputSchema
|
|
513
|
-
[], // services
|
|
514
|
-
mockLogger as any, // logger
|
|
515
|
-
);
|
|
516
|
-
|
|
517
|
-
const adapter = new AWSLambdaSubscriber(envParser, subscriber);
|
|
518
|
-
const lambdaHandler = adapter.handler;
|
|
519
|
-
|
|
520
|
-
const context = createMockContext();
|
|
521
|
-
const sqsEvent = createSQSEvent([
|
|
522
|
-
{
|
|
523
|
-
type: 'user.created',
|
|
524
|
-
payload: { userId: '1', email: 'user1@example.com' },
|
|
525
|
-
},
|
|
526
|
-
]);
|
|
527
|
-
|
|
528
|
-
await lambdaHandler(sqsEvent, context, vi.fn());
|
|
529
|
-
|
|
530
|
-
expect(mockLogger.child).toHaveBeenCalledWith({
|
|
531
|
-
subscriber: {
|
|
532
|
-
name: 'test-subscriber',
|
|
533
|
-
version: '1',
|
|
534
|
-
memory: '512',
|
|
535
|
-
},
|
|
536
|
-
req: {
|
|
537
|
-
id: 'test-request-id',
|
|
538
|
-
},
|
|
539
|
-
});
|
|
540
|
-
expect(childLogger.info).toHaveBeenCalledWith('Processing events');
|
|
541
|
-
});
|
|
542
|
-
});
|
|
543
|
-
|
|
544
|
-
describe('output validation', () => {
|
|
545
|
-
it('should validate output against schema', async () => {
|
|
546
|
-
const outputSchema = z.object({
|
|
547
|
-
processed: z.number(),
|
|
548
|
-
});
|
|
549
|
-
|
|
550
|
-
const subscriber = new Subscriber(
|
|
551
|
-
async ({ events }) => ({
|
|
552
|
-
processed: events.length,
|
|
553
|
-
}),
|
|
554
|
-
30000, // timeout
|
|
555
|
-
undefined, // subscribedEvents
|
|
556
|
-
outputSchema, // outputSchema
|
|
557
|
-
[], // services
|
|
558
|
-
logger, // logger
|
|
559
|
-
);
|
|
560
|
-
|
|
561
|
-
const adapter = new AWSLambdaSubscriber(envParser, subscriber);
|
|
562
|
-
const lambdaHandler = adapter.handler;
|
|
563
|
-
|
|
564
|
-
const sqsEvent = createSQSEvent([
|
|
565
|
-
{
|
|
566
|
-
type: 'user.created',
|
|
567
|
-
payload: { userId: '1', email: 'user1@example.com' },
|
|
568
|
-
},
|
|
569
|
-
{
|
|
570
|
-
type: 'user.created',
|
|
571
|
-
payload: { userId: '2', email: 'user2@example.com' },
|
|
572
|
-
},
|
|
573
|
-
]);
|
|
574
|
-
|
|
575
|
-
const result = await lambdaHandler(
|
|
576
|
-
sqsEvent,
|
|
577
|
-
createMockContext(),
|
|
578
|
-
vi.fn(),
|
|
579
|
-
);
|
|
580
|
-
|
|
581
|
-
expect(result).toEqual({ processed: 2 });
|
|
582
|
-
});
|
|
583
|
-
|
|
584
|
-
it('should fail with invalid output', async () => {
|
|
585
|
-
const outputSchema = z.object({
|
|
586
|
-
processed: z.number(),
|
|
587
|
-
});
|
|
588
|
-
|
|
589
|
-
const subscriber = new Subscriber(
|
|
590
|
-
// @ts-expect-error - intentionally returning wrong type
|
|
591
|
-
async () => ({
|
|
592
|
-
processed: 'not a number',
|
|
593
|
-
}),
|
|
594
|
-
30000, // timeout
|
|
595
|
-
undefined, // subscribedEvents
|
|
596
|
-
outputSchema, // outputSchema
|
|
597
|
-
[], // services
|
|
598
|
-
logger, // logger
|
|
599
|
-
);
|
|
600
|
-
|
|
601
|
-
const adapter = new AWSLambdaSubscriber(envParser, subscriber);
|
|
602
|
-
const lambdaHandler = adapter.handler;
|
|
603
|
-
|
|
604
|
-
const sqsEvent = createSQSEvent([
|
|
605
|
-
{
|
|
606
|
-
type: 'user.created',
|
|
607
|
-
payload: { userId: '1', email: 'user1@example.com' },
|
|
608
|
-
},
|
|
609
|
-
]);
|
|
610
|
-
|
|
611
|
-
await expect(
|
|
612
|
-
lambdaHandler(sqsEvent, createMockContext(), vi.fn()),
|
|
613
|
-
).rejects.toThrow();
|
|
614
|
-
});
|
|
615
|
-
});
|
|
616
|
-
|
|
617
|
-
describe('error handling', () => {
|
|
618
|
-
it('should wrap and log errors', async () => {
|
|
619
|
-
const childLogger = {
|
|
620
|
-
info: vi.fn(),
|
|
621
|
-
error: vi.fn(),
|
|
622
|
-
warn: vi.fn(),
|
|
623
|
-
debug: vi.fn(),
|
|
624
|
-
child: vi.fn(),
|
|
625
|
-
};
|
|
626
|
-
|
|
627
|
-
const mockLogger = {
|
|
628
|
-
child: vi.fn().mockReturnValue(childLogger),
|
|
629
|
-
error: vi.fn(),
|
|
630
|
-
info: vi.fn(),
|
|
631
|
-
warn: vi.fn(),
|
|
632
|
-
debug: vi.fn(),
|
|
633
|
-
};
|
|
634
|
-
|
|
635
|
-
const subscriber = new Subscriber(
|
|
636
|
-
async () => {
|
|
637
|
-
throw new Error('Processing failed');
|
|
638
|
-
},
|
|
639
|
-
30000, // timeout
|
|
640
|
-
undefined, // subscribedEvents
|
|
641
|
-
undefined, // outputSchema
|
|
642
|
-
[], // services
|
|
643
|
-
mockLogger as any, // logger
|
|
644
|
-
);
|
|
645
|
-
|
|
646
|
-
const adapter = new AWSLambdaSubscriber(envParser, subscriber);
|
|
647
|
-
const lambdaHandler = adapter.handler;
|
|
648
|
-
|
|
649
|
-
const sqsEvent = createSQSEvent([
|
|
650
|
-
{
|
|
651
|
-
type: 'user.created',
|
|
652
|
-
payload: { userId: '1', email: 'user1@example.com' },
|
|
653
|
-
},
|
|
654
|
-
]);
|
|
655
|
-
|
|
656
|
-
await expect(
|
|
657
|
-
lambdaHandler(sqsEvent, createMockContext(), vi.fn()),
|
|
658
|
-
).rejects.toThrow();
|
|
659
|
-
|
|
660
|
-
expect(childLogger.error).toHaveBeenCalledWith(
|
|
661
|
-
expect.any(Error),
|
|
662
|
-
'Error processing subscriber',
|
|
663
|
-
);
|
|
664
|
-
});
|
|
665
|
-
|
|
666
|
-
it('should wrap non-JSON SNS message with type from MessageAttributes in SQS', async () => {
|
|
667
|
-
const handler = vi.fn(async ({ events }) => {
|
|
668
|
-
expect(events).toHaveLength(1);
|
|
669
|
-
expect(events[0]).toEqual({
|
|
670
|
-
type: 'notification.sent',
|
|
671
|
-
payload: 'this is not json',
|
|
672
|
-
});
|
|
673
|
-
});
|
|
674
|
-
|
|
675
|
-
const subscriber = new Subscriber(
|
|
676
|
-
handler,
|
|
677
|
-
30000,
|
|
678
|
-
undefined,
|
|
679
|
-
undefined,
|
|
680
|
-
[],
|
|
681
|
-
logger,
|
|
682
|
-
);
|
|
683
|
-
|
|
684
|
-
const adapter = new AWSLambdaSubscriber(envParser, subscriber);
|
|
685
|
-
const lambdaHandler = adapter.handler;
|
|
686
|
-
|
|
687
|
-
const sqsEvent: SQSEvent = {
|
|
688
|
-
Records: [
|
|
689
|
-
{
|
|
690
|
-
messageId: 'message-1',
|
|
691
|
-
receiptHandle: 'receipt-1',
|
|
692
|
-
body: JSON.stringify({
|
|
693
|
-
Type: 'Notification',
|
|
694
|
-
MessageId: 'sns-msg-1',
|
|
695
|
-
TopicArn: 'arn:aws:sns:region:account:topic',
|
|
696
|
-
Message: 'this is not json',
|
|
697
|
-
Timestamp: '2023-01-01T00:00:00.000Z',
|
|
698
|
-
MessageAttributes: {
|
|
699
|
-
type: { Type: 'String', Value: 'notification.sent' },
|
|
700
|
-
},
|
|
701
|
-
}),
|
|
702
|
-
attributes: {} as any,
|
|
703
|
-
messageAttributes: {},
|
|
704
|
-
md5OfBody: 'md5',
|
|
705
|
-
eventSource: 'aws:sqs',
|
|
706
|
-
eventSourceARN: 'arn:aws:sqs:region:account:queue-name',
|
|
707
|
-
awsRegion: 'us-east-1',
|
|
708
|
-
} as SQSRecord,
|
|
709
|
-
],
|
|
710
|
-
};
|
|
711
|
-
|
|
712
|
-
await lambdaHandler(sqsEvent, createMockContext(), vi.fn());
|
|
713
|
-
|
|
714
|
-
expect(handler).toHaveBeenCalled();
|
|
715
|
-
});
|
|
716
|
-
|
|
717
|
-
it('should pass through non-JSON SNS message without type as raw string', async () => {
|
|
718
|
-
const handler = vi.fn(async ({ events }) => {
|
|
719
|
-
expect(events).toHaveLength(1);
|
|
720
|
-
expect(events[0]).toBe('plain text without type');
|
|
721
|
-
});
|
|
722
|
-
|
|
723
|
-
const subscriber = new Subscriber(
|
|
724
|
-
handler,
|
|
725
|
-
30000,
|
|
726
|
-
undefined,
|
|
727
|
-
undefined,
|
|
728
|
-
[],
|
|
729
|
-
logger,
|
|
730
|
-
);
|
|
731
|
-
|
|
732
|
-
const adapter = new AWSLambdaSubscriber(envParser, subscriber);
|
|
733
|
-
const lambdaHandler = adapter.handler;
|
|
734
|
-
|
|
735
|
-
const sqsEvent: SQSEvent = {
|
|
736
|
-
Records: [
|
|
737
|
-
{
|
|
738
|
-
messageId: 'message-1',
|
|
739
|
-
receiptHandle: 'receipt-1',
|
|
740
|
-
body: JSON.stringify({
|
|
741
|
-
Type: 'Notification',
|
|
742
|
-
MessageId: 'sns-msg-1',
|
|
743
|
-
TopicArn: 'arn:aws:sns:region:account:topic',
|
|
744
|
-
Message: 'plain text without type',
|
|
745
|
-
Timestamp: '2023-01-01T00:00:00.000Z',
|
|
746
|
-
}),
|
|
747
|
-
attributes: {} as any,
|
|
748
|
-
messageAttributes: {},
|
|
749
|
-
md5OfBody: 'md5',
|
|
750
|
-
eventSource: 'aws:sqs',
|
|
751
|
-
eventSourceARN: 'arn:aws:sqs:region:account:queue-name',
|
|
752
|
-
awsRegion: 'us-east-1',
|
|
753
|
-
} as SQSRecord,
|
|
754
|
-
],
|
|
755
|
-
};
|
|
756
|
-
|
|
757
|
-
await lambdaHandler(sqsEvent, createMockContext(), vi.fn());
|
|
758
|
-
|
|
759
|
-
expect(handler).toHaveBeenCalled();
|
|
760
|
-
});
|
|
761
|
-
|
|
762
|
-
it('should wrap non-JSON SNS record with type from MessageAttributes', async () => {
|
|
763
|
-
const handler = vi.fn(async ({ events }) => {
|
|
764
|
-
expect(events).toHaveLength(1);
|
|
765
|
-
expect(events[0]).toEqual({
|
|
766
|
-
type: 'alert.fired',
|
|
767
|
-
payload: 'plain text, not json',
|
|
768
|
-
});
|
|
769
|
-
});
|
|
770
|
-
|
|
771
|
-
const subscriber = new Subscriber(
|
|
772
|
-
handler,
|
|
773
|
-
30000,
|
|
774
|
-
undefined,
|
|
775
|
-
undefined,
|
|
776
|
-
[],
|
|
777
|
-
logger,
|
|
778
|
-
);
|
|
779
|
-
|
|
780
|
-
const adapter = new AWSLambdaSubscriber(envParser, subscriber);
|
|
781
|
-
const lambdaHandler = adapter.handler;
|
|
782
|
-
|
|
783
|
-
const snsEvent: SNSEvent = {
|
|
784
|
-
Records: [
|
|
785
|
-
{
|
|
786
|
-
EventSource: 'aws:sns',
|
|
787
|
-
EventVersion: '1.0',
|
|
788
|
-
EventSubscriptionArn: 'arn:aws:sns:region:account:topic',
|
|
789
|
-
Sns: {
|
|
790
|
-
Type: 'Notification',
|
|
791
|
-
MessageId: 'msg-1',
|
|
792
|
-
TopicArn: 'arn:aws:sns:region:account:topic',
|
|
793
|
-
Subject: 'Test',
|
|
794
|
-
Message: 'plain text, not json',
|
|
795
|
-
Timestamp: '2023-01-01T00:00:00.000Z',
|
|
796
|
-
SignatureVersion: '1',
|
|
797
|
-
Signature: 'sig',
|
|
798
|
-
SigningCertUrl: 'https://example.com/cert',
|
|
799
|
-
UnsubscribeUrl: 'https://example.com/unsub',
|
|
800
|
-
MessageAttributes: {
|
|
801
|
-
type: { Type: 'String', Value: 'alert.fired' },
|
|
802
|
-
},
|
|
803
|
-
},
|
|
804
|
-
} as SNSEventRecord,
|
|
805
|
-
],
|
|
806
|
-
};
|
|
807
|
-
|
|
808
|
-
await lambdaHandler(snsEvent, createMockContext(), vi.fn());
|
|
809
|
-
|
|
810
|
-
expect(handler).toHaveBeenCalled();
|
|
811
|
-
});
|
|
812
|
-
|
|
813
|
-
it('should pass through non-JSON SNS record without type as raw string', async () => {
|
|
814
|
-
const handler = vi.fn(async ({ events }) => {
|
|
815
|
-
expect(events).toHaveLength(1);
|
|
816
|
-
expect(events[0]).toBe('plain text, no type attr');
|
|
817
|
-
});
|
|
818
|
-
|
|
819
|
-
const subscriber = new Subscriber(
|
|
820
|
-
handler,
|
|
821
|
-
30000,
|
|
822
|
-
undefined,
|
|
823
|
-
undefined,
|
|
824
|
-
[],
|
|
825
|
-
logger,
|
|
826
|
-
);
|
|
827
|
-
|
|
828
|
-
const adapter = new AWSLambdaSubscriber(envParser, subscriber);
|
|
829
|
-
const lambdaHandler = adapter.handler;
|
|
830
|
-
|
|
831
|
-
const snsEvent: SNSEvent = {
|
|
832
|
-
Records: [
|
|
833
|
-
{
|
|
834
|
-
EventSource: 'aws:sns',
|
|
835
|
-
EventVersion: '1.0',
|
|
836
|
-
EventSubscriptionArn: 'arn:aws:sns:region:account:topic',
|
|
837
|
-
Sns: {
|
|
838
|
-
Type: 'Notification',
|
|
839
|
-
MessageId: 'msg-1',
|
|
840
|
-
TopicArn: 'arn:aws:sns:region:account:topic',
|
|
841
|
-
Subject: 'Test',
|
|
842
|
-
Message: 'plain text, no type attr',
|
|
843
|
-
Timestamp: '2023-01-01T00:00:00.000Z',
|
|
844
|
-
SignatureVersion: '1',
|
|
845
|
-
Signature: 'sig',
|
|
846
|
-
SigningCertUrl: 'https://example.com/cert',
|
|
847
|
-
UnsubscribeUrl: 'https://example.com/unsub',
|
|
848
|
-
},
|
|
849
|
-
} as SNSEventRecord,
|
|
850
|
-
],
|
|
851
|
-
};
|
|
852
|
-
|
|
853
|
-
await lambdaHandler(snsEvent, createMockContext(), vi.fn());
|
|
854
|
-
|
|
855
|
-
expect(handler).toHaveBeenCalled();
|
|
856
|
-
});
|
|
857
|
-
|
|
858
|
-
it('should pass through non-JSON SQS body', async () => {
|
|
859
|
-
const handler = vi.fn(async ({ events }) => {
|
|
860
|
-
expect(events).toHaveLength(1);
|
|
861
|
-
expect(events[0]).toBe('raw text body');
|
|
862
|
-
});
|
|
863
|
-
|
|
864
|
-
const subscriber = new Subscriber(
|
|
865
|
-
handler,
|
|
866
|
-
30000,
|
|
867
|
-
undefined,
|
|
868
|
-
undefined,
|
|
869
|
-
[],
|
|
870
|
-
logger,
|
|
871
|
-
);
|
|
872
|
-
|
|
873
|
-
const adapter = new AWSLambdaSubscriber(envParser, subscriber);
|
|
874
|
-
const lambdaHandler = adapter.handler;
|
|
875
|
-
|
|
876
|
-
const sqsEvent: SQSEvent = {
|
|
877
|
-
Records: [
|
|
878
|
-
{
|
|
879
|
-
messageId: 'message-1',
|
|
880
|
-
receiptHandle: 'receipt-1',
|
|
881
|
-
body: 'raw text body',
|
|
882
|
-
attributes: {} as any,
|
|
883
|
-
messageAttributes: {},
|
|
884
|
-
md5OfBody: 'md5',
|
|
885
|
-
eventSource: 'aws:sqs',
|
|
886
|
-
eventSourceARN: 'arn:aws:sqs:region:account:queue-name',
|
|
887
|
-
awsRegion: 'us-east-1',
|
|
888
|
-
} as SQSRecord,
|
|
889
|
-
],
|
|
890
|
-
};
|
|
891
|
-
|
|
892
|
-
await lambdaHandler(sqsEvent, createMockContext(), vi.fn());
|
|
893
|
-
|
|
894
|
-
expect(handler).toHaveBeenCalled();
|
|
895
|
-
});
|
|
896
|
-
|
|
897
|
-
it('should pass through invalid JSON SQS records alongside valid ones', async () => {
|
|
898
|
-
const handler = vi.fn(async ({ events }) => {
|
|
899
|
-
// Both records should be passed through
|
|
900
|
-
expect(events).toHaveLength(2);
|
|
901
|
-
expect(events[0]).toBe('invalid json{');
|
|
902
|
-
expect(events[1]).toEqual({
|
|
903
|
-
type: 'user.created',
|
|
904
|
-
payload: { userId: '1', email: 'user1@example.com' },
|
|
905
|
-
});
|
|
906
|
-
});
|
|
907
|
-
|
|
908
|
-
const subscriber = new Subscriber(
|
|
909
|
-
handler,
|
|
910
|
-
30000,
|
|
911
|
-
undefined,
|
|
912
|
-
undefined,
|
|
913
|
-
[],
|
|
914
|
-
logger,
|
|
915
|
-
);
|
|
916
|
-
|
|
917
|
-
const adapter = new AWSLambdaSubscriber(envParser, subscriber);
|
|
918
|
-
const lambdaHandler = adapter.handler;
|
|
919
|
-
|
|
920
|
-
const sqsEvent: SQSEvent = {
|
|
921
|
-
Records: [
|
|
922
|
-
{
|
|
923
|
-
messageId: 'message-1',
|
|
924
|
-
receiptHandle: 'receipt-1',
|
|
925
|
-
body: 'invalid json{',
|
|
926
|
-
attributes: {} as any,
|
|
927
|
-
messageAttributes: {},
|
|
928
|
-
md5OfBody: 'md5',
|
|
929
|
-
eventSource: 'aws:sqs',
|
|
930
|
-
eventSourceARN: 'arn:aws:sqs:region:account:queue-name',
|
|
931
|
-
awsRegion: 'us-east-1',
|
|
932
|
-
} as SQSRecord,
|
|
933
|
-
{
|
|
934
|
-
messageId: 'message-2',
|
|
935
|
-
receiptHandle: 'receipt-2',
|
|
936
|
-
body: JSON.stringify({
|
|
937
|
-
type: 'user.created',
|
|
938
|
-
payload: { userId: '1', email: 'user1@example.com' },
|
|
939
|
-
}),
|
|
940
|
-
attributes: {} as any,
|
|
941
|
-
messageAttributes: {},
|
|
942
|
-
md5OfBody: 'md5',
|
|
943
|
-
eventSource: 'aws:sqs',
|
|
944
|
-
eventSourceARN: 'arn:aws:sqs:region:account:queue-name',
|
|
945
|
-
awsRegion: 'us-east-1',
|
|
946
|
-
} as SQSRecord,
|
|
947
|
-
],
|
|
948
|
-
};
|
|
949
|
-
|
|
950
|
-
await lambdaHandler(sqsEvent, createMockContext(), vi.fn());
|
|
951
|
-
|
|
952
|
-
expect(handler).toHaveBeenCalled();
|
|
953
|
-
});
|
|
954
|
-
});
|
|
955
|
-
|
|
956
|
-
describe('request context', () => {
|
|
957
|
-
it('should make serviceContext.getLogger() available inside handler', async () => {
|
|
958
|
-
let contextLogger: any;
|
|
959
|
-
let contextRequestId: string | undefined;
|
|
960
|
-
|
|
961
|
-
const handler = vi.fn(async () => {
|
|
962
|
-
contextLogger = serviceContext.getLogger();
|
|
963
|
-
contextRequestId = serviceContext.getRequestId();
|
|
964
|
-
return {};
|
|
965
|
-
});
|
|
966
|
-
|
|
967
|
-
const subscriber = new Subscriber(
|
|
968
|
-
handler,
|
|
969
|
-
30000,
|
|
970
|
-
['user.created'] as any,
|
|
971
|
-
undefined,
|
|
972
|
-
[],
|
|
973
|
-
logger,
|
|
974
|
-
);
|
|
975
|
-
|
|
976
|
-
const adaptor = new AWSLambdaSubscriber(envParser, subscriber);
|
|
977
|
-
const lambdaHandler = adaptor.handler;
|
|
978
|
-
|
|
979
|
-
const sqsEvent = createSQSEvent([
|
|
980
|
-
{ type: 'user.created', payload: { userId: '1' } },
|
|
981
|
-
]);
|
|
982
|
-
|
|
983
|
-
await lambdaHandler(sqsEvent, createMockContext(), vi.fn());
|
|
984
|
-
|
|
985
|
-
expect(contextLogger).toBeDefined();
|
|
986
|
-
expect(contextRequestId).toBe('test-request-id');
|
|
987
|
-
});
|
|
988
|
-
|
|
989
|
-
it('should make serviceContext.hasContext() return true inside handler', async () => {
|
|
990
|
-
let hasContext = false;
|
|
991
|
-
|
|
992
|
-
const handler = vi.fn(async () => {
|
|
993
|
-
hasContext = serviceContext.hasContext();
|
|
994
|
-
return {};
|
|
995
|
-
});
|
|
996
|
-
|
|
997
|
-
const subscriber = new Subscriber(
|
|
998
|
-
handler,
|
|
999
|
-
30000,
|
|
1000
|
-
['user.created'] as any,
|
|
1001
|
-
undefined,
|
|
1002
|
-
[],
|
|
1003
|
-
logger,
|
|
1004
|
-
);
|
|
1005
|
-
|
|
1006
|
-
const adaptor = new AWSLambdaSubscriber(envParser, subscriber);
|
|
1007
|
-
const lambdaHandler = adaptor.handler;
|
|
1008
|
-
|
|
1009
|
-
const sqsEvent = createSQSEvent([
|
|
1010
|
-
{ type: 'user.created', payload: { userId: '1' } },
|
|
1011
|
-
]);
|
|
1012
|
-
|
|
1013
|
-
await lambdaHandler(sqsEvent, createMockContext(), vi.fn());
|
|
1014
|
-
|
|
1015
|
-
expect(hasContext).toBe(true);
|
|
1016
|
-
});
|
|
1017
|
-
});
|
|
1018
|
-
});
|