@fjall/components-infrastructure 0.86.0 → 0.87.3
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/README.md +3 -3
- package/dist/lib/app.d.ts +166 -6
- package/dist/lib/app.js +212 -20
- package/dist/lib/aspects/resourceInventory.d.ts +4 -4
- package/dist/lib/aspects/resourceInventory.js +3 -3
- package/dist/lib/config/aws/backupGlobalSettings.js +1 -2
- package/dist/lib/config/aws/identityCenter.js +1 -5
- package/dist/lib/config/aws/organisation.js +1 -4
- package/dist/lib/index.d.ts +1 -0
- package/dist/lib/index.js +7 -1
- package/dist/lib/patterns/aws/buildkite.js +3 -2
- package/dist/lib/patterns/aws/cdn.d.ts +164 -0
- package/dist/lib/patterns/aws/cdn.js +264 -0
- package/dist/lib/patterns/aws/compute.d.ts +278 -59
- package/dist/lib/patterns/aws/compute.js +384 -188
- package/dist/lib/patterns/aws/connections.d.ts +46 -0
- package/dist/lib/patterns/aws/connections.js +159 -0
- package/dist/lib/patterns/aws/database.d.ts +124 -11
- package/dist/lib/patterns/aws/database.js +188 -66
- package/dist/lib/patterns/aws/hostedZone.js +1 -1
- package/dist/lib/patterns/aws/index.d.ts +3 -0
- package/dist/lib/patterns/aws/index.js +4 -1
- package/dist/lib/patterns/aws/interfaces/compute.d.ts +121 -0
- package/dist/lib/patterns/aws/interfaces/compute.js +48 -0
- package/dist/lib/patterns/aws/interfaces/connector.d.ts +183 -0
- package/dist/lib/patterns/aws/interfaces/connector.js +117 -0
- package/dist/lib/patterns/aws/interfaces/database.d.ts +136 -0
- package/dist/lib/patterns/aws/interfaces/database.js +65 -0
- package/dist/lib/patterns/aws/interfaces/index.d.ts +12 -0
- package/dist/lib/patterns/aws/interfaces/index.js +49 -0
- package/dist/lib/patterns/aws/interfaces/messaging.d.ts +146 -0
- package/dist/lib/patterns/aws/interfaces/messaging.js +56 -0
- package/dist/lib/patterns/aws/interfaces/pattern.d.ts +403 -0
- package/dist/lib/patterns/aws/interfaces/pattern.js +36 -0
- package/dist/lib/patterns/aws/interfaces/storage.d.ts +136 -0
- package/dist/lib/patterns/aws/interfaces/storage.js +48 -0
- package/dist/lib/patterns/aws/messaging.d.ts +183 -0
- package/dist/lib/patterns/aws/messaging.js +239 -0
- package/dist/lib/patterns/aws/network.js +4 -4
- package/dist/lib/patterns/aws/pattern.d.ts +67 -0
- package/dist/lib/patterns/aws/pattern.js +69 -0
- package/dist/lib/patterns/aws/payload.d.ts +87 -0
- package/dist/lib/patterns/aws/payload.js +526 -0
- package/dist/lib/patterns/aws/storage.d.ts +127 -15
- package/dist/lib/patterns/aws/storage.js +234 -38
- package/dist/lib/resources/aws/backup/backupPlan.js +1 -6
- package/dist/lib/resources/aws/backup/backupVault.js +1 -2
- package/dist/lib/resources/aws/base/awsStack.d.ts +0 -2
- package/dist/lib/resources/aws/base/awsStack.js +1 -7
- package/dist/lib/resources/aws/cdn/cloudFront.d.ts +71 -0
- package/dist/lib/resources/aws/cdn/cloudFront.js +176 -0
- package/dist/lib/resources/aws/cdn/index.d.ts +1 -0
- package/dist/lib/resources/aws/cdn/index.js +18 -0
- package/dist/lib/resources/aws/compute/ec2.d.ts +5 -0
- package/dist/lib/resources/aws/compute/ec2.js +33 -6
- package/dist/lib/resources/aws/compute/ecs.d.ts +32 -25
- package/dist/lib/resources/aws/compute/ecs.js +31 -115
- package/dist/lib/resources/aws/compute/lambda.d.ts +94 -5
- package/dist/lib/resources/aws/compute/lambda.js +209 -32
- package/dist/lib/resources/aws/database/database.js +1 -1
- package/dist/lib/resources/aws/database/dynamodb.d.ts +70 -0
- package/dist/lib/resources/aws/database/dynamodb.js +181 -0
- package/dist/lib/resources/aws/database/index.d.ts +1 -0
- package/dist/lib/resources/aws/database/index.js +2 -1
- package/dist/lib/resources/aws/database/migrationLambda.d.ts +80 -0
- package/dist/lib/resources/aws/database/migrationLambda.js +119 -0
- package/dist/lib/resources/aws/database/rdsAurora.d.ts +15 -0
- package/dist/lib/resources/aws/database/rdsAurora.js +41 -18
- package/dist/lib/resources/aws/database/rdsAuroraGlobal.js +12 -8
- package/dist/lib/resources/aws/database/rdsInstance.js +2 -2
- package/dist/lib/resources/aws/index.d.ts +2 -0
- package/dist/lib/resources/aws/index.js +3 -1
- package/dist/lib/resources/aws/messaging/eventbridge.d.ts +28 -0
- package/dist/lib/resources/aws/messaging/eventbridge.js +53 -0
- package/dist/lib/resources/aws/messaging/index.d.ts +3 -0
- package/dist/lib/resources/aws/messaging/index.js +20 -0
- package/dist/lib/resources/aws/messaging/sns.d.ts +35 -0
- package/dist/lib/resources/aws/messaging/sns.js +70 -0
- package/dist/lib/resources/aws/messaging/sqs.d.ts +105 -0
- package/dist/lib/resources/aws/messaging/sqs.js +231 -0
- package/dist/lib/resources/aws/messaging/utils.d.ts +3 -0
- package/dist/lib/resources/aws/messaging/utils.js +7 -0
- package/dist/lib/resources/aws/networking/ipam.js +1 -2
- package/dist/lib/resources/aws/networking/ipamPool.js +3 -2
- package/dist/lib/resources/aws/networking/vpc.js +1 -2
- package/dist/lib/resources/aws/storage/ecr.js +8 -5
- package/dist/lib/resources/aws/storage/s3.js +1 -2
- package/dist/lib/resources/aws/utilities/awsCustomResource.js +1 -1
- package/dist/lib/resources/aws/utilities/customResource.js +1 -1
- package/dist/lib/utils/getConfig.js +3 -2
- package/dist/lib/utils/index.d.ts +1 -0
- package/dist/lib/utils/index.js +2 -1
- package/dist/lib/utils/manifestWriter.d.ts +174 -0
- package/dist/lib/utils/manifestWriter.js +233 -0
- package/dist/lib/utils/standardTagsAspect.js +1 -8
- package/dist/lib/utils/validationLogger.d.ts +34 -0
- package/dist/lib/utils/validationLogger.js +83 -0
- package/package.json +3 -3
- package/dist/lib/__tests__/setup.d.ts +0 -48
- package/dist/lib/__tests__/setup.js +0 -1
- package/dist/lib/patterns/aws/cicdRole.d.ts +0 -67
- package/dist/lib/patterns/aws/cicdRole.js +0 -68
- package/dist/lib/resources/aws/cicd/cicdRole.d.ts +0 -65
- package/dist/lib/resources/aws/cicd/cicdRole.js +0 -191
- package/dist/lib/resources/aws/compute/ecsFreeTier.d.ts +0 -75
- package/dist/lib/resources/aws/compute/ecsFreeTier.js +0 -1
- package/dist/lib/resources/aws/compute/ecsSpot.d.ts +0 -75
- package/dist/lib/resources/aws/compute/ecsSpot.js +0 -1
- package/dist/lib/resources/aws/compute/utilities/capacityProviderDrainWaiter.d.ts +0 -20
- package/dist/lib/resources/aws/compute/utilities/capacityProviderDrainWaiter.js +0 -1
- package/dist/lib/resources/aws/utilities/cfnOutput.d.ts +0 -5
- package/dist/lib/resources/aws/utilities/cfnOutput.js +0 -1
|
@@ -1,17 +1,57 @@
|
|
|
1
1
|
import { Construct } from "constructs";
|
|
2
|
-
import { type IBucket } from "aws-cdk-lib/aws-s3";
|
|
2
|
+
import { type IBucket, type EventType, type IBucketNotificationDestination, type NotificationKeyFilter } from "aws-cdk-lib/aws-s3";
|
|
3
|
+
import { BucketDeployment } from "aws-cdk-lib/aws-s3-deployment";
|
|
4
|
+
import { type IGrantable, type Grant } from "aws-cdk-lib/aws-iam";
|
|
3
5
|
import type App from "../../app";
|
|
4
|
-
import { type BackupVaultTier } from "../../resources/aws/storage";
|
|
5
|
-
type
|
|
6
|
+
import { S3Bucket, S3WebsiteBucket, S3PublicReadBucket, type BackupVaultTier } from "../../resources/aws/storage";
|
|
7
|
+
import { type StorageType, type IPrivateStorage, type IWebsiteStorage, type IPublicStorage } from "./interfaces/storage.js";
|
|
8
|
+
import { type IStorageConnector } from "./interfaces/connector.js";
|
|
9
|
+
export { type StorageType, type IStorage, type IPrivateStorage, type IWebsiteStorage, type IPublicStorage, type AnyStorage, isPrivateStorage, isWebsiteStorage, isPublicStorage } from "./interfaces/storage.js";
|
|
10
|
+
export type S3BucketType = "private" | "website" | "publicRead";
|
|
11
|
+
export interface StorageTypeConfig {
|
|
12
|
+
supportsPublicRead: boolean;
|
|
13
|
+
supportsWebsiteHosting: boolean;
|
|
14
|
+
defaultPublicAccess: boolean;
|
|
15
|
+
}
|
|
16
|
+
export declare const STORAGE_TYPE_CONFIG: Record<S3BucketType, StorageTypeConfig>;
|
|
17
|
+
export declare function getStorageTypeConfig(type: S3BucketType): StorageTypeConfig;
|
|
6
18
|
type BaseS3Props = {
|
|
7
19
|
backupVaultTier?: BackupVaultTier;
|
|
8
20
|
versioned?: boolean;
|
|
9
21
|
encryption?: "AES256" | "KMS";
|
|
10
22
|
kmsKeyArn?: string;
|
|
11
23
|
};
|
|
24
|
+
/**
|
|
25
|
+
* Configuration for automatic asset deployment to S3.
|
|
26
|
+
* When provided, creates a BucketDeployment that uploads files during CDK deploy.
|
|
27
|
+
*/
|
|
28
|
+
export interface S3DeploymentConfig {
|
|
29
|
+
/** Path to the asset directory (relative to CDK app root) */
|
|
30
|
+
source: string;
|
|
31
|
+
/**
|
|
32
|
+
* Whether to remove files from bucket that aren't in the source.
|
|
33
|
+
* Default: true for static assets, false for caches that grow at runtime.
|
|
34
|
+
*/
|
|
35
|
+
prune?: boolean;
|
|
36
|
+
/**
|
|
37
|
+
* Cache control settings for uploaded files.
|
|
38
|
+
* If not provided, no cache headers are set.
|
|
39
|
+
*/
|
|
40
|
+
cacheControl?: {
|
|
41
|
+
/** Max age in seconds (e.g., 31536000 for 1 year) */
|
|
42
|
+
maxAge?: number;
|
|
43
|
+
/** Mark as immutable (browser won't revalidate) */
|
|
44
|
+
immutable?: boolean;
|
|
45
|
+
};
|
|
46
|
+
}
|
|
12
47
|
export interface PrivateS3Props extends BaseS3Props {
|
|
13
48
|
bucketType: "private";
|
|
14
49
|
publicReadAccess?: boolean;
|
|
50
|
+
/**
|
|
51
|
+
* Optional deployment configuration.
|
|
52
|
+
* When provided, automatically uploads files to the bucket during CDK deploy.
|
|
53
|
+
*/
|
|
54
|
+
deployment?: S3DeploymentConfig;
|
|
15
55
|
}
|
|
16
56
|
export interface WebsiteS3Props extends BaseS3Props {
|
|
17
57
|
bucketType: "website";
|
|
@@ -26,23 +66,95 @@ export interface PublicReadS3Props extends BaseS3Props {
|
|
|
26
66
|
bucketType: "publicRead";
|
|
27
67
|
}
|
|
28
68
|
export type IS3Props = PrivateS3Props | WebsiteS3Props | PublicReadS3Props;
|
|
69
|
+
/**
|
|
70
|
+
* Factory for creating S3 storage resources with type-safe return types.
|
|
71
|
+
*
|
|
72
|
+
* @example
|
|
73
|
+
* // Private bucket
|
|
74
|
+
* const assets = app.addStorage(StorageFactory.build("Assets", { bucketType: "private" }));
|
|
75
|
+
* assets.grantPublicAccess(); // ✓ Available on PrivateStorage
|
|
76
|
+
*
|
|
77
|
+
* // Website bucket
|
|
78
|
+
* const site = app.addStorage(StorageFactory.build("Site", { bucketType: "website" }));
|
|
79
|
+
* site.getWebsiteUrl(); // ✓ Available on WebsiteStorage
|
|
80
|
+
*/
|
|
29
81
|
export declare class StorageFactory {
|
|
30
|
-
|
|
82
|
+
/** Build a private storage bucket */
|
|
83
|
+
static build(id: string, props: PrivateS3Props): (app: App, scope: Construct) => PrivateStorage;
|
|
84
|
+
/** Build a website storage bucket */
|
|
85
|
+
static build(id: string, props: WebsiteS3Props): (app: App, scope: Construct) => WebsiteStorage;
|
|
86
|
+
/** Build a public read storage bucket */
|
|
87
|
+
static build(id: string, props: PublicReadS3Props): (app: App, scope: Construct) => PublicStorage;
|
|
31
88
|
}
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
89
|
+
/**
|
|
90
|
+
* Base S3 storage class.
|
|
91
|
+
* Specific storage types (PrivateStorage, WebsiteStorage, PublicStorage) extend this.
|
|
92
|
+
*/
|
|
93
|
+
declare abstract class S3StorageBase extends Construct implements IStorageConnector {
|
|
94
|
+
readonly id: string;
|
|
95
|
+
readonly scope: Construct;
|
|
96
|
+
/** The type of storage resource. Used for runtime type narrowing. */
|
|
97
|
+
abstract readonly storageType: StorageType;
|
|
98
|
+
/** The connector type for unified connection processing. */
|
|
99
|
+
readonly connectorType: "storage";
|
|
100
|
+
protected bucket: S3Bucket | S3WebsiteBucket | S3PublicReadBucket;
|
|
101
|
+
protected _bucketType: S3BucketType;
|
|
37
102
|
constructor(scope: Construct, id: string, props: IS3Props);
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
private addOutputs;
|
|
103
|
+
protected initialisePrivateBucket(props: PrivateS3Props): void;
|
|
104
|
+
protected initialiseWebsiteBucket(props: WebsiteS3Props): void;
|
|
105
|
+
protected initialisePublicReadBucket(props: PublicReadS3Props): void;
|
|
106
|
+
protected addOutputs(): void;
|
|
43
107
|
getBucket(): IBucket;
|
|
44
108
|
getBucketName(): string;
|
|
45
109
|
getBucketArn(): string;
|
|
46
110
|
getBucketType(): S3BucketType;
|
|
111
|
+
getBucketDomainName(): string;
|
|
112
|
+
getBucketRegionalDomainName(): string;
|
|
113
|
+
getS3Bucket(): S3Bucket | S3WebsiteBucket | S3PublicReadBucket;
|
|
114
|
+
grantRead(grantee: IGrantable): Grant;
|
|
115
|
+
grantWrite(grantee: IGrantable): Grant;
|
|
116
|
+
grantReadWrite(grantee: IGrantable): Grant;
|
|
117
|
+
grantDelete(grantee: IGrantable): Grant;
|
|
118
|
+
grantPut(grantee: IGrantable): Grant;
|
|
119
|
+
addEventNotification(event: EventType, dest: IBucketNotificationDestination, ...filters: NotificationKeyFilter[]): void;
|
|
120
|
+
addObjectCreatedNotification(dest: IBucketNotificationDestination, ...filters: NotificationKeyFilter[]): void;
|
|
121
|
+
addObjectRemovedNotification(dest: IBucketNotificationDestination, ...filters: NotificationKeyFilter[]): void;
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Private S3 storage.
|
|
125
|
+
* Standard bucket with optional encryption and versioning.
|
|
126
|
+
*/
|
|
127
|
+
export declare class PrivateStorage extends S3StorageBase implements IPrivateStorage {
|
|
128
|
+
readonly storageType: "private";
|
|
129
|
+
private _deployment?;
|
|
130
|
+
constructor(scope: Construct, id: string, props: PrivateS3Props);
|
|
131
|
+
private createDeployment;
|
|
132
|
+
/**
|
|
133
|
+
* Grant public access to objects under a prefix.
|
|
134
|
+
* Use with caution - makes objects publicly readable.
|
|
135
|
+
*/
|
|
136
|
+
grantPublicAccess(...keyPrefix: string[]): Grant;
|
|
137
|
+
/**
|
|
138
|
+
* Get the BucketDeployment construct if one was created.
|
|
139
|
+
* Returns undefined if no deployment was configured.
|
|
140
|
+
*/
|
|
141
|
+
getDeployment(): BucketDeployment | undefined;
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Website S3 storage.
|
|
145
|
+
* Bucket configured for static website hosting.
|
|
146
|
+
*/
|
|
147
|
+
export declare class WebsiteStorage extends S3StorageBase implements IWebsiteStorage {
|
|
148
|
+
readonly storageType: "website";
|
|
149
|
+
constructor(scope: Construct, id: string, props: WebsiteS3Props);
|
|
150
|
+
/** Get the website URL. */
|
|
151
|
+
getWebsiteUrl(): string;
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Public read S3 storage.
|
|
155
|
+
* Bucket with public read access enabled.
|
|
156
|
+
*/
|
|
157
|
+
export declare class PublicStorage extends S3StorageBase implements IPublicStorage {
|
|
158
|
+
readonly storageType: "publicRead";
|
|
159
|
+
constructor(scope: Construct, id: string, props: PublicReadS3Props);
|
|
47
160
|
}
|
|
48
|
-
export {};
|
|
@@ -1,83 +1,173 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.PublicStorage = exports.WebsiteStorage = exports.PrivateStorage = exports.StorageFactory = exports.STORAGE_TYPE_CONFIG = exports.isPublicStorage = exports.isWebsiteStorage = exports.isPrivateStorage = void 0;
|
|
4
|
+
exports.getStorageTypeConfig = getStorageTypeConfig;
|
|
4
5
|
const constructs_1 = require("constructs");
|
|
6
|
+
const aws_s3_1 = require("aws-cdk-lib/aws-s3");
|
|
7
|
+
const aws_s3_deployment_1 = require("aws-cdk-lib/aws-s3-deployment");
|
|
8
|
+
const aws_kms_1 = require("aws-cdk-lib/aws-kms");
|
|
5
9
|
const aws_cdk_lib_1 = require("aws-cdk-lib");
|
|
6
10
|
const storage_1 = require("../../resources/aws/storage");
|
|
11
|
+
const validationLogger_js_1 = require("../../utils/validationLogger.js");
|
|
12
|
+
// Re-export interfaces and type guards
|
|
13
|
+
var storage_js_1 = require("./interfaces/storage.js");
|
|
14
|
+
Object.defineProperty(exports, "isPrivateStorage", { enumerable: true, get: function () { return storage_js_1.isPrivateStorage; } });
|
|
15
|
+
Object.defineProperty(exports, "isWebsiteStorage", { enumerable: true, get: function () { return storage_js_1.isWebsiteStorage; } });
|
|
16
|
+
Object.defineProperty(exports, "isPublicStorage", { enumerable: true, get: function () { return storage_js_1.isPublicStorage; } });
|
|
17
|
+
function toBucketEncryption(encryption) {
|
|
18
|
+
if (!encryption)
|
|
19
|
+
return undefined;
|
|
20
|
+
return encryption === "AES256"
|
|
21
|
+
? aws_s3_1.BucketEncryption.S3_MANAGED
|
|
22
|
+
: aws_s3_1.BucketEncryption.KMS;
|
|
23
|
+
}
|
|
24
|
+
function toHttpMethod(method) {
|
|
25
|
+
const methodMap = {
|
|
26
|
+
GET: aws_s3_1.HttpMethods.GET,
|
|
27
|
+
PUT: aws_s3_1.HttpMethods.PUT,
|
|
28
|
+
POST: aws_s3_1.HttpMethods.POST,
|
|
29
|
+
DELETE: aws_s3_1.HttpMethods.DELETE,
|
|
30
|
+
HEAD: aws_s3_1.HttpMethods.HEAD
|
|
31
|
+
};
|
|
32
|
+
return methodMap[method] ?? aws_s3_1.HttpMethods.GET;
|
|
33
|
+
}
|
|
34
|
+
function toCorsRules(cors) {
|
|
35
|
+
if (!cors)
|
|
36
|
+
return undefined;
|
|
37
|
+
return cors.map((rule) => ({
|
|
38
|
+
allowedOrigins: rule.allowedOrigins,
|
|
39
|
+
allowedMethods: rule.allowedMethods.map(toHttpMethod)
|
|
40
|
+
}));
|
|
41
|
+
}
|
|
42
|
+
exports.STORAGE_TYPE_CONFIG = {
|
|
43
|
+
private: {
|
|
44
|
+
supportsPublicRead: true,
|
|
45
|
+
supportsWebsiteHosting: false,
|
|
46
|
+
defaultPublicAccess: false
|
|
47
|
+
},
|
|
48
|
+
website: {
|
|
49
|
+
supportsPublicRead: true,
|
|
50
|
+
supportsWebsiteHosting: true,
|
|
51
|
+
defaultPublicAccess: true
|
|
52
|
+
},
|
|
53
|
+
publicRead: {
|
|
54
|
+
supportsPublicRead: true,
|
|
55
|
+
supportsWebsiteHosting: false,
|
|
56
|
+
defaultPublicAccess: true
|
|
57
|
+
}
|
|
58
|
+
};
|
|
59
|
+
function getStorageTypeConfig(type) {
|
|
60
|
+
return exports.STORAGE_TYPE_CONFIG[type];
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Validates storage props and logs warnings for ignored or misconfigured options.
|
|
64
|
+
* These checks help catch issues when props come from dynamic sources where
|
|
65
|
+
* TypeScript's compile-time checks may not apply.
|
|
66
|
+
*/
|
|
67
|
+
function validateStorageProps(props) {
|
|
68
|
+
// Validate encryption: KMS requires kmsKeyArn
|
|
69
|
+
if (props.encryption === "KMS" && !props.kmsKeyArn) {
|
|
70
|
+
validationLogger_js_1.FjallLogger.warn("'encryption' is set to 'KMS' but 'kmsKeyArn' is not provided. " +
|
|
71
|
+
"The bucket will use the default AWS managed key.");
|
|
72
|
+
}
|
|
73
|
+
// Warn about kmsKeyArn when encryption is not KMS
|
|
74
|
+
if (props.kmsKeyArn && props.encryption !== "KMS") {
|
|
75
|
+
validationLogger_js_1.FjallLogger.warn("'kmsKeyArn' is provided but 'encryption' is not set to 'KMS'. " +
|
|
76
|
+
"The KMS key will be ignored. Set encryption: 'KMS' to use the key.");
|
|
77
|
+
}
|
|
78
|
+
// Website-only options on non-website buckets
|
|
79
|
+
// Note: Using bucketType as discriminator with "type" alias for the helper
|
|
80
|
+
const propsWithType = { ...props, type: props.bucketType };
|
|
81
|
+
(0, validationLogger_js_1.warnIfPropertiesIgnored)(propsWithType, ["websiteIndexDocument", "websiteErrorDocument", "cors"], "website", "website bucket");
|
|
82
|
+
// Private-only options on non-private buckets
|
|
83
|
+
(0, validationLogger_js_1.warnIfPropertiesIgnored)(propsWithType, ["publicReadAccess"], "private", "private bucket");
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Factory for creating S3 storage resources with type-safe return types.
|
|
87
|
+
*
|
|
88
|
+
* @example
|
|
89
|
+
* // Private bucket
|
|
90
|
+
* const assets = app.addStorage(StorageFactory.build("Assets", { bucketType: "private" }));
|
|
91
|
+
* assets.grantPublicAccess(); // ✓ Available on PrivateStorage
|
|
92
|
+
*
|
|
93
|
+
* // Website bucket
|
|
94
|
+
* const site = app.addStorage(StorageFactory.build("Site", { bucketType: "website" }));
|
|
95
|
+
* site.getWebsiteUrl(); // ✓ Available on WebsiteStorage
|
|
96
|
+
*/
|
|
7
97
|
class StorageFactory {
|
|
98
|
+
/** Implementation - returns appropriate storage type based on props */
|
|
8
99
|
static build(id, props) {
|
|
9
|
-
return (
|
|
10
|
-
|
|
100
|
+
return (_app, scope) => {
|
|
101
|
+
validateStorageProps(props);
|
|
102
|
+
switch (props.bucketType) {
|
|
103
|
+
case "private":
|
|
104
|
+
return new PrivateStorage(scope, id, props);
|
|
105
|
+
case "website":
|
|
106
|
+
return new WebsiteStorage(scope, id, props);
|
|
107
|
+
case "publicRead":
|
|
108
|
+
return new PublicStorage(scope, id, props);
|
|
109
|
+
default: {
|
|
110
|
+
const _exhaustive = props;
|
|
111
|
+
throw new Error(`Unsupported bucket type: ${_exhaustive.bucketType}`);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
11
114
|
};
|
|
12
115
|
}
|
|
13
116
|
}
|
|
14
117
|
exports.StorageFactory = StorageFactory;
|
|
15
|
-
|
|
118
|
+
/**
|
|
119
|
+
* Base S3 storage class.
|
|
120
|
+
* Specific storage types (PrivateStorage, WebsiteStorage, PublicStorage) extend this.
|
|
121
|
+
*/
|
|
122
|
+
class S3StorageBase extends constructs_1.Construct {
|
|
16
123
|
constructor(scope, id, props) {
|
|
17
124
|
super(scope, id);
|
|
125
|
+
/** The connector type for unified connection processing. */
|
|
126
|
+
this.connectorType = "storage";
|
|
18
127
|
this.id = id;
|
|
19
128
|
this.scope = scope;
|
|
20
|
-
this.
|
|
21
|
-
this.addS3Bucket(props);
|
|
22
|
-
}
|
|
23
|
-
addS3Bucket(props) {
|
|
24
|
-
switch (props.bucketType) {
|
|
25
|
-
case "private":
|
|
26
|
-
this.addPrivateBucket(props);
|
|
27
|
-
break;
|
|
28
|
-
case "website":
|
|
29
|
-
this.addWebsiteBucket(props);
|
|
30
|
-
break;
|
|
31
|
-
case "publicRead":
|
|
32
|
-
this.addPublicReadBucket(props);
|
|
33
|
-
break;
|
|
34
|
-
default: {
|
|
35
|
-
// Exhaustiveness check
|
|
36
|
-
const _exhaustive = props;
|
|
37
|
-
throw new Error(`Unsupported S3 bucket type ${props.bucketType}`);
|
|
38
|
-
}
|
|
39
|
-
}
|
|
129
|
+
this._bucketType = props.bucketType;
|
|
40
130
|
}
|
|
41
|
-
|
|
131
|
+
initialisePrivateBucket(props) {
|
|
132
|
+
const encryptionKey = props.kmsKeyArn
|
|
133
|
+
? aws_kms_1.Key.fromKeyArn(this, `${this.id}KmsKey`, props.kmsKeyArn)
|
|
134
|
+
: undefined;
|
|
42
135
|
this.bucket = new storage_1.S3Bucket(this, `${this.id}Bucket`, {
|
|
43
136
|
backupVaultTier: props.backupVaultTier,
|
|
44
137
|
versioned: props.versioned,
|
|
45
|
-
encryption: props.encryption,
|
|
46
|
-
encryptionKey
|
|
138
|
+
encryption: toBucketEncryption(props.encryption),
|
|
139
|
+
encryptionKey,
|
|
47
140
|
publicReadAccess: props.publicReadAccess
|
|
48
141
|
});
|
|
49
142
|
this.addOutputs();
|
|
50
143
|
}
|
|
51
|
-
|
|
144
|
+
initialiseWebsiteBucket(props) {
|
|
52
145
|
this.bucket = new storage_1.S3WebsiteBucket(this, `${this.id}Bucket`, {
|
|
53
146
|
backupVaultTier: props.backupVaultTier,
|
|
54
147
|
versioned: props.versioned,
|
|
55
|
-
encryption: props.encryption,
|
|
148
|
+
encryption: toBucketEncryption(props.encryption),
|
|
56
149
|
websiteIndexDocument: props.websiteIndexDocument,
|
|
57
150
|
websiteErrorDocument: props.websiteErrorDocument,
|
|
58
|
-
cors: props.cors
|
|
151
|
+
cors: toCorsRules(props.cors)
|
|
59
152
|
});
|
|
60
153
|
this.addOutputs();
|
|
61
154
|
}
|
|
62
|
-
|
|
155
|
+
initialisePublicReadBucket(props) {
|
|
63
156
|
this.bucket = new storage_1.S3PublicReadBucket(this, `${this.id}Bucket`, {
|
|
64
157
|
backupVaultTier: props.backupVaultTier,
|
|
65
158
|
versioned: props.versioned,
|
|
66
|
-
encryption: props.encryption
|
|
159
|
+
encryption: toBucketEncryption(props.encryption)
|
|
67
160
|
});
|
|
68
161
|
this.addOutputs();
|
|
69
162
|
}
|
|
70
163
|
addOutputs() {
|
|
71
164
|
const stackName = aws_cdk_lib_1.Stack.of(this).stackName;
|
|
72
|
-
// Export bucket ARN for monitoring
|
|
73
|
-
// Use stack name prefix to ensure uniqueness across apps in same region
|
|
74
165
|
new aws_cdk_lib_1.CfnOutput(this, `${this.id}BucketArn`, {
|
|
75
166
|
key: `${stackName}${this.id}BucketArn`,
|
|
76
167
|
exportName: `${stackName}${this.id}BucketArn`,
|
|
77
168
|
value: this.bucket.bucketArn,
|
|
78
169
|
description: `S3 Bucket ARN for ${this.id}`
|
|
79
170
|
});
|
|
80
|
-
// Export bucket name for convenience
|
|
81
171
|
new aws_cdk_lib_1.CfnOutput(this, `${this.id}BucketName`, {
|
|
82
172
|
key: `${stackName}${this.id}BucketName`,
|
|
83
173
|
exportName: `${stackName}${this.id}BucketName`,
|
|
@@ -95,8 +185,114 @@ class S3Storage extends constructs_1.Construct {
|
|
|
95
185
|
return this.bucket.bucketArn;
|
|
96
186
|
}
|
|
97
187
|
getBucketType() {
|
|
98
|
-
return this.
|
|
188
|
+
return this._bucketType;
|
|
189
|
+
}
|
|
190
|
+
getBucketDomainName() {
|
|
191
|
+
return this.bucket.bucketDomainName;
|
|
192
|
+
}
|
|
193
|
+
getBucketRegionalDomainName() {
|
|
194
|
+
return this.bucket.bucketRegionalDomainName;
|
|
195
|
+
}
|
|
196
|
+
getS3Bucket() {
|
|
197
|
+
return this.bucket;
|
|
198
|
+
}
|
|
199
|
+
grantRead(grantee) {
|
|
200
|
+
return this.bucket.grantRead(grantee);
|
|
201
|
+
}
|
|
202
|
+
grantWrite(grantee) {
|
|
203
|
+
return this.bucket.grantWrite(grantee);
|
|
204
|
+
}
|
|
205
|
+
grantReadWrite(grantee) {
|
|
206
|
+
return this.bucket.grantReadWrite(grantee);
|
|
207
|
+
}
|
|
208
|
+
grantDelete(grantee) {
|
|
209
|
+
return this.bucket.grantDelete(grantee);
|
|
210
|
+
}
|
|
211
|
+
grantPut(grantee) {
|
|
212
|
+
return this.bucket.grantPut(grantee);
|
|
213
|
+
}
|
|
214
|
+
addEventNotification(event, dest, ...filters) {
|
|
215
|
+
this.bucket.addEventNotification(event, dest, ...filters);
|
|
216
|
+
}
|
|
217
|
+
addObjectCreatedNotification(dest, ...filters) {
|
|
218
|
+
this.bucket.addObjectCreatedNotification(dest, ...filters);
|
|
219
|
+
}
|
|
220
|
+
addObjectRemovedNotification(dest, ...filters) {
|
|
221
|
+
this.bucket.addObjectRemovedNotification(dest, ...filters);
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Private S3 storage.
|
|
226
|
+
* Standard bucket with optional encryption and versioning.
|
|
227
|
+
*/
|
|
228
|
+
class PrivateStorage extends S3StorageBase {
|
|
229
|
+
constructor(scope, id, props) {
|
|
230
|
+
super(scope, id, props);
|
|
231
|
+
this.storageType = "private";
|
|
232
|
+
this.initialisePrivateBucket(props);
|
|
233
|
+
if (props.deployment) {
|
|
234
|
+
this._deployment = this.createDeployment(id, props.deployment);
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
createDeployment(id, config) {
|
|
238
|
+
const cacheControlHeaders = [];
|
|
239
|
+
if (config.cacheControl?.maxAge !== undefined) {
|
|
240
|
+
cacheControlHeaders.push(aws_s3_deployment_1.CacheControl.maxAge(aws_cdk_lib_1.Duration.seconds(config.cacheControl.maxAge)));
|
|
241
|
+
}
|
|
242
|
+
if (config.cacheControl?.immutable) {
|
|
243
|
+
cacheControlHeaders.push(aws_s3_deployment_1.CacheControl.immutable());
|
|
244
|
+
}
|
|
245
|
+
return new aws_s3_deployment_1.BucketDeployment(this, `${id}Deployment`, {
|
|
246
|
+
sources: [aws_s3_deployment_1.Source.asset(config.source)],
|
|
247
|
+
destinationBucket: this.bucket,
|
|
248
|
+
prune: config.prune ?? true,
|
|
249
|
+
...(cacheControlHeaders.length > 0 && {
|
|
250
|
+
cacheControl: cacheControlHeaders
|
|
251
|
+
})
|
|
252
|
+
});
|
|
253
|
+
}
|
|
254
|
+
/**
|
|
255
|
+
* Grant public access to objects under a prefix.
|
|
256
|
+
* Use with caution - makes objects publicly readable.
|
|
257
|
+
*/
|
|
258
|
+
grantPublicAccess(...keyPrefix) {
|
|
259
|
+
return this.bucket.grantPublicAccess(...keyPrefix);
|
|
260
|
+
}
|
|
261
|
+
/**
|
|
262
|
+
* Get the BucketDeployment construct if one was created.
|
|
263
|
+
* Returns undefined if no deployment was configured.
|
|
264
|
+
*/
|
|
265
|
+
getDeployment() {
|
|
266
|
+
return this._deployment;
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
exports.PrivateStorage = PrivateStorage;
|
|
270
|
+
/**
|
|
271
|
+
* Website S3 storage.
|
|
272
|
+
* Bucket configured for static website hosting.
|
|
273
|
+
*/
|
|
274
|
+
class WebsiteStorage extends S3StorageBase {
|
|
275
|
+
constructor(scope, id, props) {
|
|
276
|
+
super(scope, id, props);
|
|
277
|
+
this.storageType = "website";
|
|
278
|
+
this.initialiseWebsiteBucket(props);
|
|
279
|
+
}
|
|
280
|
+
/** Get the website URL. */
|
|
281
|
+
getWebsiteUrl() {
|
|
282
|
+
return this.bucket.bucketWebsiteUrl ?? "";
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
exports.WebsiteStorage = WebsiteStorage;
|
|
286
|
+
/**
|
|
287
|
+
* Public read S3 storage.
|
|
288
|
+
* Bucket with public read access enabled.
|
|
289
|
+
*/
|
|
290
|
+
class PublicStorage extends S3StorageBase {
|
|
291
|
+
constructor(scope, id, props) {
|
|
292
|
+
super(scope, id, props);
|
|
293
|
+
this.storageType = "publicRead";
|
|
294
|
+
this.initialisePublicReadBucket(props);
|
|
99
295
|
}
|
|
100
296
|
}
|
|
101
|
-
exports.
|
|
102
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmFnZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYi9wYXR0ZXJucy9hd3Mvc3RvcmFnZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSwyQ0FBdUM7QUFFdkMsNkNBQStDO0FBRy9DLHlEQUtxQztBQWdDckMsTUFBYSxjQUFjO0lBQ3pCLE1BQU0sQ0FBQyxLQUFLLENBQXFCLEVBQVUsRUFBRSxLQUFRO1FBQ25ELE9BQU8sQ0FBQyxHQUFRLEVBQUUsS0FBZ0IsRUFBRSxFQUFFO1lBQ3BDLE9BQU8sSUFBSSxTQUFTLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUN6QyxDQUFDLENBQUM7SUFDSixDQUFDO0NBQ0Y7QUFORCx3Q0FNQztBQUVELE1BQWEsU0FBVSxTQUFRLHNCQUFTO0lBT3RDLFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBZTtRQUN2RCxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ2pCLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDO1FBQ2IsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDbkIsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUMsVUFBVSxDQUFDO1FBRW5DLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDMUIsQ0FBQztJQUVELFdBQVcsQ0FBQyxLQUFlO1FBQ3pCLFFBQVEsS0FBSyxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ3pCLEtBQUssU0FBUztnQkFDWixJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQzdCLE1BQU07WUFDUixLQUFLLFNBQVM7Z0JBQ1osSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUM3QixNQUFNO1lBQ1IsS0FBSyxZQUFZO2dCQUNmLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztn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QyxDQUFDO0lBQ0wsQ0FBQztJQUVELFNBQVM7UUFDUCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUM7SUFDckIsQ0FBQztJQUVELGFBQWE7UUFDWCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDO0lBQ2hDLENBQUM7SUFFRCxZQUFZO1FBQ1YsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQztJQUMvQixDQUFDO0lBRUQsYUFBYTtRQUNYLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQztJQUN6QixDQUFDO0NBQ0Y7QUF6R0QsOEJBeUdDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCB7IHR5cGUgSUJ1Y2tldCB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtczNcIjtcbmltcG9ydCB7IENmbk91dHB1dCwgU3RhY2sgfSBmcm9tIFwiYXdzLWNkay1saWJcIjtcblxuaW1wb3J0IHR5cGUgQXBwIGZyb20gXCIuLi8uLi9hcHBcIjtcbmltcG9ydCB7XG4gIFMzQnVja2V0LFxuICBTM1dlYnNpdGVCdWNrZXQsXG4gIFMzUHVibGljUmVhZEJ1Y2tldCxcbiAgdHlwZSBCYWNrdXBWYXVsdFRpZXJcbn0gZnJvbSBcIi4uLy4uL3Jlc291cmNlcy9hd3Mvc3RvcmFnZVwiO1xuXG50eXBlIFMzQnVja2V0VHlwZSA9IFwicHJpdmF0ZVwiIHwgXCJ3ZWJzaXRlXCIgfCBcInB1YmxpY1JlYWRcIjtcblxudHlwZSBCYXNlUzNQcm9wcyA9IHtcbiAgYmFja3VwVmF1bHRUaWVyPzogQmFja3VwVmF1bHRUaWVyO1xuICB2ZXJzaW9uZWQ/OiBib29sZWFuO1xuICBlbmNyeXB0aW9uPzogXCJBRVMyNTZcIiB8IFwiS01TXCI7XG4gIGttc0tleUFybj86IHN0cmluZztcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHJpdmF0ZVMzUHJvcHMgZXh0ZW5kcyBCYXNlUzNQcm9wcyB7XG4gIGJ1Y2tldFR5cGU6IFwicHJpdmF0ZVwiO1xuICBwdWJsaWNSZWFkQWNjZXNzPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBXZWJzaXRlUzNQcm9wcyBleHRlbmRzIEJhc2VTM1Byb3BzIHtcbiAgYnVja2V0VHlwZTogXCJ3ZWJzaXRlXCI7XG4gIHdlYnNpdGVJbmRleERvY3VtZW50Pzogc3RyaW5nO1xuICB3ZWJzaXRlRXJyb3JEb2N1bWVudD86IHN0cmluZztcbiAgY29ycz86IEFycmF5PHtcbiAgICBhbGxvd2VkT3JpZ2luczogc3RyaW5nW107XG4gICAgYWxsb3dlZE1ldGhvZHM6IHN0cmluZ1tdO1xuICB9Pjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQdWJsaWNSZWFkUzNQcm9wcyBleHRlbmRzIEJhc2VTM1Byb3BzIHtcbiAgYnVja2V0VHlwZTogXCJwdWJsaWNSZWFkXCI7XG59XG5cbmV4cG9ydCB0eXBlIElTM1Byb3BzID0gUHJpdmF0ZVMzUHJvcHMgfCBXZWJzaXRlUzNQcm9wcyB8IFB1YmxpY1JlYWRTM1Byb3BzO1xuXG5leHBvcnQgY2xhc3MgU3RvcmFnZUZhY3Rvcnkge1xuICBzdGF0aWMgYnVpbGQ8VCBleHRlbmRzIElTM1Byb3BzPihpZDogc3RyaW5nLCBwcm9wczogVCkge1xuICAgIHJldHVybiAoYXBwOiBBcHAsIHNjb3BlOiBDb25zdHJ1Y3QpID0+IHtcbiAgICAgIHJldHVybiBuZXcgUzNTdG9yYWdlKHNjb3BlLCBpZCwgcHJvcHMpO1xuICAgIH07XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFMzU3RvcmFnZSBleHRlbmRzIENvbnN0cnVjdCB7XG4gIHB1YmxpYyBpZDogc3RyaW5nO1xuICBwdWJsaWMgc2NvcGU6IENvbnN0cnVjdDtcblxuICBwcml2YXRlIGJ1Y2tldDogUzNCdWNrZXQgfCBTM1dlYnNpdGVCdWNrZXQgfCBTM1B1YmxpY1JlYWRCdWNrZXQ7XG4gIHByaXZhdGUgYnVja2V0VHlwZTogUzNCdWNrZXRUeXBlO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBJUzNQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG4gICAgdGhpcy5pZCA9IGlkO1xuICAgIHRoaXMuc2NvcGUgPSBzY29wZTtcbiAgICB0aGlzLmJ1Y2tldFR5cGUgPSBwcm9wcy5idWNrZXRUeXBlO1xuXG4gICAgdGhpcy5hZGRTM0J1Y2tldChwcm9wcyk7XG4gIH1cblxuICBhZGRTM0J1Y2tldChwcm9wczogSVMzUHJvcHMpIHtcbiAgICBzd2l0Y2ggKHByb3BzLmJ1Y2tldFR5cGUpIHtcbiAgICAgIGNhc2UgXCJwcml2YXRlXCI6XG4gICAgICAgIHRoaXMuYWRkUHJpdmF0ZUJ1Y2tldChwcm9wcyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcIndlYnNpdGVcIjpcbiAgICAgICAgdGhpcy5hZGRXZWJzaXRlQnVja2V0KHByb3BzKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFwicHVibGljUmVhZFwiOlxuICAgICAgICB0aGlzLmFkZFB1YmxpY1JlYWRCdWNrZXQocHJvcHMpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgLy8gRXhoYXVzdGl2ZW5lc3MgY2hlY2tcbiAgICAgICAgY29uc3QgX2V4aGF1c3RpdmU6IG5ldmVyID0gcHJvcHM7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgVW5zdXBwb3J0ZWQgUzMgYnVja2V0IHR5cGUgJHsocHJvcHMgYXMgYW55KS5idWNrZXRUeXBlfWBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFkZFByaXZhdGVCdWNrZXQocHJvcHM6IFByaXZhdGVTM1Byb3BzKSB7XG4gICAgdGhpcy5idWNrZXQgPSBuZXcgUzNCdWNrZXQodGhpcywgYCR7dGhpcy5pZH1CdWNrZXRgLCB7XG4gICAgICBiYWNrdXBWYXVsdFRpZXI6IHByb3BzLmJhY2t1cFZhdWx0VGllcixcbiAgICAgIHZlcnNpb25lZDogcHJvcHMudmVyc2lvbmVkLFxuICAgICAgZW5jcnlwdGlvbjogcHJvcHMuZW5jcnlwdGlvbiBhcyBhbnksXG4gICAgICBlbmNyeXB0aW9uS2V5OiBwcm9wcy5rbXNLZXlBcm4gPyB1bmRlZmluZWQgOiB1bmRlZmluZWQsIC8vIEtNUyBrZXkgaGFuZGxpbmdcbiAgICAgIHB1YmxpY1JlYWRBY2Nlc3M6IHByb3BzLnB1YmxpY1JlYWRBY2Nlc3NcbiAgICB9KTtcbiAgICB0aGlzLmFkZE91dHB1dHMoKTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkV2Vic2l0ZUJ1Y2tldChwcm9wczogV2Vic2l0ZVMzUHJvcHMpIHtcbiAgICB0aGlzLmJ1Y2tldCA9IG5ldyBTM1dlYnNpdGVCdWNrZXQodGhpcywgYCR7dGhpcy5pZH1CdWNrZXRgLCB7XG4gICAgICBiYWNrdXBWYXVsdFRpZXI6IHByb3BzLmJhY2t1cFZhdWx0VGllcixcbiAgICAgIHZlcnNpb25lZDogcHJvcHMudmVyc2lvbmVkLFxuICAgICAgZW5jcnlwdGlvbjogcHJvcHMuZW5jcnlwdGlvbiBhcyBhbnksXG4gICAgICB3ZWJzaXRlSW5kZXhEb2N1bWVudDogcHJvcHMud2Vic2l0ZUluZGV4RG9jdW1lbnQsXG4gICAgICB3ZWJzaXRlRXJyb3JEb2N1bWVudDogcHJvcHMud2Vic2l0ZUVycm9yRG9jdW1lbnQsXG4gICAgICBjb3JzOiBwcm9wcy5jb3JzIGFzIGFueVxuICAgIH0pO1xuICAgIHRoaXMuYWRkT3V0cHV0cygpO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRQdWJsaWNSZWFkQnVja2V0KHByb3BzOiBQdWJsaWNSZWFkUzNQcm9wcykge1xuICAgIHRoaXMuYnVja2V0ID0gbmV3IFMzUHVibGljUmVhZEJ1Y2tldCh0aGlzLCBgJHt0aGlzLmlkfUJ1Y2tldGAsIHtcbiAgICAgIGJhY2t1cFZhdWx0VGllcjogcHJvcHMuYmFja3VwVmF1bHRUaWVyLFxuICAgICAgdmVyc2lvbmVkOiBwcm9wcy52ZXJzaW9uZWQsXG4gICAgICBlbmNyeXB0aW9uOiBwcm9wcy5lbmNyeXB0aW9uIGFzIGFueVxuICAgIH0pO1xuICAgIHRoaXMuYWRkT3V0cHV0cygpO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRPdXRwdXRzKCkge1xuICAgIGNvbnN0IHN0YWNrTmFtZSA9IFN0YWNrLm9mKHRoaXMpLnN0YWNrTmFtZTtcblxuICAgIC8vIEV4cG9ydCBidWNrZXQgQVJOIGZvciBtb25pdG9yaW5nXG4gICAgLy8gVXNlIHN0YWNrIG5hbWUgcHJlZml4IHRvIGVuc3VyZSB1bmlxdWVuZXNzIGFjcm9zcyBhcHBzIGluIHNhbWUgcmVnaW9uXG4gICAgbmV3IENmbk91dHB1dCh0aGlzLCBgJHt0aGlzLmlkfUJ1Y2tldEFybmAsIHtcbiAgICAgIGtleTogYCR7c3RhY2tOYW1lfSR7dGhpcy5pZH1CdWNrZXRBcm5gLFxuICAgICAgZXhwb3J0TmFtZTogYCR7c3RhY2tOYW1lfSR7dGhpcy5pZH1CdWNrZXRBcm5gLFxuICAgICAgdmFsdWU6IHRoaXMuYnVja2V0LmJ1Y2tldEFybixcbiAgICAgIGRlc2NyaXB0aW9uOiBgUzMgQnVja2V0IEFSTiBmb3IgJHt0aGlzLmlkfWBcbiAgICB9KTtcblxuICAgIC8vIEV4cG9ydCBidWNrZXQgbmFtZSBmb3IgY29udmVuaWVuY2VcbiAgICBuZXcgQ2ZuT3V0cHV0KHRoaXMsIGAke3RoaXMuaWR9QnVja2V0TmFtZWAsIHtcbiAgICAgIGtleTogYCR7c3RhY2tOYW1lfSR7dGhpcy5pZH1CdWNrZXROYW1lYCxcbiAgICAgIGV4cG9ydE5hbWU6IGAke3N0YWNrTmFtZX0ke3RoaXMuaWR9QnVja2V0TmFtZWAsXG4gICAgICB2YWx1ZTogdGhpcy5idWNrZXQuYnVja2V0TmFtZSxcbiAgICAgIGRlc2NyaXB0aW9uOiBgUzMgQnVja2V0IE5hbWUgZm9yICR7dGhpcy5pZH1gXG4gICAgfSk7XG4gIH1cblxuICBnZXRCdWNrZXQoKTogSUJ1Y2tldCB7XG4gICAgcmV0dXJuIHRoaXMuYnVja2V0O1xuICB9XG5cbiAgZ2V0QnVja2V0TmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmJ1Y2tldC5idWNrZXROYW1lO1xuICB9XG5cbiAgZ2V0QnVja2V0QXJuKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuYnVja2V0LmJ1Y2tldEFybjtcbiAgfVxuXG4gIGdldEJ1Y2tldFR5cGUoKTogUzNCdWNrZXRUeXBlIHtcbiAgICByZXR1cm4gdGhpcy5idWNrZXRUeXBlO1xuICB9XG59XG4iXX0=
|
|
297
|
+
exports.PublicStorage = PublicStorage;
|
|
298
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmFnZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYi9wYXR0ZXJucy9hd3Mvc3RvcmFnZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUE4R0Esb0RBRUM7QUFoSEQsMkNBQXVDO0FBQ3ZDLCtDQVE0QjtBQUM1QixxRUFJdUM7QUFFdkMsaURBQTBDO0FBQzFDLDZDQUF5RDtBQUd6RCx5REFLcUM7QUFDckMseUVBR3lDO0FBVXpDLHVDQUF1QztBQUN2QyxzREFVaUM7QUFIL0IsOEdBQUEsZ0JBQWdCLE9BQUE7QUFDaEIsOEdBQUEsZ0JBQWdCLE9BQUE7QUFDaEIsNkdBQUEsZUFBZSxPQUFBO0FBS2pCLFNBQVMsa0JBQWtCLENBQ3pCLFVBQTJCO0lBRTNCLElBQUksQ0FBQyxVQUFVO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFDbEMsT0FBTyxVQUFVLEtBQUssUUFBUTtRQUM1QixDQUFDLENBQUMseUJBQWdCLENBQUMsVUFBVTtRQUM3QixDQUFDLENBQUMseUJBQWdCLENBQUMsR0FBRyxDQUFDO0FBQzNCLENBQUM7QUFFRCxTQUFTLFlBQVksQ0FBQyxNQUFjO0lBQ2xDLE1BQU0sU0FBUyxHQUFnQztRQUM3QyxHQUFHLEVBQUUsb0JBQVcsQ0FBQyxHQUFHO1FBQ3BCLEdBQUcsRUFBRSxvQkFBVyxDQUFDLEdBQUc7UUFDcEIsSUFBSSxFQUFFLG9CQUFXLENBQUMsSUFBSTtRQUN0QixNQUFNLEVBQUUsb0JBQVcsQ0FBQyxNQUFNO1FBQzFCLElBQUksRUFBRSxvQkFBVyxDQUFDLElBQUk7S0FDdkIsQ0FBQztJQUNGLE9BQU8sU0FBUyxDQUFDLE1BQU0sQ0FBQyxJQUFJLG9CQUFXLENBQUMsR0FBRyxDQUFDO0FBQzlDLENBQUM7QUFFRCxTQUFTLFdBQVcsQ0FDbEIsSUFBb0U7SUFFcEUsSUFBSSxDQUFDLElBQUk7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUM1QixPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJ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YTtJQUcvQyxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQXFCO1FBQzdELEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBSFYsZ0JBQVcsR0FBRyxTQUFrQixDQUFDO1FBSS9DLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRUQsMkJBQTJCO0lBQzNCLGFBQWE7UUFDWCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLElBQUksRUFBRSxDQUFDO0lBQzVDLENBQUM7Q0FDRjtBQVpELHdDQVlDO0FBRUQ7OztHQUdHO0FBQ0gsTUFBYSxhQUFjLFNBQVEsYUFBYTtJQUc5QyxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQXdCO1FBQ2hFLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBSFYsZ0JBQVcsR0FBRyxZQUFxQixDQUFDO1FBSWxELElBQUksQ0FBQywwQkFBMEIsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN6QyxDQUFDO0NBQ0Y7QUFQRCxzQ0FPQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5pbXBvcnQge1xuICB0eXBlIElCdWNrZXQsXG4gIHR5cGUgRXZlbnRUeXBlLFxuICB0eXBlIElCdWNrZXROb3RpZmljYXRpb25EZXN0aW5hdGlvbixcbiAgdHlwZSBOb3RpZmljYXRpb25LZXlGaWx0ZXIsXG4gIEJ1Y2tldEVuY3J5cHRpb24sXG4gIEh0dHBNZXRob2RzLFxuICB0eXBlIENvcnNSdWxlXG59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtczNcIjtcbmltcG9ydCB7XG4gIEJ1Y2tldERlcGxveW1lbnQsXG4gIFNvdXJjZSxcbiAgQ2FjaGVDb250cm9sXG59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtczMtZGVwbG95bWVudFwiO1xuaW1wb3J0IHsgdHlwZSBJR3JhbnRhYmxlLCB0eXBlIEdyYW50IH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1pYW1cIjtcbmltcG9ydCB7IEtleSB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3Mta21zXCI7XG5pbXBvcnQgeyBDZm5PdXRwdXQsIER1cmF0aW9uLCBTdGFjayB9IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuXG5pbXBvcnQgdHlwZSBBcHAgZnJvbSBcIi4uLy4uL2FwcFwiO1xuaW1wb3J0IHtcbiAgUzNCdWNrZXQsXG4gIFMzV2Vic2l0ZUJ1Y2tldCxcbiAgUzNQdWJsaWNSZWFkQnVja2V0LFxuICB0eXBlIEJhY2t1cFZhdWx0VGllclxufSBmcm9tIFwiLi4vLi4vcmVzb3VyY2VzL2F3cy9zdG9yYWdlXCI7XG5pbXBvcnQge1xuICBGamFsbExvZ2dlcixcbiAgd2FybklmUHJvcGVydGllc0lnbm9yZWRcbn0gZnJvbSBcIi4uLy4uL3V0aWxzL3ZhbGlkYXRpb25Mb2dnZXIuanNcIjtcbmltcG9ydCB7XG4gIHR5cGUgU3RvcmFnZVR5cGUsXG4gIHR5cGUgSVByaXZhdGVTdG9yYWdlLFxuICB0eXBlIElXZWJzaXRlU3RvcmFnZSxcbiAgdHlwZSBJUHVibGljU3RvcmFnZSxcbiAgdHlwZSBBbnlTdG9yYWdlXG59IGZyb20gXCIuL2ludGVyZmFjZXMvc3RvcmFnZS5qc1wiO1xuaW1wb3J0IHsgdHlwZSBJU3RvcmFnZUNvbm5lY3RvciB9IGZyb20gXCIuL2ludGVyZmFjZXMvY29ubmVjdG9yLmpzXCI7XG5cbi8vIFJlLWV4cG9ydCBpbnRlcmZhY2VzIGFuZCB0eXBlIGd1YXJkc1xuZXhwb3J0IHtcbiAgdHlwZSBTdG9yYWdlVHlwZSxcbiAgdHlwZSBJU3RvcmFnZSxcbiAgdHlwZSBJUHJpdmF0ZVN0b3JhZ2UsXG4gIHR5cGUgSVdlYnNpdGVTdG9yYWdlLFxuICB0eXBlIElQdWJsaWNTdG9yYWdlLFxuICB0eXBlIEFueVN0b3JhZ2UsXG4gIGlzUHJpdmF0ZVN0b3JhZ2UsXG4gIGlzV2Vic2l0ZVN0b3JhZ2UsXG4gIGlzUHVibGljU3RvcmFnZVxufSBmcm9tIFwiLi9pbnRlcmZhY2VzL3N0b3JhZ2UuanNcIjtcblxudHlwZSBFbmNyeXB0aW9uVHlwZSA9IFwiQUVTMjU2XCIgfCBcIktNU1wiO1xuXG5mdW5jdGlvbiB0b0J1Y2tldEVuY3J5cHRpb24oXG4gIGVuY3J5cHRpb24/OiBFbmNyeXB0aW9uVHlwZVxuKTogQnVja2V0RW5jcnlwdGlvbiB8IHVuZGVmaW5lZCB7XG4gIGlmICghZW5jcnlwdGlvbikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIGVuY3J5cHRpb24gPT09IFwiQUVTMjU2XCJcbiAgICA/IEJ1Y2tldEVuY3J5cHRpb24uUzNfTUFOQUdFRFxuICAgIDogQnVja2V0RW5jcnlwdGlvbi5LTVM7XG59XG5cbmZ1bmN0aW9uIHRvSHR0cE1ldGhvZChtZXRob2Q6IHN0cmluZyk6IEh0dHBNZXRob2RzIHtcbiAgY29uc3QgbWV0aG9kTWFwOiBSZWNvcmQ8c3RyaW5nLCBIdHRwTWV0aG9kcz4gPSB7XG4gICAgR0VUOiBIdHRwTWV0aG9kcy5HRVQsXG4gICAgUFVUOiBIdHRwTWV0aG9kcy5QVVQsXG4gICAgUE9TVDogSHR0cE1ldGhvZHMuUE9TVCxcbiAgICBERUxFVEU6IEh0dHBNZXRob2RzLkRFTEVURSxcbiAgICBIRUFEOiBIdHRwTWV0aG9kcy5IRUFEXG4gIH07XG4gIHJldHVybiBtZXRob2RNYXBbbWV0aG9kXSA/PyBIdHRwTWV0aG9kcy5HRVQ7XG59XG5cbmZ1bmN0aW9uIHRvQ29yc1J1bGVzKFxuICBjb3JzPzogQXJyYXk8eyBhbGxvd2VkT3JpZ2luczogc3RyaW5nW107IGFsbG93ZWRNZXRob2RzOiBzdHJpbmdbXSB9PlxuKTogQ29yc1J1bGVbXSB8IHVuZGVmaW5lZCB7XG4gIGlmICghY29ycykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIGNvcnMubWFwKChydWxlKSA9PiAoe1xuICAgIGFsbG93ZWRPcmlnaW5zOiBydWxlLmFsbG93ZWRPcmlnaW5zLFxuICAgIGFsbG93ZWRNZXRob2RzOiBydWxlLmFsbG93ZWRNZXRob2RzLm1hcCh0b0h0dHBNZXRob2QpXG4gIH0pKTtcbn1cblxuZXhwb3J0IHR5cGUgUzNCdWNrZXRUeXBlID0gXCJwcml2YXRlXCIgfCBcIndlYnNpdGVcIiB8IFwicHVibGljUmVhZFwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIFN0b3JhZ2VUeXBlQ29uZmlnIHtcbiAgc3VwcG9ydHNQdWJsaWNSZWFkOiBib29sZWFuO1xuICBzdXBwb3J0c1dlYnNpdGVIb3N0aW5nOiBib29sZWFuO1xuICBkZWZhdWx0UHVibGljQWNjZXNzOiBib29sZWFuO1xufVxuXG5leHBvcnQgY29uc3QgU1RPUkFHRV9UWVBFX0NPTkZJRzogUmVjb3JkPFMzQnVja2V0VHlwZSwgU3RvcmFnZVR5cGVDb25maWc+ID0ge1xuICBwcml2YXRlOiB7XG4gICAgc3VwcG9ydHNQdWJsaWNSZWFkOiB0cnVlLFxuICAgIHN1cHBvcnRzV2Vic2l0ZUhvc3Rpbmc6IGZhbHNlLFxuICAgIGRlZmF1bHRQdWJsaWNBY2Nlc3M6IGZhbHNlXG4gIH0sXG4gIHdlYnNpdGU6IHtcbiAgICBzdXBwb3J0c1B1YmxpY1JlYWQ6IHRydWUsXG4gICAgc3VwcG9ydHNXZWJzaXRlSG9zdGluZzogdHJ1ZSxcbiAgICBkZWZhdWx0UHVibGljQWNjZXNzOiB0cnVlXG4gIH0sXG4gIHB1YmxpY1JlYWQ6IHtcbiAgICBzdXBwb3J0c1B1YmxpY1JlYWQ6IHRydWUsXG4gICAgc3VwcG9ydHNXZWJzaXRlSG9zdGluZzogZmFsc2UsXG4gICAgZGVmYXVsdFB1YmxpY0FjY2VzczogdHJ1ZVxuICB9XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3RvcmFnZVR5cGVDb25maWcodHlwZTogUzNCdWNrZXRUeXBlKTogU3RvcmFnZVR5cGVDb25maWcge1xuICByZXR1cm4gU1RPUkFHRV9UWVBFX0NPTkZJR1t0eXBlXTtcbn1cblxudHlwZSBCYXNlUzNQcm9wcyA9IHtcbiAgYmFja3VwVmF1bHRUaWVyPzogQmFja3VwVmF1bHRUaWVyO1xuICB2ZXJzaW9uZWQ/OiBib29sZWFuO1xuICBlbmNyeXB0aW9uPzogXCJBRVMyNTZcIiB8IFwiS01TXCI7XG4gIGttc0tleUFybj86IHN0cmluZztcbn07XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBmb3IgYXV0b21hdGljIGFzc2V0IGRlcGxveW1lbnQgdG8gUzMuXG4gKiBXaGVuIHByb3ZpZGVkLCBjcmVhdGVzIGEgQnVja2V0RGVwbG95bWVudCB0aGF0IHVwbG9hZHMgZmlsZXMgZHVyaW5nIENESyBkZXBsb3kuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUzNEZXBsb3ltZW50Q29uZmlnIHtcbiAgLyoqIFBhdGggdG8gdGhlIGFzc2V0IGRpcmVjdG9yeSAocmVsYXRpdmUgdG8gQ0RLIGFwcCByb290KSAqL1xuICBzb3VyY2U6IHN0cmluZztcbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gcmVtb3ZlIGZpbGVzIGZyb20gYnVja2V0IHRoYXQgYXJlbid0IGluIHRoZSBzb3VyY2UuXG4gICAqIERlZmF1bHQ6IHRydWUgZm9yIHN0YXRpYyBhc3NldHMsIGZhbHNlIGZvciBjYWNoZXMgdGhhdCBncm93IGF0IHJ1bnRpbWUuXG4gICAqL1xuICBwcnVuZT86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBDYWNoZSBjb250cm9sIHNldHRpbmdzIGZvciB1cGxvYWRlZCBmaWxlcy5cbiAgICogSWYgbm90IHByb3ZpZGVkLCBubyBjYWNoZSBoZWFkZXJzIGFyZSBzZXQuXG4gICAqL1xuICBjYWNoZUNvbnRyb2w/OiB7XG4gICAgLyoqIE1heCBhZ2UgaW4gc2Vjb25kcyAoZS5nLiwgMzE1MzYwMDAgZm9yIDEgeWVhcikgKi9cbiAgICBtYXhBZ2U/OiBudW1iZXI7XG4gICAgLyoqIE1hcmsgYXMgaW1tdXRhYmxlIChicm93c2VyIHdvbid0IHJldmFsaWRhdGUpICovXG4gICAgaW1tdXRhYmxlPzogYm9vbGVhbjtcbiAgfTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQcml2YXRlUzNQcm9wcyBleHRlbmRzIEJhc2VTM1Byb3BzIHtcbiAgYnVja2V0VHlwZTogXCJwcml2YXRlXCI7XG4gIHB1YmxpY1JlYWRBY2Nlc3M/OiBib29sZWFuO1xuICAvKipcbiAgICogT3B0aW9uYWwgZGVwbG95bWVudCBjb25maWd1cmF0aW9uLlxuICAgKiBXaGVuIHByb3ZpZGVkLCBhdXRvbWF0aWNhbGx5IHVwbG9hZHMgZmlsZXMgdG8gdGhlIGJ1Y2tldCBkdXJpbmcgQ0RLIGRlcGxveS5cbiAgICovXG4gIGRlcGxveW1lbnQ/OiBTM0RlcGxveW1lbnRDb25maWc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgV2Vic2l0ZVMzUHJvcHMgZXh0ZW5kcyBCYXNlUzNQcm9wcyB7XG4gIGJ1Y2tldFR5cGU6IFwid2Vic2l0ZVwiO1xuICB3ZWJzaXRlSW5kZXhEb2N1bWVudD86IHN0cmluZztcbiAgd2Vic2l0ZUVycm9yRG9jdW1lbnQ/OiBzdHJpbmc7XG4gIGNvcnM/OiBBcnJheTx7XG4gICAgYWxsb3dlZE9yaWdpbnM6IHN0cmluZ1tdO1xuICAgIGFsbG93ZWRNZXRob2RzOiBzdHJpbmdbXTtcbiAgfT47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHVibGljUmVhZFMzUHJvcHMgZXh0ZW5kcyBCYXNlUzNQcm9wcyB7XG4gIGJ1Y2tldFR5cGU6IFwicHVibGljUmVhZFwiO1xufVxuXG5leHBvcnQgdHlwZSBJUzNQcm9wcyA9IFByaXZhdGVTM1Byb3BzIHwgV2Vic2l0ZVMzUHJvcHMgfCBQdWJsaWNSZWFkUzNQcm9wcztcblxuLyoqXG4gKiBWYWxpZGF0ZXMgc3RvcmFnZSBwcm9wcyBhbmQgbG9ncyB3YXJuaW5ncyBmb3IgaWdub3JlZCBvciBtaXNjb25maWd1cmVkIG9wdGlvbnMuXG4gKiBUaGVzZSBjaGVja3MgaGVscCBjYXRjaCBpc3N1ZXMgd2hlbiBwcm9wcyBjb21lIGZyb20gZHluYW1pYyBzb3VyY2VzIHdoZXJlXG4gKiBUeXBlU2NyaXB0J3MgY29tcGlsZS10aW1lIGNoZWNrcyBtYXkgbm90IGFwcGx5LlxuICovXG5mdW5jdGlvbiB2YWxpZGF0ZVN0b3JhZ2VQcm9wcyhwcm9wczogSVMzUHJvcHMpOiB2b2lkIHtcbiAgLy8gVmFsaWRhdGUgZW5jcnlwdGlvbjogS01TIHJlcXVpcmVzIGttc0tleUFyblxuICBpZiAocHJvcHMuZW5jcnlwdGlvbiA9PT0gXCJLTVNcIiAmJiAhcHJvcHMua21zS2V5QXJuKSB7XG4gICAgRmphbGxMb2dnZXIud2FybihcbiAgICAgIFwiJ2VuY3J5cHRpb24nIGlzIHNldCB0byAnS01TJyBidXQgJ2ttc0tleUFybicgaXMgbm90IHByb3ZpZGVkLiBcIiArXG4gICAgICAgIFwiVGhlIGJ1Y2tldCB3aWxsIHVzZSB0aGUgZGVmYXVsdCBBV1MgbWFuYWdlZCBrZXkuXCJcbiAgICApO1xuICB9XG5cbiAgLy8gV2FybiBhYm91dCBrbXNLZXlBcm4gd2hlbiBlbmNyeXB0aW9uIGlzIG5vdCBLTVNcbiAgaWYgKHByb3BzLmttc0tleUFybiAmJiBwcm9wcy5lbmNyeXB0aW9uICE9PSBcIktNU1wiKSB7XG4gICAgRmphbGxMb2dnZXIud2FybihcbiAgICAgIFwiJ2ttc0tleUFybicgaXMgcHJvdmlkZWQgYnV0ICdlbmNyeXB0aW9uJyBpcyBub3Qgc2V0IHRvICdLTVMnLiBcIiArXG4gICAgICAgIFwiVGhlIEtNUyBrZXkgd2lsbCBiZSBpZ25vcmVkLiBTZXQgZW5jcnlwdGlvbjogJ0tNUycgdG8gdXNlIHRoZSBrZXkuXCJcbiAgICApO1xuICB9XG5cbiAgLy8gV2Vic2l0ZS1vbmx5IG9wdGlvbnMgb24gbm9uLXdlYnNpdGUgYnVja2V0c1xuICAvLyBOb3RlOiBVc2luZyBidWNrZXRUeXBlIGFzIGRpc2NyaW1pbmF0b3Igd2l0aCBcInR5cGVcIiBhbGlhcyBmb3IgdGhlIGhlbHBlclxuICBjb25zdCBwcm9wc1dpdGhUeXBlID0geyAuLi5wcm9wcywgdHlwZTogcHJvcHMuYnVja2V0VHlwZSB9O1xuICB3YXJuSWZQcm9wZXJ0aWVzSWdub3JlZChcbiAgICBwcm9wc1dpdGhUeXBlLFxuICAgIFtcIndlYnNpdGVJbmRleERvY3VtZW50XCIsIFwid2Vic2l0ZUVycm9yRG9jdW1lbnRcIiwgXCJjb3JzXCJdLFxuICAgIFwid2Vic2l0ZVwiLFxuICAgIFwid2Vic2l0ZSBidWNrZXRcIlxuICApO1xuXG4gIC8vIFByaXZhdGUtb25seSBvcHRpb25zIG9uIG5vbi1wcml2YXRlIGJ1Y2tldHNcbiAgd2FybklmUHJvcGVydGllc0lnbm9yZWQoXG4gICAgcHJvcHNXaXRoVHlwZSxcbiAgICBbXCJwdWJsaWNSZWFkQWNjZXNzXCJdLFxuICAgIFwicHJpdmF0ZVwiLFxuICAgIFwicHJpdmF0ZSBidWNrZXRcIlxuICApO1xufVxuXG4vKipcbiAqIEZhY3RvcnkgZm9yIGNyZWF0aW5nIFMzIHN0b3JhZ2UgcmVzb3VyY2VzIHdpdGggdHlwZS1zYWZlIHJldHVybiB0eXBlcy5cbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gUHJpdmF0ZSBidWNrZXRcbiAqIGNvbnN0IGFzc2V0cyA9IGFwcC5hZGRTdG9yYWdlKFN0b3JhZ2VGYWN0b3J5LmJ1aWxkKFwiQXNzZXRzXCIsIHsgYnVja2V0VHlwZTogXCJwcml2YXRlXCIgfSkpO1xuICogYXNzZXRzLmdyYW50UHVibGljQWNjZXNzKCk7IC8vIOKckyBBdmFpbGFibGUgb24gUHJpdmF0ZVN0b3JhZ2VcbiAqXG4gKiAvLyBXZWJzaXRlIGJ1Y2tldFxuICogY29uc3Qgc2l0ZSA9IGFwcC5hZGRTdG9yYWdlKFN0b3JhZ2VGYWN0b3J5LmJ1aWxkKFwiU2l0ZVwiLCB7IGJ1Y2tldFR5cGU6IFwid2Vic2l0ZVwiIH0pKTtcbiAqIHNpdGUuZ2V0V2Vic2l0ZVVybCgpOyAvLyDinJMgQXZhaWxhYmxlIG9uIFdlYnNpdGVTdG9yYWdlXG4gKi9cbmV4cG9ydCBjbGFzcyBTdG9yYWdlRmFjdG9yeSB7XG4gIC8qKiBCdWlsZCBhIHByaXZhdGUgc3RvcmFnZSBidWNrZXQgKi9cbiAgc3RhdGljIGJ1aWxkKFxuICAgIGlkOiBzdHJpbmcsXG4gICAgcHJvcHM6IFByaXZhdGVTM1Byb3BzXG4gICk6IChhcHA6IEFwcCwgc2NvcGU6IENvbnN0cnVjdCkgPT4gUHJpdmF0ZVN0b3JhZ2U7XG4gIC8qKiBCdWlsZCBhIHdlYnNpdGUgc3RvcmFnZSBidWNrZXQgKi9cbiAgc3RhdGljIGJ1aWxkKFxuICAgIGlkOiBzdHJpbmcsXG4gICAgcHJvcHM6IFdlYnNpdGVTM1Byb3BzXG4gICk6IChhcHA6IEFwcCwgc2NvcGU6IENvbnN0cnVjdCkgPT4gV2Vic2l0ZVN0b3JhZ2U7XG4gIC8qKiBCdWlsZCBhIHB1YmxpYyByZWFkIHN0b3JhZ2UgYnVja2V0ICovXG4gIHN0YXRpYyBidWlsZChcbiAgICBpZDogc3RyaW5nLFxuICAgIHByb3BzOiBQdWJsaWNSZWFkUzNQcm9wc1xuICApOiAoYXBwOiBBcHAsIHNjb3BlOiBDb25zdHJ1Y3QpID0+IFB1YmxpY1N0b3JhZ2U7XG4gIC8qKiBJbXBsZW1lbnRhdGlvbiAtIHJldHVybnMgYXBwcm9wcmlhdGUgc3RvcmFnZSB0eXBlIGJhc2VkIG9uIHByb3BzICovXG4gIHN0YXRpYyBidWlsZChcbiAgICBpZDogc3RyaW5nLFxuICAgIHByb3BzOiBJUzNQcm9wc1xuICApOiAoYXBwOiBBcHAsIHNjb3BlOiBDb25zdHJ1Y3QpID0+IEFueVN0b3JhZ2Uge1xuICAgIHJldHVybiAoX2FwcDogQXBwLCBzY29wZTogQ29uc3RydWN0KSA9PiB7XG4gICAgICB2YWxpZGF0ZVN0b3JhZ2VQcm9wcyhwcm9wcyk7XG5cbiAgICAgIHN3aXRjaCAocHJvcHMuYnVja2V0VHlwZSkge1xuICAgICAgICBjYXNlIFwicHJpdmF0ZVwiOlxuICAgICAgICAgIHJldHVybiBuZXcgUHJpdmF0ZVN0b3JhZ2Uoc2NvcGUsIGlkLCBwcm9wcyk7XG4gICAgICAgIGNhc2UgXCJ3ZWJzaXRlXCI6XG4gICAgICAgICAgcmV0dXJuIG5ldyBXZWJzaXRlU3RvcmFnZShzY29wZSwgaWQsIHByb3BzKTtcbiAgICAgICAgY2FzZSBcInB1YmxpY1JlYWRcIjpcbiAgICAgICAgICByZXR1cm4gbmV3IFB1YmxpY1N0b3JhZ2Uoc2NvcGUsIGlkLCBwcm9wcyk7XG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICBjb25zdCBfZXhoYXVzdGl2ZTogbmV2ZXIgPSBwcm9wcztcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgVW5zdXBwb3J0ZWQgYnVja2V0IHR5cGU6ICR7KF9leGhhdXN0aXZlIGFzIElTM1Byb3BzKS5idWNrZXRUeXBlfWBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgfVxufVxuXG4vKipcbiAqIEJhc2UgUzMgc3RvcmFnZSBjbGFzcy5cbiAqIFNwZWNpZmljIHN0b3JhZ2UgdHlwZXMgKFByaXZhdGVTdG9yYWdlLCBXZWJzaXRlU3RvcmFnZSwgUHVibGljU3RvcmFnZSkgZXh0ZW5kIHRoaXMuXG4gKi9cbmFic3RyYWN0IGNsYXNzIFMzU3RvcmFnZUJhc2UgZXh0ZW5kcyBDb25zdHJ1Y3QgaW1wbGVtZW50cyBJU3RvcmFnZUNvbm5lY3RvciB7XG4gIHB1YmxpYyByZWFkb25seSBpZDogc3RyaW5nO1xuICBwdWJsaWMgcmVhZG9ubHkgc2NvcGU6IENvbnN0cnVjdDtcblxuICAvKiogVGhlIHR5cGUgb2Ygc3RvcmFnZSByZXNvdXJjZS4gVXNlZCBmb3IgcnVudGltZSB0eXBlIG5hcnJvd2luZy4gKi9cbiAgcHVibGljIGFic3RyYWN0IHJlYWRvbmx5IHN0b3JhZ2VUeXBlOiBTdG9yYWdlVHlwZTtcblxuICAvKiogVGhlIGNvbm5lY3RvciB0eXBlIGZvciB1bmlmaWVkIGNvbm5lY3Rpb24gcHJvY2Vzc2luZy4gKi9cbiAgcHVibGljIHJlYWRvbmx5IGNvbm5lY3RvclR5cGUgPSBcInN0b3JhZ2VcIiBhcyBjb25zdDtcblxuICBwcm90ZWN0ZWQgYnVja2V0ITogUzNCdWNrZXQgfCBTM1dlYnNpdGVCdWNrZXQgfCBTM1B1YmxpY1JlYWRCdWNrZXQ7XG4gIHByb3RlY3RlZCBfYnVja2V0VHlwZTogUzNCdWNrZXRUeXBlO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBJUzNQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG4gICAgdGhpcy5pZCA9IGlkO1xuICAgIHRoaXMuc2NvcGUgPSBzY29wZTtcbiAgICB0aGlzLl9idWNrZXRUeXBlID0gcHJvcHMuYnVja2V0VHlwZTtcbiAgfVxuXG4gIHByb3RlY3RlZCBpbml0aWFsaXNlUHJpdmF0ZUJ1Y2tldChwcm9wczogUHJpdmF0ZVMzUHJvcHMpIHtcbiAgICBjb25zdCBlbmNyeXB0aW9uS2V5ID0gcHJvcHMua21zS2V5QXJuXG4gICAgICA/IEtleS5mcm9tS2V5QXJuKHRoaXMsIGAke3RoaXMuaWR9S21zS2V5YCwgcHJvcHMua21zS2V5QXJuKVxuICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICB0aGlzLmJ1Y2tldCA9IG5ldyBTM0J1Y2tldCh0aGlzLCBgJHt0aGlzLmlkfUJ1Y2tldGAsIHtcbiAgICAgIGJhY2t1cFZhdWx0VGllcjogcHJvcHMuYmFja3VwVmF1bHRUaWVyLFxuICAgICAgdmVyc2lvbmVkOiBwcm9wcy52ZXJzaW9uZWQsXG4gICAgICBlbmNyeXB0aW9uOiB0b0J1Y2tldEVuY3J5cHRpb24ocHJvcHMuZW5jcnlwdGlvbiksXG4gICAgICBlbmNyeXB0aW9uS2V5LFxuICAgICAgcHVibGljUmVhZEFjY2VzczogcHJvcHMucHVibGljUmVhZEFjY2Vzc1xuICAgIH0pO1xuICAgIHRoaXMuYWRkT3V0cHV0cygpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGluaXRpYWxpc2VXZWJzaXRlQnVja2V0KHByb3BzOiBXZWJzaXRlUzNQcm9wcykge1xuICAgIHRoaXMuYnVja2V0ID0gbmV3IFMzV2Vic2l0ZUJ1Y2tldCh0aGlzLCBgJHt0aGlzLmlkfUJ1Y2tldGAsIHtcbiAgICAgIGJhY2t1cFZhdWx0VGllcjogcHJvcHMuYmFja3VwVmF1bHRUaWVyLFxuICAgICAgdmVyc2lvbmVkOiBwcm9wcy52ZXJzaW9uZWQsXG4gICAgICBlbmNyeXB0aW9uOiB0b0J1Y2tldEVuY3J5cHRpb24ocHJvcHMuZW5jcnlwdGlvbiksXG4gICAgICB3ZWJzaXRlSW5kZXhEb2N1bWVudDogcHJvcHMud2Vic2l0ZUluZGV4RG9jdW1lbnQsXG4gICAgICB3ZWJzaXRlRXJyb3JEb2N1bWVudDogcHJvcHMud2Vic2l0ZUVycm9yRG9jdW1lbnQsXG4gICAgICBjb3JzOiB0b0NvcnNSdWxlcyhwcm9wcy5jb3JzKVxuICAgIH0pO1xuICAgIHRoaXMuYWRkT3V0cHV0cygpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGluaXRpYWxpc2VQdWJsaWNSZWFkQnVja2V0KHByb3BzOiBQdWJsaWNSZWFkUzNQcm9wcykge1xuICAgIHRoaXMuYnVja2V0ID0gbmV3IFMzUHVibGljUmVhZEJ1Y2tldCh0aGlzLCBgJHt0aGlzLmlkfUJ1Y2tldGAsIHtcbiAgICAgIGJhY2t1cFZhdWx0VGllcjogcHJvcHMuYmFja3VwVmF1bHRUaWVyLFxuICAgICAgdmVyc2lvbmVkOiBwcm9wcy52ZXJzaW9uZWQsXG4gICAgICBlbmNyeXB0aW9uOiB0b0J1Y2tldEVuY3J5cHRpb24ocHJvcHMuZW5jcnlwdGlvbilcbiAgICB9KTtcbiAgICB0aGlzLmFkZE91dHB1dHMoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhZGRPdXRwdXRzKCkge1xuICAgIGNvbnN0IHN0YWNrTmFtZSA9IFN0YWNrLm9mKHRoaXMpLnN0YWNrTmFtZTtcblxuICAgIG5ldyBDZm5PdXRwdXQodGhpcywgYCR7dGhpcy5pZH1CdWNrZXRBcm5gLCB7XG4gICAgICBrZXk6IGAke3N0YWNrTmFtZX0ke3RoaXMuaWR9QnVja2V0QXJuYCxcbiAgICAgIGV4cG9ydE5hbWU6IGAke3N0YWNrTmFtZX0ke3RoaXMuaWR9QnVja2V0QXJuYCxcbiAgICAgIHZhbHVlOiB0aGlzLmJ1Y2tldC5idWNrZXRBcm4sXG4gICAgICBkZXNjcmlwdGlvbjogYFMzIEJ1Y2tldCBBUk4gZm9yICR7dGhpcy5pZH1gXG4gICAgfSk7XG5cbiAgICBuZXcgQ2ZuT3V0cHV0KHRoaXMsIGAke3RoaXMuaWR9QnVja2V0TmFtZWAsIHtcbiAgICAgIGtleTogYCR7c3RhY2tOYW1lfSR7dGhpcy5pZH1CdWNrZXROYW1lYCxcbiAgICAgIGV4cG9ydE5hbWU6IGAke3N0YWNrTmFtZX0ke3RoaXMuaWR9QnVja2V0TmFtZWAsXG4gICAgICB2YWx1ZTogdGhpcy5idWNrZXQuYnVja2V0TmFtZSxcbiAgICAgIGRlc2NyaXB0aW9uOiBgUzMgQnVja2V0IE5hbWUgZm9yICR7dGhpcy5pZH1gXG4gICAgfSk7XG4gIH1cblxuICBnZXRCdWNrZXQoKTogSUJ1Y2tldCB7XG4gICAgcmV0dXJuIHRoaXMuYnVja2V0O1xuICB9XG5cbiAgZ2V0QnVja2V0TmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmJ1Y2tldC5idWNrZXROYW1lO1xuICB9XG5cbiAgZ2V0QnVja2V0QXJuKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuYnVja2V0LmJ1Y2tldEFybjtcbiAgfVxuXG4gIGdldEJ1Y2tldFR5cGUoKTogUzNCdWNrZXRUeXBlIHtcbiAgICByZXR1cm4gdGhpcy5fYnVja2V0VHlwZTtcbiAgfVxuXG4gIGdldEJ1Y2tldERvbWFpbk5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5idWNrZXQuYnVja2V0RG9tYWluTmFtZTtcbiAgfVxuXG4gIGdldEJ1Y2tldFJlZ2lvbmFsRG9tYWluTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmJ1Y2tldC5idWNrZXRSZWdpb25hbERvbWFpbk5hbWU7XG4gIH1cblxuICBnZXRTM0J1Y2tldCgpOiBTM0J1Y2tldCB8IFMzV2Vic2l0ZUJ1Y2tldCB8IFMzUHVibGljUmVhZEJ1Y2tldCB7XG4gICAgcmV0dXJuIHRoaXMuYnVja2V0O1xuICB9XG5cbiAgZ3JhbnRSZWFkKGdyYW50ZWU6IElHcmFudGFibGUpOiBHcmFudCB7XG4gICAgcmV0dXJuIHRoaXMuYnVja2V0LmdyYW50UmVhZChncmFudGVlKTtcbiAgfVxuXG4gIGdyYW50V3JpdGUoZ3JhbnRlZTogSUdyYW50YWJsZSk6IEdyYW50IHtcbiAgICByZXR1cm4gdGhpcy5idWNrZXQuZ3JhbnRXcml0ZShncmFudGVlKTtcbiAgfVxuXG4gIGdyYW50UmVhZFdyaXRlKGdyYW50ZWU6IElHcmFudGFibGUpOiBHcmFudCB7XG4gICAgcmV0dXJuIHRoaXMuYnVja2V0LmdyYW50UmVhZFdyaXRlKGdyYW50ZWUpO1xuICB9XG5cbiAgZ3JhbnREZWxldGUoZ3JhbnRlZTogSUdyYW50YWJsZSk6IEdyYW50IHtcbiAgICByZXR1cm4gdGhpcy5idWNrZXQuZ3JhbnREZWxldGUoZ3JhbnRlZSk7XG4gIH1cblxuICBncmFudFB1dChncmFudGVlOiBJR3JhbnRhYmxlKTogR3JhbnQge1xuICAgIHJldHVybiB0aGlzLmJ1Y2tldC5ncmFudFB1dChncmFudGVlKTtcbiAgfVxuXG4gIGFkZEV2ZW50Tm90aWZpY2F0aW9uKFxuICAgIGV2ZW50OiBFdmVudFR5cGUsXG4gICAgZGVzdDogSUJ1Y2tldE5vdGlmaWNhdGlvbkRlc3RpbmF0aW9uLFxuICAgIC4uLmZpbHRlcnM6IE5vdGlmaWNhdGlvbktleUZpbHRlcltdXG4gICk6IHZvaWQge1xuICAgIHRoaXMuYnVja2V0LmFkZEV2ZW50Tm90aWZpY2F0aW9uKGV2ZW50LCBkZXN0LCAuLi5maWx0ZXJzKTtcbiAgfVxuXG4gIGFkZE9iamVjdENyZWF0ZWROb3RpZmljYXRpb24oXG4gICAgZGVzdDogSUJ1Y2tldE5vdGlmaWNhdGlvbkRlc3RpbmF0aW9uLFxuICAgIC4uLmZpbHRlcnM6IE5vdGlmaWNhdGlvbktleUZpbHRlcltdXG4gICk6IHZvaWQge1xuICAgIHRoaXMuYnVja2V0LmFkZE9iamVjdENyZWF0ZWROb3RpZmljYXRpb24oZGVzdCwgLi4uZmlsdGVycyk7XG4gIH1cblxuICBhZGRPYmplY3RSZW1vdmVkTm90aWZpY2F0aW9uKFxuICAgIGRlc3Q6IElCdWNrZXROb3RpZmljYXRpb25EZXN0aW5hdGlvbixcbiAgICAuLi5maWx0ZXJzOiBOb3RpZmljYXRpb25LZXlGaWx0ZXJbXVxuICApOiB2b2lkIHtcbiAgICB0aGlzLmJ1Y2tldC5hZGRPYmplY3RSZW1vdmVkTm90aWZpY2F0aW9uKGRlc3QsIC4uLmZpbHRlcnMpO1xuICB9XG59XG5cbi8qKlxuICogUHJpdmF0ZSBTMyBzdG9yYWdlLlxuICogU3RhbmRhcmQgYnVja2V0IHdpdGggb3B0aW9uYWwgZW5jcnlwdGlvbiBhbmQgdmVyc2lvbmluZy5cbiAqL1xuZXhwb3J0IGNsYXNzIFByaXZhdGVTdG9yYWdlIGV4dGVuZHMgUzNTdG9yYWdlQmFzZSBpbXBsZW1lbnRzIElQcml2YXRlU3RvcmFnZSB7XG4gIHB1YmxpYyByZWFkb25seSBzdG9yYWdlVHlwZSA9IFwicHJpdmF0ZVwiIGFzIGNvbnN0O1xuXG4gIHByaXZhdGUgX2RlcGxveW1lbnQ/OiBCdWNrZXREZXBsb3ltZW50O1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBQcml2YXRlUzNQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCwgcHJvcHMpO1xuICAgIHRoaXMuaW5pdGlhbGlzZVByaXZhdGVCdWNrZXQocHJvcHMpO1xuXG4gICAgaWYgKHByb3BzLmRlcGxveW1lbnQpIHtcbiAgICAgIHRoaXMuX2RlcGxveW1lbnQgPSB0aGlzLmNyZWF0ZURlcGxveW1lbnQoaWQsIHByb3BzLmRlcGxveW1lbnQpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlRGVwbG95bWVudChcbiAgICBpZDogc3RyaW5nLFxuICAgIGNvbmZpZzogUzNEZXBsb3ltZW50Q29uZmlnXG4gICk6IEJ1Y2tldERlcGxveW1lbnQge1xuICAgIGNvbnN0IGNhY2hlQ29udHJvbEhlYWRlcnM6IENhY2hlQ29udHJvbFtdID0gW107XG5cbiAgICBpZiAoY29uZmlnLmNhY2hlQ29udHJvbD8ubWF4QWdlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNhY2hlQ29udHJvbEhlYWRlcnMucHVzaChcbiAgICAgICAgQ2FjaGVDb250cm9sLm1heEFnZShEdXJhdGlvbi5zZWNvbmRzKGNvbmZpZy5jYWNoZUNvbnRyb2wubWF4QWdlKSlcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChjb25maWcuY2FjaGVDb250cm9sPy5pbW11dGFibGUpIHtcbiAgICAgIGNhY2hlQ29udHJvbEhlYWRlcnMucHVzaChDYWNoZUNvbnRyb2wuaW1tdXRhYmxlKCkpO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgQnVja2V0RGVwbG95bWVudCh0aGlzLCBgJHtpZH1EZXBsb3ltZW50YCwge1xuICAgICAgc291cmNlczogW1NvdXJjZS5hc3NldChjb25maWcuc291cmNlKV0sXG4gICAgICBkZXN0aW5hdGlvbkJ1Y2tldDogdGhpcy5idWNrZXQsXG4gICAgICBwcnVuZTogY29uZmlnLnBydW5lID8/IHRydWUsXG4gICAgICAuLi4oY2FjaGVDb250cm9sSGVhZGVycy5sZW5ndGggPiAwICYmIHtcbiAgICAgICAgY2FjaGVDb250cm9sOiBjYWNoZUNvbnRyb2xIZWFkZXJzXG4gICAgICB9KVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyYW50IHB1YmxpYyBhY2Nlc3MgdG8gb2JqZWN0cyB1bmRlciBhIHByZWZpeC5cbiAgICogVXNlIHdpdGggY2F1dGlvbiAtIG1ha2VzIG9iamVjdHMgcHVibGljbHkgcmVhZGFibGUuXG4gICAqL1xuICBncmFudFB1YmxpY0FjY2VzcyguLi5rZXlQcmVmaXg6IHN0cmluZ1tdKTogR3JhbnQge1xuICAgIHJldHVybiB0aGlzLmJ1Y2tldC5ncmFudFB1YmxpY0FjY2VzcyguLi5rZXlQcmVmaXgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgQnVja2V0RGVwbG95bWVudCBjb25zdHJ1Y3QgaWYgb25lIHdhcyBjcmVhdGVkLlxuICAgKiBSZXR1cm5zIHVuZGVmaW5lZCBpZiBubyBkZXBsb3ltZW50IHdhcyBjb25maWd1cmVkLlxuICAgKi9cbiAgZ2V0RGVwbG95bWVudCgpOiBCdWNrZXREZXBsb3ltZW50IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fZGVwbG95bWVudDtcbiAgfVxufVxuXG4vKipcbiAqIFdlYnNpdGUgUzMgc3RvcmFnZS5cbiAqIEJ1Y2tldCBjb25maWd1cmVkIGZvciBzdGF0aWMgd2Vic2l0ZSBob3N0aW5nLlxuICovXG5leHBvcnQgY2xhc3MgV2Vic2l0ZVN0b3JhZ2UgZXh0ZW5kcyBTM1N0b3JhZ2VCYXNlIGltcGxlbWVudHMgSVdlYnNpdGVTdG9yYWdlIHtcbiAgcHVibGljIHJlYWRvbmx5IHN0b3JhZ2VUeXBlID0gXCJ3ZWJzaXRlXCIgYXMgY29uc3Q7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IFdlYnNpdGVTM1Byb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkLCBwcm9wcyk7XG4gICAgdGhpcy5pbml0aWFsaXNlV2Vic2l0ZUJ1Y2tldChwcm9wcyk7XG4gIH1cblxuICAvKiogR2V0IHRoZSB3ZWJzaXRlIFVSTC4gKi9cbiAgZ2V0V2Vic2l0ZVVybCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmJ1Y2tldC5idWNrZXRXZWJzaXRlVXJsID8/IFwiXCI7XG4gIH1cbn1cblxuLyoqXG4gKiBQdWJsaWMgcmVhZCBTMyBzdG9yYWdlLlxuICogQnVja2V0IHdpdGggcHVibGljIHJlYWQgYWNjZXNzIGVuYWJsZWQuXG4gKi9cbmV4cG9ydCBjbGFzcyBQdWJsaWNTdG9yYWdlIGV4dGVuZHMgUzNTdG9yYWdlQmFzZSBpbXBsZW1lbnRzIElQdWJsaWNTdG9yYWdlIHtcbiAgcHVibGljIHJlYWRvbmx5IHN0b3JhZ2VUeXBlID0gXCJwdWJsaWNSZWFkXCIgYXMgY29uc3Q7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IFB1YmxpY1JlYWRTM1Byb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkLCBwcm9wcyk7XG4gICAgdGhpcy5pbml0aWFsaXNlUHVibGljUmVhZEJ1Y2tldChwcm9wcyk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -9,19 +9,16 @@ class BackupPlan extends constructs_1.Construct {
|
|
|
9
9
|
constructor(scope, id, props) {
|
|
10
10
|
super(scope, id);
|
|
11
11
|
const tagKey = props.tagKey || "fjall:disasterRecovery:tier";
|
|
12
|
-
// Create backup plan with provided rules
|
|
13
12
|
this.plan = new aws_backup_1.BackupPlan(this, `${props.planName}Plan`, {
|
|
14
13
|
backupPlanName: props.planName,
|
|
15
14
|
backupVault: props.backupVault.vault,
|
|
16
15
|
backupPlanRules: props.rules
|
|
17
16
|
});
|
|
18
|
-
// Create tag-based selection
|
|
19
17
|
this.selection = new aws_backup_1.BackupSelection(this, `${props.planName}Selection`, {
|
|
20
18
|
backupPlan: this.plan,
|
|
21
19
|
resources: [aws_backup_1.BackupResource.fromTag(tagKey, props.tagValue)],
|
|
22
20
|
role: this.createBackupRole(props)
|
|
23
21
|
});
|
|
24
|
-
// Export plan ARN (wrapper handles sanitisation)
|
|
25
22
|
this.planArn = new aws_cdk_lib_1.CfnOutput(this, `${props.planName}PlanArn`, {
|
|
26
23
|
key: `${props.planName}PlanArn`,
|
|
27
24
|
value: this.plan.backupPlanArn,
|
|
@@ -33,10 +30,8 @@ class BackupPlan extends constructs_1.Construct {
|
|
|
33
30
|
assumedBy: new iam.ServicePrincipal("backup.amazonaws.com"),
|
|
34
31
|
description: `Backup role for ${props.planName}`,
|
|
35
32
|
managedPolicies: [
|
|
36
|
-
// Core backup policies
|
|
37
33
|
iam.ManagedPolicy.fromAwsManagedPolicyName("service-role/AWSBackupServiceRolePolicyForBackup"),
|
|
38
34
|
iam.ManagedPolicy.fromAwsManagedPolicyName("service-role/AWSBackupServiceRolePolicyForRestores"),
|
|
39
|
-
// S3 backup support
|
|
40
35
|
iam.ManagedPolicy.fromAwsManagedPolicyName("AWSBackupServiceRolePolicyForS3Backup"),
|
|
41
36
|
iam.ManagedPolicy.fromAwsManagedPolicyName("AWSBackupServiceRolePolicyForS3Restore")
|
|
42
37
|
]
|
|
@@ -62,4 +57,4 @@ class BackupPlan extends constructs_1.Construct {
|
|
|
62
57
|
}
|
|
63
58
|
}
|
|
64
59
|
exports.BackupPlan = BackupPlan;
|
|
65
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
60
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFja3VwUGxhbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYi9yZXNvdXJjZXMvYXdzL2JhY2t1cC9iYWNrdXBQbGFuLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLDJDQUF1QztBQUN2Qyw2Q0FBd0M7QUFDeEMsdURBS2dDO0FBQ2hDLDJDQUEyQztBQVczQyxNQUFhLFVBQVcsU0FBUSxzQkFBUztJQUt2QyxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQXNCO1FBQzlELEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakIsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLE1BQU0sSUFBSSw2QkFBNkIsQ0FBQztRQUU3RCxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksdUJBQUksQ0FBQyxJQUFJLEVBQUUsR0FBRyxLQUFLLENBQUMsUUFBUSxNQUFNLEVBQUU7WUFDbEQsY0FBYyxFQUFFLEtBQUssQ0FBQyxRQUFRO1lBQzlCLFdBQVcsRUFBRSxLQUFLLENBQUMsV0FBVyxDQUFDLEtBQUs7WUFDcEMsZUFBZSxFQUFFLEtBQUssQ0FBQyxLQUFLO1NBQzdCLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSw0QkFBZSxDQUFDLElBQUksRUFBRSxHQUFHLEtBQUssQ0FBQyxRQUFRLFdBQVcsRUFBRTtZQUN2RSxVQUFVLEVBQUUsSUFBSSxDQUFDLElBQUk7WUFDckIsU0FBUyxFQUFFLENBQUMsMkJBQWMsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUMzRCxJQUFJLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQztTQUNuQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksdUJBQVMsQ0FBQyxJQUFJLEVBQUUsR0FBRyxLQUFLLENBQUMsUUFBUSxTQUFTLEVBQUU7WUFDN0QsR0FBRyxFQUFFLEdBQUcsS0FBSyxDQUFDLFFBQVEsU0FBUztZQUMvQixLQUFLLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhO1lBQzlCLFVBQVUsRUFBRSxHQUFHLEtBQUssQ0FBQyxRQUFRLGVBQWU7U0FDN0MsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVPLGdCQUFnQixDQUFDLEtBQXNCO1FBQzdDLE1BQU0sSUFBSSxHQUFHLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsR0FBRyxLQUFLLENBQUMsUUFBUSxZQUFZLEVBQUU7WUFDN0QsU0FBUyxFQUFFLElBQUksR0FBRyxDQUFDLGdCQUFnQixDQUFDLHNCQUFzQixDQUFDO1lBQzNELFdBQVcsRUFBRSxtQkFBbUIsS0FBSyxDQUFDLFFBQVEsRUFBRTtZQUNoRCxlQUFlLEVBQUU7Z0JBQ2YsR0FBRyxDQUFDLGFBQWEsQ0FBQyx3QkFBd0IsQ0FDeEMsa0RBQWtELENBQ25EO2dCQUNELEdBQUcsQ0FBQyxhQUFhLENBQUMsd0JBQXdCLENBQ3hDLG9EQUFvRCxDQUNyRDtnQkFDRCxHQUFHLENBQUMsYUFBYSxDQUFDLHdCQUF3QixDQUN4Qyx1Q0FBdUMsQ0FDeEM7Z0JBQ0QsR0FBRyxDQUFDLGFBQWEsQ0FBQyx3QkFBd0IsQ0FDeEMsd0NBQXdDLENBQ3pDO2FBQ0Y7U0FDRixDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsV0FBVyxDQUNkLElBQUksR0FBRyxDQUFDLGVBQWUsQ0FBQztZQUN0QixNQUFNLEVBQUUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLO1lBQ3hCLE9BQU8sRUFBRTtnQkFDUCxzQkFBc0I7Z0JBQ3RCLHdDQUF3QztnQkFDeEMsb0NBQW9DO2dCQUNwQyx5QkFBeUI7Z0JBQ3pCLHdCQUF3QjtnQkFDeEIsbUNBQW1DO2FBQ3BDO1lBQ0QsU0FBUyxFQUFFLENBQUMsR0FBRyxDQUFDO1NBQ2pCLENBQUMsQ0FDSCxDQUFDO1FBQ0YsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFVLEVBQUUsS0FBc0I7UUFDN0MsT0FBTyxDQUFDLEtBQWdCLEVBQUUsRUFBRTtZQUMxQixPQUFPLElBQUksVUFBVSxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDMUMsQ0FBQyxDQUFDO0lBQ0osQ0FBQztDQUNGO0FBdkVELGdDQXVFQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5pbXBvcnQgeyBDZm5PdXRwdXQgfSBmcm9tIFwiYXdzLWNkay1saWJcIjtcbmltcG9ydCB7XG4gIEJhY2t1cFBsYW4gYXMgUGxhbixcbiAgQmFja3VwU2VsZWN0aW9uLFxuICBCYWNrdXBSZXNvdXJjZSxcbiAgdHlwZSBCYWNrdXBQbGFuUnVsZVxufSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWJhY2t1cFwiO1xuaW1wb3J0ICogYXMgaWFtIGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtaWFtXCI7XG5pbXBvcnQgeyB0eXBlIEJhY2t1cFZhdWx0IH0gZnJvbSBcIi4vYmFja3VwVmF1bHRcIjtcblxuZXhwb3J0IGludGVyZmFjZSBCYWNrdXBQbGFuUHJvcHMge1xuICBwbGFuTmFtZTogc3RyaW5nO1xuICBydWxlczogQmFja3VwUGxhblJ1bGVbXTtcbiAgYmFja3VwVmF1bHQ6IEJhY2t1cFZhdWx0O1xuICB0YWdWYWx1ZTogc3RyaW5nO1xuICB0YWdLZXk/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjbGFzcyBCYWNrdXBQbGFuIGV4dGVuZHMgQ29uc3RydWN0IHtcbiAgcHVibGljIHJlYWRvbmx5IHBsYW46IFBsYW47XG4gIHB1YmxpYyByZWFkb25seSBzZWxlY3Rpb246IEJhY2t1cFNlbGVjdGlvbjtcbiAgcHVibGljIHJlYWRvbmx5IHBsYW5Bcm46IENmbk91dHB1dDtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogQmFja3VwUGxhblByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIGNvbnN0IHRhZ0tleSA9IHByb3BzLnRhZ0tleSB8fCBcImZqYWxsOmRpc2FzdGVyUmVjb3Zlcnk6dGllclwiO1xuXG4gICAgdGhpcy5wbGFuID0gbmV3IFBsYW4odGhpcywgYCR7cHJvcHMucGxhbk5hbWV9UGxhbmAsIHtcbiAgICAgIGJhY2t1cFBsYW5OYW1lOiBwcm9wcy5wbGFuTmFtZSxcbiAgICAgIGJhY2t1cFZhdWx0OiBwcm9wcy5iYWNrdXBWYXVsdC52YXVsdCxcbiAgICAgIGJhY2t1cFBsYW5SdWxlczogcHJvcHMucnVsZXNcbiAgICB9KTtcblxuICAgIHRoaXMuc2VsZWN0aW9uID0gbmV3IEJhY2t1cFNlbGVjdGlvbih0aGlzLCBgJHtwcm9wcy5wbGFuTmFtZX1TZWxlY3Rpb25gLCB7XG4gICAgICBiYWNrdXBQbGFuOiB0aGlzLnBsYW4sXG4gICAgICByZXNvdXJjZXM6IFtCYWNrdXBSZXNvdXJjZS5mcm9tVGFnKHRhZ0tleSwgcHJvcHMudGFnVmFsdWUpXSxcbiAgICAgIHJvbGU6IHRoaXMuY3JlYXRlQmFja3VwUm9sZShwcm9wcylcbiAgICB9KTtcblxuICAgIHRoaXMucGxhbkFybiA9IG5ldyBDZm5PdXRwdXQodGhpcywgYCR7cHJvcHMucGxhbk5hbWV9UGxhbkFybmAsIHtcbiAgICAgIGtleTogYCR7cHJvcHMucGxhbk5hbWV9UGxhbkFybmAsXG4gICAgICB2YWx1ZTogdGhpcy5wbGFuLmJhY2t1cFBsYW5Bcm4sXG4gICAgICBleHBvcnROYW1lOiBgJHtwcm9wcy5wbGFuTmFtZX1CYWNrdXBQbGFuQXJuYFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVCYWNrdXBSb2xlKHByb3BzOiBCYWNrdXBQbGFuUHJvcHMpOiBpYW0uUm9sZSB7XG4gICAgY29uc3Qgcm9sZSA9IG5ldyBpYW0uUm9sZSh0aGlzLCBgJHtwcm9wcy5wbGFuTmFtZX1CYWNrdXBSb2xlYCwge1xuICAgICAgYXNzdW1lZEJ5OiBuZXcgaWFtLlNlcnZpY2VQcmluY2lwYWwoXCJiYWNrdXAuYW1hem9uYXdzLmNvbVwiKSxcbiAgICAgIGRlc2NyaXB0aW9uOiBgQmFja3VwIHJvbGUgZm9yICR7cHJvcHMucGxhbk5hbWV9YCxcbiAgICAgIG1hbmFnZWRQb2xpY2llczogW1xuICAgICAgICBpYW0uTWFuYWdlZFBvbGljeS5mcm9tQXdzTWFuYWdlZFBvbGljeU5hbWUoXG4gICAgICAgICAgXCJzZXJ2aWNlLXJvbGUvQVdTQmFja3VwU2VydmljZVJvbGVQb2xpY3lGb3JCYWNrdXBcIlxuICAgICAgICApLFxuICAgICAgICBpYW0uTWFuYWdlZFBvbGljeS5mcm9tQXdzTWFuYWdlZFBvbGljeU5hbWUoXG4gICAgICAgICAgXCJzZXJ2aWNlLXJvbGUvQVdTQmFja3VwU2VydmljZVJvbGVQb2xpY3lGb3JSZXN0b3Jlc1wiXG4gICAgICAgICksXG4gICAgICAgIGlhbS5NYW5hZ2VkUG9saWN5LmZyb21Bd3NNYW5hZ2VkUG9saWN5TmFtZShcbiAgICAgICAgICBcIkFXU0JhY2t1cFNlcnZpY2VSb2xlUG9saWN5Rm9yUzNCYWNrdXBcIlxuICAgICAgICApLFxuICAgICAgICBpYW0uTWFuYWdlZFBvbGljeS5mcm9tQXdzTWFuYWdlZFBvbGljeU5hbWUoXG4gICAgICAgICAgXCJBV1NCYWNrdXBTZXJ2aWNlUm9sZVBvbGljeUZvclMzUmVzdG9yZVwiXG4gICAgICAgIClcbiAgICAgIF1cbiAgICB9KTtcblxuICAgIHJvbGUuYWRkVG9Qb2xpY3koXG4gICAgICBuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgIGVmZmVjdDogaWFtLkVmZmVjdC5BTExPVyxcbiAgICAgICAgYWN0aW9uczogW1xuICAgICAgICAgIFwicmRzOk1vZGlmeURCSW5zdGFuY2VcIixcbiAgICAgICAgICBcInJkczpEZXNjcmliZURCSW5zdGFuY2VBdXRvbWF0ZWRCYWNrdXBzXCIsXG4gICAgICAgICAgXCJyZHM6UmVzdG9yZURCSW5zdGFuY2VUb1BvaW50SW5UaW1lXCIsXG4gICAgICAgICAgXCJyZHM6RGVzY3JpYmVEQkluc3RhbmNlc1wiLFxuICAgICAgICAgIFwicmRzOkRlc2NyaWJlREJDbHVzdGVyc1wiLFxuICAgICAgICAgIFwicmRzOlJlc3RvcmVEQkNsdXN0ZXJUb1BvaW50SW5UaW1lXCJcbiAgICAgICAgXSxcbiAgICAgICAgcmVzb3VyY2VzOiBbXCIqXCJdXG4gICAgICB9KVxuICAgICk7XG4gICAgcmV0dXJuIHJvbGU7XG4gIH1cblxuICBzdGF0aWMgYnVpbGQoaWQ6IHN0cmluZywgcHJvcHM6IEJhY2t1cFBsYW5Qcm9wcykge1xuICAgIHJldHVybiAoc2NvcGU6IENvbnN0cnVjdCkgPT4ge1xuICAgICAgcmV0dXJuIG5ldyBCYWNrdXBQbGFuKHNjb3BlLCBpZCwgcHJvcHMpO1xuICAgIH07XG4gIH1cbn1cbiJdfQ==
|