@geekmidas/constructs 1.0.1 → 1.0.2

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 (114) hide show
  1. package/dist/{AWSLambdaSubscriberAdaptor-yt7Q8xE-.mjs → AWSLambdaSubscriberAdaptor-BUvb-v_n.mjs} +25 -3
  2. package/dist/AWSLambdaSubscriberAdaptor-BUvb-v_n.mjs.map +1 -0
  3. package/dist/{AWSLambdaSubscriberAdaptor-Bat1CB6a.d.cts → AWSLambdaSubscriberAdaptor-BfEGolJA.d.cts} +2 -1
  4. package/dist/{AWSLambdaSubscriberAdaptor-DgSXzIUT.d.mts.map → AWSLambdaSubscriberAdaptor-BfEGolJA.d.cts.map} +1 -1
  5. package/dist/{AWSLambdaSubscriberAdaptor-DgSXzIUT.d.mts → AWSLambdaSubscriberAdaptor-Pb7Jof-i.d.mts} +2 -1
  6. package/dist/{AWSLambdaSubscriberAdaptor-Bat1CB6a.d.cts.map → AWSLambdaSubscriberAdaptor-Pb7Jof-i.d.mts.map} +1 -1
  7. package/dist/{AWSLambdaSubscriberAdaptor-CrCeL9Fs.cjs → AWSLambdaSubscriberAdaptor-Soie57uM.cjs} +25 -3
  8. package/dist/AWSLambdaSubscriberAdaptor-Soie57uM.cjs.map +1 -0
  9. package/dist/{Authorizer-Q-lW9GNW.cjs → Authorizer-BXxBee2P.cjs} +1 -1
  10. package/dist/{Authorizer-Q-lW9GNW.cjs.map → Authorizer-BXxBee2P.cjs.map} +1 -1
  11. package/dist/{Authorizer-UByhrr73.mjs → Authorizer-BgjU8-z6.mjs} +1 -1
  12. package/dist/{Authorizer-UByhrr73.mjs.map → Authorizer-BgjU8-z6.mjs.map} +1 -1
  13. package/dist/{Cron-Bx77QBN0.cjs → Cron-BV6weqem.cjs} +1 -1
  14. package/dist/{Cron-Bx77QBN0.cjs.map → Cron-BV6weqem.cjs.map} +1 -1
  15. package/dist/{Cron-CU3nmjdC.mjs → Cron-D5NpDp6y.mjs} +1 -1
  16. package/dist/{Cron-CU3nmjdC.mjs.map → Cron-D5NpDp6y.mjs.map} +1 -1
  17. package/dist/{CronBuilder-DLJvSOqj.cjs → CronBuilder-DzPkDCiP.cjs} +2 -2
  18. package/dist/{CronBuilder-DLJvSOqj.cjs.map → CronBuilder-DzPkDCiP.cjs.map} +1 -1
  19. package/dist/{CronBuilder-DEI1u1kW.mjs → CronBuilder-p1Ro6a0n.mjs} +2 -2
  20. package/dist/{CronBuilder-DEI1u1kW.mjs.map → CronBuilder-p1Ro6a0n.mjs.map} +1 -1
  21. package/dist/{EndpointBuilder-CZCom6bI.mjs → EndpointBuilder-CF-ZWtdu.mjs} +3 -3
  22. package/dist/{EndpointBuilder-CZCom6bI.mjs.map → EndpointBuilder-CF-ZWtdu.mjs.map} +1 -1
  23. package/dist/{EndpointBuilder-CVLonbkM.cjs → EndpointBuilder-CyszO0bs.cjs} +3 -3
  24. package/dist/{EndpointBuilder-CVLonbkM.cjs.map → EndpointBuilder-CyszO0bs.cjs.map} +1 -1
  25. package/dist/{EndpointFactory-CTRHSuRp.cjs → EndpointFactory-D36yAGvt.cjs} +2 -2
  26. package/dist/{EndpointFactory-CTRHSuRp.cjs.map → EndpointFactory-D36yAGvt.cjs.map} +1 -1
  27. package/dist/{EndpointFactory-CSStmg_R.mjs → EndpointFactory-Dm8Hj6e5.mjs} +2 -2
  28. package/dist/{EndpointFactory-CSStmg_R.mjs.map → EndpointFactory-Dm8Hj6e5.mjs.map} +1 -1
  29. package/dist/{HonoEndpointAdaptor-C_eGbXZR.d.mts → HonoEndpointAdaptor-Ay5UGPu0.d.mts} +3 -3
  30. package/dist/{HonoEndpointAdaptor-BuyXynoH.d.cts.map → HonoEndpointAdaptor-Ay5UGPu0.d.mts.map} +1 -1
  31. package/dist/{HonoEndpointAdaptor-BuyXynoH.d.cts → HonoEndpointAdaptor-o6QyDkdy.d.cts} +3 -3
  32. package/dist/{HonoEndpointAdaptor-C_eGbXZR.d.mts.map → HonoEndpointAdaptor-o6QyDkdy.d.cts.map} +1 -1
  33. package/dist/adaptors/aws.cjs +1 -1
  34. package/dist/adaptors/aws.d.cts +2 -2
  35. package/dist/adaptors/aws.d.mts +2 -2
  36. package/dist/adaptors/aws.mjs +1 -1
  37. package/dist/adaptors/hono.d.cts +2 -2
  38. package/dist/adaptors/hono.d.mts +2 -2
  39. package/dist/adaptors/testing.d.cts +1 -1
  40. package/dist/adaptors/testing.d.mts +1 -1
  41. package/dist/crons/Cron.cjs +1 -1
  42. package/dist/crons/Cron.d.cts +1 -1
  43. package/dist/crons/Cron.d.mts +1 -1
  44. package/dist/crons/Cron.mjs +1 -1
  45. package/dist/crons/CronBuilder.cjs +2 -2
  46. package/dist/crons/CronBuilder.d.cts +1 -1
  47. package/dist/crons/CronBuilder.d.mts +1 -1
  48. package/dist/crons/CronBuilder.mjs +2 -2
  49. package/dist/crons/index.cjs +2 -2
  50. package/dist/crons/index.d.cts +5 -5
  51. package/dist/crons/index.d.mts +5 -5
  52. package/dist/crons/index.d.mts.map +1 -1
  53. package/dist/crons/index.mjs +2 -2
  54. package/dist/endpoints/AmazonApiGatewayEndpointAdaptor.d.cts +1 -1
  55. package/dist/endpoints/AmazonApiGatewayEndpointAdaptor.d.mts +1 -1
  56. package/dist/endpoints/AmazonApiGatewayV1EndpointAdaptor.d.cts +1 -1
  57. package/dist/endpoints/AmazonApiGatewayV1EndpointAdaptor.d.mts +1 -1
  58. package/dist/endpoints/AmazonApiGatewayV2EndpointAdaptor.d.cts +1 -1
  59. package/dist/endpoints/AmazonApiGatewayV2EndpointAdaptor.d.mts +1 -1
  60. package/dist/endpoints/Authorizer.cjs +1 -1
  61. package/dist/endpoints/Authorizer.mjs +1 -1
  62. package/dist/endpoints/Endpoint.d.cts +1 -1
  63. package/dist/endpoints/Endpoint.d.mts +1 -1
  64. package/dist/endpoints/EndpointBuilder.cjs +3 -3
  65. package/dist/endpoints/EndpointBuilder.d.cts +1 -1
  66. package/dist/endpoints/EndpointBuilder.d.mts +1 -1
  67. package/dist/endpoints/EndpointBuilder.mjs +3 -3
  68. package/dist/endpoints/EndpointFactory.cjs +4 -4
  69. package/dist/endpoints/EndpointFactory.d.cts +1 -1
  70. package/dist/endpoints/EndpointFactory.d.mts +1 -1
  71. package/dist/endpoints/EndpointFactory.mjs +4 -4
  72. package/dist/endpoints/HonoEndpointAdaptor.d.cts +2 -2
  73. package/dist/endpoints/HonoEndpointAdaptor.d.mts +2 -2
  74. package/dist/endpoints/TestEndpointAdaptor.d.cts +1 -1
  75. package/dist/endpoints/TestEndpointAdaptor.d.mts +1 -1
  76. package/dist/endpoints/audit.d.cts +1 -1
  77. package/dist/endpoints/audit.d.mts +1 -1
  78. package/dist/endpoints/helpers.d.cts +1 -1
  79. package/dist/endpoints/helpers.d.mts +1 -1
  80. package/dist/endpoints/index.cjs +4 -4
  81. package/dist/endpoints/index.d.cts +3 -3
  82. package/dist/endpoints/index.d.mts +3 -3
  83. package/dist/endpoints/index.mjs +4 -4
  84. package/dist/endpoints/lazyAccessors.d.cts +1 -1
  85. package/dist/endpoints/lazyAccessors.d.mts +1 -1
  86. package/dist/endpoints/processAudits.d.cts +1 -1
  87. package/dist/endpoints/processAudits.d.mts +1 -1
  88. package/dist/endpoints/rls.cjs +1 -1
  89. package/dist/endpoints/rls.d.cts +1 -1
  90. package/dist/endpoints/rls.d.mts +1 -1
  91. package/dist/endpoints/rls.mjs +1 -1
  92. package/dist/functions/index.d.cts +1 -1
  93. package/dist/functions/index.d.mts +1 -1
  94. package/dist/index-dRNH0dT6.d.cts +12 -0
  95. package/dist/{index-0bHR_AbP.d.cts.map → index-dRNH0dT6.d.cts.map} +1 -1
  96. package/dist/{index-0bHR_AbP.d.cts → index-puUpr9Dh.d.mts} +2 -2
  97. package/dist/{index-BN927YDe.d.mts.map → index-puUpr9Dh.d.mts.map} +1 -1
  98. package/dist/{rls-uq6XPM83.cjs → rls-BrywnrQb.cjs} +1 -1
  99. package/dist/{rls-uq6XPM83.cjs.map → rls-BrywnrQb.cjs.map} +1 -1
  100. package/dist/{rls-WNnQLmQd.mjs → rls-C0cWOnk4.mjs} +1 -1
  101. package/dist/{rls-WNnQLmQd.mjs.map → rls-C0cWOnk4.mjs.map} +1 -1
  102. package/dist/subscribers/AWSLambdaSubscriberAdaptor.cjs +1 -1
  103. package/dist/subscribers/AWSLambdaSubscriberAdaptor.d.cts +1 -1
  104. package/dist/subscribers/AWSLambdaSubscriberAdaptor.d.mts +1 -1
  105. package/dist/subscribers/AWSLambdaSubscriberAdaptor.mjs +1 -1
  106. package/dist/subscribers/index.d.cts +2 -2
  107. package/dist/subscribers/index.d.mts +2 -2
  108. package/dist/subscribers/index.d.mts.map +1 -1
  109. package/package.json +6 -6
  110. package/src/subscribers/AWSLambdaSubscriberAdaptor.ts +32 -3
  111. package/src/subscribers/__tests__/AWSLambdaSubscriberAdaptor.spec.ts +120 -1
  112. package/dist/AWSLambdaSubscriberAdaptor-CrCeL9Fs.cjs.map +0 -1
  113. package/dist/AWSLambdaSubscriberAdaptor-yt7Q8xE-.mjs.map +0 -1
  114. package/dist/index-BN927YDe.d.mts +0 -12
