@geekmidas/constructs 0.5.0 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{AWSLambdaFunction-DnMm4xvz.mjs → AWSLambdaFunction-BMTaCrG9.mjs} +3 -3
- package/dist/{AWSLambdaFunction-DnMm4xvz.mjs.map → AWSLambdaFunction-BMTaCrG9.mjs.map} +1 -1
- package/dist/{AWSLambdaFunction-CuG3HNZx.d.mts → AWSLambdaFunction-BfLF5vNa.d.cts} +5 -5
- package/dist/{AWSLambdaFunction-CuG3HNZx.d.mts.map → AWSLambdaFunction-BfLF5vNa.d.cts.map} +1 -1
- package/dist/{AWSLambdaFunction-Ba1DcsW2.cjs → AWSLambdaFunction-C1gRqLO7.cjs} +3 -3
- package/dist/{AWSLambdaFunction-Ba1DcsW2.cjs.map → AWSLambdaFunction-C1gRqLO7.cjs.map} +1 -1
- package/dist/{AWSLambdaFunction-CKe73Qr0.d.cts → AWSLambdaFunction-K94K8JU2.d.mts} +5 -5
- package/dist/{AWSLambdaFunction-CKe73Qr0.d.cts.map → AWSLambdaFunction-K94K8JU2.d.mts.map} +1 -1
- package/dist/{AWSLambdaSubscriberAdaptor-B4HH-WuQ.d.mts → AWSLambdaSubscriberAdaptor-B2Gk3fgx.d.cts} +4 -4
- package/dist/{AWSLambdaSubscriberAdaptor-B4HH-WuQ.d.mts.map → AWSLambdaSubscriberAdaptor-B2Gk3fgx.d.cts.map} +1 -1
- package/dist/{AWSLambdaSubscriberAdaptor-BEqQ96VJ.d.cts → AWSLambdaSubscriberAdaptor-QuMFwltJ.d.mts} +4 -4
- package/dist/{AWSLambdaSubscriberAdaptor-BEqQ96VJ.d.cts.map → AWSLambdaSubscriberAdaptor-QuMFwltJ.d.mts.map} +1 -1
- package/dist/{AmazonApiGatewayEndpointAdaptor-Bvy-Hgjf.mjs → AmazonApiGatewayEndpointAdaptor-B4gLJ2dx.mjs} +2 -2
- package/dist/{AmazonApiGatewayEndpointAdaptor-Bvy-Hgjf.mjs.map → AmazonApiGatewayEndpointAdaptor-B4gLJ2dx.mjs.map} +1 -1
- package/dist/{AmazonApiGatewayEndpointAdaptor-DsWnO6x9.d.cts → AmazonApiGatewayEndpointAdaptor-C987ZCsM.d.cts} +2 -2
- package/dist/{AmazonApiGatewayEndpointAdaptor-DsWnO6x9.d.cts.map → AmazonApiGatewayEndpointAdaptor-C987ZCsM.d.cts.map} +1 -1
- package/dist/{AmazonApiGatewayEndpointAdaptor-Cpxluhfg.cjs → AmazonApiGatewayEndpointAdaptor-CwRKMRr_.cjs} +2 -2
- package/dist/{AmazonApiGatewayEndpointAdaptor-Cpxluhfg.cjs.map → AmazonApiGatewayEndpointAdaptor-CwRKMRr_.cjs.map} +1 -1
- package/dist/{AmazonApiGatewayEndpointAdaptor-DTgdZ8I1.d.mts → AmazonApiGatewayEndpointAdaptor-DpPfO6Vj.d.mts} +2 -2
- package/dist/{AmazonApiGatewayEndpointAdaptor-DTgdZ8I1.d.mts.map → AmazonApiGatewayEndpointAdaptor-DpPfO6Vj.d.mts.map} +1 -1
- package/dist/{AmazonApiGatewayV1EndpointAdaptor-B8vIYYNh.cjs → AmazonApiGatewayV1EndpointAdaptor-BeZMu5DZ.cjs} +2 -2
- package/dist/{AmazonApiGatewayV1EndpointAdaptor-B8vIYYNh.cjs.map → AmazonApiGatewayV1EndpointAdaptor-BeZMu5DZ.cjs.map} +1 -1
- package/dist/{AmazonApiGatewayV1EndpointAdaptor-RWRmFPrN.d.mts → AmazonApiGatewayV1EndpointAdaptor-DI_5kdqw.d.mts} +3 -3
- package/dist/{AmazonApiGatewayV1EndpointAdaptor-RWRmFPrN.d.mts.map → AmazonApiGatewayV1EndpointAdaptor-DI_5kdqw.d.mts.map} +1 -1
- package/dist/{AmazonApiGatewayV1EndpointAdaptor-7ELXUBFK.d.cts → AmazonApiGatewayV1EndpointAdaptor-DkGMOpoB.d.cts} +3 -3
- package/dist/{AmazonApiGatewayV1EndpointAdaptor-7ELXUBFK.d.cts.map → AmazonApiGatewayV1EndpointAdaptor-DkGMOpoB.d.cts.map} +1 -1
- package/dist/{AmazonApiGatewayV1EndpointAdaptor-ByXGIju8.mjs → AmazonApiGatewayV1EndpointAdaptor-VccB6FKp.mjs} +2 -2
- package/dist/{AmazonApiGatewayV1EndpointAdaptor-ByXGIju8.mjs.map → AmazonApiGatewayV1EndpointAdaptor-VccB6FKp.mjs.map} +1 -1
- package/dist/{AmazonApiGatewayV2EndpointAdaptor-D_uMTmuJ.d.cts → AmazonApiGatewayV2EndpointAdaptor-BtBnMJS_.d.cts} +3 -3
- package/dist/{AmazonApiGatewayV2EndpointAdaptor-D_uMTmuJ.d.cts.map → AmazonApiGatewayV2EndpointAdaptor-BtBnMJS_.d.cts.map} +1 -1
- package/dist/{AmazonApiGatewayV2EndpointAdaptor-DIetspUm.cjs → AmazonApiGatewayV2EndpointAdaptor-BwsL9Gia.cjs} +2 -2
- package/dist/{AmazonApiGatewayV2EndpointAdaptor-DIetspUm.cjs.map → AmazonApiGatewayV2EndpointAdaptor-BwsL9Gia.cjs.map} +1 -1
- package/dist/{AmazonApiGatewayV2EndpointAdaptor-DWemCZvl.mjs → AmazonApiGatewayV2EndpointAdaptor-CljxmUfz.mjs} +2 -2
- package/dist/{AmazonApiGatewayV2EndpointAdaptor-DWemCZvl.mjs.map → AmazonApiGatewayV2EndpointAdaptor-CljxmUfz.mjs.map} +1 -1
- package/dist/{AmazonApiGatewayV2EndpointAdaptor-wnOMDv6o.d.mts → AmazonApiGatewayV2EndpointAdaptor-DnCoqlvw.d.mts} +3 -3
- package/dist/{AmazonApiGatewayV2EndpointAdaptor-wnOMDv6o.d.mts.map → AmazonApiGatewayV2EndpointAdaptor-DnCoqlvw.d.mts.map} +1 -1
- package/dist/{BaseFunctionBuilder-BAtutR6q.d.cts → BaseFunctionBuilder-BqZCqIeU.d.mts} +3 -3
- package/dist/{BaseFunctionBuilder-BAtutR6q.d.cts.map → BaseFunctionBuilder-BqZCqIeU.d.mts.map} +1 -1
- package/dist/{BaseFunctionBuilder-CDfDWWAQ.d.mts → BaseFunctionBuilder-CcK691ni.d.cts} +3 -3
- package/dist/{BaseFunctionBuilder-CDfDWWAQ.d.mts.map → BaseFunctionBuilder-CcK691ni.d.cts.map} +1 -1
- package/dist/{BaseFunctionBuilder-0qlenb9z.mjs → BaseFunctionBuilder-Dsqe6pnn.mjs} +2 -2
- package/dist/{BaseFunctionBuilder-0qlenb9z.mjs.map → BaseFunctionBuilder-Dsqe6pnn.mjs.map} +1 -1
- package/dist/{BaseFunctionBuilder-D7o93EGv.cjs → BaseFunctionBuilder-Z0XwrKB5.cjs} +2 -2
- package/dist/{BaseFunctionBuilder-D7o93EGv.cjs.map → BaseFunctionBuilder-Z0XwrKB5.cjs.map} +1 -1
- package/dist/{Construct-D5dCvxZ3.mjs → Construct-BNDLJJfD.mjs} +56 -13
- package/dist/Construct-BNDLJJfD.mjs.map +1 -0
- package/dist/{Construct-BlnyYtJC.cjs → Construct-CPrCF8NK.cjs} +67 -12
- package/dist/Construct-CPrCF8NK.cjs.map +1 -0
- package/dist/{Construct-C4rPE67v.d.cts → Construct-Dl0l2d8d.d.cts} +30 -4
- package/dist/Construct-Dl0l2d8d.d.cts.map +1 -0
- package/dist/{Construct-dZiwVo0q.d.mts → Construct-E8QPyHh4.d.mts} +30 -4
- package/dist/Construct-E8QPyHh4.d.mts.map +1 -0
- package/dist/Construct.cjs +4 -2
- package/dist/Construct.d.cts +2 -2
- package/dist/Construct.d.mts +2 -2
- package/dist/Construct.mjs +2 -2
- package/dist/{Cron-BAPQetlC.cjs → Cron-BmPNTLla.cjs} +3 -3
- package/dist/{Cron-BAPQetlC.cjs.map → Cron-BmPNTLla.cjs.map} +1 -1
- package/dist/{Cron-CAk_ddH8.mjs → Cron-BpJONaFv.mjs} +3 -3
- package/dist/{Cron-CAk_ddH8.mjs.map → Cron-BpJONaFv.mjs.map} +1 -1
- package/dist/{Cron-B6FnTu7k.d.cts → Cron-CnmLLh3E.d.mts} +3 -3
- package/dist/{Cron-B6FnTu7k.d.cts.map → Cron-CnmLLh3E.d.mts.map} +1 -1
- package/dist/{Cron-D3bEljxQ.d.mts → Cron-DufAeHry.d.cts} +3 -3
- package/dist/{Cron-D3bEljxQ.d.mts.map → Cron-DufAeHry.d.cts.map} +1 -1
- package/dist/{CronBuilder-e8TaHPYm.mjs → CronBuilder-02HSIHJr.mjs} +4 -4
- package/dist/{CronBuilder-e8TaHPYm.mjs.map → CronBuilder-02HSIHJr.mjs.map} +1 -1
- package/dist/{CronBuilder-DxXA5ymv.cjs → CronBuilder-DC2zUS8a.cjs} +4 -4
- package/dist/{CronBuilder-DxXA5ymv.cjs.map → CronBuilder-DC2zUS8a.cjs.map} +1 -1
- package/dist/{CronBuilder-CA8euP0z.d.cts → CronBuilder-anUSbMxb.d.mts} +5 -5
- package/dist/{CronBuilder-CA8euP0z.d.cts.map → CronBuilder-anUSbMxb.d.mts.map} +1 -1
- package/dist/{CronBuilder-DvdiKzhq.d.mts → CronBuilder-fyqf_X8n.d.cts} +5 -5
- package/dist/{CronBuilder-DvdiKzhq.d.mts.map → CronBuilder-fyqf_X8n.d.cts.map} +1 -1
- package/dist/{Endpoint-DxvnlfXg.cjs → Endpoint-BCWVbi8l.cjs} +3 -3
- package/dist/{Endpoint-DxvnlfXg.cjs.map → Endpoint-BCWVbi8l.cjs.map} +1 -1
- package/dist/{Endpoint-BOlbY5iq.d.cts → Endpoint-BlcHiGNx.d.cts} +2 -2
- package/dist/{Endpoint-Dlv7nxgj.d.mts.map → Endpoint-BlcHiGNx.d.cts.map} +1 -1
- package/dist/{Endpoint-Dlv7nxgj.d.mts → Endpoint-DEHuy46S.d.mts} +2 -2
- package/dist/{Endpoint-BOlbY5iq.d.cts.map → Endpoint-DEHuy46S.d.mts.map} +1 -1
- package/dist/{Endpoint-BbdNmtlM.mjs → Endpoint-ygxv2Ia6.mjs} +3 -3
- package/dist/{Endpoint-BbdNmtlM.mjs.map → Endpoint-ygxv2Ia6.mjs.map} +1 -1
- package/dist/{EndpointBuilder-CFfWWjUa.d.cts → EndpointBuilder-DPLAUHqg.d.cts} +3 -3
- package/dist/{EndpointBuilder-T_K2NLWw.d.mts.map → EndpointBuilder-DPLAUHqg.d.cts.map} +1 -1
- package/dist/{EndpointBuilder-T_K2NLWw.d.mts → EndpointBuilder-DaeCeneF.d.mts} +3 -3
- package/dist/{EndpointBuilder-CFfWWjUa.d.cts.map → EndpointBuilder-DaeCeneF.d.mts.map} +1 -1
- package/dist/{EndpointBuilder-40Iz5CjY.cjs → EndpointBuilder-J5D67Y6a.cjs} +4 -4
- package/dist/{EndpointBuilder-40Iz5CjY.cjs.map → EndpointBuilder-J5D67Y6a.cjs.map} +1 -1
- package/dist/{EndpointBuilder-BaVvhW9m.mjs → EndpointBuilder-tn4zqoyw.mjs} +4 -4
- package/dist/{EndpointBuilder-BaVvhW9m.mjs.map → EndpointBuilder-tn4zqoyw.mjs.map} +1 -1
- package/dist/{EndpointFactory-DfNjSgVG.mjs → EndpointFactory-CIUZTTAF.mjs} +2 -2
- package/dist/{EndpointFactory-DfNjSgVG.mjs.map → EndpointFactory-CIUZTTAF.mjs.map} +1 -1
- package/dist/{EndpointFactory-ChzBVEM9.d.cts → EndpointFactory-CiKcb5PX.d.cts} +3 -3
- package/dist/{EndpointFactory-ChzBVEM9.d.cts.map → EndpointFactory-CiKcb5PX.d.cts.map} +1 -1
- package/dist/{EndpointFactory-GAL_tuPf.d.mts → EndpointFactory-DufM0t2z.d.mts} +3 -3
- package/dist/{EndpointFactory-GAL_tuPf.d.mts.map → EndpointFactory-DufM0t2z.d.mts.map} +1 -1
- package/dist/{EndpointFactory-r6jxPvQ8.cjs → EndpointFactory-d5uwWFkK.cjs} +2 -2
- package/dist/{EndpointFactory-r6jxPvQ8.cjs.map → EndpointFactory-d5uwWFkK.cjs.map} +1 -1
- package/dist/{Function-iLKrUXuw.cjs → Function-2qWSZqYB.cjs} +2 -2
- package/dist/{Function-iLKrUXuw.cjs.map → Function-2qWSZqYB.cjs.map} +1 -1
- package/dist/{Function-DBmU3uGI.d.mts → Function-CbEohg13.d.cts} +3 -3
- package/dist/{Function-DBmU3uGI.d.mts.map → Function-CbEohg13.d.cts.map} +1 -1
- package/dist/{Function-D8tBamM3.mjs → Function-CdF1HmFu.mjs} +2 -2
- package/dist/{Function-D8tBamM3.mjs.map → Function-CdF1HmFu.mjs.map} +1 -1
- package/dist/{Function-PNW4HdNE.d.cts → Function-EjIOLxlh.d.mts} +3 -3
- package/dist/{Function-PNW4HdNE.d.cts.map → Function-EjIOLxlh.d.mts.map} +1 -1
- package/dist/{FunctionBuilder-BEpPgeho.cjs → FunctionBuilder-B-pbgm09.cjs} +4 -4
- package/dist/{FunctionBuilder-BEpPgeho.cjs.map → FunctionBuilder-B-pbgm09.cjs.map} +1 -1
- package/dist/{FunctionBuilder-Bv4H2I1a.d.mts → FunctionBuilder-CX3ooNdq.d.cts} +5 -5
- package/dist/{FunctionBuilder-Bv4H2I1a.d.mts.map → FunctionBuilder-CX3ooNdq.d.cts.map} +1 -1
- package/dist/{FunctionBuilder-DCqXIHaq.d.cts → FunctionBuilder-D11ytDyy.d.mts} +5 -5
- package/dist/{FunctionBuilder-DCqXIHaq.d.cts.map → FunctionBuilder-D11ytDyy.d.mts.map} +1 -1
- package/dist/{FunctionBuilder-BwNF99AB.mjs → FunctionBuilder-DaWVthAJ.mjs} +4 -4
- package/dist/{FunctionBuilder-BwNF99AB.mjs.map → FunctionBuilder-DaWVthAJ.mjs.map} +1 -1
- package/dist/{FunctionExecutionWrapper-BclgIztn.d.cts → FunctionExecutionWrapper-BJcRjH9Z.d.cts} +2 -2
- package/dist/{FunctionExecutionWrapper-BclgIztn.d.cts.map → FunctionExecutionWrapper-BJcRjH9Z.d.cts.map} +1 -1
- package/dist/{FunctionExecutionWrapper-BjF6t9Hb.cjs → FunctionExecutionWrapper-C6ChBNHs.cjs} +2 -2
- package/dist/{FunctionExecutionWrapper-BjF6t9Hb.cjs.map → FunctionExecutionWrapper-C6ChBNHs.cjs.map} +1 -1
- package/dist/{FunctionExecutionWrapper-Dq21c6vt.d.mts → FunctionExecutionWrapper-D3RNjGIR.d.mts} +2 -2
- package/dist/{FunctionExecutionWrapper-Dq21c6vt.d.mts.map → FunctionExecutionWrapper-D3RNjGIR.d.mts.map} +1 -1
- package/dist/{FunctionExecutionWrapper-B__HE_B-.mjs → FunctionExecutionWrapper-Dj3pmXaN.mjs} +2 -2
- package/dist/{FunctionExecutionWrapper-B__HE_B-.mjs.map → FunctionExecutionWrapper-Dj3pmXaN.mjs.map} +1 -1
- package/dist/{HonoEndpointAdaptor-HukjdF6M.d.mts → HonoEndpointAdaptor-CKP6nrG2.d.mts} +4 -4
- package/dist/{HonoEndpointAdaptor-Dkkemmbo.d.cts.map → HonoEndpointAdaptor-CKP6nrG2.d.mts.map} +1 -1
- package/dist/{HonoEndpointAdaptor-C_ym_Sbr.mjs → HonoEndpointAdaptor-Cc8Rnp9G.mjs} +3 -3
- package/dist/{HonoEndpointAdaptor-C_ym_Sbr.mjs.map → HonoEndpointAdaptor-Cc8Rnp9G.mjs.map} +1 -1
- package/dist/{HonoEndpointAdaptor-Dkkemmbo.d.cts → HonoEndpointAdaptor-hrrvyfw9.d.cts} +2 -2
- package/dist/{HonoEndpointAdaptor-HukjdF6M.d.mts.map → HonoEndpointAdaptor-hrrvyfw9.d.cts.map} +1 -1
- package/dist/{HonoEndpointAdaptor-DiQH0eTb.cjs → HonoEndpointAdaptor-xGnDZa3a.cjs} +3 -3
- package/dist/{HonoEndpointAdaptor-DiQH0eTb.cjs.map → HonoEndpointAdaptor-xGnDZa3a.cjs.map} +1 -1
- package/dist/{Subscriber--zUjZDR6.d.cts → Subscriber-BBcIOkhW.d.cts} +2 -2
- package/dist/{Subscriber--zUjZDR6.d.cts.map → Subscriber-BBcIOkhW.d.cts.map} +1 -1
- package/dist/{Subscriber-0Ac7cXID.d.mts → Subscriber-BpTAXvbM.d.mts} +2 -2
- package/dist/{Subscriber-0Ac7cXID.d.mts.map → Subscriber-BpTAXvbM.d.mts.map} +1 -1
- package/dist/{Subscriber-CoFmHMIM.cjs → Subscriber-CL4iYm01.cjs} +2 -2
- package/dist/{Subscriber-CoFmHMIM.cjs.map → Subscriber-CL4iYm01.cjs.map} +1 -1
- package/dist/{Subscriber-BgZ8T-O2.mjs → Subscriber-CZ8Smwd2.mjs} +2 -2
- package/dist/{Subscriber-BgZ8T-O2.mjs.map → Subscriber-CZ8Smwd2.mjs.map} +1 -1
- package/dist/{SubscriberBuilder-DWXWZBPo.mjs → SubscriberBuilder-CxQg3TTm.mjs} +2 -2
- package/dist/{SubscriberBuilder-DWXWZBPo.mjs.map → SubscriberBuilder-CxQg3TTm.mjs.map} +1 -1
- package/dist/{SubscriberBuilder-JlxhyqGp.cjs → SubscriberBuilder-D0OS3hd7.cjs} +2 -2
- package/dist/{SubscriberBuilder-JlxhyqGp.cjs.map → SubscriberBuilder-D0OS3hd7.cjs.map} +1 -1
- package/dist/{SubscriberBuilder-D8cmUHee.d.mts → SubscriberBuilder-D7IgufwB.d.cts} +3 -3
- package/dist/{SubscriberBuilder-D8cmUHee.d.mts.map → SubscriberBuilder-D7IgufwB.d.cts.map} +1 -1
- package/dist/{SubscriberBuilder-DciTqb-7.d.cts → SubscriberBuilder-DOFBbWLt.d.mts} +3 -3
- package/dist/{SubscriberBuilder-DciTqb-7.d.cts.map → SubscriberBuilder-DOFBbWLt.d.mts.map} +1 -1
- package/dist/{TestEndpointAdaptor-Boijwbmz.d.mts → TestEndpointAdaptor-BnJusjf7.d.mts} +2 -2
- package/dist/{TestEndpointAdaptor-Boijwbmz.d.mts.map → TestEndpointAdaptor-BnJusjf7.d.mts.map} +1 -1
- package/dist/{TestEndpointAdaptor-OiA2JLDp.mjs → TestEndpointAdaptor-CPL8ru6q.mjs} +2 -2
- package/dist/{TestEndpointAdaptor-OiA2JLDp.mjs.map → TestEndpointAdaptor-CPL8ru6q.mjs.map} +1 -1
- package/dist/{TestEndpointAdaptor-Dk75ExxE.cjs → TestEndpointAdaptor-Ca4K26_d.cjs} +2 -2
- package/dist/{TestEndpointAdaptor-Dk75ExxE.cjs.map → TestEndpointAdaptor-Ca4K26_d.cjs.map} +1 -1
- package/dist/{TestEndpointAdaptor-DdwpRyNh.d.cts → TestEndpointAdaptor-EPPTjntv.d.cts} +2 -2
- package/dist/{TestEndpointAdaptor-DdwpRyNh.d.cts.map → TestEndpointAdaptor-EPPTjntv.d.cts.map} +1 -1
- package/dist/adaptors/aws.cjs +11 -11
- package/dist/adaptors/aws.d.cts +13 -13
- package/dist/adaptors/aws.d.mts +13 -13
- package/dist/adaptors/aws.mjs +11 -11
- package/dist/adaptors/hono.cjs +8 -8
- package/dist/adaptors/hono.d.cts +7 -7
- package/dist/adaptors/hono.d.mts +7 -7
- package/dist/adaptors/hono.mjs +8 -8
- package/dist/adaptors/testing.cjs +7 -7
- package/dist/adaptors/testing.d.cts +7 -7
- package/dist/adaptors/testing.d.mts +7 -7
- package/dist/adaptors/testing.mjs +7 -7
- package/dist/crons/Cron.cjs +6 -6
- package/dist/crons/Cron.d.cts +6 -6
- package/dist/crons/Cron.d.mts +6 -6
- package/dist/crons/Cron.mjs +6 -6
- package/dist/crons/CronBuilder.cjs +7 -7
- package/dist/crons/CronBuilder.d.cts +7 -7
- package/dist/crons/CronBuilder.d.mts +7 -7
- package/dist/crons/CronBuilder.mjs +7 -7
- package/dist/crons/index.cjs +7 -7
- package/dist/crons/index.d.cts +7 -7
- package/dist/crons/index.d.mts +7 -7
- package/dist/crons/index.mjs +7 -7
- package/dist/endpoints/AmazonApiGatewayEndpointAdaptor.cjs +7 -7
- package/dist/endpoints/AmazonApiGatewayEndpointAdaptor.d.cts +7 -7
- package/dist/endpoints/AmazonApiGatewayEndpointAdaptor.d.mts +7 -7
- package/dist/endpoints/AmazonApiGatewayEndpointAdaptor.mjs +7 -7
- package/dist/endpoints/AmazonApiGatewayV1EndpointAdaptor.cjs +8 -8
- package/dist/endpoints/AmazonApiGatewayV1EndpointAdaptor.d.cts +8 -8
- package/dist/endpoints/AmazonApiGatewayV1EndpointAdaptor.d.mts +8 -8
- package/dist/endpoints/AmazonApiGatewayV1EndpointAdaptor.mjs +8 -8
- package/dist/endpoints/AmazonApiGatewayV2EndpointAdaptor.cjs +8 -8
- package/dist/endpoints/AmazonApiGatewayV2EndpointAdaptor.d.cts +8 -8
- package/dist/endpoints/AmazonApiGatewayV2EndpointAdaptor.d.mts +8 -8
- package/dist/endpoints/AmazonApiGatewayV2EndpointAdaptor.mjs +8 -8
- package/dist/endpoints/Endpoint.cjs +6 -6
- package/dist/endpoints/Endpoint.d.cts +6 -6
- package/dist/endpoints/Endpoint.d.mts +6 -6
- package/dist/endpoints/Endpoint.mjs +6 -6
- package/dist/endpoints/EndpointBuilder.cjs +7 -7
- package/dist/endpoints/EndpointBuilder.d.cts +7 -7
- package/dist/endpoints/EndpointBuilder.d.mts +7 -7
- package/dist/endpoints/EndpointBuilder.mjs +7 -7
- package/dist/endpoints/EndpointFactory.cjs +8 -8
- package/dist/endpoints/EndpointFactory.d.cts +8 -8
- package/dist/endpoints/EndpointFactory.d.mts +8 -8
- package/dist/endpoints/EndpointFactory.mjs +8 -8
- package/dist/endpoints/HonoEndpointAdaptor.cjs +8 -8
- package/dist/endpoints/HonoEndpointAdaptor.d.cts +7 -7
- package/dist/endpoints/HonoEndpointAdaptor.d.mts +7 -7
- package/dist/endpoints/HonoEndpointAdaptor.mjs +8 -8
- package/dist/endpoints/TestEndpointAdaptor.cjs +7 -7
- package/dist/endpoints/TestEndpointAdaptor.d.cts +7 -7
- package/dist/endpoints/TestEndpointAdaptor.d.mts +7 -7
- package/dist/endpoints/TestEndpointAdaptor.mjs +7 -7
- package/dist/endpoints/audit.d.cts +6 -6
- package/dist/endpoints/audit.d.mts +6 -6
- package/dist/endpoints/helpers.cjs +7 -7
- package/dist/endpoints/helpers.d.cts +6 -6
- package/dist/endpoints/helpers.d.mts +6 -6
- package/dist/endpoints/helpers.mjs +7 -7
- package/dist/endpoints/index.cjs +8 -8
- package/dist/endpoints/index.d.cts +10 -10
- package/dist/endpoints/index.d.mts +12 -12
- package/dist/endpoints/index.mjs +8 -8
- package/dist/endpoints/lazyAccessors.d.cts +7 -7
- package/dist/endpoints/lazyAccessors.d.mts +7 -7
- package/dist/endpoints/processAudits.d.cts +6 -6
- package/dist/endpoints/processAudits.d.mts +6 -6
- package/dist/endpoints/rls.d.cts +6 -6
- package/dist/endpoints/rls.d.mts +6 -6
- package/dist/functions/AWSLambdaFunction.cjs +6 -6
- package/dist/functions/AWSLambdaFunction.d.cts +4 -4
- package/dist/functions/AWSLambdaFunction.d.mts +4 -4
- package/dist/functions/AWSLambdaFunction.mjs +6 -6
- package/dist/functions/BaseFunctionBuilder.cjs +2 -2
- package/dist/functions/BaseFunctionBuilder.d.cts +2 -2
- package/dist/functions/BaseFunctionBuilder.d.mts +2 -2
- package/dist/functions/BaseFunctionBuilder.mjs +2 -2
- package/dist/functions/Function.cjs +2 -2
- package/dist/functions/Function.d.cts +2 -2
- package/dist/functions/Function.d.mts +2 -2
- package/dist/functions/Function.mjs +2 -2
- package/dist/functions/FunctionBuilder.cjs +4 -4
- package/dist/functions/FunctionBuilder.d.cts +4 -4
- package/dist/functions/FunctionBuilder.d.mts +4 -4
- package/dist/functions/FunctionBuilder.mjs +4 -4
- package/dist/functions/FunctionExecutionWrapper.cjs +5 -5
- package/dist/functions/FunctionExecutionWrapper.d.cts +3 -3
- package/dist/functions/FunctionExecutionWrapper.d.mts +3 -3
- package/dist/functions/FunctionExecutionWrapper.mjs +5 -5
- package/dist/functions/TestFunctionAdaptor.cjs +4 -4
- package/dist/functions/TestFunctionAdaptor.d.cts +2 -2
- package/dist/functions/TestFunctionAdaptor.d.mts +2 -2
- package/dist/functions/TestFunctionAdaptor.mjs +4 -4
- package/dist/functions/index.cjs +5 -5
- package/dist/functions/index.d.cts +5 -5
- package/dist/functions/index.d.mts +5 -5
- package/dist/functions/index.mjs +5 -5
- package/dist/{functions-BkKXVeHm.cjs → functions-CUEv5NC3.cjs} +2 -2
- package/dist/{functions-BkKXVeHm.cjs.map → functions-CUEv5NC3.cjs.map} +1 -1
- package/dist/functions-DOYBrb7n.mjs +8 -0
- package/dist/{functions-C3A1vMRW.mjs.map → functions-DOYBrb7n.mjs.map} +1 -1
- package/dist/{helpers-DgsMFMUV.mjs → helpers-Dl1eszfi.mjs} +2 -2
- package/dist/{helpers-DgsMFMUV.mjs.map → helpers-Dl1eszfi.mjs.map} +1 -1
- package/dist/{helpers-BelEzV4U.cjs → helpers-QMdfdnvU.cjs} +2 -2
- package/dist/{helpers-BelEzV4U.cjs.map → helpers-QMdfdnvU.cjs.map} +1 -1
- package/dist/{index-D0fp_IK1.d.cts → index-BrGtMlpJ.d.cts} +2 -2
- package/dist/{index-CgAQHr3f.d.mts.map → index-BrGtMlpJ.d.cts.map} +1 -1
- package/dist/index-Dn4py3Db.d.mts +12 -0
- package/dist/{index-D0fp_IK1.d.cts.map → index-Dn4py3Db.d.mts.map} +1 -1
- package/dist/index.cjs +4 -2
- package/dist/index.d.cts +2 -2
- package/dist/index.d.mts +2 -2
- package/dist/index.mjs +2 -2
- package/dist/{lazyAccessors-B2ILzU-j.d.mts → lazyAccessors-BFAj2-S4.d.mts} +2 -2
- package/dist/{lazyAccessors-B2ILzU-j.d.mts.map → lazyAccessors-BFAj2-S4.d.mts.map} +1 -1
- package/dist/{lazyAccessors-Bcpi06ed.d.cts → lazyAccessors-knaNZuTN.d.cts} +2 -2
- package/dist/{lazyAccessors-Bcpi06ed.d.cts.map → lazyAccessors-knaNZuTN.d.cts.map} +1 -1
- package/dist/{publisher-C4BhHB5I.d.cts → publisher-BXG9YiRi.d.mts} +3 -3
- package/dist/{publisher-C4BhHB5I.d.cts.map → publisher-BXG9YiRi.d.mts.map} +1 -1
- package/dist/{publisher-NE-GnXL8.d.mts → publisher-D9ngDXg3.d.cts} +3 -3
- package/dist/{publisher-NE-GnXL8.d.mts.map → publisher-D9ngDXg3.d.cts.map} +1 -1
- package/dist/publisher.d.cts +2 -2
- package/dist/publisher.d.mts +2 -2
- package/dist/subscribers/AWSLambdaSubscriberAdaptor.d.cts +3 -3
- package/dist/subscribers/AWSLambdaSubscriberAdaptor.d.mts +3 -3
- package/dist/subscribers/Subscriber.cjs +2 -2
- package/dist/subscribers/Subscriber.d.cts +2 -2
- package/dist/subscribers/Subscriber.d.mts +2 -2
- package/dist/subscribers/Subscriber.mjs +2 -2
- package/dist/subscribers/SubscriberBuilder.cjs +3 -3
- package/dist/subscribers/SubscriberBuilder.d.cts +3 -3
- package/dist/subscribers/SubscriberBuilder.d.mts +3 -3
- package/dist/subscribers/SubscriberBuilder.mjs +3 -3
- package/dist/subscribers/index.cjs +3 -3
- package/dist/subscribers/index.d.cts +3 -3
- package/dist/subscribers/index.d.mts +5 -5
- package/dist/subscribers/index.d.mts.map +1 -1
- package/dist/subscribers/index.mjs +3 -3
- package/package.json +10 -9
- package/src/Construct.ts +81 -17
- package/src/__tests__/Construct.environment.spec.ts +231 -9
- package/src/index.ts +6 -1
- package/dist/Construct-BlnyYtJC.cjs.map +0 -1
- package/dist/Construct-C4rPE67v.d.cts.map +0 -1
- package/dist/Construct-D5dCvxZ3.mjs.map +0 -1
- package/dist/Construct-dZiwVo0q.d.mts.map +0 -1
- package/dist/functions-C3A1vMRW.mjs +0 -8
- package/dist/index-CgAQHr3f.d.mts +0 -12
package/dist/{FunctionExecutionWrapper-B__HE_B-.mjs.map → FunctionExecutionWrapper-Dj3pmXaN.mjs.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FunctionExecutionWrapper-
|
|
1
|
+
{"version":3,"file":"FunctionExecutionWrapper-Dj3pmXaN.mjs","names":["envParser: EnvironmentParser<{}>","fn: Function<\n\t\t\tTInput,\n\t\t\tTServices,\n\t\t\tTLogger,\n\t\t\tTOutSchema,\n\t\t\tTEventPublisher,\n\t\t\tTEventPublisherServiceName,\n\t\t\tTAuditStorage,\n\t\t\tTAuditStorageServiceName,\n\t\t\tTDatabase,\n\t\t\tTDatabaseServiceName,\n\t\t\tTAuditAction,\n\t\t\tFunctionHandler<\n\t\t\t\tTInput,\n\t\t\t\tTServices,\n\t\t\t\tTLogger,\n\t\t\t\tTOutSchema,\n\t\t\t\tTDatabase,\n\t\t\t\tTAuditStorage,\n\t\t\t\tTAuditAction\n\t\t\t>\n\t\t>","handler: (ctx: {\n\t\t\tauditor?: Auditor<TAuditAction>;\n\t\t\tdb?: TDatabase;\n\t\t}) => Promise<T>","db","response","event: TEvent","response: InferStandardSchema<TOutSchema>","data: unknown","schema: T"],"sources":["../src/functions/FunctionExecutionWrapper.ts"],"sourcesContent":["import type { AuditableAction, Auditor, AuditStorage } from '@geekmidas/audit';\nimport { DefaultAuditor } from '@geekmidas/audit';\nimport { withAuditableTransaction } from '@geekmidas/audit/kysely';\nimport type { EnvironmentParser } from '@geekmidas/envkit';\nimport type { EventPublisher } from '@geekmidas/events';\nimport type { Logger } from '@geekmidas/logger';\nimport type {\n\tComposableStandardSchema,\n\tInferComposableStandardSchema,\n\tInferStandardSchema,\n} from '@geekmidas/schema';\nimport {\n\ttype Service,\n\tServiceDiscovery,\n\ttype ServiceRecord,\n} from '@geekmidas/services';\nimport type { StandardSchemaV1 } from '@standard-schema/spec';\nimport { publishEvents } from '../publisher';\nimport type { Function, FunctionHandler } from './Function';\nimport { FunctionBuilder } from './FunctionBuilder';\n\nexport abstract class FunctionExecutionWrapper<\n\tTInput extends ComposableStandardSchema | undefined = undefined,\n\tTOutSchema extends StandardSchemaV1 | undefined = undefined,\n\tTServices extends Service[] = [],\n\tTLogger extends Logger = Logger,\n\tTEventPublisher extends EventPublisher<any> | undefined = undefined,\n\tTEventPublisherServiceName extends string = string,\n\tTAuditStorage extends AuditStorage | undefined = undefined,\n\tTAuditStorageServiceName extends string = string,\n\tTDatabase = undefined,\n\tTDatabaseServiceName extends string = string,\n\tTAuditAction extends AuditableAction<string, unknown> = AuditableAction<\n\t\tstring,\n\t\tunknown\n\t>,\n> {\n\tconstructor(\n\t\tprotected envParser: EnvironmentParser<{}>,\n\t\tprotected readonly fn: Function<\n\t\t\tTInput,\n\t\t\tTServices,\n\t\t\tTLogger,\n\t\t\tTOutSchema,\n\t\t\tTEventPublisher,\n\t\t\tTEventPublisherServiceName,\n\t\t\tTAuditStorage,\n\t\t\tTAuditStorageServiceName,\n\t\t\tTDatabase,\n\t\t\tTDatabaseServiceName,\n\t\t\tTAuditAction,\n\t\t\tFunctionHandler<\n\t\t\t\tTInput,\n\t\t\t\tTServices,\n\t\t\t\tTLogger,\n\t\t\t\tTOutSchema,\n\t\t\t\tTDatabase,\n\t\t\t\tTAuditStorage,\n\t\t\t\tTAuditAction\n\t\t\t>\n\t\t>,\n\t) {}\n\n\tprotected _logger?: TLogger;\n\n\tget logger(): TLogger {\n\t\treturn this._logger || this.fn.logger;\n\t}\n\n\tget serviceDiscovery(): ServiceDiscovery<ServiceRecord<TServices>> {\n\t\tconst serviceDiscovery = ServiceDiscovery.getInstance<\n\t\t\tServiceRecord<TServices>\n\t\t>(this.envParser);\n\n\t\treturn serviceDiscovery;\n\t}\n\n\tgetServices(): Promise<ServiceRecord<TServices>> {\n\t\treturn this.serviceDiscovery.register(this.fn.services);\n\t}\n\n\tasync getDatabase(): Promise<TDatabase | undefined> {\n\t\tif (!this.fn.databaseService) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst services = await this.serviceDiscovery.register([\n\t\t\tthis.fn.databaseService,\n\t\t]);\n\n\t\treturn services[\n\t\t\tthis.fn.databaseService.serviceName as keyof typeof services\n\t\t] as TDatabase;\n\t}\n\n\t/**\n\t * Get the audit storage service if configured.\n\t * Returns undefined if no auditor storage is configured.\n\t */\n\tasync getAuditStorage(): Promise<TAuditStorage | undefined> {\n\t\tif (!this.fn.auditorStorageService) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst services = await this.serviceDiscovery.register([\n\t\t\tthis.fn.auditorStorageService,\n\t\t]);\n\n\t\treturn services[\n\t\t\tthis.fn.auditorStorageService.serviceName as keyof typeof services\n\t\t] as TAuditStorage;\n\t}\n\n\t/**\n\t * Create an auditor instance for the function.\n\t * Returns undefined if no auditor storage is configured.\n\t */\n\tasync createAuditor(): Promise<Auditor<TAuditAction> | undefined> {\n\t\tconst storage = await this.getAuditStorage();\n\t\tif (!storage) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\treturn new DefaultAuditor<TAuditAction>({\n\t\t\tactor: { id: 'system', type: 'system' },\n\t\t\tstorage: storage as AuditStorage,\n\t\t\tmetadata: {\n\t\t\t\tfunction: this.fn.type,\n\t\t\t},\n\t\t});\n\t}\n\n\t/**\n\t * Execute handler with audit transaction support.\n\t * If the audit storage has a database (via getDatabase()), wraps execution\n\t * in a transaction so audits are atomic with handler's database operations.\n\t *\n\t * @param handler - The handler function to execute (receives auditor and db)\n\t * @returns The handler result\n\t */\n\tasync executeWithAudit<T>(\n\t\thandler: (ctx: {\n\t\t\tauditor?: Auditor<TAuditAction>;\n\t\t\tdb?: TDatabase;\n\t\t}) => Promise<T>,\n\t): Promise<T> {\n\t\tconst auditor = await this.createAuditor();\n\t\tconst storage = await this.getAuditStorage();\n\n\t\t// No audit context - just run handler with regular db\n\t\tif (!auditor || !storage) {\n\t\t\tconst db = await this.getDatabase();\n\t\t\treturn handler({ db });\n\t\t}\n\n\t\t// Check if storage has a database and db service names match\n\t\tconst storageDb = (storage as AuditStorage).getDatabase?.();\n\t\tconst databaseServiceName = this.fn.databaseService?.serviceName;\n\t\tconst auditDbServiceName = this.fn.auditorStorageService?.serviceName;\n\n\t\t// If the audit storage has a database and we're using the same database service\n\t\t// (or the audit storage provides the database), use transactional execution\n\t\tif (storageDb && databaseServiceName && auditDbServiceName) {\n\t\t\treturn withAuditableTransaction(\n\t\t\t\tstorageDb as any,\n\t\t\t\tauditor as any,\n\t\t\t\tasync (trx) => {\n\t\t\t\t\t// Use transaction as db\n\t\t\t\t\tconst response = await handler({\n\t\t\t\t\t\tauditor,\n\t\t\t\t\t\tdb: trx as TDatabase,\n\t\t\t\t\t});\n\t\t\t\t\t// Audits are flushed by withAuditableTransaction before commit\n\t\t\t\t\treturn response;\n\t\t\t\t},\n\t\t\t);\n\t\t}\n\n\t\t// No database on storage or service names don't match - run handler and flush audits after\n\t\tconst db = await this.getDatabase();\n\t\tconst response = await handler({ auditor, db });\n\n\t\t// Flush audits (no transaction)\n\t\tawait auditor.flush();\n\n\t\treturn response;\n\t}\n\n\tasync getFunctionInput<TEvent>(\n\t\tevent: TEvent,\n\t): Promise<InferComposableStandardSchema<TInput>> {\n\t\tconst parsedInput = await FunctionBuilder.parseComposableStandardSchema(\n\t\t\tevent,\n\t\t\tthis.fn.input,\n\t\t);\n\n\t\treturn parsedInput as InferComposableStandardSchema<TInput>;\n\t}\n\n\tasync publishEvents(response: InferStandardSchema<TOutSchema>) {\n\t\tawait publishEvents(\n\t\t\tthis.logger,\n\t\t\tthis.serviceDiscovery,\n\t\t\tthis.fn.events,\n\t\t\tresponse,\n\t\t\tthis.fn.publisherService,\n\t\t);\n\t}\n\n\tasync parseComposableStandardSchema<T extends ComposableStandardSchema>(\n\t\tdata: unknown,\n\t\tschema: T,\n\t): Promise<InferComposableStandardSchema<T>> {\n\t\treturn FunctionBuilder.parseComposableStandardSchema(data, schema);\n\t}\n}\n"],"mappings":";;;;;;;AAqBA,IAAsB,2BAAtB,MAeE;CACD,YACWA,WACSC,IAsBlB;EAvBS;EACS;CAsBhB;CAEJ,AAAU;CAEV,IAAI,SAAkB;AACrB,SAAO,KAAK,WAAW,KAAK,GAAG;CAC/B;CAED,IAAI,mBAA+D;EAClE,MAAM,mBAAmB,iBAAiB,YAExC,KAAK,UAAU;AAEjB,SAAO;CACP;CAED,cAAiD;AAChD,SAAO,KAAK,iBAAiB,SAAS,KAAK,GAAG,SAAS;CACvD;CAED,MAAM,cAA8C;AACnD,OAAK,KAAK,GAAG,gBACZ;EAGD,MAAM,WAAW,MAAM,KAAK,iBAAiB,SAAS,CACrD,KAAK,GAAG,eACR,EAAC;AAEF,SAAO,SACN,KAAK,GAAG,gBAAgB;CAEzB;;;;;CAMD,MAAM,kBAAsD;AAC3D,OAAK,KAAK,GAAG,sBACZ;EAGD,MAAM,WAAW,MAAM,KAAK,iBAAiB,SAAS,CACrD,KAAK,GAAG,qBACR,EAAC;AAEF,SAAO,SACN,KAAK,GAAG,sBAAsB;CAE/B;;;;;CAMD,MAAM,gBAA4D;EACjE,MAAM,UAAU,MAAM,KAAK,iBAAiB;AAC5C,OAAK,QACJ;AAGD,SAAO,IAAI,eAA6B;GACvC,OAAO;IAAE,IAAI;IAAU,MAAM;GAAU;GAC9B;GACT,UAAU,EACT,UAAU,KAAK,GAAG,KAClB;EACD;CACD;;;;;;;;;CAUD,MAAM,iBACLC,SAIa;EACb,MAAM,UAAU,MAAM,KAAK,eAAe;EAC1C,MAAM,UAAU,MAAM,KAAK,iBAAiB;AAG5C,OAAK,YAAY,SAAS;GACzB,MAAMC,OAAK,MAAM,KAAK,aAAa;AACnC,UAAO,QAAQ,EAAE,SAAI,EAAC;EACtB;EAGD,MAAM,YAAY,AAAC,QAAyB,eAAe;EAC3D,MAAM,sBAAsB,KAAK,GAAG,iBAAiB;EACrD,MAAM,qBAAqB,KAAK,GAAG,uBAAuB;AAI1D,MAAI,aAAa,uBAAuB,mBACvC,QAAO,yBACN,WACA,SACA,OAAO,QAAQ;GAEd,MAAMC,aAAW,MAAM,QAAQ;IAC9B;IACA,IAAI;GACJ,EAAC;AAEF,UAAOA;EACP,EACD;EAIF,MAAM,KAAK,MAAM,KAAK,aAAa;EACnC,MAAM,WAAW,MAAM,QAAQ;GAAE;GAAS;EAAI,EAAC;AAG/C,QAAM,QAAQ,OAAO;AAErB,SAAO;CACP;CAED,MAAM,iBACLC,OACiD;EACjD,MAAM,cAAc,MAAM,gBAAgB,8BACzC,OACA,KAAK,GAAG,MACR;AAED,SAAO;CACP;CAED,MAAM,cAAcC,UAA2C;AAC9D,QAAM,cACL,KAAK,QACL,KAAK,kBACL,KAAK,GAAG,QACR,UACA,KAAK,GAAG,iBACR;CACD;CAED,MAAM,8BACLC,MACAC,QAC4C;AAC5C,SAAO,gBAAgB,8BAA8B,MAAM,OAAO;CAClE;AACD"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { HttpMethod } from "./types-Dw-iLd3Y.mjs";
|
|
2
|
-
import { Endpoint, EndpointSchemas } from "./Endpoint-
|
|
2
|
+
import { Endpoint, EndpointSchemas } from "./Endpoint-DEHuy46S.mjs";
|
|
3
3
|
import { Service, ServiceDiscovery, ServiceRecord } from "@geekmidas/services";
|
|
4
4
|
import { AuditStorage, AuditableAction } from "@geekmidas/audit";
|
|
5
5
|
import { Context, Hono } from "hono";
|
|
@@ -7,7 +7,7 @@ import { EnvironmentParser } from "@geekmidas/envkit";
|
|
|
7
7
|
import { EventPublisher } from "@geekmidas/events";
|
|
8
8
|
import { Logger } from "@geekmidas/logger";
|
|
9
9
|
import { StandardSchemaV1 } from "@standard-schema/spec";
|
|
10
|
-
import * as
|
|
10
|
+
import * as hono_types6 from "hono/types";
|
|
11
11
|
|
|
12
12
|
//#region src/endpoints/HonoEndpointAdaptor.d.ts
|
|
13
13
|
interface HonoEndpointOptions {
|
|
@@ -38,7 +38,7 @@ declare class HonoEndpoint<TRoute extends string, TMethod extends HttpMethod, TI
|
|
|
38
38
|
* This method is kept for backward compatibility but does nothing.
|
|
39
39
|
*/
|
|
40
40
|
static applyEventMiddleware(_app: Hono, _serviceDiscovery: ServiceDiscovery<any, any>): void;
|
|
41
|
-
static fromRoutes<TLogger extends Logger, TServices extends Service[]>(routes: string[], envParser: EnvironmentParser<{}>, app: Hono<
|
|
41
|
+
static fromRoutes<TLogger extends Logger, TServices extends Service[]>(routes: string[], envParser: EnvironmentParser<{}>, app: Hono<hono_types6.BlankEnv, hono_types6.BlankSchema, "/"> | undefined, _logger: TLogger, cwd?: string, options?: HonoEndpointOptions): Promise<Hono>;
|
|
42
42
|
static addRoutes<TServices extends Service[] = [], TLogger extends Logger = Logger>(endpoints: Endpoint<string, HttpMethod, any, any, TServices, TLogger>[], serviceDiscovery: ServiceDiscovery<ServiceRecord<TServices>, TLogger>, app: Hono, options?: HonoEndpointOptions): void;
|
|
43
43
|
static addRoute<TRoute extends string, TMethod extends HttpMethod, TInput extends EndpointSchemas = {}, TOutSchema extends StandardSchemaV1 | undefined = undefined, TServices extends Service[] = [], TLogger extends Logger = Logger, TSession = unknown, TEventPublisher extends EventPublisher<any> | undefined = undefined, TEventPublisherServiceName extends string = string, TAuditStorage extends AuditStorage | undefined = undefined, TAuditStorageServiceName extends string = string, TAuditAction extends AuditableAction<string, unknown> = AuditableAction<string, unknown>, TDatabase = undefined, TDatabaseServiceName extends string = string>(endpoint: Endpoint<TRoute, TMethod, TInput, TOutSchema, TServices, TLogger, TSession, TEventPublisher, TEventPublisherServiceName, TAuditStorage, TAuditStorageServiceName, TAuditAction, TDatabase, TDatabaseServiceName>, serviceDiscovery: ServiceDiscovery<ServiceRecord<TServices>, TLogger>, app: Hono): void;
|
|
44
44
|
static addDocsRoute<TServices extends Service[] = [], TLogger extends Logger = Logger>(endpoints: Endpoint<string, HttpMethod, any, any, TServices, TLogger>[], app: Hono, docsPath: string, openApiOptions?: HonoEndpointOptions['openApiOptions']): void;
|
|
@@ -47,4 +47,4 @@ declare class HonoEndpoint<TRoute extends string, TMethod extends HttpMethod, TI
|
|
|
47
47
|
|
|
48
48
|
//#endregion
|
|
49
49
|
export { HonoEndpoint, HonoEndpointOptions };
|
|
50
|
-
//# sourceMappingURL=HonoEndpointAdaptor-
|
|
50
|
+
//# sourceMappingURL=HonoEndpointAdaptor-CKP6nrG2.d.mts.map
|
package/dist/{HonoEndpointAdaptor-Dkkemmbo.d.cts.map → HonoEndpointAdaptor-CKP6nrG2.d.mts.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HonoEndpointAdaptor-
|
|
1
|
+
{"version":3,"file":"HonoEndpointAdaptor-CKP6nrG2.d.mts","names":[],"sources":["../src/endpoints/HonoEndpointAdaptor.ts"],"sourcesContent":[],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { publishConstructEvents } from "./publisher-Bw4770Hi.mjs";
|
|
2
|
-
import { Endpoint, ResponseBuilder } from "./Endpoint-
|
|
2
|
+
import { Endpoint, ResponseBuilder } from "./Endpoint-ygxv2Ia6.mjs";
|
|
3
3
|
import { createAuditContext, executeWithAuditTransaction } from "./processAudits-Dj8UGqcW.mjs";
|
|
4
|
-
import { getEndpointsFromRoutes } from "./helpers-
|
|
4
|
+
import { getEndpointsFromRoutes } from "./helpers-Dl1eszfi.mjs";
|
|
5
5
|
import { createHonoCookies, createHonoHeaders } from "./lazyAccessors-B-Jgkg2o.mjs";
|
|
6
6
|
import { parseHonoQuery } from "./parseHonoQuery-DpK3sGPc.mjs";
|
|
7
7
|
import { withRlsContext } from "@geekmidas/db/rls";
|
|
@@ -248,4 +248,4 @@ var HonoEndpoint = class HonoEndpoint {
|
|
|
248
248
|
|
|
249
249
|
//#endregion
|
|
250
250
|
export { HonoEndpoint };
|
|
251
|
-
//# sourceMappingURL=HonoEndpointAdaptor-
|
|
251
|
+
//# sourceMappingURL=HonoEndpointAdaptor-Cc8Rnp9G.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HonoEndpointAdaptor-C_ym_Sbr.mjs","names":["endpoint: Endpoint<\n\t\tany,\n\t\tany,\n\t\tany,\n\t\tany,\n\t\tany,\n\t\tany,\n\t\tany,\n\t\tany,\n\t\tany,\n\t\tany,\n\t\tany,\n\t\tany,\n\t\tany,\n\t\tany\n\t>","endpoint: Endpoint<\n\t\t\tTRoute,\n\t\t\tTMethod,\n\t\t\tTInput,\n\t\t\tTOutSchema,\n\t\t\tTServices,\n\t\t\tTLogger,\n\t\t\tTSession,\n\t\t\tTEventPublisher,\n\t\t\tTEventPublisherServiceName,\n\t\t\tTAuditStorage,\n\t\t\tTAuditStorageServiceName,\n\t\t\tTAuditAction,\n\t\t\tTDatabase,\n\t\t\tTDatabaseServiceName\n\t\t>","c: Context<any, string, {}>","data: unknown","schema?: T","serviceDiscovery: ServiceDiscovery<ServiceRecord<TServices>, TLogger>","app: Hono","_app: Hono","_serviceDiscovery: ServiceDiscovery<any, any>","routes: string[]","envParser: EnvironmentParser<{}>","_logger: TLogger","options?: HonoEndpointOptions","endpoints: Endpoint<string, HttpMethod, any, any, TServices, TLogger>[]","validators: any[]","c: Context","logger","db: TDatabase | undefined","metadata","output","result","validationError: any","e: any","docsPath: string","openApiOptions?: HonoEndpointOptions['openApiOptions']"],"sources":["../src/endpoints/HonoEndpointAdaptor.ts"],"sourcesContent":["import type { AuditableAction, AuditStorage } from '@geekmidas/audit';\nimport { withRlsContext } from '@geekmidas/db/rls';\nimport type { EnvironmentParser } from '@geekmidas/envkit';\nimport { wrapError } from '@geekmidas/errors';\nimport type { EventPublisher } from '@geekmidas/events';\nimport type { Logger } from '@geekmidas/logger';\nimport { checkRateLimit, getRateLimitHeaders } from '@geekmidas/rate-limit';\nimport {\n\trunWithRequestContext,\n\ttype Service,\n\tServiceDiscovery,\n\ttype ServiceRecord,\n} from '@geekmidas/services';\nimport type { StandardSchemaV1 } from '@standard-schema/spec';\nimport { type Context, Hono } from 'hono';\nimport { setCookie } from 'hono/cookie';\nimport { logger as honoLogger } from 'hono/logger';\nimport { timing } from 'hono/timing';\nimport type { ContentfulStatusCode } from 'hono/utils/http-status';\nimport { validator } from 'hono/validator';\nimport { publishConstructEvents } from '../publisher';\nimport type { HttpMethod, LowerHttpMethod } from '../types';\nimport type { MappedAudit } from './audit';\nimport {\n\tEndpoint,\n\ttype EndpointContext,\n\ttype EndpointSchemas,\n\tResponseBuilder,\n} from './Endpoint';\nimport { getEndpointsFromRoutes } from './helpers';\nimport { createHonoCookies, createHonoHeaders } from './lazyAccessors';\nimport { parseHonoQuery } from './parseHonoQuery';\nimport {\n\tcreateAuditContext,\n\texecuteWithAuditTransaction,\n} from './processAudits';\n\nexport interface HonoEndpointOptions {\n\t/**\n\t * Path where OpenAPI documentation will be served.\n\t * Set to false to disable docs route.\n\t * @default '/docs'\n\t */\n\tdocsPath?: string | false;\n\t/**\n\t * OpenAPI schema options\n\t */\n\topenApiOptions?: {\n\t\ttitle?: string;\n\t\tversion?: string;\n\t\tdescription?: string;\n\t};\n}\n\n/**\n * Feature flags for an endpoint, analyzed once at route registration time.\n * This avoids per-request feature detection overhead.\n */\ninterface EndpointFeatures {\n\thasServices: boolean;\n\thasDatabase: boolean;\n\thasBodyValidation: boolean;\n\thasQueryValidation: boolean;\n\thasParamValidation: boolean;\n\thasAudits: boolean;\n\thasEvents: boolean;\n\thasRateLimit: boolean;\n\thasRls: boolean;\n}\n\n/**\n * Analyze endpoint features at registration time (not per-request)\n */\nfunction analyzeEndpointFeatures(\n\tendpoint: Endpoint<\n\t\tany,\n\t\tany,\n\t\tany,\n\t\tany,\n\t\tany,\n\t\tany,\n\t\tany,\n\t\tany,\n\t\tany,\n\t\tany,\n\t\tany,\n\t\tany,\n\t\tany,\n\t\tany\n\t>,\n): EndpointFeatures {\n\treturn {\n\t\thasServices: endpoint.services.length > 0,\n\t\thasDatabase: !!endpoint.databaseService,\n\t\thasBodyValidation: !!endpoint.input?.body,\n\t\thasQueryValidation: !!endpoint.input?.query,\n\t\thasParamValidation: !!endpoint.input?.params,\n\t\t// Audit context needed if declarative audits OR auditor storage service configured (for manual audits)\n\t\thasAudits:\n\t\t\t(endpoint.audits?.length ?? 0) > 0 || !!endpoint.auditorStorageService,\n\t\thasEvents: (endpoint.events?.length ?? 0) > 0,\n\t\thasRateLimit: !!endpoint.rateLimit,\n\t\thasRls: !!endpoint.rlsConfig && !endpoint.rlsBypass,\n\t};\n}\n\nexport class HonoEndpoint<\n\tTRoute extends string,\n\tTMethod extends HttpMethod,\n\tTInput extends EndpointSchemas = {},\n\tTOutSchema extends StandardSchemaV1 | undefined = undefined,\n\tTServices extends Service[] = [],\n\tTLogger extends Logger = Logger,\n\tTSession = unknown,\n\tTEventPublisher extends EventPublisher<any> | undefined = undefined,\n\tTEventPublisherServiceName extends string = string,\n\tTAuditStorage extends AuditStorage | undefined = undefined,\n\tTAuditStorageServiceName extends string = string,\n\tTAuditAction extends AuditableAction<string, unknown> = AuditableAction<\n\t\tstring,\n\t\tunknown\n\t>,\n\tTDatabase = undefined,\n\tTDatabaseServiceName extends string = string,\n> {\n\tconstructor(\n\t\tprivate readonly endpoint: Endpoint<\n\t\t\tTRoute,\n\t\t\tTMethod,\n\t\t\tTInput,\n\t\t\tTOutSchema,\n\t\t\tTServices,\n\t\t\tTLogger,\n\t\t\tTSession,\n\t\t\tTEventPublisher,\n\t\t\tTEventPublisherServiceName,\n\t\t\tTAuditStorage,\n\t\t\tTAuditStorageServiceName,\n\t\t\tTAuditAction,\n\t\t\tTDatabase,\n\t\t\tTDatabaseServiceName\n\t\t>,\n\t) {}\n\n\tstatic isDev = process.env.NODE_ENV === 'development';\n\n\tstatic async validate<T extends StandardSchemaV1>(\n\t\tc: Context<any, string, {}>,\n\t\tdata: unknown,\n\t\tschema?: T,\n\t) {\n\t\tif (!schema) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst parsed = await Endpoint.validate(schema, data);\n\n\t\tif (parsed.issues) {\n\t\t\treturn c.json(parsed.issues, 422);\n\t\t}\n\n\t\treturn parsed.value;\n\t}\n\taddRoute(\n\t\tserviceDiscovery: ServiceDiscovery<ServiceRecord<TServices>, TLogger>,\n\t\tapp: Hono,\n\t): void {\n\t\tHonoEndpoint.addRoute(this.endpoint, serviceDiscovery, app);\n\t}\n\n\t/**\n\t * @deprecated Global event middleware is no longer used.\n\t * Events are now published per-route only for endpoints that have events configured.\n\t * This method is kept for backward compatibility but does nothing.\n\t */\n\tstatic applyEventMiddleware(\n\t\t_app: Hono,\n\t\t_serviceDiscovery: ServiceDiscovery<any, any>,\n\t) {\n\t\t// No-op: Event publishing is now handled per-route in addRoute\n\t\t// This avoids running middleware on every request including 404s\n\t}\n\n\tstatic async fromRoutes<TLogger extends Logger, TServices extends Service[]>(\n\t\troutes: string[],\n\t\tenvParser: EnvironmentParser<{}>,\n\t\tapp = new Hono(),\n\t\t_logger: TLogger,\n\t\tcwd = process.cwd(),\n\t\toptions?: HonoEndpointOptions,\n\t): Promise<Hono> {\n\t\tconst endpoints = await getEndpointsFromRoutes<TServices>(routes, cwd);\n\t\tconst serviceDiscovery =\n\t\t\tServiceDiscovery.getInstance<ServiceRecord<TServices>>(envParser);\n\n\t\tHonoEndpoint.addRoutes(endpoints, serviceDiscovery, app, options);\n\n\t\treturn app;\n\t}\n\n\tstatic addRoutes<\n\t\tTServices extends Service[] = [],\n\t\tTLogger extends Logger = Logger,\n\t>(\n\t\tendpoints: Endpoint<string, HttpMethod, any, any, TServices, TLogger>[],\n\t\tserviceDiscovery: ServiceDiscovery<ServiceRecord<TServices>, TLogger>,\n\t\tapp: Hono,\n\t\toptions?: HonoEndpointOptions,\n\t): void {\n\t\t// Add timing middleware (always enabled)\n\t\tapp.use('*', timing());\n\n\t\t// Add logger middleware in development mode\n\n\t\tif (HonoEndpoint.isDev) {\n\t\t\tapp.use('*', honoLogger());\n\t\t}\n\n\t\t// Add docs route if not disabled\n\t\tconst docsPath =\n\t\t\toptions?.docsPath !== false ? options?.docsPath || '/docs' : null;\n\t\tif (docsPath) {\n\t\t\tHonoEndpoint.addDocsRoute(\n\t\t\t\tendpoints,\n\t\t\t\tapp,\n\t\t\t\tdocsPath,\n\t\t\t\toptions?.openApiOptions,\n\t\t\t);\n\t\t}\n\n\t\t// Sort endpoints to ensure static routes come before dynamic ones\n\t\tconst sortedEndpoints = endpoints.sort((a, b) => {\n\t\t\tconst aSegments = a.route.split('/');\n\t\t\tconst bSegments = b.route.split('/');\n\n\t\t\t// Compare each segment\n\t\t\tfor (let i = 0; i < Math.max(aSegments.length, bSegments.length); i++) {\n\t\t\t\tconst aSegment = aSegments[i] || '';\n\t\t\t\tconst bSegment = bSegments[i] || '';\n\n\t\t\t\t// If one is dynamic and the other is not, static comes first\n\t\t\t\tconst aIsDynamic = aSegment.startsWith(':');\n\t\t\t\tconst bIsDynamic = bSegment.startsWith(':');\n\n\t\t\t\tif (!aIsDynamic && bIsDynamic) return -1;\n\t\t\t\tif (aIsDynamic && !bIsDynamic) return 1;\n\n\t\t\t\t// If both are the same type, compare alphabetically\n\t\t\t\tif (aSegment !== bSegment) {\n\t\t\t\t\treturn aSegment.localeCompare(bSegment);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn 0;\n\t\t});\n\n\t\t// Note: Global event middleware removed for performance\n\t\t// Events are now published per-route only for endpoints with events configured\n\t\tfor (const endpoint of sortedEndpoints) {\n\t\t\tHonoEndpoint.addRoute(endpoint, serviceDiscovery, app);\n\t\t}\n\t}\n\n\tstatic addRoute<\n\t\tTRoute extends string,\n\t\tTMethod extends HttpMethod,\n\t\tTInput extends EndpointSchemas = {},\n\t\tTOutSchema extends StandardSchemaV1 | undefined = undefined,\n\t\tTServices extends Service[] = [],\n\t\tTLogger extends Logger = Logger,\n\t\tTSession = unknown,\n\t\tTEventPublisher extends EventPublisher<any> | undefined = undefined,\n\t\tTEventPublisherServiceName extends string = string,\n\t\tTAuditStorage extends AuditStorage | undefined = undefined,\n\t\tTAuditStorageServiceName extends string = string,\n\t\tTAuditAction extends AuditableAction<string, unknown> = AuditableAction<\n\t\t\tstring,\n\t\t\tunknown\n\t\t>,\n\t\tTDatabase = undefined,\n\t\tTDatabaseServiceName extends string = string,\n\t>(\n\t\tendpoint: Endpoint<\n\t\t\tTRoute,\n\t\t\tTMethod,\n\t\t\tTInput,\n\t\t\tTOutSchema,\n\t\t\tTServices,\n\t\t\tTLogger,\n\t\t\tTSession,\n\t\t\tTEventPublisher,\n\t\t\tTEventPublisherServiceName,\n\t\t\tTAuditStorage,\n\t\t\tTAuditStorageServiceName,\n\t\t\tTAuditAction,\n\t\t\tTDatabase,\n\t\t\tTDatabaseServiceName\n\t\t>,\n\t\tserviceDiscovery: ServiceDiscovery<ServiceRecord<TServices>, TLogger>,\n\t\tapp: Hono,\n\t): void {\n\t\tconst { route } = endpoint;\n\t\tconst method = endpoint.method.toLowerCase() as LowerHttpMethod<TMethod>;\n\n\t\t// Analyze endpoint features once at registration time (not per-request)\n\t\tconst features = analyzeEndpointFeatures(endpoint);\n\n\t\t// Build validators array - only add validators for schemas that exist\n\t\tconst validators: any[] = [];\n\n\t\tif (features.hasBodyValidation) {\n\t\t\tvalidators.push(\n\t\t\t\tvalidator('json', (value, c) =>\n\t\t\t\t\tHonoEndpoint.validate(c, value, endpoint.input?.body),\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\n\t\tif (features.hasQueryValidation) {\n\t\t\tvalidators.push(\n\t\t\t\tvalidator('query', (_, c) => {\n\t\t\t\t\tconst parsedQuery = parseHonoQuery(c);\n\t\t\t\t\treturn HonoEndpoint.validate(c, parsedQuery, endpoint.input?.query);\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\n\t\tif (features.hasParamValidation) {\n\t\t\tvalidators.push(\n\t\t\t\tvalidator('param', (params, c) =>\n\t\t\t\t\tHonoEndpoint.validate(c, params, endpoint.input?.params),\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\n\t\t// Main handler\n\t\tconst handler = async (c: Context) => {\n\t\t\t// Request context setup\n\t\t\tconst startTime = Date.now();\n\t\t\tconst requestId = c.req.header('X-Request-ID') ?? crypto.randomUUID();\n\n\t\t\tconst logger = endpoint.logger.child({\n\t\t\t\trequestId,\n\t\t\t\tendpoint: endpoint.fullPath,\n\t\t\t\troute: endpoint.route,\n\t\t\t\thost: c.req.header('host'),\n\t\t\t\tmethod: endpoint.method,\n\t\t\t\tpath: c.req.path,\n\t\t\t}) as TLogger;\n\n\t\t\t// Set response header\n\t\t\tc.header('X-Request-ID', requestId);\n\n\t\t\t// Wrap entire handler in request context for services to access\n\t\t\treturn runWithRequestContext(\n\t\t\t\t{ logger, requestId, startTime },\n\t\t\t\tasync () => {\n\t\t\t\t\ttry {\n\t\t\t\t\t\t// Lazy accessors - no upfront parsing, use native Hono methods\n\t\t\t\t\t\tconst header = createHonoHeaders(c);\n\t\t\t\t\t\tconst cookie = createHonoCookies(c);\n\n\t\t\t\t\t\t// Only register services if endpoint has any\n\t\t\t\t\t\tconst services = features.hasServices\n\t\t\t\t\t\t\t? await serviceDiscovery.register(endpoint.services)\n\t\t\t\t\t\t\t: ({} as ServiceRecord<TServices>);\n\n\t\t\t\t\t\t// Resolve database service only if configured\n\t\t\t\t\t\tconst rawDb = features.hasDatabase\n\t\t\t\t\t\t\t? await serviceDiscovery\n\t\t\t\t\t\t\t\t\t.register([endpoint.databaseService!])\n\t\t\t\t\t\t\t\t\t.then(\n\t\t\t\t\t\t\t\t\t\t(s) =>\n\t\t\t\t\t\t\t\t\t\t\ts[\n\t\t\t\t\t\t\t\t\t\t\t\tendpoint.databaseService?.serviceName as keyof typeof s\n\t\t\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t: undefined;\n\n\t\t\t\t\t\t// Extract session (defaults to empty object)\n\t\t\t\t\t\tconst session = await endpoint.getSession({\n\t\t\t\t\t\t\tservices,\n\t\t\t\t\t\t\tlogger,\n\t\t\t\t\t\t\theader,\n\t\t\t\t\t\t\tcookie,\n\t\t\t\t\t\t\t...(rawDb !== undefined && { db: rawDb }),\n\t\t\t\t\t\t} as any);\n\n\t\t\t\t\t\t// Check authorization (defaults to true)\n\t\t\t\t\t\tconst isAuthorized = await endpoint.authorize({\n\t\t\t\t\t\t\theader,\n\t\t\t\t\t\t\tcookie,\n\t\t\t\t\t\t\tservices,\n\t\t\t\t\t\t\tlogger,\n\t\t\t\t\t\t\tsession,\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tif (!isAuthorized) {\n\t\t\t\t\t\t\tlogger.warn('Unauthorized access attempt');\n\t\t\t\t\t\t\treturn c.json({ error: 'Unauthorized' }, 401);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Check rate limit only if configured\n\t\t\t\t\t\tif (features.hasRateLimit) {\n\t\t\t\t\t\t\tconst rateLimitInfo = await checkRateLimit(endpoint.rateLimit!, {\n\t\t\t\t\t\t\t\theader,\n\t\t\t\t\t\t\t\tservices,\n\t\t\t\t\t\t\t\tlogger,\n\t\t\t\t\t\t\t\tsession,\n\t\t\t\t\t\t\t\tpath: c.req.path,\n\t\t\t\t\t\t\t\tmethod: endpoint.method,\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tconst rateLimitHeaders = getRateLimitHeaders(\n\t\t\t\t\t\t\t\trateLimitInfo,\n\t\t\t\t\t\t\t\tendpoint.rateLimit!,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tfor (const [key, value] of Object.entries(rateLimitHeaders)) {\n\t\t\t\t\t\t\t\tif (value) {\n\t\t\t\t\t\t\t\t\tc.header(key, value);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Create audit context only if audits are configured\n\t\t\t\t\t\tconst auditContext = features.hasAudits\n\t\t\t\t\t\t\t? await createAuditContext(\n\t\t\t\t\t\t\t\t\tendpoint as any,\n\t\t\t\t\t\t\t\t\tserviceDiscovery,\n\t\t\t\t\t\t\t\t\tlogger,\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tsession,\n\t\t\t\t\t\t\t\t\t\theader,\n\t\t\t\t\t\t\t\t\t\tcookie,\n\t\t\t\t\t\t\t\t\t\tservices: services as Record<string, unknown>,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t: undefined;\n\n\t\t\t\t\t\tconst audits = features.hasAudits\n\t\t\t\t\t\t\t? (endpoint.audits as MappedAudit<TAuditAction, TOutSchema>[])\n\t\t\t\t\t\t\t: [];\n\n\t\t\t\t\t\t// Warn if declarative audits are configured but no audit storage\n\t\t\t\t\t\tif (features.hasAudits && !auditContext) {\n\t\t\t\t\t\t\tlogger.warn('No auditor storage service available');\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Extract RLS context only if configured and not bypassed\n\t\t\t\t\t\tconst rlsContext =\n\t\t\t\t\t\t\tfeatures.hasRls && rawDb !== undefined\n\t\t\t\t\t\t\t\t? await endpoint.rlsConfig?.extractor({\n\t\t\t\t\t\t\t\t\t\tservices,\n\t\t\t\t\t\t\t\t\t\tsession: session as TSession,\n\t\t\t\t\t\t\t\t\t\theader,\n\t\t\t\t\t\t\t\t\t\tcookie,\n\t\t\t\t\t\t\t\t\t\tlogger,\n\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t: undefined;\n\n\t\t\t\t\t\t// Execute handler with automatic audit transaction support\n\t\t\t\t\t\tconst result = await executeWithAuditTransaction(\n\t\t\t\t\t\t\tauditContext,\n\t\t\t\t\t\t\tasync (auditor) => {\n\t\t\t\t\t\t\t\tconst sameDatabase =\n\t\t\t\t\t\t\t\t\tauditContext?.storage?.databaseServiceName &&\n\t\t\t\t\t\t\t\t\tauditContext.storage.databaseServiceName ===\n\t\t\t\t\t\t\t\t\t\tendpoint.databaseService?.serviceName;\n\t\t\t\t\t\t\t\tconst baseDb = sameDatabase\n\t\t\t\t\t\t\t\t\t? (auditor?.getTransaction?.() ?? rawDb)\n\t\t\t\t\t\t\t\t\t: rawDb;\n\n\t\t\t\t\t\t\t\tconst executeHandler = async (db: TDatabase | undefined) => {\n\t\t\t\t\t\t\t\t\tconst responseBuilder = new ResponseBuilder();\n\t\t\t\t\t\t\t\t\tconst response = await endpoint.handler(\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\tservices,\n\t\t\t\t\t\t\t\t\t\t\tlogger,\n\t\t\t\t\t\t\t\t\t\t\tbody: features.hasBodyValidation\n\t\t\t\t\t\t\t\t\t\t\t\t? (c.req.valid as any)('json')\n\t\t\t\t\t\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\t\t\t\t\t\t\tquery: features.hasQueryValidation\n\t\t\t\t\t\t\t\t\t\t\t\t? (c.req.valid as any)('query')\n\t\t\t\t\t\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\t\t\t\t\t\t\tparams: features.hasParamValidation\n\t\t\t\t\t\t\t\t\t\t\t\t? (c.req.valid as any)('param')\n\t\t\t\t\t\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\t\t\t\t\t\t\tsession,\n\t\t\t\t\t\t\t\t\t\t\theader,\n\t\t\t\t\t\t\t\t\t\t\tcookie,\n\t\t\t\t\t\t\t\t\t\t\tauditor,\n\t\t\t\t\t\t\t\t\t\t\tdb,\n\t\t\t\t\t\t\t\t\t\t} as unknown as EndpointContext<\n\t\t\t\t\t\t\t\t\t\t\tTInput,\n\t\t\t\t\t\t\t\t\t\t\tTServices,\n\t\t\t\t\t\t\t\t\t\t\tTLogger,\n\t\t\t\t\t\t\t\t\t\t\tTSession,\n\t\t\t\t\t\t\t\t\t\t\tTAuditAction,\n\t\t\t\t\t\t\t\t\t\t\tTDatabase,\n\t\t\t\t\t\t\t\t\t\t\tTAuditStorage\n\t\t\t\t\t\t\t\t\t\t>,\n\t\t\t\t\t\t\t\t\t\tresponseBuilder,\n\t\t\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t\t\tlet data = response;\n\t\t\t\t\t\t\t\t\tlet metadata = responseBuilder.getMetadata();\n\n\t\t\t\t\t\t\t\t\tif (Endpoint.hasMetadata(response)) {\n\t\t\t\t\t\t\t\t\t\tdata = response.data;\n\t\t\t\t\t\t\t\t\t\tmetadata = response.metadata;\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\tconst output = endpoint.outputSchema\n\t\t\t\t\t\t\t\t\t\t? await endpoint.parseOutput(data)\n\t\t\t\t\t\t\t\t\t\t: undefined;\n\n\t\t\t\t\t\t\t\t\treturn { output, metadata, responseBuilder };\n\t\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\t\tif (features.hasRls && rlsContext && baseDb) {\n\t\t\t\t\t\t\t\t\treturn withRlsContext(\n\t\t\t\t\t\t\t\t\t\tbaseDb as any,\n\t\t\t\t\t\t\t\t\t\trlsContext,\n\t\t\t\t\t\t\t\t\t\tasync (trx) => executeHandler(trx as TDatabase),\n\t\t\t\t\t\t\t\t\t\t{ prefix: endpoint.rlsConfig?.prefix },\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\treturn executeHandler(baseDb as TDatabase | undefined);\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tasync (result, auditor) => {\n\t\t\t\t\t\t\t\tif (!audits?.length) return;\n\n\t\t\t\t\t\t\t\tfor (const audit of audits) {\n\t\t\t\t\t\t\t\t\tif (audit.when && !audit.when(result.output as any)) {\n\t\t\t\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tconst payload = audit.payload(result.output as any);\n\t\t\t\t\t\t\t\t\tconst entityId = audit.entityId?.(result.output as any);\n\t\t\t\t\t\t\t\t\tauditor.audit(audit.type as any, payload as any, {\n\t\t\t\t\t\t\t\t\t\ttable: audit.table,\n\t\t\t\t\t\t\t\t\t\tentityId,\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{ db: rawDb },\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tconst { output, metadata } = result;\n\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tlet status = endpoint.status as ContentfulStatusCode;\n\n\t\t\t\t\t\t\tif (metadata.status) {\n\t\t\t\t\t\t\t\tstatus = metadata.status as ContentfulStatusCode;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (metadata.headers) {\n\t\t\t\t\t\t\t\tfor (const [key, value] of Object.entries(metadata.headers)) {\n\t\t\t\t\t\t\t\t\tc.header(key, value);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (metadata.cookies) {\n\t\t\t\t\t\t\t\tfor (const [name, { value, options }] of metadata.cookies) {\n\t\t\t\t\t\t\t\t\tsetCookie(c, name, value, options);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// Only publish events if configured (no global middleware overhead)\n\t\t\t\t\t\t\tif (features.hasEvents && Endpoint.isSuccessStatus(status)) {\n\t\t\t\t\t\t\t\tawait publishConstructEvents<any, any>(\n\t\t\t\t\t\t\t\t\tendpoint as any,\n\t\t\t\t\t\t\t\t\toutput,\n\t\t\t\t\t\t\t\t\tserviceDiscovery,\n\t\t\t\t\t\t\t\t\tlogger,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (HonoEndpoint.isDev) {\n\t\t\t\t\t\t\t\tlogger.info({ status, body: output }, 'Outgoing response');\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// @ts-expect-error\n\t\t\t\t\t\t\treturn c.json(output, status);\n\t\t\t\t\t\t} catch (validationError: any) {\n\t\t\t\t\t\t\tlogger.error(validationError, 'Output validation failed');\n\t\t\t\t\t\t\tconst error = wrapError(\n\t\t\t\t\t\t\t\tvalidationError,\n\t\t\t\t\t\t\t\t422,\n\t\t\t\t\t\t\t\t'Response validation failed',\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tif (HonoEndpoint.isDev) {\n\t\t\t\t\t\t\t\tlogger.info(\n\t\t\t\t\t\t\t\t\t{ status: error.statusCode, body: error },\n\t\t\t\t\t\t\t\t\t'Outgoing response',\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn c.json(error, error.statusCode as ContentfulStatusCode);\n\t\t\t\t\t\t}\n\t\t\t\t\t} catch (e: any) {\n\t\t\t\t\t\tlogger.error(e, 'Error processing endpoint request');\n\t\t\t\t\t\tconst error = wrapError(e, 500, 'Internal Server Error');\n\t\t\t\t\t\tif (HonoEndpoint.isDev) {\n\t\t\t\t\t\t\tlogger.info(\n\t\t\t\t\t\t\t\t{ status: error.statusCode, body: error },\n\t\t\t\t\t\t\t\t'Outgoing response',\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn c.json(error, error.statusCode as ContentfulStatusCode);\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t);\n\t\t};\n\n\t\t// Register route with conditional validators\n\t\tapp[method](route, ...validators, handler);\n\t}\n\n\tstatic addDocsRoute<\n\t\tTServices extends Service[] = [],\n\t\tTLogger extends Logger = Logger,\n\t>(\n\t\tendpoints: Endpoint<string, HttpMethod, any, any, TServices, TLogger>[],\n\t\tapp: Hono,\n\t\tdocsPath: string,\n\t\topenApiOptions?: HonoEndpointOptions['openApiOptions'],\n\t): void {\n\t\tapp.get(docsPath, async (c) => {\n\t\t\ttry {\n\t\t\t\tconst openApiSchema = await Endpoint.buildOpenApiSchema(\n\t\t\t\t\tendpoints,\n\t\t\t\t\topenApiOptions,\n\t\t\t\t);\n\n\t\t\t\treturn c.json(openApiSchema);\n\t\t\t} catch {\n\t\t\t\treturn c.json(\n\t\t\t\t\t{ error: 'Failed to generate OpenAPI documentation' },\n\t\t\t\t\t500,\n\t\t\t\t);\n\t\t\t}\n\t\t});\n\t}\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"HonoEndpointAdaptor-Cc8Rnp9G.mjs","names":["endpoint: Endpoint<\n\t\tany,\n\t\tany,\n\t\tany,\n\t\tany,\n\t\tany,\n\t\tany,\n\t\tany,\n\t\tany,\n\t\tany,\n\t\tany,\n\t\tany,\n\t\tany,\n\t\tany,\n\t\tany\n\t>","endpoint: Endpoint<\n\t\t\tTRoute,\n\t\t\tTMethod,\n\t\t\tTInput,\n\t\t\tTOutSchema,\n\t\t\tTServices,\n\t\t\tTLogger,\n\t\t\tTSession,\n\t\t\tTEventPublisher,\n\t\t\tTEventPublisherServiceName,\n\t\t\tTAuditStorage,\n\t\t\tTAuditStorageServiceName,\n\t\t\tTAuditAction,\n\t\t\tTDatabase,\n\t\t\tTDatabaseServiceName\n\t\t>","c: Context<any, string, {}>","data: unknown","schema?: T","serviceDiscovery: ServiceDiscovery<ServiceRecord<TServices>, TLogger>","app: Hono","_app: Hono","_serviceDiscovery: ServiceDiscovery<any, any>","routes: string[]","envParser: EnvironmentParser<{}>","_logger: TLogger","options?: HonoEndpointOptions","endpoints: Endpoint<string, HttpMethod, any, any, TServices, TLogger>[]","validators: any[]","c: Context","logger","db: TDatabase | undefined","metadata","output","result","validationError: any","e: any","docsPath: string","openApiOptions?: HonoEndpointOptions['openApiOptions']"],"sources":["../src/endpoints/HonoEndpointAdaptor.ts"],"sourcesContent":["import type { AuditableAction, AuditStorage } from '@geekmidas/audit';\nimport { withRlsContext } from '@geekmidas/db/rls';\nimport type { EnvironmentParser } from '@geekmidas/envkit';\nimport { wrapError } from '@geekmidas/errors';\nimport type { EventPublisher } from '@geekmidas/events';\nimport type { Logger } from '@geekmidas/logger';\nimport { checkRateLimit, getRateLimitHeaders } from '@geekmidas/rate-limit';\nimport {\n\trunWithRequestContext,\n\ttype Service,\n\tServiceDiscovery,\n\ttype ServiceRecord,\n} from '@geekmidas/services';\nimport type { StandardSchemaV1 } from '@standard-schema/spec';\nimport { type Context, Hono } from 'hono';\nimport { setCookie } from 'hono/cookie';\nimport { logger as honoLogger } from 'hono/logger';\nimport { timing } from 'hono/timing';\nimport type { ContentfulStatusCode } from 'hono/utils/http-status';\nimport { validator } from 'hono/validator';\nimport { publishConstructEvents } from '../publisher';\nimport type { HttpMethod, LowerHttpMethod } from '../types';\nimport type { MappedAudit } from './audit';\nimport {\n\tEndpoint,\n\ttype EndpointContext,\n\ttype EndpointSchemas,\n\tResponseBuilder,\n} from './Endpoint';\nimport { getEndpointsFromRoutes } from './helpers';\nimport { createHonoCookies, createHonoHeaders } from './lazyAccessors';\nimport { parseHonoQuery } from './parseHonoQuery';\nimport {\n\tcreateAuditContext,\n\texecuteWithAuditTransaction,\n} from './processAudits';\n\nexport interface HonoEndpointOptions {\n\t/**\n\t * Path where OpenAPI documentation will be served.\n\t * Set to false to disable docs route.\n\t * @default '/docs'\n\t */\n\tdocsPath?: string | false;\n\t/**\n\t * OpenAPI schema options\n\t */\n\topenApiOptions?: {\n\t\ttitle?: string;\n\t\tversion?: string;\n\t\tdescription?: string;\n\t};\n}\n\n/**\n * Feature flags for an endpoint, analyzed once at route registration time.\n * This avoids per-request feature detection overhead.\n */\ninterface EndpointFeatures {\n\thasServices: boolean;\n\thasDatabase: boolean;\n\thasBodyValidation: boolean;\n\thasQueryValidation: boolean;\n\thasParamValidation: boolean;\n\thasAudits: boolean;\n\thasEvents: boolean;\n\thasRateLimit: boolean;\n\thasRls: boolean;\n}\n\n/**\n * Analyze endpoint features at registration time (not per-request)\n */\nfunction analyzeEndpointFeatures(\n\tendpoint: Endpoint<\n\t\tany,\n\t\tany,\n\t\tany,\n\t\tany,\n\t\tany,\n\t\tany,\n\t\tany,\n\t\tany,\n\t\tany,\n\t\tany,\n\t\tany,\n\t\tany,\n\t\tany,\n\t\tany\n\t>,\n): EndpointFeatures {\n\treturn {\n\t\thasServices: endpoint.services.length > 0,\n\t\thasDatabase: !!endpoint.databaseService,\n\t\thasBodyValidation: !!endpoint.input?.body,\n\t\thasQueryValidation: !!endpoint.input?.query,\n\t\thasParamValidation: !!endpoint.input?.params,\n\t\t// Audit context needed if declarative audits OR auditor storage service configured (for manual audits)\n\t\thasAudits:\n\t\t\t(endpoint.audits?.length ?? 0) > 0 || !!endpoint.auditorStorageService,\n\t\thasEvents: (endpoint.events?.length ?? 0) > 0,\n\t\thasRateLimit: !!endpoint.rateLimit,\n\t\thasRls: !!endpoint.rlsConfig && !endpoint.rlsBypass,\n\t};\n}\n\nexport class HonoEndpoint<\n\tTRoute extends string,\n\tTMethod extends HttpMethod,\n\tTInput extends EndpointSchemas = {},\n\tTOutSchema extends StandardSchemaV1 | undefined = undefined,\n\tTServices extends Service[] = [],\n\tTLogger extends Logger = Logger,\n\tTSession = unknown,\n\tTEventPublisher extends EventPublisher<any> | undefined = undefined,\n\tTEventPublisherServiceName extends string = string,\n\tTAuditStorage extends AuditStorage | undefined = undefined,\n\tTAuditStorageServiceName extends string = string,\n\tTAuditAction extends AuditableAction<string, unknown> = AuditableAction<\n\t\tstring,\n\t\tunknown\n\t>,\n\tTDatabase = undefined,\n\tTDatabaseServiceName extends string = string,\n> {\n\tconstructor(\n\t\tprivate readonly endpoint: Endpoint<\n\t\t\tTRoute,\n\t\t\tTMethod,\n\t\t\tTInput,\n\t\t\tTOutSchema,\n\t\t\tTServices,\n\t\t\tTLogger,\n\t\t\tTSession,\n\t\t\tTEventPublisher,\n\t\t\tTEventPublisherServiceName,\n\t\t\tTAuditStorage,\n\t\t\tTAuditStorageServiceName,\n\t\t\tTAuditAction,\n\t\t\tTDatabase,\n\t\t\tTDatabaseServiceName\n\t\t>,\n\t) {}\n\n\tstatic isDev = process.env.NODE_ENV === 'development';\n\n\tstatic async validate<T extends StandardSchemaV1>(\n\t\tc: Context<any, string, {}>,\n\t\tdata: unknown,\n\t\tschema?: T,\n\t) {\n\t\tif (!schema) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst parsed = await Endpoint.validate(schema, data);\n\n\t\tif (parsed.issues) {\n\t\t\treturn c.json(parsed.issues, 422);\n\t\t}\n\n\t\treturn parsed.value;\n\t}\n\taddRoute(\n\t\tserviceDiscovery: ServiceDiscovery<ServiceRecord<TServices>, TLogger>,\n\t\tapp: Hono,\n\t): void {\n\t\tHonoEndpoint.addRoute(this.endpoint, serviceDiscovery, app);\n\t}\n\n\t/**\n\t * @deprecated Global event middleware is no longer used.\n\t * Events are now published per-route only for endpoints that have events configured.\n\t * This method is kept for backward compatibility but does nothing.\n\t */\n\tstatic applyEventMiddleware(\n\t\t_app: Hono,\n\t\t_serviceDiscovery: ServiceDiscovery<any, any>,\n\t) {\n\t\t// No-op: Event publishing is now handled per-route in addRoute\n\t\t// This avoids running middleware on every request including 404s\n\t}\n\n\tstatic async fromRoutes<TLogger extends Logger, TServices extends Service[]>(\n\t\troutes: string[],\n\t\tenvParser: EnvironmentParser<{}>,\n\t\tapp = new Hono(),\n\t\t_logger: TLogger,\n\t\tcwd = process.cwd(),\n\t\toptions?: HonoEndpointOptions,\n\t): Promise<Hono> {\n\t\tconst endpoints = await getEndpointsFromRoutes<TServices>(routes, cwd);\n\t\tconst serviceDiscovery =\n\t\t\tServiceDiscovery.getInstance<ServiceRecord<TServices>>(envParser);\n\n\t\tHonoEndpoint.addRoutes(endpoints, serviceDiscovery, app, options);\n\n\t\treturn app;\n\t}\n\n\tstatic addRoutes<\n\t\tTServices extends Service[] = [],\n\t\tTLogger extends Logger = Logger,\n\t>(\n\t\tendpoints: Endpoint<string, HttpMethod, any, any, TServices, TLogger>[],\n\t\tserviceDiscovery: ServiceDiscovery<ServiceRecord<TServices>, TLogger>,\n\t\tapp: Hono,\n\t\toptions?: HonoEndpointOptions,\n\t): void {\n\t\t// Add timing middleware (always enabled)\n\t\tapp.use('*', timing());\n\n\t\t// Add logger middleware in development mode\n\n\t\tif (HonoEndpoint.isDev) {\n\t\t\tapp.use('*', honoLogger());\n\t\t}\n\n\t\t// Add docs route if not disabled\n\t\tconst docsPath =\n\t\t\toptions?.docsPath !== false ? options?.docsPath || '/docs' : null;\n\t\tif (docsPath) {\n\t\t\tHonoEndpoint.addDocsRoute(\n\t\t\t\tendpoints,\n\t\t\t\tapp,\n\t\t\t\tdocsPath,\n\t\t\t\toptions?.openApiOptions,\n\t\t\t);\n\t\t}\n\n\t\t// Sort endpoints to ensure static routes come before dynamic ones\n\t\tconst sortedEndpoints = endpoints.sort((a, b) => {\n\t\t\tconst aSegments = a.route.split('/');\n\t\t\tconst bSegments = b.route.split('/');\n\n\t\t\t// Compare each segment\n\t\t\tfor (let i = 0; i < Math.max(aSegments.length, bSegments.length); i++) {\n\t\t\t\tconst aSegment = aSegments[i] || '';\n\t\t\t\tconst bSegment = bSegments[i] || '';\n\n\t\t\t\t// If one is dynamic and the other is not, static comes first\n\t\t\t\tconst aIsDynamic = aSegment.startsWith(':');\n\t\t\t\tconst bIsDynamic = bSegment.startsWith(':');\n\n\t\t\t\tif (!aIsDynamic && bIsDynamic) return -1;\n\t\t\t\tif (aIsDynamic && !bIsDynamic) return 1;\n\n\t\t\t\t// If both are the same type, compare alphabetically\n\t\t\t\tif (aSegment !== bSegment) {\n\t\t\t\t\treturn aSegment.localeCompare(bSegment);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn 0;\n\t\t});\n\n\t\t// Note: Global event middleware removed for performance\n\t\t// Events are now published per-route only for endpoints with events configured\n\t\tfor (const endpoint of sortedEndpoints) {\n\t\t\tHonoEndpoint.addRoute(endpoint, serviceDiscovery, app);\n\t\t}\n\t}\n\n\tstatic addRoute<\n\t\tTRoute extends string,\n\t\tTMethod extends HttpMethod,\n\t\tTInput extends EndpointSchemas = {},\n\t\tTOutSchema extends StandardSchemaV1 | undefined = undefined,\n\t\tTServices extends Service[] = [],\n\t\tTLogger extends Logger = Logger,\n\t\tTSession = unknown,\n\t\tTEventPublisher extends EventPublisher<any> | undefined = undefined,\n\t\tTEventPublisherServiceName extends string = string,\n\t\tTAuditStorage extends AuditStorage | undefined = undefined,\n\t\tTAuditStorageServiceName extends string = string,\n\t\tTAuditAction extends AuditableAction<string, unknown> = AuditableAction<\n\t\t\tstring,\n\t\t\tunknown\n\t\t>,\n\t\tTDatabase = undefined,\n\t\tTDatabaseServiceName extends string = string,\n\t>(\n\t\tendpoint: Endpoint<\n\t\t\tTRoute,\n\t\t\tTMethod,\n\t\t\tTInput,\n\t\t\tTOutSchema,\n\t\t\tTServices,\n\t\t\tTLogger,\n\t\t\tTSession,\n\t\t\tTEventPublisher,\n\t\t\tTEventPublisherServiceName,\n\t\t\tTAuditStorage,\n\t\t\tTAuditStorageServiceName,\n\t\t\tTAuditAction,\n\t\t\tTDatabase,\n\t\t\tTDatabaseServiceName\n\t\t>,\n\t\tserviceDiscovery: ServiceDiscovery<ServiceRecord<TServices>, TLogger>,\n\t\tapp: Hono,\n\t): void {\n\t\tconst { route } = endpoint;\n\t\tconst method = endpoint.method.toLowerCase() as LowerHttpMethod<TMethod>;\n\n\t\t// Analyze endpoint features once at registration time (not per-request)\n\t\tconst features = analyzeEndpointFeatures(endpoint);\n\n\t\t// Build validators array - only add validators for schemas that exist\n\t\tconst validators: any[] = [];\n\n\t\tif (features.hasBodyValidation) {\n\t\t\tvalidators.push(\n\t\t\t\tvalidator('json', (value, c) =>\n\t\t\t\t\tHonoEndpoint.validate(c, value, endpoint.input?.body),\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\n\t\tif (features.hasQueryValidation) {\n\t\t\tvalidators.push(\n\t\t\t\tvalidator('query', (_, c) => {\n\t\t\t\t\tconst parsedQuery = parseHonoQuery(c);\n\t\t\t\t\treturn HonoEndpoint.validate(c, parsedQuery, endpoint.input?.query);\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\n\t\tif (features.hasParamValidation) {\n\t\t\tvalidators.push(\n\t\t\t\tvalidator('param', (params, c) =>\n\t\t\t\t\tHonoEndpoint.validate(c, params, endpoint.input?.params),\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\n\t\t// Main handler\n\t\tconst handler = async (c: Context) => {\n\t\t\t// Request context setup\n\t\t\tconst startTime = Date.now();\n\t\t\tconst requestId = c.req.header('X-Request-ID') ?? crypto.randomUUID();\n\n\t\t\tconst logger = endpoint.logger.child({\n\t\t\t\trequestId,\n\t\t\t\tendpoint: endpoint.fullPath,\n\t\t\t\troute: endpoint.route,\n\t\t\t\thost: c.req.header('host'),\n\t\t\t\tmethod: endpoint.method,\n\t\t\t\tpath: c.req.path,\n\t\t\t}) as TLogger;\n\n\t\t\t// Set response header\n\t\t\tc.header('X-Request-ID', requestId);\n\n\t\t\t// Wrap entire handler in request context for services to access\n\t\t\treturn runWithRequestContext(\n\t\t\t\t{ logger, requestId, startTime },\n\t\t\t\tasync () => {\n\t\t\t\t\ttry {\n\t\t\t\t\t\t// Lazy accessors - no upfront parsing, use native Hono methods\n\t\t\t\t\t\tconst header = createHonoHeaders(c);\n\t\t\t\t\t\tconst cookie = createHonoCookies(c);\n\n\t\t\t\t\t\t// Only register services if endpoint has any\n\t\t\t\t\t\tconst services = features.hasServices\n\t\t\t\t\t\t\t? await serviceDiscovery.register(endpoint.services)\n\t\t\t\t\t\t\t: ({} as ServiceRecord<TServices>);\n\n\t\t\t\t\t\t// Resolve database service only if configured\n\t\t\t\t\t\tconst rawDb = features.hasDatabase\n\t\t\t\t\t\t\t? await serviceDiscovery\n\t\t\t\t\t\t\t\t\t.register([endpoint.databaseService!])\n\t\t\t\t\t\t\t\t\t.then(\n\t\t\t\t\t\t\t\t\t\t(s) =>\n\t\t\t\t\t\t\t\t\t\t\ts[\n\t\t\t\t\t\t\t\t\t\t\t\tendpoint.databaseService?.serviceName as keyof typeof s\n\t\t\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t: undefined;\n\n\t\t\t\t\t\t// Extract session (defaults to empty object)\n\t\t\t\t\t\tconst session = await endpoint.getSession({\n\t\t\t\t\t\t\tservices,\n\t\t\t\t\t\t\tlogger,\n\t\t\t\t\t\t\theader,\n\t\t\t\t\t\t\tcookie,\n\t\t\t\t\t\t\t...(rawDb !== undefined && { db: rawDb }),\n\t\t\t\t\t\t} as any);\n\n\t\t\t\t\t\t// Check authorization (defaults to true)\n\t\t\t\t\t\tconst isAuthorized = await endpoint.authorize({\n\t\t\t\t\t\t\theader,\n\t\t\t\t\t\t\tcookie,\n\t\t\t\t\t\t\tservices,\n\t\t\t\t\t\t\tlogger,\n\t\t\t\t\t\t\tsession,\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tif (!isAuthorized) {\n\t\t\t\t\t\t\tlogger.warn('Unauthorized access attempt');\n\t\t\t\t\t\t\treturn c.json({ error: 'Unauthorized' }, 401);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Check rate limit only if configured\n\t\t\t\t\t\tif (features.hasRateLimit) {\n\t\t\t\t\t\t\tconst rateLimitInfo = await checkRateLimit(endpoint.rateLimit!, {\n\t\t\t\t\t\t\t\theader,\n\t\t\t\t\t\t\t\tservices,\n\t\t\t\t\t\t\t\tlogger,\n\t\t\t\t\t\t\t\tsession,\n\t\t\t\t\t\t\t\tpath: c.req.path,\n\t\t\t\t\t\t\t\tmethod: endpoint.method,\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tconst rateLimitHeaders = getRateLimitHeaders(\n\t\t\t\t\t\t\t\trateLimitInfo,\n\t\t\t\t\t\t\t\tendpoint.rateLimit!,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tfor (const [key, value] of Object.entries(rateLimitHeaders)) {\n\t\t\t\t\t\t\t\tif (value) {\n\t\t\t\t\t\t\t\t\tc.header(key, value);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Create audit context only if audits are configured\n\t\t\t\t\t\tconst auditContext = features.hasAudits\n\t\t\t\t\t\t\t? await createAuditContext(\n\t\t\t\t\t\t\t\t\tendpoint as any,\n\t\t\t\t\t\t\t\t\tserviceDiscovery,\n\t\t\t\t\t\t\t\t\tlogger,\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tsession,\n\t\t\t\t\t\t\t\t\t\theader,\n\t\t\t\t\t\t\t\t\t\tcookie,\n\t\t\t\t\t\t\t\t\t\tservices: services as Record<string, unknown>,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t: undefined;\n\n\t\t\t\t\t\tconst audits = features.hasAudits\n\t\t\t\t\t\t\t? (endpoint.audits as MappedAudit<TAuditAction, TOutSchema>[])\n\t\t\t\t\t\t\t: [];\n\n\t\t\t\t\t\t// Warn if declarative audits are configured but no audit storage\n\t\t\t\t\t\tif (features.hasAudits && !auditContext) {\n\t\t\t\t\t\t\tlogger.warn('No auditor storage service available');\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Extract RLS context only if configured and not bypassed\n\t\t\t\t\t\tconst rlsContext =\n\t\t\t\t\t\t\tfeatures.hasRls && rawDb !== undefined\n\t\t\t\t\t\t\t\t? await endpoint.rlsConfig?.extractor({\n\t\t\t\t\t\t\t\t\t\tservices,\n\t\t\t\t\t\t\t\t\t\tsession: session as TSession,\n\t\t\t\t\t\t\t\t\t\theader,\n\t\t\t\t\t\t\t\t\t\tcookie,\n\t\t\t\t\t\t\t\t\t\tlogger,\n\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t: undefined;\n\n\t\t\t\t\t\t// Execute handler with automatic audit transaction support\n\t\t\t\t\t\tconst result = await executeWithAuditTransaction(\n\t\t\t\t\t\t\tauditContext,\n\t\t\t\t\t\t\tasync (auditor) => {\n\t\t\t\t\t\t\t\tconst sameDatabase =\n\t\t\t\t\t\t\t\t\tauditContext?.storage?.databaseServiceName &&\n\t\t\t\t\t\t\t\t\tauditContext.storage.databaseServiceName ===\n\t\t\t\t\t\t\t\t\t\tendpoint.databaseService?.serviceName;\n\t\t\t\t\t\t\t\tconst baseDb = sameDatabase\n\t\t\t\t\t\t\t\t\t? (auditor?.getTransaction?.() ?? rawDb)\n\t\t\t\t\t\t\t\t\t: rawDb;\n\n\t\t\t\t\t\t\t\tconst executeHandler = async (db: TDatabase | undefined) => {\n\t\t\t\t\t\t\t\t\tconst responseBuilder = new ResponseBuilder();\n\t\t\t\t\t\t\t\t\tconst response = await endpoint.handler(\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\tservices,\n\t\t\t\t\t\t\t\t\t\t\tlogger,\n\t\t\t\t\t\t\t\t\t\t\tbody: features.hasBodyValidation\n\t\t\t\t\t\t\t\t\t\t\t\t? (c.req.valid as any)('json')\n\t\t\t\t\t\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\t\t\t\t\t\t\tquery: features.hasQueryValidation\n\t\t\t\t\t\t\t\t\t\t\t\t? (c.req.valid as any)('query')\n\t\t\t\t\t\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\t\t\t\t\t\t\tparams: features.hasParamValidation\n\t\t\t\t\t\t\t\t\t\t\t\t? (c.req.valid as any)('param')\n\t\t\t\t\t\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\t\t\t\t\t\t\tsession,\n\t\t\t\t\t\t\t\t\t\t\theader,\n\t\t\t\t\t\t\t\t\t\t\tcookie,\n\t\t\t\t\t\t\t\t\t\t\tauditor,\n\t\t\t\t\t\t\t\t\t\t\tdb,\n\t\t\t\t\t\t\t\t\t\t} as unknown as EndpointContext<\n\t\t\t\t\t\t\t\t\t\t\tTInput,\n\t\t\t\t\t\t\t\t\t\t\tTServices,\n\t\t\t\t\t\t\t\t\t\t\tTLogger,\n\t\t\t\t\t\t\t\t\t\t\tTSession,\n\t\t\t\t\t\t\t\t\t\t\tTAuditAction,\n\t\t\t\t\t\t\t\t\t\t\tTDatabase,\n\t\t\t\t\t\t\t\t\t\t\tTAuditStorage\n\t\t\t\t\t\t\t\t\t\t>,\n\t\t\t\t\t\t\t\t\t\tresponseBuilder,\n\t\t\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t\t\tlet data = response;\n\t\t\t\t\t\t\t\t\tlet metadata = responseBuilder.getMetadata();\n\n\t\t\t\t\t\t\t\t\tif (Endpoint.hasMetadata(response)) {\n\t\t\t\t\t\t\t\t\t\tdata = response.data;\n\t\t\t\t\t\t\t\t\t\tmetadata = response.metadata;\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\tconst output = endpoint.outputSchema\n\t\t\t\t\t\t\t\t\t\t? await endpoint.parseOutput(data)\n\t\t\t\t\t\t\t\t\t\t: undefined;\n\n\t\t\t\t\t\t\t\t\treturn { output, metadata, responseBuilder };\n\t\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\t\tif (features.hasRls && rlsContext && baseDb) {\n\t\t\t\t\t\t\t\t\treturn withRlsContext(\n\t\t\t\t\t\t\t\t\t\tbaseDb as any,\n\t\t\t\t\t\t\t\t\t\trlsContext,\n\t\t\t\t\t\t\t\t\t\tasync (trx) => executeHandler(trx as TDatabase),\n\t\t\t\t\t\t\t\t\t\t{ prefix: endpoint.rlsConfig?.prefix },\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\treturn executeHandler(baseDb as TDatabase | undefined);\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tasync (result, auditor) => {\n\t\t\t\t\t\t\t\tif (!audits?.length) return;\n\n\t\t\t\t\t\t\t\tfor (const audit of audits) {\n\t\t\t\t\t\t\t\t\tif (audit.when && !audit.when(result.output as any)) {\n\t\t\t\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tconst payload = audit.payload(result.output as any);\n\t\t\t\t\t\t\t\t\tconst entityId = audit.entityId?.(result.output as any);\n\t\t\t\t\t\t\t\t\tauditor.audit(audit.type as any, payload as any, {\n\t\t\t\t\t\t\t\t\t\ttable: audit.table,\n\t\t\t\t\t\t\t\t\t\tentityId,\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{ db: rawDb },\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tconst { output, metadata } = result;\n\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tlet status = endpoint.status as ContentfulStatusCode;\n\n\t\t\t\t\t\t\tif (metadata.status) {\n\t\t\t\t\t\t\t\tstatus = metadata.status as ContentfulStatusCode;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (metadata.headers) {\n\t\t\t\t\t\t\t\tfor (const [key, value] of Object.entries(metadata.headers)) {\n\t\t\t\t\t\t\t\t\tc.header(key, value);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (metadata.cookies) {\n\t\t\t\t\t\t\t\tfor (const [name, { value, options }] of metadata.cookies) {\n\t\t\t\t\t\t\t\t\tsetCookie(c, name, value, options);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// Only publish events if configured (no global middleware overhead)\n\t\t\t\t\t\t\tif (features.hasEvents && Endpoint.isSuccessStatus(status)) {\n\t\t\t\t\t\t\t\tawait publishConstructEvents<any, any>(\n\t\t\t\t\t\t\t\t\tendpoint as any,\n\t\t\t\t\t\t\t\t\toutput,\n\t\t\t\t\t\t\t\t\tserviceDiscovery,\n\t\t\t\t\t\t\t\t\tlogger,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (HonoEndpoint.isDev) {\n\t\t\t\t\t\t\t\tlogger.info({ status, body: output }, 'Outgoing response');\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// @ts-expect-error\n\t\t\t\t\t\t\treturn c.json(output, status);\n\t\t\t\t\t\t} catch (validationError: any) {\n\t\t\t\t\t\t\tlogger.error(validationError, 'Output validation failed');\n\t\t\t\t\t\t\tconst error = wrapError(\n\t\t\t\t\t\t\t\tvalidationError,\n\t\t\t\t\t\t\t\t422,\n\t\t\t\t\t\t\t\t'Response validation failed',\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tif (HonoEndpoint.isDev) {\n\t\t\t\t\t\t\t\tlogger.info(\n\t\t\t\t\t\t\t\t\t{ status: error.statusCode, body: error },\n\t\t\t\t\t\t\t\t\t'Outgoing response',\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn c.json(error, error.statusCode as ContentfulStatusCode);\n\t\t\t\t\t\t}\n\t\t\t\t\t} catch (e: any) {\n\t\t\t\t\t\tlogger.error(e, 'Error processing endpoint request');\n\t\t\t\t\t\tconst error = wrapError(e, 500, 'Internal Server Error');\n\t\t\t\t\t\tif (HonoEndpoint.isDev) {\n\t\t\t\t\t\t\tlogger.info(\n\t\t\t\t\t\t\t\t{ status: error.statusCode, body: error },\n\t\t\t\t\t\t\t\t'Outgoing response',\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn c.json(error, error.statusCode as ContentfulStatusCode);\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t);\n\t\t};\n\n\t\t// Register route with conditional validators\n\t\tapp[method](route, ...validators, handler);\n\t}\n\n\tstatic addDocsRoute<\n\t\tTServices extends Service[] = [],\n\t\tTLogger extends Logger = Logger,\n\t>(\n\t\tendpoints: Endpoint<string, HttpMethod, any, any, TServices, TLogger>[],\n\t\tapp: Hono,\n\t\tdocsPath: string,\n\t\topenApiOptions?: HonoEndpointOptions['openApiOptions'],\n\t): void {\n\t\tapp.get(docsPath, async (c) => {\n\t\t\ttry {\n\t\t\t\tconst openApiSchema = await Endpoint.buildOpenApiSchema(\n\t\t\t\t\tendpoints,\n\t\t\t\t\topenApiOptions,\n\t\t\t\t);\n\n\t\t\t\treturn c.json(openApiSchema);\n\t\t\t} catch {\n\t\t\t\treturn c.json(\n\t\t\t\t\t{ error: 'Failed to generate OpenAPI documentation' },\n\t\t\t\t\t500,\n\t\t\t\t);\n\t\t\t}\n\t\t});\n\t}\n}\n"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { HttpMethod } from "./types-B5H3piDg.cjs";
|
|
2
|
-
import { Endpoint, EndpointSchemas } from "./Endpoint-
|
|
2
|
+
import { Endpoint, EndpointSchemas } from "./Endpoint-BlcHiGNx.cjs";
|
|
3
3
|
import { AuditStorage, AuditableAction } from "@geekmidas/audit";
|
|
4
4
|
import { EventPublisher } from "@geekmidas/events";
|
|
5
5
|
import { Logger } from "@geekmidas/logger";
|
|
@@ -47,4 +47,4 @@ declare class HonoEndpoint<TRoute extends string, TMethod extends HttpMethod, TI
|
|
|
47
47
|
|
|
48
48
|
//#endregion
|
|
49
49
|
export { HonoEndpoint, HonoEndpointOptions };
|
|
50
|
-
//# sourceMappingURL=HonoEndpointAdaptor-
|
|
50
|
+
//# sourceMappingURL=HonoEndpointAdaptor-hrrvyfw9.d.cts.map
|
package/dist/{HonoEndpointAdaptor-HukjdF6M.d.mts.map → HonoEndpointAdaptor-hrrvyfw9.d.cts.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HonoEndpointAdaptor-
|
|
1
|
+
{"version":3,"file":"HonoEndpointAdaptor-hrrvyfw9.d.cts","names":[],"sources":["../src/endpoints/HonoEndpointAdaptor.ts"],"sourcesContent":[],"mappings":"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"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
const require_chunk = require('./chunk-CUT6urMc.cjs');
|
|
2
2
|
const require_publisher = require('./publisher-lFQleddL.cjs');
|
|
3
|
-
const require_Endpoint = require('./Endpoint-
|
|
3
|
+
const require_Endpoint = require('./Endpoint-BCWVbi8l.cjs');
|
|
4
4
|
const require_processAudits = require('./processAudits-CzHkPokQ.cjs');
|
|
5
|
-
const require_helpers = require('./helpers-
|
|
5
|
+
const require_helpers = require('./helpers-QMdfdnvU.cjs');
|
|
6
6
|
const require_lazyAccessors = require('./lazyAccessors-B8Hhras9.cjs');
|
|
7
7
|
const require_parseHonoQuery = require('./parseHonoQuery-D4MhxTRc.cjs');
|
|
8
8
|
const __geekmidas_db_rls = require_chunk.__toESM(require("@geekmidas/db/rls"));
|
|
@@ -254,4 +254,4 @@ Object.defineProperty(exports, 'HonoEndpoint', {
|
|
|
254
254
|
return HonoEndpoint;
|
|
255
255
|
}
|
|
256
256
|
});
|
|
257
|
-
//# sourceMappingURL=HonoEndpointAdaptor-
|
|
257
|
+
//# sourceMappingURL=HonoEndpointAdaptor-xGnDZa3a.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HonoEndpointAdaptor-DiQH0eTb.cjs","names":["endpoint: Endpoint<\n\t\tany,\n\t\tany,\n\t\tany,\n\t\tany,\n\t\tany,\n\t\tany,\n\t\tany,\n\t\tany,\n\t\tany,\n\t\tany,\n\t\tany,\n\t\tany,\n\t\tany,\n\t\tany\n\t>","endpoint: Endpoint<\n\t\t\tTRoute,\n\t\t\tTMethod,\n\t\t\tTInput,\n\t\t\tTOutSchema,\n\t\t\tTServices,\n\t\t\tTLogger,\n\t\t\tTSession,\n\t\t\tTEventPublisher,\n\t\t\tTEventPublisherServiceName,\n\t\t\tTAuditStorage,\n\t\t\tTAuditStorageServiceName,\n\t\t\tTAuditAction,\n\t\t\tTDatabase,\n\t\t\tTDatabaseServiceName\n\t\t>","c: Context<any, string, {}>","data: unknown","schema?: T","serviceDiscovery: ServiceDiscovery<ServiceRecord<TServices>, TLogger>","app: Hono","_app: Hono","_serviceDiscovery: ServiceDiscovery<any, any>","routes: string[]","envParser: EnvironmentParser<{}>","Hono","_logger: TLogger","options?: HonoEndpointOptions","endpoints: Endpoint<string, HttpMethod, any, any, TServices, TLogger>[]","validators: any[]","c: Context","db: TDatabase | undefined","ResponseBuilder","metadata","output","result","validationError: any","e: any","docsPath: string","openApiOptions?: HonoEndpointOptions['openApiOptions']"],"sources":["../src/endpoints/HonoEndpointAdaptor.ts"],"sourcesContent":["import type { AuditableAction, AuditStorage } from '@geekmidas/audit';\nimport { withRlsContext } from '@geekmidas/db/rls';\nimport type { EnvironmentParser } from '@geekmidas/envkit';\nimport { wrapError } from '@geekmidas/errors';\nimport type { EventPublisher } from '@geekmidas/events';\nimport type { Logger } from '@geekmidas/logger';\nimport { checkRateLimit, getRateLimitHeaders } from '@geekmidas/rate-limit';\nimport {\n\trunWithRequestContext,\n\ttype Service,\n\tServiceDiscovery,\n\ttype ServiceRecord,\n} from '@geekmidas/services';\nimport type { StandardSchemaV1 } from '@standard-schema/spec';\nimport { type Context, Hono } from 'hono';\nimport { setCookie } from 'hono/cookie';\nimport { logger as honoLogger } from 'hono/logger';\nimport { timing } from 'hono/timing';\nimport type { ContentfulStatusCode } from 'hono/utils/http-status';\nimport { validator } from 'hono/validator';\nimport { publishConstructEvents } from '../publisher';\nimport type { HttpMethod, LowerHttpMethod } from '../types';\nimport type { MappedAudit } from './audit';\nimport {\n\tEndpoint,\n\ttype EndpointContext,\n\ttype EndpointSchemas,\n\tResponseBuilder,\n} from './Endpoint';\nimport { getEndpointsFromRoutes } from './helpers';\nimport { createHonoCookies, createHonoHeaders } from './lazyAccessors';\nimport { parseHonoQuery } from './parseHonoQuery';\nimport {\n\tcreateAuditContext,\n\texecuteWithAuditTransaction,\n} from './processAudits';\n\nexport interface HonoEndpointOptions {\n\t/**\n\t * Path where OpenAPI documentation will be served.\n\t * Set to false to disable docs route.\n\t * @default '/docs'\n\t */\n\tdocsPath?: string | false;\n\t/**\n\t * OpenAPI schema options\n\t */\n\topenApiOptions?: {\n\t\ttitle?: string;\n\t\tversion?: string;\n\t\tdescription?: string;\n\t};\n}\n\n/**\n * Feature flags for an endpoint, analyzed once at route registration time.\n * This avoids per-request feature detection overhead.\n */\ninterface EndpointFeatures {\n\thasServices: boolean;\n\thasDatabase: boolean;\n\thasBodyValidation: boolean;\n\thasQueryValidation: boolean;\n\thasParamValidation: boolean;\n\thasAudits: boolean;\n\thasEvents: boolean;\n\thasRateLimit: boolean;\n\thasRls: boolean;\n}\n\n/**\n * Analyze endpoint features at registration time (not per-request)\n */\nfunction analyzeEndpointFeatures(\n\tendpoint: Endpoint<\n\t\tany,\n\t\tany,\n\t\tany,\n\t\tany,\n\t\tany,\n\t\tany,\n\t\tany,\n\t\tany,\n\t\tany,\n\t\tany,\n\t\tany,\n\t\tany,\n\t\tany,\n\t\tany\n\t>,\n): EndpointFeatures {\n\treturn {\n\t\thasServices: endpoint.services.length > 0,\n\t\thasDatabase: !!endpoint.databaseService,\n\t\thasBodyValidation: !!endpoint.input?.body,\n\t\thasQueryValidation: !!endpoint.input?.query,\n\t\thasParamValidation: !!endpoint.input?.params,\n\t\t// Audit context needed if declarative audits OR auditor storage service configured (for manual audits)\n\t\thasAudits:\n\t\t\t(endpoint.audits?.length ?? 0) > 0 || !!endpoint.auditorStorageService,\n\t\thasEvents: (endpoint.events?.length ?? 0) > 0,\n\t\thasRateLimit: !!endpoint.rateLimit,\n\t\thasRls: !!endpoint.rlsConfig && !endpoint.rlsBypass,\n\t};\n}\n\nexport class HonoEndpoint<\n\tTRoute extends string,\n\tTMethod extends HttpMethod,\n\tTInput extends EndpointSchemas = {},\n\tTOutSchema extends StandardSchemaV1 | undefined = undefined,\n\tTServices extends Service[] = [],\n\tTLogger extends Logger = Logger,\n\tTSession = unknown,\n\tTEventPublisher extends EventPublisher<any> | undefined = undefined,\n\tTEventPublisherServiceName extends string = string,\n\tTAuditStorage extends AuditStorage | undefined = undefined,\n\tTAuditStorageServiceName extends string = string,\n\tTAuditAction extends AuditableAction<string, unknown> = AuditableAction<\n\t\tstring,\n\t\tunknown\n\t>,\n\tTDatabase = undefined,\n\tTDatabaseServiceName extends string = string,\n> {\n\tconstructor(\n\t\tprivate readonly endpoint: Endpoint<\n\t\t\tTRoute,\n\t\t\tTMethod,\n\t\t\tTInput,\n\t\t\tTOutSchema,\n\t\t\tTServices,\n\t\t\tTLogger,\n\t\t\tTSession,\n\t\t\tTEventPublisher,\n\t\t\tTEventPublisherServiceName,\n\t\t\tTAuditStorage,\n\t\t\tTAuditStorageServiceName,\n\t\t\tTAuditAction,\n\t\t\tTDatabase,\n\t\t\tTDatabaseServiceName\n\t\t>,\n\t) {}\n\n\tstatic isDev = process.env.NODE_ENV === 'development';\n\n\tstatic async validate<T extends StandardSchemaV1>(\n\t\tc: Context<any, string, {}>,\n\t\tdata: unknown,\n\t\tschema?: T,\n\t) {\n\t\tif (!schema) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst parsed = await Endpoint.validate(schema, data);\n\n\t\tif (parsed.issues) {\n\t\t\treturn c.json(parsed.issues, 422);\n\t\t}\n\n\t\treturn parsed.value;\n\t}\n\taddRoute(\n\t\tserviceDiscovery: ServiceDiscovery<ServiceRecord<TServices>, TLogger>,\n\t\tapp: Hono,\n\t): void {\n\t\tHonoEndpoint.addRoute(this.endpoint, serviceDiscovery, app);\n\t}\n\n\t/**\n\t * @deprecated Global event middleware is no longer used.\n\t * Events are now published per-route only for endpoints that have events configured.\n\t * This method is kept for backward compatibility but does nothing.\n\t */\n\tstatic applyEventMiddleware(\n\t\t_app: Hono,\n\t\t_serviceDiscovery: ServiceDiscovery<any, any>,\n\t) {\n\t\t// No-op: Event publishing is now handled per-route in addRoute\n\t\t// This avoids running middleware on every request including 404s\n\t}\n\n\tstatic async fromRoutes<TLogger extends Logger, TServices extends Service[]>(\n\t\troutes: string[],\n\t\tenvParser: EnvironmentParser<{}>,\n\t\tapp = new Hono(),\n\t\t_logger: TLogger,\n\t\tcwd = process.cwd(),\n\t\toptions?: HonoEndpointOptions,\n\t): Promise<Hono> {\n\t\tconst endpoints = await getEndpointsFromRoutes<TServices>(routes, cwd);\n\t\tconst serviceDiscovery =\n\t\t\tServiceDiscovery.getInstance<ServiceRecord<TServices>>(envParser);\n\n\t\tHonoEndpoint.addRoutes(endpoints, serviceDiscovery, app, options);\n\n\t\treturn app;\n\t}\n\n\tstatic addRoutes<\n\t\tTServices extends Service[] = [],\n\t\tTLogger extends Logger = Logger,\n\t>(\n\t\tendpoints: Endpoint<string, HttpMethod, any, any, TServices, TLogger>[],\n\t\tserviceDiscovery: ServiceDiscovery<ServiceRecord<TServices>, TLogger>,\n\t\tapp: Hono,\n\t\toptions?: HonoEndpointOptions,\n\t): void {\n\t\t// Add timing middleware (always enabled)\n\t\tapp.use('*', timing());\n\n\t\t// Add logger middleware in development mode\n\n\t\tif (HonoEndpoint.isDev) {\n\t\t\tapp.use('*', honoLogger());\n\t\t}\n\n\t\t// Add docs route if not disabled\n\t\tconst docsPath =\n\t\t\toptions?.docsPath !== false ? options?.docsPath || '/docs' : null;\n\t\tif (docsPath) {\n\t\t\tHonoEndpoint.addDocsRoute(\n\t\t\t\tendpoints,\n\t\t\t\tapp,\n\t\t\t\tdocsPath,\n\t\t\t\toptions?.openApiOptions,\n\t\t\t);\n\t\t}\n\n\t\t// Sort endpoints to ensure static routes come before dynamic ones\n\t\tconst sortedEndpoints = endpoints.sort((a, b) => {\n\t\t\tconst aSegments = a.route.split('/');\n\t\t\tconst bSegments = b.route.split('/');\n\n\t\t\t// Compare each segment\n\t\t\tfor (let i = 0; i < Math.max(aSegments.length, bSegments.length); i++) {\n\t\t\t\tconst aSegment = aSegments[i] || '';\n\t\t\t\tconst bSegment = bSegments[i] || '';\n\n\t\t\t\t// If one is dynamic and the other is not, static comes first\n\t\t\t\tconst aIsDynamic = aSegment.startsWith(':');\n\t\t\t\tconst bIsDynamic = bSegment.startsWith(':');\n\n\t\t\t\tif (!aIsDynamic && bIsDynamic) return -1;\n\t\t\t\tif (aIsDynamic && !bIsDynamic) return 1;\n\n\t\t\t\t// If both are the same type, compare alphabetically\n\t\t\t\tif (aSegment !== bSegment) {\n\t\t\t\t\treturn aSegment.localeCompare(bSegment);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn 0;\n\t\t});\n\n\t\t// Note: Global event middleware removed for performance\n\t\t// Events are now published per-route only for endpoints with events configured\n\t\tfor (const endpoint of sortedEndpoints) {\n\t\t\tHonoEndpoint.addRoute(endpoint, serviceDiscovery, app);\n\t\t}\n\t}\n\n\tstatic addRoute<\n\t\tTRoute extends string,\n\t\tTMethod extends HttpMethod,\n\t\tTInput extends EndpointSchemas = {},\n\t\tTOutSchema extends StandardSchemaV1 | undefined = undefined,\n\t\tTServices extends Service[] = [],\n\t\tTLogger extends Logger = Logger,\n\t\tTSession = unknown,\n\t\tTEventPublisher extends EventPublisher<any> | undefined = undefined,\n\t\tTEventPublisherServiceName extends string = string,\n\t\tTAuditStorage extends AuditStorage | undefined = undefined,\n\t\tTAuditStorageServiceName extends string = string,\n\t\tTAuditAction extends AuditableAction<string, unknown> = AuditableAction<\n\t\t\tstring,\n\t\t\tunknown\n\t\t>,\n\t\tTDatabase = undefined,\n\t\tTDatabaseServiceName extends string = string,\n\t>(\n\t\tendpoint: Endpoint<\n\t\t\tTRoute,\n\t\t\tTMethod,\n\t\t\tTInput,\n\t\t\tTOutSchema,\n\t\t\tTServices,\n\t\t\tTLogger,\n\t\t\tTSession,\n\t\t\tTEventPublisher,\n\t\t\tTEventPublisherServiceName,\n\t\t\tTAuditStorage,\n\t\t\tTAuditStorageServiceName,\n\t\t\tTAuditAction,\n\t\t\tTDatabase,\n\t\t\tTDatabaseServiceName\n\t\t>,\n\t\tserviceDiscovery: ServiceDiscovery<ServiceRecord<TServices>, TLogger>,\n\t\tapp: Hono,\n\t): void {\n\t\tconst { route } = endpoint;\n\t\tconst method = endpoint.method.toLowerCase() as LowerHttpMethod<TMethod>;\n\n\t\t// Analyze endpoint features once at registration time (not per-request)\n\t\tconst features = analyzeEndpointFeatures(endpoint);\n\n\t\t// Build validators array - only add validators for schemas that exist\n\t\tconst validators: any[] = [];\n\n\t\tif (features.hasBodyValidation) {\n\t\t\tvalidators.push(\n\t\t\t\tvalidator('json', (value, c) =>\n\t\t\t\t\tHonoEndpoint.validate(c, value, endpoint.input?.body),\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\n\t\tif (features.hasQueryValidation) {\n\t\t\tvalidators.push(\n\t\t\t\tvalidator('query', (_, c) => {\n\t\t\t\t\tconst parsedQuery = parseHonoQuery(c);\n\t\t\t\t\treturn HonoEndpoint.validate(c, parsedQuery, endpoint.input?.query);\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\n\t\tif (features.hasParamValidation) {\n\t\t\tvalidators.push(\n\t\t\t\tvalidator('param', (params, c) =>\n\t\t\t\t\tHonoEndpoint.validate(c, params, endpoint.input?.params),\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\n\t\t// Main handler\n\t\tconst handler = async (c: Context) => {\n\t\t\t// Request context setup\n\t\t\tconst startTime = Date.now();\n\t\t\tconst requestId = c.req.header('X-Request-ID') ?? crypto.randomUUID();\n\n\t\t\tconst logger = endpoint.logger.child({\n\t\t\t\trequestId,\n\t\t\t\tendpoint: endpoint.fullPath,\n\t\t\t\troute: endpoint.route,\n\t\t\t\thost: c.req.header('host'),\n\t\t\t\tmethod: endpoint.method,\n\t\t\t\tpath: c.req.path,\n\t\t\t}) as TLogger;\n\n\t\t\t// Set response header\n\t\t\tc.header('X-Request-ID', requestId);\n\n\t\t\t// Wrap entire handler in request context for services to access\n\t\t\treturn runWithRequestContext(\n\t\t\t\t{ logger, requestId, startTime },\n\t\t\t\tasync () => {\n\t\t\t\t\ttry {\n\t\t\t\t\t\t// Lazy accessors - no upfront parsing, use native Hono methods\n\t\t\t\t\t\tconst header = createHonoHeaders(c);\n\t\t\t\t\t\tconst cookie = createHonoCookies(c);\n\n\t\t\t\t\t\t// Only register services if endpoint has any\n\t\t\t\t\t\tconst services = features.hasServices\n\t\t\t\t\t\t\t? await serviceDiscovery.register(endpoint.services)\n\t\t\t\t\t\t\t: ({} as ServiceRecord<TServices>);\n\n\t\t\t\t\t\t// Resolve database service only if configured\n\t\t\t\t\t\tconst rawDb = features.hasDatabase\n\t\t\t\t\t\t\t? await serviceDiscovery\n\t\t\t\t\t\t\t\t\t.register([endpoint.databaseService!])\n\t\t\t\t\t\t\t\t\t.then(\n\t\t\t\t\t\t\t\t\t\t(s) =>\n\t\t\t\t\t\t\t\t\t\t\ts[\n\t\t\t\t\t\t\t\t\t\t\t\tendpoint.databaseService?.serviceName as keyof typeof s\n\t\t\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t: undefined;\n\n\t\t\t\t\t\t// Extract session (defaults to empty object)\n\t\t\t\t\t\tconst session = await endpoint.getSession({\n\t\t\t\t\t\t\tservices,\n\t\t\t\t\t\t\tlogger,\n\t\t\t\t\t\t\theader,\n\t\t\t\t\t\t\tcookie,\n\t\t\t\t\t\t\t...(rawDb !== undefined && { db: rawDb }),\n\t\t\t\t\t\t} as any);\n\n\t\t\t\t\t\t// Check authorization (defaults to true)\n\t\t\t\t\t\tconst isAuthorized = await endpoint.authorize({\n\t\t\t\t\t\t\theader,\n\t\t\t\t\t\t\tcookie,\n\t\t\t\t\t\t\tservices,\n\t\t\t\t\t\t\tlogger,\n\t\t\t\t\t\t\tsession,\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tif (!isAuthorized) {\n\t\t\t\t\t\t\tlogger.warn('Unauthorized access attempt');\n\t\t\t\t\t\t\treturn c.json({ error: 'Unauthorized' }, 401);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Check rate limit only if configured\n\t\t\t\t\t\tif (features.hasRateLimit) {\n\t\t\t\t\t\t\tconst rateLimitInfo = await checkRateLimit(endpoint.rateLimit!, {\n\t\t\t\t\t\t\t\theader,\n\t\t\t\t\t\t\t\tservices,\n\t\t\t\t\t\t\t\tlogger,\n\t\t\t\t\t\t\t\tsession,\n\t\t\t\t\t\t\t\tpath: c.req.path,\n\t\t\t\t\t\t\t\tmethod: endpoint.method,\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tconst rateLimitHeaders = getRateLimitHeaders(\n\t\t\t\t\t\t\t\trateLimitInfo,\n\t\t\t\t\t\t\t\tendpoint.rateLimit!,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tfor (const [key, value] of Object.entries(rateLimitHeaders)) {\n\t\t\t\t\t\t\t\tif (value) {\n\t\t\t\t\t\t\t\t\tc.header(key, value);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Create audit context only if audits are configured\n\t\t\t\t\t\tconst auditContext = features.hasAudits\n\t\t\t\t\t\t\t? await createAuditContext(\n\t\t\t\t\t\t\t\t\tendpoint as any,\n\t\t\t\t\t\t\t\t\tserviceDiscovery,\n\t\t\t\t\t\t\t\t\tlogger,\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tsession,\n\t\t\t\t\t\t\t\t\t\theader,\n\t\t\t\t\t\t\t\t\t\tcookie,\n\t\t\t\t\t\t\t\t\t\tservices: services as Record<string, unknown>,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t: undefined;\n\n\t\t\t\t\t\tconst audits = features.hasAudits\n\t\t\t\t\t\t\t? (endpoint.audits as MappedAudit<TAuditAction, TOutSchema>[])\n\t\t\t\t\t\t\t: [];\n\n\t\t\t\t\t\t// Warn if declarative audits are configured but no audit storage\n\t\t\t\t\t\tif (features.hasAudits && !auditContext) {\n\t\t\t\t\t\t\tlogger.warn('No auditor storage service available');\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Extract RLS context only if configured and not bypassed\n\t\t\t\t\t\tconst rlsContext =\n\t\t\t\t\t\t\tfeatures.hasRls && rawDb !== undefined\n\t\t\t\t\t\t\t\t? await endpoint.rlsConfig?.extractor({\n\t\t\t\t\t\t\t\t\t\tservices,\n\t\t\t\t\t\t\t\t\t\tsession: session as TSession,\n\t\t\t\t\t\t\t\t\t\theader,\n\t\t\t\t\t\t\t\t\t\tcookie,\n\t\t\t\t\t\t\t\t\t\tlogger,\n\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t: undefined;\n\n\t\t\t\t\t\t// Execute handler with automatic audit transaction support\n\t\t\t\t\t\tconst result = await executeWithAuditTransaction(\n\t\t\t\t\t\t\tauditContext,\n\t\t\t\t\t\t\tasync (auditor) => {\n\t\t\t\t\t\t\t\tconst sameDatabase =\n\t\t\t\t\t\t\t\t\tauditContext?.storage?.databaseServiceName &&\n\t\t\t\t\t\t\t\t\tauditContext.storage.databaseServiceName ===\n\t\t\t\t\t\t\t\t\t\tendpoint.databaseService?.serviceName;\n\t\t\t\t\t\t\t\tconst baseDb = sameDatabase\n\t\t\t\t\t\t\t\t\t? (auditor?.getTransaction?.() ?? rawDb)\n\t\t\t\t\t\t\t\t\t: rawDb;\n\n\t\t\t\t\t\t\t\tconst executeHandler = async (db: TDatabase | undefined) => {\n\t\t\t\t\t\t\t\t\tconst responseBuilder = new ResponseBuilder();\n\t\t\t\t\t\t\t\t\tconst response = await endpoint.handler(\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\tservices,\n\t\t\t\t\t\t\t\t\t\t\tlogger,\n\t\t\t\t\t\t\t\t\t\t\tbody: features.hasBodyValidation\n\t\t\t\t\t\t\t\t\t\t\t\t? (c.req.valid as any)('json')\n\t\t\t\t\t\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\t\t\t\t\t\t\tquery: features.hasQueryValidation\n\t\t\t\t\t\t\t\t\t\t\t\t? (c.req.valid as any)('query')\n\t\t\t\t\t\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\t\t\t\t\t\t\tparams: features.hasParamValidation\n\t\t\t\t\t\t\t\t\t\t\t\t? (c.req.valid as any)('param')\n\t\t\t\t\t\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\t\t\t\t\t\t\tsession,\n\t\t\t\t\t\t\t\t\t\t\theader,\n\t\t\t\t\t\t\t\t\t\t\tcookie,\n\t\t\t\t\t\t\t\t\t\t\tauditor,\n\t\t\t\t\t\t\t\t\t\t\tdb,\n\t\t\t\t\t\t\t\t\t\t} as unknown as EndpointContext<\n\t\t\t\t\t\t\t\t\t\t\tTInput,\n\t\t\t\t\t\t\t\t\t\t\tTServices,\n\t\t\t\t\t\t\t\t\t\t\tTLogger,\n\t\t\t\t\t\t\t\t\t\t\tTSession,\n\t\t\t\t\t\t\t\t\t\t\tTAuditAction,\n\t\t\t\t\t\t\t\t\t\t\tTDatabase,\n\t\t\t\t\t\t\t\t\t\t\tTAuditStorage\n\t\t\t\t\t\t\t\t\t\t>,\n\t\t\t\t\t\t\t\t\t\tresponseBuilder,\n\t\t\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t\t\tlet data = response;\n\t\t\t\t\t\t\t\t\tlet metadata = responseBuilder.getMetadata();\n\n\t\t\t\t\t\t\t\t\tif (Endpoint.hasMetadata(response)) {\n\t\t\t\t\t\t\t\t\t\tdata = response.data;\n\t\t\t\t\t\t\t\t\t\tmetadata = response.metadata;\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\tconst output = endpoint.outputSchema\n\t\t\t\t\t\t\t\t\t\t? await endpoint.parseOutput(data)\n\t\t\t\t\t\t\t\t\t\t: undefined;\n\n\t\t\t\t\t\t\t\t\treturn { output, metadata, responseBuilder };\n\t\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\t\tif (features.hasRls && rlsContext && baseDb) {\n\t\t\t\t\t\t\t\t\treturn withRlsContext(\n\t\t\t\t\t\t\t\t\t\tbaseDb as any,\n\t\t\t\t\t\t\t\t\t\trlsContext,\n\t\t\t\t\t\t\t\t\t\tasync (trx) => executeHandler(trx as TDatabase),\n\t\t\t\t\t\t\t\t\t\t{ prefix: endpoint.rlsConfig?.prefix },\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\treturn executeHandler(baseDb as TDatabase | undefined);\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tasync (result, auditor) => {\n\t\t\t\t\t\t\t\tif (!audits?.length) return;\n\n\t\t\t\t\t\t\t\tfor (const audit of audits) {\n\t\t\t\t\t\t\t\t\tif (audit.when && !audit.when(result.output as any)) {\n\t\t\t\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tconst payload = audit.payload(result.output as any);\n\t\t\t\t\t\t\t\t\tconst entityId = audit.entityId?.(result.output as any);\n\t\t\t\t\t\t\t\t\tauditor.audit(audit.type as any, payload as any, {\n\t\t\t\t\t\t\t\t\t\ttable: audit.table,\n\t\t\t\t\t\t\t\t\t\tentityId,\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{ db: rawDb },\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tconst { output, metadata } = result;\n\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tlet status = endpoint.status as ContentfulStatusCode;\n\n\t\t\t\t\t\t\tif (metadata.status) {\n\t\t\t\t\t\t\t\tstatus = metadata.status as ContentfulStatusCode;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (metadata.headers) {\n\t\t\t\t\t\t\t\tfor (const [key, value] of Object.entries(metadata.headers)) {\n\t\t\t\t\t\t\t\t\tc.header(key, value);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (metadata.cookies) {\n\t\t\t\t\t\t\t\tfor (const [name, { value, options }] of metadata.cookies) {\n\t\t\t\t\t\t\t\t\tsetCookie(c, name, value, options);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// Only publish events if configured (no global middleware overhead)\n\t\t\t\t\t\t\tif (features.hasEvents && Endpoint.isSuccessStatus(status)) {\n\t\t\t\t\t\t\t\tawait publishConstructEvents<any, any>(\n\t\t\t\t\t\t\t\t\tendpoint as any,\n\t\t\t\t\t\t\t\t\toutput,\n\t\t\t\t\t\t\t\t\tserviceDiscovery,\n\t\t\t\t\t\t\t\t\tlogger,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (HonoEndpoint.isDev) {\n\t\t\t\t\t\t\t\tlogger.info({ status, body: output }, 'Outgoing response');\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// @ts-expect-error\n\t\t\t\t\t\t\treturn c.json(output, status);\n\t\t\t\t\t\t} catch (validationError: any) {\n\t\t\t\t\t\t\tlogger.error(validationError, 'Output validation failed');\n\t\t\t\t\t\t\tconst error = wrapError(\n\t\t\t\t\t\t\t\tvalidationError,\n\t\t\t\t\t\t\t\t422,\n\t\t\t\t\t\t\t\t'Response validation failed',\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tif (HonoEndpoint.isDev) {\n\t\t\t\t\t\t\t\tlogger.info(\n\t\t\t\t\t\t\t\t\t{ status: error.statusCode, body: error },\n\t\t\t\t\t\t\t\t\t'Outgoing response',\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn c.json(error, error.statusCode as ContentfulStatusCode);\n\t\t\t\t\t\t}\n\t\t\t\t\t} catch (e: any) {\n\t\t\t\t\t\tlogger.error(e, 'Error processing endpoint request');\n\t\t\t\t\t\tconst error = wrapError(e, 500, 'Internal Server Error');\n\t\t\t\t\t\tif (HonoEndpoint.isDev) {\n\t\t\t\t\t\t\tlogger.info(\n\t\t\t\t\t\t\t\t{ status: error.statusCode, body: error },\n\t\t\t\t\t\t\t\t'Outgoing response',\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn c.json(error, error.statusCode as ContentfulStatusCode);\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t);\n\t\t};\n\n\t\t// Register route with conditional validators\n\t\tapp[method](route, ...validators, handler);\n\t}\n\n\tstatic addDocsRoute<\n\t\tTServices extends Service[] = [],\n\t\tTLogger extends Logger = Logger,\n\t>(\n\t\tendpoints: Endpoint<string, HttpMethod, any, any, TServices, TLogger>[],\n\t\tapp: Hono,\n\t\tdocsPath: string,\n\t\topenApiOptions?: HonoEndpointOptions['openApiOptions'],\n\t): void {\n\t\tapp.get(docsPath, async (c) => {\n\t\t\ttry {\n\t\t\t\tconst openApiSchema = await Endpoint.buildOpenApiSchema(\n\t\t\t\t\tendpoints,\n\t\t\t\t\topenApiOptions,\n\t\t\t\t);\n\n\t\t\t\treturn c.json(openApiSchema);\n\t\t\t} catch {\n\t\t\t\treturn c.json(\n\t\t\t\t\t{ error: 'Failed to generate OpenAPI documentation' },\n\t\t\t\t\t500,\n\t\t\t\t);\n\t\t\t}\n\t\t});\n\t}\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"HonoEndpointAdaptor-xGnDZa3a.cjs","names":["endpoint: Endpoint<\n\t\tany,\n\t\tany,\n\t\tany,\n\t\tany,\n\t\tany,\n\t\tany,\n\t\tany,\n\t\tany,\n\t\tany,\n\t\tany,\n\t\tany,\n\t\tany,\n\t\tany,\n\t\tany\n\t>","endpoint: Endpoint<\n\t\t\tTRoute,\n\t\t\tTMethod,\n\t\t\tTInput,\n\t\t\tTOutSchema,\n\t\t\tTServices,\n\t\t\tTLogger,\n\t\t\tTSession,\n\t\t\tTEventPublisher,\n\t\t\tTEventPublisherServiceName,\n\t\t\tTAuditStorage,\n\t\t\tTAuditStorageServiceName,\n\t\t\tTAuditAction,\n\t\t\tTDatabase,\n\t\t\tTDatabaseServiceName\n\t\t>","c: Context<any, string, {}>","data: unknown","schema?: T","serviceDiscovery: ServiceDiscovery<ServiceRecord<TServices>, TLogger>","app: Hono","_app: Hono","_serviceDiscovery: ServiceDiscovery<any, any>","routes: string[]","envParser: EnvironmentParser<{}>","Hono","_logger: TLogger","options?: HonoEndpointOptions","endpoints: Endpoint<string, HttpMethod, any, any, TServices, TLogger>[]","validators: any[]","c: Context","db: TDatabase | undefined","ResponseBuilder","metadata","output","result","validationError: any","e: any","docsPath: string","openApiOptions?: HonoEndpointOptions['openApiOptions']"],"sources":["../src/endpoints/HonoEndpointAdaptor.ts"],"sourcesContent":["import type { AuditableAction, AuditStorage } from '@geekmidas/audit';\nimport { withRlsContext } from '@geekmidas/db/rls';\nimport type { EnvironmentParser } from '@geekmidas/envkit';\nimport { wrapError } from '@geekmidas/errors';\nimport type { EventPublisher } from '@geekmidas/events';\nimport type { Logger } from '@geekmidas/logger';\nimport { checkRateLimit, getRateLimitHeaders } from '@geekmidas/rate-limit';\nimport {\n\trunWithRequestContext,\n\ttype Service,\n\tServiceDiscovery,\n\ttype ServiceRecord,\n} from '@geekmidas/services';\nimport type { StandardSchemaV1 } from '@standard-schema/spec';\nimport { type Context, Hono } from 'hono';\nimport { setCookie } from 'hono/cookie';\nimport { logger as honoLogger } from 'hono/logger';\nimport { timing } from 'hono/timing';\nimport type { ContentfulStatusCode } from 'hono/utils/http-status';\nimport { validator } from 'hono/validator';\nimport { publishConstructEvents } from '../publisher';\nimport type { HttpMethod, LowerHttpMethod } from '../types';\nimport type { MappedAudit } from './audit';\nimport {\n\tEndpoint,\n\ttype EndpointContext,\n\ttype EndpointSchemas,\n\tResponseBuilder,\n} from './Endpoint';\nimport { getEndpointsFromRoutes } from './helpers';\nimport { createHonoCookies, createHonoHeaders } from './lazyAccessors';\nimport { parseHonoQuery } from './parseHonoQuery';\nimport {\n\tcreateAuditContext,\n\texecuteWithAuditTransaction,\n} from './processAudits';\n\nexport interface HonoEndpointOptions {\n\t/**\n\t * Path where OpenAPI documentation will be served.\n\t * Set to false to disable docs route.\n\t * @default '/docs'\n\t */\n\tdocsPath?: string | false;\n\t/**\n\t * OpenAPI schema options\n\t */\n\topenApiOptions?: {\n\t\ttitle?: string;\n\t\tversion?: string;\n\t\tdescription?: string;\n\t};\n}\n\n/**\n * Feature flags for an endpoint, analyzed once at route registration time.\n * This avoids per-request feature detection overhead.\n */\ninterface EndpointFeatures {\n\thasServices: boolean;\n\thasDatabase: boolean;\n\thasBodyValidation: boolean;\n\thasQueryValidation: boolean;\n\thasParamValidation: boolean;\n\thasAudits: boolean;\n\thasEvents: boolean;\n\thasRateLimit: boolean;\n\thasRls: boolean;\n}\n\n/**\n * Analyze endpoint features at registration time (not per-request)\n */\nfunction analyzeEndpointFeatures(\n\tendpoint: Endpoint<\n\t\tany,\n\t\tany,\n\t\tany,\n\t\tany,\n\t\tany,\n\t\tany,\n\t\tany,\n\t\tany,\n\t\tany,\n\t\tany,\n\t\tany,\n\t\tany,\n\t\tany,\n\t\tany\n\t>,\n): EndpointFeatures {\n\treturn {\n\t\thasServices: endpoint.services.length > 0,\n\t\thasDatabase: !!endpoint.databaseService,\n\t\thasBodyValidation: !!endpoint.input?.body,\n\t\thasQueryValidation: !!endpoint.input?.query,\n\t\thasParamValidation: !!endpoint.input?.params,\n\t\t// Audit context needed if declarative audits OR auditor storage service configured (for manual audits)\n\t\thasAudits:\n\t\t\t(endpoint.audits?.length ?? 0) > 0 || !!endpoint.auditorStorageService,\n\t\thasEvents: (endpoint.events?.length ?? 0) > 0,\n\t\thasRateLimit: !!endpoint.rateLimit,\n\t\thasRls: !!endpoint.rlsConfig && !endpoint.rlsBypass,\n\t};\n}\n\nexport class HonoEndpoint<\n\tTRoute extends string,\n\tTMethod extends HttpMethod,\n\tTInput extends EndpointSchemas = {},\n\tTOutSchema extends StandardSchemaV1 | undefined = undefined,\n\tTServices extends Service[] = [],\n\tTLogger extends Logger = Logger,\n\tTSession = unknown,\n\tTEventPublisher extends EventPublisher<any> | undefined = undefined,\n\tTEventPublisherServiceName extends string = string,\n\tTAuditStorage extends AuditStorage | undefined = undefined,\n\tTAuditStorageServiceName extends string = string,\n\tTAuditAction extends AuditableAction<string, unknown> = AuditableAction<\n\t\tstring,\n\t\tunknown\n\t>,\n\tTDatabase = undefined,\n\tTDatabaseServiceName extends string = string,\n> {\n\tconstructor(\n\t\tprivate readonly endpoint: Endpoint<\n\t\t\tTRoute,\n\t\t\tTMethod,\n\t\t\tTInput,\n\t\t\tTOutSchema,\n\t\t\tTServices,\n\t\t\tTLogger,\n\t\t\tTSession,\n\t\t\tTEventPublisher,\n\t\t\tTEventPublisherServiceName,\n\t\t\tTAuditStorage,\n\t\t\tTAuditStorageServiceName,\n\t\t\tTAuditAction,\n\t\t\tTDatabase,\n\t\t\tTDatabaseServiceName\n\t\t>,\n\t) {}\n\n\tstatic isDev = process.env.NODE_ENV === 'development';\n\n\tstatic async validate<T extends StandardSchemaV1>(\n\t\tc: Context<any, string, {}>,\n\t\tdata: unknown,\n\t\tschema?: T,\n\t) {\n\t\tif (!schema) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst parsed = await Endpoint.validate(schema, data);\n\n\t\tif (parsed.issues) {\n\t\t\treturn c.json(parsed.issues, 422);\n\t\t}\n\n\t\treturn parsed.value;\n\t}\n\taddRoute(\n\t\tserviceDiscovery: ServiceDiscovery<ServiceRecord<TServices>, TLogger>,\n\t\tapp: Hono,\n\t): void {\n\t\tHonoEndpoint.addRoute(this.endpoint, serviceDiscovery, app);\n\t}\n\n\t/**\n\t * @deprecated Global event middleware is no longer used.\n\t * Events are now published per-route only for endpoints that have events configured.\n\t * This method is kept for backward compatibility but does nothing.\n\t */\n\tstatic applyEventMiddleware(\n\t\t_app: Hono,\n\t\t_serviceDiscovery: ServiceDiscovery<any, any>,\n\t) {\n\t\t// No-op: Event publishing is now handled per-route in addRoute\n\t\t// This avoids running middleware on every request including 404s\n\t}\n\n\tstatic async fromRoutes<TLogger extends Logger, TServices extends Service[]>(\n\t\troutes: string[],\n\t\tenvParser: EnvironmentParser<{}>,\n\t\tapp = new Hono(),\n\t\t_logger: TLogger,\n\t\tcwd = process.cwd(),\n\t\toptions?: HonoEndpointOptions,\n\t): Promise<Hono> {\n\t\tconst endpoints = await getEndpointsFromRoutes<TServices>(routes, cwd);\n\t\tconst serviceDiscovery =\n\t\t\tServiceDiscovery.getInstance<ServiceRecord<TServices>>(envParser);\n\n\t\tHonoEndpoint.addRoutes(endpoints, serviceDiscovery, app, options);\n\n\t\treturn app;\n\t}\n\n\tstatic addRoutes<\n\t\tTServices extends Service[] = [],\n\t\tTLogger extends Logger = Logger,\n\t>(\n\t\tendpoints: Endpoint<string, HttpMethod, any, any, TServices, TLogger>[],\n\t\tserviceDiscovery: ServiceDiscovery<ServiceRecord<TServices>, TLogger>,\n\t\tapp: Hono,\n\t\toptions?: HonoEndpointOptions,\n\t): void {\n\t\t// Add timing middleware (always enabled)\n\t\tapp.use('*', timing());\n\n\t\t// Add logger middleware in development mode\n\n\t\tif (HonoEndpoint.isDev) {\n\t\t\tapp.use('*', honoLogger());\n\t\t}\n\n\t\t// Add docs route if not disabled\n\t\tconst docsPath =\n\t\t\toptions?.docsPath !== false ? options?.docsPath || '/docs' : null;\n\t\tif (docsPath) {\n\t\t\tHonoEndpoint.addDocsRoute(\n\t\t\t\tendpoints,\n\t\t\t\tapp,\n\t\t\t\tdocsPath,\n\t\t\t\toptions?.openApiOptions,\n\t\t\t);\n\t\t}\n\n\t\t// Sort endpoints to ensure static routes come before dynamic ones\n\t\tconst sortedEndpoints = endpoints.sort((a, b) => {\n\t\t\tconst aSegments = a.route.split('/');\n\t\t\tconst bSegments = b.route.split('/');\n\n\t\t\t// Compare each segment\n\t\t\tfor (let i = 0; i < Math.max(aSegments.length, bSegments.length); i++) {\n\t\t\t\tconst aSegment = aSegments[i] || '';\n\t\t\t\tconst bSegment = bSegments[i] || '';\n\n\t\t\t\t// If one is dynamic and the other is not, static comes first\n\t\t\t\tconst aIsDynamic = aSegment.startsWith(':');\n\t\t\t\tconst bIsDynamic = bSegment.startsWith(':');\n\n\t\t\t\tif (!aIsDynamic && bIsDynamic) return -1;\n\t\t\t\tif (aIsDynamic && !bIsDynamic) return 1;\n\n\t\t\t\t// If both are the same type, compare alphabetically\n\t\t\t\tif (aSegment !== bSegment) {\n\t\t\t\t\treturn aSegment.localeCompare(bSegment);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn 0;\n\t\t});\n\n\t\t// Note: Global event middleware removed for performance\n\t\t// Events are now published per-route only for endpoints with events configured\n\t\tfor (const endpoint of sortedEndpoints) {\n\t\t\tHonoEndpoint.addRoute(endpoint, serviceDiscovery, app);\n\t\t}\n\t}\n\n\tstatic addRoute<\n\t\tTRoute extends string,\n\t\tTMethod extends HttpMethod,\n\t\tTInput extends EndpointSchemas = {},\n\t\tTOutSchema extends StandardSchemaV1 | undefined = undefined,\n\t\tTServices extends Service[] = [],\n\t\tTLogger extends Logger = Logger,\n\t\tTSession = unknown,\n\t\tTEventPublisher extends EventPublisher<any> | undefined = undefined,\n\t\tTEventPublisherServiceName extends string = string,\n\t\tTAuditStorage extends AuditStorage | undefined = undefined,\n\t\tTAuditStorageServiceName extends string = string,\n\t\tTAuditAction extends AuditableAction<string, unknown> = AuditableAction<\n\t\t\tstring,\n\t\t\tunknown\n\t\t>,\n\t\tTDatabase = undefined,\n\t\tTDatabaseServiceName extends string = string,\n\t>(\n\t\tendpoint: Endpoint<\n\t\t\tTRoute,\n\t\t\tTMethod,\n\t\t\tTInput,\n\t\t\tTOutSchema,\n\t\t\tTServices,\n\t\t\tTLogger,\n\t\t\tTSession,\n\t\t\tTEventPublisher,\n\t\t\tTEventPublisherServiceName,\n\t\t\tTAuditStorage,\n\t\t\tTAuditStorageServiceName,\n\t\t\tTAuditAction,\n\t\t\tTDatabase,\n\t\t\tTDatabaseServiceName\n\t\t>,\n\t\tserviceDiscovery: ServiceDiscovery<ServiceRecord<TServices>, TLogger>,\n\t\tapp: Hono,\n\t): void {\n\t\tconst { route } = endpoint;\n\t\tconst method = endpoint.method.toLowerCase() as LowerHttpMethod<TMethod>;\n\n\t\t// Analyze endpoint features once at registration time (not per-request)\n\t\tconst features = analyzeEndpointFeatures(endpoint);\n\n\t\t// Build validators array - only add validators for schemas that exist\n\t\tconst validators: any[] = [];\n\n\t\tif (features.hasBodyValidation) {\n\t\t\tvalidators.push(\n\t\t\t\tvalidator('json', (value, c) =>\n\t\t\t\t\tHonoEndpoint.validate(c, value, endpoint.input?.body),\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\n\t\tif (features.hasQueryValidation) {\n\t\t\tvalidators.push(\n\t\t\t\tvalidator('query', (_, c) => {\n\t\t\t\t\tconst parsedQuery = parseHonoQuery(c);\n\t\t\t\t\treturn HonoEndpoint.validate(c, parsedQuery, endpoint.input?.query);\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\n\t\tif (features.hasParamValidation) {\n\t\t\tvalidators.push(\n\t\t\t\tvalidator('param', (params, c) =>\n\t\t\t\t\tHonoEndpoint.validate(c, params, endpoint.input?.params),\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\n\t\t// Main handler\n\t\tconst handler = async (c: Context) => {\n\t\t\t// Request context setup\n\t\t\tconst startTime = Date.now();\n\t\t\tconst requestId = c.req.header('X-Request-ID') ?? crypto.randomUUID();\n\n\t\t\tconst logger = endpoint.logger.child({\n\t\t\t\trequestId,\n\t\t\t\tendpoint: endpoint.fullPath,\n\t\t\t\troute: endpoint.route,\n\t\t\t\thost: c.req.header('host'),\n\t\t\t\tmethod: endpoint.method,\n\t\t\t\tpath: c.req.path,\n\t\t\t}) as TLogger;\n\n\t\t\t// Set response header\n\t\t\tc.header('X-Request-ID', requestId);\n\n\t\t\t// Wrap entire handler in request context for services to access\n\t\t\treturn runWithRequestContext(\n\t\t\t\t{ logger, requestId, startTime },\n\t\t\t\tasync () => {\n\t\t\t\t\ttry {\n\t\t\t\t\t\t// Lazy accessors - no upfront parsing, use native Hono methods\n\t\t\t\t\t\tconst header = createHonoHeaders(c);\n\t\t\t\t\t\tconst cookie = createHonoCookies(c);\n\n\t\t\t\t\t\t// Only register services if endpoint has any\n\t\t\t\t\t\tconst services = features.hasServices\n\t\t\t\t\t\t\t? await serviceDiscovery.register(endpoint.services)\n\t\t\t\t\t\t\t: ({} as ServiceRecord<TServices>);\n\n\t\t\t\t\t\t// Resolve database service only if configured\n\t\t\t\t\t\tconst rawDb = features.hasDatabase\n\t\t\t\t\t\t\t? await serviceDiscovery\n\t\t\t\t\t\t\t\t\t.register([endpoint.databaseService!])\n\t\t\t\t\t\t\t\t\t.then(\n\t\t\t\t\t\t\t\t\t\t(s) =>\n\t\t\t\t\t\t\t\t\t\t\ts[\n\t\t\t\t\t\t\t\t\t\t\t\tendpoint.databaseService?.serviceName as keyof typeof s\n\t\t\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t: undefined;\n\n\t\t\t\t\t\t// Extract session (defaults to empty object)\n\t\t\t\t\t\tconst session = await endpoint.getSession({\n\t\t\t\t\t\t\tservices,\n\t\t\t\t\t\t\tlogger,\n\t\t\t\t\t\t\theader,\n\t\t\t\t\t\t\tcookie,\n\t\t\t\t\t\t\t...(rawDb !== undefined && { db: rawDb }),\n\t\t\t\t\t\t} as any);\n\n\t\t\t\t\t\t// Check authorization (defaults to true)\n\t\t\t\t\t\tconst isAuthorized = await endpoint.authorize({\n\t\t\t\t\t\t\theader,\n\t\t\t\t\t\t\tcookie,\n\t\t\t\t\t\t\tservices,\n\t\t\t\t\t\t\tlogger,\n\t\t\t\t\t\t\tsession,\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tif (!isAuthorized) {\n\t\t\t\t\t\t\tlogger.warn('Unauthorized access attempt');\n\t\t\t\t\t\t\treturn c.json({ error: 'Unauthorized' }, 401);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Check rate limit only if configured\n\t\t\t\t\t\tif (features.hasRateLimit) {\n\t\t\t\t\t\t\tconst rateLimitInfo = await checkRateLimit(endpoint.rateLimit!, {\n\t\t\t\t\t\t\t\theader,\n\t\t\t\t\t\t\t\tservices,\n\t\t\t\t\t\t\t\tlogger,\n\t\t\t\t\t\t\t\tsession,\n\t\t\t\t\t\t\t\tpath: c.req.path,\n\t\t\t\t\t\t\t\tmethod: endpoint.method,\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tconst rateLimitHeaders = getRateLimitHeaders(\n\t\t\t\t\t\t\t\trateLimitInfo,\n\t\t\t\t\t\t\t\tendpoint.rateLimit!,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tfor (const [key, value] of Object.entries(rateLimitHeaders)) {\n\t\t\t\t\t\t\t\tif (value) {\n\t\t\t\t\t\t\t\t\tc.header(key, value);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Create audit context only if audits are configured\n\t\t\t\t\t\tconst auditContext = features.hasAudits\n\t\t\t\t\t\t\t? await createAuditContext(\n\t\t\t\t\t\t\t\t\tendpoint as any,\n\t\t\t\t\t\t\t\t\tserviceDiscovery,\n\t\t\t\t\t\t\t\t\tlogger,\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tsession,\n\t\t\t\t\t\t\t\t\t\theader,\n\t\t\t\t\t\t\t\t\t\tcookie,\n\t\t\t\t\t\t\t\t\t\tservices: services as Record<string, unknown>,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t: undefined;\n\n\t\t\t\t\t\tconst audits = features.hasAudits\n\t\t\t\t\t\t\t? (endpoint.audits as MappedAudit<TAuditAction, TOutSchema>[])\n\t\t\t\t\t\t\t: [];\n\n\t\t\t\t\t\t// Warn if declarative audits are configured but no audit storage\n\t\t\t\t\t\tif (features.hasAudits && !auditContext) {\n\t\t\t\t\t\t\tlogger.warn('No auditor storage service available');\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Extract RLS context only if configured and not bypassed\n\t\t\t\t\t\tconst rlsContext =\n\t\t\t\t\t\t\tfeatures.hasRls && rawDb !== undefined\n\t\t\t\t\t\t\t\t? await endpoint.rlsConfig?.extractor({\n\t\t\t\t\t\t\t\t\t\tservices,\n\t\t\t\t\t\t\t\t\t\tsession: session as TSession,\n\t\t\t\t\t\t\t\t\t\theader,\n\t\t\t\t\t\t\t\t\t\tcookie,\n\t\t\t\t\t\t\t\t\t\tlogger,\n\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t: undefined;\n\n\t\t\t\t\t\t// Execute handler with automatic audit transaction support\n\t\t\t\t\t\tconst result = await executeWithAuditTransaction(\n\t\t\t\t\t\t\tauditContext,\n\t\t\t\t\t\t\tasync (auditor) => {\n\t\t\t\t\t\t\t\tconst sameDatabase =\n\t\t\t\t\t\t\t\t\tauditContext?.storage?.databaseServiceName &&\n\t\t\t\t\t\t\t\t\tauditContext.storage.databaseServiceName ===\n\t\t\t\t\t\t\t\t\t\tendpoint.databaseService?.serviceName;\n\t\t\t\t\t\t\t\tconst baseDb = sameDatabase\n\t\t\t\t\t\t\t\t\t? (auditor?.getTransaction?.() ?? rawDb)\n\t\t\t\t\t\t\t\t\t: rawDb;\n\n\t\t\t\t\t\t\t\tconst executeHandler = async (db: TDatabase | undefined) => {\n\t\t\t\t\t\t\t\t\tconst responseBuilder = new ResponseBuilder();\n\t\t\t\t\t\t\t\t\tconst response = await endpoint.handler(\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\tservices,\n\t\t\t\t\t\t\t\t\t\t\tlogger,\n\t\t\t\t\t\t\t\t\t\t\tbody: features.hasBodyValidation\n\t\t\t\t\t\t\t\t\t\t\t\t? (c.req.valid as any)('json')\n\t\t\t\t\t\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\t\t\t\t\t\t\tquery: features.hasQueryValidation\n\t\t\t\t\t\t\t\t\t\t\t\t? (c.req.valid as any)('query')\n\t\t\t\t\t\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\t\t\t\t\t\t\tparams: features.hasParamValidation\n\t\t\t\t\t\t\t\t\t\t\t\t? (c.req.valid as any)('param')\n\t\t\t\t\t\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\t\t\t\t\t\t\tsession,\n\t\t\t\t\t\t\t\t\t\t\theader,\n\t\t\t\t\t\t\t\t\t\t\tcookie,\n\t\t\t\t\t\t\t\t\t\t\tauditor,\n\t\t\t\t\t\t\t\t\t\t\tdb,\n\t\t\t\t\t\t\t\t\t\t} as unknown as EndpointContext<\n\t\t\t\t\t\t\t\t\t\t\tTInput,\n\t\t\t\t\t\t\t\t\t\t\tTServices,\n\t\t\t\t\t\t\t\t\t\t\tTLogger,\n\t\t\t\t\t\t\t\t\t\t\tTSession,\n\t\t\t\t\t\t\t\t\t\t\tTAuditAction,\n\t\t\t\t\t\t\t\t\t\t\tTDatabase,\n\t\t\t\t\t\t\t\t\t\t\tTAuditStorage\n\t\t\t\t\t\t\t\t\t\t>,\n\t\t\t\t\t\t\t\t\t\tresponseBuilder,\n\t\t\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t\t\tlet data = response;\n\t\t\t\t\t\t\t\t\tlet metadata = responseBuilder.getMetadata();\n\n\t\t\t\t\t\t\t\t\tif (Endpoint.hasMetadata(response)) {\n\t\t\t\t\t\t\t\t\t\tdata = response.data;\n\t\t\t\t\t\t\t\t\t\tmetadata = response.metadata;\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\tconst output = endpoint.outputSchema\n\t\t\t\t\t\t\t\t\t\t? await endpoint.parseOutput(data)\n\t\t\t\t\t\t\t\t\t\t: undefined;\n\n\t\t\t\t\t\t\t\t\treturn { output, metadata, responseBuilder };\n\t\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\t\tif (features.hasRls && rlsContext && baseDb) {\n\t\t\t\t\t\t\t\t\treturn withRlsContext(\n\t\t\t\t\t\t\t\t\t\tbaseDb as any,\n\t\t\t\t\t\t\t\t\t\trlsContext,\n\t\t\t\t\t\t\t\t\t\tasync (trx) => executeHandler(trx as TDatabase),\n\t\t\t\t\t\t\t\t\t\t{ prefix: endpoint.rlsConfig?.prefix },\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\treturn executeHandler(baseDb as TDatabase | undefined);\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tasync (result, auditor) => {\n\t\t\t\t\t\t\t\tif (!audits?.length) return;\n\n\t\t\t\t\t\t\t\tfor (const audit of audits) {\n\t\t\t\t\t\t\t\t\tif (audit.when && !audit.when(result.output as any)) {\n\t\t\t\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tconst payload = audit.payload(result.output as any);\n\t\t\t\t\t\t\t\t\tconst entityId = audit.entityId?.(result.output as any);\n\t\t\t\t\t\t\t\t\tauditor.audit(audit.type as any, payload as any, {\n\t\t\t\t\t\t\t\t\t\ttable: audit.table,\n\t\t\t\t\t\t\t\t\t\tentityId,\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{ db: rawDb },\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tconst { output, metadata } = result;\n\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tlet status = endpoint.status as ContentfulStatusCode;\n\n\t\t\t\t\t\t\tif (metadata.status) {\n\t\t\t\t\t\t\t\tstatus = metadata.status as ContentfulStatusCode;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (metadata.headers) {\n\t\t\t\t\t\t\t\tfor (const [key, value] of Object.entries(metadata.headers)) {\n\t\t\t\t\t\t\t\t\tc.header(key, value);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (metadata.cookies) {\n\t\t\t\t\t\t\t\tfor (const [name, { value, options }] of metadata.cookies) {\n\t\t\t\t\t\t\t\t\tsetCookie(c, name, value, options);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// Only publish events if configured (no global middleware overhead)\n\t\t\t\t\t\t\tif (features.hasEvents && Endpoint.isSuccessStatus(status)) {\n\t\t\t\t\t\t\t\tawait publishConstructEvents<any, any>(\n\t\t\t\t\t\t\t\t\tendpoint as any,\n\t\t\t\t\t\t\t\t\toutput,\n\t\t\t\t\t\t\t\t\tserviceDiscovery,\n\t\t\t\t\t\t\t\t\tlogger,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (HonoEndpoint.isDev) {\n\t\t\t\t\t\t\t\tlogger.info({ status, body: output }, 'Outgoing response');\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// @ts-expect-error\n\t\t\t\t\t\t\treturn c.json(output, status);\n\t\t\t\t\t\t} catch (validationError: any) {\n\t\t\t\t\t\t\tlogger.error(validationError, 'Output validation failed');\n\t\t\t\t\t\t\tconst error = wrapError(\n\t\t\t\t\t\t\t\tvalidationError,\n\t\t\t\t\t\t\t\t422,\n\t\t\t\t\t\t\t\t'Response validation failed',\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tif (HonoEndpoint.isDev) {\n\t\t\t\t\t\t\t\tlogger.info(\n\t\t\t\t\t\t\t\t\t{ status: error.statusCode, body: error },\n\t\t\t\t\t\t\t\t\t'Outgoing response',\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn c.json(error, error.statusCode as ContentfulStatusCode);\n\t\t\t\t\t\t}\n\t\t\t\t\t} catch (e: any) {\n\t\t\t\t\t\tlogger.error(e, 'Error processing endpoint request');\n\t\t\t\t\t\tconst error = wrapError(e, 500, 'Internal Server Error');\n\t\t\t\t\t\tif (HonoEndpoint.isDev) {\n\t\t\t\t\t\t\tlogger.info(\n\t\t\t\t\t\t\t\t{ status: error.statusCode, body: error },\n\t\t\t\t\t\t\t\t'Outgoing response',\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn c.json(error, error.statusCode as ContentfulStatusCode);\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t);\n\t\t};\n\n\t\t// Register route with conditional validators\n\t\tapp[method](route, ...validators, handler);\n\t}\n\n\tstatic addDocsRoute<\n\t\tTServices extends Service[] = [],\n\t\tTLogger extends Logger = Logger,\n\t>(\n\t\tendpoints: Endpoint<string, HttpMethod, any, any, TServices, TLogger>[],\n\t\tapp: Hono,\n\t\tdocsPath: string,\n\t\topenApiOptions?: HonoEndpointOptions['openApiOptions'],\n\t): void {\n\t\tapp.get(docsPath, async (c) => {\n\t\t\ttry {\n\t\t\t\tconst openApiSchema = await Endpoint.buildOpenApiSchema(\n\t\t\t\t\tendpoints,\n\t\t\t\t\topenApiOptions,\n\t\t\t\t);\n\n\t\t\t\treturn c.json(openApiSchema);\n\t\t\t} catch {\n\t\t\t\treturn c.json(\n\t\t\t\t\t{ error: 'Failed to generate OpenAPI documentation' },\n\t\t\t\t\t500,\n\t\t\t\t);\n\t\t\t}\n\t\t});\n\t}\n}\n"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Construct } from "./Construct-
|
|
1
|
+
import { Construct } from "./Construct-Dl0l2d8d.cjs";
|
|
2
2
|
import { EventPublisher, ExtractPublisherMessage } from "@geekmidas/events";
|
|
3
3
|
import { Logger } from "@geekmidas/logger";
|
|
4
4
|
import { Service, ServiceRecord } from "@geekmidas/services";
|
|
@@ -30,4 +30,4 @@ type SubscriberContext<TEventPublisher extends EventPublisher<any> | undefined,
|
|
|
30
30
|
};
|
|
31
31
|
//#endregion
|
|
32
32
|
export { Subscriber, SubscriberContext, SubscriberHandler };
|
|
33
|
-
//# sourceMappingURL=Subscriber
|
|
33
|
+
//# sourceMappingURL=Subscriber-BBcIOkhW.d.cts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Subscriber
|
|
1
|
+
{"version":3,"file":"Subscriber-BBcIOkhW.d.cts","names":[],"sources":["../src/subscribers/Subscriber.ts"],"sourcesContent":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Construct } from "./Construct-
|
|
1
|
+
import { Construct } from "./Construct-E8QPyHh4.mjs";
|
|
2
2
|
import { Service, ServiceRecord } from "@geekmidas/services";
|
|
3
3
|
import { EventPublisher, ExtractPublisherMessage } from "@geekmidas/events";
|
|
4
4
|
import { Logger } from "@geekmidas/logger";
|
|
@@ -30,4 +30,4 @@ type SubscriberContext<TEventPublisher extends EventPublisher<any> | undefined,
|
|
|
30
30
|
};
|
|
31
31
|
//#endregion
|
|
32
32
|
export { Subscriber, SubscriberContext, SubscriberHandler };
|
|
33
|
-
//# sourceMappingURL=Subscriber-
|
|
33
|
+
//# sourceMappingURL=Subscriber-BpTAXvbM.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Subscriber-
|
|
1
|
+
{"version":3,"file":"Subscriber-BpTAXvbM.d.mts","names":[],"sources":["../src/subscribers/Subscriber.ts"],"sourcesContent":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
const require_chunk = require('./chunk-CUT6urMc.cjs');
|
|
2
|
-
const require_Construct = require('./Construct-
|
|
2
|
+
const require_Construct = require('./Construct-CPrCF8NK.cjs');
|
|
3
3
|
const __geekmidas_logger_console = require_chunk.__toESM(require("@geekmidas/logger/console"));
|
|
4
4
|
|
|
5
5
|
//#region src/subscribers/Subscriber.ts
|
|
@@ -31,4 +31,4 @@ Object.defineProperty(exports, 'Subscriber', {
|
|
|
31
31
|
return Subscriber;
|
|
32
32
|
}
|
|
33
33
|
});
|
|
34
|
-
//# sourceMappingURL=Subscriber-
|
|
34
|
+
//# sourceMappingURL=Subscriber-CL4iYm01.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Subscriber-
|
|
1
|
+
{"version":3,"file":"Subscriber-CL4iYm01.cjs","names":["ConsoleLogger","Construct","obj: any","ConstructType","handler: SubscriberHandler<\n\t\t\tTEventPublisher,\n\t\t\tTSubscribedEvents,\n\t\t\tTServices,\n\t\t\tTLogger,\n\t\t\tOutSchema\n\t\t>","timeout: number","_subscribedEvents?: TSubscribedEvents","outputSchema?: OutSchema","services: TServices","logger: TLogger","publisherService?: Service<\n\t\t\tTEventPublisherServiceName,\n\t\t\tTEventPublisher\n\t\t>"],"sources":["../src/subscribers/Subscriber.ts"],"sourcesContent":["import type {\n\tEventPublisher,\n\tExtractPublisherMessage,\n} from '@geekmidas/events';\nimport type { Logger } from '@geekmidas/logger';\nimport { ConsoleLogger } from '@geekmidas/logger/console';\nimport type { InferStandardSchema } from '@geekmidas/schema';\nimport type { Service, ServiceRecord } from '@geekmidas/services';\nimport type { StandardSchemaV1 } from '@standard-schema/spec';\nimport { Construct, ConstructType } from '../Construct';\n\nconst DEFAULT_LOGGER = new ConsoleLogger() as any;\n\n// Helper type to extract payload types for subscribed events\ntype ExtractEventPayloads<\n\tTPublisher extends EventPublisher<any> | undefined,\n\tTEventTypes extends any[],\n> = TPublisher extends EventPublisher<any>\n\t? Extract<ExtractPublisherMessage<TPublisher>, { type: TEventTypes[number] }>\n\t: never;\n\nexport class Subscriber<\n\tTServices extends Service[] = [],\n\tTLogger extends Logger = Logger,\n\tOutSchema extends StandardSchemaV1 | undefined = undefined,\n\tTEventPublisher extends EventPublisher<any> | undefined = undefined,\n\tTEventPublisherServiceName extends string = string,\n\tTSubscribedEvents extends\n\t\tExtractPublisherMessage<TEventPublisher>['type'][] = ExtractPublisherMessage<TEventPublisher>['type'][],\n> extends Construct<\n\tTLogger,\n\tTEventPublisherServiceName,\n\tTEventPublisher,\n\tOutSchema,\n\tTServices\n> {\n\t__IS_SUBSCRIBER__ = true;\n\n\tstatic isSubscriber(\n\t\tobj: any,\n\t): obj is Subscriber<any, any, any, any, any, any> {\n\t\treturn Boolean(\n\t\t\tobj &&\n\t\t\t\tobj.__IS_SUBSCRIBER__ === true &&\n\t\t\t\tobj.type === ConstructType.Subscriber,\n\t\t);\n\t}\n\n\tconstructor(\n\t\tpublic readonly handler: SubscriberHandler<\n\t\t\tTEventPublisher,\n\t\t\tTSubscribedEvents,\n\t\t\tTServices,\n\t\t\tTLogger,\n\t\t\tOutSchema\n\t\t>,\n\t\tpublic override readonly timeout: number = 30000,\n\t\tprotected _subscribedEvents?: TSubscribedEvents,\n\t\tpublic override readonly outputSchema?: OutSchema,\n\t\tpublic override readonly services: TServices = [] as unknown as TServices,\n\t\tpublic override readonly logger: TLogger = DEFAULT_LOGGER as TLogger,\n\t\tpublic override readonly publisherService?: Service<\n\t\t\tTEventPublisherServiceName,\n\t\t\tTEventPublisher\n\t\t>,\n\t) {\n\t\tsuper(\n\t\t\tConstructType.Subscriber,\n\t\t\tlogger,\n\t\t\tservices,\n\t\t\t[],\n\t\t\tpublisherService,\n\t\t\toutputSchema,\n\t\t);\n\t}\n\n\tget subscribedEvents(): TSubscribedEvents | undefined {\n\t\treturn this._subscribedEvents;\n\t}\n}\n\n// Handler type for subscribers that receives an array of events\nexport type SubscriberHandler<\n\tTEventPublisher extends EventPublisher<any> | undefined,\n\tTSubscribedEvents extends ExtractPublisherMessage<TEventPublisher>['type'][],\n\tTServices extends Service[] = [],\n\tTLogger extends Logger = Logger,\n\tOutSchema extends StandardSchemaV1 | undefined = undefined,\n> = (\n\tctx: SubscriberContext<\n\t\tTEventPublisher,\n\t\tTSubscribedEvents,\n\t\tTServices,\n\t\tTLogger\n\t>,\n) => OutSchema extends StandardSchemaV1\n\t? InferStandardSchema<OutSchema> | Promise<InferStandardSchema<OutSchema>>\n\t: any | Promise<any>;\n\n// Context type for subscriber handlers\nexport type SubscriberContext<\n\tTEventPublisher extends EventPublisher<any> | undefined,\n\tTSubscribedEvents extends ExtractPublisherMessage<TEventPublisher>['type'][],\n\tTServices extends Service[] = [],\n\tTLogger extends Logger = Logger,\n> = {\n\tevents: ExtractEventPayloads<TEventPublisher, TSubscribedEvents>[];\n\tservices: ServiceRecord<TServices>;\n\tlogger: TLogger;\n};\n"],"mappings":";;;;;AAWA,MAAM,iBAAiB,IAAIA;AAU3B,IAAa,aAAb,cAQUC,4BAMR;CACD,oBAAoB;CAEpB,OAAO,aACNC,KACkD;AAClD,SAAO,QACN,OACC,IAAI,sBAAsB,QAC1B,IAAI,SAASC,gCAAc,WAC5B;CACD;CAED,YACiBC,SAOSC,UAAkB,KACjCC,mBACeC,cACAC,WAAsB,CAAE,GACxBC,SAAkB,gBAClBC,kBAIxB;AACD,QACCP,gCAAc,YACd,QACA,UACA,CAAE,GACF,kBACA,aACA;EAxBe;EAOS;EACf;EACe;EACA;EACA;EACA;CAazB;CAED,IAAI,mBAAkD;AACrD,SAAO,KAAK;CACZ;AACD"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Construct, ConstructType } from "./Construct-
|
|
1
|
+
import { Construct, ConstructType } from "./Construct-BNDLJJfD.mjs";
|
|
2
2
|
import { ConsoleLogger } from "@geekmidas/logger/console";
|
|
3
3
|
|
|
4
4
|
//#region src/subscribers/Subscriber.ts
|
|
@@ -25,4 +25,4 @@ var Subscriber = class extends Construct {
|
|
|
25
25
|
|
|
26
26
|
//#endregion
|
|
27
27
|
export { Subscriber };
|
|
28
|
-
//# sourceMappingURL=Subscriber-
|
|
28
|
+
//# sourceMappingURL=Subscriber-CZ8Smwd2.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Subscriber-
|
|
1
|
+
{"version":3,"file":"Subscriber-CZ8Smwd2.mjs","names":["DEFAULT_LOGGER","obj: any","handler: SubscriberHandler<\n\t\t\tTEventPublisher,\n\t\t\tTSubscribedEvents,\n\t\t\tTServices,\n\t\t\tTLogger,\n\t\t\tOutSchema\n\t\t>","timeout: number","_subscribedEvents?: TSubscribedEvents","outputSchema?: OutSchema","services: TServices","logger: TLogger","publisherService?: Service<\n\t\t\tTEventPublisherServiceName,\n\t\t\tTEventPublisher\n\t\t>"],"sources":["../src/subscribers/Subscriber.ts"],"sourcesContent":["import type {\n\tEventPublisher,\n\tExtractPublisherMessage,\n} from '@geekmidas/events';\nimport type { Logger } from '@geekmidas/logger';\nimport { ConsoleLogger } from '@geekmidas/logger/console';\nimport type { InferStandardSchema } from '@geekmidas/schema';\nimport type { Service, ServiceRecord } from '@geekmidas/services';\nimport type { StandardSchemaV1 } from '@standard-schema/spec';\nimport { Construct, ConstructType } from '../Construct';\n\nconst DEFAULT_LOGGER = new ConsoleLogger() as any;\n\n// Helper type to extract payload types for subscribed events\ntype ExtractEventPayloads<\n\tTPublisher extends EventPublisher<any> | undefined,\n\tTEventTypes extends any[],\n> = TPublisher extends EventPublisher<any>\n\t? Extract<ExtractPublisherMessage<TPublisher>, { type: TEventTypes[number] }>\n\t: never;\n\nexport class Subscriber<\n\tTServices extends Service[] = [],\n\tTLogger extends Logger = Logger,\n\tOutSchema extends StandardSchemaV1 | undefined = undefined,\n\tTEventPublisher extends EventPublisher<any> | undefined = undefined,\n\tTEventPublisherServiceName extends string = string,\n\tTSubscribedEvents extends\n\t\tExtractPublisherMessage<TEventPublisher>['type'][] = ExtractPublisherMessage<TEventPublisher>['type'][],\n> extends Construct<\n\tTLogger,\n\tTEventPublisherServiceName,\n\tTEventPublisher,\n\tOutSchema,\n\tTServices\n> {\n\t__IS_SUBSCRIBER__ = true;\n\n\tstatic isSubscriber(\n\t\tobj: any,\n\t): obj is Subscriber<any, any, any, any, any, any> {\n\t\treturn Boolean(\n\t\t\tobj &&\n\t\t\t\tobj.__IS_SUBSCRIBER__ === true &&\n\t\t\t\tobj.type === ConstructType.Subscriber,\n\t\t);\n\t}\n\n\tconstructor(\n\t\tpublic readonly handler: SubscriberHandler<\n\t\t\tTEventPublisher,\n\t\t\tTSubscribedEvents,\n\t\t\tTServices,\n\t\t\tTLogger,\n\t\t\tOutSchema\n\t\t>,\n\t\tpublic override readonly timeout: number = 30000,\n\t\tprotected _subscribedEvents?: TSubscribedEvents,\n\t\tpublic override readonly outputSchema?: OutSchema,\n\t\tpublic override readonly services: TServices = [] as unknown as TServices,\n\t\tpublic override readonly logger: TLogger = DEFAULT_LOGGER as TLogger,\n\t\tpublic override readonly publisherService?: Service<\n\t\t\tTEventPublisherServiceName,\n\t\t\tTEventPublisher\n\t\t>,\n\t) {\n\t\tsuper(\n\t\t\tConstructType.Subscriber,\n\t\t\tlogger,\n\t\t\tservices,\n\t\t\t[],\n\t\t\tpublisherService,\n\t\t\toutputSchema,\n\t\t);\n\t}\n\n\tget subscribedEvents(): TSubscribedEvents | undefined {\n\t\treturn this._subscribedEvents;\n\t}\n}\n\n// Handler type for subscribers that receives an array of events\nexport type SubscriberHandler<\n\tTEventPublisher extends EventPublisher<any> | undefined,\n\tTSubscribedEvents extends ExtractPublisherMessage<TEventPublisher>['type'][],\n\tTServices extends Service[] = [],\n\tTLogger extends Logger = Logger,\n\tOutSchema extends StandardSchemaV1 | undefined = undefined,\n> = (\n\tctx: SubscriberContext<\n\t\tTEventPublisher,\n\t\tTSubscribedEvents,\n\t\tTServices,\n\t\tTLogger\n\t>,\n) => OutSchema extends StandardSchemaV1\n\t? InferStandardSchema<OutSchema> | Promise<InferStandardSchema<OutSchema>>\n\t: any | Promise<any>;\n\n// Context type for subscriber handlers\nexport type SubscriberContext<\n\tTEventPublisher extends EventPublisher<any> | undefined,\n\tTSubscribedEvents extends ExtractPublisherMessage<TEventPublisher>['type'][],\n\tTServices extends Service[] = [],\n\tTLogger extends Logger = Logger,\n> = {\n\tevents: ExtractEventPayloads<TEventPublisher, TSubscribedEvents>[];\n\tservices: ServiceRecord<TServices>;\n\tlogger: TLogger;\n};\n"],"mappings":";;;;AAWA,MAAMA,mBAAiB,IAAI;AAU3B,IAAa,aAAb,cAQU,UAMR;CACD,oBAAoB;CAEpB,OAAO,aACNC,KACkD;AAClD,SAAO,QACN,OACC,IAAI,sBAAsB,QAC1B,IAAI,SAAS,cAAc,WAC5B;CACD;CAED,YACiBC,SAOSC,UAAkB,KACjCC,mBACeC,cACAC,WAAsB,CAAE,GACxBC,SAAkBP,kBAClBQ,kBAIxB;AACD,QACC,cAAc,YACd,QACA,UACA,CAAE,GACF,kBACA,aACA;EAxBe;EAOS;EACf;EACe;EACA;EACA;EACA;CAazB;CAED,IAAI,mBAAkD;AACrD,SAAO,KAAK;CACZ;AACD"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Subscriber } from "./Subscriber-
|
|
1
|
+
import { Subscriber } from "./Subscriber-CZ8Smwd2.mjs";
|
|
2
2
|
import { DEFAULT_LOGGER } from "@geekmidas/logger/console";
|
|
3
3
|
|
|
4
4
|
//#region src/subscribers/SubscriberBuilder.ts
|
|
@@ -51,4 +51,4 @@ var SubscriberBuilder = class {
|
|
|
51
51
|
|
|
52
52
|
//#endregion
|
|
53
53
|
export { SubscriberBuilder };
|
|
54
|
-
//# sourceMappingURL=SubscriberBuilder-
|
|
54
|
+
//# sourceMappingURL=SubscriberBuilder-CxQg3TTm.mjs.map
|