@digitraffic/common 2022.10.14-1 → 2022.10.28-2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (334) hide show
  1. package/{aws → dist/aws}/infra/api/integration.d.ts +0 -0
  2. package/dist/aws/infra/api/integration.js +52 -0
  3. package/dist/aws/infra/api/integration.js.map +1 -0
  4. package/{aws → dist/aws}/infra/api/response.d.ts +0 -0
  5. package/dist/aws/infra/api/response.js +61 -0
  6. package/dist/aws/infra/api/response.js.map +1 -0
  7. package/{aws → dist/aws}/infra/api/responses.d.ts +3 -3
  8. package/dist/aws/infra/api/responses.js +82 -0
  9. package/dist/aws/infra/api/responses.js.map +1 -0
  10. package/{aws → dist/aws}/infra/api/static-integration.d.ts +0 -0
  11. package/dist/aws/infra/api/static-integration.js +54 -0
  12. package/dist/aws/infra/api/static-integration.js.map +1 -0
  13. package/{aws → dist/aws}/infra/canaries/canary-alarm.d.ts +0 -0
  14. package/dist/aws/infra/canaries/canary-alarm.js +26 -0
  15. package/dist/aws/infra/canaries/canary-alarm.js.map +1 -0
  16. package/dist/aws/infra/canaries/canary-keys.d.ts +3 -0
  17. package/dist/aws/infra/canaries/canary-keys.js +7 -0
  18. package/dist/aws/infra/canaries/canary-keys.js.map +1 -0
  19. package/{aws → dist/aws}/infra/canaries/canary-parameters.d.ts +0 -0
  20. package/dist/aws/infra/canaries/canary-parameters.js +3 -0
  21. package/dist/aws/infra/canaries/canary-parameters.js.map +1 -0
  22. package/{aws → dist/aws}/infra/canaries/canary-role.d.ts +0 -0
  23. package/dist/aws/infra/canaries/canary-role.js +46 -0
  24. package/dist/aws/infra/canaries/canary-role.js.map +1 -0
  25. package/{aws → dist/aws}/infra/canaries/canary.d.ts +0 -0
  26. package/dist/aws/infra/canaries/canary.js +32 -0
  27. package/dist/aws/infra/canaries/canary.js.map +1 -0
  28. package/{aws → dist/aws}/infra/canaries/database-canary.d.ts +0 -0
  29. package/dist/aws/infra/canaries/database-canary.js +70 -0
  30. package/dist/aws/infra/canaries/database-canary.js.map +1 -0
  31. package/{aws → dist/aws}/infra/canaries/database-checker.d.ts +2 -2
  32. package/dist/aws/infra/canaries/database-checker.js +103 -0
  33. package/dist/aws/infra/canaries/database-checker.js.map +1 -0
  34. package/{aws → dist/aws}/infra/canaries/url-canary.d.ts +0 -3
  35. package/dist/aws/infra/canaries/url-canary.js +47 -0
  36. package/dist/aws/infra/canaries/url-canary.js.map +1 -0
  37. package/{aws → dist/aws}/infra/canaries/url-checker.d.ts +0 -0
  38. package/dist/aws/infra/canaries/url-checker.js +252 -0
  39. package/dist/aws/infra/canaries/url-checker.js.map +1 -0
  40. package/{aws → dist/aws}/infra/documentation.d.ts +0 -0
  41. package/dist/aws/infra/documentation.js +95 -0
  42. package/dist/aws/infra/documentation.js.map +1 -0
  43. package/{aws → dist/aws}/infra/scheduler.d.ts +7 -7
  44. package/dist/aws/infra/scheduler.js +31 -0
  45. package/dist/aws/infra/scheduler.js.map +1 -0
  46. package/{aws → dist/aws}/infra/security-rule.d.ts +0 -0
  47. package/dist/aws/infra/security-rule.js +39 -0
  48. package/dist/aws/infra/security-rule.js.map +1 -0
  49. package/{aws → dist/aws}/infra/sqs-integration.d.ts +0 -0
  50. package/dist/aws/infra/sqs-integration.js +93 -0
  51. package/dist/aws/infra/sqs-integration.js.map +1 -0
  52. package/{aws → dist/aws}/infra/sqs-queue.d.ts +0 -0
  53. package/dist/aws/infra/sqs-queue.js +130 -0
  54. package/dist/aws/infra/sqs-queue.js.map +1 -0
  55. package/{aws → dist/aws}/infra/stack/lambda-configs.d.ts +5 -5
  56. package/dist/aws/infra/stack/lambda-configs.js +105 -0
  57. package/dist/aws/infra/stack/lambda-configs.js.map +1 -0
  58. package/{aws → dist/aws}/infra/stack/monitoredfunction.d.ts +1 -1
  59. package/dist/aws/infra/stack/monitoredfunction.js +143 -0
  60. package/dist/aws/infra/stack/monitoredfunction.js.map +1 -0
  61. package/{aws → dist/aws}/infra/stack/rest_apis.d.ts +0 -0
  62. package/dist/aws/infra/stack/rest_apis.js +185 -0
  63. package/dist/aws/infra/stack/rest_apis.js.map +1 -0
  64. package/{aws → dist/aws}/infra/stack/stack-checking-aspect.d.ts +0 -0
  65. package/dist/aws/infra/stack/stack-checking-aspect.js +174 -0
  66. package/dist/aws/infra/stack/stack-checking-aspect.js.map +1 -0
  67. package/{aws → dist/aws}/infra/stack/stack.d.ts +5 -4
  68. package/dist/aws/infra/stack/stack.js +67 -0
  69. package/dist/aws/infra/stack/stack.js.map +1 -0
  70. package/{aws → dist/aws}/infra/stack/subscription.d.ts +3 -3
  71. package/dist/aws/infra/stack/subscription.js +42 -0
  72. package/dist/aws/infra/stack/subscription.js.map +1 -0
  73. package/{aws → dist/aws}/infra/usage-plans.d.ts +0 -0
  74. package/dist/aws/infra/usage-plans.js +42 -0
  75. package/dist/aws/infra/usage-plans.js.map +1 -0
  76. package/{aws → dist/aws}/runtime/apikey.d.ts +0 -0
  77. package/dist/aws/runtime/apikey.js +13 -0
  78. package/dist/aws/runtime/apikey.js.map +1 -0
  79. package/{aws → dist/aws}/runtime/digitraffic-integration-response.d.ts +0 -0
  80. package/dist/aws/runtime/digitraffic-integration-response.js +26 -0
  81. package/dist/aws/runtime/digitraffic-integration-response.js.map +1 -0
  82. package/dist/aws/runtime/environment.d.ts +1 -0
  83. package/dist/aws/runtime/environment.js +12 -0
  84. package/dist/aws/runtime/environment.js.map +1 -0
  85. package/{aws → dist/aws}/runtime/messaging.d.ts +0 -0
  86. package/dist/aws/runtime/messaging.js +31 -0
  87. package/dist/aws/runtime/messaging.js.map +1 -0
  88. package/{aws → dist/aws}/runtime/s3.d.ts +0 -0
  89. package/dist/aws/runtime/s3.js +30 -0
  90. package/dist/aws/runtime/s3.js.map +1 -0
  91. package/{aws → dist/aws}/runtime/secrets/dbsecret.d.ts +0 -0
  92. package/dist/aws/runtime/secrets/dbsecret.js +96 -0
  93. package/dist/aws/runtime/secrets/dbsecret.js.map +1 -0
  94. package/{aws → dist/aws}/runtime/secrets/proxy-holder.d.ts +0 -0
  95. package/dist/aws/runtime/secrets/proxy-holder.js +27 -0
  96. package/dist/aws/runtime/secrets/proxy-holder.js.map +1 -0
  97. package/{aws → dist/aws}/runtime/secrets/rds-holder.d.ts +0 -0
  98. package/dist/aws/runtime/secrets/rds-holder.js +27 -0
  99. package/dist/aws/runtime/secrets/rds-holder.js.map +1 -0
  100. package/{aws → dist/aws}/runtime/secrets/secret-holder.d.ts +0 -0
  101. package/dist/aws/runtime/secrets/secret-holder.js +76 -0
  102. package/dist/aws/runtime/secrets/secret-holder.js.map +1 -0
  103. package/{aws → dist/aws}/runtime/secrets/secret.d.ts +0 -0
  104. package/dist/aws/runtime/secrets/secret.js +43 -0
  105. package/dist/aws/runtime/secrets/secret.js.map +1 -0
  106. package/{aws → dist/aws}/types/errors.d.ts +4 -0
  107. package/dist/aws/types/errors.js +16 -0
  108. package/dist/aws/types/errors.js.map +1 -0
  109. package/{aws → dist/aws}/types/lambda-response.d.ts +4 -3
  110. package/dist/aws/types/lambda-response.js +33 -0
  111. package/dist/aws/types/lambda-response.js.map +1 -0
  112. package/{aws → dist/aws}/types/mediatypes.d.ts +1 -1
  113. package/dist/aws/types/mediatypes.js +16 -0
  114. package/dist/aws/types/mediatypes.js.map +1 -0
  115. package/{aws → dist/aws}/types/model-with-reference.d.ts +0 -0
  116. package/dist/aws/types/model-with-reference.js +3 -0
  117. package/dist/aws/types/model-with-reference.js.map +1 -0
  118. package/{aws → dist/aws}/types/proxytypes.d.ts +0 -0
  119. package/dist/aws/types/proxytypes.js +3 -0
  120. package/dist/aws/types/proxytypes.js.map +1 -0
  121. package/{aws → dist/aws}/types/tags.d.ts +0 -0
  122. package/dist/aws/types/tags.js +7 -0
  123. package/dist/aws/types/tags.js.map +1 -0
  124. package/{database → dist/database}/cached.d.ts +0 -0
  125. package/dist/database/cached.js +32 -0
  126. package/dist/database/cached.js.map +1 -0
  127. package/{database → dist/database}/database.d.ts +0 -0
  128. package/dist/database/database.js +70 -0
  129. package/dist/database/database.js.map +1 -0
  130. package/{database → dist/database}/last-updated.d.ts +0 -0
  131. package/dist/database/last-updated.js +54 -0
  132. package/dist/database/last-updated.js.map +1 -0
  133. package/dist/database/models.d.ts +6 -0
  134. package/dist/database/models.js +3 -0
  135. package/dist/database/models.js.map +1 -0
  136. package/{marine → dist/marine}/id_utils.d.ts +0 -0
  137. package/dist/marine/id_utils.js +33 -0
  138. package/dist/marine/id_utils.js.map +1 -0
  139. package/{marine → dist/marine}/rtz.d.ts +0 -0
  140. package/dist/marine/rtz.js +3 -0
  141. package/dist/marine/rtz.js.map +1 -0
  142. package/{test → dist/test}/asserter.d.ts +0 -0
  143. package/dist/test/asserter.js +45 -0
  144. package/dist/test/asserter.js.map +1 -0
  145. package/{test → dist/test}/db-testutils.d.ts +1 -1
  146. package/dist/test/db-testutils.js +31 -0
  147. package/dist/test/db-testutils.js.map +1 -0
  148. package/{test → dist/test}/httpserver.d.ts +2 -1
  149. package/dist/test/httpserver.js +74 -0
  150. package/dist/test/httpserver.js.map +1 -0
  151. package/{test → dist/test}/secret.d.ts +0 -0
  152. package/dist/test/secret.js +25 -0
  153. package/dist/test/secret.js.map +1 -0
  154. package/{test → dist/test}/secrets-manager.d.ts +0 -0
  155. package/dist/test/secrets-manager.js +59 -0
  156. package/dist/test/secrets-manager.js.map +1 -0
  157. package/{test → dist/test}/testutils.d.ts +0 -0
  158. package/dist/test/testutils.js +44 -0
  159. package/dist/test/testutils.js.map +1 -0
  160. package/dist/types/either.d.ts +9 -0
  161. package/dist/types/either.js +3 -0
  162. package/dist/types/either.js.map +1 -0
  163. package/{types → dist/types}/input-error.d.ts +0 -0
  164. package/dist/types/input-error.js +7 -0
  165. package/dist/types/input-error.js.map +1 -0
  166. package/{types → dist/types}/language.d.ts +0 -0
  167. package/dist/types/language.js +10 -0
  168. package/dist/types/language.js.map +1 -0
  169. package/{types → dist/types}/traffictype.d.ts +0 -0
  170. package/dist/types/traffictype.js +13 -0
  171. package/dist/types/traffictype.js.map +1 -0
  172. package/{types → dist/types}/validator.d.ts +0 -0
  173. package/dist/types/validator.js +14 -0
  174. package/dist/types/validator.js.map +1 -0
  175. package/{utils → dist/utils}/api-model.d.ts +0 -0
  176. package/dist/utils/api-model.js +129 -0
  177. package/dist/utils/api-model.js.map +1 -0
  178. package/{utils → dist/utils}/base64.d.ts +0 -0
  179. package/dist/utils/base64.js +21 -0
  180. package/dist/utils/base64.js.map +1 -0
  181. package/{utils → dist/utils}/date-utils.d.ts +0 -0
  182. package/dist/utils/date-utils.js +34 -0
  183. package/dist/utils/date-utils.js.map +1 -0
  184. package/{utils → dist/utils}/geojson-types.d.ts +0 -0
  185. package/dist/utils/geojson-types.js +18 -0
  186. package/dist/utils/geojson-types.js.map +1 -0
  187. package/{utils → dist/utils}/geometry.d.ts +0 -0
  188. package/dist/utils/geometry.js +164 -0
  189. package/dist/utils/geometry.js.map +1 -0
  190. package/{utils → dist/utils}/retry.d.ts +0 -0
  191. package/dist/utils/retry.js +50 -0
  192. package/dist/utils/retry.js.map +1 -0
  193. package/{utils → dist/utils}/slack.d.ts +0 -0
  194. package/dist/utils/slack.js +25 -0
  195. package/dist/utils/slack.js.map +1 -0
  196. package/{utils → dist/utils}/utils.d.ts +24 -0
  197. package/dist/utils/utils.js +75 -0
  198. package/dist/utils/utils.js.map +1 -0
  199. package/package.json +12 -10
  200. package/src/@types/geojson-validation/index.d.ts +4 -0
  201. package/src/aws/infra/api/integration.ts +73 -0
  202. package/src/aws/infra/api/response.ts +67 -0
  203. package/src/aws/infra/api/responses.ts +124 -0
  204. package/src/aws/infra/api/static-integration.ts +62 -0
  205. package/src/aws/infra/canaries/canary-alarm.ts +31 -0
  206. package/src/aws/infra/canaries/canary-keys.ts +3 -0
  207. package/src/aws/infra/canaries/canary-parameters.ts +19 -0
  208. package/src/aws/infra/canaries/canary-role.ts +47 -0
  209. package/src/aws/infra/canaries/canary.ts +46 -0
  210. package/src/aws/infra/canaries/database-canary.ts +98 -0
  211. package/src/aws/infra/canaries/database-checker.ts +155 -0
  212. package/src/aws/infra/canaries/url-canary.ts +74 -0
  213. package/src/aws/infra/canaries/url-checker.ts +366 -0
  214. package/src/aws/infra/documentation.ts +124 -0
  215. package/src/aws/infra/scheduler.ts +59 -0
  216. package/src/aws/infra/security-rule.ts +38 -0
  217. package/src/aws/infra/sqs-integration.ts +102 -0
  218. package/src/aws/infra/sqs-queue.ts +148 -0
  219. package/src/aws/infra/stack/lambda-configs.ts +207 -0
  220. package/src/aws/infra/stack/monitoredfunction.ts +342 -0
  221. package/src/aws/infra/stack/rest_apis.ts +223 -0
  222. package/src/aws/infra/stack/stack-checking-aspect.ts +279 -0
  223. package/src/aws/infra/stack/stack.ts +145 -0
  224. package/src/aws/infra/stack/subscription.ts +58 -0
  225. package/src/aws/infra/usage-plans.ts +41 -0
  226. package/src/aws/runtime/apikey.ts +9 -0
  227. package/src/aws/runtime/digitraffic-integration-response.ts +28 -0
  228. package/src/aws/runtime/environment.ts +9 -0
  229. package/src/aws/runtime/messaging.ts +26 -0
  230. package/src/aws/runtime/s3.ts +44 -0
  231. package/src/aws/runtime/secrets/dbsecret.ts +116 -0
  232. package/src/aws/runtime/secrets/proxy-holder.ts +37 -0
  233. package/src/aws/runtime/secrets/rds-holder.ts +33 -0
  234. package/src/aws/runtime/secrets/secret-holder.ts +116 -0
  235. package/src/aws/runtime/secrets/secret.ts +50 -0
  236. package/src/aws/types/errors.ts +14 -0
  237. package/src/aws/types/lambda-response.ts +43 -0
  238. package/src/aws/types/mediatypes.ts +11 -0
  239. package/src/aws/types/model-with-reference.ts +8 -0
  240. package/src/aws/types/proxytypes.ts +27 -0
  241. package/src/aws/types/tags.ts +3 -0
  242. package/src/database/cached.ts +35 -0
  243. package/src/database/database.ts +96 -0
  244. package/src/database/last-updated.ts +59 -0
  245. package/src/database/models.ts +7 -0
  246. package/src/marine/id_utils.ts +30 -0
  247. package/src/marine/rtz.ts +57 -0
  248. package/src/test/asserter.ts +48 -0
  249. package/src/test/db-testutils.ts +44 -0
  250. package/src/test/httpserver.ts +96 -0
  251. package/src/test/secret.ts +23 -0
  252. package/src/test/secrets-manager.ts +34 -0
  253. package/src/test/testutils.ts +39 -0
  254. package/src/types/either.ts +3 -0
  255. package/src/types/input-error.ts +2 -0
  256. package/src/types/language.ts +3 -0
  257. package/src/types/traffictype.ts +8 -0
  258. package/src/types/validator.ts +10 -0
  259. package/src/utils/api-model.ts +133 -0
  260. package/src/utils/base64.ts +16 -0
  261. package/src/utils/date-utils.ts +30 -0
  262. package/src/utils/geojson-types.ts +22 -0
  263. package/src/utils/geometry.ts +164 -0
  264. package/src/utils/retry.ts +49 -0
  265. package/src/utils/slack.ts +22 -0
  266. package/src/utils/utils.ts +105 -0
  267. package/aws/index.d.ts +0 -1
  268. package/aws/infra/api/index.d.ts +0 -1
  269. package/aws/infra/api/integration.js +0 -52
  270. package/aws/infra/api/response.js +0 -61
  271. package/aws/infra/api/responses.js +0 -79
  272. package/aws/infra/api/static-integration.js +0 -54
  273. package/aws/infra/canaries/canary-alarm.js +0 -26
  274. package/aws/infra/canaries/canary-parameters.js +0 -3
  275. package/aws/infra/canaries/canary-role.js +0 -46
  276. package/aws/infra/canaries/canary.js +0 -29
  277. package/aws/infra/canaries/database-canary.js +0 -55
  278. package/aws/infra/canaries/database-checker.js +0 -109
  279. package/aws/infra/canaries/url-canary.js +0 -46
  280. package/aws/infra/canaries/url-checker.js +0 -238
  281. package/aws/infra/documentation.js +0 -95
  282. package/aws/infra/scheduler.js +0 -31
  283. package/aws/infra/security-rule.js +0 -39
  284. package/aws/infra/sqs-integration.js +0 -93
  285. package/aws/infra/sqs-queue.js +0 -130
  286. package/aws/infra/stack/lambda-configs.js +0 -93
  287. package/aws/infra/stack/monitoredfunction.js +0 -135
  288. package/aws/infra/stack/rest_apis.js +0 -185
  289. package/aws/infra/stack/stack-checking-aspect.js +0 -174
  290. package/aws/infra/stack/stack.js +0 -60
  291. package/aws/infra/stack/subscription.js +0 -41
  292. package/aws/infra/usage-plans.js +0 -42
  293. package/aws/runtime/apikey.js +0 -13
  294. package/aws/runtime/digitraffic-integration-response.js +0 -26
  295. package/aws/runtime/messaging.js +0 -31
  296. package/aws/runtime/s3.js +0 -30
  297. package/aws/runtime/secrets/dbsecret.js +0 -96
  298. package/aws/runtime/secrets/proxy-holder.js +0 -26
  299. package/aws/runtime/secrets/rds-holder.js +0 -26
  300. package/aws/runtime/secrets/secret-holder.js +0 -73
  301. package/aws/runtime/secrets/secret.js +0 -43
  302. package/aws/types/errors.js +0 -9
  303. package/aws/types/lambda-response.js +0 -28
  304. package/aws/types/mediatypes.js +0 -15
  305. package/aws/types/model-with-reference.js +0 -3
  306. package/aws/types/proxytypes.js +0 -3
  307. package/aws/types/tags.js +0 -7
  308. package/database/cached.js +0 -32
  309. package/database/database.js +0 -62
  310. package/database/last-updated.js +0 -54
  311. package/index.d.ts +0 -1
  312. package/index.js +0 -18
  313. package/marine/id_utils.js +0 -33
  314. package/marine/rtz.js +0 -3
  315. package/test/asserter.js +0 -45
  316. package/test/db-testutils.js +0 -31
  317. package/test/httpserver.js +0 -67
  318. package/test/secret.js +0 -25
  319. package/test/secrets-manager.js +0 -59
  320. package/test/testutils.js +0 -44
  321. package/types/index.d.ts +0 -1
  322. package/types/input-error.js +0 -7
  323. package/types/language.js +0 -10
  324. package/types/traffictype.js +0 -13
  325. package/types/validator.js +0 -14
  326. package/utils/api-model.js +0 -129
  327. package/utils/base64.js +0 -21
  328. package/utils/date-utils.js +0 -34
  329. package/utils/geojson-types.js +0 -18
  330. package/utils/geometry.js +0 -140
  331. package/utils/retry.js +0 -50
  332. package/utils/slack.js +0 -25
  333. package/utils/utils.js +0 -40
  334. package/yarn-error.log +0 -103