@@ -6,10 +6,10 @@ require('../FunctionBuilder-C_xG9As7.cjs');
6
6
  require('../functions-rOD3pXQd.cjs');
7
7
  const require_Endpoint = require('../Endpoint-BcxvF4F3.cjs');
8
8
  const require_lazyAccessors = require('../lazyAccessors-B8Hhras9.cjs');
9
- const require_Authorizer = require('../Authorizer-Q-lW9GNW.cjs');
10
- const require_rls = require('../rls-uq6XPM83.cjs');
11
- const require_EndpointBuilder = require('../EndpointBuilder-CVLonbkM.cjs');
12
- const require_EndpointFactory = require('../EndpointFactory-CTRHSuRp.cjs');
9
+ const require_Authorizer = require('../Authorizer-BXxBee2P.cjs');
10
+ const require_rls = require('../rls-BrywnrQb.cjs');
11
+ const require_EndpointBuilder = require('../EndpointBuilder-CyszO0bs.cjs');
12
+ const require_EndpointFactory = require('../EndpointFactory-D36yAGvt.cjs');
13
13
 
14
14
  //#region src/endpoints/index.ts
15
15
  const e = new require_EndpointFactory.EndpointFactory();
@@ -3,17 +3,17 @@ import "../types-B5H3piDg.cjs";
3
3
  import "../BaseFunctionBuilder-C-4hYTfj.cjs";
4
4
  import "../Function-CwlB89lS.cjs";
5
5
  import "../FunctionBuilder-D_7f5MfS.cjs";
6
- import "../index-0bHR_AbP.cjs";
6
+ import "../index-dRNH0dT6.cjs";
7
7
  import { Authorizer, BUILT_IN_SECURITY_SCHEMES, BuiltInSecuritySchemeId, OAuthFlow, OAuthFlows, SecurityScheme, createAuthorizer, getSecurityScheme, isBuiltInSecurityScheme } from "../Authorizer-DWtwC8we.cjs";
8
8
  import { ActorExtractor, Endpoint, EndpointContext, EndpointHandler, EndpointOutput, EndpointSchemas, MappedAudit, RLS_BYPASS, ResponseBuilder, RlsBypass, RlsConfig, RlsContext, RlsContextExtractor } from "../Endpoint-C9N6CmvB.cjs";
9
9
  import { EndpointBuilder } from "../EndpointBuilder-BfzI6Rpc.cjs";
10
10
  import { EndpointFactory } from "../EndpointFactory-C1miOYUW.cjs";
11
11
  import { publishConstructEvents } from "../publisher-DdPDps5m.cjs";
12
12
  import { createApiGatewayCookies, createApiGatewayHeaders, createHonoCookies, createHonoHeaders, createNoopCookies, createNoopHeaders } from "../lazyAccessors-ZRbwOONj.cjs";
13
- import * as _geekmidas_logger3 from "@geekmidas/logger";
13
+ import * as _geekmidas_logger9 from "@geekmidas/logger";
14
14
 
15
15
  //#region src/endpoints/index.d.ts
16
- declare const e: EndpointFactory<[], "", _geekmidas_logger3.Logger, unknown, undefined, string, readonly string[], undefined, string, never, undefined, string, Record<string, SecurityScheme>, undefined>;
16
+ declare const e: EndpointFactory<[], "", _geekmidas_logger9.Logger, unknown, undefined, string, readonly string[], undefined, string, never, undefined, string, Record<string, SecurityScheme>, undefined>;
17
17
  //# sourceMappingURL=index.d.ts.map
18
18
 
19
19
  //#endregion
@@ -3,17 +3,17 @@ import "../types-Dw-iLd3Y.mjs";
3
3
  import "../BaseFunctionBuilder-JpN2FtB4.mjs";
4
4
  import "../Function-DEX2O-SB.mjs";
5
5
  import "../FunctionBuilder-DRw1s5uT.mjs";
6
- import "../index-BN927YDe.mjs";
6
+ import "../index-puUpr9Dh.mjs";
7
7
  import { Authorizer, BUILT_IN_SECURITY_SCHEMES, BuiltInSecuritySchemeId, OAuthFlow, OAuthFlows, SecurityScheme, createAuthorizer, getSecurityScheme, isBuiltInSecurityScheme } from "../Authorizer-DCcYOx3h.mjs";
8
8
  import { ActorExtractor, Endpoint, EndpointContext, EndpointHandler, EndpointOutput, EndpointSchemas, MappedAudit, RLS_BYPASS, ResponseBuilder, RlsBypass, RlsConfig, RlsContext, RlsContextExtractor } from "../Endpoint-DU20A9E8.mjs";
9
9
  import { EndpointBuilder } from "../EndpointBuilder-CuVlda7g.mjs";
10
10
  import { EndpointFactory } from "../EndpointFactory-Bj7vHtT6.mjs";
11
11
  import { publishConstructEvents } from "../publisher-BeouS9lG.mjs";
12
12
  import { createApiGatewayCookies, createApiGatewayHeaders, createHonoCookies, createHonoHeaders, createNoopCookies, createNoopHeaders } from "../lazyAccessors-D1tbdxUk.mjs";
13
- import * as _geekmidas_logger8 from "@geekmidas/logger";
13
+ import * as _geekmidas_logger3 from "@geekmidas/logger";
14
14
 
15
15
  //#region src/endpoints/index.d.ts
16
- declare const e: EndpointFactory<[], "", _geekmidas_logger8.Logger, unknown, undefined, string, readonly string[], undefined, string, never, undefined, string, Record<string, SecurityScheme>, undefined>;
16
+ declare const e: EndpointFactory<[], "", _geekmidas_logger3.Logger, unknown, undefined, string, readonly string[], undefined, string, never, undefined, string, Record<string, SecurityScheme>, undefined>;
17
17
  //# sourceMappingURL=index.d.ts.map
18
18
 
19
19
  //#endregion
@@ -6,10 +6,10 @@ import "../FunctionBuilder-CBeqX18X.mjs";
6
6
  import "../functions-B1mrMoUH.mjs";
7
7
  import { Endpoint, ResponseBuilder } from "../Endpoint-DvY3aqAy.mjs";
8
8
  import { createApiGatewayCookies, createApiGatewayHeaders, createHonoCookies, createHonoHeaders, createNoopCookies, createNoopHeaders } from "../lazyAccessors-B-Jgkg2o.mjs";
9
- import { BUILT_IN_SECURITY_SCHEMES, createAuthorizer, getSecurityScheme, isBuiltInSecurityScheme } from "../Authorizer-UByhrr73.mjs";
10
- import { RLS_BYPASS } from "../rls-WNnQLmQd.mjs";
11
- import { EndpointBuilder } from "../EndpointBuilder-CZCom6bI.mjs";
12
- import { EndpointFactory } from "../EndpointFactory-CSStmg_R.mjs";
9
+ import { BUILT_IN_SECURITY_SCHEMES, createAuthorizer, getSecurityScheme, isBuiltInSecurityScheme } from "../Authorizer-BgjU8-z6.mjs";
10
+ import { RLS_BYPASS } from "../rls-C0cWOnk4.mjs";
11
+ import { EndpointBuilder } from "../EndpointBuilder-CF-ZWtdu.mjs";
12
+ import { EndpointFactory } from "../EndpointFactory-Dm8Hj6e5.mjs";
13
13
 
14
14
  //#region src/endpoints/index.ts
15
15
  const e = new EndpointFactory();
@@ -3,7 +3,7 @@ import "../types-B5H3piDg.cjs";
3
3
  import "../BaseFunctionBuilder-C-4hYTfj.cjs";
4
4
  import "../Function-CwlB89lS.cjs";
5
5
  import "../FunctionBuilder-D_7f5MfS.cjs";
6
- import "../index-0bHR_AbP.cjs";
6
+ import "../index-dRNH0dT6.cjs";
7
7
  import "../Authorizer-DWtwC8we.cjs";
8
8
  import "../Endpoint-C9N6CmvB.cjs";
9
9
  import { createApiGatewayCookies, createApiGatewayHeaders, createCookieHeaderAccessor, createHonoCookies, createHonoHeaders, createNoopCookies, createNoopHeaders, createObjectHeaders } from "../lazyAccessors-ZRbwOONj.cjs";
@@ -3,7 +3,7 @@ import "../types-Dw-iLd3Y.mjs";
3
3
  import "../BaseFunctionBuilder-JpN2FtB4.mjs";
4
4
  import "../Function-DEX2O-SB.mjs";
5
5
  import "../FunctionBuilder-DRw1s5uT.mjs";
6
- import "../index-BN927YDe.mjs";
6
+ import "../index-puUpr9Dh.mjs";
7
7
  import "../Authorizer-DCcYOx3h.mjs";
8
8
  import "../Endpoint-DU20A9E8.mjs";
9
9
  import { createApiGatewayCookies, createApiGatewayHeaders, createCookieHeaderAccessor, createHonoCookies, createHonoHeaders, createNoopCookies, createNoopHeaders, createObjectHeaders } from "../lazyAccessors-D1tbdxUk.mjs";
