@digitraffic/common 2022.10.25-1 → 2022.10.31-1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (283) hide show
  1. package/.editorconfig +9 -0
  2. package/.eslintignore +4 -0
  3. package/.eslintrc.json +27 -0
  4. package/.github/CODEOWNERS +2 -0
  5. package/.github/workflows/build.yml +36 -0
  6. package/.github/workflows/eslint.yml +38 -0
  7. package/.github/workflows/mirror.yml +15 -0
  8. package/.gitignore +29 -0
  9. package/.husky/pre-commit +4 -0
  10. package/.prettierrc.json +10 -0
  11. package/dist/aws/infra/api/integration.js +52 -0
  12. package/dist/aws/infra/api/response.js +61 -0
  13. package/dist/aws/infra/api/responses.js +82 -0
  14. package/dist/aws/infra/api/static-integration.js +54 -0
  15. package/dist/aws/infra/canaries/canary-alarm.js +26 -0
  16. package/dist/aws/infra/canaries/canary-keys.js +7 -0
  17. package/dist/aws/infra/canaries/canary-parameters.js +3 -0
  18. package/dist/aws/infra/canaries/canary-role.js +46 -0
  19. package/dist/aws/infra/canaries/canary.js +32 -0
  20. package/dist/aws/infra/canaries/database-canary.js +70 -0
  21. package/dist/aws/infra/canaries/database-checker.js +103 -0
  22. package/dist/aws/infra/canaries/url-canary.js +47 -0
  23. package/dist/aws/infra/canaries/url-checker.js +252 -0
  24. package/dist/aws/infra/documentation.js +95 -0
  25. package/dist/aws/infra/scheduler.js +31 -0
  26. package/dist/aws/infra/security-rule.js +39 -0
  27. package/dist/aws/infra/sqs-integration.js +93 -0
  28. package/dist/aws/infra/sqs-queue.js +130 -0
  29. package/dist/aws/infra/stack/lambda-configs.js +105 -0
  30. package/dist/aws/infra/stack/monitoredfunction.js +143 -0
  31. package/dist/aws/infra/stack/rest_apis.js +185 -0
  32. package/dist/aws/infra/stack/stack-checking-aspect.js +174 -0
  33. package/dist/aws/infra/stack/stack.js +67 -0
  34. package/dist/aws/infra/stack/subscription.js +42 -0
  35. package/dist/aws/infra/usage-plans.js +42 -0
  36. package/dist/aws/runtime/apikey.js +13 -0
  37. package/dist/aws/runtime/digitraffic-integration-response.js +26 -0
  38. package/dist/aws/runtime/environment.js +12 -0
  39. package/dist/aws/runtime/messaging.js +31 -0
  40. package/dist/aws/runtime/s3.js +30 -0
  41. package/dist/aws/runtime/secrets/dbsecret.js +96 -0
  42. package/dist/aws/runtime/secrets/proxy-holder.js +27 -0
  43. package/dist/aws/runtime/secrets/rds-holder.js +27 -0
  44. package/dist/aws/runtime/secrets/secret-holder.js +76 -0
  45. package/dist/aws/runtime/secrets/secret.js +43 -0
  46. package/dist/aws/types/errors.js +16 -0
  47. package/dist/aws/types/lambda-response.js +33 -0
  48. package/dist/aws/types/mediatypes.js +16 -0
  49. package/dist/aws/types/model-with-reference.js +3 -0
  50. package/dist/aws/types/proxytypes.js +3 -0
  51. package/dist/aws/types/tags.js +7 -0
  52. package/dist/database/cached.js +32 -0
  53. package/dist/database/database.js +70 -0
  54. package/dist/database/last-updated.js +54 -0
  55. package/dist/database/models.js +3 -0
  56. package/dist/marine/id_utils.js +33 -0
  57. package/dist/marine/rtz.js +3 -0
  58. package/dist/test/asserter.js +45 -0
  59. package/dist/test/db-testutils.js +31 -0
  60. package/dist/test/httpserver.js +74 -0
  61. package/dist/test/secret.js +25 -0
  62. package/dist/test/secrets-manager.js +59 -0
  63. package/dist/test/testutils.js +44 -0
  64. package/dist/types/either.js +3 -0
  65. package/dist/types/input-error.js +7 -0
  66. package/dist/types/language.js +10 -0
  67. package/dist/types/traffictype.js +13 -0
  68. package/dist/types/validator.js +14 -0
  69. package/dist/utils/api-model.js +129 -0
  70. package/dist/utils/base64.js +21 -0
  71. package/dist/utils/date-utils.js +34 -0
  72. package/dist/utils/geojson-types.js +18 -0
  73. package/dist/utils/geometry.js +164 -0
  74. package/dist/utils/retry.js +50 -0
  75. package/dist/utils/slack.js +25 -0
  76. package/dist/utils/utils.js +75 -0
  77. package/jest.config.js +15 -0
  78. package/package.json +15 -13
  79. package/src/@types/geojson-validation/index.d.ts +4 -0
  80. package/src/aws/infra/api/integration.ts +73 -0
  81. package/src/aws/infra/api/response.ts +67 -0
  82. package/src/aws/infra/api/responses.ts +124 -0
  83. package/src/aws/infra/api/static-integration.ts +62 -0
  84. package/src/aws/infra/canaries/canary-alarm.ts +31 -0
  85. package/src/aws/infra/canaries/canary-keys.ts +3 -0
  86. package/{aws/infra/canaries/canary-parameters.d.ts → src/aws/infra/canaries/canary-parameters.ts} +7 -6
  87. package/src/aws/infra/canaries/canary-role.ts +47 -0
  88. package/src/aws/infra/canaries/canary.ts +46 -0
  89. package/src/aws/infra/canaries/database-canary.ts +98 -0
  90. package/src/aws/infra/canaries/database-checker.ts +155 -0
  91. package/src/aws/infra/canaries/url-canary.ts +74 -0
  92. package/src/aws/infra/canaries/url-checker.ts +366 -0
  93. package/src/aws/infra/documentation.ts +124 -0
  94. package/src/aws/infra/scheduler.ts +59 -0
  95. package/src/aws/infra/security-rule.ts +38 -0
  96. package/src/aws/infra/sqs-integration.ts +102 -0
  97. package/src/aws/infra/sqs-queue.ts +148 -0
  98. package/src/aws/infra/stack/lambda-configs.ts +207 -0
  99. package/src/aws/infra/stack/monitoredfunction.ts +342 -0
  100. package/src/aws/infra/stack/rest_apis.ts +223 -0
  101. package/src/aws/infra/stack/stack-checking-aspect.ts +279 -0
  102. package/src/aws/infra/stack/stack.ts +145 -0
  103. package/src/aws/infra/stack/subscription.ts +58 -0
  104. package/src/aws/infra/usage-plans.ts +41 -0
  105. package/src/aws/runtime/apikey.ts +9 -0
  106. package/src/aws/runtime/digitraffic-integration-response.ts +28 -0
  107. package/src/aws/runtime/environment.ts +9 -0
  108. package/src/aws/runtime/messaging.ts +26 -0
  109. package/src/aws/runtime/s3.ts +44 -0
  110. package/src/aws/runtime/secrets/dbsecret.ts +116 -0
  111. package/src/aws/runtime/secrets/proxy-holder.ts +37 -0
  112. package/src/aws/runtime/secrets/rds-holder.ts +33 -0
  113. package/src/aws/runtime/secrets/secret-holder.ts +116 -0
  114. package/src/aws/runtime/secrets/secret.ts +50 -0
  115. package/src/aws/types/errors.ts +14 -0
  116. package/src/aws/types/lambda-response.ts +43 -0
  117. package/{aws/types/mediatypes.d.ts → src/aws/types/mediatypes.ts} +4 -3
  118. package/{aws/types/model-with-reference.d.ts → src/aws/types/model-with-reference.ts} +2 -1
  119. package/src/aws/types/proxytypes.ts +27 -0
  120. package/src/aws/types/tags.ts +3 -0
  121. package/src/database/cached.ts +35 -0
  122. package/src/database/database.ts +96 -0
  123. package/src/database/last-updated.ts +59 -0
  124. package/{database/models.d.ts → src/database/models.ts} +1 -0
  125. package/src/marine/id_utils.ts +30 -0
  126. package/src/marine/rtz.ts +57 -0
  127. package/src/test/asserter.ts +48 -0
  128. package/src/test/db-testutils.ts +44 -0
  129. package/src/test/httpserver.ts +96 -0
  130. package/src/test/secret.ts +23 -0
  131. package/src/test/secrets-manager.ts +34 -0
  132. package/src/test/testutils.ts +39 -0
  133. package/src/types/either.ts +3 -0
  134. package/src/types/input-error.ts +2 -0
  135. package/src/types/language.ts +3 -0
  136. package/src/types/traffictype.ts +8 -0
  137. package/src/types/validator.ts +10 -0
  138. package/src/utils/api-model.ts +133 -0
  139. package/src/utils/base64.ts +16 -0
  140. package/src/utils/date-utils.ts +30 -0
  141. package/src/utils/geojson-types.ts +22 -0
  142. package/src/utils/geometry.ts +164 -0
  143. package/src/utils/retry.ts +49 -0
  144. package/src/utils/slack.ts +22 -0
  145. package/src/utils/utils.ts +105 -0
  146. package/test/marine/id_utils.test.ts +57 -0
  147. package/test/promise/promise.test.ts +143 -0
  148. package/test/secrets/dbsecret.test.ts +59 -0
  149. package/test/secrets/secret-holder.test.ts +143 -0
  150. package/test/secrets/secret.test.ts +49 -0
  151. package/test/test/httpserver.test.ts +128 -0
  152. package/test/utils/date-utils.test.ts +28 -0
  153. package/test/utils/geometry.test.ts +29 -0
  154. package/test/utils/utils.test.ts +64 -0
  155. package/tsconfig.eslint.json +4 -0
  156. package/tsconfig.json +22 -0
  157. package/yarn.lock +4060 -0
  158. package/aws/infra/api/integration.d.ts +0 -21
  159. package/aws/infra/api/integration.js +0 -52
  160. package/aws/infra/api/response.d.ts +0 -22
  161. package/aws/infra/api/response.js +0 -61
  162. package/aws/infra/api/responses.d.ts +0 -39
  163. package/aws/infra/api/responses.js +0 -79
  164. package/aws/infra/api/static-integration.d.ts +0 -15
  165. package/aws/infra/api/static-integration.js +0 -54
  166. package/aws/infra/canaries/canary-alarm.d.ts +0 -6
  167. package/aws/infra/canaries/canary-alarm.js +0 -26
  168. package/aws/infra/canaries/canary-parameters.js +0 -3
  169. package/aws/infra/canaries/canary-role.d.ts +0 -6
  170. package/aws/infra/canaries/canary-role.js +0 -46
  171. package/aws/infra/canaries/canary.d.ts +0 -8
  172. package/aws/infra/canaries/canary.js +0 -32
  173. package/aws/infra/canaries/database-canary.d.ts +0 -18
  174. package/aws/infra/canaries/database-canary.js +0 -55
  175. package/aws/infra/canaries/database-checker.d.ts +0 -21
  176. package/aws/infra/canaries/database-checker.js +0 -109
  177. package/aws/infra/canaries/url-canary.d.ts +0 -19
  178. package/aws/infra/canaries/url-canary.js +0 -46
  179. package/aws/infra/canaries/url-checker.d.ts +0 -46
  180. package/aws/infra/canaries/url-checker.js +0 -238
  181. package/aws/infra/documentation.d.ts +0 -56
  182. package/aws/infra/documentation.js +0 -95
  183. package/aws/infra/scheduler.d.ts +0 -12
  184. package/aws/infra/scheduler.js +0 -31
  185. package/aws/infra/security-rule.d.ts +0 -12
  186. package/aws/infra/security-rule.js +0 -39
  187. package/aws/infra/sqs-integration.d.ts +0 -7
  188. package/aws/infra/sqs-integration.js +0 -93
  189. package/aws/infra/sqs-queue.d.ts +0 -16
  190. package/aws/infra/sqs-queue.js +0 -130
  191. package/aws/infra/stack/lambda-configs.d.ts +0 -72
  192. package/aws/infra/stack/lambda-configs.js +0 -93
  193. package/aws/infra/stack/monitoredfunction.d.ts +0 -84
  194. package/aws/infra/stack/monitoredfunction.js +0 -135
  195. package/aws/infra/stack/rest_apis.d.ts +0 -41
  196. package/aws/infra/stack/rest_apis.js +0 -185
  197. package/aws/infra/stack/stack-checking-aspect.d.ts +0 -21
  198. package/aws/infra/stack/stack-checking-aspect.js +0 -174
  199. package/aws/infra/stack/stack.d.ts +0 -44
  200. package/aws/infra/stack/stack.js +0 -60
  201. package/aws/infra/stack/subscription.d.ts +0 -17
  202. package/aws/infra/stack/subscription.js +0 -41
  203. package/aws/infra/usage-plans.d.ts +0 -15
  204. package/aws/infra/usage-plans.js +0 -42
  205. package/aws/runtime/apikey.d.ts +0 -2
  206. package/aws/runtime/apikey.js +0 -13
  207. package/aws/runtime/digitraffic-integration-response.d.ts +0 -8
  208. package/aws/runtime/digitraffic-integration-response.js +0 -26
  209. package/aws/runtime/environment.d.ts +0 -1
  210. package/aws/runtime/environment.js +0 -12
  211. package/aws/runtime/messaging.d.ts +0 -10
  212. package/aws/runtime/messaging.js +0 -31
  213. package/aws/runtime/s3.d.ts +0 -2
  214. package/aws/runtime/s3.js +0 -30
  215. package/aws/runtime/secrets/dbsecret.d.ts +0 -54
  216. package/aws/runtime/secrets/dbsecret.js +0 -96
  217. package/aws/runtime/secrets/proxy-holder.d.ts +0 -9
  218. package/aws/runtime/secrets/proxy-holder.js +0 -26
  219. package/aws/runtime/secrets/rds-holder.d.ts +0 -9
  220. package/aws/runtime/secrets/rds-holder.js +0 -26
  221. package/aws/runtime/secrets/secret-holder.d.ts +0 -26
  222. package/aws/runtime/secrets/secret-holder.js +0 -73
  223. package/aws/runtime/secrets/secret.d.ts +0 -8
  224. package/aws/runtime/secrets/secret.js +0 -43
  225. package/aws/types/errors.d.ts +0 -4
  226. package/aws/types/errors.js +0 -9
  227. package/aws/types/lambda-response.d.ts +0 -12
  228. package/aws/types/lambda-response.js +0 -28
  229. package/aws/types/mediatypes.js +0 -15
  230. package/aws/types/model-with-reference.js +0 -3
  231. package/aws/types/proxytypes.d.ts +0 -26
  232. package/aws/types/proxytypes.js +0 -3
  233. package/aws/types/tags.d.ts +0 -2
  234. package/aws/types/tags.js +0 -7
  235. package/database/cached.d.ts +0 -7
  236. package/database/cached.js +0 -32
  237. package/database/database.d.ts +0 -19
  238. package/database/database.js +0 -62
  239. package/database/last-updated.d.ts +0 -16
  240. package/database/last-updated.js +0 -54
  241. package/database/models.js +0 -3
  242. package/index.d.ts +0 -1
  243. package/index.js +0 -18
  244. package/marine/id_utils.d.ts +0 -3
  245. package/marine/id_utils.js +0 -33
  246. package/marine/rtz.d.ts +0 -48
  247. package/marine/rtz.js +0 -3
  248. package/test/asserter.d.ts +0 -11
  249. package/test/asserter.js +0 -45
  250. package/test/db-testutils.d.ts +0 -2
  251. package/test/db-testutils.js +0 -31
  252. package/test/httpserver.d.ts +0 -18
  253. package/test/httpserver.js +0 -67
  254. package/test/secret.d.ts +0 -3
  255. package/test/secret.js +0 -25
  256. package/test/secrets-manager.d.ts +0 -9
  257. package/test/secrets-manager.js +0 -59
  258. package/test/testutils.d.ts +0 -12
  259. package/test/testutils.js +0 -44
  260. package/types/input-error.d.ts +0 -2
  261. package/types/input-error.js +0 -7
  262. package/types/language.d.ts +0 -5
  263. package/types/language.js +0 -10
  264. package/types/traffictype.d.ts +0 -8
  265. package/types/traffictype.js +0 -13
  266. package/types/validator.d.ts +0 -4
  267. package/types/validator.js +0 -14
  268. package/utils/api-model.d.ts +0 -87
  269. package/utils/api-model.js +0 -129
  270. package/utils/base64.d.ts +0 -12
  271. package/utils/base64.js +0 -21
  272. package/utils/date-utils.d.ts +0 -17
  273. package/utils/date-utils.js +0 -34
  274. package/utils/geojson-types.d.ts +0 -14
  275. package/utils/geojson-types.js +0 -18
  276. package/utils/geometry.d.ts +0 -36
  277. package/utils/geometry.js +0 -140
  278. package/utils/retry.d.ts +0 -13
  279. package/utils/retry.js +0 -50
  280. package/utils/slack.d.ts +0 -5
  281. package/utils/slack.js +0 -25
  282. package/utils/utils.d.ts +0 -30
  283. package/utils/utils.js +0 -64