@@ -0,0 +1,185 @@
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=rest_apis.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rest_apis.js","sourceRoot":"","sources":["../../../../src/aws/infra/stack/rest_apis.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,174 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.StackCheckingAspect = void 0;
4
+ const aws_cdk_lib_1 = require("aws-cdk-lib");
5
+ const aws_lambda_1 = require("aws-cdk-lib/aws-lambda");
6
+ const aws_s3_1 = require("aws-cdk-lib/aws-s3");
7
+ const stack_1 = require("./stack");
8
+ const aws_apigateway_1 = require("aws-cdk-lib/aws-apigateway");
9
+ const change_case_1 = require("change-case");
10
+ const aws_sqs_1 = require("aws-cdk-lib/aws-sqs");
11
+ const aws_logs_1 = require("aws-cdk-lib/aws-logs");
12
+ const MAX_CONCURRENCY_LIMIT = 100;
13
+ const NODE_RUNTIME = aws_lambda_1.Runtime.NODEJS_14_X.name;
14
+ var ResourceType;
15
+ (function (ResourceType) {
16
+ ResourceType["stackName"] = "STACK_NAME";
17
+ ResourceType["reservedConcurrentConcurrency"] = "RESERVED_CONCURRENT_CONCURRENCY";
18
+ ResourceType["functionTimeout"] = "FUNCTION_TIMEOUT";
19
+ ResourceType["functionMemorySize"] = "FUNCTION_MEMORY_SIZE";
20
+ ResourceType["functionRuntime"] = "FUNCTION_RUNTIME";
21
+ ResourceType["functionName"] = "FUNCTION_NAME";
22
+ ResourceType["tagSolution"] = "TAG_SOLUTION";
23
+ ResourceType["bucketPublicity"] = "BUCKET_PUBLICITY";
24
+ ResourceType["resourcePath"] = "RESOURCE_PATH";
25
+ ResourceType["queueEncryption"] = "QUEUE_ENCRYPTION";
26
+ ResourceType["logGroupRetention"] = "LOG_GROUP_RETENTION";
27
+ })(ResourceType || (ResourceType = {}));
28
+ class StackCheckingAspect {
29
+ constructor(stackShortName, whitelistedResources) {
30
+ this.stackShortName = stackShortName;
31
+ this.whitelistedResources = whitelistedResources;
32
+ }
33
+ static create(stack) {
34
+ return new StackCheckingAspect(stack.configuration.shortName, stack.configuration.whitelistedResources);
35
+ }
36
+ visit(node) {
37
+ //console.info("visiting class " + node.constructor.name);
38
+ this.checkStack(node);
39
+ this.checkFunction(node);
40
+ this.checkTags(node);
41
+ this.checkBucket(node);
42
+ this.checkResourceCasing(node);
43
+ this.checkQueueEncryption(node);
44
+ this.checkLogGroupRetention(node);
45
+ }
46
+ isWhitelisted(key) {
47
+ return this.whitelistedResources?.some((wl) => {
48
+ return key.matchAll(new RegExp(wl, "g"));
49
+ });
50
+ }
51
+ addAnnotation(node, key, message, isError = true) {
52
+ const resourceKey = `${node.node.path}/${key}`;
53
+ const isWhiteListed = this.isWhitelisted(resourceKey);
54
+ const annotationMessage = `${resourceKey}:${message}`;
55
+ // error && whitelisted -> warning
56
+ // warning && whitelisted -> nothing
57
+ if (isError && !isWhiteListed) {
58
+ aws_cdk_lib_1.Annotations.of(node).addError(annotationMessage);
59
+ }
60
+ else if ((!isError && !isWhiteListed) || (isError && isWhiteListed)) {
61
+ aws_cdk_lib_1.Annotations.of(node).addWarning(annotationMessage);
62
+ }
63
+ }
64
+ checkStack(node) {
65
+ if (node instanceof stack_1.DigitrafficStack) {
66
+ if ((node.stackName.includes("Test") ||
67
+ node.stackName.includes("Tst")) &&
68
+ node.configuration.production) {
69
+ this.addAnnotation(node, ResourceType.stackName, "Production is set for Test-stack");
70
+ }
71
+ if ((node.stackName.includes("Prod") ||
72
+ node.stackName.includes("Prd")) &&
73
+ !node.configuration.production) {
74
+ this.addAnnotation(node, ResourceType.stackName, "Production is not set for Production-stack");
75
+ }
76
+ }
77
+ }
78
+ checkFunction(node) {
79
+ if (node instanceof aws_lambda_1.CfnFunction) {
80
+ if (!node.reservedConcurrentExecutions) {
81
+ this.addAnnotation(node, ResourceType.reservedConcurrentConcurrency, "Function must have reservedConcurrentConcurrency");
82
+ }
83
+ else if (node.reservedConcurrentExecutions > MAX_CONCURRENCY_LIMIT) {
84
+ this.addAnnotation(node, ResourceType.reservedConcurrentConcurrency, "Function reservedConcurrentConcurrency too high!");
85
+ }
86
+ if (!node.timeout) {
87
+ this.addAnnotation(node, ResourceType.functionTimeout, "Function must have timeout");
88
+ }
89
+ if (!node.memorySize) {
90
+ this.addAnnotation(node, ResourceType.functionMemorySize, "Function must have memorySize");
91
+ }
92
+ if (node.runtime !== NODE_RUNTIME) {
93
+ this.addAnnotation(node, ResourceType.functionRuntime, `Function has wrong runtime ${node.runtime}!`);
94
+ }
95
+ if (this.stackShortName &&
96
+ node.functionName &&
97
+ !node.functionName.startsWith(this.stackShortName)) {
98
+ this.addAnnotation(node, ResourceType.functionName, `Function name does not begin with ${this.stackShortName}`);
99
+ }
100
+ }
101
+ }
102
+ checkTags(node) {
103
+ if (node instanceof aws_cdk_lib_1.Stack) {
104
+ if (!node.tags.tagValues()[stack_1.SOLUTION_KEY]) {
105
+ this.addAnnotation(node, ResourceType.tagSolution, "Solution tag is missing");
106
+ }
107
+ }
108
+ }
109
+ checkBucket(node) {
110
+ if (node instanceof aws_s3_1.CfnBucket) {
111
+ const c = node.publicAccessBlockConfiguration;
112
+ if (c) {
113
+ if (!c.blockPublicAcls ||
114
+ !c.blockPublicPolicy ||
115
+ !c.ignorePublicAcls ||
116
+ !c.restrictPublicBuckets) {
117
+ this.addAnnotation(node, ResourceType.bucketPublicity, "Check bucket publicity");
118
+ }
119
+ }
120
+ }
121
+ }
122
+ static isValidPath(path) {
123
+ // if path includes . or { check only the trailing part of path
124
+ if (path.includes(".")) {
125
+ return this.isValidPath(path.split(".")[0]);
126
+ }
127
+ if (path.includes("{")) {
128
+ return this.isValidPath(path.split("{")[0]);
129
+ }
130
+ return (0, change_case_1.paramCase)(path) === path;
131
+ }
132
+ static isValidQueryString(name) {
133
+ return (0, change_case_1.snakeCase)(name) === name;
134
+ }
135
+ checkResourceCasing(node) {
136
+ if (node instanceof aws_apigateway_1.CfnResource) {
137
+ if (!StackCheckingAspect.isValidPath(node.pathPart)) {
138
+ this.addAnnotation(node, ResourceType.resourcePath, "Path part should be in kebab-case");
139
+ }
140
+ }
141
+ else if (node instanceof aws_apigateway_1.CfnMethod) {
142
+ const integration = node.integration;
143
+ if (integration && integration.requestParameters) {
144
+ Object.keys(integration.requestParameters).forEach((key) => {
145
+ const split = key.split(".");
146
+ const type = split[2];
147
+ const name = split[3];
148
+ if (type === "querystring" &&
149
+ !StackCheckingAspect.isValidQueryString(name)) {
150
+ this.addAnnotation(node, name, "Querystring should be in snake_case");
151
+ }
152
+ });
153
+ }
154
+ }
155
+ }
156
+ checkQueueEncryption(node) {
157
+ if (node instanceof aws_sqs_1.CfnQueue) {
158
+ if (!node.kmsMasterKeyId) {
159
+ this.addAnnotation(node, ResourceType.queueEncryption, "Queue must have encryption enabled");
160
+ }
161
+ }
162
+ }
163
+ checkLogGroupRetention(node) {
164
+ if (node instanceof aws_logs_1.LogRetention) {
165
+ const child = node.node.defaultChild;
166
+ const retention = child._cfnProperties.RetentionInDays;
167
+ if (!retention) {
168
+ this.addAnnotation(node, ResourceType.logGroupRetention, "Log group must define log group retention");
169
+ }
170
+ }
171
+ }
172
+ }
173
+ exports.StackCheckingAspect = StackCheckingAspect;
174
+ //# sourceMappingURL=stack-checking-aspect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stack-checking-aspect.js","sourceRoot":"","sources":["../../../../src/aws/infra/stack/stack-checking-aspect.ts"],"names":[],"mappings":"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"}
@@ -11,7 +11,7 @@ export declare const SOLUTION_KEY = "Solution";
11
11
  export declare const SSM_KEY_WARNING_TOPIC: string;