@@ -3,7 +3,7 @@ import "../types-B5H3piDg.cjs";
3
3
  import "../BaseFunctionBuilder-C-4hYTfj.cjs";
4
4
  import "../Function-CwlB89lS.cjs";
5
5
  import "../FunctionBuilder-D_7f5MfS.cjs";
6
- import "../index-0bHR_AbP.cjs";
6
+ import "../index-dRNH0dT6.cjs";
7
7
  import "../Authorizer-DWtwC8we.cjs";
8
8
  import { CookieFn, Endpoint, HeaderFn } from "../Endpoint-C9N6CmvB.cjs";
9
9
  import { AuditStorage, AuditableAction, Auditor } from "@geekmidas/audit";
@@ -3,7 +3,7 @@ import "../types-Dw-iLd3Y.mjs";
3
3
  import "../BaseFunctionBuilder-JpN2FtB4.mjs";
4
4
  import "../Function-DEX2O-SB.mjs";
5
5
  import "../FunctionBuilder-DRw1s5uT.mjs";
6
- import "../index-BN927YDe.mjs";
6
+ import "../index-puUpr9Dh.mjs";
7
7
  import "../Authorizer-DCcYOx3h.mjs";
8
8
  import { CookieFn, Endpoint, HeaderFn } from "../Endpoint-DU20A9E8.mjs";
9
9
  import { Service, ServiceDiscovery } from "@geekmidas/services";
@@ -1,3 +1,3 @@
1
- const require_rls = require('../rls-uq6XPM83.cjs');
1
+ const require_rls = require('../rls-BrywnrQb.cjs');
2
2
 
3
3
  exports.RLS_BYPASS = require_rls.RLS_BYPASS;
@@ -3,7 +3,7 @@ import "../types-B5H3piDg.cjs";
3
3
  import "../BaseFunctionBuilder-C-4hYTfj.cjs";
4
4
  import "../Function-CwlB89lS.cjs";
5
5
  import "../FunctionBuilder-D_7f5MfS.cjs";
6
- import "../index-0bHR_AbP.cjs";
6
+ import "../index-dRNH0dT6.cjs";
7
7
  import "../Authorizer-DWtwC8we.cjs";
8
8
  import { RLS_BYPASS, RlsBypass, RlsConfig, RlsContext, RlsContextExtractor } from "../Endpoint-C9N6CmvB.cjs";
9
9
  export { RLS_BYPASS, RlsBypass, RlsConfig, RlsContext, RlsContextExtractor };
@@ -3,7 +3,7 @@ import "../types-Dw-iLd3Y.mjs";
3
3
  import "../BaseFunctionBuilder-JpN2FtB4.mjs";
4
4
  import "../Function-DEX2O-SB.mjs";
5
5
  import "../FunctionBuilder-DRw1s5uT.mjs";
6
- import "../index-BN927YDe.mjs";
6
+ import "../index-puUpr9Dh.mjs";
7
7
  import "../Authorizer-DCcYOx3h.mjs";
8
8
  import { RLS_BYPASS, RlsBypass, RlsConfig, RlsContext, RlsContextExtractor } from "../Endpoint-DU20A9E8.mjs";
9
9
  export { RLS_BYPASS, RlsBypass, RlsConfig, RlsContext, RlsContextExtractor };
@@ -1,3 +1,3 @@
1
- import { RLS_BYPASS } from "../rls-WNnQLmQd.mjs";
1
+ import { RLS_BYPASS } from "../rls-C0cWOnk4.mjs";
2
2
 
3
3
  export { RLS_BYPASS };
@@ -2,5 +2,5 @@ import "../Construct-CX7HyFfT.cjs";
2
2
  import { BaseFunctionBuilder } from "../BaseFunctionBuilder-C-4hYTfj.cjs";
3
3
  import { Function, FunctionContext, FunctionHandler } from "../Function-CwlB89lS.cjs";
4
4
  import { FunctionBuilder } from "../FunctionBuilder-D_7f5MfS.cjs";
5
- import { f } from "../index-0bHR_AbP.cjs";
5
+ import { f } from "../index-dRNH0dT6.cjs";
6
6
  export { BaseFunctionBuilder, Function, FunctionBuilder, FunctionContext, FunctionHandler, f };
@@ -2,5 +2,5 @@ import "../Construct-DvXCkLOP.mjs";
2
2
  import { BaseFunctionBuilder } from "../BaseFunctionBuilder-JpN2FtB4.mjs";
3
3
  import { Function, FunctionContext, FunctionHandler } from "../Function-DEX2O-SB.mjs";
4
4
  import { FunctionBuilder } from "../FunctionBuilder-DRw1s5uT.mjs";
5
- import { f } from "../index-BN927YDe.mjs";
5
+ import { f } from "../index-puUpr9Dh.mjs";
6
6
  export { BaseFunctionBuilder, Function, FunctionBuilder, FunctionContext, FunctionHandler, f };
@@ -0,0 +1,12 @@
1
+ import { FunctionBuilder } from "./FunctionBuilder-D_7f5MfS.cjs";
2
+ import * as _geekmidas_audit6 from "@geekmidas/audit";
3
+ import * as _geekmidas_logger5 from "@geekmidas/logger";
4
+ import * as _geekmidas_schema4 from "@geekmidas/schema";
5
+
6
+ //#region src/functions/index.d.ts
7
+ declare const f: FunctionBuilder<_geekmidas_schema4.ComposableStandardSchema, undefined, [], _geekmidas_logger5.Logger, undefined, string, undefined, string, undefined, string, _geekmidas_audit6.AuditableAction<string, unknown>>;
8
+ //# sourceMappingURL=index.d.ts.map
9
+
10
+ //#endregion
11
+ export { f };
12
+ //# sourceMappingURL=index-dRNH0dT6.d.cts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index-0bHR_AbP.d.cts","names":[],"sources":["../src/functions/index.ts"],"sourcesContent":[],"mappings":";;;;;;cAWa,GAAC,gBAAwB,kBAAA,CAAxB,wBAAA,iBAAA,kBAAA,CAAA,MAAA,2DAAA,iBAAA,CAAA"}
1
+ {"version":3,"file":"index-dRNH0dT6.d.cts","names":[],"sources":["../src/functions/index.ts"],"sourcesContent":[],"mappings":";;;;;;cAWa,GAAC,gBAAwB,kBAAA,CAAxB,wBAAA,iBAAA,kBAAA,CAAA,MAAA,2DAAA,iBAAA,CAAA"}
@@ -1,4 +1,4 @@
1
- import { FunctionBuilder } from "./FunctionBuilder-D_7f5MfS.cjs";
1
+ import { FunctionBuilder } from "./FunctionBuilder-DRw1s5uT.mjs";
2
2
  import * as _geekmidas_audit2 from "@geekmidas/audit";
3
3
  import * as _geekmidas_logger1 from "@geekmidas/logger";
4
4
  import * as _geekmidas_schema0 from "@geekmidas/schema";
@@ -9,4 +9,4 @@ declare const f: FunctionBuilder<_geekmidas_schema0.ComposableStandardSchema, un
9
9
 
10
10
  //#endregion
11
11
  export { f };
12
- //# sourceMappingURL=index-0bHR_AbP.d.cts.map
12
+ //# sourceMappingURL=index-puUpr9Dh.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index-BN927YDe.d.mts","names":[],"sources":["../src/functions/index.ts"],"sourcesContent":[],"mappings":";;;;;;cAWa,GAAC,gBAAwB,kBAAA,CAAxB,wBAAA,iBAAA,kBAAA,CAAA,MAAA,2DAAA,iBAAA,CAAA"}
1
+ {"version":3,"file":"index-puUpr9Dh.d.mts","names":[],"sources":["../src/functions/index.ts"],"sourcesContent":[],"mappings":";;;;;;cAWa,GAAC,gBAAwB,kBAAA,CAAxB,wBAAA,iBAAA,kBAAA,CAAA,MAAA,2DAAA,iBAAA,CAAA"}
@@ -12,4 +12,4 @@ Object.defineProperty(exports, 'RLS_BYPASS', {
12
12
  return RLS_BYPASS;
13
13
  }
14
14
  });
