@ashishpandeyone/cdk-lambda-web-function 0.1.0 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.jsii +1457 -135
- package/.jsii.tabl.json +1 -1
- package/API.md +2349 -238
- package/README.md +133 -7
- package/assets/web-function-deployment/index.js +58 -0
- package/assets/web-function-provider/index.js +23 -23
- package/lib/index.d.ts +3 -0
- package/lib/index.js +4 -1
- package/lib/nodejs-web-function.d.ts +153 -0
- package/lib/nodejs-web-function.js +113 -0
- package/lib/private/bundling.d.ts +68 -0
- package/lib/private/bundling.js +192 -0
- package/lib/private/provider-protocol.d.ts +40 -0
- package/lib/private/provider-protocol.js +9 -2
- package/lib/private/provider.js +2 -2
- package/lib/private/revision-cleanup.d.ts +19 -0
- package/lib/private/revision-cleanup.js +38 -0
- package/lib/private/traffic-shift.d.ts +20 -0
- package/lib/private/traffic-shift.js +143 -0
- package/lib/web-function-deployment.d.ts +89 -0
- package/lib/web-function-deployment.js +90 -0
- package/lib/web-function-endpoint.d.ts +122 -19
- package/lib/web-function-endpoint.js +139 -18
- package/lib/web-function-grants.d.ts +2 -2
- package/lib/web-function-grants.js +4 -4
- package/lib/web-function-revision.d.ts +45 -0
- package/lib/web-function-revision.js +40 -0
- package/lib/web-function.d.ts +60 -25
- package/lib/web-function.js +80 -26
- package/package.json +7 -2
|
@@ -1,5 +1,22 @@
|
|
|
1
|
+
import * as iam from 'aws-cdk-lib/aws-iam';
|
|
1
2
|
import { Construct } from 'constructs';
|
|
2
3
|
import { WebFunctionAuthType, WebFunctionEndpointType } from './enums';
|
|
4
|
+
import type { IWebFunction } from './web-function';
|
|
5
|
+
import type { WebFunctionDeployment } from './web-function-deployment';
|
|
6
|
+
import { WebFunctionGrants } from './web-function-grants';
|
|
7
|
+
import type { IWebFunctionRevision } from './web-function-revision';
|
|
8
|
+
/**
|
|
9
|
+
* A revision and the share of an endpoint's traffic it receives.
|
|
10
|
+
*/
|
|
11
|
+
export interface WebFunctionRevisionWeight {
|
|
12
|
+
/** The revision. */
|
|
13
|
+
readonly revision: IWebFunctionRevision;
|
|
14
|
+
/**
|
|
15
|
+
* The revision's share of the endpoint's traffic, as a fraction (like `lambda.Alias` `additionalVersions`).
|
|
16
|
+
* Must be a whole percentage from 0.01 to 0.99.
|
|
17
|
+
*/
|
|
18
|
+
readonly weight: number;
|
|
19
|
+
}
|
|
3
20
|
/**
|
|
4
21
|
* Options for a Web Function's endpoint.
|
|
5
22
|
*/
|
|
@@ -21,37 +38,95 @@ export interface WebFunctionEndpointOptions {
|
|
|
21
38
|
readonly regions?: string[];
|
|
22
39
|
/**
|
|
23
40
|
* The endpoint's name, shown in logs (`endpointName`) and in the `lambda-web-endpoint-name` header.
|
|
41
|
+
* Names are unique per function.
|
|
24
42
|
*
|
|
25
|
-
* When omitted, the name
|
|
26
|
-
*
|
|
27
|
-
*
|
|
28
|
-
*
|
|
43
|
+
* When omitted, the name ends in a hash of the endpoint type and regions, so changing either deploys
|
|
44
|
+
* a new endpoint cleanly. When set, changing the endpoint type or regions also requires a new name:
|
|
45
|
+
* two endpoints of one function can't share a name, and CloudFormation creates the replacement
|
|
46
|
+
* before deleting the old one.
|
|
29
47
|
*
|
|
30
|
-
* @default - `default-<hash
|
|
48
|
+
* @default - `default-<hash>` for the function's default endpoint, `<id>-<hash>` for endpoints added with `addEndpoint`
|
|
31
49
|
*/
|
|
32
50
|
readonly endpointName?: string;
|
|
51
|
+
/**
|
|
52
|
+
* A description of the endpoint.
|
|
53
|
+
*
|
|
54
|
+
* @default - no description
|
|
55
|
+
*/
|
|
56
|
+
readonly description?: string;
|
|
57
|
+
/**
|
|
58
|
+
* The most requests per second the endpoint accepts; excess requests get HTTP 429.
|
|
59
|
+
* Allowed: 0 (blocks all traffic), 100–1,000 in steps of 100, or 2,000–10,000 in steps of 1,000.
|
|
60
|
+
*
|
|
61
|
+
* Enforced separately in each region the endpoint serves from, so a multi-region endpoint
|
|
62
|
+
* can accept this many requests per second in every region.
|
|
63
|
+
*
|
|
64
|
+
* @default - no limit beyond the service quota of 10,000 requests per second per endpoint (per region)
|
|
65
|
+
*/
|
|
66
|
+
readonly rateLimit?: number;
|
|
67
|
+
/**
|
|
68
|
+
* The most execution environments the endpoint may use (2–10,000). Each one uses 2 vCPUs of the account's quota.
|
|
69
|
+
*
|
|
70
|
+
* Enforced separately in each region the endpoint serves from.
|
|
71
|
+
*
|
|
72
|
+
* @default - scales within the account's vCPU quota
|
|
73
|
+
*/
|
|
74
|
+
readonly maxEnvironments?: number;
|
|
75
|
+
/**
|
|
76
|
+
* How the endpoint moves its traffic to a new revision: all at once, or in steps
|
|
77
|
+
* (`WebFunctionDeployment.canary()` or `linear()`) that watch CloudWatch alarms and move
|
|
78
|
+
* the traffic back when one goes into ALARM.
|
|
79
|
+
*
|
|
80
|
+
* A deployment in steps can't be combined with `revision`, `additionalRevisions` or `routeTraffic()`.
|
|
81
|
+
*
|
|
82
|
+
* @default WebFunctionDeployment.allAtOnce()
|
|
83
|
+
*/
|
|
84
|
+
readonly deployment?: WebFunctionDeployment;
|
|
33
85
|
}
|
|
34
86
|
/**
|
|
35
|
-
*
|
|
87
|
+
* Options for `WebFunction.addEndpoint`.
|
|
36
88
|
*/
|
|
37
|
-
interface
|
|
38
|
-
/**
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
readonly functionArn: string;
|
|
42
|
-
/** ID of the revision the endpoint serves. */
|
|
43
|
-
readonly revisionId: string;
|
|
44
|
-
/** How callers are authenticated. */
|
|
89
|
+
export interface AddWebFunctionEndpointOptions extends WebFunctionEndpointOptions {
|
|
90
|
+
/**
|
|
91
|
+
* How callers of this endpoint are authenticated.
|
|
92
|
+
*/
|
|
45
93
|
readonly authType: WebFunctionAuthType;
|
|
94
|
+
/**
|
|
95
|
+
* The revision the endpoint serves, e.g. an earlier one from `WebFunctionRevision.fromRevisionAttributes`
|
|
96
|
+
* to keep this endpoint on it while others move on. Same as calling `routeTraffic`.
|
|
97
|
+
*
|
|
98
|
+
* @default - the function's current revision (`currentRevision`)
|
|
99
|
+
*/
|
|
100
|
+
readonly revision?: IWebFunctionRevision;
|
|
101
|
+
/**
|
|
102
|
+
* A second revision and its share of the endpoint's traffic; `revision` gets the rest.
|
|
103
|
+
* An endpoint routes to at most two revisions.
|
|
104
|
+
*
|
|
105
|
+
* @default - all traffic goes to `revision`
|
|
106
|
+
*/
|
|
107
|
+
readonly additionalRevisions?: WebFunctionRevisionWeight[];
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Internal: how `WebFunction` creates its endpoints. Not part of the public API.
|
|
111
|
+
*/
|
|
112
|
+
interface WebFunctionEndpointProps extends AddWebFunctionEndpointOptions {
|
|
113
|
+
/** The function that owns the endpoint. */
|
|
114
|
+
readonly webFunction: IWebFunction;
|
|
115
|
+
/** The function's current revision, served unless `revision` is given. */
|
|
116
|
+
readonly currentRevision: IWebFunctionRevision;
|
|
117
|
+
/** Prefix of the generated endpoint name. */
|
|
118
|
+
readonly namePrefix: string;
|
|
119
|
+
/** Extra input to the generated name's hash (the construct ID of an added endpoint). */
|
|
120
|
+
readonly nameSeed?: string;
|
|
46
121
|
}
|
|
47
122
|
/**
|
|
48
|
-
*
|
|
123
|
+
* An HTTPS endpoint of a Web Function: `fn.endpoint` (the default one) or the result of `fn.addEndpoint()`.
|
|
49
124
|
*
|
|
50
|
-
*
|
|
125
|
+
* Endpoints are created only through `WebFunction`, which owns their log groups in every region, so the constructor is private.
|
|
51
126
|
*/
|
|
52
127
|
export declare class WebFunctionEndpoint extends Construct {
|
|
53
128
|
/**
|
|
54
|
-
* Creates
|
|
129
|
+
* Creates an endpoint of a Web Function. Used by `WebFunction`.
|
|
55
130
|
*
|
|
56
131
|
* @internal
|
|
57
132
|
*/
|
|
@@ -62,6 +137,8 @@ export declare class WebFunctionEndpoint extends Construct {
|
|
|
62
137
|
readonly endpointArn: string;
|
|
63
138
|
/** Where the endpoint serves traffic from. */
|
|
64
139
|
readonly endpointType: WebFunctionEndpointType;
|
|
140
|
+
/** How callers of the endpoint are authenticated. */
|
|
141
|
+
readonly authType: WebFunctionAuthType;
|
|
65
142
|
/** Every region the endpoint serves from: the home region first, then the others in alphabetical order. */
|
|
66
143
|
readonly regions: string[];
|
|
67
144
|
/**
|
|
@@ -72,9 +149,14 @@ export declare class WebFunctionEndpoint extends Construct {
|
|
|
72
149
|
* The endpoint's URL: the global URL for `MULTI_REGION`, otherwise the home region's.
|
|
73
150
|
*/
|
|
74
151
|
readonly url: string;
|
|
152
|
+
/** Grants on this endpoint (e.g. `grants.invoke(principal)`). */
|
|
153
|
+
readonly grants: WebFunctionGrants;
|
|
75
154
|
private readonly homeRegion;
|
|
76
|
-
private readonly
|
|
77
|
-
private readonly
|
|
155
|
+
private readonly webFunction;
|
|
156
|
+
private readonly resource;
|
|
157
|
+
private weights;
|
|
158
|
+
private routed;
|
|
159
|
+
private readonly gradual;
|
|
78
160
|
private lookup?;
|
|
79
161
|
private constructor();
|
|
80
162
|
/**
|
|
@@ -83,5 +165,26 @@ export declare class WebFunctionEndpoint extends Construct {
|
|
|
83
165
|
* @param region one of `regions`
|
|
84
166
|
*/
|
|
85
167
|
regionalUrl(region: string): string;
|
|
168
|
+
/**
|
|
169
|
+
* Routes the endpoint to `revision` instead of the function's current revision, optionally sharing
|
|
170
|
+
* traffic with one more revision (`additionalRevisions`, which gets its weight; `revision` gets the rest).
|
|
171
|
+
*
|
|
172
|
+
* Use it to keep an endpoint on an earlier revision (`WebFunctionRevision.fromRevisionAttributes`),
|
|
173
|
+
* or to send part of the traffic to the current revision:
|
|
174
|
+
* `fn.endpoint.routeTraffic(previous, [{ revision: fn.currentRevision, weight: 0.1 }])`.
|
|
175
|
+
* Can be called once per endpoint, and not on one created with `revision` or `additionalRevisions`.
|
|
176
|
+
*/
|
|
177
|
+
routeTraffic(revision: IWebFunctionRevision, additionalRevisions?: WebFunctionRevisionWeight[]): void;
|
|
178
|
+
/**
|
|
179
|
+
* The IDs of the revisions this endpoint routes to.
|
|
180
|
+
*
|
|
181
|
+
* @internal
|
|
182
|
+
*/
|
|
183
|
+
_revisionIds(): string[];
|
|
184
|
+
/**
|
|
185
|
+
* Allows `grantee` to call this endpoint. Shortcut for `grants.invoke(grantee)`.
|
|
186
|
+
* [disable-awslint:no-grants]
|
|
187
|
+
*/
|
|
188
|
+
grantInvoke(grantee: iam.IGrantable): iam.Grant;
|
|
86
189
|
}
|
|
87
190
|
export {};
|
|
@@ -41,16 +41,18 @@ const lambda = __importStar(require("aws-cdk-lib/aws-lambda"));
|
|
|
41
41
|
const constructs_1 = require("constructs");
|
|
42
42
|
const enums_1 = require("./enums");
|
|
43
43
|
const endpoint_lookup_1 = require("./private/endpoint-lookup");
|
|
44
|
+
const traffic_shift_1 = require("./private/traffic-shift");
|
|
44
45
|
const validation_1 = require("./private/validation");
|
|
46
|
+
const web_function_grants_1 = require("./web-function-grants");
|
|
45
47
|
/**
|
|
46
|
-
*
|
|
48
|
+
* An HTTPS endpoint of a Web Function: `fn.endpoint` (the default one) or the result of `fn.addEndpoint()`.
|
|
47
49
|
*
|
|
48
|
-
*
|
|
50
|
+
* Endpoints are created only through `WebFunction`, which owns their log groups in every region, so the constructor is private.
|
|
49
51
|
*/
|
|
50
52
|
class WebFunctionEndpoint extends constructs_1.Construct {
|
|
51
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "@ashishpandeyone/cdk-lambda-web-function.WebFunctionEndpoint", version: "0.1.
|
|
53
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@ashishpandeyone/cdk-lambda-web-function.WebFunctionEndpoint", version: "0.1.2" };
|
|
52
54
|
/**
|
|
53
|
-
* Creates
|
|
55
|
+
* Creates an endpoint of a Web Function. Used by `WebFunction`.
|
|
54
56
|
*
|
|
55
57
|
* @internal
|
|
56
58
|
*/
|
|
@@ -63,6 +65,8 @@ class WebFunctionEndpoint extends constructs_1.Construct {
|
|
|
63
65
|
endpointArn;
|
|
64
66
|
/** Where the endpoint serves traffic from. */
|
|
65
67
|
endpointType;
|
|
68
|
+
/** How callers of the endpoint are authenticated. */
|
|
69
|
+
authType;
|
|
66
70
|
/** Every region the endpoint serves from: the home region first, then the others in alphabetical order. */
|
|
67
71
|
regions;
|
|
68
72
|
/**
|
|
@@ -73,15 +77,22 @@ class WebFunctionEndpoint extends constructs_1.Construct {
|
|
|
73
77
|
* The endpoint's URL: the global URL for `MULTI_REGION`, otherwise the home region's.
|
|
74
78
|
*/
|
|
75
79
|
url;
|
|
80
|
+
/** Grants on this endpoint (e.g. `grants.invoke(principal)`). */
|
|
81
|
+
grants;
|
|
76
82
|
homeRegion;
|
|
77
|
-
|
|
78
|
-
|
|
83
|
+
webFunction;
|
|
84
|
+
resource;
|
|
85
|
+
weights;
|
|
86
|
+
routed = false;
|
|
87
|
+
gradual;
|
|
79
88
|
lookup;
|
|
80
89
|
constructor(scope, id, props) {
|
|
81
90
|
super(scope, id);
|
|
82
91
|
const homeRegion = aws_cdk_lib_1.Stack.of(this).region;
|
|
83
92
|
const endpointType = props.endpointType ?? enums_1.WebFunctionEndpointType.HOME_REGION;
|
|
84
93
|
const extraRegions = normaliseRegions(this, endpointType, homeRegion, props.regions ?? []);
|
|
94
|
+
validateRateLimit(this, props.rateLimit);
|
|
95
|
+
validateMaxEnvironments(this, props.maxEnvironments);
|
|
85
96
|
if (props.endpointName !== undefined) {
|
|
86
97
|
(0, validation_1.assertResourceName)(this, 'endpointName', props.endpointName);
|
|
87
98
|
aws_cdk_lib_1.Annotations.of(this).addWarningV2('@cdk-lambda-web:explicitEndpointName', `endpointName '${props.endpointName}' is set explicitly: changing endpointType or regions later also requires a new endpointName, otherwise the deployment fails with "already exists" (the stack rolls back safely). Omit endpointName to get a name that changes automatically.`);
|
|
@@ -90,23 +101,55 @@ class WebFunctionEndpoint extends constructs_1.Construct {
|
|
|
90
101
|
aws_cdk_lib_1.Annotations.of(this).addWarningV2('@cdk-lambda-web:authTypeNone', 'authType NONE makes the endpoint public: Lambda does no authentication, so your application must authenticate requests itself.');
|
|
91
102
|
}
|
|
92
103
|
this.endpointType = endpointType;
|
|
93
|
-
this.
|
|
104
|
+
this.authType = props.authType;
|
|
105
|
+
this.endpointName = props.endpointName ?? defaultEndpointName(props.namePrefix, props.nameSeed, endpointType, extraRegions);
|
|
94
106
|
this.regions = [homeRegion, ...extraRegions];
|
|
95
107
|
this.homeRegion = homeRegion;
|
|
96
|
-
this.
|
|
97
|
-
this.
|
|
108
|
+
this.webFunction = props.webFunction;
|
|
109
|
+
this.weights = [{ revisionId: props.currentRevision.revisionId, weight: 100 }];
|
|
98
110
|
const resource = new lambda.CfnWebFunctionEndpoint(this, 'Resource', {
|
|
99
|
-
functionName: props.
|
|
111
|
+
functionName: props.webFunction.webFunctionArn,
|
|
100
112
|
endpointName: this.endpointName,
|
|
101
113
|
endpointType,
|
|
102
114
|
authType: props.authType,
|
|
115
|
+
description: props.description,
|
|
103
116
|
regions: extraRegions.length > 0 ? extraRegions : undefined,
|
|
104
|
-
revisionWeights:
|
|
117
|
+
revisionWeights: this.weights,
|
|
118
|
+
throttleConfig: props.rateLimit !== undefined ? { rateLimit: props.rateLimit } : undefined,
|
|
119
|
+
scalingConfig: props.maxEnvironments !== undefined ? { maxEnvironments: props.maxEnvironments } : undefined,
|
|
105
120
|
});
|
|
106
121
|
aws_cdk_lib_1.Validations.of(resource).acknowledge(validation_1.CFN_VALIDATE_UNKNOWN_TYPE);
|
|
122
|
+
this.resource = resource;
|
|
123
|
+
this.gradual = props.deployment?._gradual ?? false;
|
|
124
|
+
if (props.deployment?._gradual) {
|
|
125
|
+
if (props.revision !== undefined || props.additionalRevisions !== undefined) {
|
|
126
|
+
throw new Error(`${this.node.path}: an endpoint with a ${props.deployment._kind} deployment always moves to the current revision; it can't also set revision or additionalRevisions`);
|
|
127
|
+
}
|
|
128
|
+
// Moves the traffic in steps before CloudFormation writes the endpoint, which then finds it already done.
|
|
129
|
+
const shift = new traffic_shift_1.TrafficShift(this, 'Deployment', {
|
|
130
|
+
functionName: props.webFunction.webFunctionName,
|
|
131
|
+
functionArn: props.webFunction.webFunctionArn,
|
|
132
|
+
endpointName: this.endpointName,
|
|
133
|
+
revisionId: props.currentRevision.revisionId,
|
|
134
|
+
deployment: props.deployment,
|
|
135
|
+
endpointConfig: {
|
|
136
|
+
endpointType,
|
|
137
|
+
authType: props.authType,
|
|
138
|
+
description: props.description,
|
|
139
|
+
regions: extraRegions,
|
|
140
|
+
rateLimit: props.rateLimit,
|
|
141
|
+
maxEnvironments: props.maxEnvironments,
|
|
142
|
+
},
|
|
143
|
+
});
|
|
144
|
+
resource.node.addDependency(shift);
|
|
145
|
+
}
|
|
146
|
+
if (props.revision !== undefined || props.additionalRevisions !== undefined) {
|
|
147
|
+
this.routeTraffic(props.revision ?? props.currentRevision, props.additionalRevisions);
|
|
148
|
+
}
|
|
107
149
|
this.endpointArn = resource.attrEndpointArn;
|
|
108
150
|
this.domainName = resource.attrDomainName;
|
|
109
151
|
this.url = `https://${resource.attrDomainName}`;
|
|
152
|
+
this.grants = web_function_grants_1.WebFunctionGrants._forEndpoint(this);
|
|
110
153
|
}
|
|
111
154
|
/**
|
|
112
155
|
* The URL of this endpoint in one region. Only for `PER_REGION` endpoints.
|
|
@@ -124,13 +167,48 @@ class WebFunctionEndpoint extends constructs_1.Construct {
|
|
|
124
167
|
return this.url;
|
|
125
168
|
}
|
|
126
169
|
this.lookup ??= new endpoint_lookup_1.EndpointLookup(this, 'Lookup', {
|
|
127
|
-
functionName: this.
|
|
128
|
-
functionArn: this.
|
|
170
|
+
functionName: this.webFunction.webFunctionName,
|
|
171
|
+
functionArn: this.webFunction.webFunctionArn,
|
|
129
172
|
endpointName: this.endpointName,
|
|
130
173
|
endpointArn: this.endpointArn,
|
|
131
174
|
});
|
|
132
175
|
return `https://${this.lookup.regionalDomain(region)}`;
|
|
133
176
|
}
|
|
177
|
+
/**
|
|
178
|
+
* Routes the endpoint to `revision` instead of the function's current revision, optionally sharing
|
|
179
|
+
* traffic with one more revision (`additionalRevisions`, which gets its weight; `revision` gets the rest).
|
|
180
|
+
*
|
|
181
|
+
* Use it to keep an endpoint on an earlier revision (`WebFunctionRevision.fromRevisionAttributes`),
|
|
182
|
+
* or to send part of the traffic to the current revision:
|
|
183
|
+
* `fn.endpoint.routeTraffic(previous, [{ revision: fn.currentRevision, weight: 0.1 }])`.
|
|
184
|
+
* Can be called once per endpoint, and not on one created with `revision` or `additionalRevisions`.
|
|
185
|
+
*/
|
|
186
|
+
routeTraffic(revision, additionalRevisions) {
|
|
187
|
+
if (this.gradual) {
|
|
188
|
+
throw new Error(`${this.node.path}: the endpoint has a deployment in steps, which always moves it to the current revision; routeTraffic() can't be used with it`);
|
|
189
|
+
}
|
|
190
|
+
if (this.routed) {
|
|
191
|
+
throw new Error(`${this.node.path}: the endpoint's revisions are already set (revision, additionalRevisions or routeTraffic)`);
|
|
192
|
+
}
|
|
193
|
+
this.weights = revisionWeights(this, this.webFunction, revision, additionalRevisions ?? []);
|
|
194
|
+
this.resource.revisionWeights = this.weights;
|
|
195
|
+
this.routed = true;
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* The IDs of the revisions this endpoint routes to.
|
|
199
|
+
*
|
|
200
|
+
* @internal
|
|
201
|
+
*/
|
|
202
|
+
_revisionIds() {
|
|
203
|
+
return this.weights.map((w) => w.revisionId);
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Allows `grantee` to call this endpoint. Shortcut for `grants.invoke(grantee)`.
|
|
207
|
+
* [disable-awslint:no-grants]
|
|
208
|
+
*/
|
|
209
|
+
grantInvoke(grantee) {
|
|
210
|
+
return this.grants.invoke(grantee);
|
|
211
|
+
}
|
|
134
212
|
}
|
|
135
213
|
exports.WebFunctionEndpoint = WebFunctionEndpoint;
|
|
136
214
|
function normaliseRegions(scope, endpointType, homeRegion, regions) {
|
|
@@ -156,9 +234,52 @@ function normaliseRegions(scope, endpointType, homeRegion, regions) {
|
|
|
156
234
|
}
|
|
157
235
|
return extra;
|
|
158
236
|
}
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
237
|
+
function validateRateLimit(scope, rateLimit) {
|
|
238
|
+
if (rateLimit === undefined || aws_cdk_lib_1.Token.isUnresolved(rateLimit))
|
|
239
|
+
return;
|
|
240
|
+
const allowed = rateLimit === 0
|
|
241
|
+
|| (rateLimit >= 100 && rateLimit <= 1000 && rateLimit % 100 === 0)
|
|
242
|
+
|| (rateLimit >= 2000 && rateLimit <= 10000 && rateLimit % 1000 === 0);
|
|
243
|
+
if (!allowed) {
|
|
244
|
+
throw new Error(`${scope.node.path}: rateLimit must be 0, 100-1,000 in steps of 100, or 2,000-10,000 in steps of 1,000, got ${rateLimit}`);
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
function validateMaxEnvironments(scope, maxEnvironments) {
|
|
248
|
+
if (maxEnvironments === undefined || aws_cdk_lib_1.Token.isUnresolved(maxEnvironments))
|
|
249
|
+
return;
|
|
250
|
+
if (!Number.isInteger(maxEnvironments) || maxEnvironments < 2 || maxEnvironments > 10000) {
|
|
251
|
+
throw new Error(`${scope.node.path}: maxEnvironments must be an integer from 2 to 10,000, got ${maxEnvironments}`);
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
/** `primary` gets what `additional` leaves; weights are whole percentages summing to 100. */
|
|
255
|
+
function revisionWeights(scope, webFunction, primary, additional) {
|
|
256
|
+
for (const r of [primary, ...additional.map((a) => a.revision)]) {
|
|
257
|
+
if (r.webFunction !== webFunction) {
|
|
258
|
+
throw new Error(`${scope.node.path}: revision ${r.revisionId} belongs to another function`);
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
if (additional.length === 0) {
|
|
262
|
+
return [{ revisionId: primary.revisionId, weight: 100 }];
|
|
263
|
+
}
|
|
264
|
+
if (additional.length > 1) {
|
|
265
|
+
throw new Error(`${scope.node.path}: an endpoint routes to at most two revisions, so additionalRevisions takes one`);
|
|
266
|
+
}
|
|
267
|
+
const [{ revision, weight }] = additional;
|
|
268
|
+
const percent = Math.round(weight * 100);
|
|
269
|
+
if (aws_cdk_lib_1.Token.isUnresolved(weight) || Math.abs(weight * 100 - percent) > 1e-9 || percent < 1 || percent > 99) {
|
|
270
|
+
throw new Error(`${scope.node.path}: an additional revision's weight must be a whole percentage from 0.01 to 0.99, got ${weight}`);
|
|
271
|
+
}
|
|
272
|
+
if (revision === primary || (!aws_cdk_lib_1.Token.isUnresolved(revision.revisionId) && revision.revisionId === primary.revisionId)) {
|
|
273
|
+
throw new Error(`${scope.node.path}: the additional revision is the same as the endpoint's revision`);
|
|
274
|
+
}
|
|
275
|
+
return [{ revisionId: primary.revisionId, weight: 100 - percent }, { revisionId: revision.revisionId, weight: percent }];
|
|
276
|
+
}
|
|
277
|
+
/**
|
|
278
|
+
* `<prefix>-<hash>`, with the hash covering the endpoint type and regions: a type or region change produces
|
|
279
|
+
* a new name, so the replacement doesn't collide with the endpoint it replaces.
|
|
280
|
+
*/
|
|
281
|
+
function defaultEndpointName(prefix, seed, endpointType, extraRegions) {
|
|
282
|
+
const hash = (0, node_crypto_1.createHash)('sha256').update([...(seed !== undefined ? [seed] : []), endpointType, ...extraRegions].join(',')).digest('hex').slice(0, 8);
|
|
283
|
+
return `${prefix}-${hash}`;
|
|
163
284
|
}
|
|
164
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2ViLWZ1bmN0aW9uLWVuZHBvaW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3dlYi1mdW5jdGlvbi1lbmRwb2ludC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsNkNBQXlDO0FBQ3pDLDZDQUFxRTtBQUNyRSwrREFBaUQ7QUFDakQsMkNBQXVDO0FBQ3ZDLG1DQUF1RTtBQUN2RSwrREFBMkQ7QUFDM0QscURBQXFGO0FBcURyRjs7OztHQUlHO0FBQ0gsTUFBYSxtQkFBb0IsU0FBUSxzQkFBUzs7SUFDaEQ7Ozs7T0FJRztJQUNJLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBK0I7UUFDakYsT0FBTyxJQUFJLG1CQUFtQixDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDbkQsQ0FBQztJQUVELDJCQUEyQjtJQUNYLFlBQVksQ0FBUztJQUVyQywwQkFBMEI7SUFDVixXQUFXLENBQVM7SUFFcEMsOENBQThDO0lBQzlCLFlBQVksQ0FBMEI7SUFFdEQsMkdBQTJHO0lBQzNGLE9BQU8sQ0FBVztJQUVsQzs7T0FFRztJQUNhLFVBQVUsQ0FBUztJQUVuQzs7T0FFRztJQUNhLEdBQUcsQ0FBUztJQUVYLFVBQVUsQ0FBUztJQUNuQixZQUFZLENBQVM7SUFDckIsV0FBVyxDQUFTO0lBQzdCLE1BQU0sQ0FBa0I7SUFFaEMsWUFBb0IsS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBK0I7UUFDL0UsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQixNQUFNLFVBQVUsR0FBRyxtQkFBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUM7UUFDekMsTUFBTSxZQUFZLEdBQUcsS0FBSyxDQUFDLFlBQVksSUFBSSwrQkFBdUIsQ0FBQyxXQUFXLENBQUM7UUFDL0UsTUFBTSxZQUFZ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cnQgeyBBbm5vdGF0aW9ucywgU3RhY2ssIFRva2VuLCBWYWxpZGF0aW9ucyB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCAqIGFzIGxhbWJkYSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtbGFtYmRhJztcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHsgV2ViRnVuY3Rpb25BdXRoVHlwZSwgV2ViRnVuY3Rpb25FbmRwb2ludFR5cGUgfSBmcm9tICcuL2VudW1zJztcbmltcG9ydCB7IEVuZHBvaW50TG9va3VwIH0gZnJvbSAnLi9wcml2YXRlL2VuZHBvaW50LWxvb2t1cCc7XG5pbXBvcnQgeyBDRk5fVkFMSURBVEVfVU5LTk9XTl9UWVBFLCBhc3NlcnRSZXNvdXJjZU5hbWUgfSBmcm9tICcuL3ByaXZhdGUvdmFsaWRhdGlvbic7XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgYSBXZWIgRnVuY3Rpb24ncyBlbmRwb2ludC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXZWJGdW5jdGlvbkVuZHBvaW50T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBXaGVyZSB0aGUgZW5kcG9pbnQgc2VydmVzIHRyYWZmaWMgZnJvbS5cbiAgICpcbiAgICogQGRlZmF1bHQgV2ViRnVuY3Rpb25FbmRwb2ludFR5cGUuSE9NRV9SRUdJT05cbiAgICovXG4gIHJlYWRvbmx5IGVuZHBvaW50VHlwZT86IFdlYkZ1bmN0aW9uRW5kcG9pbnRUeXBlO1xuXG4gIC8qKlxuICAgKiBSZWdpb25zIHRvIHNlcnZlIGZyb20gaW4gYWRkaXRpb24gdG8gdGhlIGhvbWUgcmVnaW9uICh0aGUgc3RhY2sncyByZWdpb24pLlxuICAgKiBSZXF1aXJlZCAoYXQgbGVhc3Qgb25lKSBmb3IgYE1VTFRJX1JFR0lPTmAgYW5kIGBQRVJfUkVHSU9OYDsgbXVzdCBiZSBlbXB0eSBmb3IgYEhPTUVfUkVHSU9OYC5cbiAgICpcbiAgICogQ2hhbmdpbmcgdGhpcyBjcmVhdGVzIGEgbmV3IGVuZHBvaW50IHdpdGggYSBuZXcgVVJMLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIGV4dHJhIHJlZ2lvbnNcbiAgICovXG4gIHJlYWRvbmx5IHJlZ2lvbnM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogVGhlIGVuZHBvaW50J3MgbmFtZSwgc2hvd24gaW4gbG9ncyAoYGVuZHBvaW50TmFtZWApIGFuZCBpbiB0aGUgYGxhbWJkYS13ZWItZW5kcG9pbnQtbmFtZWAgaGVhZGVyLlxuICAgKlxuICAgKiBXaGVuIG9taXR0ZWQsIHRoZSBuYW1lIGlzIGBkZWZhdWx0LTxoYXNoPmAsIHdpdGggdGhlIGhhc2ggY292ZXJpbmcgdGhlIGVuZHBvaW50IHR5cGUgYW5kIHJlZ2lvbnMsXG4gICAqIHNvIGNoYW5naW5nIGVpdGhlciBkZXBsb3lzIGEgbmV3IGVuZHBvaW50IGNsZWFubHkuIFdoZW4gc2V0LCBjaGFuZ2luZyB0aGUgZW5kcG9pbnQgdHlwZSBvclxuICAgKiByZWdpb25zIGFsc28gcmVxdWlyZXMgYSBuZXcgbmFtZTogdHdvIGVuZHBvaW50cyBvZiBvbmUgZnVuY3Rpb24gY2FuJ3Qgc2hhcmUgYSBuYW1lLCBhbmRcbiAgICogQ2xvdWRGb3JtYXRpb24gY3JlYXRlcyB0aGUgcmVwbGFjZW1lbnQgYmVmb3JlIGRlbGV0aW5nIHRoZSBvbGQgb25lLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGBkZWZhdWx0LTxoYXNoIG9mIHR5cGUgYW5kIHJlZ2lvbnM+YFxuICAgKi9cbiAgcmVhZG9ubHkgZW5kcG9pbnROYW1lPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEludGVybmFsOiBob3cgYFdlYkZ1bmN0aW9uYCBjcmVhdGVzIGl0cyBlbmRwb2ludC4gTm90IHBhcnQgb2YgdGhlIHB1YmxpYyBBUEkuXG4gKi9cbmludGVyZmFjZSBXZWJGdW5jdGlvbkVuZHBvaW50UHJvcHMgZXh0ZW5kcyBXZWJGdW5jdGlvbkVuZHBvaW50T3B0aW9ucyB7XG4gIC8qKiBMaXRlcmFsIG5hbWUgb2YgdGhlIFdlYiBGdW5jdGlvbiAodGhlIHByb3ZpZGVyJ3MgSUFNIG11c3Qgbm90IHJlZmVyZW5jZSByZXNvdXJjZSBhdHRyaWJ1dGVzKS4gKi9cbiAgcmVhZG9ubHkgZnVuY3Rpb25OYW1lOiBzdHJpbmc7XG5cbiAgLyoqIFRoZSBXZWIgRnVuY3Rpb24ncyBBUk4uICovXG4gIHJlYWRvbmx5IGZ1bmN0aW9uQXJuOiBzdHJpbmc7XG5cbiAgLyoqIElEIG9mIHRoZSByZXZpc2lvbiB0aGUgZW5kcG9pbnQgc2VydmVzLiAqL1xuICByZWFkb25seSByZXZpc2lvbklkOiBzdHJpbmc7XG5cbiAgLyoqIEhvdyBjYWxsZXJzIGFyZSBhdXRoZW50aWNhdGVkLiAqL1xuICByZWFkb25seSBhdXRoVHlwZTogV2ViRnVuY3Rpb25BdXRoVHlwZTtcbn1cblxuLyoqXG4gKiBUaGUgSFRUUFMgZW5kcG9pbnQgb2YgYSBXZWIgRnVuY3Rpb24uIENyZWF0ZWQgYnkgYFdlYkZ1bmN0aW9uYDsgYWNjZXNzIGl0IGFzIGBmbi5lbmRwb2ludGAuXG4gKlxuICogT25seSBgV2ViRnVuY3Rpb25gIGNyZWF0ZXMgZW5kcG9pbnRzIGluIHRoaXMgdmVyc2lvbiAob25lIHBlciBmdW5jdGlvbiksIHNvIHRoZSBjb25zdHJ1Y3RvciBpcyBwcml2YXRlLlxuICovXG5leHBvcnQgY2xhc3MgV2ViRnVuY3Rpb25FbmRwb2ludCBleHRlbmRzIENvbnN0cnVjdCB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIHRoZSBlbmRwb2ludCBvZiBhIFdlYiBGdW5jdGlvbi4gVXNlZCBieSBgV2ViRnVuY3Rpb25gLlxuICAgKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgX2NyZWF0ZShzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogV2ViRnVuY3Rpb25FbmRwb2ludFByb3BzKTogV2ViRnVuY3Rpb25FbmRwb2ludCB7XG4gICAgcmV0dXJuIG5ldyBXZWJGdW5jdGlvbkVuZHBvaW50KHNjb3BlLCBpZCwgcHJvcHMpO1xuICB9XG5cbiAgLyoqIFRoZSBlbmRwb2ludCdzIG5hbWUuICovXG4gIHB1YmxpYyByZWFkb25seSBlbmRwb2ludE5hbWU6IHN0cmluZztcblxuICAvKiogVGhlIGVuZHBvaW50J3MgQVJOLiAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZW5kcG9pbnRBcm46IHN0cmluZztcblxuICAvKiogV2hlcmUgdGhlIGVuZHBvaW50IHNlcnZlcyB0cmFmZmljIGZyb20uICovXG4gIHB1YmxpYyByZWFkb25seSBlbmRwb2ludFR5cGU6IFdlYkZ1bmN0aW9uRW5kcG9pbnRUeXBlO1xuXG4gIC8qKiBFdmVyeSByZWdpb24gdGhlIGVuZHBvaW50IHNlcnZlcyBmcm9tOiB0aGUgaG9tZSByZWdpb24gZmlyc3QsIHRoZW4gdGhlIG90aGVycyBpbiBhbHBoYWJldGljYWwgb3JkZXIuICovXG4gIHB1YmxpYyByZWFkb25seSByZWdpb25zOiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogVGhlIGVuZHBvaW50J3MgZG9tYWluIG5hbWU6IHRoZSBnbG9iYWwgZG9tYWluIGZvciBgTVVMVElfUkVHSU9OYCwgb3RoZXJ3aXNlIHRoZSBob21lIHJlZ2lvbidzLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGRvbWFpbk5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGVuZHBvaW50J3MgVVJMOiB0aGUgZ2xvYmFsIFVSTCBmb3IgYE1VTFRJX1JFR0lPTmAsIG90aGVyd2lzZSB0aGUgaG9tZSByZWdpb24ncy5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB1cmw6IHN0cmluZztcblxuICBwcml2YXRlIHJlYWRvbmx5IGhvbWVSZWdpb246IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBmdW5jdGlvbk5hbWU6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBmdW5jdGlvbkFybjogc3RyaW5nO1xuICBwcml2YXRlIGxvb2t1cD86IEVuZHBvaW50TG9va3VwO1xuXG4gIHByaXZhdGUgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IFdlYkZ1bmN0aW9uRW5kcG9pbnRQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICBjb25zdCBob21lUmVnaW9uID0gU3RhY2sub2YodGhpcykucmVnaW9uO1xuICAgIGNvbnN0IGVuZHBvaW50VHlwZSA9IHByb3BzLmVuZHBvaW50VHlwZSA/PyBXZWJGdW5jdGlvbkVuZHBvaW50VHlwZS5IT01FX1JFR0lPTjtcbiAgICBjb25zdCBleHRyYVJlZ2lvbnMgPSBub3JtYWxpc2VSZWdpb25zKHRoaXMsIGVuZHBvaW50VHlwZSwgaG9tZVJlZ2lvbiwgcHJvcHMucmVnaW9ucyA/PyBbXSk7XG5cbiAgICBpZiAocHJvcHMuZW5kcG9pbnROYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGFzc2VydFJlc291cmNlTmFtZSh0aGlzLCAnZW5kcG9pbnROYW1lJywgcHJvcHMuZW5kcG9pbnROYW1lKTtcbiAgICAgIEFubm90YXRpb25zLm9mKHRoaXMpLmFkZFdhcm5pbmdWMignQGNkay1sYW1iZGEtd2ViOmV4cGxpY2l0RW5kcG9pbnROYW1lJyxcbiAgICAgICAgYGVuZHBvaW50TmFtZSAnJHtwcm9wcy5lbmRwb2ludE5hbWV9JyBpcyBzZXQgZXhwbGljaXRseTogY2hhbmdpbmcgZW5kcG9pbnRUeXBlIG9yIHJlZ2lvbnMgbGF0ZXIgYWxzbyByZXF1aXJlcyBhIG5ldyBlbmRwb2ludE5hbWUsIG90aGVyd2lzZSB0aGUgZGVwbG95bWVudCBmYWlscyB3aXRoIFwiYWxyZWFkeSBleGlzdHNcIiAodGhlIHN0YWNrIHJvbGxzIGJhY2sgc2FmZWx5KS4gT21pdCBlbmRwb2ludE5hbWUgdG8gZ2V0IGEgbmFtZSB0aGF0IGNoYW5nZXMgYXV0b21hdGljYWxseS5gKTtcbiAgICB9XG4gICAgaWYgKHByb3BzLmF1dGhUeXBlID09PSBXZWJGdW5jdGlvbkF1dGhUeXBlLk5PTkUpIHtcbiAgICAgIEFubm90YXRpb25zLm9mKHRoaXMpLmFkZFdhcm5pbmdWMignQGNkay1sYW1iZGEtd2ViOmF1dGhUeXBlTm9uZScsXG4gICAgICAgICdhdXRoVHlwZSBOT05FIG1ha2VzIHRoZSBlbmRwb2ludCBwdWJsaWM6IExhbWJkYSBkb2VzIG5vIGF1dGhlbnRpY2F0aW9uLCBzbyB5b3VyIGFwcGxpY2F0aW9uIG11c3QgYXV0aGVudGljYXRlIHJlcXVlc3RzIGl0c2VsZi4nKTtcbiAgICB9XG5cbiAgICB0aGlzLmVuZHBvaW50VHlwZSA9IGVuZHBvaW50VHlwZTtcbiAgICB0aGlzLmVuZHBvaW50TmFtZSA9IHByb3BzLmVuZHBvaW50TmFtZSA/PyBkZWZhdWx0RW5kcG9pbnROYW1lKGVuZHBvaW50VHlwZSwgZXh0cmFSZWdpb25zKTtcbiAgICB0aGlzLnJlZ2lvbnMgPSBbaG9tZVJlZ2lvbiwgLi4uZXh0cmFSZWdpb25zXTtcbiAgICB0aGlzLmhvbWVSZWdpb24gPSBob21lUmVnaW9uO1xuICAgIHRoaXMuZnVuY3Rpb25OYW1lID0gcHJvcHMuZnVuY3Rpb25OYW1lO1xuICAgIHRoaXMuZnVuY3Rpb25Bcm4gPSBwcm9wcy5mdW5jdGlvbkFybjtcblxuICAgIGNvbnN0IHJlc291cmNlID0gbmV3IGxhbWJkYS5DZm5XZWJGdW5jdGlvbkVuZHBvaW50KHRoaXMsICdSZXNvdXJjZScsIHtcbiAgICAgIGZ1bmN0aW9uTmFtZTogcHJvcHMuZnVuY3Rpb25Bcm4sXG4gICAgICBlbmRwb2ludE5hbWU6IHRoaXMuZW5kcG9pbnROYW1lLFxuICAgICAgZW5kcG9pbnRUeXBlLFxuICAgICAgYXV0aFR5cGU6IHByb3BzLmF1dGhUeXBlLFxuICAgICAgcmVnaW9uczogZXh0cmFSZWdpb25zLmxlbmd0aCA+IDAgPyBleHRyYVJlZ2lvbnMgOiB1bmRlZmluZWQsXG4gICAgICByZXZpc2lvbldlaWdodHM6IFt7IHJldmlzaW9uSWQ6IHByb3BzLnJldmlzaW9uSWQsIHdlaWdodDogMTAwIH1dLFxuICAgIH0pO1xuICAgIFZhbGlkYXRpb25zLm9mKHJlc291cmNlKS5hY2tub3dsZWRnZShDRk5fVkFMSURBVEVfVU5LTk9XTl9UWVBFKTtcblxuICAgIHRoaXMuZW5kcG9pbnRBcm4gPSByZXNvdXJjZS5hdHRyRW5kcG9pbnRBcm47XG4gICAgdGhpcy5kb21haW5OYW1lID0gcmVzb3VyY2UuYXR0ckRvbWFpbk5hbWU7XG4gICAgdGhpcy51cmwgPSBgaHR0cHM6Ly8ke3Jlc291cmNlLmF0dHJEb21haW5OYW1lfWA7XG4gIH1cblxuICAvKipcbiAgICogVGhlIFVSTCBvZiB0aGlzIGVuZHBvaW50IGluIG9uZSByZWdpb24uIE9ubHkgZm9yIGBQRVJfUkVHSU9OYCBlbmRwb2ludHMuXG4gICAqXG4gICAqIEBwYXJhbSByZWdpb24gb25lIG9mIGByZWdpb25zYFxuICAgKi9cbiAgcHVibGljIHJlZ2lvbmFsVXJsKHJlZ2lvbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5lbmRwb2ludFR5cGUgIT09IFdlYkZ1bmN0aW9uRW5kcG9pbnRUeXBlLlBFUl9SRUdJT04pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0aGlzLm5vZGUucGF0aH06IHJlZ2lvbmFsVXJsKCkgaXMgb25seSBhdmFpbGFibGUgZm9yIFBFUl9SRUdJT04gZW5kcG9pbnRzICh0aGlzIG9uZSBpcyAke3RoaXMuZW5kcG9pbnRUeXBlfSk7IHVzZSB1cmxgKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLnJlZ2lvbnMuaW5jbHVkZXMocmVnaW9uKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3RoaXMubm9kZS5wYXRofTogcmVnaW9uICR7cmVnaW9ufSBpcyBub3Qgb25lIG9mIHRoZSBlbmRwb2ludCdzIHJlZ2lvbnMgKCR7dGhpcy5yZWdpb25zLmpvaW4oJywgJyl9KWApO1xuICAgIH1cbiAgICBpZiAocmVnaW9uID09PSB0aGlzLmhvbWVSZWdpb24pIHtcbiAgICAgIHJldHVybiB0aGlzLnVybDtcbiAgICB9XG4gICAgdGhpcy5sb29rdXAgPz89IG5ldyBFbmRwb2ludExvb2t1cCh0aGlzLCAnTG9va3VwJywge1xuICAgICAgZnVuY3Rpb25OYW1lOiB0aGlzLmZ1bmN0aW9uTmFtZSxcbiAgICAgIGZ1bmN0aW9uQXJuOiB0aGlzLmZ1bmN0aW9uQXJuLFxuICAgICAgZW5kcG9pbnROYW1lOiB0aGlzLmVuZHBvaW50TmFtZSxcbiAgICAgIGVuZHBvaW50QXJuOiB0aGlzLmVuZHBvaW50QXJuLFxuICAgIH0pO1xuICAgIHJldHVybiBgaHR0cHM6Ly8ke3RoaXMubG9va3VwLnJlZ2lvbmFsRG9tYWluKHJlZ2lvbil9YDtcbiAgfVxufVxuXG5mdW5jdGlvbiBub3JtYWxpc2VSZWdpb25zKHNjb3BlOiBDb25zdHJ1Y3QsIGVuZHBvaW50VHlwZTogV2ViRnVuY3Rpb25FbmRwb2ludFR5cGUsIGhvbWVSZWdpb246IHN0cmluZywgcmVnaW9uczogc3RyaW5nW10pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGV4dHJhID0gWy4uLm5ldyBTZXQocmVnaW9ucyldLmZpbHRlcigocikgPT4gciAhPT0gaG9tZVJlZ2lvbikuc29ydCgpO1xuICBmb3IgKGNvbnN0IHIgb2YgcmVnaW9ucykge1xuICAgIGlmIChUb2tlbi5pc1VucmVzb2x2ZWQocikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHtzY29wZS5ub2RlLnBhdGh9OiByZWdpb25zIG11c3QgYmUgbGl0ZXJhbCByZWdpb24gbmFtZXMsIGdvdCBhIHRva2VuYCk7XG4gICAgfVxuICAgIGlmICghL15bYS16XXsyfSgtW2Etel0rKSstXFxkJC8udGVzdChyKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3Njb3BlLm5vZGUucGF0aH06ICcke3J9JyBpcyBub3QgYSB2YWxpZCByZWdpb24gbmFtZWApO1xuICAgIH1cbiAgfVxuICBpZiAoZW5kcG9pbnRUeXBlID09PSBXZWJGdW5jdGlvbkVuZHBvaW50VHlwZS5IT01FX1JFR0lPTiAmJiBleHRyYS5sZW5ndGggPiAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAke3Njb3BlLm5vZGUucGF0aH06IGEgSE9NRV9SRUdJT04gZW5kcG9pbnQgc2VydmVzIG9ubHkgdGhlIGhvbWUgcmVnaW9uICgke2hvbWVSZWdpb259KTsgdXNlIE1VTFRJX1JFR0lPTiBvciBQRVJfUkVHSU9OIHRvIGFkZCAke2V4dHJhLmpvaW4oJywgJyl9YCk7XG4gIH1cbiAgaWYgKGVuZHBvaW50VHlwZSAhPT0gV2ViRnVuY3Rpb25FbmRwb2ludFR5cGUuSE9NRV9SRUdJT04pIHtcbiAgICBpZiAoVG9rZW4uaXNVbnJlc29sdmVkKGhvbWVSZWdpb24pKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7c2NvcGUubm9kZS5wYXRofTogJHtlbmRwb2ludFR5cGV9IGVuZHBvaW50cyBuZWVkIGEgc3RhY2sgd2l0aCBhbiBleHBsaWNpdCByZWdpb24gKGVudi5yZWdpb24pYCk7XG4gICAgfVxuICAgIGlmIChleHRyYS5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHtzY29wZS5ub2RlLnBhdGh9OiBhICR7ZW5kcG9pbnRUeXBlfSBlbmRwb2ludCBuZWVkcyBhdCBsZWFzdCBvbmUgcmVnaW9uIGJlc2lkZXMgdGhlIGhvbWUgcmVnaW9uICgke2hvbWVSZWdpb259KWApO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZXh0cmE7XG59XG5cbi8qKiBgZGVmYXVsdC08aGFzaD5gOiBhIHR5cGUgb3IgcmVnaW9uIGNoYW5nZSBwcm9kdWNlcyBhIG5ldyBuYW1lLCBzbyB0aGUgcmVwbGFjZW1lbnQgZG9lc24ndCBjb2xsaWRlLiAqL1xuZnVuY3Rpb24gZGVmYXVsdEVuZHBvaW50TmFtZShlbmRwb2ludFR5cGU6IFdlYkZ1bmN0aW9uRW5kcG9pbnRUeXBlLCBleHRyYVJlZ2lvbnM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgY29uc3QgaGFzaCA9IGNyZWF0ZUhhc2goJ3NoYTI1NicpLnVwZGF0ZShbZW5kcG9pbnRUeXBlLCAuLi5leHRyYVJlZ2lvbnNdLmpvaW4oJywnKSkuZGlnZXN0KCdoZXgnKS5zbGljZSgwLCA4KTtcbiAgcmV0dXJuIGBkZWZhdWx0LSR7aGFzaH1gO1xufVxuIl19
|
|
285
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2ViLWZ1bmN0aW9uLWVuZHBvaW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3dlYi1mdW5jdGlvbi1lbmRwb2ludC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsNkNBQXlDO0FBQ3pDLDZDQUFxRTtBQUVyRSwrREFBaUQ7QUFDakQsMkNBQXVDO0FBQ3ZDLG1DQUF1RTtBQUN2RSwrREFBMkQ7QUFDM0QsMkRBQXVEO0FBQ3ZELHFEQUFxRjtBQUdyRiwrREFBMEQ7QUFxSTFEOzs7O0dBSUc7QUFDSCxNQUFhLG1CQUFvQixTQUFRLHNCQUFTOztJQUNoRDs7OztPQUlHO0lBQ0ksTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUErQjtRQUNqRixPQUFPLElBQUksbUJBQW1CLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNuRCxDQUFDO0lBRUQsMkJBQTJCO0lBQ1gsWUFBWSxDQUFTO0lBRXJDLDBCQUEwQjtJQUNWLFdBQVcsQ0FBUztJQUVwQyw4Q0FBOEM7SUFDOUIsWUFBWSxDQUEwQjtJQUV0RCxxREFBcUQ7SUFDckMsUUFBUSxDQUFzQjtJQUU5QywyR0FBMkc7SUFDM0YsT0FBTyxDQUFXO0lBRWxDOztPQUVHO0lBQ2EsVUFBVSxDQUFTO0lBRW5DOztPQUVHO0lBQ2EsR0FBRyxDQUFTO0lBRTVCLGlFQUFpRTtJQUNqRCxNQUFNLENBQW9CO0lBRXpCLFVBQVUsQ0FBUztJQUNuQixXQUFXLENBQWU7SUFDMUIsUUFBUSxDQUFnQztJQUNqRCxPQUFPLENBQXlEO0lBQ2hFLE1BQU0sR0FBRyxLQUFLLENBQUM7SUFDTixPQUFPLENBQVU7SUFDMUIsTUFBTSxDQUFrQjtJQUVoQyxZQUFvQixLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUErQjtRQUMvRSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFD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LENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDckosT0FBTyxHQUFHLE1BQU0sSUFBSSxJQUFJLEVBQUUsQ0FBQztBQUM3QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY3JlYXRlSGFzaCB9IGZyb20gJ25vZGU6Y3J5cHRvJztcbmltcG9ydCB7IEFubm90YXRpb25zLCBTdGFjaywgVG9rZW4sIFZhbGlkYXRpb25zIH0gZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0ICogYXMgaWFtIGZyb20gJ2F3cy1jZGstbGliL2F3cy1pYW0nO1xuaW1wb3J0ICogYXMgbGFtYmRhIGZyb20gJ2F3cy1jZGstbGliL2F3cy1sYW1iZGEnO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgeyBXZWJGdW5jdGlvbkF1dGhUeXBlLCBXZWJGdW5jdGlvbkVuZHBvaW50VHlwZSB9IGZyb20gJy4vZW51bXMnO1xuaW1wb3J0IHsgRW5kcG9pbnRMb29rdXAgfSBmcm9tICcuL3ByaXZhdGUvZW5kcG9pbnQtbG9va3VwJztcbmltcG9ydCB7IFRyYWZmaWNTaGlmdCB9IGZyb20gJy4vcHJpdmF0ZS90cmFmZmljLXNoaWZ0JztcbmltcG9ydCB7IENGTl9WQUxJREFURV9VTktOT1dOX1RZUEUsIGFzc2VydFJlc291cmNlTmFtZSB9IGZyb20gJy4vcHJpdmF0ZS92YWxpZGF0aW9uJztcbmltcG9ydCB0eXBlIHsgSVdlYkZ1bmN0aW9uIH0gZnJvbSAnLi93ZWItZnVuY3Rpb24nO1xuaW1wb3J0IHR5cGUgeyBXZWJGdW5jdGlvbkRlcGxveW1lbnQgfSBmcm9tICcuL3dlYi1mdW5jdGlvbi1kZXBsb3ltZW50JztcbmltcG9ydCB7IFdlYkZ1bmN0aW9uR3JhbnRzIH0gZnJvbSAnLi93ZWItZnVuY3Rpb24tZ3JhbnRzJztcbmltcG9ydCB0eXBlIHsgSVdlYkZ1bmN0aW9uUmV2aXNpb24gfSBmcm9tICcuL3dlYi1mdW5jdGlvbi1yZXZpc2lvbic7XG5cbi8qKlxuICogQSByZXZpc2lvbiBhbmQgdGhlIHNoYXJlIG9mIGFuIGVuZHBvaW50J3MgdHJhZmZpYyBpdCByZWNlaXZlcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXZWJGdW5jdGlvblJldmlzaW9uV2VpZ2h0IHtcbiAgLyoqIFRoZSByZXZpc2lvbi4gKi9cbiAgcmVhZG9ubHkgcmV2aXNpb246IElXZWJGdW5jdGlvblJldmlzaW9uO1xuXG4gIC8qKlxuICAgKiBUaGUgcmV2aXNpb24ncyBzaGFyZSBvZiB0aGUgZW5kcG9pbnQncyB0cmFmZmljLCBhcyBhIGZyYWN0aW9uIChsaWtlIGBsYW1iZGEuQWxpYXNgIGBhZGRpdGlvbmFsVmVyc2lvbnNgKS5cbiAgICogTXVzdCBiZSBhIHdob2xlIHBlcmNlbnRhZ2UgZnJvbSAwLjAxIHRvIDAuOTkuXG4gICAqL1xuICByZWFkb25seSB3ZWlnaHQ6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBhIFdlYiBGdW5jdGlvbidzIGVuZHBvaW50LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdlYkZ1bmN0aW9uRW5kcG9pbnRPcHRpb25zIHtcbiAgLyoqXG4gICAqIFdoZXJlIHRoZSBlbmRwb2ludCBzZXJ2ZXMgdHJhZmZpYyBmcm9tLlxuICAgKlxuICAgKiBAZGVmYXVsdCBXZWJGdW5jdGlvbkVuZHBvaW50VHlwZS5IT01FX1JFR0lPTlxuICAgKi9cbiAgcmVhZG9ubHkgZW5kcG9pbnRUeXBlPzogV2ViRnVuY3Rpb25FbmRwb2ludFR5cGU7XG5cbiAgLyoqXG4gICAqIFJlZ2lvbnMgdG8gc2VydmUgZnJvbSBpbiBhZGRpdGlvbiB0byB0aGUgaG9tZSByZWdpb24gKHRoZSBzdGFjaydzIHJlZ2lvbikuXG4gICAqIFJlcXVpcmVkIChhdCBsZWFzdCBvbmUpIGZvciBgTVVMVElfUkVHSU9OYCBhbmQgYFBFUl9SRUdJT05gOyBtdXN0IGJlIGVtcHR5IGZvciBgSE9NRV9SRUdJT05gLlxuICAgKlxuICAgKiBDaGFuZ2luZyB0aGlzIGNyZWF0ZXMgYSBuZXcgZW5kcG9pbnQgd2l0aCBhIG5ldyBVUkwuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gZXh0cmEgcmVnaW9uc1xuICAgKi9cbiAgcmVhZG9ubHkgcmVnaW9ucz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBUaGUgZW5kcG9pbnQncyBuYW1lLCBzaG93biBpbiBsb2dzIChgZW5kcG9pbnROYW1lYCkgYW5kIGluIHRoZSBgbGFtYmRhLXdlYi1lbmRwb2ludC1uYW1lYCBoZWFkZXIuXG4gICAqIE5hbWVzIGFyZSB1bmlxdWUgcGVyIGZ1bmN0aW9uLlxuICAgKlxuICAgKiBXaGVuIG9taXR0ZWQsIHRoZSBuYW1lIGVuZHMgaW4gYSBoYXNoIG9mIHRoZSBlbmRwb2ludCB0eXBlIGFuZCByZWdpb25zLCBzbyBjaGFuZ2luZyBlaXRoZXIgZGVwbG95c1xuICAgKiBhIG5ldyBlbmRwb2ludCBjbGVhbmx5LiBXaGVuIHNldCwgY2hhbmdpbmcgdGhlIGVuZHBvaW50IHR5cGUgb3IgcmVnaW9ucyBhbHNvIHJlcXVpcmVzIGEgbmV3IG5hbWU6XG4gICAqIHR3byBlbmRwb2ludHMgb2Ygb25lIGZ1bmN0aW9uIGNhbid0IHNoYXJlIGEgbmFtZSwgYW5kIENsb3VkRm9ybWF0aW9uIGNyZWF0ZXMgdGhlIHJlcGxhY2VtZW50XG4gICAqIGJlZm9yZSBkZWxldGluZyB0aGUgb2xkIG9uZS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBgZGVmYXVsdC08aGFzaD5gIGZvciB0aGUgZnVuY3Rpb24ncyBkZWZhdWx0IGVuZHBvaW50LCBgPGlkPi08aGFzaD5gIGZvciBlbmRwb2ludHMgYWRkZWQgd2l0aCBgYWRkRW5kcG9pbnRgXG4gICAqL1xuICByZWFkb25seSBlbmRwb2ludE5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEEgZGVzY3JpcHRpb24gb2YgdGhlIGVuZHBvaW50LlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIGRlc2NyaXB0aW9uXG4gICAqL1xuICByZWFkb25seSBkZXNjcmlwdGlvbj86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG1vc3QgcmVxdWVzdHMgcGVyIHNlY29uZCB0aGUgZW5kcG9pbnQgYWNjZXB0czsgZXhjZXNzIHJlcXVlc3RzIGdldCBIVFRQIDQyOS5cbiAgICogQWxsb3dlZDogMCAoYmxvY2tzIGFsbCB0cmFmZmljKSwgMTAw4oCTMSwwMDAgaW4gc3RlcHMgb2YgMTAwLCBvciAyLDAwMOKAkzEwLDAwMCBpbiBzdGVwcyBvZiAxLDAwMC5cbiAgICpcbiAgICogRW5mb3JjZWQgc2VwYXJhdGVseSBpbiBlYWNoIHJlZ2lvbiB0aGUgZW5kcG9pbnQgc2VydmVzIGZyb20sIHNvIGEgbXVsdGktcmVnaW9uIGVuZHBvaW50XG4gICAqIGNhbiBhY2NlcHQgdGhpcyBtYW55IHJlcXVlc3RzIHBlciBzZWNvbmQgaW4gZXZlcnkgcmVnaW9uLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIGxpbWl0IGJleW9uZCB0aGUgc2VydmljZSBxdW90YSBvZiAxMCwwMDAgcmVxdWVzdHMgcGVyIHNlY29uZCBwZXIgZW5kcG9pbnQgKHBlciByZWdpb24pXG4gICAqL1xuICByZWFkb25seSByYXRlTGltaXQ/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBtb3N0IGV4ZWN1dGlvbiBlbnZpcm9ubWVudHMgdGhlIGVuZHBvaW50IG1heSB1c2UgKDLigJMxMCwwMDApLiBFYWNoIG9uZSB1c2VzIDIgdkNQVXMgb2YgdGhlIGFjY291bnQncyBxdW90YS5cbiAgICpcbiAgICogRW5mb3JjZWQgc2VwYXJhdGVseSBpbiBlYWNoIHJlZ2lvbiB0aGUgZW5kcG9pbnQgc2VydmVzIGZyb20uXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gc2NhbGVzIHdpdGhpbiB0aGUgYWNjb3VudCdzIHZDUFUgcXVvdGFcbiAgICovXG4gIHJlYWRvbmx5IG1heEVudmlyb25tZW50cz86IG51bWJlcjtcblxuICAvKipcbiAgICogSG93IHRoZSBlbmRwb2ludCBtb3ZlcyBpdHMgdHJhZmZpYyB0byBhIG5ldyByZXZpc2lvbjogYWxsIGF0IG9uY2UsIG9yIGluIHN0ZXBzXG4gICAqIChgV2ViRnVuY3Rpb25EZXBsb3ltZW50LmNhbmFyeSgpYCBvciBgbGluZWFyKClgKSB0aGF0IHdhdGNoIENsb3VkV2F0Y2ggYWxhcm1zIGFuZCBtb3ZlXG4gICAqIHRoZSB0cmFmZmljIGJhY2sgd2hlbiBvbmUgZ29lcyBpbnRvIEFMQVJNLlxuICAgKlxuICAgKiBBIGRlcGxveW1lbnQgaW4gc3RlcHMgY2FuJ3QgYmUgY29tYmluZWQgd2l0aCBgcmV2aXNpb25gLCBgYWRkaXRpb25hbFJldmlzaW9uc2Agb3IgYHJvdXRlVHJhZmZpYygpYC5cbiAgICpcbiAgICogQGRlZmF1bHQgV2ViRnVuY3Rpb25EZXBsb3ltZW50LmFsbEF0T25jZSgpXG4gICAqL1xuICByZWFkb25seSBkZXBsb3ltZW50PzogV2ViRnVuY3Rpb25EZXBsb3ltZW50O1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIGBXZWJGdW5jdGlvbi5hZGRFbmRwb2ludGAuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWRkV2ViRnVuY3Rpb25FbmRwb2ludE9wdGlvbnMgZXh0ZW5kcyBXZWJGdW5jdGlvbkVuZHBvaW50T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBIb3cgY2FsbGVycyBvZiB0aGlzIGVuZHBvaW50IGFyZSBhdXRoZW50aWNhdGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgYXV0aFR5cGU6IFdlYkZ1bmN0aW9uQXV0aFR5cGU7XG5cbiAgLyoqXG4gICAqIFRoZSByZXZpc2lvbiB0aGUgZW5kcG9pbnQgc2VydmVzLCBlLmcuIGFuIGVhcmxpZXIgb25lIGZyb20gYFdlYkZ1bmN0aW9uUmV2aXNpb24uZnJvbVJldmlzaW9uQXR0cmlidXRlc2BcbiAgICogdG8ga2VlcCB0aGlzIGVuZHBvaW50IG9uIGl0IHdoaWxlIG90aGVycyBtb3ZlIG9uLiBTYW1lIGFzIGNhbGxpbmcgYHJvdXRlVHJhZmZpY2AuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdGhlIGZ1bmN0aW9uJ3MgY3VycmVudCByZXZpc2lvbiAoYGN1cnJlbnRSZXZpc2lvbmApXG4gICAqL1xuICByZWFkb25seSByZXZpc2lvbj86IElXZWJGdW5jdGlvblJldmlzaW9uO1xuXG4gIC8qKlxuICAgKiBBIHNlY29uZCByZXZpc2lvbiBhbmQgaXRzIHNoYXJlIG9mIHRoZSBlbmRwb2ludCdzIHRyYWZmaWM7IGByZXZpc2lvbmAgZ2V0cyB0aGUgcmVzdC5cbiAgICogQW4gZW5kcG9pbnQgcm91dGVzIHRvIGF0IG1vc3QgdHdvIHJldmlzaW9ucy5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBhbGwgdHJhZmZpYyBnb2VzIHRvIGByZXZpc2lvbmBcbiAgICovXG4gIHJlYWRvbmx5IGFkZGl0aW9uYWxSZXZpc2lvbnM/OiBXZWJGdW5jdGlvblJldmlzaW9uV2VpZ2h0W107XG59XG5cbi8qKlxuICogSW50ZXJuYWw6IGhvdyBgV2ViRnVuY3Rpb25gIGNyZWF0ZXMgaXRzIGVuZHBvaW50cy4gTm90IHBhcnQgb2YgdGhlIHB1YmxpYyBBUEkuXG4gKi9cbmludGVyZmFjZSBXZWJGdW5jdGlvbkVuZHBvaW50UHJvcHMgZXh0ZW5kcyBBZGRXZWJGdW5jdGlvbkVuZHBvaW50T3B0aW9ucyB7XG4gIC8qKiBUaGUgZnVuY3Rpb24gdGhhdCBvd25zIHRoZSBlbmRwb2ludC4gKi9cbiAgcmVhZG9ubHkgd2ViRnVuY3Rpb246IElXZWJGdW5jdGlvbjtcblxuICAvKiogVGhlIGZ1bmN0aW9uJ3MgY3VycmVudCByZXZpc2lvbiwgc2VydmVkIHVubGVzcyBgcmV2aXNpb25gIGlzIGdpdmVuLiAqL1xuICByZWFkb25seSBjdXJyZW50UmV2aXNpb246IElXZWJGdW5jdGlvblJldmlzaW9uO1xuXG4gIC8qKiBQcmVmaXggb2YgdGhlIGdlbmVyYXRlZCBlbmRwb2ludCBuYW1lLiAqL1xuICByZWFkb25seSBuYW1lUHJlZml4OiBzdHJpbmc7XG5cbiAgLyoqIEV4dHJhIGlucHV0IHRvIHRoZSBnZW5lcmF0ZWQgbmFtZSdzIGhhc2ggKHRoZSBjb25zdHJ1Y3QgSUQgb2YgYW4gYWRkZWQgZW5kcG9pbnQpLiAqL1xuICByZWFkb25seSBuYW1lU2VlZD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBBbiBIVFRQUyBlbmRwb2ludCBvZiBhIFdlYiBGdW5jdGlvbjogYGZuLmVuZHBvaW50YCAodGhlIGRlZmF1bHQgb25lKSBvciB0aGUgcmVzdWx0IG9mIGBmbi5hZGRFbmRwb2ludCgpYC5cbiAqXG4gKiBFbmRwb2ludHMgYXJlIGNyZWF0ZWQgb25seSB0aHJvdWdoIGBXZWJGdW5jdGlvbmAsIHdoaWNoIG93bnMgdGhlaXIgbG9nIGdyb3VwcyBpbiBldmVyeSByZWdpb24sIHNvIHRoZSBjb25zdHJ1Y3RvciBpcyBwcml2YXRlLlxuICovXG5leHBvcnQgY2xhc3MgV2ViRnVuY3Rpb25FbmRwb2ludCBleHRlbmRzIENvbnN0cnVjdCB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIGVuZHBvaW50IG9mIGEgV2ViIEZ1bmN0aW9uLiBVc2VkIGJ5IGBXZWJGdW5jdGlvbmAuXG4gICAqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBfY3JlYXRlKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBXZWJGdW5jdGlvbkVuZHBvaW50UHJvcHMpOiBXZWJGdW5jdGlvbkVuZHBvaW50IHtcbiAgICByZXR1cm4gbmV3IFdlYkZ1bmN0aW9uRW5kcG9pbnQoc2NvcGUsIGlkLCBwcm9wcyk7XG4gIH1cblxuICAvKiogVGhlIGVuZHBvaW50J3MgbmFtZS4gKi9cbiAgcHVibGljIHJlYWRvbmx5IGVuZHBvaW50TmFtZTogc3RyaW5nO1xuXG4gIC8qKiBUaGUgZW5kcG9pbnQncyBBUk4uICovXG4gIHB1YmxpYyByZWFkb25seSBlbmRwb2ludEFybjogc3RyaW5nO1xuXG4gIC8qKiBXaGVyZSB0aGUgZW5kcG9pbnQgc2VydmVzIHRyYWZmaWMgZnJvbS4gKi9cbiAgcHVibGljIHJlYWRvbmx5IGVuZHBvaW50VHlwZTogV2ViRnVuY3Rpb25FbmRwb2ludFR5cGU7XG5cbiAgLyoqIEhvdyBjYWxsZXJzIG9mIHRoZSBlbmRwb2ludCBhcmUgYXV0aGVudGljYXRlZC4gKi9cbiAgcHVibGljIHJlYWRvbmx5IGF1dGhUeXBlOiBXZWJGdW5jdGlvbkF1dGhUeXBlO1xuXG4gIC8qKiBFdmVyeSByZWdpb24gdGhlIGVuZHBvaW50IHNlcnZlcyBmcm9tOiB0aGUgaG9tZSByZWdpb24gZmlyc3QsIHRoZW4gdGhlIG90aGVycyBpbiBhbHBoYWJldGljYWwgb3JkZXIuICovXG4gIHB1YmxpYyByZWFkb25seSByZWdpb25zOiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogVGhlIGVuZHBvaW50J3MgZG9tYWluIG5hbWU6IHRoZSBnbG9iYWwgZG9tYWluIGZvciBgTVVMVElfUkVHSU9OYCwgb3RoZXJ3aXNlIHRoZSBob21lIHJlZ2lvbidzLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGRvbWFpbk5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGVuZHBvaW50J3MgVVJMOiB0aGUgZ2xvYmFsIFVSTCBmb3IgYE1VTFRJX1JFR0lPTmAsIG90aGVyd2lzZSB0aGUgaG9tZSByZWdpb24ncy5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB1cmw6IHN0cmluZztcblxuICAvKiogR3JhbnRzIG9uIHRoaXMgZW5kcG9pbnQgKGUuZy4gYGdyYW50cy5pbnZva2UocHJpbmNpcGFsKWApLiAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZ3JhbnRzOiBXZWJGdW5jdGlvbkdyYW50cztcblxuICBwcml2YXRlIHJlYWRvbmx5IGhvbWVSZWdpb246IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSB3ZWJGdW5jdGlvbjogSVdlYkZ1bmN0aW9uO1xuICBwcml2YXRlIHJlYWRvbmx5IHJlc291cmNlOiBsYW1iZGEuQ2ZuV2ViRnVuY3Rpb25FbmRwb2ludDtcbiAgcHJpdmF0ZSB3ZWlnaHRzOiBsYW1iZGEuQ2ZuV2ViRnVuY3Rpb25FbmRwb2ludC5SZXZpc2lvbldlaWdodFByb3BlcnR5W107XG4gIHByaXZhdGUgcm91dGVkID0gZmFsc2U7XG4gIHByaXZhdGUgcmVhZG9ubHkgZ3JhZHVhbDogYm9vbGVhbjtcbiAgcHJpdmF0ZSBsb29rdXA/OiBFbmRwb2ludExvb2t1cDtcblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBXZWJGdW5jdGlvbkVuZHBvaW50UHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgY29uc3QgaG9tZVJlZ2lvbiA9IFN0YWNrLm9mKHRoaXMpLnJlZ2lvbjtcbiAgICBjb25zdCBlbmRwb2ludFR5cGUgPSBwcm9wcy5lbmRwb2ludFR5cGUgPz8gV2ViRnVuY3Rpb25FbmRwb2ludFR5cGUuSE9NRV9SRUdJT047XG4gICAgY29uc3QgZXh0cmFSZWdpb25zID0gbm9ybWFsaXNlUmVnaW9ucyh0aGlzLCBlbmRwb2ludFR5cGUsIGhvbWVSZWdpb24sIHByb3BzLnJlZ2lvbnMgPz8gW10pO1xuICAgIHZhbGlkYXRlUmF0ZUxpbWl0KHRoaXMsIHByb3BzLnJhdGVMaW1pdCk7XG4gICAgdmFsaWRhdGVNYXhFbnZpcm9ubWVudHModGhpcywgcHJvcHMubWF4RW52aXJvbm1lbnRzKTtcblxuICAgIGlmIChwcm9wcy5lbmRwb2ludE5hbWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgYXNzZXJ0UmVzb3VyY2VOYW1lKHRoaXMsICdlbmRwb2ludE5hbWUnLCBwcm9wcy5lbmRwb2ludE5hbWUpO1xuICAgICAgQW5ub3RhdGlvbnMub2YodGhpcykuYWRkV2FybmluZ1YyKCdAY2RrLWxhbWJkYS13ZWI6ZXhwbGljaXRFbmRwb2ludE5hbWUnLFxuICAgICAgICBgZW5kcG9pbnROYW1lICcke3Byb3BzLmVuZHBvaW50TmFtZX0nIGlzIHNldCBleHBsaWNpdGx5OiBjaGFuZ2luZyBlbmRwb2ludFR5cGUgb3IgcmVnaW9ucyBsYXRlciBhbHNvIHJlcXVpcmVzIGEgbmV3IGVuZHBvaW50TmFtZSwgb3RoZXJ3aXNlIHRoZSBkZXBsb3ltZW50IGZhaWxzIHdpdGggXCJhbHJlYWR5IGV4aXN0c1wiICh0aGUgc3RhY2sgcm9sbHMgYmFjayBzYWZlbHkpLiBPbWl0IGVuZHBvaW50TmFtZSB0byBnZXQgYSBuYW1lIHRoYXQgY2hhbmdlcyBhdXRvbWF0aWNhbGx5LmApO1xuICAgIH1cbiAgICBpZiAocHJvcHMuYXV0aFR5cGUgPT09IFdlYkZ1bmN0aW9uQXV0aFR5cGUuTk9ORSkge1xuICAgICAgQW5ub3RhdGlvbnMub2YodGhpcykuYWRkV2FybmluZ1YyKCdAY2RrLWxhbWJkYS13ZWI6YXV0aFR5cGVOb25lJyxcbiAgICAgICAgJ2F1dGhUeXBlIE5PTkUgbWFrZXMgdGhlIGVuZHBvaW50IHB1YmxpYzogTGFtYmRhIGRvZXMgbm8gYXV0aGVudGljYXRpb24sIHNvIHlvdXIgYXBwbGljYXRpb24gbXVzdCBhdXRoZW50aWNhdGUgcmVxdWVzdHMgaXRzZWxmLicpO1xuICAgIH1cblxuICAgIHRoaXMuZW5kcG9pbnRUeXBlID0gZW5kcG9pbnRUeXBlO1xuICAgIHRoaXMuYXV0aFR5cGUgPSBwcm9wcy5hdXRoVHlwZTtcbiAgICB0aGlzLmVuZHBvaW50TmFtZSA9IHByb3BzLmVuZHBvaW50TmFtZSA/PyBkZWZhdWx0RW5kcG9pbnROYW1lKHByb3BzLm5hbWVQcmVmaXgsIHByb3BzLm5hbWVTZWVkLCBlbmRwb2ludFR5cGUsIGV4dHJhUmVnaW9ucyk7XG4gICAgdGhpcy5yZWdpb25zID0gW2hvbWVSZWdpb24sIC4uLmV4dHJhUmVnaW9uc107XG4gICAgdGhpcy5ob21lUmVnaW9uID0gaG9tZVJlZ2lvbjtcbiAgICB0aGlzLndlYkZ1bmN0aW9uID0gcHJvcHMud2ViRnVuY3Rpb247XG4gICAgdGhpcy53ZWlnaHRzID0gW3sgcmV2aXNpb25JZDogcHJvcHMuY3VycmVudFJldmlzaW9uLnJldmlzaW9uSWQsIHdlaWdodDogMTAwIH1dO1xuXG4gICAgY29uc3QgcmVzb3VyY2UgPSBuZXcgbGFtYmRhLkNmbldlYkZ1bmN0aW9uRW5kcG9pbnQodGhpcywgJ1Jlc291cmNlJywge1xuICAgICAgZnVuY3Rpb25OYW1lOiBwcm9wcy53ZWJGdW5jdGlvbi53ZWJGdW5jdGlvbkFybixcbiAgICAgIGVuZHBvaW50TmFtZTogdGhpcy5lbmRwb2ludE5hbWUsXG4gICAgICBlbmRwb2ludFR5cGUsXG4gICAgICBhdXRoVHlwZTogcHJvcHMuYXV0aFR5cGUsXG4gICAgICBkZXNjcmlwdGlvbjogcHJvcHMuZGVzY3JpcHRpb24sXG4gICAgICByZWdpb25zOiBleHRyYVJlZ2lvbnMubGVuZ3RoID4gMCA/IGV4dHJhUmVnaW9ucyA6IHVuZGVmaW5lZCxcbiAgICAgIHJldmlzaW9uV2VpZ2h0czogdGhpcy53ZWlnaHRzLFxuICAgICAgdGhyb3R0bGVDb25maWc6IHByb3BzLnJhdGVMaW1pdCAhPT0gdW5kZWZpbmVkID8geyByYXRlTGltaXQ6IHByb3BzLnJhdGVMaW1pdCB9IDogdW5kZWZpbmVkLFxuICAgICAgc2NhbGluZ0NvbmZpZzogcHJvcHMubWF4RW52aXJvbm1lbnRzICE9PSB1bmRlZmluZWQgPyB7IG1heEVudmlyb25tZW50czogcHJvcHMubWF4RW52aXJvbm1lbnRzIH0gOiB1bmRlZmluZWQsXG4gICAgfSk7XG4gICAgVmFsaWRhdGlvbnMub2YocmVzb3VyY2UpLmFja25vd2xlZGdlKENGTl9WQUxJREFURV9VTktOT1dOX1RZUEUpO1xuICAgIHRoaXMucmVzb3VyY2UgPSByZXNvdXJjZTtcblxuICAgIHRoaXMuZ3JhZHVhbCA9IHByb3BzLmRlcGxveW1lbnQ/Ll9ncmFkdWFsID8/IGZhbHNlO1xuICAgIGlmIChwcm9wcy5kZXBsb3ltZW50Py5fZ3JhZHVhbCkge1xuICAgICAgaWYgKHByb3BzLnJldmlzaW9uICE9PSB1bmRlZmluZWQgfHwgcHJvcHMuYWRkaXRpb25hbFJldmlzaW9ucyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0aGlzLm5vZGUucGF0aH06IGFuIGVuZHBvaW50IHdpdGggYSAke3Byb3BzLmRlcGxveW1lbnQuX2tpbmR9IGRlcGxveW1lbnQgYWx3YXlzIG1vdmVzIHRvIHRoZSBjdXJyZW50IHJldmlzaW9uOyBpdCBjYW4ndCBhbHNvIHNldCByZXZpc2lvbiBvciBhZGRpdGlvbmFsUmV2aXNpb25zYCk7XG4gICAgICB9XG4gICAgICAvLyBNb3ZlcyB0aGUgdHJhZmZpYyBpbiBzdGVwcyBiZWZvcmUgQ2xvdWRGb3JtYXRpb24gd3JpdGVzIHRoZSBlbmRwb2ludCwgd2hpY2ggdGhlbiBmaW5kcyBpdCBhbHJlYWR5IGRvbmUuXG4gICAgICBjb25zdCBzaGlmdCA9IG5ldyBUcmFmZmljU2hpZnQodGhpcywgJ0RlcGxveW1lbnQnLCB7XG4gICAgICAgIGZ1bmN0aW9uTmFtZTogcHJvcHMud2ViRnVuY3Rpb24ud2ViRnVuY3Rpb25OYW1lLFxuICAgICAgICBmdW5jdGlvbkFybjogcHJvcHMud2ViRnVuY3Rpb24ud2ViRnVuY3Rpb25Bcm4sXG4gICAgICAgIGVuZHBvaW50TmFtZTogdGhpcy5lbmRwb2ludE5hbWUsXG4gICAgICAgIHJldmlzaW9uSWQ6IHByb3BzLmN1cnJlbnRSZXZpc2lvbi5yZXZpc2lvbklkLFxuICAgICAgICBkZXBsb3ltZW50OiBwcm9wcy5kZXBsb3ltZW50LFxuICAgICAgICBlbmRwb2ludENvbmZpZzoge1xuICAgICAgICAgIGVuZHBvaW50VHlwZSxcbiAgICAgICAgICBhdXRoVHlwZTogcHJvcHMuYXV0aFR5cGUsXG4gICAgICAgICAgZGVzY3JpcHRpb246IHByb3BzLmRlc2NyaXB0aW9uLFxuICAgICAgICAgIHJlZ2lvbnM6IGV4dHJhUmVnaW9ucyxcbiAgICAgICAgICByYXRlTGltaXQ6IHByb3BzLnJhdGVMaW1pdCxcbiAgICAgICAgICBtYXhFbnZpcm9ubWVudHM6IHByb3BzLm1heEVudmlyb25tZW50cyxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgICAgcmVzb3VyY2Uubm9kZS5hZGREZXBlbmRlbmN5KHNoaWZ0KTtcbiAgICB9XG4gICAgaWYgKHByb3BzLnJldmlzaW9uICE9PSB1bmRlZmluZWQgfHwgcHJvcHMuYWRkaXRpb25hbFJldmlzaW9ucyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLnJvdXRlVHJhZmZpYyhwcm9wcy5yZXZpc2lvbiA/PyBwcm9wcy5jdXJyZW50UmV2aXNpb24sIHByb3BzLmFkZGl0aW9uYWxSZXZpc2lvbnMpO1xuICAgIH1cblxuICAgIHRoaXMuZW5kcG9pbnRBcm4gPSByZXNvdXJjZS5hdHRyRW5kcG9pbnRBcm47XG4gICAgdGhpcy5kb21haW5OYW1lID0gcmVzb3VyY2UuYXR0ckRvbWFpbk5hbWU7XG4gICAgdGhpcy51cmwgPSBgaHR0cHM6Ly8ke3Jlc291cmNlLmF0dHJEb21haW5OYW1lfWA7XG4gICAgdGhpcy5ncmFudHMgPSBXZWJGdW5jdGlvbkdyYW50cy5fZm9yRW5kcG9pbnQodGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIFVSTCBvZiB0aGlzIGVuZHBvaW50IGluIG9uZSByZWdpb24uIE9ubHkgZm9yIGBQRVJfUkVHSU9OYCBlbmRwb2ludHMuXG4gICAqXG4gICAqIEBwYXJhbSByZWdpb24gb25lIG9mIGByZWdpb25zYFxuICAgKi9cbiAgcHVibGljIHJlZ2lvbmFsVXJsKHJlZ2lvbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5lbmRwb2ludFR5cGUgIT09IFdlYkZ1bmN0aW9uRW5kcG9pbnRUeXBlLlBFUl9SRUdJT04pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0aGlzLm5vZGUucGF0aH06IHJlZ2lvbmFsVXJsKCkgaXMgb25seSBhdmFpbGFibGUgZm9yIFBFUl9SRUdJT04gZW5kcG9pbnRzICh0aGlzIG9uZSBpcyAke3RoaXMuZW5kcG9pbnRUeXBlfSk7IHVzZSB1cmxgKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLnJlZ2lvbnMuaW5jbHVkZXMocmVnaW9uKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3RoaXMubm9kZS5wYXRofTogcmVnaW9uICR7cmVnaW9ufSBpcyBub3Qgb25lIG9mIHRoZSBlbmRwb2ludCdzIHJlZ2lvbnMgKCR7dGhpcy5yZWdpb25zLmpvaW4oJywgJyl9KWApO1xuICAgIH1cbiAgICBpZiAocmVnaW9uID09PSB0aGlzLmhvbWVSZWdpb24pIHtcbiAgICAgIHJldHVybiB0aGlzLnVybDtcbiAgICB9XG4gICAgdGhpcy5sb29rdXAgPz89IG5ldyBFbmRwb2ludExvb2t1cCh0aGlzLCAnTG9va3VwJywge1xuICAgICAgZnVuY3Rpb25OYW1lOiB0aGlzLndlYkZ1bmN0aW9uLndlYkZ1bmN0aW9uTmFtZSxcbiAgICAgIGZ1bmN0aW9uQXJuOiB0aGlzLndlYkZ1bmN0aW9uLndlYkZ1bmN0aW9uQXJuLFxuICAgICAgZW5kcG9pbnROYW1lOiB0aGlzLmVuZHBvaW50TmFtZSxcbiAgICAgIGVuZHBvaW50QXJuOiB0aGlzLmVuZHBvaW50QXJuLFxuICAgIH0pO1xuICAgIHJldHVybiBgaHR0cHM6Ly8ke3RoaXMubG9va3VwLnJlZ2lvbmFsRG9tYWluKHJlZ2lvbil9YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSb3V0ZXMgdGhlIGVuZHBvaW50IHRvIGByZXZpc2lvbmAgaW5zdGVhZCBvZiB0aGUgZnVuY3Rpb24ncyBjdXJyZW50IHJldmlzaW9uLCBvcHRpb25hbGx5IHNoYXJpbmdcbiAgICogdHJhZmZpYyB3aXRoIG9uZSBtb3JlIHJldmlzaW9uIChgYWRkaXRpb25hbFJldmlzaW9uc2AsIHdoaWNoIGdldHMgaXRzIHdlaWdodDsgYHJldmlzaW9uYCBnZXRzIHRoZSByZXN0KS5cbiAgICpcbiAgICogVXNlIGl0IHRvIGtlZXAgYW4gZW5kcG9pbnQgb24gYW4gZWFybGllciByZXZpc2lvbiAoYFdlYkZ1bmN0aW9uUmV2aXNpb24uZnJvbVJldmlzaW9uQXR0cmlidXRlc2ApLFxuICAgKiBvciB0byBzZW5kIHBhcnQgb2YgdGhlIHRyYWZmaWMgdG8gdGhlIGN1cnJlbnQgcmV2aXNpb246XG4gICAqIGBmbi5lbmRwb2ludC5yb3V0ZVRyYWZmaWMocHJldmlvdXMsIFt7IHJldmlzaW9uOiBmbi5jdXJyZW50UmV2aXNpb24sIHdlaWdodDogMC4xIH1dKWAuXG4gICAqIENhbiBiZSBjYWxsZWQgb25jZSBwZXIgZW5kcG9pbnQsIGFuZCBub3Qgb24gb25lIGNyZWF0ZWQgd2l0aCBgcmV2aXNpb25gIG9yIGBhZGRpdGlvbmFsUmV2aXNpb25zYC5cbiAgICovXG4gIHB1YmxpYyByb3V0ZVRyYWZmaWMocmV2aXNpb246IElXZWJGdW5jdGlvblJldmlzaW9uLCBhZGRpdGlvbmFsUmV2aXNpb25zPzogV2ViRnVuY3Rpb25SZXZpc2lvbldlaWdodFtdKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZ3JhZHVhbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3RoaXMubm9kZS5wYXRofTogdGhlIGVuZHBvaW50IGhhcyBhIGRlcGxveW1lbnQgaW4gc3RlcHMsIHdoaWNoIGFsd2F5cyBtb3ZlcyBpdCB0byB0aGUgY3VycmVudCByZXZpc2lvbjsgcm91dGVUcmFmZmljKCkgY2FuJ3QgYmUgdXNlZCB3aXRoIGl0YCk7XG4gICAgfVxuICAgIGlmICh0aGlzLnJvdXRlZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3RoaXMubm9kZS5wYXRofTogdGhlIGVuZHBvaW50J3MgcmV2aXNpb25zIGFyZSBhbHJlYWR5IHNldCAocmV2aXNpb24sIGFkZGl0aW9uYWxSZXZpc2lvbnMgb3Igcm91dGVUcmFmZmljKWApO1xuICAgIH1cbiAgICB0aGlzLndlaWdodHMgPSByZXZpc2lvbldlaWdodHModGhpcywgdGhpcy53ZWJGdW5jdGlvbiwgcmV2aXNpb24sIGFkZGl0aW9uYWxSZXZpc2lvbnMgPz8gW10pO1xuICAgIHRoaXMucmVzb3VyY2UucmV2aXNpb25XZWlnaHRzID0gdGhpcy53ZWlnaHRzO1xuICAgIHRoaXMucm91dGVkID0gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgSURzIG9mIHRoZSByZXZpc2lvbnMgdGhpcyBlbmRwb2ludCByb3V0ZXMgdG8uXG4gICAqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHVibGljIF9yZXZpc2lvbklkcygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMud2VpZ2h0cy5tYXAoKHcpID0+IHcucmV2aXNpb25JZCk7XG4gIH1cblxuICAvKipcbiAgICogQWxsb3dzIGBncmFudGVlYCB0byBjYWxsIHRoaXMgZW5kcG9pbnQuIFNob3J0Y3V0IGZvciBgZ3JhbnRzLmludm9rZShncmFudGVlKWAuXG4gICAqIFtkaXNhYmxlLWF3c2xpbnQ6bm8tZ3JhbnRzXVxuICAgKi9cbiAgcHVibGljIGdyYW50SW52b2tlKGdyYW50ZWU6IGlhbS5JR3JhbnRhYmxlKTogaWFtLkdyYW50IHtcbiAgICByZXR1cm4gdGhpcy5ncmFudHMuaW52b2tlKGdyYW50ZWUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGlzZVJlZ2lvbnMoc2NvcGU6IENvbnN0cnVjdCwgZW5kcG9pbnRUeXBlOiBXZWJGdW5jdGlvbkVuZHBvaW50VHlwZSwgaG9tZVJlZ2lvbjogc3RyaW5nLCByZWdpb25zOiBzdHJpbmdbXSk6IHN0cmluZ1tdIHtcbiAgY29uc3QgZXh0cmEgPSBbLi4ubmV3IFNldChyZWdpb25zKV0uZmlsdGVyKChyKSA9PiByICE9PSBob21lUmVnaW9uKS5zb3J0KCk7XG4gIGZvciAoY29uc3QgciBvZiByZWdpb25zKSB7XG4gICAgaWYgKFRva2VuLmlzVW5yZXNvbHZlZChyKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3Njb3BlLm5vZGUucGF0aH06IHJlZ2lvbnMgbXVzdCBiZSBsaXRlcmFsIHJlZ2lvbiBuYW1lcywgZ290IGEgdG9rZW5gKTtcbiAgICB9XG4gICAgaWYgKCEvXlthLXpdezJ9KC1bYS16XSspKy1cXGQkLy50ZXN0KHIpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7c2NvcGUubm9kZS5wYXRofTogJyR7cn0nIGlzIG5vdCBhIHZhbGlkIHJlZ2lvbiBuYW1lYCk7XG4gICAgfVxuICB9XG4gIGlmIChlbmRwb2ludFR5cGUgPT09IFdlYkZ1bmN0aW9uRW5kcG9pbnRUeXBlLkhPTUVfUkVHSU9OICYmIGV4dHJhLmxlbmd0aCA+IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYCR7c2NvcGUubm9kZS5wYXRofTogYSBIT01FX1JFR0lPTiBlbmRwb2ludCBzZXJ2ZXMgb25seSB0aGUgaG9tZSByZWdpb24gKCR7aG9tZVJlZ2lvbn0pOyB1c2UgTVVMVElfUkVHSU9OIG9yIFBFUl9SRUdJT04gdG8gYWRkICR7ZXh0cmEuam9pbignLCAnKX1gKTtcbiAgfVxuICBpZiAoZW5kcG9pbnRUeXBlICE9PSBXZWJGdW5jdGlvbkVuZHBvaW50VHlwZS5IT01FX1JFR0lPTikge1xuICAgIGlmIChUb2tlbi5pc1VucmVzb2x2ZWQoaG9tZVJlZ2lvbikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgJHtzY29wZS5ub2RlLnBhdGh9OiAke2VuZHBvaW50VHlwZX0gZW5kcG9pbnRzIG5lZWQgYSBzdGFjayB3aXRoIGFuIGV4cGxpY2l0IHJlZ2lvbiAoZW52LnJlZ2lvbilgKTtcbiAgICB9XG4gICAgaWYgKGV4dHJhLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3Njb3BlLm5vZGUucGF0aH06IGEgJHtlbmRwb2ludFR5cGV9IGVuZHBvaW50IG5lZWRzIGF0IGxlYXN0IG9uZSByZWdpb24gYmVzaWRlcyB0aGUgaG9tZSByZWdpb24gKCR7aG9tZVJlZ2lvbn0pYCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBleHRyYTtcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVSYXRlTGltaXQoc2NvcGU6IENvbnN0cnVjdCwgcmF0ZUxpbWl0OiBudW1iZXIgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgaWYgKHJhdGVMaW1pdCA9PT0gdW5kZWZpbmVkIHx8IFRva2VuLmlzVW5yZXNvbHZlZChyYXRlTGltaXQpKSByZXR1cm47XG4gIGNvbnN0IGFsbG93ZWQgPSByYXRlTGltaXQgPT09IDBcbiAgICB8fCAocmF0ZUxpbWl0ID49IDEwMCAmJiByYXRlTGltaXQgPD0gMTAwMCAmJiByYXRlTGltaXQgJSAxMDAgPT09IDApXG4gICAgfHwgKHJhdGVMaW1pdCA+PSAyMDAwICYmIHJhdGVMaW1pdCA8PSAxMDAwMCAmJiByYXRlTGltaXQgJSAxMDAwID09PSAwKTtcbiAgaWYgKCFhbGxvd2VkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAke3Njb3BlLm5vZGUucGF0aH06IHJhdGVMaW1pdCBtdXN0IGJlIDAsIDEwMC0xLDAwMCBpbiBzdGVwcyBvZiAxMDAsIG9yIDIsMDAwLTEwLDAwMCBpbiBzdGVwcyBvZiAxLDAwMCwgZ290ICR7cmF0ZUxpbWl0fWApO1xuICB9XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlTWF4RW52aXJvbm1lbnRzKHNjb3BlOiBDb25zdHJ1Y3QsIG1heEVudmlyb25tZW50czogbnVtYmVyIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gIGlmIChtYXhFbnZpcm9ubWVudHMgPT09IHVuZGVmaW5lZCB8fCBUb2tlbi5pc1VucmVzb2x2ZWQobWF4RW52aXJvbm1lbnRzKSkgcmV0dXJuO1xuICBpZiAoIU51bWJlci5pc0ludGVnZXIobWF4RW52aXJvbm1lbnRzKSB8fCBtYXhFbnZpcm9ubWVudHMgPCAyIHx8IG1heEVudmlyb25tZW50cyA+IDEwMDAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAke3Njb3BlLm5vZGUucGF0aH06IG1heEVudmlyb25tZW50cyBtdXN0IGJlIGFuIGludGVnZXIgZnJvbSAyIHRvIDEwLDAwMCwgZ290ICR7bWF4RW52aXJvbm1lbnRzfWApO1xuICB9XG59XG5cbi8qKiBgcHJpbWFyeWAgZ2V0cyB3aGF0IGBhZGRpdGlvbmFsYCBsZWF2ZXM7IHdlaWdodHMgYXJlIHdob2xlIHBlcmNlbnRhZ2VzIHN1bW1pbmcgdG8gMTAwLiAqL1xuZnVuY3Rpb24gcmV2aXNpb25XZWlnaHRzKFxuICBzY29wZTogQ29uc3RydWN0LFxuICB3ZWJGdW5jdGlvbjogSVdlYkZ1bmN0aW9uLFxuICBwcmltYXJ5OiBJV2ViRnVuY3Rpb25SZXZpc2lvbixcbiAgYWRkaXRpb25hbDogV2ViRnVuY3Rpb25SZXZpc2lvbldlaWdodFtdLFxuKTogbGFtYmRhLkNmbldlYkZ1bmN0aW9uRW5kcG9pbnQuUmV2aXNpb25XZWlnaHRQcm9wZXJ0eVtdIHtcbiAgZm9yIChjb25zdCByIG9mIFtwcmltYXJ5LCAuLi5hZGRpdGlvbmFsLm1hcCgoYSkgPT4gYS5yZXZpc2lvbildKSB7XG4gICAgaWYgKHIud2ViRnVuY3Rpb24gIT09IHdlYkZ1bmN0aW9uKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7c2NvcGUubm9kZS5wYXRofTogcmV2aXNpb24gJHtyLnJldmlzaW9uSWR9IGJlbG9uZ3MgdG8gYW5vdGhlciBmdW5jdGlvbmApO1xuICAgIH1cbiAgfVxuICBpZiAoYWRkaXRpb25hbC5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gW3sgcmV2aXNpb25JZDogcHJpbWFyeS5yZXZpc2lvbklkLCB3ZWlnaHQ6IDEwMCB9XTtcbiAgfVxuICBpZiAoYWRkaXRpb25hbC5sZW5ndGggPiAxKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAke3Njb3BlLm5vZGUucGF0aH06IGFuIGVuZHBvaW50IHJvdXRlcyB0byBhdCBtb3N0IHR3byByZXZpc2lvbnMsIHNvIGFkZGl0aW9uYWxSZXZpc2lvbnMgdGFrZXMgb25lYCk7XG4gIH1cbiAgY29uc3QgW3sgcmV2aXNpb24sIHdlaWdodCB9XSA9IGFkZGl0aW9uYWw7XG4gIGNvbnN0IHBlcmNlbnQgPSBNYXRoLnJvdW5kKHdlaWdodCAqIDEwMCk7XG4gIGlmIChUb2tlbi5pc1VucmVzb2x2ZWQod2VpZ2h0KSB8fCBNYXRoLmFicyh3ZWlnaHQgKiAxMDAgLSBwZXJjZW50KSA+IDFlLTkgfHwgcGVyY2VudCA8IDEgfHwgcGVyY2VudCA+IDk5KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAke3Njb3BlLm5vZGUucGF0aH06IGFuIGFkZGl0aW9uYWwgcmV2aXNpb24ncyB3ZWlnaHQgbXVzdCBiZSBhIHdob2xlIHBlcmNlbnRhZ2UgZnJvbSAwLjAxIHRvIDAuOTksIGdvdCAke3dlaWdodH1gKTtcbiAgfVxuICBpZiAocmV2aXNpb24gPT09IHByaW1hcnkgfHwgKCFUb2tlbi5pc1VucmVzb2x2ZWQocmV2aXNpb24ucmV2aXNpb25JZCkgJiYgcmV2aXNpb24ucmV2aXNpb25JZCA9PT0gcHJpbWFyeS5yZXZpc2lvbklkKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgJHtzY29wZS5ub2RlLnBhdGh9OiB0aGUgYWRkaXRpb25hbCByZXZpc2lvbiBpcyB0aGUgc2FtZSBhcyB0aGUgZW5kcG9pbnQncyByZXZpc2lvbmApO1xuICB9XG4gIHJldHVybiBbeyByZXZpc2lvbklkOiBwcmltYXJ5LnJldmlzaW9uSWQsIHdlaWdodDogMTAwIC0gcGVyY2VudCB9LCB7IHJldmlzaW9uSWQ6IHJldmlzaW9uLnJldmlzaW9uSWQsIHdlaWdodDogcGVyY2VudCB9XTtcbn1cblxuLyoqXG4gKiBgPHByZWZpeD4tPGhhc2g+YCwgd2l0aCB0aGUgaGFzaCBjb3ZlcmluZyB0aGUgZW5kcG9pbnQgdHlwZSBhbmQgcmVnaW9uczogYSB0eXBlIG9yIHJlZ2lvbiBjaGFuZ2UgcHJvZHVjZXNcbiAqIGEgbmV3IG5hbWUsIHNvIHRoZSByZXBsYWNlbWVudCBkb2Vzbid0IGNvbGxpZGUgd2l0aCB0aGUgZW5kcG9pbnQgaXQgcmVwbGFjZXMuXG4gKi9cbmZ1bmN0aW9uIGRlZmF1bHRFbmRwb2ludE5hbWUocHJlZml4OiBzdHJpbmcsIHNlZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCwgZW5kcG9pbnRUeXBlOiBXZWJGdW5jdGlvbkVuZHBvaW50VHlwZSwgZXh0cmFSZWdpb25zOiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gIGNvbnN0IGhhc2ggPSBjcmVhdGVIYXNoKCdzaGEyNTYnKS51cGRhdGUoWy4uLihzZWVkICE9PSB1bmRlZmluZWQgPyBbc2VlZF0gOiBbXSksIGVuZHBvaW50VHlwZSwgLi4uZXh0cmFSZWdpb25zXS5qb2luKCcsJykpLmRpZ2VzdCgnaGV4Jykuc2xpY2UoMCwgOCk7XG4gIHJldHVybiBgJHtwcmVmaXh9LSR7aGFzaH1gO1xufVxuIl19
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import * as iam from 'aws-cdk-lib/aws-iam';
|
|
2
2
|
import type { WebFunctionEndpoint } from './web-function-endpoint';
|
|
3
3
|
/**
|
|
4
|
-
* Grants on a Web Function. Access
|
|
4
|
+
* Grants on a Web Function endpoint. Access them as `fn.grants` (the default endpoint) or `endpoint.grants`.
|
|
5
5
|
*/
|
|
6
6
|
export declare class WebFunctionGrants {
|
|
7
7
|
private readonly endpoint;
|
|
@@ -11,7 +11,7 @@ export declare class WebFunctionGrants {
|
|
|
11
11
|
static _forEndpoint(endpoint: WebFunctionEndpoint): WebFunctionGrants;
|
|
12
12
|
private constructor();
|
|
13
13
|
/**
|
|
14
|
-
* Allows `grantee` to call the
|
|
14
|
+
* Allows `grantee` to call the endpoint (`lambda:InvokeWebFunctionEndpoint`).
|
|
15
15
|
*
|
|
16
16
|
* The grant is on the endpoint's home-region ARN, which IAM evaluates for every region the
|
|
17
17
|
* endpoint serves from, including a MULTI_REGION global URL.
|
|
@@ -37,11 +37,11 @@ exports.WebFunctionGrants = void 0;
|
|
|
37
37
|
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
|
|
38
38
|
const iam = __importStar(require("aws-cdk-lib/aws-iam"));
|
|
39
39
|
/**
|
|
40
|
-
* Grants on a Web Function. Access
|
|
40
|
+
* Grants on a Web Function endpoint. Access them as `fn.grants` (the default endpoint) or `endpoint.grants`.
|
|
41
41
|
*/
|
|
42
42
|
class WebFunctionGrants {
|
|
43
43
|
endpoint;
|
|
44
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "@ashishpandeyone/cdk-lambda-web-function.WebFunctionGrants", version: "0.1.
|
|
44
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@ashishpandeyone/cdk-lambda-web-function.WebFunctionGrants", version: "0.1.2" };
|
|
45
45
|
/**
|
|
46
46
|
* @internal
|
|
47
47
|
*/
|
|
@@ -52,7 +52,7 @@ class WebFunctionGrants {
|
|
|
52
52
|
this.endpoint = endpoint;
|
|
53
53
|
}
|
|
54
54
|
/**
|
|
55
|
-
* Allows `grantee` to call the
|
|
55
|
+
* Allows `grantee` to call the endpoint (`lambda:InvokeWebFunctionEndpoint`).
|
|
56
56
|
*
|
|
57
57
|
* The grant is on the endpoint's home-region ARN, which IAM evaluates for every region the
|
|
58
58
|
* endpoint serves from, including a MULTI_REGION global URL.
|
|
@@ -66,4 +66,4 @@ class WebFunctionGrants {
|
|
|
66
66
|
}
|
|
67
67
|
}
|
|
68
68
|
exports.WebFunctionGrants = WebFunctionGrants;
|
|
69
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
69
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2ViLWZ1bmN0aW9uLWdyYW50cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy93ZWItZnVuY3Rpb24tZ3JhbnRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSx5REFBMkM7QUFHM0M7O0dBRUc7QUFDSCxNQUFhLGlCQUFpQjtJQVFTOztJQVByQzs7T0FFRztJQUNJLE1BQU0sQ0FBQyxZQUFZLENBQUMsUUFBNkI7UUFDdEQsT0FBTyxJQUFJLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFFRCxZQUFxQyxRQUE2QjtRQUE3QixhQUFRLEdBQVIsUUFBUSxDQUFxQjtJQUFHLENBQUM7SUFFdEU7Ozs7O09BS0c7SUFDSSxNQUFNLENBQUMsT0FBdUI7UUFDbkMsT0FBTyxHQUFHLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQztZQUM5QixPQUFPO1lBQ1AsT0FBTyxFQUFFLENBQUMsa0NBQWtDLENBQUM7WUFDN0MsWUFBWSxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUM7U0FDMUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs7QUF0QkgsOENBdUJDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgaWFtIGZyb20gJ2F3cy1jZGstbGliL2F3cy1pYW0nO1xuaW1wb3J0IHR5cGUgeyBXZWJGdW5jdGlvbkVuZHBvaW50IH0gZnJvbSAnLi93ZWItZnVuY3Rpb24tZW5kcG9pbnQnO1xuXG4vKipcbiAqIEdyYW50cyBvbiBhIFdlYiBGdW5jdGlvbiBlbmRwb2ludC4gQWNjZXNzIHRoZW0gYXMgYGZuLmdyYW50c2AgKHRoZSBkZWZhdWx0IGVuZHBvaW50KSBvciBgZW5kcG9pbnQuZ3JhbnRzYC5cbiAqL1xuZXhwb3J0IGNsYXNzIFdlYkZ1bmN0aW9uR3JhbnRzIHtcbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBfZm9yRW5kcG9pbnQoZW5kcG9pbnQ6IFdlYkZ1bmN0aW9uRW5kcG9pbnQpOiBXZWJGdW5jdGlvbkdyYW50cyB7XG4gICAgcmV0dXJuIG5ldyBXZWJGdW5jdGlvbkdyYW50cyhlbmRwb2ludCk7XG4gIH1cblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgZW5kcG9pbnQ6IFdlYkZ1bmN0aW9uRW5kcG9pbnQpIHt9XG5cbiAgLyoqXG4gICAqIEFsbG93cyBgZ3JhbnRlZWAgdG8gY2FsbCB0aGUgZW5kcG9pbnQgKGBsYW1iZGE6SW52b2tlV2ViRnVuY3Rpb25FbmRwb2ludGApLlxuICAgKlxuICAgKiBUaGUgZ3JhbnQgaXMgb24gdGhlIGVuZHBvaW50J3MgaG9tZS1yZWdpb24gQVJOLCB3aGljaCBJQU0gZXZhbHVhdGVzIGZvciBldmVyeSByZWdpb24gdGhlXG4gICAqIGVuZHBvaW50IHNlcnZlcyBmcm9tLCBpbmNsdWRpbmcgYSBNVUxUSV9SRUdJT04gZ2xvYmFsIFVSTC5cbiAgICovXG4gIHB1YmxpYyBpbnZva2UoZ3JhbnRlZTogaWFtLklHcmFudGFibGUpOiBpYW0uR3JhbnQge1xuICAgIHJldHVybiBpYW0uR3JhbnQuYWRkVG9QcmluY2lwYWwoe1xuICAgICAgZ3JhbnRlZSxcbiAgICAgIGFjdGlvbnM6IFsnbGFtYmRhOkludm9rZVdlYkZ1bmN0aW9uRW5kcG9pbnQnXSxcbiAgICAgIHJlc291cmNlQXJuczogW3RoaXMuZW5kcG9pbnQuZW5kcG9pbnRBcm5dLFxuICAgIH0pO1xuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import type * as lambda from 'aws-cdk-lib/aws-lambda';
|
|
2
|
+
import { Construct, type IConstruct } from 'constructs';
|
|
3
|
+
/**
|
|
4
|
+
* A revision of a Web Function: an immutable snapshot of its code and configuration.
|
|
5
|
+
*/
|
|
6
|
+
export interface IWebFunctionRevision extends IConstruct {
|
|
7
|
+
/** The revision's ID, e.g. `rev-a1b2c`. */
|
|
8
|
+
readonly revisionId: string;
|
|
9
|
+
/** The revision's ARN. */
|
|
10
|
+
readonly revisionArn: string;
|
|
11
|
+
/** The function the revision belongs to. */
|
|
12
|
+
readonly webFunction: lambda.IWebFunctionRef;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Attributes of an existing revision.
|
|
16
|
+
*/
|
|
17
|
+
export interface WebFunctionRevisionAttributes {
|
|
18
|
+
/** The function the revision belongs to. */
|
|
19
|
+
readonly webFunction: lambda.IWebFunctionRef;
|
|
20
|
+
/** The revision's ID, e.g. `rev-a1b2c` (the `revisionId` of an earlier deployment). */
|
|
21
|
+
readonly revisionId: string;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* A revision of a Web Function.
|
|
25
|
+
*
|
|
26
|
+
* `WebFunction` creates its current revision (`fn.currentRevision`) from its code and configuration.
|
|
27
|
+
* Use `fromRevisionAttributes` to route an endpoint to an earlier one, which must still exist:
|
|
28
|
+
* only revisions within `revisionRetention`, or that an endpoint routes to, are kept.
|
|
29
|
+
*/
|
|
30
|
+
export declare class WebFunctionRevision extends Construct implements IWebFunctionRevision {
|
|
31
|
+
/**
|
|
32
|
+
* References an existing revision of `webFunction`, e.g. to pin an endpoint to it or split traffic with it.
|
|
33
|
+
*/
|
|
34
|
+
static fromRevisionAttributes(scope: Construct, id: string, attrs: WebFunctionRevisionAttributes): IWebFunctionRevision;
|
|
35
|
+
/**
|
|
36
|
+
* The revision `WebFunction` creates.
|
|
37
|
+
*
|
|
38
|
+
* @internal
|
|
39
|
+
*/
|
|
40
|
+
static _current(scope: Construct, id: string, webFunction: lambda.IWebFunctionRef, revisionId: string, revisionArn: string): WebFunctionRevision;
|
|
41
|
+
readonly webFunction: lambda.IWebFunctionRef;
|
|
42
|
+
readonly revisionId: string;
|
|
43
|
+
readonly revisionArn: string;
|
|
44
|
+
private constructor();
|
|
45
|
+
}
|