@digitraffic/common 2022.10.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (199) hide show
  1. package/LICENSE +291 -0
  2. package/aws/infra/api/integration.d.ts +21 -0
  3. package/aws/infra/api/integration.js +52 -0
  4. package/aws/infra/api/response.d.ts +22 -0
  5. package/aws/infra/api/response.js +61 -0
  6. package/aws/infra/api/responses.d.ts +39 -0
  7. package/aws/infra/api/responses.js +79 -0
  8. package/aws/infra/api/static-integration.d.ts +15 -0
  9. package/aws/infra/api/static-integration.js +54 -0
  10. package/aws/infra/canaries/canary-alarm.d.ts +6 -0
  11. package/aws/infra/canaries/canary-alarm.js +26 -0
  12. package/aws/infra/canaries/canary-parameters.d.ts +18 -0
  13. package/aws/infra/canaries/canary-parameters.js +3 -0
  14. package/aws/infra/canaries/canary-role.d.ts +6 -0
  15. package/aws/infra/canaries/canary-role.js +46 -0
  16. package/aws/infra/canaries/canary.d.ts +8 -0
  17. package/aws/infra/canaries/canary.js +29 -0
  18. package/aws/infra/canaries/database-canary.d.ts +18 -0
  19. package/aws/infra/canaries/database-canary.js +55 -0
  20. package/aws/infra/canaries/database-checker.d.ts +21 -0
  21. package/aws/infra/canaries/database-checker.js +109 -0
  22. package/aws/infra/canaries/url-canary.d.ts +19 -0
  23. package/aws/infra/canaries/url-canary.js +46 -0
  24. package/aws/infra/canaries/url-checker.d.ts +46 -0
  25. package/aws/infra/canaries/url-checker.js +238 -0
  26. package/aws/infra/documentation.d.ts +56 -0
  27. package/aws/infra/documentation.js +95 -0
  28. package/aws/infra/scheduler.d.ts +12 -0
  29. package/aws/infra/scheduler.js +31 -0
  30. package/aws/infra/security-rule.d.ts +12 -0
  31. package/aws/infra/security-rule.js +39 -0
  32. package/aws/infra/sqs-integration.d.ts +7 -0
  33. package/aws/infra/sqs-integration.js +93 -0
  34. package/aws/infra/sqs-queue.d.ts +16 -0
  35. package/aws/infra/sqs-queue.js +130 -0
  36. package/aws/infra/stack/lambda-configs.d.ts +72 -0
  37. package/aws/infra/stack/lambda-configs.js +93 -0
  38. package/aws/infra/stack/monitoredfunction.d.ts +84 -0
  39. package/aws/infra/stack/monitoredfunction.js +135 -0
  40. package/aws/infra/stack/rest_apis.d.ts +40 -0
  41. package/aws/infra/stack/rest_apis.js +179 -0
  42. package/aws/infra/stack/stack-checking-aspect.d.ts +20 -0
  43. package/aws/infra/stack/stack-checking-aspect.js +163 -0
  44. package/aws/infra/stack/stack.d.ts +41 -0
  45. package/aws/infra/stack/stack.js +58 -0
  46. package/aws/infra/stack/subscription.d.ts +17 -0
  47. package/aws/infra/stack/subscription.js +41 -0
  48. package/aws/infra/usage-plans.d.ts +15 -0
  49. package/aws/infra/usage-plans.js +42 -0
  50. package/aws/runtime/apikey.d.ts +2 -0
  51. package/aws/runtime/apikey.js +13 -0
  52. package/aws/runtime/digitraffic-integration-response.d.ts +8 -0
  53. package/aws/runtime/digitraffic-integration-response.js +26 -0
  54. package/aws/runtime/messaging.d.ts +10 -0
  55. package/aws/runtime/messaging.js +31 -0
  56. package/aws/runtime/s3.d.ts +2 -0
  57. package/aws/runtime/s3.js +30 -0
  58. package/aws/runtime/secrets/dbsecret.d.ts +54 -0
  59. package/aws/runtime/secrets/dbsecret.js +96 -0
  60. package/aws/runtime/secrets/proxy-holder.d.ts +9 -0
  61. package/aws/runtime/secrets/proxy-holder.js +26 -0
  62. package/aws/runtime/secrets/rds-holder.d.ts +9 -0
  63. package/aws/runtime/secrets/rds-holder.js +26 -0
  64. package/aws/runtime/secrets/secret-holder.d.ts +26 -0
  65. package/aws/runtime/secrets/secret-holder.js +73 -0
  66. package/aws/runtime/secrets/secret.d.ts +8 -0
  67. package/aws/runtime/secrets/secret.js +43 -0
  68. package/aws/types/errors.d.ts +4 -0
  69. package/aws/types/errors.js +9 -0
  70. package/aws/types/lambda-response.d.ts +12 -0
  71. package/aws/types/lambda-response.js +28 -0
  72. package/aws/types/mediatypes.d.ts +10 -0
  73. package/aws/types/mediatypes.js +15 -0
  74. package/aws/types/model-with-reference.d.ts +7 -0
  75. package/aws/types/model-with-reference.js +3 -0
  76. package/aws/types/proxytypes.d.ts +26 -0
  77. package/aws/types/proxytypes.js +3 -0
  78. package/aws/types/tags.d.ts +2 -0
  79. package/aws/types/tags.js +7 -0
  80. package/database/cached.d.ts +7 -0
  81. package/database/cached.js +32 -0
  82. package/database/database.d.ts +19 -0
  83. package/database/database.js +62 -0
  84. package/database/last-updated.d.ts +16 -0
  85. package/database/last-updated.js +54 -0
  86. package/index.d.ts +1 -0
  87. package/index.js +18 -0
  88. package/marine/id_utils.d.ts +3 -0
  89. package/marine/id_utils.js +33 -0
  90. package/marine/rtz.d.ts +48 -0
  91. package/marine/rtz.js +3 -0
  92. package/package.json +55 -0
  93. package/src/aws/infra/api/integration.js +52 -0
  94. package/src/aws/infra/api/response.js +61 -0
  95. package/src/aws/infra/api/responses.js +79 -0
  96. package/src/aws/infra/api/static-integration.js +54 -0
  97. package/src/aws/infra/canaries/canary-alarm.js +26 -0
  98. package/src/aws/infra/canaries/canary-parameters.js +3 -0
  99. package/src/aws/infra/canaries/canary-role.js +46 -0
  100. package/src/aws/infra/canaries/canary.js +29 -0
  101. package/src/aws/infra/canaries/database-canary.js +55 -0
  102. package/src/aws/infra/canaries/database-checker.js +109 -0
  103. package/src/aws/infra/canaries/url-canary.js +46 -0
  104. package/src/aws/infra/canaries/url-checker.js +238 -0
  105. package/src/aws/infra/documentation.js +95 -0
  106. package/src/aws/infra/scheduler.js +31 -0
  107. package/src/aws/infra/security-rule.js +39 -0
  108. package/src/aws/infra/sqs-integration.js +93 -0
  109. package/src/aws/infra/sqs-queue.js +130 -0
  110. package/src/aws/infra/stack/lambda-configs.js +93 -0
  111. package/src/aws/infra/stack/monitoredfunction.js +135 -0
  112. package/src/aws/infra/stack/rest_apis.js +179 -0
  113. package/src/aws/infra/stack/stack-checking-aspect.js +163 -0
  114. package/src/aws/infra/stack/stack.js +58 -0
  115. package/src/aws/infra/stack/subscription.js +41 -0
  116. package/src/aws/infra/usage-plans.js +42 -0
  117. package/src/aws/runtime/apikey.js +13 -0
  118. package/src/aws/runtime/digitraffic-integration-response.js +26 -0
  119. package/src/aws/runtime/messaging.js +31 -0
  120. package/src/aws/runtime/s3.js +30 -0
  121. package/src/aws/runtime/secrets/dbsecret.js +96 -0
  122. package/src/aws/runtime/secrets/proxy-holder.js +26 -0
  123. package/src/aws/runtime/secrets/rds-holder.js +26 -0
  124. package/src/aws/runtime/secrets/secret-holder.js +73 -0
  125. package/src/aws/runtime/secrets/secret.js +43 -0
  126. package/src/aws/types/errors.js +9 -0
  127. package/src/aws/types/lambda-response.js +28 -0
  128. package/src/aws/types/mediatypes.js +15 -0
  129. package/src/aws/types/model-with-reference.js +3 -0
  130. package/src/aws/types/proxytypes.js +3 -0
  131. package/src/aws/types/tags.js +7 -0
  132. package/src/database/cached.js +32 -0
  133. package/src/database/database.js +62 -0
  134. package/src/database/last-updated.js +54 -0
  135. package/src/marine/id_utils.js +33 -0
  136. package/src/marine/rtz.js +3 -0
  137. package/src/test/asserter.js +45 -0
  138. package/src/test/db-testutils.js +31 -0
  139. package/src/test/httpserver.js +67 -0
  140. package/src/test/secret.js +25 -0
  141. package/src/test/secrets-manager.js +59 -0
  142. package/src/test/testutils.js +44 -0
  143. package/src/types/input-error.js +7 -0
  144. package/src/types/language.js +10 -0
  145. package/src/types/traffictype.js +13 -0
  146. package/src/types/validator.js +14 -0
  147. package/src/utils/api-model.js +129 -0
  148. package/src/utils/base64.js +21 -0
  149. package/src/utils/date-utils.js +34 -0
  150. package/src/utils/geojson-types.js +18 -0
  151. package/src/utils/geometry.js +140 -0
  152. package/src/utils/retry.js +50 -0
  153. package/src/utils/slack.js +25 -0
  154. package/src/utils/utils.js +40 -0
  155. package/test/asserter.d.ts +11 -0
  156. package/test/asserter.js +45 -0
  157. package/test/db-testutils.d.ts +2 -0
  158. package/test/db-testutils.js +31 -0
  159. package/test/httpserver.d.ts +18 -0
  160. package/test/httpserver.js +67 -0
  161. package/test/marine/id_utils.test.js +69 -0
  162. package/test/promise/promise.test.js +125 -0
  163. package/test/secret.d.ts +3 -0
  164. package/test/secret.js +25 -0
  165. package/test/secrets/dbsecret.test.js +71 -0
  166. package/test/secrets/secret-holder.test.js +124 -0
  167. package/test/secrets/secret.test.js +66 -0
  168. package/test/secrets-manager.d.ts +9 -0
  169. package/test/secrets-manager.js +59 -0
  170. package/test/test/httpserver.test.js +87 -0
  171. package/test/testutils.d.ts +12 -0
  172. package/test/testutils.js +44 -0
  173. package/test/utils/date-utils.test.js +51 -0
  174. package/test/utils/geometry.test.js +49 -0
  175. package/test/utils/utils.test.js +49 -0
  176. package/types/input-error.d.ts +2 -0
  177. package/types/input-error.js +7 -0
  178. package/types/language.d.ts +5 -0
  179. package/types/language.js +10 -0
  180. package/types/traffictype.d.ts +8 -0
  181. package/types/traffictype.js +13 -0
  182. package/types/validator.d.ts +4 -0
  183. package/types/validator.js +14 -0
  184. package/utils/api-model.d.ts +87 -0
  185. package/utils/api-model.js +129 -0
  186. package/utils/base64.d.ts +12 -0
  187. package/utils/base64.js +21 -0
  188. package/utils/date-utils.d.ts +17 -0
  189. package/utils/date-utils.js +34 -0
  190. package/utils/geojson-types.d.ts +14 -0
  191. package/utils/geojson-types.js +18 -0
  192. package/utils/geometry.d.ts +36 -0
  193. package/utils/geometry.js +140 -0
  194. package/utils/retry.d.ts +13 -0
  195. package/utils/retry.js +50 -0
  196. package/utils/slack.d.ts +5 -0
  197. package/utils/slack.js +25 -0
  198. package/utils/utils.d.ts +22 -0
  199. package/utils/utils.js +40 -0
