@fjall/components-infrastructure 0.87.20 → 0.88.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/dist/lib/app.d.ts +14 -18
- package/dist/lib/app.js +58 -41
- package/dist/lib/config/aws/accountId.js +1 -2
- package/dist/lib/config/aws/backupGlobalSettings.js +1 -2
- package/dist/lib/config/aws/costAllocationTags.js +3 -4
- package/dist/lib/config/aws/identityCenter.d.ts +4 -4
- package/dist/lib/config/aws/identityCenter.js +17 -63
- package/dist/lib/config/aws/identityCenterGroupMembership.js +27 -42
- package/dist/lib/config/aws/index.d.ts +0 -8
- package/dist/lib/config/aws/index.js +1 -9
- package/dist/lib/config/aws/ipamDelegateAdmin.js +1 -2
- package/dist/lib/config/aws/ipamPoolId.js +1 -2
- package/dist/lib/config/aws/organisationId.js +1 -2
- package/dist/lib/config/aws/organisationsAccess.js +1 -2
- package/dist/lib/config/aws/ramSharing.js +1 -2
- package/dist/lib/layers/layers/secrets-resolver/bin/resolve-secrets +30 -0
- package/dist/lib/layers/layers/secrets-resolver/bin/resolve-secrets.mjs +212 -0
- package/dist/lib/layers/secrets-resolver/bin/resolve-secrets +30 -0
- package/dist/lib/layers/secrets-resolver/bin/resolve-secrets.mjs +212 -0
- package/dist/lib/patterns/aws/account.d.ts +12 -0
- package/dist/lib/patterns/aws/account.js +73 -0
- package/dist/lib/patterns/aws/buildkite.js +1 -2
- package/dist/lib/patterns/aws/cdn.d.ts +5 -10
- package/dist/lib/patterns/aws/cdn.js +5 -13
- package/dist/lib/patterns/aws/compute.d.ts +20 -3
- package/dist/lib/patterns/aws/compute.js +29 -5
- package/dist/lib/patterns/aws/database.d.ts +3 -3
- package/dist/lib/patterns/aws/database.js +18 -15
- package/dist/lib/patterns/aws/index.d.ts +4 -3
- package/dist/lib/patterns/aws/index.js +6 -4
- package/dist/lib/patterns/aws/interfaces/index.d.ts +2 -1
- package/dist/lib/patterns/aws/interfaces/index.js +8 -5
- package/dist/lib/patterns/aws/interfaces/organisation.d.ts +22 -0
- package/dist/lib/patterns/aws/interfaces/organisation.js +28 -0
- package/dist/lib/patterns/aws/interfaces/pattern.d.ts +5 -5
- package/dist/lib/patterns/aws/interfaces/pattern.js +1 -1
- package/dist/lib/patterns/aws/interfaces/storage.d.ts +10 -120
- package/dist/lib/patterns/aws/interfaces/storage.js +6 -43
- package/dist/lib/patterns/aws/organisation.d.ts +38 -0
- package/dist/lib/patterns/aws/organisation.js +92 -0
- package/dist/lib/patterns/aws/organisationFactory.d.ts +20 -0
- package/dist/lib/patterns/aws/organisationFactory.js +24 -0
- package/dist/lib/patterns/aws/pattern.d.ts +1 -1
- package/dist/lib/patterns/aws/pattern.js +1 -1
- package/dist/lib/patterns/aws/payload.d.ts +6 -5
- package/dist/lib/patterns/aws/payload.js +92 -42
- package/dist/lib/patterns/aws/platform.d.ts +11 -0
- package/dist/lib/patterns/aws/platform.js +29 -0
- package/dist/lib/patterns/aws/storage.d.ts +40 -125
- package/dist/lib/patterns/aws/storage.js +63 -191
- package/dist/lib/resources/aws/compute/ec2.d.ts +1 -1
- package/dist/lib/resources/aws/compute/ec2.js +3 -4
- package/dist/lib/resources/aws/compute/ecs.d.ts +6 -9
- package/dist/lib/resources/aws/compute/ecs.js +58 -26
- package/dist/lib/resources/aws/compute/lambda.d.ts +14 -1
- package/dist/lib/resources/aws/compute/lambda.js +45 -13
- package/dist/lib/resources/aws/database/rdsAurora.d.ts +1 -0
- package/dist/lib/resources/aws/database/rdsAurora.js +16 -16
- package/dist/lib/resources/aws/database/rdsAuroraGlobal.d.ts +1 -0
- package/dist/lib/resources/aws/database/rdsAuroraGlobal.js +14 -10
- package/dist/lib/resources/aws/database/rdsInstance.d.ts +5 -4
- package/dist/lib/resources/aws/database/rdsInstance.js +18 -7
- package/dist/lib/resources/aws/iam/identityCenter/assignment.d.ts +0 -2
- package/dist/lib/resources/aws/iam/identityCenter/assignment.js +9 -46
- package/dist/lib/resources/aws/iam/identityCenter/attachManagedPolicy.js +1 -2
- package/dist/lib/resources/aws/iam/identityCenter/group.d.ts +1 -3
- package/dist/lib/resources/aws/iam/identityCenter/group.js +7 -85
- package/dist/lib/resources/aws/iam/identityCenter/permissionSet.d.ts +1 -3
- package/dist/lib/resources/aws/iam/identityCenter/permissionSet.js +9 -96
- package/dist/lib/resources/aws/index.d.ts +1 -0
- package/dist/lib/resources/aws/index.js +2 -1
- package/dist/lib/resources/aws/logging/cloudTrail.js +7 -4
- package/dist/lib/resources/aws/networking/ipamPool.js +76 -5
- package/dist/lib/resources/aws/organisation/index.d.ts +4 -0
- package/dist/lib/resources/aws/organisation/index.js +10 -0
- package/dist/lib/resources/aws/organisation/organisation.d.ts +12 -0
- package/dist/lib/resources/aws/organisation/organisation.js +14 -0
- package/dist/lib/resources/aws/organisation/organisationAccount.d.ts +18 -0
- package/dist/lib/resources/aws/organisation/organisationAccount.js +31 -0
- package/dist/lib/resources/aws/organisation/organisationPolicy.d.ts +13 -0
- package/dist/lib/resources/aws/organisation/organisationPolicy.js +32 -0
- package/dist/lib/resources/aws/organisation/organisationalUnit.d.ts +10 -0
- package/dist/lib/resources/aws/organisation/organisationalUnit.js +9 -0
- package/dist/lib/resources/aws/secrets/kms.js +10 -7
- package/dist/lib/resources/aws/secrets/parameter.js +5 -4
- package/dist/lib/resources/aws/storage/ecr.d.ts +3 -1
- package/dist/lib/resources/aws/storage/ecr.js +3 -3
- package/dist/lib/resources/aws/storage/s3.d.ts +6 -39
- package/dist/lib/resources/aws/storage/s3.js +31 -34
- package/dist/lib/utils/capitaliseString.d.ts +12 -0
- package/dist/lib/utils/capitaliseString.js +30 -0
- package/dist/lib/utils/capitalizeString.d.ts +11 -0
- package/dist/lib/utils/capitalizeString.js +24 -1
- package/dist/lib/utils/getConfig.d.ts +5 -1
- package/dist/lib/utils/getConfig.js +9 -1
- package/dist/lib/utils/index.d.ts +1 -0
- package/dist/lib/utils/index.js +2 -1
- package/dist/lib/utils/resourceNaming.d.ts +22 -19
- package/dist/lib/utils/resourceNaming.js +39 -35
- package/package.json +5 -6
|
@@ -3,158 +3,73 @@ import { type IBucket, type EventType, type IBucketNotificationDestination, type
|
|
|
3
3
|
import { BucketDeployment } from "aws-cdk-lib/aws-s3-deployment";
|
|
4
4
|
import { type IGrantable, type Grant } from "aws-cdk-lib/aws-iam";
|
|
5
5
|
import type App from "../../app";
|
|
6
|
-
import {
|
|
7
|
-
import { type
|
|
6
|
+
import { type BackupVaultTier, type WebsiteHostingConfig } from "../../resources/aws/storage";
|
|
7
|
+
import { type IStorage } from "./interfaces/storage.js";
|
|
8
8
|
import { type IStorageConnector } from "./interfaces/connector.js";
|
|
9
|
-
export { type
|
|
10
|
-
export type
|
|
11
|
-
export interface
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
9
|
+
export { type IStorage, isStorage } from "./interfaces/storage.js";
|
|
10
|
+
export { type WebsiteHostingConfig } from "../../resources/aws/storage";
|
|
11
|
+
export interface CorsRule {
|
|
12
|
+
readonly allowedOrigins: string[];
|
|
13
|
+
readonly allowedMethods: string[];
|
|
14
|
+
readonly allowedHeaders?: string[];
|
|
15
|
+
readonly exposedHeaders?: string[];
|
|
16
|
+
readonly maxAge?: number;
|
|
15
17
|
}
|
|
16
|
-
export declare const STORAGE_TYPE_CONFIG: Record<S3BucketType, StorageTypeConfig>;
|
|
17
|
-
export declare function getStorageTypeConfig(type: S3BucketType): StorageTypeConfig;
|
|
18
|
-
type BaseS3Props = {
|
|
19
|
-
backupVaultTier?: BackupVaultTier;
|
|
20
|
-
versioned?: boolean;
|
|
21
|
-
encryption?: "AES256" | "KMS";
|
|
22
|
-
kmsKeyArn?: string;
|
|
23
|
-
};
|
|
24
|
-
/**
|
|
25
|
-
* Configuration for automatic asset deployment to S3.
|
|
26
|
-
* When provided, creates a BucketDeployment that uploads files during CDK deploy.
|
|
27
|
-
*/
|
|
28
18
|
export interface S3DeploymentConfig {
|
|
29
19
|
/** Path to the asset directory (relative to CDK app root) */
|
|
30
20
|
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
|
-
*/
|
|
21
|
+
/** Whether to remove files from bucket that are not in the source. Default: true */
|
|
35
22
|
prune?: boolean;
|
|
36
|
-
/**
|
|
37
|
-
* Cache control settings for uploaded files.
|
|
38
|
-
* If not provided, no cache headers are set.
|
|
39
|
-
*/
|
|
23
|
+
/** Cache control settings for uploaded files */
|
|
40
24
|
cacheControl?: {
|
|
41
25
|
/** Max age in seconds (e.g., 31536000 for 1 year) */
|
|
42
26
|
maxAge?: number;
|
|
43
|
-
/** Mark as immutable (browser
|
|
27
|
+
/** Mark as immutable (browser will not revalidate) */
|
|
44
28
|
immutable?: boolean;
|
|
45
29
|
};
|
|
46
30
|
}
|
|
47
|
-
export interface
|
|
48
|
-
|
|
49
|
-
publicReadAccess?: boolean;
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
bucketType: "website";
|
|
58
|
-
websiteIndexDocument?: string;
|
|
59
|
-
websiteErrorDocument?: string;
|
|
60
|
-
cors?: Array<{
|
|
61
|
-
allowedOrigins: string[];
|
|
62
|
-
allowedMethods: string[];
|
|
63
|
-
}>;
|
|
31
|
+
export interface S3Props {
|
|
32
|
+
readonly bucketName?: string;
|
|
33
|
+
readonly publicReadAccess?: boolean;
|
|
34
|
+
readonly websiteHosting?: WebsiteHostingConfig;
|
|
35
|
+
readonly versioned?: boolean;
|
|
36
|
+
readonly encryption?: "AES256" | "KMS";
|
|
37
|
+
readonly kmsKeyArn?: string;
|
|
38
|
+
readonly backupVaultTier?: BackupVaultTier;
|
|
39
|
+
readonly cors?: CorsRule[];
|
|
40
|
+
readonly deployment?: S3DeploymentConfig;
|
|
64
41
|
}
|
|
65
|
-
export interface
|
|
66
|
-
|
|
67
|
-
}
|
|
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
|
-
*/
|
|
81
|
-
export declare class StorageFactory {
|
|
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;
|
|
42
|
+
export interface StorageBuildProps extends S3Props {
|
|
43
|
+
readonly stackPlacement?: "storage" | "cdn" | "compute";
|
|
88
44
|
}
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
declare
|
|
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. */
|
|
45
|
+
export type StorageFactoryFn = ((app: App, scope: Construct) => Storage) & {
|
|
46
|
+
stackPlacement?: "storage" | "cdn" | "compute";
|
|
47
|
+
};
|
|
48
|
+
export declare function validateStorageProps(props: S3Props): void;
|
|
49
|
+
export declare class Storage extends Construct implements IStorage, IStorageConnector {
|
|
99
50
|
readonly connectorType: "storage";
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
constructor(scope: Construct, id: string, props:
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
protected initialisePublicReadBucket(props: PublicReadS3Props): void;
|
|
106
|
-
protected addOutputs(): void;
|
|
51
|
+
private readonly bucket;
|
|
52
|
+
private readonly bucketDeployment?;
|
|
53
|
+
constructor(scope: Construct, id: string, props: S3Props);
|
|
54
|
+
private createDeployment;
|
|
55
|
+
private addOutputs;
|
|
107
56
|
getBucket(): IBucket;
|
|
108
57
|
getBucketName(): string;
|
|
109
58
|
getBucketArn(): string;
|
|
110
|
-
getBucketType(): S3BucketType;
|
|
111
59
|
getBucketDomainName(): string;
|
|
112
60
|
getBucketRegionalDomainName(): string;
|
|
113
|
-
|
|
61
|
+
getWebsiteUrl(): string | undefined;
|
|
62
|
+
getDeployment(): BucketDeployment | undefined;
|
|
114
63
|
grantRead(grantee: IGrantable): Grant;
|
|
115
64
|
grantWrite(grantee: IGrantable): Grant;
|
|
116
65
|
grantReadWrite(grantee: IGrantable): Grant;
|
|
117
66
|
grantDelete(grantee: IGrantable): Grant;
|
|
118
67
|
grantPut(grantee: IGrantable): Grant;
|
|
68
|
+
grantPublicAccess(...keyPrefix: string[]): Grant;
|
|
119
69
|
addEventNotification(event: EventType, dest: IBucketNotificationDestination, ...filters: NotificationKeyFilter[]): void;
|
|
120
70
|
addObjectCreatedNotification(dest: IBucketNotificationDestination, ...filters: NotificationKeyFilter[]): void;
|
|
121
71
|
addObjectRemovedNotification(dest: IBucketNotificationDestination, ...filters: NotificationKeyFilter[]): void;
|
|
122
72
|
}
|
|
123
|
-
|
|
124
|
-
|
|
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);
|
|
73
|
+
export declare class StorageFactory {
|
|
74
|
+
static build(id: string, props?: StorageBuildProps): StorageFactoryFn;
|
|
160
75
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
4
|
-
exports.
|
|
3
|
+
exports.StorageFactory = exports.Storage = exports.isStorage = void 0;
|
|
4
|
+
exports.validateStorageProps = validateStorageProps;
|
|
5
5
|
const constructs_1 = require("constructs");
|
|
6
6
|
const aws_s3_1 = require("aws-cdk-lib/aws-s3");
|
|
7
7
|
const aws_s3_deployment_1 = require("aws-cdk-lib/aws-s3-deployment");
|
|
@@ -9,11 +9,8 @@ const aws_kms_1 = require("aws-cdk-lib/aws-kms");
|
|
|
9
9
|
const aws_cdk_lib_1 = require("aws-cdk-lib");
|
|
10
10
|
const storage_1 = require("../../resources/aws/storage");
|
|
11
11
|
const validationLogger_js_1 = require("../../utils/validationLogger.js");
|
|
12
|
-
// Re-export interfaces and type guards
|
|
13
12
|
var storage_js_1 = require("./interfaces/storage.js");
|
|
14
|
-
Object.defineProperty(exports, "
|
|
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; } });
|
|
13
|
+
Object.defineProperty(exports, "isStorage", { enumerable: true, get: function () { return storage_js_1.isStorage; } });
|
|
17
14
|
function toBucketEncryption(encryption) {
|
|
18
15
|
if (!encryption)
|
|
19
16
|
return undefined;
|
|
@@ -36,143 +33,74 @@ function toCorsRules(cors) {
|
|
|
36
33
|
return undefined;
|
|
37
34
|
return cors.map((rule) => ({
|
|
38
35
|
allowedOrigins: rule.allowedOrigins,
|
|
39
|
-
allowedMethods: rule.allowedMethods.map(toHttpMethod)
|
|
36
|
+
allowedMethods: rule.allowedMethods.map(toHttpMethod),
|
|
37
|
+
...(rule.allowedHeaders && { allowedHeaders: rule.allowedHeaders }),
|
|
38
|
+
...(rule.exposedHeaders && { exposedHeaders: rule.exposedHeaders }),
|
|
39
|
+
...(rule.maxAge !== undefined && { maxAge: rule.maxAge })
|
|
40
40
|
}));
|
|
41
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
42
|
function validateStorageProps(props) {
|
|
68
|
-
// Validate encryption: KMS requires kmsKeyArn
|
|
69
43
|
if (props.encryption === "KMS" && !props.kmsKeyArn) {
|
|
70
44
|
validationLogger_js_1.FjallLogger.warn("'encryption' is set to 'KMS' but 'kmsKeyArn' is not provided. " +
|
|
71
45
|
"The bucket will use the default AWS managed key.");
|
|
72
46
|
}
|
|
73
|
-
// Warn about kmsKeyArn when encryption is not KMS
|
|
74
47
|
if (props.kmsKeyArn && props.encryption !== "KMS") {
|
|
75
48
|
validationLogger_js_1.FjallLogger.warn("'kmsKeyArn' is provided but 'encryption' is not set to 'KMS'. " +
|
|
76
49
|
"The KMS key will be ignored. Set encryption: 'KMS' to use the key.");
|
|
77
50
|
}
|
|
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
|
-
*/
|
|
97
|
-
class StorageFactory {
|
|
98
|
-
/** Implementation - returns appropriate storage type based on props */
|
|
99
|
-
static build(id, props) {
|
|
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
|
-
}
|
|
114
|
-
};
|
|
115
|
-
}
|
|
116
51
|
}
|
|
117
|
-
|
|
118
|
-
/**
|
|
119
|
-
* Base S3 storage class.
|
|
120
|
-
* Specific storage types (PrivateStorage, WebsiteStorage, PublicStorage) extend this.
|
|
121
|
-
*/
|
|
122
|
-
class S3StorageBase extends constructs_1.Construct {
|
|
52
|
+
class Storage extends constructs_1.Construct {
|
|
123
53
|
constructor(scope, id, props) {
|
|
124
54
|
super(scope, id);
|
|
125
|
-
/** The connector type for unified connection processing. */
|
|
126
55
|
this.connectorType = "storage";
|
|
127
|
-
this.id = id;
|
|
128
|
-
this.scope = scope;
|
|
129
|
-
this._bucketType = props.bucketType;
|
|
130
|
-
}
|
|
131
|
-
initialisePrivateBucket(props) {
|
|
132
56
|
const encryptionKey = props.kmsKeyArn
|
|
133
|
-
? aws_kms_1.Key.fromKeyArn(this, `${
|
|
57
|
+
? aws_kms_1.Key.fromKeyArn(this, `${id}KmsKey`, props.kmsKeyArn)
|
|
134
58
|
: undefined;
|
|
135
|
-
this.bucket = new storage_1.S3Bucket(this, `${
|
|
136
|
-
|
|
59
|
+
this.bucket = new storage_1.S3Bucket(this, `${id}Bucket`, {
|
|
60
|
+
bucketName: props.bucketName,
|
|
137
61
|
versioned: props.versioned,
|
|
138
62
|
encryption: toBucketEncryption(props.encryption),
|
|
139
63
|
encryptionKey,
|
|
140
|
-
publicReadAccess: props.publicReadAccess
|
|
141
|
-
});
|
|
142
|
-
this.addOutputs();
|
|
143
|
-
}
|
|
144
|
-
initialiseWebsiteBucket(props) {
|
|
145
|
-
this.bucket = new storage_1.S3WebsiteBucket(this, `${this.id}Bucket`, {
|
|
146
64
|
backupVaultTier: props.backupVaultTier,
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
websiteErrorDocument: props.websiteErrorDocument,
|
|
151
|
-
cors: toCorsRules(props.cors)
|
|
65
|
+
publicReadAccess: props.publicReadAccess,
|
|
66
|
+
websiteHosting: props.websiteHosting,
|
|
67
|
+
...(props.cors && { cors: toCorsRules(props.cors) })
|
|
152
68
|
});
|
|
153
|
-
|
|
69
|
+
if (props.deployment) {
|
|
70
|
+
this.bucketDeployment = this.createDeployment(id, props.deployment);
|
|
71
|
+
}
|
|
72
|
+
this.addOutputs(id);
|
|
154
73
|
}
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
74
|
+
createDeployment(id, config) {
|
|
75
|
+
const cacheControlHeaders = [];
|
|
76
|
+
if (config.cacheControl?.maxAge !== undefined) {
|
|
77
|
+
cacheControlHeaders.push(aws_s3_deployment_1.CacheControl.maxAge(aws_cdk_lib_1.Duration.seconds(config.cacheControl.maxAge)));
|
|
78
|
+
}
|
|
79
|
+
if (config.cacheControl?.immutable) {
|
|
80
|
+
cacheControlHeaders.push(aws_s3_deployment_1.CacheControl.immutable());
|
|
81
|
+
}
|
|
82
|
+
return new aws_s3_deployment_1.BucketDeployment(this, `${id}Deployment`, {
|
|
83
|
+
sources: [aws_s3_deployment_1.Source.asset(config.source)],
|
|
84
|
+
destinationBucket: this.bucket,
|
|
85
|
+
prune: config.prune ?? true,
|
|
86
|
+
...(cacheControlHeaders.length > 0 && {
|
|
87
|
+
cacheControl: cacheControlHeaders
|
|
88
|
+
})
|
|
160
89
|
});
|
|
161
|
-
this.addOutputs();
|
|
162
90
|
}
|
|
163
|
-
addOutputs() {
|
|
91
|
+
addOutputs(id) {
|
|
164
92
|
const stackName = aws_cdk_lib_1.Stack.of(this).stackName;
|
|
165
|
-
new aws_cdk_lib_1.CfnOutput(this, `${
|
|
166
|
-
key: `${stackName}${
|
|
167
|
-
exportName: `${stackName}${
|
|
93
|
+
new aws_cdk_lib_1.CfnOutput(this, `${id}BucketArn`, {
|
|
94
|
+
key: `${stackName}${id}BucketArn`,
|
|
95
|
+
exportName: `${stackName}${id}BucketArn`,
|
|
168
96
|
value: this.bucket.bucketArn,
|
|
169
|
-
description: `S3 Bucket ARN for ${
|
|
97
|
+
description: `S3 Bucket ARN for ${id}`
|
|
170
98
|
});
|
|
171
|
-
new aws_cdk_lib_1.CfnOutput(this, `${
|
|
172
|
-
key: `${stackName}${
|
|
173
|
-
exportName: `${stackName}${
|
|
99
|
+
new aws_cdk_lib_1.CfnOutput(this, `${id}BucketName`, {
|
|
100
|
+
key: `${stackName}${id}BucketName`,
|
|
101
|
+
exportName: `${stackName}${id}BucketName`,
|
|
174
102
|
value: this.bucket.bucketName,
|
|
175
|
-
description: `S3 Bucket Name for ${
|
|
103
|
+
description: `S3 Bucket Name for ${id}`
|
|
176
104
|
});
|
|
177
105
|
}
|
|
178
106
|
getBucket() {
|
|
@@ -184,17 +112,17 @@ class S3StorageBase extends constructs_1.Construct {
|
|
|
184
112
|
getBucketArn() {
|
|
185
113
|
return this.bucket.bucketArn;
|
|
186
114
|
}
|
|
187
|
-
getBucketType() {
|
|
188
|
-
return this._bucketType;
|
|
189
|
-
}
|
|
190
115
|
getBucketDomainName() {
|
|
191
116
|
return this.bucket.bucketDomainName;
|
|
192
117
|
}
|
|
193
118
|
getBucketRegionalDomainName() {
|
|
194
119
|
return this.bucket.bucketRegionalDomainName;
|
|
195
120
|
}
|
|
196
|
-
|
|
197
|
-
return this.bucket;
|
|
121
|
+
getWebsiteUrl() {
|
|
122
|
+
return this.bucket.bucketWebsiteUrl;
|
|
123
|
+
}
|
|
124
|
+
getDeployment() {
|
|
125
|
+
return this.bucketDeployment;
|
|
198
126
|
}
|
|
199
127
|
grantRead(grantee) {
|
|
200
128
|
return this.bucket.grantRead(grantee);
|
|
@@ -211,6 +139,9 @@ class S3StorageBase extends constructs_1.Construct {
|
|
|
211
139
|
grantPut(grantee) {
|
|
212
140
|
return this.bucket.grantPut(grantee);
|
|
213
141
|
}
|
|
142
|
+
grantPublicAccess(...keyPrefix) {
|
|
143
|
+
return this.bucket.grantPublicAccess(...keyPrefix);
|
|
144
|
+
}
|
|
214
145
|
addEventNotification(event, dest, ...filters) {
|
|
215
146
|
this.bucket.addEventNotification(event, dest, ...filters);
|
|
216
147
|
}
|
|
@@ -221,78 +152,19 @@ class S3StorageBase extends constructs_1.Construct {
|
|
|
221
152
|
this.bucket.addObjectRemovedNotification(dest, ...filters);
|
|
222
153
|
}
|
|
223
154
|
}
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
this._deployment = this.createDeployment(id, props.deployment);
|
|
155
|
+
exports.Storage = Storage;
|
|
156
|
+
class StorageFactory {
|
|
157
|
+
static build(id, props = {}) {
|
|
158
|
+
const { stackPlacement, ...s3Props } = props;
|
|
159
|
+
const fn = (_app, scope) => {
|
|
160
|
+
validateStorageProps(s3Props);
|
|
161
|
+
return new Storage(scope, id, s3Props);
|
|
162
|
+
};
|
|
163
|
+
if (stackPlacement) {
|
|
164
|
+
fn.stackPlacement = stackPlacement;
|
|
235
165
|
}
|
|
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;
|
|
166
|
+
return fn;
|
|
267
167
|
}
|
|
268
168
|
}
|
|
269
|
-
exports.
|
|
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);
|
|
295
|
-
}
|
|
296
|
-
}
|
|
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==
|
|
169
|
+
exports.StorageFactory = StorageFactory;
|
|
170
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmFnZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2xpYi9wYXR0ZXJucy9hd3Mvc3RvcmFnZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUF5R0Esb0RBY0M7QUF2SEQsMkNBQXVDO0FBQ3ZDLCtDQVE0QjtBQUM1QixxRUFJdUM7QUFFdkMsaURBQTBDO0FBQzFDLDZDQUF5RDtBQUd6RCx5REFJcUM7QUFDckMseUVBQThEO0FBSTlELHNEQUFtRTtBQUEzQyx1R0FBQSxTQUFTLE9BQUE7QUE2Q2pDLFNBQVMsa0JBQWtCLENBQ3pCLFVBQTZCO0lBRTdCLElBQUksQ0FBQyxVQUFVO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFDbEMsT0FBTyxVQUFVLEtBQUssUUFBUTtRQUM1QixDQUFDLENBQUMseUJBQWdCLENBQUMsVUFBVTtRQUM3QixDQUFDLENBQUMseUJBQWdCLENBQUMsR0FBRyxDQUFDO0FBQzNCLENBQUM7QUFFRCxTQUFTLFlBQVksQ0FBQyxNQUFjO0lBQ2xDLE1BQU0sU0FBUyxHQUFnQztRQUM3QyxHQUFHLEVBQUUsb0JBQVcsQ0FBQyxHQUFHO1FBQ3BCLEdBQUcsRUFBRSxvQkFBVyxDQUFDLEdBQUc7UUFDcEIsSUFBSSxFQUFFLG9CQUFXLENBQUMsSUFBSTtRQUN0QixNQUFNLEVBQUUsb0JBQVcsQ0FBQyxNQUFNO1FBQzFCLElBQUksRUFBRSxvQkFBVyxDQUFDLElBQUk7S0FDdkIsQ0FBQztJQUNGLE9BQU8sU0FBUyxDQUFDLE1BQU0sQ0FBQyxJQUFJLG9CQUFXLENBQUMsR0FBRyxDQUFDO0FBQzlDLENBQUM7QUFFRCxTQUFTLFdBQVcsQ0FBQyxJQUFpQjtJQUNwQyxJQUFJLENBQUMsSUFBSTtRQUFFLE9BQU8sU0FBUyxDQUFDO0lBQzVCLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztRQUN6QixjQUFjLEVBQUUsSUFBSSxDQUFDLGNBQWM7UUFDbkMsY0FB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IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5pbXBvcnQge1xuICB0eXBlIElCdWNrZXQsXG4gIHR5cGUgRXZlbnRUeXBlLFxuICB0eXBlIElCdWNrZXROb3RpZmljYXRpb25EZXN0aW5hdGlvbixcbiAgdHlwZSBOb3RpZmljYXRpb25LZXlGaWx0ZXIsXG4gIEJ1Y2tldEVuY3J5cHRpb24sXG4gIEh0dHBNZXRob2RzLFxuICB0eXBlIENvcnNSdWxlIGFzIENka0NvcnNSdWxlXG59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtczNcIjtcbmltcG9ydCB7XG4gIEJ1Y2tldERlcGxveW1lbnQsXG4gIFNvdXJjZSxcbiAgQ2FjaGVDb250cm9sXG59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtczMtZGVwbG95bWVudFwiO1xuaW1wb3J0IHsgdHlwZSBJR3JhbnRhYmxlLCB0eXBlIEdyYW50IH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1pYW1cIjtcbmltcG9ydCB7IEtleSB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3Mta21zXCI7XG5pbXBvcnQgeyBDZm5PdXRwdXQsIER1cmF0aW9uLCBTdGFjayB9IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuXG5pbXBvcnQgdHlwZSBBcHAgZnJvbSBcIi4uLy4uL2FwcFwiO1xuaW1wb3J0IHtcbiAgUzNCdWNrZXQsXG4gIHR5cGUgQmFja3VwVmF1bHRUaWVyLFxuICB0eXBlIFdlYnNpdGVIb3N0aW5nQ29uZmlnXG59IGZyb20gXCIuLi8uLi9yZXNvdXJjZXMvYXdzL3N0b3JhZ2VcIjtcbmltcG9ydCB7IEZqYWxsTG9nZ2VyIH0gZnJvbSBcIi4uLy4uL3V0aWxzL3ZhbGlkYXRpb25Mb2dnZXIuanNcIjtcbmltcG9ydCB7IHR5cGUgSVN0b3JhZ2UgfSBmcm9tIFwiLi9pbnRlcmZhY2VzL3N0b3JhZ2UuanNcIjtcbmltcG9ydCB7IHR5cGUgSVN0b3JhZ2VDb25uZWN0b3IgfSBmcm9tIFwiLi9pbnRlcmZhY2VzL2Nvbm5lY3Rvci5qc1wiO1xuXG5leHBvcnQgeyB0eXBlIElTdG9yYWdlLCBpc1N0b3JhZ2UgfSBmcm9tIFwiLi9pbnRlcmZhY2VzL3N0b3JhZ2UuanNcIjtcbmV4cG9ydCB7IHR5cGUgV2Vic2l0ZUhvc3RpbmdDb25maWcgfSBmcm9tIFwiLi4vLi4vcmVzb3VyY2VzL2F3cy9zdG9yYWdlXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29yc1J1bGUge1xuICByZWFkb25seSBhbGxvd2VkT3JpZ2luczogc3RyaW5nW107XG4gIHJlYWRvbmx5IGFsbG93ZWRNZXRob2RzOiBzdHJpbmdbXTtcbiAgcmVhZG9ubHkgYWxsb3dlZEhlYWRlcnM/OiBzdHJpbmdbXTtcbiAgcmVhZG9ubHkgZXhwb3NlZEhlYWRlcnM/OiBzdHJpbmdbXTtcbiAgcmVhZG9ubHkgbWF4QWdlPzogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFMzRGVwbG95bWVudENvbmZpZyB7XG4gIC8qKiBQYXRoIHRvIHRoZSBhc3NldCBkaXJlY3RvcnkgKHJlbGF0aXZlIHRvIENESyBhcHAgcm9vdCkgKi9cbiAgc291cmNlOiBzdHJpbmc7XG4gIC8qKiBXaGV0aGVyIHRvIHJlbW92ZSBmaWxlcyBmcm9tIGJ1Y2tldCB0aGF0IGFyZSBub3QgaW4gdGhlIHNvdXJjZS4gRGVmYXVsdDogdHJ1ZSAqL1xuICBwcnVuZT86IGJvb2xlYW47XG4gIC8qKiBDYWNoZSBjb250cm9sIHNldHRpbmdzIGZvciB1cGxvYWRlZCBmaWxlcyAqL1xuICBjYWNoZUNvbnRyb2w/OiB7XG4gICAgLyoqIE1heCBhZ2UgaW4gc2Vjb25kcyAoZS5nLiwgMzE1MzYwMDAgZm9yIDEgeWVhcikgKi9cbiAgICBtYXhBZ2U/OiBudW1iZXI7XG4gICAgLyoqIE1hcmsgYXMgaW1tdXRhYmxlIChicm93c2VyIHdpbGwgbm90IHJldmFsaWRhdGUpICovXG4gICAgaW1tdXRhYmxlPzogYm9vbGVhbjtcbiAgfTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTM1Byb3BzIHtcbiAgcmVhZG9ubHkgYnVja2V0TmFtZT86IHN0cmluZztcbiAgcmVhZG9ubHkgcHVibGljUmVhZEFjY2Vzcz86IGJvb2xlYW47XG4gIHJlYWRvbmx5IHdlYnNpdGVIb3N0aW5nPzogV2Vic2l0ZUhvc3RpbmdDb25maWc7XG4gIHJlYWRvbmx5IHZlcnNpb25lZD86IGJvb2xlYW47XG4gIHJlYWRvbmx5IGVuY3J5cHRpb24/OiBcIkFFUzI1NlwiIHwgXCJLTVNcIjtcbiAgcmVhZG9ubHkga21zS2V5QXJuPzogc3RyaW5nO1xuICByZWFkb25seSBiYWNrdXBWYXVsdFRpZXI/OiBCYWNrdXBWYXVsdFRpZXI7XG4gIHJlYWRvbmx5IGNvcnM/OiBDb3JzUnVsZVtdO1xuICByZWFkb25seSBkZXBsb3ltZW50PzogUzNEZXBsb3ltZW50Q29uZmlnO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFN0b3JhZ2VCdWlsZFByb3BzIGV4dGVuZHMgUzNQcm9wcyB7XG4gIHJlYWRvbmx5IHN0YWNrUGxhY2VtZW50PzogXCJzdG9yYWdlXCIgfCBcImNkblwiIHwgXCJjb21wdXRlXCI7XG59XG5cbmV4cG9ydCB0eXBlIFN0b3JhZ2VGYWN0b3J5Rm4gPSAoKGFwcDogQXBwLCBzY29wZTogQ29uc3RydWN0KSA9PiBTdG9yYWdlKSAmIHtcbiAgc3RhY2tQbGFjZW1lbnQ/OiBcInN0b3JhZ2VcIiB8IFwiY2RuXCIgfCBcImNvbXB1dGVcIjtcbn07XG5cbmZ1bmN0aW9uIHRvQnVja2V0RW5jcnlwdGlvbihcbiAgZW5jcnlwdGlvbj86IFwiQUVTMjU2XCIgfCBcIktNU1wiXG4pOiBCdWNrZXRFbmNyeXB0aW9uIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFlbmNyeXB0aW9uKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gZW5jcnlwdGlvbiA9PT0gXCJBRVMyNTZcIlxuICAgID8gQnVja2V0RW5jcnlwdGlvbi5TM19NQU5BR0VEXG4gICAgOiBCdWNrZXRFbmNyeXB0aW9uLktNUztcbn1cblxuZnVuY3Rpb24gdG9IdHRwTWV0aG9kKG1ldGhvZDogc3RyaW5nKTogSHR0cE1ldGhvZHMge1xuICBjb25zdCBtZXRob2RNYXA6IFJlY29yZDxzdHJpbmcsIEh0dHBNZXRob2RzPiA9IHtcbiAgICBHRVQ6IEh0dHBNZXRob2RzLkdFVCxcbiAgICBQVVQ6IEh0dHBNZXRob2RzLlBVVCxcbiAgICBQT1NUOiBIdHRwTWV0aG9kcy5QT1NULFxuICAgIERFTEVURTogSHR0cE1ldGhvZHMuREVMRVRFLFxuICAgIEhFQUQ6IEh0dHBNZXRob2RzLkhFQURcbiAgfTtcbiAgcmV0dXJuIG1ldGhvZE1hcFttZXRob2RdID8/IEh0dHBNZXRob2RzLkdFVDtcbn1cblxuZnVuY3Rpb24gdG9Db3JzUnVsZXMoY29ycz86IENvcnNSdWxlW10pOiBDZGtDb3JzUnVsZVtdIHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFjb3JzKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gY29ycy5tYXAoKHJ1bGUpID0+ICh7XG4gICAgYWxsb3dlZE9yaWdpbnM6IHJ1bGUuYWxsb3dlZE9yaWdpbnMsXG4gICAgYWxsb3dlZE1ldGhvZHM6IHJ1bGUuYWxsb3dlZE1ldGhvZHMubWFwKHRvSHR0cE1ldGhvZCksXG4gICAgLi4uKHJ1bGUuYWxsb3dlZEhlYWRlcnMgJiYgeyBhbGxvd2VkSGVhZGVyczogcnVsZS5hbGxvd2VkSGVhZGVycyB9KSxcbiAgICAuLi4ocnVsZS5leHBvc2VkSGVhZGVycyAmJiB7IGV4cG9zZWRIZWFkZXJzOiBydWxlLmV4cG9zZWRIZWFkZXJzIH0pLFxuICAgIC4uLihydWxlLm1heEFnZSAhPT0gdW5kZWZpbmVkICYmIHsgbWF4QWdlOiBydWxlLm1heEFnZSB9KVxuICB9KSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZVN0b3JhZ2VQcm9wcyhwcm9wczogUzNQcm9wcyk6IHZvaWQge1xuICBpZiAocHJvcHMuZW5jcnlwdGlvbiA9PT0gXCJLTVNcIiAmJiAhcHJvcHMua21zS2V5QXJuKSB7XG4gICAgRmphbGxMb2dnZXIud2FybihcbiAgICAgIFwiJ2VuY3J5cHRpb24nIGlzIHNldCB0byAnS01TJyBidXQgJ2ttc0tleUFybicgaXMgbm90IHByb3ZpZGVkLiBcIiArXG4gICAgICAgIFwiVGhlIGJ1Y2tldCB3aWxsIHVzZSB0aGUgZGVmYXVsdCBBV1MgbWFuYWdlZCBrZXkuXCJcbiAgICApO1xuICB9XG5cbiAgaWYgKHByb3BzLmttc0tleUFybiAmJiBwcm9wcy5lbmNyeXB0aW9uICE9PSBcIktNU1wiKSB7XG4gICAgRmphbGxMb2dnZXIud2FybihcbiAgICAgIFwiJ2ttc0tleUFybicgaXMgcHJvdmlkZWQgYnV0ICdlbmNyeXB0aW9uJyBpcyBub3Qgc2V0IHRvICdLTVMnLiBcIiArXG4gICAgICAgIFwiVGhlIEtNUyBrZXkgd2lsbCBiZSBpZ25vcmVkLiBTZXQgZW5jcnlwdGlvbjogJ0tNUycgdG8gdXNlIHRoZSBrZXkuXCJcbiAgICApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBTdG9yYWdlIGV4dGVuZHMgQ29uc3RydWN0IGltcGxlbWVudHMgSVN0b3JhZ2UsIElTdG9yYWdlQ29ubmVjdG9yIHtcbiAgcHVibGljIHJlYWRvbmx5IGNvbm5lY3RvclR5cGUgPSBcInN0b3JhZ2VcIiBhcyBjb25zdDtcbiAgcHJpdmF0ZSByZWFkb25seSBidWNrZXQ6IFMzQnVja2V0O1xuICBwcml2YXRlIHJlYWRvbmx5IGJ1Y2tldERlcGxveW1lbnQ/OiBCdWNrZXREZXBsb3ltZW50O1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBTM1Byb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIGNvbnN0IGVuY3J5cHRpb25LZXkgPSBwcm9wcy5rbXNLZXlBcm5cbiAgICAgID8gS2V5LmZyb21LZXlBcm4odGhpcywgYCR7aWR9S21zS2V5YCwgcHJvcHMua21zS2V5QXJuKVxuICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICB0aGlzLmJ1Y2tldCA9IG5ldyBTM0J1Y2tldCh0aGlzLCBgJHtpZH1CdWNrZXRgLCB7XG4gICAgICBidWNrZXROYW1lOiBwcm9wcy5idWNrZXROYW1lLFxuICAgICAgdmVyc2lvbmVkOiBwcm9wcy52ZXJzaW9uZWQsXG4gICAgICBlbmNyeXB0aW9uOiB0b0J1Y2tldEVuY3J5cHRpb24ocHJvcHMuZW5jcnlwdGlvbiksXG4gICAgICBlbmNyeXB0aW9uS2V5LFxuICAgICAgYmFja3VwVmF1bHRUaWVyOiBwcm9wcy5iYWNrdXBWYXVsdFRpZXIsXG4gICAgICBwdWJsaWNSZWFkQWNjZXNzOiBwcm9wcy5wdWJsaWNSZWFkQWNjZXNzLFxuICAgICAgd2Vic2l0ZUhvc3Rpbmc6IHByb3BzLndlYnNpdGVIb3N0aW5nLFxuICAgICAgLi4uKHByb3BzLmNvcnMgJiYgeyBjb3JzOiB0b0NvcnNSdWxlcyhwcm9wcy5jb3JzKSB9KVxuICAgIH0pO1xuXG4gICAgaWYgKHByb3BzLmRlcGxveW1lbnQpIHtcbiAgICAgIHRoaXMuYnVja2V0RGVwbG95bWVudCA9IHRoaXMuY3JlYXRlRGVwbG95bWVudChpZCwgcHJvcHMuZGVwbG95bWVudCk7XG4gICAgfVxuXG4gICAgdGhpcy5hZGRPdXRwdXRzKGlkKTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlRGVwbG95bWVudChcbiAgICBpZDogc3RyaW5nLFxuICAgIGNvbmZpZzogUzNEZXBsb3ltZW50Q29uZmlnXG4gICk6IEJ1Y2tldERlcGxveW1lbnQge1xuICAgIGNvbnN0IGNhY2hlQ29udHJvbEhlYWRlcnM6IENhY2hlQ29udHJvbFtdID0gW107XG5cbiAgICBpZiAoY29uZmlnLmNhY2hlQ29udHJvbD8ubWF4QWdlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNhY2hlQ29udHJvbEhlYWRlcnMucHVzaChcbiAgICAgICAgQ2FjaGVDb250cm9sLm1heEFnZShEdXJhdGlvbi5zZWNvbmRzKGNvbmZpZy5jYWNoZUNvbnRyb2wubWF4QWdlKSlcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChjb25maWcuY2FjaGVDb250cm9sPy5pbW11dGFibGUpIHtcbiAgICAgIGNhY2hlQ29udHJvbEhlYWRlcnMucHVzaChDYWNoZUNvbnRyb2wuaW1tdXRhYmxlKCkpO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgQnVja2V0RGVwbG95bWVudCh0aGlzLCBgJHtpZH1EZXBsb3ltZW50YCwge1xuICAgICAgc291cmNlczogW1NvdXJjZS5hc3NldChjb25maWcuc291cmNlKV0sXG4gICAgICBkZXN0aW5hdGlvbkJ1Y2tldDogdGhpcy5idWNrZXQsXG4gICAgICBwcnVuZTogY29uZmlnLnBydW5lID8/IHRydWUsXG4gICAgICAuLi4oY2FjaGVDb250cm9sSGVhZGVycy5sZW5ndGggPiAwICYmIHtcbiAgICAgICAgY2FjaGVDb250cm9sOiBjYWNoZUNvbnRyb2xIZWFkZXJzXG4gICAgICB9KVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRPdXRwdXRzKGlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBzdGFja05hbWUgPSBTdGFjay5vZih0aGlzKS5zdGFja05hbWU7XG5cbiAgICBuZXcgQ2ZuT3V0cHV0KHRoaXMsIGAke2lkfUJ1Y2tldEFybmAsIHtcbiAgICAgIGtleTogYCR7c3RhY2tOYW1lfSR7aWR9QnVja2V0QXJuYCxcbiAgICAgIGV4cG9ydE5hbWU6IGAke3N0YWNrTmFtZX0ke2lkfUJ1Y2tldEFybmAsXG4gICAgICB2YWx1ZTogdGhpcy5idWNrZXQuYnVja2V0QXJuLFxuICAgICAgZGVzY3JpcHRpb246IGBTMyBCdWNrZXQgQVJOIGZvciAke2lkfWBcbiAgICB9KTtcblxuICAgIG5ldyBDZm5PdXRwdXQodGhpcywgYCR7aWR9QnVja2V0TmFtZWAsIHtcbiAgICAgIGtleTogYCR7c3RhY2tOYW1lfSR7aWR9QnVja2V0TmFtZWAsXG4gICAgICBleHBvcnROYW1lOiBgJHtzdGFja05hbWV9JHtpZH1CdWNrZXROYW1lYCxcbiAgICAgIHZhbHVlOiB0aGlzLmJ1Y2tldC5idWNrZXROYW1lLFxuICAgICAgZGVzY3JpcHRpb246IGBTMyBCdWNrZXQgTmFtZSBmb3IgJHtpZH1gXG4gICAgfSk7XG4gIH1cblxuICBnZXRCdWNrZXQoKTogSUJ1Y2tldCB7XG4gICAgcmV0dXJuIHRoaXMuYnVja2V0O1xuICB9XG5cbiAgZ2V0QnVja2V0TmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmJ1Y2tldC5idWNrZXROYW1lO1xuICB9XG5cbiAgZ2V0QnVja2V0QXJuKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuYnVja2V0LmJ1Y2tldEFybjtcbiAgfVxuXG4gIGdldEJ1Y2tldERvbWFpbk5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5idWNrZXQuYnVja2V0RG9tYWluTmFtZTtcbiAgfVxuXG4gIGdldEJ1Y2tldFJlZ2lvbmFsRG9tYWluTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmJ1Y2tldC5idWNrZXRSZWdpb25hbERvbWFpbk5hbWU7XG4gIH1cblxuICBnZXRXZWJzaXRlVXJsKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuYnVja2V0LmJ1Y2tldFdlYnNpdGVVcmw7XG4gIH1cblxuICBnZXREZXBsb3ltZW50KCk6IEJ1Y2tldERlcGxveW1lbnQgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmJ1Y2tldERlcGxveW1lbnQ7XG4gIH1cblxuICBncmFudFJlYWQoZ3JhbnRlZTogSUdyYW50YWJsZSk6IEdyYW50IHtcbiAgICByZXR1cm4gdGhpcy5idWNrZXQuZ3JhbnRSZWFkKGdyYW50ZWUpO1xuICB9XG5cbiAgZ3JhbnRXcml0ZShncmFudGVlOiBJR3JhbnRhYmxlKTogR3JhbnQge1xuICAgIHJldHVybiB0aGlzLmJ1Y2tldC5ncmFudFdyaXRlKGdyYW50ZWUpO1xuICB9XG5cbiAgZ3JhbnRSZWFkV3JpdGUoZ3JhbnRlZTogSUdyYW50YWJsZSk6IEdyYW50IHtcbiAgICByZXR1cm4gdGhpcy5idWNrZXQuZ3JhbnRSZWFkV3JpdGUoZ3JhbnRlZSk7XG4gIH1cblxuICBncmFudERlbGV0ZShncmFudGVlOiBJR3JhbnRhYmxlKTogR3JhbnQge1xuICAgIHJldHVybiB0aGlzLmJ1Y2tldC5ncmFudERlbGV0ZShncmFudGVlKTtcbiAgfVxuXG4gIGdyYW50UHV0KGdyYW50ZWU6IElHcmFudGFibGUpOiBHcmFudCB7XG4gICAgcmV0dXJuIHRoaXMuYnVja2V0LmdyYW50UHV0KGdyYW50ZWUpO1xuICB9XG5cbiAgZ3JhbnRQdWJsaWNBY2Nlc3MoLi4ua2V5UHJlZml4OiBzdHJpbmdbXSk6IEdyYW50IHtcbiAgICByZXR1cm4gdGhpcy5idWNrZXQuZ3JhbnRQdWJsaWNBY2Nlc3MoLi4ua2V5UHJlZml4KTtcbiAgfVxuXG4gIGFkZEV2ZW50Tm90aWZpY2F0aW9uKFxuICAgIGV2ZW50OiBFdmVudFR5cGUsXG4gICAgZGVzdDogSUJ1Y2tldE5vdGlmaWNhdGlvbkRlc3RpbmF0aW9uLFxuICAgIC4uLmZpbHRlcnM6IE5vdGlmaWNhdGlvbktleUZpbHRlcltdXG4gICk6IHZvaWQge1xuICAgIHRoaXMuYnVja2V0LmFkZEV2ZW50Tm90aWZpY2F0aW9uKGV2ZW50LCBkZXN0LCAuLi5maWx0ZXJzKTtcbiAgfVxuXG4gIGFkZE9iamVjdENyZWF0ZWROb3RpZmljYXRpb24oXG4gICAgZGVzdDogSUJ1Y2tldE5vdGlmaWNhdGlvbkRlc3RpbmF0aW9uLFxuICAgIC4uLmZpbHRlcnM6IE5vdGlmaWNhdGlvbktleUZpbHRlcltdXG4gICk6IHZvaWQge1xuICAgIHRoaXMuYnVja2V0LmFkZE9iamVjdENyZWF0ZWROb3RpZmljYXRpb24oZGVzdCwgLi4uZmlsdGVycyk7XG4gIH1cblxuICBhZGRPYmplY3RSZW1vdmVkTm90aWZpY2F0aW9uKFxuICAgIGRlc3Q6IElCdWNrZXROb3RpZmljYXRpb25EZXN0aW5hdGlvbixcbiAgICAuLi5maWx0ZXJzOiBOb3RpZmljYXRpb25LZXlGaWx0ZXJbXVxuICApOiB2b2lkIHtcbiAgICB0aGlzLmJ1Y2tldC5hZGRPYmplY3RSZW1vdmVkTm90aWZpY2F0aW9uKGRlc3QsIC4uLmZpbHRlcnMpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBTdG9yYWdlRmFjdG9yeSB7XG4gIHN0YXRpYyBidWlsZChpZDogc3RyaW5nLCBwcm9wczogU3RvcmFnZUJ1aWxkUHJvcHMgPSB7fSk6IFN0b3JhZ2VGYWN0b3J5Rm4ge1xuICAgIGNvbnN0IHsgc3RhY2tQbGFjZW1lbnQsIC4uLnMzUHJvcHMgfSA9IHByb3BzO1xuICAgIGNvbnN0IGZuOiBTdG9yYWdlRmFjdG9yeUZuID0gKF9hcHA6IEFwcCwgc2NvcGU6IENvbnN0cnVjdCkgPT4ge1xuICAgICAgdmFsaWRhdGVTdG9yYWdlUHJvcHMoczNQcm9wcyk7XG4gICAgICByZXR1cm4gbmV3IFN0b3JhZ2Uoc2NvcGUsIGlkLCBzM1Byb3BzKTtcbiAgICB9O1xuICAgIGlmIChzdGFja1BsYWNlbWVudCkge1xuICAgICAgZm4uc3RhY2tQbGFjZW1lbnQgPSBzdGFja1BsYWNlbWVudDtcbiAgICB9XG4gICAgcmV0dXJuIGZuO1xuICB9XG59XG4iXX0=
|
|
@@ -35,7 +35,7 @@ export declare class Ec2Instance extends Construct implements IConnectable {
|
|
|
35
35
|
* Get the Auto Scaling Group.
|
|
36
36
|
*/
|
|
37
37
|
getAutoScalingGroup(): AutoScalingGroup;
|
|
38
|
-
suspendAutoScaling(
|
|
38
|
+
suspendAutoScaling(_props: Ec2InstanceProps): void;
|
|
39
39
|
}
|
|
40
40
|
export declare class Ec2InstanceStack extends Stack {
|
|
41
41
|
constructor(scope: Construct, id: string, props: Ec2InstanceProps);
|