truemark-cdk-lib 0.0.4 → 0.0.10

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.
@@ -0,0 +1,4 @@
1
+ import { Duration } from "aws-cdk-lib";
2
+ import { IAlarmAction } from "aws-cdk-lib/aws-cloudwatch";
3
+ import { CustomAlarmThreshold } from "cdk-monitoring-constructs";
4
+ export declare function toAlarmProps(prop: string, warningThreshold?: number | Duration, criticalThreshold?: number | Duration, warningAlarmActions?: IAlarmAction[], criticalAlarmActions?: IAlarmAction[], warningDefaultThreshold?: number | Duration, criticalDefaultThreshold?: number | Duration): Record<string, CustomAlarmThreshold> | undefined;
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.toAlarmProps = void 0;
4
+ const aws_monitoring_1 = require("../../aws-monitoring");
5
+ function toAlarmProps(prop, warningThreshold, criticalThreshold, warningAlarmActions, criticalAlarmActions, warningDefaultThreshold, criticalDefaultThreshold) {
6
+ let alarmProps = {};
7
+ if (criticalThreshold !== undefined) {
8
+ alarmProps.Critical = {
9
+ [prop]: criticalThreshold,
10
+ actionsEnabled: true,
11
+ actionOverride: new aws_monitoring_1.StandardAlarmActionsStrategy({ actions: criticalAlarmActions })
12
+ };
13
+ }
14
+ else if (criticalDefaultThreshold !== undefined) {
15
+ alarmProps.Critical = {
16
+ [prop]: criticalDefaultThreshold,
17
+ actionsEnabled: true,
18
+ actionOverride: new aws_monitoring_1.StandardAlarmActionsStrategy({ actions: criticalAlarmActions })
19
+ };
20
+ }
21
+ if (warningThreshold !== undefined) {
22
+ alarmProps.Warning = {
23
+ [prop]: warningThreshold,
24
+ actionsEnabled: true,
25
+ actionOverride: new aws_monitoring_1.StandardAlarmActionsStrategy({ actions: warningAlarmActions })
26
+ };
27
+ }
28
+ else if (warningDefaultThreshold !== undefined) {
29
+ alarmProps.Warning = {
30
+ [prop]: warningDefaultThreshold,
31
+ actionsEnabled: true,
32
+ actionOverride: new aws_monitoring_1.StandardAlarmActionsStrategy({ actions: warningAlarmActions })
33
+ };
34
+ }
35
+ return Object.keys(alarmProps).length > 0 ? alarmProps : undefined;
36
+ }
37
+ exports.toAlarmProps = toAlarmProps;
38
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVscGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiaGVscGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUdBLHlEQUFrRTtBQUVsRSxTQUFnQixZQUFZLENBQzFCLElBQVksRUFDWixnQkFBb0MsRUFDcEMsaUJBQXFDLEVBQ3JDLG1CQUFvQyxFQUNwQyxvQkFBcUMsRUFDckMsdUJBQTJDLEVBQzNDLHdCQUE0QztJQUU1QyxJQUFJLFVBQVUsR0FBeUMsRUFBRSxDQUFBO0lBQ3pELElBQUksaUJBQWlCLEtBQUssU0FBUyxFQUFFO1FBQ25DLFVBQVUsQ0FBQyxRQUFRLEdBQUc7WUFDcEIsQ0FBQyxJQUFJLENBQUMsRUFBRSxpQkFBaUI7WUFDekIsY0FBYyxFQUFFLElBQUk7WUFDcEIsY0FBYyxFQUFFLElBQUksNkNBQTRCLENBQUMsRUFBQyxPQUFPLEVBQUUsb0JBQW9CLEVBQUMsQ0FBQztTQUNsRixDQUFBO0tBQ0Y7U0FBTSxJQUFJLHdCQUF3QixLQUFLLFNBQVMsRUFBRTtRQUNqRCxVQUFVLENBQUMsUUFBUSxHQUFHO1lBQ3BCLENBQUMsSUFBSSxDQUFDLEVBQUUsd0JBQXdCO1lBQ2hDLGNBQWMsRUFBRSxJQUFJO1lBQ3BCLGNBQWMsRUFBRSxJQUFJLDZDQUE0QixDQUFDLEVBQUMsT0FBTyxFQUFFLG9CQUFvQixFQUFDLENBQUM7U0FDbEYsQ0FBQTtLQUNGO0lBQ0QsSUFBSSxnQkFBZ0IsS0FBSyxTQUFTLEVBQUU7UUFDbEMsVUFBVSxDQUFDLE9BQU8sR0FBRztZQUNuQixDQUFDLElBQUksQ0FBQyxFQUFFLGdCQUFnQjtZQUN4QixjQUFjLEVBQUUsSUFBSTtZQUNwQixjQUFjLEVBQUUsSUFBSSw2Q0FBNEIsQ0FBQyxFQUFDLE9BQU8sRUFBRSxtQkFBbUIsRUFBQyxDQUFDO1NBQ2pGLENBQUE7S0FDRjtTQUFNLElBQUksdUJBQXVCLEtBQUssU0FBUyxFQUFFO1FBQ2hELFVBQVUsQ0FBQyxPQUFPLEdBQUc7WUFDbkIsQ0FBQyxJQUFJLENBQUMsRUFBRSx1QkFBdUI7WUFDL0IsY0FBYyxFQUFFLElBQUk7WUFDcEIsY0FBYyxFQUFFLElBQUksNkNBQTRCLENBQUMsRUFBQyxPQUFPLEVBQUUsbUJBQW1CLEVBQUMsQ0FBQztTQUNqRixDQUFBO0tBQ0Y7SUFDRCxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUE7QUFDcEUsQ0FBQztBQXJDRCxvQ0FxQ0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0R1cmF0aW9ufSBmcm9tIFwiYXdzLWNkay1saWJcIjtcbmltcG9ydCB7SUFsYXJtQWN0aW9ufSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWNsb3Vkd2F0Y2hcIjtcbmltcG9ydCB7Q3VzdG9tQWxhcm1UaHJlc2hvbGR9IGZyb20gXCJjZGstbW9uaXRvcmluZy1jb25zdHJ1Y3RzXCI7XG5pbXBvcnQge1N0YW5kYXJkQWxhcm1BY3Rpb25zU3RyYXRlZ3l9IGZyb20gXCIuLi8uLi9hd3MtbW9uaXRvcmluZ1wiO1xuXG5leHBvcnQgZnVuY3Rpb24gdG9BbGFybVByb3BzKFxuICBwcm9wOiBzdHJpbmcsXG4gIHdhcm5pbmdUaHJlc2hvbGQ/OiBudW1iZXIgfCBEdXJhdGlvbixcbiAgY3JpdGljYWxUaHJlc2hvbGQ/OiBudW1iZXIgfCBEdXJhdGlvbixcbiAgd2FybmluZ0FsYXJtQWN0aW9ucz86IElBbGFybUFjdGlvbltdLFxuICBjcml0aWNhbEFsYXJtQWN0aW9ucz86IElBbGFybUFjdGlvbltdLFxuICB3YXJuaW5nRGVmYXVsdFRocmVzaG9sZD86IG51bWJlciB8IER1cmF0aW9uLFxuICBjcml0aWNhbERlZmF1bHRUaHJlc2hvbGQ/OiBudW1iZXIgfCBEdXJhdGlvblxuKTogUmVjb3JkPHN0cmluZywgQ3VzdG9tQWxhcm1UaHJlc2hvbGQ+IHwgdW5kZWZpbmVkIHtcbiAgbGV0IGFsYXJtUHJvcHM6IFJlY29yZDxzdHJpbmcsIEN1c3RvbUFsYXJtVGhyZXNob2xkPiA9IHt9XG4gIGlmIChjcml0aWNhbFRocmVzaG9sZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgYWxhcm1Qcm9wcy5Dcml0aWNhbCA9IHtcbiAgICAgIFtwcm9wXTogY3JpdGljYWxUaHJlc2hvbGQsXG4gICAgICBhY3Rpb25zRW5hYmxlZDogdHJ1ZSxcbiAgICAgIGFjdGlvbk92ZXJyaWRlOiBuZXcgU3RhbmRhcmRBbGFybUFjdGlvbnNTdHJhdGVneSh7YWN0aW9uczogY3JpdGljYWxBbGFybUFjdGlvbnN9KVxuICAgIH1cbiAgfSBlbHNlIGlmIChjcml0aWNhbERlZmF1bHRUaHJlc2hvbGQgIT09IHVuZGVmaW5lZCkge1xuICAgIGFsYXJtUHJvcHMuQ3JpdGljYWwgPSB7XG4gICAgICBbcHJvcF06IGNyaXRpY2FsRGVmYXVsdFRocmVzaG9sZCxcbiAgICAgIGFjdGlvbnNFbmFibGVkOiB0cnVlLFxuICAgICAgYWN0aW9uT3ZlcnJpZGU6IG5ldyBTdGFuZGFyZEFsYXJtQWN0aW9uc1N0cmF0ZWd5KHthY3Rpb25zOiBjcml0aWNhbEFsYXJtQWN0aW9uc30pXG4gICAgfVxuICB9XG4gIGlmICh3YXJuaW5nVGhyZXNob2xkICE9PSB1bmRlZmluZWQpIHtcbiAgICBhbGFybVByb3BzLldhcm5pbmcgPSB7XG4gICAgICBbcHJvcF06IHdhcm5pbmdUaHJlc2hvbGQsXG4gICAgICBhY3Rpb25zRW5hYmxlZDogdHJ1ZSxcbiAgICAgIGFjdGlvbk92ZXJyaWRlOiBuZXcgU3RhbmRhcmRBbGFybUFjdGlvbnNTdHJhdGVneSh7YWN0aW9uczogd2FybmluZ0FsYXJtQWN0aW9uc30pXG4gICAgfVxuICB9IGVsc2UgaWYgKHdhcm5pbmdEZWZhdWx0VGhyZXNob2xkICE9PSB1bmRlZmluZWQpIHtcbiAgICBhbGFybVByb3BzLldhcm5pbmcgPSB7XG4gICAgICBbcHJvcF06IHdhcm5pbmdEZWZhdWx0VGhyZXNob2xkLFxuICAgICAgYWN0aW9uc0VuYWJsZWQ6IHRydWUsXG4gICAgICBhY3Rpb25PdmVycmlkZTogbmV3IFN0YW5kYXJkQWxhcm1BY3Rpb25zU3RyYXRlZ3koe2FjdGlvbnM6IHdhcm5pbmdBbGFybUFjdGlvbnN9KVxuICAgIH1cbiAgfVxuICByZXR1cm4gT2JqZWN0LmtleXMoYWxhcm1Qcm9wcykubGVuZ3RoID4gMCA/IGFsYXJtUHJvcHMgOiB1bmRlZmluZWRcbn1cbiJdfQ==
@@ -1 +1,2 @@
1
- export * from './standard-functions';
1
+ export * from './standard-function';
2
+ export * from './python-function';
@@ -10,5 +10,6 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
10
10
  for (var p in m) if (p !== "default" && !exports.hasOwnProperty(p)) __createBinding(exports, m, p);
11
11
  };
12
12
  Object.defineProperty(exports, "__esModule", { value: true });