@@ -0,0 +1,135 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MonitoredDBFunction = exports.MonitoredFunction = void 0;
4
+ const aws_lambda_1 = require("aws-cdk-lib/aws-lambda");
5
+ const aws_cloudwatch_actions_1 = require("aws-cdk-lib/aws-cloudwatch-actions");
6
+ const aws_cloudwatch_1 = require("aws-cdk-lib/aws-cloudwatch");
7
+ const lambda_configs_1 = require("../stack/lambda-configs");
8
+ const change_case_1 = require("change-case");
9
+ const subscription_1 = require("../stack/subscription");
10
+ /**
11
+ * Creates a Lambda function that monitors default CloudWatch Lambda metrics with CloudWatch Alarms.
12
+ */
13
+ class MonitoredFunction extends aws_lambda_1.Function {
14
+ /**
15
+ * @param scope Stack
16
+ * @param id Lambda construct Id
17
+ * @param functionProps Lambda function properties
18
+ * @param alarmSnsTopic SNS topic for alarms
19
+ * @param warningSnsTopic SNS topic for warnings
20
+ * @param production Is the stack a production stack, used for determining the alarm topic
21
+ * @param trafficType Traffic type, used for alarm names. Set to null if Lambda is not related to any traffic type.
22
+ * @param props Monitored function properties
23
+ */
24
+ constructor(scope, id, functionProps, alarmSnsTopic, warningSnsTopic, production, trafficType, props) {
25
+ super(scope, id, functionProps);
26
+ this.givenName = functionProps.functionName;
27
+ const alarmSnsAction = new aws_cloudwatch_actions_1.SnsAction(alarmSnsTopic);
28
+ const warningSnsAction = new aws_cloudwatch_actions_1.SnsAction(warningSnsTopic);
29
+ if (props?.durationAlarmProps?.create !== false) {
30
+ if (!functionProps.timeout) {
31
+ throw new Error('Timeout needs to be explicitly set');
32
+ }
33
+ this.createAlarm(scope, this.metricDuration().with({ statistic: 'max' }), 'Duration', 'Duration alarm', `Duration has exceeded ${functionProps.timeout.toSeconds()} seconds`, trafficType, this.getAlarmActionForEnv(alarmSnsAction, warningSnsAction, production), functionProps.timeout.toMilliseconds(), 1, 1, aws_cloudwatch_1.ComparisonOperator.GREATER_THAN_OR_EQUAL_TO_THRESHOLD, props?.durationAlarmProps);
34
+ }
35
+ if (props?.durationWarningProps?.create !== false) {
36
+ if (!functionProps.timeout) {
37
+ throw new Error('Timeout needs to be explicitly set');
38
+ }
39
+ this.createAlarm(scope, this.metricDuration().with({ statistic: 'max' }), 'Duration-Warning', 'Duration warning', `Duration is 85 % of max ${functionProps.timeout.toSeconds()} seconds`, trafficType, warningSnsAction, functionProps.timeout.toMilliseconds() * 0.85, 1, 1, aws_cloudwatch_1.ComparisonOperator.GREATER_THAN_OR_EQUAL_TO_THRESHOLD, props?.durationWarningProps);
40
+ }
41
+ if (props?.errorAlarmProps?.create !== false) {
42
+ this.createAlarm(scope, this.metricErrors(), 'Errors', 'Errors alarm', 'Invocations did not succeed', trafficType, this.getAlarmActionForEnv(alarmSnsAction, warningSnsAction, production), 1, 1, 1, aws_cloudwatch_1.ComparisonOperator.GREATER_THAN_OR_EQUAL_TO_THRESHOLD, props?.errorAlarmProps);
43
+ }
44
+ if (props?.throttleAlarmProps?.create !== false) {
45
+ this.createAlarm(scope, this.metricThrottles(), 'Throttles', 'Throttles alarm', 'Has throttled', trafficType, this.getAlarmActionForEnv(alarmSnsAction, warningSnsAction, production), 0, 1, 1, aws_cloudwatch_1.ComparisonOperator.GREATER_THAN_THRESHOLD, props?.throttleAlarmProps);
46
+ }
47
+ }
48
+ /**
49
+ * Create new MonitoredFunction. Use topics from given DigitrafficStack.
50
+ *
51
+ * @param stack DigitrafficStack
52
+ * @param id Lambda construct Id
53
+ * @param functionProps Lambda function properties
54
+ * @param props Monitored function properties
55
+ */
56
+ static create(stack, id, functionProps, props) {
57
+ if (props === MonitoredFunction.DISABLE_ALARMS && stack.configuration.production) {
58
+ throw new Error(`Function ${functionProps.functionName} has DISABLE_ALARMS. Remove before installing to production or define your own properties!`);
59
+ }
60
+ return new MonitoredFunction(stack, id, functionProps, stack.alarmTopic, stack.warningTopic, stack.configuration.production, stack.configuration.trafficType, props);
61
+ }
62
+ /**
63
+ * Create new MonitoredFunction. Use topics from given DigitrafficStack. Generate names from given name and configuration shortName.
64
+ *
65
+ * For example, shortName FOO and given name update-things will create function FOO-UpdateThings and use code from lambda/update-things/update-things.ts method handler.
66
+ *
67
+ * @param stack DigitrafficStack
68
+ * @param name param-case name
69
+ * @param environment Lambda environment
70
+ * @param functionParameters Lambda function parameters
71
+ */
72
+ static createV2(stack, name, environment, functionParameters) {
73
+ const functionName = functionParameters?.functionName || `${stack.configuration.shortName}-${(0, change_case_1.pascalCase)(name)}`;
74
+ const functionProps = (0, lambda_configs_1.databaseFunctionProps)(stack, environment, functionName, name, functionParameters);
75
+ return MonitoredFunction.create(stack, functionName, functionProps, functionParameters);
76
+ }
77
+ createAlarm(stack, metric, alarmId, alarmName, alarmDescription, trafficType, alarmSnsAction, threshold, evaluationPeriods, datapointsToAlarm, comparisonOperator, alarmProps) {
78
+ metric.createAlarm(stack, `${this.node.id}-${alarmId}`, {
79
+ alarmName: `${trafficType ?? ''} ${stack.stackName} ${this.functionName} ${alarmName}`.trim(),
80
+ alarmDescription,
81
+ threshold: alarmProps?.threshold ?? threshold,
82
+ evaluationPeriods: alarmProps?.evaluationPeriods ?? evaluationPeriods,
83
+ datapointsToAlarm: alarmProps?.datapointsToAlarm ?? datapointsToAlarm,
84
+ comparisonOperator: alarmProps?.comparisonOperator ?? comparisonOperator,
85
+ }).addAlarmAction(alarmSnsAction);
86
+ }
87
+ getAlarmActionForEnv(alarmAction, warningAction, production) {
88
+ return production ? alarmAction : warningAction;
89
+ }
90
+ }
91
+ exports.MonitoredFunction = MonitoredFunction;
92
+ /** disable all alarms */
93
+ MonitoredFunction.DISABLE_ALARMS = {
94
+ durationAlarmProps: {
95
+ create: false,
96
+ },
97
+ durationWarningProps: {
98
+ create: false,
99
+ },
100
+ errorAlarmProps: {
101
+ create: false,
102
+ },
103
+ throttleAlarmProps: {
104
+ create: false,
105
+ },
106
+ };
107
+ class MonitoredDBFunction {
108
+ /**
109
+ * Create new MonitoredDBFunction. Use topics from given DigitrafficStack. Generate names from given name and configuration shortName.
110
+ * Grant secret and create log subscription.
111
+ *
112
+ * For example, shortName FOO and given name update-things will create function FOO-UpdateThings and use code from lambda/update-things/update-things.ts method handler.
113
+ *
114
+ * If you don't need to pass any extra arguments to lambda-environment, you can leave environment out and this function will create the
115
+ * default Lambda Environment with SECRET_ID and DB_APPLICATION.
116
+ *
117
+ * @param stack DigitrafficStack
118
+ * @param name param-case name
119
+ * @param environment Lambda environment
120
+ * @param functionParameters Lambda function parameters
121
+ */
122
+ static create(stack, name, environment, functionParameters) {
123
+ const functionName = functionParameters?.functionName || `${stack.configuration.shortName}-${(0, change_case_1.pascalCase)(name)}`;
124
+ const env = environment ? environment : stack.createLambdaEnvironment();
125
+ const functionProps = (0, lambda_configs_1.databaseFunctionProps)(stack, env, functionName, name, functionParameters);
126
+ const mf = MonitoredFunction.create(stack, functionName, functionProps, functionParameters);
127
+ stack.grantSecret(mf);
128
+ if (stack.configuration.logsDestinationArn) {
129
+ new subscription_1.DigitrafficLogSubscriptions(stack, mf);
130
+ }
131
+ return mf;
132
+ }
133
+ }
134
+ exports.MonitoredDBFunction = MonitoredDBFunction;
135
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9uaXRvcmVkZnVuY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvYXdzL2luZnJhL3N0YWNrL21vbml0b3JlZGZ1bmN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHVEQUErRDtBQUUvRCwrRUFBNkQ7QUFDN0QsK0RBQXNFO0FBR3RFLDREQUE4RztBQUM5Ryw2Q0FBdUM7QUFDdkMsd0RBQWtFO0FBK0JsRTs7R0FFRztBQUNILE1BQWEsaUJBQWtCLFNBQVEscUJBQVE7SUFzRTNDOzs7Ozs7Ozs7T0FTRztJQUNILFlBQ0ksS0FBWSxFQUNaLEVBQVUsRUFDVixhQUE0QixFQUM1QixhQUFxQixFQUNyQixlQUF1QixFQUN2QixVQUFtQixFQUNuQixXQUErQixFQUMvQixLQUE4QjtRQUU5QixLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxhQUFhLENBQUMsQ0FBQztRQUVoQyxJQUFJLENBQUMsU0FBUyxHQUFHLGFBQWEsQ0FBQyxZQUFzQixDQUFDO1FBRXRELE1BQU0sY0FBYyxHQUFHLElBQUksa0NBQVMsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUNwRCxNQUFNLGdCQUFnQixHQUFHLElBQUksa0NBQVMsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUV4RCxJQUFJLEtBQUssRUFBRSxrQkFBa0IsRUFBRSxNQUFNLEtBQUssS0FBSyxFQUFFO1lBQzdDLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxFQUFFO2dCQUN4QixNQUFNLElBQUksS0FBSyxDQUFDLG9DQUFvQyxDQUFDLENBQUM7YUFDekQ7WUFFRCxJQUFJLENBQUMsV0FBVyxDQUNaLEtBQUssRUFDTCxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUMsU0FBUyxFQUFFLEtBQUssRUFBQyxDQUFDLEVBQzlDLFVBQVUsRUFDVixnQkFBZ0IsRUFDaEIseUJBQXlCLGFBQWEsQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLFVBQVUs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QixDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztTQUM5QztRQUVELE9BQU8sRUFBRSxDQUFDO0lBQ2QsQ0FBQztDQUNKO0FBbkNELGtEQW1DQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7RnVuY3Rpb24sIEZ1bmN0aW9uUHJvcHN9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1sYW1iZGEnO1xuaW1wb3J0IHtTdGFja30gZnJvbSBcImF3cy1jZGstbGliXCI7XG5pbXBvcnQge1Nuc0FjdGlvbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1jbG91ZHdhdGNoLWFjdGlvbnNcIjtcbmltcG9ydCB7Q29tcGFyaXNvbk9wZXJhdG9yLCBNZXRyaWN9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtY2xvdWR3YXRjaFwiO1xuaW1wb3J0IHtEaWdpdHJhZmZpY1N0YWNrfSBmcm9tIFwiLi4vc3RhY2svc3RhY2tcIjtcbmltcG9ydCB7SVRvcGljfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXNuc1wiO1xuaW1wb3J0IHtkYXRhYmFzZUZ1bmN0aW9uUHJvcHMsIExhbWJkYUVudmlyb25tZW50LCBNb25pdG9yZWRGdW5jdGlvblBhcmFtZXRlcnN9IGZyb20gXCIuLi9zdGFjay9sYW1iZGEtY29uZmlnc1wiO1xuaW1wb3J0IHtwYXNjYWxDYXNlfSBmcm9tIFwiY2hhbmdlLWNhc2VcIjtcbmltcG9ydCB7RGlnaXRyYWZmaWNMb2dTdWJzY3JpcHRpb25zfSBmcm9tIFwiLi4vc3RhY2svc3Vic2NyaXB0aW9uXCI7XG5pbXBvcnQge1RyYWZmaWNUeXBlfSBmcm9tIFwiLi4vLi4vLi4vdHlwZXMvdHJhZmZpY3R5cGVcIjtcblxuLyoqXG4gKiBBbGxvd3MgY3VzdG9taXphdGlvbiBvZiBDbG91ZFdhdGNoIEFsYXJtIHByb3BlcnRpZXNcbiAqL1xuZXhwb3J0IHR5cGUgTW9uaXRvcmVkRnVuY3Rpb25BbGFybVByb3BzID0ge1xuICAgIC8qKlxuICAgICAqIFNldHRpbmcgdGhpcyB0byBmYWxzZSB3aWxsIG5vdCBjcmVhdGUgYSBDbG91ZFdhdGNoIGFsYXJtXG4gICAgICovXG4gICAgcmVhZG9ubHkgY3JlYXRlOiBib29sZWFuXG5cbiAgICByZWFkb25seSB0aHJlc2hvbGQ/OiBudW1iZXJcblxuICAgIHJlYWRvbmx5IGV2YWx1YXRpb25QZXJpb2RzPzogbnVtYmVyXG5cbiAgICByZWFkb25seSBkYXRhcG9pbnRzVG9BbGFybT86IG51bWJlclxuXG4gICAgcmVhZG9ubHkgY29tcGFyaXNvbk9wZXJhdG9yPzogQ29tcGFyaXNvbk9wZXJhdG9yXG59XG5cbmV4cG9ydCB0eXBlIE1vbml0b3JlZEZ1bmN0aW9uUHJvcHMgPSB7XG4gICAgcmVhZG9ubHkgZHVyYXRpb25BbGFybVByb3BzPzogTW9uaXRvcmVkRnVuY3Rpb25BbGFybVByb3BzXG5cbiAgICByZWFkb25seSBkdXJhdGlvbldhcm5pbmdQcm9wcz86IE1vbml0b3JlZEZ1bmN0aW9uQWxhcm1Qcm9wc1xuXG4gICAgcmVhZG9ubHkgZXJyb3JBbGFybVByb3BzPzogTW9uaXRvcmVkRnVuY3Rpb25BbGFybVByb3BzXG5cbiAgICByZWFkb25seSB0aHJvdHRsZUFsYXJtUHJvcHM/OiBNb25pdG9yZWRGdW5jdGlvbkFsYXJtUHJvcHNcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgTGFtYmRhIGZ1bmN0aW9uIHRoYXQgbW9uaXRvcnMgZGVmYXVsdCBDbG91ZFdhdGNoIExhbWJkYSBtZXRyaWNzIHdpdGggQ2xvdWRXYXRjaCBBbGFybXMuXG4gKi9cbmV4cG9ydCBjbGFzcyBNb25pdG9yZWRGdW5jdGlvbiBleHRlbmRzIEZ1bmN0aW9uIHtcbiAgICByZWFkb25seSBnaXZlbk5hbWU6IHN0cmluZztcblxuICAgIC8qKiBkaXNhYmxlIGFsbCBhbGFybXMgKi9cbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IERJU0FCTEVfQUxBUk1TOiBNb25pdG9yZWRGdW5jdGlvblByb3BzID0ge1xuICAgICAgICBkdXJhdGlvbkFsYXJtUHJvcHM6IHtcbiAgICAgICAgICAgIGNyZWF0ZTogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgICAgIGR1cmF0aW9uV2FybmluZ1Byb3BzOiB7XG4gICAgICAgICAgICBjcmVhdGU6IGZhbHNlLFxuICAgICAgICB9LFxuICAgICAgICBlcnJvckFsYXJtUHJvcHM6IHtcbiAgICAgICAgICAgIGNyZWF0ZTogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgICAgIHRocm90dGxlQWxhcm1Qcm9wczoge1xuICAgICAgICAgICAgY3JlYXRlOiBmYWxzZSxcbiAgICAgICAgfSxcbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlIG5ldyBNb25pdG9yZWRGdW5jdGlvbi4gIFVzZSB0b3BpY3MgZnJvbSBnaXZlbiBEaWdpdHJhZmZpY1N0YWNrLlxuICAgICAqXG4gICAgICogQHBhcmFtIHN0YWNrIERpZ2l0cmFmZmljU3RhY2tcbiAgICAgKiBAcGFyYW0gaWQgTGFtYmRhIGNvbnN0cnVjdCBJZFxuICAgICAqIEBwYXJhbSBmdW5jdGlvblByb3BzIExhbWJkYSBmdW5jdGlvbiBwcm9wZXJ0aWVzXG4gICAgICogQHBhcmFtIHByb3BzIE1vbml0b3JlZCBmdW5jdGlvbiBwcm9wZXJ0aWVzXG4gICAgICovXG4gICAgc3RhdGljIGNyZWF0ZShzdGFjazogRGlnaXRyYWZmaWNTdGFjayxcbiAgICAgICAgaWQ6IHN0cmluZyxcbiAgICAgICAgZnVuY3Rpb25Qcm9wczogRnVuY3Rpb25Qcm9wcyxcbiAgICAgICAgcHJvcHM/OiBNb25pdG9yZWRGdW5jdGlvblByb3BzKTogTW9uaXRvcmVkRnVuY3Rpb24ge1xuXG4gICAgICAgIGlmIChwcm9wcyA9PT0gTW9uaXRvcmVkRnVuY3Rpb24uRElTQUJMRV9BTEFSTVMgJiYgc3RhY2suY29uZmlndXJhdGlvbi5wcm9kdWN0aW9uKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZ1bmN0aW9uICR7ZnVuY3Rpb25Qcm9wcy5mdW5jdGlvbk5hbWV9IGhhcyBESVNBQkxFX0FMQVJNUy4gIFJlbW92ZSBiZWZvcmUgaW5zdGFsbGluZyB0byBwcm9kdWN0aW9uIG9yIGRlZmluZSB5b3VyIG93biBwcm9wZXJ0aWVzIWApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBNb25pdG9yZWRGdW5jdGlvbihcbiAgICAgICAgICAgIHN0YWNrLFxuICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICBmdW5jdGlvblByb3BzLFxuICAgICAgICAgICAgc3RhY2suYWxhcm1Ub3BpYyxcbiAgICAgICAgICAgIHN0YWNrLndhcm5pbmdUb3BpYyxcbiAgICAgICAgICAgIHN0YWNrLmNvbmZpZ3VyYXRpb24ucHJvZHVjdGlvbixcbiAgICAgICAgICAgIHN0YWNrLmNvbmZpZ3VyYXRpb24udHJhZmZpY1R5cGUsXG4gICAgICAgICAgICBwcm9wcyxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgbmV3IE1vbml0b3JlZEZ1bmN0aW9uLiAgVXNlIHRvcGljcyBmcm9tIGdpdmVuIERpZ2l0cmFmZmljU3RhY2suICBHZW5lcmF0ZSBuYW1lcyBmcm9tIGdpdmVuIG5hbWUgYW5kIGNvbmZpZ3VyYXRpb24gc2hvcnROYW1lLlxuICAgICAqXG4gICAgICogRm9yIGV4YW1wbGUsIHNob3J0TmFtZSBGT08gYW5kIGdpdmVuIG5hbWUgdXBkYXRlLXRoaW5ncyB3aWxsIGNyZWF0ZSBmdW5jdGlvbiBGT08tVXBkYXRlVGhpbmdzIGFuZCB1c2UgY29kZSBmcm9tIGxhbWJkYS91cGRhdGUtdGhpbmdzL3VwZGF0ZS10aGluZ3MudHMgbWV0aG9kIGhhbmRsZXIuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gc3RhY2sgRGlnaXRyYWZmaWNTdGFja1xuICAgICAqIEBwYXJhbSBuYW1lIHBhcmFtLWNhc2UgbmFtZVxuICAgICAqIEBwYXJhbSBlbnZpcm9ubWVudCBMYW1iZGEgZW52aXJvbm1lbnRcbiAgICAgKiBAcGFyYW0gZnVuY3Rpb25QYXJhbWV0ZXJzIExhbWJkYSBmdW5jdGlvbiBwYXJhbWV0ZXJzXG4gICAgICovXG4gICAgc3RhdGljIGNyZWF0ZVYyKHN0YWNrOiBEaWdpdHJhZmZpY1N0YWNrLFxuICAgICAgICBuYW1lOiBzdHJpbmcsXG4gICAgICAgIGVudmlyb25tZW50OiBMYW1iZGFFbnZpcm9ubWVudCxcbiAgICAgICAgZnVuY3Rpb25QYXJhbWV0ZXJzPzogTW9uaXRvcmVkRnVuY3Rpb25QYXJhbWV0ZXJzKTogTW9uaXRvcmVkRnVuY3Rpb24ge1xuICAgICAgICBjb25zdCBmdW5jdGlvbk5hbWUgPSBmdW5jdGlvblBhcmFtZXRlcnM/LmZ1bmN0aW9uTmFtZSB8fCBgJHtzdGFjay5jb25maWd1cmF0aW9uLnNob3J0TmFtZX0tJHtwYXNjYWxDYXNlKG5hbWUpfWA7XG4gICAgICAgIGNvbnN0IGZ1bmN0aW9uUHJvcHMgPSBkYXRhYmFzZUZ1bmN0aW9uUHJvcHMoXG4gICAgICAgICAgICBzdGFjaywgZW52aXJvbm1lbnQsIGZ1bmN0aW9uTmFtZSwgbmFtZSwgZnVuY3Rpb25QYXJhbWV0ZXJzLFxuICAgICAgICApO1xuXG4gICAgICAgIHJldHVybiBNb25pdG9yZWRGdW5jdGlvbi5jcmVhdGUoc3RhY2ssIGZ1bmN0aW9uTmFtZSwgZnVuY3Rpb25Qcm9wcywgZnVuY3Rpb25QYXJhbWV0ZXJzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gc2NvcGUgU3RhY2tcbiAgICAgKiBAcGFyYW0gaWQgTGFtYmRhIGNvbnN0cnVjdCBJZFxuICAgICAqIEBwYXJhbSBmdW5jdGlvblByb3BzIExhbWJkYSBmdW5jdGlvbiBwcm9wZXJ0aWVzXG4gICAgICogQHBhcmFtIGFsYXJtU25zVG9waWMgU05TIHRvcGljIGZvciBhbGFybXNcbiAgICAgKiBAcGFyYW0gd2FybmluZ1Nuc1RvcGljIFNOUyB0b3BpYyBmb3Igd2FybmluZ3NcbiAgICAgKiBAcGFyYW0gcHJvZHVjdGlvbiBJcyB0aGUgc3RhY2sgYSBwcm9kdWN0aW9uIHN0YWNrLCB1c2VkIGZvciBkZXRlcm1pbmluZyB0aGUgYWxhcm0gdG9waWNcbiAgICAgKiBAcGFyYW0gdHJhZmZpY1R5cGUgVHJhZmZpYyB0eXBlLCB1c2VkIGZvciBhbGFybSBuYW1lcy4gU2V0IHRvIG51bGwgaWYgTGFtYmRhIGlzIG5vdCByZWxhdGVkIHRvIGFueSB0cmFmZmljIHR5cGUuXG4gICAgICogQHBhcmFtIHByb3BzIE1vbml0b3JlZCBmdW5jdGlvbiBwcm9wZXJ0aWVzXG4gICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHNjb3BlOiBTdGFjayxcbiAgICAgICAgaWQ6IHN0cmluZyxcbiAgICAgICAgZnVuY3Rpb25Qcm9wczogRnVuY3Rpb25Qcm9wcyxcbiAgICAgICAgYWxhcm1TbnNUb3BpYzogSVRvcGljLFxuICAgICAgICB3YXJuaW5nU25zVG9waWM6IElUb3BpYyxcbiAgICAgICAgcHJvZHVjdGlvbjogYm9vbGVhbixcbiAgICAgICAgdHJhZmZpY1R5cGU6IFRyYWZmaWNUeXBlIHwgbnVsbCxcbiAgICAgICAgcHJvcHM/OiBNb25pdG9yZWRGdW5jdGlvblByb3BzLFxuICAgICkge1xuICAgICAgICBzdXBlcihzY29wZSwgaWQsIGZ1bmN0aW9uUHJvcHMpO1xuXG4gICAgICAgIHRoaXMuZ2l2ZW5OYW1lID0gZnVuY3Rpb25Qcm9wcy5mdW5jdGlvbk5hbWUgYXMgc3RyaW5nO1xuXG4gICAgICAgIGNvbnN0IGFsYXJtU25zQWN0aW9uID0gbmV3IFNuc0FjdGlvbihhbGFybVNuc1RvcGljKTtcbiAgICAgICAgY29uc3Qgd2FybmluZ1Nuc0FjdGlvbiA9IG5ldyBTbnNBY3Rpb24od2FybmluZ1Nuc1RvcGljKTtcblxuICAgICAgICBpZiAocHJvcHM/LmR1cmF0aW9uQWxhcm1Qcm9wcz8uY3JlYXRlICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgaWYgKCFmdW5jdGlvblByb3BzLnRpbWVvdXQpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RpbWVvdXQgbmVlZHMgdG8gYmUgZXhwbGljaXRseSBzZXQnKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5jcmVhdGVBbGFybShcbiAgICAgICAgICAgICAgICBzY29wZSxcbiAgICAgICAgICAgICAgICB0aGlzLm1ldHJpY0R1cmF0aW9uKCkud2l0aCh7c3RhdGlzdGljOiAnbWF4J30pLFxuICAgICAgICAgICAgICAgICdEdXJhdGlvbicsXG4gICAgICAgICAgICAgICAgJ0R1cmF0aW9uIGFsYXJtJyxcbiAgICAgICAgICAgICAgICBgRHVyYXRpb24gaGFzIGV4Y2VlZGVkICR7ZnVuY3Rpb25Qcm9wcy50aW1lb3V0LnRvU2Vjb25kcygpfSBzZWNvbmRzYCxcbiAgICAgICAgICAgICAgICB0cmFmZmljVHlwZSxcbiAgICAgICAgICAgICAgICB0aGlzLmdldEFsYXJtQWN0aW9uRm9yRW52KGFsYXJtU25zQWN0aW9uLCB3YXJuaW5nU25zQWN0aW9uLCBwcm9kdWN0aW9uKSxcbiAgICAgICAgICAgICAgICBmdW5jdGlvblByb3BzLnRpbWVvdXQudG9NaWxsaXNlY29uZHMoKSxcbiAgICAgICAgICAgICAgICAxLFxuICAgICAgICAgICAgICAgIDEsXG4gICAgICAgICAgICAgICAgQ29tcGFyaXNvbk9wZXJhdG9yLkdSRUFURVJfVEhBTl9PUl9FUVVBTF9UT19USFJFU0hPTEQsXG4gICAgICAgICAgICAgICAgcHJvcHM/LmR1cmF0aW9uQWxhcm1Qcm9wcyxcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb3BzPy5kdXJhdGlvbldhcm5pbmdQcm9wcz8uY3JlYXRlICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgaWYgKCFmdW5jdGlvblByb3BzLnRpbWVvdXQpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RpbWVvdXQgbmVlZHMgdG8gYmUgZXhwbGljaXRseSBzZXQnKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5jcmVhdGVBbGFybShcbiAgICAgICAgICAgICAgICBzY29wZSxcbiAgICAgICAgICAgICAgICB0aGlzLm1ldHJpY0R1cmF0aW9uKCkud2l0aCh7c3RhdGlzdGljOiAnbWF4J30pLFxuICAgICAgICAgICAgICAgICdEdXJhdGlvbi1XYXJuaW5nJyxcbiAgICAgICAgICAgICAgICAnRHVyYXRpb24gd2FybmluZycsXG4gICAgICAgICAgICAgICAgYER1cmF0aW9uIGlzIDg1ICUgb2YgbWF4ICR7ZnVuY3Rpb25Qcm9wcy50aW1lb3V0LnRvU2Vjb25kcygpfSBzZWNvbmRzYCxcbiAgICAgICAgICAgICAgICB0cmFmZmljVHlwZSxcbiAgICAgICAgICAgICAgICB3YXJuaW5nU25zQWN0aW9uLFxuICAgICAgICAgICAgICAgIGZ1bmN0aW9uUHJvcHMudGltZW91dC50b01pbGxpc2Vjb25kcygpICogMC44NSxcbiAgICAgICAgICAgICAgICAxLFxuICAgICAgICAgICAgICAgIDEsXG4gICAgICAgICAgICAgICAgQ29tcGFyaXNvbk9wZXJhdG9yLkdSRUFURVJfVEhBTl9PUl9FUVVBTF9UT19USFJFU0hPTEQsXG4gICAgICAgICAgICAgICAgcHJvcHM/LmR1cmF0aW9uV2FybmluZ1Byb3BzLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwcm9wcz8uZXJyb3JBbGFybVByb3BzPy5jcmVhdGUgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICB0aGlzLmNyZWF0ZUFsYXJtKFxuICAgICAgICAgICAgICAgIHNjb3BlLFxuICAgICAgICAgICAgICAgIHRoaXMubWV0cmljRXJyb3JzKCksXG4gICAgICAgICAgICAgICAgJ0Vycm9ycycsXG4gICAgICAgICAgICAgICAgJ0Vycm9ycyBhbGFybScsXG4gICAgICAgICAgICAgICAgJ0ludm9jYXRpb25zIGRpZCBub3Qgc3VjY2VlZCcsXG4gICAgICAgICAgICAgICAgdHJhZmZpY1R5cGUsXG4gICAgICAgICAgICAgICAgdGhpcy5nZXRBbGFybUFjdGlvbkZvckVudihhbGFybVNuc0FjdGlvbiwgd2FybmluZ1Nuc0FjdGlvbiwgcHJvZHVjdGlvbiksXG4gICAgICAgICAgICAgICAgMSxcbiAgICAgICAgICAgICAgICAxLFxuICAgICAgICAgICAgICAgIDEsXG4gICAgICAgICAgICAgICAgQ29tcGFyaXNvbk9wZXJhdG9yLkdSRUFURVJfVEhBTl9PUl9FUVVBTF9UT19USFJFU0hPTEQsXG4gICAgICAgICAgICAgICAgcHJvcHM/LmVycm9yQWxhcm1Qcm9wcyxcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocHJvcHM/LnRocm90dGxlQWxhcm1Qcm9wcz8uY3JlYXRlICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgdGhpcy5jcmVhdGVBbGFybShcbiAgICAgICAgICAgICAgICBzY29wZSxcbiAgICAgICAgICAgICAgICB0aGlzLm1ldHJpY1Rocm90dGxlcygpLFxuICAgICAgICAgICAgICAgICdUaHJvdHRsZXMnLFxuICAgICAgICAgICAgICAgICdUaHJvdHRsZXMgYWxhcm0nLFxuICAgICAgICAgICAgICAgICdIYXMgdGhyb3R0bGVkJyxcbiAgICAgICAgICAgICAgICB0cmFmZmljVHlwZSxcbiAgICAgICAgICAgICAgICB0aGlzLmdldEFsYXJtQWN0aW9uRm9yRW52KGFsYXJtU25zQWN0aW9uLCB3YXJuaW5nU25zQWN0aW9uLCBwcm9kdWN0aW9uKSxcbiAgICAgICAgICAgICAgICAwLFxuICAgICAgICAgICAgICAgIDEsXG4gICAgICAgICAgICAgICAgMSxcbiAgICAgICAgICAgICAgICBDb21wYXJpc29uT3BlcmF0b3IuR1JFQVRFUl9USEFOX1RIUkVTSE9MRCxcbiAgICAgICAgICAgICAgICBwcm9wcz8udGhyb3R0bGVBbGFybVByb3BzLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgY3JlYXRlQWxhcm0oXG4gICAgICAgIHN0YWNrOiBTdGFjayxcbiAgICAgICAgbWV0cmljOiBNZXRyaWMsXG4gICAgICAgIGFsYXJtSWQ6IHN0cmluZyxcbiAgICAgICAgYWxhcm1OYW1lOiBzdHJpbmcsXG4gICAgICAgIGFsYXJtRGVzY3JpcHRpb246IHN0cmluZyxcbiAgICAgICAgdHJhZmZpY1R5cGU6IFRyYWZmaWNUeXBlIHwgbnVsbCxcbiAgICAgICAgYWxhcm1TbnNBY3Rpb246IFNuc0FjdGlvbixcbiAgICAgICAgdGhyZXNob2xkOiBudW1iZXIsXG4gICAgICAgIGV2YWx1YXRpb25QZXJpb2RzOiBudW1iZXIsXG4gICAgICAgIGRhdGFwb2ludHNUb0FsYXJtOiBudW1iZXIsXG4gICAgICAgIGNvbXBhcmlzb25PcGVyYXRvcjogQ29tcGFyaXNvbk9wZXJhdG9yLFxuICAgICAgICBhbGFybVByb3BzPzogTW9uaXRvcmVkRnVuY3Rpb25BbGFybVByb3BzLFxuICAgICkge1xuICAgICAgICBtZXRyaWMuY3JlYXRlQWxhcm0oc3RhY2ssIGAke3RoaXMubm9kZS5pZH0tJHthbGFybUlkfWAsIHtcbiAgICAgICAgICAgIGFsYXJtTmFtZTogYCR7dHJhZmZpY1R5cGUgPz8gJyd9ICR7c3RhY2suc3RhY2tOYW1lfSAke3RoaXMuZnVuY3Rpb25OYW1lfSAke2FsYXJtTmFtZX1gLnRyaW0oKSxcbiAgICAgICAgICAgIGFsYXJtRGVzY3JpcHRpb24sXG4gICAgICAgICAgICB0aHJlc2hvbGQ6IGFsYXJtUHJvcHM/LnRocmVzaG9sZCA/PyB0aHJlc2hvbGQsXG4gICAgICAgICAgICBldmFsdWF0aW9uUGVyaW9kczogYWxhcm1Qcm9wcz8uZXZhbHVhdGlvblBlcmlvZHMgPz8gZXZhbHVhdGlvblBlcmlvZHMsXG4gICAgICAgICAgICBkYXRhcG9pbnRzVG9BbGFybTogYWxhcm1Qcm9wcz8uZGF0YXBvaW50c1RvQWxhcm0gPz8gZGF0YXBvaW50c1RvQWxhcm0sXG4gICAgICAgICAgICBjb21wYXJpc29uT3BlcmF0b3I6IGFsYXJtUHJvcHM/LmNvbXBhcmlzb25PcGVyYXRvciA/PyBjb21wYXJpc29uT3BlcmF0b3IsXG4gICAgICAgIH0pLmFkZEFsYXJtQWN0aW9uKGFsYXJtU25zQWN0aW9uKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldEFsYXJtQWN0aW9uRm9yRW52KGFsYXJtQWN0aW9uOiBTbnNBY3Rpb24sXG4gICAgICAgIHdhcm5pbmdBY3Rpb246IFNuc0FjdGlvbixcbiAgICAgICAgcHJvZHVjdGlvbjogYm9vbGVhbik6IFNuc0FjdGlvbiB7XG5cbiAgICAgICAgcmV0dXJuIHByb2R1Y3Rpb24gPyBhbGFybUFjdGlvbiA6IHdhcm5pbmdBY3Rpb247XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgTW9uaXRvcmVkREJGdW5jdGlvbiB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIG5ldyBNb25pdG9yZWREQkZ1bmN0aW9uLiAgVXNlIHRvcGljcyBmcm9tIGdpdmVuIERpZ2l0cmFmZmljU3RhY2suICBHZW5lcmF0ZSBuYW1lcyBmcm9tIGdpdmVuIG5hbWUgYW5kIGNvbmZpZ3VyYXRpb24gc2hvcnROYW1lLlxuICAgICAqIEdyYW50IHNlY3JldCBhbmQgY3JlYXRlIGxvZyBzdWJzY3JpcHRpb24uXG4gICAgICpcbiAgICAgKiBGb3IgZXhhbXBsZSwgc2hvcnROYW1lIEZPTyBhbmQgZ2l2ZW4gbmFtZSB1cGRhdGUtdGhpbmdzIHdpbGwgY3JlYXRlIGZ1bmN0aW9uIEZPTy1VcGRhdGVUaGluZ3MgYW5kIHVzZSBjb2RlIGZyb20gbGFtYmRhL3VwZGF0ZS10aGluZ3MvdXBkYXRlLXRoaW5ncy50cyBtZXRob2QgaGFuZGxlci5cbiAgICAgKlxuICAgICAqIElmIHlvdSBkb24ndCBuZWVkIHRvIHBhc3MgYW55IGV4dHJhIGFyZ3VtZW50cyB0byBsYW1iZGEtZW52aXJvbm1lbnQsIHlvdSBjYW4gbGVhdmUgZW52aXJvbm1lbnQgb3V0IGFuZCB0aGlzIGZ1bmN0aW9uIHdpbGwgY3JlYXRlIHRoZVxuICAgICAqIGRlZmF1bHQgTGFtYmRhIEVudmlyb25tZW50IHdpdGggU0VDUkVUX0lEIGFuZCBEQl9BUFBMSUNBVElPTi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBzdGFjayBEaWdpdHJhZmZpY1N0YWNrXG4gICAgICogQHBhcmFtIG5hbWUgcGFyYW0tY2FzZSBuYW1lXG4gICAgICogQHBhcmFtIGVudmlyb25tZW50IExhbWJkYSBlbnZpcm9ubWVudFxuICAgICAqIEBwYXJhbSBmdW5jdGlvblBhcmFtZXRlcnMgTGFtYmRhIGZ1bmN0aW9uIHBhcmFtZXRlcnNcbiAgICAgKi9cbiAgICBzdGF0aWMgY3JlYXRlKHN0YWNrOiBEaWdpdHJhZmZpY1N0YWNrLFxuICAgICAgICBuYW1lOiBzdHJpbmcsXG4gICAgICAgIGVudmlyb25tZW50PzogTGFtYmRhRW52aXJvbm1lbnQsXG4gICAgICAgIGZ1bmN0aW9uUGFyYW1ldGVycz86IE1vbml0b3JlZEZ1bmN0aW9uUGFyYW1ldGVycyk6IE1vbml0b3JlZEZ1bmN0aW9uIHtcbiAgICAgICAgY29uc3QgZnVuY3Rpb25OYW1lID0gZnVuY3Rpb25QYXJhbWV0ZXJzPy5mdW5jdGlvbk5hbWUgfHwgYCR7c3RhY2suY29uZmlndXJhdGlvbi5zaG9ydE5hbWV9LSR7cGFzY2FsQ2FzZShuYW1lKX1gO1xuICAgICAgICBjb25zdCBlbnYgPSBlbnZpcm9ubWVudCA/IGVudmlyb25tZW50IDogc3RhY2suY3JlYXRlTGFtYmRhRW52aXJvbm1lbnQoKTtcbiAgICAgICAgY29uc3QgZnVuY3Rpb25Qcm9wcyA9IGRhdGFiYXNlRnVuY3Rpb25Qcm9wcyhcbiAgICAgICAgICAgIHN0YWNrLCBlbnYsIGZ1bmN0aW9uTmFtZSwgbmFtZSwgZnVuY3Rpb25QYXJhbWV0ZXJzLFxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IG1mID0gTW9uaXRvcmVkRnVuY3Rpb24uY3JlYXRlKHN0YWNrLCBmdW5jdGlvbk5hbWUsIGZ1bmN0aW9uUHJvcHMsIGZ1bmN0aW9uUGFyYW1ldGVycyk7XG5cbiAgICAgICAgc3RhY2suZ3JhbnRTZWNyZXQobWYpO1xuXG4gICAgICAgIGlmIChzdGFjay5jb25maWd1cmF0aW9uLmxvZ3NEZXN0aW5hdGlvbkFybikge1xuICAgICAgICAgICAgbmV3IERpZ2l0cmFmZmljTG9nU3Vic2NyaXB0aW9ucyhzdGFjaywgbWYpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG1mO1xuICAgIH1cbn1cbiJdfQ==
@@ -0,0 +1,40 @@
1
+ import { RestApi, RestApiProps, JsonSchema, Resource } from 'aws-cdk-lib/aws-apigateway';
2
+ import { PolicyDocument } from 'aws-cdk-lib/aws-iam';
3
+ import { Construct } from "constructs";
4
+ import { DigitrafficStack } from "./stack";
5
+ import { ModelWithReference } from "../../types/model-with-reference";
6
+ import { DocumentationPart } from "../documentation";
7
+ export declare class DigitrafficRestApi extends RestApi {
8
+ readonly apiKeyIds: string[];
9
+ constructor(stack: DigitrafficStack, apiId: string, apiName: string, allowFromIpAddresses?: string[] | undefined, config?: Partial<RestApiProps>);
10
+ hostname(): string;
11
+ createUsagePlan(apiKeyId: string, apiKeyName: string): string;
12
+ createUsagePlanV2(apiName: string): string;
13
+ addJsonModel(modelName: string, schema: JsonSchema): ModelWithReference;
14
+ addCSVModel(modelName: string): ModelWithReference;
15
+ private getModelWithReference;
16
+ private addDocumentationPart;
17
+ documentResource(resource: Resource, ...documentationPart: DocumentationPart[]): void;
18
+ }
19
+ /**
20
+ * Due to AWS API design API Gateway will always return 403 'Missing Authentication Token' for requests
21
+ * with a non-existent endpoint. This function translates this response to a 404.
22
+ * Requests with an invalid or missing API key are not affected (still return 403 'Forbidden').
23
+ * @param restApi RestApi
24
+ * @param stack Construct
25
+ */
26
+ export declare function add404Support(restApi: RestApi, stack: Construct): void;
27
+ export declare function add401Support(restApi: RestApi, stack: Construct): void;
28
+ /**
29
+ * Due to AWS API design API Gateway will always return 403 'Missing Authentication Token' for requests
30
+ * with a non-existent endpoint. This function converts this response to a custom one.
31
+ * Requests with an invalid or missing API key are not affected (still return 403 'Forbidden').
32
+ * @param returnCode
33
+ * @param message
34
+ * @param restApi RestApi
35
+ * @param stack Construct
36
+ */
37
+ export declare function setReturnCodeForMissingAuthenticationToken(returnCode: number, message: string, restApi: RestApi, stack: Construct): void;
38
+ export declare function createRestApi(stack: Construct, apiId: string, apiName: string, allowFromIpAddresses?: string[] | undefined): RestApi;
39
+ export declare function createDefaultPolicyDocument(): PolicyDocument;
40
+ export declare function createIpRestrictionPolicyDocument(allowFromIpAddresses: string[]): PolicyDocument;
@@ -0,0 +1,179 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createIpRestrictionPolicyDocument = exports.createDefaultPolicyDocument = exports.createRestApi = exports.setReturnCodeForMissingAuthenticationToken = exports.add401Support = exports.add404Support = exports.DigitrafficRestApi = void 0;
4
+ const aws_apigateway_1 = require("aws-cdk-lib/aws-apigateway");
5
+ const aws_iam_1 = require("aws-cdk-lib/aws-iam");
6
+ const usage_plans_1 = require("../usage-plans");
7
+ const api_model_1 = require("../../../utils/api-model");
8
+ const mediatypes_1 = require("../../types/mediatypes");
9
+ const R = require("ramda");
10
+ class DigitrafficRestApi extends aws_apigateway_1.RestApi {
11
+ constructor(stack, apiId, apiName, allowFromIpAddresses, config) {
12
+ const policyDocument = allowFromIpAddresses == null ? createDefaultPolicyDocument() : createIpRestrictionPolicyDocument(allowFromIpAddresses);
13
+ // override default config with given extra config
14
+ const apiConfig = { ...{
15
+ deployOptions: {
16
+ loggingLevel: aws_apigateway_1.MethodLoggingLevel.ERROR,
17
+ },
18
+ restApiName: apiName,
19
+ endpointTypes: [aws_apigateway_1.EndpointType.REGIONAL],
20
+ policy: policyDocument,
21
+ }, ...config };
22
+ super(stack, apiId, apiConfig);
23
+ this.apiKeyIds = [];
24
+ add404Support(this, stack);
25
+ }
26
+ hostname() {
27
+ return `${this.restApiId}.execute-api.${this.stack.region}.amazonaws.com`;
28
+ }
29
+ createUsagePlan(apiKeyId, apiKeyName) {
30
+ const newKeyId = (0, usage_plans_1.createUsagePlan)(this, apiKeyId, apiKeyName).keyId;
31
+ this.apiKeyIds.push(newKeyId);
32
+ return newKeyId;
33
+ }
34
+ createUsagePlanV2(apiName) {
35
+ const newKeyId = (0, usage_plans_1.createDefaultUsagePlan)(this, apiName).keyId;
36
+ this.apiKeyIds.push(newKeyId);
37
+ return newKeyId;
38
+ }
39
+ addJsonModel(modelName, schema) {
40
+ return this.getModelWithReference(this.addModel(modelName, {
41
+ contentType: mediatypes_1.MediaType.APPLICATION_JSON,
42
+ modelName,
43
+ schema,
44
+ }));
45
+ }
46
+ addCSVModel(modelName) {
47
+ return this.getModelWithReference(this.addModel(modelName, {
48
+ contentType: mediatypes_1.MediaType.TEXT_CSV,
49
+ modelName,
50
+ schema: {},
51
+ }));
52
+ }
53
+ getModelWithReference(model) {
54
+ return R.assoc('modelReference', (0, api_model_1.getModelReference)(model.modelId, this.restApiId), model);
55
+ }
56
+ addDocumentationPart(resource, parameterName, resourceName, type, properties) {
57
+ const location = {
58
+ type,
59
+ path: resource.path,
60
+ name: type !== 'METHOD' ? parameterName : undefined,
61
+ };
62
+ new aws_apigateway_1.CfnDocumentationPart(this.stack, resourceName, {
63
+ restApiId: resource.api.restApiId,
64
+ location,
65
+ properties: JSON.stringify(properties),
66
+ });
67
+ }
68
+ documentResource(resource, ...documentationPart) {
69
+ documentationPart.forEach(dp => this.addDocumentationPart(resource, dp.parameterName, `${resource.path}.${dp.parameterName}.Documentation`, dp.type, dp.documentationProperties));
70
+ }
71
+ }
72
+ exports.DigitrafficRestApi = DigitrafficRestApi;
73
+ /**
74
+ * Due to AWS API design API Gateway will always return 403 'Missing Authentication Token' for requests
75
+ * with a non-existent endpoint. This function translates this response to a 404.
76
+ * Requests with an invalid or missing API key are not affected (still return 403 'Forbidden').
77
+ * @param restApi RestApi
78
+ * @param stack Construct
79
+ */
80
+ function add404Support(restApi, stack) {
81
+ new aws_apigateway_1.GatewayResponse(stack, `MissingAuthenticationTokenResponse-${restApi.restApiName}`, {
82
+ restApi,
83
+ type: aws_apigateway_1.ResponseType.MISSING_AUTHENTICATION_TOKEN,
84
+ statusCode: '404',
85
+ templates: {
86
+ 'application/json': '{"message": "Not found"}',
87
+ },
88
+ });
89
+ }
90
+ exports.add404Support = add404Support;
91
+ function add401Support(restApi, stack) {
92
+ new aws_apigateway_1.GatewayResponse(stack, `AuthenticationFailedResponse-${restApi.restApiName}`, {
93
+ restApi,
94
+ type: aws_apigateway_1.ResponseType.UNAUTHORIZED,
95
+ statusCode: "401",
96
+ responseHeaders: {
97
+ 'WWW-Authenticate': "'Basic'",
98
+ },
99
+ });
100
+ }
101
+ exports.add401Support = add401Support;
102
+ /**
103
+ * Due to AWS API design API Gateway will always return 403 'Missing Authentication Token' for requests
104
+ * with a non-existent endpoint. This function converts this response to a custom one.
105
+ * Requests with an invalid or missing API key are not affected (still return 403 'Forbidden').
106
+ * @param returnCode
107
+ * @param message
108
+ * @param restApi RestApi
109
+ * @param stack Construct
110
+ */
111
+ function setReturnCodeForMissingAuthenticationToken(returnCode, message, restApi, stack) {
112
+ new aws_apigateway_1.GatewayResponse(stack, `MissingAuthenticationTokenResponse-${restApi.restApiName}`, {
113
+ restApi,
114
+ type: aws_apigateway_1.ResponseType.MISSING_AUTHENTICATION_TOKEN,
115
+ statusCode: `${returnCode}`,
116
+ templates: {
117
+ 'application/json': `{"message": ${message}}`,
118
+ },
119
+ });
120
+ }
121
+ exports.setReturnCodeForMissingAuthenticationToken = setReturnCodeForMissingAuthenticationToken;
122
+ function createRestApi(stack, apiId, apiName, allowFromIpAddresses) {
123
+ const policyDocument = allowFromIpAddresses == null ? createDefaultPolicyDocument() : createIpRestrictionPolicyDocument(allowFromIpAddresses);
124
+ const restApi = new aws_apigateway_1.RestApi(stack, apiId, {
125
+ deployOptions: {
126
+ loggingLevel: aws_apigateway_1.MethodLoggingLevel.ERROR,
127
+ },
128
+ restApiName: apiName,
129
+ endpointTypes: [aws_apigateway_1.EndpointType.REGIONAL],
130
+ policy: policyDocument,
131
+ });
132
+ add404Support(restApi, stack);
133
+ return restApi;
134
+ }
135
+ exports.createRestApi = createRestApi;
136
+ function createDefaultPolicyDocument() {
137
+ return new aws_iam_1.PolicyDocument({
138
+ statements: [
139
+ new aws_iam_1.PolicyStatement({
140
+ effect: aws_iam_1.Effect.ALLOW,
141
+ actions: [
142
+ "execute-api:Invoke",
143
+ ],
144
+ resources: [
145
+ "*",
146
+ ],
147
+ principals: [
148
+ new aws_iam_1.AnyPrincipal(),
149
+ ],
150
+ }),
151
+ ],
152
+ });
153
+ }
154
+ exports.createDefaultPolicyDocument = createDefaultPolicyDocument;
155
+ function createIpRestrictionPolicyDocument(allowFromIpAddresses) {
156
+ return new aws_iam_1.PolicyDocument({
157
+ statements: [
158
+ new aws_iam_1.PolicyStatement({
159
+ effect: aws_iam_1.Effect.ALLOW,
160
+ conditions: {
161
+ "IpAddress": {
162
+ "aws:SourceIp": allowFromIpAddresses,
163
+ },
164
+ },
165
+ actions: [
166
+ "execute-api:Invoke",
167
+ ],
168
+ resources: [
169
+ "*",
170
+ ],
171
+ principals: [
172
+ new aws_iam_1.AnyPrincipal(),
173
+ ],
174
+ }),
175
+ ],
176
+ });
177
+ }
178
+ exports.createIpRestrictionPolicyDocument = createIpRestrictionPolicyDocument;
179
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzdF9hcGlzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2F3cy9pbmZyYS9zdGFjay9yZXN0X2FwaXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsK0RBT29DO0FBQ3BDLGlEQUEwRjtBQUcxRixnREFBdUU7QUFFdkUsd0RBQTJEO0FBQzNELHVEQUFpRDtBQUdqRCwyQkFBNEI7QUFFNUIsTUFBYSxrQkFBbUIsU0FBUSx3QkFBTztJQUczQyxZQUNJLEtBQXVCLEVBQUUsS0FBYSxFQUFFLE9BQWUsRUFBRSxvQkFBMkMsRUFBRSxNQUE4QjtRQUVwSSxNQUFNLGNBQWMsR0FBRyxvQkFBb0IsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLDJCQUEyQixFQUFFLENBQUMsQ0FBQyxDQUFDLGlDQUFpQyxDQUFDLG9CQUFvQixDQUFDLENBQUM7UUFFOUksa0RBQWtEO1FBQ2xELE1BQU0sU0FBUyxHQUFHLEVBQUMsR0FBRztnQkFDbEIsYUFBYSxFQUFFO29CQUNYLFlBQVksRUFBRSxtQ0FBa0IsQ0FBQyxLQUFLO2lCQUN6QztnQkFDRCxXQUFXLEVBQUUsT0FBTztnQkFDcEIsYUFBYSxFQUFFLENBQUMsNkJBQVksQ0FBQyxRQUFRLENBQUM7Z0JBQ3RDLE1BQU0sRUFBRSxjQUFjO2FBQ3pCLEVBQUUsR0FBRyxNQUFNLEVBQUMsQ0FBQztRQUVkLEtBQUssQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBRS9CLElBQUksQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFDO1FBRXBCLGFBQWEsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDL0IsQ0FBQztJQUVELFFBQVE7UUFDSixPQUFPLEdBQUcsSUFBSSxDQUFDLFNBQVMsZ0JBQWlCLElBQUksQ0FBQyxLQUEwQixDQUFDLE1BQU0sZ0JBQWdCLENBQUM7SUFDcEcsQ0FBQztJQUVELGVBQWUsQ0FBQyxRQUFnQixFQUFFLFVBQWtCO1FBQ2hE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LENBQUM7SUFDSCxhQUFhLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQzlCLE9BQU8sT0FBTyxDQUFDO0FBQ25CLENBQUM7QUFaRCxzQ0FZQztBQUVELFNBQWdCLDJCQUEyQjtJQUN2QyxPQUFPLElBQUksd0JBQWMsQ0FBQztRQUN0QixVQUFVLEVBQUU7WUFDUixJQUFJLHlCQUFlLENBQUM7Z0JBQ2hCLE1BQU0sRUFBRSxnQkFBTSxDQUFDLEtBQUs7Z0JBQ3BCLE9BQU8sRUFBRTtvQkFDTCxvQkFBb0I7aUJBQ3ZCO2dCQUNELFNBQVMsRUFBRTtvQkFDUCxHQUFHO2lCQUNOO2dCQUNELFVBQVUsRUFBRTtvQkFDUixJQUFJLHNCQUFZLEVBQUU7aUJBQ3JCO2FBQ0osQ0FBQztTQUNMO0tBQ0osQ0FBQyxDQUFDO0FBQ1AsQ0FBQztBQWpCRCxrRUFpQkM7QUFHRCxTQUFnQixpQ0FBaUMsQ0FBQyxvQkFBOEI7SUFDNUUsT0FBTyxJQUFJLHdCQUFjLENBQUM7UUFDdEIsVUFBVSxFQUFFO1lBQ1IsSUFBSSx5QkFBZSxDQUFDO2dCQUNoQixNQUFNLEVBQUUsZ0JBQU0sQ0FBQyxLQUFLO2dCQUNwQixVQUFVLEVBQUU7b0JBQ1IsV0FBVyxFQUFFO3dCQUNULGNBQWMsRUFBRSxvQkFBb0I7cUJBQ3ZDO2lCQUNKO2dCQUNELE9BQU8sRUFBRTtvQkFDTCxvQkFBb0I7aUJBQ3ZCO2dCQUNELFNBQVMsRUFBRTtvQkFDUCxHQUFHO2lCQUNOO2dCQUNELFVBQVUsRUFBRTtvQkFDUixJQUFJLHNCQUFZLEVBQUU7aUJBQ3JCO2FBQ0osQ0FBQztTQUNMO0tBQ0osQ0FBQyxDQUFDO0FBQ1AsQ0FBQztBQXRCRCw4RUFzQkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gICAgUmVzdEFwaSxcclxuICAgIE1ldGhvZExvZ2dpbmdMZXZlbCxcclxuICAgIEdhdGV3YXlSZXNwb25zZSxcclxuICAgIFJlc3BvbnNlVHlwZSxcclxuICAgIEVuZHBvaW50VHlwZSxcclxuICAgIFJlc3RBcGlQcm9wcywgSnNvblNjaGVtYSwgTW9kZWwsIENmbkRvY3VtZW50YXRpb25QYXJ0LCBSZXNvdXJjZSxcclxufSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtYXBpZ2F0ZXdheSc7XHJcbmltcG9ydCB7UG9saWN5RG9jdW1lbnQsIFBvbGljeVN0YXRlbWVudCwgRWZmZWN0LCBBbnlQcmluY2lwYWx9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1pYW0nO1xyXG5pbXBvcnQge0NvbnN0cnVjdH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcclxuaW1wb3J0IHtEaWdpdHJhZmZpY1N0YWNrfSBmcm9tIFwiLi9zdGFja1wiO1xyXG5pbXBvcnQge2NyZWF0ZURlZmF1bHRVc2FnZVBsYW4sIGNyZWF0ZVVzYWdlUGxhbn0gZnJvbSBcIi4uL3VzYWdlLXBsYW5zXCI7XHJcbmltcG9ydCB7TW9kZWxXaXRoUmVmZXJlbmNlfSBmcm9tIFwiLi4vLi4vdHlwZXMvbW9kZWwtd2l0aC1yZWZlcmVuY2VcIjtcclxuaW1wb3J0IHtnZXRNb2RlbFJlZmVyZW5jZX0gZnJvbSBcIi4uLy4uLy4uL3V0aWxzL2FwaS1tb2RlbFwiO1xyXG5pbXBvcnQge01lZGlhVHlwZX0gZnJvbSBcIi4uLy4uL3R5cGVzL21lZGlhdHlwZXNcIjtcclxuaW1wb3J0IHtEb2N1bWVudGF0aW9uUGFydCwgRG9jdW1lbnRhdGlvblByb3BlcnRpZXN9IGZyb20gXCIuLi9kb2N1bWVudGF0aW9uXCI7XHJcblxyXG5pbXBvcnQgUiA9IHJlcXVpcmUoJ3JhbWRhJyk7XHJcblxyXG5leHBvcnQgY2xhc3MgRGlnaXRyYWZmaWNSZXN0QXBpIGV4dGVuZHMgUmVzdEFwaSB7XHJcbiAgICByZWFkb25seSBhcGlLZXlJZHM6IHN0cmluZ1tdO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKFxyXG4gICAgICAgIHN0YWNrOiBEaWdpdHJhZmZpY1N0YWNrLCBhcGlJZDogc3RyaW5nLCBhcGlOYW1lOiBzdHJpbmcsIGFsbG93RnJvbUlwQWRkcmVzc2VzPzogc3RyaW5nW10gfCB1bmRlZmluZWQsIGNvbmZpZz86IFBhcnRpYWw8UmVzdEFwaVByb3BzPixcclxuICAgICkge1xyXG4gICAgICAgIGNvbnN0IHBvbGljeURvY3VtZW50ID0gYWxsb3dGcm9tSXBBZGRyZXNzZXMgPT0gbnVsbCA/IGNyZWF0ZURlZmF1bHRQb2xpY3lEb2N1bWVudCgpIDogY3JlYXRlSXBSZXN0cmljdGlvblBvbGljeURvY3VtZW50KGFsbG93RnJvbUlwQWRkcmVzc2VzKTtcclxuXHJcbiAgICAgICAgLy8gb3ZlcnJpZGUgZGVmYXVsdCBjb25maWcgd2l0aCBnaXZlbiBleHRyYSBjb25maWdcclxuICAgICAgICBjb25zdCBhcGlDb25maWcgPSB7Li4ue1xyXG4gICAgICAgICAgICBkZXBsb3lPcHRpb25zOiB7XHJcbiAgICAgICAgICAgICAgICBsb2dnaW5nTGV2ZWw6IE1ldGhvZExvZ2dpbmdMZXZlbC5FUlJPUixcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgcmVzdEFwaU5hbWU6IGFwaU5hbWUsXHJcbiAgICAgICAgICAgIGVuZHBvaW50VHlwZXM6IFtFbmRwb2ludFR5cGUuUkVHSU9OQUxdLFxyXG4gICAgICAgICAgICBwb2xpY3k6IHBvbGljeURvY3VtZW50LFxyXG4gICAgICAgIH0sIC4uLmNvbmZpZ307XHJcblxyXG4gICAgICAgIHN1cGVyKHN0YWNrLCBhcGlJZCwgYXBpQ29uZmlnKTtcclxuXHJcbiAgICAgICAgdGhpcy5hcGlLZXlJZHMgPSBbXTtcclxuXHJcbiAgICAgICAgYWRkNDA0U3VwcG9ydCh0aGlzLCBzdGFjayk7XHJcbiAgICB9XHJcblxyXG4gICAgaG9zdG5hbWUoKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gYCR7dGhpcy5yZXN0QXBpSWR9LmV4ZWN1dGUtYXBpLiR7KHRoaXMuc3RhY2sgYXMgRGlnaXRyYWZmaWNTdGFjaykucmVnaW9ufS5hbWF6b25hd3MuY29tYDtcclxuICAgIH1cclxuXHJcbiAgICBjcmVhdGVVc2FnZVBsYW4oYXBpS2V5SWQ6IHN0cmluZywgYXBpS2V5TmFtZTogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgICAgICBjb25zdCBuZXdLZXlJZCA9IGNyZWF0ZVVzYWdlUGxhbih0aGlzLCBhcGlLZXlJZCwgYXBpS2V5TmFtZSkua2V5SWQ7XHJcblxyXG4gICAgICAgIHRoaXMuYXBpS2V5SWRzLnB1c2gobmV3S2V5SWQpO1xyXG5cclxuICAgICAgICByZXR1cm4gbmV3S2V5SWQ7XHJcbiAgICB9XHJcblxyXG4gICAgY3JlYXRlVXNhZ2VQbGFuVjIoYXBpTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgICAgICBjb25zdCBuZXdLZXlJZCA9IGNyZWF0ZURlZmF1bHRVc2FnZVBsYW4odGhpcywgYXBpTmFtZSkua2V5SWQ7XHJcblxyXG4gICAgICAgIHRoaXMuYXBpS2V5SWRzLnB1c2gobmV3S2V5SWQpO1xyXG5cclxuICAgICAgICByZXR1cm4gbmV3S2V5SWQ7XHJcbiAgICB9XHJcblxyXG4gICAgYWRkSnNvbk1vZGVsKG1vZGVsTmFtZTogc3RyaW5nLCBzY2hlbWE6IEpzb25TY2hlbWEpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5nZXRNb2RlbFdpdGhSZWZlcmVuY2UodGhpcy5hZGRNb2RlbChtb2RlbE5hbWUsIHtcclxuICAgICAgICAgICAgY29udGVudFR5cGU6IE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OLFxyXG4gICAgICAgICAgICBtb2RlbE5hbWUsXHJcbiAgICAgICAgICAgIHNjaGVtYSxcclxuICAgICAgICB9KSk7XHJcbiAgICB9XHJcblxyXG4gICAgYWRkQ1NWTW9kZWwobW9kZWxOYW1lOiBzdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5nZXRNb2RlbFdpdGhSZWZlcmVuY2UodGhpcy5hZGRNb2RlbChtb2RlbE5hbWUsIHtcclxuICAgICAgICAgICAgY29udGVudFR5cGU6IE1lZGlhVHlwZS5URVhUX0NTVixcclxuICAgICAgICAgICAgbW9kZWxOYW1lLFxyXG4gICAgICAgICAgICBzY2hlbWE6IHt9LFxyXG4gICAgICAgIH0pKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdldE1vZGVsV2l0aFJlZmVyZW5jZShtb2RlbDogTW9kZWwpOiBNb2RlbFdpdGhSZWZlcmVuY2Uge1xyXG4gICAgICAgIHJldHVybiBSLmFzc29jKCdtb2RlbFJlZmVyZW5jZScsIGdldE1vZGVsUmVmZXJlbmNlKG1vZGVsLm1vZGVsSWQsIHRoaXMucmVzdEFwaUlkKSwgbW9kZWwpIGFzIE1vZGVsV2l0aFJlZmVyZW5jZTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFkZERvY3VtZW50YXRpb25QYXJ0KFxyXG4gICAgICAgIHJlc291cmNlOiBSZXNvdXJjZSwgcGFyYW1ldGVyTmFtZTogc3RyaW5nLCByZXNvdXJjZU5hbWU6IHN0cmluZywgdHlwZTogc3RyaW5nLCBwcm9wZXJ0aWVzOiBEb2N1bWVudGF0aW9uUHJvcGVydGllcyxcclxuICAgICkge1xyXG4gICAgICAgIGNvbnN0IGxvY2F0aW9uOiBDZm5Eb2N1bWVudGF0aW9uUGFydC5Mb2NhdGlvblByb3BlcnR5ID0ge1xyXG4gICAgICAgICAgICB0eXBlLFxyXG4gICAgICAgICAgICBwYXRoOiByZXNvdXJjZS5wYXRoLFxyXG4gICAgICAgICAgICBuYW1lOiB0eXBlICE9PSAnTUVUSE9EJyA/IHBhcmFtZXRlck5hbWUgOiB1bmRlZmluZWQsXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgbmV3IENmbkRvY3VtZW50YXRpb25QYXJ0KHRoaXMuc3RhY2ssIHJlc291cmNlTmFtZSwge1xyXG4gICAgICAgICAgICByZXN0QXBpSWQ6IHJlc291cmNlLmFwaS5yZXN0QXBpSWQsXHJcbiAgICAgICAgICAgIGxvY2F0aW9uLFxyXG4gICAgICAgICAgICBwcm9wZXJ0aWVzOiBKU09OLnN0cmluZ2lmeShwcm9wZXJ0aWVzKSxcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBkb2N1bWVudFJlc291cmNlKHJlc291cmNlOiBSZXNvdXJjZSwgLi4uZG9jdW1lbnRhdGlvblBhcnQ6IERvY3VtZW50YXRpb25QYXJ0W10pIHtcclxuICAgICAgICBkb2N1bWVudGF0aW9uUGFydC5mb3JFYWNoKGRwID0+IHRoaXMuYWRkRG9jdW1lbnRhdGlvblBhcnQoXHJcbiAgICAgICAgICAgIHJlc291cmNlLCBkcC5wYXJhbWV0ZXJOYW1lLCBgJHtyZXNvdXJjZS5wYXRofS4ke2RwLnBhcmFtZXRlck5hbWV9LkRvY3VtZW50YXRpb25gLCBkcC50eXBlLCBkcC5kb2N1bWVudGF0aW9uUHJvcGVydGllcyxcclxuICAgICAgICApKTtcclxuICAgIH1cclxufVxyXG5cclxuLyoqXHJcbiAqIER1ZSB0byBBV1MgQVBJIGRlc2lnbiBBUEkgR2F0ZXdheSB3aWxsIGFsd2F5cyByZXR1cm4gNDAzICdNaXNzaW5nIEF1dGhlbnRpY2F0aW9uIFRva2VuJyBmb3IgcmVxdWVzdHNcclxuICogd2l0aCBhIG5vbi1leGlzdGVudCBlbmRwb2ludC4gVGhpcyBmdW5jdGlvbiB0cmFuc2xhdGVzIHRoaXMgcmVzcG9uc2UgdG8gYSA0MDQuXHJcbiAqIFJlcXVlc3RzIHdpdGggYW4gaW52YWxpZCBvciBtaXNzaW5nIEFQSSBrZXkgYXJlIG5vdCBhZmZlY3RlZCAoc3RpbGwgcmV0dXJuIDQwMyAnRm9yYmlkZGVuJykuXHJcbiAqIEBwYXJhbSByZXN0QXBpIFJlc3RBcGlcclxuICogQHBhcmFtIHN0YWNrIENvbnN0cnVjdFxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGFkZDQwNFN1cHBvcnQocmVzdEFwaTogUmVzdEFwaSwgc3RhY2s6IENvbnN0cnVjdCkge1xyXG4gICAgbmV3IEdhdGV3YXlSZXNwb25zZShzdGFjaywgYE1pc3NpbmdBdXRoZW50aWNhdGlvblRva2VuUmVzcG9uc2UtJHtyZXN0QXBpLnJlc3RBcGlOYW1lfWAsIHtcclxuICAgICAgICByZXN0QXBpLFxyXG4gICAgICAgIHR5cGU6IFJlc3BvbnNlVHlwZS5NSVNTSU5HX0FVVEhFTlRJQ0FUSU9OX1RPS0VOLFxyXG4gICAgICAgIHN0YXR1c0NvZGU6ICc0MDQnLFxyXG4gICAgICAgIHRlbXBsYXRlczoge1xyXG4gICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbic6ICd7XCJtZXNzYWdlXCI6IFwiTm90IGZvdW5kXCJ9JyxcclxuICAgICAgICB9LFxyXG4gICAgfSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBhZGQ0MDFTdXBwb3J0KHJlc3RBcGk6IFJlc3RBcGksIHN0YWNrOiBDb25zdHJ1Y3QpIHtcclxuICAgIG5ldyBHYXRld2F5UmVzcG9uc2Uoc3RhY2ssIGBBdXRoZW50aWNhdGlvbkZhaWxlZFJlc3BvbnNlLSR7cmVzdEFwaS5yZXN0QXBpTmFtZX1gLCB7XHJcbiAgICAgICAgcmVzdEFwaSxcclxuICAgICAgICB0eXBlOiBSZXNwb25zZVR5cGUuVU5BVVRIT1JJWkVELFxyXG4gICAgICAgIHN0YXR1c0NvZGU6IFwiNDAxXCIsXHJcbiAgICAgICAgcmVzcG9uc2VIZWFkZXJzOiB7XHJcbiAgICAgICAgICAgICdXV1ctQXV0aGVudGljYXRlJzogXCInQmFzaWMnXCIsXHJcbiAgICAgICAgfSxcclxuICAgIH0pO1xyXG59XHJcblxyXG4vKipcclxuICogRHVlIHRvIEFXUyBBUEkgZGVzaWduIEFQSSBHYXRld2F5IHdpbGwgYWx3YXlzIHJldHVybiA0MDMgJ01pc3NpbmcgQXV0aGVudGljYXRpb24gVG9rZW4nIGZvciByZXF1ZXN0c1xyXG4gKiB3aXRoIGEgbm9uLWV4aXN0ZW50IGVuZHBvaW50LiBUaGlzIGZ1bmN0aW9uIGNvbnZlcnRzIHRoaXMgcmVzcG9uc2UgdG8gYSBjdXN0b20gb25lLlxyXG4gKiBSZXF1ZXN0cyB3aXRoIGFuIGludmFsaWQgb3IgbWlzc2luZyBBUEkga2V5IGFyZSBub3QgYWZmZWN0ZWQgKHN0aWxsIHJldHVybiA0MDMgJ0ZvcmJpZGRlbicpLlxyXG4gKiBAcGFyYW0gcmV0dXJuQ29kZVxyXG4gKiBAcGFyYW0gbWVzc2FnZVxyXG4gKiBAcGFyYW0gcmVzdEFwaSBSZXN0QXBpXHJcbiAqIEBwYXJhbSBzdGFjayBDb25zdHJ1Y3RcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBzZXRSZXR1cm5Db2RlRm9yTWlzc2luZ0F1dGhlbnRpY2F0aW9uVG9rZW4ocmV0dXJuQ29kZTogbnVtYmVyLFxyXG4gICAgbWVzc2FnZTogc3RyaW5nLFxyXG4gICAgcmVzdEFwaTogUmVzdEFwaSxcclxuICAgIHN0YWNrOiBDb25zdHJ1Y3QpIHtcclxuXHJcbiAgICBuZXcgR2F0ZXdheVJlc3BvbnNlKHN0YWNrLCBgTWlzc2luZ0F1dGhlbnRpY2F0aW9uVG9rZW5SZXNwb25zZS0ke3Jlc3RBcGkucmVzdEFwaU5hbWV9YCwge1xyXG4gICAgICAgIHJlc3RBcGksXHJcbiAgICAgICAgdHlwZTogUmVzcG9uc2VUeXBlLk1JU1NJTkdfQVVUSEVOVElDQVRJT05fVE9LRU4sXHJcbiAgICAgICAgc3RhdHVzQ29kZTogYCR7cmV0dXJuQ29kZX1gLFxyXG4gICAgICAgIHRlbXBsYXRlczoge1xyXG4gICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbic6IGB7XCJtZXNzYWdlXCI6ICR7bWVzc2FnZX19YCxcclxuICAgICAgICB9LFxyXG4gICAgfSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVSZXN0QXBpKHN0YWNrOiBDb25zdHJ1Y3QsIGFwaUlkOiBzdHJpbmcsIGFwaU5hbWU6IHN0cmluZywgYWxsb3dGcm9tSXBBZGRyZXNzZXM/OiBzdHJpbmdbXSB8IHVuZGVmaW5lZCk6IFJlc3RBcGkge1xyXG4gICAgY29uc3QgcG9saWN5RG9jdW1lbnQgPSBhbGxvd0Zyb21JcEFkZHJlc3NlcyA9PSBudWxsID8gY3JlYXRlRGVmYXVsdFBvbGljeURvY3VtZW50KCkgOiBjcmVhdGVJcFJlc3RyaWN0aW9uUG9saWN5RG9jdW1lbnQoYWxsb3dGcm9tSXBBZGRyZXNzZXMpO1xyXG4gICAgY29uc3QgcmVzdEFwaSA9IG5ldyBSZXN0QXBpKHN0YWNrLCBhcGlJZCwge1xyXG4gICAgICAgIGRlcGxveU9wdGlvbnM6IHtcclxuICAgICAgICAgICAgbG9nZ2luZ0xldmVsOiBNZXRob2RMb2dnaW5nTGV2ZWwuRVJST1IsXHJcbiAgICAgICAgfSxcclxuICAgICAgICByZXN0QXBpTmFtZTogYXBpTmFtZSxcclxuICAgICAgICBlbmRwb2ludFR5cGVzOiBbRW5kcG9pbnRUeXBlLlJFR0lPTkFMXSxcclxuICAgICAgICBwb2xpY3k6IHBvbGljeURvY3VtZW50LFxyXG4gICAgfSk7XHJcbiAgICBhZGQ0MDRTdXBwb3J0KHJlc3RBcGksIHN0YWNrKTtcclxuICAgIHJldHVybiByZXN0QXBpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRGVmYXVsdFBvbGljeURvY3VtZW50KCkge1xyXG4gICAgcmV0dXJuIG5ldyBQb2xpY3lEb2N1bWVudCh7XHJcbiAgICAgICAgc3RhdGVtZW50czogW1xyXG4gICAgICAgICAgICBuZXcgUG9saWN5U3RhdGVtZW50KHtcclxuICAgICAgICAgICAgICAgIGVmZmVjdDogRWZmZWN0LkFMTE9XLFxyXG4gICAgICAgICAgICAgICAgYWN0aW9uczogW1xyXG4gICAgICAgICAgICAgICAgICAgIFwiZXhlY3V0ZS1hcGk6SW52b2tlXCIsXHJcbiAgICAgICAgICAgICAgICBdLFxyXG4gICAgICAgICAgICAgICAgcmVzb3VyY2VzOiBbXHJcbiAgICAgICAgICAgICAgICAgICAgXCIqXCIsXHJcbiAgICAgICAgICAgICAgICBdLFxyXG4gICAgICAgICAgICAgICAgcHJpbmNpcGFsczogW1xyXG4gICAgICAgICAgICAgICAgICAgIG5ldyBBbnlQcmluY2lwYWwoKSxcclxuICAgICAgICAgICAgICAgIF0sXHJcbiAgICAgICAgICAgIH0pLFxyXG4gICAgICAgIF0sXHJcbiAgICB9KTtcclxufVxyXG5cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVJcFJlc3RyaWN0aW9uUG9saWN5RG9jdW1lbnQoYWxsb3dGcm9tSXBBZGRyZXNzZXM6IHN0cmluZ1tdKTogUG9saWN5RG9jdW1lbnQge1xyXG4gICAgcmV0dXJuIG5ldyBQb2xpY3lEb2N1bWVudCh7XHJcbiAgICAgICAgc3RhdGVtZW50czogW1xyXG4gICAgICAgICAgICBuZXcgUG9saWN5U3RhdGVtZW50KHtcclxuICAgICAgICAgICAgICAgIGVmZmVjdDogRWZmZWN0LkFMTE9XLFxyXG4gICAgICAgICAgICAgICAgY29uZGl0aW9uczoge1xyXG4gICAgICAgICAgICAgICAgICAgIFwiSXBBZGRyZXNzXCI6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgXCJhd3M6U291cmNlSXBcIjogYWxsb3dGcm9tSXBBZGRyZXNzZXMsXHJcbiAgICAgICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBhY3Rpb25zOiBbXHJcbiAgICAgICAgICAgICAgICAgICAgXCJleGVjdXRlLWFwaTpJbnZva2VcIixcclxuICAgICAgICAgICAgICAgIF0sXHJcbiAgICAgICAgICAgICAgICByZXNvdXJjZXM6IFtcclxuICAgICAgICAgICAgICAgICAgICBcIipcIixcclxuICAgICAgICAgICAgICAgIF0sXHJcbiAgICAgICAgICAgICAgICBwcmluY2lwYWxzOiBbXHJcbiAgICAgICAgICAgICAgICAgICAgbmV3IEFueVByaW5jaXBhbCgpLFxyXG4gICAgICAgICAgICAgICAgXSxcclxuICAgICAgICAgICAgfSksXHJcbiAgICAgICAgXSxcclxuICAgIH0pO1xyXG59XHJcbiJdfQ==
@@ -0,0 +1,20 @@
1
+ import { IAspect } from "aws-cdk-lib";
2
+ import { DigitrafficStack, StackConfiguration } from "./stack";
3
+ import { IConstruct } from "constructs";
4
+ export declare class StackCheckingAspect implements IAspect {
5
+ private readonly configuration?;
6
+ constructor(configuration?: StackConfiguration);
7
+ static create(stack: DigitrafficStack): StackCheckingAspect;
8
+ visit(node: IConstruct): void;
9
+ private isWhitelisted;
10
+ private addAnnotation;
11
+ private checkStack;
12
+ private checkFunction;
13
+ private checkTags;
14
+ private checkBucket;
15
+ private static isValidPath;
16
+ private static isValidQueryString;
17
+ private checkResourceCasing;
18
+ private checkQueueEncryption;
19
+ private checkLogGroupRetention;
20
+ }