15
- //# sourceMappingURL=rls-uq6XPM83.cjs.map
15
+ //# sourceMappingURL=rls-BrywnrQb.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"rls-uq6XPM83.cjs","names":[],"sources":["../src/endpoints/rls.ts"],"sourcesContent":["import type { Logger } from '@geekmidas/logger';\nimport type { Service, ServiceRecord } from '@geekmidas/services';\nimport type { CookieFn, HeaderFn } from './Endpoint';\n\n/**\n * RLS context - key-value pairs to set as PostgreSQL session variables.\n * Keys become `prefix.key` (e.g., `app.user_id`).\n */\nexport interface RlsContext {\n\t[key: string]: string | number | boolean | null | undefined;\n}\n\n/**\n * Function type for extracting RLS context from request context.\n *\n * @template TServices - Available service dependencies\n * @template TSession - Session data type\n * @template TLogger - Logger type\n *\n * @example\n * ```ts\n * const extractor: RlsContextExtractor<[], UserSession> = ({ session }) => ({\n * user_id: session.userId,\n * tenant_id: session.tenantId,\n * roles: session.roles.join(','),\n * });\n * ```\n */\nexport type RlsContextExtractor<\n\tTServices extends Service[] = [],\n\tTSession = unknown,\n\tTLogger extends Logger = Logger,\n> = (ctx: {\n\tservices: ServiceRecord<TServices>;\n\tsession: TSession;\n\theader: HeaderFn;\n\tcookie: CookieFn;\n\tlogger: TLogger;\n}) => RlsContext | Promise<RlsContext>;\n\n/**\n * Configuration for RLS on an endpoint or factory.\n *\n * @template TServices - Available service dependencies\n * @template TSession - Session data type\n * @template TLogger - Logger type\n */\nexport interface RlsConfig<\n\tTServices extends Service[] = [],\n\tTSession = unknown,\n\tTLogger extends Logger = Logger,\n> {\n\t/** Function to extract RLS context from request */\n\textractor: RlsContextExtractor<TServices, TSession, TLogger>;\n\t/** Prefix for PostgreSQL session variables (default: 'app') */\n\tprefix?: string;\n}\n\n/**\n * Symbol used to bypass RLS for an endpoint.\n */\nexport const RLS_BYPASS = Symbol.for('geekmidas.rls.bypass');\n\n/**\n * Type for RLS bypass marker.\n */\nexport type RlsBypass = typeof RLS_BYPASS;\n"],"mappings":";;;;;AA6DA,MAAa,aAAa,OAAO,IAAI,uBAAuB"}
1
+ {"version":3,"file":"rls-BrywnrQb.cjs","names":[],"sources":["../src/endpoints/rls.ts"],"sourcesContent":["import type { Logger } from '@geekmidas/logger';\nimport type { Service, ServiceRecord } from '@geekmidas/services';\nimport type { CookieFn, HeaderFn } from './Endpoint';\n\n/**\n * RLS context - key-value pairs to set as PostgreSQL session variables.\n * Keys become `prefix.key` (e.g., `app.user_id`).\n */\nexport interface RlsContext {\n\t[key: string]: string | number | boolean | null | undefined;\n}\n\n/**\n * Function type for extracting RLS context from request context.\n *\n * @template TServices - Available service dependencies\n * @template TSession - Session data type\n * @template TLogger - Logger type\n *\n * @example\n * ```ts\n * const extractor: RlsContextExtractor<[], UserSession> = ({ session }) => ({\n * user_id: session.userId,\n * tenant_id: session.tenantId,\n * roles: session.roles.join(','),\n * });\n * ```\n */\nexport type RlsContextExtractor<\n\tTServices extends Service[] = [],\n\tTSession = unknown,\n\tTLogger extends Logger = Logger,\n> = (ctx: {\n\tservices: ServiceRecord<TServices>;\n\tsession: TSession;\n\theader: HeaderFn;\n\tcookie: CookieFn;\n\tlogger: TLogger;\n}) => RlsContext | Promise<RlsContext>;\n\n/**\n * Configuration for RLS on an endpoint or factory.\n *\n * @template TServices - Available service dependencies\n * @template TSession - Session data type\n * @template TLogger - Logger type\n */\nexport interface RlsConfig<\n\tTServices extends Service[] = [],\n\tTSession = unknown,\n\tTLogger extends Logger = Logger,\n> {\n\t/** Function to extract RLS context from request */\n\textractor: RlsContextExtractor<TServices, TSession, TLogger>;\n\t/** Prefix for PostgreSQL session variables (default: 'app') */\n\tprefix?: string;\n}\n\n/**\n * Symbol used to bypass RLS for an endpoint.\n */\nexport const RLS_BYPASS = Symbol.for('geekmidas.rls.bypass');\n\n/**\n * Type for RLS bypass marker.\n */\nexport type RlsBypass = typeof RLS_BYPASS;\n"],"mappings":";;;;;AA6DA,MAAa,aAAa,OAAO,IAAI,uBAAuB"}
@@ -6,4 +6,4 @@ const RLS_BYPASS = Symbol.for("geekmidas.rls.bypass");
6
6
 
7
7
  //#endregion
8
8
  export { RLS_BYPASS };
9
- //# sourceMappingURL=rls-WNnQLmQd.mjs.map
9
+ //# sourceMappingURL=rls-C0cWOnk4.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"rls-WNnQLmQd.mjs","names":[],"sources":["../src/endpoints/rls.ts"],"sourcesContent":["import type { Logger } from '@geekmidas/logger';\nimport type { Service, ServiceRecord } from '@geekmidas/services';\nimport type { CookieFn, HeaderFn } from './Endpoint';\n\n/**\n * RLS context - key-value pairs to set as PostgreSQL session variables.\n * Keys become `prefix.key` (e.g., `app.user_id`).\n */\nexport interface RlsContext {\n\t[key: string]: string | number | boolean | null | undefined;\n}\n\n/**\n * Function type for extracting RLS context from request context.\n *\n * @template TServices - Available service dependencies\n * @template TSession - Session data type\n * @template TLogger - Logger type\n *\n * @example\n * ```ts\n * const extractor: RlsContextExtractor<[], UserSession> = ({ session }) => ({\n * user_id: session.userId,\n * tenant_id: session.tenantId,\n * roles: session.roles.join(','),\n * });\n * ```\n */\nexport type RlsContextExtractor<\n\tTServices extends Service[] = [],\n\tTSession = unknown,\n\tTLogger extends Logger = Logger,\n> = (ctx: {\n\tservices: ServiceRecord<TServices>;\n\tsession: TSession;\n\theader: HeaderFn;\n\tcookie: CookieFn;\n\tlogger: TLogger;\n}) => RlsContext | Promise<RlsContext>;\n\n/**\n * Configuration for RLS on an endpoint or factory.\n *\n * @template TServices - Available service dependencies\n * @template TSession - Session data type\n * @template TLogger - Logger type\n */\nexport interface RlsConfig<\n\tTServices extends Service[] = [],\n\tTSession = unknown,\n\tTLogger extends Logger = Logger,\n> {\n\t/** Function to extract RLS context from request */\n\textractor: RlsContextExtractor<TServices, TSession, TLogger>;\n\t/** Prefix for PostgreSQL session variables (default: 'app') */\n\tprefix?: string;\n}\n\n/**\n * Symbol used to bypass RLS for an endpoint.\n */\nexport const RLS_BYPASS = Symbol.for('geekmidas.rls.bypass');\n\n/**\n * Type for RLS bypass marker.\n */\nexport type RlsBypass = typeof RLS_BYPASS;\n"],"mappings":";;;;AA6DA,MAAa,aAAa,OAAO,IAAI,uBAAuB"}
1
+ {"version":3,"file":"rls-C0cWOnk4.mjs","names":[],"sources":["../src/endpoints/rls.ts"],"sourcesContent":["import type { Logger } from '@geekmidas/logger';\nimport type { Service, ServiceRecord } from '@geekmidas/services';\nimport type { CookieFn, HeaderFn } from './Endpoint';\n\n/**\n * RLS context - key-value pairs to set as PostgreSQL session variables.\n * Keys become `prefix.key` (e.g., `app.user_id`).\n */\nexport interface RlsContext {\n\t[key: string]: string | number | boolean | null | undefined;\n}\n\n/**\n * Function type for extracting RLS context from request context.\n *\n * @template TServices - Available service dependencies\n * @template TSession - Session data type\n * @template TLogger - Logger type\n *\n * @example\n * ```ts\n * const extractor: RlsContextExtractor<[], UserSession> = ({ session }) => ({\n * user_id: session.userId,\n * tenant_id: session.tenantId,\n * roles: session.roles.join(','),\n * });\n * ```\n */\nexport type RlsContextExtractor<\n\tTServices extends Service[] = [],\n\tTSession = unknown,\n\tTLogger extends Logger = Logger,\n> = (ctx: {\n\tservices: ServiceRecord<TServices>;\n\tsession: TSession;\n\theader: HeaderFn;\n\tcookie: CookieFn;\n\tlogger: TLogger;\n}) => RlsContext | Promise<RlsContext>;\n\n/**\n * Configuration for RLS on an endpoint or factory.\n *\n * @template TServices - Available service dependencies\n * @template TSession - Session data type\n * @template TLogger - Logger type\n */\nexport interface RlsConfig<\n\tTServices extends Service[] = [],\n\tTSession = unknown,\n\tTLogger extends Logger = Logger,\n> {\n\t/** Function to extract RLS context from request */\n\textractor: RlsContextExtractor<TServices, TSession, TLogger>;\n\t/** Prefix for PostgreSQL session variables (default: 'app') */\n\tprefix?: string;\n}\n\n/**\n * Symbol used to bypass RLS for an endpoint.\n */\nexport const RLS_BYPASS = Symbol.for('geekmidas.rls.bypass');\n\n/**\n * Type for RLS bypass marker.\n */\nexport type RlsBypass = typeof RLS_BYPASS;\n"],"mappings":";;;;AA6DA,MAAa,aAAa,OAAO,IAAI,uBAAuB"}
@@ -1,3 +1,3 @@
1
- const require_AWSLambdaSubscriberAdaptor = require('../AWSLambdaSubscriberAdaptor-CrCeL9Fs.cjs');
1
+ const require_AWSLambdaSubscriberAdaptor = require('../AWSLambdaSubscriberAdaptor-Soie57uM.cjs');
2
2
 
3
3
  exports.AWSLambdaSubscriber = require_AWSLambdaSubscriberAdaptor.AWSLambdaSubscriber;
@@ -1,4 +1,4 @@
1
1
  import "../Construct-CX7HyFfT.cjs";
2
2
  import "../Subscriber-1rDE7HuM.cjs";
3
- import { AWSLambdaHandler, AWSLambdaSubscriber } from "../AWSLambdaSubscriberAdaptor-Bat1CB6a.cjs";
3
+ import { AWSLambdaHandler, AWSLambdaSubscriber } from "../AWSLambdaSubscriberAdaptor-BfEGolJA.cjs";
4
4
  export { AWSLambdaHandler, AWSLambdaSubscriber };
@@ -1,4 +1,4 @@
1
1
  import "../Construct-DvXCkLOP.mjs";
2
2
  import "../Subscriber-DCgMSkQA.mjs";
3
- import { AWSLambdaHandler, AWSLambdaSubscriber } from "../AWSLambdaSubscriberAdaptor-DgSXzIUT.mjs";
3
+ import { AWSLambdaHandler, AWSLambdaSubscriber } from "../AWSLambdaSubscriberAdaptor-Pb7Jof-i.mjs";
4
4
  export { AWSLambdaHandler, AWSLambdaSubscriber };
@@ -1,3 +1,3 @@
1
- import { AWSLambdaSubscriber } from "../AWSLambdaSubscriberAdaptor-yt7Q8xE-.mjs";
1
+ import { AWSLambdaSubscriber } from "../AWSLambdaSubscriberAdaptor-BUvb-v_n.mjs";
2
2
 
3
3
  export { AWSLambdaSubscriber };
@@ -1,10 +1,10 @@
1
1
  import "../Construct-CX7HyFfT.cjs";
2
2
  import { Subscriber } from "../Subscriber-1rDE7HuM.cjs";
3
3
  import { SubscriberBuilder } from "../SubscriberBuilder-UIwW_wIY.cjs";