13
- __exportStar(require("./standard-functions"), exports);
14
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFBQSx1REFBcUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL3N0YW5kYXJkLWZ1bmN0aW9ucyc7XG4iXX0=
13
+ __exportStar(require("./standard-function"), exports);
14
+ __exportStar(require("./python-function"), exports);
15
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFBQSxzREFBb0M7QUFDcEMsb0RBQWtDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9zdGFuZGFyZC1mdW5jdGlvbic7XG5leHBvcnQgKiBmcm9tICcuL3B5dGhvbi1mdW5jdGlvbic7XG4iXX0=
@@ -0,0 +1,40 @@
1
+ import { StandardFunctionProps } from "./standard-function";
2
+ import { Function, Runtime } from "aws-cdk-lib/aws-lambda";
3
+ import { Construct } from "constructs";
4
+ import { MonitoringFacade } from "cdk-monitoring-constructs";
5
+ import { LogAlarm } from "../../aws-cloudwatch";
6
+ export interface PythonFunctionProps extends StandardFunctionProps {
7
+ /**
8
+ * The runtime environment for the Lambda function. Must be one of the Python runtimes.
9
+ *
10
+ * @default Runtime.PYTHON_3_9
11
+ */
12
+ readonly runtime?: Runtime;
13
+ /**
14
+ * Location on the filesystem the Lambda assets are found.
15
+ *
16
+ * Example: path.join(__dirname, '..', 'mylambda')
17
+ */
18
+ readonly entry: string;
19
+ /**
20
+ * File containing the handler.
21
+ *
22
+ * @default 'index.py'
23
+ */
24
+ readonly index?: string;
25
+ /**
26
+ * Exported handler function
27
+ *
28
+ * @default 'handler'
29
+ */
30
+ readonly handler?: string;
31
+ }
32
+ export declare class PythonFunction extends Construct {
33
+ static readonly DEFAULT_LOG_METRIC_PATTERN = "\"[ERROR]\"";
34
+ static readonly DEFAULT_LOG_INSIGHTS_PATTERN = "\\[ERROR\\]";
35
+ readonly monitoring: MonitoringFacade;
36
+ readonly function: Function;
37
+ readonly criticalLogAlarm: LogAlarm;
38
+ readonly warningLogAlarm: LogAlarm;
39
+ constructor(scope: Construct, id: string, props: PythonFunctionProps);
40
+ }
@@ -0,0 +1,132 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PythonFunction = void 0;
4
+ const aws_lambda_1 = require("aws-cdk-lib/aws-lambda");
5
+ const constructs_1 = require("constructs");
6
+ const cdk_monitoring_constructs_1 = require("cdk-monitoring-constructs");
7
+ const aws_cloudwatch_1 = require("../../aws-cloudwatch");
8
+ const aws_cdk_lib_1 = require("aws-cdk-lib");
9
+ const fs = require("fs");
10
+ const path = require("path");
11
+ const logs = require("aws-cdk-lib/aws-logs");
12
+ const aws_cloudwatch_actions_1 = require("aws-cdk-lib/aws-cloudwatch-actions");
13
+ const helper_1 = require("./helper");
14
+ class PythonFunction extends constructs_1.Construct {
15
+ constructor(scope, id, props) {
16
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _0, _1, _2, _3;
17
+ super(scope, id);
18
+ this.monitoring = new cdk_monitoring_constructs_1.MonitoringFacade(this, 'Monitoring', {
19
+ metricFactoryDefaults: {},
20
+ alarmFactoryDefaults: {
21
+ actionsEnabled: true,
22
+ alarmNamePrefix: scope.node.path.replace(/\//g, '-'),
23
+ },
24
+ dashboardFactory: props.dashboardFactory
25
+ });
26
+ let bundling = fs.existsSync(path.join(props.entry, 'requirements.txt')) ? {
27
+ image: (_b = (_a = props.runtime) === null || _a === void 0 ? void 0 : _a.bundlingImage) !== null && _b !== void 0 ? _b : aws_lambda_1.Runtime.PYTHON_3_9.bundlingImage,
28
+ command: [
29
+ 'bash', '-c', [
30
+ 'pip install --target /asset-output/ -r requirements.txt',
31
+ 'cp -ra * /asset-output/'
32
+ ].join('&&')
33
+ ],
34
+ outputType: aws_cdk_lib_1.BundlingOutput.NOT_ARCHIVED,
35
+ } : undefined;
36
+ this.function = new aws_lambda_1.Function(this, id, {
37
+ runtime: (_c = props.runtime) !== null && _c !== void 0 ? _c : aws_lambda_1.Runtime.PYTHON_3_9,
38
+ tracing: (_d = props.tracing) !== null && _d !== void 0 ? _d : aws_lambda_1.Tracing.PASS_THROUGH,
39
+ logRetention: (_e = props.logRetention) !== null && _e !== void 0 ? _e : logs.RetentionDays.THREE_DAYS,
40
+ architecture: (_f = props.architecture) !== null && _f !== void 0 ? _f : aws_lambda_1.Architecture.ARM_64,
41
+ vpc: props.vpc,
42
+ vpcSubnets: props.vpcSubnets,
43
+ memorySize: (_g = props.memorySize) !== null && _g !== void 0 ? _g : 768,
44
+ timeout: (_h = props.timeout) !== null && _h !== void 0 ? _h : aws_cdk_lib_1.Duration.seconds(30),
45
+ environment: props.environment,
46
+ description: props.description,
47
+ code: aws_lambda_1.Code.fromAsset(props.entry, { bundling }),
48
+ handler: ((_j = props.index) !== null && _j !== void 0 ? _j : 'index.py').replace('.py', '') + '.' + ((_k = props.handler) !== null && _k !== void 0 ? _k : 'handler'),
49
+ });
50
+ const warnProps = props.warningAlarmProps;
51
+ const warnActions = [];
52
+ (_l = warnProps === null || warnProps === void 0 ? void 0 : warnProps.notifyActions) === null || _l === void 0 ? void 0 : _l.forEach((action) => warnActions.push(action));
53
+ (_m = warnProps === null || warnProps === void 0 ? void 0 : warnProps.notifyTopics) === null || _m === void 0 ? void 0 : _m.forEach((topic) => warnActions.push(new aws_cloudwatch_actions_1.SnsAction(topic)));
54
+ const critProps = props.criticalAlarmProps;
55
+ const critActions = [];
56
+ (_o = critProps === null || critProps === void 0 ? void 0 : critProps.notifyActions) === null || _o === void 0 ? void 0 : _o.forEach((action) => critActions.push(action));
57
+ (_p = critProps === null || critProps === void 0 ? void 0 : critProps.notifyTopics) === null || _p === void 0 ? void 0 : _p.forEach((topic) => critActions.push(new aws_cloudwatch_actions_1.SnsAction(topic)));
58
+ this.monitoring.monitorLambdaFunction({
59
+ lambdaFunction: this.function,
60
+ lambdaInsightsEnabled: true,
61
+ addToAlarmDashboard: true,
62
+ addToDetailDashboard: true,
63
+ addToSummaryDashboard: true,
64
+ addLatencyP50Alarm: helper_1.toAlarmProps('maxLatency', warnProps === null || warnProps === void 0 ? void 0 : warnProps.p50Latency, critProps === null || critProps === void 0 ? void 0 : critProps.p50Latency, warnActions, critActions),
65
+ addLatencyP90Alarm: helper_1.toAlarmProps('maxLatency', warnProps === null || warnProps === void 0 ? void 0 : warnProps.p90Latency, critProps === null || critProps === void 0 ? void 0 : critProps.p90Latency, warnActions, critActions),
66
+ addLatencyP99Alarm: helper_1.toAlarmProps('maxLatency', warnProps === null || warnProps === void 0 ? void 0 : warnProps.p99Latency, critProps === null || critProps === void 0 ? void 0 : critProps.p99Latency, warnActions, critActions),
67
+ addFaultCountAlarm: helper_1.toAlarmProps('maxErrorCount', warnProps === null || warnProps === void 0 ? void 0 : warnProps.maxFaults, critProps === null || critProps === void 0 ? void 0 : critProps.maxFaults, warnActions, critActions, undefined, 0),
68
+ addFaultRateAlarm: helper_1.toAlarmProps('maxErrorRate', warnProps === null || warnProps === void 0 ? void 0 : warnProps.avgFaults, critProps === null || critProps === void 0 ? void 0 : critProps.avgFaults, warnActions, critActions),
69
+ addLowTpsAlarm: helper_1.toAlarmProps('minTps', warnProps === null || warnProps === void 0 ? void 0 : warnProps.minTps, critProps === null || critProps === void 0 ? void 0 : critProps.minTps, warnActions, critActions),
70
+ addHighTpsAlarm: helper_1.toAlarmProps('maxTps', warnProps === null || warnProps === void 0 ? void 0 : warnProps.maxTps, critProps === null || critProps === void 0 ? void 0 : critProps.maxTps, warnActions, critActions),
71
+ addThrottlesCountAlarm: helper_1.toAlarmProps('maxErrorCount', warnProps === null || warnProps === void 0 ? void 0 : warnProps.maxThrottles, critProps === null || critProps === void 0 ? void 0 : critProps.maxThrottles, warnActions, critActions, undefined, 0),
72
+ addThrottlesRateAlarm: helper_1.toAlarmProps('maxErrorRate', warnProps === null || warnProps === void 0 ? void 0 : warnProps.avgThrottles, critProps === null || critProps === void 0 ? void 0 : critProps.avgThrottles, warnActions, critActions),
73
+ addConcurrentExecutionsCountAlarm: helper_1.toAlarmProps('maxRunningTasks', warnProps === null || warnProps === void 0 ? void 0 : warnProps.maxConcurrentExecutions, critProps === null || critProps === void 0 ? void 0 : critProps.maxConcurrentExecutions, warnActions, critActions),
74
+ addMaxIteratorAgeAlarm: helper_1.toAlarmProps('maxAgeInMillis', warnProps === null || warnProps === void 0 ? void 0 : warnProps.maxIteratorAge, critProps === null || critProps === void 0 ? void 0 : critProps.maxIteratorAge, warnActions, critActions),
75
+ addEnhancedMonitoringMaxCpuTotalTimeAlarm: helper_1.toAlarmProps('maxDuration', warnProps === null || warnProps === void 0 ? void 0 : warnProps.maxCpuTime, critProps === null || critProps === void 0 ? void 0 : critProps.maxCpuTime, warnActions, critActions),
76
+ addEnhancedMonitoringP90CpuTotalTimeAlarm: helper_1.toAlarmProps('maxDuration', warnProps === null || warnProps === void 0 ? void 0 : warnProps.p90CpuTime, critProps === null || critProps === void 0 ? void 0 : critProps.p90CpuTime, warnActions, critActions),
77
+ addEnhancedMonitoringAvgCpuTotalTimeAlarm: helper_1.toAlarmProps('maxDuration', warnProps === null || warnProps === void 0 ? void 0 : warnProps.avgCpuTime, critProps === null || critProps === void 0 ? void 0 : critProps.avgCpuTime, warnActions, critActions),
78
+ addEnhancedMonitoringMaxMemoryUtilizationAlarm: helper_1.toAlarmProps('maxUsagePercent', warnProps === null || warnProps === void 0 ? void 0 : warnProps.maxMemory, critProps === null || critProps === void 0 ? void 0 : critProps.maxMemory, warnActions, critActions),
79
+ addEnhancedMonitoringP90MemoryUtilizationAlarm: helper_1.toAlarmProps('maxUsagePercent', warnProps === null || warnProps === void 0 ? void 0 : warnProps.p90Memory, critProps === null || critProps === void 0 ? void 0 : critProps.p90Memory, warnActions, critActions),
80
+ addEnhancedMonitoringAvgMemoryUtilizationAlarm: helper_1.toAlarmProps('maxUsagePercent', warnProps === null || warnProps === void 0 ? void 0 : warnProps.avgMemory, critProps === null || critProps === void 0 ? void 0 : critProps.avgMemory, warnActions, critActions),
81
+ });
82
+ // Add log monitoring to dashboard
83
+ let critMaxLogCount = (_r = (_q = props.criticalAlarmProps) === null || _q === void 0 ? void 0 : _q.maxLogCount) !== null && _r !== void 0 ? _r : 1;
84
+ let pattern = '';
85
+ if (critMaxLogCount > 0) {
86
+ pattern = (_t = (_s = props.criticalAlarmProps) === null || _s === void 0 ? void 0 : _s.dashboardLogPattern) !== null && _t !== void 0 ? _t : PythonFunction.DEFAULT_LOG_INSIGHTS_PATTERN;
87
+ }
88
+ if (((_u = props.warningAlarmProps) === null || _u === void 0 ? void 0 : _u.maxLogCount) !== undefined && pattern !== props.warningAlarmProps.dashboardLogPattern) {
89
+ pattern += (pattern !== '' ? '|' : '') + props.warningAlarmProps.dashboardLogPattern;
90
+ }
91
+ if (pattern !== '') {
92
+ this.monitoring.monitorLog({
93
+ logGroupName: this.function.logGroup.logGroupName,
94
+ pattern,
95
+ });
96
+ }
97
+ // Add critical log alarm
98
+ if (critMaxLogCount > 0) {
99
+ this.criticalLogAlarm = new aws_cloudwatch_1.LogAlarm(this, 'LogsCritical', {
100
+ logGroup: this.function.logGroup,
101
+ pattern: (_w = (_v = props.criticalAlarmProps) === null || _v === void 0 ? void 0 : _v.metricLogPattern) !== null && _w !== void 0 ? _w : PythonFunction.DEFAULT_LOG_METRIC_PATTERN,
102
+ threshold: critMaxLogCount,
103
+ evaluationPeriods: 3
104
+ });
105
+ if (((_x = props.criticalAlarmProps) === null || _x === void 0 ? void 0 : _x.notifyActions) !== undefined) {
106
+ this.criticalLogAlarm.addAlarmActions(props.criticalAlarmProps.notifyActions);
107
+ }
108
+ if (((_y = props.criticalAlarmProps) === null || _y === void 0 ? void 0 : _y.notifyTopics) !== undefined) {
109
+ this.criticalLogAlarm.addAlarmTopics(props.criticalAlarmProps.notifyTopics);
110
+ }
111
+ }
112
+ // Add warning log alarm
113
+ if (((_z = props.warningAlarmProps) === null || _z === void 0 ? void 0 : _z.maxLogCount) !== undefined && props.warningAlarmProps.maxLogCount > 0) {
114
+ this.warningLogAlarm = new aws_cloudwatch_1.LogAlarm(this, 'LogsWarning', {
115
+ logGroup: this.function.logGroup,
116
+ pattern: (_1 = (_0 = props.warningAlarmProps) === null || _0 === void 0 ? void 0 : _0.metricLogPattern) !== null && _1 !== void 0 ? _1 : PythonFunction.DEFAULT_LOG_METRIC_PATTERN,
117
+ threshold: props.warningAlarmProps.maxLogCount,
118
+ evaluationPeriods: 3
119
+ });
120
+ if (((_2 = props.warningAlarmProps) === null || _2 === void 0 ? void 0 : _2.notifyActions) !== undefined) {
121
+ this.warningLogAlarm.addAlarmActions(props.warningAlarmProps.notifyActions);
122
+ }
123
+ if (((_3 = props.warningAlarmProps) === null || _3 === void 0 ? void 0 : _3.notifyTopics) !== undefined) {
124
+ this.warningLogAlarm.addAlarmTopics(props.warningAlarmProps.notifyTopics);
125
+ }
126
+ }
127
+ }
128
+ }
129
+ exports.PythonFunction = PythonFunction;
130
+ PythonFunction.DEFAULT_LOG_METRIC_PATTERN = '"[ERROR]"';
131
+ PythonFunction.DEFAULT_LOG_INSIGHTS_PATTERN = '\\\[ERROR\\\]';
132
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHl0aG9uLWZ1bmN0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsicHl0aG9uLWZ1bmN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLHVEQUFzRjtBQUN0RiwyQ0FBcUM7QUFDckMseUVBT21DO0FBQ25DLHlEQUE4QztBQUM5Qyw2Q0FBc0U7QUFDdEUseUJBQXlCO0FBQ3pCLDZCQUE2QjtBQUM3Qiw2Q0FBNkM7QUFFN0MsK0VBQTZEO0FBQzdELHFDQUFzQztBQWlDdEMsTUFBYSxjQUFlLFNBQVEsc0JBQVM7SUFTM0MsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUEwQjs7UUFDbEUsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksNENBQWdCLENBQUMsSUFBSSxFQUFFLFlBQVksRUFBRTtZQUN6RCxxQkFBcUIsRUFBRSxFQUFFO1lBQ3pCLG9CQUFvQixFQUFFO2dCQUNwQixjQUFjLEVBQUUsSUFBSTtnQkFDcEIsZUFBZSxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDO2FBQ3JEO1lBQ0QsZ0JBQWdCLEVBQUUsS0FBSyxDQUFDLGdCQUFnQjtTQUN6QyxDQUFDLENBQUM7UUFFSCxJQUFJLFFBQVEsR0FBZ0MsRUFBRSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN0RyxLQUFLLGNBQUUsS0FBSyxDQUFDLE9BQU8sMENBQUUsYUFBYSxtQ0FBRSxvQkFBTyxDQUFDLFVBQVUsQ0FBQyxhQUFhO1lBQ3JFLE9BQU8sRUFBRTtnQkFDUCxNQUFNLEVBQUUsSUFBSSxFQUFFO29CQUNaLHlEQUF5RDtvQkFDekQseUJBQXlCO2lCQUMxQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7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QUcsQ0FBQyxFQUFFO1lBQ2pHLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSx5QkFBUSxDQUFDLElBQUksRUFBRSxhQUFhLEVBQUU7Z0JBQ3ZELFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVE7Z0JBQ2hDLE9BQU8sY0FBRSxLQUFLLENBQUMsaUJBQWlCLDBDQUFFLGdCQUFnQixtQ0FBRSxjQUFjLENBQUMsMEJBQTBCO2dCQUM3RixTQUFTLEVBQUUsS0FBSyxDQUFDLGlCQUFpQixDQUFDLFdBQVc7Z0JBQzlDLGlCQUFpQixFQUFFLENBQUM7YUFDckIsQ0FBQyxDQUFDO1lBQ0gsSUFBSSxPQUFBLEtBQUssQ0FBQyxpQkFBaUIsMENBQUUsYUFBYSxNQUFLLFNBQVMsRUFBRTtnQkFDeEQsSUFBSSxDQUFDLGVBQWUsQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLGlCQUFpQixDQUFDLGFBQWEsQ0FBQyxDQUFDO2FBQzdFO1lBQ0QsSUFBSSxPQUFBLEtBQUssQ0FBQyxpQkFBaUIsMENBQUUsWUFBWSxNQUFLLFNBQVMsRUFBRTtnQkFDdkQsSUFBSSxDQUFDLGVBQWUsQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLGlCQUFpQixDQUFDLFlBQVksQ0FBQyxDQUFDO2FBQzNFO1NBQ0Y7SUFDSCxDQUFDOztBQWhJSCx3Q0FpSUM7QUEvSGlCLHlDQUEwQixHQUFHLFdBQVcsQ0FBQztBQUN6QywyQ0FBNEIsR0FBRyxlQUFlLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1N0YW5kYXJkRnVuY3Rpb25Qcm9wc30gZnJvbSBcIi4vc3RhbmRhcmQtZnVuY3Rpb25cIjtcbmltcG9ydCB7QXJjaGl0ZWN0dXJlLCBDb2RlLCBGdW5jdGlvbiwgUnVudGltZSwgVHJhY2luZ30gZnJvbSBcImF3cy1jZGstbGliL2F3cy1sYW1iZGFcIjtcbmltcG9ydCB7Q29uc3RydWN0fSBmcm9tIFwiY29uc3RydWN0c1wiO1xuaW1wb3J0IHtcbiAgRHVyYXRpb25UaHJlc2hvbGQsXG4gIEVycm9yQ291bnRUaHJlc2hvbGQsXG4gIEVycm9yUmF0ZVRocmVzaG9sZCwgSGlnaFRwc1RocmVzaG9sZCxcbiAgTGF0ZW5jeVRocmVzaG9sZCxcbiAgTG93VHBzVGhyZXNob2xkLCBNYXhBZ2VUaHJlc2hvbGQsXG4gIE1vbml0b3JpbmdGYWNhZGUsIFJ1bm5pbmdUYXNrQ291bnRUaHJlc2hvbGQsIFVzYWdlVGhyZXNob2xkXG59IGZyb20gXCJjZGstbW9uaXRvcmluZy1jb25zdHJ1Y3RzXCI7XG5pbXBvcnQge0xvZ0FsYXJtfSBmcm9tIFwiLi4vLi4vYXdzLWNsb3Vkd2F0Y2hcIjtcbmltcG9ydCB7QnVuZGxpbmdPcHRpb25zLCBCdW5kbGluZ091dHB1dCwgRHVyYXRpb259IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuaW1wb3J0ICogYXMgZnMgZnJvbSBcImZzXCI7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJwYXRoXCI7XG5pbXBvcnQgKiBhcyBsb2dzIGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtbG9nc1wiO1xuaW1wb3J0IHtJQWxhcm1BY3Rpb259IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtY2xvdWR3YXRjaFwiO1xuaW1wb3J0IHtTbnNBY3Rpb259IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtY2xvdWR3YXRjaC1hY3Rpb25zXCI7XG5pbXBvcnQge3RvQWxhcm1Qcm9wc30gZnJvbSBcIi4vaGVscGVyXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHl0aG9uRnVuY3Rpb25Qcm9wcyBleHRlbmRzIFN0YW5kYXJkRnVuY3Rpb25Qcm9wcyB7XG5cbiAgLyoqXG4gICAqIFRoZSBydW50aW1lIGVudmlyb25tZW50IGZvciB0aGUgTGFtYmRhIGZ1bmN0aW9uLiBNdXN0IGJlIG9uZSBvZiB0aGUgUHl0aG9uIHJ1bnRpbWVzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBSdW50aW1lLlBZVEhPTl8zXzlcbiAgICovXG4gIHJlYWRvbmx5IHJ1bnRpbWU/OiBSdW50aW1lO1xuXG4gIC8qKlxuICAgKiBMb2NhdGlvbiBvbiB0aGUgZmlsZXN5c3RlbSB0aGUgTGFtYmRhIGFzc2V0cyBhcmUgZm91bmQuXG4gICAqXG4gICAqIEV4YW1wbGU6IHBhdGguam9pbihfX2Rpcm5hbWUsICcuLicsICdteWxhbWJkYScpXG4gICAqL1xuICByZWFkb25seSBlbnRyeTogc3RyaW5nXG5cbiAgLyoqXG4gICAqIEZpbGUgY29udGFpbmluZyB0aGUgaGFuZGxlci5cbiAgICpcbiAgICogQGRlZmF1bHQgJ2luZGV4LnB5J1xuICAgKi9cbiAgcmVhZG9ubHkgaW5kZXg/OiBzdHJpbmdcblxuICAvKipcbiAgICogRXhwb3J0ZWQgaGFuZGxlciBmdW5jdGlvblxuICAgKlxuICAgKiBAZGVmYXVsdCAnaGFuZGxlcidcbiAgICovXG4gIHJlYWRvbmx5IGhhbmRsZXI/OiBzdHJpbmdcbn1cblxuZXhwb3J0IGNsYXNzIFB5dGhvbkZ1bmN0aW9uIGV4dGVuZHMgQ29uc3RydWN0IHtcblxuICBzdGF0aWMgcmVhZG9ubHkgREVGQVVMVF9MT0dfTUVUUklDX1BBVFRFUk4gPSAnXCJbRVJST1JdXCInO1xuICBzdGF0aWMgcmVhZG9ubHkgREVGQVVMVF9MT0dfSU5TSUdIVFNfUEFUVEVSTiA9ICdcXFxcXFxbRVJST1JcXFxcXFxdJztcbiAgcmVhZG9ubHkgZGVjbGFyZSBtb25pdG9yaW5nOiBNb25pdG9yaW5nRmFjYWRlXG4gIHJlYWRvbmx5IGRlY2xhcmUgZnVuY3Rpb246IEZ1bmN0aW9uO1xuICByZWFkb25seSBkZWNsYXJlIGNyaXRpY2FsTG9nQWxhcm06IExvZ0FsYXJtO1xuICByZWFkb25seSBkZWNsYXJlIHdhcm5pbmdMb2dBbGFybTogTG9nQWxhcm07XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IFB5dGhvbkZ1bmN0aW9uUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgdGhpcy5tb25pdG9yaW5nID0gbmV3IE1vbml0b3JpbmdGYWNhZGUodGhpcywgJ01vbml0b3JpbmcnLCB7XG4gICAgICBtZXRyaWNGYWN0b3J5RGVmYXVsdHM6IHt9LFxuICAgICAgYWxhcm1GYWN0b3J5RGVmYXVsdHM6IHtcbiAgICAgICAgYWN0aW9uc0VuYWJsZWQ6IHRydWUsXG4gICAgICAgIGFsYXJtTmFtZVByZWZpeDogc2NvcGUubm9kZS5wYXRoLnJlcGxhY2UoL1xcLy9nLCAnLScpLFxuICAgICAgfSxcbiAgICAgIGRhc2hib2FyZEZhY3Rvcnk6IHByb3BzLmRhc2hib2FyZEZhY3RvcnlcbiAgICB9KTtcblxuICAgIGxldCBidW5kbGluZzogQnVuZGxpbmdPcHRpb25zIHwgdW5kZWZpbmVkID0gZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocHJvcHMuZW50cnksICdyZXF1aXJlbWVudHMudHh0JykpID8ge1xuICAgICAgaW1hZ2U6IHByb3BzLnJ1bnRpbWU/LmJ1bmRsaW5nSW1hZ2U/P1J1bnRpbWUuUFlUSE9OXzNfOS5idW5kbGluZ0ltYWdlLFxuICAgICAgY29tbWFuZDogW1xuICAgICAgICAnYmFzaCcsICctYycsIFtcbiAgICAgICAgICAncGlwIGluc3RhbGwgLS10YXJnZXQgL2Fzc2V0LW91dHB1dC8gLXIgcmVxdWlyZW1lbnRzLnR4dCcsXG4gICAgICAgICAgJ2NwIC1yYSAqIC9hc3NldC1vdXRwdXQvJ1xuICAgICAgICBdLmpvaW4oJyYmJylcbiAgICAgIF0sXG4gICAgICBvdXRwdXRUeXBlOiBCdW5kbGluZ091dHB1dC5OT1RfQVJDSElWRUQsXG4gICAgfSA6IHVuZGVmaW5lZFxuXG4gICAgdGhpcy5mdW5jdGlvbiA9IG5ldyBGdW5jdGlvbih0aGlzLCBpZCwge1xuICAgICAgcnVudGltZTogcHJvcHMucnVudGltZT8/UnVudGltZS5QWVRIT05fM185LFxuICAgICAgdHJhY2luZzogcHJvcHMudHJhY2luZz8/VHJhY2luZy5QQVNTX1RIUk9VR0gsXG4gICAgICBsb2dSZXRlbnRpb246IHByb3BzLmxvZ1JldGVudGlvbj8/bG9ncy5SZXRlbnRpb25EYXlzLlRIUkVFX0RBWVMsXG4gICAgICBhcmNoaXRlY3R1cmU6IHByb3BzLmFyY2hpdGVjdHVyZT8/QXJjaGl0ZWN0dXJlLkFSTV82NCxcbiAgICAgIHZwYzogcHJvcHMudnBjLFxuICAgICAgdnBjU3VibmV0czogcHJvcHMudnBjU3VibmV0cyxcbiAgICAgIG1lbW9yeVNpemU6IHByb3BzLm1lbW9yeVNpemU/Pzc2OCxcbiAgICAgIHRpbWVvdXQ6IHByb3BzLnRpbWVvdXQ/P0R1cmF0aW9uLnNlY29uZHMoMzApLFxuICAgICAgZW52aXJvbm1lbnQ6IHByb3BzLmVudmlyb25tZW50LFxuICAgICAgZGVzY3JpcHRpb246IHByb3BzLmRlc2NyaXB0aW9uLFxuICAgICAgY29kZTogQ29kZS5mcm9tQXNzZXQocHJvcHMuZW50cnksIHtidW5kbGluZ30pLFxuICAgICAgaGFuZGxlcjogKHByb3BzLmluZGV4Pz8naW5kZXgucHknKS5yZXBsYWNlKCcucHknLCAnJykgKyAnLicgKyAocHJvcHMuaGFuZGxlcj8/J2hhbmRsZXInKSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHdhcm5Qcm9wcyA9IHByb3BzLndhcm5pbmdBbGFybVByb3BzO1xuICAgIGNvbnN0IHdhcm5BY3Rpb25zOiBJQWxhcm1BY3Rpb25bXSA9IFtdO1xuICAgIHdhcm5Qcm9wcz8ubm90aWZ5QWN0aW9ucz8uZm9yRWFjaCgoYWN0aW9uKSA9PiB3YXJuQWN0aW9ucy5wdXNoKGFjdGlvbikpO1xuICAgIHdhcm5Qcm9wcz8ubm90aWZ5VG9waWNzPy5mb3JFYWNoKCh0b3BpYykgPT4gd2FybkFjdGlvbnMucHVzaChuZXcgU25zQWN0aW9uKHRvcGljKSkpO1xuICAgIGNvbnN0IGNyaXRQcm9wcyA9IHByb3BzLmNyaXRpY2FsQWxhcm1Qcm9wcztcbiAgICBjb25zdCBjcml0QWN0aW9uczogSUFsYXJtQWN0aW9uW10gPSBbXTtcbiAgICBjcml0UHJvcHM/Lm5vdGlmeUFjdGlvbnM/LmZvckVhY2goKGFjdGlvbikgPT4gY3JpdEFjdGlvbnMucHVzaChhY3Rpb24pKTtcbiAgICBjcml0UHJvcHM/Lm5vdGlmeVRvcGljcz8uZm9yRWFjaCgodG9waWMpID0+IGNyaXRBY3Rpb25zLnB1c2gobmV3IFNuc0FjdGlvbih0b3BpYykpKTtcblxuICAgIHRoaXMubW9uaXRvcmluZy5tb25pdG9yTGFtYmRhRnVuY3Rpb24oe1xuICAgICAgbGFtYmRhRnVuY3Rpb246IHRoaXMuZnVuY3Rpb24sXG4gICAgICBsYW1iZGFJbnNpZ2h0c0VuYWJsZWQ6IHRydWUsXG4gICAgICBhZGRUb0FsYXJtRGFzaGJvYXJkOiB0cnVlLFxuICAgICAgYWRkVG9EZXRhaWxEYXNoYm9hcmQ6IHRydWUsXG4gICAgICBhZGRUb1N1bW1hcnlEYXNoYm9hcmQ6IHRydWUsXG4gICAgICBhZGRMYXRlbmN5UDUwQWxhcm06IHRvQWxhcm1Qcm9wcygnbWF4TGF0ZW5jeScsIHdhcm5Qcm9wcz8ucDUwTGF0ZW5jeSwgY3JpdFByb3BzPy5wNTBMYXRlbmN5LCB3YXJuQWN0aW9ucywgY3JpdEFjdGlvbnMpIGFzIFJlY29yZDxzdHJpbmcsIExhdGVuY3lUaHJlc2hvbGQ+LFxuICAgICAgYWRkTGF0ZW5jeVA5MEFsYXJtOiB0b0FsYXJtUHJvcHMoJ21heExhdGVuY3knLCB3YXJuUHJvcHM/LnA5MExhdGVuY3ksIGNyaXRQcm9wcz8ucDkwTGF0ZW5jeSwgd2FybkFjdGlvbnMsIGNyaXRBY3Rpb25zKSBhcyBSZWNvcmQ8c3RyaW5nLCBMYXRlbmN5VGhyZXNob2xkPixcbiAgICAgIGFkZExhdGVuY3lQOTlBbGFybTogdG9BbGFybVByb3BzKCdtYXhMYXRlbmN5Jywgd2FyblByb3BzPy5wOTlMYXRlbmN5LCBjcml0UHJvcHM/LnA5OUxhdGVuY3ksIHdhcm5BY3Rpb25zLCBjcml0QWN0aW9ucykgYXMgUmVjb3JkPHN0cmluZywgTGF0ZW5jeVRocmVzaG9sZD4sXG4gICAgICBhZGRGYXVsdENvdW50QWxhcm06IHRvQWxhcm1Qcm9wcygnbWF4RXJyb3JDb3VudCcsIHdhcm5Qcm9wcz8ubWF4RmF1bHRzLCBjcml0UHJvcHM/Lm1heEZhdWx0cywgd2FybkFjdGlvbnMsIGNyaXRBY3Rpb25zLCB1bmRlZmluZWQsIDApIGFzIFJlY29yZDxzdHJpbmcsIEVycm9yQ291bnRUaHJlc2hvbGQ+LFxuICAgICAgYWRkRmF1bHRSYXRlQWxhcm06IHRvQWxhcm1Qcm9wcygnbWF4RXJyb3JSYXRlJywgd2FyblByb3BzPy5hdmdGYXVsdHMsIGNyaXRQcm9wcz8uYXZnRmF1bHRzLCB3YXJuQWN0aW9ucywgY3JpdEFjdGlvbnMpIGFzIFJlY29yZDxzdHJpbmcsIEVycm9yUmF0ZVRocmVzaG9sZD4sXG4gICAgICBhZGRMb3dUcHNBbGFybTogdG9BbGFybVByb3BzKCdtaW5UcHMnLCB3YXJuUHJvcHM/Lm1pblRwcywgY3JpdFByb3BzPy5taW5UcHMsIHdhcm5BY3Rpb25zLCBjcml0QWN0aW9ucykgYXMgUmVjb3JkPHN0cmluZywgTG93VHBzVGhyZXNob2xkPixcbiAgICAgIGFkZEhpZ2hUcHNBbGFybTogdG9BbGFybVByb3BzKCdtYXhUcHMnLCB3YXJuUHJvcHM/Lm1heFRwcywgY3JpdFByb3BzPy5tYXhUcHMsIHdhcm5BY3Rpb25zLCBjcml0QWN0aW9ucykgYXMgUmVjb3JkPHN0cmluZywgSGlnaFRwc1RocmVzaG9sZD4sXG4gICAgICBhZGRUaHJvdHRsZXNDb3VudEFsYXJtOiB0b0FsYXJtUHJvcHMoJ21heEVycm9yQ291bnQnLCB3YXJuUHJvcHM/Lm1heFRocm90dGxlcywgY3JpdFByb3BzPy5tYXhUaHJvdHRsZXMsIHdhcm5BY3Rpb25zLCBjcml0QWN0aW9ucywgdW5kZWZpbmVkLCAwKSBhcyBSZWNvcmQ8c3RyaW5nLCBFcnJvckNvdW50VGhyZXNob2xkPixcbiAgICAgIGFkZFRocm90dGxlc1JhdGVBbGFybTogdG9BbGFybVByb3BzKCdtYXhFcnJvclJhdGUnLCB3YXJuUHJvcHM/LmF2Z1Rocm90dGxlcywgY3JpdFByb3BzPy5hdmdUaHJvdHRsZXMsIHdhcm5BY3Rpb25zLCBjcml0QWN0aW9ucykgYXMgUmVjb3JkPHN0cmluZywgRXJyb3JSYXRlVGhyZXNob2xkPixcbiAgICAgIGFkZENvbmN1cnJlbnRFeGVjdXRpb25zQ291bnRBbGFybTogdG9BbGFybVByb3BzKCdtYXhSdW5uaW5nVGFza3MnLCB3YXJuUHJvcHM/Lm1heENvbmN1cnJlbnRFeGVjdXRpb25zLCBjcml0UHJvcHM/Lm1heENvbmN1cnJlbnRFeGVjdXRpb25zLCB3YXJuQWN0aW9ucywgY3JpdEFjdGlvbnMpIGFzIFJlY29yZDxzdHJpbmcsIFJ1bm5pbmdUYXNrQ291bnRUaHJlc2hvbGQ+LFxuICAgICAgYWRkTWF4SXRlcmF0b3JBZ2VBbGFybTogdG9BbGFybVByb3BzKCdtYXhBZ2VJbk1pbGxpcycsIHdhcm5Qcm9wcz8ubWF4SXRlcmF0b3JBZ2UsIGNyaXRQcm9wcz8ubWF4SXRlcmF0b3JBZ2UsIHdhcm5BY3Rpb25zLCBjcml0QWN0aW9ucykgYXMgUmVjb3JkPHN0cmluZywgTWF4QWdlVGhyZXNob2xkPixcbiAgICAgIGFkZEVuaGFuY2VkTW9uaXRvcmluZ01heENwdVRvdGFsVGltZUFsYXJtOiB0b0FsYXJtUHJvcHMoJ21heER1cmF0aW9uJywgd2FyblByb3BzPy5tYXhDcHVUaW1lLCBjcml0UHJvcHM/Lm1heENwdVRpbWUsIHdhcm5BY3Rpb25zLCBjcml0QWN0aW9ucykgYXMgUmVjb3JkPHN0cmluZywgRHVyYXRpb25UaHJlc2hvbGQ+LFxuICAgICAgYWRkRW5oYW5jZWRNb25pdG9yaW5nUDkwQ3B1VG90YWxUaW1lQWxhcm06IHRvQWxhcm1Qcm9wcygnbWF4RHVyYXRpb24nLCB3YXJuUHJvcHM/LnA5MENwdVRpbWUsIGNyaXRQcm9wcz8ucDkwQ3B1VGltZSwgd2FybkFjdGlvbnMsIGNyaXRBY3Rpb25zKSBhcyBSZWNvcmQ8c3RyaW5nLCBEdXJhdGlvblRocmVzaG9sZD4sXG4gICAgICBhZGRFbmhhbmNlZE1vbml0b3JpbmdBdmdDcHVUb3RhbFRpbWVBbGFybTogdG9BbGFybVByb3BzKCdtYXhEdXJhdGlvbicsIHdhcm5Qcm9wcz8uYXZnQ3B1VGltZSwgY3JpdFByb3BzPy5hdmdDcHVUaW1lLCB3YXJuQWN0aW9ucywgY3JpdEFjdGlvbnMpIGFzICBSZWNvcmQ8c3RyaW5nLCBEdXJhdGlvblRocmVzaG9sZD4sXG4gICAgICBhZGRFbmhhbmNlZE1vbml0b3JpbmdNYXhNZW1vcnlVdGlsaXphdGlvbkFsYXJtOiB0b0FsYXJtUHJvcHMoJ21heFVzYWdlUGVyY2VudCcsIHdhcm5Qcm9wcz8ubWF4TWVtb3J5LCBjcml0UHJvcHM/Lm1heE1lbW9yeSwgd2FybkFjdGlvbnMsIGNyaXRBY3Rpb25zKSBhcyAgUmVjb3JkPHN0cmluZywgVXNhZ2VUaHJlc2hvbGQ+LFxuICAgICAgYWRkRW5oYW5jZWRNb25pdG9yaW5nUDkwTWVtb3J5VXRpbGl6YXRpb25BbGFybTogdG9BbGFybVByb3BzKCdtYXhVc2FnZVBlcmNlbnQnLCB3YXJuUHJvcHM/LnA5ME1lbW9yeSwgY3JpdFByb3BzPy5wOTBNZW1vcnksIHdhcm5BY3Rpb25zLCBjcml0QWN0aW9ucykgYXMgUmVjb3JkPHN0cmluZywgVXNhZ2VUaHJlc2hvbGQ+LFxuICAgICAgYWRkRW5oYW5jZWRNb25pdG9yaW5nQXZnTWVtb3J5VXRpbGl6YXRpb25BbGFybTogdG9BbGFybVByb3BzKCdtYXhVc2FnZVBlcmNlbnQnLCB3YXJuUHJvcHM/LmF2Z01lbW9yeSwgY3JpdFByb3BzPy5hdmdNZW1vcnksIHdhcm5BY3Rpb25zLCBjcml0QWN0aW9ucykgYXMgUmVjb3JkPHN0cmluZywgVXNhZ2VUaHJlc2hvbGQ+LFxuICAgIH0pO1xuXG4gICAgLy8gQWRkIGxvZyBtb25pdG9yaW5nIHRvIGRhc2hib2FyZFxuICAgIGxldCBjcml0TWF4TG9nQ291bnQgPSBwcm9wcy5jcml0aWNhbEFsYXJtUHJvcHM/Lm1heExvZ0NvdW50Pz8xXG4gICAgbGV0IHBhdHRlcm4gPSAnJztcbiAgICBpZiAoY3JpdE1heExvZ0NvdW50ID4gMCkge1xuICAgICAgcGF0dGVybiA9IHByb3BzLmNyaXRpY2FsQWxhcm1Qcm9wcz8uZGFzaGJvYXJkTG9nUGF0dGVybj8/UHl0aG9uRnVuY3Rpb24uREVGQVVMVF9MT0dfSU5TSUdIVFNfUEFUVEVSTlxuICAgIH1cbiAgICBpZiAocHJvcHMud2FybmluZ0FsYXJtUHJvcHM/Lm1heExvZ0NvdW50ICE9PSB1bmRlZmluZWQgJiYgcGF0dGVybiAhPT0gcHJvcHMud2FybmluZ0FsYXJtUHJvcHMuZGFzaGJvYXJkTG9nUGF0dGVybikge1xuICAgICAgcGF0dGVybiArPSAocGF0dGVybiAhPT0gJycgPyAnfCcgOiAnJykgKyBwcm9wcy53YXJuaW5nQWxhcm1Qcm9wcy5kYXNoYm9hcmRMb2dQYXR0ZXJuXG4gICAgfVxuICAgIGlmIChwYXR0ZXJuICE9PSAnJykge1xuICAgICAgdGhpcy5tb25pdG9yaW5nLm1vbml0b3JMb2coe1xuICAgICAgICBsb2dHcm91cE5hbWU6IHRoaXMuZnVuY3Rpb24ubG9nR3JvdXAubG9nR3JvdXBOYW1lLFxuICAgICAgICBwYXR0ZXJuLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gQWRkIGNyaXRpY2FsIGxvZyBhbGFybVxuICAgIGlmIChjcml0TWF4TG9nQ291bnQgPiAwKSB7XG4gICAgICB0aGlzLmNyaXRpY2FsTG9nQWxhcm0gPSBuZXcgTG9nQWxhcm0odGhpcywgJ0xvZ3NDcml0aWNhbCcsIHtcbiAgICAgICAgbG9nR3JvdXA6IHRoaXMuZnVuY3Rpb24ubG9nR3JvdXAsXG4gICAgICAgIHBhdHRlcm46IHByb3BzLmNyaXRpY2FsQWxhcm1Qcm9wcz8ubWV0cmljTG9nUGF0dGVybj8/UHl0aG9uRnVuY3Rpb24uREVGQVVMVF9MT0dfTUVUUklDX1BBVFRFUk4sXG4gICAgICAgIHRocmVzaG9sZDogY3JpdE1heExvZ0NvdW50LFxuICAgICAgICBldmFsdWF0aW9uUGVyaW9kczogM1xuICAgICAgfSk7XG4gICAgICBpZiAocHJvcHMuY3JpdGljYWxBbGFybVByb3BzPy5ub3RpZnlBY3Rpb25zICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5jcml0aWNhbExvZ0FsYXJtLmFkZEFsYXJtQWN0aW9ucyhwcm9wcy5jcml0aWNhbEFsYXJtUHJvcHMubm90aWZ5QWN0aW9ucyk7XG4gICAgICB9XG4gICAgICBpZiAocHJvcHMuY3JpdGljYWxBbGFybVByb3BzPy5ub3RpZnlUb3BpY3MgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmNyaXRpY2FsTG9nQWxhcm0uYWRkQWxhcm1Ub3BpY3MocHJvcHMuY3JpdGljYWxBbGFybVByb3BzLm5vdGlmeVRvcGljcyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQWRkIHdhcm5pbmcgbG9nIGFsYXJtXG4gICAgaWYgKHByb3BzLndhcm5pbmdBbGFybVByb3BzPy5tYXhMb2dDb3VudCAhPT0gdW5kZWZpbmVkICYmIHByb3BzLndhcm5pbmdBbGFybVByb3BzLm1heExvZ0NvdW50ID4gMCkge1xuICAgICAgdGhpcy53YXJuaW5nTG9nQWxhcm0gPSBuZXcgTG9nQWxhcm0odGhpcywgJ0xvZ3NXYXJuaW5nJywge1xuICAgICAgICBsb2dHcm91cDogdGhpcy5mdW5jdGlvbi5sb2dHcm91cCxcbiAgICAgICAgcGF0dGVybjogcHJvcHMud2FybmluZ0FsYXJtUHJvcHM/Lm1ldHJpY0xvZ1BhdHRlcm4/P1B5dGhvbkZ1bmN0aW9uLkRFRkFVTFRfTE9HX01FVFJJQ19QQVRURVJOLFxuICAgICAgICB0aHJlc2hvbGQ6IHByb3BzLndhcm5pbmdBbGFybVByb3BzLm1heExvZ0NvdW50LFxuICAgICAgICBldmFsdWF0aW9uUGVyaW9kczogM1xuICAgICAgfSk7XG4gICAgICBpZiAocHJvcHMud2FybmluZ0FsYXJtUHJvcHM/Lm5vdGlmeUFjdGlvbnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLndhcm5pbmdMb2dBbGFybS5hZGRBbGFybUFjdGlvbnMocHJvcHMud2FybmluZ0FsYXJtUHJvcHMubm90aWZ5QWN0aW9ucyk7XG4gICAgICB9XG4gICAgICBpZiAocHJvcHMud2FybmluZ0FsYXJtUHJvcHM/Lm5vdGlmeVRvcGljcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMud2FybmluZ0xvZ0FsYXJtLmFkZEFsYXJtVG9waWNzKHByb3BzLndhcm5pbmdBbGFybVByb3BzLm5vdGlmeVRvcGljcyk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iXX0=
@@ -1,12 +1,10 @@
1
- import { Architecture, Function, Runtime, Tracing } from 'aws-cdk-lib/aws-lambda';
2
- import { Construct } from 'constructs';
3
- import * as logs from 'aws-cdk-lib/aws-logs';
4
- import * as ec2 from 'aws-cdk-lib/aws-ec2';
5
- import { Duration } from 'aws-cdk-lib';
6
- import { IDashboardFactory, MonitoringFacade } from 'cdk-monitoring-constructs';
7
- import { ITopic } from 'aws-cdk-lib/aws-sns';
8
- import { IAlarmAction } from 'aws-cdk-lib/aws-cloudwatch';
9
- import { LogAlarm } from '../../aws-cloudwatch';
1
+ import { Duration } from "aws-cdk-lib";
2
+ import { ITopic } from "aws-cdk-lib/aws-sns";
3
+ import { IAlarmAction } from "aws-cdk-lib/aws-cloudwatch";
4
+ import { Architecture, Tracing } from "aws-cdk-lib/aws-lambda";
5
+ import * as logs from "aws-cdk-lib/aws-logs";
6
+ import * as ec2 from "aws-cdk-lib/aws-ec2";
7
+ import { IDashboardFactory } from "cdk-monitoring-constructs";
10
8
  export interface StandardFunctionAlarmProps {
11
9
  /**
12
10
  * Maximum 50th percentile latency
@@ -84,11 +82,11 @@ export interface StandardFunctionAlarmProps {
84
82
  /**
85
83
  * Topics to send alarm notifications
86
84
  */
87
- readonly notifyTopics?: [ITopic];
85
+ readonly notifyTopics?: ITopic[];
88
86
  /**
89
87
  * Actions to send alarm notifications
90
88
  */
91
- readonly notifyActions?: [IAlarmAction];
89
+ readonly notifyActions?: IAlarmAction[];
92
90
  /**
93
91
  * Log pattern to match for metrics.
94
92
  *
@@ -180,38 +178,3 @@ export interface StandardFunctionProps {
180
178
  */
181
179
  readonly warningAlarmProps?: StandardFunctionAlarmProps;
182
180
  }
183
- export interface PythonFunctionProps extends StandardFunctionProps {
184
- /**
185
- * The runtime environment for the Lambda function. Must be one of the Python runtimes.
186
- *
187
- * @default Runtime.PYTHON_3_9
188
- */
189
- readonly runtime?: Runtime;
190
- /**
191
- * Location on the filesystem the Lambda assets are found.
192
- *
193
- * Example: path.join(__dirname, '..', 'mylambda')
194
- */
195
- readonly entry: string;
196
- /**
197
- * File containing the handler.
198
- *
199
- * @default 'index.py'
200
- */
201
- readonly index?: string;
202
- /**
203
- * Exported handler function
204
- *
205
- * @default 'handler'
206
- */
207
- readonly handler?: string;
208
- }
209
- export declare class PythonFunction extends Construct {
210
- static readonly DEFAULT_LOG_METRIC_PATTERN = "\"[ERROR]\"";
211
- static readonly DEFAULT_LOG_INSIGHTS_PATTERN = "\\[ERROR\\]";
212
- readonly monitoring: MonitoringFacade;
213
- readonly function: Function;
214
- readonly criticalLogAlarm: LogAlarm;
215
- readonly warningLogAlarm: LogAlarm;
216
- constructor(scope: Construct, id: string, props: PythonFunctionProps);
217
- }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhbmRhcmQtZnVuY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJzdGFuZGFyZC1mdW5jdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtEdXJhdGlvbn0gZnJvbSBcImF3cy1jZGstbGliXCI7XG5pbXBvcnQge0lUb3BpY30gZnJvbSBcImF3cy1jZGstbGliL2F3cy1zbnNcIjtcbmltcG9ydCB7SUFsYXJtQWN0aW9ufSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWNsb3Vkd2F0Y2hcIjtcbmltcG9ydCB7QXJjaGl0ZWN0dXJlLCBSdW50aW1lLCBUcmFjaW5nfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWxhbWJkYVwiO1xuaW1wb3J0ICogYXMgbG9ncyBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWxvZ3NcIjtcbmltcG9ydCAqIGFzIGVjMiBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWVjMlwiO1xuaW1wb3J0IHtJRGFzaGJvYXJkRmFjdG9yeX0gZnJvbSBcImNkay1tb25pdG9yaW5nLWNvbnN0cnVjdHNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBTdGFuZGFyZEZ1bmN0aW9uQWxhcm1Qcm9wcyB7XG5cbiAgLyoqXG4gICAqIE1heGltdW0gNTB0aCBwZXJjZW50aWxlIGxhdGVuY3lcbiAgICovXG4gIHJlYWRvbmx5IHA1MExhdGVuY3k/OiBEdXJhdGlvbjtcblxuICAvKipcbiAgICogTWF4aW11bSA5MHRoIHBlcmNlbnRpbGUgbGF0ZW5jeVxuICAgKi9cbiAgcmVhZG9ubHkgcDkwTGF0ZW5jeT86IER1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBNYXhpbXVtIDk5dGggcGVyY2VudGlsZSBsYXRlbmN5XG4gICAqL1xuICByZWFkb25seSBwOTlMYXRlbmN5PzogRHVyYXRpb247XG5cbiAgLyoqXG4gICAqIE1heGltdW0gbnVtYmVyIG9mIGZhdWx0c1xuICAgKlxuICAgKiBAZGVmYXVsdCAwXG4gICAqL1xuICByZWFkb25seSBtYXhGYXVsdHM/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEF2ZXJhZ2UgbnVtYmVyIG9mIGZhdWx0c1xuICAgKi9cbiAgcmVhZG9ubHkgYXZnRmF1bHRzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBNaW5pbXVtIHRyYW5zYWN0aW9uc1xuICAgKi9cbiAgcmVhZG9ubHkgbWluVHBzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBNYXhpbXVtIHRyYW5zYWN0aW9uc1xuICAgKi9cbiAgcmVhZG9ubHkgbWF4VHBzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBNYXhpbXVtIG51bWJlciBvZiB0aHJvdHRsZXNcbiAgICpcbiAgICogQGRlZmF1bHQgMFxuICAgKi9cbiAgcmVhZG9ubHkgbWF4VGhyb3R0bGVzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBBdmVyYWdlIG51bWJlciBvZiB0aHJvdHRsZXNcbiAgICovXG4gIHJlYWRvbmx5IGF2Z1Rocm90dGxlcz86IG51bWJlcjtcblxuICAvKipcbiAgICogTWF4aW11bSBjb25jdXJyZW50IGV4ZWN1dGlvbnNcbiAgICovXG4gIHJlYWRvbmx5IG1heENvbmN1cnJlbnRFeGVjdXRpb25zPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBBbW91bnQgb2YgdGltZSBkYXRhIHdhaXRzIGJlZm9yZSBiZWluZyBwcm9jZXNzZWQgYnkgdGhlIGZ1bmN0aW9uLlxuICAgKiBTZWUgaHR0cHM6Ly9hd3MuYW1hem9uLmNvbS9wcmVtaXVtc3VwcG9ydC9rbm93bGVkZ2UtY2VudGVyL2xhbWJkYS1pdGVyYXRvci1hZ2UvXG4gICAqL1xuICByZWFkb25seSBtYXhJdGVyYXRvckFnZT86IG51bWJlcjtcblxuICAvKipcbiAgICogTWF4aW11bSBhbW91bnQgb2YgQ1BVIHRpbWVcbiAgICovXG4gIHJlYWRvbmx5IG1heENwdVRpbWU/OiBEdXJhdGlvbjtcblxuICAvKipcbiAgICogOTB0aCBwZXJjZW50aWxlIENQVSB0aW1lXG4gICAqL1xuICByZWFkb25seSBwOTBDcHVUaW1lPzogRHVyYXRpb247XG5cbiAgLyoqXG4gICAqIEF2ZXJhZ2UgQ1BVIHRpbWVcbiAgICovXG4gIHJlYWRvbmx5IGF2Z0NwdVRpbWU/OiBEdXJhdGlvbjtcblxuICAvKipcbiAgICogTWF4aW11bSBhbW91bnQgb2YgbWVtb3J5XG4gICAqL1xuICByZWFkb25seSBtYXhNZW1vcnk/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIDkwdGggcGVyY2VudGlsZSBtZW1vcnlcbiAgICovXG4gIHJlYWRvbmx5IHA5ME1lbW9yeT86IG51bWJlcjtcblxuICAvKipcbiAgICogQXZlcmFnZSBtZW1vcnlcbiAgICovXG4gIHJlYWRvbmx5IGF2Z01lbW9yeT86IG51bWJlcjtcblxuICAvKipcbiAgICogVG9waWNzIHRvIHNlbmQgYWxhcm0gbm90aWZpY2F0aW9uc1xuICAgKi9cbiAgcmVhZG9ubHkgbm90aWZ5VG9waWNzPzogSVRvcGljW107XG5cbiAgLyoqXG4gICAqIEFjdGlvbnMgdG8gc2VuZCBhbGFybSBub3RpZmljYXRpb25zXG4gICAqL1xuICByZWFkb25seSBub3RpZnlBY3Rpb25zPzogSUFsYXJtQWN0aW9uW107XG5cbiAgLyoqXG4gICAqIExvZyBwYXR0ZXJuIHRvIG1hdGNoIGZvciBtZXRyaWNzLlxuICAgKlxuICAgKiBAZGVmYXVsdCAnXFxcXFxcW0VSUk9SXFxcXFxcXSdcbiAgICovXG4gIHJlYWRvbmx5IG1ldHJpY0xvZ1BhdHRlcm4/OiBzdHJpbmdcblxuICAvKipcbiAgICogTG9nIHBhdHRlcm4gdG8gbWF0Y2ggZm9yIHRoZSBkYXNoYm9hcmRcbiAgICpcbiAgICogQGRlZmF1bHQgJ1wiW0VSUk9SXVwiJ1xuICAgKi9cbiAgcmVhZG9ubHkgZGFzaGJvYXJkTG9nUGF0dGVybj86IHN0cmluZ1xuXG4gIC8qKlxuICAgKiBNYXhpbXVtIG51bWJlciBvZiBsb2cgZXZlbnRzIG1hdGNoaW5nIHRoZSBwYXR0ZXJuLlxuICAgKlxuICAgKiBAZGVmYXVsdCAwIGZvciBDcml0aWNhbCBBbGFybVxuICAgKi9cbiAgcmVhZG9ubHkgbWF4TG9nQ291bnQ/OiBudW1iZXJcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTdGFuZGFyZEZ1bmN0aW9uUHJvcHMge1xuXG4gIC8qKlxuICAgKiBFbmFibGUgQVdTIFgtUmF5IFRyYWNpbmcuXG4gICAqXG4gICAqIEBkZWZhdWx0IFRyYWNpbmcuUEFTU19USFJPVUdIXG4gICAqL1xuICByZWFkb25seSB0cmFjaW5nPzogVHJhY2luZztcblxuICAvKipcbiAgICogVGhlIG51bWJlciBvZiBkYXlzIHRvIHJldGFpbiBsb2dzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBsb2dzLlJldGVudGlvbkRheXMuVEhSRUVfREFZU1xuICAgKi9cbiAgcmVhZG9ubHkgbG9nUmV0ZW50aW9uPzogbG9ncy5SZXRlbnRpb25EYXlzO1xuXG4gIC8qKlxuICAgKiBUaGUgc3lzdGVtIGFyY2hpdGVjdHVyZS5cbiAgICpcbiAgICogQGRlZmF1bHQgQXJjaGl0ZWN0dXJlLkFSTV82NFxuICAgKi9cbiAgcmVhZG9ubHkgYXJjaGl0ZWN0dXJlPzogQXJjaGl0ZWN0dXJlO1xuXG4gIC8qKlxuICAgKiBWUEMgbmV0d29yayB0byBwbGFjZSB0aGUgbGFtYmRhIG5ldHdvcmsgaW50ZXJmYWNlc1xuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vdCBwbGFjZWQgaW4gYSBWUENcbiAgICovXG4gIHJlYWRvbmx5IHZwYz86IGVjMi5JVnBjO1xuXG4gIC8qKlxuICAgKiBXaGVyZSB0byBwbGFjZSB0aGUgbGFtYmRhIGluc2lkZSB0aGUgVlBDLiBPbmx5IHVzZWQgaWYgJ3ZwYycgaXMgc3VwcGxpZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gVlBDIGRlZmF1bHQgc3RyYXRlZ3kgaXMgdXNlZCBpZiBub3Qgc3BlY2lmaWVkXG4gICAqL1xuICByZWFkb25seSB2cGNTdWJuZXRzPzogZWMyLlN1Ym5ldFNlbGVjdGlvbjtcblxuICAvKipcbiAgICogQW1vdW50IG9mIG1lbW9yeSBpbiBNQiBhbmQgcHJvcG9ydGlvbmFsbHkgQ1BVIHBvd2VyIHRvIGFsbG9jYXRlLlxuICAgKlxuICAgKiBAZGVmYXVsdCA3NjhcbiAgICovXG4gIHJlYWRvbmx5IG1lbW9yeVNpemU/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEZ1bmN0aW9uIGV4ZWN1dGlvbiB0aW1lIChpbiBzZWNvbmRzKSBhZnRlciB3aGljaCB0aGUgTGFtYmRhIHRlcm1pbmF0ZXMuXG4gICAqXG4gICAqIEBkZWZhdWx0IER1cmF0aW9uLnNlY29uZHMoMzApXG4gICAqL1xuICByZWFkb25seSB0aW1lb3V0PzogRHVyYXRpb247XG5cbiAgLyoqXG4gICAqIEVudmlyb25tZW50IHZhcmlhYmxlcyB0byBtYWtlIGF2YWlsYWJsZS5cbiAgICovXG4gIHJlYWRvbmx5IGVudmlyb25tZW50Pzoge1xuICAgIFtrZXk6IHN0cmluZ106IHN0cmluZztcbiAgfTtcblxuICAvKipcbiAgICogQSBkZXNjcmlwdGlvbiBvZiB0aGUgZnVuY3Rpb25cbiAgICovXG4gIHJlYWRvbmx5IGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgRGFzaGJvYXJkRmFjdG9yeSB0byB1c2Ugd2hlbiBnZW5lcmF0aW5nIENsb3VkV2F0Y2ggZGFzaGJvYXJkcy5cbiAgICpcbiAgICogSWYgbm90IGRlZmluZWQsIGRhc2hib2FyZHMgYXJlIG5vdCBnZW5lcmF0ZWQuXG4gICAqL1xuICByZWFkb25seSBkYXNoYm9hcmRGYWN0b3J5PzogSURhc2hib2FyZEZhY3Rvcnk7XG5cbiAgLyoqXG4gICAqIEFsYXJtIHRocmVzaG9sZHMgZm9yIGNyaXRpY2FsIGFsYXJtcy5cbiAgICpcbiAgICogSWYgbm8gcHJvcGVydGllcyBhcmUgcHJvdmlkZWQsIGEgc2V0IG9mIGRlZmF1bHQgYWxhcm1zIGFyZSBjcmVhdGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgY3JpdGljYWxBbGFybVByb3BzPzogU3RhbmRhcmRGdW5jdGlvbkFsYXJtUHJvcHM7XG5cbiAgLyoqXG4gICAqIEFsYXJtIHRocmVzaG9sZCBmb3Igd2FybmluZyBhbGFybXMuXG4gICAqXG4gICAqIElmIG5vIHByb3BlcnRpZXMgYXJlIHByb3ZpZGVkLCBhIHNldCBvZiBkZWZhdWx0IGFsYXJtcyBhcmUgY3JlYXRlZC5cbiAgICovXG4gIHJlYWRvbmx5IHdhcm5pbmdBbGFybVByb3BzPzogU3RhbmRhcmRGdW5jdGlvbkFsYXJtUHJvcHM7XG59XG4iXX0=
@@ -0,0 +1 @@
1
+ export * from './lib';
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
5
+ }) : (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ o[k2] = m[k];
8
+ }));
9
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
10
+ for (var p in m) if (p !== "default" && !exports.hasOwnProperty(p)) __createBinding(exports, m, p);
11
+ };
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ __exportStar(require("./lib"), exports);
14
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFBQSx3Q0FBc0IiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL2xpYic7XG4iXX0=
@@ -0,0 +1 @@
1
+ export * from './standard-queue';
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
5
+ }) : (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ o[k2] = m[k];
8
+ }));
9
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
10
+ for (var p in m) if (p !== "default" && !exports.hasOwnProperty(p)) __createBinding(exports, m, p);
11
+ };
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ __exportStar(require("./standard-queue"), exports);
14
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFBQSxtREFBaUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL3N0YW5kYXJkLXF1ZXVlJztcbiJdfQ==
@@ -0,0 +1,132 @@
1
+ import { Construct } from "constructs";
2
+ import { Duration } from "aws-cdk-lib";
3
+ import { Queue } from "aws-cdk-lib/aws-sqs";
4
+ import * as kms from 'aws-cdk-lib/aws-kms';
5
+ import { IAlarmAction } from "aws-cdk-lib/aws-cloudwatch";
6
+ import { ITopic } from 'aws-cdk-lib/aws-sns';
7
+ import * as iam from "aws-cdk-lib/aws-iam";
8
+ import { MonitoringFacade, IDashboardFactory } from "cdk-monitoring-constructs";
9
+ /**
10
+ * Alarm properties for StandardQueue
11
+ */
12
+ export interface StandardQueueAlarmProps {
13
+ /**
14
+ * Minimum number of messages visible.
15
+ */
16
+ readonly minSize?: number;
17
+ /**
18
+ * Maximum number of messages visible.
19
+ */
20
+ readonly maxSize?: number;
21
+ /**
22
+ * Maximum approximate age of the oldest message in the queue.
23
+ *
24
+ * @default Duration.minutes(15) for critical alarm
25
+ */
26
+ readonly maxAge?: Duration;
27
+ /**
28
+ * Maximum time to drain the queue.
29
+ */
30
+ readonly maxTimeToDrain?: Duration;
31
+ /**
32
+ * Minimum number of incoming messages.
33
+ */
34
+ readonly minIncoming?: number;
35
+ /**
36
+ * Maximum number of incoming messages.
37
+ */
38
+ readonly maxIncoming?: number;
39
+ /**
40
+ * Maximum number of visible messages in the dead-letter queue
41
+ *
42
+ * @default 0 for critical alarm
43
+ */
44
+ readonly deadLetterQueueMaxSize?: number;
45
+ /**
46
+ * Maximum age of the oldest messages in the dead-letter queue
47
+ */
48
+ readonly deadLetterQueueMaxAge?: Duration;
49
+ /**
50
+ * Maximum number of incoming messages in the dead-letter queue
51
+ */
52
+ readonly deadLetterQueueMaxIncoming?: number;
53
+ /**
54
+ * Topics to send alarm notifications
55
+ */
56
+ readonly notifyTopics?: [ITopic];
57
+ /**
58
+ * Actions to send alarm notifications
59
+ */
60
+ readonly notifyActions?: [IAlarmAction];
61
+ }
62
+ /**
63
+ * Properties for a StandardQueue
64
+ */
65
+ export interface StandardQueueProps {
66
+ /**
67
+ * The number of seconds Amazon SQS retains a message. Value must be between
68
+ * 60 and 1209600 seconds (14 days).
69
+ *
70
+ * @default Duration.seconds(1209600)
71
+ *
72
+ */
73
+ readonly retentionPeriod?: Duration;
74
+ /**
75
+ * The number of seconds a consumer has to handle the message and delete it
76
+ * from the queue before it becomes visible again for another consumer. Value
77
+ * must be between 0 and 43200 seconds (12 hours).
78
+ *
79
+ * @default Duration.seconds(30)
80
+ */
81
+ readonly visibilityTimeout?: Duration;
82
+ /**
83
+ * The KMS key to use for encryption. If not set, the AWS master key for SQS
84
+ * will be used.
85
+ */
86
+ readonly encryptionMasterKey?: kms.IKey;
87
+ /**
88
+ * The length of time that Amazon SQS reuses a data key before calling KMS again.
89
+ * This value affects pricing as you are charged for KMS usage. Value must be
90
+ * between 60 and 86,400 seconds (24 hours).
91
+ *
92
+ * @default Duration.minutes(15)
93
+ */
94
+ readonly dataKeyReuse?: Duration;
95
+ /**
96
+ * The maximum number of times a message can be unsuccessful before being moved
97
+ * to the dead-letter queue. Set this value to -1 to disable the dead-letter queue.
98
+ *
99
+ * @default 3
100
+ */
101
+ readonly maxReceiveCount?: number;
102
+ /**
103
+ * The DashboardFactory to use when generating CloudWatch dashboards.
104
+ *
105
+ * If not defined, dashboards are not generated.
106
+ */
107
+ readonly dashboardFactory?: IDashboardFactory;
108
+ /**
109
+ * Alarm thresholds for critical alarms.
110
+ *
111
+ * If no properties are provided, a set of default alarms are created.
112
+ */
113
+ readonly criticalAlarmProps?: StandardQueueAlarmProps;
114
+ /**
115
+ * Alarm threshold for warning alarms.
116
+ *
117
+ * If no properties are provided, a set of default alarms are created.
118
+ */
119
+ readonly warningAlarmProps?: StandardQueueAlarmProps;
120
+ }
121
+ export declare class StandardQueue extends Construct {
122
+ static readonly DEFAULT_MAX_RECEIVE_COUNT = 3;
123
+ static readonly DEFAULT_RETENTION_PERIOD: Duration;
124
+ readonly monitoring: MonitoringFacade;
125
+ readonly queue: Queue;
126
+ readonly deadLetterQueue: Queue;
127
+ constructor(scope: Construct, id: string, props?: StandardQueueProps);
128
+ grantConsumeMessages(grantee: iam.IGrantable): iam.Grant;
129
+ grantSendMessages(grantee: iam.IGrantable): iam.Grant;
130
+ grantPurge(grantee: iam.IGrantable): iam.Grant;
131
+ grant(grantee: iam.IGrantable, ...actions: string[]): iam.Grant;
132
+ }
@@ -0,0 +1,129 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.StandardQueue = void 0;
4
+ const constructs_1 = require("constructs");
5
+ const aws_cdk_lib_1 = require("aws-cdk-lib");
6
+ const aws_sqs_1 = require("aws-cdk-lib/aws-sqs");
7
+ const cdk_monitoring_constructs_1 = require("cdk-monitoring-constructs");
8
+ const aws_monitoring_1 = require("../../aws-monitoring");
9
+ const aws_cloudwatch_actions_1 = require("aws-cdk-lib/aws-cloudwatch-actions");
10
+ function toAlarmProps(prop, warningThreshold, criticalThreshold, warningAlarmActions, criticalAlarmActions, warningDefaultThreshold, criticalDefaultThreshold) {
11
+ let alarmProps = {};
12
+ if (criticalThreshold !== undefined) {
13
+ alarmProps.Critical = {
14
+ [prop]: criticalThreshold,
15
+ actionsEnabled: true,
16
+ actionOverride: new aws_monitoring_1.StandardAlarmActionsStrategy({ actions: criticalAlarmActions })
17
+ };
18
+ }
19
+ else if (criticalDefaultThreshold !== undefined) {
20
+ alarmProps.Critical = {
21
+ [prop]: criticalDefaultThreshold,
22
+ actionsEnabled: true,
23
+ actionOverride: new aws_monitoring_1.StandardAlarmActionsStrategy({ actions: criticalAlarmActions })
24
+ };
25
+ }
26
+ if (warningThreshold !== undefined) {
27
+ alarmProps.Warning = {
28
+ [prop]: warningThreshold,
29
+ actionsEnabled: true,
30
+ actionOverride: new aws_monitoring_1.StandardAlarmActionsStrategy({ actions: warningAlarmActions })
31
+ };
32
+ }
33
+ else if (warningDefaultThreshold !== undefined) {
34
+ alarmProps.Warning = {
35
+ [prop]: warningDefaultThreshold,
36
+ actionsEnabled: true,
37
+ actionOverride: new aws_monitoring_1.StandardAlarmActionsStrategy({ actions: warningAlarmActions })
38
+ };
39
+ }
40
+ return Object.keys(alarmProps).length > 0 ? alarmProps : undefined;
41
+ }
42
+ class StandardQueue extends constructs_1.Construct {
43
+ constructor(scope, id, props = {}) {
44
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q;
45
+ super(scope, id);
46
+ this.monitoring = new cdk_monitoring_constructs_1.MonitoringFacade(this, 'Monitoring', {
47
+ metricFactoryDefaults: {},
48
+ alarmFactoryDefaults: {
49
+ actionsEnabled: true,
50
+ alarmNamePrefix: scope.node.path.replace(/\//g, '-')
51
+ },
52
+ dashboardFactory: props.dashboardFactory
53
+ });
54
+ const encryption = props.encryptionMasterKey === undefined ? aws_sqs_1.QueueEncryption.KMS_MANAGED : aws_sqs_1.QueueEncryption.KMS;
55
+ // Setup dead-letter queue
56
+ const maxReceiveCount = (_a = props.maxReceiveCount) !== null && _a !== void 0 ? _a : StandardQueue.DEFAULT_MAX_RECEIVE_COUNT;
57
+ if (maxReceiveCount > 0) {
58
+ this.deadLetterQueue = new aws_sqs_1.Queue(this, 'DeadLetter', {
59
+ encryption,
60
+ encryptionMasterKey: props.encryptionMasterKey,
61
+ dataKeyReuse: (_b = props.dataKeyReuse) !== null && _b !== void 0 ? _b : aws_cdk_lib_1.Duration.minutes(15),
62
+ retentionPeriod: StandardQueue.DEFAULT_RETENTION_PERIOD
63
+ });
64
+ }
65
+ // Setup queue
66
+ this.queue = new aws_sqs_1.Queue(this, id, {
67
+ encryption,
68
+ encryptionMasterKey: props.encryptionMasterKey,
69
+ dataKeyReuse: (_c = props.dataKeyReuse) !== null && _c !== void 0 ? _c : aws_cdk_lib_1.Duration.minutes(15),
70
+ retentionPeriod: (_d = props.retentionPeriod) !== null && _d !== void 0 ? _d : StandardQueue.DEFAULT_RETENTION_PERIOD,
71
+ deadLetterQueue: props.maxReceiveCount === undefined || props.maxReceiveCount <= 0 ? undefined : {
72
+ maxReceiveCount: props.maxReceiveCount,
73
+ queue: this.deadLetterQueue
74
+ },
75
+ visibilityTimeout: (_e = props.visibilityTimeout) !== null && _e !== void 0 ? _e : aws_cdk_lib_1.Duration.seconds(30),
76
+ });
77
+ const warnProps = props.warningAlarmProps;
78
+ const warnActions = [];
79
+ (_f = warnProps === null || warnProps === void 0 ? void 0 : warnProps.notifyActions) === null || _f === void 0 ? void 0 : _f.forEach((action) => warnActions.push(action));
80
+ (_g = warnProps === null || warnProps === void 0 ? void 0 : warnProps.notifyTopics) === null || _g === void 0 ? void 0 : _g.forEach((topic) => warnActions.push(new aws_cloudwatch_actions_1.SnsAction(topic)));
81
+ const critProps = props.criticalAlarmProps;
82
+ const critActions = [];
83
+ (_h = critProps === null || critProps === void 0 ? void 0 : critProps.notifyActions) === null || _h === void 0 ? void 0 : _h.forEach((action) => critActions.push(action));
84
+ (_j = critProps === null || critProps === void 0 ? void 0 : critProps.notifyTopics) === null || _j === void 0 ? void 0 : _j.forEach((topic) => critActions.push(new aws_cloudwatch_actions_1.SnsAction(topic)));
85
+ if (maxReceiveCount > 0) {
86
+ this.monitoring.monitorSqsQueueWithDlq({
87
+ queue: this.queue,
88
+ deadLetterQueue: this.deadLetterQueue,
89
+ addQueueMinSizeAlarm: toAlarmProps('minMessageCount', warnProps === null || warnProps === void 0 ? void 0 : warnProps.minSize, critProps === null || critProps === void 0 ? void 0 : critProps.minSize, warnActions, critActions),
90
+ addQueueMaxSizeAlarm: toAlarmProps('maxMessageCount', warnProps === null || warnProps === void 0 ? void 0 : warnProps.maxSize, critProps === null || critProps === void 0 ? void 0 : critProps.maxSize, warnActions, critActions),
91
+ addQueueMaxMessageAgeAlarm: toAlarmProps('maxAgeInSeconds', (_k = warnProps === null || warnProps === void 0 ? void 0 : warnProps.maxAge) === null || _k === void 0 ? void 0 : _k.toSeconds(), (_l = critProps === null || critProps === void 0 ? void 0 : critProps.maxAge) === null || _l === void 0 ? void 0 : _l.toSeconds(), warnActions, critActions, undefined, aws_cdk_lib_1.Duration.minutes(15).toSeconds()),
92
+ addQueueMaxTimeToDrainMessagesAlarm: toAlarmProps('maxTimeToDrain', warnProps === null || warnProps === void 0 ? void 0 : warnProps.maxTimeToDrain, critProps === null || critProps === void 0 ? void 0 : critProps.maxTimeToDrain, warnActions, critActions),
93
+ addQueueMinIncomingMessagesAlarm: toAlarmProps('minIncomingMessagesCount', warnProps === null || warnProps === void 0 ? void 0 : warnProps.minIncoming, critProps === null || critProps === void 0 ? void 0 : critProps.minIncoming, warnActions, critActions),
94
+ addQueueMaxIncomingMessagesAlarm: toAlarmProps('maxIncomingMessagesCount', warnProps === null || warnProps === void 0 ? void 0 : warnProps.maxIncoming, critProps === null || critProps === void 0 ? void 0 : critProps.maxIncoming, warnActions, critActions),
95
+ addDeadLetterQueueMaxSizeAlarm: toAlarmProps('maxMessageCount', warnProps === null || warnProps === void 0 ? void 0 : warnProps.deadLetterQueueMaxSize, critProps === null || critProps === void 0 ? void 0 : critProps.deadLetterQueueMaxSize, warnActions, critActions, undefined, 0),
96
+ addDeadLetterQueueMaxMessageAgeAlarm: toAlarmProps('maxAgeInSeconds', (_m = warnProps === null || warnProps === void 0 ? void 0 : warnProps.deadLetterQueueMaxAge) === null || _m === void 0 ? void 0 : _m.toSeconds(), (_o = critProps === null || critProps === void 0 ? void 0 : critProps.deadLetterQueueMaxAge) === null || _o === void 0 ? void 0 : _o.toSeconds(), warnActions, critActions),
97
+ addDeadLetterQueueMaxIncomingMessagesAlarm: toAlarmProps('maxIncomingMessagesCount', warnProps === null || warnProps === void 0 ? void 0 : warnProps.deadLetterQueueMaxIncoming, critProps === null || critProps === void 0 ? void 0 : critProps.deadLetterQueueMaxIncoming, warnActions, critActions),
98
+ addDeadLetterQueueToSummaryDashboard: this.queue !== undefined,
99
+ });
100
+ }
101
+ else {
102
+ this.monitoring.monitorSqsQueue({
103
+ queue: this.queue,
104
+ addQueueMinSizeAlarm: toAlarmProps('minMessageCount', warnProps === null || warnProps === void 0 ? void 0 : warnProps.minSize, critProps === null || critProps === void 0 ? void 0 : critProps.minSize, warnActions, critActions),
105
+ addQueueMaxSizeAlarm: toAlarmProps('maxMessageCount', warnProps === null || warnProps === void 0 ? void 0 : warnProps.maxSize, critProps === null || critProps === void 0 ? void 0 : critProps.maxSize, warnActions, critActions),
106
+ addQueueMaxMessageAgeAlarm: toAlarmProps('maxAgeInSeconds', (_p = warnProps === null || warnProps === void 0 ? void 0 : warnProps.maxAge) === null || _p === void 0 ? void 0 : _p.toSeconds(), (_q = critProps === null || critProps === void 0 ? void 0 : critProps.maxAge) === null || _q === void 0 ? void 0 : _q.toSeconds(), warnActions, critActions, undefined, aws_cdk_lib_1.Duration.minutes(15).toSeconds()),
107
+ addQueueMaxTimeToDrainMessagesAlarm: toAlarmProps('maxTimeToDrain', warnProps === null || warnProps === void 0 ? void 0 : warnProps.maxTimeToDrain, critProps === null || critProps === void 0 ? void 0 : critProps.maxTimeToDrain, warnActions, critActions),
108
+ addQueueMinIncomingMessagesAlarm: toAlarmProps('minIncomingMessagesCount', warnProps === null || warnProps === void 0 ? void 0 : warnProps.minIncoming, critProps === null || critProps === void 0 ? void 0 : critProps.minIncoming, warnActions, critActions),
109
+ addQueueMaxIncomingMessagesAlarm: toAlarmProps('maxIncomingMessagesCount', warnProps === null || warnProps === void 0 ? void 0 : warnProps.maxIncoming, critProps === null || critProps === void 0 ? void 0 : critProps.maxIncoming, warnActions, critActions)
110
+ });
111
+ }
112
+ }
113
+ grantConsumeMessages(grantee) {
114
+ return this.queue.grantConsumeMessages(grantee);
115
+ }
116
+ grantSendMessages(grantee) {
117
+ return this.queue.grantSendMessages(grantee);
118
+ }
119
+ grantPurge(grantee) {
120
+ return this.queue.grantPurge(grantee);
121
+ }
122
+ grant(grantee, ...actions) {
123
+ return this.queue.grant(grantee, ...actions);
124
+ }
125
+ }
126
+ exports.StandardQueue = StandardQueue;
127
+ StandardQueue.DEFAULT_MAX_RECEIVE_COUNT = 3;
128
+ StandardQueue.DEFAULT_RETENTION_PERIOD = aws_cdk_lib_1.Duration.seconds(1209600);
129
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhbmRhcmQtcXVldWUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJzdGFuZGFyZC1xdWV1ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSwyQ0FBcUM7QUFDckMsNkNBQXFDO0FBQ3JDLGlEQUEyRDtBQUszRCx5RUFTbUM7QUFDbkMseURBQWtFO0FBQ2xFLCtFQUE2RDtBQXVJN0QsU0FBUyxZQUFZLENBQ25CLElBQVksRUFDWixnQkFBb0MsRUFDcEMsaUJBQXFDLEVBQ3JDLG1CQUFvQyxFQUNwQyxvQkFBcUMsRUFDckMsdUJBQTJDLEVBQzNDLHdCQUE0QztJQUU1QyxJQUFJLFVBQVUsR0FBeUMsRUFBRSxDQUFBO0lBQ3pELElBQUksaUJBQWlCLEtBQUssU0FBUyxFQUFFO1FBQ25DLFVBQVUsQ0FBQyxRQUFRLEdBQUc7WUFDcEIsQ0FBQyxJQUFJLENBQUMsRUFBRSxpQkFBaUI7WUFDekIsY0FBYyxFQUFFLElBQUk7WUFDcEIsY0FBYyxFQUFFLElBQUksNkNBQTRCLENBQUMsRUFBQyxPQUFPLEVBQUUsb0JBQW9CLEVBQUMsQ0FBQztTQUNsRixDQUFBO0tBQ0Y7U0FBTSxJQUFJLHdCQUF3QixLQUFLLFNBQVMsRUFBRTtRQUNqRCxVQUFVLENBQUMsUUFBUSxHQUFHO1lBQ3BCLENBQUMsSUFBSSxDQUFDLEVBQUUsd0JBQXdCO1lBQ2hDLGNBQWMsRUFBRSxJQUFJO1lBQ3BCLGNBQWMsRUFBRSxJQUFJLDZDQUE0QixDQUFDLEVBQUMsT0FBTyxFQUFFLG9CQUFvQixFQUFDLENBQUM7U0FDbEYsQ0FBQTtLQUNGO0lBQ0QsSUFBSSxnQkFBZ0IsS0FBSyxTQUFTLEVBQUU7UUFDbEMsVUFBVSxDQUFDLE9BQU8sR0FBRztZQUNuQixDQUFDLElBQUksQ0FBQyxFQUFFLGdCQUFnQjtZQUN4QixjQUFjLEVBQUUsSUFBSTtZQUNwQixjQUFjLEVBQUUsSUFBSSw2Q0FBNEIsQ0FBQyxFQUFDLE9BQU8sRUFBRSxtQkFBbUIsRUFBQyxDQUFDO1NBQ2pGLENB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R0gsc0NBbUdDO0FBakdpQix1Q0FBeUIsR0FBRyxDQUFDLENBQUM7QUFDOUIsc0NBQXdCLEdBQUcsc0JBQVEsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0NvbnN0cnVjdH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCB7RHVyYXRpb259IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuaW1wb3J0IHtRdWV1ZSwgUXVldWVFbmNyeXB0aW9ufSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXNxc1wiO1xuaW1wb3J0ICogYXMga21zIGZyb20gJ2F3cy1jZGstbGliL2F3cy1rbXMnO1xuaW1wb3J0IHtJQWxhcm1BY3Rpb259IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtY2xvdWR3YXRjaFwiO1xuaW1wb3J0IHtJVG9waWN9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1zbnMnO1xuaW1wb3J0ICogYXMgaWFtIGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtaWFtXCI7XG5pbXBvcnQge1xuICBNYXhJbmNvbWluZ01lc3NhZ2VzQ291bnRUaHJlc2hvbGQsXG4gIE1heE1lc3NhZ2VBZ2VUaHJlc2hvbGQsXG4gIE1heE1lc3NhZ2VDb3VudFRocmVzaG9sZCxcbiAgTWF4VGltZVRvRHJhaW5UaHJlc2hvbGQsIE1pbkluY29taW5nTWVzc2FnZXNDb3VudFRocmVzaG9sZCxcbiAgTW9uaXRvcmluZ0ZhY2FkZSxcbiAgSURhc2hib2FyZEZhY3RvcnksXG4gIE1pbk1lc3NhZ2VDb3VudFRocmVzaG9sZCxcbiAgQ3VzdG9tQWxhcm1UaHJlc2hvbGRcbn0gZnJvbSBcImNkay1tb25pdG9yaW5nLWNvbnN0cnVjdHNcIjtcbmltcG9ydCB7U3RhbmRhcmRBbGFybUFjdGlvbnNTdHJhdGVneX0gZnJvbSAnLi4vLi4vYXdzLW1vbml0b3JpbmcnO1xuaW1wb3J0IHtTbnNBY3Rpb259IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtY2xvdWR3YXRjaC1hY3Rpb25zXCI7XG5cbi8qKlxuICogQWxhcm0gcHJvcGVydGllcyBmb3IgU3RhbmRhcmRRdWV1ZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0YW5kYXJkUXVldWVBbGFybVByb3BzIHtcblxuICAvKipcbiAgICogTWluaW11bSBudW1iZXIgb2YgbWVzc2FnZXMgdmlzaWJsZS5cbiAgICovXG4gIHJlYWRvbmx5IG1pblNpemU/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIE1heGltdW0gbnVtYmVyIG9mIG1lc3NhZ2VzIHZpc2libGUuXG4gICAqL1xuICByZWFkb25seSBtYXhTaXplPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBNYXhpbXVtIGFwcHJveGltYXRlIGFnZSBvZiB0aGUgb2xkZXN0IG1lc3NhZ2UgaW4gdGhlIHF1ZXVlLlxuICAgKlxuICAgKiBAZGVmYXVsdCBEdXJhdGlvbi5taW51dGVzKDE1KSBmb3IgY3JpdGljYWwgYWxhcm1cbiAgICovXG4gIHJlYWRvbmx5IG1heEFnZT86IER1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBNYXhpbXVtIHRpbWUgdG8gZHJhaW4gdGhlIHF1ZXVlLlxuICAgKi9cbiAgcmVhZG9ubHkgbWF4VGltZVRvRHJhaW4/OiBEdXJhdGlvbjtcblxuICAvKipcbiAgICogTWluaW11bSBudW1iZXIgb2YgaW5jb21pbmcgbWVzc2FnZXMuXG4gICAqL1xuICByZWFkb25seSBtaW5JbmNvbWluZz86IG51bWJlcjtcblxuICAvKipcbiAgICogTWF4aW11bSBudW1iZXIgb2YgaW5jb21pbmcgbWVzc2FnZXMuXG4gICAqL1xuICByZWFkb25seSBtYXhJbmNvbWluZz86IG51bWJlcjtcblxuICAvKipcbiAgICogTWF4aW11bSBudW1iZXIgb2YgdmlzaWJsZSBtZXNzYWdlcyBpbiB0aGUgZGVhZC1sZXR0ZXIgcXVldWVcbiAgICpcbiAgICogQGRlZmF1bHQgMCBmb3IgY3JpdGljYWwgYWxhcm1cbiAgICovXG4gIHJlYWRvbmx5IGRlYWRMZXR0ZXJRdWV1ZU1heFNpemU/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIE1heGltdW0gYWdlIG9mIHRoZSBvbGRlc3QgbWVzc2FnZXMgaW4gdGhlIGRlYWQtbGV0dGVyIHF1ZXVlXG4gICAqL1xuICByZWFkb25seSBkZWFkTGV0dGVyUXVldWVNYXhBZ2U/OiBEdXJhdGlvbjtcblxuICAvKipcbiAgICogTWF4aW11bSBudW1iZXIgb2YgaW5jb21pbmcgbWVzc2FnZXMgaW4gdGhlIGRlYWQtbGV0dGVyIHF1ZXVlXG4gICAqL1xuICByZWFkb25seSBkZWFkTGV0dGVyUXVldWVNYXhJbmNvbWluZz86IG51bWJlcjtcblxuICAvKipcbiAgICogVG9waWNzIHRvIHNlbmQgYWxhcm0gbm90aWZpY2F0aW9uc1xuICAgKi9cbiAgcmVhZG9ubHkgbm90aWZ5VG9waWNzPzogW0lUb3BpY107XG5cbiAgLyoqXG4gICAqIEFjdGlvbnMgdG8gc2VuZCBhbGFybSBub3RpZmljYXRpb25zXG4gICAqL1xuICByZWFkb25seSBub3RpZnlBY3Rpb25zPzogW0lBbGFybUFjdGlvbl07XG59XG5cbi8qKlxuICogUHJvcGVydGllcyBmb3IgYSBTdGFuZGFyZFF1ZXVlXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3RhbmRhcmRRdWV1ZVByb3BzIHtcblxuICAvKipcbiAgICogVGhlIG51bWJlciBvZiBzZWNvbmRzIEFtYXpvbiBTUVMgcmV0YWlucyBhIG1lc3NhZ2UuIFZhbHVlIG11c3QgYmUgYmV0d2VlblxuICAgKiA2MCBhbmQgMTIwOTYwMCBzZWNvbmRzICgxNCBkYXlzKS5cbiAgICpcbiAgICogQGRlZmF1bHQgRHVyYXRpb24uc2Vjb25kcygxMjA5NjAwKVxuICAgKlxuICAgKi9cbiAgcmVhZG9ubHkgcmV0ZW50aW9uUGVyaW9kPzogRHVyYXRpb247XG5cbiAgLyoqXG4gICAqIFRoZSBudW1iZXIgb2Ygc2Vjb25kcyBhIGNvbnN1bWVyIGhhcyB0byBoYW5kbGUgdGhlIG1lc3NhZ2UgYW5kIGRlbGV0ZSBpdFxuICAgKiBmcm9tIHRoZSBxdWV1ZSBiZWZvcmUgaXQgYmVjb21lcyB2aXNpYmxlIGFnYWluIGZvciBhbm90aGVyIGNvbnN1bWVyLiBWYWx1ZVxuICAgKiBtdXN0IGJlIGJldHdlZW4gMCBhbmQgNDMyMDAgc2Vjb25kcyAoMTIgaG91cnMpLlxuICAgKlxuICAgKiBAZGVmYXVsdCBEdXJhdGlvbi5zZWNvbmRzKDMwKVxuICAgKi9cbiAgcmVhZG9ubHkgdmlzaWJpbGl0eVRpbWVvdXQ/OiBEdXJhdGlvbjtcblxuICAvKipcbiAgICogVGhlIEtNUyBrZXkgdG8gdXNlIGZvciBlbmNyeXB0aW9uLiBJZiBub3Qgc2V0LCB0aGUgQVdTIG1hc3RlciBrZXkgZm9yIFNRU1xuICAgKiB3aWxsIGJlIHVzZWQuXG4gICAqL1xuICByZWFkb25seSBlbmNyeXB0aW9uTWFzdGVyS2V5Pzoga21zLklLZXk7XG5cbiAgLyoqXG4gICAqIFRoZSBsZW5ndGggb2YgdGltZSB0aGF0IEFtYXpvbiBTUVMgcmV1c2VzIGEgZGF0YSBrZXkgYmVmb3JlIGNhbGxpbmcgS01TIGFnYWluLlxuICAgKiBUaGlzIHZhbHVlIGFmZmVjdHMgcHJpY2luZyBhcyB5b3UgYXJlIGNoYXJnZWQgZm9yIEtNUyB1c2FnZS4gVmFsdWUgbXVzdCBiZVxuICAgKiBiZXR3ZWVuIDYwIGFuZCA4Niw0MDAgc2Vjb25kcyAoMjQgaG91cnMpLlxuICAgKlxuICAgKiBAZGVmYXVsdCBEdXJhdGlvbi5taW51dGVzKDE1KVxuICAgKi9cbiAgcmVhZG9ubHkgZGF0YUtleVJldXNlPzogRHVyYXRpb247XG5cbiAgLyoqXG4gICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiB0aW1lcyBhIG1lc3NhZ2UgY2FuIGJlIHVuc3VjY2Vzc2Z1bCBiZWZvcmUgYmVpbmcgbW92ZWRcbiAgICogdG8gdGhlIGRlYWQtbGV0dGVyIHF1ZXVlLiBTZXQgdGhpcyB2YWx1ZSB0byAtMSB0byBkaXNhYmxlIHRoZSBkZWFkLWxldHRlciBxdWV1ZS5cbiAgICpcbiAgICogQGRlZmF1bHQgM1xuICAgKi9cbiAgcmVhZG9ubHkgbWF4UmVjZWl2ZUNvdW50PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgRGFzaGJvYXJkRmFjdG9yeSB0byB1c2Ugd2hlbiBnZW5lcmF0aW5nIENsb3VkV2F0Y2ggZGFzaGJvYXJkcy5cbiAgICpcbiAgICogSWYgbm90IGRlZmluZWQsIGRhc2hib2FyZHMgYXJlIG5vdCBnZW5lcmF0ZWQuXG4gICAqL1xuICByZWFkb25seSBkYXNoYm9hcmRGYWN0b3J5PzogSURhc2hib2FyZEZhY3Rvcnk7XG5cbiAgLyoqXG4gICAqIEFsYXJtIHRocmVzaG9sZHMgZm9yIGNyaXRpY2FsIGFsYXJtcy5cbiAgICpcbiAgICogSWYgbm8gcHJvcGVydGllcyBhcmUgcHJvdmlkZWQsIGEgc2V0IG9mIGRlZmF1bHQgYWxhcm1zIGFyZSBjcmVhdGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgY3JpdGljYWxBbGFybVByb3BzPzogU3RhbmRhcmRRdWV1ZUFsYXJtUHJvcHM7XG5cbiAgLyoqXG4gICAqIEFsYXJtIHRocmVzaG9sZCBmb3Igd2FybmluZyBhbGFybXMuXG4gICAqXG4gICAqIElmIG5vIHByb3BlcnRpZXMgYXJlIHByb3ZpZGVkLCBhIHNldCBvZiBkZWZhdWx0IGFsYXJtcyBhcmUgY3JlYXRlZC5cbiAgICovXG4gIHJlYWRvbmx5IHdhcm5pbmdBbGFybVByb3BzPzogU3RhbmRhcmRRdWV1ZUFsYXJtUHJvcHM7XG59XG5cbmZ1bmN0aW9uIHRvQWxhcm1Qcm9wcyhcbiAgcHJvcDogc3RyaW5nLFxuICB3YXJuaW5nVGhyZXNob2xkPzogbnVtYmVyIHwgRHVyYXRpb24sXG4gIGNyaXRpY2FsVGhyZXNob2xkPzogbnVtYmVyIHwgRHVyYXRpb24sXG4gIHdhcm5pbmdBbGFybUFjdGlvbnM/OiBJQWxhcm1BY3Rpb25bXSxcbiAgY3JpdGljYWxBbGFybUFjdGlvbnM/OiBJQWxhcm1BY3Rpb25bXSxcbiAgd2FybmluZ0RlZmF1bHRUaHJlc2hvbGQ/OiBudW1iZXIgfCBEdXJhdGlvbixcbiAgY3JpdGljYWxEZWZhdWx0VGhyZXNob2xkPzogbnVtYmVyIHwgRHVyYXRpb25cbik6IFJlY29yZDxzdHJpbmcsIEN1c3RvbUFsYXJtVGhyZXNob2xkPiB8IHVuZGVmaW5lZCB7XG4gIGxldCBhbGFybVByb3BzOiBSZWNvcmQ8c3RyaW5nLCBDdXN0b21BbGFybVRocmVzaG9sZD4gPSB7fVxuICBpZiAoY3JpdGljYWxUaHJlc2hvbGQgIT09IHVuZGVmaW5lZCkge1xuICAgIGFsYXJtUHJvcHMuQ3JpdGljYWwgPSB7XG4gICAgICBbcHJvcF06IGNyaXRpY2FsVGhyZXNob2xkLFxuICAgICAgYWN0aW9uc0VuYWJsZWQ6IHRydWUsXG4gICAgICBhY3Rpb25PdmVycmlkZTogbmV3IFN0YW5kYXJkQWxhcm1BY3Rpb25zU3RyYXRlZ3koe2FjdGlvbnM6IGNyaXRpY2FsQWxhcm1BY3Rpb25zfSlcbiAgICB9XG4gIH0gZWxzZSBpZiAoY3JpdGljYWxEZWZhdWx0VGhyZXNob2xkICE9PSB1bmRlZmluZWQpIHtcbiAgICBhbGFybVByb3BzLkNyaXRpY2FsID0ge1xuICAgICAgW3Byb3BdOiBjcml0aWNhbERlZmF1bHRUaHJlc2hvbGQsXG4gICAgICBhY3Rpb25zRW5hYmxlZDogdHJ1ZSxcbiAgICAgIGFjdGlvbk92ZXJyaWRlOiBuZXcgU3RhbmRhcmRBbGFybUFjdGlvbnNTdHJhdGVneSh7YWN0aW9uczogY3JpdGljYWxBbGFybUFjdGlvbnN9KVxuICAgIH1cbiAgfVxuICBpZiAod2FybmluZ1RocmVzaG9sZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgYWxhcm1Qcm9wcy5XYXJuaW5nID0ge1xuICAgICAgW3Byb3BdOiB3YXJuaW5nVGhyZXNob2xkLFxuICAgICAgYWN0aW9uc0VuYWJsZWQ6IHRydWUsXG4gICAgICBhY3Rpb25PdmVycmlkZTogbmV3IFN0YW5kYXJkQWxhcm1BY3Rpb25zU3RyYXRlZ3koe2FjdGlvbnM6IHdhcm5pbmdBbGFybUFjdGlvbnN9KVxuICAgIH1cbiAgfSBlbHNlIGlmICh3YXJuaW5nRGVmYXVsdFRocmVzaG9sZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgYWxhcm1Qcm9wcy5XYXJuaW5nID0ge1xuICAgICAgW3Byb3BdOiB3YXJuaW5nRGVmYXVsdFRocmVzaG9sZCxcbiAgICAgIGFjdGlvbnNFbmFibGVkOiB0cnVlLFxuICAgICAgYWN0aW9uT3ZlcnJpZGU6IG5ldyBTdGFuZGFyZEFsYXJtQWN0aW9uc1N0cmF0ZWd5KHthY3Rpb25zOiB3YXJuaW5nQWxhcm1BY3Rpb25zfSlcbiAgICB9XG4gIH1cbiAgcmV0dXJuIE9iamVjdC5rZXlzKGFsYXJtUHJvcHMpLmxlbmd0aCA+IDAgPyBhbGFybVByb3BzIDogdW5kZWZpbmVkXG59XG5cbmV4cG9ydCBjbGFzcyBTdGFuZGFyZFF1ZXVlIGV4dGVuZHMgQ29uc3RydWN0IHtcblxuICBzdGF0aWMgcmVhZG9ubHkgREVGQVVMVF9NQVhfUkVDRUlWRV9DT1VOVCA9IDM7XG4gIHN0YXRpYyByZWFkb25seSBERUZBVUxUX1JFVEVOVElPTl9QRVJJT0QgPSBEdXJhdGlvbi5zZWNvbmRzKDEyMDk2MDApO1xuXG4gIHJlYWRvbmx5IG1vbml0b3Jpbmc6IE1vbml0b3JpbmdGYWNhZGU7XG4gIHJlYWRvbmx5IHF1ZXVlOiBRdWV1ZTtcbiAgcmVhZG9ubHkgZGVhZExldHRlclF1ZXVlOiBRdWV1ZTtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogU3RhbmRhcmRRdWV1ZVByb3BzID0ge30pIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgdGhpcy5tb25pdG9yaW5nID0gbmV3IE1vbml0b3JpbmdGYWNhZGUodGhpcywgJ01vbml0b3JpbmcnLCB7XG4gICAgICBtZXRyaWNGYWN0b3J5RGVmYXVsdHM6IHt9LFxuICAgICAgYWxhcm1GYWN0b3J5RGVmYXVsdHM6IHtcbiAgICAgICAgYWN0aW9uc0VuYWJsZWQ6IHRydWUsXG4gICAgICAgIGFsYXJtTmFtZVByZWZpeDogc2NvcGUubm9kZS5wYXRoLnJlcGxhY2UoL1xcLy9nLCAnLScpXG4gICAgICB9LFxuICAgICAgZGFzaGJvYXJkRmFjdG9yeTogcHJvcHMuZGFzaGJvYXJkRmFjdG9yeVxuICAgIH0pO1xuXG4gICAgY29uc3QgZW5jcnlwdGlvbiA9IHByb3BzLmVuY3J5cHRpb25NYXN0ZXJLZXkgPT09IHVuZGVmaW5lZCA/IFF1ZXVlRW5jcnlwdGlvbi5LTVNfTUFOQUdFRCA6IFF1ZXVlRW5jcnlwdGlvbi5LTVM7XG5cbiAgICAvLyBTZXR1cCBkZWFkLWxldHRlciBxdWV1ZVxuICAgIGNvbnN0IG1heFJlY2VpdmVDb3VudCA9IHByb3BzLm1heFJlY2VpdmVDb3VudD8/U3RhbmRhcmRRdWV1ZS5ERUZBVUxUX01BWF9SRUNFSVZFX0NPVU5UO1xuICAgIGlmIChtYXhSZWNlaXZlQ291bnQgPiAwKSB7XG4gICAgICB0aGlzLmRlYWRMZXR0ZXJRdWV1ZSA9IG5ldyBRdWV1ZSh0aGlzLCAnRGVhZExldHRlcicsIHtcbiAgICAgICAgZW5jcnlwdGlvbixcbiAgICAgICAgZW5jcnlwdGlvbk1hc3RlcktleTogcHJvcHMuZW5jcnlwdGlvbk1hc3RlcktleSxcbiAgICAgICAgZGF0YUtleVJldXNlOiBwcm9wcy5kYXRhS2V5UmV1c2U/P0R1cmF0aW9uLm1pbnV0ZXMoMTUpLFxuICAgICAgICByZXRlbnRpb25QZXJpb2Q6IFN0YW5kYXJkUXVldWUuREVGQVVMVF9SRVRFTlRJT05fUEVSSU9EXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBTZXR1cCBxdWV1ZVxuICAgIHRoaXMucXVldWUgPSBuZXcgUXVldWUodGhpcywgaWQsIHtcbiAgICAgIGVuY3J5cHRpb24sXG4gICAgICBlbmNyeXB0aW9uTWFzdGVyS2V5OiBwcm9wcy5lbmNyeXB0aW9uTWFzdGVyS2V5LFxuICAgICAgZGF0YUtleVJldXNlOiBwcm9wcy5kYXRhS2V5UmV1c2U/P0R1cmF0aW9uLm1pbnV0ZXMoMTUpLFxuICAgICAgcmV0ZW50aW9uUGVyaW9kOiBwcm9wcy5yZXRlbnRpb25QZXJpb2Q/P1N0YW5kYXJkUXVldWUuREVGQVVMVF9SRVRFTlRJT05fUEVSSU9ELFxuICAgICAgZGVhZExldHRlclF1ZXVlOiBwcm9wcy5tYXhSZWNlaXZlQ291bnQgPT09IHVuZGVmaW5lZCB8fCBwcm9wcy5tYXhSZWNlaXZlQ291bnQgPD0gMCA/IHVuZGVmaW5lZCA6IHtcbiAgICAgICAgbWF4UmVjZWl2ZUNvdW50OiBwcm9wcy5tYXhSZWNlaXZlQ291bnQsXG4gICAgICAgIHF1ZXVlOiB0aGlzLmRlYWRMZXR0ZXJRdWV1ZVxuICAgICAgfSxcbiAgICAgIHZpc2liaWxpdHlUaW1lb3V0OiBwcm9wcy52aXNpYmlsaXR5VGltZW91dD8/RHVyYXRpb24uc2Vjb25kcygzMCksXG4gICAgfSk7XG5cbiAgICBjb25zdCB3YXJuUHJvcHMgPSBwcm9wcy53YXJuaW5nQWxhcm1Qcm9wcztcbiAgICBjb25zdCB3YXJuQWN0aW9uczogSUFsYXJtQWN0aW9uW10gPSBbXTtcbiAgICB3YXJuUHJvcHM/Lm5vdGlmeUFjdGlvbnM/LmZvckVhY2goKGFjdGlvbikgPT4gd2FybkFjdGlvbnMucHVzaChhY3Rpb24pKTtcbiAgICB3YXJuUHJvcHM/Lm5vdGlmeVRvcGljcz8uZm9yRWFjaCgodG9waWMpID0+IHdhcm5BY3Rpb25zLnB1c2gobmV3IFNuc0FjdGlvbih0b3BpYykpKTtcbiAgICBjb25zdCBjcml0UHJvcHMgPSBwcm9wcy5jcml0aWNhbEFsYXJtUHJvcHM7XG4gICAgY29uc3QgY3JpdEFjdGlvbnM6IElBbGFybUFjdGlvbltdID0gW107XG4gICAgY3JpdFByb3BzPy5ub3RpZnlBY3Rpb25zPy5mb3JFYWNoKChhY3Rpb24pID0+IGNyaXRBY3Rpb25zLnB1c2goYWN0aW9uKSk7XG4gICAgY3JpdFByb3BzPy5ub3RpZnlUb3BpY3M/LmZvckVhY2goKHRvcGljKSA9PiBjcml0QWN0aW9ucy5wdXNoKG5ldyBTbnNBY3Rpb24odG9waWMpKSk7XG5cbiAgICBpZiAobWF4UmVjZWl2ZUNvdW50ID4gMCkge1xuICAgICAgdGhpcy5tb25pdG9yaW5nLm1vbml0b3JTcXNRdWV1ZVdpdGhEbHEoe1xuICAgICAgICBxdWV1ZTogdGhpcy5xdWV1ZSxcbiAgICAgICAgZGVhZExldHRlclF1ZXVlOiB0aGlzLmRlYWRMZXR0ZXJRdWV1ZSxcbiAgICAgICAgYWRkUXVldWVNaW5TaXplQWxhcm06IHRvQWxhcm1Qcm9wcygnbWluTWVzc2FnZUNvdW50Jywgd2FyblByb3BzPy5taW5TaXplLCBjcml0UHJvcHM/Lm1pblNpemUsIHdhcm5BY3Rpb25zLCBjcml0QWN0aW9ucykgYXMgUmVjb3JkPHN0cmluZywgTWluTWVzc2FnZUNvdW50VGhyZXNob2xkPiB8IHVuZGVmaW5lZCxcbiAgICAgICAgYWRkUXVldWVNYXhTaXplQWxhcm06IHRvQWxhcm1Qcm9wcygnbWF4TWVzc2FnZUNvdW50Jywgd2FyblByb3BzPy5tYXhTaXplLCBjcml0UHJvcHM/Lm1heFNpemUsIHdhcm5BY3Rpb25zLCBjcml0QWN0aW9ucykgYXMgUmVjb3JkPHN0cmluZywgTWF4TWVzc2FnZUNvdW50VGhyZXNob2xkPiB8IHVuZGVmaW5lZCxcbiAgICAgICAgYWRkUXVldWVNYXhNZXNzYWdlQWdlQWxhcm06IHRvQWxhcm1Qcm9wcygnbWF4QWdlSW5TZWNvbmRzJywgd2FyblByb3BzPy5tYXhBZ2U/LnRvU2Vjb25kcygpLCBjcml0UHJvcHM/Lm1heEFnZT8udG9TZWNvbmRzKCksIHdhcm5BY3Rpb25zLCBjcml0QWN0aW9ucywgdW5kZWZpbmVkLCBEdXJhdGlvbi5taW51dGVzKDE1KS50b1NlY29uZHMoKSkgYXMgUmVjb3JkPHN0cmluZywgTWF4TWVzc2FnZUFnZVRocmVzaG9sZD4gfCB1bmRlZmluZWQsXG4gICAgICAgIGFkZFF1ZXVlTWF4VGltZVRvRHJhaW5NZXNzYWdlc0FsYXJtOiB0b0FsYXJtUHJvcHMoJ21heFRpbWVUb0RyYWluJywgd2FyblByb3BzPy5tYXhUaW1lVG9EcmFpbiwgY3JpdFByb3BzPy5tYXhUaW1lVG9EcmFpbiwgd2FybkFjdGlvbnMsIGNyaXRBY3Rpb25zKSBhcyBSZWNvcmQ8c3RyaW5nLCBNYXhUaW1lVG9EcmFpblRocmVzaG9sZD4gfCB1bmRlZmluZWQsXG4gICAgICAgIGFkZFF1ZXVlTWluSW5jb21pbmdNZXNzYWdlc0FsYXJtOiB0b0FsYXJtUHJvcHMoJ21pbkluY29taW5nTWVzc2FnZXNDb3VudCcsIHdhcm5Qcm9wcz8ubWluSW5jb21pbmcsIGNyaXRQcm9wcz8ubWluSW5jb21pbmcsIHdhcm5BY3Rpb25zLCBjcml0QWN0aW9ucykgYXMgUmVjb3JkPHN0cmluZywgTWluSW5jb21pbmdNZXNzYWdlc0NvdW50VGhyZXNob2xkPiB8IHVuZGVmaW5lZCxcbiAgICAgICAgYWRkUXVldWVNYXhJbmNvbWluZ01lc3NhZ2VzQWxhcm06IHRvQWxhcm1Qcm9wcygnbWF4SW5jb21pbmdNZXNzYWdlc0NvdW50Jywgd2FyblByb3BzPy5tYXhJbmNvbWluZywgY3JpdFByb3BzPy5tYXhJbmNvbWluZywgd2FybkFjdGlvbnMsIGNyaXRBY3Rpb25zKSBhcyBSZWNvcmQ8c3RyaW5nLCBNYXhJbmNvbWluZ01lc3NhZ2VzQ291bnRUaHJlc2hvbGQ+IHwgdW5kZWZpbmVkLFxuICAgICAgICBhZGREZWFkTGV0dGVyUXVldWVNYXhTaXplQWxhcm06IHRvQWxhcm1Qcm9wcygnbWF4TWVzc2FnZUNvdW50Jywgd2FyblByb3BzPy5kZWFkTGV0dGVyUXVldWVNYXhTaXplLCBjcml0UHJvcHM/LmRlYWRMZXR0ZXJRdWV1ZU1heFNpemUsIHdhcm5BY3Rpb25zLCBjcml0QWN0aW9ucywgdW5kZWZpbmVkLCAwKSBhcyBSZWNvcmQ8c3RyaW5nLCBNYXhNZXNzYWdlQ291bnRUaHJlc2hvbGQ+IHwgdW5kZWZpbmVkLFxuICAgICAgICBhZGREZWFkTGV0dGVyUXVldWVNYXhNZXNzYWdlQWdlQWxhcm06IHRvQWxhcm1Qcm9wcygnbWF4QWdlSW5TZWNvbmRzJywgd2FyblByb3BzPy5kZWFkTGV0dGVyUXVldWVNYXhBZ2U/LnRvU2Vjb25kcygpLCBjcml0UHJvcHM/LmRlYWRMZXR0ZXJRdWV1ZU1heEFnZT8udG9TZWNvbmRzKCksIHdhcm5BY3Rpb25zLCBjcml0QWN0aW9ucykgYXMgUmVjb3JkPHN0cmluZywgTWF4TWVzc2FnZUFnZVRocmVzaG9sZD4gfCB1bmRlZmluZWQsXG4gICAgICAgIGFkZERlYWRMZXR0ZXJRdWV1ZU1heEluY29taW5nTWVzc2FnZXNBbGFybTogdG9BbGFybVByb3BzKCdtYXhJbmNvbWluZ01lc3NhZ2VzQ291bnQnLCB3YXJuUHJvcHM/LmRlYWRMZXR0ZXJRdWV1ZU1heEluY29taW5nLCBjcml0UHJvcHM/LmRlYWRMZXR0ZXJRdWV1ZU1heEluY29taW5nLCB3YXJuQWN0aW9ucywgY3JpdEFjdGlvbnMpIGFzIFJlY29yZDxzdHJpbmcsIE1heEluY29taW5nTWVzc2FnZXNDb3VudFRocmVzaG9sZD4gfCB1bmRlZmluZWQsXG4gICAgICAgIGFkZERlYWRMZXR0ZXJRdWV1ZVRvU3VtbWFyeURhc2hib2FyZDogdGhpcy5xdWV1ZSAhPT0gdW5kZWZpbmVkLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubW9uaXRvcmluZy5tb25pdG9yU3FzUXVldWUoe1xuICAgICAgICBxdWV1ZTogdGhpcy5xdWV1ZSxcbiAgICAgICAgYWRkUXVldWVNaW5TaXplQWxhcm06IHRvQWxhcm1Qcm9wcygnbWluTWVzc2FnZUNvdW50Jywgd2FyblByb3BzPy5taW5TaXplLCBjcml0UHJvcHM/Lm1pblNpemUsIHdhcm5BY3Rpb25zLCBjcml0QWN0aW9ucykgYXMgUmVjb3JkPHN0cmluZywgTWluTWVzc2FnZUNvdW50VGhyZXNob2xkPiB8IHVuZGVmaW5lZCxcbiAgICAgICAgYWRkUXVldWVNYXhTaXplQWxhcm06IHRvQWxhcm1Qcm9wcygnbWF4TWVzc2FnZUNvdW50Jywgd2FyblByb3BzPy5tYXhTaXplLCBjcml0UHJvcHM/Lm1heFNpemUsIHdhcm5BY3Rpb25zLCBjcml0QWN0aW9ucykgYXMgUmVjb3JkPHN0cmluZywgTWF4TWVzc2FnZUNvdW50VGhyZXNob2xkPiB8IHVuZGVmaW5lZCxcbiAgICAgICAgYWRkUXVldWVNYXhNZXNzYWdlQWdlQWxhcm06IHRvQWxhcm1Qcm9wcygnbWF4QWdlSW5TZWNvbmRzJywgd2FyblByb3BzPy5tYXhBZ2U/LnRvU2Vjb25kcygpLCBjcml0UHJvcHM/Lm1heEFnZT8udG9TZWNvbmRzKCksIHdhcm5BY3Rpb25zLCBjcml0QWN0aW9ucywgdW5kZWZpbmVkLCBEdXJhdGlvbi5taW51dGVzKDE1KS50b1NlY29uZHMoKSkgYXMgUmVjb3JkPHN0cmluZywgTWF4TWVzc2FnZUFnZVRocmVzaG9sZD4gfCB1bmRlZmluZWQsXG4gICAgICAgIGFkZFF1ZXVlTWF4VGltZVRvRHJhaW5NZXNzYWdlc0FsYXJtOiB0b0FsYXJtUHJvcHMoJ21heFRpbWVUb0RyYWluJywgd2FyblByb3BzPy5tYXhUaW1lVG9EcmFpbiwgY3JpdFByb3BzPy5tYXhUaW1lVG9EcmFpbiwgd2FybkFjdGlvbnMsIGNyaXRBY3Rpb25zKSBhcyBSZWNvcmQ8c3RyaW5nLCBNYXhUaW1lVG9EcmFpblRocmVzaG9sZD4gfCB1bmRlZmluZWQsXG4gICAgICAgIGFkZFF1ZXVlTWluSW5jb21pbmdNZXNzYWdlc0FsYXJtOiB0b0FsYXJtUHJvcHMoJ21pbkluY29taW5nTWVzc2FnZXNDb3VudCcsIHdhcm5Qcm9wcz8ubWluSW5jb21pbmcsIGNyaXRQcm9wcz8ubWluSW5jb21pbmcsIHdhcm5BY3Rpb25zLCBjcml0QWN0aW9ucykgYXMgUmVjb3JkPHN0cmluZywgTWluSW5jb21pbmdNZXNzYWdlc0NvdW50VGhyZXNob2xkPiB8IHVuZGVmaW5lZCxcbiAgICAgICAgYWRkUXVldWVNYXhJbmNvbWluZ01lc3NhZ2VzQWxhcm06IHRvQWxhcm1Qcm9wcygnbWF4SW5jb21pbmdNZXNzYWdlc0NvdW50Jywgd2FyblByb3BzPy5tYXhJbmNvbWluZywgY3JpdFByb3BzPy5tYXhJbmNvbWluZywgd2FybkFjdGlvbnMsIGNyaXRBY3Rpb25zKSBhcyBSZWNvcmQ8c3RyaW5nLCBNYXhJbmNvbWluZ01lc3NhZ2VzQ291bnRUaHJlc2hvbGQ+IHwgdW5kZWZpbmVkXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBncmFudENvbnN1bWVNZXNzYWdlcyhncmFudGVlOiBpYW0uSUdyYW50YWJsZSk6IGlhbS5HcmFudCB7XG4gICAgcmV0dXJuIHRoaXMucXVldWUuZ3JhbnRDb25zdW1lTWVzc2FnZXMoZ3JhbnRlZSk7XG4gIH1cblxuICBncmFudFNlbmRNZXNzYWdlcyhncmFudGVlOiBpYW0uSUdyYW50YWJsZSk6IGlhbS5HcmFudCB7XG4gICAgcmV0dXJuIHRoaXMucXVldWUuZ3JhbnRTZW5kTWVzc2FnZXMoZ3JhbnRlZSk7XG4gIH1cblxuICBncmFudFB1cmdlKGdyYW50ZWU6IGlhbS5JR3JhbnRhYmxlKTogaWFtLkdyYW50IHtcbiAgICByZXR1cm4gdGhpcy5xdWV1ZS5ncmFudFB1cmdlKGdyYW50ZWUpO1xuICB9XG5cbiAgZ3JhbnQoZ3JhbnRlZTogaWFtLklHcmFudGFibGUsIC4uLmFjdGlvbnM6IHN0cmluZ1tdKTogaWFtLkdyYW50IHtcbiAgICByZXR1cm4gdGhpcy5xdWV1ZS5ncmFudChncmFudGVlLCAuLi5hY3Rpb25zKTtcbiAgfVxufVxuIl19
package/index.d.ts CHANGED
@@ -2,3 +2,4 @@ export * as aws_cloudwatch from './aws-cloudwatch';
2
2
  export * as aws_lambda from './aws-lambda';
3
3
  export * as aws_monitoring from './aws-monitoring';
4
4
  export * as aws_route53 from './aws-route53';
5
+ export * as aws_sqs from './aws-sqs';
package/index.js CHANGED
@@ -4,4 +4,5 @@ exports.aws_cloudwatch = require("./aws-cloudwatch");
4
4
  exports.aws_lambda = require("./aws-lambda");
5
5
  exports.aws_monitoring = require("./aws-monitoring");
6
6
  exports.aws_route53 = require("./aws-route53");
7
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLHFEQUFtRDtBQUNuRCw2Q0FBMkM7QUFDM0MscURBQW1EO0FBQ25ELCtDQUE2QyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGFzIGF3c19jbG91ZHdhdGNoIGZyb20gJy4vYXdzLWNsb3Vkd2F0Y2gnO1xuZXhwb3J0ICogYXMgYXdzX2xhbWJkYSBmcm9tICcuL2F3cy1sYW1iZGEnO1xuZXhwb3J0ICogYXMgYXdzX21vbml0b3JpbmcgZnJvbSAnLi9hd3MtbW9uaXRvcmluZyc7XG5leHBvcnQgKiBhcyBhd3Nfcm91dGU1MyBmcm9tICcuL2F3cy1yb3V0ZTUzJztcbiJdfQ==
7
+ exports.aws_sqs = require("./aws-sqs");
8
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLHFEQUFtRDtBQUNuRCw2Q0FBMkM7QUFDM0MscURBQW1EO0FBQ25ELCtDQUE2QztBQUM3Qyx1Q0FBcUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBhcyBhd3NfY2xvdWR3YXRjaCBmcm9tICcuL2F3cy1jbG91ZHdhdGNoJztcbmV4cG9ydCAqIGFzIGF3c19sYW1iZGEgZnJvbSAnLi9hd3MtbGFtYmRhJztcbmV4cG9ydCAqIGFzIGF3c19tb25pdG9yaW5nIGZyb20gJy4vYXdzLW1vbml0b3JpbmcnO1xuZXhwb3J0ICogYXMgYXdzX3JvdXRlNTMgZnJvbSAnLi9hd3Mtcm91dGU1Myc7XG5leHBvcnQgKiBhcyBhd3Nfc3FzIGZyb20gJy4vYXdzLXNxcyc7XG4iXX0=
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "truemark-cdk-lib",
3
- "version": "0.0.4",
3
+ "version": "0.0.10",
4
4
  "main": "index.js",
5
5
  "types": "index.d.ts",
6
6
  "scripts": {
@@ -11,29 +11,35 @@
11
11
  "devDependencies": {
12
12
  "@types/jest": "^27.4.1",
13
13
  "@types/node": "10.17.27",
14
- "aws-cdk-lib": "2.23.0",
14
+ "aws-cdk-lib": "2.18.0",
15
15
  "constructs": "10.0.5",
16
16
  "jest": "^27.5.1",
17
17
  "ts-jest": "^27.1.4",
18
18
  "typescript": "~3.9.7"
19
19
  },
20
20
  "peerDependencies": {
21
- "aws-cdk-lib": "2.23.0",
21
+ "aws-cdk-lib": "^2.18.0",
22
22
  "constructs": "^10.0.5"
23
23
  },
24
24
  "exports": {
25
25
  ".": "./index.js",
26
26
  "./package.json": "./package.json",
27
- "./aws-route53": "./aws-route53/index.js",
28
- "./aws-monitoring": "./aws-monitoring/index.js",
27
+ "./aws-cloudwatch": "./aws-cloudwatch/index.js",
29
28
  "./aws-lambda": "./aws-lambda/index.js",
30
- "./aws-cloudwatch": "./aws-cloudwatch/index.js"
29
+ "./aws-monitoring": "./aws-monitoring/index.js",
30
+ "./aws-route53": "./aws-route53/index.js",
31
+ "./aws-sqs": "./aws-sqs/index.js"
31
32
  },
32
33
  "publishConfig": {
33
34
  "access": "public"
34
35
  },
35
36
  "dependencies": {
37
+ "@aws-cdk/aws-apigatewayv2-alpha": "^2.18.0-alpha.0",
38
+ "@aws-cdk/aws-apigatewayv2-integrations-alpha": "^2.18.0-alpha.0",
39
+ "@aws-cdk/aws-appsync-alpha": "^2.18.0-alpha.0",
40
+ "@aws-cdk/aws-redshift-alpha": "^2.18.0-alpha.0",
41
+ "@aws-cdk/aws-synthetics-alpha": "^2.18.0-alpha.0",
36
42
  "cdk-monitoring-constructs": "^1.6.4"
37
43
  },
38
- "gitHead": "21b86e99ab77de7660d53d2a7b504c90af9c3810"
44
+ "gitHead": "9d0ae6c34b288ca6e6397f3ebcdfc09367ec7885"
39
45
  }
@@ -1,164 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.PythonFunction = void 0;
4
- const fs = require("fs");
5
- const aws_lambda_1 = require("aws-cdk-lib/aws-lambda");
6
- const constructs_1 = require("constructs");
7
- const logs = require("aws-cdk-lib/aws-logs");
8
- const aws_cdk_lib_1 = require("aws-cdk-lib");
9
- const cdk_monitoring_constructs_1 = require("cdk-monitoring-constructs");
10
- const aws_cloudwatch_1 = require("../../aws-cloudwatch");
11
- const aws_monitoring_1 = require("../../aws-monitoring");
12
- const aws_cloudwatch_actions_1 = require("aws-cdk-lib/aws-cloudwatch-actions");
13
- const path = require("path");
14
- function toAlarmProps(prop, warningThreshold, criticalThreshold, warningAlarmActions, criticalAlarmActions, warningDefaultThreshold, criticalDefaultThreshold) {
15
- let alarmProps = {};
16
- if (criticalThreshold !== undefined) {
17
- alarmProps.Critical = {
18
- [prop]: criticalThreshold,
19
- actionsEnabled: true,
20
- actionOverride: new aws_monitoring_1.StandardAlarmActionsStrategy({ actions: criticalAlarmActions })
21
- };
22
- }
23
- else if (criticalDefaultThreshold !== undefined) {
24
- alarmProps.Critical = {
25
- [prop]: criticalDefaultThreshold,
26
- actionsEnabled: true,
27
- actionOverride: new aws_monitoring_1.StandardAlarmActionsStrategy({ actions: criticalAlarmActions })
28
- };
29
- }
30
- if (warningThreshold !== undefined) {
31
- alarmProps.Warning = {
32
- [prop]: warningThreshold,
33
- actionsEnabled: true,
34
- actionOverride: new aws_monitoring_1.StandardAlarmActionsStrategy({ actions: warningAlarmActions })
35
- };
36
- }
37
- else if (warningDefaultThreshold !== undefined) {
38
- alarmProps.Warning = {
39
- [prop]: warningDefaultThreshold,
40
- actionsEnabled: true,
41
- actionOverride: new aws_monitoring_1.StandardAlarmActionsStrategy({ actions: warningAlarmActions })
42
- };
43
- }
44
- return Object.keys(alarmProps).length > 0 ? alarmProps : undefined;
45
- }
46
- class PythonFunction extends constructs_1.Construct {
47
- constructor(scope, id, props) {
48
- var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _0, _1, _2, _3;
49
- super(scope, id);
50
- this.monitoring = new cdk_monitoring_constructs_1.MonitoringFacade(this, 'Monitoring', {
51
- metricFactoryDefaults: {},
52
- alarmFactoryDefaults: {
53
- actionsEnabled: true,
54
- alarmNamePrefix: scope.node.path.replace(/\//g, '-'),
55
- },
56
- dashboardFactory: props.dashboardFactory
57
- });
58
- let bundling = fs.existsSync(path.join(props.entry, 'requirements.txt')) ? {
59
- image: (_b = (_a = props.runtime) === null || _a === void 0 ? void 0 : _a.bundlingImage) !== null && _b !== void 0 ? _b : aws_lambda_1.Runtime.PYTHON_3_9.bundlingImage,
60
- command: [
61
- 'bash', '-c', [
62
- 'pip install --target /asset-output/ -r requirements.txt',
63
- 'cp -ra * /asset-output/'
64
- ].join('&&')
65
- ],
66
- outputType: aws_cdk_lib_1.BundlingOutput.NOT_ARCHIVED,
67
- } : undefined;
68
- this.function = new aws_lambda_1.Function(this, id, {
69
- runtime: (_c = props.runtime) !== null && _c !== void 0 ? _c : aws_lambda_1.Runtime.PYTHON_3_9,
70
- tracing: (_d = props.tracing) !== null && _d !== void 0 ? _d : aws_lambda_1.Tracing.PASS_THROUGH,
71
- logRetention: (_e = props.logRetention) !== null && _e !== void 0 ? _e : logs.RetentionDays.THREE_DAYS,
72
- architecture: (_f = props.architecture) !== null && _f !== void 0 ? _f : aws_lambda_1.Architecture.ARM_64,
73
- vpc: props.vpc,
74
- vpcSubnets: props.vpcSubnets,
75
- memorySize: (_g = props.memorySize) !== null && _g !== void 0 ? _g : 768,
76
- timeout: (_h = props.timeout) !== null && _h !== void 0 ? _h : aws_cdk_lib_1.Duration.seconds(30),
77
- environment: props.environment,
78
- description: props.description,
79
- code: aws_lambda_1.Code.fromAsset(props.entry, { bundling }),
80
- handler: ((_j = props.index) !== null && _j !== void 0 ? _j : 'index.py').replace('.py', '') + '.' + ((_k = props.handler) !== null && _k !== void 0 ? _k : 'handler')
81
- });
82
- const warnProps = props.warningAlarmProps;
83
- const warnActions = [];
84
- (_l = warnProps === null || warnProps === void 0 ? void 0 : warnProps.notifyActions) === null || _l === void 0 ? void 0 : _l.forEach((action) => warnActions.push(action));
85
- (_m = warnProps === null || warnProps === void 0 ? void 0 : warnProps.notifyTopics) === null || _m === void 0 ? void 0 : _m.forEach((topic) => warnActions.push(new aws_cloudwatch_actions_1.SnsAction(topic)));
86
- const critProps = props.criticalAlarmProps;
87
- const critActions = [];
88
- (_o = critProps === null || critProps === void 0 ? void 0 : critProps.notifyActions) === null || _o === void 0 ? void 0 : _o.forEach((action) => critActions.push(action));
89
- (_p = critProps === null || critProps === void 0 ? void 0 : critProps.notifyTopics) === null || _p === void 0 ? void 0 : _p.forEach((topic) => critActions.push(new aws_cloudwatch_actions_1.SnsAction(topic)));
90
- this.monitoring.monitorLambdaFunction({
91
- lambdaFunction: this.function,
92
- lambdaInsightsEnabled: true,
93
- addToAlarmDashboard: true,
94
- addToDetailDashboard: true,
95
- addToSummaryDashboard: true,
96
- addLatencyP50Alarm: toAlarmProps('maxLatency', warnProps === null || warnProps === void 0 ? void 0 : warnProps.p50Latency, critProps === null || critProps === void 0 ? void 0 : critProps.p50Latency, warnActions, critActions),
97
- addLatencyP90Alarm: toAlarmProps('maxLatency', warnProps === null || warnProps === void 0 ? void 0 : warnProps.p90Latency, critProps === null || critProps === void 0 ? void 0 : critProps.p90Latency, warnActions, critActions),
98
- addLatencyP99Alarm: toAlarmProps('maxLatency', warnProps === null || warnProps === void 0 ? void 0 : warnProps.p99Latency, critProps === null || critProps === void 0 ? void 0 : critProps.p99Latency, warnActions, critActions),
99
- addFaultCountAlarm: toAlarmProps('maxErrorCount', warnProps === null || warnProps === void 0 ? void 0 : warnProps.maxFaults, critProps === null || critProps === void 0 ? void 0 : critProps.maxFaults, warnActions, critActions, undefined, 0),
100
- addFaultRateAlarm: toAlarmProps('maxErrorRate', warnProps === null || warnProps === void 0 ? void 0 : warnProps.avgFaults, critProps === null || critProps === void 0 ? void 0 : critProps.avgFaults, warnActions, critActions),
101
- addLowTpsAlarm: toAlarmProps('minTps', warnProps === null || warnProps === void 0 ? void 0 : warnProps.minTps, critProps === null || critProps === void 0 ? void 0 : critProps.minTps, warnActions, critActions),
102
- addHighTpsAlarm: toAlarmProps('maxTps', warnProps === null || warnProps === void 0 ? void 0 : warnProps.maxTps, critProps === null || critProps === void 0 ? void 0 : critProps.maxTps, warnActions, critActions),
103
- addThrottlesCountAlarm: toAlarmProps('maxErrorCount', warnProps === null || warnProps === void 0 ? void 0 : warnProps.maxThrottles, critProps === null || critProps === void 0 ? void 0 : critProps.maxThrottles, warnActions, critActions, undefined, 0),
104
- addThrottlesRateAlarm: toAlarmProps('maxErrorRate', warnProps === null || warnProps === void 0 ? void 0 : warnProps.avgThrottles, critProps === null || critProps === void 0 ? void 0 : critProps.avgThrottles, warnActions, critActions),
105
- addConcurrentExecutionsCountAlarm: toAlarmProps('maxRunningTasks', warnProps === null || warnProps === void 0 ? void 0 : warnProps.maxConcurrentExecutions, critProps === null || critProps === void 0 ? void 0 : critProps.maxConcurrentExecutions, warnActions, critActions),
106
- addMaxIteratorAgeAlarm: toAlarmProps('maxAgeInMillis', warnProps === null || warnProps === void 0 ? void 0 : warnProps.maxIteratorAge, critProps === null || critProps === void 0 ? void 0 : critProps.maxIteratorAge, warnActions, critActions),
107
- addEnhancedMonitoringMaxCpuTotalTimeAlarm: toAlarmProps('maxDuration', warnProps === null || warnProps === void 0 ? void 0 : warnProps.maxCpuTime, critProps === null || critProps === void 0 ? void 0 : critProps.maxCpuTime, warnActions, critActions),
108
- addEnhancedMonitoringP90CpuTotalTimeAlarm: toAlarmProps('maxDuration', warnProps === null || warnProps === void 0 ? void 0 : warnProps.p90CpuTime, critProps === null || critProps === void 0 ? void 0 : critProps.p90CpuTime, warnActions, critActions),
109
- addEnhancedMonitoringAvgCpuTotalTimeAlarm: toAlarmProps('maxDuration', warnProps === null || warnProps === void 0 ? void 0 : warnProps.avgCpuTime, critProps === null || critProps === void 0 ? void 0 : critProps.avgCpuTime, warnActions, critActions),
110
- addEnhancedMonitoringMaxMemoryUtilizationAlarm: toAlarmProps('maxUsagePercent', warnProps === null || warnProps === void 0 ? void 0 : warnProps.maxMemory, critProps === null || critProps === void 0 ? void 0 : critProps.maxMemory, warnActions, critActions),
111
- addEnhancedMonitoringP90MemoryUtilizationAlarm: toAlarmProps('maxUsagePercent', warnProps === null || warnProps === void 0 ? void 0 : warnProps.p90Memory, critProps === null || critProps === void 0 ? void 0 : critProps.p90Memory, warnActions, critActions),
112
- addEnhancedMonitoringAvgMemoryUtilizationAlarm: toAlarmProps('maxUsagePercent', warnProps === null || warnProps === void 0 ? void 0 : warnProps.avgMemory, critProps === null || critProps === void 0 ? void 0 : critProps.avgMemory, warnActions, critActions),
113
- });
114
- // Add log monitoring to dashboard
115
- let critMaxLogCount = (_r = (_q = props.criticalAlarmProps) === null || _q === void 0 ? void 0 : _q.maxLogCount) !== null && _r !== void 0 ? _r : 1;
116
- let pattern = '';
117
- if (critMaxLogCount > 0) {
118
- pattern = (_t = (_s = props.criticalAlarmProps) === null || _s === void 0 ? void 0 : _s.dashboardLogPattern) !== null && _t !== void 0 ? _t : PythonFunction.DEFAULT_LOG_INSIGHTS_PATTERN;
119
- }
120
- if (((_u = props.warningAlarmProps) === null || _u === void 0 ? void 0 : _u.maxLogCount) !== undefined && pattern !== props.warningAlarmProps.dashboardLogPattern) {
121
- pattern += (pattern !== '' ? '|' : '') + props.warningAlarmProps.dashboardLogPattern;
122
- }
123
- if (pattern !== '') {
124
- this.monitoring.monitorLog({
125
- logGroupName: this.function.logGroup.logGroupName,
126
- pattern,
127
- });
128
- }
129
- // Add critical log alarm
130
- if (critMaxLogCount > 0) {
131
- this.criticalLogAlarm = new aws_cloudwatch_1.LogAlarm(this, 'LogsCritical', {
132
- logGroup: this.function.logGroup,
133
- pattern: (_w = (_v = props.criticalAlarmProps) === null || _v === void 0 ? void 0 : _v.metricLogPattern) !== null && _w !== void 0 ? _w : PythonFunction.DEFAULT_LOG_METRIC_PATTERN,
134
- threshold: critMaxLogCount,
135
- evaluationPeriods: 3
136
- });
137
- if (((_x = props.criticalAlarmProps) === null || _x === void 0 ? void 0 : _x.notifyActions) !== undefined) {
138
- this.criticalLogAlarm.addAlarmActions(props.criticalAlarmProps.notifyActions);
139
- }
140
- if (((_y = props.criticalAlarmProps) === null || _y === void 0 ? void 0 : _y.notifyTopics) !== undefined) {
141
- this.criticalLogAlarm.addAlarmTopics(props.criticalAlarmProps.notifyTopics);
142
- }
143
- }
144
- // Add warning log alarm
145
- if (((_z = props.warningAlarmProps) === null || _z === void 0 ? void 0 : _z.maxLogCount) !== undefined && props.warningAlarmProps.maxLogCount > 0) {
146
- this.warningLogAlarm = new aws_cloudwatch_1.LogAlarm(this, 'LogsWarning', {
147
- logGroup: this.function.logGroup,
148
- pattern: (_1 = (_0 = props.warningAlarmProps) === null || _0 === void 0 ? void 0 : _0.metricLogPattern) !== null && _1 !== void 0 ? _1 : PythonFunction.DEFAULT_LOG_METRIC_PATTERN,
149
- threshold: props.warningAlarmProps.maxLogCount,
150
- evaluationPeriods: 3
151
- });
152
- if (((_2 = props.warningAlarmProps) === null || _2 === void 0 ? void 0 : _2.notifyActions) !== undefined) {
153
- this.warningLogAlarm.addAlarmActions(props.warningAlarmProps.notifyActions);
154
- }
155
- if (((_3 = props.warningAlarmProps) === null || _3 === void 0 ? void 0 : _3.notifyTopics) !== undefined) {
156
- this.warningLogAlarm.addAlarmTopics(props.warningAlarmProps.notifyTopics);
157
- }
158
- }
159
- }
160
- }
161
- exports.PythonFunction = PythonFunction;
162
- PythonFunction.DEFAULT_LOG_METRIC_PATTERN = '"[ERROR]"';
163
- PythonFunction.DEFAULT_LOG_INSIGHTS_PATTERN = '\\\[ERROR\\\]';
164
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhbmRhcmQtZnVuY3Rpb25zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsic3RhbmRhcmQtZnVuY3Rpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHlCQUF5QjtBQUN6Qix1REFBc0Y7QUFDdEYsMkNBQXFDO0FBQ3JDLDZDQUE2QztBQUU3Qyw2Q0FBc0U7QUFDdEUseUVBYW1DO0FBR25DLHlEQUE4QztBQUM5Qyx5REFBa0U7QUFDbEUsK0VBQTZEO0FBQzdELDZCQUE2QjtBQWtQN0IsU0FBUyxZQUFZLENBQ25CLElBQVksRUFDWixnQkFBb0MsRUFDcEMsaUJBQXFDLEVBQ3JDLG1CQUFvQyxFQUNwQyxvQkFBcUMsRUFDckMsdUJBQTJDLEVBQzNDLHdCQUE0QztJQUU1QyxJQUFJLFVBQVUsR0FBeUMsRUFBRSxDQUFBO0lBQ3pELElBQUksaUJBQWlCLEtBQUssU0FBUyxFQUFFO1FBQ25DLFVBQVUsQ0FBQyxRQUFRLEdBQUc7WUFDcEIsQ0FBQyxJQUFJLENBQUMsRUFBRSxpQkFBaUI7WUFDekIsY0FBYyxFQUFFLElBQUk7WUFDcEIsY0FBYyxFQUFFLElBQUksNkNBQTRCLENBQUMsRUFBQyxPQUFPLEVBQUUsb0JBQW9CLEVBQUMsQ0FBQztTQUNsRixDQUFBO0tBQ0Y7U0FBTSxJQUFJLHdCQUF3QixLQUFLLFNBQVMsRUFBRTtRQUNqRCxVQUFVLENBQUMsUUFBUSxHQUFHO1lBQ3BCLENBQUMsSUFBSSxDQUFDLEVBQUUsd0JBQXdCO1lBQ2hDLGNBQWMsRUFBRSxJQUFJO1lBQ3BCLGNBQWMsRUFBRSxJQUFJLDZDQUE0QixDQUFDLEVBQUMsT0FBTyxFQUFFLG9CQUFvQixFQUFDLENBQUM7U0FDbEYsQ0FBQTtLQUNGO0lBQ0QsSUFBSSxnQkFBZ0IsS0FBSyxTQUFTLEVBQUU7UUFDbEMsVUFBVSxDQUFDLE9BQU8sR0FBRztZQUNuQixDQUFDLElBQUksQ0FBQyxFQUFFLGdCQUFnQjtZQUN4QixjQUFjLEVBQUUsSUFBSTtZQUNwQixjQUFjLEVB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QzthQUM3RTtTQUNGO1FBRUQsd0JBQXdCO1FBQ3hCLElBQUksT0FBQSxLQUFLLENBQUMsaUJBQWlCLDBDQUFFLFdBQVcsTUFBSyxTQUFTLElBQUksS0FBSyxDQUFDLGlCQUFpQixDQUFDLFdBQVcsR0FBRyxDQUFDLEVBQUU7WUFDakcsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLHlCQUFRLENBQUMsSUFBSSxFQUFFLGFBQWEsRUFBRTtnQkFDdkQsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUTtnQkFDaEMsT0FBTyxjQUFFLEtBQUssQ0FBQyxpQkFBaUIsMENBQUUsZ0JBQWdCLG1DQUFFLGNBQWMsQ0FBQywwQkFBMEI7Z0JBQzdGLFNBQVMsRUFBRSxLQUFLLENBQUMsaUJBQWlCLENBQUMsV0FBVztnQkFDOUMsaUJBQWlCLEVBQUUsQ0FBQzthQUNyQixDQUFDLENBQUM7WUFDSCxJQUFJLE9BQUEsS0FBSyxDQUFDLGlCQUFpQiwwQ0FBRSxhQUFhLE1BQUssU0FBUyxFQUFFO2dCQUN4RCxJQUFJLENBQUMsZUFBZSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsaUJBQWlCLENBQUMsYUFBYSxDQUFDLENBQUM7YUFDN0U7WUFDRCxJQUFJLE9BQUEsS0FBSyxDQUFDLGlCQUFpQiwwQ0FBRSxZQUFZLE1BQUssU0FBUyxFQUFFO2dCQUN2RCxJQUFJLENBQUMsZUFBZSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsaUJBQWlCLENBQUMsWUFBWSxDQUFDLENBQUM7YUFDM0U7U0FDRjtJQUNILENBQUM7O0FBaElILHdDQWlJQztBQS9IaUIseUNBQTBCLEdBQUcsV0FBVyxDQUFDO0FBQ3pDLDJDQUE0QixHQUFHLGVBQWUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzJztcbmltcG9ydCB7QXJjaGl0ZWN0dXJlLCBDb2RlLCBGdW5jdGlvbiwgUnVudGltZSwgVHJhY2luZ30gZnJvbSAnYXdzLWNkay1saWIvYXdzLWxhbWJkYSc7XG5pbXBvcnQge0NvbnN0cnVjdH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgKiBhcyBsb2dzIGZyb20gJ2F3cy1jZGstbGliL2F3cy1sb2dzJztcbmltcG9ydCAqIGFzIGVjMiBmcm9tICdhd3MtY2RrLWxpYi9hd3MtZWMyJztcbmltcG9ydCB7QnVuZGxpbmdPcHRpb25zLCBCdW5kbGluZ091dHB1dCwgRHVyYXRpb259IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB7XG4gIEN1c3RvbUFsYXJtVGhyZXNob2xkLFxuICBEdXJhdGlvblRocmVzaG9sZCxcbiAgRXJyb3JDb3VudFRocmVzaG9sZCxcbiAgRXJyb3JSYXRlVGhyZXNob2xkLFxuICBIaWdoVHBzVGhyZXNob2xkLFxuICBJRGFzaGJvYXJkRmFjdG9yeSxcbiAgTGF0ZW5jeVRocmVzaG9sZCxcbiAgTG93VHBzVGhyZXNob2xkLFxuICBNYXhBZ2VUaHJlc2hvbGQsXG4gIE1vbml0b3JpbmdGYWNhZGUsXG4gIFJ1bm5pbmdUYXNrQ291bnRUaHJlc2hvbGQsXG4gIFVzYWdlVGhyZXNob2xkLFxufSBmcm9tICdjZGstbW9uaXRvcmluZy1jb25zdHJ1Y3RzJztcbmltcG9ydCB7SVRvcGljfSBmcm9tICdhd3MtY2RrLWxpYi9hd3Mtc25zJztcbmltcG9ydCB7SUFsYXJtQWN0aW9ufSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtY2xvdWR3YXRjaCc7XG5pbXBvcnQge0xvZ0FsYXJtfSBmcm9tICcuLi8uLi9hd3MtY2xvdWR3YXRjaCc7XG5pbXBvcnQge1N0YW5kYXJkQWxhcm1BY3Rpb25zU3RyYXRlZ3l9IGZyb20gJy4uLy4uL2F3cy1tb25pdG9yaW5nJztcbmltcG9ydCB7U25zQWN0aW9ufSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWNsb3Vkd2F0Y2gtYWN0aW9uc1wiO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tIFwicGF0aFwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIFN0YW5kYXJkRnVuY3Rpb25BbGFybVByb3BzIHtcblxuICAvKipcbiAgICogTWF4aW11bSA1MHRoIHBlcmNlbnRpbGUgbGF0ZW5jeVxuICAgKi9cbiAgcmVhZG9ubHkgcDUwTGF0ZW5jeT86IER1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBNYXhpbXVtIDkwdGggcGVyY2VudGlsZSBsYXRlbmN5XG4gICAqL1xuICByZWFkb25seSBwOTBMYXRlbmN5PzogRHVyYXRpb247XG5cbiAgLyoqXG4gICAqIE1heGltdW0gOTl0aCBwZXJjZW50aWxlIGxhdGVuY3lcbiAgICovXG4gIHJlYWRvbmx5IHA5OUxhdGVuY3k/OiBEdXJhdGlvbjtcblxuICAvKipcbiAgICogTWF4aW11bSBudW1iZXIgb2YgZmF1bHRzXG4gICAqXG4gICAqIEBkZWZhdWx0IDBcbiAgICovXG4gIHJlYWRvbmx5IG1heEZhdWx0cz86IG51bWJlcjtcblxuICAvKipcbiAgICogQXZlcmFnZSBudW1iZXIgb2YgZmF1bHRzXG4gICAqL1xuICByZWFkb25seSBhdmdGYXVsdHM/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIE1pbmltdW0gdHJhbnNhY3Rpb25zXG4gICAqL1xuICByZWFkb25seSBtaW5UcHM/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIE1heGltdW0gdHJhbnNhY3Rpb25zXG4gICAqL1xuICByZWFkb25seSBtYXhUcHM/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIE1heGltdW0gbnVtYmVyIG9mIHRocm90dGxlc1xuICAgKlxuICAgKiBAZGVmYXVsdCAwXG4gICAqL1xuICByZWFkb25seSBtYXhUaHJvdHRsZXM/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEF2ZXJhZ2UgbnVtYmVyIG9mIHRocm90dGxlc1xuICAgKi9cbiAgcmVhZG9ubHkgYXZnVGhyb3R0bGVzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBNYXhpbXVtIGNvbmN1cnJlbnQgZXhlY3V0aW9uc1xuICAgKi9cbiAgcmVhZG9ubHkgbWF4Q29uY3VycmVudEV4ZWN1dGlvbnM/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEFtb3VudCBvZiB0aW1lIGRhdGEgd2FpdHMgYmVmb3JlIGJlaW5nIHByb2Nlc3NlZCBieSB0aGUgZnVuY3Rpb24uXG4gICAqIFNlZSBodHRwczovL2F3cy5hbWF6b24uY29tL3ByZW1pdW1zdXBwb3J0L2tub3dsZWRnZS1jZW50ZXIvbGFtYmRhLWl0ZXJhdG9yLWFnZS9cbiAgICovXG4gIHJlYWRvbmx5IG1heEl0ZXJhdG9yQWdlPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBNYXhpbXVtIGFtb3VudCBvZiBDUFUgdGltZVxuICAgKi9cbiAgcmVhZG9ubHkgbWF4Q3B1VGltZT86IER1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiA5MHRoIHBlcmNlbnRpbGUgQ1BVIHRpbWVcbiAgICovXG4gIHJlYWRvbmx5IHA5MENwdVRpbWU/OiBEdXJhdGlvbjtcblxuICAvKipcbiAgICogQXZlcmFnZSBDUFUgdGltZVxuICAgKi9cbiAgcmVhZG9ubHkgYXZnQ3B1VGltZT86IER1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBNYXhpbXVtIGFtb3VudCBvZiBtZW1vcnlcbiAgICovXG4gIHJlYWRvbmx5IG1heE1lbW9yeT86IG51bWJlcjtcblxuICAvKipcbiAgICogOTB0aCBwZXJjZW50aWxlIG1lbW9yeVxuICAgKi9cbiAgcmVhZG9ubHkgcDkwTWVtb3J5PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBBdmVyYWdlIG1lbW9yeVxuICAgKi9cbiAgcmVhZG9ubHkgYXZnTWVtb3J5PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUb3BpY3MgdG8gc2VuZCBhbGFybSBub3RpZmljYXRpb25zXG4gICAqL1xuICByZWFkb25seSBub3RpZnlUb3BpY3M/OiBbSVRvcGljXTtcblxuICAvKipcbiAgICogQWN0aW9ucyB0byBzZW5kIGFsYXJtIG5vdGlmaWNhdGlvbnNcbiAgICovXG4gIHJlYWRvbmx5IG5vdGlmeUFjdGlvbnM/OiBbSUFsYXJtQWN0aW9uXTtcblxuICAvKipcbiAgICogTG9nIHBhdHRlcm4gdG8gbWF0Y2ggZm9yIG1ldHJpY3MuXG4gICAqXG4gICAqIEBkZWZhdWx0ICdcXFxcXFxbRVJST1JcXFxcXFxdJ1xuICAgKi9cbiAgcmVhZG9ubHkgbWV0cmljTG9nUGF0dGVybj86IHN0cmluZ1xuXG4gIC8qKlxuICAgKiBMb2cgcGF0dGVybiB0byBtYXRjaCBmb3IgdGhlIGRhc2hib2FyZFxuICAgKlxuICAgKiBAZGVmYXVsdCAnXCJbRVJST1JdXCInXG4gICAqL1xuICByZWFkb25seSBkYXNoYm9hcmRMb2dQYXR0ZXJuPzogc3RyaW5nXG5cbiAgLyoqXG4gICAqIE1heGltdW0gbnVtYmVyIG9mIGxvZyBldmVudHMgbWF0Y2hpbmcgdGhlIHBhdHRlcm4uXG4gICAqXG4gICAqIEBkZWZhdWx0IDAgZm9yIENyaXRpY2FsIEFsYXJtXG4gICAqL1xuICByZWFkb25seSBtYXhMb2dDb3VudD86IG51bWJlclxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFN0YW5kYXJkRnVuY3Rpb25Qcm9wcyB7XG5cbiAgLyoqXG4gICAqIEVuYWJsZSBBV1MgWC1SYXkgVHJhY2luZy5cbiAgICpcbiAgICogQGRlZmF1bHQgVHJhY2luZy5QQVNTX1RIUk9VR0hcbiAgICovXG4gIHJlYWRvbmx5IHRyYWNpbmc/OiBUcmFjaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbnVtYmVyIG9mIGRheXMgdG8gcmV0YWluIGxvZ3MuXG4gICAqXG4gICAqIEBkZWZhdWx0IGxvZ3MuUmV0ZW50aW9uRGF5cy5USFJFRV9EQVlTXG4gICAqL1xuICByZWFkb25seSBsb2dSZXRlbnRpb24/OiBsb2dzLlJldGVudGlvbkRheXM7XG5cbiAgLyoqXG4gICAqIFRoZSBzeXN0ZW0gYXJjaGl0ZWN0dXJlLlxuICAgKlxuICAgKiBAZGVmYXVsdCBBcmNoaXRlY3R1cmUuQVJNXzY0XG4gICAqL1xuICByZWFkb25seSBhcmNoaXRlY3R1cmU/OiBBcmNoaXRlY3R1cmU7XG5cbiAgLyoqXG4gICAqIFZQQyBuZXR3b3JrIHRvIHBsYWNlIHRoZSBsYW1iZGEgbmV0d29yayBpbnRlcmZhY2VzXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm90IHBsYWNlZCBpbiBhIFZQQ1xuICAgKi9cbiAgcmVhZG9ubHkgdnBjPzogZWMyLklWcGM7XG5cbiAgLyoqXG4gICAqIFdoZXJlIHRvIHBsYWNlIHRoZSBsYW1iZGEgaW5zaWRlIHRoZSBWUEMuIE9ubHkgdXNlZCBpZiAndnBjJyBpcyBzdXBwbGllZC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBWUEMgZGVmYXVsdCBzdHJhdGVneSBpcyB1c2VkIGlmIG5vdCBzcGVjaWZpZWRcbiAgICovXG4gIHJlYWRvbmx5IHZwY1N1Ym5ldHM/OiBlYzIuU3VibmV0U2VsZWN0aW9uO1xuXG4gIC8qKlxuICAgKiBBbW91bnQgb2YgbWVtb3J5IGluIE1CIGFuZCBwcm9wb3J0aW9uYWxseSBDUFUgcG93ZXIgdG8gYWxsb2NhdGUuXG4gICAqXG4gICAqIEBkZWZhdWx0IDc2OFxuICAgKi9cbiAgcmVhZG9ubHkgbWVtb3J5U2l6ZT86IG51bWJlcjtcblxuICAvKipcbiAgICogRnVuY3Rpb24gZXhlY3V0aW9uIHRpbWUgKGluIHNlY29uZHMpIGFmdGVyIHdoaWNoIHRoZSBMYW1iZGEgdGVybWluYXRlcy5cbiAgICpcbiAgICogQGRlZmF1bHQgRHVyYXRpb24uc2Vjb25kcygzMClcbiAgICovXG4gIHJlYWRvbmx5IHRpbWVvdXQ/OiBEdXJhdGlvbjtcblxuICAvKipcbiAgICogRW52aXJvbm1lbnQgdmFyaWFibGVzIHRvIG1ha2UgYXZhaWxhYmxlLlxuICAgKi9cbiAgcmVhZG9ubHkgZW52aXJvbm1lbnQ/OiB7XG4gICAgW2tleTogc3RyaW5nXTogc3RyaW5nO1xuICB9O1xuXG4gIC8qKlxuICAgKiBBIGRlc2NyaXB0aW9uIG9mIHRoZSBmdW5jdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBEYXNoYm9hcmRGYWN0b3J5IHRvIHVzZSB3aGVuIGdlbmVyYXRpbmcgQ2xvdWRXYXRjaCBkYXNoYm9hcmRzLlxuICAgKlxuICAgKiBJZiBub3QgZGVmaW5lZCwgZGFzaGJvYXJkcyBhcmUgbm90IGdlbmVyYXRlZC5cbiAgICovXG4gIHJlYWRvbmx5IGRhc2hib2FyZEZhY3Rvcnk/OiBJRGFzaGJvYXJkRmFjdG9yeTtcblxuICAvKipcbiAgICogQWxhcm0gdGhyZXNob2xkcyBmb3IgY3JpdGljYWwgYWxhcm1zLlxuICAgKlxuICAgKiBJZiBubyBwcm9wZXJ0aWVzIGFyZSBwcm92aWRlZCwgYSBzZXQgb2YgZGVmYXVsdCBhbGFybXMgYXJlIGNyZWF0ZWQuXG4gICAqL1xuICByZWFkb25seSBjcml0aWNhbEFsYXJtUHJvcHM/OiBTdGFuZGFyZEZ1bmN0aW9uQWxhcm1Qcm9wcztcblxuICAvKipcbiAgICogQWxhcm0gdGhyZXNob2xkIGZvciB3YXJuaW5nIGFsYXJtcy5cbiAgICpcbiAgICogSWYgbm8gcHJvcGVydGllcyBhcmUgcHJvdmlkZWQsIGEgc2V0IG9mIGRlZmF1bHQgYWxhcm1zIGFyZSBjcmVhdGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgd2FybmluZ0FsYXJtUHJvcHM/OiBTdGFuZGFyZEZ1bmN0aW9uQWxhcm1Qcm9wcztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQeXRob25GdW5jdGlvblByb3BzIGV4dGVuZHMgU3RhbmRhcmRGdW5jdGlvblByb3BzIHtcblxuICAvKipcbiAgICogVGhlIHJ1bnRpbWUgZW52aXJvbm1lbnQgZm9yIHRoZSBMYW1iZGEgZnVuY3Rpb24uIE11c3QgYmUgb25lIG9mIHRoZSBQeXRob24gcnVudGltZXMuXG4gICAqXG4gICAqIEBkZWZhdWx0IFJ1bnRpbWUuUFlUSE9OXzNfOVxuICAgKi9cbiAgcmVhZG9ubHkgcnVudGltZT86IFJ1bnRpbWU7XG5cbiAgLyoqXG4gICAqIExvY2F0aW9uIG9uIHRoZSBmaWxlc3lzdGVtIHRoZSBMYW1iZGEgYXNzZXRzIGFyZSBmb3VuZC5cbiAgICpcbiAgICogRXhhbXBsZTogcGF0aC5qb2luKF9fZGlybmFtZSwgJy4uJywgJ215bGFtYmRhJylcbiAgICovXG4gIHJlYWRvbmx5IGVudHJ5OiBzdHJpbmdcblxuICAvKipcbiAgICogRmlsZSBjb250YWluaW5nIHRoZSBoYW5kbGVyLlxuICAgKlxuICAgKiBAZGVmYXVsdCAnaW5kZXgucHknXG4gICAqL1xuICByZWFkb25seSBpbmRleD86IHN0cmluZ1xuXG4gIC8qKlxuICAgKiBFeHBvcnRlZCBoYW5kbGVyIGZ1bmN0aW9uXG4gICAqXG4gICAqIEBkZWZhdWx0ICdoYW5kbGVyJ1xuICAgKi9cbiAgcmVhZG9ubHkgaGFuZGxlcj86IHN0cmluZ1xufVxuXG5mdW5jdGlvbiB0b0FsYXJtUHJvcHMoXG4gIHByb3A6IHN0cmluZyxcbiAgd2FybmluZ1RocmVzaG9sZD86IG51bWJlciB8IER1cmF0aW9uLFxuICBjcml0aWNhbFRocmVzaG9sZD86IG51bWJlciB8IER1cmF0aW9uLFxuICB3YXJuaW5nQWxhcm1BY3Rpb25zPzogSUFsYXJtQWN0aW9uW10sXG4gIGNyaXRpY2FsQWxhcm1BY3Rpb25zPzogSUFsYXJtQWN0aW9uW10sXG4gIHdhcm5pbmdEZWZhdWx0VGhyZXNob2xkPzogbnVtYmVyIHwgRHVyYXRpb24sXG4gIGNyaXRpY2FsRGVmYXVsdFRocmVzaG9sZD86IG51bWJlciB8IER1cmF0aW9uXG4pOiBSZWNvcmQ8c3RyaW5nLCBDdXN0b21BbGFybVRocmVzaG9sZD4gfCB1bmRlZmluZWQge1xuICBsZXQgYWxhcm1Qcm9wczogUmVjb3JkPHN0cmluZywgQ3VzdG9tQWxhcm1UaHJlc2hvbGQ+ID0ge31cbiAgaWYgKGNyaXRpY2FsVGhyZXNob2xkICE9PSB1bmRlZmluZWQpIHtcbiAgICBhbGFybVByb3BzLkNyaXRpY2FsID0ge1xuICAgICAgW3Byb3BdOiBjcml0aWNhbFRocmVzaG9sZCxcbiAgICAgIGFjdGlvbnNFbmFibGVkOiB0cnVlLFxuICAgICAgYWN0aW9uT3ZlcnJpZGU6IG5ldyBTdGFuZGFyZEFsYXJtQWN0aW9uc1N0cmF0ZWd5KHthY3Rpb25zOiBjcml0aWNhbEFsYXJtQWN0aW9uc30pXG4gICAgfVxuICB9IGVsc2UgaWYgKGNyaXRpY2FsRGVmYXVsdFRocmVzaG9sZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgYWxhcm1Qcm9wcy5Dcml0aWNhbCA9IHtcbiAgICAgIFtwcm9wXTogY3JpdGljYWxEZWZhdWx0VGhyZXNob2xkLFxuICAgICAgYWN0aW9uc0VuYWJsZWQ6IHRydWUsXG4gICAgICBhY3Rpb25PdmVycmlkZTogbmV3IFN0YW5kYXJkQWxhcm1BY3Rpb25zU3RyYXRlZ3koe2FjdGlvbnM6IGNyaXRpY2FsQWxhcm1BY3Rpb25zfSlcbiAgICB9XG4gIH1cbiAgaWYgKHdhcm5pbmdUaHJlc2hvbGQgIT09IHVuZGVmaW5lZCkge1xuICAgIGFsYXJtUHJvcHMuV2FybmluZyA9IHtcbiAgICAgIFtwcm9wXTogd2FybmluZ1RocmVzaG9sZCxcbiAgICAgIGFjdGlvbnNFbmFibGVkOiB0cnVlLFxuICAgICAgYWN0aW9uT3ZlcnJpZGU6IG5ldyBTdGFuZGFyZEFsYXJtQWN0aW9uc1N0cmF0ZWd5KHthY3Rpb25zOiB3YXJuaW5nQWxhcm1BY3Rpb25zfSlcbiAgICB9XG4gIH0gZWxzZSBpZiAod2FybmluZ0RlZmF1bHRUaHJlc2hvbGQgIT09IHVuZGVmaW5lZCkge1xuICAgIGFsYXJtUHJvcHMuV2FybmluZyA9IHtcbiAgICAgIFtwcm9wXTogd2FybmluZ0RlZmF1bHRUaHJlc2hvbGQsXG4gICAgICBhY3Rpb25zRW5hYmxlZDogdHJ1ZSxcbiAgICAgIGFjdGlvbk92ZXJyaWRlOiBuZXcgU3RhbmRhcmRBbGFybUFjdGlvbnNTdHJhdGVneSh7YWN0aW9uczogd2FybmluZ0FsYXJtQWN0aW9uc30pXG4gICAgfVxuICB9XG4gIHJldHVybiBPYmplY3Qua2V5cyhhbGFybVByb3BzKS5sZW5ndGggPiAwID8gYWxhcm1Qcm9wcyA6IHVuZGVmaW5lZFxufVxuXG5leHBvcnQgY2xhc3MgUHl0aG9uRnVuY3Rpb24gZXh0ZW5kcyBDb25zdHJ1Y3Qge1xuXG4gIHN0YXRpYyByZWFkb25seSBERUZBVUxUX0xPR19NRVRSSUNfUEFUVEVSTiA9ICdcIltFUlJPUl1cIic7XG4gIHN0YXRpYyByZWFkb25seSBERUZBVUxUX0xPR19JTlNJR0hUU19QQVRURVJOID0gJ1xcXFxcXFtFUlJPUlxcXFxcXF0nO1xuICByZWFkb25seSBkZWNsYXJlIG1vbml0b3Jpbmc6IE1vbml0b3JpbmdGYWNhZGVcbiAgcmVhZG9ubHkgZGVjbGFyZSBmdW5jdGlvbjogRnVuY3Rpb247XG4gIHJlYWRvbmx5IGRlY2xhcmUgY3JpdGljYWxMb2dBbGFybTogTG9nQWxhcm07XG4gIHJlYWRvbmx5IGRlY2xhcmUgd2FybmluZ0xvZ0FsYXJtOiBMb2dBbGFybTtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogUHl0aG9uRnVuY3Rpb25Qcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICB0aGlzLm1vbml0b3JpbmcgPSBuZXcgTW9uaXRvcmluZ0ZhY2FkZSh0aGlzLCAnTW9uaXRvcmluZycsIHtcbiAgICAgIG1ldHJpY0ZhY3RvcnlEZWZhdWx0czoge30sXG4gICAgICBhbGFybUZhY3RvcnlEZWZhdWx0czoge1xuICAgICAgICBhY3Rpb25zRW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgYWxhcm1OYW1lUHJlZml4OiBzY29wZS5ub2RlLnBhdGgucmVwbGFjZSgvXFwvL2csICctJyksXG4gICAgICB9LFxuICAgICAgZGFzaGJvYXJkRmFjdG9yeTogcHJvcHMuZGFzaGJvYXJkRmFjdG9yeVxuICAgIH0pO1xuXG4gICAgbGV0IGJ1bmRsaW5nOiBCdW5kbGluZ09wdGlvbnMgfCB1bmRlZmluZWQgPSBmcy5leGlzdHNTeW5jKHBhdGguam9pbihwcm9wcy5lbnRyeSwgJ3JlcXVpcmVtZW50cy50eHQnKSkgPyB7XG4gICAgICBpbWFnZTogcHJvcHMucnVudGltZT8uYnVuZGxpbmdJbWFnZT8/UnVudGltZS5QWVRIT05fM185LmJ1bmRsaW5nSW1hZ2UsXG4gICAgICBjb21tYW5kOiBbXG4gICAgICAgICdiYXNoJywgJy1jJywgW1xuICAgICAgICAgICdwaXAgaW5zdGFsbCAtLXRhcmdldCAvYXNzZXQtb3V0cHV0LyAtciByZXF1aXJlbWVudHMudHh0JyxcbiAgICAgICAgICAnY3AgLXJhICogL2Fzc2V0LW91dHB1dC8nXG4gICAgICAgIF0uam9pbignJiYnKVxuICAgICAgXSxcbiAgICAgIG91dHB1dFR5cGU6IEJ1bmRsaW5nT3V0cHV0Lk5PVF9BUkNISVZFRCxcbiAgICB9IDogdW5kZWZpbmVkXG5cbiAgICB0aGlzLmZ1bmN0aW9uID0gbmV3IEZ1bmN0aW9uKHRoaXMsIGlkLCB7XG4gICAgICBydW50aW1lOiBwcm9wcy5ydW50aW1lPz9SdW50aW1lLlBZVEhPTl8zXzksXG4gICAgICB0cmFjaW5nOiBwcm9wcy50cmFjaW5nPz9UcmFjaW5nLlBBU1NfVEhST1VHSCxcbiAgICAgIGxvZ1JldGVudGlvbjogcHJvcHMubG9nUmV0ZW50aW9uPz9sb2dzLlJldGVudGlvbkRheXMuVEhSRUVfREFZUyxcbiAgICAgIGFyY2hpdGVjdHVyZTogcHJvcHMuYXJjaGl0ZWN0dXJlPz9BcmNoaXRlY3R1cmUuQVJNXzY0LFxuICAgICAgdnBjOiBwcm9wcy52cGMsXG4gICAgICB2cGNTdWJuZXRzOiBwcm9wcy52cGNTdWJuZXRzLFxuICAgICAgbWVtb3J5U2l6ZTogcHJvcHMubWVtb3J5U2l6ZT8/NzY4LFxuICAgICAgdGltZW91dDogcHJvcHMudGltZW91dD8/RHVyYXRpb24uc2Vjb25kcygzMCksXG4gICAgICBlbnZpcm9ubWVudDogcHJvcHMuZW52aXJvbm1lbnQsXG4gICAgICBkZXNjcmlwdGlvbjogcHJvcHMuZGVzY3JpcHRpb24sXG4gICAgICBjb2RlOiBDb2RlLmZyb21Bc3NldChwcm9wcy5lbnRyeSwge2J1bmRsaW5nfSksXG4gICAgICBoYW5kbGVyOiAocHJvcHMuaW5kZXg/PydpbmRleC5weScpLnJlcGxhY2UoJy5weScsICcnKSArICcuJyArIChwcm9wcy5oYW5kbGVyPz8naGFuZGxlcicpXG4gICAgfSk7XG5cbiAgICBjb25zdCB3YXJuUHJvcHMgPSBwcm9wcy53YXJuaW5nQWxhcm1Qcm9wcztcbiAgICBjb25zdCB3YXJuQWN0aW9uczogSUFsYXJtQWN0aW9uW10gPSBbXTtcbiAgICB3YXJuUHJvcHM/Lm5vdGlmeUFjdGlvbnM/LmZvckVhY2goKGFjdGlvbikgPT4gd2FybkFjdGlvbnMucHVzaChhY3Rpb24pKTtcbiAgICB3YXJuUHJvcHM/Lm5vdGlmeVRvcGljcz8uZm9yRWFjaCgodG9waWMpID0+IHdhcm5BY3Rpb25zLnB1c2gobmV3IFNuc0FjdGlvbih0b3BpYykpKTtcbiAgICBjb25zdCBjcml0UHJvcHMgPSBwcm9wcy5jcml0aWNhbEFsYXJtUHJvcHM7XG4gICAgY29uc3QgY3JpdEFjdGlvbnM6IElBbGFybUFjdGlvbltdID0gW107XG4gICAgY3JpdFByb3BzPy5ub3RpZnlBY3Rpb25zPy5mb3JFYWNoKChhY3Rpb24pID0+IGNyaXRBY3Rpb25zLnB1c2goYWN0aW9uKSk7XG4gICAgY3JpdFByb3BzPy5ub3RpZnlUb3BpY3M/LmZvckVhY2goKHRvcGljKSA9PiBjcml0QWN0aW9ucy5wdXNoKG5ldyBTbnNBY3Rpb24odG9waWMpKSk7XG5cbiAgICB0aGlzLm1vbml0b3JpbmcubW9uaXRvckxhbWJkYUZ1bmN0aW9uKHtcbiAgICAgIGxhbWJkYUZ1bmN0aW9uOiB0aGlzLmZ1bmN0aW9uLFxuICAgICAgbGFtYmRhSW5zaWdodHNFbmFibGVkOiB0cnVlLFxuICAgICAgYWRkVG9BbGFybURhc2hib2FyZDogdHJ1ZSxcbiAgICAgIGFkZFRvRGV0YWlsRGFzaGJvYXJkOiB0cnVlLFxuICAgICAgYWRkVG9TdW1tYXJ5RGFzaGJvYXJkOiB0cnVlLFxuICAgICAgYWRkTGF0ZW5jeVA1MEFsYXJtOiB0b0FsYXJtUHJvcHMoJ21heExhdGVuY3knLCB3YXJuUHJvcHM/LnA1MExhdGVuY3ksIGNyaXRQcm9wcz8ucDUwTGF0ZW5jeSwgd2FybkFjdGlvbnMsIGNyaXRBY3Rpb25zKSBhcyBSZWNvcmQ8c3RyaW5nLCBMYXRlbmN5VGhyZXNob2xkPixcbiAgICAgIGFkZExhdGVuY3lQOTBBbGFybTogdG9BbGFybVByb3BzKCdtYXhMYXRlbmN5Jywgd2FyblByb3BzPy5wOTBMYXRlbmN5LCBjcml0UHJvcHM/LnA5MExhdGVuY3ksIHdhcm5BY3Rpb25zLCBjcml0QWN0aW9ucykgYXMgUmVjb3JkPHN0cmluZywgTGF0ZW5jeVRocmVzaG9sZD4sXG4gICAgICBhZGRMYXRlbmN5UDk5QWxhcm06IHRvQWxhcm1Qcm9wcygnbWF4TGF0ZW5jeScsIHdhcm5Qcm9wcz8ucDk5TGF0ZW5jeSwgY3JpdFByb3BzPy5wOTlMYXRlbmN5LCB3YXJuQWN0aW9ucywgY3JpdEFjdGlvbnMpIGFzIFJlY29yZDxzdHJpbmcsIExhdGVuY3lUaHJlc2hvbGQ+LFxuICAgICAgYWRkRmF1bHRDb3VudEFsYXJtOiB0b0FsYXJtUHJvcHMoJ21heEVycm9yQ291bnQnLCB3YXJuUHJvcHM/Lm1heEZhdWx0cywgY3JpdFByb3BzPy5tYXhGYXVsdHMsIHdhcm5BY3Rpb25zLCBjcml0QWN0aW9ucywgdW5kZWZpbmVkLCAwKSBhcyBSZWNvcmQ8c3RyaW5nLCBFcnJvckNvdW50VGhyZXNob2xkPixcbiAgICAgIGFkZEZhdWx0UmF0ZUFsYXJtOiB0b0FsYXJtUHJvcHMoJ21heEVycm9yUmF0ZScsIHdhcm5Qcm9wcz8uYXZnRmF1bHRzLCBjcml0UHJvcHM/LmF2Z0ZhdWx0cywgd2FybkFjdGlvbnMsIGNyaXRBY3Rpb25zKSBhcyBSZWNvcmQ8c3RyaW5nLCBFcnJvclJhdGVUaHJlc2hvbGQ+LFxuICAgICAgYWRkTG93VHBzQWxhcm06IHRvQWxhcm1Qcm9wcygnbWluVHBzJywgd2FyblByb3BzPy5taW5UcHMsIGNyaXRQcm9wcz8ubWluVHBzLCB3YXJuQWN0aW9ucywgY3JpdEFjdGlvbnMpIGFzIFJlY29yZDxzdHJpbmcsIExvd1Rwc1RocmVzaG9sZD4sXG4gICAgICBhZGRIaWdoVHBzQWxhcm06IHRvQWxhcm1Qcm9wcygnbWF4VHBzJywgd2FyblByb3BzPy5tYXhUcHMsIGNyaXRQcm9wcz8ubWF4VHBzLCB3YXJuQWN0aW9ucywgY3JpdEFjdGlvbnMpIGFzIFJlY29yZDxzdHJpbmcsIEhpZ2hUcHNUaHJlc2hvbGQ+LFxuICAgICAgYWRkVGhyb3R0bGVzQ291bnRBbGFybTogdG9BbGFybVByb3BzKCdtYXhFcnJvckNvdW50Jywgd2FyblByb3BzPy5tYXhUaHJvdHRsZXMsIGNyaXRQcm9wcz8ubWF4VGhyb3R0bGVzLCB3YXJuQWN0aW9ucywgY3JpdEFjdGlvbnMsIHVuZGVmaW5lZCwgMCkgYXMgUmVjb3JkPHN0cmluZywgRXJyb3JDb3VudFRocmVzaG9sZD4sXG4gICAgICBhZGRUaHJvdHRsZXNSYXRlQWxhcm06IHRvQWxhcm1Qcm9wcygnbWF4RXJyb3JSYXRlJywgd2FyblByb3BzPy5hdmdUaHJvdHRsZXMsIGNyaXRQcm9wcz8uYXZnVGhyb3R0bGVzLCB3YXJuQWN0aW9ucywgY3JpdEFjdGlvbnMpIGFzIFJlY29yZDxzdHJpbmcsIEVycm9yUmF0ZVRocmVzaG9sZD4sXG4gICAgICBhZGRDb25jdXJyZW50RXhlY3V0aW9uc0NvdW50QWxhcm06IHRvQWxhcm1Qcm9wcygnbWF4UnVubmluZ1Rhc2tzJywgd2FyblByb3BzPy5tYXhDb25jdXJyZW50RXhlY3V0aW9ucywgY3JpdFByb3BzPy5tYXhDb25jdXJyZW50RXhlY3V0aW9ucywgd2FybkFjdGlvbnMsIGNyaXRBY3Rpb25zKSBhcyBSZWNvcmQ8c3RyaW5nLCBSdW5uaW5nVGFza0NvdW50VGhyZXNob2xkPixcbiAgICAgIGFkZE1heEl0ZXJhdG9yQWdlQWxhcm06IHRvQWxhcm1Qcm9wcygnbWF4QWdlSW5NaWxsaXMnLCB3YXJuUHJvcHM/Lm1heEl0ZXJhdG9yQWdlLCBjcml0UHJvcHM/Lm1heEl0ZXJhdG9yQWdlLCB3YXJuQWN0aW9ucywgY3JpdEFjdGlvbnMpIGFzIFJlY29yZDxzdHJpbmcsIE1heEFnZVRocmVzaG9sZD4sXG4gICAgICBhZGRFbmhhbmNlZE1vbml0b3JpbmdNYXhDcHVUb3RhbFRpbWVBbGFybTogdG9BbGFybVByb3BzKCdtYXhEdXJhdGlvbicsIHdhcm5Qcm9wcz8ubWF4Q3B1VGltZSwgY3JpdFByb3BzPy5tYXhDcHVUaW1lLCB3YXJuQWN0aW9ucywgY3JpdEFjdGlvbnMpIGFzIFJlY29yZDxzdHJpbmcsIER1cmF0aW9uVGhyZXNob2xkPixcbiAgICAgIGFkZEVuaGFuY2VkTW9uaXRvcmluZ1A5MENwdVRvdGFsVGltZUFsYXJtOiB0b0FsYXJtUHJvcHMoJ21heER1cmF0aW9uJywgd2FyblByb3BzPy5wOTBDcHVUaW1lLCBjcml0UHJvcHM/LnA5MENwdVRpbWUsIHdhcm5BY3Rpb25zLCBjcml0QWN0aW9ucykgYXMgUmVjb3JkPHN0cmluZywgRHVyYXRpb25UaHJlc2hvbGQ+LFxuICAgICAgYWRkRW5oYW5jZWRNb25pdG9yaW5nQXZnQ3B1VG90YWxUaW1lQWxhcm06IHRvQWxhcm1Qcm9wcygnbWF4RHVyYXRpb24nLCB3YXJuUHJvcHM/LmF2Z0NwdVRpbWUsIGNyaXRQcm9wcz8uYXZnQ3B1VGltZSwgd2FybkFjdGlvbnMsIGNyaXRBY3Rpb25zKSBhcyAgUmVjb3JkPHN0cmluZywgRHVyYXRpb25UaHJlc2hvbGQ+LFxuICAgICAgYWRkRW5oYW5jZWRNb25pdG9yaW5nTWF4TWVtb3J5VXRpbGl6YXRpb25BbGFybTogdG9BbGFybVByb3BzKCdtYXhVc2FnZVBlcmNlbnQnLCB3YXJuUHJvcHM/Lm1heE1lbW9yeSwgY3JpdFByb3BzPy5tYXhNZW1vcnksIHdhcm5BY3Rpb25zLCBjcml0QWN0aW9ucykgYXMgIFJlY29yZDxzdHJpbmcsIFVzYWdlVGhyZXNob2xkPixcbiAgICAgIGFkZEVuaGFuY2VkTW9uaXRvcmluZ1A5ME1lbW9yeVV0aWxpemF0aW9uQWxhcm06IHRvQWxhcm1Qcm9wcygnbWF4VXNhZ2VQZXJjZW50Jywgd2FyblByb3BzPy5wOTBNZW1vcnksIGNyaXRQcm9wcz8ucDkwTWVtb3J5LCB3YXJuQWN0aW9ucywgY3JpdEFjdGlvbnMpIGFzIFJlY29yZDxzdHJpbmcsIFVzYWdlVGhyZXNob2xkPixcbiAgICAgIGFkZEVuaGFuY2VkTW9uaXRvcmluZ0F2Z01lbW9yeVV0aWxpemF0aW9uQWxhcm06IHRvQWxhcm1Qcm9wcygnbWF4VXNhZ2VQZXJjZW50Jywgd2FyblByb3BzPy5hdmdNZW1vcnksIGNyaXRQcm9wcz8uYXZnTWVtb3J5LCB3YXJuQWN0aW9ucywgY3JpdEFjdGlvbnMpIGFzIFJlY29yZDxzdHJpbmcsIFVzYWdlVGhyZXNob2xkPixcbiAgICB9KTtcblxuICAgIC8vIEFkZCBsb2cgbW9uaXRvcmluZyB0byBkYXNoYm9hcmRcbiAgICBsZXQgY3JpdE1heExvZ0NvdW50ID0gcHJvcHMuY3JpdGljYWxBbGFybVByb3BzPy5tYXhMb2dDb3VudD8/MVxuICAgIGxldCBwYXR0ZXJuID0gJyc7XG4gICAgaWYgKGNyaXRNYXhMb2dDb3VudCA+IDApIHtcbiAgICAgIHBhdHRlcm4gPSBwcm9wcy5jcml0aWNhbEFsYXJtUHJvcHM/LmRhc2hib2FyZExvZ1BhdHRlcm4/P1B5dGhvbkZ1bmN0aW9uLkRFRkFVTFRfTE9HX0lOU0lHSFRTX1BBVFRFUk5cbiAgICB9XG4gICAgaWYgKHByb3BzLndhcm5pbmdBbGFybVByb3BzPy5tYXhMb2dDb3VudCAhPT0gdW5kZWZpbmVkICYmIHBhdHRlcm4gIT09IHByb3BzLndhcm5pbmdBbGFybVByb3BzLmRhc2hib2FyZExvZ1BhdHRlcm4pIHtcbiAgICAgIHBhdHRlcm4gKz0gKHBhdHRlcm4gIT09ICcnID8gJ3wnIDogJycpICsgcHJvcHMud2FybmluZ0FsYXJtUHJvcHMuZGFzaGJvYXJkTG9nUGF0dGVyblxuICAgIH1cbiAgICBpZiAocGF0dGVybiAhPT0gJycpIHtcbiAgICAgIHRoaXMubW9uaXRvcmluZy5tb25pdG9yTG9nKHtcbiAgICAgICAgbG9nR3JvdXBOYW1lOiB0aGlzLmZ1bmN0aW9uLmxvZ0dyb3VwLmxvZ0dyb3VwTmFtZSxcbiAgICAgICAgcGF0dGVybixcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIEFkZCBjcml0aWNhbCBsb2cgYWxhcm1cbiAgICBpZiAoY3JpdE1heExvZ0NvdW50ID4gMCkge1xuICAgICAgdGhpcy5jcml0aWNhbExvZ0FsYXJtID0gbmV3IExvZ0FsYXJtKHRoaXMsICdMb2dzQ3JpdGljYWwnLCB7XG4gICAgICAgIGxvZ0dyb3VwOiB0aGlzLmZ1bmN0aW9uLmxvZ0dyb3VwLFxuICAgICAgICBwYXR0ZXJuOiBwcm9wcy5jcml0aWNhbEFsYXJtUHJvcHM/Lm1ldHJpY0xvZ1BhdHRlcm4/P1B5dGhvbkZ1bmN0aW9uLkRFRkFVTFRfTE9HX01FVFJJQ19QQVRURVJOLFxuICAgICAgICB0aHJlc2hvbGQ6IGNyaXRNYXhMb2dDb3VudCxcbiAgICAgICAgZXZhbHVhdGlvblBlcmlvZHM6IDNcbiAgICAgIH0pO1xuICAgICAgaWYgKHByb3BzLmNyaXRpY2FsQWxhcm1Qcm9wcz8ubm90aWZ5QWN0aW9ucyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRoaXMuY3JpdGljYWxMb2dBbGFybS5hZGRBbGFybUFjdGlvbnMocHJvcHMuY3JpdGljYWxBbGFybVByb3BzLm5vdGlmeUFjdGlvbnMpO1xuICAgICAgfVxuICAgICAgaWYgKHByb3BzLmNyaXRpY2FsQWxhcm1Qcm9wcz8ubm90aWZ5VG9waWNzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy5jcml0aWNhbExvZ0FsYXJtLmFkZEFsYXJtVG9waWNzKHByb3BzLmNyaXRpY2FsQWxhcm1Qcm9wcy5ub3RpZnlUb3BpY3MpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEFkZCB3YXJuaW5nIGxvZyBhbGFybVxuICAgIGlmIChwcm9wcy53YXJuaW5nQWxhcm1Qcm9wcz8ubWF4TG9nQ291bnQgIT09IHVuZGVmaW5lZCAmJiBwcm9wcy53YXJuaW5nQWxhcm1Qcm9wcy5tYXhMb2dDb3VudCA+IDApIHtcbiAgICAgIHRoaXMud2FybmluZ0xvZ0FsYXJtID0gbmV3IExvZ0FsYXJtKHRoaXMsICdMb2dzV2FybmluZycsIHtcbiAgICAgICAgbG9nR3JvdXA6IHRoaXMuZnVuY3Rpb24ubG9nR3JvdXAsXG4gICAgICAgIHBhdHRlcm46IHByb3BzLndhcm5pbmdBbGFybVByb3BzPy5tZXRyaWNMb2dQYXR0ZXJuPz9QeXRob25GdW5jdGlvbi5ERUZBVUxUX0xPR19NRVRSSUNfUEFUVEVSTixcbiAgICAgICAgdGhyZXNob2xkOiBwcm9wcy53YXJuaW5nQWxhcm1Qcm9wcy5tYXhMb2dDb3VudCxcbiAgICAgICAgZXZhbHVhdGlvblBlcmlvZHM6IDNcbiAgICAgIH0pO1xuICAgICAgaWYgKHByb3BzLndhcm5pbmdBbGFybVByb3BzPy5ub3RpZnlBY3Rpb25zICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhpcy53YXJuaW5nTG9nQWxhcm0uYWRkQWxhcm1BY3Rpb25zKHByb3BzLndhcm5pbmdBbGFybVByb3BzLm5vdGlmeUFjdGlvbnMpO1xuICAgICAgfVxuICAgICAgaWYgKHByb3BzLndhcm5pbmdBbGFybVByb3BzPy5ub3RpZnlUb3BpY3MgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLndhcm5pbmdMb2dBbGFybS5hZGRBbGFybVRvcGljcyhwcm9wcy53YXJuaW5nQWxhcm1Qcm9wcy5ub3RpZnlUb3BpY3MpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIl19