@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.
- package/{aws → dist/aws}/infra/api/integration.d.ts +0 -0
- package/dist/aws/infra/api/integration.js +52 -0
- package/dist/aws/infra/api/integration.js.map +1 -0
- package/{aws → dist/aws}/infra/api/response.d.ts +0 -0
- package/dist/aws/infra/api/response.js +61 -0
- package/dist/aws/infra/api/response.js.map +1 -0
- package/{aws → dist/aws}/infra/api/responses.d.ts +3 -3
- package/dist/aws/infra/api/responses.js +82 -0
- package/dist/aws/infra/api/responses.js.map +1 -0
- package/{aws → dist/aws}/infra/api/static-integration.d.ts +0 -0
- package/dist/aws/infra/api/static-integration.js +54 -0
- package/dist/aws/infra/api/static-integration.js.map +1 -0
- package/{aws → dist/aws}/infra/canaries/canary-alarm.d.ts +0 -0
- package/dist/aws/infra/canaries/canary-alarm.js +26 -0
- package/dist/aws/infra/canaries/canary-alarm.js.map +1 -0
- package/dist/aws/infra/canaries/canary-keys.d.ts +3 -0
- package/dist/aws/infra/canaries/canary-keys.js +7 -0
- package/dist/aws/infra/canaries/canary-keys.js.map +1 -0
- package/{aws → dist/aws}/infra/canaries/canary-parameters.d.ts +0 -0
- package/dist/aws/infra/canaries/canary-parameters.js +3 -0
- package/dist/aws/infra/canaries/canary-parameters.js.map +1 -0
- package/{aws → dist/aws}/infra/canaries/canary-role.d.ts +0 -0
- package/dist/aws/infra/canaries/canary-role.js +46 -0
- package/dist/aws/infra/canaries/canary-role.js.map +1 -0
- package/{aws → dist/aws}/infra/canaries/canary.d.ts +0 -0
- package/dist/aws/infra/canaries/canary.js +32 -0
- package/dist/aws/infra/canaries/canary.js.map +1 -0
- package/{aws → dist/aws}/infra/canaries/database-canary.d.ts +0 -0
- package/dist/aws/infra/canaries/database-canary.js +70 -0
- package/dist/aws/infra/canaries/database-canary.js.map +1 -0
- package/{aws → dist/aws}/infra/canaries/database-checker.d.ts +2 -2
- package/dist/aws/infra/canaries/database-checker.js +103 -0
- package/dist/aws/infra/canaries/database-checker.js.map +1 -0
- package/{aws → dist/aws}/infra/canaries/url-canary.d.ts +0 -3
- package/dist/aws/infra/canaries/url-canary.js +47 -0
- package/dist/aws/infra/canaries/url-canary.js.map +1 -0
- package/{aws → dist/aws}/infra/canaries/url-checker.d.ts +0 -0
- package/dist/aws/infra/canaries/url-checker.js +252 -0
- package/dist/aws/infra/canaries/url-checker.js.map +1 -0
- package/{aws → dist/aws}/infra/documentation.d.ts +0 -0
- package/dist/aws/infra/documentation.js +95 -0
- package/dist/aws/infra/documentation.js.map +1 -0
- package/{aws → dist/aws}/infra/scheduler.d.ts +7 -7
- package/dist/aws/infra/scheduler.js +31 -0
- package/dist/aws/infra/scheduler.js.map +1 -0
- package/{aws → dist/aws}/infra/security-rule.d.ts +0 -0
- package/dist/aws/infra/security-rule.js +39 -0
- package/dist/aws/infra/security-rule.js.map +1 -0
- package/{aws → dist/aws}/infra/sqs-integration.d.ts +0 -0
- package/dist/aws/infra/sqs-integration.js +93 -0
- package/dist/aws/infra/sqs-integration.js.map +1 -0
- package/{aws → dist/aws}/infra/sqs-queue.d.ts +0 -0
- package/dist/aws/infra/sqs-queue.js +130 -0
- package/dist/aws/infra/sqs-queue.js.map +1 -0
- package/{aws → dist/aws}/infra/stack/lambda-configs.d.ts +5 -5
- package/dist/aws/infra/stack/lambda-configs.js +105 -0
- package/dist/aws/infra/stack/lambda-configs.js.map +1 -0
- package/{aws → dist/aws}/infra/stack/monitoredfunction.d.ts +1 -1
- package/dist/aws/infra/stack/monitoredfunction.js +143 -0
- package/dist/aws/infra/stack/monitoredfunction.js.map +1 -0
- package/{aws → dist/aws}/infra/stack/rest_apis.d.ts +0 -0
- package/dist/aws/infra/stack/rest_apis.js +185 -0
- package/dist/aws/infra/stack/rest_apis.js.map +1 -0
- package/{aws → dist/aws}/infra/stack/stack-checking-aspect.d.ts +0 -0
- package/dist/aws/infra/stack/stack-checking-aspect.js +174 -0
- package/dist/aws/infra/stack/stack-checking-aspect.js.map +1 -0
- package/{aws → dist/aws}/infra/stack/stack.d.ts +5 -4
- package/dist/aws/infra/stack/stack.js +67 -0
- package/dist/aws/infra/stack/stack.js.map +1 -0
- package/{aws → dist/aws}/infra/stack/subscription.d.ts +3 -3
- package/dist/aws/infra/stack/subscription.js +42 -0
- package/dist/aws/infra/stack/subscription.js.map +1 -0
- package/{aws → dist/aws}/infra/usage-plans.d.ts +0 -0
- package/dist/aws/infra/usage-plans.js +42 -0
- package/dist/aws/infra/usage-plans.js.map +1 -0
- package/{aws → dist/aws}/runtime/apikey.d.ts +0 -0
- package/dist/aws/runtime/apikey.js +13 -0
- package/dist/aws/runtime/apikey.js.map +1 -0
- package/{aws → dist/aws}/runtime/digitraffic-integration-response.d.ts +0 -0
- package/dist/aws/runtime/digitraffic-integration-response.js +26 -0
- package/dist/aws/runtime/digitraffic-integration-response.js.map +1 -0
- package/dist/aws/runtime/environment.d.ts +1 -0
- package/dist/aws/runtime/environment.js +12 -0
- package/dist/aws/runtime/environment.js.map +1 -0
- package/{aws → dist/aws}/runtime/messaging.d.ts +0 -0
- package/dist/aws/runtime/messaging.js +31 -0
- package/dist/aws/runtime/messaging.js.map +1 -0
- package/{aws → dist/aws}/runtime/s3.d.ts +0 -0
- package/dist/aws/runtime/s3.js +30 -0
- package/dist/aws/runtime/s3.js.map +1 -0
- package/{aws → dist/aws}/runtime/secrets/dbsecret.d.ts +0 -0
- package/dist/aws/runtime/secrets/dbsecret.js +96 -0
- package/dist/aws/runtime/secrets/dbsecret.js.map +1 -0
- package/{aws → dist/aws}/runtime/secrets/proxy-holder.d.ts +0 -0
- package/dist/aws/runtime/secrets/proxy-holder.js +27 -0
- package/dist/aws/runtime/secrets/proxy-holder.js.map +1 -0
- package/{aws → dist/aws}/runtime/secrets/rds-holder.d.ts +0 -0
- package/dist/aws/runtime/secrets/rds-holder.js +27 -0
- package/dist/aws/runtime/secrets/rds-holder.js.map +1 -0
- package/{aws → dist/aws}/runtime/secrets/secret-holder.d.ts +0 -0
- package/dist/aws/runtime/secrets/secret-holder.js +76 -0
- package/dist/aws/runtime/secrets/secret-holder.js.map +1 -0
- package/{aws → dist/aws}/runtime/secrets/secret.d.ts +0 -0
- package/dist/aws/runtime/secrets/secret.js +43 -0
- package/dist/aws/runtime/secrets/secret.js.map +1 -0
- package/{aws → dist/aws}/types/errors.d.ts +4 -0
- package/dist/aws/types/errors.js +16 -0
- package/dist/aws/types/errors.js.map +1 -0
- package/{aws → dist/aws}/types/lambda-response.d.ts +4 -3
- package/dist/aws/types/lambda-response.js +33 -0
- package/dist/aws/types/lambda-response.js.map +1 -0
- package/{aws → dist/aws}/types/mediatypes.d.ts +1 -1
- package/dist/aws/types/mediatypes.js +16 -0
- package/dist/aws/types/mediatypes.js.map +1 -0
- package/{aws → dist/aws}/types/model-with-reference.d.ts +0 -0
- package/dist/aws/types/model-with-reference.js +3 -0
- package/dist/aws/types/model-with-reference.js.map +1 -0
- package/{aws → dist/aws}/types/proxytypes.d.ts +0 -0
- package/dist/aws/types/proxytypes.js +3 -0
- package/dist/aws/types/proxytypes.js.map +1 -0
- package/{aws → dist/aws}/types/tags.d.ts +0 -0
- package/dist/aws/types/tags.js +7 -0
- package/dist/aws/types/tags.js.map +1 -0
- package/{database → dist/database}/cached.d.ts +0 -0
- package/dist/database/cached.js +32 -0
- package/dist/database/cached.js.map +1 -0
- package/{database → dist/database}/database.d.ts +0 -0
- package/dist/database/database.js +70 -0
- package/dist/database/database.js.map +1 -0
- package/{database → dist/database}/last-updated.d.ts +0 -0
- package/dist/database/last-updated.js +54 -0
- package/dist/database/last-updated.js.map +1 -0
- package/dist/database/models.d.ts +6 -0
- package/dist/database/models.js +3 -0
- package/dist/database/models.js.map +1 -0
- package/{marine → dist/marine}/id_utils.d.ts +0 -0
- package/dist/marine/id_utils.js +33 -0
- package/dist/marine/id_utils.js.map +1 -0
- package/{marine → dist/marine}/rtz.d.ts +0 -0
- package/dist/marine/rtz.js +3 -0
- package/dist/marine/rtz.js.map +1 -0
- package/{test → dist/test}/asserter.d.ts +0 -0
- package/dist/test/asserter.js +45 -0
- package/dist/test/asserter.js.map +1 -0
- package/{test → dist/test}/db-testutils.d.ts +1 -1
- package/dist/test/db-testutils.js +31 -0
- package/dist/test/db-testutils.js.map +1 -0
- package/{test → dist/test}/httpserver.d.ts +2 -1
- package/dist/test/httpserver.js +74 -0
- package/dist/test/httpserver.js.map +1 -0
- package/{test → dist/test}/secret.d.ts +0 -0
- package/dist/test/secret.js +25 -0
- package/dist/test/secret.js.map +1 -0
- package/{test → dist/test}/secrets-manager.d.ts +0 -0
- package/dist/test/secrets-manager.js +59 -0
- package/dist/test/secrets-manager.js.map +1 -0
- package/{test → dist/test}/testutils.d.ts +0 -0
- package/dist/test/testutils.js +44 -0
- package/dist/test/testutils.js.map +1 -0
- package/dist/types/either.d.ts +9 -0
- package/dist/types/either.js +3 -0
- package/dist/types/either.js.map +1 -0
- package/{types → dist/types}/input-error.d.ts +0 -0
- package/dist/types/input-error.js +7 -0
- package/dist/types/input-error.js.map +1 -0
- package/{types → dist/types}/language.d.ts +0 -0
- package/dist/types/language.js +10 -0
- package/dist/types/language.js.map +1 -0
- package/{types → dist/types}/traffictype.d.ts +0 -0
- package/dist/types/traffictype.js +13 -0
- package/dist/types/traffictype.js.map +1 -0
- package/{types → dist/types}/validator.d.ts +0 -0
- package/dist/types/validator.js +14 -0
- package/dist/types/validator.js.map +1 -0
- package/{utils → dist/utils}/api-model.d.ts +0 -0
- package/dist/utils/api-model.js +129 -0
- package/dist/utils/api-model.js.map +1 -0
- package/{utils → dist/utils}/base64.d.ts +0 -0
- package/dist/utils/base64.js +21 -0
- package/dist/utils/base64.js.map +1 -0
- package/{utils → dist/utils}/date-utils.d.ts +0 -0
- package/dist/utils/date-utils.js +34 -0
- package/dist/utils/date-utils.js.map +1 -0
- package/{utils → dist/utils}/geojson-types.d.ts +0 -0
- package/dist/utils/geojson-types.js +18 -0
- package/dist/utils/geojson-types.js.map +1 -0
- package/{utils → dist/utils}/geometry.d.ts +0 -0
- package/dist/utils/geometry.js +164 -0
- package/dist/utils/geometry.js.map +1 -0
- package/{utils → dist/utils}/retry.d.ts +0 -0
- package/dist/utils/retry.js +50 -0
- package/dist/utils/retry.js.map +1 -0
- package/{utils → dist/utils}/slack.d.ts +0 -0
- package/dist/utils/slack.js +25 -0
- package/dist/utils/slack.js.map +1 -0
- package/{utils → dist/utils}/utils.d.ts +24 -0
- package/dist/utils/utils.js +75 -0
- package/dist/utils/utils.js.map +1 -0
- package/package.json +12 -10
- package/src/@types/geojson-validation/index.d.ts +4 -0
- package/src/aws/infra/api/integration.ts +73 -0
- package/src/aws/infra/api/response.ts +67 -0
- package/src/aws/infra/api/responses.ts +124 -0
- package/src/aws/infra/api/static-integration.ts +62 -0
- package/src/aws/infra/canaries/canary-alarm.ts +31 -0
- package/src/aws/infra/canaries/canary-keys.ts +3 -0
- package/src/aws/infra/canaries/canary-parameters.ts +19 -0
- package/src/aws/infra/canaries/canary-role.ts +47 -0
- package/src/aws/infra/canaries/canary.ts +46 -0
- package/src/aws/infra/canaries/database-canary.ts +98 -0
- package/src/aws/infra/canaries/database-checker.ts +155 -0
- package/src/aws/infra/canaries/url-canary.ts +74 -0
- package/src/aws/infra/canaries/url-checker.ts +366 -0
- package/src/aws/infra/documentation.ts +124 -0
- package/src/aws/infra/scheduler.ts +59 -0
- package/src/aws/infra/security-rule.ts +38 -0
- package/src/aws/infra/sqs-integration.ts +102 -0
- package/src/aws/infra/sqs-queue.ts +148 -0
- package/src/aws/infra/stack/lambda-configs.ts +207 -0
- package/src/aws/infra/stack/monitoredfunction.ts +342 -0
- package/src/aws/infra/stack/rest_apis.ts +223 -0
- package/src/aws/infra/stack/stack-checking-aspect.ts +279 -0
- package/src/aws/infra/stack/stack.ts +145 -0
- package/src/aws/infra/stack/subscription.ts +58 -0
- package/src/aws/infra/usage-plans.ts +41 -0
- package/src/aws/runtime/apikey.ts +9 -0
- package/src/aws/runtime/digitraffic-integration-response.ts +28 -0
- package/src/aws/runtime/environment.ts +9 -0
- package/src/aws/runtime/messaging.ts +26 -0
- package/src/aws/runtime/s3.ts +44 -0
- package/src/aws/runtime/secrets/dbsecret.ts +116 -0
- package/src/aws/runtime/secrets/proxy-holder.ts +37 -0
- package/src/aws/runtime/secrets/rds-holder.ts +33 -0
- package/src/aws/runtime/secrets/secret-holder.ts +116 -0
- package/src/aws/runtime/secrets/secret.ts +50 -0
- package/src/aws/types/errors.ts +14 -0
- package/src/aws/types/lambda-response.ts +43 -0
- package/src/aws/types/mediatypes.ts +11 -0
- package/src/aws/types/model-with-reference.ts +8 -0
- package/src/aws/types/proxytypes.ts +27 -0
- package/src/aws/types/tags.ts +3 -0
- package/src/database/cached.ts +35 -0
- package/src/database/database.ts +96 -0
- package/src/database/last-updated.ts +59 -0
- package/src/database/models.ts +7 -0
- package/src/marine/id_utils.ts +30 -0
- package/src/marine/rtz.ts +57 -0
- package/src/test/asserter.ts +48 -0
- package/src/test/db-testutils.ts +44 -0
- package/src/test/httpserver.ts +96 -0
- package/src/test/secret.ts +23 -0
- package/src/test/secrets-manager.ts +34 -0
- package/src/test/testutils.ts +39 -0
- package/src/types/either.ts +3 -0
- package/src/types/input-error.ts +2 -0
- package/src/types/language.ts +3 -0
- package/src/types/traffictype.ts +8 -0
- package/src/types/validator.ts +10 -0
- package/src/utils/api-model.ts +133 -0
- package/src/utils/base64.ts +16 -0
- package/src/utils/date-utils.ts +30 -0
- package/src/utils/geojson-types.ts +22 -0
- package/src/utils/geometry.ts +164 -0
- package/src/utils/retry.ts +49 -0
- package/src/utils/slack.ts +22 -0
- package/src/utils/utils.ts +105 -0
- package/aws/index.d.ts +0 -1
- package/aws/infra/api/index.d.ts +0 -1
- package/aws/infra/api/integration.js +0 -52
- package/aws/infra/api/response.js +0 -61
- package/aws/infra/api/responses.js +0 -79
- package/aws/infra/api/static-integration.js +0 -54
- package/aws/infra/canaries/canary-alarm.js +0 -26
- package/aws/infra/canaries/canary-parameters.js +0 -3
- package/aws/infra/canaries/canary-role.js +0 -46
- package/aws/infra/canaries/canary.js +0 -29
- package/aws/infra/canaries/database-canary.js +0 -55
- package/aws/infra/canaries/database-checker.js +0 -109
- package/aws/infra/canaries/url-canary.js +0 -46
- package/aws/infra/canaries/url-checker.js +0 -238
- package/aws/infra/documentation.js +0 -95
- package/aws/infra/scheduler.js +0 -31
- package/aws/infra/security-rule.js +0 -39
- package/aws/infra/sqs-integration.js +0 -93
- package/aws/infra/sqs-queue.js +0 -130
- package/aws/infra/stack/lambda-configs.js +0 -93
- package/aws/infra/stack/monitoredfunction.js +0 -135
- package/aws/infra/stack/rest_apis.js +0 -185
- package/aws/infra/stack/stack-checking-aspect.js +0 -174
- package/aws/infra/stack/stack.js +0 -60
- package/aws/infra/stack/subscription.js +0 -41
- package/aws/infra/usage-plans.js +0 -42
- package/aws/runtime/apikey.js +0 -13
- package/aws/runtime/digitraffic-integration-response.js +0 -26
- package/aws/runtime/messaging.js +0 -31
- package/aws/runtime/s3.js +0 -30
- package/aws/runtime/secrets/dbsecret.js +0 -96
- package/aws/runtime/secrets/proxy-holder.js +0 -26
- package/aws/runtime/secrets/rds-holder.js +0 -26
- package/aws/runtime/secrets/secret-holder.js +0 -73
- package/aws/runtime/secrets/secret.js +0 -43
- package/aws/types/errors.js +0 -9
- package/aws/types/lambda-response.js +0 -28
- package/aws/types/mediatypes.js +0 -15
- package/aws/types/model-with-reference.js +0 -3
- package/aws/types/proxytypes.js +0 -3
- package/aws/types/tags.js +0 -7
- package/database/cached.js +0 -32
- package/database/database.js +0 -62
- package/database/last-updated.js +0 -54
- package/index.d.ts +0 -1
- package/index.js +0 -18
- package/marine/id_utils.js +0 -33
- package/marine/rtz.js +0 -3
- package/test/asserter.js +0 -45
- package/test/db-testutils.js +0 -31
- package/test/httpserver.js +0 -67
- package/test/secret.js +0 -25
- package/test/secrets-manager.js +0 -59
- package/test/testutils.js +0 -44
- package/types/index.d.ts +0 -1
- package/types/input-error.js +0 -7
- package/types/language.js +0 -10
- package/types/traffictype.js +0 -13
- package/types/validator.js +0 -14
- package/utils/api-model.js +0 -129
- package/utils/base64.js +0 -21
- package/utils/date-utils.js +0 -34
- package/utils/geojson-types.js +0 -18
- package/utils/geometry.js +0 -140
- package/utils/retry.js +0 -50
- package/utils/slack.js +0 -25
- package/utils/utils.js +0 -40
- package/yarn-error.log +0 -103
@@ -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
|
@@ -1,174 +0,0 @@
|
|
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=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhY2stY2hlY2tpbmctYXNwZWN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2F3cy9pbmZyYS9zdGFjay9zdGFjay1jaGVja2luZy1hc3BlY3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsNkNBQTBEO0FBQzFELHVEQUE4RDtBQUM5RCwrQ0FBK0M7QUFDL0MsbUNBQXlEO0FBRXpELCtEQUFvRTtBQUNwRSw2Q0FBbUQ7QUFDbkQsaURBQStDO0FBQy9DLG1EQUFvRDtBQUdwRCxNQUFNLHFCQUFxQixHQUFHLEdBQUcsQ0FBQztBQUNsQyxNQUFNLFlBQVksR0FBRyxvQkFBTyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUM7QUFFOUMsSUFBSyxZQVlKO0FBWkQsV0FBSyxZQUFZO0lBQ2Isd0NBQXdCLENBQUE7SUFDeEIsaUZBQWlFLENBQUE7SUFDakUsb0RBQW9DLENBQUE7SUFDcEMsMkRBQTJDLENBQUE7SUFDM0Msb0RBQW9DLENBQUE7SUFDcEMsOENBQThCLENBQUE7SUFDOUIsNENBQTRCLENBQUE7SUFDNUIsb0RBQW9DLENBQUE7SUFDcEMsOENBQThCLENBQUE7SUFDOUIsb0RBQW9DLENBQUE7SUFDcEMseURBQXlDLENBQUE7QUFDN0MsQ0FBQyxFQVpJLFlBQVksS0FBWixZQUFZLFFBWWhCO0FBRUQsTUFBYSxtQkFBbUI7SUFJNUIsWUFBWSxjQUF1QixFQUFFLG9CQUErQjtRQUNoRSxJQUFJLENBQUMsY0FBYyxHQUFHLGNBQWMsQ0FBQztRQUNyQyxJQUFJLENBQUMsb0JBQW9CLEdBQUcsb0JBQW9CLENBQUM7SUFDckQsQ0FBQztJQUVELE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBdUI7UUFDakMsT0FBTyxJQUFJLG1CQUFtQixDQUMxQixLQUFLLENBQUMsYUFBYSxDQUFDLFNBQVMsRUFDN0IsS0FBSyxDQUFDLGFBQWEsQ0FBQyxvQkFBb0IsQ0FDM0MsQ0FBQztJQUNOLENBQUM7SUFFTSxLQUFLLENBQUMs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QkFBWSxFQUFFO1lBQzlCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsWUFHdkIsQ0FBQztZQUNGLE1BQU0sU0FBUyxHQUFHLEtBQUssQ0FBQyxjQUFjLENBQUMsZUFBZSxDQUFDO1lBRXZELElBQUksQ0FBQyxTQUFTLEVBQUU7Z0JBQ1osSUFBSSxDQUFDLGFBQWEsQ0FDZCxJQUFJLEVBQ0osWUFBWSxDQUFDLGlCQUFpQixFQUM5QiwyQ0FBMkMsQ0FDOUMsQ0FBQzthQUNMO1NBQ0o7SUFDTCxDQUFDO0NBQ0o7QUExUEQsa0RBMFBDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQW5ub3RhdGlvbnMsIElBc3BlY3QsIFN0YWNrIH0gZnJvbSBcImF3cy1jZGstbGliXCI7XG5pbXBvcnQgeyBDZm5GdW5jdGlvbiwgUnVudGltZSB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtbGFtYmRhXCI7XG5pbXBvcnQgeyBDZm5CdWNrZXQgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXMzXCI7XG5pbXBvcnQgeyBEaWdpdHJhZmZpY1N0YWNrLCBTT0xVVElPTl9LRVkgfSBmcm9tIFwiLi9zdGFja1wiO1xuaW1wb3J0IHsgSUNvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5pbXBvcnQgeyBDZm5NZXRob2QsIENmblJlc291cmNlIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1hcGlnYXRld2F5XCI7XG5pbXBvcnQgeyBwYXJhbUNhc2UsIHNuYWtlQ2FzZSB9IGZyb20gXCJjaGFuZ2UtY2FzZVwiO1xuaW1wb3J0IHsgQ2ZuUXVldWUgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXNxc1wiO1xuaW1wb3J0IHsgTG9nUmV0ZW50aW9uIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1sb2dzXCI7XG5pbXBvcnQgSW50ZWdyYXRpb25Qcm9wZXJ0eSA9IENmbk1ldGhvZC5JbnRlZ3JhdGlvblByb3BlcnR5O1xuXG5jb25zdCBNQVhfQ09OQ1VSUkVOQ1lfTElNSVQgPSAxMDA7XG5jb25zdCBOT0RFX1JVTlRJTUUgPSBSdW50aW1lLk5PREVKU18xNF9YLm5hbWU7XG5cbmVudW0gUmVzb3VyY2VUeXBlIHtcbiAgICBzdGFja05hbWUgPSBcIlNUQUNLX05BTUVcIixcbiAgICByZXNlcnZlZENvbmN1cnJlbnRDb25jdXJyZW5jeSA9IFwiUkVTRVJWRURfQ09OQ1VSUkVOVF9DT05DVVJSRU5DWVwiLFxuICAgIGZ1bmN0aW9uVGltZW91dCA9IFwiRlVOQ1RJT05fVElNRU9VVFwiLFxuICAgIGZ1bmN0aW9uTWVtb3J5U2l6ZSA9IFwiRlVOQ1RJT05fTUVNT1JZX1NJWkVcIixcbiAgICBmdW5jdGlvblJ1bnRpbWUgPSBcIkZVTkNUSU9OX1JVTlRJTUVcIixcbiAgICBmdW5jdGlvbk5hbWUgPSBcIkZVTkNUSU9OX05BTUVcIixcbiAgICB0YWdTb2x1dGlvbiA9IFwiVEFHX1NPTFVUSU9OXCIsXG4gICAgYnVja2V0UHVibGljaXR5ID0gXCJCVUNLRVRfUFVCTElDSVRZXCIsXG4gICAgcmVzb3VyY2VQYXRoID0gXCJSRVNPVVJDRV9QQVRIXCIsXG4gICAgcXVldWVFbmNyeXB0aW9uID0gXCJRVUVVRV9FTkNSWVBUSU9OXCIsXG4gICAgbG9nR3JvdXBSZXRlbnRpb24gPSBcIkxPR19HUk9VUF9SRVRFTlRJT05cIixcbn1cblxuZXhwb3J0IGNsYXNzIFN0YWNrQ2hlY2tpbmdBc3BlY3QgaW1wbGVtZW50cyBJQXNwZWN0IHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHN0YWNrU2hvcnROYW1lPzogc3RyaW5nO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgd2hpdGVsaXN0ZWRSZXNvdXJjZXM/OiBzdHJpbmdbXTtcblxuICAgIGNvbnN0cnVjdG9yKHN0YWNrU2hvcnROYW1lPzogc3RyaW5nLCB3aGl0ZWxpc3RlZFJlc291cmNlcz86IHN0cmluZ1tdKSB7XG4gICAgICAgIHRoaXMuc3RhY2tTaG9ydE5hbWUgPSBzdGFja1Nob3J0TmFtZTtcbiAgICAgICAgdGhpcy53aGl0ZWxpc3RlZFJlc291cmNlcyA9IHdoaXRlbGlzdGVkUmVzb3VyY2VzO1xuICAgIH1cblxuICAgIHN0YXRpYyBjcmVhdGUoc3RhY2s6IERpZ2l0cmFmZmljU3RhY2spIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTdGFja0NoZWNraW5nQXNwZWN0KFxuICAgICAgICAgICAgc3RhY2suY29uZmlndXJhdGlvbi5zaG9ydE5hbWUsXG4gICAgICAgICAgICBzdGFjay5jb25maWd1cmF0aW9uLndoaXRlbGlzdGVkUmVzb3VyY2VzXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIHZpc2l0KG5vZGU6IElDb25zdHJ1Y3QpOiB2b2lkIHtcbiAgICAgICAgLy9jb25zb2xlLmluZm8oXCJ2aXNpdGluZyBjbGFzcyBcIiArIG5vZGUuY29uc3RydWN0b3IubmFtZSk7XG5cbiAgICAgICAgdGhpcy5jaGVja1N0YWNrKG5vZGUpO1xuICAgICAgICB0aGlzLmNoZWNrRnVuY3Rpb24obm9kZSk7XG4gICAgICAgIHRoaXMuY2hlY2tUYWdzKG5vZGUpO1xuICAgICAgICB0aGlzLmNoZWNrQnVja2V0KG5vZGUpO1xuICAgICAgICB0aGlzLmNoZWNrUmVzb3VyY2VDYXNpbmcobm9kZSk7XG4gICAgICAgIHRoaXMuY2hlY2tRdWV1ZUVuY3J5cHRpb24obm9kZSk7XG4gICAgICAgIHRoaXMuY2hlY2tMb2dHcm91cFJldGVudGlvbihub2RlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzV2hpdGVsaXN0ZWQoa2V5OiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMud2hpdGVsaXN0ZWRSZXNvdXJjZXM/LnNvbWUoKHdsKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4ga2V5Lm1hdGNoQWxsKG5ldyBSZWdFeHAod2wsIFwiZ1wiKSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgYWRkQW5ub3RhdGlvbihcbiAgICAgICAgbm9kZTogSUNvbnN0cnVjdCxcbiAgICAgICAga2V5OiBSZXNvdXJjZVR5cGUgfCBzdHJpbmcsXG4gICAgICAgIG1lc3NhZ2U6IHN0cmluZyxcbiAgICAgICAgaXNFcnJvciA9IHRydWVcbiAgICApIHtcbiAgICAgICAgY29uc3QgcmVzb3VyY2VLZXkgPSBgJHtub2RlLm5vZGUucGF0aH0vJHtrZXl9YDtcbiAgICAgICAgY29uc3QgaXNXaGl0ZUxpc3RlZCA9IHRoaXMuaXNXaGl0ZWxpc3RlZChyZXNvdXJjZUtleSk7XG4gICAgICAgIGNvbnN0IGFubm90YXRpb25NZXNzYWdlID0gYCR7cmVzb3VyY2VLZXl9OiR7bWVzc2FnZX1gO1xuXG4gICAgICAgIC8vIGVycm9yICYmIHdoaXRlbGlzdGVkIC0+IHdhcm5pbmdcbiAgICAgICAgLy8gd2FybmluZyAmJiB3aGl0ZWxpc3RlZCAtPiBub3RoaW5nXG4gICAgICAgIGlmIChpc0Vycm9yICYmICFpc1doaXRlTGlzdGVkKSB7XG4gICAgICAgICAgICBBbm5vdGF0aW9ucy5vZihub2RlKS5hZGRFcnJvcihhbm5vdGF0aW9uTWVzc2FnZSk7XG4gICAgICAgIH0gZWxzZSBpZiAoKCFpc0Vycm9yICYmICFpc1doaXRlTGlzdGVkKSB8fCAoaXNFcnJvciAmJiBpc1doaXRlTGlzdGVkKSkge1xuICAgICAgICAgICAgQW5ub3RhdGlvbnMub2Yobm9kZSkuYWRkV2FybmluZyhhbm5vdGF0aW9uTWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGNoZWNrU3RhY2sobm9kZTogSUNvbnN0cnVjdCkge1xuICAgICAgICBpZiAobm9kZSBpbnN0YW5jZW9mIERpZ2l0cmFmZmljU3RhY2spIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAobm9kZS5zdGFja05hbWUuaW5jbHVkZXMoXCJUZXN0XCIpIHx8XG4gICAgICAgICAgICAgICAgICAgIG5vZGUuc3RhY2tOYW1lLmluY2x1ZGVzKFwiVHN0XCIpKSAmJlxuICAgICAgICAgICAgICAgIG5vZGUuY29uZmlndXJhdGlvbi5wcm9kdWN0aW9uXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFkZEFubm90YXRpb24oXG4gICAgICAgICAgICAgICAgICAgIG5vZGUsXG4gICAgICAgICAgICAgICAgICAgIFJlc291cmNlVHlwZS5zdGFja05hbWUsXG4gICAgICAgICAgICAgICAgICAgIFwiUHJvZHVjdGlvbiBpcyBzZXQgZm9yIFRlc3Qtc3RhY2tcIlxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAobm9kZS5zdGFja05hbWUuaW5jbHVkZXMoXCJQcm9kXCIpIHx8XG4gICAgICAgICAgICAgICAgICAgIG5vZGUuc3RhY2tOYW1lLmluY2x1ZGVzKFwiUHJkXCIpKSAmJlxuICAgICAgICAgICAgICAgICFub2RlLmNvbmZpZ3VyYXRpb24ucHJvZHVjdGlvblxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGRBbm5vdGF0aW9uKFxuICAgICAgICAgICAgICAgICAgICBub2RlLFxuICAgICAgICAgICAgICAgICAgICBSZXNvdXJjZVR5cGUuc3RhY2tOYW1lLFxuICAgICAgICAgICAgICAgICAgICBcIlByb2R1Y3Rpb24gaXMgbm90IHNldCBmb3IgUHJvZHVjdGlvbi1zdGFja1wiXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgY2hlY2tGdW5jdGlvbihub2RlOiBJQ29uc3RydWN0KSB7XG4gICAgICAgIGlmIChub2RlIGluc3RhbmNlb2YgQ2ZuRnVuY3Rpb24pIHtcbiAgICAgICAgICAgIGlmICghbm9kZS5yZXNlcnZlZENvbmN1cnJlbnRFeGVjdXRpb25zKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGRBbm5vdGF0aW9uKFxuICAgICAgICAgICAgICAgICAgICBub2RlLFxuICAgICAgICAgICAgICAgICAgICBSZXNvdXJjZVR5cGUucmVzZXJ2ZWRDb25jdXJyZW50Q29uY3VycmVuY3ksXG4gICAgICAgICAgICAgICAgICAgIFwiRnVuY3Rpb24gbXVzdCBoYXZlIHJlc2VydmVkQ29uY3VycmVudENvbmN1cnJlbmN5XCJcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICBub2RlLnJlc2VydmVkQ29uY3VycmVudEV4ZWN1dGlvbnMgPiBNQVhfQ09OQ1VSUkVOQ1lfTElNSVRcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkQW5ub3RhdGlvbihcbiAgICAgICAgICAgICAgICAgICAgbm9kZSxcbiAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2VUeXBlLnJlc2VydmVkQ29uY3VycmVudENvbmN1cnJlbmN5LFxuICAgICAgICAgICAgICAgICAgICBcIkZ1bmN0aW9uIHJlc2VydmVkQ29uY3VycmVudENvbmN1cnJlbmN5IHRvbyBoaWdoIVwiXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCFub2RlLnRpbWVvdXQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFkZEFubm90YXRpb24oXG4gICAgICAgICAgICAgICAgICAgIG5vZGUsXG4gICAgICAgICAgICAgICAgICAgIFJlc291cmNlVHlwZS5mdW5jdGlvblRpbWVvdXQsXG4gICAgICAgICAgICAgICAgICAgIFwiRnVuY3Rpb24gbXVzdCBoYXZlIHRpbWVvdXRcIlxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghbm9kZS5tZW1vcnlTaXplKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGRBbm5vdGF0aW9uKFxuICAgICAgICAgICAgICAgICAgICBub2RlLFxuICAgICAgICAgICAgICAgICAgICBSZXNvdXJjZVR5cGUuZnVuY3Rpb25NZW1vcnlTaXplLFxuICAgICAgICAgICAgICAgICAgICBcIkZ1bmN0aW9uIG11c3QgaGF2ZSBtZW1vcnlTaXplXCJcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAobm9kZS5ydW50aW1lICE9PSBOT0RFX1JVTlRJTUUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFkZEFubm90YXRpb24oXG4gICAgICAgICAgICAgICAgICAgIG5vZGUsXG4gICAgICAgICAgICAgICAgICAgIFJlc291cmNlVHlwZS5mdW5jdGlvblJ1bnRpbWUsXG4gICAgICAgICAgICAgICAgICAgIGBGdW5jdGlvbiBoYXMgd3JvbmcgcnVudGltZSAke25vZGUucnVudGltZSF9YFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICB0aGlzLnN0YWNrU2hvcnROYW1lICYmXG4gICAgICAgICAgICAgICAgbm9kZS5mdW5jdGlvbk5hbWUgJiZcbiAgICAgICAgICAgICAgICAhbm9kZS5mdW5jdGlvbk5hbWUuc3RhcnRzV2l0aCh0aGlzLnN0YWNrU2hvcnROYW1lKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGRBbm5vdGF0aW9uKFxuICAgICAgICAgICAgICAgICAgICBub2RlLFxuICAgICAgICAgICAgICAgICAgICBSZXNvdXJjZVR5cGUuZnVuY3Rpb25OYW1lLFxuICAgICAgICAgICAgICAgICAgICBgRnVuY3Rpb24gbmFtZSBkb2VzIG5vdCBiZWdpbiB3aXRoICR7dGhpcy5zdGFja1Nob3J0TmFtZX1gXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgY2hlY2tUYWdzKG5vZGU6IElDb25zdHJ1Y3QpIHtcbiAgICAgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBTdGFjaykge1xuICAgICAgICAgICAgaWYgKCFub2RlLnRhZ3MudGFnVmFsdWVzKClbU09MVVRJT05fS0VZXSkge1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkQW5ub3RhdGlvbihcbiAgICAgICAgICAgICAgICAgICAgbm9kZSxcbiAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2VUeXBlLnRhZ1NvbHV0aW9uLFxuICAgICAgICAgICAgICAgICAgICBcIlNvbHV0aW9uIHRhZyBpcyBtaXNzaW5nXCJcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjaGVja0J1Y2tldChub2RlOiBJQ29uc3RydWN0KSB7XG4gICAgICAgIGlmIChub2RlIGluc3RhbmNlb2YgQ2ZuQnVja2V0KSB7XG4gICAgICAgICAgICBjb25zdCBjID1cbiAgICAgICAgICAgICAgICBub2RlLnB1YmxpY0FjY2Vzc0Jsb2NrQ29uZmlndXJhdGlvbiBhcyBDZm5CdWNrZXQuUHVibGljQWNjZXNzQmxvY2tDb25maWd1cmF0aW9uUHJvcGVydHk7XG5cbiAgICAgICAgICAgIGlmIChjKSB7XG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAhYy5ibG9ja1B1YmxpY0FjbHMgfHxcbiAgICAgICAgICAgICAgICAgICAgIWMuYmxvY2tQdWJsaWNQb2xpY3kgfHxcbiAgICAgICAgICAgICAgICAgICAgIWMuaWdub3JlUHVibGljQWNscyB8fFxuICAgICAgICAgICAgICAgICAgICAhYy5yZXN0cmljdFB1YmxpY0J1Y2tldHNcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRBbm5vdGF0aW9uKFxuICAgICAgICAgICAgICAgICAgICAgICAgbm9kZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIFJlc291cmNlVHlwZS5idWNrZXRQdWJsaWNpdHksXG4gICAgICAgICAgICAgICAgICAgICAgICBcIkNoZWNrIGJ1Y2tldCBwdWJsaWNpdHlcIlxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIGlzVmFsaWRQYXRoKHBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICAvLyBpZiBwYXRoIGluY2x1ZGVzIC4gb3IgeyBjaGVjayBvbmx5IHRoZSB0cmFpbGluZyBwYXJ0IG9mIHBhdGhcbiAgICAgICAgaWYgKHBhdGguaW5jbHVkZXMoXCIuXCIpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkUGF0aChwYXRoLnNwbGl0KFwiLlwiKVswXSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocGF0aC5pbmNsdWRlcyhcIntcIikpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmlzVmFsaWRQYXRoKHBhdGguc3BsaXQoXCJ7XCIpWzBdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBwYXJhbUNhc2UocGF0aCkgPT09IHBhdGg7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgaXNWYWxpZFF1ZXJ5U3RyaW5nKG5hbWU6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gc25ha2VDYXNlKG5hbWUpID09PSBuYW1lO1xuICAgIH1cblxuICAgIHByaXZhdGUgY2hlY2tSZXNvdXJjZUNhc2luZyhub2RlOiBJQ29uc3RydWN0KSB7XG4gICAgICAgIGlmIChub2RlIGluc3RhbmNlb2YgQ2ZuUmVzb3VyY2UpIHtcbiAgICAgICAgICAgIGlmICghU3RhY2tDaGVja2luZ0FzcGVjdC5pc1ZhbGlkUGF0aChub2RlLnBhdGhQYXJ0KSkge1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkQW5ub3RhdGlvbihcbiAgICAgICAgICAgICAgICAgICAgbm9kZSxcbiAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2VUeXBlLnJlc291cmNlUGF0aCxcbiAgICAgICAgICAgICAgICAgICAgXCJQYXRoIHBhcnQgc2hvdWxkIGJlIGluIGtlYmFiLWNhc2VcIlxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIENmbk1ldGhvZCkge1xuICAgICAgICAgICAgY29uc3QgaW50ZWdyYXRpb24gPSBub2RlLmludGVncmF0aW9uIGFzIEludGVncmF0aW9uUHJvcGVydHk7XG5cbiAgICAgICAgICAgIGlmIChpbnRlZ3JhdGlvbiAmJiBpbnRlZ3JhdGlvbi5yZXF1ZXN0UGFyYW1ldGVycykge1xuICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKGludGVncmF0aW9uLnJlcXVlc3RQYXJhbWV0ZXJzKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3BsaXQgPSBrZXkuc3BsaXQoXCIuXCIpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0eXBlID0gc3BsaXRbMl07XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5hbWUgPSBzcGxpdFszXTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlID09PSBcInF1ZXJ5c3RyaW5nXCIgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICFTdGFja0NoZWNraW5nQXNwZWN0LmlzVmFsaWRRdWVyeVN0cmluZyhuYW1lKVxuICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkQW5ub3RhdGlvbihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJRdWVyeXN0cmluZyBzaG91bGQgYmUgaW4gc25ha2VfY2FzZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGNoZWNrUXVldWVFbmNyeXB0aW9uKG5vZGU6IElDb25zdHJ1Y3QpIHtcbiAgICAgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBDZm5RdWV1ZSkge1xuICAgICAgICAgICAgaWYgKCFub2RlLmttc01hc3RlcktleUlkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGRBbm5vdGF0aW9uKFxuICAgICAgICAgICAgICAgICAgICBub2RlLFxuICAgICAgICAgICAgICAgICAgICBSZXNvdXJjZVR5cGUucXVldWVFbmNyeXB0aW9uLFxuICAgICAgICAgICAgICAgICAgICBcIlF1ZXVlIG11c3QgaGF2ZSBlbmNyeXB0aW9uIGVuYWJsZWRcIlxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGNoZWNrTG9nR3JvdXBSZXRlbnRpb24obm9kZTogSUNvbnN0cnVjdCkge1xuICAgICAgICBpZiAobm9kZSBpbnN0YW5jZW9mIExvZ1JldGVudGlvbikge1xuICAgICAgICAgICAgY29uc3QgY2hpbGQgPSBub2RlLm5vZGUuZGVmYXVsdENoaWxkIGFzIHVua25vd24gYXMgUmVjb3JkPFxuICAgICAgICAgICAgICAgIHN0cmluZyxcbiAgICAgICAgICAgICAgICBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XG4gICAgICAgICAgICA+O1xuICAgICAgICAgICAgY29uc3QgcmV0ZW50aW9uID0gY2hpbGQuX2NmblByb3BlcnRpZXMuUmV0ZW50aW9uSW5EYXlzO1xuXG4gICAgICAgICAgICBpZiAoIXJldGVudGlvbikge1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkQW5ub3RhdGlvbihcbiAgICAgICAgICAgICAgICAgICAgbm9kZSxcbiAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2VUeXBlLmxvZ0dyb3VwUmV0ZW50aW9uLFxuICAgICAgICAgICAgICAgICAgICBcIkxvZyBncm91cCBtdXN0IGRlZmluZSBsb2cgZ3JvdXAgcmV0ZW50aW9uXCJcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuIl19
|
package/aws/infra/stack/stack.js
DELETED
@@ -1,60 +0,0 @@
|
|
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
|
-
grantSecret(...lambdas) {
|
56
|
-
lambdas.forEach((l) => this.secret.grantRead(l));
|
57
|
-
}
|
58
|
-
}
|
59
|
-
exports.DigitrafficStack = DigitrafficStack;
|
60
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhY2suanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvYXdzL2luZnJhL3N0YWNrL3N0YWNrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDZDQUF5RDtBQUN6RCxpREFBK0Q7QUFFL0QsaURBQW9EO0FBQ3BELGlEQUFzRDtBQUN0RCx1RUFBaUU7QUFHakUsbUVBQThEO0FBSzlELE1BQU0sUUFBUSxHQUFHLGNBQWMsQ0FBQztBQUNuQixRQUFBLFlBQVksR0FBRyxVQUFVLENBQUM7QUFDdkMsTUFBTSxlQUFlLEdBQUcsYUFBYSxDQUFDO0FBRXpCLFFBQUEscUJBQXFCLEdBQUcsR0FBRyxRQUFRLEdBQUcsZUFBZSxnQkFBZ0IsQ0FBQztBQUN0RSxRQUFBLG1CQUFtQixHQUFHLEdBQUcsUUFBUSxHQUFHLGVBQWUsY0FBYyxDQUFDO0FBMkIvRSxNQUFhLGdCQUFpQixTQUFRLG1CQUFLO0lBU3ZDLFlBQ0ksS0FBZ0IsRUFDaEIsRUFBVSxFQUNWLGFBQWlDO1FBRWpDLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLGFBQWEsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUUzQyxJQUFJLENBQUMsYUFBYSxHQUFHLGFBQWEsQ0FBQztRQUVuQyxJQUFJLGFBQWEsQ0FBQyxRQUFRLEVBQUU7WUFDeEIsSUFBSSxDQUFDLE1BQU0sR0FBRywyQkFBTSxDQUFDLGdCQUFnQixDQUNqQyxJQUFJLEVBQ0osUUFBUSxFQUNSLGFBQWEsQ0FBQyxRQUFRLENBQ3pCLENBQUM7U0FDTDtRQUVELG1FQUFtRTtRQUNuRSxtREFBbUQ7UUFDbkQsSUFBSSxhQUFhLENBQUMsS0FBSyxFQUFFO1lBQ3JCLElBQUksQ0FBQyxHQUFHLEdBQUcsYUFBRyxDQUFDLGlCQUFpQixDQUFDLElBQUksRUFBRSxLQUFLLEVBQUU7Z0JBQzFDLEtBQUssRUFBRSxhQUFhLENBQUMsS0FBSztnQkFDMUIsZ0JBQWdCLEVBQUUsYUFBYSxDQUFDLGdCQUFnQjtnQkFDaEQsaUJBQWlCLEVBQUUsYUFBYSxDQUFDLGlCQUFrQjthQUN0RCxDQUFDLENBQUM7U0FDTjtRQUVELG9EQUFvRDtRQUNwRCxJQUFJLGFBQWEsQ0FBQyxZQUFZLEVBQUU7WUFDNUIsSUFBSSxDQUFDLFVBQVUsR0FBRyx1QkFBYSxDQUFDLG1CQUFtQixDQUMvQyxJQUFJLEVBQ0osWUFBWSxFQUNaLGFBQWEsQ0FBQyxZQUFZLENBQzdCLENBQUM7U0FDTDtRQUVELElBQUksQ0FBQyxVQUFVLEdBQUcsZUFBSyxDQUFDLFlBQVksQ0FDaEMsSUFBSSxFQUNKLFlBQVksRUFDWix5QkFBZSxDQUFDLHVCQUF1QixDQUNuQyxJQUFJLEVBQ0osaUJBQWlCLEVBQ2pCLDJCQUFtQixDQUN0QixDQUFDLFdBQVcsQ0FDaEIsQ0FBQztRQUNGLElBQUksQ0FBQyxZQUFZLEdBQUcsZUFBSyxDQUFDLFlBQVksQ0FDbEMsSUFBSSxFQUNKLGNBQWMsRUFDZCx5QkFBZSxDQUFDLHVCQUF1QixDQUNuQyxJQUFJLEVBQ0osbUJBQW1CLEVBQ25CLDZCQUFxQixDQUN4QixDQUFDLFdBQVcsQ0FDaEIsQ0FBQztRQUVGLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUN0QixDQUFDO0lBRUQsVUFBVTtRQUNOLHFCQUFPLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQywyQ0FBbUIsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUMzRCxDQUFDO0lBRUQsdUJBQXVCO1FBQ25CLE9BQU8sSUFBSSxDQUFDLDhCQUE4QixDQUN0QyxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVUsQ0FDaEMsQ0FBQztJQUNOLENBQUM7SUFFRCw4QkFBOEIsQ0FBQyxhQUFxQjtRQUNoRCxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUTtZQUM5QixDQUFDLENBQUM7Z0JBQ0ksU0FBUyxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUTtnQkFDdEMsY0FBYyxFQUFFLGFBQWE7YUFDaEM7WUFDSCxDQUFDLENBQUM7Z0JBQ0ksY0FBYyxFQUFFLGFBQWE7YUFDaEMsQ0FBQztJQUNaLENBQUM7SUFFRCxXQUFXLENBQUMsR0FBRyxPQUFzQjtRQUNqQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBYyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2xFLENBQUM7Q0FDSjtBQTNGRCw0Q0EyRkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBc3BlY3RzLCBTdGFjaywgU3RhY2tQcm9wcyB9IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuaW1wb3J0IHsgSVZwYywgU2VjdXJpdHlHcm91cCwgVnBjIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1lYzJcIjtcbmltcG9ydCB7IElTZWN1cml0eUdyb3VwIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1lYzIvbGliL3NlY3VyaXR5LWdyb3VwXCI7XG5pbXBvcnQgeyBJVG9waWMsIFRvcGljIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1zbnNcIjtcbmltcG9ydCB7IFN0cmluZ1BhcmFtZXRlciB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3Mtc3NtXCI7XG5pbXBvcnQgeyBJU2VjcmV0LCBTZWNyZXQgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXNlY3JldHNtYW5hZ2VyXCI7XG5pbXBvcnQgeyBGdW5jdGlvbiBhcyBBV1NGdW5jdGlvbiB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtbGFtYmRhXCI7XG5cbmltcG9ydCB7IFN0YWNrQ2hlY2tpbmdBc3BlY3QgfSBmcm9tIFwiLi9zdGFjay1jaGVja2luZy1hc3BlY3RcIjtcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5pbXBvcnQgeyBUcmFmZmljVHlwZSB9IGZyb20gXCIuLi8uLi8uLi90eXBlcy90cmFmZmljdHlwZVwiO1xuaW1wb3J0IHsgREJMYW1iZGFFbnZpcm9ubWVudCB9IGZyb20gXCIuL2xhbWJkYS1jb25maWdzXCI7XG5cbmNvbnN0IFNTTV9ST09UID0gXCIvZGlnaXRyYWZmaWNcIjtcbmV4cG9ydCBjb25zdCBTT0xVVElPTl9LRVkgPSBcIlNvbHV0aW9uXCI7XG5jb25zdCBNT05JVE9SSU5HX1JPT1QgPSBcIi9tb25pdG9yaW5nXCI7XG5cbmV4cG9ydCBjb25zdCBTU01fS0VZX1dBUk5JTkdfVE9QSUMgPSBgJHtTU01fUk9PVH0ke01PTklUT1JJTkdfUk9PVH0vd2FybmluZy10b3BpY2A7XG5leHBvcnQgY29uc3QgU1NNX0tFWV9BTEFSTV9UT1BJQyA9IGAke1NTTV9ST09UfSR7TU9OSVRPUklOR19ST09UfS9hbGFybS10b3BpY2A7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RhY2tDb25maWd1cmF0aW9uIHtcbiAgICByZWFkb25seSBzaG9ydE5hbWU/OiBzdHJpbmc7XG4gICAgcmVhZG9ubHkgc2VjcmV0SWQ/OiBzdHJpbmc7XG4gICAgcmVhZG9ubHkgYWxhcm1Ub3BpY0Fybjogc3RyaW5nO1xuICAgIHJlYWRvbmx5IHdhcm5pbmdUb3BpY0Fybjogc3RyaW5nO1xuICAgIHJlYWRvbmx5IGxvZ3NEZXN0aW5hdGlvbkFybj86IHN0cmluZztcblxuICAgIHJlYWRvbmx5IHZwY0lkPzogc3RyaW5nO1xuICAgIHJlYWRvbmx5IGxhbWJkYURiU2dJZD86IHN0cmluZztcbiAgICByZWFkb25seSBwcml2YXRlU3VibmV0SWRzPzogc3RyaW5nW107XG4gICAgcmVhZG9ubHkgYXZhaWxhYmlsaXR5Wm9uZXM/OiBzdHJpbmdbXTtcblxuICAgIHJlYWRvbmx5IHRyYWZmaWNUeXBlOiBUcmFmZmljVHlwZTtcbiAgICByZWFkb25seSBwcm9kdWN0aW9uOiBib29sZWFuO1xuICAgIHJlYWRvbmx5IHN0YWNrUHJvcHM6IFN0YWNrUHJvcHM7XG5cbiAgICByZWFkb25seSBzdGFja0ZlYXR1cmVzPzoge1xuICAgICAgICByZWFkb25seSBlbmFibGVDYW5hcmllcz86IGJvb2xlYW47XG4gICAgICAgIHJlYWRvbmx5IGVuYWJsZURvY3VtZW50YXRpb24/OiBib29sZWFuO1xuICAgIH07XG5cbiAgICAvLy8gd2hpdGVsaXN0IHJlc291cmNlcyBmb3IgU3RhY2tDaGVja2luZ0FzcGVjdFxuICAgIHJlYWRvbmx5IHdoaXRlbGlzdGVkUmVzb3VyY2VzPzogc3RyaW5nW107XG59XG5cbmV4cG9ydCBjbGFzcyBEaWdpdHJhZmZpY1N0YWNrIGV4dGVuZHMgU3RhY2sge1xuICAgIHJlYWRvbmx5IHZwYzogSVZwYztcbiAgICByZWFkb25seSBsYW1iZGFEYlNnOiBJU2VjdXJpdHlHcm91cDtcbiAgICByZWFkb25seSBhbGFybVRvcGljOiBJVG9waWM7XG4gICAgcmVhZG9ubHkgd2FybmluZ1RvcGljOiBJVG9waWM7XG4gICAgcmVhZG9ubHkgc2VjcmV0OiBJU2VjcmV0O1xuXG4gICAgcmVhZG9ubHkgY29uZmlndXJhdGlvbjogU3RhY2tDb25maWd1cmF0aW9uO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHNjb3BlOiBDb25zdHJ1Y3QsXG4gICAgICAgIGlkOiBzdHJpbmcsXG4gICAgICAgIGNvbmZpZ3VyYXRpb246IFN0YWNrQ29uZmlndXJhdGlvblxuICAgICkge1xuICAgICAgICBzdXBlcihzY29wZSwgaWQsIGNvbmZpZ3VyYXRpb24uc3RhY2tQcm9wcyk7XG5cbiAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uID0gY29uZmlndXJhdGlvbjtcblxuICAgICAgICBpZiAoY29uZmlndXJhdGlvbi5zZWNyZXRJZCkge1xuICAgICAgICAgICAgdGhpcy5zZWNyZXQgPSBTZWNyZXQuZnJvbVNlY3JldE5hbWVWMihcbiAgICAgICAgICAgICAgICB0aGlzLFxuICAgICAgICAgICAgICAgIFwiU2VjcmV0XCIsXG4gICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbi5zZWNyZXRJZFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFZQQyByZWZlcmVuY2UgY29uc3RydWN0aW9uIHJlcXVpcmVzIHZwY0lkIGFuZCBhdmFpbGFiaWxpdHkgem9uZXNcbiAgICAgICAgLy8gcHJpdmF0ZSBzdWJuZXRzIGFyZSB1c2VkIGluIExhbWJkYSBjb25maWd1cmF0aW9uXG4gICAgICAgIGlmIChjb25maWd1cmF0aW9uLnZwY0lkKSB7XG4gICAgICAgICAgICB0aGlzLnZwYyA9IFZwYy5mcm9tVnBjQXR0cmlidXRlcyh0aGlzLCBcInZwY1wiLCB7XG4gICAgICAgICAgICAgICAgdnBjSWQ6IGNvbmZpZ3VyYXRpb24udnBjSWQsXG4gICAgICAgICAgICAgICAgcHJpdmF0ZVN1Ym5ldElkczogY29uZmlndXJhdGlvbi5wcml2YXRlU3VibmV0SWRzLFxuICAgICAgICAgICAgICAgIGF2YWlsYWJpbGl0eVpvbmVzOiBjb25maWd1cmF0aW9uLmF2YWlsYWJpbGl0eVpvbmVzISxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gc2VjdXJpdHkgZ3JvdXAgdGhhdCBhbGxvd3MgTGFtYmRhIGRhdGFiYXNlIGFjY2Vzc1xuICAgICAgICBpZiAoY29uZmlndXJhdGlvbi5sYW1iZGFEYlNnSWQpIHtcbiAgICAgICAgICAgIHRoaXMubGFtYmRhRGJTZyA9IFNlY3VyaXR5R3JvdXAuZnJvbVNlY3VyaXR5R3JvdXBJZChcbiAgICAgICAgICAgICAgICB0aGlzLFxuICAgICAgICAgICAgICAgIFwiTGFtYmRhRGJTR1wiLFxuICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24ubGFtYmRhRGJTZ0lkXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5hbGFybVRvcGljID0gVG9waWMuZnJvbVRvcGljQXJuKFxuICAgICAgICAgICAgdGhpcyxcbiAgICAgICAgICAgIFwiQWxhcm1Ub3BpY1wiLFxuICAgICAgICAgICAgU3RyaW5nUGFyYW1ldGVyLmZyb21TdHJpbmdQYXJhbWV0ZXJOYW1lKFxuICAgICAgICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgICAgICAgXCJBbGFybVRvcGljUGFyYW1cIixcbiAgICAgICAgICAgICAgICBTU01fS0VZX0FMQVJNX1RPUElDXG4gICAgICAgICAgICApLnN0cmluZ1ZhbHVlXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMud2FybmluZ1RvcGljID0gVG9waWMuZnJvbVRvcGljQXJuKFxuICAgICAgICAgICAgdGhpcyxcbiAgICAgICAgICAgIFwiV2FybmluZ1RvcGljXCIsXG4gICAgICAgICAgICBTdHJpbmdQYXJhbWV0ZXIuZnJvbVN0cmluZ1BhcmFtZXRlck5hbWUoXG4gICAgICAgICAgICAgICAgdGhpcyxcbiAgICAgICAgICAgICAgICBcIldhcm5pbmdUb3BpY1BhcmFtXCIsXG4gICAgICAgICAgICAgICAgU1NNX0tFWV9XQVJOSU5HX1RPUElDXG4gICAgICAgICAgICApLnN0cmluZ1ZhbHVlXG4gICAgICAgICk7XG5cbiAgICAgICAgdGhpcy5hZGRBc3BlY3RzKCk7XG4gICAgfVxuXG4gICAgYWRkQXNwZWN0cygpIHtcbiAgICAgICAgQXNwZWN0cy5vZih0aGlzKS5hZGQoU3RhY2tDaGVja2luZ0FzcGVjdC5jcmVhdGUodGhpcykpO1xuICAgIH1cblxuICAgIGNyZWF0ZUxhbWJkYUVudmlyb25tZW50KCk6IERCTGFtYmRhRW52aXJvbm1lbnQge1xuICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVEZWZhdWx0TGFtYmRhRW52aXJvbm1lbnQoXG4gICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24uc2hvcnROYW1lIVxuICAgICAgICApO1xuICAgIH1cblxuICAgIGNyZWF0ZURlZmF1bHRMYW1iZGFFbnZpcm9ubWVudChkYkFwcGxpY2F0aW9uOiBzdHJpbmcpOiBEQkxhbWJkYUVudmlyb25tZW50IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29uZmlndXJhdGlvbi5zZWNyZXRJZFxuICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgICBTRUNSRVRfSUQ6IHRoaXMuY29uZmlndXJhdGlvbi5zZWNyZXRJZCxcbiAgICAgICAgICAgICAgICAgIERCX0FQUExJQ0FUSU9OOiBkYkFwcGxpY2F0aW9uLFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA6IHtcbiAgICAgICAgICAgICAgICAgIERCX0FQUExJQ0FUSU9OOiBkYkFwcGxpY2F0aW9uLFxuICAgICAgICAgICAgICB9O1xuICAgIH1cblxuICAgIGdyYW50U2VjcmV0KC4uLmxhbWJkYXM6IEFXU0Z1bmN0aW9uW10pIHtcbiAgICAgICAgbGFtYmRhcy5mb3JFYWNoKChsOiBBV1NGdW5jdGlvbikgPT4gdGhpcy5zZWNyZXQuZ3JhbnRSZWFkKGwpKTtcbiAgICB9XG59XG4iXX0=
|
@@ -1,41 +0,0 @@
|
|
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
|
-
if (stack.configuration.logsDestinationArn) {
|
29
|
-
lambdas.forEach(lambda => {
|
30
|
-
const filter = new aws_logs_1.CfnSubscriptionFilter(stack, `${lambda.givenName}LogsSubscription`, {
|
31
|
-
logGroupName: `/aws/lambda/${lambda.givenName}`,
|
32
|
-
filterPattern: '',
|
33
|
-
destinationArn: stack.configuration.logsDestinationArn,
|
34
|
-
});
|
35
|
-
filter.node.addDependency(lambda);
|
36
|
-
});
|
37
|
-
}
|
38
|
-
}
|
39
|
-
}
|
40
|
-
exports.DigitrafficLogSubscriptions = DigitrafficLogSubscriptions;
|
41
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3Vic2NyaXB0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2F3cy9pbmZyYS9zdGFjay9zdWJzY3JpcHRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsbURBQTJEO0FBTTNEOzs7Ozs7O0dBT0c7QUFDSCxTQUFnQixrQkFBa0IsQ0FBQyxNQUFnQixFQUFFLFVBQWtCLEVBQUUsaUJBQXFDLEVBQUUsS0FBZ0I7SUFDNUgsSUFBSSxpQkFBaUIsSUFBSSxTQUFTLEVBQUU7UUFDaEMsT0FBTyxTQUFTLENBQUM7S0FDcEI7SUFDRCxNQUFNLE1BQU0sR0FBRyxJQUFJLGdDQUFxQixDQUFDLEtBQUssRUFBRSxHQUFHLFVBQVUsa0JBQWtCLEVBQUU7UUFDN0UsWUFBWSxFQUFFLGVBQWUsVUFBVSxFQUFFO1FBQ3pDLGFBQWEsRUFBRSxFQUFFO1FBQ2pCLGNBQWMsRUFBRSxpQkFBaUI7S0FDcEMsQ0FBQyxDQUFDO0lBRUgsTUFBTSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUM7SUFFbEMsT0FBTyxNQUFNLENBQUM7QUFDbEIsQ0FBQztBQWJELGdEQWFDO0FBRUQsTUFBYSwyQkFBMkI7SUFDcEMsWUFBWSxLQUF1QixFQUFFLEdBQUcsT0FBNEI7UUFDaEUsSUFBSSxLQUFLLENBQUMsYUFBYSxDQUFDLGtCQUFrQixFQUFFO1lBQ3hDLE9BQU8sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUU7Z0JBQ3JCLE1BQU0sTUFBTSxHQUFHLElBQUksZ0NBQXFCLENBQUMsS0FBSyxFQUFFLEdBQUcsTUFBTSxDQUFDLFNBQVMsa0JBQWtCLEVBQUU7b0JBQ25GLFlBQVksRUFBRSxlQUFlLE1BQU0sQ0FBQyxTQUFTLEVBQUU7b0JBQy9DLGFBQWEsRUFBRSxFQUFFO29CQUNqQixjQUFjLEVBQUUsS0FBSyxDQUFDLGFBQWEsQ0FBQyxrQkFBNEI7aUJBQ25FLENBQUMsQ0FBQztnQkFFSCxNQUFNLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUN0QyxDQUFDLENBQUMsQ0FBQztTQUNOO0lBQ0wsQ0FBQztDQUNKO0FBZEQsa0VBY0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0NmblN1YnNjcmlwdGlvbkZpbHRlcn0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWxvZ3MnO1xuaW1wb3J0IHtGdW5jdGlvbn0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWxhbWJkYSc7XG5pbXBvcnQge0RpZ2l0cmFmZmljU3RhY2t9IGZyb20gXCIuL3N0YWNrXCI7XG5pbXBvcnQge0NvbnN0cnVjdH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCB7TW9uaXRvcmVkRnVuY3Rpb259IGZyb20gXCIuL21vbml0b3JlZGZ1bmN0aW9uXCI7XG5cbi8qKlxuICogQ3JlYXRlcyBhIHN1YnNjcmlwdGlvbiBmaWx0ZXIgdGhhdCBzdWJzY3JpYmVzIHRvIGEgTGFtYmRhIExvZyBHcm91cCBhbmQgZGVsaXZlcnMgdGhlIGxvZ3MgdG8gYW5vdGhlciBkZXN0aW5hdGlvbi5cbiAqIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NDbG91ZEZvcm1hdGlvbi9sYXRlc3QvVXNlckd1aWRlL2F3cy1yZXNvdXJjZS1sb2dzLXN1YnNjcmlwdGlvbmZpbHRlci5odG1sXG4gKiBAcGFyYW0gbGFtYmRhIFRoZSBMYW1iZGEgZnVuY3Rpb24sIG5lZWRlZCB0byBjcmVhdGUgYSBkZXBlbmRlbmN5XG4gKiBAcGFyYW0gbGFtYmRhTmFtZSBUaGUgTGFtYmRhIG5hbWUgZnJvbSB3aGljaCB0aGUgTG9nIEdyb3VwIG5hbWUgaXMgZGVyaXZlZFxuICogQHBhcmFtIGxvZ0Rlc3RpbmF0aW9uQXJuIERlc3RpbmF0aW9uIGZvciBzdHJlYW1lZCBsb2dzXG4gKiBAcGFyYW0gc3RhY2sgQ2xvdWRGb3JtYXRpb24gc3RhY2tcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVN1YnNjcmlwdGlvbihsYW1iZGE6IEZ1bmN0aW9uLCBsYW1iZGFOYW1lOiBzdHJpbmcsIGxvZ0Rlc3RpbmF0aW9uQXJuOiBzdHJpbmcgfCB1bmRlZmluZWQsIHN0YWNrOiBDb25zdHJ1Y3QpOiBDZm5TdWJzY3JpcHRpb25GaWx0ZXIgfCB1bmRlZmluZWQge1xuICAgIGlmIChsb2dEZXN0aW5hdGlvbkFybiA9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3QgZmlsdGVyID0gbmV3IENmblN1YnNjcmlwdGlvbkZpbHRlcihzdGFjaywgYCR7bGFtYmRhTmFtZX1Mb2dzU3Vic2NyaXB0aW9uYCwge1xuICAgICAgICBsb2dHcm91cE5hbWU6IGAvYXdzL2xhbWJkYS8ke2xhbWJkYU5hbWV9YCxcbiAgICAgICAgZmlsdGVyUGF0dGVybjogJycsXG4gICAgICAgIGRlc3RpbmF0aW9uQXJuOiBsb2dEZXN0aW5hdGlvbkFybixcbiAgICB9KTtcblxuICAgIGZpbHRlci5ub2RlLmFkZERlcGVuZGVuY3kobGFtYmRhKTtcblxuICAgIHJldHVybiBmaWx0ZXI7XG59XG5cbmV4cG9ydCBjbGFzcyBEaWdpdHJhZmZpY0xvZ1N1YnNjcmlwdGlvbnMge1xuICAgIGNvbnN0cnVjdG9yKHN0YWNrOiBEaWdpdHJhZmZpY1N0YWNrLCAuLi5sYW1iZGFzOiBNb25pdG9yZWRGdW5jdGlvbltdKSB7XG4gICAgICAgIGlmIChzdGFjay5jb25maWd1cmF0aW9uLmxvZ3NEZXN0aW5hdGlvbkFybikge1xuICAgICAgICAgICAgbGFtYmRhcy5mb3JFYWNoKGxhbWJkYSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZmlsdGVyID0gbmV3IENmblN1YnNjcmlwdGlvbkZpbHRlcihzdGFjaywgYCR7bGFtYmRhLmdpdmVuTmFtZX1Mb2dzU3Vic2NyaXB0aW9uYCwge1xuICAgICAgICAgICAgICAgICAgICBsb2dHcm91cE5hbWU6IGAvYXdzL2xhbWJkYS8ke2xhbWJkYS5naXZlbk5hbWV9YCxcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyUGF0dGVybjogJycsXG4gICAgICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uQXJuOiBzdGFjay5jb25maWd1cmF0aW9uLmxvZ3NEZXN0aW5hdGlvbkFybiBhcyBzdHJpbmcsXG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBmaWx0ZXIubm9kZS5hZGREZXBlbmRlbmN5KGxhbWJkYSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiJdfQ==
|
package/aws/infra/usage-plans.js
DELETED
@@ -1,42 +0,0 @@
|
|
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=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNhZ2UtcGxhbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYXdzL2luZnJhL3VzYWdlLXBsYW5zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUVBOzs7Ozs7R0FNRztBQUNILFNBQWdCLGVBQWUsQ0FBQyxHQUFZLEVBQUUsUUFBZ0IsRUFBRSxVQUFrQjtJQUM5RSxNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3ZDLE1BQU0sSUFBSSxHQUFHLEdBQUcsQ0FBQyxZQUFZLENBQUMsVUFBVSxFQUFFO1FBQ3RDLElBQUksRUFBRSxVQUFVO0tBQ25CLENBQUMsQ0FBQztJQUNILElBQUksQ0FBQyxXQUFXLENBQUM7UUFDYixLQUFLLEVBQUUsR0FBRyxDQUFDLGVBQWU7S0FDN0IsQ0FBQyxDQUFDO0lBQ0gsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUV2QixPQUFPLE1BQU0sQ0FBQztBQUNsQixDQUFDO0FBWEQsMENBV0M7QUFFRDs7OztHQUlHO0FBQ0gsU0FBZ0Isc0JBQXNCLENBQUMsR0FBWSxFQUFFLE9BQWU7SUFDaEUsTUFBTSxVQUFVLEdBQUcsT0FBTyxHQUFHLFVBQVUsQ0FBQztJQUN4QyxNQUFNLGFBQWEsR0FBRyxPQUFPLEdBQUcsaUJBQWlCLENBQUM7SUFDbEQsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLFNBQVMsQ0FBQyxVQUFVLEVBQUUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQztJQUNyRSxNQUFNLElBQUksR0FBRyxHQUFHLENBQUMsWUFBWSxDQUFDLGFBQWEsRUFBRTtRQUN6QyxJQUFJLEVBQUUsYUFBYTtLQUN0QixDQUFDLENBQUM7SUFDSCxJQUFJLENBQUMsV0FBVyxDQUFDO1FBQ2IsS0FBSyxFQUFFLEdBQUcsQ0FBQyxlQUFlO0tBQzdCLENBQUMsQ0FBQztJQUNILElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7SUFFdkIsT0FBTyxNQUFNLENBQUM7QUFDbEIsQ0FBQztBQWJELHdEQWFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtJQXBpS2V5LCBSZXN0QXBpfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtYXBpZ2F0ZXdheSc7XG5cbi8qKlxuICogQ3JlYXRlcyBhbiB1c2FnZSBwbGFuIGZvciBhIFJFU1QgQVBJIHdpdGggYSBzaW5nbGUgQVBJIGtleVxuICogQHBhcmFtIGFwaSBUaGUgUkVTVCBBUElcbiAqIEBwYXJhbSBhcGlLZXlJZCBJZCBmb3IgdGhlIEFQSSBrZXksIHRoaXMgaXMgYSBzdXJyb2dhdGUgaWQgZm9yIENESywgbm90IGRpc3BsYXllZCBhbnl3aGVyZVxuICogQHBhcmFtIGFwaUtleU5hbWUgTmFtZSBmb3IgdGhlIEFQSSBrZXksIHRoaXMgaXMgZGlzcGxheWVkIGluIHRoZSBBV1MgQ29uc29sZVxuICogQGRlcHJlY2F0ZWQgQ3JlYXRlcyByYW5kb21pemVkIEFQSSBrZXkgbmFtZXMsIHVzZSBjcmVhdGVEZWZhdWx0VXNhZ2VQbGFuIGluc3RlYWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVVzYWdlUGxhbihhcGk6IFJlc3RBcGksIGFwaUtleUlkOiBzdHJpbmcsIGFwaUtleU5hbWU6IHN0cmluZyk6IElBcGlLZXkge1xuICAgIGNvbnN0IGFwaUtleSA9IGFwaS5hZGRBcGlLZXkoYXBpS2V5SWQpO1xuICAgIGNvbnN0IHBsYW4gPSBhcGkuYWRkVXNhZ2VQbGFuKGFwaUtleU5hbWUsIHtcbiAgICAgICAgbmFtZTogYXBpS2V5TmFtZSxcbiAgICB9KTtcbiAgICBwbGFuLmFkZEFwaVN0YWdlKHtcbiAgICAgICAgc3RhZ2U6IGFwaS5kZXBsb3ltZW50U3RhZ2UsXG4gICAgfSk7XG4gICAgcGxhbi5hZGRBcGlLZXkoYXBpS2V5KTtcblxuICAgIHJldHVybiBhcGlLZXk7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIGRlZmF1bHQgdXNhZ2UgcGxhbiBmb3IgYSBSRVNUIEFQSSB3aXRoIGEgc2luZ2xlIEFQSSBrZXlcbiAqIEBwYXJhbSBhcGkgVGhlIFJFU1QgQVBJXG4gKiBAcGFyYW0gYXBpTmFtZSBOYW1lIG9mIHRoZSBhcGkuIFdpbGwgZ2VuZXJhdGUga2V5OiBhcGlOYW1lICsgJyBBUEkgS2V5JyBhbmQgcGxhbjogYXBpTmFtZSArICcgQVBJIFVzYWdlIFBsYW4nXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVEZWZhdWx0VXNhZ2VQbGFuKGFwaTogUmVzdEFwaSwgYXBpTmFtZTogc3RyaW5nKTogSUFwaUtleSB7XG4gICAgY29uc3QgYXBpS2V5TmFtZSA9IGFwaU5hbWUgKyAnIEFQSSBLZXknO1xuICAgIGNvbnN0IHVzYWdlUGxhbk5hbWUgPSBhcGlOYW1lICsgJyBBUEkgVXNhZ2UgUGxhbic7XG4gICAgY29uc3QgYXBpS2V5ID0gYXBpLmFkZEFwaUtleShhcGlLZXlOYW1lLCB7IGFwaUtleU5hbWU6IGFwaUtleU5hbWUgfSk7XG4gICAgY29uc3QgcGxhbiA9IGFwaS5hZGRVc2FnZVBsYW4odXNhZ2VQbGFuTmFtZSwge1xuICAgICAgICBuYW1lOiB1c2FnZVBsYW5OYW1lLFxuICAgIH0pO1xuICAgIHBsYW4uYWRkQXBpU3RhZ2Uoe1xuICAgICAgICBzdGFnZTogYXBpLmRlcGxveW1lbnRTdGFnZSxcbiAgICB9KTtcbiAgICBwbGFuLmFkZEFwaUtleShhcGlLZXkpO1xuXG4gICAgcmV0dXJuIGFwaUtleTtcbn1cbiJdfQ==
|
package/aws/runtime/apikey.js
DELETED
@@ -1,13 +0,0 @@
|
|
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=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpa2V5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2F3cy9ydW50aW1lL2FwaWtleS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxxQ0FBbUM7QUFFbkMsU0FBZ0IsdUJBQXVCLENBQUMsS0FBYTtJQUNqRCxNQUFNLEdBQUcsR0FBRyxJQUFJLG9CQUFVLEVBQUUsQ0FBQztJQUM3QixPQUFPLEdBQUcsQ0FBQyxTQUFTLENBQUM7UUFDakIsTUFBTSxFQUFFLEtBQUs7UUFDYixZQUFZLEVBQUUsSUFBSTtLQUNyQixDQUFDLENBQUMsT0FBTyxFQUFFLENBQUM7QUFDakIsQ0FBQztBQU5ELDBEQU1DIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtBUElHYXRld2F5fSBmcm9tIFwiYXdzLXNka1wiO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0QXBpS2V5RnJvbUFQSUdhdGV3YXkoa2V5SWQ6IHN0cmluZyk6IFByb21pc2U8QVBJR2F0ZXdheS5UeXBlcy5BcGlLZXk+IHtcbiAgICBjb25zdCBhZ3cgPSBuZXcgQVBJR2F0ZXdheSgpO1xuICAgIHJldHVybiBhZ3cuZ2V0QXBpS2V5KHtcbiAgICAgICAgYXBpS2V5OiBrZXlJZCxcbiAgICAgICAgaW5jbHVkZVZhbHVlOiB0cnVlLFxuICAgIH0pLnByb21pc2UoKTtcbn1cbiJdfQ==
|