@geekmidas/constructs 0.0.12 → 0.0.13
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 +448 -0
- package/dist/AWSLambdaFunction-B-Oxr8qt.d.cts +30 -0
- package/dist/{AWSLambdaFunction-DMxScuaw.cjs → AWSLambdaFunction-C-fuCLA3.cjs} +28 -5
- package/dist/AWSLambdaFunction-C-fuCLA3.cjs.map +1 -0
- package/dist/AWSLambdaFunction-CAm9r5ZX.d.mts +30 -0
- package/dist/{AWSLambdaFunction-cL8A169J.mjs → AWSLambdaFunction-H65WfXLt.mjs} +28 -5
- package/dist/AWSLambdaFunction-H65WfXLt.mjs.map +1 -0
- package/dist/{AmazonApiGatewayEndpointAdaptor-eDQgPNLH.d.mts → AmazonApiGatewayEndpointAdaptor-4hPy5vty.d.mts} +4 -4
- package/dist/{AmazonApiGatewayEndpointAdaptor-CIEhW1TQ.mjs → AmazonApiGatewayEndpointAdaptor-C6Jk5HSy.mjs} +6 -2
- package/dist/AmazonApiGatewayEndpointAdaptor-C6Jk5HSy.mjs.map +1 -0
- package/dist/{AmazonApiGatewayEndpointAdaptor-H8YvtfQm.cjs → AmazonApiGatewayEndpointAdaptor-CI9L7Ucn.cjs} +6 -2
- package/dist/AmazonApiGatewayEndpointAdaptor-CI9L7Ucn.cjs.map +1 -0
- package/dist/{AmazonApiGatewayEndpointAdaptor-CwItKPz2.d.cts → AmazonApiGatewayEndpointAdaptor-ro0RMLzr.d.cts} +4 -4
- package/dist/{AmazonApiGatewayV1EndpointAdaptor-B36zXLJ7.mjs → AmazonApiGatewayV1EndpointAdaptor-BMy8DdNJ.mjs} +2 -2
- package/dist/{AmazonApiGatewayV1EndpointAdaptor-B36zXLJ7.mjs.map → AmazonApiGatewayV1EndpointAdaptor-BMy8DdNJ.mjs.map} +1 -1
- package/dist/{AmazonApiGatewayV1EndpointAdaptor-DaCvUL6y.d.cts → AmazonApiGatewayV1EndpointAdaptor-BWJWKqQT.d.cts} +3 -3
- package/dist/{AmazonApiGatewayV1EndpointAdaptor-0n71d3gq.cjs → AmazonApiGatewayV1EndpointAdaptor-DYL1bCBS.cjs} +2 -2
- package/dist/{AmazonApiGatewayV1EndpointAdaptor-0n71d3gq.cjs.map → AmazonApiGatewayV1EndpointAdaptor-DYL1bCBS.cjs.map} +1 -1
- package/dist/{AmazonApiGatewayV1EndpointAdaptor-CnGVpA38.d.mts → AmazonApiGatewayV1EndpointAdaptor-hyR-WwyP.d.mts} +3 -3
- package/dist/{AmazonApiGatewayV2EndpointAdaptor-CE3wZEb8.mjs → AmazonApiGatewayV2EndpointAdaptor-BU5wQMOe.mjs} +2 -2
- package/dist/{AmazonApiGatewayV2EndpointAdaptor-CE3wZEb8.mjs.map → AmazonApiGatewayV2EndpointAdaptor-BU5wQMOe.mjs.map} +1 -1
- package/dist/{AmazonApiGatewayV2EndpointAdaptor-DtU3Cb8F.cjs → AmazonApiGatewayV2EndpointAdaptor-CPLCMeaN.cjs} +2 -2
- package/dist/{AmazonApiGatewayV2EndpointAdaptor-DtU3Cb8F.cjs.map → AmazonApiGatewayV2EndpointAdaptor-CPLCMeaN.cjs.map} +1 -1
- package/dist/{AmazonApiGatewayV2EndpointAdaptor-DA1PH0nc.d.cts → AmazonApiGatewayV2EndpointAdaptor-D1Irdggp.d.cts} +3 -3
- package/dist/{AmazonApiGatewayV2EndpointAdaptor-BELz2ijs.d.mts → AmazonApiGatewayV2EndpointAdaptor-DX3SuI5S.d.mts} +3 -3
- package/dist/{Authorizer-BRCVPz_O.d.mts → Authorizer-BTmly8ps.d.cts} +1 -1
- package/dist/{Authorizer-DG54w1m2.d.cts → Authorizer-pmPvIVgv.d.mts} +1 -1
- package/dist/{BaseFunctionBuilder-CT7p10K1.mjs → BaseFunctionBuilder-B5gkW0Kt.mjs} +10 -1
- package/dist/BaseFunctionBuilder-B5gkW0Kt.mjs.map +1 -0
- package/dist/{BaseFunctionBuilder-B8rT07QR.cjs → BaseFunctionBuilder-C5Se7pdL.cjs} +10 -1
- package/dist/BaseFunctionBuilder-C5Se7pdL.cjs.map +1 -0
- package/dist/{BaseFunctionBuilder-DilipY1y.d.mts → BaseFunctionBuilder-CbDnPZpD.d.mts} +10 -4
- package/dist/{BaseFunctionBuilder-Cf0op65o.d.cts → BaseFunctionBuilder-DUZMbEr3.d.cts} +10 -4
- package/dist/{Cron-Bnd-2pgE.cjs → Cron-Bi3QOge_.cjs} +4 -4
- package/dist/Cron-Bi3QOge_.cjs.map +1 -0
- package/dist/{Cron-6lOgKqSA.d.cts → Cron-COdfP0Jd.d.cts} +4 -4
- package/dist/{Cron-BH_07atD.d.mts → Cron-D8cn_ahj.d.mts} +4 -4
- package/dist/{Cron-DNRjf2cp.mjs → Cron-Dy_HW2Vv.mjs} +4 -4
- package/dist/Cron-Dy_HW2Vv.mjs.map +1 -0
- package/dist/{CronBuilder-DdR2TuQa.mjs → CronBuilder-Bl3A2Zp4.mjs} +13 -4
- package/dist/CronBuilder-Bl3A2Zp4.mjs.map +1 -0
- package/dist/{CronBuilder-5oK2AL2n.d.cts → CronBuilder-DntF6H3A.d.cts} +17 -12
- package/dist/{CronBuilder-D2b4zY4l.d.mts → CronBuilder-DoMnSs_0.d.mts} +17 -12
- package/dist/{CronBuilder-dtw4ZyH6.cjs → CronBuilder-Dv_w7Yri.cjs} +13 -4
- package/dist/CronBuilder-Dv_w7Yri.cjs.map +1 -0
- package/dist/{Endpoint-DuZlyjd4.d.mts → Endpoint-Bbs_sFvg.d.mts} +49 -20
- package/dist/{Endpoint-Cs-MsYlY.d.cts → Endpoint-Bu8Phz6y.d.cts} +49 -20
- package/dist/{Endpoint-B9PryZES.cjs → Endpoint-DDpF7NO1.cjs} +11 -6
- package/dist/Endpoint-DDpF7NO1.cjs.map +1 -0
- package/dist/{Endpoint-B69TqESg.mjs → Endpoint-S6Yh2_PN.mjs} +11 -6
- package/dist/Endpoint-S6Yh2_PN.mjs.map +1 -0
- package/dist/{EndpointBuilder-C-PHInEW.d.cts → EndpointBuilder-CPxmF_w7.d.cts} +30 -13
- package/dist/{EndpointBuilder-BrB-K1jO.d.mts → EndpointBuilder-Csfyfjd7.d.mts} +30 -13
- package/dist/{EndpointBuilder-DofwCnWJ.cjs → EndpointBuilder-DpGmObMb.cjs} +25 -4
- package/dist/EndpointBuilder-DpGmObMb.cjs.map +1 -0
- package/dist/{EndpointBuilder-DnVL-EU_.mjs → EndpointBuilder-aE2E6WTx.mjs} +25 -4
- package/dist/EndpointBuilder-aE2E6WTx.mjs.map +1 -0
- package/dist/{EndpointFactory-6zNpVSYp.d.mts → EndpointFactory-Bf9JSWzI.d.cts} +12 -12
- package/dist/{EndpointFactory-Ba9mx9MU.cjs → EndpointFactory-BfH6mjJ3.cjs} +2 -2
- package/dist/EndpointFactory-BfH6mjJ3.cjs.map +1 -0
- package/dist/{EndpointFactory-e5WYVR6t.d.cts → EndpointFactory-Cgk1R0oO.d.mts} +12 -12
- package/dist/{EndpointFactory-pPaIGFHV.mjs → EndpointFactory-D4leYk1N.mjs} +2 -2
- package/dist/EndpointFactory-D4leYk1N.mjs.map +1 -0
- package/dist/{Function-CO-s2pB8.cjs → Function-DagDbeXo.cjs} +3 -2
- package/dist/Function-DagDbeXo.cjs.map +1 -0
- package/dist/{Function-COnc-tWM.mjs → Function-DfKsM5Kx.mjs} +3 -2
- package/dist/Function-DfKsM5Kx.mjs.map +1 -0
- package/dist/{Function-G3JPHMaY.d.mts → Function-V9M9UVHp.d.mts} +24 -7
- package/dist/{Function-6EWabl_X.d.cts → Function-VI1TB3Mh.d.cts} +24 -7
- package/dist/{FunctionBuilder-CMhLQ4dt.mjs → FunctionBuilder-CVT7bG2o.mjs} +20 -4
- package/dist/FunctionBuilder-CVT7bG2o.mjs.map +1 -0
- package/dist/{FunctionBuilder-B3fpp3hA.d.cts → FunctionBuilder-CjVEFTYC.d.cts} +22 -12
- package/dist/{FunctionBuilder-ByaB_LQ4.d.mts → FunctionBuilder-D1ofSeMd.d.mts} +22 -12
- package/dist/{FunctionBuilder-_hMwZUof.cjs → FunctionBuilder-DXvG_XD-.cjs} +20 -4
- package/dist/FunctionBuilder-DXvG_XD-.cjs.map +1 -0
- package/dist/FunctionExecutionWrapper-Bubnr0zA.mjs +101 -0
- package/dist/FunctionExecutionWrapper-Bubnr0zA.mjs.map +1 -0
- package/dist/FunctionExecutionWrapper-CwtwYozd.d.cts +48 -0
- package/dist/FunctionExecutionWrapper-DkNycmOh.cjs +107 -0
- package/dist/FunctionExecutionWrapper-DkNycmOh.cjs.map +1 -0
- package/dist/FunctionExecutionWrapper-rhbIYT0Q.d.mts +48 -0
- package/dist/{HonoEndpointAdaptor-DSHl8ZCY.d.cts → HonoEndpointAdaptor-B34kNobH.d.cts} +7 -7
- package/dist/{HonoEndpointAdaptor-BElil8O5.d.mts → HonoEndpointAdaptor-BDpi32mH.d.mts} +7 -7
- package/dist/{HonoEndpointAdaptor-Cw2if5cG.cjs → HonoEndpointAdaptor-CfLRHHFw.cjs} +8 -4
- package/dist/HonoEndpointAdaptor-CfLRHHFw.cjs.map +1 -0
- package/dist/{HonoEndpointAdaptor-DAfnTFVS.mjs → HonoEndpointAdaptor-DuyE06nH.mjs} +8 -4
- package/dist/HonoEndpointAdaptor-DuyE06nH.mjs.map +1 -0
- package/dist/{Subscriber-D-FPWts6.cjs → Subscriber-Bdh8rMSL.cjs} +1 -1
- package/dist/{Subscriber-D-FPWts6.cjs.map → Subscriber-Bdh8rMSL.cjs.map} +1 -1
- package/dist/{Subscriber-CGb8LjZa.mjs → Subscriber-CJOWwaw1.mjs} +1 -1
- package/dist/{Subscriber-CGb8LjZa.mjs.map → Subscriber-CJOWwaw1.mjs.map} +1 -1
- package/dist/{SubscriberBuilder-BcAspHv9.mjs → SubscriberBuilder-BWQmiYd8.mjs} +2 -2
- package/dist/{SubscriberBuilder-BcAspHv9.mjs.map → SubscriberBuilder-BWQmiYd8.mjs.map} +1 -1
- package/dist/{SubscriberBuilder-BfE2cL1q.cjs → SubscriberBuilder-DieD_60p.cjs} +2 -2
- package/dist/{SubscriberBuilder-BfE2cL1q.cjs.map → SubscriberBuilder-DieD_60p.cjs.map} +1 -1
- package/dist/{TestEndpointAdaptor-DubQOJk_.mjs → TestEndpointAdaptor-BEyZa0Yg.mjs} +7 -3
- package/dist/TestEndpointAdaptor-BEyZa0Yg.mjs.map +1 -0
- package/dist/{TestEndpointAdaptor-Bn1WRFph.cjs → TestEndpointAdaptor-C8425RJ0.cjs} +7 -3
- package/dist/TestEndpointAdaptor-C8425RJ0.cjs.map +1 -0
- package/dist/{TestEndpointAdaptor-o-xtSyQ3.d.cts → TestEndpointAdaptor-H5To8PH7.d.cts} +2 -2
- package/dist/{TestEndpointAdaptor-DnlAA_rm.d.mts → TestEndpointAdaptor-jxn68ayg.d.mts} +2 -2
- package/dist/adaptors/aws.cjs +10 -10
- package/dist/adaptors/aws.d.cts +11 -11
- package/dist/adaptors/aws.d.mts +11 -11
- package/dist/adaptors/aws.mjs +10 -10
- package/dist/adaptors/hono.cjs +7 -7
- package/dist/adaptors/hono.d.cts +7 -7
- package/dist/adaptors/hono.d.mts +7 -7
- package/dist/adaptors/hono.mjs +7 -7
- package/dist/adaptors/testing.cjs +6 -6
- package/dist/adaptors/testing.d.cts +7 -7
- package/dist/adaptors/testing.d.mts +7 -7
- package/dist/adaptors/testing.mjs +6 -6
- package/dist/crons/Cron.cjs +5 -5
- package/dist/crons/Cron.d.cts +5 -5
- package/dist/crons/Cron.d.mts +5 -5
- package/dist/crons/Cron.mjs +5 -5
- package/dist/crons/CronBuilder.cjs +6 -6
- package/dist/crons/CronBuilder.d.cts +6 -6
- package/dist/crons/CronBuilder.d.mts +6 -6
- package/dist/crons/CronBuilder.mjs +6 -6
- package/dist/crons/index.cjs +6 -6
- package/dist/crons/index.d.cts +10 -10
- package/dist/crons/index.d.mts +10 -10
- package/dist/crons/index.mjs +6 -6
- package/dist/endpoints/AmazonApiGatewayEndpointAdaptor.cjs +6 -6
- package/dist/endpoints/AmazonApiGatewayEndpointAdaptor.d.cts +7 -7
- package/dist/endpoints/AmazonApiGatewayEndpointAdaptor.d.mts +7 -7
- package/dist/endpoints/AmazonApiGatewayEndpointAdaptor.mjs +6 -6
- package/dist/endpoints/AmazonApiGatewayV1EndpointAdaptor.cjs +7 -7
- package/dist/endpoints/AmazonApiGatewayV1EndpointAdaptor.d.cts +8 -8
- package/dist/endpoints/AmazonApiGatewayV1EndpointAdaptor.d.mts +8 -8
- package/dist/endpoints/AmazonApiGatewayV1EndpointAdaptor.mjs +7 -7
- package/dist/endpoints/AmazonApiGatewayV2EndpointAdaptor.cjs +7 -7
- package/dist/endpoints/AmazonApiGatewayV2EndpointAdaptor.d.cts +8 -8
- package/dist/endpoints/AmazonApiGatewayV2EndpointAdaptor.d.mts +8 -8
- package/dist/endpoints/AmazonApiGatewayV2EndpointAdaptor.mjs +7 -7
- package/dist/endpoints/Authorizer.d.cts +1 -1
- package/dist/endpoints/Authorizer.d.mts +1 -1
- package/dist/endpoints/Endpoint.cjs +5 -5
- package/dist/endpoints/Endpoint.d.cts +6 -6
- package/dist/endpoints/Endpoint.d.mts +6 -6
- package/dist/endpoints/Endpoint.mjs +5 -5
- package/dist/endpoints/EndpointBuilder.cjs +6 -6
- package/dist/endpoints/EndpointBuilder.d.cts +7 -7
- package/dist/endpoints/EndpointBuilder.d.mts +7 -7
- package/dist/endpoints/EndpointBuilder.mjs +6 -6
- package/dist/endpoints/EndpointFactory.cjs +7 -7
- package/dist/endpoints/EndpointFactory.d.cts +8 -8
- package/dist/endpoints/EndpointFactory.d.mts +8 -8
- package/dist/endpoints/EndpointFactory.mjs +7 -7
- package/dist/endpoints/HonoEndpointAdaptor.cjs +7 -7
- package/dist/endpoints/HonoEndpointAdaptor.d.cts +7 -7
- package/dist/endpoints/HonoEndpointAdaptor.d.mts +7 -7
- package/dist/endpoints/HonoEndpointAdaptor.mjs +7 -7
- package/dist/endpoints/TestEndpointAdaptor.cjs +6 -6
- package/dist/endpoints/TestEndpointAdaptor.d.cts +7 -7
- package/dist/endpoints/TestEndpointAdaptor.d.mts +7 -7
- package/dist/endpoints/TestEndpointAdaptor.mjs +6 -6
- package/dist/endpoints/audit.d.cts +6 -6
- package/dist/endpoints/audit.d.mts +6 -6
- package/dist/endpoints/helpers.cjs +6 -6
- package/dist/endpoints/helpers.d.cts +6 -6
- package/dist/endpoints/helpers.d.mts +6 -6
- package/dist/endpoints/helpers.mjs +6 -6
- package/dist/endpoints/index.cjs +7 -7
- package/dist/endpoints/index.d.cts +10 -10
- package/dist/endpoints/index.d.mts +10 -10
- package/dist/endpoints/index.mjs +7 -7
- package/dist/endpoints/processAudits.d.cts +7 -7
- package/dist/endpoints/processAudits.d.mts +7 -7
- package/dist/functions/AWSLambdaFunction.cjs +5 -5
- package/dist/functions/AWSLambdaFunction.d.cts +3 -3
- package/dist/functions/AWSLambdaFunction.d.mts +3 -3
- package/dist/functions/AWSLambdaFunction.mjs +5 -5
- package/dist/functions/BaseFunctionBuilder.cjs +1 -1
- package/dist/functions/BaseFunctionBuilder.d.cts +1 -1
- package/dist/functions/BaseFunctionBuilder.d.mts +1 -1
- package/dist/functions/BaseFunctionBuilder.mjs +1 -1
- package/dist/functions/Function.cjs +1 -1
- package/dist/functions/Function.d.cts +1 -1
- package/dist/functions/Function.d.mts +1 -1
- package/dist/functions/Function.mjs +1 -1
- package/dist/functions/FunctionBuilder.cjs +3 -3
- package/dist/functions/FunctionBuilder.d.cts +3 -3
- package/dist/functions/FunctionBuilder.d.mts +3 -3
- package/dist/functions/FunctionBuilder.mjs +3 -3
- package/dist/functions/FunctionExecutionWrapper.cjs +4 -4
- package/dist/functions/FunctionExecutionWrapper.d.cts +2 -2
- package/dist/functions/FunctionExecutionWrapper.d.mts +2 -2
- package/dist/functions/FunctionExecutionWrapper.mjs +4 -4
- package/dist/functions/TestFunctionAdaptor.cjs +37 -4
- package/dist/functions/TestFunctionAdaptor.cjs.map +1 -1
- package/dist/functions/TestFunctionAdaptor.d.cts +9 -6
- package/dist/functions/TestFunctionAdaptor.d.mts +9 -6
- package/dist/functions/TestFunctionAdaptor.mjs +37 -4
- package/dist/functions/TestFunctionAdaptor.mjs.map +1 -1
- package/dist/functions/index.cjs +4 -4
- package/dist/functions/index.d.cts +4 -4
- package/dist/functions/index.d.mts +4 -4
- package/dist/functions/index.mjs +4 -4
- package/dist/{functions-D03lqK-r.cjs → functions-FCb-wWFC.cjs} +2 -2
- package/dist/{functions-D03lqK-r.cjs.map → functions-FCb-wWFC.cjs.map} +1 -1
- package/dist/functions-JhRsNoAZ.mjs +8 -0
- package/dist/{functions-BYqZAob8.mjs.map → functions-JhRsNoAZ.mjs.map} +1 -1
- package/dist/{helpers-BPDogwac.mjs → helpers-2CLKTnRm.mjs} +2 -2
- package/dist/{helpers-BPDogwac.mjs.map → helpers-2CLKTnRm.mjs.map} +1 -1
- package/dist/{helpers-BApRyhly.cjs → helpers-Khuhi_Qx.cjs} +2 -2
- package/dist/{helpers-BApRyhly.cjs.map → helpers-Khuhi_Qx.cjs.map} +1 -1
- package/dist/index-Bomy7R9z.d.mts +10 -0
- package/dist/index-DRYfZHb3.d.cts +10 -0
- package/dist/processAudits-BFokHhCO.cjs.map +1 -1
- package/dist/processAudits-DfcB-X-4.mjs.map +1 -1
- package/dist/publisher-Bw4770Hi.mjs.map +1 -1
- package/dist/publisher-lFQleddL.cjs.map +1 -1
- package/dist/publisher.d.cts +2 -1
- package/dist/publisher.d.mts +2 -1
- package/dist/subscribers/Subscriber.cjs +1 -1
- package/dist/subscribers/Subscriber.mjs +1 -1
- package/dist/subscribers/SubscriberBuilder.cjs +2 -2
- package/dist/subscribers/SubscriberBuilder.mjs +2 -2
- package/dist/subscribers/index.cjs +2 -2
- package/dist/subscribers/index.d.cts +2 -2
- package/dist/subscribers/index.d.mts +2 -2
- package/dist/subscribers/index.mjs +2 -2
- package/package.json +6 -6
- package/src/crons/Cron.ts +12 -3
- package/src/crons/CronBuilder.ts +85 -13
- package/src/crons/__tests__/CronBuilder.state-isolation.spec.ts +2 -2
- package/src/endpoints/AmazonApiGatewayEndpointAdaptor.ts +29 -6
- package/src/endpoints/Endpoint.ts +156 -40
- package/src/endpoints/EndpointBuilder.ts +123 -17
- package/src/endpoints/EndpointFactory.ts +5 -1
- package/src/endpoints/HonoEndpointAdaptor.ts +35 -5
- package/src/endpoints/TestEndpointAdaptor.ts +22 -2
- package/src/endpoints/__tests__/AmazonApiGatewayV1EndpointAdaptor.spec.ts +1 -1
- package/src/endpoints/__tests__/AmazonApiGatewayV2EndpointAdaptor.audits.spec.ts +2 -2
- package/src/endpoints/__tests__/AmazonApiGatewayV2EndpointAdaptor.events.spec.ts +9 -9
- package/src/endpoints/__tests__/AmazonApiGatewayV2EndpointAdaptor.kysely-audit.integration.spec.ts +79 -40
- package/src/endpoints/__tests__/Endpoint.cookies.spec.ts +3 -1
- package/src/endpoints/__tests__/Endpoint.manifest.spec.ts +1 -1
- package/src/endpoints/__tests__/EndpointBuilder.audit.spec.ts +35 -11
- package/src/endpoints/__tests__/EndpointFactory.authorizers.spec.ts +51 -14
- package/src/endpoints/__tests__/EndpointFactory.reference-audit.spec.ts +8 -8
- package/src/endpoints/__tests__/EndpointFactory.state-isolation.spec.ts +11 -11
- package/src/endpoints/__tests__/HonoEndpointAdaptor.audit-transactions.spec.ts +44 -26
- package/src/endpoints/__tests__/HonoEndpointAdaptor.audits.spec.ts +10 -10
- package/src/endpoints/__tests__/HonoEndpointAdaptor.events.spec.ts +8 -8
- package/src/endpoints/__tests__/HonoEndpointAdaptor.kysely-audit.integration.spec.ts +446 -61
- package/src/endpoints/__tests__/HonoEndpointAdaptor.openapi.spec.ts +4 -4
- package/src/endpoints/audit.ts +1 -1
- package/src/endpoints/processAudits.ts +32 -23
- package/src/functions/AWSLambdaFunction.ts +125 -12
- package/src/functions/BaseFunctionBuilder.ts +51 -3
- package/src/functions/Function.ts +73 -9
- package/src/functions/FunctionBuilder.ts +153 -17
- package/src/functions/FunctionExecutionWrapper.ts +133 -2
- package/src/functions/TestFunctionAdaptor.ts +94 -8
- package/src/functions/__tests__/AWSLambdaFunctionAdaptor.spec.ts +82 -0
- package/src/functions/__tests__/Function.audits.spec.ts +393 -0
- package/src/functions/__tests__/Function.spec.ts +76 -0
- package/src/functions/__tests__/FunctionBuilder.state-isolation.spec.ts +11 -5
- package/src/publisher.ts +12 -1
- package/dist/AWSLambdaFunction-DMxScuaw.cjs.map +0 -1
- package/dist/AWSLambdaFunction-DSB2oaFG.d.mts +0 -27
- package/dist/AWSLambdaFunction-cL8A169J.mjs.map +0 -1
- package/dist/AWSLambdaFunction-t6q2o8EL.d.cts +0 -27
- package/dist/AmazonApiGatewayEndpointAdaptor-CIEhW1TQ.mjs.map +0 -1
- package/dist/AmazonApiGatewayEndpointAdaptor-H8YvtfQm.cjs.map +0 -1
- package/dist/BaseFunctionBuilder-B8rT07QR.cjs.map +0 -1
- package/dist/BaseFunctionBuilder-CT7p10K1.mjs.map +0 -1
- package/dist/Cron-Bnd-2pgE.cjs.map +0 -1
- package/dist/Cron-DNRjf2cp.mjs.map +0 -1
- package/dist/CronBuilder-DdR2TuQa.mjs.map +0 -1
- package/dist/CronBuilder-dtw4ZyH6.cjs.map +0 -1
- package/dist/Endpoint-B69TqESg.mjs.map +0 -1
- package/dist/Endpoint-B9PryZES.cjs.map +0 -1
- package/dist/EndpointBuilder-DnVL-EU_.mjs.map +0 -1
- package/dist/EndpointBuilder-DofwCnWJ.cjs.map +0 -1
- package/dist/EndpointFactory-Ba9mx9MU.cjs.map +0 -1
- package/dist/EndpointFactory-pPaIGFHV.mjs.map +0 -1
- package/dist/Function-CO-s2pB8.cjs.map +0 -1
- package/dist/Function-COnc-tWM.mjs.map +0 -1
- package/dist/FunctionBuilder-CMhLQ4dt.mjs.map +0 -1
- package/dist/FunctionBuilder-_hMwZUof.cjs.map +0 -1
- package/dist/FunctionExecutionWrapper-Ci-ookJG.d.cts +0 -24
- package/dist/FunctionExecutionWrapper-DHFMLrOl.d.mts +0 -24
- package/dist/FunctionExecutionWrapper-i9v5L3Av.mjs +0 -36
- package/dist/FunctionExecutionWrapper-i9v5L3Av.mjs.map +0 -1
- package/dist/FunctionExecutionWrapper-sxJNTpuc.cjs +0 -42
- package/dist/FunctionExecutionWrapper-sxJNTpuc.cjs.map +0 -1
- package/dist/HonoEndpointAdaptor-Cw2if5cG.cjs.map +0 -1
- package/dist/HonoEndpointAdaptor-DAfnTFVS.mjs.map +0 -1
- package/dist/TestEndpointAdaptor-Bn1WRFph.cjs.map +0 -1
- package/dist/TestEndpointAdaptor-DubQOJk_.mjs.map +0 -1
- package/dist/functions-BYqZAob8.mjs +0 -8
- package/dist/index-CUg_hSq-.d.cts +0 -9
- package/dist/index-D-a7e2gv.d.mts +0 -9
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { AuditStorage } from '@geekmidas/audit';
|
|
1
|
+
import type { AuditStorage, AuditableAction } from '@geekmidas/audit';
|
|
2
2
|
import type { EventPublisher } from '@geekmidas/events';
|
|
3
3
|
import type { Logger } from '@geekmidas/logger';
|
|
4
4
|
import { ConsoleLogger } from '@geekmidas/logger/console';
|
|
@@ -21,6 +21,12 @@ export class FunctionBuilder<
|
|
|
21
21
|
TEventPublisherServiceName extends string = string,
|
|
22
22
|
TAuditStorage extends AuditStorage | undefined = undefined,
|
|
23
23
|
TAuditStorageServiceName extends string = string,
|
|
24
|
+
TDatabase = undefined,
|
|
25
|
+
TDatabaseServiceName extends string = string,
|
|
26
|
+
TAuditAction extends AuditableAction<string, unknown> = AuditableAction<
|
|
27
|
+
string,
|
|
28
|
+
unknown
|
|
29
|
+
>,
|
|
24
30
|
> extends BaseFunctionBuilder<
|
|
25
31
|
TInput,
|
|
26
32
|
OutSchema,
|
|
@@ -29,7 +35,9 @@ export class FunctionBuilder<
|
|
|
29
35
|
TEventPublisher,
|
|
30
36
|
TEventPublisherServiceName,
|
|
31
37
|
TAuditStorage,
|
|
32
|
-
TAuditStorageServiceName
|
|
38
|
+
TAuditStorageServiceName,
|
|
39
|
+
TDatabase,
|
|
40
|
+
TDatabaseServiceName
|
|
33
41
|
> {
|
|
34
42
|
protected _memorySize?: number;
|
|
35
43
|
|
|
@@ -57,7 +65,10 @@ export class FunctionBuilder<
|
|
|
57
65
|
TEventPublisher,
|
|
58
66
|
TEventPublisherServiceName,
|
|
59
67
|
TAuditStorage,
|
|
60
|
-
TAuditStorageServiceName
|
|
68
|
+
TAuditStorageServiceName,
|
|
69
|
+
TDatabase,
|
|
70
|
+
TDatabaseServiceName,
|
|
71
|
+
TAuditAction
|
|
61
72
|
> {
|
|
62
73
|
this.outputSchema = schema as unknown as OutSchema;
|
|
63
74
|
|
|
@@ -69,7 +80,10 @@ export class FunctionBuilder<
|
|
|
69
80
|
TEventPublisher,
|
|
70
81
|
TEventPublisherServiceName,
|
|
71
82
|
TAuditStorage,
|
|
72
|
-
TAuditStorageServiceName
|
|
83
|
+
TAuditStorageServiceName,
|
|
84
|
+
TDatabase,
|
|
85
|
+
TDatabaseServiceName,
|
|
86
|
+
TAuditAction
|
|
73
87
|
>;
|
|
74
88
|
}
|
|
75
89
|
|
|
@@ -83,7 +97,10 @@ export class FunctionBuilder<
|
|
|
83
97
|
TEventPublisher,
|
|
84
98
|
TEventPublisherServiceName,
|
|
85
99
|
TAuditStorage,
|
|
86
|
-
TAuditStorageServiceName
|
|
100
|
+
TAuditStorageServiceName,
|
|
101
|
+
TDatabase,
|
|
102
|
+
TDatabaseServiceName,
|
|
103
|
+
TAuditAction
|
|
87
104
|
> {
|
|
88
105
|
this.inputSchema = schema as unknown as TInput;
|
|
89
106
|
|
|
@@ -95,7 +112,10 @@ export class FunctionBuilder<
|
|
|
95
112
|
TEventPublisher,
|
|
96
113
|
TEventPublisherServiceName,
|
|
97
114
|
TAuditStorage,
|
|
98
|
-
TAuditStorageServiceName
|
|
115
|
+
TAuditStorageServiceName,
|
|
116
|
+
TDatabase,
|
|
117
|
+
TDatabaseServiceName,
|
|
118
|
+
TAuditAction
|
|
99
119
|
>;
|
|
100
120
|
}
|
|
101
121
|
|
|
@@ -109,7 +129,10 @@ export class FunctionBuilder<
|
|
|
109
129
|
TEventPublisher,
|
|
110
130
|
TEventPublisherServiceName,
|
|
111
131
|
TAuditStorage,
|
|
112
|
-
TAuditStorageServiceName
|
|
132
|
+
TAuditStorageServiceName,
|
|
133
|
+
TDatabase,
|
|
134
|
+
TDatabaseServiceName,
|
|
135
|
+
TAuditAction
|
|
113
136
|
> {
|
|
114
137
|
this._services = uniqBy(
|
|
115
138
|
[...this._services, ...services],
|
|
@@ -124,7 +147,10 @@ export class FunctionBuilder<
|
|
|
124
147
|
TEventPublisher,
|
|
125
148
|
TEventPublisherServiceName,
|
|
126
149
|
TAuditStorage,
|
|
127
|
-
TAuditStorageServiceName
|
|
150
|
+
TAuditStorageServiceName,
|
|
151
|
+
TDatabase,
|
|
152
|
+
TDatabaseServiceName,
|
|
153
|
+
TAuditAction
|
|
128
154
|
>;
|
|
129
155
|
}
|
|
130
156
|
|
|
@@ -138,7 +164,10 @@ export class FunctionBuilder<
|
|
|
138
164
|
TEventPublisher,
|
|
139
165
|
TEventPublisherServiceName,
|
|
140
166
|
TAuditStorage,
|
|
141
|
-
TAuditStorageServiceName
|
|
167
|
+
TAuditStorageServiceName,
|
|
168
|
+
TDatabase,
|
|
169
|
+
TDatabaseServiceName,
|
|
170
|
+
TAuditAction
|
|
142
171
|
> {
|
|
143
172
|
this._logger = logger as unknown as TLogger;
|
|
144
173
|
|
|
@@ -150,7 +179,10 @@ export class FunctionBuilder<
|
|
|
150
179
|
TEventPublisher,
|
|
151
180
|
TEventPublisherServiceName,
|
|
152
181
|
TAuditStorage,
|
|
153
|
-
TAuditStorageServiceName
|
|
182
|
+
TAuditStorageServiceName,
|
|
183
|
+
TDatabase,
|
|
184
|
+
TDatabaseServiceName,
|
|
185
|
+
TAuditAction
|
|
154
186
|
>;
|
|
155
187
|
}
|
|
156
188
|
|
|
@@ -164,7 +196,10 @@ export class FunctionBuilder<
|
|
|
164
196
|
T,
|
|
165
197
|
TName,
|
|
166
198
|
TAuditStorage,
|
|
167
|
-
TAuditStorageServiceName
|
|
199
|
+
TAuditStorageServiceName,
|
|
200
|
+
TDatabase,
|
|
201
|
+
TDatabaseServiceName,
|
|
202
|
+
TAuditAction
|
|
168
203
|
> {
|
|
169
204
|
this._publisher = publisher as unknown as Service<
|
|
170
205
|
TEventPublisherServiceName,
|
|
@@ -179,7 +214,10 @@ export class FunctionBuilder<
|
|
|
179
214
|
T,
|
|
180
215
|
TName,
|
|
181
216
|
TAuditStorage,
|
|
182
|
-
TAuditStorageServiceName
|
|
217
|
+
TAuditStorageServiceName,
|
|
218
|
+
TDatabase,
|
|
219
|
+
TDatabaseServiceName,
|
|
220
|
+
TAuditAction
|
|
183
221
|
>;
|
|
184
222
|
}
|
|
185
223
|
|
|
@@ -193,7 +231,10 @@ export class FunctionBuilder<
|
|
|
193
231
|
TEventPublisher,
|
|
194
232
|
TEventPublisherServiceName,
|
|
195
233
|
T,
|
|
196
|
-
TName
|
|
234
|
+
TName,
|
|
235
|
+
TDatabase,
|
|
236
|
+
TDatabaseServiceName,
|
|
237
|
+
TAuditAction
|
|
197
238
|
> {
|
|
198
239
|
this._auditorStorage = storage as unknown as Service<
|
|
199
240
|
TAuditStorageServiceName,
|
|
@@ -208,22 +249,115 @@ export class FunctionBuilder<
|
|
|
208
249
|
TEventPublisher,
|
|
209
250
|
TEventPublisherServiceName,
|
|
210
251
|
T,
|
|
211
|
-
TName
|
|
252
|
+
TName,
|
|
253
|
+
TDatabase,
|
|
254
|
+
TDatabaseServiceName,
|
|
255
|
+
TAuditAction
|
|
256
|
+
>;
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
/**
|
|
260
|
+
* Set the audit action types for this function.
|
|
261
|
+
* This provides type-safety for the auditor in the handler context.
|
|
262
|
+
*/
|
|
263
|
+
actions<T extends AuditableAction<string, unknown>>(): FunctionBuilder<
|
|
264
|
+
TInput,
|
|
265
|
+
OutSchema,
|
|
266
|
+
TServices,
|
|
267
|
+
TLogger,
|
|
268
|
+
TEventPublisher,
|
|
269
|
+
TEventPublisherServiceName,
|
|
270
|
+
TAuditStorage,
|
|
271
|
+
TAuditStorageServiceName,
|
|
272
|
+
TDatabase,
|
|
273
|
+
TDatabaseServiceName,
|
|
274
|
+
T
|
|
275
|
+
> {
|
|
276
|
+
return this as unknown as FunctionBuilder<
|
|
277
|
+
TInput,
|
|
278
|
+
OutSchema,
|
|
279
|
+
TServices,
|
|
280
|
+
TLogger,
|
|
281
|
+
TEventPublisher,
|
|
282
|
+
TEventPublisherServiceName,
|
|
283
|
+
TAuditStorage,
|
|
284
|
+
TAuditStorageServiceName,
|
|
285
|
+
TDatabase,
|
|
286
|
+
TDatabaseServiceName,
|
|
287
|
+
T
|
|
288
|
+
>;
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
/**
|
|
292
|
+
* Set the database service for this function.
|
|
293
|
+
* The database will be available in the handler context as `db`.
|
|
294
|
+
*/
|
|
295
|
+
database<T, TName extends string>(
|
|
296
|
+
service: Service<TName, T>,
|
|
297
|
+
): FunctionBuilder<
|
|
298
|
+
TInput,
|
|
299
|
+
OutSchema,
|
|
300
|
+
TServices,
|
|
301
|
+
TLogger,
|
|
302
|
+
TEventPublisher,
|
|
303
|
+
TEventPublisherServiceName,
|
|
304
|
+
TAuditStorage,
|
|
305
|
+
TAuditStorageServiceName,
|
|
306
|
+
T,
|
|
307
|
+
TName,
|
|
308
|
+
TAuditAction
|
|
309
|
+
> {
|
|
310
|
+
this._databaseService = service as unknown as Service<
|
|
311
|
+
TDatabaseServiceName,
|
|
312
|
+
TDatabase
|
|
313
|
+
>;
|
|
314
|
+
|
|
315
|
+
return this as unknown as FunctionBuilder<
|
|
316
|
+
TInput,
|
|
317
|
+
OutSchema,
|
|
318
|
+
TServices,
|
|
319
|
+
TLogger,
|
|
320
|
+
TEventPublisher,
|
|
321
|
+
TEventPublisherServiceName,
|
|
322
|
+
TAuditStorage,
|
|
323
|
+
TAuditStorageServiceName,
|
|
324
|
+
T,
|
|
325
|
+
TName,
|
|
326
|
+
TAuditAction
|
|
212
327
|
>;
|
|
213
328
|
}
|
|
214
329
|
|
|
215
330
|
handle(
|
|
216
|
-
fn: FunctionHandler<
|
|
331
|
+
fn: FunctionHandler<
|
|
332
|
+
TInput,
|
|
333
|
+
TServices,
|
|
334
|
+
TLogger,
|
|
335
|
+
OutSchema,
|
|
336
|
+
TDatabase,
|
|
337
|
+
TAuditStorage,
|
|
338
|
+
TAuditAction
|
|
339
|
+
>,
|
|
217
340
|
): Function<
|
|
218
341
|
TInput,
|
|
219
342
|
TServices,
|
|
220
343
|
TLogger,
|
|
221
344
|
OutSchema,
|
|
222
|
-
FunctionHandler<TInput, TServices, TLogger, OutSchema>,
|
|
223
345
|
TEventPublisher,
|
|
224
346
|
TEventPublisherServiceName,
|
|
225
347
|
TAuditStorage,
|
|
226
|
-
TAuditStorageServiceName
|
|
348
|
+
TAuditStorageServiceName,
|
|
349
|
+
TDatabase,
|
|
350
|
+
TDatabaseServiceName,
|
|
351
|
+
TAuditAction,
|
|
352
|
+
FunctionHandler<
|
|
353
|
+
TInput,
|
|
354
|
+
TServices,
|
|
355
|
+
TLogger,
|
|
356
|
+
OutSchema,
|
|
357
|
+
TDatabase,
|
|
358
|
+
TAuditStorage,
|
|
359
|
+
TAuditAction
|
|
360
|
+
>
|
|
227
361
|
> {
|
|
228
362
|
const func = new Function(
|
|
229
363
|
fn,
|
|
@@ -237,6 +371,7 @@ export class FunctionBuilder<
|
|
|
237
371
|
this._events,
|
|
238
372
|
this._memorySize,
|
|
239
373
|
this._auditorStorage,
|
|
374
|
+
this._databaseService,
|
|
240
375
|
);
|
|
241
376
|
|
|
242
377
|
// Reset builder state after creating the function to prevent pollution
|
|
@@ -245,6 +380,7 @@ export class FunctionBuilder<
|
|
|
245
380
|
this._events = [];
|
|
246
381
|
this._publisher = undefined;
|
|
247
382
|
this._auditorStorage = undefined;
|
|
383
|
+
this._databaseService = undefined;
|
|
248
384
|
this.inputSchema = undefined;
|
|
249
385
|
this.outputSchema = undefined;
|
|
250
386
|
this._timeout = undefined;
|
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
import type { AuditStorage, AuditableAction, Auditor } from '@geekmidas/audit';
|
|
2
|
+
import { DefaultAuditor } from '@geekmidas/audit';
|
|
3
|
+
import { withAuditableTransaction } from '@geekmidas/audit/kysely';
|
|
1
4
|
import type { EnvironmentParser } from '@geekmidas/envkit';
|
|
2
5
|
import type { EventPublisher } from '@geekmidas/events';
|
|
3
6
|
import type { Logger } from '@geekmidas/logger';
|
|
@@ -23,6 +26,14 @@ export abstract class FunctionExecutionWrapper<
|
|
|
23
26
|
TLogger extends Logger = Logger,
|
|
24
27
|
TEventPublisher extends EventPublisher<any> | undefined = undefined,
|
|
25
28
|
TEventPublisherServiceName extends string = string,
|
|
29
|
+
TAuditStorage extends AuditStorage | undefined = undefined,
|
|
30
|
+
TAuditStorageServiceName extends string = string,
|
|
31
|
+
TDatabase = undefined,
|
|
32
|
+
TDatabaseServiceName extends string = string,
|
|
33
|
+
TAuditAction extends AuditableAction<string, unknown> = AuditableAction<
|
|
34
|
+
string,
|
|
35
|
+
unknown
|
|
36
|
+
>,
|
|
26
37
|
> {
|
|
27
38
|
constructor(
|
|
28
39
|
protected envParser: EnvironmentParser<{}>,
|
|
@@ -31,9 +42,22 @@ export abstract class FunctionExecutionWrapper<
|
|
|
31
42
|
TServices,
|
|
32
43
|
TLogger,
|
|
33
44
|
TOutSchema,
|
|
34
|
-
FunctionHandler<TInput, TServices, TLogger, TOutSchema>,
|
|
35
45
|
TEventPublisher,
|
|
36
|
-
TEventPublisherServiceName
|
|
46
|
+
TEventPublisherServiceName,
|
|
47
|
+
TAuditStorage,
|
|
48
|
+
TAuditStorageServiceName,
|
|
49
|
+
TDatabase,
|
|
50
|
+
TDatabaseServiceName,
|
|
51
|
+
TAuditAction,
|
|
52
|
+
FunctionHandler<
|
|
53
|
+
TInput,
|
|
54
|
+
TServices,
|
|
55
|
+
TLogger,
|
|
56
|
+
TOutSchema,
|
|
57
|
+
TDatabase,
|
|
58
|
+
TAuditStorage,
|
|
59
|
+
TAuditAction
|
|
60
|
+
>
|
|
37
61
|
>,
|
|
38
62
|
) {}
|
|
39
63
|
|
|
@@ -56,6 +80,113 @@ export abstract class FunctionExecutionWrapper<
|
|
|
56
80
|
return this.serviceDiscovery.register(this.fn.services);
|
|
57
81
|
}
|
|
58
82
|
|
|
83
|
+
async getDatabase(): Promise<TDatabase | undefined> {
|
|
84
|
+
if (!this.fn.databaseService) {
|
|
85
|
+
return undefined;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
const services = await this.serviceDiscovery.register([
|
|
89
|
+
this.fn.databaseService,
|
|
90
|
+
]);
|
|
91
|
+
|
|
92
|
+
return services[
|
|
93
|
+
this.fn.databaseService.serviceName as keyof typeof services
|
|
94
|
+
] as TDatabase;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* Get the audit storage service if configured.
|
|
99
|
+
* Returns undefined if no auditor storage is configured.
|
|
100
|
+
*/
|
|
101
|
+
async getAuditStorage(): Promise<TAuditStorage | undefined> {
|
|
102
|
+
if (!this.fn.auditorStorageService) {
|
|
103
|
+
return undefined;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
const services = await this.serviceDiscovery.register([
|
|
107
|
+
this.fn.auditorStorageService,
|
|
108
|
+
]);
|
|
109
|
+
|
|
110
|
+
return services[
|
|
111
|
+
this.fn.auditorStorageService.serviceName as keyof typeof services
|
|
112
|
+
] as TAuditStorage;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
* Create an auditor instance for the function.
|
|
117
|
+
* Returns undefined if no auditor storage is configured.
|
|
118
|
+
*/
|
|
119
|
+
async createAuditor(): Promise<Auditor<TAuditAction> | undefined> {
|
|
120
|
+
const storage = await this.getAuditStorage();
|
|
121
|
+
if (!storage) {
|
|
122
|
+
return undefined;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
return new DefaultAuditor<TAuditAction>({
|
|
126
|
+
actor: { id: 'system', type: 'system' },
|
|
127
|
+
storage: storage as AuditStorage,
|
|
128
|
+
metadata: {
|
|
129
|
+
function: this.fn.type,
|
|
130
|
+
},
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/**
|
|
135
|
+
* Execute handler with audit transaction support.
|
|
136
|
+
* If the audit storage has a database (via getDatabase()), wraps execution
|
|
137
|
+
* in a transaction so audits are atomic with handler's database operations.
|
|
138
|
+
*
|
|
139
|
+
* @param handler - The handler function to execute (receives auditor and db)
|
|
140
|
+
* @returns The handler result
|
|
141
|
+
*/
|
|
142
|
+
async executeWithAudit<T>(
|
|
143
|
+
handler: (ctx: {
|
|
144
|
+
auditor?: Auditor<TAuditAction>;
|
|
145
|
+
db?: TDatabase;
|
|
146
|
+
}) => Promise<T>,
|
|
147
|
+
): Promise<T> {
|
|
148
|
+
const auditor = await this.createAuditor();
|
|
149
|
+
const storage = await this.getAuditStorage();
|
|
150
|
+
|
|
151
|
+
// No audit context - just run handler with regular db
|
|
152
|
+
if (!auditor || !storage) {
|
|
153
|
+
const db = await this.getDatabase();
|
|
154
|
+
return handler({ db });
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
// Check if storage has a database and db service names match
|
|
158
|
+
const storageDb = (storage as AuditStorage).getDatabase?.();
|
|
159
|
+
const databaseServiceName = this.fn.databaseService?.serviceName;
|
|
160
|
+
const auditDbServiceName = this.fn.auditorStorageService?.serviceName;
|
|
161
|
+
|
|
162
|
+
// If the audit storage has a database and we're using the same database service
|
|
163
|
+
// (or the audit storage provides the database), use transactional execution
|
|
164
|
+
if (storageDb && databaseServiceName && auditDbServiceName) {
|
|
165
|
+
return withAuditableTransaction(
|
|
166
|
+
storageDb as any,
|
|
167
|
+
auditor as any,
|
|
168
|
+
async (trx) => {
|
|
169
|
+
// Use transaction as db
|
|
170
|
+
const response = await handler({
|
|
171
|
+
auditor,
|
|
172
|
+
db: trx as TDatabase,
|
|
173
|
+
});
|
|
174
|
+
// Audits are flushed by withAuditableTransaction before commit
|
|
175
|
+
return response;
|
|
176
|
+
},
|
|
177
|
+
);
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
// No database on storage or service names don't match - run handler and flush audits after
|
|
181
|
+
const db = await this.getDatabase();
|
|
182
|
+
const response = await handler({ auditor, db });
|
|
183
|
+
|
|
184
|
+
// Flush audits (no transaction)
|
|
185
|
+
await auditor.flush();
|
|
186
|
+
|
|
187
|
+
return response;
|
|
188
|
+
}
|
|
189
|
+
|
|
59
190
|
async getFunctionInput<TEvent>(
|
|
60
191
|
event: TEvent,
|
|
61
192
|
): Promise<InferComposableStandardSchema<TInput>> {
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import type { AuditStorage, AuditableAction, Auditor } from '@geekmidas/audit';
|
|
2
|
+
import { DefaultAuditor } from '@geekmidas/audit';
|
|
1
3
|
import { EnvironmentParser } from '@geekmidas/envkit';
|
|
2
4
|
import type { EventPublisher } from '@geekmidas/events';
|
|
3
5
|
import type { Logger } from '@geekmidas/logger';
|
|
@@ -17,12 +19,20 @@ import type { Function } from './Function';
|
|
|
17
19
|
import { FunctionBuilder } from './FunctionBuilder';
|
|
18
20
|
|
|
19
21
|
export class TestFunctionAdaptor<
|
|
20
|
-
TInput extends
|
|
22
|
+
TInput extends ComposableStandardSchema | undefined = undefined,
|
|
21
23
|
TOutSchema extends StandardSchemaV1 | undefined = undefined,
|
|
22
24
|
TServices extends Service[] = [],
|
|
23
25
|
TLogger extends Logger = Logger,
|
|
24
26
|
TEventPublisher extends EventPublisher<any> | undefined = undefined,
|
|
25
27
|
TEventPublisherServiceName extends string = string,
|
|
28
|
+
TAuditStorage extends AuditStorage | undefined = undefined,
|
|
29
|
+
TAuditStorageServiceName extends string = string,
|
|
30
|
+
TDatabase = undefined,
|
|
31
|
+
TDatabaseServiceName extends string = string,
|
|
32
|
+
TAuditAction extends AuditableAction<string, unknown> = AuditableAction<
|
|
33
|
+
string,
|
|
34
|
+
unknown
|
|
35
|
+
>,
|
|
26
36
|
> {
|
|
27
37
|
static getDefaultServiceDiscovery<
|
|
28
38
|
TInput extends ComposableStandardSchema | undefined = undefined,
|
|
@@ -31,15 +41,28 @@ export class TestFunctionAdaptor<
|
|
|
31
41
|
TLogger extends Logger = Logger,
|
|
32
42
|
TEventPublisher extends EventPublisher<any> | undefined = undefined,
|
|
33
43
|
TEventPublisherServiceName extends string = string,
|
|
44
|
+
TAuditStorage extends AuditStorage | undefined = undefined,
|
|
45
|
+
TAuditStorageServiceName extends string = string,
|
|
46
|
+
TDatabase = undefined,
|
|
47
|
+
TDatabaseServiceName extends string = string,
|
|
48
|
+
TAuditAction extends AuditableAction<string, unknown> = AuditableAction<
|
|
49
|
+
string,
|
|
50
|
+
unknown
|
|
51
|
+
>,
|
|
34
52
|
>(
|
|
35
53
|
fn: Function<
|
|
36
54
|
TInput,
|
|
37
55
|
TServices,
|
|
38
56
|
TLogger,
|
|
39
57
|
TOutSchema,
|
|
40
|
-
any,
|
|
41
58
|
TEventPublisher,
|
|
42
|
-
TEventPublisherServiceName
|
|
59
|
+
TEventPublisherServiceName,
|
|
60
|
+
TAuditStorage,
|
|
61
|
+
TAuditStorageServiceName,
|
|
62
|
+
TDatabase,
|
|
63
|
+
TDatabaseServiceName,
|
|
64
|
+
TAuditAction,
|
|
65
|
+
any
|
|
43
66
|
>,
|
|
44
67
|
) {
|
|
45
68
|
return ServiceDiscovery.getInstance(fn.logger, new EnvironmentParser({}));
|
|
@@ -51,9 +74,14 @@ export class TestFunctionAdaptor<
|
|
|
51
74
|
TServices,
|
|
52
75
|
TLogger,
|
|
53
76
|
TOutSchema,
|
|
54
|
-
any,
|
|
55
77
|
TEventPublisher,
|
|
56
|
-
TEventPublisherServiceName
|
|
78
|
+
TEventPublisherServiceName,
|
|
79
|
+
TAuditStorage,
|
|
80
|
+
TAuditStorageServiceName,
|
|
81
|
+
TDatabase,
|
|
82
|
+
TDatabaseServiceName,
|
|
83
|
+
TAuditAction,
|
|
84
|
+
any
|
|
57
85
|
>,
|
|
58
86
|
private serviceDiscovery: ServiceDiscovery<
|
|
59
87
|
any,
|
|
@@ -66,7 +94,9 @@ export class TestFunctionAdaptor<
|
|
|
66
94
|
TInput,
|
|
67
95
|
TServices,
|
|
68
96
|
TEventPublisher,
|
|
69
|
-
TEventPublisherServiceName
|
|
97
|
+
TEventPublisherServiceName,
|
|
98
|
+
TDatabase,
|
|
99
|
+
TAuditAction
|
|
70
100
|
>,
|
|
71
101
|
): Promise<InferStandardSchema<TOutSchema>> {
|
|
72
102
|
// Parse input if schema is provided
|
|
@@ -89,16 +119,65 @@ export class TestFunctionAdaptor<
|
|
|
89
119
|
services = await this.serviceDiscovery.register(this.fn.services);
|
|
90
120
|
}
|
|
91
121
|
|
|
122
|
+
// Resolve database (use provided db or register from function)
|
|
123
|
+
let db: TDatabase | undefined;
|
|
124
|
+
if ('db' in ctx && ctx.db !== undefined) {
|
|
125
|
+
db = ctx.db;
|
|
126
|
+
} else if (this.fn.databaseService) {
|
|
127
|
+
const dbServices = await this.serviceDiscovery.register([
|
|
128
|
+
this.fn.databaseService,
|
|
129
|
+
]);
|
|
130
|
+
db = dbServices[
|
|
131
|
+
this.fn.databaseService.serviceName as keyof typeof dbServices
|
|
132
|
+
] as TDatabase;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
// Resolve auditor (use provided auditor or create from function)
|
|
136
|
+
let auditor: Auditor<TAuditAction> | undefined;
|
|
137
|
+
if ('auditor' in ctx && ctx.auditor !== undefined) {
|
|
138
|
+
auditor = ctx.auditor;
|
|
139
|
+
} else if (this.fn.auditorStorageService) {
|
|
140
|
+
const auditServices = await this.serviceDiscovery.register([
|
|
141
|
+
this.fn.auditorStorageService,
|
|
142
|
+
]);
|
|
143
|
+
const storage = auditServices[
|
|
144
|
+
this.fn.auditorStorageService.serviceName as keyof typeof auditServices
|
|
145
|
+
] as AuditStorage;
|
|
146
|
+
|
|
147
|
+
auditor = new DefaultAuditor<TAuditAction>({
|
|
148
|
+
actor: { id: 'system', type: 'system' },
|
|
149
|
+
storage,
|
|
150
|
+
metadata: {
|
|
151
|
+
function: this.fn.type,
|
|
152
|
+
test: true,
|
|
153
|
+
},
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
|
|
92
157
|
// Execute the function
|
|
93
158
|
const response = await this.fn['fn']({
|
|
94
159
|
input: parsedInput,
|
|
95
160
|
services,
|
|
96
161
|
logger,
|
|
97
|
-
|
|
162
|
+
db,
|
|
163
|
+
auditor,
|
|
164
|
+
} as any);
|
|
98
165
|
|
|
99
166
|
// Parse output if schema is provided
|
|
100
167
|
const output = await this.fn.parseOutput(response);
|
|
101
168
|
|
|
169
|
+
// Flush audits if any were recorded
|
|
170
|
+
if (auditor) {
|
|
171
|
+
const records = auditor.getRecords();
|
|
172
|
+
if (records.length > 0) {
|
|
173
|
+
logger.debug(
|
|
174
|
+
{ auditCount: records.length },
|
|
175
|
+
'Flushing function audits',
|
|
176
|
+
);
|
|
177
|
+
await auditor.flush();
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
|
|
102
181
|
// Register publisher service if provided in context
|
|
103
182
|
|
|
104
183
|
await publishEvents(
|
|
@@ -114,12 +193,19 @@ export class TestFunctionAdaptor<
|
|
|
114
193
|
}
|
|
115
194
|
|
|
116
195
|
export type TestFunctionRequest<
|
|
117
|
-
TInput extends
|
|
196
|
+
TInput extends ComposableStandardSchema | undefined = undefined,
|
|
118
197
|
TServices extends Service[] = [],
|
|
119
198
|
TEventPublisher extends EventPublisher<any> | undefined = undefined,
|
|
120
199
|
TEventPublisherServiceName extends string = string,
|
|
200
|
+
TDatabase = undefined,
|
|
201
|
+
TAuditAction extends AuditableAction<string, unknown> = AuditableAction<
|
|
202
|
+
string,
|
|
203
|
+
unknown
|
|
204
|
+
>,
|
|
121
205
|
> = {
|
|
122
206
|
input: InferComposableStandardSchema<TInput>;
|
|
123
207
|
services: ServiceRecord<TServices>;
|
|
124
208
|
publisher?: Service<TEventPublisherServiceName, TEventPublisher>;
|
|
209
|
+
db?: TDatabase;
|
|
210
|
+
auditor?: Auditor<TAuditAction>;
|
|
125
211
|
} & InferComposableStandardSchema<{ input: TInput }>;
|
|
@@ -373,4 +373,86 @@ describe('AWSLambdaFunction', () => {
|
|
|
373
373
|
});
|
|
374
374
|
|
|
375
375
|
// Skipping timeout tests for now as middleware order needs to be adjusted
|
|
376
|
+
|
|
377
|
+
describe('database', () => {
|
|
378
|
+
// Mock database service
|
|
379
|
+
class MockDatabase {
|
|
380
|
+
async query(sql: string) {
|
|
381
|
+
return [{ id: '1', name: 'Test User' }];
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
class DatabaseService implements Service<'database', MockDatabase> {
|
|
386
|
+
serviceName = 'database' as const;
|
|
387
|
+
db = new MockDatabase();
|
|
388
|
+
|
|
389
|
+
async register() {
|
|
390
|
+
return this.db;
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
it('should inject database into function context', async () => {
|
|
395
|
+
const databaseService = new DatabaseService();
|
|
396
|
+
const handler = vi.fn(async ({ db }) => {
|
|
397
|
+
const result = await db.query('SELECT * FROM users');
|
|
398
|
+
return { users: result };
|
|
399
|
+
});
|
|
400
|
+
|
|
401
|
+
const outputSchema = z.object({
|
|
402
|
+
users: z.array(z.object({ id: z.string(), name: z.string() })),
|
|
403
|
+
});
|
|
404
|
+
|
|
405
|
+
const fn = new Function(
|
|
406
|
+
handler,
|
|
407
|
+
undefined,
|
|
408
|
+
undefined,
|
|
409
|
+
undefined,
|
|
410
|
+
outputSchema,
|
|
411
|
+
[],
|
|
412
|
+
logger,
|
|
413
|
+
undefined,
|
|
414
|
+
[],
|
|
415
|
+
undefined,
|
|
416
|
+
undefined,
|
|
417
|
+
databaseService,
|
|
418
|
+
);
|
|
419
|
+
|
|
420
|
+
const adaptor = new AWSLambdaFunction(envParser, fn);
|
|
421
|
+
const lambdaHandler = adaptor.handler;
|
|
422
|
+
|
|
423
|
+
const result = await lambdaHandler({}, createMockContext(), vi.fn());
|
|
424
|
+
|
|
425
|
+
expect(result).toEqual({ users: [{ id: '1', name: 'Test User' }] });
|
|
426
|
+
expect(handler).toHaveBeenCalledWith(
|
|
427
|
+
expect.objectContaining({
|
|
428
|
+
db: expect.any(MockDatabase),
|
|
429
|
+
}),
|
|
430
|
+
);
|
|
431
|
+
});
|
|
432
|
+
|
|
433
|
+
it('should have db as undefined when no database service is configured', async () => {
|
|
434
|
+
const handler = vi.fn(async ({ db }) => {
|
|
435
|
+
return { hasDb: db !== undefined };
|
|
436
|
+
});
|
|
437
|
+
|
|
438
|
+
const outputSchema = z.object({ hasDb: z.boolean() });
|
|
439
|
+
|
|
440
|
+
const fn = new Function(
|
|
441
|
+
handler,
|
|
442
|
+
undefined,
|
|
443
|
+
undefined,
|
|
444
|
+
undefined,
|
|
445
|
+
outputSchema,
|
|
446
|
+
[],
|
|
447
|
+
logger,
|
|
448
|
+
);
|
|
449
|
+
|
|
450
|
+
const adaptor = new AWSLambdaFunction(envParser, fn);
|
|
451
|
+
const lambdaHandler = adaptor.handler;
|
|
452
|
+
|
|
453
|
+
const result = await lambdaHandler({}, createMockContext(), vi.fn());
|
|
454
|
+
|
|
455
|
+
expect(result).toEqual({ hasDb: false });
|
|
456
|
+
});
|
|
457
|
+
});
|
|
376
458
|
});
|