@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.
Files changed (210) hide show
  1. package/README.md +90 -0
  2. package/dist/{AWSLambdaFunction-qWpalqfr.d.mts → AWSLambdaFunction-D9RZhm0N.d.mts} +3 -3
  3. package/dist/{AWSLambdaSubscriberAdaptor-CWbBNRz3.d.mts → AWSLambdaSubscriberAdaptor-C0aZBU64.d.mts} +2 -2
  4. package/dist/{AmazonApiGatewayEndpointAdaptor-DXssXsJi.cjs → AmazonApiGatewayEndpointAdaptor-Bk6ssx3K.cjs} +40 -27
  5. package/dist/AmazonApiGatewayEndpointAdaptor-Bk6ssx3K.cjs.map +1 -0
  6. package/dist/{AmazonApiGatewayEndpointAdaptor-Da9BR5On.d.cts → AmazonApiGatewayEndpointAdaptor-CbJqLU6I.d.cts} +2 -2
  7. package/dist/{AmazonApiGatewayEndpointAdaptor-BQ0IJdaI.d.mts → AmazonApiGatewayEndpointAdaptor-DC3N7zY_.d.mts} +3 -3
  8. package/dist/{AmazonApiGatewayEndpointAdaptor-CacGag6F.mjs → AmazonApiGatewayEndpointAdaptor-pEWzF2uY.mjs} +40 -27
  9. package/dist/AmazonApiGatewayEndpointAdaptor-pEWzF2uY.mjs.map +1 -0
  10. package/dist/{AmazonApiGatewayV1EndpointAdaptor-C4_AZ1ek.d.mts → AmazonApiGatewayV1EndpointAdaptor-BVxgQ-7J.d.mts} +4 -4
  11. package/dist/{AmazonApiGatewayV1EndpointAdaptor-CSm3NsWz.d.cts → AmazonApiGatewayV1EndpointAdaptor-CVwJ5k16.d.cts} +3 -3
  12. package/dist/{AmazonApiGatewayV1EndpointAdaptor-BpnG55R7.mjs → AmazonApiGatewayV1EndpointAdaptor-MJpRbIaQ.mjs} +2 -2
  13. package/dist/{AmazonApiGatewayV1EndpointAdaptor-BpnG55R7.mjs.map → AmazonApiGatewayV1EndpointAdaptor-MJpRbIaQ.mjs.map} +1 -1
  14. package/dist/{AmazonApiGatewayV1EndpointAdaptor-Df4kszio.cjs → AmazonApiGatewayV1EndpointAdaptor-uBp_4zLf.cjs} +2 -2
  15. package/dist/{AmazonApiGatewayV1EndpointAdaptor-Df4kszio.cjs.map → AmazonApiGatewayV1EndpointAdaptor-uBp_4zLf.cjs.map} +1 -1
  16. package/dist/{AmazonApiGatewayV2EndpointAdaptor-6hsBFVLf.d.cts → AmazonApiGatewayV2EndpointAdaptor-1oBZdQH3.d.cts} +3 -3
  17. package/dist/{AmazonApiGatewayV2EndpointAdaptor-DdM8Tr1X.d.mts → AmazonApiGatewayV2EndpointAdaptor-C3H8Hpv7.d.mts} +4 -4
  18. package/dist/{AmazonApiGatewayV2EndpointAdaptor-ZORzMEET.mjs → AmazonApiGatewayV2EndpointAdaptor-ChO8BlDz.mjs} +2 -2
  19. package/dist/{AmazonApiGatewayV2EndpointAdaptor-ZORzMEET.mjs.map → AmazonApiGatewayV2EndpointAdaptor-ChO8BlDz.mjs.map} +1 -1
  20. package/dist/{AmazonApiGatewayV2EndpointAdaptor-5SIvqPby.cjs → AmazonApiGatewayV2EndpointAdaptor-I1W23Nvn.cjs} +2 -2
  21. package/dist/{AmazonApiGatewayV2EndpointAdaptor-5SIvqPby.cjs.map → AmazonApiGatewayV2EndpointAdaptor-I1W23Nvn.cjs.map} +1 -1
  22. package/dist/Authorizer-C0ge_tc8.cjs +92 -0
  23. package/dist/Authorizer-C0ge_tc8.cjs.map +1 -0
  24. package/dist/Authorizer-CpSUMTIs.d.cts +125 -0
  25. package/dist/Authorizer-Cpx59w_q.d.mts +125 -0
  26. package/dist/Authorizer-r9U3y_ms.mjs +68 -0
  27. package/dist/Authorizer-r9U3y_ms.mjs.map +1 -0
  28. package/dist/{BaseFunctionBuilder-Ct6zY6Jq.d.mts → BaseFunctionBuilder-CoV7J45W.d.mts} +2 -2
  29. package/dist/{Construct-DDR0295I.d.mts → Construct-jBKqb-Zi.d.mts} +1 -1
  30. package/dist/Construct.d.mts +1 -1
  31. package/dist/{Cron-DnMRWPFR.d.mts → Cron-JZkp_fHy.d.mts} +2 -2
  32. package/dist/{CronBuilder-RLDitFmP.d.mts → CronBuilder-BmFDO0Dm.d.mts} +4 -4
  33. package/dist/{Endpoint-DbPsw13b.mjs → Endpoint-B70_KKhu.mjs} +8 -2
  34. package/dist/Endpoint-B70_KKhu.mjs.map +1 -0
  35. package/dist/{Endpoint-CA-byrDr.cjs → Endpoint-BJo9Hhwm.cjs} +8 -2
  36. package/dist/Endpoint-BJo9Hhwm.cjs.map +1 -0
  37. package/dist/{Endpoint-PtQ-wLIS.d.mts → Endpoint-C5djXyae.d.mts} +69 -6
  38. package/dist/{Endpoint-D2Imgihs.d.cts → Endpoint-CC2RGjkl.d.cts} +67 -4
  39. package/dist/{EndpointBuilder-BPHpUekp.d.mts → EndpointBuilder-CD8LkBda.d.mts} +43 -5
  40. package/dist/{EndpointBuilder-CYkeYpsL.cjs → EndpointBuilder-DeswNQdG.cjs} +69 -4
  41. package/dist/EndpointBuilder-DeswNQdG.cjs.map +1 -0
  42. package/dist/{EndpointBuilder-W5fdXxYQ.mjs → EndpointBuilder-FyyoFTJ5.mjs} +69 -4
  43. package/dist/EndpointBuilder-FyyoFTJ5.mjs.map +1 -0
  44. package/dist/{EndpointBuilder-TApJQhtG.d.cts → EndpointBuilder-vXk6eIJk.d.cts} +41 -3
  45. package/dist/{EndpointFactory-CNlfBDuD.d.mts → EndpointFactory-3g-7Rznt.d.cts} +68 -21
  46. package/dist/{EndpointFactory-B5fOINuc.d.cts → EndpointFactory-DaFR9LQG.d.mts} +68 -21
  47. package/dist/{EndpointFactory-D5lFZXqY.cjs → EndpointFactory-DcT_g9M_.cjs} +117 -14
  48. package/dist/EndpointFactory-DcT_g9M_.cjs.map +1 -0
  49. package/dist/{EndpointFactory-B27nfeiE.mjs → EndpointFactory-KJAjBWmO.mjs} +117 -14
  50. package/dist/EndpointFactory-KJAjBWmO.mjs.map +1 -0
  51. package/dist/{Function-CD3rXWfa.d.mts → Function-Vh1t-Qjj.d.mts} +2 -2
  52. package/dist/{FunctionBuilder-j2VkwuGf.d.mts → FunctionBuilder-3jsoFffg.d.mts} +4 -4
  53. package/dist/{FunctionExecutionWrapper-B0WP-Vec.d.mts → FunctionExecutionWrapper-CI3CaoCo.d.mts} +2 -2
  54. package/dist/{HonoEndpointAdaptor-CLOpobdq.d.cts → HonoEndpointAdaptor-BJh4J-J9.d.cts} +4 -4
  55. package/dist/{HonoEndpointAdaptor-Bg_vTyA5.mjs → HonoEndpointAdaptor-CcvXzoYV.mjs} +43 -30
  56. package/dist/HonoEndpointAdaptor-CcvXzoYV.mjs.map +1 -0
  57. package/dist/{HonoEndpointAdaptor-B_gJPWGD.cjs → HonoEndpointAdaptor-DodwLM0-.cjs} +43 -30
  58. package/dist/HonoEndpointAdaptor-DodwLM0-.cjs.map +1 -0
  59. package/dist/{HonoEndpointAdaptor-C9gYYBWu.d.mts → HonoEndpointAdaptor-kb1ByjUL.d.mts} +5 -5
  60. package/dist/{Subscriber-D-FPWts6.cjs → Subscriber-DOt3svUC.cjs} +1 -1
  61. package/dist/{Subscriber-D-FPWts6.cjs.map → Subscriber-DOt3svUC.cjs.map} +1 -1
  62. package/dist/{Subscriber-itwm7ugy.d.mts → Subscriber-aNr1qkxR.d.mts} +2 -2
  63. package/dist/{Subscriber-CGb8LjZa.mjs → Subscriber-kCHbH2fZ.mjs} +1 -1
  64. package/dist/{Subscriber-CGb8LjZa.mjs.map → Subscriber-kCHbH2fZ.mjs.map} +1 -1
  65. package/dist/{SubscriberBuilder-9j3JCu8-.d.mts → SubscriberBuilder-CWS4tdbp.d.mts} +2 -2
  66. package/dist/{SubscriberBuilder-BfE2cL1q.cjs → SubscriberBuilder-Cj2u9k5Q.cjs} +2 -2
  67. package/dist/{SubscriberBuilder-BfE2cL1q.cjs.map → SubscriberBuilder-Cj2u9k5Q.cjs.map} +1 -1
  68. package/dist/{SubscriberBuilder-BcAspHv9.mjs → SubscriberBuilder-DmxMU89X.mjs} +2 -2
  69. package/dist/{SubscriberBuilder-BcAspHv9.mjs.map → SubscriberBuilder-DmxMU89X.mjs.map} +1 -1
  70. package/dist/{TestEndpointAdaptor-JONQJeXc.mjs → TestEndpointAdaptor-1pPixE6y.mjs} +4 -4
  71. package/dist/{TestEndpointAdaptor-JONQJeXc.mjs.map → TestEndpointAdaptor-1pPixE6y.mjs.map} +1 -1
  72. package/dist/{TestEndpointAdaptor-C-c8v7VI.d.mts → TestEndpointAdaptor-5-unBV8O.d.mts} +3 -3
  73. package/dist/{TestEndpointAdaptor-BYCwwiYk.d.cts → TestEndpointAdaptor-Bm0UjDtV.d.cts} +2 -2
  74. package/dist/{TestEndpointAdaptor-Bew9lWsx.cjs → TestEndpointAdaptor-wA-fmq4v.cjs} +4 -4
  75. package/dist/{TestEndpointAdaptor-Bew9lWsx.cjs.map → TestEndpointAdaptor-wA-fmq4v.cjs.map} +1 -1
  76. package/dist/adaptors/aws.cjs +5 -5
  77. package/dist/adaptors/aws.d.cts +5 -5
  78. package/dist/adaptors/aws.d.mts +15 -15
  79. package/dist/adaptors/aws.mjs +5 -5
  80. package/dist/adaptors/hono.cjs +4 -4
  81. package/dist/adaptors/hono.d.cts +3 -3
  82. package/dist/adaptors/hono.d.mts +9 -9
  83. package/dist/adaptors/hono.mjs +4 -4
  84. package/dist/adaptors/testing.cjs +3 -3
  85. package/dist/adaptors/testing.d.cts +3 -3
  86. package/dist/adaptors/testing.d.mts +9 -9
  87. package/dist/adaptors/testing.mjs +3 -3
  88. package/dist/crons/Cron.d.mts +6 -6
  89. package/dist/crons/CronBuilder.d.mts +7 -7
  90. package/dist/crons/index.d.cts +4 -4
  91. package/dist/crons/index.d.mts +7 -7
  92. package/dist/endpoints/AmazonApiGatewayEndpointAdaptor.cjs +3 -3
  93. package/dist/endpoints/AmazonApiGatewayEndpointAdaptor.d.cts +3 -3
  94. package/dist/endpoints/AmazonApiGatewayEndpointAdaptor.d.mts +9 -9
  95. package/dist/endpoints/AmazonApiGatewayEndpointAdaptor.mjs +3 -3
  96. package/dist/endpoints/AmazonApiGatewayV1EndpointAdaptor.cjs +4 -4
  97. package/dist/endpoints/AmazonApiGatewayV1EndpointAdaptor.d.cts +4 -4
  98. package/dist/endpoints/AmazonApiGatewayV1EndpointAdaptor.d.mts +10 -10
  99. package/dist/endpoints/AmazonApiGatewayV1EndpointAdaptor.mjs +4 -4
  100. package/dist/endpoints/AmazonApiGatewayV2EndpointAdaptor.cjs +4 -4
  101. package/dist/endpoints/AmazonApiGatewayV2EndpointAdaptor.d.cts +4 -4
  102. package/dist/endpoints/AmazonApiGatewayV2EndpointAdaptor.d.mts +10 -10
  103. package/dist/endpoints/AmazonApiGatewayV2EndpointAdaptor.mjs +4 -4
  104. package/dist/endpoints/Authorizer.cjs +5 -14
  105. package/dist/endpoints/Authorizer.d.cts +2 -2
  106. package/dist/endpoints/Authorizer.d.mts +2 -2
  107. package/dist/endpoints/Authorizer.mjs +2 -13
  108. package/dist/endpoints/Endpoint.cjs +1 -1
  109. package/dist/endpoints/Endpoint.d.cts +2 -2
  110. package/dist/endpoints/Endpoint.d.mts +8 -8
  111. package/dist/endpoints/Endpoint.mjs +1 -1
  112. package/dist/endpoints/EndpointBuilder.cjs +4 -2
  113. package/dist/endpoints/EndpointBuilder.d.cts +3 -3
  114. package/dist/endpoints/EndpointBuilder.d.mts +9 -9
  115. package/dist/endpoints/EndpointBuilder.mjs +4 -2
  116. package/dist/endpoints/EndpointFactory.cjs +5 -3
  117. package/dist/endpoints/EndpointFactory.d.cts +4 -4
  118. package/dist/endpoints/EndpointFactory.d.mts +10 -10
  119. package/dist/endpoints/EndpointFactory.mjs +5 -3
  120. package/dist/endpoints/HonoEndpointAdaptor.cjs +4 -4
  121. package/dist/endpoints/HonoEndpointAdaptor.d.cts +3 -3
  122. package/dist/endpoints/HonoEndpointAdaptor.d.mts +9 -9
  123. package/dist/endpoints/HonoEndpointAdaptor.mjs +4 -4
  124. package/dist/endpoints/TestEndpointAdaptor.cjs +3 -3
  125. package/dist/endpoints/TestEndpointAdaptor.d.cts +3 -3
  126. package/dist/endpoints/TestEndpointAdaptor.d.mts +9 -9
  127. package/dist/endpoints/TestEndpointAdaptor.mjs +3 -3
  128. package/dist/endpoints/audit.d.cts +2 -2
  129. package/dist/endpoints/audit.d.mts +8 -8
  130. package/dist/endpoints/helpers.cjs +2 -2
  131. package/dist/endpoints/helpers.d.cts +2 -2
  132. package/dist/endpoints/helpers.d.mts +8 -8
  133. package/dist/endpoints/helpers.mjs +2 -2
  134. package/dist/endpoints/index.cjs +6 -3
  135. package/dist/endpoints/index.cjs.map +1 -1
  136. package/dist/endpoints/index.d.cts +7 -7
  137. package/dist/endpoints/index.d.mts +13 -13
  138. package/dist/endpoints/index.mjs +6 -4
  139. package/dist/endpoints/index.mjs.map +1 -1
  140. package/dist/endpoints/processAudits.cjs +1 -1
  141. package/dist/endpoints/processAudits.d.cts +24 -5
  142. package/dist/endpoints/processAudits.d.mts +30 -11
  143. package/dist/endpoints/processAudits.mjs +1 -1
  144. package/dist/endpoints/rls.cjs +3 -0
  145. package/dist/endpoints/rls.d.cts +9 -0
  146. package/dist/endpoints/rls.d.mts +9 -0
  147. package/dist/endpoints/rls.mjs +3 -0
  148. package/dist/functions/AWSLambdaFunction.d.mts +4 -4
  149. package/dist/functions/BaseFunctionBuilder.d.mts +2 -2
  150. package/dist/functions/Function.d.mts +2 -2
  151. package/dist/functions/FunctionBuilder.d.mts +4 -4
  152. package/dist/functions/FunctionExecutionWrapper.d.mts +3 -3
  153. package/dist/functions/TestFunctionAdaptor.d.mts +2 -2
  154. package/dist/functions/index.d.mts +5 -5
  155. package/dist/{helpers-CrrdyA04.mjs → helpers-C3B2lVrM.mjs} +2 -2
  156. package/dist/{helpers-CrrdyA04.mjs.map → helpers-C3B2lVrM.mjs.map} +1 -1
  157. package/dist/{helpers-DiPZVJQC.cjs → helpers-DxxSpLfw.cjs} +2 -2
  158. package/dist/{helpers-DiPZVJQC.cjs.map → helpers-DxxSpLfw.cjs.map} +1 -1
  159. package/dist/index-CFyaRrck.d.mts +10 -0
  160. package/dist/index.d.mts +2 -2
  161. package/dist/{processAudits-BFokHhCO.cjs → processAudits-CzHkPokQ.cjs} +13 -7
  162. package/dist/processAudits-CzHkPokQ.cjs.map +1 -0
  163. package/dist/{processAudits-DfcB-X-4.mjs → processAudits-Dj8UGqcW.mjs} +13 -7
  164. package/dist/processAudits-Dj8UGqcW.mjs.map +1 -0
  165. package/dist/publisher.d.mts +1 -1
  166. package/dist/rls-Bf3FRwto.mjs +9 -0
  167. package/dist/rls-Bf3FRwto.mjs.map +1 -0
  168. package/dist/rls-CmJ7bRsz.cjs +15 -0
  169. package/dist/rls-CmJ7bRsz.cjs.map +1 -0
  170. package/dist/subscribers/AWSLambdaSubscriberAdaptor.d.mts +3 -3
  171. package/dist/subscribers/Subscriber.cjs +1 -1
  172. package/dist/subscribers/Subscriber.d.mts +2 -2
  173. package/dist/subscribers/Subscriber.mjs +1 -1
  174. package/dist/subscribers/SubscriberBuilder.cjs +2 -2
  175. package/dist/subscribers/SubscriberBuilder.d.mts +3 -3
  176. package/dist/subscribers/SubscriberBuilder.mjs +2 -2
  177. package/dist/subscribers/index.cjs +2 -2
  178. package/dist/subscribers/index.d.cts +2 -2
  179. package/dist/subscribers/index.d.mts +5 -5
  180. package/dist/subscribers/index.mjs +2 -2
  181. package/dist/{types-DKf0juBf.d.mts → types-CScirkHt.d.mts} +1 -1
  182. package/dist/types.d.mts +1 -1
  183. package/package.json +4 -3
  184. package/src/endpoints/AmazonApiGatewayEndpointAdaptor.ts +59 -26
  185. package/src/endpoints/Authorizer.ts +119 -1
  186. package/src/endpoints/Endpoint.ts +19 -0
  187. package/src/endpoints/EndpointBuilder.ts +80 -6
  188. package/src/endpoints/EndpointFactory.ts +263 -27
  189. package/src/endpoints/HonoEndpointAdaptor.ts +68 -37
  190. package/src/endpoints/TestEndpointAdaptor.ts +2 -0
  191. package/src/endpoints/index.ts +7 -0
  192. package/src/endpoints/processAudits.ts +39 -16
  193. package/src/endpoints/rls.ts +67 -0
  194. package/dist/AmazonApiGatewayEndpointAdaptor-CacGag6F.mjs.map +0 -1
  195. package/dist/AmazonApiGatewayEndpointAdaptor-DXssXsJi.cjs.map +0 -1
  196. package/dist/Authorizer-BTmly8ps.d.cts +0 -29
  197. package/dist/Authorizer-pmPvIVgv.d.mts +0 -29
  198. package/dist/Endpoint-CA-byrDr.cjs.map +0 -1
  199. package/dist/Endpoint-DbPsw13b.mjs.map +0 -1
  200. package/dist/EndpointBuilder-CYkeYpsL.cjs.map +0 -1
  201. package/dist/EndpointBuilder-W5fdXxYQ.mjs.map +0 -1
  202. package/dist/EndpointFactory-B27nfeiE.mjs.map +0 -1
  203. package/dist/EndpointFactory-D5lFZXqY.cjs.map +0 -1
  204. package/dist/HonoEndpointAdaptor-B_gJPWGD.cjs.map +0 -1
  205. package/dist/HonoEndpointAdaptor-Bg_vTyA5.mjs.map +0 -1
  206. package/dist/endpoints/Authorizer.cjs.map +0 -1
  207. package/dist/endpoints/Authorizer.mjs.map +0 -1
  208. package/dist/index-licEVXjh.d.mts +0 -10
  209. package/dist/processAudits-BFokHhCO.cjs.map +0 -1
  210. 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-DKf0juBf.mjs";
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.22",
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/events": "0.0.2",
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.8"
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 db = sameDatabase
325
+ const baseDb = sameDatabase
310
326
  ? (auditor?.getTransaction?.() ?? rawDb)
