@restatedev/restate-cdk 0.3.0 → 0.4.1
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/index.d.ts +3 -0
- package/dist/index.js +4 -1
- package/dist/lambda-service-registry.d.ts +3 -1
- package/dist/lambda-service-registry.js +9 -4
- package/dist/register-service-handler/index.d.ts +4 -3
- package/dist/register-service-handler/index.js +119 -48
- package/dist/registration-provider.d.ts +12 -0
- package/dist/registration-provider.js +77 -0
- package/dist/restate-cloud-endpoint.d.ts +27 -0
- package/dist/restate-cloud-endpoint.js +70 -0
- package/dist/restate-instance.d.ts +13 -0
- package/dist/restate-instance.js +3 -0
- package/dist/single-node-restate-instance.d.ts +7 -24
- package/dist/single-node-restate-instance.js +61 -85
- package/package.json +5 -3
package/dist/index.d.ts
CHANGED
package/dist/index.js
CHANGED
|
@@ -25,5 +25,8 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
25
25
|
};
|
|
26
26
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
27
27
|
__exportStar(require("./lambda-service-registry"), exports);
|
|
28
|
+
__exportStar(require("./registration-provider"), exports);
|
|
29
|
+
__exportStar(require("./restate-cloud-endpoint"), exports);
|
|
30
|
+
__exportStar(require("./restate-instance"), exports);
|
|
28
31
|
__exportStar(require("./single-node-restate-instance"), exports);
|
|
29
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
32
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9saWIvcmVzdGF0ZS1jb25zdHJ1Y3RzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7O0dBU0c7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFSCw0REFBMEM7QUFDMUMsMERBQXdDO0FBQ3hDLDJEQUF5QztBQUN6QyxxREFBbUM7QUFDbkMsaUVBQStDIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAoYykgMjAyMyAtIFJlc3RhdGUgU29mdHdhcmUsIEluYy4sIFJlc3RhdGUgR21iSFxuICpcbiAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBSZXN0YXRlIFNESyBmb3IgTm9kZS5qcy9UeXBlU2NyaXB0LFxuICogd2hpY2ggaXMgcmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuICpcbiAqIFlvdSBjYW4gZmluZCBhIGNvcHkgb2YgdGhlIGxpY2Vuc2UgaW4gZmlsZSBMSUNFTlNFIGluIHRoZSByb290XG4gKiBkaXJlY3Rvcnkgb2YgdGhpcyByZXBvc2l0b3J5IG9yIHBhY2thZ2UsIG9yIGF0XG4gKiBodHRwczovL2dpdGh1Yi5jb20vcmVzdGF0ZWRldi9zZGstdHlwZXNjcmlwdC9ibG9iL21haW4vTElDRU5TRVxuICovXG5cbmV4cG9ydCAqIGZyb20gXCIuL2xhbWJkYS1zZXJ2aWNlLXJlZ2lzdHJ5XCI7XG5leHBvcnQgKiBmcm9tIFwiLi9yZWdpc3RyYXRpb24tcHJvdmlkZXJcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3Jlc3RhdGUtY2xvdWQtZW5kcG9pbnRcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3Jlc3RhdGUtaW5zdGFuY2VcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3NpbmdsZS1ub2RlLXJlc3RhdGUtaW5zdGFuY2VcIjsiXX0=
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import * as lambda from "aws-cdk-lib/aws-lambda";
|
|
2
2
|
import { Construct } from "constructs";
|
|
3
|
+
import { RestateInstance } from "./restate-instance";
|
|
3
4
|
/**
|
|
4
5
|
* A Restate RPC service path. Example: `greeter`.
|
|
5
6
|
*/
|
|
@@ -7,6 +8,7 @@ type RestatePath = string;
|
|
|
7
8
|
export interface RestateInstanceRef {
|
|
8
9
|
readonly metaEndpoint: string;
|
|
9
10
|
readonly invokerRoleArn: string;
|
|
11
|
+
readonly authTokenSecretArn?: string;
|
|
10
12
|
}
|
|
11
13
|
/**
|
|
12
14
|
* A collection of Lambda Restate RPC Service handlers.
|
|
@@ -19,7 +21,7 @@ export type LambdaServiceRegistryProps = {
|
|
|
19
21
|
/**
|
|
20
22
|
* Custom resource provider token required for service discovery.
|
|
21
23
|
*/
|
|
22
|
-
|
|
24
|
+
restate: RestateInstance;
|
|
23
25
|
};
|
|
24
26
|
/**
|
|
25
27
|
* Represents a collection of Lambda-based Restate RPC services. This component is used to register
|
|
@@ -45,10 +45,14 @@ const constructs_1 = require("constructs");
|
|
|
45
45
|
class LambdaServiceRegistry extends constructs_1.Construct {
|
|
46
46
|
constructor(scope, id, props) {
|
|
47
47
|
super(scope, id);
|
|
48
|
+
if (Object.values(props.serviceHandlers).length == 0) {
|
|
49
|
+
throw new Error("Please specify at least one service handler.");
|
|
50
|
+
}
|
|
48
51
|
this.serviceHandlers = props.serviceHandlers;
|
|
49
|
-
this.registrationProviderToken = props.registrationProviderToken;
|
|
52
|
+
this.registrationProviderToken = props.restate.registrationProviderToken.value;
|
|
50
53
|
}
|
|
51
54
|
register(restate) {
|
|
55
|
+
const invokerRole = iam.Role.fromRoleArn(this, "InvokerRole", restate.invokerRoleArn);
|
|
52
56
|
const allowInvokeFunction = new iam.Policy(this, "AllowInvokeFunction", {
|
|
53
57
|
statements: [
|
|
54
58
|
new iam.PolicyStatement({
|
|
@@ -59,7 +63,6 @@ class LambdaServiceRegistry extends constructs_1.Construct {
|
|
|
59
63
|
}),
|
|
60
64
|
],
|
|
61
65
|
});
|
|
62
|
-
const invokerRole = iam.Role.fromRoleArn(this, "InvokerRole", restate.invokerRoleArn);
|
|
63
66
|
invokerRole.attachInlinePolicy(allowInvokeFunction);
|
|
64
67
|
for (const [path, handler] of Object.entries(this.serviceHandlers)) {
|
|
65
68
|
this.registerHandler(restate, { path, handler }, allowInvokeFunction);
|
|
@@ -86,10 +89,12 @@ class RestateServiceRegistrar extends constructs_1.Construct {
|
|
|
86
89
|
properties: {
|
|
87
90
|
servicePath: props.service.path,
|
|
88
91
|
metaEndpoint: props.restate.metaEndpoint,
|
|
92
|
+
authTokenSecretArn: props.restate.authTokenSecretArn,
|
|
89
93
|
serviceLambdaArn: props.service.handler.currentVersion.functionArn,
|
|
90
|
-
|
|
94
|
+
invokeRoleArn: props.restate.invokerRoleArn,
|
|
95
|
+
removalPolicy: cdk.RemovalPolicy.RETAIN,
|
|
91
96
|
},
|
|
92
97
|
});
|
|
93
98
|
}
|
|
94
99
|
}
|
|
95
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
100
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGFtYmRhLXNlcnZpY2UtcmVnaXN0cnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9saWIvcmVzdGF0ZS1jb25zdHJ1Y3RzL2xhbWJkYS1zZXJ2aWNlLXJlZ2lzdHJ5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7O0dBU0c7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRUgsaURBQW1DO0FBQ25DLHlEQUEyQztBQUUzQywyQ0FBdUM7QUErQnZDOzs7O0dBSUc7QUFDSCxNQUFhLHFCQUFzQixTQUFRLHNCQUFTO0lBSWxELFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBaUM7UUFDekUsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQixJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLEVBQUU7WUFDcEQsTUFBTSxJQUFJLEtBQUssQ0FBQyw4Q0FBOEMsQ0FBQyxDQUFDO1NBQ2pFO1FBRUQsSUFBSSxDQUFDLGVBQWUsR0FBRyxLQUFLLENBQUMsZUFBZSxDQUFDO1FBQzdDLElBQUksQ0FBQyx5QkFBeUIsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLHlCQUF5QixDQUFDLEtBQUssQ0FBQztJQUNqRixDQUFDO0lBRU0sUUFBUSxDQUFDLE9BQTJCO1FBQ3pDLE1BQU0sV0FBVyxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxhQUFhLEVBQUUsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBRXRGLE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxxQkFBcUIsRUFBRTtZQUN0RSxVQUFVLEVBQUU7Z0JBQ1YsSUFBSSxHQUFHLENBQUMsZUFBZSxDQUFDO29CQUN0QixHQUFHLEVBQUUsK0JBQStCO29CQUNwQyxPQUFPLEVBQUUsQ0FBQyx1QkFBdUIsQ0FBQztvQkFDbEMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQzt5QkFDM0MsR0FBRyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7aUJBQzlDLENBQUM7YUFDSDtTQUNGLENBQUMsQ0FBQztRQUVILFdBQVcsQ0FBQyxrQkFBa0IsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1FBRXBELEtBQUssTUFBTSxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsRUFBRTtZQUNsRSxJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sRUFBRSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO1NBQ3ZFO0lBQ0gsQ0FBQztJQUVPLGVBQWUsQ0FBQyxPQUEyQixFQUFFLE9BR3BELEVBQUUsbUJBQStCO1FBQ2hDLE1BQU0sU0FBUyxHQUFHLElBQUksdUJBQXVCLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxXQUFXLEVBQUU7WUFDekYsT0FBTztZQUNQLE9BQU87WUFDUCxZQUFZLEVBQUUsSUFBSSxDQUFDLHlCQUF5QjtTQUM3QyxDQUFDLENBQUM7UUFFSCw2R0FBNkc7UUFDN0csaUdBQWlHO1FBQ2pHLFNBQVMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLG1CQUFtQixDQUFDLENBQUM7SUFDcEQsQ0FBQztDQUNGO0FBbERELHNEQWtEQztBQUVELE1BQU0sdUJBQXdCLFNBQVEsc0JBQVM7SUFDN0MsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFDNUIsS0FPQztRQUVYLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakIsSUFBSSxHQUFHLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLFdBQVcsRUFBRTtZQUN4RSxZQUFZLEVBQUUsS0FBSyxDQUFDLFlBQVk7WUFDaEMsWUFBWSxFQUFFLGlDQUFpQztZQUMvQyxVQUFVLEVBQUU7Z0JBQ1YsV0FBVyxFQUFFLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSTtnQkFDL0IsWUFBWSxFQUFFLEtBQUssQ0FBQyxPQUFPLENBQUMsWUFBWTtnQkFDeEMsa0JBQWtCLEVBQUUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxrQkFBa0I7Z0JBQ3BELGdCQUFnQixFQUFFLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxXQUFXO2dCQUNsRSxhQUFhLEVBQUUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxjQUFjO2dCQUMzQyxhQUFhLEVBQUUsR0FBRyxDQUFDLGFBQWEsQ0FBQyxNQUFNO2FBQ1A7U0FDbkMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAoYykgMjAyMyAtIFJlc3RhdGUgU29mdHdhcmUsIEluYy4sIFJlc3RhdGUgR21iSFxuICpcbiAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBSZXN0YXRlIFNESyBmb3IgTm9kZS5qcy9UeXBlU2NyaXB0LFxuICogd2hpY2ggaXMgcmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuICpcbiAqIFlvdSBjYW4gZmluZCBhIGNvcHkgb2YgdGhlIGxpY2Vuc2UgaW4gZmlsZSBMSUNFTlNFIGluIHRoZSByb290XG4gKiBkaXJlY3Rvcnkgb2YgdGhpcyByZXBvc2l0b3J5IG9yIHBhY2thZ2UsIG9yIGF0XG4gKiBodHRwczovL2dpdGh1Yi5jb20vcmVzdGF0ZWRldi9zZGstdHlwZXNjcmlwdC9ibG9iL21haW4vTElDRU5TRVxuICovXG5cbmltcG9ydCAqIGFzIGNkayBmcm9tIFwiYXdzLWNkay1saWJcIjtcbmltcG9ydCAqIGFzIGlhbSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWlhbVwiO1xuaW1wb3J0ICogYXMgbGFtYmRhIGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtbGFtYmRhXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuaW1wb3J0IHsgUmVnaXN0cmF0aW9uUHJvcGVydGllcyB9IGZyb20gXCIuL3JlZ2lzdGVyLXNlcnZpY2UtaGFuZGxlclwiO1xuXG5pbXBvcnQgeyBSZXN0YXRlSW5zdGFuY2UgfSBmcm9tIFwiLi9yZXN0YXRlLWluc3RhbmNlXCI7XG5cbi8qKlxuICogQSBSZXN0YXRlIFJQQyBzZXJ2aWNlIHBhdGguIEV4YW1wbGU6IGBncmVldGVyYC5cbiAqL1xudHlwZSBSZXN0YXRlUGF0aCA9IHN0cmluZztcblxuZXhwb3J0IGludGVyZmFjZSBSZXN0YXRlSW5zdGFuY2VSZWYge1xuICByZWFkb25seSBtZXRhRW5kcG9pbnQ6IHN0cmluZztcbiAgcmVhZG9ubHkgaW52b2tlclJvbGVBcm46IHN0cmluZztcbiAgcmVhZG9ubHkgYXV0aFRva2VuU2VjcmV0QXJuPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEEgY29sbGVjdGlvbiBvZiBMYW1iZGEgUmVzdGF0ZSBSUEMgU2VydmljZSBoYW5kbGVycy5cbiAqL1xuZXhwb3J0IHR5cGUgTGFtYmRhU2VydmljZVJlZ2lzdHJ5UHJvcHMgPSB7XG4gIC8qKlxuICAgKiBNYXBwaW5ncyBmcm9tIHNlcnZpY2UgcGF0aCB0byBMYW1iZGEgaGFuZGxlci5cbiAgICovXG4gIHNlcnZpY2VIYW5kbGVyczogUmVjb3JkPFJlc3RhdGVQYXRoLCBsYW1iZGEuRnVuY3Rpb24+O1xuXG4gIC8qKlxuICAgKiBDdXN0b20gcmVzb3VyY2UgcHJvdmlkZXIgdG9rZW4gcmVxdWlyZWQgZm9yIHNlcnZpY2UgZGlzY292ZXJ5LlxuICAgKi9cbiAgcmVzdGF0ZTogUmVzdGF0ZUluc3RhbmNlO1xufVxuXG4vKipcbiAqIFJlcHJlc2VudHMgYSBjb2xsZWN0aW9uIG9mIExhbWJkYS1iYXNlZCBSZXN0YXRlIFJQQyBzZXJ2aWNlcy4gVGhpcyBjb21wb25lbnQgaXMgdXNlZCB0byByZWdpc3RlclxuICogdGhlbSB3aXRoIGEgc2luZ2xlIFJlc3RhdGUgaW5zdGFuY2UuIFRoaXMgY3JlYXRlcyBhIGN1c3RvbSByZXNvdXJjZSB3aGljaCB3aWxsIHRyaWdnZXIgc2VydmljZVxuICogZGlzY292ZXJ5IG9uIGFueSBoYW5kbGVyIGNoYW5nZXMgZGVwbG95ZWQgdGhyb3VnaCBDREsvQ2xvdWRGb3JtYXRpb24uXG4gKi9cbmV4cG9ydCBjbGFzcyBMYW1iZGFTZXJ2aWNlUmVnaXN0cnkgZXh0ZW5kcyBDb25zdHJ1Y3Qge1xuICBwcml2YXRlIHJlYWRvbmx5IHNlcnZpY2VIYW5kbGVyczogUmVjb3JkPFJlc3RhdGVQYXRoLCBsYW1iZGEuRnVuY3Rpb24+O1xuICBwcml2YXRlIHJlYWRvbmx5IHJlZ2lzdHJhdGlvblByb3ZpZGVyVG9rZW46IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogTGFtYmRhU2VydmljZVJlZ2lzdHJ5UHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgaWYgKE9iamVjdC52YWx1ZXMocHJvcHMuc2VydmljZUhhbmRsZXJzKS5sZW5ndGggPT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUGxlYXNlIHNwZWNpZnkgYXQgbGVhc3Qgb25lIHNlcnZpY2UgaGFuZGxlci5cIik7XG4gICAgfVxuXG4gICAgdGhpcy5zZXJ2aWNlSGFuZGxlcnMgPSBwcm9wcy5zZXJ2aWNlSGFuZGxlcnM7XG4gICAgdGhpcy5yZWdpc3RyYXRpb25Qcm92aWRlclRva2VuID0gcHJvcHMucmVzdGF0ZS5yZWdpc3RyYXRpb25Qcm92aWRlclRva2VuLnZhbHVlO1xuICB9XG5cbiAgcHVibGljIHJlZ2lzdGVyKHJlc3RhdGU6IFJlc3RhdGVJbnN0YW5jZVJlZikge1xuICAgIGNvbnN0IGludm9rZXJSb2xlID0gaWFtLlJvbGUuZnJvbVJvbGVBcm4odGhpcywgXCJJbnZva2VyUm9sZVwiLCByZXN0YXRlLmludm9rZXJSb2xlQXJuKTtcblxuICAgIGNvbnN0IGFsbG93SW52b2tlRnVuY3Rpb24gPSBuZXcgaWFtLlBvbGljeSh0aGlzLCBcIkFsbG93SW52b2tlRnVuY3Rpb25cIiwge1xuICAgICAgc3RhdGVtZW50czogW1xuICAgICAgICBuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgICAgc2lkOiBcIkFsbG93SW52b2tlQW55RnVuY3Rpb25WZXJzaW9uXCIsXG4gICAgICAgICAgYWN0aW9uczogW1wibGFtYmRhOkludm9rZUZ1bmN0aW9uXCJdLFxuICAgICAgICAgIHJlc291cmNlczogT2JqZWN0LnZhbHVlcyh0aGlzLnNlcnZpY2VIYW5kbGVycylcbiAgICAgICAgICAgIC5tYXAoaGFuZGxlciA9PiBoYW5kbGVyLmZ1bmN0aW9uQXJuICsgXCI6KlwiKSxcbiAgICAgICAgfSksXG4gICAgICBdLFxuICAgIH0pO1xuXG4gICAgaW52b2tlclJvbGUuYXR0YWNoSW5saW5lUG9saWN5KGFsbG93SW52b2tlRnVuY3Rpb24pO1xuXG4gICAgZm9yIChjb25zdCBbcGF0aCwgaGFuZGxlcl0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5zZXJ2aWNlSGFuZGxlcnMpKSB7XG4gICAgICB0aGlzLnJlZ2lzdGVySGFuZGxlcihyZXN0YXRlLCB7IHBhdGgsIGhhbmRsZXIgfSwgYWxsb3dJbnZva2VGdW5jdGlvbik7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSByZWdpc3RlckhhbmRsZXIocmVzdGF0ZTogUmVzdGF0ZUluc3RhbmNlUmVmLCBzZXJ2aWNlOiB7XG4gICAgcGF0aDogUmVzdGF0ZVBhdGgsXG4gICAgaGFuZGxlcjogbGFtYmRhLkZ1bmN0aW9uXG4gIH0sIGFsbG93SW52b2tlRnVuY3Rpb246IGlhbS5Qb2xpY3kpIHtcbiAgICBjb25zdCByZWdpc3RyYXIgPSBuZXcgUmVzdGF0ZVNlcnZpY2VSZWdpc3RyYXIodGhpcywgc2VydmljZS5oYW5kbGVyLm5vZGUuaWQgKyBcIkRpc2NvdmVyeVwiLCB7XG4gICAgICByZXN0YXRlLFxuICAgICAgc2VydmljZSxcbiAgICAgIHNlcnZpY2VUb2tlbjogdGhpcy5yZWdpc3RyYXRpb25Qcm92aWRlclRva2VuLFxuICAgIH0pO1xuXG4gICAgLy8gQ2xvdWRGb3JtYXRpb24gZG9lc24ndCBrbm93IHRoYXQgUmVzdGF0ZSBkZXBlbmRzIG9uIHRoaXMgcm9sZSB0byBjYWxsIHNlcnZpY2VzOyB3ZSBtdXN0IGVuc3VyZSB0aGF0IExhbWJkYVxuICAgIC8vIHBlcm1pc3Npb24gY2hhbmdlcyBhcmUgYXBwbGllZCBiZWZvcmUgd2UgY2FuIHRyaWdnZXIgZGlzY292ZXJ5IChyZXByZXNlbnRlZCBieSB0aGUgcmVnaXN0cmFyKS5cbiAgICByZWdpc3RyYXIubm9kZS5hZGREZXBlbmRlbmN5KGFsbG93SW52b2tlRnVuY3Rpb24pO1xuICB9XG59XG5cbmNsYXNzIFJlc3RhdGVTZXJ2aWNlUmVnaXN0cmFyIGV4dGVuZHMgQ29uc3RydWN0IHtcbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZyxcbiAgICAgICAgICAgICAgcHJvcHM6IHtcbiAgICAgICAgICAgICAgICByZXN0YXRlOiBSZXN0YXRlSW5zdGFuY2VSZWYsXG4gICAgICAgICAgICAgICAgc2VydmljZToge1xuICAgICAgICAgICAgICAgICAgcGF0aDogUmVzdGF0ZVBhdGgsXG4gICAgICAgICAgICAgICAgICBoYW5kbGVyOiBsYW1iZGEuRnVuY3Rpb25cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHNlcnZpY2VUb2tlbjogc3RyaW5nLFxuICAgICAgICAgICAgICB9LFxuICApIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgbmV3IGNkay5DdXN0b21SZXNvdXJjZSh0aGlzLCBwcm9wcy5zZXJ2aWNlLmhhbmRsZXIubm9kZS5pZCArIFwiRGlzY292ZXJ5XCIsIHtcbiAgICAgIHNlcnZpY2VUb2tlbjogcHJvcHMuc2VydmljZVRva2VuLFxuICAgICAgcmVzb3VyY2VUeXBlOiBcIkN1c3RvbTo6UmVzdGF0ZVNlcnZpY2VSZWdpc3RyYXJcIixcbiAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgc2VydmljZVBhdGg6IHByb3BzLnNlcnZpY2UucGF0aCxcbiAgICAgICAgbWV0YUVuZHBvaW50OiBwcm9wcy5yZXN0YXRlLm1ldGFFbmRwb2ludCxcbiAgICAgICAgYXV0aFRva2VuU2VjcmV0QXJuOiBwcm9wcy5yZXN0YXRlLmF1dGhUb2tlblNlY3JldEFybixcbiAgICAgICAgc2VydmljZUxhbWJkYUFybjogcHJvcHMuc2VydmljZS5oYW5kbGVyLmN1cnJlbnRWZXJzaW9uLmZ1bmN0aW9uQXJuLFxuICAgICAgICBpbnZva2VSb2xlQXJuOiBwcm9wcy5yZXN0YXRlLmludm9rZXJSb2xlQXJuLFxuICAgICAgICByZW1vdmFsUG9saWN5OiBjZGsuUmVtb3ZhbFBvbGljeS5SRVRBSU4sXG4gICAgICB9IHNhdGlzZmllcyBSZWdpc3RyYXRpb25Qcm9wZXJ0aWVzLFxuICAgIH0pO1xuICB9XG59Il19
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { CloudFormationCustomResourceResponse } from "aws-lambda";
|
|
2
1
|
import { Handler } from "aws-lambda/handler";
|
|
3
2
|
import { CloudFormationCustomResourceEvent } from "aws-lambda/trigger/cloudformation-custom-resource";
|
|
4
3
|
import * as cdk from "aws-cdk-lib";
|
|
@@ -7,10 +6,12 @@ export interface RegistrationProperties {
|
|
|
7
6
|
metaEndpoint?: string;
|
|
8
7
|
serviceEndpoint?: string;
|
|
9
8
|
serviceLambdaArn?: string;
|
|
9
|
+
invokeRoleArn?: string;
|
|
10
10
|
removalPolicy?: cdk.RemovalPolicy;
|
|
11
|
+
authTokenSecretArn?: string;
|
|
11
12
|
}
|
|
12
13
|
/**
|
|
13
14
|
* Custom Resource event handler for Restate service registration. This handler backs the custom resources created by
|
|
14
|
-
* {@link
|
|
15
|
+
* {@link LambdaServiceRegistry} to facilitate Lambda service handler discovery.
|
|
15
16
|
*/
|
|
16
|
-
export declare const handler: Handler<CloudFormationCustomResourceEvent,
|
|
17
|
+
export declare const handler: Handler<CloudFormationCustomResourceEvent, void>;
|
|
@@ -9,15 +9,43 @@
|
|
|
9
9
|
* directory of this repository or package, or at
|
|
10
10
|
* https://github.com/restatedev/sdk-typescript/blob/main/LICENSE
|
|
11
11
|
*/
|
|
12
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
13
|
+
if (k2 === undefined) k2 = k;
|
|
14
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
15
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
16
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
17
|
+
}
|
|
18
|
+
Object.defineProperty(o, k2, desc);
|
|
19
|
+
}) : (function(o, m, k, k2) {
|
|
20
|
+
if (k2 === undefined) k2 = k;
|
|
21
|
+
o[k2] = m[k];
|
|
22
|
+
}));
|
|
23
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
24
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
25
|
+
}) : function(o, v) {
|
|
26
|
+
o["default"] = v;
|
|
27
|
+
});
|
|
28
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
29
|
+
if (mod && mod.__esModule) return mod;
|
|
30
|
+
var result = {};
|
|
31
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
32
|
+
__setModuleDefault(result, mod);
|
|
33
|
+
return result;
|
|
34
|
+
};
|
|
12
35
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
13
36
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
14
37
|
};
|
|
15
38
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
16
39
|
exports.handler = void 0;
|
|
17
40
|
const node_fetch_1 = __importDefault(require("node-fetch"));
|
|
41
|
+
const client_secrets_manager_1 = require("@aws-sdk/client-secrets-manager");
|
|
42
|
+
const https = __importStar(require("https"));
|
|
43
|
+
const MAX_HEALTH_CHECK_ATTEMPTS = 3;
|
|
44
|
+
const MAX_REGISTRATION_ATTEMPTS = 3;
|
|
45
|
+
const INSECURE = true;
|
|
18
46
|
/**
|
|
19
47
|
* Custom Resource event handler for Restate service registration. This handler backs the custom resources created by
|
|
20
|
-
* {@link
|
|
48
|
+
* {@link LambdaServiceRegistry} to facilitate Lambda service handler discovery.
|
|
21
49
|
*/
|
|
22
50
|
const handler = async function (event) {
|
|
23
51
|
console.log({ event });
|
|
@@ -28,82 +56,125 @@ const handler = async function (event) {
|
|
|
28
56
|
// version from Lambda.
|
|
29
57
|
// const props = event.ResourceProperties as RegistrationProperties;
|
|
30
58
|
// if (props.removalPolicy === cdk.RemovalPolicy.DESTROY) {
|
|
59
|
+
// console.log(`De-registering service ${props.serviceLambdaArn}`);
|
|
31
60
|
// const controller = new AbortController();
|
|
32
61
|
// const id = btoa(props.serviceLambdaArn!); // TODO: we should be treating service ids as opaque
|
|
33
|
-
// const
|
|
34
|
-
//
|
|
35
|
-
//
|
|
36
|
-
//
|
|
37
|
-
// })
|
|
38
|
-
//
|
|
62
|
+
// const deleteCallTimeout = setTimeout(() => controller.abort("timeout"), 5_000);
|
|
63
|
+
// const deleteResponse = await fetch(`${props.metaEndpoint}/endpoints/${id}?force=true`, {
|
|
64
|
+
// signal: controller.signal,
|
|
65
|
+
// method: "DELETE",
|
|
66
|
+
// agent: INSECURE ? new https.Agent({ rejectUnauthorized: false }) : undefined,
|
|
67
|
+
// }).finally(() => clearTimeout(deleteCallTimeout));
|
|
68
|
+
//
|
|
39
69
|
// console.log(`Got delete response back: ${deleteResponse.status}`);
|
|
70
|
+
// if (deleteResponse.status != 202) {
|
|
71
|
+
// throw new Error(`Deleting service endpoint failed: ${deleteResponse.statusText} (${deleteResponse.status})`);
|
|
72
|
+
// }
|
|
40
73
|
// }
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
};
|
|
74
|
+
console.warn("De-registering services is not supported currently. Previous version will remain registered.");
|
|
75
|
+
return;
|
|
44
76
|
}
|
|
45
77
|
const props = event.ResourceProperties;
|
|
78
|
+
const authHeader = await createAuthHeader(props);
|
|
79
|
+
let attempt;
|
|
46
80
|
const controller = new AbortController();
|
|
47
|
-
const healthCheckTimeout = setTimeout(() => controller.abort("timeout"), 5000);
|
|
48
81
|
const healthCheckUrl = `${props.metaEndpoint}/health`;
|
|
49
82
|
console.log(`Performing health check against: ${healthCheckUrl}`);
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
83
|
+
attempt = 1;
|
|
84
|
+
while (true) {
|
|
85
|
+
const healthCheckTimeout = setTimeout(() => controller.abort("timeout"), 5000);
|
|
86
|
+
let healthResponse = undefined;
|
|
87
|
+
let errorMessage = undefined;
|
|
88
|
+
try {
|
|
89
|
+
healthResponse = await (0, node_fetch_1.default)(healthCheckUrl, {
|
|
90
|
+
signal: controller.signal,
|
|
91
|
+
headers: authHeader,
|
|
92
|
+
agent: INSECURE ? new https.Agent({ rejectUnauthorized: false }) : undefined,
|
|
93
|
+
}).finally(() => clearTimeout(healthCheckTimeout));
|
|
94
|
+
console.log(`Got health check response back: ${healthResponse.status}`);
|
|
95
|
+
if (healthResponse.status >= 200 && healthResponse.status < 300) {
|
|
96
|
+
break;
|
|
97
|
+
}
|
|
98
|
+
console.error(`Restate health check failed: ${healthResponse.statusText} (${healthResponse.status}; attempt ${attempt})`);
|
|
99
|
+
}
|
|
100
|
+
catch (e) {
|
|
101
|
+
errorMessage = e?.message;
|
|
102
|
+
console.error(`Restate health check failed: "${errorMessage}" (attempt ${attempt})`);
|
|
103
|
+
}
|
|
104
|
+
if (attempt > MAX_HEALTH_CHECK_ATTEMPTS) {
|
|
105
|
+
console.error(`Meta health check still failing after ${attempt} attempts.`);
|
|
106
|
+
throw new Error(errorMessage ?? `${healthResponse?.statusText} (${healthResponse?.status})`);
|
|
107
|
+
}
|
|
108
|
+
attempt += 1;
|
|
109
|
+
const waitTimeMillis = 2 ** attempt * 1000;
|
|
110
|
+
console.log(`Retrying after ${waitTimeMillis} ms...`);
|
|
111
|
+
await sleep(waitTimeMillis);
|
|
61
112
|
}
|
|
62
|
-
|
|
63
|
-
const
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
113
|
+
const endpointsUrl = `${props.metaEndpoint}/endpoints`;
|
|
114
|
+
const registrationRequest = JSON.stringify({
|
|
115
|
+
arn: props.serviceLambdaArn,
|
|
116
|
+
assume_role_arn: props.invokeRoleArn,
|
|
117
|
+
});
|
|
118
|
+
let failureReason;
|
|
119
|
+
console.log(`Triggering registration at ${endpointsUrl}: ${registrationRequest}`);
|
|
120
|
+
attempt = 1;
|
|
67
121
|
while (true) {
|
|
68
122
|
try {
|
|
69
|
-
const
|
|
123
|
+
const registerCallTimeout = setTimeout(() => controller.abort("timeout"), 10000);
|
|
124
|
+
const discoveryResponse = await (0, node_fetch_1.default)(endpointsUrl, {
|
|
70
125
|
signal: controller.signal,
|
|
71
126
|
method: "POST",
|
|
72
127
|
body: registrationRequest,
|
|
73
128
|
headers: {
|
|
74
129
|
"Content-Type": "application/json",
|
|
130
|
+
...authHeader,
|
|
75
131
|
},
|
|
76
|
-
|
|
77
|
-
|
|
132
|
+
agent: INSECURE ? new https.Agent({ rejectUnauthorized: false }) : undefined,
|
|
133
|
+
}).finally(() => clearTimeout(registerCallTimeout));
|
|
78
134
|
console.log(`Got registration response back: ${discoveryResponse.status}`);
|
|
79
135
|
if (discoveryResponse.status >= 200 && discoveryResponse.status < 300) {
|
|
80
|
-
const response = await discoveryResponse.json();
|
|
136
|
+
const response = (await discoveryResponse.json());
|
|
81
137
|
if (response?.services?.[0]?.name !== props.servicePath) {
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
138
|
+
failureReason =
|
|
139
|
+
"Restate service registration failed: service name indicated by service response" +
|
|
140
|
+
` ("${response?.services?.[0]?.name})) does not match the expected value ("${props.servicePath}")!`;
|
|
141
|
+
console.error(failureReason);
|
|
142
|
+
break; // don't throw immediately - let retry loop decide whether to abort
|
|
87
143
|
}
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
Status: "SUCCESS",
|
|
91
|
-
};
|
|
144
|
+
console.log("Success!");
|
|
145
|
+
return;
|
|
92
146
|
}
|
|
93
147
|
}
|
|
94
148
|
catch (e) {
|
|
95
|
-
console.
|
|
149
|
+
console.error(`Service registration call failed: ${e?.message} (attempt ${attempt})`);
|
|
96
150
|
}
|
|
97
|
-
attempt
|
|
98
|
-
if (attempt >= 3) {
|
|
151
|
+
if (attempt > MAX_REGISTRATION_ATTEMPTS) {
|
|
99
152
|
console.error(`Service registration failed after ${attempt} attempts.`);
|
|
100
153
|
break;
|
|
101
154
|
}
|
|
155
|
+
attempt += 1;
|
|
156
|
+
const waitTimeMillis = 2000 + 2 ** attempt * 1000; // 3s -> 6s -> 10s
|
|
157
|
+
console.log(`Retrying registration after ${waitTimeMillis} ms...`);
|
|
158
|
+
await sleep(waitTimeMillis);
|
|
102
159
|
}
|
|
103
|
-
|
|
104
|
-
Reason: `Restate service registration failed: ${healthResponse.statusText} (${healthResponse.status})`,
|
|
105
|
-
Status: "FAILED",
|
|
106
|
-
};
|
|
160
|
+
throw new Error(failureReason ?? "Restate service registration failed. Please see logs for details.");
|
|
107
161
|
};
|
|
108
162
|
exports.handler = handler;
|
|
109
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvcmVzdGF0ZS1jb25zdHJ1Y3RzL3JlZ2lzdGVyLXNlcnZpY2UtaGFuZGxlci9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7OztHQVNHOzs7Ozs7QUFLSCw0REFBK0I7QUFnQi9COzs7R0FHRztBQUNJLE1BQU0sT0FBTyxHQUNsQixLQUFLLFdBQVUsS0FBSztJQUNsQixPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUV2QixJQUFJLEtBQUssQ0FBQyxXQUFXLEtBQUssUUFBUSxFQUFFO1FBQ2xDLGlIQUFpSDtRQUNqSCwyR0FBMkc7UUFDM0csK0dBQStHO1FBQy9HLHVCQUF1QjtRQUV2QixvRUFBb0U7UUFDcEUsMkRBQTJEO1FBQzNELDhDQUE4QztRQUM5QyxtR0FBbUc7UUFDbkcsMkZBQTJGO1FBQzNGLFFBQVE7UUFDUixtQ0FBbUM7UUFDbkMsMEJBQTBCO1FBQzFCLFNBQVM7UUFDVCx5REFBeUQ7UUFDekQsdUVBQXVFO1FBQ3ZFLElBQUk7UUFFSixPQUFPO1lBQ0wsTUFBTSxFQUFFLFNBQVM7U0FDc0MsQ0FBQztLQUMzRDtJQUVELE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxrQkFBNEMsQ0FBQztJQUVqRSxNQUFNLFVBQVUsR0FBRyxJQUFJLGVBQWUsRUFBRSxDQUFDO0lBQ3pDLE1BQU0sa0JBQWtCLEdBQUcsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLEVBQUUsSUFBSyxDQUFDLENBQUM7SUFDaEYsTUFBTSxjQUFjLEdBQUcsR0FBRyxLQUFLLENBQUMsWUFBWSxTQUFTLENBQUM7SUFDdEQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxvQ0FBb0MsY0FBYyxFQUFFLENBQUMsQ0FBQztJQUNsRSxNQUFNLGNBQWMsR0FBRyxNQUFNLElBQUEsb0JBQUssRUFBQyxj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YixJQUFJLE9BQU8sSUFBSSxDQUFDLEVBQUU7WUFDaEIsT0FBTyxDQUFDLEtBQUssQ0FBQyxxQ0FBcUMsT0FBTyxZQUFZLENBQUMsQ0FBQztZQUN4RSxNQUFNO1NBQ1A7S0FDRjtJQUVELE9BQU87UUFDTCxNQUFNLEVBQUUsd0NBQXdDLGNBQWMsQ0FBQyxVQUFVLEtBQUssY0FBYyxDQUFDLE1BQU0sR0FBRztRQUN0RyxNQUFNLEVBQUUsUUFBUTtLQUNqQixDQUFDO0FBQ0osQ0FBQyxDQUFDO0FBcEdTLFFBQUEsT0FBTyxXQW9HaEIiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IChjKSAyMDIzIC0gUmVzdGF0ZSBTb2Z0d2FyZSwgSW5jLiwgUmVzdGF0ZSBHbWJIXG4gKlxuICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIFJlc3RhdGUgU0RLIGZvciBOb2RlLmpzL1R5cGVTY3JpcHQsXG4gKiB3aGljaCBpcyByZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG4gKlxuICogWW91IGNhbiBmaW5kIGEgY29weSBvZiB0aGUgbGljZW5zZSBpbiBmaWxlIExJQ0VOU0UgaW4gdGhlIHJvb3RcbiAqIGRpcmVjdG9yeSBvZiB0aGlzIHJlcG9zaXRvcnkgb3IgcGFja2FnZSwgb3IgYXRcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9yZXN0YXRlZGV2L3Nkay10eXBlc2NyaXB0L2Jsb2IvbWFpbi9MSUNFTlNFXG4gKi9cblxuaW1wb3J0IHsgQ2xvdWRGb3JtYXRpb25DdXN0b21SZXNvdXJjZVJlc3BvbnNlIH0gZnJvbSBcImF3cy1sYW1iZGFcIjtcbmltcG9ydCB7IEhhbmRsZXIgfSBmcm9tIFwiYXdzLWxhbWJkYS9oYW5kbGVyXCI7XG5pbXBvcnQgeyBDbG91ZEZvcm1hdGlvbkN1c3RvbVJlc291cmNlRXZlbnQgfSBmcm9tIFwiYXdzLWxhbWJkYS90cmlnZ2VyL2Nsb3VkZm9ybWF0aW9uLWN1c3RvbS1yZXNvdXJjZVwiO1xuaW1wb3J0IGZldGNoIGZyb20gXCJub2RlLWZldGNoXCI7XG5pbXBvcnQgKiBhcyBjZGsgZnJvbSBcImF3cy1jZGstbGliXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVnaXN0cmF0aW9uUHJvcGVydGllcyB7XG4gIHNlcnZpY2VQYXRoPzogc3RyaW5nO1xuICBtZXRhRW5kcG9pbnQ/OiBzdHJpbmc7XG4gIHNlcnZpY2VFbmRwb2ludD86IHN0cmluZztcbiAgc2VydmljZUxhbWJkYUFybj86IHN0cmluZztcbiAgcmVtb3ZhbFBvbGljeT86IGNkay5SZW1vdmFsUG9saWN5O1xufVxuXG50eXBlIEVuZHBvaW50UmVzcG9uc2UgPSB7XG4gIGlkPzogc3RyaW5nLFxuICBzZXJ2aWNlcz86IHsgbmFtZT86IHN0cmluZywgcmV2aXNpb24/OiBudW1iZXIgfVtdXG59XG5cbi8qKlxuICogQ3VzdG9tIFJlc291cmNlIGV2ZW50IGhhbmRsZXIgZm9yIFJlc3RhdGUgc2VydmljZSByZWdpc3RyYXRpb24uIFRoaXMgaGFuZGxlciBiYWNrcyB0aGUgY3VzdG9tIHJlc291cmNlcyBjcmVhdGVkIGJ5XG4gKiB7QGxpbmsgUmVzdGF0ZUxhbWJkYVNlcnZpY2VDb2xsZWN0aW9ufSB0byBmYWNpbGl0YXRlIExhbWJkYSBzZXJ2aWNlIGhhbmRsZXIgZGlzY292ZXJ5LlxuICovXG5leHBvcnQgY29uc3QgaGFuZGxlcjogSGFuZGxlcjxDbG91ZEZvcm1hdGlvbkN1c3RvbVJlc291cmNlRXZlbnQsIFBhcnRpYWw8Q2xvdWRGb3JtYXRpb25DdXN0b21SZXNvdXJjZVJlc3BvbnNlPj4gPVxuICBhc3luYyBmdW5jdGlvbihldmVudCkge1xuICAgIGNvbnNvbGUubG9nKHsgZXZlbnQgfSk7XG5cbiAgICBpZiAoZXZlbnQuUmVxdWVzdFR5cGUgPT09IFwiRGVsZXRlXCIpIHtcbiAgICAgIC8vIFNpbmNlIHdlIHJldGFpbiBvbGRlciBMYW1iZGEgaGFuZGxlciB2ZXJzaW9ucyBvbiB1cGRhdGUsIHdlIGFsc28gbGVhdmUgdGhlIHJlZ2lzdGVyZWQgc2VydmljZSBhbG9uZS4gVGhlcmUgbWF5XG4gICAgICAvLyBiZSB1bmZpbmlzaGVkIGludm9jYXRpb25zIHRoYXQgcmVxdWlyZSBpdDsgaW4gdGhlIGZ1dHVyZSB3ZSB3b3VsZCB3YW50IHRvIGluZm9ybSBSZXN0YXRlIHRoYXQgd2Ugd2FudCB0b1xuICAgICAgLy8gZGUtcmVnaXN0ZXIgdGhlIHNlcnZpY2UsIGFuZCB3YWl0IGZvciBSZXN0YXRlIHRvIGxldCB1cyBrbm93IHRoYXQgaXQgaXMgc2FmZSB0byBkZWxldGUgdGhlIGRlcGxveWVkIEZ1bmN0aW9uXG4gICAgICAvLyB2ZXJzaW9uIGZyb20gTGFtYmRhLlxuXG4gICAgICAvLyBjb25zdCBwcm9wcyA9IGV2ZW50LlJlc291cmNlUHJvcGVydGllcyBhcyBSZWdpc3RyYXRpb25Qcm9wZXJ0aWVzO1xuICAgICAgLy8gaWYgKHByb3BzLnJlbW92YWxQb2xpY3kgPT09IGNkay5SZW1vdmFsUG9saWN5LkRFU1RST1kpIHtcbiAgICAgIC8vICAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICAgIC8vICAgY29uc3QgaWQgPSBidG9hKHByb3BzLnNlcnZpY2VMYW1iZGFBcm4hKTsgLy8gVE9ETzogd2Ugc2hvdWxkIGJlIHRyZWF0aW5nIHNlcnZpY2UgaWRzIGFzIG9wYXF1ZVxuICAgICAgLy8gICBjb25zdCBkZWxldGVSZXNwb25zZSA9IGF3YWl0IGZldGNoKGAke3Byb3BzLm1ldGFFbmRwb2ludH0vZW5kcG9pbnRzLyR7aWR9P2ZvcmNlPXRydWVgLFxuICAgICAgLy8gICAgIHtcbiAgICAgIC8vICAgICAgIHNpZ25hbDogY29udHJvbGxlci5zaWduYWwsXG4gICAgICAvLyAgICAgICBtZXRob2Q6IFwiREVMRVRFXCIsXG4gICAgICAvLyAgICAgfSlcbiAgICAgIC8vICAgICAuZmluYWxseSgoKSA9PiBjbGVhclRpbWVvdXQocmVnaXN0ZXJDYWxsVGltZW91dCkpO1xuICAgICAgLy8gICBjb25zb2xlLmxvZyhgR290IGRlbGV0ZSByZXNwb25zZSBiYWNrOiAke2RlbGV0ZVJlc3BvbnNlLnN0YXR1c31gKTtcbiAgICAgIC8vIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgU3RhdHVzOiBcIlNVQ0NFU1NcIixcbiAgICAgIH0gc2F0aXNmaWVzIFBhcnRpYWw8Q2xvdWRGb3JtYXRpb25DdXN0b21SZXNvdXJjZVJlc3BvbnNlPjtcbiAgICB9XG5cbiAgICBjb25zdCBwcm9wcyA9IGV2ZW50LlJlc291cmNlUHJvcGVydGllcyBhcyBSZWdpc3RyYXRpb25Qcm9wZXJ0aWVzO1xuXG4gICAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICBjb25zdCBoZWFsdGhDaGVja1RpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IGNvbnRyb2xsZXIuYWJvcnQoXCJ0aW1lb3V0XCIpLCA1XzAwMCk7XG4gICAgY29uc3QgaGVhbHRoQ2hlY2tVcmwgPSBgJHtwcm9wcy5tZXRhRW5kcG9pbnR9L2hlYWx0aGA7XG4gICAgY29uc29sZS5sb2coYFBlcmZvcm1pbmcgaGVhbHRoIGNoZWNrIGFnYWluc3Q6ICR7aGVhbHRoQ2hlY2tVcmx9YCk7XG4gICAgY29uc3QgaGVhbHRoUmVzcG9uc2UgPSBhd2FpdCBmZXRjaChoZWFsdGhDaGVja1VybCxcbiAgICAgIHtcbiAgICAgICAgc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbCxcbiAgICAgIH0pXG4gICAgICAuZmluYWxseSgoKSA9PiBjbGVhclRpbWVvdXQoaGVhbHRoQ2hlY2tUaW1lb3V0KSk7XG5cbiAgICBjb25zb2xlLmxvZyhgR290IGhlYWx0aCBjaGVjayByZXNwb25zZSBiYWNrOiAke2hlYWx0aFJlc3BvbnNlLnN0YXR1c31gKTtcbiAgICBpZiAoIShoZWFsdGhSZXNwb25zZS5zdGF0dXMgPj0gMjAwICYmIGhlYWx0aFJlc3BvbnNlLnN0YXR1cyA8IDMwMCkpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYFJlc3RhdGUgaGVhbHRoIGNoZWNrIGZhaWxlZDogJHtoZWFsdGhSZXNwb25zZS5zdGF0dXNUZXh0fSAoJHtoZWFsdGhSZXNwb25zZS5zdGF0dXN9KWApO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgUmVhc29uOiBgUmVzdGF0ZSBoZWFsdGggY2hlY2sgZmFpbGVkOiAke2hlYWx0aFJlc3BvbnNlLnN0YXR1c1RleHR9ICgke2hlYWx0aFJlc3BvbnNlLnN0YXR1c30pYCxcbiAgICAgICAgU3RhdHVzOiBcIkZBSUxFRFwiLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBsZXQgYXR0ZW1wdCA9IDE7XG4gICAgY29uc3QgcmVnaXN0ZXJDYWxsVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4gY29udHJvbGxlci5hYm9ydChcInRpbWVvdXRcIiksIDEwXzAwMCk7XG4gICAgY29uc3QgZGlzY292ZXJ5RW5kcG9pbnRVcmwgPSBgJHtwcm9wcy5tZXRhRW5kcG9pbnR9L2VuZHBvaW50c2A7XG4gICAgY29uc3QgcmVnaXN0cmF0aW9uUmVxdWVzdCA9IEpTT04uc3RyaW5naWZ5KHsgYXJuOiBwcm9wcy5zZXJ2aWNlTGFtYmRhQXJuIH0pO1xuICAgIGNvbnNvbGUubG9nKGBUcmlnZ2VyaW5nIHJlZ2lzdHJhdGlvbiBhdCAke2Rpc2NvdmVyeUVuZHBvaW50VXJsfTogJHtyZWdpc3RyYXRpb25SZXF1ZXN0fSAoYXR0ZW1wdCAke2F0dGVtcHR9KWApO1xuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBkaXNjb3ZlcnlSZXNwb25zZSA9IGF3YWl0IGZldGNoKGRpc2NvdmVyeUVuZHBvaW50VXJsLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHNpZ25hbDogY29udHJvbGxlci5zaWduYWwsXG4gICAgICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgICAgICAgYm9keTogcmVnaXN0cmF0aW9uUmVxdWVzdCxcbiAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pXG4gICAgICAgICAgLmZpbmFsbHkoKCkgPT4gY2xlYXJUaW1lb3V0KHJlZ2lzdGVyQ2FsbFRpbWVvdXQpKTtcblxuICAgICAgICBjb25zb2xlLmxvZyhgR290IHJlZ2lzdHJhdGlvbiByZXNwb25zZSBiYWNrOiAke2Rpc2NvdmVyeVJlc3BvbnNlLnN0YXR1c31gKTtcblxuICAgICAgICBpZiAoZGlzY292ZXJ5UmVzcG9uc2Uuc3RhdHVzID49IDIwMCAmJiBkaXNjb3ZlcnlSZXNwb25zZS5zdGF0dXMgPCAzMDApIHtcbiAgICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGRpc2NvdmVyeVJlc3BvbnNlLmpzb24oKSBhcyBFbmRwb2ludFJlc3BvbnNlO1xuXG4gICAgICAgICAgaWYgKHJlc3BvbnNlPy5zZXJ2aWNlcz8uWzBdPy5uYW1lICE9PSBwcm9wcy5zZXJ2aWNlUGF0aCkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihgU2VydmljZSByZWdpc3RyYXRpb24gZmFpbGVkOiAke2Rpc2NvdmVyeVJlc3BvbnNlLnN0YXR1c1RleHR9ICgke2Rpc2NvdmVyeVJlc3BvbnNlLnN0YXR1c30pYCk7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBSZWFzb246IGBSZXN0YXRlIHNlcnZpY2UgcmVnaXN0cmF0aW9uIGZhaWxlZDogbmFtZSByZXR1cm5lZCBieSBzZXJ2aWNlIChcIiR7cmVzcG9uc2U/LnNlcnZpY2VzPy5bMF0/Lm5hbWV9KSkgZG9lcyBub3QgbWF0Y2ggZXhwZWN0ZWQgKFwiJHtwcm9wcy5zZXJ2aWNlUGF0aH1cIilgLFxuICAgICAgICAgICAgICBTdGF0dXM6IFwiRkFJTEVEXCIsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBEYXRhOiByZXNwb25zZSxcbiAgICAgICAgICAgIFN0YXR1czogXCJTVUNDRVNTXCIsXG4gICAgICAgICAgfSBzYXRpc2ZpZXMgUGFydGlhbDxDbG91ZEZvcm1hdGlvbkN1c3RvbVJlc291cmNlUmVzcG9uc2U+O1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBTZXJ2aWNlIHJlZ2lzdHJhdGlvbiBjYWxsIGZhaWxlZDogJHsoZSBhcyBFcnJvcik/Lm1lc3NhZ2V9IChhdHRlbXB0ICR7YXR0ZW1wdH0pYCk7XG4gICAgICB9XG5cbiAgICAgIGF0dGVtcHQgKz0gMTtcbiAgICAgIGlmIChhdHRlbXB0ID49IDMpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgU2VydmljZSByZWdpc3RyYXRpb24gZmFpbGVkIGFmdGVyICR7YXR0ZW1wdH0gYXR0ZW1wdHMuYCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBSZWFzb246IGBSZXN0YXRlIHNlcnZpY2UgcmVnaXN0cmF0aW9uIGZhaWxlZDogJHtoZWFsdGhSZXNwb25zZS5zdGF0dXNUZXh0fSAoJHtoZWFsdGhSZXNwb25zZS5zdGF0dXN9KWAsXG4gICAgICBTdGF0dXM6IFwiRkFJTEVEXCIsXG4gICAgfTtcbiAgfTsiXX0=
|
|
163
|
+
async function createAuthHeader(props) {
|
|
164
|
+
if (!props.authTokenSecretArn) {
|
|
165
|
+
return {};
|
|
166
|
+
}
|
|
167
|
+
console.log(`Using bearer authentication token from secret ${props.authTokenSecretArn}`);
|
|
168
|
+
const ssm = new client_secrets_manager_1.SecretsManagerClient();
|
|
169
|
+
const response = await ssm.send(new client_secrets_manager_1.GetSecretValueCommand({
|
|
170
|
+
SecretId: props.authTokenSecretArn,
|
|
171
|
+
}));
|
|
172
|
+
console.log(`Successfully retrieved secret "${response.Name}" version ${response.VersionId}`);
|
|
173
|
+
return {
|
|
174
|
+
Authorization: `Bearer ${response.SecretString}`,
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
async function sleep(millis) {
|
|
178
|
+
await new Promise((resolve) => setTimeout(resolve, millis));
|
|
179
|
+
}
|
|
180
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvcmVzdGF0ZS1jb25zdHJ1Y3RzL3JlZ2lzdGVyLXNlcnZpY2UtaGFuZGxlci9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7OztHQVNHOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUlILDREQUErQjtBQUUvQiw0RUFBOEY7QUFDOUYsNkNBQStCO0FBaUIvQixNQUFNLHlCQUF5QixHQUFHLENBQUMsQ0FBQztBQUNwQyxNQUFNLHlCQUF5QixHQUFHLENBQUMsQ0FBQztBQUVwQyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUM7QUFFdEI7OztHQUdHO0FBQ0ksTUFBTSxPQUFPLEdBQXFELEtBQUssV0FBVyxLQUFLO0lBQzVGLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBRXZCLElBQUksS0FBSyxDQUFDLFdBQVcsS0FBSyxRQUFRLEVBQUU7UUFDbEMsaUhBQWlIO1FBQ2pILDJHQUEyRztRQUMzRywrR0FBK0c7UUFDL0csdUJBQXVCO1FBRXZCLG9FQUFvRTtRQUNwRSwyREFBMkQ7UUFDM0QscUVBQXFFO1FBQ3JFLDhDQUE4QztRQUM5QyxtR0FBbUc7UUFDbkcsb0ZBQW9GO1FBQ3BGLDZGQUE2RjtRQUM3RixpQ0FBaUM7UUFDakMsd0JBQXdCO1FBQ3hCLG9GQUFvRjtRQUNwRix1REFBdUQ7UUFDdkQsRUFBRTtRQUNGLHVFQUF1RTtRQUN2RSx3Q0FBd0M7UUFDeEMsb0hBQW9IO1FBQ3BILE1BQU07UUFDTixJQUFJO1FBRUosT0FBTyxDQUFDLElBQUksQ0FBQyw4RkFBOEYsQ0FBQyxDQUFDO1FBQzdHLE9BQU87S0FDUjtJQUVELE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxrQkFBNEMsQ0FBQztJQUNqRSxNQUFNLFVBQVUsR0FBRyxNQUFNLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRWpELElBQUksT0FBTyxDQUFDO0lBQ1osTUFBTSxVQUFVLEdBQUcsSUFBSSxlQUFlLEVBQUUsQ0FBQztJQUV6QyxNQUFNLGNBQWMsR0FBRyxHQUFHLEtBQUssQ0FBQyxZQUFZLFNBQVMsQ0FBQztJQUV0RCxPQUFPLENBQUMsR0FBRyxDQUFDLG9DQUFvQyxjQUFjLEVBQUUsQ0FBQyxDQUFDO0lBQ2xFLE9BQU8sR0FBRyxDQUFDLENBQUM7SUFDWixPQUFPLElBQUksRUFBRTtRQUNYLE1BQU0sa0JBQWtCLEdBQUcsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLEVBQUUsSUFBSyxDQUFDLENBQUM7UUFDaEYsSUFBSSxjQUFjLEdBQUcsU0FBUyxDQUFDO1FBQy9CLElBQUksWUFBWSxHQUFHLFNBQVMsQ0FBQztRQUM3QixJQUFJO1lBQ0YsY0FBYyxHQUFHLE1BQU0sSUFBQSxvQkFBSyxFQUFDLGNBQWMsRUFBRTtnQkFDM0MsTUFBTSxFQUFFLFVBQVUsQ0FBQyxNQUFNO2dCQUN6QixPQUFPLEVBQUUsVUFBVTtnQkFDbkIsS0FBSyxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLEVBQUUsa0JBQWtCLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUzthQUM3RSxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDLFlBQVksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUM7WUFFbkQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxtQ0FBbUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7WUFDeEUsSUFBSSxjQUFjLENBQUMsTUFBTSxJQUFJLEdBQUcsSUFBSSxjQUFjLENBQUMsTUFBTSxHQUFHLEdBQUcsRUFBRTtnQkFDL0QsTUFBTTthQUNQO1lBQ0QsT0FBTyxDQUFDLEtBQUssQ0FDWCxnQ0FBZ0MsY0FBYyxDQUFDLFVBQVUsS0FBSyxjQUFjLENBQUMsTUFBTSxhQUFhLE9BQU8sR0FBRyxDQUMzRyxDQUFDO1NBQ0g7UUFBQyxPQUFPLENBQUMsRUFBRTtZQUNWLFlBQVksR0FBSSxDQUFXLEVBQUUsT0FBTyxDQUFDO1lBQ3JDLE9BQU8sQ0FBQyxLQUFLLENBQUMsaUNBQWlDLFlBQVksY0FBYyxPQUFPLEdBQUcsQ0FBQyxDQUFDO1NBQ3RGO1FBRUQsSUFBSSxPQUFPLEdBQUcseUJBQXlCLEVBQUU7WUFDdkMsT0FBTyxDQUFDLEtBQUssQ0FBQyx5Q0FBeUMsT0FBTyxZQUFZLENBQUMsQ0FBQztZQUM1RSxNQUFNLElBQUksS0FBSyxDQUFDLFlBQVksSUFBSSxHQUFHLGNBQWMsRUFBRSxVQUFVLEtBQUssY0FBYyxFQUFFLE1BQU0sR0FBRyxDQUFDLENBQUM7U0FDOUY7UUFDRCxPQUFPLElBQUksQ0FBQyxDQUFDO1FBRWIsTUFBTSxjQUFjLEdBQUcsQ0FBQyxJQUFJLE9BQU8sR0FBRyxJQUFLLENBQUM7UUFDNUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsY0FBYyxRQUFRLENBQUMsQ0FBQztRQUN0RCxNQUFNLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQztLQUM3QjtJQUVELE1BQU0sWUFBWSxHQUFHLEdBQUcsS0FBSyxDQUFDLFlBQVksWUFBWSxDQUFDO0lBQ3ZELE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztRQUN6QyxHQUFHLEVBQUUsS0FBSyxDQUFDLGdCQUFnQjtRQUMzQixlQUFlLEVBQUUsS0FBSyxDQUFDLGFBQWE7S0FDckMsQ0FBQyxDQUFDO0lBRUgsSUFBSSxhQUFhLENBQUM7SUFDbEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyw4QkFBOEIsWUFBWSxLQUFLLG1CQUFtQixFQUFFLENBQUMsQ0FBQztJQUNsRixPQUFPLEdBQUcsQ0FBQyxDQUFDO0lBQ1osT0FBTyxJQUFJLEVBQUU7UUFDWCxJQUFJO1lBQ0YsTUFBTSxtQkFBbUIsR0FBRyxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsRUFBRSxLQUFNLENBQUMsQ0FBQztZQUNsRixNQUFNLGlCQUFpQixHQUFHLE1BQU0sSUFBQSxvQkFBSyxFQUFDLFlBQVksRUFBRTtnQkFDbEQsTUFBTSxFQUFFLFVBQVUsQ0FBQyxNQUFNO2dCQUN6QixNQUFNLEVBQUUsTUFBTTtnQkFDZCxJQUFJLEVBQUUsbUJBQW1CO2dCQUN6QixPQUFPLEVBQUU7b0JBQ1AsY0FBYyxFQUFFLGtCQUFrQjtvQkFDbEMsR0FBRyxVQUFVO2lCQUNkO2dCQUNELEtBQUssRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxFQUFFLGtCQUFrQixFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVM7YUFDN0UsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxZQUFZLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDO1lBRXBELE9BQU8sQ0FBQyxHQUFHLENBQUMsbUNBQW1DLGlCQUFpQixDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7WUFFM0UsSUFBSSxpQkFBaUIsQ0FBQyxNQUFNLElBQUksR0FBRyxJQUFJLGlCQUFpQixDQUFDLE1BQU0sR0FBRyxHQUFHLEVBQUU7Z0JBQ3JFLE1BQU0sUUFBUSxHQUFHLENBQUMsTUFBTSxpQkFBaUIsQ0FBQyxJQUFJLEVBQUUsQ0FBcUIsQ0FBQztnQkFFdEUsSUFBSSxRQUFRLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxLQUFLLEtBQUssQ0FBQyxXQUFXLEVBQUU7b0JBQ3ZELGFBQWE7d0JBQ1gsaUZBQWlGOzRCQUNqRixNQUFNLFFBQVEsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLDBDQUEwQyxLQUFLLENBQUMsV0FBVyxLQUFLLENBQUM7b0JBQ3RHLE9BQU8sQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUM7b0JBQzdCLE1BQU0sQ0FBQyxtRUFBbUU7aUJBQzNFO2dCQUVELE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUM7Z0JBQ3hCLE9BQU87YUFDUjtTQUNGO1FBQUMsT0FBTyxDQUFDLEVBQUU7WUFDVixPQUFPLENBQUMsS0FBSyxDQUFDLHFDQUFzQyxDQUFXLEVBQUUsT0FBTyxhQUFhLE9BQU8sR0FBRyxDQUFDLENBQUM7U0FDbEc7UUFFRCxJQUFJLE9BQU8sR0FBRyx5QkFBeUIsRUFBRTtZQUN2QyxPQUFPLENBQUMsS0FBSyxDQUFDLHFDQUFxQyxPQUFPLFlBQVksQ0FBQyxDQUFDO1lBQ3hFLE1BQU07U0FDUDtRQUNELE9BQU8sSUFBSSxDQUFDLENBQUM7UUFDYixNQUFNLGNBQWMsR0FBRyxJQUFLLEdBQUcsQ0FBQyxJQUFJLE9BQU8sR0FBRyxJQUFLLENBQUMsQ0FBQyxrQkFBa0I7UUFDdkUsT0FBTyxDQUFDLEdBQUcsQ0FBQywrQkFBK0IsY0FBYyxRQUFRLENBQUMsQ0FBQztRQUNuRSxNQUFNLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQztLQUM3QjtJQUVELE1BQU0sSUFBSSxLQUFLLENBQUMsYUFBYSxJQUFJLG1FQUFtRSxDQUFDLENBQUM7QUFDeEcsQ0FBQyxDQUFDO0FBaklXLFFBQUEsT0FBTyxXQWlJbEI7QUFFRixLQUFLLFVBQVUsZ0JBQWdCLENBQUMsS0FBNkI7SUFDM0QsSUFBSSxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsRUFBRTtRQUM3QixPQUFPLEVBQUUsQ0FBQztLQUNYO0lBRUQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxpREFBaUQsS0FBSyxDQUFDLGtCQUFrQixFQUFFLENBQUMsQ0FBQztJQUN6RixNQUFNLEdBQUcsR0FBRyxJQUFJLDZDQUFvQixFQUFFLENBQUM7SUFDdkMsTUFBTSxRQUFRLEdBQUcsTUFBTSxHQUFHLENBQUMsSUFBSSxDQUM3QixJQUFJLDhDQUFxQixDQUFDO1FBQ3hCLFFBQVEsRUFBRSxLQUFLLENBQUMsa0JBQWtCO0tBQ25DLENBQUMsQ0FDSCxDQUFDO0lBRUYsT0FBTyxDQUFDLEdBQUcsQ0FBQyxrQ0FBa0MsUUFBUSxDQUFDLElBQUksYUFBYSxRQUFRLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQztJQUM5RixPQUFPO1FBQ0wsYUFBYSxFQUFFLFVBQVUsUUFBUSxDQUFDLFlBQVksRUFBRTtLQUNqRCxDQUFDO0FBQ0osQ0FBQztBQUVELEtBQUssVUFBVSxLQUFLLENBQUMsTUFBYztJQUNqQyxNQUFNLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUM7QUFDOUQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjMgLSBSZXN0YXRlIFNvZnR3YXJlLCBJbmMuLCBSZXN0YXRlIEdtYkhcbiAqXG4gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgUmVzdGF0ZSBTREsgZm9yIE5vZGUuanMvVHlwZVNjcmlwdCxcbiAqIHdoaWNoIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbiAqXG4gKiBZb3UgY2FuIGZpbmQgYSBjb3B5IG9mIHRoZSBsaWNlbnNlIGluIGZpbGUgTElDRU5TRSBpbiB0aGUgcm9vdFxuICogZGlyZWN0b3J5IG9mIHRoaXMgcmVwb3NpdG9yeSBvciBwYWNrYWdlLCBvciBhdFxuICogaHR0cHM6Ly9naXRodWIuY29tL3Jlc3RhdGVkZXYvc2RrLXR5cGVzY3JpcHQvYmxvYi9tYWluL0xJQ0VOU0VcbiAqL1xuXG5pbXBvcnQgeyBIYW5kbGVyIH0gZnJvbSBcImF3cy1sYW1iZGEvaGFuZGxlclwiO1xuaW1wb3J0IHsgQ2xvdWRGb3JtYXRpb25DdXN0b21SZXNvdXJjZUV2ZW50IH0gZnJvbSBcImF3cy1sYW1iZGEvdHJpZ2dlci9jbG91ZGZvcm1hdGlvbi1jdXN0b20tcmVzb3VyY2VcIjtcbmltcG9ydCBmZXRjaCBmcm9tIFwibm9kZS1mZXRjaFwiO1xuaW1wb3J0ICogYXMgY2RrIGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuaW1wb3J0IHsgR2V0U2VjcmV0VmFsdWVDb21tYW5kLCBTZWNyZXRzTWFuYWdlckNsaWVudCB9IGZyb20gXCJAYXdzLXNkay9jbGllbnQtc2VjcmV0cy1tYW5hZ2VyXCI7XG5pbXBvcnQgKiBhcyBodHRwcyBmcm9tIFwiaHR0cHNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBSZWdpc3RyYXRpb25Qcm9wZXJ0aWVzIHtcbiAgc2VydmljZVBhdGg/OiBzdHJpbmc7XG4gIG1ldGFFbmRwb2ludD86IHN0cmluZztcbiAgc2VydmljZUVuZHBvaW50Pzogc3RyaW5nO1xuICBzZXJ2aWNlTGFtYmRhQXJuPzogc3RyaW5nO1xuICBpbnZva2VSb2xlQXJuPzogc3RyaW5nO1xuICByZW1vdmFsUG9saWN5PzogY2RrLlJlbW92YWxQb2xpY3k7XG4gIGF1dGhUb2tlblNlY3JldEFybj86IHN0cmluZztcbn1cblxudHlwZSBFbmRwb2ludFJlc3BvbnNlID0ge1xuICBpZD86IHN0cmluZztcbiAgc2VydmljZXM/OiB7IG5hbWU/OiBzdHJpbmc7IHJldmlzaW9uPzogbnVtYmVyIH1bXTtcbn07XG5cbmNvbnN0IE1BWF9IRUFMVEhfQ0hFQ0tfQVRURU1QVFMgPSAzO1xuY29uc3QgTUFYX1JFR0lTVFJBVElPTl9BVFRFTVBUUyA9IDM7XG5cbmNvbnN0IElOU0VDVVJFID0gdHJ1ZTtcblxuLyoqXG4gKiBDdXN0b20gUmVzb3VyY2UgZXZlbnQgaGFuZGxlciBmb3IgUmVzdGF0ZSBzZXJ2aWNlIHJlZ2lzdHJhdGlvbi4gVGhpcyBoYW5kbGVyIGJhY2tzIHRoZSBjdXN0b20gcmVzb3VyY2VzIGNyZWF0ZWQgYnlcbiAqIHtAbGluayBMYW1iZGFTZXJ2aWNlUmVnaXN0cnl9IHRvIGZhY2lsaXRhdGUgTGFtYmRhIHNlcnZpY2UgaGFuZGxlciBkaXNjb3ZlcnkuXG4gKi9cbmV4cG9ydCBjb25zdCBoYW5kbGVyOiBIYW5kbGVyPENsb3VkRm9ybWF0aW9uQ3VzdG9tUmVzb3VyY2VFdmVudCwgdm9pZD4gPSBhc3luYyBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgY29uc29sZS5sb2coeyBldmVudCB9KTtcblxuICBpZiAoZXZlbnQuUmVxdWVzdFR5cGUgPT09IFwiRGVsZXRlXCIpIHtcbiAgICAvLyBTaW5jZSB3ZSByZXRhaW4gb2xkZXIgTGFtYmRhIGhhbmRsZXIgdmVyc2lvbnMgb24gdXBkYXRlLCB3ZSBhbHNvIGxlYXZlIHRoZSByZWdpc3RlcmVkIHNlcnZpY2UgYWxvbmUuIFRoZXJlIG1heVxuICAgIC8vIGJlIHVuZmluaXNoZWQgaW52b2NhdGlvbnMgdGhhdCByZXF1aXJlIGl0OyBpbiB0aGUgZnV0dXJlIHdlIHdvdWxkIHdhbnQgdG8gaW5mb3JtIFJlc3RhdGUgdGhhdCB3ZSB3YW50IHRvXG4gICAgLy8gZGUtcmVnaXN0ZXIgdGhlIHNlcnZpY2UsIGFuZCB3YWl0IGZvciBSZXN0YXRlIHRvIGxldCB1cyBrbm93IHRoYXQgaXQgaXMgc2FmZSB0byBkZWxldGUgdGhlIGRlcGxveWVkIEZ1bmN0aW9uXG4gICAgLy8gdmVyc2lvbiBmcm9tIExhbWJkYS5cblxuICAgIC8vIGNvbnN0IHByb3BzID0gZXZlbnQuUmVzb3VyY2VQcm9wZXJ0aWVzIGFzIFJlZ2lzdHJhdGlvblByb3BlcnRpZXM7XG4gICAgLy8gaWYgKHByb3BzLnJlbW92YWxQb2xpY3kgPT09IGNkay5SZW1vdmFsUG9saWN5LkRFU1RST1kpIHtcbiAgICAvLyAgIGNvbnNvbGUubG9nKGBEZS1yZWdpc3RlcmluZyBzZXJ2aWNlICR7cHJvcHMuc2VydmljZUxhbWJkYUFybn1gKTtcbiAgICAvLyAgIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgLy8gICBjb25zdCBpZCA9IGJ0b2EocHJvcHMuc2VydmljZUxhbWJkYUFybiEpOyAvLyBUT0RPOiB3ZSBzaG91bGQgYmUgdHJlYXRpbmcgc2VydmljZSBpZHMgYXMgb3BhcXVlXG4gICAgLy8gICBjb25zdCBkZWxldGVDYWxsVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4gY29udHJvbGxlci5hYm9ydChcInRpbWVvdXRcIiksIDVfMDAwKTtcbiAgICAvLyAgIGNvbnN0IGRlbGV0ZVJlc3BvbnNlID0gYXdhaXQgZmV0Y2goYCR7cHJvcHMubWV0YUVuZHBvaW50fS9lbmRwb2ludHMvJHtpZH0/Zm9yY2U9dHJ1ZWAsIHtcbiAgICAvLyAgICAgc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbCxcbiAgICAvLyAgICAgbWV0aG9kOiBcIkRFTEVURVwiLFxuICAgIC8vICAgICBhZ2VudDogSU5TRUNVUkUgPyBuZXcgaHR0cHMuQWdlbnQoeyByZWplY3RVbmF1dGhvcml6ZWQ6IGZhbHNlIH0pIDogdW5kZWZpbmVkLFxuICAgIC8vICAgfSkuZmluYWxseSgoKSA9PiBjbGVhclRpbWVvdXQoZGVsZXRlQ2FsbFRpbWVvdXQpKTtcbiAgICAvL1xuICAgIC8vICAgY29uc29sZS5sb2coYEdvdCBkZWxldGUgcmVzcG9uc2UgYmFjazogJHtkZWxldGVSZXNwb25zZS5zdGF0dXN9YCk7XG4gICAgLy8gICBpZiAoZGVsZXRlUmVzcG9uc2Uuc3RhdHVzICE9IDIwMikge1xuICAgIC8vICAgICB0aHJvdyBuZXcgRXJyb3IoYERlbGV0aW5nIHNlcnZpY2UgZW5kcG9pbnQgZmFpbGVkOiAke2RlbGV0ZVJlc3BvbnNlLnN0YXR1c1RleHR9ICgke2RlbGV0ZVJlc3BvbnNlLnN0YXR1c30pYCk7XG4gICAgLy8gICB9XG4gICAgLy8gfVxuXG4gICAgY29uc29sZS53YXJuKFwiRGUtcmVnaXN0ZXJpbmcgc2VydmljZXMgaXMgbm90IHN1cHBvcnRlZCBjdXJyZW50bHkuIFByZXZpb3VzIHZlcnNpb24gd2lsbCByZW1haW4gcmVnaXN0ZXJlZC5cIik7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgcHJvcHMgPSBldmVudC5SZXNvdXJjZVByb3BlcnRpZXMgYXMgUmVnaXN0cmF0aW9uUHJvcGVydGllcztcbiAgY29uc3QgYXV0aEhlYWRlciA9IGF3YWl0IGNyZWF0ZUF1dGhIZWFkZXIocHJvcHMpO1xuXG4gIGxldCBhdHRlbXB0O1xuICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuXG4gIGNvbnN0IGhlYWx0aENoZWNrVXJsID0gYCR7cHJvcHMubWV0YUVuZHBvaW50fS9oZWFsdGhgO1xuXG4gIGNvbnNvbGUubG9nKGBQZXJmb3JtaW5nIGhlYWx0aCBjaGVjayBhZ2FpbnN0OiAke2hlYWx0aENoZWNrVXJsfWApO1xuICBhdHRlbXB0ID0gMTtcbiAgd2hpbGUgKHRydWUpIHtcbiAgICBjb25zdCBoZWFsdGhDaGVja1RpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IGNvbnRyb2xsZXIuYWJvcnQoXCJ0aW1lb3V0XCIpLCA1XzAwMCk7XG4gICAgbGV0IGhlYWx0aFJlc3BvbnNlID0gdW5kZWZpbmVkO1xuICAgIGxldCBlcnJvck1lc3NhZ2UgPSB1bmRlZmluZWQ7XG4gICAgdHJ5IHtcbiAgICAgIGhlYWx0aFJlc3BvbnNlID0gYXdhaXQgZmV0Y2goaGVhbHRoQ2hlY2tVcmwsIHtcbiAgICAgICAgc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbCxcbiAgICAgICAgaGVhZGVyczogYXV0aEhlYWRlcixcbiAgICAgICAgYWdlbnQ6IElOU0VDVVJFID8gbmV3IGh0dHBzLkFnZW50KHsgcmVqZWN0VW5hdXRob3JpemVkOiBmYWxzZSB9KSA6IHVuZGVmaW5lZCxcbiAgICAgIH0pLmZpbmFsbHkoKCkgPT4gY2xlYXJUaW1lb3V0KGhlYWx0aENoZWNrVGltZW91dCkpO1xuXG4gICAgICBjb25zb2xlLmxvZyhgR290IGhlYWx0aCBjaGVjayByZXNwb25zZSBiYWNrOiAke2hlYWx0aFJlc3BvbnNlLnN0YXR1c31gKTtcbiAgICAgIGlmIChoZWFsdGhSZXNwb25zZS5zdGF0dXMgPj0gMjAwICYmIGhlYWx0aFJlc3BvbnNlLnN0YXR1cyA8IDMwMCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgIGBSZXN0YXRlIGhlYWx0aCBjaGVjayBmYWlsZWQ6ICR7aGVhbHRoUmVzcG9uc2Uuc3RhdHVzVGV4dH0gKCR7aGVhbHRoUmVzcG9uc2Uuc3RhdHVzfTsgYXR0ZW1wdCAke2F0dGVtcHR9KWAsXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGVycm9yTWVzc2FnZSA9IChlIGFzIEVycm9yKT8ubWVzc2FnZTtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYFJlc3RhdGUgaGVhbHRoIGNoZWNrIGZhaWxlZDogXCIke2Vycm9yTWVzc2FnZX1cIiAoYXR0ZW1wdCAke2F0dGVtcHR9KWApO1xuICAgIH1cblxuICAgIGlmIChhdHRlbXB0ID4gTUFYX0hFQUxUSF9DSEVDS19BVFRFTVBUUykge1xuICAgICAgY29uc29sZS5lcnJvcihgTWV0YSBoZWFsdGggY2hlY2sgc3RpbGwgZmFpbGluZyBhZnRlciAke2F0dGVtcHR9IGF0dGVtcHRzLmApO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGVycm9yTWVzc2FnZSA/PyBgJHtoZWFsdGhSZXNwb25zZT8uc3RhdHVzVGV4dH0gKCR7aGVhbHRoUmVzcG9uc2U/LnN0YXR1c30pYCk7XG4gICAgfVxuICAgIGF0dGVtcHQgKz0gMTtcblxuICAgIGNvbnN0IHdhaXRUaW1lTWlsbGlzID0gMiAqKiBhdHRlbXB0ICogMV8wMDA7XG4gICAgY29uc29sZS5sb2coYFJldHJ5aW5nIGFmdGVyICR7d2FpdFRpbWVNaWxsaXN9IG1zLi4uYCk7XG4gICAgYXdhaXQgc2xlZXAod2FpdFRpbWVNaWxsaXMpO1xuICB9XG5cbiAgY29uc3QgZW5kcG9pbnRzVXJsID0gYCR7cHJvcHMubWV0YUVuZHBvaW50fS9lbmRwb2ludHNgO1xuICBjb25zdCByZWdpc3RyYXRpb25SZXF1ZXN0ID0gSlNPTi5zdHJpbmdpZnkoe1xuICAgIGFybjogcHJvcHMuc2VydmljZUxhbWJkYUFybixcbiAgICBhc3N1bWVfcm9sZV9hcm46IHByb3BzLmludm9rZVJvbGVBcm4sXG4gIH0pO1xuXG4gIGxldCBmYWlsdXJlUmVhc29uO1xuICBjb25zb2xlLmxvZyhgVHJpZ2dlcmluZyByZWdpc3RyYXRpb24gYXQgJHtlbmRwb2ludHNVcmx9OiAke3JlZ2lzdHJhdGlvblJlcXVlc3R9YCk7XG4gIGF0dGVtcHQgPSAxO1xuICB3aGlsZSAodHJ1ZSkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZWdpc3RlckNhbGxUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiBjb250cm9sbGVyLmFib3J0KFwidGltZW91dFwiKSwgMTBfMDAwKTtcbiAgICAgIGNvbnN0IGRpc2NvdmVyeVJlc3BvbnNlID0gYXdhaXQgZmV0Y2goZW5kcG9pbnRzVXJsLCB7XG4gICAgICAgIHNpZ25hbDogY29udHJvbGxlci5zaWduYWwsXG4gICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICAgIGJvZHk6IHJlZ2lzdHJhdGlvblJlcXVlc3QsXG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgICAgICAuLi5hdXRoSGVhZGVyLFxuICAgICAgICB9LFxuICAgICAgICBhZ2VudDogSU5TRUNVUkUgPyBuZXcgaHR0cHMuQWdlbnQoeyByZWplY3RVbmF1dGhvcml6ZWQ6IGZhbHNlIH0pIDogdW5kZWZpbmVkLFxuICAgICAgfSkuZmluYWxseSgoKSA9PiBjbGVhclRpbWVvdXQocmVnaXN0ZXJDYWxsVGltZW91dCkpO1xuXG4gICAgICBjb25zb2xlLmxvZyhgR290IHJlZ2lzdHJhdGlvbiByZXNwb25zZSBiYWNrOiAke2Rpc2NvdmVyeVJlc3BvbnNlLnN0YXR1c31gKTtcblxuICAgICAgaWYgKGRpc2NvdmVyeVJlc3BvbnNlLnN0YXR1cyA+PSAyMDAgJiYgZGlzY292ZXJ5UmVzcG9uc2Uuc3RhdHVzIDwgMzAwKSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gKGF3YWl0IGRpc2NvdmVyeVJlc3BvbnNlLmpzb24oKSkgYXMgRW5kcG9pbnRSZXNwb25zZTtcblxuICAgICAgICBpZiAocmVzcG9uc2U/LnNlcnZpY2VzPy5bMF0/Lm5hbWUgIT09IHByb3BzLnNlcnZpY2VQYXRoKSB7XG4gICAgICAgICAgZmFpbHVyZVJlYXNvbiA9XG4gICAgICAgICAgICBcIlJlc3RhdGUgc2VydmljZSByZWdpc3RyYXRpb24gZmFpbGVkOiBzZXJ2aWNlIG5hbWUgaW5kaWNhdGVkIGJ5IHNlcnZpY2UgcmVzcG9uc2VcIiArXG4gICAgICAgICAgICBgIChcIiR7cmVzcG9uc2U/LnNlcnZpY2VzPy5bMF0/Lm5hbWV9KSkgZG9lcyBub3QgbWF0Y2ggdGhlIGV4cGVjdGVkIHZhbHVlIChcIiR7cHJvcHMuc2VydmljZVBhdGh9XCIpIWA7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihmYWlsdXJlUmVhc29uKTtcbiAgICAgICAgICBicmVhazsgLy8gZG9uJ3QgdGhyb3cgaW1tZWRpYXRlbHkgLSBsZXQgcmV0cnkgbG9vcCBkZWNpZGUgd2hldGhlciB0byBhYm9ydFxuICAgICAgICB9XG5cbiAgICAgICAgY29uc29sZS5sb2coXCJTdWNjZXNzIVwiKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYFNlcnZpY2UgcmVnaXN0cmF0aW9uIGNhbGwgZmFpbGVkOiAkeyhlIGFzIEVycm9yKT8ubWVzc2FnZX0gKGF0dGVtcHQgJHthdHRlbXB0fSlgKTtcbiAgICB9XG5cbiAgICBpZiAoYXR0ZW1wdCA+IE1BWF9SRUdJU1RSQVRJT05fQVRURU1QVFMpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYFNlcnZpY2UgcmVnaXN0cmF0aW9uIGZhaWxlZCBhZnRlciAke2F0dGVtcHR9IGF0dGVtcHRzLmApO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGF0dGVtcHQgKz0gMTtcbiAgICBjb25zdCB3YWl0VGltZU1pbGxpcyA9IDJfMDAwICsgMiAqKiBhdHRlbXB0ICogMV8wMDA7IC8vIDNzIC0+IDZzIC0+IDEwc1xuICAgIGNvbnNvbGUubG9nKGBSZXRyeWluZyByZWdpc3RyYXRpb24gYWZ0ZXIgJHt3YWl0VGltZU1pbGxpc30gbXMuLi5gKTtcbiAgICBhd2FpdCBzbGVlcCh3YWl0VGltZU1pbGxpcyk7XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoZmFpbHVyZVJlYXNvbiA/PyBcIlJlc3RhdGUgc2VydmljZSByZWdpc3RyYXRpb24gZmFpbGVkLiBQbGVhc2Ugc2VlIGxvZ3MgZm9yIGRldGFpbHMuXCIpO1xufTtcblxuYXN5bmMgZnVuY3Rpb24gY3JlYXRlQXV0aEhlYWRlcihwcm9wczogUmVnaXN0cmF0aW9uUHJvcGVydGllcyk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4ge1xuICBpZiAoIXByb3BzLmF1dGhUb2tlblNlY3JldEFybikge1xuICAgIHJldHVybiB7fTtcbiAgfVxuXG4gIGNvbnNvbGUubG9nKGBVc2luZyBiZWFyZXIgYXV0aGVudGljYXRpb24gdG9rZW4gZnJvbSBzZWNyZXQgJHtwcm9wcy5hdXRoVG9rZW5TZWNyZXRBcm59YCk7XG4gIGNvbnN0IHNzbSA9IG5ldyBTZWNyZXRzTWFuYWdlckNsaWVudCgpO1xuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHNzbS5zZW5kKFxuICAgIG5ldyBHZXRTZWNyZXRWYWx1ZUNvbW1hbmQoe1xuICAgICAgU2VjcmV0SWQ6IHByb3BzLmF1dGhUb2tlblNlY3JldEFybixcbiAgICB9KSxcbiAgKTtcblxuICBjb25zb2xlLmxvZyhgU3VjY2Vzc2Z1bGx5IHJldHJpZXZlZCBzZWNyZXQgXCIke3Jlc3BvbnNlLk5hbWV9XCIgdmVyc2lvbiAke3Jlc3BvbnNlLlZlcnNpb25JZH1gKTtcbiAgcmV0dXJuIHtcbiAgICBBdXRob3JpemF0aW9uOiBgQmVhcmVyICR7cmVzcG9uc2UuU2VjcmV0U3RyaW5nfWAsXG4gIH07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNsZWVwKG1pbGxpczogbnVtYmVyKSB7XG4gIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIG1pbGxpcykpO1xufVxuIl19
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { Construct } from "constructs";
|
|
2
|
+
import * as ssm from "aws-cdk-lib/aws-secretsmanager";
|
|
3
|
+
import * as cdk from "aws-cdk-lib";
|
|
4
|
+
import * as ec2 from "aws-cdk-lib/aws-ec2";
|
|
5
|
+
export declare class RegistrationProvider extends Construct {
|
|
6
|
+
readonly serviceToken: string;
|
|
7
|
+
constructor(scope: Construct, id: string, props: {
|
|
8
|
+
authToken?: ssm.ISecret;
|
|
9
|
+
timeout?: cdk.Duration;
|
|
10
|
+
vpc?: ec2.Vpc;
|
|
11
|
+
});
|
|
12
|
+
}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/*
|
|
3
|
+
* Copyright (c) 2023 - Restate Software, Inc., Restate GmbH
|
|
4
|
+
*
|
|
5
|
+
* This file is part of the Restate SDK for Node.js/TypeScript,
|
|
6
|
+
* which is released under the MIT license.
|
|
7
|
+
*
|
|
8
|
+
* You can find a copy of the license in file LICENSE in the root
|
|
9
|
+
* directory of this repository or package, or at
|
|
10
|
+
* https://github.com/restatedev/sdk-typescript/blob/main/LICENSE
|
|
11
|
+
*/
|
|
12
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
13
|
+
if (k2 === undefined) k2 = k;
|
|
14
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
15
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
16
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
17
|
+
}
|
|
18
|
+
Object.defineProperty(o, k2, desc);
|
|
19
|
+
}) : (function(o, m, k, k2) {
|
|
20
|
+
if (k2 === undefined) k2 = k;
|
|
21
|
+
o[k2] = m[k];
|
|
22
|
+
}));
|
|
23
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
24
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
25
|
+
}) : function(o, v) {
|
|
26
|
+
o["default"] = v;
|
|
27
|
+
});
|
|
28
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
29
|
+
if (mod && mod.__esModule) return mod;
|
|
30
|
+
var result = {};
|
|
31
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
32
|
+
__setModuleDefault(result, mod);
|
|
33
|
+
return result;
|
|
34
|
+
};
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.RegistrationProvider = void 0;
|
|
40
|
+
const constructs_1 = require("constructs");
|
|
41
|
+
const lambda_node = __importStar(require("aws-cdk-lib/aws-lambda-nodejs"));
|
|
42
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
43
|
+
const lambda = __importStar(require("aws-cdk-lib/aws-lambda"));
|
|
44
|
+
const cdk = __importStar(require("aws-cdk-lib"));
|
|
45
|
+
const cr = __importStar(require("aws-cdk-lib/custom-resources"));
|
|
46
|
+
const DEFAULT_TIMEOUT = cdk.Duration.seconds(120);
|
|
47
|
+
class RegistrationProvider extends constructs_1.Construct {
|
|
48
|
+
constructor(scope, id, props) {
|
|
49
|
+
super(scope, id);
|
|
50
|
+
if (props.vpc) {
|
|
51
|
+
console.log("Using VPC!");
|
|
52
|
+
}
|
|
53
|
+
const registrationHandler = new lambda_node.NodejsFunction(this, "RegistrationHandler", {
|
|
54
|
+
description: "Restate custom registration handler",
|
|
55
|
+
entry: node_path_1.default.join(__dirname, "register-service-handler/index.js"),
|
|
56
|
+
architecture: lambda.Architecture.ARM_64,
|
|
57
|
+
runtime: lambda.Runtime.NODEJS_LATEST,
|
|
58
|
+
memorySize: 128,
|
|
59
|
+
timeout: props.timeout ?? DEFAULT_TIMEOUT,
|
|
60
|
+
environment: {
|
|
61
|
+
NODE_OPTIONS: "--enable-source-maps",
|
|
62
|
+
},
|
|
63
|
+
bundling: {
|
|
64
|
+
minify: false,
|
|
65
|
+
sourceMap: true,
|
|
66
|
+
},
|
|
67
|
+
...(props.vpc ? { vpc: props.vpc, subnets: props.vpc.privateSubnets } : {}),
|
|
68
|
+
});
|
|
69
|
+
props.authToken?.grantRead(registrationHandler);
|
|
70
|
+
const registrationProvider = new cr.Provider(this, "RegistrationProvider", {
|
|
71
|
+
onEventHandler: registrationHandler,
|
|
72
|
+
});
|
|
73
|
+
this.serviceToken = registrationProvider.serviceToken;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
exports.RegistrationProvider = RegistrationProvider;
|
|
77
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVnaXN0cmF0aW9uLXByb3ZpZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vbGliL3Jlc3RhdGUtY29uc3RydWN0cy9yZWdpc3RyYXRpb24tcHJvdmlkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7R0FTRzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFSCwyQ0FBdUM7QUFFdkMsMkVBQTZEO0FBQzdELDBEQUE2QjtBQUM3QiwrREFBaUQ7QUFDakQsaURBQW1DO0FBQ25DLGlFQUFtRDtBQUduRCxNQUFNLGVBQWUsR0FBRyxHQUFHLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUVsRCxNQUFhLG9CQUFxQixTQUFRLHNCQUFTO0lBR2pELFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBeUU7UUFDakgsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQixJQUFJLEtBQUssQ0FBQyxHQUFHLEVBQUU7WUFDYixPQUFPLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDO1NBQzNCO1FBRUQsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLFdBQVcsQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLHFCQUFxQixFQUFFO1lBQ3RGLFdBQVcsRUFBRSxxQ0FBcUM7WUFDbEQsS0FBSyxFQUFFLG1CQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxtQ0FBbUMsQ0FBQztZQUNoRSxZQUFZLEVBQUUsTUFBTSxDQUFDLFlBQVksQ0FBQyxNQUFNO1lBQ3hDLE9BQU8sRUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDLGFBQWE7WUFDckMsVUFBVSxFQUFFLEdBQUc7WUFDZixPQUFPLEVBQUUsS0FBSyxDQUFDLE9BQU8sSUFBSSxlQUFlO1lBQ3pDLFdBQVcsRUFBRTtnQkFDWCxZQUFZLEVBQUUsc0JBQXNCO2FBQ3JDO1lBQ0QsUUFBUSxFQUFFO2dCQUNSLE1BQU0sRUFBRSxLQUFLO2dCQUNiLFNBQVMsRUFBRSxJQUFJO2FBQ2hCO1lBQ0QsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLEtBQUssQ0FBQyxHQUFHLEVBQUUsT0FBTyxFQUFFLEtBQUssQ0FBQyxHQUFHLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztTQUM1RSxDQUFDLENBQUM7UUFDSCxLQUFLLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1FBRWhELE1BQU0sb0JBQW9CLEdBQUcsSUFBSSxFQUFFLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxzQkFBc0IsRUFBRTtZQUN6RSxjQUFjLEVBQUUsbUJBQW1CO1NBQ3BDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxZQUFZLEdBQUcsb0JBQW9CLENBQUMsWUFBWSxDQUFDO0lBQ3hELENBQUM7Q0FDRjtBQWpDRCxvREFpQ0MiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IChjKSAyMDIzIC0gUmVzdGF0ZSBTb2Z0d2FyZSwgSW5jLiwgUmVzdGF0ZSBHbWJIXG4gKlxuICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIFJlc3RhdGUgU0RLIGZvciBOb2RlLmpzL1R5cGVTY3JpcHQsXG4gKiB3aGljaCBpcyByZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG4gKlxuICogWW91IGNhbiBmaW5kIGEgY29weSBvZiB0aGUgbGljZW5zZSBpbiBmaWxlIExJQ0VOU0UgaW4gdGhlIHJvb3RcbiAqIGRpcmVjdG9yeSBvZiB0aGlzIHJlcG9zaXRvcnkgb3IgcGFja2FnZSwgb3IgYXRcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9yZXN0YXRlZGV2L3Nkay10eXBlc2NyaXB0L2Jsb2IvbWFpbi9MSUNFTlNFXG4gKi9cblxuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCAqIGFzIHNzbSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXNlY3JldHNtYW5hZ2VyXCI7XG5pbXBvcnQgKiBhcyBsYW1iZGFfbm9kZSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWxhbWJkYS1ub2RlanNcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCAqIGFzIGxhbWJkYSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWxhbWJkYVwiO1xuaW1wb3J0ICogYXMgY2RrIGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuaW1wb3J0ICogYXMgY3IgZnJvbSBcImF3cy1jZGstbGliL2N1c3RvbS1yZXNvdXJjZXNcIjtcbmltcG9ydCAqIGFzIGVjMiBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWVjMlwiO1xuXG5jb25zdCBERUZBVUxUX1RJTUVPVVQgPSBjZGsuRHVyYXRpb24uc2Vjb25kcygxMjApO1xuXG5leHBvcnQgY2xhc3MgUmVnaXN0cmF0aW9uUHJvdmlkZXIgZXh0ZW5kcyBDb25zdHJ1Y3Qge1xuICByZWFkb25seSBzZXJ2aWNlVG9rZW46IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogeyBhdXRoVG9rZW4/OiBzc20uSVNlY3JldDsgdGltZW91dD86IGNkay5EdXJhdGlvbjsgdnBjPzogZWMyLlZwYyB9KSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIGlmIChwcm9wcy52cGMpIHtcbiAgICAgIGNvbnNvbGUubG9nKFwiVXNpbmcgVlBDIVwiKTtcbiAgICB9XG5cbiAgICBjb25zdCByZWdpc3RyYXRpb25IYW5kbGVyID0gbmV3IGxhbWJkYV9ub2RlLk5vZGVqc0Z1bmN0aW9uKHRoaXMsIFwiUmVnaXN0cmF0aW9uSGFuZGxlclwiLCB7XG4gICAgICBkZXNjcmlwdGlvbjogXCJSZXN0YXRlIGN1c3RvbSByZWdpc3RyYXRpb24gaGFuZGxlclwiLFxuICAgICAgZW50cnk6IHBhdGguam9pbihfX2Rpcm5hbWUsIFwicmVnaXN0ZXItc2VydmljZS1oYW5kbGVyL2luZGV4LmpzXCIpLFxuICAgICAgYXJjaGl0ZWN0dXJlOiBsYW1iZGEuQXJjaGl0ZWN0dXJlLkFSTV82NCxcbiAgICAgIHJ1bnRpbWU6IGxhbWJkYS5SdW50aW1lLk5PREVKU19MQVRFU1QsXG4gICAgICBtZW1vcnlTaXplOiAxMjgsXG4gICAgICB0aW1lb3V0OiBwcm9wcy50aW1lb3V0ID8/IERFRkFVTFRfVElNRU9VVCxcbiAgICAgIGVudmlyb25tZW50OiB7XG4gICAgICAgIE5PREVfT1BUSU9OUzogXCItLWVuYWJsZS1zb3VyY2UtbWFwc1wiLFxuICAgICAgfSxcbiAgICAgIGJ1bmRsaW5nOiB7XG4gICAgICAgIG1pbmlmeTogZmFsc2UsXG4gICAgICAgIHNvdXJjZU1hcDogdHJ1ZSxcbiAgICAgIH0sXG4gICAgICAuLi4ocHJvcHMudnBjID8geyB2cGM6IHByb3BzLnZwYywgc3VibmV0czogcHJvcHMudnBjLnByaXZhdGVTdWJuZXRzIH0gOiB7fSksXG4gICAgfSk7XG4gICAgcHJvcHMuYXV0aFRva2VuPy5ncmFudFJlYWQocmVnaXN0cmF0aW9uSGFuZGxlcik7XG5cbiAgICBjb25zdCByZWdpc3RyYXRpb25Qcm92aWRlciA9IG5ldyBjci5Qcm92aWRlcih0aGlzLCBcIlJlZ2lzdHJhdGlvblByb3ZpZGVyXCIsIHtcbiAgICAgIG9uRXZlbnRIYW5kbGVyOiByZWdpc3RyYXRpb25IYW5kbGVyLFxuICAgIH0pO1xuICAgIHRoaXMuc2VydmljZVRva2VuID0gcmVnaXN0cmF0aW9uUHJvdmlkZXIuc2VydmljZVRva2VuO1xuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { Construct } from "constructs";
|
|
2
|
+
import * as cdk from "aws-cdk-lib";
|
|
3
|
+
import * as iam from "aws-cdk-lib/aws-iam";
|
|
4
|
+
import * as ssm from "aws-cdk-lib/aws-secretsmanager";
|
|
5
|
+
import { RestateInstance } from "./restate-instance";
|
|
6
|
+
export interface ManagedRestateProps {
|
|
7
|
+
/** Prefix for resources created by this construct that require unique names. */
|
|
8
|
+
prefix?: string;
|
|
9
|
+
/** ID of the Restate service cluster to which this service will be registered. */
|
|
10
|
+
clusterId: string;
|
|
11
|
+
/** Auth token to use with Restate cluster. Used to authenticate access to the meta endpoint for registration. */
|
|
12
|
+
authTokenSecretArn: string;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Models a Restate managed service cluster provided to the application. In the case of a managed service, this
|
|
16
|
+
* construct only creates an appropriately configured registration provider custom component for use by the service
|
|
17
|
+
* registry elsewhere, and creates the role assumed by the cluster. An appropriate trust policy will be added to this
|
|
18
|
+
* role that allows Restate to assume it from outside the deployment AWS account.
|
|
19
|
+
*/
|
|
20
|
+
export declare class RestateCloudEndpoint extends Construct implements RestateInstance {
|
|
21
|
+
readonly invokerRole: iam.Role;
|
|
22
|
+
readonly ingressEndpoint: string;
|
|
23
|
+
readonly metaEndpoint: string;
|
|
24
|
+
readonly authToken: ssm.ISecret;
|
|
25
|
+
readonly registrationProviderToken: cdk.CfnOutput;
|
|
26
|
+
constructor(scope: Construct, id: string, props: ManagedRestateProps);
|
|
27
|
+
}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/*
|
|
3
|
+
* Copyright (c) 2023 - Restate Software, Inc., Restate GmbH
|
|
4
|
+
*
|
|
5
|
+
* This file is part of the Restate SDK for Node.js/TypeScript,
|
|
6
|
+
* which is released under the MIT license.
|
|
7
|
+
*
|
|
8
|
+
* You can find a copy of the license in file LICENSE in the root
|
|
9
|
+
* directory of this repository or package, or at
|
|
10
|
+
* https://github.com/restatedev/sdk-typescript/blob/main/LICENSE
|
|
11
|
+
*/
|
|
12
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
13
|
+
if (k2 === undefined) k2 = k;
|
|
14
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
15
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
16
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
17
|
+
}
|
|
18
|
+
Object.defineProperty(o, k2, desc);
|
|
19
|
+
}) : (function(o, m, k, k2) {
|
|
20
|
+
if (k2 === undefined) k2 = k;
|
|
21
|
+
o[k2] = m[k];
|
|
22
|
+
}));
|
|
23
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
24
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
25
|
+
}) : function(o, v) {
|
|
26
|
+
o["default"] = v;
|
|
27
|
+
});
|
|
28
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
29
|
+
if (mod && mod.__esModule) return mod;
|
|
30
|
+
var result = {};
|
|
31
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
32
|
+
__setModuleDefault(result, mod);
|
|
33
|
+
return result;
|
|
34
|
+
};
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.RestateCloudEndpoint = void 0;
|
|
37
|
+
const constructs_1 = require("constructs");
|
|
38
|
+
const cdk = __importStar(require("aws-cdk-lib"));
|
|
39
|
+
const iam = __importStar(require("aws-cdk-lib/aws-iam"));
|
|
40
|
+
const ssm = __importStar(require("aws-cdk-lib/aws-secretsmanager"));
|
|
41
|
+
const registration_provider_1 = require("./registration-provider");
|
|
42
|
+
const RESTATE_INGRESS_PORT = 8080;
|
|
43
|
+
const RESTATE_META_PORT = 9070;
|
|
44
|
+
/**
|
|
45
|
+
* Models a Restate managed service cluster provided to the application. In the case of a managed service, this
|
|
46
|
+
* construct only creates an appropriately configured registration provider custom component for use by the service
|
|
47
|
+
* registry elsewhere, and creates the role assumed by the cluster. An appropriate trust policy will be added to this
|
|
48
|
+
* role that allows Restate to assume it from outside the deployment AWS account.
|
|
49
|
+
*/
|
|
50
|
+
class RestateCloudEndpoint extends constructs_1.Construct {
|
|
51
|
+
constructor(scope, id, props) {
|
|
52
|
+
super(scope, id);
|
|
53
|
+
this.invokerRole = new iam.Role(this, "ManagedServiceRole", {
|
|
54
|
+
description: "Role assumed by the Restate managed service to invoke our services",
|
|
55
|
+
assumedBy: new iam.ArnPrincipal("arn:aws:iam::663487780041:role/restate-dev"),
|
|
56
|
+
externalIds: [props.clusterId],
|
|
57
|
+
});
|
|
58
|
+
this.ingressEndpoint = `https://${props.clusterId}.dev.restate.cloud:${RESTATE_INGRESS_PORT}`;
|
|
59
|
+
this.metaEndpoint = `https://${props.clusterId}.dev.restate.cloud:${RESTATE_META_PORT}`;
|
|
60
|
+
this.authToken = ssm.Secret.fromSecretCompleteArn(this, "ClusterAuthToken", props.authTokenSecretArn);
|
|
61
|
+
const registrationProvider = new registration_provider_1.RegistrationProvider(this, "RegistrationProvider", { authToken: this.authToken });
|
|
62
|
+
this.registrationProviderToken = new cdk.CfnOutput(this, "RegistrationProviderToken", {
|
|
63
|
+
description: "Restate service registration provider custom component token used by registry to perform discovery",
|
|
64
|
+
exportName: [props.prefix, "RegistrationProviderToken"].filter(Boolean).join("-"),
|
|
65
|
+
value: registrationProvider.serviceToken,
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
exports.RestateCloudEndpoint = RestateCloudEndpoint;
|
|
70
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzdGF0ZS1jbG91ZC1lbmRwb2ludC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL2xpYi9yZXN0YXRlLWNvbnN0cnVjdHMvcmVzdGF0ZS1jbG91ZC1lbmRwb2ludC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7OztHQVNHOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUVILDJDQUF1QztBQUN2QyxpREFBbUM7QUFDbkMseURBQTJDO0FBQzNDLG9FQUFzRDtBQUV0RCxtRUFBK0Q7QUFFL0QsTUFBTSxvQkFBb0IsR0FBRyxJQUFJLENBQUM7QUFDbEMsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLENBQUM7QUFhL0I7Ozs7O0dBS0c7QUFDSCxNQUFhLG9CQUFxQixTQUFRLHNCQUFTO0lBT2pELFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBMEI7UUFDbEUsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsb0JBQW9CLEVBQUU7WUFDMUQsV0FBVyxFQUFFLG9FQUFvRTtZQUNqRixTQUFTLEVBQUUsSUFBSSxHQUFHLENBQUMsWUFBWSxDQUFDLDRDQUE0QyxDQUFDO1lBQzdFLFdBQVcsRUFBRSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUM7U0FDL0IsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLGVBQWUsR0FBRyxXQUFXLEtBQUssQ0FBQyxTQUFTLHNCQUFzQixvQkFBb0IsRUFBRSxDQUFDO1FBQzlGLElBQUksQ0FBQyxZQUFZLEdBQUcsV0FBVyxLQUFLLENBQUMsU0FBUyxzQkFBc0IsaUJBQWlCLEVBQUUsQ0FBQztRQUN4RixJQUFJLENBQUMsU0FBUyxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMscUJBQXFCLENBQUMsSUFBSSxFQUFFLGtCQUFrQixFQUFFLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBRXRHLE1BQU0sb0JBQW9CLEdBQUcsSUFBSSw0Q0FBb0IsQ0FBQyxJQUFJLEVBQUUsc0JBQXNCLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUM7UUFDbkgsSUFBSSxDQUFDLHlCQUF5QixHQUFHLElBQUksR0FBRyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsMkJBQTJCLEVBQUU7WUFDcEYsV0FBVyxFQUFFLG9HQUFvRztZQUNqSCxVQUFVLEVBQUUsQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLDJCQUEyQixDQUFDLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUM7WUFDakYsS0FBSyxFQUFFLG9CQUFvQixDQUFDLFlBQVk7U0FDekMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUNGO0FBM0JELG9EQTJCQyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjMgLSBSZXN0YXRlIFNvZnR3YXJlLCBJbmMuLCBSZXN0YXRlIEdtYkhcbiAqXG4gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgUmVzdGF0ZSBTREsgZm9yIE5vZGUuanMvVHlwZVNjcmlwdCxcbiAqIHdoaWNoIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbiAqXG4gKiBZb3UgY2FuIGZpbmQgYSBjb3B5IG9mIHRoZSBsaWNlbnNlIGluIGZpbGUgTElDRU5TRSBpbiB0aGUgcm9vdFxuICogZGlyZWN0b3J5IG9mIHRoaXMgcmVwb3NpdG9yeSBvciBwYWNrYWdlLCBvciBhdFxuICogaHR0cHM6Ly9naXRodWIuY29tL3Jlc3RhdGVkZXYvc2RrLXR5cGVzY3JpcHQvYmxvYi9tYWluL0xJQ0VOU0VcbiAqL1xuXG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuaW1wb3J0ICogYXMgY2RrIGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuaW1wb3J0ICogYXMgaWFtIGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtaWFtXCI7XG5pbXBvcnQgKiBhcyBzc20gZnJvbSBcImF3cy1jZGstbGliL2F3cy1zZWNyZXRzbWFuYWdlclwiO1xuaW1wb3J0IHsgUmVzdGF0ZUluc3RhbmNlIH0gZnJvbSBcIi4vcmVzdGF0ZS1pbnN0YW5jZVwiO1xuaW1wb3J0IHsgUmVnaXN0cmF0aW9uUHJvdmlkZXIgfSBmcm9tIFwiLi9yZWdpc3RyYXRpb24tcHJvdmlkZXJcIjtcblxuY29uc3QgUkVTVEFURV9JTkdSRVNTX1BPUlQgPSA4MDgwO1xuY29uc3QgUkVTVEFURV9NRVRBX1BPUlQgPSA5MDcwO1xuXG5leHBvcnQgaW50ZXJmYWNlIE1hbmFnZWRSZXN0YXRlUHJvcHMge1xuICAvKiogUHJlZml4IGZvciByZXNvdXJjZXMgY3JlYXRlZCBieSB0aGlzIGNvbnN0cnVjdCB0aGF0IHJlcXVpcmUgdW5pcXVlIG5hbWVzLiAqL1xuICBwcmVmaXg/OiBzdHJpbmc7XG5cbiAgLyoqIElEIG9mIHRoZSBSZXN0YXRlIHNlcnZpY2UgY2x1c3RlciB0byB3aGljaCB0aGlzIHNlcnZpY2Ugd2lsbCBiZSByZWdpc3RlcmVkLiAqL1xuICBjbHVzdGVySWQ6IHN0cmluZztcblxuICAvKiogQXV0aCB0b2tlbiB0byB1c2Ugd2l0aCBSZXN0YXRlIGNsdXN0ZXIuIFVzZWQgdG8gYXV0aGVudGljYXRlIGFjY2VzcyB0byB0aGUgbWV0YSBlbmRwb2ludCBmb3IgcmVnaXN0cmF0aW9uLiAqL1xuICBhdXRoVG9rZW5TZWNyZXRBcm46IHN0cmluZztcbn1cblxuLyoqXG4gKiBNb2RlbHMgYSBSZXN0YXRlIG1hbmFnZWQgc2VydmljZSBjbHVzdGVyIHByb3ZpZGVkIHRvIHRoZSBhcHBsaWNhdGlvbi4gSW4gdGhlIGNhc2Ugb2YgYSBtYW5hZ2VkIHNlcnZpY2UsIHRoaXNcbiAqIGNvbnN0cnVjdCBvbmx5IGNyZWF0ZXMgYW4gYXBwcm9wcmlhdGVseSBjb25maWd1cmVkIHJlZ2lzdHJhdGlvbiBwcm92aWRlciBjdXN0b20gY29tcG9uZW50IGZvciB1c2UgYnkgdGhlIHNlcnZpY2VcbiAqIHJlZ2lzdHJ5IGVsc2V3aGVyZSwgYW5kIGNyZWF0ZXMgdGhlIHJvbGUgYXNzdW1lZCBieSB0aGUgY2x1c3Rlci4gQW4gYXBwcm9wcmlhdGUgdHJ1c3QgcG9saWN5IHdpbGwgYmUgYWRkZWQgdG8gdGhpc1xuICogcm9sZSB0aGF0IGFsbG93cyBSZXN0YXRlIHRvIGFzc3VtZSBpdCBmcm9tIG91dHNpZGUgdGhlIGRlcGxveW1lbnQgQVdTIGFjY291bnQuXG4gKi9cbmV4cG9ydCBjbGFzcyBSZXN0YXRlQ2xvdWRFbmRwb2ludCBleHRlbmRzIENvbnN0cnVjdCBpbXBsZW1lbnRzIFJlc3RhdGVJbnN0YW5jZSB7XG4gIHJlYWRvbmx5IGludm9rZXJSb2xlOiBpYW0uUm9sZTtcbiAgcmVhZG9ubHkgaW5ncmVzc0VuZHBvaW50OiBzdHJpbmc7XG4gIHJlYWRvbmx5IG1ldGFFbmRwb2ludDogc3RyaW5nO1xuICByZWFkb25seSBhdXRoVG9rZW46IHNzbS5JU2VjcmV0O1xuICByZWFkb25seSByZWdpc3RyYXRpb25Qcm92aWRlclRva2VuOiBjZGsuQ2ZuT3V0cHV0O1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBNYW5hZ2VkUmVzdGF0ZVByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIHRoaXMuaW52b2tlclJvbGUgPSBuZXcgaWFtLlJvbGUodGhpcywgXCJNYW5hZ2VkU2VydmljZVJvbGVcIiwge1xuICAgICAgZGVzY3JpcHRpb246IFwiUm9sZSBhc3N1bWVkIGJ5IHRoZSBSZXN0YXRlIG1hbmFnZWQgc2VydmljZSB0byBpbnZva2Ugb3VyIHNlcnZpY2VzXCIsXG4gICAgICBhc3N1bWVkQnk6IG5ldyBpYW0uQXJuUHJpbmNpcGFsKFwiYXJuOmF3czppYW06OjY2MzQ4Nzc4MDA0MTpyb2xlL3Jlc3RhdGUtZGV2XCIpLFxuICAgICAgZXh0ZXJuYWxJZHM6IFtwcm9wcy5jbHVzdGVySWRdLFxuICAgIH0pO1xuXG4gICAgdGhpcy5pbmdyZXNzRW5kcG9pbnQgPSBgaHR0cHM6Ly8ke3Byb3BzLmNsdXN0ZXJJZH0uZGV2LnJlc3RhdGUuY2xvdWQ6JHtSRVNUQVRFX0lOR1JFU1NfUE9SVH1gO1xuICAgIHRoaXMubWV0YUVuZHBvaW50ID0gYGh0dHBzOi8vJHtwcm9wcy5jbHVzdGVySWR9LmRldi5yZXN0YXRlLmNsb3VkOiR7UkVTVEFURV9NRVRBX1BPUlR9YDtcbiAgICB0aGlzLmF1dGhUb2tlbiA9IHNzbS5TZWNyZXQuZnJvbVNlY3JldENvbXBsZXRlQXJuKHRoaXMsIFwiQ2x1c3RlckF1dGhUb2tlblwiLCBwcm9wcy5hdXRoVG9rZW5TZWNyZXRBcm4pO1xuXG4gICAgY29uc3QgcmVnaXN0cmF0aW9uUHJvdmlkZXIgPSBuZXcgUmVnaXN0cmF0aW9uUHJvdmlkZXIodGhpcywgXCJSZWdpc3RyYXRpb25Qcm92aWRlclwiLCB7IGF1dGhUb2tlbjogdGhpcy5hdXRoVG9rZW4gfSk7XG4gICAgdGhpcy5yZWdpc3RyYXRpb25Qcm92aWRlclRva2VuID0gbmV3IGNkay5DZm5PdXRwdXQodGhpcywgXCJSZWdpc3RyYXRpb25Qcm92aWRlclRva2VuXCIsIHtcbiAgICAgIGRlc2NyaXB0aW9uOiBcIlJlc3RhdGUgc2VydmljZSByZWdpc3RyYXRpb24gcHJvdmlkZXIgY3VzdG9tIGNvbXBvbmVudCB0b2tlbiB1c2VkIGJ5IHJlZ2lzdHJ5IHRvIHBlcmZvcm0gZGlzY292ZXJ5XCIsXG4gICAgICBleHBvcnROYW1lOiBbcHJvcHMucHJlZml4LCBcIlJlZ2lzdHJhdGlvblByb3ZpZGVyVG9rZW5cIl0uZmlsdGVyKEJvb2xlYW4pLmpvaW4oXCItXCIpLFxuICAgICAgdmFsdWU6IHJlZ2lzdHJhdGlvblByb3ZpZGVyLnNlcnZpY2VUb2tlbixcbiAgICB9KTtcbiAgfVxufSJdfQ==
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import * as iam from "aws-cdk-lib/aws-iam";
|
|
2
|
+
import * as cdk from "aws-cdk-lib";
|
|
3
|
+
import * as ssm from "aws-cdk-lib/aws-secretsmanager";
|
|
4
|
+
/**
|
|
5
|
+
* Represents an instance of the Restate service. This could represent a self-hosted broker, or Restate's managed
|
|
6
|
+
* service.
|
|
7
|
+
*/
|
|
8
|
+
export interface RestateInstance {
|
|
9
|
+
readonly invokerRole: iam.IRole;
|
|
10
|
+
readonly metaEndpoint: string;
|
|
11
|
+
readonly authToken?: ssm.ISecret;
|
|
12
|
+
readonly registrationProviderToken: cdk.CfnOutput;
|
|
13
|
+
}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzdGF0ZS1pbnN0YW5jZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL2xpYi9yZXN0YXRlLWNvbnN0cnVjdHMvcmVzdGF0ZS1pbnN0YW5jZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgaWFtIGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtaWFtXCI7XG5pbXBvcnQgKiBhcyBjZGsgZnJvbSBcImF3cy1jZGstbGliXCI7XG5pbXBvcnQgKiBhcyBzc20gZnJvbSBcImF3cy1jZGstbGliL2F3cy1zZWNyZXRzbWFuYWdlclwiO1xuXG4vKipcbiAqIFJlcHJlc2VudHMgYW4gaW5zdGFuY2Ugb2YgdGhlIFJlc3RhdGUgc2VydmljZS4gVGhpcyBjb3VsZCByZXByZXNlbnQgYSBzZWxmLWhvc3RlZCBicm9rZXIsIG9yIFJlc3RhdGUncyBtYW5hZ2VkXG4gKiBzZXJ2aWNlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlc3RhdGVJbnN0YW5jZSB7XG4gIHJlYWRvbmx5IGludm9rZXJSb2xlOiBpYW0uSVJvbGU7XG4gIHJlYWRvbmx5IG1ldGFFbmRwb2ludDogc3RyaW5nO1xuICByZWFkb25seSBhdXRoVG9rZW4/OiBzc20uSVNlY3JldDtcbiAgcmVhZG9ubHkgcmVnaXN0cmF0aW9uUHJvdmlkZXJUb2tlbjogY2RrLkNmbk91dHB1dDtcbn0iXX0=
|
|
@@ -3,17 +3,7 @@ import * as logs from "aws-cdk-lib/aws-logs";
|
|
|
3
3
|
import * as ec2 from "aws-cdk-lib/aws-ec2";
|
|
4
4
|
import * as iam from "aws-cdk-lib/aws-iam";
|
|
5
5
|
import * as cdk from "aws-cdk-lib";
|
|
6
|
-
import
|
|
7
|
-
import * as acm from "aws-cdk-lib/aws-certificatemanager";
|
|
8
|
-
/**
|
|
9
|
-
* Represents an instance of the Restate service. This could represent a self-hosted broker, or Restate's managed
|
|
10
|
-
* service.
|
|
11
|
-
*/
|
|
12
|
-
export interface RestateInstance {
|
|
13
|
-
readonly invokerRole: iam.Role;
|
|
14
|
-
readonly metaEndpoint: string;
|
|
15
|
-
readonly registrationProviderToken: cdk.CfnOutput;
|
|
16
|
-
}
|
|
6
|
+
import { RestateInstance } from "./restate-instance";
|
|
17
7
|
export declare enum TracingMode {
|
|
18
8
|
DISABLED = "DISABLED",
|
|
19
9
|
AWS_XRAY = "AWS_XRAY"
|
|
@@ -21,7 +11,7 @@ export declare enum TracingMode {
|
|
|
21
11
|
export interface RestateInstanceProps {
|
|
22
12
|
/** Log group for Restate service logs. */
|
|
23
13
|
logGroup: logs.LogGroup;
|
|
24
|
-
/** Tracing mode for Restate services.
|
|
14
|
+
/** Tracing mode for Restate services. Defaults to {@link TracingMode.DISABLED}. */
|
|
25
15
|
tracing?: TracingMode;
|
|
26
16
|
/** Prefix for resources created by this construct that require unique names. */
|
|
27
17
|
prefix?: string;
|
|
@@ -29,26 +19,19 @@ export interface RestateInstanceProps {
|
|
|
29
19
|
restateTag?: string;
|
|
30
20
|
/** Amazon Distro for Open Telemetry Docker image tag. Defaults to `latest`. */
|
|
31
21
|
adotTag?: string;
|
|
32
|
-
/** Optional certificate for ingress endpoint. If unspecified, a plain HTTP listener will be created. */
|
|
33
|
-
certificate?: acm.ICertificate;
|
|
34
22
|
}
|
|
35
23
|
/**
|
|
36
24
|
* Creates a Restate service deployment backed by a single EC2 instance,
|
|
37
|
-
* suitable for development and testing purposes.
|
|
25
|
+
* suitable for development and testing purposes. The instance will be created
|
|
26
|
+
* in a dedicated VPC (unless one is provided). EC2 instance will be allocated
|
|
27
|
+
* a public IP address.
|
|
38
28
|
*/
|
|
39
29
|
export declare class SingleNodeRestateInstance extends Construct implements RestateInstance {
|
|
40
30
|
readonly instance: ec2.Instance;
|
|
41
|
-
readonly invokerRole: iam.
|
|
31
|
+
readonly invokerRole: iam.IRole;
|
|
42
32
|
readonly vpc: ec2.Vpc;
|
|
43
|
-
readonly
|
|
44
|
-
readonly privateIngressEndpoint: string;
|
|
33
|
+
readonly ingressEndpoint: string;
|
|
45
34
|
readonly metaEndpoint: string;
|
|
46
|
-
readonly registrationProvider: cr.Provider;
|
|
47
35
|
readonly registrationProviderToken: cdk.CfnOutput;
|
|
48
36
|
constructor(scope: Construct, id: string, props: RestateInstanceProps);
|
|
49
|
-
/**
|
|
50
|
-
* Creates a custom resource provider to facilitate service discovery. Note that the custom resource event handler
|
|
51
|
-
* must be able to reach the Restate instance's meta endpoint - which is why it is deployed within the same VPC.
|
|
52
|
-
*/
|
|
53
|
-
private createRegistrationProvider;
|
|
54
37
|
}
|
|
@@ -32,22 +32,15 @@ var __importStar = (this && this.__importStar) || function (mod) {
|
|
|
32
32
|
__setModuleDefault(result, mod);
|
|
33
33
|
return result;
|
|
34
34
|
};
|
|
35
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
-
};
|
|
38
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
36
|
exports.SingleNodeRestateInstance = exports.TracingMode = void 0;
|
|
40
37
|
const constructs_1 = require("constructs");
|
|
41
38
|
const ec2 = __importStar(require("aws-cdk-lib/aws-ec2"));
|
|
42
39
|
const iam = __importStar(require("aws-cdk-lib/aws-iam"));
|
|
43
|
-
const elb_v2 = __importStar(require("aws-cdk-lib/aws-elasticloadbalancingv2"));
|
|
44
|
-
const aws_elasticloadbalancingv2_1 = require("aws-cdk-lib/aws-elasticloadbalancingv2");
|
|
45
|
-
const aws_elasticloadbalancingv2_targets_1 = require("aws-cdk-lib/aws-elasticloadbalancingv2-targets");
|
|
46
|
-
const lambda_node = __importStar(require("aws-cdk-lib/aws-lambda-nodejs"));
|
|
47
|
-
const node_path_1 = __importDefault(require("node:path"));
|
|
48
|
-
const lambda = __importStar(require("aws-cdk-lib/aws-lambda"));
|
|
49
40
|
const cdk = __importStar(require("aws-cdk-lib"));
|
|
50
|
-
const
|
|
41
|
+
const registration_provider_1 = require("./registration-provider");
|
|
42
|
+
const PUBLIC_INGRESS_PORT = 443;
|
|
43
|
+
const PUBLIC_META_PORT = 9073;
|
|
51
44
|
const RESTATE_INGRESS_PORT = 8080;
|
|
52
45
|
const RESTATE_META_PORT = 9070;
|
|
53
46
|
const RESTATE_DOCKER_DEFAULT_TAG = "latest";
|
|
@@ -59,25 +52,27 @@ var TracingMode;
|
|
|
59
52
|
})(TracingMode || (exports.TracingMode = TracingMode = {}));
|
|
60
53
|
/**
|
|
61
54
|
* Creates a Restate service deployment backed by a single EC2 instance,
|
|
62
|
-
* suitable for development and testing purposes.
|
|
55
|
+
* suitable for development and testing purposes. The instance will be created
|
|
56
|
+
* in a dedicated VPC (unless one is provided). EC2 instance will be allocated
|
|
57
|
+
* a public IP address.
|
|
63
58
|
*/
|
|
64
59
|
class SingleNodeRestateInstance extends constructs_1.Construct {
|
|
65
60
|
constructor(scope, id, props) {
|
|
66
61
|
super(scope, id);
|
|
67
|
-
this.vpc = new ec2.Vpc(this, "
|
|
62
|
+
this.vpc = new ec2.Vpc(this, "Vpc", {
|
|
68
63
|
maxAzs: 3,
|
|
64
|
+
createInternetGateway: true,
|
|
65
|
+
natGateways: 0,
|
|
69
66
|
});
|
|
70
67
|
this.invokerRole = new iam.Role(this, "InstanceRole", {
|
|
71
68
|
assumedBy: new iam.ServicePrincipal("ec2.amazonaws.com"),
|
|
72
|
-
managedPolicies: [
|
|
73
|
-
iam.ManagedPolicy.fromAwsManagedPolicyName("AmazonSSMManagedInstanceCore"),
|
|
74
|
-
],
|
|
69
|
+
managedPolicies: [iam.ManagedPolicy.fromAwsManagedPolicyName("AmazonSSMManagedInstanceCore")],
|
|
75
70
|
});
|
|
76
71
|
props.logGroup.grantWrite(this.invokerRole);
|
|
77
72
|
const restateTag = props.restateTag ?? RESTATE_DOCKER_DEFAULT_TAG;
|
|
78
73
|
const adotTag = props.adotTag ?? ADOT_DOCKER_DEFAULT_TAG;
|
|
79
74
|
const restateInitCommands = ec2.UserData.forLinux();
|
|
80
|
-
restateInitCommands.addCommands("yum update -y", "yum install -y docker", "systemctl enable docker.service", "systemctl start docker.service", [
|
|
75
|
+
restateInitCommands.addCommands("yum update -y", "yum install -y docker nginx", "systemctl enable docker.service", "systemctl start docker.service", [
|
|
81
76
|
"docker run --name adot --restart unless-stopped --detach",
|
|
82
77
|
" -p 4317:4317 -p 55680:55680 -p 8889:8888",
|
|
83
78
|
` public.ecr.aws/aws-observability/aws-otel-collector:${adotTag}`,
|
|
@@ -88,9 +83,14 @@ class SingleNodeRestateInstance extends constructs_1.Construct {
|
|
|
88
83
|
" -e RESTATE_OBSERVABILITY__TRACING__ENDPOINT=http://localhost:4317",
|
|
89
84
|
` --log-driver=awslogs --log-opt awslogs-group=${props.logGroup.logGroupName}`,
|
|
90
85
|
` docker.io/restatedev/restate:${restateTag}`,
|
|
91
|
-
].join("")
|
|
86
|
+
].join(""), "mkdir -p /etc/pki/private", [
|
|
87
|
+
"openssl req -new -x509 -nodes -sha256 -days 365 -extensions v3_ca",
|
|
88
|
+
" -subj '/C=DE/ST=Berlin/L=Berlin/O=restate.dev/OU=demo/CN=restate.example.com'",
|
|
89
|
+
" -newkey rsa:2048 -keyout /etc/pki/private/restate-selfsigned.key -out /etc/pki/private/restate-selfsigned.crt",
|
|
90
|
+
].join(""), ["cat << EOF > /etc/nginx/conf.d/restate-ingress.conf", NGINX_REVERSE_PROXY_CONFIG, "EOF"].join("\n"), "systemctl enable nginx", "systemctl start nginx");
|
|
92
91
|
const restateInstance = new ec2.Instance(this, "Host", {
|
|
93
92
|
vpc: this.vpc,
|
|
93
|
+
vpcSubnets: { subnetType: ec2.SubnetType.PUBLIC },
|
|
94
94
|
instanceType: new ec2.InstanceType("t4g.micro"),
|
|
95
95
|
machineImage: ec2.MachineImage.latestAmazonLinux2023({
|
|
96
96
|
cpuType: ec2.AmazonLinuxCpuType.ARM_64,
|
|
@@ -107,81 +107,57 @@ class SingleNodeRestateInstance extends constructs_1.Construct {
|
|
|
107
107
|
const restateInstanceSecurityGroup = new ec2.SecurityGroup(this, "RestateSecurityGroup", {
|
|
108
108
|
vpc: this.vpc,
|
|
109
109
|
securityGroupName: "RestateSecurityGroup",
|
|
110
|
-
description: "
|
|
111
|
-
});
|
|
112
|
-
const ingressLoadBalancer = new elb_v2.ApplicationLoadBalancer(this, "RestateAlb", {
|
|
113
|
-
vpc: this.vpc,
|
|
114
|
-
internetFacing: true,
|
|
115
|
-
});
|
|
116
|
-
const targetGroup = new elb_v2.ApplicationTargetGroup(this, "TargetGroup", {
|
|
117
|
-
vpc: this.vpc,
|
|
118
|
-
protocol: elb_v2.ApplicationProtocol.HTTP,
|
|
119
|
-
port: RESTATE_INGRESS_PORT,
|
|
120
|
-
targets: [new aws_elasticloadbalancingv2_targets_1.InstanceTarget(restateInstance)],
|
|
121
|
-
healthCheck: {
|
|
122
|
-
protocol: elb_v2.Protocol.HTTP,
|
|
123
|
-
path: "/grpc.health.v1.Health/Check",
|
|
124
|
-
interval: cdk.Duration.seconds(60),
|
|
125
|
-
},
|
|
126
|
-
});
|
|
127
|
-
ingressLoadBalancer.addListener("Listener", {
|
|
128
|
-
port: props.certificate ? 443 : 80,
|
|
129
|
-
protocol: props.certificate ? aws_elasticloadbalancingv2_1.ApplicationProtocol.HTTPS : aws_elasticloadbalancingv2_1.ApplicationProtocol.HTTP,
|
|
130
|
-
defaultTargetGroups: [targetGroup],
|
|
131
|
-
certificates: props.certificate ? [elb_v2.ListenerCertificate.fromCertificateManager(props.certificate)] : [],
|
|
132
|
-
});
|
|
133
|
-
const albSecurityGroup = new ec2.SecurityGroup(this, "AlbSecurityGroup", {
|
|
134
|
-
vpc: this.vpc,
|
|
135
|
-
description: "ALB security group",
|
|
136
|
-
allowAllOutbound: false,
|
|
137
|
-
});
|
|
138
|
-
albSecurityGroup.addEgressRule(ec2.Peer.anyIpv4(), ec2.Port.tcp(RESTATE_INGRESS_PORT), "Allow outbound HTTP traffic to Restate ingress");
|
|
139
|
-
ingressLoadBalancer.addSecurityGroup(albSecurityGroup);
|
|
140
|
-
restateInstanceSecurityGroup.addIngressRule(albSecurityGroup, ec2.Port.tcp(RESTATE_INGRESS_PORT), "Allow traffic from ALB to Restate ingress");
|
|
141
|
-
// These rules allow the service registration component to trigger service discovery as needed; the requests
|
|
142
|
-
// originate from a VPC-bound Lambda function that backs the custom resource.
|
|
143
|
-
this.vpc.privateSubnets.forEach((subnet) => {
|
|
144
|
-
restateInstanceSecurityGroup.addIngressRule(ec2.Peer.ipv4(subnet.ipv4CidrBlock), ec2.Port.tcp(RESTATE_META_PORT), "Allow traffic from the VPC to Restate meta");
|
|
145
|
-
});
|
|
146
|
-
this.vpc.privateSubnets.forEach((subnet) => {
|
|
147
|
-
restateInstanceSecurityGroup.addIngressRule(ec2.Peer.ipv4(subnet.ipv4CidrBlock), ec2.Port.tcp(RESTATE_INGRESS_PORT), "Allow traffic from the VPC to Restate ingress");
|
|
110
|
+
description: "Restate service ACLs",
|
|
148
111
|
});
|
|
149
112
|
restateInstance.addSecurityGroup(restateInstanceSecurityGroup);
|
|
150
|
-
|
|
151
|
-
|
|
113
|
+
restateInstanceSecurityGroup.addIngressRule(ec2.Peer.anyIpv4(), ec2.Port.tcp(443), "Allow traffic from anywhere to Restate ingress");
|
|
114
|
+
restateInstanceSecurityGroup.addIngressRule(ec2.Peer.anyIpv4(), ec2.Port.tcp(9073), "Allow traffic from anywhere to Restate meta");
|
|
115
|
+
const registrationProvider = new registration_provider_1.RegistrationProvider(this, "RegistrationProvider", {});
|
|
152
116
|
this.registrationProviderToken = new cdk.CfnOutput(this, "RegistrationProviderToken", {
|
|
153
117
|
description: "Custom resource provider service token, needed by the Restate service registry component to trigger discovery",
|
|
154
118
|
exportName: [props.prefix, "RegistrationProviderToken"].join("-"),
|
|
155
119
|
value: registrationProvider.serviceToken,
|
|
156
120
|
});
|
|
157
|
-
this.
|
|
158
|
-
this.
|
|
159
|
-
this.metaEndpoint = `http://${this.instance.instancePrivateDnsName}:${RESTATE_META_PORT}`;
|
|
160
|
-
}
|
|
161
|
-
/**
|
|
162
|
-
* Creates a custom resource provider to facilitate service discovery. Note that the custom resource event handler
|
|
163
|
-
* must be able to reach the Restate instance's meta endpoint - which is why it is deployed within the same VPC.
|
|
164
|
-
*/
|
|
165
|
-
createRegistrationProvider() {
|
|
166
|
-
const registrationHandler = new lambda_node.NodejsFunction(this, "RegistrationHandler", {
|
|
167
|
-
description: "Restate custom registration handler",
|
|
168
|
-
entry: node_path_1.default.join(__dirname, "register-service-handler/index.js"),
|
|
169
|
-
architecture: lambda.Architecture.ARM_64,
|
|
170
|
-
runtime: lambda.Runtime.NODEJS_LATEST,
|
|
171
|
-
memorySize: 128,
|
|
172
|
-
timeout: cdk.Duration.seconds(60),
|
|
173
|
-
environment: {
|
|
174
|
-
NODE_OPTIONS: "--enable-source-maps",
|
|
175
|
-
},
|
|
176
|
-
vpc: this.vpc,
|
|
177
|
-
vpcSubnets: {
|
|
178
|
-
subnets: this.vpc.privateSubnets,
|
|
179
|
-
},
|
|
180
|
-
});
|
|
181
|
-
return new cr.Provider(this, "RegistrationProvider", {
|
|
182
|
-
onEventHandler: registrationHandler,
|
|
183
|
-
});
|
|
121
|
+
this.ingressEndpoint = `https://${restateInstance.instancePublicDnsName}${PUBLIC_INGRESS_PORT == 443 ? "" : `:${PUBLIC_INGRESS_PORT}`}`;
|
|
122
|
+
this.metaEndpoint = `https://${restateInstance.instancePublicDnsName}:${PUBLIC_META_PORT}`;
|
|
184
123
|
}
|
|
185
124
|
}
|
|
186
125
|
exports.SingleNodeRestateInstance = SingleNodeRestateInstance;
|
|
187
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2luZ2xlLW5vZGUtcmVzdGF0ZS1pbnN0YW5jZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL2xpYi9yZXN0YXRlLWNvbnN0cnVjdHMvc2luZ2xlLW5vZGUtcmVzdGF0ZS1pbnN0YW5jZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7OztHQVNHOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUVILDJDQUF1QztBQUV2Qyx5REFBMkM7QUFDM0MseURBQTJDO0FBQzNDLCtFQUFpRTtBQUNqRSx1RkFBNkU7QUFDN0UsdUdBQWdGO0FBQ2hGLDJFQUE2RDtBQUM3RCwwREFBNkI7QUFDN0IsK0RBQWlEO0FBQ2pELGlEQUFtQztBQUNuQyxpRUFBbUQ7QUFHbkQsTUFBTSxvQkFBb0IsR0FBRyxJQUFJLENBQUM7QUFDbEMsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLENBQUM7QUFDL0IsTUFBTSwwQkFBMEIsR0FBRyxRQUFRLENBQUM7QUFDNUMsTUFBTSx1QkFBdUIsR0FBRyxRQUFRLENBQUM7QUFZekMsSUFBWSxXQUdYO0FBSEQsV0FBWSxXQUFXO0lBQ3JCLG9DQUFxQixDQUFBO0lBQ3JCLG9DQUFxQixDQUFBO0FBQ3ZCLENBQUMsRUFIVyxXQUFXLDJCQUFYLFdBQVcsUUFHdEI7QUFzQkQ7OztHQUdHO0FBQ0gsTUFBYSx5QkFBMEIsU0FBUSxzQkFBUztJQVd0RCxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQTJCO1FBQ25FLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakIsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLFlBQVksRUFBRTtZQUN6QyxNQUFNLEVBQUUsQ0FBQztTQUNWLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxjQUFjLEVBQUU7WUFDcEQsU0FBUyxF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ZXN0YXRlIFNvZnR3YXJlLCBJbmMuLCBSZXN0YXRlIEdtYkhcbiAqXG4gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgUmVzdGF0ZSBTREsgZm9yIE5vZGUuanMvVHlwZVNjcmlwdCxcbiAqIHdoaWNoIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbiAqXG4gKiBZb3UgY2FuIGZpbmQgYSBjb3B5IG9mIHRoZSBsaWNlbnNlIGluIGZpbGUgTElDRU5TRSBpbiB0aGUgcm9vdFxuICogZGlyZWN0b3J5IG9mIHRoaXMgcmVwb3NpdG9yeSBvciBwYWNrYWdlLCBvciBhdFxuICogaHR0cHM6Ly9naXRodWIuY29tL3Jlc3RhdGVkZXYvc2RrLXR5cGVzY3JpcHQvYmxvYi9tYWluL0xJQ0VOU0VcbiAqL1xuXG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuaW1wb3J0ICogYXMgbG9ncyBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWxvZ3NcIjtcbmltcG9ydCAqIGFzIGVjMiBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWVjMlwiO1xuaW1wb3J0ICogYXMgaWFtIGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtaWFtXCI7XG5pbXBvcnQgKiBhcyBlbGJfdjIgZnJvbSBcImF3cy1jZGstbGliL2F3cy1lbGFzdGljbG9hZGJhbGFuY2luZ3YyXCI7XG5pbXBvcnQgeyBBcHBsaWNhdGlvblByb3RvY29sIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1lbGFzdGljbG9hZGJhbGFuY2luZ3YyXCI7XG5pbXBvcnQgeyBJbnN0YW5jZVRhcmdldCB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZWxhc3RpY2xvYWRiYWxhbmNpbmd2Mi10YXJnZXRzXCI7XG5pbXBvcnQgKiBhcyBsYW1iZGFfbm9kZSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWxhbWJkYS1ub2RlanNcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCAqIGFzIGxhbWJkYSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWxhbWJkYVwiO1xuaW1wb3J0ICogYXMgY2RrIGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuaW1wb3J0ICogYXMgY3IgZnJvbSBcImF3cy1jZGstbGliL2N1c3RvbS1yZXNvdXJjZXNcIjtcbmltcG9ydCAqIGFzIGFjbSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWNlcnRpZmljYXRlbWFuYWdlclwiO1xuXG5jb25zdCBSRVNUQVRFX0lOR1JFU1NfUE9SVCA9IDgwODA7XG5jb25zdCBSRVNUQVRFX01FVEFfUE9SVCA9IDkwNzA7XG5jb25zdCBSRVNUQVRFX0RPQ0tFUl9ERUZBVUxUX1RBRyA9IFwibGF0ZXN0XCI7XG5jb25zdCBBRE9UX0RPQ0tFUl9ERUZBVUxUX1RBRyA9IFwibGF0ZXN0XCI7XG5cbi8qKlxuICogUmVwcmVzZW50cyBhbiBpbnN0YW5jZSBvZiB0aGUgUmVzdGF0ZSBzZXJ2aWNlLiBUaGlzIGNvdWxkIHJlcHJlc2VudCBhIHNlbGYtaG9zdGVkIGJyb2tlciwgb3IgUmVzdGF0ZSdzIG1hbmFnZWRcbiAqIHNlcnZpY2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVzdGF0ZUluc3RhbmNlIHtcbiAgcmVhZG9ubHkgaW52b2tlclJvbGU6IGlhbS5Sb2xlO1xuICByZWFkb25seSBtZXRhRW5kcG9pbnQ6IHN0cmluZztcbiAgcmVhZG9ubHkgcmVnaXN0cmF0aW9uUHJvdmlkZXJUb2tlbjogY2RrLkNmbk91dHB1dDtcbn1cblxuZXhwb3J0IGVudW0gVHJhY2luZ01vZGUge1xuICBESVNBQkxFRCA9IFwiRElTQUJMRURcIixcbiAgQVdTX1hSQVkgPSBcIkFXU19YUkFZXCIsXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVzdGF0ZUluc3RhbmNlUHJvcHMge1xuICAvKiogTG9nIGdyb3VwIGZvciBSZXN0YXRlIHNlcnZpY2UgbG9ncy4gKi9cbiAgbG9nR3JvdXA6IGxvZ3MuTG9nR3JvdXA7XG5cbiAgLyoqIFRyYWNpbmcgbW9kZSBmb3IgUmVzdGF0ZSBzZXJ2aWNlcy4gRGlzYWJsZWQgYnkgZGVmYXVsdC4gKi9cbiAgdHJhY2luZz86IFRyYWNpbmdNb2RlO1xuXG4gIC8qKiBQcmVmaXggZm9yIHJlc291cmNlcyBjcmVhdGVkIGJ5IHRoaXMgY29uc3RydWN0IHRoYXQgcmVxdWlyZSB1bmlxdWUgbmFtZXMuICovXG4gIHByZWZpeD86IHN0cmluZztcblxuICAvKiogUmVzdGF0ZSBEb2NrZXIgaW1hZ2UgdGFnLiBEZWZhdWx0cyB0byBgbGF0ZXN0YC4gKi9cbiAgcmVzdGF0ZVRhZz86IHN0cmluZztcblxuICAvKiogQW1hem9uIERpc3RybyBmb3IgT3BlbiBUZWxlbWV0cnkgRG9ja2VyIGltYWdlIHRhZy4gRGVmYXVsdHMgdG8gYGxhdGVzdGAuICovXG4gIGFkb3RUYWc/OiBzdHJpbmc7XG5cbiAgLyoqIE9wdGlvbmFsIGNlcnRpZmljYXRlIGZvciBpbmdyZXNzIGVuZHBvaW50LiBJZiB1bnNwZWNpZmllZCwgYSBwbGFpbiBIVFRQIGxpc3RlbmVyIHdpbGwgYmUgY3JlYXRlZC4gKi9cbiAgY2VydGlmaWNhdGU/OiBhY20uSUNlcnRpZmljYXRlO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBSZXN0YXRlIHNlcnZpY2UgZGVwbG95bWVudCBiYWNrZWQgYnkgYSBzaW5nbGUgRUMyIGluc3RhbmNlLFxuICogc3VpdGFibGUgZm9yIGRldmVsb3BtZW50IGFuZCB0ZXN0aW5nIHB1cnBvc2VzLlxuICovXG5leHBvcnQgY2xhc3MgU2luZ2xlTm9kZVJlc3RhdGVJbnN0YW5jZSBleHRlbmRzIENvbnN0cnVjdCBpbXBsZW1lbnRzIFJlc3RhdGVJbnN0YW5jZSB7XG4gIHJlYWRvbmx5IGluc3RhbmNlOiBlYzIuSW5zdGFuY2U7XG4gIHJlYWRvbmx5IGludm9rZXJSb2xlOiBpYW0uUm9sZTtcbiAgcmVhZG9ubHkgdnBjOiBlYzIuVnBjO1xuXG4gIHJlYWRvbmx5IHB1YmxpY0luZ3Jlc3NFbmRwb2ludDogc3RyaW5nO1xuICByZWFkb25seSBwcml2YXRlSW5ncmVzc0VuZHBvaW50OiBzdHJpbmc7XG4gIHJlYWRvbmx5IG1ldGFFbmRwb2ludDogc3RyaW5nO1xuICByZWFkb25seSByZWdpc3RyYXRpb25Qcm92aWRlcjogY3IuUHJvdmlkZXI7XG4gIHJlYWRvbmx5IHJlZ2lzdHJhdGlvblByb3ZpZGVyVG9rZW46IGNkay5DZm5PdXRwdXQ7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IFJlc3RhdGVJbnN0YW5jZVByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIHRoaXMudnBjID0gbmV3IGVjMi5WcGModGhpcywgXCJSZXN0YXRlVnBjXCIsIHtcbiAgICAgIG1heEF6czogMyxcbiAgICB9KTtcblxuICAgIHRoaXMuaW52b2tlclJvbGUgPSBuZXcgaWFtLlJvbGUodGhpcywgXCJJbnN0YW5jZVJvbGVcIiwge1xuICAgICAgYXNzdW1lZEJ5OiBuZXcgaWFtLlNlcnZpY2VQcmluY2lwYWwoXCJlYzIuYW1hem9uYXdzLmNvbVwiKSxcbiAgICAgIG1hbmFnZWRQb2xpY2llczogW1xuICAgICAgICBpYW0uTWFuYWdlZFBvbGljeS5mcm9tQXdzTWFuYWdlZFBvbGljeU5hbWUoXCJBbWF6b25TU01NYW5hZ2VkSW5zdGFuY2VDb3JlXCIpLFxuICAgICAgXSxcbiAgICB9KTtcbiAgICBwcm9wcy5sb2dHcm91cC5ncmFudFdyaXRlKHRoaXMuaW52b2tlclJvbGUpO1xuXG4gICAgY29uc3QgcmVzdGF0ZVRhZyA9IHByb3BzLnJlc3RhdGVUYWcgPz8gUkVTVEFURV9ET0NLRVJfREVGQVVMVF9UQUc7XG4gICAgY29uc3QgYWRvdFRhZyA9IHByb3BzLmFkb3RUYWcgPz8gQURPVF9ET0NLRVJfREVGQVVMVF9UQUc7XG4gICAgY29uc3QgcmVzdGF0ZUluaXRDb21tYW5kcyA9IGVjMi5Vc2VyRGF0YS5mb3JMaW51eCgpO1xuICAgIHJlc3RhdGVJbml0Q29tbWFuZHMuYWRkQ29tbWFuZHMoXG4gICAgICBcInl1bSB1cGRhdGUgLXlcIixcbiAgICAgIFwieXVtIGluc3RhbGwgLXkgZG9ja2VyXCIsXG4gICAgICBcInN5c3RlbWN0bCBlbmFibGUgZG9ja2VyLnNlcnZpY2VcIixcbiAgICAgIFwic3lzdGVtY3RsIHN0YXJ0IGRvY2tlci5zZXJ2aWNlXCIsXG4gICAgICBbXG4gICAgICAgIFwiZG9ja2VyIHJ1biAtLW5hbWUgYWRvdCAtLXJlc3RhcnQgdW5sZXNzLXN0b3BwZWQgLS1kZXRhY2hcIixcbiAgICAgICAgXCIgLXAgNDMxNzo0MzE3IC1wIDU1NjgwOjU1NjgwIC1wIDg4ODk6ODg4OFwiLFxuICAgICAgICBgIHB1YmxpYy5lY3IuYXdzL2F3cy1vYnNlcnZhYmlsaXR5L2F3cy1vdGVsLWNvbGxlY3Rvcjoke2Fkb3RUYWd9YCxcbiAgICAgIF0uam9pbihcIlwiKSxcbiAgICAgIFtcbiAgICAgICAgXCJkb2NrZXIgcnVuIC0tbmFtZSByZXN0YXRlIC0tcmVzdGFydCB1bmxlc3Mtc3RvcHBlZCAtLWRldGFjaFwiLFxuICAgICAgICBcIiAtLXZvbHVtZSAvdmFyL3Jlc3RhdGU6L3RhcmdldCAtLW5ldHdvcms9aG9zdFwiLFxuICAgICAgICBcIiAtZSBSRVNUQVRFX09CU0VSVkFCSUxJVFlfX0xPR19fRk9STUFUPUpzb24gLWUgUlVTVF9MT0c9aW5mbyxyZXN0YXRlX3dvcmtlcjo6cGFydGl0aW9uPXdhcm5cIixcbiAgICAgICAgXCIgLWUgUkVTVEFURV9PQlNFUlZBQklMSVRZX19UUkFDSU5HX19FTkRQT0lOVD1odHRwOi8vbG9jYWxob3N0OjQzMTdcIixcbiAgICAgICAgYCAtLWxvZy1kcml2ZXI9YXdzbG9ncyAtLWxvZy1vcHQgYXdzbG9ncy1ncm91cD0ke3Byb3BzLmxvZ0dyb3VwLmxvZ0dyb3VwTmFtZX1gLFxuICAgICAgICBgIGRvY2tlci5pby9yZXN0YXRlZGV2L3Jlc3RhdGU6JHtyZXN0YXRlVGFnfWAsXG4gICAgICBdLmpvaW4oXCJcIiksXG4gICAgKTtcblxuICAgIGNvbnN0IHJlc3RhdGVJbnN0YW5jZSA9IG5ldyBlYzIuSW5zdGFuY2UodGhpcywgXCJIb3N0XCIsIHtcbiAgICAgIHZwYzogdGhpcy52cGMsXG4gICAgICBpbnN0YW5jZVR5cGU6IG5ldyBlYzIuSW5zdGFuY2VUeXBlKFwidDRnLm1pY3JvXCIpLFxuICAgICAgbWFjaGluZUltYWdlOiBlYzIuTWFjaGluZUltYWdlLmxhdGVzdEFtYXpvbkxpbnV4MjAyMyh7XG4gICAgICAgIGNwdVR5cGU6IGVjMi5BbWF6b25MaW51eENwdVR5cGUuQVJNXzY0LFxuICAgICAgfSksXG4gICAgICByb2xlOiB0aGlzLmludm9rZXJSb2xlLFxuICAgICAgdXNlckRhdGE6IHJlc3RhdGVJbml0Q29tbWFuZHMsXG4gICAgfSk7XG4gICAgdGhpcy5pbnN0YW5jZSA9IHJlc3RhdGVJbnN0YW5jZTtcblxuICAgIC8vIFdlIHN0YXJ0IHRoZSBBRE9UIGNvbGxlY3RvciByZWdhcmRsZXNzLCBhbmQgb25seSBjb250cm9sIHdoZXRoZXIgdGhleSB3aWxsIGJlIHB1Ymxpc2hlZCB0byBYLVJheSB2aWEgaW5zdGFuY2VcbiAgICAvLyByb2xlIHBlcm1pc3Npb25zLiBUaGlzIHdheSBoaXN0b3JpYyB0cmFjZXMgd2lsbCBiZSBidWZmZXJlZCBvbiB0aGUgaG9zdCwgZXZlbiBpZiB0cmFjaW5nIGlzIGRpc2FibGVkIGluaXRpYWxseS5cbiAgICBpZiAocHJvcHMudHJhY2luZyA9PT0gVHJhY2luZ01vZGUuQVdTX1hSQVkpIHtcbiAgICAgIHJlc3RhdGVJbnN0YW5jZS5yb2xlLmFkZE1hbmFnZWRQb2xpY3koaWFtLk1hbmFnZWRQb2xpY3kuZnJvbUF3c01hbmFnZWRQb2xpY3lOYW1lKFwiQVdTWHJheVdyaXRlT25seUFjY2Vzc1wiKSk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVzdGF0ZUluc3RhbmNlU2VjdXJpdHlHcm91cCA9IG5ldyBlYzIuU2VjdXJpdHlHcm91cCh0aGlzLCBcIlJlc3RhdGVTZWN1cml0eUdyb3VwXCIsIHtcbiAgICAgIHZwYzogdGhpcy52cGMsXG4gICAgICBzZWN1cml0eUdyb3VwTmFtZTogXCJSZXN0YXRlU2VjdXJpdHlHcm91cFwiLFxuICAgICAgZGVzY3JpcHRpb246IFwiQWxsb3cgaW5ib3VuZCB0cmFmZmljIHRvIFJlc3RhdGVcIixcbiAgICB9KTtcblxuICAgIGNvbnN0IGluZ3Jlc3NMb2FkQmFsYW5jZXIgPSBuZXcgZWxiX3YyLkFwcGxpY2F0aW9uTG9hZEJhbGFuY2VyKHRoaXMsIFwiUmVzdGF0ZUFsYlwiLCB7XG4gICAgICB2cGM6IHRoaXMudnBjLFxuICAgICAgaW50ZXJuZXRGYWNpbmc6IHRydWUsXG4gICAgfSk7XG4gICAgY29uc3QgdGFyZ2V0R3JvdXAgPSBuZXcgZWxiX3YyLkFwcGxpY2F0aW9uVGFyZ2V0R3JvdXAodGhpcywgXCJUYXJnZXRHcm91cFwiLCB7XG4gICAgICB2cGM6IHRoaXMudnBjLFxuICAgICAgcHJvdG9jb2w6IGVsYl92Mi5BcHBsaWNhdGlvblByb3RvY29sLkhUVFAsXG4gICAgICBwb3J0OiBSRVNUQVRFX0lOR1JFU1NfUE9SVCxcbiAgICAgIHRhcmdldHM6IFtuZXcgSW5zdGFuY2VUYXJnZXQocmVzdGF0ZUluc3RhbmNlKV0sXG4gICAgICBoZWFsdGhDaGVjazoge1xuICAgICAgICBwcm90b2NvbDogZWxiX3YyLlByb3RvY29sLkhUVFAsXG4gICAgICAgIHBhdGg6IFwiL2dycGMuaGVhbHRoLnYxLkhlYWx0aC9DaGVja1wiLFxuICAgICAgICBpbnRlcnZhbDogY2RrLkR1cmF0aW9uLnNlY29uZHMoNjApLFxuICAgICAgfSxcbiAgICB9KTtcbiAgICBpbmdyZXNzTG9hZEJhbGFuY2VyLmFkZExpc3RlbmVyKFwiTGlzdGVuZXJcIiwge1xuICAgICAgcG9ydDogcHJvcHMuY2VydGlmaWNhdGUgPyA0NDMgOiA4MCxcbiAgICAgIHByb3RvY29sOiBwcm9wcy5jZXJ0aWZpY2F0ZSA/IEFwcGxpY2F0aW9uUHJvdG9jb2wuSFRUUFMgOiBBcHBsaWNhdGlvblByb3RvY29sLkhUVFAsXG4gICAgICBkZWZhdWx0VGFyZ2V0R3JvdXBzOiBbdGFyZ2V0R3JvdXBdLFxuICAgICAgY2VydGlmaWNhdGVzOiBwcm9wcy5jZXJ0aWZpY2F0ZSA/IFtlbGJfdjIuTGlzdGVuZXJDZXJ0aWZpY2F0ZS5mcm9tQ2VydGlmaWNhdGVNYW5hZ2VyKHByb3BzLmNlcnRpZmljYXRlKV0gOiBbXSxcbiAgICB9KTtcblxuICAgIGNvbnN0IGFsYlNlY3VyaXR5R3JvdXAgPSBuZXcgZWMyLlNlY3VyaXR5R3JvdXAodGhpcywgXCJBbGJTZWN1cml0eUdyb3VwXCIsIHtcbiAgICAgIHZwYzogdGhpcy52cGMsXG4gICAgICBkZXNjcmlwdGlvbjogXCJBTEIgc2VjdXJpdHkgZ3JvdXBcIixcbiAgICAgIGFsbG93QWxsT3V0Ym91bmQ6IGZhbHNlLFxuICAgIH0pO1xuICAgIGFsYlNlY3VyaXR5R3JvdXAuYWRkRWdyZXNzUnVsZShlYzIuUGVlci5hbnlJcHY0KCksIGVjMi5Qb3J0LnRjcChSRVNUQVRFX0lOR1JFU1NfUE9SVCksIFwiQWxsb3cgb3V0Ym91bmQgSFRUUCB0cmFmZmljIHRvIFJlc3RhdGUgaW5ncmVzc1wiKTtcbiAgICBpbmdyZXNzTG9hZEJhbGFuY2VyLmFkZFNlY3VyaXR5R3JvdXAoYWxiU2VjdXJpdHlHcm91cCk7XG5cbiAgICByZXN0YXRlSW5zdGFuY2VTZWN1cml0eUdyb3VwLmFkZEluZ3Jlc3NSdWxlKGFsYlNlY3VyaXR5R3JvdXAsIGVjMi5Qb3J0LnRjcChSRVNUQVRFX0lOR1JFU1NfUE9SVCksIFwiQWxsb3cgdHJhZmZpYyBmcm9tIEFMQiB0byBSZXN0YXRlIGluZ3Jlc3NcIik7XG5cbiAgICAvLyBUaGVzZSBydWxlcyBhbGxvdyB0aGUgc2VydmljZSByZWdpc3RyYXRpb24gY29tcG9uZW50IHRvIHRyaWdnZXIgc2VydmljZSBkaXNjb3ZlcnkgYXMgbmVlZGVkOyB0aGUgcmVxdWVzdHNcbiAgICAvLyBvcmlnaW5hdGUgZnJvbSBhIFZQQy1ib3VuZCBMYW1iZGEgZnVuY3Rpb24gdGhhdCBiYWNrcyB0aGUgY3VzdG9tIHJlc291cmNlLlxuICAgIHRoaXMudnBjLnByaXZhdGVTdWJuZXRzLmZvckVhY2goKHN1Ym5ldCkgPT4ge1xuICAgICAgcmVzdGF0ZUluc3RhbmNlU2VjdXJpdHlHcm91cC5hZGRJbmdyZXNzUnVsZShlYzIuUGVlci5pcHY0KHN1Ym5ldC5pcHY0Q2lkckJsb2NrKSwgZWMyLlBvcnQudGNwKFJFU1RBVEVfTUVUQV9QT1JUKSwgXCJBbGxvdyB0cmFmZmljIGZyb20gdGhlIFZQQyB0byBSZXN0YXRlIG1ldGFcIik7XG4gICAgfSk7XG4gICAgdGhpcy52cGMucHJpdmF0ZVN1Ym5ldHMuZm9yRWFjaCgoc3VibmV0KSA9PiB7XG4gICAgICByZXN0YXRlSW5zdGFuY2VTZWN1cml0eUdyb3VwLmFkZEluZ3Jlc3NSdWxlKGVjMi5QZWVyLmlwdjQoc3VibmV0LmlwdjRDaWRyQmxvY2spLCBlYzIuUG9ydC50Y3AoUkVTVEFURV9JTkdSRVNTX1BPUlQpLCBcIkFsbG93IHRyYWZmaWMgZnJvbSB0aGUgVlBDIHRvIFJlc3RhdGUgaW5ncmVzc1wiKTtcbiAgICB9KTtcbiAgICByZXN0YXRlSW5zdGFuY2UuYWRkU2VjdXJpdHlHcm91cChyZXN0YXRlSW5zdGFuY2VTZWN1cml0eUdyb3VwKTtcblxuICAgIGNvbnN0IHJlZ2lzdHJhdGlvblByb3ZpZGVyID0gdGhpcy5jcmVhdGVSZWdpc3RyYXRpb25Qcm92aWRlcigpO1xuICAgIHRoaXMucmVnaXN0cmF0aW9uUHJvdmlkZXIgPSByZWdpc3RyYXRpb25Qcm92aWRlcjtcbiAgICB0aGlzLnJlZ2lzdHJhdGlvblByb3ZpZGVyVG9rZW4gPSBuZXcgY2RrLkNmbk91dHB1dCh0aGlzLCBcIlJlZ2lzdHJhdGlvblByb3ZpZGVyVG9rZW5cIiwge1xuICAgICAgZGVzY3JpcHRpb246IFwiQ3VzdG9tIHJlc291cmNlIHByb3ZpZGVyIHNlcnZpY2UgdG9rZW4sIG5lZWRlZCBieSB0aGUgUmVzdGF0ZSBzZXJ2aWNlIHJlZ2lzdHJ5IGNvbXBvbmVudCB0byB0cmlnZ2VyIGRpc2NvdmVyeVwiLFxuICAgICAgZXhwb3J0TmFtZTogW3Byb3BzLnByZWZpeCwgXCJSZWdpc3RyYXRpb25Qcm92aWRlclRva2VuXCJdLmpvaW4oXCItXCIpLFxuICAgICAgdmFsdWU6IHJlZ2lzdHJhdGlvblByb3ZpZGVyLnNlcnZpY2VUb2tlbixcbiAgICB9KTtcblxuICAgIHRoaXMucHVibGljSW5ncmVzc0VuZHBvaW50ID0gYCR7cHJvcHMuY2VydGlmaWNhdGUgPyBcImh0dHBzXCIgOiBcImh0dHBcIn06Ly8ke2luZ3Jlc3NMb2FkQmFsYW5jZXIubG9hZEJhbGFuY2VyRG5zTmFtZX1gO1xuICAgIHRoaXMucHJpdmF0ZUluZ3Jlc3NFbmRwb2ludCA9IGBodHRwOi8vJHt0aGlzLmluc3RhbmNlLmluc3RhbmNlUHJpdmF0ZURuc05hbWV9OiR7UkVTVEFURV9JTkdSRVNTX1BPUlR9YDtcbiAgICB0aGlzLm1ldGFFbmRwb2ludCA9IGBodHRwOi8vJHt0aGlzLmluc3RhbmNlLmluc3RhbmNlUHJpdmF0ZURuc05hbWV9OiR7UkVTVEFURV9NRVRBX1BPUlR9YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgY3VzdG9tIHJlc291cmNlIHByb3ZpZGVyIHRvIGZhY2lsaXRhdGUgc2VydmljZSBkaXNjb3ZlcnkuIE5vdGUgdGhhdCB0aGUgY3VzdG9tIHJlc291cmNlIGV2ZW50IGhhbmRsZXJcbiAgICogbXVzdCBiZSBhYmxlIHRvIHJlYWNoIHRoZSBSZXN0YXRlIGluc3RhbmNlJ3MgbWV0YSBlbmRwb2ludCAtIHdoaWNoIGlzIHdoeSBpdCBpcyBkZXBsb3llZCB3aXRoaW4gdGhlIHNhbWUgVlBDLlxuICAgKi9cbiAgcHJpdmF0ZSBjcmVhdGVSZWdpc3RyYXRpb25Qcm92aWRlcigpIHtcbiAgICBjb25zdCByZWdpc3RyYXRpb25IYW5kbGVyID0gbmV3IGxhbWJkYV9ub2RlLk5vZGVqc0Z1bmN0aW9uKHRoaXMsIFwiUmVnaXN0cmF0aW9uSGFuZGxlclwiLCB7XG4gICAgICBkZXNjcmlwdGlvbjogXCJSZXN0YXRlIGN1c3RvbSByZWdpc3RyYXRpb24gaGFuZGxlclwiLFxuICAgICAgZW50cnk6IHBhdGguam9pbihfX2Rpcm5hbWUsIFwicmVnaXN0ZXItc2VydmljZS1oYW5kbGVyL2luZGV4LmpzXCIpLFxuICAgICAgYXJjaGl0ZWN0dXJlOiBsYW1iZGEuQXJjaGl0ZWN0dXJlLkFSTV82NCxcbiAgICAgIHJ1bnRpbWU6IGxhbWJkYS5SdW50aW1lLk5PREVKU19MQVRFU1QsXG4gICAgICBtZW1vcnlTaXplOiAxMjgsXG4gICAgICB0aW1lb3V0OiBjZGsuRHVyYXRpb24uc2Vjb25kcyg2MCksXG4gICAgICBlbnZpcm9ubWVudDoge1xuICAgICAgICBOT0RFX09QVElPTlM6IFwiLS1lbmFibGUtc291cmNlLW1hcHNcIixcbiAgICAgIH0sXG4gICAgICB2cGM6IHRoaXMudnBjLFxuICAgICAgdnBjU3VibmV0czoge1xuICAgICAgICBzdWJuZXRzOiB0aGlzLnZwYy5wcml2YXRlU3VibmV0cyxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICByZXR1cm4gbmV3IGNyLlByb3ZpZGVyKHRoaXMsIFwiUmVnaXN0cmF0aW9uUHJvdmlkZXJcIiwge1xuICAgICAgb25FdmVudEhhbmRsZXI6IHJlZ2lzdHJhdGlvbkhhbmRsZXIsXG4gICAgfSk7XG4gIH1cbn0iXX0=
|
|
126
|
+
const NGINX_REVERSE_PROXY_CONFIG = [
|
|
127
|
+
"server {",
|
|
128
|
+
" listen 443 ssl http2;",
|
|
129
|
+
" listen [::]:443 ssl http2;",
|
|
130
|
+
" server_name _;",
|
|
131
|
+
" root /usr/share/nginx/html;",
|
|
132
|
+
"",
|
|
133
|
+
' ssl_certificate "/etc/pki/private/restate-selfsigned.crt";',
|
|
134
|
+
' ssl_certificate_key "/etc/pki/private/restate-selfsigned.key";',
|
|
135
|
+
" ssl_session_cache shared:SSL:1m;",
|
|
136
|
+
" ssl_session_timeout 10m;",
|
|
137
|
+
" ssl_ciphers PROFILE=SYSTEM;",
|
|
138
|
+
" ssl_prefer_server_ciphers on;",
|
|
139
|
+
"",
|
|
140
|
+
" location / {",
|
|
141
|
+
` proxy_pass http://localhost:${RESTATE_INGRESS_PORT};`,
|
|
142
|
+
" }",
|
|
143
|
+
"}",
|
|
144
|
+
"",
|
|
145
|
+
"server {",
|
|
146
|
+
" listen 9073 ssl http2;",
|
|
147
|
+
" listen [::]:9073 ssl http2;",
|
|
148
|
+
" server_name _;",
|
|
149
|
+
" root /usr/share/nginx/html;",
|
|
150
|
+
"",
|
|
151
|
+
' ssl_certificate "/etc/pki/private/restate-selfsigned.crt";',
|
|
152
|
+
' ssl_certificate_key "/etc/pki/private/restate-selfsigned.key";',
|
|
153
|
+
" ssl_session_cache shared:SSL:1m;",
|
|
154
|
+
" ssl_session_timeout 10m;",
|
|
155
|
+
" ssl_ciphers PROFILE=SYSTEM;",
|
|
156
|
+
" ssl_prefer_server_ciphers on;",
|
|
157
|
+
"",
|
|
158
|
+
" location / {",
|
|
159
|
+
` proxy_pass http://localhost:${RESTATE_META_PORT};`,
|
|
160
|
+
" }",
|
|
161
|
+
"}",
|
|
162
|
+
].join("\n");
|
|
163
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2luZ2xlLW5vZGUtcmVzdGF0ZS1pbnN0YW5jZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL2xpYi9yZXN0YXRlLWNvbnN0cnVjdHMvc2luZ2xlLW5vZGUtcmVzdGF0ZS1pbnN0YW5jZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7OztHQVNHOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUVILDJDQUF1QztBQUV2Qyx5REFBMkM7QUFDM0MseURBQTJDO0FBQzNDLGlEQUFtQztBQUVuQyxtRUFBK0Q7QUFFL0QsTUFBTSxtQkFBbUIsR0FBRyxHQUFHLENBQUM7QUFDaEMsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUM7QUFDOUIsTUFBTSxvQkFBb0IsR0FBRyxJQUFJLENBQUM7QUFDbEMsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLENBQUM7QUFDL0IsTUFBTSwwQkFBMEIsR0FBRyxRQUFRLENBQUM7QUFDNUMsTUFBTSx1QkFBdUIsR0FBRyxRQUFRLENBQUM7QUFFekMsSUFBWSxXQUdYO0FBSEQsV0FBWSxXQUFXO0lBQ3JCLG9DQUFxQixDQUFBO0lBQ3JCLG9DQUFxQixDQUFBO0FBQ3ZCLENBQUMsRUFIVyxXQUFXLDJCQUFYLFdBQVcsUUFHdEI7QUFtQkQ7Ozs7O0dBS0c7QUFDSCxNQUFhLHlCQUEwQixTQUFRLHNCQUFTO0lBU3RELFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBMkI7UUFDbkUsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQixJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFO1lBQ2xDLE1BQU0sRUFBRSxDQUFDO1lBQ1QscUJBQXFCLEVBQUUsSUFBSTtZQUMzQixXQUFXLEVBQUUsQ0FBQztTQUNmLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLElB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SztJQUNMLEdBQUc7SUFDSCxFQUFFO0lBQ0YsVUFBVTtJQUNWLDBCQUEwQjtJQUMxQiwrQkFBK0I7SUFDL0Isa0JBQWtCO0lBQ2xCLCtCQUErQjtJQUMvQixFQUFFO0lBQ0YsOERBQThEO0lBQzlELGtFQUFrRTtJQUNsRSxvQ0FBb0M7SUFDcEMsNEJBQTRCO0lBQzVCLCtCQUErQjtJQUMvQixpQ0FBaUM7SUFDakMsRUFBRTtJQUNGLGdCQUFnQjtJQUNoQixtQ0FBbUMsaUJBQWlCLEdBQUc7SUFDdkQsS0FBSztJQUNMLEdBQUc7Q0FDSixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjMgLSBSZXN0YXRlIFNvZnR3YXJlLCBJbmMuLCBSZXN0YXRlIEdtYkhcbiAqXG4gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgUmVzdGF0ZSBTREsgZm9yIE5vZGUuanMvVHlwZVNjcmlwdCxcbiAqIHdoaWNoIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbiAqXG4gKiBZb3UgY2FuIGZpbmQgYSBjb3B5IG9mIHRoZSBsaWNlbnNlIGluIGZpbGUgTElDRU5TRSBpbiB0aGUgcm9vdFxuICogZGlyZWN0b3J5IG9mIHRoaXMgcmVwb3NpdG9yeSBvciBwYWNrYWdlLCBvciBhdFxuICogaHR0cHM6Ly9naXRodWIuY29tL3Jlc3RhdGVkZXYvc2RrLXR5cGVzY3JpcHQvYmxvYi9tYWluL0xJQ0VOU0VcbiAqL1xuXG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuaW1wb3J0ICogYXMgbG9ncyBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWxvZ3NcIjtcbmltcG9ydCAqIGFzIGVjMiBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWVjMlwiO1xuaW1wb3J0ICogYXMgaWFtIGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtaWFtXCI7XG5pbXBvcnQgKiBhcyBjZGsgZnJvbSBcImF3cy1jZGstbGliXCI7XG5pbXBvcnQgeyBSZXN0YXRlSW5zdGFuY2UgfSBmcm9tIFwiLi9yZXN0YXRlLWluc3RhbmNlXCI7XG5pbXBvcnQgeyBSZWdpc3RyYXRpb25Qcm92aWRlciB9IGZyb20gXCIuL3JlZ2lzdHJhdGlvbi1wcm92aWRlclwiO1xuXG5jb25zdCBQVUJMSUNfSU5HUkVTU19QT1JUID0gNDQzO1xuY29uc3QgUFVCTElDX01FVEFfUE9SVCA9IDkwNzM7XG5jb25zdCBSRVNUQVRFX0lOR1JFU1NfUE9SVCA9IDgwODA7XG5jb25zdCBSRVNUQVRFX01FVEFfUE9SVCA9IDkwNzA7XG5jb25zdCBSRVNUQVRFX0RPQ0tFUl9ERUZBVUxUX1RBRyA9IFwibGF0ZXN0XCI7XG5jb25zdCBBRE9UX0RPQ0tFUl9ERUZBVUxUX1RBRyA9IFwibGF0ZXN0XCI7XG5cbmV4cG9ydCBlbnVtIFRyYWNpbmdNb2RlIHtcbiAgRElTQUJMRUQgPSBcIkRJU0FCTEVEXCIsXG4gIEFXU19YUkFZID0gXCJBV1NfWFJBWVwiLFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlc3RhdGVJbnN0YW5jZVByb3BzIHtcbiAgLyoqIExvZyBncm91cCBmb3IgUmVzdGF0ZSBzZXJ2aWNlIGxvZ3MuICovXG4gIGxvZ0dyb3VwOiBsb2dzLkxvZ0dyb3VwO1xuXG4gIC8qKiBUcmFjaW5nIG1vZGUgZm9yIFJlc3RhdGUgc2VydmljZXMuIERlZmF1bHRzIHRvIHtAbGluayBUcmFjaW5nTW9kZS5ESVNBQkxFRH0uICovXG4gIHRyYWNpbmc/OiBUcmFjaW5nTW9kZTtcblxuICAvKiogUHJlZml4IGZvciByZXNvdXJjZXMgY3JlYXRlZCBieSB0aGlzIGNvbnN0cnVjdCB0aGF0IHJlcXVpcmUgdW5pcXVlIG5hbWVzLiAqL1xuICBwcmVmaXg/OiBzdHJpbmc7XG5cbiAgLyoqIFJlc3RhdGUgRG9ja2VyIGltYWdlIHRhZy4gRGVmYXVsdHMgdG8gYGxhdGVzdGAuICovXG4gIHJlc3RhdGVUYWc/OiBzdHJpbmc7XG5cbiAgLyoqIEFtYXpvbiBEaXN0cm8gZm9yIE9wZW4gVGVsZW1ldHJ5IERvY2tlciBpbWFnZSB0YWcuIERlZmF1bHRzIHRvIGBsYXRlc3RgLiAqL1xuICBhZG90VGFnPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBSZXN0YXRlIHNlcnZpY2UgZGVwbG95bWVudCBiYWNrZWQgYnkgYSBzaW5nbGUgRUMyIGluc3RhbmNlLFxuICogc3VpdGFibGUgZm9yIGRldmVsb3BtZW50IGFuZCB0ZXN0aW5nIHB1cnBvc2VzLiBUaGUgaW5zdGFuY2Ugd2lsbCBiZSBjcmVhdGVkXG4gKiBpbiBhIGRlZGljYXRlZCBWUEMgKHVubGVzcyBvbmUgaXMgcHJvdmlkZWQpLiBFQzIgaW5zdGFuY2Ugd2lsbCBiZSBhbGxvY2F0ZWRcbiAqIGEgcHVibGljIElQIGFkZHJlc3MuXG4gKi9cbmV4cG9ydCBjbGFzcyBTaW5nbGVOb2RlUmVzdGF0ZUluc3RhbmNlIGV4dGVuZHMgQ29uc3RydWN0IGltcGxlbWVudHMgUmVzdGF0ZUluc3RhbmNlIHtcbiAgcmVhZG9ubHkgaW5zdGFuY2U6IGVjMi5JbnN0YW5jZTtcbiAgcmVhZG9ubHkgaW52b2tlclJvbGU6IGlhbS5JUm9sZTtcbiAgcmVhZG9ubHkgdnBjOiBlYzIuVnBjO1xuXG4gIHJlYWRvbmx5IGluZ3Jlc3NFbmRwb2ludDogc3RyaW5nO1xuICByZWFkb25seSBtZXRhRW5kcG9pbnQ6IHN0cmluZztcbiAgcmVhZG9ubHkgcmVnaXN0cmF0aW9uUHJvdmlkZXJUb2tlbjogY2RrLkNmbk91dHB1dDtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogUmVzdGF0ZUluc3RhbmNlUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgdGhpcy52cGMgPSBuZXcgZWMyLlZwYyh0aGlzLCBcIlZwY1wiLCB7XG4gICAgICBtYXhBenM6IDMsXG4gICAgICBjcmVhdGVJbnRlcm5ldEdhdGV3YXk6IHRydWUsXG4gICAgICBuYXRHYXRld2F5czogMCxcbiAgICB9KTtcblxuICAgIHRoaXMuaW52b2tlclJvbGUgPSBuZXcgaWFtLlJvbGUodGhpcywgXCJJbnN0YW5jZVJvbGVcIiwge1xuICAgICAgYXNzdW1lZEJ5OiBuZXcgaWFtLlNlcnZpY2VQcmluY2lwYWwoXCJlYzIuYW1hem9uYXdzLmNvbVwiKSxcbiAgICAgIG1hbmFnZWRQb2xpY2llczogW2lhbS5NYW5hZ2VkUG9saWN5LmZyb21Bd3NNYW5hZ2VkUG9saWN5TmFtZShcIkFtYXpvblNTTU1hbmFnZWRJbnN0YW5jZUNvcmVcIildLFxuICAgIH0pO1xuICAgIHByb3BzLmxvZ0dyb3VwLmdyYW50V3JpdGUodGhpcy5pbnZva2VyUm9sZSk7XG5cbiAgICBjb25zdCByZXN0YXRlVGFnID0gcHJvcHMucmVzdGF0ZVRhZyA/PyBSRVNUQVRFX0RPQ0tFUl9ERUZBVUxUX1RBRztcbiAgICBjb25zdCBhZG90VGFnID0gcHJvcHMuYWRvdFRhZyA/PyBBRE9UX0RPQ0tFUl9ERUZBVUxUX1RBRztcbiAgICBjb25zdCByZXN0YXRlSW5pdENvbW1hbmRzID0gZWMyLlVzZXJEYXRhLmZvckxpbnV4KCk7XG4gICAgcmVzdGF0ZUluaXRDb21tYW5kcy5hZGRDb21tYW5kcyhcbiAgICAgIFwieXVtIHVwZGF0ZSAteVwiLFxuICAgICAgXCJ5dW0gaW5zdGFsbCAteSBkb2NrZXIgbmdpbnhcIixcblxuICAgICAgXCJzeXN0ZW1jdGwgZW5hYmxlIGRvY2tlci5zZXJ2aWNlXCIsXG4gICAgICBcInN5c3RlbWN0bCBzdGFydCBkb2NrZXIuc2VydmljZVwiLFxuICAgICAgW1xuICAgICAgICBcImRvY2tlciBydW4gLS1uYW1lIGFkb3QgLS1yZXN0YXJ0IHVubGVzcy1zdG9wcGVkIC0tZGV0YWNoXCIsXG4gICAgICAgIFwiIC1wIDQzMTc6NDMxNyAtcCA1NTY4MDo1NTY4MCAtcCA4ODg5Ojg4ODhcIixcbiAgICAgICAgYCBwdWJsaWMuZWNyLmF3cy9hd3Mtb2JzZXJ2YWJpbGl0eS9hd3Mtb3RlbC1jb2xsZWN0b3I6JHthZG90VGFnfWAsXG4gICAgICBdLmpvaW4oXCJcIiksXG4gICAgICBbXG4gICAgICAgIFwiZG9ja2VyIHJ1biAtLW5hbWUgcmVzdGF0ZSAtLXJlc3RhcnQgdW5sZXNzLXN0b3BwZWQgLS1kZXRhY2hcIixcbiAgICAgICAgXCIgLS12b2x1bWUgL3Zhci9yZXN0YXRlOi90YXJnZXQgLS1uZXR3b3JrPWhvc3RcIixcbiAgICAgICAgXCIgLWUgUkVTVEFURV9PQlNFUlZBQklMSVRZX19MT0dfX0ZPUk1BVD1Kc29uIC1lIFJVU1RfTE9HPWluZm8scmVzdGF0ZV93b3JrZXI6OnBhcnRpdGlvbj13YXJuXCIsXG4gICAgICAgIFwiIC1lIFJFU1RBVEVfT0JTRVJWQUJJTElUWV9fVFJBQ0lOR19fRU5EUE9JTlQ9aHR0cDovL2xvY2FsaG9zdDo0MzE3XCIsXG4gICAgICAgIGAgLS1sb2ctZHJpdmVyPWF3c2xvZ3MgLS1sb2ctb3B0IGF3c2xvZ3MtZ3JvdXA9JHtwcm9wcy5sb2dHcm91cC5sb2dHcm91cE5hbWV9YCxcbiAgICAgICAgYCBkb2NrZXIuaW8vcmVzdGF0ZWRldi9yZXN0YXRlOiR7cmVzdGF0ZVRhZ31gLFxuICAgICAgXS5qb2luKFwiXCIpLFxuXG4gICAgICBcIm1rZGlyIC1wIC9ldGMvcGtpL3ByaXZhdGVcIixcbiAgICAgIFtcbiAgICAgICAgXCJvcGVuc3NsIHJlcSAtbmV3IC14NTA5IC1ub2RlcyAtc2hhMjU2IC1kYXlzIDM2NSAtZXh0ZW5zaW9ucyB2M19jYVwiLFxuICAgICAgICBcIiAtc3ViaiAnL0M9REUvU1Q9QmVybGluL0w9QmVybGluL089cmVzdGF0ZS5kZXYvT1U9ZGVtby9DTj1yZXN0YXRlLmV4YW1wbGUuY29tJ1wiLFxuICAgICAgICBcIiAtbmV3a2V5IHJzYToyMDQ4IC1rZXlvdXQgL2V0Yy9wa2kvcHJpdmF0ZS9yZXN0YXRlLXNlbGZzaWduZWQua2V5IC1vdXQgL2V0Yy9wa2kvcHJpdmF0ZS9yZXN0YXRlLXNlbGZzaWduZWQuY3J0XCIsXG4gICAgICBdLmpvaW4oXCJcIiksXG4gICAgICBbXCJjYXQgPDwgRU9GID4gL2V0Yy9uZ2lueC9jb25mLmQvcmVzdGF0ZS1pbmdyZXNzLmNvbmZcIiwgTkdJTlhfUkVWRVJTRV9QUk9YWV9DT05GSUcsIFwiRU9GXCJdLmpvaW4oXCJcXG5cIiksXG4gICAgICBcInN5c3RlbWN0bCBlbmFibGUgbmdpbnhcIixcbiAgICAgIFwic3lzdGVtY3RsIHN0YXJ0IG5naW54XCIsXG4gICAgKTtcblxuICAgIGNvbnN0IHJlc3RhdGVJbnN0YW5jZSA9IG5ldyBlYzIuSW5zdGFuY2UodGhpcywgXCJIb3N0XCIsIHtcbiAgICAgIHZwYzogdGhpcy52cGMsXG4gICAgICB2cGNTdWJuZXRzOiB7IHN1Ym5ldFR5cGU6IGVjMi5TdWJuZXRUeXBlLlBVQkxJQyB9LFxuICAgICAgaW5zdGFuY2VUeXBlOiBuZXcgZWMyLkluc3RhbmNlVHlwZShcInQ0Zy5taWNyb1wiKSxcbiAgICAgIG1hY2hpbmVJbWFnZTogZWMyLk1hY2hpbmVJbWFnZS5sYXRlc3RBbWF6b25MaW51eDIwMjMoe1xuICAgICAgICBjcHVUeXBlOiBlYzIuQW1hem9uTGludXhDcHVUeXBlLkFSTV82NCxcbiAgICAgIH0pLFxuICAgICAgcm9sZTogdGhpcy5pbnZva2VyUm9sZSxcbiAgICAgIHVzZXJEYXRhOiByZXN0YXRlSW5pdENvbW1hbmRzLFxuICAgIH0pO1xuICAgIHRoaXMuaW5zdGFuY2UgPSByZXN0YXRlSW5zdGFuY2U7XG5cbiAgICAvLyBXZSBzdGFydCB0aGUgQURPVCBjb2xsZWN0b3IgcmVnYXJkbGVzcywgYW5kIG9ubHkgY29udHJvbCB3aGV0aGVyIHRoZXkgd2lsbCBiZSBwdWJsaXNoZWQgdG8gWC1SYXkgdmlhIGluc3RhbmNlXG4gICAgLy8gcm9sZSBwZXJtaXNzaW9ucy4gVGhpcyB3YXkgaGlzdG9yaWMgdHJhY2VzIHdpbGwgYmUgYnVmZmVyZWQgb24gdGhlIGhvc3QsIGV2ZW4gaWYgdHJhY2luZyBpcyBkaXNhYmxlZCBpbml0aWFsbHkuXG4gICAgaWYgKHByb3BzLnRyYWNpbmcgPT09IFRyYWNpbmdNb2RlLkFXU19YUkFZKSB7XG4gICAgICByZXN0YXRlSW5zdGFuY2Uucm9sZS5hZGRNYW5hZ2VkUG9saWN5KGlhbS5NYW5hZ2VkUG9saWN5LmZyb21Bd3NNYW5hZ2VkUG9saWN5TmFtZShcIkFXU1hyYXlXcml0ZU9ubHlBY2Nlc3NcIikpO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc3RhdGVJbnN0YW5jZVNlY3VyaXR5R3JvdXAgPSBuZXcgZWMyLlNlY3VyaXR5R3JvdXAodGhpcywgXCJSZXN0YXRlU2VjdXJpdHlHcm91cFwiLCB7XG4gICAgICB2cGM6IHRoaXMudnBjLFxuICAgICAgc2VjdXJpdHlHcm91cE5hbWU6IFwiUmVzdGF0ZVNlY3VyaXR5R3JvdXBcIixcbiAgICAgIGRlc2NyaXB0aW9uOiBcIlJlc3RhdGUgc2VydmljZSBBQ0xzXCIsXG4gICAgfSk7XG4gICAgcmVzdGF0ZUluc3RhbmNlLmFkZFNlY3VyaXR5R3JvdXAocmVzdGF0ZUluc3RhbmNlU2VjdXJpdHlHcm91cCk7XG5cbiAgICByZXN0YXRlSW5zdGFuY2VTZWN1cml0eUdyb3VwLmFkZEluZ3Jlc3NSdWxlKFxuICAgICAgZWMyLlBlZXIuYW55SXB2NCgpLFxuICAgICAgZWMyLlBvcnQudGNwKDQ0MyksXG4gICAgICBcIkFsbG93IHRyYWZmaWMgZnJvbSBhbnl3aGVyZSB0byBSZXN0YXRlIGluZ3Jlc3NcIixcbiAgICApO1xuICAgIHJlc3RhdGVJbnN0YW5jZVNlY3VyaXR5R3JvdXAuYWRkSW5ncmVzc1J1bGUoXG4gICAgICBlYzIuUGVlci5hbnlJcHY0KCksXG4gICAgICBlYzIuUG9ydC50Y3AoOTA3MyksXG4gICAgICBcIkFsbG93IHRyYWZmaWMgZnJvbSBhbnl3aGVyZSB0byBSZXN0YXRlIG1ldGFcIixcbiAgICApO1xuXG4gICAgY29uc3QgcmVnaXN0cmF0aW9uUHJvdmlkZXIgPSBuZXcgUmVnaXN0cmF0aW9uUHJvdmlkZXIodGhpcywgXCJSZWdpc3RyYXRpb25Qcm92aWRlclwiLCB7fSk7XG4gICAgdGhpcy5yZWdpc3RyYXRpb25Qcm92aWRlclRva2VuID0gbmV3IGNkay5DZm5PdXRwdXQodGhpcywgXCJSZWdpc3RyYXRpb25Qcm92aWRlclRva2VuXCIsIHtcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICBcIkN1c3RvbSByZXNvdXJjZSBwcm92aWRlciBzZXJ2aWNlIHRva2VuLCBuZWVkZWQgYnkgdGhlIFJlc3RhdGUgc2VydmljZSByZWdpc3RyeSBjb21wb25lbnQgdG8gdHJpZ2dlciBkaXNjb3ZlcnlcIixcbiAgICAgIGV4cG9ydE5hbWU6IFtwcm9wcy5wcmVmaXgsIFwiUmVnaXN0cmF0aW9uUHJvdmlkZXJUb2tlblwiXS5qb2luKFwiLVwiKSxcbiAgICAgIHZhbHVlOiByZWdpc3RyYXRpb25Qcm92aWRlci5zZXJ2aWNlVG9rZW4sXG4gICAgfSk7XG5cbiAgICB0aGlzLmluZ3Jlc3NFbmRwb2ludCA9IGBodHRwczovLyR7cmVzdGF0ZUluc3RhbmNlLmluc3RhbmNlUHVibGljRG5zTmFtZX0ke1xuICAgICAgUFVCTElDX0lOR1JFU1NfUE9SVCA9PSA0NDMgPyBcIlwiIDogYDoke1BVQkxJQ19JTkdSRVNTX1BPUlR9YFxuICAgIH1gO1xuICAgIHRoaXMubWV0YUVuZHBvaW50ID0gYGh0dHBzOi8vJHtyZXN0YXRlSW5zdGFuY2UuaW5zdGFuY2VQdWJsaWNEbnNOYW1lfToke1BVQkxJQ19NRVRBX1BPUlR9YDtcbiAgfVxufVxuXG5jb25zdCBOR0lOWF9SRVZFUlNFX1BST1hZX0NPTkZJRyA9IFtcbiAgXCJzZXJ2ZXIge1wiLFxuICBcIiAgbGlzdGVuIDQ0MyBzc2wgaHR0cDI7XCIsXG4gIFwiICBsaXN0ZW4gWzo6XTo0NDMgc3NsIGh0dHAyO1wiLFxuICBcIiAgc2VydmVyX25hbWUgXztcIixcbiAgXCIgIHJvb3QgL3Vzci9zaGFyZS9uZ2lueC9odG1sO1wiLFxuICBcIlwiLFxuICAnICBzc2xfY2VydGlmaWNhdGUgXCIvZXRjL3BraS9wcml2YXRlL3Jlc3RhdGUtc2VsZnNpZ25lZC5jcnRcIjsnLFxuICAnICBzc2xfY2VydGlmaWNhdGVfa2V5IFwiL2V0Yy9wa2kvcHJpdmF0ZS9yZXN0YXRlLXNlbGZzaWduZWQua2V5XCI7JyxcbiAgXCIgIHNzbF9zZXNzaW9uX2NhY2hlIHNoYXJlZDpTU0w6MW07XCIsXG4gIFwiICBzc2xfc2Vzc2lvbl90aW1lb3V0IDEwbTtcIixcbiAgXCIgIHNzbF9jaXBoZXJzIFBST0ZJTEU9U1lTVEVNO1wiLFxuICBcIiAgc3NsX3ByZWZlcl9zZXJ2ZXJfY2lwaGVycyBvbjtcIixcbiAgXCJcIixcbiAgXCIgIGxvY2F0aW9uIC8ge1wiLFxuICBgICAgIHByb3h5X3Bhc3MgaHR0cDovL2xvY2FsaG9zdDoke1JFU1RBVEVfSU5HUkVTU19QT1JUfTtgLFxuICBcIiAgfVwiLFxuICBcIn1cIixcbiAgXCJcIixcbiAgXCJzZXJ2ZXIge1wiLFxuICBcIiAgbGlzdGVuIDkwNzMgc3NsIGh0dHAyO1wiLFxuICBcIiAgbGlzdGVuIFs6Ol06OTA3MyBzc2wgaHR0cDI7XCIsXG4gIFwiICBzZXJ2ZXJfbmFtZSBfO1wiLFxuICBcIiAgcm9vdCAvdXNyL3NoYXJlL25naW54L2h0bWw7XCIsXG4gIFwiXCIsXG4gICcgIHNzbF9jZXJ0aWZpY2F0ZSBcIi9ldGMvcGtpL3ByaXZhdGUvcmVzdGF0ZS1zZWxmc2lnbmVkLmNydFwiOycsXG4gICcgIHNzbF9jZXJ0aWZpY2F0ZV9rZXkgXCIvZXRjL3BraS9wcml2YXRlL3Jlc3RhdGUtc2VsZnNpZ25lZC5rZXlcIjsnLFxuICBcIiAgc3NsX3Nlc3Npb25fY2FjaGUgc2hhcmVkOlNTTDoxbTtcIixcbiAgXCIgIHNzbF9zZXNzaW9uX3RpbWVvdXQgMTBtO1wiLFxuICBcIiAgc3NsX2NpcGhlcnMgUFJPRklMRT1TWVNURU07XCIsXG4gIFwiICBzc2xfcHJlZmVyX3NlcnZlcl9jaXBoZXJzIG9uO1wiLFxuICBcIlwiLFxuICBcIiAgbG9jYXRpb24gLyB7XCIsXG4gIGAgICAgcHJveHlfcGFzcyBodHRwOi8vbG9jYWxob3N0OiR7UkVTVEFURV9NRVRBX1BPUlR9O2AsXG4gIFwiICB9XCIsXG4gIFwifVwiLFxuXS5qb2luKFwiXFxuXCIpO1xuIl19
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@restatedev/restate-cdk",
|
|
3
3
|
"description": "Restate.dev CDK constructs",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.4.1",
|
|
5
5
|
"author": "Restate Developers",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"email": "code@restate.dev",
|
|
@@ -30,12 +30,14 @@
|
|
|
30
30
|
"aws-cdk": "2.108.0",
|
|
31
31
|
"esbuild": "^0.19.6",
|
|
32
32
|
"jest": "^29.7.0",
|
|
33
|
+
"prettier": "^3.1.0",
|
|
33
34
|
"ts-jest": "^29.1.1",
|
|
34
35
|
"ts-node": "^10.9.1",
|
|
35
36
|
"typescript": "~5.2.2"
|
|
36
37
|
},
|
|
37
|
-
"
|
|
38
|
-
"aws-
|
|
38
|
+
"peerDependencies": {
|
|
39
|
+
"@aws-sdk/client-secrets-manager": "^3.462.0",
|
|
40
|
+
"aws-cdk-lib": "^2.113.0",
|
|
39
41
|
"constructs": "^10.0.0",
|
|
40
42
|
"node-fetch": "^3.3.2",
|
|
41
43
|
"source-map-support": "^0.5.21"
|