@geekmidas/constructs 0.2.3 → 0.3.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-H65WfXLt.mjs → AWSLambdaFunction-C54a1doJ.mjs} +3 -3
- package/dist/{AWSLambdaFunction-H65WfXLt.mjs.map → AWSLambdaFunction-C54a1doJ.mjs.map} +1 -1
- package/dist/{AWSLambdaFunction-C-fuCLA3.cjs → AWSLambdaFunction-EPGY4s7i.cjs} +3 -3
- package/dist/{AWSLambdaFunction-C-fuCLA3.cjs.map → AWSLambdaFunction-EPGY4s7i.cjs.map} +1 -1
- package/dist/{AmazonApiGatewayEndpointAdaptor-pEWzF2uY.mjs → AmazonApiGatewayEndpointAdaptor-BT9JXihC.mjs} +2 -2
- package/dist/{AmazonApiGatewayEndpointAdaptor-pEWzF2uY.mjs.map → AmazonApiGatewayEndpointAdaptor-BT9JXihC.mjs.map} +1 -1
- package/dist/{AmazonApiGatewayEndpointAdaptor-Bk6ssx3K.cjs → AmazonApiGatewayEndpointAdaptor-DNFvvdmW.cjs} +2 -2
- package/dist/{AmazonApiGatewayEndpointAdaptor-Bk6ssx3K.cjs.map → AmazonApiGatewayEndpointAdaptor-DNFvvdmW.cjs.map} +1 -1
- package/dist/{AmazonApiGatewayV1EndpointAdaptor-MJpRbIaQ.mjs → AmazonApiGatewayV1EndpointAdaptor-BbkfC1dk.mjs} +2 -2
- package/dist/{AmazonApiGatewayV1EndpointAdaptor-MJpRbIaQ.mjs.map → AmazonApiGatewayV1EndpointAdaptor-BbkfC1dk.mjs.map} +1 -1
- package/dist/{AmazonApiGatewayV1EndpointAdaptor-uBp_4zLf.cjs → AmazonApiGatewayV1EndpointAdaptor-BiNzaAxD.cjs} +2 -2
- package/dist/{AmazonApiGatewayV1EndpointAdaptor-uBp_4zLf.cjs.map → AmazonApiGatewayV1EndpointAdaptor-BiNzaAxD.cjs.map} +1 -1
- package/dist/{AmazonApiGatewayV2EndpointAdaptor-I1W23Nvn.cjs → AmazonApiGatewayV2EndpointAdaptor-DZclCykB.cjs} +2 -2
- package/dist/{AmazonApiGatewayV2EndpointAdaptor-I1W23Nvn.cjs.map → AmazonApiGatewayV2EndpointAdaptor-DZclCykB.cjs.map} +1 -1
- package/dist/{AmazonApiGatewayV2EndpointAdaptor-ChO8BlDz.mjs → AmazonApiGatewayV2EndpointAdaptor-jRrQrIdm.mjs} +2 -2
- package/dist/{AmazonApiGatewayV2EndpointAdaptor-ChO8BlDz.mjs.map → AmazonApiGatewayV2EndpointAdaptor-jRrQrIdm.mjs.map} +1 -1
- package/dist/{Authorizer-bO8pUWlg.cjs → Authorizer-C0ge_tc8.cjs} +1 -1
- package/dist/{Authorizer-bO8pUWlg.cjs.map → Authorizer-C0ge_tc8.cjs.map} +1 -1
- package/dist/{Authorizer-5UwTFGFA.mjs → Authorizer-r9U3y_ms.mjs} +1 -1
- package/dist/{Authorizer-5UwTFGFA.mjs.map → Authorizer-r9U3y_ms.mjs.map} +1 -1
- package/dist/{BaseFunctionBuilder-B5gkW0Kt.mjs → BaseFunctionBuilder-Czi1Jwza.mjs} +2 -2
- package/dist/{BaseFunctionBuilder-B5gkW0Kt.mjs.map → BaseFunctionBuilder-Czi1Jwza.mjs.map} +1 -1
- package/dist/{BaseFunctionBuilder-C5Se7pdL.cjs → BaseFunctionBuilder-MYG3C9ug.cjs} +2 -2
- package/dist/{BaseFunctionBuilder-C5Se7pdL.cjs.map → BaseFunctionBuilder-MYG3C9ug.cjs.map} +1 -1
- package/dist/{Construct-BYSPikVm.cjs → Construct-Ba5cMxib.cjs} +2 -2
- package/dist/{Construct-BYSPikVm.cjs.map → Construct-Ba5cMxib.cjs.map} +1 -1
- package/dist/{Construct-LWeB1rSQ.mjs → Construct-DdyGHuag.mjs} +2 -2
- package/dist/{Construct-LWeB1rSQ.mjs.map → Construct-DdyGHuag.mjs.map} +1 -1
- package/dist/Construct.cjs +1 -1
- package/dist/Construct.mjs +1 -1
- package/dist/{Cron-B_J26y4S.mjs → Cron-BxhGs5up.mjs} +3 -3
- package/dist/{Cron-B_J26y4S.mjs.map → Cron-BxhGs5up.mjs.map} +1 -1
- package/dist/{Cron-at8QLgVN.cjs → Cron-CGF4YAfM.cjs} +3 -3
- package/dist/{Cron-at8QLgVN.cjs.map → Cron-CGF4YAfM.cjs.map} +1 -1
- package/dist/{CronBuilder-B62sGZ1a.cjs → CronBuilder-CcxKRtVP.cjs} +4 -4
- package/dist/{CronBuilder-B62sGZ1a.cjs.map → CronBuilder-CcxKRtVP.cjs.map} +1 -1
- package/dist/{CronBuilder-DQQwfklF.mjs → CronBuilder-d2jh-IB2.mjs} +4 -4
- package/dist/{CronBuilder-DQQwfklF.mjs.map → CronBuilder-d2jh-IB2.mjs.map} +1 -1
- package/dist/{Endpoint-BJo9Hhwm.cjs → Endpoint-BVGZXFyV.cjs} +3 -3
- package/dist/{Endpoint-BJo9Hhwm.cjs.map → Endpoint-BVGZXFyV.cjs.map} +1 -1
- package/dist/{Endpoint-B70_KKhu.mjs → Endpoint-CuOEswxJ.mjs} +3 -3
- package/dist/{Endpoint-B70_KKhu.mjs.map → Endpoint-CuOEswxJ.mjs.map} +1 -1
- package/dist/{EndpointBuilder-Ddy5Q8rO.cjs → EndpointBuilder-Cgj1P_ra.cjs} +6 -6
- package/dist/{EndpointBuilder-Ddy5Q8rO.cjs.map → EndpointBuilder-Cgj1P_ra.cjs.map} +1 -1
- package/dist/{EndpointBuilder-XnuNlUQs.mjs → EndpointBuilder-DnCB1h1j.mjs} +6 -6
- package/dist/{EndpointBuilder-XnuNlUQs.mjs.map → EndpointBuilder-DnCB1h1j.mjs.map} +1 -1
- package/dist/{EndpointFactory-VxyowJQC.cjs → EndpointFactory-CYj6BYok.cjs} +7 -6
- package/dist/EndpointFactory-CYj6BYok.cjs.map +1 -0
- package/dist/{EndpointFactory-BX5qoLCE.mjs → EndpointFactory-CbdxPCIH.mjs} +7 -6
- package/dist/EndpointFactory-CbdxPCIH.mjs.map +1 -0
- package/dist/{EndpointFactory-3g-7Rznt.d.cts → EndpointFactory-D8I4NNCo.d.cts} +14 -13
- package/dist/{EndpointFactory-DaFR9LQG.d.mts → EndpointFactory-jAkQxWRj.d.mts} +14 -13
- package/dist/{Function-DfKsM5Kx.mjs → Function-BVHqIDp9.mjs} +2 -2
- package/dist/{Function-DfKsM5Kx.mjs.map → Function-BVHqIDp9.mjs.map} +1 -1
- package/dist/{Function-DagDbeXo.cjs → Function-DDZb1525.cjs} +2 -2
- package/dist/{Function-DagDbeXo.cjs.map → Function-DDZb1525.cjs.map} +1 -1
- package/dist/{FunctionBuilder-CVT7bG2o.mjs → FunctionBuilder-CrDYgfiI.mjs} +4 -4
- package/dist/{FunctionBuilder-CVT7bG2o.mjs.map → FunctionBuilder-CrDYgfiI.mjs.map} +1 -1
- package/dist/{FunctionBuilder-DXvG_XD-.cjs → FunctionBuilder-DswJ-9sD.cjs} +4 -4
- package/dist/{FunctionBuilder-DXvG_XD-.cjs.map → FunctionBuilder-DswJ-9sD.cjs.map} +1 -1
- package/dist/{FunctionExecutionWrapper-DkNycmOh.cjs → FunctionExecutionWrapper-BYI2bGTL.cjs} +2 -2
- package/dist/{FunctionExecutionWrapper-DkNycmOh.cjs.map → FunctionExecutionWrapper-BYI2bGTL.cjs.map} +1 -1
- package/dist/{FunctionExecutionWrapper-Bubnr0zA.mjs → FunctionExecutionWrapper-CLDh7Z2_.mjs} +2 -2
- package/dist/{FunctionExecutionWrapper-Bubnr0zA.mjs.map → FunctionExecutionWrapper-CLDh7Z2_.mjs.map} +1 -1
- package/dist/{HonoEndpointAdaptor-D8a3lZN8.d.cts → HonoEndpointAdaptor-Bx9Y1bCZ.d.cts} +3 -3
- package/dist/{HonoEndpointAdaptor-CcvXzoYV.mjs → HonoEndpointAdaptor-NLlQk5iU.mjs} +4 -5
- package/dist/{HonoEndpointAdaptor-CcvXzoYV.mjs.map → HonoEndpointAdaptor-NLlQk5iU.mjs.map} +1 -1
- package/dist/{HonoEndpointAdaptor-DodwLM0-.cjs → HonoEndpointAdaptor-e6l9eVDU.cjs} +4 -5
- package/dist/{HonoEndpointAdaptor-DodwLM0-.cjs.map → HonoEndpointAdaptor-e6l9eVDU.cjs.map} +1 -1
- package/dist/{HonoEndpointAdaptor-C10W7xCf.d.mts → HonoEndpointAdaptor-kb1ByjUL.d.mts} +3 -3
- package/dist/{Subscriber-DOt3svUC.cjs → Subscriber-BiHjVXtM.cjs} +2 -2
- package/dist/{Subscriber-DOt3svUC.cjs.map → Subscriber-BiHjVXtM.cjs.map} +1 -1
- package/dist/{Subscriber-kCHbH2fZ.mjs → Subscriber-BmPf9GFb.mjs} +2 -2
- package/dist/{Subscriber-kCHbH2fZ.mjs.map → Subscriber-BmPf9GFb.mjs.map} +1 -1
- package/dist/{SubscriberBuilder-Cj2u9k5Q.cjs → SubscriberBuilder-Cp1C-xtT.cjs} +2 -2
- package/dist/{SubscriberBuilder-Cj2u9k5Q.cjs.map → SubscriberBuilder-Cp1C-xtT.cjs.map} +1 -1
- package/dist/{SubscriberBuilder-DmxMU89X.mjs → SubscriberBuilder-DJPEeYDJ.mjs} +2 -2
- package/dist/{SubscriberBuilder-DmxMU89X.mjs.map → SubscriberBuilder-DJPEeYDJ.mjs.map} +1 -1
- package/dist/{TestEndpointAdaptor-wA-fmq4v.cjs → TestEndpointAdaptor-opEisC30.cjs} +2 -2
- package/dist/{TestEndpointAdaptor-wA-fmq4v.cjs.map → TestEndpointAdaptor-opEisC30.cjs.map} +1 -1
- package/dist/{TestEndpointAdaptor-1pPixE6y.mjs → TestEndpointAdaptor-oq5mfglM.mjs} +2 -2
- package/dist/{TestEndpointAdaptor-1pPixE6y.mjs.map → TestEndpointAdaptor-oq5mfglM.mjs.map} +1 -1
- package/dist/adaptors/aws.cjs +11 -11
- package/dist/adaptors/aws.d.cts +1 -1
- package/dist/adaptors/aws.d.mts +1 -1
- package/dist/adaptors/aws.mjs +11 -11
- package/dist/adaptors/hono.cjs +8 -8
- package/dist/adaptors/hono.d.cts +2 -2
- package/dist/adaptors/hono.d.mts +2 -2
- package/dist/adaptors/hono.mjs +8 -8
- package/dist/adaptors/testing.cjs +7 -7
- package/dist/adaptors/testing.d.cts +1 -1
- package/dist/adaptors/testing.d.mts +1 -1
- package/dist/adaptors/testing.mjs +7 -7
- package/dist/crons/Cron.cjs +6 -6
- package/dist/crons/Cron.d.cts +1 -1
- package/dist/crons/Cron.d.mts +1 -1
- package/dist/crons/Cron.mjs +6 -6
- package/dist/crons/CronBuilder.cjs +7 -7
- package/dist/crons/CronBuilder.d.cts +1 -1
- package/dist/crons/CronBuilder.d.mts +1 -1
- package/dist/crons/CronBuilder.mjs +7 -7
- package/dist/crons/index.cjs +7 -7
- package/dist/crons/index.d.cts +5 -5
- package/dist/crons/index.d.mts +5 -5
- package/dist/crons/index.mjs +7 -7
- package/dist/endpoints/AmazonApiGatewayEndpointAdaptor.cjs +7 -7
- package/dist/endpoints/AmazonApiGatewayEndpointAdaptor.d.cts +1 -1
- package/dist/endpoints/AmazonApiGatewayEndpointAdaptor.d.mts +1 -1
- package/dist/endpoints/AmazonApiGatewayEndpointAdaptor.mjs +7 -7
- package/dist/endpoints/AmazonApiGatewayV1EndpointAdaptor.cjs +8 -8
- package/dist/endpoints/AmazonApiGatewayV1EndpointAdaptor.d.cts +1 -1
- package/dist/endpoints/AmazonApiGatewayV1EndpointAdaptor.d.mts +1 -1
- package/dist/endpoints/AmazonApiGatewayV1EndpointAdaptor.mjs +8 -8
- package/dist/endpoints/AmazonApiGatewayV2EndpointAdaptor.cjs +8 -8
- package/dist/endpoints/AmazonApiGatewayV2EndpointAdaptor.d.cts +1 -1
- package/dist/endpoints/AmazonApiGatewayV2EndpointAdaptor.d.mts +1 -1
- package/dist/endpoints/AmazonApiGatewayV2EndpointAdaptor.mjs +8 -8
- package/dist/endpoints/Authorizer.cjs +1 -1
- package/dist/endpoints/Authorizer.mjs +1 -1
- package/dist/endpoints/Endpoint.cjs +6 -6
- package/dist/endpoints/Endpoint.d.cts +1 -1
- package/dist/endpoints/Endpoint.d.mts +1 -1
- package/dist/endpoints/Endpoint.mjs +6 -6
- package/dist/endpoints/EndpointBuilder.cjs +9 -9
- package/dist/endpoints/EndpointBuilder.d.cts +1 -1
- package/dist/endpoints/EndpointBuilder.d.mts +1 -1
- package/dist/endpoints/EndpointBuilder.mjs +9 -9
- package/dist/endpoints/EndpointFactory.cjs +10 -10
- package/dist/endpoints/EndpointFactory.d.cts +4 -4
- package/dist/endpoints/EndpointFactory.d.mts +4 -4
- package/dist/endpoints/EndpointFactory.mjs +10 -10
- package/dist/endpoints/HonoEndpointAdaptor.cjs +8 -8
- package/dist/endpoints/HonoEndpointAdaptor.d.cts +2 -2
- package/dist/endpoints/HonoEndpointAdaptor.d.mts +2 -2
- package/dist/endpoints/HonoEndpointAdaptor.mjs +8 -8
- package/dist/endpoints/TestEndpointAdaptor.cjs +7 -7
- package/dist/endpoints/TestEndpointAdaptor.d.cts +1 -1
- package/dist/endpoints/TestEndpointAdaptor.d.mts +1 -1
- package/dist/endpoints/TestEndpointAdaptor.mjs +7 -7
- package/dist/endpoints/audit.d.cts +1 -1
- package/dist/endpoints/audit.d.mts +1 -1
- package/dist/endpoints/helpers.cjs +7 -7
- package/dist/endpoints/helpers.d.cts +1 -1
- package/dist/endpoints/helpers.d.mts +1 -1
- package/dist/endpoints/helpers.mjs +7 -7
- package/dist/endpoints/index.cjs +14 -10
- package/dist/endpoints/index.cjs.map +1 -1
- package/dist/endpoints/index.d.cts +6 -6
- package/dist/endpoints/index.d.mts +4 -4
- package/dist/endpoints/index.mjs +11 -11
- package/dist/endpoints/index.mjs.map +1 -1
- package/dist/endpoints/processAudits.d.cts +1 -1
- package/dist/endpoints/processAudits.d.mts +1 -1
- package/dist/endpoints/rls.cjs +1 -1
- package/dist/endpoints/rls.d.cts +1 -1
- package/dist/endpoints/rls.d.mts +1 -1
- package/dist/endpoints/rls.mjs +1 -1
- package/dist/functions/AWSLambdaFunction.cjs +6 -6
- package/dist/functions/AWSLambdaFunction.mjs +6 -6
- package/dist/functions/BaseFunctionBuilder.cjs +2 -2
- package/dist/functions/BaseFunctionBuilder.mjs +2 -2
- package/dist/functions/Function.cjs +2 -2
- package/dist/functions/Function.mjs +2 -2
- package/dist/functions/FunctionBuilder.cjs +4 -4
- package/dist/functions/FunctionBuilder.mjs +4 -4
- package/dist/functions/FunctionExecutionWrapper.cjs +5 -5
- package/dist/functions/FunctionExecutionWrapper.mjs +5 -5
- package/dist/functions/TestFunctionAdaptor.cjs +4 -4
- package/dist/functions/TestFunctionAdaptor.mjs +4 -4
- package/dist/functions/index.cjs +5 -5
- package/dist/functions/index.d.cts +1 -1
- package/dist/functions/index.d.mts +1 -1
- package/dist/functions/index.mjs +5 -5
- package/dist/functions-C6EK1xL6.mjs +8 -0
- package/dist/{functions-JhRsNoAZ.mjs.map → functions-C6EK1xL6.mjs.map} +1 -1
- package/dist/{functions-FCb-wWFC.cjs → functions-fTid0RMK.cjs} +2 -2
- package/dist/{functions-FCb-wWFC.cjs.map → functions-fTid0RMK.cjs.map} +1 -1
- package/dist/{helpers-DxxSpLfw.cjs → helpers-BcP1tXAi.cjs} +2 -2
- package/dist/{helpers-DxxSpLfw.cjs.map → helpers-BcP1tXAi.cjs.map} +1 -1
- package/dist/{helpers-C3B2lVrM.mjs → helpers-ByRTDO_m.mjs} +2 -2
- package/dist/{helpers-C3B2lVrM.mjs.map → helpers-ByRTDO_m.mjs.map} +1 -1
- package/dist/{index-Ceo-GuhJ.d.cts → index-CFyaRrck.d.mts} +2 -2
- package/dist/index-CqH4_Ieb.d.cts +10 -0
- package/dist/index.cjs +1 -1
- package/dist/index.mjs +1 -1
- package/dist/{rls-B6WreraR.mjs → rls-Bf3FRwto.mjs} +1 -1
- package/dist/{rls-B6WreraR.mjs.map → rls-Bf3FRwto.mjs.map} +1 -1
- package/dist/{rls-cLpyGWKe.cjs → rls-CmJ7bRsz.cjs} +1 -1
- package/dist/{rls-cLpyGWKe.cjs.map → rls-CmJ7bRsz.cjs.map} +1 -1
- package/dist/subscribers/Subscriber.cjs +2 -2
- package/dist/subscribers/Subscriber.mjs +2 -2
- package/dist/subscribers/SubscriberBuilder.cjs +3 -3
- package/dist/subscribers/SubscriberBuilder.mjs +3 -3
- package/dist/subscribers/index.cjs +3 -3
- package/dist/subscribers/index.d.mts +2 -2
- package/dist/subscribers/index.mjs +3 -3
- package/package.json +64 -13
- package/src/Construct.ts +3 -3
- package/src/__benchmarks__/endpoint.bench.ts +494 -0
- package/src/__benchmarks__/hono-server.bench.ts +249 -0
- package/src/endpoints/EndpointFactory.ts +50 -22
- package/src/endpoints/HonoEndpointAdaptor.ts +1 -2
- package/src/endpoints/index.ts +11 -0
- package/dist/EndpointFactory-BX5qoLCE.mjs.map +0 -1
- package/dist/EndpointFactory-VxyowJQC.cjs.map +0 -1
- package/dist/functions-JhRsNoAZ.mjs +0 -8
- package/dist/index-BtVKIOXm.d.mts +0 -10
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { FunctionBuilder } from "./FunctionBuilder-
|
|
2
|
-
import { FunctionExecutionWrapper } from "./FunctionExecutionWrapper-
|
|
1
|
+
import { FunctionBuilder } from "./FunctionBuilder-CrDYgfiI.mjs";
|
|
2
|
+
import { FunctionExecutionWrapper } from "./FunctionExecutionWrapper-CLDh7Z2_.mjs";
|
|
3
3
|
import { wrapError } from "@geekmidas/errors";
|
|
4
4
|
import middy from "@middy/core";
|
|
5
5
|
|
|
@@ -99,4 +99,4 @@ var AWSLambdaFunction = class extends FunctionExecutionWrapper {
|
|
|
99
99
|
|
|
100
100
|
//#endregion
|
|
101
101
|
export { AWSLambdaFunction };
|
|
102
|
-
//# sourceMappingURL=AWSLambdaFunction-
|
|
102
|
+
//# sourceMappingURL=AWSLambdaFunction-C54a1doJ.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AWSLambdaFunction-H65WfXLt.mjs","names":["envParser: EnvironmentParser<{}>","fn: Function<\n TInput,\n TServices,\n TLogger,\n TOutSchema,\n TEventPublisher,\n TEventPublisherServiceName,\n TAuditStorage,\n TAuditStorageServiceName,\n TDatabase,\n TDatabaseServiceName,\n TAuditAction,\n FunctionHandler<\n TInput,\n TServices,\n TLogger,\n TOutSchema,\n TDatabase,\n TAuditStorage,\n TAuditAction\n >\n >","event: FunctionEvent<\n TEvent,\n TInput,\n TServices,\n TLogger,\n TDatabase,\n TAuditAction\n >"],"sources":["../src/functions/AWSLambdaFunction.ts"],"sourcesContent":["import type { AuditStorage, AuditableAction, Auditor } from '@geekmidas/audit';\nimport type { EnvironmentParser } from '@geekmidas/envkit';\nimport middy, { type MiddlewareObj } from '@middy/core';\nimport type { StandardSchemaV1 } from '@standard-schema/spec';\nimport type { Context, Handler } from 'aws-lambda';\nimport type { Function, FunctionHandler } from './Function';\nimport { FunctionBuilder } from './FunctionBuilder';\n\nimport { wrapError } from '@geekmidas/errors';\nimport type { EventPublisher } from '@geekmidas/events';\nimport type { Logger } from '@geekmidas/logger';\nimport type {\n ComposableStandardSchema,\n InferComposableStandardSchema,\n InferStandardSchema,\n} from '@geekmidas/schema';\nimport type { Service, ServiceRecord } from '@geekmidas/services';\nimport { FunctionExecutionWrapper } from './FunctionExecutionWrapper';\n\nexport type AWSLambdaHandler<TEvent = any, TResult = any> = Handler<\n TEvent,\n TResult\n>;\n\ntype FunctionEvent<\n TEvent,\n TInput extends ComposableStandardSchema | undefined,\n TServices extends Service[],\n TLogger extends Logger,\n TDatabase = undefined,\n TAuditAction extends AuditableAction<string, unknown> = AuditableAction<\n string,\n unknown\n >,\n> = TEvent & {\n parsedInput: InferComposableStandardSchema<TInput>;\n services: ServiceRecord<TServices>;\n logger: TLogger;\n db: TDatabase | undefined;\n auditor: Auditor<TAuditAction> | undefined;\n};\n\ntype Middleware<\n TEvent,\n TInput extends ComposableStandardSchema | undefined,\n TServices extends Service[],\n TLogger extends Logger,\n TOutSchema extends StandardSchemaV1 | undefined,\n TDatabase = undefined,\n TAuditAction extends AuditableAction<string, unknown> = AuditableAction<\n string,\n unknown\n >,\n> = MiddlewareObj<\n FunctionEvent<TEvent, TInput, TServices, TLogger, TDatabase, TAuditAction>,\n InferComposableStandardSchema<TOutSchema>,\n Error,\n Context\n>;\n\nexport class AWSLambdaFunction<\n TInput extends ComposableStandardSchema | undefined = undefined,\n TOutSchema extends StandardSchemaV1 | undefined = undefined,\n TServices extends Service[] = [],\n TLogger extends Logger = Logger,\n TEventPublisher extends EventPublisher<any> | undefined = undefined,\n TEventPublisherServiceName extends string = string,\n TAuditStorage extends AuditStorage | undefined = undefined,\n TAuditStorageServiceName extends string = string,\n TDatabase = undefined,\n TDatabaseServiceName extends string = string,\n TAuditAction extends AuditableAction<string, unknown> = AuditableAction<\n string,\n unknown\n >,\n> extends FunctionExecutionWrapper<\n TInput,\n TOutSchema,\n TServices,\n TLogger,\n TEventPublisher,\n TEventPublisherServiceName,\n TAuditStorage,\n TAuditStorageServiceName,\n TDatabase,\n TDatabaseServiceName,\n TAuditAction\n> {\n constructor(\n envParser: EnvironmentParser<{}>,\n readonly fn: Function<\n TInput,\n TServices,\n TLogger,\n TOutSchema,\n TEventPublisher,\n TEventPublisherServiceName,\n TAuditStorage,\n TAuditStorageServiceName,\n TDatabase,\n TDatabaseServiceName,\n TAuditAction,\n FunctionHandler<\n TInput,\n TServices,\n TLogger,\n TOutSchema,\n TDatabase,\n TAuditStorage,\n TAuditAction\n >\n >,\n ) {\n super(envParser, fn);\n }\n\n private error<TEvent>(): Middleware<\n TEvent,\n TInput,\n TServices,\n TLogger,\n TOutSchema,\n TDatabase,\n TAuditAction\n > {\n return {\n onError: (req) => {\n const logger = req.event?.logger || this.fn.logger;\n logger.error(req.error || {}, 'Error processing function');\n\n // Re-throw the wrapped error to let Lambda handle it\n throw wrapError(req.error);\n },\n };\n }\n\n private baseInput<TEvent>(): Middleware<\n TEvent,\n TInput,\n TServices,\n TLogger,\n TOutSchema,\n TDatabase,\n TAuditAction\n > {\n return {\n before: (req) => {},\n };\n }\n\n private input<\n TEvent extends { input: InferComposableStandardSchema<TInput> },\n >(): Middleware<\n TEvent,\n TInput,\n TServices,\n TLogger,\n TOutSchema,\n TDatabase,\n TAuditAction\n > {\n return {\n before: async (req) => {\n try {\n // Parse input if schema is provided\n if (this.fn.input) {\n const parsedInput =\n await FunctionBuilder.parseComposableStandardSchema(\n req.event,\n this.fn.input,\n );\n\n req.event.parsedInput =\n parsedInput as InferComposableStandardSchema<TInput>;\n } else {\n // If no schema, pass the event as-is\n req.event.parsedInput = req.event as any;\n }\n } catch (error) {\n this.logger.error(\n { error, event: req.event },\n 'Failed to parse input',\n );\n throw error;\n }\n },\n };\n }\n\n private loggerMiddleware<TEvent>(): Middleware<\n TEvent,\n TInput,\n TServices,\n TLogger,\n TOutSchema,\n TDatabase,\n TAuditAction\n > {\n return {\n before: (req) => {\n this._logger = this.fn.logger.child({\n fn: {\n name: req.context.functionName,\n version: req.context.functionVersion,\n memory: req.context.memoryLimitInMB,\n },\n req: {\n id: req.context.awsRequestId,\n },\n }) as TLogger;\n\n req.event.logger = this._logger;\n },\n };\n }\n\n private services<TEvent>(): Middleware<\n TEvent,\n TInput,\n TServices,\n TLogger,\n TOutSchema,\n TDatabase,\n TAuditAction\n > {\n return {\n before: async (req) => {\n req.event.services = await this.getServices();\n },\n };\n }\n\n private database<TEvent>(): Middleware<\n TEvent,\n TInput,\n TServices,\n TLogger,\n TOutSchema,\n TDatabase,\n TAuditAction\n > {\n return {\n before: async (req) => {\n req.event.db = await this.getDatabase();\n },\n };\n }\n\n private auditor<TEvent>(): Middleware<\n TEvent,\n TInput,\n TServices,\n TLogger,\n TOutSchema,\n TDatabase,\n TAuditAction\n > {\n return {\n before: async (req) => {\n req.event.auditor = await this.createAuditor();\n },\n after: async (req) => {\n // Flush any pending audits after successful execution\n if (req.event.auditor) {\n const records = req.event.auditor.getRecords();\n if (records.length > 0) {\n this.logger.debug(\n { auditCount: records.length },\n 'Flushing function audits',\n );\n await req.event.auditor.flush();\n }\n }\n },\n };\n }\n\n private events<TEvent>(): Middleware<\n TEvent,\n TInput,\n TServices,\n TLogger,\n TOutSchema,\n TDatabase,\n TAuditAction\n > {\n return {\n after: async (req) => {\n const response = (req.response ||\n undefined) as InferStandardSchema<TOutSchema>;\n await this.publishEvents(response);\n },\n };\n }\n\n private async _handler<TEvent>(\n event: FunctionEvent<\n TEvent,\n TInput,\n TServices,\n TLogger,\n TDatabase,\n TAuditAction\n >,\n ) {\n // Execute the function with the parsed context\n const result = await this.fn['fn']({\n input: event.parsedInput,\n services: event.services,\n logger: event.logger,\n db: event.db,\n auditor: event.auditor,\n } as any);\n\n // Parse output if schema is provided\n const output = await this.fn.parseOutput(result);\n\n return output;\n }\n\n get handler(): AWSLambdaHandler {\n const handler = this._handler.bind(this);\n\n // Apply middleware in order\n return middy(handler)\n .use(this.loggerMiddleware())\n .use(this.baseInput())\n .use(this.error())\n .use(this.services())\n .use(this.database())\n .use(this.auditor())\n .use(this.input())\n .use(this.events()) as unknown as AWSLambdaHandler;\n }\n}\n"],"mappings":";;;;;;AA4DA,IAAa,oBAAb,cAeU,yBAYR;CACA,YACEA,WACSC,IAsBT;AACA,QAAM,WAAW,GAAG;EAvBX;CAwBV;CAED,AAAQ,QAQN;AACA,SAAO,EACL,SAAS,CAAC,QAAQ;GAChB,MAAM,SAAS,IAAI,OAAO,UAAU,KAAK,GAAG;AAC5C,UAAO,MAAM,IAAI,SAAS,CAAE,GAAE,4BAA4B;AAG1D,SAAM,UAAU,IAAI,MAAM;EAC3B,EACF;CACF;CAED,AAAQ,YAQN;AACA,SAAO,EACL,QAAQ,CAAC,QAAQ,CAAE,EACpB;CACF;CAED,AAAQ,QAUN;AACA,SAAO,EACL,QAAQ,OAAO,QAAQ;AACrB,OAAI;AAEF,QAAI,KAAK,GAAG,OAAO;KACjB,MAAM,cACJ,MAAM,gBAAgB,8BACpB,IAAI,OACJ,KAAK,GAAG,MACT;AAEH,SAAI,MAAM,cACR;IACH,MAEC,KAAI,MAAM,cAAc,IAAI;GAE/B,SAAQ,OAAO;AACd,SAAK,OAAO,MACV;KAAE;KAAO,OAAO,IAAI;IAAO,GAC3B,wBACD;AACD,UAAM;GACP;EACF,EACF;CACF;CAED,AAAQ,mBAQN;AACA,SAAO,EACL,QAAQ,CAAC,QAAQ;AACf,QAAK,UAAU,KAAK,GAAG,OAAO,MAAM;IAClC,IAAI;KACF,MAAM,IAAI,QAAQ;KAClB,SAAS,IAAI,QAAQ;KACrB,QAAQ,IAAI,QAAQ;IACrB;IACD,KAAK,EACH,IAAI,IAAI,QAAQ,aACjB;GACF,EAAC;AAEF,OAAI,MAAM,SAAS,KAAK;EACzB,EACF;CACF;CAED,AAAQ,WAQN;AACA,SAAO,EACL,QAAQ,OAAO,QAAQ;AACrB,OAAI,MAAM,WAAW,MAAM,KAAK,aAAa;EAC9C,EACF;CACF;CAED,AAAQ,WAQN;AACA,SAAO,EACL,QAAQ,OAAO,QAAQ;AACrB,OAAI,MAAM,KAAK,MAAM,KAAK,aAAa;EACxC,EACF;CACF;CAED,AAAQ,UAQN;AACA,SAAO;GACL,QAAQ,OAAO,QAAQ;AACrB,QAAI,MAAM,UAAU,MAAM,KAAK,eAAe;GAC/C;GACD,OAAO,OAAO,QAAQ;AAEpB,QAAI,IAAI,MAAM,SAAS;KACrB,MAAM,UAAU,IAAI,MAAM,QAAQ,YAAY;AAC9C,SAAI,QAAQ,SAAS,GAAG;AACtB,WAAK,OAAO,MACV,EAAE,YAAY,QAAQ,OAAQ,GAC9B,2BACD;AACD,YAAM,IAAI,MAAM,QAAQ,OAAO;KAChC;IACF;GACF;EACF;CACF;CAED,AAAQ,SAQN;AACA,SAAO,EACL,OAAO,OAAO,QAAQ;GACpB,MAAM,WAAY,IAAI;AAEtB,SAAM,KAAK,cAAc,SAAS;EACnC,EACF;CACF;CAED,MAAc,SACZC,OAQA;EAEA,MAAM,SAAS,MAAM,KAAK,GAAG,MAAM;GACjC,OAAO,MAAM;GACb,UAAU,MAAM;GAChB,QAAQ,MAAM;GACd,IAAI,MAAM;GACV,SAAS,MAAM;EAChB,EAAQ;EAGT,MAAM,SAAS,MAAM,KAAK,GAAG,YAAY,OAAO;AAEhD,SAAO;CACR;CAED,IAAI,UAA4B;EAC9B,MAAM,UAAU,KAAK,SAAS,KAAK,KAAK;AAGxC,SAAO,MAAM,QAAQ,CAClB,IAAI,KAAK,kBAAkB,CAAC,CAC5B,IAAI,KAAK,WAAW,CAAC,CACrB,IAAI,KAAK,OAAO,CAAC,CACjB,IAAI,KAAK,UAAU,CAAC,CACpB,IAAI,KAAK,UAAU,CAAC,CACpB,IAAI,KAAK,SAAS,CAAC,CACnB,IAAI,KAAK,OAAO,CAAC,CACjB,IAAI,KAAK,QAAQ,CAAC;CACtB;AACF"}
|
|
1
|
+
{"version":3,"file":"AWSLambdaFunction-C54a1doJ.mjs","names":["envParser: EnvironmentParser<{}>","fn: Function<\n TInput,\n TServices,\n TLogger,\n TOutSchema,\n TEventPublisher,\n TEventPublisherServiceName,\n TAuditStorage,\n TAuditStorageServiceName,\n TDatabase,\n TDatabaseServiceName,\n TAuditAction,\n FunctionHandler<\n TInput,\n TServices,\n TLogger,\n TOutSchema,\n TDatabase,\n TAuditStorage,\n TAuditAction\n >\n >","event: FunctionEvent<\n TEvent,\n TInput,\n TServices,\n TLogger,\n TDatabase,\n TAuditAction\n >"],"sources":["../src/functions/AWSLambdaFunction.ts"],"sourcesContent":["import type { AuditStorage, AuditableAction, Auditor } from '@geekmidas/audit';\nimport type { EnvironmentParser } from '@geekmidas/envkit';\nimport middy, { type MiddlewareObj } from '@middy/core';\nimport type { StandardSchemaV1 } from '@standard-schema/spec';\nimport type { Context, Handler } from 'aws-lambda';\nimport type { Function, FunctionHandler } from './Function';\nimport { FunctionBuilder } from './FunctionBuilder';\n\nimport { wrapError } from '@geekmidas/errors';\nimport type { EventPublisher } from '@geekmidas/events';\nimport type { Logger } from '@geekmidas/logger';\nimport type {\n ComposableStandardSchema,\n InferComposableStandardSchema,\n InferStandardSchema,\n} from '@geekmidas/schema';\nimport type { Service, ServiceRecord } from '@geekmidas/services';\nimport { FunctionExecutionWrapper } from './FunctionExecutionWrapper';\n\nexport type AWSLambdaHandler<TEvent = any, TResult = any> = Handler<\n TEvent,\n TResult\n>;\n\ntype FunctionEvent<\n TEvent,\n TInput extends ComposableStandardSchema | undefined,\n TServices extends Service[],\n TLogger extends Logger,\n TDatabase = undefined,\n TAuditAction extends AuditableAction<string, unknown> = AuditableAction<\n string,\n unknown\n >,\n> = TEvent & {\n parsedInput: InferComposableStandardSchema<TInput>;\n services: ServiceRecord<TServices>;\n logger: TLogger;\n db: TDatabase | undefined;\n auditor: Auditor<TAuditAction> | undefined;\n};\n\ntype Middleware<\n TEvent,\n TInput extends ComposableStandardSchema | undefined,\n TServices extends Service[],\n TLogger extends Logger,\n TOutSchema extends StandardSchemaV1 | undefined,\n TDatabase = undefined,\n TAuditAction extends AuditableAction<string, unknown> = AuditableAction<\n string,\n unknown\n >,\n> = MiddlewareObj<\n FunctionEvent<TEvent, TInput, TServices, TLogger, TDatabase, TAuditAction>,\n InferComposableStandardSchema<TOutSchema>,\n Error,\n Context\n>;\n\nexport class AWSLambdaFunction<\n TInput extends ComposableStandardSchema | undefined = undefined,\n TOutSchema extends StandardSchemaV1 | undefined = undefined,\n TServices extends Service[] = [],\n TLogger extends Logger = Logger,\n TEventPublisher extends EventPublisher<any> | undefined = undefined,\n TEventPublisherServiceName extends string = string,\n TAuditStorage extends AuditStorage | undefined = undefined,\n TAuditStorageServiceName extends string = string,\n TDatabase = undefined,\n TDatabaseServiceName extends string = string,\n TAuditAction extends AuditableAction<string, unknown> = AuditableAction<\n string,\n unknown\n >,\n> extends FunctionExecutionWrapper<\n TInput,\n TOutSchema,\n TServices,\n TLogger,\n TEventPublisher,\n TEventPublisherServiceName,\n TAuditStorage,\n TAuditStorageServiceName,\n TDatabase,\n TDatabaseServiceName,\n TAuditAction\n> {\n constructor(\n envParser: EnvironmentParser<{}>,\n readonly fn: Function<\n TInput,\n TServices,\n TLogger,\n TOutSchema,\n TEventPublisher,\n TEventPublisherServiceName,\n TAuditStorage,\n TAuditStorageServiceName,\n TDatabase,\n TDatabaseServiceName,\n TAuditAction,\n FunctionHandler<\n TInput,\n TServices,\n TLogger,\n TOutSchema,\n TDatabase,\n TAuditStorage,\n TAuditAction\n >\n >,\n ) {\n super(envParser, fn);\n }\n\n private error<TEvent>(): Middleware<\n TEvent,\n TInput,\n TServices,\n TLogger,\n TOutSchema,\n TDatabase,\n TAuditAction\n > {\n return {\n onError: (req) => {\n const logger = req.event?.logger || this.fn.logger;\n logger.error(req.error || {}, 'Error processing function');\n\n // Re-throw the wrapped error to let Lambda handle it\n throw wrapError(req.error);\n },\n };\n }\n\n private baseInput<TEvent>(): Middleware<\n TEvent,\n TInput,\n TServices,\n TLogger,\n TOutSchema,\n TDatabase,\n TAuditAction\n > {\n return {\n before: (req) => {},\n };\n }\n\n private input<\n TEvent extends { input: InferComposableStandardSchema<TInput> },\n >(): Middleware<\n TEvent,\n TInput,\n TServices,\n TLogger,\n TOutSchema,\n TDatabase,\n TAuditAction\n > {\n return {\n before: async (req) => {\n try {\n // Parse input if schema is provided\n if (this.fn.input) {\n const parsedInput =\n await FunctionBuilder.parseComposableStandardSchema(\n req.event,\n this.fn.input,\n );\n\n req.event.parsedInput =\n parsedInput as InferComposableStandardSchema<TInput>;\n } else {\n // If no schema, pass the event as-is\n req.event.parsedInput = req.event as any;\n }\n } catch (error) {\n this.logger.error(\n { error, event: req.event },\n 'Failed to parse input',\n );\n throw error;\n }\n },\n };\n }\n\n private loggerMiddleware<TEvent>(): Middleware<\n TEvent,\n TInput,\n TServices,\n TLogger,\n TOutSchema,\n TDatabase,\n TAuditAction\n > {\n return {\n before: (req) => {\n this._logger = this.fn.logger.child({\n fn: {\n name: req.context.functionName,\n version: req.context.functionVersion,\n memory: req.context.memoryLimitInMB,\n },\n req: {\n id: req.context.awsRequestId,\n },\n }) as TLogger;\n\n req.event.logger = this._logger;\n },\n };\n }\n\n private services<TEvent>(): Middleware<\n TEvent,\n TInput,\n TServices,\n TLogger,\n TOutSchema,\n TDatabase,\n TAuditAction\n > {\n return {\n before: async (req) => {\n req.event.services = await this.getServices();\n },\n };\n }\n\n private database<TEvent>(): Middleware<\n TEvent,\n TInput,\n TServices,\n TLogger,\n TOutSchema,\n TDatabase,\n TAuditAction\n > {\n return {\n before: async (req) => {\n req.event.db = await this.getDatabase();\n },\n };\n }\n\n private auditor<TEvent>(): Middleware<\n TEvent,\n TInput,\n TServices,\n TLogger,\n TOutSchema,\n TDatabase,\n TAuditAction\n > {\n return {\n before: async (req) => {\n req.event.auditor = await this.createAuditor();\n },\n after: async (req) => {\n // Flush any pending audits after successful execution\n if (req.event.auditor) {\n const records = req.event.auditor.getRecords();\n if (records.length > 0) {\n this.logger.debug(\n { auditCount: records.length },\n 'Flushing function audits',\n );\n await req.event.auditor.flush();\n }\n }\n },\n };\n }\n\n private events<TEvent>(): Middleware<\n TEvent,\n TInput,\n TServices,\n TLogger,\n TOutSchema,\n TDatabase,\n TAuditAction\n > {\n return {\n after: async (req) => {\n const response = (req.response ||\n undefined) as InferStandardSchema<TOutSchema>;\n await this.publishEvents(response);\n },\n };\n }\n\n private async _handler<TEvent>(\n event: FunctionEvent<\n TEvent,\n TInput,\n TServices,\n TLogger,\n TDatabase,\n TAuditAction\n >,\n ) {\n // Execute the function with the parsed context\n const result = await this.fn['fn']({\n input: event.parsedInput,\n services: event.services,\n logger: event.logger,\n db: event.db,\n auditor: event.auditor,\n } as any);\n\n // Parse output if schema is provided\n const output = await this.fn.parseOutput(result);\n\n return output;\n }\n\n get handler(): AWSLambdaHandler {\n const handler = this._handler.bind(this);\n\n // Apply middleware in order\n return middy(handler)\n .use(this.loggerMiddleware())\n .use(this.baseInput())\n .use(this.error())\n .use(this.services())\n .use(this.database())\n .use(this.auditor())\n .use(this.input())\n .use(this.events()) as unknown as AWSLambdaHandler;\n }\n}\n"],"mappings":";;;;;;AA4DA,IAAa,oBAAb,cAeU,yBAYR;CACA,YACEA,WACSC,IAsBT;AACA,QAAM,WAAW,GAAG;EAvBX;CAwBV;CAED,AAAQ,QAQN;AACA,SAAO,EACL,SAAS,CAAC,QAAQ;GAChB,MAAM,SAAS,IAAI,OAAO,UAAU,KAAK,GAAG;AAC5C,UAAO,MAAM,IAAI,SAAS,CAAE,GAAE,4BAA4B;AAG1D,SAAM,UAAU,IAAI,MAAM;EAC3B,EACF;CACF;CAED,AAAQ,YAQN;AACA,SAAO,EACL,QAAQ,CAAC,QAAQ,CAAE,EACpB;CACF;CAED,AAAQ,QAUN;AACA,SAAO,EACL,QAAQ,OAAO,QAAQ;AACrB,OAAI;AAEF,QAAI,KAAK,GAAG,OAAO;KACjB,MAAM,cACJ,MAAM,gBAAgB,8BACpB,IAAI,OACJ,KAAK,GAAG,MACT;AAEH,SAAI,MAAM,cACR;IACH,MAEC,KAAI,MAAM,cAAc,IAAI;GAE/B,SAAQ,OAAO;AACd,SAAK,OAAO,MACV;KAAE;KAAO,OAAO,IAAI;IAAO,GAC3B,wBACD;AACD,UAAM;GACP;EACF,EACF;CACF;CAED,AAAQ,mBAQN;AACA,SAAO,EACL,QAAQ,CAAC,QAAQ;AACf,QAAK,UAAU,KAAK,GAAG,OAAO,MAAM;IAClC,IAAI;KACF,MAAM,IAAI,QAAQ;KAClB,SAAS,IAAI,QAAQ;KACrB,QAAQ,IAAI,QAAQ;IACrB;IACD,KAAK,EACH,IAAI,IAAI,QAAQ,aACjB;GACF,EAAC;AAEF,OAAI,MAAM,SAAS,KAAK;EACzB,EACF;CACF;CAED,AAAQ,WAQN;AACA,SAAO,EACL,QAAQ,OAAO,QAAQ;AACrB,OAAI,MAAM,WAAW,MAAM,KAAK,aAAa;EAC9C,EACF;CACF;CAED,AAAQ,WAQN;AACA,SAAO,EACL,QAAQ,OAAO,QAAQ;AACrB,OAAI,MAAM,KAAK,MAAM,KAAK,aAAa;EACxC,EACF;CACF;CAED,AAAQ,UAQN;AACA,SAAO;GACL,QAAQ,OAAO,QAAQ;AACrB,QAAI,MAAM,UAAU,MAAM,KAAK,eAAe;GAC/C;GACD,OAAO,OAAO,QAAQ;AAEpB,QAAI,IAAI,MAAM,SAAS;KACrB,MAAM,UAAU,IAAI,MAAM,QAAQ,YAAY;AAC9C,SAAI,QAAQ,SAAS,GAAG;AACtB,WAAK,OAAO,MACV,EAAE,YAAY,QAAQ,OAAQ,GAC9B,2BACD;AACD,YAAM,IAAI,MAAM,QAAQ,OAAO;KAChC;IACF;GACF;EACF;CACF;CAED,AAAQ,SAQN;AACA,SAAO,EACL,OAAO,OAAO,QAAQ;GACpB,MAAM,WAAY,IAAI;AAEtB,SAAM,KAAK,cAAc,SAAS;EACnC,EACF;CACF;CAED,MAAc,SACZC,OAQA;EAEA,MAAM,SAAS,MAAM,KAAK,GAAG,MAAM;GACjC,OAAO,MAAM;GACb,UAAU,MAAM;GAChB,QAAQ,MAAM;GACd,IAAI,MAAM;GACV,SAAS,MAAM;EAChB,EAAQ;EAGT,MAAM,SAAS,MAAM,KAAK,GAAG,YAAY,OAAO;AAEhD,SAAO;CACR;CAED,IAAI,UAA4B;EAC9B,MAAM,UAAU,KAAK,SAAS,KAAK,KAAK;AAGxC,SAAO,MAAM,QAAQ,CAClB,IAAI,KAAK,kBAAkB,CAAC,CAC5B,IAAI,KAAK,WAAW,CAAC,CACrB,IAAI,KAAK,OAAO,CAAC,CACjB,IAAI,KAAK,UAAU,CAAC,CACpB,IAAI,KAAK,UAAU,CAAC,CACpB,IAAI,KAAK,SAAS,CAAC,CACnB,IAAI,KAAK,OAAO,CAAC,CACjB,IAAI,KAAK,QAAQ,CAAC;CACtB;AACF"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
const require_chunk = require('./chunk-CUT6urMc.cjs');
|
|
2
|
-
const require_FunctionBuilder = require('./FunctionBuilder-
|
|
3
|
-
const require_FunctionExecutionWrapper = require('./FunctionExecutionWrapper-
|
|
2
|
+
const require_FunctionBuilder = require('./FunctionBuilder-DswJ-9sD.cjs');
|
|
3
|
+
const require_FunctionExecutionWrapper = require('./FunctionExecutionWrapper-BYI2bGTL.cjs');
|
|
4
4
|
const __geekmidas_errors = require_chunk.__toESM(require("@geekmidas/errors"));
|
|
5
5
|
const __middy_core = require_chunk.__toESM(require("@middy/core"));
|
|
6
6
|
|
|
@@ -105,4 +105,4 @@ Object.defineProperty(exports, 'AWSLambdaFunction', {
|
|
|
105
105
|
return AWSLambdaFunction;
|
|
106
106
|
}
|
|
107
107
|
});
|
|
108
|
-
//# sourceMappingURL=AWSLambdaFunction-
|
|
108
|
+
//# sourceMappingURL=AWSLambdaFunction-EPGY4s7i.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AWSLambdaFunction-C-fuCLA3.cjs","names":["FunctionExecutionWrapper","envParser: EnvironmentParser<{}>","fn: Function<\n TInput,\n TServices,\n TLogger,\n TOutSchema,\n TEventPublisher,\n TEventPublisherServiceName,\n TAuditStorage,\n TAuditStorageServiceName,\n TDatabase,\n TDatabaseServiceName,\n TAuditAction,\n FunctionHandler<\n TInput,\n TServices,\n TLogger,\n TOutSchema,\n TDatabase,\n TAuditStorage,\n TAuditAction\n >\n >","event: FunctionEvent<\n TEvent,\n TInput,\n TServices,\n TLogger,\n TDatabase,\n TAuditAction\n >"],"sources":["../src/functions/AWSLambdaFunction.ts"],"sourcesContent":["import type { AuditStorage, AuditableAction, Auditor } from '@geekmidas/audit';\nimport type { EnvironmentParser } from '@geekmidas/envkit';\nimport middy, { type MiddlewareObj } from '@middy/core';\nimport type { StandardSchemaV1 } from '@standard-schema/spec';\nimport type { Context, Handler } from 'aws-lambda';\nimport type { Function, FunctionHandler } from './Function';\nimport { FunctionBuilder } from './FunctionBuilder';\n\nimport { wrapError } from '@geekmidas/errors';\nimport type { EventPublisher } from '@geekmidas/events';\nimport type { Logger } from '@geekmidas/logger';\nimport type {\n ComposableStandardSchema,\n InferComposableStandardSchema,\n InferStandardSchema,\n} from '@geekmidas/schema';\nimport type { Service, ServiceRecord } from '@geekmidas/services';\nimport { FunctionExecutionWrapper } from './FunctionExecutionWrapper';\n\nexport type AWSLambdaHandler<TEvent = any, TResult = any> = Handler<\n TEvent,\n TResult\n>;\n\ntype FunctionEvent<\n TEvent,\n TInput extends ComposableStandardSchema | undefined,\n TServices extends Service[],\n TLogger extends Logger,\n TDatabase = undefined,\n TAuditAction extends AuditableAction<string, unknown> = AuditableAction<\n string,\n unknown\n >,\n> = TEvent & {\n parsedInput: InferComposableStandardSchema<TInput>;\n services: ServiceRecord<TServices>;\n logger: TLogger;\n db: TDatabase | undefined;\n auditor: Auditor<TAuditAction> | undefined;\n};\n\ntype Middleware<\n TEvent,\n TInput extends ComposableStandardSchema | undefined,\n TServices extends Service[],\n TLogger extends Logger,\n TOutSchema extends StandardSchemaV1 | undefined,\n TDatabase = undefined,\n TAuditAction extends AuditableAction<string, unknown> = AuditableAction<\n string,\n unknown\n >,\n> = MiddlewareObj<\n FunctionEvent<TEvent, TInput, TServices, TLogger, TDatabase, TAuditAction>,\n InferComposableStandardSchema<TOutSchema>,\n Error,\n Context\n>;\n\nexport class AWSLambdaFunction<\n TInput extends ComposableStandardSchema | undefined = undefined,\n TOutSchema extends StandardSchemaV1 | undefined = undefined,\n TServices extends Service[] = [],\n TLogger extends Logger = Logger,\n TEventPublisher extends EventPublisher<any> | undefined = undefined,\n TEventPublisherServiceName extends string = string,\n TAuditStorage extends AuditStorage | undefined = undefined,\n TAuditStorageServiceName extends string = string,\n TDatabase = undefined,\n TDatabaseServiceName extends string = string,\n TAuditAction extends AuditableAction<string, unknown> = AuditableAction<\n string,\n unknown\n >,\n> extends FunctionExecutionWrapper<\n TInput,\n TOutSchema,\n TServices,\n TLogger,\n TEventPublisher,\n TEventPublisherServiceName,\n TAuditStorage,\n TAuditStorageServiceName,\n TDatabase,\n TDatabaseServiceName,\n TAuditAction\n> {\n constructor(\n envParser: EnvironmentParser<{}>,\n readonly fn: Function<\n TInput,\n TServices,\n TLogger,\n TOutSchema,\n TEventPublisher,\n TEventPublisherServiceName,\n TAuditStorage,\n TAuditStorageServiceName,\n TDatabase,\n TDatabaseServiceName,\n TAuditAction,\n FunctionHandler<\n TInput,\n TServices,\n TLogger,\n TOutSchema,\n TDatabase,\n TAuditStorage,\n TAuditAction\n >\n >,\n ) {\n super(envParser, fn);\n }\n\n private error<TEvent>(): Middleware<\n TEvent,\n TInput,\n TServices,\n TLogger,\n TOutSchema,\n TDatabase,\n TAuditAction\n > {\n return {\n onError: (req) => {\n const logger = req.event?.logger || this.fn.logger;\n logger.error(req.error || {}, 'Error processing function');\n\n // Re-throw the wrapped error to let Lambda handle it\n throw wrapError(req.error);\n },\n };\n }\n\n private baseInput<TEvent>(): Middleware<\n TEvent,\n TInput,\n TServices,\n TLogger,\n TOutSchema,\n TDatabase,\n TAuditAction\n > {\n return {\n before: (req) => {},\n };\n }\n\n private input<\n TEvent extends { input: InferComposableStandardSchema<TInput> },\n >(): Middleware<\n TEvent,\n TInput,\n TServices,\n TLogger,\n TOutSchema,\n TDatabase,\n TAuditAction\n > {\n return {\n before: async (req) => {\n try {\n // Parse input if schema is provided\n if (this.fn.input) {\n const parsedInput =\n await FunctionBuilder.parseComposableStandardSchema(\n req.event,\n this.fn.input,\n );\n\n req.event.parsedInput =\n parsedInput as InferComposableStandardSchema<TInput>;\n } else {\n // If no schema, pass the event as-is\n req.event.parsedInput = req.event as any;\n }\n } catch (error) {\n this.logger.error(\n { error, event: req.event },\n 'Failed to parse input',\n );\n throw error;\n }\n },\n };\n }\n\n private loggerMiddleware<TEvent>(): Middleware<\n TEvent,\n TInput,\n TServices,\n TLogger,\n TOutSchema,\n TDatabase,\n TAuditAction\n > {\n return {\n before: (req) => {\n this._logger = this.fn.logger.child({\n fn: {\n name: req.context.functionName,\n version: req.context.functionVersion,\n memory: req.context.memoryLimitInMB,\n },\n req: {\n id: req.context.awsRequestId,\n },\n }) as TLogger;\n\n req.event.logger = this._logger;\n },\n };\n }\n\n private services<TEvent>(): Middleware<\n TEvent,\n TInput,\n TServices,\n TLogger,\n TOutSchema,\n TDatabase,\n TAuditAction\n > {\n return {\n before: async (req) => {\n req.event.services = await this.getServices();\n },\n };\n }\n\n private database<TEvent>(): Middleware<\n TEvent,\n TInput,\n TServices,\n TLogger,\n TOutSchema,\n TDatabase,\n TAuditAction\n > {\n return {\n before: async (req) => {\n req.event.db = await this.getDatabase();\n },\n };\n }\n\n private auditor<TEvent>(): Middleware<\n TEvent,\n TInput,\n TServices,\n TLogger,\n TOutSchema,\n TDatabase,\n TAuditAction\n > {\n return {\n before: async (req) => {\n req.event.auditor = await this.createAuditor();\n },\n after: async (req) => {\n // Flush any pending audits after successful execution\n if (req.event.auditor) {\n const records = req.event.auditor.getRecords();\n if (records.length > 0) {\n this.logger.debug(\n { auditCount: records.length },\n 'Flushing function audits',\n );\n await req.event.auditor.flush();\n }\n }\n },\n };\n }\n\n private events<TEvent>(): Middleware<\n TEvent,\n TInput,\n TServices,\n TLogger,\n TOutSchema,\n TDatabase,\n TAuditAction\n > {\n return {\n after: async (req) => {\n const response = (req.response ||\n undefined) as InferStandardSchema<TOutSchema>;\n await this.publishEvents(response);\n },\n };\n }\n\n private async _handler<TEvent>(\n event: FunctionEvent<\n TEvent,\n TInput,\n TServices,\n TLogger,\n TDatabase,\n TAuditAction\n >,\n ) {\n // Execute the function with the parsed context\n const result = await this.fn['fn']({\n input: event.parsedInput,\n services: event.services,\n logger: event.logger,\n db: event.db,\n auditor: event.auditor,\n } as any);\n\n // Parse output if schema is provided\n const output = await this.fn.parseOutput(result);\n\n return output;\n }\n\n get handler(): AWSLambdaHandler {\n const handler = this._handler.bind(this);\n\n // Apply middleware in order\n return middy(handler)\n .use(this.loggerMiddleware())\n .use(this.baseInput())\n .use(this.error())\n .use(this.services())\n .use(this.database())\n .use(this.auditor())\n .use(this.input())\n .use(this.events()) as unknown as AWSLambdaHandler;\n }\n}\n"],"mappings":";;;;;;;AA4DA,IAAa,oBAAb,cAeUA,0DAYR;CACA,YACEC,WACSC,IAsBT;AACA,QAAM,WAAW,GAAG;EAvBX;CAwBV;CAED,AAAQ,QAQN;AACA,SAAO,EACL,SAAS,CAAC,QAAQ;GAChB,MAAM,SAAS,IAAI,OAAO,UAAU,KAAK,GAAG;AAC5C,UAAO,MAAM,IAAI,SAAS,CAAE,GAAE,4BAA4B;AAG1D,SAAM,kCAAU,IAAI,MAAM;EAC3B,EACF;CACF;CAED,AAAQ,YAQN;AACA,SAAO,EACL,QAAQ,CAAC,QAAQ,CAAE,EACpB;CACF;CAED,AAAQ,QAUN;AACA,SAAO,EACL,QAAQ,OAAO,QAAQ;AACrB,OAAI;AAEF,QAAI,KAAK,GAAG,OAAO;KACjB,MAAM,cACJ,MAAM,wCAAgB,8BACpB,IAAI,OACJ,KAAK,GAAG,MACT;AAEH,SAAI,MAAM,cACR;IACH,MAEC,KAAI,MAAM,cAAc,IAAI;GAE/B,SAAQ,OAAO;AACd,SAAK,OAAO,MACV;KAAE;KAAO,OAAO,IAAI;IAAO,GAC3B,wBACD;AACD,UAAM;GACP;EACF,EACF;CACF;CAED,AAAQ,mBAQN;AACA,SAAO,EACL,QAAQ,CAAC,QAAQ;AACf,QAAK,UAAU,KAAK,GAAG,OAAO,MAAM;IAClC,IAAI;KACF,MAAM,IAAI,QAAQ;KAClB,SAAS,IAAI,QAAQ;KACrB,QAAQ,IAAI,QAAQ;IACrB;IACD,KAAK,EACH,IAAI,IAAI,QAAQ,aACjB;GACF,EAAC;AAEF,OAAI,MAAM,SAAS,KAAK;EACzB,EACF;CACF;CAED,AAAQ,WAQN;AACA,SAAO,EACL,QAAQ,OAAO,QAAQ;AACrB,OAAI,MAAM,WAAW,MAAM,KAAK,aAAa;EAC9C,EACF;CACF;CAED,AAAQ,WAQN;AACA,SAAO,EACL,QAAQ,OAAO,QAAQ;AACrB,OAAI,MAAM,KAAK,MAAM,KAAK,aAAa;EACxC,EACF;CACF;CAED,AAAQ,UAQN;AACA,SAAO;GACL,QAAQ,OAAO,QAAQ;AACrB,QAAI,MAAM,UAAU,MAAM,KAAK,eAAe;GAC/C;GACD,OAAO,OAAO,QAAQ;AAEpB,QAAI,IAAI,MAAM,SAAS;KACrB,MAAM,UAAU,IAAI,MAAM,QAAQ,YAAY;AAC9C,SAAI,QAAQ,SAAS,GAAG;AACtB,WAAK,OAAO,MACV,EAAE,YAAY,QAAQ,OAAQ,GAC9B,2BACD;AACD,YAAM,IAAI,MAAM,QAAQ,OAAO;KAChC;IACF;GACF;EACF;CACF;CAED,AAAQ,SAQN;AACA,SAAO,EACL,OAAO,OAAO,QAAQ;GACpB,MAAM,WAAY,IAAI;AAEtB,SAAM,KAAK,cAAc,SAAS;EACnC,EACF;CACF;CAED,MAAc,SACZC,OAQA;EAEA,MAAM,SAAS,MAAM,KAAK,GAAG,MAAM;GACjC,OAAO,MAAM;GACb,UAAU,MAAM;GAChB,QAAQ,MAAM;GACd,IAAI,MAAM;GACV,SAAS,MAAM;EAChB,EAAQ;EAGT,MAAM,SAAS,MAAM,KAAK,GAAG,YAAY,OAAO;AAEhD,SAAO;CACR;CAED,IAAI,UAA4B;EAC9B,MAAM,UAAU,KAAK,SAAS,KAAK,KAAK;AAGxC,SAAO,0BAAM,QAAQ,CAClB,IAAI,KAAK,kBAAkB,CAAC,CAC5B,IAAI,KAAK,WAAW,CAAC,CACrB,IAAI,KAAK,OAAO,CAAC,CACjB,IAAI,KAAK,UAAU,CAAC,CACpB,IAAI,KAAK,UAAU,CAAC,CACpB,IAAI,KAAK,SAAS,CAAC,CACnB,IAAI,KAAK,OAAO,CAAC,CACjB,IAAI,KAAK,QAAQ,CAAC;CACtB;AACF"}
|
|
1
|
+
{"version":3,"file":"AWSLambdaFunction-EPGY4s7i.cjs","names":["FunctionExecutionWrapper","envParser: EnvironmentParser<{}>","fn: Function<\n TInput,\n TServices,\n TLogger,\n TOutSchema,\n TEventPublisher,\n TEventPublisherServiceName,\n TAuditStorage,\n TAuditStorageServiceName,\n TDatabase,\n TDatabaseServiceName,\n TAuditAction,\n FunctionHandler<\n TInput,\n TServices,\n TLogger,\n TOutSchema,\n TDatabase,\n TAuditStorage,\n TAuditAction\n >\n >","event: FunctionEvent<\n TEvent,\n TInput,\n TServices,\n TLogger,\n TDatabase,\n TAuditAction\n >"],"sources":["../src/functions/AWSLambdaFunction.ts"],"sourcesContent":["import type { AuditStorage, AuditableAction, Auditor } from '@geekmidas/audit';\nimport type { EnvironmentParser } from '@geekmidas/envkit';\nimport middy, { type MiddlewareObj } from '@middy/core';\nimport type { StandardSchemaV1 } from '@standard-schema/spec';\nimport type { Context, Handler } from 'aws-lambda';\nimport type { Function, FunctionHandler } from './Function';\nimport { FunctionBuilder } from './FunctionBuilder';\n\nimport { wrapError } from '@geekmidas/errors';\nimport type { EventPublisher } from '@geekmidas/events';\nimport type { Logger } from '@geekmidas/logger';\nimport type {\n ComposableStandardSchema,\n InferComposableStandardSchema,\n InferStandardSchema,\n} from '@geekmidas/schema';\nimport type { Service, ServiceRecord } from '@geekmidas/services';\nimport { FunctionExecutionWrapper } from './FunctionExecutionWrapper';\n\nexport type AWSLambdaHandler<TEvent = any, TResult = any> = Handler<\n TEvent,\n TResult\n>;\n\ntype FunctionEvent<\n TEvent,\n TInput extends ComposableStandardSchema | undefined,\n TServices extends Service[],\n TLogger extends Logger,\n TDatabase = undefined,\n TAuditAction extends AuditableAction<string, unknown> = AuditableAction<\n string,\n unknown\n >,\n> = TEvent & {\n parsedInput: InferComposableStandardSchema<TInput>;\n services: ServiceRecord<TServices>;\n logger: TLogger;\n db: TDatabase | undefined;\n auditor: Auditor<TAuditAction> | undefined;\n};\n\ntype Middleware<\n TEvent,\n TInput extends ComposableStandardSchema | undefined,\n TServices extends Service[],\n TLogger extends Logger,\n TOutSchema extends StandardSchemaV1 | undefined,\n TDatabase = undefined,\n TAuditAction extends AuditableAction<string, unknown> = AuditableAction<\n string,\n unknown\n >,\n> = MiddlewareObj<\n FunctionEvent<TEvent, TInput, TServices, TLogger, TDatabase, TAuditAction>,\n InferComposableStandardSchema<TOutSchema>,\n Error,\n Context\n>;\n\nexport class AWSLambdaFunction<\n TInput extends ComposableStandardSchema | undefined = undefined,\n TOutSchema extends StandardSchemaV1 | undefined = undefined,\n TServices extends Service[] = [],\n TLogger extends Logger = Logger,\n TEventPublisher extends EventPublisher<any> | undefined = undefined,\n TEventPublisherServiceName extends string = string,\n TAuditStorage extends AuditStorage | undefined = undefined,\n TAuditStorageServiceName extends string = string,\n TDatabase = undefined,\n TDatabaseServiceName extends string = string,\n TAuditAction extends AuditableAction<string, unknown> = AuditableAction<\n string,\n unknown\n >,\n> extends FunctionExecutionWrapper<\n TInput,\n TOutSchema,\n TServices,\n TLogger,\n TEventPublisher,\n TEventPublisherServiceName,\n TAuditStorage,\n TAuditStorageServiceName,\n TDatabase,\n TDatabaseServiceName,\n TAuditAction\n> {\n constructor(\n envParser: EnvironmentParser<{}>,\n readonly fn: Function<\n TInput,\n TServices,\n TLogger,\n TOutSchema,\n TEventPublisher,\n TEventPublisherServiceName,\n TAuditStorage,\n TAuditStorageServiceName,\n TDatabase,\n TDatabaseServiceName,\n TAuditAction,\n FunctionHandler<\n TInput,\n TServices,\n TLogger,\n TOutSchema,\n TDatabase,\n TAuditStorage,\n TAuditAction\n >\n >,\n ) {\n super(envParser, fn);\n }\n\n private error<TEvent>(): Middleware<\n TEvent,\n TInput,\n TServices,\n TLogger,\n TOutSchema,\n TDatabase,\n TAuditAction\n > {\n return {\n onError: (req) => {\n const logger = req.event?.logger || this.fn.logger;\n logger.error(req.error || {}, 'Error processing function');\n\n // Re-throw the wrapped error to let Lambda handle it\n throw wrapError(req.error);\n },\n };\n }\n\n private baseInput<TEvent>(): Middleware<\n TEvent,\n TInput,\n TServices,\n TLogger,\n TOutSchema,\n TDatabase,\n TAuditAction\n > {\n return {\n before: (req) => {},\n };\n }\n\n private input<\n TEvent extends { input: InferComposableStandardSchema<TInput> },\n >(): Middleware<\n TEvent,\n TInput,\n TServices,\n TLogger,\n TOutSchema,\n TDatabase,\n TAuditAction\n > {\n return {\n before: async (req) => {\n try {\n // Parse input if schema is provided\n if (this.fn.input) {\n const parsedInput =\n await FunctionBuilder.parseComposableStandardSchema(\n req.event,\n this.fn.input,\n );\n\n req.event.parsedInput =\n parsedInput as InferComposableStandardSchema<TInput>;\n } else {\n // If no schema, pass the event as-is\n req.event.parsedInput = req.event as any;\n }\n } catch (error) {\n this.logger.error(\n { error, event: req.event },\n 'Failed to parse input',\n );\n throw error;\n }\n },\n };\n }\n\n private loggerMiddleware<TEvent>(): Middleware<\n TEvent,\n TInput,\n TServices,\n TLogger,\n TOutSchema,\n TDatabase,\n TAuditAction\n > {\n return {\n before: (req) => {\n this._logger = this.fn.logger.child({\n fn: {\n name: req.context.functionName,\n version: req.context.functionVersion,\n memory: req.context.memoryLimitInMB,\n },\n req: {\n id: req.context.awsRequestId,\n },\n }) as TLogger;\n\n req.event.logger = this._logger;\n },\n };\n }\n\n private services<TEvent>(): Middleware<\n TEvent,\n TInput,\n TServices,\n TLogger,\n TOutSchema,\n TDatabase,\n TAuditAction\n > {\n return {\n before: async (req) => {\n req.event.services = await this.getServices();\n },\n };\n }\n\n private database<TEvent>(): Middleware<\n TEvent,\n TInput,\n TServices,\n TLogger,\n TOutSchema,\n TDatabase,\n TAuditAction\n > {\n return {\n before: async (req) => {\n req.event.db = await this.getDatabase();\n },\n };\n }\n\n private auditor<TEvent>(): Middleware<\n TEvent,\n TInput,\n TServices,\n TLogger,\n TOutSchema,\n TDatabase,\n TAuditAction\n > {\n return {\n before: async (req) => {\n req.event.auditor = await this.createAuditor();\n },\n after: async (req) => {\n // Flush any pending audits after successful execution\n if (req.event.auditor) {\n const records = req.event.auditor.getRecords();\n if (records.length > 0) {\n this.logger.debug(\n { auditCount: records.length },\n 'Flushing function audits',\n );\n await req.event.auditor.flush();\n }\n }\n },\n };\n }\n\n private events<TEvent>(): Middleware<\n TEvent,\n TInput,\n TServices,\n TLogger,\n TOutSchema,\n TDatabase,\n TAuditAction\n > {\n return {\n after: async (req) => {\n const response = (req.response ||\n undefined) as InferStandardSchema<TOutSchema>;\n await this.publishEvents(response);\n },\n };\n }\n\n private async _handler<TEvent>(\n event: FunctionEvent<\n TEvent,\n TInput,\n TServices,\n TLogger,\n TDatabase,\n TAuditAction\n >,\n ) {\n // Execute the function with the parsed context\n const result = await this.fn['fn']({\n input: event.parsedInput,\n services: event.services,\n logger: event.logger,\n db: event.db,\n auditor: event.auditor,\n } as any);\n\n // Parse output if schema is provided\n const output = await this.fn.parseOutput(result);\n\n return output;\n }\n\n get handler(): AWSLambdaHandler {\n const handler = this._handler.bind(this);\n\n // Apply middleware in order\n return middy(handler)\n .use(this.loggerMiddleware())\n .use(this.baseInput())\n .use(this.error())\n .use(this.services())\n .use(this.database())\n .use(this.auditor())\n .use(this.input())\n .use(this.events()) as unknown as AWSLambdaHandler;\n }\n}\n"],"mappings":";;;;;;;AA4DA,IAAa,oBAAb,cAeUA,0DAYR;CACA,YACEC,WACSC,IAsBT;AACA,QAAM,WAAW,GAAG;EAvBX;CAwBV;CAED,AAAQ,QAQN;AACA,SAAO,EACL,SAAS,CAAC,QAAQ;GAChB,MAAM,SAAS,IAAI,OAAO,UAAU,KAAK,GAAG;AAC5C,UAAO,MAAM,IAAI,SAAS,CAAE,GAAE,4BAA4B;AAG1D,SAAM,kCAAU,IAAI,MAAM;EAC3B,EACF;CACF;CAED,AAAQ,YAQN;AACA,SAAO,EACL,QAAQ,CAAC,QAAQ,CAAE,EACpB;CACF;CAED,AAAQ,QAUN;AACA,SAAO,EACL,QAAQ,OAAO,QAAQ;AACrB,OAAI;AAEF,QAAI,KAAK,GAAG,OAAO;KACjB,MAAM,cACJ,MAAM,wCAAgB,8BACpB,IAAI,OACJ,KAAK,GAAG,MACT;AAEH,SAAI,MAAM,cACR;IACH,MAEC,KAAI,MAAM,cAAc,IAAI;GAE/B,SAAQ,OAAO;AACd,SAAK,OAAO,MACV;KAAE;KAAO,OAAO,IAAI;IAAO,GAC3B,wBACD;AACD,UAAM;GACP;EACF,EACF;CACF;CAED,AAAQ,mBAQN;AACA,SAAO,EACL,QAAQ,CAAC,QAAQ;AACf,QAAK,UAAU,KAAK,GAAG,OAAO,MAAM;IAClC,IAAI;KACF,MAAM,IAAI,QAAQ;KAClB,SAAS,IAAI,QAAQ;KACrB,QAAQ,IAAI,QAAQ;IACrB;IACD,KAAK,EACH,IAAI,IAAI,QAAQ,aACjB;GACF,EAAC;AAEF,OAAI,MAAM,SAAS,KAAK;EACzB,EACF;CACF;CAED,AAAQ,WAQN;AACA,SAAO,EACL,QAAQ,OAAO,QAAQ;AACrB,OAAI,MAAM,WAAW,MAAM,KAAK,aAAa;EAC9C,EACF;CACF;CAED,AAAQ,WAQN;AACA,SAAO,EACL,QAAQ,OAAO,QAAQ;AACrB,OAAI,MAAM,KAAK,MAAM,KAAK,aAAa;EACxC,EACF;CACF;CAED,AAAQ,UAQN;AACA,SAAO;GACL,QAAQ,OAAO,QAAQ;AACrB,QAAI,MAAM,UAAU,MAAM,KAAK,eAAe;GAC/C;GACD,OAAO,OAAO,QAAQ;AAEpB,QAAI,IAAI,MAAM,SAAS;KACrB,MAAM,UAAU,IAAI,MAAM,QAAQ,YAAY;AAC9C,SAAI,QAAQ,SAAS,GAAG;AACtB,WAAK,OAAO,MACV,EAAE,YAAY,QAAQ,OAAQ,GAC9B,2BACD;AACD,YAAM,IAAI,MAAM,QAAQ,OAAO;KAChC;IACF;GACF;EACF;CACF;CAED,AAAQ,SAQN;AACA,SAAO,EACL,OAAO,OAAO,QAAQ;GACpB,MAAM,WAAY,IAAI;AAEtB,SAAM,KAAK,cAAc,SAAS;EACnC,EACF;CACF;CAED,MAAc,SACZC,OAQA;EAEA,MAAM,SAAS,MAAM,KAAK,GAAG,MAAM;GACjC,OAAO,MAAM;GACb,UAAU,MAAM;GAChB,QAAQ,MAAM;GACd,IAAI,MAAM;GACV,SAAS,MAAM;EAChB,EAAQ;EAGT,MAAM,SAAS,MAAM,KAAK,GAAG,YAAY,OAAO;AAEhD,SAAO;CACR;CAED,IAAI,UAA4B;EAC9B,MAAM,UAAU,KAAK,SAAS,KAAK,KAAK;AAGxC,SAAO,0BAAM,QAAQ,CAClB,IAAI,KAAK,kBAAkB,CAAC,CAC5B,IAAI,KAAK,WAAW,CAAC,CACrB,IAAI,KAAK,OAAO,CAAC,CACjB,IAAI,KAAK,UAAU,CAAC,CACpB,IAAI,KAAK,UAAU,CAAC,CACpB,IAAI,KAAK,SAAS,CAAC,CACnB,IAAI,KAAK,OAAO,CAAC,CACjB,IAAI,KAAK,QAAQ,CAAC;CACtB;AACF"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { publishConstructEvents } from "./publisher-Bw4770Hi.mjs";
|
|
2
|
-
import { Endpoint, ResponseBuilder } from "./Endpoint-
|
|
2
|
+
import { Endpoint, ResponseBuilder } from "./Endpoint-CuOEswxJ.mjs";
|
|
3
3
|
import { createAuditContext, executeWithAuditTransaction } from "./processAudits-Dj8UGqcW.mjs";
|
|
4
4
|
import { withRlsContext } from "@geekmidas/db/rls";
|
|
5
5
|
import set from "lodash.set";
|
|
@@ -203,4 +203,4 @@ var AmazonApiGatewayEndpoint = class {
|
|
|
203
203
|
|
|
204
204
|
//#endregion
|
|
205
205
|
export { AmazonApiGatewayEndpoint };
|
|
206
|
-
//# sourceMappingURL=AmazonApiGatewayEndpointAdaptor-
|
|
206
|
+
//# sourceMappingURL=AmazonApiGatewayEndpointAdaptor-BT9JXihC.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AmazonApiGatewayEndpointAdaptor-pEWzF2uY.mjs","names":["envParser: EnvironmentParser<{}>","endpoint: Endpoint<\n TRoute,\n TMethod,\n TInput,\n TOutSchema,\n TServices,\n TLogger,\n TSession,\n TEventPublisher,\n TEventPublisherServiceName,\n TAuditStorage,\n TAuditStorageServiceName,\n TAuditAction\n >","event: Event<TEvent, TInput, TServices, TLogger, TSession>","db: any","metadata","output","trx: any","result","lambdaResponse: AmazonApiGatewayEndpointHandlerResponse","setCookieHeaders: string[]"],"sources":["../src/endpoints/AmazonApiGatewayEndpointAdaptor.ts"],"sourcesContent":["import type { AuditStorage, AuditableAction } from '@geekmidas/audit';\nimport { withRlsContext } from '@geekmidas/db/rls';\nimport type { Logger } from '@geekmidas/logger';\nimport type { StandardSchemaV1 } from '@standard-schema/spec';\nimport type { HttpMethod } from '../types';\nimport { Endpoint, type EndpointSchemas, ResponseBuilder } from './Endpoint';\n\nimport type { EnvironmentParser } from '@geekmidas/envkit';\nimport middy, { type MiddlewareObj } from '@middy/core';\nimport type {\n APIGatewayProxyEvent,\n APIGatewayProxyEventV2,\n Context,\n} from 'aws-lambda';\nimport set from 'lodash.set';\n\nimport {\n UnauthorizedError,\n UnprocessableEntityError,\n wrapError,\n} from '@geekmidas/errors';\nimport type { EventPublisher } from '@geekmidas/events';\nimport {\n type Service,\n ServiceDiscovery,\n type ServiceRecord,\n} from '@geekmidas/services';\n\nimport type {\n InferComposableStandardSchema,\n InferStandardSchema,\n} from '@geekmidas/schema';\nimport { publishConstructEvents } from '../publisher';\nimport type { CookieFn, HeaderFn } from './Endpoint';\nimport type { MappedAudit } from './audit';\nimport {\n createAuditContext,\n executeWithAuditTransaction,\n} from './processAudits';\n\n// Helper function to publish events\n\nexport abstract class AmazonApiGatewayEndpoint<\n THandler extends\n | AmazonApiGatewayV1EndpointHandler\n | AmazonApiGatewayV2EndpointHandler,\n TEvent extends HandlerEvent<THandler>,\n TRoute extends string,\n TMethod extends HttpMethod,\n TInput extends EndpointSchemas = {},\n TOutSchema extends StandardSchemaV1 | undefined = undefined,\n TServices extends Service[] = [],\n TLogger extends Logger = Logger,\n TSession = unknown,\n TEventPublisher extends EventPublisher<any> | undefined = undefined,\n TEventPublisherServiceName extends string = string,\n TAuditStorage extends AuditStorage | undefined = undefined,\n TAuditStorageServiceName extends string = string,\n TAuditAction extends AuditableAction<string, unknown> = AuditableAction<\n string,\n unknown\n >,\n> {\n constructor(\n protected envParser: EnvironmentParser<{}>,\n protected readonly endpoint: Endpoint<\n TRoute,\n TMethod,\n TInput,\n TOutSchema,\n TServices,\n TLogger,\n TSession,\n TEventPublisher,\n TEventPublisherServiceName,\n TAuditStorage,\n TAuditStorageServiceName,\n TAuditAction\n >,\n ) {}\n\n private error(): Middleware<TEvent, TInput, TServices, TLogger> {\n return {\n onError: (req) => {\n (req.event.logger || this.endpoint.logger).error(\n req.error || {},\n 'Error processing request',\n );\n const wrappedError = wrapError(req.error);\n\n // Set the response with the proper status code from the HttpError\n req.response = {\n statusCode: wrappedError.statusCode,\n body: wrappedError.body,\n };\n },\n };\n }\n abstract getInput(e: TEvent): GetInputResponse;\n\n private input(): Middleware<TEvent, TInput, TServices, TLogger> {\n return {\n before: async (req) => {\n try {\n const { body, query, params } = this.getInput(req.event);\n const headers = req.event.headers as Record<string, string>;\n const header = Endpoint.createHeaders(headers);\n const cookie = Endpoint.createCookies(headers.cookie);\n\n set(req.event, 'body', await this.endpoint.parseInput(body, 'body'));\n\n set(\n req.event,\n 'query',\n await this.endpoint.parseInput(query, 'query'),\n );\n set(\n req.event,\n 'params',\n await this.endpoint.parseInput(params, 'params'),\n );\n set(req.event, 'header', header);\n set(req.event, 'cookie', cookie);\n } catch (error) {\n // Convert validation errors to 422 Unprocessable Entity\n if (error && typeof error === 'object' && Array.isArray(error)) {\n throw new UnprocessableEntityError('Validation failed', error);\n }\n throw error;\n }\n },\n };\n }\n\n abstract getLoggerContext(data: TEvent, context: Context): LoggerContext;\n\n private logger(): Middleware<TEvent, TInput, TServices, TLogger> {\n return {\n before: (req) => {\n req.event.logger = this.endpoint.logger.child({\n route: this.endpoint.route,\n host: req.event.headers?.host,\n method: this.endpoint.method,\n ...this.getLoggerContext(req.event, req.context),\n }) as TLogger;\n },\n };\n }\n private services(): Middleware<TEvent, TInput, TServices, TLogger> {\n return {\n before: async (req) => {\n const logger = req.event.logger as TLogger;\n const serviceDiscovery = ServiceDiscovery.getInstance<\n ServiceRecord<TServices>,\n TLogger\n >(logger, this.envParser);\n\n const services = await serviceDiscovery.register(\n this.endpoint.services,\n );\n\n req.event.services = services;\n },\n };\n }\n\n private authorize(): Middleware<TEvent, TInput, TServices, TLogger> {\n return {\n before: async (req) => {\n const logger = req.event.logger as TLogger;\n const services = req.event.services;\n const header = req.event.header;\n const cookie = req.event.cookie;\n const session = req.event.session as TSession;\n\n const isAuthorized = await this.endpoint.authorize({\n header,\n cookie,\n services,\n logger,\n session,\n });\n\n if (!isAuthorized) {\n logger.warn('Unauthorized access attempt');\n throw new UnauthorizedError(\n 'Unauthorized access to the endpoint',\n 'You do not have permission to access this resource.',\n );\n }\n },\n };\n }\n\n private database(): Middleware<TEvent, TInput, TServices, TLogger> {\n return {\n before: async (req) => {\n if (!this.endpoint.databaseService) {\n return;\n }\n\n const logger = req.event.logger as TLogger;\n const serviceDiscovery = ServiceDiscovery.getInstance<\n ServiceRecord<TServices>,\n TLogger\n >(logger, this.envParser);\n\n const db = await serviceDiscovery\n .register([this.endpoint.databaseService])\n .then(\n (s) =>\n s[this.endpoint.databaseService!.serviceName as keyof typeof s],\n );\n\n (req.event as any).db = db;\n },\n };\n }\n\n private session(): Middleware<TEvent, TInput, TServices, TLogger> {\n return {\n before: async (req) => {\n const logger = req.event.logger as TLogger;\n const services = req.event.services;\n const db = (req.event as any).db;\n req.event.session = (await this.endpoint.getSession({\n logger,\n services,\n header: req.event.header,\n cookie: req.event.cookie,\n ...(db !== undefined && { db }),\n } as any)) as TSession;\n },\n };\n }\n\n private events(): Middleware<TEvent, TInput, TServices, TLogger> {\n return {\n after: async (req) => {\n const event = req.event;\n const response = (event as any)\n .__response as InferStandardSchema<TOutSchema>;\n const statusCode = req.response?.statusCode ?? this.endpoint.status;\n\n // Only publish events on successful responses (2xx status codes)\n // Note: Audits are processed inside the handler's transaction\n if (Endpoint.isSuccessStatus(statusCode)) {\n const logger = event.logger as TLogger;\n const serviceDiscovery = ServiceDiscovery.getInstance<\n ServiceRecord<TServices>,\n TLogger\n >(logger, this.envParser);\n\n // Publish events\n await publishConstructEvents(\n this.endpoint,\n response,\n serviceDiscovery,\n logger,\n );\n }\n },\n };\n }\n\n private async _handler(\n event: Event<TEvent, TInput, TServices, TLogger, TSession>,\n ) {\n const input = this.endpoint.refineInput(event);\n const logger = event.logger as TLogger;\n const serviceDiscovery = ServiceDiscovery.getInstance<\n ServiceRecord<TServices>,\n TLogger\n >(logger, this.envParser);\n\n // Create audit context if audit storage is configured\n const auditContext = await createAuditContext(\n this.endpoint,\n serviceDiscovery,\n logger,\n {\n session: event.session,\n header: event.header,\n cookie: event.cookie,\n services: event.services as Record<string, unknown>,\n },\n );\n\n // Warn if declarative audits are configured but no audit storage\n const audits = this.endpoint.audits as MappedAudit<\n TAuditAction,\n TOutSchema\n >[];\n if (!auditContext && audits?.length) {\n logger.warn('No auditor storage service available');\n }\n\n // Get pre-resolved database from middleware\n const rawDb = (event as any).db;\n\n // Extract RLS context if configured and not bypassed\n const rlsActive =\n this.endpoint.rlsConfig &&\n !this.endpoint.rlsBypass &&\n rawDb !== undefined;\n const rlsContext = rlsActive\n ? await this.endpoint.rlsConfig!.extractor({\n services: event.services as ServiceRecord<TServices>,\n session: event.session,\n header: event.header,\n cookie: event.cookie,\n logger,\n })\n : undefined;\n\n // Execute handler with automatic audit transaction support\n const result = await executeWithAuditTransaction(\n auditContext,\n async (auditor) => {\n // Use audit transaction as db only if the storage uses the same database service\n const sameDatabase =\n auditContext?.storage?.databaseServiceName &&\n auditContext.storage.databaseServiceName ===\n this.endpoint.databaseService?.serviceName;\n const baseDb = sameDatabase\n ? (auditor?.getTransaction?.() ?? rawDb)\n : rawDb;\n\n // Helper to execute handler with given db\n const executeHandler = async (db: any) => {\n const responseBuilder = new ResponseBuilder();\n const response = await this.endpoint.handler(\n {\n header: event.header,\n cookie: event.cookie,\n logger: event.logger,\n services: event.services,\n session: event.session,\n auditor,\n db,\n ...input,\n } as any,\n responseBuilder,\n );\n\n // Check if response has metadata\n let data = response;\n let metadata = responseBuilder.getMetadata();\n\n if (Endpoint.hasMetadata(response)) {\n data = response.data;\n metadata = response.metadata;\n }\n\n const output = this.endpoint.outputSchema\n ? await this.endpoint.parseOutput(data)\n : undefined;\n\n return { output, metadata, responseBuilder };\n };\n\n // If RLS is active, wrap handler with RLS context\n if (rlsActive && rlsContext && baseDb) {\n return withRlsContext(\n baseDb,\n rlsContext,\n async (trx: any) => executeHandler(trx),\n { prefix: this.endpoint.rlsConfig!.prefix },\n );\n }\n\n return executeHandler(baseDb);\n },\n // Process declarative audits after handler (inside transaction)\n async (result, auditor) => {\n if (!audits?.length) return;\n\n for (const audit of audits) {\n if (audit.when && !audit.when(result.output as any)) {\n continue;\n }\n const payload = audit.payload(result.output as any);\n const entityId = audit.entityId?.(result.output as any);\n auditor.audit(audit.type as any, payload as any, {\n table: audit.table,\n entityId,\n });\n }\n },\n // Pass rawDb so storage can reuse existing transactions\n { db: rawDb },\n );\n\n const { output, metadata } = result;\n const body = output !== undefined ? JSON.stringify(output) : undefined;\n\n // Store response for middleware access\n (event as any).__response = output;\n\n // Build response with metadata\n const lambdaResponse: AmazonApiGatewayEndpointHandlerResponse = {\n statusCode: metadata.status ?? this.endpoint.status,\n body,\n };\n\n // Add custom headers\n if (metadata.headers && Object.keys(metadata.headers).length > 0) {\n lambdaResponse.headers = { ...metadata.headers };\n }\n\n // Format cookies as Set-Cookie headers\n if (metadata.cookies && metadata.cookies.size > 0) {\n const setCookieHeaders: string[] = [];\n for (const [name, { value, options }] of metadata.cookies) {\n setCookieHeaders.push(\n Endpoint.formatCookieHeader(name, value, options),\n );\n }\n\n if (setCookieHeaders.length > 0) {\n lambdaResponse.multiValueHeaders = {\n ...lambdaResponse.multiValueHeaders,\n 'Set-Cookie': setCookieHeaders,\n };\n }\n }\n\n return lambdaResponse;\n }\n\n get handler() {\n const handler = this._handler.bind(this);\n return middy(handler)\n .use(this.logger())\n .use(this.error())\n .use(this.services())\n .use(this.input())\n .use(this.database())\n .use(this.session())\n .use(this.authorize())\n .use(this.events()) as unknown as THandler;\n }\n}\n\nexport type Event<\n TEvent extends APIGatewayProxyEvent | APIGatewayProxyEventV2,\n TInput extends EndpointSchemas = {},\n TServices extends Service[] = [],\n TLogger extends Logger = Logger,\n TSession = unknown,\n> = {\n services: ServiceRecord<TServices>;\n logger: TLogger;\n header: HeaderFn;\n cookie: CookieFn;\n session: TSession;\n} & TEvent &\n InferComposableStandardSchema<TInput>;\n\ntype Middleware<\n TEvent extends APIGatewayProxyEvent | APIGatewayProxyEventV2,\n TInput extends EndpointSchemas = {},\n TServices extends Service[] = [],\n TLogger extends Logger = Logger,\n TSession = unknown,\n> = MiddlewareObj<Event<TEvent, TInput, TServices, TLogger, TSession>>;\n\nexport type AmazonApiGatewayEndpointHandlerResponse = {\n statusCode: number;\n body: string | undefined;\n headers?: Record<string, string>;\n multiValueHeaders?: Record<string, string[]>;\n};\n\nexport type LoggerContext = {\n fn: {\n name: string;\n version: string;\n };\n req: {\n id: string | undefined;\n awsRequestId: string;\n path: string;\n ip: string | undefined;\n userAgent: string | undefined;\n };\n};\n\nexport type GetInputResponse = {\n body: any;\n query: any;\n params: any;\n};\n\nexport type AmazonApiGatewayV1EndpointHandler = (\n event: APIGatewayProxyEvent,\n context: Context,\n) => Promise<AmazonApiGatewayEndpointHandlerResponse>;\n\nexport type AmazonApiGatewayV2EndpointHandler = (\n event: APIGatewayProxyEventV2,\n context: Context,\n) => Promise<AmazonApiGatewayEndpointHandlerResponse>;\n\nexport type HandlerEvent<T extends Function> = T extends (\n event: infer E,\n context: Context,\n) => any\n ? E\n : never;\n"],"mappings":";;;;;;;;;;AA0CA,IAAsB,2BAAtB,MAoBE;CACA,YACYA,WACSC,UAcnB;EAfU;EACS;CAcjB;CAEJ,AAAQ,QAAwD;AAC9D,SAAO,EACL,SAAS,CAAC,QAAQ;AAChB,IAAC,IAAI,MAAM,UAAU,KAAK,SAAS,QAAQ,MACzC,IAAI,SAAS,CAAE,GACf,2BACD;GACD,MAAM,eAAe,UAAU,IAAI,MAAM;AAGzC,OAAI,WAAW;IACb,YAAY,aAAa;IACzB,MAAM,aAAa;GACpB;EACF,EACF;CACF;CAGD,AAAQ,QAAwD;AAC9D,SAAO,EACL,QAAQ,OAAO,QAAQ;AACrB,OAAI;IACF,MAAM,EAAE,MAAM,OAAO,QAAQ,GAAG,KAAK,SAAS,IAAI,MAAM;IACxD,MAAM,UAAU,IAAI,MAAM;IAC1B,MAAM,SAAS,SAAS,cAAc,QAAQ;IAC9C,MAAM,SAAS,SAAS,cAAc,QAAQ,OAAO;AAErD,QAAI,IAAI,OAAO,QAAQ,MAAM,KAAK,SAAS,WAAW,MAAM,OAAO,CAAC;AAEpE,QACE,IAAI,OACJ,SACA,MAAM,KAAK,SAAS,WAAW,OAAO,QAAQ,CAC/C;AACD,QACE,IAAI,OACJ,UACA,MAAM,KAAK,SAAS,WAAW,QAAQ,SAAS,CACjD;AACD,QAAI,IAAI,OAAO,UAAU,OAAO;AAChC,QAAI,IAAI,OAAO,UAAU,OAAO;GACjC,SAAQ,OAAO;AAEd,QAAI,gBAAgB,UAAU,YAAY,MAAM,QAAQ,MAAM,CAC5D,OAAM,IAAI,yBAAyB,qBAAqB;AAE1D,UAAM;GACP;EACF,EACF;CACF;CAID,AAAQ,SAAyD;AAC/D,SAAO,EACL,QAAQ,CAAC,QAAQ;AACf,OAAI,MAAM,SAAS,KAAK,SAAS,OAAO,MAAM;IAC5C,OAAO,KAAK,SAAS;IACrB,MAAM,IAAI,MAAM,SAAS;IACzB,QAAQ,KAAK,SAAS;IACtB,GAAG,KAAK,iBAAiB,IAAI,OAAO,IAAI,QAAQ;GACjD,EAAC;EACH,EACF;CACF;CACD,AAAQ,WAA2D;AACjE,SAAO,EACL,QAAQ,OAAO,QAAQ;GACrB,MAAM,SAAS,IAAI,MAAM;GACzB,MAAM,mBAAmB,iBAAiB,YAGxC,QAAQ,KAAK,UAAU;GAEzB,MAAM,WAAW,MAAM,iBAAiB,SACtC,KAAK,SAAS,SACf;AAED,OAAI,MAAM,WAAW;EACtB,EACF;CACF;CAED,AAAQ,YAA4D;AAClE,SAAO,EACL,QAAQ,OAAO,QAAQ;GACrB,MAAM,SAAS,IAAI,MAAM;GACzB,MAAM,WAAW,IAAI,MAAM;GAC3B,MAAM,SAAS,IAAI,MAAM;GACzB,MAAM,SAAS,IAAI,MAAM;GACzB,MAAM,UAAU,IAAI,MAAM;GAE1B,MAAM,eAAe,MAAM,KAAK,SAAS,UAAU;IACjD;IACA;IACA;IACA;IACA;GACD,EAAC;AAEF,QAAK,cAAc;AACjB,WAAO,KAAK,8BAA8B;AAC1C,UAAM,IAAI,kBACR,uCACA;GAEH;EACF,EACF;CACF;CAED,AAAQ,WAA2D;AACjE,SAAO,EACL,QAAQ,OAAO,QAAQ;AACrB,QAAK,KAAK,SAAS,gBACjB;GAGF,MAAM,SAAS,IAAI,MAAM;GACzB,MAAM,mBAAmB,iBAAiB,YAGxC,QAAQ,KAAK,UAAU;GAEzB,MAAM,KAAK,MAAM,iBACd,SAAS,CAAC,KAAK,SAAS,eAAgB,EAAC,CACzC,KACC,CAAC,MACC,EAAE,KAAK,SAAS,gBAAiB,aACpC;AAEH,GAAC,IAAI,MAAc,KAAK;EACzB,EACF;CACF;CAED,AAAQ,UAA0D;AAChE,SAAO,EACL,QAAQ,OAAO,QAAQ;GACrB,MAAM,SAAS,IAAI,MAAM;GACzB,MAAM,WAAW,IAAI,MAAM;GAC3B,MAAM,KAAM,IAAI,MAAc;AAC9B,OAAI,MAAM,UAAW,MAAM,KAAK,SAAS,WAAW;IAClD;IACA;IACA,QAAQ,IAAI,MAAM;IAClB,QAAQ,IAAI,MAAM;IAClB,GAAI,iBAAoB,EAAE,GAAI;GAC/B,EAAQ;EACV,EACF;CACF;CAED,AAAQ,SAAyD;AAC/D,SAAO,EACL,OAAO,OAAO,QAAQ;GACpB,MAAM,QAAQ,IAAI;GAClB,MAAM,WAAY,MACf;GACH,MAAM,aAAa,IAAI,UAAU,cAAc,KAAK,SAAS;AAI7D,OAAI,SAAS,gBAAgB,WAAW,EAAE;IACxC,MAAM,SAAS,MAAM;IACrB,MAAM,mBAAmB,iBAAiB,YAGxC,QAAQ,KAAK,UAAU;AAGzB,UAAM,uBACJ,KAAK,UACL,UACA,kBACA,OACD;GACF;EACF,EACF;CACF;CAED,MAAc,SACZC,OACA;EACA,MAAM,QAAQ,KAAK,SAAS,YAAY,MAAM;EAC9C,MAAM,SAAS,MAAM;EACrB,MAAM,mBAAmB,iBAAiB,YAGxC,QAAQ,KAAK,UAAU;EAGzB,MAAM,eAAe,MAAM,mBACzB,KAAK,UACL,kBACA,QACA;GACE,SAAS,MAAM;GACf,QAAQ,MAAM;GACd,QAAQ,MAAM;GACd,UAAU,MAAM;EACjB,EACF;EAGD,MAAM,SAAS,KAAK,SAAS;AAI7B,OAAK,gBAAgB,QAAQ,OAC3B,QAAO,KAAK,uCAAuC;EAIrD,MAAM,QAAS,MAAc;EAG7B,MAAM,YACJ,KAAK,SAAS,cACb,KAAK,SAAS,aACf;EACF,MAAM,aAAa,YACf,MAAM,KAAK,SAAS,UAAW,UAAU;GACvC,UAAU,MAAM;GAChB,SAAS,MAAM;GACf,QAAQ,MAAM;GACd,QAAQ,MAAM;GACd;EACD,EAAC;EAIN,MAAM,SAAS,MAAM,4BACnB,cACA,OAAO,YAAY;GAEjB,MAAM,eACJ,cAAc,SAAS,uBACvB,aAAa,QAAQ,wBACnB,KAAK,SAAS,iBAAiB;GACnC,MAAM,SAAS,eACV,SAAS,kBAAkB,IAAI,QAChC;GAGJ,MAAM,iBAAiB,OAAOC,OAAY;IACxC,MAAM,kBAAkB,IAAI;IAC5B,MAAM,WAAW,MAAM,KAAK,SAAS,QACnC;KACE,QAAQ,MAAM;KACd,QAAQ,MAAM;KACd,QAAQ,MAAM;KACd,UAAU,MAAM;KAChB,SAAS,MAAM;KACf;KACA;KACA,GAAG;IACJ,GACD,gBACD;IAGD,IAAI,OAAO;IACX,IAAIC,aAAW,gBAAgB,aAAa;AAE5C,QAAI,SAAS,YAAY,SAAS,EAAE;AAClC,YAAO,SAAS;AAChB,kBAAW,SAAS;IACrB;IAED,MAAMC,WAAS,KAAK,SAAS,eACzB,MAAM,KAAK,SAAS,YAAY,KAAK;AAGzC,WAAO;KAAE;KAAQ;KAAU;IAAiB;GAC7C;AAGD,OAAI,aAAa,cAAc,OAC7B,QAAO,eACL,QACA,YACA,OAAOC,QAAa,eAAe,IAAI,EACvC,EAAE,QAAQ,KAAK,SAAS,UAAW,OAAQ,EAC5C;AAGH,UAAO,eAAe,OAAO;EAC9B,GAED,OAAOC,UAAQ,YAAY;AACzB,QAAK,QAAQ,OAAQ;AAErB,QAAK,MAAM,SAAS,QAAQ;AAC1B,QAAI,MAAM,SAAS,MAAM,KAAKA,SAAO,OAAc,CACjD;IAEF,MAAM,UAAU,MAAM,QAAQA,SAAO,OAAc;IACnD,MAAM,WAAW,MAAM,WAAWA,SAAO,OAAc;AACvD,YAAQ,MAAM,MAAM,MAAa,SAAgB;KAC/C,OAAO,MAAM;KACb;IACD,EAAC;GACH;EACF,GAED,EAAE,IAAI,MAAO,EACd;EAED,MAAM,EAAE,QAAQ,UAAU,GAAG;EAC7B,MAAM,OAAO,oBAAuB,KAAK,UAAU,OAAO;AAG1D,EAAC,MAAc,aAAa;EAG5B,MAAMC,iBAA0D;GAC9D,YAAY,SAAS,UAAU,KAAK,SAAS;GAC7C;EACD;AAGD,MAAI,SAAS,WAAW,OAAO,KAAK,SAAS,QAAQ,CAAC,SAAS,EAC7D,gBAAe,UAAU,EAAE,GAAG,SAAS,QAAS;AAIlD,MAAI,SAAS,WAAW,SAAS,QAAQ,OAAO,GAAG;GACjD,MAAMC,mBAA6B,CAAE;AACrC,QAAK,MAAM,CAAC,MAAM,EAAE,OAAO,SAAS,CAAC,IAAI,SAAS,QAChD,kBAAiB,KACf,SAAS,mBAAmB,MAAM,OAAO,QAAQ,CAClD;AAGH,OAAI,iBAAiB,SAAS,EAC5B,gBAAe,oBAAoB;IACjC,GAAG,eAAe;IAClB,cAAc;GACf;EAEJ;AAED,SAAO;CACR;CAED,IAAI,UAAU;EACZ,MAAM,UAAU,KAAK,SAAS,KAAK,KAAK;AACxC,SAAO,MAAM,QAAQ,CAClB,IAAI,KAAK,QAAQ,CAAC,CAClB,IAAI,KAAK,OAAO,CAAC,CACjB,IAAI,KAAK,UAAU,CAAC,CACpB,IAAI,KAAK,OAAO,CAAC,CACjB,IAAI,KAAK,UAAU,CAAC,CACpB,IAAI,KAAK,SAAS,CAAC,CACnB,IAAI,KAAK,WAAW,CAAC,CACrB,IAAI,KAAK,QAAQ,CAAC;CACtB;AACF"}
|
|
1
|
+
{"version":3,"file":"AmazonApiGatewayEndpointAdaptor-BT9JXihC.mjs","names":["envParser: EnvironmentParser<{}>","endpoint: Endpoint<\n TRoute,\n TMethod,\n TInput,\n TOutSchema,\n TServices,\n TLogger,\n TSession,\n TEventPublisher,\n TEventPublisherServiceName,\n TAuditStorage,\n TAuditStorageServiceName,\n TAuditAction\n >","event: Event<TEvent, TInput, TServices, TLogger, TSession>","db: any","metadata","output","trx: any","result","lambdaResponse: AmazonApiGatewayEndpointHandlerResponse","setCookieHeaders: string[]"],"sources":["../src/endpoints/AmazonApiGatewayEndpointAdaptor.ts"],"sourcesContent":["import type { AuditStorage, AuditableAction } from '@geekmidas/audit';\nimport { withRlsContext } from '@geekmidas/db/rls';\nimport type { Logger } from '@geekmidas/logger';\nimport type { StandardSchemaV1 } from '@standard-schema/spec';\nimport type { HttpMethod } from '../types';\nimport { Endpoint, type EndpointSchemas, ResponseBuilder } from './Endpoint';\n\nimport type { EnvironmentParser } from '@geekmidas/envkit';\nimport middy, { type MiddlewareObj } from '@middy/core';\nimport type {\n APIGatewayProxyEvent,\n APIGatewayProxyEventV2,\n Context,\n} from 'aws-lambda';\nimport set from 'lodash.set';\n\nimport {\n UnauthorizedError,\n UnprocessableEntityError,\n wrapError,\n} from '@geekmidas/errors';\nimport type { EventPublisher } from '@geekmidas/events';\nimport {\n type Service,\n ServiceDiscovery,\n type ServiceRecord,\n} from '@geekmidas/services';\n\nimport type {\n InferComposableStandardSchema,\n InferStandardSchema,\n} from '@geekmidas/schema';\nimport { publishConstructEvents } from '../publisher';\nimport type { CookieFn, HeaderFn } from './Endpoint';\nimport type { MappedAudit } from './audit';\nimport {\n createAuditContext,\n executeWithAuditTransaction,\n} from './processAudits';\n\n// Helper function to publish events\n\nexport abstract class AmazonApiGatewayEndpoint<\n THandler extends\n | AmazonApiGatewayV1EndpointHandler\n | AmazonApiGatewayV2EndpointHandler,\n TEvent extends HandlerEvent<THandler>,\n TRoute extends string,\n TMethod extends HttpMethod,\n TInput extends EndpointSchemas = {},\n TOutSchema extends StandardSchemaV1 | undefined = undefined,\n TServices extends Service[] = [],\n TLogger extends Logger = Logger,\n TSession = unknown,\n TEventPublisher extends EventPublisher<any> | undefined = undefined,\n TEventPublisherServiceName extends string = string,\n TAuditStorage extends AuditStorage | undefined = undefined,\n TAuditStorageServiceName extends string = string,\n TAuditAction extends AuditableAction<string, unknown> = AuditableAction<\n string,\n unknown\n >,\n> {\n constructor(\n protected envParser: EnvironmentParser<{}>,\n protected readonly endpoint: Endpoint<\n TRoute,\n TMethod,\n TInput,\n TOutSchema,\n TServices,\n TLogger,\n TSession,\n TEventPublisher,\n TEventPublisherServiceName,\n TAuditStorage,\n TAuditStorageServiceName,\n TAuditAction\n >,\n ) {}\n\n private error(): Middleware<TEvent, TInput, TServices, TLogger> {\n return {\n onError: (req) => {\n (req.event.logger || this.endpoint.logger).error(\n req.error || {},\n 'Error processing request',\n );\n const wrappedError = wrapError(req.error);\n\n // Set the response with the proper status code from the HttpError\n req.response = {\n statusCode: wrappedError.statusCode,\n body: wrappedError.body,\n };\n },\n };\n }\n abstract getInput(e: TEvent): GetInputResponse;\n\n private input(): Middleware<TEvent, TInput, TServices, TLogger> {\n return {\n before: async (req) => {\n try {\n const { body, query, params } = this.getInput(req.event);\n const headers = req.event.headers as Record<string, string>;\n const header = Endpoint.createHeaders(headers);\n const cookie = Endpoint.createCookies(headers.cookie);\n\n set(req.event, 'body', await this.endpoint.parseInput(body, 'body'));\n\n set(\n req.event,\n 'query',\n await this.endpoint.parseInput(query, 'query'),\n );\n set(\n req.event,\n 'params',\n await this.endpoint.parseInput(params, 'params'),\n );\n set(req.event, 'header', header);\n set(req.event, 'cookie', cookie);\n } catch (error) {\n // Convert validation errors to 422 Unprocessable Entity\n if (error && typeof error === 'object' && Array.isArray(error)) {\n throw new UnprocessableEntityError('Validation failed', error);\n }\n throw error;\n }\n },\n };\n }\n\n abstract getLoggerContext(data: TEvent, context: Context): LoggerContext;\n\n private logger(): Middleware<TEvent, TInput, TServices, TLogger> {\n return {\n before: (req) => {\n req.event.logger = this.endpoint.logger.child({\n route: this.endpoint.route,\n host: req.event.headers?.host,\n method: this.endpoint.method,\n ...this.getLoggerContext(req.event, req.context),\n }) as TLogger;\n },\n };\n }\n private services(): Middleware<TEvent, TInput, TServices, TLogger> {\n return {\n before: async (req) => {\n const logger = req.event.logger as TLogger;\n const serviceDiscovery = ServiceDiscovery.getInstance<\n ServiceRecord<TServices>,\n TLogger\n >(logger, this.envParser);\n\n const services = await serviceDiscovery.register(\n this.endpoint.services,\n );\n\n req.event.services = services;\n },\n };\n }\n\n private authorize(): Middleware<TEvent, TInput, TServices, TLogger> {\n return {\n before: async (req) => {\n const logger = req.event.logger as TLogger;\n const services = req.event.services;\n const header = req.event.header;\n const cookie = req.event.cookie;\n const session = req.event.session as TSession;\n\n const isAuthorized = await this.endpoint.authorize({\n header,\n cookie,\n services,\n logger,\n session,\n });\n\n if (!isAuthorized) {\n logger.warn('Unauthorized access attempt');\n throw new UnauthorizedError(\n 'Unauthorized access to the endpoint',\n 'You do not have permission to access this resource.',\n );\n }\n },\n };\n }\n\n private database(): Middleware<TEvent, TInput, TServices, TLogger> {\n return {\n before: async (req) => {\n if (!this.endpoint.databaseService) {\n return;\n }\n\n const logger = req.event.logger as TLogger;\n const serviceDiscovery = ServiceDiscovery.getInstance<\n ServiceRecord<TServices>,\n TLogger\n >(logger, this.envParser);\n\n const db = await serviceDiscovery\n .register([this.endpoint.databaseService])\n .then(\n (s) =>\n s[this.endpoint.databaseService!.serviceName as keyof typeof s],\n );\n\n (req.event as any).db = db;\n },\n };\n }\n\n private session(): Middleware<TEvent, TInput, TServices, TLogger> {\n return {\n before: async (req) => {\n const logger = req.event.logger as TLogger;\n const services = req.event.services;\n const db = (req.event as any).db;\n req.event.session = (await this.endpoint.getSession({\n logger,\n services,\n header: req.event.header,\n cookie: req.event.cookie,\n ...(db !== undefined && { db }),\n } as any)) as TSession;\n },\n };\n }\n\n private events(): Middleware<TEvent, TInput, TServices, TLogger> {\n return {\n after: async (req) => {\n const event = req.event;\n const response = (event as any)\n .__response as InferStandardSchema<TOutSchema>;\n const statusCode = req.response?.statusCode ?? this.endpoint.status;\n\n // Only publish events on successful responses (2xx status codes)\n // Note: Audits are processed inside the handler's transaction\n if (Endpoint.isSuccessStatus(statusCode)) {\n const logger = event.logger as TLogger;\n const serviceDiscovery = ServiceDiscovery.getInstance<\n ServiceRecord<TServices>,\n TLogger\n >(logger, this.envParser);\n\n // Publish events\n await publishConstructEvents(\n this.endpoint,\n response,\n serviceDiscovery,\n logger,\n );\n }\n },\n };\n }\n\n private async _handler(\n event: Event<TEvent, TInput, TServices, TLogger, TSession>,\n ) {\n const input = this.endpoint.refineInput(event);\n const logger = event.logger as TLogger;\n const serviceDiscovery = ServiceDiscovery.getInstance<\n ServiceRecord<TServices>,\n TLogger\n >(logger, this.envParser);\n\n // Create audit context if audit storage is configured\n const auditContext = await createAuditContext(\n this.endpoint,\n serviceDiscovery,\n logger,\n {\n session: event.session,\n header: event.header,\n cookie: event.cookie,\n services: event.services as Record<string, unknown>,\n },\n );\n\n // Warn if declarative audits are configured but no audit storage\n const audits = this.endpoint.audits as MappedAudit<\n TAuditAction,\n TOutSchema\n >[];\n if (!auditContext && audits?.length) {\n logger.warn('No auditor storage service available');\n }\n\n // Get pre-resolved database from middleware\n const rawDb = (event as any).db;\n\n // Extract RLS context if configured and not bypassed\n const rlsActive =\n this.endpoint.rlsConfig &&\n !this.endpoint.rlsBypass &&\n rawDb !== undefined;\n const rlsContext = rlsActive\n ? await this.endpoint.rlsConfig!.extractor({\n services: event.services as ServiceRecord<TServices>,\n session: event.session,\n header: event.header,\n cookie: event.cookie,\n logger,\n })\n : undefined;\n\n // Execute handler with automatic audit transaction support\n const result = await executeWithAuditTransaction(\n auditContext,\n async (auditor) => {\n // Use audit transaction as db only if the storage uses the same database service\n const sameDatabase =\n auditContext?.storage?.databaseServiceName &&\n auditContext.storage.databaseServiceName ===\n this.endpoint.databaseService?.serviceName;\n const baseDb = sameDatabase\n ? (auditor?.getTransaction?.() ?? rawDb)\n : rawDb;\n\n // Helper to execute handler with given db\n const executeHandler = async (db: any) => {\n const responseBuilder = new ResponseBuilder();\n const response = await this.endpoint.handler(\n {\n header: event.header,\n cookie: event.cookie,\n logger: event.logger,\n services: event.services,\n session: event.session,\n auditor,\n db,\n ...input,\n } as any,\n responseBuilder,\n );\n\n // Check if response has metadata\n let data = response;\n let metadata = responseBuilder.getMetadata();\n\n if (Endpoint.hasMetadata(response)) {\n data = response.data;\n metadata = response.metadata;\n }\n\n const output = this.endpoint.outputSchema\n ? await this.endpoint.parseOutput(data)\n : undefined;\n\n return { output, metadata, responseBuilder };\n };\n\n // If RLS is active, wrap handler with RLS context\n if (rlsActive && rlsContext && baseDb) {\n return withRlsContext(\n baseDb,\n rlsContext,\n async (trx: any) => executeHandler(trx),\n { prefix: this.endpoint.rlsConfig!.prefix },\n );\n }\n\n return executeHandler(baseDb);\n },\n // Process declarative audits after handler (inside transaction)\n async (result, auditor) => {\n if (!audits?.length) return;\n\n for (const audit of audits) {\n if (audit.when && !audit.when(result.output as any)) {\n continue;\n }\n const payload = audit.payload(result.output as any);\n const entityId = audit.entityId?.(result.output as any);\n auditor.audit(audit.type as any, payload as any, {\n table: audit.table,\n entityId,\n });\n }\n },\n // Pass rawDb so storage can reuse existing transactions\n { db: rawDb },\n );\n\n const { output, metadata } = result;\n const body = output !== undefined ? JSON.stringify(output) : undefined;\n\n // Store response for middleware access\n (event as any).__response = output;\n\n // Build response with metadata\n const lambdaResponse: AmazonApiGatewayEndpointHandlerResponse = {\n statusCode: metadata.status ?? this.endpoint.status,\n body,\n };\n\n // Add custom headers\n if (metadata.headers && Object.keys(metadata.headers).length > 0) {\n lambdaResponse.headers = { ...metadata.headers };\n }\n\n // Format cookies as Set-Cookie headers\n if (metadata.cookies && metadata.cookies.size > 0) {\n const setCookieHeaders: string[] = [];\n for (const [name, { value, options }] of metadata.cookies) {\n setCookieHeaders.push(\n Endpoint.formatCookieHeader(name, value, options),\n );\n }\n\n if (setCookieHeaders.length > 0) {\n lambdaResponse.multiValueHeaders = {\n ...lambdaResponse.multiValueHeaders,\n 'Set-Cookie': setCookieHeaders,\n };\n }\n }\n\n return lambdaResponse;\n }\n\n get handler() {\n const handler = this._handler.bind(this);\n return middy(handler)\n .use(this.logger())\n .use(this.error())\n .use(this.services())\n .use(this.input())\n .use(this.database())\n .use(this.session())\n .use(this.authorize())\n .use(this.events()) as unknown as THandler;\n }\n}\n\nexport type Event<\n TEvent extends APIGatewayProxyEvent | APIGatewayProxyEventV2,\n TInput extends EndpointSchemas = {},\n TServices extends Service[] = [],\n TLogger extends Logger = Logger,\n TSession = unknown,\n> = {\n services: ServiceRecord<TServices>;\n logger: TLogger;\n header: HeaderFn;\n cookie: CookieFn;\n session: TSession;\n} & TEvent &\n InferComposableStandardSchema<TInput>;\n\ntype Middleware<\n TEvent extends APIGatewayProxyEvent | APIGatewayProxyEventV2,\n TInput extends EndpointSchemas = {},\n TServices extends Service[] = [],\n TLogger extends Logger = Logger,\n TSession = unknown,\n> = MiddlewareObj<Event<TEvent, TInput, TServices, TLogger, TSession>>;\n\nexport type AmazonApiGatewayEndpointHandlerResponse = {\n statusCode: number;\n body: string | undefined;\n headers?: Record<string, string>;\n multiValueHeaders?: Record<string, string[]>;\n};\n\nexport type LoggerContext = {\n fn: {\n name: string;\n version: string;\n };\n req: {\n id: string | undefined;\n awsRequestId: string;\n path: string;\n ip: string | undefined;\n userAgent: string | undefined;\n };\n};\n\nexport type GetInputResponse = {\n body: any;\n query: any;\n params: any;\n};\n\nexport type AmazonApiGatewayV1EndpointHandler = (\n event: APIGatewayProxyEvent,\n context: Context,\n) => Promise<AmazonApiGatewayEndpointHandlerResponse>;\n\nexport type AmazonApiGatewayV2EndpointHandler = (\n event: APIGatewayProxyEventV2,\n context: Context,\n) => Promise<AmazonApiGatewayEndpointHandlerResponse>;\n\nexport type HandlerEvent<T extends Function> = T extends (\n event: infer E,\n context: Context,\n) => any\n ? E\n : never;\n"],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
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-BVGZXFyV.cjs');
|
|
4
4
|
const require_processAudits = require('./processAudits-CzHkPokQ.cjs');
|
|
5
5
|
const __geekmidas_db_rls = require_chunk.__toESM(require("@geekmidas/db/rls"));
|
|
6
6
|
const lodash_set = require_chunk.__toESM(require("lodash.set"));
|
|
@@ -209,4 +209,4 @@ Object.defineProperty(exports, 'AmazonApiGatewayEndpoint', {
|
|
|
209
209
|
return AmazonApiGatewayEndpoint;
|
|
210
210
|
}
|
|
211
211
|
});
|
|
212
|
-
//# sourceMappingURL=AmazonApiGatewayEndpointAdaptor-
|
|
212
|
+
//# sourceMappingURL=AmazonApiGatewayEndpointAdaptor-DNFvvdmW.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AmazonApiGatewayEndpointAdaptor-Bk6ssx3K.cjs","names":["envParser: EnvironmentParser<{}>","endpoint: Endpoint<\n TRoute,\n TMethod,\n TInput,\n TOutSchema,\n TServices,\n TLogger,\n TSession,\n TEventPublisher,\n TEventPublisherServiceName,\n TAuditStorage,\n TAuditStorageServiceName,\n TAuditAction\n >","UnprocessableEntityError","UnauthorizedError","event: Event<TEvent, TInput, TServices, TLogger, TSession>","db: any","ResponseBuilder","metadata","output","trx: any","result","lambdaResponse: AmazonApiGatewayEndpointHandlerResponse","setCookieHeaders: string[]"],"sources":["../src/endpoints/AmazonApiGatewayEndpointAdaptor.ts"],"sourcesContent":["import type { AuditStorage, AuditableAction } from '@geekmidas/audit';\nimport { withRlsContext } from '@geekmidas/db/rls';\nimport type { Logger } from '@geekmidas/logger';\nimport type { StandardSchemaV1 } from '@standard-schema/spec';\nimport type { HttpMethod } from '../types';\nimport { Endpoint, type EndpointSchemas, ResponseBuilder } from './Endpoint';\n\nimport type { EnvironmentParser } from '@geekmidas/envkit';\nimport middy, { type MiddlewareObj } from '@middy/core';\nimport type {\n APIGatewayProxyEvent,\n APIGatewayProxyEventV2,\n Context,\n} from 'aws-lambda';\nimport set from 'lodash.set';\n\nimport {\n UnauthorizedError,\n UnprocessableEntityError,\n wrapError,\n} from '@geekmidas/errors';\nimport type { EventPublisher } from '@geekmidas/events';\nimport {\n type Service,\n ServiceDiscovery,\n type ServiceRecord,\n} from '@geekmidas/services';\n\nimport type {\n InferComposableStandardSchema,\n InferStandardSchema,\n} from '@geekmidas/schema';\nimport { publishConstructEvents } from '../publisher';\nimport type { CookieFn, HeaderFn } from './Endpoint';\nimport type { MappedAudit } from './audit';\nimport {\n createAuditContext,\n executeWithAuditTransaction,\n} from './processAudits';\n\n// Helper function to publish events\n\nexport abstract class AmazonApiGatewayEndpoint<\n THandler extends\n | AmazonApiGatewayV1EndpointHandler\n | AmazonApiGatewayV2EndpointHandler,\n TEvent extends HandlerEvent<THandler>,\n TRoute extends string,\n TMethod extends HttpMethod,\n TInput extends EndpointSchemas = {},\n TOutSchema extends StandardSchemaV1 | undefined = undefined,\n TServices extends Service[] = [],\n TLogger extends Logger = Logger,\n TSession = unknown,\n TEventPublisher extends EventPublisher<any> | undefined = undefined,\n TEventPublisherServiceName extends string = string,\n TAuditStorage extends AuditStorage | undefined = undefined,\n TAuditStorageServiceName extends string = string,\n TAuditAction extends AuditableAction<string, unknown> = AuditableAction<\n string,\n unknown\n >,\n> {\n constructor(\n protected envParser: EnvironmentParser<{}>,\n protected readonly endpoint: Endpoint<\n TRoute,\n TMethod,\n TInput,\n TOutSchema,\n TServices,\n TLogger,\n TSession,\n TEventPublisher,\n TEventPublisherServiceName,\n TAuditStorage,\n TAuditStorageServiceName,\n TAuditAction\n >,\n ) {}\n\n private error(): Middleware<TEvent, TInput, TServices, TLogger> {\n return {\n onError: (req) => {\n (req.event.logger || this.endpoint.logger).error(\n req.error || {},\n 'Error processing request',\n );\n const wrappedError = wrapError(req.error);\n\n // Set the response with the proper status code from the HttpError\n req.response = {\n statusCode: wrappedError.statusCode,\n body: wrappedError.body,\n };\n },\n };\n }\n abstract getInput(e: TEvent): GetInputResponse;\n\n private input(): Middleware<TEvent, TInput, TServices, TLogger> {\n return {\n before: async (req) => {\n try {\n const { body, query, params } = this.getInput(req.event);\n const headers = req.event.headers as Record<string, string>;\n const header = Endpoint.createHeaders(headers);\n const cookie = Endpoint.createCookies(headers.cookie);\n\n set(req.event, 'body', await this.endpoint.parseInput(body, 'body'));\n\n set(\n req.event,\n 'query',\n await this.endpoint.parseInput(query, 'query'),\n );\n set(\n req.event,\n 'params',\n await this.endpoint.parseInput(params, 'params'),\n );\n set(req.event, 'header', header);\n set(req.event, 'cookie', cookie);\n } catch (error) {\n // Convert validation errors to 422 Unprocessable Entity\n if (error && typeof error === 'object' && Array.isArray(error)) {\n throw new UnprocessableEntityError('Validation failed', error);\n }\n throw error;\n }\n },\n };\n }\n\n abstract getLoggerContext(data: TEvent, context: Context): LoggerContext;\n\n private logger(): Middleware<TEvent, TInput, TServices, TLogger> {\n return {\n before: (req) => {\n req.event.logger = this.endpoint.logger.child({\n route: this.endpoint.route,\n host: req.event.headers?.host,\n method: this.endpoint.method,\n ...this.getLoggerContext(req.event, req.context),\n }) as TLogger;\n },\n };\n }\n private services(): Middleware<TEvent, TInput, TServices, TLogger> {\n return {\n before: async (req) => {\n const logger = req.event.logger as TLogger;\n const serviceDiscovery = ServiceDiscovery.getInstance<\n ServiceRecord<TServices>,\n TLogger\n >(logger, this.envParser);\n\n const services = await serviceDiscovery.register(\n this.endpoint.services,\n );\n\n req.event.services = services;\n },\n };\n }\n\n private authorize(): Middleware<TEvent, TInput, TServices, TLogger> {\n return {\n before: async (req) => {\n const logger = req.event.logger as TLogger;\n const services = req.event.services;\n const header = req.event.header;\n const cookie = req.event.cookie;\n const session = req.event.session as TSession;\n\n const isAuthorized = await this.endpoint.authorize({\n header,\n cookie,\n services,\n logger,\n session,\n });\n\n if (!isAuthorized) {\n logger.warn('Unauthorized access attempt');\n throw new UnauthorizedError(\n 'Unauthorized access to the endpoint',\n 'You do not have permission to access this resource.',\n );\n }\n },\n };\n }\n\n private database(): Middleware<TEvent, TInput, TServices, TLogger> {\n return {\n before: async (req) => {\n if (!this.endpoint.databaseService) {\n return;\n }\n\n const logger = req.event.logger as TLogger;\n const serviceDiscovery = ServiceDiscovery.getInstance<\n ServiceRecord<TServices>,\n TLogger\n >(logger, this.envParser);\n\n const db = await serviceDiscovery\n .register([this.endpoint.databaseService])\n .then(\n (s) =>\n s[this.endpoint.databaseService!.serviceName as keyof typeof s],\n );\n\n (req.event as any).db = db;\n },\n };\n }\n\n private session(): Middleware<TEvent, TInput, TServices, TLogger> {\n return {\n before: async (req) => {\n const logger = req.event.logger as TLogger;\n const services = req.event.services;\n const db = (req.event as any).db;\n req.event.session = (await this.endpoint.getSession({\n logger,\n services,\n header: req.event.header,\n cookie: req.event.cookie,\n ...(db !== undefined && { db }),\n } as any)) as TSession;\n },\n };\n }\n\n private events(): Middleware<TEvent, TInput, TServices, TLogger> {\n return {\n after: async (req) => {\n const event = req.event;\n const response = (event as any)\n .__response as InferStandardSchema<TOutSchema>;\n const statusCode = req.response?.statusCode ?? this.endpoint.status;\n\n // Only publish events on successful responses (2xx status codes)\n // Note: Audits are processed inside the handler's transaction\n if (Endpoint.isSuccessStatus(statusCode)) {\n const logger = event.logger as TLogger;\n const serviceDiscovery = ServiceDiscovery.getInstance<\n ServiceRecord<TServices>,\n TLogger\n >(logger, this.envParser);\n\n // Publish events\n await publishConstructEvents(\n this.endpoint,\n response,\n serviceDiscovery,\n logger,\n );\n }\n },\n };\n }\n\n private async _handler(\n event: Event<TEvent, TInput, TServices, TLogger, TSession>,\n ) {\n const input = this.endpoint.refineInput(event);\n const logger = event.logger as TLogger;\n const serviceDiscovery = ServiceDiscovery.getInstance<\n ServiceRecord<TServices>,\n TLogger\n >(logger, this.envParser);\n\n // Create audit context if audit storage is configured\n const auditContext = await createAuditContext(\n this.endpoint,\n serviceDiscovery,\n logger,\n {\n session: event.session,\n header: event.header,\n cookie: event.cookie,\n services: event.services as Record<string, unknown>,\n },\n );\n\n // Warn if declarative audits are configured but no audit storage\n const audits = this.endpoint.audits as MappedAudit<\n TAuditAction,\n TOutSchema\n >[];\n if (!auditContext && audits?.length) {\n logger.warn('No auditor storage service available');\n }\n\n // Get pre-resolved database from middleware\n const rawDb = (event as any).db;\n\n // Extract RLS context if configured and not bypassed\n const rlsActive =\n this.endpoint.rlsConfig &&\n !this.endpoint.rlsBypass &&\n rawDb !== undefined;\n const rlsContext = rlsActive\n ? await this.endpoint.rlsConfig!.extractor({\n services: event.services as ServiceRecord<TServices>,\n session: event.session,\n header: event.header,\n cookie: event.cookie,\n logger,\n })\n : undefined;\n\n // Execute handler with automatic audit transaction support\n const result = await executeWithAuditTransaction(\n auditContext,\n async (auditor) => {\n // Use audit transaction as db only if the storage uses the same database service\n const sameDatabase =\n auditContext?.storage?.databaseServiceName &&\n auditContext.storage.databaseServiceName ===\n this.endpoint.databaseService?.serviceName;\n const baseDb = sameDatabase\n ? (auditor?.getTransaction?.() ?? rawDb)\n : rawDb;\n\n // Helper to execute handler with given db\n const executeHandler = async (db: any) => {\n const responseBuilder = new ResponseBuilder();\n const response = await this.endpoint.handler(\n {\n header: event.header,\n cookie: event.cookie,\n logger: event.logger,\n services: event.services,\n session: event.session,\n auditor,\n db,\n ...input,\n } as any,\n responseBuilder,\n );\n\n // Check if response has metadata\n let data = response;\n let metadata = responseBuilder.getMetadata();\n\n if (Endpoint.hasMetadata(response)) {\n data = response.data;\n metadata = response.metadata;\n }\n\n const output = this.endpoint.outputSchema\n ? await this.endpoint.parseOutput(data)\n : undefined;\n\n return { output, metadata, responseBuilder };\n };\n\n // If RLS is active, wrap handler with RLS context\n if (rlsActive && rlsContext && baseDb) {\n return withRlsContext(\n baseDb,\n rlsContext,\n async (trx: any) => executeHandler(trx),\n { prefix: this.endpoint.rlsConfig!.prefix },\n );\n }\n\n return executeHandler(baseDb);\n },\n // Process declarative audits after handler (inside transaction)\n async (result, auditor) => {\n if (!audits?.length) return;\n\n for (const audit of audits) {\n if (audit.when && !audit.when(result.output as any)) {\n continue;\n }\n const payload = audit.payload(result.output as any);\n const entityId = audit.entityId?.(result.output as any);\n auditor.audit(audit.type as any, payload as any, {\n table: audit.table,\n entityId,\n });\n }\n },\n // Pass rawDb so storage can reuse existing transactions\n { db: rawDb },\n );\n\n const { output, metadata } = result;\n const body = output !== undefined ? JSON.stringify(output) : undefined;\n\n // Store response for middleware access\n (event as any).__response = output;\n\n // Build response with metadata\n const lambdaResponse: AmazonApiGatewayEndpointHandlerResponse = {\n statusCode: metadata.status ?? this.endpoint.status,\n body,\n };\n\n // Add custom headers\n if (metadata.headers && Object.keys(metadata.headers).length > 0) {\n lambdaResponse.headers = { ...metadata.headers };\n }\n\n // Format cookies as Set-Cookie headers\n if (metadata.cookies && metadata.cookies.size > 0) {\n const setCookieHeaders: string[] = [];\n for (const [name, { value, options }] of metadata.cookies) {\n setCookieHeaders.push(\n Endpoint.formatCookieHeader(name, value, options),\n );\n }\n\n if (setCookieHeaders.length > 0) {\n lambdaResponse.multiValueHeaders = {\n ...lambdaResponse.multiValueHeaders,\n 'Set-Cookie': setCookieHeaders,\n };\n }\n }\n\n return lambdaResponse;\n }\n\n get handler() {\n const handler = this._handler.bind(this);\n return middy(handler)\n .use(this.logger())\n .use(this.error())\n .use(this.services())\n .use(this.input())\n .use(this.database())\n .use(this.session())\n .use(this.authorize())\n .use(this.events()) as unknown as THandler;\n }\n}\n\nexport type Event<\n TEvent extends APIGatewayProxyEvent | APIGatewayProxyEventV2,\n TInput extends EndpointSchemas = {},\n TServices extends Service[] = [],\n TLogger extends Logger = Logger,\n TSession = unknown,\n> = {\n services: ServiceRecord<TServices>;\n logger: TLogger;\n header: HeaderFn;\n cookie: CookieFn;\n session: TSession;\n} & TEvent &\n InferComposableStandardSchema<TInput>;\n\ntype Middleware<\n TEvent extends APIGatewayProxyEvent | APIGatewayProxyEventV2,\n TInput extends EndpointSchemas = {},\n TServices extends Service[] = [],\n TLogger extends Logger = Logger,\n TSession = unknown,\n> = MiddlewareObj<Event<TEvent, TInput, TServices, TLogger, TSession>>;\n\nexport type AmazonApiGatewayEndpointHandlerResponse = {\n statusCode: number;\n body: string | undefined;\n headers?: Record<string, string>;\n multiValueHeaders?: Record<string, string[]>;\n};\n\nexport type LoggerContext = {\n fn: {\n name: string;\n version: string;\n };\n req: {\n id: string | undefined;\n awsRequestId: string;\n path: string;\n ip: string | undefined;\n userAgent: string | undefined;\n };\n};\n\nexport type GetInputResponse = {\n body: any;\n query: any;\n params: any;\n};\n\nexport type AmazonApiGatewayV1EndpointHandler = (\n event: APIGatewayProxyEvent,\n context: Context,\n) => Promise<AmazonApiGatewayEndpointHandlerResponse>;\n\nexport type AmazonApiGatewayV2EndpointHandler = (\n event: APIGatewayProxyEventV2,\n context: Context,\n) => Promise<AmazonApiGatewayEndpointHandlerResponse>;\n\nexport type HandlerEvent<T extends Function> = T extends (\n event: infer E,\n context: Context,\n) => any\n ? E\n : never;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"AmazonApiGatewayEndpointAdaptor-DNFvvdmW.cjs","names":["envParser: EnvironmentParser<{}>","endpoint: Endpoint<\n TRoute,\n TMethod,\n TInput,\n TOutSchema,\n TServices,\n TLogger,\n TSession,\n TEventPublisher,\n TEventPublisherServiceName,\n TAuditStorage,\n TAuditStorageServiceName,\n TAuditAction\n >","UnprocessableEntityError","UnauthorizedError","event: Event<TEvent, TInput, TServices, TLogger, TSession>","db: any","ResponseBuilder","metadata","output","trx: any","result","lambdaResponse: AmazonApiGatewayEndpointHandlerResponse","setCookieHeaders: string[]"],"sources":["../src/endpoints/AmazonApiGatewayEndpointAdaptor.ts"],"sourcesContent":["import type { AuditStorage, AuditableAction } from '@geekmidas/audit';\nimport { withRlsContext } from '@geekmidas/db/rls';\nimport type { Logger } from '@geekmidas/logger';\nimport type { StandardSchemaV1 } from '@standard-schema/spec';\nimport type { HttpMethod } from '../types';\nimport { Endpoint, type EndpointSchemas, ResponseBuilder } from './Endpoint';\n\nimport type { EnvironmentParser } from '@geekmidas/envkit';\nimport middy, { type MiddlewareObj } from '@middy/core';\nimport type {\n APIGatewayProxyEvent,\n APIGatewayProxyEventV2,\n Context,\n} from 'aws-lambda';\nimport set from 'lodash.set';\n\nimport {\n UnauthorizedError,\n UnprocessableEntityError,\n wrapError,\n} from '@geekmidas/errors';\nimport type { EventPublisher } from '@geekmidas/events';\nimport {\n type Service,\n ServiceDiscovery,\n type ServiceRecord,\n} from '@geekmidas/services';\n\nimport type {\n InferComposableStandardSchema,\n InferStandardSchema,\n} from '@geekmidas/schema';\nimport { publishConstructEvents } from '../publisher';\nimport type { CookieFn, HeaderFn } from './Endpoint';\nimport type { MappedAudit } from './audit';\nimport {\n createAuditContext,\n executeWithAuditTransaction,\n} from './processAudits';\n\n// Helper function to publish events\n\nexport abstract class AmazonApiGatewayEndpoint<\n THandler extends\n | AmazonApiGatewayV1EndpointHandler\n | AmazonApiGatewayV2EndpointHandler,\n TEvent extends HandlerEvent<THandler>,\n TRoute extends string,\n TMethod extends HttpMethod,\n TInput extends EndpointSchemas = {},\n TOutSchema extends StandardSchemaV1 | undefined = undefined,\n TServices extends Service[] = [],\n TLogger extends Logger = Logger,\n TSession = unknown,\n TEventPublisher extends EventPublisher<any> | undefined = undefined,\n TEventPublisherServiceName extends string = string,\n TAuditStorage extends AuditStorage | undefined = undefined,\n TAuditStorageServiceName extends string = string,\n TAuditAction extends AuditableAction<string, unknown> = AuditableAction<\n string,\n unknown\n >,\n> {\n constructor(\n protected envParser: EnvironmentParser<{}>,\n protected readonly endpoint: Endpoint<\n TRoute,\n TMethod,\n TInput,\n TOutSchema,\n TServices,\n TLogger,\n TSession,\n TEventPublisher,\n TEventPublisherServiceName,\n TAuditStorage,\n TAuditStorageServiceName,\n TAuditAction\n >,\n ) {}\n\n private error(): Middleware<TEvent, TInput, TServices, TLogger> {\n return {\n onError: (req) => {\n (req.event.logger || this.endpoint.logger).error(\n req.error || {},\n 'Error processing request',\n );\n const wrappedError = wrapError(req.error);\n\n // Set the response with the proper status code from the HttpError\n req.response = {\n statusCode: wrappedError.statusCode,\n body: wrappedError.body,\n };\n },\n };\n }\n abstract getInput(e: TEvent): GetInputResponse;\n\n private input(): Middleware<TEvent, TInput, TServices, TLogger> {\n return {\n before: async (req) => {\n try {\n const { body, query, params } = this.getInput(req.event);\n const headers = req.event.headers as Record<string, string>;\n const header = Endpoint.createHeaders(headers);\n const cookie = Endpoint.createCookies(headers.cookie);\n\n set(req.event, 'body', await this.endpoint.parseInput(body, 'body'));\n\n set(\n req.event,\n 'query',\n await this.endpoint.parseInput(query, 'query'),\n );\n set(\n req.event,\n 'params',\n await this.endpoint.parseInput(params, 'params'),\n );\n set(req.event, 'header', header);\n set(req.event, 'cookie', cookie);\n } catch (error) {\n // Convert validation errors to 422 Unprocessable Entity\n if (error && typeof error === 'object' && Array.isArray(error)) {\n throw new UnprocessableEntityError('Validation failed', error);\n }\n throw error;\n }\n },\n };\n }\n\n abstract getLoggerContext(data: TEvent, context: Context): LoggerContext;\n\n private logger(): Middleware<TEvent, TInput, TServices, TLogger> {\n return {\n before: (req) => {\n req.event.logger = this.endpoint.logger.child({\n route: this.endpoint.route,\n host: req.event.headers?.host,\n method: this.endpoint.method,\n ...this.getLoggerContext(req.event, req.context),\n }) as TLogger;\n },\n };\n }\n private services(): Middleware<TEvent, TInput, TServices, TLogger> {\n return {\n before: async (req) => {\n const logger = req.event.logger as TLogger;\n const serviceDiscovery = ServiceDiscovery.getInstance<\n ServiceRecord<TServices>,\n TLogger\n >(logger, this.envParser);\n\n const services = await serviceDiscovery.register(\n this.endpoint.services,\n );\n\n req.event.services = services;\n },\n };\n }\n\n private authorize(): Middleware<TEvent, TInput, TServices, TLogger> {\n return {\n before: async (req) => {\n const logger = req.event.logger as TLogger;\n const services = req.event.services;\n const header = req.event.header;\n const cookie = req.event.cookie;\n const session = req.event.session as TSession;\n\n const isAuthorized = await this.endpoint.authorize({\n header,\n cookie,\n services,\n logger,\n session,\n });\n\n if (!isAuthorized) {\n logger.warn('Unauthorized access attempt');\n throw new UnauthorizedError(\n 'Unauthorized access to the endpoint',\n 'You do not have permission to access this resource.',\n );\n }\n },\n };\n }\n\n private database(): Middleware<TEvent, TInput, TServices, TLogger> {\n return {\n before: async (req) => {\n if (!this.endpoint.databaseService) {\n return;\n }\n\n const logger = req.event.logger as TLogger;\n const serviceDiscovery = ServiceDiscovery.getInstance<\n ServiceRecord<TServices>,\n TLogger\n >(logger, this.envParser);\n\n const db = await serviceDiscovery\n .register([this.endpoint.databaseService])\n .then(\n (s) =>\n s[this.endpoint.databaseService!.serviceName as keyof typeof s],\n );\n\n (req.event as any).db = db;\n },\n };\n }\n\n private session(): Middleware<TEvent, TInput, TServices, TLogger> {\n return {\n before: async (req) => {\n const logger = req.event.logger as TLogger;\n const services = req.event.services;\n const db = (req.event as any).db;\n req.event.session = (await this.endpoint.getSession({\n logger,\n services,\n header: req.event.header,\n cookie: req.event.cookie,\n ...(db !== undefined && { db }),\n } as any)) as TSession;\n },\n };\n }\n\n private events(): Middleware<TEvent, TInput, TServices, TLogger> {\n return {\n after: async (req) => {\n const event = req.event;\n const response = (event as any)\n .__response as InferStandardSchema<TOutSchema>;\n const statusCode = req.response?.statusCode ?? this.endpoint.status;\n\n // Only publish events on successful responses (2xx status codes)\n // Note: Audits are processed inside the handler's transaction\n if (Endpoint.isSuccessStatus(statusCode)) {\n const logger = event.logger as TLogger;\n const serviceDiscovery = ServiceDiscovery.getInstance<\n ServiceRecord<TServices>,\n TLogger\n >(logger, this.envParser);\n\n // Publish events\n await publishConstructEvents(\n this.endpoint,\n response,\n serviceDiscovery,\n logger,\n );\n }\n },\n };\n }\n\n private async _handler(\n event: Event<TEvent, TInput, TServices, TLogger, TSession>,\n ) {\n const input = this.endpoint.refineInput(event);\n const logger = event.logger as TLogger;\n const serviceDiscovery = ServiceDiscovery.getInstance<\n ServiceRecord<TServices>,\n TLogger\n >(logger, this.envParser);\n\n // Create audit context if audit storage is configured\n const auditContext = await createAuditContext(\n this.endpoint,\n serviceDiscovery,\n logger,\n {\n session: event.session,\n header: event.header,\n cookie: event.cookie,\n services: event.services as Record<string, unknown>,\n },\n );\n\n // Warn if declarative audits are configured but no audit storage\n const audits = this.endpoint.audits as MappedAudit<\n TAuditAction,\n TOutSchema\n >[];\n if (!auditContext && audits?.length) {\n logger.warn('No auditor storage service available');\n }\n\n // Get pre-resolved database from middleware\n const rawDb = (event as any).db;\n\n // Extract RLS context if configured and not bypassed\n const rlsActive =\n this.endpoint.rlsConfig &&\n !this.endpoint.rlsBypass &&\n rawDb !== undefined;\n const rlsContext = rlsActive\n ? await this.endpoint.rlsConfig!.extractor({\n services: event.services as ServiceRecord<TServices>,\n session: event.session,\n header: event.header,\n cookie: event.cookie,\n logger,\n })\n : undefined;\n\n // Execute handler with automatic audit transaction support\n const result = await executeWithAuditTransaction(\n auditContext,\n async (auditor) => {\n // Use audit transaction as db only if the storage uses the same database service\n const sameDatabase =\n auditContext?.storage?.databaseServiceName &&\n auditContext.storage.databaseServiceName ===\n this.endpoint.databaseService?.serviceName;\n const baseDb = sameDatabase\n ? (auditor?.getTransaction?.() ?? rawDb)\n : rawDb;\n\n // Helper to execute handler with given db\n const executeHandler = async (db: any) => {\n const responseBuilder = new ResponseBuilder();\n const response = await this.endpoint.handler(\n {\n header: event.header,\n cookie: event.cookie,\n logger: event.logger,\n services: event.services,\n session: event.session,\n auditor,\n db,\n ...input,\n } as any,\n responseBuilder,\n );\n\n // Check if response has metadata\n let data = response;\n let metadata = responseBuilder.getMetadata();\n\n if (Endpoint.hasMetadata(response)) {\n data = response.data;\n metadata = response.metadata;\n }\n\n const output = this.endpoint.outputSchema\n ? await this.endpoint.parseOutput(data)\n : undefined;\n\n return { output, metadata, responseBuilder };\n };\n\n // If RLS is active, wrap handler with RLS context\n if (rlsActive && rlsContext && baseDb) {\n return withRlsContext(\n baseDb,\n rlsContext,\n async (trx: any) => executeHandler(trx),\n { prefix: this.endpoint.rlsConfig!.prefix },\n );\n }\n\n return executeHandler(baseDb);\n },\n // Process declarative audits after handler (inside transaction)\n async (result, auditor) => {\n if (!audits?.length) return;\n\n for (const audit of audits) {\n if (audit.when && !audit.when(result.output as any)) {\n continue;\n }\n const payload = audit.payload(result.output as any);\n const entityId = audit.entityId?.(result.output as any);\n auditor.audit(audit.type as any, payload as any, {\n table: audit.table,\n entityId,\n });\n }\n },\n // Pass rawDb so storage can reuse existing transactions\n { db: rawDb },\n );\n\n const { output, metadata } = result;\n const body = output !== undefined ? JSON.stringify(output) : undefined;\n\n // Store response for middleware access\n (event as any).__response = output;\n\n // Build response with metadata\n const lambdaResponse: AmazonApiGatewayEndpointHandlerResponse = {\n statusCode: metadata.status ?? this.endpoint.status,\n body,\n };\n\n // Add custom headers\n if (metadata.headers && Object.keys(metadata.headers).length > 0) {\n lambdaResponse.headers = { ...metadata.headers };\n }\n\n // Format cookies as Set-Cookie headers\n if (metadata.cookies && metadata.cookies.size > 0) {\n const setCookieHeaders: string[] = [];\n for (const [name, { value, options }] of metadata.cookies) {\n setCookieHeaders.push(\n Endpoint.formatCookieHeader(name, value, options),\n );\n }\n\n if (setCookieHeaders.length > 0) {\n lambdaResponse.multiValueHeaders = {\n ...lambdaResponse.multiValueHeaders,\n 'Set-Cookie': setCookieHeaders,\n };\n }\n }\n\n return lambdaResponse;\n }\n\n get handler() {\n const handler = this._handler.bind(this);\n return middy(handler)\n .use(this.logger())\n .use(this.error())\n .use(this.services())\n .use(this.input())\n .use(this.database())\n .use(this.session())\n .use(this.authorize())\n .use(this.events()) as unknown as THandler;\n }\n}\n\nexport type Event<\n TEvent extends APIGatewayProxyEvent | APIGatewayProxyEventV2,\n TInput extends EndpointSchemas = {},\n TServices extends Service[] = [],\n TLogger extends Logger = Logger,\n TSession = unknown,\n> = {\n services: ServiceRecord<TServices>;\n logger: TLogger;\n header: HeaderFn;\n cookie: CookieFn;\n session: TSession;\n} & TEvent &\n InferComposableStandardSchema<TInput>;\n\ntype Middleware<\n TEvent extends APIGatewayProxyEvent | APIGatewayProxyEventV2,\n TInput extends EndpointSchemas = {},\n TServices extends Service[] = [],\n TLogger extends Logger = Logger,\n TSession = unknown,\n> = MiddlewareObj<Event<TEvent, TInput, TServices, TLogger, TSession>>;\n\nexport type AmazonApiGatewayEndpointHandlerResponse = {\n statusCode: number;\n body: string | undefined;\n headers?: Record<string, string>;\n multiValueHeaders?: Record<string, string[]>;\n};\n\nexport type LoggerContext = {\n fn: {\n name: string;\n version: string;\n };\n req: {\n id: string | undefined;\n awsRequestId: string;\n path: string;\n ip: string | undefined;\n userAgent: string | undefined;\n };\n};\n\nexport type GetInputResponse = {\n body: any;\n query: any;\n params: any;\n};\n\nexport type AmazonApiGatewayV1EndpointHandler = (\n event: APIGatewayProxyEvent,\n context: Context,\n) => Promise<AmazonApiGatewayEndpointHandlerResponse>;\n\nexport type AmazonApiGatewayV2EndpointHandler = (\n event: APIGatewayProxyEventV2,\n context: Context,\n) => Promise<AmazonApiGatewayEndpointHandlerResponse>;\n\nexport type HandlerEvent<T extends Function> = T extends (\n event: infer E,\n context: Context,\n) => any\n ? E\n : never;\n"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { AmazonApiGatewayEndpoint } from "./AmazonApiGatewayEndpointAdaptor-
|
|
1
|
+
import { AmazonApiGatewayEndpoint } from "./AmazonApiGatewayEndpointAdaptor-BT9JXihC.mjs";
|
|
2
2
|
import { parseQueryParams } from "./parseQueryParams-CHINupbZ.mjs";
|
|
3
3
|
|
|
4
4
|
//#region src/endpoints/AmazonApiGatewayV1EndpointAdaptor.ts
|
|
@@ -39,4 +39,4 @@ var AmazonApiGatewayV1Endpoint = class extends AmazonApiGatewayEndpoint {
|
|
|
39
39
|
|
|
40
40
|
//#endregion
|
|
41
41
|
export { AmazonApiGatewayV1Endpoint };
|
|
42
|
-
//# sourceMappingURL=AmazonApiGatewayV1EndpointAdaptor-
|
|
42
|
+
//# sourceMappingURL=AmazonApiGatewayV1EndpointAdaptor-BbkfC1dk.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AmazonApiGatewayV1EndpointAdaptor-
|
|
1
|
+
{"version":3,"file":"AmazonApiGatewayV1EndpointAdaptor-BbkfC1dk.mjs","names":["e: APIGatewayProxyEvent","mergedParams: Record<string, string | string[]>","data: APIGatewayProxyEvent","context: Context","envParser: EnvironmentParser<{}>","endpoint: Endpoint<\n TRoute,\n TMethod,\n TInput,\n TOutSchema,\n TServices,\n TLogger,\n TSession,\n TEventPublisher\n >"],"sources":["../src/endpoints/AmazonApiGatewayV1EndpointAdaptor.ts"],"sourcesContent":["import type { Logger } from '@geekmidas/logger';\nimport type { StandardSchemaV1 } from '@standard-schema/spec';\nimport type { HttpMethod } from '../types';\nimport type { Endpoint, EndpointSchemas } from './Endpoint';\n\nimport type { EnvironmentParser } from '@geekmidas/envkit';\nimport type { APIGatewayProxyEvent, Context } from 'aws-lambda';\n\nimport type { EventPublisher } from '@geekmidas/events';\nimport type { Service } from '@geekmidas/services';\nimport {\n AmazonApiGatewayEndpoint,\n type AmazonApiGatewayV1EndpointHandler,\n type GetInputResponse,\n type LoggerContext,\n} from './AmazonApiGatewayEndpointAdaptor';\nimport { parseQueryParams } from './parseQueryParams';\n\nexport class AmazonApiGatewayV1Endpoint<\n TRoute extends string,\n TMethod extends HttpMethod,\n TInput extends EndpointSchemas = {},\n TOutSchema extends StandardSchemaV1 | undefined = undefined,\n TServices extends Service[] = [],\n TLogger extends Logger = Logger,\n TSession = unknown,\n TEventPublisher extends EventPublisher<any> | undefined = undefined,\n> extends AmazonApiGatewayEndpoint<\n AmazonApiGatewayV1EndpointHandler,\n APIGatewayProxyEvent,\n TRoute,\n TMethod,\n TInput,\n TOutSchema,\n TServices,\n TLogger,\n TSession,\n TEventPublisher\n> {\n getInput(e: APIGatewayProxyEvent): GetInputResponse {\n // For arrays, AWS API Gateway V1 provides multiValueQueryStringParameters\n const multiValueParams = e.multiValueQueryStringParameters || {};\n const singleValueParams = e.queryStringParameters || {};\n\n // Merge single and multi-value parameters\n const mergedParams: Record<string, string | string[]> = {};\n\n // Add single value parameters\n for (const [key, value] of Object.entries(singleValueParams)) {\n if (value !== undefined) {\n mergedParams[key] = value;\n }\n }\n\n // Override with multi-value parameters where applicable\n for (const [key, values] of Object.entries(multiValueParams)) {\n if (values && values.length > 1) {\n mergedParams[key] = values;\n }\n }\n\n return {\n body: e.body ? JSON.parse(e.body) : undefined,\n query: parseQueryParams(mergedParams),\n params: e.pathParameters || {},\n };\n }\n getLoggerContext(\n data: APIGatewayProxyEvent,\n context: Context,\n ): LoggerContext {\n return {\n fn: {\n name: context.functionName,\n version: context.functionVersion,\n },\n req: {\n id: data.requestContext.requestId,\n awsRequestId: context.awsRequestId,\n ip: data.requestContext.identity.sourceIp,\n userAgent: data.requestContext.identity.userAgent || undefined,\n path: data.requestContext.path,\n },\n };\n }\n constructor(\n protected envParser: EnvironmentParser<{}>,\n protected readonly endpoint: Endpoint<\n TRoute,\n TMethod,\n TInput,\n TOutSchema,\n TServices,\n TLogger,\n TSession,\n TEventPublisher\n >,\n ) {\n super(envParser, endpoint);\n }\n}\n"],"mappings":";;;;AAkBA,IAAa,6BAAb,cASU,yBAWR;CACA,SAASA,GAA2C;EAElD,MAAM,mBAAmB,EAAE,mCAAmC,CAAE;EAChE,MAAM,oBAAoB,EAAE,yBAAyB,CAAE;EAGvD,MAAMC,eAAkD,CAAE;AAG1D,OAAK,MAAM,CAAC,KAAK,MAAM,IAAI,OAAO,QAAQ,kBAAkB,CAC1D,KAAI,iBACF,cAAa,OAAO;AAKxB,OAAK,MAAM,CAAC,KAAK,OAAO,IAAI,OAAO,QAAQ,iBAAiB,CAC1D,KAAI,UAAU,OAAO,SAAS,EAC5B,cAAa,OAAO;AAIxB,SAAO;GACL,MAAM,EAAE,OAAO,KAAK,MAAM,EAAE,KAAK;GACjC,OAAO,iBAAiB,aAAa;GACrC,QAAQ,EAAE,kBAAkB,CAAE;EAC/B;CACF;CACD,iBACEC,MACAC,SACe;AACf,SAAO;GACL,IAAI;IACF,MAAM,QAAQ;IACd,SAAS,QAAQ;GAClB;GACD,KAAK;IACH,IAAI,KAAK,eAAe;IACxB,cAAc,QAAQ;IACtB,IAAI,KAAK,eAAe,SAAS;IACjC,WAAW,KAAK,eAAe,SAAS;IACxC,MAAM,KAAK,eAAe;GAC3B;EACF;CACF;CACD,YACYC,WACSC,UAUnB;AACA,QAAM,WAAW,SAAS;EAZhB;EACS;CAYpB;AACF"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
const require_AmazonApiGatewayEndpointAdaptor = require('./AmazonApiGatewayEndpointAdaptor-
|
|
1
|
+
const require_AmazonApiGatewayEndpointAdaptor = require('./AmazonApiGatewayEndpointAdaptor-DNFvvdmW.cjs');
|
|
2
2
|
const require_parseQueryParams = require('./parseQueryParams-CwvXXwkW.cjs');
|
|
3
3
|
|
|
4
4
|
//#region src/endpoints/AmazonApiGatewayV1EndpointAdaptor.ts
|
|
@@ -44,4 +44,4 @@ Object.defineProperty(exports, 'AmazonApiGatewayV1Endpoint', {
|
|
|
44
44
|
return AmazonApiGatewayV1Endpoint;
|
|
45
45
|
}
|
|
46
46
|
});
|
|
47
|
-
//# sourceMappingURL=AmazonApiGatewayV1EndpointAdaptor-
|
|
47
|
+
//# sourceMappingURL=AmazonApiGatewayV1EndpointAdaptor-BiNzaAxD.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AmazonApiGatewayV1EndpointAdaptor-
|
|
1
|
+
{"version":3,"file":"AmazonApiGatewayV1EndpointAdaptor-BiNzaAxD.cjs","names":["AmazonApiGatewayEndpoint","e: APIGatewayProxyEvent","mergedParams: Record<string, string | string[]>","data: APIGatewayProxyEvent","context: Context","envParser: EnvironmentParser<{}>","endpoint: Endpoint<\n TRoute,\n TMethod,\n TInput,\n TOutSchema,\n TServices,\n TLogger,\n TSession,\n TEventPublisher\n >"],"sources":["../src/endpoints/AmazonApiGatewayV1EndpointAdaptor.ts"],"sourcesContent":["import type { Logger } from '@geekmidas/logger';\nimport type { StandardSchemaV1 } from '@standard-schema/spec';\nimport type { HttpMethod } from '../types';\nimport type { Endpoint, EndpointSchemas } from './Endpoint';\n\nimport type { EnvironmentParser } from '@geekmidas/envkit';\nimport type { APIGatewayProxyEvent, Context } from 'aws-lambda';\n\nimport type { EventPublisher } from '@geekmidas/events';\nimport type { Service } from '@geekmidas/services';\nimport {\n AmazonApiGatewayEndpoint,\n type AmazonApiGatewayV1EndpointHandler,\n type GetInputResponse,\n type LoggerContext,\n} from './AmazonApiGatewayEndpointAdaptor';\nimport { parseQueryParams } from './parseQueryParams';\n\nexport class AmazonApiGatewayV1Endpoint<\n TRoute extends string,\n TMethod extends HttpMethod,\n TInput extends EndpointSchemas = {},\n TOutSchema extends StandardSchemaV1 | undefined = undefined,\n TServices extends Service[] = [],\n TLogger extends Logger = Logger,\n TSession = unknown,\n TEventPublisher extends EventPublisher<any> | undefined = undefined,\n> extends AmazonApiGatewayEndpoint<\n AmazonApiGatewayV1EndpointHandler,\n APIGatewayProxyEvent,\n TRoute,\n TMethod,\n TInput,\n TOutSchema,\n TServices,\n TLogger,\n TSession,\n TEventPublisher\n> {\n getInput(e: APIGatewayProxyEvent): GetInputResponse {\n // For arrays, AWS API Gateway V1 provides multiValueQueryStringParameters\n const multiValueParams = e.multiValueQueryStringParameters || {};\n const singleValueParams = e.queryStringParameters || {};\n\n // Merge single and multi-value parameters\n const mergedParams: Record<string, string | string[]> = {};\n\n // Add single value parameters\n for (const [key, value] of Object.entries(singleValueParams)) {\n if (value !== undefined) {\n mergedParams[key] = value;\n }\n }\n\n // Override with multi-value parameters where applicable\n for (const [key, values] of Object.entries(multiValueParams)) {\n if (values && values.length > 1) {\n mergedParams[key] = values;\n }\n }\n\n return {\n body: e.body ? JSON.parse(e.body) : undefined,\n query: parseQueryParams(mergedParams),\n params: e.pathParameters || {},\n };\n }\n getLoggerContext(\n data: APIGatewayProxyEvent,\n context: Context,\n ): LoggerContext {\n return {\n fn: {\n name: context.functionName,\n version: context.functionVersion,\n },\n req: {\n id: data.requestContext.requestId,\n awsRequestId: context.awsRequestId,\n ip: data.requestContext.identity.sourceIp,\n userAgent: data.requestContext.identity.userAgent || undefined,\n path: data.requestContext.path,\n },\n };\n }\n constructor(\n protected envParser: EnvironmentParser<{}>,\n protected readonly endpoint: Endpoint<\n TRoute,\n TMethod,\n TInput,\n TOutSchema,\n TServices,\n TLogger,\n TSession,\n TEventPublisher\n >,\n ) {\n super(envParser, endpoint);\n }\n}\n"],"mappings":";;;;AAkBA,IAAa,6BAAb,cASUA,iEAWR;CACA,SAASC,GAA2C;EAElD,MAAM,mBAAmB,EAAE,mCAAmC,CAAE;EAChE,MAAM,oBAAoB,EAAE,yBAAyB,CAAE;EAGvD,MAAMC,eAAkD,CAAE;AAG1D,OAAK,MAAM,CAAC,KAAK,MAAM,IAAI,OAAO,QAAQ,kBAAkB,CAC1D,KAAI,iBACF,cAAa,OAAO;AAKxB,OAAK,MAAM,CAAC,KAAK,OAAO,IAAI,OAAO,QAAQ,iBAAiB,CAC1D,KAAI,UAAU,OAAO,SAAS,EAC5B,cAAa,OAAO;AAIxB,SAAO;GACL,MAAM,EAAE,OAAO,KAAK,MAAM,EAAE,KAAK;GACjC,OAAO,0CAAiB,aAAa;GACrC,QAAQ,EAAE,kBAAkB,CAAE;EAC/B;CACF;CACD,iBACEC,MACAC,SACe;AACf,SAAO;GACL,IAAI;IACF,MAAM,QAAQ;IACd,SAAS,QAAQ;GAClB;GACD,KAAK;IACH,IAAI,KAAK,eAAe;IACxB,cAAc,QAAQ;IACtB,IAAI,KAAK,eAAe,SAAS;IACjC,WAAW,KAAK,eAAe,SAAS;IACxC,MAAM,KAAK,eAAe;GAC3B;EACF;CACF;CACD,YACYC,WACSC,UAUnB;AACA,QAAM,WAAW,SAAS;EAZhB;EACS;CAYpB;AACF"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
const require_AmazonApiGatewayEndpointAdaptor = require('./AmazonApiGatewayEndpointAdaptor-
|
|
1
|
+
const require_AmazonApiGatewayEndpointAdaptor = require('./AmazonApiGatewayEndpointAdaptor-DNFvvdmW.cjs');
|
|
2
2
|
const require_parseQueryParams = require('./parseQueryParams-CwvXXwkW.cjs');
|
|
3
3
|
|
|
4
4
|
//#region src/endpoints/AmazonApiGatewayV2EndpointAdaptor.ts
|
|
@@ -43,4 +43,4 @@ Object.defineProperty(exports, 'AmazonApiGatewayV2Endpoint', {
|
|
|
43
43
|
return AmazonApiGatewayV2Endpoint;
|
|
44
44
|
}
|
|
45
45
|
});
|
|
46
|
-
//# sourceMappingURL=AmazonApiGatewayV2EndpointAdaptor-
|
|
46
|
+
//# sourceMappingURL=AmazonApiGatewayV2EndpointAdaptor-DZclCykB.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AmazonApiGatewayV2EndpointAdaptor-
|
|
1
|
+
{"version":3,"file":"AmazonApiGatewayV2EndpointAdaptor-DZclCykB.cjs","names":["AmazonApiGatewayEndpoint","e: APIGatewayProxyEventV2","processedParams: Record<string, string | string[]>","event: APIGatewayProxyEventV2","context: Context","envParser: EnvironmentParser<{}>","endpoint: Endpoint<\n TRoute,\n TMethod,\n TInput,\n TOutSchema,\n TServices,\n TLogger,\n TSession,\n TEventPublisher\n >"],"sources":["../src/endpoints/AmazonApiGatewayV2EndpointAdaptor.ts"],"sourcesContent":["import type { Logger } from '@geekmidas/logger';\nimport type { StandardSchemaV1 } from '@standard-schema/spec';\nimport type { HttpMethod } from '../types';\nimport type { Endpoint, EndpointSchemas } from './Endpoint';\n\nimport type { EnvironmentParser } from '@geekmidas/envkit';\nimport type { EventPublisher } from '@geekmidas/events';\nimport type { Service } from '@geekmidas/services';\nimport type { APIGatewayProxyEventV2, Context } from 'aws-lambda';\nimport {\n AmazonApiGatewayEndpoint,\n type AmazonApiGatewayV2EndpointHandler,\n type GetInputResponse,\n type LoggerContext,\n} from './AmazonApiGatewayEndpointAdaptor';\nimport { parseQueryParams } from './parseQueryParams';\n\nexport class AmazonApiGatewayV2Endpoint<\n TRoute extends string,\n TMethod extends HttpMethod,\n TInput extends EndpointSchemas = {},\n TOutSchema extends StandardSchemaV1 | undefined = undefined,\n TServices extends Service[] = [],\n TLogger extends Logger = Logger,\n TSession = unknown,\n TEventPublisher extends EventPublisher<any> | undefined = undefined,\n> extends AmazonApiGatewayEndpoint<\n AmazonApiGatewayV2EndpointHandler,\n APIGatewayProxyEventV2,\n TRoute,\n TMethod,\n TInput,\n TOutSchema,\n TServices,\n TLogger,\n TSession,\n TEventPublisher\n> {\n getInput(e: APIGatewayProxyEventV2): GetInputResponse {\n // API Gateway V2 handles arrays as comma-separated values\n const queryParams = e.queryStringParameters || {};\n const processedParams: Record<string, string | string[]> = {};\n\n for (const [key, value] of Object.entries(queryParams)) {\n if (value !== undefined) {\n // Check if value contains comma and could be an array\n // Be careful not to split values that legitimately contain commas\n if (value.includes(',') && !value.includes('\"')) {\n processedParams[key] = value.split(',').map((v) => v.trim());\n } else {\n processedParams[key] = value;\n }\n }\n }\n\n return {\n body: e.body ? JSON.parse(e.body) : undefined,\n query: parseQueryParams(processedParams),\n params: e.pathParameters || {},\n };\n }\n getLoggerContext(\n event: APIGatewayProxyEventV2,\n context: Context,\n ): LoggerContext {\n return {\n fn: {\n name: context.functionName,\n version: context.functionVersion,\n },\n req: {\n id: event.requestContext.requestId,\n awsRequestId: context.awsRequestId,\n ip: event.requestContext.http.sourceIp,\n userAgent: event.requestContext.http.userAgent || undefined,\n path: event.requestContext.http.path,\n },\n };\n }\n constructor(\n protected envParser: EnvironmentParser<{}>,\n protected readonly endpoint: Endpoint<\n TRoute,\n TMethod,\n TInput,\n TOutSchema,\n TServices,\n TLogger,\n TSession,\n TEventPublisher\n >,\n ) {\n super(envParser, endpoint);\n }\n}\n"],"mappings":";;;;AAiBA,IAAa,6BAAb,cASUA,iEAWR;CACA,SAASC,GAA6C;EAEpD,MAAM,cAAc,EAAE,yBAAyB,CAAE;EACjD,MAAMC,kBAAqD,CAAE;AAE7D,OAAK,MAAM,CAAC,KAAK,MAAM,IAAI,OAAO,QAAQ,YAAY,CACpD,KAAI,iBAGF,KAAI,MAAM,SAAS,IAAI,KAAK,MAAM,SAAS,KAAI,CAC7C,iBAAgB,OAAO,MAAM,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC;MAE5D,iBAAgB,OAAO;AAK7B,SAAO;GACL,MAAM,EAAE,OAAO,KAAK,MAAM,EAAE,KAAK;GACjC,OAAO,0CAAiB,gBAAgB;GACxC,QAAQ,EAAE,kBAAkB,CAAE;EAC/B;CACF;CACD,iBACEC,OACAC,SACe;AACf,SAAO;GACL,IAAI;IACF,MAAM,QAAQ;IACd,SAAS,QAAQ;GAClB;GACD,KAAK;IACH,IAAI,MAAM,eAAe;IACzB,cAAc,QAAQ;IACtB,IAAI,MAAM,eAAe,KAAK;IAC9B,WAAW,MAAM,eAAe,KAAK;IACrC,MAAM,MAAM,eAAe,KAAK;GACjC;EACF;CACF;CACD,YACYC,WACSC,UAUnB;AACA,QAAM,WAAW,SAAS;EAZhB;EACS;CAYpB;AACF"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { AmazonApiGatewayEndpoint } from "./AmazonApiGatewayEndpointAdaptor-
|
|
1
|
+
import { AmazonApiGatewayEndpoint } from "./AmazonApiGatewayEndpointAdaptor-BT9JXihC.mjs";
|
|
2
2
|
import { parseQueryParams } from "./parseQueryParams-CHINupbZ.mjs";
|
|
3
3
|
|
|
4
4
|
//#region src/endpoints/AmazonApiGatewayV2EndpointAdaptor.ts
|
|
@@ -38,4 +38,4 @@ var AmazonApiGatewayV2Endpoint = class extends AmazonApiGatewayEndpoint {
|
|
|
38
38
|
|
|
39
39
|
//#endregion
|
|
40
40
|
export { AmazonApiGatewayV2Endpoint };
|
|
41
|
-
//# sourceMappingURL=AmazonApiGatewayV2EndpointAdaptor-
|
|
41
|
+
//# sourceMappingURL=AmazonApiGatewayV2EndpointAdaptor-jRrQrIdm.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AmazonApiGatewayV2EndpointAdaptor-
|
|
1
|
+
{"version":3,"file":"AmazonApiGatewayV2EndpointAdaptor-jRrQrIdm.mjs","names":["e: APIGatewayProxyEventV2","processedParams: Record<string, string | string[]>","event: APIGatewayProxyEventV2","context: Context","envParser: EnvironmentParser<{}>","endpoint: Endpoint<\n TRoute,\n TMethod,\n TInput,\n TOutSchema,\n TServices,\n TLogger,\n TSession,\n TEventPublisher\n >"],"sources":["../src/endpoints/AmazonApiGatewayV2EndpointAdaptor.ts"],"sourcesContent":["import type { Logger } from '@geekmidas/logger';\nimport type { StandardSchemaV1 } from '@standard-schema/spec';\nimport type { HttpMethod } from '../types';\nimport type { Endpoint, EndpointSchemas } from './Endpoint';\n\nimport type { EnvironmentParser } from '@geekmidas/envkit';\nimport type { EventPublisher } from '@geekmidas/events';\nimport type { Service } from '@geekmidas/services';\nimport type { APIGatewayProxyEventV2, Context } from 'aws-lambda';\nimport {\n AmazonApiGatewayEndpoint,\n type AmazonApiGatewayV2EndpointHandler,\n type GetInputResponse,\n type LoggerContext,\n} from './AmazonApiGatewayEndpointAdaptor';\nimport { parseQueryParams } from './parseQueryParams';\n\nexport class AmazonApiGatewayV2Endpoint<\n TRoute extends string,\n TMethod extends HttpMethod,\n TInput extends EndpointSchemas = {},\n TOutSchema extends StandardSchemaV1 | undefined = undefined,\n TServices extends Service[] = [],\n TLogger extends Logger = Logger,\n TSession = unknown,\n TEventPublisher extends EventPublisher<any> | undefined = undefined,\n> extends AmazonApiGatewayEndpoint<\n AmazonApiGatewayV2EndpointHandler,\n APIGatewayProxyEventV2,\n TRoute,\n TMethod,\n TInput,\n TOutSchema,\n TServices,\n TLogger,\n TSession,\n TEventPublisher\n> {\n getInput(e: APIGatewayProxyEventV2): GetInputResponse {\n // API Gateway V2 handles arrays as comma-separated values\n const queryParams = e.queryStringParameters || {};\n const processedParams: Record<string, string | string[]> = {};\n\n for (const [key, value] of Object.entries(queryParams)) {\n if (value !== undefined) {\n // Check if value contains comma and could be an array\n // Be careful not to split values that legitimately contain commas\n if (value.includes(',') && !value.includes('\"')) {\n processedParams[key] = value.split(',').map((v) => v.trim());\n } else {\n processedParams[key] = value;\n }\n }\n }\n\n return {\n body: e.body ? JSON.parse(e.body) : undefined,\n query: parseQueryParams(processedParams),\n params: e.pathParameters || {},\n };\n }\n getLoggerContext(\n event: APIGatewayProxyEventV2,\n context: Context,\n ): LoggerContext {\n return {\n fn: {\n name: context.functionName,\n version: context.functionVersion,\n },\n req: {\n id: event.requestContext.requestId,\n awsRequestId: context.awsRequestId,\n ip: event.requestContext.http.sourceIp,\n userAgent: event.requestContext.http.userAgent || undefined,\n path: event.requestContext.http.path,\n },\n };\n }\n constructor(\n protected envParser: EnvironmentParser<{}>,\n protected readonly endpoint: Endpoint<\n TRoute,\n TMethod,\n TInput,\n TOutSchema,\n TServices,\n TLogger,\n TSession,\n TEventPublisher\n >,\n ) {\n super(envParser, endpoint);\n }\n}\n"],"mappings":";;;;AAiBA,IAAa,6BAAb,cASU,yBAWR;CACA,SAASA,GAA6C;EAEpD,MAAM,cAAc,EAAE,yBAAyB,CAAE;EACjD,MAAMC,kBAAqD,CAAE;AAE7D,OAAK,MAAM,CAAC,KAAK,MAAM,IAAI,OAAO,QAAQ,YAAY,CACpD,KAAI,iBAGF,KAAI,MAAM,SAAS,IAAI,KAAK,MAAM,SAAS,KAAI,CAC7C,iBAAgB,OAAO,MAAM,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC;MAE5D,iBAAgB,OAAO;AAK7B,SAAO;GACL,MAAM,EAAE,OAAO,KAAK,MAAM,EAAE,KAAK;GACjC,OAAO,iBAAiB,gBAAgB;GACxC,QAAQ,EAAE,kBAAkB,CAAE;EAC/B;CACF;CACD,iBACEC,OACAC,SACe;AACf,SAAO;GACL,IAAI;IACF,MAAM,QAAQ;IACd,SAAS,QAAQ;GAClB;GACD,KAAK;IACH,IAAI,MAAM,eAAe;IACzB,cAAc,QAAQ;IACtB,IAAI,MAAM,eAAe,KAAK;IAC9B,WAAW,MAAM,eAAe,KAAK;IACrC,MAAM,MAAM,eAAe,KAAK;GACjC;EACF;CACF;CACD,YACYC,WACSC,UAUnB;AACA,QAAM,WAAW,SAAS;EAZhB;EACS;CAYpB;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Authorizer-
|
|
1
|
+
{"version":3,"file":"Authorizer-C0ge_tc8.cjs","names":["name: string","options?: Omit<Authorizer, 'name'>","customSchemes?: Record<string, SecurityScheme>"],"sources":["../src/endpoints/Authorizer.ts"],"sourcesContent":["/**\n * OpenAPI 3.1 compliant security scheme definition.\n * @see https://spec.openapis.org/oas/v3.1.0#security-scheme-object\n */\nexport interface SecurityScheme {\n /** The type of the security scheme */\n type: 'apiKey' | 'http' | 'mutualTLS' | 'oauth2' | 'openIdConnect';\n /** A description for security scheme */\n description?: string;\n /** Required for apiKey. The name of the header, query or cookie parameter */\n name?: string;\n /** Required for apiKey. The location of the API key */\n in?: 'query' | 'header' | 'cookie';\n /** Required for http. The name of the HTTP Authorization scheme (e.g., 'bearer') */\n scheme?: string;\n /** Optional for http bearer. A hint to the format of the bearer token */\n bearerFormat?: string;\n /** Required for oauth2. An object containing configuration for the flow types */\n flows?: OAuthFlows;\n /** Required for openIdConnect. The URL to discover OAuth2 configuration */\n openIdConnectUrl?: string;\n /** Vendor extensions (e.g., x-amazon-apigateway-authtype) */\n [key: `x-${string}`]: unknown;\n}\n\n/**\n * OAuth2 flow configuration\n */\nexport interface OAuthFlows {\n implicit?: OAuthFlow;\n password?: OAuthFlow;\n clientCredentials?: OAuthFlow;\n authorizationCode?: OAuthFlow;\n}\n\nexport interface OAuthFlow {\n authorizationUrl?: string;\n tokenUrl?: string;\n refreshUrl?: string;\n scopes: Record<string, string>;\n}\n\n/**\n * Built-in security schemes available by default.\n * Users can use these without defining them via .securitySchemes().\n */\nexport const BUILT_IN_SECURITY_SCHEMES = {\n jwt: {\n type: 'http',\n scheme: 'bearer',\n bearerFormat: 'JWT',\n description: 'JWT Bearer token authentication',\n },\n bearer: {\n type: 'http',\n scheme: 'bearer',\n description: 'Bearer token authentication',\n },\n apiKey: {\n type: 'apiKey',\n in: 'header',\n name: 'X-API-Key',\n description: 'API key authentication via header',\n },\n oauth2: {\n type: 'oauth2',\n flows: {},\n description: 'OAuth 2.0 authentication',\n },\n oidc: {\n type: 'openIdConnect',\n openIdConnectUrl: '',\n description: 'OpenID Connect authentication',\n },\n iam: {\n type: 'apiKey',\n in: 'header',\n name: 'Authorization',\n description: 'AWS IAM Signature Version 4 authentication',\n 'x-amazon-apigateway-authtype': 'awsSigv4',\n },\n} as const satisfies Record<string, SecurityScheme>;\n\n/** Names of built-in security schemes */\nexport type BuiltInSecuritySchemeId = keyof typeof BUILT_IN_SECURITY_SCHEMES;\n\n/**\n * Represents an authorizer configuration for endpoints\n */\nexport interface Authorizer {\n /**\n * Unique identifier for the authorizer\n */\n name: string;\n /**\n * The OpenAPI security scheme definition for this authorizer\n */\n securityScheme?: SecurityScheme;\n /**\n * Type of authorizer (e.g., 'iam', 'jwt', 'custom')\n * @deprecated Use securityScheme.type instead\n */\n type?: string;\n /**\n * Description of what this authorizer does\n * @deprecated Use securityScheme.description instead\n */\n description?: string;\n /**\n * Additional metadata specific to the authorizer type\n * @deprecated Use securityScheme with x-* extensions instead\n */\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Helper to create an authorizer configuration\n */\nexport function createAuthorizer(\n name: string,\n options?: Omit<Authorizer, 'name'>,\n): Authorizer {\n return {\n name,\n ...options,\n };\n}\n\n/**\n * Check if a name is a built-in security scheme\n */\nexport function isBuiltInSecurityScheme(\n name: string,\n): name is BuiltInSecuritySchemeId {\n return name in BUILT_IN_SECURITY_SCHEMES;\n}\n\n/**\n * Get a security scheme by name (built-in or custom)\n */\nexport function getSecurityScheme(\n name: string,\n customSchemes?: Record<string, SecurityScheme>,\n): SecurityScheme | undefined {\n if (customSchemes && name in customSchemes) {\n return customSchemes[name];\n }\n if (isBuiltInSecurityScheme(name)) {\n return BUILT_IN_SECURITY_SCHEMES[name];\n }\n return undefined;\n}\n"],"mappings":";;;;;;AA8CA,MAAa,4BAA4B;CACvC,KAAK;EACH,MAAM;EACN,QAAQ;EACR,cAAc;EACd,aAAa;CACd;CACD,QAAQ;EACN,MAAM;EACN,QAAQ;EACR,aAAa;CACd;CACD,QAAQ;EACN,MAAM;EACN,IAAI;EACJ,MAAM;EACN,aAAa;CACd;CACD,QAAQ;EACN,MAAM;EACN,OAAO,CAAE;EACT,aAAa;CACd;CACD,MAAM;EACJ,MAAM;EACN,kBAAkB;EAClB,aAAa;CACd;CACD,KAAK;EACH,MAAM;EACN,IAAI;EACJ,MAAM;EACN,aAAa;EACb,gCAAgC;CACjC;AACF;;;;AAqCD,SAAgB,iBACdA,MACAC,SACY;AACZ,QAAO;EACL;EACA,GAAG;CACJ;AACF;;;;AAKD,SAAgB,wBACdD,MACiC;AACjC,QAAO,QAAQ;AAChB;;;;AAKD,SAAgB,kBACdA,MACAE,eAC4B;AAC5B,KAAI,iBAAiB,QAAQ,cAC3B,QAAO,cAAc;AAEvB,KAAI,wBAAwB,KAAK,CAC/B,QAAO,0BAA0B;AAEnC;AACD"}
|
|
@@ -65,4 +65,4 @@ function getSecurityScheme(name, customSchemes) {
|
|
|
65
65
|
|
|
66
66
|
//#endregion
|
|
67
67
|
export { BUILT_IN_SECURITY_SCHEMES, createAuthorizer, getSecurityScheme, isBuiltInSecurityScheme };
|
|
68
|
-
//# sourceMappingURL=Authorizer-
|
|
68
|
+
//# sourceMappingURL=Authorizer-r9U3y_ms.mjs.map
|