4
- import * as _geekmidas_logger8 from "@geekmidas/logger";
4
+ import * as _geekmidas_logger0 from "@geekmidas/logger";
5
5
 
6
6
  //#region src/subscribers/index.d.ts
7
- declare const s: SubscriberBuilder<[], _geekmidas_logger8.Logger, undefined, undefined, string, []>;
7
+ declare const s: SubscriberBuilder<[], _geekmidas_logger0.Logger, undefined, undefined, string, []>;
8
8
  //# sourceMappingURL=index.d.ts.map
9
9
 
10
10
  //#endregion
@@ -1,10 +1,10 @@
1
1
  import "../Construct-DvXCkLOP.mjs";
2
2
  import { Subscriber } from "../Subscriber-DCgMSkQA.mjs";
3
3
  import { SubscriberBuilder } from "../SubscriberBuilder-BcyK44e_.mjs";
4
- import * as _geekmidas_logger10 from "@geekmidas/logger";
4
+ import * as _geekmidas_logger7 from "@geekmidas/logger";
5
5
 
6
6
  //#region src/subscribers/index.d.ts
7
- declare const s: SubscriberBuilder<[], _geekmidas_logger10.Logger, undefined, undefined, string, []>;
7
+ declare const s: SubscriberBuilder<[], _geekmidas_logger7.Logger, undefined, undefined, string, []>;
8
8
  //# sourceMappingURL=index.d.ts.map
9
9
 
10
10
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.mts","names":[],"sources":["../../src/subscribers/index.ts"],"sourcesContent":[],"mappings":";;;;;;cAKa,GAAC,sBAA0B,mBAAA,CAA1B,MAAA"}
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../../src/subscribers/index.ts"],"sourcesContent":[],"mappings":";;;;;;cAKa,GAAC,sBAA0B,kBAAA,CAA1B,MAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@geekmidas/constructs",
3
- "version": "1.0.1",
3
+ "version": "1.0.2",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "exports": {
@@ -78,31 +78,31 @@
78
78
  "kysely": "~0.28.8",
79
79
  "pg": "~8.16.3",
80
80
  "zod": "~4.1.13",
81
+ "@geekmidas/cache": "^1.0.0",
81
82
  "@geekmidas/audit": "^1.0.0",
82
83
  "@geekmidas/db": "^1.0.0",
83
- "@geekmidas/cache": "^1.0.0",
84
84
  "@geekmidas/envkit": "^1.0.0",
85
85
  "@geekmidas/events": "^1.0.0",
86
+ "@geekmidas/errors": "^1.0.0",
86
87
  "@geekmidas/logger": "^1.0.0",
87
88
  "@geekmidas/rate-limit": "^1.0.0",
88
89
  "@geekmidas/schema": "^1.0.0",
89
90
  "@geekmidas/services": "^1.0.0",
90
- "@geekmidas/errors": "^1.0.0",
91
91
  "@geekmidas/testkit": "^1.0.1"
92
92
  },
93
93
  "peerDependencies": {
94
94
  "@middy/core": ">=6.3.1",
95
95
  "@types/aws-lambda": ">=8.10.92",
96
96
  "hono": ">=4.8.2",
97
- "@geekmidas/db": "^1.0.0",
97
+ "@geekmidas/audit": "^1.0.0",
98
98
  "@geekmidas/cache": "^1.0.0",
99
+ "@geekmidas/db": "^1.0.0",
99
100
  "@geekmidas/envkit": "^1.0.0",
100
101
  "@geekmidas/errors": "^1.0.0",
102
+ "@geekmidas/events": "^1.0.0",
101
103
  "@geekmidas/logger": "^1.0.0",
102
- "@geekmidas/audit": "^1.0.0",
103
104
  "@geekmidas/rate-limit": "^1.0.0",
104
105
  "@geekmidas/schema": "^1.0.0",
105
- "@geekmidas/events": "^1.0.0",
106
106
  "@geekmidas/services": "^1.0.0"
107
107
  },
