@geekmidas/constructs 9.0.2 → 10.0.0-alpha.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.
- package/README.md +71 -44
- package/dist/{AWSScheduledFunction-Bn99MceY.d.cts → AWSScheduledFunction-BvFvBsBN.d.cts} +8 -3
- package/dist/{AWSScheduledFunction-ysaCsdWx.d.mts.map → AWSScheduledFunction-BvFvBsBN.d.cts.map} +1 -1
- package/dist/{AWSScheduledFunction-ysaCsdWx.d.mts → AWSScheduledFunction-CVccZO-L.d.mts} +9 -4
- package/dist/{AWSScheduledFunction-Bn99MceY.d.cts.map → AWSScheduledFunction-CVccZO-L.d.mts.map} +1 -1
- package/dist/{AWSScheduledFunction-CufMMhGB.mjs → AWSScheduledFunction-Db1lttJH.mjs} +3 -3
- package/dist/{AWSScheduledFunction-CufMMhGB.mjs.map → AWSScheduledFunction-Db1lttJH.mjs.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-HmWM6YYu.mjs} +4 -3
- package/dist/Construct-HmWM6YYu.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/{lazyAccessors-DfqZR6C4.mjs → Endpoint-BGwpNEX4.mjs} +840 -1003
- package/dist/Endpoint-BGwpNEX4.mjs.map +1 -0
- package/dist/{Endpoint-DgfRslct.d.cts → Endpoint-BnxZqIX-.d.cts} +53 -4
- package/dist/Endpoint-BnxZqIX-.d.cts.map +1 -0
- package/dist/{Endpoint-CLPSIl6S.d.mts → Endpoint-ROcXU-eH.d.mts} +55 -6
- package/dist/Endpoint-ROcXU-eH.d.mts.map +1 -0
- package/dist/EndpointFactory-DYoGLaIT.cjs +850 -0
- package/dist/EndpointFactory-DYoGLaIT.cjs.map +1 -0
- package/dist/EndpointFactory-Di0X9AWp.mjs +808 -0
- package/dist/EndpointFactory-Di0X9AWp.mjs.map +1 -0
- package/dist/{HonoEndpointAdaptor-DJDT3PMx.mjs → HonoEndpointAdaptor-DFKIIG2o.mjs} +5 -4
- package/dist/HonoEndpointAdaptor-DFKIIG2o.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-CvT_q7Y4.mjs} +55 -51
- package/dist/functions-CvT_q7Y4.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-7OcOWe75.d.cts +419 -0
- package/dist/index-7OcOWe75.d.cts.map +1 -0
- package/dist/index-Bt-F7u8L.d.mts +419 -0
- package/dist/index-Bt-F7u8L.d.mts.map +1 -0
- package/dist/{index-DP6fqv0I.d.mts → index-CPeqtKgq.d.mts} +48 -19
- package/dist/index-CPeqtKgq.d.mts.map +1 -0
- package/dist/{index-BVs9DvIj.d.cts → index-Dadljnh_.d.cts} +36 -9
- package/dist/index-Dadljnh_.d.cts.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,652 +0,0 @@
|
|
|
1
|
-
import type { EventPublisher, PublishableMessage } from '@geekmidas/events';
|
|
2
|
-
import type { Logger } from '@geekmidas/logger';
|
|
3
|
-
import { ConsoleLogger } from '@geekmidas/logger/console';
|
|
4
|
-
import type { Service } from '@geekmidas/services';
|
|
5
|
-
import { serviceContext } from '@geekmidas/services';
|
|
6
|
-
import { beforeEach, describe, expect, it, vi } from 'vitest';
|
|
7
|
-
import { z } from 'zod';
|
|
8
|
-
import { Subscriber } from '../Subscriber';
|
|
9
|
-
import { SubscriberBuilder } from '../SubscriberBuilder';
|
|
10
|
-
import { TestSubscriberAdaptor } from '../TestSubscriberAdaptor';
|
|
11
|
-
|
|
12
|
-
// --- Test fixtures ---
|
|
13
|
-
|
|
14
|
-
type UserEvent =
|
|
15
|
-
| PublishableMessage<
|
|
16
|
-
'user.created',
|
|
17
|
-
{ userId: string; email: string; name: string }
|
|
18
|
-
>
|
|
19
|
-
| PublishableMessage<
|
|
20
|
-
'user.updated',
|
|
21
|
-
{ userId: string; changes: Record<string, any> }
|
|
22
|
-
>
|
|
23
|
-
| PublishableMessage<'user.deleted', { userId: string }>;
|
|
24
|
-
|
|
25
|
-
class TestEventPublisher implements EventPublisher<UserEvent> {
|
|
26
|
-
publishedEvents: UserEvent[] = [];
|
|
27
|
-
async publish(events: UserEvent[]): Promise<void> {
|
|
28
|
-
this.publishedEvents.push(...events);
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
const TestEventService: Service<'testEventPublisher', TestEventPublisher> = {
|
|
33
|
-
serviceName: 'testEventPublisher' as const,
|
|
34
|
-
register() {
|
|
35
|
-
return new TestEventPublisher();
|
|
36
|
-
},
|
|
37
|
-
};
|
|
38
|
-
|
|
39
|
-
const TestDbService: Service<'db', { query: () => string }> = {
|
|
40
|
-
serviceName: 'db' as const,
|
|
41
|
-
register() {
|
|
42
|
-
return { query: () => 'result' };
|
|
43
|
-
},
|
|
44
|
-
};
|
|
45
|
-
|
|
46
|
-
describe('TestSubscriberAdaptor', () => {
|
|
47
|
-
let logger: ConsoleLogger;
|
|
48
|
-
|
|
49
|
-
beforeEach(() => {
|
|
50
|
-
logger = new ConsoleLogger();
|
|
51
|
-
vi.clearAllMocks();
|
|
52
|
-
});
|
|
53
|
-
|
|
54
|
-
describe('basic execution', () => {
|
|
55
|
-
it('should invoke a subscriber and return result', async () => {
|
|
56
|
-
const subscriber = new SubscriberBuilder()
|
|
57
|
-
.publisher(TestEventService)
|
|
58
|
-
.subscribe('user.created')
|
|
59
|
-
.handle(async ({ events }) => ({
|
|
60
|
-
processed: events.length,
|
|
61
|
-
}));
|
|
62
|
-
|
|
63
|
-
const adaptor = new TestSubscriberAdaptor(subscriber);
|
|
64
|
-
|
|
65
|
-
const result = await adaptor.invoke({
|
|
66
|
-
events: [
|
|
67
|
-
{
|
|
68
|
-
type: 'user.created',
|
|
69
|
-
payload: {
|
|
70
|
-
userId: '1',
|
|
71
|
-
email: 'test@example.com',
|
|
72
|
-
name: 'Test',
|
|
73
|
-
},
|
|
74
|
-
},
|
|
75
|
-
],
|
|
76
|
-
services: {},
|
|
77
|
-
});
|
|
78
|
-
|
|
79
|
-
expect(result).toEqual({ processed: 1 });
|
|
80
|
-
});
|
|
81
|
-
|
|
82
|
-
it('should return early with batchItemFailures for empty events', async () => {
|
|
83
|
-
const handler = vi.fn(async () => ({ processed: 0 }));
|
|
84
|
-
const subscriber = new SubscriberBuilder()
|
|
85
|
-
.publisher(TestEventService)
|
|
86
|
-
.subscribe('user.created')
|
|
87
|
-
.handle(handler);
|
|
88
|
-
|
|
89
|
-
const adaptor = new TestSubscriberAdaptor(subscriber);
|
|
90
|
-
|
|
91
|
-
const result = await adaptor.invoke({
|
|
92
|
-
events: [],
|
|
93
|
-
services: {},
|
|
94
|
-
});
|
|
95
|
-
|
|
96
|
-
expect(result).toEqual({ batchItemFailures: [] });
|
|
97
|
-
expect(handler).not.toHaveBeenCalled();
|
|
98
|
-
});
|
|
99
|
-
|
|
100
|
-
it('should handle multiple events in a batch', async () => {
|
|
101
|
-
const processedIds: string[] = [];
|
|
102
|
-
const subscriber = new SubscriberBuilder()
|
|
103
|
-
.publisher(TestEventService)
|
|
104
|
-
.subscribe(['user.created', 'user.updated'])
|
|
105
|
-
.handle(async ({ events }) => {
|
|
106
|
-
for (const event of events) {
|
|
107
|
-
processedIds.push(event.payload.userId);
|
|
108
|
-
}
|
|
109
|
-
return { count: events.length };
|
|
110
|
-
});
|
|
111
|
-
|
|
112
|
-
const adaptor = new TestSubscriberAdaptor(subscriber);
|
|
113
|
-
|
|
114
|
-
const result = await adaptor.invoke({
|
|
115
|
-
events: [
|
|
116
|
-
{
|
|
117
|
-
type: 'user.created',
|
|
118
|
-
payload: {
|
|
119
|
-
userId: '1',
|
|
120
|
-
email: 'a@b.com',
|
|
121
|
-
name: 'A',
|
|
122
|
-
},
|
|
123
|
-
},
|
|
124
|
-
{
|
|
125
|
-
type: 'user.updated',
|
|
126
|
-
payload: {
|
|
127
|
-
userId: '2',
|
|
128
|
-
changes: { name: 'B' },
|
|
129
|
-
},
|
|
130
|
-
},
|
|
131
|
-
] as any,
|
|
132
|
-
services: {},
|
|
133
|
-
});
|
|
134
|
-
|
|
135
|
-
expect(result).toEqual({ count: 2 });
|
|
136
|
-
expect(processedIds).toEqual(['1', '2']);
|
|
137
|
-
});
|
|
138
|
-
});
|
|
139
|
-
|
|
140
|
-
describe('output validation', () => {
|
|
141
|
-
it('should validate output against schema', async () => {
|
|
142
|
-
const outputSchema = z.object({ processed: z.number() });
|
|
143
|
-
|
|
144
|
-
const subscriber = new SubscriberBuilder()
|
|
145
|
-
.publisher(TestEventService)
|
|
146
|
-
.output(outputSchema)
|
|
147
|
-
.subscribe('user.created')
|
|
148
|
-
.handle(async ({ events }) => ({
|
|
149
|
-
processed: events.length,
|
|
150
|
-
}));
|
|
151
|
-
|
|
152
|
-
const adaptor = new TestSubscriberAdaptor(subscriber);
|
|
153
|
-
|
|
154
|
-
const result = await adaptor.invoke({
|
|
155
|
-
events: [
|
|
156
|
-
{
|
|
157
|
-
type: 'user.created',
|
|
158
|
-
payload: {
|
|
159
|
-
userId: '1',
|
|
160
|
-
email: 'test@example.com',
|
|
161
|
-
name: 'Test',
|
|
162
|
-
},
|
|
163
|
-
},
|
|
164
|
-
],
|
|
165
|
-
services: {},
|
|
166
|
-
});
|
|
167
|
-
|
|
168
|
-
expect(result).toEqual({ processed: 1 });
|
|
169
|
-
});
|
|
170
|
-
|
|
171
|
-
it('should throw on invalid output', async () => {
|
|
172
|
-
const outputSchema = z.object({ processed: z.number() });
|
|
173
|
-
|
|
174
|
-
const subscriber = new SubscriberBuilder()
|
|
175
|
-
.publisher(TestEventService)
|
|
176
|
-
.output(outputSchema)
|
|
177
|
-
.subscribe('user.created')
|
|
178
|
-
.handle(async () => ({
|
|
179
|
-
processed: 'not-a-number' as any,
|
|
180
|
-
}));
|
|
181
|
-
|
|
182
|
-
const adaptor = new TestSubscriberAdaptor(subscriber);
|
|
183
|
-
|
|
184
|
-
await expect(
|
|
185
|
-
adaptor.invoke({
|
|
186
|
-
events: [
|
|
187
|
-
{
|
|
188
|
-
type: 'user.created',
|
|
189
|
-
payload: {
|
|
190
|
-
userId: '1',
|
|
191
|
-
email: 'test@example.com',
|
|
192
|
-
name: 'Test',
|
|
193
|
-
},
|
|
194
|
-
},
|
|
195
|
-
],
|
|
196
|
-
services: {},
|
|
197
|
-
}),
|
|
198
|
-
).rejects.toThrow('Subscriber output validation failed');
|
|
199
|
-
});
|
|
200
|
-
});
|
|
201
|
-
|
|
202
|
-
describe('event filtering', () => {
|
|
203
|
-
it('should filter out events not in subscribedEvents', async () => {
|
|
204
|
-
const receivedEvents: any[] = [];
|
|
205
|
-
const subscriber = new SubscriberBuilder()
|
|
206
|
-
.publisher(TestEventService)
|
|
207
|
-
.subscribe('user.created')
|
|
208
|
-
.handle(async ({ events }) => {
|
|
209
|
-
receivedEvents.push(...events);
|
|
210
|
-
return { count: events.length };
|
|
211
|
-
});
|
|
212
|
-
|
|
213
|
-
const adaptor = new TestSubscriberAdaptor(subscriber);
|
|
214
|
-
|
|
215
|
-
const result = await adaptor.invoke({
|
|
216
|
-
events: [
|
|
217
|
-
{
|
|
218
|
-
type: 'user.created',
|
|
219
|
-
payload: {
|
|
220
|
-
userId: '1',
|
|
221
|
-
email: 'a@b.com',
|
|
222
|
-
name: 'A',
|
|
223
|
-
},
|
|
224
|
-
},
|
|
225
|
-
// This event type is not subscribed — should be filtered
|
|
226
|
-
{
|
|
227
|
-
type: 'user.deleted',
|
|
228
|
-
payload: { userId: '2' },
|
|
229
|
-
},
|
|
230
|
-
] as any,
|
|
231
|
-
services: {},
|
|
232
|
-
});
|
|
233
|
-
|
|
234
|
-
expect(result).toEqual({ count: 1 });
|
|
235
|
-
expect(receivedEvents).toHaveLength(1);
|
|
236
|
-
expect(receivedEvents[0].type).toBe('user.created');
|
|
237
|
-
});
|
|
238
|
-
|
|
239
|
-
it('should return early if all events are filtered out', async () => {
|
|
240
|
-
const handler = vi.fn(async () => ({}));
|
|
241
|
-
const subscriber = new SubscriberBuilder()
|
|
242
|
-
.publisher(TestEventService)
|
|
243
|
-
.subscribe('user.created')
|
|
244
|
-
.handle(handler);
|
|
245
|
-
|
|
246
|
-
const adaptor = new TestSubscriberAdaptor(subscriber);
|
|
247
|
-
|
|
248
|
-
const result = await adaptor.invoke({
|
|
249
|
-
events: [
|
|
250
|
-
{
|
|
251
|
-
type: 'user.deleted',
|
|
252
|
-
payload: { userId: '1' },
|
|
253
|
-
},
|
|
254
|
-
] as any,
|
|
255
|
-
services: {},
|
|
256
|
-
});
|
|
257
|
-
|
|
258
|
-
expect(result).toEqual({ batchItemFailures: [] });
|
|
259
|
-
expect(handler).not.toHaveBeenCalled();
|
|
260
|
-
});
|
|
261
|
-
|
|
262
|
-
it('should accept all events when subscribedEvents is undefined', async () => {
|
|
263
|
-
// Build a subscriber without .subscribe() — accepts all
|
|
264
|
-
const subscriber = new Subscriber(
|
|
265
|
-
async ({ events }) => ({ count: events.length }),
|
|
266
|
-
30000,
|
|
267
|
-
undefined, // no subscribedEvents filter
|
|
268
|
-
);
|
|
269
|
-
|
|
270
|
-
const adaptor = new TestSubscriberAdaptor(subscriber as any);
|
|
271
|
-
|
|
272
|
-
const result = await adaptor.invoke({
|
|
273
|
-
events: [
|
|
274
|
-
{ type: 'user.created', payload: { userId: '1' } },
|
|
275
|
-
{ type: 'user.deleted', payload: { userId: '2' } },
|
|
276
|
-
] as any,
|
|
277
|
-
services: {},
|
|
278
|
-
});
|
|
279
|
-
|
|
280
|
-
expect(result).toEqual({ count: 2 });
|
|
281
|
-
});
|
|
282
|
-
});
|
|
283
|
-
|
|
284
|
-
describe('services', () => {
|
|
285
|
-
it('should use provided services from request', async () => {
|
|
286
|
-
const subscriber = new SubscriberBuilder()
|
|
287
|
-
.publisher(TestEventService)
|
|
288
|
-
.services([TestDbService])
|
|
289
|
-
.subscribe('user.created')
|
|
290
|
-
.handle(async ({ services }) => ({
|
|
291
|
-
value: services.db.query(),
|
|
292
|
-
}));
|
|
293
|
-
|
|
294
|
-
const adaptor = new TestSubscriberAdaptor(subscriber);
|
|
295
|
-
|
|
296
|
-
const result = await adaptor.invoke({
|
|
297
|
-
events: [
|
|
298
|
-
{
|
|
299
|
-
type: 'user.created',
|
|
300
|
-
payload: {
|
|
301
|
-
userId: '1',
|
|
302
|
-
email: 'a@b.com',
|
|
303
|
-
name: 'A',
|
|
304
|
-
},
|
|
305
|
-
},
|
|
306
|
-
],
|
|
307
|
-
services: { db: { query: () => 'injected-result' } },
|
|
308
|
-
});
|
|
309
|
-
|
|
310
|
-
expect(result).toEqual({ value: 'injected-result' });
|
|
311
|
-
});
|
|
312
|
-
|
|
313
|
-
it('should auto-resolve services when not provided', async () => {
|
|
314
|
-
const subscriber = new SubscriberBuilder()
|
|
315
|
-
.publisher(TestEventService)
|
|
316
|
-
.services([TestDbService])
|
|
317
|
-
.subscribe('user.created')
|
|
318
|
-
.handle(async ({ services }) => ({
|
|
319
|
-
value: services.db.query(),
|
|
320
|
-
}));
|
|
321
|
-
|
|
322
|
-
const adaptor = new TestSubscriberAdaptor(subscriber);
|
|
323
|
-
|
|
324
|
-
const result = await adaptor.invoke({
|
|
325
|
-
events: [
|
|
326
|
-
{
|
|
327
|
-
type: 'user.created',
|
|
328
|
-
payload: {
|
|
329
|
-
userId: '1',
|
|
330
|
-
email: 'a@b.com',
|
|
331
|
-
name: 'A',
|
|
332
|
-
},
|
|
333
|
-
},
|
|
334
|
-
],
|
|
335
|
-
});
|
|
336
|
-
|
|
337
|
-
expect(result).toEqual({ value: 'result' });
|
|
338
|
-
});
|
|
339
|
-
|
|
340
|
-
it('should use custom ServiceDiscovery when provided', async () => {
|
|
341
|
-
const subscriber = new SubscriberBuilder()
|
|
342
|
-
.publisher(TestEventService)
|
|
343
|
-
.services([TestDbService])
|
|
344
|
-
.subscribe('user.created')
|
|
345
|
-
.handle(async ({ services }) => ({
|
|
346
|
-
value: services.db.query(),
|
|
347
|
-
}));
|
|
348
|
-
|
|
349
|
-
const mockDiscovery = {
|
|
350
|
-
register: vi.fn().mockResolvedValue({
|
|
351
|
-
db: { query: () => 'custom-discovery' },
|
|
352
|
-
}),
|
|
353
|
-
} as any;
|
|
354
|
-
|
|
355
|
-
const adaptor = new TestSubscriberAdaptor(subscriber, mockDiscovery);
|
|
356
|
-
|
|
357
|
-
const result = await adaptor.invoke({
|
|
358
|
-
events: [
|
|
359
|
-
{
|
|
360
|
-
type: 'user.created',
|
|
361
|
-
payload: {
|
|
362
|
-
userId: '1',
|
|
363
|
-
email: 'a@b.com',
|
|
364
|
-
name: 'A',
|
|
365
|
-
},
|
|
366
|
-
},
|
|
367
|
-
],
|
|
368
|
-
});
|
|
369
|
-
|
|
370
|
-
expect(result).toEqual({ value: 'custom-discovery' });
|
|
371
|
-
expect(mockDiscovery.register).toHaveBeenCalledWith(subscriber.services);
|
|
372
|
-
});
|
|
373
|
-
});
|
|
374
|
-
|
|
375
|
-
describe('logging', () => {
|
|
376
|
-
it('should create child logger with test context', async () => {
|
|
377
|
-
const mockLogger: Logger = {
|
|
378
|
-
debug: vi.fn(),
|
|
379
|
-
info: vi.fn(),
|
|
380
|
-
warn: vi.fn(),
|
|
381
|
-
error: vi.fn(),
|
|
382
|
-
fatal: vi.fn(),
|
|
383
|
-
trace: vi.fn(),
|
|
384
|
-
child: vi.fn().mockReturnThis(),
|
|
385
|
-
};
|
|
386
|
-
|
|
387
|
-
const subscriber = new SubscriberBuilder()
|
|
388
|
-
.publisher(TestEventService)
|
|
389
|
-
.logger(mockLogger)
|
|
390
|
-
.subscribe('user.created')
|
|
391
|
-
.handle(async ({ logger }) => {
|
|
392
|
-
logger.info('Processing events');
|
|
393
|
-
return {};
|
|
394
|
-
});
|
|
395
|
-
|
|
396
|
-
const adaptor = new TestSubscriberAdaptor(subscriber);
|
|
397
|
-
|
|
398
|
-
await adaptor.invoke({
|
|
399
|
-
events: [
|
|
400
|
-
{
|
|
401
|
-
type: 'user.created',
|
|
402
|
-
payload: {
|
|
403
|
-
userId: '1',
|
|
404
|
-
email: 'a@b.com',
|
|
405
|
-
name: 'A',
|
|
406
|
-
},
|
|
407
|
-
},
|
|
408
|
-
],
|
|
409
|
-
services: {},
|
|
410
|
-
});
|
|
411
|
-
|
|
412
|
-
expect(mockLogger.child).toHaveBeenCalledWith({ test: true });
|
|
413
|
-
expect(mockLogger.info).toHaveBeenCalledWith('Processing events');
|
|
414
|
-
});
|
|
415
|
-
});
|
|
416
|
-
|
|
417
|
-
describe('event publishing', () => {
|
|
418
|
-
it('should publish events after successful execution', async () => {
|
|
419
|
-
const testPublisher = new TestEventPublisher();
|
|
420
|
-
const publisherService: Service<'publisher', TestEventPublisher> = {
|
|
421
|
-
serviceName: 'publisher' as const,
|
|
422
|
-
register() {
|
|
423
|
-
return testPublisher;
|
|
424
|
-
},
|
|
425
|
-
};
|
|
426
|
-
|
|
427
|
-
const subscriber = new Subscriber(
|
|
428
|
-
async ({ events }) => ({
|
|
429
|
-
count: events.length,
|
|
430
|
-
}),
|
|
431
|
-
30000,
|
|
432
|
-
['user.created'] as any,
|
|
433
|
-
z.object({ count: z.number() }),
|
|
434
|
-
[],
|
|
435
|
-
logger,
|
|
436
|
-
publisherService as any,
|
|
437
|
-
);
|
|
438
|
-
|
|
439
|
-
// Add events to publish after handler completes
|
|
440
|
-
(subscriber as any).events = [
|
|
441
|
-
{
|
|
442
|
-
type: 'user.updated',
|
|
443
|
-
payload: (response: any) => ({
|
|
444
|
-
userId: 'derived',
|
|
445
|
-
changes: { count: response.count },
|
|
446
|
-
}),
|
|
447
|
-
},
|
|
448
|
-
];
|
|
449
|
-
|
|
450
|
-
const adaptor = new TestSubscriberAdaptor(subscriber as any);
|
|
451
|
-
|
|
452
|
-
await adaptor.invoke({
|
|
453
|
-
events: [
|
|
454
|
-
{
|
|
455
|
-
type: 'user.created',
|
|
456
|
-
payload: {
|
|
457
|
-
userId: '1',
|
|
458
|
-
email: 'a@b.com',
|
|
459
|
-
name: 'A',
|
|
460
|
-
},
|
|
461
|
-
},
|
|
462
|
-
] as any,
|
|
463
|
-
services: {},
|
|
464
|
-
});
|
|
465
|
-
|
|
466
|
-
expect(testPublisher.publishedEvents).toHaveLength(1);
|
|
467
|
-
expect(testPublisher.publishedEvents[0]).toEqual({
|
|
468
|
-
type: 'user.updated',
|
|
469
|
-
payload: { userId: 'derived', changes: { count: 1 } },
|
|
470
|
-
});
|
|
471
|
-
});
|
|
472
|
-
|
|
473
|
-
it('should conditionally publish events with when clause', async () => {
|
|
474
|
-
const testPublisher = new TestEventPublisher();
|
|
475
|
-
const publisherService: Service<'publisher', TestEventPublisher> = {
|
|
476
|
-
serviceName: 'publisher' as const,
|
|
477
|
-
register() {
|
|
478
|
-
return testPublisher;
|
|
479
|
-
},
|
|
480
|
-
};
|
|
481
|
-
|
|
482
|
-
const subscriber = new Subscriber(
|
|
483
|
-
async () => ({ success: false }),
|
|
484
|
-
30000,
|
|
485
|
-
['user.created'] as any,
|
|
486
|
-
z.object({ success: z.boolean() }),
|
|
487
|
-
[],
|
|
488
|
-
logger,
|
|
489
|
-
publisherService as any,
|
|
490
|
-
);
|
|
491
|
-
|
|
492
|
-
(subscriber as any).events = [
|
|
493
|
-
{
|
|
494
|
-
type: 'user.updated',
|
|
495
|
-
payload: () => ({
|
|
496
|
-
userId: 'test',
|
|
497
|
-
changes: {},
|
|
498
|
-
}),
|
|
499
|
-
when: (response: any) => response.success === true,
|
|
500
|
-
},
|
|
501
|
-
];
|
|
502
|
-
|
|
503
|
-
const adaptor = new TestSubscriberAdaptor(subscriber as any);
|
|
504
|
-
|
|
505
|
-
await adaptor.invoke({
|
|
506
|
-
events: [
|
|
507
|
-
{
|
|
508
|
-
type: 'user.created',
|
|
509
|
-
payload: {
|
|
510
|
-
userId: '1',
|
|
511
|
-
email: 'a@b.com',
|
|
512
|
-
name: 'A',
|
|
513
|
-
},
|
|
514
|
-
},
|
|
515
|
-
] as any,
|
|
516
|
-
services: {},
|
|
517
|
-
});
|
|
518
|
-
|
|
519
|
-
// when clause returned false — no events published
|
|
520
|
-
expect(testPublisher.publishedEvents).toHaveLength(0);
|
|
521
|
-
});
|
|
522
|
-
});
|
|
523
|
-
|
|
524
|
-
describe('error handling', () => {
|
|
525
|
-
it('should propagate errors from handler execution', async () => {
|
|
526
|
-
const subscriber = new SubscriberBuilder()
|
|
527
|
-
.publisher(TestEventService)
|
|
528
|
-
.subscribe('user.created')
|
|
529
|
-
.handle(async () => {
|
|
530
|
-
throw new Error('Handler failed');
|
|
531
|
-
});
|
|
532
|
-
|
|
533
|
-
const adaptor = new TestSubscriberAdaptor(subscriber);
|
|
534
|
-
|
|
535
|
-
await expect(
|
|
536
|
-
adaptor.invoke({
|
|
537
|
-
events: [
|
|
538
|
-
{
|
|
539
|
-
type: 'user.created',
|
|
540
|
-
payload: {
|
|
541
|
-
userId: '1',
|
|
542
|
-
email: 'a@b.com',
|
|
543
|
-
name: 'A',
|
|
544
|
-
},
|
|
545
|
-
},
|
|
546
|
-
],
|
|
547
|
-
services: {},
|
|
548
|
-
}),
|
|
549
|
-
).rejects.toThrow('Handler failed');
|
|
550
|
-
});
|
|
551
|
-
});
|
|
552
|
-
|
|
553
|
-
describe('default service discovery', () => {
|
|
554
|
-
it('should create default service discovery', () => {
|
|
555
|
-
const discovery = TestSubscriberAdaptor.getDefaultServiceDiscovery();
|
|
556
|
-
expect(discovery).toBeDefined();
|
|
557
|
-
});
|
|
558
|
-
});
|
|
559
|
-
|
|
560
|
-
describe('request context', () => {
|
|
561
|
-
it('should make serviceContext.getLogger() available inside handler', async () => {
|
|
562
|
-
let contextLogger: any;
|
|
563
|
-
|
|
564
|
-
const subscriber = new SubscriberBuilder()
|
|
565
|
-
.publisher(TestEventService)
|
|
566
|
-
.subscribe('user.created')
|
|
567
|
-
.handle(async ({ events }) => {
|
|
568
|
-
contextLogger = serviceContext.getLogger();
|
|
569
|
-
return { processed: events.length };
|
|
570
|
-
});
|
|
571
|
-
|
|
572
|
-
const adaptor = new TestSubscriberAdaptor(subscriber);
|
|
573
|
-
|
|
574
|
-
await adaptor.invoke({
|
|
575
|
-
events: [
|
|
576
|
-
{
|
|
577
|
-
type: 'user.created',
|
|
578
|
-
payload: {
|
|
579
|
-
userId: '1',
|
|
580
|
-
email: 'test@example.com',
|
|
581
|
-
name: 'Test',
|
|
582
|
-
},
|
|
583
|
-
},
|
|
584
|
-
],
|
|
585
|
-
services: {},
|
|
586
|
-
});
|
|
587
|
-
|
|
588
|
-
expect(contextLogger).toBeDefined();
|
|
589
|
-
});
|
|
590
|
-
|
|
591
|
-
it('should make serviceContext.hasContext() return true inside handler', async () => {
|
|
592
|
-
let hasContext = false;
|
|
593
|
-
|
|
594
|
-
const subscriber = new SubscriberBuilder()
|
|
595
|
-
.publisher(TestEventService)
|
|
596
|
-
.subscribe('user.created')
|
|
597
|
-
.handle(async ({ events }) => {
|
|
598
|
-
hasContext = serviceContext.hasContext();
|
|
599
|
-
return { processed: events.length };
|
|
600
|
-
});
|
|
601
|
-
|
|
602
|
-
const adaptor = new TestSubscriberAdaptor(subscriber);
|
|
603
|
-
|
|
604
|
-
await adaptor.invoke({
|
|
605
|
-
events: [
|
|
606
|
-
{
|
|
607
|
-
type: 'user.created',
|
|
608
|
-
payload: {
|
|
609
|
-
userId: '1',
|
|
610
|
-
email: 'test@example.com',
|
|
611
|
-
name: 'Test',
|
|
612
|
-
},
|
|
613
|
-
},
|
|
614
|
-
],
|
|
615
|
-
services: {},
|
|
616
|
-
});
|
|
617
|
-
|
|
618
|
-
expect(hasContext).toBe(true);
|
|
619
|
-
});
|
|
620
|
-
|
|
621
|
-
it('should provide a request ID starting with test-', async () => {
|
|
622
|
-
let requestId: string | undefined;
|
|
623
|
-
|
|
624
|
-
const subscriber = new SubscriberBuilder()
|
|
625
|
-
.publisher(TestEventService)
|
|
626
|
-
.subscribe('user.created')
|
|
627
|
-
.handle(async ({ events }) => {
|
|
628
|
-
requestId = serviceContext.getRequestId();
|
|
629
|
-
return { processed: events.length };
|
|
630
|
-
});
|
|
631
|
-
|
|
632
|
-
const adaptor = new TestSubscriberAdaptor(subscriber);
|
|
633
|
-
|
|
634
|
-
await adaptor.invoke({
|
|
635
|
-
events: [
|
|
636
|
-
{
|
|
637
|
-
type: 'user.created',
|
|
638
|
-
payload: {
|
|
639
|
-
userId: '1',
|
|
640
|
-
email: 'test@example.com',
|
|
641
|
-
name: 'Test',
|
|
642
|
-
},
|
|
643
|
-
},
|
|
644
|
-
],
|
|
645
|
-
services: {},
|
|
646
|
-
});
|
|
647
|
-
|
|
648
|
-
expect(requestId).toBeDefined();
|
|
649
|
-
expect(requestId).toMatch(/^test-/);
|
|
650
|
-
});
|
|
651
|
-
});
|
|
652
|
-
});
|