@geekmidas/constructs 0.0.12 → 0.0.14
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-BU_R-9LH.d.mts} +10 -10
- 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-D0Ql2Ofm.d.cts} +11 -11
- 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-Cw2if5cG.cjs → HonoEndpointAdaptor-CfLRHHFw.cjs} +8 -4
- package/dist/HonoEndpointAdaptor-CfLRHHFw.cjs.map +1 -0
- package/dist/{HonoEndpointAdaptor-BElil8O5.d.mts → HonoEndpointAdaptor-DANYfDu9.d.mts} +7 -7
- package/dist/{HonoEndpointAdaptor-DAfnTFVS.mjs → HonoEndpointAdaptor-DuyE06nH.mjs} +8 -4
- package/dist/HonoEndpointAdaptor-DuyE06nH.mjs.map +1 -0
- package/dist/{HonoEndpointAdaptor-DSHl8ZCY.d.cts → HonoEndpointAdaptor-_uLz8Bak.d.cts} +7 -7
- 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-CUg_hSq-.d.cts → index-DRf5AP3P.d.mts} +4 -3
- package/dist/index-twsdbZWU.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 +7 -7
- 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-D-a7e2gv.d.mts +0 -9
package/README.md
CHANGED
|
@@ -12,6 +12,7 @@ A comprehensive framework for building type-safe HTTP endpoints, cloud functions
|
|
|
12
12
|
- **Multiple Adapters**: AWS Lambda, API Gateway (v1/v2), and Hono support
|
|
13
13
|
- **StandardSchema Validation**: Works with Zod, Valibot, and other validation libraries
|
|
14
14
|
- **Event Publishing**: Integrated event publishing from any construct
|
|
15
|
+
- **Audit Logging**: Transaction-aware audit system with automatic rollback support
|
|
15
16
|
- **Rate Limiting**: Built-in rate limiting with configurable storage
|
|
16
17
|
- **OpenAPI Integration**: Generate OpenAPI specifications from endpoints
|
|
17
18
|
|
|
@@ -318,6 +319,452 @@ export const createUser = e
|
|
|
318
319
|
});
|
|
319
320
|
```
|
|
320
321
|
|
|
322
|
+
### Database Context
|
|
323
|
+
|
|
324
|
+
Inject a database instance directly into the handler context using `.database()`:
|
|
325
|
+
|
|
326
|
+
```typescript
|
|
327
|
+
import { e } from '@geekmidas/constructs/endpoints';
|
|
328
|
+
import type { Service } from '@geekmidas/services';
|
|
329
|
+
import type { EnvironmentParser } from '@geekmidas/envkit';
|
|
330
|
+
import { Kysely, PostgresDialect } from 'kysely';
|
|
331
|
+
import { z } from 'zod';
|
|
332
|
+
|
|
333
|
+
// Define a database service
|
|
334
|
+
const databaseService = {
|
|
335
|
+
serviceName: 'database' as const,
|
|
336
|
+
async register(envParser: EnvironmentParser<{}>) {
|
|
337
|
+
const config = envParser.create((get) => ({
|
|
338
|
+
url: get('DATABASE_URL').string()
|
|
339
|
+
})).parse();
|
|
340
|
+
|
|
341
|
+
return new Kysely<Database>({
|
|
342
|
+
dialect: new PostgresDialect({
|
|
343
|
+
connectionString: config.url
|
|
344
|
+
})
|
|
345
|
+
});
|
|
346
|
+
}
|
|
347
|
+
} satisfies Service<'database', Kysely<Database>>;
|
|
348
|
+
|
|
349
|
+
// Use .database() to inject db into context
|
|
350
|
+
export const getUsers = e
|
|
351
|
+
.get('/users')
|
|
352
|
+
.output(z.array(userSchema))
|
|
353
|
+
.database(databaseService)
|
|
354
|
+
.handle(async ({ db }) => {
|
|
355
|
+
// db is always defined when .database() is called (not optional)
|
|
356
|
+
const users = await db
|
|
357
|
+
.selectFrom('users')
|
|
358
|
+
.selectAll()
|
|
359
|
+
.execute();
|
|
360
|
+
|
|
361
|
+
return users;
|
|
362
|
+
});
|
|
363
|
+
```
|
|
364
|
+
|
|
365
|
+
**Key features:**
|
|
366
|
+
|
|
367
|
+
- **Type-safe**: `db` is only available in the context when `.database()` is called
|
|
368
|
+
- **Non-optional**: Unlike `services.database`, `db` is always defined (not `undefined`)
|
|
369
|
+
- **Automatic transaction**: When combined with `.auditor()` using `KyselyAuditStorage`, `db` is automatically the transaction
|
|
370
|
+
|
|
371
|
+
#### Database with Audit Transactions
|
|
372
|
+
|
|
373
|
+
When using both `.database()` and `.auditor()` with the same database, `db` is automatically the transaction - ensuring ACID compliance without any extra code:
|
|
374
|
+
|
|
375
|
+
```typescript
|
|
376
|
+
export const createUser = e
|
|
377
|
+
.post('/users')
|
|
378
|
+
.body(z.object({ name: z.string(), email: z.string().email() }))
|
|
379
|
+
.output(userSchema)
|
|
380
|
+
.database(databaseService)
|
|
381
|
+
.auditor(auditStorageService)
|
|
382
|
+
.handle(async ({ body, db }) => {
|
|
383
|
+
// db is automatically the transaction when auditor uses KyselyAuditStorage
|
|
384
|
+
// Both the user insert and audit records commit/rollback together
|
|
385
|
+
const user = await db
|
|
386
|
+
.insertInto('users')
|
|
387
|
+
.values({ id: crypto.randomUUID(), ...body })
|
|
388
|
+
.returningAll()
|
|
389
|
+
.executeTakeFirstOrThrow();
|
|
390
|
+
|
|
391
|
+
return user;
|
|
392
|
+
});
|
|
393
|
+
```
|
|
394
|
+
|
|
395
|
+
**How it works:**
|
|
396
|
+
- Without `.auditor()`: `db` is the raw database connection
|
|
397
|
+
- With `.auditor()` using `KyselyAuditStorage` **with matching `databaseServiceName`**: `db` is automatically the transaction
|
|
398
|
+
- With `.auditor()` using a different storage or different database: `db` remains the raw database
|
|
399
|
+
|
|
400
|
+
For automatic transaction sharing, the audit storage must declare the same database service name:
|
|
401
|
+
|
|
402
|
+
```typescript
|
|
403
|
+
const auditStorageService = {
|
|
404
|
+
serviceName: 'auditStorage' as const,
|
|
405
|
+
async register(envParser: EnvironmentParser<{}>) {
|
|
406
|
+
const db = await databaseService.register(envParser);
|
|
407
|
+
return new KyselyAuditStorage({
|
|
408
|
+
db,
|
|
409
|
+
tableName: 'audit_logs',
|
|
410
|
+
databaseServiceName: 'database', // Must match databaseService.serviceName
|
|
411
|
+
});
|
|
412
|
+
}
|
|
413
|
+
};
|
|
414
|
+
```
|
|
415
|
+
|
|
416
|
+
### Audit Logging
|
|
417
|
+
|
|
418
|
+
Add transaction-aware audit logging to track data changes. Audits run **inside** the same database transaction as your mutations, ensuring they're atomically committed or rolled back together.
|
|
419
|
+
|
|
420
|
+
#### Setting Up Audit Storage
|
|
421
|
+
|
|
422
|
+
First, create an audit storage service using `@geekmidas/audit`:
|
|
423
|
+
|
|
424
|
+
```typescript
|
|
425
|
+
import { KyselyAuditStorage } from '@geekmidas/audit/kysely';
|
|
426
|
+
import type { Service } from '@geekmidas/services';
|
|
427
|
+
import type { EnvironmentParser } from '@geekmidas/envkit';
|
|
428
|
+
|
|
429
|
+
const auditStorageService = {
|
|
430
|
+
serviceName: 'auditStorage' as const,
|
|
431
|
+
async register(envParser: EnvironmentParser<{}>) {
|
|
432
|
+
const db = await databaseService.register(envParser);
|
|
433
|
+
return new KyselyAuditStorage({
|
|
434
|
+
db,
|
|
435
|
+
tableName: 'audit_logs',
|
|
436
|
+
// Set this to enable automatic transaction sharing with .database()
|
|
437
|
+
databaseServiceName: databaseService.serviceName,
|
|
438
|
+
});
|
|
439
|
+
}
|
|
440
|
+
} satisfies Service<'auditStorage', KyselyAuditStorage<Database>>;
|
|
441
|
+
```
|
|
442
|
+
|
|
443
|
+
#### Defining Audit Action Types
|
|
444
|
+
|
|
445
|
+
Define type-safe audit actions for your application:
|
|
446
|
+
|
|
447
|
+
```typescript
|
|
448
|
+
import type { AuditableAction } from '@geekmidas/audit';
|
|
449
|
+
|
|
450
|
+
type AppAuditAction =
|
|
451
|
+
| AuditableAction<'user.created', { userId: string; email: string }>
|
|
452
|
+
| AuditableAction<'user.updated', { userId: string; changes: string[] }>
|
|
453
|
+
| AuditableAction<'user.deleted', { userId: string; reason?: string }>
|
|
454
|
+
| AuditableAction<'order.placed', { orderId: string; total: number }>;
|
|
455
|
+
```
|
|
456
|
+
|
|
457
|
+
#### Declarative Audits
|
|
458
|
+
|
|
459
|
+
Define audits declaratively on the endpoint - they're automatically recorded after successful handler execution:
|
|
460
|
+
|
|
461
|
+
```typescript
|
|
462
|
+
import { e } from '@geekmidas/constructs/endpoints';
|
|
463
|
+
import { z } from 'zod';
|
|
464
|
+
|
|
465
|
+
const userSchema = z.object({
|
|
466
|
+
id: z.string(),
|
|
467
|
+
name: z.string(),
|
|
468
|
+
email: z.string().email()
|
|
469
|
+
});
|
|
470
|
+
|
|
471
|
+
export const createUser = e
|
|
472
|
+
.post('/users')
|
|
473
|
+
.body(z.object({ name: z.string(), email: z.string().email() }))
|
|
474
|
+
.output(userSchema)
|
|
475
|
+
.database(databaseService)
|
|
476
|
+
.auditor(auditStorageService)
|
|
477
|
+
// Optional: extract actor from request context
|
|
478
|
+
.actor(({ session, header }) => ({
|
|
479
|
+
id: session?.userId ?? 'anonymous',
|
|
480
|
+
type: session ? 'user' : 'anonymous',
|
|
481
|
+
ip: header('x-forwarded-for'),
|
|
482
|
+
}))
|
|
483
|
+
// Declarative audits - type-safe with AppAuditAction
|
|
484
|
+
.audit<AppAuditAction>([
|
|
485
|
+
{
|
|
486
|
+
type: 'user.created',
|
|
487
|
+
payload: (response) => ({
|
|
488
|
+
userId: response.id,
|
|
489
|
+
email: response.email,
|
|
490
|
+
}),
|
|
491
|
+
// Optional: only audit when condition is true
|
|
492
|
+
when: (response) => response.email !== 'system@example.com',
|
|
493
|
+
// Optional: link audit to entity for querying
|
|
494
|
+
entityId: (response) => response.id,
|
|
495
|
+
table: 'users',
|
|
496
|
+
},
|
|
497
|
+
])
|
|
498
|
+
.handle(async ({ body, db }) => {
|
|
499
|
+
// db is automatically the transaction when auditor uses KyselyAuditStorage
|
|
500
|
+
const user = await db
|
|
501
|
+
.insertInto('users')
|
|
502
|
+
.values({ id: crypto.randomUUID(), ...body })
|
|
503
|
+
.returningAll()
|
|
504
|
+
.executeTakeFirstOrThrow();
|
|
505
|
+
|
|
506
|
+
return user;
|
|
507
|
+
});
|
|
508
|
+
```
|
|
509
|
+
|
|
510
|
+
**Important**: When using `KyselyAuditStorage`, the adaptor wraps handler execution in a database transaction. The `db` in the context is automatically the transaction, so you can use it directly for ACID-compliant mutations.
|
|
511
|
+
|
|
512
|
+
#### Manual Audits in Handlers
|
|
513
|
+
|
|
514
|
+
For complex scenarios, use `ctx.auditor` to record audits manually within your handler:
|
|
515
|
+
|
|
516
|
+
```typescript
|
|
517
|
+
export const processOrder = e
|
|
518
|
+
.post('/orders')
|
|
519
|
+
.database(databaseService)
|
|
520
|
+
.services([paymentService])
|
|
521
|
+
.auditor(auditStorageService)
|
|
522
|
+
.actor(({ session }) => ({ id: session.userId, type: 'user' }))
|
|
523
|
+
.handle(async ({ body, db, services, auditor }) => {
|
|
524
|
+
// db is automatically the transaction when auditor uses KyselyAuditStorage
|
|
525
|
+
const order = await db
|
|
526
|
+
.insertInto('orders')
|
|
527
|
+
.values(body)
|
|
528
|
+
.returningAll()
|
|
529
|
+
.executeTakeFirstOrThrow();
|
|
530
|
+
|
|
531
|
+
// Manual audit for payment (external service call)
|
|
532
|
+
const payment = await services.payment.charge(order.total);
|
|
533
|
+
auditor.audit('payment.processed', {
|
|
534
|
+
orderId: order.id,
|
|
535
|
+
amount: order.total,
|
|
536
|
+
transactionId: payment.transactionId,
|
|
537
|
+
});
|
|
538
|
+
|
|
539
|
+
// Conditional audit for high-value orders
|
|
540
|
+
if (order.total > 10000) {
|
|
541
|
+
auditor.audit('order.high_value', {
|
|
542
|
+
orderId: order.id,
|
|
543
|
+
total: order.total,
|
|
544
|
+
requiresReview: true,
|
|
545
|
+
});
|
|
546
|
+
}
|
|
547
|
+
|
|
548
|
+
return order;
|
|
549
|
+
});
|
|
550
|
+
```
|
|
551
|
+
|
|
552
|
+
#### Combined Declarative and Manual Audits
|
|
553
|
+
|
|
554
|
+
You can use both approaches together:
|
|
555
|
+
|
|
556
|
+
```typescript
|
|
557
|
+
export const updateUser = e
|
|
558
|
+
.put('/users/:id')
|
|
559
|
+
.params(z.object({ id: z.string() }))
|
|
560
|
+
.body(z.object({ name: z.string().optional(), email: z.string().email().optional() }))
|
|
561
|
+
.output(userSchema)
|
|
562
|
+
.database(databaseService)
|
|
563
|
+
.auditor(auditStorageService)
|
|
564
|
+
.actor(({ session }) => ({ id: session.userId, type: 'user' }))
|
|
565
|
+
// Declarative audit - always runs on success
|
|
566
|
+
.audit<AppAuditAction>([
|
|
567
|
+
{
|
|
568
|
+
type: 'user.updated',
|
|
569
|
+
payload: (response) => ({
|
|
570
|
+
userId: response.id,
|
|
571
|
+
changes: ['profile'],
|
|
572
|
+
}),
|
|
573
|
+
},
|
|
574
|
+
])
|
|
575
|
+
.handle(async ({ params, body, db, auditor }) => {
|
|
576
|
+
// db is automatically the transaction when auditor uses KyselyAuditStorage
|
|
577
|
+
|
|
578
|
+
// Fetch old values for comparison
|
|
579
|
+
const oldUser = await db
|
|
580
|
+
.selectFrom('users')
|
|
581
|
+
.where('id', '=', params.id)
|
|
582
|
+
.selectAll()
|
|
583
|
+
.executeTakeFirstOrThrow();
|
|
584
|
+
|
|
585
|
+
// Update user
|
|
586
|
+
const user = await db
|
|
587
|
+
.updateTable('users')
|
|
588
|
+
.set(body)
|
|
589
|
+
.where('id', '=', params.id)
|
|
590
|
+
.returningAll()
|
|
591
|
+
.executeTakeFirstOrThrow();
|
|
592
|
+
|
|
593
|
+
// Manual audit with old/new values for detailed change tracking
|
|
594
|
+
if (oldUser.email !== user.email) {
|
|
595
|
+
auditor.audit('user.email_changed', {
|
|
596
|
+
userId: user.id,
|
|
597
|
+
oldEmail: oldUser.email,
|
|
598
|
+
newEmail: user.email,
|
|
599
|
+
});
|
|
600
|
+
}
|
|
601
|
+
|
|
602
|
+
return user;
|
|
603
|
+
});
|
|
604
|
+
```
|
|
605
|
+
|
|
606
|
+
#### How Transaction Support Works
|
|
607
|
+
|
|
608
|
+
When using `KyselyAuditStorage`, the adaptor automatically:
|
|
609
|
+
|
|
610
|
+
1. **Creates an audit context** before handler execution
|
|
611
|
+
2. **Wraps execution in a transaction** using `withAuditableTransaction`
|
|
612
|
+
3. **Passes the auditor** to your handler via `ctx.auditor`
|
|
613
|
+
4. **Processes declarative audits** after the handler succeeds
|
|
614
|
+
5. **Flushes all audits** to storage inside the transaction
|
|
615
|
+
6. **Commits or rolls back** - if the handler throws, both data and audits are rolled back
|
|
616
|
+
|
|
617
|
+
```
|
|
618
|
+
┌─────────────────────────────────────────────────────────────┐
|
|
619
|
+
│ Request Flow │
|
|
620
|
+
├─────────────────────────────────────────────────────────────┤
|
|
621
|
+
│ 1. Create audit context (auditor + storage) │
|
|
622
|
+
│ 2. BEGIN TRANSACTION │
|
|
623
|
+
│ ├── Execute handler (with ctx.auditor) │
|
|
624
|
+
│ ├── Handler calls auditor.audit() for manual audits │
|
|
625
|
+
│ ├── Process declarative .audit() definitions │
|
|
626
|
+
│ ├── Flush all audit records to storage │
|
|
627
|
+
│ 3. COMMIT (or ROLLBACK if handler throws) │
|
|
628
|
+
└─────────────────────────────────────────────────────────────┘
|
|
629
|
+
```
|
|
630
|
+
|
|
631
|
+
This ensures:
|
|
632
|
+
- **Atomicity**: Audits are never written if the mutation fails
|
|
633
|
+
- **Consistency**: No orphaned audit records for failed operations
|
|
634
|
+
- **Rollback safety**: Manual audits recorded before a later error are also rolled back
|
|
635
|
+
|
|
636
|
+
#### Audit Table Migration
|
|
637
|
+
|
|
638
|
+
Create a Kysely migration for the audit table:
|
|
639
|
+
|
|
640
|
+
```typescript
|
|
641
|
+
// migrations/YYYYMMDDHHMMSS_create_audit_logs.ts
|
|
642
|
+
import type { Kysely } from 'kysely';
|
|
643
|
+
import { sql } from 'kysely';
|
|
644
|
+
|
|
645
|
+
export async function up(db: Kysely<unknown>): Promise<void> {
|
|
646
|
+
await db.schema
|
|
647
|
+
.createTable('audit_logs')
|
|
648
|
+
.addColumn('id', 'varchar(32)', (col) => col.primaryKey())
|
|
649
|
+
.addColumn('type', 'varchar', (col) => col.notNull())
|
|
650
|
+
.addColumn('operation', 'varchar', (col) => col.notNull())
|
|
651
|
+
.addColumn('table', 'varchar')
|
|
652
|
+
.addColumn('entity_id', 'varchar')
|
|
653
|
+
.addColumn('old_values', 'jsonb')
|
|
654
|
+
.addColumn('new_values', 'jsonb')
|
|
655
|
+
.addColumn('payload', 'jsonb')
|
|
656
|
+
.addColumn('timestamp', 'timestamp', (col) =>
|
|
657
|
+
col.defaultTo(sql`now()`).notNull(),
|
|
658
|
+
)
|
|
659
|
+
.addColumn('actor_id', 'varchar')
|
|
660
|
+
.addColumn('actor_type', 'varchar')
|
|
661
|
+
.addColumn('actor_data', 'jsonb')
|
|
662
|
+
.addColumn('metadata', 'jsonb')
|
|
663
|
+
.execute();
|
|
664
|
+
|
|
665
|
+
// Create indexes for common queries
|
|
666
|
+
await db.schema
|
|
667
|
+
.createIndex('idx_audit_logs_type')
|
|
668
|
+
.on('audit_logs')
|
|
669
|
+
.column('type')
|
|
670
|
+
.execute();
|
|
671
|
+
|
|
672
|
+
await db.schema
|
|
673
|
+
.createIndex('idx_audit_logs_entity')
|
|
674
|
+
.on('audit_logs')
|
|
675
|
+
.column('entity_id')
|
|
676
|
+
.execute();
|
|
677
|
+
|
|
678
|
+
await db.schema
|
|
679
|
+
.createIndex('idx_audit_logs_actor')
|
|
680
|
+
.on('audit_logs')
|
|
681
|
+
.column('actor_id')
|
|
682
|
+
.execute();
|
|
683
|
+
|
|
684
|
+
await db.schema
|
|
685
|
+
.createIndex('idx_audit_logs_timestamp')
|
|
686
|
+
.on('audit_logs')
|
|
687
|
+
.column('timestamp')
|
|
688
|
+
.execute();
|
|
689
|
+
}
|
|
690
|
+
|
|
691
|
+
export async function down(db: Kysely<unknown>): Promise<void> {
|
|
692
|
+
await db.schema.dropTable('audit_logs').execute();
|
|
693
|
+
}
|
|
694
|
+
```
|
|
695
|
+
|
|
696
|
+
If using camelCase column names with Kysely's `CamelCasePlugin`:
|
|
697
|
+
|
|
698
|
+
```typescript
|
|
699
|
+
// migrations/YYYYMMDDHHMMSS_create_audit_logs.ts
|
|
700
|
+
import type { Kysely } from 'kysely';
|
|
701
|
+
import { sql } from 'kysely';
|
|
702
|
+
|
|
703
|
+
export async function up(db: Kysely<unknown>): Promise<void> {
|
|
704
|
+
await db.schema
|
|
705
|
+
.createTable('auditLogs')
|
|
706
|
+
.addColumn('id', 'varchar(32)', (col) => col.primaryKey())
|
|
707
|
+
.addColumn('type', 'varchar', (col) => col.notNull())
|
|
708
|
+
.addColumn('operation', 'varchar', (col) => col.notNull())
|
|
709
|
+
.addColumn('table', 'varchar')
|
|
710
|
+
.addColumn('entityId', 'varchar')
|
|
711
|
+
.addColumn('oldValues', 'jsonb')
|
|
712
|
+
.addColumn('newValues', 'jsonb')
|
|
713
|
+
.addColumn('payload', 'jsonb')
|
|
714
|
+
.addColumn('timestamp', 'timestamp', (col) =>
|
|
715
|
+
col.defaultTo(sql`now()`).notNull(),
|
|
716
|
+
)
|
|
717
|
+
.addColumn('actorId', 'varchar')
|
|
718
|
+
.addColumn('actorType', 'varchar')
|
|
719
|
+
.addColumn('actorData', 'jsonb')
|
|
720
|
+
.addColumn('metadata', 'jsonb')
|
|
721
|
+
.execute();
|
|
722
|
+
|
|
723
|
+
await db.schema
|
|
724
|
+
.createIndex('idx_audit_logs_type')
|
|
725
|
+
.on('auditLogs')
|
|
726
|
+
.column('type')
|
|
727
|
+
.execute();
|
|
728
|
+
|
|
729
|
+
await db.schema
|
|
730
|
+
.createIndex('idx_audit_logs_entity')
|
|
731
|
+
.on('auditLogs')
|
|
732
|
+
.column('entityId')
|
|
733
|
+
.execute();
|
|
734
|
+
|
|
735
|
+
await db.schema
|
|
736
|
+
.createIndex('idx_audit_logs_actor')
|
|
737
|
+
.on('auditLogs')
|
|
738
|
+
.column('actorId')
|
|
739
|
+
.execute();
|
|
740
|
+
|
|
741
|
+
await db.schema
|
|
742
|
+
.createIndex('idx_audit_logs_timestamp')
|
|
743
|
+
.on('auditLogs')
|
|
744
|
+
.column('timestamp')
|
|
745
|
+
.execute();
|
|
746
|
+
}
|
|
747
|
+
|
|
748
|
+
export async function down(db: Kysely<unknown>): Promise<void> {
|
|
749
|
+
await db.schema.dropTable('auditLogs').execute();
|
|
750
|
+
}
|
|
751
|
+
```
|
|
752
|
+
|
|
753
|
+
#### Querying Audit Records
|
|
754
|
+
|
|
755
|
+
The `KyselyAuditStorage` provides a `query` method:
|
|
756
|
+
|
|
757
|
+
```typescript
|
|
758
|
+
// In a handler or service
|
|
759
|
+
const audits = await auditStorage.query({
|
|
760
|
+
entityId: userId,
|
|
761
|
+
table: 'users',
|
|
762
|
+
limit: 50,
|
|
763
|
+
orderBy: 'timestamp',
|
|
764
|
+
orderDirection: 'desc',
|
|
765
|
+
});
|
|
766
|
+
```
|
|
767
|
+
|
|
321
768
|
### Rate Limiting
|
|
322
769
|
|
|
323
770
|
Add rate limiting to endpoints:
|
|
@@ -603,6 +1050,7 @@ const envVars = await endpoint.getEnvironment();
|
|
|
603
1050
|
|
|
604
1051
|
- [@geekmidas/services](../services) - Service discovery and dependency injection
|
|
605
1052
|
- [@geekmidas/events](../events) - Event publishing and subscription
|
|
1053
|
+
- [@geekmidas/audit](../audit) - Transaction-aware audit logging
|
|
606
1054
|
- [@geekmidas/logger](../logger) - Structured logging
|
|
607
1055
|
- [@geekmidas/envkit](../envkit) - Environment configuration
|
|
608
1056
|
- [@geekmidas/errors](../errors) - HTTP error classes
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { Function, FunctionHandler } from "./Function-VI1TB3Mh.cjs";
|
|
2
|
+
import { FunctionExecutionWrapper } from "./FunctionExecutionWrapper-CwtwYozd.cjs";
|
|
3
|
+
import { AuditStorage, AuditableAction } from "@geekmidas/audit";
|
|
4
|
+
import { EventPublisher } from "@geekmidas/events";
|
|
5
|
+
import { Logger } from "@geekmidas/logger";
|
|
6
|
+
import { Service } from "@geekmidas/services";
|
|
7
|
+
import { StandardSchemaV1 } from "@standard-schema/spec";
|
|
8
|
+
import { ComposableStandardSchema } from "@geekmidas/schema";
|
|
9
|
+
import { EnvironmentParser } from "@geekmidas/envkit";
|
|
10
|
+
import { Handler } from "aws-lambda";
|
|
11
|
+
|
|
12
|
+
//#region src/functions/AWSLambdaFunction.d.ts
|
|
13
|
+
type AWSLambdaHandler<TEvent = any, TResult = any> = Handler<TEvent, TResult>;
|
|
14
|
+
declare class AWSLambdaFunction<TInput extends ComposableStandardSchema | undefined = undefined, TOutSchema extends StandardSchemaV1 | undefined = undefined, TServices extends Service[] = [], TLogger extends Logger = Logger, TEventPublisher extends EventPublisher<any> | undefined = undefined, TEventPublisherServiceName extends string = string, TAuditStorage extends AuditStorage | undefined = undefined, TAuditStorageServiceName extends string = string, TDatabase = undefined, TDatabaseServiceName extends string = string, TAuditAction extends AuditableAction<string, unknown> = AuditableAction<string, unknown>> extends FunctionExecutionWrapper<TInput, TOutSchema, TServices, TLogger, TEventPublisher, TEventPublisherServiceName, TAuditStorage, TAuditStorageServiceName, TDatabase, TDatabaseServiceName, TAuditAction> {
|
|
15
|
+
readonly fn: Function<TInput, TServices, TLogger, TOutSchema, TEventPublisher, TEventPublisherServiceName, TAuditStorage, TAuditStorageServiceName, TDatabase, TDatabaseServiceName, TAuditAction, FunctionHandler<TInput, TServices, TLogger, TOutSchema, TDatabase, TAuditStorage, TAuditAction>>;
|
|
16
|
+
constructor(envParser: EnvironmentParser<{}>, fn: Function<TInput, TServices, TLogger, TOutSchema, TEventPublisher, TEventPublisherServiceName, TAuditStorage, TAuditStorageServiceName, TDatabase, TDatabaseServiceName, TAuditAction, FunctionHandler<TInput, TServices, TLogger, TOutSchema, TDatabase, TAuditStorage, TAuditAction>>);
|
|
17
|
+
private error;
|
|
18
|
+
private baseInput;
|
|
19
|
+
private input;
|
|
20
|
+
private loggerMiddleware;
|
|
21
|
+
private services;
|
|
22
|
+
private database;
|
|
23
|
+
private auditor;
|
|
24
|
+
private events;
|
|
25
|
+
private _handler;
|
|
26
|
+
get handler(): AWSLambdaHandler;
|
|
27
|
+
}
|
|
28
|
+
//#endregion
|
|
29
|
+
export { AWSLambdaFunction, AWSLambdaHandler };
|
|
30
|
+
//# sourceMappingURL=AWSLambdaFunction-B-Oxr8qt.d.cts.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
const require_chunk = require('./chunk-CUT6urMc.cjs');
|
|
2
|
-
const require_FunctionBuilder = require('./FunctionBuilder-
|
|
3
|
-
const require_FunctionExecutionWrapper = require('./FunctionExecutionWrapper-
|
|
2
|
+
const require_FunctionBuilder = require('./FunctionBuilder-DXvG_XD-.cjs');
|
|
3
|
+
const require_FunctionExecutionWrapper = require('./FunctionExecutionWrapper-DkNycmOh.cjs');
|
|
4
4
|
const __geekmidas_errors = require_chunk.__toESM(require("@geekmidas/errors"));
|
|
5
5
|
const __middy_core = require_chunk.__toESM(require("@middy/core"));
|
|
6
6
|
|
|
@@ -54,6 +54,27 @@ var AWSLambdaFunction = class extends require_FunctionExecutionWrapper.FunctionE
|
|
|
54
54
|
req.event.services = await this.getServices();
|
|
55
55
|
} };
|
|
56
56
|
}
|
|
57
|
+
database() {
|
|
58
|
+
return { before: async (req) => {
|
|
59
|
+
req.event.db = await this.getDatabase();
|
|
60
|
+
} };
|
|
61
|
+
}
|
|
62
|
+
auditor() {
|
|
63
|
+
return {
|
|
64
|
+
before: async (req) => {
|
|
65
|
+
req.event.auditor = await this.createAuditor();
|
|
66
|
+
},
|
|
67
|
+
after: async (req) => {
|
|
68
|
+
if (req.event.auditor) {
|
|
69
|
+
const records = req.event.auditor.getRecords();
|
|
70
|
+
if (records.length > 0) {
|
|
71
|
+
this.logger.debug({ auditCount: records.length }, "Flushing function audits");
|
|
72
|
+
await req.event.auditor.flush();
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
};
|
|
77
|
+
}
|
|
57
78
|
events() {
|
|
58
79
|
return { after: async (req) => {
|
|
59
80
|
const response = req.response || void 0;
|
|
@@ -64,14 +85,16 @@ var AWSLambdaFunction = class extends require_FunctionExecutionWrapper.FunctionE
|
|
|
64
85
|
const result = await this.fn["fn"]({
|
|
65
86
|
input: event.parsedInput,
|
|
66
87
|
services: event.services,
|
|
67
|
-
logger: event.logger
|
|
88
|
+
logger: event.logger,
|
|
89
|
+
db: event.db,
|
|
90
|
+
auditor: event.auditor
|
|
68
91
|
});
|
|
69
92
|
const output = await this.fn.parseOutput(result);
|
|
70
93
|
return output;
|
|
71
94
|
}
|
|
72
95
|
get handler() {
|
|
73
96
|
const handler = this._handler.bind(this);
|
|
74
|
-
return (0, __middy_core.default)(handler).use(this.loggerMiddleware()).use(this.baseInput()).use(this.error()).use(this.services()).use(this.input()).use(this.events());
|
|
97
|
+
return (0, __middy_core.default)(handler).use(this.loggerMiddleware()).use(this.baseInput()).use(this.error()).use(this.services()).use(this.database()).use(this.auditor()).use(this.input()).use(this.events());
|
|
75
98
|
}
|
|
76
99
|
};
|
|
77
100
|
|
|
@@ -82,4 +105,4 @@ Object.defineProperty(exports, 'AWSLambdaFunction', {
|
|
|
82
105
|
return AWSLambdaFunction;
|
|
83
106
|
}
|
|
84
107
|
});
|
|
85
|
-
//# sourceMappingURL=AWSLambdaFunction-
|
|
108
|
+
//# sourceMappingURL=AWSLambdaFunction-C-fuCLA3.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AWSLambdaFunction-C-fuCLA3.cjs","names":["FunctionExecutionWrapper","envParser: EnvironmentParser<{}>","fn: Function<\n TInput,\n TServices,\n TLogger,\n TOutSchema,\n TEventPublisher,\n TEventPublisherServiceName,\n TAuditStorage,\n TAuditStorageServiceName,\n TDatabase,\n TDatabaseServiceName,\n TAuditAction,\n FunctionHandler<\n TInput,\n TServices,\n TLogger,\n TOutSchema,\n TDatabase,\n TAuditStorage,\n TAuditAction\n >\n >","event: FunctionEvent<\n TEvent,\n TInput,\n TServices,\n TLogger,\n TDatabase,\n TAuditAction\n >"],"sources":["../src/functions/AWSLambdaFunction.ts"],"sourcesContent":["import type { AuditStorage, AuditableAction, Auditor } from '@geekmidas/audit';\nimport type { EnvironmentParser } from '@geekmidas/envkit';\nimport middy, { type MiddlewareObj } from '@middy/core';\nimport type { StandardSchemaV1 } from '@standard-schema/spec';\nimport type { Context, Handler } from 'aws-lambda';\nimport type { Function, FunctionHandler } from './Function';\nimport { FunctionBuilder } from './FunctionBuilder';\n\nimport { wrapError } from '@geekmidas/errors';\nimport type { EventPublisher } from '@geekmidas/events';\nimport type { Logger } from '@geekmidas/logger';\nimport type {\n ComposableStandardSchema,\n InferComposableStandardSchema,\n InferStandardSchema,\n} from '@geekmidas/schema';\nimport type { Service, ServiceRecord } from '@geekmidas/services';\nimport { FunctionExecutionWrapper } from './FunctionExecutionWrapper';\n\nexport type AWSLambdaHandler<TEvent = any, TResult = any> = Handler<\n TEvent,\n TResult\n>;\n\ntype FunctionEvent<\n TEvent,\n TInput extends ComposableStandardSchema | undefined,\n TServices extends Service[],\n TLogger extends Logger,\n TDatabase = undefined,\n TAuditAction extends AuditableAction<string, unknown> = AuditableAction<\n string,\n unknown\n >,\n> = TEvent & {\n parsedInput: InferComposableStandardSchema<TInput>;\n services: ServiceRecord<TServices>;\n logger: TLogger;\n db: TDatabase | undefined;\n auditor: Auditor<TAuditAction> | undefined;\n};\n\ntype Middleware<\n TEvent,\n TInput extends ComposableStandardSchema | undefined,\n TServices extends Service[],\n TLogger extends Logger,\n TOutSchema extends StandardSchemaV1 | undefined,\n TDatabase = undefined,\n TAuditAction extends AuditableAction<string, unknown> = AuditableAction<\n string,\n unknown\n >,\n> = MiddlewareObj<\n FunctionEvent<TEvent, TInput, TServices, TLogger, TDatabase, TAuditAction>,\n InferComposableStandardSchema<TOutSchema>,\n Error,\n Context\n>;\n\nexport class AWSLambdaFunction<\n TInput extends ComposableStandardSchema | undefined = undefined,\n TOutSchema extends StandardSchemaV1 | undefined = undefined,\n TServices extends Service[] = [],\n TLogger extends Logger = Logger,\n TEventPublisher extends EventPublisher<any> | undefined = undefined,\n TEventPublisherServiceName extends string = string,\n TAuditStorage extends AuditStorage | undefined = undefined,\n TAuditStorageServiceName extends string = string,\n TDatabase = undefined,\n TDatabaseServiceName extends string = string,\n TAuditAction extends AuditableAction<string, unknown> = AuditableAction<\n string,\n unknown\n >,\n> extends FunctionExecutionWrapper<\n TInput,\n TOutSchema,\n TServices,\n TLogger,\n TEventPublisher,\n TEventPublisherServiceName,\n TAuditStorage,\n TAuditStorageServiceName,\n TDatabase,\n TDatabaseServiceName,\n TAuditAction\n> {\n constructor(\n envParser: EnvironmentParser<{}>,\n readonly fn: Function<\n TInput,\n TServices,\n TLogger,\n TOutSchema,\n TEventPublisher,\n TEventPublisherServiceName,\n TAuditStorage,\n TAuditStorageServiceName,\n TDatabase,\n TDatabaseServiceName,\n TAuditAction,\n FunctionHandler<\n TInput,\n TServices,\n TLogger,\n TOutSchema,\n TDatabase,\n TAuditStorage,\n TAuditAction\n >\n >,\n ) {\n super(envParser, fn);\n }\n\n private error<TEvent>(): Middleware<\n TEvent,\n TInput,\n TServices,\n TLogger,\n TOutSchema,\n TDatabase,\n TAuditAction\n > {\n return {\n onError: (req) => {\n const logger = req.event?.logger || this.fn.logger;\n logger.error(req.error || {}, 'Error processing function');\n\n // Re-throw the wrapped error to let Lambda handle it\n throw wrapError(req.error);\n },\n };\n }\n\n private baseInput<TEvent>(): Middleware<\n TEvent,\n TInput,\n TServices,\n TLogger,\n TOutSchema,\n TDatabase,\n TAuditAction\n > {\n return {\n before: (req) => {},\n };\n }\n\n private input<\n TEvent extends { input: InferComposableStandardSchema<TInput> },\n >(): Middleware<\n TEvent,\n TInput,\n TServices,\n TLogger,\n TOutSchema,\n TDatabase,\n TAuditAction\n > {\n return {\n before: async (req) => {\n try {\n // Parse input if schema is provided\n if (this.fn.input) {\n const parsedInput =\n await FunctionBuilder.parseComposableStandardSchema(\n req.event,\n this.fn.input,\n );\n\n req.event.parsedInput =\n parsedInput as InferComposableStandardSchema<TInput>;\n } else {\n // If no schema, pass the event as-is\n req.event.parsedInput = req.event as any;\n }\n } catch (error) {\n this.logger.error(\n { error, event: req.event },\n 'Failed to parse input',\n );\n throw error;\n }\n },\n };\n }\n\n private loggerMiddleware<TEvent>(): Middleware<\n TEvent,\n TInput,\n TServices,\n TLogger,\n TOutSchema,\n TDatabase,\n TAuditAction\n > {\n return {\n before: (req) => {\n this._logger = this.fn.logger.child({\n fn: {\n name: req.context.functionName,\n version: req.context.functionVersion,\n memory: req.context.memoryLimitInMB,\n },\n req: {\n id: req.context.awsRequestId,\n },\n }) as TLogger;\n\n req.event.logger = this._logger;\n },\n };\n }\n\n private services<TEvent>(): Middleware<\n TEvent,\n TInput,\n TServices,\n TLogger,\n TOutSchema,\n TDatabase,\n TAuditAction\n > {\n return {\n before: async (req) => {\n req.event.services = await this.getServices();\n },\n };\n }\n\n private database<TEvent>(): Middleware<\n TEvent,\n TInput,\n TServices,\n TLogger,\n TOutSchema,\n TDatabase,\n TAuditAction\n > {\n return {\n before: async (req) => {\n req.event.db = await this.getDatabase();\n },\n };\n }\n\n private auditor<TEvent>(): Middleware<\n TEvent,\n TInput,\n TServices,\n TLogger,\n TOutSchema,\n TDatabase,\n TAuditAction\n > {\n return {\n before: async (req) => {\n req.event.auditor = await this.createAuditor();\n },\n after: async (req) => {\n // Flush any pending audits after successful execution\n if (req.event.auditor) {\n const records = req.event.auditor.getRecords();\n if (records.length > 0) {\n this.logger.debug(\n { auditCount: records.length },\n 'Flushing function audits',\n );\n await req.event.auditor.flush();\n }\n }\n },\n };\n }\n\n private events<TEvent>(): Middleware<\n TEvent,\n TInput,\n TServices,\n TLogger,\n TOutSchema,\n TDatabase,\n TAuditAction\n > {\n return {\n after: async (req) => {\n const response = (req.response ||\n undefined) as InferStandardSchema<TOutSchema>;\n await this.publishEvents(response);\n },\n };\n }\n\n private async _handler<TEvent>(\n event: FunctionEvent<\n TEvent,\n TInput,\n TServices,\n TLogger,\n TDatabase,\n TAuditAction\n >,\n ) {\n // Execute the function with the parsed context\n const result = await this.fn['fn']({\n input: event.parsedInput,\n services: event.services,\n logger: event.logger,\n db: event.db,\n auditor: event.auditor,\n } as any);\n\n // Parse output if schema is provided\n const output = await this.fn.parseOutput(result);\n\n return output;\n }\n\n get handler(): AWSLambdaHandler {\n const handler = this._handler.bind(this);\n\n // Apply middleware in order\n return middy(handler)\n .use(this.loggerMiddleware())\n .use(this.baseInput())\n .use(this.error())\n .use(this.services())\n .use(this.database())\n .use(this.auditor())\n .use(this.input())\n .use(this.events()) as unknown as AWSLambdaHandler;\n }\n}\n"],"mappings":";;;;;;;AA4DA,IAAa,oBAAb,cAeUA,0DAYR;CACA,YACEC,WACSC,IAsBT;AACA,QAAM,WAAW,GAAG;EAvBX;CAwBV;CAED,AAAQ,QAQN;AACA,SAAO,EACL,SAAS,CAAC,QAAQ;GAChB,MAAM,SAAS,IAAI,OAAO,UAAU,KAAK,GAAG;AAC5C,UAAO,MAAM,IAAI,SAAS,CAAE,GAAE,4BAA4B;AAG1D,SAAM,kCAAU,IAAI,MAAM;EAC3B,EACF;CACF;CAED,AAAQ,YAQN;AACA,SAAO,EACL,QAAQ,CAAC,QAAQ,CAAE,EACpB;CACF;CAED,AAAQ,QAUN;AACA,SAAO,EACL,QAAQ,OAAO,QAAQ;AACrB,OAAI;AAEF,QAAI,KAAK,GAAG,OAAO;KACjB,MAAM,cACJ,MAAM,wCAAgB,8BACpB,IAAI,OACJ,KAAK,GAAG,MACT;AAEH,SAAI,MAAM,cACR;IACH,MAEC,KAAI,MAAM,cAAc,IAAI;GAE/B,SAAQ,OAAO;AACd,SAAK,OAAO,MACV;KAAE;KAAO,OAAO,IAAI;IAAO,GAC3B,wBACD;AACD,UAAM;GACP;EACF,EACF;CACF;CAED,AAAQ,mBAQN;AACA,SAAO,EACL,QAAQ,CAAC,QAAQ;AACf,QAAK,UAAU,KAAK,GAAG,OAAO,MAAM;IAClC,IAAI;KACF,MAAM,IAAI,QAAQ;KAClB,SAAS,IAAI,QAAQ;KACrB,QAAQ,IAAI,QAAQ;IACrB;IACD,KAAK,EACH,IAAI,IAAI,QAAQ,aACjB;GACF,EAAC;AAEF,OAAI,MAAM,SAAS,KAAK;EACzB,EACF;CACF;CAED,AAAQ,WAQN;AACA,SAAO,EACL,QAAQ,OAAO,QAAQ;AACrB,OAAI,MAAM,WAAW,MAAM,KAAK,aAAa;EAC9C,EACF;CACF;CAED,AAAQ,WAQN;AACA,SAAO,EACL,QAAQ,OAAO,QAAQ;AACrB,OAAI,MAAM,KAAK,MAAM,KAAK,aAAa;EACxC,EACF;CACF;CAED,AAAQ,UAQN;AACA,SAAO;GACL,QAAQ,OAAO,QAAQ;AACrB,QAAI,MAAM,UAAU,MAAM,KAAK,eAAe;GAC/C;GACD,OAAO,OAAO,QAAQ;AAEpB,QAAI,IAAI,MAAM,SAAS;KACrB,MAAM,UAAU,IAAI,MAAM,QAAQ,YAAY;AAC9C,SAAI,QAAQ,SAAS,GAAG;AACtB,WAAK,OAAO,MACV,EAAE,YAAY,QAAQ,OAAQ,GAC9B,2BACD;AACD,YAAM,IAAI,MAAM,QAAQ,OAAO;KAChC;IACF;GACF;EACF;CACF;CAED,AAAQ,SAQN;AACA,SAAO,EACL,OAAO,OAAO,QAAQ;GACpB,MAAM,WAAY,IAAI;AAEtB,SAAM,KAAK,cAAc,SAAS;EACnC,EACF;CACF;CAED,MAAc,SACZC,OAQA;EAEA,MAAM,SAAS,MAAM,KAAK,GAAG,MAAM;GACjC,OAAO,MAAM;GACb,UAAU,MAAM;GAChB,QAAQ,MAAM;GACd,IAAI,MAAM;GACV,SAAS,MAAM;EAChB,EAAQ;EAGT,MAAM,SAAS,MAAM,KAAK,GAAG,YAAY,OAAO;AAEhD,SAAO;CACR;CAED,IAAI,UAA4B;EAC9B,MAAM,UAAU,KAAK,SAAS,KAAK,KAAK;AAGxC,SAAO,0BAAM,QAAQ,CAClB,IAAI,KAAK,kBAAkB,CAAC,CAC5B,IAAI,KAAK,WAAW,CAAC,CACrB,IAAI,KAAK,OAAO,CAAC,CACjB,IAAI,KAAK,UAAU,CAAC,CACpB,IAAI,KAAK,UAAU,CAAC,CACpB,IAAI,KAAK,SAAS,CAAC,CACnB,IAAI,KAAK,OAAO,CAAC,CACjB,IAAI,KAAK,QAAQ,CAAC;CACtB;AACF"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { Function, FunctionHandler } from "./Function-V9M9UVHp.mjs";
|
|
2
|
+
import { FunctionExecutionWrapper } from "./FunctionExecutionWrapper-rhbIYT0Q.mjs";
|
|
3
|
+
import { Service } from "@geekmidas/services";
|
|
4
|
+
import { AuditStorage, AuditableAction } from "@geekmidas/audit";
|
|
5
|
+
import { EnvironmentParser } from "@geekmidas/envkit";
|
|
6
|
+
import { EventPublisher } from "@geekmidas/events";
|
|
7
|
+
import { Logger } from "@geekmidas/logger";
|
|
8
|
+
import { StandardSchemaV1 } from "@standard-schema/spec";
|
|
9
|
+
import { ComposableStandardSchema } from "@geekmidas/schema";
|
|
10
|
+
import { Handler } from "aws-lambda";
|
|
11
|
+
|
|
12
|
+
//#region src/functions/AWSLambdaFunction.d.ts
|
|
13
|
+
type AWSLambdaHandler<TEvent = any, TResult = any> = Handler<TEvent, TResult>;
|
|
14
|
+
declare class AWSLambdaFunction<TInput extends ComposableStandardSchema | undefined = undefined, TOutSchema extends StandardSchemaV1 | undefined = undefined, TServices extends Service[] = [], TLogger extends Logger = Logger, TEventPublisher extends EventPublisher<any> | undefined = undefined, TEventPublisherServiceName extends string = string, TAuditStorage extends AuditStorage | undefined = undefined, TAuditStorageServiceName extends string = string, TDatabase = undefined, TDatabaseServiceName extends string = string, TAuditAction extends AuditableAction<string, unknown> = AuditableAction<string, unknown>> extends FunctionExecutionWrapper<TInput, TOutSchema, TServices, TLogger, TEventPublisher, TEventPublisherServiceName, TAuditStorage, TAuditStorageServiceName, TDatabase, TDatabaseServiceName, TAuditAction> {
|
|
15
|
+
readonly fn: Function<TInput, TServices, TLogger, TOutSchema, TEventPublisher, TEventPublisherServiceName, TAuditStorage, TAuditStorageServiceName, TDatabase, TDatabaseServiceName, TAuditAction, FunctionHandler<TInput, TServices, TLogger, TOutSchema, TDatabase, TAuditStorage, TAuditAction>>;
|
|
16
|
+
constructor(envParser: EnvironmentParser<{}>, fn: Function<TInput, TServices, TLogger, TOutSchema, TEventPublisher, TEventPublisherServiceName, TAuditStorage, TAuditStorageServiceName, TDatabase, TDatabaseServiceName, TAuditAction, FunctionHandler<TInput, TServices, TLogger, TOutSchema, TDatabase, TAuditStorage, TAuditAction>>);
|
|
17
|
+
private error;
|
|
18
|
+
private baseInput;
|
|
19
|
+
private input;
|
|
20
|
+
private loggerMiddleware;
|
|
21
|
+
private services;
|
|
22
|
+
private database;
|
|
23
|
+
private auditor;
|
|
24
|
+
private events;
|
|
25
|
+
private _handler;
|
|
26
|
+
get handler(): AWSLambdaHandler;
|
|
27
|
+
}
|
|
28
|
+
//#endregion
|
|
29
|
+
export { AWSLambdaFunction, AWSLambdaHandler };
|
|
30
|
+
//# sourceMappingURL=AWSLambdaFunction-CAm9r5ZX.d.mts.map
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { FunctionBuilder } from "./FunctionBuilder-
|
|
2
|
-
import { FunctionExecutionWrapper } from "./FunctionExecutionWrapper-
|
|
1
|
+
import { FunctionBuilder } from "./FunctionBuilder-CVT7bG2o.mjs";
|
|
2
|
+
import { FunctionExecutionWrapper } from "./FunctionExecutionWrapper-Bubnr0zA.mjs";
|
|
3
3
|
import { wrapError } from "@geekmidas/errors";
|
|
4
4
|
import middy from "@middy/core";
|
|
5
5
|
|
|
@@ -53,6 +53,27 @@ var AWSLambdaFunction = class extends FunctionExecutionWrapper {
|
|
|
53
53
|
req.event.services = await this.getServices();
|
|
54
54
|
} };
|
|
55
55
|
}
|
|
56
|
+
database() {
|
|
57
|
+
return { before: async (req) => {
|
|
58
|
+
req.event.db = await this.getDatabase();
|
|
59
|
+
} };
|
|
60
|
+
}
|
|
61
|
+
auditor() {
|
|
62
|
+
return {
|
|
63
|
+
before: async (req) => {
|
|
64
|
+
req.event.auditor = await this.createAuditor();
|
|
65
|
+
},
|
|
66
|
+
after: async (req) => {
|
|
67
|
+
if (req.event.auditor) {
|
|
68
|
+
const records = req.event.auditor.getRecords();
|
|
69
|
+
if (records.length > 0) {
|
|
70
|
+
this.logger.debug({ auditCount: records.length }, "Flushing function audits");
|
|
71
|
+
await req.event.auditor.flush();
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
};
|
|
76
|
+
}
|
|
56
77
|
events() {
|
|
57
78
|
return { after: async (req) => {
|
|
58
79
|
const response = req.response || void 0;
|
|
@@ -63,17 +84,19 @@ var AWSLambdaFunction = class extends FunctionExecutionWrapper {
|
|
|
63
84
|
const result = await this.fn["fn"]({
|
|
64
85
|
input: event.parsedInput,
|
|
65
86
|
services: event.services,
|
|
66
|
-
logger: event.logger
|
|
87
|
+
logger: event.logger,
|
|
88
|
+
db: event.db,
|
|
89
|
+
auditor: event.auditor
|
|
67
90
|
});
|
|
68
91
|
const output = await this.fn.parseOutput(result);
|
|
69
92
|
return output;
|
|
70
93
|
}
|
|
71
94
|
get handler() {
|
|
72
95
|
const handler = this._handler.bind(this);
|
|
73
|
-
return middy(handler).use(this.loggerMiddleware()).use(this.baseInput()).use(this.error()).use(this.services()).use(this.input()).use(this.events());
|
|
96
|
+
return middy(handler).use(this.loggerMiddleware()).use(this.baseInput()).use(this.error()).use(this.services()).use(this.database()).use(this.auditor()).use(this.input()).use(this.events());
|
|
74
97
|
}
|
|
75
98
|
};
|
|
76
99
|
|
|
77
100
|
//#endregion
|
|
78
101
|
export { AWSLambdaFunction };
|
|
79
|
-
//# sourceMappingURL=AWSLambdaFunction-
|
|
102
|
+
//# sourceMappingURL=AWSLambdaFunction-H65WfXLt.mjs.map
|