@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.
- package/dist/{AWSLambdaSubscriberAdaptor-yt7Q8xE-.mjs → AWSLambdaSubscriberAdaptor-BUvb-v_n.mjs} +25 -3
- package/dist/AWSLambdaSubscriberAdaptor-BUvb-v_n.mjs.map +1 -0
- package/dist/{AWSLambdaSubscriberAdaptor-Bat1CB6a.d.cts → AWSLambdaSubscriberAdaptor-BfEGolJA.d.cts} +2 -1
- package/dist/{AWSLambdaSubscriberAdaptor-DgSXzIUT.d.mts.map → AWSLambdaSubscriberAdaptor-BfEGolJA.d.cts.map} +1 -1
- package/dist/{AWSLambdaSubscriberAdaptor-DgSXzIUT.d.mts → AWSLambdaSubscriberAdaptor-Pb7Jof-i.d.mts} +2 -1
- package/dist/{AWSLambdaSubscriberAdaptor-Bat1CB6a.d.cts.map → AWSLambdaSubscriberAdaptor-Pb7Jof-i.d.mts.map} +1 -1
- package/dist/{AWSLambdaSubscriberAdaptor-CrCeL9Fs.cjs → AWSLambdaSubscriberAdaptor-Soie57uM.cjs} +25 -3
- package/dist/AWSLambdaSubscriberAdaptor-Soie57uM.cjs.map +1 -0
- package/dist/{Authorizer-Q-lW9GNW.cjs → Authorizer-BXxBee2P.cjs} +1 -1
- package/dist/{Authorizer-Q-lW9GNW.cjs.map → Authorizer-BXxBee2P.cjs.map} +1 -1
- package/dist/{Authorizer-UByhrr73.mjs → Authorizer-BgjU8-z6.mjs} +1 -1
- package/dist/{Authorizer-UByhrr73.mjs.map → Authorizer-BgjU8-z6.mjs.map} +1 -1
- package/dist/{Cron-Bx77QBN0.cjs → Cron-BV6weqem.cjs} +1 -1
- package/dist/{Cron-Bx77QBN0.cjs.map → Cron-BV6weqem.cjs.map} +1 -1
- package/dist/{Cron-CU3nmjdC.mjs → Cron-D5NpDp6y.mjs} +1 -1
- package/dist/{Cron-CU3nmjdC.mjs.map → Cron-D5NpDp6y.mjs.map} +1 -1
- package/dist/{CronBuilder-DLJvSOqj.cjs → CronBuilder-DzPkDCiP.cjs} +2 -2
- package/dist/{CronBuilder-DLJvSOqj.cjs.map → CronBuilder-DzPkDCiP.cjs.map} +1 -1
- package/dist/{CronBuilder-DEI1u1kW.mjs → CronBuilder-p1Ro6a0n.mjs} +2 -2
- package/dist/{CronBuilder-DEI1u1kW.mjs.map → CronBuilder-p1Ro6a0n.mjs.map} +1 -1
- package/dist/{EndpointBuilder-CZCom6bI.mjs → EndpointBuilder-CF-ZWtdu.mjs} +3 -3
- package/dist/{EndpointBuilder-CZCom6bI.mjs.map → EndpointBuilder-CF-ZWtdu.mjs.map} +1 -1
- package/dist/{EndpointBuilder-CVLonbkM.cjs → EndpointBuilder-CyszO0bs.cjs} +3 -3
- package/dist/{EndpointBuilder-CVLonbkM.cjs.map → EndpointBuilder-CyszO0bs.cjs.map} +1 -1
- package/dist/{EndpointFactory-CTRHSuRp.cjs → EndpointFactory-D36yAGvt.cjs} +2 -2
- package/dist/{EndpointFactory-CTRHSuRp.cjs.map → EndpointFactory-D36yAGvt.cjs.map} +1 -1
- package/dist/{EndpointFactory-CSStmg_R.mjs → EndpointFactory-Dm8Hj6e5.mjs} +2 -2
- package/dist/{EndpointFactory-CSStmg_R.mjs.map → EndpointFactory-Dm8Hj6e5.mjs.map} +1 -1
- package/dist/{HonoEndpointAdaptor-C_eGbXZR.d.mts → HonoEndpointAdaptor-Ay5UGPu0.d.mts} +3 -3
- package/dist/{HonoEndpointAdaptor-BuyXynoH.d.cts.map → HonoEndpointAdaptor-Ay5UGPu0.d.mts.map} +1 -1
- package/dist/{HonoEndpointAdaptor-BuyXynoH.d.cts → HonoEndpointAdaptor-o6QyDkdy.d.cts} +3 -3
- package/dist/{HonoEndpointAdaptor-C_eGbXZR.d.mts.map → HonoEndpointAdaptor-o6QyDkdy.d.cts.map} +1 -1
- package/dist/adaptors/aws.cjs +1 -1
- package/dist/adaptors/aws.d.cts +2 -2
- package/dist/adaptors/aws.d.mts +2 -2
- package/dist/adaptors/aws.mjs +1 -1
- package/dist/adaptors/hono.d.cts +2 -2
- package/dist/adaptors/hono.d.mts +2 -2
- package/dist/adaptors/testing.d.cts +1 -1
- package/dist/adaptors/testing.d.mts +1 -1
- package/dist/crons/Cron.cjs +1 -1
- package/dist/crons/Cron.d.cts +1 -1
- package/dist/crons/Cron.d.mts +1 -1
- package/dist/crons/Cron.mjs +1 -1
- package/dist/crons/CronBuilder.cjs +2 -2
- package/dist/crons/CronBuilder.d.cts +1 -1
- package/dist/crons/CronBuilder.d.mts +1 -1
- package/dist/crons/CronBuilder.mjs +2 -2
- package/dist/crons/index.cjs +2 -2
- package/dist/crons/index.d.cts +5 -5
- package/dist/crons/index.d.mts +5 -5
- package/dist/crons/index.d.mts.map +1 -1
- package/dist/crons/index.mjs +2 -2
- package/dist/endpoints/AmazonApiGatewayEndpointAdaptor.d.cts +1 -1
- package/dist/endpoints/AmazonApiGatewayEndpointAdaptor.d.mts +1 -1
- package/dist/endpoints/AmazonApiGatewayV1EndpointAdaptor.d.cts +1 -1
- package/dist/endpoints/AmazonApiGatewayV1EndpointAdaptor.d.mts +1 -1
- package/dist/endpoints/AmazonApiGatewayV2EndpointAdaptor.d.cts +1 -1
- package/dist/endpoints/AmazonApiGatewayV2EndpointAdaptor.d.mts +1 -1
- package/dist/endpoints/Authorizer.cjs +1 -1
- package/dist/endpoints/Authorizer.mjs +1 -1
- package/dist/endpoints/Endpoint.d.cts +1 -1
- package/dist/endpoints/Endpoint.d.mts +1 -1
- package/dist/endpoints/EndpointBuilder.cjs +3 -3
- package/dist/endpoints/EndpointBuilder.d.cts +1 -1
- package/dist/endpoints/EndpointBuilder.d.mts +1 -1
- package/dist/endpoints/EndpointBuilder.mjs +3 -3
- package/dist/endpoints/EndpointFactory.cjs +4 -4
- package/dist/endpoints/EndpointFactory.d.cts +1 -1
- package/dist/endpoints/EndpointFactory.d.mts +1 -1
- package/dist/endpoints/EndpointFactory.mjs +4 -4
- package/dist/endpoints/HonoEndpointAdaptor.d.cts +2 -2
- package/dist/endpoints/HonoEndpointAdaptor.d.mts +2 -2
- package/dist/endpoints/TestEndpointAdaptor.d.cts +1 -1
- package/dist/endpoints/TestEndpointAdaptor.d.mts +1 -1
- package/dist/endpoints/audit.d.cts +1 -1
- package/dist/endpoints/audit.d.mts +1 -1
- package/dist/endpoints/helpers.d.cts +1 -1
- package/dist/endpoints/helpers.d.mts +1 -1
- package/dist/endpoints/index.cjs +4 -4
- package/dist/endpoints/index.d.cts +3 -3
- package/dist/endpoints/index.d.mts +3 -3
- package/dist/endpoints/index.mjs +4 -4
- package/dist/endpoints/lazyAccessors.d.cts +1 -1
- package/dist/endpoints/lazyAccessors.d.mts +1 -1
- package/dist/endpoints/processAudits.d.cts +1 -1
- package/dist/endpoints/processAudits.d.mts +1 -1
- package/dist/endpoints/rls.cjs +1 -1
- package/dist/endpoints/rls.d.cts +1 -1
- package/dist/endpoints/rls.d.mts +1 -1
- package/dist/endpoints/rls.mjs +1 -1
- package/dist/functions/index.d.cts +1 -1
- package/dist/functions/index.d.mts +1 -1
- package/dist/index-dRNH0dT6.d.cts +12 -0
- package/dist/{index-0bHR_AbP.d.cts.map → index-dRNH0dT6.d.cts.map} +1 -1
- package/dist/{index-0bHR_AbP.d.cts → index-puUpr9Dh.d.mts} +2 -2
- package/dist/{index-BN927YDe.d.mts.map → index-puUpr9Dh.d.mts.map} +1 -1
- package/dist/{rls-uq6XPM83.cjs → rls-BrywnrQb.cjs} +1 -1
- package/dist/{rls-uq6XPM83.cjs.map → rls-BrywnrQb.cjs.map} +1 -1
- package/dist/{rls-WNnQLmQd.mjs → rls-C0cWOnk4.mjs} +1 -1
- package/dist/{rls-WNnQLmQd.mjs.map → rls-C0cWOnk4.mjs.map} +1 -1
- package/dist/subscribers/AWSLambdaSubscriberAdaptor.cjs +1 -1
- package/dist/subscribers/AWSLambdaSubscriberAdaptor.d.cts +1 -1
- package/dist/subscribers/AWSLambdaSubscriberAdaptor.d.mts +1 -1
- package/dist/subscribers/AWSLambdaSubscriberAdaptor.mjs +1 -1
- package/dist/subscribers/index.d.cts +2 -2
- package/dist/subscribers/index.d.mts +2 -2
- package/dist/subscribers/index.d.mts.map +1 -1
- package/package.json +6 -6
- package/src/subscribers/AWSLambdaSubscriberAdaptor.ts +32 -3
- package/src/subscribers/__tests__/AWSLambdaSubscriberAdaptor.spec.ts +120 -1
- package/dist/AWSLambdaSubscriberAdaptor-CrCeL9Fs.cjs.map +0 -1
- package/dist/AWSLambdaSubscriberAdaptor-yt7Q8xE-.mjs.map +0 -1
- package/dist/index-BN927YDe.d.mts +0 -12
package/dist/endpoints/index.cjs
CHANGED
|
@@ -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-
|
|
10
|
-
const require_rls = require('../rls-
|
|
11
|
-
const require_EndpointBuilder = require('../EndpointBuilder-
|
|
12
|
-
const require_EndpointFactory = require('../EndpointFactory-
|
|
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-
|
|
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
|
|
13
|
+
import * as _geekmidas_logger9 from "@geekmidas/logger";
|
|
14
14
|
|
|
15
15
|
//#region src/endpoints/index.d.ts
|
|
16
|
-
declare const e: EndpointFactory<[], "",
|
|
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-
|
|
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
|
|
13
|
+
import * as _geekmidas_logger3 from "@geekmidas/logger";
|
|
14
14
|
|
|
15
15
|
//#region src/endpoints/index.d.ts
|
|
16
|
-
declare const e: EndpointFactory<[], "",
|
|
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
|
package/dist/endpoints/index.mjs
CHANGED
|
@@ -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-
|
|
10
|
-
import { RLS_BYPASS } from "../rls-
|
|
11
|
-
import { EndpointBuilder } from "../EndpointBuilder-
|
|
12
|
-
import { EndpointFactory } from "../EndpointFactory-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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";
|
package/dist/endpoints/rls.cjs
CHANGED
package/dist/endpoints/rls.d.cts
CHANGED
|
@@ -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-
|
|
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 };
|
package/dist/endpoints/rls.d.mts
CHANGED
|
@@ -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-
|
|
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 };
|
package/dist/endpoints/rls.mjs
CHANGED
|
@@ -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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
12
|
+
//# sourceMappingURL=index-puUpr9Dh.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index-
|
|
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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rls-
|
|
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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rls-
|
|
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-
|
|
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-
|
|
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-
|
|
3
|
+
import { AWSLambdaHandler, AWSLambdaSubscriber } from "../AWSLambdaSubscriberAdaptor-Pb7Jof-i.mjs";
|
|
4
4
|
export { AWSLambdaHandler, 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
|
|
4
|
+
import * as _geekmidas_logger0 from "@geekmidas/logger";
|
|
5
5
|
|
|
6
6
|
//#region src/subscribers/index.d.ts
|
|
7
|
-
declare const s: SubscriberBuilder<[],
|
|
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
|
|
4
|
+
import * as _geekmidas_logger7 from "@geekmidas/logger";
|
|
5
5
|
|
|
6
6
|
//#region src/subscribers/index.d.ts
|
|
7
|
-
declare const s: SubscriberBuilder<[],
|
|
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,
|
|
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.
|
|
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/
|
|
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 =
|
|
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
|
-
|
|
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":"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"}
|