@geekmidas/constructs 0.0.22 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +90 -0
- package/dist/{AWSLambdaFunction-qWpalqfr.d.mts → AWSLambdaFunction-D9RZhm0N.d.mts} +3 -3
- package/dist/{AWSLambdaSubscriberAdaptor-CWbBNRz3.d.mts → AWSLambdaSubscriberAdaptor-C0aZBU64.d.mts} +2 -2
- package/dist/{AmazonApiGatewayEndpointAdaptor-DXssXsJi.cjs → AmazonApiGatewayEndpointAdaptor-Bk6ssx3K.cjs} +40 -27
- package/dist/AmazonApiGatewayEndpointAdaptor-Bk6ssx3K.cjs.map +1 -0
- package/dist/{AmazonApiGatewayEndpointAdaptor-Da9BR5On.d.cts → AmazonApiGatewayEndpointAdaptor-CbJqLU6I.d.cts} +2 -2
- package/dist/{AmazonApiGatewayEndpointAdaptor-BQ0IJdaI.d.mts → AmazonApiGatewayEndpointAdaptor-DC3N7zY_.d.mts} +3 -3
- package/dist/{AmazonApiGatewayEndpointAdaptor-CacGag6F.mjs → AmazonApiGatewayEndpointAdaptor-pEWzF2uY.mjs} +40 -27
- package/dist/AmazonApiGatewayEndpointAdaptor-pEWzF2uY.mjs.map +1 -0
- package/dist/{AmazonApiGatewayV1EndpointAdaptor-C4_AZ1ek.d.mts → AmazonApiGatewayV1EndpointAdaptor-BVxgQ-7J.d.mts} +4 -4
- package/dist/{AmazonApiGatewayV1EndpointAdaptor-CSm3NsWz.d.cts → AmazonApiGatewayV1EndpointAdaptor-CVwJ5k16.d.cts} +3 -3
- package/dist/{AmazonApiGatewayV1EndpointAdaptor-BpnG55R7.mjs → AmazonApiGatewayV1EndpointAdaptor-MJpRbIaQ.mjs} +2 -2
- package/dist/{AmazonApiGatewayV1EndpointAdaptor-BpnG55R7.mjs.map → AmazonApiGatewayV1EndpointAdaptor-MJpRbIaQ.mjs.map} +1 -1
- package/dist/{AmazonApiGatewayV1EndpointAdaptor-Df4kszio.cjs → AmazonApiGatewayV1EndpointAdaptor-uBp_4zLf.cjs} +2 -2
- package/dist/{AmazonApiGatewayV1EndpointAdaptor-Df4kszio.cjs.map → AmazonApiGatewayV1EndpointAdaptor-uBp_4zLf.cjs.map} +1 -1
- package/dist/{AmazonApiGatewayV2EndpointAdaptor-6hsBFVLf.d.cts → AmazonApiGatewayV2EndpointAdaptor-1oBZdQH3.d.cts} +3 -3
- package/dist/{AmazonApiGatewayV2EndpointAdaptor-DdM8Tr1X.d.mts → AmazonApiGatewayV2EndpointAdaptor-C3H8Hpv7.d.mts} +4 -4
- package/dist/{AmazonApiGatewayV2EndpointAdaptor-ZORzMEET.mjs → AmazonApiGatewayV2EndpointAdaptor-ChO8BlDz.mjs} +2 -2
- package/dist/{AmazonApiGatewayV2EndpointAdaptor-ZORzMEET.mjs.map → AmazonApiGatewayV2EndpointAdaptor-ChO8BlDz.mjs.map} +1 -1
- package/dist/{AmazonApiGatewayV2EndpointAdaptor-5SIvqPby.cjs → AmazonApiGatewayV2EndpointAdaptor-I1W23Nvn.cjs} +2 -2
- package/dist/{AmazonApiGatewayV2EndpointAdaptor-5SIvqPby.cjs.map → AmazonApiGatewayV2EndpointAdaptor-I1W23Nvn.cjs.map} +1 -1
- package/dist/Authorizer-C0ge_tc8.cjs +92 -0
- package/dist/Authorizer-C0ge_tc8.cjs.map +1 -0
- package/dist/Authorizer-CpSUMTIs.d.cts +125 -0
- package/dist/Authorizer-Cpx59w_q.d.mts +125 -0
- package/dist/Authorizer-r9U3y_ms.mjs +68 -0
- package/dist/Authorizer-r9U3y_ms.mjs.map +1 -0
- package/dist/{BaseFunctionBuilder-Ct6zY6Jq.d.mts → BaseFunctionBuilder-CoV7J45W.d.mts} +2 -2
- package/dist/{Construct-DDR0295I.d.mts → Construct-jBKqb-Zi.d.mts} +1 -1
- package/dist/Construct.d.mts +1 -1
- package/dist/{Cron-DnMRWPFR.d.mts → Cron-JZkp_fHy.d.mts} +2 -2
- package/dist/{CronBuilder-RLDitFmP.d.mts → CronBuilder-BmFDO0Dm.d.mts} +4 -4
- package/dist/{Endpoint-DbPsw13b.mjs → Endpoint-B70_KKhu.mjs} +8 -2
- package/dist/Endpoint-B70_KKhu.mjs.map +1 -0
- package/dist/{Endpoint-CA-byrDr.cjs → Endpoint-BJo9Hhwm.cjs} +8 -2
- package/dist/Endpoint-BJo9Hhwm.cjs.map +1 -0
- package/dist/{Endpoint-PtQ-wLIS.d.mts → Endpoint-C5djXyae.d.mts} +69 -6
- package/dist/{Endpoint-D2Imgihs.d.cts → Endpoint-CC2RGjkl.d.cts} +67 -4
- package/dist/{EndpointBuilder-BPHpUekp.d.mts → EndpointBuilder-CD8LkBda.d.mts} +43 -5
- package/dist/{EndpointBuilder-CYkeYpsL.cjs → EndpointBuilder-DeswNQdG.cjs} +69 -4
- package/dist/EndpointBuilder-DeswNQdG.cjs.map +1 -0
- package/dist/{EndpointBuilder-W5fdXxYQ.mjs → EndpointBuilder-FyyoFTJ5.mjs} +69 -4
- package/dist/EndpointBuilder-FyyoFTJ5.mjs.map +1 -0
- package/dist/{EndpointBuilder-TApJQhtG.d.cts → EndpointBuilder-vXk6eIJk.d.cts} +41 -3
- package/dist/{EndpointFactory-CNlfBDuD.d.mts → EndpointFactory-3g-7Rznt.d.cts} +68 -21
- package/dist/{EndpointFactory-B5fOINuc.d.cts → EndpointFactory-DaFR9LQG.d.mts} +68 -21
- package/dist/{EndpointFactory-D5lFZXqY.cjs → EndpointFactory-DcT_g9M_.cjs} +117 -14
- package/dist/EndpointFactory-DcT_g9M_.cjs.map +1 -0
- package/dist/{EndpointFactory-B27nfeiE.mjs → EndpointFactory-KJAjBWmO.mjs} +117 -14
- package/dist/EndpointFactory-KJAjBWmO.mjs.map +1 -0
- package/dist/{Function-CD3rXWfa.d.mts → Function-Vh1t-Qjj.d.mts} +2 -2
- package/dist/{FunctionBuilder-j2VkwuGf.d.mts → FunctionBuilder-3jsoFffg.d.mts} +4 -4
- package/dist/{FunctionExecutionWrapper-B0WP-Vec.d.mts → FunctionExecutionWrapper-CI3CaoCo.d.mts} +2 -2
- package/dist/{HonoEndpointAdaptor-CLOpobdq.d.cts → HonoEndpointAdaptor-BJh4J-J9.d.cts} +4 -4
- package/dist/{HonoEndpointAdaptor-Bg_vTyA5.mjs → HonoEndpointAdaptor-CcvXzoYV.mjs} +43 -30
- package/dist/HonoEndpointAdaptor-CcvXzoYV.mjs.map +1 -0
- package/dist/{HonoEndpointAdaptor-B_gJPWGD.cjs → HonoEndpointAdaptor-DodwLM0-.cjs} +43 -30
- package/dist/HonoEndpointAdaptor-DodwLM0-.cjs.map +1 -0
- package/dist/{HonoEndpointAdaptor-C9gYYBWu.d.mts → HonoEndpointAdaptor-kb1ByjUL.d.mts} +5 -5
- package/dist/{Subscriber-D-FPWts6.cjs → Subscriber-DOt3svUC.cjs} +1 -1
- package/dist/{Subscriber-D-FPWts6.cjs.map → Subscriber-DOt3svUC.cjs.map} +1 -1
- package/dist/{Subscriber-itwm7ugy.d.mts → Subscriber-aNr1qkxR.d.mts} +2 -2
- package/dist/{Subscriber-CGb8LjZa.mjs → Subscriber-kCHbH2fZ.mjs} +1 -1
- package/dist/{Subscriber-CGb8LjZa.mjs.map → Subscriber-kCHbH2fZ.mjs.map} +1 -1
- package/dist/{SubscriberBuilder-9j3JCu8-.d.mts → SubscriberBuilder-CWS4tdbp.d.mts} +2 -2
- package/dist/{SubscriberBuilder-BfE2cL1q.cjs → SubscriberBuilder-Cj2u9k5Q.cjs} +2 -2
- package/dist/{SubscriberBuilder-BfE2cL1q.cjs.map → SubscriberBuilder-Cj2u9k5Q.cjs.map} +1 -1
- package/dist/{SubscriberBuilder-BcAspHv9.mjs → SubscriberBuilder-DmxMU89X.mjs} +2 -2
- package/dist/{SubscriberBuilder-BcAspHv9.mjs.map → SubscriberBuilder-DmxMU89X.mjs.map} +1 -1
- package/dist/{TestEndpointAdaptor-JONQJeXc.mjs → TestEndpointAdaptor-1pPixE6y.mjs} +4 -4
- package/dist/{TestEndpointAdaptor-JONQJeXc.mjs.map → TestEndpointAdaptor-1pPixE6y.mjs.map} +1 -1
- package/dist/{TestEndpointAdaptor-C-c8v7VI.d.mts → TestEndpointAdaptor-5-unBV8O.d.mts} +3 -3
- package/dist/{TestEndpointAdaptor-BYCwwiYk.d.cts → TestEndpointAdaptor-Bm0UjDtV.d.cts} +2 -2
- package/dist/{TestEndpointAdaptor-Bew9lWsx.cjs → TestEndpointAdaptor-wA-fmq4v.cjs} +4 -4
- package/dist/{TestEndpointAdaptor-Bew9lWsx.cjs.map → TestEndpointAdaptor-wA-fmq4v.cjs.map} +1 -1
- package/dist/adaptors/aws.cjs +5 -5
- package/dist/adaptors/aws.d.cts +5 -5
- package/dist/adaptors/aws.d.mts +15 -15
- package/dist/adaptors/aws.mjs +5 -5
- package/dist/adaptors/hono.cjs +4 -4
- package/dist/adaptors/hono.d.cts +3 -3
- package/dist/adaptors/hono.d.mts +9 -9
- package/dist/adaptors/hono.mjs +4 -4
- package/dist/adaptors/testing.cjs +3 -3
- package/dist/adaptors/testing.d.cts +3 -3
- package/dist/adaptors/testing.d.mts +9 -9
- package/dist/adaptors/testing.mjs +3 -3
- package/dist/crons/Cron.d.mts +6 -6
- package/dist/crons/CronBuilder.d.mts +7 -7
- package/dist/crons/index.d.cts +4 -4
- package/dist/crons/index.d.mts +7 -7
- package/dist/endpoints/AmazonApiGatewayEndpointAdaptor.cjs +3 -3
- package/dist/endpoints/AmazonApiGatewayEndpointAdaptor.d.cts +3 -3
- package/dist/endpoints/AmazonApiGatewayEndpointAdaptor.d.mts +9 -9
- package/dist/endpoints/AmazonApiGatewayEndpointAdaptor.mjs +3 -3
- package/dist/endpoints/AmazonApiGatewayV1EndpointAdaptor.cjs +4 -4
- package/dist/endpoints/AmazonApiGatewayV1EndpointAdaptor.d.cts +4 -4
- package/dist/endpoints/AmazonApiGatewayV1EndpointAdaptor.d.mts +10 -10
- package/dist/endpoints/AmazonApiGatewayV1EndpointAdaptor.mjs +4 -4
- package/dist/endpoints/AmazonApiGatewayV2EndpointAdaptor.cjs +4 -4
- package/dist/endpoints/AmazonApiGatewayV2EndpointAdaptor.d.cts +4 -4
- package/dist/endpoints/AmazonApiGatewayV2EndpointAdaptor.d.mts +10 -10
- package/dist/endpoints/AmazonApiGatewayV2EndpointAdaptor.mjs +4 -4
- package/dist/endpoints/Authorizer.cjs +5 -14
- package/dist/endpoints/Authorizer.d.cts +2 -2
- package/dist/endpoints/Authorizer.d.mts +2 -2
- package/dist/endpoints/Authorizer.mjs +2 -13
- package/dist/endpoints/Endpoint.cjs +1 -1
- package/dist/endpoints/Endpoint.d.cts +2 -2
- package/dist/endpoints/Endpoint.d.mts +8 -8
- package/dist/endpoints/Endpoint.mjs +1 -1
- package/dist/endpoints/EndpointBuilder.cjs +4 -2
- package/dist/endpoints/EndpointBuilder.d.cts +3 -3
- package/dist/endpoints/EndpointBuilder.d.mts +9 -9
- package/dist/endpoints/EndpointBuilder.mjs +4 -2
- package/dist/endpoints/EndpointFactory.cjs +5 -3
- package/dist/endpoints/EndpointFactory.d.cts +4 -4
- package/dist/endpoints/EndpointFactory.d.mts +10 -10
- package/dist/endpoints/EndpointFactory.mjs +5 -3
- package/dist/endpoints/HonoEndpointAdaptor.cjs +4 -4
- package/dist/endpoints/HonoEndpointAdaptor.d.cts +3 -3
- package/dist/endpoints/HonoEndpointAdaptor.d.mts +9 -9
- package/dist/endpoints/HonoEndpointAdaptor.mjs +4 -4
- package/dist/endpoints/TestEndpointAdaptor.cjs +3 -3
- package/dist/endpoints/TestEndpointAdaptor.d.cts +3 -3
- package/dist/endpoints/TestEndpointAdaptor.d.mts +9 -9
- package/dist/endpoints/TestEndpointAdaptor.mjs +3 -3
- package/dist/endpoints/audit.d.cts +2 -2
- package/dist/endpoints/audit.d.mts +8 -8
- package/dist/endpoints/helpers.cjs +2 -2
- package/dist/endpoints/helpers.d.cts +2 -2
- package/dist/endpoints/helpers.d.mts +8 -8
- package/dist/endpoints/helpers.mjs +2 -2
- package/dist/endpoints/index.cjs +6 -3
- package/dist/endpoints/index.cjs.map +1 -1
- package/dist/endpoints/index.d.cts +7 -7
- package/dist/endpoints/index.d.mts +13 -13
- package/dist/endpoints/index.mjs +6 -4
- package/dist/endpoints/index.mjs.map +1 -1
- package/dist/endpoints/processAudits.cjs +1 -1
- package/dist/endpoints/processAudits.d.cts +24 -5
- package/dist/endpoints/processAudits.d.mts +30 -11
- package/dist/endpoints/processAudits.mjs +1 -1
- package/dist/endpoints/rls.cjs +3 -0
- package/dist/endpoints/rls.d.cts +9 -0
- package/dist/endpoints/rls.d.mts +9 -0
- package/dist/endpoints/rls.mjs +3 -0
- package/dist/functions/AWSLambdaFunction.d.mts +4 -4
- package/dist/functions/BaseFunctionBuilder.d.mts +2 -2
- package/dist/functions/Function.d.mts +2 -2
- package/dist/functions/FunctionBuilder.d.mts +4 -4
- package/dist/functions/FunctionExecutionWrapper.d.mts +3 -3
- package/dist/functions/TestFunctionAdaptor.d.mts +2 -2
- package/dist/functions/index.d.mts +5 -5
- package/dist/{helpers-CrrdyA04.mjs → helpers-C3B2lVrM.mjs} +2 -2
- package/dist/{helpers-CrrdyA04.mjs.map → helpers-C3B2lVrM.mjs.map} +1 -1
- package/dist/{helpers-DiPZVJQC.cjs → helpers-DxxSpLfw.cjs} +2 -2
- package/dist/{helpers-DiPZVJQC.cjs.map → helpers-DxxSpLfw.cjs.map} +1 -1
- package/dist/index-CFyaRrck.d.mts +10 -0
- package/dist/index.d.mts +2 -2
- package/dist/{processAudits-BFokHhCO.cjs → processAudits-CzHkPokQ.cjs} +13 -7
- package/dist/processAudits-CzHkPokQ.cjs.map +1 -0
- package/dist/{processAudits-DfcB-X-4.mjs → processAudits-Dj8UGqcW.mjs} +13 -7
- package/dist/processAudits-Dj8UGqcW.mjs.map +1 -0
- package/dist/publisher.d.mts +1 -1
- package/dist/rls-Bf3FRwto.mjs +9 -0
- package/dist/rls-Bf3FRwto.mjs.map +1 -0
- package/dist/rls-CmJ7bRsz.cjs +15 -0
- package/dist/rls-CmJ7bRsz.cjs.map +1 -0
- package/dist/subscribers/AWSLambdaSubscriberAdaptor.d.mts +3 -3
- package/dist/subscribers/Subscriber.cjs +1 -1
- package/dist/subscribers/Subscriber.d.mts +2 -2
- package/dist/subscribers/Subscriber.mjs +1 -1
- package/dist/subscribers/SubscriberBuilder.cjs +2 -2
- package/dist/subscribers/SubscriberBuilder.d.mts +3 -3
- package/dist/subscribers/SubscriberBuilder.mjs +2 -2
- package/dist/subscribers/index.cjs +2 -2
- package/dist/subscribers/index.d.cts +2 -2
- package/dist/subscribers/index.d.mts +5 -5
- package/dist/subscribers/index.mjs +2 -2
- package/dist/{types-DKf0juBf.d.mts → types-CScirkHt.d.mts} +1 -1
- package/dist/types.d.mts +1 -1
- package/package.json +4 -3
- package/src/endpoints/AmazonApiGatewayEndpointAdaptor.ts +59 -26
- package/src/endpoints/Authorizer.ts +119 -1
- package/src/endpoints/Endpoint.ts +19 -0
- package/src/endpoints/EndpointBuilder.ts +80 -6
- package/src/endpoints/EndpointFactory.ts +263 -27
- package/src/endpoints/HonoEndpointAdaptor.ts +68 -37
- package/src/endpoints/TestEndpointAdaptor.ts +2 -0
- package/src/endpoints/index.ts +7 -0
- package/src/endpoints/processAudits.ts +39 -16
- package/src/endpoints/rls.ts +67 -0
- package/dist/AmazonApiGatewayEndpointAdaptor-CacGag6F.mjs.map +0 -1
- package/dist/AmazonApiGatewayEndpointAdaptor-DXssXsJi.cjs.map +0 -1
- package/dist/Authorizer-BTmly8ps.d.cts +0 -29
- package/dist/Authorizer-pmPvIVgv.d.mts +0 -29
- package/dist/Endpoint-CA-byrDr.cjs.map +0 -1
- package/dist/Endpoint-DbPsw13b.mjs.map +0 -1
- package/dist/EndpointBuilder-CYkeYpsL.cjs.map +0 -1
- package/dist/EndpointBuilder-W5fdXxYQ.mjs.map +0 -1
- package/dist/EndpointFactory-B27nfeiE.mjs.map +0 -1
- package/dist/EndpointFactory-D5lFZXqY.cjs.map +0 -1
- package/dist/HonoEndpointAdaptor-B_gJPWGD.cjs.map +0 -1
- package/dist/HonoEndpointAdaptor-Bg_vTyA5.mjs.map +0 -1
- package/dist/endpoints/Authorizer.cjs.map +0 -1
- package/dist/endpoints/Authorizer.mjs.map +0 -1
- package/dist/index-licEVXjh.d.mts +0 -10
- package/dist/processAudits-BFokHhCO.cjs.map +0 -1
- package/dist/processAudits-DfcB-X-4.mjs.map +0 -1
package/dist/types.d.mts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { HttpMethod, LowerHttpMethod, RemoveUndefined } from "./types-
|
|
1
|
+
import { HttpMethod, LowerHttpMethod, RemoveUndefined } from "./types-CScirkHt.mjs";
|
|
2
2
|
export { HttpMethod, LowerHttpMethod, RemoveUndefined };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@geekmidas/constructs",
|
|
3
|
-
"version": "0.0
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"private": false,
|
|
5
5
|
"type": "module",
|
|
6
6
|
"exports": {
|
|
@@ -68,10 +68,11 @@
|
|
|
68
68
|
"openapi-types": "~12.1.3",
|
|
69
69
|
"@geekmidas/audit": "0.0.8",
|
|
70
70
|
"@geekmidas/cache": "0.0.7",
|
|
71
|
-
"@geekmidas/
|
|
71
|
+
"@geekmidas/db": "0.1.0",
|
|
72
72
|
"@geekmidas/errors": "0.0.1",
|
|
73
73
|
"@geekmidas/logger": "0.0.1",
|
|
74
74
|
"@geekmidas/rate-limit": "0.1.0",
|
|
75
|
+
"@geekmidas/events": "0.0.2",
|
|
75
76
|
"@geekmidas/schema": "0.0.2",
|
|
76
77
|
"@geekmidas/services": "0.0.1"
|
|
77
78
|
},
|
|
@@ -91,7 +92,7 @@
|
|
|
91
92
|
"@middy/core": ">=6.3.1",
|
|
92
93
|
"@types/aws-lambda": ">=8.10.92",
|
|
93
94
|
"hono": ">=4.8.2",
|
|
94
|
-
"@geekmidas/envkit": "~0.0
|
|
95
|
+
"@geekmidas/envkit": "~0.1.0"
|
|
95
96
|
},
|
|
96
97
|
"scripts": {
|
|
97
98
|
"ts": "tsc --noEmit --skipLibCheck src/**/*.ts"
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { AuditStorage, AuditableAction } from '@geekmidas/audit';
|
|
2
|
+
import { withRlsContext } from '@geekmidas/db/rls';
|
|
2
3
|
import type { Logger } from '@geekmidas/logger';
|
|
3
4
|
import type { StandardSchemaV1 } from '@standard-schema/spec';
|
|
4
5
|
import type { HttpMethod } from '../types';
|
|
@@ -297,6 +298,21 @@ export abstract class AmazonApiGatewayEndpoint<
|
|
|
297
298
|
// Get pre-resolved database from middleware
|
|
298
299
|
const rawDb = (event as any).db;
|
|
299
300
|
|
|
301
|
+
// Extract RLS context if configured and not bypassed
|
|
302
|
+
const rlsActive =
|
|
303
|
+
this.endpoint.rlsConfig &&
|
|
304
|
+
!this.endpoint.rlsBypass &&
|
|
305
|
+
rawDb !== undefined;
|
|
306
|
+
const rlsContext = rlsActive
|
|
307
|
+
? await this.endpoint.rlsConfig!.extractor({
|
|
308
|
+
services: event.services as ServiceRecord<TServices>,
|
|
309
|
+
session: event.session,
|
|
310
|
+
header: event.header,
|
|
311
|
+
cookie: event.cookie,
|
|
312
|
+
logger,
|
|
313
|
+
})
|
|
314
|
+
: undefined;
|
|
315
|
+
|
|
300
316
|
// Execute handler with automatic audit transaction support
|
|
301
317
|
const result = await executeWithAuditTransaction(
|
|
302
318
|
auditContext,
|
|
@@ -306,39 +322,54 @@ export abstract class AmazonApiGatewayEndpoint<
|
|
|
306
322
|
auditContext?.storage?.databaseServiceName &&
|
|
307
323
|
auditContext.storage.databaseServiceName ===
|
|
308
324
|
this.endpoint.databaseService?.serviceName;
|
|
309
|
-
const
|
|
325
|
+
const baseDb = sameDatabase
|
|
310
326
|
? (auditor?.getTransaction?.() ?? rawDb)
|
|
311
327
|
: rawDb;
|
|
312
328
|
|
|
313
|
-
|
|
314
|
-
const
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
329
|
+
// Helper to execute handler with given db
|
|
330
|
+
const executeHandler = async (db: any) => {
|
|
331
|
+
const responseBuilder = new ResponseBuilder();
|
|
332
|
+
const response = await this.endpoint.handler(
|
|
333
|
+
{
|
|
334
|
+
header: event.header,
|
|
335
|
+
cookie: event.cookie,
|
|
336
|
+
logger: event.logger,
|
|
337
|
+
services: event.services,
|
|
338
|
+
session: event.session,
|
|
339
|
+
auditor,
|
|
340
|
+
db,
|
|
341
|
+
...input,
|
|
342
|
+
} as any,
|
|
343
|
+
responseBuilder,
|
|
344
|
+
);
|
|
327
345
|
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
346
|
+
// Check if response has metadata
|
|
347
|
+
let data = response;
|
|
348
|
+
let metadata = responseBuilder.getMetadata();
|
|
331
349
|
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
350
|
+
if (Endpoint.hasMetadata(response)) {
|
|
351
|
+
data = response.data;
|
|
352
|
+
metadata = response.metadata;
|
|
353
|
+
}
|
|
336
354
|
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
355
|
+
const output = this.endpoint.outputSchema
|
|
356
|
+
? await this.endpoint.parseOutput(data)
|
|
357
|
+
: undefined;
|
|
358
|
+
|
|
359
|
+
return { output, metadata, responseBuilder };
|
|
360
|
+
};
|
|
361
|
+
|
|
362
|
+
// If RLS is active, wrap handler with RLS context
|
|
363
|
+
if (rlsActive && rlsContext && baseDb) {
|
|
364
|
+
return withRlsContext(
|
|
365
|
+
baseDb,
|
|
366
|
+
rlsContext,
|
|
367
|
+
async (trx: any) => executeHandler(trx),
|
|
368
|
+
{ prefix: this.endpoint.rlsConfig!.prefix },
|
|
369
|
+
);
|
|
370
|
+
}
|
|
340
371
|
|
|
341
|
-
return
|
|
372
|
+
return executeHandler(baseDb);
|
|
342
373
|
},
|
|
343
374
|
// Process declarative audits after handler (inside transaction)
|
|
344
375
|
async (result, auditor) => {
|
|
@@ -356,6 +387,8 @@ export abstract class AmazonApiGatewayEndpoint<
|
|
|
356
387
|
});
|
|
357
388
|
}
|
|
358
389
|
},
|
|
390
|
+
// Pass rawDb so storage can reuse existing transactions
|
|
391
|
+
{ db: rawDb },
|
|
359
392
|
);
|
|
360
393
|
|
|
361
394
|
const { output, metadata } = result;
|
|
@@ -1,3 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenAPI 3.1 compliant security scheme definition.
|
|
3
|
+
* @see https://spec.openapis.org/oas/v3.1.0#security-scheme-object
|
|
4
|
+
*/
|
|
5
|
+
export interface SecurityScheme {
|
|
6
|
+
/** The type of the security scheme */
|
|
7
|
+
type: 'apiKey' | 'http' | 'mutualTLS' | 'oauth2' | 'openIdConnect';
|
|
8
|
+
/** A description for security scheme */
|
|
9
|
+
description?: string;
|
|
10
|
+
/** Required for apiKey. The name of the header, query or cookie parameter */
|
|
11
|
+
name?: string;
|
|
12
|
+
/** Required for apiKey. The location of the API key */
|
|
13
|
+
in?: 'query' | 'header' | 'cookie';
|
|
14
|
+
/** Required for http. The name of the HTTP Authorization scheme (e.g., 'bearer') */
|
|
15
|
+
scheme?: string;
|
|
16
|
+
/** Optional for http bearer. A hint to the format of the bearer token */
|
|
17
|
+
bearerFormat?: string;
|
|
18
|
+
/** Required for oauth2. An object containing configuration for the flow types */
|
|
19
|
+
flows?: OAuthFlows;
|
|
20
|
+
/** Required for openIdConnect. The URL to discover OAuth2 configuration */
|
|
21
|
+
openIdConnectUrl?: string;
|
|
22
|
+
/** Vendor extensions (e.g., x-amazon-apigateway-authtype) */
|
|
23
|
+
[key: `x-${string}`]: unknown;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* OAuth2 flow configuration
|
|
28
|
+
*/
|
|
29
|
+
export interface OAuthFlows {
|
|
30
|
+
implicit?: OAuthFlow;
|
|
31
|
+
password?: OAuthFlow;
|
|
32
|
+
clientCredentials?: OAuthFlow;
|
|
33
|
+
authorizationCode?: OAuthFlow;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export interface OAuthFlow {
|
|
37
|
+
authorizationUrl?: string;
|
|
38
|
+
tokenUrl?: string;
|
|
39
|
+
refreshUrl?: string;
|
|
40
|
+
scopes: Record<string, string>;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Built-in security schemes available by default.
|
|
45
|
+
* Users can use these without defining them via .securitySchemes().
|
|
46
|
+
*/
|
|
47
|
+
export const BUILT_IN_SECURITY_SCHEMES = {
|
|
48
|
+
jwt: {
|
|
49
|
+
type: 'http',
|
|
50
|
+
scheme: 'bearer',
|
|
51
|
+
bearerFormat: 'JWT',
|
|
52
|
+
description: 'JWT Bearer token authentication',
|
|
53
|
+
},
|
|
54
|
+
bearer: {
|
|
55
|
+
type: 'http',
|
|
56
|
+
scheme: 'bearer',
|
|
57
|
+
description: 'Bearer token authentication',
|
|
58
|
+
},
|
|
59
|
+
apiKey: {
|
|
60
|
+
type: 'apiKey',
|
|
61
|
+
in: 'header',
|
|
62
|
+
name: 'X-API-Key',
|
|
63
|
+
description: 'API key authentication via header',
|
|
64
|
+
},
|
|
65
|
+
oauth2: {
|
|
66
|
+
type: 'oauth2',
|
|
67
|
+
flows: {},
|
|
68
|
+
description: 'OAuth 2.0 authentication',
|
|
69
|
+
},
|
|
70
|
+
oidc: {
|
|
71
|
+
type: 'openIdConnect',
|
|
72
|
+
openIdConnectUrl: '',
|
|
73
|
+
description: 'OpenID Connect authentication',
|
|
74
|
+
},
|
|
75
|
+
iam: {
|
|
76
|
+
type: 'apiKey',
|
|
77
|
+
in: 'header',
|
|
78
|
+
name: 'Authorization',
|
|
79
|
+
description: 'AWS IAM Signature Version 4 authentication',
|
|
80
|
+
'x-amazon-apigateway-authtype': 'awsSigv4',
|
|
81
|
+
},
|
|
82
|
+
} as const satisfies Record<string, SecurityScheme>;
|
|
83
|
+
|
|
84
|
+
/** Names of built-in security schemes */
|
|
85
|
+
export type BuiltInSecuritySchemeId = keyof typeof BUILT_IN_SECURITY_SCHEMES;
|
|
86
|
+
|
|
1
87
|
/**
|
|
2
88
|
* Represents an authorizer configuration for endpoints
|
|
3
89
|
*/
|
|
@@ -6,18 +92,25 @@ export interface Authorizer {
|
|
|
6
92
|
* Unique identifier for the authorizer
|
|
7
93
|
*/
|
|
8
94
|
name: string;
|
|
95
|
+
/**
|
|
96
|
+
* The OpenAPI security scheme definition for this authorizer
|
|
97
|
+
*/
|
|
98
|
+
securityScheme?: SecurityScheme;
|
|
9
99
|
/**
|
|
10
100
|
* Type of authorizer (e.g., 'iam', 'jwt', 'custom')
|
|
101
|
+
* @deprecated Use securityScheme.type instead
|
|
11
102
|
*/
|
|
12
103
|
type?: string;
|
|
13
104
|
/**
|
|
14
105
|
* Description of what this authorizer does
|
|
106
|
+
* @deprecated Use securityScheme.description instead
|
|
15
107
|
*/
|
|
16
108
|
description?: string;
|
|
17
109
|
/**
|
|
18
110
|
* Additional metadata specific to the authorizer type
|
|
111
|
+
* @deprecated Use securityScheme with x-* extensions instead
|
|
19
112
|
*/
|
|
20
|
-
metadata?: Record<string,
|
|
113
|
+
metadata?: Record<string, unknown>;
|
|
21
114
|
}
|
|
22
115
|
|
|
23
116
|
/**
|
|
@@ -32,3 +125,28 @@ export function createAuthorizer(
|
|
|
32
125
|
...options,
|
|
33
126
|
};
|
|
34
127
|
}
|
|
128
|
+
|
|
129
|
+
/**
|
|
130
|
+
* Check if a name is a built-in security scheme
|
|
131
|
+
*/
|
|
132
|
+
export function isBuiltInSecurityScheme(
|
|
133
|
+
name: string,
|
|
134
|
+
): name is BuiltInSecuritySchemeId {
|
|
135
|
+
return name in BUILT_IN_SECURITY_SCHEMES;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
/**
|
|
139
|
+
* Get a security scheme by name (built-in or custom)
|
|
140
|
+
*/
|
|
141
|
+
export function getSecurityScheme(
|
|
142
|
+
name: string,
|
|
143
|
+
customSchemes?: Record<string, SecurityScheme>,
|
|
144
|
+
): SecurityScheme | undefined {
|
|
145
|
+
if (customSchemes && name in customSchemes) {
|
|
146
|
+
return customSchemes[name];
|
|
147
|
+
}
|
|
148
|
+
if (isBuiltInSecurityScheme(name)) {
|
|
149
|
+
return BUILT_IN_SECURITY_SCHEMES[name];
|
|
150
|
+
}
|
|
151
|
+
return undefined;
|
|
152
|
+
}
|
|
@@ -29,6 +29,7 @@ import { Function, type FunctionHandler } from '../functions';
|
|
|
29
29
|
import type { HttpMethod, LowerHttpMethod, RemoveUndefined } from '../types';
|
|
30
30
|
import type { Authorizer } from './Authorizer';
|
|
31
31
|
import type { ActorExtractor, MappedAudit } from './audit';
|
|
32
|
+
import type { RlsConfig } from './rls';
|
|
32
33
|
|
|
33
34
|
/**
|
|
34
35
|
* Represents an HTTP endpoint that can handle requests with type-safe input/output validation,
|
|
@@ -123,6 +124,10 @@ export class Endpoint<
|
|
|
123
124
|
public audits: MappedAudit<TAuditAction, OutSchema>[] = [];
|
|
124
125
|
/** Database service for this endpoint */
|
|
125
126
|
public declare databaseService?: Service<TDatabaseServiceName, TDatabase>;
|
|
127
|
+
/** RLS configuration for this endpoint */
|
|
128
|
+
public rlsConfig?: RlsConfig<TServices, TSession, TLogger>;
|
|
129
|
+
/** Whether to bypass RLS for this endpoint */
|
|
130
|
+
public rlsBypass?: boolean;
|
|
126
131
|
/** The endpoint handler function */
|
|
127
132
|
private endpointFn!: EndpointHandler<
|
|
128
133
|
TInput,
|
|
@@ -593,6 +598,8 @@ export class Endpoint<
|
|
|
593
598
|
actorExtractor,
|
|
594
599
|
audits,
|
|
595
600
|
databaseService,
|
|
601
|
+
rlsConfig,
|
|
602
|
+
rlsBypass,
|
|
596
603
|
}: EndpointOptions<
|
|
597
604
|
TRoute,
|
|
598
605
|
TMethod,
|
|
@@ -658,6 +665,14 @@ export class Endpoint<
|
|
|
658
665
|
if (databaseService) {
|
|
659
666
|
this.databaseService = databaseService;
|
|
660
667
|
}
|
|
668
|
+
|
|
669
|
+
if (rlsConfig) {
|
|
670
|
+
this.rlsConfig = rlsConfig;
|
|
671
|
+
}
|
|
672
|
+
|
|
673
|
+
if (rlsBypass) {
|
|
674
|
+
this.rlsBypass = rlsBypass;
|
|
675
|
+
}
|
|
661
676
|
}
|
|
662
677
|
}
|
|
663
678
|
|
|
@@ -775,6 +790,10 @@ export interface EndpointOptions<
|
|
|
775
790
|
audits?: MappedAudit<TAuditAction, OutSchema>[];
|
|
776
791
|
/** Database service for this endpoint */
|
|
777
792
|
databaseService?: Service<TDatabaseServiceName, TDatabase>;
|
|
793
|
+
/** RLS configuration for this endpoint */
|
|
794
|
+
rlsConfig?: RlsConfig<TServices, TSession, TLogger>;
|
|
795
|
+
/** Whether to bypass RLS for this endpoint */
|
|
796
|
+
rlsBypass?: boolean;
|
|
778
797
|
}
|
|
779
798
|
|
|
780
799
|
/**
|
|
@@ -12,7 +12,8 @@ import uniqBy from 'lodash.uniqby';
|
|
|
12
12
|
import { ConstructType } from '../Construct';
|
|
13
13
|
import { BaseFunctionBuilder } from '../functions';
|
|
14
14
|
import type { HttpMethod } from '../types';
|
|
15
|
-
import type { Authorizer } from './Authorizer';
|
|
15
|
+
import type { Authorizer, SecurityScheme } from './Authorizer';
|
|
16
|
+
import { getSecurityScheme } from './Authorizer';
|
|
16
17
|
import { Endpoint, type EndpointSchemas } from './Endpoint';
|
|
17
18
|
import type {
|
|
18
19
|
AuthorizeFn,
|
|
@@ -21,6 +22,8 @@ import type {
|
|
|
21
22
|
SuccessStatus,
|
|
22
23
|
} from './Endpoint';
|
|
23
24
|
import type { ActorExtractor, MappedAudit } from './audit';
|
|
25
|
+
import type { RlsBypass, RlsConfig } from './rls';
|
|
26
|
+
import { RLS_BYPASS } from './rls';
|
|
24
27
|
|
|
25
28
|
export class EndpointBuilder<
|
|
26
29
|
TRoute extends string,
|
|
@@ -66,6 +69,9 @@ export class EndpointBuilder<
|
|
|
66
69
|
_authorizerName?: TAuthorizers[number];
|
|
67
70
|
_actorExtractor?: ActorExtractor<TServices, TSession, TLogger>;
|
|
68
71
|
_audits: MappedAudit<TAuditAction, OutSchema>[] = [];
|
|
72
|
+
_customSecuritySchemes: Record<string, SecurityScheme> = {};
|
|
73
|
+
_rlsConfig?: RlsConfig<TServices, TSession, TLogger>;
|
|
74
|
+
_rlsBypass?: boolean;
|
|
69
75
|
|
|
70
76
|
constructor(
|
|
71
77
|
readonly route: TRoute,
|
|
@@ -581,6 +587,57 @@ export class EndpointBuilder<
|
|
|
581
587
|
>;
|
|
582
588
|
}
|
|
583
589
|
|
|
590
|
+
/**
|
|
591
|
+
* Configure RLS (Row-Level Security) context for this endpoint.
|
|
592
|
+
* Pass `false` or `RLS_BYPASS` to explicitly bypass RLS for this endpoint.
|
|
593
|
+
*
|
|
594
|
+
* @example
|
|
595
|
+
* ```typescript
|
|
596
|
+
* // Custom RLS config for this endpoint
|
|
597
|
+
* .rls({
|
|
598
|
+
* extractor: ({ session }) => ({
|
|
599
|
+
* user_id: session.userId,
|
|
600
|
+
* tenant_id: session.tenantId,
|
|
601
|
+
* }),
|
|
602
|
+
* prefix: 'app',
|
|
603
|
+
* })
|
|
604
|
+
*
|
|
605
|
+
* // Bypass RLS (for admin endpoints)
|
|
606
|
+
* .rls(false)
|
|
607
|
+
* ```
|
|
608
|
+
*/
|
|
609
|
+
rls(
|
|
610
|
+
config: RlsConfig<TServices, TSession, TLogger> | false | RlsBypass,
|
|
611
|
+
): this {
|
|
612
|
+
if (config === false || config === RLS_BYPASS) {
|
|
613
|
+
this._rlsBypass = true;
|
|
614
|
+
this._rlsConfig = undefined;
|
|
615
|
+
} else {
|
|
616
|
+
this._rlsConfig = config;
|
|
617
|
+
this._rlsBypass = false;
|
|
618
|
+
}
|
|
619
|
+
return this;
|
|
620
|
+
}
|
|
621
|
+
|
|
622
|
+
/**
|
|
623
|
+
* Explicitly bypass RLS for this endpoint.
|
|
624
|
+
* Useful for admin operations that need unrestricted database access.
|
|
625
|
+
*
|
|
626
|
+
* @example
|
|
627
|
+
* ```typescript
|
|
628
|
+
* .rlsBypass()
|
|
629
|
+
* .handle(async ({ db }) => {
|
|
630
|
+
* // Full access, no RLS filtering
|
|
631
|
+
* return db.selectFrom('orders').selectAll().execute();
|
|
632
|
+
* })
|
|
633
|
+
* ```
|
|
634
|
+
*/
|
|
635
|
+
rlsBypass(): this {
|
|
636
|
+
this._rlsBypass = true;
|
|
637
|
+
this._rlsConfig = undefined;
|
|
638
|
+
return this;
|
|
639
|
+
}
|
|
640
|
+
|
|
584
641
|
// EndpointBuilder doesn't have a generic input method - it uses body, query, params instead
|
|
585
642
|
input(_schema: any): any {
|
|
586
643
|
throw new Error(
|
|
@@ -617,11 +674,26 @@ export class EndpointBuilder<
|
|
|
617
674
|
> {
|
|
618
675
|
// Find authorizer metadata if name is set
|
|
619
676
|
// If the authorizer name is set but not in availableAuthorizers, create a simple authorizer object
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
)
|
|
624
|
-
|
|
677
|
+
let authorizer: Authorizer | undefined;
|
|
678
|
+
if (this._authorizerName) {
|
|
679
|
+
const existingAuthorizer = this._availableAuthorizers.find(
|
|
680
|
+
(a) => a.name === this._authorizerName,
|
|
681
|
+
);
|
|
682
|
+
|
|
683
|
+
if (existingAuthorizer) {
|
|
684
|
+
authorizer = existingAuthorizer;
|
|
685
|
+
} else {
|
|
686
|
+
// Create authorizer with security scheme if available (built-in or custom)
|
|
687
|
+
const securityScheme = getSecurityScheme(
|
|
688
|
+
this._authorizerName as string,
|
|
689
|
+
this._customSecuritySchemes,
|
|
690
|
+
);
|
|
691
|
+
authorizer = {
|
|
692
|
+
name: this._authorizerName as string,
|
|
693
|
+
securityScheme,
|
|
694
|
+
};
|
|
695
|
+
}
|
|
696
|
+
}
|
|
625
697
|
|
|
626
698
|
return new Endpoint({
|
|
627
699
|
fn,
|
|
@@ -646,6 +718,8 @@ export class EndpointBuilder<
|
|
|
646
718
|
actorExtractor: this._actorExtractor,
|
|
647
719
|
audits: this._audits,
|
|
648
720
|
databaseService: this._databaseService,
|
|
721
|
+
rlsConfig: this._rlsConfig,
|
|
722
|
+
rlsBypass: this._rlsBypass,
|
|
649
723
|
});
|
|
650
724
|
}
|
|
651
725
|
}
|