12
12
  export declare const SSM_KEY_ALARM_TOPIC: string;
13
13
  export interface StackConfiguration {
14
- readonly shortName?: string;
14
+ readonly shortName: string;
15
15
  readonly secretId?: string;
16
16
  readonly alarmTopicArn: string;
17
17
  readonly warningTopicArn: string;
@@ -30,15 +30,16 @@ export interface StackConfiguration {
30
30
  readonly whitelistedResources?: string[];
31
31
  }
32
32
  export declare class DigitrafficStack extends Stack {
33
- readonly vpc: IVpc;
34
- readonly lambdaDbSg: ISecurityGroup;
33
+ readonly vpc?: IVpc;
34
+ readonly lambdaDbSg?: ISecurityGroup;
35
35
  readonly alarmTopic: ITopic;
36
36
  readonly warningTopic: ITopic;
37
- readonly secret: ISecret;
37
+ readonly secret?: ISecret;
38
38
  readonly configuration: StackConfiguration;
39
39
  constructor(scope: Construct, id: string, configuration: StackConfiguration);
40
40
  addAspects(): void;
41
41
  createLambdaEnvironment(): DBLambdaEnvironment;
42
42
  createDefaultLambdaEnvironment(dbApplication: string): DBLambdaEnvironment;
43
+ getSecret(): ISecret;
43
44
  grantSecret(...lambdas: AWSFunction[]): void;
44
45
  }
@@ -0,0 +1,67 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DigitrafficStack = exports.SSM_KEY_ALARM_TOPIC = exports.SSM_KEY_WARNING_TOPIC = exports.SOLUTION_KEY = void 0;
4
+ const aws_cdk_lib_1 = require("aws-cdk-lib");
5
+ const aws_ec2_1 = require("aws-cdk-lib/aws-ec2");
6
+ const aws_sns_1 = require("aws-cdk-lib/aws-sns");
7
+ const aws_ssm_1 = require("aws-cdk-lib/aws-ssm");
8
+ const aws_secretsmanager_1 = require("aws-cdk-lib/aws-secretsmanager");
9
+ const stack_checking_aspect_1 = require("./stack-checking-aspect");
10
+ const SSM_ROOT = "/digitraffic";
11
+ exports.SOLUTION_KEY = "Solution";
12
+ const MONITORING_ROOT = "/monitoring";
13
+ exports.SSM_KEY_WARNING_TOPIC = `${SSM_ROOT}${MONITORING_ROOT}/warning-topic`;
14
+ exports.SSM_KEY_ALARM_TOPIC = `${SSM_ROOT}${MONITORING_ROOT}/alarm-topic`;
15
+ class DigitrafficStack extends aws_cdk_lib_1.Stack {
16
+ constructor(scope, id, configuration) {
17
+ super(scope, id, configuration.stackProps);
18
+ this.configuration = configuration;
19
+ if (configuration.secretId) {
20
+ this.secret = aws_secretsmanager_1.Secret.fromSecretNameV2(this, "Secret", configuration.secretId);
21
+ }
22
+ // VPC reference construction requires vpcId and availability zones
23
+ // private subnets are used in Lambda configuration
24
+ if (configuration.vpcId) {
25
+ this.vpc = aws_ec2_1.Vpc.fromVpcAttributes(this, "vpc", {
26
+ vpcId: configuration.vpcId,
27
+ privateSubnetIds: configuration.privateSubnetIds,
28
+ availabilityZones: configuration.availabilityZones ?? [],
29
+ });
30
+ }
31
+ // security group that allows Lambda database access
32
+ if (configuration.lambdaDbSgId) {
33
+ this.lambdaDbSg = aws_ec2_1.SecurityGroup.fromSecurityGroupId(this, "LambdaDbSG", configuration.lambdaDbSgId);
34
+ }
35
+ this.alarmTopic = aws_sns_1.Topic.fromTopicArn(this, "AlarmTopic", aws_ssm_1.StringParameter.fromStringParameterName(this, "AlarmTopicParam", exports.SSM_KEY_ALARM_TOPIC).stringValue);
36
+ this.warningTopic = aws_sns_1.Topic.fromTopicArn(this, "WarningTopic", aws_ssm_1.StringParameter.fromStringParameterName(this, "WarningTopicParam", exports.SSM_KEY_WARNING_TOPIC).stringValue);
37
+ this.addAspects();
38
+ }
39
+ addAspects() {
40
+ aws_cdk_lib_1.Aspects.of(this).add(stack_checking_aspect_1.StackCheckingAspect.create(this));
41
+ }
42
+ createLambdaEnvironment() {
43
+ return this.createDefaultLambdaEnvironment(this.configuration.shortName);
44
+ }
45
+ createDefaultLambdaEnvironment(dbApplication) {
46
+ return this.configuration.secretId
47
+ ? {
48
+ SECRET_ID: this.configuration.secretId,
49
+ DB_APPLICATION: dbApplication,
50
+ }
51
+ : {
52
+ DB_APPLICATION: dbApplication,
53
+ };
54
+ }
55
+ getSecret() {
56
+ if (this.secret === undefined) {
57
+ throw new Error("Secret is undefined");
58
+ }
59
+ return this.secret;
60
+ }
61
+ grantSecret(...lambdas) {
62
+ const secret = this.getSecret();
63
+ lambdas.forEach((l) => secret.grantRead(l));
64
+ }
65
+ }
66
+ exports.DigitrafficStack = DigitrafficStack;
67
+ //# sourceMappingURL=stack.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stack.js","sourceRoot":"","sources":["../../../../src/aws/infra/stack/stack.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
- import { CfnSubscriptionFilter } from 'aws-cdk-lib/aws-logs';
2
- import { Function } from 'aws-cdk-lib/aws-lambda';
1
+ import { CfnSubscriptionFilter } from "aws-cdk-lib/aws-logs";
2
+ import { Function as AWSFunction } from "aws-cdk-lib/aws-lambda";
3
3
  import { DigitrafficStack } from "./stack";
4
4
  import { Construct } from "constructs";
5
5
  import { MonitoredFunction } from "./monitoredfunction";
@@ -11,7 +11,7 @@ import { MonitoredFunction } from "./monitoredfunction";
11
11
  * @param logDestinationArn Destination for streamed logs
12
12
  * @param stack CloudFormation stack
13
13
  */
14
- export declare function createSubscription(lambda: Function, lambdaName: string, logDestinationArn: string | undefined, stack: Construct): CfnSubscriptionFilter | undefined;
14
+ export declare function createSubscription(lambda: AWSFunction, lambdaName: string, logDestinationArn: string | undefined, stack: Construct): CfnSubscriptionFilter | undefined;
15
15
  export declare class DigitrafficLogSubscriptions {
16
16
  constructor(stack: DigitrafficStack, ...lambdas: MonitoredFunction[]);
17
17
  }
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DigitrafficLogSubscriptions = exports.createSubscription = void 0;
4
+ const aws_logs_1 = require("aws-cdk-lib/aws-logs");
5
+ /**
6
+ * Creates a subscription filter that subscribes to a Lambda Log Group and delivers the logs to another destination.
7
+ * https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-logs-subscriptionfilter.html
8
+ * @param lambda The Lambda function, needed to create a dependency
9
+ * @param lambdaName The Lambda name from which the Log Group name is derived
10
+ * @param logDestinationArn Destination for streamed logs
11
+ * @param stack CloudFormation stack
12
+ */
13
+ function createSubscription(lambda, lambdaName, logDestinationArn, stack) {
14
+ if (logDestinationArn == undefined) {
15
+ return undefined;
16
+ }
17
+ const filter = new aws_logs_1.CfnSubscriptionFilter(stack, `${lambdaName}LogsSubscription`, {
18
+ logGroupName: `/aws/lambda/${lambdaName}`,
19
+ filterPattern: "",
20
+ destinationArn: logDestinationArn,
21
+ });
22
+ filter.node.addDependency(lambda);
23
+ return filter;
24
+ }
25
+ exports.createSubscription = createSubscription;
26
+ class DigitrafficLogSubscriptions {
27
+ constructor(stack, ...lambdas) {
28
+ const destinationArn = stack.configuration.logsDestinationArn;
29
+ if (destinationArn !== undefined) {
30
+ lambdas.forEach((lambda) => {
31
+ const filter = new aws_logs_1.CfnSubscriptionFilter(stack, `${lambda.givenName}LogsSubscription`, {
32
+ logGroupName: `/aws/lambda/${lambda.givenName}`,
33
+ filterPattern: "",
34
+ destinationArn,
35
+ });
36
+ filter.node.addDependency(lambda);
37
+ });
38
+ }
39
+ }
40
+ }
41
+ exports.DigitrafficLogSubscriptions = DigitrafficLogSubscriptions;
42
+ //# sourceMappingURL=subscription.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subscription.js","sourceRoot":"","sources":["../../../../src/aws/infra/stack/subscription.ts"],"names":[],"mappings":";;;AAAA,mDAA6D;AAM7D;;;;;;;GAOG;AACH,SAAgB,kBAAkB,CAC9B,MAAmB,EACnB,UAAkB,EAClB,iBAAqC,EACrC,KAAgB;IAEhB,IAAI,iBAAiB,IAAI,SAAS,EAAE;QAChC,OAAO,SAAS,CAAC;KACpB;IACD,MAAM,MAAM,GAAG,IAAI,gCAAqB,CACpC,KAAK,EACL,GAAG,UAAU,kBAAkB,EAC/B;QACI,YAAY,EAAE,eAAe,UAAU,EAAE;QACzC,aAAa,EAAE,EAAE;QACjB,cAAc,EAAE,iBAAiB;KACpC,CACJ,CAAC;IAEF,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;IAElC,OAAO,MAAM,CAAC;AAClB,CAAC;AAtBD,gDAsBC;AAED,MAAa,2BAA2B;IACpC,YAAY,KAAuB,EAAE,GAAG,OAA4B;QAChE,MAAM,cAAc,GAAG,KAAK,CAAC,aAAa,CAAC,kBAAkB,CAAC;QAC9D,IAAI,cAAc,KAAK,SAAS,EAAE;YAC9B,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE;gBACvB,MAAM,MAAM,GAAG,IAAI,gCAAqB,CACpC,KAAK,EACL,GAAG,MAAM,CAAC,SAAS,kBAAkB,EACrC;oBACI,YAAY,EAAE,eAAe,MAAM,CAAC,SAAS,EAAE;oBAC/C,aAAa,EAAE,EAAE;oBACjB,cAAc;iBACjB,CACJ,CAAC;gBAEF,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;YACtC,CAAC,CAAC,CAAC;SACN;IACL,CAAC;CACJ;AAnBD,kEAmBC"}
File without changes
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createDefaultUsagePlan = exports.createUsagePlan = void 0;
4
+ /**
5
+ * Creates an usage plan for a REST API with a single API key
6
+ * @param api The REST API
7
+ * @param apiKeyId Id for the API key, this is a surrogate id for CDK, not displayed anywhere
8
+ * @param apiKeyName Name for the API key, this is displayed in the AWS Console
9
+ * @deprecated Creates randomized API key names, use createDefaultUsagePlan instead
10
+ */
11
+ function createUsagePlan(api, apiKeyId, apiKeyName) {
12
+ const apiKey = api.addApiKey(apiKeyId);
13
+ const plan = api.addUsagePlan(apiKeyName, {
14
+ name: apiKeyName,
15
+ });
16
+ plan.addApiStage({
17
+ stage: api.deploymentStage,
18
+ });
19
+ plan.addApiKey(apiKey);
20
+ return apiKey;
21
+ }
22
+ exports.createUsagePlan = createUsagePlan;
23
+ /**
24
+ * Creates a default usage plan for a REST API with a single API key
25
+ * @param api The REST API
26
+ * @param apiName Name of the api. Will generate key: apiName + ' API Key' and plan: apiName + ' API Usage Plan'
27
+ */
28
+ function createDefaultUsagePlan(api, apiName) {
29
+ const apiKeyName = apiName + ' API Key';
30
+ const usagePlanName = apiName + ' API Usage Plan';
31
+ const apiKey = api.addApiKey(apiKeyName, { apiKeyName: apiKeyName });
32
+ const plan = api.addUsagePlan(usagePlanName, {
33
+ name: usagePlanName,
34
+ });
35
+ plan.addApiStage({
36
+ stage: api.deploymentStage,
37
+ });
38
+ plan.addApiKey(apiKey);
39
+ return apiKey;
40
+ }
41
+ exports.createDefaultUsagePlan = createDefaultUsagePlan;
42
+ //# sourceMappingURL=usage-plans.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usage-plans.js","sourceRoot":"","sources":["../../../src/aws/infra/usage-plans.ts"],"names":[],"mappings":";;;AAEA;;;;;;GAMG;AACH,SAAgB,eAAe,CAAC,GAAY,EAAE,QAAgB,EAAE,UAAkB;IAC9E,MAAM,MAAM,GAAG,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IACvC,MAAM,IAAI,GAAG,GAAG,CAAC,YAAY,CAAC,UAAU,EAAE;QACtC,IAAI,EAAE,UAAU;KACnB,CAAC,CAAC;IACH,IAAI,CAAC,WAAW,CAAC;QACb,KAAK,EAAE,GAAG,CAAC,eAAe;KAC7B,CAAC,CAAC;IACH,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IAEvB,OAAO,MAAM,CAAC;AAClB,CAAC;AAXD,0CAWC;AAED;;;;GAIG;AACH,SAAgB,sBAAsB,CAAC,GAAY,EAAE,OAAe;IAChE,MAAM,UAAU,GAAG,OAAO,GAAG,UAAU,CAAC;IACxC,MAAM,aAAa,GAAG,OAAO,GAAG,iBAAiB,CAAC;IAClD,MAAM,MAAM,GAAG,GAAG,CAAC,SAAS,CAAC,UAAU,EAAE,EAAE,UAAU,EAAE,UAAU,EAAE,CAAC,CAAC;IACrE,MAAM,IAAI,GAAG,GAAG,CAAC,YAAY,CAAC,aAAa,EAAE;QACzC,IAAI,EAAE,aAAa;KACtB,CAAC,CAAC;IACH,IAAI,CAAC,WAAW,CAAC;QACb,KAAK,EAAE,GAAG,CAAC,eAAe;KAC7B,CAAC,CAAC;IACH,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IAEvB,OAAO,MAAM,CAAC;AAClB,CAAC;AAbD,wDAaC"}
File without changes
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getApiKeyFromAPIGateway = void 0;
4
+ const aws_sdk_1 = require("aws-sdk");
5
+ function getApiKeyFromAPIGateway(keyId) {
6
+ const agw = new aws_sdk_1.APIGateway();
7
+ return agw.getApiKey({
8
+ apiKey: keyId,
9
+ includeValue: true,
10
+ }).promise();
11
+ }
12
+ exports.getApiKeyFromAPIGateway = getApiKeyFromAPIGateway;
13
+ //# sourceMappingURL=apikey.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apikey.js","sourceRoot":"","sources":["../../../src/aws/runtime/apikey.ts"],"names":[],"mappings":";;;AAAA,qCAAmC;AAEnC,SAAgB,uBAAuB,CAAC,KAAa;IACjD,MAAM,GAAG,GAAG,IAAI,oBAAU,EAAE,CAAC;IAC7B,OAAO,GAAG,CAAC,SAAS,CAAC;QACjB,MAAM,EAAE,KAAK;QACb,YAAY,EAAE,IAAI;KACrB,CAAC,CAAC,OAAO,EAAE,CAAC;AACjB,CAAC;AAND,0DAMC"}
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DigitrafficIntegrationResponse = void 0;
4
+ const mediatypes_1 = require("../types/mediatypes");
5
+ const response_1 = require("../infra/api/response");
6
+ class DigitrafficIntegrationResponse {
7
+ static ok(mediaType) {
8
+ return this.create("200", mediaType);
9
+ }
10
+ static badRequest(mediaType) {
11
+ return this.create("400", mediaType ?? mediatypes_1.MediaType.TEXT_PLAIN);
12
+ }
13
+ static notImplemented(mediaType) {
14
+ return this.create("501", mediaType ?? mediatypes_1.MediaType.TEXT_PLAIN);
15
+ }
16
+ static create(statusCode, mediaType) {
17
+ return {
18
+ statusCode,
19
+ responseTemplates: {
20
+ [mediaType]: response_1.RESPONSE_DEFAULT_LAMBDA,
21
+ },
22
+ };
23
+ }
24
+ }
25
+ exports.DigitrafficIntegrationResponse = DigitrafficIntegrationResponse;
26
+ //# sourceMappingURL=digitraffic-integration-response.js.map