108
108
  "peerDependenciesMeta": {
@@ -11,6 +11,7 @@ import type {
11
11
  Context,
12
12
  Handler,
13
13
  SNSEvent,
14
+ SNSEventRecord,
14
15
  SQSEvent,
15
16
  SQSRecord,
16
17
  } from 'aws-lambda';
@@ -158,7 +159,7 @@ export class AWSLambdaSubscriber<
158
159
  // SNS Event
159
160
  for (const record of rawEvent.Records) {
160
161
  try {
161
- const event = JSON.parse(record.Sns.Message);
162
+ const event = this.parseSNSRecord(record);
162
163
  if (event && this.isSubscribedEvent(event.type)) {
163
164
  events.push(event);
164
165
  }
@@ -199,15 +200,43 @@ export class AWSLambdaSubscriber<
199
200
  );
200
201
  }
201
202
 
203
+ private parseSNSRecord(record: SNSEventRecord): any | null {
204
+ try {
205
+ const message = JSON.parse(record.Sns.Message);
206
+ // Resolve type from MessageAttributes (preferred) or message body
207
+ const messageType =
208
+ record.Sns.MessageAttributes?.type?.Value ?? message.type;
209
+
210
+ if (message.type) {
211
+ return message; // Full event format: { type, payload }
212
+ }
213
+
214
+ // Payload-only format: type is in MessageAttributes
215
+ return messageType ? { type: messageType, payload: message } : message;
216
+ } catch (error) {
217
+ this.logger.error({ error, record }, 'Failed to parse SNS record body');
218
+ return null;
219
+ }
220
+ }
221
+
202
222
  private parseSQSRecord(record: SQSRecord): any | null {
203
223
  try {
204
224
  const body = JSON.parse(record.body);
205
225
 
206
226
  // Check if this is an SNS message wrapped in SQS
207
227
  if (body.Type === 'Notification' && body.Message) {
208
- // Parse the SNS message
209
228
  const snsMessage = JSON.parse(body.Message);
210
- return snsMessage;
229
+
230
+ if (snsMessage.type) {
231
+ return snsMessage; // Full event format: { type, payload }
232
+ }
233
+
234
+ // Payload-only format: type is in MessageAttributes
235
+ const messageType =
236
+ body.MessageAttributes?.type?.Value ?? snsMessage.type;
237
+ return messageType
238
+ ? { type: messageType, payload: snsMessage }
239
+ : snsMessage;
211
240
  }
212
241
 
213
242
  // Direct SQS message
@@ -66,7 +66,7 @@ const createSQSEvent = (messages: any[]): SQSEvent => ({
66
66
  ),
67
67
  });
68
68
 
69
- // Helper to create SNS event
69
+ // Helper to create SNS event with full event format (type in message body)
70
70
  const createSNSEvent = (messages: any[]): SNSEvent => ({
71
71
  Records: messages.map(
72
72
  (message, index) =>
@@ -90,6 +90,38 @@ const createSNSEvent = (messages: any[]): SNSEvent => ({
90
90
  ),
91
91
  });
92
92
 
93
+ // Helper to create SNS event with payload-only format (type in MessageAttributes)
94
+ const createSNSEventWithMessageAttributes = (
95
+ messages: { type: string; payload: any }[],
96
+ ): SNSEvent => ({
97
+ Records: messages.map(
98
+ (message, index) =>
99
+ ({
100
+ EventSource: 'aws:sns',
101
+ EventVersion: '1.0',
102
+ EventSubscriptionArn: 'arn:aws:sns:region:account:topic-name',
103
+ Sns: {
104
+ Type: 'Notification',
105
+ MessageId: `message-${index}`,
106
+ TopicArn: 'arn:aws:sns:region:account:topic-name',
107
+ Subject: null,
108
+ Message: JSON.stringify(message.payload),
109
+ Timestamp: '2023-01-01T00:00:00.000Z',
110
+ SignatureVersion: '1',
111
+ Signature: 'signature',
112
+ SigningCertUrl: 'https://example.com/cert',
113
+ UnsubscribeUrl: 'https://example.com/unsubscribe',
114
+ MessageAttributes: {
115
+ type: {
116
+ Type: 'String',
117
+ Value: message.type,
118
+ },
119
+ },
120
+ },
121
+ }) as SNSEventRecord,
122
+ ),
123
+ });
124
+
93
125
  // Helper to create SNS wrapped in SQS
94
126
  const createSNSWrappedInSQS = (messages: any[]): SQSEvent => {
95
127
  return createSQSEvent(
@@ -103,6 +135,27 @@ const createSNSWrappedInSQS = (messages: any[]): SQSEvent => {
103
135
  );
104
136
  };
105
137
 
138
+ // Helper to create SNS wrapped in SQS with payload-only format (type in MessageAttributes)
139
+ const createSNSWrappedInSQSWithMessageAttributes = (
140
+ messages: { type: string; payload: any }[],
141
+ ): SQSEvent => {
142
+ return createSQSEvent(
143
+ messages.map((message) => ({
144
+ Type: 'Notification',
145
+ MessageId: 'message-id',
146
+ TopicArn: 'arn:aws:sns:region:account:topic-name',
147
+ Message: JSON.stringify(message.payload),
148
+ Timestamp: '2023-01-01T00:00:00.000Z',
149
+ MessageAttributes: {
150
+ type: {
151
+ Type: 'String',
152
+ Value: message.type,
153
+ },
154
+ },
155
+ })),
156
+ );
157
+ };
158
+
106
159
  describe('AWSLambdaSubscriber', () => {
107
160
  let envParser: EnvironmentParser<{}>;
108
161
  let logger: ConsoleLogger;
@@ -224,6 +277,72 @@ describe('AWSLambdaSubscriber', () => {
224
277
 
225
278
  expect(handler).toHaveBeenCalled();
226
279
  });
280
+
281
+ it('should process SNS events with type in MessageAttributes (payload-only format)', async () => {
282
+ const handler = vi.fn(async ({ events }) => {
283
+ expect(events).toHaveLength(1);
284
+ expect(events[0]).toEqual({
285
+ type: 'tenant.created',
286
+ payload: { tenantId: '019c0b2b-d881-7c21-93b6-480571144b28' },
287
+ });
288
+ });
289
+
290
+ const subscriber = new Subscriber(
291
+ handler,
292
+ 30000,
293
+ ['tenant.created'] as any,
294
+ undefined,
295
+ [],
296
+ logger,
297
+ );
298
+
299
+ const adapter = new AWSLambdaSubscriber(envParser, subscriber);
300
+ const lambdaHandler = adapter.handler;
301
+
302
+ const snsEvent = createSNSEventWithMessageAttributes([
303
+ {
304
+ type: 'tenant.created',
305
+ payload: { tenantId: '019c0b2b-d881-7c21-93b6-480571144b28' },
306
+ },
307
+ ]);
308
+
309
+ await lambdaHandler(snsEvent, createMockContext(), vi.fn());
310
+
311
+ expect(handler).toHaveBeenCalled();
312
+ });
313
+
314
+ it('should process SNS-wrapped-in-SQS with type in MessageAttributes (payload-only format)', async () => {
315
+ const handler = vi.fn(async ({ events }) => {
316
+ expect(events).toHaveLength(1);
317
+ expect(events[0]).toEqual({
318
+ type: 'tenant.created',
319
+ payload: { tenantId: '019c0b2b-d881-7c21-93b6-480571144b28' },
320
+ });
321
+ });
322
+
323
+ const subscriber = new Subscriber(
324
+ handler,
325
+ 30000,
326
+ ['tenant.created'] as any,
327
+ undefined,
328
+ [],
329
+ logger,
330
+ );
331
+
332
+ const adapter = new AWSLambdaSubscriber(envParser, subscriber);
333
+ const lambdaHandler = adapter.handler;
334
+
335
+ const sqsEvent = createSNSWrappedInSQSWithMessageAttributes([
336
+ {
337
+ type: 'tenant.created',
338
+ payload: { tenantId: '019c0b2b-d881-7c21-93b6-480571144b28' },
339
+ },
340
+ ]);
341
+
342
+ await lambdaHandler(sqsEvent, createMockContext(), vi.fn());
343
+
344
+ expect(handler).toHaveBeenCalled();
345
+ });
227
346
  });
228
347
 
229
348
  describe('event type filtering', () => {
@@ -1 +0,0 @@
1
- {"version":3,"file":"AWSLambdaSubscriberAdaptor-CrCeL9Fs.cjs","names":["envParser: EnvironmentParser<{}>","subscriber: Subscriber<\n\t\t\tTServices,\n\t\t\tTLogger,\n\t\t\tOutSchema,\n\t\t\tTEventPublisher,\n\t\t\tTEventPublisherServiceName,\n\t\t\tTSubscribedEvents\n\t\t>","events: any[]","event: SQSEvent | SNSEvent","record: SQSRecord","eventType: string","event: SubscriberEvent<TServices, TLogger>"],"sources":["../src/subscribers/AWSLambdaSubscriberAdaptor.ts"],"sourcesContent":["import type { EnvironmentParser } from '@geekmidas/envkit';\nimport { wrapError } from '@geekmidas/errors';\nimport type { EventPublisher } from '@geekmidas/events';\nimport type { Logger } from '@geekmidas/logger';\nimport type { InferStandardSchema } from '@geekmidas/schema';\nimport type { Service, ServiceRecord } from '@geekmidas/services';\nimport { ServiceDiscovery } from '@geekmidas/services';\nimport middy, { type MiddlewareObj } from '@middy/core';\nimport type { StandardSchemaV1 } from '@standard-schema/spec';\nimport type {\n\tContext,\n\tHandler,\n\tSNSEvent,\n\tSQSEvent,\n\tSQSRecord,\n} from 'aws-lambda';\nimport type { Subscriber } from './Subscriber';\n\nexport type AWSLambdaHandler<TEvent = any, TResult = any> = Handler<\n\tTEvent,\n\tTResult\n>;\n\ntype SubscriberEvent<TServices extends Service[], TLogger extends Logger> = {\n\tevents: any[];\n\tservices: ServiceRecord<TServices>;\n\tlogger: TLogger;\n};\n\ntype Middleware<\n\tTServices extends Service[],\n\tTLogger extends Logger,\n\tTOutSchema extends StandardSchemaV1 | undefined,\n> = MiddlewareObj<\n\tSubscriberEvent<TServices, TLogger>,\n\tInferStandardSchema<TOutSchema>,\n\tError,\n\tContext\n>;\n\nexport class AWSLambdaSubscriber<\n\tTServices extends Service[] = [],\n\tTLogger extends Logger = Logger,\n\tOutSchema extends StandardSchemaV1 | undefined = undefined,\n\tTEventPublisher extends EventPublisher<any> | undefined = undefined,\n\tTEventPublisherServiceName extends string = string,\n\tTSubscribedEvents extends any[] = [],\n> {\n\tprivate _logger!: TLogger;\n\tprivate _services!: ServiceRecord<TServices>;\n\n\tconstructor(\n\t\tprivate envParser: EnvironmentParser<{}>,\n\t\treadonly subscriber: Subscriber<\n\t\t\tTServices,\n\t\t\tTLogger,\n\t\t\tOutSchema,\n\t\t\tTEventPublisher,\n\t\t\tTEventPublisherServiceName,\n\t\t\tTSubscribedEvents\n\t\t>,\n\t) {\n\t\tthis._logger = subscriber.logger;\n\t}\n\n\tget logger(): TLogger {\n\t\treturn this._logger;\n\t}\n\n\tprivate async getServices(): Promise<ServiceRecord<TServices>> {\n\t\tif (this._services) {\n\t\t\treturn this._services;\n\t\t}\n\n\t\tconst serviceDiscovery = ServiceDiscovery.getInstance(this.envParser);\n\n\t\tif (this.subscriber.services.length > 0) {\n\t\t\tconst registered = await serviceDiscovery.register(\n\t\t\t\tthis.subscriber.services,\n\t\t\t);\n\t\t\tthis._services = registered as ServiceRecord<TServices>;\n\t\t} else {\n\t\t\tthis._services = {} as ServiceRecord<TServices>;\n\t\t}\n\n\t\treturn this._services;\n\t}\n\n\tprivate error(): Middleware<TServices, TLogger, OutSchema> {\n\t\treturn {\n\t\t\tonError: (req) => {\n\t\t\t\tconst logger = req.event?.logger || this.subscriber.logger;\n\t\t\t\tlogger.error(req.error || {}, 'Error processing subscriber');\n\n\t\t\t\t// Re-throw the wrapped error to let Lambda handle it\n\t\t\t\tthrow wrapError(req.error);\n\t\t\t},\n\t\t};\n\t}\n\n\tprivate loggerMiddleware(): Middleware<TServices, TLogger, OutSchema> {\n\t\treturn {\n\t\t\tbefore: (req) => {\n\t\t\t\tthis._logger = this.subscriber.logger.child({\n\t\t\t\t\tsubscriber: {\n\t\t\t\t\t\tname: req.context.functionName,\n\t\t\t\t\t\tversion: req.context.functionVersion,\n\t\t\t\t\t\tmemory: req.context.memoryLimitInMB,\n\t\t\t\t\t},\n\t\t\t\t\treq: {\n\t\t\t\t\t\tid: req.context.awsRequestId,\n\t\t\t\t\t},\n\t\t\t\t}) as TLogger;\n\n\t\t\t\treq.event.logger = this._logger;\n\t\t\t},\n\t\t};\n\t}\n\n\tprivate services(): Middleware<TServices, TLogger, OutSchema> {\n\t\treturn {\n\t\t\tbefore: async (req) => {\n\t\t\t\treq.event.services = await this.getServices();\n\t\t\t},\n\t\t};\n\t}\n\n\tprivate parseEvents(): Middleware<TServices, TLogger, OutSchema> {\n\t\treturn {\n\t\t\tbefore: async (req) => {\n\t\t\t\tconst { logger, ...e } = req.event;\n\t\t\t\tconst rawEvent = e as any as SQSEvent | SNSEvent;\n\n\t\t\t\tlogger.info({\n\t\t\t\t\trawEvent,\n\t\t\t\t});\n\n\t\t\t\t// Parse events based on the event type\n\t\t\t\tconst events: any[] = [];\n\n\t\t\t\tif ('Records' in rawEvent) {\n\t\t\t\t\tif (this.isSQSEvent(rawEvent)) {\n\t\t\t\t\t\t// SQS Event\n\t\t\t\t\t\tfor (const record of rawEvent.Records) {\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tconst event = this.parseSQSRecord(record);\n\t\t\t\t\t\t\t\tif (event && this.isSubscribedEvent(event.type)) {\n\t\t\t\t\t\t\t\t\tevents.push(event);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\t\tthis.logger.error(\n\t\t\t\t\t\t\t\t\t{ error, record },\n\t\t\t\t\t\t\t\t\t'Failed to parse SQS record',\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (this.isSNSEvent(rawEvent)) {\n\t\t\t\t\t\t// SNS Event\n\t\t\t\t\t\tfor (const record of rawEvent.Records) {\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tconst event = JSON.parse(record.Sns.Message);\n\t\t\t\t\t\t\t\tif (event && this.isSubscribedEvent(event.type)) {\n\t\t\t\t\t\t\t\t\tevents.push(event);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\t\tthis.logger.error(\n\t\t\t\t\t\t\t\t\t{ error, record },\n\t\t\t\t\t\t\t\t\t'Failed to parse SNS record',\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t(req.event as any).events = events;\n\t\t\t},\n\t\t};\n\t}\n\n\tprivate isSQSEvent(event: SQSEvent | SNSEvent): event is SQSEvent {\n\t\tconst firstRecord = event.Records[0];\n\t\treturn (\n\t\t\t'Records' in event &&\n\t\t\tevent.Records.length > 0 &&\n\t\t\tfirstRecord !== undefined &&\n\t\t\t'eventSource' in firstRecord &&\n\t\t\tfirstRecord.eventSource === 'aws:sqs'\n\t\t);\n\t}\n\n\tprivate isSNSEvent(event: SQSEvent | SNSEvent): event is SNSEvent {\n\t\tconst firstRecord = event.Records[0];\n\t\treturn (\n\t\t\t'Records' in event &&\n\t\t\tevent.Records.length > 0 &&\n\t\t\tfirstRecord !== undefined &&\n\t\t\t'EventSource' in firstRecord &&\n\t\t\tfirstRecord.EventSource === 'aws:sns'\n\t\t);\n\t}\n\n\tprivate parseSQSRecord(record: SQSRecord): any | null {\n\t\ttry {\n\t\t\tconst body = JSON.parse(record.body);\n\n\t\t\t// Check if this is an SNS message wrapped in SQS\n\t\t\tif (body.Type === 'Notification' && body.Message) {\n\t\t\t\t// Parse the SNS message\n\t\t\t\tconst snsMessage = JSON.parse(body.Message);\n\t\t\t\treturn snsMessage;\n\t\t\t}\n\n\t\t\t// Direct SQS message\n\t\t\treturn body;\n\t\t} catch (error) {\n\t\t\tthis.logger.error({ error, record }, 'Failed to parse SQS record body');\n\t\t\treturn null;\n\t\t}\n\t}\n\n\tprivate isSubscribedEvent(eventType: string): boolean {\n\t\tif (!this.subscriber.subscribedEvents) {\n\t\t\treturn true; // If no events specified, accept all\n\t\t}\n\n\t\treturn this.subscriber.subscribedEvents.includes(eventType as any);\n\t}\n\n\tprivate async _handler(event: SubscriberEvent<TServices, TLogger>) {\n\t\t// If no events after filtering, return early\n\t\tif (event.events.length === 0) {\n\t\t\tthis.logger.info('No subscribed events to process');\n\t\t\treturn {\n\t\t\t\tbatchItemFailures: [],\n\t\t\t};\n\t\t}\n\n\t\t// Execute the subscriber with the parsed context\n\t\tconst result = await this.subscriber.handler({\n\t\t\tevents: event.events,\n\t\t\tservices: event.services,\n\t\t\tlogger: event.logger,\n\t\t});\n\n\t\t// Parse output if schema is provided\n\t\tif (this.subscriber.outputSchema && result) {\n\t\t\tconst validationResult =\n\t\t\t\tawait this.subscriber.outputSchema['~standard'].validate(result);\n\n\t\t\tif (validationResult.issues) {\n\t\t\t\tthis.logger.error(\n\t\t\t\t\t{ issues: validationResult.issues },\n\t\t\t\t\t'Subscriber output validation failed',\n\t\t\t\t);\n\t\t\t\tthrow new Error('Subscriber output validation failed');\n\t\t\t}\n\n\t\t\treturn validationResult.value;\n\t\t}\n\n\t\treturn result;\n\t}\n\n\tget handler(): AWSLambdaHandler {\n\t\tconst handler = this._handler.bind(this);\n\n\t\t// Apply middleware in order\n\t\treturn middy(handler)\n\t\t\t.use(this.loggerMiddleware())\n\t\t\t.use(this.parseEvents())\n\t\t\t.use(this.error())\n\t\t\t.use(this.services());\n\t}\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"AWSLambdaSubscriberAdaptor-yt7Q8xE-.mjs","names":["envParser: EnvironmentParser<{}>","subscriber: Subscriber<\n\t\t\tTServices,\n\t\t\tTLogger,\n\t\t\tOutSchema,\n\t\t\tTEventPublisher,\n\t\t\tTEventPublisherServiceName,\n\t\t\tTSubscribedEvents\n\t\t>","events: any[]","event: SQSEvent | SNSEvent","record: SQSRecord","eventType: string","event: SubscriberEvent<TServices, TLogger>"],"sources":["../src/subscribers/AWSLambdaSubscriberAdaptor.ts"],"sourcesContent":["import type { EnvironmentParser } from '@geekmidas/envkit';\nimport { wrapError } from '@geekmidas/errors';\nimport type { EventPublisher } from '@geekmidas/events';\nimport type { Logger } from '@geekmidas/logger';\nimport type { InferStandardSchema } from '@geekmidas/schema';\nimport type { Service, ServiceRecord } from '@geekmidas/services';\nimport { ServiceDiscovery } from '@geekmidas/services';\nimport middy, { type MiddlewareObj } from '@middy/core';\nimport type { StandardSchemaV1 } from '@standard-schema/spec';\nimport type {\n\tContext,\n\tHandler,\n\tSNSEvent,\n\tSQSEvent,\n\tSQSRecord,\n} from 'aws-lambda';\nimport type { Subscriber } from './Subscriber';\n\nexport type AWSLambdaHandler<TEvent = any, TResult = any> = Handler<\n\tTEvent,\n\tTResult\n>;\n\ntype SubscriberEvent<TServices extends Service[], TLogger extends Logger> = {\n\tevents: any[];\n\tservices: ServiceRecord<TServices>;\n\tlogger: TLogger;\n};\n\ntype Middleware<\n\tTServices extends Service[],\n\tTLogger extends Logger,\n\tTOutSchema extends StandardSchemaV1 | undefined,\n> = MiddlewareObj<\n\tSubscriberEvent<TServices, TLogger>,\n\tInferStandardSchema<TOutSchema>,\n\tError,\n\tContext\n>;\n\nexport class AWSLambdaSubscriber<\n\tTServices extends Service[] = [],\n\tTLogger extends Logger = Logger,\n\tOutSchema extends StandardSchemaV1 | undefined = undefined,\n\tTEventPublisher extends EventPublisher<any> | undefined = undefined,\n\tTEventPublisherServiceName extends string = string,\n\tTSubscribedEvents extends any[] = [],\n> {\n\tprivate _logger!: TLogger;\n\tprivate _services!: ServiceRecord<TServices>;\n\n\tconstructor(\n\t\tprivate envParser: EnvironmentParser<{}>,\n\t\treadonly subscriber: Subscriber<\n\t\t\tTServices,\n\t\t\tTLogger,\n\t\t\tOutSchema,\n\t\t\tTEventPublisher,\n\t\t\tTEventPublisherServiceName,\n\t\t\tTSubscribedEvents\n\t\t>,\n\t) {\n\t\tthis._logger = subscriber.logger;\n\t}\n\n\tget logger(): TLogger {\n\t\treturn this._logger;\n\t}\n\n\tprivate async getServices(): Promise<ServiceRecord<TServices>> {\n\t\tif (this._services) {\n\t\t\treturn this._services;\n\t\t}\n\n\t\tconst serviceDiscovery = ServiceDiscovery.getInstance(this.envParser);\n\n\t\tif (this.subscriber.services.length > 0) {\n\t\t\tconst registered = await serviceDiscovery.register(\n\t\t\t\tthis.subscriber.services,\n\t\t\t);\n\t\t\tthis._services = registered as ServiceRecord<TServices>;\n\t\t} else {\n\t\t\tthis._services = {} as ServiceRecord<TServices>;\n\t\t}\n\n\t\treturn this._services;\n\t}\n\n\tprivate error(): Middleware<TServices, TLogger, OutSchema> {\n\t\treturn {\n\t\t\tonError: (req) => {\n\t\t\t\tconst logger = req.event?.logger || this.subscriber.logger;\n\t\t\t\tlogger.error(req.error || {}, 'Error processing subscriber');\n\n\t\t\t\t// Re-throw the wrapped error to let Lambda handle it\n\t\t\t\tthrow wrapError(req.error);\n\t\t\t},\n\t\t};\n\t}\n\n\tprivate loggerMiddleware(): Middleware<TServices, TLogger, OutSchema> {\n\t\treturn {\n\t\t\tbefore: (req) => {\n\t\t\t\tthis._logger = this.subscriber.logger.child({\n\t\t\t\t\tsubscriber: {\n\t\t\t\t\t\tname: req.context.functionName,\n\t\t\t\t\t\tversion: req.context.functionVersion,\n\t\t\t\t\t\tmemory: req.context.memoryLimitInMB,\n\t\t\t\t\t},\n\t\t\t\t\treq: {\n\t\t\t\t\t\tid: req.context.awsRequestId,\n\t\t\t\t\t},\n\t\t\t\t}) as TLogger;\n\n\t\t\t\treq.event.logger = this._logger;\n\t\t\t},\n\t\t};\n\t}\n\n\tprivate services(): Middleware<TServices, TLogger, OutSchema> {\n\t\treturn {\n\t\t\tbefore: async (req) => {\n\t\t\t\treq.event.services = await this.getServices();\n\t\t\t},\n\t\t};\n\t}\n\n\tprivate parseEvents(): Middleware<TServices, TLogger, OutSchema> {\n\t\treturn {\n\t\t\tbefore: async (req) => {\n\t\t\t\tconst { logger, ...e } = req.event;\n\t\t\t\tconst rawEvent = e as any as SQSEvent | SNSEvent;\n\n\t\t\t\tlogger.info({\n\t\t\t\t\trawEvent,\n\t\t\t\t});\n\n\t\t\t\t// Parse events based on the event type\n\t\t\t\tconst events: any[] = [];\n\n\t\t\t\tif ('Records' in rawEvent) {\n\t\t\t\t\tif (this.isSQSEvent(rawEvent)) {\n\t\t\t\t\t\t// SQS Event\n\t\t\t\t\t\tfor (const record of rawEvent.Records) {\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tconst event = this.parseSQSRecord(record);\n\t\t\t\t\t\t\t\tif (event && this.isSubscribedEvent(event.type)) {\n\t\t\t\t\t\t\t\t\tevents.push(event);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\t\tthis.logger.error(\n\t\t\t\t\t\t\t\t\t{ error, record },\n\t\t\t\t\t\t\t\t\t'Failed to parse SQS record',\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (this.isSNSEvent(rawEvent)) {\n\t\t\t\t\t\t// SNS Event\n\t\t\t\t\t\tfor (const record of rawEvent.Records) {\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tconst event = JSON.parse(record.Sns.Message);\n\t\t\t\t\t\t\t\tif (event && this.isSubscribedEvent(event.type)) {\n\t\t\t\t\t\t\t\t\tevents.push(event);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\t\tthis.logger.error(\n\t\t\t\t\t\t\t\t\t{ error, record },\n\t\t\t\t\t\t\t\t\t'Failed to parse SNS record',\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t(req.event as any).events = events;\n\t\t\t},\n\t\t};\n\t}\n\n\tprivate isSQSEvent(event: SQSEvent | SNSEvent): event is SQSEvent {\n\t\tconst firstRecord = event.Records[0];\n\t\treturn (\n\t\t\t'Records' in event &&\n\t\t\tevent.Records.length > 0 &&\n\t\t\tfirstRecord !== undefined &&\n\t\t\t'eventSource' in firstRecord &&\n\t\t\tfirstRecord.eventSource === 'aws:sqs'\n\t\t);\n\t}\n\n\tprivate isSNSEvent(event: SQSEvent | SNSEvent): event is SNSEvent {\n\t\tconst firstRecord = event.Records[0];\n\t\treturn (\n\t\t\t'Records' in event &&\n\t\t\tevent.Records.length > 0 &&\n\t\t\tfirstRecord !== undefined &&\n\t\t\t'EventSource' in firstRecord &&\n\t\t\tfirstRecord.EventSource === 'aws:sns'\n\t\t);\n\t}\n\n\tprivate parseSQSRecord(record: SQSRecord): any | null {\n\t\ttry {\n\t\t\tconst body = JSON.parse(record.body);\n\n\t\t\t// Check if this is an SNS message wrapped in SQS\n\t\t\tif (body.Type === 'Notification' && body.Message) {\n\t\t\t\t// Parse the SNS message\n\t\t\t\tconst snsMessage = JSON.parse(body.Message);\n\t\t\t\treturn snsMessage;\n\t\t\t}\n\n\t\t\t// Direct SQS message\n\t\t\treturn body;\n\t\t} catch (error) {\n\t\t\tthis.logger.error({ error, record }, 'Failed to parse SQS record body');\n\t\t\treturn null;\n\t\t}\n\t}\n\n\tprivate isSubscribedEvent(eventType: string): boolean {\n\t\tif (!this.subscriber.subscribedEvents) {\n\t\t\treturn true; // If no events specified, accept all\n\t\t}\n\n\t\treturn this.subscriber.subscribedEvents.includes(eventType as any);\n\t}\n\n\tprivate async _handler(event: SubscriberEvent<TServices, TLogger>) {\n\t\t// If no events after filtering, return early\n\t\tif (event.events.length === 0) {\n\t\t\tthis.logger.info('No subscribed events to process');\n\t\t\treturn {\n\t\t\t\tbatchItemFailures: [],\n\t\t\t};\n\t\t}\n\n\t\t// Execute the subscriber with the parsed context\n\t\tconst result = await this.subscriber.handler({\n\t\t\tevents: event.events,\n\t\t\tservices: event.services,\n\t\t\tlogger: event.logger,\n\t\t});\n\n\t\t// Parse output if schema is provided\n\t\tif (this.subscriber.outputSchema && result) {\n\t\t\tconst validationResult =\n\t\t\t\tawait this.subscriber.outputSchema['~standard'].validate(result);\n\n\t\t\tif (validationResult.issues) {\n\t\t\t\tthis.logger.error(\n\t\t\t\t\t{ issues: validationResult.issues },\n\t\t\t\t\t'Subscriber output validation failed',\n\t\t\t\t);\n\t\t\t\tthrow new Error('Subscriber output validation failed');\n\t\t\t}\n\n\t\t\treturn validationResult.value;\n\t\t}\n\n\t\treturn result;\n\t}\n\n\tget handler(): AWSLambdaHandler {\n\t\tconst handler = this._handler.bind(this);\n\n\t\t// Apply middleware in order\n\t\treturn middy(handler)\n\t\t\t.use(this.loggerMiddleware())\n\t\t\t.use(this.parseEvents())\n\t\t\t.use(this.error())\n\t\t\t.use(this.services());\n\t}\n}\n"],"mappings":";;;;;AAwCA,IAAa,sBAAb,MAOE;CACD,AAAQ;CACR,AAAQ;CAER,YACSA,WACCC,YAQR;EATO;EACC;AAST,OAAK,UAAU,WAAW;CAC1B;CAED,IAAI,SAAkB;AACrB,SAAO,KAAK;CACZ;CAED,MAAc,cAAiD;AAC9D,MAAI,KAAK,UACR,QAAO,KAAK;EAGb,MAAM,mBAAmB,iBAAiB,YAAY,KAAK,UAAU;AAErE,MAAI,KAAK,WAAW,SAAS,SAAS,GAAG;GACxC,MAAM,aAAa,MAAM,iBAAiB,SACzC,KAAK,WAAW,SAChB;AACD,QAAK,YAAY;EACjB,MACA,MAAK,YAAY,CAAE;AAGpB,SAAO,KAAK;CACZ;CAED,AAAQ,QAAmD;AAC1D,SAAO,EACN,SAAS,CAAC,QAAQ;GACjB,MAAM,SAAS,IAAI,OAAO,UAAU,KAAK,WAAW;AACpD,UAAO,MAAM,IAAI,SAAS,CAAE,GAAE,8BAA8B;AAG5D,SAAM,UAAU,IAAI,MAAM;EAC1B,EACD;CACD;CAED,AAAQ,mBAA8D;AACrE,SAAO,EACN,QAAQ,CAAC,QAAQ;AAChB,QAAK,UAAU,KAAK,WAAW,OAAO,MAAM;IAC3C,YAAY;KACX,MAAM,IAAI,QAAQ;KAClB,SAAS,IAAI,QAAQ;KACrB,QAAQ,IAAI,QAAQ;IACpB;IACD,KAAK,EACJ,IAAI,IAAI,QAAQ,aAChB;GACD,EAAC;AAEF,OAAI,MAAM,SAAS,KAAK;EACxB,EACD;CACD;CAED,AAAQ,WAAsD;AAC7D,SAAO,EACN,QAAQ,OAAO,QAAQ;AACtB,OAAI,MAAM,WAAW,MAAM,KAAK,aAAa;EAC7C,EACD;CACD;CAED,AAAQ,cAAyD;AAChE,SAAO,EACN,QAAQ,OAAO,QAAQ;GACtB,MAAM,EAAE,OAAQ,GAAG,GAAG,GAAG,IAAI;GAC7B,MAAM,WAAW;AAEjB,UAAO,KAAK,EACX,SACA,EAAC;GAGF,MAAMC,SAAgB,CAAE;AAExB,OAAI,aAAa,UAChB;QAAI,KAAK,WAAW,SAAS,CAE5B,MAAK,MAAM,UAAU,SAAS,QAC7B,KAAI;KACH,MAAM,QAAQ,KAAK,eAAe,OAAO;AACzC,SAAI,SAAS,KAAK,kBAAkB,MAAM,KAAK,CAC9C,QAAO,KAAK,MAAM;IAEnB,SAAQ,OAAO;AACf,UAAK,OAAO,MACX;MAAE;MAAO;KAAQ,GACjB,6BACA;IACD;aAEQ,KAAK,WAAW,SAAS,CAEnC,MAAK,MAAM,UAAU,SAAS,QAC7B,KAAI;KACH,MAAM,QAAQ,KAAK,MAAM,OAAO,IAAI,QAAQ;AAC5C,SAAI,SAAS,KAAK,kBAAkB,MAAM,KAAK,CAC9C,QAAO,KAAK,MAAM;IAEnB,SAAQ,OAAO;AACf,UAAK,OAAO,MACX;MAAE;MAAO;KAAQ,GACjB,6BACA;IACD;GAEF;AAGF,GAAC,IAAI,MAAc,SAAS;EAC5B,EACD;CACD;CAED,AAAQ,WAAWC,OAA+C;EACjE,MAAM,cAAc,MAAM,QAAQ;AAClC,SACC,aAAa,SACb,MAAM,QAAQ,SAAS,KACvB,0BACA,iBAAiB,eACjB,YAAY,gBAAgB;CAE7B;CAED,AAAQ,WAAWA,OAA+C;EACjE,MAAM,cAAc,MAAM,QAAQ;AAClC,SACC,aAAa,SACb,MAAM,QAAQ,SAAS,KACvB,0BACA,iBAAiB,eACjB,YAAY,gBAAgB;CAE7B;CAED,AAAQ,eAAeC,QAA+B;AACrD,MAAI;GACH,MAAM,OAAO,KAAK,MAAM,OAAO,KAAK;AAGpC,OAAI,KAAK,SAAS,kBAAkB,KAAK,SAAS;IAEjD,MAAM,aAAa,KAAK,MAAM,KAAK,QAAQ;AAC3C,WAAO;GACP;AAGD,UAAO;EACP,SAAQ,OAAO;AACf,QAAK,OAAO,MAAM;IAAE;IAAO;GAAQ,GAAE,kCAAkC;AACvE,UAAO;EACP;CACD;CAED,AAAQ,kBAAkBC,WAA4B;AACrD,OAAK,KAAK,WAAW,iBACpB,QAAO;AAGR,SAAO,KAAK,WAAW,iBAAiB,SAAS,UAAiB;CAClE;CAED,MAAc,SAASC,OAA4C;AAElE,MAAI,MAAM,OAAO,WAAW,GAAG;AAC9B,QAAK,OAAO,KAAK,kCAAkC;AACnD,UAAO,EACN,mBAAmB,CAAE,EACrB;EACD;EAGD,MAAM,SAAS,MAAM,KAAK,WAAW,QAAQ;GAC5C,QAAQ,MAAM;GACd,UAAU,MAAM;GAChB,QAAQ,MAAM;EACd,EAAC;AAGF,MAAI,KAAK,WAAW,gBAAgB,QAAQ;GAC3C,MAAM,mBACL,MAAM,KAAK,WAAW,aAAa,aAAa,SAAS,OAAO;AAEjE,OAAI,iBAAiB,QAAQ;AAC5B,SAAK,OAAO,MACX,EAAE,QAAQ,iBAAiB,OAAQ,GACnC,sCACA;AACD,UAAM,IAAI,MAAM;GAChB;AAED,UAAO,iBAAiB;EACxB;AAED,SAAO;CACP;CAED,IAAI,UAA4B;EAC/B,MAAM,UAAU,KAAK,SAAS,KAAK,KAAK;AAGxC,SAAO,MAAM,QAAQ,CACnB,IAAI,KAAK,kBAAkB,CAAC,CAC5B,IAAI,KAAK,aAAa,CAAC,CACvB,IAAI,KAAK,OAAO,CAAC,CACjB,IAAI,KAAK,UAAU,CAAC;CACtB;AACD"}