@@ -1,93 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.defaultLambdaConfiguration = exports.dbLambdaConfiguration = exports.lambdaFunctionProps = exports.databaseFunctionProps = void 0;
4
- const aws_lambda_1 = require("aws-cdk-lib/aws-lambda");
5
- const aws_cdk_lib_1 = require("aws-cdk-lib");
6
- const aws_logs_1 = require("aws-cdk-lib/aws-logs");
7
- function databaseFunctionProps(stack, environment, lambdaName, simpleLambdaName, config) {
8
- const vpcSubnets = stack.vpc ? {
9
- subnets: stack.vpc.privateSubnets,
10
- } : undefined;
11
- return { ...lambdaFunctionProps(stack, environment, lambdaName, simpleLambdaName, config), ...{
12
- vpc: stack.vpc || undefined,
13
- vpcSubnets,
14
- securityGroup: stack.lambdaDbSg || undefined,
15
- } };
16
- }
17
- exports.databaseFunctionProps = databaseFunctionProps;
18
- function lambdaFunctionProps(stack, environment, lambdaName, simpleLambdaName, config) {
19
- return {
20
- runtime: config?.runtime || aws_lambda_1.Runtime.NODEJS_14_X,
21
- architecture: config?.architecture || aws_lambda_1.Architecture.ARM_64,
22
- memorySize: config?.memorySize || 128,
23
- functionName: lambdaName,
24
- role: config?.role,
25
- timeout: aws_cdk_lib_1.Duration.seconds(config?.timeout || 60),
26
- logRetention: aws_logs_1.RetentionDays.ONE_YEAR,
27
- reservedConcurrentExecutions: config?.reservedConcurrentExecutions || 2,
28
- code: getAssetCode(simpleLambdaName, config),
29
- handler: `${simpleLambdaName}.handler`,
30
- environment,
31
- };
32
- }
33
- exports.lambdaFunctionProps = lambdaFunctionProps;
34
- function getAssetCode(simpleLambdaName, config) {
35
- const lambdaPath = config?.singleLambda ? `dist/lambda/` : `dist/lambda/${simpleLambdaName}`;
36
- return new aws_lambda_1.AssetCode(lambdaPath);
37
- }
38
- /**
39
- * Creates a base configuration for a Lambda that uses an RDS database
40
- * @param vpc "Private" Lambdas are associated with a VPC
41
- * @param lambdaDbSg Security Group shared by Lambda and RDS
42
- * @param props Database connection properties for the Lambda
43
- * @param config Lambda configuration
44
- */
45
- function dbLambdaConfiguration(vpc, lambdaDbSg, props, config) {
46
- return {
47
- runtime: props.runtime || aws_lambda_1.Runtime.NODEJS_14_X,
48
- memorySize: props.memorySize || config.memorySize || 1024,
49
- functionName: config.functionName,
50
- code: config.code,
51
- role: config.role,
52
- handler: config.handler,
53
- timeout: aws_cdk_lib_1.Duration.seconds(config.timeout || props.defaultLambdaDurationSeconds || 60),
54
- environment: config.environment || {
55
- DB_USER: props.dbProps?.username,
56
- DB_PASS: props.dbProps?.password,
57
- DB_URI: (config.readOnly ? props.dbProps?.ro_uri : props.dbProps?.uri),
58
- },
59
- logRetention: aws_logs_1.RetentionDays.ONE_YEAR,
60
- vpc: vpc,
61
- vpcSubnets: {
62
- subnets: vpc.privateSubnets,
63
- },
64
- securityGroups: [lambdaDbSg],
65
- reservedConcurrentExecutions: config.reservedConcurrentExecutions || 3,
66
- };
67
- }
68
- exports.dbLambdaConfiguration = dbLambdaConfiguration;
69
- function defaultLambdaConfiguration(config) {
70
- const props = {
71
- runtime: aws_lambda_1.Runtime.NODEJS_14_X,
72
- memorySize: config.memorySize ?? 128,
73
- functionName: config.functionName,
74
- handler: config.handler,
75
- environment: config.environment ?? {},
76
- logRetention: aws_logs_1.RetentionDays.ONE_YEAR,
77
- reservedConcurrentExecutions: config.reservedConcurrentExecutions,
78
- code: config.code,
79
- role: config.role,
80
- timeout: aws_cdk_lib_1.Duration.seconds(config.timeout || 10),
81
- };
82
- if (config.vpc) {
83
- return { ...props, ...{
84
- vpc: config.vpc,
85
- vpcSubnets: {
86
- subnets: config.vpc?.privateSubnets,
87
- },
88
- } };
89
- }
90
- return props;
91
- }
92
- exports.defaultLambdaConfiguration = defaultLambdaConfiguration;
93
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGFtYmRhLWNvbmZpZ3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvYXdzL2luZnJhL3N0YWNrL2xhbWJkYS1jb25maWdzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHVEQUE2RjtBQUM3Riw2Q0FBcUM7QUFFckMsbURBQW1EO0FBZ0NuRCxTQUFnQixxQkFBcUIsQ0FDakMsS0FBdUIsRUFBRSxXQUE4QixFQUFFLFVBQWtCLEVBQUUsZ0JBQXdCLEVBQUUsTUFBMkI7SUFFbEksTUFBTSxVQUFVLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDM0IsT0FBTyxFQUFFLEtBQUssQ0FBQyxHQUFHLENBQUMsY0FBYztLQUNwQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFFZCxPQUFPLEVBQUMsR0FBRyxtQkFBbUIsQ0FDMUIsS0FBSyxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxDQUMzRCxFQUFFLEdBQUc7WUFDRixHQUFHLEVBQUUsS0FBSyxDQUFDLEdBQUcsSUFBSSxTQUFTO1lBQzNCLFVBQVU7WUFDVixhQUFhLEVBQUUsS0FBSyxDQUFDLFVBQVUsSUFBSSxTQUFTO1NBQy9DLEVBQUMsQ0FBQztBQUNQLENBQUM7QUFkRCxzREFjQztBQUVELFNBQWdCLG1CQUFtQixDQUMvQixLQUF1QixFQUFFLFdBQThCLEVBQUUsVUFBa0IsRUFBRSxnQkFBd0IsRUFBRSxNQUEyQjtJQUVsSSxPQUFPO1FBQ0gsT0FBTyxFQUFFLE1BQU0sRUFBRSxPQUFPLElBQUksb0JBQU8sQ0FBQyxXQUFXO1FBQy9DLFlBQVksRUFBRSxNQUFNLEVBQUUsWUFBWSxJQUFJLHlCQUFZLENBQUMsTUFBTTtRQUN6RCxVQUFVLEVBQUUsTUFBTSxFQUFFLFVBQVUsSUFBSSxHQUFHO1FBQ3JDLFlBQVksRUFBRSxVQUFVO1FBQ3hCLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSTtRQUNsQixPQUFP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QUcsS0FBSyxFQUFFLEdBQUc7Z0JBQ2pCLEdBQUcsRUFBRSxNQUFNLENBQUMsR0FBRztnQkFDZixVQUFVLEVBQUU7b0JBQ1IsT0FBTyxFQUFFLE1BQU0sQ0FBQyxHQUFHLEVBQUUsY0FBYztpQkFDdEM7YUFDSixFQUFDLENBQUM7S0FDTjtJQUNELE9BQU8sS0FBSyxDQUFDO0FBQ2pCLENBQUM7QUF0QkQsZ0VBc0JDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtBcmNoaXRlY3R1cmUsIEFzc2V0Q29kZSwgQ29kZSwgRnVuY3Rpb25Qcm9wcywgUnVudGltZX0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWxhbWJkYSc7XG5pbXBvcnQge0R1cmF0aW9ufSBmcm9tIFwiYXdzLWNkay1saWJcIjtcbmltcG9ydCB7SVNlY3VyaXR5R3JvdXAsIElWcGMsIFN1Ym5ldFNlbGVjdGlvbn0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1lYzJcIjtcbmltcG9ydCB7UmV0ZW50aW9uRGF5c30gZnJvbSAnYXdzLWNkay1saWIvYXdzLWxvZ3MnO1xuaW1wb3J0IHtSb2xlfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtaWFtJztcbmltcG9ydCB7RGlnaXRyYWZmaWNTdGFja30gZnJvbSBcIi4vc3RhY2tcIjtcbmltcG9ydCB7TW9uaXRvcmVkRnVuY3Rpb25BbGFybVByb3BzfSBmcm9tIFwiLi9tb25pdG9yZWRmdW5jdGlvblwiO1xuXG5leHBvcnQgdHlwZSBMYW1iZGFFbnZpcm9ubWVudCA9IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG5cbmV4cG9ydCB0eXBlIERCTGFtYmRhRW52aXJvbm1lbnQgPSBMYW1iZGFFbnZpcm9ubWVudCAmIHtcbiAgICBTRUNSRVRfSUQ/OiBzdHJpbmdcbiAgICBEQl9BUFBMSUNBVElPTjogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTGFtYmRhQ29uZmlndXJhdGlvbiB7XG4gICAgdnBjSWQ6IHN0cmluZztcbiAgICBhbGxvd0Zyb21JcEFkZHJlc3Nlcz86IHN0cmluZ1tdO1xuICAgIHByaXZhdGVTdWJuZXRJZHM6IHN0cmluZ1tdO1xuICAgIGF2YWlsYWJpbGl0eVpvbmVzOiBzdHJpbmdbXTtcbiAgICBsYW1iZGFEYlNnSWQ6IHN0cmluZztcbiAgICBkYlByb3BzPzogRGJQcm9wcztcbiAgICBkZWZhdWx0TGFtYmRhRHVyYXRpb25TZWNvbmRzPzogbnVtYmVyO1xuICAgIGxvZ3NEZXN0aW5hdGlvbkFybjogc3RyaW5nO1xuICAgIG1lbW9yeVNpemU/OiBudW1iZXIsXG4gICAgcnVudGltZT86IFJ1bnRpbWU7XG59XG5cbmRlY2xhcmUgaW50ZXJmYWNlIERiUHJvcHMge1xuICAgIHVzZXJuYW1lOiBzdHJpbmc7XG4gICAgcGFzc3dvcmQ6IHN0cmluZztcbiAgICB1cmk/OiBzdHJpbmc7XG4gICAgcm9fdXJpPzogc3RyaW5nO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGF0YWJhc2VGdW5jdGlvblByb3BzKFxuICAgIHN0YWNrOiBEaWdpdHJhZmZpY1N0YWNrLCBlbnZpcm9ubWVudDogTGFtYmRhRW52aXJvbm1lbnQsIGxhbWJkYU5hbWU6IHN0cmluZywgc2ltcGxlTGFtYmRhTmFtZTogc3RyaW5nLCBjb25maWc/OiBGdW5jdGlvblBhcmFtZXRlcnMsXG4pOiBGdW5jdGlvblByb3BzIHtcbiAgICBjb25zdCB2cGNTdWJuZXRzID0gc3RhY2sudnBjID8ge1xuICAgICAgICBzdWJuZXRzOiBzdGFjay52cGMucHJpdmF0ZVN1Ym5ldHMsXG4gICAgfSA6IHVuZGVmaW5lZDtcblxuICAgIHJldHVybiB7Li4ubGFtYmRhRnVuY3Rpb25Qcm9wcyhcbiAgICAgICAgc3RhY2ssIGVudmlyb25tZW50LCBsYW1iZGFOYW1lLCBzaW1wbGVMYW1iZGFOYW1lLCBjb25maWcsXG4gICAgKSwgLi4ue1xuICAgICAgICB2cGM6IHN0YWNrLnZwYyB8fCB1bmRlZmluZWQsXG4gICAgICAgIHZwY1N1Ym5ldHMsXG4gICAgICAgIHNlY3VyaXR5R3JvdXA6IHN0YWNrLmxhbWJkYURiU2cgfHwgdW5kZWZpbmVkLFxuICAgIH19O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbGFtYmRhRnVuY3Rpb25Qcm9wcyhcbiAgICBzdGFjazogRGlnaXRyYWZmaWNTdGFjaywgZW52aXJvbm1lbnQ6IExhbWJkYUVudmlyb25tZW50LCBsYW1iZGFOYW1lOiBzdHJpbmcsIHNpbXBsZUxhbWJkYU5hbWU6IHN0cmluZywgY29uZmlnPzogRnVuY3Rpb25QYXJhbWV0ZXJzLFxuKTogRnVuY3Rpb25Qcm9wcyB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgcnVudGltZTogY29uZmlnPy5ydW50aW1lIHx8IFJ1bnRpbWUuTk9ERUpTXzE0X1gsXG4gICAgICAgIGFyY2hpdGVjdHVyZTogY29uZmlnPy5hcmNoaXRlY3R1cmUgfHwgQXJjaGl0ZWN0dXJlLkFSTV82NCxcbiAgICAgICAgbWVtb3J5U2l6ZTogY29uZmlnPy5tZW1vcnlTaXplIHx8IDEyOCxcbiAgICAgICAgZnVuY3Rpb25OYW1lOiBsYW1iZGFOYW1lLFxuICAgICAgICByb2xlOiBjb25maWc/LnJvbGUsXG4gICAgICAgIHRpbWVvdXQ6IER1cmF0aW9uLnNlY29uZHMoY29uZmlnPy50aW1lb3V0IHx8IDYwKSxcbiAgICAgICAgbG9nUmV0ZW50aW9uOiBSZXRlbnRpb25EYXlzLk9ORV9ZRUFSLFxuICAgICAgICByZXNlcnZlZENvbmN1cnJlbnRFeGVjdXRpb25zOiBjb25maWc/LnJlc2VydmVkQ29uY3VycmVudEV4ZWN1dGlvbnMgfHwgMixcbiAgICAgICAgY29kZTogZ2V0QXNzZXRDb2RlKHNpbXBsZUxhbWJkYU5hbWUsIGNvbmZpZyksXG4gICAgICAgIGhhbmRsZXI6IGAke3NpbXBsZUxhbWJkYU5hbWV9LmhhbmRsZXJgLFxuICAgICAgICBlbnZpcm9ubWVudCxcbiAgICB9O1xufVxuXG5mdW5jdGlvbiBnZXRBc3NldENvZGUoc2ltcGxlTGFtYmRhTmFtZTogc3RyaW5nLCBjb25maWc/OiBGdW5jdGlvblBhcmFtZXRlcnMpOiBBc3NldENvZGUge1xuICAgIGNvbnN0IGxhbWJkYVBhdGggPSBjb25maWc/LnNpbmdsZUxhbWJkYSA/IGBkaXN0L2xhbWJkYS9gIDogYGRpc3QvbGFtYmRhLyR7c2ltcGxlTGFtYmRhTmFtZX1gO1xuXG4gICAgcmV0dXJuIG5ldyBBc3NldENvZGUobGFtYmRhUGF0aCk7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIGJhc2UgY29uZmlndXJhdGlvbiBmb3IgYSBMYW1iZGEgdGhhdCB1c2VzIGFuIFJEUyBkYXRhYmFzZVxuICogQHBhcmFtIHZwYyBcIlByaXZhdGVcIiBMYW1iZGFzIGFyZSBhc3NvY2lhdGVkIHdpdGggYSBWUENcbiAqIEBwYXJhbSBsYW1iZGFEYlNnIFNlY3VyaXR5IEdyb3VwIHNoYXJlZCBieSBMYW1iZGEgYW5kIFJEU1xuICogQHBhcmFtIHByb3BzIERhdGFiYXNlIGNvbm5lY3Rpb24gcHJvcGVydGllcyBmb3IgdGhlIExhbWJkYVxuICogQHBhcmFtIGNvbmZpZyBMYW1iZGEgY29uZmlndXJhdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gZGJMYW1iZGFDb25maWd1cmF0aW9uKHZwYzogSVZwYyxcbiAgICBsYW1iZGFEYlNnOiBJU2VjdXJpdHlHcm91cCxcbiAgICBwcm9wczogTGFtYmRhQ29uZmlndXJhdGlvbixcbiAgICBjb25maWc6IEZ1bmN0aW9uUGFyYW1ldGVycyk6IEZ1bmN0aW9uUHJvcHMge1xuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgcnVudGltZTogcHJvcHMucnVudGltZSB8fCBSdW50aW1lLk5PREVKU18xNF9YLFxuICAgICAgICBtZW1vcnlTaXplOiBwcm9wcy5tZW1vcnlTaXplIHx8IGNvbmZpZy5tZW1vcnlTaXplIHx8IDEwMjQsXG4gICAgICAgIGZ1bmN0aW9uTmFtZTogY29uZmlnLmZ1bmN0aW9uTmFtZSxcbiAgICAgICAgY29kZTogY29uZmlnLmNvZGUgYXMgQ29kZSxcbiAgICAgICAgcm9sZTogY29uZmlnLnJvbGUsXG4gICAgICAgIGhhbmRsZXI6IGNvbmZpZy5oYW5kbGVyIGFzIHN0cmluZyxcbiAgICAgICAgdGltZW91dDogRHVyYXRpb24uc2Vjb25kcyhjb25maWcudGltZW91dCB8fCBwcm9wcy5kZWZhdWx0TGFtYmRhRHVyYXRpb25TZWNvbmRzIHx8IDYwKSxcbiAgICAgICAgZW52aXJvbm1lbnQ6IGNvbmZpZy5lbnZpcm9ubWVudCB8fCB7XG4gICAgICAgICAgICBEQl9VU0VSOiBwcm9wcy5kYlByb3BzPy51c2VybmFtZSBhcyBzdHJpbmcsXG4gICAgICAgICAgICBEQl9QQVNTOiBwcm9wcy5kYlByb3BzPy5wYXNzd29yZCBhcyBzdHJpbmcsXG4gICAgICAgICAgICBEQl9VUkk6IChjb25maWcucmVhZE9ubHkgPyBwcm9wcy5kYlByb3BzPy5yb191cmkgOiBwcm9wcy5kYlByb3BzPy51cmkpIGFzIHN0cmluZyxcbiAgICAgICAgfSxcbiAgICAgICAgbG9nUmV0ZW50aW9uOiBSZXRlbnRpb25EYXlzLk9ORV9ZRUFSLFxuICAgICAgICB2cGM6IHZwYyxcbiAgICAgICAgdnBjU3VibmV0czoge1xuICAgICAgICAgICAgc3VibmV0czogdnBjLnByaXZhdGVTdWJuZXRzLFxuICAgICAgICB9LFxuICAgICAgICBzZWN1cml0eUdyb3VwczogW2xhbWJkYURiU2ddLFxuICAgICAgICByZXNlcnZlZENvbmN1cnJlbnRFeGVjdXRpb25zOiBjb25maWcucmVzZXJ2ZWRDb25jdXJyZW50RXhlY3V0aW9ucyB8fCAzLFxuICAgIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZWZhdWx0TGFtYmRhQ29uZmlndXJhdGlvbihjb25maWc6IEZ1bmN0aW9uUGFyYW1ldGVycyk6IEZ1bmN0aW9uUHJvcHMge1xuICAgIGNvbnN0IHByb3BzOiBGdW5jdGlvblByb3BzID0ge1xuICAgICAgICBydW50aW1lOiBSdW50aW1lLk5PREVKU18xNF9YLFxuICAgICAgICBtZW1vcnlTaXplOiBjb25maWcubWVtb3J5U2l6ZSA/PyAxMjgsXG4gICAgICAgIGZ1bmN0aW9uTmFtZTogY29uZmlnLmZ1bmN0aW9uTmFtZSxcbiAgICAgICAgaGFuZGxlcjogY29uZmlnLmhhbmRsZXIgYXMgc3RyaW5nLFxuICAgICAgICBlbnZpcm9ubWVudDogY29uZmlnLmVudmlyb25tZW50ID8/IHt9LFxuICAgICAgICBsb2dSZXRlbnRpb246IFJldGVudGlvbkRheXMuT05FX1lFQVIsXG4gICAgICAgIHJlc2VydmVkQ29uY3VycmVudEV4ZWN1dGlvbnM6IGNvbmZpZy5yZXNlcnZlZENvbmN1cnJlbnRFeGVjdXRpb25zLFxuICAgICAgICBjb2RlOiBjb25maWcuY29kZSBhcyBDb2RlLFxuICAgICAgICByb2xlOiBjb25maWcucm9sZSxcbiAgICAgICAgdGltZW91dDogRHVyYXRpb24uc2Vjb25kcyhjb25maWcudGltZW91dCB8fCAxMCksXG4gICAgfTtcbiAgICBpZiAoY29uZmlnLnZwYykge1xuICAgICAgICByZXR1cm4gey4uLnByb3BzLCAuLi57XG4gICAgICAgICAgICB2cGM6IGNvbmZpZy52cGMsXG4gICAgICAgICAgICB2cGNTdWJuZXRzOiB7XG4gICAgICAgICAgICAgICAgc3VibmV0czogY29uZmlnLnZwYz8ucHJpdmF0ZVN1Ym5ldHMsXG4gICAgICAgICAgICB9LFxuICAgICAgICB9fTtcbiAgICB9XG4gICAgcmV0dXJuIHByb3BzO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZ1bmN0aW9uUGFyYW1ldGVycyB7XG4gICAgbWVtb3J5U2l6ZT86IG51bWJlcjtcbiAgICB0aW1lb3V0PzogbnVtYmVyO1xuICAgIGZ1bmN0aW9uTmFtZT86IHN0cmluZztcbiAgICBjb2RlPzogQ29kZTtcbiAgICBoYW5kbGVyPzogc3RyaW5nO1xuICAgIHJlYWRPbmx5PzogYm9vbGVhbjtcbiAgICBlbnZpcm9ubWVudD86IHtcbiAgICAgICAgW2tleTogc3RyaW5nXTogc3RyaW5nO1xuICAgIH07XG4gICAgcmVzZXJ2ZWRDb25jdXJyZW50RXhlY3V0aW9ucz86IG51bWJlcjtcbiAgICByb2xlPzogUm9sZTtcbiAgICB2cGM/OiBJVnBjO1xuICAgIHZwY1N1Ym5ldHM/OiBTdWJuZXRTZWxlY3Rpb247XG4gICAgcnVudGltZT86IFJ1bnRpbWU7XG4gICAgYXJjaGl0ZWN0dXJlPzogQXJjaGl0ZWN0dXJlO1xuICAgIHNpbmdsZUxhbWJkYT86IGJvb2xlYW47XG59XG5cbmV4cG9ydCB0eXBlIE1vbml0b3JlZEZ1bmN0aW9uUGFyYW1ldGVycyA9IHtcbiAgICByZWFkb25seSBtZW1vcnlTaXplPzogbnVtYmVyO1xuICAgIHJlYWRvbmx5IHRpbWVvdXQ/OiBudW1iZXI7XG4gICAgcmVhZG9ubHkgZnVuY3Rpb25OYW1lPzogc3RyaW5nO1xuICAgIHJlYWRvbmx5IHJlc2VydmVkQ29uY3VycmVudEV4ZWN1dGlvbnM/OiBudW1iZXI7XG4gICAgcmVhZG9ubHkgcm9sZT86IFJvbGU7XG4gICAgcmVhZG9ubHkgcnVudGltZT86IFJ1bnRpbWU7XG4gICAgcmVhZG9ubHkgYXJjaGl0ZWN0dXJlPzogQXJjaGl0ZWN0dXJlO1xuICAgIHJlYWRvbmx5IHNpbmdsZUxhbWJkYT86IGJvb2xlYW47XG5cbiAgICByZWFkb25seSBkdXJhdGlvbkFsYXJtUHJvcHM/OiBNb25pdG9yZWRGdW5jdGlvbkFsYXJtUHJvcHNcbiAgICByZWFkb25seSBkdXJhdGlvbldhcm5pbmdQcm9wcz86IE1vbml0b3JlZEZ1bmN0aW9uQWxhcm1Qcm9wc1xuICAgIHJlYWRvbmx5IGVycm9yQWxhcm1Qcm9wcz86IE1vbml0b3JlZEZ1bmN0aW9uQWxhcm1Qcm9wc1xuICAgIHJlYWRvbmx5IHRocm90dGxlQWxhcm1Qcm9wcz86IE1vbml0b3JlZEZ1bmN0aW9uQWxhcm1Qcm9wc1xufVxuIl19
@@ -1,84 +0,0 @@
1
- import { Function, FunctionProps } from 'aws-cdk-lib/aws-lambda';
2
- import { Stack } from "aws-cdk-lib";
3
- import { ComparisonOperator } from "aws-cdk-lib/aws-cloudwatch";
4
- import { DigitrafficStack } from "../stack/stack";
5
- import { ITopic } from "aws-cdk-lib/aws-sns";
6
- import { LambdaEnvironment, MonitoredFunctionParameters } from "../stack/lambda-configs";
7
- import { TrafficType } from "../../../types/traffictype";
8
- /**
9
- * Allows customization of CloudWatch Alarm properties
10
- */
11
- export declare type MonitoredFunctionAlarmProps = {
12
- /**
13
- * Setting this to false will not create a CloudWatch alarm
14
- */
15
- readonly create: boolean;
16
- readonly threshold?: number;
17
- readonly evaluationPeriods?: number;
18
- readonly datapointsToAlarm?: number;
19
- readonly comparisonOperator?: ComparisonOperator;
20
- };
21
- export declare type MonitoredFunctionProps = {
22
- readonly durationAlarmProps?: MonitoredFunctionAlarmProps;
23
- readonly durationWarningProps?: MonitoredFunctionAlarmProps;
24
- readonly errorAlarmProps?: MonitoredFunctionAlarmProps;
25
- readonly throttleAlarmProps?: MonitoredFunctionAlarmProps;
26
- };
27
- /**
28
- * Creates a Lambda function that monitors default CloudWatch Lambda metrics with CloudWatch Alarms.
29
- */
30
- export declare class MonitoredFunction extends Function {
31
- readonly givenName: string;
32
- /** disable all alarms */
33
- static readonly DISABLE_ALARMS: MonitoredFunctionProps;
34
- /**
35
- * Create new MonitoredFunction. Use topics from given DigitrafficStack.
36
- *
37
- * @param stack DigitrafficStack
38
- * @param id Lambda construct Id
39
- * @param functionProps Lambda function properties
40
- * @param props Monitored function properties
41
- */
42
- static create(stack: DigitrafficStack, id: string, functionProps: FunctionProps, props?: MonitoredFunctionProps): MonitoredFunction;
43
- /**
44
- * Create new MonitoredFunction. Use topics from given DigitrafficStack. Generate names from given name and configuration shortName.
45
- *
46
- * 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.
47
- *
48
- * @param stack DigitrafficStack
49
- * @param name param-case name
50
- * @param environment Lambda environment
51
- * @param functionParameters Lambda function parameters
52
- */
53
- static createV2(stack: DigitrafficStack, name: string, environment: LambdaEnvironment, functionParameters?: MonitoredFunctionParameters): MonitoredFunction;
54
- /**
55
- * @param scope Stack
56
- * @param id Lambda construct Id
57
- * @param functionProps Lambda function properties
58
- * @param alarmSnsTopic SNS topic for alarms
59
- * @param warningSnsTopic SNS topic for warnings
60
- * @param production Is the stack a production stack, used for determining the alarm topic
61
- * @param trafficType Traffic type, used for alarm names. Set to null if Lambda is not related to any traffic type.
62
- * @param props Monitored function properties
63
- */
64
- constructor(scope: Stack, id: string, functionProps: FunctionProps, alarmSnsTopic: ITopic, warningSnsTopic: ITopic, production: boolean, trafficType: TrafficType | null, props?: MonitoredFunctionProps);
65
- private createAlarm;
66
- private getAlarmActionForEnv;
67
- }
68
- export declare class MonitoredDBFunction {
69
- /**
70
- * Create new MonitoredDBFunction. Use topics from given DigitrafficStack. Generate names from given name and configuration shortName.
71
- * Grant secret and create log subscription.
72
- *
73
- * 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.
74
- *
75
- * If you don't need to pass any extra arguments to lambda-environment, you can leave environment out and this function will create the
76
- * default Lambda Environment with SECRET_ID and DB_APPLICATION.
77
- *
78
- * @param stack DigitrafficStack
79
- * @param name param-case name
80
- * @param environment Lambda environment
81
- * @param functionParameters Lambda function parameters
82
- */
83
- static create(stack: DigitrafficStack, name: string, environment?: LambdaEnvironment, functionParameters?: MonitoredFunctionParameters): MonitoredFunction;
84
- }
@@ -1,135 +0,0 @@
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==
@@ -1,41 +0,0 @@
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
- readonly enableDocumentation: boolean;
10
- constructor(stack: DigitrafficStack, apiId: string, apiName: string, allowFromIpAddresses?: string[] | undefined, config?: Partial<RestApiProps>);
11
- hostname(): string;
12
- createUsagePlan(apiKeyId: string, apiKeyName: string): string;
13
- createUsagePlanV2(apiName: string): string;
14
- addJsonModel(modelName: string, schema: JsonSchema): ModelWithReference;
15
- addCSVModel(modelName: string): ModelWithReference;
16
- private getModelWithReference;
17
- private addDocumentationPart;
18
- documentResource(resource: Resource, ...documentationPart: DocumentationPart[]): void;
19
- }
20
- /**
21
- * Due to AWS API design API Gateway will always return 403 'Missing Authentication Token' for requests
22
- * with a non-existent endpoint. This function translates this response to a 404.
23
- * Requests with an invalid or missing API key are not affected (still return 403 'Forbidden').
24
- * @param restApi RestApi
25
- * @param stack Construct
26
- */
27
- export declare function add404Support(restApi: RestApi, stack: Construct): void;
28
- export declare function add401Support(restApi: RestApi, stack: Construct): void;
29
- /**
30
- * Due to AWS API design API Gateway will always return 403 'Missing Authentication Token' for requests
31
- * with a non-existent endpoint. This function converts this response to a custom one.
32
- * Requests with an invalid or missing API key are not affected (still return 403 'Forbidden').
33
- * @param returnCode
34
- * @param message
35
- * @param restApi RestApi
36
- * @param stack Construct
37
- */
38
- export declare function setReturnCodeForMissingAuthenticationToken(returnCode: number, message: string, restApi: RestApi, stack: Construct): void;
39
- export declare function createRestApi(stack: Construct, apiId: string, apiName: string, allowFromIpAddresses?: string[] | undefined): RestApi;
40
- export declare function createDefaultPolicyDocument(): PolicyDocument;
41
- export declare function createIpRestrictionPolicyDocument(allowFromIpAddresses: string[]): PolicyDocument;
@@ -1,185 +0,0 @@
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
- this.enableDocumentation = stack.configuration.stackFeatures?.enableDocumentation ?? true;
25
- add404Support(this, stack);
26
- }
27
- hostname() {
28
- return `${this.restApiId}.execute-api.${this.stack.region}.amazonaws.com`;
29
- }
30
- createUsagePlan(apiKeyId, apiKeyName) {
31
- const newKeyId = (0, usage_plans_1.createUsagePlan)(this, apiKeyId, apiKeyName).keyId;
32
- this.apiKeyIds.push(newKeyId);
33
- return newKeyId;
34
- }
35
- createUsagePlanV2(apiName) {
36
- const newKeyId = (0, usage_plans_1.createDefaultUsagePlan)(this, apiName).keyId;
37
- this.apiKeyIds.push(newKeyId);
38
- return newKeyId;
39
- }
40
- addJsonModel(modelName, schema) {
41
- return this.getModelWithReference(this.addModel(modelName, {
42
- contentType: mediatypes_1.MediaType.APPLICATION_JSON,
43
- modelName,
44
- schema,
45
- }));
46
- }
47
- addCSVModel(modelName) {
48
- return this.getModelWithReference(this.addModel(modelName, {
49
- contentType: mediatypes_1.MediaType.TEXT_CSV,
50
- modelName,
51
- schema: {},
52
- }));
53
- }
54
- getModelWithReference(model) {
55
- return R.assoc('modelReference', (0, api_model_1.getModelReference)(model.modelId, this.restApiId), model);
56
- }
57
- addDocumentationPart(resource, parameterName, resourceName, type, properties) {
58
- const location = {
59
- type,
60
- path: resource.path,
61
- name: type !== 'METHOD' ? parameterName : undefined,
62
- };
63
- new aws_apigateway_1.CfnDocumentationPart(this.stack, resourceName, {
64
- restApiId: resource.api.restApiId,
65
- location,
66
- properties: JSON.stringify(properties),
67
- });
68
- }
69
- documentResource(resource, ...documentationPart) {
70
- if (this.enableDocumentation) {
71
- documentationPart.forEach(dp => this.addDocumentationPart(resource, dp.parameterName, `${resource.path}.${dp.parameterName}.Documentation`, dp.type, dp.documentationProperties));
72
- }
73
- else {
74
- console.info("Skipping documentation for %s", resource.path);
75
- }
76
- }
77
- }
78
- exports.DigitrafficRestApi = DigitrafficRestApi;
79
- /**
80
- * Due to AWS API design API Gateway will always return 403 'Missing Authentication Token' for requests
81
- * with a non-existent endpoint. This function translates this response to a 404.
82
- * Requests with an invalid or missing API key are not affected (still return 403 'Forbidden').
83
- * @param restApi RestApi
84
- * @param stack Construct
85
- */
86
- function add404Support(restApi, stack) {
87
- new aws_apigateway_1.GatewayResponse(stack, `MissingAuthenticationTokenResponse-${restApi.restApiName}`, {
88
- restApi,
89
- type: aws_apigateway_1.ResponseType.MISSING_AUTHENTICATION_TOKEN,
90
- statusCode: '404',
91
- templates: {
92
- 'application/json': '{"message": "Not found"}',
93
- },
94
- });
95
- }
96
- exports.add404Support = add404Support;
97
- function add401Support(restApi, stack) {
98
- new aws_apigateway_1.GatewayResponse(stack, `AuthenticationFailedResponse-${restApi.restApiName}`, {
99
- restApi,
100
- type: aws_apigateway_1.ResponseType.UNAUTHORIZED,
101
- statusCode: "401",
102
- responseHeaders: {
103
- 'WWW-Authenticate': "'Basic'",
104
- },
105
- });
106
- }
107
- exports.add401Support = add401Support;
108
- /**
109
- * Due to AWS API design API Gateway will always return 403 'Missing Authentication Token' for requests
110
- * with a non-existent endpoint. This function converts this response to a custom one.
111
- * Requests with an invalid or missing API key are not affected (still return 403 'Forbidden').
112
- * @param returnCode
113
- * @param message
114
- * @param restApi RestApi
115
- * @param stack Construct
116
- */
117
- function setReturnCodeForMissingAuthenticationToken(returnCode, message, restApi, stack) {
118
- new aws_apigateway_1.GatewayResponse(stack, `MissingAuthenticationTokenResponse-${restApi.restApiName}`, {
119
- restApi,
120
- type: aws_apigateway_1.ResponseType.MISSING_AUTHENTICATION_TOKEN,
121
- statusCode: `${returnCode}`,
122
- templates: {
123
- 'application/json': `{"message": ${message}}`,
124
- },
125
- });
126
- }
127
- exports.setReturnCodeForMissingAuthenticationToken = setReturnCodeForMissingAuthenticationToken;
128
- function createRestApi(stack, apiId, apiName, allowFromIpAddresses) {
129
- const policyDocument = allowFromIpAddresses == null ? createDefaultPolicyDocument() : createIpRestrictionPolicyDocument(allowFromIpAddresses);
130
- const restApi = new aws_apigateway_1.RestApi(stack, apiId, {
131
- deployOptions: {
132
- loggingLevel: aws_apigateway_1.MethodLoggingLevel.ERROR,
133
- },
134
- restApiName: apiName,
135
- endpointTypes: [aws_apigateway_1.EndpointType.REGIONAL],
136
- policy: policyDocument,
137
- });
138
- add404Support(restApi, stack);
139
- return restApi;
140
- }
141
- exports.createRestApi = createRestApi;
142
- function createDefaultPolicyDocument() {
143
- return new aws_iam_1.PolicyDocument({
144
- statements: [
145
- new aws_iam_1.PolicyStatement({
146
- effect: aws_iam_1.Effect.ALLOW,
147
- actions: [
148
- "execute-api:Invoke",
149
- ],
150
- resources: [
151
- "*",
152
- ],
153
- principals: [
154
- new aws_iam_1.AnyPrincipal(),
155
- ],
156
- }),
157
- ],
158
- });
159
- }
160
- exports.createDefaultPolicyDocument = createDefaultPolicyDocument;
161
- function createIpRestrictionPolicyDocument(allowFromIpAddresses) {
162
- return new aws_iam_1.PolicyDocument({
163
- statements: [
164
- new aws_iam_1.PolicyStatement({
165
- effect: aws_iam_1.Effect.ALLOW,
166
- conditions: {
167
- "IpAddress": {
168
- "aws:SourceIp": allowFromIpAddresses,
169
- },
170
- },
171
- actions: [
172
- "execute-api:Invoke",
173
- ],
174
- resources: [
175
- "*",
176
- ],
177
- principals: [
178
- new aws_iam_1.AnyPrincipal(),
179
- ],
180
- }),
181
- ],
182
- });
183
- }
184
- exports.createIpRestrictionPolicyDocument = createIpRestrictionPolicyDocument;
185
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzdF9hcGlzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2F3cy9pbmZyYS9zdGFjay9yZXN0X2FwaXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsK0RBT29DO0FBQ3BDLGlEQUEwRjtBQUcxRixnREFBdUU7QUFFdkUsd0RBQTJEO0FBQzNELHVEQUFpRDtBQUdqRCwyQkFBNEI7QUFFNUIsTUFBYSxrQkFBbUIsU0FBUSx3QkFBTztJQUkzQyxZQUNJLEtBQXVCLEVBQUUsS0FBYSxFQUFFLE9BQWUsRUFBRSxvQkFBMkMsRUFBRSxNQUE4QjtRQUVwSSxNQUFNLGNBQWMsR0FBRyxvQkFBb0IsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLDJCQUEyQixFQUFFLENBQUMsQ0FBQyxDQUFDLGlDQUFpQyxDQUFDLG9CQUFvQixDQUFDLENBQUM7UUFFOUksa0RBQWtEO1FBQ2xELE1BQU0sU0FBUyxHQUFHLEVBQUMsR0FBRztnQkFDbEIsYUFBYSxFQUFFO29CQUNYLFlBQVksRUFBRSxtQ0FBa0IsQ0FBQyxLQUFLO2lCQUN6QztnQkFDRCxXQUFXLEVBQUUsT0FBTztnQkFDcEIsYUFBYSxFQUFFLENBQUMsNkJBQVksQ0FBQyxRQUFRLENBQUM7Z0JBQ3RDLE1BQU0sRUFBRSxjQUFjO2FBQ3pCLEVBQUUsR0FBRyxNQUFNLEVBQUMsQ0FBQztRQUVkLEtBQUssQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBRS9CLElBQUksQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFDO1FBQ3BCLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxLQUFLLENBQUMsYUFBYSxDQUFDLGFBQWEsRUFBRSxtQkFBbUIsSUFBSSxJQUFJLENBQUM7UUFFMUYsYUFBYSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBRUQsUUFBUTtRQUNKLE9BQU8sR0FBRyxJQUFJLENBQUMsU0FBUyxnQkFBaUIsSUFBSSxD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QUM7QUFDUCxDQUFDO0FBdEJELDhFQXNCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgUmVzdEFwaSxcbiAgICBNZXRob2RMb2dnaW5nTGV2ZWwsXG4gICAgR2F0ZXdheVJlc3BvbnNlLFxuICAgIFJlc3BvbnNlVHlwZSxcbiAgICBFbmRwb2ludFR5cGUsXG4gICAgUmVzdEFwaVByb3BzLCBKc29uU2NoZW1hLCBNb2RlbCwgQ2ZuRG9jdW1lbnRhdGlvblBhcnQsIFJlc291cmNlLFxufSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtYXBpZ2F0ZXdheSc7XG5pbXBvcnQge1BvbGljeURvY3VtZW50LCBQb2xpY3lTdGF0ZW1lbnQsIEVmZmVjdCwgQW55UHJpbmNpcGFsfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtaWFtJztcbmltcG9ydCB7Q29uc3RydWN0fSBmcm9tIFwiY29uc3RydWN0c1wiO1xuaW1wb3J0IHtEaWdpdHJhZmZpY1N0YWNrfSBmcm9tIFwiLi9zdGFja1wiO1xuaW1wb3J0IHtjcmVhdGVEZWZhdWx0VXNhZ2VQbGFuLCBjcmVhdGVVc2FnZVBsYW59IGZyb20gXCIuLi91c2FnZS1wbGFuc1wiO1xuaW1wb3J0IHtNb2RlbFdpdGhSZWZlcmVuY2V9IGZyb20gXCIuLi8uLi90eXBlcy9tb2RlbC13aXRoLXJlZmVyZW5jZVwiO1xuaW1wb3J0IHtnZXRNb2RlbFJlZmVyZW5jZX0gZnJvbSBcIi4uLy4uLy4uL3V0aWxzL2FwaS1tb2RlbFwiO1xuaW1wb3J0IHtNZWRpYVR5cGV9IGZyb20gXCIuLi8uLi90eXBlcy9tZWRpYXR5cGVzXCI7XG5pbXBvcnQge0RvY3VtZW50YXRpb25QYXJ0LCBEb2N1bWVudGF0aW9uUHJvcGVydGllc30gZnJvbSBcIi4uL2RvY3VtZW50YXRpb25cIjtcblxuaW1wb3J0IFIgPSByZXF1aXJlKCdyYW1kYScpO1xuXG5leHBvcnQgY2xhc3MgRGlnaXRyYWZmaWNSZXN0QXBpIGV4dGVuZHMgUmVzdEFwaSB7XG4gICAgcmVhZG9ubHkgYXBpS2V5SWRzOiBzdHJpbmdbXTtcbiAgICByZWFkb25seSBlbmFibGVEb2N1bWVudGF0aW9uOiBib29sZWFuO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHN0YWNrOiBEaWdpdHJhZmZpY1N0YWNrLCBhcGlJZDogc3RyaW5nLCBhcGlOYW1lOiBzdHJpbmcsIGFsbG93RnJvbUlwQWRkcmVzc2VzPzogc3RyaW5nW10gfCB1bmRlZmluZWQsIGNvbmZpZz86IFBhcnRpYWw8UmVzdEFwaVByb3BzPixcbiAgICApIHtcbiAgICAgICAgY29uc3QgcG9saWN5RG9jdW1lbnQgPSBhbGxvd0Zyb21JcEFkZHJlc3NlcyA9PSBudWxsID8gY3JlYXRlRGVmYXVsdFBvbGljeURvY3VtZW50KCkgOiBjcmVhdGVJcFJlc3RyaWN0aW9uUG9saWN5RG9jdW1lbnQoYWxsb3dGcm9tSXBBZGRyZXNzZXMpO1xuXG4gICAgICAgIC8vIG92ZXJyaWRlIGRlZmF1bHQgY29uZmlnIHdpdGggZ2l2ZW4gZXh0cmEgY29uZmlnXG4gICAgICAgIGNvbnN0IGFwaUNvbmZpZyA9IHsuLi57XG4gICAgICAgICAgICBkZXBsb3lPcHRpb25zOiB7XG4gICAgICAgICAgICAgICAgbG9nZ2luZ0xldmVsOiBNZXRob2RMb2dnaW5nTGV2ZWwuRVJST1IsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVzdEFwaU5hbWU6IGFwaU5hbWUsXG4gICAgICAgICAgICBlbmRwb2ludFR5cGVzOiBbRW5kcG9pbnRUeXBlLlJFR0lPTkFMXSxcbiAgICAgICAgICAgIHBvbGljeTogcG9saWN5RG9jdW1lbnQsXG4gICAgICAgIH0sIC4uLmNvbmZpZ307XG5cbiAgICAgICAgc3VwZXIoc3RhY2ssIGFwaUlkLCBhcGlDb25maWcpO1xuXG4gICAgICAgIHRoaXMuYXBpS2V5SWRzID0gW107XG4gICAgICAgIHRoaXMuZW5hYmxlRG9jdW1lbnRhdGlvbiA9IHN0YWNrLmNvbmZpZ3VyYXRpb24uc3RhY2tGZWF0dXJlcz8uZW5hYmxlRG9jdW1lbnRhdGlvbiA/PyB0cnVlO1xuXG4gICAgICAgIGFkZDQwNFN1cHBvcnQodGhpcywgc3RhY2spO1xuICAgIH1cblxuICAgIGhvc3RuYW1lKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBgJHt0aGlzLnJlc3RBcGlJZH0uZXhlY3V0ZS1hcGkuJHsodGhpcy5zdGFjayBhcyBEaWdpdHJhZmZpY1N0YWNrKS5yZWdpb259LmFtYXpvbmF3cy5jb21gO1xuICAgIH1cblxuICAgIGNyZWF0ZVVzYWdlUGxhbihhcGlLZXlJZDogc3RyaW5nLCBhcGlLZXlOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBjb25zdCBuZXdLZXlJZCA9IGNyZWF0ZVVzYWdlUGxhbih0aGlzLCBhcGlLZXlJZCwgYXBpS2V5TmFtZSkua2V5SWQ7XG5cbiAgICAgICAgdGhpcy5hcGlLZXlJZHMucHVzaChuZXdLZXlJZCk7XG5cbiAgICAgICAgcmV0dXJuIG5ld0tleUlkO1xuICAgIH1cblxuICAgIGNyZWF0ZVVzYWdlUGxhblYyKGFwaU5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IG5ld0tleUlkID0gY3JlYXRlRGVmYXVsdFVzYWdlUGxhbih0aGlzLCBhcGlOYW1lKS5rZXlJZDtcblxuICAgICAgICB0aGlzLmFwaUtleUlkcy5wdXNoKG5ld0tleUlkKTtcblxuICAgICAgICByZXR1cm4gbmV3S2V5SWQ7XG4gICAgfVxuXG4gICAgYWRkSnNvbk1vZGVsKG1vZGVsTmFtZTogc3RyaW5nLCBzY2hlbWE6IEpzb25TY2hlbWEpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TW9kZWxXaXRoUmVmZXJlbmNlKHRoaXMuYWRkTW9kZWwobW9kZWxOYW1lLCB7XG4gICAgICAgICAgICBjb250ZW50VHlwZTogTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04sXG4gICAgICAgICAgICBtb2RlbE5hbWUsXG4gICAgICAgICAgICBzY2hlbWEsXG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBhZGRDU1ZNb2RlbChtb2RlbE5hbWU6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRNb2RlbFdpdGhSZWZlcmVuY2UodGhpcy5hZGRNb2RlbChtb2RlbE5hbWUsIHtcbiAgICAgICAgICAgIGNvbnRlbnRUeXBlOiBNZWRpYVR5cGUuVEVYVF9DU1YsXG4gICAgICAgICAgICBtb2RlbE5hbWUsXG4gICAgICAgICAgICBzY2hlbWE6IHt9LFxuICAgICAgICB9KSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRNb2RlbFdpdGhSZWZlcmVuY2UobW9kZWw6IE1vZGVsKTogTW9kZWxXaXRoUmVmZXJlbmNlIHtcbiAgICAgICAgcmV0dXJuIFIuYXNzb2MoJ21vZGVsUmVmZXJlbmNlJywgZ2V0TW9kZWxSZWZlcmVuY2UobW9kZWwubW9kZWxJZCwgdGhpcy5yZXN0QXBpSWQpLCBtb2RlbCkgYXMgTW9kZWxXaXRoUmVmZXJlbmNlO1xuICAgIH1cblxuICAgIHByaXZhdGUgYWRkRG9jdW1lbnRhdGlvblBhcnQoXG4gICAgICAgIHJlc291cmNlOiBSZXNvdXJjZSwgcGFyYW1ldGVyTmFtZTogc3RyaW5nLCByZXNvdXJjZU5hbWU6IHN0cmluZywgdHlwZTogc3RyaW5nLCBwcm9wZXJ0aWVzOiBEb2N1bWVudGF0aW9uUHJvcGVydGllcyxcbiAgICApIHtcbiAgICAgICAgY29uc3QgbG9jYXRpb246IENmbkRvY3VtZW50YXRpb25QYXJ0LkxvY2F0aW9uUHJvcGVydHkgPSB7XG4gICAgICAgICAgICB0eXBlLFxuICAgICAgICAgICAgcGF0aDogcmVzb3VyY2UucGF0aCxcbiAgICAgICAgICAgIG5hbWU6IHR5cGUgIT09ICdNRVRIT0QnID8gcGFyYW1ldGVyTmFtZSA6IHVuZGVmaW5lZCxcbiAgICAgICAgfTtcblxuICAgICAgICBuZXcgQ2ZuRG9jdW1lbnRhdGlvblBhcnQodGhpcy5zdGFjaywgcmVzb3VyY2VOYW1lLCB7XG4gICAgICAgICAgICByZXN0QXBpSWQ6IHJlc291cmNlLmFwaS5yZXN0QXBpSWQsXG4gICAgICAgICAgICBsb2NhdGlvbixcbiAgICAgICAgICAgIHByb3BlcnRpZXM6IEpTT04uc3RyaW5naWZ5KHByb3BlcnRpZXMpLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBkb2N1bWVudFJlc291cmNlKHJlc291cmNlOiBSZXNvdXJjZSwgLi4uZG9jdW1lbnRhdGlvblBhcnQ6IERvY3VtZW50YXRpb25QYXJ0W10pIHtcbiAgICAgICAgaWYodGhpcy5lbmFibGVEb2N1bWVudGF0aW9uKSB7XG4gICAgICAgICAgICBkb2N1bWVudGF0aW9uUGFydC5mb3JFYWNoKGRwID0+IHRoaXMuYWRkRG9jdW1lbnRhdGlvblBhcnQoXG4gICAgICAgICAgICAgICAgcmVzb3VyY2UsIGRwLnBhcmFtZXRlck5hbWUsIGAke3Jlc291cmNlLnBhdGh9LiR7ZHAucGFyYW1ldGVyTmFtZX0uRG9jdW1lbnRhdGlvbmAsIGRwLnR5cGUsIGRwLmRvY3VtZW50YXRpb25Qcm9wZXJ0aWVzLFxuICAgICAgICAgICAgKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLmluZm8oXCJTa2lwcGluZyBkb2N1bWVudGF0aW9uIGZvciAlc1wiLCByZXNvdXJjZS5wYXRoKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuLyoqXG4gKiBEdWUgdG8gQVdTIEFQSSBkZXNpZ24gQVBJIEdhdGV3YXkgd2lsbCBhbHdheXMgcmV0dXJuIDQwMyAnTWlzc2luZyBBdXRoZW50aWNhdGlvbiBUb2tlbicgZm9yIHJlcXVlc3RzXG4gKiB3aXRoIGEgbm9uLWV4aXN0ZW50IGVuZHBvaW50LiBUaGlzIGZ1bmN0aW9uIHRyYW5zbGF0ZXMgdGhpcyByZXNwb25zZSB0byBhIDQwNC5cbiAqIFJlcXVlc3RzIHdpdGggYW4gaW52YWxpZCBvciBtaXNzaW5nIEFQSSBrZXkgYXJlIG5vdCBhZmZlY3RlZCAoc3RpbGwgcmV0dXJuIDQwMyAnRm9yYmlkZGVuJykuXG4gKiBAcGFyYW0gcmVzdEFwaSBSZXN0QXBpXG4gKiBAcGFyYW0gc3RhY2sgQ29uc3RydWN0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZGQ0MDRTdXBwb3J0KHJlc3RBcGk6IFJlc3RBcGksIHN0YWNrOiBDb25zdHJ1Y3QpIHtcbiAgICBuZXcgR2F0ZXdheVJlc3BvbnNlKHN0YWNrLCBgTWlzc2luZ0F1dGhlbnRpY2F0aW9uVG9rZW5SZXNwb25zZS0ke3Jlc3RBcGkucmVzdEFwaU5hbWV9YCwge1xuICAgICAgICByZXN0QXBpLFxuICAgICAgICB0eXBlOiBSZXNwb25zZVR5cGUuTUlTU0lOR19BVVRIRU5USUNBVElPTl9UT0tFTixcbiAgICAgICAgc3RhdHVzQ29kZTogJzQwNCcsXG4gICAgICAgIHRlbXBsYXRlczoge1xuICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nOiAne1wibWVzc2FnZVwiOiBcIk5vdCBmb3VuZFwifScsXG4gICAgICAgIH0sXG4gICAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhZGQ0MDFTdXBwb3J0KHJlc3RBcGk6IFJlc3RBcGksIHN0YWNrOiBDb25zdHJ1Y3QpIHtcbiAgICBuZXcgR2F0ZXdheVJlc3BvbnNlKHN0YWNrLCBgQXV0aGVudGljYXRpb25GYWlsZWRSZXNwb25zZS0ke3Jlc3RBcGkucmVzdEFwaU5hbWV9YCwge1xuICAgICAgICByZXN0QXBpLFxuICAgICAgICB0eXBlOiBSZXNwb25zZVR5cGUuVU5BVVRIT1JJWkVELFxuICAgICAgICBzdGF0dXNDb2RlOiBcIjQwMVwiLFxuICAgICAgICByZXNwb25zZUhlYWRlcnM6IHtcbiAgICAgICAgICAgICdXV1ctQXV0aGVudGljYXRlJzogXCInQmFzaWMnXCIsXG4gICAgICAgIH0sXG4gICAgfSk7XG59XG5cbi8qKlxuICogRHVlIHRvIEFXUyBBUEkgZGVzaWduIEFQSSBHYXRld2F5IHdpbGwgYWx3YXlzIHJldHVybiA0MDMgJ01pc3NpbmcgQXV0aGVudGljYXRpb24gVG9rZW4nIGZvciByZXF1ZXN0c1xuICogd2l0aCBhIG5vbi1leGlzdGVudCBlbmRwb2ludC4gVGhpcyBmdW5jdGlvbiBjb252ZXJ0cyB0aGlzIHJlc3BvbnNlIHRvIGEgY3VzdG9tIG9uZS5cbiAqIFJlcXVlc3RzIHdpdGggYW4gaW52YWxpZCBvciBtaXNzaW5nIEFQSSBrZXkgYXJlIG5vdCBhZmZlY3RlZCAoc3RpbGwgcmV0dXJuIDQwMyAnRm9yYmlkZGVuJykuXG4gKiBAcGFyYW0gcmV0dXJuQ29kZVxuICogQHBhcmFtIG1lc3NhZ2VcbiAqIEBwYXJhbSByZXN0QXBpIFJlc3RBcGlcbiAqIEBwYXJhbSBzdGFjayBDb25zdHJ1Y3RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldFJldHVybkNvZGVGb3JNaXNzaW5nQXV0aGVudGljYXRpb25Ub2tlbihyZXR1cm5Db2RlOiBudW1iZXIsXG4gICAgbWVzc2FnZTogc3RyaW5nLFxuICAgIHJlc3RBcGk6IFJlc3RBcGksXG4gICAgc3RhY2s6IENvbnN0cnVjdCkge1xuXG4gICAgbmV3IEdhdGV3YXlSZXNwb25zZShzdGFjaywgYE1pc3NpbmdBdXRoZW50aWNhdGlvblRva2VuUmVzcG9uc2UtJHtyZXN0QXBpLnJlc3RBcGlOYW1lfWAsIHtcbiAgICAgICAgcmVzdEFwaSxcbiAgICAgICAgdHlwZTogUmVzcG9uc2VUeXBlLk1JU1NJTkdfQVVUSEVOVElDQVRJT05fVE9LRU4sXG4gICAgICAgIHN0YXR1c0NvZGU6IGAke3JldHVybkNvZGV9YCxcbiAgICAgICAgdGVtcGxhdGVzOiB7XG4gICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbic6IGB7XCJtZXNzYWdlXCI6ICR7bWVzc2FnZX19YCxcbiAgICAgICAgfSxcbiAgICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVJlc3RBcGkoc3RhY2s6IENvbnN0cnVjdCwgYXBpSWQ6IHN0cmluZywgYXBpTmFtZTogc3RyaW5nLCBhbGxvd0Zyb21JcEFkZHJlc3Nlcz86IHN0cmluZ1tdIHwgdW5kZWZpbmVkKTogUmVzdEFwaSB7XG4gICAgY29uc3QgcG9saWN5RG9jdW1lbnQgPSBhbGxvd0Zyb21JcEFkZHJlc3NlcyA9PSBudWxsID8gY3JlYXRlRGVmYXVsdFBvbGljeURvY3VtZW50KCkgOiBjcmVhdGVJcFJlc3RyaWN0aW9uUG9saWN5RG9jdW1lbnQoYWxsb3dGcm9tSXBBZGRyZXNzZXMpO1xuICAgIGNvbnN0IHJlc3RBcGkgPSBuZXcgUmVzdEFwaShzdGFjaywgYXBpSWQsIHtcbiAgICAgICAgZGVwbG95T3B0aW9uczoge1xuICAgICAgICAgICAgbG9nZ2luZ0xldmVsOiBNZXRob2RMb2dnaW5nTGV2ZWwuRVJST1IsXG4gICAgICAgIH0sXG4gICAgICAgIHJlc3RBcGlOYW1lOiBhcGlOYW1lLFxuICAgICAgICBlbmRwb2ludFR5cGVzOiBbRW5kcG9pbnRUeXBlLlJFR0lPTkFMXSxcbiAgICAgICAgcG9saWN5OiBwb2xpY3lEb2N1bWVudCxcbiAgICB9KTtcbiAgICBhZGQ0MDRTdXBwb3J0KHJlc3RBcGksIHN0YWNrKTtcbiAgICByZXR1cm4gcmVzdEFwaTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZURlZmF1bHRQb2xpY3lEb2N1bWVudCgpIHtcbiAgICByZXR1cm4gbmV3IFBvbGljeURvY3VtZW50KHtcbiAgICAgICAgc3RhdGVtZW50czogW1xuICAgICAgICAgICAgbmV3IFBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgICAgICAgICAgZWZmZWN0OiBFZmZlY3QuQUxMT1csXG4gICAgICAgICAgICAgICAgYWN0aW9uczogW1xuICAgICAgICAgICAgICAgICAgICBcImV4ZWN1dGUtYXBpOkludm9rZVwiLFxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgcmVzb3VyY2VzOiBbXG4gICAgICAgICAgICAgICAgICAgIFwiKlwiLFxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgcHJpbmNpcGFsczogW1xuICAgICAgICAgICAgICAgICAgICBuZXcgQW55UHJpbmNpcGFsKCksXG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICBdLFxuICAgIH0pO1xufVxuXG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVJcFJlc3RyaWN0aW9uUG9saWN5RG9jdW1lbnQoYWxsb3dGcm9tSXBBZGRyZXNzZXM6IHN0cmluZ1tdKTogUG9saWN5RG9jdW1lbnQge1xuICAgIHJldHVybiBuZXcgUG9saWN5RG9jdW1lbnQoe1xuICAgICAgICBzdGF0ZW1lbnRzOiBbXG4gICAgICAgICAgICBuZXcgUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgICAgICAgICBlZmZlY3Q6IEVmZmVjdC5BTExPVyxcbiAgICAgICAgICAgICAgICBjb25kaXRpb25zOiB7XG4gICAgICAgICAgICAgICAgICAgIFwiSXBBZGRyZXNzXCI6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiYXdzOlNvdXJjZUlwXCI6IGFsbG93RnJvbUlwQWRkcmVzc2VzLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgYWN0aW9uczogW1xuICAgICAgICAgICAgICAgICAgICBcImV4ZWN1dGUtYXBpOkludm9rZVwiLFxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgcmVzb3VyY2VzOiBbXG4gICAgICAgICAgICAgICAgICAgIFwiKlwiLFxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgcHJpbmNpcGFsczogW1xuICAgICAgICAgICAgICAgICAgICBuZXcgQW55UHJpbmNpcGFsKCksXG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICBdLFxuICAgIH0pO1xufVxuIl19