311
327
  : rawDb;
312
328
 
313
- const responseBuilder = new ResponseBuilder();
314
- const response = await this.endpoint.handler(
315
- {
316
- header: event.header,
317
- cookie: event.cookie,
318
- logger: event.logger,
319
- services: event.services,
320
- session: event.session,
321
- auditor,
322
- db,
323
- ...input,
324
- } as any,
325
- responseBuilder,
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
- // Check if response has metadata
329
- let data = response;
330
- let metadata = responseBuilder.getMetadata();
346
+ // Check if response has metadata
347
+ let data = response;
348
+ let metadata = responseBuilder.getMetadata();
331
349
 
332
- if (Endpoint.hasMetadata(response)) {
333
- data = response.data;
334
- metadata = response.metadata;
335
- }
350
+ if (Endpoint.hasMetadata(response)) {
351
+ data = response.data;
352
+ metadata = response.metadata;
353
+ }
336
354
 
337
- const output = this.endpoint.outputSchema
338
- ? await this.endpoint.parseOutput(data)
339
- : undefined;
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 { output, metadata, responseBuilder };
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, any>;
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
- const authorizer = this._authorizerName
621
- ? (this._availableAuthorizers.find(
622
- (a) => a.name === this._authorizerName,
623
- ) ?? { name: this._authorizerName })
624
- : undefined;
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
  }