@beesolve/lambda-keep-active 1.0.5 → 1.1.1

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/lib/cdk.d.ts ADDED
@@ -0,0 +1,14 @@
1
+ import type { IFunction } from 'aws-cdk-lib/aws-lambda';
2
+ import { Construct } from 'constructs';
3
+ export interface LambdaKeepActiveProps {
4
+ /**
5
+ * If disabled no logs are logged to CloudWatch
6
+ *
7
+ * @default true
8
+ */
9
+ readonly enableLogs?: boolean;
10
+ }
11
+ export declare class LambdaKeepActive extends Construct {
12
+ constructor(scope: Construct, id: string, props?: LambdaKeepActiveProps);
13
+ keepActive(lambda: IFunction): void;
14
+ }
package/lib/cdk.js ADDED
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+ var _a;
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.LambdaKeepActive = void 0;
5
+ const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
6
+ const aws_cdk_lib_1 = require("aws-cdk-lib");
7
+ const aws_events_1 = require("aws-cdk-lib/aws-events");
8
+ const aws_events_targets_1 = require("aws-cdk-lib/aws-events-targets");
9
+ const aws_iam_1 = require("aws-cdk-lib/aws-iam");
10
+ const aws_lambda_1 = require("aws-cdk-lib/aws-lambda");
11
+ const constructs_1 = require("constructs");
12
+ const handler_function_1 = require("./handler-function");
13
+ class LambdaKeepActive extends constructs_1.Construct {
14
+ constructor(scope, id, props) {
15
+ super(scope, id);
16
+ const handler = new handler_function_1.HandlerFunction(this, 'LambdaKeepActive', {
17
+ description: 'LambdaKeepActive handler',
18
+ memorySize: 128,
19
+ timeout: aws_cdk_lib_1.Duration.minutes(5),
20
+ architecture: aws_lambda_1.Architecture.ARM_64,
21
+ environment: {
22
+ NODE_ENV: 'production',
23
+ ENABLE_LOGS: String(props?.enableLogs ?? true),
24
+ },
25
+ });
26
+ new aws_events_1.Rule(this, 'KeepActive', {
27
+ schedule: aws_events_1.Schedule.rate(aws_cdk_lib_1.Duration.days(3)),
28
+ targets: [
29
+ new aws_events_targets_1.LambdaFunction(handler, {
30
+ event: aws_events_1.RuleTargetInput.fromObject({
31
+ action: 'lambdaKeepActive',
32
+ }),
33
+ }),
34
+ ],
35
+ });
36
+ handler.addToRolePolicy(new aws_iam_1.PolicyStatement({
37
+ actions: ['lambda:InvokeFunction', 'tag:GetResources'],
38
+ resources: ['*'],
39
+ effect: aws_iam_1.Effect.ALLOW,
40
+ }));
41
+ }
42
+ keepActive(lambda) {
43
+ aws_cdk_lib_1.Tags.of(lambda).add('keepActive', 'true');
44
+ }
45
+ }
46
+ exports.LambdaKeepActive = LambdaKeepActive;
47
+ _a = JSII_RTTI_SYMBOL_1;
48
+ LambdaKeepActive[_a] = { fqn: "@beesolve/lambda-keep-active.LambdaKeepActive", version: "1.1.1" };
49
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2RrLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2Nkay50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLDZDQUE2QztBQUM3Qyx1REFBeUU7QUFDekUsdUVBQWdFO0FBQ2hFLGlEQUE4RDtBQUU5RCx1REFBc0Q7QUFDdEQsMkNBQXVDO0FBQ3ZDLHlEQUFxRDtBQVdyRCxNQUFhLGdCQUFpQixTQUFRLHNCQUFTO0lBQzdDLFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBNkI7UUFDckUsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQixNQUFNLE9BQU8sR0FBRyxJQUFJLGtDQUFlLENBQUMsSUFBSSxFQUFFLGtCQUFrQixFQUFFO1lBQzVELFdBQVcsRUFBRSwwQkFBMEI7WUFDdkMsVUFBVSxFQUFFLEdBQUc7WUFDZixPQUFPLEVBQUUsc0JBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1lBQzVCLFlBQVksRUFBRSx5QkFBWSxDQUFDLE1BQU07WUFDakMsV0FBVyxFQUFFO2dCQUNYLFFBQVEsRUFBRSxZQUFZO2dCQUN0QixXQUFXLEVBQUUsTUFBTSxDQUFDLEtBQUssRUFBRSxVQUFVLElBQUksSUFBSSxDQUFDO2FBQy9DO1NBQ0YsQ0FBQyxDQUFDO1FBRUgsSUFBSSxpQkFBSSxDQUFDLElBQUksRUFBRSxZQUFZLEVBQUU7WUFDM0IsUUFBUSxFQUFFLHFCQUFRLENBQUMsSUFBSSxDQUFDLHNCQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3pDLE9BQU8sRUFBRTtnQkFDUCxJQUFJLG1DQUFjLENBQUMsT0FBTyxFQUFFO29CQUMxQixLQUFLLEVBQUUsNEJBQWUsQ0FBQyxVQUFVLENBQUM7d0JBQ2hDLE1BQU0sRUFBRSxrQkFBa0I7cUJBQzNCLENBQUM7aUJBQ0gsQ0FBQzthQUNIO1NBQ0YsQ0FBQyxDQUFDO1FBRUgsT0FBTyxDQUFDLGVBQWUsQ0FDckIsSUFBSSx5QkFBZSxDQUFDO1lBQ2xCLE9BQU8sRUFBRSxDQUFDLHVCQUF1QixFQUFFLGtCQUFrQixDQUFDO1lBQ3RELFNBQVMsRUFBRSxDQUFDLEdBQUcsQ0FBQztZQUNoQixNQUFNLEVBQUUsZ0JBQU0sQ0FBQyxLQUFLO1NBQ3JCLENBQUMsQ0FDSCxDQUFDO0lBQ0osQ0FBQztJQUVNLFVBQVUsQ0FBQyxNQUFpQjtRQUNqQyxrQkFBSSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQzVDLENBQUM7O0FBckNILDRDQXNDQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IER1cmF0aW9uLCBUYWdzIH0gZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0IHsgUnVsZSwgUnVsZVRhcmdldElucHV0LCBTY2hlZHVsZSB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1ldmVudHMnO1xuaW1wb3J0IHsgTGFtYmRhRnVuY3Rpb24gfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtZXZlbnRzLXRhcmdldHMnO1xuaW1wb3J0IHsgRWZmZWN0LCBQb2xpY3lTdGF0ZW1lbnQgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtaWFtJztcbmltcG9ydCB0eXBlIHsgSUZ1bmN0aW9uIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWxhbWJkYSc7XG5pbXBvcnQgeyBBcmNoaXRlY3R1cmUgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtbGFtYmRhJztcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHsgSGFuZGxlckZ1bmN0aW9uIH0gZnJvbSAnLi9oYW5kbGVyLWZ1bmN0aW9uJztcblxuZXhwb3J0IGludGVyZmFjZSBMYW1iZGFLZWVwQWN0aXZlUHJvcHMge1xuICAvKipcbiAgICogSWYgZGlzYWJsZWQgbm8gbG9ncyBhcmUgbG9nZ2VkIHRvIENsb3VkV2F0Y2hcbiAgICpcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgcmVhZG9ubHkgZW5hYmxlTG9ncz86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBjbGFzcyBMYW1iZGFLZWVwQWN0aXZlIGV4dGVuZHMgQ29uc3RydWN0IHtcbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM/OiBMYW1iZGFLZWVwQWN0aXZlUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgY29uc3QgaGFuZGxlciA9IG5ldyBIYW5kbGVyRnVuY3Rpb24odGhpcywgJ0xhbWJkYUtlZXBBY3RpdmUnLCB7XG4gICAgICBkZXNjcmlwdGlvbjogJ0xhbWJkYUtlZXBBY3RpdmUgaGFuZGxlcicsXG4gICAgICBtZW1vcnlTaXplOiAxMjgsXG4gICAgICB0aW1lb3V0OiBEdXJhdGlvbi5taW51dGVzKDUpLFxuICAgICAgYXJjaGl0ZWN0dXJlOiBBcmNoaXRlY3R1cmUuQVJNXzY0LFxuICAgICAgZW52aXJvbm1lbnQ6IHtcbiAgICAgICAgTk9ERV9FTlY6ICdwcm9kdWN0aW9uJyxcbiAgICAgICAgRU5BQkxFX0xPR1M6IFN0cmluZyhwcm9wcz8uZW5hYmxlTG9ncyA/PyB0cnVlKSxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBuZXcgUnVsZSh0aGlzLCAnS2VlcEFjdGl2ZScsIHtcbiAgICAgIHNjaGVkdWxlOiBTY2hlZHVsZS5yYXRlKER1cmF0aW9uLmRheXMoMykpLFxuICAgICAgdGFyZ2V0czogW1xuICAgICAgICBuZXcgTGFtYmRhRnVuY3Rpb24oaGFuZGxlciwge1xuICAgICAgICAgIGV2ZW50OiBSdWxlVGFyZ2V0SW5wdXQuZnJvbU9iamVjdCh7XG4gICAgICAgICAgICBhY3Rpb246ICdsYW1iZGFLZWVwQWN0aXZlJyxcbiAgICAgICAgICB9KSxcbiAgICAgICAgfSksXG4gICAgICBdLFxuICAgIH0pO1xuXG4gICAgaGFuZGxlci5hZGRUb1JvbGVQb2xpY3koXG4gICAgICBuZXcgUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgYWN0aW9uczogWydsYW1iZGE6SW52b2tlRnVuY3Rpb24nLCAndGFnOkdldFJlc291cmNlcyddLFxuICAgICAgICByZXNvdXJjZXM6IFsnKiddLFxuICAgICAgICBlZmZlY3Q6IEVmZmVjdC5BTExPVyxcbiAgICAgIH0pLFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMga2VlcEFjdGl2ZShsYW1iZGE6IElGdW5jdGlvbikge1xuICAgIFRhZ3Mub2YobGFtYmRhKS5hZGQoJ2tlZXBBY3RpdmUnLCAndHJ1ZScpO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,13 @@
1
+ import * as lambda from 'aws-cdk-lib/aws-lambda';
2
+ import { Construct } from 'constructs';
3
+ /**
4
+ * Props for HandlerFunction
5
+ */
6
+ export interface HandlerFunctionProps extends lambda.FunctionOptions {
7
+ }
8
+ /**
9
+ * An AWS Lambda function which executes src/handler.
10
+ */
11
+ export declare class HandlerFunction extends lambda.Function {
12
+ constructor(scope: Construct, id: string, props?: HandlerFunctionProps);
13
+ }
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.HandlerFunction = void 0;
4
+ // ~~ Generated by projen. To modify, edit .projenrc.ts and run "npx projen".
5
+ const path = require("path");
6
+ const lambda = require("aws-cdk-lib/aws-lambda");
7
+ /**
8
+ * An AWS Lambda function which executes src/handler.
9
+ */
10
+ class HandlerFunction extends lambda.Function {
11
+ constructor(scope, id, props) {
12
+ super(scope, id, {
13
+ description: 'src/handler.lambda.ts',
14
+ ...props,
15
+ runtime: new lambda.Runtime('nodejs24.x', lambda.RuntimeFamily.NODEJS),
16
+ handler: 'index.handler',
17
+ code: lambda.Code.fromAsset(path.join(__dirname, '../assets/handler.lambda')),
18
+ });
19
+ this.addEnvironment('AWS_NODEJS_CONNECTION_REUSE_ENABLED', '1', { removeInEdge: true });
20
+ }
21
+ }
22
+ exports.HandlerFunction = HandlerFunction;
23
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGFuZGxlci1mdW5jdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9oYW5kbGVyLWZ1bmN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDZFQUE2RTtBQUM3RSw2QkFBNkI7QUFDN0IsaURBQWlEO0FBU2pEOztHQUVHO0FBQ0gsTUFBYSxlQUFnQixTQUFRLE1BQU0sQ0FBQyxRQUFRO0lBQ2xELFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBNEI7UUFDcEUsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUU7WUFDZixXQUFXLEVBQUUsdUJBQXVCO1lBQ3BDLEdBQUcsS0FBSztZQUNSLE9BQU8sRUFBRSxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLE1BQU0sQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDO1lBQ3RFLE9BQU8sRUFBRSxlQUFlO1lBQ3hCLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSwwQkFBMEIsQ0FBQyxDQUFDO1NBQzlFLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxjQUFjLENBQUMscUNBQXFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDMUYsQ0FBQztDQUNGO0FBWEQsMENBV0MiLCJzb3VyY2VzQ29udGVudCI6WyIvLyB+fiBHZW5lcmF0ZWQgYnkgcHJvamVuLiBUbyBtb2RpZnksIGVkaXQgLnByb2plbnJjLnRzIGFuZCBydW4gXCJucHggcHJvamVuXCIuXG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0ICogYXMgbGFtYmRhIGZyb20gJ2F3cy1jZGstbGliL2F3cy1sYW1iZGEnO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5cbi8qKlxuICogUHJvcHMgZm9yIEhhbmRsZXJGdW5jdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIEhhbmRsZXJGdW5jdGlvblByb3BzIGV4dGVuZHMgbGFtYmRhLkZ1bmN0aW9uT3B0aW9ucyB7XG59XG5cbi8qKlxuICogQW4gQVdTIExhbWJkYSBmdW5jdGlvbiB3aGljaCBleGVjdXRlcyBzcmMvaGFuZGxlci5cbiAqL1xuZXhwb3J0IGNsYXNzIEhhbmRsZXJGdW5jdGlvbiBleHRlbmRzIGxhbWJkYS5GdW5jdGlvbiB7XG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzPzogSGFuZGxlckZ1bmN0aW9uUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQsIHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnc3JjL2hhbmRsZXIubGFtYmRhLnRzJyxcbiAgICAgIC4uLnByb3BzLFxuICAgICAgcnVudGltZTogbmV3IGxhbWJkYS5SdW50aW1lKCdub2RlanMyNC54JywgbGFtYmRhLlJ1bnRpbWVGYW1pbHkuTk9ERUpTKSxcbiAgICAgIGhhbmRsZXI6ICdpbmRleC5oYW5kbGVyJyxcbiAgICAgIGNvZGU6IGxhbWJkYS5Db2RlLmZyb21Bc3NldChwYXRoLmpvaW4oX19kaXJuYW1lLCAnLi4vYXNzZXRzL2hhbmRsZXIubGFtYmRhJykpLFxuICAgIH0pO1xuICAgIHRoaXMuYWRkRW52aXJvbm1lbnQoJ0FXU19OT0RFSlNfQ09OTkVDVElPTl9SRVVTRV9FTkFCTEVEJywgJzEnLCB7IHJlbW92ZUluRWRnZTogdHJ1ZSB9KTtcbiAgfVxufSJdfQ==
@@ -0,0 +1,3 @@
1
+ export declare const handler: (event: {
2
+ action: "lambdaKeepActive";
3
+ }) => Promise<void>;
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.handler = void 0;
4
+ const client_lambda_1 = require("@aws-sdk/client-lambda");
5
+ const client_resource_groups_tagging_api_1 = require("@aws-sdk/client-resource-groups-tagging-api");
6
+ const shared_1 = require("./shared");
7
+ const lambdaClient = new client_lambda_1.LambdaClient();
8
+ const taggingClient = new client_resource_groups_tagging_api_1.ResourceGroupsTaggingAPIClient();
9
+ const enableLogs = process.env.ENABLE_LOGS === 'true';
10
+ const handler = async (event) => {
11
+ const { action } = event;
12
+ if (action == null)
13
+ return;
14
+ if (action !== 'lambdaKeepActive')
15
+ return;
16
+ let nextToken;
17
+ do {
18
+ const { ResourceTagMappingList = [], PaginationToken } = await taggingClient.send(new client_resource_groups_tagging_api_1.GetResourcesCommand({
19
+ ResourceTypeFilters: ['lambda:function'],
20
+ ResourcesPerPage: 25,
21
+ TagFilters: [{ Key: 'keepActive', Values: ['true'] }],
22
+ PaginationToken: nextToken,
23
+ }));
24
+ nextToken = PaginationToken;
25
+ await Promise.all(ResourceTagMappingList.map(async (resource) => {
26
+ await lambdaClient.send(new client_lambda_1.InvokeCommand({
27
+ FunctionName: resource.ResourceARN,
28
+ InvocationType: 'Event',
29
+ Payload: JSON.stringify({ [shared_1.keepActivePing]: true }),
30
+ }));
31
+ if (enableLogs) {
32
+ console.info(`Invoked ${resource.ResourceARN}`);
33
+ }
34
+ }));
35
+ } while (nextToken != null && nextToken !== '');
36
+ };
37
+ exports.handler = handler;
38
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGFuZGxlci5sYW1iZGEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaGFuZGxlci5sYW1iZGEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsMERBQXFFO0FBQ3JFLG9HQUdxRDtBQUNyRCxxQ0FBMEM7QUFFMUMsTUFBTSxZQUFZLEdBQUcsSUFBSSw0QkFBWSxFQUFFLENBQUM7QUFDeEMsTUFBTSxhQUFhLEdBQUcsSUFBSSxtRUFBOEIsRUFBRSxDQUFDO0FBQzNELE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsV0FBVyxLQUFLLE1BQU0sQ0FBQztBQUUvQyxNQUFNLE9BQU8sR0FBRyxLQUFLLEVBQUUsS0FBcUMsRUFBRSxFQUFFO0lBQ3JFLE1BQU0sRUFBRSxNQUFNLEVBQUUsR0FBRyxLQUFLLENBQUM7SUFFekIsSUFBSSxNQUFNLElBQUksSUFBSTtRQUFFLE9BQU87SUFDM0IsSUFBSSxNQUFNLEtBQUssa0JBQWtCO1FBQUUsT0FBTztJQUUxQyxJQUFJLFNBQTZCLENBQUM7SUFDbEMsR0FBRyxDQUFDO1FBQ0YsTUFBTSxFQUFFLHNCQUFzQixHQUFHLEVBQUUsRUFBRSxlQUFlLEVBQUUsR0FDcEQsTUFBTSxhQUFhLENBQUMsSUFBSSxDQUN0QixJQUFJLHdEQUFtQixDQUFDO1lBQ3RCLG1CQUFtQixFQUFFLENBQUMsaUJBQWlCLENBQUM7WUFDeEMsZ0JBQWdCLEVBQUUsRUFBRTtZQUNwQixVQUFVLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztZQUNyRCxlQUFlLEVBQUUsU0FBUztTQUMzQixDQUFDLENBQ0gsQ0FBQztRQUVKLFNBQVMsR0FBRyxlQUFlLENBQUM7UUFFNUIsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUNmLHNCQUFzQixDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLEVBQUU7WUFDNUMsTUFBTSxZQUFZLENBQUMsSUFBSSxDQUNyQixJQUFJLDZCQUFhLENBQUM7Z0JBQ2hCLFlBQVksRUFBRSxRQUFRLENBQUMsV0FBVztnQkFDbEMsY0FBYyxFQUFFLE9BQU87Z0JBQ3ZCLE9BQU8sRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyx1QkFBYyxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUM7YUFDcEQsQ0FBQyxDQUNILENBQUM7WUFFRixJQUFJLFVBQVUsRUFBRSxDQUFDO2dCQUNmLE9BQU8sQ0FBQyxJQUFJLENBQUMsV0FBVyxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztZQUNsRCxDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQ0gsQ0FBQztJQUNKLENBQUMsUUFBUSxTQUFTLElBQUksSUFBSSxJQUFJLFNBQVMsS0FBSyxFQUFFLEVBQUU7QUFDbEQsQ0FBQyxDQUFDO0FBcENXLFFBQUEsT0FBTyxXQW9DbEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbnZva2VDb21tYW5kLCBMYW1iZGFDbGllbnQgfSBmcm9tICdAYXdzLXNkay9jbGllbnQtbGFtYmRhJztcbmltcG9ydCB7XG4gIEdldFJlc291cmNlc0NvbW1hbmQsXG4gIFJlc291cmNlR3JvdXBzVGFnZ2luZ0FQSUNsaWVudCxcbn0gZnJvbSAnQGF3cy1zZGsvY2xpZW50LXJlc291cmNlLWdyb3Vwcy10YWdnaW5nLWFwaSc7XG5pbXBvcnQgeyBrZWVwQWN0aXZlUGluZyB9IGZyb20gJy4vc2hhcmVkJztcblxuY29uc3QgbGFtYmRhQ2xpZW50ID0gbmV3IExhbWJkYUNsaWVudCgpO1xuY29uc3QgdGFnZ2luZ0NsaWVudCA9IG5ldyBSZXNvdXJjZUdyb3Vwc1RhZ2dpbmdBUElDbGllbnQoKTtcbmNvbnN0IGVuYWJsZUxvZ3MgPSBwcm9jZXNzLmVudi5FTkFCTEVfTE9HUyA9PT0gJ3RydWUnO1xuXG5leHBvcnQgY29uc3QgaGFuZGxlciA9IGFzeW5jIChldmVudDogeyBhY3Rpb246ICdsYW1iZGFLZWVwQWN0aXZlJyB9KSA9PiB7XG4gIGNvbnN0IHsgYWN0aW9uIH0gPSBldmVudDtcblxuICBpZiAoYWN0aW9uID09IG51bGwpIHJldHVybjtcbiAgaWYgKGFjdGlvbiAhPT0gJ2xhbWJkYUtlZXBBY3RpdmUnKSByZXR1cm47XG5cbiAgbGV0IG5leHRUb2tlbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBkbyB7XG4gICAgY29uc3QgeyBSZXNvdXJjZVRhZ01hcHBpbmdMaXN0ID0gW10sIFBhZ2luYXRpb25Ub2tlbiB9ID1cbiAgICAgIGF3YWl0IHRhZ2dpbmdDbGllbnQuc2VuZChcbiAgICAgICAgbmV3IEdldFJlc291cmNlc0NvbW1hbmQoe1xuICAgICAgICAgIFJlc291cmNlVHlwZUZpbHRlcnM6IFsnbGFtYmRhOmZ1bmN0aW9uJ10sXG4gICAgICAgICAgUmVzb3VyY2VzUGVyUGFnZTogMjUsXG4gICAgICAgICAgVGFnRmlsdGVyczogW3sgS2V5OiAna2VlcEFjdGl2ZScsIFZhbHVlczogWyd0cnVlJ10gfV0sXG4gICAgICAgICAgUGFnaW5hdGlvblRva2VuOiBuZXh0VG9rZW4sXG4gICAgICAgIH0pLFxuICAgICAgKTtcblxuICAgIG5leHRUb2tlbiA9IFBhZ2luYXRpb25Ub2tlbjtcblxuICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgUmVzb3VyY2VUYWdNYXBwaW5nTGlzdC5tYXAoYXN5bmMgKHJlc291cmNlKSA9PiB7XG4gICAgICAgIGF3YWl0IGxhbWJkYUNsaWVudC5zZW5kKFxuICAgICAgICAgIG5ldyBJbnZva2VDb21tYW5kKHtcbiAgICAgICAgICAgIEZ1bmN0aW9uTmFtZTogcmVzb3VyY2UuUmVzb3VyY2VBUk4sXG4gICAgICAgICAgICBJbnZvY2F0aW9uVHlwZTogJ0V2ZW50JyxcbiAgICAgICAgICAgIFBheWxvYWQ6IEpTT04uc3RyaW5naWZ5KHsgW2tlZXBBY3RpdmVQaW5nXTogdHJ1ZSB9KSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoZW5hYmxlTG9ncykge1xuICAgICAgICAgIGNvbnNvbGUuaW5mbyhgSW52b2tlZCAke3Jlc291cmNlLlJlc291cmNlQVJOfWApO1xuICAgICAgICB9XG4gICAgICB9KSxcbiAgICApO1xuICB9IHdoaWxlIChuZXh0VG9rZW4gIT0gbnVsbCAmJiBuZXh0VG9rZW4gIT09ICcnKTtcbn07XG4iXX0=
package/lib/index.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ export * from './cdk';
2
+ export * from './runtime';
package/lib/index.js ADDED
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./cdk"), exports);
18
+ __exportStar(require("./runtime"), exports);
19
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLHdDQUFzQjtBQUN0Qiw0Q0FBMEIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL2Nkayc7XG5leHBvcnQgKiBmcm9tICcuL3J1bnRpbWUnO1xuIl19
@@ -1,14 +1,11 @@
1
- // Generated by dts-bundle-generator v9.5.1
2
-
3
- export interface KeptActiveOptions {
4
- /**
5
- * If disabled no logs are logged to CloudWatch
6
- *
7
- * @default true
8
- */
9
- readonly enableLogs?: boolean;
1
+ interface KeptActiveOptions {
2
+ /**
3
+ * If disabled no logs are logged to CloudWatch
4
+ *
5
+ * @default true
6
+ */
7
+ readonly enableLogs?: boolean;
10
8
  }
11
9
  export declare function keptActive<Event = any, Context = any, Response = any>(handler: (event: Event, context: Context) => Promise<Response>, options?: KeptActiveOptions): (event: Event, context: Context) => Promise<Response> | undefined;
12
10
  export declare function keptActiveFetch(fetch: (request: Request) => Promise<Response>, options?: KeptActiveOptions): (request: Request) => Promise<Response>;
13
-
14
11
  export {};
package/lib/runtime.js ADDED
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.keptActive = keptActive;
4
+ exports.keptActiveFetch = keptActiveFetch;
5
+ const shared_1 = require("./shared");
6
+ function keptActive(handler, options) {
7
+ return (event, context) => {
8
+ if (event != null &&
9
+ typeof event === 'object' &&
10
+ shared_1.keepActivePing in event &&
11
+ event[shared_1.keepActivePing] === true) {
12
+ if (options?.enableLogs) {
13
+ console.info(`Keep active ping: ${JSON.stringify(event)}`);
14
+ }
15
+ return;
16
+ }
17
+ return handler(event, context);
18
+ };
19
+ }
20
+ function keptActiveFetch(fetch, options) {
21
+ return async (request) => {
22
+ if (request.url === 'https://lambda/') {
23
+ const event = await request.json();
24
+ if (event != null &&
25
+ typeof event === 'object' &&
26
+ shared_1.keepActivePing in event &&
27
+ event[shared_1.keepActivePing] === true) {
28
+ if (options?.enableLogs) {
29
+ console.info(`Keep active ping: ${JSON.stringify(event)}`);
30
+ }
31
+ return new Response();
32
+ }
33
+ return fetch(new Request(request.url, {
34
+ method: request.method,
35
+ body: JSON.stringify(event),
36
+ headers: request.headers,
37
+ }));
38
+ }
39
+ return fetch(request);
40
+ };
41
+ }
42
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVudGltZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9ydW50aW1lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBV0EsZ0NBbUJDO0FBRUQsMENBK0JDO0FBL0RELHFDQUEwQztBQVcxQyxTQUFnQixVQUFVLENBQ3hCLE9BQThELEVBQzlELE9BQTJCO0lBRTNCLE9BQU8sQ0FBQyxLQUFZLEVBQUUsT0FBZ0IsRUFBRSxFQUFFO1FBQ3hDLElBQ0UsS0FBSyxJQUFJLElBQUk7WUFDYixPQUFPLEtBQUssS0FBSyxRQUFRO1lBQ3pCLHVCQUFjLElBQUksS0FBSztZQUN2QixLQUFLLENBQUMsdUJBQWMsQ0FBQyxLQUFLLElBQUksRUFDOUIsQ0FBQztZQUNELElBQUksT0FBTyxFQUFFLFVBQVUsRUFBRSxDQUFDO2dCQUN4QixPQUFPLENBQUMsSUFBSSxDQUFDLHFCQUFxQixJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUM3RCxDQUFDO1lBQ0QsT0FBTztRQUNULENBQUM7UUFFRCxPQUFPLE9BQU8sQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDakMsQ0FBQyxDQUFDO0FBQ0osQ0FBQztBQUVELFNBQWdCLGVBQWUsQ0FDN0IsS0FBOEMsRUFDOUMsT0FBMkI7SUFFM0IsT0FBTyxLQUFLLEVBQUUsT0FBZ0IsRUFBRSxFQUFFO1FBQ2hDLElBQUksT0FBTyxDQUFDLEdBQUcsS0FBSyxpQkFBaUIsRUFBRSxDQUFDO1lBQ3RDLE1BQU0sS0FBSyxHQUFHLE1BQU0sT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDO1lBRW5DLElBQ0UsS0FBSyxJQUFJLElBQUk7Z0JBQ2IsT0FBTyxLQUFLLEtBQUssUUFBUTtnQkFDekIsdUJBQWMsSUFBSSxLQUFLO2dCQUN2QixLQUFLLENBQUMsdUJBQWMsQ0FBQyxLQUFLLElBQUksRUFDOUIsQ0FBQztnQkFDRCxJQUFJLE9BQU8sRUFBRSxVQUFVLEVBQUUsQ0FBQztvQkFDeEIsT0FBTyxDQUFDLElBQUksQ0FBQyxxQkFBcUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQzdELENBQUM7Z0JBQ0QsT0FBTyxJQUFJLFFBQVEsRUFBRSxDQUFDO1lBQ3hCLENBQUM7WUFFRCxPQUFPLEtBQUssQ0FDVixJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFO2dCQUN2QixNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU07Z0JBQ3RCLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQztnQkFDM0IsT0FBTyxFQUFFLE9BQU8sQ0FBQyxPQUFPO2FBQ3pCLENBQUMsQ0FDSCxDQUFDO1FBQ0osQ0FBQztRQUVELE9BQU8sS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3hCLENBQUMsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBrZWVwQWN0aXZlUGluZyB9IGZyb20gJy4vc2hhcmVkJztcblxuaW50ZXJmYWNlIEtlcHRBY3RpdmVPcHRpb25zIHtcbiAgLyoqXG4gICAqIElmIGRpc2FibGVkIG5vIGxvZ3MgYXJlIGxvZ2dlZCB0byBDbG91ZFdhdGNoXG4gICAqXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIHJlYWRvbmx5IGVuYWJsZUxvZ3M/OiBib29sZWFuO1xufVxuXG5leHBvcnQgZnVuY3Rpb24ga2VwdEFjdGl2ZTxFdmVudCA9IGFueSwgQ29udGV4dCA9IGFueSwgUmVzcG9uc2UgPSBhbnk+KFxuICBoYW5kbGVyOiAoZXZlbnQ6IEV2ZW50LCBjb250ZXh0OiBDb250ZXh0KSA9PiBQcm9taXNlPFJlc3BvbnNlPixcbiAgb3B0aW9ucz86IEtlcHRBY3RpdmVPcHRpb25zLFxuKSB7XG4gIHJldHVybiAoZXZlbnQ6IEV2ZW50LCBjb250ZXh0OiBDb250ZXh0KSA9PiB7XG4gICAgaWYgKFxuICAgICAgZXZlbnQgIT0gbnVsbCAmJlxuICAgICAgdHlwZW9mIGV2ZW50ID09PSAnb2JqZWN0JyAmJlxuICAgICAga2VlcEFjdGl2ZVBpbmcgaW4gZXZlbnQgJiZcbiAgICAgIGV2ZW50W2tlZXBBY3RpdmVQaW5nXSA9PT0gdHJ1ZVxuICAgICkge1xuICAgICAgaWYgKG9wdGlvbnM/LmVuYWJsZUxvZ3MpIHtcbiAgICAgICAgY29uc29sZS5pbmZvKGBLZWVwIGFjdGl2ZSBwaW5nOiAke0pTT04uc3RyaW5naWZ5KGV2ZW50KX1gKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICByZXR1cm4gaGFuZGxlcihldmVudCwgY29udGV4dCk7XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBrZXB0QWN0aXZlRmV0Y2goXG4gIGZldGNoOiAocmVxdWVzdDogUmVxdWVzdCkgPT4gUHJvbWlzZTxSZXNwb25zZT4sXG4gIG9wdGlvbnM/OiBLZXB0QWN0aXZlT3B0aW9ucyxcbikge1xuICByZXR1cm4gYXN5bmMgKHJlcXVlc3Q6IFJlcXVlc3QpID0+IHtcbiAgICBpZiAocmVxdWVzdC51cmwgPT09ICdodHRwczovL2xhbWJkYS8nKSB7XG4gICAgICBjb25zdCBldmVudCA9IGF3YWl0IHJlcXVlc3QuanNvbigpO1xuXG4gICAgICBpZiAoXG4gICAgICAgIGV2ZW50ICE9IG51bGwgJiZcbiAgICAgICAgdHlwZW9mIGV2ZW50ID09PSAnb2JqZWN0JyAmJlxuICAgICAgICBrZWVwQWN0aXZlUGluZyBpbiBldmVudCAmJlxuICAgICAgICBldmVudFtrZWVwQWN0aXZlUGluZ10gPT09IHRydWVcbiAgICAgICkge1xuICAgICAgICBpZiAob3B0aW9ucz8uZW5hYmxlTG9ncykge1xuICAgICAgICAgIGNvbnNvbGUuaW5mbyhgS2VlcCBhY3RpdmUgcGluZzogJHtKU09OLnN0cmluZ2lmeShldmVudCl9YCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBSZXNwb25zZSgpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZmV0Y2goXG4gICAgICAgIG5ldyBSZXF1ZXN0KHJlcXVlc3QudXJsLCB7XG4gICAgICAgICAgbWV0aG9kOiByZXF1ZXN0Lm1ldGhvZCxcbiAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShldmVudCksXG4gICAgICAgICAgaGVhZGVyczogcmVxdWVzdC5oZWFkZXJzLFxuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZldGNoKHJlcXVlc3QpO1xuICB9O1xufVxuIl19
@@ -0,0 +1 @@
1
+ export declare const keepActivePing = "$$keepActivePing$$";
package/lib/shared.js ADDED
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.keepActivePing = void 0;
4
+ exports.keepActivePing = '$$keepActivePing$$';
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2hhcmVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3NoYXJlZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBYSxRQUFBLGNBQWMsR0FBRyxvQkFBb0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjb25zdCBrZWVwQWN0aXZlUGluZyA9ICckJGtlZXBBY3RpdmVQaW5nJCQnO1xuIl19
package/package.json CHANGED
@@ -1,40 +1,141 @@
1
1
  {
2
2
  "name": "@beesolve/lambda-keep-active",
3
- "version": "1.0.5",
4
- "type": "module",
5
- "scripts": {
6
- "prepublishOnly": "bun run build.ts"
3
+ "description": "CDK construct which prevents your Lambda functions to transition into `inactive` state.",
4
+ "repository": {
5
+ "type": "git",
6
+ "url": "https://github.com/beesolve/lambda-keep-active"
7
7
  },
8
- "dependencies": {
9
- "@aws-sdk/client-lambda": "^3.936.0",
10
- "@aws-sdk/client-resource-groups-tagging-api": "^3.936.0",
11
- "aws-cdk": "^2.1033.0",
12
- "aws-cdk-lib": "^2.226.0",
13
- "constructs": "^10.4.3"
8
+ "scripts": {
9
+ "build": "npx projen build",
10
+ "bump": "npx projen bump",
11
+ "bundle": "npx projen bundle",
12
+ "bundle:handler.lambda": "npx projen bundle:handler.lambda",
13
+ "bundle:handler.lambda:watch": "npx projen bundle:handler.lambda:watch",
14
+ "clobber": "npx projen clobber",
15
+ "compat": "npx projen compat",
16
+ "compile": "npx projen compile",
17
+ "default": "npx projen default",
18
+ "docgen": "npx projen docgen",
19
+ "eject": "npx projen eject",
20
+ "eslint": "npx projen eslint",
21
+ "package": "npx projen package",
22
+ "package-all": "npx projen package-all",
23
+ "package:js": "npx projen package:js",
24
+ "post-compile": "npx projen post-compile",
25
+ "post-upgrade": "npx projen post-upgrade",
26
+ "pre-compile": "npx projen pre-compile",
27
+ "publish:git": "npx projen publish:git",
28
+ "release": "npx projen release",
29
+ "test": "npx projen test",
30
+ "test:watch": "npx projen test:watch",
31
+ "unbump": "npx projen unbump",
32
+ "upgrade": "npx projen upgrade",
33
+ "watch": "npx projen watch",
34
+ "projen": "npx projen"
14
35
  },
15
- "peerDependencies": {
16
- "typescript": "^5.9.3"
36
+ "author": {
37
+ "name": "BeeSolve s.r.o.",
38
+ "email": "support@beesolve.com",
39
+ "organization": true
17
40
  },
18
41
  "devDependencies": {
19
- "@types/aws-lambda": "^8.10.159",
20
- "@types/bun": "^1.3.2",
42
+ "@aws-sdk/client-lambda": "^3.943.0",
43
+ "@aws-sdk/client-resource-groups-tagging-api": "^3.943.0",
44
+ "@stylistic/eslint-plugin": "^2",
45
+ "@types/jest": "^30.0.0",
21
46
  "@types/node": "^24.10.1",
22
- "bun-plugin-dts": "^0.3.0"
23
- },
24
- "exports": {
25
- "./cdk": {
26
- "types": "./dist/cdk.d.ts",
27
- "import": "./dist/cdk.js"
28
- },
29
- "./runtime": {
30
- "types": "./dist/runtime.d.ts",
31
- "import": "./dist/runtime.js"
32
- }
47
+ "@typescript-eslint/eslint-plugin": "^8",
48
+ "@typescript-eslint/parser": "^8",
49
+ "aws-cdk-lib": "2.231.0",
50
+ "commit-and-tag-version": "^12",
51
+ "constructs": "10.4.3",
52
+ "esbuild": "^0.27.0",
53
+ "eslint": "^9",
54
+ "eslint-import-resolver-typescript": "^4.4.4",
55
+ "eslint-plugin-import": "^2.32.0",
56
+ "jest": "^30.2.0",
57
+ "jest-junit": "^16",
58
+ "jsii": "~5.9.0",
59
+ "jsii-diff": "^1.120.0",
60
+ "jsii-docgen": "^10.5.0",
61
+ "jsii-pacmak": "^1.120.0",
62
+ "jsii-rosetta": "~5.9.0",
63
+ "projen": "^0.98.28",
64
+ "ts-jest": "^29.4.6",
65
+ "ts-node": "^10.9.2",
66
+ "typescript": "^5.9.3",
67
+ "yaml": "^2.8.1"
68
+ },
69
+ "peerDependencies": {
70
+ "aws-cdk-lib": "^2.231.0",
71
+ "constructs": "^10.4.3"
33
72
  },
34
- "files": [
35
- "dist"
73
+ "keywords": [
74
+ "cdk"
36
75
  ],
76
+ "main": "lib/index.js",
77
+ "license": "Apache-2.0",
78
+ "publishConfig": {
79
+ "access": "public"
80
+ },
81
+ "version": "1.1.1",
82
+ "jest": {
83
+ "coverageProvider": "v8",
84
+ "testMatch": [
85
+ "<rootDir>/@(src|test)/**/*(*.)@(spec|test).ts?(x)",
86
+ "<rootDir>/@(src|test)/**/__tests__/**/*.ts?(x)",
87
+ "<rootDir>/@(projenrc)/**/*(*.)@(spec|test).ts?(x)",
88
+ "<rootDir>/@(projenrc)/**/__tests__/**/*.ts?(x)"
89
+ ],
90
+ "clearMocks": true,
91
+ "collectCoverage": true,
92
+ "coverageReporters": [
93
+ "json",
94
+ "lcov",
95
+ "clover",
96
+ "cobertura",
97
+ "text"
98
+ ],
99
+ "coverageDirectory": "coverage",
100
+ "coveragePathIgnorePatterns": [
101
+ "/node_modules/"
102
+ ],
103
+ "testPathIgnorePatterns": [
104
+ "/node_modules/"
105
+ ],
106
+ "watchPathIgnorePatterns": [
107
+ "/node_modules/"
108
+ ],
109
+ "reporters": [
110
+ "default",
111
+ [
112
+ "jest-junit",
113
+ {
114
+ "outputDirectory": "test-reports"
115
+ }
116
+ ]
117
+ ],
118
+ "transform": {
119
+ "^.+\\.[t]sx?$": [
120
+ "ts-jest",
121
+ {
122
+ "tsconfig": "tsconfig.dev.json"
123
+ }
124
+ ]
125
+ }
126
+ },
127
+ "types": "lib/index.d.ts",
128
+ "stability": "stable",
129
+ "jsii": {
130
+ "outdir": "dist",
131
+ "targets": {},
132
+ "tsc": {
133
+ "outDir": "lib",
134
+ "rootDir": "src"
135
+ }
136
+ },
37
137
  "volta": {
38
138
  "node": "24.11.1"
39
- }
139
+ },
140
+ "//": "~~ Generated by projen. To modify, edit .projenrc.ts and run \"npx projen\"."
40
141
  }
package/dist/cdk.d.ts DELETED
@@ -1,19 +0,0 @@
1
- // Generated by dts-bundle-generator v9.5.1
2
-
3
- import { IFunction } from 'aws-cdk-lib/aws-lambda';
4
- import { Construct } from 'constructs';
5
-
6
- export interface LambdaKeepActiveProps {
7
- /**
8
- * If disabled no logs are logged to CloudWatch
9
- *
10
- * @default true
11
- */
12
- readonly enableLogs?: boolean;
13
- }
14
- export declare class LambdaKeepActive extends Construct {
15
- constructor(scope: Construct, id: string, props?: LambdaKeepActiveProps);
16
- readonly keepActive: (lambda: IFunction) => void;
17
- }
18
-
19
- export {};
package/dist/cdk.js DELETED
@@ -1,4 +0,0 @@
1
- import{Duration as z,Tags as H}from"aws-cdk-lib";import{Rule as J,RuleTargetInput as K,Schedule as M}from"aws-cdk-lib/aws-events";import{LambdaFunction as O}from"aws-cdk-lib/aws-events-targets";import{Effect as Q,PolicyStatement as V}from"aws-cdk-lib/aws-iam";import{Architecture as X,Code as Y,Runtime as Z}from"aws-cdk-lib/aws-lambda";import{NodejsFunction as $}from"aws-cdk-lib/aws-lambda-nodejs";import{Construct as y}from"constructs";import{dirname as A}from"node:path";import{fileURLToPath as E}from"node:url";var N=E(import.meta.url),U=A(N);class W extends y{constructor(q,B,G){super(q,B);let x=new $(this,"LambdaKeepActive",{description:"LambdaKeepActive handler",code:Y.fromAsset(`${U}/lambda`),handler:"handler.handler",memorySize:128,timeout:z.minutes(5),runtime:Z.NODEJS_22_X,architecture:X.ARM_64,environment:{NODE_ENV:"production",ENABLE_LOGS:String(G?.enableLogs??!0)}});new J(this,"KeepActive",{schedule:M.rate(z.days(3)),targets:[new O(x,{event:K.fromObject({action:"lambdaKeepActive"})})]}),x.addToRolePolicy(new V({actions:["lambda:InvokeFunction","tag:GetResources"],resources:["*"],effect:Q.ALLOW}))}keepActive=(q)=>{H.of(q).add("keepActive","true")}}export{W as LambdaKeepActive};
2
-
3
- //# debugId=6B40CA4DD0371D9764756E2164756E21
4
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vY2RrLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWwogICAgImltcG9ydCB7IER1cmF0aW9uLCBUYWdzIH0gZnJvbSBcImF3cy1jZGstbGliXCI7XG5pbXBvcnQgeyBSdWxlLCBSdWxlVGFyZ2V0SW5wdXQsIFNjaGVkdWxlIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1ldmVudHNcIjtcbmltcG9ydCB7IExhbWJkYUZ1bmN0aW9uIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1ldmVudHMtdGFyZ2V0c1wiO1xuaW1wb3J0IHsgRWZmZWN0LCBQb2xpY3lTdGF0ZW1lbnQgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWlhbVwiO1xuaW1wb3J0IHR5cGUgeyBJRnVuY3Rpb24gfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWxhbWJkYVwiO1xuaW1wb3J0IHsgQXJjaGl0ZWN0dXJlLCBDb2RlLCBSdW50aW1lIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1sYW1iZGFcIjtcbmltcG9ydCB7IE5vZGVqc0Z1bmN0aW9uIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1sYW1iZGEtbm9kZWpzXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuaW1wb3J0IHsgZGlybmFtZSB9IGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB7IGZpbGVVUkxUb1BhdGggfSBmcm9tIFwibm9kZTp1cmxcIjtcblxuY29uc3QgX19maWxlbmFtZSA9IGZpbGVVUkxUb1BhdGgoaW1wb3J0Lm1ldGEudXJsKTtcbmNvbnN0IF9fZGlybmFtZSA9IGRpcm5hbWUoX19maWxlbmFtZSk7XG5cbmludGVyZmFjZSBMYW1iZGFLZWVwQWN0aXZlUHJvcHMge1xuICAvKipcbiAgICogSWYgZGlzYWJsZWQgbm8gbG9ncyBhcmUgbG9nZ2VkIHRvIENsb3VkV2F0Y2hcbiAgICpcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgcmVhZG9ubHkgZW5hYmxlTG9ncz86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBjbGFzcyBMYW1iZGFLZWVwQWN0aXZlIGV4dGVuZHMgQ29uc3RydWN0IHtcbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM/OiBMYW1iZGFLZWVwQWN0aXZlUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgY29uc3QgaGFuZGxlciA9IG5ldyBOb2RlanNGdW5jdGlvbih0aGlzLCBcIkxhbWJkYUtlZXBBY3RpdmVcIiwge1xuICAgICAgZGVzY3JpcHRpb246IFwiTGFtYmRhS2VlcEFjdGl2ZSBoYW5kbGVyXCIsXG4gICAgICBjb2RlOiBDb2RlLmZyb21Bc3NldChgJHtfX2Rpcm5hbWV9L2xhbWJkYWApLFxuICAgICAgaGFuZGxlcjogXCJoYW5kbGVyLmhhbmRsZXJcIixcbiAgICAgIG1lbW9yeVNpemU6IDEyOCxcbiAgICAgIHRpbWVvdXQ6IER1cmF0aW9uLm1pbnV0ZXMoNSksXG4gICAgICBydW50aW1lOiBSdW50aW1lLk5PREVKU18yMl9YLFxuICAgICAgYXJjaGl0ZWN0dXJlOiBBcmNoaXRlY3R1cmUuQVJNXzY0LFxuICAgICAgZW52aXJvbm1lbnQ6IHtcbiAgICAgICAgTk9ERV9FTlY6IFwicHJvZHVjdGlvblwiLFxuICAgICAgICBFTkFCTEVfTE9HUzogU3RyaW5nKHByb3BzPy5lbmFibGVMb2dzID8/IHRydWUpLFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIG5ldyBSdWxlKHRoaXMsIFwiS2VlcEFjdGl2ZVwiLCB7XG4gICAgICBzY2hlZHVsZTogU2NoZWR1bGUucmF0ZShEdXJhdGlvbi5kYXlzKDMpKSxcbiAgICAgIHRhcmdldHM6IFtcbiAgICAgICAgbmV3IExhbWJkYUZ1bmN0aW9uKGhhbmRsZXIsIHtcbiAgICAgICAgICBldmVudDogUnVsZVRhcmdldElucHV0LmZyb21PYmplY3Qoe1xuICAgICAgICAgICAgYWN0aW9uOiBcImxhbWJkYUtlZXBBY3RpdmVcIixcbiAgICAgICAgICB9KSxcbiAgICAgICAgfSksXG4gICAgICBdLFxuICAgIH0pO1xuXG4gICAgaGFuZGxlci5hZGRUb1JvbGVQb2xpY3koXG4gICAgICBuZXcgUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgYWN0aW9uczogW1wibGFtYmRhOkludm9rZUZ1bmN0aW9uXCIsIFwidGFnOkdldFJlc291cmNlc1wiXSxcbiAgICAgICAgcmVzb3VyY2VzOiBbXCIqXCJdLFxuICAgICAgICBlZmZlY3Q6IEVmZmVjdC5BTExPVyxcbiAgICAgIH0pLFxuICAgICk7XG4gIH1cblxuICByZWFkb25seSBrZWVwQWN0aXZlID0gKGxhbWJkYTogSUZ1bmN0aW9uKSA9PiB7XG4gICAgVGFncy5vZihsYW1iZGEpLmFkZChcImtlZXBBY3RpdmVcIiwgXCJ0cnVlXCIpO1xuICB9O1xufVxuIgogIF0sCiAgIm1hcHBpbmdzIjogIkFBQUEsbUJBQVMsVUFBVSxvQkFDbkIsZUFBUyxxQkFBTSxjQUFpQiwrQkFDaEMseUJBQVMsdUNBQ1QsaUJBQVMscUJBQVEsNEJBRWpCLHVCQUFTLFVBQWMsYUFBTSwrQkFDN0IseUJBQVMsc0NBQ1Qsb0JBQVMsbUJBQ1Qsa0JBQVMsa0JBQ1Qsd0JBQVMsaUJBRVQsSUFBTSxFQUFhLEVBQWMsWUFBWSxHQUFHLEVBQzFDLEVBQVksRUFBUSxDQUFVLEVBVzdCLE1BQU0sVUFBeUIsQ0FBVSxDQUM5QyxXQUFXLENBQUMsRUFBa0IsRUFBWSxFQUErQixDQUN2RSxNQUFNLEVBQU8sQ0FBRSxFQUVmLElBQU0sRUFBVSxJQUFJLEVBQWUsS0FBTSxtQkFBb0IsQ0FDM0QsWUFBYSwyQkFDYixLQUFNLEVBQUssVUFBVSxHQUFHLFVBQWtCLEVBQzFDLFFBQVMsa0JBQ1QsV0FBWSxJQUNaLFFBQVMsRUFBUyxRQUFRLENBQUMsRUFDM0IsUUFBUyxFQUFRLFlBQ2pCLGFBQWMsRUFBYSxPQUMzQixZQUFhLENBQ1gsU0FBVSxhQUNWLFlBQWEsT0FBTyxHQUFPLFlBQWMsRUFBSSxDQUMvQyxDQUNGLENBQUMsRUFFRCxJQUFJLEVBQUssS0FBTSxhQUFjLENBQzNCLFNBQVUsRUFBUyxLQUFLLEVBQVMsS0FBSyxDQUFDLENBQUMsRUFDeEMsUUFBUyxDQUNQLElBQUksRUFBZSxFQUFTLENBQzFCLE1BQU8sRUFBZ0IsV0FBVyxDQUNoQyxPQUFRLGtCQUNWLENBQUMsQ0FDSCxDQUFDLENBQ0gsQ0FDRixDQUFDLEVBRUQsRUFBUSxnQkFDTixJQUFJLEVBQWdCLENBQ2xCLFFBQVMsQ0FBQyx3QkFBeUIsa0JBQWtCLEVBQ3JELFVBQVcsQ0FBQyxHQUFHLEVBQ2YsT0FBUSxFQUFPLEtBQ2pCLENBQUMsQ0FDSCxFQUdPLFdBQWEsQ0FBQyxJQUFzQixDQUMzQyxFQUFLLEdBQUcsQ0FBTSxFQUFFLElBQUksYUFBYyxNQUFNLEVBRTVDIiwKICAiZGVidWdJZCI6ICI2QjQwQ0E0REQwMzcxRDk3NjQ3NTZFMjE2NDc1NkUyMSIsCiAgIm5hbWVzIjogW10KfQ==
@@ -1,4 +0,0 @@
1
- import{InvokeCommand as B,LambdaClient as D}from"@aws-sdk/client-lambda";import{GetResourcesCommand as E,ResourceGroupsTaggingAPIClient as F}from"@aws-sdk/client-resource-groups-tagging-api";var q="$$keepActivePing$$";var H=new D,J=new F,K=process.env.ENABLE_LOGS==="true",U=async(y)=>{let{action:f}=y;if(f==null)return;if(f!=="lambdaKeepActive")return;let $;do{let{ResourceTagMappingList:z=[],PaginationToken:A}=await J.send(new E({ResourceTypeFilters:["lambda:function"],ResourcesPerPage:25,TagFilters:[{Key:"keepActive",Values:["true"]}],PaginationToken:$}));$=A,await Promise.all(z.map(async(j)=>{if(await H.send(new B({FunctionName:j.ResourceARN,InvocationType:"Event",Payload:JSON.stringify({[q]:!0})})),K)console.info(`Invoked ${j.ResourceARN}`)}))}while($!=null&&$!=="")};export{U as handler};
2
-
3
- //# debugId=04DAB14BF39910A664756E2164756E21
4
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vaGFuZGxlci50cyIsICIuLi8uLi9zaGFyZWQudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbCiAgICAiaW1wb3J0IHsgSW52b2tlQ29tbWFuZCwgTGFtYmRhQ2xpZW50IH0gZnJvbSBcIkBhd3Mtc2RrL2NsaWVudC1sYW1iZGFcIjtcbmltcG9ydCB7XG4gIEdldFJlc291cmNlc0NvbW1hbmQsXG4gIFJlc291cmNlR3JvdXBzVGFnZ2luZ0FQSUNsaWVudCxcbn0gZnJvbSBcIkBhd3Mtc2RrL2NsaWVudC1yZXNvdXJjZS1ncm91cHMtdGFnZ2luZy1hcGlcIjtcbmltcG9ydCB7IGtlZXBBY3RpdmVQaW5nIH0gZnJvbSBcIi4vc2hhcmVkXCI7XG5cbmNvbnN0IGxhbWJkYUNsaWVudCA9IG5ldyBMYW1iZGFDbGllbnQoKTtcbmNvbnN0IHRhZ2dpbmdDbGllbnQgPSBuZXcgUmVzb3VyY2VHcm91cHNUYWdnaW5nQVBJQ2xpZW50KCk7XG5jb25zdCBlbmFibGVMb2dzID0gcHJvY2Vzcy5lbnYuRU5BQkxFX0xPR1MgPT09IFwidHJ1ZVwiO1xuXG5leHBvcnQgY29uc3QgaGFuZGxlciA9IGFzeW5jIChldmVudDogeyBhY3Rpb246IFwibGFtYmRhS2VlcEFjdGl2ZVwiIH0pID0+IHtcbiAgY29uc3QgeyBhY3Rpb24gfSA9IGV2ZW50O1xuXG4gIGlmIChhY3Rpb24gPT0gbnVsbCkgcmV0dXJuO1xuICBpZiAoYWN0aW9uICE9PSBcImxhbWJkYUtlZXBBY3RpdmVcIikgcmV0dXJuO1xuXG4gIGxldCBuZXh0VG9rZW46IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgZG8ge1xuICAgIGNvbnN0IHsgUmVzb3VyY2VUYWdNYXBwaW5nTGlzdCA9IFtdLCBQYWdpbmF0aW9uVG9rZW4gfSA9XG4gICAgICBhd2FpdCB0YWdnaW5nQ2xpZW50LnNlbmQoXG4gICAgICAgIG5ldyBHZXRSZXNvdXJjZXNDb21tYW5kKHtcbiAgICAgICAgICBSZXNvdXJjZVR5cGVGaWx0ZXJzOiBbXCJsYW1iZGE6ZnVuY3Rpb25cIl0sXG4gICAgICAgICAgUmVzb3VyY2VzUGVyUGFnZTogMjUsXG4gICAgICAgICAgVGFnRmlsdGVyczogW3sgS2V5OiBcImtlZXBBY3RpdmVcIiwgVmFsdWVzOiBbXCJ0cnVlXCJdIH1dLFxuICAgICAgICAgIFBhZ2luYXRpb25Ub2tlbjogbmV4dFRva2VuLFxuICAgICAgICB9KSxcbiAgICAgICk7XG5cbiAgICBuZXh0VG9rZW4gPSBQYWdpbmF0aW9uVG9rZW47XG5cbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIFJlc291cmNlVGFnTWFwcGluZ0xpc3QubWFwKGFzeW5jIChyZXNvdXJjZSkgPT4ge1xuICAgICAgICBhd2FpdCBsYW1iZGFDbGllbnQuc2VuZChcbiAgICAgICAgICBuZXcgSW52b2tlQ29tbWFuZCh7XG4gICAgICAgICAgICBGdW5jdGlvbk5hbWU6IHJlc291cmNlLlJlc291cmNlQVJOLFxuICAgICAgICAgICAgSW52b2NhdGlvblR5cGU6IFwiRXZlbnRcIixcbiAgICAgICAgICAgIFBheWxvYWQ6IEpTT04uc3RyaW5naWZ5KHsgW2tlZXBBY3RpdmVQaW5nXTogdHJ1ZSB9KSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoZW5hYmxlTG9ncykge1xuICAgICAgICAgIGNvbnNvbGUuaW5mbyhgSW52b2tlZCAke3Jlc291cmNlLlJlc291cmNlQVJOfWApO1xuICAgICAgICB9XG4gICAgICB9KSxcbiAgICApO1xuICB9IHdoaWxlIChuZXh0VG9rZW4gIT0gbnVsbCAmJiBuZXh0VG9rZW4gIT09IFwiXCIpO1xufTtcbiIsCiAgICAiZXhwb3J0IGNvbnN0IGtlZXBBY3RpdmVQaW5nID0gYCQka2VlcEFjdGl2ZVBpbmckJGA7XG4iCiAgXSwKICAibWFwcGluZ3MiOiAiQUFBQSx3QkFBUyxrQkFBZSwrQkFDeEIsOEJBQ0Usb0NBQ0Esb0RDSEssSUFBTSxFQUFpQixxQkRPOUIsSUFBTSxFQUFlLElBQUksRUFDbkIsRUFBZ0IsSUFBSSxFQUNwQixFQUFhLFFBQVEsSUFBSSxjQUFnQixPQUVsQyxFQUFVLE1BQU8sSUFBMEMsQ0FDdEUsSUFBUSxVQUFXLEVBRW5CLEdBQUksR0FBVSxLQUFNLE9BQ3BCLEdBQUksSUFBVyxtQkFBb0IsT0FFbkMsSUFBSSxFQUNKLEVBQUcsQ0FDRCxJQUFRLHlCQUF5QixDQUFDLEVBQUcsbUJBQ25DLE1BQU0sRUFBYyxLQUNsQixJQUFJLEVBQW9CLENBQ3RCLG9CQUFxQixDQUFDLGlCQUFpQixFQUN2QyxpQkFBa0IsR0FDbEIsV0FBWSxDQUFDLENBQUUsSUFBSyxhQUFjLE9BQVEsQ0FBQyxNQUFNLENBQUUsQ0FBQyxFQUNwRCxnQkFBaUIsQ0FDbkIsQ0FBQyxDQUNILEVBRUYsRUFBWSxFQUVaLE1BQU0sUUFBUSxJQUNaLEVBQXVCLElBQUksTUFBTyxJQUFhLENBUzdDLEdBUkEsTUFBTSxFQUFhLEtBQ2pCLElBQUksRUFBYyxDQUNoQixhQUFjLEVBQVMsWUFDdkIsZUFBZ0IsUUFDaEIsUUFBUyxLQUFLLFVBQVUsRUFBRyxHQUFpQixFQUFLLENBQUMsQ0FDcEQsQ0FBQyxDQUNILEVBRUksRUFDRixRQUFRLEtBQUssV0FBVyxFQUFTLGFBQWEsRUFFakQsQ0FDSCxRQUNPLEdBQWEsTUFBUSxJQUFjIiwKICAiZGVidWdJZCI6ICIwNERBQjE0QkYzOTkxMEE2NjQ3NTZFMjE2NDc1NkUyMSIsCiAgIm5hbWVzIjogW10KfQ==
package/dist/runtime.js DELETED
@@ -1,4 +0,0 @@
1
- var m="$$keepActivePing$$";function D(w,y){return($,j)=>{if($!=null&&typeof $==="object"&&m in $&&$[m]===!0){if(y?.enableLogs)console.info(`Keep active ping: ${JSON.stringify($)}`);return}return w($,j)}}function E(w,y){return async($)=>{if($.url==="https://lambda/"){let j=await $.json();if(j!=null&&typeof j==="object"&&m in j&&j[m]===!0){if(y?.enableLogs)console.info(`Keep active ping: ${JSON.stringify(j)}`);return new Response}return w(new Request($.url,{method:$.method,body:JSON.stringify(j),headers:$.headers}))}return w($)}}export{E as keptActiveFetch,D as keptActive};
2
-
3
- //# debugId=CF5B628A23D9961664756E2164756E21
4
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc2hhcmVkLnRzIiwgIi4uL3J1bnRpbWUudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbCiAgICAiZXhwb3J0IGNvbnN0IGtlZXBBY3RpdmVQaW5nID0gYCQka2VlcEFjdGl2ZVBpbmckJGA7XG4iLAogICAgImltcG9ydCB7IGtlZXBBY3RpdmVQaW5nIH0gZnJvbSBcIi4vc2hhcmVkXCI7XG5cbmludGVyZmFjZSBLZXB0QWN0aXZlT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBJZiBkaXNhYmxlZCBubyBsb2dzIGFyZSBsb2dnZWQgdG8gQ2xvdWRXYXRjaFxuICAgKlxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICByZWFkb25seSBlbmFibGVMb2dzPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGtlcHRBY3RpdmU8RXZlbnQgPSBhbnksIENvbnRleHQgPSBhbnksIFJlc3BvbnNlID0gYW55PihcbiAgaGFuZGxlcjogKGV2ZW50OiBFdmVudCwgY29udGV4dDogQ29udGV4dCkgPT4gUHJvbWlzZTxSZXNwb25zZT4sXG4gIG9wdGlvbnM/OiBLZXB0QWN0aXZlT3B0aW9ucyxcbikge1xuICByZXR1cm4gKGV2ZW50OiBFdmVudCwgY29udGV4dDogQ29udGV4dCkgPT4ge1xuICAgIGlmIChcbiAgICAgIGV2ZW50ICE9IG51bGwgJiZcbiAgICAgIHR5cGVvZiBldmVudCA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAga2VlcEFjdGl2ZVBpbmcgaW4gZXZlbnQgJiZcbiAgICAgIGV2ZW50W2tlZXBBY3RpdmVQaW5nXSA9PT0gdHJ1ZVxuICAgICkge1xuICAgICAgaWYgKG9wdGlvbnM/LmVuYWJsZUxvZ3MpIHtcbiAgICAgICAgY29uc29sZS5pbmZvKGBLZWVwIGFjdGl2ZSBwaW5nOiAke0pTT04uc3RyaW5naWZ5KGV2ZW50KX1gKTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICByZXR1cm4gaGFuZGxlcihldmVudCwgY29udGV4dCk7XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBrZXB0QWN0aXZlRmV0Y2goXG4gIGZldGNoOiAocmVxdWVzdDogUmVxdWVzdCkgPT4gUHJvbWlzZTxSZXNwb25zZT4sXG4gIG9wdGlvbnM/OiBLZXB0QWN0aXZlT3B0aW9ucyxcbikge1xuICByZXR1cm4gYXN5bmMgKHJlcXVlc3Q6IFJlcXVlc3QpID0+IHtcbiAgICBpZiAocmVxdWVzdC51cmwgPT09IFwiaHR0cHM6Ly9sYW1iZGEvXCIpIHtcbiAgICAgIGNvbnN0IGV2ZW50ID0gYXdhaXQgcmVxdWVzdC5qc29uKCk7XG5cbiAgICAgIGlmIChcbiAgICAgICAgZXZlbnQgIT0gbnVsbCAmJlxuICAgICAgICB0eXBlb2YgZXZlbnQgPT09IFwib2JqZWN0XCIgJiZcbiAgICAgICAga2VlcEFjdGl2ZVBpbmcgaW4gZXZlbnQgJiZcbiAgICAgICAgZXZlbnRba2VlcEFjdGl2ZVBpbmddID09PSB0cnVlXG4gICAgICApIHtcbiAgICAgICAgaWYgKG9wdGlvbnM/LmVuYWJsZUxvZ3MpIHtcbiAgICAgICAgICBjb25zb2xlLmluZm8oYEtlZXAgYWN0aXZlIHBpbmc6ICR7SlNPTi5zdHJpbmdpZnkoZXZlbnQpfWApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgUmVzcG9uc2UoKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZldGNoKFxuICAgICAgICBuZXcgUmVxdWVzdChyZXF1ZXN0LnVybCwge1xuICAgICAgICAgIG1ldGhvZDogcmVxdWVzdC5tZXRob2QsXG4gICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoZXZlbnQpLFxuICAgICAgICAgIGhlYWRlcnM6IHJlcXVlc3QuaGVhZGVycyxcbiAgICAgICAgfSksXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiBmZXRjaChyZXF1ZXN0KTtcbiAgfTtcbn1cbiIKICBdLAogICJtYXBwaW5ncyI6ICJBQUFPLElBQU0sRUFBaUIscUJDV3ZCLFNBQVMsQ0FBc0QsQ0FDcEUsRUFDQSxFQUNBLENBQ0EsTUFBTyxDQUFDLEVBQWMsSUFBcUIsQ0FDekMsR0FDRSxHQUFTLE1BQ1QsT0FBTyxJQUFVLFVBQ2pCLEtBQWtCLEdBQ2xCLEVBQU0sS0FBb0IsR0FDMUIsQ0FDQSxHQUFJLEdBQVMsV0FDWCxRQUFRLEtBQUsscUJBQXFCLEtBQUssVUFBVSxDQUFLLEdBQUcsRUFFM0QsT0FHRixPQUFPLEVBQVEsRUFBTyxDQUFPLEdBSTFCLFNBQVMsQ0FBZSxDQUM3QixFQUNBLEVBQ0EsQ0FDQSxNQUFPLE9BQU8sSUFBcUIsQ0FDakMsR0FBSSxFQUFRLE1BQVEsa0JBQW1CLENBQ3JDLElBQU0sRUFBUSxNQUFNLEVBQVEsS0FBSyxFQUVqQyxHQUNFLEdBQVMsTUFDVCxPQUFPLElBQVUsVUFDakIsS0FBa0IsR0FDbEIsRUFBTSxLQUFvQixHQUMxQixDQUNBLEdBQUksR0FBUyxXQUNYLFFBQVEsS0FBSyxxQkFBcUIsS0FBSyxVQUFVLENBQUssR0FBRyxFQUUzRCxPQUFPLElBQUksU0FHYixPQUFPLEVBQ0wsSUFBSSxRQUFRLEVBQVEsSUFBSyxDQUN2QixPQUFRLEVBQVEsT0FDaEIsS0FBTSxLQUFLLFVBQVUsQ0FBSyxFQUMxQixRQUFTLEVBQVEsT0FDbkIsQ0FBQyxDQUNILEVBR0YsT0FBTyxFQUFNLENBQU8iLAogICJkZWJ1Z0lkIjogIkNGNUI2MjhBMjNEOTk2MTY2NDc1NkUyMTY0NzU2RTIxIiwKICAibmFtZXMiOiBbXQp9